propertyFilter

propertyFilter фильтрует данные по атрибуту сущность.

XML-элемент

propertyFilter

Java-класс

PropertyFilter

Основы

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

<data>
    <collection id="ordersDc"
                class="io.jmix.uisamples.entity.Order"
                fetchPlan="_local">
        <loader id="ordersDl">
            <query>
                <![CDATA[select e from uisamples_Order e]]>
            </query>
        </loader>
    </collection>
</data>
<facets>
    <dataLoadCoordinator auto="true"/>
</facets>
<layout>
    <propertyFilter property="amount"
                    operation="GREATER_OR_EQUAL"
                    dataLoader="ordersDl"/>
    <dataGrid id="orderDataGrid"
              dataContainer="ordersDc"
              width="100%"
              minHeight="20em">
        <columns>
            <column property="date"/>
            <column property="customer"/>
            <column property="amount"/>
            <column property="description"/>
        </columns>
    </dataGrid>
</layout>

Этот компонент фильтрует данные, загруженные в контейнер данных. Он часто используется вместе с компонентами dataGrid или treeDataGrid, которые связаны с тем же контейнером. Такая комбинация позволяет точно управлять отображаемыми строками.

Операции фильтрации

Атрибут operation задаёт операцию фильтрации. Операции, поддерживаемые компонентом, зависят от типа атрибута сущности, указанного в атрибуте property.

По умолчанию операция фиксирована, а селектор операций скрыт. Установите operationEditable в значение true, чтобы пользователь мог выбрать во время выполнения другую поддерживаемую операцию:

<data>
    <collection id="customersDc"
                class="io.jmix.uisamples.entity.Customer"
                fetchPlan="_local">
        <loader id="customersDl">
            <query>
                <![CDATA[select e from Customer e]]>
            </query>
        </loader>
    </collection>
</data>
<facets>
    <dataLoadCoordinator auto="true"/>
</facets>
<layout>
    <propertyFilter id="propertyFilter"
                    property="name"
                    operation="CONTAINS"
                    operationEditable="true"
                    dataLoader="customersDl"/>
    <dataGrid id="customersDataGrid"
              dataContainer="customersDc"
              width="100%"
              minHeight="20em">
        <columns>
            <column property="name"/>
            <column property="lastName"/>
            <column property="age"/>
            <column property="active"/>
            <column property="grade"/>
        </columns>
    </dataGrid>
</layout>

Чтобы оставить доступным только подмножество поддерживаемых операций, укажите их имена в атрибуте operationsList, разделяя их запятыми или пробелами. В Java используйте метод setOperationsList().

Компонент игнорирует указанные в operationsList операции, которые не поддерживаются для типа атрибута. Операция, заданная в operation, должна поддерживаться для типа атрибута и, если указан operationsList, входить в этот список. В противном случае возникает исключение.

propertyFilter связанный с данными

В dataLoader укажите загрузчик, к которому применяется propertyFilter, а в property — атрибут сущности для условия. Загрузчик может заполнять контейнер коллекции или контейнер ключ-значение.

Контейнер коллекции

В следующем примере propertyFilter настраивается для работы с контейнером коллекции:

<data>
    <collection id="ordersDc"
                class="io.jmix.uisamples.entity.Order"
                fetchPlan="_local">
        <loader id="ordersDl">
            <query>
                <![CDATA[select e from uisamples_Order e]]>
            </query>
        </loader>
    </collection>
</data>
<facets>
    <dataLoadCoordinator auto="true"/>
</facets>
<layout>
    <propertyFilter property="amount"
                    operation="GREATER_OR_EQUAL"
                    dataLoader="ordersDl"/>
    <dataGrid id="orderDataGrid"
              dataContainer="ordersDc"
              width="100%"
              minHeight="20em">
        <columns>
            <column property="date"/>
            <column property="customer"/>
            <column property="amount"/>
            <column property="description"/>
        </columns>
    </dataGrid>
</layout>

Контейнер Key-Value

В следующем примере propertyFilter настраивается для работы с контейнером коллекции ключ-значение:

<data>
    <keyValueCollection id="customersDc">
        <loader id="customersDl">
            <query>
                <![CDATA[select o.customer.name, o.customer.lastName, sum(o.amount) from uisamples_Order o group by o.customer]]>
            </query>
        </loader>
        <properties>
            <property datatype="string" name="name"/>
            <property datatype="string" name="lastName"/>
            <property datatype="decimal" name="sum"/>
        </properties>
    </keyValueCollection>
</data>
<facets>
    <dataLoadCoordinator auto="true"/>
</facets>
<layout>
    <propertyFilter id="propertyFilter"
                    label="Name contains"
                    property="name"
                    operation="CONTAINS"
                    dataLoader="customersDl"/>
    <dataGrid id="customersDataGrid"
              dataContainer="customersDc"
              width="100%"
              minHeight="20em">
        <columns>
            <column property="name"
                    header="Name"/>
            <column property="lastName"
                    header="Last name"/>
            <column property="sum"
                    header="Sum"/>
        </columns>
    </dataGrid>
</layout>

Множественная фильтрация

Привязка нескольких компонентов propertyFilter к одному контейнеру данных позволяет применять несколько условий фильтрации одновременно. Например, можно использовать два компонента для фильтрации по отделу и фамилии:

<hbox>
    <propertyFilter dataLoader="usersDl"
                    operation="EQUAL"
                    property="department"/>
    <propertyFilter dataLoader="usersDl"
                    operation="CONTAINS"
                    property="lastName"/>
