- Kontakt-Adressen als aufklappbare Gruppen in Anlagen-Übersicht - Equipment-Blöcke als CSS Grid (TE-basiert) statt Flex-Wrap - Abgang-Labels (Outputs) über/unter Automaten, Toggle-Button - jQuery statt eigener ElementCollection, aus Dolibarr geladen - Design-System auf Dolibarr Dark Theme Variablen umgestellt - Session-State-Wiederherstellung bei Refresh - Browser-History Support (Hardware-Zurück) - Quick-Select erweitert: AFDD, FI/LS-Kombi - Intelligente Positionsberechnung mit Lücken-Erkennung - Hutschiene zeigt belegt/gesamt TE - $user->getrights() nach Token-Validierung - Doku aktualisiert Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
7.2 KiB
Executable file
CLAUDE_CODE_DISABLE_AUTO_MEMORY=0
KundenKarte Module - Entwicklungshinweise
Dolibarr App Navigation (Vor/Zurück Pfeile)
Problem
Die Dolibarr Mobile App hat eigene Navigations-Pfeile (vorheriger/nächster Kunde), die zwischen Datensätzen navigieren. Diese verwenden andere Parameter als unsere Module erwarten:
- Kunden-Navigation: Dolibarr verwendet
socid, Module erwarten oftid - Kontakt-Navigation: Dolibarr verwendet
contactid, Module erwarten oftid
Wenn man diese Pfeile auf einem Modul-Tab verwendet, verliert das Modul die ID und zeigt einen Fehler oder leere Seite.
Lösung: Beide Parameter akzeptieren
In JEDEM Tab-PHP-File muss am Anfang beide Parameter akzeptiert werden:
Für Kunden-Tabs (thirdparty):
// Get parameters
// Support both 'id' and 'socid' for compatibility with Dolibarr's customer navigation arrows
$id = GETPOSTINT('id');
if ($id <= 0) {
$id = GETPOSTINT('socid');
}
Für Kontakt-Tabs (contact):
// Get parameters
// Support both 'id' and 'contactid' for compatibility with Dolibarr's contact navigation arrows
$id = GETPOSTINT('id');
if ($id <= 0) {
$id = GETPOSTINT('contactid');
}
Betroffene Dateien in diesem Modul
tabs/anlagen.php- Kunden-Anlagen (socid)tabs/favoriteproducts.php- Kunden-Favoriten (socid)tabs/contact_anlagen.php- Kontakt-Anlagen (contactid)tabs/contact_favoriteproducts.php- Kontakt-Favoriten (contactid)
Best Practices für zukünftige Module
- IMMER beide Parameter akzeptieren -
idUNDsocid/contactid - Tab-Definition in modXxx.class.php verwendet
?id=__ID__- das ist korrekt - Dolibarr's
dol_banner_tab()generiert die Navigationspfeile mitsocid/contactid - Fallback bei fehlender ID - zur Liste weiterleiten, nicht Fehler zeigen:
if ($id <= 0) {
header('Location: '.DOL_URL_ROOT.'/societe/list.php');
exit;
}
Mobile Ansicht - Einheitliche Button-Größen
Problem
Auf mobilen Geräten haben die Buttons (Kompakt, Aufklappen, Einklappen, PDF Export) unterschiedliche Größen.
Lösung
CSS Media Queries für einheitliche Button-Größen:
@media (max-width: 768px) {
.kundenkarte-tree-controls {
justify-content: center !important;
flex-wrap: wrap !important;
gap: 8px !important;
}
.kundenkarte-tree-controls .button {
flex: 1 1 auto !important;
min-width: 80px !important;
max-width: 150px !important;
padding: 10px 8px !important;
font-size: 12px !important;
text-align: center !important;
}
}
@media (max-width: 480px) {
/* 2x2 Grid auf sehr kleinen Bildschirmen */
.kundenkarte-tree-controls {
display: grid !important;
grid-template-columns: 1fr 1fr !important;
}
}
Migrationen
Alle Datenbankänderungen werden als idempotente Migrationen in modKundenKarte.class.php implementiert:
runMigrations()wird bei jeder Modulaktivierung aufgerufen- Jede Migration prüft zuerst, ob die Änderung bereits existiert
- Später werden Migrationen entfernt und Tabellen direkt korrekt erstellt
Dateistruktur
tabs/anlagen.php- Hauptansicht für Anlagen auf Kundenebenetabs/contact_anlagen.php- Anlagen für Kontaktetabs/favoriteproducts.php- Lieblingsprodukte auf Kundenebenetabs/contact_favoriteproducts.php- Lieblingsprodukte für Kontakteadmin/anlage_types.php- Verwaltung der Element-Typenajax/- AJAX-Endpunkte für dynamische Funktionenjs/kundenkarte.js- Alle JavaScript-Komponentencss/kundenkarte.css- Alle Styles (Dark Mode)
Wichtige Hinweise
FontAwesome Icons
- Dolibarr verwendet FontAwesome 4.x Format:
fa fa-icon-name - NICHT:
fas fa-icon-nameoderfar fa-icon-name
Badge-Farben
- Können pro Feld in Admin > Element-Typen konfiguriert werden
- Spalte
badge_colorinllx_kundenkarte_anlage_type_field - Hex-Format:
#RRGGBB
Datei-Vorschau Tooltip
- AJAX-Endpoint:
ajax/file_preview.php - Zeigt Thumbnails für Bilder, Icons für Dokumente
- Hover über Datei-Badge im Baum
PWA Mobile App
Übersicht
Offline-fähige Progressive Web App für Elektriker zur Schaltschrank-Dokumentation vor Ort.
Dateien
pwa.php- Haupteinstieg (HTML/CSS/JS Container, lädt jQuery aus Dolibarr)pwa_auth.php- Token-basierte Authentifizierung (15 Tage gültig)ajax/pwa_api.php- Alle AJAX-Endpoints für die PWAjs/pwa.js- Komplette App-Logik (jQuery, als IIFE mit jQuery-Parameter)css/pwa.css- Mobile-First Design, Dolibarr Dark Theme Variablensw.js- Service Worker für Offline-Cache (v1.8)manifest.json- Web App Manifest für Installation
Workflow
- Login mit Dolibarr-Credentials → Token wird lokal gespeichert
- Kunde suchen → Anlagen werden gecached
- Kontakt-Adressen (Gebäude/Standorte) aufklappen → Anlagen pro Adresse
- Anlage mit Schaltplan-Editor auswählen → Daten werden gecached
- Offline arbeiten: Hutschienen, Automaten hinzufügen
- Änderungen werden in lokaler Queue gespeichert
- Bei Internetverbindung: Automatische Synchronisierung
Design-System
- CSS-Variablen basierend auf Dolibarr Dark Theme (
--colorbackbody,--colortext, etc.) - Theme-Farbe
--primarywird dynamisch aus Dolibarr-Config geladen (THEME_ELDY_TOPMENU_BACK1) - Buttons:
--butactionbg(goldbraun) statt blau - Header: sticky, primary-Farbe
Kontakt-Adressen
get_anlagenAPI liefert jetztanlagen(Kunden-Ebene) +contacts(Adressen)- Kontakt-Gruppen werden als aufklappbare Akkordeons dargestellt
get_contact_anlagenAPI lädt Anlagen pro Kontakt-Adresse bei Bedarf- Kontakt-Adressen zeigen Name, Adresse, Ort und Anzahl Anlagen
Schaltplan-Editor
- Equipment-Blöcke als CSS Grid (
grid-template-columns: repeat(totalTE, 1fr)) - Blöcke positioniert per
grid-columnbasierend aufposition_teundwidth_te block_labelundblock_coloraus Backend (wie Website)- Abgang-Labels (Outputs) werden über/unter den Automaten angezeigt
- Toggle-Button zum Wechseln der Label-Position (oben/unten), in localStorage gespeichert
- Connections mit
fk_target IS NULL= Ausgänge/Abgänge - Quick-Select erweitert: LS, FI/RCD, AFDD, FI/LS-Kombi
- Intelligente Positionsberechnung mit Lücken-Erkennung
- Hutschiene zeigt belegt/gesamt TE, +-Button wird disabled wenn voll
Navigation & State
- Browser-History Support (hardware Zurück-Button funktioniert)
- Session-State wird in
sessionStoragegespeichert (Screen, Kunde, Anlage) - Bei Seiten-Refresh wird letzter Zustand wiederhergestellt
- Sync-Button lädt jetzt erst Offline-Queue, dann Daten neu
Token-Authentifizierung
- Tokens enthalten: user_id, login, created, expires, hash
- Hash = MD5(user_id + login + MAIN_SECURITY_SALT)
- Gültigkeit: 15 Tage
- Gespeichert in localStorage
$user->getrights()wird nach Token-Validierung aufgerufen
Offline-Sync
- Alle Änderungen werden in
offlineQueue(localStorage) gespeichert - Badge zeigt Anzahl ungesyncte Änderungen
- Sync-Button oder automatisch bei Online-Event
- Bei Sync werden Aktionen der Reihe nach ausgeführt
Installation auf Smartphone
- PWA im Browser öffnen:
https://domain/dolibarr/custom/kundenkarte/pwa.php - Browser-Menü → "Zum Startbildschirm hinzufügen"
- App öffnet sich als Standalone ohne Browser-UI