Вы можете фильтровать данные на клиенте по одному или нескольким критериям, используя встроенные или пользовательские фильтры.
Вы можете определить встроенный фильтр в хедере или футере столбца. Webix предлагает различные виды фильтров:
Ниже подробнее о каждом.
Встроенный фильтр задается с помощью свойства content атрибута header/footer. Обратите внимание, что добавить фильтр можно только в хедер (футер), заданный объектом или массивом.
columns:[
{ id:"year", header:{ content:"{filtername}Filter" } },
{
id:"title",
header:[
{ content:"{filtername}Filter" },
"Title"
]
}
]
Чтобы создать свой фильтр (или какой-то другой пользовательский элемент) для хедера или изменить способ работы фильтра,перейдите по ссылке.
Функциональность доступна в версии Webix Pro.
Вы можете настраивать контрол, который используется в хедере таблицы для фильтрации (richselect, datepicker, и т.п.) с помощью свойства inputConfig.
Например, вы можете включить функциональность tagMode для multiComboFilter как показано ниже:
{
id:"year",
header:[
"Released", {
content:"multiComboFilter", inputConfig:{ tagMode:true }
}
]
}
По умолчанию, опции для фильтров с выбором (selectFilter, richSelectFilter, multiSelectFilter, multiComboFilter и их серверные аналоги) берутся из:
Так же, как и для столбцов, вы можете задать collection/options несколькими способами и, независимо от способа, опции будут хранится в DataCollection.
{
id:"year", header:[
"Released", {
content:"selectFilter", options:data_collection
}
]
},
{
id:"title", options:local_array, header:[
"Film title", {
content:"multiSelectFilter", options:"server/films/"
}
]
}
Если существует коллекция для столбцов, но вы хотите, чтобы фильтр брал опции из значений столбцов, вы можете добавить фильтру дополнительное свойство конфигурации:
{
id:"year", options:data_collection,
header:[
"Released", {
content:"selectFilter", collect:{ visible:true }
}
]
}
Related sample: Datatable: Option collections for columns, filters and editors
Вы можете настроить попапы и выпадающие списки для фильтрации в столбцах DataTable с помощью свойства suggest. Используйте его для назначения любых настроек, присущих Suggest.
Находит записи, которые содержат строки, введенные в текстовое поле этого столбца.
{ id:"title", header:[ "Film title", { content:"textFilter" } ] }
Related sample: Filtering. Built-in Text Filter and Select Filter
Текстовый фильтр, который работает с бэкендом. Извлекает текст из текстового поля и отправляет запрос на сервер для возврата отфильтрованных данных.
{ id:"title", header:[ "Film title", { content:"serverFilter" } ] }
Related sample: Datatable: Serverside Filtering and Sorting
Параметры запроса:
# find all films with 'the' in the title
data/films?count=50&start=0&filter[title]=the
Если включена сортировка на стороне сервера, данные фильтруются и сортируются на сервере.
Основан на стандартном HTML Select Input. Находит записи данных, сравнивая значения из столбца с выбранной опцией.
{ id:"title", header:[ "Film title",{ content:"selectFilter" } ] }
Related sample: Filtering. Built-in Text Filter and Select Filter
ServerSelect Filter - это Select filter, который работает с бэкендом. Получает выбранную опцию и посылает запрос на сервер, чтобы вернуть отфильтрованные данные.
{ id:"title", header:[ "Film title", { content:"serverSelectFilter" } ] }
Параметры запроса:
Если включена сортировка на стороне сервера, данные фильтруются и сортируются на сервере.
Текстовый фильтр, который используется для столбцов с числами. Находит записи данных, сравнивая значения из столбца с введенным числом или условием. Пользователь может фильтровать числа с операторами сравнения:
{ id:"year", header:[ "Released", { content:"numberFilter" } ] }
Related sample: Filtering. Built-in Numeric Filter
Текстовый фильтр, который используется для столбцов с датами. Находит записи данных, сравнивая значения из столбца с введенной датой или условием. Пользователь может фильтровать данные с операторами сравнения:
Существует три способа ввести дату в dateFilter:
{
id:"year",
header:[ "Released",{ content:"dateFilter"}],
format:webix.i18n.dateFormatStr
}
Related sample: Filtering. Built-in Date Filter
Доступно в версии Webix Pro.
Находит записи данных, сравнивая выбранную опцию со значениями из столбца. Основан на контроле Webix RichSelect.
{ id:"year", header:["Released", { content:"richSelectFilter" }]}
Related sample: Multi-Select Filter in DataTable
Доступно в версии Webix Pro.
Получает выбранную опцию и посылает запрос на сервер, чтобы вернуть отфильтрованные данные.
{ id:"year",header:["Released", { content:"serverRichSelectFilter" }]}
Параметры запроса:
Если включена сортировка на стороне сервера, данные фильтруются и сортируются на сервере.
Доступно в версии Webix Pro.
Пользователь может выбрать несколько опций из выпадающего списка. Фильтр найдет записи, сравнивая значения из столбца с выбранными опциями. Фильтр основан на контроле Webix MultiSelect.
{ id:"year",header:["Released", { content:"multiSelectFilter" }]}
Related sample: Multi-Select Filter in DataTable
Доступно в версии Webix Pro.
Пользователь может выбрать несколько опций из выпадающего списка. Фильтр получает выбранные опции и посылает запрос на сервер, чтобы вернуть отфильтрованные данные.
{ id:"year",header:["Released", { content:"serverMultiSelectFilter" }]}
Параметры запроса:
Если включена сортировка на стороне сервера, данные фильтруются и сортируются на сервере.
Доступно в версии Webix Pro.
Пользователь может ввести текст и выбрать несколько опций из списка. Фильтр получает выбранные опции и находит записи сравнивая значения из столбца с выбранными опциями. Фильтр основан на контроле Webix MultiCombo.
{ id:"year", header:["Released", { content:"multiComboFilter" }] }
По умолчанию свойство конфигурации tagMode для этого фильтра отключено, т.е. контрол показывает только один тег с количеством выбранных опций. Вы можете включить tagMode внутри свойства inputConfig конфигурации хедера:
{
id:"year",
header:["Released", { content:"multiComboFilter", inputConfig:{tagMode:true} }]
}
В случае, если опция фильтра содержит разделитель, например, запятую ("The Good, the Bad and the Ugly"), это может вызвать поломку фильтра.
Чтобы этого избежать, необходимо задать свойство separator внутри объекта фильтра, и в качестве значения этого свойства установить разделитель, отличный от тех, которые могут встретиться в опциях. Например, точку с запятой:
{ id:"title",header:["Film title", {content:"multiComboFilter", separator:";"}] }
Доступно в версии Webix Pro.
Пользователь может ввести текст и выбрать несколько опций из списка. Фильтр получает выбранные опции и посылает запрос на сервер, чтобы вернуть отфильтрованные данные.
{ id:"year",header:["Released", { content:"serverMultiComboFilter" }]}
Параметры запроса:
Если включена сортировка на стороне сервера, данные фильтруются и сортируются на сервере.
Доступно в версии Webix Pro.
Пользователь может выбрать дату из DatePicker. Фильтр получает выбранную дату и находит записи, сравнивая даты в этом столбце с выбранной датой. Фильтр основан на контроле Webix DatePicker.
{ id:"date", header:[ "Released", { content:"datepickerFilter" }],
format:webix.i18n.dateFormatStr}
Related sample: Date filters in the DataTable
Доступно в версии Webix Proy.
Пользователь может выбрать интервалы даты из DateRangePicker. Фильтр получает выбранные даты и находит записи, сравнивая даты в этом столбце с выбранным интервалом. Фильтр основан на контроле Webix DateRangePicker.
{ id:"date", header:["Deadline", { content:"dateRangeFilter"}],
format:webix.i18n.dateFormatStr, width:200}
Related sample: Date-Range Filter in the DataTable
Доступно в версии Webix Pro.
Пользователь может выбрать интервалы даты из DateRangePicker. Фильтр получает выбранные даты, находит записи и посылает запрос на сервер, чтобы вернуть отфильтрованные данные.
{ id:"title", header:["Film title", {content:"serverDateRangeFilter"}],
format:webix.i18n.dateFormatStr, width:200}
Параметры запроса:
Если включена сортировка на стороне сервера, данные фильтруются и сортируются на сервере.
Доступно в версии Webix Pro.
Это фильтр, схожий с фильтром Excel, с возможностью настройки. Excel Filter позволяет вызывать Webix Filter и устанавливать список правил (в зависимости от заданного режима) или исключать некоторые данные из фильтрации.
В header
вы можете задать:
{ id:"year", header:[{text:"Released", content:"excelFilter", mode:"date"}], width:200, sort:"date",
format:webix.Date.dateToStr("%Y")
}
Request parameters are:
Related sample: Excel Filter in the DataTable
Available in Webix Pro edition only.
The user can filter data using Webix Filter, set the list of rules (depending on the defined mode) or exclude some data from filtering. The filter gets the set filtering rules and sends a request to a server to return the filtered data.
{ id:"year", header:[{text:"Released", content:"serverExcelFilter", mode:"date"}],
width:200, sort:"date", format:webix.Date.dateToStr("%Y")
}
Request parameters are:
Если включена сортировка на стороне сервера, данные фильтруются и сортируются на сервере.
Каждый раз, когда пользователь начинает вводить текст в фильтр, DataTable вызывает метод filterByAll и данные фильтруются заново (предыдущие результаты не сохраняются).
По умолчанию, когда есть фильтры в нескольких столбцах, DataTable применяет логику AND (И), т.е. таблица отобразит только записи, которые попали под критерии всех фильтров.
Related sample: Filtering by Several Criteria (AND Logic)
Если вы хотите применить логику OR (ИЛИ), т.е. отображать записи, попадающие под критерии хотя бы одного из фильтров, переопределите метод filterByAll(). Например:
Реализация логики OR для фильтров
webix.ui({
id:"grid",
view:"datatable",
columns:[
{ id:"title", header:["Film title", {content:"textFilter"}] },
{ id:"year", header:["Released", {content:"selectFilter"}] },
{ id:"votes", header:"Votes" }
]
});
$$("grid").filterByAll = function(){
// получает значение фильтра
var title = this.getFilter("title").value;
var year = this.getFilter("year").value;
// не фильтрует таблицу, если значения не выбраны
if (!(title || year)) return this.filter();
// фильтры, использующие логику OR
this.filter(function(obj){
return (obj.year == year) ||
(obj.title.toLowerCase().indexOf(title) != -1);
});
};
Related sample: Filtering by Several Criteria (OR Logic)
Вы можете изменит паттерн фильтрации по умолчанию, переопределив функцию compare атрибута header(footer).
Функция принимает три параметра:
Например, чтобы DataTable фильтровал только по началу строк, определите функцию следующим образом:
Фильтрация по первой букве значения столбца
function startCompare(value, filter){
value = value.toString().toLowerCase();
filter = filter.toString().toLowerCase();
return value.indexOf(filter) === 0;
}
webix.ui({
view:"datatable",
columns:[
{
id:"title",
header:["Film title",{content:"textFilter",compare:startCompare}]
}
]
});
Related sample: Using Different Filtering Rules
Если вы хотите предварительно обработать инпут фильтра, переопределите функцию prepare фильтра в объекте header(footer). Функция принимает два параметра:
webix.ui({
view:"datatable",
columns:[
{
id:"title",
header:[
"Film title",
{
content:"textFilter",
prepare:function(filterValue, filterObject){
return filterValue;
},
compare:function(cellValue, filterValue){
return cellValue == filterValue;
}
}
]
}
]
});
Пользователь может фильтровать DataTable по нескольким столбцам, используя для этого один инпут.
Чтобы реализовать это:
Фильтрация по нескольким критериям (используя метод filterByAll)
webix.ui({
id:"grid",
view:"datatable",
columns:[
{ id:"rank", header:["#", { content:"textFilter", colspan:3}] },
{ id:"title", header:["Film title",""] },
{ id:"year", header:["Released",""] },
]
});
$$("grid").filterByAll = function(){
// получает значения фильтра
var text = this.getFilter("rank").value.toString().toLowerCase();
// не фильтрует, если текст не введен
if (!text) return this.filter();
// фильтрует, используя логику OR
this.filter(function(obj){
return (obj.year == text) || (obj.title.toLowerCase().indexOf(text)!=-1);
});
};
Related sample: Filtering by Multiple Criteria Entered via One Input
Фильтрация по нескольким критериям (с указанием дополнительного правила)
webix.ui({
view:"datatable",
columns:[
{
id:"rank",
header:[
"#",
{ content:"textFilter", compare:oneForAll, colspan:3 }
]
},
{ id:"title", header:["Film title",""]},
{ id:"year", header:["Release year",""]}
]
});
function oneForAll(value, filter, obj){
var text = filter.toLowerCase();
return (obj.year.toString().toLowerCase().indexOf(text) !== -1;) ||
(obj.title.toLowerCase().indexOf(text) != -1);
};
Related sample: Custom Filtering by Multiple Criteria Entered via One Input
Создать инпут:
Задать пользовательский фильтр
<input type="text" id='myfilter'>
Зарегистрируйте инпут как новый тип фильтра с помощью registerFilter:
grid = webix.ui({ // компонент
view:"datatable",
columns:[
{id:"title", ...}
]
});
grid.registerFilter(document.getElementById("myfilter"),
{ columnId:"title" }, // столбец или поле данных для фильтра; должен быть уникальным для каждого фильтра
{
getValue:function(node){
return node.value;
},
setValue:function(node, value){
node.value = value;
}
}
);
Related sample: Filtering by Multiple Criteria
Обратите внимание, что columnId должен быть уникальным для каждого фильтра (встроенного или добавленного). Более подробную информацию читайте на этой странице
У DataTable есть метод filter() для полностью настраиваемой фильтрации.
Давайте создадим контрол Text и отфильтруем таблицу с помощью ввода в контрол. Событие onTimedKeyPress отлично подходит для начала фильтрации:
Реализация пользовательского фильтра
webix.ui({
rows:[
{
view:"text", placeholder:"Type to filter films by titles",
on:{
onTimedKeyPress(){
var input = this.getValue().toLowerCase();
if (input){
$$("grid").filter(function(obj){
return obj.title.toLowerCase().indexOf(input) !== -1;
});
} else $$("grid").filter(); // сбросить фильтрацию
}
}
},
{
view:"datatable", id:"grid", autoConfig:true, data:some_data
}
]
});
Related sample: Filtering via a Separate Input Element
Datatable API позволяет искать нужные записи с помощью метода find.
В отличие от фильтрации, поиск не скрывает записи, а просто возвращает массив строк, которые соответствуют критерию.
Например, функциональность позволяет подсвечивать отфильтрованные данные:
var value = "some input";
// res - массив найденных строк
var res = table.find(function(obj){
return obj.title.toLowerCase().indexOf(value) != -1;
});
table.clearCss("marker", true)
for (var i = 0; i < res.length; i++)
table.addCss(res[i].id, "marker", true);
table.refresh();
Компонент TreeTable похож на DataTable, однако имеет некоторые особенности фильтрации.
Свойство filterMode - это объект с двумя атрибутами:
true
) или нет (false
). По умолчанию true
.0
). Если 0
, фильтровать будет все уровни.Использование параметра filterMode
webix.ui({
view:"treetable",
filterMode:{
showSubItems:false,
level:2
}
});
Related sample: Filtering in DataTree
Испытать свои знания на практике
Наверх