critical
#29108
Lightweight UI definition layer (TL Views) based on React UI-Components
Problem
The current LayoutComponent system conflates layout, model binding, data flow, security, commands, lifecycle, and rendering into a single heavy abstraction. Every configurable UI piece must be a full LayoutComponent, even if it only needs one of these capabilities. Layout is constrained to horizontal/vertical splitter panels.
This makes the system rigid, hard to compose, and unnecessarily heavyweight for simple UI definitions.
Solution: TL Views
Introduce a new UIElement-based view definition layer on top of the existing Control infrastructure. The design principle is progressive capability: the base element is nearly zero-cost, and capabilities (model binding, channels, security, commands) are added declaratively only when needed.
UIElement (base — just renders) + model-builder → adds model binding (opt-in) + channel(...) → adds reactive data flow (opt-in) + secure(...) → adds access control (opt-in) + commands(...) → adds action handling (opt-in)
Views are identified by file path (customers/masterDetail.view.xml), eliminating naming conflicts. Data flow uses a unified channel concept for both intra-view and inter-view communication. Commands are scoped to panels with placement-based display and a clique system for ordering and grouping.
A ViewHostComponent bridge and a <legacy-component> adapter ensure coexistence with the existing LayoutComponent system during gradual migration.
Migration
The view layer itself is additive, but a few engine changes made for it affect existing applications:
- Font Awesome stylesheet path. The stylesheet moved from /style/fontawesome/css/all.css (all.min.css) to /style/fontawesome.css (fontawesome.min.css); the core theme lists the new path. Application themes that do not extend core and list the sheet themselves, and JSPs linking the old path, must be updated. Icon class names are unchanged.
- com.top_logic.basic.graph.ExplicitGraph moved to com.top_logic.basic.shared.graph.ExplicitGraph (module tl-basic-shared, a dependency of tl-basic): change the import.
- The classes TechnicalNamesLabelProvider, DefaultNodePortCoordinateAssigner, DefaultNodeSizer, JSONDefaultLayoutGraphExporter, DiagramTextRenderingConstants and DiagramTextRenderingUtil keep their package com.top_logic.graph.layouter... but moved from the module tl-graph-layouter to tl-graph-diagramjs-server. An application that reaches them through a direct dependency on tl-graph-layouter only must add tl-graph-diagramjs-server.
- ModeSelector.traceDependencies(...) and ConstraintCheck.traceDependencies(...) take an OverlayLookup instead of a FormContext as last parameter (an AttributeUpdateContainer is an OverlayLookup); ScriptTracer.execute(...) likewise.
- OrientationAware.Orientation is ExternallyNamed: configuration properties of that type are written and read as horizontal / vertical; XML using HORIZONTAL / VERTICAL no longer parses.
- ExternalAuthenticationServlet no longer reuses an existing anonymous session, only an authenticated one.
- The generated React bundles under src/main/webapp/script/ of the React modules are no longer committed (#29547). Outside Eclipse, run mvn compile on the React modules once after a checkout or branch switch. Applications without React modules are unaffected.