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