XML-имя компонента: filter
.
Компонент реализован для блоков Web Client и Desktop Client.
Пример объявления компонента в XML-дескрипторе экрана:
<dsContext> <collectionDatasource id="carsDs" class="com.company.sample.entity.Car" view="carBrowse"> <query> select c from ref$Car c order by c.createTs </query> </collectionDatasource> </dsContext> <layout> <filter id="carsFilter" datasource="carsDs"> <properties include=".*"/> </filter> <table id="carsTable" width="100%"> <columns> <column id="vin"/> <column id="model.name"/> <column id="colour.name"/> </columns> <rows datasource="carsDs"/> </table> </layout>
Здесь в элементе dsContext
определен источник данных collectionDatasource
, который выбирает экземпляры сущности Car
с помощью JPQL запроса. Для компонента filter
в его атрибуте datasource
указан фильтруемый источник данных. Данные отображаются компонентом Table, связанным с этим же источником.
Элемент filter
может содержать вложенные элементы. Все они описывают условия, доступные пользователю для выбора в диалоге добавления условий:
-
properties
- позволяет сделать доступными сразу несколько атрибутов сущности. Данный элемент может иметь следующие атрибуты:Например:
<filter id="transactionsFilter" datasource="transactionsDs"> <properties include=".*" exclude="(masterTransaction)|(authCode)"/> </filter>
При использовании элемента
properties
автоматически игнорируются следующие атрибуты сущности:-
Коллекции (
@OneToMany
,@ManyToMany
). -
Атрибуты, не имеющие локализованного названия.
-
Атрибут
version
.
-
-
property
- явно включает атрибут сущности по имени. Данный элемент может иметь следующие атрибуты:-
name
- обязательный атрибут, содержит имя включаемого атрибута сущности. Может быть путем (через ".") по графу сущностей. Например:<filter id="transactionsFilter" datasource="transactionDs" applyTo="table"> <properties include=".*" exclude="(masterTransaction)|(authCode)"/> <property name="creditCard.maskedPan" caption="msg://EmbeddedCreditCard.maskedPan"/> <property name="creditCard.startDate" caption="msg://EmbeddedCreditCard.startDate"/> </filter>
-
caption
- локализованное название атрибута сущности для отображения условия фильтра. Как правило, представляет из себя строку с префиксомmsg://
по правиламMessageTools.loadString()
.Если в атрибуте
name
указан путь (через ".") по графу сущностей, то атрибутcaption
является обязательным. -
paramWhere
− задает выражение на JPQL для отбора списка значений параметра условия, если параметр является связанной сущностью. Вместо алиаса сущности параметра в выражении нужно использовать метку (placeholder){E}
.Например, предположим, что сущность
Car
имеет ссылку на сущностьModel
. Тогда список возможных значений параметра может быть ограничен только моделямиAudi
:<filter id="carsFilter" datasource="carsDs"> <property name="model" paramWhere="{E}.manufacturer = 'Audi'"/> </filter>
В выражении JPQL можно использовать параметры экрана, атрибуты сессии, а также компоненты экрана, в том числе отображающие другие параметры. Правила задания параметров запроса описаны в Раздел 4.5.3.2, «Запросы в CollectionDatasourceImpl».
Пример использования параметра сессии и параметра экрана:
{E}.createdBy = :session$userLogin and {E}.name like :param$groupName
Используя
paramWhere
можно вводить зависимости между параметрами. Например, предположим, чтоManufacturer
является отдельной сущностью. То естьCar
ссылается наModel
, которая в свою очередь ссылается наManufacturer
. Тогда для фильтра поCar
можно создать два условия: первое для выбораManufacturer
и второе для выбораModel
. Чтобы ограничить список моделей выбранным перед этим производителем, добавьте в выражениеparamWhere
параметр:{E}.manufacturer.id = :component$filter.model_manufacturer90062
Здесь параметр ссылается на компонент, отображающий параметр Manufacturer. Имя компонента, отображающего параметр условия, можно узнать, вызвав контекстное меню на строке таблицы условий в редакторе фильтра:
-
paramView
− задает представление, с которым будет загружаться список значений параметра условия, если параметр является связанной сущностью. Например,_local
. Если не указано, используется_minimal
.
-
-
custom
- элемент, определяющий произвольное условие. Содержимым элемента должно быть выражение на JPQL (возможно использование JPQL Macros), которое будет добавлено в условиеwhere
запроса источника данных. Вместо алиаса отбираемой сущности в выражении нужно использовать метку (placeholder){E}
. Параметр условия может быть только один, и если он есть, обозначается символом?
.Пример фильтра с произвольными условиями:
<filter id="carsFilter" datasource="carsDs"> <properties include=".*"/> <custom name="vin" paramClass="java.lang.String" caption="msg://vin"> {E}.vin like ? </custom> <custom name="colour" paramClass="com.company.sample.entity.Colour" caption="msg://colour" inExpr="true"> ({E}.colour.id in (?)) </custom> <custom name="repair" paramClass="java.lang.String" caption="msg://repair" join="join {E}.repairs cr"> cr.description like ? </custom> <custom name="updateTs" caption="msg://updateTs"> @between({E}.updateTs, now-1, now+1, day) </custom> </filter>
Созданные
custom
условия отображаются в секции Специальные условия диалога добавления условий:Атрибуты элемента
custom
:-
caption
− обязательный атрибут - локализованное название условия. Как правило, представляет из себя строку с префиксомmsg://
по правиламMessageTools.loadString()
. -
paramClass
− Java-класс параметра условия. Если параметр отсутствует, то данный атрибут не обязателен. -
inExpr
− должен быть установлен вtrue
, если выражение JPQL содержит условиеin (?)
. При этом пользователь будет иметь возможность ввести несколько значений параметра данного условия. -
join
− необязательный атрибут для задания строки, которая будет добавлена в секциюfrom
запроса источника данных. Это может потребоваться для создания условия по атрибуту связанной коллекции. Значение данного атрибута должно включать в себя предложенияjoin
илиleft join
.Например, предположим что сущность
Car
имеет атрибутrepairs
, который представляет собой коллекцию экземпляров связанной сущностиRepair
. Тогда для фильтрацииCar
по атрибутуdescription
сущностиRepair
можно написать следующее условие:<filter id="carsFilter" datasource="carsDs"> <custom name="repair" caption="msg://repair" paramClass="java.lang.String" join="join {E}.repairs cr"> cr.description like ? </custom> </filter>
При использовании такого условия исходный запрос источника данных:
select c from sample$Car c order by c.createTs
будет трансформирован в следующий:
select c from sample$Car c join c.repairs cr where (cr.description like ?) order by c.createTs
-
paramWhere
− задает выражение на JPQL для отбора списка значений параметра условия, если параметр является связанной сущностью. См. описание одноименного атрибута элементаproperty
. -
paramView
− задает представление, с которым будет загружаться список значений параметра условия, если параметр является связанной сущностью. Например,_local
. Если не указано, используется_minimal
.
Атрибуты filter
:
-
editable
- если значение этого атрибута равноfalse
, то кнопка скрывается. -
required
- если значение этого атрибута равноtrue
, то в списке фильтров значение<без фильтрации>
не отображается, и пользователь обязательно должен выбрать один из доступных фильтров. Если для экрана не установлен фильтр по умолчанию, то в списке выбора фильтра автоматически устанавливается первый созданный фильтр. -
manualApplyRequired
− определяет, в какой момент будет применяться фильтр. Если значение атрибута равноfalse
, то сразу при открытии экрана будет применяться фильтр по умолчанию. Если фильтр по умолчанию отсутствует, то установка значенияfalse
для атрибута теряет смысл. Если значение атрибута равноtrue
, то фильтр будет применяться только после нажатия на кнопку .Данный атрибут имеет приоритет над свойством приложения cuba.gui.genericFilterManualApplyRequired.
-
useMaxResults
− ограничивает размер страницы загружаемых в источник данных экземпляров сущности. По умолчаниюtrue
.Если значение этого атрибута равно
false
, то фильтр не будет отображать поле Показывать строк. Количество записей в источнике данных (и соответственно, показываемых таблицей) будет ограничено только параметромMaxFetchUI
механизма статистики сущностей, по умолчанию - 10000.Если данный атрибут не указан, или равен
true
, то поле Показывать строк отображается, если у пользователя также есть специфическое разрешение cuba.gui.filter.maxResults. Если разрешениеcuba.gui.filter.maxResults
отсутствует, то фильтр будет принудительно отбирать только первые N строк без возможности пользователя отключить это или указать другое N. Число N определяется параметрамиFetchUI
,DefaultFetchUI
, получаемыми из механизма статистики сущностей.На рисунке далее показан вид фильтра со значением атрибута
useMaxResults="true"
, запретом специфического разрешенияcuba.gui.filter.maxResults
и параметромDefaultFetchUI=2
-
textMaxResults
- позволяет использовать текстовое поле вместо выпадающего списка в качестве поля Показывать строк. По умолчаниюfalse
. -
folderActionsEnabled
− при указании значенияfalse
позволяет скрыть следующие действия с фильтром: Сохранить как папку поиска, Сохранить как папку приложения. По умолчанию значение атрибута равноtrue
, действия Сохранить как папку поиска, Сохранить как папку приложения доступны. -
applyTo
− необязательный атрибут, содержит идентификатор компонента, с которым связан фильтр. Используется в случае, когда необходимо иметь доступ к представлениям связанного компонента-таблицы. Например, сохраняя фильтр как папку поиска или как папку приложения, можно указать, какое представление будет применятся при просмотре этой папки. -
columnsQty
- задает количество колонок с условиями для конкретного фильтра. Значение по умолчанию - 3.
Все атрибуты filter
:
applyTo | datasource | folderActionsEnabled | margin |
caption | editable | id | required |
columnsQty | enable | manualApplyRequired | stylename |
useMaxResults | visible |
Элементы filter
:
Атрибуты элемента properties
:
Атрибуты элемента property
:
Атрибуты элемента custom
: