@strapi/review-workflows 0.0.0-experimental.e60ec1829240dae21c1e1d29076681c322288813 → 0.0.0-experimental.eba25ec571b091c6bde1104eb6c753debdf15462

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-BSrg0PBJ.mjs → Layout-DU1Rt4Mu.mjs} +11 -18
  3. package/dist/_chunks/Layout-DU1Rt4Mu.mjs.map +1 -0
  4. package/dist/_chunks/{Layout-BemsgaWF.js → Layout-ywt0cSLq.js} +11 -20
  5. package/dist/_chunks/Layout-ywt0cSLq.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-DO302-GM.mjs → id-MDQVDdXD.mjs} +381 -375
  11. package/dist/_chunks/id-MDQVDdXD.mjs.map +1 -0
  12. package/dist/_chunks/{_id-BDSg16su.js → id-StiN3nkI.js} +385 -381
  13. package/dist/_chunks/id-StiN3nkI.js.map +1 -0
  14. package/dist/_chunks/{index-7V_6cgRk.mjs → index-BRmc4tbQ.mjs} +185 -226
  15. package/dist/_chunks/index-BRmc4tbQ.mjs.map +1 -0
  16. package/dist/_chunks/{index-BIHOhXvS.js → index-BSsDJNiQ.js} +182 -225
  17. package/dist/_chunks/index-BSsDJNiQ.js.map +1 -0
  18. package/dist/_chunks/{index-u8XaKwOw.mjs → index-CsOMMJ--.mjs} +22 -49
  19. package/dist/_chunks/index-CsOMMJ--.mjs.map +1 -0
  20. package/dist/_chunks/{index-DV2HXfsG.js → index-dc2WfugK.js} +20 -49
  21. package/dist/_chunks/index-dc2WfugK.js.map +1 -0
  22. package/dist/_chunks/{router-BtE6OQHw.js → router-C5QvEzrI.js} +3 -3
  23. package/dist/_chunks/router-C5QvEzrI.js.map +1 -0
  24. package/dist/_chunks/{router-BdBbXIaZ.mjs → router-CZH4yq9s.mjs} +3 -3
  25. package/dist/_chunks/router-CZH4yq9s.mjs.map +1 -0
  26. package/dist/admin/index.js +1 -1
  27. package/dist/admin/index.mjs +1 -1
  28. package/dist/admin/src/components/LimitsModal.d.ts +2 -4
  29. package/dist/admin/src/routes/settings/hooks/useDragAndDrop.d.ts +4 -4
  30. package/dist/admin/src/routes/settings/hooks/useKeyboardDragAndDrop.d.ts +1 -1
  31. package/dist/admin/src/routes/settings/hooks/useReviewWorkflows.d.ts +3 -3
  32. package/dist/admin/src/services/admin.d.ts +2 -2
  33. package/dist/admin/src/services/api.d.ts +2 -3
  34. package/dist/admin/src/services/content-manager.d.ts +6 -6
  35. package/dist/admin/src/services/settings.d.ts +1740 -10
  36. package/dist/admin/src/utils/api.d.ts +4 -19
  37. package/dist/server/index.js +180 -108
  38. package/dist/server/index.js.map +1 -1
  39. package/dist/server/index.mjs +180 -108
  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 +17 -18
  75. package/dist/_chunks/Layout-BSrg0PBJ.mjs.map +0 -1
  76. package/dist/_chunks/Layout-BemsgaWF.js.map +0 -1
  77. package/dist/_chunks/_id-BDSg16su.js.map +0 -1
  78. package/dist/_chunks/_id-DO302-GM.mjs.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-7V_6cgRk.mjs.map +0 -1
  82. package/dist/_chunks/index-BIHOhXvS.js.map +0 -1
  83. package/dist/_chunks/index-DV2HXfsG.js.map +0 -1
  84. package/dist/_chunks/index-u8XaKwOw.mjs.map +0 -1
  85. package/dist/_chunks/router-BdBbXIaZ.mjs.map +0 -1
  86. package/dist/_chunks/router-BtE6OQHw.js.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,22 +2,21 @@ 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, MenuItem, Menu, IconButton, MultiSelectOption, useComposedRefs, VisuallyHidden, Accordion, AccordionToggle, AccordionContent, Grid, GridItem, SingleSelect, SingleSelectOption, TextInput, MultiSelect, MultiSelectGroup, useCollator, Button } from "@strapi/design-system";
6
- import { PlusCircle, EyeStriked, More, Drag, Duplicate, Check } from "@strapi/icons";
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
+ 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-7V_6cgRk.mjs";
13
- import { D as DRAG_DROP_TYPES, u as useReviewWorkflows, a as DragLayerRendered, H as Header, R as Root } from "./Layout-BSrg0PBJ.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-BRmc4tbQ.mjs";
12
+ import { D as DRAG_DROP_TYPES, u as useReviewWorkflows, a as DragLayerRendered, H as Header, R as Root } from "./Layout-DU1Rt4Mu.mjs";
14
13
  import { getEmptyImage } from "react-dnd-html5-backend";
15
- import styled from "styled-components";
14
+ import { styled } from "styled-components";
16
15
  import { useDrop, useDrag } from "react-dnd";
