TagLookupAction
TagLookupAction
– это действие поля выбора сущности, предназначенное для установки экземпляра сущности в TagPicker из экрана выбора.
Действие реализовано классом io.jmix.ui.action.tagpicker.TagLookupAction
и объявляется в XML с помощью атрибута type="tag_lookup"
. Общие свойства действий можно конфигурировать с помощью атрибутов элемента action
, подробнее см. раздел Декларативные действия. Ниже рассматриваются параметры, специфичные для класса TagLookupAction
.
Параметры
Следующие параметры можно установить и в XML, и в Java:
-
openMode
- режим открытия экрана выбора, задаваемый значением перечисленияOpenMode
:NEW_TAB
,DIALOG
, и т.д. По умолчанию экран открывается в режимеTHIS_TAB
. -
screenId
- строковый идентификатор экрана выбора. По умолчанию используется экран, аннотированный@PrimaryEditorScreen
, или имеющий идентификатор вида<entity_name>.browse
, напримерdemo_Customer.browse
. -
screenClass
- класс Java экрана выбора. Данный параметр имеет более высокий приоритет,screenId
. -
multiSelect
- включает множественный выбор на экране выбора. Значение по умолчанию -true
.
Например, если необходимо открыть определенный экран выбора в режиме диалога, действие можно сконфигурировать в XML следующим образом:
<action id="tagLookup" type="tag_lookup">
<properties>
<property name="openMode" value="DIALOG"/>
<property name="screenClass" value="ui.ex1.screen.entity.customer.CustomerBrowse"/>
</properties>
</action>
В качестве альтернативы, действие можно инжектировать в контроллер экрана и сконфигурировать, используя сеттеры:
@Named("customerTagPicker.tagLookup")
private TagLookupAction<Customer> tagLookupAction;
@Subscribe
public void onInit(InitEvent event) {
tagLookupAction.setOpenMode(OpenMode.DIALOG);
tagLookupAction.setScreenClass(CustomerBrowse.class);
}
Обработчики
Далее рассматриваются параметры, которые можно сконфигурировать только программно в Java. Для генерации корректно аннотированных методов для этих параметров используйте Studio.
screenOptionsSupplier
Это обработчик, возвращающий объект ScreenOptions
для передачи в открываемый экран выбора. Например:
@Install(to = "customerTagPicker.tagLookup", subject = "screenOptionsSupplier")
private ScreenOptions customerTagPickerTagLookupScreenOptionsSupplier() {
return new MapScreenOptions(ParamsMap.of("someParameter", 10));
}
Возвращаемый объект ScreenOptions
будет доступен в InitEvent
открываемого экрана.
screenConfigurer
Это обработчик, принимающий экран выбора для его конфигурирования перед открытием. Например:
@Install(to = "customerTagPicker.tagLookup", subject = "screenConfigurer")
private void customerTagPickerTagLookupScreenConfigurer(Screen screen) {
((CustomerBrowse) screen).setSomeParameter(10);
}
Обратите внимание, что конфигуратор экрана вступает в действие, когда экран уже инициализирован, но еще не показан, то есть после InitEvent
и AfterInitEvent
, и до BeforeShowEvent
.
selectValidator
Это обработчик, вызываемый когда пользователь нажимает Select в экране выбора. Он принимает объект, содержащий коллекцию выбранных сущностей. Первый элемент коллекции будет установлен в поле. Данный обработчик можно использовать для проверки выбора по каким-либо критериям. Обработчик должен вернуть true
для того, чтобы процесс был продолжен и экран выбора закрылся. Например:
@Install(to = "customerTagPicker.tagLookup", subject = "selectValidator")
private boolean customerTagPickerTagLookupSelectValidator(LookupScreen.ValidationContext<Customer> validationContext) {
boolean valid = validationContext.getSelectedItems().size() == 1;
if (!valid) {
notifications.create().withCaption("Select a single customer").show();
}
return valid;
}
transformation
Это обработчик, вызываемый после того, как сущность выбрана и прошла валидацию в экране выбора. Первый элемент коллекции будет установлен в поле. Он принимает выбранную сущность и может быть использован для того, чтобы преобразовать выборку перед установкой сущности в поле. Например:
@Install(to = "customerTagPicker.tagLookup", subject = "transformation")
private Collection<Customer> customerTagPickerTagLookupTransformation(Collection<Customer> collection) {
return reloadCustomers(collection);
}
afterCloseHandler
Это обработчик, вызываемый после закрытия экрана выбора. Принимает AfterCloseEvent
. Например:
@Install(to = "customerTagPicker.tagLookup", subject = "afterCloseHandler")
private void customerTagPickerTagLookupAfterCloseHandler(AfterCloseEvent afterCloseEvent) {
if (afterCloseEvent.closedWith(StandardOutcome.SELECT)) {
System.out.println("Selected");
}
}
Использование ActionPerformedEvent
Для того чтобы произвести какие-либо проверки, или взаимодействовать с пользователем перед выполнением действия, необходимо подписаться на событие ActionPerformedEvent
действия и в нужный момент вызвать метод execute()
. Действие будет вызвано со всеми параметрами, которые были для него заданы. В примере ниже перед выполнением действия отображается диалог подтверждения:
@Subscribe("customerTagPicker.tagLookup")
public void onCustomerTagPickerTagLookup(Action.ActionPerformedEvent event) {
dialogs.createOptionDialog()
.withCaption("Please confirm")
.withMessage("Do you really want to select a customer?")
.withActions(
new DialogAction(DialogAction.Type.YES)
.withHandler(e -> tagLookupAction.execute()), (1)
new DialogAction(DialogAction.Type.NO)
)
.show();
}
1 | Выполнение действия |
Можно также подписаться на ActionPerformedEvent
, и вместо вызова метода execute()
действия, использовать для открытия экрана выбора ScreenBuilders
API напрямую. По сути, в этом случае все специфичные параметры действия игнорируются, и действуют только общие параметры: caption
, icon
, и т.д. Например:
@Autowired
private ScreenBuilders screenBuilders;
@Autowired
private TagPicker<Customer> customerTagPicker;
@Subscribe("customerTagPicker.tag")
public void onCustomerTagPickerTag(Action.ActionPerformedEvent event) {
screenBuilders.lookup(customerTagPicker)
.withOpenMode(OpenMode.DIALOG)
.withScreenClass(CustomerBrowse.class)
.withSelectValidator(customerValidationContext -> {
boolean valid = customerValidationContext.getSelectedItems().size() == 1;
if (!valid) {
notifications.create().withCaption("Select a single customer").show();
}
return valid;
})
.build()
.show();
}