diff --git a/cmd/OliveTin/main.go b/cmd/OliveTin/main.go index 4fedede..182f3ad 100644 --- a/cmd/OliveTin/main.go +++ b/cmd/OliveTin/main.go @@ -10,6 +10,7 @@ import ( config "github.com/jamesread/OliveTin/internal/config" "github.com/spf13/viper" + "github.com/fsnotify/fsnotify" "os" ) @@ -43,16 +44,28 @@ func init() { cfg = config.DefaultConfig() - if err := viper.UnmarshalExact(cfg); err != nil { - log.Errorf("Config unmarshal error %+v", err) - os.Exit(1) - } + reloadConfig(); if logLevel, err := log.ParseLevel(cfg.LogLevel); err == nil { log.SetLevel(logLevel) } viper.WatchConfig() + viper.OnConfigChange(func(e fsnotify.Event) { + if e.Op == fsnotify.Write { + log.Info("Config file changed:", e.String()) + + reloadConfig(); + } + }) +} + +func reloadConfig() { + if err := viper.UnmarshalExact(&cfg); err != nil { + log.Errorf("Config unmarshal error %+v", err) + os.Exit(1) + } + } func main() { diff --git a/go.mod b/go.mod index a8e08a9..3b9b4fd 100644 --- a/go.mod +++ b/go.mod @@ -4,6 +4,7 @@ go 1.15 require ( github.com/denisbrodbeck/machineid v1.0.1 // indirect + github.com/fsnotify/fsnotify v1.4.9 // indirect github.com/go-co-op/gocron v1.6.2 // indirect github.com/grpc-ecosystem/grpc-gateway/v2 v2.4.0 github.com/sirupsen/logrus v1.8.1 diff --git a/webui/js/ActionButton.js b/webui/js/ActionButton.js index 98498e5..edf7fa2 100644 --- a/webui/js/ActionButton.js +++ b/webui/js/ActionButton.js @@ -1,29 +1,35 @@ class ActionButton extends window.HTMLButtonElement { constructFromJson (json) { + this.updateIterationTimestamp = 0; + this.title = json.title - this.states = [] - this.stateLabels = [] this.temporaryStatusMessage = null - this.currentState = 0 this.isWaiting = false this.actionCallUrl = window.restBaseUrl + 'StartAction?actionName=' + this.title - if (json.icon === '') { - this.unicodeIcon = '💩' - } else { - this.unicodeIcon = unescape(json.icon) - } + this.updateFromJson(json) this.onclick = () => { this.startAction() } this.constructTemplate() + this.updateHtml() this.setAttribute("id", "actionButton_" + json.id) } updateFromJson (json) { - console.log("updating button") + // Fields that should not be updated + // + // title - as the callback URL relies on it + // actionCallbackUrl - as it's based on the title + // temporaryStatusMessage - as the button might be "waiting" on execution to finish while it's being updated. + + if (json.icon === '') { + this.unicodeIcon = '💩' + } else { + this.unicodeIcon = unescape(json.icon) + } } startAction () { @@ -73,7 +79,6 @@ class ActionButton extends window.HTMLButtonElement { this.domTitle = this.querySelector('.title') this.domIcon = this.querySelector('.icon') - } updateHtml () { @@ -96,18 +101,6 @@ class ActionButton extends window.HTMLButtonElement { this.domIcon.innerHTML = this.unicodeIcon } - - getCurrentStateLabel (useLabels = true) { - if (useLabels) { - return this.stateLabels[this.currentState] - } else { - return this.states[this.currentState] - } - } - - getNextStateLabel () { - return this.stateLabels[this.currentState + 1] - } } window.customElements.define('action-button', ActionButton, { extends: 'button' }) diff --git a/webui/js/marshaller.js b/webui/js/marshaller.js index c50293a..51a1830 100644 --- a/webui/js/marshaller.js +++ b/webui/js/marshaller.js @@ -1,15 +1,28 @@ import './ActionButton.js' // To define action-button export function marshalActionButtonsJsonToHtml (json) { + const currentIterationTimestamp = Date.now() + for (const jsonButton of json.actions) { var htmlButton = document.querySelector('#actionButton_' + jsonButton.id) if (htmlButton == null) { htmlButton = document.createElement('button', { is: 'action-button' }) htmlButton.constructFromJson(jsonButton) + document.getElementById('rootGroup').appendChild(htmlButton) } else { htmlButton.updateFromJson(jsonButton) + htmlButton.updateHtml() + } + + console.log("action", jsonButton.title) + htmlButton.updateIterationTimestamp = currentIterationTimestamp; + } + + for (const existingButton of document.querySelectorAll('button')) { + if (existingButton.updateIterationTimestamp != currentIterationTimestamp) { + existingButton.remove(); } } }