diff --git a/datapoint.go b/datapoint.go index a4b556b..7d9bc8f 100644 --- a/datapoint.go +++ b/datapoint.go @@ -27,6 +27,7 @@ type Datapoint struct { LastValue time.Time `db:"last_value"` DatapointValueJSON []byte `db:"datapoint_value_json"` LastDatapointValue DatapointValue + Found bool } type DatapointValue struct { @@ -177,6 +178,7 @@ func DatapointsRetrieve() (dps []Datapoint, err error) { // {{{ dp.Name = res.Name dp.Datatype = res.Datatype dp.LastValue = res.LastValue + dp.Found = true if res.VID.Valid { dpv.ID = int(res.VID.Int64) @@ -196,16 +198,25 @@ func DatapointRetrieve(id int, name string) (dp Datapoint, err error) { // {{{ var query string var param any if id > 0 { - query = `SELECT * FROM datapoint WHERE id = $1` + query = `SELECT *, true AS found FROM datapoint WHERE id = $1` param = id dp.ID = id } else { - query = `SELECT * FROM datapoint WHERE name = $1` + query = `SELECT *, true AS found FROM datapoint WHERE name = $1` param = name } row := service.Db.Conn.QueryRowx(query, param) err = row.StructScan(&dp) + + if err == sql.ErrNoRows { + dp = Datapoint{ + Name: name, + } + err = nil + return + } + if err != nil { err = we.Wrap(err).WithData(name) return diff --git a/main.go b/main.go index 086797f..230f034 100644 --- a/main.go +++ b/main.go @@ -23,7 +23,7 @@ import ( "time" ) -const VERSION = "v5" +const VERSION = "v6" var ( logger *slog.Logger diff --git a/static/css/trigger_edit.css b/static/css/trigger_edit.css index af41402..477f462 100644 --- a/static/css/trigger_edit.css +++ b/static/css/trigger_edit.css @@ -112,9 +112,16 @@ label { .widgets .datapoints { font: "Roboto Mono", monospace; display: grid; - grid-template-columns: min-content 1fr; + grid-template-columns: min-content min-content 1fr; gap: 6px 8px; margin-bottom: 8px; + white-space: nowrap; +} +.widgets .datapoints .invalid { + color: #c83737; +} +.widgets .datapoints .delete img { + height: 16px; } .widgets .action { display: grid; diff --git a/static/js/trigger_edit.mjs b/static/js/trigger_edit.mjs index e534562..d190ef1 100644 --- a/static/js/trigger_edit.mjs +++ b/static/js/trigger_edit.mjs @@ -1,5 +1,5 @@ export class UI { - constructor() {//{{{ + constructor(version) {//{{{ document.getElementById('button-run'). addEventListener('click', evt => evt.preventDefault()) @@ -7,6 +7,7 @@ export class UI { document.querySelector('input[name="name"]').focus() + this.version = version this.datapoints = [] }//}}} render() {//{{{ @@ -17,8 +18,9 @@ export class UI { let html = Object.keys(this.trigger.datapoints).sort().map(dpName => { const dp = this.trigger.datapoints[dpName] return ` -
${dp.Name}
-
${dp.LastDatapointValue.TemplateValue}
+
+
${dp.Name}
+
${dp.Found ? dp.LastDatapointValue.TemplateValue : ''}
` }).join('') datapoints.innerHTML += html @@ -78,7 +80,15 @@ export class UI { dlg.close() this.render() }//}}} - update() {//{{{ + deleteDatapoint(name) {//{{{ + if (!confirm(`Delete ${name}?`)) { + return + } + + delete this.trigger.datapoints[name] + _ui.update(true) + }//}}} + update(stayOnSamePage) {//{{{ const form = document.getElementById('form-trigger') var formData = new FormData(form) Object.keys(this.trigger.datapoints).forEach(name => formData.append("datapoints[]", name)) @@ -87,6 +97,11 @@ export class UI { body: formData, }) .then(resp => { + if (stayOnSamePage) { + location.reload() + return + } + if (resp.redirected) { location.href = resp.url return diff --git a/static/less/trigger_edit.less b/static/less/trigger_edit.less index 52eb281..8e48ed9 100644 --- a/static/less/trigger_edit.less +++ b/static/less/trigger_edit.less @@ -19,9 +19,18 @@ .datapoints { font: "Roboto Mono", monospace; display: grid; - grid-template-columns: min-content 1fr; + grid-template-columns: min-content min-content 1fr; gap: 6px 8px; margin-bottom: 8px; + white-space: nowrap; + + .invalid { + color: #c83737; + } + + .delete img { + height: 16px; + } } .action { diff --git a/views/pages/trigger_edit.gotmpl b/views/pages/trigger_edit.gotmpl index 6be6a08..f0c743d 100644 --- a/views/pages/trigger_edit.gotmpl +++ b/views/pages/trigger_edit.gotmpl @@ -2,7 +2,7 @@