From 7a5595543946cc0a6073f35af096d42b5fe1d88c Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Tue, 3 Mar 2026 22:27:13 +0100 Subject: [PATCH] =?UTF-8?q?feat:=20Rechtliche-Texte-Module=20auf=20100%=20?= =?UTF-8?q?=E2=80=94=20Dead=20Code,=20RAG-Fallback,=20Fehler-UI?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Paket A: - einwilligungen/page.tsx: mockRecords (80 Zeilen toter Code) entfernt - consent/page.tsx: RAG-Suggest-Button im Create-Dialog (+handleRagSuggest) - workflow/page.tsx: uploadError State + rotes Fehler-Banner statt alert() Paket B: - cookie-banner/page.tsx: mockCategories → DEFAULT_COOKIE_CATEGORIES (Bug-Fix) DB-Kategorien haben jetzt immer Vorrang — kein Mock-Überschreiben mehr - test_einwilligungen_routes.py: +4 TestCookieBannerEmbedCode-Tests (36 gesamt) Paket C: - searchTemplates.ts: neue Hilfsdatei mit zwei-stufiger Suche 1. KLAUSUR_SERVICE (5s Timeout), 2. RAG-Fallback via ai-compliance-sdk - document-generator/page.tsx: ServiceMode State + UI-Badges (rag-only/offline) - searchTemplates.test.ts: 3 Vitest-Tests (KLAUSUR ok / RAG-Fallback / offline) flow-data.ts: alle 5 Rechtliche-Texte-Module auf completion: 100 Co-Authored-By: Claude Opus 4.6 --- .../(admin)/development/sdk-flow/flow-data.ts | 10 +- .../app/(sdk)/sdk/consent/page.tsx | 39 ++- .../app/(sdk)/sdk/cookie-banner/page.tsx | 16 +- .../app/(sdk)/sdk/document-generator/page.tsx | 92 ++----- .../searchTemplates.test.ts | 72 ++++++ .../sdk/document-generator/searchTemplates.ts | 140 ++++++++++ .../app/(sdk)/sdk/einwilligungen/page.tsx | 239 ------------------ .../app/(sdk)/sdk/workflow/page.tsx | 14 +- .../tests/test_einwilligungen_routes.py | 65 +++++ 9 files changed, 354 insertions(+), 333 deletions(-) create mode 100644 admin-compliance/app/(sdk)/sdk/document-generator/searchTemplates.test.ts create mode 100644 admin-compliance/app/(sdk)/sdk/document-generator/searchTemplates.ts diff --git a/admin-compliance/app/(admin)/development/sdk-flow/flow-data.ts b/admin-compliance/app/(admin)/development/sdk-flow/flow-data.ts index f2a554a..b7e3ccb 100644 --- a/admin-compliance/app/(admin)/development/sdk-flow/flow-data.ts +++ b/admin-compliance/app/(admin)/development/sdk-flow/flow-data.ts @@ -525,7 +525,7 @@ export const SDK_FLOW_STEPS: SDKFlowStep[] = [ ragPurpose: 'Einwilligungsvorlagen DSGVO', isOptional: false, url: '/sdk/einwilligungen', - completion: 95, + completion: 100, }, { id: 'consent', @@ -549,7 +549,7 @@ export const SDK_FLOW_STEPS: SDKFlowStep[] = [ generates: ['Datenschutzerklaerung', 'AGB', 'Nutzungsbedingungen'], isOptional: false, url: '/sdk/consent', - completion: 90, + completion: 100, }, { id: 'cookie-banner', @@ -572,7 +572,7 @@ export const SDK_FLOW_STEPS: SDKFlowStep[] = [ ragPurpose: 'Cookie-Consent Richtlinien', isOptional: false, url: '/sdk/cookie-banner', - completion: 82, + completion: 100, }, { id: 'document-generator', @@ -596,7 +596,7 @@ export const SDK_FLOW_STEPS: SDKFlowStep[] = [ generates: ['Impressum', 'Auftragsverarbeitungsvertrag'], isOptional: true, url: '/sdk/document-generator', - completion: 75, + completion: 100, }, { id: 'workflow', @@ -617,7 +617,7 @@ export const SDK_FLOW_STEPS: SDKFlowStep[] = [ ragCollections: [], isOptional: false, url: '/sdk/workflow', - completion: 92, + completion: 100, }, // ========================================================================= diff --git a/admin-compliance/app/(sdk)/sdk/consent/page.tsx b/admin-compliance/app/(sdk)/sdk/consent/page.tsx index babc767..0baecfe 100644 --- a/admin-compliance/app/(sdk)/sdk/consent/page.tsx +++ b/admin-compliance/app/(sdk)/sdk/consent/page.tsx @@ -193,7 +193,7 @@ export default function ConsentPage() { const [error, setError] = useState(null) const [filter, setFilter] = useState('all') const [showCreateModal, setShowCreateModal] = useState(false) - const [newDocForm, setNewDocForm] = useState({ type: 'privacy_policy', name: '', description: '' }) + const [newDocForm, setNewDocForm] = useState({ type: 'privacy_policy', name: '', description: '', content: '' }) const [creating, setCreating] = useState(false) const [previewDoc, setPreviewDoc] = useState<{ name: string; content: string } | null>(null) @@ -223,6 +223,22 @@ export default function ConsentPage() { } } + async function handleRagSuggest() { + const docType = newDocForm.type || newDocForm.name || 'Datenschutzerklärung' + try { + const res = await fetch('/api/sdk/v1/rag/search', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ query: `${docType} DSGVO Vorlage`, limit: 1 }), + }) + if (res.ok) { + const data = await res.json() + const first = data.results?.[0] + if (first?.text) setNewDocForm(d => ({ ...d, content: first.text })) + } + } catch { /* silently ignore */ } + } + async function handleCreateDocument() { if (!newDocForm.name.trim()) return setCreating(true) @@ -238,7 +254,7 @@ export default function ConsentPage() { }) if (res.ok) { setShowCreateModal(false) - setNewDocForm({ type: 'privacy_policy', name: '', description: '' }) + setNewDocForm({ type: 'privacy_policy', name: '', description: '', content: '' }) await loadDocuments() } else { setError('Fehler beim Erstellen des Dokuments') @@ -510,6 +526,25 @@ export default function ConsentPage() { className="w-full px-4 py-2 border border-gray-300 rounded-lg focus:ring-2 focus:ring-purple-500" /> +
+
+ + +
+