@strapi/review-workflows 0.0.0-experimental.9df68962083938acba06546a7901c68a63266aec → 0.0.0-experimental.a13c58eec89ab119f0e381fb79c0252979e9c125

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 (81) hide show
  1. package/LICENSE +12 -17
  2. package/dist/_chunks/{Layout-D292CXD6.mjs → Layout-BIIxkAtf.mjs} +9 -10
  3. package/dist/_chunks/Layout-BIIxkAtf.mjs.map +1 -0
  4. package/dist/_chunks/{Layout-BWzD-Tfe.js → Layout-BWNbQOes.js} +9 -10
  5. package/dist/_chunks/Layout-BWNbQOes.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-CoX9yljN.js → id-CaHzMdxL.js} +103 -80
  11. package/dist/_chunks/id-CaHzMdxL.js.map +1 -0
  12. package/dist/_chunks/{_id-DqEUzU_u.mjs → id-CtcCl3zh.mjs} +103 -80
  13. package/dist/_chunks/id-CtcCl3zh.mjs.map +1 -0
  14. package/dist/_chunks/{index-D-KMrml_.js → index-BX5MyocW.js} +79 -68
  15. package/dist/_chunks/index-BX5MyocW.js.map +1 -0
  16. package/dist/_chunks/{index-udedGkii.mjs → index-ByTEmYbc.mjs} +80 -69
  17. package/dist/_chunks/index-ByTEmYbc.mjs.map +1 -0
  18. package/dist/_chunks/{index-2nkLt-AE.mjs → index-CGmh3cED.mjs} +11 -31
  19. package/dist/_chunks/index-CGmh3cED.mjs.map +1 -0
  20. package/dist/_chunks/{index-CDMcvtW9.js → index-DKLk-Z5E.js} +9 -29
  21. package/dist/_chunks/index-DKLk-Z5E.js.map +1 -0
  22. package/dist/_chunks/{router-C19H1Rju.js → router-Bt6JHY-e.js} +3 -3
  23. package/dist/_chunks/router-Bt6JHY-e.js.map +1 -0
  24. package/dist/_chunks/{router-bmjk-Tpf.mjs → router-Cr3nulh9.mjs} +3 -3
  25. package/dist/_chunks/router-Cr3nulh9.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/services/admin.d.ts +1 -1
  29. package/dist/admin/src/services/api.d.ts +1 -1
  30. package/dist/admin/src/services/content-manager.d.ts +4 -4
  31. package/dist/admin/src/services/settings.d.ts +1739 -9
  32. package/dist/server/index.js +165 -84
  33. package/dist/server/index.js.map +1 -1
  34. package/dist/server/index.mjs +165 -84
  35. package/dist/server/index.mjs.map +1 -1
  36. package/dist/server/src/bootstrap.d.ts.map +1 -1
  37. package/dist/server/src/constants/workflows.d.ts +1 -0
  38. package/dist/server/src/constants/workflows.d.ts.map +1 -1
  39. package/dist/server/src/content-types/index.d.ts +6 -0
  40. package/dist/server/src/content-types/index.d.ts.map +1 -1
  41. package/dist/server/src/content-types/workflow/index.d.ts +6 -0
  42. package/dist/server/src/content-types/workflow/index.d.ts.map +1 -1
  43. package/dist/server/src/controllers/assignees.d.ts.map +1 -1
  44. package/dist/server/src/controllers/index.d.ts +0 -1
  45. package/dist/server/src/controllers/index.d.ts.map +1 -1
  46. package/dist/server/src/controllers/stages.d.ts.map +1 -1
  47. package/dist/server/src/controllers/workflows.d.ts +0 -7
  48. package/dist/server/src/controllers/workflows.d.ts.map +1 -1
  49. package/dist/server/src/index.d.ts +16 -4
  50. package/dist/server/src/index.d.ts.map +1 -1
  51. package/dist/server/src/register.d.ts.map +1 -1
  52. package/dist/server/src/routes/review-workflows.d.ts.map +1 -1
  53. package/dist/server/src/services/document-service-middleware.d.ts +1 -0
  54. package/dist/server/src/services/document-service-middleware.d.ts.map +1 -1
  55. package/dist/server/src/services/index.d.ts +4 -3
  56. package/dist/server/src/services/index.d.ts.map +1 -1
  57. package/dist/server/src/services/metrics/index.d.ts +4 -4
  58. package/dist/server/src/services/metrics/index.d.ts.map +1 -1
  59. package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
  60. package/dist/server/src/services/stages.d.ts +2 -7
  61. package/dist/server/src/services/stages.d.ts.map +1 -1
  62. package/dist/server/src/services/workflows.d.ts.map +1 -1
  63. package/dist/server/src/validation/review-workflows.d.ts +4 -0
  64. package/dist/server/src/validation/review-workflows.d.ts.map +1 -1
  65. package/dist/shared/contracts/review-workflows.d.ts +9 -17
  66. package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
  67. package/package.json +10 -10
  68. package/dist/_chunks/Layout-BWzD-Tfe.js.map +0 -1
  69. package/dist/_chunks/Layout-D292CXD6.mjs.map +0 -1
  70. package/dist/_chunks/_id-CoX9yljN.js.map +0 -1
  71. package/dist/_chunks/_id-DqEUzU_u.mjs.map +0 -1
  72. package/dist/_chunks/en-D9ZrQAV6.mjs.map +0 -1
  73. package/dist/_chunks/en-xcewH2pC.js.map +0 -1
  74. package/dist/_chunks/index-2nkLt-AE.mjs.map +0 -1
  75. package/dist/_chunks/index-CDMcvtW9.js.map +0 -1
  76. package/dist/_chunks/index-D-KMrml_.js.map +0 -1
  77. package/dist/_chunks/index-udedGkii.mjs.map +0 -1
  78. package/dist/_chunks/router-C19H1Rju.js.map +0 -1
  79. package/dist/_chunks/router-bmjk-Tpf.mjs.map +0 -1
  80. package/strapi-server.js +0 -3
  81. /package/dist/admin/src/routes/settings/{:id.d.ts → id.d.ts} +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"id-CaHzMdxL.js","sources":["../../admin/src/services/admin.ts","../../admin/src/routes/settings/hooks/useKeyboardDragAndDrop.ts","../../admin/src/routes/settings/hooks/useDragAndDrop.ts","../../admin/src/routes/settings/components/AddStage.tsx","../../admin/src/routes/settings/components/Stages.tsx","../../admin/src/routes/settings/components/WorkflowAttributes.tsx","../../admin/src/routes/settings/id.tsx"],"sourcesContent":["import { SanitizedAdminUser } from '@strapi/admin/strapi-admin';\n\nimport { reviewWorkflowsApi } from './api';\n\ntype Roles = SanitizedAdminUser['roles'];\ntype RolesResponse = { data: Roles };\n\nconst adminApi = reviewWorkflowsApi.injectEndpoints({\n endpoints(builder) {\n return {\n getAdminRoles: builder.query<Roles, void>({\n query: () => ({\n url: `/admin/roles`,\n method: 'GET',\n }),\n transformResponse: (res: RolesResponse) => {\n return res.data;\n },\n }),\n };\n },\n});\n\nconst { useGetAdminRolesQuery } = adminApi;\n\nexport { useGetAdminRolesQuery };\nexport type { SanitizedAdminUser, Roles };\n","import * as React from 'react';\n\nexport type UseKeyboardDragAndDropCallbacks<TIndex extends number | Array<number> = number> = {\n onCancel?: (index: TIndex) => void;\n onDropItem?: (currentIndex: TIndex, newIndex?: TIndex) => void;\n onGrabItem?: (index: TIndex) => void;\n onMoveItem?: (newIndex: TIndex, currentIndex: TIndex) => void;\n};\n\n/**\n * Utility hook designed to implement keyboard accessibile drag and drop by\n * returning an onKeyDown handler to be passed to the drag icon button.\n *\n * @internal - You should use `useDragAndDrop` instead.\n */\nexport const useKeyboardDragAndDrop = <TIndex extends number | Array<number> = number>(\n active: boolean,\n index: TIndex,\n { onCancel, onDropItem, onGrabItem, onMoveItem }: UseKeyboardDragAndDropCallbacks<TIndex>\n) => {\n const [isSelected, setIsSelected] = React.useState(false);\n\n const handleMove = (movement: 'UP' | 'DOWN') => {\n if (!isSelected) {\n return;\n }\n if (typeof index === 'number' && onMoveItem) {\n if (movement === 'UP') {\n onMoveItem((index - 1) as TIndex, index);\n } else if (movement === 'DOWN') {\n onMoveItem((index + 1) as TIndex, index);\n }\n }\n };\n\n const handleDragClick = () => {\n if (isSelected) {\n if (onDropItem) {\n onDropItem(index);\n }\n setIsSelected(false);\n } else {\n if (onGrabItem) {\n onGrabItem(index);\n }\n setIsSelected(true);\n }\n };\n\n const handleCancel = () => {\n if (isSelected) {\n setIsSelected(false);\n\n if (onCancel) {\n onCancel(index);\n }\n }\n };\n\n const handleKeyDown = <E extends Element>(e: React.KeyboardEvent<E>) => {\n if (!active) {\n return;\n }\n\n if (e.key === 'Tab' && !isSelected) {\n return;\n }\n\n e.preventDefault();\n\n switch (e.key) {\n case ' ':\n case 'Enter':\n handleDragClick();\n break;\n\n case 'Escape':\n handleCancel();\n break;\n\n case 'ArrowDown':\n case 'ArrowRight':\n handleMove('DOWN');\n break;\n\n case 'ArrowUp':\n case 'ArrowLeft':\n handleMove('UP');\n break;\n\n default:\n }\n };\n\n return handleKeyDown;\n};\n","import * as React from 'react';\n\nimport {\n useDrag,\n useDrop,\n type HandlerManager,\n type ConnectDragSource,\n type ConnectDropTarget,\n type ConnectDragPreview,\n type DragSourceMonitor,\n} from 'react-dnd';\n\nimport {\n useKeyboardDragAndDrop,\n type UseKeyboardDragAndDropCallbacks,\n} from './useKeyboardDragAndDrop';\n\nimport type { Data } from '@strapi/types';\n\nconst DIRECTIONS = {\n UPWARD: 'upward',\n DOWNWARD: 'downward',\n} as const;\n\nconst DROP_SENSITIVITY = {\n REGULAR: 'regular',\n IMMEDIATE: 'immediate',\n} as const;\n\ninterface UseDragAndDropOptions<\n TIndex extends number | Array<number> = number,\n TItem extends { index: TIndex } = { index: TIndex },\n> extends UseKeyboardDragAndDropCallbacks<TIndex> {\n type?: string;\n index: TIndex;\n item?: TItem;\n onStart?: () => void;\n onEnd?: () => void;\n dropSensitivity?: (typeof DROP_SENSITIVITY)[keyof typeof DROP_SENSITIVITY];\n}\n\ntype Identifier = ReturnType<HandlerManager['getHandlerId']>;\n\ntype UseDragAndDropReturn<E extends Element = HTMLElement> = [\n props: {\n handlerId: Identifier;\n isDragging: boolean;\n handleKeyDown: <E extends Element>(event: React.KeyboardEvent<E>) => void;\n isOverDropTarget: boolean;\n direction: (typeof DIRECTIONS)[keyof typeof DIRECTIONS] | null;\n },\n objectRef: React.RefObject<E>,\n dropRef: ConnectDropTarget,\n dragRef: ConnectDragSource,\n dragPreviewRef: ConnectDragPreview,\n];\n\ntype DropCollectedProps = {\n handlerId: Identifier;\n isOver: boolean;\n};\n\n/**\n * A utility hook abstracting the general drag and drop hooks from react-dnd.\n * Centralising the same behaviours and by default offering keyboard support.\n */\nconst useDragAndDrop = <\n TIndex extends number | Array<number>,\n TItem extends { index: TIndex; id?: Data.ID; [key: string]: unknown } = {\n index: TIndex;\n [key: string]: unknown;\n },\n E extends Element = HTMLElement,\n>(\n active: boolean,\n {\n type = 'STRAPI_DND',\n index,\n item,\n onStart,\n onEnd,\n onGrabItem,\n onDropItem,\n onCancel,\n onMoveItem,\n dropSensitivity = DROP_SENSITIVITY.REGULAR,\n }: UseDragAndDropOptions<TIndex, TItem>\n): UseDragAndDropReturn<E> => {\n const objectRef = React.useRef<E>(null);\n\n const [{ handlerId, isOver }, dropRef] = useDrop<TItem, void, DropCollectedProps>({\n accept: type,\n collect(monitor) {\n return {\n handlerId: monitor.getHandlerId(),\n isOver: monitor.isOver({ shallow: true }),\n };\n },\n drop(item) {\n const draggedIndex = item.index;\n const newIndex = index;\n\n if (isOver && onDropItem) {\n onDropItem(draggedIndex, newIndex);\n }\n },\n hover(item, monitor) {\n if (!objectRef.current || !onMoveItem) {\n return;\n }\n\n const dragIndex = item.index;\n const newIndex = index;\n\n const hoverBoundingRect = objectRef.current?.getBoundingClientRect();\n const hoverMiddleY = (hoverBoundingRect.bottom - hoverBoundingRect.top) / 2;\n const clientOffset = monitor.getClientOffset();\n if (!clientOffset) return;\n\n const hoverClientY = clientOffset && clientOffset.y - hoverBoundingRect.top;\n if (typeof dragIndex === 'number' && typeof newIndex === 'number') {\n if (dragIndex === newIndex) {\n // Don't replace items with themselves\n return;\n }\n\n if (dropSensitivity === DROP_SENSITIVITY.REGULAR) {\n // Dragging downwards\n if (dragIndex < newIndex && hoverClientY < hoverMiddleY) {\n return;\n }\n\n // Dragging upwards\n if (dragIndex > newIndex && hoverClientY > hoverMiddleY) {\n return;\n }\n }\n\n // Time to actually perform the action\n onMoveItem(newIndex, dragIndex);\n item.index = newIndex;\n } else {\n // Using numbers as indices doesn't work for nested list items with path like [1, 1, 0]\n if (Array.isArray(dragIndex) && Array.isArray(newIndex)) {\n // Indices comparison to find item position in nested list\n const minLength = Math.min(dragIndex.length, newIndex.length);\n let areEqual = true;\n let isLessThan = false;\n let isGreaterThan = false;\n\n for (let i = 0; i < minLength; i++) {\n if (dragIndex[i] < newIndex[i]) {\n isLessThan = true;\n areEqual = false;\n break;\n } else if (dragIndex[i] > newIndex[i]) {\n isGreaterThan = true;\n areEqual = false;\n break;\n }\n }\n\n // Don't replace items with themselves\n if (areEqual && dragIndex.length === newIndex.length) {\n return;\n }\n\n if (dropSensitivity === DROP_SENSITIVITY.REGULAR) {\n // Dragging downwards\n if (isLessThan && !isGreaterThan && hoverClientY < hoverMiddleY) {\n return;\n }\n\n // Dragging upwards\n if (isGreaterThan && !isLessThan && hoverClientY > hoverMiddleY) {\n return;\n }\n }\n }\n\n onMoveItem(newIndex, dragIndex);\n item.index = newIndex;\n }\n },\n });\n\n const getDragDirection = (monitor: DragSourceMonitor<TItem, void>) => {\n if (\n monitor &&\n monitor.isDragging() &&\n !monitor.didDrop() &&\n monitor.getInitialClientOffset() &&\n monitor.getClientOffset()\n ) {\n const deltaY = monitor.getInitialClientOffset()!.y - monitor.getClientOffset()!.y;\n\n if (deltaY > 0) return DIRECTIONS.UPWARD;\n\n if (deltaY < 0) return DIRECTIONS.DOWNWARD;\n\n return null;\n }\n\n return null;\n };\n\n const [{ isDragging, direction }, dragRef, dragPreviewRef] = useDrag({\n type,\n item() {\n if (onStart) {\n onStart();\n }\n\n /**\n * This will be attached and it helps define the preview sizes\n * when a component is flexy e.g. Relations\n */\n const { width } = objectRef.current?.getBoundingClientRect() ?? {};\n\n return { index, width, ...item };\n },\n end() {\n if (onEnd) {\n onEnd();\n }\n },\n canDrag: active,\n /**\n * This is useful when the item is in a virtualized list.\n * However, if we don't have an ID then we want the libraries\n * defaults to take care of this.\n */\n isDragging: item?.id\n ? (monitor) => {\n return item.id === monitor.getItem().id;\n }\n : undefined,\n collect: (monitor) => ({\n isDragging: monitor.isDragging(),\n initialOffset: monitor.getInitialClientOffset(),\n currentOffset: monitor.getClientOffset(),\n direction: getDragDirection(monitor),\n }),\n });\n\n const handleKeyDown = useKeyboardDragAndDrop(active, index, {\n onGrabItem,\n onDropItem,\n onCancel,\n onMoveItem,\n });\n\n return [\n { handlerId, isDragging, handleKeyDown, isOverDropTarget: isOver, direction },\n objectRef,\n dropRef,\n dragRef,\n dragPreviewRef,\n ];\n};\n\nexport {\n useDragAndDrop,\n UseDragAndDropReturn,\n UseDragAndDropOptions,\n DIRECTIONS,\n DROP_SENSITIVITY,\n};\n","import { Box, BoxComponent, ButtonProps, Flex, Typography } from '@strapi/design-system';\nimport { PlusCircle } from '@strapi/icons';\nimport { styled } from 'styled-components';\n\nexport const AddStage = ({ children, ...props }: ButtonProps) => {\n return (\n <StyledButton\n tag=\"button\"\n background=\"neutral0\"\n borderColor=\"neutral150\"\n paddingBottom={3}\n paddingLeft={4}\n paddingRight={4}\n paddingTop={3}\n shadow=\"filterShadow\"\n {...props}\n >\n <Typography variant=\"pi\" fontWeight=\"bold\">\n <Flex tag=\"span\" gap={2}>\n <PlusCircle width=\"2.4rem\" height=\"2.4rem\" aria-hidden />\n {children}\n </Flex>\n </Typography>\n </StyledButton>\n );\n};\n\nconst StyledButton = styled<BoxComponent<'button'>>(Box)`\n border-radius: 26px;\n color: ${({ theme }) => theme.colors.neutral500};\n\n &:hover {\n color: ${({ theme }) => theme.colors.primary600};\n }\n\n &:active {\n color: ${({ theme }) => theme.colors.primary600};\n }\n`;\n","import * as React from 'react';\n\nimport {\n useField,\n useForm,\n useTracking,\n ConfirmDialog,\n useNotification,\n InputRenderer as AdminInputRenderer,\n InputProps,\n} from '@strapi/admin/strapi-admin';\nimport {\n Box,\n Flex,\n MultiSelectOption,\n Accordion,\n Grid,\n IconButton,\n MultiSelect,\n MultiSelectGroup,\n SingleSelect,\n SingleSelectOption,\n TextInput,\n VisuallyHidden,\n useComposedRefs,\n Menu,\n MenuItem,\n Field,\n Dialog,\n} from '@strapi/design-system';\nimport { Duplicate, Drag, More, EyeStriked } from '@strapi/icons';\nimport { getEmptyImage } from 'react-dnd-html5-backend';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { Stage as IStage, StagePermission } from '../../../../../shared/contracts/review-workflows';\nimport { useGetAdminRolesQuery } from '../../../services/admin';\nimport { AVAILABLE_COLORS, getStageColorByHex } from '../../../utils/colors';\nimport { DRAG_DROP_TYPES } from '../constants';\nimport { useDragAndDrop } from '../hooks/useDragAndDrop';\n\nimport { AddStage } from './AddStage';\n\ninterface WorkflowStage extends Pick<IStage, 'id' | 'name' | 'permissions' | 'color'> {\n __temp_key__: string;\n}\n\n/* -------------------------------------------------------------------------------------------------\n * Stages\n * -----------------------------------------------------------------------------------------------*/\ninterface StagesProps {\n canDelete?: boolean;\n canUpdate?: boolean;\n isCreating?: boolean;\n}\n\nconst Stages = ({ canDelete = true, canUpdate = true, isCreating }: StagesProps) => {\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const addFieldRow = useForm('Stages', (state) => state.addFieldRow);\n const { value: stages = [] } = useField<WorkflowStage[]>('stages');\n\n return (\n <Flex direction=\"column\" gap={6} width=\"100%\">\n <Box position=\"relative\" width=\"100%\">\n <Background\n background=\"neutral200\"\n height=\"100%\"\n left=\"50%\"\n position=\"absolute\"\n top=\"0\"\n width={2}\n />\n\n <Flex direction=\"column\" alignItems=\"stretch\" gap={6} position=\"relative\" tag=\"ol\">\n {stages.map((stage, index) => {\n return (\n <Box key={stage.__temp_key__} tag=\"li\">\n <Stage\n index={index}\n canDelete={stages.length > 1 && canDelete}\n canReorder={stages.length > 1}\n canUpdate={canUpdate}\n stagesCount={stages.length}\n defaultOpen={!stage.id}\n {...stage}\n />\n </Box>\n );\n })}\n </Flex>\n </Box>\n\n {canUpdate && (\n <AddStage\n type=\"button\"\n onClick={() => {\n addFieldRow('stages', { name: '' });\n trackUsage('willCreateStage');\n }}\n >\n {formatMessage({\n id: 'Settings.review-workflows.stage.add',\n defaultMessage: 'Add new stage',\n })}\n </AddStage>\n )}\n </Flex>\n );\n};\n\nconst Background = styled(Box)`\n transform: translateX(-50%);\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * Stage\n * -----------------------------------------------------------------------------------------------*/\ninterface StageProps extends WorkflowStage {\n canDelete?: boolean;\n canReorder?: boolean;\n canUpdate?: boolean;\n index: number;\n stagesCount: number;\n defaultOpen?: boolean;\n}\n\nconst Stage = ({\n index,\n canDelete = false,\n canReorder = false,\n canUpdate = false,\n stagesCount,\n name,\n permissions,\n color,\n defaultOpen,\n}: StageProps) => {\n const [liveText, setLiveText] = React.useState<string>();\n const { formatMessage } = useIntl();\n const { trackUsage } = useTracking();\n const stageErrors = useForm('Stages', (state) => state.errors.stages as object[]);\n const error = stageErrors?.[index];\n const addFieldRow = useForm('Stage', (state) => state.addFieldRow);\n const moveFieldRow = useForm('Stage', (state) => state.moveFieldRow);\n const removeFieldRow = useForm('Stage', (state) => state.removeFieldRow);\n\n const getItemPos = (index: number) => `${index + 1} of ${stagesCount}`;\n\n const handleGrabStage = (index: number) => {\n setLiveText(\n formatMessage(\n {\n id: 'dnd.grab-item',\n defaultMessage: `{item}, grabbed. Current position in list: {position}. Press up and down arrow to change position, Spacebar to drop, Escape to cancel.`,\n },\n {\n item: name,\n position: getItemPos(index),\n }\n )\n );\n };\n\n const handleDropStage = (index: number) => {\n setLiveText(\n formatMessage(\n {\n id: 'dnd.drop-item',\n defaultMessage: `{item}, dropped. Final position in list: {position}.`,\n },\n {\n item: name,\n position: getItemPos(index),\n }\n )\n );\n };\n\n const handleCancelDragStage = () => {\n setLiveText(\n formatMessage(\n {\n id: 'dnd.cancel-item',\n defaultMessage: '{item}, dropped. Re-order cancelled.',\n },\n {\n item: name,\n }\n )\n );\n };\n\n const handleMoveStage = (newIndex: number, oldIndex: number) => {\n setLiveText(\n formatMessage(\n {\n id: 'dnd.reorder',\n defaultMessage: '{item}, moved. New position in list: {position}.',\n },\n {\n item: name,\n position: getItemPos(newIndex),\n }\n )\n );\n\n moveFieldRow('stages', oldIndex, newIndex);\n };\n\n const [{ handlerId, isDragging, handleKeyDown }, stageRef, dropRef, dragRef, dragPreviewRef] =\n useDragAndDrop(canReorder, {\n index,\n item: {\n index,\n name,\n },\n onGrabItem: handleGrabStage,\n onDropItem: handleDropStage,\n onMoveItem: handleMoveStage,\n onCancel: handleCancelDragStage,\n type: DRAG_DROP_TYPES.STAGE,\n });\n\n // @ts-expect-error – the stageRef is incorrectly typed.\n const composedRef = useComposedRefs<HTMLDivElement>(stageRef, dropRef);\n\n React.useEffect(() => {\n dragPreviewRef(getEmptyImage(), { captureDraggingState: false });\n }, [dragPreviewRef, index]);\n\n const handleCloneClick = () => {\n addFieldRow('stages', { name, color, permissions });\n };\n\n const id = React.useId();\n\n return (\n <Box ref={composedRef} shadow=\"tableShadow\">\n {liveText && <VisuallyHidden aria-live=\"assertive\">{liveText}</VisuallyHidden>}\n\n {isDragging ? (\n <Box\n background=\"primary100\"\n borderStyle=\"dashed\"\n borderColor=\"primary600\"\n borderWidth=\"1px\"\n display=\"block\"\n hasRadius\n padding={6}\n />\n ) : (\n <AccordionRoot\n onValueChange={(value) => {\n if (value) {\n trackUsage('willEditStage');\n }\n }}\n defaultValue={defaultOpen ? id : undefined}\n $error={Object.values(error ?? {}).length > 0}\n >\n <Accordion.Item value={id}>\n <Accordion.Header>\n <Accordion.Trigger>{name}</Accordion.Trigger>\n <Accordion.Actions>\n {canDelete || canUpdate ? (\n <>\n <Menu.Root>\n <ContextMenuTrigger size=\"S\" endIcon={null} paddingLeft={2} paddingRight={2}>\n <More aria-hidden focusable={false} />\n <VisuallyHidden tag=\"span\">\n {formatMessage({\n id: '[tbdb].components.DynamicZone.more-actions',\n defaultMessage: 'More actions',\n })}\n </VisuallyHidden>\n </ContextMenuTrigger>\n {/* z-index needs to be as big as the one defined for the wrapper in Stages, otherwise the menu\n * disappears behind the accordion\n */}\n <Menu.Content popoverPlacement=\"bottom-end\" zIndex={2}>\n <Menu.SubRoot>\n {canUpdate && (\n <MenuItem onClick={handleCloneClick}>\n {formatMessage({\n id: 'Settings.review-workflows.stage.delete',\n defaultMessage: 'Duplicate stage',\n })}\n </MenuItem>\n )}\n\n {canDelete && (\n <DeleteMenuItem onClick={() => removeFieldRow('stages', index)}>\n {formatMessage({\n id: 'Settings.review-workflows.stage.delete',\n defaultMessage: 'Delete',\n })}\n </DeleteMenuItem>\n )}\n </Menu.SubRoot>\n </Menu.Content>\n </Menu.Root>\n\n {canUpdate && (\n <IconButton\n background=\"transparent\"\n hasRadius\n variant=\"ghost\"\n data-handler-id={handlerId}\n ref={dragRef}\n label={formatMessage({\n id: 'Settings.review-workflows.stage.drag',\n defaultMessage: 'Drag',\n })}\n onClick={(e) => e.stopPropagation()}\n onKeyDown={handleKeyDown}\n >\n <Drag />\n </IconButton>\n )}\n </>\n ) : null}\n </Accordion.Actions>\n </Accordion.Header>\n <Accordion.Content>\n <Grid.Root gap={4} padding={6}>\n {[\n {\n disabled: !canUpdate,\n label: formatMessage({\n id: 'Settings.review-workflows.stage.name.label',\n defaultMessage: 'Stage name',\n }),\n name: `stages.${index}.name`,\n required: true,\n size: 6,\n type: 'string' as const,\n },\n {\n disabled: !canUpdate,\n label: formatMessage({\n id: 'content-manager.reviewWorkflows.stage.color',\n defaultMessage: 'Color',\n }),\n name: `stages.${index}.color`,\n required: true,\n size: 6,\n type: 'color' as const,\n },\n {\n disabled: !canUpdate,\n label: formatMessage({\n id: 'Settings.review-workflows.stage.permissions.label',\n defaultMessage: 'Roles that can change this stage',\n }),\n name: `stages.${index}.permissions`,\n placeholder: formatMessage({\n id: 'Settings.review-workflows.stage.permissions.placeholder',\n defaultMessage: 'Select a role',\n }),\n required: true,\n size: 6,\n type: 'permissions' as const,\n },\n ].map(({ size, ...field }) => (\n <Grid.Item key={field.name} col={size} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer {...field} />\n </Grid.Item>\n ))}\n </Grid.Root>\n </Accordion.Content>\n </Accordion.Item>\n </AccordionRoot>\n )}\n </Box>\n );\n};\n\nconst AccordionRoot = styled(Accordion.Root)<{ $error?: boolean }>`\n border: 1px solid\n ${({ theme, $error }) => ($error ? theme.colors.danger600 : theme.colors.neutral200)};\n`;\n\nconst DeleteMenuItem = styled(MenuItem)`\n color: ${({ theme }) => theme.colors.danger600};\n`;\n\n// Removing the font-size from the child-span aligns the\n// more icon vertically\nconst ContextMenuTrigger = styled(Menu.Trigger)`\n :hover,\n :focus {\n background-color: ${({ theme }) => theme.colors.neutral100};\n }\n\n > span {\n font-size: 0;\n }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * InputRenderer\n * -----------------------------------------------------------------------------------------------*/\n\ntype InputRendererProps = InputProps | ColorSelectorProps | PermissionsFieldProps;\n\nconst InputRenderer = (props: InputRendererProps) => {\n switch (props.type) {\n case 'color':\n return <ColorSelector {...props} />;\n case 'permissions':\n return <PermissionsField {...props} />;\n default:\n return <AdminInputRenderer {...props} />;\n }\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ColorSelector\n * -----------------------------------------------------------------------------------------------*/\n\ninterface ColorSelectorProps\n extends Omit<Extract<InputProps, { type: 'enumeration' }>, 'type' | 'options'> {\n type: 'color';\n}\n\nconst ColorSelector = ({ disabled, label, name, required }: ColorSelectorProps) => {\n const { formatMessage } = useIntl();\n const { value, error, onChange } = useField<string>(name);\n\n const colorOptions = AVAILABLE_COLORS.map(({ hex, name }) => ({\n value: hex,\n label: formatMessage(\n {\n id: 'Settings.review-workflows.stage.color.name',\n defaultMessage: '{name}',\n },\n { name }\n ),\n color: hex,\n }));\n\n const { themeColorName } = getStageColorByHex(value) ?? {};\n\n return (\n <Field.Root error={error} name={name} required={required}>\n <Field.Label>{label}</Field.Label>\n <SingleSelect\n disabled={disabled}\n onChange={(v) => {\n onChange(name, v.toString());\n }}\n value={value?.toUpperCase()}\n startIcon={\n <Flex\n tag=\"span\"\n height={2}\n background={value}\n borderColor={themeColorName === 'neutral0' ? 'neutral150' : 'transparent'}\n hasRadius\n shrink={0}\n width={2}\n />\n }\n >\n {colorOptions.map(({ value, label, color }) => {\n const { themeColorName } = getStageColorByHex(color) || {};\n\n return (\n <SingleSelectOption\n value={value}\n key={value}\n startIcon={\n <Flex\n tag=\"span\"\n height={2}\n background={color}\n borderColor={themeColorName === 'neutral0' ? 'neutral150' : 'transparent'}\n hasRadius\n shrink={0}\n width={2}\n />\n }\n >\n {label}\n </SingleSelectOption>\n );\n })}\n </SingleSelect>\n <Field.Error />\n </Field.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * PermissionsField\n * -----------------------------------------------------------------------------------------------*/\ninterface PermissionsFieldProps\n extends Omit<Extract<InputProps, { type: 'enumeration' }>, 'type' | 'options'> {\n type: 'permissions';\n}\n\nconst PermissionsField = ({ disabled, name, placeholder, required }: PermissionsFieldProps) => {\n const { formatMessage } = useIntl();\n const { toggleNotification } = useNotification();\n const [isApplyAllConfirmationOpen, setIsApplyAllConfirmationOpen] = React.useState(false);\n const { value = [], error, onChange } = useField<StagePermission[]>(name);\n const allStages = useForm<WorkflowStage[]>('PermissionsField', (state) => state.values.stages);\n const onFormValueChange = useForm('PermissionsField', (state) => state.onChange);\n const rolesErrorCount = React.useRef(0);\n\n const { data: roles = [], isLoading, error: getRolesError } = useGetAdminRolesQuery();\n\n // Super admins always have permissions to do everything and therefore\n // there is no point for this role to show up in the role combobox\n const filteredRoles = roles?.filter((role) => role.code !== 'strapi-super-admin') ?? [];\n\n React.useEffect(() => {\n if (\n !isLoading &&\n getRolesError &&\n 'status' in getRolesError &&\n getRolesError.status == 403 &&\n rolesErrorCount.current === 0\n ) {\n rolesErrorCount.current = 1;\n\n toggleNotification({\n blockTransition: true,\n type: 'danger',\n message: formatMessage({\n id: 'review-workflows.stage.permissions.noPermissions.description',\n defaultMessage: 'You don’t have the permission to see roles. Contact your administrator.',\n }),\n });\n }\n }, [formatMessage, isLoading, roles, toggleNotification, getRolesError]);\n\n if (!isLoading && filteredRoles.length === 0) {\n return (\n <Field.Root\n name={name}\n hint={formatMessage({\n id: 'Settings.review-workflows.stage.permissions.noPermissions.description',\n defaultMessage: 'You don’t have the permission to see roles',\n })}\n required={required}\n >\n <Field.Label>\n {formatMessage({\n id: 'Settings.review-workflows.stage.permissions.label',\n defaultMessage: 'Roles that can change this stage',\n })}\n </Field.Label>\n <TextInput\n disabled\n placeholder={formatMessage({\n id: 'components.NotAllowedInput.text',\n defaultMessage: 'No permissions to see this field',\n })}\n startAction={<EyeStriked fill=\"neutral600\" />}\n type=\"text\"\n value=\"\"\n />\n <Field.Hint />\n </Field.Root>\n );\n }\n\n return (\n <>\n <Flex alignItems=\"flex-end\" gap={3}>\n <PermissionWrapper grow={1}>\n <Field.Root error={error} name={name} required>\n <Field.Label>\n {formatMessage({\n id: 'Settings.review-workflows.stage.permissions.label',\n defaultMessage: 'Roles that can change this stage',\n })}\n </Field.Label>\n <MultiSelect\n disabled={disabled}\n onChange={(values) => {\n // Because the select components expects strings for values, but\n // the yup schema validates we are sending full permission objects to the API,\n // we must coerce the string value back to an object\n const permissions = values.map((value) => ({\n role: parseInt(value, 10),\n action: 'admin::review-workflows.stage.transition',\n }));\n\n onChange(name, permissions);\n }}\n placeholder={placeholder}\n // The Select component expects strings for values\n value={value.map((permission) => `${permission.role}`)}\n withTags\n >\n <MultiSelectGroup\n label={formatMessage({\n id: 'Settings.review-workflows.stage.permissions.allRoles.label',\n defaultMessage: 'All roles',\n })}\n values={filteredRoles.map((r) => `${r.id}`)}\n >\n {filteredRoles.map((role) => {\n return (\n <NestedOption key={role.id} value={`${role.id}`}>\n {role.name}\n </NestedOption>\n );\n })}\n </MultiSelectGroup>\n </MultiSelect>\n <Field.Error />\n </Field.Root>\n </PermissionWrapper>\n <Dialog.Root open={isApplyAllConfirmationOpen} onOpenChange={setIsApplyAllConfirmationOpen}>\n <Dialog.Trigger>\n <IconButton\n disabled={disabled}\n label={formatMessage({\n id: 'Settings.review-workflows.stage.permissions.apply.label',\n defaultMessage: 'Apply to all stages',\n })}\n size=\"L\"\n >\n <Duplicate />\n </IconButton>\n </Dialog.Trigger>\n <ConfirmDialog\n onConfirm={() => {\n onFormValueChange(\n 'stages',\n allStages.map((stage) => ({\n ...stage,\n permissions: value,\n }))\n );\n\n setIsApplyAllConfirmationOpen(false);\n toggleNotification({\n type: 'success',\n message: formatMessage({\n id: 'Settings.review-workflows.page.edit.confirm.stages.permissions.copy.success',\n defaultMessage: 'Applied roles to all other stages of the workflow',\n }),\n });\n }}\n variant=\"default\"\n >\n {formatMessage({\n id: 'Settings.review-workflows.page.edit.confirm.stages.permissions.copy',\n defaultMessage:\n 'Roles that can change that stage will be applied to all the other stages.',\n })}\n </ConfirmDialog>\n </Dialog.Root>\n </Flex>\n </>\n );\n};\n\nconst NestedOption = styled(MultiSelectOption)`\n padding-left: ${({ theme }) => theme.spaces[7]};\n`;\n\n// Grow the size of the permission Select\nconst PermissionWrapper = styled(Flex)`\n > * {\n flex-grow: 1;\n }\n`;\n\nexport { Stages };\nexport type { StagesProps, WorkflowStage };\n","import { InputRenderer, useField, useForm } from '@strapi/admin/strapi-admin';\nimport {\n Field,\n Grid,\n MultiSelect,\n MultiSelectGroup,\n MultiSelectOption,\n Typography,\n useCollator,\n SingleSelect,\n SingleSelectOption,\n} from '@strapi/design-system';\nimport { useIntl } from 'react-intl';\nimport { styled } from 'styled-components';\n\nimport { useGetContentTypesQuery } from '../../../services/content-manager';\nimport { useReviewWorkflows } from '../hooks/useReviewWorkflows';\n\nimport type { WorkflowStage } from './Stages';\n\n/* -------------------------------------------------------------------------------------------------\n * WorkflowAttributes\n * -----------------------------------------------------------------------------------------------*/\ninterface WorkflowAttributesProps {\n canUpdate?: boolean;\n}\n\nconst WorkflowAttributes = ({ canUpdate = true }: WorkflowAttributesProps) => {\n const { formatMessage } = useIntl();\n\n return (\n <Grid.Root background=\"neutral0\" hasRadius gap={4} padding={6} shadow=\"tableShadow\">\n <Grid.Item col={6} direction=\"column\" alignItems=\"stretch\">\n <InputRenderer\n disabled={!canUpdate}\n label={formatMessage({\n id: 'Settings.review-workflows.workflow.name.label',\n defaultMessage: 'Workflow Name',\n })}\n name=\"name\"\n required\n type=\"string\"\n />\n </Grid.Item>\n <Grid.Item col={6} direction=\"column\" alignItems=\"stretch\">\n <ContentTypesSelector disabled={!canUpdate} />\n </Grid.Item>\n <Grid.Item col={6} direction=\"column\" alignItems=\"stretch\">\n <StageSelector disabled={!canUpdate} />\n </Grid.Item>\n </Grid.Root>\n );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ContentTypesSelector\n * -----------------------------------------------------------------------------------------------*/\ninterface ContentTypesSelectorProps {\n disabled?: boolean;\n}\n\nconst ContentTypesSelector = ({ disabled }: ContentTypesSelectorProps) => {\n const { formatMessage, locale } = useIntl();\n const { data: contentTypes, isLoading } = useGetContentTypesQuery();\n const { workflows } = useReviewWorkflows();\n const currentWorkflow = useForm('ContentTypesSelector', (state) => state.values);\n\n const { error, value, onChange } = useField('contentTypes');\n\n const formatter = useCollator(locale, {\n sensitivity: 'base',\n });\n\n const isDisabled =\n disabled ||\n isLoading ||\n !contentTypes ||\n (contentTypes.collectionType.length === 0 && contentTypes.singleType.length === 0);\n\n const collectionTypes = (contentTypes?.collectionType ?? [])\n .toSorted((a, b) => formatter.compare(a.info.displayName, b.info.displayName))\n .map((contentType) => ({\n label: contentType.info.displayName,\n value: contentType.uid,\n }));\n\n const singleTypes = (contentTypes?.singleType ?? []).map((contentType) => ({\n label: contentType.info.displayName,\n value: contentType.uid,\n }));\n\n return (\n <Field.Root error={error} name={'contentTypes'}>\n <Field.Label>\n {formatMessage({\n id: 'Settings.review-workflows.workflow.contentTypes.label',\n defaultMessage: 'Associated to',\n })}\n </Field.Label>\n <MultiSelect\n customizeContent={(value) =>\n formatMessage(\n {\n id: 'Settings.review-workflows.workflow.contentTypes.displayValue',\n defaultMessage:\n '{count} {count, plural, one {content type} other {content types}} selected',\n },\n { count: value?.length }\n )\n }\n disabled={isDisabled}\n onChange={(values) => {\n onChange('contentTypes', values);\n }}\n value={value}\n placeholder={formatMessage({\n id: 'Settings.review-workflows.workflow.contentTypes.placeholder',\n defaultMessage: 'Select',\n })}\n >\n {[\n ...(collectionTypes.length > 0\n ? [\n {\n label: formatMessage({\n id: 'Settings.review-workflows.workflow.contentTypes.collectionTypes.label',\n defaultMessage: 'Collection Types',\n }),\n children: collectionTypes,\n },\n ]\n : []),\n\n ...(singleTypes.length > 0\n ? [\n {\n label: formatMessage({\n id: 'Settings.review-workflows.workflow.contentTypes.singleTypes.label',\n defaultMessage: 'Single Types',\n }),\n children: singleTypes,\n },\n ]\n : []),\n ].map((opt) => {\n return (\n <MultiSelectGroup\n key={opt.label}\n label={opt.label}\n values={opt.children.map((child) => child.value.toString())}\n >\n {opt.children.map((child) => {\n const { name: assignedWorkflowName } =\n workflows?.find(\n (workflow) =>\n ((currentWorkflow && workflow.id !== currentWorkflow.id) ||\n !currentWorkflow) &&\n workflow.contentTypes.includes(child.value)\n ) ?? {};\n\n return (\n <NestedOption key={child.value} value={child.value}>\n <Typography>\n {\n // @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\n formatMessage(\n {\n id: 'Settings.review-workflows.workflow.contentTypes.assigned.notice',\n defaultMessage:\n '{label} {name, select, undefined {} other {<i>(assigned to <em>{name}</em> workflow)</i>}}',\n },\n {\n label: child.label,\n name: assignedWorkflowName,\n em: (...children) => (\n <Typography tag=\"em\" fontWeight=\"bold\">\n {children}\n </Typography>\n ),\n i: (...children) => (\n <ContentTypeTakeNotice>{children}</ContentTypeTakeNotice>\n ),\n }\n )\n }\n </Typography>\n </NestedOption>\n );\n })}\n </MultiSelectGroup>\n );\n })}\n </MultiSelect>\n </Field.Root>\n );\n};\n\nconst NestedOption = styled(MultiSelectOption)`\n padding-left: ${({ theme }) => theme.spaces[7]};\n`;\n\nconst ContentTypeTakeNotice = styled(Typography)`\n font-style: italic;\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * StageSelector\n * -----------------------------------------------------------------------------------------------*/\ninterface StageSelectorProps {\n disabled?: boolean;\n}\n\nconst StageSelector = ({ disabled }: StageSelectorProps) => {\n const { value: stages = [] } = useField<WorkflowStage[]>('stages');\n const { formatMessage } = useIntl();\n\n const { error, value, onChange } = useField('stageRequiredToPublish');\n\n // stages with empty names are not valid, so we avoid them from being used to avoid errors\n const validStages = stages.filter((stage) => stage.name);\n\n return (\n <Field.Root\n error={error}\n name=\"stageRequiredToPublish\"\n hint={formatMessage({\n id: 'settings.review-workflows.workflow.stageRequiredToPublish.hint',\n defaultMessage:\n 'Prevents entries from being published if they are not at the required stage.',\n })}\n >\n <Field.Label>\n {formatMessage({\n id: 'settings.review-workflows.workflow.stageRequiredToPublish.label',\n defaultMessage: 'Required stage for publishing',\n })}\n </Field.Label>\n <SingleSelect\n disabled={disabled}\n onChange={(value) => {\n onChange('stageRequiredToPublish', value);\n }}\n value={value}\n >\n <SingleSelectOption value={''}>\n {formatMessage({\n id: 'settings.review-workflows.workflow.stageRequiredToPublish.any',\n defaultMessage: 'Any stage',\n })}\n </SingleSelectOption>\n {validStages.map((stage, i) => (\n <SingleSelectOption\n key={`requiredToPublishStage-${stage.id || stage.__temp_key__}`}\n value={stage.id?.toString() || stage.__temp_key__}\n >\n {stage.name}\n </SingleSelectOption>\n ))}\n </SingleSelect>\n <Field.Hint />\n </Field.Root>\n );\n};\n\nexport { WorkflowAttributes };\nexport type { WorkflowAttributesProps };\n","import * as React from 'react';\n\nimport {\n ConfirmDialog,\n BackButton,\n useNotification,\n useAPIErrorHandler,\n useRBAC,\n Form,\n Page,\n FormProps,\n FormHelpers,\n} from '@strapi/admin/strapi-admin';\nimport { useLicenseLimits } from '@strapi/admin/strapi-admin/ee';\nimport { Button, Dialog, Flex, Typography } from '@strapi/design-system';\nimport { Check } from '@strapi/icons';\nimport { generateNKeysBetween } from 'fractional-indexing';\nimport { useIntl } from 'react-intl';\nimport { useNavigate, useParams } from 'react-router-dom';\nimport * as yup from 'yup';\n\nimport { LimitsModal } from '../../components/LimitsModal';\nimport {\n CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME,\n CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME,\n} from '../../constants';\nimport { useTypedSelector } from '../../modules/hooks';\nimport { isBaseQueryError } from '../../utils/api';\n\nimport * as Layout from './components/Layout';\nimport { Stages, WorkflowStage } from './components/Stages';\nimport { WorkflowAttributes } from './components/WorkflowAttributes';\nimport { useReviewWorkflows } from './hooks/useReviewWorkflows';\n\nimport type { Stage, Workflow } from '../../../../shared/contracts/review-workflows';\n\n/* -------------------------------------------------------------------------------------------------\n * EditPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst WORKFLOW_SCHEMA = yup.object({\n contentTypes: yup.array().of(yup.string()),\n name: yup\n .string()\n .max(255, {\n id: 'review-workflows.validation.name.max-length',\n defaultMessage: 'Name can not be longer than 255 characters',\n })\n .required()\n .nullable(),\n stages: yup\n .array()\n .of(\n yup.object().shape({\n name: yup\n .string()\n .nullable()\n .required({\n id: 'review-workflows.validation.stage.name',\n defaultMessage: 'Name is required',\n })\n .max(255, {\n id: 'review-workflows.validation.stage.max-length',\n defaultMessage: 'Name can not be longer than 255 characters',\n })\n .test(\n 'unique-name',\n {\n id: 'review-workflows.validation.stage.duplicate',\n defaultMessage: 'Stage name must be unique',\n },\n (stageName, context) => {\n // @ts-expect-error it does exist.\n const { stages } = context.from[1].value;\n\n return stages.filter((stage: Stage) => stage.name === stageName).length === 1;\n }\n ),\n color: yup\n .string()\n .nullable()\n .required({\n id: 'review-workflows.validation.stage.color',\n defaultMessage: 'Color is required',\n })\n .matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),\n\n permissions: yup\n .array(\n yup.object({\n role: yup\n .number()\n .strict()\n .typeError({\n id: 'review-workflows.validation.stage.permissions.role.number',\n defaultMessage: 'Role must be of type number',\n })\n .required(),\n action: yup.string().required({\n id: 'review-workflows.validation.stage.permissions.action.required',\n defaultMessage: 'Action is a required argument',\n }),\n })\n )\n .strict(),\n })\n )\n .min(1),\n stageRequiredToPublish: yup.string().nullable(),\n});\n\nconst EditPage = () => {\n const { id = '' } = useParams<{ id: string }>();\n const isCreatingWorkflow = id === 'create';\n const { formatMessage } = useIntl();\n const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();\n const navigate = useNavigate();\n const { toggleNotification } = useNotification();\n const {\n isLoading: isLoadingWorkflow,\n meta,\n workflows,\n error,\n update,\n create,\n } = useReviewWorkflows();\n const permissions = useTypedSelector(\n (state) => state.admin_app.permissions['settings']?.['review-workflows']\n );\n const {\n allowedActions: { canDelete, canUpdate, canCreate },\n } = useRBAC(permissions);\n\n const [savePrompts, setSavePrompts] = React.useState<{\n hasDeletedServerStages?: boolean;\n hasReassignedContentTypes?: boolean;\n }>({});\n const { getFeature, isLoading: isLicenseLoading } = useLicenseLimits();\n const [showLimitModal, setShowLimitModal] = React.useState<'workflow' | 'stage' | null>(null);\n\n const currentWorkflow = workflows?.find((workflow) => workflow.id === parseInt(id, 10));\n const contentTypesFromOtherWorkflows = workflows\n ?.filter((workflow) => workflow.id !== parseInt(id, 10))\n .flatMap((workflow) => workflow.contentTypes);\n\n const limits = getFeature<string>('review-workflows');\n const numberOfWorkflows = limits?.[CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME];\n const stagesPerWorkflow = limits?.[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME];\n\n interface FormValues {\n name: string;\n stages: WorkflowStage[];\n contentTypes: string[];\n stageRequiredToPublish: string | null;\n }\n\n const submitForm = async (data: FormValues, helpers: Pick<FormHelpers, 'setErrors'>) => {\n try {\n const { stageRequiredToPublish, ...rest } = data;\n const stageRequiredToPublishName =\n stageRequiredToPublish === ''\n ? null\n : rest.stages.find(\n (stage) =>\n stage.id === Number(stageRequiredToPublish) ||\n stage.__temp_key__ === stageRequiredToPublish\n )?.name;\n\n if (!isCreatingWorkflow) {\n const res = await update(id, {\n ...rest,\n // compare permissions of stages and only submit them if at least one has\n // changed; this enables partial updates e.g. for users who don't have\n // permissions to see roles\n stages: rest.stages.map((stage) => {\n let hasUpdatedPermissions = true;\n const serverStage = currentWorkflow?.stages?.find(\n (serverStage) => serverStage.id === stage?.id\n );\n if (serverStage) {\n hasUpdatedPermissions =\n serverStage.permissions?.length !== stage.permissions?.length ||\n !serverStage.permissions?.every(\n (serverPermission) =>\n !!stage.permissions?.find(\n (permission) => permission.role === serverPermission.role\n )\n );\n }\n return {\n ...stage,\n permissions: hasUpdatedPermissions ? stage.permissions : undefined,\n } satisfies Stage;\n }),\n stageRequiredToPublishName,\n });\n\n if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n helpers.setErrors(formatValidationErrors(res.error));\n }\n } else {\n const res = await create({\n ...rest,\n stageRequiredToPublishName,\n });\n\n if ('error' in res && isBaseQueryError(res.error) && res.error.name === 'ValidationError') {\n helpers.setErrors(formatValidationErrors(res.error));\n } else if ('data' in res) {\n navigate(`../${res.data.id}`, { replace: true });\n }\n }\n } catch (error) {\n toggleNotification({\n type: 'danger',\n message: formatMessage({\n id: 'notification.error',\n defaultMessage: 'An error occurred',\n }),\n });\n }\n setSavePrompts({});\n };\n\n const handleConfirmDeleteDialog =\n (data: FormValues, helpers: Pick<FormHelpers, 'setErrors'>) => async () => {\n await submitForm(data, helpers);\n };\n\n const handleConfirmClose = () => {\n setSavePrompts({});\n };\n\n const handleSubmit: FormProps<FormValues>['onSubmit'] = async (data, helpers) => {\n const isContentTypeReassignment = data.contentTypes.some((contentType) =>\n contentTypesFromOtherWorkflows?.includes(contentType)\n );\n const hasDeletedServerStages =\n !isCreatingWorkflow &&\n !currentWorkflow?.stages.every((stage) =>\n data.stages.some((newStage) => newStage.id === stage.id)\n );\n\n if (meta && numberOfWorkflows && meta?.workflowCount > parseInt(numberOfWorkflows, 10)) {\n /**\n * If the current license has a limit, check if the total count of workflows\n * exceeds that limit and display the limits modal instead of sending the\n * update, because it would throw an API error.\n */\n setShowLimitModal('workflow');\n\n /**\n * If the current license has a limit, check if the total count of stages\n * exceeds that limit and display the limits modal instead of sending the\n * update, because it would throw an API error.\n */\n } else if (\n data.stages &&\n stagesPerWorkflow &&\n data.stages.length > parseInt(stagesPerWorkflow, 10)\n ) {\n setShowLimitModal('stage');\n } else if (hasDeletedServerStages || isContentTypeReassignment) {\n if (hasDeletedServerStages) {\n setSavePrompts((prev) => ({ ...prev, hasDeletedServerStages: true }));\n }\n\n if (isContentTypeReassignment) {\n setSavePrompts((prev) => ({ ...prev, hasReassignedContentTypes: true }));\n }\n } else {\n await submitForm(data, helpers);\n }\n };\n\n /**\n * If the current license has a limit:\n * check if the total count of workflows or stages exceeds that limit and display\n * the limits modal on page load. It can be closed by the user, but the\n * API will throw an error in case they try to create a new workflow or update the\n * stages.\n *\n * If the current license does not have a limit (e.g. offline license):\n * do nothing (for now). In case they are trying to create the 201st workflow/ stage\n * the API will throw an error.\n *\n */\n React.useEffect(() => {\n if (!isLoadingWorkflow && !isLicenseLoading) {\n if (meta && numberOfWorkflows && meta?.workflowCount > parseInt(numberOfWorkflows, 10)) {\n setShowLimitModal('workflow');\n } else if (\n currentWorkflow &&\n currentWorkflow.stages &&\n stagesPerWorkflow &&\n currentWorkflow.stages.length > parseInt(stagesPerWorkflow, 10)\n ) {\n setShowLimitModal('stage');\n }\n }\n }, [\n currentWorkflow,\n isLicenseLoading,\n isLoadingWorkflow,\n limits,\n meta,\n numberOfWorkflows,\n stagesPerWorkflow,\n ]);\n\n const initialValues: FormValues = React.useMemo(() => {\n if (isCreatingWorkflow || !currentWorkflow) {\n return {\n name: '',\n stages: [],\n contentTypes: [],\n stageRequiredToPublish: '',\n };\n } else {\n return {\n name: currentWorkflow.name,\n stages: addTmpKeysToStages(currentWorkflow.stages),\n contentTypes: currentWorkflow.contentTypes,\n stageRequiredToPublish: currentWorkflow.stageRequiredToPublish?.id.toString() ?? '',\n };\n }\n }, [currentWorkflow, isCreatingWorkflow]);\n\n if (isLoadingWorkflow) {\n return <Page.Loading />;\n }\n\n if (error) {\n return <Page.Error />;\n }\n\n return (\n <>\n <Layout.DragLayerRendered />\n\n <Form\n method={isCreatingWorkflow ? 'POST' : 'PUT'}\n initialValues={initialValues}\n validationSchema={WORKFLOW_SCHEMA}\n onSubmit={handleSubmit}\n >\n {({ modified, isSubmitting, values, setErrors }) => (\n <>\n <Layout.Header\n navigationAction={<BackButton />}\n primaryAction={\n canUpdate || canCreate ? (\n <Button\n startIcon={<Check />}\n type=\"submit\"\n disabled={!modified || isSubmitting || values.stages.length === 0}\n // if the confirm dialog is open the loading state is on\n // the confirm button already\n loading={!Boolean(Object.keys(savePrompts).length > 0) && isSubmitting}\n >\n {formatMessage({\n id: 'global.save',\n defaultMessage: 'Save',\n })}\n </Button>\n ) : null\n }\n subtitle={formatMessage(\n {\n id: 'review-workflows.page.subtitle',\n defaultMessage: '{count, plural, one {# stage} other {# stages}}',\n },\n { count: currentWorkflow?.stages?.length ?? 0 }\n )}\n title={\n currentWorkflow?.name ||\n formatMessage({\n id: 'Settings.review-workflows.create.page.title',\n defaultMessage: 'Create Review Workflow',\n })\n }\n />\n <Layout.Root>\n <Flex alignItems=\"stretch\" direction=\"column\" gap={7}>\n <WorkflowAttributes canUpdate={canUpdate || canCreate} />\n <Stages\n canDelete={canDelete}\n canUpdate={canUpdate || canCreate}\n isCreating={isCreatingWorkflow}\n />\n </Flex>\n </Layout.Root>\n <Dialog.Root\n open={Object.keys(savePrompts).length > 0}\n onOpenChange={handleConfirmClose}\n >\n <ConfirmDialog onConfirm={handleConfirmDeleteDialog(values, { setErrors })}>\n <Flex direction=\"column\" gap={5}>\n {savePrompts.hasDeletedServerStages && (\n <Typography textAlign=\"center\" variant=\"omega\">\n {formatMessage({\n id: 'review-workflows.page.delete.confirm.stages.body',\n defaultMessage:\n 'All entries assigned to deleted stages will be moved to the previous stage.',\n })}\n </Typography>\n )}\n\n {savePrompts.hasReassignedContentTypes && (\n <Typography textAlign=\"center\" variant=\"omega\">\n {formatMessage(\n {\n id: 'review-workflows.page.delete.confirm.contentType.body',\n defaultMessage:\n '{count} {count, plural, one {content-type} other {content-types}} {count, plural, one {is} other {are}} already mapped to {count, plural, one {another workflow} other {other workflows}}. If you save changes, {count, plural, one {this} other {these}} {count, plural, one {content-type} other {{count} content-types}} will no more be mapped to the {count, plural, one {another workflow} other {other workflows}} and all corresponding information will be removed.',\n },\n {\n count:\n contentTypesFromOtherWorkflows?.filter((contentType) =>\n values.contentTypes.includes(contentType)\n ).length ?? 0,\n }\n )}\n </Typography>\n )}\n\n <Typography textAlign=\"center\" variant=\"omega\">\n {formatMessage({\n id: 'review-workflows.page.delete.confirm.confirm',\n defaultMessage: 'Are you sure you want to save?',\n })}\n </Typography>\n </Flex>\n </ConfirmDialog>\n </Dialog.Root>\n </>\n )}\n </Form>\n\n <LimitsModal.Root\n open={showLimitModal === 'workflow'}\n onOpenChange={() => setShowLimitModal(null)}\n >\n <LimitsModal.Title>\n {formatMessage({\n id: 'review-workflows.edit.page.workflows.limit.title',\n defaultMessage: 'You’ve reached the limit of workflows in your plan',\n })}\n </LimitsModal.Title>\n\n <LimitsModal.Body>\n {formatMessage({\n id: 'review-workflows.edit.page.workflows.limit.body',\n defaultMessage: 'Delete a workflow or contact Sales to enable more workflows.',\n })}\n </LimitsModal.Body>\n </LimitsModal.Root>\n\n <LimitsModal.Root\n open={showLimitModal === 'stage'}\n onOpenChange={() => setShowLimitModal(null)}\n >\n <LimitsModal.Title>\n {formatMessage({\n id: 'review-workflows.edit.page.stages.limit.title',\n defaultMessage: 'You have reached the limit of stages for this workflow in your plan',\n })}\n </LimitsModal.Title>\n\n <LimitsModal.Body>\n {formatMessage({\n id: 'review-workflows.edit.page.stages.limit.body',\n defaultMessage: 'Try deleting some stages or contact Sales to enable more stages.',\n })}\n </LimitsModal.Body>\n </LimitsModal.Root>\n </>\n );\n};\n\nconst addTmpKeysToStages = (data: Workflow['stages']) => {\n const keys = generateNKeysBetween(undefined, undefined, data.length);\n\n return data.map((datum, index) => ({\n ...datum,\n __temp_key__: keys[index],\n }));\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ProtectedEditPage\n * -----------------------------------------------------------------------------------------------*/\n\nconst ProtectedEditPage = () => {\n const permissions = useTypedSelector((state) => {\n const {\n create = [],\n update = [],\n read = [],\n } = state.admin_app.permissions.settings?.['review-workflows'] ?? {};\n\n return [...create, ...update, ...read];\n });\n\n return (\n <Page.Protect permissions={permissions}>\n <EditPage />\n </Page.Protect>\n );\n};\n\nexport { ProtectedEditPage };\n"],"names":["reviewWorkflowsApi","index","React","useDrop","item","useDrag","jsx","Typography","jsxs","Flex","PlusCircle","styled","Box","useIntl","useTracking","useForm","useField","DRAG_DROP_TYPES","useComposedRefs","getEmptyImage","VisuallyHidden","Accordion","Fragment","Menu","More","MenuItem","IconButton","Drag","Grid","AdminInputRenderer","AVAILABLE_COLORS","name","getStageColorByHex","Field","SingleSelect","value","label","themeColorName","SingleSelectOption","useNotification","TextInput","EyeStriked","MultiSelect","MultiSelectGroup","NestedOption","Dialog","Duplicate","ConfirmDialog","MultiSelectOption","InputRenderer","useGetContentTypesQuery","useReviewWorkflows","useCollator","yup","useParams","useAPIErrorHandler","useNavigate","useTypedSelector","useRBAC","useLicenseLimits","CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME","CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME","serverStage","isBaseQueryError","error","Page","Layout.DragLayerRendered","Form","Layout.Header","BackButton","Button","Check","Layout.Root","LimitsModal","generateNKeysBetween"],"mappings":"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"}
