Files
web-cad/WORKLOG.md
T
2026-06-28 11:28:55 +02:00

9.4 KiB

Web-CAD Work Log

2026-06-28 — Session 1

Erledigt:

  1. Echte Source gefunden: /data/web-cad-neu/frontend/ auf Server — echter TypeScript CAD-Editor (React 18, Vite, RibbonBar, KI, Layers, Tools)
  2. Source in Repo committed: Commit 9edce19 — kompletter TS-Source, kein Viewer
  3. Backend/.dockerignore hinzugefügt: Commit c977678 → dann durch History-Reset in 9edce19 integriert
  4. Git-Historie bereinigt: Orphan-Branch, Force-Push — alle alten Viewer-Commits vernichtet
  5. Server bereinigt:
    • /tmp/web-cad-deploy/ gelöscht (JSX viewer)
    • /tmp/web-cad-* Temp-Dateien gelöscht (7 Dateien)
    • /data/webspace/webcad/, web-cad-mockups-x7k2p9/, web-cad-neu/ gelöscht
    • Altes Docker-Image web-cad-frontend:latest (d8fee173c5fe) gelöscht
    • Alter Container temp-extract gelöscht
  6. Repo mit Server synchronisiert: backend/package-lock.json angepasst, Commit d08785d
  7. Checksums verifiziert: 119/119 Dateien SHA256-identisch (lokal ↔ Server)
  8. Backup erstellt:
    • Lokal: /a0/usr/workdir/web-cad-backup-20260628-102017.tar.gz (270K)
    • Server: /tmp/web-cad-neu-backup-20260628-102018.tar.gz (268K)
  9. Deployment verifiziert: Health OK, Frontend+Backend running, Browser zeigt echten CAD-Editor

Gefundene Fehler (Frontend Tests):

  • 6 Failures in tests/Components.test.tsx (PropertiesPanel):
    1. should display default values — erwartet '0.000 m', bekommt '0' (Format-String fehlt)
    2. should display element coordinates — erwartet '10.000 m', bekommt '10'
    3. should display element dimensions — erwartet '100.00 m', bekommt '100'
    4. should call onUpdateProperty — erwartet String '999', bekommt Number 999 (Typ-Konflikt) 5-6. Weitere PropertiesPanel-Formatierungsfehler
  • 337 Tests passed, 6 failed

Backups (vor Bug-Fixing erstellt):

  • Lokal: /a0/usr/workdir/web-cad-backup-20260628-102017.tar.gz (270K, 161 Dateien — frontend + backend + configs)
  • Server-Backup gelöscht (redundant, /tmp ist temporär)
  • Forgejo Commit d08785d ist der letzte Stand vor Bug-Fixing

Bug-Fixing Fortschritt:

Frontend Fixes:

  1. PropertiesPanel.tsx — 6 Test-Fehler behoben:
    • Position X/Y: String(el.x)formatPos(el.x) = 'X.XXX m' (3 Dezimalstellen + ' m')
    • Breite/Tiefe: String(el.width)formatDim(el.width) = 'X.XX m' (2 Dezimalstellen + ' m')
    • Default-Werte: '0''0.000 m' / '0.50 m'
    • onChange: parseFloat(e.target.value) || 0e.target.value (String statt Number)
    • Neue Helper: formatPos(), formatDim(), parseNum()
  2. LayerPanel.tsx — 2 Test-Fehler behoben:
    • Add-Button: className="add-layer-btn" + aria-label="Neue Ebene" hinzugefügt
    • Visibility-Toggle: aria-label={layer.visible ? 'Verstecken' : 'Anzeigen'} hinzugefügt
  3. RibbonBar.tsx — SVG Property Warnings behoben:
    • stroke-widthstrokeWidth, stroke-linecapstrokeLinecap, stroke-linejoinstrokeLinejoin
  4. 9 weitere Komponenten — gleiche SVG Property Fixes:
    • RightSidebar, PropertiesPanel, Topbar, MobileDrawers, CanvasArea, KICopilot, StatusBar, LeftSidebar, BlockLibrary
    • exportService.ts

