@strapi/review-workflows 0.0.0-experimental.edc24aaa3bb5a90fa5fd4fee208167dd4e2e38d4 → 0.0.0-experimental.ee7402bacc4656d268ab76aa9c334a7b7a951201

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 (87) hide show
  1. package/dist/_chunks/{Layout-D3DDQmMI.js → Layout-C3IORH2n.js} +9 -11
  2. package/dist/_chunks/Layout-C3IORH2n.js.map +1 -0
  3. package/dist/_chunks/{Layout-Da8jupiA.mjs → Layout-DNKR5bym.mjs} +8 -9
  4. package/dist/_chunks/Layout-DNKR5bym.mjs.map +1 -0
  5. package/dist/_chunks/{en-xcewH2pC.js → en-CYgjfSep.js} +5 -2
  6. package/dist/_chunks/en-CYgjfSep.js.map +1 -0
  7. package/dist/_chunks/{en-D9ZrQAV6.mjs → en-D9dxziEb.mjs} +5 -2
  8. package/dist/_chunks/en-D9dxziEb.mjs.map +1 -0
  9. package/dist/_chunks/{_id-xSrgPSJs.mjs → id-C9Ku9Br9.mjs} +85 -55
  10. package/dist/_chunks/id-C9Ku9Br9.mjs.map +1 -0
  11. package/dist/_chunks/{_id-CnRDP3Xx.js → id-oOE1bYls.js} +86 -57
  12. package/dist/_chunks/id-oOE1bYls.js.map +1 -0
  13. package/dist/_chunks/{index-DDsJlZQw.mjs → index-ByXbOW-R.mjs} +91 -77
  14. package/dist/_chunks/index-ByXbOW-R.mjs.map +1 -0
  15. package/dist/_chunks/{index-4kp4AkBB.js → index-CmHHjN95.js} +12 -34
  16. package/dist/_chunks/index-CmHHjN95.js.map +1 -0
  17. package/dist/_chunks/{index-jfO5GxtW.mjs → index-CyhaJuJG.mjs} +13 -34
  18. package/dist/_chunks/index-CyhaJuJG.mjs.map +1 -0
  19. package/dist/_chunks/{index-DhPxWpsW.js → index-DMT27jNE.js} +91 -78
  20. package/dist/_chunks/index-DMT27jNE.js.map +1 -0
  21. package/dist/_chunks/{purchase-review-workflows-DlCDg0fD.js → purchase-review-workflows-BxoDFxQ5.js} +2 -2
  22. package/dist/_chunks/purchase-review-workflows-BxoDFxQ5.js.map +1 -0
  23. package/dist/_chunks/{purchase-review-workflows-BN-5Ube7.mjs → purchase-review-workflows-DyFV_H0I.mjs} +2 -2
  24. package/dist/_chunks/{purchase-review-workflows-BN-5Ube7.mjs.map → purchase-review-workflows-DyFV_H0I.mjs.map} +1 -1
  25. package/dist/_chunks/{router-DOEULOpS.mjs → router-BPl2HZMq.mjs} +3 -3
  26. package/dist/_chunks/router-BPl2HZMq.mjs.map +1 -0
  27. package/dist/_chunks/{router-DSXpeew4.js → router-vDfGt9bq.js} +3 -3
  28. package/dist/_chunks/router-vDfGt9bq.js.map +1 -0
  29. package/dist/admin/index.js +1 -1
  30. package/dist/admin/index.mjs +1 -1
  31. package/dist/admin/src/services/admin.d.ts +1 -1
  32. package/dist/admin/src/services/api.d.ts +1 -1
  33. package/dist/admin/src/services/content-manager.d.ts +4 -4
  34. package/dist/admin/src/services/settings.d.ts +1739 -9
  35. package/dist/server/index.js +455 -628
  36. package/dist/server/index.js.map +1 -1
  37. package/dist/server/index.mjs +455 -628
  38. package/dist/server/index.mjs.map +1 -1
  39. package/dist/server/src/bootstrap.d.ts.map +1 -1
  40. package/dist/server/src/constants/workflows.d.ts +1 -0
  41. package/dist/server/src/constants/workflows.d.ts.map +1 -1
  42. package/dist/server/src/content-types/index.d.ts +6 -0
  43. package/dist/server/src/content-types/index.d.ts.map +1 -1
  44. package/dist/server/src/content-types/workflow/index.d.ts +6 -0
  45. package/dist/server/src/content-types/workflow/index.d.ts.map +1 -1
  46. package/dist/server/src/controllers/assignees.d.ts.map +1 -1
  47. package/dist/server/src/controllers/index.d.ts +0 -1
  48. package/dist/server/src/controllers/index.d.ts.map +1 -1
  49. package/dist/server/src/controllers/stages.d.ts.map +1 -1
  50. package/dist/server/src/controllers/workflows.d.ts +0 -7
  51. package/dist/server/src/controllers/workflows.d.ts.map +1 -1
  52. package/dist/server/src/index.d.ts +28 -7
  53. package/dist/server/src/index.d.ts.map +1 -1
  54. package/dist/server/src/register.d.ts.map +1 -1
  55. package/dist/server/src/routes/review-workflows.d.ts.map +1 -1
  56. package/dist/server/src/services/assignees.d.ts +8 -4
  57. package/dist/server/src/services/assignees.d.ts.map +1 -1
  58. package/dist/server/src/services/document-service-middleware.d.ts +1 -0
  59. package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
  60. package/dist/server/src/services/index.d.ts +16 -6
  61. package/dist/server/src/services/index.d.ts.map +1 -1
  62. package/dist/server/src/services/metrics/index.d.ts +4 -4
  63. package/dist/server/src/services/metrics/index.d.ts.map +1 -1
  64. package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
  65. package/dist/server/src/services/stages.d.ts +7 -7
  66. package/dist/server/src/services/stages.d.ts.map +1 -1
  67. package/dist/server/src/services/workflows.d.ts.map +1 -1
  68. package/dist/server/src/validation/review-workflows.d.ts +4 -0
  69. package/dist/server/src/validation/review-workflows.d.ts.map +1 -1
  70. package/dist/shared/contracts/review-workflows.d.ts +9 -17
  71. package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
  72. package/package.json +12 -13
  73. package/dist/_chunks/Layout-D3DDQmMI.js.map +0 -1
  74. package/dist/_chunks/Layout-Da8jupiA.mjs.map +0 -1
  75. package/dist/_chunks/_id-CnRDP3Xx.js.map +0 -1
  76. package/dist/_chunks/_id-xSrgPSJs.mjs.map +0 -1
  77. package/dist/_chunks/en-D9ZrQAV6.mjs.map +0 -1
  78. package/dist/_chunks/en-xcewH2pC.js.map +0 -1
  79. package/dist/_chunks/index-4kp4AkBB.js.map +0 -1
  80. package/dist/_chunks/index-DDsJlZQw.mjs.map +0 -1
  81. package/dist/_chunks/index-DhPxWpsW.js.map +0 -1
  82. package/dist/_chunks/index-jfO5GxtW.mjs.map +0 -1
  83. package/dist/_chunks/purchase-review-workflows-DlCDg0fD.js.map +0 -1
  84. package/dist/_chunks/router-DOEULOpS.mjs.map +0 -1
  85. package/dist/_chunks/router-DSXpeew4.js.map +0 -1
  86. package/strapi-server.js +0 -3
  87. /package/dist/admin/src/routes/settings/{:id.d.ts → id.d.ts} +0 -0
