library picker lit element w reactive properties
This commit is contained in:
@@ -16,6 +16,10 @@ type Config struct {
|
||||
}
|
||||
|
||||
func newConfig(filePath string, data *configData) (*Config, error) {
|
||||
conf := &Config{
|
||||
filePath: filePath,
|
||||
configData: data,
|
||||
}
|
||||
// TODO make sure required fields have SOMETHING in them
|
||||
// TODO Merge existing config with read in config
|
||||
if data == nil {
|
||||
@@ -24,10 +28,7 @@ func newConfig(filePath string, data *configData) (*Config, error) {
|
||||
if err := data.validate(); err != nil {
|
||||
return nil, fmt.Errorf("invalid config: %w", err)
|
||||
}
|
||||
return &Config{
|
||||
filePath: filePath,
|
||||
configData: data,
|
||||
}, nil
|
||||
return conf, nil
|
||||
}
|
||||
|
||||
type configData struct {
|
||||
@@ -40,7 +41,7 @@ func (d *configData) validate() error {
|
||||
return errors.New("nil library config")
|
||||
}
|
||||
if err := d.Library.Validate(); err != nil {
|
||||
return fmt.Errorf("invalid library config: %s\n%w", d.Library, err)
|
||||
return fmt.Errorf("invalid library config: %#v: %w", d.Library, err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
@@ -59,7 +60,7 @@ func GetCurrentConfig() (*Config, error) {
|
||||
}
|
||||
configFilePath := path.Join(configDir, "config.toml")
|
||||
|
||||
// create the config obj with the filepath we got
|
||||
// create the config obj with the filepath we got, initializing with default data
|
||||
config, err := newConfig(configFilePath, defaultConfigData)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not create new config: %w", err)
|
||||
@@ -80,6 +81,12 @@ func GetCurrentConfig() (*Config, error) {
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not load config file %s: %w", configFilePath, err)
|
||||
}
|
||||
|
||||
// before we return the config, lets make sure sub configs can invoke saving when they need
|
||||
err = config.updateSubConfigSaveFuncReferences()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not update sub config save func references: %w", err)
|
||||
}
|
||||
return config, nil
|
||||
}
|
||||
|
||||
@@ -107,6 +114,12 @@ func (c *Config) loadConfig() (*Config, error) {
|
||||
return nil, fmt.Errorf("could not create config from config file data at %s: %w", c.filePath, err)
|
||||
}
|
||||
|
||||
// before we return the config, lets make sure sub configs can invoke saving when they need
|
||||
err = config.updateSubConfigSaveFuncReferences()
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("could not update sub config save func references: %w", err)
|
||||
}
|
||||
|
||||
return config, nil
|
||||
}
|
||||
|
||||
@@ -125,3 +138,8 @@ func (c *Config) WriteConfig() error {
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func (c *Config) updateSubConfigSaveFuncReferences() error {
|
||||
c.Library.SaveFunc = c.WriteConfig
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -3,10 +3,12 @@ package library
|
||||
import (
|
||||
"context"
|
||||
"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
DirectoryPath string
|
||||
SaveFunc func() error `toml:"-"`
|
||||
}
|
||||
|
||||
func (c *Config) Validate() error {
|
||||
@@ -27,7 +29,7 @@ func NewLibrary(conf *Config) (*Library, error) {
|
||||
return nil, fmt.Errorf("nil config for library")
|
||||
}
|
||||
if err := conf.Validate(); err != nil {
|
||||
return nil, fmt.Errorf("invalid library config %s\n%w", conf, err)
|
||||
return nil, fmt.Errorf("invalid library config %#v: %w", conf, err)
|
||||
}
|
||||
return &Library{
|
||||
conf: conf,
|
||||
@@ -42,3 +44,20 @@ func (l *Library) Init(ctx context.Context) error {
|
||||
func (l *Library) GetDir() (string, error) {
|
||||
return l.conf.DirectoryPath, nil
|
||||
}
|
||||
|
||||
func (l *Library) SetDir(dirPath string) error {
|
||||
fileInfo, err := os.Stat(dirPath)
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not stat %s: %w", dirPath, err)
|
||||
}
|
||||
if !fileInfo.IsDir() {
|
||||
return fmt.Errorf("dirPath is not a directory: %s", dirPath)
|
||||
}
|
||||
|
||||
l.conf.DirectoryPath = dirPath
|
||||
err = l.conf.SaveFunc()
|
||||
if err != nil {
|
||||
return fmt.Errorf("could not save library dir config: %w", err)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -1 +1 @@
|
||||
c8268978cc1672b8c925fd9aaff81ad7
|
||||
a08fc53bd03e73d3ce16aefd412e00b2
|
||||
@@ -14,7 +14,7 @@ export class PlayerControls extends LitElement {
|
||||
<button>
|
||||
<img src="/src/assets/images/icons/music/skip-prev-solid.svg"></img>
|
||||
</button>
|
||||
<button @click="${this.onPlayPauseButtonClick}">
|
||||
<button @click="${this.onPlayPauseClick}">
|
||||
<img src="/src/assets/images/icons/music/play-solid.svg"></img>
|
||||
</button>
|
||||
<button>
|
||||
@@ -27,14 +27,13 @@ export class PlayerControls extends LitElement {
|
||||
`;
|
||||
}
|
||||
|
||||
onPlayPauseButtonClick(event: { target: HTMLButtonElement; }) {
|
||||
onPlayPauseClick(event: { target: HTMLButtonElement; }) {
|
||||
try {
|
||||
Play().then((result) => {
|
||||
console.log(result)
|
||||
event.target.setAttribute("src", "/src/assets/images/icons/music/pause-solid.svg")
|
||||
}).catch((err) => {
|
||||
console.log("There is an error with playing")
|
||||
console.error(err);
|
||||
console.error("there is an error with playing " + err);
|
||||
});
|
||||
}
|
||||
catch (err) {
|
||||
|
||||
@@ -8,7 +8,7 @@ const seekBar = () => html`
|
||||
@customElement('seek-bar')
|
||||
export class SeekBar extends LitElement {
|
||||
|
||||
render() {
|
||||
override render() {
|
||||
return seekBar();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,49 @@
|
||||
import { LitElement, html } from 'lit';
|
||||
import { customElement, property } from 'lit/decorators.js';
|
||||
import { GetDir, SetDir } from '@go/library/Library.js';
|
||||
import { DirectoryPicker } from '@go/frontendbindings/FrontendBindings.js';
|
||||
|
||||
@customElement('library-picker')
|
||||
export class LibraryPicker extends LitElement {
|
||||
|
||||
@property({ type: String })
|
||||
currentLibraryDirectoryText: string = "No Library Directory selected";
|
||||
|
||||
override render() {
|
||||
return html`
|
||||
<div>
|
||||
<label>${this.currentLibraryDirectoryText}</label>
|
||||
<button @click="${this.onSelectLibraryClick}">Choose Directory...</button>
|
||||
</div>
|
||||
`;
|
||||
}
|
||||
|
||||
constructor() {
|
||||
super();
|
||||
GetDir().
|
||||
then((result) => {
|
||||
if (result.length === 0) { return; }
|
||||
this.currentLibraryDirectoryText = result;
|
||||
}).catch((err) => { console.error(err) })
|
||||
}
|
||||
|
||||
onSelectLibraryClick() {
|
||||
try {
|
||||
DirectoryPicker()
|
||||
.then((result: string) => {
|
||||
SetDir(result).then(() => {
|
||||
this.currentLibraryDirectoryText = result;
|
||||
}).catch((err: string) => {
|
||||
console.error("There is an error with saving selected directory: " + err);
|
||||
});
|
||||
})
|
||||
.catch((err) => {
|
||||
console.error("There is an error with directory picker: " + err);
|
||||
});
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -9,10 +9,9 @@
|
||||
|
||||
<meta charset="UTF-8" />
|
||||
<meta content="width=device-width, initial-scale=1.0" name="viewport" />
|
||||
<link rel="stylesheet" type="text/css" href="/node_modules/@picocss/pico/css/pico.css">
|
||||
<title>yellowjacket - config</title>
|
||||
</head>
|
||||
<script src="./config.js" type="module"></script>
|
||||
<script src="./config.ts" type="module"></script>
|
||||
|
||||
<body>
|
||||
<header class="container">
|
||||
@@ -47,10 +46,7 @@
|
||||
</header>
|
||||
<hr />
|
||||
<main class="container">
|
||||
<section id="library-selector">
|
||||
<label id="library-directory-label">No Library Directory Selected</label>
|
||||
<button onclick="dirPicker()">Choose Directory...</button>
|
||||
</section>
|
||||
<library-picker></library-picker>
|
||||
</main>
|
||||
</body>
|
||||
|
||||
|
||||
@@ -1,30 +0,0 @@
|
||||
import { DirectoryPicker } from '/wailsjs/go/frontendbindings/FrontendBindings.js';
|
||||
import { GetDir as GetLibraryDir } from '/wailsjs/go/library/Library.js';
|
||||
|
||||
let libraryDirectoryLabel = document.getElementById("library-directory-label");
|
||||
|
||||
window.updateLibraryDirLabel = function(value) {
|
||||
libraryDirectoryLabel.innerText = value;
|
||||
}
|
||||
|
||||
// on load update the library dir label
|
||||
GetLibraryDir().
|
||||
then((result) => {
|
||||
if (result.length === 0) { return; }
|
||||
window.updateLibraryDirLabel(result);
|
||||
}).catch((err) => { console.error(err) })
|
||||
|
||||
|
||||
window.dirPicker = function() {
|
||||
try {
|
||||
DirectoryPicker()
|
||||
.then((result) => {
|
||||
window.updateLibraryDirLabel(result); })
|
||||
.catch((err) => {
|
||||
console.error("There is an error with directory picker: " + err);
|
||||
});
|
||||
}
|
||||
catch (err) {
|
||||
console.error(err);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
import '@components/config/library-picker/library-picker.ts';
|
||||
@@ -28,10 +28,12 @@
|
||||
"@go/*": ["./wailsjs/go/*"],
|
||||
"@components/*": ["./src/components/*"],
|
||||
"@assets/*": ["./src/assets/*"],
|
||||
"@pages/*": ["./src/pages/*"],
|
||||
"@node_modules/*": ["./node_modules/*"]
|
||||
},
|
||||
// needed for Lit Elements
|
||||
"experimentalDecorators": true,
|
||||
"useDefineForClassFields": false, // allows us to define properties as class fields
|
||||
// plugins
|
||||
"plugins": [
|
||||
{"name": "ts-lit-plugin"},
|
||||
|
||||
+2
@@ -5,3 +5,5 @@ import {context} from '../models';
|
||||
export function GetDir():Promise<string>;
|
||||
|
||||
export function Init(arg1:context.Context):Promise<void>;
|
||||
|
||||
export function SetDir(arg1:string):Promise<void>;
|
||||
|
||||
@@ -9,3 +9,7 @@ export function GetDir() {
|
||||
export function Init(arg1) {
|
||||
return window['go']['library']['Library']['Init'](arg1);
|
||||
}
|
||||
|
||||
export function SetDir(arg1) {
|
||||
return window['go']['library']['Library']['SetDir'](arg1);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user