diff --git a/admin-compliance/app/sdk/consent-management/page.tsx b/admin-compliance/app/sdk/consent-management/page.tsx index 1446aef..2b59dd7 100644 --- a/admin-compliance/app/sdk/consent-management/page.tsx +++ b/admin-compliance/app/sdk/consent-management/page.tsx @@ -141,16 +141,24 @@ export default function ConsentManagementPage() { )} {activeTab === 'emails' && ( - +
+
+ + + +
+

E-Mail-Templates wurden zentralisiert

+

+ Alle E-Mail-Vorlagen (DSR, Consent, Breach, Training, etc.) werden jetzt zentral + im E-Mail-Template-Modul verwaltet — mit Versionierung, Freigabe-Workflow und Audit-Log. +

+ +
)} {activeTab === 'gdpr' && ( diff --git a/admin-compliance/app/sdk/document-generator/_components/GeneratorPreviewTab.tsx b/admin-compliance/app/sdk/document-generator/_components/GeneratorPreviewTab.tsx index 0478845..4ac76ca 100644 --- a/admin-compliance/app/sdk/document-generator/_components/GeneratorPreviewTab.tsx +++ b/admin-compliance/app/sdk/document-generator/_components/GeneratorPreviewTab.tsx @@ -12,6 +12,8 @@ interface GeneratorPreviewTabProps { missing: string[] onCopy: () => void onExportMarkdown: () => void + onSaveToWorkflow?: () => void + saveStatus?: string | null } // ============================================================================ @@ -87,6 +89,8 @@ export default function GeneratorPreviewTab({ missing, onCopy, onExportMarkdown, + onSaveToWorkflow, + saveStatus, }: GeneratorPreviewTabProps) { const [viewMode, setViewMode] = useState<'preview' | 'markdown'>('preview') @@ -196,6 +200,22 @@ export default function GeneratorPreviewTab({ > PDF drucken + {onSaveToWorkflow && ( + + )} diff --git a/admin-compliance/app/sdk/document-generator/_components/GeneratorSection.tsx b/admin-compliance/app/sdk/document-generator/_components/GeneratorSection.tsx index ea313e6..8f9342b 100644 --- a/admin-compliance/app/sdk/document-generator/_components/GeneratorSection.tsx +++ b/admin-compliance/app/sdk/document-generator/_components/GeneratorSection.tsx @@ -101,6 +101,45 @@ export default function GeneratorSection({ const handleCopy = () => navigator.clipboard.writeText(renderedContent) + const [saveStatus, setSaveStatus] = useState(null) + + const handleSaveToWorkflow = async () => { + setSaveStatus('saving') + try { + // 1. Create or find document + const docRes = await fetch('/api/sdk/v1/compliance/legal-documents/documents', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + type: template.templateType || 'custom', + name: template.documentTitle || 'Dokument', + description: `Generiert aus Template: ${template.templateType}`, + }), + }) + if (!docRes.ok) throw new Error('Dokument konnte nicht erstellt werden') + const doc = await docRes.json() + + // 2. Create version + const verRes = await fetch('/api/sdk/v1/compliance/legal-documents/versions', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ + document_id: doc.id, + title: template.documentTitle || 'Dokument', + content: renderedContent, + language: template.language || 'de', + version: '1.0', + }), + }) + if (!verRes.ok) throw new Error('Version konnte nicht erstellt werden') + setSaveStatus('saved') + setTimeout(() => setSaveStatus(null), 3000) + } catch (e) { + setSaveStatus('error') + setTimeout(() => setSaveStatus(null), 3000) + } + } + const handleExportMarkdown = () => { const blob = new Blob([renderedContent], { type: 'text/markdown' }) const url = URL.createObjectURL(blob) @@ -250,6 +289,8 @@ export default function GeneratorSection({ missing={missing} onCopy={handleCopy} onExportMarkdown={handleExportMarkdown} + onSaveToWorkflow={handleSaveToWorkflow} + saveStatus={saveStatus} /> )}