@strapi/review-workflows 0.0.0-experimental.826f263c58b6886b849d3f03b81f7a530bc51c91 → 0.0.0-experimental.8c83c87960f2f5ddf95ae2f0acf849052f4a9ab4

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 (86) hide show
  1. package/LICENSE +12 -17
  2. package/dist/_chunks/{Layout-lg3hbwGL.mjs → Layout-BGC42hTJ.mjs} +9 -10
  3. package/dist/_chunks/Layout-BGC42hTJ.mjs.map +1 -0
  4. package/dist/_chunks/{Layout-BMqtFafC.js → Layout-DcZnQxp9.js} +10 -12
  5. package/dist/_chunks/Layout-DcZnQxp9.js.map +1 -0
  6. package/dist/_chunks/{en-xcewH2pC.js → en-CYgjfSep.js} +5 -2
  7. package/dist/_chunks/en-CYgjfSep.js.map +1 -0
  8. package/dist/_chunks/{en-D9ZrQAV6.mjs → en-D9dxziEb.mjs} +5 -2
  9. package/dist/_chunks/en-D9dxziEb.mjs.map +1 -0
  10. package/dist/_chunks/{_id-B853wt9z.js → id-BI6AAFQF.js} +202 -180
  11. package/dist/_chunks/id-BI6AAFQF.js.map +1 -0
  12. package/dist/_chunks/{_id-B3jMqqMH.mjs → id-FuGqdNs8.mjs} +202 -179
  13. package/dist/_chunks/id-FuGqdNs8.mjs.map +1 -0
  14. package/dist/_chunks/{index-CdU1x9cZ.js → index-B05ot-RJ.js} +17 -47
  15. package/dist/_chunks/index-B05ot-RJ.js.map +1 -0
  16. package/dist/_chunks/{index-lebOqdrv.mjs → index-C_-s412E.mjs} +119 -103
  17. package/dist/_chunks/index-C_-s412E.mjs.map +1 -0
  18. package/dist/_chunks/{index-BhJmjDbj.mjs → index-D0D7uQQv.mjs} +18 -47
  19. package/dist/_chunks/index-D0D7uQQv.mjs.map +1 -0
  20. package/dist/_chunks/{index-Ujtj1Rcp.js → index-Nf1qO5tM.js} +118 -103
  21. package/dist/_chunks/index-Nf1qO5tM.js.map +1 -0
  22. package/dist/_chunks/purchase-review-workflows-BN-5Ube7.mjs.map +1 -1
  23. package/dist/_chunks/purchase-review-workflows-DlCDg0fD.js.map +1 -1
  24. package/dist/_chunks/{router-CvMnSjb9.mjs → router-BslCQGgZ.mjs} +3 -3
  25. package/dist/_chunks/router-BslCQGgZ.mjs.map +1 -0
  26. package/dist/_chunks/{router-BboD243b.js → router-DXipg2gI.js} +3 -3
  27. package/dist/_chunks/router-DXipg2gI.js.map +1 -0
  28. package/dist/admin/index.js +1 -1
  29. package/dist/admin/index.mjs +1 -1
  30. package/dist/admin/src/components/LimitsModal.d.ts +2 -4
  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 +13 -13
  73. package/dist/_chunks/Layout-BMqtFafC.js.map +0 -1
  74. package/dist/_chunks/Layout-lg3hbwGL.mjs.map +0 -1
  75. package/dist/_chunks/_id-B3jMqqMH.mjs.map +0 -1
  76. package/dist/_chunks/_id-B853wt9z.js.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-BhJmjDbj.mjs.map +0 -1
  80. package/dist/_chunks/index-CdU1x9cZ.js.map +0 -1
  81. package/dist/_chunks/index-Ujtj1Rcp.js.map +0 -1
  82. package/dist/_chunks/index-lebOqdrv.mjs.map +0 -1
  83. package/dist/_chunks/router-BboD243b.js.map +0 -1
  84. package/dist/_chunks/router-CvMnSjb9.mjs.map +0 -1
  85. package/strapi-server.js +0 -3
  86. /package/dist/admin/src/routes/settings/{:id.d.ts → id.d.ts} +0 -0