</hbox>

Фильтрация по дате

Фильтрация по дате без учета времени

Операция сравнения = не всегда подходит для свойств с типом Date/Time. Для сравнения только по дате (без учета времени), вместо = используйте date equals:

Фильтрация по временному интервалу

Компонент предоставляет несколько способов фильтрации по интервалам дат. Выберите оператор in interval и укажите значения интервала в диалоговом окне.

Доступные опции:

  • Прошедший период: интервалы вида «последние 3 месяца» или «последние 12 недель».

  • Будущий период: интервалы вида «следующие 3 года» или «следующие 48 часов».

  • Предопределённый интервал: значения «сегодня», «завтра», «в этом месяце» или «в этом году».

  • Относительные дата и время: условия «к концу дня», «в начале часа», «не в последний день года».

  • Произвольный интервал: позволяет указать границы интервала вручную.

<data>
    <collection id="ordersDc"
                class="io.jmix.uisamples.entity.Order"
                fetchPlan="_local">
        <loader id="ordersDl">
            <query>
                <![CDATA[select e from uisamples_Order e]]>
            </query>
        </loader>
    </collection>
</data>
<facets>
    <dataLoadCoordinator auto="true"/>
</facets>
<layout>
    <propertyFilter property="date"
                    operation="IN_INTERVAL"
                    dataLoader="ordersDl"/>
    <dataGrid id="orderDataGrid"
              dataContainer="ordersDc"
              width="100%"
              minHeight="20em">
        <columns>
            <column property="date"/>
            <column property="customer"/>
            <column property="amount"/>
            <column property="description"/>
        </columns>
    </dataGrid>
</layout>

Настройка

Можно явно задать компонент поля ввода и настроить его атрибуты. Это позволяет изменить стандартный внешний вид propertyFilter и добавить дополнительные возможности. Например:

<data>
    <collection id="ordersDc"
                class="io.jmix.uisamples.entity.Order">
        <fetchPlan extends="_local">
            <property name="customer" fetchPlan="_local"/>
        </fetchPlan>
        <loader id="ordersDl">
            <query>
                <![CDATA[select e from uisamples_Order e]]>
            </query>
        </loader>
    </collection>
    <collection id="customersDc"
                class="io.jmix.uisamples.entity.Customer">
        <fetchPlan extends="_local"/>
        <loader id="customersDl">
            <query>
                <![CDATA[select e from Customer e]]>
            </query>
        </loader>
    </collection>
</data>
<facets>
    <dataLoadCoordinator auto="true"/>
</facets>
<layout>
    <propertyFilter property="customer"
                    operation="EQUAL"
                    dataLoader="ordersDl">
        <entityComboBox metaClass="Customer" itemsContainer="customersDc">
            <actions>
                <action id="lookup" type="entity_lookup"/>
                <action id="clear" type="entity_clear"/>
            </actions>
        </entityComboBox>
    </propertyFilter>
    <dataGrid id="ordersDataGrid"
              dataContainer="ordersDc"
              width="100%"
              minHeight="20em">
        <columns>
            <column property="date"/>
            <column property="customer"/>
            <column property="amount"/>
            <column property="description"/>
        </columns>
    </dataGrid>
</layout>

Динамические атрибуты

Компонент поддерживает фильтрацию по динамическим атрибутам. Для этого не требуется наличие фасета dynamicAttributes на экране.

Чтобы указать динамический атрибут, начните его имя с префикса +:

<propertyFilter
        property="+passengerNumberOfSeats"
        operation="EQUAL"
        dataLoader="carsDl"/>
Если динамический атрибут является сущностью, фильтрация по его атрибутам невозможна.

Варианты темы

Используйте атрибут themeNames, чтобы применить один или несколько вариантов темы.

Вариант Описание Поддерживается в

Предопределённые варианты отсутствуют

propertyFilter не определяет встроенные варианты оформления. Используйте themeNames для пользовательских стилей в теме приложения.

Пользовательские темы

Атрибуты

propertyFilter имеет следующие уникальные атрибуты:

Имя Описание По умолчанию

autoApply

Устанавливает, должен ли фильтр по атрибутам автоматически применяться к DataLoader при изменении значения условия.

—

dataLoader

dataLoader — обязательный атрибут.

—

defaultValue

Устанавливает значение по умолчанию для условия фильтра.

—

label

Задаёт подпись компонента.

—

labelPosition

Атрибут labelPosition определяет положение метки фильтра:

—

labelVisible

Устанавливает видимость label или нет.

—

labelWidth

Устанавливает ширину label.

—

operation

Определяет операцию фильтрации.

—

operationsList

Ограничивает список доступных для компонента операций фильтрации. Имена операций можно разделять запятыми или пробелами.

—

operationEditable

Устанавливает, виден ли селектор операций.

—

operationTextVisible

Атрибут operationTextVisible определяет видимость метки операции.

—

parameterName

Атрибут parameterName задаёт имя связанного имени параметра запроса, используемого условием.

—

property

Указывает атрибут сущности, связанный с компонентом.

—

propertyFilter имеет следующие общие атрибуты:

Обработчики

propertyFilter имеет следующие уникальные обработчики:

Имя Описание

OperationChangeEvent

OperationChangeEvent отправляется при изменении свойства операции.

validator

Проверяет значение компонента.

propertyFilter имеет следующие общие обработчики:

Элементы

Компонент propertyFilter может содержать следующие вложенные элементы: tooltip и validator.