'use client' /** * DSFA Document Manager * * Manages DSFA-related sources and documents for the RAG pipeline. */ import { useState, useEffect } from 'react' import Link from 'next/link' import { ArrowLeft, RefreshCw, Upload, FileText, Database, Search, Filter, AlertCircle, BookOpen, } from 'lucide-react' import { DSFASource, DSFACorpusStats, DSFASourceStats } from '@/lib/sdk/types' import { fetchSources, fetchStats, initializeCorpus, triggerIngestion, MOCK_SOURCES, MOCK_STATS, } from './_components/dsfa-api' import { LicenseBadge } from './_components/DSFABadges' import { SourceCard } from './_components/SourceCard' import { StatsOverview } from './_components/StatsOverview' export default function DSFADocumentManagerPage() { const [sources, setSources] = useState([]) const [stats, setStats] = useState(null) const [isLoading, setIsLoading] = useState(true) const [error, setError] = useState(null) const [searchQuery, setSearchQuery] = useState('') const [filterType, setFilterType] = useState('all') const [ingestingSource, setIngestingSource] = useState(null) const [isInitializing, setIsInitializing] = useState(false) useEffect(() => { async function loadData() { setIsLoading(true) try { const [sourcesData, statsData] = await Promise.all([ fetchSources(), fetchStats(), ]) setSources(sourcesData) setStats(statsData) setError(null) } catch (err) { setError(err instanceof Error ? err.message : 'Failed to load data') setSources(MOCK_SOURCES) setStats(MOCK_STATS) } finally { setIsLoading(false) } } loadData() }, []) const handleInitialize = async () => { setIsInitializing(true) try { await initializeCorpus() const [sourcesData, statsData] = await Promise.all([ fetchSources(), fetchStats(), ]) setSources(sourcesData) setStats(statsData) } catch (err) { setError(err instanceof Error ? err.message : 'Failed to initialize') } finally { setIsInitializing(false) } } const handleIngest = async (sourceCode: string) => { setIngestingSource(sourceCode) try { await triggerIngestion(sourceCode) const statsData = await fetchStats() setStats(statsData) } catch (err) { setError(err instanceof Error ? err.message : 'Failed to ingest') } finally { setIngestingSource(null) } } // Filter sources const filteredSources = sources.filter(source => { const matchesSearch = searchQuery === '' || source.name.toLowerCase().includes(searchQuery.toLowerCase()) || source.sourceCode.toLowerCase().includes(searchQuery.toLowerCase()) || source.organization?.toLowerCase().includes(searchQuery.toLowerCase()) const matchesType = filterType === 'all' || source.documentType === filterType return matchesSearch && matchesType }) const getStatsForSource = (sourceCode: string): DSFASourceStats | undefined => { return stats?.sources.find(s => s.sourceCode === sourceCode) } return (
{/* Header */}
Zurueck zur RAG-Pipeline

DSFA-Quellen Manager

Verwalten Sie DSFA-Guidance Dokumente mit vollstaendiger Lizenzattribution

{/* Error Banner */} {error && (
{error}
)} {/* Stats Overview */} {stats && } {/* Search & Filter */}
setSearchQuery(e.target.value)} className="w-full pl-10 pr-4 py-2 border border-gray-200 dark:border-gray-700 rounded-lg bg-white dark:bg-gray-800" />
{/* Sources List */}

Registrierte Quellen ({filteredSources.length})

{isLoading ? (

Lade Quellen...

) : filteredSources.length === 0 ? (

{searchQuery || filterType !== 'all' ? 'Keine Quellen gefunden' : 'Noch keine Quellen registriert'}

{!searchQuery && filterType === 'all' && ( )}
) : (
{filteredSources.map(source => ( handleIngest(source.sourceCode)} isIngesting={ingestingSource === source.sourceCode} /> ))}
)}
{/* Info Box */}

Ueber die Lizenzattribution

Alle DSFA-Quellen werden mit vollstaendiger Lizenzinformation gespeichert. Bei der Nutzung der RAG-Suche werden automatisch die korrekten Attributionen angezeigt.

Namensnennung
Keine Attribution
CC Attribution
) }