3.5.5.2.7. ExcludeAction

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

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

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

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

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

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

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

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

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

@Named("customersTable.exclude")
private ExcludeAction customersTableExclude;

@Subscribe
public void onInit(InitEvent event) {
    customersTableExclude.setConfirmation(true);
    customersTableExclude.setConfirmationTitle("Removing customer...");
    customersTableExclude.setConfirmationMessage("Do you really want to remove the customer from the list?");
}

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

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

    @Install(to = "customersTable.exclude", subject = "afterActionPerformedHandler")
    private void customersTableExcludeAfterActionPerformedHandler(RemoveOperation.AfterActionPerformedEvent<Customer> event) {
        System.out.println("Removed " + event.getItems());
    }
  • actionCancelledHandler - обработчик, вызываемый если операция удаления отменена пользователем в диалоге подтверждения. Принимает объект события, который можно использовать для получения выбранных для удаления экземпляров. Например:

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

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

@Named("customersTable.exclude")
private ExcludeAction customersTableExclude;

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

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

@Inject
private RemoveOperation removeOperation;

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