diff --git a/package.json b/package.json index c43328c0..78b36e2c 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "tablefilter", - "version": "0.2.11", + "version": "0.2.12", "description": "A Javascript library making HTML tables filterable and a bit more", "license": "MIT", "author": { diff --git a/src/extensions/colsVisibility/colsVisibility.js b/src/extensions/colsVisibility/colsVisibility.js index 1bb15a98..45d7f8bc 100644 --- a/src/extensions/colsVisibility/colsVisibility.js +++ b/src/extensions/colsVisibility/colsVisibility.js @@ -2,17 +2,17 @@ import Dom from '../../dom'; import Types from '../../types'; import Event from '../../event'; -export default class ColsVisibility{ +export default class ColsVisibility { /** * Columns Visibility extension * @param {Object} tf TableFilter instance - * @param {Object} f Config + * @param {Object} f Extension's configuration */ - constructor(tf, f){ + constructor(tf, f) { // Configuration object - var cfg = tf.config(); + let cfg = tf.config(); this.initialized = false; this.name = f.name; @@ -26,9 +26,9 @@ export default class ColsVisibility{ this.contEl = null; //tick to hide or show column - this.tickToHide = f.tick_to_hide===false ? false : true; + this.tickToHide = f.tick_to_hide === false ? false : true; //enables/disables cols manager generation - this.manager = f.manager===false ? false : true; + this.manager = f.manager === false ? false : true; //only if external headers this.headersTbl = f.headers_table || false; //only if external headers @@ -60,7 +60,7 @@ export default class ColsVisibility{ //defines css class div containing show/hide cols this.contCssClass = f.cont_css_class || 'colVisCont'; //defines css class for cols list (ul) - this.listCssClass = cfg.list_css_class ||'cols_checklist'; + this.listCssClass = cfg.list_css_class || 'cols_checklist'; //defines css class for list item (li) this.listItemCssClass = cfg.checklist_item_css_class || 'cols_checklist_item'; @@ -78,7 +78,7 @@ export default class ColsVisibility{ //array containing hidden columns indexes this.hiddenCols = []; - this.tblHasColTag = (Dom.tag(tf.tbl,'col').length > 0); + this.tblHasColTag = (Dom.tag(tf.tbl, 'col').length > 0); //callback invoked just after cols manager is loaded this.onLoaded = Types.isFn(f.on_loaded) ? f.on_loaded : null; @@ -108,125 +108,129 @@ export default class ColsVisibility{ f.on_after_col_displayed : null; //Grid layout compatibility - if(tf.gridLayout){ + if (tf.gridLayout) { this.headersTbl = tf.feature('gridLayout').headTbl; //headers table this.headersIndex = 0; //headers index - this.onAfterColDisplayed = function(){}; - this.onAfterColHidden = function(){}; + this.onAfterColDisplayed = function () { }; + this.onAfterColHidden = function () { }; } //Loads extension stylesheet - tf.import(f.name+'Style', tf.stylePath + this.stylesheet, null, 'link'); + tf.import(f.name + 'Style', tf.stylePath + this.stylesheet, null, + 'link'); this.tf = tf; + this.emitter = tf.emitter; } - toggle(){ - var contDisplay = this.contEl.style.display; - var onBeforeOpen = this.onBeforeOpen; - var onBeforeClose = this.onBeforeClose; - var onAfterOpen = this.onAfterOpen; - var onAfterClose = this.onAfterClose; + toggle() { + let contDisplay = this.contEl.style.display; + let onBeforeOpen = this.onBeforeOpen; + let onBeforeClose = this.onBeforeClose; + let onAfterOpen = this.onAfterOpen; + let onAfterClose = this.onAfterClose; - if(onBeforeOpen && contDisplay !== 'inline'){ + if (onBeforeOpen && contDisplay !== 'inline') { onBeforeOpen.call(null, this); } - if(onBeforeClose && contDisplay === 'inline'){ + if (onBeforeClose && contDisplay === 'inline') { onBeforeClose.call(null, this); } this.contEl.style.display = contDisplay === 'inline' ? 'none' : 'inline'; - if(onAfterOpen && contDisplay !== 'inline'){ + if (onAfterOpen && contDisplay !== 'inline') { onAfterOpen.call(null, this); } - if(onAfterClose && contDisplay === 'inline'){ + if (onAfterClose && contDisplay === 'inline') { onAfterClose.call(null, this); } } - checkItem(lbl){ - var li = lbl.parentNode; - if(!li || !lbl){ + checkItem(lbl) { + let li = lbl.parentNode; + if (!li || !lbl) { return; } - var isChecked = lbl.firstChild.checked; - var colIndex = lbl.firstChild.getAttribute('id').split('_')[1]; + let isChecked = lbl.firstChild.checked; + let colIndex = lbl.firstChild.getAttribute('id').split('_')[1]; colIndex = parseInt(colIndex, 10); - if(isChecked){ + if (isChecked) { Dom.addClass(li, this.listSlcItemCssClass); } else { Dom.removeClass(li, this.listSlcItemCssClass); } - var hide = false; - if((this.tickToHide && isChecked) || (!this.tickToHide && !isChecked)){ + let hide = false; + if ((this.tickToHide && isChecked) || + (!this.tickToHide && !isChecked)) { hide = true; } this.setHidden(colIndex, hide); } - init(){ - if(!this.manager){ + init() { + if (!this.manager) { return; } this.buildBtn(); this.buildManager(); this.initialized = true; + this.emitter.emit('colsVisibility-initialized', tf, this); } /** * Build main button UI */ - buildBtn(){ - if(this.btnEl){ + buildBtn() { + if (this.btnEl) { return; } - var tf = this.tf; - var span = Dom.create('span', ['id', this.prfx+tf.id]); + let tf = this.tf; + let span = Dom.create('span', ['id', this.prfx + tf.id]); span.className = this.spanCssClass; //Container element (rdiv or custom element) - if(!this.btnTgtId){ + if (!this.btnTgtId) { tf.setToolbar(); } - var targetEl = !this.btnTgtId ? tf.rDiv : Dom.id(this.btnTgtId); + let targetEl = !this.btnTgtId ? tf.rDiv : Dom.id(this.btnTgtId); - if(!this.btnTgtId){ - var firstChild = targetEl.firstChild; + if (!this.btnTgtId) { + let firstChild = targetEl.firstChild; firstChild.parentNode.insertBefore(span, firstChild); } else { targetEl.appendChild(span); } - if(!this.btnHtml){ - var btn = Dom.create('a', ['href','javascript:;']); + if (!this.btnHtml) { + let btn = Dom.create('a', ['href', 'javascript:;']); btn.className = this.btnCssClass; btn.title = this.desc; btn.innerHTML = this.btnText; span.appendChild(btn); - if(!this.enableHover){ - Event.add(btn, 'click', (evt)=> { this.toggle(evt); }); + if (!this.enableHover) { + Event.add(btn, 'click', (evt) => this.toggle(evt)); } else { - Event.add(btn, 'mouseover', (evt)=> { this.toggle(evt); }); + Event.add(btn, 'mouseover', (evt) => this.toggle(evt)); } } else { //Custom html span.innerHTML = this.btnHtml; - var colVisEl = span.firstChild; - if(!this.enableHover){ - Event.add(colVisEl, 'click', (evt)=> { this.toggle(evt); }); + let colVisEl = span.firstChild; + if (!this.enableHover) { + Event.add(colVisEl, 'click', (evt) => this.toggle(evt)); } else { - Event.add(colVisEl, 'mouseover', (evt)=> { this.toggle(evt); }); + Event.add(colVisEl, 'mouseover', (evt) => this.toggle(evt)); } } this.spanEl = span; this.btnEl = this.spanEl.firstChild; - if(this.onLoaded){ + if (this.onLoaded) { this.onLoaded.call(null, this); } } @@ -234,40 +238,40 @@ export default class ColsVisibility{ /** * Build columns manager UI */ - buildManager(){ - var tf = this.tf; + buildManager() { + let tf = this.tf; - var container = !this.contElTgtId ? - Dom.create('div', ['id', this.prfxCont+tf.id]) : + let container = !this.contElTgtId ? + Dom.create('div', ['id', this.prfxCont + tf.id]) : Dom.id(this.contElTgtId); container.className = this.contCssClass; //Extension description - var extNameLabel = Dom.create('p'); + let extNameLabel = Dom.create('p'); extNameLabel.innerHTML = this.text; container.appendChild(extNameLabel); //Headers list - var ul = Dom.create('ul' ,['id', 'ul'+this.name+'_'+tf.id]); + let ul = Dom.create('ul', ['id', 'ul' + this.name + '_' + tf.id]); ul.className = this.listCssClass; - var tbl = this.headersTbl ? this.headersTbl : tf.tbl; - var headerIndex = this.headersTbl ? + let tbl = this.headersTbl ? this.headersTbl : tf.tbl; + let headerIndex = this.headersTbl ? this.headersIndex : tf.getHeadersRowIndex(); - var headerRow = tbl.rows[headerIndex]; + let headerRow = tbl.rows[headerIndex]; //Tick all option - if(this.enableTickAll){ - var li = Dom.createCheckItem( - 'col__'+tf.id, this.tickAllText, this.tickAllText); + if (this.enableTickAll) { + let li = Dom.createCheckItem( + 'col__' + tf.id, this.tickAllText, this.tickAllText); Dom.addClass(li, this.listItemCssClass); ul.appendChild(li); li.check.checked = !this.tickToHide; - Event.add(li.check, 'click', ()=> { - for(var h = 0; h < headerRow.cells.length; h++){ - var itm = Dom.id('col_'+h+'_'+tf.id); - if(itm && li.check.checked !== itm.checked){ + Event.add(li.check, 'click', () => { + for (let h = 0; h < headerRow.cells.length; h++) { + let itm = Dom.id('col_' + h + '_' + tf.id); + if (itm && li.check.checked !== itm.checked) { itm.click(); itm.checked = li.check.checked; } @@ -275,42 +279,42 @@ export default class ColsVisibility{ }); } - for(var i = 0; i < headerRow.cells.length; i++){ - var cell = headerRow.cells[i]; - var cellText = this.headersText && this.headersText[i] ? + for (let i = 0; i < headerRow.cells.length; i++) { + let cell = headerRow.cells[i]; + let cellText = this.headersText && this.headersText[i] ? this.headersText[i] : this._getHeaderText(cell); - var liElm = Dom.createCheckItem( - 'col_'+i+'_'+tf.id, cellText, cellText); + let liElm = Dom.createCheckItem( + 'col_' + i + '_' + tf.id, cellText, cellText); Dom.addClass(liElm, this.listItemCssClass); - if(!this.tickToHide){ + if (!this.tickToHide) { Dom.addClass(liElm, this.listSlcItemCssClass); } ul.appendChild(liElm); - if(!this.tickToHide){ + if (!this.tickToHide) { liElm.check.checked = true; } - Event.add(liElm.check, 'click', (evt)=> { - var elm = Event.target(evt); - var lbl = elm.parentNode; + Event.add(liElm.check, 'click', (evt) => { + let elm = Event.target(evt); + let lbl = elm.parentNode; this.checkItem(lbl); }); } //separator - var p = Dom.create('p', ['align','center']); - var btn; + let p = Dom.create('p', ['align', 'center']); + let btn; //Close link - if(!this.btnCloseHtml){ - btn = Dom.create('a', ['href','javascript:;']); + if (!this.btnCloseHtml) { + btn = Dom.create('a', ['href', 'javascript:;']); btn.className = this.btnCloseCssClass; btn.innerHTML = this.btnCloseText; - Event.add(btn, 'click', (evt)=> { this.toggle(evt); }); + Event.add(btn, 'click', (evt) => this.toggle(evt)); p.appendChild(btn); } else { p.innerHTML = this.btnCloseHtml; btn = p.firstChild; - Event.add(btn, 'click', (evt)=> { this.toggle(evt); }); + Event.add(btn, 'click', (evt) => this.toggle(evt)); } container.appendChild(ul); @@ -319,11 +323,11 @@ export default class ColsVisibility{ this.btnEl.parentNode.insertBefore(container, this.btnEl); this.contEl = container; - if(this.atStart){ - var a = this.atStart; - for(var k=0; k