UNPKG

11.8 kBJavaScriptView Raw
1
2var id = function (id){ return document.getElementById(id); };
3
4var tf = new TableFilter('demo', {
5 base_path: '../dist/tablefilter/',
6 col_2: 'multiple',
7 col_3: 'select',
8 col_4: 'none',
9 popup_filters: true
10});
11tf.init();
12
13var popupFilter = tf.feature('popupFilter');
14module('Sanity checks');
15test('Pop-up filter component', function() {
16 notEqual(popupFilter, null, 'PopupFilter instanciated');
17 deepEqual(popupFilter.fltElms instanceof Array,
18 true, 'Type of fltElms property');
19 deepEqual(
20 popupFilter.adjustToContainer,
21 true,
22 'Popup filter width adjusts to container'
23 );
24 deepEqual(tf.headersRow, 1, 'Headers row index');
25 // issue 99: getHeadersText for pick-list filter types
26 deepEqual(
27 tf.getHeadersText()[2],
28 'Road Distance (km)',
29 'Expected header text for multiple filter type'
30 );
31 deepEqual(
32 tf.getHeadersText()[3],
33 'By Air (hrs)',
34 'Expected header text for multiple filter type'
35 );
36 deepEqual(tf.dom().rows[tf.headersRow-1].style.display, 'none',
37 'Extra row hidden');
38});
39
40module('UI elements');
41test('Pop-up filter UI elements', function() {
42 var flt1 = id(tf.fltIds[3]);
43 var flt2 = id(tf.fltIds[2]);
44 var fltIcn1 = popupFilter.fltIcons[3];
45 var fltIcn2 = popupFilter.fltIcons[2];
46 var fltIcn3 = popupFilter.fltIcons[4];
47
48 notEqual(flt1, null, 'Filter element exists');
49 notEqual(flt2, null, 'Filter element exists');
50 deepEqual(flt2.hasAttribute('multiple'), true, 'Multiple select exists');
51 deepEqual(fltIcn1.nodeName, 'IMG', 'Filter icon exists');
52 deepEqual(fltIcn2.nodeName, 'IMG', 'Filter icon exists');
53 deepEqual(fltIcn3, undefined, 'Filter icon does not exist for column 4');
54});
55
56test('Pop-up filter state after filtering', function(){
57 var fltIcn0 = popupFilter.fltIcons[0];
58 tf.setFilterValue(0, 'syd');
59 tf.filter();
60
61 deepEqual(fltIcn0.src.indexOf('icn_filterActive') !== -1,
62 true, 'Icon state');
63});
64
65test('Pop-up filter state after clearing', function(){
66 var fltIcn0 = popupFilter.fltIcons[0];
67 var fltIcn1 = popupFilter.fltIcons[1];
68 var fltIcn2 = popupFilter.fltIcons[2];
69 var fltIcn3 = popupFilter.fltIcons[3];
70 tf.clearFilters();
71
72 deepEqual(fltIcn0.src.indexOf('icn_filterActive') === -1,
73 true, 'Icon state');
74 deepEqual(fltIcn1.src.indexOf('icn_filterActive') === -1,
75 true, 'Icon state');
76 deepEqual(fltIcn2.src.indexOf('icn_filterActive') === -1,
77 true, 'Icon state');
78 deepEqual(fltIcn3.src.indexOf('icn_filterActive') === -1,
79 true, 'Icon state');
80});
81
82test('Can open pop-up filter', function(){
83 // act
84 popupFilter.open(1);
85
86 // assert
87 deepEqual(popupFilter.fltElms[1].style.display, 'block',
88 'Popup filter is open');
89});
90
91test('Can close pop-up filter', function(){
92 // act
93 popupFilter.close(1);
94
95 // assert
96 deepEqual(popupFilter.fltElms[1].style.display, 'none',
97 'Popup filter is open');
98});
99
100test('Can toggle pop-up filter (initially closed)', function(){
101 // setup
102 popupFilter.close(2);
103
104 // act
105 popupFilter.toggle(2);
106
107 // assert
108 deepEqual(popupFilter.fltElms[2].style.display, 'block',
109 'Popup filter is toggled');
110});
111
112test('Can toggle pop-up filter (initially opened)', function(){
113 // setup
114 popupFilter.open(2);
115
116 // act
117 popupFilter.toggle(2);
118
119 // assert
120 deepEqual(popupFilter.fltElms[2].style.display, 'none',
121 'Popup filter is toggled');
122});
123
124test('Multiple selection pop-up filter remains open upon filtering', function(){
125 // setup
126 popupFilter.open(2);
127
128 // act
129 tf.setFilterValue(2, ['1412', '982']);
130 tf.filter();
131
132 // assert
133 deepEqual(
134 popupFilter.isOpen(2),
135 true,
136 'Multiple selection pop-up filter still open after filtering'
137 );
138});
139
140test('Pop-up filter closes upon filtering', function(){
141 // setup
142 popupFilter.open(1);
143
144 // act
145 tf.setFilterValue(1, 'Adelaide');
146 tf.filter();
147
148 // assert
149 deepEqual(popupFilter.isOpen(1), false,
150 'Pop-up filter closed after filtering'
151 );
152});
153
154test('Pop-up filter auto-closes when user clicks away', function() {
155 // setup
156 popupFilter.open(0);
157
158 // act
159 var evObj = document.createEvent('HTMLEvents');
160 evObj.initEvent('mouseup', true, true);
161 tf.dom().rows[4].cells[2].dispatchEvent(evObj);
162
163 // assert
164 deepEqual(popupFilter.isOpen(0), false,
165 'Pop-up filter closed after user clicks away'
166 );
167});
168
169test('Can close all popup filters', function() {
170 // setup
171 popupFilter.open(0);
172
173 // act
174 popupFilter.closeAll();
175
176 // assert
177 deepEqual(popupFilter.isOpen(0), false,
178 'Pop-up filter closed after closeAll'
179 );
180});
181
182test('Can destroy and reset', function(){
183 // setup
184 popupFilter.destroy();
185
186 // act
187 popupFilter.reset();
188
189 // assert
190 deepEqual(popupFilter.fltElms.length, 5, 'Filters are generated');
191 deepEqual(popupFilter.fltIcons.length, 4, 'Icons are generated');
192 deepEqual(popupFilter.fltSpans.length, 4, 'Icon containers are generated');
193});
194
195test('TableFilter removed', function() {
196 tf.destroy();
197 var fltIcn1 = popupFilter.fltIcons[3];
198 deepEqual(fltIcn1, undefined, 'Filter icon is removed');
199 deepEqual(id(tf.fltIds[3]), null, 'Filter is removed');
200});
201
202test('TableFilter re-initialised', function() {
203 tf.init();
204 var fltIcn1 = popupFilter.fltIcons[3];
205 deepEqual(fltIcn1.nodeName, 'IMG', 'Filter icon exists');
206 deepEqual(id(tf.fltIds[3]).nodeName, 'SELECT', 'Filter exists');
207});
208
209module('Properties');
210test('Can set icon HTML', function() {
211 // setup
212 tf.destroy();
213 tf = new TableFilter('demo', {
214 base_path: '../dist/tablefilter/',
215 col_2: 'multiple',
216 col_3: 'select',
217 col_4: 'none',
218 popup_filters: {
219 image_html: '<span>hello world</span>'
220 }
221 });
222 tf.init();
223
224 var feature = tf.feature('popupFilter');
225 feature.filtersCache = [];
226 feature.fltElms = [];
227
228 // act
229 tf.init();
230 var headersRow = tf.dom().rows[tf.getHeadersRowIndex()];
231
232 // assert
233 deepEqual(
234 headersRow.cells[1].innerHTML
235 .indexOf('<span>hello world</span>') !== -1,
236 true,
237 'Custom HTML element present'
238 );
239});
240
241module('Grid-layout');
242test('Re-instantiated with grid-layout', function() {
243 tf.destroy();
244 tf = null;
245 tf = new TableFilter('demo', {
246 base_path: '../dist/tablefilter/',
247 col_2: 'multiple',
248 col_3: 'select',
249 col_4: 'none',
250 popup_filters: true,
251 grid_layout: true
252 });
253 tf.init();
254
255 notEqual(popupFilter, null, 'PopupFilter instanciated');
256 deepEqual(popupFilter.fltElms instanceof Array,
257 true, 'Type of fltElms property');
258 deepEqual(tf.headersRow, 0, 'Headers row index');
259 // issue 99: getHeadersText for pick-list filter types
260 deepEqual(
261 tf.getHeadersText()[2],
262 'Road Distance (km)',
263 'Expected header text for multiple filter type'
264 );
265 deepEqual(
266 tf.getHeadersText()[3],
267 'By Air (hrs)',
268 'Expected header text for multiple filter type'
269 );
270});
271
272test('Pop-up filter UI elements with grid-layout', function() {
273 var popupFilter = tf.feature('popupFilter');
274 var flt1 = id(tf.fltIds[3]);
275 var flt2 = id(tf.fltIds[2]);
276 var fltIcn1 = popupFilter.fltIcons[3];
277 var fltIcn2 = popupFilter.fltIcons[2];
278 var fltIcn3 = popupFilter.fltIcons[4];
279
280 notEqual(flt1, null, 'Filter element exists');
281 notEqual(flt2, null, 'Filter element exists');
282 deepEqual(flt2.hasAttribute('multiple'), true, 'Multiple select exists');
283 deepEqual(fltIcn1.nodeName, 'IMG', 'Filter icon exists');
284 deepEqual(fltIcn2.nodeName, 'IMG', 'Filter icon exists');
285 deepEqual(fltIcn3, undefined, 'Filter icon does not exist for column 4');
286});
287
288test('Pop-up filter state after filtering', function(){
289 var popupFilter = tf.feature('popupFilter');
290 var fltIcn0 = popupFilter.fltIcons[0];
291 tf.setFilterValue(0, 'syd');
292 tf.filter();
293
294 deepEqual(fltIcn0.src.indexOf('icn_filterActive') !== -1,
295 true, 'Icon state');
296});
297
298test('Pop-up filter state after clearing', function(){
299 var popupFilter = tf.feature('popupFilter');
300 var fltIcn0 = popupFilter.fltIcons[0];
301 var fltIcn1 = popupFilter.fltIcons[1];
302 var fltIcn2 = popupFilter.fltIcons[2];
303 var fltIcn3 = popupFilter.fltIcons[3];
304 tf.clearFilters();
305
306 deepEqual(fltIcn0.src.indexOf('icn_filterActive') === -1,
307 true, 'Icon state');
308 deepEqual(fltIcn1.src.indexOf('icn_filterActive') === -1,
309 true, 'Icon state');
310 deepEqual(fltIcn2.src.indexOf('icn_filterActive') === -1,
311 true, 'Icon state');
312 deepEqual(fltIcn3.src.indexOf('icn_filterActive') === -1,
313 true, 'Icon state');
314});
315
316module('Feature interface');
317test('Properties', function() {
318 var popupFilter = tf.feature('popupFilter');
319
320 deepEqual(popupFilter.tf instanceof TableFilter,
321 true, 'TableFilter instance');
322 deepEqual(popupFilter.feature, 'popupFilters', 'Feature name');
323 deepEqual(popupFilter.enabled, true, 'Feature enabled');
324 deepEqual(popupFilter.initialized, true, 'Feature enabled');
325 deepEqual(typeof popupFilter.emitter, 'object',
326 'Feature has emitter instance');
327 deepEqual(typeof popupFilter.config, 'object', 'TF configuration object');
328 deepEqual(typeof popupFilter.init, 'function', 'Feature init method');
329 deepEqual(typeof popupFilter.destroy, 'function', 'Feature destroy method');
330 deepEqual(typeof popupFilter.reset, 'function', 'Feature reset method');
331 deepEqual(typeof popupFilter.enable, 'function', 'Feature enable method');
332 deepEqual(typeof popupFilter.disable, 'function', 'Feature enable method');
333 deepEqual(typeof popupFilter.isEnabled,
334 'function', 'Feature enable method');
335});
336
337module('Overrides');
338test('Configuration settings overrides', function() {
339 // setup
340 tf.destroy();
341 tf = new TableFilter('demo', {
342 base_path: '../dist/tablefilter/',
343 popup_filters: true,
344 filters_row_index: 1
345 });
346
347 // assert
348 deepEqual(tf.filtersRowIndex, 1, 'Filters row index config setting value');
349 deepEqual(
350 tf.externalFltIds,
351 [],
352 'External filters container ids config setting value'
353 );
354 deepEqual(tf.headersRow, 0, 'Headers row index config setting value');
355
356 test('Overrides after init', function() {
357 // act
358 tf.init();
359
360 // assert
361 deepEqual(tf.filtersRowIndex, 0, 'Filters row index override');
362 deepEqual(
363 tf.externalFltIds,
364 [
365 'popup_demo_0',
366 'popup_demo_1',
367 'popup_demo_2',
368 'popup_demo_3',
369 'popup_demo_4'
370 ],
371 'External filters container ids config setting value'
372 );
373 deepEqual(tf.headersRow, 1, 'Headers row index override');
374 });
375});
376
377module('Tear-down');
378test('TableFilter removed', function() {
379 tf.destroy();
380 var fltIcn1 = popupFilter.fltIcons[3];
381 deepEqual(fltIcn1, undefined, 'Filter icon is removed');
382 deepEqual(id(tf.fltIds[3]), null, 'Filter is removed');
383 deepEqual(tf.isInitialized(), false, 'Filters removed');
384});