Auth-herding: roller, kontoadmin, token-revokering + søkbar planliste + neon

Auth (app-modus):
- Roller admin/standard. Admin oppretter/sletter kontoer, resetter passord,
  endrer roller (konto-modal). Eksisterende brukere → admin ved migrering;
  bootstrap-bruker via proxy-bypass → admin. Siste admin vernet.
- Tilbakekalling via per-bruker epoke i tokenet: passordbytte, admin-reset,
  «Logg ut alle enheter» og sletting dreper alle aktive sesjoner. Token-format
  endret (3- → 4-delt) — alle logges ut én gang ved oppgradering.

Dagsplan: søkbar/velgbar planliste («📋 Planer») avledet fra planIndex —
finn plan på navn/dato/person uten å gjette dato.

GUI: login-neon trukket inn i hovedappen (header/knapper/KPI-kanter), og
login-siden fikk mer tech (HUD-hjørner, glitch-tittel, scanlines).

40 integrasjonstester (6 nye), alle grønne. README + CLAUDE.md oppdatert.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Jon Vanvik 2026-06-15 14:56:39 +02:00
parent f6268440d9
commit 3f69cd4248
9 changed files with 518 additions and 36 deletions

View file

@ -146,6 +146,13 @@
<div class="plan-col plan-today">
<div class="plan-today-head">
<div class="plan-date-row">
<div class="plan-picker">
<button id="plan-picker-btn" type="button" title="Bla i / søk planer">📋 Planer ▾</button>
<div class="plan-picker-panel" id="plan-picker-panel">
<input type="text" id="plan-picker-search" placeholder="Søk navn, dato, person …" autocomplete="off">
<div class="plan-picker-list" id="plan-picker-list"></div>
</div>
</div>
<span class="plan-cal">📅</span>
<input type="date" id="plan-date" title="Velg dag å planlegge">
<input type="text" id="plan-name" class="plan-name-input" maxlength="80" autocomplete="off"
@ -327,9 +334,9 @@
</div>
<div class="modal-overlay" id="account-modal">
<div class="modal" style="max-width:440px">
<div class="modal" style="max-width:520px">
<div class="modal-head">
<h2>Konto</h2>
<h2>Konto <span id="account-role-badge" class="role-badge" style="display:none"></span></h2>
<button class="icon-btn" id="account-close" style="font-size:18px">×</button>
</div>
<div class="modal-warning" id="account-status"></div>
@ -346,12 +353,29 @@
<label>Bekreft passord</label>
<input type="password" id="account-newpw2" autocomplete="new-password">
</div>
<div class="form-field full" style="flex-direction:row;gap:8px;align-items:center;margin-top:2px">
<button class="primary" id="account-save">Lagre passord</button>
<button id="account-logout">Logg ut</button>
<button class="danger" id="account-logout-all" title="Tilbakekall alle aktive økter">Logg ut alle enheter</button>
</div>
<div id="account-admin" style="display:none">
<div class="admin-divider">Administrer kontoer</div>
<div class="admin-create">
<input type="text" id="admin-new-user" placeholder="brukernavn" autocomplete="off">
<input type="password" id="admin-new-pass" placeholder="passord (min 6)" autocomplete="new-password">
<select id="admin-new-role">
<option value="standard">Standard</option>
<option value="admin">Admin</option>
</select>
<button class="primary" id="admin-create-btn">Opprett</button>
</div>
<div id="admin-userlist" class="admin-userlist"></div>
</div>
</div>
<div class="modal-foot">
<button class="danger" id="account-logout">Logg ut</button>
<div style="flex:1"></div>
<button id="account-cancel">Avbryt</button>
<button class="primary" id="account-save">Lagre passord</button>
<button id="account-cancel">Lukk</button>
</div>
</div>
</div>