@webiny/background-tasks 0.0.0-unstable.7be00a75a9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +11 -0
- package/admin/BackgroundTaskRoutes.d.ts +2 -0
- package/admin/BackgroundTaskRoutes.js +50 -0
- package/admin/BackgroundTaskRoutes.js.map +1 -0
- package/admin/BackgroundTasks.d.ts +2 -0
- package/admin/BackgroundTasks.js +46 -0
- package/admin/BackgroundTasks.js.map +1 -0
- package/admin/features/abortTask/AbortTaskGateway.d.ts +12 -0
- package/admin/features/abortTask/AbortTaskGateway.js +62 -0
- package/admin/features/abortTask/AbortTaskGateway.js.map +1 -0
- package/admin/features/abortTask/AbortTaskUseCase.d.ts +11 -0
- package/admin/features/abortTask/AbortTaskUseCase.js +18 -0
- package/admin/features/abortTask/AbortTaskUseCase.js.map +1 -0
- package/admin/features/abortTask/abstractions.d.ts +19 -0
- package/admin/features/abortTask/abstractions.js +6 -0
- package/admin/features/abortTask/abstractions.js.map +1 -0
- package/admin/features/abortTask/feature.d.ts +3 -0
- package/admin/features/abortTask/feature.js +19 -0
- package/admin/features/abortTask/feature.js.map +1 -0
- package/admin/features/abortTask/index.d.ts +2 -0
- package/admin/features/abortTask/index.js +2 -0
- package/admin/features/deleteTask/DeleteTaskGateway.d.ts +11 -0
- package/admin/features/deleteTask/DeleteTaskGateway.js +41 -0
- package/admin/features/deleteTask/DeleteTaskGateway.js.map +1 -0
- package/admin/features/deleteTask/DeleteTaskUseCase.d.ts +10 -0
- package/admin/features/deleteTask/DeleteTaskUseCase.js +18 -0
- package/admin/features/deleteTask/DeleteTaskUseCase.js.map +1 -0
- package/admin/features/deleteTask/abstractions.d.ts +14 -0
- package/admin/features/deleteTask/abstractions.js +6 -0
- package/admin/features/deleteTask/abstractions.js.map +1 -0
- package/admin/features/deleteTask/feature.d.ts +3 -0
- package/admin/features/deleteTask/feature.js +19 -0
- package/admin/features/deleteTask/feature.js.map +1 -0
- package/admin/features/deleteTask/index.d.ts +2 -0
- package/admin/features/deleteTask/index.js +2 -0
- package/admin/features/getTask/GetTaskGateway.d.ts +12 -0
- package/admin/features/getTask/GetTaskGateway.js +61 -0
- package/admin/features/getTask/GetTaskGateway.js.map +1 -0
- package/admin/features/getTask/GetTaskUseCase.d.ts +11 -0
- package/admin/features/getTask/GetTaskUseCase.js +18 -0
- package/admin/features/getTask/GetTaskUseCase.js.map +1 -0
- package/admin/features/getTask/abstractions.d.ts +15 -0
- package/admin/features/getTask/abstractions.js +6 -0
- package/admin/features/getTask/abstractions.js.map +1 -0
- package/admin/features/getTask/feature.d.ts +3 -0
- package/admin/features/getTask/feature.js +19 -0
- package/admin/features/getTask/feature.js.map +1 -0
- package/admin/features/getTask/index.d.ts +2 -0
- package/admin/features/getTask/index.js +2 -0
- package/admin/features/listDefinitions/ListDefinitionsGateway.d.ts +12 -0
- package/admin/features/listDefinitions/ListDefinitionsGateway.js +42 -0
- package/admin/features/listDefinitions/ListDefinitionsGateway.js.map +1 -0
- package/admin/features/listDefinitions/ListDefinitionsUseCase.d.ts +11 -0
- package/admin/features/listDefinitions/ListDefinitionsUseCase.js +18 -0
- package/admin/features/listDefinitions/ListDefinitionsUseCase.js.map +1 -0
- package/admin/features/listDefinitions/abstractions.d.ts +15 -0
- package/admin/features/listDefinitions/abstractions.js +6 -0
- package/admin/features/listDefinitions/abstractions.js.map +1 -0
- package/admin/features/listDefinitions/feature.d.ts +3 -0
- package/admin/features/listDefinitions/feature.js +19 -0
- package/admin/features/listDefinitions/feature.js.map +1 -0
- package/admin/features/listDefinitions/index.d.ts +2 -0
- package/admin/features/listDefinitions/index.js +2 -0
- package/admin/features/listLogs/ListLogsGateway.d.ts +11 -0
- package/admin/features/listLogs/ListLogsGateway.js +73 -0
- package/admin/features/listLogs/ListLogsGateway.js.map +1 -0
- package/admin/features/listLogs/ListLogsUseCase.d.ts +10 -0
- package/admin/features/listLogs/ListLogsUseCase.js +18 -0
- package/admin/features/listLogs/ListLogsUseCase.js.map +1 -0
- package/admin/features/listLogs/abstractions.d.ts +30 -0
- package/admin/features/listLogs/abstractions.js +6 -0
- package/admin/features/listLogs/abstractions.js.map +1 -0
- package/admin/features/listLogs/feature.d.ts +3 -0
- package/admin/features/listLogs/feature.js +19 -0
- package/admin/features/listLogs/feature.js.map +1 -0
- package/admin/features/listLogs/index.d.ts +2 -0
- package/admin/features/listLogs/index.js +2 -0
- package/admin/features/listTasks/ListTasksGateway.d.ts +11 -0
- package/admin/features/listTasks/ListTasksGateway.js +79 -0
- package/admin/features/listTasks/ListTasksGateway.js.map +1 -0
- package/admin/features/listTasks/ListTasksUseCase.d.ts +10 -0
- package/admin/features/listTasks/ListTasksUseCase.js +18 -0
- package/admin/features/listTasks/ListTasksUseCase.js.map +1 -0
- package/admin/features/listTasks/abstractions.d.ts +31 -0
- package/admin/features/listTasks/abstractions.js +6 -0
- package/admin/features/listTasks/abstractions.js.map +1 -0
- package/admin/features/listTasks/feature.d.ts +3 -0
- package/admin/features/listTasks/feature.js +19 -0
- package/admin/features/listTasks/feature.js.map +1 -0
- package/admin/features/listTasks/index.d.ts +2 -0
- package/admin/features/listTasks/index.js +2 -0
- package/admin/features/permissions/abstractions.d.ts +17 -0
- package/admin/features/permissions/abstractions.js +6 -0
- package/admin/features/permissions/abstractions.js.map +1 -0
- package/admin/features/permissions/feature.d.ts +14 -0
- package/admin/features/permissions/feature.js +7 -0
- package/admin/features/permissions/feature.js.map +1 -0
- package/admin/features/permissions/index.d.ts +2 -0
- package/admin/features/permissions/index.js +2 -0
- package/admin/index.d.ts +2 -0
- package/admin/index.js +2 -0
- package/admin/permissions.d.ts +12 -0
- package/admin/permissions.js +22 -0
- package/admin/permissions.js.map +1 -0
- package/admin/presentation/TaskDefinitions/TaskDefinitionsPresenter.d.ts +14 -0
- package/admin/presentation/TaskDefinitions/TaskDefinitionsPresenter.js +41 -0
- package/admin/presentation/TaskDefinitions/TaskDefinitionsPresenter.js.map +1 -0
- package/admin/presentation/TaskDefinitions/abstractions.d.ts +14 -0
- package/admin/presentation/TaskDefinitions/abstractions.js +5 -0
- package/admin/presentation/TaskDefinitions/abstractions.js.map +1 -0
- package/admin/presentation/TaskDefinitions/components/TaskDefinitionsView.d.ts +2 -0
- package/admin/presentation/TaskDefinitions/components/TaskDefinitionsView.js +75 -0
- package/admin/presentation/TaskDefinitions/components/TaskDefinitionsView.js.map +1 -0
- package/admin/presentation/TaskDefinitions/feature.d.ts +3 -0
- package/admin/presentation/TaskDefinitions/feature.js +17 -0
- package/admin/presentation/TaskDefinitions/feature.js.map +1 -0
- package/admin/presentation/TaskDefinitions/index.d.ts +2 -0
- package/admin/presentation/TaskDefinitions/index.js +2 -0
- package/admin/presentation/TaskDetail/TaskDetailPresenter.d.ts +24 -0
- package/admin/presentation/TaskDetail/TaskDetailPresenter.js +87 -0
- package/admin/presentation/TaskDetail/TaskDetailPresenter.js.map +1 -0
- package/admin/presentation/TaskDetail/abstractions.d.ts +24 -0
- package/admin/presentation/TaskDetail/abstractions.js +5 -0
- package/admin/presentation/TaskDetail/abstractions.js.map +1 -0
- package/admin/presentation/TaskDetail/components/TaskDetailDrawer.d.ts +11 -0
- package/admin/presentation/TaskDetail/components/TaskDetailDrawer.js +264 -0
- package/admin/presentation/TaskDetail/components/TaskDetailDrawer.js.map +1 -0
- package/admin/presentation/TaskDetail/feature.d.ts +3 -0
- package/admin/presentation/TaskDetail/feature.js +17 -0
- package/admin/presentation/TaskDetail/feature.js.map +1 -0
- package/admin/presentation/TaskDetail/index.d.ts +2 -0
- package/admin/presentation/TaskDetail/index.js +2 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.d.ts +15 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js +91 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsDataSource.js.map +1 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.d.ts +52 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.js +107 -0
- package/admin/presentation/TaskExecutions/TaskExecutionsPresenter.js.map +1 -0
- package/admin/presentation/TaskExecutions/abstractions.d.ts +28 -0
- package/admin/presentation/TaskExecutions/abstractions.js +5 -0
- package/admin/presentation/TaskExecutions/abstractions.js.map +1 -0
- package/admin/presentation/TaskExecutions/components/TaskExecutionsView.d.ts +2 -0
- package/admin/presentation/TaskExecutions/components/TaskExecutionsView.js +303 -0
- package/admin/presentation/TaskExecutions/components/TaskExecutionsView.js.map +1 -0
- package/admin/presentation/TaskExecutions/feature.d.ts +3 -0
- package/admin/presentation/TaskExecutions/feature.js +17 -0
- package/admin/presentation/TaskExecutions/feature.js.map +1 -0
- package/admin/presentation/TaskExecutions/index.d.ts +2 -0
- package/admin/presentation/TaskExecutions/index.js +2 -0
- package/admin/presentation/security/HasPermission.d.ts +12 -0
- package/admin/presentation/security/HasPermission.js +6 -0
- package/admin/presentation/security/HasPermission.js.map +1 -0
- package/admin/presentation/security/usePermissions.d.ts +12 -0
- package/admin/presentation/security/usePermissions.js +6 -0
- package/admin/presentation/security/usePermissions.js.map +1 -0
- package/admin/routes.d.ts +5 -0
- package/admin/routes.js +14 -0
- package/admin/routes.js.map +1 -0
- package/admin/shared/types.d.ts +15 -0
- package/admin/shared/types.js +0 -0
- package/api/index.d.ts +0 -0
- package/api/index.js +0 -0
- package/index.d.ts +1 -0
- package/index.js +1 -0
- package/package.json +45 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/presentation/TaskExecutions/TaskExecutionsPresenter.js","sources":["../../../../src/admin/presentation/TaskExecutions/TaskExecutionsPresenter.ts"],"sourcesContent":["import { makeAutoObservable, runInAction, computed } from \"mobx\";\nimport { ListPresenter } from \"@webiny/app-admin/presentation/listPresenter/abstractions.js\";\nimport type { Task } from \"~/admin/shared/types.js\";\nimport type { IDefinitionOption } from \"./abstractions.js\";\nimport {\n TaskExecutionsPresenter as Abstraction,\n type ITaskExecutionsPresenter,\n type ITaskExecutionsViewModel\n} from \"./abstractions.js\";\nimport { TaskExecutionsDataSource } from \"./TaskExecutionsDataSource.js\";\nimport { ListTasksUseCase } from \"~/admin/features/listTasks/abstractions.js\";\nimport { DeleteTaskUseCase } from \"~/admin/features/deleteTask/abstractions.js\";\nimport { AbortTaskUseCase } from \"~/admin/features/abortTask/abstractions.js\";\nimport { ListDefinitionsUseCase } from \"~/admin/features/listDefinitions/abstractions.js\";\nimport { TaskPermissions } from \"~/admin/features/permissions/abstractions.js\";\n\nclass TaskExecutionsPresenterImpl implements ITaskExecutionsPresenter {\n private _selectedTask: Task | null = null;\n private _definitionOptions: IDefinitionOption[] = [];\n\n constructor(\n private readonly listPresenter: ListPresenter.Interface<Task>,\n private readonly listTasksUseCase: ListTasksUseCase.Interface,\n private readonly deleteTaskUseCase: DeleteTaskUseCase.Interface,\n private readonly abortTaskUseCase: AbortTaskUseCase.Interface,\n private readonly listDefinitionsUseCase: ListDefinitionsUseCase.Interface,\n private readonly permissions: TaskPermissions.Interface\n ) {\n makeAutoObservable(this, { vm: computed });\n }\n\n get vm(): ITaskExecutionsViewModel {\n return {\n list: this.listPresenter.vm,\n definitionOptions: this._definitionOptions,\n permissions: {\n canRead: this.permissions.canRead(\"task\"),\n canDelete: this.permissions.canDelete(\"task\")\n }\n };\n }\n\n get selectedTask(): Task | null {\n return this._selectedTask;\n }\n\n search = {\n set: (query: string) => this.listPresenter.actions.search.set(query),\n clear: () => this.listPresenter.actions.search.clear()\n };\n\n sort = {\n set: (field: string, direction: \"ASC\" | \"DESC\") =>\n this.listPresenter.actions.sort.set(field, direction),\n toggle: (field: string) => this.listPresenter.actions.sort.toggle(field)\n };\n\n filter = {\n set: (key: string, value: unknown) => this.listPresenter.actions.filter.set(key, value),\n clear: (key: string) => this.listPresenter.actions.filter.clear(key),\n clearAll: () => this.listPresenter.actions.filter.clearAll()\n };\n\n selection = {\n toggle: (id: string) => this.listPresenter.actions.selection.toggle(id),\n selectRangeTo: (id: string) => this.listPresenter.actions.selection.selectRangeTo(id),\n selectAll: () => this.listPresenter.actions.selection.selectAll(),\n deselectAll: () => this.listPresenter.actions.selection.deselectAll(),\n selectRows: (ids: string[]) => this.listPresenter.actions.selection.selectRows(ids),\n isSelected: (id: string) => this.listPresenter.actions.selection.isSelected(id)\n };\n\n loadMore = () => this.listPresenter.actions.loadMore();\n refresh = () => this.listPresenter.actions.refresh();\n\n deleteTask = async (id: string) => {\n await this.deleteTaskUseCase.execute(id);\n this._selectedTask = null;\n await this.listPresenter.actions.refresh();\n };\n\n abortTask = async (id: string) => {\n await this.abortTaskUseCase.execute({ id });\n await this.listPresenter.actions.refresh();\n };\n\n selectTask = (task: Task | null) => {\n this._selectedTask = task;\n };\n\n init(): void {\n const dataSource = new TaskExecutionsDataSource(this.listTasksUseCase);\n this.listPresenter.init({\n dataSource,\n initialSort: { field: \"createdOn\", direction: \"DESC\" },\n limit: 25\n });\n\n void this.listDefinitionsUseCase\n .execute()\n .then(definitions => {\n runInAction(() => {\n this._definitionOptions = definitions.map(d => ({\n label: d.title,\n value: d.id\n }));\n });\n })\n .catch(() => {\n /* Definitions are used for filter labels only; safe to ignore. */\n });\n }\n}\n\nexport const TaskExecutionsPresenter = Abstraction.createImplementation({\n implementation: TaskExecutionsPresenterImpl,\n dependencies: [\n ListPresenter,\n ListTasksUseCase,\n DeleteTaskUseCase,\n AbortTaskUseCase,\n ListDefinitionsUseCase,\n TaskPermissions\n ]\n});\n"],"names":["TaskExecutionsPresenterImpl","listPresenter","listTasksUseCase","deleteTaskUseCase","abortTaskUseCase","listDefinitionsUseCase","permissions","query","field","direction","key","value","id","ids","task","makeAutoObservable","computed","dataSource","TaskExecutionsDataSource","definitions","runInAction","d","TaskExecutionsPresenter","Abstraction","ListPresenter","ListTasksUseCase","DeleteTaskUseCase","AbortTaskUseCase","ListDefinitionsUseCase","TaskPermissions"],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { Task } from "../../../admin/shared/types.js";
|
|
2
|
+
import type { IListViewModel } from "@webiny/app-admin/presentation/listPresenter/abstractions.js";
|
|
3
|
+
import type { IListActions } from "@webiny/app-admin/presentation/listPresenter/abstractions.js";
|
|
4
|
+
export interface IDefinitionOption {
|
|
5
|
+
label: string;
|
|
6
|
+
value: string;
|
|
7
|
+
}
|
|
8
|
+
export interface ITaskExecutionsViewModel {
|
|
9
|
+
list: IListViewModel<Task>;
|
|
10
|
+
definitionOptions: IDefinitionOption[];
|
|
11
|
+
permissions: {
|
|
12
|
+
canRead: boolean;
|
|
13
|
+
canDelete: boolean;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface ITaskExecutionsPresenter extends IListActions {
|
|
17
|
+
vm: ITaskExecutionsViewModel;
|
|
18
|
+
selectedTask: Task | null;
|
|
19
|
+
deleteTask(id: string): Promise<void>;
|
|
20
|
+
abortTask(id: string): Promise<void>;
|
|
21
|
+
selectTask(task: Task | null): void;
|
|
22
|
+
init(): void;
|
|
23
|
+
}
|
|
24
|
+
export declare const TaskExecutionsPresenter: import("@webiny/di").Abstraction<ITaskExecutionsPresenter>;
|
|
25
|
+
export declare namespace TaskExecutionsPresenter {
|
|
26
|
+
type Interface = ITaskExecutionsPresenter;
|
|
27
|
+
type ViewModel = ITaskExecutionsViewModel;
|
|
28
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/presentation/TaskExecutions/abstractions.js","sources":["../../../../src/admin/presentation/TaskExecutions/abstractions.ts"],"sourcesContent":["import { createAbstraction } from \"@webiny/feature/admin\";\nimport type { Task } from \"~/admin/shared/types.js\";\nimport type { IListViewModel } from \"@webiny/app-admin/presentation/listPresenter/abstractions.js\";\nimport type { IListActions } from \"@webiny/app-admin/presentation/listPresenter/abstractions.js\";\n\nexport interface IDefinitionOption {\n label: string;\n value: string;\n}\n\nexport interface ITaskExecutionsViewModel {\n list: IListViewModel<Task>;\n definitionOptions: IDefinitionOption[];\n permissions: {\n canRead: boolean;\n canDelete: boolean;\n };\n}\n\nexport interface ITaskExecutionsPresenter extends IListActions {\n vm: ITaskExecutionsViewModel;\n selectedTask: Task | null;\n deleteTask(id: string): Promise<void>;\n abortTask(id: string): Promise<void>;\n selectTask(task: Task | null): void;\n init(): void;\n}\n\nexport const TaskExecutionsPresenter =\n createAbstraction<ITaskExecutionsPresenter>(\"TaskExecutionsPresenter\");\n\nexport namespace TaskExecutionsPresenter {\n export type Interface = ITaskExecutionsPresenter;\n export type ViewModel = ITaskExecutionsViewModel;\n}\n"],"names":["TaskExecutionsPresenter","createAbstraction"],"mappings":";AA4BO,MAAMA,0BACTC,kBAA4C"}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
import react, { useCallback, useEffect, useMemo } from "react";
|
|
2
|
+
import debounce from "lodash/debounce.js";
|
|
3
|
+
import { observer } from "mobx-react-lite";
|
|
4
|
+
import { DiContainerProvider, useContainer, useFeature } from "@webiny/app";
|
|
5
|
+
import { Button, DataTable, DatePicker, DropdownMenu, Heading, IconButton, Input, Scrollbar, Select, Separator, Tag, Text, TimeAgo } from "@webiny/admin-ui";
|
|
6
|
+
import { useConfirmationDialog, useSnackbar } from "@webiny/app-admin/hooks/index.js";
|
|
7
|
+
import { ReactComponent } from "@webiny/icons/more_vert.svg";
|
|
8
|
+
import { ReactComponent as delete_svg_ReactComponent } from "@webiny/icons/delete.svg";
|
|
9
|
+
import { ReactComponent as stop_circle_svg_ReactComponent } from "@webiny/icons/stop_circle.svg";
|
|
10
|
+
import { TaskExecutionsPresenterFeature } from "../feature.js";
|
|
11
|
+
import { ListTasksFeature } from "../../../features/listTasks/feature.js";
|
|
12
|
+
import { DeleteTaskFeature } from "../../../features/deleteTask/feature.js";
|
|
13
|
+
import { AbortTaskFeature } from "../../../features/abortTask/feature.js";
|
|
14
|
+
import { ListDefinitionsFeature } from "../../../features/listDefinitions/feature.js";
|
|
15
|
+
import { TaskPermissionsFeature } from "../../../features/permissions/feature.js";
|
|
16
|
+
import { TaskDetailDrawer } from "../../TaskDetail/components/TaskDetailDrawer.js";
|
|
17
|
+
const STATUS_TAG_VARIANT = {
|
|
18
|
+
pending: "neutral-light",
|
|
19
|
+
running: "accent",
|
|
20
|
+
success: "success",
|
|
21
|
+
failed: "destructive",
|
|
22
|
+
aborted: "warning"
|
|
23
|
+
};
|
|
24
|
+
const STATUS_OPTIONS = [
|
|
25
|
+
{
|
|
26
|
+
label: "Pending",
|
|
27
|
+
value: "pending"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
label: "Running",
|
|
31
|
+
value: "running"
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
label: "Success",
|
|
35
|
+
value: "success"
|
|
36
|
+
},
|
|
37
|
+
{
|
|
38
|
+
label: "Failed",
|
|
39
|
+
value: "failed"
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
label: "Aborted",
|
|
43
|
+
value: "aborted"
|
|
44
|
+
}
|
|
45
|
+
];
|
|
46
|
+
const TaskExecutionsView_TaskExecutionsViewInner = observer(function() {
|
|
47
|
+
const { presenter } = useFeature(TaskExecutionsPresenterFeature);
|
|
48
|
+
const { showSnackbar } = useSnackbar();
|
|
49
|
+
useEffect(()=>{
|
|
50
|
+
presenter.init();
|
|
51
|
+
}, [
|
|
52
|
+
presenter
|
|
53
|
+
]);
|
|
54
|
+
const { vm } = presenter;
|
|
55
|
+
const loadMoreOnScroll = useMemo(()=>debounce(({ scrollFrame })=>{
|
|
56
|
+
if (scrollFrame.top > 0.8) presenter.loadMore();
|
|
57
|
+
}, 200), [
|
|
58
|
+
presenter
|
|
59
|
+
]);
|
|
60
|
+
const { showConfirmation: showDeleteConfirmation } = useConfirmationDialog({
|
|
61
|
+
title: "Delete Task",
|
|
62
|
+
message: "Are you sure you want to delete this task?"
|
|
63
|
+
});
|
|
64
|
+
const { showConfirmation: showAbortConfirmation } = useConfirmationDialog({
|
|
65
|
+
title: "Abort Task",
|
|
66
|
+
message: "Are you sure you want to abort this running task?"
|
|
67
|
+
});
|
|
68
|
+
const sorting = useMemo(()=>{
|
|
69
|
+
const sort = vm.list.sort;
|
|
70
|
+
if (!sort || !sort.field) return [];
|
|
71
|
+
return [
|
|
72
|
+
{
|
|
73
|
+
id: sort.field,
|
|
74
|
+
desc: "DESC" === sort.direction
|
|
75
|
+
}
|
|
76
|
+
];
|
|
77
|
+
}, [
|
|
78
|
+
vm.list.sort
|
|
79
|
+
]);
|
|
80
|
+
const onSortingChange = useCallback((updater)=>{
|
|
81
|
+
const next = "function" == typeof updater ? updater(sorting) : updater;
|
|
82
|
+
if (next.length > 0) {
|
|
83
|
+
const { id, desc } = next[0];
|
|
84
|
+
presenter.sort.set(id, desc ? "DESC" : "ASC");
|
|
85
|
+
}
|
|
86
|
+
}, [
|
|
87
|
+
sorting,
|
|
88
|
+
presenter.sort
|
|
89
|
+
]);
|
|
90
|
+
const columns = useMemo(()=>({
|
|
91
|
+
name: {
|
|
92
|
+
header: "Name",
|
|
93
|
+
cell: (row)=>/*#__PURE__*/ react.createElement(Text, {
|
|
94
|
+
className: "cursor-pointer text-primary hover:underline",
|
|
95
|
+
onClick: ()=>presenter.selectTask(row)
|
|
96
|
+
}, row.name || row.definitionId),
|
|
97
|
+
enableSorting: true,
|
|
98
|
+
size: 200
|
|
99
|
+
},
|
|
100
|
+
definitionId: {
|
|
101
|
+
header: "Definition",
|
|
102
|
+
cell: (row)=>{
|
|
103
|
+
const def = vm.definitionOptions.find((d)=>d.value === row.definitionId);
|
|
104
|
+
return /*#__PURE__*/ react.createElement(Text, {
|
|
105
|
+
size: "sm"
|
|
106
|
+
}, def ? def.label : row.definitionId);
|
|
107
|
+
},
|
|
108
|
+
enableSorting: true,
|
|
109
|
+
size: 160
|
|
110
|
+
},
|
|
111
|
+
taskStatus: {
|
|
112
|
+
header: "Status",
|
|
113
|
+
cell: (row)=>/*#__PURE__*/ react.createElement(Tag, {
|
|
114
|
+
variant: STATUS_TAG_VARIANT[row.taskStatus] ?? "neutral-light",
|
|
115
|
+
content: row.taskStatus
|
|
116
|
+
}),
|
|
117
|
+
enableSorting: true,
|
|
118
|
+
size: 100
|
|
119
|
+
},
|
|
120
|
+
createdOn: {
|
|
121
|
+
header: "Created",
|
|
122
|
+
cell: (row)=>row.createdOn ? /*#__PURE__*/ react.createElement(TimeAgo, {
|
|
123
|
+
datetime: row.createdOn
|
|
124
|
+
}) : /*#__PURE__*/ react.createElement(Text, {
|
|
125
|
+
size: "sm"
|
|
126
|
+
}, "—"),
|
|
127
|
+
enableSorting: true,
|
|
128
|
+
size: 120
|
|
129
|
+
},
|
|
130
|
+
startedOn: {
|
|
131
|
+
header: "Started",
|
|
132
|
+
cell: (row)=>row.startedOn ? /*#__PURE__*/ react.createElement(TimeAgo, {
|
|
133
|
+
datetime: row.startedOn
|
|
134
|
+
}) : /*#__PURE__*/ react.createElement(Text, {
|
|
135
|
+
size: "sm"
|
|
136
|
+
}, "—"),
|
|
137
|
+
enableSorting: true,
|
|
138
|
+
size: 120
|
|
139
|
+
},
|
|
140
|
+
finishedOn: {
|
|
141
|
+
header: "Finished",
|
|
142
|
+
cell: (row)=>row.finishedOn ? /*#__PURE__*/ react.createElement(TimeAgo, {
|
|
143
|
+
datetime: row.finishedOn
|
|
144
|
+
}) : /*#__PURE__*/ react.createElement(Text, {
|
|
145
|
+
size: "sm"
|
|
146
|
+
}, "—"),
|
|
147
|
+
enableSorting: true,
|
|
148
|
+
size: 120
|
|
149
|
+
},
|
|
150
|
+
actions: {
|
|
151
|
+
header: " ",
|
|
152
|
+
cell: (row)=>{
|
|
153
|
+
const isRunning = "running" === row.taskStatus;
|
|
154
|
+
const isTerminal = "success" === row.taskStatus || "failed" === row.taskStatus || "aborted" === row.taskStatus;
|
|
155
|
+
if (!isRunning && !isTerminal) return null;
|
|
156
|
+
return /*#__PURE__*/ react.createElement(DropdownMenu, {
|
|
157
|
+
trigger: /*#__PURE__*/ react.createElement(IconButton, {
|
|
158
|
+
icon: /*#__PURE__*/ react.createElement(ReactComponent, null),
|
|
159
|
+
variant: "ghost",
|
|
160
|
+
size: "sm",
|
|
161
|
+
"aria-label": "Actions"
|
|
162
|
+
})
|
|
163
|
+
}, isRunning && /*#__PURE__*/ react.createElement(DropdownMenu.Item, {
|
|
164
|
+
icon: /*#__PURE__*/ react.createElement(stop_circle_svg_ReactComponent, null),
|
|
165
|
+
onClick: ()=>{
|
|
166
|
+
showAbortConfirmation(()=>presenter.abortTask(row.id).then(()=>{
|
|
167
|
+
showSnackbar("Task aborted.");
|
|
168
|
+
}));
|
|
169
|
+
},
|
|
170
|
+
text: "Abort"
|
|
171
|
+
}), isTerminal && vm.permissions.canDelete && /*#__PURE__*/ react.createElement(react.Fragment, null, isRunning && /*#__PURE__*/ react.createElement(DropdownMenu.Separator, null), /*#__PURE__*/ react.createElement(DropdownMenu.Item, {
|
|
172
|
+
icon: /*#__PURE__*/ react.createElement(delete_svg_ReactComponent, null),
|
|
173
|
+
onClick: ()=>{
|
|
174
|
+
showDeleteConfirmation(()=>presenter.deleteTask(row.id).then(()=>{
|
|
175
|
+
showSnackbar("Task deleted.");
|
|
176
|
+
}));
|
|
177
|
+
},
|
|
178
|
+
text: "Delete"
|
|
179
|
+
})));
|
|
180
|
+
},
|
|
181
|
+
size: 56,
|
|
182
|
+
enableSorting: false,
|
|
183
|
+
enableHiding: false,
|
|
184
|
+
enableResizing: false
|
|
185
|
+
}
|
|
186
|
+
}), [
|
|
187
|
+
vm.permissions,
|
|
188
|
+
vm.definitionOptions,
|
|
189
|
+
presenter,
|
|
190
|
+
showDeleteConfirmation,
|
|
191
|
+
showAbortConfirmation,
|
|
192
|
+
showSnackbar
|
|
193
|
+
]);
|
|
194
|
+
return /*#__PURE__*/ react.createElement(react.Fragment, null, /*#__PURE__*/ react.createElement("div", {
|
|
195
|
+
className: "flex flex-col h-main-content"
|
|
196
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
197
|
+
className: "flex items-center justify-between py-sm px-md"
|
|
198
|
+
}, /*#__PURE__*/ react.createElement(Heading, {
|
|
199
|
+
level: 5
|
|
200
|
+
}, "Task Executions")), /*#__PURE__*/ react.createElement(Separator, null), /*#__PURE__*/ react.createElement("div", {
|
|
201
|
+
className: "flex items-center gap-sm px-md py-xs flex-wrap"
|
|
202
|
+
}, /*#__PURE__*/ react.createElement("div", {
|
|
203
|
+
className: "w-[240px]"
|
|
204
|
+
}, /*#__PURE__*/ react.createElement(Input, {
|
|
205
|
+
placeholder: "Search by name...",
|
|
206
|
+
value: vm.list.search,
|
|
207
|
+
onChange: (value)=>{
|
|
208
|
+
presenter.search.set(value);
|
|
209
|
+
}
|
|
210
|
+
})), /*#__PURE__*/ react.createElement("div", {
|
|
211
|
+
className: "w-[160px]"
|
|
212
|
+
}, /*#__PURE__*/ react.createElement(Select, {
|
|
213
|
+
placeholder: "Status",
|
|
214
|
+
options: STATUS_OPTIONS,
|
|
215
|
+
value: vm.list.filters.taskStatus_in ?? "",
|
|
216
|
+
onChange: (value)=>{
|
|
217
|
+
if (value) presenter.filter.set("taskStatus_in", value);
|
|
218
|
+
else presenter.filter.clear("taskStatus_in");
|
|
219
|
+
}
|
|
220
|
+
})), vm.definitionOptions.length > 0 && /*#__PURE__*/ react.createElement("div", {
|
|
221
|
+
className: "w-[200px]"
|
|
222
|
+
}, /*#__PURE__*/ react.createElement(Select, {
|
|
223
|
+
placeholder: "Definition",
|
|
224
|
+
options: vm.definitionOptions,
|
|
225
|
+
value: vm.list.filters.definitionId,
|
|
226
|
+
onChange: (value)=>{
|
|
227
|
+
if (value) presenter.filter.set("definitionId", value);
|
|
228
|
+
else presenter.filter.clear("definitionId");
|
|
229
|
+
}
|
|
230
|
+
})), /*#__PURE__*/ react.createElement("div", {
|
|
231
|
+
className: "w-[240px]"
|
|
232
|
+
}, /*#__PURE__*/ react.createElement(DatePicker, {
|
|
233
|
+
type: "dateTimeTz",
|
|
234
|
+
placeholder: "Created from",
|
|
235
|
+
value: vm.list.filters.createdOn_gte,
|
|
236
|
+
onChange: (value)=>{
|
|
237
|
+
if (value) presenter.filter.set("createdOn_gte", value);
|
|
238
|
+
else presenter.filter.clear("createdOn_gte");
|
|
239
|
+
}
|
|
240
|
+
})), /*#__PURE__*/ react.createElement("div", {
|
|
241
|
+
className: "w-[240px]"
|
|
242
|
+
}, /*#__PURE__*/ react.createElement(DatePicker, {
|
|
243
|
+
type: "dateTimeTz",
|
|
244
|
+
placeholder: "Created to",
|
|
245
|
+
value: vm.list.filters.createdOn_lte,
|
|
246
|
+
onChange: (value)=>{
|
|
247
|
+
if (value) presenter.filter.set("createdOn_lte", value);
|
|
248
|
+
else presenter.filter.clear("createdOn_lte");
|
|
249
|
+
}
|
|
250
|
+
})), Object.keys(vm.list.filters).length > 0 && /*#__PURE__*/ react.createElement(Button, {
|
|
251
|
+
variant: "tertiary",
|
|
252
|
+
size: "sm",
|
|
253
|
+
onClick: ()=>presenter.filter.clearAll()
|
|
254
|
+
}, "Clear filters")), /*#__PURE__*/ react.createElement(Separator, null), /*#__PURE__*/ react.createElement("div", {
|
|
255
|
+
className: "flex-1 overflow-hidden"
|
|
256
|
+
}, vm.list.pagination.loading || 0 !== vm.list.rows.length ? /*#__PURE__*/ react.createElement(Scrollbar, {
|
|
257
|
+
onScrollFrame: (scrollFrame)=>loadMoreOnScroll({
|
|
258
|
+
scrollFrame
|
|
259
|
+
})
|
|
260
|
+
}, /*#__PURE__*/ react.createElement(DataTable, {
|
|
261
|
+
columns: columns,
|
|
262
|
+
data: vm.list.rows,
|
|
263
|
+
loading: vm.list.pagination.loading && 0 === vm.list.rows.length,
|
|
264
|
+
sorting: sorting,
|
|
265
|
+
onSortingChange: onSortingChange,
|
|
266
|
+
stickyHeader: true
|
|
267
|
+
})) : /*#__PURE__*/ react.createElement("div", {
|
|
268
|
+
className: "flex flex-col items-center justify-center h-full gap-md"
|
|
269
|
+
}, /*#__PURE__*/ react.createElement(Text, {
|
|
270
|
+
className: "text-neutral-strong"
|
|
271
|
+
}, "No tasks found.")))), presenter.selectedTask && /*#__PURE__*/ react.createElement(TaskDetailDrawer, {
|
|
272
|
+
task: presenter.selectedTask,
|
|
273
|
+
open: !!presenter.selectedTask,
|
|
274
|
+
onClose: ()=>presenter.selectTask(null),
|
|
275
|
+
onAbort: async (id)=>{
|
|
276
|
+
await presenter.abortTask(id);
|
|
277
|
+
showSnackbar("Task aborted.");
|
|
278
|
+
},
|
|
279
|
+
onDelete: async (id)=>{
|
|
280
|
+
await presenter.deleteTask(id);
|
|
281
|
+
showSnackbar("Task deleted.");
|
|
282
|
+
}
|
|
283
|
+
}));
|
|
284
|
+
});
|
|
285
|
+
const TaskExecutionsView = ()=>{
|
|
286
|
+
const container = useContainer();
|
|
287
|
+
const scopedContainer = useMemo(()=>{
|
|
288
|
+
const child = container.createChildContainer();
|
|
289
|
+
ListTasksFeature.register(child);
|
|
290
|
+
DeleteTaskFeature.register(child);
|
|
291
|
+
AbortTaskFeature.register(child);
|
|
292
|
+
ListDefinitionsFeature.register(child);
|
|
293
|
+
TaskPermissionsFeature.register(child);
|
|
294
|
+
TaskExecutionsPresenterFeature.register(child);
|
|
295
|
+
return child;
|
|
296
|
+
}, []);
|
|
297
|
+
return /*#__PURE__*/ react.createElement(DiContainerProvider, {
|
|
298
|
+
container: scopedContainer
|
|
299
|
+
}, /*#__PURE__*/ react.createElement(TaskExecutionsView_TaskExecutionsViewInner, null));
|
|
300
|
+
};
|
|
301
|
+
export { TaskExecutionsView };
|
|
302
|
+
|
|
303
|
+
//# sourceMappingURL=TaskExecutionsView.js.map
|
|
@@ -0,0 +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 Heading,\n IconButton,\n Input,\n Scrollbar,\n Select,\n Separator,\n Tag,\n Text,\n TimeAgo\n} from \"@webiny/admin-ui\";\nimport { useConfirmationDialog, useSnackbar } 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 { 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\";\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 { showSnackbar } = useSnackbar();\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 icon={<StopCircleIcon />}\n onClick={() => {\n showAbortConfirmation(() =>\n presenter.abortTask(row.id).then(() => {\n showSnackbar(\"Task aborted.\");\n })\n );\n }}\n text=\"Abort\"\n />\n )}\n {isTerminal && vm.permissions.canDelete && (\n <>\n {isRunning && <DropdownMenu.Separator />}\n <DropdownMenu.Item\n icon={<DeleteIcon />}\n onClick={() => {\n showDeleteConfirmation(() =>\n presenter.deleteTask(row.id).then(() => {\n showSnackbar(\"Task deleted.\");\n })\n );\n }}\n text=\"Delete\"\n />\n </>\n )}\n </DropdownMenu>\n );\n },\n size: 56,\n enableSorting: false,\n enableHiding: false,\n enableResizing: false\n }\n }),\n [\n vm.permissions,\n vm.definitionOptions,\n presenter,\n showDeleteConfirmation,\n showAbortConfirmation,\n showSnackbar\n ]\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>\n <Separator />\n <div className=\"flex items-center gap-sm px-md py-xs flex-wrap\">\n <div className=\"w-[240px]\">\n <Input\n placeholder=\"Search by name...\"\n value={vm.list.search}\n onChange={value => {\n presenter.search.set(value);\n }}\n />\n </div>\n <div className=\"w-[160px]\">\n <Select\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 </div>\n {vm.definitionOptions.length > 0 && (\n <div className=\"w-[200px]\">\n <Select\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 </div>\n )}\n <div className=\"w-[240px]\">\n <DatePicker\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 </div>\n <div className=\"w-[240px]\">\n <DatePicker\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 </div>\n {Object.keys(vm.list.filters).length > 0 && (\n <Button\n variant=\"tertiary\"\n size=\"sm\"\n onClick={() => presenter.filter.clearAll()}\n >\n Clear filters\n </Button>\n )}\n </div>\n <Separator />\n <div className=\"flex-1 overflow-hidden\">\n {!vm.list.pagination.loading && 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 && vm.list.rows.length === 0}\n sorting={sorting}\n onSortingChange={onSortingChange}\n stickyHeader\n />\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 showSnackbar(\"Task aborted.\");\n }}\n onDelete={async (id: string) => {\n await presenter.deleteTask(id);\n showSnackbar(\"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","showSnackbar","useSnackbar","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","Heading","Separator","Input","value","Select","DatePicker","Object","Button","Scrollbar","DataTable","TaskDetailDrawer","TaskExecutionsView","container","useContainer","scopedContainer","child","ListTasksFeature","DeleteTaskFeature","AbortTaskFeature","ListDefinitionsFeature","TaskPermissionsFeature","DiContainerProvider"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { createFeature } from "@webiny/feature/admin";
|
|
2
|
+
import { TaskExecutionsPresenter } from "./abstractions.js";
|
|
3
|
+
import { TaskExecutionsPresenter as external_TaskExecutionsPresenter_js_TaskExecutionsPresenter } from "./TaskExecutionsPresenter.js";
|
|
4
|
+
const TaskExecutionsPresenterFeature = createFeature({
|
|
5
|
+
name: "BackgroundTasks/TaskExecutionsPresenter",
|
|
6
|
+
register (container) {
|
|
7
|
+
container.register(external_TaskExecutionsPresenter_js_TaskExecutionsPresenter).inSingletonScope();
|
|
8
|
+
},
|
|
9
|
+
resolve (container) {
|
|
10
|
+
return {
|
|
11
|
+
presenter: container.resolve(TaskExecutionsPresenter)
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
});
|
|
15
|
+
export { TaskExecutionsPresenterFeature };
|
|
16
|
+
|
|
17
|
+
//# sourceMappingURL=feature.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/presentation/TaskExecutions/feature.js","sources":["../../../../src/admin/presentation/TaskExecutions/feature.ts"],"sourcesContent":["import { createFeature } from \"@webiny/feature/admin\";\nimport { TaskExecutionsPresenter as PresenterAbstraction } from \"./abstractions.js\";\nimport { TaskExecutionsPresenter } from \"./TaskExecutionsPresenter.js\";\n\nexport const TaskExecutionsPresenterFeature = createFeature({\n name: \"BackgroundTasks/TaskExecutionsPresenter\",\n register(container) {\n container.register(TaskExecutionsPresenter).inSingletonScope();\n },\n resolve(container) {\n return { presenter: container.resolve(PresenterAbstraction) };\n }\n});\n"],"names":["TaskExecutionsPresenterFeature","createFeature","container","TaskExecutionsPresenter","PresenterAbstraction"],"mappings":";;;AAIO,MAAMA,iCAAiCC,cAAc;IACxD,MAAM;IACN,UAASC,SAAS;QACdA,UAAU,QAAQ,CAACC,6DAAyB,gBAAgB;IAChE;IACA,SAAQD,SAAS;QACb,OAAO;YAAE,WAAWA,UAAU,OAAO,CAACE;QAAsB;IAChE;AACJ"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const HasPermission: import("react").FC<import("@webiny/app-admin/permissions").HasPermissionProps<{
|
|
2
|
+
readonly prefix: "backgroundTasks";
|
|
3
|
+
readonly fullAccess: true;
|
|
4
|
+
readonly entities: [{
|
|
5
|
+
readonly id: "task";
|
|
6
|
+
readonly permission: "backgroundTasks.task";
|
|
7
|
+
readonly scopes: ["full"];
|
|
8
|
+
readonly actions: [{
|
|
9
|
+
readonly name: "rwd";
|
|
10
|
+
}];
|
|
11
|
+
}];
|
|
12
|
+
}>>;
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createHasPermission } from "@webiny/app-admin/exports/admin/security.js";
|
|
2
|
+
import { TaskPermissions } from "../../features/permissions/abstractions.js";
|
|
3
|
+
const HasPermission = createHasPermission(TaskPermissions);
|
|
4
|
+
export { HasPermission };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=HasPermission.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/presentation/security/HasPermission.js","sources":["../../../../src/admin/presentation/security/HasPermission.tsx"],"sourcesContent":["import { createHasPermission } from \"@webiny/app-admin/exports/admin/security.js\";\nimport { TaskPermissions } from \"~/admin/features/permissions/abstractions.js\";\nimport { BACKGROUND_TASK_PERMISSIONS_SCHEMA } from \"~/admin/permissions.js\";\n\nexport const HasPermission =\n createHasPermission<typeof BACKGROUND_TASK_PERMISSIONS_SCHEMA>(TaskPermissions);\n"],"names":["HasPermission","createHasPermission","TaskPermissions"],"mappings":";;AAIO,MAAMA,gBACTC,oBAA+DC"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export declare const usePermissions: () => {
|
|
2
|
+
canAccess: (entityId: "task") => boolean;
|
|
3
|
+
canAction: (action: string, entityId: "task") => boolean;
|
|
4
|
+
} & {
|
|
5
|
+
canRead: (entityId: "task") => boolean;
|
|
6
|
+
canCreate: (entityId: "task") => boolean;
|
|
7
|
+
canEdit: (entityId: "task", item?: import("@webiny/app-admin/permissions").OwnableItem) => boolean;
|
|
8
|
+
canDelete: (entityId: "task", item?: import("@webiny/app-admin/permissions").OwnableItem) => boolean;
|
|
9
|
+
} & {
|
|
10
|
+
canPublish: (entityId: string) => boolean;
|
|
11
|
+
canUnpublish: (entityId: string) => boolean;
|
|
12
|
+
};
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import { createUsePermissions } from "@webiny/app-admin/exports/admin/security.js";
|
|
2
|
+
import { TaskPermissions } from "../../features/permissions/abstractions.js";
|
|
3
|
+
const usePermissions = createUsePermissions(TaskPermissions);
|
|
4
|
+
export { usePermissions };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=usePermissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/presentation/security/usePermissions.js","sources":["../../../../src/admin/presentation/security/usePermissions.ts"],"sourcesContent":["import { createUsePermissions } from \"@webiny/app-admin/exports/admin/security.js\";\nimport { TaskPermissions } from \"~/admin/features/permissions/abstractions.js\";\n\nexport const usePermissions = createUsePermissions(TaskPermissions);\n"],"names":["usePermissions","createUsePermissions","TaskPermissions"],"mappings":";;AAGO,MAAMA,iBAAiBC,qBAAqBC"}
|
package/admin/routes.js
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { Route } from "@webiny/app-admin";
|
|
2
|
+
const Routes = {
|
|
3
|
+
Definitions: new Route({
|
|
4
|
+
name: "BackgroundTasks/Definitions",
|
|
5
|
+
path: "/background-tasks/definitions"
|
|
6
|
+
}),
|
|
7
|
+
Executions: new Route({
|
|
8
|
+
name: "BackgroundTasks/Executions",
|
|
9
|
+
path: "/background-tasks/executions"
|
|
10
|
+
})
|
|
11
|
+
};
|
|
12
|
+
export { Routes };
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=routes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin/routes.js","sources":["../../src/admin/routes.ts"],"sourcesContent":["import { Route } from \"@webiny/app-admin\";\n\nexport const Routes = {\n Definitions: new Route({\n name: \"BackgroundTasks/Definitions\",\n path: \"/background-tasks/definitions\"\n }),\n Executions: new Route({\n name: \"BackgroundTasks/Executions\",\n path: \"/background-tasks/executions\"\n })\n};\n"],"names":["Routes","Route"],"mappings":";AAEO,MAAMA,SAAS;IAClB,aAAa,IAAIC,MAAM;QACnB,MAAM;QACN,MAAM;IACV;IACA,YAAY,IAAIA,MAAM;QAClB,MAAM;QACN,MAAM;IACV;AACJ"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { TaskRun } from "@webiny/sdk";
|
|
2
|
+
export type TaskStatus = "pending" | "running" | "success" | "failed" | "aborted";
|
|
3
|
+
export type Task = Omit<TaskRun, "taskStatus"> & {
|
|
4
|
+
taskStatus: TaskStatus;
|
|
5
|
+
createdOn?: string;
|
|
6
|
+
savedOn?: string;
|
|
7
|
+
createdBy?: {
|
|
8
|
+
id: string;
|
|
9
|
+
displayName: string;
|
|
10
|
+
type?: string;
|
|
11
|
+
};
|
|
12
|
+
};
|
|
13
|
+
export type { TaskLog } from "@webiny/sdk";
|
|
14
|
+
export type { TaskLogItem } from "@webiny/sdk";
|
|
15
|
+
export type { TaskDefinition } from "@webiny/sdk";
|
|
File without changes
|
package/api/index.d.ts
ADDED
|
File without changes
|
package/api/index.js
ADDED
|
File without changes
|
package/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./admin/index.js";
|
package/index.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./admin/index.js";
|
package/package.json
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@webiny/background-tasks",
|
|
3
|
+
"version": "0.0.0-unstable.7be00a75a9",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"exports": {
|
|
6
|
+
".": "./index.js",
|
|
7
|
+
"./api": "./api/index.js",
|
|
8
|
+
"./admin/*": "./admin/*",
|
|
9
|
+
"./*": "./*"
|
|
10
|
+
},
|
|
11
|
+
"description": "Background Tasks feature for Webiny",
|
|
12
|
+
"keywords": [
|
|
13
|
+
"background-tasks:base"
|
|
14
|
+
],
|
|
15
|
+
"repository": {
|
|
16
|
+
"type": "git",
|
|
17
|
+
"url": "https://github.com/webiny/webiny-js.git",
|
|
18
|
+
"directory": "packages/background-tasks"
|
|
19
|
+
},
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"dependencies": {
|
|
22
|
+
"@webiny/admin-ui": "0.0.0-unstable.7be00a75a9",
|
|
23
|
+
"@webiny/app": "0.0.0-unstable.7be00a75a9",
|
|
24
|
+
"@webiny/app-admin": "0.0.0-unstable.7be00a75a9",
|
|
25
|
+
"@webiny/feature": "0.0.0-unstable.7be00a75a9",
|
|
26
|
+
"@webiny/icons": "0.0.0-unstable.7be00a75a9",
|
|
27
|
+
"@webiny/sdk": "0.0.0-unstable.7be00a75a9",
|
|
28
|
+
"lodash": "4.18.1",
|
|
29
|
+
"mobx": "6.15.3",
|
|
30
|
+
"mobx-react-lite": "4.1.1",
|
|
31
|
+
"react": "18.3.1",
|
|
32
|
+
"react-dom": "18.3.1"
|
|
33
|
+
},
|
|
34
|
+
"devDependencies": {
|
|
35
|
+
"@webiny/build-tools": "0.0.0-unstable.7be00a75a9",
|
|
36
|
+
"@webiny/project-utils": "0.0.0-unstable.7be00a75a9",
|
|
37
|
+
"typescript": "6.0.3"
|
|
38
|
+
},
|
|
39
|
+
"publishConfig": {
|
|
40
|
+
"access": "public"
|
|
41
|
+
},
|
|
42
|
+
"webiny": {
|
|
43
|
+
"publishFrom": "dist"
|
|
44
|
+
}
|
|
45
|
+
}
|