@@ -8,17 +8,15 @@ 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-Ujtj1Rcp.js");
15
- const Layout = require("./Layout-BMqtFafC.js");
13
+ const index = require("./index-Nf1qO5tM.js");
14
+ const Layout = require("./Layout-DcZnQxp9.js");
16
15
  const reactDndHtml5Backend = require("react-dnd-html5-backend");
17
16
  const styledComponents = require("styled-components");
18
17
  const reactDnd = require("react-dnd");
19
18
  function _interopNamespace(e) {
20
- if (e && e.__esModule)
21
- return e;
19
+ if (e && e.__esModule) return e;
22
20
  const n = Object.create(null, { [Symbol.toStringTag]: { value: "Module" } });
23
21
  if (e) {
24
22
  for (const k in e) {
@@ -160,8 +158,7 @@ const useDragAndDrop = (active, {
160
158
  const hoverBoundingRect = objectRef.current?.getBoundingClientRect();
161
159
  const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;
162
160
  const clientOffset = monitor.getClientOffset();
163
- if (!clientOffset)
164
- return;
161
+ if (!clientOffset) return;
165
162
  const hoverClientY = clientOffset && clientOffset.y - hoverBoundingRect.top;
166
163
  if (typeof dragIndex === "number" && typeof newIndex === "number") {
167
164
  if (dragIndex === newIndex) {
@@ -214,10 +211,8 @@ const useDragAndDrop = (active, {
214
211
  const getDragDirection = (monitor) => {
215
212
  if (monitor && monitor.isDragging() && !monitor.didDrop() && monitor.getInitialClientOffset() && monitor.getClientOffset()) {
216
213
  const deltaY = monitor.getInitialClientOffset().y - monitor.getClientOffset().y;
217
- if (deltaY > 0)
218
- return DIRECTIONS.UPWARD;
219
- if (deltaY < 0)
220
- return DIRECTIONS.DOWNWARD;
214
+ if (deltaY > 0) return DIRECTIONS.UPWARD;
215
+ if (deltaY < 0) return DIRECTIONS.DOWNWARD;
221
216
  return null;
222
217
  }
223
218
  return null;
@@ -313,35 +308,23 @@ const Stages = ({ canDelete = true, canUpdate = true, isCreating }) => {
313
308
  left: "50%",
314
309
  position: "absolute",
315
310
  top: "0",
316
- width: 2,
317
- zIndex: 1
311
+ width: 2
318
312
  }
319
313
  ),
320
- /* @__PURE__ */ jsxRuntime.jsx(
321
- designSystem.Flex,
322
- {
323
- direction: "column",
324
- alignItems: "stretch",
325
- gap: 6,
326
- zIndex: 2,
327
- position: "relative",
328
- tag: "ol",
329
- children: stages.map((stage, index2) => {
330
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { tag: "li", children: /* @__PURE__ */ jsxRuntime.jsx(
331
- Stage,
332
- {
333
- index: index2,
334
- canDelete: stages.length > 1 && canDelete,
335
- canReorder: stages.length > 1,
336
- canUpdate,
337
- stagesCount: stages.length,
338
- defaultOpen: isCreating,
339
- ...stage
340
- }
341
- ) }, stage.__temp_key__);
342
- })
343
- }
344
- )
314
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, position: "relative", tag: "ol", children: stages.map((stage, index2) => {
315
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { tag: "li", children: /* @__PURE__ */ jsxRuntime.jsx(
316
+ Stage,
317
+ {
318
+ index: index2,
319
+ canDelete: stages.length > 1 && canDelete,
320
+ canReorder: stages.length > 1,
321
+ canUpdate,
322
+ stagesCount: stages.length,
323
+ defaultOpen: !stage.id,
324
+ ...stage
325
+ }
326
+ ) }, stage.__temp_key__);
327
+ }) })
345
328
  ] }),
346
329
  canUpdate && /* @__PURE__ */ jsxRuntime.jsx(
347
330
  AddStage,
@@ -458,7 +441,7 @@ const Stage = ({
458
441
  addFieldRow("stages", { name, color, permissions });
459
442
  };
460
443
  const id = React__namespace.useId();
461
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { ref: composedRef, children: [
444
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { ref: composedRef, shadow: "tableShadow", children: [
462
445
  liveText && /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
463
446
  isDragging ? /* @__PURE__ */ jsxRuntime.jsx(
464
447
  designSystem.Box,
@@ -509,7 +492,7 @@ const Stage = ({
509
492
  {
510
493
  background: "transparent",
511
494
  hasRadius: true,
512
- borderWidth: 0,
495
+ variant: "ghost",
513
496
  "data-handler-id": handlerId,
514
497
  ref: dragRef,
515
498
  label: formatMessage({
@@ -523,7 +506,7 @@ const Stage = ({
523
506
  )
524
507
  ] }) : null })
525
508
  ] }),
526
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid, { gap: 4, padding: 6, children: [
509
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, padding: 6, children: [
527
510
  {
528
511
  disabled: !canUpdate,
529
512
  label: formatMessage({
@@ -561,7 +544,7 @@ const Stage = ({
561
544
  size: 6,
562
545
  type: "permissions"
563
546
  }
564
- ].map(({ size, ...field }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: size, children: /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...field }) }, field.name)) }) })
547
+ ].map(({ size, ...field }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: size, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...field }) }, field.name)) }) })
565
548
  ] })
