ExcludeAction

ExcludeAction – это действие с коллекцией, предназначенное для удаления экземпляров сущности из контейнера данных в UI. В отличие от RemoveAction, ExcludeAction не удаляет сущности из базы данных, что требуется, например, при работе с many-to-many коллекциями.

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

Параметры

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

  • confirmation - булевское значение, указывающее, отображать ли диалог подтверждения перед удалением выбранных сущностей. По умолчанию true.

  • confirmationMessage - сообщение диалога подтверждения. По умолчанию, берется из главного пакета сообщений по ключу dialogs.Confirmation.Remove.

  • confirmationTitle - заголовок диалога подтверждения. По умолчанию, берется из главного пакета сообщений по ключу dialogs.Confirmation.

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

<action id="exclude" type="exclude">
    <properties>
        <property name="confirmation" value="true"/>
        <property name="confirmationTitle" value="Removing brand..."/>
        <property name="confirmationMessage"
                  value="Do you really want to remove the brand from the list?"/>
    </properties>
</action>

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

@Named("brandsTable.exclude")
private ExcludeAction<Brand> excludeAction;

@Subscribe
public void onInitEntity(InitEntityEvent<Customer> event) {
    excludeAction.setConfirmation(true);
    excludeAction.setConfirmationTitle("Removing brand...");
    excludeAction.setConfirmationMessage("Do you really want to remove the brand from the list?");
}

Обработчики

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

afterActionPerformedHandler

Это обработчик, вызываемый после того, как выбранные сущности удалены. Принимает объект события, который можно использовать для получения выбранных для удаления экземпляров. Например:

@Install(to = "brandsTable.exclude", subject = "afterActionPerformedHandler")
private void brandsTableExcludeAfterActionPerformedHandler(RemoveOperation.AfterActionPerformedEvent<Brand> event) {
    System.out.println("Removed " + event.getItems());
}

actionCancelledHandler

Это обработчик, вызываемый если операция удаления отменена пользователем в диалоге подтверждения. Принимает объект события, который можно использовать для получения выбранных для удаления экземпляров. Например:

@Install(to = "brandsTable.exclude", subject = "actionCancelledHandler")
private void brandsTableExcludeActionCancelledHandler(RemoveOperation.ActionCancelledEvent<Brand> event) {
    System.out.println("Cancelled");
}

Использование ActionPerformedEvent

Для того чтобы произвести какие-либо проверки, или взаимодействовать с пользователем перед выполнением действия, необходимо подписаться на событие ActionPerformedEvent действия и в нужный момент вызвать метод execute(). Действие будет вызвано со всеми параметрами, которые были для него заданы. В примере ниже перед выполнением действия отображается диалог подтверждения:

@Subscribe("brandsTable.exclude")
public void onBrandsTableExclude(Action.ActionPerformedEvent event) {
    excludeAction.setConfirmation(false);
    dialogs.createOptionDialog()
            .withCaption("My confirm dialog")
            .withMessage("Do you really want to remove the brand from the list?")
            .withActions(
                    new DialogAction(DialogAction.Type.YES)
                            .withHandler(e -> excludeAction.execute()), // execute action
                    new DialogAction(DialogAction.Type.NO)
            )
            .show();
}

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

@Autowired
private RemoveOperation removeOperation;

@Subscribe("brandsTable.excludeAction")
public void onBrandsTableExcludeAction(Action.ActionPerformedEvent event) {
    removeOperation.builder(brandsTable)
            .withConfirmationMessage("Do you really want to remove the brand from the list?")
            .withConfirmationTitle("Removing brand...")
            .exclude();
}