'use client' /** * Document Workflow Page (SDK Version) * * Split-view editor for legal documents with synchronized scrolling: * - Left: Current published version (read-only) * - Right: Draft/new version (editable) * - Approval workflow: Draft -> Review -> Approved -> Published * - DOCX upload with Word conversion * - Rich text editor with formatting toolbar */ import { useState, useEffect, useRef } from 'react' import { useSDK } from '@/lib/sdk' import StepHeader from '@/components/sdk/StepHeader/StepHeader' import { Document, Version } from './_types' import DocumentSelectorBar from './_components/DocumentSelectorBar' import WorkflowStatusBar from './_components/WorkflowStatusBar' import RichTextToolbar from './_components/RichTextToolbar' import SplitViewEditor from './_components/SplitViewEditor' import HistoryPanel from './_components/HistoryPanel' import CompareView from './_components/CompareView' import NewDocumentModal from './_components/NewDocumentModal' import ApprovalModal from './_components/ApprovalModal' import { useWorkflowActions } from './_hooks/useWorkflowActions' import { useRichTextEditor } from './_hooks/useRichTextEditor' import { useSyncScroll } from './_hooks/useSyncScroll' export default function WorkflowPage() { useSDK() const [documents, setDocuments] = useState([]) const [versions, setVersions] = useState([]) const [selectedDocument, setSelectedDocument] = useState(null) const [currentVersion, setCurrentVersion] = useState(null) const [draftVersion, setDraftVersion] = useState(null) const [loading, setLoading] = useState(true) const [error, setError] = useState(null) const [editedContent, setEditedContent] = useState('') const [editedTitle, setEditedTitle] = useState('') const [editedSummary, setEditedSummary] = useState('') const [showHistory, setShowHistory] = useState(false) const [showCompareView, setShowCompareView] = useState(false) const leftPanelRef = useRef(null) const rightPanelRef = useRef(null) const { editorRef, fileInputRef, uploading, uploadError, setUploadError, formatDoc, formatBlock, insertLink, updateEditorContent, handleWordUpload, handlePaste, } = useRichTextEditor(setEditedContent) useSyncScroll(leftPanelRef, rightPanelRef, [currentVersion, draftVersion]) const loadDocuments = async () => { setLoading(true) try { const res = await fetch('/api/admin/consent/documents') if (res.ok) { const data = await res.json() setDocuments(data.documents || []) if (data.documents?.length > 0 && !selectedDocument) { setSelectedDocument(data.documents[0]) } } } catch { setError('Fehler beim Laden der Dokumente') } finally { setLoading(false) } } const loadVersions = async (docId: string) => { try { const res = await fetch(`/api/admin/consent/documents/${docId}/versions`) if (res.ok) { const data = await res.json() const versionList = Array.isArray(data) ? data : (data.versions || []) setVersions(versionList) const published = versionList.find((v: Version) => v.status === 'published') setCurrentVersion(published || null) const draft = versionList.find((v: Version) => v.status === 'draft' || v.status === 'review' || v.status === 'approved' ) if (draft) { setDraftVersion(draft) setEditedContent(draft.content) setEditedTitle(draft.title) setEditedSummary(draft.summary || '') } else { setDraftVersion(null) setEditedContent(published?.content || '') setEditedTitle(published?.title || '') setEditedSummary(published?.summary || '') } } } catch { setError('Fehler beim Laden der Versionen') } } useEffect(() => { loadDocuments() }, []) useEffect(() => { if (selectedDocument) { loadVersions(selectedDocument.id) } }, [selectedDocument]) const actions = useWorkflowActions({ selectedDocument, setDocuments, setSelectedDocument, draftVersion, currentVersion, versions, editedTitle, editedContent, editedSummary, loadVersions, setError, }) const isEditable = draftVersion?.status === 'draft' || !draftVersion return (
{error && (
{error}
)} actions.setShowNewDocModal(true)} onCompareView={() => setShowCompareView(true)} onToggleHistory={() => { setShowHistory(!showHistory) if (draftVersion && !showHistory) { actions.loadApprovalHistory(draftVersion.id) } }} /> {loading ? (
) : !selectedDocument ? (
Bitte waehlen Sie ein Dokument aus
) : ( <> {isEditable && ( )} {uploadError && (
{uploadError}
)} {showHistory && ( )} )} {showCompareView && ( setShowCompareView(false)} onSaveDraft={actions.saveDraft} onSubmitForReview={actions.submitForReview} onShowApprovalModal={actions.setShowApprovalModal} onPublishVersion={actions.publishVersion} /> )} {actions.showNewDocModal && ( actions.setShowNewDocModal(false)} onCreate={actions.createDocument} creatingDoc={actions.creatingDoc} /> )} {actions.showApprovalModal && ( { actions.setShowApprovalModal(null) actions.setApprovalComment('') }} onConfirm={actions.showApprovalModal === 'approve' ? actions.approveVersion : actions.rejectVersion} saving={actions.saving} /> )}
) }