@@ -6,11 +6,10 @@ import { Box, Typography, Flex, Accordion, MenuItem, Menu, MultiSelectOption, us
6
6
  import { PlusCircle, More, Drag, EyeStriked, Duplicate, Check } from "@strapi/icons";
7
7
  import { generateNKeysBetween } from "fractional-indexing";
8
8
  import { useIntl } from "react-intl";
9
- import { useDispatch } from "react-redux";
10
9
  import { useParams, useNavigate } from "react-router-dom";
11
10
  import * as yup from "yup";
12
- import { r as reviewWorkflowsApi, A as AVAILABLE_COLORS, g as getStageColorByHex, u as useGetContentTypesQuery, a as useTypedSelector, C as CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME, b as CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME, L as LimitsModal, i as isBaseQueryError } from "./index-udedGkii.mjs";
13
- import { D as DRAG_DROP_TYPES, u as useReviewWorkflows, a as DragLayerRendered, H as Header, R as Root } from "./Layout-D292CXD6.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-ByTEmYbc.mjs";
12
+ import { D as DRAG_DROP_TYPES, u as useReviewWorkflows, a as DragLayerRendered, H as Header, R as Root } from "./Layout-BIIxkAtf.mjs";
14
13
  import { getEmptyImage } from "react-dnd-html5-backend";
15
14
  import { styled } from "styled-components";
16
15
  import { useDrop, useDrag } from "react-dnd";
@@ -291,35 +290,23 @@ const Stages = ({ canDelete = true, canUpdate = true, isCreating }) => {
291
290
  left: "50%",
292
291
  position: "absolute",
293
292
  top: "0",
294
- width: 2,
295
- zIndex: 1
293
+ width: 2
296
294
  }
297
295
  ),