Backend Fixes:

  • Noch ausstehend (1 StressTest Timing-Fehler: 507ms vs 500ms Threshold)

Test-Ergebnisse nach Fixes:

  • Frontend: 343/343 passed
  • Frontend TypeScript: clean
  • Backend: 158/158 passed
  • Backend TypeScript: clean
  • Frontend Build: 337 modules, OK

Weitere Code-Review Fixes:

  1. App.tsx line 617 — Copy-Funktion: (e as any).selectedselectedElement ? [selectedElement] : [] (selected property existierte nicht auf CADElement)
  2. App.tsx lines 654-660 — Image-Insert: type: 'image' as any + as any → korrektes CADElement mit type: 'image', width: 200, height: 200
  3. cad.types.ts'image' zu ElementType hinzugefügt
  4. SnapEngine.ts line 89'grid' as SnapMode as any'grid' (double cast entfernt)
  5. RenderEngine.ts line 33 — SnapPoint type erweitert: 'grid' | 'perpendicular' | 'tangent' | 'quadrant' | 'none' hinzugefügt
  6. RightSidebar.tsx line 51(updated as any)[key] = value as number → proper type-safe assignment mit String-Parsing
  7. RightSidebar.tsx — rotation handling hinzugefügt (String → Number Parse)
  8. RibbonBar.tsx + 9 weitere Dateien — SVG Properties: stroke-widthstrokeWidth etc. (React camelCase)

TODO:

  • Backend Tests ausführen
  • PropertiesPanel: Format-String für Werte (m, cm) fixen
  • PropertiesPanel: onUpdateProperty Typ-Konsistenz (string vs number)
  • Alle Frontend-Tests grün bekommen
  • Backend-Tests prüfen und fixen
  • Code-Review: jede Komponente, jeder Button, jede Funktion
  • Gefundene Fehler fixen und testen
  • Fixes committen und pushen
  • Auf Server deployen und verifizieren

Commits:

  • 9edce19 — Web CAD complete TypeScript source (orphan, history reset)
  • d08785d — Sync backend/package-lock.json with production server

Wichtige Pfade:

  • Lokales Repo: /a0/usr/workdir/web-cad/
  • Server Source: /data/web-cad-neu/ (frontend + backend)
  • Server Git Clone: /root/web-cad/
  • Forgejo: https://forgejo.media-on.de/Leopoldadmin/web-cad.git
  • Coolify Service: cnuavrh33goa3zs0upi6hgif
  • Live URL: https://web-cad-neu.server.media-on.de
  • SSH: ssh -i /a0/usr/workdir/.ssh/coolify-01-root root@46.225.91.159

2026-06-28 — Session 2: Mobile UI Fixes

Gefundene Mobile-Bugs (≤768px):

  1. Hamburger-Button kein onClick — Topbar.tsx: Button hatte keinen Click-Handler, linker Drawer konnte nie geöffnet werden
  2. Right-tab-bar nicht gerendert — CSS definiert .right-tab-bar aber keine React-Komponente renderte sie, rechter Drawer konnte nie geöffnet werden
  3. Drawer-Bodies leer — MobileDrawers.tsx hatte nur Kommentare, kein Content in Drawers
  4. Topbar-Buttons ohne onClick — Projekt-Name, Versionen, Teilen, Hilfe, Benachrichtigungen hatten keine Handler

Fixes:

  • Topbar.tsx: onOpenLeftDrawer Prop + onClick auf Hamburger-Button; onNavigateBack auf Projekt-Name; Placeholder-Handler für Versionen/Teilen/Hilfe/Benachrichtigungen
  • App.tsx: rightTabItems Konstante mit 4 Tabs (Wz/Layer/Lib/KI); <div className="right-tab-bar"> gerendert; LeftSidebar als leftContent an MobileDrawers; RightSidebar als rightContent an MobileDrawers
  • MobileDrawers.tsx: leftContent/rightContent ReactNode Props akzeptiert und in Drawer-Bodies gerendert
  • ui.types.ts: onOpenLeftDrawer, onNavigateBack zu TopbarProps; leftContent, rightContent zu MobileDrawersProps

