@webiny/background-tasks 6.6.0-alpha.0 → 6.6.0-alpha.1
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/admin/BackgroundTaskRoutes.js +16 -3
- package/admin/BackgroundTaskRoutes.js.map +1 -1
- package/admin/presentation/TaskDetail/components/TaskDetailDrawer.js +6 -0
- package/admin/presentation/TaskDetail/components/TaskDetailDrawer.js.map +1 -1
- package/admin/presentation/TaskExecutions/components/TaskExecutionsView.js +44 -24
- package/admin/presentation/TaskExecutions/components/TaskExecutionsView.js.map +1 -1
- package/api/BackgroundTasksFeature.js +2 -0
- package/api/BackgroundTasksFeature.js.map +1 -1
- package/api/crud/service.tasks.js +4 -2
- package/api/crud/service.tasks.js.map +1 -1
- package/api/decorators/RunnableTaskDecorator.d.ts +2 -1
- package/api/decorators/RunnableTaskDecorator.js +5 -6
- package/api/decorators/RunnableTaskDecorator.js.map +1 -1
- package/api/decorators/SelfCleaningTaskDecorator.d.ts +5 -2
- package/api/decorators/SelfCleaningTaskDecorator.js +14 -5
- package/api/decorators/SelfCleaningTaskDecorator.js.map +1 -1
- package/api/domain/errors.d.ts +10 -0
- package/api/domain/errors.js +11 -1
- package/api/domain/errors.js.map +1 -1
- package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.d.ts +6 -3
- package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js +66 -5
- package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js.map +1 -1
- package/api/features/GetTaskDefinition/abstractions.d.ts +2 -1
- package/api/features/GetTaskDefinition/abstractions.js.map +1 -1
- package/api/features/TaskHandlerResolver/TaskHandlerResolver.d.ts +12 -0
- package/api/features/TaskHandlerResolver/TaskHandlerResolver.js +19 -0
- package/api/features/TaskHandlerResolver/TaskHandlerResolver.js.map +1 -0
- package/api/features/TaskHandlerResolver/abstractions.d.ts +17 -0
- package/api/features/TaskHandlerResolver/abstractions.js +5 -0
- package/api/features/TaskHandlerResolver/abstractions.js.map +1 -0
- package/api/features/TaskHandlerResolver/feature.d.ts +9 -0
- package/api/features/TaskHandlerResolver/feature.js +11 -0
- package/api/features/TaskHandlerResolver/feature.js.map +1 -0
- package/api/features/TaskHandlerResolver/index.d.ts +2 -0
- package/api/features/TaskHandlerResolver/index.js +2 -0
- package/api/runner/TaskControl.d.ts +25 -1
- package/api/runner/TaskControl.js +28 -18
- package/api/runner/TaskControl.js.map +1 -1
- package/api/runner/TaskManager.d.ts +12 -1
- package/api/runner/TaskManager.js +8 -7
- package/api/runner/TaskManager.js.map +1 -1
- package/api/runner/TaskManagerStore.d.ts +7 -0
- package/api/runner/TaskManagerStore.js +3 -3
- package/api/runner/TaskManagerStore.js.map +1 -1
- package/api/runner/TaskRunner.js +25 -4
- package/api/runner/TaskRunner.js.map +1 -1
- package/api/tasks/testingRunTask.d.ts +10 -2
- package/api/tasks/testingRunTask.js +10 -3
- package/api/tasks/testingRunTask.js.map +1 -1
- package/package.json +26 -28
- package/testing/index.d.ts +3 -0
- package/testing/index.js +2 -0
- package/testing/mockTaskTriggerTransportPlugin.d.ts +2 -0
- package/testing/mockTaskTriggerTransportPlugin.js +18 -0
- package/testing/mockTaskTriggerTransportPlugin.js.map +1 -0
- package/testing/runner.d.ts +19 -0
- package/testing/runner.js +44 -0
- package/testing/runner.js.map +1 -0
|
@@ -7,6 +7,10 @@ import { BackgroundTaskSettingsView } from "./presentation/BackgroundTaskSetting
|
|
|
7
7
|
import { Routes } from "./routes.js";
|
|
8
8
|
import { ReactComponent } from "@webiny/icons/task.svg";
|
|
9
9
|
const { Menu: Menu, Route: Route } = AdminConfig;
|
|
10
|
+
const BackgroundTasksBreadcrumbsRoot = ()=>/*#__PURE__*/ react.createElement(AdminConfig.Breadcrumb, {
|
|
11
|
+
name: "background-tasks",
|
|
12
|
+
label: "Background Tasks"
|
|
13
|
+
});
|
|
10
14
|
const BackgroundTaskRoutes = ()=>{
|
|
11
15
|
const { getLink } = useRouter();
|
|
12
16
|
return /*#__PURE__*/ react.createElement(AdminConfig, null, /*#__PURE__*/ react.createElement(HasPermission, {
|
|
@@ -15,12 +19,18 @@ const BackgroundTaskRoutes = ()=>{
|
|
|
15
19
|
route: Routes.Definitions,
|
|
16
20
|
element: /*#__PURE__*/ react.createElement(AdminLayout, {
|
|
17
21
|
title: "Task Definitions"
|
|
18
|
-
}, /*#__PURE__*/ react.createElement(
|
|
22
|
+
}, /*#__PURE__*/ react.createElement(BackgroundTasksBreadcrumbsRoot, null), /*#__PURE__*/ react.createElement(AdminConfig.Breadcrumb, {
|
|
23
|
+
name: "background-tasks.definitions",
|
|
24
|
+
label: "Definitions"
|
|
25
|
+
}), /*#__PURE__*/ react.createElement(TaskDefinitionsView, null))
|
|
19
26
|
}), /*#__PURE__*/ react.createElement(Route, {
|
|
20
27
|
route: Routes.Executions,
|
|
21
28
|
element: /*#__PURE__*/ react.createElement(AdminLayout, {
|
|
22
29
|
title: "Task Executions"
|
|
23
|
-
}, /*#__PURE__*/ react.createElement(
|
|
30
|
+
}, /*#__PURE__*/ react.createElement(BackgroundTasksBreadcrumbsRoot, null), /*#__PURE__*/ react.createElement(AdminConfig.Breadcrumb, {
|
|
31
|
+
name: "background-tasks.executions",
|
|
32
|
+
label: "Executions"
|
|
33
|
+
}), /*#__PURE__*/ react.createElement(TaskExecutionsView, null))
|
|
24
34
|
}), /*#__PURE__*/ react.createElement(Menu, {
|
|
25
35
|
name: "backgroundTasks.executions",
|
|
26
36
|
parent: "dev-tools",
|
|
@@ -39,7 +49,10 @@ const BackgroundTaskRoutes = ()=>{
|
|
|
39
49
|
route: Routes.Settings,
|
|
40
50
|
element: /*#__PURE__*/ react.createElement(AdminLayout, {
|
|
41
51
|
title: "Background Task Settings"
|
|
42
|
-
}, /*#__PURE__*/ react.createElement(
|
|
52
|
+
}, /*#__PURE__*/ react.createElement(BackgroundTasksBreadcrumbsRoot, null), /*#__PURE__*/ react.createElement(AdminConfig.Breadcrumb, {
|
|
53
|
+
name: "background-tasks.settings",
|
|
54
|
+
label: "Settings"
|
|
55
|
+
}), /*#__PURE__*/ react.createElement(BackgroundTaskSettingsView, null))
|
|
43
56
|
}), /*#__PURE__*/ react.createElement(Menu, {
|
|
44
57
|
name: "backgroundTasks.settings",
|
|
45
58
|
parent: "settings.system",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/BackgroundTaskRoutes.js","sources":["../../src/admin/BackgroundTaskRoutes.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig } from \"@webiny/app-admin\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport { AdminLayout } from \"@webiny/app-admin\";\nimport { HasPermission } from \"./presentation/security/HasPermission.js\";\nimport { TaskDefinitionsView } from \"./presentation/TaskDefinitions/components/TaskDefinitionsView.js\";\nimport { TaskExecutionsView } from \"./presentation/TaskExecutions/components/TaskExecutionsView.js\";\nimport { BackgroundTaskSettingsView } from \"./presentation/BackgroundTaskSettings/components/BackgroundTaskSettingsView.js\";\nimport { Routes } from \"./routes.js\";\nimport { ReactComponent as TaskIcon } from \"@webiny/icons/task.svg\";\n\nconst { Menu, Route } = AdminConfig;\n\nexport const BackgroundTaskRoutes = () => {\n const { getLink } = useRouter();\n\n return (\n <AdminConfig>\n <HasPermission entity=\"task\">\n <Route\n route={Routes.Definitions}\n element={\n <AdminLayout title=\"Task Definitions\">\n <TaskDefinitionsView />\n </AdminLayout>\n }\n />\n <Route\n route={Routes.Executions}\n element={\n <AdminLayout title=\"Task Executions\">\n <TaskExecutionsView />\n </AdminLayout>\n }\n />\n <Menu\n name=\"backgroundTasks.executions\"\n parent=\"dev-tools\"\n element={\n <Menu.Link\n text=\"Background Tasks\"\n badge={<Menu.Link.Badge text=\"BETA\" />}\n to={getLink(Routes.Executions)}\n icon={\n <Menu.Link.Icon\n label=\"Background Task Executions\"\n element={<TaskIcon />}\n />\n }\n />\n }\n />\n <Route\n route={Routes.Settings}\n element={\n <AdminLayout title=\"Background Task Settings\">\n <BackgroundTaskSettingsView />\n </AdminLayout>\n }\n />\n <Menu\n name=\"backgroundTasks.settings\"\n parent=\"settings.system\"\n element={\n <Menu.Link\n text=\"Background Tasks\"\n to={getLink(Routes.Settings)}\n badge={<Menu.Link.Badge text=\"BETA\" />}\n />\n }\n />\n </HasPermission>\n </AdminConfig>\n );\n};\n"],"names":["Menu","Route","AdminConfig","BackgroundTaskRoutes","getLink","useRouter","HasPermission","Routes","AdminLayout","TaskDefinitionsView","TaskExecutionsView","TaskIcon","BackgroundTaskSettingsView"],"mappings":";;;;;;;;AAWA,MAAM,EAAEA,MAAAA,IAAI,EAAEC,OAAAA,KAAK,EAAE,GAAGC;
|
|
1
|
+
{"version":3,"file":"admin/BackgroundTaskRoutes.js","sources":["../../src/admin/BackgroundTaskRoutes.tsx"],"sourcesContent":["import React from \"react\";\nimport { AdminConfig } from \"@webiny/app-admin\";\nimport { useRouter } from \"@webiny/app-admin\";\nimport { AdminLayout } from \"@webiny/app-admin\";\nimport { HasPermission } from \"./presentation/security/HasPermission.js\";\nimport { TaskDefinitionsView } from \"./presentation/TaskDefinitions/components/TaskDefinitionsView.js\";\nimport { TaskExecutionsView } from \"./presentation/TaskExecutions/components/TaskExecutionsView.js\";\nimport { BackgroundTaskSettingsView } from \"./presentation/BackgroundTaskSettings/components/BackgroundTaskSettingsView.js\";\nimport { Routes } from \"./routes.js\";\nimport { ReactComponent as TaskIcon } from \"@webiny/icons/task.svg\";\n\nconst { Menu, Route } = AdminConfig;\n\n// Shared leading breadcrumb for all background-task routes.\nconst BackgroundTasksBreadcrumbsRoot = () => (\n <AdminConfig.Breadcrumb name=\"background-tasks\" label=\"Background Tasks\" />\n);\n\nexport const BackgroundTaskRoutes = () => {\n const { getLink } = useRouter();\n\n return (\n <AdminConfig>\n <HasPermission entity=\"task\">\n <Route\n route={Routes.Definitions}\n element={\n <AdminLayout title=\"Task Definitions\">\n <BackgroundTasksBreadcrumbsRoot />\n <AdminConfig.Breadcrumb\n name=\"background-tasks.definitions\"\n label=\"Definitions\"\n />\n <TaskDefinitionsView />\n </AdminLayout>\n }\n />\n <Route\n route={Routes.Executions}\n element={\n <AdminLayout title=\"Task Executions\">\n <BackgroundTasksBreadcrumbsRoot />\n <AdminConfig.Breadcrumb\n name=\"background-tasks.executions\"\n label=\"Executions\"\n />\n <TaskExecutionsView />\n </AdminLayout>\n }\n />\n <Menu\n name=\"backgroundTasks.executions\"\n parent=\"dev-tools\"\n element={\n <Menu.Link\n text=\"Background Tasks\"\n badge={<Menu.Link.Badge text=\"BETA\" />}\n to={getLink(Routes.Executions)}\n icon={\n <Menu.Link.Icon\n label=\"Background Task Executions\"\n element={<TaskIcon />}\n />\n }\n />\n }\n />\n <Route\n route={Routes.Settings}\n element={\n <AdminLayout title=\"Background Task Settings\">\n <BackgroundTasksBreadcrumbsRoot />\n <AdminConfig.Breadcrumb\n name=\"background-tasks.settings\"\n label=\"Settings\"\n />\n <BackgroundTaskSettingsView />\n </AdminLayout>\n }\n />\n <Menu\n name=\"backgroundTasks.settings\"\n parent=\"settings.system\"\n element={\n <Menu.Link\n text=\"Background Tasks\"\n to={getLink(Routes.Settings)}\n badge={<Menu.Link.Badge text=\"BETA\" />}\n />\n }\n />\n </HasPermission>\n </AdminConfig>\n );\n};\n"],"names":["Menu","Route","AdminConfig","BackgroundTasksBreadcrumbsRoot","BackgroundTaskRoutes","getLink","useRouter","HasPermission","Routes","AdminLayout","TaskDefinitionsView","TaskExecutionsView","TaskIcon","BackgroundTaskSettingsView"],"mappings":";;;;;;;;AAWA,MAAM,EAAEA,MAAAA,IAAI,EAAEC,OAAAA,KAAK,EAAE,GAAGC;AAGxB,MAAMC,iCAAiC,kBACnC,oBAACD,YAAY,UAAU;QAAC,MAAK;QAAmB,OAAM;;AAGnD,MAAME,uBAAuB;IAChC,MAAM,EAAEC,OAAO,EAAE,GAAGC;IAEpB,OAAO,WAAP,GACI,oBAACJ,aAAWA,MAAAA,WAAAA,GACR,oBAACK,eAAaA;QAAC,QAAO;qBAClB,oBAACN,OAAKA;QACF,OAAOO,OAAO,WAAW;QACzB,uBACI,oBAACC,aAAWA;YAAC,OAAM;yBACf,oBAACN,gCAA8BA,OAAAA,WAAAA,GAC/B,oBAACD,YAAY,UAAU;YACnB,MAAK;YACL,OAAM;0BAEV,oBAACQ,qBAAmBA;sBAIhC,oBAACT,OAAKA;QACF,OAAOO,OAAO,UAAU;QACxB,uBACI,oBAACC,aAAWA;YAAC,OAAM;yBACf,oBAACN,gCAA8BA,OAAAA,WAAAA,GAC/B,oBAACD,YAAY,UAAU;YACnB,MAAK;YACL,OAAM;0BAEV,oBAACS,oBAAkBA;sBAI/B,oBAACX,MAAIA;QACD,MAAK;QACL,QAAO;QACP,uBACI,oBAACA,KAAK,IAAI;YACN,MAAK;YACL,qBAAO,oBAACA,KAAK,IAAI,CAAC,KAAK;gBAAC,MAAK;;YAC7B,IAAIK,QAAQG,OAAO,UAAU;YAC7B,oBACI,oBAACR,KAAK,IAAI,CAAC,IAAI;gBACX,OAAM;gBACN,uBAAS,oBAACY,gBAAQA;;;sBAMtC,oBAACX,OAAKA;QACF,OAAOO,OAAO,QAAQ;QACtB,uBACI,oBAACC,aAAWA;YAAC,OAAM;yBACf,oBAACN,gCAA8BA,OAAAA,WAAAA,GAC/B,oBAACD,YAAY,UAAU;YACnB,MAAK;YACL,OAAM;0BAEV,oBAACW,4BAA0BA;sBAIvC,oBAACb,MAAIA;QACD,MAAK;QACL,QAAO;QACP,uBACI,oBAACA,KAAK,IAAI;YACN,MAAK;YACL,IAAIK,QAAQG,OAAO,QAAQ;YAC3B,qBAAO,oBAACR,KAAK,IAAI,CAAC,KAAK;gBAAC,MAAK;;;;AAOzD"}
|
|
@@ -176,6 +176,7 @@ const TaskDetailDrawer_TaskDetailDrawerInner = observer(function({ task, open, o
|
|
|
176
176
|
}, /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
177
177
|
span: 6
|
|
178
178
|
}, /*#__PURE__*/ react.createElement(Text, {
|
|
179
|
+
as: "div",
|
|
179
180
|
size: "sm",
|
|
180
181
|
className: "text-neutral-strong"
|
|
181
182
|
}, "Definition"), /*#__PURE__*/ react.createElement(Text, {
|
|
@@ -183,6 +184,7 @@ const TaskDetailDrawer_TaskDetailDrawerInner = observer(function({ task, open, o
|
|
|
183
184
|
}, displayTask.definitionId)), /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
184
185
|
span: 6
|
|
185
186
|
}, /*#__PURE__*/ react.createElement(Text, {
|
|
187
|
+
as: "div",
|
|
186
188
|
size: "sm",
|
|
187
189
|
className: "text-neutral-strong"
|
|
188
190
|
}, "Created By"), /*#__PURE__*/ react.createElement(Text, {
|
|
@@ -190,6 +192,7 @@ const TaskDetailDrawer_TaskDetailDrawerInner = observer(function({ task, open, o
|
|
|
190
192
|
}, displayTask.createdBy?.displayName ?? "—")), /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
191
193
|
span: 6
|
|
192
194
|
}, /*#__PURE__*/ react.createElement(Text, {
|
|
195
|
+
as: "div",
|
|
193
196
|
size: "sm",
|
|
194
197
|
className: "text-neutral-strong"
|
|
195
198
|
}, "Created On"), /*#__PURE__*/ react.createElement(Text, {
|
|
@@ -199,6 +202,7 @@ const TaskDetailDrawer_TaskDetailDrawerInner = observer(function({ task, open, o
|
|
|
199
202
|
}) : "—")), /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
200
203
|
span: 6
|
|
201
204
|
}, /*#__PURE__*/ react.createElement(Text, {
|
|
205
|
+
as: "div",
|
|
202
206
|
size: "sm",
|
|
203
207
|
className: "text-neutral-strong"
|
|
204
208
|
}, "Started On"), /*#__PURE__*/ react.createElement(Text, {
|
|
@@ -208,6 +212,7 @@ const TaskDetailDrawer_TaskDetailDrawerInner = observer(function({ task, open, o
|
|
|
208
212
|
}) : "—")), /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
209
213
|
span: 6
|
|
210
214
|
}, /*#__PURE__*/ react.createElement(Text, {
|
|
215
|
+
as: "div",
|
|
211
216
|
size: "sm",
|
|
212
217
|
className: "text-neutral-strong"
|
|
213
218
|
}, "Finished On"), /*#__PURE__*/ react.createElement(Text, {
|
|
@@ -217,6 +222,7 @@ const TaskDetailDrawer_TaskDetailDrawerInner = observer(function({ task, open, o
|
|
|
217
222
|
}) : "—")), /*#__PURE__*/ react.createElement(Grid.Column, {
|
|
218
223
|
span: 6
|
|
219
224
|
}, /*#__PURE__*/ react.createElement(Text, {
|
|
225
|
+
as: "div",
|
|
220
226
|
size: "sm",
|
|
221
227
|
className: "text-neutral-strong"
|
|
222
228
|
}, "Iterations"), /*#__PURE__*/ react.createElement(Text, {
|
|
@@ -1 +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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"}
|
|
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 as=\"div\" 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 as=\"div\" 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 as=\"div\" 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 as=\"div\" 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 as=\"div\" 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 as=\"div\" 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":";;;;;;;;;;;;AAeA,MAAMA,qBAGF;IACA,SAAS;IACT,SAAS;IACT,SAAS;IACT,QAAQ;IACR,SAAS;AACb;AAEA,MAAMC,aAAa,CAACC;IAChB,IAAIA,QAAAA,OACA,OAAO;IAEX,IAAI,AAAiB,YAAjB,OAAOA,OACP,IAAI;QACA,OAAOC,KAAK,SAAS,CAACA,KAAK,KAAK,CAACD,QAAQ,MAAM;IACnD,EAAE,OAAM;QACJ,OAAOA;IACX;IAEJ,OAAOC,KAAK,SAAS,CAACD,OAAO,MAAM;AACvC;AAQA,MAAME,eAAe,CAAC,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAqB;IAChE,IAAI,CAACF,MACD,OAAO;IAGX,OAAO,WAAP,GACI,oBAACG,QAAMA;QACH,SAAQ;QACR,MAAK;QACL,MAAMF,WAAW,WAAXA,GAAW,oBAACG,gCAAcA,QAAAA,WAAAA,GAAM,oBAACC,gCAAcA;QACrD,SAASH;;AAGrB;AASA,MAAMI,kBAAkB,CAAC,EAAEN,IAAI,EAAEO,KAAK,EAAEV,KAAK,EAAEW,UAAU,SAAS,EAAwB;IACtF,IAAI,CAACR,MACD,OAAO;IAGX,MAAMS,YAAYD,AAAY,kBAAZA,UAA4B,sBAAsB;IAEpE,OAAO,WAAP,GACI,oBAAC;QAAI,WAAU;qBACX,oBAACE,MAAIA;QAAC,MAAK;QAAK,WAAU;OACrBH,QAAAA,WAAAA,GAEL,oBAAC;QACG,WAAW,CAAC,oEAAoE,EAAEE,WAAW;OAE5Fb,WAAWC;AAI5B;AAQA,MAAMc,cAAc,CAAC,EAAEX,IAAI,EAAEY,KAAK,EAAEf,KAAK,EAAoB;IACzD,IAAI,CAACG,MACD,OAAO;IAGX,OAAO,WAAP,GACI,wDACI,oBAACa,WAASA,OAAAA,WAAAA,GACV,oBAAC,2BACG,oBAACC,SAAOA;QAAC,OAAO;QAAG,WAAU;OACxBF,QAAAA,WAAAA,GAEL,oBAACG,YAAUA;QAAC,OAAOlB;QAAO,UAAS;QAAO,UAAU;;AAIpE;AAQA,MAAMmB,qBAAqB,CAAC,EAAEhB,IAAI,EAAEiB,OAAO,EAAEf,OAAO,EAA2B;IAC3E,IAAI,CAACF,MACD,OAAO;IAGX,OAAO,WAAP,GACI,oBAAC;QAAI,WAAU;qBACX,oBAACG,QAAMA;QAAC,SAAQ;QAAW,MAAK;QAAK,SAASD;QAAS,UAAUe;OAC5DA,UAAU,eAAe;AAI1C;AASA,MAAMC,gBAAgB,CAAC,EAAEC,SAAS,EAAEC,UAAU,EAAEC,OAAO,EAAEC,QAAQ,EAAsB;IACnF,IAAI,CAACH,aAAa,CAACC,YACf,OAAO;IAGX,OAAO,WAAP,GACI,oBAAC;QAAI,WAAU;OACVD,YAAY,WAAZA,GACG,oBAAChB,QAAMA;QAAC,SAAQ;QAAY,MAAK;QAAK,oBAAM,oBAACoB,gBAAcA;QAAK,SAASF;OAAS,WAGlF,MACHD,aAAa,WAAbA,GACG,oBAACjB,QAAMA;QAAC,SAAQ;QAAY,MAAK;QAAK,oBAAM,oBAACqB,2BAAUA;QAAK,SAASF;OAAU,YAG/E;AAGhB;AAMA,MAAMG,cAAc,CAAC,EAAEC,IAAI,EAAoB;IAC3C,MAAM,CAACzB,UAAU0B,YAAY,GAAGC,SAAS;IACzC,MAAMC,UAAUH,AAAc,SAAdA,KAAK,IAAI,IAAaA,AAAcI,WAAdJ,KAAK,IAAI;IAC/C,MAAMK,WAAWL,AAAe,SAAfA,KAAK,KAAK,IAAaA,AAAeI,WAAfJ,KAAK,KAAK;IAClD,MAAMM,aAAaH,WAAWE;IAE9B,OAAO,WAAP,GACI,oBAAC;QAAI,WAAU;qBACX,oBAAC;QAAI,WAAU;qBACX,oBAAC;QAAI,WAAU;qBACX,oBAACE,KAAGA;QACA,SAASP,AAAc,YAAdA,KAAK,IAAI,GAAe,gBAAgB;QACjD,SAASA,KAAK,IAAI;uBAG1B,oBAAC;QAAI,WAAU;qBACX,oBAAChB,MAAIA;QAAC,MAAK;OAAMgB,KAAK,OAAO,kBAEjC,oBAAC;QAAI,WAAU;qBACX,oBAAChB,MAAIA;QAAC,MAAK;QAAK,WAAU;qBACtB,oBAACwB,SAAOA;QAAC,UAAUR,KAAK,SAAS;uBAErC,oBAAC3B,cAAYA;QACT,MAAMiC;QACN,UAAU/B;QACV,SAAS,IAAM0B,YAAY,CAAC1B;wBAIxC,oBAACK,iBAAeA;QAAC,MAAML,YAAY4B;QAAS,OAAM;QAAO,OAAOH,KAAK,IAAI;sBACzE,oBAACpB,iBAAeA;QACZ,MAAML,YAAY8B;QAClB,OAAM;QACN,OAAOL,KAAK,KAAK;QACjB,SAAQ;;AAIxB;AAUA,MAAMS,yCAAwBC,SAAS,SAA+B,EAClEC,IAAI,EACJC,IAAI,EACJC,OAAO,EACPlB,OAAO,EACPC,QAAQ,EACY;IACpB,MAAM,EAAEkB,SAAS,EAAE,GAAGC,WAAWC;IAEjCC,UAAU;QACN,IAAIL,MACKE,UAAU,IAAI,CAACH,KAAK,EAAE;IAEnC,GAAG;QAACG;QAAWH,KAAK,EAAE;QAAEC;KAAK;IAE7B,MAAM,EAAEM,EAAE,EAAE,GAAGJ;IAEf,MAAM,EAAE,kBAAkBK,qBAAqB,EAAE,GAAGC,sBAAsB;QACtE,OAAO;QACP,SAAS;IACb;IAEA,MAAM,EAAE,kBAAkBC,sBAAsB,EAAE,GAAGD,sBAAsB;QACvE,OAAO;QACP,SAAS;IACb;IAEA,MAAME,cAAcJ,GAAG,IAAI,IAAIP;IAC/B,MAAMlB,YAAY6B,AAA2B,cAA3BA,YAAY,UAAU;IACxC,MAAM5B,aACF4B,AAA2B,cAA3BA,YAAY,UAAU,IACtBA,AAA2B,aAA3BA,YAAY,UAAU,IACtBA,AAA2B,cAA3BA,YAAY,UAAU;IAE1B,MAAMC,YAAYrD,WAAWoD,YAAY,KAAK;IAC9C,MAAME,aAAatD,WAAWoD,YAAY,MAAM;IAEhD,OAAO,WAAP,GACI,oBAACG,QAAMA;QACH,MAAMb;QACN,cAAcc,CAAAA,SAAU,CAACA,UAAUb;QACnC,qBACI,oBAAC;YAAI,WAAU;yBACX,oBAAC,cAAMS,YAAY,IAAI,IAAIA,YAAY,YAAY,iBACnD,oBAACf,KAAGA;YACA,SAAStC,kBAAkB,CAACqD,YAAY,UAAU,CAAC,IAAI;YACvD,SAASA,YAAY,UAAU;;QAI3C,OAAO;QACP,OAAM;QACN,aAAa;QACb,uBACI,oBAAC9B,eAAaA;YACV,WAAWC;YACX,YAAYC;YACZ,SAAS,IAAMyB,sBAAsB,IAAMxB,QAAQ2B,YAAY,EAAE;YACjE,UAAU,IAAMD,uBAAuB,IAAMzB,SAAS0B,YAAY,EAAE;;qBAI5E,oBAAC;QAAI,WAAU;qBACX,oBAAC,2BACG,oBAAClC,SAAOA;QAAC,OAAO;QAAG,WAAU;OAAQ,+BAGrC,oBAACuC,MAAIA;QAAC,KAAI;qBACN,oBAACA,KAAK,MAAM;QAAC,MAAM;qBACf,oBAAC3C,MAAIA;QAAC,IAAG;QAAM,MAAK;QAAK,WAAU;OAAsB,6BAGzD,oBAACA,MAAIA;QAAC,MAAK;OAAMsC,YAAY,YAAY,kBAE7C,oBAACK,KAAK,MAAM;QAAC,MAAM;qBACf,oBAAC3C,MAAIA;QAAC,IAAG;QAAM,MAAK;QAAK,WAAU;OAAsB,6BAGzD,oBAACA,MAAIA;QAAC,MAAK;OAAMsC,YAAY,SAAS,EAAE,eAAe,qBAE3D,oBAACK,KAAK,MAAM;QAAC,MAAM;qBACf,oBAAC3C,MAAIA;QAAC,IAAG;QAAM,MAAK;QAAK,WAAU;OAAsB,6BAGzD,oBAACA,MAAIA;QAAC,MAAK;OACNsC,YAAY,SAAS,GAAG,WAAH,GAClB,oBAACd,SAAOA;QAAC,UAAUc,YAAY,SAAS;SAExC,qBAIZ,oBAACK,KAAK,MAAM;QAAC,MAAM;qBACf,oBAAC3C,MAAIA;QAAC,IAAG;QAAM,MAAK;QAAK,WAAU;OAAsB,6BAGzD,oBAACA,MAAIA;QAAC,MAAK;OACNsC,YAAY,SAAS,GAAG,WAAH,GAClB,oBAACd,SAAOA;QAAC,UAAUc,YAAY,SAAS;SAExC,qBAIZ,oBAACK,KAAK,MAAM;QAAC,MAAM;qBACf,oBAAC3C,MAAIA;QAAC,IAAG;QAAM,MAAK;QAAK,WAAU;OAAsB,8BAGzD,oBAACA,MAAIA;QAAC,MAAK;OACNsC,YAAY,UAAU,GAAG,WAAH,GACnB,oBAACd,SAAOA;QAAC,UAAUc,YAAY,UAAU;SAEzC,qBAIZ,oBAACK,KAAK,MAAM;QAAC,MAAM;qBACf,oBAAC3C,MAAIA;QAAC,IAAG;QAAM,MAAK;QAAK,WAAU;OAAsB,6BAGzD,oBAACA,MAAIA;QAAC,MAAK;OAAMsC,YAAY,UAAU,IAAI,qBAKvD,oBAACrC,aAAWA;QAAC,MAAM,CAAC,CAACsC;QAAW,OAAM;QAAQ,OAAOA;sBACrD,oBAACtC,aAAWA;QAAC,MAAM,CAAC,CAACuC;QAAY,OAAM;QAAS,OAAOA;sBAEvD,oBAACrC,WAASA,OAAAA,WAAAA,GACV,oBAAC,2BACG,oBAACC,SAAOA;QAAC,OAAO;QAAG,WAAU;OAAQ,UAC1B8B,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAC,MAExCA,AAAwB,MAAxBA,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAWA,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,GACL,cAIhD,oBAAC;QAAI,WAAU;OACVA,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAACU,MACfA,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC5B,MAAM6B,MAAAA,WAAAA,GACjB,oBAAC9B,aAAWA;gBAAC,KAAK,GAAG6B,IAAI,EAAE,CAAC,CAAC,EAAEC,KAAK;gBAAE,MAAM7B;oBARA,WAAH,GACrD,oBAAChB,MAAIA;QAAC,MAAK;QAAK,WAAU;OAAsB,uB,cAYpD,oBAACM,oBAAkBA;QACf,MAAM4B,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO;QAChC,SAASA,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO;QACnC,SAAS,IAAMJ,UAAU,QAAQ;;AAMzD;AAEO,MAAMgB,mBAAmB,CAACC;IAC7B,MAAMC,YAAYC;IAElB,MAAMC,kBAAkBC,QAAQ;QAC5B,MAAMC,QAAQJ,UAAU,oBAAoB;QAC5CK,eAAe,QAAQ,CAACD;QACxBE,gBAAgB,QAAQ,CAACF;QACzBpB,2BAA2B,QAAQ,CAACoB;QACpC,OAAOA;IACX,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACG,qBAAmBA;QAAC,WAAWL;qBAC5B,oBAACzB,wCAA0BsB;AAGvC"}
|
|
@@ -1,12 +1,13 @@
|
|
|
1
|
-
import react, { useCallback, useEffect, useMemo } from "react";
|
|
1
|
+
import react, { useCallback, useEffect, useMemo, useState } from "react";
|
|
2
2
|
import debounce from "lodash/debounce.js";
|
|
3
3
|
import { observer } from "mobx-react-lite";
|
|
4
4
|
import { DiContainerProvider, useContainer, useFeature } from "@webiny/app";
|
|
5
|
-
import {
|
|
5
|
+
import { DataTable, DatePicker, Drawer, DropdownMenu, Heading, IconButton, Input, Scrollbar, Select, Separator, Skeleton, Tag, Text, TimeAgo, useToast } from "@webiny/admin-ui";
|
|
6
6
|
import { useConfirmationDialog } from "@webiny/app-admin/hooks/index.js";
|
|
7
7
|
import { ReactComponent } from "@webiny/icons/more_vert.svg";
|
|
8
8
|
import { ReactComponent as delete_svg_ReactComponent } from "@webiny/icons/delete.svg";
|
|
9
9
|
import { ReactComponent as stop_circle_svg_ReactComponent } from "@webiny/icons/stop_circle.svg";
|
|
10
|
+
import { ReactComponent as filter_list_svg_ReactComponent } from "@webiny/icons/filter_list.svg";
|
|
10
11
|
import { TaskExecutionsPresenterFeature } from "../feature.js";
|
|
11
12
|
import { ListTasksFeature } from "../../../features/listTasks/feature.js";
|
|
12
13
|
import { DeleteTaskFeature } from "../../../features/deleteTask/feature.js";
|
|
@@ -192,28 +193,55 @@ const TaskExecutionsView_TaskExecutionsViewInner = observer(function() {
|
|
|
192
193
|
vm.permissions,
|
|
193
194
|
vm.definitionOptions
|
|
194
195
|
]);
|
|
196
|
+
const [filtersOpen, setFiltersOpen] = useState(false);
|
|
195
197
|
const hasFilters = Object.keys(vm.list.filters).length > 0;
|
|
198
|
+
const hasActiveFilters = hasFilters || !!vm.list.search;
|
|
199
|
+
const clearAllFilters = ()=>{
|
|
200
|
+
presenter.filter.clearAll();
|
|
201
|
+
presenter.search.set("");
|
|
202
|
+
};
|
|
196
203
|
return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement("div", {
|
|
197
204
|
className: "flex flex-col h-main-content"
|
|
198
205
|
}, /*#__PURE__*/ react.createElement("div", {
|
|
199
206
|
className: "flex items-center justify-between py-sm px-md"
|
|
200
207
|
}, /*#__PURE__*/ react.createElement(Heading, {
|
|
201
208
|
level: 5
|
|
202
|
-
}, "Task Executions"), /*#__PURE__*/ react.createElement(
|
|
203
|
-
className: "
|
|
204
|
-
}, /*#__PURE__*/ react.createElement(
|
|
205
|
-
|
|
209
|
+
}, "Task Executions"), /*#__PURE__*/ react.createElement("div", {
|
|
210
|
+
className: "flex items-center gap-sm"
|
|
211
|
+
}, /*#__PURE__*/ react.createElement(IconButton, {
|
|
212
|
+
variant: hasActiveFilters ? "primary" : "ghost",
|
|
213
|
+
icon: /*#__PURE__*/ react.createElement(filter_list_svg_ReactComponent, null),
|
|
214
|
+
onClick: ()=>setFiltersOpen(true),
|
|
215
|
+
"data-testid": "background-tasks.toggle-filters"
|
|
216
|
+
}), /*#__PURE__*/ react.createElement(TaskDefinitionsButton, null))), /*#__PURE__*/ react.createElement(Separator, null), /*#__PURE__*/ react.createElement(Drawer, {
|
|
217
|
+
open: filtersOpen,
|
|
218
|
+
onClose: ()=>setFiltersOpen(false),
|
|
219
|
+
modal: true,
|
|
220
|
+
width: 360,
|
|
221
|
+
title: "Filters",
|
|
222
|
+
headerSeparator: true,
|
|
223
|
+
footerSeparator: true,
|
|
224
|
+
bodyPadding: false,
|
|
225
|
+
actions: /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement(Drawer.CancelButton, {
|
|
226
|
+
text: "Clear all",
|
|
227
|
+
onClick: clearAllFilters
|
|
228
|
+
}), /*#__PURE__*/ react.createElement(Drawer.ConfirmButton, {
|
|
229
|
+
text: "Apply filters",
|
|
230
|
+
onClick: ()=>setFiltersOpen(false)
|
|
231
|
+
}))
|
|
232
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
233
|
+
className: "flex flex-col gap-lg p-lg"
|
|
206
234
|
}, /*#__PURE__*/ react.createElement(Input, {
|
|
207
235
|
size: "md",
|
|
236
|
+
label: "Search",
|
|
208
237
|
placeholder: "Search by name...",
|
|
209
238
|
value: vm.list.search,
|
|
210
239
|
onChange: (value)=>{
|
|
211
240
|
presenter.search.set(value);
|
|
212
241
|
}
|
|
213
|
-
})
|
|
214
|
-
span: 2
|
|
215
|
-
}, /*#__PURE__*/ react.createElement(Select, {
|
|
242
|
+
}), /*#__PURE__*/ react.createElement(Select, {
|
|
216
243
|
size: "md",
|
|
244
|
+
label: "Status",
|
|
217
245
|
placeholder: "Status",
|
|
218
246
|
options: STATUS_OPTIONS,
|
|
219
247
|
value: vm.list.filters.taskStatus_in ?? "",
|
|
@@ -221,10 +249,9 @@ const TaskExecutionsView_TaskExecutionsViewInner = observer(function() {
|
|
|
221
249
|
if (value) presenter.filter.set("taskStatus_in", value);
|
|
222
250
|
else presenter.filter.clear("taskStatus_in");
|
|
223
251
|
}
|
|
224
|
-
})
|
|
225
|
-
span: 2
|
|
226
|
-
}, /*#__PURE__*/ react.createElement(Select, {
|
|
252
|
+
}), vm.definitionOptions.length > 0 ? /*#__PURE__*/ react.createElement(Select, {
|
|
227
253
|
size: "md",
|
|
254
|
+
label: "Definition",
|
|
228
255
|
placeholder: "Definition",
|
|
229
256
|
options: vm.definitionOptions,
|
|
230
257
|
value: vm.list.filters.definitionId,
|
|
@@ -232,34 +259,27 @@ const TaskExecutionsView_TaskExecutionsViewInner = observer(function() {
|
|
|
232
259
|
if (value) presenter.filter.set("definitionId", value);
|
|
233
260
|
else presenter.filter.clear("definitionId");
|
|
234
261
|
}
|
|
235
|
-
})
|
|
236
|
-
span: 2
|
|
237
|
-
}, /*#__PURE__*/ react.createElement(DatePicker, {
|
|
262
|
+
}) : null, /*#__PURE__*/ react.createElement(DatePicker, {
|
|
238
263
|
size: "md",
|
|
239
264
|
type: "dateTimeTz",
|
|
265
|
+
label: "Created from",
|
|
240
266
|
placeholder: "Created from",
|
|
241
267
|
value: vm.list.filters.createdOn_gte,
|
|
242
268
|
onChange: (value)=>{
|
|
243
269
|
if (value) presenter.filter.set("createdOn_gte", value);
|
|
244
270
|
else presenter.filter.clear("createdOn_gte");
|
|
245
271
|
}
|
|
246
|
-
})
|
|
247
|
-
span: 2
|
|
248
|
-
}, /*#__PURE__*/ react.createElement(DatePicker, {
|
|
272
|
+
}), /*#__PURE__*/ react.createElement(DatePicker, {
|
|
249
273
|
size: "md",
|
|
250
274
|
type: "dateTimeTz",
|
|
275
|
+
label: "Created to",
|
|
251
276
|
placeholder: "Created to",
|
|
252
277
|
value: vm.list.filters.createdOn_lte,
|
|
253
278
|
onChange: (value)=>{
|
|
254
279
|
if (value) presenter.filter.set("createdOn_lte", value);
|
|
255
280
|
else presenter.filter.clear("createdOn_lte");
|
|
256
281
|
}
|
|
257
|
-
})), /*#__PURE__*/ react.createElement(
|
|
258
|
-
variant: "tertiary",
|
|
259
|
-
size: "md",
|
|
260
|
-
onClick: ()=>presenter.filter.clearAll(),
|
|
261
|
-
disabled: !hasFilters
|
|
262
|
-
}, "Clear filters"))), /*#__PURE__*/ react.createElement(Separator, null), /*#__PURE__*/ react.createElement("div", {
|
|
282
|
+
}))), /*#__PURE__*/ react.createElement("div", {
|
|
263
283
|
className: "flex-1 overflow-hidden"
|
|
264
284
|
}, vm.list.pagination.loading || vm.list.pagination.loadingMore || 0 !== vm.list.rows.length ? /*#__PURE__*/ react.createElement(Scrollbar, {
|
|
265
285
|
onScrollFrame: (scrollFrame)=>loadMoreOnScroll({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin/presentation/TaskExecutions/components/TaskExecutionsView.js","sources":["../../../../../src/admin/presentation/TaskExecutions/components/TaskExecutionsView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo } from \"react\";\nimport debounce from \"lodash/debounce.js\";\nimport { observer } from \"mobx-react-lite\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport type { DataTableSorting, OnDataTableSortingChange } from \"@webiny/admin-ui\";\nimport {\n Button,\n DataTable,\n DatePicker,\n DropdownMenu,\n Grid,\n Heading,\n IconButton,\n Input,\n Scrollbar,\n Select,\n Separator,\n Skeleton,\n Tag,\n Text,\n TimeAgo\n} from \"@webiny/admin-ui\";\nimport { useConfirmationDialog } from \"@webiny/app-admin/hooks/index.js\";\nimport { ReactComponent as MoreVerticalIcon } from \"@webiny/icons/more_vert.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport { ReactComponent as StopCircleIcon } from \"@webiny/icons/stop_circle.svg\";\nimport { useToast } from \"@webiny/admin-ui\";\nimport { TaskExecutionsPresenterFeature } from \"../feature.js\";\nimport { ListTasksFeature } from \"~/admin/features/listTasks/feature.js\";\nimport { DeleteTaskFeature } from \"~/admin/features/deleteTask/feature.js\";\nimport { AbortTaskFeature } from \"~/admin/features/abortTask/feature.js\";\nimport { ListDefinitionsFeature } from \"~/admin/features/listDefinitions/feature.js\";\nimport { TaskPermissionsFeature } from \"~/admin/features/permissions/feature.js\";\nimport type { Task, TaskStatus } from \"~/admin/shared/types.js\";\nimport { TaskDetailDrawer } from \"~/admin/presentation/TaskDetail/components/TaskDetailDrawer.js\";\nimport { TaskDefinitionsButton } from \"~/admin/presentation/TaskExecutions/components/TaskDefinitionsButton.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 STATUS_OPTIONS: { label: string; value: TaskStatus }[] = [\n { label: \"Pending\", value: \"pending\" },\n { label: \"Running\", value: \"running\" },\n { label: \"Success\", value: \"success\" },\n { label: \"Failed\", value: \"failed\" },\n { label: \"Aborted\", value: \"aborted\" }\n];\n\nconst TaskExecutionsViewInner = observer(function TaskExecutionsViewInner() {\n const { presenter } = useFeature(TaskExecutionsPresenterFeature);\n const toast = useToast();\n\n useEffect(() => {\n presenter.init();\n }, [presenter]);\n\n const { vm } = presenter;\n\n const loadMoreOnScroll = useMemo(\n () =>\n debounce(({ scrollFrame }: { scrollFrame: { top: number } }) => {\n if (scrollFrame.top > 0.8) {\n presenter.loadMore();\n }\n }, 200),\n [presenter]\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 { showConfirmation: showAbortConfirmation } = useConfirmationDialog({\n title: \"Abort Task\",\n message: \"Are you sure you want to abort this running task?\"\n });\n\n const sorting: DataTableSorting = useMemo(() => {\n const sort = vm.list.sort;\n if (!sort || !sort.field) {\n return [];\n }\n return [{ id: sort.field, desc: sort.direction === \"DESC\" }];\n }, [vm.list.sort]);\n\n const onSortingChange: OnDataTableSortingChange = useCallback(\n updater => {\n const next = typeof updater === \"function\" ? updater(sorting) : updater;\n if (next.length > 0) {\n const { id, desc } = next[0];\n presenter.sort.set(id, desc ? \"DESC\" : \"ASC\");\n }\n },\n [sorting, presenter.sort]\n );\n\n const columns = useMemo(\n () => ({\n name: {\n header: \"Name\",\n cell: (row: Task) => (\n <Text\n className=\"cursor-pointer text-primary hover:underline\"\n onClick={() => presenter.selectTask(row)}\n >\n {row.name || row.definitionId}\n </Text>\n ),\n enableSorting: true,\n size: 200\n },\n definitionId: {\n header: \"Definition\",\n cell: (row: Task) => {\n const def = vm.definitionOptions.find(d => d.value === row.definitionId);\n return <Text size=\"sm\">{def ? def.label : row.definitionId}</Text>;\n },\n enableSorting: true,\n size: 160\n },\n taskStatus: {\n header: \"Status\",\n cell: (row: Task) => (\n <Tag\n variant={STATUS_TAG_VARIANT[row.taskStatus] ?? \"neutral-light\"}\n content={row.taskStatus}\n />\n ),\n enableSorting: true,\n size: 100\n },\n createdOn: {\n header: \"Created\",\n cell: (row: Task) =>\n row.createdOn ? <TimeAgo datetime={row.createdOn} /> : <Text size=\"sm\">—</Text>,\n enableSorting: true,\n size: 120\n },\n startedOn: {\n header: \"Started\",\n cell: (row: Task) =>\n row.startedOn ? <TimeAgo datetime={row.startedOn} /> : <Text size=\"sm\">—</Text>,\n enableSorting: true,\n size: 120\n },\n finishedOn: {\n header: \"Finished\",\n cell: (row: Task) =>\n row.finishedOn ? (\n <TimeAgo datetime={row.finishedOn} />\n ) : (\n <Text size=\"sm\">—</Text>\n ),\n enableSorting: true,\n size: 120\n },\n actions: {\n header: \" \",\n cell: (row: Task) => {\n const isRunning = row.taskStatus === \"running\";\n const isTerminal =\n row.taskStatus === \"success\" ||\n row.taskStatus === \"failed\" ||\n row.taskStatus === \"aborted\";\n\n if (!isRunning && !isTerminal) {\n return null;\n }\n\n return (\n <DropdownMenu\n trigger={\n <IconButton\n icon={<MoreVerticalIcon />}\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Actions\"\n />\n }\n >\n {isRunning && (\n <DropdownMenu.Item\n text=\"Abort\"\n icon={<StopCircleIcon />}\n onClick={() => {\n showAbortConfirmation(() =>\n presenter.abortTask(row.id).then(() => {\n toast.showSuccessToast({ title: \"Task aborted.\" });\n })\n );\n }}\n />\n )}\n {isTerminal && vm.permissions.canDelete && (\n <>\n {isRunning && <DropdownMenu.Separator />}\n <DropdownMenu.Item\n text=\"Delete\"\n icon={<DeleteIcon />}\n onClick={() => {\n showDeleteConfirmation(() =>\n presenter.deleteTask(row.id).then(() => {\n toast.showSuccessToast({\n title: \"Task deleted.\"\n });\n })\n );\n }}\n />\n </>\n )}\n </DropdownMenu>\n );\n },\n size: 56,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false\n }\n }),\n [vm.permissions, vm.definitionOptions]\n );\n\n const hasFilters = Object.keys(vm.list.filters).length > 0;\n\n return (\n <>\n <div className=\"flex flex-col h-main-content\">\n <div className=\"flex items-center justify-between py-sm px-md\">\n <Heading level={5}>Task Executions</Heading>\n <TaskDefinitionsButton />\n </div>\n <Separator />\n <div className={\"p-sm\"}>\n <Grid>\n <Grid.Column span={2}>\n <Input\n size={\"md\"}\n placeholder=\"Search by name...\"\n value={vm.list.search}\n onChange={value => {\n presenter.search.set(value);\n }}\n />\n </Grid.Column>\n <Grid.Column span={2}>\n <Select\n size={\"md\"}\n placeholder=\"Status\"\n options={STATUS_OPTIONS}\n value={(vm.list.filters.taskStatus_in as string) ?? \"\"}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"taskStatus_in\", value);\n } else {\n presenter.filter.clear(\"taskStatus_in\");\n }\n }}\n />\n </Grid.Column>\n {vm.definitionOptions.length > 0 ? (\n <Grid.Column span={2}>\n <Select\n size={\"md\"}\n placeholder=\"Definition\"\n options={vm.definitionOptions}\n value={vm.list.filters.definitionId as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"definitionId\", value);\n } else {\n presenter.filter.clear(\"definitionId\");\n }\n }}\n />\n </Grid.Column>\n ) : null}\n <Grid.Column span={2}>\n <DatePicker\n size={\"md\"}\n type=\"dateTimeTz\"\n placeholder=\"Created from\"\n value={vm.list.filters.createdOn_gte as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"createdOn_gte\", value);\n } else {\n presenter.filter.clear(\"createdOn_gte\");\n }\n }}\n />\n </Grid.Column>\n <Grid.Column span={2}>\n <DatePicker\n size={\"md\"}\n type=\"dateTimeTz\"\n placeholder=\"Created to\"\n value={vm.list.filters.createdOn_lte as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"createdOn_lte\", value);\n } else {\n presenter.filter.clear(\"createdOn_lte\");\n }\n }}\n />\n </Grid.Column>\n <Button\n variant=\"tertiary\"\n size=\"md\"\n onClick={() => presenter.filter.clearAll()}\n disabled={!hasFilters}\n >\n Clear filters\n </Button>\n </Grid>\n </div>\n <Separator />\n <div className=\"flex-1 overflow-hidden\">\n {!vm.list.pagination.loading &&\n !vm.list.pagination.loadingMore &&\n vm.list.rows.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full gap-md\">\n <Text className=\"text-neutral-strong\">No tasks found.</Text>\n </div>\n ) : (\n <Scrollbar onScrollFrame={scrollFrame => loadMoreOnScroll({ scrollFrame })}>\n <DataTable<Task>\n columns={columns}\n data={vm.list.rows}\n loading={vm.list.pagination.loading}\n sorting={sorting}\n onSortingChange={onSortingChange}\n stickyHeader\n />\n {vm.list.pagination.loadingMore ? (\n <div className=\"flex flex-col gap-sm p-md\">\n <Skeleton className=\"h-8 w-full\" />\n <Skeleton className=\"h-8 w-full\" />\n </div>\n ) : null}\n </Scrollbar>\n )}\n </div>\n </div>\n {presenter.selectedTask && (\n <TaskDetailDrawer\n task={presenter.selectedTask}\n open={!!presenter.selectedTask}\n onClose={() => presenter.selectTask(null)}\n onAbort={async (id: string) => {\n await presenter.abortTask(id);\n toast.showSuccessToast({ title: \"Task aborted.\" });\n }}\n onDelete={async (id: string) => {\n await presenter.deleteTask(id);\n toast.showSuccessToast({ title: \"Task deleted.\" });\n }}\n />\n )}\n </>\n );\n});\n\nexport const TaskExecutionsView = () => {\n const container = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = container.createChildContainer();\n ListTasksFeature.register(child);\n DeleteTaskFeature.register(child);\n AbortTaskFeature.register(child);\n ListDefinitionsFeature.register(child);\n TaskPermissionsFeature.register(child);\n TaskExecutionsPresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <TaskExecutionsViewInner />\n </DiContainerProvider>\n );\n};\n"],"names":["STATUS_TAG_VARIANT","STATUS_OPTIONS","TaskExecutionsViewInner","observer","presenter","useFeature","TaskExecutionsPresenterFeature","toast","useToast","useEffect","vm","loadMoreOnScroll","useMemo","debounce","scrollFrame","showDeleteConfirmation","useConfirmationDialog","showAbortConfirmation","sorting","sort","onSortingChange","useCallback","updater","next","id","desc","columns","row","Text","def","d","Tag","TimeAgo","isRunning","isTerminal","DropdownMenu","IconButton","MoreVerticalIcon","StopCircleIcon","DeleteIcon","hasFilters","Object","Heading","TaskDefinitionsButton","Separator","Grid","Input","value","Select","DatePicker","Button","Scrollbar","DataTable","Skeleton","TaskDetailDrawer","TaskExecutionsView","container","useContainer","scopedContainer","child","ListTasksFeature","DeleteTaskFeature","AbortTaskFeature","ListDefinitionsFeature","TaskPermissionsFeature","DiContainerProvider"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin/presentation/TaskExecutions/components/TaskExecutionsView.js","sources":["../../../../../src/admin/presentation/TaskExecutions/components/TaskExecutionsView.tsx"],"sourcesContent":["import React, { useCallback, useEffect, useMemo, useState } from \"react\";\nimport debounce from \"lodash/debounce.js\";\nimport { observer } from \"mobx-react-lite\";\nimport { DiContainerProvider, useContainer, useFeature } from \"@webiny/app\";\nimport type { DataTableSorting, OnDataTableSortingChange } from \"@webiny/admin-ui\";\nimport {\n DataTable,\n DatePicker,\n Drawer,\n DropdownMenu,\n Heading,\n IconButton,\n Input,\n Scrollbar,\n Select,\n Separator,\n Skeleton,\n Tag,\n Text,\n TimeAgo\n} from \"@webiny/admin-ui\";\nimport { useConfirmationDialog } from \"@webiny/app-admin/hooks/index.js\";\nimport { ReactComponent as MoreVerticalIcon } from \"@webiny/icons/more_vert.svg\";\nimport { ReactComponent as DeleteIcon } from \"@webiny/icons/delete.svg\";\nimport { ReactComponent as StopCircleIcon } from \"@webiny/icons/stop_circle.svg\";\nimport { ReactComponent as FilterIcon } from \"@webiny/icons/filter_list.svg\";\nimport { useToast } from \"@webiny/admin-ui\";\nimport { TaskExecutionsPresenterFeature } from \"../feature.js\";\nimport { ListTasksFeature } from \"~/admin/features/listTasks/feature.js\";\nimport { DeleteTaskFeature } from \"~/admin/features/deleteTask/feature.js\";\nimport { AbortTaskFeature } from \"~/admin/features/abortTask/feature.js\";\nimport { ListDefinitionsFeature } from \"~/admin/features/listDefinitions/feature.js\";\nimport { TaskPermissionsFeature } from \"~/admin/features/permissions/feature.js\";\nimport type { Task, TaskStatus } from \"~/admin/shared/types.js\";\nimport { TaskDetailDrawer } from \"~/admin/presentation/TaskDetail/components/TaskDetailDrawer.js\";\nimport { TaskDefinitionsButton } from \"~/admin/presentation/TaskExecutions/components/TaskDefinitionsButton.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 STATUS_OPTIONS: { label: string; value: TaskStatus }[] = [\n { label: \"Pending\", value: \"pending\" },\n { label: \"Running\", value: \"running\" },\n { label: \"Success\", value: \"success\" },\n { label: \"Failed\", value: \"failed\" },\n { label: \"Aborted\", value: \"aborted\" }\n];\n\nconst TaskExecutionsViewInner = observer(function TaskExecutionsViewInner() {\n const { presenter } = useFeature(TaskExecutionsPresenterFeature);\n const toast = useToast();\n\n useEffect(() => {\n presenter.init();\n }, [presenter]);\n\n const { vm } = presenter;\n\n const loadMoreOnScroll = useMemo(\n () =>\n debounce(({ scrollFrame }: { scrollFrame: { top: number } }) => {\n if (scrollFrame.top > 0.8) {\n presenter.loadMore();\n }\n }, 200),\n [presenter]\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 { showConfirmation: showAbortConfirmation } = useConfirmationDialog({\n title: \"Abort Task\",\n message: \"Are you sure you want to abort this running task?\"\n });\n\n const sorting: DataTableSorting = useMemo(() => {\n const sort = vm.list.sort;\n if (!sort || !sort.field) {\n return [];\n }\n return [{ id: sort.field, desc: sort.direction === \"DESC\" }];\n }, [vm.list.sort]);\n\n const onSortingChange: OnDataTableSortingChange = useCallback(\n updater => {\n const next = typeof updater === \"function\" ? updater(sorting) : updater;\n if (next.length > 0) {\n const { id, desc } = next[0];\n presenter.sort.set(id, desc ? \"DESC\" : \"ASC\");\n }\n },\n [sorting, presenter.sort]\n );\n\n const columns = useMemo(\n () => ({\n name: {\n header: \"Name\",\n cell: (row: Task) => (\n <Text\n className=\"cursor-pointer text-primary hover:underline\"\n onClick={() => presenter.selectTask(row)}\n >\n {row.name || row.definitionId}\n </Text>\n ),\n enableSorting: true,\n size: 200\n },\n definitionId: {\n header: \"Definition\",\n cell: (row: Task) => {\n const def = vm.definitionOptions.find(d => d.value === row.definitionId);\n return <Text size=\"sm\">{def ? def.label : row.definitionId}</Text>;\n },\n enableSorting: true,\n size: 160\n },\n taskStatus: {\n header: \"Status\",\n cell: (row: Task) => (\n <Tag\n variant={STATUS_TAG_VARIANT[row.taskStatus] ?? \"neutral-light\"}\n content={row.taskStatus}\n />\n ),\n enableSorting: true,\n size: 100\n },\n createdOn: {\n header: \"Created\",\n cell: (row: Task) =>\n row.createdOn ? <TimeAgo datetime={row.createdOn} /> : <Text size=\"sm\">—</Text>,\n enableSorting: true,\n size: 120\n },\n startedOn: {\n header: \"Started\",\n cell: (row: Task) =>\n row.startedOn ? <TimeAgo datetime={row.startedOn} /> : <Text size=\"sm\">—</Text>,\n enableSorting: true,\n size: 120\n },\n finishedOn: {\n header: \"Finished\",\n cell: (row: Task) =>\n row.finishedOn ? (\n <TimeAgo datetime={row.finishedOn} />\n ) : (\n <Text size=\"sm\">—</Text>\n ),\n enableSorting: true,\n size: 120\n },\n actions: {\n header: \" \",\n cell: (row: Task) => {\n const isRunning = row.taskStatus === \"running\";\n const isTerminal =\n row.taskStatus === \"success\" ||\n row.taskStatus === \"failed\" ||\n row.taskStatus === \"aborted\";\n\n if (!isRunning && !isTerminal) {\n return null;\n }\n\n return (\n <DropdownMenu\n trigger={\n <IconButton\n icon={<MoreVerticalIcon />}\n variant=\"ghost\"\n size=\"sm\"\n aria-label=\"Actions\"\n />\n }\n >\n {isRunning && (\n <DropdownMenu.Item\n text=\"Abort\"\n icon={<StopCircleIcon />}\n onClick={() => {\n showAbortConfirmation(() =>\n presenter.abortTask(row.id).then(() => {\n toast.showSuccessToast({ title: \"Task aborted.\" });\n })\n );\n }}\n />\n )}\n {isTerminal && vm.permissions.canDelete && (\n <>\n {isRunning && <DropdownMenu.Separator />}\n <DropdownMenu.Item\n text=\"Delete\"\n icon={<DeleteIcon />}\n onClick={() => {\n showDeleteConfirmation(() =>\n presenter.deleteTask(row.id).then(() => {\n toast.showSuccessToast({\n title: \"Task deleted.\"\n });\n })\n );\n }}\n />\n </>\n )}\n </DropdownMenu>\n );\n },\n size: 56,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false\n }\n }),\n [vm.permissions, vm.definitionOptions]\n );\n\n const [filtersOpen, setFiltersOpen] = useState(false);\n const hasFilters = Object.keys(vm.list.filters).length > 0;\n const hasActiveFilters = hasFilters || !!vm.list.search;\n\n const clearAllFilters = () => {\n presenter.filter.clearAll();\n presenter.search.set(\"\");\n };\n\n return (\n <>\n <div className=\"flex flex-col h-main-content\">\n <div className=\"flex items-center justify-between py-sm px-md\">\n <Heading level={5}>Task Executions</Heading>\n <div className=\"flex items-center gap-sm\">\n <IconButton\n variant={hasActiveFilters ? \"primary\" : \"ghost\"}\n icon={<FilterIcon />}\n onClick={() => setFiltersOpen(true)}\n data-testid=\"background-tasks.toggle-filters\"\n />\n <TaskDefinitionsButton />\n </div>\n </div>\n <Separator />\n <Drawer\n open={filtersOpen}\n onClose={() => setFiltersOpen(false)}\n modal={true}\n width={360}\n title=\"Filters\"\n headerSeparator={true}\n footerSeparator={true}\n bodyPadding={false}\n actions={\n <>\n <Drawer.CancelButton text=\"Clear all\" onClick={clearAllFilters} />\n <Drawer.ConfirmButton\n text=\"Apply filters\"\n onClick={() => setFiltersOpen(false)}\n />\n </>\n }\n >\n <div className=\"flex flex-col gap-lg p-lg\">\n <Input\n size={\"md\"}\n label=\"Search\"\n placeholder=\"Search by name...\"\n value={vm.list.search}\n onChange={value => {\n presenter.search.set(value);\n }}\n />\n <Select\n size={\"md\"}\n label=\"Status\"\n placeholder=\"Status\"\n options={STATUS_OPTIONS}\n value={(vm.list.filters.taskStatus_in as string) ?? \"\"}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"taskStatus_in\", value);\n } else {\n presenter.filter.clear(\"taskStatus_in\");\n }\n }}\n />\n {vm.definitionOptions.length > 0 ? (\n <Select\n size={\"md\"}\n label=\"Definition\"\n placeholder=\"Definition\"\n options={vm.definitionOptions}\n value={vm.list.filters.definitionId as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"definitionId\", value);\n } else {\n presenter.filter.clear(\"definitionId\");\n }\n }}\n />\n ) : null}\n <DatePicker\n size={\"md\"}\n type=\"dateTimeTz\"\n label=\"Created from\"\n placeholder=\"Created from\"\n value={vm.list.filters.createdOn_gte as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"createdOn_gte\", value);\n } else {\n presenter.filter.clear(\"createdOn_gte\");\n }\n }}\n />\n <DatePicker\n size={\"md\"}\n type=\"dateTimeTz\"\n label=\"Created to\"\n placeholder=\"Created to\"\n value={vm.list.filters.createdOn_lte as string}\n onChange={value => {\n if (value) {\n presenter.filter.set(\"createdOn_lte\", value);\n } else {\n presenter.filter.clear(\"createdOn_lte\");\n }\n }}\n />\n </div>\n </Drawer>\n <div className=\"flex-1 overflow-hidden\">\n {!vm.list.pagination.loading &&\n !vm.list.pagination.loadingMore &&\n vm.list.rows.length === 0 ? (\n <div className=\"flex flex-col items-center justify-center h-full gap-md\">\n <Text className=\"text-neutral-strong\">No tasks found.</Text>\n </div>\n ) : (\n <Scrollbar onScrollFrame={scrollFrame => loadMoreOnScroll({ scrollFrame })}>\n <DataTable<Task>\n columns={columns}\n data={vm.list.rows}\n loading={vm.list.pagination.loading}\n sorting={sorting}\n onSortingChange={onSortingChange}\n stickyHeader\n />\n {vm.list.pagination.loadingMore ? (\n <div className=\"flex flex-col gap-sm p-md\">\n <Skeleton className=\"h-8 w-full\" />\n <Skeleton className=\"h-8 w-full\" />\n </div>\n ) : null}\n </Scrollbar>\n )}\n </div>\n </div>\n {presenter.selectedTask && (\n <TaskDetailDrawer\n task={presenter.selectedTask}\n open={!!presenter.selectedTask}\n onClose={() => presenter.selectTask(null)}\n onAbort={async (id: string) => {\n await presenter.abortTask(id);\n toast.showSuccessToast({ title: \"Task aborted.\" });\n }}\n onDelete={async (id: string) => {\n await presenter.deleteTask(id);\n toast.showSuccessToast({ title: \"Task deleted.\" });\n }}\n />\n )}\n </>\n );\n});\n\nexport const TaskExecutionsView = () => {\n const container = useContainer();\n\n const scopedContainer = useMemo(() => {\n const child = container.createChildContainer();\n ListTasksFeature.register(child);\n DeleteTaskFeature.register(child);\n AbortTaskFeature.register(child);\n ListDefinitionsFeature.register(child);\n TaskPermissionsFeature.register(child);\n TaskExecutionsPresenterFeature.register(child);\n return child;\n }, []);\n\n return (\n <DiContainerProvider container={scopedContainer}>\n <TaskExecutionsViewInner />\n </DiContainerProvider>\n );\n};\n"],"names":["STATUS_TAG_VARIANT","STATUS_OPTIONS","TaskExecutionsViewInner","observer","presenter","useFeature","TaskExecutionsPresenterFeature","toast","useToast","useEffect","vm","loadMoreOnScroll","useMemo","debounce","scrollFrame","showDeleteConfirmation","useConfirmationDialog","showAbortConfirmation","sorting","sort","onSortingChange","useCallback","updater","next","id","desc","columns","row","Text","def","d","Tag","TimeAgo","isRunning","isTerminal","DropdownMenu","IconButton","MoreVerticalIcon","StopCircleIcon","DeleteIcon","filtersOpen","setFiltersOpen","useState","hasFilters","Object","hasActiveFilters","clearAllFilters","Heading","FilterIcon","TaskDefinitionsButton","Separator","Drawer","Input","value","Select","DatePicker","Scrollbar","DataTable","Skeleton","TaskDetailDrawer","TaskExecutionsView","container","useContainer","scopedContainer","child","ListTasksFeature","DeleteTaskFeature","AbortTaskFeature","ListDefinitionsFeature","TaskPermissionsFeature","DiContainerProvider"],"mappings":";;;;;;;;;;;;;;;;;;AAqCA,MAAMA,qBAGF;IACA,SAAS;IACT,SAAS;IACT,SAAS;IACT,QAAQ;IACR,SAAS;AACb;AAEA,MAAMC,iBAAyD;IAC3D;QAAE,OAAO;QAAW,OAAO;IAAU;IACrC;QAAE,OAAO;QAAW,OAAO;IAAU;IACrC;QAAE,OAAO;QAAW,OAAO;IAAU;IACrC;QAAE,OAAO;QAAU,OAAO;IAAS;IACnC;QAAE,OAAO;QAAW,OAAO;IAAU;CACxC;AAED,MAAMC,6CAA0BC,SAAS;IACrC,MAAM,EAAEC,SAAS,EAAE,GAAGC,WAAWC;IACjC,MAAMC,QAAQC;IAEdC,UAAU;QACNL,UAAU,IAAI;IAClB,GAAG;QAACA;KAAU;IAEd,MAAM,EAAEM,EAAE,EAAE,GAAGN;IAEf,MAAMO,mBAAmBC,QACrB,IACIC,SAAS,CAAC,EAAEC,WAAW,EAAoC;YACvD,IAAIA,YAAY,GAAG,GAAG,KAClBV,UAAU,QAAQ;QAE1B,GAAG,MACP;QAACA;KAAU;IAGf,MAAM,EAAE,kBAAkBW,sBAAsB,EAAE,GAAGC,sBAAsB;QACvE,OAAO;QACP,SAAS;IACb;IAEA,MAAM,EAAE,kBAAkBC,qBAAqB,EAAE,GAAGD,sBAAsB;QACtE,OAAO;QACP,SAAS;IACb;IAEA,MAAME,UAA4BN,QAAQ;QACtC,MAAMO,OAAOT,GAAG,IAAI,CAAC,IAAI;QACzB,IAAI,CAACS,QAAQ,CAACA,KAAK,KAAK,EACpB,OAAO,EAAE;QAEb,OAAO;YAAC;gBAAE,IAAIA,KAAK,KAAK;gBAAE,MAAMA,AAAmB,WAAnBA,KAAK,SAAS;YAAY;SAAE;IAChE,GAAG;QAACT,GAAG,IAAI,CAAC,IAAI;KAAC;IAEjB,MAAMU,kBAA4CC,YAC9CC,CAAAA;QACI,MAAMC,OAAO,AAAmB,cAAnB,OAAOD,UAAyBA,QAAQJ,WAAWI;QAChE,IAAIC,KAAK,MAAM,GAAG,GAAG;YACjB,MAAM,EAAEC,EAAE,EAAEC,IAAI,EAAE,GAAGF,IAAI,CAAC,EAAE;YAC5BnB,UAAU,IAAI,CAAC,GAAG,CAACoB,IAAIC,OAAO,SAAS;QAC3C;IACJ,GACA;QAACP;QAASd,UAAU,IAAI;KAAC;IAG7B,MAAMsB,UAAUd,QACZ,IAAO;YACH,MAAM;gBACF,QAAQ;gBACR,MAAM,CAACe,MAAAA,WAAAA,GACH,oBAACC,MAAIA;wBACD,WAAU;wBACV,SAAS,IAAMxB,UAAU,UAAU,CAACuB;uBAEnCA,IAAI,IAAI,IAAIA,IAAI,YAAY;gBAGrC,eAAe;gBACf,MAAM;YACV;YACA,cAAc;gBACV,QAAQ;gBACR,MAAM,CAACA;oBACH,MAAME,MAAMnB,GAAG,iBAAiB,CAAC,IAAI,CAACoB,CAAAA,IAAKA,EAAE,KAAK,KAAKH,IAAI,YAAY;oBACvE,OAAO,WAAP,GAAO,oBAACC,MAAIA;wBAAC,MAAK;uBAAMC,MAAMA,IAAI,KAAK,GAAGF,IAAI,YAAY;gBAC9D;gBACA,eAAe;gBACf,MAAM;YACV;YACA,YAAY;gBACR,QAAQ;gBACR,MAAM,CAACA,MAAAA,WAAAA,GACH,oBAACI,KAAGA;wBACA,SAAS/B,kBAAkB,CAAC2B,IAAI,UAAU,CAAC,IAAI;wBAC/C,SAASA,IAAI,UAAU;;gBAG/B,eAAe;gBACf,MAAM;YACV;YACA,WAAW;gBACP,QAAQ;gBACR,MAAM,CAACA,MACHA,IAAI,SAAS,GAAG,WAAH,GAAG,oBAACK,SAAOA;wBAAC,UAAUL,IAAI,SAAS;uCAAO,oBAACC,MAAIA;wBAAC,MAAK;uBAAK;gBAC3E,eAAe;gBACf,MAAM;YACV;YACA,WAAW;gBACP,QAAQ;gBACR,MAAM,CAACD,MACHA,IAAI,SAAS,GAAG,WAAH,GAAG,oBAACK,SAAOA;wBAAC,UAAUL,IAAI,SAAS;uCAAO,oBAACC,MAAIA;wBAAC,MAAK;uBAAK;gBAC3E,eAAe;gBACf,MAAM;YACV;YACA,YAAY;gBACR,QAAQ;gBACR,MAAM,CAACD,MACHA,IAAI,UAAU,GAAG,WAAH,GACV,oBAACK,SAAOA;wBAAC,UAAUL,IAAI,UAAU;uCAEjC,oBAACC,MAAIA;wBAAC,MAAK;uBAAK;gBAExB,eAAe;gBACf,MAAM;YACV;YACA,SAAS;gBACL,QAAQ;gBACR,MAAM,CAACD;oBACH,MAAMM,YAAYN,AAAmB,cAAnBA,IAAI,UAAU;oBAChC,MAAMO,aACFP,AAAmB,cAAnBA,IAAI,UAAU,IACdA,AAAmB,aAAnBA,IAAI,UAAU,IACdA,AAAmB,cAAnBA,IAAI,UAAU;oBAElB,IAAI,CAACM,aAAa,CAACC,YACf,OAAO;oBAGX,OAAO,WAAP,GACI,oBAACC,cAAYA;wBACT,uBACI,oBAACC,YAAUA;4BACP,oBAAM,oBAACC,gBAAgBA;4BACvB,SAAQ;4BACR,MAAK;4BACL,cAAW;;uBAIlBJ,aAAa,WAAbA,GACG,oBAACE,aAAa,IAAI;wBACd,MAAK;wBACL,oBAAM,oBAACG,gCAAcA;wBACrB,SAAS;4BACLrB,sBAAsB,IAClBb,UAAU,SAAS,CAACuB,IAAI,EAAE,EAAE,IAAI,CAAC;oCAC7BpB,MAAM,gBAAgB,CAAC;wCAAE,OAAO;oCAAgB;gCACpD;wBAER;wBAGP2B,cAAcxB,GAAG,WAAW,CAAC,SAAS,IAAI,WAAJ,GACnC,0CACKuB,aAAa,WAAbA,GAAa,oBAACE,aAAa,SAAS,uBACrC,oBAACA,aAAa,IAAI;wBACd,MAAK;wBACL,oBAAM,oBAACI,2BAAUA;wBACjB,SAAS;4BACLxB,uBAAuB,IACnBX,UAAU,UAAU,CAACuB,IAAI,EAAE,EAAE,IAAI,CAAC;oCAC9BpB,MAAM,gBAAgB,CAAC;wCACnB,OAAO;oCACX;gCACJ;wBAER;;gBAMxB;gBACA,MAAM;gBACN,eAAe;gBACf,cAAc;gBACd,gBAAgB;YACpB;QACJ,IACA;QAACG,GAAG,WAAW;QAAEA,GAAG,iBAAiB;KAAC;IAG1C,MAAM,CAAC8B,aAAaC,eAAe,GAAGC,SAAS;IAC/C,MAAMC,aAAaC,OAAO,IAAI,CAAClC,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG;IACzD,MAAMmC,mBAAmBF,cAAc,CAAC,CAACjC,GAAG,IAAI,CAAC,MAAM;IAEvD,MAAMoC,kBAAkB;QACpB1C,UAAU,MAAM,CAAC,QAAQ;QACzBA,UAAU,MAAM,CAAC,GAAG,CAAC;IACzB;IAEA,OAAO,WAAP,GACI,wDACI,oBAAC;QAAI,WAAU;qBACX,oBAAC;QAAI,WAAU;qBACX,oBAAC2C,SAAOA;QAAC,OAAO;OAAG,kCACnB,oBAAC;QAAI,WAAU;qBACX,oBAACX,YAAUA;QACP,SAASS,mBAAmB,YAAY;QACxC,oBAAM,oBAACG,gCAAUA;QACjB,SAAS,IAAMP,eAAe;QAC9B,eAAY;sBAEhB,oBAACQ,uBAAqBA,SAAAA,WAAAA,GAG9B,oBAACC,WAASA,OAAAA,WAAAA,GACV,oBAACC,QAAMA;QACH,MAAMX;QACN,SAAS,IAAMC,eAAe;QAC9B,OAAO;QACP,OAAO;QACP,OAAM;QACN,iBAAiB;QACjB,iBAAiB;QACjB,aAAa;QACb,uBACI,wDACI,oBAACU,OAAO,YAAY;YAAC,MAAK;YAAY,SAASL;0BAC/C,oBAACK,OAAO,aAAa;YACjB,MAAK;YACL,SAAS,IAAMV,eAAe;;qBAK1C,oBAAC;QAAI,WAAU;qBACX,oBAACW,OAAKA;QACF,MAAM;QACN,OAAM;QACN,aAAY;QACZ,OAAO1C,GAAG,IAAI,CAAC,MAAM;QACrB,UAAU2C,CAAAA;YACNjD,UAAU,MAAM,CAAC,GAAG,CAACiD;QACzB;sBAEJ,oBAACC,QAAMA;QACH,MAAM;QACN,OAAM;QACN,aAAY;QACZ,SAASrD;QACT,OAAQS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,IAAe;QACpD,UAAU2C,CAAAA;YACN,IAAIA,OACAjD,UAAU,MAAM,CAAC,GAAG,CAAC,iBAAiBiD;iBAEtCjD,UAAU,MAAM,CAAC,KAAK,CAAC;QAE/B;QAEHM,GAAG,iBAAiB,CAAC,MAAM,GAAG,IAAI,WAAJ,GAC3B,oBAAC4C,QAAMA;QACH,MAAM;QACN,OAAM;QACN,aAAY;QACZ,SAAS5C,GAAG,iBAAiB;QAC7B,OAAOA,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY;QACnC,UAAU2C,CAAAA;YACN,IAAIA,OACAjD,UAAU,MAAM,CAAC,GAAG,CAAC,gBAAgBiD;iBAErCjD,UAAU,MAAM,CAAC,KAAK,CAAC;QAE/B;SAEJ,oBACJ,oBAACmD,YAAUA;QACP,MAAM;QACN,MAAK;QACL,OAAM;QACN,aAAY;QACZ,OAAO7C,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;QACpC,UAAU2C,CAAAA;YACN,IAAIA,OACAjD,UAAU,MAAM,CAAC,GAAG,CAAC,iBAAiBiD;iBAEtCjD,UAAU,MAAM,CAAC,KAAK,CAAC;QAE/B;sBAEJ,oBAACmD,YAAUA;QACP,MAAM;QACN,MAAK;QACL,OAAM;QACN,aAAY;QACZ,OAAO7C,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa;QACpC,UAAU2C,CAAAA;YACN,IAAIA,OACAjD,UAAU,MAAM,CAAC,GAAG,CAAC,iBAAiBiD;iBAEtCjD,UAAU,MAAM,CAAC,KAAK,CAAC;QAE/B;wBAIZ,oBAAC;QAAI,WAAU;OACV,AAACM,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO,IAC3BA,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,IAC/BA,AAAwB,MAAxBA,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,GAE2B,cAG1C,oBAAC8C,WAASA;QAAC,eAAe1C,CAAAA,cAAeH,iBAAiB;gBAAEG;YAAY;qBACpE,oBAAC2C,WAASA;QACN,SAAS/B;QACT,MAAMhB,GAAG,IAAI,CAAC,IAAI;QAClB,SAASA,GAAG,IAAI,CAAC,UAAU,CAAC,OAAO;QACnC,SAASQ;QACT,iBAAiBE;QACjB;QAEHV,GAAG,IAAI,CAAC,UAAU,CAAC,WAAW,GAAG,WAAH,GAC3B,oBAAC;QAAI,WAAU;qBACX,oBAACgD,UAAQA;QAAC,WAAU;sBACpB,oBAACA,UAAQA;QAAC,WAAU;UAExB,QAnBgB,WAAJ,GACpB,oBAAC;QAAI,WAAU;qBACX,oBAAC9B,MAAIA;QAAC,WAAU;OAAsB,uBAsBrDxB,UAAU,YAAY,IAAI,WAAJ,GACnB,oBAACuD,kBAAgBA;QACb,MAAMvD,UAAU,YAAY;QAC5B,MAAM,CAAC,CAACA,UAAU,YAAY;QAC9B,SAAS,IAAMA,UAAU,UAAU,CAAC;QACpC,SAAS,OAAOoB;YACZ,MAAMpB,UAAU,SAAS,CAACoB;YAC1BjB,MAAM,gBAAgB,CAAC;gBAAE,OAAO;YAAgB;QACpD;QACA,UAAU,OAAOiB;YACb,MAAMpB,UAAU,UAAU,CAACoB;YAC3BjB,MAAM,gBAAgB,CAAC;gBAAE,OAAO;YAAgB;QACpD;;AAKpB;AAEO,MAAMqD,qBAAqB;IAC9B,MAAMC,YAAYC;IAElB,MAAMC,kBAAkBnD,QAAQ;QAC5B,MAAMoD,QAAQH,UAAU,oBAAoB;QAC5CI,iBAAiB,QAAQ,CAACD;QAC1BE,kBAAkB,QAAQ,CAACF;QAC3BG,iBAAiB,QAAQ,CAACH;QAC1BI,uBAAuB,QAAQ,CAACJ;QAChCK,uBAAuB,QAAQ,CAACL;QAChC1D,+BAA+B,QAAQ,CAAC0D;QACxC,OAAOA;IACX,GAAG,EAAE;IAEL,OAAO,WAAP,GACI,oBAACM,qBAAmBA;QAAC,WAAWP;qBAC5B,oBAAC7D,4CAAuBA;AAGpC"}
|
|
@@ -10,6 +10,7 @@ import { createDefinitionCrud } from "./crud/definition.tasks.js";
|
|
|
10
10
|
import { createServiceCrud } from "./crud/service.tasks.js";
|
|
11
11
|
import { createTaskCrud } from "./crud/crud.tasks.js";
|
|
12
12
|
import { TaskExecutionContextFeature } from "./features/TaskExecutionContext/feature.js";
|
|
13
|
+
import { TaskHandlerResolverFeature } from "./features/TaskHandlerResolver/feature.js";
|
|
13
14
|
import { GetTaskDefinitionFeature } from "./features/GetTaskDefinition/feature.js";
|
|
14
15
|
import { ListTaskDefinitionsFeature } from "./features/ListTaskDefinitions/feature.js";
|
|
15
16
|
import { CleanupTaskSubtreeUseCase, CleanupTaskSubtreeUseCaseImpl } from "./features/CleanupTaskSubtree/index.js";
|
|
@@ -31,6 +32,7 @@ const BackgroundTasksFeature = createFeature({
|
|
|
31
32
|
container.register(BackgroundTaskSettingsModel);
|
|
32
33
|
container.registerDecorator(RunnableTaskDecorator);
|
|
33
34
|
container.registerDecorator(SelfCleaningTaskDecorator);
|
|
35
|
+
TaskHandlerResolverFeature.register(container);
|
|
34
36
|
GetTaskDefinitionFeature.register(container);
|
|
35
37
|
ListTaskDefinitionsFeature.register(container);
|
|
36
38
|
const tasksCrud = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api/BackgroundTasksFeature.js","sources":["../../src/api/BackgroundTasksFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { RunnableTaskDecorator } from \"./decorators/RunnableTaskDecorator.js\";\nimport { SelfCleaningTaskDecorator } from \"./decorators/SelfCleaningTaskDecorator.js\";\nimport { TaskController } from \"./features/TaskController/index.js\";\nimport { TaskPrivateModel } from \"./crud/TaskPrivateModel.js\";\nimport { TaskLogPrivateModel } from \"./crud/TaskLogPrivateModel.js\";\nimport { BackgroundTaskSettingsModel } from \"./models/BackgroundTaskSettingsModel.js\";\nimport { createDefinitionCrud } from \"./crud/definition.tasks.js\";\nimport { createServiceCrud } from \"./crud/service.tasks.js\";\nimport { createTaskCrud } from \"./crud/crud.tasks.js\";\nimport { TaskExecutionContextFeature } from \"./features/TaskExecutionContext/feature.js\";\nimport { GetTaskDefinitionFeature } from \"./features/GetTaskDefinition/feature.js\";\nimport { ListTaskDefinitionsFeature } from \"./features/ListTaskDefinitions/feature.js\";\nimport {\n CleanupTaskSubtreeUseCase,\n CleanupTaskSubtreeUseCaseImpl\n} from \"./features/CleanupTaskSubtree/index.js\";\nimport { TasksCrud } from \"./TasksCrud.js\";\nimport { TriggerTaskFeature } from \"./features/TriggerTask/feature.js\";\nimport { AbortTaskFeature } from \"./features/AbortTask/feature.js\";\nimport { GetTaskFeature } from \"./features/GetTask/feature.js\";\nimport { ListTasksFeature } from \"./features/ListTasks/feature.js\";\nimport { TestingRunTaskDefinition } from \"./tasks/testingRunTask.js\";\nimport { BackgroundTaskPermissionsFeature } from \"./features/BackgroundTaskPermissions/feature.js\";\nimport { GetBackgroundTaskSettingsFeature } from \"./features/GetBackgroundTaskSettings/feature.js\";\nimport { UpdateBackgroundTaskSettingsFeature } from \"./features/UpdateBackgroundTaskSettings/feature.js\";\nimport { BackgroundTasksContextualSchema } from \"./graphql/BackgroundTasksContextualSchema.js\";\n\nexport const BackgroundTasksFeature = createFeature({\n name: \"BackgroundTasks\",\n register(container) {\n // Register models at register() time so they are available to GetModelUseCase when the\n // ModelsFetcher cache is first filled (which may happen during an earlier feature's enhance).\n container.register(TaskPrivateModel);\n container.register(TaskLogPrivateModel);\n container.register(BackgroundTaskSettingsModel);\n\n // Decorators wrapping all TaskDefinition instances.\n container.registerDecorator(RunnableTaskDecorator);\n container.registerDecorator(SelfCleaningTaskDecorator);\n\n // Task definition use cases.\n GetTaskDefinitionFeature.register(container);\n ListTaskDefinitionsFeature.register(container);\n\n // Build the tasks CRUD facade from the container and register it as the canonical TasksCrud\n // abstraction (plus the legacy TaskService alias). The factory methods resolve TasksCrud\n // lazily for sibling calls, so registering the assembled object up front is sufficient.\n const tasksCrud = {\n ...createDefinitionCrud(container),\n ...createTaskCrud(container),\n ...createServiceCrud(container)\n };\n container.registerInstance(TasksCrud, tasksCrud);\n container.registerInstance(TaskService, tasksCrud);\n\n // Task CRUD use cases (must be after TasksCrud is registered).\n TriggerTaskFeature.register(container);\n AbortTaskFeature.register(container);\n GetTaskFeature.register(container);\n ListTasksFeature.register(container);\n container.registerInstance(\n CleanupTaskSubtreeUseCase,\n new CleanupTaskSubtreeUseCaseImpl(container.resolve(TasksCrud))\n );\n\n // Execution context (singleton), controller, and the built-in test task.\n TaskExecutionContextFeature.register(container);\n container.register(TaskController);\n container.register(TestingRunTaskDefinition);\n\n // Permissions + settings features.\n BackgroundTaskPermissionsFeature.register(container);\n GetBackgroundTaskSettingsFeature.register(container);\n UpdateBackgroundTaskSettingsFeature.register(container);\n\n // GraphQL schema — rendered per-request from the CMS task/log content models.\n container.register(BackgroundTasksContextualSchema);\n }\n});\n"],"names":["BackgroundTasksFeature","createFeature","container","TaskPrivateModel","TaskLogPrivateModel","BackgroundTaskSettingsModel","RunnableTaskDecorator","SelfCleaningTaskDecorator","GetTaskDefinitionFeature","ListTaskDefinitionsFeature","tasksCrud","createDefinitionCrud","createTaskCrud","createServiceCrud","TasksCrud","TaskService","TriggerTaskFeature","AbortTaskFeature","GetTaskFeature","ListTasksFeature","CleanupTaskSubtreeUseCase","CleanupTaskSubtreeUseCaseImpl","TaskExecutionContextFeature","TaskController","TestingRunTaskDefinition","BackgroundTaskPermissionsFeature","GetBackgroundTaskSettingsFeature","UpdateBackgroundTaskSettingsFeature","BackgroundTasksContextualSchema"],"mappings":"
|
|
1
|
+
{"version":3,"file":"api/BackgroundTasksFeature.js","sources":["../../src/api/BackgroundTasksFeature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/api\";\nimport { TaskService } from \"@webiny/api-core/features/task/TaskService/index.js\";\nimport { RunnableTaskDecorator } from \"./decorators/RunnableTaskDecorator.js\";\nimport { SelfCleaningTaskDecorator } from \"./decorators/SelfCleaningTaskDecorator.js\";\nimport { TaskController } from \"./features/TaskController/index.js\";\nimport { TaskPrivateModel } from \"./crud/TaskPrivateModel.js\";\nimport { TaskLogPrivateModel } from \"./crud/TaskLogPrivateModel.js\";\nimport { BackgroundTaskSettingsModel } from \"./models/BackgroundTaskSettingsModel.js\";\nimport { createDefinitionCrud } from \"./crud/definition.tasks.js\";\nimport { createServiceCrud } from \"./crud/service.tasks.js\";\nimport { createTaskCrud } from \"./crud/crud.tasks.js\";\nimport { TaskExecutionContextFeature } from \"./features/TaskExecutionContext/feature.js\";\nimport { TaskHandlerResolverFeature } from \"./features/TaskHandlerResolver/feature.js\";\nimport { GetTaskDefinitionFeature } from \"./features/GetTaskDefinition/feature.js\";\nimport { ListTaskDefinitionsFeature } from \"./features/ListTaskDefinitions/feature.js\";\nimport {\n CleanupTaskSubtreeUseCase,\n CleanupTaskSubtreeUseCaseImpl\n} from \"./features/CleanupTaskSubtree/index.js\";\nimport { TasksCrud } from \"./TasksCrud.js\";\nimport { TriggerTaskFeature } from \"./features/TriggerTask/feature.js\";\nimport { AbortTaskFeature } from \"./features/AbortTask/feature.js\";\nimport { GetTaskFeature } from \"./features/GetTask/feature.js\";\nimport { ListTasksFeature } from \"./features/ListTasks/feature.js\";\nimport { TestingRunTaskDefinition } from \"./tasks/testingRunTask.js\";\nimport { BackgroundTaskPermissionsFeature } from \"./features/BackgroundTaskPermissions/feature.js\";\nimport { GetBackgroundTaskSettingsFeature } from \"./features/GetBackgroundTaskSettings/feature.js\";\nimport { UpdateBackgroundTaskSettingsFeature } from \"./features/UpdateBackgroundTaskSettings/feature.js\";\nimport { BackgroundTasksContextualSchema } from \"./graphql/BackgroundTasksContextualSchema.js\";\n\nexport const BackgroundTasksFeature = createFeature({\n name: \"BackgroundTasks\",\n register(container) {\n // Register models at register() time so they are available to GetModelUseCase when the\n // ModelsFetcher cache is first filled (which may happen during an earlier feature's enhance).\n container.register(TaskPrivateModel);\n container.register(TaskLogPrivateModel);\n container.register(BackgroundTaskSettingsModel);\n\n // Decorators wrapping all TaskDefinition instances.\n container.registerDecorator(RunnableTaskDecorator);\n container.registerDecorator(SelfCleaningTaskDecorator);\n\n // Task definition use cases.\n TaskHandlerResolverFeature.register(container);\n GetTaskDefinitionFeature.register(container);\n ListTaskDefinitionsFeature.register(container);\n\n // Build the tasks CRUD facade from the container and register it as the canonical TasksCrud\n // abstraction (plus the legacy TaskService alias). The factory methods resolve TasksCrud\n // lazily for sibling calls, so registering the assembled object up front is sufficient.\n const tasksCrud = {\n ...createDefinitionCrud(container),\n ...createTaskCrud(container),\n ...createServiceCrud(container)\n };\n container.registerInstance(TasksCrud, tasksCrud);\n container.registerInstance(TaskService, tasksCrud);\n\n // Task CRUD use cases (must be after TasksCrud is registered).\n TriggerTaskFeature.register(container);\n AbortTaskFeature.register(container);\n GetTaskFeature.register(container);\n ListTasksFeature.register(container);\n container.registerInstance(\n CleanupTaskSubtreeUseCase,\n new CleanupTaskSubtreeUseCaseImpl(container.resolve(TasksCrud))\n );\n\n // Execution context (singleton), controller, and the built-in test task.\n TaskExecutionContextFeature.register(container);\n container.register(TaskController);\n container.register(TestingRunTaskDefinition);\n\n // Permissions + settings features.\n BackgroundTaskPermissionsFeature.register(container);\n GetBackgroundTaskSettingsFeature.register(container);\n UpdateBackgroundTaskSettingsFeature.register(container);\n\n // GraphQL schema — rendered per-request from the CMS task/log content models.\n container.register(BackgroundTasksContextualSchema);\n }\n});\n"],"names":["BackgroundTasksFeature","createFeature","container","TaskPrivateModel","TaskLogPrivateModel","BackgroundTaskSettingsModel","RunnableTaskDecorator","SelfCleaningTaskDecorator","TaskHandlerResolverFeature","GetTaskDefinitionFeature","ListTaskDefinitionsFeature","tasksCrud","createDefinitionCrud","createTaskCrud","createServiceCrud","TasksCrud","TaskService","TriggerTaskFeature","AbortTaskFeature","GetTaskFeature","ListTasksFeature","CleanupTaskSubtreeUseCase","CleanupTaskSubtreeUseCaseImpl","TaskExecutionContextFeature","TaskController","TestingRunTaskDefinition","BackgroundTaskPermissionsFeature","GetBackgroundTaskSettingsFeature","UpdateBackgroundTaskSettingsFeature","BackgroundTasksContextualSchema"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AA8BO,MAAMA,yBAAyBC,cAAc;IAChD,MAAM;IACN,UAASC,SAAS;QAGdA,UAAU,QAAQ,CAACC;QACnBD,UAAU,QAAQ,CAACE;QACnBF,UAAU,QAAQ,CAACG;QAGnBH,UAAU,iBAAiB,CAACI;QAC5BJ,UAAU,iBAAiB,CAACK;QAG5BC,2BAA2B,QAAQ,CAACN;QACpCO,yBAAyB,QAAQ,CAACP;QAClCQ,2BAA2B,QAAQ,CAACR;QAKpC,MAAMS,YAAY;YACd,GAAGC,qBAAqBV,UAAU;YAClC,GAAGW,eAAeX,UAAU;YAC5B,GAAGY,kBAAkBZ,UAAU;QACnC;QACAA,UAAU,gBAAgB,CAACa,WAAWJ;QACtCT,UAAU,gBAAgB,CAACc,aAAaL;QAGxCM,mBAAmB,QAAQ,CAACf;QAC5BgB,iBAAiB,QAAQ,CAAChB;QAC1BiB,eAAe,QAAQ,CAACjB;QACxBkB,iBAAiB,QAAQ,CAAClB;QAC1BA,UAAU,gBAAgB,CACtBmB,2BACA,IAAIC,8BAA8BpB,UAAU,OAAO,CAACa;QAIxDQ,4BAA4B,QAAQ,CAACrB;QACrCA,UAAU,QAAQ,CAACsB;QACnBtB,UAAU,QAAQ,CAACuB;QAGnBC,iCAAiC,QAAQ,CAACxB;QAC1CyB,iCAAiC,QAAQ,CAACzB;QAC1C0B,oCAAoC,QAAQ,CAAC1B;QAG7CA,UAAU,QAAQ,CAAC2B;IACvB;AACJ"}
|
|
@@ -32,7 +32,8 @@ const createServiceCrud = (container)=>({
|
|
|
32
32
|
parentId: parent?.id
|
|
33
33
|
};
|
|
34
34
|
if (definition.onBeforeTrigger) await definition.onBeforeTrigger({
|
|
35
|
-
data: input
|
|
35
|
+
data: input,
|
|
36
|
+
definition
|
|
36
37
|
});
|
|
37
38
|
validateDelay({
|
|
38
39
|
input,
|
|
@@ -116,7 +117,8 @@ const createServiceCrud = (container)=>({
|
|
|
116
117
|
])
|
|
117
118
|
});
|
|
118
119
|
if (definition.onAbort) await definition.onAbort({
|
|
119
|
-
task: updatedTask
|
|
120
|
+
task: updatedTask,
|
|
121
|
+
definition
|
|
120
122
|
});
|
|
121
123
|
return Result.ok(updatedTask);
|
|
122
124
|
} catch (ex) {
|