@strapi/review-workflows 0.0.1 → 5.0.0-beta.10

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 (149) hide show
  1. package/dist/_chunks/Layout-BWzD-Tfe.js +252 -0
  2. package/dist/_chunks/Layout-BWzD-Tfe.js.map +1 -0
  3. package/dist/_chunks/Layout-D292CXD6.mjs +234 -0
  4. package/dist/_chunks/Layout-D292CXD6.mjs.map +1 -0
  5. package/dist/_chunks/_id-CoX9yljN.js +1274 -0
  6. package/dist/_chunks/_id-CoX9yljN.js.map +1 -0
  7. package/dist/_chunks/_id-DqEUzU_u.mjs +1254 -0
  8. package/dist/_chunks/_id-DqEUzU_u.mjs.map +1 -0
  9. package/dist/_chunks/en-D9ZrQAV6.mjs +12 -0
  10. package/dist/_chunks/en-D9ZrQAV6.mjs.map +1 -0
  11. package/dist/_chunks/en-xcewH2pC.js +12 -0
  12. package/dist/_chunks/en-xcewH2pC.js.map +1 -0
  13. package/dist/_chunks/index-2nkLt-AE.mjs +234 -0
  14. package/dist/_chunks/index-2nkLt-AE.mjs.map +1 -0
  15. package/dist/_chunks/index-CDMcvtW9.js +253 -0
  16. package/dist/_chunks/index-CDMcvtW9.js.map +1 -0
  17. package/dist/_chunks/index-D-KMrml_.js +819 -0
  18. package/dist/_chunks/index-D-KMrml_.js.map +1 -0
  19. package/dist/_chunks/index-udedGkii.mjs +801 -0
  20. package/dist/_chunks/index-udedGkii.mjs.map +1 -0
  21. package/dist/_chunks/purchase-review-workflows-BN-5Ube7.mjs +52 -0
  22. package/dist/_chunks/purchase-review-workflows-BN-5Ube7.mjs.map +1 -0
  23. package/dist/_chunks/purchase-review-workflows-DlCDg0fD.js +52 -0
  24. package/dist/_chunks/purchase-review-workflows-DlCDg0fD.js.map +1 -0
  25. package/dist/_chunks/router-C19H1Rju.js +24 -0
  26. package/dist/_chunks/router-C19H1Rju.js.map +1 -0
  27. package/dist/_chunks/router-bmjk-Tpf.mjs +24 -0
  28. package/dist/_chunks/router-bmjk-Tpf.mjs.map +1 -0
  29. package/dist/admin/index.js +4 -0
  30. package/dist/admin/index.js.map +1 -0
  31. package/dist/admin/index.mjs +5 -0
  32. package/dist/admin/index.mjs.map +1 -0
  33. package/dist/admin/src/components/LimitsModal.d.ts +13 -0
  34. package/dist/admin/src/constants.d.ts +9 -0
  35. package/dist/admin/src/index.d.ts +3 -0
  36. package/dist/admin/src/modules/hooks.d.ts +7 -0
  37. package/dist/admin/src/router.d.ts +2 -0
  38. package/dist/admin/src/routes/content-manager/[model]/[id]/components/AssigneeSelect.d.ts +2 -0
  39. package/dist/admin/src/routes/content-manager/[model]/[id]/components/Panel.d.ts +3 -0
  40. package/dist/admin/src/routes/content-manager/[model]/[id]/components/StageSelect.d.ts +1 -0
  41. package/dist/admin/src/routes/content-manager/[model]/[id]/components/constants.d.ts +2 -0
  42. package/dist/admin/src/routes/content-manager/[model]/components/AssigneeFilter.d.ts +7 -0
  43. package/dist/admin/src/routes/content-manager/[model]/components/StageFilter.d.ts +8 -0
  44. package/dist/admin/src/routes/content-manager/[model]/components/TableColumns.d.ts +18 -0
  45. package/dist/admin/src/routes/content-manager/[model]/configure/constants.d.ts +7 -0
  46. package/dist/admin/src/routes/content-manager/[model]/constants.d.ts +71 -0
  47. package/dist/admin/src/routes/purchase-review-workflows.d.ts +2 -0
  48. package/dist/admin/src/routes/settings/:id.d.ts +2 -0
  49. package/dist/admin/src/routes/settings/components/AddStage.d.ts +2 -0
  50. package/dist/admin/src/routes/settings/components/Layout.d.ts +12 -0
  51. package/dist/admin/src/routes/settings/components/StageDragPreview.d.ts +6 -0
  52. package/dist/admin/src/routes/settings/components/Stages.d.ts +12 -0
  53. package/dist/admin/src/routes/settings/components/WorkflowAttributes.d.ts +6 -0
  54. package/dist/admin/src/routes/settings/constants.d.ts +2 -0
  55. package/dist/admin/src/routes/settings/hooks/useDragAndDrop.d.ts +51 -0
  56. package/dist/admin/src/routes/settings/hooks/useKeyboardDragAndDrop.d.ts +14 -0
  57. package/dist/admin/src/routes/settings/hooks/useReviewWorkflows.d.ts +25 -0
  58. package/dist/admin/src/routes/settings/index.d.ts +3 -0
  59. package/dist/admin/src/services/admin.d.ts +5 -0
  60. package/dist/admin/src/services/api.d.ts +2 -0
  61. package/dist/admin/src/services/content-manager.d.ts +38 -0
  62. package/dist/admin/src/services/settings.d.ts +13 -0
  63. package/dist/admin/src/utils/api.d.ts +23 -0
  64. package/dist/admin/src/utils/cm-hooks.d.ts +46 -0
  65. package/dist/admin/src/utils/colors.d.ts +9 -0
  66. package/dist/admin/src/utils/translations.d.ts +3 -0
  67. package/dist/admin/src/utils/users.d.ts +6 -0
  68. package/dist/server/index.js +8256 -0
  69. package/dist/server/index.js.map +1 -0
  70. package/dist/server/index.mjs +8257 -0
  71. package/dist/server/index.mjs.map +1 -0
  72. package/dist/server/src/bootstrap.d.ts +3 -0
  73. package/dist/server/src/bootstrap.d.ts.map +1 -0
  74. package/dist/server/src/config/actions.d.ts +19 -0
  75. package/dist/server/src/config/actions.d.ts.map +1 -0
  76. package/dist/server/src/constants/webhook-events.d.ts +6 -0
  77. package/dist/server/src/constants/webhook-events.d.ts.map +1 -0
  78. package/dist/server/src/constants/workflows.d.ts +34 -0
  79. package/dist/server/src/constants/workflows.d.ts.map +1 -0
  80. package/dist/server/src/content-types/index.d.ts +90 -0
  81. package/dist/server/src/content-types/index.d.ts.map +1 -0
  82. package/dist/server/src/content-types/workflow/index.d.ts +41 -0
  83. package/dist/server/src/content-types/workflow/index.d.ts.map +1 -0
  84. package/dist/server/src/content-types/workflow-stage/index.d.ts +49 -0
  85. package/dist/server/src/content-types/workflow-stage/index.d.ts.map +1 -0
  86. package/dist/server/src/controllers/assignees.d.ts +19 -0
  87. package/dist/server/src/controllers/assignees.d.ts.map +1 -0
  88. package/dist/server/src/controllers/index.d.ts +21 -0
  89. package/dist/server/src/controllers/index.d.ts.map +1 -0
  90. package/dist/server/src/controllers/stages.d.ts +39 -0
  91. package/dist/server/src/controllers/stages.d.ts.map +1 -0
  92. package/dist/server/src/controllers/workflows.d.ts +32 -0
  93. package/dist/server/src/controllers/workflows.d.ts.map +1 -0
  94. package/dist/server/src/destroy.d.ts +6 -0
  95. package/dist/server/src/destroy.d.ts.map +1 -0
  96. package/dist/server/src/index.d.ts +322 -0
  97. package/dist/server/src/index.d.ts.map +1 -0
  98. package/dist/server/src/middlewares/review-workflows.d.ts +17 -0
  99. package/dist/server/src/middlewares/review-workflows.d.ts.map +1 -0
  100. package/dist/server/src/migrations/handle-deleted-ct-in-workflows.d.ts +6 -0
  101. package/dist/server/src/migrations/handle-deleted-ct-in-workflows.d.ts.map +1 -0
  102. package/dist/server/src/migrations/multiple-workflows.d.ts +3 -0
  103. package/dist/server/src/migrations/multiple-workflows.d.ts.map +1 -0
  104. package/dist/server/src/migrations/set-stages-default-color.d.ts +6 -0
  105. package/dist/server/src/migrations/set-stages-default-color.d.ts.map +1 -0
  106. package/dist/server/src/migrations/set-stages-roles.d.ts +6 -0
  107. package/dist/server/src/migrations/set-stages-roles.d.ts.map +1 -0
  108. package/dist/server/src/migrations/set-workflow-default-name.d.ts +7 -0
  109. package/dist/server/src/migrations/set-workflow-default-name.d.ts.map +1 -0
  110. package/dist/server/src/migrations/shorten-stage-attribute.d.ts +6 -0
  111. package/dist/server/src/migrations/shorten-stage-attribute.d.ts.map +1 -0
  112. package/dist/server/src/register.d.ts +6 -0
  113. package/dist/server/src/register.d.ts.map +1 -0
  114. package/dist/server/src/routes/index.d.ts +21 -0
  115. package/dist/server/src/routes/index.d.ts.map +1 -0
  116. package/dist/server/src/routes/review-workflows.d.ts +19 -0
  117. package/dist/server/src/routes/review-workflows.d.ts.map +1 -0
  118. package/dist/server/src/routes/utils.d.ts +2 -0
  119. package/dist/server/src/routes/utils.d.ts.map +1 -0
  120. package/dist/server/src/services/assignees.d.ts +13 -0
  121. package/dist/server/src/services/assignees.d.ts.map +1 -0
  122. package/dist/server/src/services/document-service-middleware.d.ts +7 -0
  123. package/dist/server/src/services/document-service-middleware.d.ts.map +1 -0
  124. package/dist/server/src/services/index.d.ts +92 -0
  125. package/dist/server/src/services/index.d.ts.map +1 -0
  126. package/dist/server/src/services/metrics/index.d.ts +21 -0
  127. package/dist/server/src/services/metrics/index.d.ts.map +1 -0
  128. package/dist/server/src/services/metrics/weekly-metrics.d.ts +16 -0
  129. package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -0
  130. package/dist/server/src/services/stage-permissions.d.ts +11 -0
  131. package/dist/server/src/services/stage-permissions.d.ts.map +1 -0
  132. package/dist/server/src/services/stages.d.ts +46 -0
  133. package/dist/server/src/services/stages.d.ts.map +1 -0
  134. package/dist/server/src/services/validation.d.ts +26 -0
  135. package/dist/server/src/services/validation.d.ts.map +1 -0
  136. package/dist/server/src/services/workflow-content-types.d.ts +21 -0
  137. package/dist/server/src/services/workflow-content-types.d.ts.map +1 -0
  138. package/dist/server/src/services/workflows.d.ts +84 -0
  139. package/dist/server/src/services/workflows.d.ts.map +1 -0
  140. package/dist/server/src/utils/index.d.ts +17 -0
  141. package/dist/server/src/utils/index.d.ts.map +1 -0
  142. package/dist/server/src/utils/review-workflows.d.ts +31 -0
  143. package/dist/server/src/utils/review-workflows.d.ts.map +1 -0
  144. package/dist/server/src/validation/review-workflows.d.ts +31 -0
  145. package/dist/server/src/validation/review-workflows.d.ts.map +1 -0
  146. package/dist/shared/contracts/review-workflows.d.ts +152 -0
  147. package/dist/shared/contracts/review-workflows.d.ts.map +1 -0
  148. package/package.json +42 -19
  149. package/strapi-server.js +3 -0
