Как получить значение выбранной сущности при закрытии диалогового окна?

Здравствуйте.

Jmix version: 2.1.2
jmix Studio plugin version: 2.1.2-232
IntelliJ version: IntelliJ IDEA 2023.2.5 (Community Edition)

Несколько вопросов.

  1. Есть таблица и стандартная кнопка “Add”, для нее есть стандартный handler

@Install(to = “boxesForZipProject.addBoxAction”, subject = “afterCloseHandler”)
private void boxesForZipProjectAddBoxActionAfterCloseHandler(final DialogWindow.AfterCloseEvent afterCloseEvent) {

    if (afterCloseEvent.closedWith(StandardOutcome.SELECT)) {
       //Как здесь получить значение которое выбрали в диалоговом окне
       
    }
}

Я ожидал что afterCloseEvent.getView или getSource вернет диалоговое окно и оттуда смогу добраться до сущности, но автоматически это почему то тип DivideView(экран где находится таблица и откуда я открываю диалоговое окно).

  1. Я могу насильно передать вместо
    final DialogWindow.AfterCloseEvent afterCloseEvent
    final DialogWindow.AfterCloseEvent afterCloseEvent и в одном месте так у меня и работает, но это как то совсем не верно(.

  2. Если я хочу открывать в диалоговом окне не лист сущностей(у меня это “ящики”) а открывать диалоговое окно с другой справочной таблицей (каталог ящиков) и при выборе-копировать в свою таблицу сущностей. Я применил для стандартного действия addAction
    boxesForZipProjectAddBoxAction.setViewClass(BoxesCatListView.class);
    и где мне теперь поймать эту выбранную сущность, а далее я смогу создать свою сущность “ящик”, скопировать нужные мне поля и т.д.
    Надо ли мне при закрытии диалогового окна как то возвращать выбранную сущность или это произойдет автоматически?

Здравствуйте!

Чтобы получить доступ к выбранной сущности вы можете воспользоваться фрагментом кода ниже:

    @Install(to = "usersDataGrid.add", subject = "afterCloseHandler")
    private void usersDataGridAddAfterCloseHandler(final DialogWindow.AfterCloseEvent<UserListView> afterCloseEvent) {
        if (afterCloseEvent.closedWith(StandardOutcome.SELECT)) {
            afterCloseEvent.getView().getLookupComponent().getSelectedItems();
        }
    }

Диалоговое окно, которое возвращается, зависит от типизации события в аргументе этого обработчика. Если вы вручную заменили viewClass, который будет использоваться для открытия диалогового окна, то вам нужно поменять типизацию в этом методе.

Например, если я поменяю класс:

<action id="add" type="list_add">
    <properties>
        <property name="viewClass" value="my.other.class.OtherListView"/>
    </properties>
</action>

То сигнатура метода поменяется на:

    @Install(to = "usersDataGrid.add", subject = "afterCloseHandler")
    private void usersDataGridAddAfterCloseHandler(final DialogWindow.AfterCloseEvent<OtherListView> afterCloseEvent) {
        // implementation code
    }

С уважением,
Дмитрий

1 симпатия

Спасибо большое, разобрался)