propertyFilter 属性过滤器
propertyFilter 可以按 实体 属性对数据进行过滤。
XML 元素 |
|
|---|---|
Java 类 |
|
基本用法
最简单的情况下,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 树形数据网格 结合使用。可以精确控制表格中显示的内容。
过滤运算符
默认情况下,运算符无法更改且运算符选择器是隐藏的。设置 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 对集合容器进行过滤:
<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>
日期区间
组件提供了多个按日期区间过滤的选项。选择 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 属性配置一个或多个样式。
| 样式 | 描述 | 支持的主题 |
|---|---|---|
|
内置的 |
自定义主题 |
XML 属性
下面是 propertyFilter 的特殊属性:
| 名称 | 描述 | 默认值 |
|---|---|---|
设置该过滤器的条件值改变时,是否会自动在 |
— |
|
|
— |
|
设置过滤条件的默认值。 |
— |
|
设置该过滤器的名称。 |
— |
|
设置过滤器名称的位置。支持 |
|
|
设置 label 是否可见。 |
|
|
设置 label 的宽度。 |
— |
|
设置过滤运算符。 |
— |
|
限制组件可以使用的运算符。运算符名称通过逗号或空格分隔。 |
— |
|
设置运算符选择器是否展示。 |
|
|
设置运算符标签是否可见。 |
|
|
设置关联的查询语句中条件使用的参数名称。 |
— |
|
设置关联的实体属性。 |
— |
下面是 propertyFilter 支持的其他通用属性:
id - alignSelf - ariaLabel - ariaLabelledBy - classNames - colspan - css - enabled - errorMessage - focusShortcut - height - helperText - invalid - maxHeight - maxWidth - minHeight - minWidth - readOnly - required - requiredMessage - tabIndex - themeNames - visible - width