@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
@@ -8,15 +8,13 @@ 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-BIHOhXvS.js");
15
- const Layout = require("./Layout-BemsgaWF.js");
13
+ const index = require("./index-BSsDJNiQ.js");
14
+ const Layout = require("./Layout-ywt0cSLq.js");
16
15
  const reactDndHtml5Backend = require("react-dnd-html5-backend");
17
- const styled = require("styled-components");
16
+ const styledComponents = require("styled-components");
18
17
  const reactDnd = require("react-dnd");
19
- const _interopDefault = (e) => e && e.__esModule ? e : { default: e };
20
18
  function _interopNamespace(e) {
21
19
  if (e && e.__esModule)
22
20
  return e;
@@ -37,11 +35,10 @@ function _interopNamespace(e) {
37
35
  }
38
36
  const React__namespace = /* @__PURE__ */ _interopNamespace(React);
39
37
  const yup__namespace = /* @__PURE__ */ _interopNamespace(yup);
40
- const styled__default = /* @__PURE__ */ _interopDefault(styled);
41
38
  const adminApi = index.reviewWorkflowsApi.injectEndpoints({
42
39
  endpoints(builder) {
43
40
  return {
44
- getRoles: builder.query({
41
+ getAdminRoles: builder.query({
45
42
  query: () => ({
46
43
  url: `/admin/roles`,
47
44
  method: "GET"
@@ -53,7 +50,7 @@ const adminApi = index.reviewWorkflowsApi.injectEndpoints({
53
50
  };
54
51
  }
55
52
  });
56
- const { useGetRolesQuery } = adminApi;
53
+ const { useGetAdminRolesQuery } = adminApi;
57
54
  const useKeyboardDragAndDrop = (active, index2, { onCancel, onDropItem, onGrabItem, onMoveItem }) => {
58
55
  const [isSelected, setIsSelected] = React__namespace.useState(false);
59
56
  const handleMove = (movement) => {
@@ -272,23 +269,23 @@ const AddStage = ({ children, ...props }) => {
272
269
  return /* @__PURE__ */ jsxRuntime.jsx(
273
270
  StyledButton,
274
271
  {
275
- as: "button",
272
+ tag: "button",
276
273
  background: "neutral0",
277
- border: "neutral150",
274
+ borderColor: "neutral150",
278
275
  paddingBottom: 3,
279
276
  paddingLeft: 4,
280
277
  paddingRight: 4,
281
278
  paddingTop: 3,
282
279
  shadow: "filterShadow",
283
280
  ...props,
284
- children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", textColor: "inherit", children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { as: "span", gap: 2, children: [
281
+ children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { variant: "pi", fontWeight: "bold", children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { tag: "span", gap: 2, children: [
285
282
  /* @__PURE__ */ jsxRuntime.jsx(icons.PlusCircle, { width: "2.4rem", height: "2.4rem", "aria-hidden": true }),
286
283
  children
287
284
  ] }) })
288
285
  }
289
286
  );
290
287
  };
291
- const StyledButton = styled__default.default(designSystem.Box)`
288
+ const StyledButton = styledComponents.styled(designSystem.Box)`
292
289
  border-radius: 26px;
293
290
  color: ${({ theme }) => theme.colors.neutral500};
294
291
 
@@ -300,7 +297,7 @@ const StyledButton = styled__default.default(designSystem.Box)`
300
297
  color: ${({ theme }) => theme.colors.primary600};
301
298
  }
302
299
  `;
303
- const Stages = ({ canDelete = true, canUpdate = true, isCreating = false }) => {
300
+ const Stages = ({ canDelete = true, canUpdate = true, isCreating }) => {
304
301
  const { formatMessage } = reactIntl.useIntl();
305
302
  const { trackUsage } = strapiAdmin.useTracking();
306
303
  const addFieldRow = strapiAdmin.useForm("Stages", (state) => state.addFieldRow);
@@ -315,35 +312,23 @@ const Stages = ({ canDelete = true, canUpdate = true, isCreating = false }) => {
315
312
  left: "50%",
316
313
  position: "absolute",
317
314
  top: "0",
318
- width: 2,
319
- zIndex: 1
315
+ width: 2
320
316
  }
321
317
  ),
322
- /* @__PURE__ */ jsxRuntime.jsx(
323
- designSystem.Flex,
324
- {
325
- direction: "column",
326
- alignItems: "stretch",
327
- gap: 6,
328
- zIndex: 2,
329
- position: "relative",
330
- as: "ol",
331
- children: stages.map((stage, index2) => {
332
- return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { as: "li", children: /* @__PURE__ */ jsxRuntime.jsx(
333
- Stage,
334
- {
335
- index: index2,
336
- canDelete: stages.length > 1 && canDelete,
337
- canReorder: stages.length > 1,
338
- canUpdate,
339
- stagesCount: stages.length,
340
- isOpen: isCreating,
341
- ...stage
342
- }
343
- ) }, stage.__temp_key__);
344
- })
345
- }
346
- )
318
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Flex, { direction: "column", alignItems: "stretch", gap: 6, position: "relative", tag: "ol", children: stages.map((stage, index2) => {
319
+ return /* @__PURE__ */ jsxRuntime.jsx(designSystem.Box, { tag: "li", children: /* @__PURE__ */ jsxRuntime.jsx(
320
+ Stage,
321
+ {
322
+ index: index2,
323
+ canDelete: stages.length > 1 && canDelete,
324
+ canReorder: stages.length > 1,
325
+ canUpdate,
326
+ stagesCount: stages.length,
327
+ defaultOpen: !stage.id,
328
+ ...stage
329
+ }
330
+ ) }, stage.__temp_key__);
331
+ }) })
347
332
  ] }),
348
333
  canUpdate && /* @__PURE__ */ jsxRuntime.jsx(
349
334
  AddStage,
@@ -361,7 +346,7 @@ const Stages = ({ canDelete = true, canUpdate = true, isCreating = false }) => {
361
346
  )
362
347
  ] });
363
348
  };
364
- const Background = styled__default.default(designSystem.Box)`
349
+ const Background = styledComponents.styled(designSystem.Box)`
365
350
  transform: translateX(-50%);
366
351
  `;
367
352
  const Stage = ({
@@ -369,16 +354,15 @@ const Stage = ({
369
354
  canDelete = false,
370
355
  canReorder = false,
371
356
  canUpdate = false,
372
- isOpen: isOpenDefault = false,
373
357
  stagesCount,
374
358
  name,
375
359
  permissions,
376
- color
360
+ color,
361
+ defaultOpen
377
362
  }) => {
378
363
  const [liveText, setLiveText] = React__namespace.useState();
379
364
  const { formatMessage } = reactIntl.useIntl();
380
365
  const { trackUsage } = strapiAdmin.useTracking();
381
- const [isOpen, setIsOpen] = React__namespace.useState(isOpenDefault);
382
366
  const stageErrors = strapiAdmin.useForm("Stages", (state) => state.errors.stages);
383
367
  const error = stageErrors?.[index2];
384
368
  const addFieldRow = strapiAdmin.useForm("Stage", (state) => state.addFieldRow);
@@ -460,7 +444,8 @@ const Stage = ({
460
444
  const handleCloneClick = () => {
461
445
  addFieldRow("stages", { name, color, permissions });
462
446
  };
463
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { ref: (ref) => composedRef(ref), children: [
447
+ const id = React__namespace.useId();
448
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Box, { ref: composedRef, shadow: "tableShadow", children: [
464
449
  liveText && /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { "aria-live": "assertive", children: liveText }),
465
450
  isDragging ? /* @__PURE__ */ jsxRuntime.jsx(
466
451
  designSystem.Box,
@@ -471,74 +456,61 @@ const Stage = ({
471
456
  borderWidth: "1px",
472
457
  display: "block",
473
458
  hasRadius: true,
474
- padding: 6,
475
- shadow: "tableShadow"
459
+ padding: 6
476
460
  }
477
- ) : /* @__PURE__ */ jsxRuntime.jsxs(
478
- designSystem.Accordion,
461
+ ) : /* @__PURE__ */ jsxRuntime.jsx(
462
+ AccordionRoot,
479
463
  {
480
- size: "S",
481
- variant: "primary",
482
- onToggle: () => {
483
- setIsOpen(!isOpen);
484
- if (!isOpen) {
464
+ onValueChange: (value) => {
465
+ if (value) {
485
466
  trackUsage("willEditStage");
486
467
  }
487
468
  },
488
- expanded: isOpen,
489
- shadow: "tableShadow",
490
- error: Object.values(error ?? {})[0],
491
- hasErrorMessage: false,
492
- children: [
493
- /* @__PURE__ */ jsxRuntime.jsx(
494
- designSystem.AccordionToggle,
495
- {
496
- title: name,
497
- togglePosition: "left",
498
- action: (canDelete || canUpdate) && /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { children: [
499
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
500
- /* @__PURE__ */ jsxRuntime.jsxs(ContextMenuTrigger, { size: "S", endIcon: null, paddingLeft: 2, paddingRight: 2, children: [
501
- /* @__PURE__ */ jsxRuntime.jsx(icons.More, { "aria-hidden": true, focusable: false }),
502
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { as: "span", children: formatMessage({
503
- id: "[tbdb].components.DynamicZone.more-actions",
504
- defaultMessage: "More actions"
505
- }) })
506
- ] }),
507
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Content, { popoverPlacement: "bottom-end", zIndex: 2, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
508
- canUpdate && /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onClick: handleCloneClick, children: formatMessage({
509
- id: "Settings.review-workflows.stage.delete",
510
- defaultMessage: "Duplicate stage"
511
- }) }),
512
- canDelete && /* @__PURE__ */ jsxRuntime.jsx(DeleteMenuItem, { onClick: () => removeFieldRow("stages", index2), children: formatMessage({
513
- id: "Settings.review-workflows.stage.delete",
514
- defaultMessage: "Delete"
515
- }) })
516
- ] }) })
469
+ defaultValue: defaultOpen ? id : void 0,
470
+ $error: Object.values(error ?? {}).length > 0,
471
+ children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Item, { value: id, children: [
472
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Accordion.Header, { children: [
473
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Trigger, { children: name }),
474
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Actions, { children: canDelete || canUpdate ? /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
475
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.Root, { children: [
476
+ /* @__PURE__ */ jsxRuntime.jsxs(ContextMenuTrigger, { size: "S", endIcon: null, paddingLeft: 2, paddingRight: 2, children: [
477
+ /* @__PURE__ */ jsxRuntime.jsx(icons.More, { "aria-hidden": true, focusable: false }),
478
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.VisuallyHidden, { tag: "span", children: formatMessage({
479
+ id: "[tbdb].components.DynamicZone.more-actions",
480
+ defaultMessage: "More actions"
481
+ }) })
517
482
  ] }),
518
- canUpdate && /* @__PURE__ */ jsxRuntime.jsx(
519
- DragIconButton,
520
- {
521
- background: "transparent",
522
- forwardedAs: "div",
523
- hasRadius: true,
524
- role: "button",
525
- noBorder: true,
526
- tabIndex: 0,
527
- "data-handler-id": handlerId,
528
- ref: dragRef,
529
- label: formatMessage({
530
- id: "Settings.review-workflows.stage.drag",
531
- defaultMessage: "Drag"
532
- }),
533
- onClick: (e) => e.stopPropagation(),
534
- onKeyDown: handleKeyDown,
535
- children: /* @__PURE__ */ jsxRuntime.jsx(icons.Drag, {})
536
- }
537
- )
538
- ] })
539
- }
540
- ),
541
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.AccordionContent, { padding: 6, background: "neutral0", hasRadius: true, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid, { gap: 4, children: [
483
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Menu.Content, { popoverPlacement: "bottom-end", zIndex: 2, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Menu.SubRoot, { children: [
484
+ canUpdate && /* @__PURE__ */ jsxRuntime.jsx(designSystem.MenuItem, { onClick: handleCloneClick, children: formatMessage({
485
+ id: "Settings.review-workflows.stage.delete",
486
+ defaultMessage: "Duplicate stage"
487
+ }) }),
488
+ canDelete && /* @__PURE__ */ jsxRuntime.jsx(DeleteMenuItem, { onClick: () => removeFieldRow("stages", index2), children: formatMessage({
489
+ id: "Settings.review-workflows.stage.delete",
490
+ defaultMessage: "Delete"
491
+ }) })
492
+ ] }) })
493
+ ] }),
494
+ canUpdate && /* @__PURE__ */ jsxRuntime.jsx(
495
+ designSystem.IconButton,
496
+ {
497
+ background: "transparent",
498
+ hasRadius: true,
499
+ variant: "ghost",
500
+ "data-handler-id": handlerId,
501
+ ref: dragRef,
502
+ label: formatMessage({
503
+ id: "Settings.review-workflows.stage.drag",
504
+ defaultMessage: "Drag"
505
+ }),
506
+ onClick: (e) => e.stopPropagation(),
507
+ onKeyDown: handleKeyDown,
508
+ children: /* @__PURE__ */ jsxRuntime.jsx(icons.Drag, {})
509
+ }
510
+ )
511
+ ] }) : null })
512
+ ] }),
513
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Accordion.Content, { children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Root, { gap: 4, padding: 6, children: [
542
514
  {
543
515
  disabled: !canUpdate,
544
516
  label: formatMessage({
@@ -576,16 +548,20 @@ const Stage = ({
576
548
  size: 6,
577
549
  type: "permissions"
578
550
  }
579
- ].map(({ size, ...field }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: size, children: /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...field }) }, field.name)) }) })
580
- ]
551
+ ].map(({ size, ...field }) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: size, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(InputRenderer, { ...field }) }, field.name)) }) })
552
+ ] })
581
553
  }
582
554
  )
583
555
  ] });
584
556
  };
585
- const DeleteMenuItem = styled__default.default(designSystem.MenuItem)`
557
+ const AccordionRoot = styledComponents.styled(designSystem.Accordion.Root)`
558
+ border: 1px solid
559
+ ${({ theme, $error }) => $error ? theme.colors.danger600 : theme.colors.neutral200};
560
+ `;
561
+ const DeleteMenuItem = styledComponents.styled(designSystem.MenuItem)`
586
562
  color: ${({ theme }) => theme.colors.danger600};
587
563
  `;
588
- const ContextMenuTrigger = styled__default.default(designSystem.Menu.Trigger)`
564
+ const ContextMenuTrigger = styledComponents.styled(designSystem.Menu.Trigger)`
589
565
  :hover,
590
566
  :focus {
591
567
  background-color: ${({ theme }) => theme.colors.neutral100};
@@ -595,22 +571,6 @@ const ContextMenuTrigger = styled__default.default(designSystem.Menu.Trigger)`
595
571
  font-size: 0;
596
572
  }
597
573
  `;
598
- const DragIconButton = styled__default.default(designSystem.IconButton)`
599
- align-items: center;
600
- border-radius: ${({ theme }) => theme.borderRadius};
601
- display: flex;
602
- justify-content: center;
603
-
604
- &:hover,
605
- &:focus {
606
- background-color: ${({ theme }) => theme.colors.neutral100};
607
- }
608
-
609
- svg {
610
- height: auto;
611
- width: ${({ theme }) => theme.spaces[3]};
612
- }
613
- `;
614
574
  const InputRenderer = (props) => {
615
575
  switch (props.type) {
616
576
  case "color":
@@ -636,54 +596,55 @@ const ColorSelector = ({ disabled, label, name, required }) => {
636
596
  color: hex
637
597
  }));
638
598
  const { themeColorName } = index.getStageColorByHex(value) ?? {};
639
- return /* @__PURE__ */ jsxRuntime.jsx(
640
- designSystem.SingleSelect,
641
- {
642
- disabled,
643
- error,
644
- required,
645
- label,
646
- onChange: (v) => {
647
- onChange(name, v.toString());
648
- },
649
- value: value?.toUpperCase(),
650
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(
651
- designSystem.Flex,
652
- {
653
- as: "span",
654
- height: 2,
655
- background: value,
656
- borderColor: themeColorName === "neutral0" ? "neutral150" : "transparent",
657
- hasRadius: true,
658
- shrink: 0,
659
- width: 2
660
- }
661
- ),
662
- children: colorOptions.map(({ value: value2, label: label2, color }) => {
663
- const { themeColorName: themeColorName2 } = index.getStageColorByHex(color) || {};
664
- return /* @__PURE__ */ jsxRuntime.jsx(
665
- designSystem.SingleSelectOption,
599
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error, name, required, children: [
600
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: label }),
601
+ /* @__PURE__ */ jsxRuntime.jsx(
602
+ designSystem.SingleSelect,
603
+ {
604
+ disabled,
605
+ onChange: (v) => {
606
+ onChange(name, v.toString());
607
+ },
608
+ value: value?.toUpperCase(),
609
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(
610
+ designSystem.Flex,
666
611
  {
667
- value: value2,
668
- startIcon: /* @__PURE__ */ jsxRuntime.jsx(
669
- designSystem.Flex,
670
- {
671
- as: "span",
672
- height: 2,
673
- background: color,
674
- borderColor: themeColorName2 === "neutral0" ? "neutral150" : "transparent",
675
- hasRadius: true,
676
- shrink: 0,
677
- width: 2
678
- }
679
- ),
680
- children: label2
681
- },
682
- value2
683
- );
684
- })
685
- }
686
- );
612
+ tag: "span",
613
+ height: 2,
614
+ background: value,
615
+ borderColor: themeColorName === "neutral0" ? "neutral150" : "transparent",
616
+ hasRadius: true,
617
+ shrink: 0,
618
+ width: 2
619
+ }
620
+ ),
621
+ children: colorOptions.map(({ value: value2, label: label2, color }) => {
622
+ const { themeColorName: themeColorName2 } = index.getStageColorByHex(color) || {};
623
+ return /* @__PURE__ */ jsxRuntime.jsx(
624
+ designSystem.SingleSelectOption,
625
+ {
626
+ value: value2,
627
+ startIcon: /* @__PURE__ */ jsxRuntime.jsx(
628
+ designSystem.Flex,
629
+ {
630
+ tag: "span",
631
+ height: 2,
632
+ background: color,
633
+ borderColor: themeColorName2 === "neutral0" ? "neutral150" : "transparent",
634
+ hasRadius: true,
635
+ shrink: 0,
636
+ width: 2
637
+ }
638
+ ),
639
+ children: label2
640
+ },
641
+ value2
642
+ );
643
+ })
644
+ }
645
+ ),
646
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Error, {})
647
+ ] });
687
648
  };
