@evenicanpm/admin-integrate 1.2.0 → 1.3.0

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 (208) hide show
  1. package/documents/ConfigImport/configuration-import.ts +54 -0
  2. package/documents/CopyProcess/copy.ts +25 -0
  3. package/documents/Endpoint/fragments.ts +9 -0
  4. package/documents/Endpoint/list.ts +22 -0
  5. package/documents/Process/fragments.ts +35 -0
  6. package/documents/Process/get-process-details.ts +73 -0
  7. package/documents/Process/list.ts +51 -0
  8. package/documents/ProcessConfig/fragments.ts +116 -0
  9. package/documents/ProcessConfig/read.ts +35 -0
  10. package/documents/ProcessExecution/fragments.ts +12 -0
  11. package/documents/ProcessExecution/list.ts +30 -1
  12. package/documents/ProcessExecutionDetails/fragments.ts +96 -0
  13. package/documents/ProcessExecutionDetails/read.ts +12 -0
  14. package/documents/ProcessScheduleGroup/read.ts +43 -0
  15. package/documents/ProcessTask/fragments.ts +285 -0
  16. package/documents/ProcessTask/read.ts +12 -0
  17. package/documents/ProcessTemplate/fragments.ts +69 -0
  18. package/documents/ProcessTemplate/list.ts +67 -0
  19. package/documents/ProcessTemplate/read.ts +12 -0
  20. package/documents/RunProcess/run.ts +11 -0
  21. package/package.json +4 -3
  22. package/src/api/Integrations/queries/get-process.query.ts +48 -0
  23. package/src/api/Integrations/queries/get-process.server.ts +14 -0
  24. package/src/api/Integrations/queries/index.ts +1 -0
  25. package/src/api/dashboard/queries/get-process-executions.query.ts +6 -3
  26. package/src/api/dashboard/queries/get-process-executions.server.ts +1 -1
  27. package/src/api/execution-details/queries/get-process-execution-details.query.ts +46 -0
  28. package/src/api/execution-details/queries/get-process-execution-details.server.ts +11 -0
  29. package/src/api/execution-details/queries/get-process-executions-by-process.query.ts +48 -0
  30. package/src/api/execution-details/queries/get-process-executions-by-process.server.ts +11 -0
  31. package/src/api/execution-details/queries/index.ts +2 -0
  32. package/src/api/process/mutations/copy-process.mutation.ts +48 -0
  33. package/src/api/process/mutations/copy-process.server.ts +14 -0
  34. package/src/api/process/mutations/index.ts +2 -0
  35. package/src/api/process/mutations/run-process.mutation.ts +41 -0
  36. package/src/api/process/mutations/run-process.server.ts +14 -0
  37. package/src/api/process/queries/get-process-by-id.query.ts +85 -0
  38. package/src/api/process/queries/get-process-by-id.server.ts +20 -0
  39. package/src/api/process/queries/index.ts +4 -0
  40. package/src/api/process-config/mutation/index.ts +2 -0
  41. package/src/api/process-config/mutation/process-config-import.mutation.ts +33 -0
  42. package/src/api/process-config/mutation/process-config-import.server.ts +14 -0
  43. package/src/api/process-config/mutation/process-config-merge.mutation.ts +33 -0
  44. package/src/api/process-config/mutation/process-config-merge.server.ts +14 -0
  45. package/src/api/process-task/queries/get-process-task-by-id.query.ts +45 -0
  46. package/src/api/process-task/queries/get-process-task-by-id.server.ts +9 -0
  47. package/src/api/process-task/queries/index.ts +1 -0
  48. package/src/api/scheduler/mutation/create-process-schedule-group-details.mutation.ts +47 -0
  49. package/src/api/scheduler/mutation/create-process-schedule-group-details.server.ts +14 -0
  50. package/src/api/scheduler/mutation/index.ts +2 -0
  51. package/src/api/scheduler/mutation/update-process-schedule-group-details.mutation.ts +47 -0
  52. package/src/api/scheduler/mutation/update-process-schedule-group-details.server.ts +14 -0
  53. package/src/api/scheduler/queries/get-non-scheduled-processes.query.ts +48 -0
  54. package/src/api/scheduler/queries/get-non-scheduled-processes.server.ts +11 -0
  55. package/src/api/scheduler/queries/get-process-schedule-group-details.query.ts +6 -3
  56. package/src/api/scheduler/queries/get-process-schedule-group-details.server.ts +3 -3
  57. package/src/api/scheduler/queries/get-process-schedule.query.ts +6 -3
  58. package/src/api/scheduler/queries/get-process-schedule.server.ts +3 -3
  59. package/src/api/scheduler/queries/get-scheduled-processes.query.ts +6 -3
  60. package/src/api/scheduler/queries/get-scheduled-processes.server.ts +1 -1
  61. package/src/api/scheduler/queries/index.ts +3 -2
  62. package/src/api/templates/queries/get-process-template-groups.query.ts +48 -0
  63. package/src/api/templates/queries/get-process-template-groups.server.ts +11 -0
  64. package/src/api/templates/queries/get-process-template-records.query.ts +48 -0
  65. package/src/api/templates/queries/get-process-template-records.server.ts +11 -0
  66. package/src/api/templates/queries/get-process-template.query.ts +48 -0
  67. package/src/api/templates/queries/get-process-template.server.ts +9 -0
  68. package/src/api/templates/queries/get-process-templates.query.ts +45 -0
  69. package/src/api/templates/queries/get-process-templates.server.ts +9 -0
  70. package/src/api/templates/queries/index.ts +5 -0
  71. package/src/api/templates/queries/template-input-search.query.ts +34 -0
  72. package/src/api/templates/queries/template-input-search.server.ts +35 -0
  73. package/src/api/templates/queries/types.ts +28 -0
  74. package/src/components/breadcrumbs/breadcrumbs.tsx +32 -5
  75. package/src/components/button/outlined-icon-button.tsx +2 -2
  76. package/src/components/core/date-time-popover.tsx +11 -4
  77. package/src/components/core/drawer-buttons.tsx +52 -0
  78. package/src/components/core/edited-typography.tsx +1 -1
  79. package/src/components/core/index.ts +4 -2
  80. package/src/components/core/loading.tsx +1 -1
  81. package/src/components/core/status-tag.tsx +97 -0
  82. package/src/components/core/title-edit.tsx +18 -11
  83. package/src/components/dashboard-list/dashboard-list-row.tsx +22 -29
  84. package/src/components/dashboard-list/dashboard-list.tsx +19 -15
  85. package/src/components/data-table/table-header.tsx +5 -7
  86. package/src/components/data-table/table-pagination.tsx +1 -1
  87. package/src/components/data-table/table-row.tsx +1 -1
  88. package/src/components/data-table/table-skeleton.tsx +9 -4
  89. package/src/components/execution/execution-filter.ts +1 -1
  90. package/src/components/execution/execution-status-icon.tsx +7 -7
  91. package/src/components/execution/execution-tag.tsx +12 -77
  92. package/src/components/execution/index.ts +1 -1
  93. package/src/components/execution-history-drawer/execution-history-drawer.tsx +203 -0
  94. package/src/components/execution-history-drawer/executions-card.tsx +85 -0
  95. package/src/components/execution-history-drawer/index.ts +1 -0
  96. package/src/components/footer/footer.tsx +10 -6
  97. package/src/components/header/dashboard-list-header.tsx +12 -7
  98. package/src/components/header/execution-details-header.tsx +35 -26
  99. package/src/components/header/header.tsx +10 -3
  100. package/src/components/header/index.ts +1 -1
  101. package/src/components/header/integration-details-header.tsx +104 -45
  102. package/src/components/integration-list/index.ts +3 -0
  103. package/src/components/integration-list/integration-filter.ts +21 -0
  104. package/src/components/integration-list/integration-status-icon.tsx +32 -0
  105. package/src/components/integration-list/integration-tag.tsx +33 -0
  106. package/src/components/integration-list/list/index.ts +1 -0
  107. package/src/components/integration-list/list/integration-list-row.tsx +161 -0
  108. package/src/components/integration-list/list/integration-list-table.tsx +62 -0
  109. package/src/components/integration-list/list/integration-list.tsx +258 -0
  110. package/src/components/integration-view/animated-svg.tsx +31 -0
  111. package/src/components/integration-view/edges/default-edge.tsx +1 -1
  112. package/src/components/integration-view/elk-layout-options.ts +2 -2
  113. package/src/components/integration-view/elk-types.ts +35 -6
  114. package/src/components/integration-view/flow-types.tsx +10 -0
  115. package/src/components/integration-view/integration-view.tsx +990 -55
  116. package/src/components/integration-view/nodes/empty-node.tsx +65 -0
  117. package/src/components/integration-view/nodes/entry-node.tsx +98 -4
  118. package/src/components/integration-view/nodes/execution-entry-node.tsx +107 -0
  119. package/src/components/integration-view/nodes/execution-task-node.tsx +88 -0
  120. package/src/components/integration-view/nodes/group-node.tsx +19 -13
  121. package/src/components/integration-view/nodes/row-node.tsx +19 -0
  122. package/src/components/integration-view/nodes/task-node.tsx +14 -8
  123. package/src/components/integration-view/task-icon.tsx +193 -0
  124. package/src/components/integration-view/temp-data/initialElements.tsx +36 -32
  125. package/src/components/integration-view/types.ts +2 -2
  126. package/src/components/layouts/main-layout.tsx +2 -3
  127. package/src/components/layouts/root-container.tsx +3 -6
  128. package/src/components/link-cards/link-card.tsx +15 -4
  129. package/src/components/link-cards/styles.ts +1 -1
  130. package/src/components/list-filter/date-filter.tsx +4 -3
  131. package/src/components/list-filter/date-range-filter.tsx +11 -5
  132. package/src/components/list-filter/index.ts +1 -1
  133. package/src/components/list-filter/list-filter.tsx +31 -26
  134. package/src/components/list-filter/multi-select-filter.tsx +11 -10
  135. package/src/components/list-filter/select-filter.tsx +13 -8
  136. package/src/components/scheduler/day-selector.tsx +29 -15
  137. package/src/components/scheduler/day-tag.tsx +14 -51
  138. package/src/components/scheduler/index.ts +2 -1
  139. package/src/components/scheduler/schedule-drawer/details-reducer.ts +217 -0
  140. package/src/components/scheduler/schedule-drawer/schedule-details-integrations.tsx +503 -0
  141. package/src/{pages → components}/scheduler/schedule-drawer/schedule-details-main.tsx +136 -99
  142. package/src/components/scheduler/schedule-drawer/schedule-details-name.tsx +94 -0
  143. package/src/{pages → components}/scheduler/schedule-drawer/schedule-details-skeleton.tsx +1 -2
  144. package/src/{pages → components}/scheduler/schedule-drawer/schedule-details.tsx +9 -13
  145. package/src/components/scheduler/schedule-drawer/schedule-drawer-group.tsx +218 -0
  146. package/src/{pages → components}/scheduler/schedule-drawer/schedule-drawer-legacy.tsx +6 -25
  147. package/src/components/scheduler/schedule-drawer/schedule-drawer.tsx +116 -0
  148. package/src/components/scheduler/schedule-drawer/sortable-integration-row.tsx +130 -0
  149. package/src/components/scheduler/schedule-filter.ts +1 -1
  150. package/src/components/scheduler/schedule-icon.tsx +5 -6
  151. package/src/components/scheduler/schedule-integration-icon.tsx +31 -0
  152. package/src/components/templates/index.ts +1 -0
  153. package/src/components/templates/inputs/index.tsx +1351 -0
  154. package/src/components/templates/template-filter.ts +5 -0
  155. package/src/components/templates/templates-list/index.ts +1 -0
  156. package/src/components/templates/templates-list/templates-list-row.tsx +55 -0
  157. package/src/components/templates/templates-list/templates-list-table.tsx +58 -0
  158. package/src/components/templates/templates-list/templates-list.tsx +253 -0
  159. package/src/components/templates/types.tsx +75 -0
  160. package/src/components/templates/wizard.tsx +689 -0
  161. package/src/hooks/use-breadcrumbs.ts +1 -1
  162. package/src/hooks/use-recurrence.tsx +1 -2
  163. package/src/pages/dashboard/dashboard-link-cards.tsx +8 -11
  164. package/src/pages/dashboard/dashboard-list-sections.tsx +7 -9
  165. package/src/pages/dashboard/dashboard.tsx +1 -2
  166. package/src/pages/execution-details/execution-details.tsx +211 -14
  167. package/src/pages/execution-details/task-execution-details.tsx +160 -0
  168. package/src/pages/execution-details/task-execution-drawer.tsx +54 -0
  169. package/src/pages/executions/executions-list/executions-list-row.tsx +21 -27
  170. package/src/pages/executions/executions-list/executions-list-table.tsx +28 -35
  171. package/src/pages/executions/executions-list/executions-list.tsx +24 -18
  172. package/src/pages/executions/executions.tsx +11 -15
  173. package/src/pages/integration-create/index.ts +1 -0
  174. package/src/pages/integration-create/integration-create.tsx +174 -0
  175. package/src/pages/integration-create/pre-creation-step.tsx +12 -0
  176. package/src/pages/integration-create/select-step.tsx +105 -0
  177. package/src/pages/integration-create/template-list-step.tsx +77 -0
  178. package/src/pages/integration-create/wizard-step.tsx +50 -0
  179. package/src/pages/integration-details/import-process/copy-tasks-list.tsx +265 -0
  180. package/src/pages/integration-details/import-process/copy-tasks-row.tsx +77 -0
  181. package/src/pages/integration-details/import-process/import-confirm.tsx +61 -0
  182. package/src/pages/integration-details/import-process/import-drawer.tsx +48 -0
  183. package/src/pages/integration-details/import-process/import-process-reducer.ts +90 -0
  184. package/src/pages/integration-details/import-process/import-process.tsx +149 -0
  185. package/src/pages/integration-details/index.ts +1 -0
  186. package/src/pages/integration-details/integration-details.tsx +221 -0
  187. package/src/pages/integration-details/task-drawer/add-task.tsx +120 -0
  188. package/src/pages/integration-details/task-drawer/edit-task.tsx +175 -0
  189. package/src/pages/integration-details/task-drawer/task-drawer.tsx +139 -0
  190. package/src/pages/integration-details/task-drawer/task-reducer.ts +73 -0
  191. package/src/pages/integrations/integrations.tsx +68 -8
  192. package/src/pages/scheduler/scheduler.tsx +12 -24
  193. package/src/pages/scheduler/schedules-list/schedules-list-row.tsx +27 -37
  194. package/src/pages/scheduler/schedules-list/schedules-list-table.tsx +27 -42
  195. package/src/pages/scheduler/schedules-list/schedules-list.tsx +48 -21
  196. package/src/utils/date-functions.ts +69 -0
  197. package/src/utils/slugify.ts +3 -0
  198. package/tsconfig.json +12 -4
  199. package/src/hooks/use-timestamp.tsx +0 -25
  200. package/src/pages/scheduler/schedule-drawer/schedule-details-integrations.tsx +0 -227
  201. package/src/pages/scheduler/schedule-drawer/schedule-details-name.tsx +0 -77
  202. package/src/pages/scheduler/schedule-drawer/schedule-drawer-buttons.tsx +0 -72
  203. package/src/pages/scheduler/schedule-drawer/schedule-drawer-group.tsx +0 -103
  204. package/src/pages/scheduler/schedule-drawer/schedule-drawer.tsx +0 -101
  205. package/src/pages/scheduler/schedule-drawer/sortable-integration-row.tsx +0 -93
  206. /package/src/{pages → components}/scheduler/schedule-drawer/edited/edited-types.ts +0 -0
  207. /package/src/{pages → components}/scheduler/schedule-drawer/edited/index.ts +0 -0
  208. /package/src/{pages → components}/scheduler/schedule-drawer/index.ts +0 -0