@@ -2,14 +2,13 @@
2
2
  const React = require("react");
3
3
  const strapiAdmin = require("@strapi/admin/strapi-admin");
4
4
  const reactIntl = require("react-intl");
5
- const index = require("./index-DhPxWpsW.js");
5
+ const index = require("./index-DMT27jNE.js");
6
6
  const jsxRuntime = require("react/jsx-runtime");
7
7
  const designSystem = require("@strapi/design-system");
8
8
  const reactDnd = require("react-dnd");
9
9
  const icons = require("@strapi/icons");
10
10
  function _interopNamespace(e) {
11
- if (e && e.__esModule)
12
- return e;
11
+ if (e && e.__esModule) return e;
13
12
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
14
13
  if (e) {
15
14
  for (const k in e) {
@@ -34,11 +33,10 @@ const useReviewWorkflows = (params = {}) => {
34
33
  const { toggleNotification } = strapiAdmin.useNotification();
35
34
  const { formatMessage } = reactIntl.useIntl();
36
35
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
37
- const { id = "", skip = false, ...queryParams } = params;
36
+ const { skip = false, ...queryParams } = params;
38
37
  const { data, isLoading, error } = index.useGetWorkflowsQuery(
39
38
  {
40
- id,
41
- populate: "stages",
39
+ populate: ["stages", "stageRequiredToPublish"],
42
40
  ...queryParams
43
41
  },
44
42
  {
@@ -82,9 +80,9 @@ const useReviewWorkflows = (params = {}) => {
82
80
  );
83
81
  const [updateWorkflow] = index.useUpdateWorkflowMutation();
84
82
  const update = React__namespace.useCallback(
85
- async (id2, data2) => {
83
+ async (id, data2) => {
86
84
  try {
87
- const res = await updateWorkflow({ id: id2, data: data2 });
85
+ const res = await updateWorkflow({ id, data: data2 });
88
86
  if ("error" in res) {
89
87
  toggleNotification({
90
88
  type: "danger",
@@ -109,9 +107,9 @@ const useReviewWorkflows = (params = {}) => {
109
107
  );
110
108
  const [deleteWorkflow] = index.useDeleteWorkflowMutation();
111
109
  const deleteAction = React__namespace.useCallback(
112
- async (id2) => {
110
+ async (id) => {
113
111
  try {
114
- const res = await deleteWorkflow({ id: id2 });
112
+ const res = await deleteWorkflow({ id });
115
113
  if ("error" in res) {
116
114
  toggleNotification({
117
115
  type: "danger",
@@ -249,4 +247,4 @@ exports.DragLayerRendered = DragLayerRendered;
249
247
  exports.Header = Header;
250
248
  exports.Root = Root;
251
249
  exports.useReviewWorkflows = useReviewWorkflows;
252
- //# sourceMappingURL=Layout-D3DDQmMI.js.map
250
+ //# sourceMappingURL=Layout-C3IORH2n.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layout-C3IORH2n.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 { skip = false, ...queryParams } = params;\n\n const { data, isLoading, error } = useGetWorkflowsQuery(\n {\n populate: ['stages', 'stageRequiredToPublish'],\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.BaseHeader\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","useDeleteWorkflowMutation","jsxs","Flex","jsx","CaretDown","Typography","useDragLayer","Box","Page","Layouts","Fragment"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import * as React from "react";
2
2
  import { useNotification, useAPIErrorHandler, Page, Layouts } from "@strapi/admin/strapi-admin";
3
3
  import { useIntl } from "react-intl";
4
- import { c as useGetWorkflowsQuery, d as useCreateWorkflowMutation, e as useUpdateWorkflowMutation, f as useDeleteWorkflowMutation } from "./index-DDsJlZQw.mjs";
4
+ import { c as useGetWorkflowsQuery, d as useCreateWorkflowMutation, e as useUpdateWorkflowMutation, f as useDeleteWorkflowMutation } from "./index-ByXbOW-R.mjs";
5
5
  import { jsxs, jsx, Fragment } from "react/jsx-runtime";
6
6
  import { Flex, Typography, Box } from "@strapi/design-system";
7
7
  import { useDragLayer } from "react-dnd";
@@ -14,11 +14,10 @@ const useReviewWorkflows = (params = {}) => {
14
14
  const { toggleNotification } = useNotification();
15
15
  const { formatMessage } = useIntl();
16
16
  const { _unstableFormatAPIError: formatAPIError } = useAPIErrorHandler();
17
- const { id = "", skip = false, ...queryParams } = params;
17
+ const { skip = false, ...queryParams } = params;
18
18
  const { data, isLoading, error } = useGetWorkflowsQuery(
19
19
  {
20
- id,
21
- populate: "stages",
20
+ populate: ["stages", "stageRequiredToPublish"],
22
21
  ...queryParams
23
22
  },
24
23
  {
@@ -62,9 +61,9 @@ const useReviewWorkflows = (params = {}) => {
62
61
  );
63
62
  const [updateWorkflow] = useUpdateWorkflowMutation();
64
63
  const update = React.useCallback(
65
- async (id2, data2) => {
64
+ async (id, data2) => {
66
65
  try {
67
- const res = await updateWorkflow({ id: id2, data: data2 });
66
+ const res = await updateWorkflow({ id, data: data2 });
68
67
  if ("error" in res) {
69
68
  toggleNotification({
70
69
  type: "danger",
@@ -89,9 +88,9 @@ const useReviewWorkflows = (params = {}) => {
89
88
  );
90
89
  const [deleteWorkflow] = useDeleteWorkflowMutation();
91
90
  const deleteAction = React.useCallback(
92
- async (id2) => {
91
+ async (id) => {
93
92
  try {
94
- const res = await deleteWorkflow({ id: id2 });
93
+ const res = await deleteWorkflow({ id });
95
94
  if ("error" in res) {
96
95
  toggleNotification({
97
96
  type: "danger",
@@ -231,4 +230,4 @@ export {
231
230
  DragLayerRendered as a,
232
231
  useReviewWorkflows as u
233
232
  };
234
- //# sourceMappingURL=Layout-Da8jupiA.mjs.map
233
+ //# sourceMappingURL=Layout-DNKR5bym.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layout-DNKR5bym.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 { skip = false, ...queryParams } = params;\n\n const { data, isLoading, error } = useGetWorkflowsQuery(\n {\n populate: ['stages', 'stageRequiredToPublish'],\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.BaseHeader\n navigationAction={navigationAction}\n primaryAction={primaryAction}\n title={title}\n subtitle={subtitle}\n />\n </>\n );\n};\n\nexport { DragLayerRendered, Header, Root };\n"],"names":["data"],"mappings":"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"}
@@ -6,7 +6,10 @@ const en = {
6
6
  "settings.page.isLoading": "Workflow is loading",
7
7
  "settings.page.delete.confirm.body": "All entries assigned to deleted stages will be moved to the previous stage. Are you sure you want to save?",
8
8
  "settings.stage.name.label": "Stage name",
9
- "settings.not-available": "Review Workflows is only available as part of the Enterprise Edition. Upgrade to create and manage workflows."
9
+ "settings.not-available": "Review Workflows is only available as part of the Enterprise Edition. Upgrade to create and manage workflows.",
10
+ "settings.review-workflows.workflow.stageRequiredToPublish.label": "Required stage for publishing",
11
+ "settings.review-workflows.workflow.stageRequiredToPublish.any": "Any stage",
12
+ "settings.review-workflows.workflow.stageRequiredToPublish.hint": "Prevents entries from being published if they are not at the required stage."
10
13
  };
11
14
  exports.default = en;
12
- //# sourceMappingURL=en-xcewH2pC.js.map
15
+ //# sourceMappingURL=en-CYgjfSep.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-CYgjfSep.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;"}
@@ -4,9 +4,12 @@ const en = {
4
4
  "settings.page.isLoading": "Workflow is loading",
5
5
  "settings.page.delete.confirm.body": "All entries assigned to deleted stages will be moved to the previous stage. Are you sure you want to save?",
6
6
  "settings.stage.name.label": "Stage name",
7
- "settings.not-available": "Review Workflows is only available as part of the Enterprise Edition. Upgrade to create and manage workflows."
7
+ "settings.not-available": "Review Workflows is only available as part of the Enterprise Edition. Upgrade to create and manage workflows.",
8
+ "settings.review-workflows.workflow.stageRequiredToPublish.label": "Required stage for publishing",
9
+ "settings.review-workflows.workflow.stageRequiredToPublish.any": "Any stage",
10
+ "settings.review-workflows.workflow.stageRequiredToPublish.hint": "Prevents entries from being published if they are not at the required stage."
8
11
  };
9
12
  export {
10
13
  en as default
11
14
  };
12
- //# sourceMappingURL=en-D9ZrQAV6.mjs.map
15
+ //# sourceMappingURL=en-D9dxziEb.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"en-D9dxziEb.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;"}
@@ -6,11 +6,10 @@ import { Box, Typography, Flex, Accordion, MenuItem, Menu, MultiSelectOption, us
6
6
  import { PlusCircle, More, Drag, EyeStriked, Duplicate, Check } from "@strapi/icons";
7
7
  import { generateNKeysBetween } from "fractional-indexing";
8
8
  import { useIntl } from "react-intl";
9
- import { useDispatch } from "react-redux";
10
9
  import { useParams, useNavigate } from "react-router-dom";
11
10
  import * as yup from "yup";
12
- import { r as reviewWorkflowsApi, A as AVAILABLE_COLORS, g as getStageColorByHex, u as useGetContentTypesQuery, a as useTypedSelector, C as CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME, b as CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME, L as LimitsModal, i as isBaseQueryError } from "./index-DDsJlZQw.mjs";
13
- import { D as DRAG_DROP_TYPES, u as useReviewWorkflows, a as DragLayerRendered, H as Header, R as Root } from "./Layout-Da8jupiA.mjs";
11
+ import { r as reviewWorkflowsApi, A as AVAILABLE_COLORS, g as getStageColorByHex, u as useGetContentTypesQuery, a as useTypedSelector, C as CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME, b as CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME, L as LimitsModal, i as isBaseQueryError } from "./index-ByXbOW-R.mjs";
12
+ import { D as DRAG_DROP_TYPES, u as useReviewWorkflows, a as DragLayerRendered, H as Header, R as Root } from "./Layout-DNKR5bym.mjs";
14
13
  import { getEmptyImage } from "react-dnd-html5-backend";
15
14
  import { styled } from "styled-components";
16
15
  import { useDrop, useDrag } from "react-dnd";
@@ -138,8 +137,7 @@ const useDragAndDrop = (active, {
138
137
  const hoverBoundingRect = objectRef.current?.getBoundingClientRect();
139
138
  const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;
140
139
  const clientOffset = monitor.getClientOffset();
141
- if (!clientOffset)
142
- return;
140
+ if (!clientOffset) return;
143
141
  const hoverClientY = clientOffset && clientOffset.y - hoverBoundingRect.top;
144
142
  if (typeof dragIndex === "number" && typeof newIndex === "number") {
145
143
  if (dragIndex === newIndex) {
@@ -192,10 +190,8 @@ const useDragAndDrop = (active, {
192
190
  const getDragDirection = (monitor) => {
193
191
  if (monitor && monitor.isDragging() && !monitor.didDrop() && monitor.getInitialClientOffset() && monitor.getClientOffset()) {
194
192
  const deltaY = monitor.getInitialClientOffset().y - monitor.getClientOffset().y;
195
- if (deltaY > 0)
196
- return DIRECTIONS.UPWARD;
197
- if (deltaY < 0)
198
- return DIRECTIONS.DOWNWARD;
193
+ if (deltaY > 0) return DIRECTIONS.UPWARD;
194
+ if (deltaY < 0) return DIRECTIONS.DOWNWARD;
199
195
  return null;
200
196
  }
201
197
  return null;
@@ -303,7 +299,7 @@ const Stages = ({ canDelete = true, canUpdate = true, isCreating }) => {
303
299
  canReorder: stages.length > 1,
304
300
  canUpdate,
305
301
  stagesCount: stages.length,
306
- defaultOpen: isCreating,
302
+ defaultOpen: !stage.id,
307
303
  ...stage
308
304
  }
309
305
  ) }, stage.__temp_key__);
@@ -475,7 +471,7 @@ const Stage = ({
475
471
  {
476
472
  background: "transparent",
477
473
  hasRadius: true,
478
- borderWidth: 0,
474
+ variant: "ghost",
479
475
  "data-handler-id": handlerId,
480
476
  ref: dragRef,
481
477
  label: formatMessage({
@@ -527,7 +523,7 @@ const Stage = ({
527
523
  size: 6,
528
524
  type: "permissions"
529
525
  }
530
- ].map(({ size, ...field }) => /* @__PURE__ */ jsx(Grid.Item, { col: size, children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name)) }) })
526
+ ].map(({ size, ...field }) => /* @__PURE__ */ jsx(Grid.Item, { col: size, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name)) }) })
531
527
  ] })
532
528
  }
533
529
  )
@@ -728,7 +724,6 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
728
724
  defaultMessage: "Apply to all stages"
729
725
  }),
730
726
  size: "L",
731
- variant: "secondary",
732
727
  children: /* @__PURE__ */ jsx(Duplicate, {})
733
728
  }
734
729
  ) }),
@@ -773,7 +768,7 @@ const PermissionWrapper = styled(Flex)`
773
768
  const WorkflowAttributes = ({ canUpdate = true }) => {
774
769
  const { formatMessage } = useIntl();
775
770
  return /* @__PURE__ */ jsxs(Grid.Root, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
776
- /* @__PURE__ */ jsx(Grid.Item, { col: 6, children: /* @__PURE__ */ jsx(
771
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(
777
772
  InputRenderer$1,
778
773
  {
779
774
  disabled: !canUpdate,
@@ -786,7 +781,8 @@ const WorkflowAttributes = ({ canUpdate = true }) => {
786
781
  type: "string"
787
782
  }
788
783
  ) }),
789
- /* @__PURE__ */ jsx(Grid.Item, { col: 6, children: /* @__PURE__ */ jsx(ContentTypesSelector, { disabled: !canUpdate }) })
784
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(ContentTypesSelector, { disabled: !canUpdate }) }),
785
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(StageSelector, { disabled: !canUpdate }) })
790
786
  ] });
791
787
  };
792
788
  const ContentTypesSelector = ({ disabled }) => {
@@ -890,15 +886,63 @@ const NestedOption = styled(MultiSelectOption)`
890
886
  const ContentTypeTakeNotice = styled(Typography)`
891
887
  font-style: italic;
892
888
  `;
889
+ const StageSelector = ({ disabled }) => {
890
+ const { value: stages = [] } = useField("stages");
891
+ const { formatMessage } = useIntl();
892
+ const { error, value, onChange } = useField("stageRequiredToPublish");
893
+ const validStages = stages.filter((stage) => stage.name);
894
+ return /* @__PURE__ */ jsxs(
895
+ Field.Root,
896
+ {
897
+ error,
898
+ name: "stageRequiredToPublish",
899
+ hint: formatMessage({
900
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.hint",
901
+ defaultMessage: "Prevents entries from being published if they are not at the required stage."
902
+ }),
903
+ children: [
904
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
905
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.label",
906
+ defaultMessage: "Required stage for publishing"
907
+ }) }),
908
+ /* @__PURE__ */ jsxs(
909
+ SingleSelect,
910
+ {
911
+ disabled,
912
+ onChange: (value2) => {
913
+ onChange("stageRequiredToPublish", value2);
914
+ },
915
+ value,
916
+ children: [
917
+ /* @__PURE__ */ jsx(SingleSelectOption, { value: "", children: formatMessage({
918
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.any",
919
+ defaultMessage: "Any stage"
920
+ }) }),
921
+ validStages.map((stage, i) => /* @__PURE__ */ jsx(
922
+ SingleSelectOption,
923
+ {
924
+ value: stage.id?.toString() || stage.__temp_key__,
925
+ children: stage.name
926
+ },
927
+ `requiredToPublishStage-${stage.id || stage.__temp_key__}`
928
+ ))
929
+ ]
930
+ }
931
+ ),
932
+ /* @__PURE__ */ jsx(Field.Hint, {})
933
+ ]
934
+ }
935
+ );
936
+ };
893
937
  const WORKFLOW_SCHEMA = yup.object({
894
938
  contentTypes: yup.array().of(yup.string()),
895
939
  name: yup.string().max(255, {
896
940
  id: "review-workflows.validation.name.max-length",
897
941
  defaultMessage: "Name can not be longer than 255 characters"
898
- }).required(),
942
+ }).required().nullable(),
899
943
  stages: yup.array().of(
900
944
  yup.object().shape({
901
- name: yup.string().required({
945
+ name: yup.string().nullable().required({
902
946
  id: "review-workflows.validation.stage.name",
903
947
  defaultMessage: "Name is required"
904
948
  }).max(255, {
@@ -915,7 +959,7 @@ const WORKFLOW_SCHEMA = yup.object({
915
959
  return stages.filter((stage) => stage.name === stageName).length === 1;
916
960
  }
917
961
  ),
918
- color: yup.string().required({
962
+ color: yup.string().nullable().required({
919
963
  id: "review-workflows.validation.stage.color",
920
964
  defaultMessage: "Color is required"
921
965
  }).matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
@@ -932,7 +976,8 @@ const WORKFLOW_SCHEMA = yup.object({
932
976
  })
933
977
  ).strict()
934
978
  })
935
- ).min(1)
979
+ ).min(1),
980
+ stageRequiredToPublish: yup.string().nullable()
936
981
  });
937
982
  const EditPage = () => {
938
983
  const { id = "" } = useParams();
@@ -941,7 +986,6 @@ const EditPage = () => {
941
986
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
942
987
  const navigate = useNavigate();
943
988
  const { toggleNotification } = useNotification();
944
- const dispatch = useDispatch();
945
989
  const {
946
990
  isLoading: isLoadingWorkflow,
947
991
  meta,
@@ -949,7 +993,7 @@ const EditPage = () => {
949
993
  error,
950
994
  update,
951
995
  create
952
- } = useReviewWorkflows({ id: isCreatingWorkflow ? void 0 : id });
996
+ } = useReviewWorkflows();
953
997
  const permissions = useTypedSelector(
954
998
  (state) => state.admin_app.permissions["settings"]?.["review-workflows"]
955
999
  );
@@ -966,13 +1010,17 @@ const EditPage = () => {
966
1010
  const stagesPerWorkflow = limits?.[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME];
967
1011
  const submitForm = async (data, helpers) => {
968
1012
  try {
1013
+ const { stageRequiredToPublish, ...rest } = data;
1014
+ const stageRequiredToPublishName = stageRequiredToPublish === "" ? null : rest.stages.find(
1015
+ (stage) => stage.id === Number(stageRequiredToPublish) || stage.__temp_key__ === stageRequiredToPublish
1016
+ )?.name;
969
1017
  if (!isCreatingWorkflow) {
970
1018
  const res = await update(id, {
971
- ...data,
1019
+ ...rest,
972
1020
  // compare permissions of stages and only submit them if at least one has
973
1021
  // changed; this enables partial updates e.g. for users who don't have
974
1022
  // permissions to see roles
975
- stages: data.stages.map((stage) => {
1023
+ stages: rest.stages.map((stage) => {
976
1024
  let hasUpdatedPermissions = true;
977
1025
  const serverStage = currentWorkflow?.stages?.find(
978
1026
  (serverStage2) => serverStage2.id === stage?.id
@@ -988,40 +1036,21 @@ const EditPage = () => {
988
1036
  ...stage,
989
1037
  permissions: hasUpdatedPermissions ? stage.permissions : void 0
990
1038
  };
991
- })
1039
+ }),
1040
+ stageRequiredToPublishName
992
1041
  });
993
1042
  if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
994
1043
  helpers.setErrors(formatValidationErrors(res.error));
995
- } else if ("data" in res) {
996
- for (const uid of res.data.contentTypes) {
997
- dispatch({
998
- type: "contentManagerApi/invalidateTags",
999
- payload: [
1000
- {
1001
- type: "ContentTypesConfiguration",
1002
- id: uid
1003
- }
1004
- ]
1005
- });
1006
- }
1007
1044
  }
1008
1045
  } else {
1009
- const res = await create(data);
1046
+ const res = await create({
1047
+ ...rest,
1048
+ stageRequiredToPublishName
1049
+ });
1010
1050
  if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1011
1051
  helpers.setErrors(formatValidationErrors(res.error));
1012
1052
  } else if ("data" in res) {
1013
- for (const uid of res.data.contentTypes) {
1014
- dispatch({
1015
- type: "contentManagerApi/invalidateTags",
1016
- payload: [
1017
- {
1018
- type: "ContentTypesConfiguration",
1019
- id: uid
1020
- }
1021
- ]
1022
- });
1023
- }
1024
- navigate(`../${res.data.id}`);
1053
+ navigate(`../${res.data.id}`, { replace: true });
1025
1054
  }
1026
1055
  }
1027
1056
  } catch (error2) {
@@ -1085,13 +1114,15 @@ const EditPage = () => {
1085
1114
  return {
1086
1115
  name: "",
1087
1116
  stages: [],
1088
- contentTypes: []
1117
+ contentTypes: [],
1118
+ stageRequiredToPublish: ""
1089
1119
  };
1090
1120
  } else {
1091
1121
  return {
1092
1122
  name: currentWorkflow.name,
1093
1123
  stages: addTmpKeysToStages(currentWorkflow.stages),
1094
- contentTypes: currentWorkflow.contentTypes
1124
+ contentTypes: currentWorkflow.contentTypes,
1125
+ stageRequiredToPublish: currentWorkflow.stageRequiredToPublish?.id.toString() ?? ""
1095
1126
  };
1096
1127
  }
1097
1128
  }, [currentWorkflow, isCreatingWorkflow]);
@@ -1114,13 +1145,12 @@ const EditPage = () => {
1114
1145
  /* @__PURE__ */ jsx(
1115
1146
  Header,
1116
1147
  {
1117
- navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
1148
+ navigationAction: /* @__PURE__ */ jsx(BackButton, { fallback: ".." }),
1118
1149
  primaryAction: canUpdate || canCreate ? /* @__PURE__ */ jsx(
1119
1150
  Button,
1120
1151
  {
1121
1152
  startIcon: /* @__PURE__ */ jsx(Check, {}),
1122
1153
  type: "submit",
1123
- size: "M",
1124
1154
  disabled: !modified || isSubmitting || values.stages.length === 0,
1125
1155
  loading: !Boolean(Object.keys(savePrompts).length > 0) && isSubmitting,
1126
1156
  children: formatMessage({
@@ -1170,7 +1200,7 @@ const EditPage = () => {
1170
1200
  },
1171
1201
  {
1172
1202
  count: contentTypesFromOtherWorkflows?.filter(
1173
- (contentType) => currentWorkflow?.contentTypes?.includes(contentType)
1203
+ (contentType) => values.contentTypes.includes(contentType)
1174
1204
  ).length ?? 0
1175
1205
  }
1176
1206
  ) }),
@@ -1241,4 +1271,4 @@ const ProtectedEditPage = () => {
1241
1271
  export {
1242
1272
  ProtectedEditPage
1243
1273
  };
1244
- //# sourceMappingURL=_id-xSrgPSJs.mjs.map
1274
+ //# sourceMappingURL=id-C9Ku9Br9.mjs.map