298
- /* @__PURE__ */ jsx(
299
- Flex,
300
- {
301
- direction: "column",
302
- alignItems: "stretch",
303
- gap: 6,
304
- zIndex: 2,
305
- position: "relative",
306
- tag: "ol",
307
- children: stages.map((stage, index) => {
308
- return /* @__PURE__ */ jsx(Box, { tag: "li", children: /* @__PURE__ */ jsx(
309
- Stage,
310
- {
311
- index,
312
- canDelete: stages.length > 1 && canDelete,
313
- canReorder: stages.length > 1,
314
- canUpdate,
315
- stagesCount: stages.length,
316
- defaultOpen: isCreating,
317
- ...stage
318
- }
319
- ) }, stage.__temp_key__);
320
- })
321
- }
322
- )
296
+ /* @__PURE__ */ jsx(Flex, { direction: "column", alignItems: "stretch", gap: 6, position: "relative", tag: "ol", children: stages.map((stage, index) => {
297
+ return /* @__PURE__ */ jsx(Box, { tag: "li", children: /* @__PURE__ */ jsx(
298
+ Stage,
299
+ {
300
+ index,
301
+ canDelete: stages.length > 1 && canDelete,
302
+ canReorder: stages.length > 1,
303
+ canUpdate,
304
+ stagesCount: stages.length,
305
+ defaultOpen: !stage.id,
306
+ ...stage
307
+ }
308
+ ) }, stage.__temp_key__);
309
+ }) })
323
310
  ] }),
