UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

372 lines (324 loc) • 10.7 kB
"use strict"; var registerComponent = require("../core/component_registrator"), eventsEngine = require("../events/core/events_engine"), grep = require("../core/utils/common").grep, extend = require("../core/utils/extend").extend, iteratorUtils = require("../core/utils/iterator"), ValidationMixin = require("./validation/validation_mixin"), ValidationEngine = require("./validation_engine"), CollectionWidget = require("./collection/ui.collection_widget.edit"); var VALIDATION_SUMMARY_CLASS = "dx-validationsummary", ITEM_CLASS = VALIDATION_SUMMARY_CLASS + "-item", ITEM_DATA_KEY = VALIDATION_SUMMARY_CLASS + "-item-data"; /** * @name dxValidationSummary * @publicName dxValidationSummary * @inherits CollectionWidget * @module ui/validation_summary * @export default */ var ValidationSummary = CollectionWidget.inherit({ _getDefaultOptions: function _getDefaultOptions() { return extend(this.callBase(), { /** * @name dxValidationSummaryOptions.focusStateEnabled * @publicName focusStateEnabled * @hidden * @inheritdoc */ focusStateEnabled: false, /** * @name dxValidationSummaryOptions.noDataText * @publicName noDataText * @hidden * @inheritdoc */ noDataText: null /** * @name dxValidationSummaryOptions.validationGroup * @publicName validationGroup * @type string * @ref */ // Ignore comments /** * @name dxValidationSummaryOptions.dataSource * @publicName dataSource * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.itemRender * @publicName itemRender * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.activeStateEnabled * @publicName activeStateEnabled * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.disabled * @publicName disabled * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.hint * @publicName hint * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.itemHoldTimeout * @publicName itemHoldTimeout * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.rtlEnabled * @publicName rtlEnabled * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.selectedIndex * @publicName selectedIndex * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.selectedItem * @publicName selectedItem * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.selectedItems * @publicName selectedItems * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.selectedItemKeys * @publicName selectedItemKeys * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.keyExpr * @publicName keyExpr * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.visible * @publicName visible * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.width * @publicName width * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.height * @publicName height * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.onItemHold * @publicName onItemHold * @hidden * @action * @inheritdoc */ /** * @name dxValidationSummaryOptions.onItemRendered * @publicName onItemRendered * @hidden * @action * @inheritdoc */ /** * @name dxValidationSummaryOptions.onItemSelect * @publicName onItemSelect * @hidden * @action * @inheritdoc */ /** * @name dxValidationSummaryOptions.onSelectionChanged * @publicName onSelectionChanged * @hidden * @action * @inheritdoc */ /** * @name dxValidationSummaryOptions.onItemContextMenu * @publicName onItemContextMenu * @hidden * @action * @inheritdoc */ /** * @name dxValidationSummaryOptions.accessKey * @publicName accessKey * @hidden * @inheritdoc */ /** * @name dxValidationSummaryOptions.tabIndex * @publicName tabIndex * @hidden * @inheritdoc */ }); }, _setOptionsByReference: function _setOptionsByReference() { this.callBase(); extend(this._optionsByReference, { validationGroup: true }); }, _init: function _init() { this.callBase(); this._initGroupRegistration(); }, _initGroupRegistration: function _initGroupRegistration() { var group = this._findGroup(), groupConfig = ValidationEngine.addGroup(group); this._unsubscribeGroup(); this._groupWasInit = true; this._validationGroup = group; this.groupSubscription = this._groupValidationHandler.bind(this); groupConfig.on("validated", this.groupSubscription); }, _unsubscribeGroup: function _unsubscribeGroup() { var groupConfig = ValidationEngine.getGroupConfig(this._validationGroup); groupConfig && groupConfig.off("validated", this.groupSubscription); }, _getOrderedItems: function _getOrderedItems(validators, items) { var orderedItems = []; iteratorUtils.each(validators, function (_, validator) { var firstItem = grep(items, function (item) { if (item.validator === validator) { return true; } })[0]; if (firstItem) { orderedItems.push(firstItem); } }); return orderedItems; }, _groupValidationHandler: function _groupValidationHandler(params) { var that = this, items = that._getOrderedItems(params.validators, iteratorUtils.map(params.brokenRules, function (rule) { return { text: rule.message, validator: rule.validator }; })); that.validators = params.validators; iteratorUtils.each(that.validators, function (_, validator) { if (validator._validationSummary !== this) { var handler = that._itemValidationHandler.bind(that), disposingHandler = function disposingHandler() { validator.off("validated", handler); validator._validationSummary = null; handler = null; }; validator.on("validated", handler); validator.on("disposing", disposingHandler); validator._validationSummary = this; } }); that.option("items", items); }, _itemValidationHandler: function _itemValidationHandler(itemValidationResult) { var items = this.option("items"), isValid = itemValidationResult.isValid, elementIndex, replacementFound = false, newMessage = itemValidationResult.brokenRule && itemValidationResult.brokenRule.message, validator = itemValidationResult.validator; iteratorUtils.each(items, function (index, item) { if (item.validator === validator) { if (isValid) { elementIndex = index; } else { item.text = newMessage; } replacementFound = true; return false; } }); if (isValid ^ replacementFound) { return; } if (isValid) { items.splice(elementIndex, 1); } else { items.push({ text: newMessage, validator: validator }); } items = this._getOrderedItems(this.validators, items); this.option("items", items); }, _initMarkup: function _initMarkup() { this.$element().addClass(VALIDATION_SUMMARY_CLASS); this.callBase(); }, _optionChanged: function _optionChanged(args) { switch (args.name) { case "validationGroup": this._initGroupRegistration(); break; default: this.callBase(args); } }, _itemClass: function _itemClass() { return ITEM_CLASS; }, _itemDataKey: function _itemDataKey() { return ITEM_DATA_KEY; }, _postprocessRenderItem: function _postprocessRenderItem(params) { eventsEngine.on(params.itemElement, "click", function () { params.itemData.validator && params.itemData.validator.focus && params.itemData.validator.focus(); }); }, _dispose: function _dispose() { this.callBase(); this._unsubscribeGroup(); } /** * @name dxValidationSummaryMethods.registerKeyHandler * @publicName registerKeyHandler(key, handler) * @hidden * @inheritdoc */ /** * @name dxValidationSummaryMethods.getDataSource * @publicName getDataSource() * @hidden * @inheritdoc */ /** * @name dxValidationSummaryMethods.focus * @publicName focus() * @hidden * @inheritdoc */ }).include(ValidationMixin); registerComponent("dxValidationSummary", ValidationSummary); module.exports = ValidationSummary;