Mass operations with confirmation
Attention
For small and medium data volumes. Use for synchronous processing within a single transaction when the data size is up to 10,000 rows.
Mass operation with confirmation is a mass operation with a confirmation step: before the action is executed, the user fills in a form once, and the values from the form are applied to all selected rows.
Basic
It is used when the user must choose the values that are written to all selected rows, for example:
- Set one value in all rows — assign a priority or a responsible employee to 200 requests.
- Change status with user data — set a new status together with a comment or a date chosen by the user.
-
Clear a field — leave the field empty in the form, and it is cleared in every selected row.
-
write the values from the form and, in the same handler, change other fields, recalculate values or change the status;
- return a post-action, for example, show a message. It runs when the user clicks Close on Step 4.
See Changing data and a post-action in one operation.
After clicking on a mass operation, the user enters the mass-operation mode, which consists of several steps:
How does it look?

Specifics
- Mass operations become available only if there is at least one row in the table.
- All requests are executed using the ID of the first selected row!
- The operation runs in a single transaction: if an error occurs, the changes are rolled back for all selected rows.
- An empty field in the confirmation form means "clear": the empty value is written to all selected rows.
- In GroupingHierarchy only rows with records can be selected: a group row without its own record (an empty group, a row of totals) has a disabled checkbox. From Step 2 the table shows only the groups with selected rows.
- Rows are only viewed during a mass operation, the file preview too: its arrows go through the rows, a row does not become active, the record form is not shown.
How to add?
Example
-
Step1 Add actionGroups massEdit(Custom name) to corresponding .widget.json.
{ "name": "myexampleList", "title": "List", "type": "List", "bc": "myexample", "fields": [ { "title": "Id", "key": "id", "type": "input" }, { "title": "Custom Field Checkbox", "key": "customFieldCheckbox", "type": "checkbox" }, { "title": "Custom Field Dictionary", "key": "customFieldDictionary", "type": "dictionary" }, { "title": "customField", "key": "customField", "type": "input" } ], "options": { "massOp": { "pickMapFieldKey": "id" }, "actionGroups": { "include": [ "massEdit", "save" ] } } }{ "name": "myexampleGH", "title": "List", "type": "GroupingHierarchy", "bc": "myexample", "fields": [ { "title": "Id", "key": "id", "type": "hidden" }, { "title": "Custom Field Checkbox", "key": "customFieldCheckbox", "type": "checkbox" }, { "title": "Custom Field Dictionary", "key": "customFieldDictionary", "type": "dictionary" }, { "title": "customField", "key": "customField", "type": "input" } ], "options": { "groupingHierarchy": { "fields": [ "customFieldDictionary" ] }, "massOp": { "pickMapFieldKey": "id" }, "actionGroups": { "include": [ "massEdit", "save" ] } } }Add the confirmation widget (FormPopup) with the business component of the widget to the view, and pass its name to
PreAction.confirmWithWidget.{ "name": "myexampleForm", "title": "FormPopup widget title", "type": "FormPopup", "bc": "myexample", "fields": [ { "label": "Custom Field Dictionary", "key": "customFieldDictionary", "type": "dictionary" }, { "label": "customField Checkbox", "key": "customFieldCheckbox", "type": "checkbox" } ], "options": { "layout": { "rows": [ { "cols": [ { "fieldKey": "customFieldDictionary", "span": 12 } ] }, { "cols": [ { "fieldKey": "customFieldCheckbox", "span": 12 } ] } ] } } } -
Step2 Create action massEdit to corresponding AwareResponseService.
Step 1 Download plugin download Intellij Plugin
Step 2 Add a mass action to the corresponding service