Verifikation (Mobile 390x844):

  • Hamburger-Button geklickt → linker Drawer öffnet sich mit Werkzeug-Palette
  • Layer Tab geklickt → rechter Drawer öffnet sich mit Layer-Panel
  • Beide Drawers zeigen Sidebar-Content (nicht mehr leer)

Test-Ergebnisse:

  • Frontend: 343/343
  • Backend: 165/165
  • TypeScript: clean
  • Build: erfolgreich

Commits:

  • e1b9631 fix: bug fixes, type safety, SVG properties, and backend auth security
  • f541f5e fix: mobile UI — hamburger onClick, right-tab-bar, drawer content, topbar buttons

Deployment:

  • Server: Code gepullt, Frontend Docker Image rebuilt
  • Coolify: Deployment ausgeführt, Container laufen (healthy)
  • Health-Check: OK
  • Mobile Browser-Test: Drawers funktionieren

Bekannte Placeholder-Handler (noch nicht implementiert):

  • Versionen-Button: console.log (Versionsverlauf noch nicht implementiert)
  • Teilen-Button: console.log (Projekt teilen noch nicht implementiert)
  • Hilfe-Button: console.log (Hilfe-System noch nicht implementiert)
  • Benachrichtigungen-Button: console.log (Notification-System noch nicht implementiert)

2026-06-28 11:28 — Topbar Features implementiert

Implementierte Features

4 Topbar-Buttons von Placeholder (console.log) zu echten Komponenten verbunden:

  1. Versionen → öffnet HistoryPanel (bestehende Komponente)

    • TopbarProps.onOpenHistory hinzugefügt
    • App.tsx: onOpenHistory={() => setHistoryPanelOpen(true)}
  2. Teilen → öffnet ShareDialog (neue Komponente)

    • Datei: src/components/ShareDialog.tsx (71 Zeilen)
    • Link kopieren (Clipboard API), E-Mail-Einladung
    • Modal mit Backdrop, Projektname-Anzeige
  3. Hilfe → öffnet HelpPanel (neue Komponente)

    • Datei: src/components/HelpPanel.tsx (68 Zeilen)
    • Tastenkürzel-Grid: V,L,C,R,T,P,Z,M,Strg+Z/Y,Entf,Strg+C/V
    • Schnellstart-Guide: 4 Schritte
  4. Benachrichtigungen → öffnet NotificationPanel (neue Komponente)

    • Datei: src/components/NotificationPanel.tsx (78 Zeilen)
    • Dropdown-Panel mit 3 Beispiel-Benachrichtigungen
    • Dismiss-Button pro Eintrag, "Alle als gelesen markieren"
    • Outside-click schließt Panel

Geänderte Dateien

  • frontend/src/types/ui.types.ts — TopbarProps + 3 neue Interfaces
  • frontend/src/components/Topbar.tsx — 4 Buttons zu echten Callbacks verbunden
  • frontend/src/components/ShareDialog.tsx — NEU
  • frontend/src/components/HelpPanel.tsx — NEU
  • frontend/src/components/NotificationPanel.tsx — NEU
  • frontend/src/App.tsx — Imports, States, Topbar-Props, Component-Renders
  • frontend/src/styles.css — Modal-Styles, Share/Help/Notif CSS, Responsive

Verifikation

  • TypeScript: clean
  • Tests: 343/343 passed
  • Build: 340 modules, 928KB JS, 51KB CSS
  • Browser-Test: Alle 4 Features auf Production geprüft
  • Commit: 5d410f7
  • Deploy: Coolify deploy_start, Health OK