enhancement
major
minor
defect
critical
major
minor
minor
#30258
React-UI: Reiter nur für einen Typ zeigen geht nur über eine Typabweichung in access-control, und die wird als WARN geloggt
Hintergrund
Ein Reiter gehört oft nur zu bestimmten Objekten der Auswahl. Beispiel: Im Statusbericht eines Projektbaums gibt es den Reiter „Reifegrad“ nur am Projekt, nicht an Teilprojekten oder Arbeitspaketen. Die Reiter „Anhänge“ und „Blätter“ gibt es nur in Projekten, nicht in Vorlagen. Wechselt die Auswahl, soll der Reiter erscheinen oder verschwinden.
Problem
Ein <tab> hat keine Sichtbarkeitsbedingung. Der einzige Weg, ihn abhängig vom Objekt auszublenden, ist <access-control> mit einem type:
<access-control inputs="element" object="$element" operation="Read" type="prime:Project"/>
- Das funktioniert: Ist das Objekt kein prime:Project, gilt die Prüfung als „No access“, und mit denied="hide" verschwindet der Reiter.
- Die Doku nennt diesen Fall aber eine Typabweichung, die geloggt wird. Jeder Wechsel der Auswahl auf ein Teilprojekt erzeugt eine WARN-Zeile, oft zwei:
WARN OperationCheck - Access to 'AttributedWrapper(type:prime:Subproject, id: GenericObject:3628, name: Umsetzung)' denied: it is no instance of the type 'prime:Project' declared by an 'access-control' checking the operation 'Read'.
- Das Log füllt sich im normalen Betrieb mit Warnungen, die keinen Fehler anzeigen.
- Die Alternative object = null für andere Typen hilft nicht: Dann gilt der Reiter als „Empty“ und bleibt sichtbar, nur ohne Inhalt.
Version: 8.0.0-alpha12, React-View-Layer (tl-layout-view, OperationCheck, UnitAccess).
Reproduktion
- In einer Ansicht mit Baum und Reitern einen Reiter mit <access-control inputs="element" object="$element" operation="Read" type="<Typ A>"/> versehen.
- Im Baum ein Objekt vom Typ A wählen: Der Reiter ist da.
- Ein Objekt eines anderen Typs wählen: Der Reiter verschwindet wie gewünscht. Im Log steht die WARN-Zeile oben.
Beispiel aus einer Anwendung (Prime): status-report.view.xml, Reiter „Reifegrad“ (nur am Projekt) sowie „Anhänge“ und „Blätter“ (nur in Projekten, nicht in Vorlagen; geprüft wird die Strukturwurzel).
Lösung
Jede Einheit, die ein <access-control> tragen kann (Reiter, Akkordeon-Abschnitt, Kachel, Navigationseintrag, Navigationsgruppe und -abschnitt der Seitenleiste), bekommt eine Sichtbarkeitsbedingung <visibility> über eigene Eingänge:
<tab id="maturity"> <visibility inputs="element" expr="$element.instanceOf(`prime:Project`)"/> ... </tab>
- Liefert der Ausdruck keinen wahren Wert im Sinne von TL-Script (null, false, leere Liste, leerer Text), wird die Einheit in ihrem Container (Reiterleiste, Akkordeon, Dashboard, Seitenleiste) ausgeblendet; ändert sich ein Eingang oder ein Objekt, das ein Eingang hält, wird neu entschieden. Die Bedingung einer Gruppe oder eines Abschnitts der Seitenleiste gilt für alle Einträge darin.
- Die Bedingung ist keine Rechteprüfung und erzeugt keine Log-Ausgabe. Solange sie nicht erfüllt ist, wird ein zusätzliches <access-control> der Einheit nicht ausgewertet, auch nicht vom Inhalt eines noch geöffneten Reiters oder Navigationseintrags.
- Der Name <visible-if> (wie die gleichnamige Regel an Kommandos) ist an Reitern nicht möglich, da <visible-if> dort bereits ein Inhaltselement ist.
- Die Typabweichung in <access-control> bleibt eine WARN-Meldung: sie zeigt einen Konfigurationsfehler an. Die Meldung nennt jetzt die Abhilfe (<visibility> an einer Einheit, die Regel <visible-if> in der executability eines Kommandos), ebenso die Doku von access-control/@type und der Artikel view-layer/access-control.
- Demo: tl-demo-react, Demos → Baum-Demo: Der Reiter „Tickets“ im Detailbereich erscheint nur bei Auswahl eines Meilensteins.
Migration
Ein <access-control>, dessen type nur dazu dient, eine Einheit für Objekte anderer Typen auszublenden, wird durch <visibility inputs="..." expr="$x.instanceOf(`<Typ>`)"/> ersetzt (bzw. ergänzt, wenn zusätzlich eine Rechteprüfung gewollt ist; deren type ist dann ein Typ, den alle geprüften Objekte haben).