enhancement
major
minor
major
minor
major
#29923
React-Oberfläche: Inhalt eines Navigationseintrags mit route="none" erzeugt URLs, die sich nicht öffnen lassen
Problem
Beobachtet
In der React-Oberfläche wird ohne Anmeldung http://localhost:8130/tl-demo-react/view/access-control/coverage aufgerufen (die URL, die die Anwendung für Administration > Zugriffskontrolle > Abdeckung anzeigt). Nach der Anmeldung zeigt die Anwendung nicht die Abdeckung, sondern die Startseite; die Adresszeile springt auf /view/attributes/table.
Das Gleiche passiert angemeldet in einem neuen Tab, über ein Lesezeichen oder einen geteilten Link, für jede Seite unterhalb von Administration (access-control, access-control/accounts, access-control/coverage). Andere Einträge wie projects funktionieren. F5 im selben Tab bleibt dagegen auf der Seite, weil der Server den Zustand des Fensters noch hat.
Erwartet
Eine URL, die die Anwendung anzeigt, öffnet in einem neuen Fenster dieselbe Seite. Ein Bereich, der keine URL haben soll, zeigt auch keine.
Nachstellen
- com.top_logic.demo.react starten, als root anmelden.
- Administration > Zugriffskontrolle > Abdeckung öffnen, URL kopieren.
- URL in einem neuen Tab öffnen.
- Ergebnis: Die Startseite erscheint, nicht die Abdeckung.
Ursache
- In app.view.xml (com.top_logic.layout.view) hat der Sidebar-Eintrag administration das Attribut route="none". Er trägt damit kein Segment zur URL bei (SidebarElement.resolveRoute, NO_ROUTE).
- Sein Inhalt (admin/admin.view.xml) enthält aber Tab-Leisten, die als Routing-Teilnehmer ihre Segmente trotzdem in die URL schreiben, direkt an der Stelle, an der das Segment des Eintrags stehen müsste: /view/access-control/coverage.
- Beim Öffnen der URL in einem Fenster ohne Zustand bekommt die Sidebar das erste Segment access-control. Sie findet keinen Eintrag mit dieser Route, fällt auf ihren Standard-Eintrag zurück und korrigiert die Adresszeile.
- Die Kombination „Eintrag ohne Route, dessen Inhalt Routen schreibt“ erzeugt damit grundsätzlich URLs, die die Anwendung selbst nicht wieder öffnen kann. Das gilt für jede Anwendung, die so konfiguriert ist, und ebenso für Tabs mit route="none" (TabBarElement), ohne Fehler oder Warnung.
Lösung
Konfiguration
- Der Eintrag administration in app.view.xml bekommt eine Route (Attribut route="none" entfernt). Die Seiten der Administration liegen damit unter /view/administration/..., z. B. /view/administration/access-control/coverage, und lassen sich direkt öffnen.
Engine
- route="none" bedeutet „dieser Bereich hat keine URL“, und zwar für den ganzen Teilbaum: Routing-Teilnehmer unterhalb eines Navigationseintrags oder Tabs ohne Route funktionieren weiter (Tabs wechseln usw.), tragen aber nichts zur URL bei. Der RouteManager überspringt einen solchen Teilbaum beim Zusammensetzen der URL.
- Solange ein solcher Bereich angezeigt wird, zeigt die Adresszeile nur den gerouteten Teil darüber (bei einem Sidebar-Eintrag /view/). Es entsteht keine URL mehr, die woanders landet.
- F5 im selben Tab bleibt auf der angezeigten Seite, wie bisher: Der Server hat den Zustand des Fensters, und die URL nennt keine Route, die zurückgesetzt werden müsste.
Migration
Eine Anwendung, die route="none" an einem Navigationseintrag oder Tab setzt, dessen Inhalt Deep-Links haben soll, entfernt das Attribut. Die bisher angezeigten URLs ließen sich ohnehin nicht öffnen.
Erledigt, wenn
- /view/administration/access-control/coverage öffnet in einem neuen Tab und nach einem Login über diesen Link die Abdeckung.
- Ein Eintrag mit route="none" und gerouteten Tabs im Inhalt zeigt beim Anwählen und Wechseln der Tabs keine Segmente dieses Teilbaums in der Adresszeile.
- F5 auf einer Seite in einem solchen Bereich bleibt auf der Seite.
- Ein Test belegt, dass Teilnehmer unterhalb eines Teilbaums ohne Route nichts zur URL beitragen.