Стандартные действия

Предлагаемые фреймворком стандартные действия, предназначены для решения типовых задач, таких как вызов экрана редактирования для сущности, выбранной в таблице. Стандартные действия объявляются в XML-дескрипторе экрана с указанием их типа в атрибуте type.

Каждое стандартное действие реализуется классом, аннотированным @ActionType("<some_type>"). Класс задает свойства и поведение действия по умолчанию.

Для переопределения общих свойств действий можно задать XML-атрибуты элемента action, такие как caption, icon, shortcut и др., например:

<action id="create" type="create"
        caption="Create customer" icon="USER_PLUS"/>

Существует два вида стандартных действий:

Действия с коллекцией

Действия с коллекцией сущностей, отображаемой в таблице или дереве. Это AddAction, BulkEditAction, CreateAction, EditAction, ExcludeAction, RefreshAction, RelatedAction, RemoveAction, ViewAction.

Когда действие с коллекцией добавлено в таблицу или дерево, оно может быть вызвано из контекстного меню данного компонента или с помощью предустановленной горячей клавиши. Обычно для вызова действия используется также кнопка, добавленная в панель кнопок.

<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>

Действия поля выбора

Действия поля выбора работают с содержимым поля. Это EntityClearAction, EntityLookupAction, EntityOpenAction, EntityOpenCompositionAction, TagLookupAction, ValueClearAction, ValuesSelectAction.

Когда такое действие добавляется в компонент, оно автоматически отображается кнопкой внутри поля.

<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>

Дополнительные параметры

Стандартные действия имеют дополнительные параметры, которые могут быть установлены в XML или используя сеттеры в Java. В XML дополнительные параметры конфигурируются во вложенном элементе <properties>, где каждый элемент <property> соответствует сеттеру, имеющемуся в классе данного действия:

<action id="create" type="create">
    <properties>
        <property name="openMode" value="DIALOG"/>
        <property name="screenClass" value="ui.ex1.screen.entity.customer.CustomerEdit"/>
    </properties>
</action>

То же самое можно сделать в контроллере на Java:

@Named("customersGroupTable.create")
private CreateAction<Customer> createAction;

@Subscribe
public void onInit(InitEvent event) {
    createAction.setOpenMode(OpenMode.DIALOG);
    createAction.setScreenClass(CustomerEdit.class);
}

Установка обработчиков

Если сеттер принимает функциональный интерфейс, то в контроллере можно создать соответствующий метод-обработчик. Например, CreateAction имеет метод setAfterCommitHandler(Consumer), который используется для установки обработчика, вызываемого после коммита созданной сущности. Тогда обработчик можно задать следующим образом:

@Install(to = "customersGroupTable.create", subject = "afterCommitHandler")
private void customersGroupTableCreateAfterCommitHandler(Customer customer) {
    notifications.create()
            .withCaption("Created  " + customer)
            .show();
}

Вы можете сгенерировать заглушку реализации обработчика с помощью Studio.

Во всех действиях имеется обработчик enabledRule, который позволяет управлять состоянием "enabled" действия в зависимости от некоторых условий. В примере ниже данный обработчик запрещает RemoveAction для некоторых сущностей:

@Autowired
private GroupTable<Customer> customersGroupTable;

@Install(to = "customersGroupTable.remove", subject = "enabledRule")
private boolean customersGroupTableRemoveEnabledRule() {
    Set<Customer> customers = customersGroupTable.getSelected();
    return canBeRemoved(customers);
}