/** * Widget Schema Viewer * * Komponent der visualiserer en widgets metadata/schema. * Viser hvad widgeten kræver, leverer og kan konfigureres med. */ import { useState } from 'react'; import { Info, ArrowDownToLine, ArrowUpFromLine, Settings, Link2, Tag, Zap, Database, RefreshCw } from 'lucide-react'; import { WidgetMetadata } from '@/types/WidgetSchema'; import { widgetRegistry } from '@/lib/widgetRegistry'; import { cn } from '@/lib/utils'; interface WidgetSchemaViewerProps { widgetId: string; compact?: boolean; className?: string; } export function WidgetSchemaViewer({ widgetId, compact = false, className }: WidgetSchemaViewerProps) { const [activeTab, setActiveTab] = useState<'requires' | 'provides' | 'config' | 'relations'>('requires'); const metadata = widgetRegistry.get(widgetId); if (!metadata) { return (

Widget metadata ikke tilgængelig

); } if (compact) { return ; } return (
{/* Header */}

{metadata.name}

{metadata.description}

{metadata.priority || 'medium'} v{metadata.version}
{/* Tags */}
{metadata.tags.map(tag => ( {tag} ))}
{/* Tabs */}
setActiveTab('requires')} icon={ArrowDownToLine} label="Kræver" count={metadata.requires.length} /> setActiveTab('provides')} icon={ArrowUpFromLine} label="Leverer" count={metadata.provides.length} /> setActiveTab('config')} icon={Settings} label="Konfiguration" count={metadata.config.length} /> setActiveTab('relations')} icon={Link2} label="Relationer" count={metadata.relations.length} />
{/* Content */}
{activeTab === 'requires' && (
{metadata.requires.length === 0 ? (

Ingen data-afhængigheder

) : ( metadata.requires.map(req => (
{req.name}
{req.type} {req.required && ( påkrævet )}

{req.description}

{req.refreshRate && (
Opdateres hver {req.refreshRate / 1000}s
)}
)) )}
)} {activeTab === 'provides' && (
{metadata.provides.length === 0 ? (

Ingen outputs defineret

) : ( metadata.provides.map(cap => (
{cap.name} {cap.outputType}

{cap.description}

{cap.triggers && cap.triggers.length > 0 && (
{cap.triggers.map(trigger => ( {trigger} ))}
)}
)) )}
)} {activeTab === 'config' && (
{metadata.config.length === 0 ? (

Ingen konfigurerbare indstillinger

) : ( metadata.config.map(cfg => (
{cfg.name} {cfg.type}

{cfg.description}

Default: {String(cfg.default)}
{cfg.options && (
{cfg.options.map(opt => ( {opt.label} ))}
)}
)) )}
)} {activeTab === 'relations' && (
{metadata.relations.length === 0 ? (

Ingen definerede relationer

) : ( metadata.relations.map((rel, idx) => (
{rel.type} {rel.targetWidgetId}

{rel.description}

{rel.dataFlow && (
Data: {rel.dataFlow}
)}
)) )}
)}
); } // Tab button component function TabButton({ active, onClick, icon: Icon, label, count }: { active: boolean; onClick: () => void; icon: React.ElementType; label: string; count: number; }) { return ( ); } // Compact view for inline display function CompactView({ metadata, className }: { metadata: WidgetMetadata; className?: string }) { return (
{metadata.name} {metadata.requires.length} inputs, {metadata.provides.length} outputs
); }