.action(act -> act .action("massEditCustomTitle", "Mass Edit With Custom Text") .withPreAction(PreAction.confirmWithWidget("myexampleForm", cfw -> cfw.noText("It is text no") .title("Mass Edit Title") .yesText("It is text yes"))) .scope(ActionScope.MASS) .massInvoker((bc, data, ids) -> { var massResult = getMassDTO(data, ids, false); return new MassActionResultDTO<MyExampleDTO>(massResult) .setAction(PostAction.showMessage(MessageType.INFO, "The fields mass operation was completed!")); }) )Property:
-
.action("massEditCustomTitle", "Mass Edit With Custom Text")"massEditCustomTitle"— the action name used internally by the backend and frontend."Mass Edit With Custom Text"— title displayed in the UI.
-
.withPreAction(PreAction.confirmWithWidget(...))Adds a confirmation dialog before the mass action executes.
Parameters:
-
The name of the widget used for the confirmation.
-
cfw -> ...— a configuration block where the properties are defined:
.noText("It is text no")Text for the Cancel button..title("Mass Edit Title")Title of the confirmation dialog before the mass action executes..yesText("It is text yes")Text for the Save button.This allows customizing the buttons and title.
-
-
.scope(ActionScope.MASS)Specifies that this is a mass action, applied to all selected rows in the grid.
-
.massInvoker((bc, data, ids) -> { ... })The main handler for the mass operation.
Parameters:
bc— business component context.data— data submitted from the confirmation dialog based on the first row. An empty field means the field is cleared in every selected row.ids— the set of IDs of all selected records.
Inside the handler: The method processes each record and returns:
MassDTO.success(id)- result successMassDTO.fail(id, "message")- result error
-
return new MassActionResultDTO<>(massResult)...The mass action result includes:
- success/failure information for each record,
-
a UI post-action.
-
.setAction(PostAction.showMessage(...))Displays a message in the UI when the user clicks Close on Step 4, not when the action is executed.
Parameters:
MessageType.INFO— message type."The fields mass operation was completed!"— message text.
-
Changing data and a post-action in one operation
The confirmation step only collects the values. What happens to the rows is decided by massInvoker, the same handler as in Mass operations without confirmation.
So one mass action with confirmation can:
- write the values from the confirmation form (
data) to every selected row; - in the same loop, change other fields of the row, recalculate values or change the status — the same processing as without confirmation;
- return
MassDTO.fail(id, "message")for the rows that cannot be processed; - return a post-action with
.setAction(...)inMassActionResultDTO. It runs when the user clicks Close on Step 4.
Example
In the sample, getMassDTO writes the value of the dictionary field from the form and, in the same handler, the checkbox; the rows with the value Error get the status Fail.
After the operation, the message is shown.
.action(act -> act
.action("massEdit", "Mass Edit")
.withPreAction(PreAction.confirmWithWidget("myexampleForm",
cfw -> cfw))
.scope(ActionScope.MASS)
.massInvoker((bc, data, ids) -> {
var massResult = getMassDTO(data, ids, false);
return new MassActionResultDTO<MyExampleDTO>(massResult)
.setAction(PostAction.showMessage(MessageType.INFO, "The fields mass operation was completed!"));
})
)
Step 1. Select rows
How does it look?

- Checkboxes for selecting rows are displayed in the first column of the table (true = the row is selected).
- Filtering and sorting remain available.
- Rows become non-editable while in mass-operation mode.
-
All selected rows are displayed above the table as chips.
- If the number of chips exceeds N, only the first N are shown; the rest are collapsed and replaced with the label “+N values”. Hovering over “+N values” displays a tooltip: “Move on to Step 2 to see all the chosen rows.”
- A “Clear” button is displayed next to the chips. Clicking Clear deselects all checkboxes and removes all chips.
-
A gear icon is available for chip-related actions, containing the option “Select from file” (importing rows from a file exported on Step 4). Rows are matched only by ID: the exported Excel file keeps it in a hidden column.

-
Available actions:
- Cancel — exits mass-operation mode.
- Next — proceeds to Step 2, where only the selected rows are displayed.
Step 2. Review rows
How does it look?