688
649
  const PermissionsField = ({ disabled, name, placeholder, required }) => {
689
650
  const { formatMessage } = reactIntl.useIntl();
@@ -692,57 +653,65 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
692
653
  const { value = [], error, onChange } = strapiAdmin.useField(name);
693
654
  const allStages = strapiAdmin.useForm("PermissionsField", (state) => state.values.stages);
694
655
  const onFormValueChange = strapiAdmin.useForm("PermissionsField", (state) => state.onChange);
695
- const { data: roles = [], isLoading } = useGetRolesQuery();
656
+ const rolesErrorCount = React__namespace.useRef(0);
657
+ const { data: roles = [], isLoading, error: getRolesError } = useGetAdminRolesQuery();
696
658
  const filteredRoles = roles?.filter((role) => role.code !== "strapi-super-admin") ?? [];
697
659
  React__namespace.useEffect(() => {
698
- if (!isLoading && roles.length === 0) {
660
+ if (!isLoading && getRolesError && "status" in getRolesError && getRolesError.status == 403 && rolesErrorCount.current === 0) {
661
+ rolesErrorCount.current = 1;
699
662
  toggleNotification({
700
663
  blockTransition: true,
701
664
  type: "danger",
702
665
  message: formatMessage({
703
666
  id: "review-workflows.stage.permissions.noPermissions.description",
704
- defaultMessage: "You don’t have the permission to see roles"
667
+ defaultMessage: "You don’t have the permission to see roles. Contact your administrator."
705
668
  })
706
669
  });
707
670
  }
708
- }, [formatMessage, isLoading, roles, toggleNotification]);
671
+ }, [formatMessage, isLoading, roles, toggleNotification, getRolesError]);
709
672
  if (!isLoading && filteredRoles.length === 0) {
710
- return /* @__PURE__ */ jsxRuntime.jsx(
711
- designSystem.TextInput,
673
+ return /* @__PURE__ */ jsxRuntime.jsxs(
674
+ designSystem.Field.Root,
712
675
  {
713
- disabled: true,
714
676
  name,
715
677
  hint: formatMessage({
716
678
  id: "Settings.review-workflows.stage.permissions.noPermissions.description",
717
679
  defaultMessage: "You don’t have the permission to see roles"
718
680
  }),
719
- label: formatMessage({
720
- id: "Settings.review-workflows.stage.permissions.label",
721
- defaultMessage: "Roles that can change this stage"
722
- }),
723
- placeholder: formatMessage({
724
- id: "components.NotAllowedInput.text",
725
- defaultMessage: "No permissions to see this field"
726
- }),
727
681
  required,
728
- startAction: /* @__PURE__ */ jsxRuntime.jsx(StyledIcon, {}),
729
- type: "text",
730
- value: ""
682
+ children: [
683
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
684
+ id: "Settings.review-workflows.stage.permissions.label",
685
+ defaultMessage: "Roles that can change this stage"
686
+ }) }),
687
+ /* @__PURE__ */ jsxRuntime.jsx(
688
+ designSystem.TextInput,
689
+ {
690
+ disabled: true,
691
+ placeholder: formatMessage({
692
+ id: "components.NotAllowedInput.text",
693
+ defaultMessage: "No permissions to see this field"
694
+ }),
695
+ startAction: /* @__PURE__ */ jsxRuntime.jsx(icons.EyeStriked, { fill: "neutral600" }),
696
+ type: "text",
697
+ value: ""
698
+ }
699
+ ),
700
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
701
+ ]
731
702
  }
