Skip to main content

Фильтрация

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

Master Detail фильтрация виджетов#

Поле дочернего виджета (detail-field-id) фильтруется по значению родительского (master-field-id). При отсутствии значения в поле родителя, дочерний виджет блокируется. При смене значения в родителе дочерний виджет запрашивает данные с новым фильтром.

Master Detail фильтрация виджетов
<table id="organizations">...</table>
<table depends-on="organizations"    detail-field-id="org.id"    master-field-id="id">...</table>

В примере выше, дочерняя таблица ссылается на родительскую таблицу organizations через атрибут depends-on. Дочерняя таблица фильтруется по полю detail-field-id со значением взятым из родительской таблицы в поле master-field-id.

note

Идентификатор виджета id требуется задавать только в тех случаях, когда на виджет необходимо сослаться. Например, сослаться через depends-on. В остальных случаях его задавать не требуется.

Master Detail фильтрация страниц#

Поле (detail-field-id) главного виджета (result-widget-id) на новой странице можно отфильтровать по значению в поле (master-field-id) родительского виджета на текущей странице.

Master Detail фильтрация страниц
<table>  ...  <toolbar>    <button label="Открыть новое окно">      <show-modal page-id="childPage"        model="resolve"        result-widget-id="detail"        master-field-id="id"        detail-field-id="parentId"/>        <!-- id - поле в текущем виджете в модели resolve -->        <!-- parentId - поле в виджете detail на странице childPage -->    </button>  </toolbar></table>

Предустановленная фильтрация#

Предустановленная фильтрация задается ещё на этапе разработки интерфейса, и её не может поменять пользователь. Предустановленная фильтрация задаётся элементом <pre-filters>:

<pre-filters>  <eq field-id="status" value="1"/>  <more field-id="date" value="{today()}"/></pre-filters>

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

important

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

Фильтрация в виджетах#

Предустановленная фильтрация данных виджета
<table>  ...  <pre-filters>    <eq field-id="status" value="1"/>    <more field-id="date" value="{today()}"/>  </pre-filters></table>

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

Списковые поля — это поля, значения которых можно выбрать из предложенного списка (например, выпадающего списка):

Предустановленная фильтрация спискового поля
<select id="empl" query-id="employee">  <pre-filters>    <eq field-id="orgId" value="{org.id}"/>    <!-- Где org.id, поле текущей модели виджета -->  </pre-filters></select>

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

Значения фильтрации задаются атрибутом value для простых типов, таких как <eq>, <like>, more, less и др.

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

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

Фильтрация по списку значений
<pre-filters>  <in field-id="status" values="{statuses}"/></pre-filters>

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

<pre-filters>  <in field-id="status">    <value>1</value>    <value>2</value>  </in></pre-filters>
Фильтрация по параметру, в атрибуте 'param' задается название параметра в url, а 'routable' указывает попадает ли фильтр в url

<pre-filters>  <eq field-id="name" param="name" routable="true"/></pre-filters>

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

Константные значения записываются непосредственно в атрибуте value для простых типов или в элементе <value> для множественных типов. Чтобы привести значение к правильному типу данных можно использовать атрибут domain. Если domain не указан, тип данных подбирается автоматически.

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

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

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

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

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

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

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

Контекст JavaScript выражений#

Выражения JavaScript выполняются над какой-либо моделью виджета. Модель определяется автоматически в зависимости от контекста использования фильтра.

Если виджет зависимый, то контекстом фильтрации будет resolve модель родительского виджета:

Фильтрация виджета по значениям родительского виджета
<table id="organizations">...</table>
<table depends-on="organizations">  <pre-filters>    <eq field-id="org.id" value="{id}"/>  </pre-filters></table>

Атрибут depends-on задаёт зависимость от виджета organizations. Поэтому все javaScript выражения в <pre-filters> выполняются над моделью resolve виджета organizations.

Можно задать модель вручную через ref- атрибуты:

Фильтрация виджета значениям модели заданной вручную
<table id="organizations">...</table>
<table id="employees">  <pre-filters>    <eq      field-id="org.id"      value="{id}"      ref-widget-id="organizations"      ref-model="resolve"/>  </pre-filters></table>

Поле org.id фильтруется по значению поля id в resolve модели виджета organizations.

Предустановленные поля#

Поля называются предустановленными, если они заранее ограничены. Например, в поле уже стоит значение и его нельзя сменить. Или, значение в поле не стоит, но ограничен выбор возможных значений этого поля.

Автоматическая предустановка полей фильтрацией#

Предустановленная фильтрация не только фильтрует данные виджета. Она оказывает влияние на логическую связность полей.

Например, если дочерний виджет-таблица префильтрован по полю org.id. То пользовательский фильтр org таблицы будет содержать значение из родительского виджета и заблокирован. Это необходимо для того, чтобы пользователь не смог задать противоречивую фильтрацию.

Предустановленное поле в фильтрах таблицы
<table id="organizations">...</table>
<table    depends-on="organizations"    detail-field-id="org.id"    master-field-id="id">  <filters>    <select id="org"/>    <!-- это поле будет предустановленно -->    <!-- из-за фильтра org.id -->  </filters></table>

Усложним вышеприведенный пример. Если из дочерней таблицы откроется модальное окно с формой для добавления записи в эту таблицу, то на этой форме поле org точно так же будет содержать значение из родительского виджета и заблокировано. Это необходимо для того, чтобы пользователь не смог добавить запись в таблицу, которая не будет видна из-за противоречивой фильтрации.

Фильтрация для дочерней страницы
<table id="employee"  depends-on="organizations"  detail-field-id="org.id"  master-field-id="id">  <toolbar>      <button id="create">        <show-modal          page-id="employeeCard"          submit-operation-id="create"          model="filter"          detail-field-id="org.id"          master-field-id="org.id"/>      </button>  </toolbar></table>
Предустановленное поле на дочерней странице
<!-- Страница employeeCard --><simple-page id="employeeCard">  <form>    <fields>      <select id="org"/>      <!-- это поле будет предустановленно -->      <!--из-за фильтра по org.id в <show-modal>  -->    </fields>  </form></simple-page>

Автоматическая предустановка полей может быть выключена через атрибут predefine:

Выключение автоматической предустановки полей
<pre-filters>  <eq field-id="org.id" value="{id}" predefine="false"/></pre-filters>

По умолчанию predefine включён.

important

Автоматическую предустановку полей через Master Detail выключить нельзя!

Ручная предустановка полей#

Предустановить поля можно вручную через элемент pre-fields:

Ручная предустановка полей
<form>  <pre-fields>    <eq field-id="org.id" value="1"/>  </pre-fields>  <fields>    <select id="org">      <!-- Поле будет предустановлено значением 1 -->    </select>  </fields></form>

Значения предустановленных полей могут быть такими же как у предустановленных фильтров.

Предустановка выпадающих списков#

Часто требуется ограничить выпадающий список поля на форме из-за фильтров действующих на форму.

Фильтрация выпадающего списка
<form>  <pre-fields>    <eq field-id="org.status" value="1"/>  </pre-fields>  <fields>    <select id="org" query-id="organizations">      <!-- Из-за предустановки добавится фильтр по status      <pre-filters>        <eq field-id="status" value="1"/>      </pre-filters>      -->    </select>  </fields></form>