enhancement
major
minor
major
minor
major
#29556
react-api/tooltip runs without a TLSubSessionContext: a cell tooltip over a derived attribute using label() answers HTTP 500 (NullPointerException in Label.eval)
Affects 8.0.0-SNAPSHOT (2026-09-11), tl-layout-react / tl-layout-view.
Hovering a table cell whose column is a derived attribute with a storage expression that calls label(...) produces one HTTP 500 per hover on GET /<app>/react-api/tooltip?...:
java.lang.NullPointerException: ... TLContextManager.getSubSession() is null at com.top_logic.model.search.expr.config.operations.Label.eval(Label.java:50)
The tooltip request is served outside a TLSubSessionContext (no session-bound locale), so every script function that needs the session (label(), formats, currentUser()) fails while the same expression renders fine in the cell itself, which is evaluated inside the command/update path with a session.
Expected: the tooltip servlet establishes the same sub-session context as the other react-api endpoints before evaluating cell content.
Lösung
The ReactServlet endpoints /tooltip, /data and /state resolved the window's control without installing the window's TLSubSessionContext, while /i18n, /command, /upload, /navigateToRoute and /viewPick did. The table's tooltip lookup re-evaluates the cell content (TableView.cell(row, column)) to find a tooltip, so any cell over a script that needs the session failed there, even if no tooltip exists.
Every window-bound react-api handler now resolves the window through one shared step in ReactServlet that looks up the window's SSEUpdateQueue and installs its sub-session on the request's DisplayContext (ReactWindowReplay.installSubSession), so no endpoint evaluates control content without the session-bound locale and user.
Verification: the React demo's ticket table shows a derived Ticket#statusLabel column computed with label(...); hovering its cells answers 200 instead of 500.