Generic filter: не сбрасываются условия фильтрации

JMIX 2.3.4

В StandardListView для компонента GenericFilter определена DesignTime конфигурация:

    <genericFilter id="genericFilter" dataLoader="paymentRequestsDl" opened="false">
        <properties include=".*"/>
        <configurations>
            <configuration id="configuration_not_done" name="msg://configurationActiveRequests">
                <propertyFilter property="status" operation="IN_LIST" defaultValue="PENDING, NEW, PROCESSING"/>
            </configuration>
        </configurations>
    </genericFilter>,

которая применяется в обработчике события Init:

        Configuration config = genericFilter.getConfiguration("configuration_not_done");
        genericFilter.setCurrentConfiguration(config);

Все нормально - данные фильтруются.

При попытке сброса конфигурация фильтра очищается, но к данным по-прежнему применяются предыдущие условия фильтрации.

В описанном сценарии при выполнении команды ‘Reset’ не сбрасывается значение свойства initialDataLoaderCondition. Как следствие - свойство DataLoader’а condition устанавливается в значение “[предыдущее значение] and ()”.

Здравствуйте

Дело в том, что любое условие, проставленное в компонент GenericFilter в момент onInit проставляется в поле initialDataLoaderCondition у GenericFilter. Это поле служит для того, чтобы запоминать все остальные условия загрузчика данных, которые находятся на странице.

Оно было введено в следствие работы над следующей задачей: ResetAction of the GenericFilter breaks the PropertyFilter · Issue #2406 · jmix-framework/jmix · GitHub

Суть задачи в том, что другие условия на странице (например из PropertyFilter компонента) сбрасывались, при сбросе конфигурации у GenericFilter. Таким образом, как я уже писал ранее, все модификации запроса загрузчика данных сохраняются и устанавливаются при сбросе конфигурации фильтра.

Чтобы вы могли использовать конфигурацию сразу при открытии экрана рекомендуется воспользоваться атрибутом default в определении конфигурации:

            <configuration id="configuration_not_done" name="msg://configurationActiveRequests"
             default="true">
                <propertyFilter property="status" operation="IN_LIST" defaultValue="PENDING, NEW, PROCESSING"/>
            </configuration>

Или, вы можете установить собственную конфигурацию позже, чем на InitEvent, например на момент onBeforeShow.

С уважением,
Дмитрий

Варианты с установкой конфигурации в onBeforeShow или onReady я пробовал. Они не срабатывают. Конфигурация не применяется.

Вообще суть задачи в том, чтобы применить конкретную конфигурацию фильтра в зависимости от роли пользователя.

Возможно вы не применяете установленную конфигурацию к загрузчику. В случае установки конфигурации на момент onInit загрузку за Вас, скорее всего, производил dataLoaderCoordinator facet.

Вы можете загрузить данные вручную:

    @ViewComponent
    private GenericFilter genericFilter;

    @Subscribe
    public void onBeforeShow(final BeforeShowEvent event) {
        Configuration config = genericFilter.getConfiguration("config");
        genericFilter.setCurrentConfiguration(config);
        genericFilter.apply();
    }

Либо отсрочить загрузку данных до момента onReady, если это подходит для вашего случая (в этом случае будет только одна загрузка на момент открытия, вместо двух).
В таком случае контроллер будет выглядеть как:

    @ViewComponent
    private GenericFilter genericFilter;

    @Subscribe
    public void onBeforeShow(final BeforeShowEvent event) {
        Configuration config = genericFilter.getConfiguration("config");
        genericFilter.setCurrentConfiguration(config);
    }

В дескрипторе будет настроен dataLoadCoordinator:

    <facets>
        <dataLoadCoordinator>
            <refresh loader="usersDl">
                <onViewEvent type="Ready"/>
            </refresh>
        </dataLoadCoordinator>

        <!-- other facets -->
    </facets>

Документация по dataLoadCoordinator:
https://docs.jmix.ru/jmix/flow-ui/facets/dataLoadCoordinator.html#refresh

С уважением,
Дмитрий

Воспользовался последним вариантом. Все работает. Спасибо за помощь!