tmsTable — как я писал плагин для отображения таблиц, руководствуясь принципом KISS

от автора

«KISS (keep it short and simple — «делай короче и проще») — процесс и принцип проектирования, при котором простота системы декларируется в качестве основной цели и/или ценности.» © Wikipedia

Введение

Именно так в последнее время я все больше склоняюсь трактовать аббревиатуру KISS и писать программные компоненты для различного рода продуктов. Именно по этому принципу написана предлагаемая в данном обзоре библиотека. И именно поэтому она будет развиваться в заданном ключе в будущем.

Скажу сразу, я никогда не работал как JS-программист. Все 15 лет своей карьеры занимался в большей степени серверной стороной. Что касается клиентской стороны, чаще отвечал за проектирование интерфейсов, а верстку доверял профессионалам.

Так случилось, что в 2012 году я перешел на новую работу и стал работать по двум крупным проектам. По иронии судьбы приходилось писать код как для серверов, так и для клиентов. Особенностью было то, что в обоих проектах клиентская часть должна была представлять собой тонкий клиент для отображения большого объёма разнородных табличных, цифровых, аналитических данных. Соответственно было рассмотрено большое количество различных библиотек и фреймворков по данной тематике. В данной статье упомяну только несколько из них: extJS, jqGrid, dhtmlx (который применялся как набор отельных плагинов, и в итоге разросся в то, что можно сегодня видеть) ну и еще десяток разных гридов.

И вот по прошествии 3 лет четко стала ощущаться (не только мной и не только в js а вообще в софте) избыточность продуктов, которые когда-то были маленькими и легкими. Со временем наблюдается разрастание проектов и превращение эффективных средств в неповоротливые комбайны. Они могут все, но цена за это – трафик и задержки в работе клиентской стороны. Теряются гибкость и простота использования.

В результате было принято решение, возникшее как идея «а не замутить ли свой грид с блэк-джеком …», разработать простой инструмент, который бы быстро выполнял требуемые задачи.

Задачи

  • Сделать инструмент для отображения табличных данных

Требования:

  • Простота использования
  • Быстродействие
  • Небольшой объем кода
  • Нужен функционал, которым пользуются постоянно. Незачем делать продукт 90% возможностей которого никто в проекте не использует.

Данная идея по началу воспринималась как некоторая афера, в результате которой получился код tmsTable , который теперь постоянно использую в ряде проектов.

Функциональные возможности

  • Асинхронная загрузка данных с сервера в формате json
  • Отображение данных в виде таблицы
  • Возможность отображения части пришедших данных
  • Возможность пагинации и настройки количества строк на страницу
  • Возможность дополнять запросы к серверу различными данными
  • Возможность определять декораторы для ячеек и строк таблицы с целью обеспечения гибкости представления данных и реализации
  • Возможность сортировок в таблице
  • Возможность сокрытия шапки и подвала таблицы
  • Возможность селектов и мультиселектов строк с применением click, CTRL и SHIFT
  • Возможность обработки click и dblclick по строкам таблицы
  • Возможность кастомизации отображения таблицы за счет применения своих стилей.

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

Кто-то может сказать, что у таблицы нет фильтров. Полностью согласен – их нет в привычном понимании. И не будет. Причина проста: написание фильтров – объемная задача (если хочется их сделать понятными и удобными), которая сильно усложнит код библиотеки. При этом, как правило, родные фильтры неспособны удовлетворить всех и вся. В результате появляются костыли и не сильно понятные интерфейсы, у которых часть фильтров в одном месте, а часть в другом. Вместо родных фильтров у вас в руках есть атрибут postVars, используя который для любых задач можно сделать набор инструментов для ограничения выборок данных. В моем понимании это гораздо удобнее, чем пытаться втиснуть свою логику в рамки некоторой сторонней библиотеки.

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

Немного о коде

Для создания грида (в чистом виде без стилей и красоты) в коде странице требуется написать:

<link rel="stylesheet" href="css/tmsTable.css"> <script src="js/jquery-1.10.2.min.js" type="application/x-javascript"></script> <script src="js/tmsTable.js" type="application/x-javascript"></script> 

Если вы используете bootstrap, то скорее всего захотите использовать его стили, тогда вам стоит написать

<link rel="stylesheet" href="bootstrap/dist/css/bootstrap.min.css"> <link rel="stylesheet" href="bootstrap/dist/css/bootstrap-theme.min.css"> <link rel="stylesheet" href="css/tmsTable.css">  <script src="js/jquery-1.10.2.min.js" type="application/x-javascript"></script> <script src="bootstrap/dist/js/bootstrap.min.js"></script> <script src="js/tmsTable.js" type="application/x-javascript"></script> 

Далее для создания таблицы на странице сайта нужно определить контейнер, который будет содержать табличку:

<div id="json_ttt"></div> 

Ну и собственно описать таблицу:

<script> json_params = {         id: 'json_ttt' // контейнер таблицы         , class: 'table table-bordered table-striped table-hover' // дополнительные css классы для красоты         , col_names: ['id', 'title', 'date'] // наименование заголовков столбцов         , dataType: 'jsonp'  // тип данных         , url: 'data.json' //адрес источника данных на сервере         , order_direction: 'asc' //тип упорядочивания         , order_by: 'title' // по какму столбцу упорядочивать данные         , cols: [             {index: 'id', name: 'id', width: 100}             , {index: 'title', name: 'title'}             , {index: 'date', name: 'date', width: 100}         ]         , selectable: true // разрешаем выбирать строки таблицы         , rowNum: 20 // количество строк на страницу по умолчанию         , rowNums: [10, 20, 50]  // возможные значения rowNum     };  var json_tbl = new tmsTable(json_params) // инициализируем объект таблицы json_tbl.render(); // отрисовываем таблицу на странице </script> 

Все, перед вами представлены данные в удобном для восприятия виде.

Вы можете интегрировать данную табличку в сайт, cms, billing… Есть весь основной функционал. Остается только описывать фильтры для данных и поведение при click и dblclick.

Исходный код доступен на github.com/Tony-M/tmsTable
Там же доступны примеры использования.

Буду рад, если кому-либо библиотека окажется полезной.

ссылка на оригинал статьи http://habrahabr.ru/post/259795/


Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *