Repository: wootapa/watable Branch: master Commit: baf298d1eac0 Files: 6 Total size: 143.7 KB Directory structure: gitextract_ou9dcir2/ ├── LICENSE.md ├── README.md ├── bower.json ├── index.html ├── jquery.watable.js └── watable.css ================================================ FILE CONTENTS ================================================ ================================================ FILE: LICENSE.md ================================================ The MIT License (MIT) Copyright (c) 2015 Andreas Petersson Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ watable ======= A jQuery table plugin with sorting, paging, filtering. Visit https://oweitman.github.io/watable/doc/index.html for demo and docs. ================================================ FILE: bower.json ================================================ { "name": "WATable", "version": "1.10.3", "homepage": "http://wootapa-watable.appspot.com", "authors": ["Andreas Petersson "], "description": "A swiss army jQuery table plugin. Filter, format, paginate and sort your data with ease and lightning speed.", "main": [ "jquery.watable.js", "watable.css" ], "keywords": [ "table", "jquery", "paginate", "sort", "filter" ], "ignore": [ "index.html" ], "dependencies": { "jquery": ">= 1.7.1", "bootstrap": ">= 3.2.0" } } ================================================ FILE: index.html ================================================ WATable

WATable

http://wootapa-watable.appspot.com/

Example 1. No options supplied

Example 2. Lots of options supplied

