Skip to content

feat(settings): globales Settings-Autosave (kein Speichern-Button) - #179

Merged
CallMeTechie merged 14 commits into
masterfrom
feature/settings-autosave
Jun 25, 2026
Merged

CallMeTechie merged 14 commits into
masterfrom
feature/settings-autosave

Conversation

@CallMeTechie

Copy link
Copy Markdown
Owner

Globales Settings-Autosave

Alle Wert-Felder in den Einstellungen speichern jetzt automatisch (kein Speichern-Button) mit einem ~0,5-s-Unschärfe-Indikator je Sektion. Aktions-Buttons bleiben Buttons. Community-Tier, funktioniert in allen drei Themes (aurora/default/pro).

Architektur

  • public/js/settingsAutosaveCore.js — reine, node-testbare UMD-Logik: Cluster-Klassifizierung (independent/atomic/fullPayload), Dirty-Check, Secret-Omit, Confirm-Entscheidung, Atomic-Readiness mit Laufzeit-Override, geteilte createQueue()-Serialisierung, plus missingValueKeys()-Invarianten-Guard.
  • public/js/settingsAutosave.js — DOM-Controller: bind({cluster, fields, save, statusEl, valuesById, requiredForCommit?}) + enqueue(cluster, fn). Bindet change (diskret) bzw. blur+Enter (Text, per-Element 400 ms debounced), Dirty-Check gegen einen beim save() eingefrorenen Snapshot, serialisiert pro Cluster, Erfolg = .field-saving-Blur am dedizierten Badge.
  • public/js/settings.js — alle Settings-Sektionen Cluster für Cluster migriert; Save-Buttons entfernt, dedizierte .autosave-status-Badges ergänzt.
  • Backend unverändert bis auf zwei Secret-Clear-Pfade (ip2location clear-Flag; SMTP clear_password) + ein ip2location-Audit-No-op-Guard. Nur parametrisiertes SQL.

Wichtige Korrektheits-Punkte

  • Zwei Blocker umgesetzt: Security = EIN bind() über alle 8 Lockout+Passwort-Felder; Toggles dispatchen ein change-Event.
  • Secrets werden nie mit leerem Wert überschrieben (omit-if-empty + stripEmptySecrets); explizite „entfernen"-Buttons mit Bestätigung.
  • Atomare Cluster (SMTP/Alerts/Route-Block@redirect) committen erst bei nicht-leeren Pflichtfeldern (Laufzeit-Override), sonst Pending-Indikator; echte Validierung bleibt serverseitig.
  • Voll-Payload (pihole/split-tunnel): Feld-Autosave + Listen-Buttons teilen EINE Core-Queue und bauen aus EINER In-Memory-Quelle — kein Lost-Update.
  • Dirty-Check deckt ALLE gebundenen Felder ab (Review-Fund: valuesById enthielt zuvor nur die Pflicht-Teilmenge bei SMTP/Alerts/Route-Block).
  • Selbst-aussperrend: mb-mode immer Confirm; Lockout nur bei max_attempts ≤ 2; Confirm-Abbruch rollt nur das Trigger-Feld zurück.

Tests

  • settings_autosave_core (reine Logik inkl. Queue + Guard), settings_autosave_smoke (Markup/Serving + Race), settings_secret_handling (Secret-Schutz + Clear), settings_autosave_templates (3-Themes, Skript-Reihenfolge, keine Save-Buttons mehr). Alle grün (68/68 in der Settings-Suite).
  • Bewusster Coverage-Blindfleck (kein jsdom): DOM-Verhalten (Debounce/Snapshot/Confirm/Pending) wird manuell verifiziert; die reine Logik + Queue sind unit-getestet.
  • aurora_theme-Asserts auf die entfernten Buttons angepasst; globale pihole-Lizenz-Lockerung im Test-Helper zurückgenommen (lokaler Override im Smoke-Test).

Bewusst verschoben (Minors)

default-theme-Flash-Timing (Reload überholt 0,5-s-Badge), verwaiste #*-message-Container, Feedback an den Secret-Clear-Buttons, fire-and-forget bei split-tunnel-enqueue.

Hinweise

🤖 Generated with Claude Code

https://claude.ai/code/session_01Jrun6RoK7g75W5L8ZEpBzh

…-op guard

Add settings_autosave_templates.test.js: verifies all three themes (aurora/default/pro)
have autosave scripts before settings.js and no migrated save buttons remain (btn-ip2location-save
excluded — intentionally kept as action button). Add no-op guard in observability.js PUT
/ip2location: reads old key before write; only logs and writes when value actually changed;
empty-without-clear returns ok immediately (no write, no log). 66/66 settings tests pass.
…rts/route-block) + i18n + guard

- smtpValues() now returns all 6 bound fields (smtp-host/port/user/from/tls/password)
  instead of only 2; post-save password-clear removed to avoid snapshot/value mismatch
- Alerts valuesById expanded to include backup-days, cpu, ram, and 4 event-group
  checkboxes (added ids alerts-events-{security,peers,routes,system} to all 3 templates)
- rbValues() adds settings-route-block-body so body changes trigger autosave
- missingValueKeys() helper added to Core + exported; bind() logs console.warn on
  mismatch (non-fatal dev guard that would have caught Critical #1)
- 'Password is set' hint replaced with i18n key settings.smtp.password_set (en+de)
- Dead saveSecuritySettings() function removed (zero callers)
- Unit test for missingValueKeys + smoke assertions for expanded valuesById keys
…k, local pihole override in smoke, update stale aurora button assertions
…ttings-autosave

# Conflicts:
#	src/i18n/de.json
#	src/i18n/en.json
@CallMeTechie
CallMeTechie merged commit d246747 into master Jun 25, 2026
8 checks passed
@CallMeTechie
CallMeTechie deleted the feature/settings-autosave branch June 25, 2026 06:59
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant