@strapi/review-workflows 0.0.0-experimental.f31889311d753b5f7d95198ae84d8fce1d156cd6 → 0.0.0-experimental.f49f46a1c17445a39e8af3f63124bcccf73842e6

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 (79) hide show
  1. package/dist/_chunks/{Layout-Cwbb9usb.js → Layout-B4fpKB9J.js} +8 -9
  2. package/dist/_chunks/Layout-B4fpKB9J.js.map +1 -0
  3. package/dist/_chunks/{Layout-BpMLb-Oo.mjs → Layout-Dko22Aly.mjs} +8 -9
  4. package/dist/_chunks/Layout-Dko22Aly.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-p9NnvlMP.js → id-BKq7JAqZ.js} +82 -49
  10. package/dist/_chunks/id-BKq7JAqZ.js.map +1 -0
  11. package/dist/_chunks/{_id-KpezMzxO.mjs → id-DINFSsrh.mjs} +82 -49
  12. package/dist/_chunks/id-DINFSsrh.mjs.map +1 -0
  13. package/dist/_chunks/{index-DqT_oXGP.js → index-BpIILEs0.js} +9 -29
  14. package/dist/_chunks/index-BpIILEs0.js.map +1 -0
  15. package/dist/_chunks/{index-BTr8zF-9.js → index-BpL7C1EG.js} +54 -71
  16. package/dist/_chunks/index-BpL7C1EG.js.map +1 -0
  17. package/dist/_chunks/{index-DtJI5ZoC.mjs → index-DAcEdoqJ.mjs} +55 -72
  18. package/dist/_chunks/index-DAcEdoqJ.mjs.map +1 -0
  19. package/dist/_chunks/{index-BxkGN0Yj.mjs → index-ZcZKwmTD.mjs} +11 -31
  20. package/dist/_chunks/index-ZcZKwmTD.mjs.map +1 -0
  21. package/dist/_chunks/{router-B8G2sh6V.mjs → router-BPH_u176.mjs} +3 -3
  22. package/dist/_chunks/router-BPH_u176.mjs.map +1 -0
  23. package/dist/_chunks/{router-Bqj-105s.js → router-DeEgX8Ao.js} +3 -3
  24. package/dist/_chunks/router-DeEgX8Ao.js.map +1 -0
  25. package/dist/admin/index.js +1 -1
  26. package/dist/admin/index.mjs +1 -1
  27. package/dist/admin/src/services/settings.d.ts +1737 -7
  28. package/dist/server/index.js +180 -108
  29. package/dist/server/index.js.map +1 -1
  30. package/dist/server/index.mjs +180 -108
  31. package/dist/server/index.mjs.map +1 -1
  32. package/dist/server/src/bootstrap.d.ts.map +1 -1
  33. package/dist/server/src/constants/workflows.d.ts +1 -0
  34. package/dist/server/src/constants/workflows.d.ts.map +1 -1
  35. package/dist/server/src/content-types/index.d.ts +6 -0
  36. package/dist/server/src/content-types/index.d.ts.map +1 -1
  37. package/dist/server/src/content-types/workflow/index.d.ts +6 -0
  38. package/dist/server/src/content-types/workflow/index.d.ts.map +1 -1
  39. package/dist/server/src/controllers/assignees.d.ts.map +1 -1
  40. package/dist/server/src/controllers/index.d.ts +0 -1
  41. package/dist/server/src/controllers/index.d.ts.map +1 -1
  42. package/dist/server/src/controllers/stages.d.ts.map +1 -1
  43. package/dist/server/src/controllers/workflows.d.ts +0 -7
  44. package/dist/server/src/controllers/workflows.d.ts.map +1 -1
  45. package/dist/server/src/index.d.ts +28 -7
  46. package/dist/server/src/index.d.ts.map +1 -1
  47. package/dist/server/src/register.d.ts.map +1 -1
  48. package/dist/server/src/routes/review-workflows.d.ts.map +1 -1
  49. package/dist/server/src/services/assignees.d.ts +8 -4
  50. package/dist/server/src/services/assignees.d.ts.map +1 -1
  51. package/dist/server/src/services/document-service-middleware.d.ts +1 -0
  52. package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
  53. package/dist/server/src/services/index.d.ts +16 -6
  54. package/dist/server/src/services/index.d.ts.map +1 -1
  55. package/dist/server/src/services/metrics/index.d.ts +4 -4
  56. package/dist/server/src/services/metrics/index.d.ts.map +1 -1
  57. package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
  58. package/dist/server/src/services/stages.d.ts +7 -7
  59. package/dist/server/src/services/stages.d.ts.map +1 -1
  60. package/dist/server/src/services/workflows.d.ts.map +1 -1
  61. package/dist/server/src/validation/review-workflows.d.ts +4 -0
  62. package/dist/server/src/validation/review-workflows.d.ts.map +1 -1
  63. package/dist/shared/contracts/review-workflows.d.ts +9 -17
  64. package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
  65. package/package.json +12 -12
  66. package/dist/_chunks/Layout-BpMLb-Oo.mjs.map +0 -1
  67. package/dist/_chunks/Layout-Cwbb9usb.js.map +0 -1
  68. package/dist/_chunks/_id-KpezMzxO.mjs.map +0 -1
  69. package/dist/_chunks/_id-p9NnvlMP.js.map +0 -1
  70. package/dist/_chunks/en-D9ZrQAV6.mjs.map +0 -1
  71. package/dist/_chunks/en-xcewH2pC.js.map +0 -1
  72. package/dist/_chunks/index-BTr8zF-9.js.map +0 -1
  73. package/dist/_chunks/index-BxkGN0Yj.mjs.map +0 -1
  74. package/dist/_chunks/index-DqT_oXGP.js.map +0 -1
  75. package/dist/_chunks/index-DtJI5ZoC.mjs.map +0 -1
  76. package/dist/_chunks/router-B8G2sh6V.mjs.map +0 -1
  77. package/dist/_chunks/router-Bqj-105s.js.map +0 -1
  78. package/strapi-server.js +0 -3
  79. /package/dist/admin/src/routes/settings/{:id.d.ts → id.d.ts} +0 -0
