Статьи

Создание динамических таблиц за секунды из любых данных JSON

Эта статья была рецензирована Стефаном Максом и Саймоном Кодрингтоном . Спасибо всем рецензентам SitePoint за то, что сделали контент SitePoint как можно лучше!

Слуги разворачивают стол

Стандартные таблицы HTML могут быть хорошими, если вы просто пытаетесь расположить некоторые базовые данные, но что, если вы ищете больше из ваших таблиц? Если вам нужно извлечь данные из внешнего API, сделать таблицу сортируемой или редактируемой, то вам понадобится что-то большее, чем просто удар.

Если это звучит знакомо, то Tabulator — это библиотека для вас. Tabulator — это легкий плагин jQuery UI, разработанный для создания сложных интерактивных таблиц, с помощью всего лишь нескольких строк JavaScript, вы можете превратить практически любой источник данных в красиво отформатированную интерактивную таблицу.

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

Создание вашего первого табулятора

Давайте начнем с создания очень простой таблицы.

Поскольку Tabulator является виджетом jQuery, вам необходимо включить библиотеки пользовательского интерфейса jQuery и jQuery из локального источника или CDN по вашему выбору.

Вам нужно будет получить копию библиотеки Tabulator, которую можно клонировать из репозитория GitHub по адресу https://github.com/olifolkerd/tabulator, и включить файлы tabulator.csstabulator.js

 <link rel="stylesheet" href="tabulator.css">
<script type="text/javascript" src="tabulator.js"></script>

Создайте элемент <div>

 <div id="example-table"></div>

Давайте превратим этот элемент в Табулятор с некоторым JavaScript:

 $("#example-table").tabulator();

И вот он, рабочий стол!

Итак, мы еще не совсем там. Чтобы закончить нашу таблицу, нам нужно определить столбцы и загрузить некоторые данные.

Определение столбцов

Чтобы определить макет таблицы, нам нужно предоставить некоторую информацию о каждом из ее столбцов.

Мы делаем это, передавая массив определения столбца в конструктор Tabulator. Каждый объект в массиве представляет столбец таблицы и содержит его параметры настройки:

 $("#example-table").tabulator({
  columns:[
    {title:"Name", field:"name", sortable:true, width:200},
    {title:"Progress", field:"progress", sortable:true, sorter:"number"},
    {title:"Gender", field:"gender", sortable:true},
    {title:"Favourite Color", field:"col", sortable:false},
    {title:"Date Of Birth", field:"dob"},
    {title:"Cheese Preference", field:"cheese"},
  ],
});

Доступно большое количество параметров столбцов, в этой демонстрации мы рассмотрим некоторые из них:

  • titleобязательно для заполнения — заголовок, который будет отображаться в заголовке столбца
  • полеобязательно для заполнения — ключ для столбца в массиве данных
  • align — выравнивание текста для столбца (слева | по центру | справа)
  • widthширина столбца (если не установлено, система определит наилучшее соответствие)
  • sortable — переключает, может ли пользователь сортировать данные по столбцу
  • sorter — Как отсортировать данные в столбце (по умолчанию строка)
  • formatter — Как отформатировать данные в столбце (по умолчанию строка)
  • onClick — обратный вызов, когда пользователь щелкает ячейку в столбце
  • editable — определяет, могут ли эти данные редактироваться пользователем
  • редактор — редактор, который будет использоваться, когда ячейка в столбце редактируема
  • видимый — Показать или скрыть столбец

Загрузка данных в вашу таблицу

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

Массив JavaScript

Вы можете передать массив данных, используя метод setData Для этого требуется массив, в котором каждая строка таблицы определяется объектом.

Давайте создадим несколько примеров данных:

 var sampleData = [
  {id:1, name:"Oli Bob", progress:12, gender:"male", rating:1, col:"red", dob:"", car:1, lucky_no:5, cheese:"Cheader"},
  {id:2, name:"Mary May", progress:1, gender:"female", rating:2, col:"blue", dob:"14/05/1982", car:true, lucky_no:10, cheese:"Gouda"},
  {id:3, name:"Christine Lobowski", progress:42, gender:"female", rating:0, col:"green", dob:"22/05/1982", car:"true", lucky_no:12, cheese:"Manchego"},
  {id:4, name:"Brendon Philips", progress:100, gender:"male", rating:1, col:"orange", dob:"01/08/1980", lucky_no:18, cheese:"Brie"},
  {id:5, name:"Margret Marmajuke", progress:16, gender:"female", rating:5, col:"yellow", dob:"31/01/1999", lucky_no:33, cheese:"Cheader"},
];

