1
0
Fork 0
mirror of https://github.com/koalyptus/TableFilter.git synced 2024-06-01 21:42:20 +02:00

Merge branch 'master' into 358-increase-coverage

This commit is contained in:
Max Guglielmi 2017-03-01 21:12:31 +11:00
commit d9c0fd6d0b
40 changed files with 1761 additions and 515 deletions

View file

@ -1,7 +1,6 @@
module.exports = function (grunt) {
var webpack = require('webpack');
var webpackConfig = require('./webpack.config.js');
var webpackDevConfig = require('./webpack.dev.config.js');
var webpackTestConfig = require('./webpack.test.config.js');
var fs = require('fs');
var path = require('path');
@ -20,6 +19,8 @@ module.exports = function (grunt) {
target: [
'Gruntfile.js',
'webpack.config.js',
'webpack.dev.config.js',
'webpack.test.config.js',
'src/**/*.js',
'test/*.js'
]
@ -127,22 +128,19 @@ module.exports = function (grunt) {
'webpack-dev-server': {
options: {
webpack: webpack.dev,
webpack: webpackDevConfig,
publicPath: '/dist/'
},
start: {
keepAlive: true,
webpack: {
devtool: 'eval',
debug: true
devtool: 'eval'
}
}
},
webpack: {
options: webpackConfig,
build: webpackConfig.build,
dev: webpackConfig.dev,
build: webpackConfig,
dev: webpackDevConfig,
test: webpackTestConfig
},

4
dist/starter.html vendored
View file

@ -1,10 +1,10 @@
<!DOCTYPE html>
<html lang="en">
<head>
<title>tablefilter v0.4.38 - Starter</title>
<title>tablefilter v0.5.0 - Starter</title>
</head>
<body>
<h1>tablefilter v0.4.38</h1>
<h1>tablefilter v0.5.0</h1>

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.4.38 by Max Guglielmi
* build date: 2017-01-26T09:00:02.914Z
* tablefilter v0.5.0 by Max Guglielmi
* build date: 2017-02-27T02:33:28.858Z
* MIT License
*/
span.colVisSpan{text-align:left;}span.colVisSpan a.colVis{display:inline-block;padding:7px 5px 0;font-size:inherit;font-weight:inherit;vertical-align:top}div.colVisCont{position:relative;background:#fff;-webkit-box-shadow:3px 3px 2px #888;-moz-box-shadow:3px 3px 2px #888;box-shadow:3px 3px 2px #888;position:absolute;display:none;border:1px solid #ccc;height:auto;width:250px;background-color:#fff;margin:35px 0 0 -100px;z-index:10000;padding:10px 10px 10px 10px;text-align:left;font-size:12px;}div.colVisCont:after,div.colVisCont:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}div.colVisCont:after{border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:10px;margin-left:-10px}div.colVisCont:before{border-color:rgba(255,255,255,0);border-bottom-color:#ccc;border-width:12px;margin-left:-12px}div.colVisCont p{margin:6px auto 6px auto}div.colVisCont a.colVis{display:initial;font-weight:inherit}ul.cols_checklist{padding:0;margin:0;list-style:none;}ul.cols_checklist label{display:block}ul.cols_checklist input{vertical-align:middle;margin:2px 5px 2px 1px}li.cols_checklist_item{padding:4px;margin:0;}li.cols_checklist_item:hover{background-color:#335ea8;color:#fff}.cols_checklist_slc_item{background-color:#335ea8;color:#fff}

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.4.38 by Max Guglielmi
* build date: 2017-01-26T09:00:02.914Z
* tablefilter v0.5.0 by Max Guglielmi
* build date: 2017-02-27T02:33:28.858Z
* MIT License
*/
span.expClpFlt a.btnExpClpFlt{width:35px;height:35px;display:inline-block;}span.expClpFlt a.btnExpClpFlt:hover{background-color:#f4f4f4}span.expClpFlt img{padding:8px 11px 11px 11px}

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.4.38 by Max Guglielmi
* build date: 2017-01-26T09:00:02.914Z
* tablefilter v0.5.0 by Max Guglielmi
* build date: 2017-02-27T02:33:28.858Z
* MIT License
*/
.activeHeader{background-color:#66afe9 !important;color:#fff !important}

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.4.38 by Max Guglielmi
* build date: 2017-01-26T09:00:02.914Z
* tablefilter v0.5.0 by Max Guglielmi
* build date: 2017-02-27T02:33:28.858Z
* MIT License
*/
table.TF{border-left:1px solid #ccc;border-top:none;border-right:none;border-bottom:none;}table.TF th{background:#ebecee url("images/bg_th.jpg") left top repeat-x;border-bottom:1px solid #d0d0d0;border-right:1px solid #d0d0d0;border-left:1px solid #fff;border-top:1px solid #fff;color:#333}table.TF td{border-bottom:1px dotted #999;padding:5px}.fltrow{background-color:#ebecee !important;}.fltrow th,.fltrow td{border-bottom:1px dotted #666 !important;padding:1px 3px 1px 3px !important}.flt,select.flt,select.flt_multi,.flt_s,.single_flt,.div_checklist{border:1px solid #999 !important}input.flt{width:99% !important}.inf{height:$min-height;background:#d7d7d7 url("images/bg_infDiv.jpg") 0 0 repeat-x !important}input.reset{background:transparent url("images/btn_eraser.gif") center center no-repeat !important}.helpBtn:hover{background-color:transparent}.nextPage{background:transparent url("images/btn_next_page.gif") center center no-repeat !important;}.nextPage:hover{background:transparent url("images/btn_over_next_page.gif") center center no-repeat !important}.previousPage{background:transparent url("images/btn_previous_page.gif") center center no-repeat !important;}.previousPage:hover{background:transparent url("images/btn_over_previous_page.gif") center center no-repeat !important}.firstPage{background:transparent url("images/btn_first_page.gif") center center no-repeat !important;}.firstPage:hover{background:transparent url("images/btn_over_first_page.gif") center center no-repeat !important}.lastPage{background:transparent url("images/btn_last_page.gif") center center no-repeat !important;}.lastPage:hover{background:transparent url("images/btn_over_last_page.gif") center center no-repeat !important}div.grd_Cont{background-color:#ebecee !important;border:1px solid #ccc !important;padding:0 !important;}div.grd_Cont .even{background-color:#fff}div.grd_Cont .odd{background-color:#d5d5d5}div.grd_headTblCont{background-color:#ebecee !important;border-bottom:none !important;}div.grd_headTblCont table{border-right:none !important}div.grd_tblCont table th,div.grd_headTblCont table th,div.grd_headTblCont table td{background:#ebecee url("images/bg_th.jpg") left top repeat-x !important;border-bottom:1px solid #d0d0d0 !important;border-right:1px solid #d0d0d0 !important;border-left:1px solid #fff !important;border-top:1px solid #fff !important}div.grd_tblCont table td{border-bottom:1px solid #999 !important}.grd_inf{background:#d7d7d7 url("images/bg_infDiv.jpg") 0 0 repeat-x !important;border-top:1px solid #d0d0d0 !important}.loader{border:1px solid #999}.defaultLoader{width:32px;height:32px;background:transparent url("images/img_loading.gif") 0 0 no-repeat !important}.even{background-color:#fff}.odd{background-color:#d5d5d5}span.expClpFlt a.btnExpClpFlt:hover{background-color:transparent !important}.activeHeader{background:#999 !important}

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.4.38 by Max Guglielmi
* build date: 2017-01-26T09:00:02.914Z
* tablefilter v0.5.0 by Max Guglielmi
* build date: 2017-02-27T02:33:28.858Z
* MIT License
*/
table.TF{border-left:1px dotted #81963b;border-top:none;border-right:0;border-bottom:none;}table.TF th{background:#39424b url("images/bg_headers.jpg") left top repeat-x;border-bottom:0;border-right:1px dotted #d0d0d0;border-left:0;border-top:0;color:#fff}table.TF td{border-bottom:1px dotted #81963b;border-right:1px dotted #81963b;padding:5px}.fltrow{background-color:#81963b !important;}.fltrow th,.fltrow td{border-bottom:1px dotted #39424b !important;border-right:1px dotted #fff !important;border-left:0 !important;border-top:0 !important;padding:1px 3px 1px 3px !important}.flt,select.flt,select.flt_multi,.flt_s,.single_flt,.div_checklist{border:1px solid #687830 !important}input.flt{width:99% !important}.inf{background:#d8d8d8;height:$min-height}input.reset{width:53px;background:transparent url("images/btn_filter.png") center center no-repeat !important}.helpBtn:hover{background-color:transparent}.nextPage{background:transparent url("images/btn_next_page.gif") center center no-repeat !important}.previousPage{background:transparent url("images/btn_previous_page.gif") center center no-repeat !important}.firstPage{background:transparent url("images/btn_first_page.gif") center center no-repeat !important}.lastPage{background:transparent url("images/btn_last_page.gif") center center no-repeat !important}div.grd_Cont{background:#81963b url("images/bg_headers.jpg") left top repeat-x !important;border:1px solid #ccc !important;padding:0 1px 1px 1px !important;}div.grd_Cont .even{background-color:#bccd83}div.grd_Cont .odd{background-color:#fff}div.grd_headTblCont{background-color:#ebecee !important;border-bottom:none !important}div.grd_tblCont table{border-right:none !important;}div.grd_tblCont table td{border-bottom:1px dotted #81963b;border-right:1px dotted #81963b}div.grd_tblCont table th,div.grd_headTblCont table th{background:transparent url("images/bg_headers.jpg") 0 0 repeat-x !important;border-bottom:0 !important;border-right:1px dotted #d0d0d0 !important;border-left:0 !important;border-top:0 !important;padding:0 4px 0 4px !important;color:#fff !important;height:35px !important}div.grd_headTblCont table td{border-bottom:1px dotted #39424b !important;border-right:1px dotted #fff !important;border-left:0 !important;border-top:0 !important;background-color:#81963b !important;padding:1px 3px 1px 3px !important}.grd_inf{background-color:#d8d8d8;border-top:1px solid #d0d0d0 !important}.loader{border:0 !important;background:#81963b !important}.defaultLoader{width:32px;height:32px;background:transparent url("images/img_loading.gif") 0 0 no-repeat !important}.even{background-color:#bccd83}.odd{background-color:#fff}span.expClpFlt a.btnExpClpFlt:hover{background-color:transparent !important}.activeHeader{background:#81963b !important}

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.4.38 by Max Guglielmi
* build date: 2017-01-26T09:00:02.914Z
* tablefilter v0.5.0 by Max Guglielmi
* build date: 2017-02-27T02:33:28.858Z
* MIT License
*/
table.TF{padding:0;color:#000;border-right:1px solid #a4bed4;border-top:1px solid #a4bed4;border-left:1px solid #a4bed4;border-bottom:0;}table.TF th{margin:0;color:inherit;background:#d1e5fe url("images/bg_skyblue.gif") 0 0 repeat-x;border-color:#fdfdfd #a4bed4 #a4bed4 #fdfdfd;border-width:1px;border-style:solid}table.TF td{margin:0;padding:5px;color:inherit;border-bottom:1px solid #a4bed4;border-left:0;border-top:0;border-right:0}.fltrow{background-color:#d1e5fe !important;}.fltrow th,.fltrow td{padding:1px 3px 1px 3px !important}.flt,select.flt,select.flt_multi,.flt_s,.single_flt,.div_checklist{border:1px solid #a4bed4 !important}input.flt{width:99% !important}.inf{background-color:#e3efff !important;border:1px solid #a4bed4;height:$min-height;color:#004a6f}div.tot,div.status{border-right:0 !important}.helpBtn:hover{background-color:transparent}input.reset{background:transparent url("images/icn_clear_filters.png") center center no-repeat !important}.nextPage{background:transparent url("images/btn_next_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.nextPage:hover{background:#ffe4ab url("images/btn_next_page.gif") center center no-repeat !important;border:1px solid #ffb552 !important}.previousPage{background:transparent url("images/btn_prev_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.previousPage:hover{background:#ffe4ab url("images/btn_prev_page.gif") center center no-repeat !important;border:1px solid #ffb552 !important}.firstPage{background:transparent url("images/btn_first_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.firstPage:hover{background:#ffe4ab url("images/btn_first_page.gif") center center no-repeat !important;border:1px solid #ffb552 !important}.lastPage{background:transparent url("images/btn_last_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.lastPage:hover{background:#ffe4ab url("images/btn_last_page.gif") center center no-repeat !important;border:1px solid #ffb552 !important}.activeHeader{background:#ffe4ab !important;border:1px solid #ffb552 !important;color:inherit !important}div.grd_Cont{background-color:#d9eaed !important;border:1px solid #9cc !important;padding:0 !important;}div.grd_Cont .even{background-color:#fff}div.grd_Cont .odd{background-color:#e3efff}div.grd_headTblCont{background-color:#d9eaed !important;border-bottom:none !important}div.grd_tblCont table{border-right:none !important}div.grd_tblCont table th,div.grd_headTblCont table th,div.grd_headTblCont table td{background:#d9eaed url("images/bg_skyblue.gif") left top repeat-x;border-bottom:1px solid #a4bed4;border-right:1px solid #a4bed4 !important;border-left:1px solid #fff !important;border-top:1px solid #fff !important}div.grd_tblCont table td{border-bottom:1px solid #a4bed4 !important;border-right:0 !important;border-left:0 !important;border-top:0 !important}.grd_inf{background-color:#cce2fe;color:#004a6f;border-top:1px solid #9cc !important;}.grd_inf a{text-decoration:none;font-weight:bold}.loader{background-color:#2d8eef;border:1px solid #cce2fe;border-radius:5px}.even{background-color:#fff}.odd{background-color:#e3efff}span.expClpFlt a.btnExpClpFlt:hover{background-color:transparent !important}.ezActiveRow{background-color:#ffdc61 !important;color:inherit}.ezSelectedRow{background-color:#ffe4ab !important;color:inherit}.ezActiveCell{background-color:#fff !important;color:#000 !important;font-weight:bold}.ezETSelectedCell{background-color:#fff !important;font-weight:bold;color:#000 !important}

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.4.38 by Max Guglielmi
* build date: 2017-01-26T09:00:02.914Z
* tablefilter v0.5.0 by Max Guglielmi
* build date: 2017-02-27T02:33:28.858Z
* MIT License
*/
table.TF{padding:0;color:inherit;border-right:1px solid transparent;border-top:1px solid transparent;border-left:1px solid transparent;border-bottom:0;}table.TF th{margin:0;color:inherit;background-color:transparent;border-color:transparent;border-width:1px;border-style:solid;}table.TF th:last-child{border-right:1px solid transparent}table.TF td{margin:0;padding:5px;color:inherit;border-bottom:1px solid transparent;border-left:0;border-top:0;border-right:0}.fltrow{background-color:transparent;}.fltrow th,.fltrow td{padding:1px 3px 1px 3px;border-bottom:1px solid transparent !important;}.fltrow th:last-child,.fltrow td:last-child{border-right:1px solid transparent}.flt,select.flt,select.flt_multi,.flt_s,.single_flt,.div_checklist{border:1px solid #a4bed4}input.flt{width:99% !important}.inf{background-color:transparent;border:1px solid transparent;height:$min-height;color:inherit}div.tot,div.status{border-right:0 !important}.helpBtn:hover{background-color:transparent}input.reset{background:transparent url("images/icn_clear_filters.png") center center no-repeat !important}.nextPage{background:transparent url("images/btn_next_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.nextPage:hover{background:#f7f7f7 url("images/btn_next_page.gif") center center no-repeat !important;border:1px solid #f7f7f7 !important}.previousPage{background:transparent url("images/btn_prev_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.previousPage:hover{background:#f7f7f7 url("images/btn_prev_page.gif") center center no-repeat !important;border:1px solid #f7f7f7 !important}.firstPage{background:transparent url("images/btn_first_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.firstPage:hover{background:#f7f7f7 url("images/btn_first_page.gif") center center no-repeat !important;border:1px solid #f7f7f7 !important}.lastPage{background:transparent url("images/btn_last_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.lastPage:hover{background:#f7f7f7 url("images/btn_last_page.gif") center center no-repeat !important;border:1px solid #f7f7f7 !important}.activeHeader{background:#f7f7f7 !important;border:1px solid transparent;color:inherit !important}div.grd_Cont{-webkit-box-shadow:0 0 0 0 rgba(50,50,50,0.75);-moz-box-shadow:0 0 0 0 rgba(50,50,50,0.75);box-shadow:0 0 0 0 rgba(50,50,50,0.75);background-color:transparent;border:1px solid transparent;padding:0 !important;}div.grd_Cont .even{background-color:transparent}div.grd_Cont .odd{background-color:#f7f7f7}div.grd_headTblCont{background-color:transparent;border-bottom:none !important}div.grd_tblCont table{border-right:none !important}div.grd_tblCont table th,div.grd_headTblCont table th,div.grd_headTblCont table td{background:transparent;border-bottom:1px solid transparent;border-right:1px solid transparent !important;border-left:1px solid transparent;border-top:1px solid transparent}div.grd_tblCont table td{border-bottom:1px solid transparent;border-right:0 !important;border-left:0 !important;border-top:0 !important}.grd_inf{background-color:transparent;color:inherit;border-top:1px solid transparent;}.grd_inf a{text-decoration:none;font-weight:bold}.loader{background-color:#f7f7f7;border:1px solid #f7f7f7;border-radius:5px;color:#000;text-shadow:none}.even{background-color:transparent}.odd{background-color:#f7f7f7}span.expClpFlt a.btnExpClpFlt:hover{background-color:transparent !important}.ezActiveRow{background-color:#ccc !important;color:inherit}.ezSelectedRow{background-color:#ccc !important;color:inherit}.ezActiveCell{background-color:transparent;color:inherit;font-weight:bold}.ezETSelectedCell{background-color:transparent;font-weight:bold;color:inherit}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -1,6 +1,6 @@
{
"name": "tablefilter",
"version": "0.4.38",
"version": "0.5.0",
"description": "A Javascript library making HTML tables filterable and a bit more",
"license": "MIT",
"author": {
@ -38,10 +38,10 @@
"tag": "next"
},
"devDependencies": {
"babel-core": "^6.22.1",
"babel-core": "^6.23.1",
"babel-eslint": "7.1.1",
"babel-loader": "^6.2.9",
"babel-plugin-transform-es2015-classes": "^6.22.0",
"babel-loader": "^6.3.2",
"babel-plugin-transform-es2015-classes": "^6.23.0",
"babel-preset-es2015": "^6.22.0",
"clean-webpack-plugin": "^0.1.15",
"codecov": "1.0.1",
@ -59,13 +59,13 @@
"grunt-gh-pages": "^2.0.0",
"grunt-qunit-istanbul": "1.0.0",
"grunt-string-replace": "^1.3.1",
"grunt-webpack": "^1.0.18",
"grunt-webpack": "^2.0.1",
"isparta-loader": "2.0.0",
"script-loader": "^0.7.0",
"string-replace-webpack-plugin": "^0.0.5",
"sugar-date": "2.0.4",
"webpack": "^1.14.0",
"webpack-dev-server": "^1.16.2"
"webpack": "^2.2.1",
"webpack-dev-server": "^2.4.1"
},
"dependencies": {},
"bugs": {

View file

@ -156,11 +156,11 @@ export default class ColOps extends Feature {
}
});
let nbCols = uIndexes.length - 1,
let nbCols = uIndexes.length,
rows = tf.tbl.rows,
colValues = [];
for (let u = 0; u <= nbCols; u++) {
for (let u = 0; u < nbCols; u++) {
//this retrieves col values
//use uIndexes because we only want to pass through this loop
//once for each column get the values in this unique column
@ -182,14 +182,14 @@ export default class ColOps extends Feature {
if (colIndexes[k] !== uIndexes[u]) {
continue;
}
operations[idx] = colOperations[k].toLowerCase();
operations[idx] = (colOperations[k] || 'sum').toLowerCase();
precisions[idx] = decimalPrecisions[k];
labels[idx] = this.labelIds[k];
writeType = isArray(outputTypes) ? outputTypes[k] : null;
idx++;
}
for (let i = 0; i <= idx; i++) {
for (let i = 0; i < idx; i++) {
// emit values before column calculation
this.emitter.emit(
'before-column-calc',
@ -247,8 +247,7 @@ export default class ColOps extends Feature {
let excludeRows = this.excludeRows || [];
let colValues =
this.tf.getFilteredDataCol(colIndex, false, true, excludeRows);
return this.calc(colValues, operation, precision);
return Number(this.calc(colValues, operation, precision));
}
/**

View file

@ -2,7 +2,7 @@ import AdapterSortableTable from './adapterSortabletable';
import {root} from '../../root';
if (!root.SortableTable) {
require('script!sortabletable');
require('script-loader!sortabletable');
}
export default AdapterSortableTable;

View file

@ -456,18 +456,20 @@ export class TableFilter {
f.on_row_validated : EMPTY_FN;
/**
* List of columns implementing custom filtering
* @type {Array}
* Specify which column implements a custom cell parser to retrieve the
* cell value:
* cell_parser: {
* cols: [0, 2],
* parse: function(tf, cell, colIndex) {
* // custom cell parser logic here
* return cellValue;
* }
* }
* @type {Object}
*/
this.customCellDataCols = f.custom_cell_data_cols ?
f.custom_cell_data_cols : [];
/**
* Delegate function for retrieving cell data with custom logic
* @type {Function}
*/
this.customCellData = isFn(f.custom_cell_data) ?
f.custom_cell_data : EMPTY_FN;
this.cellParser = isObj(f.cell_parser) && isFn(f.cell_parser.parse) &&
isArray(f.cell_parser.cols) ?
f.cell_parser : { cols: [], parse: EMPTY_FN };
/**
* Global watermark text for input filter type or watermark for each
@ -1454,19 +1456,15 @@ export class TableFilter {
}
/**
* Destroy all the extensions defined in the configuration object
* Destroy all the extensions store in extensions registry
*/
destroyExtensions() {
let exts = this.extensions;
let reg = this.ExtRegistry;
for (let i = 0, len = exts.length; i < len; i++) {
let ext = exts[i];
let extInstance = this.ExtRegistry[ext.name];
if (extInstance) {
extInstance.destroy();
this.ExtRegistry[ext.name] = undefined;
}
}
Object.keys(reg).forEach((key) => {
reg[key].destroy();
reg[key] = undefined;
});
}
/**
@ -1546,7 +1544,7 @@ export class TableFilter {
this.tbl.deleteRow(this.filtersRowIndex);
}
// broadcast destroy event
// broadcast destroy event modules and extensions are subscribed to
emitter.emit('destroy', this);
// unsubscribe to events
@ -2258,9 +2256,10 @@ export class TableFilter {
*/
getCellValue(cell) {
let idx = cell.cellIndex;
//CallcustomCellData callback
if (this.customCellDataCols.indexOf(idx) !== -1) {
return this.customCellData(this, cell, idx);
let cellParser = this.cellParser;
// Invoke cellParser for this column if any
if (cellParser.cols.indexOf(idx) !== -1) {
return cellParser.parse(this, cell, idx);
} else {
return getText(cell);
}

View file

@ -36,22 +36,23 @@ var tfConfig = {
col_4: 'select',
col_5: 'select',
/* custom_cell_data delegate used for filtering
images in a column */
custom_cell_data_cols: [0, 4],
custom_cell_data: function(o, cell, colIndex){
if(colIndex === 0){
var img = cell.getElementsByTagName('img')[0];
if(!img){
return '';
}
return img.alt;
} else if(colIndex === 4){
var chk = cell.getElementsByTagName('input')[0];
if(chk.checked){
return 'yes';
} else {
return 'no';
/* cell parser for filtering images in a column */
cell_parser: {
cols: [0, 4],
parse: function(o, cell, colIndex){
if(colIndex === 0){
var img = cell.getElementsByTagName('img')[0];
if(!img){
return '';
}
return img.alt;
} else if(colIndex === 4){
var chk = cell.getElementsByTagName('input')[0];
if(chk.checked){
return 'yes';
} else {
return 'no';
}
}
}
},

View file

@ -45,18 +45,20 @@ var tfConfig = {
col_3: 'select',
col_4: 'select',
/* delegate for filtering 'In store' column */
custom_cell_data_cols: [3],
custom_cell_data: function(o, cell, colIndex){
if(colIndex === 3){
var chk = cell.getElementsByTagName('input')[0];
if(!chk){
return '';
}
if(chk.checked){
return 'yes';
} else {
return 'no';
/* cell parser for 'In store' column */
cell_parser: {
cols: [3],
parse: function(o, cell, colIndex){
if(colIndex === 3){
var chk = cell.getElementsByTagName('input')[0];
if(!chk){
return '';
}
if(chk.checked){
return 'yes';
} else {
return 'no';
}
}
}
},

View file

@ -8,3 +8,352 @@ Function.prototype.bind = Function.prototype.bind || function (thisp) {
return fn.apply(thisp, arguments);
};
};
/* eslint-disable */
// https://raw.githubusercontent.com/lahmatiy/es6-promise-polyfill/master/promise.js
(function(global){
//
// Check for native Promise and it has correct interface
//
var NativePromise = global['Promise'];
var nativePromiseSupported =
NativePromise &&
// Some of these methods are missing from
// Firefox/Chrome experimental implementations
'resolve' in NativePromise &&
'reject' in NativePromise &&
'all' in NativePromise &&
'race' in NativePromise &&
// Older version of the spec had a resolver object
// as the arg rather than a function
(function(){
var resolve;
new NativePromise(function(r){ resolve = r; });
return typeof resolve === 'function';
})();
//
// export if necessary
//
if (typeof exports !== 'undefined' && exports)
{
// node.js
exports.Promise = nativePromiseSupported ? NativePromise : Promise;
exports.Polyfill = Promise;
}
else
{
// AMD
if (typeof define == 'function' && define.amd)
{
define(function(){
return nativePromiseSupported ? NativePromise : Promise;
});
}
else
{
// in browser add to global
if (!nativePromiseSupported)
global['Promise'] = Promise;
}
}
//
// Polyfill
//
var PENDING = 'pending';
var SEALED = 'sealed';
var FULFILLED = 'fulfilled';
var REJECTED = 'rejected';
var NOOP = function(){};
function isArray(value) {
return Object.prototype.toString.call(value) === '[object Array]';
}
// async calls
var asyncSetTimer = typeof setImmediate !== 'undefined' ? setImmediate : setTimeout;
var asyncQueue = [];
var asyncTimer;
function asyncFlush(){
// run promise callbacks
for (var i = 0; i < asyncQueue.length; i++)
asyncQueue[i][0](asyncQueue[i][1]);
// reset async asyncQueue
asyncQueue = [];
asyncTimer = false;
}
function asyncCall(callback, arg){
asyncQueue.push([callback, arg]);
if (!asyncTimer)
{
asyncTimer = true;
asyncSetTimer(asyncFlush, 0);
}
}
function invokeResolver(resolver, promise) {
function resolvePromise(value) {
resolve(promise, value);
}
function rejectPromise(reason) {
reject(promise, reason);
}
try {
resolver(resolvePromise, rejectPromise);
} catch(e) {
rejectPromise(e);
}
}
function invokeCallback(subscriber){
var owner = subscriber.owner;
var settled = owner.state_;
var value = owner.data_;
var callback = subscriber[settled];
var promise = subscriber.then;
if (typeof callback === 'function')
{
settled = FULFILLED;
try {
value = callback(value);
} catch(e) {
reject(promise, e);
}
}
if (!handleThenable(promise, value))
{
if (settled === FULFILLED)
resolve(promise, value);
if (settled === REJECTED)
reject(promise, value);
}
}
function handleThenable(promise, value) {
var resolved;
try {
if (promise === value)
throw new TypeError('A promises callback cannot return that same promise.');
if (value && (typeof value === 'function' || typeof value === 'object'))
{
var then = value.then; // then should be retrived only once
if (typeof then === 'function')
{
then.call(value, function(val){
if (!resolved)
{
resolved = true;
if (value !== val)
resolve(promise, val);
else
fulfill(promise, val);
}
}, function(reason){
if (!resolved)
{
resolved = true;
reject(promise, reason);
}
});
return true;
}
}
} catch (e) {
if (!resolved)
reject(promise, e);
return true;
}
return false;
}
function resolve(promise, value){
if (promise === value || !handleThenable(promise, value))
fulfill(promise, value);
}
function fulfill(promise, value){
if (promise.state_ === PENDING)
{
promise.state_ = SEALED;
promise.data_ = value;
asyncCall(publishFulfillment, promise);
}
}
function reject(promise, reason){
if (promise.state_ === PENDING)
{
promise.state_ = SEALED;
promise.data_ = reason;
asyncCall(publishRejection, promise);
}
}
function publish(promise) {
var callbacks = promise.then_;
promise.then_ = undefined;
for (var i = 0; i < callbacks.length; i++) {
invokeCallback(callbacks[i]);
}
}
function publishFulfillment(promise){
promise.state_ = FULFILLED;
publish(promise);
}
function publishRejection(promise){
promise.state_ = REJECTED;
publish(promise);
}
/**
* @class
*/
function Promise(resolver){
if (typeof resolver !== 'function')
throw new TypeError('Promise constructor takes a function argument');
if (this instanceof Promise === false)
throw new TypeError('Failed to construct \'Promise\': Please use the \'new\' operator, this object constructor cannot be called as a function.');
this.then_ = [];
invokeResolver(resolver, this);
}
Promise.prototype = {
constructor: Promise,
state_: PENDING,
then_: null,
data_: undefined,
then: function(onFulfillment, onRejection){
var subscriber = {
owner: this,
then: new this.constructor(NOOP),
fulfilled: onFulfillment,
rejected: onRejection
};
if (this.state_ === FULFILLED || this.state_ === REJECTED)
{
// already resolved, call callback async
asyncCall(invokeCallback, subscriber);
}
else
{
// subscribe
this.then_.push(subscriber);
}
return subscriber.then;
},
'catch': function(onRejection) {
return this.then(null, onRejection);
}
};
Promise.all = function(promises){
var Class = this;
if (!isArray(promises))
throw new TypeError('You must pass an array to Promise.all().');
return new Class(function(resolve, reject){
var results = [];
var remaining = 0;
function resolver(index){
remaining++;
return function(value){
results[index] = value;
if (!--remaining)
resolve(results);
};
}
for (var i = 0, promise; i < promises.length; i++)
{
promise = promises[i];
if (promise && typeof promise.then === 'function')
promise.then(resolver(i), reject);
else
results[i] = promise;
}
if (!remaining)
resolve(results);
});
};
Promise.race = function(promises){
var Class = this;
if (!isArray(promises))
throw new TypeError('You must pass an array to Promise.race().');
return new Class(function(resolve, reject) {
for (var i = 0, promise; i < promises.length; i++)
{
promise = promises[i];
if (promise && typeof promise.then === 'function')
promise.then(resolve, reject);
else
resolve(promise);
}
});
};
Promise.resolve = function(value){
var Class = this;
if (value && typeof value === 'object' && value.constructor === Class)
return value;
return new Class(function(resolve){
resolve(value);
});
};
Promise.reject = function(reason){
var Class = this;
return new Class(function(resolve, reject){
reject(reason);
});
};
})(typeof window != 'undefined' ? window : typeof global != 'undefined' ? global : typeof self != 'undefined' ? self : this);

109
test/test-cell-parser.html Normal file
View file

@ -0,0 +1,109 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TableFilter filter with cell parser</title>
<link rel="stylesheet" href="libs/qunit/qunit.css">
<script src="libs/qunit/qunit.js"></script>
<script src="libs/polyfill.js"></script>
</head>
<body>
<table id="demo">
<thead>
<tr>
<th></th>
<th>From</th>
<th>Destination</th>
<th>Road Distance (km)</th>
<th>By Air (hrs)</th>
<th>By Rail (hrs)</th>
</tr>
</thead>
<tbody>
<tr>
<td>
<input type="checkbox" disabled="disabled"
value="" checked="checked">
</td>
<td><strong>Sydney</strong></td>
<td>Adelaide</td>
<td>1412</td>
<td>1.4</td>
<td>25.3</td>
</tr>
<tr>
<td>
<input type="checkbox" disabled="disabled"
value="">
</td>
<td><strong>Sydney</strong></td>
<td>Brisbane</td>
<td>982</td>
<td>1.5</td>
<td>16</td>
</tr>
<tr>
<td>
<input type="checkbox" disabled="disabled"
value="" checked="checked">
</td>
<td><strong>Sydney</strong></td>
<td>Canberra</td>
<td>286</td>
<td>.6</td>
<td>4.3</td>
</tr>
<tr>
<td>
<input type="checkbox" disabled="disabled"
value="" checked="checked">
</td>
<td><strong>Sydney</strong></td>
<td>Melbourne</td>
<td>872</td>
<td>1.1</td>
<td>10.5</td>
</tr>
<tr>
<td>
<input type="checkbox" disabled="disabled"
value="">
</td>
<td><strong>Adelaide</strong></td>
<td>Perth</td>
<td>2781</td>
<td>3.1</td>
<td>38</td>
</tr>
<tr>
<td>
<input type="checkbox" disabled="disabled"
value="" checked="checked">
</td>
<td><strong>Adelaide</strong></td>
<td>Alice Springs</td>
<td>1533</td>
<td>2</td>
<td>20.25</td>
</tr>
<tr>
<td>
<input type="checkbox" disabled="disabled"
value="">
</td>
<td><strong>Adelaide</strong></td>
<td>Brisbane</td>
<td>2045</td>
<td>2.15</td>
<td>40</td>
</tr>
</tbody>
</table>
<script src="../dist/tablefilter/tablefilter.js"></script>
<script src="test-cell-parser.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

80
test/test-cell-parser.js Normal file
View file

@ -0,0 +1,80 @@
(function(win, TableFilter){
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_0: 'select',
cell_parser: {
cols: [0],
parse: function(tf, cell) {
var chk = cell.getElementsByTagName('input')[0];
if (chk.checked) {
return 'yes';
} else {
return 'no';
}
}
}
});
tf.init();
module('Sanity checks');
test('Sanity checks', function() {
deepEqual(tf instanceof TableFilter, true, 'TableFilter instanciated');
deepEqual(tf.cellParser.cols.length, 1,
'Columns implementing cell parser')
deepEqual(typeof tf.cellParser.parse, 'function', 'Parse function');
deepEqual(
tf.getFilterElement(0).nodeName, 'SELECT', 'Expected filter type');
});
module('Behaviour');
test('Can filter with parsed value', function() {
// setup
tf.setFilterValue(0, 'yes');
// act
tf.filter();
// assert
deepEqual(tf.getValidRows(), [2, 4, 5, 7], 'Number of parsed values');
});
test('Can parse with custom function', function() {
// setup
var cell = tf.tbl.rows[3].cells[0];
// act
var value = tf.getCellValue(cell);
// assert
deepEqual(value, 'no', 'Value returned by custom cell parser');
});
test('Should not parse with custom function if no columns defined',
function() {
// setup
var initialCellParser = tf.cellParser;
var hit = 0;
var cell = tf.tbl.rows[3].cells[0];
tf.cellParser.cols = [];
tf.cellParser.parse = function() {
hit++;
}
// act
tf.getCellValue(cell);
// assert
deepEqual(hit, 0, 'Cell parser not invoked');
tf.cellParser = initialCellParser;
}
);
module('Tear-down');
test('can destroy', function() {
tf.destroy();
deepEqual(tf.isInitialized(), false, 'Filters removed');
});
})(window, TableFilter);

View file

@ -0,0 +1,129 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TableFilter column operations tests</title>
<link rel="stylesheet" href="libs/qunit/qunit.css">
<script src="libs/qunit/qunit.js"></script>
<script src="libs/polyfill.js"></script>
</head>
<body>
<table id="demo" cellpadding="0" cellspacing="0">
<tfoot>
<tr>
<td>Sum:</td>
<td></td>
<td id="sum1"></td>
<td id="sum2"></td>
<td></td>
</tr>
<tr>
<td>Mean:</td>
<td></td>
<td id="mean1"></td>
<td id="mean2"></td>
<td></td>
</tr>
<tr>
<td>Min:</td>
<td></td>
<td id="min1"></td>
<td id="min2"></td>
<td></td>
</tr>
<tr>
<td>Max:</td>
<td></td>
<td id="max1"></td>
<td id="max2"></td>
<td></td>
</tr>
<tr>
<td>Median:</td>
<td></td>
<td id="median1"></td>
<td id="median2"></td>
<td></td>
</tr>
<tr>
<td>Q1:</td>
<td></td>
<td id="q1-1"></td>
<td id="q1-2"></td>
<td></td>
</tr>
<tr>
<td>Q3:</td>
<td></td>
<td id="q3-1"></td>
<td id="q3-2"></td>
<td></td>
</tr>
</tfoot>
<tbody>
<tr>
<th>From</th>
<th>Destination</th>
<th>Road Distance (km)</th>
<th>By Air (hrs)</th>
<th width="15%">By Rail (hrs)</th>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Adelaide</td>
<td>1412</td>
<td>1.4</td>
<td>25.3</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Brisbane</td>
<td>982</td>
<td>1.5</td>
<td>16</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Canberra</td>
<td>286</td>
<td>.6</td>
<td>4.3</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Melbourne</td>
<td>872</td>
<td>1.1</td>
<td>10.5</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Perth</td>
<td>2781</td>
<td>3.1</td>
<td>38</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Alice Springs</td>
<td>1533</td>
<td>2</td>
<td>20.25</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Brisbane</td>
<td>2045</td>
<td>2.15</td>
<td>40</td>
</tr>
</tbody>
</table>
<script src="../dist/tablefilter/tablefilter.js"></script>
<script src="test-col-ops-grid-layout.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

View file

@ -0,0 +1,134 @@
var id = function (id){ return document.getElementById(id); };
var table = id('demo');
var totRowIndex = table.getElementsByTagName('tr').length -2;
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_types: ['string', 'string', 'number', 'number', 'number'],
grid_layout: true,
rows_always_visible: [
totRowIndex-6,
totRowIndex-5,
totRowIndex-4,
totRowIndex-3,
totRowIndex-2,
totRowIndex-1,
totRowIndex,
],
extensions: [{
name: 'colOps',
id: [
'sum1', 'sum2',
'mean1', 'mean2',
'min1', 'min2',
'max1', 'max2',
'median1', 'median2',
'q1-1', 'q1-2',
'q3-1', 'q3-2'
],
col: [
2, 3,
2, 3,
2, 3,
2, 3,
2, 3,
2, 3,
2, 3
],
operation: [
'sum', 'sum',
'mean', 'mean',
'min', 'min',
'max', 'max',
'median', 'median',
'q1', 'q1',
'q3', 'q3'
],
write_method: [
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml'
],
exclude_row: [
totRowIndex-6,
totRowIndex-5,
totRowIndex-4,
totRowIndex-3,
totRowIndex-2,
totRowIndex-1,
totRowIndex
],
decimal_precision: [
0, 2,
0, 2,
0, 2,
0, 2,
0, 2,
0, 2,
0, 2
],
tot_row_index: [
totRowIndex-6, totRowIndex-6,
totRowIndex-5, totRowIndex-5,
totRowIndex-4, totRowIndex-4,
totRowIndex-3, totRowIndex-3,
totRowIndex-2, totRowIndex-2,
totRowIndex-1, totRowIndex-1,
totRowIndex, totRowIndex
]
}]
});
tf.init();
module('Sanity checks');
test('Column operations', function() {
var colOps = tf.extension('colOps');
deepEqual(typeof colOps, 'object', 'ColOps instanciated');
equal(id('sum1').innerHTML, 9911, 'Sum result');
equal(id('sum2').innerHTML, 11.85, 'Sum result');
equal(id('mean1').innerHTML, 1416, 'Mean result');
equal(id('mean2').innerHTML, 1.69, 'Mean result');
equal(id('min1').innerHTML, 286, 'Min result');
equal(id('min2').innerHTML, 0.60, 'Min result');
equal(id('max1').innerHTML, 2781, 'Max result');
equal(id('max2').innerHTML, 3.10, 'Max result');
equal(id('median1').innerHTML, 1412, 'Median result');
equal(id('median2').innerHTML, 1.50, 'Median result');
equal(id('q1-1').innerHTML, 872, 'Q1 result');
equal(id('q1-2').innerHTML, 1.10, 'Q1 result');
equal(id('q3-1').innerHTML, 2045, 'Q3 result');
equal(id('q3-2').innerHTML, 2.15, 'Q3 result');
tf.clearFilters();
});
module('Behaviour checks');
test('Column operations after filtering', function() {
tf.setFilterValue(0, 'syd');
tf.filter();
equal(id('sum1').innerHTML, 3552, 'Sum result');
equal(id('sum2').innerHTML, 4.60, 'Sum result');
equal(id('mean1').innerHTML, 888, 'Mean result');
equal(id('mean2').innerHTML, 1.15, 'Mean result');
equal(id('min1').innerHTML, 286, 'Min result');
equal(id('min2').innerHTML, 0.60, 'Min result');
equal(id('max1').innerHTML, 1412, 'Max result');
equal(id('max2').innerHTML, 1.50, 'Max result');
equal(id('median1').innerHTML, 927, 'Median result');
equal(id('median2').innerHTML, 1.25, 'Median result');
equal(id('q1-1').innerHTML, 579, 'Q1 result');
equal(id('q1-2').innerHTML, 0.85, 'Q1 result');
equal(id('q3-1').innerHTML, 1197, 'Q3 result');
equal(id('q3-2').innerHTML, 1.45, 'Q3 result');
tf.clearFilters();
});
module('Tear-down');
test('can destroy', function() {
tf.destroy();
deepEqual(tf.isInitialized(), false, 'Filters removed');
});

View file

@ -0,0 +1,129 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TableFilter column operations tests with paging</title>
<link rel="stylesheet" href="libs/qunit/qunit.css">
<script src="libs/qunit/qunit.js"></script>
<script src="libs/polyfill.js"></script>
</head>
<body>
<table id="demo" cellpadding="0" cellspacing="0">
<tfoot>
<tr>
<td>Sum:</td>
<td></td>
<td id="sum1"></td>
<td id="sum2"></td>
<td></td>
</tr>
<tr>
<td>Mean:</td>
<td></td>
<td id="mean1"></td>
<td id="mean2"></td>
<td></td>
</tr>
<tr>
<td>Min:</td>
<td></td>
<td id="min1"></td>
<td id="min2"></td>
<td></td>
</tr>
<tr>
<td>Max:</td>
<td></td>
<td id="max1"></td>
<td id="max2"></td>
<td></td>
</tr>
<tr>
<td>Median:</td>
<td></td>
<td id="median1"></td>
<td id="median2"></td>
<td></td>
</tr>
<tr>
<td>Q1:</td>
<td></td>
<td id="q1-1"></td>
<td id="q1-2"></td>
<td></td>
</tr>
<tr>
<td>Q3:</td>
<td></td>
<td id="q3-1"></td>
<td id="q3-2"></td>
<td></td>
</tr>
</tfoot>
<tbody>
<tr>
<th>From</th>
<th>Destination</th>
<th>Road Distance (km)</th>
<th>By Air (hrs)</th>
<th width="15%">By Rail (hrs)</th>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Adelaide</td>
<td>1412</td>
<td>1.4</td>
<td>25.3</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Brisbane</td>
<td>982</td>
<td>1.5</td>
<td>16</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Canberra</td>
<td>286</td>
<td>.6</td>
<td>4.3</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Melbourne</td>
<td>872</td>
<td>1.1</td>
<td>10.5</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Perth</td>
<td>2781</td>
<td>3.1</td>
<td>38</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Alice Springs</td>
<td>1533</td>
<td>2</td>
<td>20.25</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Brisbane</td>
<td>2045</td>
<td>2.15</td>
<td>40</td>
</tr>
</tbody>
</table>
<script src="../dist/tablefilter/tablefilter.js"></script>
<script src="test-col-ops-paging.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

153
test/test-col-ops-paging.js Normal file
View file

@ -0,0 +1,153 @@
var id = function (id){ return document.getElementById(id); };
var table = id('demo');
var totRowIndex = table.getElementsByTagName('tr').length;
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_types: ['string', 'string', 'number', 'number', 'number'],
paging: true,
paging_length: 4,
rows_always_visible: [
totRowIndex-6,
totRowIndex-5,
totRowIndex-4,
totRowIndex-3,
totRowIndex-2,
totRowIndex-1,
totRowIndex,
],
extensions: [{
name: 'colOps',
id: [
'sum1', 'sum2',
'mean1', 'mean2',
'min1', 'min2',
'max1', 'max2',
'median1', 'median2',
'q1-1', 'q1-2',
'q3-1', 'q3-2'
],
col: [
2, 3,
2, 3,
2, 3,
2, 3,
2, 3,
2, 3,
2, 3
],
operation: [
'sum', 'sum',
'mean', 'mean',
'min', 'min',
'max', 'max',
'median', 'median',
'q1', 'q1',
'q3', 'q3'
],
write_method: [
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml'
],
exclude_row: [
totRowIndex-6,
totRowIndex-5,
totRowIndex-4,
totRowIndex-3,
totRowIndex-2,
totRowIndex-1,
totRowIndex
],
decimal_precision: [
0, 2,
0, 2,
0, 2,
0, 2,
0, 2,
0, 2,
0, 2
],
tot_row_index: [
totRowIndex-6, totRowIndex-6,
totRowIndex-5, totRowIndex-5,
totRowIndex-4, totRowIndex-4,
totRowIndex-3, totRowIndex-3,
totRowIndex-2, totRowIndex-2,
totRowIndex-1, totRowIndex-1,
totRowIndex, totRowIndex
]
}]
});
tf.init();
module('Sanity checks');
test('Column operations', function() {
var colOps = tf.extension('colOps');
deepEqual(typeof colOps, 'object', 'ColOps instanciated');
equal(id('sum1').innerHTML, 3552, 'Sum result');
equal(id('sum2').innerHTML, 4.60, 'Sum result');
equal(id('mean1').innerHTML, 888, 'Mean result');
equal(id('mean2').innerHTML, 1.15, 'Mean result');
equal(id('min1').innerHTML, 286, 'Min result');
equal(id('min2').innerHTML, 0.60, 'Min result');
equal(id('max1').innerHTML, 1412, 'Max result');
equal(id('max2').innerHTML, 1.50, 'Max result');
equal(id('median1').innerHTML, 927, 'Median result');
equal(id('median2').innerHTML, 1.25, 'Median result');
equal(id('q1-1').innerHTML, 579, 'Q1 result');
equal(id('q1-2').innerHTML, 0.85, 'Q1 result');
equal(id('q3-1').innerHTML, 1197, 'Q3 result');
equal(id('q3-2').innerHTML, 1.45, 'Q3 result');
tf.clearFilters();
});
module('Behaviour checks');
test('Column operations after filtering', function() {
tf.setFilterValue(0, 'syd');
tf.filter();
equal(id('sum1').innerHTML, 3552, 'Sum result');
equal(id('sum2').innerHTML, 4.60, 'Sum result');
equal(id('mean1').innerHTML, 888, 'Mean result');
equal(id('mean2').innerHTML, 1.15, 'Mean result');
equal(id('min1').innerHTML, 286, 'Min result');
equal(id('min2').innerHTML, 0.60, 'Min result');
equal(id('max1').innerHTML, 1412, 'Max result');
equal(id('max2').innerHTML, 1.50, 'Max result');
equal(id('median1').innerHTML, 927, 'Median result');
equal(id('median2').innerHTML, 1.25, 'Median result');
equal(id('q1-1').innerHTML, 579, 'Q1 result');
equal(id('q1-2').innerHTML, 0.85, 'Q1 result');
equal(id('q3-1').innerHTML, 1197, 'Q3 result');
equal(id('q3-2').innerHTML, 1.45, 'Q3 result');
tf.clearFilters();
});
test('Column operations after page changed', function() {
var paging = tf.feature('paging');
// change page
paging.changePage(1);
equal(id('sum1').innerHTML, 6359, 'Sum result after page change');
equal(id('sum2').innerHTML, 7.25, 'Sum result after page change');
equal(id('mean1').innerHTML, 2120, 'Mean result after page change');
equal(id('mean2').innerHTML, 2.42, 'Mean result after page change');
equal(id('min1').innerHTML, 1533, 'Min result after page change');
equal(id('min2').innerHTML, 2.00, 'Min result after page change');
equal(id('max1').innerHTML, 2781, 'Max result after page change');
equal(id('max2').innerHTML, 3.10, 'Max result after page change');
equal(id('median1').innerHTML, 2045, 'Median result after page change');
equal(id('median2').innerHTML, 2.15, 'Median result after page change');
equal(id('q1-1').innerHTML, 1533, 'Q1 result after page change');
equal(id('q1-2').innerHTML, 2.00, 'Q1 result after page change');
equal(id('q3-1').innerHTML, 2781, 'Q3 result after page change');
equal(id('q3-2').innerHTML, 3.10, 'Q3 result after page change');
tf.destroy();
});

View file

@ -125,231 +125,23 @@ test('Column operations after filtering', function() {
tf.clearFilters();
});
module('Behaviour checks with paging enabled');
test('Column operations', function() {
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_types: ['string', 'string', 'number', 'number', 'number'],
paging: true,
paging_length: 4,
rows_always_visible: [
totRowIndex-6,
totRowIndex-5,
totRowIndex-4,
totRowIndex-3,
totRowIndex-2,
totRowIndex-1,
totRowIndex,
],
extensions: [{
name: 'colOps',
id: [
'sum1', 'sum2',
'mean1', 'mean2',
'min1', 'min2',
'max1', 'max2',
'median1', 'median2',
'q1-1', 'q1-2',
'q3-1', 'q3-2'
],
col: [
2, 3,
2, 3,
2, 3,
2, 3,
2, 3,
2, 3,
2, 3
],
operation: [
'sum', 'sum',
'mean', 'mean',
'min', 'min',
'max', 'max',
'median', 'median',
'q1', 'q1',
'q3', 'q3'
],
write_method: [
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml'
],
exclude_row: [
totRowIndex-6,
totRowIndex-5,
totRowIndex-4,
totRowIndex-3,
totRowIndex-2,
totRowIndex-1,
totRowIndex
],
decimal_precision: [
0, 2,
0, 2,
0, 2,
0, 2,
0, 2,
0, 2,
0, 2
],
tot_row_index: [
totRowIndex-6, totRowIndex-6,
totRowIndex-5, totRowIndex-5,
totRowIndex-4, totRowIndex-4,
totRowIndex-3, totRowIndex-3,
totRowIndex-2, totRowIndex-2,
totRowIndex-1, totRowIndex-1,
totRowIndex, totRowIndex
]
}]
});
tf.init();
var paging = tf.feature('paging');
test('Can make column calculations', function() {
// setup
var colOps = tf.extension('colOps');
// change page
paging.changePage(1);
// act
var result0 = colOps.columnCalc(2, 'mean', 1);
var result1 = colOps.columnCalc(2, 'min', 2);
var result2 = colOps.columnCalc(2, 'max', 0);
equal(id('sum1').innerHTML, 6359, 'Sum result after page change');
equal(id('sum2').innerHTML, 7.25, 'Sum result after page change');
equal(id('mean1').innerHTML, 2120, 'Mean result after page change');
equal(id('mean2').innerHTML, 2.42, 'Mean result after page change');
equal(id('min1').innerHTML, 1533, 'Min result after page change');
equal(id('min2').innerHTML, 2.00, 'Min result after page change');
equal(id('max1').innerHTML, 2781, 'Max result after page change');
equal(id('max2').innerHTML, 3.10, 'Max result after page change');
equal(id('median1').innerHTML, 2045, 'Median result after page change');
equal(id('median2').innerHTML, 2.15, 'Median result after page change');
equal(id('q1-1').innerHTML, 1533, 'Q1 result after page change');
equal(id('q1-2').innerHTML, 2.00, 'Q1 result after page change');
equal(id('q3-1').innerHTML, 2781, 'Q3 result after page change');
equal(id('q3-2').innerHTML, 3.10, 'Q3 result after page change');
tf.destroy();
// assert
deepEqual(result0, 1415.9, 'columnCalc mean');
deepEqual(result1, 286.00, 'columnCalc min');
deepEqual(result2, 2781, 'columnCalc max');
});
module('Behaviour checks with grid layout');
test('Column operations', function() {
totRowIndex = totRowIndex-2;
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_types: ['string', 'string', 'number', 'number', 'number'],
grid_layout: true,
rows_always_visible: [
totRowIndex-6,
totRowIndex-5,
totRowIndex-4,
totRowIndex-3,
totRowIndex-2,
totRowIndex-1,
totRowIndex,
],
extensions: [{
name: 'colOps',
id: [
'sum1', 'sum2',
'mean1', 'mean2',
'min1', 'min2',
'max1', 'max2',
'median1', 'median2',
'q1-1', 'q1-2',
'q3-1', 'q3-2'
],
col: [
2, 3,
2, 3,
2, 3,
2, 3,
2, 3,
2, 3,
2, 3
],
operation: [
'sum', 'sum',
'mean', 'mean',
'min', 'min',
'max', 'max',
'median', 'median',
'q1', 'q1',
'q3', 'q3'
],
write_method: [
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml',
'innerhtml', 'innerhtml'
],
exclude_row: [
totRowIndex-6,
totRowIndex-5,
totRowIndex-4,
totRowIndex-3,
totRowIndex-2,
totRowIndex-1,
totRowIndex
],
decimal_precision: [
0, 2,
0, 2,
0, 2,
0, 2,
0, 2,
0, 2,
0, 2
],
tot_row_index: [
totRowIndex-6, totRowIndex-6,
totRowIndex-5, totRowIndex-5,
totRowIndex-4, totRowIndex-4,
totRowIndex-3, totRowIndex-3,
totRowIndex-2, totRowIndex-2,
totRowIndex-1, totRowIndex-1,
totRowIndex, totRowIndex
]
}]
});
tf.init();
tf.clearFilters();
equal(id('sum1').innerHTML, 9911, 'Sum result');
equal(id('sum2').innerHTML, 11.85, 'Sum result');
equal(id('mean1').innerHTML, 1416, 'Mean result');
equal(id('mean2').innerHTML, 1.69, 'Mean result');
equal(id('min1').innerHTML, 286, 'Min result');
equal(id('min2').innerHTML, 0.60, 'Min result');
equal(id('max1').innerHTML, 2781, 'Max result');
equal(id('max2').innerHTML, 3.10, 'Max result');
equal(id('median1').innerHTML, 1412, 'Median result');
equal(id('median2').innerHTML, 1.50, 'Median result');
equal(id('q1-1').innerHTML, 872, 'Q1 result');
equal(id('q1-2').innerHTML, 1.10, 'Q1 result');
equal(id('q3-1').innerHTML, 2045, 'Q3 result');
equal(id('q3-2').innerHTML, 2.15, 'Q3 result');
tf.setFilterValue(2, '>1000');
tf.filter();
equal(id('sum1').innerHTML, 7771, 'Sum result');
equal(id('sum2').innerHTML, 8.65, 'Sum result');
equal(id('mean1').innerHTML, 1943, 'Mean result');
equal(id('mean2').innerHTML, 2.16, 'Mean result');
equal(id('min1').innerHTML, 1412, 'Min result');
equal(id('min2').innerHTML, 1.40, 'Min result');
equal(id('max1').innerHTML, 2781, 'Max result');
equal(id('max2').innerHTML, 3.10, 'Max result');
equal(id('median1').innerHTML, 1789, 'Median result');
equal(id('median2').innerHTML, 2.08, 'Median result');
equal(id('q1-1').innerHTML, 1473, 'Q1 result');
equal(id('q1-2').innerHTML, 1.70, 'Q1 result');
equal(id('q3-1').innerHTML, 2413, 'Q3 result');
equal(id('q3-2').innerHTML, 2.63, 'Q3 result');
module('Tear-down');
test('can destroy', function() {
tf.destroy();
deepEqual(tf.isInitialized(), false, 'Filters removed');
});

View file

@ -0,0 +1,80 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TableFilter filter with columns visibility extension</title>
<link rel="stylesheet" href="libs/qunit/qunit.css">
<script src="libs/qunit/qunit.js"></script>
<script src="libs/polyfill.js"></script>
</head>
<body>
<table id="demo">
<thead>
<tr>
<th>From</th>
<th>Destination</th>
<th>Road Distance (km)</th>
<th>By Air (hrs)</th>
<th>By Rail (hrs)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Sydney</strong></td>
<td>Adelaide</td>
<td>1412</td>
<td>1.4</td>
<td>25.3</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Brisbane</td>
<td>982</td>
<td>1.5</td>
<td>16</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Canberra</td>
<td>286</td>
<td>.6</td>
<td>4.3</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Melbourne</td>
<td>872</td>
<td>1.1</td>
<td>10.5</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Perth</td>
<td>2781</td>
<td>3.1</td>
<td>38</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Alice Springs</td>
<td>1533</td>
<td>2</td>
<td>20.25</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Brisbane</td>
<td>2045</td>
<td>2.15</td>
<td>40</td>
</tr>
</tbody>
</table>
<script src="../dist/tablefilter/tablefilter.js"></script>
<script src="test-cols-visibility-grid-layout.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

View file

@ -0,0 +1,149 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
grid_layout: true,
extensions:[{ name: 'colsVisibility' }]
});
tf.init();
var ext;
module('Sanity checks');
test('Extension initialization', function() {
ext = tf.extension('colsVisibility');
deepEqual(tf instanceof TableFilter, true, 'TableFilter instanciated');
notEqual(ext, null, 'Extension instanciated');
deepEqual(ext.initialized, true, 'Extension initialized');
deepEqual(ext.text, 'Hide: ', 'Text setting');
deepEqual(ext.btnText, 'Columns&#9660;', 'Button text setting');
});
module('UI checks');
test('UI elements', function() {
ext = tf.extension('colsVisibility');
var span = ext.spanEl;
var cont = ext.contEl;
var btn = ext.btnEl;
deepEqual(span.nodeName, 'SPAN', 'Container element');
deepEqual(cont.nodeName, 'DIV', 'Container element');
deepEqual(cont.getElementsByTagName('p')[0].innerHTML,
'Hide: ', 'Expected text');
deepEqual(btn.nodeName, 'A', 'Button element');
deepEqual(btn.innerHTML, 'Columns▼');
});
module('Behaviour');
test('Toggle columns list container', function() {
ext = tf.extension('colsVisibility');
ext.toggle();
deepEqual(ext.contEl.style.display, 'inline', 'columns list visible');
ext.toggle();
deepEqual(ext.contEl.style.display, 'none', 'columns list visible');
});
test('Hide columns', function() {
ext = tf.extension('colsVisibility');
ext.hideCol(2);
ext.hideCol(3);
deepEqual(ext.isColHidden(2), true, 'Expected column is hidden');
deepEqual(ext.isColHidden(3), true, 'Expected column is hidden');
});
test('Show columns', function() {
ext = tf.extension('colsVisibility');
ext.showCol(2);
ext.showCol(3);
deepEqual(ext.isColHidden(2), false, 'Expected column is displayed');
deepEqual(ext.isColHidden(3), false, 'Expected column is displayed');
});
test('Toggle column', function() {
ext = tf.extension('colsVisibility');
ext.toggleCol(2);
deepEqual(ext.isColHidden(2), true, 'Expected column is hidden');
ext.toggleCol(2);
deepEqual(ext.isColHidden(2), false, 'Expected column is displayed');
});
test('Popup container auto-closes when user clicks away', function() {
// setup
ext = tf.extension('colsVisibility');
ext.toggle();
// act
var evObj = document.createEvent('HTMLEvents');
evObj.initEvent('mouseup', true, true);
// mouseup fired from a table cell
tf.tbl.rows[3].cells[2].dispatchEvent(evObj);
// assert
deepEqual(ext.contEl.style.display, 'none',
'Popup container closed after user clicks away'
);
});
test('Close button closes popup', function() {
// setup
ext = tf.extension('colsVisibility');
ext.toggle();
// act
var evObj = document.createEvent('HTMLEvents');
evObj.initEvent('click', true, true);
ext.contEl.querySelector('.colVis').dispatchEvent(evObj);
// assert
deepEqual(ext.contEl.style.display, 'none',
'Close button closes popup'
);
});
test('Button closes popup when already open', function() {
// setup
ext = tf.extension('colsVisibility');
ext.toggle();
// act
var evObj = document.createEvent('HTMLEvents');
evObj.initEvent('click', true, true);
ext.btnEl.dispatchEvent(evObj);
// assert
deepEqual(ext.contEl.style.display, 'none',
'Close button closes popup'
);
});
test('Toggle columns list container', function() {
ext = tf.extension('colsVisibility');
ext.toggle();
deepEqual(ext.contEl.style.display, 'inline', 'columns list visible');
ext.toggle();
deepEqual(ext.contEl.style.display, 'none', 'columns list visible');
});
test('Hide columns', function() {
ext = tf.extension('colsVisibility');
ext.hideCol(2);
ext.hideCol(3);
deepEqual(ext.isColHidden(2), true, 'Expected column is hidden');
deepEqual(ext.isColHidden(3), true, 'Expected column is hidden');
});
test('Show columns', function() {
ext = tf.extension('colsVisibility');
ext.showCol(2);
ext.showCol(3);
deepEqual(ext.isColHidden(2), false, 'Expected column is displayed');
deepEqual(ext.isColHidden(3), false, 'Expected column is displayed');
});
test('Toggle column', function() {
ext = tf.extension('colsVisibility');
ext.toggleCol(2);
deepEqual(ext.isColHidden(2), true, 'Expected column is hidden');
ext.toggleCol(2);
deepEqual(ext.isColHidden(2), false, 'Expected column is displayed');
});
test('Destroy extension and tablefilter', function() {
ext = tf.extension('colsVisibility');
ext.destroy();
deepEqual(ext.initialized, false, 'Extension no longer initialized');
deepEqual(ext.contEl, null, 'Columns list container removed');
deepEqual(ext.btnEl, null, 'Button removed');
tf.destroy();
});

View file

@ -119,56 +119,3 @@ test('Re-initialize extension', function() {
deepEqual(ext.initialized, true, 'Extension initialized');
tf.destroy();
});
module('Behaviour with grid layout');
test('Re-initialize tablefilter with grid layout on', function() {
tf = null;
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
grid_layout: true,
extensions:[{ name: 'colsVisibility' }]
});
tf.init();
ext = tf.extension('colsVisibility');
deepEqual(ext.initialized, true, 'Extension initialized');
});
test('Toggle columns list container', function() {
ext = tf.extension('colsVisibility');
ext.toggle();
deepEqual(ext.contEl.style.display, 'inline', 'columns list visible');
ext.toggle();
deepEqual(ext.contEl.style.display, 'none', 'columns list visible');
});
test('Hide columns', function() {
ext = tf.extension('colsVisibility');
ext.hideCol(2);
ext.hideCol(3);
deepEqual(ext.isColHidden(2), true, 'Expected column is hidden');
deepEqual(ext.isColHidden(3), true, 'Expected column is hidden');
});
test('Show columns', function() {
ext = tf.extension('colsVisibility');
ext.showCol(2);
ext.showCol(3);
deepEqual(ext.isColHidden(2), false, 'Expected column is displayed');
deepEqual(ext.isColHidden(3), false, 'Expected column is displayed');
});
test('Toggle column', function() {
ext = tf.extension('colsVisibility');
ext.toggleCol(2);
deepEqual(ext.isColHidden(2), true, 'Expected column is hidden');
ext.toggleCol(2);
deepEqual(ext.isColHidden(2), false, 'Expected column is displayed');
});
test('Destroy extension and tablefilter', function() {
ext = tf.extension('colsVisibility');
ext.destroy();
deepEqual(ext.initialized, false, 'Extension no longer initialized');
deepEqual(ext.contEl, null, 'Columns list container removed');
deepEqual(ext.btnEl, null, 'Button removed');
tf.destroy();
});

View file

@ -0,0 +1,80 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TableFilter filters visibility extension tests</title>
<link rel="stylesheet" href="libs/qunit/qunit.css">
<script src="libs/qunit/qunit.js"></script>
<script src="libs/polyfill.js"></script>
</head>
<body>
<table id="demo">
<thead>
<tr>
<th>From</th>
<th>Destination</th>
<th>Road Distance (km)</th>
<th>By Air (hrs)</th>
<th>By Rail (hrs)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Sydney</strong></td>
<td>Adelaide</td>
<td>1412</td>
<td>1.4</td>
<td>25.3</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Brisbane</td>
<td>982</td>
<td>1.5</td>
<td>16</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Canberra</td>
<td>286</td>
<td>.6</td>
<td>4.3</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Melbourne</td>
<td>872</td>
<td>1.1</td>
<td>10.5</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Perth</td>
<td>2781</td>
<td>3.1</td>
<td>38</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Alice Springs</td>
<td>1533</td>
<td>2</td>
<td>20.25</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Brisbane</td>
<td>2045</td>
<td>2.15</td>
<td>40</td>
</tr>
</tbody>
</table>
<script src="../dist/tablefilter/tablefilter.js"></script>
<script src="test-filters-visibility-grid-layout.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

View file

@ -0,0 +1,50 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
grid_layout: true,
extensions:[{
name: 'filtersVisibility',
visible_at_start: false
}]
});
tf.init();
var gridLayout = tf.feature('gridLayout');
var filtersRow = gridLayout.headTbl.rows[tf.getFiltersRowIndex()];
module('Sanity checks');
test('Filters visibility extension', function() {
var ext = tf.extension('filtersVisibility');
deepEqual(tf instanceof TableFilter, true, 'TableFilter instanciated');
notEqual(ext, null, 'Extension instanciated');
deepEqual(ext.initialized, true, 'Extension initialized');
});
module('UI');
test('Filters visibility extension', function() {
var ext = tf.extension('filtersVisibility');
var cont = ext.contEl;
var btn = ext.btnEl;
deepEqual(filtersRow.style.display, 'none', 'Filters hidden');
deepEqual(cont.nodeName, 'SPAN', 'Container element');
deepEqual(btn.nodeName, 'A', 'Button element');
});
module('Check behaviours');
test('Toggle filters', function() {
var ext = tf.extension('filtersVisibility');
ext.toggle();
deepEqual(filtersRow.style.display, '', 'Filters displayed');
ext.toggle();
deepEqual(filtersRow.style.display, 'none', 'Filters hidden');
});
test('Remove extension', function() {
var ext = tf.extension('filtersVisibility');
ext.destroy();
deepEqual(ext.contEl, null, 'Container element removed');
deepEqual(ext.btnEl, null, 'Button element removed');
deepEqual(ext.initialized, false, 'Extension not initialized');
});

View file

@ -0,0 +1,80 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TableFilter filters visibility extension tests</title>
<link rel="stylesheet" href="libs/qunit/qunit.css">
<script src="libs/qunit/qunit.js"></script>
<script src="libs/polyfill.js"></script>
</head>
<body>
<table id="demo">
<thead>
<tr>
<th>From</th>
<th>Destination</th>
<th>Road Distance (km)</th>
<th>By Air (hrs)</th>
<th>By Rail (hrs)</th>
</tr>
</thead>
<tbody>
<tr>
<td><strong>Sydney</strong></td>
<td>Adelaide</td>
<td>1412</td>
<td>1.4</td>
<td>25.3</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Brisbane</td>
<td>982</td>
<td>1.5</td>
<td>16</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Canberra</td>
<td>286</td>
<td>.6</td>
<td>4.3</td>
</tr>
<tr>
<td><strong>Sydney</strong></td>
<td>Melbourne</td>
<td>872</td>
<td>1.1</td>
<td>10.5</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Perth</td>
<td>2781</td>
<td>3.1</td>
<td>38</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Alice Springs</td>
<td>1533</td>
<td>2</td>
<td>20.25</td>
</tr>
<tr>
<td><strong>Adelaide</strong></td>
<td>Brisbane</td>
<td>2045</td>
<td>2.15</td>
<td>40</td>
</tr>
</tbody>
</table>
<script src="../dist/tablefilter/tablefilter.js"></script>
<script src="test-filters-visibility-with-button.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

View file

@ -0,0 +1,48 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
extensions:[{
name: 'filtersVisibility',
target_id: 'test',
btn_text: 'Hello'
}]
});
tf.init();
var extTargetElement = document.createElement('div');
extTargetElement.setAttribute('id', 'test');
document.body.insertBefore(extTargetElement, tf.tbl);
module('Sanity checks');
test('Filters visibility extension', function() {
var ext = tf.extension('filtersVisibility');
deepEqual(tf instanceof TableFilter, true, 'TableFilter instanciated');
notEqual(ext, null, 'Extension instanciated');
deepEqual(ext.initialized, true, 'Extension initialized');
});
module('Check UI');
test('UI elements', function() {
var ext = tf.extension('filtersVisibility');
var btn = ext.btnEl;
deepEqual(
extTargetElement.firstChild.nodeName, 'SPAN', 'Container element');
deepEqual(btn.nodeName, 'A', 'Button element');
deepEqual(btn.textContent || btn.innerText, 'Hello', 'Expected text');
ext.destroy();
});
test('Button without icon', function() {
var ext = tf.extension('filtersVisibility');
ext.btnEl = null;
ext.targetId = null;
ext.btnText = '';
ext.collapseBtnHtml = ext.defaultText;
ext.enableIcon = false;
ext.init();
deepEqual(ext.contEl.nodeName, 'SPAN', 'Container element');
deepEqual(ext.btnEl.nodeName, 'A', 'Button element');
deepEqual(ext.btnEl.innerHTML, 'Toggle filters', 'Expected text');
});

View file

@ -46,61 +46,3 @@ test('Remove extension', function() {
deepEqual(ext.btnEl, null, 'Button element removed');
deepEqual(ext.initialized, false, 'Extension not initialized');
});
test('Button without icon', function() {
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
extensions:[{
name: 'filtersVisibility',
enable_icon: false
}]
});
tf.init();
var ext = tf.extension('filtersVisibility');
deepEqual(ext.contEl.nodeName, 'SPAN', 'Container element');
deepEqual(ext.btnEl.nodeName, 'A', 'Button element');
deepEqual(ext.btnEl.innerHTML, 'Toggle filters', 'Expected text');
});
test('Button in external Container', function() {
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
extensions:[{
name: 'filtersVisibility',
target_id: 'test',
btn_text: 'Hello'
}]
});
tf.init();
var ext = tf.extension('filtersVisibility');
var btn = ext.btnEl;
deepEqual(
extTargetElement.firstChild.nodeName, 'SPAN', 'Container element');
deepEqual(btn.nodeName, 'A', 'Button element');
deepEqual(btn.textContent || btn.innerText, 'Hello', 'Expected text');
});
test('Grid layout: filters hidden at start', function() {
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
grid_layout: true,
extensions:[{
name: 'filtersVisibility',
visible_at_start: false
}]
});
tf.init();
var ext = tf.extension('filtersVisibility');
var gridLayout = tf.feature('gridLayout');
var filtersRow = gridLayout.headTbl.rows[tf.getFiltersRowIndex()];
var cont = ext.contEl;
var btn = ext.btnEl;
deepEqual(filtersRow.style.display, 'none', 'Filters hidden');
deepEqual(cont.nodeName, 'SPAN', 'Container element');
deepEqual(btn.nodeName, 'A', 'Button element');
});

View file

@ -14,28 +14,26 @@ module.exports = {
path: path.join(__dirname, '/dist/tablefilter'),
filename: 'tablefilter.js',
chunkFilename: 'tf-[name]-[chunkhash].js',
// chunkFilename: 'tf-[name].js',
libraryTarget: 'umd'
},
resolve: {
extensions: ['', '.js'],
extensions: ['.js'],
alias: {
sortabletable: '../../../libs/sortabletable.js'
}
},
module: {
loaders: [
rules: [
{
test: path.join(__dirname, 'src'),
exclude: /tablefilter\/node_modules/,
query: {
options: {
compact: false,
presets: ['es2015'],
plugins: [['transform-es2015-classes', {loose: true}]]
},
loader: 'babel-loader'
},
{
}, {
test: path.join(__dirname, 'src'),
loader: StringReplacePlugin.replace({
replacements: [{
@ -53,35 +51,25 @@ module.exports = {
}
]
},
build: {
devtool: 'source-map',
plugins: [
new Clean(['dist']),
new webpack.optimize.DedupePlugin(),
new webpack.optimize.AggressiveMergingPlugin(),
new StringReplacePlugin(),
new webpack.optimize.MinChunkSizePlugin({ minChunkSize: 10000 }),
new webpack.optimize.UglifyJsPlugin({
compress: {
warnings: false
}
}),
new webpack.BannerPlugin(
'/** \n' +
' *\t '+pkg.name+' v'+pkg.version+' by '+pkg.author.name+'\n' +
' *\t build date: '+ new Date().toISOString() +' \n' +
' *\t MIT License \n' +
' */ \n',
{ raw: true }
)
]
},
dev: {
devtool: 'source-map',
debug: true,
plugins: [
new webpack.optimize.DedupePlugin(),
new StringReplacePlugin()
]
}
devtool: 'source-map',
plugins: [
new Clean(['dist']),
new webpack.optimize.AggressiveMergingPlugin(),
new StringReplacePlugin(),
new webpack.optimize.MinChunkSizePlugin({ minChunkSize: 10000 }),
new webpack.optimize.UglifyJsPlugin({
sourceMap: true,
compress: {
warnings: false
}
}),
new webpack.BannerPlugin({
banner: '/** \n' +
' *\t '+pkg.name+' v'+pkg.version+' by '+pkg.author.name+'\n' +
' *\t build date: '+ new Date().toISOString() +' \n' +
' *\t MIT License \n' +
' */ \n',
raw: true
})
]
};

18
webpack.dev.config.js Normal file
View file

@ -0,0 +1,18 @@
var webpackConfig = require('./webpack.config.js');
var webpack = require('webpack');
var StringReplacePlugin = require('string-replace-webpack-plugin');
module.exports = {
cache: true,
entry: webpackConfig.entry,
output: webpackConfig.output,
resolve: webpackConfig.resolve,
module: webpackConfig.module,
devtool: 'source-map',
plugins: [
new webpack.LoaderOptionsPlugin({
debug: true
}),
new StringReplacePlugin()
]
};

View file

@ -1,51 +1,41 @@
var webpack = require('webpack');
var webpackConfig = require('./webpack.config.js');
var path = require('path');
var Clean = require('clean-webpack-plugin');
var StringReplacePlugin = require('string-replace-webpack-plugin');
var fs = require('fs');
var pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
module.exports = {
cache: true,
entry: webpackConfig.entry,
output: webpackConfig.output,
resolve: webpackConfig.resolve,
isparta: {
embedSource: true,
noAutoWrap: true,
babel: {
compact: false,
presets: ['es2015'],
plugins: [['transform-es2015-classes', {loose: true}]]
}
},
module: {
loaders: [
rules: [
{
test: /\.js$/,
include: path.join(__dirname, 'src'),
exclude: /tablefilter\/node_modules/,
loader: 'isparta'
},
{
test: path.join(__dirname, 'src'),
loader: StringReplacePlugin.replace({
replacements: [{
pattern: /{VERSION}/ig,
replacement: function () {
return pkg.version;
}
},{
pattern: /{AUTHOR}/ig,
replacement: function () {
return pkg.author.name;
}
}]
})
loader: 'isparta-loader'
}
]
// TODO: re-instate StringReplacePlugin, currently failing
// in conjunction with 'isparta-loader'
},
devtool: 'sourcemap',
debug: true,
plugins: [new Clean(['dist'])].concat(webpackConfig.dev.plugins)
devtool: 'source-map',
plugins: [
new Clean(['dist']),
new webpack.LoaderOptionsPlugin({
debug: true,
options: {
isparta: {
embedSource: true,
noAutoWrap: true,
babel: {
compact: false,
presets: ['es2015'],
plugins: [['transform-es2015-classes', {loose: true}]]
}
}
}
})
]
};