Quellcode durchsuchen

#10 - Early config reload support, added benefit of cleaning up ActionButton.js early state code

jamesread vor 5 Jahren
Ursprung
Commit
7dcc62ad1d
4 geänderte Dateien mit 46 neuen und 26 gelöschten Zeilen
  1. 17 4
      cmd/OliveTin/main.go
  2. 1 0
      go.mod
  3. 15 22
      webui/js/ActionButton.js
  4. 13 0
      webui/js/marshaller.js

+ 17 - 4
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() {

+ 1 - 0
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

+ 15 - 22
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 = '&#x1f4a9'
-    } 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 = '&#x1f4a9'
+    } 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' })

+ 13 - 0
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();
     }
   }
 }