Затем назначьте его нашей таблице:

 $("#example-table").tabulator("setData", sampleData);

Запрос Ajax

Чтобы получить данные в формате JSON из удаленного источника, вы можете передать URL-адрес методу setData

 $("#example-table").tabulator("setData", "http://www.exampleurl.com/data");

Дополнительные параметры запроса могут быть переданы в объект с URL.

 $("#example-table").tabulator("setData", "http://www.exampleurl.com/data", {key1:"value1", key2:"value2"});

HTML таблица

Вы также можете преобразовать существующую таблицу HTML в табулятор.

Создайте свою таблицу HTML:

 <table id="example-table">
  <thead>
    <tr>
      <th width="200">Name</th>
      <th>Progress</th>
      <th>Gender</th>
      <th>Height</th>
      <th>Favourite Color</th>
      <th>Date of Birth</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Billy Bob</td>
      <td>12</td>
      <td>male</td>
      <td>1</td>
      <td>red</td>
      <td></td>
    </tr>
    <tr>
      <td>Mary May</td>
      <td>1</td>
      <td>female</td>
      <td>2</td>
      <td>blue</td>
      <td>14/05/1982</td>
    </tr>
  </tbody>
</table>

Затем вызовите конструктор Tabulator для элемента таблицы, чтобы автоматически извлечь заголовки и данные:

 $("#example-table").tabulator({});

Конечный результат

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

Дополнительные возможности

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

Сортировка

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

Сортировка может быть включена или отключена для каждого столбца с использованием параметра сортировки.

 sortable

По умолчанию все столбцы сортируются как текст. Вы можете указать другой сортировщик с параметром $("#example-table").tabulator({
columns:[
{title:"Name", field:"name", sortable:true}, //sorting enabled
{title:"Progress", field:"progress", sortable:false}, //sorting disabled
],
});

 sorter

Доступно несколько встроенных сортировщиков:

  • строка — сортирует как строки символов (опция по умолчанию)
  • число — Сортирует как числа (целое или с плавающей точкой, также будет обрабатывать числа с использованием разделителей «,»)
  • alphanum — сортирует как буквенно-цифровую строку
  • логическое — сортирует как логическое
  • дата — сортировка по дате

Чтобы определить пользовательский сортировщик, передайте обратный вызов параметру $("#example-table").tabulator({
columns:[
{title:"Name", field:"name", sortable:true}, //sort as string (default)
{title:"Progress", field:"progress", sortable:true, sorter:"number"}, //sort as number
],
});
Он должен возвращать разницу между двумя сравниваемыми значениями.

 sorter

Форматирование

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

Разнообразие встроенных форматеров включены:

  • открытый текст — отображение значения ячейки в виде текста. (опция по умолчанию)
  • textarea — показывает текст с неповрежденными символами возврата каретки
  • деньги — форматирует число в обозначение валюты (например, 1234567.8901 -> 1 234 567,89)
  • email — отображает данные как якорь с ссылкой mailto: на указанное значение
  • link — отображает данные как якорь со ссылкой на данное значение
  • галочка — зеленая галочка, если значение равно (true | ‘true’ | ‘True’ | 1) и пустая ячейка, если нет
  • tickCross — зеленая галочка, если значение равно (true | ‘true’ | ‘True’ | 1) и красный крестик, если нет
  • звезда — графический рейтинг звезды, основанный на целочисленных значениях
  • прогресс — индикатор выполнения, который заполняет ячейку слева направо (используя значения 0-100 в процентах от ширины)

Вы можете установить форматер столбца с помощью параметра var customSorter = function(a, b, aData, bData){
//a and b are the two values being compared
//aData and bData are the row objects for the values being compared (useful if you need to access additional fields in the row data for the sort)

return a - b; //return the difference between the two values
}

$("#example-table").tabulator({
columns:[
{title:"Progress", field:"progress", sortable:true, sorter:customSorter},
],
});

 formatter

