1 |
|
2 | var id = function (id){ return document.getElementById(id); };
|
3 |
|
4 | var 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 | });
|
11 | tf.init();
|
12 |
|
13 | var popupFilter = tf.feature('popupFilter');
|
14 | module('Sanity checks');
|
15 | test('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 |
|
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 |
|
40 | module('UI elements');
|
41 | test('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 |
|
56 | test('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 |
|
65 | test('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 |
|
82 | test('Can open pop-up filter', function(){
|
83 |
|
84 | popupFilter.open(1);
|
85 |
|
86 |
|
87 | deepEqual(popupFilter.fltElms[1].style.display, 'block',
|
88 | 'Popup filter is open');
|
89 | });
|
90 |
|
91 | test('Can close pop-up filter', function(){
|
92 |
|
93 | popupFilter.close(1);
|
94 |
|
95 |
|
96 | deepEqual(popupFilter.fltElms[1].style.display, 'none',
|
97 | 'Popup filter is open');
|
98 | });
|
99 |
|
100 | test('Can toggle pop-up filter (initially closed)', function(){
|
101 |
|
102 | popupFilter.close(2);
|
103 |
|
104 |
|
105 | popupFilter.toggle(2);
|
106 |
|
107 |
|
108 | deepEqual(popupFilter.fltElms[2].style.display, 'block',
|
109 | 'Popup filter is toggled');
|
110 | });
|
111 |
|
112 | test('Can toggle pop-up filter (initially opened)', function(){
|
113 |
|
114 | popupFilter.open(2);
|
115 |
|
116 |
|
117 | popupFilter.toggle(2);
|
118 |
|
119 |
|
120 | deepEqual(popupFilter.fltElms[2].style.display, 'none',
|
121 | 'Popup filter is toggled');
|
122 | });
|
123 |
|
124 | test('Multiple selection pop-up filter remains open upon filtering', function(){
|
125 |
|
126 | popupFilter.open(2);
|
127 |
|
128 |
|
129 | tf.setFilterValue(2, ['1412', '982']);
|
130 | tf.filter();
|
131 |
|
132 |
|
133 | deepEqual(
|
134 | popupFilter.isOpen(2),
|
135 | true,
|
136 | 'Multiple selection pop-up filter still open after filtering'
|
137 | );
|
138 | });
|
139 |
|
140 | test('Pop-up filter closes upon filtering', function(){
|
141 |
|
142 | popupFilter.open(1);
|
143 |
|
144 |
|
145 | tf.setFilterValue(1, 'Adelaide');
|
146 | tf.filter();
|
147 |
|
148 |
|
149 | deepEqual(popupFilter.isOpen(1), false,
|
150 | 'Pop-up filter closed after filtering'
|
151 | );
|
152 | });
|
153 |
|
154 | test('Pop-up filter auto-closes when user clicks away', function() {
|
155 |
|
156 | popupFilter.open(0);
|
157 |
|
158 |
|
159 | var evObj = document.createEvent('HTMLEvents');
|
160 | evObj.initEvent('mouseup', true, true);
|
161 | tf.dom().rows[4].cells[2].dispatchEvent(evObj);
|
162 |
|
163 |
|
164 | deepEqual(popupFilter.isOpen(0), false,
|
165 | 'Pop-up filter closed after user clicks away'
|
166 | );
|
167 | });
|
168 |
|
169 | test('Can close all popup filters', function() {
|
170 |
|
171 | popupFilter.open(0);
|
172 |
|
173 |
|
174 | popupFilter.closeAll();
|
175 |
|
176 |
|
177 | deepEqual(popupFilter.isOpen(0), false,
|
178 | 'Pop-up filter closed after closeAll'
|
179 | );
|
180 | });
|
181 |
|
182 | test('Can destroy and reset', function(){
|
183 |
|
184 | popupFilter.destroy();
|
185 |
|
186 |
|
187 | popupFilter.reset();
|
188 |
|
189 |
|
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 |
|
195 | test('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 |
|
202 | test('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 |
|
209 | module('Properties');
|
210 | test('Can set icon HTML', function() {
|
211 |
|
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 |
|
229 | tf.init();
|
230 | var headersRow = tf.dom().rows[tf.getHeadersRowIndex()];
|
231 |
|
232 |
|
233 | deepEqual(
|
234 | headersRow.cells[1].innerHTML
|
235 | .indexOf('<span>hello world</span>') !== -1,
|
236 | true,
|
237 | 'Custom HTML element present'
|
238 | );
|
239 | });
|
240 |
|
241 | module('Grid-layout');
|
242 | test('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 |
|
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 |
|
272 | test('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 |
|
288 | test('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 |
|
298 | test('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 |
|
316 | module('Feature interface');
|
317 | test('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 |
|
337 | module('Overrides');
|
338 | test('Configuration settings overrides', function() {
|
339 |
|
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 |
|
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 |
|
358 | tf.init();
|
359 |
|
360 |
|
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 |
|
377 | module('Tear-down');
|
378 | test('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 | });
|