566
549
  }
567
550
  )
@@ -666,20 +649,22 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
666
649
  const { value = [], error, onChange } = strapiAdmin.useField(name);
667
650
  const allStages = strapiAdmin.useForm("PermissionsField", (state) => state.values.stages);
668
651
  const onFormValueChange = strapiAdmin.useForm("PermissionsField", (state) => state.onChange);
669
- const { data: roles = [], isLoading } = useGetAdminRolesQuery();
652
+ const rolesErrorCount = React__namespace.useRef(0);
653
+ const { data: roles = [], isLoading, error: getRolesError } = useGetAdminRolesQuery();
670
654
  const filteredRoles = roles?.filter((role) => role.code !== "strapi-super-admin") ?? [];
671
655
  React__namespace.useEffect(() => {
672
- if (!isLoading && roles.length === 0) {
656
+ if (!isLoading && getRolesError && "status" in getRolesError && getRolesError.status == 403 && rolesErrorCount.current === 0) {
657
+ rolesErrorCount.current = 1;
673
658
  toggleNotification({
674
659
  blockTransition: true,
675
660
  type: "danger",
676
661
  message: formatMessage({
677
662
  id: "review-workflows.stage.permissions.noPermissions.description",
678
- defaultMessage: "You don’t have the permission to see roles"
663
+ defaultMessage: "You don’t have the permission to see roles. Contact your administrator."
679
664
  })
680
665
  });
681
666
  }
682
- }, [formatMessage, isLoading, roles, toggleNotification]);
667
+ }, [formatMessage, isLoading, roles, toggleNotification, getRolesError]);
683
668
  if (!isLoading && filteredRoles.length === 0) {
684
669
  return /* @__PURE__ */ jsxRuntime.jsxs(
685
670
  designSystem.Field.Root,
@@ -713,45 +698,45 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
713
698
  }
714
699
  );
715
700
  }
