BulkEditAction
BulkEditAction
– это действие с коллекцией, предназначенное для изменения значений атрибутов сразу нескольких выбранных экземпляров сущностей. Оно открывает специальный экран, в котором пользователь может ввести желаемые значения атрибутов. После этого, действие обновляет выбранные сущности в базе данных и в контейнере данных UI-компонента.
Действие реализовано классом io.jmix.ui.action.list.BulkEditAction
и объявляется в XML с помощью атрибута type="bulkEdit"
. Общие свойства действий можно конфигурировать с помощью атрибутов элемента action
, подробнее см. раздел Декларативные действия. Ниже рассматриваются параметры, специфичные для класса BulkEditAction
.
Параметры
Следующие параметры можно установить и в XML, и в Java:
-
openMode
- режим открытия экрана задания значений атрибутов, задаваемый значением перечисленияOpenMode
:NEW_TAB
,DIALOG
, и т.д. По умолчанию, экран открывается в режимеDIALOG
. -
columnsMode
- количество колонок в экране, задаваемое значением перечисленияColumnsMode
. По умолчаниюTWO_COLUMNS
. -
exclude
- регулярное выражение для исключения некоторых атрибутов сущности из экрана. -
includeProperties
- список атрибутов сущности, которые должны быть показаны в экране. Данный список имеет более высокий приоритет чем выражениеexclude
. -
loadDynamicAttributes
- отображать ли динамические атрибуты в экране. По умолчаниюtrue
. -
useConfirmDialog
- отображать ли диалог подтверждения перед применением изменений. По умолчаниюtrue
.
Например:
<action id="bulk" type="bulkEdit">
<properties>
<property name="openMode" value="THIS_TAB"/>
<property name="includeProperties" value="rewardPoints,email"/>
<property name="columnsMode" value="ONE_COLUMN"/>
</properties>
</action>
В качестве альтернативы, действие можно инжектировать в контроллер экрана и сконфигурировать, используя сеттеры:
@Named("custTable.bulk")
private BulkEditAction custTableBulk;
@Subscribe
public void onInit(InitEvent event) {
custTableBulk.setOpenMode(OpenMode.THIS_TAB);
custTableBulk.setIncludeProperties(Arrays.asList("rewardPoints", "email"));
custTableBulk.setColumnsMode(ColumnsMode.ONE_COLUMN);
}
Обработчики
Далее рассматриваются параметры, которые можно сконфигурировать только программно в Java. Для генерации корректно аннотированных методов для этих параметров используйте Studio.
fieldSorter
Это обработчик, принимающий список объектов MetaProperty, соответствующих атрибутам сущности, и возвращающий мэп этих объектов на желаемую позицию в экране. Например:
@Install(to = "custTable.bulk", subject = "fieldSorter")
private Map<MetaProperty, Integer> custTableBulkFieldSorter(List<MetaProperty> properties) {
Map<MetaProperty, Integer> result = new HashMap<>();
for (MetaProperty property : properties) {
switch (property.getName()) {
case "email": result.put(property, 0); break;
case "rewardPoints": result.put(property, 1); break;
default:
}
}
return result;
}
Использование ActionPerformedEvent
Для того, чтобы произвести какие-либо проверки, или взаимодействовать с пользователем перед выполнением действия, необходимо подписаться на событие ActionPerformedEvent
действия и в нужный момент вызвать метод execute()
. Действие будет вызвано со всеми параметрами, которые были для него заданы. В примере ниже перед выполнением действия отображается кастомный диалог подтверждения:
@Named("custTable.bulk")
private BulkEditAction custTableBulk;
@Subscribe("custTable.bulk")
public void onCustTableBulk(Action.ActionPerformedEvent event) {
dialogs.createOptionDialog()
.withCaption("Please confirm")
.withMessage("Are you sure you want to edit the selected entities?")
.withActions(
new DialogAction(DialogAction.Type.YES)
.withHandler(e -> custTableBulk.execute()), // execute action
new DialogAction(DialogAction.Type.NO)
)
.show();
}
Можно также подписаться на ActionPerformedEvent
, и вместо вызова метода execute()
действия, использовать BulkEditors
API напрямую. По сути, в этом случае все специфичные параметры действия игнорируются, и действуют только общие параметры: caption
, icon
, и т.д. Например:
@Autowired
private BulkEditors bulkEditors;
@Autowired
private Metadata metadata;
@Autowired
private GroupTable<Customer> custTable;
@Subscribe("custTable.bulkEdit")
public void onCustTableBulkEdit(Action.ActionPerformedEvent event) {
bulkEditors.builder(metadata.getClass(Customer.class), custTable.getSelected(), this)
.withListComponent(custTable)
.withColumnsMode(ColumnsMode.ONE_COLUMN)
.withIncludeProperties(Arrays.asList("rewardPoints", "email"))
.create()
.show();
}