propertyFilter 属性过滤器

propertyFilter 可以基于某个 entity 属性定义一个过滤器条件。

该组件可以独立使用或作为 genericFilter 的一部分使用。

  • XML 元素:propertyFilter

  • Java 类:PropertyFilter

基本用法

最简单的情况下,propertyFilter 有一个输入控件,前面显示要过滤的属性名称和运算符。

property filter basics
<propertyFilter dataLoader="usersDl"
                operation="EQUAL"
                property="department"/> (1)
1 dataLoaderoperationproperty 都是必需属性。

该组件可以对加载到数据容器的数据进行过滤。通常与绑定到同一数据容器的 dataGrid 数据网格treeDataGrid 树形数据网格 结合使用。可以精确控制表格中显示的内容。

过滤运算符

组件支持多种过滤 运算符。可以限制仅使用某个运算符,也可以通过 operationEditable 属性让用户在运行时选择运算符。

property filter operation editable
<propertyFilter dataLoader="usersDl"
                operation="EQUAL"
                property="department"
                operationEditable="true"/>

组件根据属性类型决定可用的运算符。

数据绑定

数据绑定是指将组件与数据容器进行关联。可视化组件或相应数据容器中的更改可以触发彼此的更新。有关详细信息,请参阅 使用数据组件

属性过滤器可以过滤 集合容器键值对容器 容器中的数据。

集合容器

下面的示例展示配置 propertyFilter 对集合容器进行过滤:

<data>
    <collection class="com.company.onboarding.entity.User" id="usersDc">
        <fetchPlan extends="_base">
            <property name="department" fetchPlan="_base"/>
        </fetchPlan>
        <loader id="usersDl">
            <query>
                <![CDATA[select e from User e]]>
            </query>
        </loader>
    </collection>
</data>
<layout>
    <propertyFilter dataLoader="usersDl"
                    operation="EQUAL"
                    property="department"/>
</layout>

键值对集合容器

下面的示例展示配置 propertyFilter 对键值对集合容器进行过滤:

<data>
    <keyValueCollection id="statusesDc">
        <loader id="statusesDl">
            <query>
                <![CDATA[select e.username, e.onboardingStatus, COUNT(e.onboardingStatus)
                from User e
                group by e.username, e.onboardingStatus]]>
            </query>
        </loader>
        <properties>
            <property name="username" datatype="string"/>
            <property name="onboardingStatus" datatype="int"/>
            <property name="count" datatype="int"/>
        </properties>
    </keyValueCollection>
</data>
<layout>
    <propertyFilter dataLoader="statusesDl"
                    operation="CONTAINS"
                    property="username"/>
</layout>

多重过滤

将多个 propertyFilter 组件绑定到单一数据容器可以同时使用多个过滤条件。例如,使用两个组件支持按部门和姓氏进行过滤:

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

过滤日期

忽略时间

使用 = 进行精确匹配可能并不总是适用于日期/时间属性。许多情况下只需要按日期过滤,忽略时间。在这种情况下,可以使用 date equals 代替:

property filter date equals

日期区间

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

property filter date interval

可选选项包括:

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

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

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

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

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

自定义

还可以显式设置作为输入控件的组件,并设置其属性。这样就可以更改 propertyFilter 的默认外观,并使用其他组件提供的额外功能。例如:

property filter custom input field
<propertyFilter id="nameFilter"
                dataLoader="usersDl" property="username"
                operation="CONTAINS"
                labelVisible="false"
                width="100%" maxWidth="30em">
    <textField id="nameFilterField"
               placeholder="Find a user..."
               clearButtonVisible="true">
        <prefix>
            <icon icon="SEARCH"/>
        </prefix>
    </textField>
</propertyFilter>

动态属性

该组件也支持通过 动态属性 进行过滤。此时,视图中不需要包含 dynamicAttributes facet。

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

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

样式版本

使用 themeNames 属性设置组件样式。

