X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=Roo%2Fform%2FComboBox.js;h=0117cc201cb8dd1e881eb132bce18a621ec0dbe0;hb=c6296ab736592edfbf4af91cd2626e859b019a0e;hp=f8ddaba6baf630eb7d3bca5885059efccecccc9f;hpb=832477e2e66129bf00fdba8eabaddc0d61bcc492;p=roojs1 diff --git a/Roo/form/ComboBox.js b/Roo/form/ComboBox.js index f8ddaba6ba..0117cc201c 100644 --- a/Roo/form/ComboBox.js +++ b/Roo/form/ComboBox.js @@ -169,6 +169,8 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { * in order for a value to be mapped. */ valueField: undefined, + + /** * @cfg {String} hiddenName If specified, a hidden form field with this name is dynamically generated to store the * field's data value (defaults to the underlying DOM element's name) @@ -282,20 +284,25 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { */ valueNotFoundText : undefined, /** - * @cfg {bool} blockFocus Prevents all focus calls, so it can work with things like HTML edtor bar + * @cfg {Boolean} blockFocus Prevents all focus calls, so it can work with things like HTML edtor bar */ blockFocus : false, /** - * @cfg {bool} disableClear Disable showing of clear button. + * @cfg {Boolean} disableClear Disable showing of clear button. */ disableClear : false, + /** + * @cfg {Boolean} alwaysQuery Disable caching of results, and always send query + */ + alwaysQuery : false, //private addicon : false, editicon: false, - + // element that contains real text value.. (when hidden is used..) + // private onRender : function(ct, position){ Roo.form.ComboBox.superclass.onRender.call(this, ct, position); @@ -308,6 +315,8 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { // prevent input submission this.el.dom.removeAttribute('name'); + + } if(Roo.isGecko){ this.el.dom.setAttribute('autocomplete', 'off'); @@ -376,7 +385,7 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { this.store.on('beforeload', this.onBeforeLoad, this); this.store.on('load', this.onLoad, this); - this.store.on('loadexception', this.collapse, this); + this.store.on('loadexception', this.onLoadException, this); if(this.resizable){ this.resizer = new Roo.Resizable(this.list, { @@ -454,6 +463,7 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { "tab" : function(e){ this.onViewClick(false); + this.fireEvent("specialkey", this, e); return true; }, @@ -495,7 +505,7 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { if(this.store){ this.store.un('beforeload', this.onBeforeLoad, this); this.store.un('load', this.onLoad, this); - this.store.un('loadexception', this.collapse, this); + this.store.un('loadexception', this.onLoadException, this); } Roo.form.ComboBox.superclass.onDestroy.call(this); }, @@ -592,7 +602,17 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { } //this.el.focus(); }, - + // private + onLoadException : function() + { + this.collapse(); + Roo.log(this.store.reader.jsonData); + if (this.store && typeof(this.store.reader.jsonData.errorMsg) != 'undefined') { + Roo.MessageBox.alert("Error loading",this.store.reader.jsonData.errorMsg); + } + + + }, // private onTypeAhead : function(){ if(this.store.getCount() > 0){ @@ -623,9 +643,8 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { getValue : function(){ if(this.valueField){ return typeof this.value != 'undefined' ? this.value : ''; - }else{ - return Roo.form.ComboBox.superclass.getValue.call(this); } + return Roo.form.ComboBox.superclass.getValue.call(this); }, /** @@ -638,7 +657,7 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { this.value = ''; this.setRawValue(''); this.lastSelectionText = ''; - this.applyEmptyText(); + }, /** @@ -682,7 +701,7 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { dv = !o || typeof(o[this.displayField]) == 'undefined' ? '' : o[this.displayField]; } else { // this is an error condition!!! - console.log('no value field set for '+ this.name); + Roo.log('no displayField value set for '+ (this.name ? this.name : this.id)); } if(this.valueField){ @@ -707,9 +726,13 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { // private reset : function(){ // overridden so that last data is reset.. - this.setValue(this.originalValue); + this.setValue(this.resetValue); + this.originalValue = this.getValue(); this.clearInvalid(); this.lastData = false; + if (this.view) { + this.view.clearSelections(); + } }, // private findRecord : function(prop, value){ @@ -720,11 +743,19 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { record = r; return false; } + return true; }); } return record; }, - + + getName: function() + { + // returns hidden if it's set.. + if (!this.rendered) {return ''}; + return !this.hiddenName && this.el.dom.name ? this.el.dom.name : (this.hiddenName || ''); + + }, // private onViewMove : function(e, t){ this.inKeyMode = false; @@ -743,7 +774,8 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { }, // private - onViewClick : function(doFocus){ + onViewClick : function(doFocus) + { var index = this.view.getSelectedIndexes()[0]; var r = this.store.getAt(index); if(r){ @@ -862,7 +894,7 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { if(this.el.dom.value.length > 0){ this.el.dom.value = this.lastSelectionText === undefined ? '' : this.lastSelectionText; - this.applyEmptyText(); + } }, @@ -890,7 +922,7 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { q = qe.query; forceAll = qe.forceAll; if(forceAll === true || (q.length >= this.minChars)){ - if(this.lastQuery != q){ + if(this.lastQuery != q || this.alwaysQuery){ this.lastQuery = q; if(this.mode == 'local'){ this.selectedIndex = -1; @@ -992,22 +1024,48 @@ Roo.extend(Roo.form.ComboBox, Roo.form.TriggerField, { }, listKeyPress : function(e) { - Roo.log('listkeypress'); + //Roo.log('listkeypress'); + // scroll to first matching element based on key pres.. if (e.isSpecialKey()) { - return; + return false; + } + var k = String.fromCharCode(e.getKey()).toUpperCase(); + //Roo.log(k); + var match = false; + var csel = this.view.getSelectedNodes(); + var cselitem = false; + if (csel.length) { + var ix = this.view.indexOf(csel[0]); + cselitem = this.store.getAt(ix); + if (!cselitem.get(this.displayField) || cselitem.get(this.displayField).substring(0,1).toUpperCase() != k) { + cselitem = false; + } + } - var k = String.fromCharCode(e.getKey()); - Roo.log(k); - var match = false + this.store.each(function(v) { - if (v.get(combo.displayField).substring(0,1) == k) { - match = v.id; + if (cselitem) { + // start at existing selection. + if (cselitem.id == v.id) { + cselitem = false; + } + return; + } + + if (v.get(this.displayField) && v.get(this.displayField).substring(0,1).toUpperCase() == k) { + match = this.store.indexOf(v); return false; } - }); - Roo.log(match); + }, this); - } + if (match === false) { + return true; // no more action? + } + // scroll to? + this.view.select(match); + var sn = Roo.get(this.view.getSelectedNodes()[0]); + sn.scrollIntoView(sn.dom.parentNode, false); + } /** * @cfg {Boolean} grow