Skip to main content

Фильтрация

Данные виджетов и выпадающих списков можно фильтровать по какому-либо значению. В том случае, если значение отсутствует, фильтр не задействуется. Если при этом фильтр обязательный, произойдет ошибка.

Фильтрация источников данных

Источники данных могут загружать выборку с отфильтрованными данными. Для этого необходимо задать элемент <filters>:

Фильтрация источника данных
<datasource id="docs"
query-id="docs">
<filters>
<eq field-id="status" value="1"/>
<more field-id="date" value="{today()}"/>
</filters>
</datasource>

В теле <filters> перечисляются типы фильтрации с указанием поля field-id и значения value.

info

Перечисленные типы фильтров должны быть объявлены в соотствествующих полях выборки. Иначе произойдет ошибка на уровне валидации метаданных.

Фильтрация списковых полей

Списковые поля — это поля, значения которых можно выбрать из предложенного списка, например, выпадающего списка. Фильтрация списковых полей задается с помощью элемента <filters>:

Фильтрация спискового поля
<select id="employee"
query-id="employees">
<filters>
<eq field-id="organization.id" value="{org.id}"/>
</filters>
</select>

В теле <filters> перечисляются типы фильтрации аналогично источникам данных.

Фильтрация окон

Любые дочерние страницы (модальные окна, выдвижные ящики и т.п.) могут фильтровать свои данные от данных, находящихся на родительских страницах. Для этого можно задать их источники данных с фильтрами на родительской странице в элементе <datasources>:

Фильтрация в дочернем окне
<button label="Документы">
<!-- Открытие окна Список документов -->
<show-modal page-id="docsList">
<datasources>
<!-- Передача источника данных в модальное окно -->
<datasource id="docs">
<filters>
<!-- Фильтрация источника данных docs
по id выбранного persons
на родительской странице -->
<eq field-id="person.id"
value="{id}"
datasource="persons"
model="resolve"/>
</filters>
</datasource>
</datasources>
</show-modal>
</button>
info

Атрибуты datasource и model в <filters> ссылаются на источник и модель данных, находящихся на текущей странице, а не на открываемой.

danger

Открывать страницы с хлебными крошками <open-page> со ссылками на родительскую страницу не рекомендуется из-за невозможности восстановления после перезагрузки (F5)! Для страниц с хлебными крошками рекомендуется использовать фильтрацию через параметры адресной строки.

Значения фильтров

Значения фильтрации для простых типов задаются атрибутом value:

Фильтрация по одному значению
<filters>
<eq field-id="status" value="1"/>
</filters>

Для множественных типов можно задать значение через атрибут values:

Фильтрация по списку значений
<filters>
<in field-id="status" values="`[1,2]`"/>
</filters>

Либо перечислить список значений в дочерних элементах <value>:

Фильтрация по значениям в элементах
<filters>
<in field-id="status">
<value>1</value>
<value>2</value>
</in>
</filters>

Фильтрация по константам

Константные значения записываются непосредственно в атрибуте value или элементах <value>.

Чтобы привести значение к правильному типу данных необходимо использовать атрибут domain.

Фильтрация по константному значению с приведением типа
<filters>
<eq field-id="code" domain="string" value="123"/>
</filters>
info

Если domain не указан, тип данных подбирается автоматически по значению.

Если значение фильтра находится в модели данных, то на нее можно сослаться. Ссылка задается в фигурных скобках:

Фильтрация по ссылке
<filters>
<eq field-id="organization.id"
value="{id}"
datasource="org"
model="resolve"/>
</filters>

Атрибутами datasource и model можно указать источник данных и модель, где находится значение. Если они не заданы - будут использоваться текущие источник и модель данных.

В одном значении можно соединить несколько ссылок:

Фильтрация по нескольким ссылкам
<filters>
<like field-id="fullName"
value="{name} {surname}"/>
</filters>

В этом случае конечное значение будет являться форматированной строкой, в определенные места которой вставлены значения ссылок.

Фильтрация по JavaScript выражениям

Можно задать значение с помощью JavaScript выражения. Выражения записываются в обратных кавычках:

Фильтрация по javaScript выражению
<filters>
<eq field-id="isFree"
value="`status != 'busy'`"/>
</filters>

Если в выражении используются поля из моделей данных, то с помощью атрибутов datasource и model можно уточнить в каком источнике и модели они находятся.

Фильтрация по функциям даты и времени

Значения по функциям дат и времени записывается аналогично выражениям JavaScript, но в качестве выражения используется функция:

Фильтрация по функции даты и времени
<filters>
<less field-id="date"
value="`now()`"/>
</filters>

Фильтрация по параметру

В качестве значения фильтра можно использовать параметр из адресной строки текущей страницы. Для этого необходимо задать атрибут param и не задавать атрибут value:

Фильтрация по параметру
<filters>
<eq field-id="person.id"
param="person_id"/>
<!-- Где person_id - параметр в адресном пути страницы -->
</filters>
note

Параметры в адресном пути страницы задаются в разделе Маршрутизация.

Фильтрация по параметру боковой панели

В качестве значения фильтра можно использовать параметр из адресной строки боковой панели. Для этого необходимо задать в атрибуте value двоеточие и название параметра пути боковой панели:

Фильтрация источника данных по параметру боковой панели
<sidebar path="/person/:person_id/**">
<datasource id="person" query-id="persons" size="1">
<filters>
<!-- Ссылка на параметр "person_id" в пути боковой панели -->
<eq field-id="id" value=":person_id"/>
</filters>
</datasource>
...
</sidebar>

Подробнее о параметрах пути боковой панели

Master Detail фильтрация

Master Detail фильтрация - это распространенный шаблон проектирования пользовательского интерфейса, когда значение родительского компонента (обычно списка) фильтрует данные дочернего компонента (списка или формы).

Например, при выборе организации показать список сотрудников. Для реализации этого подхода необходимо использовать фильтры источника данных <filters>, для фильтрации дочернего компонента от значения родительского. И зависимость обновления данных <fetch>, для обновления дочернего компонента при изменении значения родительского:

Master Detail фильтрация источников данных
<datasources>
<!-- Организации -->
<datasource id="org"
query-id="organizations"/>

<!-- Сотрудники -->
<datasource id="employee"
query-id="employees">
<filters>
<!-- Фильтр по организации -->
<eq field-id="org.id"
value="{id}"
datasource="org"
required="true"/>
</filters>
<dependencies>
<!-- Получение новых данных
при изменении модели resolve в источнике Организация -->
<fetch on="org"
model="resolve"/>
</dependencies>
<datasource>
</datasources>

Атрибут required фильтра задает обязательность фильтрации. Если значения не будет, запрос за данными не выполнится.