@evenicanpm/admin-integrate 1.2.2 → 1.4.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 (215) 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 +30 -0
  5. package/documents/Process/fragments.ts +22 -0
  6. package/documents/Process/get-process-details.ts +72 -0
  7. package/documents/Process/list.ts +24 -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/ProcessExport/read.ts +108 -0
  15. package/documents/ProcessScheduleGroup/read.ts +43 -0
  16. package/documents/ProcessTask/fragments.ts +288 -0
  17. package/documents/ProcessTask/read.ts +12 -0
  18. package/documents/ProcessTemplate/fragments.ts +74 -0
  19. package/documents/ProcessTemplate/list.ts +67 -0
  20. package/documents/ProcessTemplate/read.ts +12 -0
  21. package/documents/RunProcess/run.ts +11 -0
  22. package/package.json +4 -3
  23. package/src/api/Integrations/queries/get-process.query.ts +12 -12
  24. package/src/api/Integrations/queries/get-process.server.ts +7 -2
  25. package/src/api/configuration/queries/configuration-export.query.ts +48 -0
  26. package/src/api/configuration/queries/configuration-export.server.ts +9 -0
  27. package/src/api/configuration/queries/index.ts +1 -0
  28. package/src/api/dashboard/queries/get-process-executions.query.ts +6 -3
  29. package/src/api/dashboard/queries/get-process-executions.server.ts +1 -1
  30. package/src/api/execution-details/queries/get-process-execution-details.query.ts +46 -0
  31. package/src/api/execution-details/queries/get-process-execution-details.server.ts +11 -0
  32. package/src/api/execution-details/queries/get-process-executions-by-process.query.ts +48 -0
  33. package/src/api/execution-details/queries/get-process-executions-by-process.server.ts +11 -0
  34. package/src/api/execution-details/queries/index.ts +2 -0
  35. package/src/api/process/mutations/copy-process.mutation.ts +45 -0
  36. package/src/api/process/mutations/copy-process.server.ts +14 -0
  37. package/src/api/process/mutations/index.ts +2 -0
  38. package/src/api/process/mutations/run-process.mutation.ts +41 -0
  39. package/src/api/process/mutations/run-process.server.ts +14 -0
  40. package/src/api/process/queries/get-process-by-id.query.ts +85 -0
  41. package/src/api/process/queries/get-process-by-id.server.ts +20 -0
  42. package/src/api/process/queries/index.ts +4 -0
  43. package/src/api/process-config/mutation/index.ts +2 -0
  44. package/src/api/process-config/mutation/process-config-import.mutation.ts +42 -0
  45. package/src/api/process-config/mutation/process-config-import.server.ts +14 -0
  46. package/src/api/process-config/mutation/process-config-merge.mutation.ts +33 -0
  47. package/src/api/process-config/mutation/process-config-merge.server.ts +14 -0
  48. package/src/api/process-task/queries/get-process-task-by-id.query.ts +46 -0
  49. package/src/api/process-task/queries/get-process-task-by-id.server.ts +9 -0
  50. package/src/api/process-task/queries/index.ts +1 -0
  51. package/src/api/scheduler/mutation/create-process-schedule-group-details.mutation.ts +47 -0
  52. package/src/api/scheduler/mutation/create-process-schedule-group-details.server.ts +14 -0
  53. package/src/api/scheduler/mutation/index.ts +2 -0
  54. package/src/api/scheduler/mutation/update-process-schedule-group-details.mutation.ts +47 -0
  55. package/src/api/scheduler/mutation/update-process-schedule-group-details.server.ts +14 -0
  56. package/src/api/scheduler/queries/get-non-scheduled-processes.query.ts +48 -0
  57. package/src/api/scheduler/queries/get-non-scheduled-processes.server.ts +11 -0
  58. package/src/api/scheduler/queries/get-process-schedule-group-details.query.ts +6 -3
  59. package/src/api/scheduler/queries/get-process-schedule-group-details.server.ts +3 -3
  60. package/src/api/scheduler/queries/get-process-schedule.query.ts +6 -3
  61. package/src/api/scheduler/queries/get-process-schedule.server.ts +3 -3
  62. package/src/api/scheduler/queries/get-scheduled-processes.query.ts +6 -3
  63. package/src/api/scheduler/queries/get-scheduled-processes.server.ts +1 -1
  64. package/src/api/scheduler/queries/index.ts +3 -2
  65. package/src/api/templates/queries/get-process-template-groups.query.ts +48 -0
  66. package/src/api/templates/queries/get-process-template-groups.server.ts +11 -0
  67. package/src/api/templates/queries/get-process-template-records.query.ts +48 -0
  68. package/src/api/templates/queries/get-process-template-records.server.ts +11 -0
  69. package/src/api/templates/queries/get-process-template.query.ts +48 -0
  70. package/src/api/templates/queries/get-process-template.server.ts +9 -0
  71. package/src/api/templates/queries/get-process-templates.query.ts +45 -0
  72. package/src/api/templates/queries/get-process-templates.server.ts +9 -0
  73. package/src/api/templates/queries/index.ts +5 -0
  74. package/src/api/templates/queries/template-input-search.query.ts +39 -0
  75. package/src/api/templates/queries/template-input-search.server.ts +42 -0
  76. package/src/api/templates/queries/types.ts +34 -0
  77. package/src/components/breadcrumbs/breadcrumbs.tsx +33 -6
  78. package/src/components/button/outlined-icon-button.tsx +2 -2
  79. package/src/components/core/date-time-popover.tsx +12 -5
  80. package/src/components/core/drawer-buttons.tsx +52 -0
  81. package/src/components/core/edited-typography.tsx +2 -2
  82. package/src/components/core/index.ts +4 -2
  83. package/src/components/core/loading.tsx +1 -1
  84. package/src/components/core/status-tag.tsx +97 -0
  85. package/src/components/core/title-edit.tsx +31 -22
  86. package/src/components/dashboard-list/dashboard-list-row.tsx +22 -29
  87. package/src/components/dashboard-list/dashboard-list.tsx +20 -16
  88. package/src/components/data-table/table-header.tsx +6 -8
  89. package/src/components/data-table/table-pagination.tsx +1 -1
  90. package/src/components/data-table/table-row.tsx +1 -1
  91. package/src/components/data-table/table-skeleton.tsx +10 -5
  92. package/src/components/execution/execution-filter.ts +1 -1
  93. package/src/components/execution/execution-status-icon.tsx +7 -7
  94. package/src/components/execution/execution-tag.tsx +12 -77
  95. package/src/components/execution/index.ts +1 -1
  96. package/src/components/execution-history-drawer/execution-history-drawer.tsx +202 -0
  97. package/src/components/execution-history-drawer/executions-card.tsx +85 -0
  98. package/src/components/execution-history-drawer/index.ts +1 -0
  99. package/src/components/footer/footer.tsx +10 -6
  100. package/src/components/header/dashboard-list-header.tsx +12 -7
  101. package/src/components/header/execution-details-header.tsx +35 -26
  102. package/src/components/header/header.tsx +10 -3
  103. package/src/components/header/index.ts +1 -1
  104. package/src/components/header/integration-details-header.tsx +108 -45
  105. package/src/components/integration-list/index.ts +2 -1
  106. package/src/components/integration-list/integration-filter.ts +1 -1
  107. package/src/components/integration-list/integration-status-icon.tsx +7 -8
  108. package/src/components/integration-list/integration-tag.tsx +6 -50
  109. package/src/components/integration-list/list/integration-list-row.tsx +161 -0
  110. package/src/components/integration-list/list/integration-list-table.tsx +62 -0
  111. package/src/{pages/integrations/integration-list → components/integration-list/list}/integration-list.tsx +47 -51
  112. package/src/components/integration-view/animated-svg.tsx +31 -0
  113. package/src/components/integration-view/edges/default-edge.tsx +2 -6
  114. package/src/components/integration-view/elk-layout-options.ts +2 -2
  115. package/src/components/integration-view/elk-types.ts +35 -6
  116. package/src/components/integration-view/flow-types.tsx +12 -0
  117. package/src/components/integration-view/integration-view.tsx +562 -56
  118. package/src/components/integration-view/nodes/add-node.tsx +20 -0
  119. package/src/components/integration-view/nodes/empty-node.tsx +65 -0
  120. package/src/components/integration-view/nodes/entry-node.tsx +98 -4
  121. package/src/components/integration-view/nodes/execution-entry-node.tsx +107 -0
  122. package/src/components/integration-view/nodes/execution-task-node.tsx +88 -0
  123. package/src/components/integration-view/nodes/group-node.tsx +33 -13
  124. package/src/components/integration-view/nodes/row-node.tsx +19 -0
  125. package/src/components/integration-view/nodes/task-node.tsx +50 -16
  126. package/src/components/integration-view/task-icon.tsx +193 -0
  127. package/src/components/integration-view/temp-data/initialElements.tsx +34 -32
  128. package/src/components/integration-view/types.ts +2 -2
  129. package/src/components/integration-view/utils/mapping.ts +404 -0
  130. package/src/components/layouts/main-layout.tsx +3 -4
  131. package/src/components/layouts/root-container.tsx +5 -11
  132. package/src/components/link-cards/link-card.tsx +15 -4
  133. package/src/components/link-cards/styles.ts +1 -1
  134. package/src/components/list-filter/date-filter.tsx +7 -4
  135. package/src/components/list-filter/date-range-filter.tsx +15 -7
  136. package/src/components/list-filter/index.ts +1 -1
  137. package/src/components/list-filter/list-filter.tsx +31 -26
  138. package/src/components/list-filter/multi-select-filter.tsx +11 -10
  139. package/src/components/list-filter/select-filter.tsx +23 -12
  140. package/src/components/scheduler/day-selector.tsx +29 -15
  141. package/src/components/scheduler/day-tag.tsx +14 -51
  142. package/src/components/scheduler/index.ts +2 -1
  143. package/src/components/scheduler/schedule-drawer/details-reducer.ts +217 -0
  144. package/src/components/scheduler/schedule-drawer/schedule-details-integrations.tsx +501 -0
  145. package/src/{pages → components}/scheduler/schedule-drawer/schedule-details-main.tsx +137 -100
  146. package/src/components/scheduler/schedule-drawer/schedule-details-name.tsx +94 -0
  147. package/src/{pages → components}/scheduler/schedule-drawer/schedule-details-skeleton.tsx +1 -2
  148. package/src/{pages → components}/scheduler/schedule-drawer/schedule-details.tsx +10 -14
  149. package/src/components/scheduler/schedule-drawer/schedule-drawer-group.tsx +214 -0
  150. package/src/{pages → components}/scheduler/schedule-drawer/schedule-drawer-legacy.tsx +7 -26
  151. package/src/components/scheduler/schedule-drawer/schedule-drawer.tsx +116 -0
  152. package/src/components/scheduler/schedule-drawer/sortable-integration-row.tsx +130 -0
  153. package/src/components/scheduler/schedule-filter.ts +1 -1
  154. package/src/components/scheduler/schedule-icon.tsx +5 -6
  155. package/src/components/scheduler/schedule-integration-icon.tsx +31 -0
  156. package/src/components/templates/index.ts +1 -0
  157. package/src/components/templates/inputs/index.tsx +1392 -0
  158. package/src/components/templates/template-filter.ts +5 -0
  159. package/src/components/templates/templates-list/index.ts +1 -0
  160. package/src/components/templates/templates-list/templates-list-row.tsx +55 -0
  161. package/src/components/templates/templates-list/templates-list-table.tsx +58 -0
  162. package/src/components/templates/templates-list/templates-list.tsx +253 -0
  163. package/src/components/templates/types.tsx +76 -0
  164. package/src/components/templates/wizard.tsx +737 -0
  165. package/src/hooks/use-breadcrumbs.ts +1 -1
  166. package/src/hooks/use-recurrence.tsx +1 -2
  167. package/src/pages/dashboard/dashboard-link-cards.tsx +8 -11
  168. package/src/pages/dashboard/dashboard-list-sections.tsx +8 -10
  169. package/src/pages/dashboard/dashboard.tsx +1 -2
  170. package/src/pages/execution-details/execution-details.tsx +212 -14
  171. package/src/pages/execution-details/task-execution-details.tsx +160 -0
  172. package/src/pages/execution-details/task-execution-drawer.tsx +54 -0
  173. package/src/pages/executions/executions-list/executions-list-row.tsx +21 -27
  174. package/src/pages/executions/executions-list/executions-list-table.tsx +29 -36
  175. package/src/pages/executions/executions-list/executions-list.tsx +24 -18
  176. package/src/pages/executions/executions.tsx +11 -15
  177. package/src/pages/integration-create/index.ts +1 -0
  178. package/src/pages/integration-create/integration-create.tsx +216 -0
  179. package/src/pages/integration-create/pre-creation-step.tsx +84 -0
  180. package/src/pages/integration-create/select-step.tsx +105 -0
  181. package/src/pages/integration-create/template-list-step.tsx +77 -0
  182. package/src/pages/integration-create/wizard-step.tsx +51 -0
  183. package/src/pages/integration-details/import-process/copy-tasks-list.tsx +265 -0
  184. package/src/pages/integration-details/import-process/copy-tasks-row.tsx +77 -0
  185. package/src/pages/integration-details/import-process/import-confirm.tsx +61 -0
  186. package/src/pages/integration-details/import-process/import-drawer.tsx +48 -0
  187. package/src/pages/integration-details/import-process/import-process-reducer.ts +90 -0
  188. package/src/pages/integration-details/import-process/import-process.tsx +149 -0
  189. package/src/pages/integration-details/index.ts +1 -0
  190. package/src/pages/integration-details/integration-details.tsx +468 -0
  191. package/src/pages/integration-details/task-drawer/add-task.tsx +172 -0
  192. package/src/pages/integration-details/task-drawer/edit-task.tsx +161 -0
  193. package/src/pages/integration-details/task-drawer/task-drawer.tsx +157 -0
  194. package/src/pages/integration-details/task-drawer/task-reducer.ts +103 -0
  195. package/src/pages/integrations/integrations.tsx +11 -14
  196. package/src/pages/scheduler/scheduler.tsx +12 -24
  197. package/src/pages/scheduler/schedules-list/schedules-list-row.tsx +27 -37
  198. package/src/pages/scheduler/schedules-list/schedules-list-table.tsx +28 -43
  199. package/src/pages/scheduler/schedules-list/schedules-list.tsx +48 -21
  200. package/src/utils/date-functions.ts +69 -0
  201. package/src/utils/slugify.ts +3 -0
  202. package/tsconfig.json +12 -4
  203. package/src/hooks/use-timestamp.tsx +0 -25
  204. package/src/pages/integrations/integration-list/integration-list-row.tsx +0 -147
  205. package/src/pages/integrations/integration-list/integration-list-table.tsx +0 -78
  206. package/src/pages/scheduler/schedule-drawer/schedule-details-integrations.tsx +0 -227
  207. package/src/pages/scheduler/schedule-drawer/schedule-details-name.tsx +0 -77
  208. package/src/pages/scheduler/schedule-drawer/schedule-drawer-buttons.tsx +0 -72
  209. package/src/pages/scheduler/schedule-drawer/schedule-drawer-group.tsx +0 -103
  210. package/src/pages/scheduler/schedule-drawer/schedule-drawer.tsx +0 -101
  211. package/src/pages/scheduler/schedule-drawer/sortable-integration-row.tsx +0 -93
  212. /package/src/{pages/integrations/integration-list → components/integration-list/list}/index.ts +0 -0
  213. /package/src/{pages → components}/scheduler/schedule-drawer/edited/edited-types.ts +0 -0
  214. /package/src/{pages → components}/scheduler/schedule-drawer/edited/index.ts +0 -0
  215. /package/src/{pages → components}/scheduler/schedule-drawer/index.ts +0 -0
