From fbd00c764cf5a2c4fc65c175bfcd75ea27996595 Mon Sep 17 00:00:00 2001 From: Matt Pumarlo Date: Wed, 24 Jun 2026 15:24:51 -0500 Subject: [PATCH] chore: linting and formatting fixes --- kobrax_moonraker_bridge.py | 4 +- web/DOC/THEME-CSS-HOOKS.md | 262 +-- web/DOC/THEME-JS-ID-HOOKS.md | 172 +- web/themes/default/app.js | 1104 ++++------- web/themes/default/index.html | 3351 +++++++++++++++++++++++++-------- web/themes/default/style.css | 1474 ++++++++++++--- 6 files changed, 4347 insertions(+), 2020 deletions(-) diff --git a/kobrax_moonraker_bridge.py b/kobrax_moonraker_bridge.py index addc61a..c4add92 100644 --- a/kobrax_moonraker_bridge.py +++ b/kobrax_moonraker_bridge.py @@ -3626,7 +3626,7 @@ class KobraXBridge: except OSError: raise web.HTTPNotFound() if name == "app.js": - raw = raw.replace("'__VERSION__'", f"'{self._read_version()}'") + raw = raw.replace("__VERSION__", self._read_version()) return web.Response( text=raw, content_type=ctype, @@ -3662,7 +3662,7 @@ class KobraXBridge: pass try: js = pathlib.Path(os.path.join(base, "app.js")).read_text(encoding="utf-8") - js = js.replace("'__VERSION__'", f"'{self._read_version()}'") + js = js.replace("__VERSION__", self._read_version()) page = page.replace( '', "") diff --git a/web/DOC/THEME-CSS-HOOKS.md b/web/DOC/THEME-CSS-HOOKS.md index f3e7e48..75e767d 100644 --- a/web/DOC/THEME-CSS-HOOKS.md +++ b/web/DOC/THEME-CSS-HOOKS.md @@ -2,135 +2,135 @@ Referenzliste für CSS-/Layout-Anpassungen. -| ID | Verwendung | -|---|---| +| ID | Verwendung | +| ----------------------------------- | --------------- | | `#ace-dry-dialog-custom-name-label` | Hook / Selektor | -| `#ace-dry-dialog-custom-name-row` | Hook / Selektor | -| `#ace-dry-dialog-temp-label` | Hook / Selektor | -| `#ace-dry-dialog-time-label` | Hook / Selektor | -| `#ace-dry-dialog-title` | Hook / Selektor | -| `#add-printer-btn-label` | Hook / Selektor | -| `#ams-no-data` | Hook / Selektor | -| `#apd-ip` | Hook / Selektor | -| `#apd-lbl-ip` | Hook / Selektor | -| `#apd-lbl-name` | Hook / Selektor | -| `#apd-name` | Hook / Selektor | -| `#apd-status` | Hook / Selektor | -| `#apd-title` | Hook / Selektor | -| `#btn-log-dl` | Hook / Selektor | -| `#cam-fname` | Hook / Selektor | -| `#cam-img` | Hook / Selektor | -| `#cam-overlay` | Hook / Selektor | -| `#cam-placeholder` | Hook / Selektor | -| `#cam-placeholder-txt` | Hook / Selektor | -| `#cam-spinner` | Hook / Selektor | -| `#cam-wrap` | Hook / Selektor | -| `#conn-error-banner` | Hook / Selektor | -| `#d-ace-dry-grid` | Hook / Selektor | -| `#d-ace-dry-wrap` | Hook / Selektor | -| `#d-ams-card` | Hook / Selektor | -| `#d-bt-t` | Hook / Selektor | -| `#d-btbar` | Hook / Selektor | -| `#d-btn-skip-label` | Hook / Selektor | -| `#d-card-ams` | Hook / Selektor | -| `#d-card-cam` | Hook / Selektor | -| `#d-card-lightfan` | Hook / Selektor | -| `#d-card-progress` | Hook / Selektor | -| `#d-card-speed` | Hook / Selektor | -| `#d-card-temps` | Hook / Selektor | -| `#d-chart-label` | Hook / Selektor | -| `#d-ctrl-btns` | Hook / Selektor | -| `#d-elapsed` | Hook / Selektor | -| `#d-fname` | Hook / Selektor | -| `#d-layers` | Hook / Selektor | -| `#d-lbl-bed` | Hook / Selektor | -| `#d-lbl-elapsed` | Hook / Selektor | -| `#d-lbl-layers` | Hook / Selektor | -| `#d-lbl-light` | Hook / Selektor | -| `#d-lbl-remain` | Hook / Selektor | -| `#d-nt` | Hook / Selektor | -| `#d-nt-t` | Hook / Selektor | -| `#d-ntbar` | Hook / Selektor | -| `#d-pbar` | Hook / Selektor | -| `#d-pct` | Hook / Selektor | -| `#d-remain` | Hook / Selektor | -| `#d-slicer-label` | Hook / Selektor | -| `#d-slicer-row` | Hook / Selektor | -| `#d-slicer-time` | Hook / Selektor | -| `#d-spd-bar` | Hook / Selektor | -| `#d-spd-lbl-1` | Hook / Selektor | -| `#d-spd-lbl-2` | Hook / Selektor | -| `#d-spd-lbl-3` | Hook / Selektor | -| `#d-thumbnail` | Hook / Selektor | -| `#fd-objects` | Hook / Selektor | -| `#fd-objects-hint` | Hook / Selektor | -| `#fd-objects-section` | Hook / Selektor | -| `#fd-objects-svg` | Hook / Selektor | -| `#fd-slots-hint` | Hook / Selektor | -| `#fd-title` | Hook / Selektor | -| `#file-ready-banner` | Hook / Selektor | -| `#file-ready-name` | Hook / Selektor | -| `#h-badge` | Hook / Selektor | -| `#h-pname` | Hook / Selektor | -| `#h-pname-single` | Hook / Selektor | -| `#h-state` | Hook / Selektor | -| `#h-version` | Hook / Selektor | -| `#lbl-auto-leveling` | Hook / Selektor | -| `#lbl-default-slot` | Hook / Selektor | -| `#lbl-device-id` | Hook / Selektor | -| `#lbl-ip-hint` | Hook / Selektor | -| `#lbl-mode-id` | Hook / Selektor | -| `#lbl-mqtt-port` | Hook / Selektor | -| `#lbl-password` | Hook / Selektor | -| `#lbl-printer-ip` | Hook / Selektor | -| `#lbl-printer-name` | Hook / Selektor | -| `#lbl-slot-color` | Hook / Selektor | -| `#lbl-slot-material` | Hook / Selektor | -| `#lbl-update-apply` | Hook / Selektor | -| `#lbl-update-check` | Hook / Selektor | -| `#lbl-username` | Hook / Selektor | -| `#log-badge` | Hook / Selektor | -| `#log-badge-bot` | Hook / Selektor | -| `#modal-sec-connection` | Hook / Selektor | -| `#modal-sec-poll` | Hook / Selektor | -| `#modal-sec-print` | Hook / Selektor | -| `#modal-sec-version` | Hook / Selektor | -| `#modal-title-settings` | Hook / Selektor | -| `#opt-slot-0` | Hook / Selektor | -| `#opt-slot-1` | Hook / Selektor | -| `#opt-slot-2` | Hook / Selektor | -| `#opt-slot-3` | Hook / Selektor | -| `#opt-slot-auto` | Hook / Selektor | -| `#printer-dropdown-menu` | Hook / Selektor | -| `#printer-dropdown-wrap` | Hook / Selektor | -| `#printers-panel-title` | Hook / Selektor | -| `#ptitle-console` | Hook / Selektor | -| `#ptitle-motion-xy` | Hook / Selektor | -| `#ptitle-motion-z` | Hook / Selektor | -| `#s-auto-leveling` | Hook / Selektor | -| `#s-default-slot` | Hook / Selektor | -| `#s-device-id` | Hook / Selektor | -| `#s-mode-id` | Hook / Selektor | -| `#s-mqtt-port` | Hook / Selektor | -| `#s-password` | Hook / Selektor | -| `#s-printer-name` | Hook / Selektor | -| `#s-username` | Hook / Selektor | -| `#s-version-label` | Hook / Selektor | -| `#sf-all` | Hook / Selektor | -| `#sf-err` | Hook / Selektor | -| `#sf-new` | Hook / Selektor | -| `#sf-ok` | Hook / Selektor | -| `#skip-hint` | Hook / Selektor | -| `#skip-list` | Hook / Selektor | -| `#skip-status` | Hook / Selektor | -| `#skip-svg` | Hook / Selektor | -| `#skip-title` | Hook / Selektor | -| `#slot-edit-title` | Hook / Selektor | -| `#ss-date` | Hook / Selektor | -| `#ss-dur` | Hook / Selektor | -| `#ss-name` | Hook / Selektor | -| `#step-display` | Hook / Selektor | -| `#store-empty` | Hook / Selektor | -| `#store-panel-title` | Hook / Selektor | -| `#update-changelog` | Hook / Selektor | -| `#update-status` | Hook / Selektor | +| `#ace-dry-dialog-custom-name-row` | Hook / Selektor | +| `#ace-dry-dialog-temp-label` | Hook / Selektor | +| `#ace-dry-dialog-time-label` | Hook / Selektor | +| `#ace-dry-dialog-title` | Hook / Selektor | +| `#add-printer-btn-label` | Hook / Selektor | +| `#ams-no-data` | Hook / Selektor | +| `#apd-ip` | Hook / Selektor | +| `#apd-lbl-ip` | Hook / Selektor | +| `#apd-lbl-name` | Hook / Selektor | +| `#apd-name` | Hook / Selektor | +| `#apd-status` | Hook / Selektor | +| `#apd-title` | Hook / Selektor | +| `#btn-log-dl` | Hook / Selektor | +| `#cam-fname` | Hook / Selektor | +| `#cam-img` | Hook / Selektor | +| `#cam-overlay` | Hook / Selektor | +| `#cam-placeholder` | Hook / Selektor | +| `#cam-placeholder-txt` | Hook / Selektor | +| `#cam-spinner` | Hook / Selektor | +| `#cam-wrap` | Hook / Selektor | +| `#conn-error-banner` | Hook / Selektor | +| `#d-ace-dry-grid` | Hook / Selektor | +| `#d-ace-dry-wrap` | Hook / Selektor | +| `#d-ams-card` | Hook / Selektor | +| `#d-bt-t` | Hook / Selektor | +| `#d-btbar` | Hook / Selektor | +| `#d-btn-skip-label` | Hook / Selektor | +| `#d-card-ams` | Hook / Selektor | +| `#d-card-cam` | Hook / Selektor | +| `#d-card-lightfan` | Hook / Selektor | +| `#d-card-progress` | Hook / Selektor | +| `#d-card-speed` | Hook / Selektor | +| `#d-card-temps` | Hook / Selektor | +| `#d-chart-label` | Hook / Selektor | +| `#d-ctrl-btns` | Hook / Selektor | +| `#d-elapsed` | Hook / Selektor | +| `#d-fname` | Hook / Selektor | +| `#d-layers` | Hook / Selektor | +| `#d-lbl-bed` | Hook / Selektor | +| `#d-lbl-elapsed` | Hook / Selektor | +| `#d-lbl-layers` | Hook / Selektor | +| `#d-lbl-light` | Hook / Selektor | +| `#d-lbl-remain` | Hook / Selektor | +| `#d-nt` | Hook / Selektor | +| `#d-nt-t` | Hook / Selektor | +| `#d-ntbar` | Hook / Selektor | +| `#d-pbar` | Hook / Selektor | +| `#d-pct` | Hook / Selektor | +| `#d-remain` | Hook / Selektor | +| `#d-slicer-label` | Hook / Selektor | +| `#d-slicer-row` | Hook / Selektor | +| `#d-slicer-time` | Hook / Selektor | +| `#d-spd-bar` | Hook / Selektor | +| `#d-spd-lbl-1` | Hook / Selektor | +| `#d-spd-lbl-2` | Hook / Selektor | +| `#d-spd-lbl-3` | Hook / Selektor | +| `#d-thumbnail` | Hook / Selektor | +| `#fd-objects` | Hook / Selektor | +| `#fd-objects-hint` | Hook / Selektor | +| `#fd-objects-section` | Hook / Selektor | +| `#fd-objects-svg` | Hook / Selektor | +| `#fd-slots-hint` | Hook / Selektor | +| `#fd-title` | Hook / Selektor | +| `#file-ready-banner` | Hook / Selektor | +| `#file-ready-name` | Hook / Selektor | +| `#h-badge` | Hook / Selektor | +| `#h-pname` | Hook / Selektor | +| `#h-pname-single` | Hook / Selektor | +| `#h-state` | Hook / Selektor | +| `#h-version` | Hook / Selektor | +| `#lbl-auto-leveling` | Hook / Selektor | +| `#lbl-default-slot` | Hook / Selektor | +| `#lbl-device-id` | Hook / Selektor | +| `#lbl-ip-hint` | Hook / Selektor | +| `#lbl-mode-id` | Hook / Selektor | +| `#lbl-mqtt-port` | Hook / Selektor | +| `#lbl-password` | Hook / Selektor | +| `#lbl-printer-ip` | Hook / Selektor | +| `#lbl-printer-name` | Hook / Selektor | +| `#lbl-slot-color` | Hook / Selektor | +| `#lbl-slot-material` | Hook / Selektor | +| `#lbl-update-apply` | Hook / Selektor | +| `#lbl-update-check` | Hook / Selektor | +| `#lbl-username` | Hook / Selektor | +| `#log-badge` | Hook / Selektor | +| `#log-badge-bot` | Hook / Selektor | +| `#modal-sec-connection` | Hook / Selektor | +| `#modal-sec-poll` | Hook / Selektor | +| `#modal-sec-print` | Hook / Selektor | +| `#modal-sec-version` | Hook / Selektor | +| `#modal-title-settings` | Hook / Selektor | +| `#opt-slot-0` | Hook / Selektor | +| `#opt-slot-1` | Hook / Selektor | +| `#opt-slot-2` | Hook / Selektor | +| `#opt-slot-3` | Hook / Selektor | +| `#opt-slot-auto` | Hook / Selektor | +| `#printer-dropdown-menu` | Hook / Selektor | +| `#printer-dropdown-wrap` | Hook / Selektor | +| `#printers-panel-title` | Hook / Selektor | +| `#ptitle-console` | Hook / Selektor | +| `#ptitle-motion-xy` | Hook / Selektor | +| `#ptitle-motion-z` | Hook / Selektor | +| `#s-auto-leveling` | Hook / Selektor | +| `#s-default-slot` | Hook / Selektor | +| `#s-device-id` | Hook / Selektor | +| `#s-mode-id` | Hook / Selektor | +| `#s-mqtt-port` | Hook / Selektor | +| `#s-password` | Hook / Selektor | +| `#s-printer-name` | Hook / Selektor | +| `#s-username` | Hook / Selektor | +| `#s-version-label` | Hook / Selektor | +| `#sf-all` | Hook / Selektor | +| `#sf-err` | Hook / Selektor | +| `#sf-new` | Hook / Selektor | +| `#sf-ok` | Hook / Selektor | +| `#skip-hint` | Hook / Selektor | +| `#skip-list` | Hook / Selektor | +| `#skip-status` | Hook / Selektor | +| `#skip-svg` | Hook / Selektor | +| `#skip-title` | Hook / Selektor | +| `#slot-edit-title` | Hook / Selektor | +| `#ss-date` | Hook / Selektor | +| `#ss-dur` | Hook / Selektor | +| `#ss-name` | Hook / Selektor | +| `#step-display` | Hook / Selektor | +| `#store-empty` | Hook / Selektor | +| `#store-panel-title` | Hook / Selektor | +| `#update-changelog` | Hook / Selektor | +| `#update-status` | Hook / Selektor | diff --git a/web/DOC/THEME-JS-ID-HOOKS.md b/web/DOC/THEME-JS-ID-HOOKS.md index 6c2ba02..c5e1dca 100644 --- a/web/DOC/THEME-JS-ID-HOOKS.md +++ b/web/DOC/THEME-JS-ID-HOOKS.md @@ -2,89 +2,89 @@ Referenzliste für JavaScript-/DOM-Hooks. -| ID | Verwendung | -|---|---| -| `#ace-dry-dialog` | Hook / Selektor | -| `#ace-dry-dialog-cancel` | Hook / Selektor | -| `#ace-dry-dialog-confirm` | Hook / Selektor | -| `#ace-dry-dialog-custom-name` | Hook / Selektor | -| `#ace-dry-dialog-h` | Hook / Selektor | -| `#ace-dry-dialog-m` | Hook / Selektor | -| `#ace-dry-dialog-reset-default` | Hook / Selektor | -| `#ace-dry-dialog-s` | Hook / Selektor | -| `#ace-dry-dialog-save-preset` | Hook / Selektor | -| `#ace-dry-dialog-temp` | Hook / Selektor | -| `#add-printer-dialog` | Hook / Selektor | -| `#ams-slots` | Hook / Selektor | -| `#apd-confirm` | Hook / Selektor | -| `#bnb-console` | Hook / Selektor | -| `#bnb-dashboard` | Hook / Selektor | -| `#bnb-printers` | Hook / Selektor | -| `#bnb-store` | Hook / Selektor | -| `#btn-autoscroll` | Hook / Selektor | -| `#btn-save-settings` | Hook / Selektor | -| `#btn-slot-edit-feed` | Hook / Selektor | -| `#btn-slot-edit-save` | Hook / Selektor | -| `#btn-update-apply` | Hook / Selektor | -| `#btn-update-check` | Hook / Selektor | -| `#cam-toggle-btn` | Hook / Selektor | -| `#conn-btn` | Hook / Selektor | -| `#console-log` | Hook / Selektor | -| `#d-bt` | Hook / Selektor | -| `#d-btn-cancel` | Hook / Selektor | -| `#d-btn-pause` | Hook / Selektor | -| `#d-btn-resume` | Hook / Selektor | -| `#d-btn-skip` | Hook / Selektor | -| `#d-chart` | Hook / Selektor | -| `#d-fan` | Hook / Selektor | -| `#d-fan-val` | Hook / Selektor | -| `#d-light-toggle` | Hook / Selektor | -| `#d-spd-1` | Hook / Selektor | -| `#d-spd-2` | Hook / Selektor | -| `#d-spd-3` | Hook / Selektor | -| `#fd-cancel` | Hook / Selektor | -| `#fd-print` | Hook / Selektor | -| `#fd-slots` | Hook / Selektor | -| `#filament-dialog` | Hook / Selektor | -| `#file-cancel-btn` | Hook / Selektor | -| `#file-ready-btn` | Hook / Selektor | -| `#file-slots-btn` | Hook / Selektor | -| `#lang-btn` | Hook / Selektor | -| `#log-filter` | Hook / Selektor | -| `#logdir-all` | Hook / Selektor | -| `#logdir-rx` | Hook / Selektor | -| `#logdir-tx` | Hook / Selektor | -| `#log-lbl-level` | i18n-Label "Level:" | -| `#loglvl-all` | onclick `setLogLevel('all')` | -| `#loglvl-err` | onclick `setLogLevel('err')` — nur Fehler | -| `#loglvl-warn` | onclick `setLogLevel('warn')` — Fehler + Warnungen | -| `#nb-console` | Hook / Selektor | -| `#nb-dashboard` | Hook / Selektor | -| `#nb-printers` | Hook / Selektor | -| `#nb-store` | Hook / Selektor | -| `#p-bed-inp` | Hook / Selektor | -| `#p-nozzle-inp` | Hook / Selektor | -| `#panel-console` | Hook / Selektor | -| `#panel-dashboard` | Hook / Selektor | -| `#panel-printers` | Hook / Selektor | -| `#panel-store` | Hook / Selektor | -| `#poll-1` | Hook / Selektor | -| `#poll-2` | Hook / Selektor | -| `#poll-5` | Hook / Selektor | -| `#printer-dropdown-btn` | Hook / Selektor | -| `#printers-grid` | Hook / Selektor | -| `#s-printer-ip` | Hook / Selektor | -| `#settings-btn` | Hook / Selektor | -| `#settings-modal` | Hook / Selektor | -| `#skip-confirm` | Hook / Selektor | -| `#skip-dialog` | Hook / Selektor | -| `#slot-edit-color` | Hook / Selektor | -| `#slot-edit-mat` | Hook / Selektor | -| `#slot-edit-modal` | Hook / Selektor | -| `#slot-edit-preview` | Hook / Selektor | -| `#slot-mat-btns` | Hook / Selektor | -| `#store-filter` | Hook / Selektor | -| `#store-grid` | Hook / Selektor | -| `#store-refresh-btn` | Hook / Selektor | -| `#store-search` | Hook / Selektor | -| `#store-sort` | Hook / Selektor | +| ID | Verwendung | +| ------------------------------- | -------------------------------------------------- | +| `#ace-dry-dialog` | Hook / Selektor | +| `#ace-dry-dialog-cancel` | Hook / Selektor | +| `#ace-dry-dialog-confirm` | Hook / Selektor | +| `#ace-dry-dialog-custom-name` | Hook / Selektor | +| `#ace-dry-dialog-h` | Hook / Selektor | +| `#ace-dry-dialog-m` | Hook / Selektor | +| `#ace-dry-dialog-reset-default` | Hook / Selektor | +| `#ace-dry-dialog-s` | Hook / Selektor | +| `#ace-dry-dialog-save-preset` | Hook / Selektor | +| `#ace-dry-dialog-temp` | Hook / Selektor | +| `#add-printer-dialog` | Hook / Selektor | +| `#ams-slots` | Hook / Selektor | +| `#apd-confirm` | Hook / Selektor | +| `#bnb-console` | Hook / Selektor | +| `#bnb-dashboard` | Hook / Selektor | +| `#bnb-printers` | Hook / Selektor | +| `#bnb-store` | Hook / Selektor | +| `#btn-autoscroll` | Hook / Selektor | +| `#btn-save-settings` | Hook / Selektor | +| `#btn-slot-edit-feed` | Hook / Selektor | +| `#btn-slot-edit-save` | Hook / Selektor | +| `#btn-update-apply` | Hook / Selektor | +| `#btn-update-check` | Hook / Selektor | +| `#cam-toggle-btn` | Hook / Selektor | +| `#conn-btn` | Hook / Selektor | +| `#console-log` | Hook / Selektor | +| `#d-bt` | Hook / Selektor | +| `#d-btn-cancel` | Hook / Selektor | +| `#d-btn-pause` | Hook / Selektor | +| `#d-btn-resume` | Hook / Selektor | +| `#d-btn-skip` | Hook / Selektor | +| `#d-chart` | Hook / Selektor | +| `#d-fan` | Hook / Selektor | +| `#d-fan-val` | Hook / Selektor | +| `#d-light-toggle` | Hook / Selektor | +| `#d-spd-1` | Hook / Selektor | +| `#d-spd-2` | Hook / Selektor | +| `#d-spd-3` | Hook / Selektor | +| `#fd-cancel` | Hook / Selektor | +| `#fd-print` | Hook / Selektor | +| `#fd-slots` | Hook / Selektor | +| `#filament-dialog` | Hook / Selektor | +| `#file-cancel-btn` | Hook / Selektor | +| `#file-ready-btn` | Hook / Selektor | +| `#file-slots-btn` | Hook / Selektor | +| `#lang-btn` | Hook / Selektor | +| `#log-filter` | Hook / Selektor | +| `#logdir-all` | Hook / Selektor | +| `#logdir-rx` | Hook / Selektor | +| `#logdir-tx` | Hook / Selektor | +| `#log-lbl-level` | i18n-Label "Level:" | +| `#loglvl-all` | onclick `setLogLevel('all')` | +| `#loglvl-err` | onclick `setLogLevel('err')` — nur Fehler | +| `#loglvl-warn` | onclick `setLogLevel('warn')` — Fehler + Warnungen | +| `#nb-console` | Hook / Selektor | +| `#nb-dashboard` | Hook / Selektor | +| `#nb-printers` | Hook / Selektor | +| `#nb-store` | Hook / Selektor | +| `#p-bed-inp` | Hook / Selektor | +| `#p-nozzle-inp` | Hook / Selektor | +| `#panel-console` | Hook / Selektor | +| `#panel-dashboard` | Hook / Selektor | +| `#panel-printers` | Hook / Selektor | +| `#panel-store` | Hook / Selektor | +| `#poll-1` | Hook / Selektor | +| `#poll-2` | Hook / Selektor | +| `#poll-5` | Hook / Selektor | +| `#printer-dropdown-btn` | Hook / Selektor | +| `#printers-grid` | Hook / Selektor | +| `#s-printer-ip` | Hook / Selektor | +| `#settings-btn` | Hook / Selektor | +| `#settings-modal` | Hook / Selektor | +| `#skip-confirm` | Hook / Selektor | +| `#skip-dialog` | Hook / Selektor | +| `#slot-edit-color` | Hook / Selektor | +| `#slot-edit-mat` | Hook / Selektor | +| `#slot-edit-modal` | Hook / Selektor | +| `#slot-edit-preview` | Hook / Selektor | +| `#slot-mat-btns` | Hook / Selektor | +| `#store-filter` | Hook / Selektor | +| `#store-grid` | Hook / Selektor | +| `#store-refresh-btn` | Hook / Selektor | +| `#store-search` | Hook / Selektor | +| `#store-sort` | Hook / Selektor | diff --git a/web/themes/default/app.js b/web/themes/default/app.js index dbce1c0..fcc978b 100644 --- a/web/themes/default/app.js +++ b/web/themes/default/app.js @@ -83,132 +83,127 @@ var ACE_DRY_PRESETS = { }; // Spoolman state -var _spoolmanStatus={configured:false,server:'',sync_rate:0,slot_spools:{}}; -var _spoolmanSpools=[]; -var _slotSpoolMap={}; // {String(global_index): spoolman_spool_id} — last committed assignment +var _spoolmanStatus = { configured: false, server: "", sync_rate: 0, slot_spools: {} }; +var _spoolmanSpools = []; +var _slotSpoolMap = {}; // {String(global_index): spoolman_spool_id} — last committed assignment -function _loadSpoolmanStatus(){ - fetch(_apiUrl('/kx/spoolman/status')).then(function(r){return r.json();}).then(function(d){ - _spoolmanStatus=d; - _slotSpoolMap=d.slot_spools||{}; - }).catch(function(){}); +function _loadSpoolmanStatus() { + fetch(_apiUrl("/kx/spoolman/status")) + .then(function (r) { + return r.json(); + }) + .then(function (d) { + _spoolmanStatus = d; + _slotSpoolMap = d.slot_spools || {}; + _updateSpoolmanStatusDot(); + }) + .catch(function () {}); } - -function _buildSpoolmanSection(){ - var sec=document.getElementById('fd-spoolman-section'); - var rows=document.getElementById('fd-spoolman-rows'); - var loading=document.getElementById('fd-spoolman-loading'); - if(!sec||!rows)return; - if(!_spoolmanStatus.configured){sec.style.display='none';return;} - sec.style.display=''; - rows.innerHTML=''; - if(loading)loading.style.display=''; - - var usedSlots={}; - document.querySelectorAll('#fd-slots select').forEach(function(sel){ - var idx=parseInt(sel.value); - if(idx>=0){ - var slot=(_amsSlots||[]).find(function(s){return s.slot_index===idx;}); - if(slot&&!usedSlots[idx])usedSlots[idx]=slot; - } - }); - - fetch(_apiUrl('/kx/spoolman/spools')).then(function(r){return r.json();}).then(function(d){ - if(loading)loading.style.display='none'; - _spoolmanSpools=d.spools||[]; - var slotKeys=Object.keys(usedSlots).map(Number).sort(function(a,b){return a-b;}); - if(!slotKeys.length){rows.innerHTML='';return;} - rows.innerHTML=slotKeys.map(function(idx){ - var slot=usedSlots[idx]; - var col=(slot.color_hex||'#888'); - var currentSpool=_slotSpoolMap[String(idx)]||''; - var opts=''+_spoolmanSpools.map(function(sp){ - var rem=sp.remaining_weight!=null?' ('+sp.remaining_weight.toFixed(0)+'g)':''; - var vendor=sp.filament&&sp.filament.vendor?sp.filament.vendor+' ':''; - var name=sp.filament&&sp.filament.name?sp.filament.name:'Spool'; - return ''; - }).join(''); - return '
'+ - ''+ - 'Slot '+(idx+1)+''+ - '
'; - }).join(''); - }).catch(function(){if(loading)loading.style.display='none';}); -} - -// Spoolman state -var _spoolmanStatus={configured:false,server:'',sync_rate:0,slot_spools:{}}; -var _spoolmanSpools=[]; -var _slotSpoolMap={}; // {String(global_index): spoolman_spool_id} — last committed assignment - -function _loadSpoolmanStatus(){ - fetch(_apiUrl('/kx/spoolman/status')).then(function(r){return r.json();}).then(function(d){ - _spoolmanStatus=d; - _slotSpoolMap=d.slot_spools||{}; - _updateSpoolmanStatusDot(); - }).catch(function(){}); -} -function _updateSpoolmanStatusDot(){ - var dot=document.getElementById('spoolman-status-dot'); - var lbl=document.getElementById('spoolman-status-lbl'); - if(!dot||!lbl)return; - if(_spoolmanStatus.configured){ - dot.style.color='var(--ok)';lbl.textContent=_spoolmanStatus.server||tr('spoolman_status_configured','verbunden'); +function _updateSpoolmanStatusDot() { + var dot = document.getElementById("spoolman-status-dot"); + var lbl = document.getElementById("spoolman-status-lbl"); + if (!dot || !lbl) return; + if (_spoolmanStatus.configured) { + dot.style.color = "var(--ok)"; + lbl.textContent = _spoolmanStatus.server || tr("spoolman_status_configured", "verbunden"); } else { - dot.style.color='var(--txt2)';lbl.textContent=tr('spoolman_status_not_configured','nicht konfiguriert'); + dot.style.color = "var(--txt2)"; + lbl.textContent = tr("spoolman_status_not_configured", "nicht konfiguriert"); } } -function _buildSpoolmanSection(){ - var sec=document.getElementById('fd-spoolman-section'); - var rows=document.getElementById('fd-spoolman-rows'); - var loading=document.getElementById('fd-spoolman-loading'); - if(!sec||!rows)return; - if(!_spoolmanStatus.configured){sec.style.display='none';return;} - sec.style.display=''; - rows.innerHTML=''; - if(loading)loading.style.display=''; +function _buildSpoolmanSection() { + var sec = document.getElementById("fd-spoolman-section"); + var rows = document.getElementById("fd-spoolman-rows"); + var loading = document.getElementById("fd-spoolman-loading"); + if (!sec || !rows) return; + if (!_spoolmanStatus.configured) { + sec.style.display = "none"; + return; + } + sec.style.display = ""; + rows.innerHTML = ""; + if (loading) loading.style.display = ""; - var usedSlots={}; - document.querySelectorAll('#fd-slots select').forEach(function(sel){ - var idx=parseInt(sel.value); - if(idx>=0){ - var slot=(_amsSlots||[]).find(function(s){return s.slot_index===idx;}); - if(slot&&!usedSlots[idx])usedSlots[idx]=slot; + var usedSlots = {}; + document.querySelectorAll("#fd-slots select").forEach(function (sel) { + var idx = parseInt(sel.value); + if (idx >= 0) { + var slot = (_amsSlots || []).find(function (s) { + return s.slot_index === idx; + }); + if (slot && !usedSlots[idx]) usedSlots[idx] = slot; } }); - fetch(_apiUrl('/kx/spoolman/spools')).then(function(r){return r.json();}).then(function(d){ - if(loading)loading.style.display='none'; - _spoolmanSpools=d.spools||[]; - var slotKeys=Object.keys(usedSlots).map(Number).sort(function(a,b){return a-b;}); - if(!slotKeys.length){rows.innerHTML='';return;} - rows.innerHTML=slotKeys.map(function(idx){ - var slot=usedSlots[idx]; - var col=(slot.color_hex||'#888'); - var currentSpool=_slotSpoolMap[String(idx)]||''; - var opts=''+_spoolmanSpools.map(function(sp){ - var rem=sp.remaining_weight!=null?' ('+sp.remaining_weight.toFixed(0)+'g)':''; - var vendor=sp.filament&&sp.filament.vendor?sp.filament.vendor+' ':''; - var name=sp.filament&&sp.filament.name?sp.filament.name:'Spool'; - return ''; - }).join(''); - return '
'+ - ''+ - 'Slot '+(idx+1)+''+ - '
'; - }).join(''); - }).catch(function(){if(loading)loading.style.display='none';}); + fetch(_apiUrl("/kx/spoolman/spools")) + .then(function (r) { + return r.json(); + }) + .then(function (d) { + if (loading) loading.style.display = "none"; + _spoolmanSpools = d.spools || []; + var slotKeys = Object.keys(usedSlots) + .map(Number) + .sort(function (a, b) { + return a - b; + }); + if (!slotKeys.length) { + rows.innerHTML = ''; + return; + } + rows.innerHTML = slotKeys + .map(function (idx) { + var slot = usedSlots[idx]; + var col = slot.color_hex || "#888"; + var currentSpool = _slotSpoolMap[String(idx)] || ""; + var opts = + '' + + _spoolmanSpools + .map(function (sp) { + var rem = + sp.remaining_weight != null ? " (" + sp.remaining_weight.toFixed(0) + "g)" : ""; + var vendor = sp.filament && sp.filament.vendor ? sp.filament.vendor + " " : ""; + var name = sp.filament && sp.filament.name ? sp.filament.name : "Spool"; + return ( + '" + ); + }) + .join(""); + return ( + '
' + + '' + + 'Slot ' + + (idx + 1) + + "" + + '
" + ); + }) + .join(""); + }) + .catch(function () { + if (loading) loading.style.display = "none"; + }); } -function _aceAutoRefillGet(aceId){return !!aceAutoRefillPrefs[String(aceId)];} -function _aceAutoRefillSet(aceId,on){ - aceAutoRefillPrefs[String(aceId)]=!!on; - localStorage.setItem('aceAutoRefillPrefs',JSON.stringify(aceAutoRefillPrefs)); +function _aceAutoRefillGet(aceId) { + return !!aceAutoRefillPrefs[String(aceId)]; +} +function _aceAutoRefillSet(aceId, on) { + aceAutoRefillPrefs[String(aceId)] = !!on; + localStorage.setItem("aceAutoRefillPrefs", JSON.stringify(aceAutoRefillPrefs)); } function _aceDryProfileGet(aceId) { var p = aceDryProfiles[String(aceId)] || {}; @@ -223,10 +218,7 @@ function _aceDryProfileGet(aceId) { function _aceDryProfileSet(aceId, temp, durationSec, preset) { aceDryProfiles[String(aceId)] = { temp: Math.max(30, Math.min(80, parseInt(temp, 10) || 45)), - duration_sec: Math.max( - 10 * 60, - Math.min(24 * 3600, parseInt(durationSec, 10) || 4 * 3600), - ), + duration_sec: Math.max(10 * 60, Math.min(24 * 3600, parseInt(durationSec, 10) || 4 * 3600)), preset: preset || "", }; localStorage.setItem("aceDryProfiles", JSON.stringify(aceDryProfiles)); @@ -242,13 +234,9 @@ function _syncAceDryPresetsFromServer(raw) { if (!p || typeof p !== "object") return; var t = parseInt(p.temp, 10); var d = parseInt(p.duration_sec, 10); - if (Number.isFinite(t)) - ACE_DRY_PRESETS[k].temp = Math.max(30, Math.min(80, t)); + if (Number.isFinite(t)) ACE_DRY_PRESETS[k].temp = Math.max(30, Math.min(80, t)); if (Number.isFinite(d)) - ACE_DRY_PRESETS[k].duration_sec = Math.max( - 10 * 60, - Math.min(24 * 3600, d), - ); + ACE_DRY_PRESETS[k].duration_sec = Math.max(10 * 60, Math.min(24 * 3600, d)); if (/^custom_[123]$/.test(k) && typeof p.name === "string") { var n = p.name.trim(); ACE_DRY_PRESETS[k].name = n || "Custom " + k.slice(-1); @@ -259,10 +247,7 @@ function _syncAceDryPresetsFromServer(raw) { // ── Theme ── function toggleTheme() { var h = document.documentElement; - h.setAttribute( - "data-theme", - h.getAttribute("data-theme") === "dark" ? "light" : "dark", - ); + h.setAttribute("data-theme", h.getAttribute("data-theme") === "dark" ? "light" : "dark"); localStorage.setItem("theme", h.getAttribute("data-theme")); } (function () { @@ -277,11 +262,7 @@ var _langCache = {}; function tr(key, fallback) { var v = T && T[key]; - return typeof v === "string" && v.length - ? v - : fallback !== undefined - ? fallback - : ""; + return typeof v === "string" && v.length ? v : fallback !== undefined ? fallback : ""; } function _langToggleLabel(lang) { @@ -296,29 +277,14 @@ function _langToggleLabel(lang) { function _mapSupportedLang(lang) { if (!lang) return ""; var l = String(lang).toLowerCase().replace(/_/g, "-").trim(); - if ( - l === "de" || - l === "en" || - l === "es" || - l === "fr" || - l === "it" || - l === "zh-cn" - ) - return l; + if (l === "de" || l === "en" || l === "es" || l === "fr" || l === "it" || l === "zh-cn") return l; var base = l.split("-")[0]; - if ( - base === "de" || - base === "en" || - base === "es" || - base === "fr" || - base === "it" - ) + if (base === "de" || base === "en" || base === "es" || base === "fr" || base === "it") return base; if (base === "zh") { - if (l.indexOf("cn") >= 0 || l.indexOf("hans") >= 0 || l === "zh") - return "zh-cn"; + if (l.indexOf("cn") >= 0 || l.indexOf("hans") >= 0 || l === "zh") return "zh-cn"; } return ""; } @@ -329,8 +295,7 @@ function _normalizeLang(lang) { function _detectBrowserLanguage() { var prefs = []; - if (Array.isArray(navigator.languages) && navigator.languages.length) - prefs = navigator.languages; + if (Array.isArray(navigator.languages) && navigator.languages.length) prefs = navigator.languages; else if (navigator.language) prefs = [navigator.language]; for (var i = 0; i < prefs.length; i++) { var mapped = _mapSupportedLang(prefs[i]); @@ -418,11 +383,7 @@ function renderPrinterDropdown() { var wrap = document.getElementById("printer-dropdown-wrap"); var single = document.getElementById("h-pname-single"); var name = - _printers.length === 0 - ? "–" - : _activePrinter - ? _activePrinter.name || "Kobra X" - : "Kobra X"; + _printers.length === 0 ? "–" : _activePrinter ? _activePrinter.name || "Kobra X" : "Kobra X"; var pname = document.getElementById("h-pname"); if (pname) pname.textContent = name; if (single) single.textContent = name; @@ -433,8 +394,7 @@ function renderPrinterDropdown() { if (menu) { menu.innerHTML = _printers .map(function (p) { - var active = - _activePrinter && String(p.id) === String(_activePrinter.id); + var active = _activePrinter && String(p.id) === String(_activePrinter.id); var num = p.id; return ( ' (e.textContent = T.label_set)); - document - .querySelectorAll(".lbl-off") - .forEach((e) => (e.textContent = T.label_off)); + document.querySelectorAll(".lbl-set").forEach((e) => (e.textContent = T.label_set)); + document.querySelectorAll(".lbl-off").forEach((e) => (e.textContent = T.label_off)); setText("d-chart-label", T.panel_temps_chart); // Axis labels setText("ptitle-motion-xy", T.panel_motion_xy); setText("ptitle-motion-z", T.panel_motion_z); - document - .querySelectorAll(".lbl-home-z") - .forEach((e) => (e.textContent = T.btn_home_z)); - document - .querySelectorAll(".lbl-home-xy") - .forEach((e) => (e.textContent = T.btn_home_xy)); - document - .querySelectorAll(".lbl-home-all") - .forEach((e) => (e.textContent = T.btn_home_all)); + document.querySelectorAll(".lbl-home-z").forEach((e) => (e.textContent = T.btn_home_z)); + document.querySelectorAll(".lbl-home-xy").forEach((e) => (e.textContent = T.btn_home_xy)); + document.querySelectorAll(".lbl-home-all").forEach((e) => (e.textContent = T.btn_home_all)); document .querySelectorAll(".lbl-disable-motors") .forEach((e) => (e.textContent = T.btn_disable_motors)); - document - .querySelectorAll(".lbl-step") - .forEach((e) => (e.textContent = T.label_step)); + document.querySelectorAll(".lbl-step").forEach((e) => (e.textContent = T.label_step)); document .querySelectorAll(".temp-input") - .forEach((e) => - e.setAttribute("placeholder", T.label_target_c.replace(":", "")), - ); + .forEach((e) => e.setAttribute("placeholder", T.label_target_c.replace(":", ""))); // Console setText("ptitle-console", T.panel_console_title); // Settings-Panel @@ -583,8 +528,7 @@ function applyLang() { setText("modal-sec-print", T.settings_print); setText("modal-sec-notifications", T.settings_notifications); var nhEl = document.getElementById("notif-hint"); - if (nhEl && T.settings_notifications_hint) - nhEl.innerHTML = T.settings_notifications_hint; + if (nhEl && T.settings_notifications_hint) nhEl.innerHTML = T.settings_notifications_hint; setText("lbl-notif-add", T.settings_notif_add); setText("lbl-notif-interval", T.settings_notif_interval_lbl); setText("lbl-notif-min-unit", T.settings_notif_min_unit); @@ -598,21 +542,25 @@ function applyLang() { setText("setcat-lbl-display", T.settings_cat_display || "Darstellung"); setText("setcat-lbl-display2", T.settings_cat_display || "Darstellung"); setText("setcat-lbl-filament", T.settings_cat_filament || "Filament"); - setText('setcat-lbl-integrations',T.settings_integrations||'Integrationen'); - setText('modal-sec-spoolman',T.modal_sec_spoolman||'Spoolman'); - setText('lbl-spoolman-url',T.lbl_spoolman_url||'Server-URL'); - setText('lbl-spoolman-sync-rate',T.lbl_spoolman_sync_rate||'Sync-Rate (s, 0=aus)'); - setText('modal-sec-obico',T.modal_sec_obico||'Obico'); - var obicoBox=document.getElementById('obico-info-box'); - if(obicoBox){ - var cfgEl=document.getElementById('obico-cfg-path'); - var cfgPath=cfgEl?cfgEl.textContent:''; - obicoBox.innerHTML=(T.obico_info_configured_via||'Obico wird über den moonraker-obico-Container konfiguriert.')+'
'+(T.obico_config_file_label||'Config-Datei:')+' '+cfgPath+''; + setText("setcat-lbl-integrations", T.settings_integrations || "Integrationen"); + setText("modal-sec-spoolman", T.modal_sec_spoolman || "Spoolman"); + setText("lbl-spoolman-url", T.lbl_spoolman_url || "Server-URL"); + setText("lbl-spoolman-sync-rate", T.lbl_spoolman_sync_rate || "Sync-Rate (s, 0=aus)"); + setText("modal-sec-obico", T.modal_sec_obico || "Obico"); + var obicoBox = document.getElementById("obico-info-box"); + if (obicoBox) { + var cfgEl = document.getElementById("obico-cfg-path"); + var cfgPath = cfgEl ? cfgEl.textContent : ""; + obicoBox.innerHTML = + (T.obico_info_configured_via || + "Obico wird über den moonraker-obico-Container konfiguriert.") + + "
" + + (T.obico_config_file_label || "Config-Datei:") + + ' ' + + cfgPath + + ""; } - setText( - "setcat-lbl-notifications", - T.settings_cat_notifications || "Benachrichtigungen", - ); + setText("setcat-lbl-notifications", T.settings_cat_notifications || "Benachrichtigungen"); setText("setcat-lbl-system", T.settings_cat_system || "System"); setText("lbl-set-lang", T.settings_cat_language || "Sprache"); setText("lbl-set-theme", T.settings_cat_theme || "Hell / Dunkel umschalten"); @@ -620,40 +568,30 @@ function applyLang() { var pollHint = document.getElementById("lbl-poll-hint"); if (pollHint) pollHint.textContent = - T.settings_poll_interval_hint || - "Wie oft die Bridge den Drucker-Status abfragt"; + T.settings_poll_interval_hint || "Wie oft die Bridge den Drucker-Status abfragt"; setText( "lbl-filament-mapping", - T.settings_filament_mapping || "Filament-Profil-Mapping (pro Slot)", + T.settings_filament_mapping || "Filament-Profil-Mapping (pro Slot)" ); var fmHint = document.getElementById("filament-mapping-hint"); if (fmHint) fmHint.textContent = T.settings_filament_mapping_hint || 'Festes Orca-Profil pro AMS-Slot. Beim Slicer-Sync sendet die Bridge dieses Profil statt „Generic".'; - setText( - "lbl-filament-mapping-save", - T.settings_filament_mapping_save || "Mapping speichern", - ); + setText("lbl-filament-mapping-save", T.settings_filament_mapping_save || "Mapping speichern"); setText( "lbl-visible-vendors", - T.settings_visible_vendors || "Sichtbare Hersteller (Profil-Dropdown)", + T.settings_visible_vendors || "Sichtbare Hersteller (Profil-Dropdown)" ); var vfs = document.getElementById("vendor-filter-search"); if (vfs) - vfs.setAttribute( - "placeholder", - T.settings_vendor_filter_placeholder || "Hersteller suchen…", - ); + vfs.setAttribute("placeholder", T.settings_vendor_filter_placeholder || "Hersteller suchen…"); setText( "visible-vendors-hint", T.settings_visible_vendors_hint || - 'Nur diese Hersteller erscheinen im Slot-Profil-Dropdown. Nichts ausgewählt = alle anzeigen. „Generic" und eigene Profile sind immer sichtbar.', - ); - setText( - "lbl-visible-vendors-save", - T.settings_visible_vendors_save || "Auswahl speichern", + 'Nur diese Hersteller erscheinen im Slot-Profil-Dropdown. Nichts ausgewählt = alle anzeigen. „Generic" und eigene Profile sind immer sichtbar.' ); + setText("lbl-visible-vendors-save", T.settings_visible_vendors_save || "Auswahl speichern"); // Custom-Profile-Import (Issue #41) setText("modal-sec-orca-profiles", T.orca_profile_section); setText("orca-profiles-hint", T.orca_profile_hint); @@ -664,8 +602,7 @@ function applyLang() { setText("profile-import-list-label", T.orca_profile_list_label); // Hilfe-Text mit Inline-HTML — innerHTML statt setText var helpEl = document.getElementById("profile-import-help"); - if (helpEl && T.orca_profile_help_html) - helpEl.innerHTML = T.orca_profile_help_html; + if (helpEl && T.orca_profile_help_html) helpEl.innerHTML = T.orca_profile_help_html; setText("btn-save-settings", T.settings_save); setText("lbl-printer-name", T.settings_printer_name); setText("lbl-printer-ip", T.settings_printer_ip); @@ -696,24 +633,14 @@ function applyLang() { setText("d-spd-lbl-2", T.speed_normal.replace(/^\S+\s/, "")); setText("d-spd-lbl-3", T.speed_sport.replace(/^\S+\s/, "")); // AMS feed/unload - document - .querySelectorAll(".lbl-feed") - .forEach((e) => (e.textContent = T.lbl_feed)); - document - .querySelectorAll(".lbl-unload") - .forEach((e) => (e.textContent = T.lbl_unload)); + document.querySelectorAll(".lbl-feed").forEach((e) => (e.textContent = T.lbl_feed)); + document.querySelectorAll(".lbl-unload").forEach((e) => (e.textContent = T.lbl_unload)); for (var i = 0; i < 4; i++) { - setText( - "d-card-ace-dry-" + i, - "ACE " + (i + 1) + " - " + tr("ace_dry_dryer"), - ); + setText("d-card-ace-dry-" + i, "ACE " + (i + 1) + " - " + tr("ace_dry_dryer")); setText("d-ace-auto-refill-label-" + i, tr("ace_dry_auto_refill")); setText("d-ace-drying-enable-label-" + i, tr("ace_dry_enable")); setText("d-ace-dry-humidity-label-" + i, tr("ace_dry_humidity") + ":"); - setText( - "d-ace-dry-current-temp-label-" + i, - tr("ace_dry_current_temp") + ":", - ); + setText("d-ace-dry-current-temp-label-" + i, tr("ace_dry_current_temp") + ":"); setText("d-ace-dry-target-label-" + i, tr("ace_dry_temp_line") + ":"); setText("d-ace-dry-time-label-" + i, tr("ace_dry_time_line") + ":"); setText("d-ace-dry-chart-label-" + i, tr("ace_dry_chart")); @@ -753,15 +680,11 @@ function applyLang() { // Elements not yet covered by setText above var settingsBtn = document.getElementById("settings-btn"); if (settingsBtn) - settingsBtn.title = - T.settings_btn_tooltip || T.settings_title || "Einstellungen"; + settingsBtn.title = T.settings_btn_tooltip || T.settings_title || "Einstellungen"; var snpEl = document.getElementById("s-printer-name"); - if (snpEl) - snpEl.placeholder = - T.settings_printer_name_placeholder || "z.B. Kobra X Links"; + if (snpEl) snpEl.placeholder = T.settings_printer_name_placeholder || "z.B. Kobra X Links"; var sdidEl = document.getElementById("s-device-id"); - if (sdidEl) - sdidEl.placeholder = T.settings_device_id_placeholder || "32 Hex-Zeichen"; + if (sdidEl) sdidEl.placeholder = T.settings_device_id_placeholder || "32 Hex-Zeichen"; setText("d-fan-off", T.label_off || "Aus"); setText("skip-confirm", T.skip_confirm_btn || "Überspringen"); setText("ams-no-data", T.ams_no_data || "Keine AMS-Daten empfangen"); @@ -774,19 +697,13 @@ function applyLang() { setText("fd-cancel", T.fd_cancel || "Abbrechen"); setText("fd-print", T.fd_print || "▶ Drucken"); // Dialog: Web Upload Verify - setText( - "store-web-verify-title", - T.store_web_verify_title || "Datei verifizieren", - ); + setText("store-web-verify-title", T.store_web_verify_title || "Datei verifizieren"); setText( "store-web-verify-msg", T.store_web_verify_msg || - "Bitte bestätige, dass diese Datei für den Anycubic Kobra X erstellt wurde.", - ); - setText( - "store-web-verify-confirm", - T.store_web_verify_confirm || "Bestätigen", + "Bitte bestätige, dass diese Datei für den Anycubic Kobra X erstellt wurde." ); + setText("store-web-verify-confirm", T.store_web_verify_confirm || "Bestätigen"); setText("store-web-verify-abort", T.store_web_verify_abort || "Abbrechen"); // GCode-Browser-Karten: Texte sind via innerHTML eingebacken, // bei Sprachwechsel komplett neu rendern. @@ -905,13 +822,9 @@ function ensureAceDryCards() { // ── Panel nav ── function showPanel(id) { - document - .querySelectorAll(".panel") - .forEach((p) => p.classList.remove("active")); + document.querySelectorAll(".panel").forEach((p) => p.classList.remove("active")); document.getElementById("panel-" + id).classList.add("active"); - document - .querySelectorAll(".nav-btn,.bnav-btn") - .forEach((b) => b.classList.remove("active")); + document.querySelectorAll(".nav-btn,.bnav-btn").forEach((b) => b.classList.remove("active")); var nb = document.getElementById("nb-" + id); if (nb) nb.classList.add("active"); var bnb = document.getElementById("bnb-" + id); @@ -922,12 +835,8 @@ function showPanel(id) { // Settings-Kategorie umschalten (Master-Detail) function showSettingsCat(name) { - document - .querySelectorAll(".set-group") - .forEach((g) => g.classList.remove("active")); - document - .querySelectorAll(".set-cat") - .forEach((b) => b.classList.remove("active")); + document.querySelectorAll(".set-group").forEach((g) => g.classList.remove("active")); + document.querySelectorAll(".set-cat").forEach((b) => b.classList.remove("active")); var g = document.getElementById("setgrp-" + name); if (g) g.classList.add("active"); var c = document.getElementById("setcat-" + name); @@ -1011,8 +920,7 @@ function showToast(msg) { function setLogDir(dir) { logDirFilter = dir; document.querySelectorAll(".log-dir-btn").forEach(function (b) { - b.style.background = - b.id === "logdir-" + dir ? "var(--accent)" : "var(--raised)"; + b.style.background = b.id === "logdir-" + dir ? "var(--accent)" : "var(--raised)"; b.style.color = b.id === "logdir-" + dir ? "#fff" : "var(--txt2)"; }); renderLog(); @@ -1020,8 +928,7 @@ function setLogDir(dir) { function setLogLevel(lvl) { logLevelFilter = lvl; document.querySelectorAll(".log-lvl-btn").forEach(function (b) { - b.style.background = - b.id === "loglvl-" + lvl ? "var(--accent)" : "var(--raised)"; + b.style.background = b.id === "loglvl-" + lvl ? "var(--accent)" : "var(--raised)"; b.style.color = b.id === "loglvl-" + lvl ? "#fff" : "var(--txt2)"; }); renderLog(); @@ -1047,22 +954,14 @@ function renderLog() { if (logDirFilter === "rx" && !/ RX[ (]/.test(m)) return false; if (logDirFilter === "tx" && !/ TX[ (]/.test(m)) return false; if (logLevelFilter === "err" && l.cls !== "msg-err") return false; - if ( - logLevelFilter === "warn" && - l.cls !== "msg-err" && - l.cls !== "msg-warn" - ) - return false; + if (logLevelFilter === "warn" && l.cls !== "msg-err" && l.cls !== "msg-warn") return false; if (fl && !m.toLowerCase().includes(fl)) return false; return true; }); var savedScroll = logAutoScroll ? null : el.scrollTop; el.innerHTML = rows .map(function (l) { - var cnt = - l.count && l.count > 1 - ? ' (×' + l.count + ")" - : ""; + var cnt = l.count && l.count > 1 ? ' (×' + l.count + ")" : ""; return ( '
' + l.ts + @@ -1142,9 +1041,7 @@ function fmtHmsFromSec(total) { var h = Math.floor(total / 3600); var mm = Math.floor((total % 3600) / 60); var ss = total % 60; - return ( - h + ":" + String(mm).padStart(2, "0") + ":" + String(ss).padStart(2, "0") - ); + return h + ":" + String(mm).padStart(2, "0") + ":" + String(ss).padStart(2, "0"); } function post(url, body) { return fetch(_apiUrl(url), { @@ -1165,8 +1062,7 @@ function applyState() { var banner = document.getElementById("conn-error-banner"); if (banner) { if (s.connection_error && _printers.length > 0) { - banner.textContent = - "⚠ " + tr("lbl_conn_error") + " " + s.connection_error; + banner.textContent = "⚠ " + tr("lbl_conn_error") + " " + s.connection_error; banner.style.display = "block"; } else { banner.style.display = "none"; @@ -1175,8 +1071,7 @@ function applyState() { var bannerVisible = false; var frb = document.getElementById("file-ready-banner"); if (frb) { - var shouldAutoOpen = - s.print_start_dialog === undefined ? true : !!s.print_start_dialog; + var shouldAutoOpen = s.print_start_dialog === undefined ? true : !!s.print_start_dialog; if (s.file_ready && s.print_state === "standby") { document.getElementById("file-ready-name").textContent = s.file_ready; // Neue Datei → Abbruch-Sperre aufheben @@ -1188,11 +1083,7 @@ function applyState() { if (shouldAutoOpen) { // Dialog-Modus: Banner niemals anzeigen. frb.style.display = "none"; - if ( - !_fdDialogOpen && - !_fdUserCancelled && - _fdAutoOpenedFile !== s.file_ready - ) { + if (!_fdDialogOpen && !_fdUserCancelled && _fdAutoOpenedFile !== s.file_ready) { _fdAutoOpenedFile = s.file_ready; startReadyFileWithSlots(s.file_ready, true); } @@ -1243,9 +1134,7 @@ function applyState() { document.getElementById("h-state").textContent = T["kobra_" + s.kobra_state] || s.kobra_state || T.header_status_standby; var _pn = - _printers.length === 0 - ? "–" - : (_activePrinter && _activePrinter.name) || s.printer_name; + _printers.length === 0 ? "–" : (_activePrinter && _activePrinter.name) || s.printer_name; var _el = document.getElementById("h-pname"); if (_el) _el.textContent = _pn; var _el2 = document.getElementById("h-pname-single"); @@ -1276,10 +1165,7 @@ function applyState() { var dpbar = document.getElementById("d-pbar"); if (dpbar) dpbar.style.width = pct + "%"; - var layers = - s.curr_layer && s.total_layers - ? "L " + s.curr_layer + " / " + s.total_layers - : "–"; + var layers = s.curr_layer && s.total_layers ? "L " + s.curr_layer + " / " + s.total_layers : "–"; var dlayers = document.getElementById("d-layers"); if (dlayers) dlayers.textContent = layers; var dzpos = document.getElementById("d-zpos"); @@ -1288,8 +1174,7 @@ function applyState() { var delapsed = document.getElementById("d-elapsed"); if (delapsed) delapsed.textContent = fmtTime(s.print_duration); var dremain = document.getElementById("d-remain"); - if (dremain) - dremain.textContent = s.remain_time > 0 ? fmtTime(s.remain_time) : "–"; + if (dremain) dremain.textContent = s.remain_time > 0 ? fmtTime(s.remain_time) : "–"; var dslrow = document.getElementById("d-slicer-row"); var dsltime = document.getElementById("d-slicer-time"); if (dslrow && dsltime) { @@ -1371,8 +1256,7 @@ function applyState() { var id = Number(u.id); if (id >= 0 && id <= 3) unitMap[id] = u; }); - var aceMode = - s.filament_mode === "ace_direct" || s.filament_mode === "ace_hub"; + var aceMode = s.filament_mode === "ace_direct" || s.filament_mode === "ace_hub"; var detected = (s.ace_units || []).filter(function (id) { return id >= 0 && id <= 3; }); @@ -1391,8 +1275,7 @@ function applyState() { return a - b; }); var aceWrap = document.getElementById("d-ace-dry-wrap"); - if (aceWrap) - aceWrap.style.display = aceMode && detected.length ? "contents" : "none"; + if (aceWrap) aceWrap.style.display = aceMode && detected.length ? "contents" : "none"; for (var i = 0; i < 4; i++) { var card = document.getElementById("d-ace-dry-card-" + i); if (!card) continue; @@ -1403,7 +1286,7 @@ function applyState() { var refillToggle = document.getElementById("ace-auto-refill-toggle-" + i); var autoFeedMap = s.ace_auto_feed || {}; if (refillToggle && !_aceAutoFeedPending[i]) { - var afVal = autoFeedMap.hasOwnProperty(String(i)) + var afVal = Object.prototype.hasOwnProperty.call(autoFeedMap, String(i)) ? Number(autoFeedMap[String(i)]) : _aceAutoRefillGet(i) ? 1 @@ -1414,23 +1297,19 @@ function applyState() { if (dryToggle) dryToggle.checked = Number(ud.status || 0) > 0; var hh = document.getElementById("d-ace-dry-humidity-" + i); if (hh) { - var hv = + var hum = ud.humidity === null || ud.humidity === undefined || ud.humidity === "" ? null : Number(ud.humidity); - hh.textContent = - hv === null || Number.isNaN(hv) ? "-" : Math.round(hv) + "%"; + hh.textContent = hum === null || Number.isNaN(hum) ? "-" : Math.round(hum) + "%"; } var ht = document.getElementById("d-ace-dry-current-temp-" + i); if (ht) { var ct = - ud.current_temp === null || - ud.current_temp === undefined || - ud.current_temp === "" + ud.current_temp === null || ud.current_temp === undefined || ud.current_temp === "" ? null : Number(ud.current_temp); - ht.textContent = - ct === null || Number.isNaN(ct) ? "-" : ct.toFixed(1) + "°C"; + ht.textContent = ct === null || Number.isNaN(ct) ? "-" : ct.toFixed(1) + "°C"; } var prof = _aceDryProfileGet(i); var useSec = @@ -1438,9 +1317,7 @@ function applyState() { ? Number(ud.remain_time || 0) * 60 : prof.duration_sec; var showTemp = - Number(ud.status || 0) > 0 && Number(ud.target_temp) > 0 - ? Number(ud.target_temp) - : prof.temp; + Number(ud.status || 0) > 0 && Number(ud.target_temp) > 0 ? Number(ud.target_temp) : prof.temp; var dryTempEl = document.getElementById("d-ace-dry-target-" + i); if (dryTempEl) dryTempEl.textContent = showTemp + "°C"; var dryTimeEl = document.getElementById("d-ace-dry-time-" + i); @@ -1469,11 +1346,7 @@ function applyState() { boxIds.forEach(function (bid) { var entries = boxMap[bid]; var label = - bid === -1 - ? acePresent - ? "Toolhead (Slots 1–3)" - : "Toolhead" - : "ACE " + (bid + 1); + bid === -1 ? (acePresent ? "Toolhead (Slots 1–3)" : "Toolhead") : "ACE " + (bid + 1); html += '
' + '
' + @@ -1484,18 +1357,12 @@ function applyState() { var slot = e.slot; var i = e.arrIdx; var empty = slot.status !== 5; - var rgb = empty - ? [80, 80, 80] - : Array.isArray(slot.color) - ? slot.color - : [128, 128, 128]; + var rgb = empty ? [80, 80, 80] : Array.isArray(slot.color) ? slot.color : [128, 128, 128]; var col = "rgb(" + rgb[0] + "," + rgb[1] + "," + rgb[2] + ")"; var globalIdx = slot.global_index != null ? slot.global_index : i; var active = slot.status === 1 || slot.active; var loaded = - s.ams_loaded_slot != null && - s.ams_loaded_slot >= 0 && - globalIdx === s.ams_loaded_slot; + s.ams_loaded_slot != null && s.ams_loaded_slot >= 0 && globalIdx === s.ams_loaded_slot; var activity = slot.activity || ""; var pct = empty ? T.ams_empty @@ -1509,15 +1376,10 @@ function applyState() { var genericType = slot.type || slot.material_type || "–"; // Material-Label: bei belegtem Slot mit Mapping den konkreten Profilnamen // (z.B. „eSUN PLA+") statt nur des generischen Typs zeigen (Issue #57 Punkt 4). - var materialLabel = empty - ? "–" - : profile && profile.name - ? profile.name - : genericType; + var materialLabel = empty ? "–" : profile && profile.name ? profile.name : genericType; var vendorBadge = ""; if (!empty && profile && profile.vendor) { - var tt = - (profile.name || "") + (profile.id ? " (" + profile.id + ")" : ""); + var tt = (profile.name || "") + (profile.id ? " (" + profile.id + ")" : ""); vendorBadge = '
' + - (tr("slot_edit_profile_default") || "Generic (Standard)") + - ""; + '"; var userProfs = profiles.filter(function (p) { return p.is_user; }); @@ -1987,8 +1827,7 @@ function _fillMappingDropdown(slot) { o.dataset.vendor = p.vendor; o.dataset.name = p.name; o.dataset.id = p.id || ""; - o.textContent = - (p.is_user ? "★ " : "") + p.name + (p.vendor ? " — " + p.vendor : ""); + o.textContent = (p.is_user ? "★ " : "") + p.name + (p.vendor ? " — " + p.vendor : ""); if (o.value === wantKey) o.selected = true; g.appendChild(o); } @@ -2050,10 +1889,7 @@ function saveFilamentMapping() { } chain .then(function () { - clog( - tr("log_filament_mapping_saved") || "Filament-Mapping gespeichert", - "msg-ok", - ); + clog(tr("log_filament_mapping_saved") || "Filament-Mapping gespeichert", "msg-ok"); openSettings(); // neu laden → ID-Hints aktualisieren }) .catch(function (e) { @@ -2084,9 +1920,7 @@ function renderVendorChecklist() { if (!p.is_user && p.vendor && p.vendor !== "Generic") set[p.vendor] = 1; }); var vendors = Object.keys(set).sort(); - var q = ( - (document.getElementById("vendor-filter-search") || {}).value || "" - ).toLowerCase(); + var q = ((document.getElementById("vendor-filter-search") || {}).value || "").toLowerCase(); if (q) vendors = vendors.filter(function (v) { return v.toLowerCase().indexOf(q) >= 0; @@ -2127,10 +1961,7 @@ function saveVisibleVendors() { }) .then(function () { _visibleVendors = vendors.slice(); // Dropdown-Cache aktualisieren - clog( - tr("log_visible_vendors_saved") || "Hersteller-Auswahl gespeichert", - "msg-ok", - ); + clog(tr("log_visible_vendors_saved") || "Hersteller-Auswahl gespeichert", "msg-ok"); }) .catch(function (e) { clog("Vendor-Filter-Fehler: " + e, "msg-err"); @@ -2149,9 +1980,7 @@ function refreshUserProfileList() { var profs = (d && d.result) || []; if (!profs.length) { listEl.innerHTML = - '' + - (tr("orca_profile_user_empty") || "– keine –") + - ""; + '' + (tr("orca_profile_user_empty") || "– keine –") + ""; return; } listEl.innerHTML = profs @@ -2178,10 +2007,9 @@ function refreshUserProfileList() { .catch(function () {}); } function deleteUserProfile(vendor, name) { - fetch( - _apiUrl("/kx/filament/profiles/user?vendor=" + vendor + "&name=" + name), - { method: "DELETE" }, - ) + fetch(_apiUrl("/kx/filament/profiles/user?vendor=" + vendor + "&name=" + name), { + method: "DELETE", + }) .then(function (r) { return r.json(); }) @@ -2211,9 +2039,7 @@ function refreshImportDialogList() { var profs = (d && d.result) || []; if (!profs.length) { el.innerHTML = - '' + - (tr("orca_profile_user_empty") || "– keine –") + - ""; + '' + (tr("orca_profile_user_empty") || "– keine –") + ""; return; } el.innerHTML = profs @@ -2254,10 +2080,7 @@ function doProfileImportUpload(files) { ": " + totalAdded + (totalSkipped - ? " / " + - totalSkipped + - " " + - (tr("orca_profile_skipped") || "übersprungen") + ? " / " + totalSkipped + " " + (tr("orca_profile_skipped") || "übersprungen") : ""); status.style.color = "var(--ok)"; _orcaFilamentCache = null; @@ -2265,14 +2088,10 @@ function doProfileImportUpload(files) { refreshUserProfileList(); // Vendor-Checkliste neu aufbauen — ein Import kann einen bisher // unbekannten System-Vendor mitbringen (Issue #41). - if (document.getElementById("visible-vendors-list")) - renderVendorChecklist(); + if (document.getElementById("visible-vendors-list")) renderVendorChecklist(); // Wenn Slot-Edit offen ist, Dropdown gleich neu befüllen var mat = document.getElementById("slot-edit-mat"); - if ( - mat && - document.getElementById("slot-edit-modal").classList.contains("open") - ) { + if (mat && document.getElementById("slot-edit-modal").classList.contains("open")) { _fillSlotProfileDropdown(mat.value, "", ""); } return; @@ -2322,9 +2141,7 @@ function updateSlotEditFeedButton() { return; } btn.style.display = ""; - btn.textContent = _slotEditLoaded - ? tr("slot_edit_unload") - : tr("slot_edit_load"); + btn.textContent = _slotEditLoaded ? tr("slot_edit_unload") : tr("slot_edit_load"); } var _orcaFilamentCache = null; // [{id,name,vendor,type,color}, …] var _visibleVendors = null; // Vendor-Sichtbarkeitsfilter (Issue #41); [] = alle @@ -2379,15 +2196,9 @@ function _fillSlotProfileDropdown(material, currentVendor, currentName) { var matched = profiles.filter(function (p) { var pt = (p.type || "").toUpperCase(); // PLA-CF, PLA-SILK etc. zählen auch zu PLA - return ( - matU === "" || - pt === matU || - pt.startsWith(matU + "-") || - pt.startsWith(matU + " ") - ); + return matU === "" || pt === matU || pt.startsWith(matU + "-") || pt.startsWith(matU + " "); }); - sel.innerHTML = - '"; + sel.innerHTML = '"; // User-Profile (is_user) zuerst — eigene Optgroup '★ Eigene' an erster Stelle. var userProfs = matched.filter(function (p) { return p.is_user; @@ -2448,14 +2259,9 @@ function _fillSlotProfileDropdown(material, currentVendor, currentName) { function openSlotEdit(i) { var slot = (window._amsSlots || [])[i] || {}; var globalIdx = - slot.global_index != null - ? slot.global_index - : slot.index != null - ? slot.index - : i; + slot.global_index != null ? slot.global_index : slot.index != null ? slot.index : i; _slotEditIndex = globalIdx; - _slotEditLoaded = - S.ams_loaded_slot != null && S.ams_loaded_slot === globalIdx; + _slotEditLoaded = S.ams_loaded_slot != null && S.ams_loaded_slot === globalIdx; document.getElementById("slot-edit-title").textContent = T.slot_edit_title + " " + (globalIdx + 1); var rgb = Array.isArray(slot.color) ? slot.color : [128, 128, 128]; @@ -2508,11 +2314,7 @@ function openSlotEdit(i) { vendor: entry.filament_vendor || "", name: entry.filament_name || "", }; - _fillSlotProfileDropdown( - mat, - entry.filament_vendor || "", - entry.filament_name || "", - ); + _fillSlotProfileDropdown(mat, entry.filament_vendor || "", entry.filament_name || ""); }) .catch(function () { _fillSlotProfileDropdown(mat, "", ""); @@ -2657,9 +2459,7 @@ function hexToRgb(hex) { } function saveSlotEdit() { var hex = document.getElementById("slot-edit-color").value; - var mat = - document.getElementById("slot-edit-mat").value.trim().toUpperCase() || - "PLA"; + var mat = document.getElementById("slot-edit-mat").value.trim().toUpperCase() || "PLA"; var color = hexToRgb(hex); var slotIdx = _slotEditIndex; var profSel = document.getElementById("slot-edit-profile"); @@ -2724,19 +2524,10 @@ function saveSlotEdit() { } }); closeSlotEdit(); - var profSuffix = newProfName - ? " [" + newProfVendor + " " + newProfName + "]" - : ""; + var profSuffix = newProfName ? " [" + newProfVendor + " " + newProfName + "]" : ""; clog( - tr("slot_edit_ok") + - " " + - (slotIdx + 1) + - ": " + - mat + - " " + - hex + - profSuffix, - "msg-ok", + tr("slot_edit_ok") + " " + (slotIdx + 1) + ": " + mat + " " + hex + profSuffix, + "msg-ok" ); // Sofortiges Re-Render mit aktuellem _slotProfileMap (poll() ist async // und re-rendert beim nächsten Tick — wir wollen aber dass die Vendor- @@ -2749,17 +2540,15 @@ function saveSlotEdit() { }); } document.addEventListener("DOMContentLoaded", function () { - document - .getElementById("s-printer-ip") - .addEventListener("input", function () { - var hint = document.getElementById("lbl-ip-hint"); - if (this.value.includes(":")) { - hint.textContent = T.hint_ip_no_port; - hint.style.display = "block"; - } else { - hint.style.display = "none"; - } - }); + document.getElementById("s-printer-ip").addEventListener("input", function () { + var hint = document.getElementById("lbl-ip-hint"); + if (this.value.includes(":")) { + hint.textContent = T.hint_ip_no_port; + hint.style.display = "block"; + } else { + hint.style.display = "none"; + } + }); }); function setPoll(ms) { localStorage.setItem("pollInterval", ms); @@ -2770,10 +2559,7 @@ function saveSettings() { var btn = document.getElementById("btn-save-settings"); btn.disabled = true; btn.textContent = "…"; - var webUploadWarning = (document.getElementById("s-web-upload-warning") || {}) - .checked - ? 1 - : 0; + var webUploadWarning = (document.getElementById("s-web-upload-warning") || {}).checked ? 1 : 0; S.web_upload_warning = webUploadWarning; // Start-Print-Behavior-Wechsel könnte den Auto-Open sonst dauerhaft blockieren // (alter _fdUserCancelled bei gleicher file_ready) → Dialog-State zurücksetzen (Issue #57). @@ -2792,48 +2578,25 @@ function saveSettings() { mode_id: document.getElementById("s-mode-id").value, default_ams_slot: document.getElementById("s-default-slot").value, auto_leveling: document.getElementById("s-auto-leveling").checked ? 1 : 0, - camera_on_print: (document.getElementById("s-camera-on-print") || {}) - .checked - ? 1 - : 0, + camera_on_print: (document.getElementById("s-camera-on-print") || {}).checked ? 1 : 0, print_start_dialog: parseInt( (document.getElementById("s-file-ready-mode") || {}).value || "1", - 10, + 10 ), web_upload_warning: webUploadWarning, poll_interval: Math.min( 60, - Math.max( - 1, - parseInt( - (document.getElementById("s-poll-interval") || {}).value, - 10, - ) || 3, - ), + Math.max(1, parseInt((document.getElementById("s-poll-interval") || {}).value, 10) || 3) ), notifications: notifCollect(), notify_every_minutes: - parseInt( - (document.getElementById("s-notif-every-min") || {}).value || "0", - 10, - ) || 0, + parseInt((document.getElementById("s-notif-every-min") || {}).value || "0", 10) || 0, notify_every_layers: - parseInt( - (document.getElementById("s-notif-every-layers") || {}).value || "0", - 10, - ) || 0, - spoolman_server: ( - (document.getElementById("s-spoolman-url") || {}).value || "" - ).trim(), + parseInt((document.getElementById("s-notif-every-layers") || {}).value || "0", 10) || 0, + spoolman_server: ((document.getElementById("s-spoolman-url") || {}).value || "").trim(), spoolman_sync_rate: Math.min( 3600, - Math.max( - 0, - parseInt( - (document.getElementById("s-spoolman-sync-rate") || {}).value, - 10, - ) || 0, - ), + Math.max(0, parseInt((document.getElementById("s-spoolman-sync-rate") || {}).value, 10) || 0) ), }) .then(function () { @@ -2848,10 +2611,7 @@ function saveSettings() { .catch(function (e) { btn.disabled = false; setText("btn-save-settings", T.settings_save); - clog( - T.settings_title + " " + tr("log_error", "Fehler:") + " " + e, - "msg-err", - ); + clog(T.settings_title + " " + tr("log_error", "Fehler:") + " " + e, "msg-err"); }); } function checkUpdate() { @@ -2881,8 +2641,7 @@ function checkUpdate() { sb.style.color = "var(--ok)"; _updateTag = d.tag; _updateUrl = d.download_url; - document.getElementById("btn-update-apply").style.display = - "inline-block"; + document.getElementById("btn-update-apply").style.display = "inline-block"; } else { sb.textContent = T.update_none; sb.style.color = "var(--txt2)"; @@ -2986,8 +2745,7 @@ function updatePauseResumeBtn() { } } function confirmCancel() { - if (confirm(T.confirm_cancel || "Druck wirklich abbrechen?")) - printAction("cancel"); + if (confirm(T.confirm_cancel || "Druck wirklich abbrechen?")) printAction("cancel"); } // ── Axis motion ── @@ -2998,9 +2756,7 @@ function getStep() { } function setStep(btn, v) { currentStep = v; - document - .querySelectorAll(".step-btn") - .forEach((b) => b.classList.remove("active")); + document.querySelectorAll(".step-btn").forEach((b) => b.classList.remove("active")); btn.classList.add("active"); document.getElementById("step-display").textContent = v; } @@ -3017,14 +2773,11 @@ function move(axis, dir, dist) { (dir > 0 ? "+" : "") + dir * dist + "mm", - "msg-ok", + "msg-ok" ); }) .catch(function (e) { - clog( - tr("log_axis", "Achse") + "-" + tr("log_error", "Fehler:") + " " + e, - "msg-err", - ); + clog(tr("log_axis", "Achse") + "-" + tr("log_error", "Fehler:") + " " + e, "msg-err"); }); } function homeAll() { @@ -3033,14 +2786,7 @@ function homeAll() { clog(tr("log_home_all", "Home All"), "msg-ok"); }) .catch(function (e) { - clog( - tr("log_home_all", "Home All") + - " " + - tr("log_error", "Fehler:") + - " " + - e, - "msg-err", - ); + clog(tr("log_home_all", "Home All") + " " + tr("log_error", "Fehler:") + " " + e, "msg-err"); }); } function homeXY() { @@ -3049,14 +2795,7 @@ function homeXY() { clog(tr("btn_home_xy", "Home XY"), "msg-ok"); }) .catch(function (e) { - clog( - tr("btn_home_xy", "Home XY") + - " " + - tr("log_error", "Fehler:") + - " " + - e, - "msg-err", - ); + clog(tr("btn_home_xy", "Home XY") + " " + tr("log_error", "Fehler:") + " " + e, "msg-err"); }); } function homeZ() { @@ -3065,10 +2804,7 @@ function homeZ() { clog(tr("btn_home_z", "Home Z"), "msg-ok"); }) .catch(function (e) { - clog( - tr("btn_home_z", "Home Z") + " " + tr("log_error", "Fehler:") + " " + e, - "msg-err", - ); + clog(tr("btn_home_z", "Home Z") + " " + tr("log_error", "Fehler:") + " " + e, "msg-err"); }); } function disableMotors() { @@ -3078,12 +2814,8 @@ function disableMotors() { }) .catch(function (e) { clog( - tr("btn_disable_motors", "Motors Off") + - " " + - tr("log_error", "Fehler:") + - " " + - e, - "msg-err", + tr("btn_disable_motors", "Motors Off") + " " + tr("log_error", "Fehler:") + " " + e, + "msg-err" ); }); } @@ -3096,10 +2828,7 @@ function setNozzle() { clog(tr("log_nozzle", "Nozzle → ") + v + "°C", "msg-ok"); }) .catch(function (e) { - clog( - tr("label_nozzle", "Düse") + " " + tr("log_error", "Fehler:") + " " + e, - "msg-err", - ); + clog(tr("label_nozzle", "Düse") + " " + tr("log_error", "Fehler:") + " " + e, "msg-err"); }); } function setBed() { @@ -3109,10 +2838,7 @@ function setBed() { clog(tr("log_bed", "Bett → ") + v + "°C", "msg-ok"); }) .catch(function (e) { - clog( - tr("label_bed", "Bett") + " " + tr("log_error", "Fehler:") + " " + e, - "msg-err", - ); + clog(tr("label_bed", "Bett") + " " + tr("log_error", "Fehler:") + " " + e, "msg-err"); }); } @@ -3138,12 +2864,8 @@ function setSpeed(mode) { }); post("/api/speed", { mode: mode }).catch(function (e) { clog( - tr("label_speed", "Geschwindigkeit") + - " " + - tr("log_error", "Fehler:") + - " " + - e, - "msg-err", + tr("label_speed", "Geschwindigkeit") + " " + tr("log_error", "Fehler:") + " " + e, + "msg-err" ); }); } @@ -3157,10 +2879,7 @@ function setFan() { clog(tr("log_fan", "Lüfter → ") + v + "%", "msg-ok"); }) .catch(function (e) { - clog( - tr("log_fan", "Lüfter → ") + tr("log_error", "Fehler:") + " " + e, - "msg-err", - ); + clog(tr("log_fan", "Lüfter → ") + tr("log_error", "Fehler:") + " " + e, "msg-err"); }); } function quickFan(v) { @@ -3171,10 +2890,7 @@ function quickFan(v) { clog(tr("log_fan", "Lüfter → ") + v + "%", "msg-ok"); }) .catch(function (e) { - clog( - tr("log_fan", "Lüfter → ") + tr("log_error", "Fehler:") + " " + e, - "msg-err", - ); + clog(tr("log_fan", "Lüfter → ") + tr("log_error", "Fehler:") + " " + e, "msg-err"); }); } @@ -3190,10 +2906,7 @@ function amsFeed(type, slotIndex) { } return post("/api/ams/feed", { slot_index: globalIdx, type: type }) .then(function () { - clog( - (type === 1 ? T.lbl_feed : T.lbl_unload) + " Slot " + (globalIdx + 1), - "msg-ok", - ); + clog((type === 1 ? T.lbl_feed : T.lbl_unload) + " Slot " + (globalIdx + 1), "msg-ok"); }) .catch(function (e) { clog("AMS " + tr("log_error", "Fehler:") + " " + e, "msg-err"); @@ -3212,8 +2925,7 @@ function camStart() { post("/api/camera/start", {}) .then(function () { camOn = true; - document.getElementById("cam-toggle-btn").textContent = - tr("btn_cam_stop"); + document.getElementById("cam-toggle-btn").textContent = tr("btn_cam_stop"); clog(tr("log_cam_start"), "msg-ok"); setTimeout(function () { sp.style.display = "none"; @@ -3230,12 +2942,8 @@ function camStart() { img.style.display = "none"; ph.style.display = "flex"; camOn = false; - document.getElementById("cam-toggle-btn").textContent = - tr("btn_cam_start"); - clog( - tr("log_error", "Fehler:") + " " + tr("cam_stream_unavailable"), - "msg-err", - ); + document.getElementById("cam-toggle-btn").textContent = tr("btn_cam_start"); + clog(tr("log_error", "Fehler:") + " " + tr("cam_stream_unavailable"), "msg-err"); }; img.src = "/api/camera/stream?t=" + Date.now(); } @@ -3296,7 +3004,7 @@ function aceDryStart(aceId) { "°C, " + d + " min)", - "msg-ok", + "msg-ok" ); poll(); }) @@ -3308,8 +3016,7 @@ function aceDryStart(aceId) { var _aceAutoFeedPending = {}; function aceAutoRefillToggle(aceId) { aceId = typeof aceId === "number" && aceId >= 0 ? aceId : 0; - var on = !!(document.getElementById("ace-auto-refill-toggle-" + aceId) || {}) - .checked; + var on = !!(document.getElementById("ace-auto-refill-toggle-" + aceId) || {}).checked; _aceAutoFeedPending[aceId] = true; fetch("/api/ace/auto_feed", { method: "POST", @@ -3328,13 +3035,8 @@ function aceAutoRefillToggle(aceId) { return; } clog( - "ACE " + - (aceId + 1) + - " - " + - tr("ace_dry_auto_refill") + - ": " + - (on ? "ON" : "OFF"), - "msg-ok", + "ACE " + (aceId + 1) + " - " + tr("ace_dry_auto_refill") + ": " + (on ? "ON" : "OFF"), + "msg-ok" ); }) .catch(function (e) { @@ -3351,10 +3053,7 @@ function openAceDryDialog(aceId) { _syncAceDryPresetsFromServer(S.ace_dry_presets); _aceDryDialogPresetOriginals = JSON.parse(JSON.stringify(ACE_DRY_PRESETS)); aceDryDialogSyncCustomButtonNames(); - var hasStored = Object.prototype.hasOwnProperty.call( - aceDryProfiles, - String(aceId), - ); + var hasStored = Object.prototype.hasOwnProperty.call(aceDryProfiles, String(aceId)); var prof = _aceDryProfileGet(aceId); if (hasStored && prof.preset && ACE_DRY_PRESETS[prof.preset]) { aceDryDialogPreset(prof.preset); @@ -3362,9 +3061,7 @@ function openAceDryDialog(aceId) { var sec = prof.duration_sec; document.getElementById("ace-dry-dialog-temp").value = prof.temp; document.getElementById("ace-dry-dialog-h").value = Math.floor(sec / 3600); - document.getElementById("ace-dry-dialog-m").value = Math.floor( - (sec % 3600) / 60, - ); + document.getElementById("ace-dry-dialog-m").value = Math.floor((sec % 3600) / 60); document.getElementById("ace-dry-dialog-s").value = sec % 60; aceDryDialogHighlightPreset(""); } else { @@ -3396,13 +3093,9 @@ function aceDryDialogIsCustomPreset(key) { function aceDryDialogSyncCustomButtonNames() { ["custom_1", "custom_2", "custom_3"].forEach(function (k) { - var b = document.querySelector( - '.ace-dry-preset-btn[data-preset="' + k + '"]', - ); + var b = document.querySelector('.ace-dry-preset-btn[data-preset="' + k + '"]'); if (b) - b.textContent = - (ACE_DRY_PRESETS[k] && ACE_DRY_PRESETS[k].name) || - "Custom " + k.slice(-1); + b.textContent = (ACE_DRY_PRESETS[k] && ACE_DRY_PRESETS[k].name) || "Custom " + k.slice(-1); }); } @@ -3416,16 +3109,11 @@ function aceDryDialogUpdateCustomNameUi() { } row.style.display = "flex"; input.value = - (ACE_DRY_PRESETS[_aceDryDialogPresetKey] && - ACE_DRY_PRESETS[_aceDryDialogPresetKey].name) || - ""; + (ACE_DRY_PRESETS[_aceDryDialogPresetKey] && ACE_DRY_PRESETS[_aceDryDialogPresetKey].name) || ""; } function aceDryDialogCurrentValues() { - var t = parseInt( - document.getElementById("ace-dry-dialog-temp").value || 45, - 10, - ); + var t = parseInt(document.getElementById("ace-dry-dialog-temp").value || 45, 10); var h = parseInt(document.getElementById("ace-dry-dialog-h").value || 0, 10); var m = parseInt(document.getElementById("ace-dry-dialog-m").value || 0, 10); var s = parseInt(document.getElementById("ace-dry-dialog-s").value || 0, 10); @@ -3448,8 +3136,7 @@ function aceDryDialogUpdateSaveButton() { } var p = _aceDryDialogPresetOriginals[key] || ACE_DRY_PRESETS[key]; var cur = aceDryDialogCurrentValues(); - var changed = - cur.temp !== Number(p.temp) || cur.duration_sec !== Number(p.duration_sec); + var changed = cur.temp !== Number(p.temp) || cur.duration_sec !== Number(p.duration_sec); if (aceDryDialogIsCustomPreset(key)) { var nameInp = document.getElementById("ace-dry-dialog-custom-name"); var n = ((nameInp && nameInp.value) || "").trim(); @@ -3469,23 +3156,21 @@ function aceDryDialogUpdateResetButton() { return; } var cur = aceDryDialogCurrentValues(); - var changed = - cur.temp !== Number(d.temp) || cur.duration_sec !== Number(d.duration_sec); + var changed = cur.temp !== Number(d.temp) || cur.duration_sec !== Number(d.duration_sec); btn.style.display = changed ? "" : "none"; } function aceDryDialogInputsChanged() { if (aceDryDialogIsCustomPreset(_aceDryDialogPresetKey)) { var b = document.querySelector( - '.ace-dry-preset-btn[data-preset="' + _aceDryDialogPresetKey + '"]', + '.ace-dry-preset-btn[data-preset="' + _aceDryDialogPresetKey + '"]' ); var i = document.getElementById("ace-dry-dialog-custom-name"); if (b && i) { var t = (i.value || "").trim(); b.textContent = t || - (ACE_DRY_PRESETS[_aceDryDialogPresetKey] && - ACE_DRY_PRESETS[_aceDryDialogPresetKey].name) || + (ACE_DRY_PRESETS[_aceDryDialogPresetKey] && ACE_DRY_PRESETS[_aceDryDialogPresetKey].name) || "Custom " + _aceDryDialogPresetKey.slice(-1); } } @@ -3510,9 +3195,7 @@ function aceDryDialogPreset(presetKey) { var sec = p.duration_sec; document.getElementById("ace-dry-dialog-temp").value = p.temp; document.getElementById("ace-dry-dialog-h").value = Math.floor(sec / 3600); - document.getElementById("ace-dry-dialog-m").value = Math.floor( - (sec % 3600) / 60, - ); + document.getElementById("ace-dry-dialog-m").value = Math.floor((sec % 3600) / 60); document.getElementById("ace-dry-dialog-s").value = sec % 60; aceDryDialogHighlightPreset(presetKey); aceDryDialogSyncCustomButtonNames(); @@ -3527,9 +3210,7 @@ function resetAceDryPresetToDefault() { var sec = Number(d.duration_sec) || 0; document.getElementById("ace-dry-dialog-temp").value = Number(d.temp) || 45; document.getElementById("ace-dry-dialog-h").value = Math.floor(sec / 3600); - document.getElementById("ace-dry-dialog-m").value = Math.floor( - (sec % 3600) / 60, - ); + document.getElementById("ace-dry-dialog-m").value = Math.floor((sec % 3600) / 60); document.getElementById("ace-dry-dialog-s").value = sec % 60; aceDryDialogInputsChanged(); } @@ -3610,10 +3291,7 @@ function saveAceDryPresetAndRestart() { function confirmAceDryDialog() { if (_aceDryDialogAceId < 0) return; - var t = parseInt( - document.getElementById("ace-dry-dialog-temp").value || 45, - 10, - ); + var t = parseInt(document.getElementById("ace-dry-dialog-temp").value || 45, 10); var h = parseInt(document.getElementById("ace-dry-dialog-h").value || 0, 10); var m = parseInt(document.getElementById("ace-dry-dialog-m").value || 0, 10); var s = parseInt(document.getElementById("ace-dry-dialog-s").value || 0, 10); @@ -3650,13 +3328,8 @@ function aceDryStop(aceId) { throw new Error(r.error); } clog( - "ACE " + - (aceId + 1) + - " - " + - tr("ace_dry_dryer") + - ": " + - tr("ace_dry_stop"), - "msg-ok", + "ACE " + (aceId + 1) + " - " + tr("ace_dry_dryer") + ": " + tr("ace_dry_stop"), + "msg-ok" ); poll(); }) @@ -3689,8 +3362,7 @@ function uploadGcode(file) { var _fn = (file.name || "").toLowerCase(); if (!/\.(gcode|gcode\.3mf|3mf|bgcode)$/.test(_fn)) { if (status) { - status.textContent = - T.store_upload_only_gcode || "Only GCode files allowed"; + status.textContent = T.store_upload_only_gcode || "Only GCode files allowed"; status.style.display = ""; status.className = "upload-status-err"; } @@ -3717,10 +3389,7 @@ function uploadGcode(file) { }) .then(function () { if (status) { - status.textContent = T.store_upload_success.replace( - "{file}", - file.name, - ); + status.textContent = T.store_upload_success.replace("{file}", file.name); status.className = "upload-status-ok"; } loadStore(); @@ -3749,20 +3418,15 @@ function renderStore() { var empty = document.getElementById("store-empty"); // Suche - var q = (document.getElementById("store-search") || { value: "" }).value - .toLowerCase() - .trim(); + var q = (document.getElementById("store-search") || { value: "" }).value.toLowerCase().trim(); // Filter - var filter = (document.getElementById("store-filter") || { value: "all" }) - .value; + var filter = (document.getElementById("store-filter") || { value: "all" }).value; // Sortierung - var sort = (document.getElementById("store-sort") || { value: "date_desc" }) - .value; + var sort = (document.getElementById("store-sort") || { value: "date_desc" }).value; var files = storeFiles.filter(function (f) { if (q && f.filename.toLowerCase().indexOf(q) === -1) return false; - if (filter === "completed" && f.last_print_status !== "completed") - return false; + if (filter === "completed" && f.last_print_status !== "completed") return false; if ( filter === "failed" && f.last_print_status !== "cancelled" && @@ -3804,11 +3468,8 @@ function renderStore() { f.thumbnail_b64 + '" style="width:100%;height:130px;object-fit:cover;border-radius:6px;display:block;margin-bottom:8px">' : '
🖨
'; - var name = - f.filename.length > 28 ? f.filename.slice(0, 25) + "…" : f.filename; - var date = f.uploaded_at - ? f.uploaded_at.replace("T", " ").slice(0, 16) - : ""; + var name = f.filename.length > 28 ? f.filename.slice(0, 25) + "…" : f.filename; + var date = f.uploaded_at ? f.uploaded_at.replace("T", " ").slice(0, 16) : ""; var est = f.est_print_time_sec ? formatDur(f.est_print_time_sec) : "–"; var statusBadge = ""; var lastInfo = ""; @@ -3820,10 +3481,7 @@ function renderStore() { '
✓ ' + formatDur(f.last_print_duration) + "
"; - } else if ( - f.last_print_status === "cancelled" || - f.last_print_status === "failed" - ) { + } else if (f.last_print_status === "cancelled" || f.last_print_status === "failed") { statusBadge = ''; lastInfo = @@ -3904,11 +3562,7 @@ function _setGcodeFilamentsFromFileObj(fileObj) { try { if (fileObj && Array.isArray(fileObj.gcode_filaments)) { _gcodeFilaments = fileObj.gcode_filaments; - } else if ( - fileObj && - typeof fileObj.gcode_filaments === "string" && - fileObj.gcode_filaments - ) { + } else if (fileObj && typeof fileObj.gcode_filaments === "string" && fileObj.gcode_filaments) { _gcodeFilaments = JSON.parse(fileObj.gcode_filaments); } else { _gcodeFilaments = []; @@ -3993,11 +3647,7 @@ function maybeGateWebUpload(fileObj, onContinue, opts) { return; } var cancelledId = sessionStorage.getItem("webVerifyCancelledFileId") || ""; - if ( - opts.autoOpen && - cancelledId && - cancelledId === String(fileObj.id || "") - ) { + if (opts.autoOpen && cancelledId && cancelledId === String(fileObj.id || "")) { return; } openWebVerifyDialog( @@ -4006,7 +3656,7 @@ function maybeGateWebUpload(fileObj, onContinue, opts) { function () { clearWebUploadWarningFlag(fileObj.id, onContinue); }, - !!opts.autoOpen, + !!opts.autoOpen ); } @@ -4035,10 +3685,7 @@ function closeStoreWebVerifyDialog() { modal.classList.remove("open"); } if (_pendingWebVerifyAutoOpen && _pendingWebVerifyFileId) { - sessionStorage.setItem( - "webVerifyCancelledFileId", - String(_pendingWebVerifyFileId), - ); + sessionStorage.setItem("webVerifyCancelledFileId", String(_pendingWebVerifyFileId)); } _pendingWebVerifyFileId = null; _pendingWebVerifyFilename = ""; @@ -4103,7 +3750,7 @@ function startReadyFileWithSlots(filename, _autoOpen) { function () { startReadyFileWithSlots(fn, _autoOpen); }, - { autoOpen: !!_autoOpen }, + { autoOpen: !!_autoOpen } ); return; } @@ -4147,7 +3794,7 @@ function startReadyFileWithSlots(filename, _autoOpen) { function () { startReadyFileWithSlots(fn, _autoOpen); }, - { autoOpen: !!_autoOpen }, + { autoOpen: !!_autoOpen } ); return; } @@ -4226,10 +3873,7 @@ function _materialsCompatible(a, b) { function _slotProfileLabel(slot) { if (!slot) return ""; if (slot.filament_name) { - return ( - slot.filament_name + - (slot.filament_vendor ? " — " + slot.filament_vendor : "") - ); + return slot.filament_name + (slot.filament_vendor ? " — " + slot.filament_vendor : ""); } return slot.material || ""; } @@ -4245,9 +3889,7 @@ function _updateSlotMarker(sel) { var color = opt && opt.dataset.color ? opt.dataset.color : "#888"; var slotIdx = parseInt(opt.value); var paintIdx = sel.dataset.paint; - var marker = document.querySelector( - '.fd-slot-marker[data-for-paint="' + paintIdx + '"]', - ); + var marker = document.querySelector('.fd-slot-marker[data-for-paint="' + paintIdx + '"]'); if (marker) { marker.style.background = color; marker.style.color = _contrastText(color); @@ -4256,19 +3898,22 @@ function _updateSlotMarker(sel) { } } -function openFilamentDialog(slots){ - _amsSlots=slots - .filter(function(s){return s.status==='loaded';}) - .sort(function(a,b){return (a.slot_index||0)-(b.slot_index||0);}); +function openFilamentDialog(slots) { + _amsSlots = slots + .filter(function (s) { + return s.status === "loaded"; + }) + .sort(function (a, b) { + return (a.slot_index || 0) - (b.slot_index || 0); + }); _loadSpoolmanStatus(); - var dlg=document.getElementById('filament-dialog'); - var title=document.getElementById('fd-title'); - var body=document.getElementById('fd-slots'); - if(title)title.textContent='▶ '+_storeFilename; + var dlg = document.getElementById("filament-dialog"); + var title = document.getElementById("fd-title"); + var body = document.getElementById("fd-slots"); + if (title) title.textContent = "▶ " + _storeFilename; // Auto-Leveling-Checkbox mit globalem Default vorbelegen var fdAl = document.getElementById("fd-auto-leveling"); - if (fdAl) - fdAl.checked = S.auto_leveling === undefined ? true : !!S.auto_leveling; + if (fdAl) fdAl.checked = S.auto_leveling === undefined ? true : !!S.auto_leveling; // Objekt-Liste laden — sobald eine File-ID auflösbar ist (Issue #57 Punkt 3: // Skip-Parität auch im Banner-/Upload-Modus, nicht nur im Store-Modus). // startReadyFileWithSlots() setzt _storeFileId auch im Banner-Modus per @@ -4329,11 +3974,7 @@ function openFilamentDialog(slots){ var c = (hex || "").replace("#", ""); if (c.length === 3) c = c[0] + c[0] + c[1] + c[1] + c[2] + c[2]; if (c.length < 6) return [255, 255, 255]; - return [ - parseInt(c.slice(0, 2), 16), - parseInt(c.slice(2, 4), 16), - parseInt(c.slice(4, 6), 16), - ]; + return [parseInt(c.slice(0, 2), 16), parseInt(c.slice(2, 4), 16), parseInt(c.slice(4, 6), 16)]; } function _colorDist(a, b) { var ar = _hexToRgb(a), @@ -4386,7 +4027,7 @@ function openFilamentDialog(slots){ return _materialsCompatible(gc.material, s.material); }); - var defaultSlotIndex = defaultSlotByPaint.hasOwnProperty(i) + var defaultSlotIndex = Object.prototype.hasOwnProperty.call(defaultSlotByPaint, i) ? defaultSlotByPaint[i] : -1; var defaultSlot = @@ -4395,10 +4036,7 @@ function openFilamentDialog(slots){ }) || null; var opts = compatible .map(function (s) { - var sel = - defaultSlot && s.slot_index === defaultSlot.slot_index - ? "selected" - : ""; + var sel = defaultSlot && s.slot_index === defaultSlot.slot_index ? "selected" : ""; return ( '
- - - -KX-Bridge - - - - - - -
- -
-
- -