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:
@@ -2,6 +2,7 @@
|
||||
|
||||
import { useState } from 'react'
|
||||
import { Document, Version, ApprovalHistoryItem } from '../_types'
|
||||
import type { ApprovalModalMode } from '../_components/ApprovalModal'
|
||||
|
||||
interface UseWorkflowActionsParams {
|
||||
selectedDocument: Document | null
|
||||
@@ -27,7 +28,7 @@ export function useWorkflowActions(params: UseWorkflowActionsParams) {
|
||||
|
||||
const [saving, setSaving] = useState(false)
|
||||
const [approvalComment, setApprovalComment] = useState('')
|
||||
const [showApprovalModal, setShowApprovalModal] = useState<'approve' | 'reject' | null>(null)
|
||||
const [showApprovalModal, setShowApprovalModal] = useState<ApprovalModalMode | null>(null)
|
||||
const [approvalHistory, setApprovalHistory] = useState<ApprovalHistoryItem[]>([])
|
||||
const [showNewDocModal, setShowNewDocModal] = useState(false)
|
||||
const [newDocForm, setNewDocForm] = useState({ type: 'privacy_policy', name: '', description: '' })
|
||||
@@ -123,10 +124,15 @@ export function useWorkflowActions(params: UseWorkflowActionsParams) {
|
||||
}
|
||||
|
||||
const approveVersion = async () => {
|
||||
// Backward-compat alias — leitet auf approve-internal (DSB → Mandant)
|
||||
return approveInternal()
|
||||
}
|
||||
|
||||
const approveInternal = async () => {
|
||||
if (!draftVersion) return
|
||||
setSaving(true)
|
||||
try {
|
||||
const res = await fetch(`/api/admin/consent/versions/${draftVersion.id}/approve`, {
|
||||
const res = await fetch(`/api/admin/consent/versions/${draftVersion.id}/approve-internal`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ comment: approvalComment }),
|
||||
@@ -138,10 +144,35 @@ export function useWorkflowActions(params: UseWorkflowActionsParams) {
|
||||
await loadVersions(selectedDocument!.id)
|
||||
} else {
|
||||
const err = await res.json()
|
||||
setError(err.error || 'Fehler bei der Freigabe')
|
||||
setError(err.error || 'Fehler bei der DSB-Freigabe')
|
||||
}
|
||||
} catch {
|
||||
setError('Fehler bei der Freigabe')
|
||||
setError('Fehler bei der DSB-Freigabe')
|
||||
} finally {
|
||||
setSaving(false)
|
||||
}
|
||||
}
|
||||
|
||||
const approveClient = async () => {
|
||||
if (!draftVersion) return
|
||||
setSaving(true)
|
||||
try {
|
||||
const res = await fetch(`/api/admin/consent/versions/${draftVersion.id}/approve-client`, {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ comment: approvalComment }),
|
||||
})
|
||||
|
||||
if (res.ok) {
|
||||
setShowApprovalModal(null)
|
||||
setApprovalComment('')
|
||||
await loadVersions(selectedDocument!.id)
|
||||
} else {
|
||||
const err = await res.json()
|
||||
setError(err.error || 'Fehler bei der Mandanten-Freigabe')
|
||||
}
|
||||
} catch {
|
||||
setError('Fehler bei der Mandanten-Freigabe')
|
||||
} finally {
|
||||
setSaving(false)
|
||||
}
|
||||
@@ -242,7 +273,8 @@ export function useWorkflowActions(params: UseWorkflowActionsParams) {
|
||||
newDocForm, setNewDocForm,
|
||||
creatingDoc,
|
||||
createNewDraft, saveDraft, submitForReview,
|
||||
approveVersion, rejectVersion, publishVersion,
|
||||
approveVersion, approveInternal, approveClient,
|
||||
rejectVersion, publishVersion,
|
||||
createDocument, loadApprovalHistory,
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user