@strapi/review-workflows 0.0.0-experimental.7afdc9b682bc83a53ce599c4fb7c9e4506b31fff → 0.0.0-experimental.7bc5339b0393e53f9f568301594621e7fb466e2f

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 (88) hide show
  1. package/LICENSE +12 -17
  2. package/dist/_chunks/{Layout-BMqtFafC.js → Layout-DAfX35xh.js} +10 -12
  3. package/dist/_chunks/Layout-DAfX35xh.js.map +1 -0
  4. package/dist/_chunks/{Layout-lg3hbwGL.mjs → Layout-DTcaK6xT.mjs} +9 -10
  5. package/dist/_chunks/Layout-DTcaK6xT.mjs.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-CKzKf6TF.js} +202 -180
  11. package/dist/_chunks/id-CKzKf6TF.js.map +1 -0
  12. package/dist/_chunks/{_id-B3jMqqMH.mjs → id-CeWP_af0.mjs} +202 -179
  13. package/dist/_chunks/id-CeWP_af0.mjs.map +1 -0
  14. package/dist/_chunks/{index-Ujtj1Rcp.js → index-BsGVnBaL.js} +119 -104
  15. package/dist/_chunks/index-BsGVnBaL.js.map +1 -0
  16. package/dist/_chunks/{index-BhJmjDbj.mjs → index-Dv9tQUGq.mjs} +18 -47
  17. package/dist/_chunks/index-Dv9tQUGq.mjs.map +1 -0
  18. package/dist/_chunks/{index-lebOqdrv.mjs → index-DzQoUVQo.mjs} +120 -104
  19. package/dist/_chunks/index-DzQoUVQo.mjs.map +1 -0
  20. package/dist/_chunks/{index-CdU1x9cZ.js → index-bL6TS44K.js} +17 -47
  21. package/dist/_chunks/index-bL6TS44K.js.map +1 -0
  22. package/dist/_chunks/{purchase-review-workflows-DlCDg0fD.js → purchase-review-workflows-KiBiYXNZ.js} +2 -2
  23. package/dist/_chunks/{purchase-review-workflows-DlCDg0fD.js.map → purchase-review-workflows-KiBiYXNZ.js.map} +1 -1
  24. package/dist/_chunks/{purchase-review-workflows-BN-5Ube7.mjs → purchase-review-workflows-WyeSs4Y4.mjs} +2 -2
  25. package/dist/_chunks/{purchase-review-workflows-BN-5Ube7.mjs.map → purchase-review-workflows-WyeSs4Y4.mjs.map} +1 -1
  26. package/dist/_chunks/{router-CvMnSjb9.mjs → router-BUgAAtkq.mjs} +3 -3
  27. package/dist/_chunks/router-BUgAAtkq.mjs.map +1 -0
  28. package/dist/_chunks/{router-BboD243b.js → router-DOrCMw1R.js} +3 -3
  29. package/dist/_chunks/router-DOrCMw1R.js.map +1 -0
  30. package/dist/admin/index.js +1 -1
  31. package/dist/admin/index.mjs +1 -1
  32. package/dist/admin/src/components/LimitsModal.d.ts +2 -4
  33. package/dist/admin/src/services/admin.d.ts +1 -1
  34. package/dist/admin/src/services/api.d.ts +1 -1
  35. package/dist/admin/src/services/content-manager.d.ts +4 -4
  36. package/dist/admin/src/services/settings.d.ts +1739 -9
  37. package/dist/server/index.js +455 -628
  38. package/dist/server/index.js.map +1 -1
  39. package/dist/server/index.mjs +455 -628
  40. package/dist/server/index.mjs.map +1 -1
  41. package/dist/server/src/bootstrap.d.ts.map +1 -1
  42. package/dist/server/src/constants/workflows.d.ts +1 -0
  43. package/dist/server/src/constants/workflows.d.ts.map +1 -1
  44. package/dist/server/src/content-types/index.d.ts +6 -0
  45. package/dist/server/src/content-types/index.d.ts.map +1 -1
  46. package/dist/server/src/content-types/workflow/index.d.ts +6 -0
  47. package/dist/server/src/content-types/workflow/index.d.ts.map +1 -1
  48. package/dist/server/src/controllers/assignees.d.ts.map +1 -1
  49. package/dist/server/src/controllers/index.d.ts +0 -1
  50. package/dist/server/src/controllers/index.d.ts.map +1 -1
  51. package/dist/server/src/controllers/stages.d.ts.map +1 -1
  52. package/dist/server/src/controllers/workflows.d.ts +0 -7
  53. package/dist/server/src/controllers/workflows.d.ts.map +1 -1
  54. package/dist/server/src/index.d.ts +28 -7
  55. package/dist/server/src/index.d.ts.map +1 -1
  56. package/dist/server/src/register.d.ts.map +1 -1
  57. package/dist/server/src/routes/review-workflows.d.ts.map +1 -1
  58. package/dist/server/src/services/assignees.d.ts +8 -4
  59. package/dist/server/src/services/assignees.d.ts.map +1 -1
  60. package/dist/server/src/services/document-service-middleware.d.ts +1 -0
  61. package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
  62. package/dist/server/src/services/index.d.ts +16 -6
  63. package/dist/server/src/services/index.d.ts.map +1 -1
  64. package/dist/server/src/services/metrics/index.d.ts +4 -4
  65. package/dist/server/src/services/metrics/index.d.ts.map +1 -1
  66. package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
  67. package/dist/server/src/services/stages.d.ts +7 -7
  68. package/dist/server/src/services/stages.d.ts.map +1 -1
  69. package/dist/server/src/services/workflows.d.ts.map +1 -1
  70. package/dist/server/src/validation/review-workflows.d.ts +4 -0
  71. package/dist/server/src/validation/review-workflows.d.ts.map +1 -1
  72. package/dist/shared/contracts/review-workflows.d.ts +9 -17
  73. package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
  74. package/package.json +13 -13
  75. package/dist/_chunks/Layout-BMqtFafC.js.map +0 -1
  76. package/dist/_chunks/Layout-lg3hbwGL.mjs.map +0 -1
  77. package/dist/_chunks/_id-B3jMqqMH.mjs.map +0 -1
  78. package/dist/_chunks/_id-B853wt9z.js.map +0 -1
  79. package/dist/_chunks/en-D9ZrQAV6.mjs.map +0 -1
  80. package/dist/_chunks/en-xcewH2pC.js.map +0 -1
  81. package/dist/_chunks/index-BhJmjDbj.mjs.map +0 -1
  82. package/dist/_chunks/index-CdU1x9cZ.js.map +0 -1
  83. package/dist/_chunks/index-Ujtj1Rcp.js.map +0 -1
  84. package/dist/_chunks/index-lebOqdrv.mjs.map +0 -1
  85. package/dist/_chunks/router-BboD243b.js.map +0 -1
  86. package/dist/_chunks/router-CvMnSjb9.mjs.map +0 -1
  87. package/strapi-server.js +0 -3
  88. /package/dist/admin/src/routes/settings/{:id.d.ts → id.d.ts} +0 -0
