@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.
Files changed (58) hide show
  1. package/admin/BackgroundTaskRoutes.js +16 -3
  2. package/admin/BackgroundTaskRoutes.js.map +1 -1
  3. package/admin/presentation/TaskDetail/components/TaskDetailDrawer.js +6 -0
  4. package/admin/presentation/TaskDetail/components/TaskDetailDrawer.js.map +1 -1
  5. package/admin/presentation/TaskExecutions/components/TaskExecutionsView.js +44 -24
  6. package/admin/presentation/TaskExecutions/components/TaskExecutionsView.js.map +1 -1
  7. package/api/BackgroundTasksFeature.js +2 -0
  8. package/api/BackgroundTasksFeature.js.map +1 -1
  9. package/api/crud/service.tasks.js +4 -2
  10. package/api/crud/service.tasks.js.map +1 -1
  11. package/api/decorators/RunnableTaskDecorator.d.ts +2 -1
  12. package/api/decorators/RunnableTaskDecorator.js +5 -6
  13. package/api/decorators/RunnableTaskDecorator.js.map +1 -1
  14. package/api/decorators/SelfCleaningTaskDecorator.d.ts +5 -2
  15. package/api/decorators/SelfCleaningTaskDecorator.js +14 -5
  16. package/api/decorators/SelfCleaningTaskDecorator.js.map +1 -1
  17. package/api/domain/errors.d.ts +10 -0
  18. package/api/domain/errors.js +11 -1
  19. package/api/domain/errors.js.map +1 -1
  20. package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.d.ts +6 -3
  21. package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js +66 -5
  22. package/api/features/GetTaskDefinition/GetTaskDefinitionUseCase.js.map +1 -1
  23. package/api/features/GetTaskDefinition/abstractions.d.ts +2 -1
  24. package/api/features/GetTaskDefinition/abstractions.js.map +1 -1
  25. package/api/features/TaskHandlerResolver/TaskHandlerResolver.d.ts +12 -0
  26. package/api/features/TaskHandlerResolver/TaskHandlerResolver.js +19 -0
  27. package/api/features/TaskHandlerResolver/TaskHandlerResolver.js.map +1 -0
  28. package/api/features/TaskHandlerResolver/abstractions.d.ts +17 -0
  29. package/api/features/TaskHandlerResolver/abstractions.js +5 -0
  30. package/api/features/TaskHandlerResolver/abstractions.js.map +1 -0
  31. package/api/features/TaskHandlerResolver/feature.d.ts +9 -0
  32. package/api/features/TaskHandlerResolver/feature.js +11 -0
  33. package/api/features/TaskHandlerResolver/feature.js.map +1 -0
  34. package/api/features/TaskHandlerResolver/index.d.ts +2 -0
  35. package/api/features/TaskHandlerResolver/index.js +2 -0
  36. package/api/runner/TaskControl.d.ts +25 -1
  37. package/api/runner/TaskControl.js +28 -18
  38. package/api/runner/TaskControl.js.map +1 -1
  39. package/api/runner/TaskManager.d.ts +12 -1
  40. package/api/runner/TaskManager.js +8 -7
  41. package/api/runner/TaskManager.js.map +1 -1
  42. package/api/runner/TaskManagerStore.d.ts +7 -0
  43. package/api/runner/TaskManagerStore.js +3 -3
  44. package/api/runner/TaskManagerStore.js.map +1 -1
  45. package/api/runner/TaskRunner.js +25 -4
  46. package/api/runner/TaskRunner.js.map +1 -1
  47. package/api/tasks/testingRunTask.d.ts +10 -2
  48. package/api/tasks/testingRunTask.js +10 -3
  49. package/api/tasks/testingRunTask.js.map +1 -1
  50. package/package.json +26 -28
  51. package/testing/index.d.ts +3 -0
  52. package/testing/index.js +2 -0
  53. package/testing/mockTaskTriggerTransportPlugin.d.ts +2 -0
  54. package/testing/mockTaskTriggerTransportPlugin.js +18 -0
  55. package/testing/mockTaskTriggerTransportPlugin.js.map +1 -0
  56. package/testing/runner.d.ts +19 -0
  57. package/testing/runner.js +44 -0
  58. 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(TaskDefinitionsView, null))
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(TaskExecutionsView, null))
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(BackgroundTaskSettingsView, null))
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;AAEjB,MAAMC,uBAAuB;IAChC,MAAM,EAAEC,OAAO,EAAE,GAAGC;IAEpB,OAAO,WAAP,GACI,oBAACH,aAAWA,MAAAA,WAAAA,GACR,oBAACI,eAAaA;QAAC,QAAO;qBAClB,oBAACL,OAAKA;QACF,OAAOM,OAAO,WAAW;QACzB,uBACI,oBAACC,aAAWA;YAAC,OAAM;yBACf,oBAACC,qBAAmBA;sBAIhC,oBAACR,OAAKA;QACF,OAAOM,OAAO,UAAU;QACxB,uBACI,oBAACC,aAAWA;YAAC,OAAM;yBACf,oBAACE,oBAAkBA;sBAI/B,oBAACV,MAAIA;QACD,MAAK;QACL,QAAO;QACP,uBACI,oBAACA,KAAK,IAAI;YACN,MAAK;YACL,qBAAO,oBAACA,KAAK,IAAI,CAAC,KAAK;gBAAC,MAAK;;YAC7B,IAAII,QAAQG,OAAO,UAAU;YAC7B,oBACI,oBAACP,KAAK,IAAI,CAAC,IAAI;gBACX,OAAM;gBACN,uBAAS,oBAACW,gBAAQA;;;sBAMtC,oBAACV,OAAKA;QACF,OAAOM,OAAO,QAAQ;QACtB,uBACI,oBAACC,aAAWA;YAAC,OAAM;yBACf,oBAACI,4BAA0BA;sBAIvC,oBAACZ,MAAIA;QACD,MAAK;QACL,QAAO;QACP,uBACI,oBAACA,KAAK,IAAI;YACN,MAAK;YACL,IAAII,QAAQG,OAAO,QAAQ;YAC3B,qBAAO,oBAACP,KAAK,IAAI,CAAC,KAAK;gBAAC,MAAK;;;;AAOzD"}
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 { Button, DataTable, DatePicker, DropdownMenu, Grid, Heading, IconButton, Input, Scrollbar, Select, Separator, Skeleton, Tag, Text, TimeAgo, useToast } from "@webiny/admin-ui";
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(TaskDefinitionsButton, null)), /*#__PURE__*/ react.createElement(Separator, null), /*#__PURE__*/ react.createElement("div", {
203
- className: "p-sm"
204
- }, /*#__PURE__*/ react.createElement(Grid, null, /*#__PURE__*/ react.createElement(Grid.Column, {
205
- span: 2
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
- })), /*#__PURE__*/ react.createElement(Grid.Column, {
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
- })), vm.definitionOptions.length > 0 ? /*#__PURE__*/ react.createElement(Grid.Column, {
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
- })) : null, /*#__PURE__*/ react.createElement(Grid.Column, {
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
- })), /*#__PURE__*/ react.createElement(Grid.Column, {
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(Button, {
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":"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"}
@@ -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":";;;;;;;;;;;;;;;;;;;;;;;;;AA6BO,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,yBAAyB,QAAQ,CAACN;QAClCO,2BAA2B,QAAQ,CAACP;QAKpC,MAAMQ,YAAY;YACd,GAAGC,qBAAqBT,UAAU;YAClC,GAAGU,eAAeV,UAAU;YAC5B,GAAGW,kBAAkBX,UAAU;QACnC;QACAA,UAAU,gBAAgB,CAACY,WAAWJ;QACtCR,UAAU,gBAAgB,CAACa,aAAaL;QAGxCM,mBAAmB,QAAQ,CAACd;QAC5Be,iBAAiB,QAAQ,CAACf;QAC1BgB,eAAe,QAAQ,CAAChB;QACxBiB,iBAAiB,QAAQ,CAACjB;QAC1BA,UAAU,gBAAgB,CACtBkB,2BACA,IAAIC,8BAA8BnB,UAAU,OAAO,CAACY;QAIxDQ,4BAA4B,QAAQ,CAACpB;QACrCA,UAAU,QAAQ,CAACqB;QACnBrB,UAAU,QAAQ,CAACsB;QAGnBC,iCAAiC,QAAQ,CAACvB;QAC1CwB,iCAAiC,QAAQ,CAACxB;QAC1CyB,oCAAoC,QAAQ,CAACzB;QAG7CA,UAAU,QAAQ,CAAC0B;IACvB;AACJ"}
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) {