324
311
  canUpdate && /* @__PURE__ */ jsx(
325
312
  AddStage,
@@ -487,7 +474,7 @@ const Stage = ({
487
474
  {
488
475
  background: "transparent",
489
476
  hasRadius: true,
490
- borderWidth: 0,
477
+ variant: "ghost",
491
478
  "data-handler-id": handlerId,
492
479
  ref: dragRef,
493
480
  label: formatMessage({
@@ -539,7 +526,7 @@ const Stage = ({
539
526
  size: 6,
540
527
  type: "permissions"
541
528
  }
542
- ].map(({ size, ...field }) => /* @__PURE__ */ jsx(Grid.Item, { col: size, children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name)) }) })
529
+ ].map(({ size, ...field }) => /* @__PURE__ */ jsx(Grid.Item, { col: size, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(InputRenderer, { ...field }) }, field.name)) }) })
543
530
  ] })
544
531
  }
545
532
  )
@@ -644,20 +631,22 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
644
631
  const { value = [], error, onChange } = useField(name);
645
632
  const allStages = useForm("PermissionsField", (state) => state.values.stages);
646
633
  const onFormValueChange = useForm("PermissionsField", (state) => state.onChange);
647
- const { data: roles = [], isLoading } = useGetAdminRolesQuery();
634
+ const rolesErrorCount = React.useRef(0);
635
+ const { data: roles = [], isLoading, error: getRolesError } = useGetAdminRolesQuery();
648
636
  const filteredRoles = roles?.filter((role) => role.code !== "strapi-super-admin") ?? [];