716
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
717
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "flex-end", gap: 3, children: [
718
- /* @__PURE__ */ jsxRuntime.jsx(PermissionWrapper, { grow: 1, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error, name, required: true, children: [
719
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
720
- id: "Settings.review-workflows.stage.permissions.label",
721
- defaultMessage: "Roles that can change this stage"
722
- }) }),
723
- /* @__PURE__ */ jsxRuntime.jsx(
724
- designSystem.MultiSelect,
725
- {
726
- disabled,
727
- onChange: (values) => {
728
- const permissions = values.map((value2) => ({
729
- role: parseInt(value2, 10),
730
- action: "admin::review-workflows.stage.transition"
731
- }));
732
- onChange(name, permissions);
733
- },
734
- placeholder,
735
- value: value.map((permission) => `${permission.role}`),
736
- withTags: true,
737
- children: /* @__PURE__ */ jsxRuntime.jsx(
738
- designSystem.MultiSelectGroup,
739
- {
740
- label: formatMessage({
741
- id: "Settings.review-workflows.stage.permissions.allRoles.label",
742
- defaultMessage: "All roles"
743
- }),
744
- values: filteredRoles.map((r) => `${r.id}`),
745
- children: filteredRoles.map((role) => {
746
- return /* @__PURE__ */ jsxRuntime.jsx(NestedOption$1, { value: `${role.id}`, children: role.name }, role.id);
747
- })
748
- }
749
- )
750
- }
751
- ),
752
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Error, {})
753
- ] }) }),
701
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "flex-end", gap: 3, children: [
702
+ /* @__PURE__ */ jsxRuntime.jsx(PermissionWrapper, { grow: 1, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error, name, required: true, children: [
703
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
704
+ id: "Settings.review-workflows.stage.permissions.label",
705
+ defaultMessage: "Roles that can change this stage"
706
+ }) }),
754
707
  /* @__PURE__ */ jsxRuntime.jsx(
708
+ designSystem.MultiSelect,
709
+ {
710
+ disabled,
711
+ onChange: (values) => {
712
+ const permissions = values.map((value2) => ({
713
+ role: parseInt(value2, 10),
714
+ action: "admin::review-workflows.stage.transition"
715
+ }));
716
+ onChange(name, permissions);
717
+ },
718
+ placeholder,
719
+ value: value.map((permission) => `${permission.role}`),
720
+ withTags: true,
721
+ children: /* @__PURE__ */ jsxRuntime.jsx(
722
+ designSystem.MultiSelectGroup,
723
+ {
724
+ label: formatMessage({
725
+ id: "Settings.review-workflows.stage.permissions.allRoles.label",
726
+ defaultMessage: "All roles"
727
+ }),
728
+ values: filteredRoles.map((r) => `${r.id}`),
729
+ children: filteredRoles.map((role) => {
730
+ return /* @__PURE__ */ jsxRuntime.jsx(NestedOption$1, { value: `${role.id}`, children: role.name }, role.id);
731
+ })
732
+ }
733
+ )
734
+ }
735
+ ),
736
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Error, {})
737
+ ] }) }),
738
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Root, { open: isApplyAllConfirmationOpen, onOpenChange: setIsApplyAllConfirmationOpen, children: [
739
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
755
740
  designSystem.IconButton,
756
741
  {
757
742
  disabled,
@@ -760,42 +745,38 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
760
745
  defaultMessage: "Apply to all stages"
761
746
  }),
762
747
  size: "L",
763
- variant: "secondary",
764
- onClick: () => setIsApplyAllConfirmationOpen(true),
765
748
  children: /* @__PURE__ */ jsxRuntime.jsx(icons.Duplicate, {})
766
749
  }
750
+ ) }),
751
+ /* @__PURE__ */ jsxRuntime.jsx(
752
+ strapiAdmin.ConfirmDialog,
753
+ {
754
+ onConfirm: () => {
755
+ onFormValueChange(
756
+ "stages",
757
+ allStages.map((stage) => ({
758
+ ...stage,
759
+ permissions: value
760
+ }))
761
+ );
762
+ setIsApplyAllConfirmationOpen(false);
763
+ toggleNotification({
764
+ type: "success",
765
+ message: formatMessage({
766
+ id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success",
767
+ defaultMessage: "Applied roles to all other stages of the workflow"
768
+ })
769
+ });
770
+ },
771
+ variant: "default",
772
+ children: formatMessage({
773
+ id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy",
774
+ defaultMessage: "Roles that can change that stage will be applied to all the other stages."
775
+ })
776
+ }
767
777
  )
