From 9484f831cee26f1e1a89158233099c2f03aeedf0 Mon Sep 17 00:00:00 2001 From: vegard Date: Wed, 18 Mar 2026 08:28:49 +0000 Subject: [PATCH] =?UTF-8?q?Gj=C3=B8r=20ChatTrait=20til=20fullverdig=20Bloc?= =?UTF-8?q?kShell-panel=20med=20inline=20chat=20(oppgave=2020.5)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ChatTrait viser nå meldinger, input og taleopptak direkte i panelet i stedet for bare lenker til /chat/[id]. Ved flere kanaler vises kanalliste med klikk-navigasjon; ved én kanal åpnes chatten direkte. Endringer: - ChatTrait: inline meldingsvisning, ChatInput, AudioPlayer, auto-scroll - BlockReceiver peker nå til aktiv kanal (ikke bare collection) - Meldingsbobler er draggable ut til andre paneler - Responsivt flex-layout som tilpasser seg container-størrelse - accessToken-prop lagt til (trengs for meldingssending) - Forelder-sider oppdatert til å sende accessToken - /chat/[id]-ruten beholdes som frittstående fullside-visning Co-Authored-By: Claude Opus 4.6 (1M context) --- docs/features/chat.md | 11 +- .../lib/components/traits/ChatTrait.svelte | 642 +++++++++++++++++- .../src/routes/collection/[id]/+page.svelte | 4 +- frontend/src/routes/workspace/+page.svelte | 4 +- tasks.md | 3 +- 5 files changed, 625 insertions(+), 39 deletions(-) diff --git a/docs/features/chat.md b/docs/features/chat.md index da783cb..80e6b3d 100644 --- a/docs/features/chat.md +++ b/docs/features/chat.md @@ -130,9 +130,18 @@ Channels med `config.ttl_days` satt til et tall får sine meldinger automatisk s - **Tråder:** Komplett trådvisning med datogruppering, autoscroll og visuell skillelinje mellom tråder. - **Reaksjoner:** Via SpacetimeDB-reducers, synket til PG. - **Meldingskollaps:** Lange meldinger begrenses til 2 linjer med "Vis mer"/"Vis mindre". -- **AI-behandling:** Meldinger kan AI-behandles (✨-knapp). Revisjons-toggle viser original vs. AI-versjon. Markdown-rendering for AI-output. +- **AI-behandling:** Meldinger kan AI-behandles (✨-knapp, eldre modell). Revisjons-toggle viser original vs. AI-versjon. Markdown-rendering for AI-output. NB: Erstattes av frittstående AI-verktøy på arbeidsflaten — se `docs/features/ai_verktoy.md`. - **Konvertering:** Meldinger kan opprettes som kanban-kort eller kalenderhendelse (dialog sier "Opprett", ikke "Konverter" — meldingen beholdes i chatten). +### ChatTrait panel (oppgave 20.5, mars 2026) +- **Inline panel:** ChatTrait er nå et fullverdig BlockShell-panel som viser meldinger, input og taleopptak direkte i panelet — ikke bare lenker til `/chat/[id]`. +- **Kanalliste → chatvisning:** Ved flere kanaler vises kanalliste, klikk åpner inline chat. Ved én kanal åpnes chatten direkte. +- **BlockReceiver:** Aksepterer drops fra alle andre paneler (`lettvekts-triage`-modus). Droppet innhold knyttes til aktiv kanal. +- **Drag-out:** Meldingsbobler er draggable — kan dras til andre paneler (kanban, editor, etc.). +- **Responsivt:** Tilpasser seg container-størrelse via flex-layout. Fungerer i både BlockShell-panel (desktop) og mobilfane. +- **Fullskjerm-toggle:** Via BlockShell-wrapperen (forelder-side wrapper ChatTrait i BlockShell). +- **`/chat/[id]`-ruten beholdes** som frittstående fullside-visning for direktelenker og deling. + ### Gjenstår - **Vedlegg, TTL** — avventer implementering. - **Tilgangsfiltrering:** SpacetimeDB-laget må filtrere basert på `node_access`-matrisen. diff --git a/frontend/src/lib/components/traits/ChatTrait.svelte b/frontend/src/lib/components/traits/ChatTrait.svelte index dcc72c9..931ef6a 100644 --- a/frontend/src/lib/components/traits/ChatTrait.svelte +++ b/frontend/src/lib/components/traits/ChatTrait.svelte @@ -1,19 +1,23 @@ - - {#snippet children()} - {#if chatNodes.length === 0} -

Ingen samtaler knyttet til denne samlingen.

- {:else} -
    - {#each chatNodes as node (node.id)} -
  • handleDragStart(e, node)} - class="cursor-grab active:cursor-grabbing" - > - - {node.title || 'Samtale'} - -
  • - {/each} -