@@ -0,0 +1,73 @@
1
+ export enum TaskActionType {
2
+ CLOSE = "CLOSE",
3
+ OPEN_ADD = "OPEN_ADD",
4
+ OPEN_EDIT = "OPEN_EDIT",
5
+ INCREMENT_STEP = "INCREMENT_STEP",
6
+ DECREMENT_STEP = "DECREMENT_STEP",
7
+ }
8
+
9
+ export enum TaskMode {
10
+ NONE = "NONE",
11
+ ADD = "ADD",
12
+ EDIT = "EDIT",
13
+ }
14
+
15
+ export interface TaskAction {
16
+ type: TaskActionType;
17
+ }
18
+
19
+ export interface EditAction extends TaskAction {
20
+ processTaskId: string;
21
+ }
22
+
23
+ export interface TaskState {
24
+ open: boolean;
25
+ mode: TaskMode;
26
+ step: number | null;
27
+ processTaskId?: string | null;
28
+ }
29
+
30
+ export function taskReducer(state: TaskState, action: TaskAction): TaskState {
31
+ switch (action.type) {
32
+ case TaskActionType.CLOSE: {
33
+ return {
34
+ open: false,
35
+ mode: TaskMode.NONE,
36
+ step: null,
37
+ processTaskId: null,
38
+ };
39
+ }
40
+ case TaskActionType.OPEN_ADD: {
41
+ return {
42
+ open: true,
43
+ mode: TaskMode.ADD,
44
+ step: 0,
45
+ processTaskId: null,
46
+ };
47
+ }
48
+ case TaskActionType.OPEN_EDIT: {
49
+ return {
50
+ open: true,
51
+ mode: TaskMode.EDIT,
52
+ step: 0,
53
+ processTaskId: (action as EditAction).processTaskId,
54
+ };
55
+ }
56
+ case TaskActionType.INCREMENT_STEP: {
57
+ return {
58
+ ...state,
59
+ step: state.step !== null ? state.step + 1 : null,
60
+ };
61
+ }
62
+ case TaskActionType.DECREMENT_STEP: {
63
+ return {
64
+ ...state,
65
+ step: state.step !== null ? Math.max(state.step - 1, 0) : null,
66
+ };
67
+ }
68
+ default: {
69
+ console.error(`${action.type} is not a valid action for detailsReducer`);
70
+ return state;
71
+ }
72
+ }
73
+ }
@@ -1,17 +1,21 @@
1
- import React from "react";
2
- import { useTranslations } from "next-intl";
3
-
4
- // MUI
5
- import { Box } from "@mui/material";
6
-
7
- // Custom components
1
+ import type {
2
+ GetProcessesQuery,
3
+ ProcessInput,
4
+ } from "@evenicanpm/admin-core/api/e4/graphqlRequestSdk";
5
+ import { getProcesses } from "@evenicanpm/admin-integrate/api/Integrations/queries";
8
6
  import {
7
+ type Crumb,
9
8
  IntegrateBreadcrumbs,
10
- Crumb,
11
9
  } from "@evenicanpm/admin-integrate/components/breadcrumbs";
