Phase 1 — Python (klausur-service): 5 monoliths → 36 files - dsfa_corpus_ingestion.py (1,828 LOC → 5 files) - cv_ocr_engines.py (2,102 LOC → 7 files) - cv_layout.py (3,653 LOC → 10 files) - vocab_worksheet_api.py (2,783 LOC → 8 files) - grid_build_core.py (1,958 LOC → 6 files) Phase 2 — Go (edu-search-service, school-service): 8 monoliths → 19 files - staff_crawler.go (1,402 → 4), policy/store.go (1,168 → 3) - policy_handlers.go (700 → 2), repository.go (684 → 2) - search.go (592 → 2), ai_extraction_handlers.go (554 → 2) - seed_data.go (591 → 2), grade_service.go (646 → 2) Phase 3 — TypeScript (admin-lehrer): 45 monoliths → 220+ files - sdk/types.ts (2,108 → 16 domain files) - ai/rag/page.tsx (2,686 → 14 files) - 22 page.tsx files split into _components/ + _hooks/ - 11 component files split into sub-components - 10 SDK data catalogs added to loc-exceptions - Deleted dead backup index_original.ts (4,899 LOC) All original public APIs preserved via re-export facades. Zero new errors: Python imports verified, Go builds clean, TypeScript tsc --noEmit shows only pre-existing errors. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
130 lines
3.1 KiB
TypeScript
130 lines
3.1 KiB
TypeScript
'use client'
|
|
|
|
/**
|
|
* Screen Flow Visualization
|
|
*
|
|
* Visualisiert alle Screens aus:
|
|
* - Studio (Port 8000): Lehrer-Oberflaeche
|
|
* - Admin v2 (Port 3002): Admin Panel
|
|
*/
|
|
|
|
import { useCallback } from 'react'
|
|
import { useScreenFlow } from './useScreenFlow'
|
|
import {
|
|
FlowTypeSelector,
|
|
StatsBar,
|
|
CategoryFilter,
|
|
ConnectedScreensList,
|
|
FlowDiagram,
|
|
ScreenList,
|
|
} from './_components'
|
|
import type { ScreenDefinition } from './types'
|
|
|
|
export default function ScreenFlowPage() {
|
|
const {
|
|
flowType,
|
|
selectedCategory,
|
|
setSelectedCategory,
|
|
selectedNode,
|
|
setSelectedNode,
|
|
previewScreen,
|
|
setPreviewScreen,
|
|
screens,
|
|
colors,
|
|
labels,
|
|
baseUrl,
|
|
nodes,
|
|
edges,
|
|
onNodesChange,
|
|
onEdgesChange,
|
|
handleFlowTypeChange,
|
|
onNodeClick,
|
|
onPaneClick,
|
|
stats,
|
|
categories,
|
|
connectedScreens,
|
|
} = useScreenFlow()
|
|
|
|
const handleReset = useCallback(() => {
|
|
setSelectedNode(null)
|
|
setPreviewScreen(null)
|
|
}, [setSelectedNode, setPreviewScreen])
|
|
|
|
const handleCategoryReset = useCallback(() => {
|
|
setSelectedCategory(null)
|
|
setSelectedNode(null)
|
|
setPreviewScreen(null)
|
|
}, [setSelectedCategory, setSelectedNode, setPreviewScreen])
|
|
|
|
const handleSelectCategory = useCallback((category: string | null) => {
|
|
setSelectedCategory(category)
|
|
setSelectedNode(null)
|
|
setPreviewScreen(null)
|
|
}, [setSelectedCategory, setSelectedNode, setPreviewScreen])
|
|
|
|
const handleSelectScreen = useCallback((screen: ScreenDefinition) => {
|
|
setSelectedNode(screen.id)
|
|
setSelectedCategory(null)
|
|
setPreviewScreen(screen)
|
|
}, [setSelectedNode, setSelectedCategory, setPreviewScreen])
|
|
|
|
return (
|
|
<div className="space-y-6">
|
|
<FlowTypeSelector
|
|
flowType={flowType}
|
|
onFlowTypeChange={handleFlowTypeChange}
|
|
/>
|
|
|
|
<StatsBar
|
|
totalScreens={stats.totalScreens}
|
|
totalConnections={stats.totalConnections}
|
|
connectedCount={stats.connectedCount}
|
|
selectedNode={selectedNode}
|
|
previewScreen={previewScreen}
|
|
onReset={handleReset}
|
|
/>
|
|
|
|
<CategoryFilter
|
|
screens={screens}
|
|
categories={categories}
|
|
colors={colors}
|
|
labels={labels}
|
|
selectedCategory={selectedCategory}
|
|
selectedNode={selectedNode}
|
|
onSelectCategory={handleSelectCategory}
|
|
onReset={handleCategoryReset}
|
|
/>
|
|
|
|
<ConnectedScreensList
|
|
selectedNode={selectedNode}
|
|
connectedScreens={connectedScreens}
|
|
colors={colors}
|
|
baseUrl={baseUrl}
|
|
/>
|
|
|
|
<FlowDiagram
|
|
flowType={flowType}
|
|
nodes={nodes}
|
|
edges={edges}
|
|
onNodesChange={onNodesChange}
|
|
onEdgesChange={onEdgesChange}
|
|
onNodeClick={onNodeClick}
|
|
onPaneClick={onPaneClick}
|
|
screens={screens}
|
|
colors={colors}
|
|
labels={labels}
|
|
categories={categories}
|
|
/>
|
|
|
|
<ScreenList
|
|
screens={screens}
|
|
colors={colors}
|
|
labels={labels}
|
|
baseUrl={baseUrl}
|
|
selectedCategory={selectedCategory}
|
|
onSelectScreen={handleSelectScreen}
|
|
/>
|
|
</div>
|
|
)
|
|
}
|