enhancement
major
minor
major
minor
Kontext
In der React-Oberfläche (View-Layer, .view.xml) war der Titel des Browser-Tabs fest auf "TopLogic View" gesetzt (ViewServlet). Eine Anwendung konnte ihren Tab weder benennen, noch passte sich der Titel an den angezeigten Inhalt an. Die klassische Oberfläche konnte beides (Anwendungstitel in MainLayout, dynamischer Titel über PageTitleResolver).
Verhalten
- Jede Anwendung konfiguriert ihren Titel (internationalisiert) in der ViewConfig (<title><en>..</en><de>..</de></title>). Er steht bereits im ausgelieferten HTML; ohne Konfiguration heißt die Seite "TopLogic".
- Der Tab-Titel folgt der Navigation: Er setzt sich aus dem Label des spezifischsten angezeigten Routen-Teils und dem Anwendungstitel zusammen, z.B. Login 1 – TopLogic React Demo. Während die Anmeldeseite angezeigt wird, steht dort nur der Anwendungstitel.
- Das Label gehört zur Routen-Deklaration: Sidebar-Eintrag und Tab (jeweils nur mit Route) tragen ihr Label bereits, ein Kachel-Rahmen sein <label> (das Label des Breadcrumbs). Eine Pfad-Parameter-Bindung (<param-bindings><bind ...>) erhält optional ein <label> (gleiche Konfiguration wie beim Kachel-Rahmen, ScriptedTileLabel / StaticTileLabel). Eine Bindung ohne Label und Query-Parameter tragen nichts bei; dann gilt das nächste weiter außen liegende Label.
- Mit final-title="true" an einer Routen-Deklaration (<frame>, <bind>, <nav-item>, <tab>) bleibt deren Label der Titel der Seite, solange sie aktiv ist: Routen in ihrem Inhalt (z.B. die Tabs einer Personen-Kachel) tragen weiter ihre Segmente zur URL bei, aber nicht ihr Label zum Titel. Standard ist false (der Inhalt präzisiert den Titel).
- Jeder Eintrag der Browser-Historie (Zurück-Menü) trägt den Titel der Seite, zu der er führt.
- Ändert sich nur das Label, wird der Titel ohne neuen Historien-Eintrag nachgeführt. Ein Label, das der Umbenennung des angezeigten Objekts folgen soll, liest einen <derived-channel> mit dem Namen (der das Objekt beobachtet).
{{{#!xml <channels> <derived-channel name="ticketName" expr="$ticket.get(demo.tickets:Ticket#name)" inputs="ticket"/> </channels> <param-bindings> <bind channel="ticketId" prefix="ticket" route-param="ticket"> <label class="com.top_logic.layout.view.tiles.ScriptedTileLabel" expr="$name" inputs="ticketName as name"/> </bind> </param-bindings>
<tile-stack ...> <frame final-title="true" route="person/:person" view="demo/tiles-demo/person-detail.view.xml">...</frame> </tile-stack> }}}
Technische Hinweise
- RoutingParticipant.activeRouteLabel() liefert das Label des aktiven Routen-Teils; der RouteManager setzt den Titel aus den angezeigten Teilnehmern zusammen (gleiche Anzeige-Reihenfolge wie für die URL), Format PAGE_TITLE__LABEL_APP ("{0} – {1}").
- RoutingParticipant.titlesContent() (analog zu routesContent()) schließt die Teilnehmer im Inhalt eines Teilnehmers von der Titelbildung aus; der Anzeige-Durchlauf in SSEUpdateQueue liefert dem RouteManager dafür eine eigene Liste. Konfiguriert über das Mixin WithFinalTitle.
- TileLabelProvider.observedChannels() meldet die Kanäle, aus denen ein Label berechnet wird; die Pfad-Parameter-Bindung beobachtet sie, solange sie beim RouteManager registriert ist.
- Der Titel wird mit dem RouteChangeEvent (title) an den Client übertragen und dort nach pushState/`replaceState` als document.title gesetzt. Eine reine Titeländerung kommt als Ersetzung der aktuellen URL.
- Dokumentation: Entwicklerartikel view-layer/navigation, Abschnitt "Browser tab title".