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"/>
如果动态属性是一个实体,则不能通过该实体的属性进行过滤。

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 内部元素