@mui/x-data-grid-pro
Version:
The Pro plan edition of the MUI X Data Grid components.
100 lines (99 loc) • 3.57 kB
JavaScript
"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;