@@ -2,15 +2,14 @@ import { jsx, jsxs, Fragment } from "react/jsx-runtime";
2
2
  import * as React from "react";
3
3
  import { useTracking, useForm, useField, InputRenderer as InputRenderer$1, useNotification, ConfirmDialog, Page, useAPIErrorHandler, useRBAC, Form, BackButton } from "@strapi/admin/strapi-admin";
4
4
  import { useLicenseLimits } from "@strapi/admin/strapi-admin/ee";
5
- import { Box, Typography, Flex, Accordion, MenuItem, Menu, MultiSelectOption, useComposedRefs, VisuallyHidden, IconButton, Grid, GridItem, Field, SingleSelect, SingleSelectOption, TextInput, MultiSelect, MultiSelectGroup, useCollator, Button } from "@strapi/design-system";
5
+ import { Box, Typography, Flex, Accordion, MenuItem, Menu, MultiSelectOption, useComposedRefs, VisuallyHidden, IconButton, Grid, Field, SingleSelect, SingleSelectOption, TextInput, MultiSelect, MultiSelectGroup, Dialog, useCollator, Button } from "@strapi/design-system";
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-lebOqdrv.mjs";
13
- import { D as DRAG_DROP_TYPES, u as useReviewWorkflows, a as DragLayerRendered, H as Header, R as Root } from "./Layout-lg3hbwGL.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-DzQoUVQo.mjs";
12
+ import { D as DRAG_DROP_TYPES, u as useReviewWorkflows, a as DragLayerRendered, H as Header, R as Root } from "./Layout-DTcaK6xT.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;
@@ -291,35 +287,23 @@ const Stages = ({ canDelete = true, canUpdate = true, isCreating }) => {
291
287
  left: "50%",
292
288
  position: "absolute",
293
289
  top: "0",
294
- width: 2,
295
- zIndex: 1
290
+ width: 2
296
291
  }