Чтобы определить пользовательский форматер, передайте обратный вызов параметру $("#example-table").tabulator({
columns:[
{title:"Progress", field:"progress", formatter:"progress" },
],
});
Обратный вызов должен возвращать HTML, который будет отображаться в ячейке.

 formatter

фильтрация

Часто бывает, что вам нужно отображать только подмножество данных для ваших пользователей. Вы можете фильтровать данные, используя функцию var customFormatter = function(value, data, cell, row, options, formatterParams){
//value - value of the cell
//data - data for the row the cell is in
//cell - DOM element of the cell
//row - DOM element of the row
//options - options set for this tabulator
//formatterParams - parameters set for the column

return "<div></div>"; // must return the HTML or jQuery element for the contents of the cell;
}

$("#example-table").tabulator({
columns:[
{title:"Progress", field:"progress", formatter:customFormatter},
],
});

 setFilter

Функция принимает три аргумента: поле для фильтрации, функцию сравнения (=, <, <=,>,> =,! =, Like) и значение фильтра.

Чтобы выполнить более сложный фильтр, вы можете передать обратный вызов в функцию $("#example-table").tabulator("setFilter", "progress", ">", 10);
Обратный вызов должен возвращать логическое значение, причем значение setFilter

 true

Очистите существующие фильтры с var customFilter = (data){
//data - data for the row being filtered

return data.name == "bob" && data.progress < 50; //must return a boolean, true if it passes the filter.
}

$("#example-table").tabulator("setFilter", customFilter);
clearFilter

 $("#example-table").tabulator("clearFilter");

Редактирование

Одним из основных преимуществ использования Tabulator по сравнению со стандартной таблицей HTML является возможность редактирования данных в таблице.

Доступно несколько предварительно настроенных редакторов:

  • ввод — простой текст
  • textarea — многострочный текст, позволяет изменять размер строки по размеру, чтобы соответствовать тексту при вводе
  • число — числа с кнопками увеличения и уменьшения
  • галочка — флажок
  • звезда — рейтинг звезды (можно использовать клавиши со стрелками влево / вправо и ввести для выбора, а также мыши)
  • прогресс — индикатор выполнения (можно использовать клавиши со стрелками влево / вправо и ввести для выбора, а также мышь)

Столбцы могут быть установлены как редактируемые с помощью editable

 $("#example-table").tabulator({
  columns:[
    {title:"Progress", field:"progress", formatter:"progress", editable:true},
  ],
});

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

 $("#example-table").tabulator({
   columns:[
    {title:"Progress", field:"progress", formatter:"progress", editable:true, editor:"number"},
  ],
});

Чтобы определить пользовательский редактор, передайте обратный вызов параметру editor Он должен вернуть элемент редактора, который будет отображаться в ячейке. Возвращение false

 var customEditor = function(cell, value, data){
  //cell - JQuery object for current cell
  //value - current value for current cell
  //data - data for the current row

  //create and style editor
  var editor = $("<select><option value=''></option><option value='male'>male</option><option value='female'>female</option></select>");

  editor.css({
    "padding":"3px",
    "width":"100%",
    "box-sizing":"border-box",
  });

  //set value of editor to the current value of the cell
  editor.val(value);

  //when the value has been set, trigger the cell to update
  editor.on("change blur", function(e){
    cell.trigger("editval", editor.val());
  });

  //return the editor element
  return editor;
}

$("#example-table").tabulator({
  columns:[
    {title:"Gender", field:"gender", editable:true, editor:customEditor},
  ],
});

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

 var data = $("#example-table").tabulator("getData");

Полнофункциональный пример

Если мы объединим все уроки, которые мы выучили выше, мы сможем создать многофункциональную интерактивную таблицу.

Верхушка айсберга

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

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

  • Группировка строк
  • Подвижные строки и столбцы
  • пагинация
  • CSS стилизация и тематика
  • Прогрессивный рендеринг для больших наборов данных
  • Постоянный макет столбца (сохраняет пользовательские настройки в куки)
  • Обратные вызовы на каждом этапе рендеринга таблиц и любого типа взаимодействия с пользователем

Я надеюсь, что эта статья показала вам, как вывести ваши базовые таблицы HTML на новый уровень, добавив интерактивность и стиль вашим данным.

Счастливого табулирования!