feat(generator): "Generate-All" bulk mode for recommended documents
CI / detect-changes (push) Successful in 7s
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 / sbom-scan (push) Has been skipped
CI / build-sha-integrity (push) Failing after 4s
CI / validate-canonical-controls (push) Successful in 11s
CI / loc-budget (push) Failing after 13s
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 2m19s
CI / test-go (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 / test-python-document-crawler (push) Has been skipped
CI / detect-changes (push) Successful in 7s
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 / sbom-scan (push) Has been skipped
CI / build-sha-integrity (push) Failing after 4s
CI / validate-canonical-controls (push) Successful in 11s
CI / loc-budget (push) Failing after 13s
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 2m19s
CI / test-go (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 / test-python-document-crawler (push) Has been skipped
Phase 2 of the workspace-cutover initiative: the Document Generator
gets a Bulk-Generate mode that produces every recommended document
in one click instead of forcing the user through 25+ per-template
clicks.
New: BulkGenerateModal.tsx (430 LOC)
- On open: POSTs current CompanyProfile + ComplianceScope answers
to /api/sdk/v1/compliance/recommend (Phase 1 endpoint)
- Matches each recommendation's document_type against allTemplates
- Shows tabular list: classification chip, title, document_type,
source citation; checkboxes pre-selected for required+recommended
(only where a template exists)
- On submit: sequentially renders each selected template using the
same pipeline as GeneratorSection (runRuleset → applyBlockRemoval
→ applyConditionalBlocks → placeholder replace), then POSTs
documents + version v1.0 draft
- Per-row progress: ⏳ generiere → ✓ erstellt / ✗ Fehler / —
übersprungen; final summary counts
page.tsx:
- Imports BulkGenerateModal
- Adds prominent "Empfohlene generieren →" CTA above the
RecommendedDocuments block
- Wires SDK state (companyProfile, complianceScope) into the modal
Profile mapper:
- CompanyProfile (camelCase): employeeCount, businessModel,
isDataProcessor → org_employee_count, org_business_model,
comp_has_processors
- ComplianceScope answers (questionId/value): pass through 1:1
since the rule system uses the same field names as the wizard
- compliance_depth_level pulled from decision.determinedLevel
End-to-end flow:
1. User completes CompanyProfile + ComplianceScope
2. Clicks "Empfohlene generieren →"
3. Reviews 25-30 prefilled checkboxes
4. Clicks "Generieren" — modal iterates, all docs land as drafts
in compliance_legal_documents + version v1.0
5. Phase 3 (next): document-library tab makes them findable
6. Phase 4 (next-next): workspace consumes these directly
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -16,6 +16,7 @@ import TemplateLibrary from './_components/TemplateLibrary'
|
||||
import GeneratorSection from './_components/GeneratorSection'
|
||||
import RecommendedDocuments from './_components/RecommendedDocuments'
|
||||
import { LifecycleFilter, filterTemplatesByStage } from './_components/LifecycleFilter'
|
||||
import BulkGenerateModal from './_components/BulkGenerateModal'
|
||||
import type { LifecycleStage } from '@/lib/sdk/founding/template-categories'
|
||||
|
||||
function DocumentGeneratorPageInner() {
|
||||
@@ -39,6 +40,7 @@ function DocumentGeneratorPageInner() {
|
||||
const generatorRef = useRef<HTMLDivElement>(null)
|
||||
|
||||
const [totalCount, setTotalCount] = useState<number>(0)
|
||||
const [showBulkGenerate, setShowBulkGenerate] = useState(false)
|
||||
|
||||
// Load all templates on mount
|
||||
useEffect(() => {
|
||||
@@ -332,6 +334,23 @@ function DocumentGeneratorPageInner() {
|
||||
countsByStage={countsByStage}
|
||||
/>
|
||||
|
||||
{/* Bulk-Generate-Knopf — alle empfohlenen Dokumente in einem Rutsch */}
|
||||
<div className="flex items-center justify-between bg-emerald-50 border border-emerald-200 rounded p-3">
|
||||
<div className="text-sm text-gray-700">
|
||||
<b>Alle empfohlenen Dokumente in einem Rutsch generieren.</b>
|
||||
<div className="text-xs text-gray-600 mt-0.5">
|
||||
Profil + Scope-Antworten werden gegen die Empfehlungs-Regeln ausgewertet —
|
||||
markierte Templates werden als Drafts v1.0 in die Document-Library angelegt.
|
||||
</div>
|
||||
</div>
|
||||
<button
|
||||
className="px-4 py-2 text-sm bg-emerald-600 text-white rounded hover:bg-emerald-700 whitespace-nowrap"
|
||||
onClick={() => setShowBulkGenerate(true)}
|
||||
>
|
||||
Empfohlene generieren →
|
||||
</button>
|
||||
</div>
|
||||
|
||||
{/* Recommended documents based on scope profile */}
|
||||
<RecommendedDocuments
|
||||
allTemplates={allTemplates}
|
||||
@@ -391,6 +410,18 @@ function DocumentGeneratorPageInner() {
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
|
||||
{showBulkGenerate && (
|
||||
<BulkGenerateModal
|
||||
allTemplates={allTemplates}
|
||||
context={context}
|
||||
extraPlaceholders={extraPlaceholders}
|
||||
enabledModules={enabledModules}
|
||||
companyProfile={state.companyProfile ?? null}
|
||||
complianceScope={state.complianceScope ?? null}
|
||||
onClose={() => setShowBulkGenerate(false)}
|
||||
/>
|
||||
)}
|
||||
</div>
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user