@skbkontur/cassandra-distributed-task-queue-ui
Version:
.NET library implementing distributed task queue machinery using Apache Cassandra
84 lines • 5.26 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.TaskChainsTreeContainer = void 0;
const tslib_1 = require("tslib");
const jsx_runtime_1 = require("react/jsx-runtime");
const react_ui_1 = require("@skbkontur/react-ui");
const difference_1 = tslib_1.__importDefault(require("lodash/difference"));
const uniq_1 = tslib_1.__importDefault(require("lodash/uniq"));
const react_1 = require("react");
const react_router_dom_1 = require("react-router-dom");
const RtqMonitoringSearchRequestUtils_1 = require("../Domain/RtqMonitoringSearchRequestUtils");
const RouteUtils_1 = require("../Domain/Utils/RouteUtils");
const ErrorHandlingContainer_1 = require("../components/ErrorHandling/ErrorHandlingContainer");
const CommonLayout_1 = require("../components/Layouts/CommonLayout");
const TaskChainTree_1 = require("../components/TaskChainTree/TaskChainTree");
const TasksPageContainer_1 = require("./TasksPageContainer");
const isNotNullOrUndefined = (input) => Boolean(input);
const TaskChainsTreeContainer = ({ useErrorHandlingContainer, rtqMonitoringApi, }) => {
const { search, pathname } = react_router_dom_1.useLocation();
const [loading, setLoading] = react_1.useState(false);
const [loaderText, setLoaderText] = react_1.useState("");
const [taskDetails, setTaskDetails] = react_1.useState([]);
react_1.useEffect(() => {
const request = getRequestBySearchQuery(search);
if (!isSearchRequestEmpty(search)) {
loadData(search, request);
}
}, [search]);
const isSearchRequestEmpty = (searchQuery) => {
const request = TasksPageContainer_1.searchRequestMapping.parse(searchQuery);
return RtqMonitoringSearchRequestUtils_1.isRemoteTaskQueueSearchRequestEmpty(request);
};
const getRequestBySearchQuery = (searchQuery) => {
const request = TasksPageContainer_1.searchRequestMapping.parse(searchQuery);
if (RtqMonitoringSearchRequestUtils_1.isRemoteTaskQueueSearchRequestEmpty(request)) {
return RtqMonitoringSearchRequestUtils_1.createDefaultRemoteTaskQueueSearchRequest();
}
return request;
};
const getParentAndChildrenTaskIds = (taskDetails) => {
const linkedIds = taskDetails
.map(({ childTaskIds, taskMeta: { parentTaskId } }) => [parentTaskId, ...(childTaskIds || [])])
.flat()
.filter(isNotNullOrUndefined);
return uniq_1.default(linkedIds);
};
const getTaskLocation = (id) => ({ pathname: `../${id}` });
return (jsx_runtime_1.jsxs(CommonLayout_1.CommonLayout, Object.assign({ withArrow: true }, { children: [jsx_runtime_1.jsx(CommonLayout_1.CommonLayout.GoBack, { to: `${RouteUtils_1.RouteUtils.backUrl(pathname)}${search}` }, void 0), jsx_runtime_1.jsx(CommonLayout_1.CommonLayout.Header, { title: "\u0414\u0435\u0440\u0435\u0432\u043E \u0437\u0430\u0434\u0430\u0447" }, void 0), jsx_runtime_1.jsxs(CommonLayout_1.CommonLayout.Content, { children: [jsx_runtime_1.jsx(react_ui_1.Loader, Object.assign({ type: "big", active: loading, caption: loaderText }, { children: jsx_runtime_1.jsx("div", Object.assign({ style: { overflowX: "auto" } }, { children: taskDetails && jsx_runtime_1.jsx(TaskChainTree_1.TaskChainTree, { getTaskLocation: getTaskLocation, taskDetails: taskDetails }, void 0) }), void 0) }), void 0), useErrorHandlingContainer && jsx_runtime_1.jsx(ErrorHandlingContainer_1.ErrorHandlingContainer, {}, void 0)] }, void 0)] }), void 0));
function loadData(searchQuery, request) {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
let iterationCount = 0;
setLoading(true);
setLoaderText("Загрузка задач: 0");
try {
let taskDetails = [];
let allTaskIds = [];
const results = yield rtqMonitoringApi.search(request);
let taskIdsToLoad = results.taskMetas.map(x => x.id);
while (taskIdsToLoad.length > 0) {
iterationCount++;
if (taskIdsToLoad.length > 100) {
throw new Error("Количство задач в дереве превысило допустимый предел: 100 зачад");
}
const loadedTaskDetails = yield Promise.all(taskIdsToLoad.map(id => rtqMonitoringApi.getTaskDetails(id)));
allTaskIds = [...allTaskIds, ...taskIdsToLoad];
setLoading(true);
setLoaderText(`Загрузка задач: ${taskDetails.length}`);
const parentAndChildrenTaskIds = getParentAndChildrenTaskIds(loadedTaskDetails);
taskIdsToLoad = difference_1.default(parentAndChildrenTaskIds, allTaskIds);
taskDetails = [...taskDetails, ...loadedTaskDetails];
if (iterationCount > 50) {
break;
}
}
setTaskDetails(taskDetails);
}
finally {
setLoading(false);
}
});
}
};
exports.TaskChainsTreeContainer = TaskChainsTreeContainer;
//# sourceMappingURL=TaskChainsTreeContainer.js.map
;