732
703
  );
733
704
  }
734
- return /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
735
- /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "flex-end", gap: 3, children: [
736
- /* @__PURE__ */ jsxRuntime.jsx(PermissionWrapper, { grow: 1, children: /* @__PURE__ */ jsxRuntime.jsx(
705
+ return /* @__PURE__ */ jsxRuntime.jsx(jsxRuntime.Fragment, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "flex-end", gap: 3, children: [
706
+ /* @__PURE__ */ jsxRuntime.jsx(PermissionWrapper, { grow: 1, children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error, name, required: true, children: [
707
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
708
+ id: "Settings.review-workflows.stage.permissions.label",
709
+ defaultMessage: "Roles that can change this stage"
710
+ }) }),
711
+ /* @__PURE__ */ jsxRuntime.jsx(
737
712
  designSystem.MultiSelect,
738
713
  {
739
714
  disabled,
740
- error,
741
- id: name,
742
- label: formatMessage({
743
- id: "Settings.review-workflows.stage.permissions.label",
744
- defaultMessage: "Roles that can change this stage"
745
- }),
746
715
  onChange: (values) => {
747
716
  const permissions = values.map((value2) => ({
748
717
  role: parseInt(value2, 10),
@@ -751,7 +720,6 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
751
720
  onChange(name, permissions);
752
721
  },
753
722
  placeholder,
754
- required: true,
755
723
  value: value.map((permission) => `${permission.role}`),
756
724
  withTags: true,
757
725
  children: /* @__PURE__ */ jsxRuntime.jsx(
@@ -768,70 +736,64 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
768
736
  }
769
737
  )
770
738
  }
771
- ) }),
772
- /* @__PURE__ */ jsxRuntime.jsx(
739
+ ),
740
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Error, {})
741
+ ] }) }),
742
+ /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Dialog.Root, { open: isApplyAllConfirmationOpen, onOpenChange: setIsApplyAllConfirmationOpen, children: [
743
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Dialog.Trigger, { children: /* @__PURE__ */ jsxRuntime.jsx(
773
744
  designSystem.IconButton,
774
745
  {
775
746
  disabled,
776
- icon: /* @__PURE__ */ jsxRuntime.jsx(icons.Duplicate, {}),
777
747
  label: formatMessage({
778
748
  id: "Settings.review-workflows.stage.permissions.apply.label",
779
749
  defaultMessage: "Apply to all stages"
780
750
  }),
781
751
  size: "L",
782
- variant: "secondary",
783
- onClick: () => setIsApplyAllConfirmationOpen(true)
752
+ children: /* @__PURE__ */ jsxRuntime.jsx(icons.Duplicate, {})
753
+ }
754
+ ) }),
755
+ /* @__PURE__ */ jsxRuntime.jsx(
756
+ strapiAdmin.ConfirmDialog,
757
+ {
758
+ onConfirm: () => {
759
+ onFormValueChange(
760
+ "stages",
761
+ allStages.map((stage) => ({
762
+ ...stage,
763
+ permissions: value
764
+ }))
765
+ );
766
+ setIsApplyAllConfirmationOpen(false);
767
+ toggleNotification({
768
+ type: "success",
769
+ message: formatMessage({
770
+ id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success",
771
+ defaultMessage: "Applied roles to all other stages of the workflow"
772
+ })
773
+ });
774
+ },
775
+ variant: "default",
776
+ children: formatMessage({
777
+ id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy",
778
+ defaultMessage: "Roles that can change that stage will be applied to all the other stages."
779
+ })
784
780
  }
785
781
  )
786
- ] }),
787
- /* @__PURE__ */ jsxRuntime.jsx(
788
- strapiAdmin.ConfirmDialog,
789
- {
790
- isOpen: isApplyAllConfirmationOpen,
791
- onClose: () => setIsApplyAllConfirmationOpen(false),
792
- onConfirm: () => {
793
- onFormValueChange(
794
- "stages",
795
- allStages.map((stage) => ({
796
- ...stage,
797
- permissions: value
798
- }))
799
- );
800
- setIsApplyAllConfirmationOpen(false);
801
- toggleNotification({
802
- type: "success",
803
- message: formatMessage({
804
- id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success",
805
- defaultMessage: "Applied roles to all other stages of the workflow"
806
- })
807
- });
808
- },
809
- variant: "default",
810
- children: formatMessage({
811
- id: "Settings.review-workflows.page.edit.confirm.stages.permissions.copy",
812
- defaultMessage: "Roles that can change that stage will be applied to all the other stages."
813
- })
814
- }
815
- )
816
- ] });
782
+ ] })
783
+ ] }) });
817
784
  };
