X-Git-Url: http://git.roojs.org/?p=roojs1;a=blobdiff_plain;f=Roo%2Fform%2FComboBoxArray.js;h=75ce301d7f8710bf4b1e417c88312f6d2c71021d;hp=52ad0397d770136aa8ea505761acdcd4497dc688;hb=61bc45258e16a779856dd2ad0862630b489e4583;hpb=77be9a5476e48e25fb3a50192a2b1baa1323a98d diff --git a/Roo/form/ComboBoxArray.js b/Roo/form/ComboBoxArray.js index 52ad0397d7..75ce301d7f 100644 --- a/Roo/form/ComboBoxArray.js +++ b/Roo/form/ComboBoxArray.js @@ -36,6 +36,24 @@ Roo.form.ComboBoxArray = function(config) { + this.addEvents({ + /** + * @event beforeremove + * Fires before remove the value from the list + * @param {Roo.form.ComboBoxArray} _self This combo box array + * @param {Roo.form.ComboBoxArray.Item} item removed item + */ + 'beforeremove' : true, + /** + * @event remove + * Fires when remove the value from the list + * @param {Roo.form.ComboBoxArray} _self This combo box array + * @param {Roo.form.ComboBoxArray.Item} item removed item + */ + 'remove' : true + + + }); Roo.form.ComboBoxArray.superclass.constructor.call(this, config); @@ -76,7 +94,10 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, * @cfg {String} hiddenName The hidden name of the field, often contains an comma seperated list of names */ hiddenName : false, - + /** + * @cfg {String} seperator The value seperator normally ',' + */ + seperator : ',', // private the array of items that are displayed.. items : false, @@ -97,7 +118,7 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, // give fake names to child combo; this.combo.hiddenName = this.hiddenName ? (this.hiddenName+'-subcombo') : this.hiddenName; - this.combo.name = this.name? (this.name+'-subcombo') : this.name; + this.combo.name = this.name ? (this.name+'-subcombo') : this.name; this.combo = Roo.factory(this.combo, Roo.form); this.combo.onRender(ct, position); @@ -218,6 +239,7 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, { var valueField = this.combo.valueField; var displayField = this.combo.displayField; + if (this.items.indexOfKey(rec[valueField]) > -1) { //console.log("GOT " + rec.data.id); return; @@ -249,18 +271,19 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, this.items.each(function(f) { ar.push(f.data[idField]); - }); - this.hiddenEl.dom.value = ar.join(','); + this.hiddenEl.dom.value = ar.join(this.seperator); this.validate(); }, reset : function() { - //Roo.form.ComboBoxArray.superclass.reset.call(this); - this.items.each(function(f) { - f.remove(); + this.items.clear(); + + Roo.each(this.outerWrap.select('.x-cbarray-item', true).elements, function(el){ + el.remove(); }); + this.el.dom.value = ''; if (this.hiddenEl) { this.hiddenEl.dom.value = ''; @@ -273,17 +296,15 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, }, setValue: function(v) // not a valid action - must use addItems.. { - - this.reset(); - - + this.reset(); + if (this.store.isLocal && (typeof(v) == 'string')) { // then we can use the store to find the values.. // comma seperated at present.. this needs to allow JSON based encoding.. this.hiddenEl.value = v; var v_ar = []; - Roo.each(v.split(','), function(k) { + Roo.each(v.split(this.seperator), function(k) { Roo.log("CHECK " + this.valueField + ',' + k); var li = this.store.query(this.valueField, k); if (!li.length) { @@ -297,10 +318,16 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, }, this) } - if (typeof(v) == 'object') { + if (typeof(v) == 'object' ) { // then let's assume it's an array of objects.. Roo.each(v, function(l) { - this.addItem(l); + var add = l; + if (typeof(l) == 'string') { + add = {}; + add[this.valueField] = k; + add[this.displayField] = k + } + this.addItem(add); }, this); } @@ -322,10 +349,9 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, dv = typeof(dv) != 'string' ? '' : dv; - var keys = kv.split(','); - var display = dv.split(','); + var keys = kv.split(this.seperator); + var display = dv.split(this.seperator); for (var i = 0 ; i < keys.length; i++) { - add = {}; add[this.valueField] = keys[i]; add[this.displayField] = display[i]; @@ -352,54 +378,29 @@ Roo.extend(Roo.form.ComboBoxArray, Roo.form.TextField, }, - /** - * Mark this combo array as invalid - * @param {String} msg The validation message + /*@ + * overide + * */ - markInvalid : function(msg){ - if(!this.rendered || this.preventMark){ // not rendered - return; + isDirty : function() { + if(this.disabled) { + return false; } - this.combo.el.addClass(this.invalidClass); - msg = msg || this.invalidText; - switch(this.msgTarget){ - case 'qtip': - this.el.dom.qtip = msg; - this.el.dom.qclass = 'x-form-invalid-tip'; - if(Roo.QuickTips){ // fix for floating editors interacting with DND - Roo.QuickTips.enable(); - } - break; - case 'title': - this.el.dom.title = msg; - break; - case 'under': - if(!this.errorEl){ - var elp = this.el.findParent('.x-form-element', 5, true); - this.errorEl = elp.createChild({cls:'x-form-invalid-msg'}); - this.errorEl.setWidth(elp.getWidth(true)-20); - } - this.errorEl.update(msg); - Roo.form.Field.msgFx[this.msgFx].show(this.errorEl, this); - break; - case 'side': - if(!this.errorIcon){ - var elp = this.el.findParent('.x-form-element', 5, true); - this.errorIcon = elp.createChild({cls:'x-form-invalid-icon'}); - } - this.alignErrorIcon(); - this.errorIcon.dom.qtip = msg; - this.errorIcon.dom.qclass = 'x-form-invalid-tip'; - this.errorIcon.show(); - this.on('resize', this.alignErrorIcon, this); - break; - default: - var t = Roo.getDom(this.msgTarget); - t.innerHTML = msg; - t.style.display = this.msgDisplay; - break; + + try { + var d = Roo.decode(String(this.originalValue)); + } catch (e) { + return String(this.getValue()) !== String(this.originalValue); } - this.fireEvent('invalid', this, msg); + + var originalValue = []; + + for (var i = 0; i < d.length; i++){ + originalValue.push(d[i][this.valueField]); + } + + return String(this.getValue()) !== String(originalValue.join(this.seperator)); + } }); @@ -472,11 +473,18 @@ Roo.extend(Roo.form.ComboBoxArray.Item, Roo.BoxComponent, { remove : function() { + if(this.cb.disabled){ + return; + } + + if(false !== this.cb.fireEvent('beforeremove', this.cb, this)){ + this.cb.items.remove(this); + this.el.child('img').un('click', this.remove, this); + this.el.remove(); + this.cb.updateHiddenEl(); + + this.cb.fireEvent('remove', this.cb, this); + } - this.cb.items.remove(this); - this.el.child('img').un('click', this.remove, this); - this.el.remove(); - this.cb.updateHiddenEl(); } - }); \ No newline at end of file