From 9f4c4abb84e82187b7e8ff1ea6c925c6ccb1ffcb Mon Sep 17 00:00:00 2001 From: Benjamin Admin Date: Fri, 1 May 2026 11:06:56 +0200 Subject: [PATCH] feat: Document recommendation UI in generator MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit New RecommendedDocuments component shown above the template library: - Evaluates scope answers + compliance level (L1-L4) - Groups templates into required/recommended/optional - Shows profile label (Startup/KMU/Extended/Enterprise) - Cards link to actual templates — click opens in generator - Optional section collapsed by default - Only visible when scope has been completed Renders as purple gradient panel with grid cards, each showing template name and availability status. Co-Authored-By: Claude Opus 4.6 (1M context) --- .../_components/RecommendedDocuments.tsx | 130 ++++++++++++++++++ .../app/sdk/document-generator/page.tsx | 7 + 2 files changed, 137 insertions(+) create mode 100644 admin-compliance/app/sdk/document-generator/_components/RecommendedDocuments.tsx diff --git a/admin-compliance/app/sdk/document-generator/_components/RecommendedDocuments.tsx b/admin-compliance/app/sdk/document-generator/_components/RecommendedDocuments.tsx new file mode 100644 index 0000000..00da598 --- /dev/null +++ b/admin-compliance/app/sdk/document-generator/_components/RecommendedDocuments.tsx @@ -0,0 +1,130 @@ +'use client' + +import { useMemo, useState } from 'react' +import { useSDK } from '@/lib/sdk' +import { evaluateTemplateRecommendations, type TemplateRecommendation } from '../templateRecommendations' +import { getProfileLabel } from '../scopeDefaults' +import type { LegalTemplateResult } from '@/lib/sdk/types' +import type { ComplianceDepthLevel } from '@/lib/sdk/compliance-scope-types/core-levels' + +interface Props { + allTemplates: LegalTemplateResult[] + onUseTemplate: (t: LegalTemplateResult) => void +} + +export default function RecommendedDocuments({ allTemplates, onUseTemplate }: Props) { + const { state } = useSDK() + const [showOptional, setShowOptional] = useState(false) + + const level = state?.complianceScope?.determinedLevel as ComplianceDepthLevel | undefined + const scopeAnswers = state?.complianceScope?.answers || [] + + const recommendations = useMemo(() => { + if (!level) return null + return evaluateTemplateRecommendations( + scopeAnswers, + level, + (state?.companyProfile as Record) || {}, + ) + }, [level, scopeAnswers, state?.companyProfile]) + + if (!level || !recommendations || recommendations.length === 0) return null + + // Match recommendations to actual templates in the library + const templateMap = new Map() + for (const t of allTemplates) { + if (t.templateType) templateMap.set(t.templateType, t) + } + + const required = recommendations.filter((r) => r.requirement === 'required') + const recommended = recommendations.filter((r) => r.requirement === 'recommended') + const optional = recommendations.filter((r) => r.requirement === 'optional') + + const renderCard = (rec: TemplateRecommendation) => { + const template = templateMap.get(rec.templateType) + const exists = !!template + + return ( +
exists && template && onUseTemplate(template)} + > +
{rec.label}
+
+ {exists ? ( + Vorlage verfuegbar + ) : ( + Noch nicht erstellt + )} +
+
+ ) + } + + return ( +
+
+
+

+ Empfohlene Dokumente fuer Ihr Unternehmen +

+

+ Basierend auf Ihrem Compliance-Profil ({getProfileLabel(level)}) +

+
+ + {level} + +
+ + {/* Required */} + {required.length > 0 && ( +
+
+ Pflicht + ({required.length}) +
+
+ {required.map(renderCard)} +
+
+ )} + + {/* Recommended */} + {recommended.length > 0 && ( +
+
+ Empfohlen + ({recommended.length}) +
+
+ {recommended.map(renderCard)} +
+
+ )} + + {/* Optional (collapsed by default) */} + {optional.length > 0 && ( +
+ + {showOptional && ( +
+ {optional.map(renderCard)} +
+ )} +
+ )} +
+ ) +} diff --git a/admin-compliance/app/sdk/document-generator/page.tsx b/admin-compliance/app/sdk/document-generator/page.tsx index a0365ce..986fbb7 100644 --- a/admin-compliance/app/sdk/document-generator/page.tsx +++ b/admin-compliance/app/sdk/document-generator/page.tsx @@ -14,6 +14,7 @@ import { CATEGORIES } from './_constants' import { getGeneratorDefaults, getProfileLabel } from './scopeDefaults' import TemplateLibrary from './_components/TemplateLibrary' import GeneratorSection from './_components/GeneratorSection' +import RecommendedDocuments from './_components/RecommendedDocuments' function DocumentGeneratorPageInner() { const { state } = useSDK() @@ -191,6 +192,12 @@ function DocumentGeneratorPageInner() { + {/* Recommended documents based on scope profile */} + +