diff --git a/dist/starter.html b/dist/starter.html new file mode 100644 index 00000000..7fb6d63b --- /dev/null +++ b/dist/starter.html @@ -0,0 +1,514 @@ + + + + tablefilter v0.6.3 - Starter + + +

tablefilter v0.6.3

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
countryisoyearPOPXRATPPPcgdpccci
BeninBEN19985950.33589.9517822190.951178.4690.987.55
BeninBEN19996109.53615.6990967200.191174.9092.617.86
BeninBEN20006272.00711.9763184200.611224.7492.278.25
Burkina FasoBFA19949755.03555.2047119125.76838.7679.816.57
Burkina FasoBFA19959988.00499.148407136.65860.8980.419.29
Burkina FasoBFA199610225.00511.5523987144.18881.1180.4012.12
Burkina FasoBFA199710473.53583.6693726141.78899.0176.9414.94
RussiaRUS1998146899.019.7050828932.647086.3967.739.20
RussiaRUS1999146308.9924.61993984.038074.7057.358.81
RussiaRUS2000145555.0128.129169464.859995.9154.748.79
RwandaRWA19946230.00194.51750.39529.48132.164.48
RwandaRWA19956400.00262.197509870.67746.3492.773.08
RwandaRWA19966727.00306.820007377.90823.2589.713.21
RwandaRWA19977895.18301.529785284.13847.7991.443.72
RwandaRWA19988105.00312.314086985.32914.2289.344.22
El SalvadorSLV19955669.008.7545833593.544143.5989.3110.35
El SalvadorSLV19965798.008.7550001143.694235.7988.777.79
El SalvadorSLV19975911.008.7562503813.744408.4187.057.90
Slovak RepublicSVK20005401.0046.035213.0212618.5352.2224.78
SloveniaSVN19941988.90128.808593879.9711662.1253.2119.87
SloveniaSVN19951990.00118.518501389.0312574.9654.4623.11
SloveniaSVN19961991.00135.364303697.2713151.5154.3223.23
SloveniaSVN19971985.96159.6882935103.9614143.0253.2424.14
SloveniaSVN19981982.60166.134201108.9315067.3452.8225.35
ZambiaZMB19948740.72669.3706055307.48834.1975.439.86
ZambiaZMB19958980.00864.1192017402.40829.3776.5510.31
ZambiaZMB19969214.401207.900024515.01838.0578.7410.99
ZambiaZMB19979443.211314.498047596.97851.4777.5912.15
ZambiaZMB19989665.711862.06897744.91800.6985.1213.75
ZambiaZMB19999881.212388.019043941.87765.2491.8215.30
ZambiaZMB200010089.003110.8439941157.63840.9786.3315.38
ZimbabweZWE199410775.358.1515388492.012586.8460.1018.53
ZimbabweZWE199511011.008.665375712.152603.3766.8915.03
ZimbabweZWE199611242.1610.002349852.642860.2372.0611.32
ZimbabweZWE199711923.5212.111289983.172727.0682.8211.01
ZimbabweZWE199812153.8523.679109574.062799.8577.6610.75
ZimbabweZWE199912388.3238.301200876.122770.4876.8910.73
ZimbabweZWE200012627.0044.417919169.482607.0369.238.62
+ + + + + + +