818
- const StyledIcon = styled__default.default(icons.EyeStriked)`
819
- & > path {
820
- fill: ${({ theme }) => theme.colors.neutral600};
821
- }
822
- `;
823
- const NestedOption$1 = styled__default.default(designSystem.MultiSelectOption)`
785
+ const NestedOption$1 = styledComponents.styled(designSystem.MultiSelectOption)`
824
786
  padding-left: ${({ theme }) => theme.spaces[7]};
825
787
  `;
826
- const PermissionWrapper = styled__default.default(designSystem.Flex)`
788
+ const PermissionWrapper = styledComponents.styled(designSystem.Flex)`
827
789
  > * {
828
790
  flex-grow: 1;
829
791
  }
830
792
  `;
831
793
  const WorkflowAttributes = ({ canUpdate = true }) => {
832
794
  const { formatMessage } = reactIntl.useIntl();
833
- return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Grid, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
834
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: 6, children: /* @__PURE__ */ jsxRuntime.jsx(
795
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Grid.Root, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
796
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(
835
797
  strapiAdmin.InputRenderer,
836
798
  {
837
799
  disabled: !canUpdate,
@@ -844,7 +806,8 @@ const WorkflowAttributes = ({ canUpdate = true }) => {
844
806
  type: "string"
845
807
  }
846
808
  ) }),
847
- /* @__PURE__ */ jsxRuntime.jsx(designSystem.GridItem, { col: 6, children: /* @__PURE__ */ jsxRuntime.jsx(ContentTypesSelector, { disabled: !canUpdate }) })
809
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(ContentTypesSelector, { disabled: !canUpdate }) }),
810
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsxRuntime.jsx(StageSelector, { disabled: !canUpdate }) })
848
811
  ] });
