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

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