enhancement
major
minor
defect
critical
major
minor
major
#30077
TL Views: Wizard - ein erneut betretener Auto-Weiter-Schritt ohne eigene Navigation lässt den Benutzer ohne Weg zurück in den Ablauf
Follow-up zu #29599 (Element <wizard>).
Problem
Ein Schritt mit auto-advance schaltet nur beim Betreten in Vorwärtsrichtung selbst weiter; ein Schritt, zu dem der Benutzer zurückkehrt, wartet auf ihn (ReactWizardControl.displayCurrentStep: AUTO_ADVANCE nur bei forward). Ein solcher Zwischenbildschirm hat typischerweise keine eigenen Buttons. Wird er erneut betreten, bleibt der Benutzer auf einem Schritt stehen, der weder weiterschaltet noch eine Navigation anbietet.
Erreichbar ist das über
- "Zurück" des folgenden Schritts (<wizard-back/> führt in den Zwischenschritt),
- die Schrittliste (step-list): ein erledigter Schritt ist anklickbar und springt zurück, auch ein Auto-Weiter-Schritt, und
- den Zurück-Button des Browsers: der Zwischenschritt steht mit eigener Adresse in der Browser-Historie.
Nachstellen in tl-demo-react, Navigation "Assistent": Start, Namen eingeben, Weiter; nach dem automatischen Wechsel auf "Rolle" in der Schrittliste "Wird eingerichtet" anklicken. Der Schritt zeigt nur seinen Text, schaltet nicht weiter, und die Fußzeile hat keine Buttons; heraus kommt man nur über die Schrittliste. (Für "Zurück" umgeht die Demo das inzwischen, indem der Zurück-Button der ersten Frage direkt zum Profil springt, siehe #30045.)
Lösung
Ein Schritt mit auto-advance ist ein Durchgangsschritt (WizardStep.passThrough()): der Ablauf führt durch ihn hindurch, der Benutzer kehrt nie zu ihm zurück.
- Zurück überspringt Durchgangsschritte. <wizard-back/> (WizardScope.back()) geht zum nächsten vorangehenden Schritt ohne auto-advance, auch über mehrere Durchgangsschritte hinweg; <wizard-has-back/> ist nur erfüllt, wenn es einen solchen gibt.
- Die Schrittliste bietet einen Durchgangsschritt nicht als Sprungziel an: ein erledigter Durchgangsschritt wird als Text statt als Schaltfläche dargestellt (Eintrag transit im Zustand der Schritte); der Befehl gotoStep weist ihn ebenfalls ab.
- Die Zeit eines Durchgangsschritts läuft bei jedem Betreten, nicht nur in Vorwärtsrichtung (z.B. nach einem expliziten <wizard-goto>). Ein Schritt, der bei einer Neuberechnung der Schrittfolge nur seine Position ändert, zählt weiter, statt neu zu beginnen.
- Ein Durchgangsschritt ist keine Adresse. Er zeigt typischerweise eine laufende Verarbeitung, die sich durch Laden einer URL nicht erzwingen lässt. Solange er angezeigt wird, hält ReactWizardControl eine Navigation des RouteManager offen (beginNavigation()), sodass die Adresszeile auf dem vorangehenden Schritt bleibt; erst der Schritt danach wird als ein Eintrag der Browser-Historie gemeldet. Der Zurück-Button des Browsers führt damit vom Schritt nach dem Zwischenschritt direkt zu dem davor, ein Neuladen während des Zwischenschritts zeigt den Schritt davor. Damit die Bindung des Schrittkanals an die URL (<param-bindings>) den Zwischenschritt nicht vorher meldet, ist jede Bewegung des WizardScope eine Navigation (RouteManager.navigate(...)), auch die Wiederholung nach einem Veto wegen ungespeicherter Änderungen (neu: ChannelVetoException.withContinuation(Runnable)). Verlässt der Wizard die Anzeige während eines Durchgangsschritts oder wird er entsorgt, endet die Navigation ebenfalls. Ein direktes Schreiben des Schrittkanals an der Wizard-API vorbei (<write-channel>) ist keine solche Navigation.
- Eine URL, die dennoch einen Durchgangsschritt nennt (alte Lesezeichen, von Hand eingegeben), zeigt den Schritt, zu dem "Zurück" von dort führen würde; die Adresszeile wird darauf korrigiert (neu: RouteManager.isAdopting()). Geht kein solcher Schritt voraus (der Ablauf beginnt mit dem Zwischenschritt), läuft der Durchgangsschritt.
- Die Sonderbehandlung im Zurück-Button der Demo (demo/wizard-demo.view.xml) entfällt; die Frage "Rolle" verwendet wieder ein einfaches <wizard-back/>. Beschrieben im Entwicklerartikel view-layer/navigation (Abschnitt Auto-advance).