New file |
0,0 → 1,268 |
if(!dojo._hasResource["dijit.form.ValidationTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. |
dojo._hasResource["dijit.form.ValidationTextBox"] = true; |
dojo.provide("dijit.form.ValidationTextBox"); |
|
dojo.require("dojo.i18n"); |
|
dojo.require("dijit.form.TextBox"); |
dojo.require("dijit.Tooltip"); |
|
dojo.requireLocalization("dijit.form", "validate", null, "ko,zh-cn,zh,ja,zh-tw,ru,it,hu,ROOT,fr,pt,pl,es,de,cs"); |
|
dojo.declare( |
"dijit.form.ValidationTextBox", |
dijit.form.TextBox, |
{ |
// summary: |
// A subclass of TextBox. |
// Over-ride isValid in subclasses to perform specific kinds of validation. |
|
templateString:"<table style=\"display: -moz-inline-stack;\" class=\"dijit dijitReset dijitInlineTable\" cellspacing=\"0\" cellpadding=\"0\"\n\tid=\"widget_${id}\" name=\"${name}\"\n\tdojoAttachEvent=\"onmouseenter:_onMouse,onmouseleave:_onMouse\" waiRole=\"presentation\"\n\t><tr class=\"dijitReset\"\n\t\t><td class=\"dijitReset dijitInputField\" width=\"100%\"\n\t\t\t><input dojoAttachPoint='textbox,focusNode' dojoAttachEvent='onfocus,onblur:_onMouse,onkeyup,onkeypress:_onKeyPress' autocomplete=\"off\"\n\t\t\ttype='${type}' name='${name}'\n\t\t/></td\n\t\t><td class=\"dijitReset dijitValidationIconField\" width=\"0%\"\n\t\t\t><div dojoAttachPoint='iconNode' class='dijitValidationIcon'></div><div class='dijitValidationIconText'>Χ</div\n\t\t></td\n\t></tr\n></table>\n", |
baseClass: "dijitTextBox", |
|
// default values for new subclass properties |
// required: Boolean |
// Can be true or false, default is false. |
required: false, |
// promptMessage: String |
// Hint string |
promptMessage: "", |
// invalidMessage: String |
// The message to display if value is invalid. |
invalidMessage: "$_unset_$", // read from the message file if not overridden |
// constraints: Object |
// user-defined object needed to pass parameters to the validator functions |
constraints: {}, |
// regExp: String |
// regular expression string used to validate the input |
// Do not specify both regExp and regExpGen |
regExp: ".*", |
// regExpGen: Function |
// user replaceable function used to generate regExp when dependent on constraints |
// Do not specify both regExp and regExpGen |
regExpGen: function(constraints){ return this.regExp; }, |
|
// state: String |
// Shows current state (ie, validation result) of input (Normal, Warning, or Error) |
state: "", |
|
setValue: function(){ |
this.inherited('setValue', arguments); |
this.validate(false); |
}, |
|
validator: function(value,constraints){ |
// summary: user replaceable function used to validate the text input against the regular expression. |
return (new RegExp("^(" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && |
(!this.required || !this._isEmpty(value)) && |
(this._isEmpty(value) || this.parse(value, constraints) !== null); |
}, |
|
isValid: function(/* Boolean*/ isFocused){ |
// summary: Need to over-ride with your own validation code in subclasses |
return this.validator(this.textbox.value, this.constraints); |
}, |
|
_isEmpty: function(value){ |
// summary: Checks for whitespace |
return /^\s*$/.test(value); // Boolean |
}, |
|
getErrorMessage: function(/* Boolean*/ isFocused){ |
// summary: return an error message to show if appropriate |
return this.invalidMessage; |
}, |
|
getPromptMessage: function(/* Boolean*/ isFocused){ |
// summary: return a hint to show if appropriate |
return this.promptMessage; |
}, |
|
validate: function(/* Boolean*/ isFocused){ |
// summary: |
// Called by oninit, onblur, and onkeypress. |
// description: |
// Show missing or invalid messages if appropriate, and highlight textbox field. |
var message = ""; |
var isValid = this.isValid(isFocused); |
var isEmpty = this._isEmpty(this.textbox.value); |
this.state = (isValid || (!this._hasBeenBlurred && isEmpty)) ? "" : "Error"; |
this._setStateClass(); |
dijit.setWaiState(this.focusNode, "invalid", (isValid? "false" : "true")); |
if(isFocused){ |
if(isEmpty){ |
message = this.getPromptMessage(true); |
} |
if(!message && !isValid){ |
message = this.getErrorMessage(true); |
} |
} |
this._displayMessage(message); |
}, |
|
// currently displayed message |
_message: "", |
|
_displayMessage: function(/*String*/ message){ |
if(this._message == message){ return; } |
this._message = message; |
this.displayMessage(message); |
}, |
|
displayMessage: function(/*String*/ message){ |
// summary: |
// User overridable method to display validation errors/hints. |
// By default uses a tooltip. |
if(message){ |
dijit.showTooltip(message, this.domNode); |
}else{ |
dijit.hideTooltip(this.domNode); |
} |
}, |
|
_hasBeenBlurred: false, |
|
_onBlur: function(evt){ |
this._hasBeenBlurred = true; |
this.validate(false); |
this.inherited('_onBlur', arguments); |
}, |
|
onfocus: function(evt){ |
// TODO: change to _onFocus? |
this.validate(true); |
this._onMouse(evt); // update CSS classes |
}, |
|
onkeyup: function(evt){ |
this.onfocus(evt); |
}, |
|
//////////// INITIALIZATION METHODS /////////////////////////////////////// |
constructor: function(){ |
this.constraints = {}; |
}, |
|
postMixInProperties: function(){ |
this.inherited('postMixInProperties', arguments); |
this.constraints.locale=this.lang; |
this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); |
if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } |
var p = this.regExpGen(this.constraints); |
this.regExp = p; |
// make value a string for all types so that form reset works well |
} |
} |
); |
|
dojo.declare( |
"dijit.form.MappedTextBox", |
dijit.form.ValidationTextBox, |
{ |
// summary: |
// A subclass of ValidationTextBox. |
// Provides a hidden input field and a serialize method to override |
|
serialize: function(val, /*Object?*/options){ |
// summary: user replaceable function used to convert the getValue() result to a String |
return (val.toString ? val.toString() : ""); |
}, |
|
toString: function(){ |
// summary: display the widget as a printable string using the widget's value |
var val = this.filter(this.getValue()); |
return (val!=null) ? ((typeof val == "string") ? val : this.serialize(val, this.constraints)) : ""; |
}, |
|
validate: function(){ |
this.valueNode.value = this.toString(); |
this.inherited('validate', arguments); |
}, |
|
postCreate: function(){ |
var textbox = this.textbox; |
var valueNode = (this.valueNode = document.createElement("input")); |
valueNode.setAttribute("type", textbox.type); |
valueNode.setAttribute("value", this.toString()); |
dojo.style(valueNode, "display", "none"); |
valueNode.name = this.textbox.name; |
this.textbox.name = "_" + this.textbox.name + "_displayed_"; |
this.textbox.removeAttribute("name"); |
dojo.place(valueNode, textbox, "after"); |
|
this.inherited('postCreate', arguments); |
} |
} |
); |
|
dojo.declare( |
"dijit.form.RangeBoundTextBox", |
dijit.form.MappedTextBox, |
{ |
// summary: |
// A subclass of MappedTextBox. |
// Tests for a value out-of-range |
/*===== contraints object: |
// min: Number |
// Minimum signed value. Default is -Infinity |
min: undefined, |
// max: Number |
// Maximum signed value. Default is +Infinity |
max: undefined, |
=====*/ |
|
// rangeMessage: String |
// The message to display if value is out-of-range |
rangeMessage: "", |
|
compare: function(val1, val2){ |
// summary: compare 2 values |
return val1 - val2; |
}, |
|
rangeCheck: function(/* Number */ primitive, /* Object */ constraints){ |
// summary: user replaceable function used to validate the range of the numeric input value |
var isMin = (typeof constraints.min != "undefined"); |
var isMax = (typeof constraints.max != "undefined"); |
if(isMin || isMax){ |
return (!isMin || this.compare(primitive,constraints.min) >= 0) && |
(!isMax || this.compare(primitive,constraints.max) <= 0); |
}else{ return true; } |
}, |
|
isInRange: function(/* Boolean*/ isFocused){ |
// summary: Need to over-ride with your own validation code in subclasses |
return this.rangeCheck(this.getValue(), this.constraints); |
}, |
|
isValid: function(/* Boolean*/ isFocused){ |
return this.inherited('isValid', arguments) && |
((this._isEmpty(this.textbox.value) && !this.required) || this.isInRange(isFocused)); |
}, |
|
getErrorMessage: function(/* Boolean*/ isFocused){ |
if(dijit.form.RangeBoundTextBox.superclass.isValid.call(this, false) && !this.isInRange(isFocused)){ return this.rangeMessage; } |
else{ return this.inherited('getErrorMessage', arguments); } |
}, |
|
postMixInProperties: function(){ |
this.inherited('postMixInProperties', arguments); |
if(!this.rangeMessage){ |
this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); |
this.rangeMessage = this.messages.rangeMessage; |
} |
}, |
|
postCreate: function(){ |
this.inherited('postCreate', arguments); |
if(typeof this.constraints.min != "undefined"){ |
dijit.setWaiState(this.focusNode, "valuemin", this.constraints.min); |
} |
if(typeof this.constraints.max != "undefined"){ |
dijit.setWaiState(this.focusNode, "valuemax", this.constraints.max); |
} |
} |
} |
); |
|
} |