3.5.4.2.1. Стандартные действия с коллекцией

Для наследников ListComponent (это DataGrid, Table, GroupTable, TreeTable и Tree) в платформе определён набор стандартных действий. Классы их реализации находятся в пакете com.haulmont.cuba.gui.actions.list.

Пример использования стандартных действий в таблице:

<groupTable id="customersTable" width="100%" dataContainer="customersDc">
    <actions>
        <action id="create" type="create"/>
        <action id="edit" type="edit"/>
        <action id="remove" type="remove"/>
    </actions>
    <columns>
        <column id="name"/>
        <column id="email"/>
    </columns>
    <buttonsPanel>
        <button id="createBtn" action="customersTable.create"/>
        <button id="editBtn" action="customersTable.edit"/>
        <button id="removeBtn" action="customersTable.remove"/>
    </buttonsPanel>
</groupTable>

Стандартные действия для перечисленных выше компонентов включают в себя следующие типы:

  • create - действие, определяемое классом com.haulmont.cuba.gui.actions.list.CreateAction. Предназначено для создания нового экземпляра сущности в экране редактирования для этого экземпляра по умолчанию.

  • edit - действие, определяемое классом com.haulmont.cuba.gui.actions.list.EditAction. Открывает экран редактирования по умолчанию для выбранного экземпляра сущности.

  • remove - действие, определяемое классом com.haulmont.cuba.gui.actions.list.RemoveAction. Предназначено для удаления выбранного экземпляра сущности.

  • add - действие, определяемое классом com.haulmont.cuba.gui.actions.list.AddAction. Предназначено для выбора существующего экземпляра сущности в экране просмотра по умолчанию и добавления его в связанный контейнер данных . Типичный сценарий использования этого действия - добавление сущностей в коллекцию many-to-many.

  • exclude - действие, определяемое классом com.haulmont.cuba.gui.actions.list.ExcludeAction. Позволяет исключать экземпляры сущности из контейнера данных с типом collection, не удаляя их из базы данных. Типичный сценарий использования этого действия - удаление сущностей из коллекции many-to-many.

  • refresh - действие, определяемое классом com.haulmont.cuba.gui.actions.list.RefreshAction. Предназначено для обновления (перезагрузки) коллекции сущностей, хранящейся в контейнере данных.

  • excel - действие, определяемое классом com.haulmont.cuba.gui.actions.list.ExcelAction. Предназначено для экспорта данных таблицы в формат XLS и выгрузки соответствующего файла.

  • bulkEdit - действие, определяемое классом com.haulmont.cuba.gui.actions.list.BulkEditAction. Предназначено для изменения значения атрибутов сразу нескольких выбранных экземпляров сущностей. Используется так же, как и любые другие действия, например:

    <table id="table" width="100%" dataContainer="customersCt">
        <actions>
            ...
            <action id="bulkEdit" type="bulkEdit"/>
        </actions>
        ...
        <rowsCount/>
        <buttonsPanel alwaysVisible="true">
            ...
            <button action="table.bulkEdit"/>
        </buttonsPanel>
        <rows/>
    </table>

    В дополнение к этому, BulkEditorWindow может быть создано программно с помощью нового бина com.haulmont.cuba.gui.BulkEditors:

    bulkEditors.builder(metaClass, table.getSelected(), getWindow().getFrameOwner())
               .withListComponent(table)
               .create()
               .show();

Для основных параметров стандартных действий определены значения по умолчанию: заголовки, значки, горячие клавиши, а также стандартное поведение при вызове действия. Вы можете передать свои собственные значения основных параметров декларативно в XML так же, как и для любого другого действия. Например, можно установить для действия другой значок:

<action id="create" type="create" icon="USER"/>

Для того чтобы изменить стандартное поведение действия, необходимо подписаться на событие ActionPerformedEvent для этого действия в контроллере экрана. Код стандартного действия не будет выполняться, если для него определён альтернативный action listener. По сути, обработчик события ActionPerformedEvent переопределяет стандартное поведение действия.

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

public class CustomerBrowse extends StandardLookup<Customer> {
    @Inject
    private GroupTable<Customer> customersTable;
    @Inject
    private ScreenBuilders screenBuilders;

    @Subscribe("customersTable.create")
    protected void onCustomersTableCreateActionPerformed(Action.ActionPerformedEvent event) {
        screenBuilders.editor(customersTable)
                .newEntity()
                .withScreenClass(CustomerEdit.class)     // specific editor screen
                .withLaunchMode(OpenMode.DIALOG)        // open as modal dialog
                .build()
                .show();
    }
}

Поведение действия edit можно изменить так же, как и create. Более подробно о переопределении действий см. в описании бина ScreenBuilders.

Действие add также использует бин ScreenBuilders, и переопределить его поведение можно следующим образом:

public class CustomerEdit extends StandardEditor<Customer> {
    @Inject
    private ScreenBuilders screenBuilders;
    @Inject
    private Table<Employee> accountableTable;

    @Subscribe("accountableTable.add")
    protected void onAccountableTableAddActionPerformed(Action.ActionPerformedEvent event) {
        screenBuilders.lookup(Employee.class, this)
                .withListComponent(accountableTable)
                .withScreenClass(EmployeeBrowse.class)   // specific editor screen
                .withLaunchMode(OpenMode.DIALOG)        // open as modal dialog
                .build()
                .show();
    }
}