feat(L1-L3): Dokumente-Generator — Briefpapier+Block-System+Drag&Drop-Editor+Renderer
Check Cross-Plugin Imports / check (push) Has been cancelled

- Briefpapier (letterheads): Seiten-Setup (A4/A5/Letter, Ränder), Header/Footer-Blöcke, Wasserzeichen, Logo-Upload (DocumentAsset, data:-URI-only)
- Druckvorlagen (print_templates): Block-Komposition mit Briefpapier-Ref + entity_type
- Block-Registry (document_blocks.py): text/image/shape(line/rect/circle)/table/spacer/divider/placeholder/pagebreak + Modul-Beiträge via document_blocks()-Contract
- Renderer (document_renderer.py): Blocks→HTML→PDF via WeasyPrint (SSRF-Sandbox data:-URI-only), @page-Frame mit running header/footer, Placeholder-Beispiel-Defaults gegen StrictUndefined
- Contract-Beitrag contacts: document_placeholders/document_data (#359-Muster wie importexport_entities)
- 13 neue Endpoints in documents.py: Letterhead-CRUD, Template-CRUD, Assets, document-blocks, document-placeholders, preview (HTML), render (PDF)
- Migration: Plugin-SQL 0003 (idempotent) + Alembic 0143 (Dual-Path, RLS fail-closed crm_api)
- Frontend: api/documents.ts, Settings→Dokumente (settings_pages), BlockEditor (@dnd-kit Palette/Canvas/Config/Live-Preview-iframe), LetterheadEditor, PrintTemplateEditor, DocumentGenerationDialog (global, ContactDetailPage-Integration)
- i18n de/en, api-documentation.md, plugin-development-guide.md, PROGRESS.md

Verifikation: 32/32 neue Tests + 9/9 Regressionen, tsc exit 0, Build OK 2.79s, Alembic-Fresh-DB 0143 mit RLS bewiesen, ruff clean
This commit is contained in:
Agent Zero
2026-08-29 09:49:16 +02:00
parent fa429c3a88
commit b311ab7aa1
25 changed files with 4510 additions and 11 deletions
+95 -1
View File
@@ -331,7 +331,8 @@
"livePreviewDescription": "So sieht die Anwendung mit dem aktuellen Theme aus",
"resetTheme": "Zurücksetzen",
"saveTheme": "Theme speichern",
"mcp": "MCP"
"mcp": "MCP",
"documents": "Dokumente"
},
"auditLog": {
"title": "Audit-Log",
@@ -1466,5 +1467,98 @@
"failed": "fehlgeschlagen",
"importDone": "Import abgeschlossen",
"backgroundRunning": "Import läuft im Hintergrund …"
},
"documents": {
"settings": {
"subtitle": "Briefpapiere und Druckvorlagen mit Drag&Drop-Editor verwalten",
"tabs": "Dokumente-Bereiche"
},
"letterheads": "Briefpapiere",
"printTemplates": "Druckvorlagen",
"letterhead": {
"create": "Neues Briefpapier",
"edit": "Briefpapier bearbeiten",
"empty": "Noch kein Briefpapier angelegt.",
"default": "Standard",
"deleted": "Briefpapier gelöscht",
"deleteConfirm": "Briefpapier wirklich löschen?",
"nameRequired": "Name ist erforderlich",
"saved": "Briefpapier gespeichert",
"created": "Briefpapier angelegt",
"isDefault": "Als Standard-Briefpapier verwenden"
},
"template": {
"create": "Neue Vorlage",
"edit": "Vorlage bearbeiten",
"empty": "Noch keine Druckvorlage angelegt.",
"deleted": "Vorlage gelöscht",
"deleteConfirm": "Vorlage wirklich löschen?",
"nameRequired": "Name ist erforderlich",
"saved": "Vorlage gespeichert",
"created": "Vorlage angelegt",
"saveFailed": "Speichern fehlgeschlagen — Blöcke prüfen",
"noLetterhead": "Ohne Briefpapier",
"entityType": "Datenquelle (Modul)",
"entityTypeHint": "Bestimmt die verfügbaren Platzhalter (Modul-Beitrag)"
},
"page": {
"size": "Seitenformat",
"orientation": "Ausrichtung",
"portrait": "Hochformat",
"landscape": "Querformat",
"margins": "Seitenränder (mm)"
},
"watermark": "Wasserzeichen",
"watermarkText": "z.B. ENTWURF",
"header": "Kopfzeile",
"footer": "Fußzeile",
"assets": "Bilder & Logos",
"asset": {
"upload": "Bild hochladen",
"uploaded": "Bild hochgeladen (ID in Zwischenablage)",
"uploadFailed": "Upload fehlgeschlagen",
"empty": "Noch keine Bilder.",
"saveFirst": "Briefpapier erst speichern, dann Bilder hochladen."
},
"editor": {
"palette": "Blöcke",
"canvas": "Reihenfolge",
"configPreview": "Konfiguration & Vorschau",
"empty": "Blöcke aus der Palette hinzufügen",
"selectBlock": "Block in der Reihenfolge-Liste auswählen, um ihn zu konfigurieren.",
"content": "Inhalt",
"placeholdersHint": "{{platzhalter}} möglich",
"bold": "Fett",
"italic": "Kursiv",
"shape": "Form",
"line": "Linie",
"rect": "Rechteck",
"circle": "Kreis",
"width": "Breite",
"height": "Höhe (px)",
"color": "Farbe",
"background": "Füllung",
"thickness": "Dicke (px)",
"assetId": "Asset-ID (Briefpapier-Upload)",
"align": "Ausrichtung",
"left": "Links",
"center": "Zentriert",
"right": "Rechts",
"columns": "Spalten (Komma-getrennt)",
"rows": "Zeilen (JSON)",
"placeholderKey": "Datenfeld",
"label": "Anzeige-Label",
"preview": "Live-Vorschau",
"pagebreakHint": "Erzwingt einen Seitenwechsel im PDF.",
"noConfig": "Keine Konfiguration für diesen Block-Typ."
},
"dialog": {
"title": "Dokument erstellen",
"for": "Für",
"generate": "Erstellen",
"generated": "Dokument wurde erstellt",
"generateFailed": "Dokument konnte nicht erstellt werden",
"noTemplates": "Keine Druckvorlagen für diesen Datentyp. Vorlagen unter Einstellungen → Dokumente anlegen."
}
}
}
+95 -1
View File
@@ -331,7 +331,8 @@
"livePreviewDescription": "This is how the app looks with the current theme",
"resetTheme": "Reset",
"saveTheme": "Save theme",
"mcp": "MCP"
"mcp": "MCP",
"documents": "Documents"
},
"auditLog": {
"title": "Audit Log",
@@ -1466,5 +1467,98 @@
"failed": "failed",
"importDone": "Import finished",
"backgroundRunning": "Import running in background …"
},
"documents": {
"settings": {
"subtitle": "Manage letterheads and print templates with the drag&drop editor",
"tabs": "Document sections"
},
"letterheads": "Letterheads",
"printTemplates": "Print Templates",
"letterhead": {
"create": "New Letterhead",
"edit": "Edit Letterhead",
"empty": "No letterhead yet.",
"default": "Default",
"deleted": "Letterhead deleted",
"deleteConfirm": "Delete this letterhead?",
"nameRequired": "Name is required",
"saved": "Letterhead saved",
"created": "Letterhead created",
"isDefault": "Use as default letterhead"
},
"template": {
"create": "New Template",
"edit": "Edit Template",
"empty": "No print template yet.",
"deleted": "Template deleted",
"deleteConfirm": "Delete this template?",
"nameRequired": "Name is required",
"saved": "Template saved",
"created": "Template created",
"saveFailed": "Save failed — check blocks",
"noLetterhead": "Without letterhead",
"entityType": "Data source (module)",
"entityTypeHint": "Determines available placeholders (module contribution)"
},
"page": {
"size": "Page size",
"orientation": "Orientation",
"portrait": "Portrait",
"landscape": "Landscape",
"margins": "Margins (mm)"
},
"watermark": "Watermark",
"watermarkText": "e.g. DRAFT",
"header": "Header",
"footer": "Footer",
"assets": "Images & Logos",
"asset": {
"upload": "Upload image",
"uploaded": "Image uploaded (ID copied to clipboard)",
"uploadFailed": "Upload failed",
"empty": "No images yet.",
"saveFirst": "Save the letterhead first, then upload images."
},
"editor": {
"palette": "Blocks",
"canvas": "Order",
"configPreview": "Configuration & Preview",
"empty": "Add blocks from the palette",
"selectBlock": "Select a block in the order list to configure it.",
"content": "Content",
"placeholdersHint": "{{placeholder}} supported",
"bold": "Bold",
"italic": "Italic",
"shape": "Shape",
"line": "Line",
"rect": "Rectangle",
"circle": "Circle",
"width": "Width",
"height": "Height (px)",
"color": "Color",
"background": "Fill",
"thickness": "Thickness (px)",
"assetId": "Asset ID (letterhead upload)",
"align": "Alignment",
"left": "Left",
"center": "Center",
"right": "Right",
"columns": "Columns (comma-separated)",
"rows": "Rows (JSON)",
"placeholderKey": "Data field",
"label": "Display label",
"preview": "Live Preview",
"pagebreakHint": "Forces a page break in the PDF.",
"noConfig": "No configuration for this block type."
},
"dialog": {
"title": "Create Document",
"for": "For",
"generate": "Generate",
"generated": "Document created",
"generateFailed": "Document could not be created",
"noTemplates": "No print templates for this data type. Create templates under Settings → Documents."
}
}
}