enhancement
major
minor
major
minor
major
#29629
TL Views: `<show-view>` / `<show-views>` actions reveal a mounted view by name and write its channels from a command chain without a model object
Problem
The app bar of the issue tracker tl-dev holds a <value-input> search box (#29542) whose <on-submit> chain resolves a ticket key and <show-object>`s the ticket. A term that names no ticket should instead show the ''Tickets'' section with its list searched for the term: write the term into the list's `search-term channel and the preset all into its active-preset channel (#29605) and reveal the section, so that the user lands on /view/tickets?filter=all&q=<term>.
Nothing in the view layer does the last step from a command chain (engine master of 2026-09-21, tag inventory of com.top_logic.layout.view and com.top_logic.layout.react checked):
- <show-object> is the one declarative entry into the reveal protocol of #29532, and ObjectNavigation.show demands a TLObject whose type selects a DisplayTarget (ERROR_NOT_A_MODEL_OBJECT__VALUE otherwise). A search is not an object.
- <navigate-push> / <navigate-pop> / <navigate-pop-to> act inside the tile stack the command sits in; the app bar sits in none.
- <select-view> is the designer's view picker; <reveal> exists only as a classic PostCreateAction; there is no navigate-to-URL action.
- SidebarElement.Config.active-item is a static string, not a channel.
Besides, a tile stack's home frame has a channel namespace of its own (ReactTileStackControl.buildFrame(_initialViewPath, Map.of(), INITIAL); only bind-path-to reaches a frame), so a channel declared in the section view or the shell does not reach the list's table either; the channels of #29605 have to live in the frame view, where only a reveal step with `<bind>`s can write them from outside.
The only way today is a transient model type standing for the search (tl.dev:TicketSearch with a term) and a DisplayTarget for it whose <show view="tickets-list.view.xml"> binds activeFilter to 'all' and searchTerm to the term - a model type whose sole purpose is to be handed to <show-object>.
Request
A view action for a command chain that reveals a view by name and writes its channels, the way one <show> step of a display target does, without an object:
<show-view view="tickets-list.view.xml"> <bind channel="activeFilter" expr="term -> 'all'"/> <bind channel="searchTerm" expr="term -> $term"/> </show-view>
carried out through the existing reveal protocol (ObjectNavigation with the chain value in place of the object): the sidebar item is activated, the stack is popped to the home frame or the frame pushed, and the bindings are written in the order the display target writes them, so the query bindings of the view report the new address. A <show-view> chain of several steps is the same as a display target's <show> list, and a display target could then be written as that chain.
Lösung
Das Reveal-Protokoll von ObjectNavigation wird für beliebige Werte geöffnet: ein neuer Einstieg führt eine gegebene Liste von ShowStep`s mit dem Kettenwert an Stelle des Objekts aus (Container öffnen, Stack pushen/poppen, Bindings in Reihenfolge schreiben, Veto-Behandlung). `<show-object> löst wie bisher das Display-Target über den Typ auf und delegiert dorthin.
Zwei neue Aktionen für Kommandoketten im Paket com.top_logic.layout.view.navigation:
- <show-view view="…" [dialog] [label] [label-expr]> mit <bind channel="…" expr="…"/>-Kindern: genau die Attribute eines <show>-Schritts eines Display-Targets (die Konfiguration erweitert DisplayTargetService.ShowConfig); die expr der Bindings erhält den Kettenwert.
- <show-views> mit <show …>-Kindern: mehrere Schritte in einem Reveal, so dass ein Schritt innerhalb der zuvor angezeigten View gesucht wird (z.B. ein Tab eines gepushten Frames) - die Schreibweise eines Display-Targets in der Kette.
Beide reichen den Kettenwert unverändert weiter. Die Umwandlung ShowConfig → ShowStep ist mit dem DisplayTargetService geteilt.
Demo (tl-demo-react, Tickets): Das Sprungfeld in der App-Bar zeigt für einen Text, der kein Ticket benennt, die Ticketliste mit dem Preset all und dem Text als Suchbegriff (/view/tickets?filter=all&q=<text>).