import {Dom} from '../dom'; import {Arr as array} from '../array'; import {Str} from '../string'; import {Sort} from '../sort'; import {Event} from '../event'; export class Dropdown{ /** * Dropdown UI component * @param {Object} tf TableFilter instance */ constructor(tf){ // Configuration object var f = tf.fObj; this.enableSlcResetFilter = !f.enable_slc_reset_filter ? false : true; //defines empty option text this.nonEmptyText = f.non_empty_text || '(Non empty)'; //enables/disables onChange event on combo-box this.onSlcChange = f.on_change===false ? false : true; //sets select filling method: 'innerHTML' or 'createElement' this.slcFillingMethod = f.slc_filling_method || 'createElement'; //IE only, tooltip text appearing on select before it is populated this.activateSlcTooltip = f.activate_slc_tooltip || 'Click to activate'; //tooltip text appearing on multiple select this.multipleSlcTooltip = f.multiple_slc_tooltip || 'Use Ctrl key for multiple selections'; this.hasCustomSlcOptions = types.isObj(f.custom_slc_options) ? true : false; this.customSlcOptions = types.isArray(f.custom_slc_options) ? f.custom_slc_options : null; this.isCustom = null; this.opts = []; this.optsTxt = []; this.slcInnerHtml = ''; this.tf = tf; } /** * Build checklist UI * @param {Number} colIndex Column index * @param {Boolean} isRefreshed Enable linked refresh behaviour * @param {Boolean} isExternal Render in external container * @param {String} extFltId External container id */ _build(colIndex, isRefreshed=false, isExternal=false, extFltId=null){ var tf = this.tf; colIndex = parseInt(colIndex, 10); var slcId = tf.fltIds[colIndex]; if((!Dom.id(slcId) && !isExternal) || (!Dom.id(extSlcId) && isExternal)){ return; } var slc = !isExternal ? Dom.id(slcId) : Dom.id(extSlcId), rows = tf.tbl.rows, matchCase = tf.matchCase, fillMethod = Str.lower(this.slcFillingMethod); //custom select test this.isCustom = (this.hasCustomSlcOptions && array.has(this.customSlcOptions.cols, colIndex)); //custom selects text var activeFlt; if(isRefreshed && tf.activeFilterId){ activeFlt = tf.activeFilterId.split('_')[0]; activeFlt = activeFlt.split(tf.prfxFlt)[1]; } /*** remember grid values ***/ var flts_values = [], fltArr = []; if(tf.rememberGridValues){ flts_values = tf.Cpt.store.getFilterValues(tf.fltsValuesCookie); if(flts_values && !Str.isEmpty(flts_values.toString())){ if(this.isCustom){ fltArr.push(flts_values[colIndex]); } else { fltArr = flts_values[colIndex].split(' '+tf.orOperator+' '); } } } var excludedOpts = null, filteredDataCol = null; if(isRefreshed && tf.disableExcludedOptions){ excludedOpts = []; filteredDataCol = []; } for(var k=tf.refRow; k' + lbl+''; } else { var opt; //fill select on demand if(tf.fillSlcOnDemand && slcValue===this.opts[y] && tf['col'+colIndex]===tf.fltTypeSlc){ opt = Dom.createOpt(lbl, val, true); } else { if(tf['col'+colIndex]!==tf.fltTypeMulti){ opt = Dom.createOpt( lbl, val, (flts_values[colIndex]!==' ' && val===flts_values[colIndex]) ? true : false ); } else { opt = Dom.createOpt( lbl, val, (array.has(fltArr, Str.matchCase(this.opts[y], tf.matchCase), tf.matchCase) || fltArr.toString().indexOf(val)!== -1) ? true : false ); } } if(isDisabled){ opt.disabled = true; } slc.appendChild(opt); } }// for y if(fillMethod === 'innerhtml'){ slc.innerHTML += this.slcInnerHtml; } slc.setAttribute('filled', '1'); } /** * Add drop-down header option * @param {Object} slc Select DOM element */ addFirstOption(slc){ var tf = this.tf, fillMethod = Str.lower(this.slcFillingMethod); if(fillMethod === 'innerhtml'){ this.slcInnerHtml += ''; } else { var opt0 = Dom.createOpt( (!this.enableSlcResetFilter ? '' : tf.displayAllText),''); if(!this.enableSlcResetFilter){ opt0.style.display = 'none'; } slc.appendChild(opt0); if(tf.enableEmptyOption){ var opt1 = Dom.createOpt(tf.emptyText, tf.emOperator); slc.appendChild(opt1); } if(tf.enableNonEmptyOption){ var opt2 = Dom.createOpt(tf.nonEmptyText, tf.nmOperator); slc.appendChild(opt2); } } return slc; } }