feat(workflow): 5-Stage Lifecycle UI im Compliance Workflow-Editor
CI / detect-changes (push) Successful in 8s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / build-sha-integrity (push) Failing after 4s
CI / validate-canonical-controls (push) Successful in 10s
CI / loc-budget (push) Successful in 14s
CI / sbom-scan (push) Has been skipped
CI / test-python-backend (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m42s
CI / test-go (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
CI / detect-changes (push) Successful in 8s
CI / branch-name (push) Has been skipped
CI / guardrail-integrity (push) Has been skipped
CI / secret-scan (push) Has been skipped
CI / dep-audit (push) Has been skipped
CI / build-sha-integrity (push) Failing after 4s
CI / validate-canonical-controls (push) Successful in 10s
CI / loc-budget (push) Successful in 14s
CI / sbom-scan (push) Has been skipped
CI / test-python-backend (push) Has been skipped
CI / iace-gt-coverage (push) Has been skipped
CI / test-python-dsms-gateway (push) Has been skipped
CI / go-lint (push) Has been skipped
CI / python-lint (push) Has been skipped
CI / nodejs-lint (push) Has been skipped
CI / nodejs-build (push) Successful in 2m42s
CI / test-go (push) Has been skipped
CI / test-python-document-crawler (push) Has been skipped
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) <noreply@anthropic.com>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
'use client'
|
||||
|
||||
import { Version, STATUS_LABELS } from '../_types'
|
||||
import type { ApprovalModalMode } from './ApprovalModal'
|
||||
|
||||
interface CompareViewProps {
|
||||
currentVersion: Version | null
|
||||
@@ -9,7 +10,7 @@ interface CompareViewProps {
|
||||
onClose: () => void
|
||||
onSaveDraft: () => void
|
||||
onSubmitForReview: () => void
|
||||
onShowApprovalModal: (mode: 'approve' | 'reject') => void
|
||||
onShowApprovalModal: (mode: ApprovalModalMode) => void
|
||||
onPublishVersion: () => void
|
||||
}
|
||||
|
||||
@@ -64,28 +65,26 @@ export default function CompareView({
|
||||
|
||||
{/* Right: Draft */}
|
||||
<div className="bg-white flex flex-col">
|
||||
<div className={`border-b px-4 py-2 ${
|
||||
draftVersion?.status === 'draft' ? 'bg-yellow-100 border-yellow-200' :
|
||||
draftVersion?.status === 'review' ? 'bg-blue-100 border-blue-200' :
|
||||
draftVersion?.status === 'approved' ? 'bg-green-100 border-green-200' :
|
||||
'bg-slate-100 border-slate-200'
|
||||
}`}>
|
||||
<span className={`font-medium ${
|
||||
draftVersion?.status === 'draft' ? 'text-yellow-800' :
|
||||
draftVersion?.status === 'review' ? 'text-blue-800' :
|
||||
draftVersion?.status === 'approved' ? 'text-green-800' :
|
||||
'text-slate-800'
|
||||
}`}>
|
||||
<div
|
||||
className={`border-b px-4 py-2 ${
|
||||
draftVersion?.status === 'draft'
|
||||
? 'bg-yellow-100 border-yellow-200'
|
||||
: draftVersion?.status === 'review' || draftVersion?.status === 'review_internal'
|
||||
? 'bg-blue-100 border-blue-200'
|
||||
: draftVersion?.status === 'review_client'
|
||||
? 'bg-indigo-100 border-indigo-200'
|
||||
: draftVersion?.status === 'approved'
|
||||
? 'bg-green-100 border-green-200'
|
||||
: 'bg-slate-100 border-slate-200'
|
||||
}`}
|
||||
>
|
||||
<span className="font-medium text-slate-800">
|
||||
{draftVersion ? 'Aenderungsversion' : 'Neue Version'}
|
||||
</span>
|
||||
{draftVersion && (
|
||||
<span className={`ml-2 ${
|
||||
draftVersion.status === 'draft' ? 'text-yellow-600' :
|
||||
draftVersion.status === 'review' ? 'text-blue-600' :
|
||||
draftVersion.status === 'approved' ? 'text-green-600' :
|
||||
'text-slate-600'
|
||||
}`}>
|
||||
v{draftVersion.version} - {STATUS_LABELS[draftVersion.status].label}
|
||||
<span className="ml-2 text-slate-600">
|
||||
v{draftVersion.version} -{' '}
|
||||
{STATUS_LABELS[draftVersion.status]?.label ?? draftVersion.status}
|
||||
</span>
|
||||
)}
|
||||
</div>
|
||||
@@ -113,7 +112,7 @@ export default function CompareView({
|
||||
</button>
|
||||
</>
|
||||
)}
|
||||
{draftVersion?.status === 'review' && (
|
||||
{draftVersion?.status === 'review_internal' && (
|
||||
<>
|
||||
<button
|
||||
onClick={() => { onClose(); onShowApprovalModal('reject') }}
|
||||
@@ -122,10 +121,26 @@ export default function CompareView({
|
||||
Ablehnen
|
||||
</button>
|
||||
<button
|
||||
onClick={() => { onClose(); onShowApprovalModal('approve') }}
|
||||
onClick={() => { onClose(); onShowApprovalModal('approve-internal') }}
|
||||
className="px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-500"
|
||||
>
|
||||
Freigeben
|
||||
DSB-Freigabe → Mandant
|
||||
</button>
|
||||
</>
|
||||
)}
|
||||
{draftVersion?.status === 'review_client' && (
|
||||
<>
|
||||
<button
|
||||
onClick={() => { onClose(); onShowApprovalModal('reject') }}
|
||||
className="px-4 py-2 bg-red-600 text-white rounded-lg hover:bg-red-500"
|
||||
>
|
||||
Ablehnen
|
||||
</button>
|
||||
<button
|
||||
onClick={() => { onClose(); onShowApprovalModal('approve-client') }}
|
||||
className="px-4 py-2 bg-green-600 text-white rounded-lg hover:bg-green-500"
|
||||
>
|
||||
Mandanten-Freigabe
|
||||
</button>
|
||||
</>
|
||||
)}
|
||||
|
||||
Reference in New Issue
Block a user