17
16
  const adminApi = reviewWorkflowsApi.injectEndpoints({
18
17
  endpoints(builder) {
19
18
  return {
20
- getRoles: builder.query({
19
+ getAdminRoles: builder.query({
21
20
  query: () => ({
22
21
  url: `/admin/roles`,
23
22
  method: "GET"
@@ -29,7 +28,7 @@ const adminApi = reviewWorkflowsApi.injectEndpoints({
29
28
  };
30
29
  }
31
30
  });
32
- const { useGetRolesQuery } = adminApi;
31
+ const { useGetAdminRolesQuery } = adminApi;
33
32
  const useKeyboardDragAndDrop = (active, index, { onCancel, onDropItem, onGrabItem, onMoveItem }) => {
34
33
  const [isSelected, setIsSelected] = React.useState(false);
35
34
  const handleMove = (movement) => {
@@ -248,16 +247,16 @@ const AddStage = ({ children, ...props }) => {
248
247
  return /* @__PURE__ */ jsx(
249
248
  StyledButton,
250
249
  {
251
- as: "button",
250
+ tag: "button",
252
251
  background: "neutral0",
253
- border: "neutral150",
252
+ borderColor: "neutral150",
254
253
  paddingBottom: 3,
255
254
  paddingLeft: 4,
256
255
  paddingRight: 4,
257
256
  paddingTop: 3,
258
257
  shadow: "filterShadow",
259
258
  ...props,
260
- children: /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", textColor: "inherit", children: /* @__PURE__ */ jsxs(Flex, { as: "span", gap: 2, children: [
259
+ children: /* @__PURE__ */ jsx(Typography, { variant: "pi", fontWeight: "bold", children: /* @__PURE__ */ jsxs(Flex, { tag: "span", gap: 2, children: [
261
260
  /* @__PURE__ */ jsx(PlusCircle, { width: "2.4rem", height: "2.4rem", "aria-hidden": true }),
262
261
  children
263
262
  ] }) })
@@ -276,7 +275,7 @@ const StyledButton = styled(Box)`
276
275
  color: ${({ theme }) => theme.colors.primary600};
277
276
  }
278
277
  `;
279
- const Stages = ({ canDelete = true, canUpdate = true, isCreating = false }) => {
278
+ const Stages = ({ canDelete = true, canUpdate = true, isCreating }) => {
280
279
  const { formatMessage } = useIntl();
281
280
  const { trackUsage } = useTracking();
282
281
  const addFieldRow = useForm("Stages", (state) => state.addFieldRow);
@@ -291,35 +290,23 @@ const Stages = ({ canDelete = true, canUpdate = true, isCreating = false }) => {
291
290
  left: "50%",
292
291
  position: "absolute",
293
292
  top: "0",
294
- width: 2,
295
- zIndex: 1
293
+ width: 2
296
294
  }
297
295
  ),
298
- /* @__PURE__ */ jsx(
299
- Flex,
300
- {
301
- direction: "column",
302
- alignItems: "stretch",
303
- gap: 6,
304
- zIndex: 2,
305
- position: "relative",
306
- as: "ol",
307
- children: stages.map((stage, index) => {
308
- return /* @__PURE__ */ jsx(Box, { as: "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
- isOpen: isCreating,
317
- ...stage
318
- }
319
- ) }, stage.__temp_key__);
320
- })
321
- }
322
- )
296
+ /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 6, position: "relative", tag: "ol", children: stages.map((stage, index) => {
297
+ return /* @__PURE__ */ jsx(Box, { tag: "li", children: /* @__PURE__ */ jsx(
298
+ Stage,
299
+ {
300
+ index,
301
+ canDelete: stages.length > 1 && canDelete,
302
+ canReorder: stages.length > 1,
303
+ canUpdate,
304
+ stagesCount: stages.length,
305
+ defaultOpen: !stage.id,
306
+ ...stage
307
+ }
308
+ ) }, stage.__temp_key__);
309
+ }) })
323
310
  ] }),
324
311
  canUpdate && /* @__PURE__ */ jsx(
325
312
  AddStage,
@@ -345,16 +332,15 @@ const Stage = ({
345
332
  canDelete = false,
346
333
  canReorder = false,
347
334
  canUpdate = false,
348
- isOpen: isOpenDefault = false,
349
335
  stagesCount,
350
336
  name,
351
337
  permissions,
352
- color
338
+ color,
339
+ defaultOpen
353
340
  }) => {
354
341
  const [liveText, setLiveText] = React.useState();
355
342
  const { formatMessage } = useIntl();
356
343
  const { trackUsage } = useTracking();
357
- const [isOpen, setIsOpen] = React.useState(isOpenDefault);
358
344
  const stageErrors = useForm("Stages", (state) => state.errors.stages);
359
345
  const error = stageErrors?.[index];
360
346
  const addFieldRow = useForm("Stage", (state) => state.addFieldRow);
@@ -436,7 +422,8 @@ const Stage = ({
436
422
  const handleCloneClick = () => {
437
423
  addFieldRow("stages", { name, color, permissions });
438
424
  };
439
- return /* @__PURE__ */ jsxs(Box, { ref: (ref) => composedRef(ref), children: [
425
+ const id = React.useId();
426
+ return /* @__PURE__ */ jsxs(Box, { ref: composedRef, shadow: "tableShadow", children: [
440
427
  liveText && /* @__PURE__ */ jsx(VisuallyHidden, { "aria-live": "assertive", children: liveText }),
441
428
  isDragging ? /* @__PURE__ */ jsx(
442
429
  Box,
@@ -447,74 +434,61 @@ const Stage = ({
447
434
  borderWidth: "1px",
448
435
  display: "block",
449
436
  hasRadius: true,
450
- padding: 6,
451
- shadow: "tableShadow"
437
+ padding: 6
452
438
  }
453
- ) : /* @__PURE__ */ jsxs(
454
- Accordion,
439
+ ) : /* @__PURE__ */ jsx(
440
+ AccordionRoot,
455
441
  {
456
- size: "S",
457
- variant: "primary",
458
- onToggle: () => {
459
- setIsOpen(!isOpen);
460
- if (!isOpen) {
442
+ onValueChange: (value) => {
443
+ if (value) {
461
444
  trackUsage("willEditStage");
462
445
  }
463
446
  },
464
- expanded: isOpen,
465
- shadow: "tableShadow",
466
- error: Object.values(error ?? {})[0],
467
- hasErrorMessage: false,
468
- children: [
469
- /* @__PURE__ */ jsx(
470
- AccordionToggle,
471
- {
472
- title: name,
473
- togglePosition: "left",
474
- action: (canDelete || canUpdate) && /* @__PURE__ */ jsxs(Flex, { children: [
475
- /* @__PURE__ */ jsxs(Menu.Root, { children: [
476
- /* @__PURE__ */ jsxs(ContextMenuTrigger, { size: "S", endIcon: null, paddingLeft: 2, paddingRight: 2, children: [
477
- /* @__PURE__ */ jsx(More, { "aria-hidden": true, focusable: false }),
478
- /* @__PURE__ */ jsx(VisuallyHidden, { as: "span", children: formatMessage({
479
- id: "[tbdb].components.DynamicZone.more-actions",
480
- defaultMessage: "More actions"
481
- }) })
482
- ] }),
483
- /* @__PURE__ */ jsx(Menu.Content, { popoverPlacement: "bottom-end", zIndex: 2, children: /* @__PURE__ */ jsxs(Menu.SubRoot, { children: [
484
- canUpdate && /* @__PURE__ */ jsx(MenuItem, { onClick: handleCloneClick, children: formatMessage({
485
- id: "Settings.review-workflows.stage.delete",
486
- defaultMessage: "Duplicate stage"
487
- }) }),
488
- canDelete && /* @__PURE__ */ jsx(DeleteMenuItem, { onClick: () => removeFieldRow("stages", index), children: formatMessage({
489
- id: "Settings.review-workflows.stage.delete",
490
- defaultMessage: "Delete"
491
- }) })
492
- ] }) })
447
+ defaultValue: defaultOpen ? id : void 0,
448
+ $error: Object.values(error ?? {}).length > 0,
449
+ children: /* @__PURE__ */ jsxs(Accordion.Item, { value: id, children: [
450
+ /* @__PURE__ */ jsxs(Accordion.Header, { children: [
451
+ /* @__PURE__ */ jsx(Accordion.Trigger, { children: name }),
452
+ /* @__PURE__ */ jsx(Accordion.Actions, { children: canDelete || canUpdate ? /* @__PURE__ */ jsxs(Fragment, { children: [
453
+ /* @__PURE__ */ jsxs(Menu.Root, { children: [
454
+ /* @__PURE__ */ jsxs(ContextMenuTrigger, { size: "S", endIcon: null, paddingLeft: 2, paddingRight: 2, children: [
455
+ /* @__PURE__ */ jsx(More, { "aria-hidden": true, focusable: false }),
456
+ /* @__PURE__ */ jsx(VisuallyHidden, { tag: "span", children: formatMessage({
457
+ id: "[tbdb].components.DynamicZone.more-actions",
458
+ defaultMessage: "More actions"
459
+ }) })
493
460
  ] }),
494
- canUpdate && /* @__PURE__ */ jsx(
495
- DragIconButton,
496
- {
497
- background: "transparent",
498
- forwardedAs: "div",
499
- hasRadius: true,
500
- role: "button",
501
- noBorder: true,
502
- tabIndex: 0,
503
- "data-handler-id": handlerId,
504
- ref: dragRef,
505
- label: formatMessage({
506
- id: "Settings.review-workflows.stage.drag",
507
- defaultMessage: "Drag"
508
- }),
509
- onClick: (e) => e.stopPropagation(),
510
- onKeyDown: handleKeyDown,
511
- children: /* @__PURE__ */ jsx(Drag, {})
512
- }
513
- )
514
- ] })
515
- }
516
- ),
517
- /* @__PURE__ */ jsx(AccordionContent, { padding: 6, background: "neutral0", hasRadius: true, children: /* @__PURE__ */ jsx(Grid, { gap: 4, children: [
461
+ /* @__PURE__ */ jsx(Menu.Content, { popoverPlacement: "bottom-end", zIndex: 2, children: /* @__PURE__ */ jsxs(Menu.SubRoot, { children: [
462
+ canUpdate && /* @__PURE__ */ jsx(MenuItem, { onClick: handleCloneClick, children: formatMessage({
463
+ id: "Settings.review-workflows.stage.delete",
464
+ defaultMessage: "Duplicate stage"
465
+ }) }),
466
+ canDelete && /* @__PURE__ */ jsx(DeleteMenuItem, { onClick: () => removeFieldRow("stages", index), children: formatMessage({
467
+ id: "Settings.review-workflows.stage.delete",
468
+ defaultMessage: "Delete"
469
+ }) })
470
+ ] }) })
471
+ ] }),
472
+ canUpdate && /* @__PURE__ */ jsx(
473
+ IconButton,
474
+ {
475
+ background: "transparent",
476
+ hasRadius: true,
477
+ variant: "ghost",
478
+ "data-handler-id": handlerId,
479
+ ref: dragRef,
480
+ label: formatMessage({
481
+ id: "Settings.review-workflows.stage.drag",
482
+ defaultMessage: "Drag"
483
+ }),
484
+ onClick: (e) => e.stopPropagation(),
485
+ onKeyDown: handleKeyDown,
486
+ children: /* @__PURE__ */ jsx(Drag, {})
487
+ }
488
+ )
489
+ ] }) : null })
490
+ ] }),
491
+ /* @__PURE__ */ jsx(Accordion.Content, { children: /* @__PURE__ */ jsx(Grid.Root, { gap: 4, padding: 6, children: [
518
492
  {
519
493
  disabled: !canUpdate,
520
494
  label: formatMessage({
@@ -552,12 +526,16 @@ const Stage = ({
552
526
  size: 6,
553
527
  type: "permissions"
554
528
  }
555
- ].map(({ size, ...field }) => /* @__PURE__ */ jsx(GridItem, { col: size, children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name)) }) })
556
- ]
529
+ ].map(({ size, ...field }) => /* @__PURE__ */ jsx(Grid.Item, { col: size, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name)) }) })
530
+ ] })
557
531
  }
558
532
  )
559
533
  ] });
560
534
  };
535
+ const AccordionRoot = styled(Accordion.Root)`
536
+ border: 1px solid
537
+ ${({ theme, $error }) => $error ? theme.colors.danger600 : theme.colors.neutral200};
538
+ `;
561
539
  const DeleteMenuItem = styled(MenuItem)`
562
540
  color: ${({ theme }) => theme.colors.danger600};
563
541
  `;
@@ -571,22 +549,6 @@ const ContextMenuTrigger = styled(Menu.Trigger)`
571
549
  font-size: 0;
572
550
  }
573
551
  `;
574
- const DragIconButton = styled(IconButton)`
575
- align-items: center;
576
- border-radius: ${({ theme }) => theme.borderRadius};
577
- display: flex;
578
- justify-content: center;
579
-
580
- &:hover,
581
- &:focus {
582
- background-color: ${({ theme }) => theme.colors.neutral100};
583
- }
584
-
585
- svg {
586
- height: auto;
587
- width: ${({ theme }) => theme.spaces[3]};
588
- }
589
- `;
590
552
  const InputRenderer = (props) => {
591
553
  switch (props.type) {
592
554
  case "color":
@@ -612,54 +574,55 @@ const ColorSelector = ({ disabled, label, name, required }) => {
612
574
  color: hex
613
575
  }));
614
576
  const { themeColorName } = getStageColorByHex(value) ?? {};
615
- return /* @__PURE__ */ jsx(
616
- SingleSelect,
617
- {
618
- disabled,
619
- error,
620
- required,
621
- label,
622
- onChange: (v) => {
623
- onChange(name, v.toString());
624
- },
625
- value: value?.toUpperCase(),
626
- startIcon: /* @__PURE__ */ jsx(
627
- Flex,
628
- {
629
- as: "span",
630
- height: 2,
631
- background: value,
632
- borderColor: themeColorName === "neutral0" ? "neutral150" : "transparent",
633
- hasRadius: true,
634
- shrink: 0,
635
- width: 2
636
- }
637
- ),
638
- children: colorOptions.map(({ value: value2, label: label2, color }) => {
639
- const { themeColorName: themeColorName2 } = getStageColorByHex(color) || {};
640
- return /* @__PURE__ */ jsx(
641
- SingleSelectOption,
577
+ return /* @__PURE__ */ jsxs(Field.Root, { error, name, required, children: [
578
+ /* @__PURE__ */ jsx(Field.Label, { children: label }),
579
+ /* @__PURE__ */ jsx(
580
+ SingleSelect,
581
+ {
582
+ disabled,
583
+ onChange: (v) => {
584
+ onChange(name, v.toString());
585
+ },
586
+ value: value?.toUpperCase(),
587
+ startIcon: /* @__PURE__ */ jsx(
588
+ Flex,
642
589
  {
643
- value: value2,
644
- startIcon: /* @__PURE__ */ jsx(
645
- Flex,
646
- {
647
- as: "span",
648
- height: 2,
649
- background: color,
650
- borderColor: themeColorName2 === "neutral0" ? "neutral150" : "transparent",
651
- hasRadius: true,
652
- shrink: 0,
653
- width: 2
654
- }
655
- ),
656
- children: label2
657
- },
658
- value2
659
- );
660
- })
661
- }
662
- );
590
+ tag: "span",
591
+ height: 2,
592
+ background: value,
593
+ borderColor: themeColorName === "neutral0" ? "neutral150" : "transparent",
594
+ hasRadius: true,
595
+ shrink: 0,
596
+ width: 2
597
+ }
598
+ ),
599
+ children: colorOptions.map(({ value: value2, label: label2, color }) => {
600
+ const { themeColorName: themeColorName2 } = getStageColorByHex(color) || {};
601
+ return /* @__PURE__ */ jsx(
602
+ SingleSelectOption,
603
+ {
604
+ value: value2,
605
+ startIcon: /* @__PURE__ */ jsx(
606
+ Flex,
607
+ {
608
+ tag: "span",
609
+ height: 2,
610
+ background: color,
611
+ borderColor: themeColorName2 === "neutral0" ? "neutral150" : "transparent",
612
+ hasRadius: true,
613
+ shrink: 0,
614
+ width: 2
615
+ }
616
+ ),
617
+ children: label2
618
+ },
619
+ value2
620
+ );
621
+ })
622
+ }
623
+ ),
624
+ /* @__PURE__ */ jsx(Field.Error, {})
625
+ ] });
663
626
  };
664
627
  const PermissionsField = ({ disabled, name, placeholder, required }) => {
665
628
  const { formatMessage } = useIntl();
@@ -668,57 +631,65 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
668
631
  const { value = [], error, onChange } = useField(name);
669
632
  const allStages = useForm("PermissionsField", (state) => state.values.stages);
670
633
  const onFormValueChange = useForm("PermissionsField", (state) => state.onChange);
671
- const { data: roles = [], isLoading } = useGetRolesQuery();
634
+ const rolesErrorCount = React.useRef(0);
635
+ const { data: roles = [], isLoading, error: getRolesError } = useGetAdminRolesQuery();
672
636
  const filteredRoles = roles?.filter((role) => role.code !== "strapi-super-admin") ?? [];
673
637
  React.useEffect(() => {
674
- if (!isLoading && roles.length === 0) {
638
+ if (!isLoading && getRolesError && "status" in getRolesError && getRolesError.status == 403 && rolesErrorCount.current === 0) {
639
+ rolesErrorCount.current = 1;
675
640
  toggleNotification({
676
641
  blockTransition: true,
677
642
  type: "danger",
678
643
  message: formatMessage({
679
644
  id: "review-workflows.stage.permissions.noPermissions.description",
680
- defaultMessage: "You don’t have the permission to see roles"
645
+ defaultMessage: "You don’t have the permission to see roles. Contact your administrator."
681
646
  })
682
647
  });
683
648
  }
684
- }, [formatMessage, isLoading, roles, toggleNotification]);
649
+ }, [formatMessage, isLoading, roles, toggleNotification, getRolesError]);
685
650
  if (!isLoading && filteredRoles.length === 0) {
686
- return /* @__PURE__ */ jsx(
687
- TextInput,
651
+ return /* @__PURE__ */ jsxs(
652
+ Field.Root,
688
653
  {
689
- disabled: true,
690
654
  name,
691
655
  hint: formatMessage({
692
656
  id: "Settings.review-workflows.stage.permissions.noPermissions.description",
693
657
  defaultMessage: "You don’t have the permission to see roles"
694
658
  }),
695
- label: formatMessage({
696
- id: "Settings.review-workflows.stage.permissions.label",
697
- defaultMessage: "Roles that can change this stage"
698
- }),
699
- placeholder: formatMessage({
700
- id: "components.NotAllowedInput.text",
701
- defaultMessage: "No permissions to see this field"
702
- }),
703
659
  required,
704
- startAction: /* @__PURE__ */ jsx(StyledIcon, {}),
705
- type: "text",
706
- value: ""
660
+ children: [
661
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
662
+ id: "Settings.review-workflows.stage.permissions.label",
663
+ defaultMessage: "Roles that can change this stage"
664
+ }) }),
665
+ /* @__PURE__ */ jsx(
666
+ TextInput,
667
+ {
668
+ disabled: true,
669
+ placeholder: formatMessage({
670
+ id: "components.NotAllowedInput.text",
671
+ defaultMessage: "No permissions to see this field"
672
+ }),
673
+ startAction: /* @__PURE__ */ jsx(EyeStriked, { fill: "neutral600" }),
674
+ type: "text",
675
+ value: ""
676
+ }
677
+ ),
678
+ /* @__PURE__ */ jsx(Field.Hint, {})
679
+ ]
707
680
  }
708
681
  );
709
682
  }
710
- return /* @__PURE__ */ jsxs(Fragment, { children: [
711
- /* @__PURE__ */ jsxs(Flex, { alignItems: "flex-end", gap: 3, children: [
712
- /* @__PURE__ */ jsx(PermissionWrapper, { grow: 1, children: /* @__PURE__ */ jsx(
683
+ return /* @__PURE__ */ jsx(Fragment, { children: /* @__PURE__ */ jsxs(Flex, { alignItems: "flex-end", gap: 3, children: [
684
+ /* @__PURE__ */ jsx(PermissionWrapper, { grow: 1, children: /* @__PURE__ */ jsxs(Field.Root, { error, name, required: true, children: [
685
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
686
+ id: "Settings.review-workflows.stage.permissions.label",
687
+ defaultMessage: "Roles that can change this stage"
688
+ }) }),
689
+ /* @__PURE__ */ jsx(
713
690
  MultiSelect,
714
691
  {
715
692
  disabled,
716
- error,
717
- id: name,
718
- label: formatMessage({
719
- id: "Settings.review-workflows.stage.permissions.label",
720
- defaultMessage: "Roles that can change this stage"
721
- }),
722
693
  onChange: (values) => {
723
694
  const permissions = values.map((value2) => ({
724
695
  role: parseInt(value2, 10),
@@ -727,7 +698,6 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
727
698
  onChange(name, permissions);
728
699
  },
729
700
  placeholder,
730
- required: true,
731
701
  value: value.map((permission) => `${permission.role}`),
732
702
  withTags: true,
733
703
  children: /* @__PURE__ */ jsx(
@@ -744,58 +714,52 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
744
714
  }
745
715
  )
746
716
  }
747
- ) }),
748
- /* @__PURE__ */ jsx(
717
+ ),
718
+ /* @__PURE__ */ jsx(Field.Error, {})
719
+ ] }) }),
720
+ /* @__PURE__ */ jsxs(Dialog.Root, { open: isApplyAllConfirmationOpen, onOpenChange: setIsApplyAllConfirmationOpen, children: [
721
+ /* @__PURE__ */ jsx(Dialog.Trigger, { children: /* @__PURE__ */ jsx(
749
722
  IconButton,
750
723
  {
751
724
  disabled,
752
- icon: /* @__PURE__ */ jsx(Duplicate, {}),
753
725
  label: formatMessage({
754
726
  id: "Settings.review-workflows.stage.permissions.apply.label",
755
727
  defaultMessage: "Apply to all stages"
756
728
  }),
757
729
  size: "L",
758
- variant: "secondary",
759
- onClick: () => setIsApplyAllConfirmationOpen(true)
730
+ children: /* @__PURE__ */ jsx(Duplicate, {})
731
+ }
732
+ ) }),
733
+ /* @__PURE__ */ jsx(
734
+ ConfirmDialog,
735
+ {
736
+ onConfirm: () => {
737
+ onFormValueChange(
738
+ "stages",
739
+ allStages.map((stage) => ({
740
+ ...stage,
741
+ permissions: value
742
+ }))
743
+ );
744
+ setIsApplyAllConfirmationOpen(false);
745
+ toggleNotification({
746
+ type: "success",
747
+ message: formatMessage({
748
+ id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success",
749
+ defaultMessage: "Applied roles to all other stages of the workflow"
750
+ })
751
+ });
752
+ },
753
+ variant: "default",
754
+ children: formatMessage({
755
+ id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy",
756
+ defaultMessage: "Roles that can change that stage will be applied to all the other stages."
757
+ })
760
758
  }
761
759
  )
762
- ] }),
763
- /* @__PURE__ */ jsx(
764
- ConfirmDialog,
765
- {
766
- isOpen: isApplyAllConfirmationOpen,
767
- onClose: () => setIsApplyAllConfirmationOpen(false),
768
- onConfirm: () => {
769
- onFormValueChange(
770
- "stages",
771
- allStages.map((stage) => ({
772
- ...stage,
773
- permissions: value
774
- }))
775
- );
776
- setIsApplyAllConfirmationOpen(false);
777
- toggleNotification({
778
- type: "success",
779
- message: formatMessage({
780
- id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success",
781
- defaultMessage: "Applied roles to all other stages of the workflow"
782
- })
783
- });
784
- },
785
- variant: "default",
786
- children: formatMessage({
787
- id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy",
788
- defaultMessage: "Roles that can change that stage will be applied to all the other stages."
789
- })
790
- }
791
- )
792
- ] });
760
+ ] })
761
+ ] }) });
793
762
  };
794
- const StyledIcon = styled(EyeStriked)`
795
- & > path {
796
- fill: ${({ theme }) => theme.colors.neutral600};
797
- }
798
- `;
799
763
  const NestedOption$1 = styled(MultiSelectOption)`
800
764
  padding-left: ${({ theme }) => theme.spaces[7]};
801
765
  `;
@@ -806,8 +770,8 @@ const PermissionWrapper = styled(Flex)`
806
770
  `;
807
771
  const WorkflowAttributes = ({ canUpdate = true }) => {
808
772
  const { formatMessage } = useIntl();
809
- return /* @__PURE__ */ jsxs(Grid, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
810
- /* @__PURE__ */ jsx(GridItem, { col: 6, children: /* @__PURE__ */ jsx(
773
+ return /* @__PURE__ */ jsxs(Grid.Root, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
774
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(
811
775
  InputRenderer$1,
812
776
  {
813
777
  disabled: !canUpdate,
@@ -820,7 +784,8 @@ const WorkflowAttributes = ({ canUpdate = true }) => {
820
784
  type: "string"
821
785
  }
822
786
  ) }),
823
- /* @__PURE__ */ jsx(GridItem, { col: 6, children: /* @__PURE__ */ jsx(ContentTypesSelector, { disabled: !canUpdate }) })
787
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(ContentTypesSelector, { disabled: !canUpdate }) }),
788
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(StageSelector, { disabled: !canUpdate }) })
824
789
  ] });
825
790
  };
826
791
  const ContentTypesSelector = ({ disabled }) => {
@@ -841,81 +806,82 @@ const ContentTypesSelector = ({ disabled }) => {
841
806
  label: contentType.info.displayName,
842
807
  value: contentType.uid
843
808
  }));
844
- return /* @__PURE__ */ jsx(
845
- MultiSelect,
846
- {
847
- customizeContent: (value2) => formatMessage(
848
- {
849
- id: "Settings.review-workflows.workflow.contentTypes.displayValue",
850
- defaultMessage: "{count} {count, plural, one {content type} other {content types}} selected"
851
- },
852
- { count: value2?.length }
853
- ),
854
- disabled: isDisabled,
855
- error,
856
- label: formatMessage({
857
- id: "Settings.review-workflows.workflow.contentTypes.label",
858
- defaultMessage: "Associated to"
859
- }),
860
- onChange: (values) => {
861
- onChange("contentTypes", values);
862
- },
863
- value,
864
- placeholder: formatMessage({
865
- id: "Settings.review-workflows.workflow.contentTypes.placeholder",
866
- defaultMessage: "Select"
867
- }),
868
- children: [
869
- ...collectionTypes.length > 0 ? [
870
- {
871
- label: formatMessage({
872
- id: "Settings.review-workflows.workflow.contentTypes.collectionTypes.label",
873
- defaultMessage: "Collection Types"
874
- }),
875
- children: collectionTypes
876
- }
877
- ] : [],
878
- ...singleTypes.length > 0 ? [
879
- {
880
- label: formatMessage({
881
- id: "Settings.review-workflows.workflow.contentTypes.singleTypes.label",
882
- defaultMessage: "Single Types"
883
- }),
884
- children: singleTypes
885
- }
886
- ] : []
887
- ].map((opt) => {
888
- return /* @__PURE__ */ jsx(
889
- MultiSelectGroup,
809
+ return /* @__PURE__ */ jsxs(Field.Root, { error, name: "contentTypes", children: [
810
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
811
+ id: "Settings.review-workflows.workflow.contentTypes.label",
812
+ defaultMessage: "Associated to"
813
+ }) }),
814
+ /* @__PURE__ */ jsx(
815
+ MultiSelect,
816
+ {
817
+ customizeContent: (value2) => formatMessage(
890
818
  {
891
- label: opt.label,
892
- values: opt.children.map((child) => child.value.toString()),
893
- children: opt.children.map((child) => {
894
- const { name: assignedWorkflowName } = workflows?.find(
895
- (workflow) => (currentWorkflow && workflow.id !== currentWorkflow.id || !currentWorkflow) && workflow.contentTypes.includes(child.value)
896
- ) ?? {};
897
- return /* @__PURE__ */ jsx(NestedOption, { value: child.value, children: /* @__PURE__ */ jsx(Typography, {
898
- // @ts-expect-error - formatMessage options doesn't expect to be a React component but that's what we need actually for the <i> and <em> components
899
- children: formatMessage(
900
- {
901
- id: "Settings.review-workflows.workflow.contentTypes.assigned.notice",
902
- defaultMessage: "{label} {name, select, undefined {} other {<i>(assigned to <em>{name}</em> workflow)</i>}}"
903
- },
904
- {
905
- label: child.label,
906
- name: assignedWorkflowName,
907
- em: (...children) => /* @__PURE__ */ jsx(Typography, { as: "em", fontWeight: "bold", children }),
908
- i: (...children) => /* @__PURE__ */ jsx(ContentTypeTakeNotice, { children })
909
- }
910
- )
911
- }) }, child.value);
912
- })
819
+ id: "Settings.review-workflows.workflow.contentTypes.displayValue",
820
+ defaultMessage: "{count} {count, plural, one {content type} other {content types}} selected"
913
821
  },
914
- opt.label
915
- );
916
- })
917
- }
918
- );
822
+ { count: value2?.length }
823
+ ),
824
+ disabled: isDisabled,
825
+ onChange: (values) => {
826
+ onChange("contentTypes", values);
827
+ },
828
+ value,
829
+ placeholder: formatMessage({
830
+ id: "Settings.review-workflows.workflow.contentTypes.placeholder",
831
+ defaultMessage: "Select"
832
+ }),
833
+ children: [
834
+ ...collectionTypes.length > 0 ? [
835
+ {
836
+ label: formatMessage({
837
+ id: "Settings.review-workflows.workflow.contentTypes.collectionTypes.label",
838
+ defaultMessage: "Collection Types"
839
+ }),
840
+ children: collectionTypes
841
+ }
842
+ ] : [],
843
+ ...singleTypes.length > 0 ? [
844
+ {
845
+ label: formatMessage({
846
+ id: "Settings.review-workflows.workflow.contentTypes.singleTypes.label",
847
+ defaultMessage: "Single Types"
848
+ }),
849
+ children: singleTypes
850
+ }
851
+ ] : []
852
+ ].map((opt) => {
853
+ return /* @__PURE__ */ jsx(
854
+ MultiSelectGroup,
855
+ {
856
+ label: opt.label,
857
+ values: opt.children.map((child) => child.value.toString()),
858
+ children: opt.children.map((child) => {
859
+ const { name: assignedWorkflowName } = workflows?.find(
860
+ (workflow) => (currentWorkflow && workflow.id !== currentWorkflow.id || !currentWorkflow) && workflow.contentTypes.includes(child.value)
861
+ ) ?? {};
862
+ return /* @__PURE__ */ jsx(NestedOption, { value: child.value, children: /* @__PURE__ */ jsx(Typography, {
863
+ // @ts-expect-error - formatMessage options doesn't expect to be a React component but that's what we need actually for the <i> and <em> components
864
+ children: formatMessage(
865
+ {
866
+ id: "Settings.review-workflows.workflow.contentTypes.assigned.notice",
867
+ defaultMessage: "{label} {name, select, undefined {} other {<i>(assigned to <em>{name}</em> workflow)</i>}}"
868
+ },
869
+ {
870
+ label: child.label,
871
+ name: assignedWorkflowName,
872
+ em: (...children) => /* @__PURE__ */ jsx(Typography, { tag: "em", fontWeight: "bold", children }),
873
+ i: (...children) => /* @__PURE__ */ jsx(ContentTypeTakeNotice, { children })
874
+ }
875
+ )
876
+ }) }, child.value);
877
+ })
878
+ },
879
+ opt.label
880
+ );
881
+ })
882
+ }
883
+ )
884
+ ] });
919
885
  };
920
886
  const NestedOption = styled(MultiSelectOption)`
921
887
  padding-left: ${({ theme }) => theme.spaces[7]};
@@ -923,15 +889,63 @@ const NestedOption = styled(MultiSelectOption)`
923
889
  const ContentTypeTakeNotice = styled(Typography)`
924
890
  font-style: italic;
925
891
  `;
892
+ const StageSelector = ({ disabled }) => {
893
+ const { value: stages = [] } = useField("stages");
894
+ const { formatMessage } = useIntl();
895
+ const { error, value, onChange } = useField("stageRequiredToPublish");
896
+ const validStages = stages.filter((stage) => stage.name);
897
+ return /* @__PURE__ */ jsxs(
898
+ Field.Root,
899
+ {
900
+ error,
901
+ name: "stageRequiredToPublish",
902
+ hint: formatMessage({
903
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.hint",
904
+ defaultMessage: "Prevents entries from being published if they are not at the required stage."
905
+ }),
906
+ children: [
907
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
908
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.label",
909
+ defaultMessage: "Required stage for publishing"
910
+ }) }),
911
+ /* @__PURE__ */ jsxs(
912
+ SingleSelect,
913
+ {
914
+ disabled,
915
+ onChange: (value2) => {
916
+ onChange("stageRequiredToPublish", value2);
917
+ },
918
+ value,
919
+ children: [
920
+ /* @__PURE__ */ jsx(SingleSelectOption, { value: "", children: formatMessage({
921
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.any",
922
+ defaultMessage: "Any stage"
923
+ }) }),
924
+ validStages.map((stage, i) => /* @__PURE__ */ jsx(
925
+ SingleSelectOption,
926
+ {
927
+ value: stage.id?.toString() || stage.__temp_key__,
928
+ children: stage.name
929
+ },
930
+ `requiredToPublishStage-${stage.id || stage.__temp_key__}`
931
+ ))
932
+ ]
933
+ }
934
+ ),
935
+ /* @__PURE__ */ jsx(Field.Hint, {})
936
+ ]
937
+ }
938
+ );
939
+ };
926
940
  const WORKFLOW_SCHEMA = yup.object({
927
941
  contentTypes: yup.array().of(yup.string()),
928
942
  name: yup.string().max(255, {
929
943
  id: "review-workflows.validation.name.max-length",
930
944
  defaultMessage: "Name can not be longer than 255 characters"
931
- }).required(),
945
+ }).required().nullable(),
932
946
  stages: yup.array().of(
933
947
  yup.object().shape({
934
- name: yup.string().required({
948
+ name: yup.string().nullable().required({
935
949
  id: "review-workflows.validation.stage.name",
936
950
  defaultMessage: "Name is required"
937
951
  }).max(255, {
@@ -948,7 +962,7 @@ const WORKFLOW_SCHEMA = yup.object({
948
962
  return stages.filter((stage) => stage.name === stageName).length === 1;
949
963
  }
950
964
  ),
951
- color: yup.string().required({
965
+ color: yup.string().nullable().required({
952
966
  id: "review-workflows.validation.stage.color",
953
967
  defaultMessage: "Color is required"
954
968
  }).matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
@@ -965,7 +979,8 @@ const WORKFLOW_SCHEMA = yup.object({
965
979
  })
966
980
  ).strict()
967
981
  })
968
- ).min(1)
982
+ ).min(1),
983
+ stageRequiredToPublish: yup.string().nullable()
969
984
  });
970
985
  const EditPage = () => {
971
986
  const { id = "" } = useParams();
@@ -974,7 +989,6 @@ const EditPage = () => {
974
989
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
975
990
  const navigate = useNavigate();
976
991
  const { toggleNotification } = useNotification();
977
- const dispatch = useDispatch();
978
992
  const {
979
993
  isLoading: isLoadingWorkflow,
980
994
  meta,
@@ -982,7 +996,7 @@ const EditPage = () => {
982
996
  error,
983
997
  update,
984
998
  create
985
- } = useReviewWorkflows({ id: isCreatingWorkflow ? void 0 : id });
999
+ } = useReviewWorkflows();
986
1000
  const permissions = useTypedSelector(
987
1001
  (state) => state.admin_app.permissions["settings"]?.["review-workflows"]
988
1002
  );
@@ -999,13 +1013,17 @@ const EditPage = () => {
999
1013
  const stagesPerWorkflow = limits?.[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME];
1000
1014
  const submitForm = async (data, helpers) => {
1001
1015
  try {
1016
+ const { stageRequiredToPublish, ...rest } = data;
1017
+ const stageRequiredToPublishName = stageRequiredToPublish === "" ? null : rest.stages.find(
1018
+ (stage) => stage.id === Number(stageRequiredToPublish) || stage.__temp_key__ === stageRequiredToPublish
1019
+ )?.name;
1002
1020
  if (!isCreatingWorkflow) {
1003
1021
  const res = await update(id, {
1004
- ...data,
1022
+ ...rest,
1005
1023
  // compare permissions of stages and only submit them if at least one has
1006
1024
  // changed; this enables partial updates e.g. for users who don't have
1007
1025
  // permissions to see roles
1008
- stages: data.stages.map((stage) => {
1026
+ stages: rest.stages.map((stage) => {
1009
1027
  let hasUpdatedPermissions = true;
1010
1028
  const serverStage = currentWorkflow?.stages?.find(
1011
1029
  (serverStage2) => serverStage2.id === stage?.id
@@ -1021,40 +1039,21 @@ const EditPage = () => {
1021
1039
  ...stage,
1022
1040
  permissions: hasUpdatedPermissions ? stage.permissions : void 0
1023
1041
  };
1024
- })
1042
+ }),
1043
+ stageRequiredToPublishName
1025
1044
  });
1026
1045
  if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1027
1046
  helpers.setErrors(formatValidationErrors(res.error));
1028
- } else if ("data" in res) {
1029
- for (const uid of res.data.contentTypes) {
1030
- dispatch({
1031
- type: "contentManagerApi/invalidateTags",
1032
- payload: [
1033
- {
1034
- type: "ContentTypesConfiguration",
1035
- id: uid
1036
- }
1037
- ]
1038
- });
1039
- }
1040
1047
  }
1041
1048
  } else {
1042
- const res = await create(data);
1049
+ const res = await create({
1050
+ ...rest,
1051
+ stageRequiredToPublishName
1052
+ });
1043
1053
  if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1044
1054
  helpers.setErrors(formatValidationErrors(res.error));
1045
1055
  } else if ("data" in res) {
1046
- for (const uid of res.data.contentTypes) {
1047
- dispatch({
1048
- type: "contentManagerApi/invalidateTags",
1049
- payload: [
1050
- {
1051
- type: "ContentTypesConfiguration",
1052
- id: uid
1053
- }
1054
- ]
1055
- });
1056
- }
1057
- navigate(`../${res.data.id}`);
1056
+ navigate(`../${res.data.id}`, { replace: true });
1058
1057
  }
1059
1058
  }
1060
1059
  } catch (error2) {
@@ -1118,13 +1117,15 @@ const EditPage = () => {
1118
1117
  return {
1119
1118
  name: "",
1120
1119
  stages: [],
1121
- contentTypes: []
1120
+ contentTypes: [],
1121
+ stageRequiredToPublish: ""
1122
1122
  };
1123
1123
  } else {
1124
1124
  return {
1125
1125
  name: currentWorkflow.name,
1126
1126
  stages: addTmpKeysToStages(currentWorkflow.stages),
1127
- contentTypes: currentWorkflow.contentTypes
1127
+ contentTypes: currentWorkflow.contentTypes,
1128
+ stageRequiredToPublish: currentWorkflow.stageRequiredToPublish?.id.toString() ?? ""
1128
1129
  };
1129
1130
  }
1130
1131
  }, [currentWorkflow, isCreatingWorkflow]);
@@ -1147,13 +1148,12 @@ const EditPage = () => {
1147
1148
  /* @__PURE__ */ jsx(
1148
1149
  Header,
1149
1150
  {
1150
- navigationAction: /* @__PURE__ */ jsx(BackButton, {}),
1151
+ navigationAction: /* @__PURE__ */ jsx(BackButton, { fallback: ".." }),
1151
1152
  primaryAction: canUpdate || canCreate ? /* @__PURE__ */ jsx(
1152
1153
  Button,
1153
1154
  {
1154
1155
  startIcon: /* @__PURE__ */ jsx(Check, {}),
1155
1156
  type: "submit",
1156
- size: "M",
1157
1157
  disabled: !modified || isSubmitting || values.stages.length === 0,
1158
1158
  loading: !Boolean(Object.keys(savePrompts).length > 0) && isSubmitting,
1159
1159
  children: formatMessage({
@@ -1176,23 +1176,22 @@ const EditPage = () => {
1176
1176
  }
1177
1177
  ),
1178
1178
  /* @__PURE__ */ jsx(Root, { children: /* @__PURE__ */ jsxs(Flex, { alignItems: "stretch", direction: "column", gap: 7, children: [
1179
- /* @__PURE__ */ jsx(WorkflowAttributes, { canUpdate }),
1179
+ /* @__PURE__ */ jsx(WorkflowAttributes, { canUpdate: canUpdate || canCreate }),
1180
1180
  /* @__PURE__ */ jsx(
1181
1181
  Stages,
1182
1182
  {
1183
1183
  canDelete,
1184
- canUpdate,
1184
+ canUpdate: canUpdate || canCreate,
1185
1185
  isCreating: isCreatingWorkflow
1186
1186
  }
1187
1187
  )
1188
1188
  ] }) }),
1189
1189
  /* @__PURE__ */ jsx(
1190
- ConfirmDialog,
1190
+ Dialog.Root,
1191
1191
  {
1192
- isOpen: Object.keys(savePrompts).length > 0,
1193
- onClose: handleConfirmClose,
1194
- onConfirm: handleConfirmDeleteDialog(values, { setErrors }),
1195
- children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 5, children: [
1192
+ open: Object.keys(savePrompts).length > 0,
1193
+ onOpenChange: handleConfirmClose,
1194
+ children: /* @__PURE__ */ jsx(ConfirmDialog, { onConfirm: handleConfirmDeleteDialog(values, { setErrors }), children: /* @__PURE__ */ jsxs(Flex, { direction: "column", gap: 5, children: [
1196
1195
  savePrompts.hasDeletedServerStages && /* @__PURE__ */ jsx(Typography, { textAlign: "center", variant: "omega", children: formatMessage({
1197
1196
  id: "review-workflows.page.delete.confirm.stages.body",
1198
1197
  defaultMessage: "All entries assigned to deleted stages will be moved to the previous stage."
@@ -1204,7 +1203,7 @@ const EditPage = () => {
1204
1203
  },
1205
1204
  {
1206
1205
  count: contentTypesFromOtherWorkflows?.filter(
1207
- (contentType) => currentWorkflow?.contentTypes?.includes(contentType)
1206
+ (contentType) => values.contentTypes.includes(contentType)
1208
1207
  ).length ?? 0
1209
1208
  }
1210
1209
  ) }),
@@ -1212,7 +1211,7 @@ const EditPage = () => {
1212
1211
  id: "review-workflows.page.delete.confirm.confirm",
1213
1212
  defaultMessage: "Are you sure you want to save?"
1214
1213
  }) })
1215
- ] })
1214
+ ] }) })
1216
1215
  }
1217
1216
  )
1218
1217
  ] })
@@ -1221,8 +1220,8 @@ const EditPage = () => {
1221
1220
  /* @__PURE__ */ jsxs(
1222
1221
  LimitsModal.Root,
1223
1222
  {
1224
- isOpen: showLimitModal === "workflow",
1225
- onClose: () => setShowLimitModal(null),
1223
+ open: showLimitModal === "workflow",
1224
+ onOpenChange: () => setShowLimitModal(null),
1226
1225
  children: [
1227
1226
  /* @__PURE__ */ jsx(LimitsModal.Title, { children: formatMessage({
1228
1227
  id: "review-workflows.edit.page.workflows.limit.title",
@@ -1235,16 +1234,23 @@ const EditPage = () => {
1235
1234
  ]
1236
1235
  }
1237
1236
  ),
1238
- /* @__PURE__ */ jsxs(LimitsModal.Root, { isOpen: showLimitModal === "stage", onClose: () => setShowLimitModal(null), children: [
1239
- /* @__PURE__ */ jsx(LimitsModal.Title, { children: formatMessage({
1240
- id: "review-workflows.edit.page.stages.limit.title",
1241
- defaultMessage: "You have reached the limit of stages for this workflow in your plan"
1242
- }) }),
1243
- /* @__PURE__ */ jsx(LimitsModal.Body, { children: formatMessage({
1244
- id: "review-workflows.edit.page.stages.limit.body",
1245
- defaultMessage: "Try deleting some stages or contact Sales to enable more stages."
1246
- }) })
1247
- ] })
1237
+ /* @__PURE__ */ jsxs(
1238
+ LimitsModal.Root,
1239
+ {
1240
+ open: showLimitModal === "stage",
1241
+ onOpenChange: () => setShowLimitModal(null),
1242
+ children: [
1243
+ /* @__PURE__ */ jsx(LimitsModal.Title, { children: formatMessage({
1244
+ id: "review-workflows.edit.page.stages.limit.title",
1245
+ defaultMessage: "You have reached the limit of stages for this workflow in your plan"
1246
+ }) }),
1247
+ /* @__PURE__ */ jsx(LimitsModal.Body, { children: formatMessage({
1248
+ id: "review-workflows.edit.page.stages.limit.body",
1249
+ defaultMessage: "Try deleting some stages or contact Sales to enable more stages."
1250
+ }) })
1251
+ ]
1252
+ }
1253
+ )
1248
1254
  ] });
1249
1255
  };
1250
1256
  const addTmpKeysToStages = (data) => {
@@ -1268,4 +1274,4 @@ const ProtectedEditPage = () => {
1268
1274
  export {
1269
1275
  ProtectedEditPage
1270
1276
  };
1271
- //# sourceMappingURL=_id-DO302-GM.mjs.map
1277
+ //# sourceMappingURL=id-MDQVDdXD.mjs.map