devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
372 lines (324 loc) • 10.7 kB
JavaScript
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;
;