diff --git a/Gruntfile.js b/Gruntfile.js index 1dd6e14d..0a3d1923 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -5,7 +5,6 @@ module.exports = function (grunt) { var testHost = 'http://localhost:8000/'; var pkg = grunt.file.readJSON('package.json'); var repo = 'github.com/koalyptus/TableFilter'; - // var styleDirDist = 'dist/tablefilter/style/'; grunt.initConfig({ @@ -148,44 +147,6 @@ module.exports = function (grunt) { } }, - // stylus: { - // compile: { - // options: { - // banner: '/** \n' + - // ' *\t ' + pkg.name + ' v' + pkg.version + - // ' by ' + pkg.author.name + ' \n' + - // ' *\t build date: ' + new Date().toISOString() + ' \n' + - // ' *\t MIT License \n' + - // ' */ \n' - // }, - // files: [ - // { - // src: ['static/style/*.styl'], - // dest: styleDirDist + 'tablefilter.css' - // }, { - // src: ['static/style/extensions/colsVisibility.styl'], - // dest: styleDirDist + 'colsVisibility.css' - // }, { - // src: ['static/style/extensions/filtersVisibility.styl'], - // dest: styleDirDist + 'filtersVisibility.css' - // }, { - // src: ['static/style/themes/default/*.styl'], - // dest: styleDirDist + 'themes/default/default.css' - // }, { - // src: ['static/style/themes/mytheme/*.styl'], - // dest: styleDirDist + 'themes/mytheme/mytheme.css' - // }, { - // src: ['static/style/themes/skyblue/*.styl'], - // dest: styleDirDist + 'themes/skyblue/skyblue.css' - // }, { - // src: ['static/style/themes/transparent/*.styl'], - // dest: - // styleDirDist + 'themes/transparent/transparent.css' - // } - // ] - // } - // }, - 'gh-pages': { options: { branch: 'gh-pages', @@ -265,7 +226,6 @@ module.exports = function (grunt) { grunt.loadNpmTasks('grunt-contrib-connect'); grunt.loadNpmTasks('grunt-shell'); grunt.loadNpmTasks('grunt-qunit-istanbul'); - // grunt.loadNpmTasks('grunt-contrib-stylus'); grunt.loadNpmTasks('grunt-gh-pages'); grunt.registerTask('eslint', ['shell:eslint']); diff --git a/dist/starter.html b/dist/starter.html new file mode 100644 index 00000000..9bed4cf1 --- /dev/null +++ b/dist/starter.html @@ -0,0 +1,514 @@ + + + + tablefilter v0.6.22 - Starter + + +

tablefilter v0.6.22

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
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/style/colsVisibility.css b/dist/tablefilter/style/colsVisibility.css
new file mode 100644
index 00000000..3f2a86d6
--- /dev/null
+++ b/dist/tablefilter/style/colsVisibility.css
@@ -0,0 +1 @@
+span.colVisSpan{text-align:left;}span.colVisSpan a.colVis{display:inline-block;padding:7px 5px 0;font-size:inherit;font-weight:inherit;vertical-align:top}div.colVisCont{position:relative;background:#fff;-webkit-box-shadow:3px 3px 2px #888;-moz-box-shadow:3px 3px 2px #888;box-shadow:3px 3px 2px #888;position:absolute;display:none;border:1px solid #ccc;height:auto;width:250px;background-color:#fff;margin:35px 0 0 -100px;z-index:10000;padding:10px 10px 10px 10px;text-align:left;font-size:inherit;}div.colVisCont:after,div.colVisCont:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}div.colVisCont:after{border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:10px;margin-left:-10px}div.colVisCont:before{border-color:rgba(255,255,255,0);border-bottom-color:#ccc;border-width:12px;margin-left:-12px}div.colVisCont p{margin:6px auto 6px auto}div.colVisCont a.colVis{display:initial;font-weight:inherit}ul.cols_checklist{padding:0;margin:0;list-style-type:none;}ul.cols_checklist label{display:block}ul.cols_checklist input{vertical-align:middle;margin:2px 5px 2px 1px}li.cols_checklist_item{padding:4px;margin:0;}li.cols_checklist_item:hover{background-color:#335ea8;color:#fff}.cols_checklist_slc_item{background-color:#335ea8;color:#fff}
\ No newline at end of file
diff --git a/dist/tablefilter/style/filtersVisibility.css b/dist/tablefilter/style/filtersVisibility.css
new file mode 100644
index 00000000..bac6bf51
--- /dev/null
+++ b/dist/tablefilter/style/filtersVisibility.css
@@ -0,0 +1 @@
+span.expClpFlt a.btnExpClpFlt{width:35px;height:35px;display:inline-block;}span.expClpFlt a.btnExpClpFlt:hover{background-color:#f4f4f4}span.expClpFlt img{padding:8px 11px 11px 11px}
\ No newline at end of file
diff --git a/dist/tablefilter/style/tablefilter.css b/dist/tablefilter/style/tablefilter.css
new file mode 100644
index 00000000..75430855
--- /dev/null
+++ b/dist/tablefilter/style/tablefilter.css
@@ -0,0 +1 @@
+.activeHeader{background-color:#66afe9 !important;color:#fff !important}.activeCell{background-color:rgba(0,0,0,0.075)}.even{background-color:#fff}.odd{background-color:#f9f9f9}.ezActiveRow{background-color:#2852a8 !important;color:#fff}.ezSelectedRow{background-color:#316ac5 !important;color:#fff}.ezActiveCell{background-color:#d9e8fb !important;color:#000 !important;font-weight:bold}.ezETSelectedCell{background-color:#ffdc61 !important;font-weight:bold;color:#000 !important}.ezUnselectable{-moz-user-select:-moz-none;-khtml-user-select:none;-webkit-user-select:none;-o-user-select:none;user-select:none}.ezInputEditor{width:95%;height:auto;font-size:inherit;border:1px solid #aaccf6}.ezTextareaEditor{width:95%;height:35px;font-size:inherit;border:1px solid #aaccf6}.ezSelectEditor{width:100%;font-size:inherit;border:1px solid #aaccf6}.ezModifiedCell{background:transparent url("themes/bg_mod_cell.png") 0 0 no-repeat}select[multiple="multiple"].ezSelectEditor{height:35px}.ezCommandEditor{margin:2px;}.ezCommandEditor button,.ezCommandEditor input[type="button"]{min-height:22px;margin:1px;padding:3px;border:1px solid #ccc;background:#fff;border-radius:4px 4px 4px 4px;-moz-border-radius:4px 4px 4px 4px;}.ezCommandEditor button:hover,.ezCommandEditor input[type="button"]:hover{border:1px solid #999}.ezCommandEditor img{border:0;vertical-align:middle;margin:2px}.ezOpacity{opacity:.6}.alignLeft{text-align:left}.alignCenter{text-align:center}.alignRight{text-align:right}.div_checklist{width:100%;height:90px;line-height:30px;border:1px solid #f4f4f4;overflow:auto;text-align:left;background-color:#fff;color:#444;}.div_checklist ul.flt_checklist{padding:0 !important;margin:0 !important;list-style:none !important}.div_checklist li.flt_checklist_item{padding:1px !important;margin:0 !important;font-size:inherit;border-bottom:1px solid #f4f4f4 !important;}.div_checklist li.flt_checklist_item:hover{background-color:#335ea8 !important;color:#fff !important}.div_checklist label{display:block !important;font-weight:inherit !important}.div_checklist input{vertical-align:middle !important;margin:2px 5px 3px 1px !important}.flt_checklist_item_disabled{background-color:#e5e5e5}.flt_checklist_slc_item{background-color:#335ea8 !important;color:#fff !important}.fltrow{height:1em;background-color:#eaeaea;}.fltrow td{border-bottom:1px solid #ccc !important;border-top:1px solid #f4f4f4;border-left:1px solid #ccc;border-right:1px solid #f4f4f4;padding:.2em !important;}.fltrow td:last-child{border-right:1px solid #ccc}.btnflt{height:35px;font-family:inherit;font-size:inherit;vertical-align:middle;margin:0 2px 0 2px;padding:0 1px 0 1px}.btnflt_icon{font-family:inherit;font-size:inherit;width:35px;height:35px;cursor:pointer !important;border:0 !important;vertical-align:middle;background:transparent url("themes/btn_filter.png") center center no-repeat !important}.flt,.flt_s,.single_flt{font-family:inherit;font-size:inherit;display:block;color:#444;background-color:#fff;border:1px inset #f4f4f4;margin:0;padding:0 0 0 .2em;width:100%;height:35px;vertical-align:middle;border-radius:2px;box-sizing:border-box;}.flt:focus,.flt_s:focus,.single_flt:focus{border-color:#66afe9;outline:0 none;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6);box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6)}select.flt_multi{font-family:inherit;font-size:inherit;color:#444;background-color:#fff;border:1px solid #f4f4f4;margin:0;padding:.2em;width:100%;height:90px;vertical-align:middle;box-sizing:border-box;}select.flt_multi option{padding-top:5px;padding-bottom:5px}.flt_s{width:60%;box-sizing:initial;display:initial}.single_flt{width:70%;box-sizing:initial;display:initial}div.popUpFilter{position:relative;background:#fff;-webkit-box-shadow:3px 3px 2px #888;-moz-box-shadow:3px 3px 2px #888;box-shadow:3px 3px 2px #888;margin:30px auto 0 0;position:absolute;display:none;width:100px;background-color:#eaeaea;border:1px solid #eaeaea;padding:0}div.popUpFilter:after,div.popUpFilter:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}div.popUpFilter:after{border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:10px;margin-left:-10px}div.popUpFilter:before{border-color:rgba(255,255,255,0);border-bottom-color:#eaeaea;border-width:12px;margin-left:-12px}.popUpPlaceholder{position:relative}div.grd_Cont{-webkit-box-shadow:4px 4px 10px 0 rgba(50,50,50,0.75);-moz-box-shadow:4px 4px 10px 0 rgba(50,50,50,0.75);box-shadow:4px 4px 10px 0 rgba(50,50,50,0.75);width:800px;height:auto;overflow:hidden;background-color:#c8e0fb;border:1px solid #99bbe8;}div.grd_Cont .fltrow{background-color:transparent}div.grd_Cont .flt{border:1px solid #99bbe8;width:100%;}div.grd_Cont .flt :focus{border:1px solid #558dd9}div.grd_Cont .even{background-color:#fff}div.grd_Cont .odd{background-color:#dfe8f6}div.grd_Cont .no-results{background-color:transparent}div.grd_Cont .sort-arrow{position:initial}div.grd_tblCont{height:400px;width:800px;background:#fff;overflow-x:auto;overflow-y:scroll}div.grd_headTblCont{display:block;margin-right:20px;height:auto;overflow:hidden;border-bottom:1px solid #99bbe8;background-color:#c8e0fb}div.grd_tblCont table,div.grd_headTblCont table{border-collapse:collapse;table-layout:fixed;box-sizing:initial}div.grd_tblCont table th,div.grd_headTblCont table th,div.grd_headTblCont table td{height:35px;background-color:#c8e0fb;padding:.1em .5em;color:#333;border-right:1px solid #99bbe8 !important;overflow:hidden;text-overflow:ellipsis}div.grd_headTblCont table td{padding:.2em .2em}div.grd_tblCont table td{padding:.5em .7em;border-bottom:1px solid #99bbe8;overflow:hidden;text-overflow:ellipsis}.grd_inf{clear:both;width:auto;height:35px;background-color:#c8e0fb;margin:0;padding:1px 3px 1px 3px;border-top:1px solid #99bbe8;}.grd_inf a{color:#333;text-decoration:none;font-weight:bold;}.grd_inf a:hover{text-decoration:underline;background-color:transparent}.grd_inf input.reset:hover{background-color:transparent}.grd_inf .mdiv{width:40% !important}.grd_inf .ldiv div{border:0}.grd_inf .helpBtn{border:0 !important}.grd_inf div.status{position:absolute;float:none !important;height:auto !important;margin:19px 0 !important;font-size:12px;color:#333;border:0 !important}.grd_inf div.tot{border:0 !important}.helpBtn{display:inline-block;height:27px;margin:0;padding:8px 15px 0 15px;vertical-align:top;}.helpBtn:hover{background-color:#f4f4f4}div.helpCont{position:relative;background:#fff;-webkit-box-shadow:3px 3px 2px #888;-moz-box-shadow:3px 3px 2px #888;box-shadow:3px 3px 2px #888;position:absolute;display:none;width:300px;padding:10px;margin:45px 0 0 -150px;border:1px solid #ccc;line-height:20px;font-size:inherit;color:#333;background:#fff;text-align:left;}div.helpCont:after,div.helpCont:before{bottom:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}div.helpCont:after{border-color:rgba(255,255,255,0);border-bottom-color:#fff;border-width:10px;margin-left:-10px}div.helpCont:before{border-color:rgba(255,255,255,0);border-bottom-color:#ccc;border-width:12px;margin-left:-12px}div.helpCont a{color:#c00;text-decoration:underline;font-weight:normal}div.helpCont a.close{color:#333 !important;text-decoration:none !important;font-weight:bold;}div.helpCont a.close:hover{text-decoration:none}div.helpCont hr{border:1px solid #ccc}div.helpFooter{margin:10px 0 0 0;}div.helpFooter h4{margin:2px 2px 2px 2px;color:#333}span.keyword{font-weight:700;font-style:italic;border-bottom:1px dotted #ccc}.loader{position:absolute;padding:.5em .7em;margin:10em 0 0 3em;width:auto;z-index:1000;font-weight:600;background-color:#a7a7a8;vertical-align:middle;border-radius:10px;color:#fff;text-shadow:1px 1px #333}.no-results{display:none;color:#333;margin:0;padding:1em 0;text-align:center;max-height:5em;background-color:#f4f4f4}select.pgSlc{height:35px;margin:0;border:1px solid #f4f4f4;background-color:#fff;vertical-align:middle}select.pgSlc:focus{border-color:#66afe9;outline:0 none;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6);box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6)}input.pgNbInp{height:35px;margin:0;border:1px solid #f4f4f4;background-color:#fff;width:35px}input.pgNbInp:focus{border-color:#66afe9;outline:0 none;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6);box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6)}input.pgInp,.nextPage,.previousPage,.firstPage,.lastPage{height:35px;margin:0;border:1px solid #f4f4f4;background-color:#fff;vertical-align:middle;width:35px;border:0;font-weight:bold}input.pgInp:focus,.nextPage:focus,.previousPage:focus,.firstPage:focus,.lastPage:focus{border-color:#66afe9;outline:0 none;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6);box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6)}.nextPage{background:transparent url("themes/btn_next_page.gif") center center no-repeat !important;}.nextPage:hover{background-color:#f4f4f4 !important}.previousPage{background:transparent url("themes/btn_previous_page.gif") center center no-repeat !important;}.previousPage:hover{background-color:#f4f4f4 !important}.firstPage{background:transparent url("themes/btn_first_page.gif") center center no-repeat !important;}.firstPage:hover{background-color:#f4f4f4 !important}.lastPage{background:transparent url("themes/btn_last_page.gif") center center no-repeat !important;}.lastPage:hover{background-color:#f4f4f4 !important}span.nbpg{padding:0 5px}select.rspg{height:35px;margin:0;border:1px solid #f4f4f4;background-color:#fff;margin:0 0 0 5px;vertical-align:middle}select.rspg:focus{border-color:#66afe9;outline:0 none;-webkit-box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6);-moz-box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6);box-shadow:0 1px 1px rgba(0,0,0,0.075) inset,0 0 8px rgba(102,175,233,0.6)}span.rspgSpan{font-size:inherit}input.reset{display:inline-block;width:35px;height:35px;border:0;background:transparent url("themes/btn_clear_filters.png") center center no-repeat;vertical-align:top;}input.reset:hover{background-color:#f4f4f4}a.reset{font-weight:normal !important;line-height:35px;padding:5px 5px}div.tot{float:left;overflow:hidden;min-width:150px;height:100%;margin:0;padding:.5em;vertical-align:middle;}div.tot span{font-weight:500}.sort-arrow{position:absolute;display:none;width:11px;height:11px;margin:0;background-position:center center;background-repeat:no-repeat}.descending{display:inline;background-image:url("themes/downsimple.png")}.ascending{display:inline;background-image:url("themes/upsimple.png")}div.status{float:left;overflow:hidden;min-width:120px;height:100%;margin:0;padding:.5em;}div.status span{font-size:inherit}table.TF{font-family:inherit;border-spacing:0;border:0;}table.TF th{height:35px;margin:0;background-color:#eaeaea;border-bottom:1px solid #ccc;border-top:1px solid #f4f4f4;border-left:1px solid #ccc;border-right:1px solid #f4f4f4;padding:.1em .7em;color:#333;}table.TF th:last-child{border-right:1px solid #ccc}table.TF td{margin:0;padding:.5em .7em;border-bottom:1px solid #c6c6c6}table.TF.resp{display:block;overflow-x:auto;}table.TF.resp .sort-arrow{position:initial}.inf{clear:both;width:auto;height:35px;background-color:#fff;font-size:inherit;margin:0;padding:0;border-top:1px solid #ccc;border-bottom:1px solid #ccc;border-left:1px solid #ccc;border-right:1px solid #ccc;overflow:hidden;border-top-left-radius:3px;border-top-right-radius:3px;}.inf a{color:#333;text-decoration:none;font-weight:bold;box-sizing:initial;}.inf a:hover{text-decoration:underline}.ldiv{float:left;width:30%;position:inherit;text-align:left}.ldiv:empty:after{content:"\00A0"}.mdiv{float:left;width:38%;position:inherit;text-align:center;padding:0}.mdiv:empty:after{content:"\00A0"}.rdiv{float:right;width:30%;position:inherit;text-align:right}.rdiv:empty:after{content:"\00A0"}
\ No newline at end of file
diff --git a/dist/tablefilter/style/themes/default/default.css b/dist/tablefilter/style/themes/default/default.css
new file mode 100644
index 00000000..0a57c38b
--- /dev/null
+++ b/dist/tablefilter/style/themes/default/default.css
@@ -0,0 +1 @@
+table.TF{border-left:1px solid #ccc;border-top:none;border-right:none;border-bottom:none;}table.TF th{background:#ebecee url("images/bg_th.jpg") left top repeat-x;border-bottom:1px solid #d0d0d0;border-right:1px solid #d0d0d0;border-left:1px solid #fff;border-top:1px solid #fff;color:#333}table.TF td{border-bottom:1px dotted #999;padding:5px}.fltrow{background-color:#ebecee !important;}.fltrow th,.fltrow td{border-bottom:1px dotted #666 !important;padding:1px 3px 1px 3px !important}.flt,select.flt,select.flt_multi,.flt_s,.single_flt,.div_checklist{border:1px solid #999 !important}input.flt{width:99% !important}.inf{height:$min-height;background:#d7d7d7 url("images/bg_infDiv.jpg") 0 0 repeat-x !important}input.reset{background:transparent url("images/btn_eraser.gif") center center no-repeat !important}.helpBtn:hover{background-color:transparent}.nextPage{background:transparent url("images/btn_next_page.gif") center center no-repeat !important;}.nextPage:hover{background:transparent url("images/btn_over_next_page.gif") center center no-repeat !important}.previousPage{background:transparent url("images/btn_previous_page.gif") center center no-repeat !important;}.previousPage:hover{background:transparent url("images/btn_over_previous_page.gif") center center no-repeat !important}.firstPage{background:transparent url("images/btn_first_page.gif") center center no-repeat !important;}.firstPage:hover{background:transparent url("images/btn_over_first_page.gif") center center no-repeat !important}.lastPage{background:transparent url("images/btn_last_page.gif") center center no-repeat !important;}.lastPage:hover{background:transparent url("images/btn_over_last_page.gif") center center no-repeat !important}div.grd_Cont{background-color:#ebecee !important;border:1px solid #ccc !important;padding:0 !important;}div.grd_Cont .even{background-color:#fff}div.grd_Cont .odd{background-color:#d5d5d5}div.grd_headTblCont{background-color:#ebecee !important;border-bottom:none !important;}div.grd_headTblCont table{border-right:none !important}div.grd_tblCont table th,div.grd_headTblCont table th,div.grd_headTblCont table td{background:#ebecee url("images/bg_th.jpg") left top repeat-x !important;border-bottom:1px solid #d0d0d0 !important;border-right:1px solid #d0d0d0 !important;border-left:1px solid #fff !important;border-top:1px solid #fff !important}div.grd_tblCont table td{border-bottom:1px solid #999 !important}.grd_inf{background:#d7d7d7 url("images/bg_infDiv.jpg") 0 0 repeat-x !important;border-top:1px solid #d0d0d0 !important}.loader{border:1px solid #999}.defaultLoader{width:32px;height:32px;background:transparent url("images/img_loading.gif") 0 0 no-repeat !important}.even{background-color:#fff}.odd{background-color:#d5d5d5}span.expClpFlt a.btnExpClpFlt:hover{background-color:transparent !important}.activeHeader{background:#999 !important}
\ No newline at end of file
diff --git a/dist/tablefilter/style/themes/mytheme/mytheme.css b/dist/tablefilter/style/themes/mytheme/mytheme.css
new file mode 100644
index 00000000..fa91a66f
--- /dev/null
+++ b/dist/tablefilter/style/themes/mytheme/mytheme.css
@@ -0,0 +1 @@
+table.TF{border-left:1px dotted #81963b;border-top:none;border-right:0;border-bottom:none;}table.TF th{background:#39424b url("images/bg_headers.jpg") left top repeat-x;border-bottom:0;border-right:1px dotted #d0d0d0;border-left:0;border-top:0;color:#fff}table.TF td{border-bottom:1px dotted #81963b;border-right:1px dotted #81963b;padding:5px}.fltrow{background-color:#81963b !important;}.fltrow th,.fltrow td{border-bottom:1px dotted #39424b !important;border-right:1px dotted #fff !important;border-left:0 !important;border-top:0 !important;padding:1px 3px 1px 3px !important}.flt,select.flt,select.flt_multi,.flt_s,.single_flt,.div_checklist{border:1px solid #687830 !important}input.flt{width:99% !important}.inf{background:#d8d8d8;height:$min-height}input.reset{width:53px;background:transparent url("images/btn_filter.png") center center no-repeat !important}.helpBtn:hover{background-color:transparent}.nextPage{background:transparent url("images/btn_next_page.gif") center center no-repeat !important}.previousPage{background:transparent url("images/btn_previous_page.gif") center center no-repeat !important}.firstPage{background:transparent url("images/btn_first_page.gif") center center no-repeat !important}.lastPage{background:transparent url("images/btn_last_page.gif") center center no-repeat !important}div.grd_Cont{background:#81963b url("images/bg_headers.jpg") left top repeat-x !important;border:1px solid #ccc !important;padding:0 1px 1px 1px !important;}div.grd_Cont .even{background-color:#bccd83}div.grd_Cont .odd{background-color:#fff}div.grd_headTblCont{background-color:#ebecee !important;border-bottom:none !important}div.grd_tblCont table{border-right:none !important;}div.grd_tblCont table td{border-bottom:1px dotted #81963b;border-right:1px dotted #81963b}div.grd_tblCont table th,div.grd_headTblCont table th{background:transparent url("images/bg_headers.jpg") 0 0 repeat-x !important;border-bottom:0 !important;border-right:1px dotted #d0d0d0 !important;border-left:0 !important;border-top:0 !important;padding:0 4px 0 4px !important;color:#fff !important;height:35px !important}div.grd_headTblCont table td{border-bottom:1px dotted #39424b !important;border-right:1px dotted #fff !important;border-left:0 !important;border-top:0 !important;background-color:#81963b !important;padding:1px 3px 1px 3px !important}.grd_inf{background-color:#d8d8d8;border-top:1px solid #d0d0d0 !important}.loader{border:0 !important;background:#81963b !important}.defaultLoader{width:32px;height:32px;background:transparent url("images/img_loading.gif") 0 0 no-repeat !important}.even{background-color:#bccd83}.odd{background-color:#fff}span.expClpFlt a.btnExpClpFlt:hover{background-color:transparent !important}.activeHeader{background:#81963b !important}
\ No newline at end of file
diff --git a/dist/tablefilter/style/themes/skyblue/skyblue.css b/dist/tablefilter/style/themes/skyblue/skyblue.css
new file mode 100644
index 00000000..4aa04b2d
--- /dev/null
+++ b/dist/tablefilter/style/themes/skyblue/skyblue.css
@@ -0,0 +1 @@
+table.TF{padding:0;color:#000;border-right:1px solid #a4bed4;border-top:1px solid #a4bed4;border-left:1px solid #a4bed4;border-bottom:0;}table.TF th{margin:0;color:inherit;background:#d1e5fe url("images/bg_skyblue.gif") 0 0 repeat-x;border-color:#fdfdfd #a4bed4 #a4bed4 #fdfdfd;border-width:1px;border-style:solid}table.TF td{margin:0;padding:5px;color:inherit;border-bottom:1px solid #a4bed4;border-left:0;border-top:0;border-right:0}.fltrow{background-color:#d1e5fe !important;}.fltrow th,.fltrow td{padding:1px 3px 1px 3px !important}.flt,select.flt,select.flt_multi,.flt_s,.single_flt,.div_checklist{border:1px solid #a4bed4 !important}input.flt{width:99% !important}.inf{background-color:#e3efff !important;border:1px solid #a4bed4;height:$min-height;color:#004a6f}div.tot,div.status{border-right:0 !important}.helpBtn:hover{background-color:transparent}input.reset{background:transparent url("images/icn_clear_filters.png") center center no-repeat !important}.nextPage{background:transparent url("images/btn_next_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.nextPage:hover{background:#ffe4ab url("images/btn_next_page.gif") center center no-repeat !important;border:1px solid #ffb552 !important}.previousPage{background:transparent url("images/btn_prev_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.previousPage:hover{background:#ffe4ab url("images/btn_prev_page.gif") center center no-repeat !important;border:1px solid #ffb552 !important}.firstPage{background:transparent url("images/btn_first_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.firstPage:hover{background:#ffe4ab url("images/btn_first_page.gif") center center no-repeat !important;border:1px solid #ffb552 !important}.lastPage{background:transparent url("images/btn_last_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.lastPage:hover{background:#ffe4ab url("images/btn_last_page.gif") center center no-repeat !important;border:1px solid #ffb552 !important}.activeHeader{background:#ffe4ab !important;border:1px solid #ffb552 !important;color:inherit !important}div.grd_Cont{background-color:#d9eaed !important;border:1px solid #9cc !important;padding:0 !important;}div.grd_Cont .even{background-color:#fff}div.grd_Cont .odd{background-color:#e3efff}div.grd_headTblCont{background-color:#d9eaed !important;border-bottom:none !important}div.grd_tblCont table{border-right:none !important}div.grd_tblCont table th,div.grd_headTblCont table th,div.grd_headTblCont table td{background:#d9eaed url("images/bg_skyblue.gif") left top repeat-x;border-bottom:1px solid #a4bed4;border-right:1px solid #a4bed4 !important;border-left:1px solid #fff !important;border-top:1px solid #fff !important}div.grd_tblCont table td{border-bottom:1px solid #a4bed4 !important;border-right:0 !important;border-left:0 !important;border-top:0 !important}.grd_inf{background-color:#cce2fe;color:#004a6f;border-top:1px solid #9cc !important;}.grd_inf a{text-decoration:none;font-weight:bold}.loader{background-color:#2d8eef;border:1px solid #cce2fe;border-radius:5px}.even{background-color:#fff}.odd{background-color:#e3efff}span.expClpFlt a.btnExpClpFlt:hover{background-color:transparent !important}.ezActiveRow{background-color:#ffdc61 !important;color:inherit}.ezSelectedRow{background-color:#ffe4ab !important;color:inherit}.ezActiveCell{background-color:#fff !important;color:#000 !important;font-weight:bold}.ezETSelectedCell{background-color:#fff !important;font-weight:bold;color:#000 !important}
\ No newline at end of file
diff --git a/dist/tablefilter/style/themes/transparent/transparent.css b/dist/tablefilter/style/themes/transparent/transparent.css
new file mode 100644
index 00000000..f9c90a35
--- /dev/null
+++ b/dist/tablefilter/style/themes/transparent/transparent.css
@@ -0,0 +1 @@
+table.TF{padding:0;color:inherit;border-right:1px solid transparent;border-top:1px solid transparent;border-left:1px solid transparent;border-bottom:0;}table.TF th{margin:0;color:inherit;background-color:transparent;border-color:transparent;border-width:1px;border-style:solid;}table.TF th:last-child{border-right:1px solid transparent}table.TF td{margin:0;padding:5px;color:inherit;border-bottom:1px solid transparent;border-left:0;border-top:0;border-right:0}.fltrow{background-color:transparent;}.fltrow th,.fltrow td{padding:1px 3px 1px 3px;border-bottom:1px solid transparent !important;}.fltrow th:last-child,.fltrow td:last-child{border-right:1px solid transparent}.flt,select.flt,select.flt_multi,.flt_s,.single_flt,.div_checklist{border:1px solid #a4bed4}input.flt{width:99% !important}.inf{background-color:transparent;border:1px solid transparent;height:$min-height;color:inherit}div.tot,div.status{border-right:0 !important}.helpBtn:hover{background-color:transparent}input.reset{background:transparent url("images/icn_clear_filters.png") center center no-repeat !important}.nextPage{background:transparent url("images/btn_next_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.nextPage:hover{background:#f7f7f7 url("images/btn_next_page.gif") center center no-repeat !important;border:1px solid #f7f7f7 !important}.previousPage{background:transparent url("images/btn_prev_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.previousPage:hover{background:#f7f7f7 url("images/btn_prev_page.gif") center center no-repeat !important;border:1px solid #f7f7f7 !important}.firstPage{background:transparent url("images/btn_first_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.firstPage:hover{background:#f7f7f7 url("images/btn_first_page.gif") center center no-repeat !important;border:1px solid #f7f7f7 !important}.lastPage{background:transparent url("images/btn_last_page.gif") center center no-repeat !important;border:1px solid transparent !important;}.lastPage:hover{background:#f7f7f7 url("images/btn_last_page.gif") center center no-repeat !important;border:1px solid #f7f7f7 !important}.activeHeader{background:#f7f7f7 !important;border:1px solid transparent;color:inherit !important}div.grd_Cont{-webkit-box-shadow:0 0 0 0 rgba(50,50,50,0.75);-moz-box-shadow:0 0 0 0 rgba(50,50,50,0.75);box-shadow:0 0 0 0 rgba(50,50,50,0.75);background-color:transparent;border:1px solid transparent;padding:0 !important;}div.grd_Cont .even{background-color:transparent}div.grd_Cont .odd{background-color:#f7f7f7}div.grd_headTblCont{background-color:transparent;border-bottom:none !important}div.grd_tblCont table{border-right:none !important}div.grd_tblCont table th,div.grd_headTblCont table th,div.grd_headTblCont table td{background:transparent;border-bottom:1px solid transparent;border-right:1px solid transparent !important;border-left:1px solid transparent;border-top:1px solid transparent}div.grd_tblCont table td{border-bottom:1px solid transparent;border-right:0 !important;border-left:0 !important;border-top:0 !important}.grd_inf{background-color:transparent;color:inherit;border-top:1px solid transparent;}.grd_inf a{text-decoration:none;font-weight:bold}.loader{background-color:#f7f7f7;border:1px solid #f7f7f7;border-radius:5px;color:#000;text-shadow:none}.even{background-color:transparent}.odd{background-color:#f7f7f7}span.expClpFlt a.btnExpClpFlt:hover{background-color:transparent !important}.ezActiveRow{background-color:#ccc !important;color:inherit}.ezSelectedRow{background-color:#ccc !important;color:inherit}.ezActiveCell{background-color:transparent;color:inherit;font-weight:bold}.ezETSelectedCell{background-color:transparent;font-weight:bold;color:inherit}
\ No newline at end of file
diff --git a/dist/tablefilter/tf-0-cc64807d737bad8510b3.js b/dist/tablefilter/tf-0-cc64807d737bad8510b3.js
new file mode 100644
index 00000000..a3e427d0
--- /dev/null
+++ b/dist/tablefilter/tf-0-cc64807d737bad8510b3.js
@@ -0,0 +1,2 @@
+(window.webpackJsonp=window.webpackJsonp||[]).push([[0],{440:function(t,e,n){var r={"./array":69,"./array.js":69,"./const":15,"./const.js":15,"./cookie":120,"./cookie.js":120,"./dom":10,"./dom.js":10,"./emitter":127,"./emitter.js":127,"./event":19,"./event.js":19,"./extensions/advancedGrid/adapterEzEditTable":442,"./extensions/advancedGrid/adapterEzEditTable.js":442,"./extensions/advancedGrid/advancedGrid":447,"./extensions/advancedGrid/advancedGrid.js":447,"./extensions/colOps/colOps":446,"./extensions/colOps/colOps.js":446,"./extensions/colsVisibility/colsVisibility":445,"./extensions/colsVisibility/colsVisibility.js":445,"./extensions/filtersVisibility/filtersVisibility":444,"./extensions/filtersVisibility/filtersVisibility.js":444,"./extensions/sort/adapterSortabletable":441,"./extensions/sort/adapterSortabletable.js":441,"./extensions/sort/sort":443,"./extensions/sort/sort.js":443,"./feature":11,"./feature.js":11,"./modules/alternateRows":111,"./modules/alternateRows.js":111,"./modules/baseDropdown":70,"./modules/baseDropdown.js":70,"./modules/checkList":108,"./modules/checkList.js":108,"./modules/clearButton":112,"./modules/clearButton.js":112,"./modules/dateType":125,"./modules/dateType.js":125,"./modules/dropdown":126,"./modules/dropdown.js":126,"./modules/gridLayout":119,"./modules/gridLayout.js":119,"./modules/hash":122,"./modules/hash.js":122,"./modules/help":124,"./modules/help.js":124,"./modules/highlightKeywords":117,"./modules/highlightKeywords.js":117,"./modules/loader":118,"./modules/loader.js":118,"./modules/markActiveColumns":115,"./modules/markActiveColumns.js":115,"./modules/noResults":110,"./modules/noResults.js":110,"./modules/paging":109,"./modules/paging.js":109,"./modules/popupFilter":116,"./modules/popupFilter.js":116,"./modules/rowsCounter":114,"./modules/rowsCounter.js":114,"./modules/state":123,"./modules/state.js":123,"./modules/statusBar":113,"./modules/statusBar.js":113,"./modules/storage":121,"./modules/storage.js":121,"./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":128,"./tablefilter.js":128,"./types":3,"./types.js":3};function i(t){var e=o(t);return n(e)}function o(t){var e=r[t];if(!(e+1)){var n=new Error('Cannot find module "'+t+'".');throw n.code="MODULE_NOT_FOUND",n}return e}i.keys=function(){return Object.keys(r)},i.resolve=o,t.exports=i,i.id=440},441:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n0){var i=t.triggerIds;e=[],n=i.length;for(var o=0;o0&&function(){for(var e=t.triggerIds,n=0;nr.length;)r="0"+r;e[n]=r}return e.join(".")}function f(t,e){var n=h(t.value.toLowerCase()),r=h(e.value.toLowerCase());return n===r?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 s=0,a=0;if(i){var l=function(e,n,r){var i=e.Selection,o=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?(s=l.indexOf(u.rowIndex),a=u.rowIndex):(p=34===h?s+m<=d-1?l[s+m]:[d-1]:s-m<=l[0]?l[0]:l[s-m],a=p,s=l.indexOf(p),o(p));else{if(u.rowIndex>a)if(u.rowIndex>=l[d-1])p=l[d-1];else{var g=s+m;p=g>d-1?l[d-1]:l[g]}else if(u.rowIndex<=l[0])p=l[0];else{var v=l[s-m];p=v||l[0]}a=u.rowIndex,o(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")._ezEditTable.Selection,n=e.GetActiveRow();n&&n.scrollIntoView(!1);var r=e.GetActiveCell();r&&r.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;l(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;l(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)===s.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}();e.default=d},443:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,i=n(441),o=(r=i)&&r.__esModule?r:{default:r};n(16).root.SortableTable||n(450),e.default=o.default},444:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var n=0;n',r.icnCollapseHtml='Collapse filters',r.defaultText="Toggle filters",r.targetId=n.target_id||null,r.enableIcon=(0,l.defaultsBool)(n.enable_icon,!0),r.btnText=(0,l.defaultsStr)(n.btn_text,""),r.collapseBtnHtml=r.enableIcon?r.icnCollapseHtml+r.btnText:r.btnText||r.defaultText,r.expandBtnHtml=r.enableIcon?r.icnExpandHtml+r.btnText:r.btnText||r.defaultText,r.btnHtml=(0,l.defaultsStr)(n.btn_html,null),r.btnCssClass=(0,l.defaultsStr)(n.btn_css_class,"btnExpClpFlt"),r.contCssClass=(0,l.defaultsStr)(n.cont_css_class,"expClpFlt"),r.filtersRowIndex=(0,l.defaultsNb)(n.filters_row_index,t.getFiltersRowIndex()),r.visibleAtStart=(0,l.defaultsNb)(n.visible_at_start,!0),r.toolbarPosition=(0,l.defaultsStr)(n.toolbar_position,d.RIGHT),r.onBeforeShow=(0,l.defaultsFn)(n.on_before_show,s.EMPTY_FN),r.onAfterShow=(0,l.defaultsFn)(n.on_after_show,s.EMPTY_FN),r.onBeforeHide=(0,l.defaultsFn)(n.on_before_hide,s.EMPTY_FN),r.onAfterHide=(0,l.defaultsFn)(n.on_after_hide,s.EMPTY_FN),t.import(n.name+"Style",t.getStylePath()+r.stylesheet,null,"link"),r.enable(),r}return function(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)}(e,i.Feature),r(e,[{key:"init",value:function(){var t=this;this.initialized||(this.emitter.emit("initializing-extension",this,!(0,s.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,o.createElm)("span");n.className=this.contCssClass;var r=this.targetId?(0,o.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 s=void 0;this.btnHtml?(n.innerHTML=this.btnHtml,s=n.firstChild):((s=(0,o.createElm)("a",["href","javascript:void(0);"])).className=this.btnCssClass,s.title=this.btnText||this.defaultText,s.innerHTML=this.collapseBtnHtml,n.appendChild(s)),(0,a.addEvt)(s,"click",function(){return t.toggle()}),this.contEl=n,this.btnEl=s,this.visibleAtStart||this.toggle()}},{key:"toggle",value:function(){var t=this.tf,e=""===(t.gridLayout?t.feature("gridLayout").headTbl:t.dom()).rows[this.filtersRowIndex].style.display;this.show(!e)}},{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()).rows[this.filtersRowIndex];t&&this.onBeforeShow(this),t||this.onBeforeHide(this),n.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,o.removeElm)(this.btnEl),this.btnEl=null,this.contEl.innerHTML="",(0,o.removeElm)(this.contEl),this.contEl=null,this.initialized=!1)}}]),e}();e.default=u},445:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r=function(){function t(t,e){for(var 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,l.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,a.isEmpty)(n)?r:r.toFixed(n)}},{key:"calcSum",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[];return(0,a.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,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=e.length;return 4*(t=Math.floor(n/4))===n?(Number(e[t-1])+Number(e[t]))/2:Number(e[t])}},{key:"calcQ3",value:function(){var t,e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:[],n=e.length,r=0;return 4*(t=Math.floor(n/4))===n?(r=3*t,(Number(e[r])+Number(e[r-1]))/2):Number(e[n-t-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,s.elm)(e);if(o)switch(t=t.toFixed(r),t=isNaN(t)||!isFinite(t)?"":(0,c.default)(i)(t),n.toLowerCase()){case"innerhtml":o.innerHTML=t;break;case"setvalue":o.value=t;break;case"createtextnode":var a=o.firstChild,l=(0,s.createText)(t);o.replaceChild(l,a)}}},{key:"configureFormat",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=this.tf;if(n.hasType(t,[d.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(f,function(){return t.calcAll()}),this.initialized=!1)}}]),e}();e.default=p},447:function(t,e,n){"use strict";Object.defineProperty(e,"__esModule",{value:!0});var r,i=n(442),o=(r=i)&&r.__esModule?r:{default:r};e.default=o.default},448: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'},449:function(t,e){t.exports=function(t){function e(t){"undefined"!=typeof console&&(console.error||console.log)("[Script Loader]",t)}try{"undefined"!=typeof execScript&&"undefined"!=typeof attachEvent&&"undefined"==typeof addEventListener?execScript(t):"undefined"!=typeof eval?eval.call(null,t):e("EvalError: No eval function available")}catch(t){e(t)}}},450:function(t,e,n){n(449)(n(448))},451:function(t,e){function n(t){if((t=t||{}).negativeType=t.negativeType||("R"===t.negative?"right":"left"),"string"!=typeof t.negativeLeftSymbol)switch(t.negativeType){case"left":t.negativeLeftSymbol="-";break;case"brackets":t.negativeLeftSymbol="(";break;default:t.negativeLeftSymbol=""}if("string"!=typeof t.negativeRightSymbol)switch(t.negativeType){case"right":t.negativeRightSymbol="-";break;case"brackets":t.negativeRightSymbol=")";break;default:t.negativeRightSymbol=""}function e(e,n){if(n=n||{},!e&&0!==e)return"";var r=[],i="-"===(e=""+e).charAt(0);return e=e.replace(/^\-/g,""),t.negativeLeftOut||n.noUnits||r.push(t.prefix),i&&r.push(t.negativeLeftSymbol),t.negativeLeftOut&&!n.noUnits&&r.push(t.prefix),e=e.split("."),null!=t.round&&function(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=r+(n=+n+1+"")).length>e&&(t[0]=+t[0]+ +n.charAt(0)+"",n=n.substring(1))}t[1]=n}}(e,t.round),null!=t.truncate&&(e[1]=function(t,e){t&&(t+="");return t&&t.length>e?t.substr(0,e):t}(e[1],t.truncate)),t.padLeft>0&&(e[0]=function(t,e){t+="";var n=[];for(;n.length+t.length0&&(e[1]=function(t,e){t?t+="":t="";var n=[];for(;n.length+t.length 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","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","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","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","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","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","import AdapterEzEditTable from './adapterEzEditTable';\r\n\r\nexport default AdapterEzEditTable;","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\tMIT License http://www.opensource.org/licenses/mit-license.php\n\tAuthor Tobias Koppers @sokra\n*/\nmodule.exports = function(src) {\n\tfunction log(error) {\n\t\t(typeof console !== \"undefined\")\n\t\t&& (console.error || console.log)(\"[Script Loader]\", error);\n\t}\n\n\t// Check for IE =< 8\n\tfunction isIE() {\n\t\treturn typeof attachEvent !== \"undefined\" && typeof addEventListener === \"undefined\";\n\t}\n\n\ttry {\n\t\tif (typeof execScript !== \"undefined\" && isIE()) {\n\t\t\texecScript(src);\n\t\t} else if (typeof eval !== \"undefined\") {\n\t\t\teval.call(null, src);\n\t\t} else {\n\t\t\tlog(\"EvalError: No eval function available\");\n\t\t}\n\t} catch (error) {\n\t\tlog(error);\n\t}\n}\n","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\"))","\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"],"sourceRoot":""}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
index e8b4ca33..6ee73d3d 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -5761,19 +5761,6 @@
         "file-sync-cmp": "0.1.1"
       }
     },
-    "grunt-contrib-stylus": {
-      "version": "1.2.0",
-      "resolved": "https://registry.npmjs.org/grunt-contrib-stylus/-/grunt-contrib-stylus-1.2.0.tgz",
-      "integrity": "sha1-R9RG7wVESW7/naQY0A9XdFQ0crs=",
-      "dev": true,
-      "requires": {
-        "async": "1.5.2",
-        "chalk": "1.1.3",
-        "lodash": "4.17.4",
-        "nib": "1.1.2",
-        "stylus": "0.54.5"
-      }
-    },
     "grunt-contrib-watch": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-1.0.0.tgz",
@@ -7833,12 +7820,6 @@
       "integrity": "sha1-soqmKIorn8ZRA1x3EfZathkDMaY=",
       "dev": true
     },
-    "lodash.clonedeep": {
-      "version": "4.5.0",
-      "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz",
-      "integrity": "sha1-4j8/nE+Pvd6HJSnBBxhXoIblzO8=",
-      "dev": true
-    },
     "lodash.defaults": {
       "version": "4.2.0",
       "resolved": "https://registry.npmjs.org/lodash.defaults/-/lodash.defaults-4.2.0.tgz",
@@ -8550,15 +8531,6 @@
       "integrity": "sha1-drHIIxMMyias+6zMj7rwovozsY8=",
       "dev": true
     },
-    "nib": {
-      "version": "1.1.2",
-      "resolved": "https://registry.npmjs.org/nib/-/nib-1.1.2.tgz",
-      "integrity": "sha1-amnt5AgblcDe+L4CSkyK4MLLtsc=",
-      "dev": true,
-      "requires": {
-        "stylus": "0.54.5"
-      }
-    },
     "nice-try": {
       "version": "1.0.4",
       "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.4.tgz",
@@ -11722,16 +11694,6 @@
       "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
       "dev": true
     },
-    "style-loader": {
-      "version": "0.20.3",
-      "resolved": "https://registry.npmjs.org/style-loader/-/style-loader-0.20.3.tgz",
-      "integrity": "sha512-2I7AVP73MvK33U7B9TKlYZAqdROyMXDYSMvHLX43qy3GCOaJNiV6i0v/sv9idWIaQ42Yn2dNv79Q5mKXbKhAZg==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "1.1.0",
-        "schema-utils": "0.4.5"
-      }
-    },
     "stylus": {
       "version": "0.54.5",
       "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.54.5.tgz",
@@ -11777,17 +11739,6 @@
         }
       }
     },
-    "stylus-loader": {
-      "version": "3.0.2",
-      "resolved": "https://registry.npmjs.org/stylus-loader/-/stylus-loader-3.0.2.tgz",
-      "integrity": "sha512-+VomPdZ6a0razP+zinir61yZgpw2NfljeSsdUF5kJuEzlo3khXhY19Fn6l8QQz1GRJGtMCo8nG5C04ePyV7SUA==",
-      "dev": true,
-      "requires": {
-        "loader-utils": "1.1.0",
-        "lodash.clonedeep": "4.5.0",
-        "when": "3.6.4"
-      }
-    },
     "sugar-core": {
       "version": "2.0.4",
       "resolved": "https://registry.npmjs.org/sugar-core/-/sugar-core-2.0.4.tgz",
@@ -13430,12 +13381,6 @@
         "tr46": "0.0.3"
       }
     },
-    "when": {
-      "version": "3.6.4",
-      "resolved": "https://registry.npmjs.org/when/-/when-3.6.4.tgz",
-      "integrity": "sha1-RztRfsFZ4rhQBUl6E5g/CVQS404=",
-      "dev": true
-    },
     "whet.extend": {
       "version": "0.9.9",
       "resolved": "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz",
diff --git a/package.json b/package.json
index fe1f05d3..8205cbd4 100644
--- a/package.json
+++ b/package.json
@@ -59,7 +59,6 @@
     "grunt-contrib-clean": "^1.1.0",
     "grunt-contrib-connect": "^1.0.2",
     "grunt-contrib-copy": "^1.0.0",
-    "grunt-contrib-stylus": "^1.2.0",
     "grunt-contrib-watch": "^1.0.0",
     "grunt-gh-pages": "^2.0.0",
     "grunt-qunit-istanbul": "1.0.0",
@@ -68,9 +67,7 @@
     "isparta-loader": "2.0.0",
     "script-loader": "^0.7.0",
     "string-replace-webpack-plugin": "^0.1.3",
-    "style-loader": "0.20.3",
     "stylus": "^0.54.5",
-    "stylus-loader": "^3.0.2",
     "sugar-date": "2.0.4",
     "webpack": "^4.0.1",
     "webpack-cli": "^2.0.10",
diff --git a/static/style/tablefilter.styl b/static/style/tablefilter.styl
new file mode 100644
index 00000000..4cd028f5
--- /dev/null
+++ b/static/style/tablefilter.styl
@@ -0,0 +1,18 @@
+/** Main stylesheet */
+@import 'active-header'
+@import 'alternating-rows'
+@import 'ezedittable'
+@import 'filter-checklist'
+@import 'filters'
+@import 'grid-layout'
+@import 'help'
+@import 'keyword'
+@import 'loader'
+@import 'noresults'
+@import 'paging'
+@import 'reset-button'
+@import 'rows-counter'
+@import 'sort'
+@import 'status-bar'
+@import 'table'
+@import 'toolbar'
diff --git a/webpack.config.js b/webpack.config.js
index ba795924..da8ee9f0 100644
--- a/webpack.config.js
+++ b/webpack.config.js
@@ -2,7 +2,6 @@ const webpack = require('webpack');
 const path = require('path');
 const Clean = require('clean-webpack-plugin');
 const StringReplacePlugin = require('string-replace-webpack-plugin');
-// const ExtractTextPlugin = require('extract-text-webpack-plugin');
 const fs = require('fs');
 const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8'));
 
@@ -51,22 +50,7 @@ module.exports = {
                         }
                     }]
                 })
-            }/*, {
-                // compile and extract all css definitions from stylus files
-                test: /\.(styl)$/,
-                use: ExtractTextPlugin.extract({
-                    fallback: 'style-loader',
-                    use: [{
-                        loader: 'css-loader',
-                        options: {
-                            url: false,
-                            minimize: true
-                        },
-                    }, {
-                        loader: 'stylus-loader'
-                    }]
-                })
-            }*/
+            }
         ]
     },
     devtool: 'source-map',
@@ -80,13 +64,6 @@ module.exports = {
         new webpack.optimize.MinChunkSizePlugin({
             minChunkSize: 10000
         }),
-        // extract all styling definitions in a CSS bundle
-        // with a unique filename
-        // new ExtractTextPlugin({
-        //     // relative to `output.path`
-        //     filename: './tablefilter.css'/*,
-        //     allChunks: true*/
-        // }),
         new webpack.BannerPlugin({
             banner: '/** \n' +
             ' *\t '+pkg.name+' v'+pkg.version+' by '+pkg.author.name+'\n' +