145 lines
4.7 KiB
JavaScript
145 lines
4.7 KiB
JavaScript
|
//>>built
|
||
|
define("dijit/form/RangeBoundTextBox", [
|
||
|
"dojo/_base/declare", // declare
|
||
|
"dojo/i18n", // i18n.getLocalization
|
||
|
"./MappedTextBox"
|
||
|
], function(declare, i18n, MappedTextBox){
|
||
|
|
||
|
/*=====
|
||
|
var MappedTextBox = dijit.form.MappedTextBox;
|
||
|
=====*/
|
||
|
|
||
|
// module:
|
||
|
// dijit/form/RangeBoundTextBox
|
||
|
// summary:
|
||
|
// Base class for textbox form widgets which defines a range of valid values.
|
||
|
|
||
|
/*=====
|
||
|
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;
|
||
|
}
|
||
|
=====*/
|
||
|
|
||
|
return declare("dijit.form.RangeBoundTextBox", 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: "",
|
||
|
|
||
|
/*=====
|
||
|
// constraints: dijit.form.RangeBoundTextBox.__Constraints
|
||
|
constraints: {},
|
||
|
======*/
|
||
|
|
||
|
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);
|
||
|
},
|
||
|
|
||
|
postMixInProperties: function(){
|
||
|
this.inherited(arguments);
|
||
|
if(!this.rangeMessage){
|
||
|
this.messages = i18n.getLocalization("dijit.form", "validate", this.lang);
|
||
|
this.rangeMessage = this.messages.rangeMessage;
|
||
|
}
|
||
|
},
|
||
|
|
||
|
_setConstraintsAttr: function(/*Object*/ constraints){
|
||
|
this.inherited(arguments);
|
||
|
if(this.focusNode){ // not set when called from postMixInProperties
|
||
|
if(this.constraints.min !== undefined){
|
||
|
this.focusNode.setAttribute("aria-valuemin", this.constraints.min);
|
||
|
}else{
|
||
|
this.focusNode.removeAttribute("aria-valuemin");
|
||
|
}
|
||
|
if(this.constraints.max !== undefined){
|
||
|
this.focusNode.setAttribute("aria-valuemax", this.constraints.max);
|
||
|
}else{
|
||
|
this.focusNode.removeAttribute("aria-valuemax");
|
||
|
}
|
||
|
}
|
||
|
},
|
||
|
|
||
|
_setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){
|
||
|
// summary:
|
||
|
// Hook so set('value', ...) works.
|
||
|
|
||
|
this.focusNode.setAttribute("aria-valuenow", value);
|
||
|
this.inherited(arguments);
|
||
|
},
|
||
|
|
||
|
applyTextDir: function(/*===== element, text =====*/){
|
||
|
// summary:
|
||
|
// The function overridden in the _BidiSupport module,
|
||
|
// originally used for setting element.dir according to this.textDir.
|
||
|
// In this case does nothing.
|
||
|
// element: Object
|
||
|
// text: String
|
||
|
// tags:
|
||
|
// protected.
|
||
|
}
|
||
|
});
|
||
|
});
|