synops/frontend/src/lib/traits.ts
vegard 51eb089f0c Trait-administrasjon: admin-UI for å administrere traits på samlinger (oppgave 13.4)
Legger til et admin-panel på samlingssiden der man kan legge til/fjerne
traits fra katalogen og konfigurere per-trait-innstillinger. Endringene
sendes via updateNode til maskinrommet som validerer mot VALID_TRAITS.

- Ny updateNode-funksjon i api.ts
- Delt trait-katalog i lib/traits.ts (brukes av collection/new og TraitAdmin)
- TraitAdmin.svelte: toggle traits, rediger config-nøkler, lagre
- Integrasjon i collection/[id] med Traits-knapp i header

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-18 00:32:31 +00:00

215 lines
4.7 KiB
TypeScript

/**
* Shared trait catalog and package definitions.
* Used by collection/new (package selector) and TraitAdmin (trait management).
*/
export interface TraitCategory {
label: string;
traits: string[];
}
export const traitCatalog: TraitCategory[] = [
{ label: 'Innhold & redigering', traits: ['editor', 'versioning', 'collaboration', 'translation', 'templates'] },
{ label: 'Publisering & distribusjon', traits: ['publishing', 'rss', 'newsletter', 'custom_domain', 'analytics', 'embed', 'api'] },
{ label: 'Lyd & video', traits: ['podcast', 'recording', 'transcription', 'tts', 'clips', 'playlist'] },
{ label: 'Kommunikasjon', traits: ['chat', 'forum', 'comments', 'guest_input', 'announcements', 'polls', 'qa'] },
{ label: 'Organisering', traits: ['kanban', 'calendar', 'timeline', 'table', 'gallery', 'bookmarks', 'tags'] },
{ label: 'Kunnskap', traits: ['knowledge_graph', 'wiki', 'glossary', 'faq', 'bibliography'] },
{ label: 'Automatisering & AI', traits: ['auto_tag', 'auto_summarize', 'digest', 'bridge', 'moderation'] },
{ label: 'Tilgang & fellesskap', traits: ['membership', 'roles', 'invites', 'paywall', 'directory'] },
{ label: 'Ekstern integrasjon', traits: ['webhook', 'import', 'export', 'ical_sync'] },
];
export interface Package {
id: string;
name: string;
description: string;
icon: string;
traits: Record<string, Record<string, unknown>>;
}
export const packages: Package[] = [
{
id: 'nettmagasin',
name: 'Nettmagasin',
description: 'Publiser artikler med RSS, kommentarer og nyhetsbrev',
icon: '📰',
traits: {
editor: { preset: 'longform' },
publishing: {},
rss: {},
comments: {},
analytics: {},
custom_domain: {},
newsletter: {},
},
},
{
id: 'podcaststudio',
name: 'Podcaststudio',
description: 'Podcast med opptak, transkripsjon og kunnskapsgraf',
icon: '🎙️',
traits: {
podcast: {},
recording: {},
transcription: {},
editor: { preset: 'shownotes' },
rss: {},
analytics: {},
clips: {},
knowledge_graph: {},
},
},
{
id: 'nyhetsbrev',
name: 'Nyhetsbrev',
description: 'Skriv og distribuer nyhetsbrev med analyse',
icon: '✉️',
traits: {
editor: { preset: 'longform' },
newsletter: {},
analytics: {},
versioning: {},
},
},
{
id: 'wiki',
name: 'Wiki',
description: 'Samarbeidende kunnskapsbase med versjonering',
icon: '📚',
traits: {
wiki: {},
editor: { preset: 'longform' },
collaboration: {},
versioning: {},
knowledge_graph: {},
glossary: {},
},
},
{
id: 'diskusjonsklubb',
name: 'Diskusjonsklubb',
description: 'Forum, chat og avstemninger for en gruppe',
icon: '💬',
traits: {
forum: {},
chat: {},
polls: {},
membership: {},
roles: {},
directory: {},
},
},
{
id: 'kursplattform',
name: 'Kursplattform',
description: 'Kursinnhold med spillelister, Q&A og betaling',
icon: '🎓',
traits: {
editor: { preset: 'longform' },
playlist: {},
qa: {},
membership: {},
paywall: {},
templates: {},
},
},
{
id: 'moteplass',
name: 'Møteplass',
description: 'Opptak, chat, kanban og kalender for møter',
icon: '🤝',
traits: {
recording: {},
chat: {},
kanban: {},
calendar: {},
auto_summarize: {},
guest_input: {},
},
},
{
id: 'fotoblogg',
name: 'Fotoblogg',
description: 'Bildegalleri med publisering og kommentarer',
icon: '📷',
traits: {
gallery: {},
publishing: {},
comments: {},
custom_domain: {},
rss: {},
},
},
{
id: 'prosjektstyring',
name: 'Prosjektstyring',
description: 'Kanban, kalender og chat for teamarbeid',
icon: '📋',
traits: {
kanban: {},
calendar: {},
chat: {},
table: {},
tags: {},
roles: {},
},
},
{
id: 'forskning',
name: 'Åpen forskning',
description: 'Akademisk publisering med versjonering og bibliografi',
icon: '🔬',
traits: {
editor: { preset: 'longform' },
versioning: {},
bibliography: {},
publishing: {},
comments: {},
collaboration: {},
api: {},
},
},
{
id: 'community-radio',
name: 'Community radio',
description: 'Opptak, podcast, chat og avstemninger',
icon: '📻',
traits: {
recording: {},
podcast: {},
chat: {},
polls: {},
membership: {},
clips: {},
playlist: {},
},
},
{
id: 'bokmerke-vegg',
name: 'Bokmerke-vegg',
description: 'Kuraterte lenker med tags og kommentarer',
icon: '🔖',
traits: {
bookmarks: {},
tags: {},
publishing: {},
rss: {},
comments: {},
},
},
{
id: 'redaksjon',
name: 'Redaksjon',
description: 'Redaksjonelt arbeid med chat, kanban og kalender',
icon: '🗞️',
traits: {
chat: {},
kanban: {},
calendar: {},
editor: { preset: 'longform' },
knowledge_graph: {},
guest_input: {},
},
},
];