devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
627 lines (615 loc) • 25.3 kB
JavaScript
/**
* DevExtreme (cjs/ui/scheduler/resources/utils.js)
* Version: 22.1.9
* Build date: Tue Apr 18 2023
*
* Copyright (c) 2012 - 2023 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
;
function _typeof(obj) {
return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function(obj) {
return typeof obj
} : function(obj) {
return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj
}, _typeof(obj)
}
exports.setResourceToAppointment = exports.reduceResourcesTree = exports.loadResources = exports.isResourceMultiple = exports.groupAppointmentsByResourcesCore = exports.groupAppointmentsByResources = exports.getWrappedDataSource = exports.getValueExpr = exports.getResourcesDataByGroups = exports.getResourceTreeLeaves = exports.getResourceColor = exports.getResourceByField = exports.getPathToLeaf = exports.getPaintedResources = exports.getOrLoadResourceItem = exports.getNormalizedResources = exports.getGroupsObjectFromGroupsArray = exports.getGroupCount = exports.getFieldExpr = exports.getDisplayExpr = exports.getDataAccessors = exports.getCellGroups = exports.getAppointmentColor = exports.getAllGroups = exports.filterResources = exports.createResourcesTree = exports.createResourceEditorModel = exports.createReducedResourcesTree = exports.createExpressions = void 0;
var _utils = require("../../../data/data_source/utils");
var _data_source = require("../../../data/data_source/data_source");
var _deferred = require("../../../core/utils/deferred");
var _data = require("../../../core/utils/data");
var _iterator = require("../../../core/utils/iterator");
var _extend = require("../../../core/utils/extend");
var _type = require("../../../core/utils/type");
var _array = require("../../../core/utils/array");
var _object = require("../../../core/utils/object");
var _common = require("../../../core/utils/common");
var _hasResourceValue = require("../../../renovation/ui/scheduler/resources/hasResourceValue");
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
}
function _defineProperty(obj, key, value) {
key = _toPropertyKey(key);
if (key in obj) {
Object.defineProperty(obj, key, {
value: value,
enumerable: true,
configurable: true,
writable: true
})
} else {
obj[key] = value
}
return obj
}
function _toPropertyKey(arg) {
var key = _toPrimitive(arg, "string");
return "symbol" === _typeof(key) ? key : String(key)
}
function _toPrimitive(input, hint) {
if ("object" !== _typeof(input) || null === input) {
return input
}
var prim = input[Symbol.toPrimitive];
if (void 0 !== prim) {
var res = prim.call(input, hint || "default");
if ("object" !== _typeof(res)) {
return res
}
throw new TypeError("@@toPrimitive must return a primitive value.")
}
return ("string" === hint ? String : Number)(input)
}
function _extends() {
_extends = Object.assign ? Object.assign.bind() : function(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
for (var key in source) {
if (Object.prototype.hasOwnProperty.call(source, key)) {
target[key] = source[key]
}
}
}
return target
};
return _extends.apply(this, arguments)
}
var getValueExpr = function(resource) {
return resource.valueExpr || "id"
};
exports.getValueExpr = getValueExpr;
var getDisplayExpr = function(resource) {
return resource.displayExpr || "text"
};
exports.getDisplayExpr = getDisplayExpr;
var getFieldExpr = function(resource) {
return resource.fieldExpr || resource.field
};
exports.getFieldExpr = getFieldExpr;
var getWrappedDataSource = function(dataSource) {
if (dataSource instanceof _data_source.DataSource) {
return dataSource
}
var result = _extends({}, (0, _utils.normalizeDataSourceOptions)(dataSource), {
pageSize: 0
});
if (!Array.isArray(dataSource)) {
result.filter = dataSource.filter
}
return new _data_source.DataSource(result)
};
exports.getWrappedDataSource = getWrappedDataSource;
var createResourcesTree = function(groups) {
var leafIndex = 0;
return function make(group, groupIndex, result, parent) {
result = result || [];
for (var itemIndex = 0; itemIndex < group.items.length; itemIndex++) {
var _group$data;
var currentGroupItem = group.items[itemIndex];
var resultItem = {
name: group.name,
value: currentGroupItem.id,
title: currentGroupItem.text,
data: null === (_group$data = group.data) || void 0 === _group$data ? void 0 : _group$data[itemIndex],
children: [],
parent: parent || null
};
var nextGroupIndex = groupIndex + 1;
if (groups[nextGroupIndex]) {
make(groups[nextGroupIndex], nextGroupIndex, resultItem.children, resultItem)
}
if (!resultItem.children.length) {
resultItem.leafIndex = leafIndex;
leafIndex++
}
result.push(resultItem)
}
return result
}(groups[0], 0)
};
exports.createResourcesTree = createResourcesTree;
var getPathToLeaf = function(leafIndex, groups) {
var tree = createResourcesTree(groups);
var leaf = function findLeafByIndex(data, index) {
for (var i = 0; i < data.length; i++) {
if (data[i].leafIndex === index) {
return data[i]
} else {
var _leaf = findLeafByIndex(data[i].children, index);
if (_leaf) {
return _leaf
}
}
}
}(tree, leafIndex);
return function makeBranch(leaf, result) {
result = result || [];
result.push(leaf.value);
if (leaf.parent) {
makeBranch(leaf.parent, result)
}
return result
}(leaf).reverse()
};
exports.getPathToLeaf = getPathToLeaf;
var getCellGroups = function(groupIndex, groups) {
var result = [];
if (getGroupCount(groups)) {
if (groupIndex < 0) {
return
}
var path = getPathToLeaf(groupIndex, groups);
for (var i = 0; i < groups.length; i++) {
result.push({
name: groups[i].name,
id: path[i]
})
}
}
return result
};
exports.getCellGroups = getCellGroups;
var getGroupCount = function(groups) {
var result = 0;
for (var i = 0, len = groups.length; i < len; i++) {
if (!i) {
result = groups[i].items.length
} else {
result *= groups[i].items.length
}
}
return result
};
exports.getGroupCount = getGroupCount;
var getGroupsObjectFromGroupsArray = function(groupsArray) {
return groupsArray.reduce((function(currentGroups, _ref) {
var name = _ref.name,
id = _ref.id;
return _extends({}, currentGroups, _defineProperty({}, name, id))
}), {})
};
exports.getGroupsObjectFromGroupsArray = getGroupsObjectFromGroupsArray;
var getAllGroups = function(groups) {
var groupCount = getGroupCount(groups);
return _toConsumableArray(new Array(groupCount)).map((function(_, groupIndex) {
var groupsArray = getCellGroups(groupIndex, groups);
return getGroupsObjectFromGroupsArray(groupsArray)
}))
};
exports.getAllGroups = getAllGroups;
var getResourceByField = function(fieldName, loadedResources) {
for (var i = 0; i < loadedResources.length; i++) {
var resource = loadedResources[i];
if (resource.name === fieldName) {
return resource.data
}
}
return []
};
exports.getResourceByField = getResourceByField;
var createResourceEditorModel = function(resources, loadedResources) {
return resources.map((function(resource) {
var dataField = getFieldExpr(resource);
var dataSource = getResourceByField(dataField, loadedResources);
return {
editorOptions: {
dataSource: dataSource.length ? dataSource : getWrappedDataSource(resource.dataSource),
displayExpr: getDisplayExpr(resource),
valueExpr: getValueExpr(resource)
},
dataField: dataField,
editorType: resource.allowMultiple ? "dxTagBox" : "dxSelectBox",
label: {
text: resource.label || dataField
}
}
}))
};
exports.createResourceEditorModel = createResourceEditorModel;
var isResourceMultiple = function(resources, resourceField) {
var resource = resources.find((function(resource) {
var field = getFieldExpr(resource);
return field === resourceField
}));
return !!(null !== resource && void 0 !== resource && resource.allowMultiple)
};
exports.isResourceMultiple = isResourceMultiple;
var filterResources = function(resources, fields) {
return resources.filter((function(resource) {
var field = getFieldExpr(resource);
return fields.indexOf(field) > -1
}))
};
exports.filterResources = filterResources;
var getPaintedResources = function(resources, groups) {
var newGroups = groups || [];
var result = resources.find((function(resource) {
return resource.useColorAsDefault
}));
if (result) {
return result
}
var newResources = newGroups.length ? filterResources(resources, newGroups) : resources;
return newResources[newResources.length - 1]
};
exports.getPaintedResources = getPaintedResources;
var getOrLoadResourceItem = function(resources, resourceLoaderMap, field, value) {
var result = new _deferred.Deferred;
resources.filter((function(resource) {
return getFieldExpr(resource) === field && (0, _type.isDefined)(resource.dataSource)
})).forEach((function(resource) {
var wrappedDataSource = getWrappedDataSource(resource.dataSource);
var valueExpr = getValueExpr(resource);
if (!resourceLoaderMap.has(field)) {
resourceLoaderMap.set(field, wrappedDataSource.load())
}
resourceLoaderMap.get(field).done((function(data) {
var getter = (0, _data.compileGetter)(valueExpr);
var filteredData = data.filter((function(resource) {
return (0, _common.equalByValue)(getter(resource), value)
}));
result.resolve(filteredData[0])
})).fail((function() {
resourceLoaderMap.delete(field);
result.reject()
}))
}));
return result.promise()
};
exports.getOrLoadResourceItem = getOrLoadResourceItem;
var getDataAccessors = function(dataAccessors, fieldName, type) {
var actions = dataAccessors[type];
return actions[fieldName]
};
exports.getDataAccessors = getDataAccessors;
var groupAppointmentsByResources = function(config, appointments) {
var groups = arguments.length > 2 && void 0 !== arguments[2] ? arguments[2] : [];
var result = {
0: appointments
};
if (groups.length && config.loadedResources.length) {
result = groupAppointmentsByResourcesCore(config, appointments, config.loadedResources)
}
var totalResourceCount = 0;
config.loadedResources.forEach((function(resource, index) {
if (!index) {
totalResourceCount = resource.items.length
} else {
totalResourceCount *= resource.items.length
}
}));
for (var index = 0; index < totalResourceCount; index++) {
var key = index.toString();
if (result[key]) {
continue
}
result[key] = []
}
return result
};
exports.groupAppointmentsByResources = groupAppointmentsByResources;
var groupAppointmentsByResourcesCore = function(config, appointments, resources) {
var tree = createResourcesTree(resources);
var result = {};
appointments.forEach((function(appointment) {
var treeLeaves = getResourceTreeLeaves((function(field, action) {
return getDataAccessors(config.dataAccessors, field, action)
}), tree, appointment);
for (var i = 0; i < treeLeaves.length; i++) {
if (!result[treeLeaves[i]]) {
result[treeLeaves[i]] = []
}
result[treeLeaves[i]].push((0, _object.deepExtendArraySafe)({}, appointment, true))
}
}));
return result
};
exports.groupAppointmentsByResourcesCore = groupAppointmentsByResourcesCore;
var getResourceTreeLeaves = function getResourceTreeLeaves(getDataAccessors, tree, rawAppointment, result) {
result = result || [];
for (var i = 0; i < tree.length; i++) {
if (!hasGroupItem(getDataAccessors, rawAppointment, tree[i].name, tree[i].value)) {
continue
}
if ((0, _type.isDefined)(tree[i].leafIndex)) {
result.push(tree[i].leafIndex)
}
if (tree[i].children) {
getResourceTreeLeaves(getDataAccessors, tree[i].children, rawAppointment, result)
}
}
return result
};
exports.getResourceTreeLeaves = getResourceTreeLeaves;
var hasGroupItem = function(getDataAccessors, rawAppointment, groupName, itemValue) {
var resourceValue = getDataAccessors(groupName, "getter")(rawAppointment);
return (0, _hasResourceValue.hasResourceValue)((0, _array.wrapToArray)(resourceValue), itemValue)
};
var createReducedResourcesTree = function(loadedResources, getDataAccessors, appointments) {
var tree = createResourcesTree(loadedResources);
return reduceResourcesTree(getDataAccessors, tree, appointments)
};
exports.createReducedResourcesTree = createReducedResourcesTree;
var reduceResourcesTree = function reduceResourcesTree(getDataAccessors, tree, existingAppointments, _result) {
_result = _result ? _result.children : [];
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 = 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) {
reduceResourcesTree(getDataAccessors, node.children, existingAppointments, _result[index])
}
}));
return _result
};
exports.reduceResourcesTree = reduceResourcesTree;
var getResourcesDataByGroups = function(loadedResources, resources, groups) {
if (!groups || !groups.length) {
return loadedResources
}
var fieldNames = {};
var currentResourcesData = [];
groups.forEach((function(group) {
(0, _iterator.each)(group, (function(name, value) {
return fieldNames[name] = value
}))
}));
var resourceData = loadedResources.filter((function(_ref2) {
var name = _ref2.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 = filterResources(resources, [resourceName])[0] || {};
var valueExpr = 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
};
exports.getResourcesDataByGroups = getResourcesDataByGroups;
var setResourceToAppointment = function(resources, dataAccessors, appointment, groups) {
var resourcesSetter = dataAccessors.setter;
for (var name in groups) {
var resourceData = groups[name];
var value = isResourceMultiple(resources, name) ? (0, _array.wrapToArray)(resourceData) : resourceData;
resourcesSetter[name](appointment, value)
}
};
exports.setResourceToAppointment = setResourceToAppointment;
var getResourceColor = function(resources, resourceLoaderMap, field, value) {
var result = new _deferred.Deferred;
var resource = filterResources(resources, [field])[0] || {};
var colorExpr = resource.colorExpr || "color";
var colorGetter = (0, _data.compileGetter)(colorExpr);
getOrLoadResourceItem(resources, resourceLoaderMap, field, value).done((function(resource) {
return result.resolve(colorGetter(resource))
})).fail((function() {
return result.reject()
}));
return result.promise()
};
exports.getResourceColor = getResourceColor;
var getAppointmentColor = function(resourceConfig, appointmentConfig) {
var resources = resourceConfig.resources,
dataAccessors = resourceConfig.dataAccessors,
loadedResources = resourceConfig.loadedResources,
resourceLoaderMap = resourceConfig.resourceLoaderMap;
var groupIndex = appointmentConfig.groupIndex,
groups = appointmentConfig.groups,
itemData = appointmentConfig.itemData;
var paintedResources = getPaintedResources(resources || [], groups);
if (paintedResources) {
var field = getFieldExpr(paintedResources);
var cellGroups = getCellGroups(groupIndex, loadedResources);
var resourcesDataAccessors = getDataAccessors(dataAccessors, field, "getter");
var resourceValues = (0, _array.wrapToArray)(resourcesDataAccessors(itemData));
var groupId = resourceValues[0];
for (var i = 0; i < cellGroups.length; i++) {
if (cellGroups[i].name === field) {
groupId = cellGroups[i].id;
break
}
}
return getResourceColor(resources, resourceLoaderMap, field, groupId)
}
return (new _deferred.Deferred).resolve().promise()
};
exports.getAppointmentColor = getAppointmentColor;
var createExpressions = function() {
var resources = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [];
var result = {
getter: {},
setter: {}
};
resources.forEach((function(resource) {
var field = getFieldExpr(resource);
result.getter[field] = (0, _data.compileGetter)(field);
result.setter[field] = (0, _data.compileSetter)(field)
}));
return result
};
exports.createExpressions = createExpressions;
var getTransformedResourceData = function(resource, data) {
var valueGetter = (0, _data.compileGetter)(getValueExpr(resource));
var displayGetter = (0, _data.compileGetter)(getDisplayExpr(resource));
return data.map((function(item) {
var result = {
id: valueGetter(item),
text: displayGetter(item)
};
if (item.color) {
result.color = item.color
}
return result
}))
};
var loadResources = function(groups, resources, resourceLoaderMap) {
var result = new _deferred.Deferred;
var deferreds = [];
var newGroups = groups || [];
var newResources = resources || [];
var loadedResources = [];
filterResources(newResources, newGroups).forEach((function(resource) {
var deferred = new _deferred.Deferred;
var name = getFieldExpr(resource);
deferreds.push(deferred);
var dataSourcePromise = getWrappedDataSource(resource.dataSource).load();
resourceLoaderMap.set(name, dataSourcePromise);
dataSourcePromise.done((function(data) {
var items = getTransformedResourceData(resource, data);
deferred.resolve({
name: name,
items: items,
data: data
})
})).fail((function() {
return deferred.reject()
}))
}));
if (!deferreds.length) {
return result.resolve(loadedResources)
}
_deferred.when.apply(null, deferreds).done((function() {
for (var _len = arguments.length, resources = new Array(_len), _key = 0; _key < _len; _key++) {
resources[_key] = arguments[_key]
}
var hasEmpty = resources.some((function(r) {
return 0 === r.items.length
}));
loadedResources = hasEmpty ? [] : resources;
result.resolve(loadedResources)
})).fail((function() {
return result.reject()
}));
return result.promise()
};
exports.loadResources = loadResources;
var getNormalizedResources = function(rawAppointment, dataAccessors, resources) {
var result = {};
(0, _iterator.each)(dataAccessors.resources.getter, (function(fieldName) {
var value = dataAccessors.resources.getter[fieldName](rawAppointment);
if ((0, _type.isDefined)(value)) {
var isMultiple = isResourceMultiple(resources, fieldName);
var resourceValue = isMultiple ? (0, _array.wrapToArray)(value) : value;
result[fieldName] = resourceValue
}
}));
return result
};
exports.getNormalizedResources = getNormalizedResources;