649
637
  React.useEffect(() => {
650
- if (!isLoading && roles.length === 0) {
638
+ if (!isLoading && getRolesError && "status" in getRolesError && getRolesError.status == 403 && rolesErrorCount.current === 0) {
639
+ rolesErrorCount.current = 1;
651
640
  toggleNotification({
652
641
  blockTransition: true,
653
642
  type: "danger",
654
643
  message: formatMessage({
655
644
  id: "review-workflows.stage.permissions.noPermissions.description",
656
- defaultMessage: "You don’t have the permission to see roles"
645
+ defaultMessage: "You don’t have the permission to see roles. Contact your administrator."
657
646
  })
658
647
  });
659
648
  }
660
- }, [formatMessage, isLoading, roles, toggleNotification]);
649
+ }, [formatMessage, isLoading, roles, toggleNotification, getRolesError]);
661
650
  if (!isLoading && filteredRoles.length === 0) {
662
651
  return /* @__PURE__ */ jsxs(
663
652
  Field.Root,
@@ -738,7 +727,6 @@ const PermissionsField = ({ disabled, name, placeholder, required }) => {
738
727
  defaultMessage: "Apply to all stages"
739
728
  }),
740
729
  size: "L",
741
- variant: "secondary",
742
730
  children: /* @__PURE__ */ jsx(Duplicate, {})
743
731
  }
