1
0
Fork 0
mirror of https://github.com/koalyptus/TableFilter.git synced 2026-03-18 00:19:50 +01:00

Merge pull request #522 from koalyptus/519-tbody-working-rows

519 tbody working rows
This commit is contained in:
koalyptus 2017-10-26 14:08:20 +11:00 committed by GitHub
commit 175a23934f
23 changed files with 466 additions and 83 deletions

4
dist/starter.html vendored
View file

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

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.5.43 by Max Guglielmi
* build date: 2017-10-09T10:51:27.062Z
* tablefilter v0.6.0 by Max Guglielmi
* build date: 2017-10-26T02:27:39.033Z
* 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:inherit;}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-type: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.5.43 by Max Guglielmi
* build date: 2017-10-09T10:51:27.062Z
* tablefilter v0.6.0 by Max Guglielmi
* build date: 2017-10-26T02:27:39.033Z
* 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.5.43 by Max Guglielmi
* build date: 2017-10-09T10:51:27.062Z
* tablefilter v0.6.0 by Max Guglielmi
* build date: 2017-10-26T02:27:39.033Z
* MIT License
*/
.activeHeader{background-color:#66afe9 !important;color:#fff !important}

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.5.43 by Max Guglielmi
* build date: 2017-10-09T10:51:27.062Z
* tablefilter v0.6.0 by Max Guglielmi
* build date: 2017-10-26T02:27:39.033Z
* 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.5.43 by Max Guglielmi
* build date: 2017-10-09T10:51:27.062Z
* tablefilter v0.6.0 by Max Guglielmi
* build date: 2017-10-26T02:27:39.033Z
* 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.5.43 by Max Guglielmi
* build date: 2017-10-09T10:51:27.062Z
* tablefilter v0.6.0 by Max Guglielmi
* build date: 2017-10-26T02:27:39.033Z
* 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.5.43 by Max Guglielmi
* build date: 2017-10-09T10:51:27.062Z
* tablefilter v0.6.0 by Max Guglielmi
* build date: 2017-10-26T02:27:39.033Z
* 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

View file

@ -1,6 +1,6 @@
{
"name": "tablefilter",
"version": "0.5.43",
"version": "0.6.0",
"description": "A Javascript library making HTML tables filterable and a bit more",
"license": "MIT",
"author": {

View file

@ -236,7 +236,7 @@ export class CheckList extends BaseDropdown {
for (let k = tf.refRow; k < nbRows; k++) {
// always visible rows don't need to appear on selects as always
// valid
if (tf.hasVisibleRows && tf.visibleRows.indexOf(k) !== -1) {
if (tf.excludeRows.indexOf(k) !== -1) {
continue;
}

View file

@ -190,7 +190,7 @@ export class Dropdown extends BaseDropdown {
for (let k = tf.refRow; k < nbRows; k++) {
// always visible rows don't need to appear on selects as always
// valid
if (tf.hasVisibleRows && tf.visibleRows.indexOf(k) !== -1) {
if (tf.excludeRows.indexOf(k) !== -1) {
continue;
}

View file

@ -6,7 +6,8 @@ import {
import {contains, matchCase, rgxEsc, trim} from './string';
import {isEmpty as isEmptyString} from './string';
import {
isArray, isEmpty, isFn, isNumber, isObj, isString, isUndef, EMPTY_FN
isArray, isEmpty, isFn, isNumber, isObj, isString, isUndef, EMPTY_FN,
isBoolean
} from './types';
import {parse as parseNb} from './number';
import {
@ -365,16 +366,18 @@ export class TableFilter {
this.activeFilterId = null;
/**
* Enable/disable always visible rows, excluded from filtering
* Determine if there are excluded rows from filtering
* @type {Boolean}
* @private
*/
this.hasVisibleRows = Boolean(f.rows_always_visible);
this.hasExcludedRows = Boolean(isArray(f.exclude_rows) &&
f.exclude_rows.length > 0);
/**
* List of row indexes to be excluded from filtering
* @type {Array}
*/
this.visibleRows = this.hasVisibleRows ? f.rows_always_visible : [];
this.excludeRows = defaultsArr(f.exclude_rows, []);
/**
* List of containers IDs where external filters will be generated
@ -999,7 +1002,7 @@ export class TableFilter {
}//if this.fltGrid
/* Features */
if (this.hasVisibleRows) {
if (this.hasExcludedRows) {
this.emitter.on(['after-filtering'],
() => this.enforceVisibility());
this.enforceVisibility();
@ -1440,7 +1443,7 @@ export class TableFilter {
}
// unsubscribe to events
if (this.hasVisibleRows) {
if (this.hasExcludedRows) {
emitter.off(['after-filtering'], () => this.enforceVisibility());
}
if (this.linkedFilters) {
@ -1888,7 +1891,7 @@ export class TableFilter {
* Return the data of a specified column
* @param {Number} colIndex Column index
* @param {Boolean} [includeHeaders=false] Include headers row
* @param {Arrat} [exclude=[]] List of row indexes to be excluded
* @param {Array} [exclude=[]] List of row indexes to be excluded
* @return Flat list of data for a column
*/
getColumnData(colIndex, includeHeaders = false, exclude = []) {
@ -1899,7 +1902,7 @@ export class TableFilter {
* Return the values of a specified column
* @param {Number} colIndex Column index
* @param {Boolean} [includeHeaders=false] Include headers row
* @param {Arrat} [exclude=[]] List of row indexes to be excluded
* @param {Array} [exclude=[]] List of row indexes to be excluded
* @return Flat list of values for a column
*/
getColumnValues(colIndex, includeHeaders = false, exclude = []) {
@ -2063,17 +2066,29 @@ export class TableFilter {
}
/**
* Return the number of filterable rows starting from reference row if
* Return the number of working rows starting from reference row if
* defined
* @param {Boolean} includeHeaders Include the headers row
* @return {Number} Number of filterable rows
* @param {Boolean} includeHeaders Include the headers row(s)
* @return {Number} Number of working rows
*/
getRowsNb(includeHeaders) {
let s = includeHeaders === true ? 0 : this.refRow;
let ntrs = this.dom().rows.length;
return parseInt(ntrs - s, 10);
let nbRows = this.getWorkingRows().length;
if (this.dom().tHead) {
return includeHeaders ?
nbRows + this.dom().querySelectorAll('thead > tr').length :
nbRows;
}
return includeHeaders ? nbRows : nbRows - this.refRow;
}
/**
* Return the collection of the working rows, that is, the rows belonging
* to the tbody section(s)
* @returns {Array}
*/
getWorkingRows() {
return [].slice.call(this.dom().querySelectorAll('tbody > tr'));
}
/**
* Return the text content of a given cell
@ -2393,12 +2408,12 @@ export class TableFilter {
*/
validateRow(rowIndex, isValid) {
let row = this.dom().rows[rowIndex];
if (!row || typeof isValid !== 'boolean') {
if (!row || !isBoolean(isValid)) {
return;
}
// always visible rows are valid
if (this.hasVisibleRows && this.visibleRows.indexOf(rowIndex) !== -1) {
if (this.excludeRows.indexOf(rowIndex) !== -1) {
isValid = true;
}
@ -2416,7 +2431,6 @@ export class TableFilter {
}
this.onRowValidated(this, rowIndex);
this.emitter.emit('row-validated', this, rowIndex);
}
}
@ -2522,12 +2536,12 @@ export class TableFilter {
* Make defined rows always visible
*/
enforceVisibility() {
if (!this.hasVisibleRows) {
if (!this.hasExcludedRows) {
return;
}
let nbRows = this.getRowsNb(true);
for (let i = 0, len = this.visibleRows.length; i < len; i++) {
let row = this.visibleRows[i];
for (let i = 0, len = this.excludeRows.length; i < len; i++) {
let row = this.excludeRows[i];
//row index cannot be > nrows
if (row <= nbRows) {
this.validateRow(row, true);

View file

@ -2,7 +2,7 @@
<html>
<head>
<meta charset="utf-8">
<title>TableFilter always visible rows tests</title>
<title>TableFilter excluded rows tests</title>
<link rel="stylesheet" href="libs/qunit/qunit.css">
<script src="libs/qunit/qunit.js"></script>
<script src="libs/polyfill.js"></script>
@ -84,7 +84,7 @@
</table>
<script src="../dist/tablefilter/tablefilter.js"></script>
<script src="test-always-visible-rows.js"></script>
<script src="test-excluded-rows.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>

View file

@ -1,47 +1,48 @@
(function(win, TableFilter){
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
rows_always_visible: [4, 9]
exclude_rows: [4, 9]
});
tf.init();
module('Sanity checks');
test('Always visible rows', function() {
test('Excluded rows', function() {
deepEqual(tf instanceof TableFilter, true, 'TableFilter type');
deepEqual(tf.hasVisibleRows, true, 'Contains always visible rows');
deepEqual(tf.hasExcludedRows, true, 'Has excluded rows');
deepEqual(tf.excludeRows, [4, 9], 'Excluded rows');
});
module('Behaviour');
test('for filtered table', function() {
tf.setFilterValue(0, 'Hello');
tf.filter();
var alwaysVisibleRow1 = tf.dom().rows[4];
var alwaysVisibleRow2 = tf.dom().rows[9];
var excludedRow1 = tf.dom().rows[4];
var excludedRow2 = tf.dom().rows[9];
deepEqual(
tf.getRowDisplay(alwaysVisibleRow1),
tf.getRowDisplay(excludedRow1),
'',
'Row display for alwaysVisibleRow1'
'Row display for excludedRow1'
);
deepEqual(
tf.getRowDisplay(alwaysVisibleRow2),
tf.getRowDisplay(excludedRow2),
'',
'Row display for alwaysVisibleRow2'
'Row display for excludedRow2'
);
});
test('after filters are cleared', function() {
tf.clearFilters();
var alwaysVisibleRow1 = tf.dom().rows[4];
var alwaysVisibleRow2 = tf.dom().rows[9];
var excludedRow1 = tf.dom().rows[4];
var excludedRow2 = tf.dom().rows[9];
deepEqual(
tf.getRowDisplay(alwaysVisibleRow1),
tf.getRowDisplay(excludedRow1),
'',
'Row display for alwaysVisibleRow1'
'Row display for excludedRow1'
);
deepEqual(
tf.getRowDisplay(alwaysVisibleRow2),
tf.getRowDisplay(excludedRow2),
'',
'Row display for alwaysVisibleRow2'
'Row display for excludedRow2'
);
testPaging();
@ -51,7 +52,7 @@
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
rows_always_visible: [4, 9],
exclude_rows: [4, 9],
paging: {
length: 2
}
@ -63,49 +64,49 @@
test('for filtered table', function() {
tf.setFilterValue(0, 'Hello');
tf.filter();
var alwaysVisibleRow1 = tf.dom().rows[4];
var alwaysVisibleRow2 = tf.dom().rows[9];
var excludedRow1 = tf.dom().rows[4];
var excludedRow2 = tf.dom().rows[9];
deepEqual(
tf.getRowDisplay(alwaysVisibleRow1),
tf.getRowDisplay(excludedRow1),
'',
'Row display for alwaysVisibleRow1'
'Row display for excludedRow1'
);
deepEqual(
tf.getRowDisplay(alwaysVisibleRow2),
tf.getRowDisplay(excludedRow2),
'',
'Row display for alwaysVisibleRow2'
'Row display for excludedRow2'
);
});
test('after filters are cleared', function() {
tf.clearFilters();
var alwaysVisibleRow1 = tf.dom().rows[4];
var alwaysVisibleRow2 = tf.dom().rows[9];
var excludedRow1 = tf.dom().rows[4];
var excludedRow2 = tf.dom().rows[9];
deepEqual(
tf.getRowDisplay(alwaysVisibleRow1),
tf.getRowDisplay(excludedRow1),
'none',
'Row display for alwaysVisibleRow1'
'Row display for excludedRow1'
);
deepEqual(
tf.getRowDisplay(alwaysVisibleRow2),
tf.getRowDisplay(excludedRow2),
'none',
'Row display for alwaysVisibleRow2'
'Row display for excludedRow2'
);
});
test('after changing pagination page', function() {
paging.setPage(2);
var alwaysVisibleRow1 = tf.dom().rows[4];
var alwaysVisibleRow2 = tf.dom().rows[9];
var excludedRow1 = tf.dom().rows[4];
var excludedRow2 = tf.dom().rows[9];
deepEqual(
tf.getRowDisplay(alwaysVisibleRow1),
tf.getRowDisplay(excludedRow1),
'',
'Row display for alwaysVisibleRow1'
'Row display for excludedRow1'
);
deepEqual(
tf.getRowDisplay(alwaysVisibleRow2),
tf.getRowDisplay(excludedRow2),
'none',
'Row display for alwaysVisibleRow2'
'Row display for excludedRow2'
);
tf.destroy();

96
test/test-tfoot.html Normal file
View file

@ -0,0 +1,96 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TableFilter tfoot 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>
<tfoot>
<tr>
<td><strong>footer</strong></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
<tr>
<td><strong>footer</strong></td>
<td></td>
<td></td>
<td></td>
<td></td>
</tr>
</tfoot>
<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-tfoot.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

123
test/test-tfoot.js Normal file
View file

@ -0,0 +1,123 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/'
});
tf.init();
module('Sanity checks');
test('tfoot', function() {
deepEqual(tf instanceof TableFilter, true, 'TableFilter instanciated');
deepEqual(tf.getFiltersRowIndex(), 0, 'Filters row index');
deepEqual(tf.refRow, 2, 'Reference row index');
deepEqual(tf.getRowsNb(), 7, 'nb working rows');
deepEqual(tf.getRowsNb(true), 9, 'nb working rows with headers');
notEqual(tf.getFilterElement(0), null, 'Filter element for column 0');
tf.setFilterValue(1, 'Ade');
tf.filter();
deepEqual(tf.getValidRows(), [2], 'Filtered row');
deepEqual(
tf.getVisibleColumnData(0),
['Sydney'],
'Get data API does not include footer'
);
deepEqual(
tf.getFilteredDataCol(0),
['Sydney'],
'Get data API does not include footer'
);
});
test('tfoot with paging', function() {
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
paging: { length: 3 }
});
tf.init();
deepEqual(tf instanceof TableFilter, true, 'TableFilter instanciated');
deepEqual(tf.getFiltersRowIndex(), 0, 'Filters row index');
deepEqual(tf.refRow, 2, 'Reference row index');
deepEqual(tf.getRowsNb(), 7, 'nb working rows');
deepEqual(tf.getRowsNb(true), 9, 'nb working rows with headers');
notEqual(tf.getFilterElement(0), null, 'Filter element for column 0');
tf.setFilterValue(1, 'Ade');
tf.filter();
deepEqual(tf.getValidRows(), [2], 'Filtered row');
deepEqual(tf.getValidRows(), [2], 'Filtered row');
deepEqual(
tf.getVisibleColumnData(0),
['Sydney'],
'Get data API does not include footer'
);
deepEqual(
tf.getFilteredDataCol(0),
['Sydney'],
'Get data API does not include footer'
);
tf.clearFilters();
var paging = tf.feature('paging');
paging.setPage(3);
deepEqual(tf.getRowDisplay(tf.dom().tFoot.rows[0]), '',
'Footer row visible');
deepEqual(tf.getRowDisplay(tf.dom().tFoot.rows[1]), '',
'Footer row visible');
});
test('tfoot with grid-layout', function() {
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
grid_layout: true
});
tf.init();
deepEqual(tf instanceof TableFilter, true, 'TableFilter instanciated');
deepEqual(tf.getFiltersRowIndex(), 1, 'Filters row index');
deepEqual(tf.refRow, 0, 'Reference row index');
deepEqual(tf.getRowsNb(), 7, 'nb working rows');
deepEqual(tf.getRowsNb(true), 7, 'nb working rows with headers');
notEqual(tf.getFilterElement(0), null, 'Filter element for column 0');
tf.setFilterValue(1, 'Ade');
tf.filter();
deepEqual(tf.getValidRows(), [0], 'Filtered row');
tf.setFilterValue(1, 'Ade');
tf.filter();
deepEqual(tf.getValidRows(), [0], 'Filtered row');
deepEqual(
tf.getVisibleColumnData(0),
['Sydney'],
'Get data API does not include footer'
);
deepEqual(
tf.getFilteredDataCol(0),
['Sydney'],
'Get data API does not include footer'
);
deepEqual(tf.getRowDisplay(tf.dom().tFoot.rows[0]), '',
'Footer row visible');
deepEqual(tf.getRowDisplay(tf.dom().tFoot.rows[1]), '',
'Footer row visible');
});
module('Tear-down');
test('TableFilter removed', function() {
tf.clearFilters();
tf.destroy();
deepEqual(tf.isInitialized(), false, 'Filters removed');
});

80
test/test-thead.html Normal file
View file

@ -0,0 +1,80 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TableFilter thead 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-thead.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

69
test/test-thead.js Normal file
View file

@ -0,0 +1,69 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/'
});
tf.init();
module('Sanity checks');
test('thead', function() {
deepEqual(tf instanceof TableFilter, true, 'TableFilter instanciated');
deepEqual(tf.getFiltersRowIndex(), 0, 'Filters row index');
deepEqual(tf.refRow, 2, 'Reference row index');
deepEqual(tf.getRowsNb(), 7, 'nb working rows');
deepEqual(tf.getRowsNb(true), 9, 'nb working rows with headers');
notEqual(tf.getFilterElement(0), null, 'Filter element for column 0');
tf.setFilterValue(1, 'Ade');
tf.filter();
deepEqual(tf.getValidRows(), [2], 'Filtered row');
});
test('thead with paging', function() {
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
paging: { length: 3 }
});
tf.init();
deepEqual(tf instanceof TableFilter, true, 'TableFilter instanciated');
deepEqual(tf.getFiltersRowIndex(), 0, 'Filters row index');
deepEqual(tf.refRow, 2, 'Reference row index');
deepEqual(tf.getRowsNb(), 7, 'nb working rows');
deepEqual(tf.getRowsNb(true), 9, 'nb working rows with headers');
notEqual(tf.getFilterElement(0), null, 'Filter element for column 0');
tf.setFilterValue(1, 'Ade');
tf.filter();
deepEqual(tf.getValidRows(), [2], 'Filtered row');
});
test('thead with grid-layout', function() {
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
grid_layout: true
});
tf.init();
deepEqual(tf instanceof TableFilter, true, 'TableFilter instanciated');
deepEqual(tf.getFiltersRowIndex(), 1, 'Filters row index');
deepEqual(tf.refRow, 0, 'Reference row index');
deepEqual(tf.getRowsNb(), 7, 'nb working rows');
deepEqual(tf.getRowsNb(true), 7, 'nb working rows with headers');
notEqual(tf.getFilterElement(0), null, 'Filter element for column 0');
tf.setFilterValue(1, 'Ade');
tf.filter();
deepEqual(tf.getValidRows(), [0], 'Filtered row');
});
module('Tear-down');
test('TableFilter removed', function() {
tf.clearFilters();
tf.destroy();
deepEqual(tf.isInitialized(), false, 'Filters removed');
});