@danikokonn/yarik-frontend-lib 2.0.55 → 2.0.56
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/SubtaskItem/SubtaskItem.d.ts.map +1 -1
- package/dist/components/SubtaskItem/SubtaskItem.js +4 -1
- package/dist/components/TaskLoader/TaskLoader.d.ts.map +1 -1
- package/dist/components/TaskLoader/TaskLoader.js +76 -86
- package/dist/providers/DagStateProvider.d.ts +2 -1
- package/dist/providers/DagStateProvider.d.ts.map +1 -1
- package/dist/providers/DagStateProvider.js +82 -97
- package/dist/utils.d.ts +1 -1
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +2 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SubtaskItem.d.ts","sourceRoot":"","sources":["../../../src/components/SubtaskItem/SubtaskItem.tsx"],"names":[],"mappings":"AAgBA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"SubtaskItem.d.ts","sourceRoot":"","sources":["../../../src/components/SubtaskItem/SubtaskItem.tsx"],"names":[],"mappings":"AAgBA,OAAO,gBAAgB,MAAM,oBAAoB,CAAC;AAmBlD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,EAClC,YAAY,EACZ,IAAI,EACJ,QAAQ,EACR,UAAU,EACV,uBAAuB,GACxB,EAAE,gBAAgB,2CAwIlB"}
|
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import AccessTimeSharpIcon from "@mui/icons-material/AccessTimeSharp";
|
|
3
3
|
import BlockSharpIcon from "@mui/icons-material/BlockSharp";
|
|
4
4
|
import CheckCircleOutlineRoundedIcon from "@mui/icons-material/CheckCircleOutlineRounded";
|
|
5
|
+
import CloudOffIcon from "@mui/icons-material/CloudOff";
|
|
5
6
|
import DoneIcon from "@mui/icons-material/Done";
|
|
6
7
|
import ErrorOutlineSharpIcon from "@mui/icons-material/ErrorOutlineSharp";
|
|
7
8
|
import ExpandMore from "@mui/icons-material/ExpandMore";
|
|
@@ -10,9 +11,9 @@ import Accordion from "@mui/material/Accordion";
|
|
|
10
11
|
import AccordionDetails from "@mui/material/AccordionDetails";
|
|
11
12
|
import AccordionSummary from "@mui/material/AccordionSummary";
|
|
12
13
|
import CircularProgress from "@mui/material/CircularProgress";
|
|
13
|
-
import { taskStateText } from "../../utils";
|
|
14
14
|
import moment from "moment";
|
|
15
15
|
import { useState } from "react";
|
|
16
|
+
import { taskStateText } from "../../utils";
|
|
16
17
|
const SubtaskState = ({ state }) => {
|
|
17
18
|
switch (state) {
|
|
18
19
|
case "success":
|
|
@@ -23,6 +24,8 @@ const SubtaskState = ({ state }) => {
|
|
|
23
24
|
return _jsx(AccessTimeSharpIcon, {});
|
|
24
25
|
case "running":
|
|
25
26
|
return _jsx(CircularProgress, { size: 20 });
|
|
27
|
+
case "connerr":
|
|
28
|
+
return _jsx(CloudOffIcon, {});
|
|
26
29
|
default:
|
|
27
30
|
return _jsx(BlockSharpIcon, {});
|
|
28
31
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"TaskLoader.d.ts","sourceRoot":"","sources":["../../../src/components/TaskLoader/TaskLoader.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"TaskLoader.d.ts","sourceRoot":"","sources":["../../../src/components/TaskLoader/TaskLoader.tsx"],"names":[],"mappings":"AAkCA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAuBhD,QAAA,MAAM,UAAU,GAAI,qCAAqC,eAAe,4CAkbvE,CAAC;AAEF,eAAe,UAAU,CAAC"}
|
|
@@ -2,6 +2,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
2
2
|
import AccessTimeSharpIcon from "@mui/icons-material/AccessTimeSharp";
|
|
3
3
|
import BlockSharpIcon from "@mui/icons-material/BlockSharp";
|
|
4
4
|
import CheckCircleOutlineRoundedIcon from "@mui/icons-material/CheckCircleOutlineRounded";
|
|
5
|
+
import CloudOffIcon from "@mui/icons-material/CloudOff";
|
|
5
6
|
import ErrorOutlineSharpIcon from "@mui/icons-material/ErrorOutlineSharp";
|
|
6
7
|
import RestartAltIcon from "@mui/icons-material/RestartAlt";
|
|
7
8
|
import StopRoundedIcon from "@mui/icons-material/StopRounded";
|
|
@@ -12,7 +13,8 @@ import IconButton from "@mui/material/IconButton";
|
|
|
12
13
|
import Switch from "@mui/material/Switch";
|
|
13
14
|
import Typography from "@mui/material/Typography";
|
|
14
15
|
import { useEffect, useEffectEvent, useRef, useState } from "react";
|
|
15
|
-
import
|
|
16
|
+
import useSWR from "swr";
|
|
17
|
+
import { postRequest } from "../../http";
|
|
16
18
|
import { useAirflowContext } from "../../providers/AirflowProvider";
|
|
17
19
|
import { useDagRunStateContext } from "../../providers/DagStateProvider";
|
|
18
20
|
import { formatDate, formatDuration, getCSRFToken, taskStateText, useDebounce, } from "../../utils";
|
|
@@ -28,13 +30,15 @@ const TaskStateIcon = ({ taskState, }) => {
|
|
|
28
30
|
return _jsx(AccessTimeSharpIcon, { fontSize: "large" });
|
|
29
31
|
case "running":
|
|
30
32
|
return _jsx(CircularProgress, {});
|
|
33
|
+
case "connerr":
|
|
34
|
+
return _jsx(CloudOffIcon, {});
|
|
31
35
|
default:
|
|
32
36
|
return _jsx(BlockSharpIcon, { fontSize: "large" });
|
|
33
37
|
}
|
|
34
38
|
};
|
|
35
39
|
const TaskLoader = ({ style, subTitle, onUnauthorized }) => {
|
|
36
40
|
const { airflowAvailable, onLostConnection } = useAirflowContext();
|
|
37
|
-
const { isActive, dagRun, taskInstances, onUpdateState, fetchState } = useDagRunStateContext();
|
|
41
|
+
const { isActive, dagRun, taskInstances, onUpdateState, fetchState, error } = useDagRunStateContext();
|
|
38
42
|
const [activeTask, setActiveTask] = useState(taskInstances?.taskInstances.find((ti) => {
|
|
39
43
|
return ti.state === "running";
|
|
40
44
|
}) || null);
|
|
@@ -81,97 +85,83 @@ const TaskLoader = ({ style, subTitle, onUnauthorized }) => {
|
|
|
81
85
|
clearInterval(interval);
|
|
82
86
|
};
|
|
83
87
|
}, [isActive, taskInstances]);
|
|
84
|
-
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
88
|
+
const defaultFetcher = async ([url, dagId, dagRunId, taskId, tryNum, continuationToken,]) => {
|
|
89
|
+
const requestUrl = new URL("http://foo/" + url);
|
|
90
|
+
requestUrl.searchParams.append("dag_id", dagId);
|
|
91
|
+
if (dagRunId)
|
|
92
|
+
requestUrl.searchParams.append("dag_run_id", dagRunId);
|
|
93
|
+
requestUrl.searchParams.append("task_id", taskId);
|
|
94
|
+
requestUrl.searchParams.append("try_num", tryNum.toString());
|
|
95
|
+
if (continuationToken)
|
|
96
|
+
requestUrl.searchParams.append("continuation_token", continuationToken);
|
|
97
|
+
const resultUrl = requestUrl.pathname.substring(1) + requestUrl.search;
|
|
98
|
+
const res = await fetch(resultUrl, { signal: AbortSignal.timeout(10000) });
|
|
99
|
+
if (res.status === 401) {
|
|
100
|
+
onUnauthorized();
|
|
101
|
+
}
|
|
102
|
+
if (!res.ok) {
|
|
103
|
+
throw { ...(await res.json()), status: res.status };
|
|
104
|
+
}
|
|
105
|
+
return res.json();
|
|
106
|
+
};
|
|
107
|
+
const taskIndex = taskInstances != null
|
|
108
|
+
? taskInstances.taskInstances.findIndex((ti) => activeTask != null && ti.taskId === activeTask.taskId)
|
|
109
|
+
: -1;
|
|
110
|
+
const continuationToken = taskIndex >= 0
|
|
111
|
+
? logs[taskIndex] != null
|
|
112
|
+
? logs[taskIndex].continuationToken
|
|
113
|
+
: null
|
|
114
|
+
: null;
|
|
115
|
+
useSWR(airflowAvailable &&
|
|
116
|
+
activeTask != null && [
|
|
117
|
+
"airflow/ti_logs",
|
|
118
|
+
dagRun?.dagId,
|
|
119
|
+
dagRun?.dagRunId,
|
|
120
|
+
activeTask.taskId,
|
|
121
|
+
activeTask.tryNumber,
|
|
122
|
+
continuationToken,
|
|
123
|
+
], defaultFetcher, {
|
|
124
|
+
refreshInterval: isActive ? 1000 : 0,
|
|
125
|
+
keepPreviousData: true,
|
|
126
|
+
onError: (err) => {
|
|
127
|
+
if (err?.status == 401) {
|
|
128
|
+
onUnauthorized();
|
|
129
|
+
}
|
|
130
|
+
console.log("Error while fetching logs");
|
|
131
|
+
if (err && err.status === 503) {
|
|
132
|
+
onLostConnection();
|
|
133
|
+
}
|
|
134
|
+
},
|
|
135
|
+
onSuccess: (data) => {
|
|
136
|
+
const newLogs = logs.slice();
|
|
137
|
+
if (!data)
|
|
89
138
|
return;
|
|
90
|
-
if (
|
|
139
|
+
if (data.logs.content.length === 0)
|
|
91
140
|
return;
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
dag_id: dagRun?.dagId,
|
|
104
|
-
dag_run_id: dagRun?.dagRunId,
|
|
105
|
-
task_id: activeTask.taskId,
|
|
106
|
-
try_num: activeTask.tryNumber,
|
|
107
|
-
continuation_token: continuationToken,
|
|
108
|
-
},
|
|
109
|
-
successHandler: (resp) => {
|
|
110
|
-
const newLogs = logs.slice();
|
|
111
|
-
if (!resp)
|
|
112
|
-
return;
|
|
113
|
-
if (resp.logs.content.length === 0)
|
|
114
|
-
return;
|
|
115
|
-
if (newLogs[taskIndex] != null) {
|
|
116
|
-
newLogs[taskIndex].continuationToken = resp.logs.continuationToken;
|
|
117
|
-
newLogs[taskIndex].content += resp.logs.content;
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
newLogs[taskIndex] = resp.logs;
|
|
121
|
-
}
|
|
122
|
-
setLogs(newLogs);
|
|
123
|
-
},
|
|
124
|
-
errorHandler: (resp) => {
|
|
125
|
-
if (resp?.status == 401) {
|
|
126
|
-
onUnauthorized();
|
|
127
|
-
}
|
|
128
|
-
console.log("Error while fetching logs");
|
|
129
|
-
if (resp && resp.status === 503) {
|
|
130
|
-
onLostConnection();
|
|
131
|
-
}
|
|
132
|
-
},
|
|
133
|
-
});
|
|
134
|
-
}, 500);
|
|
135
|
-
return () => {
|
|
136
|
-
clearInterval(interval);
|
|
137
|
-
};
|
|
138
|
-
}, [isActive, activeTask, dagRun, taskInstances, logs]);
|
|
139
|
-
const handleShowLogs = (taskId, tryNum) => {
|
|
141
|
+
if (newLogs[taskIndex] != null) {
|
|
142
|
+
newLogs[taskIndex].continuationToken = data.logs.continuationToken;
|
|
143
|
+
newLogs[taskIndex].content += data.logs.content;
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
newLogs[taskIndex] = data.logs;
|
|
147
|
+
}
|
|
148
|
+
setLogs(newLogs);
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
const handleShowLogs = (taskId) => {
|
|
140
152
|
if (!airflowAvailable)
|
|
141
153
|
return;
|
|
142
154
|
if (activeTask != null && taskId === activeTask.taskId) {
|
|
143
155
|
setActiveTask(null);
|
|
144
156
|
return;
|
|
145
157
|
}
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
continuation_token: null,
|
|
154
|
-
},
|
|
155
|
-
successHandler: (resp) => {
|
|
156
|
-
if (!resp)
|
|
157
|
-
return;
|
|
158
|
-
const newActiveTaskIdx = taskInstances != null
|
|
159
|
-
? taskInstances.taskInstances.findIndex((ti) => ti.taskId === taskId)
|
|
160
|
-
: -1;
|
|
161
|
-
setActiveTask(taskInstances?.taskInstances[newActiveTaskIdx] || null);
|
|
162
|
-
const newLogs = logs.slice();
|
|
163
|
-
newLogs[newActiveTaskIdx] = resp.logs;
|
|
164
|
-
setLogs(newLogs);
|
|
165
|
-
},
|
|
166
|
-
errorHandler: (resp) => {
|
|
167
|
-
if (resp?.status == 401) {
|
|
168
|
-
onUnauthorized();
|
|
169
|
-
}
|
|
170
|
-
console.log("Error while getting logs for subtask!");
|
|
171
|
-
if (resp && resp.status === 503) {
|
|
172
|
-
onLostConnection();
|
|
173
|
-
}
|
|
174
|
-
},
|
|
158
|
+
const newActiveTaskIdx = taskInstances != null
|
|
159
|
+
? taskInstances.taskInstances.findIndex((ti) => ti.taskId === taskId)
|
|
160
|
+
: -1;
|
|
161
|
+
setActiveTask(taskInstances?.taskInstances[newActiveTaskIdx] || null);
|
|
162
|
+
setLogs((prev) => {
|
|
163
|
+
const newLogs = prev.filter((_, i) => i === newActiveTaskIdx);
|
|
164
|
+
return newLogs;
|
|
175
165
|
});
|
|
176
166
|
};
|
|
177
167
|
const handleRestartLoad = () => {
|
|
@@ -275,7 +265,7 @@ const TaskLoader = ({ style, subTitle, onUnauthorized }) => {
|
|
|
275
265
|
width: "auto",
|
|
276
266
|
whiteSpace: "nowrap",
|
|
277
267
|
overflow: "hidden",
|
|
278
|
-
}, children: _jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [_jsx(TaskStateIcon, { taskState: dagRun?.state }), _jsxs("span", { children: [taskStateText(dagRun?.state), dagRun?.state === "success"
|
|
268
|
+
}, children: _jsxs("div", { style: { display: "flex", alignItems: "center", gap: "0.5rem" }, children: [_jsx(TaskStateIcon, { taskState: error || !airflowAvailable ? "connerr" : dagRun?.state }), _jsxs("span", { children: [taskStateText(error || !airflowAvailable ? "connerr" : dagRun?.state), dagRun?.state === "success"
|
|
279
269
|
? (formatEndDate.startsWith("вт") ? " во " : " в ") +
|
|
280
270
|
formatEndDate +
|
|
281
271
|
" за " +
|
|
@@ -9,7 +9,7 @@ interface DagRunStateProviderProps {
|
|
|
9
9
|
autorunHandler?(dagRun: DagRun | null, autorun: boolean): void;
|
|
10
10
|
onUnauthorized(): void;
|
|
11
11
|
}
|
|
12
|
-
declare const DagRunStateProvider: ({ children, dagRun: _dagRun, autorun: _autorun, poolingByUser,
|
|
12
|
+
declare const DagRunStateProvider: ({ children, dagRun: _dagRun, autorun: _autorun, poolingByUser, autorunHandler, onUnauthorized, }: DagRunStateProviderProps) => import("react/jsx-runtime").JSX.Element;
|
|
13
13
|
export declare const useDagRunStateContext: () => {
|
|
14
14
|
isActive: boolean;
|
|
15
15
|
autorun: boolean;
|
|
@@ -17,6 +17,7 @@ export declare const useDagRunStateContext: () => {
|
|
|
17
17
|
taskInstances: TaskInstances | null;
|
|
18
18
|
dagStartedOnce: boolean;
|
|
19
19
|
onUpdateState(isActive: boolean, dagRun: DagRun | null, taskInstances: TaskInstances | null): void;
|
|
20
|
+
error: boolean;
|
|
20
21
|
onDagStarted: () => void;
|
|
21
22
|
activate(): void;
|
|
22
23
|
fetchState(): void;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"DagStateProvider.d.ts","sourceRoot":"","sources":["../../src/providers/DagStateProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"DagStateProvider.d.ts","sourceRoot":"","sources":["../../src/providers/DagStateProvider.tsx"],"names":[],"mappings":"AAAA,OAAO,KAON,MAAM,OAAO,CAAC;AAEf,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAkCjD,UAAU,wBAAwB;IAChC,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,CAAC,EAAE,aAAa,CAAC;IAC9B,cAAc,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI,CAAC;IAC/D,cAAc,IAAI,IAAI,CAAC;CACxB;AAED,QAAA,MAAM,mBAAmB,GAAI,kGAO1B,wBAAwB,4CAuJ1B,CAAC;AAEF,eAAO,MAAM,qBAAqB;cAvMtB,OAAO;aACR,OAAO;YACR,MAAM,GAAG,IAAI;mBACN,aAAa,GAAG,IAAI;oBACnB,OAAO;4BAEX,OAAO,UACT,MAAM,GAAG,IAAI,iBACN,aAAa,GAAG,IAAI,GAClC,IAAI;WACA,OAAO;kBACA,MAAM,IAAI;gBACZ,IAAI;kBACF,IAAI;wBACE,OAAO,GAAG,IAAI;CA2LnC,CAAC;AAEF,eAAe,mBAAmB,CAAC"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
-
import { createContext, useCallback, useContext, useEffect, useState, } from "react";
|
|
3
|
-
import
|
|
2
|
+
import { createContext, useCallback, useContext, useEffect, useEffectEvent, useState, } from "react";
|
|
3
|
+
import useSWR from "swr";
|
|
4
4
|
import { useAirflowContext } from "./AirflowProvider";
|
|
5
5
|
import { useSnackbarContext } from "./SnackBarProvider";
|
|
6
6
|
const DagRunStateContext = createContext({
|
|
@@ -9,121 +9,105 @@ const DagRunStateContext = createContext({
|
|
|
9
9
|
dagRun: null,
|
|
10
10
|
taskInstances: null,
|
|
11
11
|
dagStartedOnce: false,
|
|
12
|
+
error: false,
|
|
12
13
|
onUpdateState: () => { },
|
|
13
14
|
onDagStarted: () => { },
|
|
14
15
|
fetchState: () => { },
|
|
15
16
|
activate: () => { },
|
|
16
17
|
setAutorun: () => { },
|
|
17
18
|
});
|
|
18
|
-
const DagRunStateProvider = ({ children, dagRun: _dagRun, autorun: _autorun, poolingByUser,
|
|
19
|
+
const DagRunStateProvider = ({ children, dagRun: _dagRun, autorun: _autorun, poolingByUser, autorunHandler, onUnauthorized, }) => {
|
|
19
20
|
const { airflowAvailable, dagId, onLostConnection } = useAirflowContext();
|
|
20
|
-
const [isActive, setIsActive] = useState(Boolean(_dagRun
|
|
21
|
-
? ["queued", "running"].includes(_dagRun.state)
|
|
22
|
-
: dagId && dagId?.length > 0));
|
|
23
|
-
const [channelBusy, setChannelBusy] = useState(false);
|
|
24
21
|
const [autorun, setAutorun] = useState(_autorun || false);
|
|
25
|
-
const
|
|
26
|
-
setIsActive(true);
|
|
27
|
-
}, [isActive, setIsActive]);
|
|
28
|
-
const [dagRun, setDagRun] = useState(_dagRun || null);
|
|
29
|
-
const [taskInstances, setTaskInstances] = useState(_taskInstances || null);
|
|
22
|
+
const [dagRunId, setDagRunId] = useState(_dagRun?.dagRunId);
|
|
30
23
|
const [dagStartedOnce, setDagStartedOnce] = useState(false);
|
|
31
24
|
const { enqueueSnackbar } = useSnackbarContext();
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
},
|
|
48
|
-
successHandler: (resp) => {
|
|
49
|
-
if (resp?.dagRun) {
|
|
50
|
-
setDagRun(resp.dagRun);
|
|
51
|
-
setTaskInstances(resp.taskInstances);
|
|
52
|
-
setIsActive(["queued", "running"].includes(resp.dagRun.state));
|
|
53
|
-
}
|
|
54
|
-
else {
|
|
55
|
-
setIsActive(false);
|
|
56
|
-
enqueueSnackbar(`Ошибка при обновлении состояния задачи${(dagId && " ") || ""}${dagId || ""}!`, "error");
|
|
57
|
-
}
|
|
58
|
-
setChannelBusy(false);
|
|
59
|
-
},
|
|
60
|
-
errorHandler: (resp) => {
|
|
61
|
-
if (resp?.status === 401) {
|
|
62
|
-
onUnauthorized();
|
|
63
|
-
}
|
|
64
|
-
if (resp?.status !== 404) {
|
|
65
|
-
enqueueSnackbar(`Ошибка при обновлении состояния задачи${(dagId && " ") || ""}${dagId || ""}!`, "error");
|
|
66
|
-
}
|
|
67
|
-
if (resp?.status === 503) {
|
|
68
|
-
onLostConnection();
|
|
69
|
-
}
|
|
70
|
-
else {
|
|
71
|
-
setIsActive(false);
|
|
72
|
-
}
|
|
73
|
-
setChannelBusy(false);
|
|
74
|
-
},
|
|
75
|
-
}).catch((e) => {
|
|
76
|
-
if (e?.status === 401) {
|
|
77
|
-
onUnauthorized();
|
|
78
|
-
}
|
|
79
|
-
console.log(e);
|
|
80
|
-
setChannelBusy(false);
|
|
81
|
-
});
|
|
25
|
+
const defaultFetcher = async ([url, dagId, dagRunId, poolingByUser]) => {
|
|
26
|
+
const requestUrl = new URL("http://foo/" + url);
|
|
27
|
+
requestUrl.searchParams.append("dag_id", dagId);
|
|
28
|
+
if (dagRunId)
|
|
29
|
+
requestUrl.searchParams.append("dag_run_id", dagRunId);
|
|
30
|
+
requestUrl.searchParams.append("by_user", String(poolingByUser));
|
|
31
|
+
const resultUrl = requestUrl.pathname.substring(1) + requestUrl.search;
|
|
32
|
+
const res = await fetch(resultUrl, { signal: AbortSignal.timeout(10000) });
|
|
33
|
+
if (res.status === 401) {
|
|
34
|
+
onUnauthorized();
|
|
35
|
+
}
|
|
36
|
+
if (!res.ok) {
|
|
37
|
+
throw { ...(await res.json()), status: res.status };
|
|
38
|
+
}
|
|
39
|
+
return res.json();
|
|
82
40
|
};
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
41
|
+
const [shouldRevalidate, setShouldRevalidate] = useState(true);
|
|
42
|
+
const activate = useCallback(() => {
|
|
43
|
+
setShouldRevalidate(true);
|
|
44
|
+
}, []);
|
|
45
|
+
const { data, error, mutate } = useSWR(airflowAvailable &&
|
|
46
|
+
dagId && [
|
|
47
|
+
"airflow/dag_run",
|
|
48
|
+
dagId,
|
|
49
|
+
dagRunId ?? null,
|
|
50
|
+
Boolean(poolingByUser),
|
|
51
|
+
], defaultFetcher, {
|
|
52
|
+
refreshInterval: shouldRevalidate ? 1000 : 0,
|
|
53
|
+
onError: (err) => {
|
|
54
|
+
if (err?.status !== 404) {
|
|
55
|
+
enqueueSnackbar(`Ошибка при обновлении состояния задачи${(dagId && " ") || ""}${dagId || ""}!`, "error");
|
|
56
|
+
}
|
|
57
|
+
if (err?.status === 503) {
|
|
58
|
+
onLostConnection();
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
setShouldRevalidate(false);
|
|
62
|
+
}
|
|
63
|
+
},
|
|
64
|
+
keepPreviousData: true,
|
|
65
|
+
});
|
|
66
|
+
const dagRun = data?.dagRun ?? null;
|
|
67
|
+
const taskInstances = data?.taskInstances ?? null;
|
|
68
|
+
const updDagRunIdId = useEffectEvent((newDagRunId) => {
|
|
69
|
+
if (dagRunId !== newDagRunId) {
|
|
70
|
+
setDagRunId(newDagRunId);
|
|
71
|
+
}
|
|
72
|
+
});
|
|
73
|
+
// Обновлять идентификатор запуска при изменении
|
|
103
74
|
useEffect(() => {
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
if (autorunHandler)
|
|
75
|
+
updDagRunIdId(dagRun?.dagRunId ?? null);
|
|
76
|
+
console.log("effect 1");
|
|
77
|
+
}, [dagRun?.dagRunId ?? null]);
|
|
78
|
+
const autorunAction = useEffectEvent((dagRun) => {
|
|
79
|
+
if (autorunHandler) {
|
|
109
80
|
autorunHandler(dagRun, autorun);
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
// Если задача всё ещё выполняется, то есть смысл в ревалидации
|
|
84
|
+
useEffect(() => {
|
|
85
|
+
if (dagRun) {
|
|
86
|
+
setShouldRevalidate(["queued", "running"].includes(dagRun.state));
|
|
87
|
+
}
|
|
88
|
+
// Запуск действия при success
|
|
89
|
+
if (dagRun?.state === "success") {
|
|
90
|
+
autorunAction(dagRun);
|
|
91
|
+
}
|
|
92
|
+
console.log("effect 2");
|
|
93
|
+
}, [dagRun?.state]);
|
|
94
|
+
const onUpdateState = (isActive, newDagRun, _taskInstances) => {
|
|
95
|
+
setShouldRevalidate(isActive);
|
|
96
|
+
setDagRunId(newDagRun?.dagRunId);
|
|
114
97
|
if (newDagRun == null)
|
|
115
|
-
|
|
116
|
-
setTaskInstances(taskInstances);
|
|
98
|
+
mutate();
|
|
117
99
|
};
|
|
118
100
|
/**Вызывать сразу после запуска дага*/
|
|
119
101
|
const onDagStarted = () => {
|
|
120
|
-
setIsActive(true);
|
|
121
|
-
|
|
122
|
-
setTaskInstances(null);
|
|
102
|
+
// setIsActive(true);
|
|
103
|
+
setDagRunId(null);
|
|
104
|
+
// setTaskInstances(null);
|
|
105
|
+
setShouldRevalidate(true);
|
|
123
106
|
setDagStartedOnce(true);
|
|
124
107
|
};
|
|
108
|
+
const updateState = () => mutate();
|
|
125
109
|
return (_jsx(DagRunStateContext.Provider, { value: {
|
|
126
|
-
isActive,
|
|
110
|
+
isActive: shouldRevalidate,
|
|
127
111
|
autorun,
|
|
128
112
|
dagRun,
|
|
129
113
|
taskInstances,
|
|
@@ -131,6 +115,7 @@ const DagRunStateProvider = ({ children, dagRun: _dagRun, autorun: _autorun, poo
|
|
|
131
115
|
onUpdateState,
|
|
132
116
|
onDagStarted,
|
|
133
117
|
activate,
|
|
118
|
+
error: Boolean(error),
|
|
134
119
|
fetchState: updateState,
|
|
135
120
|
setAutorun: (autorun) => setAutorun(autorun),
|
|
136
121
|
}, children: children }));
|
package/dist/utils.d.ts
CHANGED
|
@@ -5,7 +5,7 @@ import { DagState, TaskState } from "./types";
|
|
|
5
5
|
export declare function getCSRFToken(): string;
|
|
6
6
|
export declare function setCSRFToken(newToken: string): void;
|
|
7
7
|
export declare function prettyDatetime(datetime?: string | null): string;
|
|
8
|
-
export declare const taskStateText: (taskState: DagState | TaskState | string | null | undefined) => "Завершена" | "Ошибка" | "В очереди" | "Выполняется" | "Нет состояния";
|
|
8
|
+
export declare const taskStateText: (taskState: DagState | TaskState | string | null | undefined) => "Завершена" | "Ошибка" | "В очереди" | "Выполняется" | "Недоступно" | "Нет состояния";
|
|
9
9
|
export declare const formatDate: (date: string) => string;
|
|
10
10
|
export declare const formatDuration: (duration: number) => string;
|
|
11
11
|
export declare const getSlugTableName: (name: string) => string;
|
package/dist/utils.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,wBAAwB,CAAC;AAEhC,OAAO,kBAAkB,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,YAAY,WAI3B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,QAI5C;AAED,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,UAMtD;AAED,eAAO,MAAM,aAAa,GACxB,WAAW,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C,OAAO,wBAAwB,CAAC;AAEhC,OAAO,kBAAkB,CAAC;AAG1B,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAE9C,wBAAgB,YAAY,WAI3B;AAED,wBAAgB,YAAY,CAAC,QAAQ,EAAE,MAAM,QAI5C;AAED,wBAAgB,cAAc,CAAC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,UAMtD;AAED,eAAO,MAAM,aAAa,GACxB,WAAW,QAAQ,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,0FAgB5D,CAAC;AAEF,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,WAWtC,CAAC;AAEF,eAAO,MAAM,cAAc,GAAI,UAAU,MAAM,WAK9C,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,MAAM,MAAM,WAyC5C,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,UAAU,MAAM,EAAE,OAAO,MAAM,WAkB9D,CAAC;AAEF,eAAO,MAAM,aAAa,GACxB,aAAa,MAAM,EACnB,WAAW,MAAM,EACjB,QAAQ,MAAM,EACd,QAAQ,MAAM,EACd,UAAU,OAAO,EACjB,aAAa,MAAM,WAWpB,CAAC;AAEF,eAAO,MAAM,gBAAgB,GAAI,aAAa,MAAM,EAAE,WAAW,MAAM,WACR,CAAC;AAEhE,wBAAgB,WAAW,CAAC,IAAI,SAAS,OAAO,EAAE,EAChD,QAAQ,EAAE,CAAC,GAAG,IAAI,EAAE,IAAI,KAAK,IAAI,EACjC,KAAK,EAAE,MAAM,aAKD,IAAI,UAUjB;AAED,eAAO,MAAM,yBAAyB,GACpC,UAAU,WAAW,EACrB,eAAe,MAAM,KAOhB,aACN,CAAC;AAEF,eAAO,MAAM,4BAA4B,GACvC,UAAU,WAAW,EACrB,eAAe,MAAM,KAOhB,aACN,CAAC;AAEF,eAAO,MAAM,SAAS,GAAI,OAAO,MAAM,KAAG,MAMzC,CAAC;AAEF,eAAO,MAAM,UAAU,GACrB,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,OAAO,MAAM,KACZ,MAMF,CAAC;AACF,eAAO,MAAM,UAAU,GAAI,SAAS,MAAM,EAAE,OAAO,MAAM,KAAG,MAM3D,CAAC;AACF,eAAO,MAAM,WAAW,GACtB,SAAS,MAAM,EACf,UAAU,MAAM,EAChB,QAAQ,MAAM,EACd,OAAO,MAAM,KACZ,MAMF,CAAC;AACF,eAAO,MAAM,aAAa,GAAI,OAAO,MAAM,KAAG,MAM7C,CAAC;AACF,eAAO,MAAM,aAAa,GACxB,KAAK,MAAM,EAEX,KAAK,GAAG,EACR,QAAQ,OAAO,KACd,MAKF,CAAC;AACF,eAAO,MAAM,WAAW,GAAI,YAAY,MAAM,KAAG,MAKhD,CAAC;AACF,eAAO,MAAM,WAAW,GAAI,OAAO,MAAM,KAAG,MAK3C,CAAC"}
|
package/dist/utils.js
CHANGED