UNPKG

@mui/x-data-grid-pro

Version:

The Pro plan edition of the MUI X Data Grid components.

100 lines (99 loc) 3.57 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.getGroupKeys = exports.RequestStatus = exports.NestedDataManager = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _xDataGrid = require("@mui/x-data-grid"); const MAX_CONCURRENT_REQUESTS = Infinity; let RequestStatus = exports.RequestStatus = /*#__PURE__*/function (RequestStatus) { RequestStatus[RequestStatus["QUEUED"] = 0] = "QUEUED"; RequestStatus[RequestStatus["PENDING"] = 1] = "PENDING"; RequestStatus[RequestStatus["SETTLED"] = 2] = "SETTLED"; RequestStatus[RequestStatus["UNKNOWN"] = 3] = "UNKNOWN"; return RequestStatus; }({}); /** * Fetches row children from the server with option to limit the number of concurrent requests * Determines the status of a request based on the enum `RequestStatus` * Uses `GridRowId` to uniquely identify a request */ class NestedDataManager { pendingRequests = new Set(); queuedRequests = new Set(); settledRequests = new Set(); constructor(privateApiRef, maxConcurrentRequests = MAX_CONCURRENT_REQUESTS) { this.api = privateApiRef.current; this.maxConcurrentRequests = maxConcurrentRequests; } processQueue = async () => { if (this.queuedRequests.size === 0 || this.pendingRequests.size >= this.maxConcurrentRequests) { return; } const loopLength = Math.min(this.maxConcurrentRequests - this.pendingRequests.size, this.queuedRequests.size); if (loopLength === 0) { return; } const fetchQueue = Array.from(this.queuedRequests); for (let i = 0; i < loopLength; i += 1) { const id = fetchQueue[i]; this.queuedRequests.delete(id); this.pendingRequests.add(id); this.api.fetchRowChildren(id); } }; queue = async ids => { const loadingIds = {}; ids.forEach(id => { this.queuedRequests.add(id); loadingIds[id] = true; }); this.api.setState(state => (0, _extends2.default)({}, state, { dataSource: (0, _extends2.default)({}, state.dataSource, { loading: (0, _extends2.default)({}, state.dataSource.loading, loadingIds) }) })); this.processQueue(); }; setRequestSettled = id => { this.pendingRequests.delete(id); this.settledRequests.add(id); this.processQueue(); }; clear = () => { this.queuedRequests.clear(); Array.from(this.pendingRequests).forEach(id => this.clearPendingRequest(id)); }; clearPendingRequest = id => { this.api.dataSource.setChildrenLoading(id, false); this.pendingRequests.delete(id); this.processQueue(); }; getRequestStatus = id => { if (this.pendingRequests.has(id)) { return RequestStatus.PENDING; } if (this.queuedRequests.has(id)) { return RequestStatus.QUEUED; } if (this.settledRequests.has(id)) { return RequestStatus.SETTLED; } return RequestStatus.UNKNOWN; }; getActiveRequestsCount = () => this.pendingRequests.size + this.queuedRequests.size; } exports.NestedDataManager = NestedDataManager; const getGroupKeys = (tree, rowId) => { const rowNode = tree[rowId]; let currentNodeId = rowNode.parent; const groupKeys = []; while (currentNodeId && currentNodeId !== _xDataGrid.GRID_ROOT_GROUP_ID) { const currentNode = tree[currentNodeId]; groupKeys.push(currentNode.groupingKey ?? ''); currentNodeId = currentNode.parent; } return groupKeys.reverse(); }; exports.getGroupKeys = getGroupKeys;