+
+
+
+
+
+
+
+
+
diff --git a/dist/tablefilter/tf-0-789aa3c9851693c1f448.js b/dist/tablefilter/tf-0-789aa3c9851693c1f448.js
new file mode 100644
index 00000000..490c3851
--- /dev/null
+++ b/dist/tablefilter/tf-0-789aa3c9851693c1f448.js
@@ -0,0 +1,8 @@
+/** 
+ *	 tablefilter v0.6.3 by Max Guglielmi
+ *	 build date: 2017-11-30T02:49:15.503Z 
+ *	 MIT License  
+ */ 
+
+webpackJsonp([0],{440:function(t,e,n){function r(t){return n(i(t))}function i(t){var e=o[t];if(!(e+1))throw new Error("Cannot find module '"+t+"'.");return e}var o={"./array":70,"./array.js":70,"./const":15,"./const.js":15,"./cookie":116,"./cookie.js":116,"./dom":10,"./dom.js":10,"./emitter":109,"./emitter.js":109,"./event":19,"./event.js":19,"./extensions/advancedGrid/adapterEzEditTable":441,"./extensions/advancedGrid/adapterEzEditTable.js":441,"./extensions/advancedGrid/advancedGrid":443,"./extensions/advancedGrid/advancedGrid.js":443,"./extensions/colOps/colOps":444,"./extensions/colOps/colOps.js":444,"./extensions/colsVisibility/colsVisibility":445,"./extensions/colsVisibility/colsVisibility.js":445,"./extensions/filtersVisibility/filtersVisibility":446,"./extensions/filtersVisibility/filtersVisibility.js":446,"./extensions/sort/adapterSortabletable":442,"./extensions/sort/adapterSortabletable.js":442,"./extensions/sort/sort":447,"./extensions/sort/sort.js":447,"./feature":11,"./feature.js":11,"./modules/alternateRows":125,"./modules/alternateRows.js":125,"./modules/baseDropdown":69,"./modules/baseDropdown.js":69,"./modules/checkList":128,"./modules/checkList.js":128,"./modules/clearButton":124,"./modules/clearButton.js":124,"./modules/dateType":111,"./modules/dateType.js":111,"./modules/dropdown":110,"./modules/dropdown.js":110,"./modules/gridLayout":117,"./modules/gridLayout.js":117,"./modules/hash":114,"./modules/hash.js":114,"./modules/help":112,"./modules/help.js":112,"./modules/highlightKeywords":119,"./modules/highlightKeywords.js":119,"./modules/loader":118,"./modules/loader.js":118,"./modules/markActiveColumns":121,"./modules/markActiveColumns.js":121,"./modules/noResults":126,"./modules/noResults.js":126,"./modules/paging":127,"./modules/paging.js":127,"./modules/popupFilter":120,"./modules/popupFilter.js":120,"./modules/rowsCounter":122,"./modules/rowsCounter.js":122,"./modules/state":113,"./modules/state.js":113,"./modules/statusBar":123,"./modules/statusBar.js":123,"./modules/storage":115,"./modules/storage.js":115,"./modules/toolbar":33,"./modules/toolbar.js":33,"./number":68,"./number.js":68,"./root":16,"./root.js":16,"./settings":7,"./settings.js":7,"./sort":107,"./sort.js":107,"./string":21,"./string.js":21,"./tablefilter":108,"./tablefilter.js":108,"./types":3,"./types.js":3};r.keys=function(){return Object.keys(o)},r.resolve=i,t.exports=r,r.id=440},441:function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n0&&!n.startRow?void 0:n.startRow||t.refRow,n.base_path=n.base_path||t.basePath+"ezEditTable/";var r=n.editable,i=n.selection;i&&(n.default_selection=n.default_selection||"row"),n.active_cell_css=n.active_cell_css||"ezETSelectedCell";var o=0,s=0;if(i){var a=function(e,n,r){var i=e.Selection,a=function(r){if("row"===e.defaultSelection)i.SelectRowByIndex(r);else{e.ClearSelections();var o=n.cellIndex,s=t.dom().rows[r];"both"===e.defaultSelection&&i.SelectRowByIndex(r),s&&i.SelectCell(s.cells[o])}if(t.validRowsIndex.length!==t.getRowsNb()){var a=t.dom().rows[r];a&&a.scrollIntoView(!1),c&&(c.cellIndex===t.getCellsNb()-1&&t.gridLayout?t.tblCont.scrollLeft=1e8:0===c.cellIndex&&t.gridLayout?t.tblCont.scrollLeft=0:c.scrollIntoView(!1))}};if(t.validRowsIndex){var l=t.validRowsIndex,d=l.length,u="row"!==e.defaultSelection?n.parentNode:n,c="TD"===n.nodeName?n:null,h=void 0!==r?e.Event.GetKey(r):0,f=-1!==l.indexOf(u.rowIndex),p=void 0,b=t.feature("paging"),m=34===h||33===h?b&&b.pageLength||e.nbRowsPerPage:1;if(f)34!==h&&33!==h?(o=l.indexOf(u.rowIndex),s=u.rowIndex):(p=34===h?o+m<=d-1?l[o+m]:[d-1]:o-m<=l[0]?l[0]:l[o-m],s=p,o=l.indexOf(p),a(p));else{if(u.rowIndex>s)if(u.rowIndex>=l[d-1])p=l[d-1];else{var g=o+m;p=g>d-1?l[d-1]:l[g]}else if(u.rowIndex<=l[0])p=l[0];else{var v=l[o-m];p=v||l[0]}s=u.rowIndex,a(p)}}},d=function(e,n){var r="row"!==e.defaultSelection?n.parentNode:n;if(t.paging&&t.feature("paging").nbPages>1){var i=t.feature("paging");e.nbRowsPerPage=i.pageLength;var o=t.validRowsIndex,s=o.length,a=parseInt(i.startPagingRow,10)+parseInt(i.pageLength,10),l=r.rowIndex;l===o[s-1]&&i.currentPageNb!==i.nbPages?i.setPage("last"):l===o[0]&&1!==i.currentPageNb?i.setPage("first"):l>o[a-1]&&lo[0]&&i.setPage("previous")}};if(t.paging&&(t.feature("paging").onAfterChangePage=function(t){var e=t.tf.extension("advancedGrid"),n=e._ezEditTable,r=n.Selection,i=r.GetActiveRow();i&&i.scrollIntoView(!1);var o=r.GetActiveCell();o&&o.scrollIntoView(!1)}),"row"===n.default_selection){var u=n.on_before_selected_row;n.on_before_selected_row=function(){var t=arguments;d(t[0],t[1],t[2]),u&&u.call(null,t[0],t[1],t[2])};var c=n.on_after_selected_row;n.on_after_selected_row=function(){var t=arguments;a(t[0],t[1],t[2]),c&&c.call(null,t[0],t[1],t[2])}}else{var h=n.on_before_selected_cell;n.on_before_selected_cell=function(){var t=arguments;d(t[0],t[1],t[2]),h&&h.call(null,t[0],t[1],t[2])};var f=n.on_after_selected_cell;n.on_after_selected_cell=function(){var t=arguments;a(t[0],t[1],t[2]),f&&f.call(null,t[0],t[1],t[2])}}}if(r){var p=n.on_added_dom_row;if(n.on_added_dom_row=function(){var e=arguments;t.nbFilterableRows++,t.paging?(t.nbFilterableRows++,t.paging=!1,t.feature("paging").destroy(),t.feature("paging").reset()):t.emitter.emit("rows-changed",t,this),t.alternateRows&&t.feature("alternateRows").init(),p&&p.call(null,e[0],e[1],e[2])},n.actions&&n.actions.delete){var b=n.actions.delete.on_after_submit;n.actions.delete.on_after_submit=function(){var e=arguments;t.nbFilterableRows--,t.paging?(t.nbFilterableRows--,t.paging=!1,t.feature("paging").destroy(),t.feature("paging").reset(!1)):t.emitter.emit("rows-changed",t,this),t.alternateRows&&t.feature("alternateRows").init(),b&&b.call(null,e[0],e[1])}}}try{this._ezEditTable=new EditTable(t.id,n,e),this._ezEditTable.Init()}catch(t){throw new Error('Failed to instantiate EditTable object.\n    \n"ezEditTable" dependency not found.')}this.initialized=!0}},{key:"reset",value:function(){var t=this._ezEditTable;t&&(this.cfg.selection&&t.Selection.Set(),this.cfg.editable&&t.Editable.Set())}},{key:"toggle",value:function(){var t=this._ezEditTable;t.editable?t.Editable.Remove():t.Editable.Set(),t.selection?t.Selection.Remove():t.Selection.Set()}},{key:"_toggleForInputFilter",value:function(){var t=this.tf;if(t.getActiveFilterId()){var e=t.getColumnIndexFromFilterId(t.getActiveFilterId());t.getFilterType(e)===d.INPUT&&this.toggle()}}},{key:"destroy",value:function(){var t=this;if(this.initialized){var e=this._ezEditTable;e&&(this.cfg.selection&&(e.Selection.ClearSelections(),e.Selection.Remove()),this.cfg.editable&&e.Editable.Remove()),this.emitter.off(["filter-focus","filter-blur"],function(){return t._toggleForInputFilter()}),this.initialized=!1}}}]),e}(a.Feature);e.default=h},442:function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}function s(t){var e=t.split(".");for(var n in e){for(var r=e[n];3>r.length;)r="0"+r;e[n]=r}return e.join(".")}function a(t,e){var n=s(t.value.toLowerCase()),r=s(e.value.toLowerCase());return n===r?0:n0){var o=t.triggerIds;n=[],r=o.length;for(var s=0;s0&&function(){for(var e=t.triggerIds,n=0;n1&&void 0!==arguments[1]?arguments[1]:"sum",n=arguments[2],r=this.excludeRows||[],i=tf.getVisibleColumnData(t,!1,r);return Number(this.calc(i,e,n))}},{key:"calc",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"sum",n=arguments[2],r=0;switch("q1"!==e&&"q3"!==e&&"median"!==e||(t=this.sortColumnValues(t,u.numSortAsc)),e){case"mean":r=this.calcMean(t);break;case"sum":r=this.calcSum(t);break;case"min":r=this.calcMin(t);break;case"max":r=this.calcMax(t);break;case"median":r=this.calcMedian(t);break;case"q1":r=this.calcQ1(t);break;case"q3":r=this.calcQ3(t)}return(0,d.isEmpty)(n)?r:r.toFixed(n)}},{key:"calcSum",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return(0,d.isEmpty)(t)?0:t.reduce(function(t,e){return Number(t)+Number(e)})}},{key:"calcMean",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=this.calcSum(t)/t.length;return Number(e)}},{key:"calcMax",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return Math.max.apply(null,t)}},{key:"calcMin",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return Math.min.apply(null,t)}},{key:"calcMedian",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=t.length,n=0;return e%2==1?(n=Math.floor(e/2),Number(t[n])):(Number(t[e/2])+Number(t[e/2-1]))/2}},{key:"calcQ1",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=t.length,n=0;return n=Math.floor(e/4),4*n===e?(Number(t[n-1])+Number(t[n]))/2:Number(t[n])}},{key:"calcQ3",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=t.length,n=0,r=0;return n=Math.floor(e/4),4*n===e?(r=3*n,(Number(t[r])+Number(t[r-1]))/2):Number(t[e-n-1])}},{key:"sortColumnValues",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],e=arguments[1];return t.sort(e)}},{key:"writeResult",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0,e=arguments[1],n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"innerhtml",r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:2,i=arguments.length>4&&void 0!==arguments[4]?arguments[4]:{},o=(0,l.elm)(e);if(o)switch(t=t.toFixed(r),t=isNaN(t)||!isFinite(t)?"":(0,f.default)(i)(t),n.toLowerCase()){case"innerhtml":o.innerHTML=t;break;case"setvalue":o.value=t;break;case"createtextnode":var s=o.firstChild,a=(0,l.createText)(t);o.replaceChild(a,s)}}},{key:"configureFormat",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.tf;if(n.hasType(t,[c.FORMATTED_NUMBER])){var r=n.colTypes[t];r.decimal&&!e.decimal&&(e.decimal=r.decimal),r.thousands&&!e.integerSeparator&&(e.integerSeparator=r.thousands)}else e.decimal=e.decimal||"",e.integerSeparator=e.integerSeparator||"";return e}},{key:"destroy",value:function(){var t=this;this.initialized&&(this.emitter.off(b,function(){return t.calcAll()}),this.initialized=!1)}}]),e}(a.Feature);e.default=m},445:function(t,e,n){"use strict";function r(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}function i(t,e){if(!t)throw new ReferenceError("this hasn't been initialised - super() hasn't been called");return!e||"object"!=typeof e&&"function"!=typeof e?t:e}function o(t,e){if("function"!=typeof e&&null!==e)throw new TypeError("Super expression must either be null or a function, not "+typeof e);t.prototype=Object.create(e&&e.prototype,{constructor:{value:t,enumerable:!1,writable:!0,configurable:!0}}),e&&(Object.setPrototypeOf?Object.setPrototypeOf(t,e):t.__proto__=e)}Object.defineProperty(e,"__esModule",{value:!0});var s=function(){function t(t,e){for(var n=0;n',o.icnCollapseHtml='Collapse filters',o.defaultText="Toggle filters",o.targetId=n.target_id||null,o.enableIcon=(0,c.defaultsBool)(n.enable_icon,!0),o.btnText=(0,c.defaultsStr)(n.btn_text,""),o.collapseBtnHtml=o.enableIcon?o.icnCollapseHtml+o.btnText:o.btnText||o.defaultText,o.expandBtnHtml=o.enableIcon?o.icnExpandHtml+o.btnText:o.btnText||o.defaultText,o.btnHtml=(0,c.defaultsStr)(n.btn_html,null),o.btnCssClass=(0,c.defaultsStr)(n.btn_css_class,"btnExpClpFlt"),o.contCssClass=(0,c.defaultsStr)(n.cont_css_class,"expClpFlt"),o.filtersRowIndex=(0,c.defaultsNb)(n.filters_row_index,t.getFiltersRowIndex()),o.visibleAtStart=(0,c.defaultsNb)(n.visible_at_start,!0),o.toolbarPosition=(0,c.defaultsStr)(n.toolbar_position,h.RIGHT),o.onBeforeShow=(0,c.defaultsFn)(n.on_before_show,d.EMPTY_FN),o.onAfterShow=(0,c.defaultsFn)(n.on_after_show,d.EMPTY_FN),o.onBeforeHide=(0,c.defaultsFn)(n.on_before_hide,d.EMPTY_FN),o.onAfterHide=(0,c.defaultsFn)(n.on_after_hide,d.EMPTY_FN),t.import(n.name+"Style",t.getStylePath()+o.stylesheet,null,"link"),o.enable(),o}return o(e,t),s(e,[{key:"init",value:function(){var t=this;this.initialized||(this.emitter.emit("initializing-extension",this,!(0,d.isNull)(this.targetId)),this.buildUI(),this.initialized=!0,this.emitter.on(["show-filters"],function(e,n){return t.show(n)}),this.emitter.emit("filters-visibility-initialized",this.tf,this),this.emitter.emit("extension-initialized",this))}},{key:"buildUI",value:function(){var t=this,e=this.tf,n=(0,l.createElm)("span");n.className=this.contCssClass;var r=this.targetId?(0,l.elm)(this.targetId):e.feature("toolbar").container(this.toolbarPosition);if(this.targetId)r.appendChild(n);else{var i=r.firstChild;i.parentNode.insertBefore(n,i)}var o=void 0;this.btnHtml?(n.innerHTML=this.btnHtml,o=n.firstChild):(o=(0,l.createElm)("a",["href","javascript:void(0);"]),o.className=this.btnCssClass,o.title=this.btnText||this.defaultText,o.innerHTML=this.collapseBtnHtml,n.appendChild(o)),(0,u.addEvt)(o,"click",function(){return t.toggle()}),this.contEl=n,this.btnEl=o,this.visibleAtStart||this.toggle()}},{key:"toggle",value:function(){var t=this.tf,e=t.gridLayout?t.feature("gridLayout").headTbl:t.dom(),n=e.rows[this.filtersRowIndex],r=""===n.style.display;this.show(!r)}},{key:"show",value:function(){var t=!(arguments.length>0&&void 0!==arguments[0])||arguments[0],e=this.tf,n=e.gridLayout?e.feature("gridLayout").headTbl:e.dom(),r=n.rows[this.filtersRowIndex];t&&this.onBeforeShow(this),t||this.onBeforeHide(this),r.style.display=t?"":"none",this.enableIcon&&!this.btnHtml&&(this.btnEl.innerHTML=t?this.collapseBtnHtml:this.expandBtnHtml),t&&this.onAfterShow(this),t||this.onAfterHide(this),this.emitter.emit("filters-toggled",e,this,t)}},{key:"destroy",value:function(){var t=this;this.initialized&&(this.emitter.off(["show-filters"],function(e,n){return t.show(n)}),this.btnEl.innerHTML="",(0,l.removeElm)(this.btnEl),this.btnEl=null,this.contEl.innerHTML="",(0,l.removeElm)(this.contEl),this.contEl=null,this.initialized=!1)}}]),e}(a.Feature);e.default=f},447:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=n(442),i=function(t){return t&&t.__esModule?t:{default:t}}(r);n(16).root.SortableTable||n(449),e.default=i.default},448:function(t,e){function n(t){function e(e,n){if(n=n||{},!e&&0!==e)return"";e=""+e;var d=[],u="-"===e.charAt(0);return e=e.replace(/^\-/g,""),t.negativeLeftOut||n.noUnits||d.push(t.prefix),u&&d.push(t.negativeLeftSymbol),t.negativeLeftOut&&!n.noUnits&&d.push(t.prefix),e=e.split("."),null!=t.round&&l(e,t.round),null!=t.truncate&&(e[1]=a(e[1],t.truncate)),t.padLeft>0&&(e[0]=o(e[0],t.padLeft)),t.padRight>0&&(e[1]=s(e[1],t.padRight)),!n.noSeparator&&e[1]&&(e[1]=i(e[1],t.decimalsSeparator)),!n.noSeparator&&e[0]&&(e[0]=r(e[0],t.integerSeparator)),d.push(e[0]),e[1]&&(d.push(t.decimal),d.push(e[1])),t.negativeRightOut&&!n.noUnits&&d.push(t.suffix),u&&d.push(t.negativeRightSymbol),t.negativeRightOut||n.noUnits||d.push(t.suffix),d.join("")}function n(e,n){n=n||[],t.allowedSeparators&&t.allowedSeparators.forEach(function(t){n.push(t)}),n.push(t.integerSeparator),n.push(t.decimalsSeparator),e=e.replace(t.prefix,""),e=e.replace(t.suffix,"");var r=e;do{e=r;for(var i=0;ie?t.substr(0,e):t}function l(t,e){if(t[1]&&e>=0&&t[1].length>e){var n=t[1].slice(0,e);if(+t[1].substr(e,1)>=5){for(var r="";"0"===n.charAt(0);)r+="0",n=n.substr(1);n=+n+1+"",n=r+n,n.length>e&&(t[0]=+t[0]+ +n.charAt(0)+"",n=n.substring(1))}t[1]=n}return t}t.exports=n,t.exports.default=n},449:function(t,e,n){n(450)(n(451))},450:function(t,e){t.exports=function(t){"undefined"!=typeof execScript?execScript(t):eval.call(null,t)}},451:function(t,e){t.exports='/*----------------------------------------------------------------------------\\\r\n|                            Sortable Table 1.12                              |\r\n|-----------------------------------------------------------------------------|\r\n|                         Created by Erik Arvidsson                           |\r\n|                  (http://webfx.eae.net/contact.html#erik)                   |\r\n|                      For WebFX (http://webfx.eae.net/)                      |\r\n|-----------------------------------------------------------------------------|\r\n| A DOM 1 based script that allows an ordinary HTML table to be sortable.     |\r\n|-----------------------------------------------------------------------------|\r\n|                  Copyright (c) 1998 - 2006 Erik Arvidsson                   |\r\n|-----------------------------------------------------------------------------|\r\n| Licensed under the Apache License, Version 2.0 (the "License"); you may not |\r\n| use this file except in compliance with the License.  You may obtain a copy |\r\n| of the License at http://www.apache.org/licenses/LICENSE-2.0                |\r\n| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |\r\n| Unless  required  by  applicable law or  agreed  to  in  writing,  software |\r\n| distributed under the License is distributed on an  "AS IS" BASIS,  WITHOUT |\r\n| WARRANTIES OR  CONDITIONS OF ANY KIND,  either express or implied.  See the |\r\n| License  for the  specific language  governing permissions  and limitations |\r\n| under the License.                                                          |\r\n|-----------------------------------------------------------------------------|\r\n| 2003-01-10 | First version                                                  |\r\n| 2003-01-19 | Minor changes to the date parsing                              |\r\n| 2003-01-28 | JScript 5.0 fixes (no support for \'in\' operator)               |\r\n| 2003-02-01 | Sloppy typo like error fixed in getInnerText                   |\r\n| 2003-07-04 | Added workaround for IE cellIndex bug.                         |\r\n| 2003-11-09 | The bDescending argument to sort was not correctly working     |\r\n|            | Using onclick DOM0 event if no support for addEventListener    |\r\n|            | or attachEvent                                                 |\r\n| 2004-01-13 | Adding addSortType and removeSortType which makes it a lot     |\r\n|            | easier to add new, custom sort types.                          |\r\n| 2004-01-27 | Switch to use descending = false as the default sort order.    |\r\n|            | Change defaultDescending to suit your needs.                   |\r\n| 2004-03-14 | Improved sort type None look and feel a bit                    |\r\n| 2004-08-26 | Made the handling of tBody and tHead more flexible. Now you    |\r\n|            | can use another tHead or no tHead, and you can chose some      |\r\n|            | other tBody.                                                   |\r\n| 2006-04-25 | Changed license to Apache Software License 2.0                 |\r\n|-----------------------------------------------------------------------------|\r\n| Created 2003-01-10 | All changes are in the log above. | Updated 2006-04-25 |\r\n\\----------------------------------------------------------------------------*/\r\n\r\n\r\nfunction SortableTable(oTable, oSortTypes) {\r\n\r\n\tthis.sortTypes = oSortTypes || [];\r\n\r\n\tthis.sortColumn = null;\r\n\tthis.descending = null;\r\n\r\n\tvar oThis = this;\r\n\tthis._headerOnclick = function (e) {\r\n\t\toThis.headerOnclick(e);\r\n\t};\r\n\r\n\tif (oTable) {\r\n\t\tthis.setTable( oTable );\r\n\t\tthis.document = oTable.ownerDocument || oTable.document;\r\n\t}\r\n\telse {\r\n\t\tthis.document = document;\r\n\t}\r\n\r\n\r\n\t// only IE needs this\r\n\tvar win = this.document.defaultView || this.document.parentWindow;\r\n\tthis._onunload = function () {\r\n\t\toThis.destroy();\r\n\t};\r\n\tif (win && typeof win.attachEvent != "undefined") {\r\n\t\twin.attachEvent("onunload", this._onunload);\r\n\t}\r\n}\r\n\r\nSortableTable.gecko = navigator.product == "Gecko";\r\nSortableTable.msie = /msie/i.test(navigator.userAgent);\r\n// Mozilla is faster when doing the DOM manipulations on\r\n// an orphaned element. MSIE is not\r\nSortableTable.removeBeforeSort = SortableTable.gecko;\r\n\r\nSortableTable.prototype.onsort = function () {};\r\n\r\n// default sort order. true -> descending, false -> ascending\r\nSortableTable.prototype.defaultDescending = false;\r\n\r\n// shared between all instances. This is intentional to allow external files\r\n// to modify the prototype\r\nSortableTable.prototype._sortTypeInfo = {};\r\n\r\nSortableTable.prototype.setTable = function (oTable) {\r\n\tif ( this.tHead )\r\n\t\tthis.uninitHeader();\r\n\tthis.element = oTable;\r\n\tthis.setTHead( oTable.tHead );\r\n\tthis.setTBody( oTable.tBodies[0] );\r\n};\r\n\r\nSortableTable.prototype.setTHead = function (oTHead) {\r\n\tif (this.tHead && this.tHead != oTHead )\r\n\t\tthis.uninitHeader();\r\n\tthis.tHead = oTHead;\r\n\tthis.initHeader( this.sortTypes );\r\n};\r\n\r\nSortableTable.prototype.setTBody = function (oTBody) {\r\n\tthis.tBody = oTBody;\r\n};\r\n\r\nSortableTable.prototype.setSortTypes = function ( oSortTypes ) {\r\n\tif ( this.tHead )\r\n\t\tthis.uninitHeader();\r\n\tthis.sortTypes = oSortTypes || [];\r\n\tif ( this.tHead )\r\n\t\tthis.initHeader( this.sortTypes );\r\n};\r\n\r\n// adds arrow containers and events\r\n// also binds sort type to the header cells so that reordering columns does\r\n// not break the sort types\r\nSortableTable.prototype.initHeader = function (oSortTypes) {\r\n\tif (!this.tHead) return;\r\n\tvar cells = this.tHead.rows[0].cells;\r\n\tvar doc = this.tHead.ownerDocument || this.tHead.document;\r\n\tthis.sortTypes = oSortTypes || [];\r\n\tvar l = cells.length;\r\n\tvar img, c;\r\n\tfor (var i = 0; i < l; i++) {\r\n\t\tc = cells[i];\r\n\t\tif (this.sortTypes[i] != null && this.sortTypes[i] != "None") {\r\n\t\t\timg = doc.createElement("IMG");\r\n\t\t\timg.src = "images/blank.png";\r\n\t\t\tc.appendChild(img);\r\n\t\t\tif (this.sortTypes[i] != null)\r\n\t\t\t\tc._sortType = this.sortTypes[i];\r\n\t\t\tif (typeof c.addEventListener != "undefined")\r\n\t\t\t\tc.addEventListener("click", this._headerOnclick, false);\r\n\t\t\telse if (typeof c.attachEvent != "undefined")\r\n\t\t\t\tc.attachEvent("onclick", this._headerOnclick);\r\n\t\t\telse\r\n\t\t\t\tc.onclick = this._headerOnclick;\r\n\t\t}\r\n\t\telse\r\n\t\t{\r\n\t\t\tc.setAttribute( "_sortType", oSortTypes[i] );\r\n\t\t\tc._sortType = "None";\r\n\t\t}\r\n\t}\r\n\tthis.updateHeaderArrows();\r\n};\r\n\r\n// remove arrows and events\r\nSortableTable.prototype.uninitHeader = function () {\r\n\tif (!this.tHead) return;\r\n\tvar cells = this.tHead.rows[0].cells;\r\n\tvar l = cells.length;\r\n\tvar c;\r\n\tfor (var i = 0; i < l; i++) {\r\n\t\tc = cells[i];\r\n\t\tif (c._sortType != null && c._sortType != "None") {\r\n\t\t\tc.removeChild(c.lastChild);\r\n\t\t\tif (typeof c.removeEventListener != "undefined")\r\n\t\t\t\tc.removeEventListener("click", this._headerOnclick, false);\r\n\t\t\telse if (typeof c.detachEvent != "undefined")\r\n\t\t\t\tc.detachEvent("onclick", this._headerOnclick);\r\n\t\t\tc._sortType = null;\r\n\t\t\tc.removeAttribute( "_sortType" );\r\n\t\t}\r\n\t}\r\n};\r\n\r\nSortableTable.prototype.updateHeaderArrows = function () {\r\n\tif (!this.tHead) return;\r\n\tvar cells = this.tHead.rows[0].cells;\r\n\tvar l = cells.length;\r\n\tvar img;\r\n\tfor (var i = 0; i < l; i++) {\r\n\t\tif (cells[i]._sortType != null && cells[i]._sortType != "None") {\r\n\t\t\timg = cells[i].lastChild;\r\n\t\t\tif (i == this.sortColumn)\r\n\t\t\t\timg.className = "sort-arrow " + (this.descending ? "descending" : "ascending");\r\n\t\t\telse\r\n\t\t\t\timg.className = "sort-arrow";\r\n\t\t}\r\n\t}\r\n};\r\n\r\nSortableTable.prototype.headerOnclick = function (e) {\r\n\t// find TD element\r\n\tvar el = e.target || e.srcElement;\r\n\twhile (el.tagName != "TD")\r\n\t\tel = el.parentNode;\r\n\r\n\tthis.sort(SortableTable.msie ? SortableTable.getCellIndex(el) : el.cellIndex);\r\n};\r\n\r\n// IE returns wrong cellIndex when columns are hidden\r\nSortableTable.getCellIndex = function (oTd) {\r\n\tvar cells = oTd.parentNode.childNodes\r\n\tvar l = cells.length;\r\n\tvar i;\r\n\tfor (i = 0; cells[i] != oTd && i < l; i++)\r\n\t\t;\r\n\treturn i;\r\n};\r\n\r\nSortableTable.prototype.getSortType = function (nColumn) {\r\n\treturn this.sortTypes[nColumn] || "String";\r\n};\r\n\r\n// only nColumn is required\r\n// if bDescending is left out the old value is taken into account\r\n// if sSortType is left out the sort type is found from the sortTypes array\r\n\r\nSortableTable.prototype.sort = function (nColumn, bDescending, sSortType) {\r\n\tif (!this.tBody) return;\r\n\tif (sSortType == null)\r\n\t\tsSortType = this.getSortType(nColumn);\r\n\r\n\t// exit if None\r\n\tif (sSortType == "None")\r\n\t\treturn;\r\n\r\n\tif (bDescending == null) {\r\n\t\tif (this.sortColumn != nColumn)\r\n\t\t\tthis.descending = this.defaultDescending;\r\n\t\telse\r\n\t\t\tthis.descending = !this.descending;\r\n\t}\r\n\telse\r\n\t\tthis.descending = bDescending;\r\n\r\n\tthis.sortColumn = nColumn;\r\n\r\n\tif (typeof this.onbeforesort == "function")\r\n\t\tthis.onbeforesort();\r\n\r\n\tvar f = this.getSortFunction(sSortType, nColumn);\r\n\tvar a = this.getCache(sSortType, nColumn);\r\n\tvar tBody = this.tBody;\r\n\r\n\ta.sort(f);\r\n\r\n\tif (this.descending)\r\n\t\ta.reverse();\r\n\r\n\tif (SortableTable.removeBeforeSort) {\r\n\t\t// remove from doc\r\n\t\tvar nextSibling = tBody.nextSibling;\r\n\t\tvar p = tBody.parentNode;\r\n\t\tp.removeChild(tBody);\r\n\t}\r\n\r\n\t// insert in the new order\r\n\tvar l = a.length;\r\n\tfor (var i = 0; i < l; i++)\r\n\t\ttBody.appendChild(a[i].element);\r\n\r\n\tif (SortableTable.removeBeforeSort) {\r\n\t\t// insert into doc\r\n\t\tp.insertBefore(tBody, nextSibling);\r\n\t}\r\n\r\n\tthis.updateHeaderArrows();\r\n\r\n\tthis.destroyCache(a);\r\n\r\n\tif (typeof this.onsort == "function")\r\n\t\tthis.onsort();\r\n};\r\n\r\nSortableTable.prototype.asyncSort = function (nColumn, bDescending, sSortType) {\r\n\tvar oThis = this;\r\n\tthis._asyncsort = function () {\r\n\t\toThis.sort(nColumn, bDescending, sSortType);\r\n\t};\r\n\twindow.setTimeout(this._asyncsort, 1);\r\n};\r\n\r\nSortableTable.prototype.getCache = function (sType, nColumn) {\r\n\tif (!this.tBody) return [];\r\n\tvar rows = this.tBody.rows;\r\n\tvar l = rows.length;\r\n\tvar a = new Array(l);\r\n\tvar r;\r\n\tfor (var i = 0; i < l; i++) {\r\n\t\tr = rows[i];\r\n\t\ta[i] = {\r\n\t\t\tvalue:\t\tthis.getRowValue(r, sType, nColumn),\r\n\t\t\telement:\tr\r\n\t\t};\r\n\t};\r\n\treturn a;\r\n};\r\n\r\nSortableTable.prototype.destroyCache = function (oArray) {\r\n\tvar l = oArray.length;\r\n\tfor (var i = 0; i < l; i++) {\r\n\t\toArray[i].value = null;\r\n\t\toArray[i].element = null;\r\n\t\toArray[i] = null;\r\n\t}\r\n};\r\n\r\nSortableTable.prototype.getRowValue = function (oRow, sType, nColumn) {\r\n\t// if we have defined a custom getRowValue use that\r\n\tif (this._sortTypeInfo[sType] && this._sortTypeInfo[sType].getRowValue)\r\n\t\treturn this._sortTypeInfo[sType].getRowValue(oRow, nColumn);\r\n\r\n\tvar s;\r\n\tvar c = oRow.cells[nColumn];\r\n\tif (typeof c.innerText != "undefined")\r\n\t\ts = c.innerText;\r\n\telse\r\n\t\ts = SortableTable.getInnerText(c);\r\n\treturn this.getValueFromString(s, sType);\r\n};\r\n\r\nSortableTable.getInnerText = function (oNode) {\r\n\tvar s = "";\r\n\tvar cs = oNode.childNodes;\r\n\tvar l = cs.length;\r\n\tfor (var i = 0; i < l; i++) {\r\n\t\tswitch (cs[i].nodeType) {\r\n\t\t\tcase 1: //ELEMENT_NODE\r\n\t\t\t\ts += SortableTable.getInnerText(cs[i]);\r\n\t\t\t\tbreak;\r\n\t\t\tcase 3:\t//TEXT_NODE\r\n\t\t\t\ts += cs[i].nodeValue;\r\n\t\t\t\tbreak;\r\n\t\t}\r\n\t}\r\n\treturn s;\r\n};\r\n\r\nSortableTable.prototype.getValueFromString = function (sText, sType) {\r\n\tif (this._sortTypeInfo[sType])\r\n\t\treturn this._sortTypeInfo[sType].getValueFromString( sText );\r\n\treturn sText;\r\n\t/*\r\n\tswitch (sType) {\r\n\t\tcase "Number":\r\n\t\t\treturn Number(sText);\r\n\t\tcase "CaseInsensitiveString":\r\n\t\t\treturn sText.toUpperCase();\r\n\t\tcase "Date":\r\n\t\t\tvar parts = sText.split("-");\r\n\t\t\tvar d = new Date(0);\r\n\t\t\td.setFullYear(parts[0]);\r\n\t\t\td.setDate(parts[2]);\r\n\t\t\td.setMonth(parts[1] - 1);\r\n\t\t\treturn d.valueOf();\r\n\t}\r\n\treturn sText;\r\n\t*/\r\n\t};\r\n\r\nSortableTable.prototype.getSortFunction = function (sType, nColumn) {\r\n\tif (this._sortTypeInfo[sType])\r\n\t\treturn this._sortTypeInfo[sType].compare;\r\n\treturn SortableTable.basicCompare;\r\n};\r\n\r\nSortableTable.prototype.destroy = function () {\r\n\tthis.uninitHeader();\r\n\tvar win = this.document.parentWindow;\r\n\tif (win && typeof win.detachEvent != "undefined") {\t// only IE needs this\r\n\t\twin.detachEvent("onunload", this._onunload);\r\n\t}\r\n\tthis._onunload = null;\r\n\tthis.element = null;\r\n\tthis.tHead = null;\r\n\tthis.tBody = null;\r\n\tthis.document = null;\r\n\tthis._headerOnclick = null;\r\n\tthis.sortTypes = null;\r\n\tthis._asyncsort = null;\r\n\tthis.onsort = null;\r\n};\r\n\r\n// Adds a sort type to all instance of SortableTable\r\n// sType : String - the identifier of the sort type\r\n// fGetValueFromString : function ( s : string ) : T - A function that takes a\r\n//    string and casts it to a desired format. If left out the string is just\r\n//    returned\r\n// fCompareFunction : function ( n1 : T, n2 : T ) : Number - A normal JS sort\r\n//    compare function. Takes two values and compares them. If left out less than,\r\n//    <, compare is used\r\n// fGetRowValue : function( oRow : HTMLTRElement, nColumn : int ) : T - A function\r\n//    that takes the row and the column index and returns the value used to compare.\r\n//    If left out then the innerText is first taken for the cell and then the\r\n//    fGetValueFromString is used to convert that string the desired value and type\r\n\r\nSortableTable.prototype.addSortType = function (sType, fGetValueFromString, fCompareFunction, fGetRowValue) {\r\n\tthis._sortTypeInfo[sType] = {\r\n\t\ttype:\t\t\t\tsType,\r\n\t\tgetValueFromString:\tfGetValueFromString || SortableTable.idFunction,\r\n\t\tcompare:\t\t\tfCompareFunction || SortableTable.basicCompare,\r\n\t\tgetRowValue:\t\tfGetRowValue\r\n\t};\r\n};\r\n\r\n// this removes the sort type from all instances of SortableTable\r\nSortableTable.prototype.removeSortType = function (sType) {\r\n\tdelete this._sortTypeInfo[sType];\r\n};\r\n\r\nSortableTable.basicCompare = function compare(n1, n2) {\r\n\tif (n1.value < n2.value)\r\n\t\treturn -1;\r\n\tif (n2.value < n1.value)\r\n\t\treturn 1;\r\n\treturn 0;\r\n};\r\n\r\nSortableTable.idFunction = function (x) {\r\n\treturn x;\r\n};\r\n\r\nSortableTable.toUpperCase = function (s) {\r\n\treturn s.toUpperCase();\r\n};\r\n\r\nSortableTable.toDate = function (s) {\r\n\tvar parts = s.split("-");\r\n\tvar d = new Date(0);\r\n\td.setFullYear(parts[0]);\r\n\td.setDate(parts[2]);\r\n\td.setMonth(parts[1] - 1);\r\n\treturn d.valueOf();\r\n};\r\n\r\n\r\n// add sort types\r\nSortableTable.prototype.addSortType("Number", Number);\r\nSortableTable.prototype.addSortType("CaseInsensitiveString", SortableTable.toUpperCase);\r\nSortableTable.prototype.addSortType("Date", SortableTable.toDate);\r\nSortableTable.prototype.addSortType("String");\r\n// None is a special case\r\n'}});
+//# sourceMappingURL=tf-0-789aa3c9851693c1f448.js.map
\ No newline at end of file
diff --git a/dist/tablefilter/tf-0-789aa3c9851693c1f448.js.map b/dist/tablefilter/tf-0-789aa3c9851693c1f448.js.map
new file mode 100644
index 00000000..92495b7b
--- /dev/null
+++ b/dist/tablefilter/tf-0-789aa3c9851693c1f448.js.map
@@ -0,0 +1 @@
+{"version":3,"sources":["webpack:///tf-0-789aa3c9851693c1f448.js","webpack:///./src ^\\.\\/.*$","webpack:///./src/extensions/advancedGrid/adapterEzEditTable.js","webpack:///./src/extensions/sort/adapterSortabletable.js","webpack:///./src/extensions/advancedGrid/advancedGrid.js","webpack:///./src/extensions/colOps/colOps.js","webpack:///./src/extensions/colsVisibility/colsVisibility.js","webpack:///./src/extensions/filtersVisibility/filtersVisibility.js","webpack:///./src/extensions/sort/sort.js","webpack:///./node_modules/format-number/index.js","webpack:///./libs/sortabletable.js?75ef","webpack:///./node_modules/script-loader/addScript.js","webpack:///./libs/sortabletable.js"],"names":["webpackJsonp","440","module","exports","__webpack_require__","webpackContext","req","webpackContextResolve","id","map","Error","./array","./array.js","./const","./const.js","./cookie","./cookie.js","./dom","./dom.js","./emitter","./emitter.js","./event","./event.js","./extensions/advancedGrid/adapterEzEditTable","./extensions/advancedGrid/adapterEzEditTable.js","./extensions/advancedGrid/advancedGrid","./extensions/advancedGrid/advancedGrid.js","./extensions/colOps/colOps","./extensions/colOps/colOps.js","./extensions/colsVisibility/colsVisibility","./extensions/colsVisibility/colsVisibility.js","./extensions/filtersVisibility/filtersVisibility","./extensions/filtersVisibility/filtersVisibility.js","./extensions/sort/adapterSortabletable","./extensions/sort/adapterSortabletable.js","./extensions/sort/sort","./extensions/sort/sort.js","./feature","./feature.js","./modules/alternateRows","./modules/alternateRows.js","./modules/baseDropdown","./modules/baseDropdown.js","./modules/checkList","./modules/checkList.js","./modules/clearButton","./modules/clearButton.js","./modules/dateType","./modules/dateType.js","./modules/dropdown","./modules/dropdown.js","./modules/gridLayout","./modules/gridLayout.js","./modules/hash","./modules/hash.js","./modules/help","./modules/help.js","./modules/highlightKeywords","./modules/highlightKeywords.js","./modules/loader","./modules/loader.js","./modules/markActiveColumns","./modules/markActiveColumns.js","./modules/noResults","./modules/noResults.js","./modules/paging","./modules/paging.js","./modules/popupFilter","./modules/popupFilter.js","./modules/rowsCounter","./modules/rowsCounter.js","./modules/state","./modules/state.js","./modules/statusBar","./modules/statusBar.js","./modules/storage","./modules/storage.js","./modules/toolbar","./modules/toolbar.js","./number","./number.js","./root","./root.js","./settings","./settings.js","./sort","./sort.js","./string","./string.js","./tablefilter","./tablefilter.js","./types","./types.js","keys","Object","resolve","441","_classCallCheck","instance","Constructor","TypeError","_possibleConstructorReturn","self","call","ReferenceError","_inherits","subClass","superClass","prototype","create","constructor","value","enumerable","writable","configurable","setPrototypeOf","__proto__","defineProperty","_createClass","defineProperties","target","props","i","length","descriptor","key","protoProps","staticProps","_feature","_dom","_const","_settings","_root","AdapterEzEditTable","_Feature","tf","cfg","this","_this","getPrototypeOf","name","desc","defaultsStr","description","filename","vendorPath","vendor_path","loadStylesheet","Boolean","load_stylesheet","stylesheet","stylesheetName","stylesheet_name","scroll_into_view","gridLayout","_ezEditTable","enable","_this2","initialized","root","EditTable","_setAdvancedGrid","path","import","isImported","emitter","on","_toggleForInputFilter","startRow","tag","dom","undefined","refRow","base_path","basePath","editable","selectable","selection","default_selection","active_cell_css","_lastValidRowIndex","_lastRowIndex","onAfterSelection","et","selectedElm","e","slc","Selection","doSelect","nextRowIndex","defaultSelection","SelectRowByIndex","ClearSelections","cellIndex","row","rows","SelectCell","cells","validRowsIndex","getRowsNb","r","scrollIntoView","cell","getCellsNb","tblCont","scrollLeft","validIndexes","validIdxLen","parentNode","nodeName","keyCode","Event","GetKey","isRowValid","indexOf","rowIndex","paging","feature","d","pageLength","nbRowsPerPage","calcRowIndex","v","onBeforeSelection","nbPages","pagingEndRow","parseInt","startPagingRow","currentPageNb","setPage","onAfterChangePage","advGrid","extension","GetActiveRow","GetActiveCell","fnB","on_before_selected_row","args","arguments","fnA","on_after_selected_row","fnD","on_before_selected_cell","fnC","on_after_selected_cell","fnE","on_added_dom_row","nbFilterableRows","destroy","reset","emit","alternateRows","init","actions","fnF","on_after_submit","Init","INSTANTIATION_ERROR","ezEditTable","Set","Editable","Remove","getActiveFilterId","colIndex","getColumnIndexFromFilterId","getFilterType","filterType","toggle","_this3","off","Feature","default","442","ipAddress","vals","split","x","val","join","sortIP","a","b","aa","toLowerCase","bb","_types","_event","_number","AdapterSortableTable","opts","sorted","sortTypes","defaultsArr","types","colTypes","sortColAtStart","sort_col_at_start","asyncSort","async_sort","triggerIds","trigger_ids","imgPath","images_path","themesPath","imgBlank","image_blank","imgClassName","image_class_name","imgAscClassName","image_asc_class_name","imgDescClassName","image_desc_class_name","customKey","custom_key","onSortLoaded","defaultsFn","on_sort_loaded","EMPTY_FN","onBeforeSort","on_before_sort","onAfterSort","on_after_sort","stt","adpt","isUndef","SortableTable","overrideSortableTable","setSortTypes","onbeforesort","sortColumn","disable","onsort","paginator","getValidRows","getPage","descending","sort","colIdx","sortByColumnIndex","headerOnclick","evt","el","srcElement","tagName","CELL_TAG","HEADER_TAG","msie","getCellIndex","oTd","l","initHeader","oSortTypes","tHead","headTbl","headersRow","img","c","style","cursor","createElm","appendChild","setAttribute","addEvt","_headerOnclick","_sortType","updateHeaderArrows","triggers","j","push","elm","cellAttr","getAttribute","lastChild","className","getRowValue","oRow","sType","nColumn","sortTypeInfo","_sortTypeInfo","s","getInnerText","getValueFromString","oNode","getText","_len","Array","_key","caster","sorter","addSortType","_sortTypes","eachCol","colType","isObj","type","DATE","_addDateType","FORMATTED_NUMBER","decimal","decimalSeparator","_addNumberType","toUpperCase","STRING","IP_ADDRESS","trigger","dateType","locale","getOptions","parsedDate","parse","isNaN","Date","_this4","ids","getFiltersId","idx","header","getHeaderElement","removeChild","443","_adapterEzEditTable","_adapterEzEditTable2","obj","__esModule","444","_sort","_formatNumber","_formatNumber2","EVENTS","ColOps","onBeforeOperation","on_before_operation","onAfterOperation","on_after_operation","labelIds","colIndexes","col","operations","operation","outputTypes","write_method","formatResults","format_result","totRowIndexes","tot_row_index","excludeRows","exclude_row","decimalPrecisions","decimal_precision","calcAll","isInitialized","colOperations","uIndexes","forEach","nbCols","colValues","u","getVisibleColumnData","curValues","result","precisions","labels","writeType","formatResult","k","isArray","configureFormat","Number","calc","writeResult","totRow","display","precision","sortColumnValues","numSortAsc","calcMean","calcSum","calcMin","calcMax","calcMedian","calcQ1","calcQ3","isEmpty","toFixed","values","reduce","y","Math","max","apply","min","nbValues","aux","floor","posa","posb","label","format","labelElm","isFinite","innerHTML","oldNode","firstChild","txtNode","createText","replaceChild","hasType","thousands","integerSeparator","445","_toolbar","ColsVisibility","f","config","spanEl","btnEl","contEl","tickToHide","defaultsBool","tick_to_hide","manager","headersTbl","headers_table","headersIndex","defaultsNb","headers_index","contElTgtId","container_target_id","headersText","headers_text","btnTgtId","btn_target_id","btnText","btn_text","btnHtml","btn_html","btnCssClass","btn_css_class","btnCloseText","btn_close_text","btnCloseHtml","btn_close_html","btnCloseCssClass","btn_close_css_class","spanCssClass","span_css_class","contCssClass","cont_css_class","listCssClass","list_css_class","listItemCssClass","checklist_item_css_class","listSlcItemCssClass","checklist_selected_item_css_class","text","atStart","at_start","enableHover","enable_hover","enableTickAll","enable_tick_all","tickAllText","tick_all_text","toolbarPosition","toolbar_position","RIGHT","hiddenCols","boundMouseup","onLoaded","on_loaded","onBeforeOpen","on_before_open","onAfterOpen","on_after_open","onBeforeClose","on_before_close","onAfterClose","on_after_close","onBeforeColHidden","on_before_col_hidden","onAfterColHidden","on_after_col_hidden","onBeforeColDisplayed","on_before_col_displayed","onAfterColDisplayed","on_after_col_displayed","getStylePath","targetElm","targetEvt","removeEvt","contDisplay","NONE","lbl","li","isChecked","checked","addClass","removeClass","hide","setHidden","isNull","hideCol","buildBtn","buildManager","onMouseup","bind","_hideAtStart","span","targetEl","container","insertBefore","colVisEl","btn","title","extNameLabel","ul","tbl","headerIndex","getHeadersRowIndex","headerRow","createCheckItem","check","h","itm","click","cellText","_getHeaderText","liElm","checkItem","p","_hideElements","itemIndex","splice","isColHidden","showCol","_this5","removeElm","hasChildNodes","childNodes","n","nodeType","nodeValue","_hideCells","_hideCol","colElms","_this6","446","FiltersVisibility","icnExpand","expand_icon_name","icnCollapse","collapse_icon_name","icnExpandHtml","icnCollapseHtml","defaultText","targetId","target_id","enableIcon","enable_icon","collapseBtnHtml","expandBtnHtml","filtersRowIndex","filters_row_index","getFiltersRowIndex","visibleAtStart","visible_at_start","onBeforeShow","on_before_show","onAfterShow","on_after_show","onBeforeHide","on_before_hide","onAfterHide","on_after_hide","buildUI","visible","show","fltRow","isDisplayed","447","_adapterSortabletable","_adapterSortabletable2","448","formatter","options","number","overrideOptions","output","negative","charAt","replace","negativeLeftOut","noUnits","prefix","negativeLeftSymbol","round","truncate","padLeft","padRight","noSeparator","addDecimalSeparators","decimalsSeparator","addIntegerSeparators","negativeRightOut","suffix","negativeRightSymbol","unformat","allowedSeparators","newNumber","negativeType","negativeOut","separator","separate","rgx","test","padding","buf","substr","places","decim","slice","leadingzeros","substring","449","450","src","execScript","eval","451"],"mappings":"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","file":"tf-0-789aa3c9851693c1f448.js","sourcesContent":["webpackJsonp([0],{\n\n/***/ 440:\n/***/ (function(module, exports, __webpack_require__) {\n\nvar map = {\n\t\"./array\": 70,\n\t\"./array.js\": 70,\n\t\"./const\": 15,\n\t\"./const.js\": 15,\n\t\"./cookie\": 116,\n\t\"./cookie.js\": 116,\n\t\"./dom\": 10,\n\t\"./dom.js\": 10,\n\t\"./emitter\": 109,\n\t\"./emitter.js\": 109,\n\t\"./event\": 19,\n\t\"./event.js\": 19,\n\t\"./extensions/advancedGrid/adapterEzEditTable\": 441,\n\t\"./extensions/advancedGrid/adapterEzEditTable.js\": 441,\n\t\"./extensions/advancedGrid/advancedGrid\": 443,\n\t\"./extensions/advancedGrid/advancedGrid.js\": 443,\n\t\"./extensions/colOps/colOps\": 444,\n\t\"./extensions/colOps/colOps.js\": 444,\n\t\"./extensions/colsVisibility/colsVisibility\": 445,\n\t\"./extensions/colsVisibility/colsVisibility.js\": 445,\n\t\"./extensions/filtersVisibility/filtersVisibility\": 446,\n\t\"./extensions/filtersVisibility/filtersVisibility.js\": 446,\n\t\"./extensions/sort/adapterSortabletable\": 442,\n\t\"./extensions/sort/adapterSortabletable.js\": 442,\n\t\"./extensions/sort/sort\": 447,\n\t\"./extensions/sort/sort.js\": 447,\n\t\"./feature\": 11,\n\t\"./feature.js\": 11,\n\t\"./modules/alternateRows\": 125,\n\t\"./modules/alternateRows.js\": 125,\n\t\"./modules/baseDropdown\": 69,\n\t\"./modules/baseDropdown.js\": 69,\n\t\"./modules/checkList\": 128,\n\t\"./modules/checkList.js\": 128,\n\t\"./modules/clearButton\": 124,\n\t\"./modules/clearButton.js\": 124,\n\t\"./modules/dateType\": 111,\n\t\"./modules/dateType.js\": 111,\n\t\"./modules/dropdown\": 110,\n\t\"./modules/dropdown.js\": 110,\n\t\"./modules/gridLayout\": 117,\n\t\"./modules/gridLayout.js\": 117,\n\t\"./modules/hash\": 114,\n\t\"./modules/hash.js\": 114,\n\t\"./modules/help\": 112,\n\t\"./modules/help.js\": 112,\n\t\"./modules/highlightKeywords\": 119,\n\t\"./modules/highlightKeywords.js\": 119,\n\t\"./modules/loader\": 118,\n\t\"./modules/loader.js\": 118,\n\t\"./modules/markActiveColumns\": 121,\n\t\"./modules/markActiveColumns.js\": 121,\n\t\"./modules/noResults\": 126,\n\t\"./modules/noResults.js\": 126,\n\t\"./modules/paging\": 127,\n\t\"./modules/paging.js\": 127,\n\t\"./modules/popupFilter\": 120,\n\t\"./modules/popupFilter.js\": 120,\n\t\"./modules/rowsCounter\": 122,\n\t\"./modules/rowsCounter.js\": 122,\n\t\"./modules/state\": 113,\n\t\"./modules/state.js\": 113,\n\t\"./modules/statusBar\": 123,\n\t\"./modules/statusBar.js\": 123,\n\t\"./modules/storage\": 115,\n\t\"./modules/storage.js\": 115,\n\t\"./modules/toolbar\": 33,\n\t\"./modules/toolbar.js\": 33,\n\t\"./number\": 68,\n\t\"./number.js\": 68,\n\t\"./root\": 16,\n\t\"./root.js\": 16,\n\t\"./settings\": 7,\n\t\"./settings.js\": 7,\n\t\"./sort\": 107,\n\t\"./sort.js\": 107,\n\t\"./string\": 21,\n\t\"./string.js\": 21,\n\t\"./tablefilter\": 108,\n\t\"./tablefilter.js\": 108,\n\t\"./types\": 3,\n\t\"./types.js\": 3\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 440;\n\n/***/ }),\n\n/***/ 441:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _feature = __webpack_require__(11);\n\nvar _dom = __webpack_require__(10);\n\nvar _const = __webpack_require__(15);\n\nvar _settings = __webpack_require__(7);\n\nvar _root = __webpack_require__(16);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar INSTANTIATION_ERROR = 'Failed to instantiate EditTable object.\\n    \\n\"ezEditTable\" dependency not found.';\n\n/**\r\n * Adapter module for ezEditTable, an external library providing advanced\r\n * grid features (selection and edition):\r\n * http://codecanyon.net/item/ezedittable-enhance-html-tables/2425123?ref=koalyptus\r\n */\n\nvar AdapterEzEditTable = function (_Feature) {\n    _inherits(AdapterEzEditTable, _Feature);\n\n    /**\r\n     * Creates an instance of AdapterEzEditTable\r\n     *\r\n     * @param {TableFilter} tf TableFilter instance\r\n     * @param {Object} cfg Configuration options for ezEditTable library\r\n     */\n    function AdapterEzEditTable(tf, cfg) {\n        _classCallCheck(this, AdapterEzEditTable);\n\n        /**\r\n         * Module description\r\n         * @type {String}\r\n         */\n        var _this = _possibleConstructorReturn(this, (AdapterEzEditTable.__proto__ || Object.getPrototypeOf(AdapterEzEditTable)).call(this, tf, cfg.name));\n\n        _this.desc = (0, _settings.defaultsStr)(cfg.description, 'ezEditTable adapter');\n\n        /**\r\n         * Filename of ezEditTable library\r\n         * @type {String}\r\n         */\n        _this.filename = (0, _settings.defaultsStr)(cfg.filename, 'ezEditTable.js');\n\n        /**\r\n         * Path to ezEditTable library\r\n         * @type {String}\r\n         */\n        _this.vendorPath = cfg.vendor_path;\n\n        /**\r\n         * Load ezEditTable stylesheet\r\n         * @type {Boolean}\r\n         */\n        _this.loadStylesheet = Boolean(cfg.load_stylesheet);\n\n        /**\r\n         * Path to ezEditTable stylesheet\r\n         * @type {String}\r\n         */\n        _this.stylesheet = (0, _settings.defaultsStr)(cfg.stylesheet, _this.vendorPath + 'ezEditTable.css');\n\n        /**\r\n         * Name of ezEditTable stylesheet\r\n         * @type {String}\r\n         */\n        _this.stylesheetName = (0, _settings.defaultsStr)(cfg.stylesheet_name, 'ezEditTableCss');\n\n        // Enable the ezEditTable's scroll into view behaviour if grid layout on\n        cfg.scroll_into_view = cfg.scroll_into_view === false ? false : tf.gridLayout;\n\n        /**\r\n         * ezEditTable instance\r\n         * @type {EditTable}\r\n         * @private\r\n         */\n        _this._ezEditTable = null;\n\n        /**\r\n         * ezEditTable configuration\r\n         * @private\r\n         */\n        _this.cfg = cfg;\n\n        _this.enable();\n        return _this;\n    }\n\n    /**\r\n     * Conditionally load ezEditTable library and set advanced grid\r\n     */\n\n\n    _createClass(AdapterEzEditTable, [{\n        key: 'init',\n        value: function init() {\n            var _this2 = this;\n\n            if (this.initialized) {\n                return;\n            }\n            var tf = this.tf;\n            if (_root.root.EditTable) {\n                this._setAdvancedGrid();\n            } else {\n                var path = this.vendorPath + this.filename;\n                tf.import(this.filename, path, function () {\n                    return _this2._setAdvancedGrid();\n                });\n            }\n            if (this.loadStylesheet && !tf.isImported(this.stylesheet, 'link')) {\n                tf.import(this.stylesheetName, this.stylesheet, null, 'link');\n            }\n\n            // TODO: hack to prevent ezEditTable enter key event hijaking.\n            // Needs to be fixed in the vendor's library\n            this.emitter.on(['filter-focus', 'filter-blur'], function () {\n                return _this2._toggleForInputFilter();\n            });\n\n            /**\r\n             * @inherited\r\n             */\n            this.initialized = true;\n        }\n\n        /**\r\n         * Instantiate ezEditTable component for advanced grid features\r\n         * @private\r\n         */\n\n    }, {\n        key: '_setAdvancedGrid',\n        value: function _setAdvancedGrid() {\n            var tf = this.tf;\n\n            //start row for EditTable constructor needs to be calculated\n            var startRow = void 0,\n                cfg = this.cfg,\n                thead = (0, _dom.tag)(tf.dom(), 'thead');\n\n            //if thead exists and startRow not specified, startRow is calculated\n            //automatically by EditTable\n            if (thead.length > 0 && !cfg.startRow) {\n                startRow = undefined;\n            }\n            //otherwise startRow config property if any or TableFilter refRow\n            else {\n                    startRow = cfg.startRow || tf.refRow;\n                }\n\n            cfg.base_path = cfg.base_path || tf.basePath + 'ezEditTable/';\n            var editable = cfg.editable;\n            var selectable = cfg.selection;\n\n            if (selectable) {\n                cfg.default_selection = cfg.default_selection || 'row';\n            }\n            //CSS Styles\n            cfg.active_cell_css = cfg.active_cell_css || 'ezETSelectedCell';\n\n            var _lastValidRowIndex = 0;\n            var _lastRowIndex = 0;\n\n            if (selectable) {\n                //Row navigation needs to be calculated according to TableFilter's\n                //validRowsIndex array\n                var onAfterSelection = function onAfterSelection(et, selectedElm, e) {\n                    var slc = et.Selection;\n                    //Next valid filtered row needs to be selected\n                    var doSelect = function doSelect(nextRowIndex) {\n                        if (et.defaultSelection === 'row') {\n                            /* eslint-disable */\n                            slc.SelectRowByIndex(nextRowIndex);\n                            /* eslint-enable */\n                        } else {\n                            /* eslint-disable */\n                            et.ClearSelections();\n                            /* eslint-enable */\n                            var cellIndex = selectedElm.cellIndex,\n                                _row = tf.dom().rows[nextRowIndex];\n                            if (et.defaultSelection === 'both') {\n                                /* eslint-disable */\n                                slc.SelectRowByIndex(nextRowIndex);\n                                /* eslint-enable */\n                            }\n                            if (_row) {\n                                /* eslint-disable */\n                                slc.SelectCell(_row.cells[cellIndex]);\n                                /* eslint-enable */\n                            }\n                        }\n                        //Table is filtered\n                        if (tf.validRowsIndex.length !== tf.getRowsNb()) {\n                            var r = tf.dom().rows[nextRowIndex];\n                            if (r) {\n                                r.scrollIntoView(false);\n                            }\n                            if (cell) {\n                                if (cell.cellIndex === tf.getCellsNb() - 1 && tf.gridLayout) {\n                                    tf.tblCont.scrollLeft = 100000000;\n                                } else if (cell.cellIndex === 0 && tf.gridLayout) {\n                                    tf.tblCont.scrollLeft = 0;\n                                } else {\n                                    cell.scrollIntoView(false);\n                                }\n                            }\n                        }\n                    };\n\n                    //table is not filtered\n                    if (!tf.validRowsIndex) {\n                        return;\n                    }\n                    var validIndexes = tf.validRowsIndex,\n                        validIdxLen = validIndexes.length,\n                        row = et.defaultSelection !== 'row' ? selectedElm.parentNode : selectedElm,\n\n                    //cell for default_selection = 'both' or 'cell'\n                    cell = selectedElm.nodeName === 'TD' ? selectedElm : null,\n\n                    /* eslint-disable */\n                    keyCode = e !== undefined ? et.Event.GetKey(e) : 0,\n\n                    /* eslint-enable */\n                    isRowValid = validIndexes.indexOf(row.rowIndex) !== -1,\n                        nextRowIndex = void 0,\n                        paging = tf.feature('paging'),\n\n                    //pgup/pgdown keys\n                    d = keyCode === 34 || keyCode === 33 ? paging && paging.pageLength || et.nbRowsPerPage : 1;\n\n                    //If next row is not valid, next valid filtered row needs to be\n                    //calculated\n                    if (!isRowValid) {\n                        //Selection direction up/down\n                        if (row.rowIndex > _lastRowIndex) {\n                            //last row\n                            if (row.rowIndex >= validIndexes[validIdxLen - 1]) {\n                                nextRowIndex = validIndexes[validIdxLen - 1];\n                            } else {\n                                var calcRowIndex = _lastValidRowIndex + d;\n                                if (calcRowIndex > validIdxLen - 1) {\n                                    nextRowIndex = validIndexes[validIdxLen - 1];\n                                } else {\n                                    nextRowIndex = validIndexes[calcRowIndex];\n                                }\n                            }\n                        } else {\n                            //first row\n                            if (row.rowIndex <= validIndexes[0]) {\n                                nextRowIndex = validIndexes[0];\n                            } else {\n                                var v = validIndexes[_lastValidRowIndex - d];\n                                nextRowIndex = v ? v : validIndexes[0];\n                            }\n                        }\n                        _lastRowIndex = row.rowIndex;\n                        doSelect(nextRowIndex);\n                    } else {\n                        //If filtered row is valid, special calculation for\n                        //pgup/pgdown keys\n                        if (keyCode !== 34 && keyCode !== 33) {\n                            _lastValidRowIndex = validIndexes.indexOf(row.rowIndex);\n                            _lastRowIndex = row.rowIndex;\n                        } else {\n                            if (keyCode === 34) {\n                                //pgdown\n                                //last row\n                                if (_lastValidRowIndex + d <= validIdxLen - 1) {\n                                    nextRowIndex = validIndexes[_lastValidRowIndex + d];\n                                } else {\n                                    nextRowIndex = [validIdxLen - 1];\n                                }\n                            } else {\n                                //pgup\n                                //first row\n                                if (_lastValidRowIndex - d <= validIndexes[0]) {\n                                    nextRowIndex = validIndexes[0];\n                                } else {\n                                    nextRowIndex = validIndexes[_lastValidRowIndex - d];\n                                }\n                            }\n                            _lastRowIndex = nextRowIndex;\n                            _lastValidRowIndex = validIndexes.indexOf(nextRowIndex);\n                            doSelect(nextRowIndex);\n                        }\n                    }\n                };\n\n                //Page navigation has to be enforced whenever selected row is out of\n                //the current page range\n                var onBeforeSelection = function onBeforeSelection(et, selectedElm) {\n                    var row = et.defaultSelection !== 'row' ? selectedElm.parentNode : selectedElm;\n                    if (tf.paging) {\n                        if (tf.feature('paging').nbPages > 1) {\n                            var paging = tf.feature('paging');\n                            //page length is re-assigned in case it has changed\n                            et.nbRowsPerPage = paging.pageLength;\n                            var validIndexes = tf.validRowsIndex,\n                                validIdxLen = validIndexes.length,\n                                pagingEndRow = parseInt(paging.startPagingRow, 10) + parseInt(paging.pageLength, 10);\n                            var rowIndex = row.rowIndex;\n\n                            if (rowIndex === validIndexes[validIdxLen - 1] && paging.currentPageNb !== paging.nbPages) {\n                                paging.setPage('last');\n                            } else if (rowIndex === validIndexes[0] && paging.currentPageNb !== 1) {\n                                paging.setPage('first');\n                            } else if (rowIndex > validIndexes[pagingEndRow - 1] && rowIndex < validIndexes[validIdxLen - 1]) {\n                                paging.setPage('next');\n                            } else if (rowIndex < validIndexes[paging.startPagingRow] && rowIndex > validIndexes[0]) {\n                                paging.setPage('previous');\n                            }\n                        }\n                    }\n                };\n\n                //Selected row needs to be visible when paging is activated\n                if (tf.paging) {\n                    tf.feature('paging').onAfterChangePage = function (paging) {\n                        var advGrid = paging.tf.extension('advancedGrid');\n                        var et = advGrid._ezEditTable;\n                        var slc = et.Selection;\n                        /* eslint-disable */\n                        var row = slc.GetActiveRow();\n                        /* eslint-enable */\n                        if (row) {\n                            row.scrollIntoView(false);\n                        }\n                        /* eslint-disable */\n                        var cell = slc.GetActiveCell();\n                        /* eslint-enable */\n                        if (cell) {\n                            cell.scrollIntoView(false);\n                        }\n                    };\n                }\n\n                //Rows navigation when rows are filtered is performed with the\n                //EditTable row selection callback events\n                if (cfg.default_selection === 'row') {\n                    var fnB = cfg.on_before_selected_row;\n                    cfg.on_before_selected_row = function () {\n                        var args = arguments;\n                        onBeforeSelection(args[0], args[1], args[2]);\n                        if (fnB) {\n                            fnB.call(null, args[0], args[1], args[2]);\n                        }\n                    };\n                    var fnA = cfg.on_after_selected_row;\n                    cfg.on_after_selected_row = function () {\n                        var args = arguments;\n                        onAfterSelection(args[0], args[1], args[2]);\n                        if (fnA) {\n                            fnA.call(null, args[0], args[1], args[2]);\n                        }\n                    };\n                } else {\n                    var fnD = cfg.on_before_selected_cell;\n                    cfg.on_before_selected_cell = function () {\n                        var args = arguments;\n                        onBeforeSelection(args[0], args[1], args[2]);\n                        if (fnD) {\n                            fnD.call(null, args[0], args[1], args[2]);\n                        }\n                    };\n                    var fnC = cfg.on_after_selected_cell;\n                    cfg.on_after_selected_cell = function () {\n                        var args = arguments;\n                        onAfterSelection(args[0], args[1], args[2]);\n                        if (fnC) {\n                            fnC.call(null, args[0], args[1], args[2]);\n                        }\n                    };\n                }\n            }\n            if (editable) {\n                //Added or removed rows, TF rows number needs to be re-calculated\n                var fnE = cfg.on_added_dom_row;\n                cfg.on_added_dom_row = function () {\n                    var args = arguments;\n                    tf.nbFilterableRows++;\n                    if (!tf.paging) {\n                        tf.emitter.emit('rows-changed', tf, this);\n                    } else {\n                        tf.nbFilterableRows++;\n                        tf.paging = false;\n                        tf.feature('paging').destroy();\n                        tf.feature('paging').reset();\n                    }\n                    if (tf.alternateRows) {\n                        tf.feature('alternateRows').init();\n                    }\n                    if (fnE) {\n                        fnE.call(null, args[0], args[1], args[2]);\n                    }\n                };\n                if (cfg.actions && cfg.actions['delete']) {\n                    var fnF = cfg.actions['delete'].on_after_submit;\n                    cfg.actions['delete'].on_after_submit = function () {\n                        var args = arguments;\n                        tf.nbFilterableRows--;\n                        if (!tf.paging) {\n                            tf.emitter.emit('rows-changed', tf, this);\n                        } else {\n                            tf.nbFilterableRows--;\n                            tf.paging = false;\n                            tf.feature('paging').destroy();\n                            tf.feature('paging').reset(false);\n                        }\n                        if (tf.alternateRows) {\n                            tf.feature('alternateRows').init();\n                        }\n                        if (fnF) {\n                            fnF.call(null, args[0], args[1]);\n                        }\n                    };\n                }\n            }\n\n            try {\n                /* eslint-disable */\n                this._ezEditTable = new EditTable(tf.id, cfg, startRow);\n                this._ezEditTable.Init();\n                /* eslint-enable */\n            } catch (e) {\n                throw new Error(INSTANTIATION_ERROR);\n            }\n\n            this.initialized = true;\n        }\n\n        /**\r\n         * Reset advanced grid when previously removed\r\n         */\n\n    }, {\n        key: 'reset',\n        value: function reset() {\n            var ezEditTable = this._ezEditTable;\n            if (ezEditTable) {\n                if (this.cfg.selection) {\n                    /* eslint-disable */\n                    ezEditTable.Selection.Set();\n                    /* eslint-enable */\n                }\n                if (this.cfg.editable) {\n                    /* eslint-disable */\n                    ezEditTable.Editable.Set();\n                    /* eslint-enable */\n                }\n            }\n        }\n\n        /**\r\n         * Toggle behaviour\r\n         */\n\n    }, {\n        key: 'toggle',\n        value: function toggle() {\n            var ezEditTable = this._ezEditTable;\n            if (ezEditTable.editable) {\n                /* eslint-disable */\n                ezEditTable.Editable.Remove();\n                /* eslint-enable */\n            } else {\n                /* eslint-disable */\n                ezEditTable.Editable.Set();\n                /* eslint-enable */\n            }\n            if (ezEditTable.selection) {\n                /* eslint-disable */\n                ezEditTable.Selection.Remove();\n                /* eslint-enable */\n            } else {\n                /* eslint-disable */\n                ezEditTable.Selection.Set();\n                /* eslint-enable */\n            }\n        }\n    }, {\n        key: '_toggleForInputFilter',\n        value: function _toggleForInputFilter() {\n            var tf = this.tf;\n            if (!tf.getActiveFilterId()) {\n                return;\n            }\n            var colIndex = tf.getColumnIndexFromFilterId(tf.getActiveFilterId());\n            var filterType = tf.getFilterType(colIndex);\n            if (filterType === _const.INPUT) {\n                this.toggle();\n            }\n        }\n\n        /**\r\n         * Remove advanced grid\r\n         */\n\n    }, {\n        key: 'destroy',\n        value: function destroy() {\n            var _this3 = this;\n\n            if (!this.initialized) {\n                return;\n            }\n            var ezEditTable = this._ezEditTable;\n            if (ezEditTable) {\n                if (this.cfg.selection) {\n                    /* eslint-disable */\n                    ezEditTable.Selection.ClearSelections();\n                    ezEditTable.Selection.Remove();\n                    /* eslint-enable */\n                }\n                if (this.cfg.editable) {\n                    /* eslint-disable */\n                    ezEditTable.Editable.Remove();\n                    /* eslint-enable */\n                }\n            }\n\n            this.emitter.off(['filter-focus', 'filter-blur'], function () {\n                return _this3._toggleForInputFilter();\n            });\n            this.initialized = false;\n        }\n    }]);\n\n    return AdapterEzEditTable;\n}(_feature.Feature);\n\nexports.default = AdapterEzEditTable;\n\n/***/ }),\n\n/***/ 442:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _feature = __webpack_require__(11);\n\nvar _types = __webpack_require__(3);\n\nvar _dom = __webpack_require__(10);\n\nvar _event = __webpack_require__(19);\n\nvar _number = __webpack_require__(68);\n\nvar _const = __webpack_require__(15);\n\nvar _settings = __webpack_require__(7);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\r\n * SortableTable Adapter module\r\n */\nvar AdapterSortableTable = function (_Feature) {\n    _inherits(AdapterSortableTable, _Feature);\n\n    /**\r\n     * Creates an instance of AdapterSortableTable\r\n     * @param {TableFilter} tf TableFilter instance\r\n     * @param {Object} opts Configuration object\r\n     */\n    function AdapterSortableTable(tf, opts) {\n        _classCallCheck(this, AdapterSortableTable);\n\n        /**\r\n         * Module name\r\n         * @type {String}\r\n         */\n        var _this = _possibleConstructorReturn(this, (AdapterSortableTable.__proto__ || Object.getPrototypeOf(AdapterSortableTable)).call(this, tf, opts.name));\n\n        _this.name = opts.name;\n\n        /**\r\n         * Module description\r\n         * @type {String}\r\n         */\n        _this.desc = (0, _settings.defaultsStr)(opts.description, 'Sortable table');\n\n        /**\r\n         * Indicate whether table previously sorted\r\n         * @type {Boolean}\r\n         * @private\r\n         */\n        _this.sorted = false;\n\n        /**\r\n         * List of sort type per column basis\r\n         * @type {Array}\r\n         */\n        _this.sortTypes = (0, _settings.defaultsArr)(opts.types, tf.colTypes);\n\n        /**\r\n         * Column to be sorted at initialization, ie:\r\n         * sort_col_at_start: [1, true]\r\n         * @type {Array}\r\n         */\n        _this.sortColAtStart = (0, _settings.defaultsArr)(opts.sort_col_at_start, null);\n\n        /**\r\n         * Enable asynchronous sort, if triggers are external\r\n         * @type {Boolean}\r\n         */\n        _this.asyncSort = Boolean(opts.async_sort);\n\n        /**\r\n         * List of element IDs triggering sort on a per column basis\r\n         * @type {Array}\r\n         */\n        _this.triggerIds = (0, _settings.defaultsArr)(opts.trigger_ids, []);\n\n        // edit .sort-arrow.descending / .sort-arrow.ascending in\n        // tablefilter.css to reflect any path change\n        /**\r\n         * Path to images\r\n         * @type {String}\r\n         */\n        _this.imgPath = (0, _settings.defaultsStr)(opts.images_path, tf.themesPath);\n\n        /**\r\n         * Blank image file name\r\n         * @type {String}\r\n         */\n        _this.imgBlank = (0, _settings.defaultsStr)(opts.image_blank, 'blank.png');\n\n        /**\r\n         * Css class for sort indicator image\r\n         * @type {String}\r\n         */\n        _this.imgClassName = (0, _settings.defaultsStr)(opts.image_class_name, 'sort-arrow');\n\n        /**\r\n         * Css class for ascending sort indicator image\r\n         * @type {String}\r\n         */\n        _this.imgAscClassName = (0, _settings.defaultsStr)(opts.image_asc_class_name, 'ascending');\n\n        /**\r\n         * Css class for descending sort indicator image\r\n         * @type {String}\r\n         */\n        _this.imgDescClassName = (0, _settings.defaultsStr)(opts.image_desc_class_name, 'descending');\n\n        /**\r\n         * Cell attribute key storing custom value used for sorting\r\n         * @type {String}\r\n         */\n        _this.customKey = (0, _settings.defaultsStr)(opts.custom_key, 'data-tf-sortKey');\n\n        /**\r\n         * Callback fired when sort extension is instanciated\r\n         * @type {Function}\r\n         */\n        _this.onSortLoaded = (0, _settings.defaultsFn)(opts.on_sort_loaded, _types.EMPTY_FN);\n\n        /**\r\n         * Callback fired before a table column is sorted\r\n         * @type {Function}\r\n         */\n        _this.onBeforeSort = (0, _settings.defaultsFn)(opts.on_before_sort, _types.EMPTY_FN);\n\n        /**\r\n         * Callback fired after a table column is sorted\r\n         * @type {Function}\r\n         */\n        _this.onAfterSort = (0, _settings.defaultsFn)(opts.on_after_sort, _types.EMPTY_FN);\n\n        /**\r\n         * SortableTable instance\r\n         * @private\r\n         */\n        _this.stt = null;\n\n        _this.enable();\n        return _this;\n    }\n\n    /**\r\n     * Initializes AdapterSortableTable instance\r\n     */\n\n\n    _createClass(AdapterSortableTable, [{\n        key: 'init',\n        value: function init() {\n            var _this2 = this;\n\n            if (this.initialized) {\n                return;\n            }\n            var tf = this.tf;\n            var adpt = this;\n\n            // SortableTable class sanity check (sortabletable.js)\n            if ((0, _types.isUndef)(SortableTable)) {\n                throw new Error('SortableTable class not found.');\n            }\n\n            // Add any date format if needed\n            this.emitter.emit('add-date-type-formats', this.tf, this.sortTypes);\n\n            this.overrideSortableTable();\n            this.setSortTypes();\n\n            this.onSortLoaded(tf, this);\n\n            /*** SortableTable callbacks ***/\n            this.stt.onbeforesort = function () {\n                adpt.onBeforeSort(tf, adpt.stt.sortColumn);\n\n                /*** sort behaviour for paging ***/\n                if (tf.paging) {\n                    tf.feature('paging').disable();\n                }\n            };\n\n            this.stt.onsort = function () {\n                adpt.sorted = true;\n\n                //sort behaviour for paging\n                if (tf.paging) {\n                    var paginator = tf.feature('paging');\n                    // recalculate valid rows index as sorting may have change it\n                    tf.getValidRows(true);\n                    paginator.enable();\n                    paginator.setPage(paginator.getPage());\n                }\n\n                adpt.onAfterSort(tf, adpt.stt.sortColumn, adpt.stt.descending);\n                adpt.emitter.emit('column-sorted', tf, adpt.stt.sortColumn, adpt.stt.descending);\n            };\n\n            // Column sort at start\n            var sortColAtStart = adpt.sortColAtStart;\n            if (sortColAtStart) {\n                this.stt.sort(sortColAtStart[0], sortColAtStart[1]);\n            }\n\n            this.emitter.on(['sort'], function (tf, colIdx, desc) {\n                return _this2.sortByColumnIndex(colIdx, desc);\n            });\n\n            /** @inherited */\n            this.initialized = true;\n\n            this.emitter.emit('sort-initialized', tf, this);\n        }\n\n        /**\r\n         * Sort specified column\r\n         * @param {Number} colIdx Column index\r\n         * @param {Boolean} desc Optional: descending manner\r\n         */\n\n    }, {\n        key: 'sortByColumnIndex',\n        value: function sortByColumnIndex(colIdx, desc) {\n            this.stt.sort(colIdx, desc);\n        }\n\n        /**\r\n         * Set SortableTable overrides for TableFilter integration\r\n         */\n\n    }, {\n        key: 'overrideSortableTable',\n        value: function overrideSortableTable() {\n            var adpt = this,\n                tf = this.tf;\n\n            /**\r\n             * Overrides headerOnclick method in order to handle th event\r\n             * @param  {Object} e [description]\r\n             */\n            SortableTable.prototype.headerOnclick = function (evt) {\n                if (!adpt.initialized) {\n                    return;\n                }\n\n                // find Header element\n                var el = evt.target || evt.srcElement;\n\n                while (el.tagName !== _const.CELL_TAG && el.tagName !== _const.HEADER_TAG) {\n                    el = el.parentNode;\n                }\n\n                this.sort(SortableTable.msie ? SortableTable.getCellIndex(el) : el.cellIndex);\n            };\n\n            /**\r\n             * Overrides getCellIndex IE returns wrong cellIndex when columns are\r\n             * hidden\r\n             * @param  {Object} oTd TD element\r\n             * @return {Number}     Cell index\r\n             */\n            SortableTable.getCellIndex = function (oTd) {\n                var cells = oTd.parentNode.cells,\n                    l = cells.length,\n                    i = void 0;\n                for (i = 0; cells[i] !== oTd && i < l; i++) {}\n                return i;\n            };\n\n            /**\r\n             * Overrides initHeader in order to handle filters row position\r\n             * @param  {Array} oSortTypes\r\n             */\n            SortableTable.prototype.initHeader = function (oSortTypes) {\n                var stt = this;\n                if (!stt.tHead) {\n                    if (tf.gridLayout) {\n                        stt.tHead = tf.feature('gridLayout').headTbl.tHead;\n                    } else {\n                        return;\n                    }\n                }\n\n                stt.headersRow = tf.headersRow;\n                var cells = stt.tHead.rows[stt.headersRow].cells;\n                stt.sortTypes = oSortTypes || [];\n                var l = cells.length;\n                var img = void 0,\n                    c = void 0;\n\n                for (var i = 0; i < l; i++) {\n                    c = cells[i];\n                    if (stt.sortTypes[i] !== null && stt.sortTypes[i] !== 'None') {\n                        c.style.cursor = 'pointer';\n                        img = (0, _dom.createElm)('img', ['src', adpt.imgPath + adpt.imgBlank]);\n                        c.appendChild(img);\n                        if (stt.sortTypes[i] !== null) {\n                            c.setAttribute('_sortType', stt.sortTypes[i]);\n                        }\n                        (0, _event.addEvt)(c, 'click', stt._headerOnclick);\n                    } else {\n                        c.setAttribute('_sortType', oSortTypes[i]);\n                        c._sortType = 'None';\n                    }\n                }\n                stt.updateHeaderArrows();\n            };\n\n            /**\r\n             * Overrides updateHeaderArrows in order to handle arrows indicators\r\n             */\n            SortableTable.prototype.updateHeaderArrows = function () {\n                var stt = this;\n                var cells = void 0,\n                    l = void 0,\n                    img = void 0;\n\n                // external headers\n                if (adpt.asyncSort && adpt.triggerIds.length > 0) {\n                    var triggers = adpt.triggerIds;\n                    cells = [];\n                    l = triggers.length;\n                    for (var j = 0; j < l; j++) {\n                        cells.push((0, _dom.elm)(triggers[j]));\n                    }\n                } else {\n                    if (!this.tHead) {\n                        return;\n                    }\n                    cells = stt.tHead.rows[stt.headersRow].cells;\n                    l = cells.length;\n                }\n                for (var i = 0; i < l; i++) {\n                    var cell = cells[i];\n                    if (!cell) {\n                        continue;\n                    }\n                    var cellAttr = cell.getAttribute('_sortType');\n                    if (cellAttr !== null && cellAttr !== 'None') {\n                        img = cell.lastChild || cell;\n                        if (img.nodeName.toLowerCase() !== 'img') {\n                            img = (0, _dom.createElm)('img', ['src', adpt.imgPath + adpt.imgBlank]);\n                            cell.appendChild(img);\n                        }\n                        if (i === stt.sortColumn) {\n                            img.className = adpt.imgClassName + ' ' + (this.descending ? adpt.imgDescClassName : adpt.imgAscClassName);\n                        } else {\n                            img.className = adpt.imgClassName;\n                        }\n                    }\n                }\n            };\n\n            /**\r\n             * Overrides getRowValue for custom key value feature\r\n             * @param  {Object} oRow    Row element\r\n             * @param  {String} sType\r\n             * @param  {Number} nColumn\r\n             * @return {String}\r\n             */\n            SortableTable.prototype.getRowValue = function (oRow, sType, nColumn) {\n                var stt = this;\n                // if we have defined a custom getRowValue use that\n                var sortTypeInfo = stt._sortTypeInfo[sType];\n                if (sortTypeInfo && sortTypeInfo.getRowValue) {\n                    return sortTypeInfo.getRowValue(oRow, nColumn);\n                }\n                var c = oRow.cells[nColumn];\n                var s = SortableTable.getInnerText(c);\n                return stt.getValueFromString(s, sType);\n            };\n\n            /**\r\n             * Overrides getInnerText in order to avoid Firefox unexpected sorting\r\n             * behaviour with untrimmed text elements\r\n             * @param  {Object} oNode DOM element\r\n             * @return {String}       DOM element inner text\r\n             */\n            SortableTable.getInnerText = function (oNode) {\n                if (!oNode) {\n                    return;\n                }\n                if (oNode.getAttribute(adpt.customKey)) {\n                    return oNode.getAttribute(adpt.customKey);\n                } else {\n                    return (0, _dom.getText)(oNode);\n                }\n            };\n        }\n\n        /**\r\n         * Adds a sort type\r\n         */\n\n    }, {\n        key: 'addSortType',\n        value: function addSortType() {\n            for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {\n                args[_key] = arguments[_key];\n            }\n\n            // Extract the arguments\n            var id = args[0],\n                caster = args[1],\n                sorter = args[2];\n\n            SortableTable.prototype.addSortType(id, caster, sorter);\n        }\n\n        /**\r\n         * Sets the sort types on a column basis\r\n         * @private\r\n         */\n\n    }, {\n        key: 'setSortTypes',\n        value: function setSortTypes() {\n            var _this3 = this;\n\n            var tf = this.tf,\n                sortTypes = this.sortTypes,\n                _sortTypes = [];\n\n            tf.eachCol(function (i) {\n                var colType = void 0;\n                if (sortTypes[i]) {\n                    colType = sortTypes[i];\n                    if ((0, _types.isObj)(colType)) {\n                        if (colType.type === _const.DATE) {\n                            colType = _this3._addDateType(i, sortTypes);\n                        } else if (colType.type === _const.FORMATTED_NUMBER) {\n                            var decimal = colType.decimal || tf.decimalSeparator;\n                            colType = _this3._addNumberType(i, decimal);\n                        }\n                    } else {\n                        colType = colType.toLowerCase();\n                        if (colType === _const.DATE) {\n                            colType = _this3._addDateType(i, sortTypes);\n                        } else if (colType === _const.FORMATTED_NUMBER || colType === _const.NUMBER) {\n                            colType = _this3._addNumberType(i, tf.decimalSeparator);\n                        } else if (colType === _const.NONE) {\n                            // TODO: normalise 'none' vs 'None'\n                            colType = 'None';\n                        }\n                    }\n                } else {\n                    colType = _const.STRING;\n                }\n                _sortTypes.push(colType);\n            });\n\n            //Public TF method to add sort type\n\n            //Custom sort types\n            this.addSortType('caseinsensitivestring', SortableTable.toUpperCase);\n            this.addSortType(_const.STRING);\n            this.addSortType(_const.IP_ADDRESS, ipAddress, sortIP);\n\n            this.stt = new SortableTable(tf.dom(), _sortTypes);\n\n            /*** external table headers adapter ***/\n            if (this.asyncSort && this.triggerIds.length > 0) {\n                (function () {\n                    var triggers = _this3.triggerIds;\n                    for (var j = 0; j < triggers.length; j++) {\n                        if (triggers[j] === null) {\n                            continue;\n                        }\n                        var trigger = (0, _dom.elm)(triggers[j]);\n                        if (trigger) {\n                            trigger.style.cursor = 'pointer';\n\n                            (0, _event.addEvt)(trigger, 'click', function (evt) {\n                                var elm = evt.target;\n                                if (!_this3.tf.sort) {\n                                    return;\n                                }\n                                _this3.stt.asyncSort(triggers.indexOf(elm.id));\n                            });\n                            trigger.setAttribute('_sortType', _sortTypes[j]);\n                        }\n                    }\n                })();\n            }\n        }\n    }, {\n        key: '_addDateType',\n        value: function _addDateType(colIndex, types) {\n            var tf = this.tf;\n            var dateType = tf.feature('dateType');\n            var locale = dateType.getOptions(colIndex, types).locale || tf.locale;\n            var colType = _const.DATE + '-' + locale;\n\n            this.addSortType(colType, function (value) {\n                var parsedDate = dateType.parse(value, locale);\n                // Invalid date defaults to Wed Feb 04 -768 11:00:00\n                return isNaN(+parsedDate) ? new Date(-86400000000000) : parsedDate;\n            });\n            return colType;\n        }\n    }, {\n        key: '_addNumberType',\n        value: function _addNumberType(colIndex, decimal) {\n            var colType = '' + _const.FORMATTED_NUMBER + (decimal === '.' ? '' : '-custom');\n\n            this.addSortType(colType, function (value) {\n                return (0, _number.parse)(value, decimal);\n            });\n            return colType;\n        }\n\n        /**\r\n         * Remove extension\r\n         */\n\n    }, {\n        key: 'destroy',\n        value: function destroy() {\n            var _this4 = this;\n\n            if (!this.initialized) {\n                return;\n            }\n            var tf = this.tf;\n            this.emitter.off(['sort'], function (tf, colIdx, desc) {\n                return _this4.sortByColumnIndex(colIdx, desc);\n            });\n            this.sorted = false;\n            this.stt.destroy();\n\n            var ids = tf.getFiltersId();\n            for (var idx = 0; idx < ids.length; idx++) {\n                var header = tf.getHeaderElement(idx);\n                var img = (0, _dom.tag)(header, 'img');\n\n                if (img.length === 1) {\n                    header.removeChild(img[0]);\n                }\n            }\n            this.initialized = false;\n        }\n    }]);\n\n    return AdapterSortableTable;\n}(_feature.Feature);\n\n//Converters\n\n\nexports.default = AdapterSortableTable;\nfunction ipAddress(value) {\n    var vals = value.split('.');\n    for (var x in vals) {\n        var val = vals[x];\n        while (3 > val.length) {\n            val = '0' + val;\n        }\n        vals[x] = val;\n    }\n    return vals.join('.');\n}\n\nfunction sortIP(a, b) {\n    var aa = ipAddress(a.value.toLowerCase());\n    var bb = ipAddress(b.value.toLowerCase());\n    if (aa === bb) {\n        return 0;\n    } else if (aa < bb) {\n        return -1;\n    } else {\n        return 1;\n    }\n}\n\n/***/ }),\n\n/***/ 443:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n  value: true\n});\n\nvar _adapterEzEditTable = __webpack_require__(441);\n\nvar _adapterEzEditTable2 = _interopRequireDefault(_adapterEzEditTable);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nexports.default = _adapterEzEditTable2.default;\n\n/***/ }),\n\n/***/ 444:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _feature = __webpack_require__(11);\n\nvar _dom = __webpack_require__(10);\n\nvar _types = __webpack_require__(3);\n\nvar _sort = __webpack_require__(107);\n\nvar _const = __webpack_require__(15);\n\nvar _formatNumber = __webpack_require__(448);\n\nvar _formatNumber2 = _interopRequireDefault(_formatNumber);\n\nvar _settings = __webpack_require__(7);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\nvar EVENTS = ['after-filtering', 'after-page-change', 'after-page-length-change'];\n\nvar SUM = 'sum';\nvar MEAN = 'mean';\nvar MIN = 'min';\nvar MAX = 'max';\nvar MEDIAN = 'median';\nvar Q1 = 'q1';\nvar Q3 = 'q3';\n\n/**\r\n * Column calculations extension\r\n */\n\nvar ColOps = function (_Feature) {\n    _inherits(ColOps, _Feature);\n\n    /**\r\n     * Creates an instance of ColOps\r\n     *\r\n     * @param {TableFilter} tf TableFilter instance\r\n     * @param {Object} opts Configuration object\r\n     */\n    function ColOps(tf, opts) {\n        _classCallCheck(this, ColOps);\n\n        /**\r\n         * Callback fired before columns operations start\r\n         * @type {Function}\r\n         */\n        var _this = _possibleConstructorReturn(this, (ColOps.__proto__ || Object.getPrototypeOf(ColOps)).call(this, tf, opts.name));\n\n        _this.onBeforeOperation = (0, _settings.defaultsFn)(opts.on_before_operation, _types.EMPTY_FN);\n\n        /**\r\n         * Callback fired after columns operations are completed\r\n         * @type {Function}\r\n         */\n        _this.onAfterOperation = (0, _settings.defaultsFn)(opts.on_after_operation, _types.EMPTY_FN);\n\n        /**\r\n         * Configuration options\r\n         * @type {Object}\r\n         */\n        _this.opts = opts;\n\n        /**\r\n         * List of DOM element IDs containing column's calculation result\r\n         * @type {Array}\r\n         */\n        _this.labelIds = (0, _settings.defaultsArr)(opts.id, []);\n\n        /**\r\n         * List of columns' indexes for calculations\r\n         * @type {Array}\r\n         */\n        _this.colIndexes = (0, _settings.defaultsArr)(opts.col, []);\n\n        /**\r\n         * List of operations - possible values: 'sum', 'mean', 'min', 'max',\r\n         * 'median', 'q1', 'q3'\r\n         * @type {Array}\r\n         */\n        _this.operations = (0, _settings.defaultsArr)(opts.operation, []);\n\n        /**\r\n         * List of write methods used to write the result - possible values:\r\n         * 'innerHTML', 'setValue', 'createTextNode'\r\n         * @type {Array}\r\n         */\n        _this.outputTypes = (0, _settings.defaultsArr)(opts.write_method, []);\n\n        /**\r\n         * List of format objects used for formatting the result -\r\n         * refer to https://github.com/componitable/format-number to check\r\n         * configuration options\r\n         * @type {Array}\r\n         */\n        _this.formatResults = (0, _settings.defaultsArr)(opts.format_result, []);\n\n        /**\r\n         * List of row indexes displaying the results\r\n         * @type {Array}\r\n         */\n        _this.totRowIndexes = (0, _settings.defaultsArr)(opts.tot_row_index, []);\n\n        /**\r\n         * List of row indexes excluded from calculations\r\n         * @type {Array}\r\n         */\n        _this.excludeRows = (0, _settings.defaultsArr)(opts.exclude_row, []);\n\n        /**\r\n         * List of decimal precision for calculation results\r\n         * @type {Array}\r\n         */\n        _this.decimalPrecisions = (0, _settings.defaultsArr)(opts.decimal_precision, 2);\n\n        _this.enable();\n        return _this;\n    }\n\n    /**\r\n     * Initializes ColOps instance\r\n     */\n\n\n    _createClass(ColOps, [{\n        key: 'init',\n        value: function init() {\n            var _this2 = this;\n\n            if (this.initialized) {\n                return;\n            }\n            // subscribe to events\n            this.emitter.on(EVENTS, function () {\n                return _this2.calcAll();\n            });\n\n            this.calcAll();\n\n            /** @inherited */\n            this.initialized = true;\n        }\n\n        /**\r\n         * Calculates columns' values\r\n         * Configuration options are stored in 'opts' property\r\n         * - 'id' contains ids of elements showing result (array)\r\n         * - 'col' contains the columns' indexes (array)\r\n         * - 'operation' contains operation type (array, values: 'sum', 'mean',\r\n         *   'min', 'max', 'median', 'q1', 'q3')\r\n         * - 'write_method' array defines which method to use for displaying the\r\n         *    result (innerHTML, setValue, createTextNode) - default: 'innerHTML'\r\n         * - 'tot_row_index' defines in which row results are displayed\r\n         *   (integers array)\r\n         *\r\n         * - changes made by Nuovella:\r\n         * (1) optimized the routine (now it will only process each column once),\r\n         * (2) added calculations for the median, lower and upper quartile.\r\n         */\n\n    }, {\n        key: 'calcAll',\n        value: function calcAll() {\n            var tf = this.tf;\n            if (!tf.isInitialized()) {\n                return;\n            }\n\n            this.onBeforeOperation(tf, this);\n            this.emitter.emit('before-column-operation', tf, this);\n\n            var colIndexes = this.colIndexes,\n                colOperations = this.operations,\n                outputTypes = this.outputTypes,\n                totRowIndexes = this.totRowIndexes,\n                excludeRows = this.excludeRows,\n                formatResults = this.formatResults,\n                decimalPrecisions = this.decimalPrecisions;\n\n            //nuovella: determine unique list of columns to operate on\n\n            var uIndexes = [];\n            colIndexes.forEach(function (val) {\n                if (uIndexes.indexOf(val) === -1) {\n                    uIndexes.push(val);\n                }\n            });\n\n            var nbCols = uIndexes.length,\n                rows = tf.dom().rows,\n                colValues = [];\n\n            for (var u = 0; u < nbCols; u++) {\n                //this retrieves col values\n                //use uIndexes because we only want to pass through this loop\n                //once for each column get the values in this unique column\n                colValues.push(tf.getVisibleColumnData(uIndexes[u], false, excludeRows));\n\n                var curValues = colValues[u];\n\n                //next: calculate all operations for this column\n                var result = 0,\n                    operations = [],\n                    precisions = [],\n                    labels = [],\n                    writeType = void 0,\n                    formatResult = [],\n                    idx = 0;\n\n                for (var k = 0; k < colIndexes.length; k++) {\n                    if (colIndexes[k] !== uIndexes[u]) {\n                        continue;\n                    }\n                    operations[idx] = (colOperations[k] || 'sum').toLowerCase();\n                    precisions[idx] = decimalPrecisions[k];\n                    labels[idx] = this.labelIds[k];\n                    writeType = (0, _types.isArray)(outputTypes) ? outputTypes[k] : null;\n                    formatResult[idx] = this.configureFormat(uIndexes[u], formatResults[k]);\n                    idx++;\n                }\n\n                for (var i = 0; i < idx; i++) {\n                    // emit values before column calculation\n                    this.emitter.emit('before-column-calc', tf, this, uIndexes[u], curValues, operations[i], precisions[i]);\n\n                    result = Number(this.calc(curValues, operations[i], null));\n\n                    // emit column calculation result\n                    this.emitter.emit('column-calc', tf, this, uIndexes[u], result, operations[i], precisions[i]);\n\n                    // write result in expected DOM element\n                    this.writeResult(result, labels[i], writeType, precisions[i], formatResult[i]);\n                } //for i\n\n                // row(s) with result are always visible\n                var totRow = totRowIndexes && totRowIndexes[u] ? rows[totRowIndexes[u]] : null;\n                if (totRow) {\n                    totRow.style.display = '';\n                }\n            } //for u\n\n            this.onAfterOperation(tf, this);\n            this.emitter.emit('after-column-operation', tf, this);\n        }\n\n        /**\r\n         * Make desired calculation on specified column.\r\n         * @param {Number} colIndex Column index\r\n         * @param {String} [operation=SUM] Operation type\r\n         * @param {Number} precision Decimal precision\r\n         * @returns {Number}\r\n         */\n\n    }, {\n        key: 'columnCalc',\n        value: function columnCalc(colIndex) {\n            var operation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SUM;\n            var precision = arguments[2];\n\n            var excludeRows = this.excludeRows || [];\n            var colValues = tf.getVisibleColumnData(colIndex, false, excludeRows);\n\n            return Number(this.calc(colValues, operation, precision));\n        }\n\n        /**\r\n         * Make calculation on passed values.\r\n         * @param {Array} values List of values\r\n         * @param {String} [operation=SUM] Optional operation type\r\n         * @param {Number} precision Optional result precision\r\n         * @returns {Number}\r\n         * @private\r\n         */\n\n    }, {\n        key: 'calc',\n        value: function calc(colValues) {\n            var operation = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : SUM;\n            var precision = arguments[2];\n\n            var result = 0;\n\n            if (operation === Q1 || operation === Q3 || operation === MEDIAN) {\n                colValues = this.sortColumnValues(colValues, _sort.numSortAsc);\n            }\n\n            switch (operation) {\n                case MEAN:\n                    result = this.calcMean(colValues);\n                    break;\n                case SUM:\n                    result = this.calcSum(colValues);\n                    break;\n                case MIN:\n                    result = this.calcMin(colValues);\n                    break;\n                case MAX:\n                    result = this.calcMax(colValues);\n                    break;\n                case MEDIAN:\n                    result = this.calcMedian(colValues);\n                    break;\n                case Q1:\n                    result = this.calcQ1(colValues);\n                    break;\n                case Q3:\n                    result = this.calcQ3(colValues);\n                    break;\n            }\n\n            return (0, _types.isEmpty)(precision) ? result : result.toFixed(precision);\n        }\n\n        /**\r\n         * Calculate the sum of passed values.\r\n         * @param {Array} [values=[]] List of values\r\n         * @returns {Number}\r\n         */\n\n    }, {\n        key: 'calcSum',\n        value: function calcSum() {\n            var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n            if ((0, _types.isEmpty)(values)) {\n                return 0;\n            }\n            var result = values.reduce(function (x, y) {\n                return Number(x) + Number(y);\n            });\n            return result;\n        }\n\n        /**\r\n         * Calculate the mean of passed values.\r\n         * @param {Array} [values=[]] List of values\r\n         * @returns {Number}\r\n         */\n\n    }, {\n        key: 'calcMean',\n        value: function calcMean() {\n            var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n            var result = this.calcSum(values) / values.length;\n            return Number(result);\n        }\n\n        /**\r\n         * Calculate the max value of passed values.\r\n         * @param {Array} [values=[]] List of values\r\n         * @returns {Number}\r\n         */\n\n    }, {\n        key: 'calcMax',\n        value: function calcMax() {\n            var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n            return Math.max.apply(null, values);\n        }\n\n        /**\r\n         * Calculate the min value of passed values.\r\n         * @param {Array} [values=[]] List of values\r\n         * @returns {Number}\r\n         */\n\n    }, {\n        key: 'calcMin',\n        value: function calcMin() {\n            var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n            return Math.min.apply(null, values);\n        }\n\n        /**\r\n         * Calculate the median of passed values.\r\n         * @param {Array} [values=[]] List of values\r\n         * @returns {Number}\r\n         */\n\n    }, {\n        key: 'calcMedian',\n        value: function calcMedian() {\n            var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n            var nbValues = values.length;\n            var aux = 0;\n            if (nbValues % 2 === 1) {\n                aux = Math.floor(nbValues / 2);\n                return Number(values[aux]);\n            }\n            return (Number(values[nbValues / 2]) + Number(values[nbValues / 2 - 1])) / 2;\n        }\n\n        /**\r\n         * Calculate the lower quartile of passed values.\r\n         * @param {Array} [values=[]] List of values\r\n         * @returns {Number}\r\n         */\n\n    }, {\n        key: 'calcQ1',\n        value: function calcQ1() {\n            var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n            var nbValues = values.length;\n            var posa = 0.0;\n            posa = Math.floor(nbValues / 4);\n            if (4 * posa === nbValues) {\n                return (Number(values[posa - 1]) + Number(values[posa])) / 2;\n            }\n            return Number(values[posa]);\n        }\n\n        /**\r\n         * Calculate the upper quartile of passed values.\r\n         * @param {Array} [values=[]] List of values\r\n         * @returns {Number}\r\n         */\n\n    }, {\n        key: 'calcQ3',\n        value: function calcQ3() {\n            var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n\n            var nbValues = values.length;\n            var posa = 0.0;\n            var posb = 0.0;\n            posa = Math.floor(nbValues / 4);\n            if (4 * posa === nbValues) {\n                posb = 3 * posa;\n                return (Number(values[posb]) + Number(values[posb - 1])) / 2;\n            }\n            return Number(values[nbValues - posa - 1]);\n        }\n\n        /**\r\n         * Sort passed values with supplied sorter function.\r\n         * @param {Array} [values=[]] List of values to be sorted\r\n         * @param {Function} sorter Sorter function\r\n         * @returns {Array}\r\n         */\n\n    }, {\n        key: 'sortColumnValues',\n        value: function sortColumnValues() {\n            var values = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : [];\n            var sorter = arguments[1];\n\n            return values.sort(sorter);\n        }\n\n        /**\r\n         * Write calculation result in passed DOM element with supplied write method\r\n         * and decimal precision.\r\n         * @param {Number} [result=0] Calculation result\r\n         * @param {DOMElement} label DOM element\r\n         * @param {String} [writeType='innerhtml'] Write method\r\n         * @param {Number} [precision=2] Applied decimal precision\r\n         * @private\r\n         */\n\n    }, {\n        key: 'writeResult',\n        value: function writeResult() {\n            var result = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;\n            var label = arguments[1];\n            var writeType = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 'innerhtml';\n            var precision = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 2;\n            var format = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : {};\n\n            var labelElm = (0, _dom.elm)(label);\n\n            if (!labelElm) {\n                return;\n            }\n\n            result = result.toFixed(precision);\n            if (isNaN(result) || !isFinite(result)) {\n                result = '';\n            } else {\n                result = (0, _formatNumber2.default)(format)(result);\n            }\n\n            switch (writeType.toLowerCase()) {\n                case 'innerhtml':\n                    labelElm.innerHTML = result;\n                    break;\n                case 'setvalue':\n                    labelElm.value = result;\n                    break;\n                case 'createtextnode':\n                    var oldNode = labelElm.firstChild;\n                    var txtNode = (0, _dom.createText)(result);\n                    labelElm.replaceChild(txtNode, oldNode);\n                    break;\n            }\n        }\n\n        /**\r\n         * Configure the format options used to format the operation result based\r\n         * on column type.\r\n         * @param {Number} colIndex Column index\r\n         * @param {Object} [format={}] Format object\r\n         * @returns {Object}\r\n         * @private\r\n         */\n\n    }, {\n        key: 'configureFormat',\n        value: function configureFormat(colIndex) {\n            var format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};\n\n            var tf = this.tf;\n            if (tf.hasType(colIndex, [_const.FORMATTED_NUMBER])) {\n                var colType = tf.colTypes[colIndex];\n                if (colType.decimal && !format.decimal) {\n                    format.decimal = colType.decimal;\n                }\n                if (colType.thousands && !format.integerSeparator) {\n                    format.integerSeparator = colType.thousands;\n                }\n            } else {\n                format.decimal = format.decimal || '';\n                format.integerSeparator = format.integerSeparator || '';\n            }\n            return format;\n        }\n\n        /** Remove extension */\n\n    }, {\n        key: 'destroy',\n        value: function destroy() {\n            var _this3 = this;\n\n            if (!this.initialized) {\n                return;\n            }\n            // unsubscribe to events\n            this.emitter.off(EVENTS, function () {\n                return _this3.calcAll();\n            });\n\n            this.initialized = false;\n        }\n    }]);\n\n    return ColOps;\n}(_feature.Feature);\n\nexports.default = ColOps;\n\n/***/ }),\n\n/***/ 445:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _feature = __webpack_require__(11);\n\nvar _dom = __webpack_require__(10);\n\nvar _types = __webpack_require__(3);\n\nvar _event = __webpack_require__(19);\n\nvar _root = __webpack_require__(16);\n\nvar _const = __webpack_require__(15);\n\nvar _settings = __webpack_require__(7);\n\nvar _toolbar = __webpack_require__(33);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\r\n * Columns Visibility extension\r\n */\nvar ColsVisibility = function (_Feature) {\n    _inherits(ColsVisibility, _Feature);\n\n    /**\r\n     * Creates an instance of ColsVisibility\r\n     * @param {TableFilter} tf TableFilter instance\r\n     * @param {Object} Configuration object\r\n     */\n    function ColsVisibility(tf, f) {\n        _classCallCheck(this, ColsVisibility);\n\n        // Configuration object\n        var _this = _possibleConstructorReturn(this, (ColsVisibility.__proto__ || Object.getPrototypeOf(ColsVisibility)).call(this, tf, f.name));\n\n        var cfg = _this.config;\n\n        /**\r\n         * Module name\r\n         * @type {String}\r\n         */\n        _this.name = f.name;\n\n        /**\r\n         * Module description\r\n         * @type {String}\r\n         */\n        _this.desc = (0, _settings.defaultsStr)(f.description, 'Columns visibility manager');\n\n        /**\r\n         * show/hide columns container element\r\n         * @private\r\n         */\n        _this.spanEl = null;\n\n        /**\r\n         * show/hide columns button element\r\n         * @private\r\n         */\n        _this.btnEl = null;\n\n        /**\r\n         * show/hide columns main container element\r\n         * @private\r\n         */\n        _this.contEl = null;\n\n        /**\r\n         * Enable tick to hide a column, defaults to true\r\n         * @type {Boolean}\r\n         */\n        _this.tickToHide = (0, _settings.defaultsBool)(f.tick_to_hide, true);\n\n        /**\r\n         * Enable columns manager UI, defaults to true\r\n         * @type {Boolean}\r\n         */\n        _this.manager = (0, _settings.defaultsBool)(f.manager, true);\n\n        /**\r\n         * Headers HTML table reference only if headers are external\r\n         * @type {DOMElement}\r\n         */\n        _this.headersTbl = f.headers_table || null;\n\n        /**\r\n         * Headers row index only if headers are external\r\n         * @type {Number}\r\n         */\n        _this.headersIndex = (0, _settings.defaultsNb)(f.headers_index, 1);\n\n        /**\r\n         * ID of main container element\r\n         * @type {String}\r\n         */\n        _this.contElTgtId = (0, _settings.defaultsStr)(f.container_target_id, null);\n\n        /**\r\n         * Alternative text for column headers in column manager UI\r\n         * @type {Array}\r\n         */\n        _this.headersText = (0, _settings.defaultsArr)(f.headers_text, []);\n\n        /**\r\n         * ID of button's container element\r\n         * @type {String}\r\n         */\n        _this.btnTgtId = (0, _settings.defaultsStr)(f.btn_target_id, null);\n\n        /**\r\n         * Button's text, defaults to Columns▼\r\n         * @type {String}\r\n         */\n        _this.btnText = (0, _settings.defaultsStr)(f.btn_text, 'Columns▼');\n\n        /**\r\n         * Button's inner HTML\r\n         * @type {String}\r\n         */\n        _this.btnHtml = (0, _settings.defaultsStr)(f.btn_html, null);\n\n        /**\r\n         * Css class for button\r\n         * @type {String}\r\n         */\n        _this.btnCssClass = (0, _settings.defaultsStr)(f.btn_css_class, 'colVis');\n\n        /**\r\n         * Columns manager UI close link text, defaults to 'Close'\r\n         * @type {String}\r\n         */\n        _this.btnCloseText = (0, _settings.defaultsStr)(f.btn_close_text, 'Close');\n\n        /**\r\n         * Columns manager UI close link HTML\r\n         * @type {String}\r\n         */\n        _this.btnCloseHtml = (0, _settings.defaultsStr)(f.btn_close_html, null);\n\n        /**\r\n         * Css for columns manager UI close link\r\n         * @type {String}\r\n         */\n        _this.btnCloseCssClass = (0, _settings.defaultsStr)(f.btn_close_css_class, _this.btnCssClass);\n\n        /**\r\n         * Extension's stylesheet filename\r\n         * @type {String}\r\n         */\n        _this.stylesheet = (0, _settings.defaultsStr)(f.stylesheet, 'colsVisibility.css');\n\n        /**\r\n         * Css for columns manager UI span\r\n         * @type {String}\r\n         */\n        _this.spanCssClass = (0, _settings.defaultsStr)(f.span_css_class, 'colVisSpan');\n\n        /**\r\n         * Css for columns manager UI main container\r\n         * @type {String}\r\n         */\n        _this.contCssClass = (0, _settings.defaultsStr)(f.cont_css_class, 'colVisCont');\n\n        /**\r\n         * Css for columns manager UI checklist (ul)\r\n         * @type {String}\r\n         */\n        _this.listCssClass = (0, _settings.defaultsStr)(cfg.list_css_class, 'cols_checklist');\n\n        /**\r\n         * Css for columns manager UI checklist item (li)\r\n         * @type {String}\r\n         */\n        _this.listItemCssClass = (0, _settings.defaultsStr)(cfg.checklist_item_css_class, 'cols_checklist_item');\n\n        /**\r\n         * Css for columns manager UI checklist item selected state (li)\r\n         * @type {String}\r\n         */\n        _this.listSlcItemCssClass = (0, _settings.defaultsStr)(cfg.checklist_selected_item_css_class, 'cols_checklist_slc_item');\n\n        /**\r\n         * Text preceding the columns list, defaults to 'Hide' or 'Show'\r\n         * depending on tick mode (tick_to_hide option)\r\n         * @type {String}\r\n         */\n        _this.text = (0, _settings.defaultsStr)(f.text, _this.tickToHide ? 'Hide: ' : 'Show: ');\n\n        /**\r\n         * List of columns indexes to be hidden at initialization\r\n         * @type {Array}\r\n         */\n        _this.atStart = (0, _settings.defaultsArr)(f.at_start, []);\n\n        /**\r\n         * Enable hover behaviour on columns manager button/link\r\n         * @type {Boolean}\r\n         */\n        _this.enableHover = Boolean(f.enable_hover);\n\n        /**\r\n         * Enable select all option, disabled by default\r\n         * @type {Boolean}\r\n         */\n        _this.enableTickAll = Boolean(f.enable_tick_all);\n\n        /**\r\n         * Text for select all option, defaults to 'Select all:'\r\n         * @type {String}\r\n         */\n        _this.tickAllText = (0, _settings.defaultsStr)(f.tick_all_text, 'Select all:');\n\n        /**\r\n         * Default position in toolbar ('left'|'center'|'right')\r\n         * @type {String}\r\n         */\n        _this.toolbarPosition = (0, _settings.defaultsStr)(f.toolbar_position, _toolbar.RIGHT);\n\n        /**\r\n         * List of indexes of hidden columns\r\n         * @private\r\n         */\n        _this.hiddenCols = [];\n\n        /**\r\n         * Bound mouseup wrapper\r\n         * @private\r\n         */\n        _this.boundMouseup = null;\n\n        /**\r\n         * Callback fired when the extension is initialized\r\n         * @type {Function}\r\n         */\n        _this.onLoaded = (0, _settings.defaultsFn)(f.on_loaded, _types.EMPTY_FN);\n\n        /**\r\n         * Callback fired before the columns manager is opened\r\n         * @type {Function}\r\n         */\n        _this.onBeforeOpen = (0, _settings.defaultsFn)(f.on_before_open, _types.EMPTY_FN);\n\n        /**\r\n         * Callback fired after the columns manager is opened\r\n         * @type {Function}\r\n         */\n        _this.onAfterOpen = (0, _settings.defaultsFn)(f.on_after_open, _types.EMPTY_FN);\n\n        /**\r\n         * Callback fired before the columns manager is closed\r\n         * @type {Function}\r\n         */\n        _this.onBeforeClose = (0, _settings.defaultsFn)(f.on_before_close, _types.EMPTY_FN);\n\n        /**\r\n         * Callback fired after the columns manager is closed\r\n         * @type {Function}\r\n         */\n        _this.onAfterClose = (0, _settings.defaultsFn)(f.on_after_close, _types.EMPTY_FN);\n\n        /**\r\n         * Callback fired before a column is hidden\r\n         * @type {Function}\r\n         */\n        _this.onBeforeColHidden = (0, _settings.defaultsFn)(f.on_before_col_hidden, _types.EMPTY_FN);\n\n        /**\r\n         * Callback fired after a column is hidden\r\n         * @type {Function}\r\n         */\n        _this.onAfterColHidden = (0, _settings.defaultsFn)(f.on_after_col_hidden, _types.EMPTY_FN);\n\n        /**\r\n         * Callback fired before a column is displayed\r\n         * @type {Function}\r\n         */\n        _this.onBeforeColDisplayed = (0, _settings.defaultsFn)(f.on_before_col_displayed, _types.EMPTY_FN);\n\n        /**\r\n         * Callback fired after a column is displayed\r\n         * @type {Function}\r\n         */\n        _this.onAfterColDisplayed = (0, _settings.defaultsFn)(f.on_after_col_displayed, _types.EMPTY_FN);\n\n        //Grid layout support\n        if (tf.gridLayout) {\n            _this.headersTbl = tf.feature('gridLayout').headTbl; //headers table\n            _this.headersIndex = 0; //headers index\n        }\n\n        //Loads extension stylesheet\n        tf.import(f.name + 'Style', tf.getStylePath() + _this.stylesheet, null, 'link');\n\n        _this.enable();\n        return _this;\n    }\n\n    /**\r\n     * Mouse-up event handler handling popup auto-close behaviour\r\n     * @private\r\n     */\n\n\n    _createClass(ColsVisibility, [{\n        key: 'onMouseup',\n        value: function onMouseup(evt) {\n            var targetElm = (0, _event.targetEvt)(evt);\n\n            while (targetElm && targetElm !== this.contEl && targetElm !== this.btnEl) {\n                targetElm = targetElm.parentNode;\n            }\n\n            if (targetElm !== this.contEl && targetElm !== this.btnEl) {\n                this.toggle();\n            }\n\n            return;\n        }\n\n        /**\r\n         * Toggle columns manager UI\r\n         */\n\n    }, {\n        key: 'toggle',\n        value: function toggle() {\n            // ensure mouseup event handler is removed\n            (0, _event.removeEvt)(_root.root, 'mouseup', this.boundMouseup);\n\n            var contDisplay = this.contEl.style.display;\n\n            if (contDisplay !== 'inline') {\n                this.onBeforeOpen(this);\n            }\n            if (contDisplay === 'inline') {\n                this.onBeforeClose(this);\n            }\n\n            this.contEl.style.display = contDisplay === 'inline' ? _const.NONE : 'inline';\n\n            if (contDisplay !== 'inline') {\n                this.onAfterOpen(this);\n                (0, _event.addEvt)(_root.root, 'mouseup', this.boundMouseup);\n            }\n            if (contDisplay === 'inline') {\n                this.onAfterClose(this);\n            }\n        }\n\n        /**\r\n         * Check an item in columns manager UI\r\n         * @private\r\n         */\n\n    }, {\n        key: 'checkItem',\n        value: function checkItem(lbl) {\n            var li = lbl.parentNode;\n            if (!li || !lbl) {\n                return;\n            }\n            var isChecked = lbl.firstChild.checked;\n            var colIndex = lbl.firstChild.getAttribute('id').split('_')[1];\n            colIndex = parseInt(colIndex, 10);\n            if (isChecked) {\n                (0, _dom.addClass)(li, this.listSlcItemCssClass);\n            } else {\n                (0, _dom.removeClass)(li, this.listSlcItemCssClass);\n            }\n\n            var hide = false;\n            if (this.tickToHide && isChecked || !this.tickToHide && !isChecked) {\n                hide = true;\n            }\n            this.setHidden(colIndex, hide);\n        }\n\n        /**\r\n         * Initializes ColsVisibility instance\r\n         */\n\n    }, {\n        key: 'init',\n        value: function init() {\n            var _this2 = this;\n\n            if (this.initialized || !this.manager) {\n                return;\n            }\n\n            this.emitter.emit('initializing-extension', this, !(0, _types.isNull)(this.btnTgtId));\n\n            this.emitter.on(['hide-column'], function (tf, colIndex) {\n                return _this2.hideCol(colIndex);\n            });\n\n            this.buildBtn();\n            this.buildManager();\n\n            /** @inherited */\n            this.initialized = true;\n\n            this.boundMouseup = this.onMouseup.bind(this);\n\n            this.emitter.emit('columns-visibility-initialized', this.tf, this);\n            this.emitter.emit('extension-initialized', this);\n\n            // Hide columns at start at very end of initialization, do not move\n            // as order is important\n            this._hideAtStart();\n        }\n\n        /**\r\n         * Build main button UI\r\n         */\n\n    }, {\n        key: 'buildBtn',\n        value: function buildBtn() {\n            var _this3 = this;\n\n            if (this.btnEl) {\n                return;\n            }\n            var tf = this.tf;\n            var span = (0, _dom.createElm)('span');\n            span.className = this.spanCssClass;\n\n            // Container element (rdiv or custom element)\n            var targetEl = !this.btnTgtId ? tf.feature('toolbar').container(this.toolbarPosition) : (0, _dom.elm)(this.btnTgtId);\n\n            if (!this.btnTgtId) {\n                var firstChild = targetEl.firstChild;\n                firstChild.parentNode.insertBefore(span, firstChild);\n            } else {\n                targetEl.appendChild(span);\n            }\n\n            if (!this.btnHtml) {\n                var btn = (0, _dom.createElm)('a', ['href', 'javascript:;']);\n                btn.className = this.btnCssClass;\n                btn.title = this.desc;\n\n                btn.innerHTML = this.btnText;\n                span.appendChild(btn);\n                if (!this.enableHover) {\n                    (0, _event.addEvt)(btn, 'click', function (evt) {\n                        return _this3.toggle(evt);\n                    });\n                } else {\n                    (0, _event.addEvt)(btn, 'mouseover', function (evt) {\n                        return _this3.toggle(evt);\n                    });\n                }\n            } else {\n                // Custom html\n                span.innerHTML = this.btnHtml;\n                var colVisEl = span.firstChild;\n                if (!this.enableHover) {\n                    (0, _event.addEvt)(colVisEl, 'click', function (evt) {\n                        return _this3.toggle(evt);\n                    });\n                } else {\n                    (0, _event.addEvt)(colVisEl, 'mouseover', function (evt) {\n                        return _this3.toggle(evt);\n                    });\n                }\n            }\n\n            this.spanEl = span;\n            this.btnEl = this.spanEl.firstChild;\n\n            this.onLoaded(this);\n        }\n\n        /**\r\n         * Build columns manager UI\r\n         */\n\n    }, {\n        key: 'buildManager',\n        value: function buildManager() {\n            var _this4 = this;\n\n            var tf = this.tf;\n\n            var container = !this.contElTgtId ? (0, _dom.createElm)('div') : (0, _dom.elm)(this.contElTgtId);\n            container.className = this.contCssClass;\n\n            //Extension description\n            var extNameLabel = (0, _dom.createElm)('p');\n            extNameLabel.innerHTML = this.text;\n            container.appendChild(extNameLabel);\n\n            //Headers list\n            var ul = (0, _dom.createElm)('ul');\n            ul.className = this.listCssClass;\n\n            var tbl = this.headersTbl || tf.dom();\n            var headerIndex = this.headersTbl ? this.headersIndex : tf.getHeadersRowIndex();\n            var headerRow = tbl.rows[headerIndex];\n\n            //Tick all option\n            if (this.enableTickAll) {\n                var li = (0, _dom.createCheckItem)('col__' + tf.id, this.tickAllText, this.tickAllText);\n                (0, _dom.addClass)(li, this.listItemCssClass);\n                ul.appendChild(li);\n                li.check.checked = !this.tickToHide;\n\n                (0, _event.addEvt)(li.check, 'click', function () {\n                    for (var h = 0; h < headerRow.cells.length; h++) {\n                        var itm = (0, _dom.elm)('col_' + h + '_' + tf.id);\n                        if (itm && li.check.checked !== itm.checked) {\n                            itm.click();\n                            itm.checked = li.check.checked;\n                        }\n                    }\n                });\n            }\n\n            for (var i = 0; i < headerRow.cells.length; i++) {\n                var cell = headerRow.cells[i];\n                var cellText = this.headersText[i] || this._getHeaderText(cell);\n                var liElm = (0, _dom.createCheckItem)('col_' + i + '_' + tf.id, cellText, cellText);\n                (0, _dom.addClass)(liElm, this.listItemCssClass);\n                if (!this.tickToHide) {\n                    (0, _dom.addClass)(liElm, this.listSlcItemCssClass);\n                }\n                ul.appendChild(liElm);\n                if (!this.tickToHide) {\n                    liElm.check.checked = true;\n                }\n\n                (0, _event.addEvt)(liElm.check, 'click', function (evt) {\n                    var elm = (0, _event.targetEvt)(evt);\n                    var lbl = elm.parentNode;\n                    _this4.checkItem(lbl);\n                });\n            }\n\n            //separator\n            var p = (0, _dom.createElm)('p', ['align', 'center']);\n            var btn = void 0;\n            //Close link\n            if (!this.btnCloseHtml) {\n                btn = (0, _dom.createElm)('a', ['href', 'javascript:;']);\n                btn.className = this.btnCloseCssClass;\n                btn.innerHTML = this.btnCloseText;\n                (0, _event.addEvt)(btn, 'click', function (evt) {\n                    return _this4.toggle(evt);\n                });\n                p.appendChild(btn);\n            } else {\n                p.innerHTML = this.btnCloseHtml;\n                btn = p.firstChild;\n                (0, _event.addEvt)(btn, 'click', function (evt) {\n                    return _this4.toggle(evt);\n                });\n            }\n\n            container.appendChild(ul);\n            container.appendChild(p);\n\n            this.btnEl.parentNode.insertBefore(container, this.btnEl);\n            this.contEl = container;\n        }\n\n        /**\r\n         * Hide or show specified columns\r\n         * @param {Number} colIndex Column index\r\n         * @param {Boolean} hide    Hide column if true or show if false\r\n         */\n\n    }, {\n        key: 'setHidden',\n        value: function setHidden(colIndex, hide) {\n            var tf = this.tf;\n            var tbl = tf.dom();\n\n            if (hide) {\n                this.onBeforeColHidden(this, colIndex);\n            } else {\n                this.onBeforeColDisplayed(this, colIndex);\n            }\n\n            this._hideElements(tbl, colIndex, hide);\n            if (this.headersTbl) {\n                this._hideElements(this.headersTbl, colIndex, hide);\n            }\n\n            var hiddenCols = this.hiddenCols;\n            var itemIndex = hiddenCols.indexOf(colIndex);\n            if (hide) {\n                if (itemIndex === -1) {\n                    this.hiddenCols.push(colIndex);\n                }\n            } else {\n                if (itemIndex !== -1) {\n                    this.hiddenCols.splice(itemIndex, 1);\n                }\n            }\n\n            if (hide) {\n                this.onAfterColHidden(this, colIndex);\n                this.emitter.emit('column-hidden', tf, this, colIndex, this.hiddenCols);\n            } else {\n                this.onAfterColDisplayed(this, colIndex);\n                this.emitter.emit('column-shown', tf, this, colIndex, this.hiddenCols);\n            }\n        }\n\n        /**\r\n         * Show specified column\r\n         * @param  {Number} colIndex Column index\r\n         */\n\n    }, {\n        key: 'showCol',\n        value: function showCol(colIndex) {\n            if ((0, _types.isUndef)(colIndex) || !this.isColHidden(colIndex)) {\n                return;\n            }\n            if (this.manager && this.contEl) {\n                var itm = (0, _dom.elm)('col_' + colIndex + '_' + this.tf.id);\n                if (itm) {\n                    itm.click();\n                }\n            } else {\n                this.setHidden(colIndex, false);\n            }\n        }\n\n        /**\r\n         * Hide specified column\r\n         * @param  {Number} colIndex Column index\r\n         */\n\n    }, {\n        key: 'hideCol',\n        value: function hideCol(colIndex) {\n            if ((0, _types.isUndef)(colIndex) || this.isColHidden(colIndex)) {\n                return;\n            }\n            if (this.manager && this.contEl) {\n                var itm = (0, _dom.elm)('col_' + colIndex + '_' + this.tf.id);\n                if (itm) {\n                    itm.click();\n                }\n            } else {\n                this.setHidden(colIndex, true);\n            }\n        }\n\n        /**\r\n         * Determine if specified column is hidden\r\n         * @param  {Number} colIndex Column index\r\n         */\n\n    }, {\n        key: 'isColHidden',\n        value: function isColHidden(colIndex) {\n            if (this.hiddenCols.indexOf(colIndex) !== -1) {\n                return true;\n            }\n            return false;\n        }\n\n        /**\r\n         * Toggle visibility of specified column\r\n         * @param  {Number} colIndex Column index\r\n         */\n\n    }, {\n        key: 'toggleCol',\n        value: function toggleCol(colIndex) {\n            if ((0, _types.isUndef)(colIndex) || this.isColHidden(colIndex)) {\n                this.showCol(colIndex);\n            } else {\n                this.hideCol(colIndex);\n            }\n        }\n\n        /**\r\n         * Return the indexes of the columns currently hidden\r\n         * @return {Array} column indexes\r\n         */\n\n    }, {\n        key: 'getHiddenCols',\n        value: function getHiddenCols() {\n            return this.hiddenCols;\n        }\n\n        /**\r\n         * Remove the columns manager\r\n         */\n\n    }, {\n        key: 'destroy',\n        value: function destroy() {\n            var _this5 = this;\n\n            if (!this.initialized) {\n                return;\n            }\n            if ((0, _dom.elm)(this.contElTgtId)) {\n                (0, _dom.elm)(this.contElTgtId).innerHTML = '';\n            } else {\n                this.contEl.innerHTML = '';\n                (0, _dom.removeElm)(this.contEl);\n                this.contEl = null;\n            }\n            this.btnEl.innerHTML = '';\n            (0, _dom.removeElm)(this.btnEl);\n            this.btnEl = null;\n\n            this.emitter.off(['hide-column'], function (tf, colIndex) {\n                return _this5.hideCol(colIndex);\n            });\n\n            this.boundMouseup = null;\n\n            this.initialized = false;\n        }\n    }, {\n        key: '_getHeaderText',\n        value: function _getHeaderText(cell) {\n            if (!cell.hasChildNodes) {\n                return '';\n            }\n\n            for (var i = 0; i < cell.childNodes.length; i++) {\n                var n = cell.childNodes[i];\n                if (n.nodeType === 3) {\n                    return n.nodeValue;\n                } else if (n.nodeType === 1) {\n                    if (n.id && n.id.indexOf('popUp') !== -1) {\n                        continue;\n                    } else {\n                        return (0, _dom.getText)(n);\n                    }\n                }\n                continue;\n            }\n            return '';\n        }\n    }, {\n        key: '_hideElements',\n        value: function _hideElements(tbl, colIdx, hide) {\n            this._hideCells(tbl, colIdx, hide);\n            this._hideCol(tbl, colIdx, hide);\n        }\n    }, {\n        key: '_hideCells',\n        value: function _hideCells(tbl, colIdx, hide) {\n            for (var i = 0; i < tbl.rows.length; i++) {\n                var row = tbl.rows[i];\n                var cell = row.cells[colIdx];\n                if (cell) {\n                    cell.style.display = hide ? _const.NONE : '';\n                }\n            }\n        }\n    }, {\n        key: '_hideCol',\n        value: function _hideCol(tbl, colIdx, hide) {\n            var colElms = (0, _dom.tag)(this.tf.dom(), 'col');\n            if (colElms.length === 0) {\n                return;\n            }\n            colElms[colIdx].style.display = hide ? _const.NONE : '';\n        }\n    }, {\n        key: '_hideAtStart',\n        value: function _hideAtStart() {\n            var _this6 = this;\n\n            this.atStart.forEach(function (colIdx) {\n                _this6.hideCol(colIdx);\n            });\n        }\n    }]);\n\n    return ColsVisibility;\n}(_feature.Feature);\n\nexports.default = ColsVisibility;\n\n/***/ }),\n\n/***/ 446:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n        value: true\n});\n\nvar _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();\n\nvar _feature = __webpack_require__(11);\n\nvar _dom = __webpack_require__(10);\n\nvar _types = __webpack_require__(3);\n\nvar _event = __webpack_require__(19);\n\nvar _settings = __webpack_require__(7);\n\nvar _toolbar = __webpack_require__(33);\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return call && (typeof call === \"object\" || typeof call === \"function\") ? call : self; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function, not \" + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }\n\n/**\r\n * Filters Visibility extension\r\n */\nvar FiltersVisibility = function (_Feature) {\n        _inherits(FiltersVisibility, _Feature);\n\n        /**\r\n         * Creates an instance of FiltersVisibility\r\n         * @param {TableFilter} tf TableFilter instance\r\n         * @param {Object} Configuration object\r\n         */\n        function FiltersVisibility(tf, f) {\n                _classCallCheck(this, FiltersVisibility);\n\n                /**\r\n                 * Module name\r\n                 * @type {String}\r\n                 */\n                var _this = _possibleConstructorReturn(this, (FiltersVisibility.__proto__ || Object.getPrototypeOf(FiltersVisibility)).call(this, tf, f.name));\n\n                _this.name = f.name;\n\n                /**\r\n                 * Module description\r\n                 * @type {String}\r\n                 */\n                _this.desc = (0, _settings.defaultsStr)(f.description, 'Filters row visibility manager');\n\n                /**\r\n                 * Extension's stylesheet filename\r\n                 * @type {String}\r\n                 */\n                _this.stylesheet = (0, _settings.defaultsStr)(f.stylesheet, 'filtersVisibility.css');\n\n                /**\r\n                 * Expand icon filename\r\n                 * @type {String}\r\n                 */\n                _this.icnExpand = (0, _settings.defaultsStr)(f.expand_icon_name, 'icn_exp.png');\n\n                /**\r\n                 * Collapse icon filename\r\n                 * @type {String}\r\n                 */\n                _this.icnCollapse = (0, _settings.defaultsStr)(f.collapse_icon_name, 'icn_clp.png');\n\n                /**\r\n                 * Main container element\r\n                 * @private\r\n                 */\n                _this.contEl = null;\n\n                /**\r\n                 * Button element\r\n                 * @private\r\n                 */\n                _this.btnEl = null;\n\n                /**\r\n                 * Expand icon HTML\r\n                 * @private\r\n                 */\n                _this.icnExpandHtml = '\"Expand';\n\n                /**\r\n                 * Collapse icon HTML\r\n                 * @private\r\n                 */\n                _this.icnCollapseHtml = '\"Collapse';\n\n                /**\r\n                 * Default text\r\n                 * @private\r\n                 */\n                _this.defaultText = 'Toggle filters';\n\n                /**\r\n                 * ID of main container element\r\n                 * @type {String}\r\n                 */\n                _this.targetId = f.target_id || null;\n\n                /**\r\n                 * Enable expand/collapse icon, defaults to true\r\n                 * @type {Boolean}\r\n                 */\n                _this.enableIcon = (0, _settings.defaultsBool)(f.enable_icon, true);\n\n                /**\r\n                 * Custom text for button\r\n                 * @type {String}\r\n                 */\n                _this.btnText = (0, _settings.defaultsStr)(f.btn_text, '');\n\n                /**\r\n                 * Collapse button HTML\r\n                 * @private\r\n                 */\n                _this.collapseBtnHtml = _this.enableIcon ? _this.icnCollapseHtml + _this.btnText : _this.btnText || _this.defaultText;\n\n                /**\r\n                 * Expand button HTML\r\n                 * @private\r\n                 */\n                _this.expandBtnHtml = _this.enableIcon ? _this.icnExpandHtml + _this.btnText : _this.btnText || _this.defaultText;\n\n                /**\r\n                 * Button's custom HTML\r\n                 * @type {String}\r\n                 */\n                _this.btnHtml = (0, _settings.defaultsStr)(f.btn_html, null);\n\n                /**\r\n                 * Css class for expand/collapse filters button\r\n                 * @type {String}\r\n                 */\n                _this.btnCssClass = (0, _settings.defaultsStr)(f.btn_css_class, 'btnExpClpFlt');\n\n                /**\r\n                 * Css class for main container\r\n                 * @type {String}\r\n                 */\n                _this.contCssClass = (0, _settings.defaultsStr)(f.cont_css_class, 'expClpFlt');\n\n                /**\r\n                 * Filters row index\r\n                 * @type {Number}\r\n                 */\n                _this.filtersRowIndex = (0, _settings.defaultsNb)(f.filters_row_index, tf.getFiltersRowIndex());\n\n                /**\r\n                 * Make filters visible at initialization, defaults to true\r\n                 * @type {Boolean}\r\n                 */\n                _this.visibleAtStart = (0, _settings.defaultsNb)(f.visible_at_start, true);\n\n                /**\r\n                 * Default position in toolbar ('left'|'center'|'right')\r\n                 * @type {String}\r\n                 */\n                _this.toolbarPosition = (0, _settings.defaultsStr)(f.toolbar_position, _toolbar.RIGHT);\n\n                /**\r\n                 * Callback fired before filters row is shown\r\n                 * @type {Function}\r\n                 */\n                _this.onBeforeShow = (0, _settings.defaultsFn)(f.on_before_show, _types.EMPTY_FN);\n\n                /**\r\n                 * Callback fired after filters row is shown\r\n                 * @type {Function}\r\n                 */\n                _this.onAfterShow = (0, _settings.defaultsFn)(f.on_after_show, _types.EMPTY_FN);\n\n                /**\r\n                 * Callback fired before filters row is hidden\r\n                 * @type {Function}\r\n                 */\n                _this.onBeforeHide = (0, _settings.defaultsFn)(f.on_before_hide, _types.EMPTY_FN);\n\n                /**\r\n                 * Callback fired after filters row is hidden\r\n                 * @type {Function}\r\n                 */\n                _this.onAfterHide = (0, _settings.defaultsFn)(f.on_after_hide, _types.EMPTY_FN);\n\n                //Import extension's stylesheet\n                tf.import(f.name + 'Style', tf.getStylePath() + _this.stylesheet, null, 'link');\n\n                _this.enable();\n                return _this;\n        }\n\n        /**\r\n         * Initialise extension\r\n         */\n\n\n        _createClass(FiltersVisibility, [{\n                key: 'init',\n                value: function init() {\n                        var _this2 = this;\n\n                        if (this.initialized) {\n                                return;\n                        }\n\n                        this.emitter.emit('initializing-extension', this, !(0, _types.isNull)(this.targetId));\n\n                        this.buildUI();\n\n                        /** @inherited */\n                        this.initialized = true;\n\n                        this.emitter.on(['show-filters'], function (tf, visible) {\n                                return _this2.show(visible);\n                        });\n                        this.emitter.emit('filters-visibility-initialized', this.tf, this);\n                        this.emitter.emit('extension-initialized', this);\n                }\n\n                /**\r\n                 * Build UI elements\r\n                 */\n\n        }, {\n                key: 'buildUI',\n                value: function buildUI() {\n                        var _this3 = this;\n\n                        var tf = this.tf;\n                        var span = (0, _dom.createElm)('span');\n                        span.className = this.contCssClass;\n\n                        // Container element (rdiv or custom element)\n                        var targetEl = !this.targetId ? tf.feature('toolbar').container(this.toolbarPosition) : (0, _dom.elm)(this.targetId);\n\n                        if (!this.targetId) {\n                                var firstChild = targetEl.firstChild;\n                                firstChild.parentNode.insertBefore(span, firstChild);\n                        } else {\n                                targetEl.appendChild(span);\n                        }\n\n                        var btn = void 0;\n                        if (!this.btnHtml) {\n                                btn = (0, _dom.createElm)('a', ['href', 'javascript:void(0);']);\n                                btn.className = this.btnCssClass;\n                                btn.title = this.btnText || this.defaultText;\n                                btn.innerHTML = this.collapseBtnHtml;\n                                span.appendChild(btn);\n                        } else {\n                                // Custom html\n                                span.innerHTML = this.btnHtml;\n                                btn = span.firstChild;\n                        }\n\n                        (0, _event.addEvt)(btn, 'click', function () {\n                                return _this3.toggle();\n                        });\n\n                        this.contEl = span;\n                        this.btnEl = btn;\n\n                        if (!this.visibleAtStart) {\n                                this.toggle();\n                        }\n                }\n\n                /**\r\n                 * Toggle filters visibility\r\n                 */\n\n        }, {\n                key: 'toggle',\n                value: function toggle() {\n                        var tf = this.tf;\n                        var tbl = tf.gridLayout ? tf.feature('gridLayout').headTbl : tf.dom();\n                        var fltRow = tbl.rows[this.filtersRowIndex];\n                        var isDisplayed = fltRow.style.display === '';\n\n                        this.show(!isDisplayed);\n                }\n\n                /**\r\n                 * Show or hide filters\r\n                 *\r\n                 * @param {boolean} [visible=true] Visibility flag\r\n                 */\n\n        }, {\n                key: 'show',\n                value: function show() {\n                        var visible = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;\n\n                        var tf = this.tf;\n                        var tbl = tf.gridLayout ? tf.feature('gridLayout').headTbl : tf.dom();\n                        var fltRow = tbl.rows[this.filtersRowIndex];\n\n                        if (visible) {\n                                this.onBeforeShow(this);\n                        }\n                        if (!visible) {\n                                this.onBeforeHide(this);\n                        }\n\n                        fltRow.style.display = visible ? '' : 'none';\n                        if (this.enableIcon && !this.btnHtml) {\n                                this.btnEl.innerHTML = visible ? this.collapseBtnHtml : this.expandBtnHtml;\n                        }\n\n                        if (visible) {\n                                this.onAfterShow(this);\n                        }\n                        if (!visible) {\n                                this.onAfterHide(this);\n                        }\n\n                        this.emitter.emit('filters-toggled', tf, this, visible);\n                }\n\n                /**\r\n                 * Destroy the UI\r\n                 */\n\n        }, {\n                key: 'destroy',\n                value: function destroy() {\n                        var _this4 = this;\n\n                        if (!this.initialized) {\n                                return;\n                        }\n\n                        this.emitter.off(['show-filters'], function (tf, visible) {\n                                return _this4.show(visible);\n                        });\n\n                        this.btnEl.innerHTML = '';\n                        (0, _dom.removeElm)(this.btnEl);\n                        this.btnEl = null;\n\n                        this.contEl.innerHTML = '';\n                        (0, _dom.removeElm)(this.contEl);\n                        this.contEl = null;\n                        this.initialized = false;\n                }\n        }]);\n\n        return FiltersVisibility;\n}(_feature.Feature);\n\nexports.default = FiltersVisibility;\n\n/***/ }),\n\n/***/ 447:\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nObject.defineProperty(exports, \"__esModule\", {\n    value: true\n});\n\nvar _adapterSortabletable = __webpack_require__(442);\n\nvar _adapterSortabletable2 = _interopRequireDefault(_adapterSortabletable);\n\nvar _root = __webpack_require__(16);\n\nfunction _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }\n\nif (!_root.root.SortableTable) {\n    __webpack_require__(449);\n}\n\nexports.default = _adapterSortabletable2.default;\n\n/***/ }),\n\n/***/ 448:\n/***/ (function(module, exports) {\n\n\nmodule.exports = formatter;\nmodule.exports.default = formatter;\n\nfunction formatter(options) {\n  options = options || {};\n\n\n  // *********************************************************************************************\n  // Set defaults for negatives\n  // options.negative, options.negativeOut, options.separator retained for backward compatibility\n  // *********************************************************************************************\n\n  // type of negative; default left\n  options.negativeType = options.negativeType || (options.negative === 'R' ? 'right' : 'left')\n\n  // negative symbols '-' or '()'\n  if (typeof options.negativeLeftSymbol !== 'string') {\n    switch (options.negativeType) {\n      case 'left':\n        options.negativeLeftSymbol = '-';\n        break;\n      case 'brackets':\n        options.negativeLeftSymbol = '(';\n        break;\n      default:\n        options.negativeLeftSymbol = '';\n    }\n  }\n  if (typeof options.negativeRightSymbol !== 'string') {\n    switch (options.negativeType) {\n      case 'right':\n        options.negativeRightSymbol = '-';\n        break;\n      case 'brackets':\n        options.negativeRightSymbol = ')';\n        break;\n      default:\n        options.negativeRightSymbol = '';\n    }\n  }\n\n  // whether negative symbol should be inside/outside prefix and suffix\n\n  if (typeof options.negativeLeftOut !== \"boolean\") {\n    options.negativeLeftOut = (options.negativeOut === false ? false : true);\n  }\n  if (typeof options.negativeRightOut !== \"boolean\") {\n    options.negativeRightOut = (options.negativeOut === false ? false : true);\n  }\n\n  //prefix and suffix\n  options.prefix = options.prefix || '';\n  options.suffix = options.suffix || '';\n\n  //separators\n  if (typeof options.integerSeparator !== 'string') {\n    options.integerSeparator = (typeof options.separator === 'string' ? options.separator : ',');\n  }\n  options.decimalsSeparator = typeof options.decimalsSeparator === 'string' ? options.decimalsSeparator : '';\n  options.decimal = options.decimal || '.';\n\n  //padders\n  options.padLeft = options.padLeft || -1 //default no padding\n  options.padRight = options.padRight || -1 //default no padding\n\n  function format(number, overrideOptions) {\n    overrideOptions = overrideOptions || {};\n\n    if (number || number === 0) {\n      number = '' + number;//convert number to string if it isn't already\n    } else {\n      return '';\n    }\n\n    //identify a negative number and make it absolute\n    var output = [];\n    var negative = number.charAt(0) === '-';\n    number = number.replace(/^\\-/g, '');\n\n    //Prepare output with left hand negative and/or prefix\n    if (!options.negativeLeftOut && !overrideOptions.noUnits) {\n      output.push(options.prefix);\n    }\n    if (negative) {\n      output.push(options.negativeLeftSymbol);\n    }\n    if (options.negativeLeftOut && !overrideOptions.noUnits) {\n      output.push(options.prefix);\n    }\n\n    //Format core number\n    number = number.split('.');\n    if (options.round != null) round(number, options.round);\n    if (options.truncate != null) number[1] = truncate(number[1], options.truncate);\n    if (options.padLeft > 0) number[0] = padLeft(number[0], options.padLeft);\n    if (options.padRight > 0) number[1] = padRight(number[1], options.padRight);\n    if (!overrideOptions.noSeparator && number[1]) number[1] = addDecimalSeparators(number[1], options.decimalsSeparator);\n    if (!overrideOptions.noSeparator && number[0]) number[0] = addIntegerSeparators(number[0], options.integerSeparator);\n    output.push(number[0]);\n    if (number[1]) {\n      output.push(options.decimal);\n      output.push(number[1]);\n    }\n\n    //Prepare output with right hand negative and/or prefix\n    if (options.negativeRightOut && !overrideOptions.noUnits) {\n      output.push(options.suffix);\n    }\n    if (negative) {\n      output.push(options.negativeRightSymbol);\n    }\n    if (!options.negativeRightOut && !overrideOptions.noUnits) {\n      output.push(options.suffix);\n    }\n\n    //join output and return\n    return output.join('');\n  }\n\n  format.negative = options.negative;\n  format.negativeOut = options.negativeOut;\n  format.negativeType = options.negativeType;\n  format.negativeLeftOut = options.negativeLeftOut;\n  format.negativeLeftSymbol = options.negativeLeftSymbol;\n  format.negativeRightOut = options.negativeRightOut;\n  format.negativeRightSymbol = options.negativeRightSymbol;\n  format.prefix = options.prefix;\n  format.suffix = options.suffix;\n  format.separate = options.separate;\n  format.integerSeparator = options.integerSeparator;\n  format.decimalsSeparator = options.decimalsSeparator;\n  format.decimal = options.decimal;\n  format.padLeft = options.padLeft;\n  format.padRight = options.padRight;\n  format.truncate = options.truncate;\n  format.round = options.round;\n\n  function unformat(number, allowedSeparators) {\n    allowedSeparators = allowedSeparators || [];\n    if (options.allowedSeparators) {\n      options.allowedSeparators.forEach(function (s) { allowedSeparators.push (s); });\n    }\n    allowedSeparators.push(options.integerSeparator);\n    allowedSeparators.push(options.decimalsSeparator);\n    number = number.replace(options.prefix, '');\n    number = number.replace(options.suffix, '');\n    var newNumber = number;\n    do {\n      number = newNumber;\n      for (var i = 0; i < allowedSeparators.length; i++) {\n        newNumber = newNumber.replace(allowedSeparators[i], '');\n      }\n    } while (newNumber != number);\n    return number;\n  }\n  format.unformat = unformat;\n\n  function validate(number, allowedSeparators) {\n    number = unformat(number, allowedSeparators);\n    number = number.split(options.decimal);\n    if (number.length > 2) {\n      return false;\n    } else if (options.truncate != null && number[1] && number[1].length > options.truncate) {\n      return false;\n    }  else if (options.round != null && number[1] && number[1].length > options.round) {\n      return false;\n    } else {\n      return /^-?\\d+\\.?\\d*$/.test(number);\n    }\n  }\n  return format;\n}\n\n//where x is already the integer part of the number\nfunction addIntegerSeparators(x, separator) {\n  x += '';\n  if (!separator) return x;\n  var rgx = /(\\d+)(\\d{3})/;\n  while (rgx.test(x)) {\n    x = x.replace(rgx, '$1' + separator + '$2');\n  }\n  return x;\n}\n\n//where x is already the decimal part of the number\nfunction addDecimalSeparators(x, separator) {\n  x += '';\n  if (!separator) return x;\n  var rgx = /(\\d{3})(\\d+)/;\n  while (rgx.test(x)) {\n    x = x.replace(rgx, '$1' + separator + '$2');\n  }\n  return x;\n}\n\n//where x is the integer part of the number\nfunction padLeft(x, padding) {\n  x = x + '';\n  var buf = [];\n  while (buf.length + x.length < padding) {\n    buf.push('0');\n  }\n  return buf.join('') + x;\n}\n\n//where x is the decimals part of the number\nfunction padRight(x, padding) {\n  if (x) {\n    x += '';\n  } else {\n    x = '';\n  }\n  var buf = [];\n  while (buf.length + x.length < padding) {\n    buf.push('0');\n  }\n  return x + buf.join('');\n}\nfunction truncate(x, length) {\n  if (x) {\n    x += '';\n  }\n  if (x && x.length > length) {\n    return x.substr(0, length);\n  } else {\n    return x;\n  }\n}\n\n//where number is an array with 0th item as integer string and 1st item as decimal string (no negatives)\nfunction round(number, places) {\n  if (number[1] && places >= 0 && number[1].length > places) {\n    //truncate to correct number of decimal places\n    var decim = number[1].slice(0, places);\n    //if next digit was >= 5 we need to round up\n    if (+(number[1].substr(places, 1)) >= 5) {\n      //But first count leading zeros as converting to a number will loose them\n      var leadingzeros = \"\";\n      while (decim.charAt(0)===\"0\") {\n        leadingzeros = leadingzeros + \"0\";\n        decim = decim.substr(1);\n      }\n      //Then we can change decim to a number and add 1 before replacing leading zeros\n      decim = (+decim + 1) + '';\n      decim = leadingzeros + decim;\n      if (decim.length > places) {\n        //adding one has made it longer\n        number[0] = (+number[0]+ +decim.charAt(0)) + ''; //add value of firstchar to the integer part\n        decim = decim.substring(1);   //ignore the 1st char at the beginning which is the carry to the integer part\n      }\n    }\n    number[1] = decim;\n  }\n  return number;\n}\n\n\n/***/ }),\n\n/***/ 449:\n/***/ (function(module, exports, __webpack_require__) {\n\n__webpack_require__(450)(__webpack_require__(451))\n\n/***/ }),\n\n/***/ 450:\n/***/ (function(module, exports) {\n\n/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\nmodule.exports = function(src) {\r\n\tif (typeof execScript !== \"undefined\")\r\n\t\texecScript(src);\r\n\telse\r\n\t\teval.call(null, src);\r\n}\r\n\n\n/***/ }),\n\n/***/ 451:\n/***/ (function(module, exports) {\n\nmodule.exports = \"/*----------------------------------------------------------------------------\\\\\\r\\n|                            Sortable Table 1.12                              |\\r\\n|-----------------------------------------------------------------------------|\\r\\n|                         Created by Erik Arvidsson                           |\\r\\n|                  (http://webfx.eae.net/contact.html#erik)                   |\\r\\n|                      For WebFX (http://webfx.eae.net/)                      |\\r\\n|-----------------------------------------------------------------------------|\\r\\n| A DOM 1 based script that allows an ordinary HTML table to be sortable.     |\\r\\n|-----------------------------------------------------------------------------|\\r\\n|                  Copyright (c) 1998 - 2006 Erik Arvidsson                   |\\r\\n|-----------------------------------------------------------------------------|\\r\\n| Licensed under the Apache License, Version 2.0 (the \\\"License\\\"); you may not |\\r\\n| use this file except in compliance with the License.  You may obtain a copy |\\r\\n| of the License at http://www.apache.org/licenses/LICENSE-2.0                |\\r\\n| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |\\r\\n| Unless  required  by  applicable law or  agreed  to  in  writing,  software |\\r\\n| distributed under the License is distributed on an  \\\"AS IS\\\" BASIS,  WITHOUT |\\r\\n| WARRANTIES OR  CONDITIONS OF ANY KIND,  either express or implied.  See the |\\r\\n| License  for the  specific language  governing permissions  and limitations |\\r\\n| under the License.                                                          |\\r\\n|-----------------------------------------------------------------------------|\\r\\n| 2003-01-10 | First version                                                  |\\r\\n| 2003-01-19 | Minor changes to the date parsing                              |\\r\\n| 2003-01-28 | JScript 5.0 fixes (no support for 'in' operator)               |\\r\\n| 2003-02-01 | Sloppy typo like error fixed in getInnerText                   |\\r\\n| 2003-07-04 | Added workaround for IE cellIndex bug.                         |\\r\\n| 2003-11-09 | The bDescending argument to sort was not correctly working     |\\r\\n|            | Using onclick DOM0 event if no support for addEventListener    |\\r\\n|            | or attachEvent                                                 |\\r\\n| 2004-01-13 | Adding addSortType and removeSortType which makes it a lot     |\\r\\n|            | easier to add new, custom sort types.                          |\\r\\n| 2004-01-27 | Switch to use descending = false as the default sort order.    |\\r\\n|            | Change defaultDescending to suit your needs.                   |\\r\\n| 2004-03-14 | Improved sort type None look and feel a bit                    |\\r\\n| 2004-08-26 | Made the handling of tBody and tHead more flexible. Now you    |\\r\\n|            | can use another tHead or no tHead, and you can chose some      |\\r\\n|            | other tBody.                                                   |\\r\\n| 2006-04-25 | Changed license to Apache Software License 2.0                 |\\r\\n|-----------------------------------------------------------------------------|\\r\\n| Created 2003-01-10 | All changes are in the log above. | Updated 2006-04-25 |\\r\\n\\\\----------------------------------------------------------------------------*/\\r\\n\\r\\n\\r\\nfunction SortableTable(oTable, oSortTypes) {\\r\\n\\r\\n\\tthis.sortTypes = oSortTypes || [];\\r\\n\\r\\n\\tthis.sortColumn = null;\\r\\n\\tthis.descending = null;\\r\\n\\r\\n\\tvar oThis = this;\\r\\n\\tthis._headerOnclick = function (e) {\\r\\n\\t\\toThis.headerOnclick(e);\\r\\n\\t};\\r\\n\\r\\n\\tif (oTable) {\\r\\n\\t\\tthis.setTable( oTable );\\r\\n\\t\\tthis.document = oTable.ownerDocument || oTable.document;\\r\\n\\t}\\r\\n\\telse {\\r\\n\\t\\tthis.document = document;\\r\\n\\t}\\r\\n\\r\\n\\r\\n\\t// only IE needs this\\r\\n\\tvar win = this.document.defaultView || this.document.parentWindow;\\r\\n\\tthis._onunload = function () {\\r\\n\\t\\toThis.destroy();\\r\\n\\t};\\r\\n\\tif (win && typeof win.attachEvent != \\\"undefined\\\") {\\r\\n\\t\\twin.attachEvent(\\\"onunload\\\", this._onunload);\\r\\n\\t}\\r\\n}\\r\\n\\r\\nSortableTable.gecko = navigator.product == \\\"Gecko\\\";\\r\\nSortableTable.msie = /msie/i.test(navigator.userAgent);\\r\\n// Mozilla is faster when doing the DOM manipulations on\\r\\n// an orphaned element. MSIE is not\\r\\nSortableTable.removeBeforeSort = SortableTable.gecko;\\r\\n\\r\\nSortableTable.prototype.onsort = function () {};\\r\\n\\r\\n// default sort order. true -> descending, false -> ascending\\r\\nSortableTable.prototype.defaultDescending = false;\\r\\n\\r\\n// shared between all instances. This is intentional to allow external files\\r\\n// to modify the prototype\\r\\nSortableTable.prototype._sortTypeInfo = {};\\r\\n\\r\\nSortableTable.prototype.setTable = function (oTable) {\\r\\n\\tif ( this.tHead )\\r\\n\\t\\tthis.uninitHeader();\\r\\n\\tthis.element = oTable;\\r\\n\\tthis.setTHead( oTable.tHead );\\r\\n\\tthis.setTBody( oTable.tBodies[0] );\\r\\n};\\r\\n\\r\\nSortableTable.prototype.setTHead = function (oTHead) {\\r\\n\\tif (this.tHead && this.tHead != oTHead )\\r\\n\\t\\tthis.uninitHeader();\\r\\n\\tthis.tHead = oTHead;\\r\\n\\tthis.initHeader( this.sortTypes );\\r\\n};\\r\\n\\r\\nSortableTable.prototype.setTBody = function (oTBody) {\\r\\n\\tthis.tBody = oTBody;\\r\\n};\\r\\n\\r\\nSortableTable.prototype.setSortTypes = function ( oSortTypes ) {\\r\\n\\tif ( this.tHead )\\r\\n\\t\\tthis.uninitHeader();\\r\\n\\tthis.sortTypes = oSortTypes || [];\\r\\n\\tif ( this.tHead )\\r\\n\\t\\tthis.initHeader( this.sortTypes );\\r\\n};\\r\\n\\r\\n// adds arrow containers and events\\r\\n// also binds sort type to the header cells so that reordering columns does\\r\\n// not break the sort types\\r\\nSortableTable.prototype.initHeader = function (oSortTypes) {\\r\\n\\tif (!this.tHead) return;\\r\\n\\tvar cells = this.tHead.rows[0].cells;\\r\\n\\tvar doc = this.tHead.ownerDocument || this.tHead.document;\\r\\n\\tthis.sortTypes = oSortTypes || [];\\r\\n\\tvar l = cells.length;\\r\\n\\tvar img, c;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\tc = cells[i];\\r\\n\\t\\tif (this.sortTypes[i] != null && this.sortTypes[i] != \\\"None\\\") {\\r\\n\\t\\t\\timg = doc.createElement(\\\"IMG\\\");\\r\\n\\t\\t\\timg.src = \\\"images/blank.png\\\";\\r\\n\\t\\t\\tc.appendChild(img);\\r\\n\\t\\t\\tif (this.sortTypes[i] != null)\\r\\n\\t\\t\\t\\tc._sortType = this.sortTypes[i];\\r\\n\\t\\t\\tif (typeof c.addEventListener != \\\"undefined\\\")\\r\\n\\t\\t\\t\\tc.addEventListener(\\\"click\\\", this._headerOnclick, false);\\r\\n\\t\\t\\telse if (typeof c.attachEvent != \\\"undefined\\\")\\r\\n\\t\\t\\t\\tc.attachEvent(\\\"onclick\\\", this._headerOnclick);\\r\\n\\t\\t\\telse\\r\\n\\t\\t\\t\\tc.onclick = this._headerOnclick;\\r\\n\\t\\t}\\r\\n\\t\\telse\\r\\n\\t\\t{\\r\\n\\t\\t\\tc.setAttribute( \\\"_sortType\\\", oSortTypes[i] );\\r\\n\\t\\t\\tc._sortType = \\\"None\\\";\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\tthis.updateHeaderArrows();\\r\\n};\\r\\n\\r\\n// remove arrows and events\\r\\nSortableTable.prototype.uninitHeader = function () {\\r\\n\\tif (!this.tHead) return;\\r\\n\\tvar cells = this.tHead.rows[0].cells;\\r\\n\\tvar l = cells.length;\\r\\n\\tvar c;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\tc = cells[i];\\r\\n\\t\\tif (c._sortType != null && c._sortType != \\\"None\\\") {\\r\\n\\t\\t\\tc.removeChild(c.lastChild);\\r\\n\\t\\t\\tif (typeof c.removeEventListener != \\\"undefined\\\")\\r\\n\\t\\t\\t\\tc.removeEventListener(\\\"click\\\", this._headerOnclick, false);\\r\\n\\t\\t\\telse if (typeof c.detachEvent != \\\"undefined\\\")\\r\\n\\t\\t\\t\\tc.detachEvent(\\\"onclick\\\", this._headerOnclick);\\r\\n\\t\\t\\tc._sortType = null;\\r\\n\\t\\t\\tc.removeAttribute( \\\"_sortType\\\" );\\r\\n\\t\\t}\\r\\n\\t}\\r\\n};\\r\\n\\r\\nSortableTable.prototype.updateHeaderArrows = function () {\\r\\n\\tif (!this.tHead) return;\\r\\n\\tvar cells = this.tHead.rows[0].cells;\\r\\n\\tvar l = cells.length;\\r\\n\\tvar img;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\tif (cells[i]._sortType != null && cells[i]._sortType != \\\"None\\\") {\\r\\n\\t\\t\\timg = cells[i].lastChild;\\r\\n\\t\\t\\tif (i == this.sortColumn)\\r\\n\\t\\t\\t\\timg.className = \\\"sort-arrow \\\" + (this.descending ? \\\"descending\\\" : \\\"ascending\\\");\\r\\n\\t\\t\\telse\\r\\n\\t\\t\\t\\timg.className = \\\"sort-arrow\\\";\\r\\n\\t\\t}\\r\\n\\t}\\r\\n};\\r\\n\\r\\nSortableTable.prototype.headerOnclick = function (e) {\\r\\n\\t// find TD element\\r\\n\\tvar el = e.target || e.srcElement;\\r\\n\\twhile (el.tagName != \\\"TD\\\")\\r\\n\\t\\tel = el.parentNode;\\r\\n\\r\\n\\tthis.sort(SortableTable.msie ? SortableTable.getCellIndex(el) : el.cellIndex);\\r\\n};\\r\\n\\r\\n// IE returns wrong cellIndex when columns are hidden\\r\\nSortableTable.getCellIndex = function (oTd) {\\r\\n\\tvar cells = oTd.parentNode.childNodes\\r\\n\\tvar l = cells.length;\\r\\n\\tvar i;\\r\\n\\tfor (i = 0; cells[i] != oTd && i < l; i++)\\r\\n\\t\\t;\\r\\n\\treturn i;\\r\\n};\\r\\n\\r\\nSortableTable.prototype.getSortType = function (nColumn) {\\r\\n\\treturn this.sortTypes[nColumn] || \\\"String\\\";\\r\\n};\\r\\n\\r\\n// only nColumn is required\\r\\n// if bDescending is left out the old value is taken into account\\r\\n// if sSortType is left out the sort type is found from the sortTypes array\\r\\n\\r\\nSortableTable.prototype.sort = function (nColumn, bDescending, sSortType) {\\r\\n\\tif (!this.tBody) return;\\r\\n\\tif (sSortType == null)\\r\\n\\t\\tsSortType = this.getSortType(nColumn);\\r\\n\\r\\n\\t// exit if None\\r\\n\\tif (sSortType == \\\"None\\\")\\r\\n\\t\\treturn;\\r\\n\\r\\n\\tif (bDescending == null) {\\r\\n\\t\\tif (this.sortColumn != nColumn)\\r\\n\\t\\t\\tthis.descending = this.defaultDescending;\\r\\n\\t\\telse\\r\\n\\t\\t\\tthis.descending = !this.descending;\\r\\n\\t}\\r\\n\\telse\\r\\n\\t\\tthis.descending = bDescending;\\r\\n\\r\\n\\tthis.sortColumn = nColumn;\\r\\n\\r\\n\\tif (typeof this.onbeforesort == \\\"function\\\")\\r\\n\\t\\tthis.onbeforesort();\\r\\n\\r\\n\\tvar f = this.getSortFunction(sSortType, nColumn);\\r\\n\\tvar a = this.getCache(sSortType, nColumn);\\r\\n\\tvar tBody = this.tBody;\\r\\n\\r\\n\\ta.sort(f);\\r\\n\\r\\n\\tif (this.descending)\\r\\n\\t\\ta.reverse();\\r\\n\\r\\n\\tif (SortableTable.removeBeforeSort) {\\r\\n\\t\\t// remove from doc\\r\\n\\t\\tvar nextSibling = tBody.nextSibling;\\r\\n\\t\\tvar p = tBody.parentNode;\\r\\n\\t\\tp.removeChild(tBody);\\r\\n\\t}\\r\\n\\r\\n\\t// insert in the new order\\r\\n\\tvar l = a.length;\\r\\n\\tfor (var i = 0; i < l; i++)\\r\\n\\t\\ttBody.appendChild(a[i].element);\\r\\n\\r\\n\\tif (SortableTable.removeBeforeSort) {\\r\\n\\t\\t// insert into doc\\r\\n\\t\\tp.insertBefore(tBody, nextSibling);\\r\\n\\t}\\r\\n\\r\\n\\tthis.updateHeaderArrows();\\r\\n\\r\\n\\tthis.destroyCache(a);\\r\\n\\r\\n\\tif (typeof this.onsort == \\\"function\\\")\\r\\n\\t\\tthis.onsort();\\r\\n};\\r\\n\\r\\nSortableTable.prototype.asyncSort = function (nColumn, bDescending, sSortType) {\\r\\n\\tvar oThis = this;\\r\\n\\tthis._asyncsort = function () {\\r\\n\\t\\toThis.sort(nColumn, bDescending, sSortType);\\r\\n\\t};\\r\\n\\twindow.setTimeout(this._asyncsort, 1);\\r\\n};\\r\\n\\r\\nSortableTable.prototype.getCache = function (sType, nColumn) {\\r\\n\\tif (!this.tBody) return [];\\r\\n\\tvar rows = this.tBody.rows;\\r\\n\\tvar l = rows.length;\\r\\n\\tvar a = new Array(l);\\r\\n\\tvar r;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\tr = rows[i];\\r\\n\\t\\ta[i] = {\\r\\n\\t\\t\\tvalue:\\t\\tthis.getRowValue(r, sType, nColumn),\\r\\n\\t\\t\\telement:\\tr\\r\\n\\t\\t};\\r\\n\\t};\\r\\n\\treturn a;\\r\\n};\\r\\n\\r\\nSortableTable.prototype.destroyCache = function (oArray) {\\r\\n\\tvar l = oArray.length;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\toArray[i].value = null;\\r\\n\\t\\toArray[i].element = null;\\r\\n\\t\\toArray[i] = null;\\r\\n\\t}\\r\\n};\\r\\n\\r\\nSortableTable.prototype.getRowValue = function (oRow, sType, nColumn) {\\r\\n\\t// if we have defined a custom getRowValue use that\\r\\n\\tif (this._sortTypeInfo[sType] && this._sortTypeInfo[sType].getRowValue)\\r\\n\\t\\treturn this._sortTypeInfo[sType].getRowValue(oRow, nColumn);\\r\\n\\r\\n\\tvar s;\\r\\n\\tvar c = oRow.cells[nColumn];\\r\\n\\tif (typeof c.innerText != \\\"undefined\\\")\\r\\n\\t\\ts = c.innerText;\\r\\n\\telse\\r\\n\\t\\ts = SortableTable.getInnerText(c);\\r\\n\\treturn this.getValueFromString(s, sType);\\r\\n};\\r\\n\\r\\nSortableTable.getInnerText = function (oNode) {\\r\\n\\tvar s = \\\"\\\";\\r\\n\\tvar cs = oNode.childNodes;\\r\\n\\tvar l = cs.length;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\tswitch (cs[i].nodeType) {\\r\\n\\t\\t\\tcase 1: //ELEMENT_NODE\\r\\n\\t\\t\\t\\ts += SortableTable.getInnerText(cs[i]);\\r\\n\\t\\t\\t\\tbreak;\\r\\n\\t\\t\\tcase 3:\\t//TEXT_NODE\\r\\n\\t\\t\\t\\ts += cs[i].nodeValue;\\r\\n\\t\\t\\t\\tbreak;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\treturn s;\\r\\n};\\r\\n\\r\\nSortableTable.prototype.getValueFromString = function (sText, sType) {\\r\\n\\tif (this._sortTypeInfo[sType])\\r\\n\\t\\treturn this._sortTypeInfo[sType].getValueFromString( sText );\\r\\n\\treturn sText;\\r\\n\\t/*\\r\\n\\tswitch (sType) {\\r\\n\\t\\tcase \\\"Number\\\":\\r\\n\\t\\t\\treturn Number(sText);\\r\\n\\t\\tcase \\\"CaseInsensitiveString\\\":\\r\\n\\t\\t\\treturn sText.toUpperCase();\\r\\n\\t\\tcase \\\"Date\\\":\\r\\n\\t\\t\\tvar parts = sText.split(\\\"-\\\");\\r\\n\\t\\t\\tvar d = new Date(0);\\r\\n\\t\\t\\td.setFullYear(parts[0]);\\r\\n\\t\\t\\td.setDate(parts[2]);\\r\\n\\t\\t\\td.setMonth(parts[1] - 1);\\r\\n\\t\\t\\treturn d.valueOf();\\r\\n\\t}\\r\\n\\treturn sText;\\r\\n\\t*/\\r\\n\\t};\\r\\n\\r\\nSortableTable.prototype.getSortFunction = function (sType, nColumn) {\\r\\n\\tif (this._sortTypeInfo[sType])\\r\\n\\t\\treturn this._sortTypeInfo[sType].compare;\\r\\n\\treturn SortableTable.basicCompare;\\r\\n};\\r\\n\\r\\nSortableTable.prototype.destroy = function () {\\r\\n\\tthis.uninitHeader();\\r\\n\\tvar win = this.document.parentWindow;\\r\\n\\tif (win && typeof win.detachEvent != \\\"undefined\\\") {\\t// only IE needs this\\r\\n\\t\\twin.detachEvent(\\\"onunload\\\", this._onunload);\\r\\n\\t}\\r\\n\\tthis._onunload = null;\\r\\n\\tthis.element = null;\\r\\n\\tthis.tHead = null;\\r\\n\\tthis.tBody = null;\\r\\n\\tthis.document = null;\\r\\n\\tthis._headerOnclick = null;\\r\\n\\tthis.sortTypes = null;\\r\\n\\tthis._asyncsort = null;\\r\\n\\tthis.onsort = null;\\r\\n};\\r\\n\\r\\n// Adds a sort type to all instance of SortableTable\\r\\n// sType : String - the identifier of the sort type\\r\\n// fGetValueFromString : function ( s : string ) : T - A function that takes a\\r\\n//    string and casts it to a desired format. If left out the string is just\\r\\n//    returned\\r\\n// fCompareFunction : function ( n1 : T, n2 : T ) : Number - A normal JS sort\\r\\n//    compare function. Takes two values and compares them. If left out less than,\\r\\n//    <, compare is used\\r\\n// fGetRowValue : function( oRow : HTMLTRElement, nColumn : int ) : T - A function\\r\\n//    that takes the row and the column index and returns the value used to compare.\\r\\n//    If left out then the innerText is first taken for the cell and then the\\r\\n//    fGetValueFromString is used to convert that string the desired value and type\\r\\n\\r\\nSortableTable.prototype.addSortType = function (sType, fGetValueFromString, fCompareFunction, fGetRowValue) {\\r\\n\\tthis._sortTypeInfo[sType] = {\\r\\n\\t\\ttype:\\t\\t\\t\\tsType,\\r\\n\\t\\tgetValueFromString:\\tfGetValueFromString || SortableTable.idFunction,\\r\\n\\t\\tcompare:\\t\\t\\tfCompareFunction || SortableTable.basicCompare,\\r\\n\\t\\tgetRowValue:\\t\\tfGetRowValue\\r\\n\\t};\\r\\n};\\r\\n\\r\\n// this removes the sort type from all instances of SortableTable\\r\\nSortableTable.prototype.removeSortType = function (sType) {\\r\\n\\tdelete this._sortTypeInfo[sType];\\r\\n};\\r\\n\\r\\nSortableTable.basicCompare = function compare(n1, n2) {\\r\\n\\tif (n1.value < n2.value)\\r\\n\\t\\treturn -1;\\r\\n\\tif (n2.value < n1.value)\\r\\n\\t\\treturn 1;\\r\\n\\treturn 0;\\r\\n};\\r\\n\\r\\nSortableTable.idFunction = function (x) {\\r\\n\\treturn x;\\r\\n};\\r\\n\\r\\nSortableTable.toUpperCase = function (s) {\\r\\n\\treturn s.toUpperCase();\\r\\n};\\r\\n\\r\\nSortableTable.toDate = function (s) {\\r\\n\\tvar parts = s.split(\\\"-\\\");\\r\\n\\tvar d = new Date(0);\\r\\n\\td.setFullYear(parts[0]);\\r\\n\\td.setDate(parts[2]);\\r\\n\\td.setMonth(parts[1] - 1);\\r\\n\\treturn d.valueOf();\\r\\n};\\r\\n\\r\\n\\r\\n// add sort types\\r\\nSortableTable.prototype.addSortType(\\\"Number\\\", Number);\\r\\nSortableTable.prototype.addSortType(\\\"CaseInsensitiveString\\\", SortableTable.toUpperCase);\\r\\nSortableTable.prototype.addSortType(\\\"Date\\\", SortableTable.toDate);\\r\\nSortableTable.prototype.addSortType(\\\"String\\\");\\r\\n// None is a special case\\r\\n\"\n\n/***/ })\n\n});\n\n\n// WEBPACK FOOTER //\n// tf-0-789aa3c9851693c1f448.js","var map = {\n\t\"./array\": 70,\n\t\"./array.js\": 70,\n\t\"./const\": 15,\n\t\"./const.js\": 15,\n\t\"./cookie\": 116,\n\t\"./cookie.js\": 116,\n\t\"./dom\": 10,\n\t\"./dom.js\": 10,\n\t\"./emitter\": 109,\n\t\"./emitter.js\": 109,\n\t\"./event\": 19,\n\t\"./event.js\": 19,\n\t\"./extensions/advancedGrid/adapterEzEditTable\": 441,\n\t\"./extensions/advancedGrid/adapterEzEditTable.js\": 441,\n\t\"./extensions/advancedGrid/advancedGrid\": 443,\n\t\"./extensions/advancedGrid/advancedGrid.js\": 443,\n\t\"./extensions/colOps/colOps\": 444,\n\t\"./extensions/colOps/colOps.js\": 444,\n\t\"./extensions/colsVisibility/colsVisibility\": 445,\n\t\"./extensions/colsVisibility/colsVisibility.js\": 445,\n\t\"./extensions/filtersVisibility/filtersVisibility\": 446,\n\t\"./extensions/filtersVisibility/filtersVisibility.js\": 446,\n\t\"./extensions/sort/adapterSortabletable\": 442,\n\t\"./extensions/sort/adapterSortabletable.js\": 442,\n\t\"./extensions/sort/sort\": 447,\n\t\"./extensions/sort/sort.js\": 447,\n\t\"./feature\": 11,\n\t\"./feature.js\": 11,\n\t\"./modules/alternateRows\": 125,\n\t\"./modules/alternateRows.js\": 125,\n\t\"./modules/baseDropdown\": 69,\n\t\"./modules/baseDropdown.js\": 69,\n\t\"./modules/checkList\": 128,\n\t\"./modules/checkList.js\": 128,\n\t\"./modules/clearButton\": 124,\n\t\"./modules/clearButton.js\": 124,\n\t\"./modules/dateType\": 111,\n\t\"./modules/dateType.js\": 111,\n\t\"./modules/dropdown\": 110,\n\t\"./modules/dropdown.js\": 110,\n\t\"./modules/gridLayout\": 117,\n\t\"./modules/gridLayout.js\": 117,\n\t\"./modules/hash\": 114,\n\t\"./modules/hash.js\": 114,\n\t\"./modules/help\": 112,\n\t\"./modules/help.js\": 112,\n\t\"./modules/highlightKeywords\": 119,\n\t\"./modules/highlightKeywords.js\": 119,\n\t\"./modules/loader\": 118,\n\t\"./modules/loader.js\": 118,\n\t\"./modules/markActiveColumns\": 121,\n\t\"./modules/markActiveColumns.js\": 121,\n\t\"./modules/noResults\": 126,\n\t\"./modules/noResults.js\": 126,\n\t\"./modules/paging\": 127,\n\t\"./modules/paging.js\": 127,\n\t\"./modules/popupFilter\": 120,\n\t\"./modules/popupFilter.js\": 120,\n\t\"./modules/rowsCounter\": 122,\n\t\"./modules/rowsCounter.js\": 122,\n\t\"./modules/state\": 113,\n\t\"./modules/state.js\": 113,\n\t\"./modules/statusBar\": 123,\n\t\"./modules/statusBar.js\": 123,\n\t\"./modules/storage\": 115,\n\t\"./modules/storage.js\": 115,\n\t\"./modules/toolbar\": 33,\n\t\"./modules/toolbar.js\": 33,\n\t\"./number\": 68,\n\t\"./number.js\": 68,\n\t\"./root\": 16,\n\t\"./root.js\": 16,\n\t\"./settings\": 7,\n\t\"./settings.js\": 7,\n\t\"./sort\": 107,\n\t\"./sort.js\": 107,\n\t\"./string\": 21,\n\t\"./string.js\": 21,\n\t\"./tablefilter\": 108,\n\t\"./tablefilter.js\": 108,\n\t\"./types\": 3,\n\t\"./types.js\": 3\n};\nfunction webpackContext(req) {\n\treturn __webpack_require__(webpackContextResolve(req));\n};\nfunction webpackContextResolve(req) {\n\tvar id = map[req];\n\tif(!(id + 1)) // check for number or string\n\t\tthrow new Error(\"Cannot find module '\" + req + \"'.\");\n\treturn id;\n};\nwebpackContext.keys = function webpackContextKeys() {\n\treturn Object.keys(map);\n};\nwebpackContext.resolve = webpackContextResolve;\nmodule.exports = webpackContext;\nwebpackContext.id = 440;\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./src ^\\.\\/.*$\n// module id = 440\n// module chunks = 0","import {Feature} from '../../feature';\r\nimport {tag} from '../../dom';\r\nimport {INPUT} from '../../const';\r\nimport {defaultsStr} from '../../settings';\r\nimport {root} from '../../root';\r\n\r\nconst INSTANTIATION_ERROR = `Failed to instantiate EditTable object.\r\n    \\n\"ezEditTable\" dependency not found.`;\r\n\r\n/**\r\n * Adapter module for ezEditTable, an external library providing advanced\r\n * grid features (selection and edition):\r\n * http://codecanyon.net/item/ezedittable-enhance-html-tables/2425123?ref=koalyptus\r\n */\r\nexport default class AdapterEzEditTable extends Feature {\r\n\r\n    /**\r\n     * Creates an instance of AdapterEzEditTable\r\n     *\r\n     * @param {TableFilter} tf TableFilter instance\r\n     * @param {Object} cfg Configuration options for ezEditTable library\r\n     */\r\n    constructor(tf, cfg) {\r\n        super(tf, cfg.name);\r\n\r\n        /**\r\n         * Module description\r\n         * @type {String}\r\n         */\r\n        this.desc = defaultsStr(cfg.description, 'ezEditTable adapter');\r\n\r\n        /**\r\n         * Filename of ezEditTable library\r\n         * @type {String}\r\n         */\r\n        this.filename = defaultsStr(cfg.filename, 'ezEditTable.js');\r\n\r\n        /**\r\n         * Path to ezEditTable library\r\n         * @type {String}\r\n         */\r\n        this.vendorPath = cfg.vendor_path;\r\n\r\n        /**\r\n         * Load ezEditTable stylesheet\r\n         * @type {Boolean}\r\n         */\r\n        this.loadStylesheet = Boolean(cfg.load_stylesheet);\r\n\r\n        /**\r\n         * Path to ezEditTable stylesheet\r\n         * @type {String}\r\n         */\r\n        this.stylesheet = defaultsStr(cfg.stylesheet,\r\n            this.vendorPath + 'ezEditTable.css');\r\n\r\n        /**\r\n         * Name of ezEditTable stylesheet\r\n         * @type {String}\r\n         */\r\n        this.stylesheetName = defaultsStr(cfg.stylesheet_name,\r\n            'ezEditTableCss');\r\n\r\n        // Enable the ezEditTable's scroll into view behaviour if grid layout on\r\n        cfg.scroll_into_view = cfg.scroll_into_view === false ?\r\n            false : tf.gridLayout;\r\n\r\n        /**\r\n         * ezEditTable instance\r\n         * @type {EditTable}\r\n         * @private\r\n         */\r\n        this._ezEditTable = null;\r\n\r\n        /**\r\n         * ezEditTable configuration\r\n         * @private\r\n         */\r\n        this.cfg = cfg;\r\n\r\n        this.enable();\r\n    }\r\n\r\n    /**\r\n     * Conditionally load ezEditTable library and set advanced grid\r\n     */\r\n    init() {\r\n        if (this.initialized) {\r\n            return;\r\n        }\r\n        let tf = this.tf;\r\n        if (root.EditTable) {\r\n            this._setAdvancedGrid();\r\n        } else {\r\n            let path = this.vendorPath + this.filename;\r\n            tf.import(this.filename, path, () => this._setAdvancedGrid());\r\n        }\r\n        if (this.loadStylesheet && !tf.isImported(this.stylesheet, 'link')) {\r\n            tf.import(this.stylesheetName, this.stylesheet, null, 'link');\r\n        }\r\n\r\n        // TODO: hack to prevent ezEditTable enter key event hijaking.\r\n        // Needs to be fixed in the vendor's library\r\n        this.emitter.on(['filter-focus', 'filter-blur'],\r\n            () => this._toggleForInputFilter());\r\n\r\n        /**\r\n         * @inherited\r\n         */\r\n        this.initialized = true;\r\n    }\r\n\r\n    /**\r\n     * Instantiate ezEditTable component for advanced grid features\r\n     * @private\r\n     */\r\n    _setAdvancedGrid() {\r\n        let tf = this.tf;\r\n\r\n        //start row for EditTable constructor needs to be calculated\r\n        let startRow,\r\n            cfg = this.cfg,\r\n            thead = tag(tf.dom(), 'thead');\r\n\r\n        //if thead exists and startRow not specified, startRow is calculated\r\n        //automatically by EditTable\r\n        if (thead.length > 0 && !cfg.startRow) {\r\n            startRow = undefined;\r\n        }\r\n        //otherwise startRow config property if any or TableFilter refRow\r\n        else {\r\n            startRow = cfg.startRow || tf.refRow;\r\n        }\r\n\r\n        cfg.base_path = cfg.base_path || tf.basePath + 'ezEditTable/';\r\n        let editable = cfg.editable;\r\n        let selectable = cfg.selection;\r\n\r\n        if (selectable) {\r\n            cfg.default_selection = cfg.default_selection || 'row';\r\n        }\r\n        //CSS Styles\r\n        cfg.active_cell_css = cfg.active_cell_css || 'ezETSelectedCell';\r\n\r\n        let _lastValidRowIndex = 0;\r\n        let _lastRowIndex = 0;\r\n\r\n        if (selectable) {\r\n            //Row navigation needs to be calculated according to TableFilter's\r\n            //validRowsIndex array\r\n            let onAfterSelection = function (et, selectedElm, e) {\r\n                let slc = et.Selection;\r\n                //Next valid filtered row needs to be selected\r\n                let doSelect = function (nextRowIndex) {\r\n                    if (et.defaultSelection === 'row') {\r\n                        /* eslint-disable */\r\n                        slc.SelectRowByIndex(nextRowIndex);\r\n                        /* eslint-enable */\r\n                    } else {\r\n                        /* eslint-disable */\r\n                        et.ClearSelections();\r\n                        /* eslint-enable */\r\n                        let cellIndex = selectedElm.cellIndex,\r\n                            row = tf.dom().rows[nextRowIndex];\r\n                        if (et.defaultSelection === 'both') {\r\n                            /* eslint-disable */\r\n                            slc.SelectRowByIndex(nextRowIndex);\r\n                            /* eslint-enable */\r\n                        }\r\n                        if (row) {\r\n                            /* eslint-disable */\r\n                            slc.SelectCell(row.cells[cellIndex]);\r\n                            /* eslint-enable */\r\n                        }\r\n                    }\r\n                    //Table is filtered\r\n                    if (tf.validRowsIndex.length !== tf.getRowsNb()) {\r\n                        let r = tf.dom().rows[nextRowIndex];\r\n                        if (r) {\r\n                            r.scrollIntoView(false);\r\n                        }\r\n                        if (cell) {\r\n                            if (cell.cellIndex === (tf.getCellsNb() - 1) &&\r\n                                tf.gridLayout) {\r\n                                tf.tblCont.scrollLeft = 100000000;\r\n                            }\r\n                            else if (cell.cellIndex === 0 && tf.gridLayout) {\r\n                                tf.tblCont.scrollLeft = 0;\r\n                            } else {\r\n                                cell.scrollIntoView(false);\r\n                            }\r\n                        }\r\n                    }\r\n                };\r\n\r\n                //table is not filtered\r\n                if (!tf.validRowsIndex) {\r\n                    return;\r\n                }\r\n                let validIndexes = tf.validRowsIndex,\r\n                    validIdxLen = validIndexes.length,\r\n                    row = et.defaultSelection !== 'row' ?\r\n                        selectedElm.parentNode : selectedElm,\r\n                    //cell for default_selection = 'both' or 'cell'\r\n                    cell = selectedElm.nodeName === 'TD' ? selectedElm : null,\r\n                    /* eslint-disable */\r\n                    keyCode = e !== undefined ? et.Event.GetKey(e) : 0,\r\n                    /* eslint-enable */\r\n                    isRowValid = validIndexes.indexOf(row.rowIndex) !== -1,\r\n                    nextRowIndex,\r\n                    paging = tf.feature('paging'),\r\n                    //pgup/pgdown keys\r\n                    d = keyCode === 34 || keyCode === 33 ?\r\n                        (paging && paging.pageLength || et.nbRowsPerPage) :\r\n                        1;\r\n\r\n                //If next row is not valid, next valid filtered row needs to be\r\n                //calculated\r\n                if (!isRowValid) {\r\n                    //Selection direction up/down\r\n                    if (row.rowIndex > _lastRowIndex) {\r\n                        //last row\r\n                        if (row.rowIndex >= validIndexes[validIdxLen - 1]) {\r\n                            nextRowIndex = validIndexes[validIdxLen - 1];\r\n                        } else {\r\n                            let calcRowIndex = (_lastValidRowIndex + d);\r\n                            if (calcRowIndex > (validIdxLen - 1)) {\r\n                                nextRowIndex = validIndexes[validIdxLen - 1];\r\n                            } else {\r\n                                nextRowIndex = validIndexes[calcRowIndex];\r\n                            }\r\n                        }\r\n                    } else {\r\n                        //first row\r\n                        if (row.rowIndex <= validIndexes[0]) {\r\n                            nextRowIndex = validIndexes[0];\r\n                        } else {\r\n                            let v = validIndexes[_lastValidRowIndex - d];\r\n                            nextRowIndex = v ? v : validIndexes[0];\r\n                        }\r\n                    }\r\n                    _lastRowIndex = row.rowIndex;\r\n                    doSelect(nextRowIndex);\r\n                } else {\r\n                    //If filtered row is valid, special calculation for\r\n                    //pgup/pgdown keys\r\n                    if (keyCode !== 34 && keyCode !== 33) {\r\n                        _lastValidRowIndex = validIndexes.indexOf(row.rowIndex);\r\n                        _lastRowIndex = row.rowIndex;\r\n                    } else {\r\n                        if (keyCode === 34) { //pgdown\r\n                            //last row\r\n                            if ((_lastValidRowIndex + d) <= (validIdxLen - 1)) {\r\n                                nextRowIndex = validIndexes[\r\n                                    _lastValidRowIndex + d];\r\n                            } else {\r\n                                nextRowIndex = [validIdxLen - 1];\r\n                            }\r\n                        } else { //pgup\r\n                            //first row\r\n                            if ((_lastValidRowIndex - d) <= validIndexes[0]) {\r\n                                nextRowIndex = validIndexes[0];\r\n                            } else {\r\n                                nextRowIndex = validIndexes[\r\n                                    _lastValidRowIndex - d];\r\n                            }\r\n                        }\r\n                        _lastRowIndex = nextRowIndex;\r\n                        _lastValidRowIndex = validIndexes.indexOf(nextRowIndex);\r\n                        doSelect(nextRowIndex);\r\n                    }\r\n                }\r\n            };\r\n\r\n            //Page navigation has to be enforced whenever selected row is out of\r\n            //the current page range\r\n            let onBeforeSelection = function (et, selectedElm) {\r\n                let row = et.defaultSelection !== 'row' ?\r\n                    selectedElm.parentNode : selectedElm;\r\n                if (tf.paging) {\r\n                    if (tf.feature('paging').nbPages > 1) {\r\n                        let paging = tf.feature('paging');\r\n                        //page length is re-assigned in case it has changed\r\n                        et.nbRowsPerPage = paging.pageLength;\r\n                        let validIndexes = tf.validRowsIndex,\r\n                            validIdxLen = validIndexes.length,\r\n                            pagingEndRow = parseInt(paging.startPagingRow, 10) +\r\n                                parseInt(paging.pageLength, 10);\r\n                        let rowIndex = row.rowIndex;\r\n\r\n                        if ((rowIndex === validIndexes[validIdxLen - 1]) &&\r\n                            paging.currentPageNb !== paging.nbPages) {\r\n                            paging.setPage('last');\r\n                        }\r\n                        else if ((rowIndex === validIndexes[0]) &&\r\n                            paging.currentPageNb !== 1) {\r\n                            paging.setPage('first');\r\n                        }\r\n                        else if (rowIndex > validIndexes[pagingEndRow - 1] &&\r\n                            rowIndex < validIndexes[validIdxLen - 1]) {\r\n                            paging.setPage('next');\r\n                        }\r\n                        else if (\r\n                            rowIndex < validIndexes[paging.startPagingRow] &&\r\n                            rowIndex > validIndexes[0]) {\r\n                            paging.setPage('previous');\r\n                        }\r\n                    }\r\n                }\r\n            };\r\n\r\n            //Selected row needs to be visible when paging is activated\r\n            if (tf.paging) {\r\n                tf.feature('paging').onAfterChangePage = function (paging) {\r\n                    let advGrid = paging.tf.extension('advancedGrid');\r\n                    let et = advGrid._ezEditTable;\r\n                    let slc = et.Selection;\r\n                    /* eslint-disable */\r\n                    let row = slc.GetActiveRow();\r\n                    /* eslint-enable */\r\n                    if (row) {\r\n                        row.scrollIntoView(false);\r\n                    }\r\n                    /* eslint-disable */\r\n                    let cell = slc.GetActiveCell();\r\n                    /* eslint-enable */\r\n                    if (cell) {\r\n                        cell.scrollIntoView(false);\r\n                    }\r\n                };\r\n            }\r\n\r\n            //Rows navigation when rows are filtered is performed with the\r\n            //EditTable row selection callback events\r\n            if (cfg.default_selection === 'row') {\r\n                let fnB = cfg.on_before_selected_row;\r\n                cfg.on_before_selected_row = function () {\r\n                    var args = arguments;\r\n                    onBeforeSelection(args[0], args[1], args[2]);\r\n                    if (fnB) {\r\n                        fnB.call(null, args[0], args[1], args[2]);\r\n                    }\r\n                };\r\n                let fnA = cfg.on_after_selected_row;\r\n                cfg.on_after_selected_row = function () {\r\n                    var args = arguments;\r\n                    onAfterSelection(args[0], args[1], args[2]);\r\n                    if (fnA) {\r\n                        fnA.call(null, args[0], args[1], args[2]);\r\n                    }\r\n                };\r\n            } else {\r\n                let fnD = cfg.on_before_selected_cell;\r\n                cfg.on_before_selected_cell = function () {\r\n                    var args = arguments;\r\n                    onBeforeSelection(args[0], args[1], args[2]);\r\n                    if (fnD) {\r\n                        fnD.call(null, args[0], args[1], args[2]);\r\n                    }\r\n                };\r\n                let fnC = cfg.on_after_selected_cell;\r\n                cfg.on_after_selected_cell = function () {\r\n                    var args = arguments;\r\n                    onAfterSelection(args[0], args[1], args[2]);\r\n                    if (fnC) {\r\n                        fnC.call(null, args[0], args[1], args[2]);\r\n                    }\r\n                };\r\n            }\r\n        }\r\n        if (editable) {\r\n            //Added or removed rows, TF rows number needs to be re-calculated\r\n            let fnE = cfg.on_added_dom_row;\r\n            cfg.on_added_dom_row = function () {\r\n                var args = arguments;\r\n                tf.nbFilterableRows++;\r\n                if (!tf.paging) {\r\n                    tf.emitter.emit('rows-changed', tf, this);\r\n                } else {\r\n                    tf.nbFilterableRows++;\r\n                    tf.paging = false;\r\n                    tf.feature('paging').destroy();\r\n                    tf.feature('paging').reset();\r\n                }\r\n                if (tf.alternateRows) {\r\n                    tf.feature('alternateRows').init();\r\n                }\r\n                if (fnE) {\r\n                    fnE.call(null, args[0], args[1], args[2]);\r\n                }\r\n            };\r\n            if (cfg.actions && cfg.actions['delete']) {\r\n                let fnF = cfg.actions['delete'].on_after_submit;\r\n                cfg.actions['delete'].on_after_submit = function () {\r\n                    var args = arguments;\r\n                    tf.nbFilterableRows--;\r\n                    if (!tf.paging) {\r\n                        tf.emitter.emit('rows-changed', tf, this);\r\n                    } else {\r\n                        tf.nbFilterableRows--;\r\n                        tf.paging = false;\r\n                        tf.feature('paging').destroy();\r\n                        tf.feature('paging').reset(false);\r\n                    }\r\n                    if (tf.alternateRows) {\r\n                        tf.feature('alternateRows').init();\r\n                    }\r\n                    if (fnF) {\r\n                        fnF.call(null, args[0], args[1]);\r\n                    }\r\n                };\r\n            }\r\n        }\r\n\r\n        try {\r\n            /* eslint-disable */\r\n            this._ezEditTable = new EditTable(tf.id, cfg, startRow);\r\n            this._ezEditTable.Init();\r\n            /* eslint-enable */\r\n        } catch (e) { throw new Error(INSTANTIATION_ERROR); }\r\n\r\n        this.initialized = true;\r\n    }\r\n\r\n    /**\r\n     * Reset advanced grid when previously removed\r\n     */\r\n    reset() {\r\n        let ezEditTable = this._ezEditTable;\r\n        if (ezEditTable) {\r\n            if (this.cfg.selection) {\r\n                /* eslint-disable */\r\n                ezEditTable.Selection.Set();\r\n                /* eslint-enable */\r\n            }\r\n            if (this.cfg.editable) {\r\n                /* eslint-disable */\r\n                ezEditTable.Editable.Set();\r\n                /* eslint-enable */\r\n            }\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Toggle behaviour\r\n     */\r\n    toggle() {\r\n        let ezEditTable = this._ezEditTable;\r\n        if (ezEditTable.editable) {\r\n            /* eslint-disable */\r\n            ezEditTable.Editable.Remove();\r\n            /* eslint-enable */\r\n        } else {\r\n            /* eslint-disable */\r\n            ezEditTable.Editable.Set();\r\n            /* eslint-enable */\r\n        }\r\n        if (ezEditTable.selection) {\r\n            /* eslint-disable */\r\n            ezEditTable.Selection.Remove();\r\n            /* eslint-enable */\r\n        } else {\r\n            /* eslint-disable */\r\n            ezEditTable.Selection.Set();\r\n            /* eslint-enable */\r\n        }\r\n    }\r\n\r\n    _toggleForInputFilter() {\r\n        let tf = this.tf;\r\n        if (!tf.getActiveFilterId()) {\r\n            return;\r\n        }\r\n        let colIndex = tf.getColumnIndexFromFilterId(tf.getActiveFilterId());\r\n        let filterType = tf.getFilterType(colIndex);\r\n        if (filterType === INPUT) {\r\n            this.toggle();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Remove advanced grid\r\n     */\r\n    destroy() {\r\n        if (!this.initialized) {\r\n            return;\r\n        }\r\n        let ezEditTable = this._ezEditTable;\r\n        if (ezEditTable) {\r\n            if (this.cfg.selection) {\r\n                /* eslint-disable */\r\n                ezEditTable.Selection.ClearSelections();\r\n                ezEditTable.Selection.Remove();\r\n                /* eslint-enable */\r\n            }\r\n            if (this.cfg.editable) {\r\n                /* eslint-disable */\r\n                ezEditTable.Editable.Remove();\r\n                /* eslint-enable */\r\n            }\r\n        }\r\n\r\n        this.emitter.off(['filter-focus', 'filter-blur'],\r\n            () => this._toggleForInputFilter());\r\n        this.initialized = false;\r\n    }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/advancedGrid/adapterEzEditTable.js","import {Feature} from '../../feature';\r\nimport {isUndef, isObj, EMPTY_FN} from '../../types';\r\nimport {createElm, elm, getText, tag} from '../../dom';\r\nimport {addEvt} from '../../event';\r\nimport {parse as parseNb} from '../../number';\r\nimport {\r\n    NONE, CELL_TAG, HEADER_TAG, STRING, NUMBER, DATE, FORMATTED_NUMBER,\r\n    IP_ADDRESS\r\n} from '../../const';\r\nimport {defaultsStr, defaultsFn, defaultsArr} from '../../settings';\r\n\r\n/**\r\n * SortableTable Adapter module\r\n */\r\nexport default class AdapterSortableTable extends Feature {\r\n\r\n    /**\r\n     * Creates an instance of AdapterSortableTable\r\n     * @param {TableFilter} tf TableFilter instance\r\n     * @param {Object} opts Configuration object\r\n     */\r\n    constructor(tf, opts) {\r\n        super(tf, opts.name);\r\n\r\n        /**\r\n         * Module name\r\n         * @type {String}\r\n         */\r\n        this.name = opts.name;\r\n\r\n        /**\r\n         * Module description\r\n         * @type {String}\r\n         */\r\n        this.desc = defaultsStr(opts.description, 'Sortable table');\r\n\r\n        /**\r\n         * Indicate whether table previously sorted\r\n         * @type {Boolean}\r\n         * @private\r\n         */\r\n        this.sorted = false;\r\n\r\n        /**\r\n         * List of sort type per column basis\r\n         * @type {Array}\r\n         */\r\n        this.sortTypes = defaultsArr(opts.types, tf.colTypes);\r\n\r\n        /**\r\n         * Column to be sorted at initialization, ie:\r\n         * sort_col_at_start: [1, true]\r\n         * @type {Array}\r\n         */\r\n        this.sortColAtStart = defaultsArr(opts.sort_col_at_start, null);\r\n\r\n        /**\r\n         * Enable asynchronous sort, if triggers are external\r\n         * @type {Boolean}\r\n         */\r\n        this.asyncSort = Boolean(opts.async_sort);\r\n\r\n        /**\r\n         * List of element IDs triggering sort on a per column basis\r\n         * @type {Array}\r\n         */\r\n        this.triggerIds = defaultsArr(opts.trigger_ids, []);\r\n\r\n        // edit .sort-arrow.descending / .sort-arrow.ascending in\r\n        // tablefilter.css to reflect any path change\r\n        /**\r\n         * Path to images\r\n         * @type {String}\r\n         */\r\n        this.imgPath = defaultsStr(opts.images_path, tf.themesPath);\r\n\r\n        /**\r\n         * Blank image file name\r\n         * @type {String}\r\n         */\r\n        this.imgBlank = defaultsStr(opts.image_blank, 'blank.png');\r\n\r\n        /**\r\n         * Css class for sort indicator image\r\n         * @type {String}\r\n         */\r\n        this.imgClassName = defaultsStr(opts.image_class_name, 'sort-arrow');\r\n\r\n        /**\r\n         * Css class for ascending sort indicator image\r\n         * @type {String}\r\n         */\r\n        this.imgAscClassName = defaultsStr(opts.image_asc_class_name,\r\n            'ascending');\r\n\r\n        /**\r\n         * Css class for descending sort indicator image\r\n         * @type {String}\r\n         */\r\n        this.imgDescClassName = defaultsStr(opts.image_desc_class_name,\r\n            'descending');\r\n\r\n        /**\r\n         * Cell attribute key storing custom value used for sorting\r\n         * @type {String}\r\n         */\r\n        this.customKey = defaultsStr(opts.custom_key, 'data-tf-sortKey');\r\n\r\n        /**\r\n         * Callback fired when sort extension is instanciated\r\n         * @type {Function}\r\n         */\r\n        this.onSortLoaded = defaultsFn(opts.on_sort_loaded, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired before a table column is sorted\r\n         * @type {Function}\r\n         */\r\n        this.onBeforeSort = defaultsFn(opts.on_before_sort, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired after a table column is sorted\r\n         * @type {Function}\r\n         */\r\n        this.onAfterSort = defaultsFn(opts.on_after_sort, EMPTY_FN);\r\n\r\n        /**\r\n         * SortableTable instance\r\n         * @private\r\n         */\r\n        this.stt = null;\r\n\r\n        this.enable();\r\n    }\r\n\r\n    /**\r\n     * Initializes AdapterSortableTable instance\r\n     */\r\n    init() {\r\n        if (this.initialized) {\r\n            return;\r\n        }\r\n        let tf = this.tf;\r\n        let adpt = this;\r\n\r\n        // SortableTable class sanity check (sortabletable.js)\r\n        if (isUndef(SortableTable)) {\r\n            throw new Error('SortableTable class not found.');\r\n        }\r\n\r\n        // Add any date format if needed\r\n        this.emitter.emit('add-date-type-formats', this.tf, this.sortTypes);\r\n\r\n        this.overrideSortableTable();\r\n        this.setSortTypes();\r\n\r\n        this.onSortLoaded(tf, this);\r\n\r\n        /*** SortableTable callbacks ***/\r\n        this.stt.onbeforesort = function () {\r\n            adpt.onBeforeSort(tf, adpt.stt.sortColumn);\r\n\r\n            /*** sort behaviour for paging ***/\r\n            if (tf.paging) {\r\n                tf.feature('paging').disable();\r\n            }\r\n        };\r\n\r\n        this.stt.onsort = function () {\r\n            adpt.sorted = true;\r\n\r\n            //sort behaviour for paging\r\n            if (tf.paging) {\r\n                let paginator = tf.feature('paging');\r\n                // recalculate valid rows index as sorting may have change it\r\n                tf.getValidRows(true);\r\n                paginator.enable();\r\n                paginator.setPage(paginator.getPage());\r\n            }\r\n\r\n            adpt.onAfterSort(tf, adpt.stt.sortColumn, adpt.stt.descending);\r\n            adpt.emitter.emit('column-sorted', tf, adpt.stt.sortColumn,\r\n                adpt.stt.descending);\r\n        };\r\n\r\n        // Column sort at start\r\n        let sortColAtStart = adpt.sortColAtStart;\r\n        if (sortColAtStart) {\r\n            this.stt.sort(sortColAtStart[0], sortColAtStart[1]);\r\n        }\r\n\r\n        this.emitter.on(['sort'],\r\n            (tf, colIdx, desc) => this.sortByColumnIndex(colIdx, desc));\r\n\r\n        /** @inherited */\r\n        this.initialized = true;\r\n\r\n        this.emitter.emit('sort-initialized', tf, this);\r\n    }\r\n\r\n    /**\r\n     * Sort specified column\r\n     * @param {Number} colIdx Column index\r\n     * @param {Boolean} desc Optional: descending manner\r\n     */\r\n    sortByColumnIndex(colIdx, desc) {\r\n        this.stt.sort(colIdx, desc);\r\n    }\r\n\r\n    /**\r\n     * Set SortableTable overrides for TableFilter integration\r\n     */\r\n    overrideSortableTable() {\r\n        let adpt = this,\r\n            tf = this.tf;\r\n\r\n        /**\r\n         * Overrides headerOnclick method in order to handle th event\r\n         * @param  {Object} e [description]\r\n         */\r\n        SortableTable.prototype.headerOnclick = function (evt) {\r\n            if (!adpt.initialized) {\r\n                return;\r\n            }\r\n\r\n            // find Header element\r\n            let el = evt.target || evt.srcElement;\r\n\r\n            while (el.tagName !== CELL_TAG && el.tagName !== HEADER_TAG) {\r\n                el = el.parentNode;\r\n            }\r\n\r\n            this.sort(\r\n                SortableTable.msie ?\r\n                    SortableTable.getCellIndex(el) : el.cellIndex\r\n            );\r\n        };\r\n\r\n        /**\r\n         * Overrides getCellIndex IE returns wrong cellIndex when columns are\r\n         * hidden\r\n         * @param  {Object} oTd TD element\r\n         * @return {Number}     Cell index\r\n         */\r\n        SortableTable.getCellIndex = function (oTd) {\r\n            let cells = oTd.parentNode.cells,\r\n                l = cells.length, i;\r\n            for (i = 0; cells[i] !== oTd && i < l; i++) { }\r\n            return i;\r\n        };\r\n\r\n        /**\r\n         * Overrides initHeader in order to handle filters row position\r\n         * @param  {Array} oSortTypes\r\n         */\r\n        SortableTable.prototype.initHeader = function (oSortTypes) {\r\n            let stt = this;\r\n            if (!stt.tHead) {\r\n                if (tf.gridLayout) {\r\n                    stt.tHead = tf.feature('gridLayout').headTbl.tHead;\r\n                } else {\r\n                    return;\r\n                }\r\n            }\r\n\r\n            stt.headersRow = tf.headersRow;\r\n            let cells = stt.tHead.rows[stt.headersRow].cells;\r\n            stt.sortTypes = oSortTypes || [];\r\n            let l = cells.length;\r\n            let img, c;\r\n\r\n            for (let i = 0; i < l; i++) {\r\n                c = cells[i];\r\n                if (stt.sortTypes[i] !== null && stt.sortTypes[i] !== 'None') {\r\n                    c.style.cursor = 'pointer';\r\n                    img = createElm('img',\r\n                        ['src', adpt.imgPath + adpt.imgBlank]);\r\n                    c.appendChild(img);\r\n                    if (stt.sortTypes[i] !== null) {\r\n                        c.setAttribute('_sortType', stt.sortTypes[i]);\r\n                    }\r\n                    addEvt(c, 'click', stt._headerOnclick);\r\n                } else {\r\n                    c.setAttribute('_sortType', oSortTypes[i]);\r\n                    c._sortType = 'None';\r\n                }\r\n            }\r\n            stt.updateHeaderArrows();\r\n        };\r\n\r\n        /**\r\n         * Overrides updateHeaderArrows in order to handle arrows indicators\r\n         */\r\n        SortableTable.prototype.updateHeaderArrows = function () {\r\n            let stt = this;\r\n            let cells, l, img;\r\n\r\n            // external headers\r\n            if (adpt.asyncSort && adpt.triggerIds.length > 0) {\r\n                let triggers = adpt.triggerIds;\r\n                cells = [];\r\n                l = triggers.length;\r\n                for (let j = 0; j < l; j++) {\r\n                    cells.push(elm(triggers[j]));\r\n                }\r\n            } else {\r\n                if (!this.tHead) {\r\n                    return;\r\n                }\r\n                cells = stt.tHead.rows[stt.headersRow].cells;\r\n                l = cells.length;\r\n            }\r\n            for (let i = 0; i < l; i++) {\r\n                let cell = cells[i];\r\n                if (!cell) {\r\n                    continue;\r\n                }\r\n                let cellAttr = cell.getAttribute('_sortType');\r\n                if (cellAttr !== null && cellAttr !== 'None') {\r\n                    img = cell.lastChild || cell;\r\n                    if (img.nodeName.toLowerCase() !== 'img') {\r\n                        img = createElm('img',\r\n                            ['src', adpt.imgPath + adpt.imgBlank]);\r\n                        cell.appendChild(img);\r\n                    }\r\n                    if (i === stt.sortColumn) {\r\n                        img.className = adpt.imgClassName + ' ' +\r\n                            (this.descending ?\r\n                                adpt.imgDescClassName :\r\n                                adpt.imgAscClassName);\r\n                    } else {\r\n                        img.className = adpt.imgClassName;\r\n                    }\r\n                }\r\n            }\r\n        };\r\n\r\n        /**\r\n         * Overrides getRowValue for custom key value feature\r\n         * @param  {Object} oRow    Row element\r\n         * @param  {String} sType\r\n         * @param  {Number} nColumn\r\n         * @return {String}\r\n         */\r\n        SortableTable.prototype.getRowValue = function (oRow, sType, nColumn) {\r\n            let stt = this;\r\n            // if we have defined a custom getRowValue use that\r\n            let sortTypeInfo = stt._sortTypeInfo[sType];\r\n            if (sortTypeInfo && sortTypeInfo.getRowValue) {\r\n                return sortTypeInfo.getRowValue(oRow, nColumn);\r\n            }\r\n            let c = oRow.cells[nColumn];\r\n            let s = SortableTable.getInnerText(c);\r\n            return stt.getValueFromString(s, sType);\r\n        };\r\n\r\n        /**\r\n         * Overrides getInnerText in order to avoid Firefox unexpected sorting\r\n         * behaviour with untrimmed text elements\r\n         * @param  {Object} oNode DOM element\r\n         * @return {String}       DOM element inner text\r\n         */\r\n        SortableTable.getInnerText = function (oNode) {\r\n            if (!oNode) {\r\n                return;\r\n            }\r\n            if (oNode.getAttribute(adpt.customKey)) {\r\n                return oNode.getAttribute(adpt.customKey);\r\n            } else {\r\n                return getText(oNode);\r\n            }\r\n        };\r\n    }\r\n\r\n    /**\r\n     * Adds a sort type\r\n     */\r\n    addSortType(...args) {\r\n        // Extract the arguments\r\n        let [id, caster, sorter] = args;\r\n        SortableTable.prototype.addSortType(id, caster, sorter);\r\n    }\r\n\r\n    /**\r\n     * Sets the sort types on a column basis\r\n     * @private\r\n     */\r\n    setSortTypes() {\r\n        let tf = this.tf,\r\n            sortTypes = this.sortTypes,\r\n            _sortTypes = [];\r\n\r\n        tf.eachCol((i) => {\r\n            let colType;\r\n            if (sortTypes[i]) {\r\n                colType = sortTypes[i];\r\n                if (isObj(colType)) {\r\n                    if (colType.type === DATE) {\r\n                        colType = this._addDateType(i, sortTypes);\r\n                    }\r\n                    else if (colType.type === FORMATTED_NUMBER) {\r\n                        let decimal = colType.decimal || tf.decimalSeparator;\r\n                        colType = this._addNumberType(i, decimal);\r\n                    }\r\n                } else {\r\n                    colType = colType.toLowerCase();\r\n                    if (colType === DATE) {\r\n                        colType = this._addDateType(i, sortTypes);\r\n                    }\r\n                    else if (colType === FORMATTED_NUMBER ||\r\n                        colType === NUMBER) {\r\n                        colType = this._addNumberType(i, tf.decimalSeparator);\r\n                    }\r\n                    else if (colType === NONE) {\r\n                        // TODO: normalise 'none' vs 'None'\r\n                        colType = 'None';\r\n                    }\r\n                }\r\n            } else {\r\n                colType = STRING;\r\n            }\r\n            _sortTypes.push(colType);\r\n        });\r\n\r\n        //Public TF method to add sort type\r\n\r\n        //Custom sort types\r\n        this.addSortType('caseinsensitivestring', SortableTable.toUpperCase);\r\n        this.addSortType(STRING);\r\n        this.addSortType(IP_ADDRESS, ipAddress, sortIP);\r\n\r\n        this.stt = new SortableTable(tf.dom(), _sortTypes);\r\n\r\n        /*** external table headers adapter ***/\r\n        if (this.asyncSort && this.triggerIds.length > 0) {\r\n            let triggers = this.triggerIds;\r\n            for (let j = 0; j < triggers.length; j++) {\r\n                if (triggers[j] === null) {\r\n                    continue;\r\n                }\r\n                let trigger = elm(triggers[j]);\r\n                if (trigger) {\r\n                    trigger.style.cursor = 'pointer';\r\n\r\n                    addEvt(trigger, 'click', (evt) => {\r\n                        let elm = evt.target;\r\n                        if (!this.tf.sort) {\r\n                            return;\r\n                        }\r\n                        this.stt.asyncSort(triggers.indexOf(elm.id));\r\n                    });\r\n                    trigger.setAttribute('_sortType', _sortTypes[j]);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    _addDateType(colIndex, types) {\r\n        let tf = this.tf;\r\n        let dateType = tf.feature('dateType');\r\n        let locale = dateType.getOptions(colIndex, types).locale || tf.locale;\r\n        let colType = `${DATE}-${locale}`;\r\n\r\n        this.addSortType(colType, (value) => {\r\n            let parsedDate = dateType.parse(value, locale);\r\n            // Invalid date defaults to Wed Feb 04 -768 11:00:00\r\n            return isNaN(+parsedDate) ? new Date(-86400000000000) : parsedDate;\r\n        });\r\n        return colType;\r\n    }\r\n\r\n    _addNumberType(colIndex, decimal) {\r\n        let colType = `${FORMATTED_NUMBER}${decimal === '.' ? '' : '-custom'}`;\r\n\r\n        this.addSortType(colType, (value) => {\r\n            return parseNb(value, decimal);\r\n        });\r\n        return colType;\r\n    }\r\n\r\n    /**\r\n     * Remove extension\r\n     */\r\n    destroy() {\r\n        if (!this.initialized) {\r\n            return;\r\n        }\r\n        let tf = this.tf;\r\n        this.emitter.off(['sort'],\r\n            (tf, colIdx, desc) => this.sortByColumnIndex(colIdx, desc));\r\n        this.sorted = false;\r\n        this.stt.destroy();\r\n\r\n        let ids = tf.getFiltersId();\r\n        for (let idx = 0; idx < ids.length; idx++) {\r\n            let header = tf.getHeaderElement(idx);\r\n            let img = tag(header, 'img');\r\n\r\n            if (img.length === 1) {\r\n                header.removeChild(img[0]);\r\n            }\r\n        }\r\n        this.initialized = false;\r\n    }\r\n\r\n}\r\n\r\n//Converters\r\nfunction ipAddress(value) {\r\n    let vals = value.split('.');\r\n    for (let x in vals) {\r\n        let val = vals[x];\r\n        while (3 > val.length) {\r\n            val = '0' + val;\r\n        }\r\n        vals[x] = val;\r\n    }\r\n    return vals.join('.');\r\n}\r\n\r\nfunction sortIP(a, b) {\r\n    let aa = ipAddress(a.value.toLowerCase());\r\n    let bb = ipAddress(b.value.toLowerCase());\r\n    if (aa === bb) {\r\n        return 0;\r\n    } else if (aa < bb) {\r\n        return -1;\r\n    } else {\r\n        return 1;\r\n    }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/sort/adapterSortabletable.js","import AdapterEzEditTable from './adapterEzEditTable';\r\n\r\nexport default AdapterEzEditTable;\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/advancedGrid/advancedGrid.js","import {Feature} from '../../feature';\r\nimport {createText, elm} from '../../dom';\r\nimport {isArray, isEmpty, EMPTY_FN} from '../../types';\r\nimport {numSortAsc} from '../../sort';\r\nimport {FORMATTED_NUMBER} from '../../const';\r\nimport formatNumber from 'format-number';\r\nimport {defaultsFn, defaultsArr} from '../../settings';\r\n\r\nconst EVENTS = [\r\n    'after-filtering',\r\n    'after-page-change',\r\n    'after-page-length-change'\r\n];\r\n\r\nconst SUM = 'sum';\r\nconst MEAN = 'mean';\r\nconst MIN = 'min';\r\nconst MAX = 'max';\r\nconst MEDIAN = 'median';\r\nconst Q1 = 'q1';\r\nconst Q3 = 'q3';\r\n\r\n/**\r\n * Column calculations extension\r\n */\r\nexport default class ColOps extends Feature {\r\n\r\n    /**\r\n     * Creates an instance of ColOps\r\n     *\r\n     * @param {TableFilter} tf TableFilter instance\r\n     * @param {Object} opts Configuration object\r\n     */\r\n    constructor(tf, opts) {\r\n        super(tf, opts.name);\r\n\r\n        /**\r\n         * Callback fired before columns operations start\r\n         * @type {Function}\r\n         */\r\n        this.onBeforeOperation = defaultsFn(opts.on_before_operation, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired after columns operations are completed\r\n         * @type {Function}\r\n         */\r\n        this.onAfterOperation = defaultsFn(opts.on_after_operation, EMPTY_FN);\r\n\r\n        /**\r\n         * Configuration options\r\n         * @type {Object}\r\n         */\r\n        this.opts = opts;\r\n\r\n        /**\r\n         * List of DOM element IDs containing column's calculation result\r\n         * @type {Array}\r\n         */\r\n        this.labelIds = defaultsArr(opts.id, []);\r\n\r\n        /**\r\n         * List of columns' indexes for calculations\r\n         * @type {Array}\r\n         */\r\n        this.colIndexes = defaultsArr(opts.col, []);\r\n\r\n        /**\r\n         * List of operations - possible values: 'sum', 'mean', 'min', 'max',\r\n         * 'median', 'q1', 'q3'\r\n         * @type {Array}\r\n         */\r\n        this.operations = defaultsArr(opts.operation, []);\r\n\r\n        /**\r\n         * List of write methods used to write the result - possible values:\r\n         * 'innerHTML', 'setValue', 'createTextNode'\r\n         * @type {Array}\r\n         */\r\n        this.outputTypes = defaultsArr(opts.write_method, []);\r\n\r\n        /**\r\n         * List of format objects used for formatting the result -\r\n         * refer to https://github.com/componitable/format-number to check\r\n         * configuration options\r\n         * @type {Array}\r\n         */\r\n        this.formatResults = defaultsArr(opts.format_result, []);\r\n\r\n        /**\r\n         * List of row indexes displaying the results\r\n         * @type {Array}\r\n         */\r\n        this.totRowIndexes = defaultsArr(opts.tot_row_index, []);\r\n\r\n        /**\r\n         * List of row indexes excluded from calculations\r\n         * @type {Array}\r\n         */\r\n        this.excludeRows = defaultsArr(opts.exclude_row, []);\r\n\r\n        /**\r\n         * List of decimal precision for calculation results\r\n         * @type {Array}\r\n         */\r\n        this.decimalPrecisions = defaultsArr(opts.decimal_precision, 2);\r\n\r\n        this.enable();\r\n    }\r\n\r\n    /**\r\n     * Initializes ColOps instance\r\n     */\r\n    init() {\r\n        if (this.initialized) {\r\n            return;\r\n        }\r\n        // subscribe to events\r\n        this.emitter.on(EVENTS, () => this.calcAll());\r\n\r\n        this.calcAll();\r\n\r\n        /** @inherited */\r\n        this.initialized = true;\r\n    }\r\n\r\n    /**\r\n     * Calculates columns' values\r\n     * Configuration options are stored in 'opts' property\r\n     * - 'id' contains ids of elements showing result (array)\r\n     * - 'col' contains the columns' indexes (array)\r\n     * - 'operation' contains operation type (array, values: 'sum', 'mean',\r\n     *   'min', 'max', 'median', 'q1', 'q3')\r\n     * - 'write_method' array defines which method to use for displaying the\r\n     *    result (innerHTML, setValue, createTextNode) - default: 'innerHTML'\r\n     * - 'tot_row_index' defines in which row results are displayed\r\n     *   (integers array)\r\n     *\r\n     * - changes made by Nuovella:\r\n     * (1) optimized the routine (now it will only process each column once),\r\n     * (2) added calculations for the median, lower and upper quartile.\r\n     */\r\n    calcAll() {\r\n        let tf = this.tf;\r\n        if (!tf.isInitialized()) {\r\n            return;\r\n        }\r\n\r\n        this.onBeforeOperation(tf, this);\r\n        this.emitter.emit('before-column-operation', tf, this);\r\n\r\n        let { colIndexes, operations: colOperations, outputTypes,\r\n            totRowIndexes, excludeRows, formatResults,\r\n            decimalPrecisions } = this;\r\n\r\n        //nuovella: determine unique list of columns to operate on\r\n        let uIndexes = [];\r\n        colIndexes.forEach((val) => {\r\n            if (uIndexes.indexOf(val) === -1) {\r\n                uIndexes.push(val);\r\n            }\r\n        });\r\n\r\n        let nbCols = uIndexes.length,\r\n            rows = tf.dom().rows,\r\n            colValues = [];\r\n\r\n        for (let u = 0; u < nbCols; u++) {\r\n            //this retrieves col values\r\n            //use uIndexes because we only want to pass through this loop\r\n            //once for each column get the values in this unique column\r\n            colValues.push(\r\n                tf.getVisibleColumnData(uIndexes[u], false, excludeRows)\r\n            );\r\n\r\n            let curValues = colValues[u];\r\n\r\n            //next: calculate all operations for this column\r\n            let result = 0,\r\n                operations = [],\r\n                precisions = [],\r\n                labels = [],\r\n                writeType,\r\n                formatResult = [],\r\n                idx = 0;\r\n\r\n            for (let k = 0; k < colIndexes.length; k++) {\r\n                if (colIndexes[k] !== uIndexes[u]) {\r\n                    continue;\r\n                }\r\n                operations[idx] = (colOperations[k] || 'sum').toLowerCase();\r\n                precisions[idx] = decimalPrecisions[k];\r\n                labels[idx] = this.labelIds[k];\r\n                writeType = isArray(outputTypes) ? outputTypes[k] : null;\r\n                formatResult[idx] =\r\n                    this.configureFormat(uIndexes[u], formatResults[k]);\r\n                idx++;\r\n            }\r\n\r\n            for (let i = 0; i < idx; i++) {\r\n                // emit values before column calculation\r\n                this.emitter.emit(\r\n                    'before-column-calc',\r\n                    tf,\r\n                    this,\r\n                    uIndexes[u],\r\n                    curValues,\r\n                    operations[i],\r\n                    precisions[i]\r\n                );\r\n\r\n                result = Number(this.calc(curValues, operations[i], null));\r\n\r\n                // emit column calculation result\r\n                this.emitter.emit(\r\n                    'column-calc',\r\n                    tf,\r\n                    this,\r\n                    uIndexes[u],\r\n                    result,\r\n                    operations[i],\r\n                    precisions[i]\r\n                );\r\n\r\n                // write result in expected DOM element\r\n                this.writeResult(\r\n                    result,\r\n                    labels[i],\r\n                    writeType,\r\n                    precisions[i],\r\n                    formatResult[i]\r\n                );\r\n\r\n            }//for i\r\n\r\n            // row(s) with result are always visible\r\n            let totRow = totRowIndexes && totRowIndexes[u] ?\r\n                rows[totRowIndexes[u]] : null;\r\n            if (totRow) {\r\n                totRow.style.display = '';\r\n            }\r\n        }//for u\r\n\r\n        this.onAfterOperation(tf, this);\r\n        this.emitter.emit('after-column-operation', tf, this);\r\n    }\r\n\r\n    /**\r\n     * Make desired calculation on specified column.\r\n     * @param {Number} colIndex Column index\r\n     * @param {String} [operation=SUM] Operation type\r\n     * @param {Number} precision Decimal precision\r\n     * @returns {Number}\r\n     */\r\n    columnCalc(colIndex, operation = SUM, precision) {\r\n        let excludeRows = this.excludeRows || [];\r\n        let colValues = tf.getVisibleColumnData(colIndex, false, excludeRows);\r\n\r\n        return Number(this.calc(colValues, operation, precision));\r\n    }\r\n\r\n    /**\r\n     * Make calculation on passed values.\r\n     * @param {Array} values List of values\r\n     * @param {String} [operation=SUM] Optional operation type\r\n     * @param {Number} precision Optional result precision\r\n     * @returns {Number}\r\n     * @private\r\n     */\r\n    calc(colValues, operation = SUM, precision) {\r\n        let result = 0;\r\n\r\n        if (operation === Q1 || operation === Q3 || operation === MEDIAN) {\r\n            colValues = this.sortColumnValues(colValues, numSortAsc);\r\n        }\r\n\r\n        switch (operation) {\r\n            case MEAN:\r\n                result = this.calcMean(colValues);\r\n                break;\r\n            case SUM:\r\n                result = this.calcSum(colValues);\r\n                break;\r\n            case MIN:\r\n                result = this.calcMin(colValues);\r\n                break;\r\n            case MAX:\r\n                result = this.calcMax(colValues);\r\n                break;\r\n            case MEDIAN:\r\n                result = this.calcMedian(colValues);\r\n                break;\r\n            case Q1:\r\n                result = this.calcQ1(colValues);\r\n                break;\r\n            case Q3:\r\n                result = this.calcQ3(colValues);\r\n                break;\r\n        }\r\n\r\n        return isEmpty(precision) ? result : result.toFixed(precision);\r\n    }\r\n\r\n    /**\r\n     * Calculate the sum of passed values.\r\n     * @param {Array} [values=[]] List of values\r\n     * @returns {Number}\r\n     */\r\n    calcSum(values = []) {\r\n        if (isEmpty(values)) {\r\n            return 0;\r\n        }\r\n        let result = values.reduce((x, y) => Number(x) + Number(y));\r\n        return result;\r\n    }\r\n\r\n    /**\r\n     * Calculate the mean of passed values.\r\n     * @param {Array} [values=[]] List of values\r\n     * @returns {Number}\r\n     */\r\n    calcMean(values = []) {\r\n        let result = this.calcSum(values) / values.length;\r\n        return Number(result);\r\n    }\r\n\r\n    /**\r\n     * Calculate the max value of passed values.\r\n     * @param {Array} [values=[]] List of values\r\n     * @returns {Number}\r\n     */\r\n    calcMax(values = []) {\r\n        return Math.max.apply(null, values);\r\n    }\r\n\r\n    /**\r\n     * Calculate the min value of passed values.\r\n     * @param {Array} [values=[]] List of values\r\n     * @returns {Number}\r\n     */\r\n    calcMin(values = []) {\r\n        return Math.min.apply(null, values);\r\n    }\r\n\r\n    /**\r\n     * Calculate the median of passed values.\r\n     * @param {Array} [values=[]] List of values\r\n     * @returns {Number}\r\n     */\r\n    calcMedian(values = []) {\r\n        let nbValues = values.length;\r\n        let aux = 0;\r\n        if (nbValues % 2 === 1) {\r\n            aux = Math.floor(nbValues / 2);\r\n            return Number(values[aux]);\r\n        }\r\n        return (Number(values[nbValues / 2]) +\r\n            Number(values[((nbValues / 2) - 1)])) / 2;\r\n    }\r\n\r\n    /**\r\n     * Calculate the lower quartile of passed values.\r\n     * @param {Array} [values=[]] List of values\r\n     * @returns {Number}\r\n     */\r\n    calcQ1(values = []) {\r\n        let nbValues = values.length;\r\n        let posa = 0.0;\r\n        posa = Math.floor(nbValues / 4);\r\n        if (4 * posa === nbValues) {\r\n            return (Number(values[posa - 1]) +\r\n                Number(values[posa])) / 2;\r\n        }\r\n        return Number(values[posa]);\r\n    }\r\n\r\n    /**\r\n     * Calculate the upper quartile of passed values.\r\n     * @param {Array} [values=[]] List of values\r\n     * @returns {Number}\r\n     */\r\n    calcQ3(values = []) {\r\n        let nbValues = values.length;\r\n        let posa = 0.0;\r\n        let posb = 0.0;\r\n        posa = Math.floor(nbValues / 4);\r\n        if (4 * posa === nbValues) {\r\n            posb = 3 * posa;\r\n            return (Number(values[posb]) +\r\n                Number(values[posb - 1])) / 2;\r\n        }\r\n        return Number(values[nbValues - posa - 1]);\r\n    }\r\n\r\n    /**\r\n     * Sort passed values with supplied sorter function.\r\n     * @param {Array} [values=[]] List of values to be sorted\r\n     * @param {Function} sorter Sorter function\r\n     * @returns {Array}\r\n     */\r\n    sortColumnValues(values = [], sorter) {\r\n        return values.sort(sorter);\r\n    }\r\n\r\n    /**\r\n     * Write calculation result in passed DOM element with supplied write method\r\n     * and decimal precision.\r\n     * @param {Number} [result=0] Calculation result\r\n     * @param {DOMElement} label DOM element\r\n     * @param {String} [writeType='innerhtml'] Write method\r\n     * @param {Number} [precision=2] Applied decimal precision\r\n     * @private\r\n     */\r\n    writeResult(result = 0, label, writeType = 'innerhtml',\r\n        precision = 2, format = {}) {\r\n        let labelElm = elm(label);\r\n\r\n        if (!labelElm) {\r\n            return;\r\n        }\r\n\r\n        result = result.toFixed(precision);\r\n        if (isNaN(result) || !isFinite(result)) {\r\n            result = '';\r\n        } else {\r\n            result = formatNumber(format)(result);\r\n        }\r\n\r\n        switch (writeType.toLowerCase()) {\r\n            case 'innerhtml':\r\n                labelElm.innerHTML = result;\r\n                break;\r\n            case 'setvalue':\r\n                labelElm.value = result;\r\n                break;\r\n            case 'createtextnode':\r\n                let oldNode = labelElm.firstChild;\r\n                let txtNode = createText(result);\r\n                labelElm.replaceChild(txtNode, oldNode);\r\n                break;\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Configure the format options used to format the operation result based\r\n     * on column type.\r\n     * @param {Number} colIndex Column index\r\n     * @param {Object} [format={}] Format object\r\n     * @returns {Object}\r\n     * @private\r\n     */\r\n    configureFormat(colIndex, format = {}) {\r\n        let tf = this.tf;\r\n        if (tf.hasType(colIndex, [FORMATTED_NUMBER])) {\r\n            let colType = tf.colTypes[colIndex];\r\n            if (colType.decimal && !format.decimal) {\r\n                format.decimal = colType.decimal;\r\n            }\r\n            if (colType.thousands && !format.integerSeparator) {\r\n                format.integerSeparator = colType.thousands;\r\n            }\r\n        } else {\r\n            format.decimal = format.decimal || '';\r\n            format.integerSeparator = format.integerSeparator || '';\r\n        }\r\n        return format;\r\n    }\r\n\r\n    /** Remove extension */\r\n    destroy() {\r\n        if (!this.initialized) {\r\n            return;\r\n        }\r\n        // unsubscribe to events\r\n        this.emitter.off(EVENTS, () => this.calcAll());\r\n\r\n        this.initialized = false;\r\n    }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/colOps/colOps.js","import {Feature} from '../../feature';\r\nimport {\r\n    addClass, removeClass, createCheckItem, createElm, elm, removeElm,\r\n    getText, tag\r\n} from '../../dom';\r\nimport {isUndef, EMPTY_FN, isNull} from '../../types';\r\nimport {addEvt, targetEvt, removeEvt} from '../../event';\r\nimport {root} from '../../root';\r\nimport {NONE} from '../../const';\r\nimport {\r\n    defaultsBool, defaultsStr, defaultsFn, defaultsNb, defaultsArr\r\n} from '../../settings';\r\nimport {RIGHT} from '../../modules/toolbar';\r\n\r\n/**\r\n * Columns Visibility extension\r\n */\r\nexport default class ColsVisibility extends Feature {\r\n\r\n    /**\r\n     * Creates an instance of ColsVisibility\r\n     * @param {TableFilter} tf TableFilter instance\r\n     * @param {Object} Configuration object\r\n     */\r\n    constructor(tf, f) {\r\n        super(tf, f.name);\r\n\r\n        // Configuration object\r\n        let cfg = this.config;\r\n\r\n        /**\r\n         * Module name\r\n         * @type {String}\r\n         */\r\n        this.name = f.name;\r\n\r\n        /**\r\n         * Module description\r\n         * @type {String}\r\n         */\r\n        this.desc = defaultsStr(f.description, 'Columns visibility manager');\r\n\r\n        /**\r\n         * show/hide columns container element\r\n         * @private\r\n         */\r\n        this.spanEl = null;\r\n\r\n        /**\r\n         * show/hide columns button element\r\n         * @private\r\n         */\r\n        this.btnEl = null;\r\n\r\n        /**\r\n         * show/hide columns main container element\r\n         * @private\r\n         */\r\n        this.contEl = null;\r\n\r\n        /**\r\n         * Enable tick to hide a column, defaults to true\r\n         * @type {Boolean}\r\n         */\r\n        this.tickToHide = defaultsBool(f.tick_to_hide, true);\r\n\r\n        /**\r\n         * Enable columns manager UI, defaults to true\r\n         * @type {Boolean}\r\n         */\r\n        this.manager = defaultsBool(f.manager, true);\r\n\r\n        /**\r\n         * Headers HTML table reference only if headers are external\r\n         * @type {DOMElement}\r\n         */\r\n        this.headersTbl = f.headers_table || null;\r\n\r\n        /**\r\n         * Headers row index only if headers are external\r\n         * @type {Number}\r\n         */\r\n        this.headersIndex = defaultsNb(f.headers_index, 1);\r\n\r\n        /**\r\n         * ID of main container element\r\n         * @type {String}\r\n         */\r\n        this.contElTgtId = defaultsStr(f.container_target_id, null);\r\n\r\n        /**\r\n         * Alternative text for column headers in column manager UI\r\n         * @type {Array}\r\n         */\r\n        this.headersText = defaultsArr(f.headers_text, []);\r\n\r\n        /**\r\n         * ID of button's container element\r\n         * @type {String}\r\n         */\r\n        this.btnTgtId = defaultsStr(f.btn_target_id, null);\r\n\r\n        /**\r\n         * Button's text, defaults to Columns▼\r\n         * @type {String}\r\n         */\r\n        this.btnText = defaultsStr(f.btn_text, 'Columns▼');\r\n\r\n        /**\r\n         * Button's inner HTML\r\n         * @type {String}\r\n         */\r\n        this.btnHtml = defaultsStr(f.btn_html, null);\r\n\r\n        /**\r\n         * Css class for button\r\n         * @type {String}\r\n         */\r\n        this.btnCssClass = defaultsStr(f.btn_css_class, 'colVis');\r\n\r\n        /**\r\n         * Columns manager UI close link text, defaults to 'Close'\r\n         * @type {String}\r\n         */\r\n        this.btnCloseText = defaultsStr(f.btn_close_text, 'Close');\r\n\r\n        /**\r\n         * Columns manager UI close link HTML\r\n         * @type {String}\r\n         */\r\n        this.btnCloseHtml = defaultsStr(f.btn_close_html, null);\r\n\r\n        /**\r\n         * Css for columns manager UI close link\r\n         * @type {String}\r\n         */\r\n        this.btnCloseCssClass = defaultsStr(f.btn_close_css_class,\r\n            this.btnCssClass);\r\n\r\n        /**\r\n         * Extension's stylesheet filename\r\n         * @type {String}\r\n         */\r\n        this.stylesheet = defaultsStr(f.stylesheet, 'colsVisibility.css');\r\n\r\n        /**\r\n         * Css for columns manager UI span\r\n         * @type {String}\r\n         */\r\n        this.spanCssClass = defaultsStr(f.span_css_class, 'colVisSpan');\r\n\r\n        /**\r\n         * Css for columns manager UI main container\r\n         * @type {String}\r\n         */\r\n        this.contCssClass = defaultsStr(f.cont_css_class, 'colVisCont');\r\n\r\n        /**\r\n         * Css for columns manager UI checklist (ul)\r\n         * @type {String}\r\n         */\r\n        this.listCssClass = defaultsStr(cfg.list_css_class, 'cols_checklist');\r\n\r\n        /**\r\n         * Css for columns manager UI checklist item (li)\r\n         * @type {String}\r\n         */\r\n        this.listItemCssClass = defaultsStr(cfg.checklist_item_css_class,\r\n            'cols_checklist_item');\r\n\r\n        /**\r\n         * Css for columns manager UI checklist item selected state (li)\r\n         * @type {String}\r\n         */\r\n        this.listSlcItemCssClass = defaultsStr(\r\n            cfg.checklist_selected_item_css_class,\r\n            'cols_checklist_slc_item'\r\n        );\r\n\r\n        /**\r\n         * Text preceding the columns list, defaults to 'Hide' or 'Show'\r\n         * depending on tick mode (tick_to_hide option)\r\n         * @type {String}\r\n         */\r\n        this.text = defaultsStr(f.text, this.tickToHide ? 'Hide: ' : 'Show: ');\r\n\r\n        /**\r\n         * List of columns indexes to be hidden at initialization\r\n         * @type {Array}\r\n         */\r\n        this.atStart = defaultsArr(f.at_start, []);\r\n\r\n        /**\r\n         * Enable hover behaviour on columns manager button/link\r\n         * @type {Boolean}\r\n         */\r\n        this.enableHover = Boolean(f.enable_hover);\r\n\r\n        /**\r\n         * Enable select all option, disabled by default\r\n         * @type {Boolean}\r\n         */\r\n        this.enableTickAll = Boolean(f.enable_tick_all);\r\n\r\n        /**\r\n         * Text for select all option, defaults to 'Select all:'\r\n         * @type {String}\r\n         */\r\n        this.tickAllText = defaultsStr(f.tick_all_text, 'Select all:');\r\n\r\n        /**\r\n         * Default position in toolbar ('left'|'center'|'right')\r\n         * @type {String}\r\n         */\r\n        this.toolbarPosition = defaultsStr(f.toolbar_position, RIGHT);\r\n\r\n        /**\r\n         * List of indexes of hidden columns\r\n         * @private\r\n         */\r\n        this.hiddenCols = [];\r\n\r\n        /**\r\n         * Bound mouseup wrapper\r\n         * @private\r\n         */\r\n        this.boundMouseup = null;\r\n\r\n        /**\r\n         * Callback fired when the extension is initialized\r\n         * @type {Function}\r\n         */\r\n        this.onLoaded = defaultsFn(f.on_loaded, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired before the columns manager is opened\r\n         * @type {Function}\r\n         */\r\n        this.onBeforeOpen = defaultsFn(f.on_before_open, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired after the columns manager is opened\r\n         * @type {Function}\r\n         */\r\n        this.onAfterOpen = defaultsFn(f.on_after_open, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired before the columns manager is closed\r\n         * @type {Function}\r\n         */\r\n        this.onBeforeClose = defaultsFn(f.on_before_close, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired after the columns manager is closed\r\n         * @type {Function}\r\n         */\r\n        this.onAfterClose = defaultsFn(f.on_after_close, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired before a column is hidden\r\n         * @type {Function}\r\n         */\r\n        this.onBeforeColHidden = defaultsFn(f.on_before_col_hidden, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired after a column is hidden\r\n         * @type {Function}\r\n         */\r\n        this.onAfterColHidden = defaultsFn(f.on_after_col_hidden, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired before a column is displayed\r\n         * @type {Function}\r\n         */\r\n        this.onBeforeColDisplayed = defaultsFn(f.on_before_col_displayed,\r\n            EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired after a column is displayed\r\n         * @type {Function}\r\n         */\r\n        this.onAfterColDisplayed = defaultsFn(f.on_after_col_displayed,\r\n            EMPTY_FN);\r\n\r\n        //Grid layout support\r\n        if (tf.gridLayout) {\r\n            this.headersTbl = tf.feature('gridLayout').headTbl; //headers table\r\n            this.headersIndex = 0; //headers index\r\n        }\r\n\r\n        //Loads extension stylesheet\r\n        tf.import(f.name + 'Style', tf.getStylePath() + this.stylesheet, null,\r\n            'link');\r\n\r\n        this.enable();\r\n    }\r\n\r\n    /**\r\n     * Mouse-up event handler handling popup auto-close behaviour\r\n     * @private\r\n     */\r\n    onMouseup(evt) {\r\n        let targetElm = targetEvt(evt);\r\n\r\n        while (targetElm && targetElm !== this.contEl\r\n            && targetElm !== this.btnEl) {\r\n            targetElm = targetElm.parentNode;\r\n        }\r\n\r\n        if (targetElm !== this.contEl && targetElm !== this.btnEl) {\r\n            this.toggle();\r\n        }\r\n\r\n        return;\r\n    }\r\n\r\n    /**\r\n     * Toggle columns manager UI\r\n     */\r\n    toggle() {\r\n        // ensure mouseup event handler is removed\r\n        removeEvt(root, 'mouseup', this.boundMouseup);\r\n\r\n        let contDisplay = this.contEl.style.display;\r\n\r\n        if (contDisplay !== 'inline') {\r\n            this.onBeforeOpen(this);\r\n        }\r\n        if (contDisplay === 'inline') {\r\n            this.onBeforeClose(this);\r\n        }\r\n\r\n        this.contEl.style.display = contDisplay === 'inline' ?\r\n            NONE : 'inline';\r\n\r\n        if (contDisplay !== 'inline') {\r\n            this.onAfterOpen(this);\r\n            addEvt(root, 'mouseup', this.boundMouseup);\r\n        }\r\n        if (contDisplay === 'inline') {\r\n            this.onAfterClose(this);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Check an item in columns manager UI\r\n     * @private\r\n     */\r\n    checkItem(lbl) {\r\n        let li = lbl.parentNode;\r\n        if (!li || !lbl) {\r\n            return;\r\n        }\r\n        let isChecked = lbl.firstChild.checked;\r\n        let colIndex = lbl.firstChild.getAttribute('id').split('_')[1];\r\n        colIndex = parseInt(colIndex, 10);\r\n        if (isChecked) {\r\n            addClass(li, this.listSlcItemCssClass);\r\n        } else {\r\n            removeClass(li, this.listSlcItemCssClass);\r\n        }\r\n\r\n        let hide = false;\r\n        if ((this.tickToHide && isChecked) ||\r\n            (!this.tickToHide && !isChecked)) {\r\n            hide = true;\r\n        }\r\n        this.setHidden(colIndex, hide);\r\n    }\r\n\r\n    /**\r\n     * Initializes ColsVisibility instance\r\n     */\r\n    init() {\r\n        if (this.initialized || !this.manager) {\r\n            return;\r\n        }\r\n\r\n        this.emitter.emit('initializing-extension', this,\r\n            !isNull(this.btnTgtId));\r\n\r\n        this.emitter.on(['hide-column'],\r\n            (tf, colIndex) => this.hideCol(colIndex));\r\n\r\n        this.buildBtn();\r\n        this.buildManager();\r\n\r\n        /** @inherited */\r\n        this.initialized = true;\r\n\r\n        this.boundMouseup = this.onMouseup.bind(this);\r\n\r\n        this.emitter.emit('columns-visibility-initialized', this.tf, this);\r\n        this.emitter.emit('extension-initialized', this);\r\n\r\n        // Hide columns at start at very end of initialization, do not move\r\n        // as order is important\r\n        this._hideAtStart();\r\n    }\r\n\r\n    /**\r\n     * Build main button UI\r\n     */\r\n    buildBtn() {\r\n        if (this.btnEl) {\r\n            return;\r\n        }\r\n        let tf = this.tf;\r\n        let span = createElm('span');\r\n        span.className = this.spanCssClass;\r\n\r\n        // Container element (rdiv or custom element)\r\n        let targetEl = !this.btnTgtId ?\r\n            tf.feature('toolbar').container(this.toolbarPosition) :\r\n            elm(this.btnTgtId);\r\n\r\n        if (!this.btnTgtId) {\r\n            let firstChild = targetEl.firstChild;\r\n            firstChild.parentNode.insertBefore(span, firstChild);\r\n        } else {\r\n            targetEl.appendChild(span);\r\n        }\r\n\r\n        if (!this.btnHtml) {\r\n            let btn = createElm('a', ['href', 'javascript:;']);\r\n            btn.className = this.btnCssClass;\r\n            btn.title = this.desc;\r\n\r\n            btn.innerHTML = this.btnText;\r\n            span.appendChild(btn);\r\n            if (!this.enableHover) {\r\n                addEvt(btn, 'click', (evt) => this.toggle(evt));\r\n            } else {\r\n                addEvt(btn, 'mouseover', (evt) => this.toggle(evt));\r\n            }\r\n        } else { // Custom html\r\n            span.innerHTML = this.btnHtml;\r\n            let colVisEl = span.firstChild;\r\n            if (!this.enableHover) {\r\n                addEvt(colVisEl, 'click', (evt) => this.toggle(evt));\r\n            } else {\r\n                addEvt(colVisEl, 'mouseover', (evt) => this.toggle(evt));\r\n            }\r\n        }\r\n\r\n        this.spanEl = span;\r\n        this.btnEl = this.spanEl.firstChild;\r\n\r\n        this.onLoaded(this);\r\n    }\r\n\r\n    /**\r\n     * Build columns manager UI\r\n     */\r\n    buildManager() {\r\n        let tf = this.tf;\r\n\r\n        let container = !this.contElTgtId ?\r\n            createElm('div') :\r\n            elm(this.contElTgtId);\r\n        container.className = this.contCssClass;\r\n\r\n        //Extension description\r\n        let extNameLabel = createElm('p');\r\n        extNameLabel.innerHTML = this.text;\r\n        container.appendChild(extNameLabel);\r\n\r\n        //Headers list\r\n        let ul = createElm('ul');\r\n        ul.className = this.listCssClass;\r\n\r\n        let tbl = this.headersTbl || tf.dom();\r\n        let headerIndex = this.headersTbl ?\r\n            this.headersIndex : tf.getHeadersRowIndex();\r\n        let headerRow = tbl.rows[headerIndex];\r\n\r\n        //Tick all option\r\n        if (this.enableTickAll) {\r\n            let li = createCheckItem('col__' + tf.id, this.tickAllText,\r\n                this.tickAllText);\r\n            addClass(li, this.listItemCssClass);\r\n            ul.appendChild(li);\r\n            li.check.checked = !this.tickToHide;\r\n\r\n            addEvt(li.check, 'click', () => {\r\n                for (let h = 0; h < headerRow.cells.length; h++) {\r\n                    let itm = elm('col_' + h + '_' + tf.id);\r\n                    if (itm && li.check.checked !== itm.checked) {\r\n                        itm.click();\r\n                        itm.checked = li.check.checked;\r\n                    }\r\n                }\r\n            });\r\n        }\r\n\r\n        for (let i = 0; i < headerRow.cells.length; i++) {\r\n            let cell = headerRow.cells[i];\r\n            let cellText = this.headersText[i] || this._getHeaderText(cell);\r\n            let liElm = createCheckItem('col_' + i + '_' + tf.id, cellText,\r\n                cellText);\r\n            addClass(liElm, this.listItemCssClass);\r\n            if (!this.tickToHide) {\r\n                addClass(liElm, this.listSlcItemCssClass);\r\n            }\r\n            ul.appendChild(liElm);\r\n            if (!this.tickToHide) {\r\n                liElm.check.checked = true;\r\n            }\r\n\r\n            addEvt(liElm.check, 'click', (evt) => {\r\n                let elm = targetEvt(evt);\r\n                let lbl = elm.parentNode;\r\n                this.checkItem(lbl);\r\n            });\r\n        }\r\n\r\n        //separator\r\n        let p = createElm('p', ['align', 'center']);\r\n        let btn;\r\n        //Close link\r\n        if (!this.btnCloseHtml) {\r\n            btn = createElm('a', ['href', 'javascript:;']);\r\n            btn.className = this.btnCloseCssClass;\r\n            btn.innerHTML = this.btnCloseText;\r\n            addEvt(btn, 'click', (evt) => this.toggle(evt));\r\n            p.appendChild(btn);\r\n        } else {\r\n            p.innerHTML = this.btnCloseHtml;\r\n            btn = p.firstChild;\r\n            addEvt(btn, 'click', (evt) => this.toggle(evt));\r\n        }\r\n\r\n        container.appendChild(ul);\r\n        container.appendChild(p);\r\n\r\n        this.btnEl.parentNode.insertBefore(container, this.btnEl);\r\n        this.contEl = container;\r\n    }\r\n\r\n    /**\r\n     * Hide or show specified columns\r\n     * @param {Number} colIndex Column index\r\n     * @param {Boolean} hide    Hide column if true or show if false\r\n     */\r\n    setHidden(colIndex, hide) {\r\n        let tf = this.tf;\r\n        let tbl = tf.dom();\r\n\r\n        if (hide) {\r\n            this.onBeforeColHidden(this, colIndex);\r\n        } else {\r\n            this.onBeforeColDisplayed(this, colIndex);\r\n        }\r\n\r\n        this._hideElements(tbl, colIndex, hide);\r\n        if (this.headersTbl) {\r\n            this._hideElements(this.headersTbl, colIndex, hide);\r\n        }\r\n\r\n        let hiddenCols = this.hiddenCols;\r\n        let itemIndex = hiddenCols.indexOf(colIndex);\r\n        if (hide) {\r\n            if (itemIndex === -1) {\r\n                this.hiddenCols.push(colIndex);\r\n            }\r\n        } else {\r\n            if (itemIndex !== -1) {\r\n                this.hiddenCols.splice(itemIndex, 1);\r\n            }\r\n        }\r\n\r\n        if (hide) {\r\n            this.onAfterColHidden(this, colIndex);\r\n            this.emitter.emit('column-hidden', tf, this, colIndex,\r\n                this.hiddenCols);\r\n        } else {\r\n            this.onAfterColDisplayed(this, colIndex);\r\n            this.emitter.emit('column-shown', tf, this, colIndex,\r\n                this.hiddenCols);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Show specified column\r\n     * @param  {Number} colIndex Column index\r\n     */\r\n    showCol(colIndex) {\r\n        if (isUndef(colIndex) || !this.isColHidden(colIndex)) {\r\n            return;\r\n        }\r\n        if (this.manager && this.contEl) {\r\n            let itm = elm('col_' + colIndex + '_' + this.tf.id);\r\n            if (itm) {\r\n                itm.click();\r\n            }\r\n        } else {\r\n            this.setHidden(colIndex, false);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Hide specified column\r\n     * @param  {Number} colIndex Column index\r\n     */\r\n    hideCol(colIndex) {\r\n        if (isUndef(colIndex) || this.isColHidden(colIndex)) {\r\n            return;\r\n        }\r\n        if (this.manager && this.contEl) {\r\n            let itm = elm('col_' + colIndex + '_' + this.tf.id);\r\n            if (itm) {\r\n                itm.click();\r\n            }\r\n        } else {\r\n            this.setHidden(colIndex, true);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Determine if specified column is hidden\r\n     * @param  {Number} colIndex Column index\r\n     */\r\n    isColHidden(colIndex) {\r\n        if (this.hiddenCols.indexOf(colIndex) !== -1) {\r\n            return true;\r\n        }\r\n        return false;\r\n    }\r\n\r\n    /**\r\n     * Toggle visibility of specified column\r\n     * @param  {Number} colIndex Column index\r\n     */\r\n    toggleCol(colIndex) {\r\n        if (isUndef(colIndex) || this.isColHidden(colIndex)) {\r\n            this.showCol(colIndex);\r\n        } else {\r\n            this.hideCol(colIndex);\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Return the indexes of the columns currently hidden\r\n     * @return {Array} column indexes\r\n     */\r\n    getHiddenCols() {\r\n        return this.hiddenCols;\r\n    }\r\n\r\n    /**\r\n     * Remove the columns manager\r\n     */\r\n    destroy() {\r\n        if (!this.initialized) {\r\n            return;\r\n        }\r\n        if (elm(this.contElTgtId)) {\r\n            elm(this.contElTgtId).innerHTML = '';\r\n        } else {\r\n            this.contEl.innerHTML = '';\r\n            removeElm(this.contEl);\r\n            this.contEl = null;\r\n        }\r\n        this.btnEl.innerHTML = '';\r\n        removeElm(this.btnEl);\r\n        this.btnEl = null;\r\n\r\n        this.emitter.off(['hide-column'],\r\n            (tf, colIndex) => this.hideCol(colIndex));\r\n\r\n        this.boundMouseup = null;\r\n\r\n        this.initialized = false;\r\n    }\r\n\r\n    _getHeaderText(cell) {\r\n        if (!cell.hasChildNodes) {\r\n            return '';\r\n        }\r\n\r\n        for (let i = 0; i < cell.childNodes.length; i++) {\r\n            let n = cell.childNodes[i];\r\n            if (n.nodeType === 3) {\r\n                return n.nodeValue;\r\n            } else if (n.nodeType === 1) {\r\n                if (n.id && n.id.indexOf('popUp') !== -1) {\r\n                    continue;\r\n                } else {\r\n                    return getText(n);\r\n                }\r\n            }\r\n            continue;\r\n        }\r\n        return '';\r\n    }\r\n\r\n    _hideElements(tbl, colIdx, hide) {\r\n        this._hideCells(tbl, colIdx, hide);\r\n        this._hideCol(tbl, colIdx, hide);\r\n    }\r\n\r\n    _hideCells(tbl, colIdx, hide) {\r\n        for (let i = 0; i < tbl.rows.length; i++) {\r\n            let row = tbl.rows[i];\r\n            let cell = row.cells[colIdx];\r\n            if (cell) {\r\n                cell.style.display = hide ? NONE : '';\r\n            }\r\n        }\r\n    }\r\n\r\n    _hideCol(tbl, colIdx, hide) {\r\n        let colElms = tag(this.tf.dom(), 'col');\r\n        if (colElms.length === 0) {\r\n            return;\r\n        }\r\n        colElms[colIdx].style.display = hide ? NONE : '';\r\n    }\r\n\r\n    _hideAtStart() {\r\n        this.atStart.forEach((colIdx) => {\r\n            this.hideCol(colIdx);\r\n        });\r\n    }\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/colsVisibility/colsVisibility.js","import {Feature} from '../../feature';\r\nimport {createElm, removeElm, elm} from '../../dom';\r\nimport {EMPTY_FN, isNull} from '../../types';\r\nimport {addEvt} from '../../event';\r\nimport {\r\n    defaultsBool, defaultsStr, defaultsFn, defaultsNb,\r\n} from '../../settings';\r\nimport {RIGHT} from '../../modules/toolbar';\r\n\r\n/**\r\n * Filters Visibility extension\r\n */\r\nexport default class FiltersVisibility extends Feature {\r\n\r\n    /**\r\n     * Creates an instance of FiltersVisibility\r\n     * @param {TableFilter} tf TableFilter instance\r\n     * @param {Object} Configuration object\r\n     */\r\n    constructor(tf, f) {\r\n        super(tf, f.name);\r\n\r\n        /**\r\n         * Module name\r\n         * @type {String}\r\n         */\r\n        this.name = f.name;\r\n\r\n        /**\r\n         * Module description\r\n         * @type {String}\r\n         */\r\n        this.desc = defaultsStr(f.description,\r\n            'Filters row visibility manager');\r\n\r\n        /**\r\n         * Extension's stylesheet filename\r\n         * @type {String}\r\n         */\r\n        this.stylesheet = defaultsStr(f.stylesheet , 'filtersVisibility.css');\r\n\r\n        /**\r\n         * Expand icon filename\r\n         * @type {String}\r\n         */\r\n        this.icnExpand = defaultsStr(f.expand_icon_name, 'icn_exp.png');\r\n\r\n        /**\r\n         * Collapse icon filename\r\n         * @type {String}\r\n         */\r\n        this.icnCollapse = defaultsStr(f.collapse_icon_name, 'icn_clp.png');\r\n\r\n        /**\r\n         * Main container element\r\n         * @private\r\n         */\r\n        this.contEl = null;\r\n\r\n        /**\r\n         * Button element\r\n         * @private\r\n         */\r\n        this.btnEl = null;\r\n\r\n        /**\r\n         * Expand icon HTML\r\n         * @private\r\n         */\r\n        this.icnExpandHtml = '\"Expand';\r\n\r\n        /**\r\n         * Collapse icon HTML\r\n         * @private\r\n         */\r\n        this.icnCollapseHtml = '\"Collapse';\r\n\r\n        /**\r\n         * Default text\r\n         * @private\r\n         */\r\n        this.defaultText = 'Toggle filters';\r\n\r\n        /**\r\n         * ID of main container element\r\n         * @type {String}\r\n         */\r\n        this.targetId = f.target_id || null;\r\n\r\n        /**\r\n         * Enable expand/collapse icon, defaults to true\r\n         * @type {Boolean}\r\n         */\r\n        this.enableIcon = defaultsBool(f.enable_icon, true);\r\n\r\n        /**\r\n         * Custom text for button\r\n         * @type {String}\r\n         */\r\n        this.btnText = defaultsStr(f.btn_text, '');\r\n\r\n        /**\r\n         * Collapse button HTML\r\n         * @private\r\n         */\r\n        this.collapseBtnHtml = this.enableIcon ?\r\n            this.icnCollapseHtml + this.btnText :\r\n            this.btnText || this.defaultText;\r\n\r\n        /**\r\n         * Expand button HTML\r\n         * @private\r\n         */\r\n        this.expandBtnHtml = this.enableIcon ?\r\n            this.icnExpandHtml + this.btnText :\r\n            this.btnText || this.defaultText;\r\n\r\n        /**\r\n         * Button's custom HTML\r\n         * @type {String}\r\n         */\r\n        this.btnHtml = defaultsStr(f.btn_html, null);\r\n\r\n        /**\r\n         * Css class for expand/collapse filters button\r\n         * @type {String}\r\n         */\r\n        this.btnCssClass = defaultsStr(f.btn_css_class, 'btnExpClpFlt');\r\n\r\n        /**\r\n         * Css class for main container\r\n         * @type {String}\r\n         */\r\n        this.contCssClass = defaultsStr(f.cont_css_class, 'expClpFlt');\r\n\r\n        /**\r\n         * Filters row index\r\n         * @type {Number}\r\n         */\r\n        this.filtersRowIndex = defaultsNb(f.filters_row_index,\r\n            tf.getFiltersRowIndex());\r\n\r\n        /**\r\n         * Make filters visible at initialization, defaults to true\r\n         * @type {Boolean}\r\n         */\r\n        this.visibleAtStart = defaultsNb(f.visible_at_start, true);\r\n\r\n        /**\r\n         * Default position in toolbar ('left'|'center'|'right')\r\n         * @type {String}\r\n         */\r\n        this.toolbarPosition = defaultsStr(f.toolbar_position, RIGHT);\r\n\r\n        /**\r\n         * Callback fired before filters row is shown\r\n         * @type {Function}\r\n         */\r\n        this.onBeforeShow = defaultsFn(f.on_before_show, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired after filters row is shown\r\n         * @type {Function}\r\n         */\r\n        this.onAfterShow = defaultsFn(f.on_after_show, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired before filters row is hidden\r\n         * @type {Function}\r\n         */\r\n        this.onBeforeHide = defaultsFn(f.on_before_hide, EMPTY_FN);\r\n\r\n        /**\r\n         * Callback fired after filters row is hidden\r\n         * @type {Function}\r\n         */\r\n        this.onAfterHide = defaultsFn(f.on_after_hide, EMPTY_FN);\r\n\r\n        //Import extension's stylesheet\r\n        tf.import(f.name + 'Style', tf.getStylePath() + this.stylesheet, null,\r\n            'link');\r\n\r\n        this.enable();\r\n    }\r\n\r\n    /**\r\n     * Initialise extension\r\n     */\r\n    init() {\r\n        if (this.initialized) {\r\n            return;\r\n        }\r\n\r\n        this.emitter.emit('initializing-extension', this,\r\n            !isNull(this.targetId));\r\n\r\n        this.buildUI();\r\n\r\n        /** @inherited */\r\n        this.initialized = true;\r\n\r\n        this.emitter.on(['show-filters'], (tf, visible) => this.show(visible));\r\n        this.emitter.emit('filters-visibility-initialized', this.tf, this);\r\n        this.emitter.emit('extension-initialized', this);\r\n    }\r\n\r\n    /**\r\n     * Build UI elements\r\n     */\r\n    buildUI() {\r\n        let tf = this.tf;\r\n        let span = createElm('span');\r\n        span.className = this.contCssClass;\r\n\r\n        // Container element (rdiv or custom element)\r\n        let targetEl = !this.targetId ?\r\n            tf.feature('toolbar').container(this.toolbarPosition) :\r\n            elm(this.targetId);\r\n\r\n        if (!this.targetId) {\r\n            let firstChild = targetEl.firstChild;\r\n            firstChild.parentNode.insertBefore(span, firstChild);\r\n        } else {\r\n            targetEl.appendChild(span);\r\n        }\r\n\r\n        let btn;\r\n        if (!this.btnHtml) {\r\n            btn = createElm('a', ['href', 'javascript:void(0);']);\r\n            btn.className = this.btnCssClass;\r\n            btn.title = this.btnText || this.defaultText;\r\n            btn.innerHTML = this.collapseBtnHtml;\r\n            span.appendChild(btn);\r\n        } else { // Custom html\r\n            span.innerHTML = this.btnHtml;\r\n            btn = span.firstChild;\r\n        }\r\n\r\n        addEvt(btn, 'click', () => this.toggle());\r\n\r\n        this.contEl = span;\r\n        this.btnEl = btn;\r\n\r\n        if (!this.visibleAtStart) {\r\n            this.toggle();\r\n        }\r\n    }\r\n\r\n    /**\r\n     * Toggle filters visibility\r\n     */\r\n    toggle() {\r\n        let tf = this.tf;\r\n        let tbl = tf.gridLayout ? tf.feature('gridLayout').headTbl : tf.dom();\r\n        let fltRow = tbl.rows[this.filtersRowIndex];\r\n        let isDisplayed = fltRow.style.display === '';\r\n\r\n        this.show(!isDisplayed);\r\n    }\r\n\r\n    /**\r\n     * Show or hide filters\r\n     *\r\n     * @param {boolean} [visible=true] Visibility flag\r\n     */\r\n    show(visible = true) {\r\n        let tf = this.tf;\r\n        let tbl = tf.gridLayout ? tf.feature('gridLayout').headTbl : tf.dom();\r\n        let fltRow = tbl.rows[this.filtersRowIndex];\r\n\r\n        if (visible) {\r\n            this.onBeforeShow(this);\r\n        }\r\n        if (!visible) {\r\n            this.onBeforeHide(this);\r\n        }\r\n\r\n        fltRow.style.display = visible ? '' : 'none';\r\n        if (this.enableIcon && !this.btnHtml) {\r\n            this.btnEl.innerHTML = visible ?\r\n                this.collapseBtnHtml : this.expandBtnHtml;\r\n        }\r\n\r\n        if (visible) {\r\n            this.onAfterShow(this);\r\n        }\r\n        if (!visible) {\r\n            this.onAfterHide(this);\r\n        }\r\n\r\n        this.emitter.emit('filters-toggled', tf, this, visible);\r\n    }\r\n\r\n    /**\r\n     * Destroy the UI\r\n     */\r\n    destroy() {\r\n        if (!this.initialized) {\r\n            return;\r\n        }\r\n\r\n        this.emitter.off(['show-filters'], (tf, visible) => this.show(visible));\r\n\r\n        this.btnEl.innerHTML = '';\r\n        removeElm(this.btnEl);\r\n        this.btnEl = null;\r\n\r\n        this.contEl.innerHTML = '';\r\n        removeElm(this.contEl);\r\n        this.contEl = null;\r\n        this.initialized = false;\r\n    }\r\n\r\n}\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/filtersVisibility/filtersVisibility.js","import AdapterSortableTable from './adapterSortabletable';\r\nimport {root} from '../../root';\r\n\r\nif (!root.SortableTable) {\r\n    require('script-loader!sortabletable');\r\n}\r\n\r\nexport default AdapterSortableTable;\r\n\n\n\n// WEBPACK FOOTER //\n// ./src/extensions/sort/sort.js","\nmodule.exports = formatter;\nmodule.exports.default = formatter;\n\nfunction formatter(options) {\n  options = options || {};\n\n\n  // *********************************************************************************************\n  // Set defaults for negatives\n  // options.negative, options.negativeOut, options.separator retained for backward compatibility\n  // *********************************************************************************************\n\n  // type of negative; default left\n  options.negativeType = options.negativeType || (options.negative === 'R' ? 'right' : 'left')\n\n  // negative symbols '-' or '()'\n  if (typeof options.negativeLeftSymbol !== 'string') {\n    switch (options.negativeType) {\n      case 'left':\n        options.negativeLeftSymbol = '-';\n        break;\n      case 'brackets':\n        options.negativeLeftSymbol = '(';\n        break;\n      default:\n        options.negativeLeftSymbol = '';\n    }\n  }\n  if (typeof options.negativeRightSymbol !== 'string') {\n    switch (options.negativeType) {\n      case 'right':\n        options.negativeRightSymbol = '-';\n        break;\n      case 'brackets':\n        options.negativeRightSymbol = ')';\n        break;\n      default:\n        options.negativeRightSymbol = '';\n    }\n  }\n\n  // whether negative symbol should be inside/outside prefix and suffix\n\n  if (typeof options.negativeLeftOut !== \"boolean\") {\n    options.negativeLeftOut = (options.negativeOut === false ? false : true);\n  }\n  if (typeof options.negativeRightOut !== \"boolean\") {\n    options.negativeRightOut = (options.negativeOut === false ? false : true);\n  }\n\n  //prefix and suffix\n  options.prefix = options.prefix || '';\n  options.suffix = options.suffix || '';\n\n  //separators\n  if (typeof options.integerSeparator !== 'string') {\n    options.integerSeparator = (typeof options.separator === 'string' ? options.separator : ',');\n  }\n  options.decimalsSeparator = typeof options.decimalsSeparator === 'string' ? options.decimalsSeparator : '';\n  options.decimal = options.decimal || '.';\n\n  //padders\n  options.padLeft = options.padLeft || -1 //default no padding\n  options.padRight = options.padRight || -1 //default no padding\n\n  function format(number, overrideOptions) {\n    overrideOptions = overrideOptions || {};\n\n    if (number || number === 0) {\n      number = '' + number;//convert number to string if it isn't already\n    } else {\n      return '';\n    }\n\n    //identify a negative number and make it absolute\n    var output = [];\n    var negative = number.charAt(0) === '-';\n    number = number.replace(/^\\-/g, '');\n\n    //Prepare output with left hand negative and/or prefix\n    if (!options.negativeLeftOut && !overrideOptions.noUnits) {\n      output.push(options.prefix);\n    }\n    if (negative) {\n      output.push(options.negativeLeftSymbol);\n    }\n    if (options.negativeLeftOut && !overrideOptions.noUnits) {\n      output.push(options.prefix);\n    }\n\n    //Format core number\n    number = number.split('.');\n    if (options.round != null) round(number, options.round);\n    if (options.truncate != null) number[1] = truncate(number[1], options.truncate);\n    if (options.padLeft > 0) number[0] = padLeft(number[0], options.padLeft);\n    if (options.padRight > 0) number[1] = padRight(number[1], options.padRight);\n    if (!overrideOptions.noSeparator && number[1]) number[1] = addDecimalSeparators(number[1], options.decimalsSeparator);\n    if (!overrideOptions.noSeparator && number[0]) number[0] = addIntegerSeparators(number[0], options.integerSeparator);\n    output.push(number[0]);\n    if (number[1]) {\n      output.push(options.decimal);\n      output.push(number[1]);\n    }\n\n    //Prepare output with right hand negative and/or prefix\n    if (options.negativeRightOut && !overrideOptions.noUnits) {\n      output.push(options.suffix);\n    }\n    if (negative) {\n      output.push(options.negativeRightSymbol);\n    }\n    if (!options.negativeRightOut && !overrideOptions.noUnits) {\n      output.push(options.suffix);\n    }\n\n    //join output and return\n    return output.join('');\n  }\n\n  format.negative = options.negative;\n  format.negativeOut = options.negativeOut;\n  format.negativeType = options.negativeType;\n  format.negativeLeftOut = options.negativeLeftOut;\n  format.negativeLeftSymbol = options.negativeLeftSymbol;\n  format.negativeRightOut = options.negativeRightOut;\n  format.negativeRightSymbol = options.negativeRightSymbol;\n  format.prefix = options.prefix;\n  format.suffix = options.suffix;\n  format.separate = options.separate;\n  format.integerSeparator = options.integerSeparator;\n  format.decimalsSeparator = options.decimalsSeparator;\n  format.decimal = options.decimal;\n  format.padLeft = options.padLeft;\n  format.padRight = options.padRight;\n  format.truncate = options.truncate;\n  format.round = options.round;\n\n  function unformat(number, allowedSeparators) {\n    allowedSeparators = allowedSeparators || [];\n    if (options.allowedSeparators) {\n      options.allowedSeparators.forEach(function (s) { allowedSeparators.push (s); });\n    }\n    allowedSeparators.push(options.integerSeparator);\n    allowedSeparators.push(options.decimalsSeparator);\n    number = number.replace(options.prefix, '');\n    number = number.replace(options.suffix, '');\n    var newNumber = number;\n    do {\n      number = newNumber;\n      for (var i = 0; i < allowedSeparators.length; i++) {\n        newNumber = newNumber.replace(allowedSeparators[i], '');\n      }\n    } while (newNumber != number);\n    return number;\n  }\n  format.unformat = unformat;\n\n  function validate(number, allowedSeparators) {\n    number = unformat(number, allowedSeparators);\n    number = number.split(options.decimal);\n    if (number.length > 2) {\n      return false;\n    } else if (options.truncate != null && number[1] && number[1].length > options.truncate) {\n      return false;\n    }  else if (options.round != null && number[1] && number[1].length > options.round) {\n      return false;\n    } else {\n      return /^-?\\d+\\.?\\d*$/.test(number);\n    }\n  }\n  return format;\n}\n\n//where x is already the integer part of the number\nfunction addIntegerSeparators(x, separator) {\n  x += '';\n  if (!separator) return x;\n  var rgx = /(\\d+)(\\d{3})/;\n  while (rgx.test(x)) {\n    x = x.replace(rgx, '$1' + separator + '$2');\n  }\n  return x;\n}\n\n//where x is already the decimal part of the number\nfunction addDecimalSeparators(x, separator) {\n  x += '';\n  if (!separator) return x;\n  var rgx = /(\\d{3})(\\d+)/;\n  while (rgx.test(x)) {\n    x = x.replace(rgx, '$1' + separator + '$2');\n  }\n  return x;\n}\n\n//where x is the integer part of the number\nfunction padLeft(x, padding) {\n  x = x + '';\n  var buf = [];\n  while (buf.length + x.length < padding) {\n    buf.push('0');\n  }\n  return buf.join('') + x;\n}\n\n//where x is the decimals part of the number\nfunction padRight(x, padding) {\n  if (x) {\n    x += '';\n  } else {\n    x = '';\n  }\n  var buf = [];\n  while (buf.length + x.length < padding) {\n    buf.push('0');\n  }\n  return x + buf.join('');\n}\nfunction truncate(x, length) {\n  if (x) {\n    x += '';\n  }\n  if (x && x.length > length) {\n    return x.substr(0, length);\n  } else {\n    return x;\n  }\n}\n\n//where number is an array with 0th item as integer string and 1st item as decimal string (no negatives)\nfunction round(number, places) {\n  if (number[1] && places >= 0 && number[1].length > places) {\n    //truncate to correct number of decimal places\n    var decim = number[1].slice(0, places);\n    //if next digit was >= 5 we need to round up\n    if (+(number[1].substr(places, 1)) >= 5) {\n      //But first count leading zeros as converting to a number will loose them\n      var leadingzeros = \"\";\n      while (decim.charAt(0)===\"0\") {\n        leadingzeros = leadingzeros + \"0\";\n        decim = decim.substr(1);\n      }\n      //Then we can change decim to a number and add 1 before replacing leading zeros\n      decim = (+decim + 1) + '';\n      decim = leadingzeros + decim;\n      if (decim.length > places) {\n        //adding one has made it longer\n        number[0] = (+number[0]+ +decim.charAt(0)) + ''; //add value of firstchar to the integer part\n        decim = decim.substring(1);   //ignore the 1st char at the beginning which is the carry to the integer part\n      }\n    }\n    number[1] = decim;\n  }\n  return number;\n}\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/format-number/index.js\n// module id = 448\n// module chunks = 0","require(\"!!C:\\\\Users\\\\max.guglielmi\\\\Documents\\\\dev\\\\perso\\\\javascript\\\\GitHub\\\\TableFilter\\\\node_modules\\\\script-loader\\\\addScript.js\")(require(\"!!C:\\\\Users\\\\max.guglielmi\\\\Documents\\\\dev\\\\perso\\\\javascript\\\\GitHub\\\\TableFilter\\\\node_modules\\\\raw-loader\\\\index.js!C:\\\\Users\\\\max.guglielmi\\\\Documents\\\\dev\\\\perso\\\\javascript\\\\GitHub\\\\TableFilter\\\\libs\\\\sortabletable.js\"))\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader!./libs/sortabletable.js\n// module id = 449\n// module chunks = 0","/*\r\n\tMIT License http://www.opensource.org/licenses/mit-license.php\r\n\tAuthor Tobias Koppers @sokra\r\n*/\r\nmodule.exports = function(src) {\r\n\tif (typeof execScript !== \"undefined\")\r\n\t\texecScript(src);\r\n\telse\r\n\t\teval.call(null, src);\r\n}\r\n\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/script-loader/addScript.js\n// module id = 450\n// module chunks = 0","module.exports = \"/*----------------------------------------------------------------------------\\\\\\r\\n|                            Sortable Table 1.12                              |\\r\\n|-----------------------------------------------------------------------------|\\r\\n|                         Created by Erik Arvidsson                           |\\r\\n|                  (http://webfx.eae.net/contact.html#erik)                   |\\r\\n|                      For WebFX (http://webfx.eae.net/)                      |\\r\\n|-----------------------------------------------------------------------------|\\r\\n| A DOM 1 based script that allows an ordinary HTML table to be sortable.     |\\r\\n|-----------------------------------------------------------------------------|\\r\\n|                  Copyright (c) 1998 - 2006 Erik Arvidsson                   |\\r\\n|-----------------------------------------------------------------------------|\\r\\n| Licensed under the Apache License, Version 2.0 (the \\\"License\\\"); you may not |\\r\\n| use this file except in compliance with the License.  You may obtain a copy |\\r\\n| of the License at http://www.apache.org/licenses/LICENSE-2.0                |\\r\\n| - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - |\\r\\n| Unless  required  by  applicable law or  agreed  to  in  writing,  software |\\r\\n| distributed under the License is distributed on an  \\\"AS IS\\\" BASIS,  WITHOUT |\\r\\n| WARRANTIES OR  CONDITIONS OF ANY KIND,  either express or implied.  See the |\\r\\n| License  for the  specific language  governing permissions  and limitations |\\r\\n| under the License.                                                          |\\r\\n|-----------------------------------------------------------------------------|\\r\\n| 2003-01-10 | First version                                                  |\\r\\n| 2003-01-19 | Minor changes to the date parsing                              |\\r\\n| 2003-01-28 | JScript 5.0 fixes (no support for 'in' operator)               |\\r\\n| 2003-02-01 | Sloppy typo like error fixed in getInnerText                   |\\r\\n| 2003-07-04 | Added workaround for IE cellIndex bug.                         |\\r\\n| 2003-11-09 | The bDescending argument to sort was not correctly working     |\\r\\n|            | Using onclick DOM0 event if no support for addEventListener    |\\r\\n|            | or attachEvent                                                 |\\r\\n| 2004-01-13 | Adding addSortType and removeSortType which makes it a lot     |\\r\\n|            | easier to add new, custom sort types.                          |\\r\\n| 2004-01-27 | Switch to use descending = false as the default sort order.    |\\r\\n|            | Change defaultDescending to suit your needs.                   |\\r\\n| 2004-03-14 | Improved sort type None look and feel a bit                    |\\r\\n| 2004-08-26 | Made the handling of tBody and tHead more flexible. Now you    |\\r\\n|            | can use another tHead or no tHead, and you can chose some      |\\r\\n|            | other tBody.                                                   |\\r\\n| 2006-04-25 | Changed license to Apache Software License 2.0                 |\\r\\n|-----------------------------------------------------------------------------|\\r\\n| Created 2003-01-10 | All changes are in the log above. | Updated 2006-04-25 |\\r\\n\\\\----------------------------------------------------------------------------*/\\r\\n\\r\\n\\r\\nfunction SortableTable(oTable, oSortTypes) {\\r\\n\\r\\n\\tthis.sortTypes = oSortTypes || [];\\r\\n\\r\\n\\tthis.sortColumn = null;\\r\\n\\tthis.descending = null;\\r\\n\\r\\n\\tvar oThis = this;\\r\\n\\tthis._headerOnclick = function (e) {\\r\\n\\t\\toThis.headerOnclick(e);\\r\\n\\t};\\r\\n\\r\\n\\tif (oTable) {\\r\\n\\t\\tthis.setTable( oTable );\\r\\n\\t\\tthis.document = oTable.ownerDocument || oTable.document;\\r\\n\\t}\\r\\n\\telse {\\r\\n\\t\\tthis.document = document;\\r\\n\\t}\\r\\n\\r\\n\\r\\n\\t// only IE needs this\\r\\n\\tvar win = this.document.defaultView || this.document.parentWindow;\\r\\n\\tthis._onunload = function () {\\r\\n\\t\\toThis.destroy();\\r\\n\\t};\\r\\n\\tif (win && typeof win.attachEvent != \\\"undefined\\\") {\\r\\n\\t\\twin.attachEvent(\\\"onunload\\\", this._onunload);\\r\\n\\t}\\r\\n}\\r\\n\\r\\nSortableTable.gecko = navigator.product == \\\"Gecko\\\";\\r\\nSortableTable.msie = /msie/i.test(navigator.userAgent);\\r\\n// Mozilla is faster when doing the DOM manipulations on\\r\\n// an orphaned element. MSIE is not\\r\\nSortableTable.removeBeforeSort = SortableTable.gecko;\\r\\n\\r\\nSortableTable.prototype.onsort = function () {};\\r\\n\\r\\n// default sort order. true -> descending, false -> ascending\\r\\nSortableTable.prototype.defaultDescending = false;\\r\\n\\r\\n// shared between all instances. This is intentional to allow external files\\r\\n// to modify the prototype\\r\\nSortableTable.prototype._sortTypeInfo = {};\\r\\n\\r\\nSortableTable.prototype.setTable = function (oTable) {\\r\\n\\tif ( this.tHead )\\r\\n\\t\\tthis.uninitHeader();\\r\\n\\tthis.element = oTable;\\r\\n\\tthis.setTHead( oTable.tHead );\\r\\n\\tthis.setTBody( oTable.tBodies[0] );\\r\\n};\\r\\n\\r\\nSortableTable.prototype.setTHead = function (oTHead) {\\r\\n\\tif (this.tHead && this.tHead != oTHead )\\r\\n\\t\\tthis.uninitHeader();\\r\\n\\tthis.tHead = oTHead;\\r\\n\\tthis.initHeader( this.sortTypes );\\r\\n};\\r\\n\\r\\nSortableTable.prototype.setTBody = function (oTBody) {\\r\\n\\tthis.tBody = oTBody;\\r\\n};\\r\\n\\r\\nSortableTable.prototype.setSortTypes = function ( oSortTypes ) {\\r\\n\\tif ( this.tHead )\\r\\n\\t\\tthis.uninitHeader();\\r\\n\\tthis.sortTypes = oSortTypes || [];\\r\\n\\tif ( this.tHead )\\r\\n\\t\\tthis.initHeader( this.sortTypes );\\r\\n};\\r\\n\\r\\n// adds arrow containers and events\\r\\n// also binds sort type to the header cells so that reordering columns does\\r\\n// not break the sort types\\r\\nSortableTable.prototype.initHeader = function (oSortTypes) {\\r\\n\\tif (!this.tHead) return;\\r\\n\\tvar cells = this.tHead.rows[0].cells;\\r\\n\\tvar doc = this.tHead.ownerDocument || this.tHead.document;\\r\\n\\tthis.sortTypes = oSortTypes || [];\\r\\n\\tvar l = cells.length;\\r\\n\\tvar img, c;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\tc = cells[i];\\r\\n\\t\\tif (this.sortTypes[i] != null && this.sortTypes[i] != \\\"None\\\") {\\r\\n\\t\\t\\timg = doc.createElement(\\\"IMG\\\");\\r\\n\\t\\t\\timg.src = \\\"images/blank.png\\\";\\r\\n\\t\\t\\tc.appendChild(img);\\r\\n\\t\\t\\tif (this.sortTypes[i] != null)\\r\\n\\t\\t\\t\\tc._sortType = this.sortTypes[i];\\r\\n\\t\\t\\tif (typeof c.addEventListener != \\\"undefined\\\")\\r\\n\\t\\t\\t\\tc.addEventListener(\\\"click\\\", this._headerOnclick, false);\\r\\n\\t\\t\\telse if (typeof c.attachEvent != \\\"undefined\\\")\\r\\n\\t\\t\\t\\tc.attachEvent(\\\"onclick\\\", this._headerOnclick);\\r\\n\\t\\t\\telse\\r\\n\\t\\t\\t\\tc.onclick = this._headerOnclick;\\r\\n\\t\\t}\\r\\n\\t\\telse\\r\\n\\t\\t{\\r\\n\\t\\t\\tc.setAttribute( \\\"_sortType\\\", oSortTypes[i] );\\r\\n\\t\\t\\tc._sortType = \\\"None\\\";\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\tthis.updateHeaderArrows();\\r\\n};\\r\\n\\r\\n// remove arrows and events\\r\\nSortableTable.prototype.uninitHeader = function () {\\r\\n\\tif (!this.tHead) return;\\r\\n\\tvar cells = this.tHead.rows[0].cells;\\r\\n\\tvar l = cells.length;\\r\\n\\tvar c;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\tc = cells[i];\\r\\n\\t\\tif (c._sortType != null && c._sortType != \\\"None\\\") {\\r\\n\\t\\t\\tc.removeChild(c.lastChild);\\r\\n\\t\\t\\tif (typeof c.removeEventListener != \\\"undefined\\\")\\r\\n\\t\\t\\t\\tc.removeEventListener(\\\"click\\\", this._headerOnclick, false);\\r\\n\\t\\t\\telse if (typeof c.detachEvent != \\\"undefined\\\")\\r\\n\\t\\t\\t\\tc.detachEvent(\\\"onclick\\\", this._headerOnclick);\\r\\n\\t\\t\\tc._sortType = null;\\r\\n\\t\\t\\tc.removeAttribute( \\\"_sortType\\\" );\\r\\n\\t\\t}\\r\\n\\t}\\r\\n};\\r\\n\\r\\nSortableTable.prototype.updateHeaderArrows = function () {\\r\\n\\tif (!this.tHead) return;\\r\\n\\tvar cells = this.tHead.rows[0].cells;\\r\\n\\tvar l = cells.length;\\r\\n\\tvar img;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\tif (cells[i]._sortType != null && cells[i]._sortType != \\\"None\\\") {\\r\\n\\t\\t\\timg = cells[i].lastChild;\\r\\n\\t\\t\\tif (i == this.sortColumn)\\r\\n\\t\\t\\t\\timg.className = \\\"sort-arrow \\\" + (this.descending ? \\\"descending\\\" : \\\"ascending\\\");\\r\\n\\t\\t\\telse\\r\\n\\t\\t\\t\\timg.className = \\\"sort-arrow\\\";\\r\\n\\t\\t}\\r\\n\\t}\\r\\n};\\r\\n\\r\\nSortableTable.prototype.headerOnclick = function (e) {\\r\\n\\t// find TD element\\r\\n\\tvar el = e.target || e.srcElement;\\r\\n\\twhile (el.tagName != \\\"TD\\\")\\r\\n\\t\\tel = el.parentNode;\\r\\n\\r\\n\\tthis.sort(SortableTable.msie ? SortableTable.getCellIndex(el) : el.cellIndex);\\r\\n};\\r\\n\\r\\n// IE returns wrong cellIndex when columns are hidden\\r\\nSortableTable.getCellIndex = function (oTd) {\\r\\n\\tvar cells = oTd.parentNode.childNodes\\r\\n\\tvar l = cells.length;\\r\\n\\tvar i;\\r\\n\\tfor (i = 0; cells[i] != oTd && i < l; i++)\\r\\n\\t\\t;\\r\\n\\treturn i;\\r\\n};\\r\\n\\r\\nSortableTable.prototype.getSortType = function (nColumn) {\\r\\n\\treturn this.sortTypes[nColumn] || \\\"String\\\";\\r\\n};\\r\\n\\r\\n// only nColumn is required\\r\\n// if bDescending is left out the old value is taken into account\\r\\n// if sSortType is left out the sort type is found from the sortTypes array\\r\\n\\r\\nSortableTable.prototype.sort = function (nColumn, bDescending, sSortType) {\\r\\n\\tif (!this.tBody) return;\\r\\n\\tif (sSortType == null)\\r\\n\\t\\tsSortType = this.getSortType(nColumn);\\r\\n\\r\\n\\t// exit if None\\r\\n\\tif (sSortType == \\\"None\\\")\\r\\n\\t\\treturn;\\r\\n\\r\\n\\tif (bDescending == null) {\\r\\n\\t\\tif (this.sortColumn != nColumn)\\r\\n\\t\\t\\tthis.descending = this.defaultDescending;\\r\\n\\t\\telse\\r\\n\\t\\t\\tthis.descending = !this.descending;\\r\\n\\t}\\r\\n\\telse\\r\\n\\t\\tthis.descending = bDescending;\\r\\n\\r\\n\\tthis.sortColumn = nColumn;\\r\\n\\r\\n\\tif (typeof this.onbeforesort == \\\"function\\\")\\r\\n\\t\\tthis.onbeforesort();\\r\\n\\r\\n\\tvar f = this.getSortFunction(sSortType, nColumn);\\r\\n\\tvar a = this.getCache(sSortType, nColumn);\\r\\n\\tvar tBody = this.tBody;\\r\\n\\r\\n\\ta.sort(f);\\r\\n\\r\\n\\tif (this.descending)\\r\\n\\t\\ta.reverse();\\r\\n\\r\\n\\tif (SortableTable.removeBeforeSort) {\\r\\n\\t\\t// remove from doc\\r\\n\\t\\tvar nextSibling = tBody.nextSibling;\\r\\n\\t\\tvar p = tBody.parentNode;\\r\\n\\t\\tp.removeChild(tBody);\\r\\n\\t}\\r\\n\\r\\n\\t// insert in the new order\\r\\n\\tvar l = a.length;\\r\\n\\tfor (var i = 0; i < l; i++)\\r\\n\\t\\ttBody.appendChild(a[i].element);\\r\\n\\r\\n\\tif (SortableTable.removeBeforeSort) {\\r\\n\\t\\t// insert into doc\\r\\n\\t\\tp.insertBefore(tBody, nextSibling);\\r\\n\\t}\\r\\n\\r\\n\\tthis.updateHeaderArrows();\\r\\n\\r\\n\\tthis.destroyCache(a);\\r\\n\\r\\n\\tif (typeof this.onsort == \\\"function\\\")\\r\\n\\t\\tthis.onsort();\\r\\n};\\r\\n\\r\\nSortableTable.prototype.asyncSort = function (nColumn, bDescending, sSortType) {\\r\\n\\tvar oThis = this;\\r\\n\\tthis._asyncsort = function () {\\r\\n\\t\\toThis.sort(nColumn, bDescending, sSortType);\\r\\n\\t};\\r\\n\\twindow.setTimeout(this._asyncsort, 1);\\r\\n};\\r\\n\\r\\nSortableTable.prototype.getCache = function (sType, nColumn) {\\r\\n\\tif (!this.tBody) return [];\\r\\n\\tvar rows = this.tBody.rows;\\r\\n\\tvar l = rows.length;\\r\\n\\tvar a = new Array(l);\\r\\n\\tvar r;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\tr = rows[i];\\r\\n\\t\\ta[i] = {\\r\\n\\t\\t\\tvalue:\\t\\tthis.getRowValue(r, sType, nColumn),\\r\\n\\t\\t\\telement:\\tr\\r\\n\\t\\t};\\r\\n\\t};\\r\\n\\treturn a;\\r\\n};\\r\\n\\r\\nSortableTable.prototype.destroyCache = function (oArray) {\\r\\n\\tvar l = oArray.length;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\toArray[i].value = null;\\r\\n\\t\\toArray[i].element = null;\\r\\n\\t\\toArray[i] = null;\\r\\n\\t}\\r\\n};\\r\\n\\r\\nSortableTable.prototype.getRowValue = function (oRow, sType, nColumn) {\\r\\n\\t// if we have defined a custom getRowValue use that\\r\\n\\tif (this._sortTypeInfo[sType] && this._sortTypeInfo[sType].getRowValue)\\r\\n\\t\\treturn this._sortTypeInfo[sType].getRowValue(oRow, nColumn);\\r\\n\\r\\n\\tvar s;\\r\\n\\tvar c = oRow.cells[nColumn];\\r\\n\\tif (typeof c.innerText != \\\"undefined\\\")\\r\\n\\t\\ts = c.innerText;\\r\\n\\telse\\r\\n\\t\\ts = SortableTable.getInnerText(c);\\r\\n\\treturn this.getValueFromString(s, sType);\\r\\n};\\r\\n\\r\\nSortableTable.getInnerText = function (oNode) {\\r\\n\\tvar s = \\\"\\\";\\r\\n\\tvar cs = oNode.childNodes;\\r\\n\\tvar l = cs.length;\\r\\n\\tfor (var i = 0; i < l; i++) {\\r\\n\\t\\tswitch (cs[i].nodeType) {\\r\\n\\t\\t\\tcase 1: //ELEMENT_NODE\\r\\n\\t\\t\\t\\ts += SortableTable.getInnerText(cs[i]);\\r\\n\\t\\t\\t\\tbreak;\\r\\n\\t\\t\\tcase 3:\\t//TEXT_NODE\\r\\n\\t\\t\\t\\ts += cs[i].nodeValue;\\r\\n\\t\\t\\t\\tbreak;\\r\\n\\t\\t}\\r\\n\\t}\\r\\n\\treturn s;\\r\\n};\\r\\n\\r\\nSortableTable.prototype.getValueFromString = function (sText, sType) {\\r\\n\\tif (this._sortTypeInfo[sType])\\r\\n\\t\\treturn this._sortTypeInfo[sType].getValueFromString( sText );\\r\\n\\treturn sText;\\r\\n\\t/*\\r\\n\\tswitch (sType) {\\r\\n\\t\\tcase \\\"Number\\\":\\r\\n\\t\\t\\treturn Number(sText);\\r\\n\\t\\tcase \\\"CaseInsensitiveString\\\":\\r\\n\\t\\t\\treturn sText.toUpperCase();\\r\\n\\t\\tcase \\\"Date\\\":\\r\\n\\t\\t\\tvar parts = sText.split(\\\"-\\\");\\r\\n\\t\\t\\tvar d = new Date(0);\\r\\n\\t\\t\\td.setFullYear(parts[0]);\\r\\n\\t\\t\\td.setDate(parts[2]);\\r\\n\\t\\t\\td.setMonth(parts[1] - 1);\\r\\n\\t\\t\\treturn d.valueOf();\\r\\n\\t}\\r\\n\\treturn sText;\\r\\n\\t*/\\r\\n\\t};\\r\\n\\r\\nSortableTable.prototype.getSortFunction = function (sType, nColumn) {\\r\\n\\tif (this._sortTypeInfo[sType])\\r\\n\\t\\treturn this._sortTypeInfo[sType].compare;\\r\\n\\treturn SortableTable.basicCompare;\\r\\n};\\r\\n\\r\\nSortableTable.prototype.destroy = function () {\\r\\n\\tthis.uninitHeader();\\r\\n\\tvar win = this.document.parentWindow;\\r\\n\\tif (win && typeof win.detachEvent != \\\"undefined\\\") {\\t// only IE needs this\\r\\n\\t\\twin.detachEvent(\\\"onunload\\\", this._onunload);\\r\\n\\t}\\r\\n\\tthis._onunload = null;\\r\\n\\tthis.element = null;\\r\\n\\tthis.tHead = null;\\r\\n\\tthis.tBody = null;\\r\\n\\tthis.document = null;\\r\\n\\tthis._headerOnclick = null;\\r\\n\\tthis.sortTypes = null;\\r\\n\\tthis._asyncsort = null;\\r\\n\\tthis.onsort = null;\\r\\n};\\r\\n\\r\\n// Adds a sort type to all instance of SortableTable\\r\\n// sType : String - the identifier of the sort type\\r\\n// fGetValueFromString : function ( s : string ) : T - A function that takes a\\r\\n//    string and casts it to a desired format. If left out the string is just\\r\\n//    returned\\r\\n// fCompareFunction : function ( n1 : T, n2 : T ) : Number - A normal JS sort\\r\\n//    compare function. Takes two values and compares them. If left out less than,\\r\\n//    <, compare is used\\r\\n// fGetRowValue : function( oRow : HTMLTRElement, nColumn : int ) : T - A function\\r\\n//    that takes the row and the column index and returns the value used to compare.\\r\\n//    If left out then the innerText is first taken for the cell and then the\\r\\n//    fGetValueFromString is used to convert that string the desired value and type\\r\\n\\r\\nSortableTable.prototype.addSortType = function (sType, fGetValueFromString, fCompareFunction, fGetRowValue) {\\r\\n\\tthis._sortTypeInfo[sType] = {\\r\\n\\t\\ttype:\\t\\t\\t\\tsType,\\r\\n\\t\\tgetValueFromString:\\tfGetValueFromString || SortableTable.idFunction,\\r\\n\\t\\tcompare:\\t\\t\\tfCompareFunction || SortableTable.basicCompare,\\r\\n\\t\\tgetRowValue:\\t\\tfGetRowValue\\r\\n\\t};\\r\\n};\\r\\n\\r\\n// this removes the sort type from all instances of SortableTable\\r\\nSortableTable.prototype.removeSortType = function (sType) {\\r\\n\\tdelete this._sortTypeInfo[sType];\\r\\n};\\r\\n\\r\\nSortableTable.basicCompare = function compare(n1, n2) {\\r\\n\\tif (n1.value < n2.value)\\r\\n\\t\\treturn -1;\\r\\n\\tif (n2.value < n1.value)\\r\\n\\t\\treturn 1;\\r\\n\\treturn 0;\\r\\n};\\r\\n\\r\\nSortableTable.idFunction = function (x) {\\r\\n\\treturn x;\\r\\n};\\r\\n\\r\\nSortableTable.toUpperCase = function (s) {\\r\\n\\treturn s.toUpperCase();\\r\\n};\\r\\n\\r\\nSortableTable.toDate = function (s) {\\r\\n\\tvar parts = s.split(\\\"-\\\");\\r\\n\\tvar d = new Date(0);\\r\\n\\td.setFullYear(parts[0]);\\r\\n\\td.setDate(parts[2]);\\r\\n\\td.setMonth(parts[1] - 1);\\r\\n\\treturn d.valueOf();\\r\\n};\\r\\n\\r\\n\\r\\n// add sort types\\r\\nSortableTable.prototype.addSortType(\\\"Number\\\", Number);\\r\\nSortableTable.prototype.addSortType(\\\"CaseInsensitiveString\\\", SortableTable.toUpperCase);\\r\\nSortableTable.prototype.addSortType(\\\"Date\\\", SortableTable.toDate);\\r\\nSortableTable.prototype.addSortType(\\\"String\\\");\\r\\n// None is a special case\\r\\n\"\n\n\n//////////////////\n// WEBPACK FOOTER\n// ./node_modules/raw-loader!./libs/sortabletable.js\n// module id = 451\n// module chunks = 0"],"sourceRoot":""}
\ No newline at end of file
diff --git a/test/test-popup-filter-one-row.html b/test/test-popup-filter-one-row.html
new file mode 100644
index 00000000..d0f73296
--- /dev/null
+++ b/test/test-popup-filter-one-row.html
@@ -0,0 +1,38 @@
+
+
+    
+        
+        TableFilter pop-up filter with one row
+        
+        
+        
+    
+    
+        
+            
+                
+                    
+                    
+                    
+                    
+                    
+                
+            
+            
+                
+                    
+                    
+                    
+                    
+                    
+                
+            
+        
FromDestinationRoad Distance (km)By Air (hrs)By Rail (hrs)
SydneyAdelaide14121.425.3
+ + + + +
+
+ + diff --git a/test/test-popup-filter-one-row.js b/test/test-popup-filter-one-row.js new file mode 100644 index 00000000..1d538a45 --- /dev/null +++ b/test/test-popup-filter-one-row.js @@ -0,0 +1,138 @@ + +var tf = new TableFilter('demo', { + base_path: '../dist/tablefilter/', + popup_filters: true +}); +tf.init(); + +var popupFilter = tf.feature('popupFilter'); +module('Sanity checks'); +test('Pop-up filter component', function() { + notEqual(popupFilter, null, 'PopupFilter instanciated'); + deepEqual(popupFilter.fltElms instanceof Array, + true, 'Type of fltElms property'); + deepEqual( + popupFilter.adjustToContainer, + true, + 'Popup filter width adjusts to container' + ); + deepEqual(tf.headersRow, 1, 'Headers row index'); + // issue 99: getHeadersText for pick-list filter types + deepEqual( + tf.getHeadersText()[2], + 'Road Distance (km)', + 'Expected header text for multiple filter type' + ); + deepEqual( + tf.getHeadersText()[3], + 'By Air (hrs)', + 'Expected header text for multiple filter type' + ); + deepEqual(tf.dom().rows[tf.headersRow-1].style.display, 'none', + 'Extra row hidden'); +}); + +module('UI elements'); +test('Pop-up filter UI elements', function() { + var flt1 = tf.getFilterElement(0); + var flt2 = tf.getFilterElement(1); + var fltIcn1 = popupFilter.fltIcons[0]; + var fltIcn2 = popupFilter.fltIcons[1]; + + notEqual(flt1, null, 'Filter element exists'); + notEqual(flt2, null, 'Filter element exists'); + deepEqual(fltIcn1.nodeName, 'IMG', 'Filter icon exists'); + deepEqual(fltIcn2.nodeName, 'IMG', 'Filter icon exists'); +}); + +test('Can open pop-up filter', function(){ + // act + popupFilter.open(1); + + // assert + deepEqual(popupFilter.fltElms[1].style.display, 'block', + 'Popup filter is open'); +}); + +test('Can close pop-up filter', function(){ + // act + popupFilter.close(1); + + // assert + deepEqual(popupFilter.fltElms[1].style.display, 'none', + 'Popup filter is open'); +}); + +test('Can toggle pop-up filter (initially closed)', function(){ + // setup + popupFilter.close(2); + + // act + popupFilter.toggle(2); + + // assert + deepEqual(popupFilter.fltElms[2].style.display, 'block', + 'Popup filter is toggled'); +}); + +test('Can toggle pop-up filter (initially opened)', function(){ + // setup + popupFilter.open(2); + + // act + popupFilter.toggle(2); + + // assert + deepEqual(popupFilter.fltElms[2].style.display, 'none', + 'Popup filter is toggled'); +}); + +test('Pop-up filter closes upon filtering', function(){ + // setup + popupFilter.open(1); + + // act + tf.setFilterValue(1, 'Adelaide'); + tf.filter(); + + // assert + deepEqual(popupFilter.isOpen(1), false, + 'Pop-up filter closed after filtering' + ); +}); + +test('Pop-up filter auto-closes when user clicks away', function() { + // setup + popupFilter.open(0); + + // act + var evObj = document.createEvent('HTMLEvents'); + evObj.initEvent('mouseup', true, true); + tf.dom().rows[0].cells[2].dispatchEvent(evObj); + + // assert + deepEqual(popupFilter.isOpen(0), false, + 'Pop-up filter closed after user clicks away' + ); +}); + +test('Can close all popup filters', function() { + // setup + popupFilter.open(0); + + // act + popupFilter.closeAll(); + + // assert + deepEqual(popupFilter.isOpen(0), false, + 'Pop-up filter closed after closeAll' + ); +}); + +module('Tear-down'); +test('TableFilter removed', function() { + tf.destroy(); + var fltIcn1 = popupFilter.fltIcons[3]; + deepEqual(fltIcn1, undefined, 'Filter icon is removed'); + deepEqual(tf.isInitialized(), false, 'Filters removed'); +});