If defined, display this hint string immediately on focus to the textbox, if empty.
Also displays if the textbox value is Incomplete (not yet valid but will be with additional input).
Think of this like a tooltip that tells the user what to do, not an error message
that tells the user what they've done wrong.
Message disappears when user starts typing.
dijit.form.ValidationTextBox.invalidMessage
type
String
summary
The message to display if value is invalid.
The translated string value is read from the message file by default.
Set to "" to use the promptMessage instead.
dijit.form.ValidationTextBox.missingMessage
type
String
summary
The message to display if value is empty and the field is required.
The translated string value is read from the message file by default.
Set to "" to use the invalidMessage instead.
dijit.form.ValidationTextBox.message
type
String
summary
Currently error/prompt message.
When using the default tooltip implementation, this will only be
displayed when the field is focused.
dijit.form.ValidationTextBox.constraints
type
Object
summary
dijit.form.ValidationTextBox.regExp
tags: extension protected
type
String
summary
regular expression string used to validate the input
Do not specify both regExp and regExpGen
Returns true if the value is either already valid or could be made valid by appending characters.
This is used for validation while the user [may be] still typing.
if(this.state == "Error"){ this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus message = this.getErrorMessage(isFocused); }else if(this.state == "Incomplete"){ message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused }else if(isEmpty){ message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text } this.set("message", message);
return isValid;
summary
Called by oninit, onblur, and onkeypress.
description
Show missing or invalid messages if appropriate, and highlight textbox field.
dijit.form.ValidationTextBox.__Constraints = function(){ // locale: String // locale used for validation, picks up value from this widget's lang attribute // _flags_: anything // various flags passed to regExpGen function this.locale = ""; this._flags_ = ""; }
dojo.declare( "dijit.form.ValidationTextBox", dijit.form.TextBox, { // summary: // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. // tags: // protected
// required: Boolean // User is required to enter data into this field. required: false,
// promptMessage: String // If defined, display this hint string immediately on focus to the textbox, if empty. // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input). // Think of this like a tooltip that tells the user what to do, not an error message // that tells the user what they've done wrong. // // Message disappears when user starts typing. promptMessage: "",
// invalidMessage: String // The message to display if value is invalid. // The translated string value is read from the message file by default. // Set to "" to use the promptMessage instead. invalidMessage: "$_unset_$",
// missingMessage: String // The message to display if value is empty and the field is required. // The translated string value is read from the message file by default. // Set to "" to use the invalidMessage instead. missingMessage: "$_unset_$",
// message: String // Currently error/prompt message. // When using the default tooltip implementation, this will only be // displayed when the field is focused. message: "",
// constraints: dijit.form.ValidationTextBox.__Constraints // user-defined object needed to pass parameters to the validator functions constraints: {},
// regExp: [extension protected] String // regular expression string used to validate the input // Do not specify both regExp and regExpGen regExp: ".*",
regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to generate regExp when dependent on constraints. // Do not specify both regExp and regExpGen. // tags: // extension protected return this.regExp; // String },
// state: [readonly] String // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) state: "",
// tooltipPosition: String[] // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. tooltipPosition: [],
validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to validate the text input against the regular expression. // tags: // protected return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && (!this.required || !this._isEmpty(value)) && (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean },
_isValidSubset: function(){ // summary: // Returns true if the value is either already valid or could be made valid by appending characters. // This is used for validation while the user [may be] still typing. return this.textbox.value.search(this._partialre) == 0; },
isValid: function(/*Boolean*/ isFocused){ // summary: // Tests if value is valid. // Can override with your own routine in a subclass. // tags: // protected return this.validator(this.textbox.value, this.constraints); },
getErrorMessage: function(/*Boolean*/ isFocused){ // summary: // Return an error message to show if appropriate // tags: // protected return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String },
getPromptMessage: function(/*Boolean*/ isFocused){ // summary: // Return a hint message to show when widget is first focused // tags: // protected return this.promptMessage; // String },
_maskValidSubsetError: true, validate: function(/*Boolean*/ isFocused){ // summary: // Called by oninit, onblur, and onkeypress. // description: // Show missing or invalid messages if appropriate, and highlight textbox field. // tags: // protected var message = ""; var isValid = this.disabled || this.isValid(isFocused); if(isValid){ this._maskValidSubsetError = true; } var isEmpty = this._isEmpty(this.textbox.value); var isValidSubset = !isValid && isFocused && this._isValidSubset(); this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error")); dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
if(this.state == "Error"){ this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus message = this.getErrorMessage(isFocused); }else if(this.state == "Incomplete"){ message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused }else if(isEmpty){ message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text } this.set("message", message);
var p = this.regExpGen(this.constraints); this.regExp = p; var partialre = ""; // parse the regexp and produce a new regexp that matches valid subsets // if the regexp is .* then there's no use in matching subsets since everything is valid if(p != ".*"){ this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g, function (re){ switch(re.charAt(0)){ case '{': case '+': case '?': case '*': case '^': case '$': case '|': case '(': partialre += re; break; case ")": partialre += "|$)"; break; default: partialre += "(?:"+re+"|$)"; break; } } );} try{ // this is needed for now since the above regexp parsing needs more test verification "".search(partialre); }catch(e){ // should never be here unless the original RE is bad or the parsing is bad partialre = this.regExp; console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); } // should never be here unless the original RE is bad or the parsing is bad this._partialre = "^(?:" + partialre + ")$";
dijit.form.ValidationTextBox.__Constraints = function(){ // locale: String // locale used for validation, picks up value from this widget's lang attribute // _flags_: anything // various flags passed to regExpGen function this.locale = ""; this._flags_ = ""; }
dojo.declare( "dijit.form.ValidationTextBox", dijit.form.TextBox, { // summary: // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. // tags: // protected
// required: Boolean // User is required to enter data into this field. required: false,
// promptMessage: String // If defined, display this hint string immediately on focus to the textbox, if empty. // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input). // Think of this like a tooltip that tells the user what to do, not an error message // that tells the user what they've done wrong. // // Message disappears when user starts typing. promptMessage: "",
// invalidMessage: String // The message to display if value is invalid. // The translated string value is read from the message file by default. // Set to "" to use the promptMessage instead. invalidMessage: "$_unset_$",
// missingMessage: String // The message to display if value is empty and the field is required. // The translated string value is read from the message file by default. // Set to "" to use the invalidMessage instead. missingMessage: "$_unset_$",
// message: String // Currently error/prompt message. // When using the default tooltip implementation, this will only be // displayed when the field is focused. message: "",
// constraints: dijit.form.ValidationTextBox.__Constraints // user-defined object needed to pass parameters to the validator functions constraints: {},
// regExp: [extension protected] String // regular expression string used to validate the input // Do not specify both regExp and regExpGen regExp: ".*",
regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to generate regExp when dependent on constraints. // Do not specify both regExp and regExpGen. // tags: // extension protected return this.regExp; // String },
// state: [readonly] String // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) state: "",
// tooltipPosition: String[] // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. tooltipPosition: [],
validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to validate the text input against the regular expression. // tags: // protected return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && (!this.required || !this._isEmpty(value)) && (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean },
_isValidSubset: function(){ // summary: // Returns true if the value is either already valid or could be made valid by appending characters. // This is used for validation while the user [may be] still typing. return this.textbox.value.search(this._partialre) == 0; },
isValid: function(/*Boolean*/ isFocused){ // summary: // Tests if value is valid. // Can override with your own routine in a subclass. // tags: // protected return this.validator(this.textbox.value, this.constraints); },
getErrorMessage: function(/*Boolean*/ isFocused){ // summary: // Return an error message to show if appropriate // tags: // protected return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String },
getPromptMessage: function(/*Boolean*/ isFocused){ // summary: // Return a hint message to show when widget is first focused // tags: // protected return this.promptMessage; // String },
_maskValidSubsetError: true, validate: function(/*Boolean*/ isFocused){ // summary: // Called by oninit, onblur, and onkeypress. // description: // Show missing or invalid messages if appropriate, and highlight textbox field. // tags: // protected var message = ""; var isValid = this.disabled || this.isValid(isFocused); if(isValid){ this._maskValidSubsetError = true; } var isEmpty = this._isEmpty(this.textbox.value); var isValidSubset = !isValid && isFocused && this._isValidSubset(); this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error")); dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
if(this.state == "Error"){ this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus message = this.getErrorMessage(isFocused); }else if(this.state == "Incomplete"){ message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused }else if(isEmpty){ message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text } this.set("message", message);
_computePartialRE: function(){ var p = this.regExpGen(this.constraints); this.regExp = p; var partialre = ""; // parse the regexp and produce a new regexp that matches valid subsets // if the regexp is .* then there's no use in matching subsets since everything is valid if(p != ".*"){ this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g, function (re){ switch(re.charAt(0)){ case '{': case '+': case '?': case '*': case '^': case '$': case '|': case '(': partialre += re; break; case ")": partialre += "|$)"; break; default: partialre += "(?:"+re+"|$)"; break; } } );} try{ // this is needed for now since the above regexp parsing needs more test verification "".search(partialre); }catch(e){ // should never be here unless the original RE is bad or the parsing is bad partialre = this.regExp; console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); } // should never be here unless the original RE is bad or the parsing is bad this._partialre = "^(?:" + partialre + ")$"; },
postMixInProperties: function(){ this.inherited(arguments); this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; } if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; } if(!this.missingMessage){ this.missingMessage = this.invalidMessage; } this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints },
reset:function(){ // Overrides dijit.form.TextBox.reset() by also // hiding errors about partial matches this._maskValidSubsetError = true; this.inherited(arguments); },
_onBlur: function(){ // the message still exists but for back-compat, and to erase the tooltip // (if the message is being displayed as a tooltip), call displayMessage('') this.displayMessage('');
this.inherited(arguments);
returns
String|Boolean
summary
dijit.form.ValidationTextBox._partialre
summary
dijit.form.ValidationTextBox.messages
summary
dijit.form.MappedTextBox
type
Function
chains:
dijit.form.ValidationTextBox: (prototype)
dijit.form.ValidationTextBox: (call)
summary
A dijit.form.ValidationTextBox subclass which provides a base class for widgets that have
a visible formatted display value, and a serializable
value in a hidden input field which is actually sent to the server.
description
The visible display may
be locale-dependent and interactive. The value sent to the server is stored in a hidden
input field which uses the `name` attribute declared by the original widget. That value sent
to the server is defined by the dijit.form.MappedTextBox.serialize method and is typically
locale-neutral.
tags:
protected
// we want the name attribute to go to the hidden , not the displayed , // so override _FormWidget.postMixInProperties() setting of nameAttrSetting this.nameAttrSetting = "";
Overridable function used to convert the get('value') result to a canonical
(non-localized) string. For example, will print dates in ISO format, and
numbers the same way as they are represented in javascript.
var val = this.filter(this.get('value')); // call filter in case value is nonstring and filter has been customized return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String
summary
Returns widget as a printable string using the widget's value
dijit.form.ValidationTextBox.__Constraints = function(){ // locale: String // locale used for validation, picks up value from this widget's lang attribute // _flags_: anything // various flags passed to regExpGen function this.locale = ""; this._flags_ = ""; }
dojo.declare( "dijit.form.ValidationTextBox", dijit.form.TextBox, { // summary: // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. // tags: // protected
// required: Boolean // User is required to enter data into this field. required: false,
// promptMessage: String // If defined, display this hint string immediately on focus to the textbox, if empty. // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input). // Think of this like a tooltip that tells the user what to do, not an error message // that tells the user what they've done wrong. // // Message disappears when user starts typing. promptMessage: "",
// invalidMessage: String // The message to display if value is invalid. // The translated string value is read from the message file by default. // Set to "" to use the promptMessage instead. invalidMessage: "$_unset_$",
// missingMessage: String // The message to display if value is empty and the field is required. // The translated string value is read from the message file by default. // Set to "" to use the invalidMessage instead. missingMessage: "$_unset_$",
// message: String // Currently error/prompt message. // When using the default tooltip implementation, this will only be // displayed when the field is focused. message: "",
// constraints: dijit.form.ValidationTextBox.__Constraints // user-defined object needed to pass parameters to the validator functions constraints: {},
// regExp: [extension protected] String // regular expression string used to validate the input // Do not specify both regExp and regExpGen regExp: ".*",
regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to generate regExp when dependent on constraints. // Do not specify both regExp and regExpGen. // tags: // extension protected return this.regExp; // String },
// state: [readonly] String // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) state: "",
// tooltipPosition: String[] // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. tooltipPosition: [],
validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to validate the text input against the regular expression. // tags: // protected return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && (!this.required || !this._isEmpty(value)) && (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean },
_isValidSubset: function(){ // summary: // Returns true if the value is either already valid or could be made valid by appending characters. // This is used for validation while the user [may be] still typing. return this.textbox.value.search(this._partialre) == 0; },
isValid: function(/*Boolean*/ isFocused){ // summary: // Tests if value is valid. // Can override with your own routine in a subclass. // tags: // protected return this.validator(this.textbox.value, this.constraints); },
getErrorMessage: function(/*Boolean*/ isFocused){ // summary: // Return an error message to show if appropriate // tags: // protected return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String },
getPromptMessage: function(/*Boolean*/ isFocused){ // summary: // Return a hint message to show when widget is first focused // tags: // protected return this.promptMessage; // String },
_maskValidSubsetError: true, validate: function(/*Boolean*/ isFocused){ // summary: // Called by oninit, onblur, and onkeypress. // description: // Show missing or invalid messages if appropriate, and highlight textbox field. // tags: // protected var message = ""; var isValid = this.disabled || this.isValid(isFocused); if(isValid){ this._maskValidSubsetError = true; } var isEmpty = this._isEmpty(this.textbox.value); var isValidSubset = !isValid && isFocused && this._isValidSubset(); this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error")); dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
if(this.state == "Error"){ this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus message = this.getErrorMessage(isFocused); }else if(this.state == "Incomplete"){ message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused }else if(isEmpty){ message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text } this.set("message", message);
_computePartialRE: function(){ var p = this.regExpGen(this.constraints); this.regExp = p; var partialre = ""; // parse the regexp and produce a new regexp that matches valid subsets // if the regexp is .* then there's no use in matching subsets since everything is valid if(p != ".*"){ this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g, function (re){ switch(re.charAt(0)){ case '{': case '+': case '?': case '*': case '^': case '$': case '|': case '(': partialre += re; break; case ")": partialre += "|$)"; break; default: partialre += "(?:"+re+"|$)"; break; } } );} try{ // this is needed for now since the above regexp parsing needs more test verification "".search(partialre); }catch(e){ // should never be here unless the original RE is bad or the parsing is bad partialre = this.regExp; console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); } // should never be here unless the original RE is bad or the parsing is bad this._partialre = "^(?:" + partialre + ")$"; },
postMixInProperties: function(){ this.inherited(arguments); this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; } if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; } if(!this.missingMessage){ this.missingMessage = this.invalidMessage; } this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints },
reset:function(){ // Overrides dijit.form.TextBox.reset() by also // hiding errors about partial matches this._maskValidSubsetError = true; this.inherited(arguments); },
_onBlur: function(){ // the message still exists but for back-compat, and to erase the tooltip // (if the message is being displayed as a tooltip), call displayMessage('') this.displayMessage('');
this.inherited(arguments); } } );
dojo.declare( "dijit.form.MappedTextBox", dijit.form.ValidationTextBox, { // summary: // A dijit.form.ValidationTextBox subclass which provides a base class for widgets that have // a visible formatted display value, and a serializable // value in a hidden input field which is actually sent to the server. // description: // The visible display may // be locale-dependent and interactive. The value sent to the server is stored in a hidden // input field which uses the `name` attribute declared by the original widget. That value sent // to the server is defined by the dijit.form.MappedTextBox.serialize method and is typically // locale-neutral. // tags: // protected
// we want the name attribute to go to the hidden , not the displayed , // so override _FormWidget.postMixInProperties() setting of nameAttrSetting this.nameAttrSetting = ""; },
serialize: function(/*anything*/ val, /*Object?*/ options){ // summary: // Overridable function used to convert the get('value') result to a canonical // (non-localized) string. For example, will print dates in ISO format, and // numbers the same way as they are represented in javascript. // tags: // protected extension return val.toString ? val.toString() : ""; // String },
toString: function(){ // summary: // Returns widget as a printable string using the widget's value // tags: // protected var val = this.filter(this.get('value')); // call filter in case value is nonstring and filter has been customized return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String },
dijit.form.ValidationTextBox.__Constraints = function(){ // locale: String // locale used for validation, picks up value from this widget's lang attribute // _flags_: anything // various flags passed to regExpGen function this.locale = ""; this._flags_ = ""; }
dojo.declare( "dijit.form.ValidationTextBox", dijit.form.TextBox, { // summary: // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. // tags: // protected
// required: Boolean // User is required to enter data into this field. required: false,
// promptMessage: String // If defined, display this hint string immediately on focus to the textbox, if empty. // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input). // Think of this like a tooltip that tells the user what to do, not an error message // that tells the user what they've done wrong. // // Message disappears when user starts typing. promptMessage: "",
// invalidMessage: String // The message to display if value is invalid. // The translated string value is read from the message file by default. // Set to "" to use the promptMessage instead. invalidMessage: "$_unset_$",
// missingMessage: String // The message to display if value is empty and the field is required. // The translated string value is read from the message file by default. // Set to "" to use the invalidMessage instead. missingMessage: "$_unset_$",
// message: String // Currently error/prompt message. // When using the default tooltip implementation, this will only be // displayed when the field is focused. message: "",
// constraints: dijit.form.ValidationTextBox.__Constraints // user-defined object needed to pass parameters to the validator functions constraints: {},
// regExp: [extension protected] String // regular expression string used to validate the input // Do not specify both regExp and regExpGen regExp: ".*",
regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to generate regExp when dependent on constraints. // Do not specify both regExp and regExpGen. // tags: // extension protected return this.regExp; // String },
// state: [readonly] String // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) state: "",
// tooltipPosition: String[] // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. tooltipPosition: [],
validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to validate the text input against the regular expression. // tags: // protected return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && (!this.required || !this._isEmpty(value)) && (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean },
_isValidSubset: function(){ // summary: // Returns true if the value is either already valid or could be made valid by appending characters. // This is used for validation while the user [may be] still typing. return this.textbox.value.search(this._partialre) == 0; },
isValid: function(/*Boolean*/ isFocused){ // summary: // Tests if value is valid. // Can override with your own routine in a subclass. // tags: // protected return this.validator(this.textbox.value, this.constraints); },
getErrorMessage: function(/*Boolean*/ isFocused){ // summary: // Return an error message to show if appropriate // tags: // protected return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String },
getPromptMessage: function(/*Boolean*/ isFocused){ // summary: // Return a hint message to show when widget is first focused // tags: // protected return this.promptMessage; // String },
_maskValidSubsetError: true, validate: function(/*Boolean*/ isFocused){ // summary: // Called by oninit, onblur, and onkeypress. // description: // Show missing or invalid messages if appropriate, and highlight textbox field. // tags: // protected var message = ""; var isValid = this.disabled || this.isValid(isFocused); if(isValid){ this._maskValidSubsetError = true; } var isEmpty = this._isEmpty(this.textbox.value); var isValidSubset = !isValid && isFocused && this._isValidSubset(); this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error")); dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
if(this.state == "Error"){ this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus message = this.getErrorMessage(isFocused); }else if(this.state == "Incomplete"){ message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused }else if(isEmpty){ message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text } this.set("message", message);
_computePartialRE: function(){ var p = this.regExpGen(this.constraints); this.regExp = p; var partialre = ""; // parse the regexp and produce a new regexp that matches valid subsets // if the regexp is .* then there's no use in matching subsets since everything is valid if(p != ".*"){ this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g, function (re){ switch(re.charAt(0)){ case '{': case '+': case '?': case '*': case '^': case '$': case '|': case '(': partialre += re; break; case ")": partialre += "|$)"; break; default: partialre += "(?:"+re+"|$)"; break; } } );} try{ // this is needed for now since the above regexp parsing needs more test verification "".search(partialre); }catch(e){ // should never be here unless the original RE is bad or the parsing is bad partialre = this.regExp; console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); } // should never be here unless the original RE is bad or the parsing is bad this._partialre = "^(?:" + partialre + ")$"; },
postMixInProperties: function(){ this.inherited(arguments); this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; } if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; } if(!this.missingMessage){ this.missingMessage = this.invalidMessage; } this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints },
reset:function(){ // Overrides dijit.form.TextBox.reset() by also // hiding errors about partial matches this._maskValidSubsetError = true; this.inherited(arguments); },
_onBlur: function(){ // the message still exists but for back-compat, and to erase the tooltip // (if the message is being displayed as a tooltip), call displayMessage('') this.displayMessage('');
this.inherited(arguments); } } );
dojo.declare( "dijit.form.MappedTextBox", dijit.form.ValidationTextBox, { // summary: // A dijit.form.ValidationTextBox subclass which provides a base class for widgets that have // a visible formatted display value, and a serializable // value in a hidden input field which is actually sent to the server. // description: // The visible display may // be locale-dependent and interactive. The value sent to the server is stored in a hidden // input field which uses the `name` attribute declared by the original widget. That value sent // to the server is defined by the dijit.form.MappedTextBox.serialize method and is typically // locale-neutral. // tags: // protected
// we want the name attribute to go to the hidden , not the displayed , // so override _FormWidget.postMixInProperties() setting of nameAttrSetting this.nameAttrSetting = ""; },
serialize: function(/*anything*/ val, /*Object?*/ options){ // summary: // Overridable function used to convert the get('value') result to a canonical // (non-localized) string. For example, will print dates in ISO format, and // numbers the same way as they are represented in javascript. // tags: // protected extension return val.toString ? val.toString() : ""; // String },
toString: function(){ // summary: // Returns widget as a printable string using the widget's value // tags: // protected var val = this.filter(this.get('value')); // call filter in case value is nonstring and filter has been customized return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String },
// Create a hidden node with the serialized value used for submit // (as opposed to the displayed value). // Passing in name as markup rather than calling dojo.create() with an attrs argument // to make dojo.query(input[name=...]) work on IE. (see #8660) this.valueNode = dojo.place("", this.textbox, "after");
dijit.form.ValidationTextBox.__Constraints = function(){ // locale: String // locale used for validation, picks up value from this widget's lang attribute // _flags_: anything // various flags passed to regExpGen function this.locale = ""; this._flags_ = ""; }
dojo.declare( "dijit.form.ValidationTextBox", dijit.form.TextBox, { // summary: // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. // tags: // protected
// required: Boolean // User is required to enter data into this field. required: false,
// promptMessage: String // If defined, display this hint string immediately on focus to the textbox, if empty. // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input). // Think of this like a tooltip that tells the user what to do, not an error message // that tells the user what they've done wrong. // // Message disappears when user starts typing. promptMessage: "",
// invalidMessage: String // The message to display if value is invalid. // The translated string value is read from the message file by default. // Set to "" to use the promptMessage instead. invalidMessage: "$_unset_$",
// missingMessage: String // The message to display if value is empty and the field is required. // The translated string value is read from the message file by default. // Set to "" to use the invalidMessage instead. missingMessage: "$_unset_$",
// message: String // Currently error/prompt message. // When using the default tooltip implementation, this will only be // displayed when the field is focused. message: "",
// constraints: dijit.form.ValidationTextBox.__Constraints // user-defined object needed to pass parameters to the validator functions constraints: {},
// regExp: [extension protected] String // regular expression string used to validate the input // Do not specify both regExp and regExpGen regExp: ".*",
regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to generate regExp when dependent on constraints. // Do not specify both regExp and regExpGen. // tags: // extension protected return this.regExp; // String },
// state: [readonly] String // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) state: "",
// tooltipPosition: String[] // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. tooltipPosition: [],
validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to validate the text input against the regular expression. // tags: // protected return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && (!this.required || !this._isEmpty(value)) && (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean },
_isValidSubset: function(){ // summary: // Returns true if the value is either already valid or could be made valid by appending characters. // This is used for validation while the user [may be] still typing. return this.textbox.value.search(this._partialre) == 0; },
isValid: function(/*Boolean*/ isFocused){ // summary: // Tests if value is valid. // Can override with your own routine in a subclass. // tags: // protected return this.validator(this.textbox.value, this.constraints); },
getErrorMessage: function(/*Boolean*/ isFocused){ // summary: // Return an error message to show if appropriate // tags: // protected return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String },
getPromptMessage: function(/*Boolean*/ isFocused){ // summary: // Return a hint message to show when widget is first focused // tags: // protected return this.promptMessage; // String },
_maskValidSubsetError: true, validate: function(/*Boolean*/ isFocused){ // summary: // Called by oninit, onblur, and onkeypress. // description: // Show missing or invalid messages if appropriate, and highlight textbox field. // tags: // protected var message = ""; var isValid = this.disabled || this.isValid(isFocused); if(isValid){ this._maskValidSubsetError = true; } var isEmpty = this._isEmpty(this.textbox.value); var isValidSubset = !isValid && isFocused && this._isValidSubset(); this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error")); dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
if(this.state == "Error"){ this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus message = this.getErrorMessage(isFocused); }else if(this.state == "Incomplete"){ message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused }else if(isEmpty){ message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text } this.set("message", message);
_computePartialRE: function(){ var p = this.regExpGen(this.constraints); this.regExp = p; var partialre = ""; // parse the regexp and produce a new regexp that matches valid subsets // if the regexp is .* then there's no use in matching subsets since everything is valid if(p != ".*"){ this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g, function (re){ switch(re.charAt(0)){ case '{': case '+': case '?': case '*': case '^': case '$': case '|': case '(': partialre += re; break; case ")": partialre += "|$)"; break; default: partialre += "(?:"+re+"|$)"; break; } } );} try{ // this is needed for now since the above regexp parsing needs more test verification "".search(partialre); }catch(e){ // should never be here unless the original RE is bad or the parsing is bad partialre = this.regExp; console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); } // should never be here unless the original RE is bad or the parsing is bad this._partialre = "^(?:" + partialre + ")$"; },
postMixInProperties: function(){ this.inherited(arguments); this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; } if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; } if(!this.missingMessage){ this.missingMessage = this.invalidMessage; } this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints },
reset:function(){ // Overrides dijit.form.TextBox.reset() by also // hiding errors about partial matches this._maskValidSubsetError = true; this.inherited(arguments); },
_onBlur: function(){ // the message still exists but for back-compat, and to erase the tooltip // (if the message is being displayed as a tooltip), call displayMessage('') this.displayMessage('');
this.inherited(arguments); } } );
dojo.declare( "dijit.form.MappedTextBox", dijit.form.ValidationTextBox, { // summary: // A dijit.form.ValidationTextBox subclass which provides a base class for widgets that have // a visible formatted display value, and a serializable // value in a hidden input field which is actually sent to the server. // description: // The visible display may // be locale-dependent and interactive. The value sent to the server is stored in a hidden // input field which uses the `name` attribute declared by the original widget. That value sent // to the server is defined by the dijit.form.MappedTextBox.serialize method and is typically // locale-neutral. // tags: // protected
// we want the name attribute to go to the hidden , not the displayed , // so override _FormWidget.postMixInProperties() setting of nameAttrSetting this.nameAttrSetting = ""; },
serialize: function(/*anything*/ val, /*Object?*/ options){ // summary: // Overridable function used to convert the get('value') result to a canonical // (non-localized) string. For example, will print dates in ISO format, and // numbers the same way as they are represented in javascript. // tags: // protected extension return val.toString ? val.toString() : ""; // String },
toString: function(){ // summary: // Returns widget as a printable string using the widget's value // tags: // protected var val = this.filter(this.get('value')); // call filter in case value is nonstring and filter has been customized return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String },
// Create a hidden node with the serialized value used for submit // (as opposed to the displayed value). // Passing in name as markup rather than calling dojo.create() with an attrs argument // to make dojo.query(input[name=...]) work on IE. (see #8660) this.valueNode = dojo.place("", this.textbox, "after"); },
reset: function(){ // Overrides `dijit.form.ValidationTextBox.reset` to // reset the hidden textbox value to '' this.valueNode.value = ''; this.inherited(arguments);
returns
String|Boolean
summary
dijit.form.MappedTextBox.nameAttrSetting
summary
dijit.form.MappedTextBox.valueNode.value
summary
dijit.form.MappedTextBox.valueNode
summary
dijit.form.RangeBoundTextBox
type
Function
chains:
dijit.form.MappedTextBox: (prototype)
dijit.form.MappedTextBox: (call)
summary
Base class for textbox form widgets which defines a range of valid values.
var val = this.get('value'); var isTooLittle = false; var isTooMuch = false; if("min" in this.constraints){ var min = this.constraints.min; min = this.compare(val, ((typeof min == "number") && min >= 0 && val !=0) ? 0 : min); isTooLittle = (typeof min == "number") && min < 0; } if("max" in this.constraints){ var max = this.constraints.max; max = this.compare(val, ((typeof max != "number") || max > 0) ? max : 0); isTooMuch = (typeof max == "number") && max > 0; } return isTooLittle || isTooMuch;
summary
Returns true if the value is out of range and will remain
out of range even if the user types more characters
Overrides `dijit.form.ValidationTextBox._isValidSubset`.
Returns true if the input is syntactically valid, and either within
range or could be made in range by more typing.
dijit.form.ValidationTextBox.__Constraints = function(){ // locale: String // locale used for validation, picks up value from this widget's lang attribute // _flags_: anything // various flags passed to regExpGen function this.locale = ""; this._flags_ = ""; }
dojo.declare( "dijit.form.ValidationTextBox", dijit.form.TextBox, { // summary: // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. // tags: // protected
// required: Boolean // User is required to enter data into this field. required: false,
// promptMessage: String // If defined, display this hint string immediately on focus to the textbox, if empty. // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input). // Think of this like a tooltip that tells the user what to do, not an error message // that tells the user what they've done wrong. // // Message disappears when user starts typing. promptMessage: "",
// invalidMessage: String // The message to display if value is invalid. // The translated string value is read from the message file by default. // Set to "" to use the promptMessage instead. invalidMessage: "$_unset_$",
// missingMessage: String // The message to display if value is empty and the field is required. // The translated string value is read from the message file by default. // Set to "" to use the invalidMessage instead. missingMessage: "$_unset_$",
// message: String // Currently error/prompt message. // When using the default tooltip implementation, this will only be // displayed when the field is focused. message: "",
// constraints: dijit.form.ValidationTextBox.__Constraints // user-defined object needed to pass parameters to the validator functions constraints: {},
// regExp: [extension protected] String // regular expression string used to validate the input // Do not specify both regExp and regExpGen regExp: ".*",
regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to generate regExp when dependent on constraints. // Do not specify both regExp and regExpGen. // tags: // extension protected return this.regExp; // String },
// state: [readonly] String // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) state: "",
// tooltipPosition: String[] // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. tooltipPosition: [],
validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to validate the text input against the regular expression. // tags: // protected return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && (!this.required || !this._isEmpty(value)) && (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean },
_isValidSubset: function(){ // summary: // Returns true if the value is either already valid or could be made valid by appending characters. // This is used for validation while the user [may be] still typing. return this.textbox.value.search(this._partialre) == 0; },
isValid: function(/*Boolean*/ isFocused){ // summary: // Tests if value is valid. // Can override with your own routine in a subclass. // tags: // protected return this.validator(this.textbox.value, this.constraints); },
getErrorMessage: function(/*Boolean*/ isFocused){ // summary: // Return an error message to show if appropriate // tags: // protected return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String },
getPromptMessage: function(/*Boolean*/ isFocused){ // summary: // Return a hint message to show when widget is first focused // tags: // protected return this.promptMessage; // String },
_maskValidSubsetError: true, validate: function(/*Boolean*/ isFocused){ // summary: // Called by oninit, onblur, and onkeypress. // description: // Show missing or invalid messages if appropriate, and highlight textbox field. // tags: // protected var message = ""; var isValid = this.disabled || this.isValid(isFocused); if(isValid){ this._maskValidSubsetError = true; } var isEmpty = this._isEmpty(this.textbox.value); var isValidSubset = !isValid && isFocused && this._isValidSubset(); this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error")); dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
if(this.state == "Error"){ this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus message = this.getErrorMessage(isFocused); }else if(this.state == "Incomplete"){ message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused }else if(isEmpty){ message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text } this.set("message", message);
_computePartialRE: function(){ var p = this.regExpGen(this.constraints); this.regExp = p; var partialre = ""; // parse the regexp and produce a new regexp that matches valid subsets // if the regexp is .* then there's no use in matching subsets since everything is valid if(p != ".*"){ this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g, function (re){ switch(re.charAt(0)){ case '{': case '+': case '?': case '*': case '^': case '$': case '|': case '(': partialre += re; break; case ")": partialre += "|$)"; break; default: partialre += "(?:"+re+"|$)"; break; } } );} try{ // this is needed for now since the above regexp parsing needs more test verification "".search(partialre); }catch(e){ // should never be here unless the original RE is bad or the parsing is bad partialre = this.regExp; console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); } // should never be here unless the original RE is bad or the parsing is bad this._partialre = "^(?:" + partialre + ")$"; },
postMixInProperties: function(){ this.inherited(arguments); this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; } if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; } if(!this.missingMessage){ this.missingMessage = this.invalidMessage; } this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints },
reset:function(){ // Overrides dijit.form.TextBox.reset() by also // hiding errors about partial matches this._maskValidSubsetError = true; this.inherited(arguments); },
_onBlur: function(){ // the message still exists but for back-compat, and to erase the tooltip // (if the message is being displayed as a tooltip), call displayMessage('') this.displayMessage('');
this.inherited(arguments); } } );
dojo.declare( "dijit.form.MappedTextBox", dijit.form.ValidationTextBox, { // summary: // A dijit.form.ValidationTextBox subclass which provides a base class for widgets that have // a visible formatted display value, and a serializable // value in a hidden input field which is actually sent to the server. // description: // The visible display may // be locale-dependent and interactive. The value sent to the server is stored in a hidden // input field which uses the `name` attribute declared by the original widget. That value sent // to the server is defined by the dijit.form.MappedTextBox.serialize method and is typically // locale-neutral. // tags: // protected
// we want the name attribute to go to the hidden , not the displayed , // so override _FormWidget.postMixInProperties() setting of nameAttrSetting this.nameAttrSetting = ""; },
serialize: function(/*anything*/ val, /*Object?*/ options){ // summary: // Overridable function used to convert the get('value') result to a canonical // (non-localized) string. For example, will print dates in ISO format, and // numbers the same way as they are represented in javascript. // tags: // protected extension return val.toString ? val.toString() : ""; // String },
toString: function(){ // summary: // Returns widget as a printable string using the widget's value // tags: // protected var val = this.filter(this.get('value')); // call filter in case value is nonstring and filter has been customized return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String },
// Create a hidden node with the serialized value used for submit // (as opposed to the displayed value). // Passing in name as markup rather than calling dojo.create() with an attrs argument // to make dojo.query(input[name=...]) work on IE. (see #8660) this.valueNode = dojo.place("", this.textbox, "after"); },
reset: function(){ // Overrides `dijit.form.ValidationTextBox.reset` to // reset the hidden textbox value to '' this.valueNode.value = ''; this.inherited(arguments); } } );
dijit.form.RangeBoundTextBox.__Constraints = function(){ // min: Number // Minimum signed value. Default is -Infinity // max: Number // Maximum signed value. Default is +Infinity this.min = min; this.max = max; }
dojo.declare( "dijit.form.RangeBoundTextBox", dijit.form.MappedTextBox, { // summary: // Base class for textbox form widgets which defines a range of valid values.
// rangeMessage: String // The message to display if value is out-of-range rangeMessage: "",
rangeCheck: function(/*Number*/ primitive, /*dijit.form.RangeBoundTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to validate the range of the numeric input value. // tags: // protected return ("min" in constraints? (this.compare(primitive,constraints.min) >= 0) : true) && ("max" in constraints? (this.compare(primitive,constraints.max) <= 0) : true); // Boolean },
isInRange: function(/*Boolean*/ isFocused){ // summary: // Tests if the value is in the min/max range specified in constraints // tags: // protected return this.rangeCheck(this.get('value'), this.constraints); },
_isDefinitelyOutOfRange: function(){ // summary: // Returns true if the value is out of range and will remain // out of range even if the user types more characters var val = this.get('value'); var isTooLittle = false; var isTooMuch = false; if("min" in this.constraints){ var min = this.constraints.min; min = this.compare(val, ((typeof min == "number") && min >= 0 && val !=0) ? 0 : min); isTooLittle = (typeof min == "number") && min < 0; } if("max" in this.constraints){ var max = this.constraints.max; max = this.compare(val, ((typeof max != "number") || max > 0) ? max : 0); isTooMuch = (typeof max == "number") && max > 0; } return isTooLittle || isTooMuch; },
_isValidSubset: function(){ // summary: // Overrides `dijit.form.ValidationTextBox._isValidSubset`. // Returns true if the input is syntactically valid, and either within // range or could be made in range by more typing. return this.inherited(arguments) && !this._isDefinitelyOutOfRange(); },
isValid: function(/*Boolean*/ isFocused){ // Overrides dijit.form.ValidationTextBox.isValid to check that the value is also in range. return this.inherited(arguments) && ((this._isEmpty(this.textbox.value) && !this.required) || this.isInRange(isFocused)); // Boolean
dijit.form.ValidationTextBox.__Constraints = function(){ // locale: String // locale used for validation, picks up value from this widget's lang attribute // _flags_: anything // various flags passed to regExpGen function this.locale = ""; this._flags_ = ""; }
dojo.declare( "dijit.form.ValidationTextBox", dijit.form.TextBox, { // summary: // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. // tags: // protected
// required: Boolean // User is required to enter data into this field. required: false,
// promptMessage: String // If defined, display this hint string immediately on focus to the textbox, if empty. // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input). // Think of this like a tooltip that tells the user what to do, not an error message // that tells the user what they've done wrong. // // Message disappears when user starts typing. promptMessage: "",
// invalidMessage: String // The message to display if value is invalid. // The translated string value is read from the message file by default. // Set to "" to use the promptMessage instead. invalidMessage: "$_unset_$",
// missingMessage: String // The message to display if value is empty and the field is required. // The translated string value is read from the message file by default. // Set to "" to use the invalidMessage instead. missingMessage: "$_unset_$",
// message: String // Currently error/prompt message. // When using the default tooltip implementation, this will only be // displayed when the field is focused. message: "",
// constraints: dijit.form.ValidationTextBox.__Constraints // user-defined object needed to pass parameters to the validator functions constraints: {},
// regExp: [extension protected] String // regular expression string used to validate the input // Do not specify both regExp and regExpGen regExp: ".*",
regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to generate regExp when dependent on constraints. // Do not specify both regExp and regExpGen. // tags: // extension protected return this.regExp; // String },
// state: [readonly] String // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) state: "",
// tooltipPosition: String[] // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. tooltipPosition: [],
validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to validate the text input against the regular expression. // tags: // protected return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && (!this.required || !this._isEmpty(value)) && (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean },
_isValidSubset: function(){ // summary: // Returns true if the value is either already valid or could be made valid by appending characters. // This is used for validation while the user [may be] still typing. return this.textbox.value.search(this._partialre) == 0; },
isValid: function(/*Boolean*/ isFocused){ // summary: // Tests if value is valid. // Can override with your own routine in a subclass. // tags: // protected return this.validator(this.textbox.value, this.constraints); },
getErrorMessage: function(/*Boolean*/ isFocused){ // summary: // Return an error message to show if appropriate // tags: // protected return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String },
getPromptMessage: function(/*Boolean*/ isFocused){ // summary: // Return a hint message to show when widget is first focused // tags: // protected return this.promptMessage; // String },
_maskValidSubsetError: true, validate: function(/*Boolean*/ isFocused){ // summary: // Called by oninit, onblur, and onkeypress. // description: // Show missing or invalid messages if appropriate, and highlight textbox field. // tags: // protected var message = ""; var isValid = this.disabled || this.isValid(isFocused); if(isValid){ this._maskValidSubsetError = true; } var isEmpty = this._isEmpty(this.textbox.value); var isValidSubset = !isValid && isFocused && this._isValidSubset(); this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error")); dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
if(this.state == "Error"){ this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus message = this.getErrorMessage(isFocused); }else if(this.state == "Incomplete"){ message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused }else if(isEmpty){ message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text } this.set("message", message);
_computePartialRE: function(){ var p = this.regExpGen(this.constraints); this.regExp = p; var partialre = ""; // parse the regexp and produce a new regexp that matches valid subsets // if the regexp is .* then there's no use in matching subsets since everything is valid if(p != ".*"){ this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g, function (re){ switch(re.charAt(0)){ case '{': case '+': case '?': case '*': case '^': case '$': case '|': case '(': partialre += re; break; case ")": partialre += "|$)"; break; default: partialre += "(?:"+re+"|$)"; break; } } );} try{ // this is needed for now since the above regexp parsing needs more test verification "".search(partialre); }catch(e){ // should never be here unless the original RE is bad or the parsing is bad partialre = this.regExp; console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); } // should never be here unless the original RE is bad or the parsing is bad this._partialre = "^(?:" + partialre + ")$"; },
postMixInProperties: function(){ this.inherited(arguments); this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; } if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; } if(!this.missingMessage){ this.missingMessage = this.invalidMessage; } this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints },
reset:function(){ // Overrides dijit.form.TextBox.reset() by also // hiding errors about partial matches this._maskValidSubsetError = true; this.inherited(arguments); },
_onBlur: function(){ // the message still exists but for back-compat, and to erase the tooltip // (if the message is being displayed as a tooltip), call displayMessage('') this.displayMessage('');
this.inherited(arguments); } } );
dojo.declare( "dijit.form.MappedTextBox", dijit.form.ValidationTextBox, { // summary: // A dijit.form.ValidationTextBox subclass which provides a base class for widgets that have // a visible formatted display value, and a serializable // value in a hidden input field which is actually sent to the server. // description: // The visible display may // be locale-dependent and interactive. The value sent to the server is stored in a hidden // input field which uses the `name` attribute declared by the original widget. That value sent // to the server is defined by the dijit.form.MappedTextBox.serialize method and is typically // locale-neutral. // tags: // protected
// we want the name attribute to go to the hidden , not the displayed , // so override _FormWidget.postMixInProperties() setting of nameAttrSetting this.nameAttrSetting = ""; },
serialize: function(/*anything*/ val, /*Object?*/ options){ // summary: // Overridable function used to convert the get('value') result to a canonical // (non-localized) string. For example, will print dates in ISO format, and // numbers the same way as they are represented in javascript. // tags: // protected extension return val.toString ? val.toString() : ""; // String },
toString: function(){ // summary: // Returns widget as a printable string using the widget's value // tags: // protected var val = this.filter(this.get('value')); // call filter in case value is nonstring and filter has been customized return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String },
// Create a hidden node with the serialized value used for submit // (as opposed to the displayed value). // Passing in name as markup rather than calling dojo.create() with an attrs argument // to make dojo.query(input[name=...]) work on IE. (see #8660) this.valueNode = dojo.place("", this.textbox, "after"); },
reset: function(){ // Overrides `dijit.form.ValidationTextBox.reset` to // reset the hidden textbox value to '' this.valueNode.value = ''; this.inherited(arguments); } } );
dijit.form.RangeBoundTextBox.__Constraints = function(){ // min: Number // Minimum signed value. Default is -Infinity // max: Number // Maximum signed value. Default is +Infinity this.min = min; this.max = max; }
dojo.declare( "dijit.form.RangeBoundTextBox", dijit.form.MappedTextBox, { // summary: // Base class for textbox form widgets which defines a range of valid values.
// rangeMessage: String // The message to display if value is out-of-range rangeMessage: "",
rangeCheck: function(/*Number*/ primitive, /*dijit.form.RangeBoundTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to validate the range of the numeric input value. // tags: // protected return ("min" in constraints? (this.compare(primitive,constraints.min) >= 0) : true) && ("max" in constraints? (this.compare(primitive,constraints.max) <= 0) : true); // Boolean },
isInRange: function(/*Boolean*/ isFocused){ // summary: // Tests if the value is in the min/max range specified in constraints // tags: // protected return this.rangeCheck(this.get('value'), this.constraints); },
_isDefinitelyOutOfRange: function(){ // summary: // Returns true if the value is out of range and will remain // out of range even if the user types more characters var val = this.get('value'); var isTooLittle = false; var isTooMuch = false; if("min" in this.constraints){ var min = this.constraints.min; min = this.compare(val, ((typeof min == "number") && min >= 0 && val !=0) ? 0 : min); isTooLittle = (typeof min == "number") && min < 0; } if("max" in this.constraints){ var max = this.constraints.max; max = this.compare(val, ((typeof max != "number") || max > 0) ? max : 0); isTooMuch = (typeof max == "number") && max > 0; } return isTooLittle || isTooMuch; },
_isValidSubset: function(){ // summary: // Overrides `dijit.form.ValidationTextBox._isValidSubset`. // Returns true if the input is syntactically valid, and either within // range or could be made in range by more typing. return this.inherited(arguments) && !this._isDefinitelyOutOfRange(); },
isValid: function(/*Boolean*/ isFocused){ // Overrides dijit.form.ValidationTextBox.isValid to check that the value is also in range. return this.inherited(arguments) && ((this._isEmpty(this.textbox.value) && !this.required) || this.isInRange(isFocused)); // Boolean },
getErrorMessage: function(/*Boolean*/ isFocused){ // Overrides dijit.form.ValidationTextBox.getErrorMessage to print "out of range" message if appropriate var v = this.get('value'); if(v !== null && v !== '' && v !== undefined && (typeof v != "number" || !isNaN(v)) && !this.isInRange(isFocused)){ // don't check isInRange w/o a real value return this.rangeMessage; // String } return this.inherited(arguments);
dijit.form.ValidationTextBox.__Constraints = function(){ // locale: String // locale used for validation, picks up value from this widget's lang attribute // _flags_: anything // various flags passed to regExpGen function this.locale = ""; this._flags_ = "";
summary
dijit.form.ValidationTextBox.__Constraints.locale
type
String
summary
locale used for validation, picks up value from this widget's lang attribute
dijit.form.ValidationTextBox.__Constraints = function(){ // locale: String // locale used for validation, picks up value from this widget's lang attribute // _flags_: anything // various flags passed to regExpGen function this.locale = ""; this._flags_ = ""; }
dojo.declare( "dijit.form.ValidationTextBox", dijit.form.TextBox, { // summary: // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. // tags: // protected
// required: Boolean // User is required to enter data into this field. required: false,
// promptMessage: String // If defined, display this hint string immediately on focus to the textbox, if empty. // Also displays if the textbox value is Incomplete (not yet valid but will be with additional input). // Think of this like a tooltip that tells the user what to do, not an error message // that tells the user what they've done wrong. // // Message disappears when user starts typing. promptMessage: "",
// invalidMessage: String // The message to display if value is invalid. // The translated string value is read from the message file by default. // Set to "" to use the promptMessage instead. invalidMessage: "$_unset_$",
// missingMessage: String // The message to display if value is empty and the field is required. // The translated string value is read from the message file by default. // Set to "" to use the invalidMessage instead. missingMessage: "$_unset_$",
// message: String // Currently error/prompt message. // When using the default tooltip implementation, this will only be // displayed when the field is focused. message: "",
// constraints: dijit.form.ValidationTextBox.__Constraints // user-defined object needed to pass parameters to the validator functions constraints: {},
// regExp: [extension protected] String // regular expression string used to validate the input // Do not specify both regExp and regExpGen regExp: ".*",
regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to generate regExp when dependent on constraints. // Do not specify both regExp and regExpGen. // tags: // extension protected return this.regExp; // String },
// state: [readonly] String // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) state: "",
// tooltipPosition: String[] // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. tooltipPosition: [],
validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ // summary: // Overridable function used to validate the text input against the regular expression. // tags: // protected return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && (!this.required || !this._isEmpty(value)) && (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean },
_isValidSubset: function(){ // summary: // Returns true if the value is either already valid or could be made valid by appending characters. // This is used for validation while the user [may be] still typing. return this.textbox.value.search(this._partialre) == 0; },
isValid: function(/*Boolean*/ isFocused){ // summary: // Tests if value is valid. // Can override with your own routine in a subclass. // tags: // protected return this.validator(this.textbox.value, this.constraints); },
getErrorMessage: function(/*Boolean*/ isFocused){ // summary: // Return an error message to show if appropriate // tags: // protected return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String },
getPromptMessage: function(/*Boolean*/ isFocused){ // summary: // Return a hint message to show when widget is first focused // tags: // protected return this.promptMessage; // String },
_maskValidSubsetError: true, validate: function(/*Boolean*/ isFocused){ // summary: // Called by oninit, onblur, and onkeypress. // description: // Show missing or invalid messages if appropriate, and highlight textbox field. // tags: // protected var message = ""; var isValid = this.disabled || this.isValid(isFocused); if(isValid){ this._maskValidSubsetError = true; } var isEmpty = this._isEmpty(this.textbox.value); var isValidSubset = !isValid && isFocused && this._isValidSubset(); this._set("state", isValid ? "" : (((((!this._hasBeenBlurred || isFocused) && isEmpty) || isValidSubset) && this._maskValidSubsetError) ? "Incomplete" : "Error")); dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true");
if(this.state == "Error"){ this._maskValidSubsetError = isFocused && isValidSubset; // we want the error to show up after a blur and refocus message = this.getErrorMessage(isFocused); }else if(this.state == "Incomplete"){ message = this.getPromptMessage(isFocused); // show the prompt whenever the value is not yet complete this._maskValidSubsetError = !this._hasBeenBlurred || isFocused; // no Incomplete warnings while focused }else if(isEmpty){ message = this.getPromptMessage(isFocused); // show the prompt whenever there's no error and no text } this.set("message", message);
_computePartialRE: function(){ var p = this.regExpGen(this.constraints); this.regExp = p; var partialre = ""; // parse the regexp and produce a new regexp that matches valid subsets // if the regexp is .* then there's no use in matching subsets since everything is valid if(p != ".*"){ this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g, function (re){ switch(re.charAt(0)){ case '{': case '+': case '?': case '*': case '^': case '$': case '|': case '(': partialre += re; break; case ")": partialre += "|$)"; break; default: partialre += "(?:"+re+"|$)"; break; } } );} try{ // this is needed for now since the above regexp parsing needs more test verification "".search(partialre); }catch(e){ // should never be here unless the original RE is bad or the parsing is bad partialre = this.regExp; console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); } // should never be here unless the original RE is bad or the parsing is bad this._partialre = "^(?:" + partialre + ")$"; },
postMixInProperties: function(){ this.inherited(arguments); this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; } if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; } if(!this.missingMessage){ this.missingMessage = this.invalidMessage; } this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints },
reset:function(){ // Overrides dijit.form.TextBox.reset() by also // hiding errors about partial matches this._maskValidSubsetError = true; this.inherited(arguments); },
_onBlur: function(){ // the message still exists but for back-compat, and to erase the tooltip // (if the message is being displayed as a tooltip), call displayMessage('') this.displayMessage('');
this.inherited(arguments); } } );
dojo.declare( "dijit.form.MappedTextBox", dijit.form.ValidationTextBox, { // summary: // A dijit.form.ValidationTextBox subclass which provides a base class for widgets that have // a visible formatted display value, and a serializable // value in a hidden input field which is actually sent to the server. // description: // The visible display may // be locale-dependent and interactive. The value sent to the server is stored in a hidden // input field which uses the `name` attribute declared by the original widget. That value sent // to the server is defined by the dijit.form.MappedTextBox.serialize method and is typically // locale-neutral. // tags: // protected
// we want the name attribute to go to the hidden , not the displayed , // so override _FormWidget.postMixInProperties() setting of nameAttrSetting this.nameAttrSetting = ""; },
serialize: function(/*anything*/ val, /*Object?*/ options){ // summary: // Overridable function used to convert the get('value') result to a canonical // (non-localized) string. For example, will print dates in ISO format, and // numbers the same way as they are represented in javascript. // tags: // protected extension return val.toString ? val.toString() : ""; // String },
toString: function(){ // summary: // Returns widget as a printable string using the widget's value // tags: // protected var val = this.filter(this.get('value')); // call filter in case value is nonstring and filter has been customized return val != null ? (typeof val == "string" ? val : this.serialize(val, this.constraints)) : ""; // String },
// Create a hidden node with the serialized value used for submit // (as opposed to the displayed value). // Passing in name as markup rather than calling dojo.create() with an attrs argument // to make dojo.query(input[name=...]) work on IE. (see #8660) this.valueNode = dojo.place("", this.textbox, "after"); },
reset: function(){ // Overrides `dijit.form.ValidationTextBox.reset` to // reset the hidden textbox value to '' this.valueNode.value = ''; this.inherited(arguments); } } );
dijit.form.RangeBoundTextBox.__Constraints = function(){ // min: Number // Minimum signed value. Default is -Infinity // max: Number // Maximum signed value. Default is +Infinity this.min = min; this.max = max;