# TODO - [ ] **MAJOR** Implement configuration manager: - configuration is a set of signals (that can be organized in group and subgroup) that are used to configure a system or a sub system - with configuration manager user should be able to: - Define and manage configuration sets: delete (keep server side copy of deleted config), create (specifying default to parameters, mandatory, optional etc), edit (with versioning git style) and compare set - user can fork an existing config instance to create a new one - user can compare two instances: show unified diff or side by side diff - etc... - Create, delete (keep server cache), edit (git style versioning) and compare configuration instances: meaning set actual value to a configuration set - user can fork an existing config instance to create a new one - user can compare two instances: show unified diff or side by side diff - etc... - [x] user can apply and save configuration instances from manager - [x] **instance snapshot**: create a new instance from the current live value of all of a set's target signals (optional label, else auto name) — exposed in the config editor (⎙ Snapshot), control loop (`action.config.snapshot`) and logic editor (`action.config.snapshot`) - [x] **live diff**: compare a stored instance against current signal values ("Diff vs current" button → `/config/instances/{id}/livediff`) - [x] git-style versioning for config sets and instances: fork any revision, click to view, promote to current, with unified / side-by-side diff (shared `VersionTree`) - [x] in logic editor and control loop add nodes to read/write/create/apply config instances - [x] **apply** and **read** config-instance nodes in both control logic (server Go) and panel logic (client TS) - [x] **create / write** nodes (mutate versioned instances from automation) in both engines - [x] **Config Selector** panel widget: operator picks an instance of a chosen set (optionally a subset) from a combo, writing its id to a panel-local string variable; apply/read/write panel-logic nodes can read their instance dynamically from that variable ("From variable" source) - [x] support for all supported types (number, bools, enums, arrays, string etc) - [x] ux elements for config set - [x] the configuration editor should automatically get type and info from signal when possible (type is read-only, auto-derived from the bound signal) - [x] a slick tree drag and drop editor to order elements and organize in group and sub-groups - [x] possibility to customise unit, max, min etc - [x] export / import a config set as JSON - [x] full-screen config window - [x] ux elements for config instances: - automatically use the correct setting widget depending on the type (e.g. combo for enum, nubmer input for number): - for arrays: import csv option, display points as mini plot (+ open dialog plot with more info), manual enter points via table like interface - automatically fill with default or existing values (when forking an existing instance) - explicity show errors/missing info and give additional info on hover - [x] add advanced validation / transformation framework to configurations using custom CUE rules: - [x] backend runs validation / transformation rules (real CUE via `cuelang.org/go`; `internal/confmgr/cue.go`). Rules are a third versioned `Kind` bound to a set; evaluated on instance create/update — violations block the save, concrete derivations transform & persist the values - [x] user can create/edit/delete/compare rules from webui (Rules tab in ConfigManager; git-style versioning + side-by-side/unified source diff) - [x] integrate syntax highlight (hand-rolled `CueEditor.tsx`, mirroring `LuaEditor`) - [x] integrate autocomplete for signals names and cue grammars (param keys + target signals + CUE keywords/types; Ctrl+Space) - [ ] ~~integrate cue lsp~~ — descoped: a separate language-server process does not fit the no-npm / single portable-binary architecture - [x] when validation fails the error is propagated to the user (live `/config/rules/check` panel while editing; save returns the structured violation) - [x] all actions tracked via history (versioned rules) + audit (`config.rule.create/update/delete/promote/fork`) - [ ] Improve UX: - [ ] Synthetic editor: - [ ] color code the node link by type - [ ] edges color depends on type (e.g. float) including arrays - [ ] input / outputs are color coded (if can accept many, gray, otherwise specific color, can be dynamic) - [ ] can not connect input / output that are not compatible - [x] hover on a block in error should show the reason - [x] add proper array functionality - [x] add shortcut to add Signals (S) and nodes (N) with HUD - [ ] Panels: - [x] in view mode the widgets should have no border/bg but blend with background - [ ] add widgets such as toggle switch, table and other industrial hmi widgets - [ ] add container widgets: labelled/title pane, tab panes, collapsable panes etc - [ ] plot pane: - [ ] add toolbar - [ ] add time window selector to toolbar - [ ] plot x-axis synchronised (option to unlink in toolbar) - [ ] cursors and measuraments - [ ] pause/resume - [ ] save screenshot - [ ] clean ui: - create small statusbar where connection widget and other status related info will be placed - group advanced items (audit/control loops/config manager etc) in a tool menu or something similar to not fill the toolbar - make the toolbar as clean as possible - [ ] Logic editor: - add full support to local array values: dynamic, dynamic but capped max, fixed size etc: - array functions should work with new local array - [ ] Control loop: - add full support to server side array values - [x] Implement git style versioning for: synthetic variable, panels, control logic: - [x] possibility to fork any version - [x] click to view the version - [x] possibility to view graphical diff between versions (side by side or unified diff) - [x] simple slick versioning pane: - [x] vertical tree like - [x] each version represented by a circle - [x] active (the one currently view/edited) version has circle bigger then rest - [x] selected (the one that will be executed/showed by user) version has circle full, not active only border - [x] unsaved / new version appear with connection line dashed - [ ] Implement admin pane: create / manage groups, set users permits, manage auditors etc - [ ] Implement new datasources: - [ ] Finalize alarm service - [ ] modbus tcp - [ ] scpi tcp - [ ] udp? other? - [ ] **MAJOR** Implement proper distributed server side nodes to balance load and have redundancy (if a node is not available anymore all its clients migrate seamelessly to another)