X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=Roo%2Fform%2FTextField.js;h=20a8c7dd0f13cc57b3a1c0d6bb5aba87b7fa3c05;hb=16d585588738895fd73db1cc2cf3754144012aab;hp=5b6fc33f504794864187b326d0ecd6e10ec391cd;hpb=4183ac27941df4d0ab9fba59cdfa6d5cc0432b80;p=roojs1 diff --git a/Roo/form/TextField.js b/Roo/form/TextField.js index 5b6fc33f50..20a8c7dd0f 100644 --- a/Roo/form/TextField.js +++ b/Roo/form/TextField.js @@ -83,6 +83,10 @@ Roo.extend(Roo.form.TextField, Roo.form.Field, { * @cfg {Boolean} selectOnFocus True to automatically select any existing field text when the field receives input focus (defaults to false) */ selectOnFocus : false, + /** + * @cfg {Boolean} allowLeadingSpace True to prevent the stripping of leading white space + */ + allowLeadingSpace : false, /** * @cfg {String} blankText Error text to display if the allow blank validation fails (defaults to "This field is required") */ @@ -104,17 +108,18 @@ Roo.extend(Roo.form.TextField, Roo.form.Field, { */ regexText : "", /** - * @cfg {String} emptyText The default text to display in an empty field (defaults to null). + * @cfg {String} emptyText The default text to display in an empty field - placeholder... (defaults to null). */ emptyText : null, - /** - * @cfg {String} emptyClass The CSS class to apply to an empty field to style the {@link #emptyText} (defaults to - * 'x-form-empty-field'). This class is automatically added and removed as needed depending on the current field value. - */ - emptyClass : 'x-form-empty-field', + // private - initEvents : function(){ + initEvents : function() + { + if (this.emptyText) { + this.el.attr('placeholder', this.emptyText); + } + Roo.form.TextField.superclass.initEvents.call(this); if(this.validationEvent == 'keyup'){ this.validationTask = new Roo.util.DelayedTask(this.validate, this); @@ -123,13 +128,14 @@ Roo.extend(Roo.form.TextField, Roo.form.Field, { else if(this.validationEvent !== false){ this.el.on(this.validationEvent, this.validate, this, {buffer: this.validationDelay}); } - if(this.selectOnFocus || this.emptyText){ + + if(this.selectOnFocus){ this.on("focus", this.preFocus, this); - if(this.emptyText){ - this.on('blur', this.postBlur, this); - this.applyEmptyText(); - } } + if (!this.allowLeadingSpace) { + this.on('blur', this.cleanLeadingSpace, this); + } + if(this.maskRe || (this.vtype && this.disableKeyFilter !== true && (this.maskRe = Roo.form.VTypes[this.vtype+'Mask']))){ this.el.on("keypress", this.filterKeys, this); } @@ -137,6 +143,9 @@ Roo.extend(Roo.form.TextField, Roo.form.Field, { this.el.on("keyup", this.onKeyUp, this, {buffer:50}); this.el.on("click", this.autoSize, this); } + if(this.el.is('input[type=password]') && Roo.isSafari){ + this.el.on('keydown', this.SafariOnKeyDown, this); + } }, processValue : function(value){ @@ -162,41 +171,28 @@ Roo.extend(Roo.form.TextField, Roo.form.Field, { this.autoSize(); } }, - + // private - clean the leading white space + cleanLeadingSpace : function(e) + { + this.setValue(this.getValue().replace(/^\s+/,'')); + }, /** * Resets the current field value to the originally-loaded value and clears any validation messages. - * Also adds emptyText and emptyClass if the original value was blank. + * */ reset : function(){ Roo.form.TextField.superclass.reset.call(this); - this.applyEmptyText(); - }, - - applyEmptyText : function(){ - if(this.rendered && this.emptyText && this.getRawValue().length < 1){ - this.setRawValue(this.emptyText); - this.el.addClass(this.emptyClass); - } - }, - + + }, // private preFocus : function(){ - if(this.emptyText){ - if(this.el.dom.value == this.emptyText){ - this.setRawValue(''); - } - this.el.removeClass(this.emptyClass); - } + if(this.selectOnFocus){ this.el.dom.select(); } }, - // private - postBlur : function(){ - this.applyEmptyText(); - }, - + // private filterKeys : function(e){ var k = e.getKey(); @@ -213,11 +209,9 @@ Roo.extend(Roo.form.TextField, Roo.form.Field, { }, setValue : function(v){ - if(this.emptyText && this.el && v !== undefined && v !== null && v !== ''){ - this.el.removeClass(this.emptyClass); - } + Roo.form.TextField.superclass.setValue.apply(this, arguments); - this.applyEmptyText(); + this.autoSize(); }, @@ -228,7 +222,7 @@ Roo.extend(Roo.form.TextField, Roo.form.Field, { * @return {Boolean} True if the value is valid, else false */ validateValue : function(value){ - if(value.length < 1 || value === this.emptyText){ // if it's blank + if(value.length < 1) { // if it's blank if(this.allowBlank){ this.clearInvalid(); return true; @@ -309,5 +303,36 @@ Roo.extend(Roo.form.TextField, Roo.form.Field, { var w = Math.min(this.growMax, Math.max(this.metrics.getWidth(v) + /* add extra padding */ 10, this.growMin)); this.el.setWidth(w); this.fireEvent("autosize", this, w); + }, + + // private + SafariOnKeyDown : function(event) + { + // this is a workaround for a password hang bug on chrome/ webkit. + + var isSelectAll = false; + + if(this.el.dom.selectionEnd > 0){ + isSelectAll = (this.el.dom.selectionEnd - this.el.dom.selectionStart - this.getValue().length == 0) ? true : false; + } + if(((event.getKey() == 8 || event.getKey() == 46) && this.getValue().length ==1)){ // backspace and delete key + event.preventDefault(); + this.setValue(''); + return; + } + + if(isSelectAll && event.getCharCode() > 31){ // backspace and delete key + + event.preventDefault(); + // this is very hacky as keydown always get's upper case. + + var cc = String.fromCharCode(event.getCharCode()); + + + this.setValue( event.shiftKey ? cc : cc.toLowerCase()); + + } + + } }); \ No newline at end of file