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>
100 lines
3.0 KiB
TypeScript
100 lines
3.0 KiB
TypeScript
'use client'
|
|
|
|
/**
|
|
* Night Mode - Dashboard-gesteuerte Nachtabschaltung
|
|
*
|
|
* Ermoeglicht das automatische Stoppen und Starten von Docker-Services
|
|
* nach Zeitplan. Manuelles Starten/Stoppen ebenfalls moeglich.
|
|
*/
|
|
|
|
import { useNightMode } from './_components/useNightMode'
|
|
import { MainControl } from './_components/MainControl'
|
|
import { StatusCards } from './_components/StatusCards'
|
|
import { TimeConfig } from './_components/TimeConfig'
|
|
import { ServiceList } from './_components/ServiceList'
|
|
import { InfoBox } from './_components/InfoBox'
|
|
|
|
export default function NightModePage() {
|
|
const {
|
|
status,
|
|
services,
|
|
loading,
|
|
actionLoading,
|
|
error,
|
|
successMessage,
|
|
editMode,
|
|
setEditMode,
|
|
editConfig,
|
|
setEditConfig,
|
|
saveConfig,
|
|
executeAction,
|
|
toggleEnabled,
|
|
cancelEdit,
|
|
runningCount,
|
|
stoppedCount,
|
|
} = useNightMode()
|
|
|
|
return (
|
|
<div className="p-6">
|
|
<div className="mb-6">
|
|
<h1 className="text-2xl font-bold text-slate-900">Nachtabschaltung</h1>
|
|
<p className="text-slate-500 mt-1">Automatisches Stoppen und Starten von Docker-Services nach Zeitplan.</p>
|
|
</div>
|
|
|
|
{/* Status Messages */}
|
|
{error && (
|
|
<div className="mb-6 p-4 bg-red-50 border border-red-200 rounded-lg text-red-700 flex items-center gap-3">
|
|
<svg className="w-5 h-5 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M12 8v4m0 4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z" />
|
|
</svg>
|
|
{error}
|
|
</div>
|
|
)}
|
|
{successMessage && (
|
|
<div className="mb-6 p-4 bg-green-50 border border-green-200 rounded-lg text-green-700 flex items-center gap-3">
|
|
<svg className="w-5 h-5 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M5 13l4 4L19 7" />
|
|
</svg>
|
|
{successMessage}
|
|
</div>
|
|
)}
|
|
|
|
{loading ? (
|
|
<div className="flex justify-center py-12">
|
|
<div className="animate-spin rounded-full h-12 w-12 border-b-2 border-orange-600" />
|
|
</div>
|
|
) : (
|
|
<>
|
|
<MainControl
|
|
editConfig={editConfig}
|
|
actionLoading={actionLoading}
|
|
onToggle={toggleEnabled}
|
|
onExecute={executeAction}
|
|
/>
|
|
|
|
<StatusCards
|
|
status={status}
|
|
runningCount={runningCount}
|
|
stoppedCount={stoppedCount}
|
|
/>
|
|
|
|
<TimeConfig
|
|
editMode={editMode}
|
|
editConfig={editConfig}
|
|
actionLoading={actionLoading}
|
|
status={status}
|
|
onSetEditMode={setEditMode}
|
|
onSetEditConfig={setEditConfig}
|
|
onSave={saveConfig}
|
|
onCancel={cancelEdit}
|
|
/>
|
|
|
|
<ServiceList services={services} status={status} />
|
|
|
|
<InfoBox />
|
|
</>
|
|
)}
|
|
</div>
|
|
)
|
|
}
|