«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
Там же доступны примеры использования.

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

Комментарии (3)


  1. Rastishka
    08.06.2015 16:29
    +1

    А чем datatables то не угодил?


    1. aamorozov Автор
      08.06.2015 18:20

      Если честно, то в момент, когда все начиналось, у datatables (https://www.datatables.net) не хватало требуемого функционала и плагин был отвергнут. В последствие как-то с ним не сложилось и он был упущен из виду. Сейчас, после вашего вопроса потыкал его палочкой — достаточно интересная вещь. Проанализирую его более подробно и возможно что-то из плюсов впитаю к себе. Спасибо за наводку.


  1. xiWera
    10.06.2015 02:40

    Это точно simple? А то мне кажется, что для прсотого описания таблицы хватит что-нибудь вроде:

    { 'id': { 'width': 100, 'title': 'Art' }, 'title': { 'order': 'asc' }, 'date': { 'width': 100 } }

    всё.
    Классы можно выставить у возвращаемого элемента родным addClass jquery. А загрузка и рендер должны быть отделены. Тогда это действительно снаружи KISS и можно использовать как угодно:

    var tms = new blablabla( структура выше );
    var view1 = tms.renderer( { 'perpage': 20, 'selectable': true, 'curpage': 0 } );
    $('#head').append( view1 ):
    var view2 = tms.renderer( { 'perpage': 5, 'selectable': false, 'curpage': 3 } );
    $( '#tail' ).append( view2 );
    $.getJSON().then( tms );