744
732
  ) }),
@@ -783,7 +771,7 @@ const PermissionWrapper = styled(Flex)`
783
771
  const WorkflowAttributes = ({ canUpdate = true }) => {
784
772
  const { formatMessage } = useIntl();
785
773
  return /* @__PURE__ */ jsxs(Grid.Root, { background: "neutral0", hasRadius: true, gap: 4, padding: 6, shadow: "tableShadow", children: [
786
- /* @__PURE__ */ jsx(Grid.Item, { col: 6, children: /* @__PURE__ */ jsx(
774
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(
787
775
  InputRenderer$1,
788
776
  {
789
777
  disabled: !canUpdate,
@@ -796,7 +784,8 @@ const WorkflowAttributes = ({ canUpdate = true }) => {
796
784
  type: "string"
797
785
  }
798
786
  ) }),
799
- /* @__PURE__ */ jsx(Grid.Item, { col: 6, children: /* @__PURE__ */ jsx(ContentTypesSelector, { disabled: !canUpdate }) })
787
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(ContentTypesSelector, { disabled: !canUpdate }) }),
788
+ /* @__PURE__ */ jsx(Grid.Item, { col: 6, direction: "column", alignItems: "stretch", children: /* @__PURE__ */ jsx(StageSelector, { disabled: !canUpdate }) })
800
789
  ] });
801
790
  };
802
791
  const ContentTypesSelector = ({ disabled }) => {
@@ -900,15 +889,63 @@ const NestedOption = styled(MultiSelectOption)`
900
889
  const ContentTypeTakeNotice = styled(Typography)`
901
890
  font-style: italic;
902
891
  `;
