Files
breakpilot-lehrer/website/app/admin/builds/wizard/page.tsx
Benjamin Admin 451365a312 [split-required] Split remaining 500-680 LOC files (final batch)
website (17 pages + 3 components):
- multiplayer/wizard, middleware/wizard+test-wizard, communication
- builds/wizard, staff-search, voice, sbom/wizard
- foerderantrag, mail/tasks, tools/communication, sbom
- compliance/evidence, uni-crawler, brandbook (already done)
- CollectionsTab, IngestionTab, RiskHeatmap

backend-lehrer (5 files):
- letters_api (641 → 2), certificates_api (636 → 2)
- alerts_agent/db/models (636 → 3)
- llm_gateway/communication_service (614 → 2)
- game/database already done in prior batch

klausur-service (2 files):
- hybrid_vocab_extractor (664 → 2)
- klausur-service/frontend: api.ts (620 → 3), EHUploadWizard (591 → 2)

voice-service (3 files):
- bqas/rag_judge (618 → 3), runner (529 → 2)
- enhanced_task_orchestrator (519 → 2)

studio-v2 (6 files):
- korrektur/[klausurId] (578 → 4), fairness (569 → 2)
- AlertsWizard (552 → 2), OnboardingWizard (513 → 2)
- korrektur/api.ts (506 → 3), geo-lernwelt (501 → 2)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-25 08:56:45 +02:00

103 lines
3.3 KiB
TypeScript

'use client'
/**
* Build Pipeline Wizard
*
* Interactive guide for learning about the multi-platform
* build and deployment process for Breakpilot Drive
*/
import { useState } from 'react'
import Link from 'next/link'
import AdminLayout from '@/components/admin/AdminLayout'
import { STEPS, EDUCATION_CONTENT, WizardStep } from './_components/types'
import { WizardStepper, EducationCard, Sidebar } from './_components/WizardComponents'
import { PlatformCards, WorkflowDiagram, SecretsChecklist } from './_components/StepContent'
export default function BuildPipelineWizardPage() {
const [currentStep, setCurrentStep] = useState<WizardStep>('welcome')
const currentStepIndex = STEPS.findIndex(s => s.id === currentStep)
const education = EDUCATION_CONTENT[currentStep]
const goToNext = () => {
const nextIndex = currentStepIndex + 1
if (nextIndex < STEPS.length) {
setCurrentStep(STEPS[nextIndex].id)
}
}
const goToPrevious = () => {
const prevIndex = currentStepIndex - 1
if (prevIndex >= 0) {
setCurrentStep(STEPS[prevIndex].id)
}
}
return (
<AdminLayout
title="Build Pipeline Wizard"
description="Lerne die Multi-Platform Build Pipeline kennen"
>
{/* Back Link */}
<div className="mb-6">
<Link
href="/admin/game"
className="inline-flex items-center gap-2 text-gray-600 hover:text-gray-900"
>
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M15 19l-7-7 7-7" />
</svg>
Zurueck zum Game Dashboard
</Link>
</div>
{/* Stepper */}
<div className="mb-8">
<WizardStepper
steps={STEPS}
currentStep={currentStep}
onStepClick={setCurrentStep}
/>
</div>
{/* Content */}
<div className="grid grid-cols-1 lg:grid-cols-3 gap-6">
{/* Main Content */}
<div className="lg:col-span-2">
<EducationCard
title={education.title}
content={education.content}
tips={education.tips}
/>
{/* Step-specific content */}
{currentStep === 'platforms' && <PlatformCards />}
{currentStep === 'github-actions' && <WorkflowDiagram />}
{currentStep === 'deployment' && <SecretsChecklist />}
{/* Navigation */}
<div className="flex justify-between mt-8">
<button
onClick={goToPrevious}
disabled={currentStepIndex === 0}
className="px-6 py-3 rounded-lg font-medium bg-gray-100 text-gray-700 hover:bg-gray-200 disabled:opacity-50 disabled:cursor-not-allowed"
>
Zurueck
</button>
<button
onClick={goToNext}
disabled={currentStepIndex === STEPS.length - 1}
className="px-6 py-3 rounded-lg font-medium bg-green-600 text-white hover:bg-green-700 disabled:opacity-50 disabled:cursor-not-allowed"
>
{currentStepIndex === STEPS.length - 1 ? 'Fertig' : 'Weiter'}
</button>
</div>
</div>
{/* Sidebar */}
<Sidebar currentStepIndex={currentStepIndex} />
</div>
</AdminLayout>
)
}