Standard Actions
The framework provides standard actions to solve common tasks, such as an invocation of an edit screen for an entity selected in a table. A standard action should be declared in the screen XML descriptor by specifying its type in the type
attribute.
Each standard action is implemented by a class annotated with @ActionType("<some_type>")
. The class defines the action’s default properties and behavior.
You can specify any basic action XML attributes to override common action properties: caption
, icon
, shortcut
, etc. For example:
<action id="create" type="create"
caption="Create customer" icon="USER_PLUS"/>
There are two categories of standard actions:
List Actions
List actions work with collections of entities that are displayed in tables or trees. These are AddAction, BulkEditAction, CreateAction, EditAction, ExcludeAction, RefreshAction, RelatedAction, RemoveAction, ViewAction.
When a list action is added to a table, tree, or data grid, it can be invoked from the component’s context menu item and by its predefined keyboard shortcut. Usually, the action is also invoked by a button added to the buttons panel.
<groupTable id="customersGroupTable"
width="100%"
dataContainer="customersDc">
<actions>
<action id="create" type="create"/>
<action id="edit" type="edit"/>
<action id="remove" type="remove"/>
</actions>
<columns>
<column id="firstName"/>
<column id="lastName"/>
</columns>
<buttonsPanel alwaysVisible="true">
<button action="customersGroupTable.create"/>
<button action="customersGroupTable.edit"/>
<button action="customersGroupTable.remove"/>
</buttonsPanel>
</groupTable>
Picker Actions
Picker actions work with the content of the field. These are EntityClearAction, EntityLookupAction, EntityOpenAction, EntityOpenCompositionAction, TagLookupAction, ValueClearAction, ValuesSelectAction.
When a picker action is added to the component, it is automatically represented by a button inside the field.
<entityPicker dataContainer="orderDc"
property="customer"
caption="msg://ui.ex1.entity/Order.customer">
<actions>
<action id="lookup" type="entity_lookup"/>
<action id="open" type="entity_open"/>
<action id="clear" type="entity_clear"/>
</actions>
</entityPicker>
Additional Properties
Standard actions have additional properties that can be set in XML or using setters in Java. In XML, additional properties are configured using the nested <properties>
element, where each <property>
element corresponds to a setter existing in this action class:
<action id="create" type="create">
<properties>
<property name="openMode" value="DIALOG"/>
<property name="screenClass" value="ui.ex1.screen.entity.customer.CustomerEdit"/>
</properties>
</action>
The same can be done in Java controller:
@Named("customersGroupTable.create")
private CreateAction<Customer> createAction;
@Subscribe
public void onInit(InitEvent event) {
createAction.setOpenMode(OpenMode.DIALOG);
createAction.setScreenClass(CustomerEdit.class);
}
Installing Handlers
If a setter accepts a functional interface, you can install a handler method in the screen controller. For example, CreateAction
has setAfterCommitHandler(Consumer)
method which is used to set a handler to be invoked after the created entity is committed. Then you can provide the handler as follows:
@Install(to = "customersGroupTable.create", subject = "afterCommitHandler")
private void customersGroupTableCreateAfterCommitHandler(Customer customer) {
notifications.create()
.withCaption("Created " + customer)
.show();
}
You can generate handlers implementation stubs using Studio. |
There is a common enabledRule
handler available to all actions, which allows you to set the action "enabled" state depending on the situation. In the example below, it disables RemoveAction
for some entities:
@Autowired
private GroupTable<Customer> customersGroupTable;
@Install(to = "customersGroupTable.remove", subject = "enabledRule")
private boolean customersGroupTableRemoveEnabledRule() {
Set<Customer> customers = customersGroupTable.getSelected();
return canBeRemoved(customers);
}