- Farbe, Strichstärke, Schriftart, Schriftgröße, Bold/Italic und Zoom
werden in localStorage unter bericht.editor.settings.v1 gespeichert
- Beim nächsten Öffnen werden alle Werte wiederhergestellt
- Alle Toolbar-Buttons und Inputs haben jetzt deutsche Tooltips
(Farbe, Strichstärke, Schriftart, Größe, Fett, Kursiv, Zoom -/+/Reset,
Rotation links/rechts)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
- Jeder Thumb hat jetzt einen mini canvas, der das Bild oder die erste
PDF-Seite gerendert anzeigt (max 200px)
- Papier-Look: A4 aspect-ratio (1:1.414), weißer Hintergrund per Default
- 🌓-Button im Pages-Header schaltet zwischen paper-light und paper-dark
- Toolbar-Inputs (select/number/checkbox): heller Text auf dunklem
Hintergrund für Dark-Theme
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
- Toolbar: Schriftart (Helvetica/Arial/Times/Courier/Verdana/Georgia),
Größe (8-120), Bold/Italic Checkboxen — wirken auf neues Text-Tool
und auf selektierte Texte (Sync via selection:created/updated)
- Zoom-Buttons (-/+/Reset) mit Anzeige in %, skaliert getTargetCanvasWidth
- Pfeil-Tool: Drag-to-Draw mit echter Pfeilspitze als Group (Linie +
Triangle), drehbar/skalierbar/verschiebbar wie alle anderen Shapes
- Rect/Ellipse: ebenfalls Drag-to-Draw statt fester Größe
- ResizeObserver auf canvas-wrap re-rendert die Seite wenn sich die
Container-Breite ändert (z.B. DevTools öffnen)
- Toolbar-Inputs/Selects nutzen Dolibarr CSS-Variablen für Dark-Theme
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
Fabric.js wickelt das Canvas in einen .canvas-container-Wrapper ein.
Vorher habe ich nur das innere #fabric-canvas absolut positioniert,
während der Wrapper im normalen Flow unter dem PDF-Canvas blieb -
dadurch konnten die Tools nicht klicken (Klicks gingen ans PDF-Canvas)
und Annotationen erschienen unter dem Bild.
Jetzt wird der .canvas-container exakt über dem PDF-Canvas platziert
mit z-index:10 und pointer-events:auto.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
- canvas-area: min-height 80vh entfernt (nahm immer 80% Bildschirmhöhe
ein, auch wenn der Inhalt kleiner war)
- canvas-wrap: overflow:auto und flex:1 entfernt — kein eigener
Scrollbalken in der Mitte mehr, der Body scrollt natürlich
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
Auf Wide-Screens (>1200px mittlere Spalte) blieb rechts vom Bild ein
großer leerer Streifen, weil getTargetCanvasWidth auf 1200px gedeckelt
war. Jetzt nimmt der Canvas immer die volle Container-Breite ein.
Bei Browser-Resize wird die aktuelle Seite neu gerendert.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
Die ⟲/⟳-Buttons rotieren jetzt die SEITE statt Fabric-Objekte:
- Image: ctx.rotate beim drawImage, Buffer-Größe getauscht
- PDF: pdfjsLib viewport mit rotation-Param
- Rotation in llx_bericht_page.rotation persistiert
- Beim Seitenwechsel wird die gespeicherte Rotation aus page_meta geladen
- Annotationen werden bei Rotation gelöscht (rotieren VOR dem Annotieren)
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
- renderImage skaliert auch hoch wenn img kleiner als Container (vorher
blieb rechts leerer Platz bei kleinen Querformat-Handyfotos)
- max-width auf pdf-canvas entfernt (drawing-buffer != display size hat
das Fabric-Overlay verrutschen lassen)
- resizeFabricToCanvas nutzt getBoundingClientRect für pixelgenaue
Positionierung über requestAnimationFrame
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
- editor.js: PDF/Bild-Render nutzt jetzt die tatsächliche Breite des
.bericht-canvas-wrap Containers (max 1200), damit die mittlere Spalte
nicht überquillt und die Seiten-Sidebar sichtbar bleibt
- CSS: grid-template-columns nutzt minmax(0, 1fr) um Überlauf zu
verhindern, #pdf-canvas hat max-width:100%
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
Echter Bug: $this->rights[$r][4] muss der perms-Name sein (z.B. 'read'),
NICHT der Modulname. Mit [4]='bericht'/[5]='read' baute Dolibarr den
Pfad $user->rights->bericht->bericht->read — aber hasRight('bericht','read')
prüft $user->rights->bericht->read → false → Tab versteckt.
Korrektes Format wie Stundenzettel:
[4] = 'read' / 'write' / 'delete' / 'admin' (perms)
[5] = '' (subperms, leer)
Außerdem [3]=1 (bydefault) für die Standard-Rechte, damit sie bei
Aktivierung automatisch allen Usern zugewiesen werden.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
Tab-URL-Pfad braucht /custom/-Prefix damit Apache ihn richtig auflöst,
und das einfache String-Array-Format (wie Stundenzettel) ist robuster
als die ['data' => ...] Variante. Ungenutzte Hook-Contexts entfernt.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
Tab Bericht erschien nicht, weil drei der vier Rechte mit falschem
Array-Index angelegt wurden und damit hasRight('bericht','read') immer
false zurückgab. Nach Fix Modul einmal deaktivieren + reaktivieren,
damit die fehlenden Rechte in llx_rights_def geschrieben werden.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
Dolibarr-Modul für Arbeitsberichte aus Rechnungs-Anhängen mit Browser-PDF-Editor.
- Reiter "Bericht" auf Rechnungen, Aufträgen und Angeboten
- Anhänge-Browser inkl. verknüpfter Objekte (Auftrag → Rechnung)
- PDF.js + Fabric.js Browser-Editor: Pfeile, Kreise, Rechtecke, Freihand, Text
- SortableJS Seiten-Verwaltung mit Drag&Drop
- ODT-Deckblatt mit Platzhaltern, Templates im Admin verwaltbar
- TCPDF + FPDI Finalisierung mit eingebrannten Annotationen
- ECM-Verknüpfung: PDF erscheint unter Verknüpfte Dokumente
- Auftragsnummer aus existierendem Extrafield options_auftragsnummer
- Mehrere Berichte pro Dokument
- Beim Aktivieren werden vorhandene Extrafields nicht überschrieben
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>