768
- ] }),
769
- /* @__PURE__ */ jsxRuntime.jsx(
770
- strapiAdmin.ConfirmDialog,
771
- {
772
- isOpen: isApplyAllConfirmationOpen,
773
- onClose: () => setIsApplyAllConfirmationOpen(false),
774
- onConfirm: () => {
775
- onFormValueChange(
776
- "stages",
777
- allStages.map((stage) => ({
778
- ...stage,
779
- permissions: value
780
- }))
781
- );
782
- setIsApplyAllConfirmationOpen(false);
783
- toggleNotification({
784
- type: "success",
785
- message: formatMessage({
786
- id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success",
787
- defaultMessage: "Applied roles to all other stages of the workflow"
788
- })
789
- });
790
- },
791
- variant: "default",
792
- children: formatMessage({
793
- id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy",
794
- defaultMessage: "Roles that can change that stage will be applied to all the other stages."
795
- })
796
- }
797
- )
798
- ] });
778
+ ] })
779
+ ] }) });
799
780
  };
800
781
  const NestedOption$1 = styledComponents.styled(designSystem.MultiSelectOption)`
801
782
  padding-left: ${({ theme }) => theme.spaces[7]};
@@ -807,8 +788,8 @@ const PermissionWrapper = styledComponents.styled(designSystem.Flex)`
807
788
  `;
808
789
  const WorkflowAttributes = ({ canUpdate = true }) => {
809
790
  const { formatMessage } = reactIntl.useIntl();
810
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Grid, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
811
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: 6, children: /* @__PURE__ */ jsxRuntime.jsx(
791
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Grid.Root, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
792
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(
812
793
  strapiAdmin.InputRenderer,
813
794
  {
814
795
  disabled: !canUpdate,
@@ -821,7 +802,8 @@ const WorkflowAttributes = ({ canUpdate = true }) => {
821
802
  type: "string"
822
803
  }
823
804
  ) }),
824
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: 6, children: /* @__PURE__ */ jsxRuntime.jsx(ContentTypesSelector, { disabled: !canUpdate }) })
805
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(ContentTypesSelector, { disabled: !canUpdate }) }),
806
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(StageSelector, { disabled: !canUpdate }) })
825
807
  ] });
826
808
  };
827
809
  const ContentTypesSelector = ({ disabled }) => {
@@ -925,15 +907,63 @@ const NestedOption = styledComponents.styled(designSystem.MultiSelectOption)`
925
907
  const ContentTypeTakeNotice = styledComponents.styled(designSystem.Typography)`
926
908
  font-style: italic;
927
909
  `;
