Legg til dagsplan + kommentar ved statusbytte

Dagsplan: tredje visning ved siden av tavle/tabell. To-kolonne planlegger
der man plukker oppgaver fra backlog og bygger en ordnet plan for dagen
(drag-sortering, kapasitet i timer, datovelger). Per bruker, per dato,
lagret i plans.json; synkes mellom egne faner via plan-WS-melding.

Kommentar ved statusbytte: når en oppgave markeres ferdig/blokkert (knapp,
kanban-drag eller modal) tilbys en valgfri kommentar som festes til oppgaven
(kind:status) og legges i aktivitetsloggen — atomisk i ett update-kall.

20 integrasjonstester (8 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 13:18:33 +02:00
parent 6b9dbf8254
commit be166034de
8 changed files with 686 additions and 32 deletions

View file

@ -16,6 +16,10 @@ Nytt mot PHP-versjonen:
- **WebSocket-sanntidssynk** (erstatter 60s-polling) + presence + "redigerer nå"
- **Kanban-tavle** med drag & drop, i tillegg til tabellvisning
- **Dagsplan** (tredje visning) — per bruker, per dato; ordnet liste man bygger
ved å plukke fra backlog. Drag-sortering, kapasitet i timer, synk mellom egne faner.
- **Kommentar ved statusbytte** — valgfri `comment``PUT /api/tasks/:id`
festes som kommentar med `kind:'status'` og legges i aktivitets-detaljen.
- **Kommentarer** per oppgave
- **Aktivitetslogg** (hvem gjorde hva, server-side, capped til 400 entries)
- **Optimistisk låsing**`v`-felt per oppgave, 409 ved konflikt
@ -34,8 +38,10 @@ netops-todo-node/
│ ├── app.js All frontend-logikk (vanilla JS, ingen rammeverk).
│ └── style.css Mørkt tema, samme visuelle identitet som PHP-versjonen.
├── seed.json 16 eksempel-oppgaver.
├── setup-debian13.sh Engangs-oppsett på Debian 13 LXC (apt + npm ci + systemd).
├── test/api.test.js Integrasjonstester (node:test) — REST + WS ende-til-ende.
├── data/ Opprettes ved kjøring: tasks.json, activity.json, users.json.
├── data/ Opprettes ved kjøring: tasks.json, activity.json,
│ users.json, plans.json.
└── README.md Installasjon, proxy-oppsett, API-referanse.
```
@ -58,6 +64,7 @@ netops-todo-node/
| `task` | `op: create/update/delete`, `task`/`id`, `by`, `activity` | Etter hver mutasjon |
| `presence` | `online[]` | Når noen kobler til/fra |
| `editing` | `editing{}` = `{taskId: [brukere]}` | Når noen åpner/lukker modal |
| `plan` | `date`, `items[]` | Etter `PUT /api/plan` — sendes KUN til samme brukers faner (`sendToUser`) |
Klient → server: kun `{ type: 'editing', id, active }`.
@ -68,16 +75,33 @@ Som PHP-versjonen, pluss:
```json
{
"v": 3,
"comments": [{ "id": "c_…", "by": "jon", "at": "ISO", "text": "≤1000" }]
"comments": [{ "id": "c_…", "by": "jon", "at": "ISO", "text": "≤1000",
"kind": "status", "status": "done" }]
}
```
`v` bumpes ved hver felt-oppdatering (ikke ved kommentarer — bevisst, så en
kommentar ikke gir falsk konflikt for noen som redigerer felter samtidig).
`v` bumpes ved hver felt-oppdatering (også når en `comment` følger med et
statusbytte via `update()`, siden det ER en oppdatering — men IKKE via det
separate `POST .../comments`-endepunktet, så en ren kommentar ikke gir falsk
konflikt for noen som redigerer felter samtidig). `kind`/`status` settes kun på
kommentarer som kommer fra et statusbytte; vanlige kommentarer mangler dem.
Klienten sender `v` den redigerte fra; mismatch → 409 med serverens task i
svaret. Frontend håndterer det i `handleSaveError()`: oppdaterer visningen,
viser varsel, og lar brukeren lagre på nytt (som da overskriver bevisst).
### Dagsplan-skjema (`plans.json`)
```json
{ "jon": { "2026-06-15": ["t_abc", "t_def"] } }
```
Per bruker, per dato, ordnet liste av task-ids. `getPlan()` filtrerer bort
slettede oppgaver ved lesing; `setPlan()` deduperer og validerer mot
eksisterende oppgaver; `_scrubFromPlans()` rydder ved sletting; `_prunePlans()`
dropper datoer eldre enn 30 dager ved oppstart. Planen er bevisst privat (kun
`owner`-attribusjon på selve oppgavene er delt), men synkes mellom samme
brukers faner via `plan`-WS-meldingen.
## Designvalg verdt å vite
- **Ingen database, ingen frontend-rammeverk, to npm-avhengigheter**
@ -87,6 +111,14 @@ viser varsel, og lar brukeren lagre på nytt (som da overskriver bevisst).
UI-et fungerer selv om WS er nede (da poller frontend hvert 30s).
- **Delvis update er lov:** `PUT /api/tasks/:id` med bare `{v, status}`
normalisering merger mot eksisterende. Quick-actions bruker dette.
- **Statuskommentar går gjennom samme update-kall** (transient `comment`-felt),
ikke et eget endepunkt — så statusbytte + kommentar + aktivitetslinje blir
atomisk og ett enkelt WS-broadcast. `changeStatusWithComment()` i app.js viser
dialogen for ferdig/blokkert; tavle-drag og tabell-✓ ruter gjennom den.
- **Dagsplanen er optimistisk i frontend:** `addToPlan`/`removeFromPlan`/drag
muterer `state.plan.items` og kaller `savePlan()` (PUT) som reconciler mot
serverens validerte svar. Container-nivå drag-lyttere bindes én gang
(`bindPlanContainer`); per-element bindes ved hver render (`bindPlanDnD`).
- **Kommentar-sletting er begrenset til egen bruker** (eneste
autorisasjonsregel i appen — alt annet er åpent for alle innloggede).
- Chart.js fra CDN; frontend degraderer pent (skjuler grafer) uten nett.
@ -117,11 +149,15 @@ strenglengde-klamping, brukernavn-regex `[A-Za-z0-9._@-]{1,64}`), pluss:
## Testing-status
- `npm test`: 12 integrasjonstester (node:test), booter ekte server på
- `npm test`: 20 integrasjonstester (node:test), booter ekte server på
tilfeldig port med temp-datakatalog. Dekker normalisering, versjonskonflikt,
kommentar-autorisasjon, aktivitetslogg, WS-broadcast, persistens på disk,
cookie-auth. Alle grønne per 2026-06-12 (Node 25).
- Manuell røyk-test utført: `/healthz`, statiske filer, seed, state, og
WS-push av REST-endring verifisert ende-til-ende.
kommentar-autorisasjon, statuskommentar-på-update, dagsplan (CRUD, per-bruker,
validering, scrub ved sletting, dato-fallback), aktivitetslogg, WS-broadcast +
per-bruker plan-push, persistens på disk, cookie-auth. Alle grønne per
2026-06-15 (Node 25).
- Manuell røyk-test utført: `/healthz`, statiske filer, seed, state, plan
set/get med rekkefølge, ferdig-med-kommentar, og per-bruker-isolasjon av plan
verifisert ende-til-ende over HTTP.
- Ikke testet i nettleser med flere samtidige brukere — første ekte test bør
være to nettleservinduer mot `npm start` og flytte kort på tavla.
være to nettleservinduer mot `npm start`: flytt kort på tavla, bygg en
dagsplan og dra for å sortere, og marker ferdig for å se kommentar-dialogen.