enhancement
major
minor
defect
critical
major
minor
minor
#30211
React: Eingebaute Regeln von delete-object und Co. greifen vor den konfigurierten (visible-if wirkungslos)
Problem
<delete-object/> (ebenso persist-transient, create-transient) bringt eigene Ausführbarkeitsregeln mit, die vor den konfigurierten ausgewertet werden. Lehnt eine davon ab (z. B. kein Löschrecht), ist der Befehl deaktiviert sichtbar, auch wenn ein konfiguriertes <visible-if> ihn ausblenden würde. Bei konfigurierten Regeln bestimmt die Reihenfolge in <executability>, was zuerst gilt (ein visible-if lässt sich an den Anfang stellen). Die eingebauten Regeln lassen sich dagegen nicht einordnen: Ein visible-if kann nicht vor sie gestellt werden.
Dasselbe gilt für die Prüfungen aus <access> eines Befehls: Sie laufen vor den konfigurierten Regeln, so dass z. B. ein Befehl mit <access><operation name="Write" object="$area" .../></access> und <visible-if expr="$structure == 'line'"/> bei leerem $area deaktiviert sichtbar bleibt.
Version: 8.0.0-alpha12, React-View-Layer (tl-layout-view/tl-layout-react).
Reproduktion (Prime)
Archiv, Reiter „Dokumente“, Links: Befehl „Link löschen“ mit <visible-if expr="$readOnly != true"/> und der Aktion <delete-object/>.
- Im Archiv (kein Löschrecht) bleibt „Link löschen“ als deaktivierter Eintrag sichtbar.
Prime: Dokument und Link werden per Script gelöscht. Nebenwirkung: Der „Ja“-Knopf der Rückfrage ist nicht rot.
Erwartetes Verhalten
- Konfigurierte visible-if-Regeln gelten vor den eingebauten Regeln.
- Die rote Löschrückfrage lässt sich auch für Löschungen per Script einstellen.
Lösung
- Die konfigurierten <executability>-Regeln eines Befehls werden zuerst ausgewertet, danach die Prüfungen aus <access>, zuletzt die Regel, die eine Aktion selbst mitbringt (delete-object, persist-transient, create-transient). Innerhalb der konfigurierten Regeln bestimmt weiterhin deren Reihenfolge, welche Ablehnung gilt (siehe #30210). Ein konfiguriertes visible-if blendet den Befehl damit aus, auch wenn eine eingebaute Prüfung ihn ablehnen würde.
- Ein Befehl in der Gruppe clique="delete" ist auch dann destruktiv, wenn seine Aktionen das nicht selbst anzeigen (z. B. Löschen per <execute-script>). Eine <confirm>-Rückfrage in einem solchen Befehl zeigt die bestätigende Antwort deshalb rot, wie vor <delete-object/>.