Подскажите как лучше реализовать дополнительное окно после редактирования сущности

Добрый день. Имеется сущность которая может меняться из разных мест. Если изменения носят какой-то определенный характер (например изменяется статус на “такой-то”), то мне нужно открыть дополнительное окошко в которое необходимо ввести дополнительные параметры этой сущности.

Пробовал через entity listener методом onBeforeUpdate открыть окошко, но я так понял в лисенерах нельзя взаимодействовать с UI, или понял не правильно?

Подскажите как лучше всего это реализовать?

Добрый день

Я думаю универсального решения здесь не может быть в принципе.
Потому что: ваши требования подразумевают что коммит нужно прервать, создать и показать пользователю новое окно для ввода данных.
Дальше поток исполнения прерывается, чтобы вернуть управление пользователю

После того как пользователь ввёл необходимые данные, коммит родительского экрана нужно перезапустить заново (но уже не запрашивать доп поля). Тут-то и нужно знать контекст, из какого места был запущен коммит окна.

Поэтому тут вариант только писать утилитный класс с подобным API и использовать его во всех экранах где ваша сущность редактируется.
Что-то в этом духе, для наследника AbstractEditor:

private boolean inCommit = false;

@Override
public void commitAndClose() {
    if (!inCommit && MyEntityChangeTracking.myEntityIsChanged(getDsContext()) {
        MyEntityChangeTracking.showAdditionalDataInputWindow(getItem(), () -> {
              // коллбек после ввода необходимых данных
              inCommit = true;
              try {
                  commitAndClose();
              } finally {
                  inCommit = false;
              }
        });
        // просто ничего не делать, или выбросить это исключение
        throw new SilentException();
    } else {
        super.commitAndClose();
    }
}

Если сущность редактируется не в AbstractEditor, то нужно будет переопределять какой-то другой метод.

1 симпатия

Спасибо, так и сделаю.