'use client' import Link from 'next/link' import { useState, useEffect } from 'react' import { usePathname } from 'next/navigation' import { useSDK, SDK_STEPS, SDK_PACKAGES, getStepsForPackage, type SDKStep, type SDKPackageId } from '@/lib/sdk' import { CheckIcon, LockIcon, ArrowIcon } from './SDKPipelineSidebarIcons' // ============================================================================= // STEP ITEM // ============================================================================= interface StepItemProps { step: SDKStep isActive: boolean isCompleted: boolean onNavigate: () => void } export function StepItem({ step, isActive, isCompleted, onNavigate }: StepItemProps) { return ( {step.nameShort} {isCompleted && !isActive && ( )} {isActive && ( )} ) } // ============================================================================= // PACKAGE SECTION // ============================================================================= interface PackageSectionProps { pkg: (typeof SDK_PACKAGES)[number] steps: SDKStep[] completion: number currentStepId: string completedSteps: string[] isLocked: boolean onNavigate: () => void isExpanded: boolean onToggle: () => void } export function PackageSection({ pkg, steps, completion, currentStepId, completedSteps, isLocked, onNavigate, isExpanded, onToggle, }: PackageSectionProps) { return (
{/* Package Header */} {/* Progress Bar */} {!isLocked && (
)} {/* Steps List */} {isExpanded && !isLocked && (
{steps.map(step => ( ))}
)}
) } // ============================================================================= // PIPELINE FLOW VISUALIZATION // ============================================================================= export function PipelineFlow() { return (
Datenfluss
{SDK_PACKAGES.map((pkg, idx) => (
{pkg.icon} {pkg.nameShort} {idx < SDK_PACKAGES.length - 1 && }
))}
) } // ============================================================================= // SIDEBAR CONTENT // ============================================================================= interface SidebarContentProps { onNavigate: () => void } export function SidebarContent({ onNavigate }: SidebarContentProps) { const pathname = usePathname() const { state, packageCompletion } = useSDK() const [expandedPackages, setExpandedPackages] = useState>({ 'vorbereitung': true, 'analyse': false, 'dokumentation': false, 'rechtliche-texte': false, 'betrieb': false, }) // Find current step const currentStep = SDK_STEPS.find(s => s.url === pathname) const currentStepId = currentStep?.id || '' // Auto-expand current package useEffect(() => { if (currentStep) { setExpandedPackages(prev => ({ ...prev, [currentStep.package]: true, })) } }, [currentStep]) const togglePackage = (packageId: SDKPackageId) => { setExpandedPackages(prev => ({ ...prev, [packageId]: !prev[packageId] })) } const isPackageLocked = (packageId: SDKPackageId): boolean => { if (state.preferences?.allowParallelWork) return false const pkg = SDK_PACKAGES.find(p => p.id === packageId) if (!pkg || pkg.order === 1) return false const prevPkg = SDK_PACKAGES.find(p => p.order === pkg.order - 1) if (!prevPkg) return false return packageCompletion[prevPkg.id] < 100 } // Filter steps based on visibleWhen conditions const getVisibleStepsForPackage = (packageId: SDKPackageId): SDKStep[] => { const steps = getStepsForPackage(packageId) return steps.filter(step => { if (step.visibleWhen) return step.visibleWhen(state) return true }) } return (
{/* Packages */} {SDK_PACKAGES.map(pkg => ( togglePackage(pkg.id)} /> ))} {/* Pipeline Flow */} {/* Quick Info */} {currentStep && (
Aktuell:{' '} {currentStep.description}
)}
) }