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,则需要包含 operation 指定的运算符。否则会抛出异常。

数据感知的 propertyFilter

设置 dataLoader 指定过滤器需要应用的数据加载器,设置 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>

使用键值对集合容器

下面的示例展示配置 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 equals 代替:

日期区间

组件提供了多个按日期区间过滤的选项。选择 in interval 运算符,并在对话框中输入区间值。

可选选项包括:

  • Last(之前):例如“过去 3 个月”或“过去 12 周”。

  • Next(之后):例如“未来 3 年”或“未来 48 小时”。

  • Predefined(预定义):快速选择,包括“今天”、“明天”、“本月”或“今年”。

  • Relative date and time(相对时间):用于类似“到当天结束时”、“在小时开始时”、“不是一年的最后一天”等条件。

  • Custom(自定义):任意开始日期和结束日期。开始日期包含在范围内,结束日期不包含。

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

编程式设置

当用户在 UI 中修改过滤器值或者运算符时,数据会自动重新加载。而编程式更改却有不同的行为:

  • setValue() 更新条件但不重新加载数据

  • 在单独的 propertyFilter(在视图中定义的独立组件带有自己的 dataLoader)调用 setOperation() 会立即重新加载数据。如果是修改 groupFilter 或 genericFilter 中的 propertyFilter 条件,则仅更新条件,不重新加载数据。

如需编程式配置过滤器,例如,需要在某个操作中修改过滤器的运算符和值,那么需要先修改运算符(修改运算符类型会重置当前值),再设置值,然后调用 apply()。这样数据才能按照正确的条件加载。

自定义

还可以显式设置作为输入控件的组件,并设置其属性。这样就可以更改 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 facet。

如需指定动态属性,需以 + 开头:

<propertyFilter
        property="+passengerNumberOfSeats"
        operation="EQUAL"
        dataLoader="carsDl"/>
如果动态属性是一个实体,则不能通过该实体的属性进行过滤。

样式版本

使用 themeNames 属性配置一个或多个样式。

样式 描述 支持的主题

No predefined variants

内置的 propertyFilter 组件并未定义任何样式版本。请在应用程序主题中使用 themeNames 配置自定义样式。

自定义主题

XML 属性

下面是 propertyFilter 的特殊属性:

名称 描述 默认值

autoApply

设置该过滤器的条件值改变时,是否会自动在 DataLoader 应用新条件。默认为 true。

—

dataLoader

dataLoader 是一个必需属性

—

defaultValue

设置过滤条件的默认值。

—

label

设置该过滤器的名称。

—

labelPosition

设置过滤器名称的位置。支持 TOP 和 ASIDE。

ASIDE

labelVisible

设置 label 是否可见。

true

labelWidth

设置 label 的宽度。

—

operation

设置过滤运算符。

—

operationsList

限制组件可以使用的运算符。运算符名称通过逗号或空格分隔。

—

operationEditable

设置运算符选择器是否展示。

false

operationTextVisible

设置运算符标签是否可见。

true

parameterName

设置关联的查询语句中条件使用的参数名称。

—

property

设置关联的实体属性。

—

下面是 propertyFilter 支持的其他通用属性:

事件和处理器

下面是 propertyFilter 的特殊事件和处理器:

名称 描述

OperationChangeEvent

当修改运算符时发送。

validator

验证组件值。

下面是 propertyFilter 支持的其他通用事件:

XML 内部元素

一个 propertyFilter 可以包含 tooltip 和 validator 作为其内部元素。