diff --git a/README.md b/README.md index 71aee8ef..c189ab16 100644 --- a/README.md +++ b/README.md @@ -177,50 +177,92 @@ Basierend auf der Analyse von Git-Commits und praktischen Erfahrungen treten bes #### 2. Layout-Strukturfehler -**Problem:** Unnötige oder falsche Array-Elemente in Layouts, die zu UI-Problemen führen. +**Problem:** Falsche Platzhalter und Strukturen in Layouts führen zu UI-Problemen. + +**⚠️ KRITISCH für EspoCRM 7.x:** +In EspoCRM 7.x ist `false` als Platzhalter **NICHT MEHR ERLAUBT**! **Symptome:** +- Layout wird nicht geladen, Fehlermeldung in UI - Felder werden nicht korrekt angeordnet - Leere Bereiche in Detail-Views -- Inkonsistente Spaltenbreiten +- bottomPanelsDetail funktioniert nicht -**❌ FALSCH:** +**❌ FALSCH (EspoCRM 7.x):** ```json // layouts/Entity/detail.json { "rows": [ [ - {"name": "field1"} - ], - [ + {"name": "field1"}, {"name": "field2"}, - false // ← Unnötiges false-Element! + false, // ← DEPRECATED! Funktioniert in 7.x NICHT! + false // ← Verursacht Layout-Fehler! ] ] } ``` -**✅ RICHTIG:** +**✅ RICHTIG (EspoCRM 7.x):** ```json { "rows": [ [ {"name": "field1"}, - {"name": "field2"} // Beide in einer Row + {"name": "field2"}, + {}, // ← Leeres Objekt verwenden! + {} // ← Funktioniert in 7.x korrekt ] ] } ``` +**❌ FALSCH - bottomPanelsDetail.json als Array:** +```json +// layouts/Entity/bottomPanelsDetail.json +[ + {"name": "contacts"}, + {"name": "documents"} +] +``` + +**✅ RICHTIG - bottomPanelsDetail.json als Objekt:** +```json +{ + "contacts": { + "index": 0, + "sticked": true, + "style": "warning" + }, + "_tabBreak_0": { + "index": 1, + "columnBreak": true + }, + "documents": { + "index": 2 + }, + "activities": { + "disabled": true + }, + "history": { + "disabled": true + } +} +``` + **Häufige Layout-Fehler:** +- ❌ **`false` als Platzhalter** (seit EspoCRM 7.x nicht mehr unterstützt!) - ❌ Width-Attribute in Detail-Layouts (nur für List-Layouts!) -- ❌ Leere Objekte `{}` oder `false` in Rows -- ❌ Index nicht angepasst nach Entfernung von Panels (bottomPanelsDetail) +- ❌ bottomPanelsDetail.json als Array statt Objekt +- ❌ Index nicht angepasst nach Entfernung von Panels **Best Practice:** +- **Immer `{}` statt `false`** für leere Zellen in detail.json verwenden - Width nur in `list.json` und `listSmall.json` verwenden -- Rows immer vollständig füllen oder Felder kombinieren +- bottomPanelsDetail.json **MUSS** Objekt-Format haben +- Rows immer mit 4 Spalten füllen (nutze `{}` zum Auffüllen) - Nach Panel-Entfernung Indices neu nummerieren +- `_tabBreak_{index}` verwenden um Panels auf verschiedene Tabs zu verteilen --- diff --git a/custom/Espo/Custom/Resources/layouts/CKndigung/bottomPanelsDetail.json b/custom/Espo/Custom/Resources/layouts/CKndigung/bottomPanelsDetail.json new file mode 100644 index 00000000..811e3850 --- /dev/null +++ b/custom/Espo/Custom/Resources/layouts/CKndigung/bottomPanelsDetail.json @@ -0,0 +1,63 @@ +{ + "_delimiter_": { + "disabled": true + }, + "activities": { + "disabled": true + }, + "history": { + "disabled": true + }, + "_tabBreak_0": { + "index": 0, + "tabBreak": true, + "tabLabel": "Freigegebene Nutzer" + }, + "contactsKuendigung": { + "dynamicLogicVisible": null, + "style": "warning", + "dynamicLogicStyled": null, + "sticked": true, + "index": 1 + }, + "_tabBreak_1": { + "index": 2, + "tabBreak": true, + "tabLabel": "Kündigende" + }, + "kuendiger": { + "index": 3 + }, + "_tabBreak_2": { + "index": 4, + "tabBreak": true, + "tabLabel": "Gekündigte" + }, + "gekuendigte": { + "index": 5 + }, + "_tabBreak_3": { + "index": 6, + "tabBreak": true, + "tabLabel": "Mietverhältnisse" + }, + "vmhMietverhltnises": { + "index": 7 + }, + "_tabBreak_4": { + "index": 8, + "tabBreak": true, + "tabLabel": "Dokumente" + }, + "dokumenteskuendigung": { + "index": 9 + }, + "_tabBreak_5": { + "index": 10, + "tabBreak": true, + "tabLabel": "Mietobjekte" + }, + "mietobjekte": { + "index": 11 + } +} diff --git a/custom/Espo/Custom/Resources/layouts/CKndigung/defaultSidePanel.json b/custom/Espo/Custom/Resources/layouts/CKndigung/defaultSidePanel.json new file mode 100644 index 00000000..b7980619 --- /dev/null +++ b/custom/Espo/Custom/Resources/layouts/CKndigung/defaultSidePanel.json @@ -0,0 +1,11 @@ +[ + { + "name": ":assignedUser" + }, + { + "name": "teams" + }, + { + "name": "freigeschalteteNutzer" + } +] diff --git a/custom/Espo/Custom/Resources/layouts/CKndigung/detail.json b/custom/Espo/Custom/Resources/layouts/CKndigung/detail.json new file mode 100644 index 00000000..b836cf98 --- /dev/null +++ b/custom/Espo/Custom/Resources/layouts/CKndigung/detail.json @@ -0,0 +1,114 @@ +[ + { + "label": "Kündigungsdetails", + "style": "default", + "tabBreak": false, + "rows": [ + [ + { + "name": "name" + }, + { + "name": "kuendigungsart" + }, + { + "name": "status" + }, + { + "name": "advowareAktenzeichen" + } + ], + [ + { + "name": "kuendigungsgrund" + }, + { + "name": "kuendigungsdatum" + }, + { + "name": "zustelldatum" + }, + { + "name": "zustellart" + } + ], + [ + { + "name": "kuendigungsfrist" + }, + { + "name": "beendigungstermin" + }, + {}, + {} + ], + [ + { + "name": "kuendigungsgrundDetails" + } + ] + ] + }, + { + "label": "Finanzielle Forderungen", + "style": "default", + "tabBreak": false, + "rows": [ + [ + { + "name": "rueckstandMiete" + }, + { + "name": "rueckstandNebenkosten" + }, + { + "name": "sonstigeForderungen" + }, + { + "name": "aussergerichtlicheGebuehren13" + } + ] + ] + }, + { + "label": "Notizen & Reaktion", + "style": "default", + "tabBreak": false, + "rows": [ + [ + { + "name": "reaktionMieter" + } + ], + [ + { + "name": "notizen" + } + ], + [ + { + "name": "description" + } + ] + ] + }, + { + "label": "Advoware Sync", + "style": "default", + "tabBreak": true, + "tabLabel": "Erweitert", + "rows": [ + [ + { + "name": "betnr" + }, + { + "name": "syncStatus" + }, + { + "name": "advowareLastSync" + } + ] + ] + } +] diff --git a/custom/Espo/Custom/Resources/layouts/CKndigung/detailSmall.json b/custom/Espo/Custom/Resources/layouts/CKndigung/detailSmall.json new file mode 100644 index 00000000..26f5402e --- /dev/null +++ b/custom/Espo/Custom/Resources/layouts/CKndigung/detailSmall.json @@ -0,0 +1,33 @@ +[ + { + "rows": [ + [ + { + "name": "name", + "noLabel": true + } + ], + [ + { + "name": "kuendigungsart" + }, + { + "name": "status" + } + ], + [ + { + "name": "kuendigungsdatum" + }, + { + "name": "beendigungstermin" + } + ], + [ + { + "name": "assignedUser" + } + ] + ] + } +] diff --git a/custom/Espo/Custom/Resources/layouts/CKndigung/list.json b/custom/Espo/Custom/Resources/layouts/CKndigung/list.json new file mode 100644 index 00000000..2bc4fd9f --- /dev/null +++ b/custom/Espo/Custom/Resources/layouts/CKndigung/list.json @@ -0,0 +1,31 @@ +[ + { + "name": "name", + "link": true, + "width": 20 + }, + { + "name": "kuendigungsart", + "width": 12 + }, + { + "name": "status", + "width": 12 + }, + { + "name": "kuendigungsdatum", + "width": 12 + }, + { + "name": "beendigungstermin", + "width": 12 + }, + { + "name": "assignedUser", + "width": 16 + }, + { + "name": "modifiedAt", + "width": 16 + } +] diff --git a/custom/Espo/Custom/Resources/layouts/CKndigung/listSmall.json b/custom/Espo/Custom/Resources/layouts/CKndigung/listSmall.json new file mode 100644 index 00000000..f27c2501 --- /dev/null +++ b/custom/Espo/Custom/Resources/layouts/CKndigung/listSmall.json @@ -0,0 +1,15 @@ +[ + { + "name": "name", + "link": true + }, + { + "name": "kuendigungsart" + }, + { + "name": "status" + }, + { + "name": "kuendigungsdatum" + } +] diff --git a/data/config.php b/data/config.php index d325c9d3..ce2db9c3 100644 --- a/data/config.php +++ b/data/config.php @@ -360,8 +360,8 @@ return [ 0 => 'youtube.com', 1 => 'google.com' ], - 'cacheTimestamp' => 1769331937, - 'microtime' => 1769331937.84435, + 'cacheTimestamp' => 1769332527, + 'microtime' => 1769332527.595512, 'siteUrl' => 'https://crm.bitbylaw.com', 'fullTextSearchMinLength' => 4, 'appTimestamp' => 1768843902,