Фильтрация
Данные виджетов и выпадающих списков можно фильтровать по какому-либо значению. В том случае, если значение отсутствует, фильтр не задействуется. Если при этом фильтр обязательный, произойдет ошибка.
Фильтрация источников данных
Источники данных могут загружать выборку с отфильтрованными данными.
Для этого необходимо задать элемент <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
.
Перечисленные типы фильтров должны быть объявлены в соотствествующих полях выборки. Иначе произойдет ошибка на уровне валидации метаданных.
Фильтрация списковых полей
Списковые поля — это поля, значения которых можно выбрать из предложенного списка, например, выпадающего списка.
Фильтрация списковых полей задается с помощью элемента <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>
Атрибуты datasource
и model
в <filters>
ссылаются на источник и модель данных, находящихся на текущей странице,
а не на открываемой.
Открывать страницы с хлебными крошками <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>
Если 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 выражения. Выражения записываются в обратных кавычках:
<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>
Параметры в адресном пути страницы задаются в разделе Маршрутизация.
Фильтрация по параметру боковой панели
В качестве значения фильтра можно использовать параметр из адресной строки боковой панели.
Для этого необходимо задать в атрибуте 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>
, для обновления дочернего компонента при изменении значения родительского:
<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
фильтра задает обязательность фильтрации.
Если значения не будет, запрос за данными не выполнится.