UNPKG

devextreme

Version:

HTML5 JavaScript Component Suite for Responsive Web Development

78 lines (77 loc) 2.8 kB
/** * 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) } } }