297
292
  ),
298
- /* @__PURE__ */ jsx(
299
- Flex,
300
- {
301
- direction: "column",
302
- alignItems: "stretch",
303
- gap: 6,
304
- zIndex: 2,
305
- position: "relative",
306
- tag: "ol",
307
- children: stages.map((stage, index) => {
308
- return /* @__PURE__ */ jsx(Box, { tag: "li", children: /* @__PURE__ */ jsx(
309
- Stage,
310
- {
311
- index,
312
- canDelete: stages.length > 1 && canDelete,
313
- canReorder: stages.length > 1,
314
- canUpdate,
315
- stagesCount: stages.length,
316
- defaultOpen: isCreating,
317
- ...stage
318
- }
319
- ) }, stage.__temp_key__);
320
- })
321
- }
322
- )
293
+ /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 6, position: "relative", tag: "ol", children: stages.map((stage, index) => {
294
+ return /* @__PURE__ */ jsx(Box, { tag: "li", children: /* @__PURE__ */ jsx(
295
+ Stage,
296
+ {
297
+ index,
298
+ canDelete: stages.length > 1 && canDelete,
299
+ canReorder: stages.length > 1,
300
+ canUpdate,
301
+ stagesCount: stages.length,
302
+ defaultOpen: !stage.id,
303
+ ...stage
304
+ }
305
+ ) }, stage.__temp_key__);
306
+ }) })
323
307
  ] }),
