diff --git a/Changelog.md b/Changelog.md index 86d3731..9d3a088 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,10 @@ ### Changelog +- **v2.0.1** - 3.8.2024 + + - Fixed getter (gave out non-existent property) + - Multiple initialization of plugin doesn't now break it + - **v2.0.0** - 2.8.2024 - Refactored folder structure @@ -17,7 +22,7 @@ - **v1.3.0** - 14.3.2016 - Plugin structure is rewritten to support state getter. Now you can create a method to save table state to localstorage or similar. - - Once again had to increase target size from 6kB to 8kB :(( + - Once again had to increase target size from 6kB to 8kB :( - **v1.2.7** - 8.3.2016 diff --git a/README.md b/README.md index 889d781..2815273 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ ![Test](https://github.com/mcfizh/slimtable/actions/workflows/test-workflow.yml/badge.svg) -SlimTable is a plugin for jQuery, which creates sortable and pageable tables from existing table data. Plugin is quite lightweight, as it only takes 8kB when minified (3kB gzipped). +SlimTable is a plugin for jQuery, which creates sortable and pageable tables from existing table data. Plugin is quite lightweight, as it only takes 9kB when minified (3kB gzipped). Official homepage of slimtable: [https://slimtable.mcfish.org](https://slimtable.mcfish.org) diff --git a/dist/js/slimtable.min.js b/dist/js/slimtable.min.js index a6a70c6..7ea0447 100644 --- a/dist/js/slimtable.min.js +++ b/dist/js/slimtable.min.js @@ -3,7 +3,7 @@ * * Licensed under MIT license. * - * @version 2.0.0 + * @version 2.0.1 * @author Pekka Harjamäki */ -!function(o){var s={init:function(t,s){t.data("slimTableObj",this),this.settings=o.extend({tableData:null,dataUrl:null,itemsPerPage:10,ippList:[5,10,20],pagingStart:0,keepAttrs:[],sortList:[],colSettings:[],text1:"items/page",text2:"Loading...",sortStartCB:null,sortEndCB:null},s),this.state={showLoader:!1,cleanerDiv:o("
"),colSettings:[],tblData:[],sortList:0this.state.tblData.length?this.state.tblData.length:r,e=this.state.pagingStart;e"),l=0;l").html(t.orig),l=0;l").attr("unselectable","on").addClass("slimtable-sprites"),"asc"===t.sortDir?s.addClass("slimtable-sortasc"):"desc"===t.sortDir?s.addClass("slimtable-sortdesc"):s.addClass("slimtable-sortboth"),o(this).prepend(s).css({cursor:"pointer"}).on("click",{self:a},a.handleHeaderClick)):o(this).addClass("slimtable-unsortable")})},addPaging:function(t){let s,a,e;e=o("").addClass("slimtable-paging-select").on("change",{self:this},this.handleIppChange);for(let t of this.settings.ippList)a=o("").val(t).text(t),t===this.settings.itemsPerPage&&a.attr("selected","selected"),o(e).append(a);a=o("
").addClass("slimtable-paging-btnsdiv"),this.state.btnContainer=a,s=o("
").addClass("slimtable-paging-div").append(a),a=o("
").addClass("slimtable-paging-seldiv").append(e).append(this.settings.text1),o(s).append(a),a=o("
").addClass("slimtable-container-div").append(s),t.before(a),t.insertBefore(s)},doSorting:function(){let o=this;0"),colSettings:[],tblData:[],sortList:0this.state.tblData.length?this.state.tblData.length:s,l=this.state.pagingStart;l"),r=0;r").html(e.orig),r=0;r").attr("unselectable","on").addClass("slimtable-sprites"),"asc"===t.sortDir?s.addClass("slimtable-sortasc"):"desc"===t.sortDir?s.addClass("slimtable-sortdesc"):s.addClass("slimtable-sortboth"),o(this).prepend(s).css({cursor:"pointer"}).on("click",{self:e},e.handleHeaderClick)):o(this).addClass("slimtable-unsortable")})},addPaging:function(t){let s,e,a;a=o("").addClass("slimtable-paging-select").on("change",{self:this},this.handleIppChange);for(let t of this.settings.ippList)e=o("").val(t).text(t),t===this.settings.itemsPerPage&&e.attr("selected","selected"),o(a).append(e);e=o("
").addClass("slimtable-paging-btnsdiv"),this.state.btnContainer=e,s=o("
").addClass("slimtable-paging-div").append(e),e=o("
").addClass("slimtable-paging-seldiv").append(a).append(this.settings.text1),o(s).append(e),e=o("
").addClass("slimtable-container-div").append(s),t.before(e),t.insertBefore(s)},doSorting:function(){let o=this;0", "homepage": "https://slimtable.mcfish.org", "license": "MIT", diff --git a/src/slimtable.js b/src/slimtable.js index 41dd5f3..0945754 100644 --- a/src/slimtable.js +++ b/src/slimtable.js @@ -3,7 +3,7 @@ * * Licensed under MIT license. * - * @version 2.0.0 + * @version 2.0.1 * @author Pekka Harjamäki */ // eslint-disable-next-line no-extra-semi @@ -11,15 +11,12 @@ "use strict"; - var SlimTable = { + const SlimTable = { /* ******************************************************************* * * Class initializer * ******************************************************************* */ init: function($el, options) { - - $el.data("slimTableObj",this); - this.settings = $.extend({ tableData: null, dataUrl: null, @@ -114,7 +111,7 @@ }, returnRowType: function(data) { - var patt_01 = /[^0-9]/g, + const patt_01 = /[^0-9]/g, patt_02 = /^[0-9]+([.,][0-9]+)?$/, patt_03 = /^([0-9]+([.,][0-9]+)?)\s*[%$€£e]?$/, patt_04 = /^[0-9]{1,2}[.-/][0-9]{1,2}[.-/][0-9]{4}$/; @@ -148,7 +145,7 @@ * Read data from ajax url / array / table * ******************************************************************* */ readTable: function() { - var l1, l2, matchArr, tObj, tRow, tAttr; + let l1, l2, matchArr, tObj, tRow, tAttr; // Get data either from table, pre defined array or ajax url if( this.settings.dataUrl && this.settings.dataUrl.length > 2 ) @@ -260,7 +257,7 @@ }, processData: function(data) { - var l1, l2, tRow; + let l1, l2, tRow; this.state.tblData = []; @@ -277,7 +274,7 @@ * Create table body / header * ******************************************************************* */ createTableHead: function() { - var l1, t_item1, t_item2; + let l1, t_item1, t_item2; for(l1=0; l1"). - attr("unselectable","on"). - addClass("slimtable-sprites"); + const tObj = $("").attr("unselectable","on").addClass("slimtable-sprites"); if( tCfg.sortDir === "asc" ) { @@ -387,10 +380,7 @@ tObj.addClass("slimtable-sortboth"); } - $(this). - prepend(tObj). - css({ cursor: "pointer" }). - on("click",{ self: self},self.handleHeaderClick); + $(this).prepend(tObj).css({ cursor: "pointer" }).on("click",{ self: self},self.handleHeaderClick); } else { $(this).addClass("slimtable-unsortable"); } @@ -448,15 +438,12 @@ // if(this.state.sortList.length>0) - this.state.tblData.sort(function(a,b) { - var t1, ta, tb, l1, - slistLength=self.state.sortList.length, - same_item; + let ta, tb, l1, same_item; + const slistLength=self.state.sortList.length; - for(l1=0; l1=pages) - return; - - self.state.pagingStart = num * self.state.itemsPerPage; - self.createTableBody(); + if(num>=0 && num 0 && - this.state.colSettings.length !== this.state.tblData[0].data.length + this.state.colSettings.length !== this.state.tblData[0].data.length ); }, @@ -586,19 +569,13 @@ /* ******************************************************************* * * Status getters * ******************************************************************* */ - getState: function($el) { - const slimObj = $el.data("slimTableObj"); - - if(!slimObj || !slimObj.state) - return {}; - - const state = slimObj.state; + getState: function() { + const state = this.state; return { - colNumber: state.colNumber, - itemsPerPage: state.itemsPerPage, - pagingStart: state.pagingStart, colSettings: state.colSettings, - sortList: state.sortList + sortList: state.sortList, + pagingStart: state.pagingStart, + itemsPerPage: state.itemsPerPage }; } @@ -608,13 +585,20 @@ * Plugin main * ******************************************************************* */ $.fn.slimtable = function(options) { - if( typeof(options) !== "undefined" && options === "getState" ) - return SlimTable.getState( $(this[0]) ); - - return this.each(function(){ - const tbl = Object.create(SlimTable); - tbl.init( $(this) , options); - }); + const key = "plugin_slimtable"; + + if(options === undefined || typeof options === "object") { + return this.each( function() { + if(!$.data(this, key)) { + const tbl = Object.create(SlimTable); + tbl.init($(this), options); + $.data(this, key, tbl); + } + }); + } else if(typeof options === "string" && options === "getState") { + const instance = $(this).data(key); + return instance ? instance.getState() : {}; + } }; }(jQuery)); diff --git a/tests/unitTest2.js b/tests/unitTest2.js index d4b1238..ae6360c 100644 --- a/tests/unitTest2.js +++ b/tests/unitTest2.js @@ -5,31 +5,28 @@ QUnit.test("basic test", (assert) => { // $.ajax({ url: "test.json", dataType: "json" }) .done(function(data) { - - $("#testTable").slimtable({ - tableData: data - }); - + $("#testTable").slimtable({ tableData: data }); assert.ok(true, "Test resumed after ajax call"); - // Table should have 5 TH elements with attributes 'unselectable'='on' + // Table should have 8 TH elements with attributes 'unselectable'='on' $("#testTable").find("thead").each(function(){ $(this).find("th").each(function(){ if( $(this).attr("unselectable") === "on" ) thfound++; }); }); - assert.equal(thfound, 8, "Proper number of th's found"); - // Table should have 10 Tr elements + // Table should have 9 Tr elements $("#testTable").find("tbody").each(function(){ - $(this).find("tr").each(function(){ - trfound++; - }); + $(this).find("tr").each(function(){ trfound++; }); }); assert.equal(trfound, 9, "Proper number of tr's found"); + // GetState command should return sane values + const state = $("#testTable").slimtable("getState"); + assert.propContains(state, { itemsPerPage: 10, pagingStart: 0 }); + done1(); }) .fail(function(param1,param2) {