910
+ const StageSelector = ({ disabled }) => {
911
+ const { value: stages = [] } = strapiAdmin.useField("stages");
912
+ const { formatMessage } = reactIntl.useIntl();
913
+ const { error, value, onChange } = strapiAdmin.useField("stageRequiredToPublish");
914
+ const validStages = stages.filter((stage) => stage.name);
915
+ return /* @__PURE__ */ jsxRuntime.jsxs(
916
+ designSystem.Field.Root,
917
+ {
918
+ error,
919
+ name: "stageRequiredToPublish",
920
+ hint: formatMessage({
921
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.hint",
922
+ defaultMessage: "Prevents entries from being published if they are not at the required stage."
923
+ }),
924
+ children: [
925
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
926
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.label",
927
+ defaultMessage: "Required stage for publishing"
928
+ }) }),
929
+ /* @__PURE__ */ jsxRuntime.jsxs(
930
+ designSystem.SingleSelect,
931
+ {
932
+ disabled,
933
+ onChange: (value2) => {
934
+ onChange("stageRequiredToPublish", value2);
935
+ },
936
+ value,
937
+ children: [
938
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "", children: formatMessage({
939
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.any",
940
+ defaultMessage: "Any stage"
941
+ }) }),
942
+ validStages.map((stage, i) => /* @__PURE__ */ jsxRuntime.jsx(
943
+ designSystem.SingleSelectOption,
944
+ {
945
+ value: stage.id?.toString() || stage.__temp_key__,
946
+ children: stage.name
947
+ },
948
+ `requiredToPublishStage-${stage.id || stage.__temp_key__}`
949
+ ))
950
+ ]
951
+ }
952
+ ),
953
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
954
+ ]
955
+ }
956
+ );
957
+ };
928
958
  const WORKFLOW_SCHEMA = yup__namespace.object({
929
959
  contentTypes: yup__namespace.array().of(yup__namespace.string()),
930
960
  name: yup__namespace.string().max(255, {
931
961
  id: "review-workflows.validation.name.max-length",
932
962
  defaultMessage: "Name can not be longer than 255 characters"
933
- }).required(),
963
+ }).required().nullable(),
934
964
  stages: yup__namespace.array().of(
935
965
  yup__namespace.object().shape({
936
- name: yup__namespace.string().required({
966
+ name: yup__namespace.string().nullable().required({
937
967
  id: "review-workflows.validation.stage.name",
938
968
  defaultMessage: "Name is required"
939
969
  }).max(255, {
@@ -950,7 +980,7 @@ const WORKFLOW_SCHEMA = yup__namespace.object({
950
980
  return stages.filter((stage) => stage.name === stageName).length === 1;
951
981
  }
952
982
  ),
953
- color: yup__namespace.string().required({
983
+ color: yup__namespace.string().nullable().required({
954
984
  id: "review-workflows.validation.stage.color",
955
985
  defaultMessage: "Color is required"
956
986
  }).matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
@@ -967,7 +997,8 @@ const WORKFLOW_SCHEMA = yup__namespace.object({
967
997
  })
968
998
  ).strict()
969
999
  })
970
- ).min(1)
1000
+ ).min(1),
1001
+ stageRequiredToPublish: yup__namespace.string().nullable()
971
1002
  });
972
1003
  const EditPage = () => {
973
1004
  const { id = "" } = reactRouterDom.useParams();
@@ -976,7 +1007,6 @@ const EditPage = () => {
976
1007
  const { _unstableFormatValidationErrors: formatValidationErrors } = strapiAdmin.useAPIErrorHandler();
977
1008
  const navigate = reactRouterDom.useNavigate();
978
1009
  const { toggleNotification } = strapiAdmin.useNotification();
979
- const dispatch = reactRedux.useDispatch();
980
1010
  const {
981
1011
  isLoading: isLoadingWorkflow,
982
1012
  meta,
@@ -984,7 +1014,7 @@ const EditPage = () => {
984
1014
  error,
985
1015
  update,
986
1016
  create
987
- } = Layout.useReviewWorkflows({ id: isCreatingWorkflow ? void 0 : id });
1017
+ } = Layout.useReviewWorkflows();
988
1018
  const permissions = index.useTypedSelector(
989
1019
  (state) => state.admin_app.permissions["settings"]?.["review-workflows"]
990
1020
  );
@@ -1001,13 +1031,17 @@ const EditPage = () => {
1001
1031
  const stagesPerWorkflow = limits?.[index.CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME];
1002
1032
  const submitForm = async (data, helpers) => {
1003
1033
  try {
1034
+ const { stageRequiredToPublish, ...rest } = data;
1035
+ const stageRequiredToPublishName = stageRequiredToPublish === "" ? null : rest.stages.find(
1036
+ (stage) => stage.id === Number(stageRequiredToPublish) || stage.__temp_key__ === stageRequiredToPublish
1037
+ )?.name;
1004
1038
  if (!isCreatingWorkflow) {
1005
1039
  const res = await update(id, {
1006
- ...data,
1040
+ ...rest,
1007
1041
  // compare permissions of stages and only submit them if at least one has
1008
1042
  // changed; this enables partial updates e.g. for users who don't have
1009
1043
  // permissions to see roles
1010
- stages: data.stages.map((stage) => {
1044
+ stages: rest.stages.map((stage) => {
1011
1045
  let hasUpdatedPermissions = true;
1012
1046
  const serverStage = currentWorkflow?.stages?.find(
1013
1047
  (serverStage2) => serverStage2.id === stage?.id
@@ -1023,40 +1057,21 @@ const EditPage = () => {
1023
1057
  ...stage,
1024
1058
  permissions: hasUpdatedPermissions ? stage.permissions : void 0
1025
1059
  };
1026
- })
1060
+ }),
1061
+ stageRequiredToPublishName
1027
1062
  });
1028
1063
  if ("error" in res && index.isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1029
1064
  helpers.setErrors(formatValidationErrors(res.error));
1030
- } else if ("data" in res) {
1031
- for (const uid of res.data.contentTypes) {
1032
- dispatch({
1033
- type: "contentManagerApi/invalidateTags",
1034
- payload: [
1035
- {
1036
- type: "ContentTypesConfiguration",
1037
- id: uid
1038
- }
1039
- ]
1040
- });
1041
- }
1042
1065
  }
1043
1066
  } else {
1044
- const res = await create(data);
1067
+ const res = await create({
1068
+ ...rest,
1069
+ stageRequiredToPublishName
1070
+ });
1045
1071
  if ("error" in res && index.isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1046
1072
  helpers.setErrors(formatValidationErrors(res.error));
1047
1073
  } else if ("data" in res) {
1048
- for (const uid of res.data.contentTypes) {
1049
- dispatch({
1050
- type: "contentManagerApi/invalidateTags",
1051
- payload: [
1052
- {
1053
- type: "ContentTypesConfiguration",
1054
- id: uid
1055
- }
1056
- ]
1057
- });
1058
- }
1059
- navigate(`../${res.data.id}`);
1074
+ navigate(`../${res.data.id}`, { replace: true });
1060
1075
  }
1061
1076
  }
1062
1077
  } catch (error2) {
@@ -1120,13 +1135,15 @@ const EditPage = () => {
1120
1135
  return {
1121
1136
  name: "",
1122
1137
  stages: [],
1123
- contentTypes: []
1138
+ contentTypes: [],
1139
+ stageRequiredToPublish: ""
1124
1140
  };
1125
1141
  } else {
1126
1142
  return {
1127
1143
  name: currentWorkflow.name,
1128
1144
  stages: addTmpKeysToStages(currentWorkflow.stages),
1129
- contentTypes: currentWorkflow.contentTypes
1145
+ contentTypes: currentWorkflow.contentTypes,
1146
+ stageRequiredToPublish: currentWorkflow.stageRequiredToPublish?.id.toString() ?? ""
1130
1147
  };
1131
1148
  }
1132
1149
  }, [currentWorkflow, isCreatingWorkflow]);
@@ -1149,13 +1166,12 @@ const EditPage = () => {
1149
1166
  /* @__PURE__ */ jsxRuntime.jsx(
1150
1167
  Layout.Header,
1151
1168
  {
1152
- navigationAction: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, {}),
1169
+ navigationAction: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, { fallback: ".." }),
1153
1170
  primaryAction: canUpdate || canCreate ? /* @__PURE__ */ jsxRuntime.jsx(
1154
1171
  designSystem.Button,
1155
1172
  {
1156
1173
  startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}),
1157
1174
  type: "submit",
1158
- size: "M",
1159
1175
  disabled: !modified || isSubmitting || values.stages.length === 0,
1160
1176
  loading: !Boolean(Object.keys(savePrompts).length > 0) && isSubmitting,
1161
1177
  children: formatMessage({
@@ -1178,23 +1194,22 @@ const EditPage = () => {
1178
1194
  }
1179
1195
  ),
1180
1196
  /* @__PURE__ */ jsxRuntime.jsx(Layout.Root, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "stretch", direction: "column", gap: 7, children: [
1181
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowAttributes, { canUpdate }),
1197
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowAttributes, { canUpdate: canUpdate || canCreate }),
1182
1198
  /* @__PURE__ */ jsxRuntime.jsx(
1183
1199
  Stages,
1184
1200
  {
1185
1201
  canDelete,
1186
- canUpdate,
1202
+ canUpdate: canUpdate || canCreate,
1187
1203
  isCreating: isCreatingWorkflow
1188
1204
  }
1189
1205
  )
1190
1206
  ] }) }),
1191
1207
  /* @__PURE__ */ jsxRuntime.jsx(
1192
- strapiAdmin.ConfirmDialog,
1208
+ designSystem.Dialog.Root,
1193
1209
  {
1194
- isOpen: Object.keys(savePrompts).length > 0,
1195
- onClose: handleConfirmClose,
1196
- onConfirm: handleConfirmDeleteDialog(values, { setErrors }),
1197
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 5, children: [
1210
+ open: Object.keys(savePrompts).length > 0,
1211
+ onOpenChange: handleConfirmClose,
1212
+ children: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.ConfirmDialog, { onConfirm: handleConfirmDeleteDialog(values, { setErrors }), children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 5, children: [
1198
1213
  savePrompts.hasDeletedServerStages && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", variant: "omega", children: formatMessage({
1199
1214
  id: "review-workflows.page.delete.confirm.stages.body",
1200
1215
  defaultMessage: "All entries assigned to deleted stages will be moved to the previous stage."
@@ -1206,7 +1221,7 @@ const EditPage = () => {
1206
1221
  },
1207
1222
  {
1208
1223
  count: contentTypesFromOtherWorkflows?.filter(
1209
- (contentType) => currentWorkflow?.contentTypes?.includes(contentType)
1224
+ (contentType) => values.contentTypes.includes(contentType)
1210
1225
  ).length ?? 0
1211
1226
  }
1212
1227
  ) }),
@@ -1214,7 +1229,7 @@ const EditPage = () => {
1214
1229
  id: "review-workflows.page.delete.confirm.confirm",
1215
1230
  defaultMessage: "Are you sure you want to save?"
1216
1231
  }) })
1217
- ] })
1232
+ ] }) })
1218
1233
  }
