synops/docs/features/kanban.md
vegard b5aa5bb243 Fjern SpacetimeDB komplett (oppgave 22.4)
SpacetimeDB er nå helt fjernet fra Synops. Sanntid håndteres av
PG LISTEN/NOTIFY + WebSocket i portvokteren (maskinrommet).

Kode fjernet:
- spacetimedb/ Rust-modul og spacetime.json
- maskinrommet/src/stdb.rs (HTTP-klient for STDB-reducers)
- frontend module_bindings/ (23 auto-genererte filer)
- spacetimedb npm-avhengighet fra package.json
- scripts/test-sanntid.sh (testet STDB-flyt)

Infrastruktur:
- Docker-container stoppet og fjernet fra docker-compose.yml
- Caddy: fjernet /spacetime/* reverse proxy
- maskinrommet-env.sh: fjernet STDB_IP og SPACETIMEDB_*-variabler
- .env.example: fjernet SpacetimeDB-seksjoner

Dokumentasjon oppdatert:
- CLAUDE.md: stack, lagmodell, kjerneprinsipper, driftsmodell
- docs/arkitektur.md: skrivestien, lesestien, datalag, teknologivalg
- docs/retninger/datalaget.md: migrasjonshistorikk, status "fjernet"
- 37 andre docs oppdatert (features, concepts, infra, ops, retninger)
- Alle kode-kommentarer med STDB-referanser oppdatert

Verifisert: maskinrommet bygger og starter OK, frontend bygger OK,
helsesjekk returnerer 200. Caddy reloadet.
2026-03-18 13:39:09 +00:00

101 lines
4.8 KiB
Markdown

# Feature: Kanban (Planlegging)
**Filsti:** `docs/features/kanban.md`
## 1. Konsept
Et drag-and-drop Kanban-brett for planlegging. Primært brukt til
episodeplanlegging i Redaksjonen, men også mottaker av AI-genererte
action points fra Møterommet.
## 2. Status
**Implementert med nodes+edges (mars 2026).** Sanntid via PG LISTEN/NOTIFY + WebSocket.
### Implementert
- Board = samlings-node (`node_kind: 'collection'`, `metadata.board: true`)
- Kolonner definert i board-metadata: `metadata.columns: ["todo", "in_progress", "done"]`
- Kort = content-noder med `belongs_to`-edge til board
- Status via `status`-edge (kort → board) med `metadata.value`
- Posisjon via `belongs_to`-edge `metadata.position` (REAL for midpoint-innsetting)
- Backend: `POST /intentions/update_edge` for statusendring
- Backend: `GET /query/board?board_id=...` for board-spørring
- Frontend: `/board/[id]` route med HTML5 drag-and-drop
- Sanntid via PG LISTEN/NOTIFY + WebSocket (ingen polling)
- Opprett kort direkte i kolonne (tittel-input)
- Oppretting av nye brett fra mottak-siden
### KanbanTrait panel (oppgave 20.6, mars 2026)
- **Inline panel:** KanbanTrait er nå et fullverdig BlockShell-panel som viser kolonner og kort direkte i panelet — ikke bare lenke til `/board/[id]`.
- **Kolonner:** Henter kolonner fra `metadata.traits.kanban.columns`, fallback til `['todo', 'in_progress', 'done']`.
- **Intern drag-and-drop:** Kort kan dras mellom kolonner for statusendring (bruker status-edge).
- **BlockReceiver:** Aksepterer drops fra andre paneler (`innholdstransfer`-modus). Noder fra chat/editor opprettes som nye kort med `source_material`-edge.
- **Drag-out:** Kort er draggable med `setDragPayload` — kan dras til andre paneler (chat, editor, kalender).
- **Opprett kort:** Inline-knapp per kolonne for å opprette nye kort (tittel → content-node + belongs_to + status edges).
- **Responsivt:** Kolonner stables vertikalt på smale paneler/mobil via `@container` og `@media` queries.
- **Fullskjerm-toggle:** Via BlockShell-wrapperen (forelder-side wrapper KanbanTrait i BlockShell).
- **`/board/[id]`-ruten beholdes** som frittstående fullside-visning for direktelenker.
### Gjenstår
- Reposisjonering ved dra innad i kolonne (sortert rekkefølge)
- Redigeringsmodal for kort (tittel/beskrivelse)
- Tildeling (assignee) UI
- Fargekoder/labels på kort
- AI-integrasjon: møtereferent → nye kort
- Tilpassbare kolonnenavn
## 3. Datamodell
Ingen separate kanban-tabeller. Alt er noder og edges (kjerneprimitivene):
```
Board = collection-node (metadata.board: true, metadata.columns: [...])
Kort = content-node
+ belongs_to-edge → board (metadata.position: REAL)
+ status-edge → board (metadata.value: "todo"|"in_progress"|"done")
```
Tilgang styres via `node_access`-matrisen. Brett er synlige for
brukere med `owner`/`admin`/`member_of`-edge til board-noden.
## 4. API-endepunkter
| Metode | Sti | Beskrivelse |
|---|---|---|
| GET | `/query/board?board_id=...` | Hent brett med kort, status og posisjon |
| POST | `/intentions/create_node` | Opprett kort (content-node) |
| POST | `/intentions/create_edge` | Koble kort til brett (belongs_to + status) |
| POST | `/intentions/update_edge` | Endre status ved drag-and-drop |
| POST | `/intentions/update_node` | Oppdater tittel/beskrivelse |
| POST | `/intentions/delete_node` | Slett kort (cascader edges) |
## 5. Redaksjonell arbeidsflate (Editorial Board)
Kanban-mønsteret gjenbrukes for redaktørens arbeidsflate (`/editorial/[id]`),
men med en viktig forskjell: den bruker `submitted_to`-edges i stedet for
`belongs_to` + `status`-edges. Status lever direkte i `submitted_to`-edge-metadata.
**Kolonner:** Innkomne (pending), Under vurdering (in_review), Godkjent (approved), Planlagt (scheduled)
**Planlagt-kolonnen:** Når en artikkel dras til "Planlagt", åpnes en dialog
for å sette `publish_at` i edge-metadata. Statusen i edge er fortsatt `approved`,
men `publish_at` skiller planlagte fra godkjente.
**Backend:** `GET /query/editorial_board?collection_id=...` — henter alle noder
med `submitted_to`-edge til samlingen, inkludert forfatterinfo.
**Tilgang:** Kun `owner`/`admin` av samlingen kan dra kort mellom kolonner
(statusendring). Tilgang kontrollert i `update_edge`.
## 6. Brukes av
| Konsept | Bruk |
|---|---|
| Redaksjonen | Episodeplanlegging — dra Temaer inn i Kjøreplanen |
| Redaksjonen | Redaksjonell arbeidsflate — innsendinger gruppert på status |
| Møterommet | AI-referenten foreslår nye kort basert på action points |
## 6. Instruks for Claude Code
* Alt er noder og edges — ingen separate kanban-tabeller.
* Board er en collection-node med `metadata.board: true`.
* Status er en `status`-edge (kort → board) med `metadata.value`.
* Bruk native HTML5 Drag and Drop, unngå tunge biblioteker.
* Sanntid via PG LISTEN/NOTIFY + WebSocket.
* Tilgang styres via `node_access`-matrisen.