Поиск и подсветка найденного текста

Множество UI компонент содержат встроенный поиск или фильтрацию. Например, инструмент фильтрации в Webix DataTable
Search results with the found data highlighted

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

Search results with the found data highlighted

Рис.1 Результат поиска с подсветкой найденных данных

В эко-среде Webix поиск и подсветка могут быть реализованы в виде комбинации двух существующих свойств: 

  • общая фильтрация данных, 
  • конкретный шаблон столбца (для datatable) или компоненты (для list и dataview). 

Говоря кратко, все, что Вам нужно, это: 

  1. Запомнить искомый текст. 
  2. Использовать его для фильтрации данных. 
  3. Использовать его в шаблоне, чтобы найти и отметить все совпадения. 

В данном примере UI состоит из двух виджетов: Text (отдельное поле для фильтрации) и Datatable. 

Шаг 1. 

Для начала, настроим обработчик  onTimedKeyPress  для ввода текста. Здесь мы можем получить текущее значение входных данных и использовать его для фильтрации. 

// in Text configuration:
on: {
    onTimedKeyPress: function() {
        const value = this.getValue();
        findText(value);
    }
}

Шаг 2. Фильтрация и запоминание значения. 

findText активирует фильтрацию и сохраняет значение для дальнейшего использования. Мы также используем RegExp, чтобы избежать специальных символов в сохраненном значении, если таковые имеются: 

function findText(text) {
  /* store text that should be highlighted */
  text = text || "";
  escapedSearchText = text.replace(charactersSet, "\\$&");
 
  /* filter data */
  table.filter(filteringFunction)
};

Шаг 3. Настройка шаблона. 

Так как мы уже вызвали фильтрацию, виджет Datatable покажет результат. В этот момент отфильтрованные данные отобразятся в соответствии с шаблоном. 

view:"datatable",
columns:[{
      id:"title",  
      template: searchColumnTemplate
}],

Мы снова используем RegExp, чтобы найти искомый текст и добавить span с определенным CSS:

function searchColumnTemplate(data, type, value) {
  let search = escapedSearchText;
  if (search) {
    value = addTextMark(value, search);
  }
  return value;
};

function addTextMark(value, text) {
  const checkOccurence = new RegExp("(" + text + ")", "ig");
  return value.replace(
    checkOccurence,
    "<span class='search_mark'>$1</span>"
  );
}

Вы можете посмотреть результаты работы этой модификации в следующем демо-примере

С исходным текстом данной заметки Вы можете ознакомиться в этом блоге GitHub

Предлагаем Вам обсудить детали или поделиться примерами в комьюнити блоге Webix

PS 

Возможно, Вы задаетесь вопросом почему данная функциональность не реализована в Webix сразу «из-коробки»? Дело в том, что Webix предлагает web-инструментарий, набор методов и настроек для работы с данными и их отображения. Более специфические вещи, такие как подсветка текста, остаются на усмотрение конечных пользователей (разработчиков), которые сами решают что и как будет делать их web приложение. Баланс функциональности и простоты делает Webix именно тем продуктом, который ценят за скорость и наглядность разработки. Мы стараемся не перегружать наш UI framework излишним количеством фич, но даем мощный инструментарий для реализации любой UX на стороне разработчиков. Если Вы еще не пробовали Webix в работе — скачайте бесплатный пакет, чтобы создать свое web-приложение.