Фильтрация
Данные виджетов и выпадающих списков можно фильтровать по какому-либо значению. В том случае, если значение отсутствует, фильтр не задействуется. Если при этом фильтр обязательный, произойдет ошибка.
#
Фильтрация источников данныхИсточники данных могут загружать выборку с отфильтрованными данными.
Для этого необходимо задать элемент <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
.
important
Перечисленные типы фильтров должны быть объявлены в соотствествующих полях выборки. Иначе произойдет ошибка на уровне валидации метаданных.
#
Фильтрация списковых полейСписковые поля — это поля, значения которых можно выбрать из предложенного списка, например, выпадающего списка.
Фильтрация списковых полей задается с помощью элемента <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>
important
Атрибуты datasource
и model
в <filters>
ссылаются на источник и модель данных, находящихся на текущей странице,
а не на открываемой.
warning
Открывать страницы с хлебными крошками <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>
important
Если 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>
note
#
Фильтрация по параметруВ качестве значения фильтра можно использовать параметр из адресной строки текущей страницы.
Для этого необходимо задать атрибут param
и не задавать атрибут value:
<filters> <eq field-id="id" param="person_id"/> <!-- Где person_id - параметр в адресном пути страницы --></filters>
note
Параметры в адресном пути страницы задаются в разделе Маршрутизация.
#
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
фильтра задает обязательность фильтрации.
Если значения не будет, запрос за данными не выполнится.