10
+ import type { Head } from "@evenicanpm/admin-integrate/components/data-table/table-header";
11
+ import { IntegrationList } from "@evenicanpm/admin-integrate/components/integration-list";
12
+ import { Box } from "@mui/material";
13
+ import { useTranslations } from "next-intl";
14
+ import { useState } from "react";
12
15
 
13
16
  export default function Integrations() {
14
17
  const t = useTranslations("Integrate");
18
+ const l = useTranslations("Integrate.IntegrationList.ListHeader");
15
19
 
16
20
  const breadcrumbs: Crumb[] = [
17
21
  {
@@ -23,9 +27,65 @@ export default function Integrations() {
23
27
  },
24
28
  ];
25
29
 
30
+ const heading: Head[] = [
31
+ {
32
+ id: "name",
33
+ label: l("integrationName"),
34
+ align: "left",
35
+ width: "30%",
36
+ sortable: true,
37
+ },
38
+ {
39
+ id: "id",
40
+ label: l("id"),
41
+ align: "left",
42
+ width: "15%",
43
+ },
44
+ {
45
+ id: "isScheduled",
46
+ label: l("status"),
47
+ align: "center",
48
+ width: "30%",
49
+ },
50
+ {
51
+ id: "modified",
52
+ label: l("lastModified"),
53
+ align: "center",
54
+ width: "15%",
55
+ sortable: true,
56
+ },
57
+ {
58
+ id: "view",
59
+ label: l("actions"),
60
+ align: "center",
61
+ width: "5%",
62
+ },
63
+ ];
64
+
65
+ // TODO: initialize input based on url query params
66
+ const [input, setInput] = useState<ProcessInput>({
67
+ skip: 0,
68
+ sort: "modified",
69
+ sortDesc: true,
70
+ top: 10,
71
+ integrationTags: null,
72
+ search: null,
73
+ });
74
+
75
+ const { data, isLoading } = getProcesses.useData({
76
+ input: input,
77
+ });
78
+
26
79
  return (
27
80
  <Box>
28
81
  <IntegrateBreadcrumbs breadcrumbs={breadcrumbs} />
82
+ <IntegrationList
83
+ heading={heading}
84
+ data={data as GetProcessesQuery}
85
+ loading={isLoading}
86
+ input={input}
87
+ setInput={setInput}
88
+ />
29
89
  </Box>
30
90
  );
31
91
  }
@@ -1,31 +1,19 @@
1
- import React, { useState } from "react";
2
- import { useTranslations } from "next-intl";
3
-
4
- // API
5
- import { getScheduledProcesses } from "@evenicanpm/admin-integrate/api/scheduler/queries";
6
- import {
7
- ScheduledProcessInput,
1
+ import type {
8
2
  GetScheduledProcessesQuery,
3
+ ScheduledProcessInput,
9
4
  } from "@evenicanpm/admin-core/api/e4/graphqlRequestSdk";
10
-
11
- // MUI
5
+ import { getScheduledProcesses } from "@evenicanpm/admin-integrate/api/scheduler/queries";
6
+ import {
7
+ type Crumb,
8
+ IntegrateBreadcrumbs,
9
+ } from "@evenicanpm/admin-integrate/components/breadcrumbs";
10
+ import type { Head } from "@evenicanpm/admin-integrate/components/data-table/table-header";
11
+ import ScheduleDrawer from "@evenicanpm/admin-integrate/components/scheduler/schedule-drawer";
12
+ import type { DrawerOpen } from "@evenicanpm/admin-integrate/components/scheduler/schedule-drawer/schedule-drawer";
12
13
  import { Box } from "@mui/material";
13
-
14
- // Custom components
15
- import { IntegrateBreadcrumbs } from "@evenicanpm/admin-integrate/components/breadcrumbs";
16
-
17
- // Local components
14
+ import { useTranslations } from "next-intl";
15
+ import { useState } from "react";
18
16
  import SchedulesList from "./schedules-list";
19
- import ScheduleDrawer from "./schedule-drawer";
20
-
21
- // Types
22
- import { Crumb } from "@evenicanpm/admin-integrate/components/breadcrumbs";
23
- import { Head } from "@evenicanpm/admin-integrate/components/data-table/table-header";
24
-
25
- export type DrawerOpen = {
26
- id: string;
27
- group?: boolean;
28
- };
29
17
 
30
18
  export default function Scheduler() {
31
19
  const t = useTranslations("Integrate");
@@ -1,37 +1,36 @@
1
- import React, { useState } from "react";
2
-
3
- // MUI
4
- import { Theme, useTheme } from "@mui/material";
5
- import { Box, Stack, Typography } from "@mui/material";
6
- import { RemoveRedEye } from "@mui/icons-material";
7
- import { SxProps } from "@mui/material";
8
-
9
- // Custom components
1
+ import { DateTimePopover } from "@evenicanpm/admin-integrate/components/core";
2
+ import type { Head } from "@evenicanpm/admin-integrate/components/data-table/table-header";
10
3
  import {
4
+ StyledIconButton,
11
5
  StyledTableCell,
12
6
  StyledTableRow,
13
- StyledIconButton,
14
7
  } from "@evenicanpm/admin-integrate/components/data-table/table-row";
15
8
  import {
9
+ type DayString,
16
10
  DayTag,
11
+ dayKeys,
12
+ isDayMap,
17
13
  ScheduleIcon,
18
14
  } from "@evenicanpm/admin-integrate/components/scheduler";
19
- import { DateTimePopover } from "@evenicanpm/admin-integrate/components/core";
20
-
21
- // Hooks
22
- import useTimestamp from "@evenicanpm/admin-integrate/hooks/use-timestamp";
15
+ import type { DrawerOpen } from "@evenicanpm/admin-integrate/components/scheduler/schedule-drawer/schedule-drawer";
23
16
  import useRecurrence from "@evenicanpm/admin-integrate/hooks/use-recurrence";
24
-
25
- // Types
26
- import { Item } from "./schedules-list";
27
- import { Head } from "@evenicanpm/admin-integrate/components/data-table/table-header";
28
- import { TableCellProps } from "@mui/material";
29
17
  import {
30
- DayString,
31
- dayKeys,
32
- isDayMap,
33
- } from "@evenicanpm/admin-integrate/components/scheduler";
34
- import { DrawerOpen } from "../scheduler";
18
+ toDistanceDate,
19
+ toShortDate,
20
+ } from "@evenicanpm/admin-integrate/utils/date-functions";
21
+ import { RemoveRedEye } from "@mui/icons-material";
22
+ import {
23
+ Box,
24
+ Stack,
25
+ type SxProps,
26
+ type TableCellProps,
27
+ type Theme,
28
+ Typography,
29
+ useTheme,
30
+ } from "@mui/material";
31
+ import type React from "react";
32
+ import { useState } from "react";
33
+ import type { Item } from "./schedules-list";
35
34
 
36
35
  interface Props {
37
36
  item: Item;
@@ -44,20 +43,11 @@ const SchedulesListRow: React.FC<Props> = (props: Props) => {
44
43
  const theme = useTheme();
45
44
  const styles = getStyles(theme);
46
45
 
47
- // e.g. "xx days ago"
48
- const modified = useTimestamp(props.item.modified);
49
- const modifiedFull = new Date(props.item.modified).toString();
50
-
51
46
  const recurrence = useRecurrence(
52
47
  props.item.interval,
53
48
  props.item.intervalUnitId,
54
49
  );
55
50
 
56
- const start = new Date(props.item.startDate);
57
- const startDateLocale = start.toLocaleString().split(",")[0];
58
- const startTimeLocale = start.toLocaleTimeString().slice(0, 5);
59
- const startDateFull = start.toString();
60
-
61
51
  const [modifiedAnchorEl, setModifiedAnchorEl] = useState<HTMLElement | null>(
62
52
  null,
63
53
  );
@@ -146,7 +136,7 @@ const SchedulesListRow: React.FC<Props> = (props: Props) => {
146
136
  onMouseEnter={handlePopoverOpen}
147
137
  onMouseLeave={handlePopoverClose}
148
138
  >
149
- {`${startDateLocale} ${startTimeLocale}`}
139
+ {toShortDate(props.item.startDate)}
150
140
  </Typography>
151
141
  </StyledTableCell>
152
142
  <StyledTableCell
@@ -159,7 +149,7 @@ const SchedulesListRow: React.FC<Props> = (props: Props) => {
159
149
  onMouseEnter={handlePopoverOpen}
160
150
  onMouseLeave={handlePopoverClose}
161
151
  >
162
- {modified}
152
+ {toDistanceDate(props.item.modified)}
163
153
  </Typography>
164
154
  </StyledTableCell>
165
155
  <StyledTableCell
@@ -172,7 +162,7 @@ const SchedulesListRow: React.FC<Props> = (props: Props) => {
172
162
  </StyledTableCell>
173
163
 
174
164
  <DateTimePopover
175
- dateIsoString={modifiedFull}
165
+ dateIsoString={props.item.modified}
176
166
  sx={{ pointerEvents: "none" }}
177
167
  open={modifiedOpen}
178
168
  anchorEl={modifiedAnchorEl}
@@ -188,7 +178,7 @@ const SchedulesListRow: React.FC<Props> = (props: Props) => {
188
178
  disableRestoreFocus
189
179
  />
190
180
  <DateTimePopover
191
- dateIsoString={startDateFull}
181
+ dateIsoString={props.item.startDate}
192
182
  sx={{ pointerEvents: "none" }}
193
183
  open={startDateOpen}
194
184
  anchorEl={startDateAnchorEl}
@@ -1,25 +1,12 @@
1
- import React from "react";
2
-
3
- // Types
4
- import { Head } from "@evenicanpm/admin-integrate/components/data-table/table-header";
5
- import { Item } from "./schedules-list";
6
-
7
- // API
8
- import { ScheduledProcessInput } from "@evenicanpm/admin-core/api/e4/graphqlRequestSdk";
9
-
10
- // MUI
11
- import { TableContainer, Table, TableBody } from "@mui/material";
12
- import { SxProps } from "@mui/material";
13
-
14
- // Custom components
1
+ import type { ScheduledProcessInput } from "@evenicanpm/admin-core/api/e4/graphqlRequestSdk";
15
2
  import { TableHeader } from "@evenicanpm/admin-integrate/components/data-table";
16
-
17
- // Local components
3
+ import type { Head } from "@evenicanpm/admin-integrate/components/data-table/table-header";
4
+ import type { DrawerOpen } from "@evenicanpm/admin-integrate/components/scheduler/schedule-drawer/schedule-drawer";
5
+ import { type SxProps, Table, TableBody, TableContainer } from "@mui/material";
6
+ import type React from "react";
7
+ import type { Item } from "./schedules-list";
18
8
  import SchedulesListRow from "./schedules-list-row";
19
9
 
20
- // Types
21
- import { DrawerOpen } from "../scheduler";
22
-
23
10
  interface Props {
24
11
  heading: Head[];
25
12
  items: Item[];
@@ -47,28 +34,26 @@ export default function SchedulesListTable(props: Props) {
47
34
  };
48
35
 
49
36
  return (
50
- <>
51
- <TableContainer>
52
- <Table>
53
- <TableHeader
54
- heading={props.heading}
55
- orderBy={props.input.sort || ""}
56
- order={props.input.sortDesc ? "desc" : "asc"}
57
- onRequestSort={handleRequestSort}
58
- />
59
- <TableBody>
60
- {props.items.map((item, index) => (
61
- <SchedulesListRow
62
- key={index}
63
- item={item}
64
- heading={props.heading}
65
- sx={props.rowSx}
66
- setDrawerOpen={props.setDrawerOpen}
67
- />
68
- ))}
69
- </TableBody>
70
- </Table>
71
- </TableContainer>
72
- </>
37
+ <TableContainer>
38
+ <Table>
39
+ <TableHeader
40
+ heading={props.heading}
41
+ orderBy={props.input.sort || ""}
42
+ order={props.input.sortDesc ? "desc" : "asc"}
43
+ onRequestSort={handleRequestSort}
44
+ />
45
+ <TableBody>
46
+ {props.items.map((item) => (
47
+ <SchedulesListRow
48
+ key={item.id}
49
+ item={item}
50
+ heading={props.heading}
51
+ sx={props.rowSx}
52
+ setDrawerOpen={props.setDrawerOpen}
53
+ />
54
+ ))}
55
+ </TableBody>
56
+ </Table>
57
+ </TableContainer>
73
58
  );
74
59
  }
@@ -1,35 +1,35 @@
1
- import React, { useState, useEffect } from "react";
2
- import { useTranslations } from "next-intl";
3
-
4
- // API
5
- import {
6
- ScheduledProcessInput,
1
+ import type {
7
2
  GetScheduledProcessesQuery,
3
+ ScheduledProcessInput,
8
4
  } from "@evenicanpm/admin-core/api/e4/graphqlRequestSdk";
9
-
10
- // MUI
11
- import { Theme, useTheme } from "@mui/material";
12
- import { Card, Box, Stack, Typography, Grid2 as Grid } from "@mui/material";
13
-
14
- // Custom components
15
5
  import { FlexBox } from "@evenicanpm/admin-core/components/flex-box";
16
6
  import {
17
7
  TablePagination,
18
8
  TableSkeleton,
19
9
  } from "@evenicanpm/admin-integrate/components/data-table";
10
+ import type { Head } from "@evenicanpm/admin-integrate/components/data-table/table-header";
20
11
  import { ListFilter } from "@evenicanpm/admin-integrate/components/list-filter";
21
-
22
- // Local components
23
- import SchedulesListTable from "./schedules-list-table";
24
-
25
- // Types
26
- import { Head } from "@evenicanpm/admin-integrate/components/data-table/table-header";
27
- import { ListFilterOutput } from "@evenicanpm/admin-integrate/components/list-filter/list-filter-types";
12
+ import type { ListFilterOutput } from "@evenicanpm/admin-integrate/components/list-filter/list-filter-types";
13
+ import type { DrawerOpen } from "@evenicanpm/admin-integrate/components/scheduler/schedule-drawer/schedule-drawer";
28
14
  import {
29
- SchedulesListFilters,
15
+ type SchedulesListFilters,
30
16
  schedulesListFilters,
31
17
  } from "@evenicanpm/admin-integrate/components/scheduler/schedule-filter";
32
- import { DrawerOpen } from "../scheduler";
18
+ import AddIcon from "@mui/icons-material/Add";
19
+ import {
20
+ Box,
21
+ Card,
22
+ Grid2 as Grid,
23
+ Stack,
24
+ type Theme,
25
+ Typography,
26
+ useTheme,
27
+ } from "@mui/material";
28
+ import Button from "@mui/material/Button";
29
+ import { useTranslations } from "next-intl";
30
+ import type React from "react";
31
+ import { useEffect, useState } from "react";
32
+ import SchedulesListTable from "./schedules-list-table";
33
33
 
34
34
  export type Item = {
35
35
  id: string;
@@ -124,6 +124,15 @@ const SchedulesList: React.FC<Props> = (props: Props) => {
124
124
  }
125
125
  }, [props.data]);
126
126
 
127
+ const handleMenuOpen = () => {
128
+ const newDrawerOpen: DrawerOpen = {
129
+ id: "",
130
+ group: true,
131
+ addMode: true,
132
+ };
133
+ props.setDrawerOpen(newDrawerOpen);
134
+ };
135
+
127
136
  return (
128
137
  <>
129
138
  <Box sx={styles.list}>
@@ -138,6 +147,20 @@ const SchedulesList: React.FC<Props> = (props: Props) => {
138
147
  },
139
148
  }}
140
149
  />
150
+ <Button
151
+ variant="contained"
152
+ color="info"
153
+ startIcon={<AddIcon />}
154
+ onClick={handleMenuOpen}
155
+ sx={{
156
+ padding: theme.spacing(1, 2),
157
+ fontSize: ".89rem",
158
+ textTransform: "none",
159
+ borderRadius: 1,
160
+ }}
161
+ >
162
+ {t("addNew")}
163
+ </Button>
141
164
  </Box>
142
165
 
143
166
  {props.loading && !props.data && (
@@ -267,6 +290,10 @@ const getStyles = (theme: Theme) => {
267
290
  },
268
291
  list: {
269
292
  margin: theme.spacing(2, 0),
293
+ display: "flex",
294
+ alignItems: "center",
295
+ justifyContent: "space-between",
296
+ width: "100%",
270
297
  },
271
298
  paginationBox: {
272
299
  paddingLeft: theme.spacing(15),
@@ -0,0 +1,69 @@
1
+ import {
2
+ type FormatDistanceOptions,
3
+ type FormatDurationOptions,
4
+ type FormatOptions,
5
+ format,
6
+ formatDistanceStrict,
7
+ formatDuration,
8
+ } from "date-fns";
9
+
10
+ export function toShortDate(
11
+ dateString: string,
12
+ pattern: string = "Ppp",
13
+ options?: FormatOptions,
14
+ ) {
15
+ try {
16
+ const date = new Date(dateString);
17
+ const formatted = format(date, pattern, options);
18
+ return formatted;
19
+ } catch (error) {
20
+ console.error(error);
21
+ return "N/A";
22
+ }
23
+ }
24
+
25
+ export function toLongDate(dateString: string) {
26
+ try {
27
+ const date = new Date(dateString);
28
+ const formatted = date.toString();
29
+ return formatted;
30
+ } catch (error) {
31
+ console.error(error);
32
+ return "N/A";
33
+ }
34
+ }
35
+
36
+ export function toDistanceDate(
37
+ dateString: string,
38
+ options?: FormatDistanceOptions,
39
+ ) {
40
+ try {
41
+ const date = new Date(dateString);
42
+ const now = new Date();
43
+ const formatted = formatDistanceStrict(now, date, options);
44
+ return formatted;
45
+ } catch (error) {
46
+ console.error(error);
47
+ return "N/A";
48
+ }
49
+ }
50
+
51
+ export function toDurationDate(
52
+ startDate: string,
53
+ endDate: string,
54
+ options?: FormatDurationOptions,
55
+ ) {
56
+ try {
57
+ const start = new Date(startDate);
58
+ const end = new Date(endDate);
59
+ const seconds = Math.floor((end.getTime() - start.getTime()) / 1000);
60
+ const formatted = formatDuration(
61
+ { seconds: seconds },
62
+ { format: ["seconds"], ...options },
63
+ );
64
+ return formatted;
65
+ } catch (error) {
66
+ console.error(error);
67
+ return "";
68
+ }
69
+ }
@@ -0,0 +1,3 @@
1
+ export function slugify(input: string) {
2
+ return input.toLowerCase().replaceAll(" ", "_");
3
+ }
package/tsconfig.json CHANGED
@@ -15,10 +15,18 @@
15
15
  "typeRoots": ["../../../../admin/node_modules/@types"],
16
16
  "paths": {
17
17
  "*": ["../../../../admin/node_modules/*"],
18
- "@/lib/*": ["src/lib/*"],
19
- "@/auth/*": ["src/auth/*"],
20
- "@/api/*": ["src/api/*"],
21
- "@/components/*": ["src/components/*"],
18
+ "@/lib/*": [
19
+ "../../../../admin/node_modules/@evenicanpm/admin-integrate/src/lib/*"
20
+ ],
21
+ "@/auth/*": [
22
+ "../../../../admin/node_modules/@evenicanpm/admin-integrate/src/auth/*"
23
+ ],
24
+ "@/api/*": [
25
+ "../../../../admin/node_modules/@evenicanpm/admin-integrate/src/api/*"
26
+ ],
27
+ "@/components/*": [
28
+ "../../../../admin/node_modules/@evenicanpm/admin-integrate/src/components/*"
29
+ ],
22
30
  "@evenicanpm/admin-core/*": [
23
31
  "../../../../admin/node_modules/@evenicanpm/admin-core/src/*"
24
32
  ],
@@ -1,25 +0,0 @@
1
- export default function useTimestamp(dateTime: string) {
2
- const then = new Date(dateTime);
3
- const diffTime = Date.now() - then.getTime();
4
- const diffDays = Math.floor(diffTime / (1000 * 60 * 60 * 24));
5
-
6
- let result: string;
7
- if (diffDays === 0) {
8
- const diffMin = Math.floor(diffTime / (1000 * 60));
9
- if (diffMin === 0) {
10
- result = "Now";
11
- } else if (diffMin >= 60) {
12
- result = Math.floor(diffTime / (1000 * 60 * 60)) + "h ago";
13
- } else {
14
- result = diffMin + "m ago";
15
- }
16
- } else {
17
- if (diffDays === 1) {
18
- result = "Yesterday";
19
- } else {
20
- result = diffDays + " days ago";
21
- }
22
- }
23
-
24
- return result;
25
- }