@@ -0,0 +1,252 @@
1
+ "use strict";
2
+ const React = require("react");
3
+ const strapiAdmin = require("@strapi/admin/strapi-admin");
4
+ const reactIntl = require("react-intl");
5
+ const index = require("./index-D-KMrml_.js");
6
+ const jsxRuntime = require("react/jsx-runtime");
7
+ const designSystem = require("@strapi/design-system");
8
+ const reactDnd = require("react-dnd");
9
+ const icons = require("@strapi/icons");
10
+ function _interopNamespace(e) {
11
+ if (e && e.__esModule)
12
+ return e;
13
+ const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
14
+ if (e) {
15
+ for (const k in e) {
16
+ if (k !== "default") {
17
+ const d = Object.getOwnPropertyDescriptor(e, k);
18
+ Object.defineProperty(n, k, d.get ? d : {
19
+ enumerable: true,
20
+ get: () => e[k]
21
+ });
22
+ }
23
+ }
24
+ }
25
+ n.default = e;
26
+ return Object.freeze(n);
27
+ }
28
+ const React__namespace = /* @__PURE__ */ _interopNamespace(React);
29
+ const DEFAULT_UNEXPECTED_ERROR_MSG = {
30
+ id: "notification.error",
31
+ defaultMessage: "An error occurred, please try again"
32
+ };
33
+ const useReviewWorkflows = (params = {}) => {
34
+ const { toggleNotification } = strapiAdmin.useNotification();
35
+ const { formatMessage } = reactIntl.useIntl();
36
+ const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
37
+ const { id = "", skip = false, ...queryParams } = params;
38
+ const { data, isLoading, error } = index.useGetWorkflowsQuery(
39
+ {
40
+ id,
41
+ populate: "stages",
42
+ ...queryParams
43
+ },
44
+ {
45
+ skip
46
+ }
47
+ );
48
+ React__namespace.useEffect(() => {
49
+ if (error) {
50
+ toggleNotification({
51
+ type: "danger",
52
+ message: formatAPIError(error)
53
+ });
54
+ }
55
+ }, [error, formatAPIError, toggleNotification]);
56
+ const [createWorkflow] = index.useCreateWorkflowMutation();
57
+ const create = React__namespace.useCallback(
58
+ async (data2) => {
59
+ try {
60
+ const res = await createWorkflow({ data: data2 });
61
+ if ("error" in res) {
62
+ toggleNotification({
63
+ type: "danger",
64
+ message: formatAPIError(res.error)
65
+ });
66
+ return res;
67
+ }
68
+ toggleNotification({
69
+ type: "success",
70
+ message: formatMessage({ id: "actions.created", defaultMessage: "Created workflow" })
71
+ });
72
+ return res;
73
+ } catch (err) {
74
+ toggleNotification({
75
+ type: "danger",
76
+ message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG)
77
+ });
78
+ throw err;
79
+ }
80
+ },
81
+ [createWorkflow, formatAPIError, formatMessage, toggleNotification]
82
+ );
83
+ const [updateWorkflow] = index.useUpdateWorkflowMutation();
84
+ const update = React__namespace.useCallback(
85
+ async (id2, data2) => {
86
+ try {
87
+ const res = await updateWorkflow({ id: id2, data: data2 });
88
+ if ("error" in res) {
89
+ toggleNotification({
90
+ type: "danger",
91
+ message: formatAPIError(res.error)
92
+ });
93
+ return res;
94
+ }
95
+ toggleNotification({
96
+ type: "success",
97
+ message: formatMessage({ id: "actions.updated", defaultMessage: "Updated workflow" })
98
+ });
99
+ return res;
100
+ } catch (err) {
101
+ toggleNotification({
102
+ type: "danger",
103
+ message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG)
104
+ });
105
+ throw err;
106
+ }
107
+ },
108
+ [formatAPIError, formatMessage, toggleNotification, updateWorkflow]
109
+ );
110
+ const [deleteWorkflow] = index.useDeleteWorkflowMutation();
111
+ const deleteAction = React__namespace.useCallback(
112
+ async (id2) => {
113
+ try {
114
+ const res = await deleteWorkflow({ id: id2 });
115
+ if ("error" in res) {
116
+ toggleNotification({
117
+ type: "danger",
118
+ message: formatAPIError(res.error)
119
+ });
120
+ return;
121
+ }
122
+ toggleNotification({
123
+ type: "success",
124
+ message: formatMessage({ id: "actions.deleted", defaultMessage: "Deleted workflow" })
125
+ });
126
+ return res.data;
127
+ } catch (err) {
128
+ toggleNotification({
129
+ type: "danger",
130
+ message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG)
131
+ });
132
+ throw err;
133
+ }
134
+ },
135
+ [deleteWorkflow, formatAPIError, formatMessage, toggleNotification]
136
+ );
137
+ const { workflows = [], meta } = data ?? {};
138
+ return {
139
+ // meta contains e.g. the total of all workflows. we can not use
140
+ // the pagination object here, because the list is not paginated.
141
+ meta,
142
+ workflows,
143
+ isLoading,
144
+ error,
145
+ create,
146
+ delete: deleteAction,
147
+ update
148
+ };
149
+ };
150
+ const DRAG_DROP_TYPES = {
151
+ STAGE: "stage"
152
+ };
153
+ const StageDragPreview = ({ name }) => {
154
+ return /* @__PURE__ */ jsxRuntime.jsxs(
155
+ designSystem.Flex,
156
+ {
157
+ background: "primary100",
158
+ borderStyle: "dashed",
159
+ borderColor: "primary600",
160
+ borderWidth: "1px",
161
+ gap: 3,
162
+ hasRadius: true,
163
+ padding: 3,
164
+ shadow: "tableShadow",
165
+ width: "30rem",
166
+ children: [
167
+ /* @__PURE__ */ jsxRuntime.jsx(
168
+ designSystem.Flex,
169
+ {
170
+ alignItems: "center",
171
+ background: "neutral200",
172
+ borderRadius: "50%",
173
+ height: 6,
174
+ justifyContent: "center",
175
+ width: 6,
176
+ children: /* @__PURE__ */ jsxRuntime.jsx(icons.CaretDown, { width: "0.8rem", fill: "neutral600" })
177
+ }
178
+ ),
179
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { fontWeight: "bold", children: name })
180
+ ]
181
+ }
182
+ );
183
+ };
184
+ function getStyle(initialOffset, currentOffset, mouseOffset) {
185
+ if (!initialOffset || !currentOffset || !mouseOffset) {
186
+ return { display: "none" };
187
+ }
188
+ const { x, y } = mouseOffset;
189
+ return {
190
+ transform: `translate(${x}px, ${y}px)`
191
+ };
192
+ }
193
+ const DragLayerRendered = () => {
194
+ const { itemType, isDragging, item, initialOffset, currentOffset, mouseOffset } = reactDnd.useDragLayer(
195
+ (monitor) => ({
196
+ item: monitor.getItem(),
197
+ itemType: monitor.getItemType(),
198
+ initialOffset: monitor.getInitialSourceClientOffset(),
199
+ currentOffset: monitor.getSourceClientOffset(),
200
+ isDragging: monitor.isDragging(),
201
+ mouseOffset: monitor.getClientOffset()
202
+ })
203
+ );
204
+ if (!isDragging || itemType !== DRAG_DROP_TYPES.STAGE) {
205
+ return null;
206
+ }
207
+ return /* @__PURE__ */ jsxRuntime.jsx(
208
+ designSystem.Box,
209
+ {
210
+ height: "100%",
211
+ left: 0,
212
+ position: "fixed",
213
+ pointerEvents: "none",
214
+ top: 0,
215
+ zIndex: 100,
216
+ width: "100%",
217
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { style: getStyle(initialOffset, currentOffset, mouseOffset), children: [
218
+ /* @__PURE__ */ jsxRuntime.jsx(StageDragPreview, { name: typeof item.item === "string" ? item.item : null }),
219
+ ";"
220
+ ] })
221
+ }
222
+ );
223
+ };
224
+ const Root = ({ children }) => {
225
+ return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Main, { children: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Layouts.Content, { children }) });
226
+ };
227
+ const Header = ({ title, subtitle, navigationAction, primaryAction }) => {
228
+ const { formatMessage } = reactIntl.useIntl();
229
+ return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
230
+ /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Title, { children: formatMessage(
231
+ { id: "Settings.PageTitle", defaultMessage: "Settings - {name}" },
232
+ {
233
+ name: title
234
+ }
235
+ ) }),
236
+ /* @__PURE__ */ jsxRuntime.jsx(
237
+ strapiAdmin.Layouts.Header,
238
+ {
239
+ navigationAction,
240
+ primaryAction,
241
+ title,
242
+ subtitle
243
+ }
244
+ )
245
+ ] });
246
+ };
247
+ exports.DRAG_DROP_TYPES = DRAG_DROP_TYPES;
248
+ exports.DragLayerRendered = DragLayerRendered;
249
+ exports.Header = Header;
250
+ exports.Root = Root;
251
+ exports.useReviewWorkflows = useReviewWorkflows;
252
+ //# sourceMappingURL=Layout-BWzD-Tfe.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layout-BWzD-Tfe.js","sources":["../../admin/src/routes/settings/hooks/useReviewWorkflows.ts","../../admin/src/routes/settings/constants.ts","../../admin/src/routes/settings/components/StageDragPreview.tsx","../../admin/src/routes/settings/components/Layout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useAPIErrorHandler, useNotification } from '@strapi/admin/strapi-admin';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport {\n GetWorkflowsParams,\n useCreateWorkflowMutation,\n useDeleteWorkflowMutation,\n useGetWorkflowsQuery,\n useUpdateWorkflowMutation,\n} from '../../../services/settings';\n\nimport type { Create, Update } from '../../../../../shared/contracts/review-workflows';\n\nconst DEFAULT_UNEXPECTED_ERROR_MSG = {\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again',\n} satisfies MessageDescriptor;\n\ntype UseReviewWorkflowsArgs = GetWorkflowsParams & {\n skip?: boolean;\n};\n\nconst useReviewWorkflows = (params: UseReviewWorkflowsArgs = {}) => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const { id = '', skip = false, ...queryParams } = params;\n\n const { data, isLoading, error } = useGetWorkflowsQuery(\n {\n id,\n populate: 'stages',\n ...queryParams,\n },\n {\n skip,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const [createWorkflow] = useCreateWorkflowMutation();\n const create = React.useCallback(\n async (data: Create.Request['body']['data']) => {\n try {\n const res = await createWorkflow({ data });\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return res;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'actions.created', defaultMessage: 'Created workflow' }),\n });\n\n return res;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n throw err;\n }\n },\n [createWorkflow, formatAPIError, formatMessage, toggleNotification]\n );\n\n const [updateWorkflow] = useUpdateWorkflowMutation();\n const update = React.useCallback(\n async (id: string, data: Update.Request['body']['data']) => {\n try {\n const res = await updateWorkflow({ id, data });\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return res;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'actions.updated', defaultMessage: 'Updated workflow' }),\n });\n\n return res;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n throw err;\n }\n },\n [formatAPIError, formatMessage, toggleNotification, updateWorkflow]\n );\n\n const [deleteWorkflow] = useDeleteWorkflowMutation();\n const deleteAction = React.useCallback(\n async (id: string) => {\n try {\n const res = await deleteWorkflow({ id });\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'actions.deleted', defaultMessage: 'Deleted workflow' }),\n });\n\n return res.data;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n throw err;\n }\n },\n [deleteWorkflow, formatAPIError, formatMessage, toggleNotification]\n );\n\n const { workflows = [], meta } = data ?? {};\n\n return {\n // meta contains e.g. the total of all workflows. we can not use\n // the pagination object here, because the list is not paginated.\n meta,\n workflows,\n isLoading,\n error,\n create,\n delete: deleteAction,\n update,\n };\n};\n\nexport { useReviewWorkflows };\n","export type DragDropTypes = 'stage';\n\nexport const DRAG_DROP_TYPES: Record<Uppercase<DragDropTypes>, DragDropTypes> = {\n STAGE: 'stage',\n};\n","import { Flex, Typography } from '@strapi/design-system';\nimport { CaretDown } from '@strapi/icons';\n\ninterface StageDragPreviewType {\n name: string | null;\n}\n\nconst StageDragPreview = ({ name }: StageDragPreviewType) => {\n return (\n <Flex\n background=\"primary100\"\n borderStyle=\"dashed\"\n borderColor=\"primary600\"\n borderWidth=\"1px\"\n gap={3}\n hasRadius\n padding={3}\n shadow=\"tableShadow\"\n width=\"30rem\"\n >\n <Flex\n alignItems=\"center\"\n background=\"neutral200\"\n borderRadius=\"50%\"\n height={6}\n justifyContent=\"center\"\n width={6}\n >\n <CaretDown width=\"0.8rem\" fill=\"neutral600\" />\n </Flex>\n\n <Typography fontWeight=\"bold\">{name}</Typography>\n </Flex>\n );\n};\n\nexport { StageDragPreview };\nexport type { StageDragPreviewType };\n","import * as React from 'react';\n\nimport { Page, Layouts } from '@strapi/admin/strapi-admin';\nimport { Box } from '@strapi/design-system';\nimport { XYCoord, useDragLayer } from 'react-dnd';\nimport { useIntl } from 'react-intl';\n\nimport { DRAG_DROP_TYPES } from '../constants';\n\nimport { StageDragPreview } from './StageDragPreview';\n\nfunction getStyle(\n initialOffset: XYCoord | null,\n currentOffset: XYCoord | null,\n mouseOffset: XYCoord | null\n) {\n if (!initialOffset || !currentOffset || !mouseOffset) {\n return { display: 'none' };\n }\n\n const { x, y } = mouseOffset;\n\n return {\n transform: `translate(${x}px, ${y}px)`,\n };\n}\n\nconst DragLayerRendered = () => {\n const { itemType, isDragging, item, initialOffset, currentOffset, mouseOffset } = useDragLayer(\n (monitor) => ({\n item: monitor.getItem(),\n itemType: monitor.getItemType(),\n initialOffset: monitor.getInitialSourceClientOffset(),\n currentOffset: monitor.getSourceClientOffset(),\n isDragging: monitor.isDragging(),\n mouseOffset: monitor.getClientOffset(),\n })\n );\n\n if (!isDragging || itemType !== DRAG_DROP_TYPES.STAGE) {\n return null;\n }\n\n return (\n <Box\n height=\"100%\"\n left={0}\n position=\"fixed\"\n pointerEvents=\"none\"\n top={0}\n zIndex={100}\n width=\"100%\"\n >\n <Box style={getStyle(initialOffset, currentOffset, mouseOffset)}>\n <StageDragPreview name={typeof item.item === 'string' ? item.item : null} />;\n </Box>\n </Box>\n );\n};\n\nconst Root: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <Page.Main>\n <Layouts.Content>{children}</Layouts.Content>\n </Page.Main>\n );\n};\n\ninterface HeaderProps {\n title: string;\n navigationAction?: React.ReactNode;\n primaryAction?: React.ReactNode;\n secondaryAction?: React.ReactNode;\n subtitle?: React.ReactNode;\n}\n\nconst Header: React.FC<HeaderProps> = ({ title, subtitle, navigationAction, primaryAction }) => {\n const { formatMessage } = useIntl();\n return (\n <>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: title,\n }\n )}\n </Page.Title>\n <Layouts.Header\n navigationAction={navigationAction}\n primaryAction={primaryAction}\n title={title}\n subtitle={subtitle}\n />\n </>\n );\n};\n\nexport { DragLayerRendered, Header, Root };\n"],"names":["useNotification","useIntl","useAPIErrorHandler","useGetWorkflowsQuery","React","useCreateWorkflowMutation","data","useUpdateWorkflowMutation","id","useDeleteWorkflowMutation","jsxs","Flex","jsx","CaretDown","Typography","useDragLayer","Box","Page","Layouts","Fragment"],"mappings":"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"}
@@ -0,0 +1,234 @@
1
+ import * as React from "react";
2
+ import { useNotification, useAPIErrorHandler, Page, Layouts } from "@strapi/admin/strapi-admin";
3
+ import { useIntl } from "react-intl";
4
+ import { c as useGetWorkflowsQuery, d as useCreateWorkflowMutation, e as useUpdateWorkflowMutation, f as useDeleteWorkflowMutation } from "./index-udedGkii.mjs";
5
+ import { jsxs, jsx, Fragment } from "react/jsx-runtime";
6
+ import { Flex, Typography, Box } from "@strapi/design-system";
7
+ import { useDragLayer } from "react-dnd";
8
+ import { CaretDown } from "@strapi/icons";
9
+ const DEFAULT_UNEXPECTED_ERROR_MSG = {
10
+ id: "notification.error",
11
+ defaultMessage: "An error occurred, please try again"
12
+ };
13
+ const useReviewWorkflows = (params = {}) => {
14
+ const { toggleNotification } = useNotification();
15
+ const { formatMessage } = useIntl();
16
+ const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
17
+ const { id = "", skip = false, ...queryParams } = params;
18
+ const { data, isLoading, error } = useGetWorkflowsQuery(
19
+ {
20
+ id,
21
+ populate: "stages",
22
+ ...queryParams
23
+ },
24
+ {
25
+ skip
26
+ }
27
+ );
28
+ React.useEffect(() => {
29
+ if (error) {
30
+ toggleNotification({
31
+ type: "danger",
32
+ message: formatAPIError(error)
33
+ });
34
+ }
35
+ }, [error, formatAPIError, toggleNotification]);
36
+ const [createWorkflow] = useCreateWorkflowMutation();
37
+ const create = React.useCallback(
38
+ async (data2) => {
39
+ try {
40
+ const res = await createWorkflow({ data: data2 });
41
+ if ("error" in res) {
42
+ toggleNotification({
43
+ type: "danger",
44
+ message: formatAPIError(res.error)
45
+ });
46
+ return res;
47
+ }
48
+ toggleNotification({
49
+ type: "success",
50
+ message: formatMessage({ id: "actions.created", defaultMessage: "Created workflow" })
51
+ });
52
+ return res;
53
+ } catch (err) {
54
+ toggleNotification({
55
+ type: "danger",
56
+ message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG)
57
+ });
58
+ throw err;
59
+ }
60
+ },
61
+ [createWorkflow, formatAPIError, formatMessage, toggleNotification]
62
+ );
63
+ const [updateWorkflow] = useUpdateWorkflowMutation();
64
+ const update = React.useCallback(
65
+ async (id2, data2) => {
66
+ try {
67
+ const res = await updateWorkflow({ id: id2, data: data2 });
68
+ if ("error" in res) {
69
+ toggleNotification({
70
+ type: "danger",
71
+ message: formatAPIError(res.error)
72
+ });
73
+ return res;
74
+ }
75
+ toggleNotification({
76
+ type: "success",
77
+ message: formatMessage({ id: "actions.updated", defaultMessage: "Updated workflow" })
78
+ });
79
+ return res;
80
+ } catch (err) {
81
+ toggleNotification({
82
+ type: "danger",
83
+ message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG)
84
+ });
85
+ throw err;
86
+ }
87
+ },
88
+ [formatAPIError, formatMessage, toggleNotification, updateWorkflow]
89
+ );
90
+ const [deleteWorkflow] = useDeleteWorkflowMutation();
91
+ const deleteAction = React.useCallback(
92
+ async (id2) => {
93
+ try {
94
+ const res = await deleteWorkflow({ id: id2 });
95
+ if ("error" in res) {
96
+ toggleNotification({
97
+ type: "danger",
98
+ message: formatAPIError(res.error)
99
+ });
100
+ return;
101
+ }
102
+ toggleNotification({
103
+ type: "success",
104
+ message: formatMessage({ id: "actions.deleted", defaultMessage: "Deleted workflow" })
105
+ });
106
+ return res.data;
107
+ } catch (err) {
108
+ toggleNotification({
109
+ type: "danger",
110
+ message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG)
111
+ });
112
+ throw err;
113
+ }
114
+ },
115
+ [deleteWorkflow, formatAPIError, formatMessage, toggleNotification]
116
+ );
117
+ const { workflows = [], meta } = data ?? {};
118
+ return {
119
+ // meta contains e.g. the total of all workflows. we can not use
120
+ // the pagination object here, because the list is not paginated.
121
+ meta,
122
+ workflows,
123
+ isLoading,
124
+ error,
125
+ create,
126
+ delete: deleteAction,
127
+ update
128
+ };
129
+ };
130
+ const DRAG_DROP_TYPES = {
131
+ STAGE: "stage"
132
+ };
133
+ const StageDragPreview = ({ name }) => {
134
+ return /* @__PURE__ */ jsxs(
135
+ Flex,
136
+ {
137
+ background: "primary100",
138
+ borderStyle: "dashed",
139
+ borderColor: "primary600",
140
+ borderWidth: "1px",
141
+ gap: 3,
142
+ hasRadius: true,
143
+ padding: 3,
144
+ shadow: "tableShadow",
145
+ width: "30rem",
146
+ children: [
147
+ /* @__PURE__ */ jsx(
148
+ Flex,
149
+ {
150
+ alignItems: "center",
151
+ background: "neutral200",
152
+ borderRadius: "50%",
153
+ height: 6,
154
+ justifyContent: "center",
155
+ width: 6,
156
+ children: /* @__PURE__ */ jsx(CaretDown, { width: "0.8rem", fill: "neutral600" })
157
+ }
158
+ ),
159
+ /* @__PURE__ */ jsx(Typography, { fontWeight: "bold", children: name })
160
+ ]
161
+ }
162
+ );
163
+ };
164
+ function getStyle(initialOffset, currentOffset, mouseOffset) {
165
+ if (!initialOffset || !currentOffset || !mouseOffset) {
166
+ return { display: "none" };
167
+ }
168
+ const { x, y } = mouseOffset;
169
+ return {
170
+ transform: `translate(${x}px, ${y}px)`
171
+ };
172
+ }
173
+ const DragLayerRendered = () => {
174
+ const { itemType, isDragging, item, initialOffset, currentOffset, mouseOffset } = useDragLayer(
175
+ (monitor) => ({
176
+ item: monitor.getItem(),
177
+ itemType: monitor.getItemType(),
178
+ initialOffset: monitor.getInitialSourceClientOffset(),
179
+ currentOffset: monitor.getSourceClientOffset(),
180
+ isDragging: monitor.isDragging(),
181
+ mouseOffset: monitor.getClientOffset()
182
+ })
183
+ );
184
+ if (!isDragging || itemType !== DRAG_DROP_TYPES.STAGE) {
185
+ return null;
186
+ }
187
+ return /* @__PURE__ */ jsx(
188
+ Box,
189
+ {
190
+ height: "100%",
191
+ left: 0,
192
+ position: "fixed",
193
+ pointerEvents: "none",
194
+ top: 0,
195
+ zIndex: 100,
196
+ width: "100%",
197
+ children: /* @__PURE__ */ jsxs(Box, { style: getStyle(initialOffset, currentOffset, mouseOffset), children: [
198
+ /* @__PURE__ */ jsx(StageDragPreview, { name: typeof item.item === "string" ? item.item : null }),
199
+ ";"
200
+ ] })
201
+ }
202
+ );
203
+ };
204
+ const Root = ({ children }) => {
205
+ return /* @__PURE__ */ jsx(Page.Main, { children: /* @__PURE__ */ jsx(Layouts.Content, { children }) });
206
+ };
207
+ const Header = ({ title, subtitle, navigationAction, primaryAction }) => {
208
+ const { formatMessage } = useIntl();
209
+ return /* @__PURE__ */ jsxs(Fragment, { children: [
210
+ /* @__PURE__ */ jsx(Page.Title, { children: formatMessage(
211
+ { id: "Settings.PageTitle", defaultMessage: "Settings - {name}" },
212
+ {
213
+ name: title
214
+ }
215
+ ) }),
216
+ /* @__PURE__ */ jsx(
217
+ Layouts.Header,
218
+ {
219
+ navigationAction,
220
+ primaryAction,
221
+ title,
222
+ subtitle
223
+ }
224
+ )
225
+ ] });
226
+ };
227
+ export {
228
+ DRAG_DROP_TYPES as D,
229
+ Header as H,
230
+ Root as R,
231
+ DragLayerRendered as a,
232
+ useReviewWorkflows as u
233
+ };
234
+ //# sourceMappingURL=Layout-D292CXD6.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layout-D292CXD6.mjs","sources":["../../admin/src/routes/settings/hooks/useReviewWorkflows.ts","../../admin/src/routes/settings/constants.ts","../../admin/src/routes/settings/components/StageDragPreview.tsx","../../admin/src/routes/settings/components/Layout.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport { useAPIErrorHandler, useNotification } from '@strapi/admin/strapi-admin';\nimport { type MessageDescriptor, useIntl } from 'react-intl';\n\nimport {\n GetWorkflowsParams,\n useCreateWorkflowMutation,\n useDeleteWorkflowMutation,\n useGetWorkflowsQuery,\n useUpdateWorkflowMutation,\n} from '../../../services/settings';\n\nimport type { Create, Update } from '../../../../../shared/contracts/review-workflows';\n\nconst DEFAULT_UNEXPECTED_ERROR_MSG = {\n id: 'notification.error',\n defaultMessage: 'An error occurred, please try again',\n} satisfies MessageDescriptor;\n\ntype UseReviewWorkflowsArgs = GetWorkflowsParams & {\n skip?: boolean;\n};\n\nconst useReviewWorkflows = (params: UseReviewWorkflowsArgs = {}) => {\n const { toggleNotification } = useNotification();\n const { formatMessage } = useIntl();\n const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();\n\n const { id = '', skip = false, ...queryParams } = params;\n\n const { data, isLoading, error } = useGetWorkflowsQuery(\n {\n id,\n populate: 'stages',\n ...queryParams,\n },\n {\n skip,\n }\n );\n\n React.useEffect(() => {\n if (error) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(error),\n });\n }\n }, [error, formatAPIError, toggleNotification]);\n\n const [createWorkflow] = useCreateWorkflowMutation();\n const create = React.useCallback(\n async (data: Create.Request['body']['data']) => {\n try {\n const res = await createWorkflow({ data });\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return res;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'actions.created', defaultMessage: 'Created workflow' }),\n });\n\n return res;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n throw err;\n }\n },\n [createWorkflow, formatAPIError, formatMessage, toggleNotification]\n );\n\n const [updateWorkflow] = useUpdateWorkflowMutation();\n const update = React.useCallback(\n async (id: string, data: Update.Request['body']['data']) => {\n try {\n const res = await updateWorkflow({ id, data });\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return res;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'actions.updated', defaultMessage: 'Updated workflow' }),\n });\n\n return res;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n throw err;\n }\n },\n [formatAPIError, formatMessage, toggleNotification, updateWorkflow]\n );\n\n const [deleteWorkflow] = useDeleteWorkflowMutation();\n const deleteAction = React.useCallback(\n async (id: string) => {\n try {\n const res = await deleteWorkflow({ id });\n\n if ('error' in res) {\n toggleNotification({\n type: 'danger',\n message: formatAPIError(res.error),\n });\n\n return;\n }\n\n toggleNotification({\n type: 'success',\n message: formatMessage({ id: 'actions.deleted', defaultMessage: 'Deleted workflow' }),\n });\n\n return res.data;\n } catch (err) {\n toggleNotification({\n type: 'danger',\n message: formatMessage(DEFAULT_UNEXPECTED_ERROR_MSG),\n });\n\n throw err;\n }\n },\n [deleteWorkflow, formatAPIError, formatMessage, toggleNotification]\n );\n\n const { workflows = [], meta } = data ?? {};\n\n return {\n // meta contains e.g. the total of all workflows. we can not use\n // the pagination object here, because the list is not paginated.\n meta,\n workflows,\n isLoading,\n error,\n create,\n delete: deleteAction,\n update,\n };\n};\n\nexport { useReviewWorkflows };\n","export type DragDropTypes = 'stage';\n\nexport const DRAG_DROP_TYPES: Record<Uppercase<DragDropTypes>, DragDropTypes> = {\n STAGE: 'stage',\n};\n","import { Flex, Typography } from '@strapi/design-system';\nimport { CaretDown } from '@strapi/icons';\n\ninterface StageDragPreviewType {\n name: string | null;\n}\n\nconst StageDragPreview = ({ name }: StageDragPreviewType) => {\n return (\n <Flex\n background=\"primary100\"\n borderStyle=\"dashed\"\n borderColor=\"primary600\"\n borderWidth=\"1px\"\n gap={3}\n hasRadius\n padding={3}\n shadow=\"tableShadow\"\n width=\"30rem\"\n >\n <Flex\n alignItems=\"center\"\n background=\"neutral200\"\n borderRadius=\"50%\"\n height={6}\n justifyContent=\"center\"\n width={6}\n >\n <CaretDown width=\"0.8rem\" fill=\"neutral600\" />\n </Flex>\n\n <Typography fontWeight=\"bold\">{name}</Typography>\n </Flex>\n );\n};\n\nexport { StageDragPreview };\nexport type { StageDragPreviewType };\n","import * as React from 'react';\n\nimport { Page, Layouts } from '@strapi/admin/strapi-admin';\nimport { Box } from '@strapi/design-system';\nimport { XYCoord, useDragLayer } from 'react-dnd';\nimport { useIntl } from 'react-intl';\n\nimport { DRAG_DROP_TYPES } from '../constants';\n\nimport { StageDragPreview } from './StageDragPreview';\n\nfunction getStyle(\n initialOffset: XYCoord | null,\n currentOffset: XYCoord | null,\n mouseOffset: XYCoord | null\n) {\n if (!initialOffset || !currentOffset || !mouseOffset) {\n return { display: 'none' };\n }\n\n const { x, y } = mouseOffset;\n\n return {\n transform: `translate(${x}px, ${y}px)`,\n };\n}\n\nconst DragLayerRendered = () => {\n const { itemType, isDragging, item, initialOffset, currentOffset, mouseOffset } = useDragLayer(\n (monitor) => ({\n item: monitor.getItem(),\n itemType: monitor.getItemType(),\n initialOffset: monitor.getInitialSourceClientOffset(),\n currentOffset: monitor.getSourceClientOffset(),\n isDragging: monitor.isDragging(),\n mouseOffset: monitor.getClientOffset(),\n })\n );\n\n if (!isDragging || itemType !== DRAG_DROP_TYPES.STAGE) {\n return null;\n }\n\n return (\n <Box\n height=\"100%\"\n left={0}\n position=\"fixed\"\n pointerEvents=\"none\"\n top={0}\n zIndex={100}\n width=\"100%\"\n >\n <Box style={getStyle(initialOffset, currentOffset, mouseOffset)}>\n <StageDragPreview name={typeof item.item === 'string' ? item.item : null} />;\n </Box>\n </Box>\n );\n};\n\nconst Root: React.FC<React.PropsWithChildren> = ({ children }) => {\n return (\n <Page.Main>\n <Layouts.Content>{children}</Layouts.Content>\n </Page.Main>\n );\n};\n\ninterface HeaderProps {\n title: string;\n navigationAction?: React.ReactNode;\n primaryAction?: React.ReactNode;\n secondaryAction?: React.ReactNode;\n subtitle?: React.ReactNode;\n}\n\nconst Header: React.FC<HeaderProps> = ({ title, subtitle, navigationAction, primaryAction }) => {\n const { formatMessage } = useIntl();\n return (\n <>\n <Page.Title>\n {formatMessage(\n { id: 'Settings.PageTitle', defaultMessage: 'Settings - {name}' },\n {\n name: title,\n }\n )}\n </Page.Title>\n <Layouts.Header\n navigationAction={navigationAction}\n primaryAction={primaryAction}\n title={title}\n subtitle={subtitle}\n />\n </>\n );\n};\n\nexport { DragLayerRendered, Header, Root };\n"],"names":["data","id"],"mappings":"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"}