Две проблемы с диалогом

Версия платформы

JMix 2.7.1

Аддоны

Tabbed Application Mode

Архив проекта

exampleOne.zip (121.8 КБ)

Постановка

Из меню приложения должно открыватся диалоговое окно (через метод бина) в котором пользователь заполняет некоторые параметры создаваемой сущности (визард). По окончании и нажатии кнопки “Save/Сохранить” должно открыться стандартное окно редактирования сущности. До момента сохранения редактора сущность на должна сохрянаться в БД.

Реализация

Пример приложения сделан минимальным для демонстрации проблемы (сущность с одним полем). Используется вкладочный режим.
В реальном приложении визард имеет несколько вкладок, свою логику вынесенных в отдельную вью. Вид которой разительным образом отличается от редактора сущности. Часть полей заполненных через визард не доступны для дальнейшего изменения. Так же при закрытии визарда
запускается логика наполнения связанных сущностей. Визард основан на StandartView так как логика DetailView в нём не нужна. Пример визарда есть в сэмплах (https://demo.jmix.ru/ui-samples/sample/wizard).

Проблемы

1. Окно редактора не открывается в новой вкладке.

При закрытии диалога с визардом не смотря на указание ViewOpenMode.NEW_TAB окно редактора открывается так же в виде диалога.

@Subscribe
    public void onAfterClose(final AfterCloseEvent event) {
        if (event.closedWith(StandardOutcome.SAVE)) {
            openEditor(someEntityDc.getItem());
        }
    }

    private void openEditor(SomeEntity item) {
        viewBuilders.detail(view, SomeEntity.class)
                .editEntity(item)
                .withOpenMode(ViewOpenMode.NEW_TAB)
                .open();
    }

В метод viewBuilders.detail(view, SomeEntity.class) передаётся view = mainView приложения.

2. Интерфейс зависает после закрытия редактора.

При закрытии открывшегося диалога с редактором интерфейс приложения зависает и не реагирует на клики.

Ссылка на видео

Видео с описанными выше проблемами в облаке

Спасибо за подробное описание и тестовый проект.
Сможем заняться анализом проблемы примерно через 1-2 недели.

С уважением,
Константин

1 симпатия

Добрый день,

Первая проблема возникает из за того, что при наличии открытых модельных диалогов, новый экран принудительно открывается в диалоге, чтобы обеспечить доступ к нему. Регистрация и удаление открытых диалогов происходит в бине OpenedDialogWindows, который слушает события ViewOpenedEvent и ViewClosedEvent. В частности событие ViewClosedEvent бросается после AfterCloseEvent из за чего в момент срабатывания AfterCloseEvent считается, что диалог еще открыт.

Завел задачу, чтобы удалять регистрация открытого диалога, то срабатывания AfterCloseEvent.

В качестве обходного пути, можно до открытия редактора публиковать ViewClosedEvent, чтобы удалить диалог из списка открытых:

@Subscribe
public void onAfterClose(final AfterCloseEvent event) {
    if (event.closedWith(StandardOutcome.SAVE)) {
        ViewClosedEvent viewClosedEvent = new ViewClosedEvent(this);
        getApplicationContext().publishEvent(viewClosedEvent);

        openEditor(someEntityDc.getItem());
    }
}

По второй проблеме ничего сказать не могу, т.к. она не воспроизводится. Ссылка на видео не открывается.

С уважением,
Глеб