refactor: Integrate Modules into Scope-Decision (Option C)

- RegulationsPanel: added enable/disable toggles per regulation
- ScopeDecisionTab: passes enabledModules + onToggleModule
- Scope page: auto-enables all applicable regulations when loaded
- Modules step: isOptional=true, moved to Zusatzmodule
- Requirements: now depends on compliance-scope, not modules
- Source-policy: now depends on use-case-assessment, not modules

Flow: Profile → Scope → Scope-Decision shows applicable regulations
with toggles → Requirements derived from enabled regulations

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Benjamin Admin
2026-05-04 14:29:53 +02:00
parent 7ab1476d8f
commit f737bfc4db
4 changed files with 44 additions and 7 deletions
@@ -110,6 +110,8 @@ interface RegulationsPanelProps {
supervisoryAuthorities?: SupervisoryAuthorityInfo[]
regulationAssessmentLoading?: boolean
onGoToObligations?: () => void
enabledModules?: string[]
onToggleModule?: (moduleId: string, enabled: boolean) => void
}
export function RegulationsPanel({
@@ -117,6 +119,8 @@ export function RegulationsPanel({
supervisoryAuthorities,
regulationAssessmentLoading,
onGoToObligations,
enabledModules,
onToggleModule,
}: RegulationsPanelProps) {
if (!applicableRegulations && !regulationAssessmentLoading) return null
return (
@@ -149,9 +153,22 @@ export function RegulationsPanel({
)}
</div>
</div>
<div className="text-right text-sm text-gray-600">
<span>{reg.obligation_count} Pflichten</span>
{reg.control_count > 0 && <span className="ml-2">{reg.control_count} Controls</span>}
<div className="flex items-center gap-3">
<div className="text-right text-sm text-gray-600">
<span>{reg.obligation_count} Pflichten</span>
{reg.control_count > 0 && <span className="ml-2">{reg.control_count} Controls</span>}
</div>
{onToggleModule && (
<label className="flex items-center gap-1.5 cursor-pointer">
<input
type="checkbox"
checked={enabledModules?.includes(reg.id) ?? true}
onChange={e => onToggleModule(reg.id, e.target.checked)}
className="w-4 h-4 text-purple-600 rounded"
/>
<span className="text-xs text-gray-500">Aktiv</span>
</label>
)}
</div>
</div>
))}
@@ -25,6 +25,8 @@ interface ScopeDecisionTabProps {
supervisoryAuthorities?: SupervisoryAuthorityInfo[]
regulationAssessmentLoading?: boolean
onGoToObligations?: () => void
enabledModules?: string[]
onToggleModule?: (moduleId: string, enabled: boolean) => void
}
export function ScopeDecisionTab({
@@ -38,6 +40,8 @@ export function ScopeDecisionTab({
supervisoryAuthorities,
regulationAssessmentLoading,
onGoToObligations,
enabledModules,
onToggleModule,
}: ScopeDecisionTabProps) {
const [expandedTrigger, setExpandedTrigger] = useState<number | null>(null)
const [showAuditTrail, setShowAuditTrail] = useState(false)
@@ -71,6 +75,8 @@ export function ScopeDecisionTab({
applicableRegulations={applicableRegulations}
supervisoryAuthorities={supervisoryAuthorities}
regulationAssessmentLoading={regulationAssessmentLoading}
enabledModules={enabledModules}
onToggleModule={onToggleModule}
onGoToObligations={onGoToObligations}
/>