devextreme
Version:
HTML5 JavaScript Component Suite for Responsive Web Development
78 lines (77 loc) • 2.8 kB
JavaScript
/**
* DevExtreme (esm/__internal/scheduler/resources/resource_processor.js)
* Version: 24.2.7
* Build date: Mon Apr 28 2025
*
* Copyright (c) 2012 - 2025 Developer Express Inc. ALL RIGHTS RESERVED
* Read about DevExtreme licensing here: https://js.devexpress.com/Licensing/
*/
import {
wrapToArray
} from "../../../core/utils/array";
import {
getFieldExpr,
getIdExpr,
getTextExpr,
getWrappedDataSource
} from "./m_utils";
const loadResource = dataSourceConfig => {
if (!dataSourceConfig) {
return Promise.resolve([])
}
const dataSource = getWrappedDataSource(dataSourceConfig);
if (dataSource.isLoaded()) {
return Promise.resolve(dataSource.items())
}
return new Promise(((resolve, reject) => {
dataSource.load().done((list => resolve(list))).fail((() => reject()))
}))
};
const getAppointmentResources = (resourceMap, rawAppointment) => Object.entries(resourceMap).reduce(((result, _ref) => {
let [fieldName, data] = _ref;
const item = {
label: data.label,
values: []
};
if (fieldName in rawAppointment) {
wrapToArray(rawAppointment[fieldName]).forEach((value => {
item.values.push(data.texts.get(value) ?? "")
}))
}
if (item.values.length) {
result.push(item)
}
return result
}), []);
export class ResourceProcessor {
constructor() {
let resourceConfig = arguments.length > 0 && void 0 !== arguments[0] ? arguments[0] : [];
let resourceMap = arguments.length > 1 && void 0 !== arguments[1] ? arguments[1] : {};
this.resourceConfig = resourceConfig;
this.resourceMap = resourceMap
}
async getAppointmentResourcesValues(rawAppointment) {
if (0 === this.resourceConfig.length) {
return Promise.resolve([])
}
return this.loadDataSource().then((resourceMap => getAppointmentResources(resourceMap, rawAppointment)))
}
loadDataSource() {
if (this.loadingPromise) {
return this.loadingPromise
}
this.loadingPromise = Promise.all(this.resourceConfig.map((resource => loadResource(resource.dataSource).then((items => this.onResourceLoaded(resource, items)))))).then((() => this.resourceMap));
return this.loadingPromise
}
onResourceLoaded(resource, items) {
const idExpr = getIdExpr(resource);
const textExpr = getTextExpr(resource);
this.resourceMap[getFieldExpr(resource)] = {
label: resource.label,
texts: items.reduce(((result, item) => {
result.set(item[idExpr], item[textExpr] ?? "");
return result
}), new Map)
}
}
}