@@ -2,7 +2,7 @@
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-BTr8zF-9.js");
5
+ const index = require("./index-BpL7C1EG.js");
6
6
  const jsxRuntime = require("react/jsx-runtime");
7
7
  const designSystem = require("@strapi/design-system");
8
8
  const reactDnd = require("react-dnd");
@@ -34,11 +34,10 @@ const useReviewWorkflows = (params = {}) => {
34
34
  const { toggleNotification } = strapiAdmin.useNotification();
35
35
  const { formatMessage } = reactIntl.useIntl();
36
36
  const { _unstableFormatAPIError: formatAPIError } = strapiAdmin.useAPIErrorHandler();
37
- const { id = "", skip = false, ...queryParams } = params;
37
+ const { skip = false, ...queryParams } = params;
38
38
  const { data, isLoading, error } = index.useGetWorkflowsQuery(
39
39
  {
40
- id,
41
- populate: "stages",
40
+ populate: ["stages", "stageRequiredToPublish"],
42
41
  ...queryParams
43
42
  },
44
43
  {
@@ -82,9 +81,9 @@ const useReviewWorkflows = (params = {}) => {
82
81
  );
83
82
  const [updateWorkflow] = index.useUpdateWorkflowMutation();
84
83
  const update = React__namespace.useCallback(
85
- async (id2, data2) => {
84
+ async (id, data2) => {
86
85
  try {
87
- const res = await updateWorkflow({ id: id2, data: data2 });
86
+ const res = await updateWorkflow({ id, data: data2 });
88
87
  if ("error" in res) {
89
88
  toggleNotification({
90
89
  type: "danger",
@@ -109,9 +108,9 @@ const useReviewWorkflows = (params = {}) => {
109
108
  );
110
109
  const [deleteWorkflow] = index.useDeleteWorkflowMutation();
111
110
  const deleteAction = React__namespace.useCallback(
112
- async (id2) => {
111
+ async (id) => {
113
112
  try {
114
- const res = await deleteWorkflow({ id: id2 });
113
+ const res = await deleteWorkflow({ id });
115
114
  if ("error" in res) {
116
115
  toggleNotification({
117
116
  type: "danger",
@@ -249,4 +248,4 @@ exports.DragLayerRendered = DragLayerRendered;
249
248
  exports.Header = Header;
250
249
  exports.Root = Root;
251
250
  exports.useReviewWorkflows = useReviewWorkflows;
252
- //# sourceMappingURL=Layout-Cwbb9usb.js.map
251
+ //# sourceMappingURL=Layout-B4fpKB9J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layout-B4fpKB9J.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":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,MAAM,+BAA+B;AAAA,EACnC,IAAI;AAAA,EACJ,gBAAgB;AAClB;AAMA,MAAM,qBAAqB,CAAC,SAAiC,OAAO;AAC5D,QAAA,EAAE,uBAAuBA,YAAAA;AACzB,QAAA,EAAE,kBAAkBC,UAAAA;AAC1B,QAAM,EAAE,yBAAyB,eAAe,IAAIC,YAAmB,mBAAA;AAEvE,QAAM,EAAE,OAAO,OAAO,GAAG,gBAAgB;AAEzC,QAAM,EAAE,MAAM,WAAW,MAAU,IAAAC,MAAA;AAAA,IACjC;AAAA,MACE,UAAU,CAAC,UAAU,wBAAwB;AAAA,MAC7C,GAAG;AAAA,IACL;AAAA,IACA;AAAA,MACE;AAAA,IACF;AAAA,EAAA;AAGFC,mBAAM,UAAU,MAAM;AACpB,QAAI,OAAO;AACU,yBAAA;AAAA,QACjB,MAAM;AAAA,QACN,SAAS,eAAe,KAAK;AAAA,MAAA,CAC9B;AAAA,IACH;AAAA,EACC,GAAA,CAAC,OAAO,gBAAgB,kBAAkB,CAAC;AAExC,QAAA,CAAC,cAAc,IAAIC,MAAAA;AACzB,QAAM,SAASD,iBAAM;AAAA,IACnB,OAAOE,UAAyC;AAC1C,UAAA;AACF,cAAM,MAAM,MAAM,eAAe,EAAE,MAAAA,MAAM,CAAA;AAEzC,YAAI,WAAW,KAAK;AACC,6BAAA;AAAA,YACjB,MAAM;AAAA,YACN,SAAS,eAAe,IAAI,KAAK;AAAA,UAAA,CAClC;AAEM,iBAAA;AAAA,QACT;AAEmB,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,cAAc,EAAE,IAAI,mBAAmB,gBAAgB,oBAAoB;AAAA,QAAA,CACrF;AAEM,eAAA;AAAA,eACA,KAAK;AACO,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,cAAc,4BAA4B;AAAA,QAAA,CACpD;AAEK,cAAA;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB,gBAAgB,eAAe,kBAAkB;AAAA,EAAA;AAG9D,QAAA,CAAC,cAAc,IAAIC,MAAAA;AACzB,QAAM,SAASH,iBAAM;AAAA,IACnB,OAAO,IAAYE,UAAyC;AACtD,UAAA;AACF,cAAM,MAAM,MAAM,eAAe,EAAE,IAAI,MAAAA,OAAM;AAE7C,YAAI,WAAW,KAAK;AACC,6BAAA;AAAA,YACjB,MAAM;AAAA,YACN,SAAS,eAAe,IAAI,KAAK;AAAA,UAAA,CAClC;AAEM,iBAAA;AAAA,QACT;AAEmB,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,cAAc,EAAE,IAAI,mBAAmB,gBAAgB,oBAAoB;AAAA,QAAA,CACrF;AAEM,eAAA;AAAA,eACA,KAAK;AACO,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,cAAc,4BAA4B;AAAA,QAAA,CACpD;AAEK,cAAA;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB,eAAe,oBAAoB,cAAc;AAAA,EAAA;AAG9D,QAAA,CAAC,cAAc,IAAIE,MAAAA;AACzB,QAAM,eAAeJ,iBAAM;AAAA,IACzB,OAAO,OAAe;AAChB,UAAA;AACF,cAAM,MAAM,MAAM,eAAe,EAAE,GAAI,CAAA;AAEvC,YAAI,WAAW,KAAK;AACC,6BAAA;AAAA,YACjB,MAAM;AAAA,YACN,SAAS,eAAe,IAAI,KAAK;AAAA,UAAA,CAClC;AAED;AAAA,QACF;AAEmB,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,cAAc,EAAE,IAAI,mBAAmB,gBAAgB,oBAAoB;AAAA,QAAA,CACrF;AAED,eAAO,IAAI;AAAA,eACJ,KAAK;AACO,2BAAA;AAAA,UACjB,MAAM;AAAA,UACN,SAAS,cAAc,4BAA4B;AAAA,QAAA,CACpD;AAEK,cAAA;AAAA,MACR;AAAA,IACF;AAAA,IACA,CAAC,gBAAgB,gBAAgB,eAAe,kBAAkB;AAAA,EAAA;AAGpE,QAAM,EAAE,YAAY,IAAI,KAAK,IAAI,QAAQ,CAAA;AAElC,SAAA;AAAA;AAAA;AAAA,IAGL;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA,QAAQ;AAAA,IACR;AAAA,EAAA;AAEJ;AChKO,MAAM,kBAAmE;AAAA,EAC9E,OAAO;AACT;ACGA,MAAM,mBAAmB,CAAC,EAAE,WAAiC;AAEzD,SAAAK,2BAAA;AAAA,IAACC,aAAA;AAAA,IAAA;AAAA,MACC,YAAW;AAAA,MACX,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,aAAY;AAAA,MACZ,KAAK;AAAA,MACL,WAAS;AAAA,MACT,SAAS;AAAA,MACT,QAAO;AAAA,MACP,OAAM;AAAA,MAEN,UAAA;AAAA,QAAAC,2BAAA;AAAA,UAACD,aAAA;AAAA,UAAA;AAAA,YACC,YAAW;AAAA,YACX,YAAW;AAAA,YACX,cAAa;AAAA,YACb,QAAQ;AAAA,YACR,gBAAe;AAAA,YACf,OAAO;AAAA,YAEP,UAACC,2BAAA,IAAAC,iBAAA,EAAU,OAAM,UAAS,MAAK,cAAa;AAAA,UAAA;AAAA,QAC9C;AAAA,QAECD,2BAAA,IAAAE,aAAA,YAAA,EAAW,YAAW,QAAQ,UAAK,MAAA;AAAA,MAAA;AAAA,IAAA;AAAA,EAAA;AAG1C;ACvBA,SAAS,SACP,eACA,eACA,aACA;AACA,MAAI,CAAC,iBAAiB,CAAC,iBAAiB,CAAC,aAAa;AAC7C,WAAA,EAAE,SAAS;EACpB;AAEM,QAAA,EAAE,GAAG,EAAM,IAAA;AAEV,SAAA;AAAA,IACL,WAAW,aAAa,CAAC,OAAO,CAAC;AAAA,EAAA;AAErC;AAEA,MAAM,oBAAoB,MAAM;AAC9B,QAAM,EAAE,UAAU,YAAY,MAAM,eAAe,eAAe,gBAAgBC,SAAA;AAAA,IAChF,CAAC,aAAa;AAAA,MACZ,MAAM,QAAQ,QAAQ;AAAA,MACtB,UAAU,QAAQ,YAAY;AAAA,MAC9B,eAAe,QAAQ,6BAA6B;AAAA,MACpD,eAAe,QAAQ,sBAAsB;AAAA,MAC7C,YAAY,QAAQ,WAAW;AAAA,MAC/B,aAAa,QAAQ,gBAAgB;AAAA,IAAA;AAAA,EACvC;AAGF,MAAI,CAAC,cAAc,aAAa,gBAAgB,OAAO;AAC9C,WAAA;AAAA,EACT;AAGE,SAAAH,2BAAA;AAAA,IAACI,aAAA;AAAA,IAAA;AAAA,MACC,QAAO;AAAA,MACP,MAAM;AAAA,MACN,UAAS;AAAA,MACT,eAAc;AAAA,MACd,KAAK;AAAA,MACL,QAAQ;AAAA,MACR,OAAM;AAAA,MAEN,0CAACA,aAAI,KAAA,EAAA,OAAO,SAAS,eAAe,eAAe,WAAW,GAC5D,UAAA;AAAA,QAACJ,2BAAAA,IAAA,kBAAA,EAAiB,MAAM,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO,MAAM;AAAA,QAAE;AAAA,MAAA,GAC9E;AAAA,IAAA;AAAA,EAAA;AAGN;AAEA,MAAM,OAA0C,CAAC,EAAE,eAAe;AAE9D,SAAAA,+BAACK,YAAAA,KAAK,MAAL,EACC,yCAACC,YAAQ,QAAA,SAAR,EAAiB,SAAS,CAAA,EAC7B,CAAA;AAEJ;AAUA,MAAM,SAAgC,CAAC,EAAE,OAAO,UAAU,kBAAkB,oBAAoB;AACxF,QAAA,EAAE,kBAAkBhB,UAAAA;AAC1B,SAEIQ,2BAAA,KAAAS,qBAAA,EAAA,UAAA;AAAA,IAACP,2BAAAA,IAAAK,YAAA,KAAK,OAAL,EACE,UAAA;AAAA,MACC,EAAE,IAAI,sBAAsB,gBAAgB,oBAAoB;AAAA,MAChE;AAAA,QACE,MAAM;AAAA,MACR;AAAA,IAAA,GAEJ;AAAA,IACAL,2BAAA;AAAA,MAACM,YAAAA,QAAQ;AAAA,MAAR;AAAA,QACC;AAAA,QACA;AAAA,QACA;AAAA,QACA;AAAA,MAAA;AAAA,IACF;AAAA,EACF,EAAA,CAAA;AAEJ;;;;;;"}
@@ -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-DtJI5ZoC.mjs";
4
+ import { c as useGetWorkflowsQuery, d as useCreateWorkflowMutation, e as useUpdateWorkflowMutation, f as useDeleteWorkflowMutation } from "./index-DAcEdoqJ.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-BpMLb-Oo.mjs.map
233
+ //# sourceMappingURL=Layout-Dko22Aly.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"Layout-Dko22Aly.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":";;;;;;;;;;;"}
@@ -8,11 +8,10 @@ const designSystem = require("@strapi/design-system");
8
8
  const icons = require("@strapi/icons");
9
9
  const fractionalIndexing = require("fractional-indexing");
10
10
  const reactIntl = require("react-intl");
11
- const reactRedux = require("react-redux");
12
11
  const reactRouterDom = require("react-router-dom");
13
12
  const yup = require("yup");
14
- const index = require("./index-BTr8zF-9.js");
15
- const Layout = require("./Layout-Cwbb9usb.js");
13
+ const index = require("./index-BpL7C1EG.js");
14
+ const Layout = require("./Layout-B4fpKB9J.js");
16
15
  const reactDndHtml5Backend = require("react-dnd-html5-backend");
17
16
  const styledComponents = require("styled-components");
18
17
  const reactDnd = require("react-dnd");
@@ -325,7 +324,7 @@ const Stages = ({ canDelete = true, canUpdate = true, isCreating }) => {
325
324
  canReorder: stages.length > 1,
326
325
  canUpdate,
327
326
  stagesCount: stages.length,
328
- defaultOpen: isCreating,
327
+ defaultOpen: !stage.id,
329
328
  ...stage
330
329
  }
331
330
  ) }, stage.__temp_key__);
@@ -497,7 +496,7 @@ const Stage = ({
497
496
  {
498
497
  background: "transparent",
499
498
  hasRadius: true,
500
- borderWidth: 0,
499
+ variant: "ghost",
501
500
  "data-handler-id": handlerId,
502
501
  ref: dragRef,
503
502
  label: formatMessage({
@@ -549,7 +548,7 @@ const Stage = ({
549
548
  size: 6,
550
549
  type: "permissions"
551
550
  }
552
- ].map(({ size, ...field }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: size, children: /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...field }) }, field.name)) }) })
551
+ ].map(({ size, ...field }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: size, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...field }) }, field.name)) }) })
553
552
  ] })
554
553
  }
