Completes the generic module platform that enables modules to contribute
UI elements, runtime JS components, and search resources without any
core hardcoding.
New generic UI slot types:
- topbar.right_item: module-contributed topbar buttons
- layout.body_end_template: module-contributed dialog/overlay templates
- layout.head_style: module-contributed global CSS
- runtime.component: declarative JS component registration with phase ordering
New infrastructure:
- ModuleAutoloader: PSR-4 autoloading for module-local PHP classes
- ModuleRuntimePageBuilder: symlinks module pages into runtime directory
- ModuleRuntimeAssetPublisher: publishes module CSS/JS to web/modules/
- ModulePermissionSynchronizer: syncs module permissions to DB
- CLI scripts: module-runtime-sync, module-build, module-migrate,
module-permissions-sync, module-assets-sync
- {{userId}} placeholder in SearchDataService for user-scoped search queries
- Component runtime with phased initialization (early/default/late)
- AppContainer.protectExistingBindings() to prevent module→core overwrites
- Architecture tests: ModuleStructureContractTest, CoreTemplateIsolationTest,
FrontendComponentRuntimeContractTest, AppContainerIsolationContractTest
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
3.4 KiB
3.4 KiB
UI Boundaries (MUST / MUST NOT)
Listen-Standard
- MUST Listen ueber
initStandardListPage(...)initialisieren. - MUST Filter-Toolbar ueber zentrale Helper/Partials rendern.
- MUST aktive Chips/Drawer-Verhalten ueber Standard-Contracts laufen lassen.
- MUST NOT direkt
gridFiltersFromSchema(...)oderinitListFilterExperience(...)in Listen-Templates verwenden. - MUST NOT Legacy-Filter-Toggle-Markup (
data-toolbar-toggle,data-filter-overflow,data-filter-toggle) neu einbauen. - MUST rowInteraction-Standard fuer Listen mit Row-Navigation beibehalten (sichtbare Action-Spalte + Enter + Doppelklick-Fallback).
- MUST pageSize-Standard beibehalten (10/25/50/100, Toolbar rechts, URL > localStorage > default).
Detailseiten-Standard
- MUST Hauptformular mit
data-standard-detail-form="1"markieren. - MUST Unsaved/Shortcut/Dirty-State ueber
initStandardDetailPage(...)nutzen. - MUST Detail-Aktionen ueber Action-Policy-Contract (
data-detail-action-policy,data-detail-action-kind,data-detail-confirm-message) steuern. - MUST NOT inline
confirm(...)(onclick/onsubmit) auf standardisierten Detailseiten nutzen.
Confirm + Telemetry Standard
- MUST Confirm-Dialoge zentral ueber den globalen Confirm-Service abwickeln.
- MUST NOT
window.confirm(...)in App-JS oder inline HTML-Handlern verwenden. - MUST relevante Frontend-Warnpfade zentral ueber Frontend-Telemetrie erfassen.
- MUST NOT relevante UX-/Fehlerpfade nur als Console-Warnung implementieren.
Frontend Page-Module Hard Cut
- MUST Seiteninitialisierung ueber dedizierte Module unter
web/js/pages/*umsetzen. - MUST Page-Config ueber
script[type="application/json"]+readPageConfig(...)bereitstellen/lesen. - MUST alle JS-
srcinpages/**undtemplates/**ueberassetVersion('...js...')laden. - MUST NOT inline
<script type="module">...</script>inpages/**odertemplates/**verwenden.
Component Lifecycle Runtime
- MUST migrierte Komponenten ueber
init(root, config)+destroy()standardisieren. - MUST NOT migrierte Komponenten per
DOMContentLoaded/Module-Sideeffect selbst auto-initialisieren. - MUST Listener, Timer und Observer, die in
init(...)entstehen, indestroy()wieder abbauen. - MUST Runtime-Konfiguration ueber Page-Config (
readPageConfig(...)) beziehen, keine verteilten Ad-hoc-Globals. - MUST host-gebundene UI-Komponenten ueber explizite
data-app-component-Hosts im Markup binden. - Global-Utilities ohne natuerliches Host-Element MAY via Runtime
scope: 'global'registriert werden, MUESSEN aber denselben Lifecycle-Contract inkl.destroy()einhalten.
Shared Partials
- MUST Listen-Titlebar ueber
templates/partials/app-list-titlebar.phtmlrendern. - MUST List-Tabs ueber
templates/partials/app-list-tabs.phtmlrendern. - MUST Purge-Action ueber
templates/partials/app-list-purge-action.phtmlrendern. - MUST Detail-Validation-Summary ueber
templates/partials/app-details-validation-summary.phtmlrendern.
RBAC in Templates
- MUST UI-Capabilities nur ueber
$viewAuthlesen. - MUST NOT
can('...')in Templates verwenden.
CSS Boundaries
- MUST Styles moeglichst lokal in
web/css/components,web/css/layoutoderweb/css/pageshalten. - MUST NOT globale unscoped Overrides ohne klaren Scope einfuehren.
- MUST Vendor-Overrides nur in
web/css/vendor-overrides/**pflegen. - MUST bestehende CSS-Variablen bevorzugen statt neue Inline-Farbwerte zu verteilen.