From 79ce12caf113e2d079187802e4349276f1497c4f Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Mon, 8 Jun 2026 10:15:32 +0200 Subject: [PATCH] feat(workflow): 5-Stage Lifecycle UI im Compliance Workflow-Editor MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Erweitert Phase 1 (Backend 5-Stage Lifecycle, Migration 148) jetzt auch im Frontend: Status-Pills, Buttons und Modal-Texte differenzieren nun zwischen DSB- und Mandanten-Pruefung. - WorkflowStatusBar zeigt 5 Schritte: draft -> review_internal -> review_client -> approved -> published, mit status-spezifischen Action-Buttons (Save/Submit, DSB-Freigabe, Mandant-Freigabe, Publish). - ApprovalModal differenziert Mode 'approve-internal' / 'approve-client' / 'reject' mit eigenen Titles und Button-Labels. - useWorkflowActions ruft neue Endpoints /approve-internal und /approve-client (Backend Phase 1); approveVersion bleibt als Backward-Compat-Alias. - page.tsx leitet Modal-Confirm an passende Action weiter und akzeptiert review_internal/review_client im draftVersion-Filter. - _types.ts: Status-Union + STATUS_LABELS um beide Review-Stufen erweitert; alter 'review'-Wert bleibt fuer Bestandsdaten erhalten. - CompareView, SplitViewEditor, HistoryPanel: Status-Rendering und neue Action-Labels (submitted_internal, approved_internal, approved_client). LOC-Exception fuer admin-compliance/lib/sdk/types/sdk-steps.ts (525): zentrale SDK-Step-Registry mit kanonischer Reihenfolge — splits wuerden die globale seq-Garantie zerreissen. [guardrail-change] Co-Authored-By: Claude Opus 4.7 (1M context) --- .claude/rules/loc-exceptions.txt | 8 ++ .../workflow/_components/ApprovalModal.tsx | 41 +++++--- .../sdk/workflow/_components/CompareView.tsx | 61 +++++++----- .../sdk/workflow/_components/HistoryPanel.tsx | 43 +++++++-- .../workflow/_components/SplitViewEditor.tsx | 36 ++++--- .../_components/WorkflowStatusBar.tsx | 95 +++++++++++++------ .../sdk/workflow/_hooks/useWorkflowActions.ts | 42 +++++++- admin-compliance/app/sdk/workflow/_types.ts | 12 ++- admin-compliance/app/sdk/workflow/page.tsx | 14 ++- 9 files changed, 254 insertions(+), 98 deletions(-) diff --git a/.claude/rules/loc-exceptions.txt b/.claude/rules/loc-exceptions.txt index 48ffb95a..0264aebb 100644 --- a/.claude/rules/loc-exceptions.txt +++ b/.claude/rules/loc-exceptions.txt @@ -134,6 +134,14 @@ docs-src/Breakpilot ComplAI Finanzplan.xlsm # Phase 5+ target for splitting into smaller subcomponents per wizard step. admin-compliance/components/sdk/ai-act/DecisionTreeWizard.tsx +# --- admin-compliance: zentrale SDK-Schritt-Registry --- +# Flache Liste aller 38 SDK-Steps mit kanonischer Reihenfolge (seq). +# Splits nach Paket würden die globale Ordnungs-Garantie zerreißen und +# Imports an mehreren Stellen aufblähen — der Wert dieser Datei ist +# *eine* sortierte Source-of-Truth. +# [guardrail-change] +admin-compliance/lib/sdk/types/sdk-steps.ts + # --- ai-compliance-sdk: oversized handler refactor backlog --- # Phase 5+ target for splitting handler groups into per-resource files. ai-compliance-sdk/internal/api/handlers/tender_handlers.go diff --git a/admin-compliance/app/sdk/workflow/_components/ApprovalModal.tsx b/admin-compliance/app/sdk/workflow/_components/ApprovalModal.tsx index 1c6caedf..18a8cd30 100644 --- a/admin-compliance/app/sdk/workflow/_components/ApprovalModal.tsx +++ b/admin-compliance/app/sdk/workflow/_components/ApprovalModal.tsx @@ -1,7 +1,9 @@ 'use client' +export type ApprovalModalMode = 'approve-internal' | 'approve-client' | 'reject' + interface ApprovalModalProps { - mode: 'approve' | 'reject' + mode: ApprovalModalMode approvalComment: string onCommentChange: (comment: string) => void onCancel: () => void @@ -9,6 +11,26 @@ interface ApprovalModalProps { saving: boolean } +const TITLES: Record = { + 'approve-internal': 'DSB-Freigabe → an Mandant weiterleiten', + 'approve-client': 'Mandanten-Freigabe erteilen', + reject: 'Version ablehnen', +} + +const BUTTON_LABELS: Record = { + 'approve-internal': 'DSB-Freigabe erteilen', + 'approve-client': 'Mandanten-Freigabe erteilen', + reject: 'Ablehnen', +} + +const PLACEHOLDERS: Record = { + 'approve-internal': + 'Kommentar (optional) — Hinweise für den Mandanten...', + 'approve-client': + 'Kommentar (optional) — z.B. Freigabe durch Geschäftsführung...', + reject: 'Ablehnungsgrund...', +} + export default function ApprovalModal({ mode, approvalComment, @@ -17,18 +39,17 @@ export default function ApprovalModal({ onConfirm, saving, }: ApprovalModalProps) { + const isReject = mode === 'reject' return (
-

- {mode === 'approve' ? 'Version freigeben' : 'Version ablehnen'} -

+

{TITLES[mode]}