Генерация UiComponent'a в зависимости от значения, которое принимает другой компонент

Добрый день!
Прошу прощения, возможно вопрос простой, но пока не получается реализовать:
Я создаю модальное окно при помощи бина dialogs, код ниже:

@Subscribe("actionsDropdown.addConditionAction")
public void onActionsDropdownAddConditionActionClick(final DropdownButtonItem.ClickEvent event) {
    dialogs.createInputDialog(this)
            .withHeader(messages.getMessage("dialogs/newCondition"))
            .withParameters(
                    InputParameter.entityParameter("type", SimpleDto.class)
                            .withLabel(messages.getMessage("dialogs/newCondition/type"))
                            .withRequired(true),
                    InputParameter.enumParameter("operator", Operator.class)
                            .withLabel(messages.getMessage("dialogs/newCondition/operator"))
                            .withRequired(true),
                    InputParameter.enumParameter("inputMode", InputMode.class)
                            .withLabel(messages.getMessage("dialogs/newCondition/inputMode"))
                            .withRequired(true),
                    InputParameter.parameter("value")
                            .withField(() -> {
                                Component field;
                            })
            ).withActions(DialogActions.OK_CANCEL)
            .open();
}

У SimpleDto есть следующие поля: String query и Date timestamp.
Для параметра value мне нужно реализовать следующую логику: если для параметра type выбрано значение query, то для параметра value должен генериться компонент TextArea. Если для параметра type выбрано значение timestamp, то для параметра value должен генериться компонент DatePicker.
Надеюсь понятно описал. При помощи каких инструментов этого можно добиться?

Не думаю что это удастся сделать через dialogs.
Скорее надо будет создать экран (Редактор сущности SimpleDto)

Там подписаться на событие изменения поля type и генерировать нужные поля для value.

@yarik1706 добрый день!
Пытаюсь реализовать так, как вы посоветовали. Создал DetailView:

<view xmlns="http://jmix.io/schema/flowui/view"
      title="msg://queryStatementDetailView.title"
      focusComponent="form">
    <data>
        <instance id="dialogWindowConditionUiDtoDc"
                  class="ru.ctsg.damdbf.manager.ui.dto.condition.DialogWindowConditionUiDto">
            <fetchPlan extends="_base"/>
            <loader/>
        </instance>
    </data>
    <facets>
        <dataLoadCoordinator auto="true"/>
    </facets>
    <actions>
        <action id="saveAction" type="detail_saveClose"/>
        <action id="closeAction" type="detail_close"/>
    </actions>
    <layout>
        <formLayout id="form" dataContainer="dialogWindowConditionUiDtoDc">
            <comboBox id="type" property="type"/>
            <comboBox id="operator" property="operator"/>
            <comboBox id="inputMode" property="inputMode"/>
            <textField id="value" property="value"/>
        </formLayout>
        <hbox id="detailActions">
            <button id="saveAndCloseBtn" action="saveAction"/>
            <button id="closeBtn" action="closeAction"/>
        </hbox>
    </layout>
</view>

Подписался на событие изменения значения в параметре Тип:

    @Subscribe("type")
    public void onTypeComponentValueChange(
            final AbstractField.ComponentValueChangeEvent<JmixComboBox<InputParameters>, InputParameters> event) {
        InputParameters selectedType = event.getValue();
        if (selectedType == InputParameters.DATE) {
            uiComponents.create(DatePicker.class);
        } else {
            uiComponents.create(TextArea.class);
        }
    }

Хочу добиться поведения, но пока не получается: если в параметре Тип выбрано значение DATE, то менять компонент для параметра value на DatePicker, если любое другое значение выбрано, то генерировать компонент TextArea.
Можно это как-то сделать?

Ну а что вы собственно пробовали делать?

Я вижу только создание компонентов.

Логики добавления, удаления, подписки на изменения - нет.

В чем проблема?

@yarik1706 еще раз приветствую. Я пытаюсь сейчас использовать UiComponentsGenerator для генерации компонента для параметра в зависимости от выбранного значения в другом параметре

@Route(value = "dialogwindowconditionuidtos/:id", layout = MainView.class)
@ViewController("DialogWindowConditionUiDto.detail")
@ViewDescriptor("dialog-window-condition-ui-dto-detail-view.xml")
@EditedEntityContainer("dialogWindowConditionUiDtoDc")
@DialogMode(width = "64em")
public class DialogWindowConditionUiDtoDetailView extends StandardDetailView<DialogWindowConditionUiDto> {

    @Autowired
    private transient UiComponentsGenerator uiComponentsGenerator;