@@ -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[];
@@ -29,7 +16,7 @@ interface Props {
29
16
  setDrawerOpen: React.Dispatch<React.SetStateAction<DrawerOpen | null>>;
30
17
  }
31
18
 
32
- export default function SchedulesListTable(props: Props) {
19
+ export default function SchedulesListTable(props: Readonly<Props>) {
33
20
  const handleRequestSort = (property: string) => {
34
21
  const current = props.input.sort;
35
22
  if (property === current) {
@@ -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
- }
@@ -1,147 +0,0 @@
1
- import React, { useState } from "react";
2
- import { redirect, RedirectType } from "next/navigation";
3
-
4
- // MUI
5
- import { Theme, useTheme } from "@mui/material";
6
- import { Box, Stack, Typography, Popover } from "@mui/material";
7
- import { RemoveRedEye } from "@mui/icons-material";
8
- import { SxProps } from "@mui/material";
9
-
10
- // Custom components
11
- import {
12
- StyledTableCell,
13
- StyledTableRow,
14
- StyledIconButton,
15
- } from "@evenicanpm/admin-integrate/components/data-table/table-row";
16
- import {
17
- IntegrationTag,
18
- IntegrationStatusIcon,
19
- } from "@evenicanpm/admin-integrate/components/integration-list";
20
-
21
- // Hooks
22
- import useTimestamp from "@evenicanpm/admin-integrate/hooks/use-timestamp";
23
-
24
- // Types
25
- import { executionItem } from "./integration-list";
26
- import { Head } from "@evenicanpm/admin-integrate/components/data-table/table-header";
27
- import { TableCellProps } from "@mui/material";
28
-
29
- interface Props {
30
- item: executionItem;
31
- heading: Head[]; // for alignment
32
- sx?: SxProps;
33
- }
34
-
35
- const IntegrationListRow: React.FC<Props> = (props: Props) => {
36
- const theme = useTheme();
37
- const styles = getStyles(theme);
38
-
39
- // e.g. "xx days ago"
40
- const time = useTimestamp(props.item.modified);
41
- const localTime = new Date(props.item.modified).toString();
42
-
43
- const [anchorEl, setAnchorEl] = useState<HTMLElement | null>(null);
44
- const open = Boolean(anchorEl);
45
-
46
- const handlePopoverOpen = (event: React.MouseEvent<HTMLElement>) => {
47
- setAnchorEl(event.currentTarget);
48
- };
49
-
50
- const handlePopoverClose = () => {
51
- setAnchorEl(null);
52
- };
53
-
54
- const handleRedirect = () => {
55
- redirect(
56
- `/e4integrate/integration/${props.item.id}?IntegrationId=${props.item.id}`,
57
- RedirectType.push,
58
- );
59
- };
60
-
61
- return (
62
- <StyledTableRow sx={props.sx}>
63
- <StyledTableCell
64
- align={props.heading[0].align as TableCellProps["align"]}
65
- width={props.heading[0].width}
66
- >
67
- <Stack spacing={1} direction="row">
68
- <Box display="flex" justifyContent="flex-end" alignItems="center">
69
- <IntegrationStatusIcon processIcon={props.item.processIcon} />
70
- </Box>
71
- <Box display="flex" justifyContent="flex-end" alignItems="center">
72
- <Typography>{props.item.name}</Typography>
73
- </Box>
74
- </Stack>
75
- </StyledTableCell>
76
- <StyledTableCell
77
- align={props.heading[1].align as TableCellProps["align"]}
78
- width={props.heading[1].width}
79
- >
80
- <Typography>{props.item.id}</Typography>
81
- </StyledTableCell>
82
- <StyledTableCell
83
- align={props.heading[1].align as TableCellProps["align"]}
84
- width={props.heading[1].width}
85
- >
86
- <IntegrationTag
87
- process={{
88
- isScheduled: props.item.isScheduled,
89
- isTriggered: props.item.isTriggered,
90
- }}
91
- />
92
- </StyledTableCell>
93
- <StyledTableCell
94
- align={props.heading[2].align as TableCellProps["align"]}
95
- width={props.heading[2].width}
96
- sx={styles.timeCell}
97
- >
98
- <Typography
99
- onMouseEnter={handlePopoverOpen}
100
- onMouseLeave={handlePopoverClose}
101
- >
102
- {time}
103
- </Typography>
104
- <Popover
105
- sx={{ pointerEvents: "none" }}
106
- open={open}
107
- anchorEl={anchorEl}
108
- anchorOrigin={{
109
- vertical: "bottom",
110
- horizontal: "center",
111
- }}
112
- transformOrigin={{
113
- vertical: "top",
114
- horizontal: "center",
115
- }}
116
- onClose={handlePopoverClose}
117
- disableRestoreFocus
118
- >
119
- <Box sx={styles.popover}>
120
- <Typography>{localTime}</Typography>
121
- </Box>
122
- </Popover>
123
- </StyledTableCell>
124
- <StyledTableCell
125
- align={props.heading[3].align as TableCellProps["align"]}
126
- width={props.heading[3].width}
127
- >
128
- <StyledIconButton onClick={handleRedirect}>
129
- <RemoveRedEye />
130
- </StyledIconButton>
131
- </StyledTableCell>
132
- </StyledTableRow>
133
- );
134
- };
135
-
136
- const getStyles = (theme: Theme) => {
137
- return {
138
- timeCell: {
139
- cursor: "default",
140
- },
141
- popover: {
142
- padding: theme.spacing(1),
143
- },
144
- };
145
- };
146
-
147
- export default IntegrationListRow;
@@ -1,78 +0,0 @@
1
- import React from "react";
2
-
3
- // Types
4
- import { Head } from "@evenicanpm/admin-integrate/components/data-table/table-header";
5
- import { Item } from "./integration-list";
6
-
7
- // API
8
- import { ProcessExecutionInput } from "@evenicanpm/admin-core/api/e4/graphqlRequestSdk";
9
-
10
- // MUI
11
- import { Theme, useTheme } from "@mui/material";
12
- import { TableContainer, Table, TableBody } from "@mui/material";
13
- import { SxProps } from "@mui/material";
14
-
15
- // Custom components
16
- import { TableHeader } from "@evenicanpm/admin-integrate/components/data-table";
17
-
18
- // Local components
19
- import IntegrationListRow from "./integration-list-row";
20
-
21
- interface Props {
22
- heading: Head[];
23
- items: Item[];
24
- input: ProcessExecutionInput;
25
- setInput: (newInput: ProcessExecutionInput) => void;
26
- rowSx?: SxProps;
27
- }
28
-
29
- export default function IntegrationListTable(props: Props) {
30
- const theme = useTheme();
31
- const styles = getStyles(theme);
32
-
33
- const handleRequestSort = (property: string) => {
34
- const current = props.input.sort;
35
- if (property === current) {
36
- props.setInput({
37
- ...props.input,
38
- sortDesc: !props.input.sortDesc,
39
- });
40
- } else {
41
- props.setInput({
42
- ...props.input,
43
- sort: property,
44
- sortDesc: false,
45
- });
46
- }
47
- };
48
-
49
- 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
- rowSx={props.rowSx}
59
- />
60
- <TableBody>
61
- {props.items.map((item, index) => (
62
- <IntegrationListRow
63
- key={index}
64
- item={item}
65
- heading={props.heading}
66
- sx={props.rowSx}
67
- />
68
- ))}
69
- </TableBody>
70
- </Table>
71
- </TableContainer>
72
- </>
73
- );
74
- }
75
-
76
- const getStyles = (theme: Theme) => {
77
- return {};
78
- };