555
554
  )
@@ -750,7 +749,6 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
750
749
  defaultMessage: "Apply to all stages"
751
750
  }),
752
751
  size: "L",
753
- variant: "secondary",
754
752
  children: /* @__PURE__ */ jsxRuntime.jsx(icons.Duplicate, {})
755
753
  }
756
754
  ) }),
@@ -795,7 +793,7 @@ const PermissionWrapper = styledComponents.styled(designSystem.Flex)`
795
793
  const WorkflowAttributes = ({ canUpdate = true }) => {
796
794
  const { formatMessage } = reactIntl.useIntl();
797
795
  return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Grid.Root, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
798
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 6, children: /* @__PURE__ */ jsxRuntime.jsx(
796
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(
799
797
  strapiAdmin.InputRenderer,
800
798
  {
801
799
  disabled: !canUpdate,
@@ -808,7 +806,8 @@ const WorkflowAttributes = ({ canUpdate = true }) => {
808
806
  type: "string"
809
807
  }
810
808
  ) }),
811
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 6, children: /* @__PURE__ */ jsxRuntime.jsx(ContentTypesSelector, { disabled: !canUpdate }) })
809
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(ContentTypesSelector, { disabled: !canUpdate }) }),
810
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(StageSelector, { disabled: !canUpdate }) })
812
811
  ] });
813
812
  };
814
813
  const ContentTypesSelector = ({ disabled }) => {
@@ -912,15 +911,63 @@ const NestedOption = styledComponents.styled(designSystem.MultiSelectOption)`
912
911
  const ContentTypeTakeNotice = styledComponents.styled(designSystem.Typography)`
913
912
  font-style: italic;
914
913
  `;
