Commit graph

71 commits

Author SHA1 Message Date
0fbfb1bf27 feat: Phase 1.3 + 1.7 + Schema 1.4/1.5 — Format/Orient + Kunden-Tab
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
Phase 1.3 Seitenformat A4/A3/A5/Letter + Hoch/Quer:
- Neue Spalten page_format, page_orientation in llx_bericht
- Bericht-Meta zeigt Format + Orientation Selects
- Auto-Save via neuem ajax/save_meta.php
- generate_pdf + preview_pdf nutzen die gewählten Werte
- Bilder werden dynamisch via getPageWidth/getPageHeight skaliert
  (statt hardcoded 210x297 für A4)

Phase 1.4 + 1.5 Schema-Vorbereitung:
- Neue Tabelle llx_bericht_page_image für Multi-Image-Seiten
- Spalten layout, image_scale, image_align in llx_bericht_page
- DB-Migrationen im init() für bestehende Installationen
  (ALTER TABLE mit Error-Suppress)
- Grid-Rendering im Editor/PDF folgt im nächsten Commit
  (siehe CLAUDE.md TODO)

Phase 1.7 Tab "Berichte" auf Kundenkarte:
- Neue Konstante BERICHT_TAB_ON_THIRDPARTY (default 1)
- Tab-Definition in modBericht für 'thirdparty' Element
- Neue Datei bericht_thirdparty.php
- UNION-SQL über bericht JOIN commande/facture/propal mit fk_soc
- Read-only flache Tabelle sortiert nach Datum
- Pro Bericht: Quelle (Symbol + Ref-Link), Status, Öffnen/Zur Quelle

Version-Bump 1.0.0 → 1.1.0, ChangeLog ergänzt.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
2026-04-08 22:20:09 +02:00
a7bf3929a4 feat: Phase 1.6 + 1.1 + 1.2 — verknüpfte Sicht, PDF-Vorschau, Anhänge löschen
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
Phase 1.6 Verknüpfte Sicht Auftrag↔Rechnung:
- Bericht::fetchLinkedForElement liest llx_element_element-Verknüpfungen
- linkToElement/unlinkFromElement n:m-API
- Bericht-Übersicht zeigt drei Sektionen: direkt zugeordnet,
  zusätzlich verknüpft, aus verknüpften Aufträgen (read-only)
- 'Übernehmen'-Button erstellt llx_element_element-Eintrag
- 'Lösen'-Button entfernt Verknüpfung
- generate_pdf legt das fertige PDF auch unter den verknüpften
  Elementen ab + ECM-Eintrag

Phase 1.1 Live-PDF-Vorschau:
- Neuer Endpoint ajax/preview_pdf.php — wie generate_pdf, aber:
  schreibt nicht in ECM, ändert nicht den Status, streamt direkt
- 👁️ Vorschau-Button im Editor öffnet Modal mit iframe (PDF.js
  Viewer des Browsers)
- bericht_burn_annotations und bericht_render_cover_internal in
  lib/bericht.lib.php verschoben (gemeinsam genutzt)
- ESC-Key + Backdrop-Click schließen das Modal

Phase 1.2 Anhänge löschen:
- Neuer Endpoint ajax/delete_attachment.php mit Path-Whitelist
  (nur facture/, commande/, propal/), löscht Datei + thumbs +
  llx_ecm_files-Eintrag
- 🗑️-Button in jeder Anhang-Zeile, Confirm-Dialog mit
  Quell-Auftrag/Rechnung im Text
- Inline-Remove ohne Page-Reload

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
2026-04-08 22:13:46 +02:00
a7a533f3b8 feat: Toolbar-Einstellungen merken (localStorage) + Tooltips überall
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
- 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]
2026-04-08 16:35:08 +02:00
a6cb8ade44 ui: Toolbar auf zwei Zeilen, einheitliche Element-Höhe 30px
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
- Zeile 1: Tools (Select/Draw/Rect/Kreis/Pfeil/Text), Farbe, Strich,
  Undo/Redo, Löschen
- Zeile 2: Schrift (Family/Size/Bold/Italic), Zoom, Rotation
- .row-break als flex-basis:100% Element für sauberen Umbruch
- Alle Buttons + Inputs (color, range, number, select) auf height:30px
- Doppelte undo/redo/delete-Buttons entfernt

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
2026-04-08 16:32:55 +02:00
90d89130f3 feat: Seiten-Thumbnails mit echter Vorschau + Hell/Dunkel-Toggle
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
- 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]
2026-04-08 16:30:03 +02:00
1d3315a0b5 feat: Schrift-Optionen, Zoom, drehbarer Pfeil mit Spitze, ResizeObserver
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
- 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]
2026-04-08 16:28:06 +02:00
b61b3f2b88 fix: Fabric-Overlay positioniert .canvas-container statt #fabric-canvas
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
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]
2026-04-08 16:24:25 +02:00
e730495089 fix: zwei Scrollbalken weg
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
- 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]
2026-04-08 16:22:45 +02:00
0dc3f46817 Revert "fix: Canvas füllt volle Breite (kein 1200px-Limit) + Resize-Listener"
All checks were successful
Deploy bericht / deploy (push) Has been skipped
This reverts commit 532d8e0c98.
2026-04-08 16:16:37 +02:00
532d8e0c98 fix: Canvas füllt volle Breite (kein 1200px-Limit) + Resize-Listener
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
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]
2026-04-08 16:15:31 +02:00
40fb738ccf feat: Seitenrotation (Hoch/Quer) per Toolbar-Buttons
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
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]
2026-04-08 16:11:41 +02:00
9edbe95282 fix: Querformat-Bilder hochskalieren, Fabric-Overlay positioniert exakt
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
- 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]
2026-04-08 16:09:46 +02:00
a6f5e756c2 fix: Canvas skaliert auf Container-Breite statt fixe 1200px
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
- 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]
2026-04-08 16:07:13 +02:00
caa6d0168a fix: Action-Buttons im Editor-Footer dunkel-theme-fähig
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
2026-04-08 16:03:41 +02:00
70f272d951 fix: Ref-Format und Dark-Theme-Kompatibilität
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
- Bericht-Ref nutzt jetzt date('ymd-His') statt dol_print_date
  mit kaputten %i/%s Tokens (ergab 'BR260408-15%49%47')
- CSS verwendet Dolibarr-Variablen (--colorbacktitle1, --colortext etc)
  statt fester Hex-Werte, damit Dark-Theme automatisch passt

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
2026-04-08 15:51:49 +02:00
07a36f447e fix: Permission-Format korrigiert nach Stundenzettel-Vorbild
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
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]
2026-04-08 15:49:18 +02:00
05d20d2b72 fix: numero auf 500033 (500021 kollidierte mit BankImport rights_def)
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
[deploy]
2026-04-08 15:38:07 +02:00
fab63f6806 fix: Tabs nach Stundenzettel-Pattern (mit /custom/ Prefix, ohne array-data wrap)
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
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]
2026-04-08 15:34:31 +02:00
a46ac84a93 fix: Permissions Array-Format korrigiert (Index 4=object, 5=perm)
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
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]
2026-04-08 15:32:19 +02:00
69d52ffef1 fix: modulebuilder.txt Marker hinzugefügt — Modul erscheint jetzt im Module Builder [deploy]
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-08 15:23:05 +02:00
923b50d65a feat: Initiales Release Bericht-Modul v1.0.0 [deploy]
All checks were successful
Deploy bericht / deploy (push) Successful in 1s
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>
2026-04-08 15:18:59 +02:00