devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
289 lines (254 loc) • 9.01 kB
JavaScript
"use strict";
var dataUtils = require("../core/element_data"),
Callbacks = require("../core/utils/callbacks"),
errors = require("./widget/ui.errors"),
DOMComponent = require("../core/dom_component"),
extend = require("../core/utils/extend").extend,
map = require("../core/utils/iterator").map,
ValidationMixin = require("./validation/validation_mixin"),
ValidationEngine = require("./validation_engine"),
DefaultAdapter = require("./validation/default_adapter"),
registerComponent = require("../core/component_registrator");
var VALIDATOR_CLASS = "dx-validator";
/**
* @name dxValidator
* @publicName dxValidator
* @inherits DOMComponent
* @module ui/validator
* @export default
*/
var Validator = DOMComponent.inherit({
_getDefaultOptions: function _getDefaultOptions() {
return extend(this.callBase(), {
/**
* @name dxValidatorOptions.validationRules
* @publicName validationRules
* @type Array<RequiredRule,NumericRule,RangeRule,StringLengthRule,CustomRule,CompareRule,PatternRule,EmailRule>
*/
validationRules: []
/**
* @name dxValidatorOptions.validationGroup
* @publicName validationGroup
* @type string
* @ref
*/
/**
* @name dxValidatorOptions.name
* @publicName name
* @type string
*/
/**
* @name dxValidatorOptions.adapter
* @publicName adapter
* @type Object
*/
/**
* @name dxValidatorOptions.adapter.getValue
* @publicName getValue
* @type function
*/
/**
* @name dxValidatorOptions.adapter.validationRequestsCallbacks
* @publicName validationRequestsCallbacks
* @type Array<function> | jquery.callbacks
*/
/**
* @name dxValidatorOptions.adapter.applyValidationResults
* @publicName applyValidationResults
* @type function
*/
/**
* @name dxValidatorOptions.adapter.reset
* @publicName reset
* @type function
*/
/**
* @name dxValidatorOptions.adapter.focus
* @publicName focus
* @type function
*/
/**
* @name dxValidatorOptions.adapter.bypass
* @publicName bypass
* @type function
*/
/**
* @name dxValidatorOptions.onValidated
* @publicName onValidated
* @type function(validatedInfo)
* @type_function_param1 validatedInfo:Object
* @type_function_param1_field1 name:string
* @type_function_param1_field2 isValid:boolean
* @type_function_param1_field3 value:Object
* @type_function_param1_field4 validationRules:Array<RequiredRule,NumericRule,RangeRule,StringLengthRule,CustomRule,CompareRule,PatternRule,EmailRule>
* @type_function_param1_field5 brokenRule:RequiredRule|NumericRule|RangeRule|StringLengthRule|CustomRule|CompareRule|PatternRule|EmailRule
* @action
*/
/**
* @name dxValidatorOptions.rtlEnabled
* @publicName rtlEnabled
* @hidden
* @inheritdoc
*/
/**
* @name dxValidatorMethods.beginUpdate
* @publicName beginUpdate()
* @hidden
* @inheritdoc
*/
/**
* @name dxValidatorMethods.defaultOptions
* @publicName defaultOptions(rule)
* @hidden
* @inheritdoc
*/
/**
* @name dxValidatorMethods.endUpdate
* @publicName endUpdate()
* @hidden
* @inheritdoc
*/
});
},
_init: function _init() {
this.callBase();
this._initGroupRegistration();
this.focused = Callbacks();
this._initAdapter();
},
_initGroupRegistration: function _initGroupRegistration() {
var group = this._findGroup();
if (!this._groupWasInit) {
this.on("disposing", function (args) {
ValidationEngine.removeRegisteredValidator(args.component._validationGroup, args.component);
});
}
if (!this._groupWasInit || this._validationGroup !== group) {
ValidationEngine.removeRegisteredValidator(this._validationGroup, this);
this._groupWasInit = true;
this._validationGroup = group;
ValidationEngine.registerValidatorInGroup(group, this);
}
},
_setOptionsByReference: function _setOptionsByReference() {
this.callBase();
extend(this._optionsByReference, {
validationGroup: true
});
},
_initAdapter: function _initAdapter() {
var that = this,
element = that.$element()[0],
dxStandardEditor = dataUtils.data(element, "dx-validation-target"),
adapter = that.option("adapter");
if (!adapter) {
if (dxStandardEditor) {
adapter = new DefaultAdapter(dxStandardEditor, this);
adapter.validationRequestsCallbacks.add(function () {
that.validate();
});
this.option("adapter", adapter);
return;
}
throw errors.Error("E0120");
}
var callbacks = adapter.validationRequestsCallbacks;
if (callbacks) {
if (Array.isArray(callbacks)) {
callbacks.push(function () {
that.validate();
});
} else {
errors.log("W0014", "validationRequestsCallbacks", "jQuery.Callbacks", "17.2", "Use the array instead");
callbacks.add(function () {
that.validate();
});
}
}
},
_initMarkup: function _initMarkup() {
this.$element().addClass(VALIDATOR_CLASS);
this.callBase();
},
_visibilityChanged: function _visibilityChanged(visible) {
if (visible) {
this._initGroupRegistration();
}
},
_optionChanged: function _optionChanged(args) {
switch (args.name) {
case "validationGroup":
this._initGroupRegistration();
return;
case "validationRules":
this.option("isValid") !== undefined && this.validate();
return;
case "adapter":
this._initAdapter();
break;
default:
this.callBase(args);
}
},
/**
* @name dxValidatorMethods.validate
* @publicName validate()
* @return dxValidatorResult
*/
validate: function validate() {
var that = this,
adapter = that.option("adapter"),
name = that.option("name"),
bypass = adapter.bypass && adapter.bypass(),
value = adapter.getValue(),
currentError = adapter.getCurrentValidationError && adapter.getCurrentValidationError(),
rules = map(that.option("validationRules"), function (rule) {
rule.validator = that;
return rule;
}),
result;
if (bypass) {
result = { isValid: true };
} else if (currentError && currentError.editorSpecific) {
currentError.validator = this;
result = { isValid: false, brokenRule: currentError };
} else {
result = ValidationEngine.validate(value, rules, name);
}
this._applyValidationResult(result, adapter);
return result;
},
/**
* @name dxValidatorMethods.reset
* @publicName reset()
*/
reset: function reset() {
var that = this,
adapter = that.option("adapter"),
result = {
isValid: true,
brokenRule: null
};
adapter.reset();
this._applyValidationResult(result, adapter);
},
_applyValidationResult: function _applyValidationResult(result, adapter) {
var validatedAction = this._createActionByOption("onValidated");
result.validator = this;
adapter.applyValidationResults && adapter.applyValidationResults(result);
this.option({
isValid: result.isValid
});
validatedAction(result);
},
/**
* @name dxValidatorMethods.focus
* @publicName focus()
*/
focus: function focus() {
var adapter = this.option("adapter");
adapter && adapter.focus && adapter.focus();
}
}).include(ValidationMixin);
registerComponent("dxValidator", Validator);
module.exports = Validator;