1
0
Fork 0
mirror of https://github.com/koalyptus/TableFilter.git synced 2024-05-21 15:56:40 +02:00

Merge pull request #535 from koalyptus/rows-iterator

Rows iterator
This commit is contained in:
koalyptus 2017-12-03 22:07:15 +11:00 committed by GitHub
commit 7cf9be1342
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
18 changed files with 394 additions and 248 deletions

4
dist/starter.html vendored
View file

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

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.6.3 by Max Guglielmi
* build date: 2017-11-30T02:49:15.523Z
* tablefilter v0.6.4 by Max Guglielmi
* build date: 2017-12-03T10:41:49.995Z
* 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.6.3 by Max Guglielmi
* build date: 2017-11-30T02:49:15.523Z
* tablefilter v0.6.4 by Max Guglielmi
* build date: 2017-12-03T10:41:49.995Z
* 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.6.3 by Max Guglielmi
* build date: 2017-11-30T02:49:15.523Z
* tablefilter v0.6.4 by Max Guglielmi
* build date: 2017-12-03T10:41:49.995Z
* MIT License
*/
.activeHeader{background-color:#66afe9 !important;color:#fff !important}.activeCell{background-color:rgba(0,0,0,0.075)}

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.6.3 by Max Guglielmi
* build date: 2017-11-30T02:49:15.523Z
* tablefilter v0.6.4 by Max Guglielmi
* build date: 2017-12-03T10:41:49.995Z
* 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.6.3 by Max Guglielmi
* build date: 2017-11-30T02:49:15.523Z
* tablefilter v0.6.4 by Max Guglielmi
* build date: 2017-12-03T10:41:49.995Z
* 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.6.3 by Max Guglielmi
* build date: 2017-11-30T02:49:15.523Z
* tablefilter v0.6.4 by Max Guglielmi
* build date: 2017-12-03T10:41:49.995Z
* 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.6.3 by Max Guglielmi
* build date: 2017-11-30T02:49:15.523Z
* tablefilter v0.6.4 by Max Guglielmi
* build date: 2017-12-03T10:41:49.995Z
* 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

View file

@ -1,6 +1,6 @@
/**
* tablefilter v0.6.3 by Max Guglielmi
* build date: 2017-11-30T02:49:15.503Z
* tablefilter v0.6.4 by Max Guglielmi
* build date: 2017-12-03T10:41:49.979Z
* MIT License
*/

View file

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

View file

@ -123,10 +123,9 @@ export class AlternateRows extends Feature {
if (!this.initialized) {
return;
}
let nbRows = this.tf.getRowsNb(true);
for (let i = 0; i < nbRows; i++) {
this.removeRowBg(i);
}
let eachRow = this.tf.eachRow(0);
eachRow((row, i) => this.removeRowBg(i));
// Unsubscribe to events
this.emitter.off(['row-processed', 'row-paged'],

View file

@ -190,7 +190,7 @@ export class CheckList extends BaseDropdown {
*/
build(colIndex, isLinked = false) {
let tf = this.tf;
colIndex = parseInt(colIndex, 10);
colIndex = Number(colIndex);
this.emitter.emit('before-populating-filter', tf, colIndex);
@ -205,8 +205,6 @@ export class CheckList extends BaseDropdown {
['colIndex', colIndex]);
ul.className = this.filterCssClass;
let rows = tf.dom().rows;
let nbRows = tf.getRowsNb(true);
let caseSensitive = tf.caseSensitive;
/** @inherited */
this.isCustom = tf.isCustomOptions(colIndex);
@ -233,51 +231,44 @@ export class CheckList extends BaseDropdown {
flt.innerHTML = '';
for (let k = tf.refRow; k < nbRows; k++) {
// always visible rows don't need to appear on selects as always
// valid
if (tf.excludeRows.indexOf(k) !== -1) {
continue;
}
let cells = rows[k].cells;
let ncells = cells.length;
// checks if row has exact cell #
if (ncells !== tf.nbCells || this.isCustom) {
continue;
}
if (isLinked && !this.isValidLinkedValue(k, activeIdx)) {
continue;
}
// this loop retrieves cell data
for (let j = 0; j < ncells; j++) {
if (colIndex !== j) {
continue;
}
let cellValue = tf.getCellValue(cells[j]);
let eachRow = tf.eachRow();
eachRow(
(row) => {
let cellValue = tf.getCellValue(row.cells[colIndex]);
//Vary Peter's patch
let cellString = matchCase(cellValue, caseSensitive);
// checks if celldata is already in array
if (!has(this.opts, cellString, caseSensitive)) {
this.opts.push(cellValue);
}
let filteredCol = filteredDataCol[j];
let filteredCol = filteredDataCol[colIndex];
if (isLinked && tf.disableExcludedOptions) {
if (!filteredCol) {
filteredCol = tf.getVisibleColumnValues(j);
filteredCol = tf.getVisibleColumnValues(colIndex);
}
if (!has(filteredCol, cellString, caseSensitive) &&
!has(this.excludedOpts, cellString,
caseSensitive)) {
!has(this.excludedOpts, cellString, caseSensitive)) {
this.excludedOpts.push(cellValue);
}
}
},
// continue conditions function
(row, k) => {
// excluded rows don't need to appear on selects as always valid
if (tf.excludeRows.indexOf(k) !== -1) {
return true;
}
// checks if row has expected number of cells
if (row.cells.length !== tf.nbCells || this.isCustom) {
return true;
}
if (isLinked && !this.isValidLinkedValue(k, activeIdx)) {
return true;
}
}
}
);
//sort options
this.opts = this.sortOptions(colIndex, this.opts);

View file

@ -148,7 +148,7 @@ export class Dropdown extends BaseDropdown {
*/
build(colIndex, isLinked = false) {
let tf = this.tf;
colIndex = parseInt(colIndex, 10);
colIndex = Number(colIndex);
this.emitter.emit('before-populating-filter', tf, colIndex);
@ -157,10 +157,7 @@ export class Dropdown extends BaseDropdown {
/** @inherited */
this.optsTxt = [];
let slcId = tf.fltIds[colIndex];
let slc = elm(slcId);
let rows = tf.dom().rows;
let nbRows = tf.getRowsNb(true);
let slc = tf.getFilterElement(colIndex);
//custom select test
/** @inherited */
@ -187,34 +184,12 @@ export class Dropdown extends BaseDropdown {
filteredDataCol = [];
}
for (let k = tf.refRow; k < nbRows; k++) {
// always visible rows don't need to appear on selects as always
// valid
if (tf.excludeRows.indexOf(k) !== -1) {
continue;
}
let cell = rows[k].cells,
nchilds = cell.length;
// checks if row has exact cell #
if (nchilds !== tf.nbCells || this.isCustom) {
continue;
}
if (isLinked && !this.isValidLinkedValue(k, activeIdx)) {
continue;
}
// this loop retrieves cell data
for (let j = 0; j < nchilds; j++) {
if (colIndex !== j) {
continue;
}
let cellValue = tf.getCellValue(cell[j]),
//Vary Peter's patch
cellString = matchCase(cellValue, tf.caseSensitive);
let eachRow = tf.eachRow();
eachRow(
(row) => {
let cellValue = tf.getCellValue(row.cells[colIndex]);
//Vary Peter's patch
let cellString = matchCase(cellValue, tf.caseSensitive);
// checks if celldata is already in array
if (!has(this.opts, cellString, tf.caseSensitive)) {
@ -222,17 +197,33 @@ export class Dropdown extends BaseDropdown {
}
if (isLinked && tf.disableExcludedOptions) {
let filteredCol = filteredDataCol[j];
let filteredCol = filteredDataCol[colIndex];
if (!filteredCol) {
filteredCol = tf.getVisibleColumnValues(j);
filteredCol = tf.getVisibleColumnValues(colIndex);
}
if (!has(filteredCol, cellString, tf.caseSensitive) &&
!has(excludedOpts, cellString, tf.caseSensitive)) {
excludedOpts.push(cellValue);
}
}
}//for j
}//for k
},
// continue conditions function
(row, k) => {
// excluded rows don't need to appear on selects as always valid
if (tf.excludeRows.indexOf(k) !== -1) {
return true;
}
// checks if row has expected number of cells
if (row.cells.length !== tf.nbCells || this.isCustom) {
return true;
}
if (isLinked && !this.isValidLinkedValue(k, activeIdx)) {
return true;
}
}
);
//sort options
this.opts = this.sortOptions(colIndex, this.opts);

View file

@ -1292,10 +1292,10 @@ export class TableFilter {
__webpack_public_path__ = this.basePath;
this.emitter.emit('before-loading-extensions', this);
for (let i = 0, len = exts.length; i < len; i++) {
let ext = exts[i];
exts.forEach((ext) => {
this.loadExtension(ext);
}
});
this.emitter.emit('after-loading-extensions', this);
}
@ -1308,8 +1308,7 @@ export class TableFilter {
return;
}
let name = ext.name;
let path = ext.path;
let {name, path} = ext;
let modulePath;
if (name && path) {
@ -1384,24 +1383,21 @@ export class TableFilter {
let defaultTheme = { name: 'default' };
this.themes.push(defaultTheme);
}
if (isArray(themes)) {
for (let i = 0, len = themes.length; i < len; i++) {
let theme = themes[i];
let name = theme.name;
let path = theme.path;
let styleId = this.prfxTf + name;
if (name && !path) {
path = this.themesPath + name + '/' + name + '.css';
}
else if (!name && theme.path) {
name = 'theme{0}'.replace('{0}', i);
}
if (!this.isImported(path, 'link')) {
this.import(styleId, path, null, 'link');
}
themes.forEach((theme, i) => {
let {name, path} = theme;
let styleId = this.prfxTf + name;
if (name && !path) {
path = this.themesPath + name + '/' + name + '.css';
}
}
else if (!name && theme.path) {
name = 'theme{0}'.replace('{0}', i);
}
if (!this.isImported(path, 'link')) {
this.import(styleId, path, null, 'link');
}
});
// Enable loader indicator
this.loader = true;
@ -1468,15 +1464,13 @@ export class TableFilter {
if (!this.isExternalFlt()) {
return;
}
let ids = this.externalFltTgtIds,
len = ids.length;
for (let ct = 0; ct < len; ct++) {
let externalFltTgtId = ids[ct],
externalFlt = elm(externalFltTgtId);
let ids = this.externalFltTgtIds;
ids.forEach((id) => {
let externalFlt = elm(id);
if (externalFlt) {
externalFlt.innerHTML = '';
}
}
});
}
/**
@ -1536,113 +1530,111 @@ export class TableFilter {
this.onBeforeFilter(this);
this.emitter.emit('before-filtering', this);
let row = this.dom().rows,
nbRows = this.getRowsNb(true),
hiddenRows = 0;
let hiddenRows = 0;
this.validRowsIndex = [];
// search args re-init
// search args
let searchArgs = this.getFiltersValue();
for (let k = this.refRow; k < nbRows; k++) {
// already filtered rows display re-init
row[k].style.display = '';
let eachRow = this.eachRow();
eachRow(
(row, k) => {
// already filtered rows display re-init
row.style.display = '';
let cells = row[k].cells;
let nchilds = cells.length;
let cells = row.cells;
let nbCells = cells.length;
// checks if row has exact cell #
if (nchilds !== this.nbCells) {
continue;
}
let occurence = [],
isRowValid = true,
//only for single filter search
singleFltRowValid = false;
let occurence = [],
isRowValid = true,
//only for single filter search
singleFltRowValid = false;
// this loop retrieves cell data
for (let j = 0; j < nbCells; j++) {
//searched keyword
let sA = searchArgs[this.singleSearchFlt ? 0 : j];
// this loop retrieves cell data
for (let j = 0; j < nchilds; j++) {
//searched keyword
let sA = searchArgs[this.singleSearchFlt ? 0 : j];
if (sA === '') {
continue;
}
let cellValue = matchCase(this.getCellValue(cells[j]),
this.caseSensitive);
//multiple search parameter operator ||
let sAOrSplit = sA.toString().split(this.orOperator),
//multiple search || parameter boolean
hasMultiOrSA = sAOrSplit.length > 1,
//multiple search parameter operator &&
sAAndSplit = sA.toString().split(this.anOperator),
//multiple search && parameter boolean
hasMultiAndSA = sAAndSplit.length > 1;
//detect operators or array query
if (isArray(sA) || hasMultiOrSA || hasMultiAndSA) {
let cS,
s,
occur = false;
if (isArray(sA)) {
s = sA;
} else {
s = hasMultiOrSA ? sAOrSplit : sAAndSplit;
if (sA === '') {
continue;
}
// isolate search term and check occurence in cell data
for (let w = 0, len = s.length; w < len; w++) {
cS = trim(s[w]);
occur = this._match(cS, cellValue, j);
if (occur) {
let cellValue = matchCase(this.getCellValue(cells[j]),
this.caseSensitive);
//multiple search parameter operator ||
let sAOrSplit = sA.toString().split(this.orOperator),
//multiple search || parameter boolean
hasMultiOrSA = sAOrSplit.length > 1,
//multiple search parameter operator &&
sAAndSplit = sA.toString().split(this.anOperator),
//multiple search && parameter boolean
hasMultiAndSA = sAAndSplit.length > 1;
//detect operators or array query
if (isArray(sA) || hasMultiOrSA || hasMultiAndSA) {
let cS,
s,
occur = false;
if (isArray(sA)) {
s = sA;
} else {
s = hasMultiOrSA ? sAOrSplit : sAAndSplit;
}
// isolate search term and check occurence in cell data
for (let w = 0, len = s.length; w < len; w++) {
cS = trim(s[w]);
occur = this._match(cS, cellValue, j);
if (occur) {
this.emitter.emit('highlight-keyword', this,
cells[j], cS);
}
if ((hasMultiOrSA && occur) ||
(hasMultiAndSA && !occur)) {
break;
}
if (isArray(sA) && occur) {
break;
}
}
occurence[j] = occur;
}
//single search parameter
else {
occurence[j] = this._match(trim(sA), cellValue, j);
if (occurence[j]) {
this.emitter.emit('highlight-keyword', this,
cells[j], cS);
}
if ((hasMultiOrSA && occur) ||
(hasMultiAndSA && !occur)) {
break;
}
if (isArray(sA) && occur) {
break;
cells[j], sA);
}
}
occurence[j] = occur;
}
//single search parameter
else {
occurence[j] = this._match(trim(sA), cellValue, j);
if (occurence[j]) {
this.emitter.emit('highlight-keyword', this, cells[j],
sA);
if (!occurence[j]) {
isRowValid = false;
}
if (this.singleSearchFlt && occurence[j]) {
singleFltRowValid = true;
}
}//else single param
if (!occurence[j]) {
isRowValid = false;
}
if (this.singleSearchFlt && occurence[j]) {
singleFltRowValid = true;
this.emitter.emit('cell-processed', this, j, cells[j]);
}//for j
if (this.singleSearchFlt && singleFltRowValid) {
isRowValid = true;
}
this.emitter.emit('cell-processed', this, j, cells[j]);
}//for j
this.validateRow(k, isRowValid);
if (!isRowValid) {
hiddenRows++;
}
if (this.singleSearchFlt && singleFltRowValid) {
isRowValid = true;
}
this.validateRow(k, isRowValid);
if (!isRowValid) {
hiddenRows++;
}
this.emitter.emit('row-processed', this, k,
this.validRowsIndex.length, isRowValid);
}// for k
this.emitter.emit('row-processed', this, k,
this.validRowsIndex.length, isRowValid);
},
// continue condition
(row) => row.cells.length !== this.nbCells
);
this.nbHiddenRows = hiddenRows;
@ -1924,8 +1916,6 @@ export class TableFilter {
typed = false,
exclude = []
) {
let row = this.dom().rows;
let nbRows = this.getRowsNb(true);
let colValues = [];
let getContent = typed ? this.getCellData.bind(this) :
this.getCellValue.bind(this);
@ -1934,21 +1924,18 @@ export class TableFilter {
colValues.push(this.getHeadersText()[colIndex]);
}
for (let i = this.refRow; i < nbRows; i++) {
let isExludedRow = false;
let eachRow = this.eachRow();
eachRow((row, i) => {
// checks if current row index appears in exclude array
if (exclude.length > 0) {
isExludedRow = exclude.indexOf(i) !== -1;
}
let cell = row[i].cells,
nchilds = cell.length;
let isExludedRow = exclude.indexOf(i) !== -1;
let cells = row.cells;
// checks if row has exact cell # and is not excluded
if (nchilds === this.nbCells && !isExludedRow) {
let data = getContent(cell[colIndex]);
if (cells.length === this.nbCells && !isExludedRow) {
let data = getContent(cells[colIndex]);
colValues.push(data);
}
}
});
return colValues;
}
@ -1998,14 +1985,15 @@ export class TableFilter {
return;
}
let searchArgs = [];
for (let i = 0, len = this.fltIds.length; i < len; i++) {
this.fltIds.forEach((id, i) => {
let fltValue = this.getFilterValue(i);
if (isArray(fltValue)) {
searchArgs.push(fltValue);
} else {
searchArgs.push(trim(fltValue));
}
}
});
return searchArgs;
}
@ -2176,8 +2164,6 @@ export class TableFilter {
excludeHiddenCols = false,
typed = false
) {
let rows = this.dom().rows;
let nbRows = this.getRowsNb(true);
let tblData = [];
let getContent = typed ? this.getCellData.bind(this) :
this.getCellValue.bind(this);
@ -2186,20 +2172,22 @@ export class TableFilter {
let headers = this.getHeadersText(excludeHiddenCols);
tblData.push([this.getHeadersRowIndex(), headers]);
}
for (let k = this.refRow; k < nbRows; k++) {
let eachRow = this.eachRow();
eachRow((row, k) => {
let rowData = [k, []];
let cells = rows[k].cells;
let cells = row.cells;
for (let j = 0, len = cells.length; j < len; j++) {
if (excludeHiddenCols && this.hasExtension('colsVisibility')) {
if (this.extension('colsVisibility').isColHidden(j)) {
continue;
}
}
let cellValue = getContent(cells[j]);
rowData[1].push(cellValue);
let cellContent = getContent(cells[j]);
rowData[1].push(cellContent);
}
tblData.push(rowData);
}
});
return tblData;
}
@ -2663,9 +2651,8 @@ export class TableFilter {
slcIndex = slcA1.concat(slcA2);
slcIndex = slcIndex.concat(slcA3);
for (let i = 0, len = slcIndex.length; i < len; i++) {
let colIdx = slcIndex[i];
let curSlc = elm(this.fltIds[colIdx]);
slcIndex.forEach((colIdx) => {
let curSlc = this.getFilterElement(colIdx);
let slcSelectedValue = this.getFilterValue(colIdx);
//1st option needs to be inserted
@ -2684,7 +2671,7 @@ export class TableFilter {
}
this.setFilterValue(colIdx, slcSelectedValue);
}
});
}
/**
@ -2764,6 +2751,28 @@ export class TableFilter {
}
}
/**
* Rows iterator starting from supplied row index or defaulting to reference
* row index. Closure function accepts a callback function and optional
* continue and break callbacks.
* @param {Number} startIdx Row index from which filtering starts
*/
eachRow(startIdx = this.refRow) {
return (fn = EMPTY_FN, continueFn = EMPTY_FN, breakFn = EMPTY_FN) => {
let rows = this.dom().rows;
let len = this.getRowsNb(true);
for (let i = startIdx; i < len; i++) {
if (continueFn(rows[i], i) === true) {
continue;
}
if (breakFn(rows[i], i) === true) {
break;
}
fn(rows[i], i);
}
};
}
/**
* Check if passed script or stylesheet is already imported
* @param {String} filePath Ressource path
@ -2825,7 +2834,7 @@ export class TableFilter {
}
}
};
file.onerror = function () {
file.onerror = () => {
throw new Error(`TableFilter could not load: ${filePath}`);
};
head.appendChild(file);
@ -2857,21 +2866,21 @@ export class TableFilter {
return this.validRowsIndex;
}
let nbRows = this.getRowsNb(true);
this.validRowsIndex = [];
for (let k = this.refRow; k < nbRows; k++) {
let r = this.dom().rows[k];
let eachRow = this.eachRow();
eachRow((row) => {
if (!this.paging) {
if (this.getRowDisplay(r) !== NONE) {
this.validRowsIndex.push(r.rowIndex);
if (this.getRowDisplay(row) !== NONE) {
this.validRowsIndex.push(row.rowIndex);
}
} else {
if (r.getAttribute('validRow') === 'true' ||
r.getAttribute('validRow') === null) {
this.validRowsIndex.push(r.rowIndex);
if (row.getAttribute('validRow') === 'true' ||
row.getAttribute('validRow') === null) {
this.validRowsIndex.push(row.rowIndex);
}
}
}
});
return this.validRowsIndex;
}

View file

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

61
test/test-uneven-rows.js Normal file
View file

@ -0,0 +1,61 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/'
});
tf.init();
module('filtering');
test('ignore uneven rows', function() {
// act
tf.setFilterValue(1, 'Perth');
tf.filter();
// assert
deepEqual(tf.getValidRows(), [9], 'uneven row');
deepEqual(tf.getRowDisplay(tf.dom().rows[4]), '', 'uneven row displayed');
deepEqual(tf.getRowDisplay(tf.dom().rows[5]), '', 'uneven row displayed');
deepEqual(tf.getRowDisplay(tf.dom().rows[5]), '', 'uneven row displayed');
});
test('display uneven rows when no matches', function() {
// act
tf.clearFilters();
tf.setFilterValue(0, '123');
tf.filter();
// assert
deepEqual(tf.getValidRows(), [], 'uneven row');
deepEqual(tf.getRowDisplay(tf.dom().rows[4]), '', 'uneven row displayed');
deepEqual(tf.getRowDisplay(tf.dom().rows[5]), '', 'uneven row displayed');
deepEqual(tf.getRowDisplay(tf.dom().rows[5]), '', 'uneven row displayed');
});
module('re-initialise');
test('can re-initialise', function() {
// act
tf.destroy();
tf.init();
// assert
deepEqual(tf.isInitialized(), true, 'Filters re-initialised');
});
test('can filter', function() {
// act
tf.setFilterValue(1, 'Perth');
tf.filter();
// assert
deepEqual(tf.getValidRows(), [9], 'uneven row');
deepEqual(tf.getRowDisplay(tf.dom().rows[4]), '', 'uneven row displayed');
deepEqual(tf.getRowDisplay(tf.dom().rows[5]), '', 'uneven row displayed');
deepEqual(tf.getRowDisplay(tf.dom().rows[5]), '', 'uneven row displayed');
});
module('tear-down');
test('can destroy', function() {
// act
tf.destroy();
// assert
deepEqual(tf.isInitialized(), false, 'Filters removed');
});