/**
* @class Roo.form.ComboBoxArray
- * @extends Roo.form.ComboBox
+ * @extends Roo.form.TextField
* A facebook style adder... for lists of email / people / countries etc...
* pick multiple items from a combo box, and shows each one.
*
*/
name : false,
/**
- * @cfg {String} name The hidden name of the field, often contains an comma seperated list of names
+ * @cfg {String} hiddenName The hidden name of the field, often contains an comma seperated list of names
*/
hiddenName : false,
items : false,
// private - the hidden field el.
hiddenEl : false,
-
+ // private - the filed el..
el : false,
//validateValue : function() { return true; }, // all values are ok!
this.combo = Roo.factory(this.combo, Roo.form);
this.combo.onRender(ct, position);
+ if (typeof(this.combo.width) != 'undefined') {
+ this.combo.onResize(this.combo.width,0);
+ }
+
+ this.combo.initEvents();
// assigned so form know we need to do this..
this.store = this.combo.store;
return;
// not sure if this is needed..
- this.combo.onResize(w,h);
+ //this.combo.onResize(w,h);
if(typeof w != 'number'){
// we do not handle it!?!?
addItem: function(rec)
{
- var idField = this.combo.valueField;
+ var valueField = this.combo.valueField;
var displayField = this.combo.displayField;
- if (this.items.indexOfKey(rec[idField]) > -1) {
+ if (this.items.indexOfKey(rec[valueField]) > -1) {
//console.log("GOT " + rec.data.id);
return;
}
var x = new Roo.form.ComboBoxArray.Item({
//id : rec[this.idField],
data : rec,
- nameField : displayField ,
+ displayField : displayField ,
tipField : displayField ,
cb : this
});
// use the
- this.items.add(rec[idField],x);
+ this.items.add(rec[valueField],x);
// add it before the element..
this.updateHiddenEl();
x.render(this.outerWrap, this.wrap.dom);
reset : function()
{
- Roo.form.ComboBoxArray.superclass.reset.call(this);
+ //Roo.form.ComboBoxArray.superclass.reset.call(this);
this.items.each(function(f) {
f.remove();
});
+ this.el.dom.value = '';
if (this.hiddenEl) {
this.hiddenEl.dom.value = '';
}
setValue: function(v) // not a valid action - must use addItems..
{
+ this.reset();
- if (this.store.isLocal) {
+
+
+ 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;
if (!li.length) {
return;
}
- add = {};
+ var add = {};
add[this.valueField] = k;
add[this.displayField] = li.item(0).data[this.displayField];
this.addItem(add);
}, this)
-
-
-
+
+ }
+ if (typeof(v) == 'object') {
+ // then let's assume it's an array of objects..
+ Roo.each(v, function(l) {
+ this.addItem(l);
+ }, this);
+
}
setFromData: function(v)
{
// this recieves an object, if setValues is called.
- var keys = v[this.valueField].split(',');
- var display = v[this.displayField].split(',');
+ this.reset();
+ this.el.dom.value = v[this.displayField];
+ this.hiddenEl.dom.value = v[this.valueField];
+ if (typeof(v[this.valueField]) != 'string' || !v[this.valueField].length) {
+ return;
+ }
+ var kv = v[this.valueField];
+ var dv = v[this.displayField];
+ kv = typeof(kv) != 'string' ? '' : kv;
+ dv = typeof(dv) != 'string' ? '' : dv;
+
+
+ var keys = kv.split(',');
+ var display = dv.split(',');
for (var i = 0 ; i < keys.length; i++) {
add = {};
},
+ /**
+ * Validates the combox array value
+ * @return {Boolean} True if the value is valid, else false
+ */
+ validate : function(){
+ if(this.disabled || this.validateValue(this.processValue(this.getValue()))){
+ this.clearInvalid();
+ return true;
+ }
+ return false;
+ },
validateValue : function(value){
return Roo.form.ComboBoxArray.superclass.validateValue.call(this, this.getValue());
+ },
+
+ /**
+ * Mark this combo array as invalid
+ * @param {String} msg The validation message
+ */
+ markInvalid : function(msg){
+ if(!this.rendered || this.preventMark){ // not rendered
+ return;
+ }
+ 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;
+ }
+ this.fireEvent('invalid', this, msg);
}
});
Roo.extend(Roo.form.ComboBoxArray.Item, Roo.BoxComponent, {
data : {},
cb: false,
- nameField : false,
+ displayField : false,
tipField : false,
this.el.child('div').dom.innerHTML = this.cb.renderer ?
this.cb.renderer(this.data) :
- String.format('{0}',this.data[this.nameField]);
+ String.format('{0}',this.data[this.displayField]);
this.el.child('div').dom.setAttribute('qtip',
this.cb.updateHiddenEl();
}
-
});
\ No newline at end of file