3.5.5.2.2. BulkEditAction
BulkEditAction - действие с коллекцией, предназначенное для изменения значений атрибутов сразу нескольких выбранных экземпляров сущностей. Оно открывает специальный экран, в котором пользователь может ввести желаемые значения атрибутов. После этого, действие обновляет выбранные сущности в базе данных и в контейнере данных UI-компонента.
Действие реализовано классом com.haulmont.cuba.gui.actions.list.BulkEditAction
и объявляется в XML с помощью атрибута type="bulkEdit"
. Общие свойства действий можно конфигурировать с помощью атрибутов элемента action
, подробнее см. раздел Декларативное создание действий. Ниже рассматриваются параметры, специфичные для класса BulkEditAction
.
-
openMode
- режим открытия экрана задания значений атрибутов, задаваемый значением перечисленияOpenMode
:NEW_TAB
,DIALOG
, и т.д. По умолчанию, экран открывается в режимеDIALOG
. -
columnsMode
- количество колонок в экране, задаваемое значением перечисленияColumnsMode
. По умолчаниюTWO_COLUMNS
. -
exclude
- регулярное выражение для исключения некоторых атрибутов сущности из экрана. -
includeProperties
- список атрибутов сущности, которые должны быть показаны в экране. Данный список имеет более высокий приоритет чем выражениеexclude
. -
loadDynamicAttributes
- отображать ли динамические атрибуты в экране. По умолчанию true. -
useConfirmDialog
- отображать ли диалог подтверждения перед применением изменений. По умолчанию true.
Например:
<action id="bulkEdit" type="bulkEdit">
<properties>
<property name="openMode" value="THIS_TAB"/>
<property name="includeProperties" value="name,email"/>
<property name="columnsMode" value="ONE_COLUMN"/>
</properties>
</action>
В качестве альтернативы, действие можно инжектировать в контроллер экрана и сконфигурировать, используя сеттеры:
@Named("customersTable.bulkEdit")
private BulkEditAction customersTableBulkEdit;
@Subscribe
public void onInit(InitEvent event) {
customersTableBulkEdit.setOpenMode(OpenMode.THIS_TAB);
customersTableBulkEdit.setIncludeProperties(Arrays.asList("name", "email"));
customersTableBulkEdit.setColumnsMode(ColumnsMode.ONE_COLUMN);
}
Далее рассматриваются параметры, которые можно сконфигурировать только программно в Java. Для генерации корректно аннотированных методов для этих параметров используйте закладку Handlers окна инструментов Component Inspector в Studio.
-
fieldSorter
- обработчик, принимающий список объектовMetaProperty
, соответствующих атрибутам сущности, и возвращающий мэп этих объектов на желаемую позицию в экране. Например:@Install(to = "customersTable.bulkEdit", subject = "fieldSorter") private Map<MetaProperty, Integer> customersTableBulkEditFieldSorter(List<MetaProperty> properties) { Map<MetaProperty, Integer> result = new HashMap<>(); for (MetaProperty property : properties) { switch (property.getName()) { case "name": result.put(property, 0); break; case "email": result.put(property, 1); break; default: } } return result; }
Для того, чтобы произвести какие-либо проверки, или взаимодействовать с пользователем перед выполнением действия, необходимо подписаться на событие ActionPerformedEvent
действия и в нужный момент вызвать метод execute()
. Действие будет вызвано со всеми параметрами, которые были для него заданы. В примере ниже перед выполнением действия отображается кастомный диалог подтверждения:
@Named("customersTable.bulkEdit")
private BulkEditAction customersTableBulkEdit;
@Subscribe("customersTable.bulkEdit")
public void onCustomersTableBulkEdit(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 -> customersTableBulkEdit.execute()), // execute action
new DialogAction(DialogAction.Type.NO)
)
.show();
}
Можно также подписаться на ActionPerformedEvent
, и вместо вызова метода execute()
действия, использовать BulkEditors
API напрямую. По сути, в этом случае все специфичные параметры действия игнорируются, и действуют только общие параметры: caption, icon, и т.д. Например:
@Inject
private BulkEditors bulkEditors;
@Inject
private GroupTable<Customer> customersTable;
@Subscribe("customersTable.bulkEdit")
public void onCustomersTableBulkEdit(Action.ActionPerformedEvent event) {
bulkEditors.builder(metadata.getClassNN(Customer.class), customersTable.getSelected(), this)
.withListComponent(customersTable)
.withColumnsMode(ColumnsMode.ONE_COLUMN)
.withIncludeProperties(Arrays.asList("name", "email"))
.create()
.show();
}
Внешний вид экрана задания значений атрибутов можно настроить с помощью переменных SCSS с префиксом $c-bulk-editor-*
. Эти переменные можно изменить в визуальном редакторе после расширения темы или создания новой темы.