# 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 verktøymenyen i arbeidsflaten ### 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.