- {/if} - {/snippet} -
+ + +
+ {#if chatNodes.length === 0} + +
+ 💬 +

Ingen samtaler knyttet til denne samlingen.

+
+ {:else if !activeChannelId} + +
+
Velg samtale
+ {#each chatNodes as node (node.id)} + + {/each} +
+ {:else} + +
+ + {#if chatNodes.length > 1} +
+ + {chatTitle} + {#if participants.length > 0} + + {participants.map(p => p.title || 'Ukjent').join(', ')} + + {/if} +
+ {/if} + + +
+ {#if messages.length === 0} +

Ingen meldinger ennå. Skriv den første!

+ {:else} + {#each messages as msg (msg.id)} + {@const own = isOwnMessage(msg)} + {@const audio = isAudioNode(msg)} + {@const bot = isAgentMessage(msg)} +
+
handleDragStart(e, msg)} + > + {#if !own} +

+ {#if bot}🤖 {/if}{senderName(msg)} +

+ {/if} + {#if audio} +
+ + + + + Talenotat +
+ + {:else} +

{msg.content || ''}

+ {/if} +

{formatTime(msg)}

+
+
+ {/each} + {/if} +
+ + + {#if accessToken && activeChannelId} +
+ +
+ {/if} +
+ {/if} +
+ + diff --git a/frontend/src/routes/collection/[id]/+page.svelte b/frontend/src/routes/collection/[id]/+page.svelte index 7e39ec8..aa45473 100644 --- a/frontend/src/routes/collection/[id]/+page.svelte +++ b/frontend/src/routes/collection/[id]/+page.svelte @@ -334,7 +334,7 @@ {#if trait === 'editor'} {:else if trait === 'chat'} - + {:else if trait === 'kanban'} {:else if trait === 'podcast'} @@ -389,7 +389,7 @@ {#if trait === 'editor'} {:else if trait === 'chat'} - + {:else if trait === 'kanban'} {:else if trait === 'podcast'} diff --git a/frontend/src/routes/workspace/+page.svelte b/frontend/src/routes/workspace/+page.svelte index 14591f3..3aaf860 100644 --- a/frontend/src/routes/workspace/+page.svelte +++ b/frontend/src/routes/workspace/+page.svelte @@ -525,7 +525,7 @@ {#if panel.trait === 'editor'} {:else if panel.trait === 'chat'} - + {:else if panel.trait === 'kanban'} {:else if panel.trait === 'calendar'} @@ -580,7 +580,7 @@ {#if trait === 'editor'} {:else if trait === 'chat'} - + {:else if trait === 'kanban'} {:else if trait === 'calendar'} diff --git a/tasks.md b/tasks.md index 65c2f52..4585c35 100644 --- a/tasks.md +++ b/tasks.md @@ -227,8 +227,7 @@ Ref: `docs/features/universell_overfoering.md`, `docs/retninger/arbeidsflaten.md - [x] 20.2 source_material edge-type: legg til i edge-skjema + maskinrommet-validering. Støtt kontekst-metadata (quoted, summarized, referenced) og excerpt-felt. Ref: `docs/retninger/arbeidsflaten.md` § "source_material-edge". - [x] 20.3 BlockReceiver interface: implementer `canReceive()`, `receive()`, `renderDropZone()` i alle trait-komponenter (Chat, Kanban, Kalender, Editor, Studio). Kompatibilitetsmatrise bestemmer godkjente drops. Ref: `docs/features/universell_overfoering.md` § 4–5. - [x] 20.4 Transfer service: `innholdstransfer`-modus (ny node + source_material edge) og `lettvekts-triage` (eksisterende node + ny edge/placement). Bestem modus fra verktøy-par. Shift-modifier for override. Ref: `docs/features/universell_overfoering.md` § 1, 3. -- [~] 20.5 Panelrework — Chat: gjør ChatTrait til fullverdig BlockShell-panel med BlockReceiver, fullskjerm-toggle, og responsivt design innenfor begrenset container. - > Påbegynt: 2026-03-18T08:22 +- [x] 20.5 Panelrework — Chat: gjør ChatTrait til fullverdig BlockShell-panel med BlockReceiver, fullskjerm-toggle, og responsivt design innenfor begrenset container. - [ ] 20.6 Panelrework — Kanban: gjør KanbanTrait til BlockShell-panel med drag-and-drop aksept fra andre paneler, fullskjerm, responsivt. - [ ] 20.7 Panelrework — Kalender: gjør CalendarTrait til BlockShell-panel med drop-aksept for scheduling, fullskjerm, responsivt. - [ ] 20.8 Panelrework — Editor/Artikkelverktøy: gjør artikkelverktøy til BlockShell-panel med source_material mottak fra andre paneler. Ref: `docs/features/artikkelverktoy.md`.