«KISS (keep it short and simple — «делай короче и проще») — процесс и принцип проектирования, при котором простота системы декларируется в качестве основной цели и/или ценности.» © Wikipedia
Именно так в последнее время я все больше склоняюсь трактовать аббревиатуру KISS и писать программные компоненты для различного рода продуктов. Именно по этому принципу написана предлагаемая в данном обзоре библиотека. И именно поэтому она будет развиваться в заданном ключе в будущем.
Скажу сразу, я никогда не работал как JS-программист. Все 15 лет своей карьеры занимался в большей степени серверной стороной. Что касается клиентской стороны, чаще отвечал за проектирование интерфейсов, а верстку доверял профессионалам.
Так случилось, что в 2012 году я перешел на новую работу и стал работать по двум крупным проектам. По иронии судьбы приходилось писать код как для серверов, так и для клиентов. Особенностью было то, что в обоих проектах клиентская часть должна была представлять собой тонкий клиент для отображения большого объёма разнородных табличных, цифровых, аналитических данных. Соответственно было рассмотрено большое количество различных библиотек и фреймворков по данной тематике. В данной статье упомяну только несколько из них: extJS, jqGrid, dhtmlx (который применялся как набор отельных плагинов, и в итоге разросся в то, что можно сегодня видеть) ну и еще десяток разных гридов.
И вот по прошествии 3 лет четко стала ощущаться (не только мной и не только в js а вообще в софте) избыточность продуктов, которые когда-то были маленькими и легкими. Со временем наблюдается разрастание проектов и превращение эффективных средств в неповоротливые комбайны. Они могут все, но цена за это – трафик и задержки в работе клиентской стороны. Теряются гибкость и простота использования.
В результате было принято решение, возникшее как идея «а не замутить ли свой грид с блэк-джеком …», разработать простой инструмент, который бы быстро выполнял требуемые задачи.
Данная идея по началу воспринималась как некоторая афера, в результате которой получился код tmsTable , который теперь постоянно использую в ряде проектов.
Как вы можете заметить, заявленный функционал прост до безобразия – этого я и добивался. Инструмент должен быть простым. В моем случае получившаяся библиотека полностью реализует весь набор функционала, который требуется в подавляющем большинстве случаев.
Кто-то может сказать, что у таблицы нет фильтров. Полностью согласен – их нет в привычном понимании. И не будет. Причина проста: написание фильтров – объемная задача (если хочется их сделать понятными и удобными), которая сильно усложнит код библиотеки. При этом, как правило, родные фильтры неспособны удовлетворить всех и вся. В результате появляются костыли и не сильно понятные интерфейсы, у которых часть фильтров в одном месте, а часть в другом. Вместо родных фильтров у вас в руках есть атрибут postVars, используя который для любых задач можно сделать набор инструментов для ограничения выборок данных. В моем понимании это гораздо удобнее, чем пытаться втиснуть свою логику в рамки некоторой сторонней библиотеки.
Как уже было сказано, с сервера тянутся данные в формате JSON. Отображать все или только часть данных вы решаете сами. В любой момент всегда можно получить доступ к объекту строки с полным набором данных.
Для создания грида (в чистом виде без стилей и красоты) в коде странице требуется написать:
Если вы используете bootstrap, то скорее всего захотите использовать его стили, тогда вам стоит написать
Далее для создания таблицы на странице сайта нужно определить контейнер, который будет содержать табличку:
Ну и собственно описать таблицу:
Все, перед вами представлены данные в удобном для восприятия виде.
Вы можете интегрировать данную табличку в сайт, cms, billing… Есть весь основной функционал. Остается только описывать фильтры для данных и поведение при click и dblclick.
Исходный код доступен на github.com/Tony-M/tmsTable
Там же доступны примеры использования.
Буду рад, если кому-либо библиотека окажется полезной.
Введение
Именно так в последнее время я все больше склоняюсь трактовать аббревиатуру 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)
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 );
Rastishka
А чем datatables то не угодил?
aamorozov Автор
Если честно, то в момент, когда все начиналось, у datatables (https://www.datatables.net) не хватало требуемого функционала и плагин был отвергнут. В последствие как-то с ним не сложилось и он был упущен из виду. Сейчас, после вашего вопроса потыкал его палочкой — достаточно интересная вещь. Проанализирую его более подробно и возможно что-то из плюсов впитаю к себе. Спасибо за наводку.