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