849
812
  };
850
813
  const ContentTypesSelector = ({ disabled }) => {
@@ -865,97 +828,146 @@ const ContentTypesSelector = ({ disabled }) => {
865
828
  label: contentType.info.displayName,
866
829
  value: contentType.uid
867
830
  }));
868
- return /* @__PURE__ */ jsxRuntime.jsx(
869
- designSystem.MultiSelect,
870
- {
871
- customizeContent: (value2) => formatMessage(
872
- {
873
- id: "Settings.review-workflows.workflow.contentTypes.displayValue",
874
- defaultMessage: "{count} {count, plural, one {content type} other {content types}} selected"
831
+ return /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Field.Root, { error, name: "contentTypes", children: [
832
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
833
+ id: "Settings.review-workflows.workflow.contentTypes.label",
834
+ defaultMessage: "Associated to"
835
+ }) }),
836
+ /* @__PURE__ */ jsxRuntime.jsx(
837
+ designSystem.MultiSelect,
838
+ {
839
+ customizeContent: (value2) => formatMessage(
840
+ {
841
+ id: "Settings.review-workflows.workflow.contentTypes.displayValue",
842
+ defaultMessage: "{count} {count, plural, one {content type} other {content types}} selected"
843
+ },
844
+ { count: value2?.length }
845
+ ),
846
+ disabled: isDisabled,
847
+ onChange: (values) => {
848
+ onChange("contentTypes", values);
875
849
  },
876
- { count: value2?.length }
877
- ),
878
- disabled: isDisabled,
850
+ value,
851
+ placeholder: formatMessage({
852
+ id: "Settings.review-workflows.workflow.contentTypes.placeholder",
853
+ defaultMessage: "Select"
854
+ }),
855
+ children: [
856
+ ...collectionTypes.length > 0 ? [
857
+ {
858
+ label: formatMessage({
859
+ id: "Settings.review-workflows.workflow.contentTypes.collectionTypes.label",
860
+ defaultMessage: "Collection Types"
861
+ }),
862
+ children: collectionTypes
863
+ }
864
+ ] : [],
865
+ ...singleTypes.length > 0 ? [
866
+ {
867
+ label: formatMessage({
868
+ id: "Settings.review-workflows.workflow.contentTypes.singleTypes.label",
869
+ defaultMessage: "Single Types"
870
+ }),
871
+ children: singleTypes
872
+ }
873
+ ] : []
874
+ ].map((opt) => {
875
+ return /* @__PURE__ */ jsxRuntime.jsx(
876
+ designSystem.MultiSelectGroup,
877
+ {
878
+ label: opt.label,
879
+ values: opt.children.map((child) => child.value.toString()),
880
+ children: opt.children.map((child) => {
881
+ const { name: assignedWorkflowName } = workflows?.find(
882
+ (workflow) => (currentWorkflow && workflow.id !== currentWorkflow.id || !currentWorkflow) && workflow.contentTypes.includes(child.value)
883
+ ) ?? {};
884
+ return /* @__PURE__ */ jsxRuntime.jsx(NestedOption, { value: child.value, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, {
885
+ // @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
886
+ children: formatMessage(
887
+ {
888
+ id: "Settings.review-workflows.workflow.contentTypes.assigned.notice",
889
+ defaultMessage: "{label} {name, select, undefined {} other {<i>(assigned to <em>{name}</em> workflow)</i>}}"
890
+ },
891
+ {
892
+ label: child.label,
893
+ name: assignedWorkflowName,
894
+ em: (...children) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { tag: "em", fontWeight: "bold", children }),
895
+ i: (...children) => /* @__PURE__ */ jsxRuntime.jsx(ContentTypeTakeNotice, { children })
896
+ }
897
+ )
898
+ }) }, child.value);
899
+ })
900
+ },
901
+ opt.label
902
+ );
903
+ })
904
+ }
905
+ )
906
+ ] });
907
+ };
908
+ const NestedOption = styledComponents.styled(designSystem.MultiSelectOption)`
909
+ padding-left: ${({ theme }) => theme.spaces[7]};
910
+ `;
911
+ const ContentTypeTakeNotice = styledComponents.styled(designSystem.Typography)`
912
+ font-style: italic;
913
+ `;
914
+ const StageSelector = ({ disabled }) => {
915
+ const { value: stages = [] } = strapiAdmin.useField("stages");
916
+ const { formatMessage } = reactIntl.useIntl();
917
+ const { error, value, onChange } = strapiAdmin.useField("stageRequiredToPublish");
918
+ const validStages = stages.filter((stage) => stage.name);
919
+ return /* @__PURE__ */ jsxRuntime.jsxs(
920
+ designSystem.Field.Root,
921
+ {
879
922
  error,
880
- label: formatMessage({
881
- id: "Settings.review-workflows.workflow.contentTypes.label",
882
- defaultMessage: "Associated to"
883
- }),
884
- onChange: (values) => {
885
- onChange("contentTypes", values);
886
- },
887
- value,
888
- placeholder: formatMessage({
889
- id: "Settings.review-workflows.workflow.contentTypes.placeholder",
890
- defaultMessage: "Select"
923
+ name: "stageRequiredToPublish",
924
+ hint: formatMessage({
925
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.hint",
926
+ defaultMessage: "Prevents entries from being published if they are not at the required stage."
891
927
  }),
892
928
  children: [
893
- ...collectionTypes.length > 0 ? [
894
- {
895
- label: formatMessage({
896
- id: "Settings.review-workflows.workflow.contentTypes.collectionTypes.label",
897
- defaultMessage: "Collection Types"
898
- }),
899
- children: collectionTypes
900
- }
901
- ] : [],
902
- ...singleTypes.length > 0 ? [
929
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Label, { children: formatMessage({
930
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.label",
931
+ defaultMessage: "Required stage for publishing"
932
+ }) }),
933
+ /* @__PURE__ */ jsxRuntime.jsxs(
934
+ designSystem.SingleSelect,
903
935
  {
904
- label: formatMessage({
905
- id: "Settings.review-workflows.workflow.contentTypes.singleTypes.label",
906
- defaultMessage: "Single Types"
907
- }),
908
- children: singleTypes
936
+ disabled,
937
+ onChange: (value2) => {
938
+ onChange("stageRequiredToPublish", value2);
939
+ },
940
+ value,
941
+ children: [
942
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.SingleSelectOption, { value: "", children: formatMessage({
943
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.any",
944
+ defaultMessage: "Any stage"
945
+ }) }),
946
+ validStages.map((stage, i) => /* @__PURE__ */ jsxRuntime.jsx(
947
+ designSystem.SingleSelectOption,
948
+ {
949
+ value: stage.id?.toString() || stage.__temp_key__,
950
+ children: stage.name
951
+ },
952
+ `requiredToPublishStage-${stage.id || stage.__temp_key__}`
953
+ ))
954
+ ]
909
955
  }
910
- ] : []
911
- ].map((opt) => {
912
- return /* @__PURE__ */ jsxRuntime.jsx(
913
- designSystem.MultiSelectGroup,
914
- {
915
- label: opt.label,
916
- values: opt.children.map((child) => child.value.toString()),
917
- children: opt.children.map((child) => {
918
- const { name: assignedWorkflowName } = workflows?.find(
919
- (workflow) => (currentWorkflow && workflow.id !== currentWorkflow.id || !currentWorkflow) && workflow.contentTypes.includes(child.value)
920
- ) ?? {};
921
- return /* @__PURE__ */ jsxRuntime.jsx(NestedOption, { value: child.value, children: /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, {
922
- // @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
923
- children: formatMessage(
924
- {
925
- id: "Settings.review-workflows.workflow.contentTypes.assigned.notice",
926
- defaultMessage: "{label} {name, select, undefined {} other {<i>(assigned to <em>{name}</em> workflow)</i>}}"
927
- },
928
- {
929
- label: child.label,
930
- name: assignedWorkflowName,
931
- em: (...children) => /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { as: "em", fontWeight: "bold", children }),
932
- i: (...children) => /* @__PURE__ */ jsxRuntime.jsx(ContentTypeTakeNotice, { children })
933
- }
934
- )
935
- }) }, child.value);
936
- })
937
- },
938
- opt.label
939
- );
940
- })
956
+ ),
957
+ /* @__PURE__ */ jsxRuntime.jsx(designSystem.Field.Hint, {})
958
+ ]
941
959
  }
