UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

274 lines (272 loc) • 11.2 kB
/** * DevExtreme (ui/validator.js) * Version: 20.1.7 * Build date: Tue Aug 25 2020 * * Copyright (c) 2012 - 2020 Developer Express Inc. ALL RIGHTS RESERVED * Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/ */ "use strict"; var _element_data = require("../core/element_data"); var _element_data2 = _interopRequireDefault(_element_data); var _callbacks = require("../core/utils/callbacks"); var _callbacks2 = _interopRequireDefault(_callbacks); var _ui = require("./widget/ui.errors"); var _ui2 = _interopRequireDefault(_ui); var _dom_component = require("../core/dom_component"); var _dom_component2 = _interopRequireDefault(_dom_component); var _extend = require("../core/utils/extend"); var _iterator = require("../core/utils/iterator"); var _validation_engine = require("./validation_engine"); var _validation_engine2 = _interopRequireDefault(_validation_engine); var _default_adapter = require("./validation/default_adapter"); var _default_adapter2 = _interopRequireDefault(_default_adapter); var _component_registrator = require("../core/component_registrator"); var _component_registrator2 = _interopRequireDefault(_component_registrator); var _deferred = require("../core/utils/deferred"); var _guid = require("../core/guid"); var _guid2 = _interopRequireDefault(_guid); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj } } var VALIDATOR_CLASS = "dx-validator"; var VALIDATION_STATUS_VALID = "valid"; var VALIDATION_STATUS_INVALID = "invalid"; var VALIDATION_STATUS_PENDING = "pending"; var Validator = _dom_component2.default.inherit({ _initOptions: function(options) { this.callBase.apply(this, arguments); this.option(_validation_engine2.default.initValidationOptions(options)) }, _getDefaultOptions: function() { return (0, _extend.extend)(this.callBase(), { validationRules: [] }) }, _init: function() { this.callBase(); this._initGroupRegistration(); this.focused = (0, _callbacks2.default)(); this._initAdapter(); this._validationInfo = { result: null, deferred: null, skipValidation: false } }, _initGroupRegistration: function() { var group = this._findGroup(); if (!this._groupWasInit) { this.on("disposing", function(args) { _validation_engine2.default.removeRegisteredValidator(args.component._validationGroup, args.component) }) } if (!this._groupWasInit || this._validationGroup !== group) { _validation_engine2.default.removeRegisteredValidator(this._validationGroup, this); this._groupWasInit = true; this._validationGroup = group; _validation_engine2.default.registerValidatorInGroup(group, this) } }, _setOptionsByReference: function() { this.callBase(); (0, _extend.extend)(this._optionsByReference, { validationGroup: true }) }, _initAdapter: function() { var _this = this; var element = this.$element()[0]; var dxStandardEditor = _element_data2.default.data(element, "dx-validation-target"); var adapter = this.option("adapter"); if (!adapter) { if (dxStandardEditor) { adapter = new _default_adapter2.default(dxStandardEditor, this); adapter.validationRequestsCallbacks.add(function(args) { if (_this._validationInfo.skipValidation) { return } _this.validate(args) }); this.option("adapter", adapter); return } throw _ui2.default.Error("E0120") } var callbacks = adapter.validationRequestsCallbacks; if (callbacks) { if (Array.isArray(callbacks)) { callbacks.push(function(args) { _this.validate(args) }) } else { _ui2.default.log("W0014", "validationRequestsCallbacks", "jQuery.Callbacks", "17.2", "Use the array instead"); callbacks.add(function(args) { _this.validate(args) }) } } }, _toggleRTLDirection: function(isRtl) { var _this$option$editor$o, _this$option, _this$option$editor; var rtlEnabled = null !== (_this$option$editor$o = null === (_this$option = this.option("adapter")) || void 0 === _this$option ? void 0 : null === (_this$option$editor = _this$option.editor) || void 0 === _this$option$editor ? void 0 : _this$option$editor.option("rtlEnabled")) && void 0 !== _this$option$editor$o ? _this$option$editor$o : isRtl; this.callBase(rtlEnabled) }, _initMarkup: function() { this.$element().addClass(VALIDATOR_CLASS); this.callBase() }, _visibilityChanged: function(visible) { if (visible) { this._initGroupRegistration() } }, _optionChanged: function(args) { switch (args.name) { case "validationGroup": this._initGroupRegistration(); return; case "validationRules": this._resetValidationRules(); void 0 !== this.option("isValid") && this.validate(); return; case "adapter": this._initAdapter(); break; case "isValid": case "validationStatus": this.option(_validation_engine2.default.synchronizeValidationOptions(args, this.option())); break; default: this.callBase(args) } }, _getValidationRules: function() { var _this2 = this; if (!this._validationRules) { this._validationRules = (0, _iterator.map)(this.option("validationRules"), function(rule, index) { return (0, _extend.extend)({}, rule, { validator: _this2, index: index }) }) } return this._validationRules }, _findGroup: function() { var $element = this.$element(); return this.option("validationGroup") || _validation_engine2.default.findGroup($element, this._modelByElement($element)) }, _resetValidationRules: function() { delete this._validationRules }, validate: function(args) { var _this3 = this; var adapter = this.option("adapter"); var name = this.option("name"); var bypass = adapter.bypass && adapter.bypass(); var value = args && void 0 !== args.value ? args.value : adapter.getValue(); var currentError = adapter.getCurrentValidationError && adapter.getCurrentValidationError(); var rules = this._getValidationRules(); var currentResult = this._validationInfo && this._validationInfo.result; if (currentResult && currentResult.status === VALIDATION_STATUS_PENDING && currentResult.value === value) { return (0, _extend.extend)({}, currentResult) } var result; if (bypass) { result = { isValid: true, status: VALIDATION_STATUS_VALID } } else { if (currentError && currentError.editorSpecific) { currentError.validator = this; result = { isValid: false, status: VALIDATION_STATUS_INVALID, brokenRule: currentError, brokenRules: [currentError] } } else { result = _validation_engine2.default.validate(value, rules, name) } } result.id = (new _guid2.default).toString(); this._applyValidationResult(result, adapter); result.complete && result.complete.then(function(res) { if (res.id === _this3._validationInfo.result.id) { _this3._applyValidationResult(res, adapter) } }); return (0, _extend.extend)({}, this._validationInfo.result) }, reset: function() { var adapter = this.option("adapter"); var result = { id: null, isValid: true, brokenRule: null, brokenRules: null, pendingRules: null, status: VALIDATION_STATUS_VALID, complete: null }; this._validationInfo.skipValidation = true; adapter.reset(); this._validationInfo.skipValidation = false; this._resetValidationRules(); this._applyValidationResult(result, adapter) }, _updateValidationResult: function(result) { if (!this._validationInfo.result || this._validationInfo.result.id !== result.id) { var complete = this._validationInfo.deferred && this._validationInfo.result.complete; this._validationInfo.result = (0, _extend.extend)({}, result, { complete: complete }) } else { for (var prop in result) { if ("id" !== prop && "complete" !== prop) { this._validationInfo.result[prop] = result[prop] } } } }, _applyValidationResult: function(result, adapter) { var validatedAction = this._createActionByOption("onValidated", { excludeValidators: ["readOnly"] }); result.validator = this; this._updateValidationResult(result); adapter.applyValidationResults && adapter.applyValidationResults(this._validationInfo.result); this.option({ validationStatus: this._validationInfo.result.status }); if (this._validationInfo.result.status === VALIDATION_STATUS_PENDING) { if (!this._validationInfo.deferred) { this._validationInfo.deferred = new _deferred.Deferred; this._validationInfo.result.complete = this._validationInfo.deferred.promise() } this._eventsStrategy.fireEvent("validating", [this._validationInfo.result]); return } if (this._validationInfo.result.status !== VALIDATION_STATUS_PENDING) { validatedAction(result); if (this._validationInfo.deferred) { this._validationInfo.deferred.resolve(result); this._validationInfo.deferred = null } } }, focus: function() { var adapter = this.option("adapter"); adapter && adapter.focus && adapter.focus() }, _useTemplates: function() { return false } }); (0, _component_registrator2.default)("dxValidator", Validator); module.exports = Validator; module.exports.default = module.exports;