样式 描述 支持的主题

No predefined variants

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

自定义主题

XML 属性

autoApply

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

dataLoader

dataLoader 是一个必需属性。设置与当前 propertyFilter 关联的 数据加载器

defaultValue

设置过滤条件的默认值。

label

设置该过滤器的自定义名称。如果未指定,则根据实体属性名和运算符名自动生成。

如果设置了 label 属性。运算符标签或选择器将会隐藏。

labelPosition

labelPosition 属性定义过滤器名称的位置:

  • TOP - 名称展示在属性过滤器的上方。

  • ASIDE - 名称展示在属性过滤器的旁边。

默认值为 ASIDE

labelVisible

设置 label 是否可见。默认值为 true

labelWidth

设置 label 的宽度。宽度值需要能被浏览器解析,例如,"100px""2.5em"

operation

指定过滤运算符。

运算符

描述

属性类型

EQUAL

等于。对于日期/时间属性,请使用 DATE_EQUALS。

数值、布尔值、字符串、日期/时间、时间、UUID、URI、实体、枚举

NOT_EQUAL

不等于。

数值、布尔值、字符串、日期/时间、时间、UUID、URI、实体、枚举

IS_SET

为空或不为空。

数值、布尔值、字符串、日期/时间、时间、UUID、URI、实体、枚举

IN_LIST

检查值是否在列表中。

数值、字符串、日期/时间、时间、UUID、URI、实体、枚举

NOT_IN_LIST

检查值是否不在列表中。

数值、字符串、日期/时间、时间、UUID、URI、实体、枚举

IS_COLLECTION_EMPTY

检查集合是否为空。

实体(@OneToMany@ManyToMany

MEMBER_OF_COLLECTION

属于集合。

实体(@OneToMany@ManyToMany

NOT_MEMBER_OF_COLLECTION

不属于集合。

实体(@OneToMany@ManyToMany

CONTAINS

包含子字符串。

字符串

NOT_CONTAINS

不包含子字符串。

字符串

STARTS_WITH

以…​开头。

字符串

ENDS_WITH

以…​结尾。

字符串

GREATER

大于。

数值、日期/时间、时间

GREATER_OR_EQUAL

大于或等于。

数值、日期/时间、时间

LESS

小于。

数值、日期/时间、时间

LESS_OR_EQUAL

小于或等于。

数值、日期/时间、时间

IN_INTERVAL

属于用户通过 日期区间 对话框指定的区间。

日期/时间、时间

DATE_EQUALS

等于日期。仅比较日期,忽略时间。参见 示例

日期/时间

operationEditable

设置运算符选择器是否展示。可能值 truefalse(默认为 false)。如果设置 operationEditable = true,运算符字段支持在运行时选择运算符。根据属性类型决定可选的运算符列表。

operationTextVisible

operationTextVisible 属性定义运算符标签是否可见。可能值 truefalse(默认为 true)。

parameterName

parameterName 属性设置关联的查询语句中条件使用的参数名称。如果未定义,则随机生成。

property

设置关联的实体属性名称或属性路径(例如,nameorderorder.date)。

事件和处理器

在 Jmix Studio 生成处理器桩代码时,可以使用 Jmix UI 组件面板的 Handlers 标签页或者视图类顶部面板的 Generate Handler 添加,也可以通过 CodeGenerate 菜单(Alt+Insert / Cmd+N)生成。

OperationChangeEvent

当运算符属性变更时发送 OperationChangeEvent

validator

为组件添加 validator 实例。当值无效时,验证器需要抛出 ValidationException 异常。示例:

如果预定义的验证器不能满足需要,可以添加自定义的验证器实例:

@Install(to = "propertyFilter", subject = "validator")
private void propertyFilterValidator(String value) {
    if (value != null && value.length() != 6)
        throw new ValidationException("Zip must be of 6 digits length");
}

XML 内部元素