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();
}