RelatedAction

RelatedAction – это действие с коллекцией, предназначенное для открытия экрана браузера со списком связанных сущностей. Связанные сущности отбираются с учетом пользовательских разрешений для сущностей, атрибутов сущностей и экранов.

Экран браузера со списком связанных сущностей должен содержать компонент Filter.

Действие реализовано классом io.jmix.ui.action.list.RelatedAction и объявляется в XML с помощью атрибута type="related". Общие свойства действий можно конфигурировать с помощью атрибутов элемента action, подробнее см. раздел Декларативные действия. Ниже рассматриваются параметры, специфичные для класса RelatedAction.

Параметры

Следующие параметры можно установить и в XML, и в Java:

  • openMode - режим открытия экрана, задаваемый значением перечисления OpenMode: NEW_TAB, DIALOG, и т.д. По умолчанию экран открывается в режиме THIS_TAB.

  • screenId - строковый идентификатор экрана. По умолчанию используется экран, аннотированный @PrimaryEditorScreen, или имеющий идентификатор вида <entity_name>.browse, например demo_Customer.browse.

  • screenClass - класс Java экрана. Данный параметр имеет более высокий приоритет, screenId.

  • property - свойство, из которого нужно отобразить связанные сущности.

  • configurationName - заголовок, который будет присвоен фильтру в открывшемся экране.

Например, если необходимо открыть определенный экран в режиме диалога, действие можно сконфигурировать в XML следующим образом:

<action id="related" type="related">
    <properties>
        <property name="property" value="favouriteBrands"/>
        <property name="openMode" value="DIALOG"/>
    </properties>
</action>

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

@Named("customersTable.related")
private RelatedAction relatedAction;

@Subscribe
public void onInit(InitEvent event) {
    relatedAction.setOpenMode(OpenMode.DIALOG);
    relatedAction.setProperty("favoriteBrands");
}

Обработчики

Далее рассматриваются параметры, которые можно сконфигурировать только программно в Java. Для генерации корректно аннотированных методов для этих параметров используйте Studio.

screenOptionsSupplier

Это обработчик, возвращающий объект ScreenOptions для передачи в открываемый экран выбора. Например:

@Install(to = "customersTable.related", subject = "screenOptionsSupplier")
private ScreenOptions customersTableRelatedScreenOptionsSupplier() {
    return new MapScreenOptions(ParamsMap.of("someParameter", 10));
}

Возвращаемый объект ScreenOptions будет доступен в InitEvent открываемого экрана.

screenConfigurer

Это обработчик, принимающий экран для его конфигурирования перед открытием. Например:

@Install(to = "customersTable.related", subject = "screenConfigurer")
private void customersTableRelatedScreenConfigurer(Screen screen) {
    ((BrandBrowse) screen).setSomeParameter(10);
}

Обратите внимание, что конфигуратор экрана вступает в действие, когда экран уже инициализирован, но еще не показан, то есть после InitEvent и AfterInitEvent, и до BeforeShowEvent.

afterCloseHandler

Это обработчик, вызываемый после закрытия экрана. Принимает AfterCloseEvent. Например:

@Install(to = "customersTable.related", subject = "afterCloseHandler")
private void customersTableRelatedAfterCloseHandler(AfterCloseEvent afterCloseEvent) {
    System.out.println("Closed with " + afterCloseEvent.getCloseAction());
}

Using ActionPerformedEvent

Можно также подписаться на ActionPerformedEvent, и вместо вызова метода execute() действия, использовать для открытия экрана выбора ScreenBuilders API напрямую. Например:

@Subscribe("customersTable.related")
public void onCustomersTableRelated(Action.ActionPerformedEvent event) {
    RelatedEntitiesBuilder builder = relatedEntitiesSupport.builder(this);
    Screen brandBrowser = builder
            .withMetaClass(metadata.getClass(Customer.class))
            .withProperty("favoriteBrands")
            .withSelectedEntities(customersTable.getSelected())
            .withConfigurationName("See favourite brands")
            .build();
    brandBrowser.show();
}