enhancement
major
minor
major
minor
minor
#29676
TL Views admin: deleting an account logs "Target object is deleted" from the still-open account form; delete asks for no confirmation
Problem
In the React admin hub, under Zugriffskontrolle → Konten, deleting the selected account via "More → Löschen":
- deletes it at once, without a confirmation, although the delete cannot be undone;
- logs an ERROR, because the account detail form still listens to the deleted object:
ERROR EventBuilder - Failed to deliver change event to listener ReactDropdownSelectControl … WrapperRuntimeException: Target object is deleted … Account … name: probe
Seen in the TL Development app, snapshot build 42. The same holds for the deletes under Gruppen and Rollen: none of the three admin deletes asks for confirmation.
Expected
- The delete asks for confirmation.
- No detail control evaluates the deleted object.
Lösung
Ursache des Fehlers: Der löschende Commit und sein Modell-Event werden zugestellt, bevor der Auswahl-Kanal neu geschrieben wird. Ein Auswahlfeld im Kontoformular beobachtet die angezeigten Objekte (die Repräsentantengruppe, die mit dem Konto gelöscht wird) und greift bei deren Lösch-Event auf zwei Wegen auf gelöschte Objekte zu:
- es liest seinen Wert über das Feldmodell (BoundFieldModel.getValue() → AttributeFieldModel.readValue()) vom gelöschten Konto;
- es beschreibt den angezeigten Wert (Label, Farbe) und fragt dabei die gelöschte Gruppe nach ihrem Typ.
Korrekturen im Framework:
- Ein an ein Objekt gebundenes Feldmodell (BoundFieldModel) greift nicht mehr auf sein Objekt zu, solange dieses gelöscht ist: getValue() liefert den zuletzt angezeigten Wert, refreshFromObject() ändert nichts, eine Eingabe wird verworfen. Das gilt für alle Feld-Controls.
- Ein TLObjectOverlay (das bearbeitete Objekt im Editiermodus) ist genau so lange gültig (tValid()) wie das Objekt, für das es steht. Damit greift die Regel auch im Editiermodus, und das Formular blendet dort die Felder eines gelöschten Objekts ebenfalls aus.
- Ein Auswahlfeld (ReactDropdownSelectControl) lässt seine Anzeige unverändert, solange eines der angezeigten Objekte gelöscht ist – wie es eine Tabellenzelle (ReactResourceCellControl) bereits tut.
Die Felder behalten so ihre Anzeige, bis der Kanal den nächsten Wert liefert und das Formular sie ausblendet. Die Reihenfolge Commit → Kanal wird bewusst nicht umgedreht: Beobachter müssen ein gelöschtes Objekt für die Dauer der Event-Zustellung aushalten (so ist es für ChannelObjectObserver festgelegt); ein Leeren des Kanals vor dem Commit würde zudem von einem Formular mit ungespeicherten Änderungen per Veto blockiert.
Bestätigung: Die Lösch-Kommandos unter Konten, Gruppen und Rollen fragen vor dem Löschen per <confirm> nach und nennen dabei das zu löschende Objekt ("Konto probe löschen?").