281 lines
No EOL
12 KiB
HTML
281 lines
No EOL
12 KiB
HTML
<html><head><title>TextField.js</title><link rel="stylesheet" type="text/css" href="../resources/style.css" media="screen"/></head><body><h1>TextField.js</h1><pre class="highlighted"><code><i>/**
|
|
* @class Ext.form.TextField
|
|
* @extends Ext.form.Field
|
|
* Basic text field. Can be used as a direct replacement <b>for</b> traditional text inputs, or as the base
|
|
* class <b>for</b> more sophisticated input controls (like {@link Ext.form.TextArea} and {@link Ext.form.ComboBox}).
|
|
* @constructor
|
|
* Creates a <b>new</b> TextField
|
|
* @param {Object} config Configuration options
|
|
*/</i>
|
|
Ext.form.TextField = <b>function</b>(config){
|
|
Ext.form.TextField.superclass.constructor.call(<b>this</b>, config);
|
|
<b>this</b>.addEvents({
|
|
<i>/**
|
|
* @event autosize
|
|
* Fires when the autosize <b>function</b> is triggered. The field may or may not have actually changed size
|
|
* according to the <b>default</b> logic, but <b>this</b> event provides a hook <b>for</b> the developer to apply additional
|
|
* logic at runtime to resize the field <b>if</b> needed.
|
|
* @param {Ext.form.Field} <b>this</b> This text field
|
|
* @param {Number} width The <b>new</b> field width
|
|
*/</i>
|
|
autosize : true
|
|
});
|
|
};
|
|
|
|
Ext.extend(Ext.form.TextField, Ext.form.Field, {
|
|
<i>/**
|
|
* @cfg {Boolean} grow True <b>if</b> this field should automatically grow and shrink to its content
|
|
*/</i>
|
|
grow : false,
|
|
<i>/**
|
|
* @cfg {Number} growMin The minimum width to allow when grow = true (defaults to 30)
|
|
*/</i>
|
|
growMin : 30,
|
|
<i>/**
|
|
* @cfg {Number} growMax The maximum width to allow when grow = true (defaults to 800)
|
|
*/</i>
|
|
growMax : 800,
|
|
<i>/**
|
|
* @cfg {String} vtype A validation type name as defined <b>in</b> {@link Ext.form.VTypes} (defaults to null)
|
|
*/</i>
|
|
vtype : null,
|
|
<i>/**
|
|
* @cfg {String} maskRe An input mask regular expression that will be used to filter keystrokes that don't match (defaults to null)
|
|
*/</i>
|
|
maskRe : null,
|
|
<i>/**
|
|
* @cfg {Boolean} disableKeyFilter True to disable input keystroke filtering (defaults to false)
|
|
*/</i>
|
|
disableKeyFilter : false,
|
|
<i>/**
|
|
* @cfg {Boolean} allowBlank False to validate that the value length > 0 (defaults to true)
|
|
*/</i>
|
|
allowBlank : true,
|
|
<i>/**
|
|
* @cfg {Number} minLength Minimum input field length required (defaults to 0)
|
|
*/</i>
|
|
minLength : 0,
|
|
<i>/**
|
|
* @cfg {Number} maxLength Maximum input field length allowed (defaults to Number.MAX_VALUE)
|
|
*/</i>
|
|
maxLength : Number.MAX_VALUE,
|
|
<i>/**
|
|
* @cfg {String} minLengthText Error text to display <b>if</b> the minimum length validation fails (defaults to "The minimum length <b>for</b> this field is {minLength}")
|
|
*/</i>
|
|
minLengthText : "The minimum length <b>for</b> this field is {0}",
|
|
<i>/**
|
|
* @cfg {String} maxLengthText Error text to display <b>if</b> the maximum length validation fails (defaults to "The maximum length <b>for</b> this field is {maxLength}")
|
|
*/</i>
|
|
maxLengthText : "The maximum length <b>for</b> this field is {0}",
|
|
<i>/**
|
|
* @cfg {Boolean} selectOnFocus True to automatically select any existing field text when the field receives input focus (defaults to false)
|
|
*/</i>
|
|
selectOnFocus : false,
|
|
<i>/**
|
|
* @cfg {String} blankText Error text to display <b>if</b> the allow blank validation fails (defaults to "This field is required")
|
|
*/</i>
|
|
blankText : "This field is required",
|
|
<i>/**
|
|
* @cfg {Function} validator A custom validation <b>function</b> to be called during field validation (defaults to null).
|
|
* If available, <b>this</b> function will be called only after the basic validators all <b>return</b> true, and will be passed the
|
|
* current field value and expected to <b>return</b> boolean true <b>if</b> the value is valid or a string error message <b>if</b> invalid.
|
|
*/</i>
|
|
validator : null,
|
|
<i>/**
|
|
* @cfg {RegExp} regex A JavaScript RegExp object to be tested against the field value during validation (defaults to null).
|
|
* If available, <b>this</b> regex will be evaluated only after the basic validators all <b>return</b> true, and will be passed the
|
|
* current field value. If the test fails, the field will be marked invalid using {@link #regexText}.
|
|
*/</i>
|
|
regex : null,
|
|
<i>/**
|
|
* @cfg {String} regexText The error text to display <b>if</b> {@link #regex} is used and the test fails during validation (defaults to "")
|
|
*/</i>
|
|
regexText : "",
|
|
<i>/**
|
|
* @cfg {String} emptyText The <b>default</b> text to display <b>in</b> an empty field (defaults to null).
|
|
*/</i>
|
|
emptyText : null,
|
|
<i>/**
|
|
* @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.
|
|
*/</i>
|
|
emptyClass : 'x-form-empty-field',
|
|
|
|
<i>// private</i>
|
|
initEvents : <b>function</b>(){
|
|
Ext.form.TextField.superclass.initEvents.call(<b>this</b>);
|
|
<b>if</b>(this.validationEvent == 'keyup'){
|
|
<b>this</b>.validationTask = <b>new</b> Ext.util.DelayedTask(<b>this</b>.validate, <b>this</b>);
|
|
<b>this</b>.el.on('keyup', <b>this</b>.filterValidation, <b>this</b>);
|
|
}
|
|
<b>else</b> if(<b>this</b>.validationEvent !== false){
|
|
<b>this</b>.el.on(<b>this</b>.validationEvent, <b>this</b>.validate, <b>this</b>, {buffer: <b>this</b>.validationDelay});
|
|
}
|
|
<b>if</b>(this.selectOnFocus || <b>this</b>.emptyText){
|
|
<b>this</b>.on("focus", <b>this</b>.preFocus, <b>this</b>);
|
|
<b>if</b>(this.emptyText){
|
|
<b>this</b>.on('blur', <b>this</b>.postBlur, <b>this</b>);
|
|
<b>this</b>.applyEmptyText();
|
|
}
|
|
}
|
|
<b>if</b>(this.maskRe || (<b>this</b>.vtype && <b>this</b>.disableKeyFilter !== true && (<b>this</b>.maskRe = Ext.form.VTypes[<b>this</b>.vtype+'Mask']))){
|
|
<b>this</b>.el.on("keypress", <b>this</b>.filterKeys, <b>this</b>);
|
|
}
|
|
<b>if</b>(this.grow){
|
|
<b>this</b>.el.on("keyup", <b>this</b>.onKeyUp, <b>this</b>, {buffer:50});
|
|
<b>this</b>.el.on("click", <b>this</b>.autoSize, <b>this</b>);
|
|
}
|
|
},
|
|
|
|
filterValidation : <b>function</b>(e){
|
|
<b>if</b>(!e.isNavKeyPress()){
|
|
<b>this</b>.validationTask.delay(<b>this</b>.validationDelay);
|
|
}
|
|
},
|
|
|
|
<i>// private</i>
|
|
onKeyUp : <b>function</b>(e){
|
|
<b>if</b>(!e.isNavKeyPress()){
|
|
<b>this</b>.autoSize();
|
|
}
|
|
},
|
|
|
|
<i>/**
|
|
* Resets the current field value to the originally-loaded value and clears any validation messages.
|
|
* Also adds emptyText and emptyClass <b>if</b> the original value was blank.
|
|
*/</i>
|
|
reset : <b>function</b>(){
|
|
Ext.form.TextField.superclass.reset.call(<b>this</b>);
|
|
<b>this</b>.applyEmptyText();
|
|
},
|
|
|
|
applyEmptyText : <b>function</b>(){
|
|
<b>if</b>(this.rendered && <b>this</b>.emptyText && <b>this</b>.getRawValue().length < 1){
|
|
<b>this</b>.setRawValue(<b>this</b>.emptyText);
|
|
<b>this</b>.el.addClass(<b>this</b>.emptyClass);
|
|
}
|
|
},
|
|
|
|
<i>// private</i>
|
|
preFocus : <b>function</b>(){
|
|
<b>if</b>(this.emptyText){
|
|
<b>if</b>(this.getRawValue() == <b>this</b>.emptyText){
|
|
<b>this</b>.setRawValue('');
|
|
}
|
|
<b>this</b>.el.removeClass(<b>this</b>.emptyClass);
|
|
}
|
|
<b>if</b>(this.selectOnFocus){
|
|
<b>this</b>.el.dom.select();
|
|
}
|
|
},
|
|
|
|
<i>// private</i>
|
|
postBlur : <b>function</b>(){
|
|
<b>this</b>.applyEmptyText();
|
|
},
|
|
|
|
<i>// private</i>
|
|
filterKeys : <b>function</b>(e){
|
|
<b>var</b> k = e.getKey();
|
|
<b>if</b>(!Ext.isIE && (e.isNavKeyPress() || k == e.BACKSPACE || (k == e.DELETE && e.button == -1))){
|
|
<b>return</b>;
|
|
}
|
|
<b>var</b> c = e.getCharCode();
|
|
<b>if</b>(!<b>this</b>.maskRe.test(String.fromCharCode(c) || '')){
|
|
e.stopEvent();
|
|
}
|
|
},
|
|
|
|
setValue : <b>function</b>(v){
|
|
<b>if</b>(this.emptyText && v !== undefined && v !== null && v !== ''){
|
|
<b>this</b>.el.removeClass(<b>this</b>.emptyClass);
|
|
}
|
|
Ext.form.TextField.superclass.setValue.apply(<b>this</b>, arguments);
|
|
},
|
|
|
|
<i>/**
|
|
* Validates a value according to the field's validation rules and marks the field as invalid
|
|
* <b>if</b> the validation fails
|
|
* @param {Mixed} value The value to validate
|
|
* @<b>return</b> {Boolean} True <b>if</b> the value is valid, <b>else</b> false
|
|
*/</i>
|
|
validateValue : <b>function</b>(value){
|
|
<b>if</b>(value.length < 1 || value === <b>this</b>.emptyText){ <i>// <b>if</b> it's blank</i>
|
|
<b>if</b>(this.allowBlank){
|
|
<b>this</b>.clearInvalid();
|
|
<b>return</b> true;
|
|
}<b>else</b>{
|
|
<b>this</b>.markInvalid(<b>this</b>.blankText);
|
|
<b>return</b> false;
|
|
}
|
|
}
|
|
<b>if</b>(value.length < <b>this</b>.minLength){
|
|
<b>this</b>.markInvalid(String.format(<b>this</b>.minLengthText, <b>this</b>.minLength));
|
|
<b>return</b> false;
|
|
}
|
|
<b>if</b>(value.length > <b>this</b>.maxLength){
|
|
<b>this</b>.markInvalid(String.format(<b>this</b>.maxLengthText, <b>this</b>.maxLength));
|
|
<b>return</b> false;
|
|
}
|
|
<b>if</b>(this.vtype){
|
|
<b>var</b> vt = Ext.form.VTypes;
|
|
<b>if</b>(!vt[<b>this</b>.vtype](value)){
|
|
<b>this</b>.markInvalid(<b>this</b>.vtypeText || vt[<b>this</b>.vtype +'Text']);
|
|
<b>return</b> false;
|
|
}
|
|
}
|
|
<b>if</b>(typeof <b>this</b>.validator == "<b>function</b>"){
|
|
<b>var</b> msg = <b>this</b>.validator(value);
|
|
<b>if</b>(msg !== true){
|
|
<b>this</b>.markInvalid(msg);
|
|
<b>return</b> false;
|
|
}
|
|
}
|
|
<b>if</b>(this.regex && !<b>this</b>.regex.test(value)){
|
|
<b>this</b>.markInvalid(<b>this</b>.regexText);
|
|
<b>return</b> false;
|
|
}
|
|
<b>return</b> true;
|
|
},
|
|
|
|
<i>/**
|
|
* Selects text <b>in</b> this field
|
|
* @param {Number} start (optional) The index where the selection should start (defaults to 0)
|
|
* @param {Number} end (optional) The index where the selection should end (defaults to the text length)
|
|
*/</i>
|
|
selectText : <b>function</b>(start, end){
|
|
<b>var</b> v = <b>this</b>.getRawValue();
|
|
<b>if</b>(v.length > 0){
|
|
start = start === undefined ? 0 : start;
|
|
end = end === undefined ? v.length : end;
|
|
<b>var</b> d = <b>this</b>.el.dom;
|
|
<b>if</b>(d.setSelectionRange){
|
|
d.setSelectionRange(start, end);
|
|
}<b>else</b> if(d.createTextRange){
|
|
<b>var</b> range = d.createTextRange();
|
|
range.moveStart("character", start);
|
|
range.moveEnd("character", v.length-end);
|
|
range.select();
|
|
}
|
|
}
|
|
},
|
|
|
|
<i>/**
|
|
* Automatically grows the field to accomodate the width of the text up to the maximum field width allowed.
|
|
* This only takes effect <b>if</b> grow = true and fires the autosize event.
|
|
*/</i>
|
|
autoSize : <b>function</b>(){
|
|
<b>if</b>(!<b>this</b>.grow || !<b>this</b>.rendered){
|
|
<b>return</b>;
|
|
}
|
|
<b>if</b>(!<b>this</b>.metrics){
|
|
<b>this</b>.metrics = Ext.util.TextMetrics.createInstance(<b>this</b>.el);
|
|
}
|
|
<b>var</b> el = <b>this</b>.el;
|
|
<b>var</b> v = el.dom.value + "&#160;";
|
|
<b>var</b> w = Math.min(<b>this</b>.growMax, Math.max(<b>this</b>.metrics.getWidth(v) + <i>/* add extra padding */</i> 10, <b>this</b>.growMin));
|
|
<b>this</b>.el.setWidth(w);
|
|
<b>this</b>.fireEvent("autosize", <b>this</b>, w);
|
|
}
|
|
});</code></pre><hr><div style="font-size:10px;text-align:center;color:gray;">Ext - Copyright © 2006-2007 Ext JS, LLC<br />All rights reserved.</div>
|
|
</body></html> |