UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

289 lines (254 loc) • 9.01 kB
"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;