892
+ const StageSelector = ({ disabled }) => {
893
+ const { value: stages = [] } = useField("stages");
894
+ const { formatMessage } = useIntl();
895
+ const { error, value, onChange } = useField("stageRequiredToPublish");
896
+ const validStages = stages.filter((stage) => stage.name);
897
+ return /* @__PURE__ */ jsxs(
898
+ Field.Root,
899
+ {
900
+ error,
901
+ name: "stageRequiredToPublish",
902
+ hint: formatMessage({
903
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.hint",
904
+ defaultMessage: "Prevents entries from being published if they are not at the required stage."
905
+ }),
906
+ children: [
907
+ /* @__PURE__ */ jsx(Field.Label, { children: formatMessage({
908
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.label",
909
+ defaultMessage: "Required stage for publishing"
910
+ }) }),
911
+ /* @__PURE__ */ jsxs(
912
+ SingleSelect,
913
+ {
914
+ disabled,
915
+ onChange: (value2) => {
916
+ onChange("stageRequiredToPublish", value2);
917
+ },
918
+ value,
919
+ children: [
920
+ /* @__PURE__ */ jsx(SingleSelectOption, { value: "", children: formatMessage({
921
+ id: "settings.review-workflows.workflow.stageRequiredToPublish.any",
922
+ defaultMessage: "Any stage"
923
+ }) }),
924
+ validStages.map((stage, i) => /* @__PURE__ */ jsx(
925
+ SingleSelectOption,
926
+ {
927
+ value: stage.id?.toString() || stage.__temp_key__,
928
+ children: stage.name
929
+ },
930
+ `requiredToPublishStage-${stage.id || stage.__temp_key__}`
931
+ ))
932
+ ]
933
+ }
934
+ ),
935
+ /* @__PURE__ */ jsx(Field.Hint, {})
936
+ ]
937
+ }
938
+ );
939
+ };
903
940
  const WORKFLOW_SCHEMA = yup.object({
904
941
  contentTypes: yup.array().of(yup.string()),
905
942
  name: yup.string().max(255, {
906
943
  id: "review-workflows.validation.name.max-length",
907
944
  defaultMessage: "Name can not be longer than 255 characters"
908
- }).required(),
945
+ }).required().nullable(),
909
946
  stages: yup.array().of(
910
947
  yup.object().shape({
911
- name: yup.string().required({
948
+ name: yup.string().nullable().required({
912
949
  id: "review-workflows.validation.stage.name",
913
950
  defaultMessage: "Name is required"
914
951
  }).max(255, {
@@ -925,7 +962,7 @@ const WORKFLOW_SCHEMA = yup.object({
925
962
  return stages.filter((stage) => stage.name === stageName).length === 1;
926
963
  }
927
964
  ),
928
- color: yup.string().required({
965
+ color: yup.string().nullable().required({
929
966
  id: "review-workflows.validation.stage.color",
930
967
  defaultMessage: "Color is required"
931
968
  }).matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
@@ -942,7 +979,8 @@ const WORKFLOW_SCHEMA = yup.object({
942
979
  })
943
980
  ).strict()
944
981
  })
945
- ).min(1)
982
+ ).min(1),
983
+ stageRequiredToPublish: yup.string().nullable()
946
984
  });
947
985
  const EditPage = () => {
948
986
  const { id = "" } = useParams();
@@ -951,7 +989,6 @@ const EditPage = () => {
951
989
  const { _unstableFormatValidationErrors: formatValidationErrors } = useAPIErrorHandler();
952
990
  const navigate = useNavigate();
953
991
  const { toggleNotification } = useNotification();
954
- const dispatch = useDispatch();
955
992
  const {
956
993
  isLoading: isLoadingWorkflow,
957
994
  meta,
@@ -959,7 +996,7 @@ const EditPage = () => {
959
996
  error,
960
997
  update,
961
998
  create
962
- } = useReviewWorkflows({ id: isCreatingWorkflow ? void 0 : id });
999
+ } = useReviewWorkflows();
963
1000
  const permissions = useTypedSelector(
964
1001
  (state) => state.admin_app.permissions["settings"]?.["review-workflows"]
965
1002
  );
@@ -976,13 +1013,17 @@ const EditPage = () => {
976
1013
  const stagesPerWorkflow = limits?.[CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME];
977
1014
  const submitForm = async (data, helpers) => {
978
1015
  try {
1016
+ const { stageRequiredToPublish, ...rest } = data;
1017
+ const stageRequiredToPublishName = stageRequiredToPublish === "" ? null : rest.stages.find(
1018
+ (stage) => stage.id === Number(stageRequiredToPublish) || stage.__temp_key__ === stageRequiredToPublish
1019
+ )?.name;
979
1020
  if (!isCreatingWorkflow) {
980
1021
  const res = await update(id, {
981
- ...data,
1022
+ ...rest,
982
1023
  // compare permissions of stages and only submit them if at least one has
983
1024
  // changed; this enables partial updates e.g. for users who don't have
984
1025
  // permissions to see roles
985
- stages: data.stages.map((stage) => {
1026
+ stages: rest.stages.map((stage) => {
986
1027
  let hasUpdatedPermissions = true;
987
1028
  const serverStage = currentWorkflow?.stages?.find(
988
1029
  (serverStage2) => serverStage2.id === stage?.id
@@ -998,40 +1039,21 @@ const EditPage = () => {
998
1039
  ...stage,
999
1040
  permissions: hasUpdatedPermissions ? stage.permissions : void 0
1000
1041
  };
1001
- })
1042
+ }),
1043
+ stageRequiredToPublishName
1002
1044
  });
1003
1045
  if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1004
1046
  helpers.setErrors(formatValidationErrors(res.error));
1005
- } else if ("data" in res) {
1006
- for (const uid of res.data.contentTypes) {
1007
- dispatch({
1008
- type: "contentManagerApi/invalidateTags",
1009
- payload: [
1010
- {
1011
- type: "ContentTypesConfiguration",
1012
- id: uid
1013
- }
1014
- ]
1015
- });
1016
- }
1017
1047
  }
1018
1048
  } else {
1019
- const res = await create(data);
1049
+ const res = await create({
1050
+ ...rest,
1051
+ stageRequiredToPublishName
1052
+ });
1020
1053
  if ("error" in res && isBaseQueryError(res.error) && res.error.name === "ValidationError") {
1021
1054
  helpers.setErrors(formatValidationErrors(res.error));
1022
1055
  } else if ("data" in res) {
1023
- for (const uid of res.data.contentTypes) {
1024
- dispatch({
1025
- type: "contentManagerApi/invalidateTags",
1026
- payload: [
1027
- {
1028
- type: "ContentTypesConfiguration",
1029
- id: uid
1030
- }
1031
- ]
1032
- });
1033
- }
1034
- navigate(`../${res.data.id}`);
1056
+ navigate(`../${res.data.id}`, { replace: true });
1035
1057
  }
1036
1058
  }
1037
1059
  } catch (error2) {
@@ -1095,13 +1117,15 @@ const EditPage = () => {
1095
1117
  return {
1096
1118
  name: "",
1097
1119
  stages: [],
1098
- contentTypes: []
1120
+ contentTypes: [],
1121
+ stageRequiredToPublish: ""
1099
1122
  };
1100
1123
  } else {
1101
1124
  return {
1102
1125
  name: currentWorkflow.name,
1103
1126
  stages: addTmpKeysToStages(currentWorkflow.stages),
1104
- contentTypes: currentWorkflow.contentTypes
1127
+ contentTypes: currentWorkflow.contentTypes,
1128
+ stageRequiredToPublish: currentWorkflow.stageRequiredToPublish?.id.toString() ?? ""
1105
1129
  };
1106
1130
  }
1107
1131
  }, [currentWorkflow, isCreatingWorkflow]);
@@ -1130,7 +1154,6 @@ const EditPage = () => {
1130
1154
  {
1131
1155
  startIcon: /* @__PURE__ */ jsx(Check, {}),
1132
1156
  type: "submit",
1133
- size: "M",
1134
1157
  disabled: !modified || isSubmitting || values.stages.length === 0,
1135
1158
  loading: !Boolean(Object.keys(savePrompts).length > 0) && isSubmitting,
1136
1159
  children: formatMessage({
@@ -1153,12 +1176,12 @@ const EditPage = () => {
1153
1176
  }
1154
1177
  ),
1155
1178
  /* @__PURE__ */ jsx(Root, { children: /* @__PURE__ */ jsxs(Flex, { alignItems: "stretch", direction: "column", gap: 7, children: [
1156
- /* @__PURE__ */ jsx(WorkflowAttributes, { canUpdate }),
1179
+ /* @__PURE__ */ jsx(WorkflowAttributes, { canUpdate: canUpdate || canCreate }),
1157
1180
  /* @__PURE__ */ jsx(
1158
1181
  Stages,
1159
1182
  {
1160
1183
  canDelete,
1161
- canUpdate,
1184
+ canUpdate: canUpdate || canCreate,
1162
1185
  isCreating: isCreatingWorkflow
1163
1186
  }
1164
1187
  )
@@ -1180,7 +1203,7 @@ const EditPage = () => {
1180
1203
  },
1181
1204
  {
1182
1205
  count: contentTypesFromOtherWorkflows?.filter(
1183
- (contentType) => currentWorkflow?.contentTypes?.includes(contentType)
1206
+ (contentType) => values.contentTypes.includes(contentType)
1184
1207
  ).length ?? 0
1185
1208
  }
1186
1209
  ) }),
@@ -1251,4 +1274,4 @@ const ProtectedEditPage = () => {
1251
1274
  export {
1252
1275
  ProtectedEditPage
1253
1276
  };
1254
- //# sourceMappingURL=_id-DqEUzU_u.mjs.map
1277
+ //# sourceMappingURL=id-CtcCl3zh.mjs.map