324
308
  canUpdate && /* @__PURE__ */ jsx(
325
309
  AddStage,
@@ -436,7 +420,7 @@ const Stage = ({
436
420
  addFieldRow("stages", { name, color, permissions });
437
421
  };
438
422
  const id = React.useId();
439
- return /* @__PURE__ */ jsxs(Box, { ref: composedRef, children: [
423
+ return /* @__PURE__ */ jsxs(Box, { ref: composedRef, shadow: "tableShadow", children: [
440
424
  liveText && /* @__PURE__ */ jsx(VisuallyHidden, { "aria-live": "assertive", children: liveText }),
441
425
  isDragging ? /* @__PURE__ */ jsx(
442
426
  Box,
@@ -487,7 +471,7 @@ const Stage = ({
487
471
  {
488
472
  background: "transparent",
489
473
  hasRadius: true,
490
- borderWidth: 0,
474
+ variant: "ghost",
491
475
  "data-handler-id": handlerId,
492
476
  ref: dragRef,
493
477
  label: formatMessage({
@@ -501,7 +485,7 @@ const Stage = ({
501
485
  )
502
486
  ] }) : null })
503
487
  ] }),
504
- /* @__PURE__ */ jsx(Accordion.Content, { children: /* @__PURE__ */ jsx(Grid, { gap: 4, padding: 6, children: [
488
+ /* @__PURE__ */ jsx(Accordion.Content, { children: /* @__PURE__ */ jsx(Grid.Root, { gap: 4, padding: 6, children: [
505
489
  {
506
490
  disabled: !canUpdate,
507
491
  label: formatMessage({
@@ -539,7 +523,7 @@ const Stage = ({
539
523
  size: 6,
540
524
  type: "permissions"
541
525
  }
542
- ].map(({ size, ...field }) => /* @__PURE__ */ jsx(GridItem, { 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)) }) })
543
527
  ] })
544
528
  }
545
529
  )
@@ -644,20 +628,22 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
644
628
  const { value = [], error, onChange } = useField(name);
645
629
  const allStages = useForm("PermissionsField", (state) => state.values.stages);
646
630
  const onFormValueChange = useForm("PermissionsField", (state) => state.onChange);
647
- const { data: roles = [], isLoading } = useGetAdminRolesQuery();
631
+ const rolesErrorCount = React.useRef(0);
632
+ const { data: roles = [], isLoading, error: getRolesError } = useGetAdminRolesQuery();
648
633
  const filteredRoles = roles?.filter((role) => role.code !== "strapi-super-admin") ?? [];
649
634
  React.useEffect(() => {
650
- if (!isLoading && roles.length === 0) {
635
+ if (!isLoading && getRolesError && "status" in getRolesError && getRolesError.status == 403 && rolesErrorCount.current === 0) {
636
+ rolesErrorCount.current = 1;
651
637
  toggleNotification({
652
638
  blockTransition: true,
653
639
  type: "danger",
654
640
  message: formatMessage({
655
641
  id: "review-workflows.stage.permissions.noPermissions.description",
656
- defaultMessage: "You don’t have the permission to see roles"
642
+ defaultMessage: "You don’t have the permission to see roles. Contact your administrator."
657
643
  })
658
644
  });
659
645
  }
660
- }, [formatMessage, isLoading, roles, toggleNotification]);
646
+ }, [formatMessage, isLoading, roles, toggleNotification, getRolesError]);
661
647
  if (!isLoading && filteredRoles.length === 0) {
662
648
  return /* @__PURE__ */ jsxs(
663
649
  Field.Root,
@@ -691,45 +677,45 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
691
677
  }
692
678
  );
693
679
  }
694
- return /* @__PURE__ */ jsxs(Fragment, { children: [
695
- /* @__PURE__ */ jsxs(Flex, { alignItems: "flex-end", gap: 3, children: [
696
- /* @__PURE__ */ jsx(PermissionWrapper, { grow: 1, children: /* @__PURE__ */ jsxs(Field.Root, { error, name, required: true, children: [
697
- /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
698
- id: "Settings.review-workflows.stage.permissions.label",
699
- defaultMessage: "Roles that can change this stage"
700
- }) }),
701
- /* @__PURE__ */ jsx(
702
- MultiSelect,
703
- {
704
- disabled,
705
- onChange: (values) => {
706
- const permissions = values.map((value2) => ({
707
- role: parseInt(value2, 10),
708
- action: "admin::review-workflows.stage.transition"
709
- }));
710
- onChange(name, permissions);
711
- },
712
- placeholder,
713
- value: value.map((permission) => `${permission.role}`),
714
- withTags: true,
715
- children: /* @__PURE__ */ jsx(
716
- MultiSelectGroup,
717
- {
718
- label: formatMessage({
719
- id: "Settings.review-workflows.stage.permissions.allRoles.label",
720
- defaultMessage: "All roles"
721
- }),
722
- values: filteredRoles.map((r) => `${r.id}`),
723
- children: filteredRoles.map((role) => {
724
- return /* @__PURE__ */ jsx(NestedOption$1, { value: `${role.id}`, children: role.name }, role.id);
725
- })
726
- }
727
- )
728
- }
729
- ),
730
- /* @__PURE__ */ jsx(Field.Error, {})
731
- ] }) }),
680
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Flex, { alignItems: "flex-end", gap: 3, children: [
681
+ /* @__PURE__ */ jsx(PermissionWrapper, { grow: 1, children: /* @__PURE__ */ jsxs(Field.Root, { error, name, required: true, children: [
682
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
683
+ id: "Settings.review-workflows.stage.permissions.label",
684
+ defaultMessage: "Roles that can change this stage"
685
+ }) }),
732
686
  /* @__PURE__ */ jsx(
687
+ MultiSelect,
688
+ {
689
+ disabled,
690
+ onChange: (values) => {
691
+ const permissions = values.map((value2) => ({
692
+ role: parseInt(value2, 10),
693
+ action: "admin::review-workflows.stage.transition"
694
+ }));
695
+ onChange(name, permissions);
696
+ },
697
+ placeholder,
698
+ value: value.map((permission) => `${permission.role}`),
699
+ withTags: true,
700
+ children: /* @__PURE__ */ jsx(
701
+ MultiSelectGroup,
702
+ {
703
+ label: formatMessage({
704
+ id: "Settings.review-workflows.stage.permissions.allRoles.label",
705
+ defaultMessage: "All roles"
706
+ }),
707
+ values: filteredRoles.map((r) => `${r.id}`),
708
+ children: filteredRoles.map((role) => {
709
+ return /* @__PURE__ */ jsx(NestedOption$1, { value: `${role.id}`, children: role.name }, role.id);
710
+ })
711
+ }
712
+ )
713
+ }
714
+ ),
715
+ /* @__PURE__ */ jsx(Field.Error, {})
716
+ ] }) }),
717
+ /* @__PURE__ */ jsxs(Dialog.Root, { open: isApplyAllConfirmationOpen, onOpenChange: setIsApplyAllConfirmationOpen, children: [
718
+ /* @__PURE__ */ jsx(Dialog.Trigger, { children: /* @__PURE__ */ jsx(
733
719
  IconButton,
734
720
  {
735
721
  disabled,
@@ -738,42 +724,38 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
738
724
  defaultMessage: "Apply to all stages"
739
725
  }),
740
726
  size: "L",
741
- variant: "secondary",
742
- onClick: () => setIsApplyAllConfirmationOpen(true),
743
727
  children: /* @__PURE__ */ jsx(Duplicate, {})
744
728
  }
729
+ ) }),
730
+ /* @__PURE__ */ jsx(
731
+ ConfirmDialog,
732
+ {
733
+ onConfirm: () => {
734
+ onFormValueChange(
735
+ "stages",
736
+ allStages.map((stage) => ({
737
+ ...stage,
738
+ permissions: value
739
+ }))
740
+ );
741
+ setIsApplyAllConfirmationOpen(false);
742
+ toggleNotification({
743
+ type: "success",
744
+ message: formatMessage({
745
+ id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success",
746
+ defaultMessage: "Applied roles to all other stages of the workflow"
747
+ })
748
+ });
749
+ },
750
+ variant: "default",
751
+ children: formatMessage({
752
+ id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy",
753
+ defaultMessage: "Roles that can change that stage will be applied to all the other stages."
754
+ })
755
+ }
745
756
  )
746
- ] }),
747
- /* @__PURE__ */ jsx(
748
- ConfirmDialog,
749
- {
750
- isOpen: isApplyAllConfirmationOpen,
751
- onClose: () => setIsApplyAllConfirmationOpen(false),
752
- onConfirm: () => {
753
- onFormValueChange(
754
- "stages",
755
- allStages.map((stage) => ({
756
- ...stage,
757
- permissions: value
758
- }))
759
- );
760
- setIsApplyAllConfirmationOpen(false);
761
- toggleNotification({
762
- type: "success",
763
- message: formatMessage({
764
- id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success",
765
- defaultMessage: "Applied roles to all other stages of the workflow"
766
- })
767
- });
768
- },
769
- variant: "default",
770
- children: formatMessage({
771
- id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy",
772
- defaultMessage: "Roles that can change that stage will be applied to all the other stages."
773
- })
774
- }
775
- )
776
- ] });
757
+ ] })
758
+ ] }) });
777
759
  };
