1
0
Fork 0
mirror of https://github.com/koalyptus/TableFilter.git synced 2024-05-09 18:06:53 +02:00

Fixed Qunit test + custom grunt task for Qunit tests

This commit is contained in:
Max Guglielmi 2015-05-15 20:37:27 +10:00
parent eef326e6b0
commit cdca67a70e
33 changed files with 514 additions and 485 deletions

View file

@ -11,14 +11,14 @@
// Reserved words
"-W024": true,
"curly": true,
//"indent": 4,
"indent": 4,
//"eqeqeq": true,
"es3": true,
"esnext": true,
"unused": true,
//"maxlen" : 80,
"globals": {
"System": true,
"Object": true,
"module": true,
"require": true,

View file

@ -2,8 +2,12 @@ module.exports = function (grunt) {
var webpack = require('webpack');
var webpackConfig = require('./webpack.config.js');
var pkg = grunt.file.readJSON('package.json');
var version = pkg.version;
var fs = require('fs');
var path = require('path');
// var pkg = grunt.file.readJSON('package.json');
// var version = pkg.version;
var testDir = 'test';
var testHost = 'http://localhost:8080/';
grunt.initConfig({
@ -18,7 +22,18 @@ module.exports = function (grunt) {
},
qunit: {
files: ['test/**/*.html']
// files: ['test/**/*.html'],
// urls: ['http://localhost:9000/test/test.html']
all: {
options: {
urls: getTestFiles(testDir, testHost)
}
},
only: {
options: {
urls: []
}
}
},
copy: {
@ -39,7 +54,7 @@ module.exports = function (grunt) {
'webpack-dev-server': {
options: {
webpack: webpack.dev,
publicPath: '/dev/'
publicPath: '/build/'
},
start: {
keepAlive: true,
@ -96,7 +111,7 @@ module.exports = function (grunt) {
expand: true,
cwd: 'src-es6',
src: ['**/*.js'],
dest: 'dev/tablefilter'
dest: 'build/tablefilter'
}]
}
}
@ -110,21 +125,86 @@ module.exports = function (grunt) {
grunt.loadNpmTasks('grunt-babel');
// The development server (the recommended option for development)
grunt.registerTask('dev-server', ['webpack-dev-server:start']);
grunt.registerTask('server', ['webpack-dev-server:start']);
// Build and watch cycle (another option for development)
// Advantage: No server required, can run app from filesystem
// Disadvantage: Requests are not blocked until bundle is available,
// can serve an old app on too fast refresh
grunt.registerTask('dev', ['jshint', 'webpack:build', 'copy:build'/*, 'watch:app'*/]);
grunt.registerTask('dev', ['jshint', 'webpack:build', 'copy:build']);
// Production build
grunt.registerTask('dist', ['jshint', 'webpack:dist', 'copy:dist']);
// Tests
grunt.registerTask('test', ['qunit']);
// Transpile with Babel
grunt.registerTask('transpile', ['babel']);
// Tests
grunt.registerTask('test', ['qunit:all']);
// Custom task running QUnit tests for specified files.
// Usage: grunt test-only:test.html,test-help.html
grunt.registerTask('test-only',
'A task that runs only specified tests.',
function(tests) {
if(!tests) {
return;
}
tests = tests.split(',');
var res = [];
tests.forEach(function(itm) {
var filePath = path.resolve(testDir, itm);
var parts = filePath.split(path.sep);
res.push(buildTestUrl(testHost, testDir, parts));
});
grunt.config('qunit.only.options.urls', res);
grunt.task.run('qunit:only');
});
function isTestFile(pth) {
var allowedExts = ['.html', '.htm'];
for(var i=0, len=allowedExts.length; i<len; i++){
var ext = allowedExts[i];
if(pth.indexOf(ext) !== -1){
return true;
}
}
return false;
}
function buildTestUrl(host, testDir, parts) {
var idx = parts.indexOf(testDir);
var fileIdx = parts.length;
var relParts = parts.slice(idx, fileIdx);
return host.concat(relParts.join('/'));
}
// Returns the list of test files from the test folder for QUnit
function getTestFiles(testDir, host) {
var getFiles = function(dir, host) {
var res = [];
var items = fs.readdirSync(dir);
items.forEach(function(itm){
var fileOrDir = path.resolve(dir, itm);
if(isTestFile(fileOrDir)) {
var parts = fileOrDir.split(path.sep);
res.push(buildTestUrl(host, testDir, parts));
} else {
if(fs.lstatSync(fileOrDir).isDirectory()) {
res = res.concat(getFiles(fileOrDir, host));
}
}
});
return res;
};
return getFiles(testDir, host);
}
};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -2,7 +2,6 @@
<html lang="en">
<head>
<title>HTML Table Filter Generator</title>
<link href="../dev/filtergrid.css" rel="stylesheet" type="text/css">
<script type="text/javascript">
var tf;
</script>
@ -93,14 +92,13 @@
<script src="../libs/requirejs/require.js"></script>
<script>
requirejs(['../dev/tablefilter'], function(mod){
// Your logic here
requirejs(['../build/tablefilter/tablefilter'], function(mod){
var TableFilter = mod.TableFilter;
tf = new TableFilter("demo", {
col_0: 'select',
col_2: 'multiple',
col_3: 'checklist',
base_path: '../build/tablefilter',
base_path: '../build/tablefilter/',
loader: false,
rows_counter: true,
enable_default_theme: false,
@ -141,7 +139,7 @@
extensions: [{
/*** Columns Visibility Manager extension load ***/
name: 'colsVisibility',
path: '../build/extensions/colsVisibility',
// path: './extensions/colsVisibility',
description: 'Columns visibility manager',/*
initialize: function(o){o.SetColsVisibility();}*/
// manager: true,
@ -180,6 +178,6 @@
tf.init();
});
</script>
<button onclick="javascript:tf.ExtRegistry.ColsVisibility.toggleCol(2);">Toggle col 2</button>
<button onclick="javascript:tf.ExtRegistry.colsVisibility.toggleCol(2);">Toggle col 2</button>
</body>
</html>

View file

@ -133,8 +133,7 @@ export default class ColsVisibility{
this.tf = tf;
}
toggle(evt){
var tf = this.tf;
toggle(){
var contDisplay = this.contEl.style.display;
var onBeforeOpen = this.onBeforeOpen;
var onBeforeClose = this.onBeforeClose;
@ -277,7 +276,7 @@ export default class ColsVisibility{
ul.appendChild(li);
li.check.checked = !this.tickToHide;
Event.add(li.check, 'click', (evt)=> {
Event.add(li.check, 'click', ()=> {
for(var h = 0; h < headerRow.cells.length; h++){
var itm = Dom.id('col_'+h+'_'+tf.id);
if(itm && li.check.checked !== itm.checked){
@ -351,7 +350,6 @@ export default class ColsVisibility{
setHidden(colIndex, hide){
var tf = this.tf;
var tbl = tf.tbl;
var col = Dom.tag(tbl, 'col')[colIndex];
if(this.onBeforeColHidden && hide){
this.onBeforeColHidden.call(null, this, colIndex);

View file

@ -205,7 +205,6 @@ export default class AdapterSortableTable{
}
stt.headersRow = tf.headersRow;
var cells = stt.tHead.rows[stt.headersRow].cells;
var doc = stt.tHead.ownerDocument || stt.tHead.document;
stt.sortTypes = oSortTypes || [];
var l = cells.length;
var img, c;

View file

@ -23,7 +23,6 @@ export class AlternateRows{
if(!this.tf.hasGrid() && !this.tf.isFirstLoad){
return;
}
var rows = this.tf.tbl.rows;
var noValidRowsIndex = this.tf.validRowsIndex===null;
//1st index
var beginIndex = noValidRowsIndex ? this.tf.refRow : 0;
@ -80,7 +79,6 @@ export class AlternateRows{
if(!this.tf.hasGrid()){
return;
}
var row = this.tf.tbl.rows;
for(var i=this.tf.refRow; i<this.tf.nbRows; i++){
this.removeRowBg(i);
}

View file

@ -232,12 +232,11 @@ export class CheckList{
* Add checklist options
* @param {Number} colIndex Column index
* @param {Object} ul Ul element
* @param {String} separator Data separator
*/
addChecks(colIndex, ul, separator){
addChecks(colIndex, ul){
var tf = this.tf;
var chkCt = this.addTChecks(colIndex, ul);
var flts_values = [], fltArr = []; //remember grid values
var fltArr = []; //remember grid values
var store = tf.Cpt.store;
var tmpVal = store ?
store.getFilterValues(tf.fltsValuesCookie)[colIndex] : null;

View file

@ -75,8 +75,7 @@ export class Dropdown{
}
var slc = !isExternal ? Dom.id(slcId) : Dom.id(extSlcId),
rows = tf.tbl.rows,
matchCase = tf.matchCase,
fillMethod = Str.lower(this.slcFillingMethod);
matchCase = tf.matchCase;
//custom select test
this.isCustom = (tf.hasCustomSlcOptions &&

View file

@ -1,6 +1,5 @@
import {Dom} from '../dom';
import {Types} from '../types';
import {Helpers} from '../helpers';
import {Event} from '../event';
export class GridLayout{

View file

@ -1,7 +1,6 @@
import {Dom} from '../dom';
import {Types} from '../types';
import {Str} from '../string';
import {Helpers} from '../helpers';
import {Event} from '../event';
export class Paging{

View file

@ -198,7 +198,6 @@ export class PopupFilter{
* @param {Boolean} active Apply active state
*/
buildIcon(colIndex, active){
var activeImg = Types.isUndef(active) ? true : active;
if(this.popUpFltImgs[colIndex]){
this.popUpFltImgs[colIndex].src = active ?
this.popUpImgFltActive : this.popUpImgFlt;

View file

@ -1,5 +1,4 @@
import {Dom} from '../dom';
import {Event} from '../event';
import {Types} from '../types';
import {Helpers} from '../helpers';

View file

@ -16,9 +16,7 @@ import {Str as str} from './string';
import {Cookie as cookie} from './cookie';
import {Types as types} from './types';
import {Arr as array} from './array';
import {Helpers as hlp} from './helpers';
import {DateHelper as dateHelper} from './date';
import {Sort} from './sort';
// Modules
import {Store} from './modules/store';
@ -41,8 +39,6 @@ var global = window,
formatDate = dateHelper.format,
doc = global.document;
// export {Paging, GridLayout};
export class TableFilter{
/**
@ -75,7 +71,7 @@ export class TableFilter{
'HTML table not found.');
}
if(arguments.length>1){
if(arguments.length > 1){
for(var i=0; i<arguments.length; i++){
var arg = arguments[i];
var argtype = typeof arg;
@ -99,7 +95,7 @@ export class TableFilter{
catch(e){ this.nbCells = this.getCellsNb(0); }
//default script base path
this.basePath = f.base_path!==undefined ? f.base_path : 'tablefilter/';
this.basePath = f.base_path || 'tablefilter/';
this.extensionsPath = f.extensions_path || this.basePath+'extensions/';
/*** filter types ***/
@ -385,31 +381,18 @@ export class TableFilter{
//indicates if sort is set (used in tfAdapter.sortabletable.js)
this.isSortEnabled = false;
this.sortConfig = f.sort_config || {};
this.sortConfig.name = this.sortConfig['name']!==undefined ?
f.sort_config.name : 'sortabletable';
this.sortConfig.src = this.sortConfig['src']!==undefined ?
f.sort_config.src : this.extensionsPath+'sort/' +
'sortabletable.js';
this.sortConfig.adapterSrc =
this.sortConfig['adapter_src']!==undefined ?
f.sort_config.adapter_src :
this.extensionsPath+'sort/adapterSortabletable.js';
this.sortConfig.initialize =
this.sortConfig['initialize']!==undefined ?
f.sort_config.initialize :
function(o){
// if(o.SetSortTable){ o.SetSortTable(); }
};
this.sortConfig.sortTypes =
types.isArray(this.sortConfig['sort_types']) ?
f.sort_config.sort_types : [];
this.sortConfig.sortCol = this.sortConfig['sort_col']!==undefined ?
f.sort_config.sort_col : null;
this.sortConfig.asyncSort =
this.sortConfig['async_sort']===true ? true : false;
this.sortConfig.name = this.sortConfig.name || 'sort';
// this.sortConfig.src = this.sortConfig.src || this.extensionsPath +
// 'sort/sortabletable.js';
this.sortConfig.path = this.sortConfig.path || null;
this.sortConfig.sortTypes = types.isArray(this.sortConfig.sort_types) ?
this.sortConfig.sort_types : [];
this.sortConfig.sortCol = this.sortConfig.sort_col || null;
this.sortConfig.asyncSort = this.sortConfig.async_sort===true ?
true : false;
this.sortConfig.triggerIds =
types.isArray(this.sortConfig['sort_trigger_ids']) ?
f.sort_config.sort_trigger_ids : [];
types.isArray(this.sortConfig.sort_trigger_ids) ?
this.sortConfig.sort_trigger_ids : [];
/*** ezEditTable extension ***/
//enables/disables table selection feature
@ -651,14 +634,14 @@ export class TableFilter{
/*====================================================
- onkeydown event for input filters
=====================================================*/
onKeyDown: function(e) {
onKeyDown: function() {
if(!o.onKeyUp) { return; }
o.isUserTyping = true;
},
/*====================================================
- onblur event for input filters
=====================================================*/
onInpBlur: function(e) {
onInpBlur: function() {
if(o.onKeyUp){
o.isUserTyping = false;
global.clearInterval(o.onKeyUpTimer);
@ -714,7 +697,7 @@ export class TableFilter{
=====================================================*/
onSlcChange: function(e) {
if(!o.activeFlt){ return; }
var colIndex = o.activeFlt.getAttribute('colIndex');
// var colIndex = o.activeFlt.getAttribute('colIndex');
//Checks filter is a checklist and caller is not null
// if(o.activeFlt && colIndex &&
// o['col'+colIndex]===o.fltTypeCheckList &&
@ -741,7 +724,7 @@ export class TableFilter{
/*====================================================
- onclick event for checklist filter container
=====================================================*/
onCheckListFocus: function(e) {
onCheckListFocus: function() {
o.activeFilterId = this.firstChild.getAttribute('id');
o.activeFlt = dom.id(o.activeFilterId);
},
@ -1550,8 +1533,9 @@ export class TableFilter{
// });
this.loadExtension({
name: 'sort'/*,
path: './extensions/sort/sort.js'*/
name: this.sortConfig.name,
path: this.sortConfig.path
// path: './extensions/sort/sort.js'
});
}
@ -1770,7 +1754,7 @@ export class TableFilter{
//Page navigation has to be enforced whenever selected row is out of
//the current page range
var onBeforeSelection = function(et, selectedElm, e){
var onBeforeSelection = function(et, selectedElm){
var row = et.defaultSelection !== 'row' ?
selectedElm.parentNode : selectedElm;
if(o.paging){
@ -1807,7 +1791,7 @@ export class TableFilter{
//Selected row needs to be visible when paging is activated
if(o.paging){
o.onAfterChangePage = function(tf, i){
o.onAfterChangePage = function(tf){
var et = tf.ExtRegistry.ezEditTable;
var slc = et.Selection;
var row = slc.GetActiveRow();
@ -2152,8 +2136,8 @@ export class TableFilter{
re_eq = new RegExp(this.eqOperator),
re_st = new RegExp(this.stOperator),
re_en = new RegExp(this.enOperator),
re_an = new RegExp(this.anOperator),
re_cr = new RegExp(this.curExp),
// re_an = new RegExp(this.anOperator),
// re_cr = new RegExp(this.curExp),
re_em = this.emOperator,
re_nm = this.nmOperator,
re_re = new RegExp(str.rgxEsc(this.rgxOperator));
@ -2188,7 +2172,7 @@ export class TableFilter{
hasDF = re_d.test(sA),
hasEQ = re_eq.test(sA),
hasLK = re_lk.test(sA),
hasAN = re_an.test(sA),
// hasAN = re_an.test(sA),
hasST = re_st.test(sA),
hasEN = re_en.test(sA),
hasEM = (re_em === sA),
@ -2644,7 +2628,7 @@ export class TableFilter{
if(!this.fltGrid){
return;
}
return this.fltIds[i];
return this.fltIds[index];
}
/*====================================================
@ -2862,13 +2846,13 @@ export class TableFilter{
selects: executes filtering when multiple
select populated... IE only!
=====================================================*/
setFilterValue(index, searcharg, doFilter){
setFilterValue(index, searcharg/*, doFilter*/){
if((!this.fltGrid && !this.isFirstLoad) ||
!this.getFilterElement(index)){
return;
}
var slc = this.getFilterElement(index),
execFilter = doFilter===undefined ? true : doFilter,
// execFilter = doFilter===undefined ? true : doFilter,
fltColType = this['col'+index];
searcharg = searcharg===undefined ? '' : searcharg;
@ -2878,8 +2862,8 @@ export class TableFilter{
}
//multiple selects
else if(fltColType === this.fltTypeMulti){
var s = searcharg.split(' '+this.orOperator+' '),
ct = 0; //keywords counter
var s = searcharg.split(' '+this.orOperator+' ');
// var ct = 0; //keywords counter
for(var j=0; j<slc.options.length; j++){
if(s==='' || s[0]===''){
slc.options[j].selected = false;
@ -2907,9 +2891,11 @@ export class TableFilter{
//checklist
else if(fltColType === this.fltTypeCheckList){
searcharg = str.matchCase(searcharg, this.matchCase);
var sarg = searcharg.split(' '+this.orOperator+' '),
fltValue = slc.setAttribute('value',''),
fltIndex = slc.setAttribute('indexes','');
var sarg = searcharg.split(' '+this.orOperator+' ');
slc.setAttribute('value','');
slc.setAttribute('indexes','');
for(var k=0; k<dom.tag(slc,'li').length; k++){
var li = dom.tag(slc,'li')[k],
lbl = dom.tag(li,'label')[0],
@ -3384,8 +3370,21 @@ export class TableFilter{
}
}
TableFilter.Paging = Paging;
TableFilter.Cookie = cookie;
TableFilter.Store = Store;
TableFilter.GridLayout = GridLayout;
TableFilter.Loader = Loader;
TableFilter.HighlightKeyword = HighlightKeyword;
TableFilter.PopupFilter = PopupFilter;
TableFilter.Dropdown = Dropdown;
TableFilter.CheckList = CheckList;
TableFilter.RowsCounter = RowsCounter;
TableFilter.StatusBar = StatusBar;
TableFilter.Paging = Paging;
TableFilter.ClearButton = ClearButton;
TableFilter.Help = Help;
TableFilter.AlternateRows = AlternateRows;
TableFilter.ColOps = ColOps;
function removeNbFormat(data, format){
if(!data){

View file

@ -1,5 +1,6 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
alternate_rows: true
});
tf.init();

View file

@ -1,6 +1,7 @@
var id = function (id){ return document.getElementById(id); };
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_3: 'checklist',
fill_slc_on_demand: false
});

View file

@ -1,5 +1,6 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
btn_reset: true
});
tf.init();

View file

@ -4,6 +4,7 @@ var table = document.getElementById('demo');
var totRowIndex = table.getElementsByTagName('tr').length;
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
rows_always_visible: [totRowIndex],
col_operation: {
id: ['sum1', 'sum2'],

View file

@ -1,6 +1,7 @@
var id = function (id){ return document.getElementById(id); };
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
col_2: 'multiple',
col_3: 'select',
fill_slc_on_demand: false

View file

@ -1,5 +1,6 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
grid_layout: true,
sort: false
});

View file

@ -1,5 +1,6 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
help_instructions: true
});
tf.init();

View file

@ -1,5 +1,6 @@
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
highlight_keywords: true
});
tf.init();

View file

@ -9,7 +9,6 @@ module('Sanity checks');
test('Loader component', function() {
var loader = tf.Cpt.loader;
notEqual(loader, null, 'Loader instanciated');
console.log(document.getElementById(loader.prfxLoader+tf.id));
notEqual(
document.getElementById(loader.prfxLoader+tf.id),
null,

View file

@ -4,13 +4,7 @@
<meta charset="utf-8">
<title>TableFilter column sort with grid layout mode</title>
<link rel="stylesheet" href="libs/qunit/qunit.css">
<link rel="stylesheet" href="../src/filtergrid.css">
<script src="libs/qunit/qunit.js"></script>
<script>
// Defer Qunit so RequireJS can work its magic and resolve all modules.
QUnit.config.autostart = false;
QUnit.config.autoload = false;
</script>
</head>
<body>
<table id="demo" cellpadding="0" cellspacing="0">
@ -139,7 +133,8 @@
</tbody>
</table>
<script data-main="test-sort-grid-layout" src="../libs/requirejs/require.js"></script>
<script src="../dist/tablefilter/tablefilter.js"></script>
<script src="test-sort-grid-layout.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>

View file

@ -1,97 +1,89 @@
requirejs(['test-config', '../src/tablefilter'], function(config, TableFilter){
var types = require('types').Types,
dom = require('dom').Dom;
var tf = new TableFilter('demo', {
base_path: '../src/',
sort: true,
sort_config: {
sort_types: ['string','string','number','number','number']
},
grid_layout: true,
on_sort_loaded: startSimple
});
tf.init();
var tf1 = new TableFilter('demo2', {
base_path: '../src/',
paging: true,
sort: true,
sort_config: {
sort_types: ['string','string','number','number','number']
},
grid_layout: true,
on_sort_loaded: startPaging
});
tf1.init();
QUnit.start();
function startSimple(tf){
var sort = tf.ExtRegistry.sort;
module('Sanity checks');
test('Sort extension', function() {
notEqual(sort, null, 'Sort instanciated');
deepEqual(sort.stt instanceof SortableTable, true, 'Sort type');
deepEqual(sort.sorted, false, 'Table not sorted');
});
test('Sort behaviour', function() {
var th = tf.getHeaderElement(0);
sort.sortByColumnIndex(0);
deepEqual(sort.sorted, true, 'Table column sorted');
deepEqual(sort.isPaged, false, 'Table is not paged');
});
module('Destroy and re-init');
test('Remove sort', function() {
sort.destroy();
var th = tf.getHeaderElement(0),
indicator = dom.tag(th, 'img');
deepEqual(tf.sort, false, 'Sort is removed');
deepEqual(indicator.length, 0, 'Sort indicator is removed');
});
}
function startPaging(tf){
var sort = tf.ExtRegistry.sort;
module('Sanity checks');
test('Sort extension', function() {
notEqual(sort, null, 'Sort instanciated');
deepEqual(sort.stt instanceof SortableTable, true, 'Sort type');
deepEqual(sort.sorted, false, 'Table not sorted');
});
module('UI elements');
test('Sort UI elements', function() {
var th = tf.getHeaderElement(0),
indicator = dom.tag(th, 'img');
deepEqual(indicator.length, 1, 'Sort indicator in header element');
});
test('Sort behaviour', function() {
var th = tf.getHeaderElement(0);
sort.sortByColumnIndex(0);
deepEqual(sort.sorted, true, 'Table column sorted');
deepEqual(tf.paging, true, 'Table is paged');
});
module('Destroy and re-init');
test('Remove sort', function() {
sort.destroy();
var th = tf.getHeaderElement(0),
indicator = dom.tag(th, 'img');
deepEqual(tf.sort, false, 'Sort is removed');
deepEqual(indicator.length, 0, 'Sort indicator is removed');
});
}
var tag = function (elm, tag){ return elm.getElementsByTagName(tag); };
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
sort: true,
sort_config: {
sort_types: ['string','string','number','number','number']
},
grid_layout: true,
on_sort_loaded: startSimple
});
tf.init();
var tf1 = new TableFilter('demo2', {
base_path: '../dist/tablefilter/',
paging: true,
sort: true,
sort_config: {
sort_types: ['string','string','number','number','number']
},
grid_layout: true,
on_sort_loaded: startPaging
});
tf1.init();
function startSimple(tf, sort){
module('Sanity checks');
test('Sort extension', function() {
notEqual(sort, null, 'Sort instanciated');
deepEqual(sort.stt instanceof SortableTable, true, 'Sort type');
deepEqual(sort.sorted, false, 'Table not sorted');
});
test('Sort behaviour', function() {
var th = tf.getHeaderElement(0);
sort.sortByColumnIndex(0);
deepEqual(sort.sorted, true, 'Table column sorted');
deepEqual(sort.isPaged, false, 'Table is not paged');
});
module('Destroy and re-init');
test('Remove sort', function() {
sort.destroy();
var th = tf.getHeaderElement(0),
indicator = tag(th, 'img');
deepEqual(tf.sort, false, 'Sort is removed');
deepEqual(indicator.length, 0, 'Sort indicator is removed');
});
}
function startPaging(tf, sort){
// var sort = tf.ExtRegistry.sort;
module('Sanity checks');
test('Sort extension', function() {
notEqual(sort, null, 'Sort instanciated');
deepEqual(sort.stt instanceof SortableTable, true, 'Sort type');
deepEqual(sort.sorted, false, 'Table not sorted');
});
module('UI elements');
test('Sort UI elements', function() {
var th = tf.getHeaderElement(0),
indicator = tag(th, 'img');
deepEqual(indicator.length, 1, 'Sort indicator in header element');
});
test('Sort behaviour', function() {
var th = tf.getHeaderElement(0);
sort.sortByColumnIndex(0);
deepEqual(sort.sorted, true, 'Table column sorted');
deepEqual(tf.paging, true, 'Table is paged');
});
module('Destroy and re-init');
test('Remove sort', function() {
sort.destroy();
var th = tf.getHeaderElement(0),
indicator = tag(th, 'img');
deepEqual(tf.sort, false, 'Sort is removed');
deepEqual(indicator.length, 0, 'Sort indicator is removed');
});
}

View file

@ -4,13 +4,7 @@
<meta charset="utf-8">
<title>TableFilter sort by key</title>
<link rel="stylesheet" href="libs/qunit/qunit.css">
<link rel="stylesheet" href="../dist/filtergrid.css">
<script src="libs/qunit/qunit.js"></script>
<script>
// Defer Qunit so RequireJS can work its magic and resolve all modules.
QUnit.config.autostart = false;
QUnit.config.autoload = false;
</script>
</head>
<body>
<table id="demo" cellpadding="0" cellspacing="0">
@ -240,7 +234,8 @@
</tbody>
</table>
<script data-main="test-sort-key" src="../libs/requirejs/require.js"></script>
<script src="../dist/tablefilter/tablefilter.js"></script>
<script src="test-sort-key.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>

View file

@ -1,74 +1,67 @@
requirejs(['test-config', '../src/tablefilter'], function(config, TableFilter){
var types = require('types').Types,
dom = require('dom').Dom;
var tf = new TableFilter('demo', {
base_path: '../src/',
sort: true,
sort_config: {
sort_types:[
'String',
'Number',
'String',
'String',
'EU',
'US',
'String',
'dmydate',
'mdydate'
]
},
on_sort_loaded: start
});
tf.init();
QUnit.start();
function start(tf){
var sort = tf.ExtRegistry.sort;
module('Sanity checks');
test('Sort extension', function() {
notEqual(sort, null, 'Sort instanciated');
deepEqual(sort.stt instanceof SortableTable, true, 'Sort type');
deepEqual(sort.sorted, false, 'Table not sorted');
});
module('UI elements');
test('Sort UI elements', function() {
var th = tf.getHeaderElement(0),
indicator = dom.tag(th, 'img'),
validRows = tf.getValidRowsIndex(true);
deepEqual(indicator.length, 1, 'Sort indicator in header element');
deepEqual(
dom.getText(tf.tbl.rows[validRows[0]].cells[1]),
'AUY78',
'First custom key cell text before sorting');
});
test('Sort behaviour', function() {
var th = tf.getHeaderElement(1),
validRows = tf.getValidRowsIndex();
sort.sortByColumnIndex(1);
deepEqual(sort.sorted, true, 'Table column sorted');
deepEqual(
dom.getText(tf.tbl.rows[validRows[0]].cells[1]),
'QT1',
'First custom key cell text after sorting');
});
module('Destroy and re-init');
test('Remove sort', function() {
sort.destroy();
var th = tf.getHeaderElement(0),
indicator = dom.tag(th, 'img');
deepEqual(tf.sort, false, 'Sort is removed');
deepEqual(indicator.length, 0, 'Sort indicator is removed');
});
}
var tag = function (elm, tag){ return elm.getElementsByTagName(tag); };
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
sort: true,
sort_config: {
sort_types:[
'String',
'Number',
'String',
'String',
'EU',
'US',
'String',
'dmydate',
'mdydate'
]
},
on_sort_loaded: start
});
tf.init();
function start(tf, sort){
module('Sanity checks');
test('Sort extension', function() {
notEqual(sort, null, 'Sort instanciated');
deepEqual(sort.stt instanceof SortableTable, true, 'Sort type');
deepEqual(sort.sorted, false, 'Table not sorted');
});
module('UI elements');
test('Sort UI elements', function() {
var th = tf.getHeaderElement(0),
indicator = tag(th, 'img'),
validRows = tf.getValidRowsIndex(true);
deepEqual(indicator.length, 1, 'Sort indicator in header element');
deepEqual(
(tf.tbl.rows[validRows[0]].cells[1]).innerHTML,
'AUY78',
'First custom key cell text before sorting');
});
test('Sort behaviour', function() {
var th = tf.getHeaderElement(1),
validRows = tf.getValidRowsIndex();
sort.sortByColumnIndex(1);
deepEqual(sort.sorted, true, 'Table column sorted');
deepEqual(
(tf.tbl.rows[validRows[0]].cells[1]).innerHTML,
'QT1',
'First custom key cell text after sorting');
});
module('Destroy and re-init');
test('Remove sort', function() {
sort.destroy();
var th = tf.getHeaderElement(0),
indicator = tag(th, 'img');
deepEqual(tf.sort, false, 'Sort is removed');
deepEqual(indicator.length, 0, 'Sort indicator is removed');
});
}

View file

@ -4,13 +4,7 @@
<meta charset="utf-8">
<title>TableFilter column sort</title>
<link rel="stylesheet" href="libs/qunit/qunit.css">
<link rel="stylesheet" href="../src/filtergrid.css">
<script src="libs/qunit/qunit.js"></script>
<script>
// Defer Qunit so RequireJS can work its magic and resolve all modules.
QUnit.config.autostart = false;
QUnit.config.autoload = false;
</script>
</head>
<body>
<table id="demo" cellpadding="0" cellspacing="0">
@ -139,7 +133,8 @@
</tbody>
</table>
<script data-main="test-sort" src="../libs/requirejs/require.js"></script>
<script src="../dist/tablefilter/tablefilter.js"></script>
<script src="test-sort.js"></script>
<div id="qunit"></div>
<div id="qunit-fixture"></div>

View file

@ -1,103 +1,97 @@
requirejs(['test-config', '../src/tablefilter'], function(config, TableFilter){
var types = require('types').Types,
dom = require('dom').Dom;
var tf = new TableFilter('demo', {
base_path: '../src/',
sort: true,
sort_config: {
sort_types: ['string','string','number','number','number']
},
on_sort_loaded: startSimple
});
tf.init();
var tf1 = new TableFilter('demo2', {
base_path: '../src/',
paging: true,
sort: true,
sort_config: {
sort_types: ['string','string','number','number','number']
},
on_sort_loaded: startPaging
});
tf1.init();
QUnit.start();
function startSimple(tf){
var sort = tf.ExtRegistry.sort;
module('Sanity checks');
test('Sort extension', function() {
notEqual(sort, null, 'Sort instanciated');
deepEqual(sort.stt instanceof SortableTable, true, 'Sort type');
deepEqual(sort.sorted, false, 'Table not sorted');
});
module('UI elements');
test('Sort UI elements', function() {
var th = tf.getHeaderElement(0),
indicator = dom.tag(th, 'img');
deepEqual(indicator.length, 1, 'Sort indicator in header element');
});
test('Sort behaviour', function() {
var th = tf.getHeaderElement(0);
sort.sortByColumnIndex(0);
deepEqual(sort.sorted, true, 'Table column sorted');
deepEqual(sort.isPaged, false, 'Table is not paged');
});
module('Destroy and re-init');
test('Remove sort', function() {
sort.destroy();
var th = tf.getHeaderElement(0),
indicator = dom.tag(th, 'img');
deepEqual(tf.sort, false, 'Sort is removed');
deepEqual(indicator.length, 0, 'Sort indicator is removed');
});
}
function startPaging(tf){
var sort = tf.ExtRegistry.sort;
module('Sanity checks');
test('Sort extension', function() {
notEqual(sort, null, 'Sort instanciated');
deepEqual(sort.stt instanceof SortableTable, true, 'Sort type');
deepEqual(sort.sorted, false, 'Table not sorted');
});
module('UI elements');
test('Sort UI elements', function() {
var th = tf.getHeaderElement(0),
indicator = dom.tag(th, 'img');
deepEqual(indicator.length, 1, 'Sort indicator in header element');
});
test('Sort behaviour', function() {
var th = tf.getHeaderElement(0);
sort.sortByColumnIndex(0);
deepEqual(sort.sorted, true, 'Table column sorted');
deepEqual(tf.paging, true, 'Table is paged');
});
module('Destroy and re-init');
test('Remove sort', function() {
sort.destroy();
var th = tf.getHeaderElement(0),
indicator = dom.tag(th, 'img');
deepEqual(tf.sort, false, 'Sort is removed');
deepEqual(indicator.length, 0, 'Sort indicator is removed');
});
}
var tag = function (elm, tag){ return elm.getElementsByTagName(tag); };
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
sort: true,
sort_config: {
sort_types: ['string','string','number','number','number']
},
on_sort_loaded: startSimple
});
tf.init();
var tf1 = new TableFilter('demo2', {
base_path: '../dist/tablefilter/',
paging: true,
sort: true,
sort_config: {
sort_types: ['string','string','number','number','number']
},
on_sort_loaded: startPaging
});
tf1.init();
function startSimple(tf, sort){
// var sort = tf.ExtRegistry.sort;
module('Sanity checks');
test('Sort extension', function() {
notEqual(sort, null, 'Sort instanciated');
deepEqual(sort.stt instanceof SortableTable, true, 'Sort type');
deepEqual(sort.sorted, false, 'Table not sorted');
});
module('UI elements');
test('Sort UI elements', function() {
var th = tf.getHeaderElement(0),
indicator = tag(th, 'img');
deepEqual(indicator.length, 1, 'Sort indicator in header element');
});
test('Sort behaviour', function() {
var th = tf.getHeaderElement(0);
sort.sortByColumnIndex(0);
deepEqual(sort.sorted, true, 'Table column sorted');
deepEqual(sort.isPaged, false, 'Table is not paged');
});
module('Destroy and re-init');
test('Remove sort', function() {
sort.destroy();
var th = tf.getHeaderElement(0),
indicator = tag(th, 'img');
deepEqual(tf.sort, false, 'Sort is removed');
deepEqual(indicator.length, 0, 'Sort indicator is removed');
});
}
function startPaging(tf, sort){
// var sort = tf.ExtRegistry.sort;
module('Sanity checks');
test('Sort extension', function() {
notEqual(sort, null, 'Sort instanciated');
deepEqual(sort.stt instanceof SortableTable, true, 'Sort type');
deepEqual(sort.sorted, false, 'Table not sorted');
});
module('UI elements');
test('Sort UI elements', function() {
var th = tf.getHeaderElement(0),
indicator = tag(th, 'img');
deepEqual(indicator.length, 1, 'Sort indicator in header element');
});
test('Sort behaviour', function() {
var th = tf.getHeaderElement(0);
sort.sortByColumnIndex(0);
deepEqual(sort.sorted, true, 'Table column sorted');
deepEqual(tf.paging, true, 'Table is paged');
});
module('Destroy and re-init');
test('Remove sort', function() {
sort.destroy();
var th = tf.getHeaderElement(0),
indicator = tag(th, 'img');
deepEqual(tf.sort, false, 'Sort is removed');
deepEqual(indicator.length, 0, 'Sort indicator is removed');
});
}

View file

@ -1,47 +1,42 @@
requirejs(['test-config', '../src/tablefilter'], function(config, TableFilter){
QUnit.start();
var StatusBar = require('modules/statusBar').StatusBar,
types = require('types').Types,
dom = require('dom').Dom;
var tf = new TableFilter('demo', {
status_bar: true
});
tf.init();
var statusBar = tf.Cpt.statusBar;
module('Sanity checks');
test('Status bar component', function() {
deepEqual(statusBar instanceof StatusBar, true, 'StatusBar type');
notEqual(statusBar.statusBarDiv, null, 'statusBarDiv property');
});
module('UI elements');
test('Status bar UI elements', function() {
var container = statusBar.statusBarDiv,
label = statusBar.statusBarSpanText;
deepEqual(container.nodeName, 'DIV', 'Status bar container');
deepEqual(label.nodeName, 'SPAN', 'Status bar label');
});
module('Destroy');
test('Remove UI', function() {
statusBar.destroy();
var container = statusBar.statusBarDiv,
label = statusBar.statusBarSpanText;
deepEqual(container, null, 'Status bar container removed');
deepEqual(label, null, 'Status bar button removed');
});
test('Re-set UI', function() {
statusBar.statusBarText = '→←';
statusBar.init();
var label = statusBar.statusBarSpanText;
notEqual(
dom.getText(label).indexOf('→←'), -1, 'Status bar text');
});
var StatusBar = TableFilter.StatusBar;
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
status_bar: true
});
tf.init();
var statusBar = tf.Cpt.statusBar;
module('Sanity checks');
test('Status bar component', function() {
deepEqual(statusBar instanceof StatusBar, true, 'StatusBar type');
notEqual(statusBar.statusBarDiv, null, 'statusBarDiv property');
});
module('UI elements');
test('Status bar UI elements', function() {
var container = statusBar.statusBarDiv,
label = statusBar.statusBarSpanText;
deepEqual(container.nodeName, 'DIV', 'Status bar container');
deepEqual(label.nodeName, 'SPAN', 'Status bar label');
});
module('Destroy');
test('Remove UI', function() {
statusBar.destroy();
var container = statusBar.statusBarDiv,
label = statusBar.statusBarSpanText;
deepEqual(container, null, 'Status bar container removed');
deepEqual(label, null, 'Status bar button removed');
});
test('Re-set UI', function() {
statusBar.statusBarText = '→←';
statusBar.init();
var label = statusBar.statusBarSpanText;
notEqual(
label.innerHTML.indexOf('→←'), -1, 'Status bar text');
});

View file

@ -1,65 +1,62 @@
requirejs(['test-config', '../src/tablefilter'], function(config, TableFilter){
QUnit.start();
var Store = require('modules/store').Store;
var Cookie = require('cookie').Cookie;
var tf = new TableFilter('demo', {
paging: true,
paging_length: 2,
results_per_page: ['Results per page', [2,4,6]],
remember_grid_values: true,
remember_page_number: true,
remember_page_length: true
});
Cookie.remove(tf.fltsValuesCookie);
Cookie.remove(tf.pgNbCookie);
Cookie.remove(tf.pgLenCookie);
tf.init();
tf._clearFilters();
module('Sanity checks');
test('Store module', function() {
deepEqual(tf.Cpt.store instanceof Store, true, 'Store type');
notEqual(tf.Cpt.store, null, 'Store instanciated');
deepEqual(tf.Cpt.store.duration, 100000, 'Store duration');
});
module('Check page number persistence');
test('Page number value', function() {
tf._clearFilters();
tf._filter();
tf.Cpt.paging._changePage(1);
var cookieName = tf.pgNbCookie;
deepEqual(tf.Cpt.store.getPageNb(cookieName), '2', 'Page number value');
tf._clearFilters();
tf._filter();
});
module('Check page length persistence');
test('Page length value', function() {
var paging = tf.Cpt.paging;
paging.resultsPerPageSlc.options[2].selected = true;
paging._changeResultsPerPage();
var cookieName = tf.pgLenCookie;
deepEqual(tf.Cpt.store.getPageLength(cookieName), '2', 'Page length value');
tf._clearFilters();
tf._filter();
});
module('Check filters persistence');
test('Filters value', function() {
tf.setFilterValue(0, 'Sydney');
tf.setFilterValue(3, '1.5');
tf._filter();
var cookieName = tf.fltsValuesCookie;
deepEqual(tf.Cpt.store.getFilterValues(cookieName)[0], 'Sydney', 'Filter 0 value');
deepEqual(tf.Cpt.store.getFilterValues(cookieName)[3], '1.5', 'Filter 3 value');
tf._clearFilters();
tf._filter();
});
var Store = TableFilter.Store;
var Cookie = TableFilter.Cookie;
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/',
paging: true,
paging_length: 2,
results_per_page: ['Results per page', [2,4,6]],
remember_grid_values: true,
remember_page_number: true,
remember_page_length: true
});
Cookie.remove(tf.fltsValuesCookie);
Cookie.remove(tf.pgNbCookie);
Cookie.remove(tf.pgLenCookie);
tf.init();
tf._clearFilters();
module('Sanity checks');
test('Store module', function() {
deepEqual(tf.Cpt.store instanceof Store, true, 'Store type');
notEqual(tf.Cpt.store, null, 'Store instanciated');
deepEqual(tf.Cpt.store.duration, 100000, 'Store duration');
});
module('Check page number persistence');
test('Page number value', function() {
tf._clearFilters();
tf._filter();
tf.Cpt.paging._changePage(1);
var cookieName = tf.pgNbCookie;
deepEqual(tf.Cpt.store.getPageNb(cookieName), '2', 'Page number value');
tf._clearFilters();
tf._filter();
});
module('Check page length persistence');
test('Page length value', function() {
var paging = tf.Cpt.paging;
paging.resultsPerPageSlc.options[2].selected = true;
paging._changeResultsPerPage();
var cookieName = tf.pgLenCookie;
deepEqual(tf.Cpt.store.getPageLength(cookieName), '2', 'Page length value');
tf._clearFilters();
tf._filter();
});
module('Check filters persistence');
test('Filters value', function() {
tf.setFilterValue(0, 'Sydney');
tf.setFilterValue(3, '1.5');
tf._filter();
var cookieName = tf.fltsValuesCookie;
deepEqual(tf.Cpt.store.getFilterValues(cookieName)[0], 'Sydney', 'Filter 0 value');
deepEqual(tf.Cpt.store.getFilterValues(cookieName)[3], '1.5', 'Filter 3 value');
tf._clearFilters();
tf._filter();
});

View file

@ -1,6 +1,8 @@
(function(win, TableFilter) {
var tf = new TableFilter('demo');
var tf = new TableFilter('demo', {
base_path: '../dist/tablefilter/'
});
tf.init();
module("Sanity checks");