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

Compare commits

...

116 commits

Author SHA1 Message Date
koalyptus 7afe45f1e6
Merge pull request #787 from koalyptus/dependabot/npm_and_yarn/codecov-3.7.1
Bump codecov from 3.7.0 to 3.7.1
2020-07-22 19:51:17 +10:00
koalyptus 6e01e45dfb prepare dist 2020-07-22 19:45:07 +10:00
dependabot[bot] 12c30629af
Bump codecov from 3.7.0 to 3.7.1
Bumps [codecov](https://github.com/codecov/codecov-node) from 3.7.0 to 3.7.1.
- [Release notes](https://github.com/codecov/codecov-node/releases)
- [Commits](https://github.com/codecov/codecov-node/compare/v3.7.0...v3.7.1)

Signed-off-by: dependabot[bot] <support@github.com>
2020-07-21 12:35:35 +00:00
koalyptus 3e763efac9
Merge pull request #784 from koalyptus/769-refine-empty-cell-logic
769 refine empty nonempty operators logic
2020-06-16 13:03:27 +10:00
koalyptus 825b915ae8 769 refine empty nonempty operators logic 2020-06-16 12:28:12 +10:00
koalyptus 8e48bf2943
Merge pull request #783 from koalyptus/greenkeeper/monorepo.babel7-20200526215451
Update babel7 to the latest version 🚀
2020-06-15 15:20:26 +10:00
koalyptus be7a5e585f prepare dist for 0.7.1 2020-06-15 15:19:11 +10:00
greenkeeper[bot] c44bef22a2
chore(package): update lockfile package-lock.json 2020-05-26 23:57:32 +00:00
greenkeeper[bot] 6dcebbf67e
chore(package): update @babel/preset-env to version 7.10.0 2020-05-26 23:57:28 +00:00
greenkeeper[bot] 44cb6f9124
chore(package): update @babel/core to version 7.10.0 2020-05-26 23:57:25 +00:00
koalyptus 571c31e8da
Merge pull request #780 from koalyptus/772-fix
Fix for #772: help instructions pop-up position with responsive behaviour
2020-05-14 12:58:23 +10:00
koalyptus 8633891fdb add unit tests - prepare dist 2020-05-14 12:40:44 +10:00
koalyptus 8eddc6f35c introduce adjust_container_left_position option in help_instructions configuration 2020-05-13 20:46:23 +10:00
koalyptus 577fb0b90a
Merge pull request #768 from koalyptus/greenkeeper/monorepo.babel7-20200228094136
Update babel7 to the latest version 🚀
2020-05-07 20:56:13 +10:00
Max Guglielmi 88a5bfe425 bump dep - prepare dist 2020-05-07 20:23:53 +10:00
Max Guglielmi cac2900444 prepare dist 2020-05-07 20:21:35 +10:00
greenkeeper[bot] 5dad4dae8e
chore(package): update lockfile package-lock.json 2020-02-28 11:43:33 +00:00
greenkeeper[bot] 134851525c
chore(package): update @babel/preset-env to version 7.8.6 2020-02-28 11:43:28 +00:00
greenkeeper[bot] 9a66748bb8
chore(package): update @babel/core to version 7.8.6 2020-02-28 11:43:25 +00:00
koalyptus c52004421f
Merge pull request #762 from koalyptus/greenkeeper/codecov-3.6.3
Update codecov to the latest version 🚀
2020-02-04 14:16:41 +11:00
koalyptus f53b392c59 prepare dist 2020-02-04 14:03:29 +11:00
koalyptus c496b0916d Merge branch 'master' into greenkeeper/codecov-3.6.3 2020-02-04 13:50:04 +11:00
koalyptus 25b89b19e7
Merge pull request #760 from koalyptus/greenkeeper/monorepo.babel7-20200112133918
Update babel7 to the latest version 🚀
2020-02-03 14:11:32 +11:00
koalyptus 8b4a05be02 prepare dist 2020-02-03 13:50:29 +11:00
koalyptus 1c4961a25b Merge branch 'master' into greenkeeper/monorepo.babel7-20200112133918 2020-02-03 13:35:30 +11:00
greenkeeper[bot] 40daf54768
chore(package): update lockfile package-lock.json 2020-01-31 14:09:11 +00:00
greenkeeper[bot] c43debc7ac
chore(package): update codecov to version 3.6.3 2020-01-31 14:09:07 +00:00
koalyptus 3ac2603e47
Merge pull request #759 from koalyptus/dependabot/npm_and_yarn/handlebars-4.5.3
Bump handlebars from 4.1.2 to 4.5.3
2020-01-14 14:53:40 +11:00
koalyptus 185c119342 prepare dist 2020-01-14 13:44:44 +11:00
koalyptus 80c9b3d734 Merge branch 'master' into dependabot/npm_and_yarn/handlebars-4.5.3 2020-01-14 13:26:01 +11:00
greenkeeper[bot] e8605e5e19
chore(package): update lockfile package-lock.json 2020-01-12 15:47:37 +00:00
greenkeeper[bot] bd95afb3eb
chore(package): update @babel/preset-env to version 7.8.0 2020-01-12 15:47:33 +00:00
greenkeeper[bot] c16f885951
chore(package): update @babel/core to version 7.8.0 2020-01-12 15:47:30 +00:00
koalyptus 6be9ad491f
Merge pull request #758 from koalyptus/greenkeeper/monorepo.babel7-20191219010209
Update babel7 to the latest version 🚀
2020-01-09 09:56:14 +11:00
koalyptus 447a3119aa Prepare dist 2020-01-09 09:44:26 +11:00
dependabot[bot] 2025aa4010
Bump handlebars from 4.1.2 to 4.5.3
Bumps [handlebars](https://github.com/wycats/handlebars.js) from 4.1.2 to 4.5.3.
- [Release notes](https://github.com/wycats/handlebars.js/releases)
- [Changelog](https://github.com/wycats/handlebars.js/blob/master/release-notes.md)
- [Commits](https://github.com/wycats/handlebars.js/compare/v4.1.2...v4.5.3)

Signed-off-by: dependabot[bot] <support@github.com>
2019-12-27 00:16:57 +00:00
greenkeeper[bot] bdc03755e8
chore(package): update lockfile package-lock.json 2019-12-19 02:28:44 +00:00
greenkeeper[bot] 2dceed888e
chore(package): update @babel/preset-env to version 7.7.7 2019-12-19 02:28:40 +00:00
greenkeeper[bot] 982769a020
chore(package): update @babel/core to version 7.7.7 2019-12-19 02:28:37 +00:00
koalyptus 4318826ead
Merge pull request #754 from koalyptus/greenkeeper/monorepo.babel7-20191106233658
Update babel7 to the latest version 🚀
2019-12-09 14:53:11 +11:00
koalyptus 66b8fa9d94 prepare dist: include missing file 2019-12-09 14:46:14 +11:00
koalyptus 79cea3e27f prepare dist + miscellaneous fixes 2019-12-09 14:44:37 +11:00
greenkeeper[bot] 7af493da27
chore(package): update lockfile package-lock.json 2019-11-07 01:41:18 +00:00
greenkeeper[bot] 90c3b7f937
chore(package): update @babel/preset-env to version 7.7.1 2019-11-07 01:41:14 +00:00
greenkeeper[bot] 85dce5847a
chore(package): update @babel/core to version 7.7.2 2019-11-07 01:41:11 +00:00
koalyptus 65863b635a
Merge pull request #753 from koalyptus/greenkeeper/monorepo.babel7-20191105110141
Update babel7 to the latest version 🚀
2019-11-06 14:08:51 +11:00
koalyptus 3c001f52e2 prepare dist 2019-11-06 13:56:55 +11:00
greenkeeper[bot] e3957977b6
chore(package): update lockfile package-lock.json 2019-11-05 14:06:38 +00:00
greenkeeper[bot] 8923c4db94
chore(package): update @babel/preset-env to version 7.7.0 2019-11-05 14:06:34 +00:00
greenkeeper[bot] c7d1a25467
chore(package): update @babel/core to version 7.7.0 2019-11-05 14:06:31 +00:00
koalyptus ebdd817199
Merge pull request #746 from koalyptus/greenkeeper/eslint-6.5.0
Update eslint to the latest version 🚀
2019-10-21 14:28:13 +11:00
koalyptus 27365e25d4 prepare dist 2019-10-21 14:20:42 +11:00
koalyptus 2e960867ab Merge branch 'master' into greenkeeper/eslint-6.5.0 2019-10-21 13:25:34 +11:00
koalyptus 3d35d53005
Merge pull request #745 from koalyptus/greenkeeper/monorepo.babel7-20190923213305
Update babel7 to the latest version 🚀
2019-10-20 17:59:00 +11:00
koalyptus 02bc5e3ae1 fix conflict - prepare dist 2019-10-20 17:32:55 +11:00
koalyptus 09c1f8ff52
Merge pull request #744 from koalyptus/greenkeeper/codecov-3.6.1
Update codecov to the latest version 🚀
2019-10-10 13:50:18 +11:00
koalyptus 6b339f7bd7 merge master in, resolve conflix 2019-10-10 13:38:17 +11:00
koalyptus a1efe26a85 prepare dist 2019-10-10 13:36:03 +11:00
koalyptus 64e6c6597f
Merge pull request #737 from koalyptus/greenkeeper/babel-eslint-10.0.3
Update babel-eslint to the latest version 🚀
2019-09-30 07:58:23 +10:00
koalyptus 9363a7a661 prepare dist 2019-09-30 07:09:32 +10:00
greenkeeper[bot] 41e220efa9
chore(package): update lockfile package-lock.json 2019-09-29 06:24:29 +00:00
greenkeeper[bot] 64d3808a2b
chore(package): update eslint to version 6.5.0 2019-09-29 06:24:25 +00:00
greenkeeper[bot] eb15788965
chore(package): update lockfile package-lock.json 2019-09-23 23:07:35 +00:00
greenkeeper[bot] fede2f6e86
chore(package): update @babel/preset-env to version 7.6.2 2019-09-23 23:07:26 +00:00
greenkeeper[bot] 9738c8ed91
chore(package): update @babel/core to version 7.6.2 2019-09-23 23:07:21 +00:00
greenkeeper[bot] b285d01b54
chore(package): update lockfile package-lock.json 2019-09-20 12:24:13 +00:00
greenkeeper[bot] 37eed72f2c
chore(package): update codecov to version 3.6.1 2019-09-20 12:24:01 +00:00
koalyptus 71103cd04b
Merge pull request #743 from koalyptus/greenkeeper/codecov-3.6.0
Update codecov to the latest version 🚀
2019-09-20 20:01:13 +10:00
koalyptus 42a347550b prepare dist 2019-09-20 19:54:27 +10:00
koalyptus bed04b5b9b Merge remote-tracking branch 'origin/greenkeeper/monorepo.babel7-20190906190906' into greenkeeper/codecov-3.6.0 2019-09-20 19:46:05 +10:00
koalyptus 43fc68df31 Merge remote-tracking branch 'origin/greenkeeper/eslint-6.4.0' into greenkeeper/codecov-3.6.0 2019-09-20 19:45:52 +10:00
greenkeeper[bot] d116525f73
chore(package): update lockfile package-lock.json 2019-09-20 02:31:28 +00:00
greenkeeper[bot] d7ff36514d
chore(package): update codecov to version 3.6.0 2019-09-20 02:31:18 +00:00
greenkeeper[bot] 0d0abf3206
chore(package): update lockfile package-lock.json 2019-09-14 02:14:37 +00:00
greenkeeper[bot] 4cd004e423
chore(package): update eslint to version 6.4.0 2019-09-14 02:14:29 +00:00
greenkeeper[bot] 459829a214
chore(package): update lockfile package-lock.json 2019-09-06 22:27:01 +00:00
greenkeeper[bot] b8c0c1bc3f
chore(package): update @babel/preset-env to version 7.6.0 2019-09-06 22:26:54 +00:00
greenkeeper[bot] 5686e8a470
chore(package): update @babel/core to version 7.6.0 2019-09-06 22:26:48 +00:00
koalyptus b04d4f55ed
Merge pull request #735 from koalyptus/greenkeeper/eslint-6.2.0
Update eslint to the latest version 🚀
2019-09-06 14:26:50 +10:00
koalyptus 3004963058 prepare dist 2019-09-06 14:15:54 +10:00
greenkeeper[bot] 3454187be6
chore(package): update lockfile package-lock.json 2019-08-25 21:33:46 +00:00
greenkeeper[bot] 1dac7736b1
chore(package): update babel-eslint to version 10.0.3 2019-08-25 21:33:28 +00:00
greenkeeper[bot] 2c7ad88346
chore(package): update lockfile package-lock.json 2019-08-18 22:53:24 +00:00
greenkeeper[bot] 6e41c4a8c6
chore(package): update eslint to version 6.2.0 2019-08-18 22:53:09 +00:00
koalyptus 859f6b1eeb
Merge pull request #734 from koalyptus/greenkeeper/uglifyjs-webpack-plugin-2.2.0
Update uglifyjs-webpack-plugin to the latest version 🚀
2019-08-09 14:21:29 +10:00
koalyptus 7204c4b546 prepare dist 2019-08-09 12:24:02 +10:00
greenkeeper[bot] f29b59fdbd chore(package): update lockfile package-lock.json 2019-07-31 12:27:29 +00:00
greenkeeper[bot] 6cc887e806 chore(package): update uglifyjs-webpack-plugin to version 2.2.0 2019-07-31 12:27:24 +00:00
koalyptus f7ad9741ca
Merge pull request #733 from koalyptus/731-upgrade-webpack
731 prepare dist
2019-07-30 13:07:16 +10:00
koalyptus 323a80d1d7 731 prepare dist 2019-07-30 12:59:37 +10:00
koalyptus fc46f0b4ae
Merge pull request #728 from koalyptus/greenkeeper/monorepo.babel7-20190704132520
Update babel7 to the latest version 🚀
2019-07-21 18:44:00 +10:00
koalyptus 0471570985 prepare dist 2019-07-21 18:12:46 +10:00
koalyptus 20243b641f Merge remote-tracking branch 'origin/greenkeeper/eslint-8.0.0' into greenkeeper/monorepo.babel7-20190704132520 2019-07-21 17:21:03 +10:00
koalyptus 99722cbdb0 resolve merge conflicts 2019-07-21 17:20:30 +10:00
koalyptus 64cc6825c5 bump tablefilter version 2019-07-21 17:17:47 +10:00
greenkeeper[bot] bcb541fcad chore(package): update lockfile package-lock.json 2019-07-04 18:45:43 +00:00
greenkeeper[bot] 1c3c1bbb0a chore(package): update @babel/preset-env to version 7.5.0 2019-07-04 18:45:38 +00:00
greenkeeper[bot] bba009c505 chore(package): update @babel/core to version 7.5.0 2019-07-04 18:45:35 +00:00
greenkeeper[bot] 48659ec1d5 chore(package): update lockfile package-lock.json 2019-06-22 04:01:53 +00:00
greenkeeper[bot] 1d32dcea7d chore(package): update eslint to version 6.0.0 2019-06-22 04:01:44 +00:00
greenkeeper[bot] 0e1c617b06 chore(package): update lockfile package-lock.json 2019-06-17 14:21:21 +00:00
greenkeeper[bot] 5c705fe591 chore(package): update babel-eslint to version 10.0.2 2019-06-17 14:21:13 +00:00
koalyptus 3c501e3aef
Merge pull request #722 from koalyptus/716-fix-sort-date-desc
Enhance filter options sorting based on column data type
2019-06-07 21:43:09 +10:00
koalyptus 78ae09c861 Enhance filter options sorting based on column data type 2019-06-07 18:26:33 +10:00
koalyptus 2e1af5efb3
Merge pull request #715 from koalyptus/greenkeeper/uglifyjs-webpack-plugin-2.1.3
Update uglifyjs-webpack-plugin to the latest version 🚀
2019-06-06 11:28:09 +10:00
koalyptus da270df5d6 fix CleanWebpackPlugin webpack plugin upgrade 2019-06-06 11:22:03 +10:00
koalyptus 8a8419bf02 Merge remote-tracking branch 'origin/greenkeeper/clean-webpack-plugin-3.0.0' into greenkeeper/uglifyjs-webpack-plugin-2.1.3 2019-06-06 10:35:09 +10:00
koalyptus a6c24c7885 fix uglifyjs webpack plugin upgrade 2019-06-06 10:33:43 +10:00
koalyptus ed2fef999a Merge branch 'master' into greenkeeper/uglifyjs-webpack-plugin-2.1.3 2019-06-06 10:19:35 +10:00
greenkeeper[bot] 47c66d71bb chore(package): update lockfile package-lock.json 2019-05-30 13:44:30 +00:00
greenkeeper[bot] f99f850c4d chore(package): update clean-webpack-plugin to version 3.0.0 2019-05-30 13:44:24 +00:00
koalyptus 10c06b5100
Merge pull request #720 from koalyptus/714-fix-clear-filter-text
address #714: clear_filter_text
2019-05-24 19:53:01 +10:00
koalyptus 1cc810c341 remove tmp file 2019-05-24 17:08:26 +10:00
koalyptus c707978e19 address #714: clear_filter_text 2019-05-24 17:03:09 +10:00
greenkeeper[bot] 2cd30b1bfb chore(package): update lockfile package-lock.json 2019-05-15 11:23:47 +00:00
greenkeeper[bot] cd5e5589a4 chore(package): update uglifyjs-webpack-plugin to version 2.1.3 2019-05-15 11:23:43 +00:00
28 changed files with 5285 additions and 6463 deletions

View file

@ -14,7 +14,7 @@
"keyword-spacing": ["error", { "after": true, "before": true }],
"max-depth": [2, 7],
"max-statements": [2, 133],
"complexity": [2, 41],
"complexity": [2, 45],
"no-unused-vars": 2,
"no-eval": 2,
"no-underscore-dangle": 0,

View file

@ -13,7 +13,7 @@ module.exports = function (grunt) {
coverage: {
disposeCollector: true,
src: ['dist/tablefilter/*.js'],
instrumentedFiles: 'temp/',
instrumentedFiles: 'report/temp/',
htmlReport: 'report/coverage',
coberturaReport: 'report/',
lcovReport: 'report/',

View file

@ -24,7 +24,7 @@ users to filter and limit the data displayed within a long table. By default, th
* Attach to an existing HTML table
* Integration with any server-side technology as this is a pure client-side
solution
* Exhaustive documentation and poweful API
* Exhaustive documentation and powerful API
## Getting started
* Clone the repo using Git:

4
dist/starter.html vendored
View file

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

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

11215
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{
"name": "tablefilter",
"version": "0.6.91",
"version": "0.7.3",
"description": "A Javascript library making HTML tables filterable and a bit more",
"license": "MIT",
"author": {
@ -40,17 +40,17 @@
"tag": "next"
},
"devDependencies": {
"@babel/core": "7.4.5",
"@babel/preset-env": "7.4.5",
"babel-eslint": "10.0.0",
"@babel/core": "7.10.0",
"@babel/preset-env": "7.10.0",
"babel-eslint": "10.1.0",
"babel-loader": "^8.0.2",
"babel-preset-env": "1.7.0",
"clean-webpack-plugin": "^2.0.1",
"codecov": "3.4.0",
"clean-webpack-plugin": "^3.0.0",
"codecov": "3.7.1",
"diacritics": "1.3.0",
"esdoc": "1.1.0",
"esdoc-standard-plugin": "1.0.0",
"eslint": "5.16.0",
"eslint": "6.5.0",
"format-number": "3.0.0",
"grunt": "^1.0.1",
"grunt-cli": "1.3.2",
@ -66,8 +66,8 @@
"string-replace-webpack-plugin": "^0.1.3",
"stylus": "^0.54.5",
"sugar-date": "2.0.6",
"uglifyjs-webpack-plugin": "2.1.2",
"webpack": "^4.0.1",
"uglifyjs-webpack-plugin": "2.2.0",
"webpack": "^4.38.0",
"webpack-cli": "^3.0.8",
"webpack-dev-server": "^3.1.11"
},

View file

@ -36,7 +36,7 @@ export const getFirstTextNode = (node) => {
/**
* Creates an html element with given collection of attributes
* @param {String} tag a string of the html tag to create
* @param {String} tag html tag name
* @param {Array} an undetermined number of arrays containing the with 2
* items, the attribute name and its value ['id','myId']
* @return {Object} created element

View file

@ -513,6 +513,7 @@ AdapterSortableTable.meta = {altName: 'sort'};
//Converters
function ipAddress(value) {
let vals = value.split('.');
// eslint-disable-next-line no-unused-vars
for (let x in vals) {
let val = vals[x];
while (3 > val.length) {

View file

@ -1,7 +1,7 @@
import {Feature} from '../feature';
import {
ignoreCase, numSortAsc, numSortDesc,
dateSortAsc, sortNumberStr, sortDateStr
dateSortAsc, dateSortDesc, sortNumberStr, sortDateStr
} from '../sort';
import {isArray, isObj, isEmpty} from '../types';
import {NUMBER, FORMATTED_NUMBER, DATE} from '../const';
@ -72,14 +72,15 @@ export class BaseDropdown extends Feature {
* @private
*/
sortOptions(colIndex, options = []) {
let tf = this.tf;
let {tf} = this;
if (tf.isCustomOptions(colIndex) || !tf.sortSlc ||
(isArray(tf.sortSlc) && tf.sortSlc.indexOf(colIndex) === -1)) {
return options;
}
let { caseSensitive, sortNumDesc } = tf;
let { caseSensitive, sortFilterOptionsDesc } = tf;
let isSortDesc = sortFilterOptionsDesc.indexOf(colIndex) !== -1;
let compareFn;
if (this.customSorter &&
@ -89,18 +90,18 @@ export class BaseDropdown extends Feature {
}
else if (tf.hasType(colIndex, [NUMBER, FORMATTED_NUMBER])) {
let decimal = tf.getDecimal(colIndex);
let comparer = numSortAsc;
if (sortNumDesc === true || sortNumDesc.indexOf(colIndex) !== -1) {
comparer = numSortDesc;
}
let comparer = isSortDesc ? numSortDesc : numSortAsc;
compareFn = sortNumberStr(comparer, decimal);
}
else if (tf.hasType(colIndex, [DATE])) {
let locale = tf.feature('dateType').getLocale(colIndex);
let comparer = dateSortAsc;
let comparer = isSortDesc ? dateSortDesc : dateSortAsc;
compareFn = sortDateStr(comparer, locale);
} else { // string
compareFn = caseSensitive ? undefined : ignoreCase;
if (isSortDesc) {
return options.sort(compareFn).reverse();
}
}
return options.sort(compareFn);

View file

@ -4,7 +4,7 @@ import {addEvt, targetEvt, removeEvt} from '../event';
import {NONE} from '../const';
import {root} from '../root';
import {isEmpty, isNull} from '../types';
import {defaultsStr} from '../settings';
import {defaultsStr, defaultsNb} from '../settings';
import {RIGHT} from './toolbar';
const WIKI_URL = 'https://github.com/koalyptus/TableFilter/wiki/' +
@ -92,6 +92,15 @@ export class Help extends Feature {
*/
this.cont = null;
/**
* Adjust container left position when table's horizontal scroll is
* on, typically when `responsive` option is enabled.
* @type {Number}
* @defaultValue 25
*/
this.contAdjustLeftPosition =
defaultsNb(f.container_adjust_left_position, 25);
/**
* Bound mouseup wrapper
* @private
@ -214,9 +223,21 @@ export class Help extends Feature {
let divDisplay = this.cont.style.display;
if (divDisplay === '' || divDisplay === NONE) {
this.cont.style.display = 'inline';
// if table element has an horizontal scrollbar adjust container
// left position accordingly
if (this.tf.dom().scrollLeft > 0) {
this.cont.style.left = `${
this.btn.offsetLeft
- this.tf.dom().scrollLeft
+ this.contAdjustLeftPosition
}px`;
}
addEvt(root, 'mouseup', this.boundMouseup);
} else {
this.cont.style.display = NONE;
this.cont.style.left = '';
}
}

View file

@ -337,7 +337,7 @@ export class TableFilter {
this.onAfterFilter = defaultsFn(f.on_after_filter, EMPTY_FN);
/**
* Enable/disable case sensitivity filtering
* Enable/disable case sensitivity for filtering, default false
* @type {Boolean}
*/
this.caseSensitive = Boolean(f.case_sensitive);
@ -493,7 +493,9 @@ export class TableFilter {
* Text for clear option in drop-down filter types (1st option)
* @type {String|Array}
*/
this.clearFilterText = defaultsStr(f.clear_filter_text, 'Clear');
this.clearFilterText = isArray(f.clear_filter_text)
? f.clear_filter_text
: defaultsStr(f.clear_filter_text, 'Clear');
/**
* Indicate whether empty option is enabled in drop-down filter types
@ -532,38 +534,24 @@ export class TableFilter {
* by default globally or on a column basis
* @type {Boolean|Array}
*/
this.sortSlc = isUndef(f.sort_select) ? true :
isArray(f.sort_select) ? f.sort_select : Boolean(f.sort_select);
this.sortSlc = isUndef(f.sort_select)
? true
: defaultsArr(f.sort_select, Boolean(f.sort_select));
/**
* Indicate whether options in drop-down filter types are sorted in a
* ascending numeric manner
* @type {Boolean}
* @private
*/
this.isSortNumAsc = Boolean(f.sort_num_asc);
/**
* List of columns implementing options sorting in a ascending numeric
* manner
* List of columns implementing filter options sorting in ascending
* manner based on column data type
* @type {Array}
*/
this.sortNumAsc = this.isSortNumAsc ? f.sort_num_asc : [];
this.sortFilterOptionsAsc = defaultsArr(f.sort_filter_options_asc, []);
/**
* Indicate whether options in drop-down filter types are sorted in a
* descending numeric manner
* @type {Boolean}
* @private
*/
this.isSortNumDesc = Boolean(f.sort_num_desc);
/**
* List of columns implementing options sorting in a descending numeric
* manner
* List of columns implementing filter options sorting in descending
* manner based on column data type
* @type {Array}
*/
this.sortNumDesc = this.isSortNumDesc ? f.sort_num_desc : [];
this.sortFilterOptionsDesc =
defaultsArr(f.sort_filter_options_desc, []);
/**
* Indicate whether drop-down filter types are populated on demand at
@ -1797,11 +1785,11 @@ export class TableFilter {
}
//empty
else if (hasEM) {
occurence = !cell.hasChildNodes();
occurence = !cell.hasChildNodes() || isEmpty(cellValue);
}
//non-empty
else if (hasNM) {
occurence = cell.hasChildNodes();
occurence = cell.hasChildNodes() && !isEmpty(cellValue);
} else {
occurence = contains(term, cellValue,
this.isExactMatch(colIdx), this.caseSensitive);
@ -1887,11 +1875,11 @@ export class TableFilter {
}
//empty
else if (hasEM) {
occurence = !cell.hasChildNodes();
occurence = !cell.hasChildNodes() || isEmpty(cellValue);
}
//non-empty
else if (hasNM) {
occurence = cell.hasChildNodes();
occurence = cell.hasChildNodes() && !isEmpty(cellValue);
} else {
// If numeric type data, perform a strict equality test and
// fallback to unformatted number string comparison

View file

@ -32,6 +32,7 @@ table.TF
&.resp
display block
overflow-x auto
overflow-y hidden
.sort-arrow
position initial

View file

@ -27,7 +27,6 @@
highlight_column: true
},
no_results_message: true,
responsive: true,
custom_options: {
cols:[3],
texts: [

View file

@ -40,6 +40,10 @@
page_length: true,
sort: true
},
responsive: true,
help_instructions: {
container_adjust_left_position: 30
},
alternate_rows: true,
btn_reset: true,
rows_counter: true,

View file

@ -100,19 +100,43 @@ test('Can sort options', function() {
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_0: 'checklist',
col_1: 'checklist',
col_2: 'checklist',
col_3: 'checklist',
col_4: 'checklist',
col_types: ['string', 'string', 'number', 'number', 'number'],
sort_num_asc: [2, 3],
sort_num_desc: [4]
sort_filter_options_asc: [0, 2, 3],
sort_filter_options_desc: [1, 4]
});
tf.init();
var flt0 = id(tf.fltIds[0]);
var flt1 = id(tf.fltIds[1]);
var flt2 = id(tf.fltIds[2]);
var flt3 = id(tf.fltIds[3]);
var flt4 = id(tf.fltIds[4]);
deepEqual(
flt0.getElementsByTagName('li')[1].firstChild.firstChild.value,
'Adelaide',
'First option value for column 0'
);
deepEqual(
flt0.getElementsByTagName('li')[2].firstChild.firstChild.value,
'Sydney',
'Last option value for column 0'
);
deepEqual(
flt1.getElementsByTagName('li')[1].firstChild.firstChild.value,
'Perth',
'First option value for column 1'
);
deepEqual(
flt1.getElementsByTagName('li')[6].firstChild.firstChild.value,
'Adelaide',
'Last option value for column 1'
);
deepEqual(
flt2.getElementsByTagName('li')[1].firstChild.firstChild.value,
'286',
@ -182,6 +206,55 @@ test('Can select empty and non-empty options', function() {
'Filter 3 options values attribute');
});
// issue 714, clear filter text
module('Clear filter text');
test('Can define clear filter text for each column', function() {
tf.clearFilters();
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_2: 'checklist',
col_3: 'checklist',
col_4: 'checklist',
clear_filter_text: [null, null, 'clear 2', 'clear 3', 'clear 4']
});
tf.init();
var flt2 = tf.getFilterElement(2).getElementsByTagName('li');
var flt3 = tf.getFilterElement(3).getElementsByTagName('li');
var flt4 = tf.getFilterElement(4).getElementsByTagName('li');
deepEqual(flt2[0].getElementsByTagName('label')[0].innerText,
'clear 2', 'clear text filter 2');
deepEqual(flt3[0].getElementsByTagName('label')[0].innerText,
'clear 3', 'clear text filter 3');
deepEqual(flt4[0].getElementsByTagName('label')[0].innerText,
'clear 4', 'clear text filter 4');
});
test('Can define clear filter text globally', function() {
tf.clearFilters();
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_2: 'checklist',
col_3: 'checklist',
col_4: 'checklist',
clear_filter_text: 'reset'
});
tf.init();
var flt2 = tf.getFilterElement(2).getElementsByTagName('li');
var flt3 = tf.getFilterElement(3).getElementsByTagName('li');
var flt4 = tf.getFilterElement(4).getElementsByTagName('li');
deepEqual(flt2[0].getElementsByTagName('label')[0].innerText,
'reset', 'clear text filter 2');
deepEqual(flt3[0].getElementsByTagName('label')[0].innerText,
'reset', 'clear text filter 3');
deepEqual(flt4[0].getElementsByTagName('label')[0].innerText,
'reset', 'clear text filter 4');
});
module('Tear down');
test('TableFilter removed', function() {
tf.destroy();

View file

@ -1,4 +1,6 @@
(function(win, TableFilter){
(function(TableFilter) {
var id = function (id) { return document.getElementById(id); };
// TODO: add sort to test it with different column types
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
@ -17,7 +19,6 @@
]
});
tf.init();
window.tf = tf;
module('Sanity checks');
test('Data types', function() {
@ -300,10 +301,92 @@
deepEqual(result, '.', 'Decimal separator for given column');
});
module('Data types filters options sorting');
test('Can sort date types', function () {
// setup
tf.clearFilters();
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_6: 'checklist',
col_7: 'multiple',
col_8: 'checklist',
col_10: 'select',
col_types: [
null, null, null,
{type: 'formatted-number', decimal: ',', thousands: ','},
'formatted-number', null,
{type: 'date', locale: 'fr',},
{type: 'date', locale: 'en', format: '{dd}-{MM}-{yyyy|yy}'},
{
type: 'date', locale: 'en',
format: ['{dd}-{months}-{yyyy|yy}']
},
'IpAddress',
{
type: 'date', locale: 'en',
format: ['{yyyy|yy}-{MM}-{dd} {HH}:{mm}:{ss}']
}
],
sort_filter_options_asc: [6, 7],
sort_filter_options_desc: [8, 10]
});
// act
tf.init();
var flt6 = id(tf.fltIds[6]);
var flt7 = id(tf.fltIds[7]);
var flt8 = id(tf.fltIds[8]);
var flt10 = id(tf.fltIds[10]);
// assert
deepEqual(
flt6.getElementsByTagName('li')[1].firstChild.firstChild.value,
'19/1/1984',
'First option value for column 6'
);
deepEqual(
flt6.getElementsByTagName('li')[20].firstChild.firstChild.value,
'3/7/2002',
'Last option value for column 6'
);
deepEqual(
flt7.options[1].value,
'1/19/1984',
'First option value for column 7'
);
deepEqual(
flt7.options[20].value,
'7/3/2002',
'Last option value for column 7'
);
deepEqual(
flt8.getElementsByTagName('li')[1].firstChild.firstChild.value,
'3-Jul-2002',
'First option value for column 8'
);
deepEqual(
flt8.getElementsByTagName('li')[20].firstChild.firstChild.value,
'19-Jan-1984',
'Last option value for column 8'
);
deepEqual(
flt10.options[1].value,
'03-11-21 12:02:04',
'First option value for column 10'
);
deepEqual(
flt10.options[19].value,
'1899-11-27 02:02:04',
'Last option value for column 10'
);
});
module('Tear-down');
test('can destroy TableFilter DOM elements', function() {
tf.destroy();
deepEqual(tf.isInitialized(), false, 'Filters removed');
});
})(window, TableFilter);
})(TableFilter);

View file

@ -157,24 +157,31 @@ test('Can enable options sorting on a column basis', function() {
deepEqual(flt4.options[7].value, '40', 'Last option value for column 4');
});
test('Can sort numeric options in asc and desc manner', function() {
test('Can sort options in asc and desc manner', function() {
tf.clearFilters();
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_0: 'select',
col_2: 'multiple',
col_3: 'select',
col_4: 'multiple',
col_types: ['string', 'string', 'number', 'number', 'number'],
sort_num_asc: [2, 3],
sort_num_desc: [4]
case_sensitive: true,
sort_filter_options_asc: [2, 3],
sort_filter_options_desc: [0, 4]
});
tf.init();
var flt0 = id(tf.fltIds[0]);
var flt2 = id(tf.fltIds[2]);
var flt3 = id(tf.fltIds[3]);
var flt4 = id(tf.fltIds[4]);
deepEqual(flt0.options[1].value, 'Sydney',
'First option value for column 0');
deepEqual(flt0.options[2].value, 'Adelaide',
'Last option value for column 0');
deepEqual(flt2.options[1].value, '286', 'First option value for column 2');
deepEqual(flt2.options[7].value, '2781', 'Last option value for column 2');
deepEqual(flt3.options[1].value, '.6', 'First option value for column 3');
@ -183,6 +190,51 @@ test('Can sort numeric options in asc and desc manner', function() {
deepEqual(flt4.options[7].value, '4.3', 'Last option value for column 4');
});
// issue 714, clear filter text
module('Clear filter text');
test('Can define clear filter text for each column', function() {
tf.clearFilters();
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_2: 'multiple',
col_3: 'select',
col_4: 'multiple',
clear_filter_text: [null, null, 'clear 2', 'clear 3', 'clear 4']
});
tf.init();
var flt2 = tf.getFilterElement(2);
var flt3 = tf.getFilterElement(3);
var flt4 = tf.getFilterElement(4);
deepEqual(flt2.options[0].innerHTML, 'clear 2', 'clear text filter 2');
deepEqual(flt3.options[0].innerHTML, 'clear 3', 'clear text filter 3');
deepEqual(flt4.options[0].innerHTML, 'clear 4', 'clear text filter 4');
});
test('Can define clear filter text globally', function() {
tf.clearFilters();
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_2: 'multiple',
col_3: 'select',
col_4: 'multiple',
clear_filter_text: 'reset'
});
tf.init();
var flt2 = tf.getFilterElement(2);
var flt3 = tf.getFilterElement(3);
var flt4 = tf.getFilterElement(4);
deepEqual(flt2.options[0].innerHTML, 'reset', 'clear text filter 2');
deepEqual(flt3.options[0].innerHTML, 'reset', 'clear text filter 3');
deepEqual(flt4.options[0].innerHTML, 'reset', 'clear text filter 4');
});
module('Tear down');
test('TableFilter removed', function() {
tf.destroy();
deepEqual(id(tf.fltIds[3]), null, 'Filter is removed');

View file

@ -72,7 +72,14 @@
tf.clearFilters();
tf.setFilterValue(4, '[empty]');
tf.filter();
deepEqual(tf.getValidRows().length, 0, 'No matches expected');
var filteredData = tf.getFilteredData();
deepEqual(tf.getValidRows().length, 1, 'Expected match');
deepEqual(
filteredData[0],
[6, ['Adelaide', 'Perth', '2781', '3.1', '']],
'Expected row data'
);
});
test('Non-empty operator - [nonempty]', function() {
@ -96,7 +103,7 @@
tf.setFilterValue(4, '[nonempty]');
tf.filter();
deepEqual(tf.getValidRows().length, 7, 'Expected number of matches');
deepEqual(tf.getValidRows().length, 6, 'Expected number of matches');
});
test('Or operator - ||', function() {

View file

@ -0,0 +1,79 @@
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>TableFilter help pop-up with responsive behaviour</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 style="float: right; width: 80%; border: 1px solid #f4f4f4;"></div>
<table id="demo" cellpadding="0" cellspacing="0">
<tbody>
<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><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-help-responsive.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>
</body>
</html>

View file

@ -0,0 +1,70 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
help_instructions: {
container_adjust_left_position: 20
},
responsive: true
});
tf.init();
var help = tf.feature('help');
module('Sanity checks');
test('Button element', function() {
deepEqual(typeof help, 'object', 'Help instanciated');
notEqual(help.btn, null, 'btn property');
});
module('Pop-up container position');
test('Help UI elements', function() {
var container = help.cont,
helpBtn = help.btn;
deepEqual(container.nodeName, 'DIV', 'Help container');
deepEqual(helpBtn.nodeName, 'SPAN', 'Help button');
});
// 772 issue: pop-up container position when table feature horizontal scroll
test('When table has horizontal scroll', function() {
// setup
tf.dom().scrollLeft = 10000;
// act
help.toggle();
// assert
deepEqual(
parseFloat(help.cont.style.left),
(help.btn.offsetLeft
- tf.dom().scrollLeft
+ help.contAdjustLeftPosition),
'Pop-up container position'
);
});
test('When table does not have horizontal scroll', function() {
tf.destroy();
tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
help_instructions: true,
responsive: false
});
tf.init();
var help = tf.feature('help');
// act
help.toggle();
// assert
deepEqual(help.cont.style.left, '', 'Pop-up container position');
});
module('Tear-down');
test('can destroy Help UI component', function() {
// act
tf.destroy();
var help = tf.feature('help');
// assert
deepEqual(help.btn, null, 'Help button removed');
deepEqual(help.cont, null, 'Help pop-up container removed');
});

View file

@ -1,6 +1,6 @@
const webpack = require('webpack');
const path = require('path');
const Clean = require('clean-webpack-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
const StringReplacePlugin = require('string-replace-webpack-plugin');
const UglifyJsPlugin = require('uglifyjs-webpack-plugin');
const fs = require('fs');
@ -52,14 +52,14 @@ module.exports = {
}
]
},
devtool: 'source-map',
// devtool: 'source-map',
optimization: {
minimizer: [
new UglifyJsPlugin({
sourceMap: true,
// sourceMap: true,
uglifyOptions: {
beautify: false,
compress: {warnings: false},
warnings: false,
comments: false,
keep_fnames: true
}
@ -67,7 +67,7 @@ module.exports = {
]
},
plugins: [
new Clean({
new CleanWebpackPlugin({
cleanOnceBeforeBuildPatterns: [path.join(process.cwd(), 'dist')]
}),
new webpack.optimize.AggressiveMergingPlugin(),

View file

@ -1,7 +1,7 @@
const webpack = require('webpack');
const webpackConfig = require('./webpack.config.js');
const path = require('path');
const Clean = require('clean-webpack-plugin');
const {CleanWebpackPlugin} = require('clean-webpack-plugin');
module.exports = {
mode: 'development',
@ -23,7 +23,7 @@ module.exports = {
},
devtool: 'source-map',
plugins: [
new Clean({
new CleanWebpackPlugin({
cleanOnceBeforeBuildPatterns: [path.join(process.cwd(), 'dist')]
}),
new webpack.LoaderOptionsPlugin({