Ext.ns('Ext.ux.MultiCombo');
/**
* Checkable
* @plugin
*/
Ext.ux.MultiCombo.Checkable = function(cfg) {
Ext.apply(this, cfg);
};
Ext.ux.MultiCombo.Checkable.prototype = {
/**
* @cfg {String} checkSelector DomQuery config for locating checkbox
*/
checkSelector: 'input[type=checkbox]',
/**
* @cfg {String} itemSelector The itemSelector used with Combo's internal DataView [x-combo-list]
*/
itemSelector : 'x-combo-list',
/**
* @cfg {String} cls
*/
cls: 'combo-checkable',
/**
* @cfg {String} selectAllText The "SELECT ALL" phrase [Select All]
*/
selectAllText: 'Select All',
/**
* @cfg {String} clearAllText the text to display for "clear all" link
*/
clearAllText : 'clear all',
/**
* @cfg {String} separatorHtml arbitrary html rendered after Checkable controls. Can be used to add an
* html separator markup.
*/
separatorHtml : '',
// private {Boolean} checked
checked : null,
init : function(combo) {
this.combo = combo;
var checkable = this;
var id = Ext.id();
var cls = combo.itemSelector || this.itemSelector;
if (!combo.tpl) {
combo.tpl =['','{'+combo.displayField+'}
',''] . join('');
}
combo.tpl = [
'',
this.separatorHtml
].join('') + combo.tpl.replace(new RegExp('({'+combo.displayField+'})'), "checked /> ");
combo.on('initview', function(c, dv) {
dv.on('containerclick', this.onContainerClick.createDelegate(this));
dv.on('selectionchange', this.onSelectionChange.createDelegate(this));
dv.el.on('mouseover', this.onViewOver, this);
},this);
combo.on('select', this.onSelect.createDelegate(this));
},
onViewOver : function(ev, node){
var target = ev.getTarget('.' + this.cls, 5);
if (target) {
this.combo.clearHighlight();
Ext.fly(target).addClass(this.combo.highlightClass);
}
if(this.inKeyMode){ // prevent key nav and mouse over conflicts
return;
}
return;
},
onSelect : function(rec, index) {
// anything?
},
/**
* getCheckbox
* @return {DomNode}
*/
getCheckbox : function() {
return this.combo.view.el.child('.'+this.cls+' '+this.checkSelector, true);
},
/**
* onSelectChange Fired by MultiCombo
* @param {Object} dv
* @param {Object} rs
*/
onSelectionChange : function(dv, rs) {
this.checked = (rs.length > 0 && rs.length == this.combo.store.getCount()) ? true : false;
this.getCheckbox().checked = this.checked;
var selector = this.checkSelector;
setTimeout(function() {
dv.el.select(dv.itemSelector + ' ' + selector).each(function(f) {
f.dom.checked = false;
});
dv.el.select('.' + dv.selectedClass + ' ' + selector).each(function(f) {
f.dom.checked = true;
});
},1);
},
/**
* selectNext Called by MultiCombo. use this to apply hover-class to this row.
* @param {Object} sender
*/
selectNext: function(sender) {
sender.view.el.child('.' + this.cls).addClass(sender.highlightClass);
},
/**
* selectPrev Called by MultiCombo, use this to apply hover class to row.
* @param {Object} sender
*/
selectPrev : function(sender) {
sender.view.el.child('.' + this.cls).addClass(sender.highlightClass);
},
/**
* onEnter Called by MultiCombo
* @param {Object} sender
*/
onEnter : function(sender) {
this.setChecked(!this.checked);
},
/**
* onContainerClick Fired by MultiCombo
* @param {Object} dv
* @param {Object} ev
*/
onContainerClick : function(dv, ev) {
var btnClearAll = ev.getTarget('.'+this.cls+'-clear-all');
if (btnClearAll) {
this.clearAll();
}
else {
this.setChecked(!this.checked);
}
return false;
},
// private selectAll
selectAll : function() {
var value = [];
this.combo.store.each(function(r) { value.push(r.data[this.combo.valueField]); },this);
this.combo.setValue(value);
this.combo.selectByValue(this.combo.getValue());
this.combo.focus();
},
// private clearAll
clearAll : function() {
this.combo.updateValue([]);
this.combo.selectByValue([]);
this.combo.view.clearSelections();
this.combo.focus();
this.combo.fireEvent('clearall', this.combo);
},
/**
* setChecked
* @param {Object} v
*/
setChecked : function(v) {
if (v == this.checked) {
return;
}
this.checked = v;
this.getCheckbox().checked = this.checked;
if (this.checked == true) {
this.selectAll();
}
else {
this.clearAll();
}
}
}