================================================ FILE: jquery.watable.js ================================================ /* WATable 1.10.3 Copyright (c) 2012 Andreas Petersson(apesv03@gmail.com) http://wootapa-watable.appspot.com/ Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ (function ($, undefined) { var WATable = function () { var priv = {}; //private api var publ = {}; //public api priv.options = {}; var defaults = { url: '', //webservice url urlData: '', //webservice params urlPost: false, //use POST instead of GET debug: false, //prints debug info to console filter: false, //show filter row columnPicker: false, //show columnpicker checkboxes: false, //show body checkboxes checkAllToggle: true, //show check all toggle actions: '', //holds action links pageSize: 10, //current pagesize pageSizePadding: false, //pad with empty rows pageSizes: [10, 20, 30, 40, 50, 'All'], //available pagesizes hidePagerOnEmpty: false, //removes pager if no rows preFill: false, //prefill table with empty rows sorting: true, // enable column sorting sortEmptyLast: true, //empty values will be shown last dataBind: false, //updates table when detecting row data changes types: { //type specific options string: {}, number: {}, bool: {}, date: {} }, transition: undefined, //transition type when paging transitionDuration: 0.3 //duration of transition in seconds }; /* bundled scripts */ priv.ext = {}; priv.ext.XDate = /* xdate 0.7 */ function(a,b,c,d){function e(){var b=this instanceof e?this:new e,c=arguments,d=c.length,h;typeof c[d-1]=="boolean"&&(h=c[--d],c=y(c,0,d));if(d)if(d==1)if(d=c[0],d instanceof a||typeof d=="number")b[0]=new a(+d);else if(d instanceof e){var c=b,i=new a(+d[0]);if(f(d))i.toString=G;c[0]=i}else{if(typeof d=="string"){b[0]=new a(0);a:{for(var c=d,d=h||!1,i=e.parsers,j=0,k;j=d;g--)f/=D[g],f+=s(c,!1,g)-s(a,!1,g);d==1&&(f+=(c.getFullYear()-a.getFullYear())*12)}else d==2?(d=a.toDate().setUTCHours(0,0,0,0),f=c.toDate().setUTCHours(0,0,0,0),f=b.round((f-d)/864e5)+(c-f-(a-d))/864e5):f=(c-a)/[36e5,6e4,1e3,1][d-3];return f}function k(c){var d=c(0),e=c(1),c=c(2),e=new a(F(d,e,c)),f=l(d),c=f;e=d&&(c=d));return b.floor(b.round((e-c)/864e5)/7)+1}function l(b){b=new a(F(b,0,4));b.setUTCDate(b.getUTCDate()-(b.getUTCDay()+6)%7);return b}function m(a,b,c,e){var f=x(s,a,e),g=x(t,a,e),c=l(c===d?f(0):c);e||(c=u(c));a.setTime(+c);g(2,[f(2)+(b-1)*7])}function n(a,b,c,d,f){var g=e.locales,h=g[e.defaultLocale]||{},i=x(s,a,f),c=(typeof c=="string"?g[c]:c)||{};return o(a,b,function(a){if(d)for(var b=(a==7?2:a)-1;b>=0;b--)d.push(i(b));return i(a)},function(a){return c[a]||h[a]},f)}function o(a,b,c,e,f){for(var g,h,i="";g=b.match(E);){i+=b.substr(0,g.index);if(g[1]){h=i;for(var i=a,j=g[1],k=c,l=e,m=f,n=j.length,q=void 0,r="";n>0;)q=p(i,j.substr(0,n),k,l,m),q!==d?(r+=q,j=j.substr(n),n=j.length):n--;i=h+(r+j)}else g[3]?(h=o(a,g[4],c,e,f),parseInt(h.replace(/\D/g,""),10)&&(i+=h)):i+=g[7]||"'";b=b.substr(g.index+g[0].length)}return i+b}function p(a,c,d,f,g){var h=e.formatters[c];if(typeof h=="string")return o(a,h,d,f,g);else if(typeof h=="function")return h(a,g||!1,f);switch(c){case"fff":return A(d(6),3);case"s":return d(5);case"ss":return A(d(5));case"m":return d(4);case"mm":return A(d(4));case"h":return d(3)%12||12;case"hh":return A(d(3)%12||12);case"H":return d(3);case"HH":return A(d(3));case"d":return d(2);case"dd":return A(d(2));case"ddd":return f("dayNamesShort")[d(7)]||"";case"dddd":return f("dayNames")[d(7)]||"";case"M":return d(1)+1;case"MM":return A(d(1)+1);case"MMM":return f("monthNamesShort")[d(1)]||"";case"MMMM":return f("monthNames")[d(1)]||"";case"yy":return(d(0)+"").substring(2);case"yyyy":return d(0);case"t":return q(d,f).substr(0,1).toLowerCase();case"tt":return q(d,f).toLowerCase();case"T":return q(d,f).substr(0,1);case"TT":return q(d,f);case"z":case"zz":case"zzz":return g?c="Z":(f=a.getTimezoneOffset(),a=f<0?"+":"-",d=b.floor(b.abs(f)/60),f=b.abs(f)%60,g=d,c=="zz"?g=A(d):c=="zzz"&&(g=A(d)+":"+A(f)),c=a+g),c;case"w":return k(d);case"ww":return A(k(d));case"S":return c=d(2),c>10&&c<20?"th":["st","nd","rd"][c%10-1]||"th"}}function q(a,b){return a(3)<12?b("amDesignator"):b("pmDesignator")}function r(a){return!isNaN(+a[0])}function s(a,b,c){return a["get"+(b?"UTC":"")+B[c]]()}function t(a,b,c,d){a["set"+(b?"UTC":"")+B[c]].apply(a,d)}function u(b){return new a(b.getUTCFullYear(),b.getUTCMonth(),b.getUTCDate(),b.getUTCHours(),b.getUTCMinutes(),b.getUTCSeconds(),b.getUTCMilliseconds())}function v(b,c){return 32-(new a(F(b,c,32))).getUTCDate()}function w(a){return function(){return a.apply(d,[this].concat(y(arguments)))}}function x(a){var b=y(arguments,1);return function(){return a.apply(d,b.concat(y(arguments)))}}function y(a,b,e){return c.prototype.slice.call(a,b||0,e===d?a.length:e)}function z(a,b){for(var c=0;c').appendTo(_cont); } //create the header which will later hold both sorting and filtering if (!_head) { _table.find('thead').remove(); _headSort = _headFilter = undefined; _head = $('').prependTo(_table); } //sort the columns in index order var colsSorted = Object.keys(_data.cols).sort(function (a, b) { return _data.cols[a].index - _data.cols[b].index; }); //create the header sorting row if (!_headSort) { _head.find('.sort i').tooltip('hide'); _head.find(".sort").remove(); _headSort = $('').prependTo(_head); //create the checkall toggle if (_uniqueCol && priv.options.checkboxes) { var checked = _checkToggleChecked ? 'checked' : ''; var headCell = $('').appendTo(_headSort); if (priv.options.checkAllToggle) { var elem = $(''.f(checked)).appendTo(headCell); elem.on('change', priv.checkToggleChanged); } } //create the sortable headers for (var i = 0; i < colsSorted.length; i++) { var column = colsSorted[i]; var props = _data.cols[column]; if (!props.hidden) { var headCell = $('').appendTo(_headSort); var link; if(priv.options.sorting && props.sorting !== false) { link = $('{0}'.f(props.friendly || column)); link.on('click', {column: column}, priv.columnClicked); } else { link = $('{0}'.f(props.friendly || column)); } link.appendTo(headCell); if (props.tooltip) { $('').tooltip({ title: props.tooltip.trim(), html: true, container: 'body', placement: 'top', delay: { show: 500, hide: 100 } }).appendTo(link); } //Add sort arrow if (column == _currSortCol) { if (_currSortFlip) $('').appendTo(headCell); else $('').appendTo(headCell); } } } } //create the header filtering row if (!_headFilter && priv.options.filter) { _head.find(".filter").remove(); _headFilter = $('').appendTo(_head); var headCell; var elem; var placeHolder = ''; var tooltip = ''; //create the filter checkbox if (_uniqueCol && priv.options.checkboxes) { tooltip = priv.options.types.bool.filterTooltip || 'Toggle between:
indeterminate,
checked,
unchecked'; headCell = $('').appendTo(_headFilter); elem = $('').appendTo(headCell); $.map(_filterCols, function (colProps, col) { if (col == "unique") { if (colProps.filter == 1) elem.prop('checked', true).removeClass('indeterminate'); else if (colProps.filter == 0) elem.prop('checked', false).removeClass('indeterminate'); else elem.prop('checked', true).addClass('indeterminate'); } }); if (tooltip) { elem.tooltip({ title: tooltip.trim(), html: true, container: 'body', trigger: 'hover', placement: 'top', delay: { show: 500, hide: 100 } }); } elem.on('click', {column: "unique"}, priv.filterChanged); } //create the column filters for (var i = 0; i < colsSorted.length; i++) { var column = colsSorted[i]; var props = _data.cols[column]; tooltip = props.filterTooltip === true ? undefined : props.filterTooltip === false ? '' : props.filterTooltip; placeHolder = props.placeHolder === true ? undefined : props.placeHolder === false ? '' : props.placeHolder; if (!props.hidden) { headCell = $('').appendTo(_headFilter); switch (props.type || 'string') { case "number": if (placeHolder == undefined) placeHolder = priv.options.types.number.placeHolder; placeHolder = (placeHolder === true || placeHolder == undefined) ? '10..20 =50' : placeHolder === false ? '' : placeHolder; if (tooltip == undefined) tooltip = priv.options.types.number.filterTooltip; tooltip = (tooltip === true || tooltip == undefined) ? 'Values 10 to 20:
10..20
Values except 10 to 20:
!10..20
Values exactly 50:
=50' : tooltip === false ? '' : tooltip; elem = $(''.f(placeHolder)); elem.on('keyup', {column: column}, priv.filterChanged); break; case "date": if (placeHolder == undefined) placeHolder = priv.options.types.date.placeHolder; placeHolder = (placeHolder === true || placeHolder == undefined) ? '-7..0' : placeHolder === false ? '' : placeHolder; if (tooltip == undefined) tooltip = priv.options.types.date.filterTooltip; tooltip = (tooltip === true || tooltip == undefined) ? 'Today:
0..1
All except today:
!0..1
A week today excluded:
-7..0' : tooltip === false ? '' : tooltip; elem = $('
'.f(placeHolder)); if (priv.options.types.date.datePicker === true || priv.options.types.date.datePicker == undefined) { if ($().datepicker) { elem.addClass('date-wrap'); var today = new priv.ext.XDate(false).setHours(0, 0, 0, 0).toString('yyyy-MM-dd'); var dp = $('
'.f(today, 'yyyy-mm-dd')).appendTo(elem); $('').appendTo(dp); $('').on('click', {op: "l"}, priv.dpOpChanged).appendTo(dp); $('').on('click', {op: "r"}, priv.dpOpChanged).appendTo(dp); dp.datepicker({weekStart:1}); dp.on('changeDate', {column: column, input: $('input.filter', elem)}, priv.dpClicked); } else priv.log('datepicker plugin not found'); } elem.on('keyup', 'input.filter', {column: column}, priv.filterChanged); break; case "bool": if (tooltip == undefined) tooltip = priv.options.types.bool.filterTooltip; tooltip = (tooltip === true || tooltip == undefined) ? 'Toggle between:
indeterminate,
checked,
unchecked' : tooltip === false ? '' : tooltip; elem = $(''); elem.on('click', {column: column}, priv.filterChanged); break; case "string": if (placeHolder == undefined) placeHolder = priv.options.types.string.placeHolder; placeHolder = (placeHolder === true || placeHolder == undefined) ? 'John Doe' : placeHolder === false ? '' : placeHolder; if (tooltip == undefined) tooltip = priv.options.types.string.filterTooltip; tooltip = (tooltip === true || tooltip == undefined) ? 'Find John Doe:
John Doe
Find John and Jane Doe(Regex):
?John Doe|Jane Doe
Find all except John Doe:
!John Doe' : tooltip === false ? '' : tooltip; elem = $(''.f(placeHolder)); elem.on('keyup', {column: column}, priv.filterChanged); break; case "none": elem = $('
 
'); break; } if (tooltip) { elem.tooltip({ title: tooltip.trim(), html: true, container: 'body', trigger: 'hover', placement: 'top', delay: { show: 500, hide: 100 } }); } if (elem && props.filter !== false) { $.map(_filterCols, function (colProps, col) { if (col == column) { if (colProps.col.type == 'bool') { if (colProps.filter == 1) elem.prop('checked', true).removeClass('indeterminate'); else if (colProps.filter == 0) elem.prop('checked', false).removeClass('indeterminate'); else elem.prop('checked', true).addClass('indeterminate'); } else if (colProps.col.type == 'date') { //dates have the input nested $('input:first', elem).val(colProps.filter); } else{ elem.val(colProps.filter); } } }); elem.appendTo(headCell); } } } } //create the body if (!_body) { var prevBody = _table.find('tbody'); if (!_transition.doTransition && prevBody.length) prevBody.remove(); _body = $('').insertAfter(_head); _body.on('change', '.unique', priv.rowChecked); _body.on('click', 'td:not(.watable-col-cbunique)', priv.rowClicked); //find out what rows to show next... _pageSize = priv.options.pageSize == -1 ? _data.rows.length : Math.min(priv.options.pageSize, _data.rows.length); _totalPages = Math.ceil(_data.rows.length / _pageSize) || 1; _currPage = Math.min(_totalPages, _currPage); _data.meta.rowsRendered = {}; if (_currPage > 1) { _data.meta.fromRow = Math.max((_pageSize * _currPage) - _pageSize, 0); _data.meta.toRow = Math.min(_data.meta.fromRow + _pageSize, _data.rows.length); } else { _data.meta.fromRow = 0; _data.meta.toRow = _pageSize; } //slice out the chunk of data we need and create rows $.each(_data.rows.slice(_data.meta.fromRow, _data.meta.toRow), function (index, row) { var rowRendered = $(''.f(index%2 == 0 ? 'odd' : 'even')).appendTo(_body); if (_uniqueCol) { _data.meta.rowsRendered[row[_uniqueCol]] = rowRendered; //create checkbox if (priv.options.checkboxes) { var check = _data.meta.rowsChecked[row[_uniqueCol]] != undefined ? 'checked' : ''; var checkable = row['row-checkable'] === false ? 'disabled' : ''; var cell = $('').appendTo(rowRendered); $(''.f(check, checkable)).appendTo(cell); } } //create cells for (var i = 0; i < colsSorted.length; i++) { var col = colsSorted[i]; if (!_data.cols[col]) { return; } if (_data.cols[col].unique) { rowRendered.data('unique', row[col]); } if (!_data.cols[col].hidden) { var cell = $(''); priv.renderCell(cell, col, row, rowRendered); cell.appendTo(rowRendered); } } }); //pad with empty rows? if (priv.options.pageSize != -1 && (_currPage == _totalPages && _currPage > 1) || priv.options.pageSizePadding) { var loops = priv.options.pageSize - (_data.meta.toRow - _data.meta.fromRow); while (loops-- >0) { var row = $('').appendTo(_body); if (_uniqueCol && priv.options.checkboxes) { var cell = $('').appendTo(row); $('').appendTo(cell); } $.each(_data.cols, function (column, props) { if (!props.hidden) $(' ').appendTo(row); }); } } //transition between bodys? if (prevBody.length && _transition.doTransition) { var transition = _transition.direction == 1 ? _transition.available[priv.options.transition].next : _transition.available[priv.options.transition].prev; //animation duration var vendorCSSProps = {}; $.each(_vendors, function (index, vendor) { var key = '-{0}-animation-duration'.f(vendor); vendorCSSProps[key] = '{0}s'.f(priv.options.transitionDuration); }); prevBody.css(vendorCSSProps); var fallbackTimer; var vendorAnimationEnd = $.map(_vendors, function (vendor) { return '{0}AnimationEnd {0}animationend'.f(vendor); }).join(" "); prevBody.one('{0} animationend'.f(vendorAnimationEnd), function (e) { clearTimeout(fallbackTimer); prevBody.remove(); _body.css(vendorCSSProps); //animate in the current body _body.one('{0} animationend'.f(vendorAnimationEnd), function (e) { _body.removeClass('animated {0}'.f(transition.tin)); }); _body.show(0).addClass('animated {0}'.f(transition.tin)); }); //fallback timer to prevent paging from breaking when animationend wont fire fallbackTimer = setTimeout(function(e) { priv.log('animate.css seems to be missing!', true); prevBody.remove(); _body.show(0); _transition.supported = false; }, (priv.options.transitionDuration * 1000) /* wait a little longer */ + 500); //animate out the previous body prevBody.addClass('animated {0}'.f(transition.tout)); _transition.doTransition = false; } else { _body.show(0); } //recreate footer? _data.meta.rowsFilteredCount = _data.meta.rowsFilteredCount || 0; if (_data.meta.rowsFilteredCount != _data.rows.length) { _foot = undefined; _data.meta.rowsFilteredCount = _data.rows.length; } } //create the footer if (!_foot) { _table.find('tfoot').remove(); _foot = $('').insertAfter(_body); var footRow = $('').appendTo(_foot); var footCell = $('').appendTo(footRow); //create summary if (_data.rows.length > 0) $('

Rows {0}-{1} of {2}

'.f(_data.meta.fromRow + 1, Math.min(_data.meta.toRow, _data.rows.length), _data.rows.length)).appendTo(footCell); else { $('

No results

').appendTo(footCell); } //create the pager. var lowerPage = _currPage - 2; var upperPage = _currPage + 2; if (upperPage > _totalPages) { var diff = upperPage - _totalPages; upperPage = _totalPages; lowerPage -= diff; } if (lowerPage < 1) lowerPage = 1; if (upperPage < 5) upperPage = 5; var footToolbar = $('
').appendTo(footCell); var footDiv = $('
').appendTo(footToolbar); var footPagerUl = $('
    ').appendTo(footDiv); $('
  • «
  • '.f(_currPage == 1 ? 'disabled' : '')) .on('click', {pageIndex: _currPage - 1}, priv.pageChanged).appendTo(footPagerUl); for (var i = lowerPage; i <= upperPage; i++) { var link; if (i == _currPage) { link = $('
  • {0}
  • '.f(i)); link.on('click', function(e) { e.preventDefault();} ) } else { link = $('
  • {0}
  • '.f(i, i > _totalPages ? 'disabled' : '')); link.on('click', {pageIndex: i}, priv.pageChanged); } link.appendTo(footPagerUl); } $('
  • »
  • '.f(_currPage == _totalPages ? 'disabled' : '')) .on('click', {pageIndex: _currPage + 1}, priv.pageChanged).appendTo(footPagerUl); //create pagesize dropdown if (priv.options.pageSizes.length) { var div = $('
    ').appendTo(footToolbar); var btn = $('').appendTo(div); var span = $('').appendTo(btn); var ul = $('