778
760
  const NestedOption$1 = styled(MultiSelectOption)`
779
761
  padding-left: ${({ theme }) => theme.spaces[7]};
@@ -785,8 +767,8 @@ const PermissionWrapper = styled(Flex)`
785
767
  `;
786
768
  const WorkflowAttributes = ({ canUpdate = true }) => {
787
769
  const { formatMessage } = useIntl();
788
- return /* @__PURE__ */ jsxs(Grid, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
789
- /* @__PURE__ */ jsx(GridItem, { col: 6, children: /* @__PURE__ */ jsx(
770
+ return /* @__PURE__ */ jsxs(Grid.Root, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
771
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(
790
772
  InputRenderer$1,
791
773
  {
792
774
  disabled: !canUpdate,
@@ -799,7 +781,8 @@ const WorkflowAttributes = ({ canUpdate = true }) => {
799
781
  type: "string"
800
782
  }
801
783
  ) }),
802
- /* @__PURE__ */ jsx(GridItem, { 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 }) })
803
786
  ] });
804
787
  };
805
788
  const ContentTypesSelector = ({ disabled }) => {
@@ -903,15 +886,63 @@ const NestedOption = styled(MultiSelectOption)`
903
886
  const ContentTypeTakeNotice = styled(Typography)`
904
887
  font-style: italic;
905
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
+ };
906
937
  const WORKFLOW_SCHEMA = yup.object({
907
938
  contentTypes: yup.array().of(yup.string()),
908
939
  name: yup.string().max(255, {
909
940
  id: "review-workflows.validation.name.max-length",
910
941
  defaultMessage: "Name can not be longer than 255 characters"
911
- }).required(),
942
+ }).required().nullable(),
912
943
  stages: yup.array().of(
913
944
  yup.object().shape({
914
- name: yup.string().required({
945
+ name: yup.string().nullable().required({
915
946
  id: "review-workflows.validation.stage.name",
916
947
  defaultMessage: "Name is required"
917
948
  }).max(255, {
@@ -928,7 +959,7 @@ const WORKFLOW_SCHEMA = yup.object({
928
959
  return stages.filter((stage) => stage.name === stageName).length === 1;
929
960
  }
930
961
  ),
931
- color: yup.string().required({
962
+ color: yup.string().nullable().required({
932
963
  id: "review-workflows.validation.stage.color",
933
964
  defaultMessage: "Color is required"
934
965
  }).matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
@@ -945,7 +976,8 @@ const WORKFLOW_SCHEMA = yup.object({
945
976
  })
946
977
  ).strict()
947
978
  })
948
- ).min(1)
979
+ ).min(1),
980
+ stageRequiredToPublish: yup.string().nullable()
949
981
  });
950
982
  const EditPage = () => {
951
983
  const { id = "" } = useParams();
@@ -954,7 +986,6 @@ const EditPage = () => {
954
986
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
955
987
  const navigate = useNavigate();
956
988
  const { toggleNotification } = useNotification();
957
- const dispatch = useDispatch();
958
989
  const {
959
990
  isLoading: isLoadingWorkflow,
960
991
  meta,
@@ -962,7 +993,7 @@ const EditPage = () => {
962
993
  error,
963
994
  update,
964
995
  create
965
- } = useReviewWorkflows({ id: isCreatingWorkflow ? void 0 : id });
996
+ } = useReviewWorkflows();
966
997
  const permissions = useTypedSelector(
967
998
  (state) => state.admin_app.permissions["settings"]?.["review-workflows"]
968
999
  );
@@ -979,13 +1010,17 @@ const EditPage = () => {
979
1010
  const stagesPerWorkflow = limits?.[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME];
980
1011
  const submitForm = async (data, helpers) => {
981
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;
982
1017
  if (!isCreatingWorkflow) {
983
1018
  const res = await update(id, {
984
- ...data,
1019
+ ...rest,
985
1020
  // compare permissions of stages and only submit them if at least one has
986
1021
  // changed; this enables partial updates e.g. for users who don't have
987
1022
  // permissions to see roles
988
- stages: data.stages.map((stage) => {
1023
+ stages: rest.stages.map((stage) => {
989
1024
  let hasUpdatedPermissions = true;
990
1025
  const serverStage = currentWorkflow?.stages?.find(
991
1026
  (serverStage2) => serverStage2.id === stage?.id
@@ -1001,40 +1036,21 @@ const EditPage = () => {
1001
1036
  ...stage,
1002
1037
  permissions: hasUpdatedPermissions ? stage.permissions : void 0
1003
1038
  };
1004
- })
1039
+ }),
1040
+ stageRequiredToPublishName
1005
1041
  });
1006
1042
  if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1007
1043
  helpers.setErrors(formatValidationErrors(res.error));
1008
- } else if ("data" in res) {
1009
- for (const uid of res.data.contentTypes) {
1010
- dispatch({
1011
- type: "contentManagerApi/invalidateTags",
1012
- payload: [
1013
- {
1014
- type: "ContentTypesConfiguration",
1015
- id: uid
1016
- }
1017
- ]
1018
- });
1019
- }
1020
1044
  }
1021
1045
  } else {
1022
- const res = await create(data);
1046
+ const res = await create({
1047
+ ...rest,
1048
+ stageRequiredToPublishName
1049
+ });
1023
1050
  if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1024
1051
  helpers.setErrors(formatValidationErrors(res.error));
1025
1052
  } else if ("data" in res) {
1026
- for (const uid of res.data.contentTypes) {
1027
- dispatch({
1028
- type: "contentManagerApi/invalidateTags",
1029
- payload: [
1030
- {
1031
- type: "ContentTypesConfiguration",
1032
- id: uid
1033
- }
1034
- ]
1035
- });
1036
- }
1037
- navigate(`../${res.data.id}`);
1053
+ navigate(`../${res.data.id}`, { replace: true });
1038
1054
  }
1039
1055
  }
1040
1056
  } catch (error2) {
@@ -1098,13 +1114,15 @@ const EditPage = () => {
1098
1114
  return {
1099
1115
  name: "",
1100
1116
  stages: [],
1101
- contentTypes: []
1117
+ contentTypes: [],
1118
+ stageRequiredToPublish: ""
1102
1119
  };
1103
1120
  } else {
1104
1121
  return {
1105
1122
  name: currentWorkflow.name,
1106
1123
  stages: addTmpKeysToStages(currentWorkflow.stages),
1107
- contentTypes: currentWorkflow.contentTypes
1124
+ contentTypes: currentWorkflow.contentTypes,
1125
+ stageRequiredToPublish: currentWorkflow.stageRequiredToPublish?.id.toString() ?? ""
1108
1126
  };
1109
1127
  }
1110
1128
  }, [currentWorkflow, isCreatingWorkflow]);
@@ -1127,13 +1145,12 @@ const EditPage = () => {
1127
1145
  /* @__PURE__ */ jsx(
1128
1146
  Header,
1129
1147
  {
1130
- navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
1148
+ navigationAction: /* @__PURE__ */ jsx(BackButton, { fallback: ".." }),
1131
1149
  primaryAction: canUpdate || canCreate ? /* @__PURE__ */ jsx(
1132
1150
  Button,
1133
1151
  {
1134
1152
  startIcon: /* @__PURE__ */ jsx(Check, {}),
1135
1153
  type: "submit",
1136
- size: "M",
1137
1154
  disabled: !modified || isSubmitting || values.stages.length === 0,
1138
1155
  loading: !Boolean(Object.keys(savePrompts).length > 0) && isSubmitting,
1139
1156
  children: formatMessage({
@@ -1156,23 +1173,22 @@ const EditPage = () => {
1156
1173
  }
1157
1174
  ),
1158
1175
  /* @__PURE__ */ jsx(Root, { children: /* @__PURE__ */ jsxs(Flex, { alignItems: "stretch", direction: "column", gap: 7, children: [
1159
- /* @__PURE__ */ jsx(WorkflowAttributes, { canUpdate }),
1176
+ /* @__PURE__ */ jsx(WorkflowAttributes, { canUpdate: canUpdate || canCreate }),
1160
1177
  /* @__PURE__ */ jsx(
1161
1178
  Stages,
1162
1179
  {
1163
1180
  canDelete,
1164
- canUpdate,
1181
+ canUpdate: canUpdate || canCreate,
1165
1182
  isCreating: isCreatingWorkflow
1166
1183
  }
1167
1184
  )
1168
1185
  ] }) }),
1169
1186
  /* @__PURE__ */ jsx(
1170
- ConfirmDialog,
1187
+ Dialog.Root,
1171
1188
  {
1172
- isOpen: Object.keys(savePrompts).length > 0,
1173
- onClose: handleConfirmClose,
1174
- onConfirm: handleConfirmDeleteDialog(values, { setErrors }),
1175
- children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 5, children: [
1189
+ open: Object.keys(savePrompts).length > 0,
1190
+ onOpenChange: handleConfirmClose,
1191
+ children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleConfirmDeleteDialog(values, { setErrors }), children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 5, children: [
1176
1192
  savePrompts.hasDeletedServerStages && /* @__PURE__ */ jsx(Typography, { textAlign: "center", variant: "omega", children: formatMessage({
1177
1193
  id: "review-workflows.page.delete.confirm.stages.body",
1178
1194
  defaultMessage: "All entries assigned to deleted stages will be moved to the previous stage."
@@ -1184,7 +1200,7 @@ const EditPage = () => {
1184
1200
  },
1185
1201
  {
1186
1202
  count: contentTypesFromOtherWorkflows?.filter(
1187
- (contentType) => currentWorkflow?.contentTypes?.includes(contentType)
1203
+ (contentType) => values.contentTypes.includes(contentType)
1188
1204
  ).length ?? 0
1189
1205
  }
1190
1206
  ) }),
@@ -1192,7 +1208,7 @@ const EditPage = () => {
1192
1208
  id: "review-workflows.page.delete.confirm.confirm",
1193
1209
  defaultMessage: "Are you sure you want to save?"
1194
1210
  }) })
1195
- ] })
1211
+ ] }) })
1196
1212
  }
1197
1213
  )
1198
1214
  ] })
@@ -1201,8 +1217,8 @@ const EditPage = () => {
1201
1217
  /* @__PURE__ */ jsxs(
1202
1218
  LimitsModal.Root,
1203
1219
  {
1204
- isOpen: showLimitModal === "workflow",
1205
- onClose: () => setShowLimitModal(null),
1220
+ open: showLimitModal === "workflow",
1221
+ onOpenChange: () => setShowLimitModal(null),
1206
1222
  children: [
1207
1223
  /* @__PURE__ */ jsx(LimitsModal.Title, { children: formatMessage({
1208
1224
  id: "review-workflows.edit.page.workflows.limit.title",
@@ -1215,16 +1231,23 @@ const EditPage = () => {
1215
1231
  ]
1216
1232
  }
1217
1233
  ),
1218
- /* @__PURE__ */ jsxs(LimitsModal.Root, { isOpen: showLimitModal === "stage", onClose: () => setShowLimitModal(null), children: [
1219
- /* @__PURE__ */ jsx(LimitsModal.Title, { children: formatMessage({
1220
- id: "review-workflows.edit.page.stages.limit.title",
1221
- defaultMessage: "You have reached the limit of stages for this workflow in your plan"
1222
- }) }),
1223
- /* @__PURE__ */ jsx(LimitsModal.Body, { children: formatMessage({
1224
- id: "review-workflows.edit.page.stages.limit.body",
1225
- defaultMessage: "Try deleting some stages or contact Sales to enable more stages."
1226
- }) })
1227
- ] })
1234
+ /* @__PURE__ */ jsxs(
1235
+ LimitsModal.Root,
1236
+ {
1237
+ open: showLimitModal === "stage",
1238
+ onOpenChange: () => setShowLimitModal(null),
1239
+ children: [
1240
+ /* @__PURE__ */ jsx(LimitsModal.Title, { children: formatMessage({
1241
+ id: "review-workflows.edit.page.stages.limit.title",
1242
+ defaultMessage: "You have reached the limit of stages for this workflow in your plan"
1243
+ }) }),
1244
+ /* @__PURE__ */ jsx(LimitsModal.Body, { children: formatMessage({
1245
+ id: "review-workflows.edit.page.stages.limit.body",
1246
+ defaultMessage: "Try deleting some stages or contact Sales to enable more stages."
1247
+ }) })
1248
+ ]
1249
+ }
1250
+ )
1228
1251
  ] });
1229
1252
  };
1230
1253
  const addTmpKeysToStages = (data) => {
@@ -1248,4 +1271,4 @@ const ProtectedEditPage = () => {
1248
1271
  export {
1249
1272
  ProtectedEditPage
1250
1273
  };
1251
- //# sourceMappingURL=_id-B3jMqqMH.mjs.map
1274
+ //# sourceMappingURL=id-CeWP_af0.mjs.map