- Selected rows from Step 1. Select rows are displayed in read-only mode.
- Checkboxes are disabled, and rows cannot be edited.
- Filtering and sorting of the selected rows remain available.
-
Available actions:
- Next — moves the user to Step 3 (confirmation).
- Back — returns the user to Step 1 (row selection). When returning to Step 1, the table resets to the first page and all filters are cleared.
- Cancel — exits mass-operation mode without applying any changes.
Step 3. Confirm operation
How does it look?
The values entered in the confirmation form are applied to all selected rows, for example, a new status or a priority. An empty field means "clear": after Save this field is empty in every selected row.
After Save, the mass action is executed: the values from the form are written, the other processing of the handler is done (see Changing data and a post-action in one operation), and the user moves to Step 4.
In the confirmation step, you can customize
- the widget’s title
- remove widget’s title
- customize the text of the Save and Cancel buttons
- the Back button is fixed and does not depend on the configuration
How to add?
Example
.action(act -> act
.action("massEdit", "Mass Edit")
.withPreAction(PreAction.confirmWithWidget("myexampleForm",
cfw -> cfw))
.scope(ActionScope.MASS)
.massInvoker((bc, data, ids) -> {
var massResult = getMassDTO(data, ids, false);
return new MassActionResultDTO<MyExampleDTO>(massResult)
.setAction(PostAction.showMessage(MessageType.INFO, "The fields mass operation was completed!"));
})
)
.action(act -> act
.action("massEditCustomTitle", "Mass Edit With Custom Text")
.withPreAction(PreAction.confirmWithWidget("myexampleForm",
cfw -> cfw.noText("It is text no")
.title("Mass Edit Title")
.yesText("It is text yes")))
.scope(ActionScope.MASS)
.massInvoker((bc, data, ids) -> {
var massResult = getMassDTO(data, ids, false);
return new MassActionResultDTO<MyExampleDTO>(massResult)
.setAction(PostAction.showMessage(MessageType.INFO, "The fields mass operation was completed!"));
})
)
.action(act -> act
.action("massEditWithoutTitle", "Mass Edit Without Custom Text")
.withPreAction(PreAction.confirmWithWidget("myexampleForm",
cfw -> cfw.withoutTitle()))
.scope(ActionScope.MASS)
.massInvoker((bc, data, ids) -> {
var massResult = getMassDTO(data, ids, false);
return new MassActionResultDTO<MyExampleDTO>(massResult)
.setAction(PostAction.showMessage(MessageType.INFO, "The fields mass operation was completed!"));
})
)
Step 4. View results
How does it look?

After performing a mass operation, the status for each row in the table is displayed:
- Success – the operation was completed successfully
- Fail – the operation was not completed
The widget header displays the number of processed rows (including the number of successful/failed rows).
Filtering/sorting of selected rows is available for any column, including status.
Available actions:
- Close – Exit the mass operation mode. The user returns to the normal table view, taking into account all changes made by the operation. The postAction of the mass action (for example, a message) runs at this moment, not when the action is executed.
-
Export – Export rows to a file.
- Ability to filter/sort the table before export.
- File format fully compatible with uploading on Step 1 (Select from file).
- Tooltip on hover: “Export of selected rows. You can use this file on Step 1 via ‘Select from File.’”
- After export, display a notification: “File exported successfully”
-
Retry, menu item Export failed – Export all rows with the status “Fail”.
- The table is automatically filtered by failed rows.
- File format fully compatible with uploading on Step 1 (Select from file).
- Tooltip on hover: “A file with failed rows will be downloaded. To retry the operation for these rows, upload this file on Step 1 via ‘Select from File.’”
Retry for failed rows
The operation is repeated for the failed rows in three steps:
- Export — on Step 4 click Retry → Export failed. An Excel file with the failed rows is downloaded.
- Upload — start the mass operation again and on Step 1 select Select from file in the gear menu. The rows from the file become selected. Rows are matched only by ID: the exported file keeps it in a hidden column, so the file does not need to be edited.
- Run again — go through the steps of the mass operation as usual, the values are entered in the confirmation form again.




