Dagsplan: flytt/navn/deling + plan-badge, kategorier, feltmodus
Dagsplan kan navngis og flyttes til annen dato (slår sammen uten datatap).
Delbar som hovedregel (shared-flagg default true) med toggle for privat;
andres delte planer kan ses skrivebeskyttet via "Plan for"-velger.
getPlanFor håndhever tilgang. Per-oppgave plan-badge (dag + person) via
planIndex filtrert per viewer.
Egendefinerte kategorier (categories.json) i tillegg til de 12 innebygde;
dynamisk validering, deles via WS, addes fra kategori-nedtrekket.
Feltmodus (body.field-mode): større berøringsmål for mobil, auto på <640px.
plans.json migreres array -> {name,items,shared} ved oppstart (bakoverkompat).
26 integrasjonstester (6 nye), alle grønne. README + CLAUDE.md oppdatert.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
parent
be166034de
commit
bdeb6254b9
8 changed files with 724 additions and 147 deletions
|
|
@ -17,7 +17,13 @@ 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.
|
||||
ved å plukke fra backlog. Drag-sortering, kapasitet i timer, navn, flytt hele
|
||||
planen til en annen dato, og delbar (default delt; toggle for privat). Andres
|
||||
delte planer kan ses skrivebeskyttet. Plan-membership vises som badge på
|
||||
oppgavekort/-rader (dag + person).
|
||||
- **Egendefinerte kategorier** — i tillegg til de 12 innebygde; lagres i
|
||||
categories.json, deles via WS, valideres dynamisk.
|
||||
- **Feltmodus** — `body.field-mode`-toggle for større berøringsmål på mobil.
|
||||
- **Kommentar ved statusbytte** — valgfri `comment` på `PUT /api/tasks/:id`
|
||||
festes som kommentar med `kind:'status'` og legges i aktivitets-detaljen.
|
||||
- **Kommentarer** per oppgave
|
||||
|
|
@ -41,7 +47,7 @@ netops-todo-node/
|
|||
├── 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, plans.json.
|
||||
│ users.json, plans.json, categories.json.
|
||||
└── README.md Installasjon, proxy-oppsett, API-referanse.
|
||||
```
|
||||
|
||||
|
|
@ -64,7 +70,8 @@ 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`) |
|
||||
| `plan` | `user`, `date`, `name`, `items[]`, `shared` | Etter plan-endring. Delte planer → alle; private → kun eieren (andre får tom `items` for å fjerne badge) |
|
||||
| `categories` | `categories[]`, `by` | Etter `POST /api/categories` — til alle |
|
||||
|
||||
Klient → server: kun `{ type: 'editing', id, active }`.
|
||||
|
||||
|
|
@ -92,15 +99,28 @@ 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"] } }
|
||||
{ "jon": { "2026-06-15": { "name": "Feltdag Bergen", "items": ["t_abc", "t_def"], "shared": true } } }
|
||||
```
|
||||
|
||||
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.
|
||||
Per bruker, per dato. `shared` default `true` (planer er synlige for alle som
|
||||
hovedregel). `_planEntry()` normaliserer både gammelt array-format og nytt
|
||||
objektformat (migrering skjer i `_prunePlans()` ved oppstart). `getPlan()`
|
||||
filtrerer bort slettede oppgaver; `getPlanFor(viewer, owner, date)` håndhever
|
||||
tilgang (egen, eller delt → ellers null/403); `setPlan/setPlanName/setPlanShared`
|
||||
muterer; `movePlan()` slår sammen til måldato uten datatap; `_scrubFromPlans()`
|
||||
rydder ved sletting; `_prunePlans()` dropper datoer eldre enn 30 dager.
|
||||
`planIndex(viewer)` returnerer `{taskId: [{user,date,name}]}` filtrert per viewer
|
||||
(delte + egne private) — driver plan-badgene på kort/rader.
|
||||
|
||||
### Kategorier (`categories.json`)
|
||||
|
||||
`DEFAULT_CATEGORIES` (12, i koden) + egendefinerte fra `categories.json`
|
||||
(`[{id,name,color,desc,custom:true}]`). `store.categories()`/`categoryIds()` gir
|
||||
det effektive settet; `normalizeTask` validerer mot `opts.validCategories =
|
||||
this.categoryIds()`. `addCategory()` genererer en unik id fra navnet og tildeler
|
||||
farge fra en palett. Frontend får lista fra `/api/state` og via `categories`-WS;
|
||||
`state.categories` + `catColor/catName/catById`-hjelperne erstatter den gamle
|
||||
hardkodede `CATEGORIES`/`CAT_COLORS`.
|
||||
|
||||
## Designvalg verdt å vite
|
||||
|
||||
|
|
@ -149,15 +169,17 @@ strenglengde-klamping, brukernavn-regex `[A-Za-z0-9._@-]{1,64}`), pluss:
|
|||
|
||||
## Testing-status
|
||||
|
||||
- `npm test`: 20 integrasjonstester (node:test), booter ekte server på
|
||||
- `npm test`: 26 integrasjonstester (node:test), booter ekte server på
|
||||
tilfeldig port med temp-datakatalog. Dekker normalisering, versjonskonflikt,
|
||||
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
|
||||
validering, scrub ved sletting, dato-fallback, navn, flytt/merge, deling +
|
||||
tilgang, planIndex per viewer), egendefinerte kategorier, aktivitetslogg,
|
||||
WS-broadcast (delt vs. privat plan), persistens, 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.
|
||||
- Manuell røyk-test over HTTP: kategori-opprettelse (auto-id + farge), navngitt
|
||||
delt plan, annen brukers tilgang (delt 200 / privat 403), flytt med bevart
|
||||
navn+delingsstatus, og planIndex verifisert.
|
||||
- Ikke testet i nettleser med flere samtidige brukere — første ekte test bør
|
||||
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.
|
||||
være to nettleservinduer mot `npm start`: del en dagsplan og se den hos den
|
||||
andre brukeren + badge på oppgaven, flytt planen til en annen dag, legg til en
|
||||
egendefinert kategori, og slå på feltmodus på en smal skjerm.
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue