BulkEditAction
BulkEditAction
is a list action designed to change attribute values for multiple entity instances at once. It opens a special screen where the user can enter desired attribute values. After that, the action updates the selected entities in the database and in the data container of the UI component.
The action is implemented by the io.jmix.ui.action.list.BulkEditAction
class and should be defined in XML using type="bulkEdit"
action’s attribute. You can configure common action parameters using XML attributes of the action element. See Declarative Actions for details. Below we describe parameters specific to the BulkEditAction
class.
Properties
The following parameters can be set both in XML and in Java:
-
openMode
- the bulk edit screen opening mode as a value of theOpenMode
enum:NEW_TAB
,DIALOG
, etc. By default, the screen is opened in theDIALOG
mode. -
columnsMode
- the number of columns in the bulk edit screen as a value of theColumnsMode
enum.TWO_COLUMNS
by default. -
exclude
- a regular expression to exclude entity attributes from displaying in the editor. -
includeProperties
- a list of entity attributes to be shown in the editor. This list has a higher priority than theexclude
expression. -
loadDynamicAttributes
- whether to display dynamic attributes in the editor screen. The default value istrue
. -
useConfirmDialog
- whether to show a confirmation dialog before saving the changes. The default value istrue
.
For example:
<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>
Alternatively, you can inject the action into the screen controller and configure it using setters:
@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);
}
Handlers
Now let’s consider parameters that can be configured only in Java code. To generate correctly annotated method stubs for these parameters, use Studio.
fieldSorter
It is a handler that accepts the MetaProperty objects' list denoting entity attributes and returns a map of these objects to the desired index in the edit screen. For example:
@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;
}
Using ActionPerformedEvent
If you want to perform some checks or interact with the user before the action is executed, subscribe to the action’s ActionPerformedEvent
and invoke the execute()
method of the action when needed. In the example below, we show a custom confirmation dialog before executing the action:
@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();
}
You can also subscribe to ActionPerformedEvent
, and instead of invoking the action’s execute()
method, use BulkEditors
API directly. In this case, you are ignoring all specific action parameters and behavior and using only its common parameters like caption
, icon
, etc. For example:
@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();
}