942
960
  );
943
961
  };
944
- const NestedOption = styled__default.default(designSystem.MultiSelectOption)`
945
- padding-left: ${({ theme }) => theme.spaces[7]};
946
- `;
947
- const ContentTypeTakeNotice = styled__default.default(designSystem.Typography)`
948
- font-style: italic;
949
- `;
950
962
  const WORKFLOW_SCHEMA = yup__namespace.object({
951
963
  contentTypes: yup__namespace.array().of(yup__namespace.string()),
952
964
  name: yup__namespace.string().max(255, {
953
965
  id: "review-workflows.validation.name.max-length",
954
966
  defaultMessage: "Name can not be longer than 255 characters"
955
- }).required(),
967
+ }).required().nullable(),
956
968
  stages: yup__namespace.array().of(
957
969
  yup__namespace.object().shape({
958
- name: yup__namespace.string().required({
970
+ name: yup__namespace.string().nullable().required({
959
971
  id: "review-workflows.validation.stage.name",
960
972
  defaultMessage: "Name is required"
961
973
  }).max(255, {
@@ -972,7 +984,7 @@ const WORKFLOW_SCHEMA = yup__namespace.object({
972
984
  return stages.filter((stage) => stage.name === stageName).length === 1;
973
985
  }
974
986
  ),
975
- color: yup__namespace.string().required({
987
+ color: yup__namespace.string().nullable().required({
976
988
  id: "review-workflows.validation.stage.color",
977
989
  defaultMessage: "Color is required"
978
990
  }).matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
@@ -989,7 +1001,8 @@ const WORKFLOW_SCHEMA = yup__namespace.object({
989
1001
  })
990
1002
  ).strict()
991
1003
  })
992
- ).min(1)
1004
+ ).min(1),
1005
+ stageRequiredToPublish: yup__namespace.string().nullable()
993
1006
  });
994
1007
  const EditPage = () => {
995
1008
  const { id = "" } = reactRouterDom.useParams();
@@ -998,7 +1011,6 @@ const EditPage = () => {
998
1011
  const { _unstableFormatValidationErrors: formatValidationErrors } = strapiAdmin.useAPIErrorHandler();
999
1012
  const navigate = reactRouterDom.useNavigate();
1000
1013
  const { toggleNotification } = strapiAdmin.useNotification();
1001
- const dispatch = reactRedux.useDispatch();
1002
1014
  const {
1003
1015
  isLoading: isLoadingWorkflow,
1004
1016
  meta,
@@ -1006,7 +1018,7 @@ const EditPage = () => {
1006
1018
  error,
1007
1019
  update,
1008
1020
  create
1009
- } = Layout.useReviewWorkflows({ id: isCreatingWorkflow ? void 0 : id });
1021
+ } = Layout.useReviewWorkflows();
1010
1022
  const permissions = index.useTypedSelector(
1011
1023
  (state) => state.admin_app.permissions["settings"]?.["review-workflows"]
1012
1024
  );
@@ -1023,13 +1035,17 @@ const EditPage = () => {
1023
1035
  const stagesPerWorkflow = limits?.[index.CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME];
1024
1036
  const submitForm = async (data, helpers) => {
1025
1037
  try {
1038
+ const { stageRequiredToPublish, ...rest } = data;
1039
+ const stageRequiredToPublishName = stageRequiredToPublish === "" ? null : rest.stages.find(
1040
+ (stage) => stage.id === Number(stageRequiredToPublish) || stage.__temp_key__ === stageRequiredToPublish
1041
+ )?.name;
1026
1042
  if (!isCreatingWorkflow) {
1027
1043
  const res = await update(id, {
1028
- ...data,
1044
+ ...rest,
1029
1045
  // compare permissions of stages and only submit them if at least one has
1030
1046
  // changed; this enables partial updates e.g. for users who don't have
1031
1047
  // permissions to see roles
1032
- stages: data.stages.map((stage) => {
1048
+ stages: rest.stages.map((stage) => {
1033
1049
  let hasUpdatedPermissions = true;
1034
1050
  const serverStage = currentWorkflow?.stages?.find(
1035
1051
  (serverStage2) => serverStage2.id === stage?.id
@@ -1045,40 +1061,21 @@ const EditPage = () => {
1045
1061
  ...stage,
1046
1062
  permissions: hasUpdatedPermissions ? stage.permissions : void 0
1047
1063
  };
1048
- })
1064
+ }),
1065
+ stageRequiredToPublishName
1049
1066
  });
1050
1067
  if ("error" in res && index.isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1051
1068
  helpers.setErrors(formatValidationErrors(res.error));
1052
- } else if ("data" in res) {
1053
- for (const uid of res.data.contentTypes) {
1054
- dispatch({
1055
- type: "contentManagerApi/invalidateTags",
1056
- payload: [
1057
- {
1058
- type: "ContentTypesConfiguration",
1059
- id: uid
1060
- }
1061
- ]
1062
- });
1063
- }
1064
1069
  }
1065
1070
  } else {
1066
- const res = await create(data);
1071
+ const res = await create({
1072
+ ...rest,
1073
+ stageRequiredToPublishName
1074
+ });
1067
1075
  if ("error" in res && index.isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1068
1076
  helpers.setErrors(formatValidationErrors(res.error));
1069
1077
  } else if ("data" in res) {
1070
- for (const uid of res.data.contentTypes) {
1071
- dispatch({
1072
- type: "contentManagerApi/invalidateTags",
1073
- payload: [
1074
- {
1075
- type: "ContentTypesConfiguration",
1076
- id: uid
1077
- }
1078
- ]
1079
- });
1080
- }
1081
- navigate(`../${res.data.id}`);
1078
+ navigate(`../${res.data.id}`, { replace: true });
1082
1079
  }
1083
1080
  }
1084
1081
  } catch (error2) {
@@ -1142,13 +1139,15 @@ const EditPage = () => {
1142
1139
  return {
1143
1140
  name: "",
1144
1141
  stages: [],
1145
- contentTypes: []
1142
+ contentTypes: [],
1143
+ stageRequiredToPublish: ""
1146
1144
  };
1147
1145
  } else {
1148
1146
  return {
1149
1147
  name: currentWorkflow.name,
1150
1148
  stages: addTmpKeysToStages(currentWorkflow.stages),
1151
- contentTypes: currentWorkflow.contentTypes
1149
+ contentTypes: currentWorkflow.contentTypes,
1150
+ stageRequiredToPublish: currentWorkflow.stageRequiredToPublish?.id.toString() ?? ""
1152
1151
  };
1153
1152
  }
1154
1153
  }, [currentWorkflow, isCreatingWorkflow]);
@@ -1171,13 +1170,12 @@ const EditPage = () => {
1171
1170
  /* @__PURE__ */ jsxRuntime.jsx(
1172
1171
  Layout.Header,
1173
1172
  {
1174
- navigationAction: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, {}),
1173
+ navigationAction: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.BackButton, { fallback: ".." }),
1175
1174
  primaryAction: canUpdate || canCreate ? /* @__PURE__ */ jsxRuntime.jsx(
1176
1175
  designSystem.Button,
1177
1176
  {
1178
1177
  startIcon: /* @__PURE__ */ jsxRuntime.jsx(icons.Check, {}),
1179
1178
  type: "submit",
1180
- size: "M",
1181
1179
  disabled: !modified || isSubmitting || values.stages.length === 0,
1182
1180
  loading: !Boolean(Object.keys(savePrompts).length > 0) && isSubmitting,
1183
1181
  children: formatMessage({
@@ -1200,23 +1198,22 @@ const EditPage = () => {
1200
1198
  }
1201
1199
  ),
1202
1200
  /* @__PURE__ */ jsxRuntime.jsx(Layout.Root, { children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { alignItems: "stretch", direction: "column", gap: 7, children: [
1203
- /* @__PURE__ */ jsxRuntime.jsx(WorkflowAttributes, { canUpdate }),
1201
+ /* @__PURE__ */ jsxRuntime.jsx(WorkflowAttributes, { canUpdate: canUpdate || canCreate }),
1204
1202
  /* @__PURE__ */ jsxRuntime.jsx(
1205
1203
  Stages,
1206
1204
  {
1207
1205
  canDelete,
1208
- canUpdate,
1206
+ canUpdate: canUpdate || canCreate,
1209
1207
  isCreating: isCreatingWorkflow
1210
1208
  }
1211
1209
  )
1212
1210
  ] }) }),
1213
1211
  /* @__PURE__ */ jsxRuntime.jsx(
1214
- strapiAdmin.ConfirmDialog,
1212
+ designSystem.Dialog.Root,
1215
1213
  {
1216
- isOpen: Object.keys(savePrompts).length > 0,
1217
- onClose: handleConfirmClose,
1218
- onConfirm: handleConfirmDeleteDialog(values, { setErrors }),
1219
- children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 5, children: [
1214
+ open: Object.keys(savePrompts).length > 0,
1215
+ onOpenChange: handleConfirmClose,
1216
+ children: /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.ConfirmDialog, { onConfirm: handleConfirmDeleteDialog(values, { setErrors }), children: /* @__PURE__ */ jsxRuntime.jsxs(designSystem.Flex, { direction: "column", gap: 5, children: [
1220
1217
  savePrompts.hasDeletedServerStages && /* @__PURE__ */ jsxRuntime.jsx(designSystem.Typography, { textAlign: "center", variant: "omega", children: formatMessage({
1221
1218
  id: "review-workflows.page.delete.confirm.stages.body",
1222
1219
  defaultMessage: "All entries assigned to deleted stages will be moved to the previous stage."
@@ -1228,7 +1225,7 @@ const EditPage = () => {
1228
1225
  },
1229
1226
  {
1230
1227
  count: contentTypesFromOtherWorkflows?.filter(
1231
- (contentType) => currentWorkflow?.contentTypes?.includes(contentType)
1228
+ (contentType) => values.contentTypes.includes(contentType)
1232
1229
  ).length ?? 0
1233
1230
  }
1234
1231
  ) }),
@@ -1236,7 +1233,7 @@ const EditPage = () => {
1236
1233
  id: "review-workflows.page.delete.confirm.confirm",
1237
1234
  defaultMessage: "Are you sure you want to save?"
1238
1235
  }) })
1239
- ] })
1236
+ ] }) })
1240
1237
  }
1241
1238
  )
1242
1239
  ] })
@@ -1245,8 +1242,8 @@ const EditPage = () => {
1245
1242
  /* @__PURE__ */ jsxRuntime.jsxs(
1246
1243
  index.LimitsModal.Root,
1247
1244
  {
1248
- isOpen: showLimitModal === "workflow",
1249
- onClose: () => setShowLimitModal(null),
1245
+ open: showLimitModal === "workflow",
1246
+ onOpenChange: () => setShowLimitModal(null),
1250
1247
  children: [
1251
1248
  /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Title, { children: formatMessage({
1252
1249
  id: "review-workflows.edit.page.workflows.limit.title",
@@ -1259,16 +1256,23 @@ const EditPage = () => {
1259
1256
  ]
1260
1257
  }
1261
1258
  ),
1262
- /* @__PURE__ */ jsxRuntime.jsxs(index.LimitsModal.Root, { isOpen: showLimitModal === "stage", onClose: () => setShowLimitModal(null), children: [
1263
- /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Title, { children: formatMessage({
1264
- id: "review-workflows.edit.page.stages.limit.title",
1265
- defaultMessage: "You have reached the limit of stages for this workflow in your plan"
1266
- }) }),
1267
- /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Body, { children: formatMessage({
1268
- id: "review-workflows.edit.page.stages.limit.body",
1269
- defaultMessage: "Try deleting some stages or contact Sales to enable more stages."
1270
- }) })
1271
- ] })
1259
+ /* @__PURE__ */ jsxRuntime.jsxs(
1260
+ index.LimitsModal.Root,
1261
+ {
1262
+ open: showLimitModal === "stage",
1263
+ onOpenChange: () => setShowLimitModal(null),
1264
+ children: [
1265
+ /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Title, { children: formatMessage({
1266
+ id: "review-workflows.edit.page.stages.limit.title",
1267
+ defaultMessage: "You have reached the limit of stages for this workflow in your plan"
1268
+ }) }),
1269
+ /* @__PURE__ */ jsxRuntime.jsx(index.LimitsModal.Body, { children: formatMessage({
1270
+ id: "review-workflows.edit.page.stages.limit.body",
1271
+ defaultMessage: "Try deleting some stages or contact Sales to enable more stages."
1272
+ }) })
1273
+ ]
1274
+ }
1275
+ )
1272
1276
  ] });
1273
1277
  };
1274
1278
  const addTmpKeysToStages = (data) => {
@@ -1290,4 +1294,4 @@ const ProtectedEditPage = () => {
1290
1294
  return /* @__PURE__ */ jsxRuntime.jsx(strapiAdmin.Page.Protect, { permissions, children: /* @__PURE__ */ jsxRuntime.jsx(EditPage, {}) });
1291
1295
  };
1292
1296
  exports.ProtectedEditPage = ProtectedEditPage;
1293
- //# sourceMappingURL=_id-BDSg16su.js.map
1297
+ //# sourceMappingURL=id-StiN3nkI.js.map