@webiny/background-tasks 0.0.0-unstable.7be00a75a9
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/LICENSE +21 -0
- package/README.md +11 -0
- package/admin/BackgroundTaskRoutes.d.ts +2 -0
- package/admin/BackgroundTaskRoutes.js +50 -0
- package/admin/BackgroundTaskRoutes.js.map +1 -0
- package/admin/BackgroundTasks.d.ts +2 -0
- package/admin/BackgroundTasks.js +46 -0
- package/admin/BackgroundTasks.js.map +1 -0
- package/admin/features/abortTask/AbortTaskGateway.d.ts +12 -0
- package/admin/features/abortTask/AbortTaskGateway.js +62 -0
- package/admin/features/abortTask/AbortTaskGateway.js.map +1 -0
- package/admin/features/abortTask/AbortTaskUseCase.d.ts +11 -0
- package/admin/features/abortTask/AbortTaskUseCase.js +18 -0
- package/admin/features/abortTask/AbortTaskUseCase.js.map +1 -0
- package/admin/features/abortTask/abstractions.d.ts +19 -0
- package/admin/features/abortTask/abstractions.js +6 -0
- package/admin/features/abortTask/abstractions.js.map +1 -0
- package/admin/features/abortTask/feature.d.ts +3 -0
- package/admin/features/abortTask/feature.js +19 -0
- package/admin/features/abortTask/feature.js.map +1 -0
- package/admin/features/abortTask/index.d.ts +2 -0
- package/admin/features/abortTask/index.js +2 -0
- package/admin/features/deleteTask/DeleteTaskGateway.d.ts +11 -0
- package/admin/features/deleteTask/DeleteTaskGateway.js +41 -0
- package/admin/features/deleteTask/DeleteTaskGateway.js.map +1 -0
- package/admin/features/deleteTask/DeleteTaskUseCase.d.ts +10 -0
- package/admin/features/deleteTask/DeleteTaskUseCase.js +18 -0
- package/admin/features/deleteTask/DeleteTaskUseCase.js.map +1 -0
- package/admin/features/deleteTask/abstractions.d.ts +14 -0
- package/admin/features/deleteTask/abstractions.js +6 -0
- package/admin/features/deleteTask/abstractions.js.map +1 -0
- package/admin/features/deleteTask/feature.d.ts +3 -0
- package/admin/features/deleteTask/feature.js +19 -0
- package/admin/features/deleteTask/feature.js.map +1 -0
- package/admin/features/deleteTask/index.d.ts +2 -0
- package/admin/features/deleteTask/index.js +2 -0
- package/admin/features/getTask/GetTaskGateway.d.ts +12 -0
- package/admin/features/getTask/GetTaskGateway.js +61 -0
- package/admin/features/getTask/GetTaskGateway.js.map +1 -0
- package/admin/features/getTask/GetTaskUseCase.d.ts +11 -0
- package/admin/features/getTask/GetTaskUseCase.js +18 -0
- package/admin/features/getTask/GetTaskUseCase.js.map +1 -0
- package/admin/features/getTask/abstractions.d.ts +15 -0
- package/admin/features/getTask/abstractions.js +6 -0
- package/admin/features/getTask/abstractions.js.map +1 -0
- package/admin/features/getTask/feature.d.ts +3 -0
- package/admin/features/getTask/feature.js +19 -0
- package/admin/features/getTask/feature.js.map +1 -0
- package/admin/features/getTask/index.d.ts +2 -0
- package/admin/features/getTask/index.js +2 -0
- package/admin/features/listDefinitions/ListDefinitionsGateway.d.ts +12 -0
- package/admin/features/listDefinitions/ListDefinitionsGateway.js +42 -0
- package/admin/features/listDefinitions/ListDefinitionsGateway.js.map +1 -0
- package/admin/features/listDefinitions/ListDefinitionsUseCase.d.ts +11 -0
- package/admin/features/listDefinitions/ListDefinitionsUseCase.js +18 -0
- package/admin/features/listDefinitions/ListDefinitionsUseCase.js.map +1 -0
- package/admin/features/listDefinitions/abstractions.d.ts +15 -0
- package/admin/features/listDefinitions/abstractions.js +6 -0
- package/admin/features/listDefinitions/abstractions.js.map +1 -0
- package/admin/features/listDefinitions/feature.d.ts +3 -0
- package/admin/features/listDefinitions/feature.js +19 -0
- package/admin/features/listDefinitions/feature.js.map +1 -0
- package/admin/features/listDefinitions/index.d.ts +2 -0
- package/admin/features/listDefinitions/index.js +2 -0
- package/admin/features/listLogs/ListLogsGateway.d.ts +11 -0
- package/admin/features/listLogs/ListLogsGateway.js +73 -0
- package/admin/features/listLogs/ListLogsGateway.js.map +1 -0
- package/admin/features/listLogs/ListLogsUseCase.d.ts +10 -0
- package/admin/features/listLogs/ListLogsUseCase.js +18 -0
- package/admin/features/listLogs/ListLogsUseCase.js.map +1 -0
- package/admin/features/listLogs/abstractions.d.ts +30 -0
- package/admin/features/listLogs/abstractions.js +6 -0
- package/admin/features/listLogs/abstractions.js.map +1 -0
- package/admin/features/listLogs/feature.d.ts +3 -0
- package/admin/features/listLogs/feature.js +19 -0
- package/admin/features/listLogs/feature.js.map +1 -0
- package/admin/features/listLogs/index.d.ts +2 -0
- package/admin/features/listLogs/index.js +2 -0
- package/admin/features/listTasks/ListTasksGateway.d.ts +11 -0
- package/admin/features/listTasks/ListTasksGateway.js +79 -0
- package/admin/features/listTasks/ListTasksGateway.js.map +1 -0
- package/admin/features/listTasks/ListTasksUseCase.d.ts +10 -0
- package/admin/features/listTasks/ListTasksUseCase.js +18 -0
- package/admin/features/listTasks/ListTasksUseCase.js.map +1 -0
- package/admin/features/listTasks/abstractions.d.ts +31 -0
- package/admin/features/listTasks/abstractions.js +6 -0
- package/admin/features/listTasks/abstractions.js.map +1 -0
- package/admin/features/listTasks/feature.d.ts +3 -0
- package/admin/features/listTasks/feature.js +19 -0
- package/admin/features/listTasks/feature.js.map +1 -0
- package/admin/features/listTasks/index.d.ts +2 -0
- package/admin/features/listTasks/index.js +2 -0
- package/admin/features/permissions/abstractions.d.ts +17 -0
- package/admin/features/permissions/abstractions.js +6 -0
- package/admin/features/permissions/abstractions.js.map +1 -0
- package/admin/features/permissions/feature.d.ts +14 -0
- package/admin/features/permissions/feature.js +7 -0
- package/admin/features/permissions/feature.js.map +1 -0
- package/admin/features/permissions/index.d.ts +2 -0
- package/admin/features/permissions/index.js +2 -0
- package/admin/index.d.ts +2 -0
- package/admin/index.js +2 -0
- package/admin/permissions.d.ts +12 -0
- package/admin/permissions.js +22 -0
- package/admin/permissions.js.map +1 -0
- package/admin/presentation/TaskDefinitions/TaskDefinitionsPresenter.d.ts +14 -0
- package/admin/presentation/TaskDefinitions/TaskDefinitionsPresenter.js +41 -0
- package/admin/presentation/TaskDefinitions/TaskDefinitionsPresenter.js.map +1 -0
- package/admin/presentation/TaskDefinitions/abstractions.d.ts +14 -0
- package/admin/presentation/TaskDefinitions/abstractions.js +5 -0
- package/admin/presentation/TaskDefinitions/abstractions.js.map +1 -0
- package/admin/presentation/TaskDefinitions/components/TaskDefinitionsView.d.ts +2 -0
- package/admin/presentation/TaskDefinitions/components/TaskDefinitionsView.js +75 -0
- package/admin/presentation/TaskDefinitions/components/TaskDefinitionsView.js.map +1 -0
- package/admin/presentation/TaskDefinitions/feature.d.ts +3 -0
- package/admin/presentation/TaskDefinitions/feature.js +17 -0
- package/admin/presentation/TaskDefinitions/feature.js.map +1 -0
- package/admin/presentation/TaskDefinitions/index.d.ts +2 -0
- package/admin/presentation/TaskDefinitions/index.js +2 -0
- package/admin/presentation/TaskDetail/TaskDetailPresenter.d.ts +24 -0
- package/admin/presentation/TaskDetail/TaskDetailPresenter.js +87 -0
- package/admin/presentation/TaskDetail/TaskDetailPresenter.js.map +1 -0
- package/admin/presentation/TaskDetail/abstractions.d.ts +24 -0
- package/admin/presentation/TaskDetail/abstractions.js +5 -0
- package/admin/presentation/TaskDetail/abstractions.js.map +1 -0
- package/admin/presentation/TaskDetail/components/TaskDetailDrawer.d.ts +11 -0
- package/admin/presentation/TaskDetail/components/TaskDetailDrawer.js +264 -0
- package/admin/presentation/TaskDetail/components/TaskDetailDrawer.js.map +1 -0
- package/admin/presentation/TaskDetail/feature.d.ts +3 -0
- package/admin/presentation/TaskDetail/feature.js +17 -0
- package/admin/presentation/TaskDetail/feature.js.map +1 -0
- package/admin/presentation/TaskDetail/index.d.ts +2 -0
- package/admin/presentation/TaskDetail/index.js +2 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.d.ts +15 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js +91 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js.map +1 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.d.ts +52 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.js +107 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.js.map +1 -0
- package/admin/presentation/TaskExecutions/abstractions.d.ts +28 -0
- package/admin/presentation/TaskExecutions/abstractions.js +5 -0
- package/admin/presentation/TaskExecutions/abstractions.js.map +1 -0
- package/admin/presentation/TaskExecutions/components/TaskExecutionsView.d.ts +2 -0
- package/admin/presentation/TaskExecutions/components/TaskExecutionsView.js +303 -0
- package/admin/presentation/TaskExecutions/components/TaskExecutionsView.js.map +1 -0
- package/admin/presentation/TaskExecutions/feature.d.ts +3 -0
- package/admin/presentation/TaskExecutions/feature.js +17 -0
- package/admin/presentation/TaskExecutions/feature.js.map +1 -0
- package/admin/presentation/TaskExecutions/index.d.ts +2 -0
- package/admin/presentation/TaskExecutions/index.js +2 -0
- package/admin/presentation/security/HasPermission.d.ts +12 -0
- package/admin/presentation/security/HasPermission.js +6 -0
- package/admin/presentation/security/HasPermission.js.map +1 -0
- package/admin/presentation/security/usePermissions.d.ts +12 -0
- package/admin/presentation/security/usePermissions.js +6 -0
- package/admin/presentation/security/usePermissions.js.map +1 -0
- package/admin/routes.d.ts +5 -0
- package/admin/routes.js +14 -0
- package/admin/routes.js.map +1 -0
- package/admin/shared/types.d.ts +15 -0
- package/admin/shared/types.js +0 -0
- package/api/index.d.ts +0 -0
- package/api/index.js +0 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1,264 @@
|
|
|
1
|
+
import react, { useEffect, useMemo, useState } from "react";
|
|
2
|
+
import { observer } from "mobx-react-lite";
|
|
3
|
+
import { DiContainerProvider, useContainer, useFeature } from "@webiny/app";
|
|
4
|
+
import { Button, CodeEditor, Drawer, Grid, Heading, Separator, Tag, Text, TimeAgo } from "@webiny/admin-ui";
|
|
5
|
+
import { useConfirmationDialog } from "@webiny/app-admin/hooks/index.js";
|
|
6
|
+
import { ReactComponent } from "@webiny/icons/stop_circle.svg";
|
|
7
|
+
import { ReactComponent as delete_svg_ReactComponent } from "@webiny/icons/delete.svg";
|
|
8
|
+
import { ReactComponent as expand_more_svg_ReactComponent } from "@webiny/icons/expand_more.svg";
|
|
9
|
+
import { ReactComponent as expand_less_svg_ReactComponent } from "@webiny/icons/expand_less.svg";
|
|
10
|
+
import { TaskDetailPresenterFeature } from "../feature.js";
|
|
11
|
+
import { GetTaskFeature } from "../../../features/getTask/feature.js";
|
|
12
|
+
import { ListLogsFeature } from "../../../features/listLogs/feature.js";
|
|
13
|
+
const STATUS_TAG_VARIANT = {
|
|
14
|
+
pending: "neutral-light",
|
|
15
|
+
running: "accent",
|
|
16
|
+
success: "success",
|
|
17
|
+
failed: "destructive",
|
|
18
|
+
aborted: "warning"
|
|
19
|
+
};
|
|
20
|
+
const formatJson = (value)=>{
|
|
21
|
+
if (null == value) return "";
|
|
22
|
+
if ("string" == typeof value) try {
|
|
23
|
+
return JSON.stringify(JSON.parse(value), null, 2);
|
|
24
|
+
} catch {
|
|
25
|
+
return value;
|
|
26
|
+
}
|
|
27
|
+
return JSON.stringify(value, null, 2);
|
|
28
|
+
};
|
|
29
|
+
const ExpandButton = ({ show, expanded, onClick })=>{
|
|
30
|
+
if (!show) return null;
|
|
31
|
+
return /*#__PURE__*/ react.createElement(Button, {
|
|
32
|
+
variant: "tertiary",
|
|
33
|
+
size: "sm",
|
|
34
|
+
icon: expanded ? /*#__PURE__*/ react.createElement(expand_less_svg_ReactComponent, null) : /*#__PURE__*/ react.createElement(expand_more_svg_ReactComponent, null),
|
|
35
|
+
onClick: onClick
|
|
36
|
+
});
|
|
37
|
+
};
|
|
38
|
+
const ExpandedPayload = ({ show, label, value, variant = "default" })=>{
|
|
39
|
+
if (!show) return null;
|
|
40
|
+
const textClass = "destructive" === variant ? " text-destructive" : "";
|
|
41
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
42
|
+
className: "mt-xs"
|
|
43
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
44
|
+
size: "sm",
|
|
45
|
+
className: "text-neutral-strong mb-xs"
|
|
46
|
+
}, label), /*#__PURE__*/ react.createElement("pre", {
|
|
47
|
+
className: `bg-neutral-light rounded-sm p-sm text-xs overflow-auto max-h-[200px]${textClass}`
|
|
48
|
+
}, formatJson(value)));
|
|
49
|
+
};
|
|
50
|
+
const JsonSection = ({ show, title, value })=>{
|
|
51
|
+
if (!show) return null;
|
|
52
|
+
return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Separator, null), /*#__PURE__*/ react.createElement("div", null, /*#__PURE__*/ react.createElement(Heading, {
|
|
53
|
+
level: 6,
|
|
54
|
+
className: "mb-sm"
|
|
55
|
+
}, title), /*#__PURE__*/ react.createElement(CodeEditor, {
|
|
56
|
+
value: value,
|
|
57
|
+
language: "json",
|
|
58
|
+
disabled: true
|
|
59
|
+
})));
|
|
60
|
+
};
|
|
61
|
+
const LoadMoreLogsButton = ({ show, loading, onClick })=>{
|
|
62
|
+
if (!show) return null;
|
|
63
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
64
|
+
className: "mt-sm"
|
|
65
|
+
}, /*#__PURE__*/ react.createElement(Button, {
|
|
66
|
+
variant: "tertiary",
|
|
67
|
+
size: "sm",
|
|
68
|
+
onClick: onClick,
|
|
69
|
+
disabled: loading
|
|
70
|
+
}, loading ? "Loading..." : "Load more logs"));
|
|
71
|
+
};
|
|
72
|
+
const DrawerActions = ({ isRunning, isTerminal, onAbort, onDelete })=>{
|
|
73
|
+
if (!isRunning && !isTerminal) return null;
|
|
74
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
75
|
+
className: "flex gap-sm"
|
|
76
|
+
}, isRunning ? /*#__PURE__*/ react.createElement(Button, {
|
|
77
|
+
variant: "secondary",
|
|
78
|
+
size: "sm",
|
|
79
|
+
icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
|
|
80
|
+
onClick: onAbort
|
|
81
|
+
}, "Abort") : null, isTerminal ? /*#__PURE__*/ react.createElement(Button, {
|
|
82
|
+
variant: "secondary",
|
|
83
|
+
size: "sm",
|
|
84
|
+
icon: /*#__PURE__*/ react.createElement(delete_svg_ReactComponent, null),
|
|
85
|
+
onClick: onDelete
|
|
86
|
+
}, "Delete") : null);
|
|
87
|
+
};
|
|
88
|
+
const LogItemView = ({ item })=>{
|
|
89
|
+
const [expanded, setExpanded] = useState(false);
|
|
90
|
+
const hasData = null !== item.data && void 0 !== item.data;
|
|
91
|
+
const hasError = null !== item.error && void 0 !== item.error;
|
|
92
|
+
const expandable = hasData || hasError;
|
|
93
|
+
return /*#__PURE__*/ react.createElement("div", {
|
|
94
|
+
className: "border-b-sm border-neutral-muted py-xs px-sm"
|
|
95
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
96
|
+
className: "flex items-start gap-sm"
|
|
97
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
98
|
+
className: "flex-shrink-0 pt-[2px]"
|
|
99
|
+
}, /*#__PURE__*/ react.createElement(Tag, {
|
|
100
|
+
variant: "error" === item.type ? "destructive" : "neutral-light",
|
|
101
|
+
content: item.type
|
|
102
|
+
})), /*#__PURE__*/ react.createElement("div", {
|
|
103
|
+
className: "flex-1 min-w-0"
|
|
104
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
105
|
+
size: "sm"
|
|
106
|
+
}, item.message)), /*#__PURE__*/ react.createElement("div", {
|
|
107
|
+
className: "flex items-center gap-xs flex-shrink-0"
|
|
108
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
109
|
+
size: "sm",
|
|
110
|
+
className: "text-neutral-strong"
|
|
111
|
+
}, /*#__PURE__*/ react.createElement(TimeAgo, {
|
|
112
|
+
datetime: item.createdOn
|
|
113
|
+
})), /*#__PURE__*/ react.createElement(ExpandButton, {
|
|
114
|
+
show: expandable,
|
|
115
|
+
expanded: expanded,
|
|
116
|
+
onClick: ()=>setExpanded(!expanded)
|
|
117
|
+
}))), /*#__PURE__*/ react.createElement(ExpandedPayload, {
|
|
118
|
+
show: expanded && hasData,
|
|
119
|
+
label: "Data",
|
|
120
|
+
value: item.data
|
|
121
|
+
}), /*#__PURE__*/ react.createElement(ExpandedPayload, {
|
|
122
|
+
show: expanded && hasError,
|
|
123
|
+
label: "Error",
|
|
124
|
+
value: item.error,
|
|
125
|
+
variant: "destructive"
|
|
126
|
+
}));
|
|
127
|
+
};
|
|
128
|
+
const TaskDetailDrawer_TaskDetailDrawerInner = observer(function({ task, open, onClose, onAbort, onDelete }) {
|
|
129
|
+
const { presenter } = useFeature(TaskDetailPresenterFeature);
|
|
130
|
+
useEffect(()=>{
|
|
131
|
+
if (open) presenter.init(task.id);
|
|
132
|
+
}, [
|
|
133
|
+
presenter,
|
|
134
|
+
task.id,
|
|
135
|
+
open
|
|
136
|
+
]);
|
|
137
|
+
const { vm } = presenter;
|
|
138
|
+
const { showConfirmation: showAbortConfirmation } = useConfirmationDialog({
|
|
139
|
+
title: "Abort Task",
|
|
140
|
+
message: "Are you sure you want to abort this running task?"
|
|
141
|
+
});
|
|
142
|
+
const { showConfirmation: showDeleteConfirmation } = useConfirmationDialog({
|
|
143
|
+
title: "Delete Task",
|
|
144
|
+
message: "Are you sure you want to delete this task?"
|
|
145
|
+
});
|
|
146
|
+
const displayTask = vm.task ?? task;
|
|
147
|
+
const isRunning = "running" === displayTask.taskStatus;
|
|
148
|
+
const isTerminal = "success" === displayTask.taskStatus || "failed" === displayTask.taskStatus || "aborted" === displayTask.taskStatus;
|
|
149
|
+
const inputJson = formatJson(displayTask.input);
|
|
150
|
+
const outputJson = formatJson(displayTask.output);
|
|
151
|
+
return /*#__PURE__*/ react.createElement(Drawer, {
|
|
152
|
+
open: open,
|
|
153
|
+
onOpenChange: (isOpen)=>!isOpen && onClose(),
|
|
154
|
+
title: /*#__PURE__*/ react.createElement("div", {
|
|
155
|
+
className: "flex items-center gap-sm"
|
|
156
|
+
}, /*#__PURE__*/ react.createElement("span", null, displayTask.name || displayTask.definitionId), /*#__PURE__*/ react.createElement(Tag, {
|
|
157
|
+
variant: STATUS_TAG_VARIANT[displayTask.taskStatus] ?? "neutral-light",
|
|
158
|
+
content: displayTask.taskStatus
|
|
159
|
+
})),
|
|
160
|
+
modal: true,
|
|
161
|
+
width: "900px",
|
|
162
|
+
bodyPadding: false,
|
|
163
|
+
actions: /*#__PURE__*/ react.createElement(DrawerActions, {
|
|
164
|
+
isRunning: isRunning,
|
|
165
|
+
isTerminal: isTerminal,
|
|
166
|
+
onAbort: ()=>showAbortConfirmation(()=>onAbort(displayTask.id)),
|
|
167
|
+
onDelete: ()=>showDeleteConfirmation(()=>onDelete(displayTask.id))
|
|
168
|
+
})
|
|
169
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
170
|
+
className: "flex flex-col gap-md p-md overflow-auto"
|
|
171
|
+
}, /*#__PURE__*/ react.createElement("div", null, /*#__PURE__*/ react.createElement(Heading, {
|
|
172
|
+
level: 6,
|
|
173
|
+
className: "mb-sm"
|
|
174
|
+
}, "General Info"), /*#__PURE__*/ react.createElement(Grid, {
|
|
175
|
+
gap: "comfortable"
|
|
176
|
+
}, /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
177
|
+
span: 6
|
|
178
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
179
|
+
size: "sm",
|
|
180
|
+
className: "text-neutral-strong"
|
|
181
|
+
}, "Definition"), /*#__PURE__*/ react.createElement(Text, {
|
|
182
|
+
size: "sm"
|
|
183
|
+
}, displayTask.definitionId)), /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
184
|
+
span: 6
|
|
185
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
186
|
+
size: "sm",
|
|
187
|
+
className: "text-neutral-strong"
|
|
188
|
+
}, "Created By"), /*#__PURE__*/ react.createElement(Text, {
|
|
189
|
+
size: "sm"
|
|
190
|
+
}, displayTask.createdBy?.displayName ?? "—")), /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
191
|
+
span: 6
|
|
192
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
193
|
+
size: "sm",
|
|
194
|
+
className: "text-neutral-strong"
|
|
195
|
+
}, "Created On"), /*#__PURE__*/ react.createElement(Text, {
|
|
196
|
+
size: "sm"
|
|
197
|
+
}, displayTask.createdOn ? /*#__PURE__*/ react.createElement(TimeAgo, {
|
|
198
|
+
datetime: displayTask.createdOn
|
|
199
|
+
}) : "—")), /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
200
|
+
span: 6
|
|
201
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
202
|
+
size: "sm",
|
|
203
|
+
className: "text-neutral-strong"
|
|
204
|
+
}, "Started On"), /*#__PURE__*/ react.createElement(Text, {
|
|
205
|
+
size: "sm"
|
|
206
|
+
}, displayTask.startedOn ? /*#__PURE__*/ react.createElement(TimeAgo, {
|
|
207
|
+
datetime: displayTask.startedOn
|
|
208
|
+
}) : "—")), /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
209
|
+
span: 6
|
|
210
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
211
|
+
size: "sm",
|
|
212
|
+
className: "text-neutral-strong"
|
|
213
|
+
}, "Finished On"), /*#__PURE__*/ react.createElement(Text, {
|
|
214
|
+
size: "sm"
|
|
215
|
+
}, displayTask.finishedOn ? /*#__PURE__*/ react.createElement(TimeAgo, {
|
|
216
|
+
datetime: displayTask.finishedOn
|
|
217
|
+
}) : "—")), /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
218
|
+
span: 6
|
|
219
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
220
|
+
size: "sm",
|
|
221
|
+
className: "text-neutral-strong"
|
|
222
|
+
}, "Iterations"), /*#__PURE__*/ react.createElement(Text, {
|
|
223
|
+
size: "sm"
|
|
224
|
+
}, displayTask.iterations ?? 0)))), /*#__PURE__*/ react.createElement(JsonSection, {
|
|
225
|
+
show: !!inputJson,
|
|
226
|
+
title: "Input",
|
|
227
|
+
value: inputJson
|
|
228
|
+
}), /*#__PURE__*/ react.createElement(JsonSection, {
|
|
229
|
+
show: !!outputJson,
|
|
230
|
+
title: "Output",
|
|
231
|
+
value: outputJson
|
|
232
|
+
}), /*#__PURE__*/ react.createElement(Separator, null), /*#__PURE__*/ react.createElement("div", null, /*#__PURE__*/ react.createElement(Heading, {
|
|
233
|
+
level: 6,
|
|
234
|
+
className: "mb-sm"
|
|
235
|
+
}, "Logs (", vm.logs.pagination.totalCount, ")"), 0 !== vm.logs.rows.length || vm.logs.pagination.loading ? /*#__PURE__*/ react.createElement("div", {
|
|
236
|
+
className: "border-sm border-neutral-muted rounded-sm"
|
|
237
|
+
}, vm.logs.rows.map((log)=>log.items.map((item, idx)=>/*#__PURE__*/ react.createElement(LogItemView, {
|
|
238
|
+
key: `${log.id}-${idx}`,
|
|
239
|
+
item: item
|
|
240
|
+
})))) : /*#__PURE__*/ react.createElement(Text, {
|
|
241
|
+
size: "sm",
|
|
242
|
+
className: "text-neutral-strong"
|
|
243
|
+
}, "No logs available."), /*#__PURE__*/ react.createElement(LoadMoreLogsButton, {
|
|
244
|
+
show: vm.logs.pagination.hasMore,
|
|
245
|
+
loading: vm.logs.pagination.loading,
|
|
246
|
+
onClick: ()=>presenter.loadMore()
|
|
247
|
+
}))));
|
|
248
|
+
});
|
|
249
|
+
const TaskDetailDrawer = (props)=>{
|
|
250
|
+
const container = useContainer();
|
|
251
|
+
const scopedContainer = useMemo(()=>{
|
|
252
|
+
const child = container.createChildContainer();
|
|
253
|
+
GetTaskFeature.register(child);
|
|
254
|
+
ListLogsFeature.register(child);
|
|
255
|
+
TaskDetailPresenterFeature.register(child);
|
|
256
|
+
return child;
|
|
257
|
+
}, []);
|
|
258
|
+
return /*#__PURE__*/ react.createElement(DiContainerProvider, {
|
|
259
|
+
container: scopedContainer
|
|
260
|
+
}, /*#__PURE__*/ react.createElement(TaskDetailDrawer_TaskDetailDrawerInner, props));
|
|
261
|
+
};
|
|
262
|
+
export { TaskDetailDrawer };
|
|
263
|
+
|
|
264
|
+
//# sourceMappingURL=TaskDetailDrawer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/presentation/TaskDetail/components/TaskDetailDrawer.js","sources":["../../../../../src/admin/presentation/TaskDetail/components/TaskDetailDrawer.tsx"],"sourcesContent":["import React, { useEffect, useMemo, useState } from \"react\";\nimport { observer } from \"mobx-react-lite\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport { Button, Drawer, Grid, Heading, Separator, Tag, Text, TimeAgo } from \"@webiny/admin-ui\";\nimport { CodeEditor } from \"@webiny/admin-ui\";\nimport { useConfirmationDialog } from \"@webiny/app-admin/hooks/index.js\";\nimport { ReactComponent as StopCircleIcon } from \"@webiny/icons/stop_circle.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport { ReactComponent as ExpandMoreIcon } from \"@webiny/icons/expand_more.svg\";\nimport { ReactComponent as ExpandLessIcon } from \"@webiny/icons/expand_less.svg\";\nimport { TaskDetailPresenterFeature } from \"../feature.js\";\nimport { GetTaskFeature } from \"~/admin/features/getTask/feature.js\";\nimport { ListLogsFeature } from \"~/admin/features/listLogs/feature.js\";\nimport type { Task, TaskLog, TaskLogItem } from \"~/admin/shared/types.js\";\n\nconst STATUS_TAG_VARIANT: Record<\n string,\n \"neutral-light\" | \"accent\" | \"success\" | \"destructive\" | \"warning\"\n> = {\n pending: \"neutral-light\",\n running: \"accent\",\n success: \"success\",\n failed: \"destructive\",\n aborted: \"warning\"\n};\n\nconst formatJson = (value: unknown): string => {\n if (value === null || value === undefined) {\n return \"\";\n }\n if (typeof value === \"string\") {\n try {\n return JSON.stringify(JSON.parse(value), null, 2);\n } catch {\n return value;\n }\n }\n return JSON.stringify(value, null, 2);\n};\n\ninterface ExpandButtonProps {\n show: boolean;\n expanded: boolean;\n onClick: () => void;\n}\n\nconst ExpandButton = ({ show, expanded, onClick }: ExpandButtonProps) => {\n if (!show) {\n return null;\n }\n\n return (\n <Button\n variant=\"tertiary\"\n size=\"sm\"\n icon={expanded ? <ExpandLessIcon /> : <ExpandMoreIcon />}\n onClick={onClick}\n />\n );\n};\n\ninterface ExpandedPayloadProps {\n show: boolean;\n label: string;\n value: unknown;\n variant?: \"default\" | \"destructive\";\n}\n\nconst ExpandedPayload = ({ show, label, value, variant = \"default\" }: ExpandedPayloadProps) => {\n if (!show) {\n return null;\n }\n\n const textClass = variant === \"destructive\" ? \" text-destructive\" : \"\";\n\n return (\n <div className=\"mt-xs\">\n <Text size=\"sm\" className=\"text-neutral-strong mb-xs\">\n {label}\n </Text>\n <pre\n className={`bg-neutral-light rounded-sm p-sm text-xs overflow-auto max-h-[200px]${textClass}`}\n >\n {formatJson(value)}\n </pre>\n </div>\n );\n};\n\ninterface JsonSectionProps {\n show: boolean;\n title: string;\n value: string;\n}\n\nconst JsonSection = ({ show, title, value }: JsonSectionProps) => {\n if (!show) {\n return null;\n }\n\n return (\n <>\n <Separator />\n <div>\n <Heading level={6} className=\"mb-sm\">\n {title}\n </Heading>\n <CodeEditor value={value} language=\"json\" disabled={true} />\n </div>\n </>\n );\n};\n\ninterface LoadMoreLogsButtonProps {\n show: boolean;\n loading: boolean;\n onClick: () => void;\n}\n\nconst LoadMoreLogsButton = ({ show, loading, onClick }: LoadMoreLogsButtonProps) => {\n if (!show) {\n return null;\n }\n\n return (\n <div className=\"mt-sm\">\n <Button variant=\"tertiary\" size=\"sm\" onClick={onClick} disabled={loading}>\n {loading ? \"Loading...\" : \"Load more logs\"}\n </Button>\n </div>\n );\n};\n\ninterface DrawerActionsProps {\n isRunning: boolean;\n isTerminal: boolean;\n onAbort: () => void;\n onDelete: () => void;\n}\n\nconst DrawerActions = ({ isRunning, isTerminal, onAbort, onDelete }: DrawerActionsProps) => {\n if (!isRunning && !isTerminal) {\n return null;\n }\n\n return (\n <div className=\"flex gap-sm\">\n {isRunning ? (\n <Button variant=\"secondary\" size=\"sm\" icon={<StopCircleIcon />} onClick={onAbort}>\n Abort\n </Button>\n ) : null}\n {isTerminal ? (\n <Button variant=\"secondary\" size=\"sm\" icon={<DeleteIcon />} onClick={onDelete}>\n Delete\n </Button>\n ) : null}\n </div>\n );\n};\n\ninterface LogItemViewProps {\n item: TaskLogItem;\n}\n\nconst LogItemView = ({ item }: LogItemViewProps) => {\n const [expanded, setExpanded] = useState(false);\n const hasData = item.data !== null && item.data !== undefined;\n const hasError = item.error !== null && item.error !== undefined;\n const expandable = hasData || hasError;\n\n return (\n <div className=\"border-b-sm border-neutral-muted py-xs px-sm\">\n <div className=\"flex items-start gap-sm\">\n <div className=\"flex-shrink-0 pt-[2px]\">\n <Tag\n variant={item.type === \"error\" ? \"destructive\" : \"neutral-light\"}\n content={item.type}\n />\n </div>\n <div className=\"flex-1 min-w-0\">\n <Text size=\"sm\">{item.message}</Text>\n </div>\n <div className=\"flex items-center gap-xs flex-shrink-0\">\n <Text size=\"sm\" className=\"text-neutral-strong\">\n <TimeAgo datetime={item.createdOn} />\n </Text>\n <ExpandButton\n show={expandable}\n expanded={expanded}\n onClick={() => setExpanded(!expanded)}\n />\n </div>\n </div>\n <ExpandedPayload show={expanded && hasData} label=\"Data\" value={item.data} />\n <ExpandedPayload\n show={expanded && hasError}\n label=\"Error\"\n value={item.error}\n variant=\"destructive\"\n />\n </div>\n );\n};\n\ninterface TaskDetailDrawerProps {\n task: Task;\n open: boolean;\n onClose: () => void;\n onAbort: (id: string) => Promise<void>;\n onDelete: (id: string) => Promise<void>;\n}\n\nconst TaskDetailDrawerInner = observer(function TaskDetailDrawerInner({\n task,\n open,\n onClose,\n onAbort,\n onDelete\n}: TaskDetailDrawerProps) {\n const { presenter } = useFeature(TaskDetailPresenterFeature);\n\n useEffect(() => {\n if (open) {\n void presenter.init(task.id);\n }\n }, [presenter, task.id, open]);\n\n const { vm } = presenter;\n\n const { showConfirmation: showAbortConfirmation } = useConfirmationDialog({\n title: \"Abort Task\",\n message: \"Are you sure you want to abort this running task?\"\n });\n\n const { showConfirmation: showDeleteConfirmation } = useConfirmationDialog({\n title: \"Delete Task\",\n message: \"Are you sure you want to delete this task?\"\n });\n\n const displayTask = vm.task ?? task;\n const isRunning = displayTask.taskStatus === \"running\";\n const isTerminal =\n displayTask.taskStatus === \"success\" ||\n displayTask.taskStatus === \"failed\" ||\n displayTask.taskStatus === \"aborted\";\n\n const inputJson = formatJson(displayTask.input);\n const outputJson = formatJson(displayTask.output);\n\n return (\n <Drawer\n open={open}\n onOpenChange={isOpen => !isOpen && onClose()}\n title={\n <div className=\"flex items-center gap-sm\">\n <span>{displayTask.name || displayTask.definitionId}</span>\n <Tag\n variant={STATUS_TAG_VARIANT[displayTask.taskStatus] ?? \"neutral-light\"}\n content={displayTask.taskStatus}\n />\n </div>\n }\n modal={true}\n width=\"900px\"\n bodyPadding={false}\n actions={\n <DrawerActions\n isRunning={isRunning}\n isTerminal={isTerminal}\n onAbort={() => showAbortConfirmation(() => onAbort(displayTask.id))}\n onDelete={() => showDeleteConfirmation(() => onDelete(displayTask.id))}\n />\n }\n >\n <div className=\"flex flex-col gap-md p-md overflow-auto\">\n <div>\n <Heading level={6} className=\"mb-sm\">\n General Info\n </Heading>\n <Grid gap=\"comfortable\">\n <Grid.Column span={6}>\n <Text size=\"sm\" className=\"text-neutral-strong\">\n Definition\n </Text>\n <Text size=\"sm\">{displayTask.definitionId}</Text>\n </Grid.Column>\n <Grid.Column span={6}>\n <Text size=\"sm\" className=\"text-neutral-strong\">\n Created By\n </Text>\n <Text size=\"sm\">{displayTask.createdBy?.displayName ?? \"—\"}</Text>\n </Grid.Column>\n <Grid.Column span={6}>\n <Text size=\"sm\" className=\"text-neutral-strong\">\n Created On\n </Text>\n <Text size=\"sm\">\n {displayTask.createdOn ? (\n <TimeAgo datetime={displayTask.createdOn} />\n ) : (\n \"—\"\n )}\n </Text>\n </Grid.Column>\n <Grid.Column span={6}>\n <Text size=\"sm\" className=\"text-neutral-strong\">\n Started On\n </Text>\n <Text size=\"sm\">\n {displayTask.startedOn ? (\n <TimeAgo datetime={displayTask.startedOn} />\n ) : (\n \"—\"\n )}\n </Text>\n </Grid.Column>\n <Grid.Column span={6}>\n <Text size=\"sm\" className=\"text-neutral-strong\">\n Finished On\n </Text>\n <Text size=\"sm\">\n {displayTask.finishedOn ? (\n <TimeAgo datetime={displayTask.finishedOn} />\n ) : (\n \"—\"\n )}\n </Text>\n </Grid.Column>\n <Grid.Column span={6}>\n <Text size=\"sm\" className=\"text-neutral-strong\">\n Iterations\n </Text>\n <Text size=\"sm\">{displayTask.iterations ?? 0}</Text>\n </Grid.Column>\n </Grid>\n </div>\n\n <JsonSection show={!!inputJson} title=\"Input\" value={inputJson} />\n <JsonSection show={!!outputJson} title=\"Output\" value={outputJson} />\n\n <Separator />\n <div>\n <Heading level={6} className=\"mb-sm\">\n Logs ({vm.logs.pagination.totalCount})\n </Heading>\n {vm.logs.rows.length === 0 && !vm.logs.pagination.loading ? (\n <Text size=\"sm\" className=\"text-neutral-strong\">\n No logs available.\n </Text>\n ) : (\n <div className=\"border-sm border-neutral-muted rounded-sm\">\n {vm.logs.rows.map((log: TaskLog) =>\n log.items.map((item, idx) => (\n <LogItemView key={`${log.id}-${idx}`} item={item} />\n ))\n )}\n </div>\n )}\n <LoadMoreLogsButton\n show={vm.logs.pagination.hasMore}\n loading={vm.logs.pagination.loading}\n onClick={() => presenter.loadMore()}\n />\n </div>\n </div>\n </Drawer>\n );\n});\n\nexport const TaskDetailDrawer = (props: TaskDetailDrawerProps) => {\n const container = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = container.createChildContainer();\n GetTaskFeature.register(child);\n ListLogsFeature.register(child);\n TaskDetailPresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <TaskDetailDrawerInner {...props} />\n </DiContainerProvider>\n );\n};\n"],"names":["STATUS_TAG_VARIANT","formatJson","value","JSON","ExpandButton","show","expanded","onClick","Button","ExpandLessIcon","ExpandMoreIcon","ExpandedPayload","label","variant","textClass","Text","JsonSection","title","Separator","Heading","CodeEditor","LoadMoreLogsButton","loading","DrawerActions","isRunning","isTerminal","onAbort","onDelete","StopCircleIcon","DeleteIcon","LogItemView","item","setExpanded","useState","hasData","undefined","hasError","expandable","Tag","TimeAgo","TaskDetailDrawerInner","observer","task","open","onClose","presenter","useFeature","TaskDetailPresenterFeature","useEffect","vm","showAbortConfirmation","useConfirmationDialog","showDeleteConfirmation","displayTask","inputJson","outputJson","Drawer","isOpen","Grid","log","idx","TaskDetailDrawer","props","container","useContainer","scopedContainer","useMemo","child","GetTaskFeature","ListLogsFeature","DiContainerProvider"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/admin";
|
|
2
|
+
import { TaskDetailPresenter } from "./abstractions.js";
|
|
3
|
+
import { TaskDetailPresenter as external_TaskDetailPresenter_js_TaskDetailPresenter } from "./TaskDetailPresenter.js";
|
|
4
|
+
const TaskDetailPresenterFeature = createFeature({
|
|
5
|
+
name: "BackgroundTasks/TaskDetailPresenter",
|
|
6
|
+
register (container) {
|
|
7
|
+
container.register(external_TaskDetailPresenter_js_TaskDetailPresenter).inSingletonScope();
|
|
8
|
+
},
|
|
9
|
+
resolve (container) {
|
|
10
|
+
return {
|
|
11
|
+
presenter: container.resolve(TaskDetailPresenter)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
export { TaskDetailPresenterFeature };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/presentation/TaskDetail/feature.js","sources":["../../../../src/admin/presentation/TaskDetail/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { TaskDetailPresenter as PresenterAbstraction } from \"./abstractions.js\";\nimport { TaskDetailPresenter } from \"./TaskDetailPresenter.js\";\n\nexport const TaskDetailPresenterFeature = createFeature({\n name: \"BackgroundTasks/TaskDetailPresenter\",\n register(container) {\n container.register(TaskDetailPresenter).inSingletonScope();\n },\n resolve(container) {\n return { presenter: container.resolve(PresenterAbstraction) };\n }\n});\n"],"names":["TaskDetailPresenterFeature","createFeature","container","TaskDetailPresenter","PresenterAbstraction"],"mappings":";;;AAIO,MAAMA,6BAA6BC,cAAc;IACpD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,qDAAqB,gBAAgB;IAC5D;IACA,SAAQD,SAAS;QACb,OAAO;YAAE,WAAWA,UAAU,OAAO,CAACE;QAAsB;IAChE;AACJ"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { IDataSource, IDataSourceQuery, IDataSourceMeta } from "@webiny/app-admin/presentation/listPresenter/abstractions.js";
|
|
2
|
+
import type { Task } from "../../../admin/shared/types.js";
|
|
3
|
+
import type { IListTasksUseCase } from "../../../admin/features/listTasks/abstractions.js";
|
|
4
|
+
export declare class TaskExecutionsDataSource implements IDataSource<Task> {
|
|
5
|
+
private readonly listTasksUseCase;
|
|
6
|
+
private _rows;
|
|
7
|
+
private _meta;
|
|
8
|
+
private _loading;
|
|
9
|
+
constructor(listTasksUseCase: IListTasksUseCase);
|
|
10
|
+
get rows(): Task[];
|
|
11
|
+
get meta(): IDataSourceMeta;
|
|
12
|
+
get loading(): boolean;
|
|
13
|
+
query(params: IDataSourceQuery): Promise<void>;
|
|
14
|
+
loadMore(params: IDataSourceQuery): Promise<void>;
|
|
15
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { computed, makeAutoObservable, runInAction } from "mobx";
|
|
2
|
+
const ENTRY_META_SORT_FIELDS = new Set([
|
|
3
|
+
"id",
|
|
4
|
+
"createdOn",
|
|
5
|
+
"modifiedOn",
|
|
6
|
+
"savedOn",
|
|
7
|
+
"deletedOn",
|
|
8
|
+
"restoredOn",
|
|
9
|
+
"firstPublishedOn",
|
|
10
|
+
"lastPublishedOn"
|
|
11
|
+
]);
|
|
12
|
+
function toSortEnum(field, direction) {
|
|
13
|
+
const prefix = ENTRY_META_SORT_FIELDS.has(field) ? "" : "values_";
|
|
14
|
+
return `${prefix}${field}_${direction}`;
|
|
15
|
+
}
|
|
16
|
+
class TaskExecutionsDataSource {
|
|
17
|
+
constructor(listTasksUseCase){
|
|
18
|
+
this.listTasksUseCase = listTasksUseCase;
|
|
19
|
+
this._rows = [];
|
|
20
|
+
this._meta = {
|
|
21
|
+
cursor: null,
|
|
22
|
+
hasMoreItems: false,
|
|
23
|
+
totalCount: 0
|
|
24
|
+
};
|
|
25
|
+
this._loading = false;
|
|
26
|
+
makeAutoObservable(this, {
|
|
27
|
+
listTasksUseCase: false,
|
|
28
|
+
rows: computed
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
get rows() {
|
|
32
|
+
return this._rows;
|
|
33
|
+
}
|
|
34
|
+
get meta() {
|
|
35
|
+
return this._meta;
|
|
36
|
+
}
|
|
37
|
+
get loading() {
|
|
38
|
+
return this._loading;
|
|
39
|
+
}
|
|
40
|
+
async query(params) {
|
|
41
|
+
this._loading = true;
|
|
42
|
+
const sort = params.sort ? [
|
|
43
|
+
toSortEnum(params.sort.field, params.sort.direction)
|
|
44
|
+
] : void 0;
|
|
45
|
+
const result = await this.listTasksUseCase.execute({
|
|
46
|
+
where: params.filters,
|
|
47
|
+
sort,
|
|
48
|
+
limit: params.limit,
|
|
49
|
+
after: params.cursor,
|
|
50
|
+
search: params.search
|
|
51
|
+
});
|
|
52
|
+
runInAction(()=>{
|
|
53
|
+
this._rows = result.items;
|
|
54
|
+
this._meta = {
|
|
55
|
+
cursor: result.meta.cursor,
|
|
56
|
+
hasMoreItems: result.meta.hasMoreItems,
|
|
57
|
+
totalCount: result.meta.totalCount
|
|
58
|
+
};
|
|
59
|
+
this._loading = false;
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
async loadMore(params) {
|
|
63
|
+
if (!this._meta.hasMoreItems || this._loading) return;
|
|
64
|
+
this._loading = true;
|
|
65
|
+
const sort = params.sort ? [
|
|
66
|
+
toSortEnum(params.sort.field, params.sort.direction)
|
|
67
|
+
] : void 0;
|
|
68
|
+
const result = await this.listTasksUseCase.execute({
|
|
69
|
+
where: params.filters,
|
|
70
|
+
sort,
|
|
71
|
+
limit: params.limit,
|
|
72
|
+
after: this._meta.cursor ?? void 0,
|
|
73
|
+
search: params.search
|
|
74
|
+
});
|
|
75
|
+
runInAction(()=>{
|
|
76
|
+
this._rows = [
|
|
77
|
+
...this._rows,
|
|
78
|
+
...result.items
|
|
79
|
+
];
|
|
80
|
+
this._meta = {
|
|
81
|
+
cursor: result.meta.cursor,
|
|
82
|
+
hasMoreItems: result.meta.hasMoreItems,
|
|
83
|
+
totalCount: result.meta.totalCount
|
|
84
|
+
};
|
|
85
|
+
this._loading = false;
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
export { TaskExecutionsDataSource };
|
|
90
|
+
|
|
91
|
+
//# sourceMappingURL=TaskExecutionsDataSource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/presentation/TaskExecutions/TaskExecutionsDataSource.js","sources":["../../../../src/admin/presentation/TaskExecutions/TaskExecutionsDataSource.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport type {\n IDataSource,\n IDataSourceQuery,\n IDataSourceMeta\n} from \"@webiny/app-admin/presentation/listPresenter/abstractions.js\";\nimport type { Task } from \"~/admin/shared/types.js\";\nimport type { IListTasksUseCase } from \"~/admin/features/listTasks/abstractions.js\";\n\nconst ENTRY_META_SORT_FIELDS = new Set([\n \"id\",\n \"createdOn\",\n \"modifiedOn\",\n \"savedOn\",\n \"deletedOn\",\n \"restoredOn\",\n \"firstPublishedOn\",\n \"lastPublishedOn\"\n]);\n\nfunction toSortEnum(field: string, direction: \"ASC\" | \"DESC\"): string {\n const prefix = ENTRY_META_SORT_FIELDS.has(field) ? \"\" : \"values_\";\n return `${prefix}${field}_${direction}`;\n}\n\nexport class TaskExecutionsDataSource implements IDataSource<Task> {\n private _rows: Task[] = [];\n private _meta: IDataSourceMeta = { cursor: null, hasMoreItems: false, totalCount: 0 };\n private _loading = false;\n\n constructor(private readonly listTasksUseCase: IListTasksUseCase) {\n makeAutoObservable<TaskExecutionsDataSource, \"listTasksUseCase\">(this, {\n listTasksUseCase: false,\n rows: computed\n });\n }\n\n get rows(): Task[] {\n return this._rows;\n }\n\n get meta(): IDataSourceMeta {\n return this._meta;\n }\n\n get loading(): boolean {\n return this._loading;\n }\n\n async query(params: IDataSourceQuery): Promise<void> {\n this._loading = true;\n const sort = params.sort\n ? [toSortEnum(params.sort.field, params.sort.direction)]\n : undefined;\n const result = await this.listTasksUseCase.execute({\n where: params.filters,\n sort,\n limit: params.limit,\n after: params.cursor,\n search: params.search\n });\n runInAction(() => {\n this._rows = result.items;\n this._meta = {\n cursor: result.meta.cursor,\n hasMoreItems: result.meta.hasMoreItems,\n totalCount: result.meta.totalCount\n };\n this._loading = false;\n });\n }\n\n async loadMore(params: IDataSourceQuery): Promise<void> {\n if (!this._meta.hasMoreItems || this._loading) {\n return;\n }\n this._loading = true;\n const sort = params.sort\n ? [toSortEnum(params.sort.field, params.sort.direction)]\n : undefined;\n const result = await this.listTasksUseCase.execute({\n where: params.filters,\n sort,\n limit: params.limit,\n after: this._meta.cursor ?? undefined,\n search: params.search\n });\n runInAction(() => {\n this._rows = [...this._rows, ...result.items];\n this._meta = {\n cursor: result.meta.cursor,\n hasMoreItems: result.meta.hasMoreItems,\n totalCount: result.meta.totalCount\n };\n this._loading = false;\n });\n }\n}\n"],"names":["ENTRY_META_SORT_FIELDS","Set","toSortEnum","field","direction","prefix","TaskExecutionsDataSource","listTasksUseCase","makeAutoObservable","computed","params","sort","undefined","result","runInAction"],"mappings":";AASA,MAAMA,yBAAyB,IAAIC,IAAI;IACnC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;CACH;AAED,SAASC,WAAWC,KAAa,EAAEC,SAAyB;IACxD,MAAMC,SAASL,uBAAuB,GAAG,CAACG,SAAS,KAAK;IACxD,OAAO,GAAGE,SAASF,MAAM,CAAC,EAAEC,WAAW;AAC3C;AAEO,MAAME;IAKT,YAA6BC,gBAAmC,CAAE;aAArCA,gBAAgB,GAAhBA;aAJrB,KAAK,GAAW,EAAE;aAClB,KAAK,GAAoB;YAAE,QAAQ;YAAM,cAAc;YAAO,YAAY;QAAE;aAC5E,QAAQ,GAAG;QAGfC,mBAAiE,IAAI,EAAE;YACnE,kBAAkB;YAClB,MAAMC;QACV;IACJ;IAEA,IAAI,OAAe;QACf,OAAO,IAAI,CAAC,KAAK;IACrB;IAEA,IAAI,OAAwB;QACxB,OAAO,IAAI,CAAC,KAAK;IACrB;IAEA,IAAI,UAAmB;QACnB,OAAO,IAAI,CAAC,QAAQ;IACxB;IAEA,MAAM,MAAMC,MAAwB,EAAiB;QACjD,IAAI,CAAC,QAAQ,GAAG;QAChB,MAAMC,OAAOD,OAAO,IAAI,GAClB;YAACR,WAAWQ,OAAO,IAAI,CAAC,KAAK,EAAEA,OAAO,IAAI,CAAC,SAAS;SAAE,GACtDE;QACN,MAAMC,SAAS,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC/C,OAAOH,OAAO,OAAO;YACrBC;YACA,OAAOD,OAAO,KAAK;YACnB,OAAOA,OAAO,MAAM;YACpB,QAAQA,OAAO,MAAM;QACzB;QACAI,YAAY;YACR,IAAI,CAAC,KAAK,GAAGD,OAAO,KAAK;YACzB,IAAI,CAAC,KAAK,GAAG;gBACT,QAAQA,OAAO,IAAI,CAAC,MAAM;gBAC1B,cAAcA,OAAO,IAAI,CAAC,YAAY;gBACtC,YAAYA,OAAO,IAAI,CAAC,UAAU;YACtC;YACA,IAAI,CAAC,QAAQ,GAAG;QACpB;IACJ;IAEA,MAAM,SAASH,MAAwB,EAAiB;QACpD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,YAAY,IAAI,IAAI,CAAC,QAAQ,EACzC;QAEJ,IAAI,CAAC,QAAQ,GAAG;QAChB,MAAMC,OAAOD,OAAO,IAAI,GAClB;YAACR,WAAWQ,OAAO,IAAI,CAAC,KAAK,EAAEA,OAAO,IAAI,CAAC,SAAS;SAAE,GACtDE;QACN,MAAMC,SAAS,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;YAC/C,OAAOH,OAAO,OAAO;YACrBC;YACA,OAAOD,OAAO,KAAK;YACnB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,IAAIE;YAC5B,QAAQF,OAAO,MAAM;QACzB;QACAI,YAAY;YACR,IAAI,CAAC,KAAK,GAAG;mBAAI,IAAI,CAAC,KAAK;mBAAKD,OAAO,KAAK;aAAC;YAC7C,IAAI,CAAC,KAAK,GAAG;gBACT,QAAQA,OAAO,IAAI,CAAC,MAAM;gBAC1B,cAAcA,OAAO,IAAI,CAAC,YAAY;gBACtC,YAAYA,OAAO,IAAI,CAAC,UAAU;YACtC;YACA,IAAI,CAAC,QAAQ,GAAG;QACpB;IACJ;AACJ"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { ListPresenter } from "@webiny/app-admin/presentation/listPresenter/abstractions.js";
|
|
2
|
+
import type { Task } from "../../../admin/shared/types.js";
|
|
3
|
+
import { type ITaskExecutionsPresenter, type ITaskExecutionsViewModel } from "./abstractions.js";
|
|
4
|
+
import { ListTasksUseCase } from "../../../admin/features/listTasks/abstractions.js";
|
|
5
|
+
import { DeleteTaskUseCase } from "../../../admin/features/deleteTask/abstractions.js";
|
|
6
|
+
import { AbortTaskUseCase } from "../../../admin/features/abortTask/abstractions.js";
|
|
7
|
+
import { ListDefinitionsUseCase } from "../../../admin/features/listDefinitions/abstractions.js";
|
|
8
|
+
import { TaskPermissions } from "../../../admin/features/permissions/abstractions.js";
|
|
9
|
+
declare class TaskExecutionsPresenterImpl implements ITaskExecutionsPresenter {
|
|
10
|
+
private readonly listPresenter;
|
|
11
|
+
private readonly listTasksUseCase;
|
|
12
|
+
private readonly deleteTaskUseCase;
|
|
13
|
+
private readonly abortTaskUseCase;
|
|
14
|
+
private readonly listDefinitionsUseCase;
|
|
15
|
+
private readonly permissions;
|
|
16
|
+
private _selectedTask;
|
|
17
|
+
private _definitionOptions;
|
|
18
|
+
constructor(listPresenter: ListPresenter.Interface<Task>, listTasksUseCase: ListTasksUseCase.Interface, deleteTaskUseCase: DeleteTaskUseCase.Interface, abortTaskUseCase: AbortTaskUseCase.Interface, listDefinitionsUseCase: ListDefinitionsUseCase.Interface, permissions: TaskPermissions.Interface);
|
|
19
|
+
get vm(): ITaskExecutionsViewModel;
|
|
20
|
+
get selectedTask(): Task | null;
|
|
21
|
+
search: {
|
|
22
|
+
set: (query: string) => void;
|
|
23
|
+
clear: () => void;
|
|
24
|
+
};
|
|
25
|
+
sort: {
|
|
26
|
+
set: (field: string, direction: "ASC" | "DESC") => void;
|
|
27
|
+
toggle: (field: string) => void;
|
|
28
|
+
};
|
|
29
|
+
filter: {
|
|
30
|
+
set: (key: string, value: unknown) => void;
|
|
31
|
+
clear: (key: string) => void;
|
|
32
|
+
clearAll: () => void;
|
|
33
|
+
};
|
|
34
|
+
selection: {
|
|
35
|
+
toggle: (id: string) => void;
|
|
36
|
+
selectRangeTo: (id: string) => void;
|
|
37
|
+
selectAll: () => void;
|
|
38
|
+
deselectAll: () => void;
|
|
39
|
+
selectRows: (ids: string[]) => void;
|
|
40
|
+
isSelected: (id: string) => boolean;
|
|
41
|
+
};
|
|
42
|
+
loadMore: () => Promise<void>;
|
|
43
|
+
refresh: () => Promise<void>;
|
|
44
|
+
deleteTask: (id: string) => Promise<void>;
|
|
45
|
+
abortTask: (id: string) => Promise<void>;
|
|
46
|
+
selectTask: (task: Task | null) => void;
|
|
47
|
+
init(): void;
|
|
48
|
+
}
|
|
49
|
+
export declare const TaskExecutionsPresenter: typeof TaskExecutionsPresenterImpl & {
|
|
50
|
+
__abstraction: import("@webiny/di").Abstraction<ITaskExecutionsPresenter>;
|
|
51
|
+
};
|
|
52
|
+
export {};
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
import { computed, makeAutoObservable, runInAction } from "mobx";
|
|
2
|
+
import { ListPresenter } from "@webiny/app-admin/presentation/listPresenter/abstractions.js";
|
|
3
|
+
import { TaskExecutionsPresenter } from "./abstractions.js";
|
|
4
|
+
import { TaskExecutionsDataSource } from "./TaskExecutionsDataSource.js";
|
|
5
|
+
import { ListTasksUseCase } from "../../features/listTasks/abstractions.js";
|
|
6
|
+
import { DeleteTaskUseCase } from "../../features/deleteTask/abstractions.js";
|
|
7
|
+
import { AbortTaskUseCase } from "../../features/abortTask/abstractions.js";
|
|
8
|
+
import { ListDefinitionsUseCase } from "../../features/listDefinitions/abstractions.js";
|
|
9
|
+
import { TaskPermissions } from "../../features/permissions/abstractions.js";
|
|
10
|
+
class TaskExecutionsPresenterImpl {
|
|
11
|
+
constructor(listPresenter, listTasksUseCase, deleteTaskUseCase, abortTaskUseCase, listDefinitionsUseCase, permissions){
|
|
12
|
+
this.listPresenter = listPresenter;
|
|
13
|
+
this.listTasksUseCase = listTasksUseCase;
|
|
14
|
+
this.deleteTaskUseCase = deleteTaskUseCase;
|
|
15
|
+
this.abortTaskUseCase = abortTaskUseCase;
|
|
16
|
+
this.listDefinitionsUseCase = listDefinitionsUseCase;
|
|
17
|
+
this.permissions = permissions;
|
|
18
|
+
this._selectedTask = null;
|
|
19
|
+
this._definitionOptions = [];
|
|
20
|
+
this.search = {
|
|
21
|
+
set: (query)=>this.listPresenter.actions.search.set(query),
|
|
22
|
+
clear: ()=>this.listPresenter.actions.search.clear()
|
|
23
|
+
};
|
|
24
|
+
this.sort = {
|
|
25
|
+
set: (field, direction)=>this.listPresenter.actions.sort.set(field, direction),
|
|
26
|
+
toggle: (field)=>this.listPresenter.actions.sort.toggle(field)
|
|
27
|
+
};
|
|
28
|
+
this.filter = {
|
|
29
|
+
set: (key, value)=>this.listPresenter.actions.filter.set(key, value),
|
|
30
|
+
clear: (key)=>this.listPresenter.actions.filter.clear(key),
|
|
31
|
+
clearAll: ()=>this.listPresenter.actions.filter.clearAll()
|
|
32
|
+
};
|
|
33
|
+
this.selection = {
|
|
34
|
+
toggle: (id)=>this.listPresenter.actions.selection.toggle(id),
|
|
35
|
+
selectRangeTo: (id)=>this.listPresenter.actions.selection.selectRangeTo(id),
|
|
36
|
+
selectAll: ()=>this.listPresenter.actions.selection.selectAll(),
|
|
37
|
+
deselectAll: ()=>this.listPresenter.actions.selection.deselectAll(),
|
|
38
|
+
selectRows: (ids)=>this.listPresenter.actions.selection.selectRows(ids),
|
|
39
|
+
isSelected: (id)=>this.listPresenter.actions.selection.isSelected(id)
|
|
40
|
+
};
|
|
41
|
+
this.loadMore = ()=>this.listPresenter.actions.loadMore();
|
|
42
|
+
this.refresh = ()=>this.listPresenter.actions.refresh();
|
|
43
|
+
this.deleteTask = async (id)=>{
|
|
44
|
+
await this.deleteTaskUseCase.execute(id);
|
|
45
|
+
this._selectedTask = null;
|
|
46
|
+
await this.listPresenter.actions.refresh();
|
|
47
|
+
};
|
|
48
|
+
this.abortTask = async (id)=>{
|
|
49
|
+
await this.abortTaskUseCase.execute({
|
|
50
|
+
id
|
|
51
|
+
});
|
|
52
|
+
await this.listPresenter.actions.refresh();
|
|
53
|
+
};
|
|
54
|
+
this.selectTask = (task)=>{
|
|
55
|
+
this._selectedTask = task;
|
|
56
|
+
};
|
|
57
|
+
makeAutoObservable(this, {
|
|
58
|
+
vm: computed
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
get vm() {
|
|
62
|
+
return {
|
|
63
|
+
list: this.listPresenter.vm,
|
|
64
|
+
definitionOptions: this._definitionOptions,
|
|
65
|
+
permissions: {
|
|
66
|
+
canRead: this.permissions.canRead("task"),
|
|
67
|
+
canDelete: this.permissions.canDelete("task")
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
get selectedTask() {
|
|
72
|
+
return this._selectedTask;
|
|
73
|
+
}
|
|
74
|
+
init() {
|
|
75
|
+
const dataSource = new TaskExecutionsDataSource(this.listTasksUseCase);
|
|
76
|
+
this.listPresenter.init({
|
|
77
|
+
dataSource,
|
|
78
|
+
initialSort: {
|
|
79
|
+
field: "createdOn",
|
|
80
|
+
direction: "DESC"
|
|
81
|
+
},
|
|
82
|
+
limit: 25
|
|
83
|
+
});
|
|
84
|
+
this.listDefinitionsUseCase.execute().then((definitions)=>{
|
|
85
|
+
runInAction(()=>{
|
|
86
|
+
this._definitionOptions = definitions.map((d)=>({
|
|
87
|
+
label: d.title,
|
|
88
|
+
value: d.id
|
|
89
|
+
}));
|
|
90
|
+
});
|
|
91
|
+
}).catch(()=>{});
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
const TaskExecutionsPresenter_TaskExecutionsPresenter = TaskExecutionsPresenter.createImplementation({
|
|
95
|
+
implementation: TaskExecutionsPresenterImpl,
|
|
96
|
+
dependencies: [
|
|
97
|
+
ListPresenter,
|
|
98
|
+
ListTasksUseCase,
|
|
99
|
+
DeleteTaskUseCase,
|
|
100
|
+
AbortTaskUseCase,
|
|
101
|
+
ListDefinitionsUseCase,
|
|
102
|
+
TaskPermissions
|
|
103
|
+
]
|
|
104
|
+
});
|
|
105
|
+
export { TaskExecutionsPresenter_TaskExecutionsPresenter as TaskExecutionsPresenter };
|
|
106
|
+
|
|
107
|
+
//# sourceMappingURL=TaskExecutionsPresenter.js.map
|