    @Autowired
    private transient Metadata metadata;

    @Subscribe("type")
    public void onTypeComponentValueChange(
            final AbstractField.ComponentValueChangeEvent<JmixComboBox<InputParameters>, InputParameters> event) {
        InputParameters typeParameter = event.getValue();
        ComponentGenerationContext context = new ComponentGenerationContext(
                metadata.getClass(DialogWindowConditionUiDto.class), "value");
        if (typeParameter == InputParameters.DATE) {
            uiComponentsGenerator.generate(context);
        }
    }
}

Но пока он делает не то, что нужно: если у меня у атрибута value стоит тип данных String, то, как я понял, UiComponentsGenerator в методе generate пробегается по всем ComponentGenerationStrategy (в моем случае используется DefaultComponentGenerationStrategy), то он идет в метод createComponentInternal и, видя, что атрибут value из контекста имеет тип String, то создает для него TextField, если там стоит тип Date, то создает соответственно DatePicker.
Я же хочу добиться другого поведения: на основе выбранного значения в параметре query (например, String) для параметра value должен сгенерироваться компонент TextArea. И так в целом должно работать с любым другим выбранным значением. Под выбранное значение должен генерироваться нужный компонент.
Причем если я в дескрипторе для свойства value явно укажу какой-нибудь textArea, то даже если у атрибута value будет стоять тип данных Date, в моем редакторе компонент не “перерисуется” на DatePicker. Вот так:

  <formLayout id="form" dataContainer="dialogWindowConditionUiDtoDc">
      <comboBox id="comboBox" dataContainer="recordUiDtoDc" property="query" required="true"/>
      <comboBox id="operator" property="operator" required="true"/>
      <comboBox id="inputMode" property="inputMode" required="true"/>
      <textArea id="value" property="value" required="true"/>
  </formLayout>

А если вообще не указать никакой компонент заранее для value, то в окне никакого компонента вообще не отрисуется. Собственно я пока в замешательстве и не понимаю, как мне реализовать данную логику.
Хотелось бы еще услышать мнение разработчиков. Может они подскажут, как мне решить данную проблему.

На основе выбранного значения в параметре query генерите поле через UiComponents, если вам нужна строка, генерите TextArea, если дата, то DatePicker (или еще какие поля). Добавляете этим полям ComponentValueChangeEvent, внутри которого вы будете обновлять value сущности. Через formLayout.remove() удаляете старое поле и через formLayout.add() добавляете новое поле в форму.

@yarik1706 в целом получилось добиться нужного поведения, реализовал следующим образом:

    @Subscribe("type")
    public void onTypeComponentValueChange(
            final AbstractField.ComponentValueChangeEvent<JmixComboBox<InputParameters>, InputParameters> event) {
        InputParameters typeParameter = event.getValue();
        Stream<Component> componentStream = form.getChildren();

        Optional<TextArea> textAreaOptional = componentStream
                .filter(TextArea.class::isInstance)
                .map(TextArea.class::cast)
                .findFirst();

        componentStream = form.getChildren();
        Optional<DatePicker> datePickerOptional = componentStream
                .filter(DatePicker.class::isInstance)
                .map(DatePicker.class::cast)
                .findFirst();

        textAreaOptional.ifPresent(textArea -> form.remove(textArea));
        datePickerOptional.ifPresent(datePicker -> form.remove(datePicker));
        if (typeParameter == InputParameters.DATE) {
            form.add(uiComponents.create(DatePicker.class));
        } else {
            form.add(uiComponents.create(TextArea.class));
        }
    }

Только у меня вопрос: в дескрипторе я не указываю компонента для своего атрибута value, указываю только 3 компонента:

        <formLayout id="form" dataContainer="dialogWindowConditionUiDtoDc">
            <comboBox id="type" property="type" required="true"/>
            <comboBox id="operator" property="operator" required="true"/>
            <comboBox id="inputMode" property="inputMode" required="true"/>
        </formLayout>

Получается создаваемое поле никак не привязано к свойству value? Если да, то как его привязать можно? Плюс к этому, поле для value должно быть обязательно к заполнению, а у меня поле генерится (через iComponents.create) и в интерфейсе оно не подсвечивается как обязательное к заполнению. Не подскажите, как это можно добавить?

Ну а как вы собираетесь автоматически привязать текстовое Значение к полю даты?
Никак. По этому, как я и писал выше, вам нужно:

У полей есть значение required, которое вы можете обновить.

Лично я бы так не делал. А скорее при создании поля через uiComponents.create сохранял его как переменную в экране. И по этой переменной уже обращался при удалении.