1219
1234
  )
1220
1235
  ] })
@@ -1223,8 +1238,8 @@ const EditPage = () => {
1223
1238
  /* @__PURE__ */ jsxRuntime.jsxs(
1224
1239
  index.LimitsModal.Root,
1225
1240
  {
1226
- isOpen: showLimitModal === "workflow",
1227
- onClose: () => setShowLimitModal(null),
1241
+ open: showLimitModal === "workflow",
1242
+ onOpenChange: () => setShowLimitModal(null),
1228
1243
  children: [
1229
1244
  /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Title, { children: formatMessage({
1230
1245
  id: "review-workflows.edit.page.workflows.limit.title",
@@ -1237,16 +1252,23 @@ const EditPage = () => {
1237
1252
  ]
1238
1253
  }
1239
1254
  ),
1240
- /* @__PURE__ */ jsxRuntime.jsxs(index.LimitsModal.Root, { isOpen: showLimitModal === "stage", onClose: () => setShowLimitModal(null), children: [
1241
- /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Title, { children: formatMessage({
1242
- id: "review-workflows.edit.page.stages.limit.title",
1243
- defaultMessage: "You have reached the limit of stages for this workflow in your plan"
1244
- }) }),
1245
- /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Body, { children: formatMessage({
1246
- id: "review-workflows.edit.page.stages.limit.body",
1247
- defaultMessage: "Try deleting some stages or contact Sales to enable more stages."
1248
- }) })
1249
- ] })
1255
+ /* @__PURE__ */ jsxRuntime.jsxs(
1256
+ index.LimitsModal.Root,
1257
+ {
1258
+ open: showLimitModal === "stage",
1259
+ onOpenChange: () => setShowLimitModal(null),
1260
+ children: [
1261
+ /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Title, { children: formatMessage({
1262
+ id: "review-workflows.edit.page.stages.limit.title",
1263
+ defaultMessage: "You have reached the limit of stages for this workflow in your plan"
1264
+ }) }),
1265
+ /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Body, { children: formatMessage({
1266
+ id: "review-workflows.edit.page.stages.limit.body",
1267
+ defaultMessage: "Try deleting some stages or contact Sales to enable more stages."
1268
+ }) })
1269
+ ]
1270
+ }
1271
+ )
1250
1272
  ] });
1251
1273
  };
1252
1274
  const addTmpKeysToStages = (data) => {
@@ -1268,4 +1290,4 @@ const ProtectedEditPage = () => {
1268
1290
  return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Protect, { permissions, children: /* @__PURE__ */ jsxRuntime.jsx(EditPage, {}) });
1269
1291
  };
1270
1292
  exports.ProtectedEditPage = ProtectedEditPage;
1271
- //# sourceMappingURL=_id-B853wt9z.js.map
1293
+ //# sourceMappingURL=id-BI6AAFQF.js.map