914
+ const StageSelector = ({ disabled }) => {
915
+ const { value: stages = [] } = strapiAdmin.useField("stages");
916
+ const { formatMessage } = reactIntl.useIntl();
917
+ const { error, value, onChange } = strapiAdmin.useField("stageRequiredToPublish");
918
+ const validStages = stages.filter((stage) => stage.name);
919
+ return /* @__PURE__ */ jsxRuntime.jsxs(
920
+ designSystem.Field.Root,
921
+ {
922
+ error,
923
+ name: "stageRequiredToPublish",
924
+ hint: formatMessage({
925
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.hint",
926
+ defaultMessage: "Prevents entries from being published if they are not at the required stage."
927
+ }),
928
+ children: [
929
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
930
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.label",
931
+ defaultMessage: "Required stage for publishing"
932
+ }) }),
933
+ /* @__PURE__ */ jsxRuntime.jsxs(
934
+ designSystem.SingleSelect,
935
+ {
936
+ disabled,
937
+ onChange: (value2) => {
938
+ onChange("stageRequiredToPublish", value2);
939
+ },
940
+ value,
941
+ children: [
942
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "", children: formatMessage({
943
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.any",
944
+ defaultMessage: "Any stage"
945
+ }) }),
946
+ validStages.map((stage, i) => /* @__PURE__ */ jsxRuntime.jsx(
947
+ designSystem.SingleSelectOption,
948
+ {
949
+ value: stage.id?.toString() || stage.__temp_key__,
950
+ children: stage.name
951
+ },
952
+ `requiredToPublishStage-${stage.id || stage.__temp_key__}`
953
+ ))
954
+ ]
955
+ }
956
+ ),
957
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
958
+ ]
959
+ }
960
+ );
961
+ };
915
962
  const WORKFLOW_SCHEMA = yup__namespace.object({
916
963
  contentTypes: yup__namespace.array().of(yup__namespace.string()),
917
964
  name: yup__namespace.string().max(255, {
918
965
  id: "review-workflows.validation.name.max-length",
919
966
  defaultMessage: "Name can not be longer than 255 characters"
920
- }).required(),
967
+ }).required().nullable(),
921
968
  stages: yup__namespace.array().of(
922
969
  yup__namespace.object().shape({
923
- name: yup__namespace.string().required({
970
+ name: yup__namespace.string().nullable().required({
924
971
  id: "review-workflows.validation.stage.name",
925
972
  defaultMessage: "Name is required"
926
973
  }).max(255, {
@@ -937,7 +984,7 @@ const WORKFLOW_SCHEMA = yup__namespace.object({
937
984
  return stages.filter((stage) => stage.name === stageName).length === 1;
938
985
  }
939
986
  ),
940
- color: yup__namespace.string().required({
987
+ color: yup__namespace.string().nullable().required({
941
988
  id: "review-workflows.validation.stage.color",
942
989
  defaultMessage: "Color is required"
943
990
  }).matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
@@ -954,7 +1001,8 @@ const WORKFLOW_SCHEMA = yup__namespace.object({
954
1001
  })
955
1002
  ).strict()
956
1003
  })
957
- ).min(1)
1004
+ ).min(1),
1005
+ stageRequiredToPublish: yup__namespace.string().nullable()
958
1006
  });
959
1007
  const EditPage = () => {
960
1008
  const { id = "" } = reactRouterDom.useParams();
@@ -963,7 +1011,6 @@ const EditPage = () => {
963
1011
  const { _unstableFormatValidationErrors: formatValidationErrors } = strapiAdmin.useAPIErrorHandler();
964
1012
  const navigate = reactRouterDom.useNavigate();
965
1013
  const { toggleNotification } = strapiAdmin.useNotification();
966
- const dispatch = reactRedux.useDispatch();
967
1014
  const {
968
1015
  isLoading: isLoadingWorkflow,
969
1016
  meta,
@@ -971,7 +1018,7 @@ const EditPage = () => {
971
1018
  error,
972
1019
  update,
973
1020
  create
974
- } = Layout.useReviewWorkflows({ id: isCreatingWorkflow ? void 0 : id });
1021
+ } = Layout.useReviewWorkflows();
975
1022
  const permissions = index.useTypedSelector(
976
1023
  (state) => state.admin_app.permissions["settings"]?.["review-workflows"]
977
1024
  );
@@ -988,13 +1035,17 @@ const EditPage = () => {
988
1035
  const stagesPerWorkflow = limits?.[index.CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME];
989
1036
  const submitForm = async (data, helpers) => {
990
1037
  try {
1038
+ const { stageRequiredToPublish, ...rest } = data;
1039
+ const stageRequiredToPublishName = stageRequiredToPublish === "" ? null : rest.stages.find(
1040
+ (stage) => stage.id === Number(stageRequiredToPublish) || stage.__temp_key__ === stageRequiredToPublish
1041
+ )?.name;
991
1042
  if (!isCreatingWorkflow) {
992
1043
  const res = await update(id, {
993
- ...data,
1044
+ ...rest,
994
1045
  // compare permissions of stages and only submit them if at least one has
995
1046
  // changed; this enables partial updates e.g. for users who don't have
996
1047
  // permissions to see roles
997
- stages: data.stages.map((stage) => {
1048
+ stages: rest.stages.map((stage) => {
998
1049
  let hasUpdatedPermissions = true;
999
1050
  const serverStage = currentWorkflow?.stages?.find(
1000
1051
  (serverStage2) => serverStage2.id === stage?.id
@@ -1010,40 +1061,21 @@ const EditPage = () => {
1010
1061
  ...stage,
1011
1062
  permissions: hasUpdatedPermissions ? stage.permissions : void 0
1012
1063
  };
1013
- })
1064
+ }),
1065
+ stageRequiredToPublishName
1014
1066
  });
1015
1067
  if ("error" in res && index.isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1016
1068
  helpers.setErrors(formatValidationErrors(res.error));
1017
- } else if ("data" in res) {
1018
- for (const uid of res.data.contentTypes) {
1019
- dispatch({
1020
- type: "contentManagerApi/invalidateTags",
1021
- payload: [
1022
- {
1023
- type: "ContentTypesConfiguration",
1024
- id: uid
1025
- }
1026
- ]
1027
- });
1028
- }
1029
1069
  }
1030
1070
  } else {
1031
- const res = await create(data);
1071
+ const res = await create({
1072
+ ...rest,
1073
+ stageRequiredToPublishName
1074
+ });
1032
1075
  if ("error" in res && index.isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1033
1076
  helpers.setErrors(formatValidationErrors(res.error));
1034
1077
  } else if ("data" in res) {
1035
- for (const uid of res.data.contentTypes) {
1036
- dispatch({
1037
- type: "contentManagerApi/invalidateTags",
1038
- payload: [
1039
- {
1040
- type: "ContentTypesConfiguration",
1041
- id: uid
1042
- }
1043
- ]
1044
- });
1045
- }
1046
- navigate(`../${res.data.id}`);
1078
+ navigate(`../${res.data.id}`, { replace: true });
1047
1079
  }
1048
1080
  }
1049
1081
  } catch (error2) {
@@ -1107,13 +1139,15 @@ const EditPage = () => {
1107
1139
  return {
1108
1140
  name: "",
1109
1141
  stages: [],
1110
- contentTypes: []
1142
+ contentTypes: [],
1143
+ stageRequiredToPublish: ""
1111
1144
  };
1112
1145
  } else {
1113
1146
  return {
1114
1147
  name: currentWorkflow.name,
1115
1148
  stages: addTmpKeysToStages(currentWorkflow.stages),
1116
- contentTypes: currentWorkflow.contentTypes
1149
+ contentTypes: currentWorkflow.contentTypes,
1150
+ stageRequiredToPublish: currentWorkflow.stageRequiredToPublish?.id.toString() ?? ""
1117
1151
  };
1118
1152
  }
1119
1153
  }, [currentWorkflow, isCreatingWorkflow]);
@@ -1136,13 +1170,12 @@ const EditPage = () => {
1136
1170
  /* @__PURE__ */ jsxRuntime.jsx(
1137
1171
  Layout.Header,
1138
1172
  {
1139
- navigationAction: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, {}),
1173
+ navigationAction: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, { fallback: ".." }),
1140
1174
  primaryAction: canUpdate || canCreate ? /* @__PURE__ */ jsxRuntime.jsx(
1141
1175
  designSystem.Button,
1142
1176
  {
1143
1177
  startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}),
1144
1178
  type: "submit",
1145
- size: "M",
1146
1179
  disabled: !modified || isSubmitting || values.stages.length === 0,
1147
1180
  loading: !Boolean(Object.keys(savePrompts).length > 0) && isSubmitting,
1148
1181
  children: formatMessage({
@@ -1192,7 +1225,7 @@ const EditPage = () => {
1192
1225
  },
1193
1226
  {
1194
1227
  count: contentTypesFromOtherWorkflows?.filter(
1195
- (contentType) => currentWorkflow?.contentTypes?.includes(contentType)
1228
+ (contentType) => values.contentTypes.includes(contentType)
1196
1229
  ).length ?? 0
1197
1230
  }
1198
1231
  ) }),
@@ -1261,4 +1294,4 @@ const ProtectedEditPage = () => {
1261
1294
  return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Protect, { permissions, children: /* @__PURE__ */ jsxRuntime.jsx(EditPage, {}) });
1262
1295
  };
1263
1296
  exports.ProtectedEditPage = ProtectedEditPage;
1264
- //# sourceMappingURL=_id-p9NnvlMP.js.map
1297
+ //# sourceMappingURL=id-BKq7JAqZ.js.map