devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
498 lines (490 loc) • 20.8 kB
JavaScript
/**
* DevExtreme (cjs/ui/scheduler/resources/resourceManager.js)
* Version: 21.1.4
* Build date: Mon Jun 21 2021
*
* Copyright (c) 2012 - 2021 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
"use strict";
exports.ResourceManager = void 0;
var _array = require("../../../core/utils/array");
var _common = require("../../../core/utils/common");
var _type = require("../../../core/utils/type");
var _object = require("../../../core/utils/object");
var _iterator = require("../../../core/utils/iterator");
var _extend = require("../../../core/utils/extend");
var _query = _interopRequireDefault(require("../../../data/query"));
var _data = require("../../../core/utils/data");
var _deferred = require("../../../core/utils/deferred");
var _agendaResourceProcessor = require("./agendaResourceProcessor");
var _utils = require("./utils");
function _interopRequireDefault(obj) {
return obj && obj.__esModule ? obj : {
default: obj
}
}
function _toConsumableArray(arr) {
return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread()
}
function _nonIterableSpread() {
throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")
}
function _unsupportedIterableToArray(o, minLen) {
if (!o) {
return
}
if ("string" === typeof o) {
return _arrayLikeToArray(o, minLen)
}
var n = Object.prototype.toString.call(o).slice(8, -1);
if ("Object" === n && o.constructor) {
n = o.constructor.name
}
if ("Map" === n || "Set" === n) {
return Array.from(o)
}
if ("Arguments" === n || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) {
return _arrayLikeToArray(o, minLen)
}
}
function _iterableToArray(iter) {
if ("undefined" !== typeof Symbol && null != iter[Symbol.iterator] || null != iter["@@iterator"]) {
return Array.from(iter)
}
}
function _arrayWithoutHoles(arr) {
if (Array.isArray(arr)) {
return _arrayLikeToArray(arr)
}
}
function _arrayLikeToArray(arr, len) {
if (null == len || len > arr.length) {
len = arr.length
}
for (var i = 0, arr2 = new Array(len); i < len; i++) {
arr2[i] = arr[i]
}
return arr2
}
var ResourceManager = function() {
function ResourceManager(resources) {
this._resourceLoader = {};
this.agendaProcessor = new _agendaResourceProcessor.AgendaResourceProcessor;
this.setResources(resources)
}
var _proto = ResourceManager.prototype;
_proto._mapResourceData = function(resource, data) {
var valueGetter = (0, _data.compileGetter)((0, _utils.getValueExpr)(resource));
var displayGetter = (0, _data.compileGetter)((0, _utils.getDisplayExpr)(resource));
return (0, _iterator.map)(data, (function(item) {
var result = {
id: valueGetter(item),
text: displayGetter(item)
};
if (item.color) {
result.color = item.color
}
return result
}))
};
_proto._isMultipleResource = function(resourceField) {
var result = false;
(0, _iterator.each)(this.getResources(), function(_, resource) {
var field = (0, _utils.getFieldExpr)(resource);
if (field === resourceField) {
result = resource.allowMultiple;
return false
}
}.bind(this));
return result
};
_proto.getDataAccessors = function(field, type) {
var result = null;
(0, _iterator.each)(this._dataAccessors[type], (function(accessorName, accessors) {
if (field === accessorName) {
result = accessors;
return false
}
}));
return result
};
_proto.setResources = function(resources) {
this._resources = resources;
this._dataAccessors = {
getter: {},
setter: {}
};
this._resourceFields = (0, _iterator.map)(resources || [], function(resource) {
var field = (0, _utils.getFieldExpr)(resource);
this._dataAccessors.getter[field] = (0, _data.compileGetter)(field);
this._dataAccessors.setter[field] = (0, _data.compileSetter)(field);
return field
}.bind(this));
this.agendaProcessor.initializeState(resources)
};
_proto.getResources = function() {
return this._resources || []
};
_proto.getResourcesData = function() {
return this._resourcesData || []
};
_proto.getEditors = function() {
var result = [];
var that = this;
(0, _iterator.each)(this.getResources(), (function(i, resource) {
var field = (0, _utils.getFieldExpr)(resource);
var currentResourceItems = that._getResourceDataByField(field);
result.push({
editorOptions: {
dataSource: currentResourceItems.length ? currentResourceItems : (0, _utils.getWrappedDataSource)(resource.dataSource),
displayExpr: (0, _utils.getDisplayExpr)(resource),
valueExpr: (0, _utils.getValueExpr)(resource)
},
dataField: field,
editorType: resource.allowMultiple ? "dxTagBox" : "dxSelectBox",
label: {
text: resource.label || field
}
})
}));
return result
};
_proto.getResourceDataByValue = function(field, value) {
var that = this;
var result = new _deferred.Deferred;
(0, _iterator.each)(this.getResources(), (function(_, resource) {
var resourceField = (0, _utils.getFieldExpr)(resource);
if (resourceField === field) {
var dataSource = (0, _utils.getWrappedDataSource)(resource.dataSource);
var valueExpr = (0, _utils.getValueExpr)(resource);
if (!that._resourceLoader[field]) {
that._resourceLoader[field] = dataSource.load()
}
that._resourceLoader[field].done((function(data) {
var filteredData = (0, _query.default)(data).filter(valueExpr, value).toArray();
delete that._resourceLoader[field];
result.resolve(filteredData[0])
})).fail((function() {
delete that._resourceLoader[field];
result.reject()
}));
return false
}
}));
return result.promise()
};
_proto.setResourcesToItem = function(itemData, resources) {
var resourcesSetter = this._dataAccessors.setter;
for (var name in resources) {
if (Object.prototype.hasOwnProperty.call(resources, name)) {
var resourceData = resources[name];
resourcesSetter[name](itemData, this._isMultipleResource(name) ? (0, _array.wrapToArray)(resourceData) : resourceData)
}
}
};
_proto.getResourcesFromItem = function(itemData, wrapOnlyMultipleResources) {
var _this = this;
var result = null;
if (!(0, _type.isDefined)(wrapOnlyMultipleResources)) {
wrapOnlyMultipleResources = false
}
this._resourceFields.forEach((function(field) {
(0, _iterator.each)(itemData, (function(fieldName, fieldValue) {
var tempObject = {};
tempObject[fieldName] = fieldValue;
var resourceData = _this.getDataAccessors(field, "getter")(tempObject);
if ((0, _type.isDefined)(resourceData)) {
if (!result) {
result = {}
}
if (1 === resourceData.length) {
resourceData = resourceData[0]
}
if (!wrapOnlyMultipleResources || wrapOnlyMultipleResources && _this._isMultipleResource(field)) {
_this.getDataAccessors(field, "setter")(tempObject, (0, _array.wrapToArray)(resourceData))
} else {
_this.getDataAccessors(field, "setter")(tempObject, resourceData)
}(0, _extend.extend)(result, tempObject);
return true
}
}))
}));
return result
};
_proto.loadResources = function(groups) {
var result = new _deferred.Deferred;
var that = this;
var deferreds = [];
(0, _iterator.each)(this.getResourcesByFields(groups), (function(i, resource) {
var deferred = new _deferred.Deferred;
var field = (0, _utils.getFieldExpr)(resource);
deferreds.push(deferred);
(0, _utils.getWrappedDataSource)(resource.dataSource).load().done((function(data) {
deferred.resolve({
name: field,
items: that._mapResourceData(resource, data),
data: data
})
})).fail((function() {
deferred.reject()
}))
}));
if (!deferreds.length) {
that._resourcesData = [];
return result.resolve([])
}
_deferred.when.apply(null, deferreds).done((function() {
var data = Array.prototype.slice.call(arguments);
var mapFunction = function(obj) {
return {
name: obj.name,
items: obj.items,
data: obj.data
}
};
var isValidResources = that._isValidResourcesForGrouping(data);
that._resourcesData = isValidResources ? data : [];
result.resolve(isValidResources ? data.map(mapFunction) : [])
})).fail((function() {
result.reject()
}));
return result.promise()
};
_proto.getResourcesByFields = function(fields) {
return (0, _common.grep)(this.getResources(), function(resource) {
var field = (0, _utils.getFieldExpr)(resource);
return (0, _array.inArray)(field, fields) > -1
}.bind(this))
};
_proto.getResourceByField = function(field) {
return this.getResourcesByFields([field])[0] || {}
};
_proto.getResourceColor = function(field, value) {
var valueExpr = this.getResourceByField(field).valueExpr || "id";
var valueGetter = (0, _data.compileGetter)(valueExpr);
var colorExpr = this.getResourceByField(field).colorExpr || "color";
var colorGetter = (0, _data.compileGetter)(colorExpr);
var result = new _deferred.Deferred;
var resourceData = this._getResourceDataByField(field);
var resourceDataLength = resourceData.length;
var color;
if (resourceDataLength) {
for (var i = 0; i < resourceDataLength; i++) {
if (valueGetter(resourceData[i]) === value) {
color = colorGetter(resourceData[i]);
break
}
}
result.resolve(color)
} else {
this.getResourceDataByValue(field, value).done((function(resourceData) {
if (resourceData) {
color = colorGetter(resourceData)
}
result.resolve(color)
})).fail((function() {
result.reject()
}))
}
return result.promise()
};
_proto.getResourceForPainting = function(groups) {
var resources = this.getResources();
var result;
(0, _iterator.each)(resources, (function(index, resource) {
if (resource.useColorAsDefault) {
result = resource;
return false
}
}));
if (!result) {
if (Array.isArray(groups) && groups.length) {
resources = this.getResourcesByFields(groups)
}
result = resources[resources.length - 1]
}
return result
};
_proto.createResourcesTree = function(groups) {
var leafIndex = 0;
return function make(group, groupIndex, result, parent) {
result = result || [];
for (var i = 0; i < group.items.length; i++) {
var currentGroupItem = group.items[i];
var resultItem = {
name: group.name,
value: currentGroupItem.id,
title: currentGroupItem.text,
data: group.data && group.data[i],
children: [],
parent: parent ? parent : null
};
result.push(resultItem);
var nextGroupIndex = groupIndex + 1;
if (groups[nextGroupIndex]) {
make.call(this, groups[nextGroupIndex], nextGroupIndex, resultItem.children, resultItem)
}
if (!resultItem.children.length) {
resultItem.leafIndex = leafIndex;
leafIndex++
}
}
return result
}.call(this, groups[0], 0)
};
_proto._hasGroupItem = function(appointmentResources, groupName, itemValue) {
var group = this.getDataAccessors(groupName, "getter")(appointmentResources);
if (group) {
if ((0, _array.inArray)(itemValue, group) > -1) {
return true
}
}
return false
};
_proto._createPlainResourcesByAppointmentAsync = function(rawAppointment) {
return this.agendaProcessor.createListAsync(rawAppointment)
};
_proto._getResourceDataByField = function(fieldName) {
var loadedResources = this.getResourcesData();
var currentResourceData = [];
for (var i = 0, resourceCount = loadedResources.length; i < resourceCount; i++) {
if (loadedResources[i].name === fieldName) {
currentResourceData = loadedResources[i].data;
break
}
}
return currentResourceData
};
_proto.getResourceTreeLeaves = function(tree, appointmentResources, result) {
result = result || [];
for (var i = 0; i < tree.length; i++) {
if (!this._hasGroupItem(appointmentResources, tree[i].name, tree[i].value)) {
continue
}
if ((0, _type.isDefined)(tree[i].leafIndex)) {
result.push(tree[i].leafIndex)
}
if (tree[i].children) {
this.getResourceTreeLeaves(tree[i].children, appointmentResources, result)
}
}
return result
};
_proto.groupAppointmentsByResources = function(appointments, resources) {
var tree = this.createResourcesTree(resources);
var result = {};
(0, _iterator.each)(appointments, function(_, appointment) {
var appointmentResources = this.getResourcesFromItem(appointment);
var treeLeaves = this.getResourceTreeLeaves(tree, appointmentResources);
for (var i = 0; i < treeLeaves.length; i++) {
if (!result[treeLeaves[i]]) {
result[treeLeaves[i]] = []
}
result[treeLeaves[i]].push((0, _object.deepExtendArraySafe)({}, appointment, true))
}
}.bind(this));
return result
};
_proto.reduceResourcesTree = function(tree, existingAppointments, _result) {
_result = _result ? _result.children : [];
var that = this;
tree.forEach((function(node, index) {
var ok = false;
var resourceName = node.name;
var resourceValue = node.value;
var resourceTitle = node.title;
var resourceData = node.data;
var resourceGetter = that.getDataAccessors(resourceName, "getter");
existingAppointments.forEach((function(appointment) {
if (!ok) {
var resourceFromAppointment = resourceGetter(appointment);
if (Array.isArray(resourceFromAppointment)) {
if (resourceFromAppointment.indexOf(resourceValue) > -1) {
_result.push({
name: resourceName,
value: resourceValue,
title: resourceTitle,
data: resourceData,
children: []
});
ok = true
}
} else if (resourceFromAppointment === resourceValue) {
_result.push({
name: resourceName,
value: resourceValue,
title: resourceTitle,
data: resourceData,
children: []
});
ok = true
}
}
}));
if (ok && node.children && node.children.length) {
that.reduceResourcesTree(node.children, existingAppointments, _result[index])
}
}));
return _result
};
_proto.getResourcesDataByGroups = function(groups) {
var _this2 = this;
var resourcesData = this.getResourcesData();
if (!groups || !groups.length) {
return resourcesData
}
var fieldNames = {};
var currentResourcesData = [];
groups.forEach((function(group) {
(0, _iterator.each)(group, (function(name, value) {
return fieldNames[name] = value
}))
}));
var resourceData = resourcesData.filter((function(_ref) {
var name = _ref.name;
return (0, _type.isDefined)(fieldNames[name])
}));
resourceData.forEach((function(data) {
return currentResourcesData.push((0, _extend.extend)({}, data))
}));
currentResourcesData.forEach((function(currentResource) {
var items = currentResource.items,
data = currentResource.data,
resourceName = currentResource.name;
var resource = _this2.getResourceByField(resourceName);
var valueExpr = (0, _utils.getValueExpr)(resource);
var filteredItems = [];
var filteredData = [];
groups.filter((function(group) {
return (0, _type.isDefined)(group[resourceName])
})).forEach((function(group) {
(0, _iterator.each)(group, (function(name, value) {
if (!filteredItems.filter((function(item) {
return item.id === value && item[valueExpr] === name
})).length) {
var currentItems = items.filter((function(item) {
return item.id === value
}));
var currentData = data.filter((function(item) {
return item[valueExpr] === value
}));
filteredItems.push.apply(filteredItems, _toConsumableArray(currentItems));
filteredData.push.apply(filteredData, _toConsumableArray(currentData))
}
}))
}));
currentResource.items = filteredItems;
currentResource.data = filteredData
}));
return currentResourcesData
};
_proto._isValidResourcesForGrouping = function(resources) {
var result = resources.reduce((function(isValidResources, currentResource) {
return isValidResources && currentResource.items.length > 0
}), true);
return result
};
return ResourceManager
}();
exports.ResourceManager = ResourceManager;