devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
146 lines (144 loc) • 6.81 kB
JavaScript
/**
* DevExtreme (cjs/__internal/integration/knockout/validation.js)
* Version: 25.2.3
* Build date: Fri Dec 12 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
var _m_class = _interopRequireDefault(require("../../core/m_class"));
var _m_events_strategy = require("../../core/m_events_strategy");
var _m_guid = require("../../core/m_guid");
var _m_deferred = require("../../core/utils/m_deferred");
var _m_extend = require("../../core/utils/m_extend");
var _m_iterator = require("../../core/utils/m_iterator");
var _m_validation_engine = _interopRequireDefault(require("../../ui/m_validation_engine"));
var _knockout = _interopRequireDefault(require("knockout"));
function _interopRequireDefault(e) {
return e && e.__esModule ? e : {
default: e
}
}
if (_knockout.default) {
const VALIDATION_STATUS_VALID = "valid";
const VALIDATION_STATUS_PENDING = "pending";
const koDxValidator = _m_class.default.inherit({
ctor(target, _ref) {
let {
name: name,
validationRules: validationRules
} = _ref;
this.target = target;
this.name = name;
this.isValid = _knockout.default.observable(true);
this.validationError = _knockout.default.observable();
this.validationErrors = _knockout.default.observable();
this.validationStatus = _knockout.default.observable(VALIDATION_STATUS_VALID);
this._eventsStrategy = new _m_events_strategy.EventsStrategy(this);
this.validationRules = (0, _m_iterator.map)(validationRules, ((rule, index) => (0, _m_extend.extend)({}, rule, {
validator: this,
index: index
})));
this._validationInfo = {
result: null,
deferred: null
}
},
_updateValidationResult(result) {
if (!this._validationInfo.result || this._validationInfo.result.id !== result.id) {
const complete = this._validationInfo.deferred && this._validationInfo.result.complete;
this._validationInfo.result = (0, _m_extend.extend)({}, result, {
complete: complete
})
} else {
for (const prop in result) {
if ("id" !== prop && "complete" !== prop) {
this._validationInfo.result[prop] = result[prop]
}
}
}
},
validate() {
var _this$_validationInfo, _result$complete;
const currentResult = null === (_this$_validationInfo = this._validationInfo) || void 0 === _this$_validationInfo ? void 0 : _this$_validationInfo.result;
const value = this.target();
if (currentResult && currentResult.status === VALIDATION_STATUS_PENDING && currentResult.value === value) {
return (0, _m_extend.extend)({}, currentResult)
}
const result = _m_validation_engine.default.validate(value, this.validationRules, this.name);
result.id = (new _m_guid.Guid).toString();
this._applyValidationResult(result);
null === (_result$complete = result.complete) || void 0 === _result$complete || _result$complete.then((res => {
if (res.id === this._validationInfo.result.id) {
this._applyValidationResult(res)
}
}));
return (0, _m_extend.extend)({}, this._validationInfo.result)
},
reset() {
this.target(null);
const result = {
id: null,
isValid: true,
brokenRule: null,
pendingRules: null,
status: VALIDATION_STATUS_VALID,
complete: null
};
this._applyValidationResult(result);
return result
},
_applyValidationResult(result) {
result.validator = this;
this._updateValidationResult(result);
this.target.dxValidator.isValid(this._validationInfo.result.isValid);
this.target.dxValidator.validationError(this._validationInfo.result.brokenRule);
this.target.dxValidator.validationErrors(this._validationInfo.result.brokenRules);
this.target.dxValidator.validationStatus(this._validationInfo.result.status);
if (result.status === VALIDATION_STATUS_PENDING) {
if (!this._validationInfo.deferred) {
this._validationInfo.deferred = new _m_deferred.Deferred;
this._validationInfo.result.complete = this._validationInfo.deferred.promise()
}
this._eventsStrategy.fireEvent("validating", [this._validationInfo.result]);
return
}
if (result.status !== VALIDATION_STATUS_PENDING) {
this._eventsStrategy.fireEvent("validated", [result]);
if (this._validationInfo.deferred) {
this._validationInfo.deferred.resolve(result);
this._validationInfo.deferred = null
}
}
},
on(eventName, eventHandler) {
this._eventsStrategy.on(eventName, eventHandler);
return this
},
off(eventName, eventHandler) {
this._eventsStrategy.off(eventName, eventHandler);
return this
}
});
_knockout.default.extenders.dxValidator = function(target, option) {
target.dxValidator = new koDxValidator(target, option);
target.subscribe(target.dxValidator.validate.bind(target.dxValidator));
return target
};
_m_validation_engine.default.registerModelForValidation = function(model) {
(0, _m_iterator.each)(model, ((_, member) => {
if (_knockout.default.isObservable(member) && member.dxValidator) {
_m_validation_engine.default.registerValidatorInGroup(model, member.dxValidator)
}
}))
};
_m_validation_engine.default.unregisterModelForValidation = function(model) {
(0, _m_iterator.each)(model, ((_, member) => {
if (_knockout.default.isObservable(member) && member.dxValidator) {
_m_validation_engine.default.removeRegisteredValidator(model, member.dxValidator)
}
}))
};
_m_validation_engine.default.validateModel = _m_validation_engine.default.validateGroup
}