/**
* 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
);
}