UNPKG

3.52 kBJavaScriptView Raw
1
2import { Ajax } from './bunny.ajax';
3import { Template } from './bunny.template';
4import { Paginator } from './bunny.paginator';
5import { Container } from './bunny.container';
6
7Container.bind('bunny.ajax', Ajax);
8Container.bind('bunny.template', Template);
9Container.bind('bunny.paginator', Paginator);
10
11export var DataTable = {
12
13 _tables: [],
14 _paginationLimit: 7,
15
16 define: function(table_id, row_tpl_id, row_handlers = {}, row_events = {}) {
17
18 /*
19 If table has no pages, row template should not be rendered
20 And in this case return 0 and do nothing
21 */
22 if (document.getElementById(row_tpl_id) === null) {
23 return 0;
24 }
25
26 var e = document.getElementById(table_id);
27
28 if (e === null) {
29 console.error('DataTable with id="'+table_id+'" doesn\'t exists');
30 return false;
31 } else if (e.tagName !== 'TABLE') {
32 console.error('DataTable with id="'+table_id+'" is not an HTML table');
33 return false;
34 }
35
36 var pagination_id = table_id + '_pagination';
37
38 var p = document.getElementById(pagination_id);
39
40 if (p === null) {
41 console.error('Pagination with id="' + pagination_id + '" doesn\'t exists');
42 return false;
43 }
44
45 var stats_id = table_id + '_stats';
46
47 var s = document.getElementById(stats_id); // can be null
48
49 Container.get('bunny.template').define(row_tpl_id, row_handlers, row_events);
50
51 this._tables[table_id] = {
52 table: e,
53 pagination: p,
54 stats: s,
55 row_tpl_id: row_tpl_id,
56 handlers: []
57 };
58
59 this.addBtnListeners(table_id);
60
61 return true;
62 },
63
64 addBtnListeners: function(table_id) {
65 var self = this;
66 var pagination = this._tables[table_id].pagination;
67 pagination.querySelectorAll('.page-link').forEach(function(btn) {
68 btn.addEventListener('click', function(e) {
69 e.preventDefault();
70 var url = btn.getAttribute('href');
71 self.changePage(table_id, url);
72 })
73 });
74 },
75
76 changePage: function(table_id, url) {
77
78 var row_tpl_id = this._tables[table_id].row_tpl_id;
79 var table = this._tables[table_id].table;
80 var self = this;
81
82 Container.get('bunny.ajax').get(url, function($data) {
83 var data = JSON.parse($data);
84
85 // delete current rows
86 var row_count = table.rows.length;
87 for (var i = row_count - 1; i > 0; i--) {
88 table.deleteRow(i);
89 }
90
91 // insert new rows
92 Container.get('bunny.template').insertAll(row_tpl_id, data.data, table);
93
94 // update footer stats
95
96 // update pagination
97 self.updatePagination(table_id, data);
98
99 // call redraw
100 self._tables[table_id].handlers.forEach(function(handler) {
101 handler(table);
102 });
103
104 });
105
106 },
107
108 updatePagination: function(table_id, data) {
109 var p = Container.get('bunny.paginator').create(table_id, data, this._paginationLimit);
110 p.redraw();
111 p.updateStats();
112 this.addBtnListeners(table_id);
113 },
114
115 onRedraw: function(table_id, callback) {
116 this._tables[table_id].handlers.push(callback);
117 }
118
119};