@strapi/review-workflows 5.41.0 → 5.42.0
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.
- package/dist/admin/routes/settings/components/Stages.js +26 -14
- package/dist/admin/routes/settings/components/Stages.js.map +1 -1
- package/dist/admin/routes/settings/components/Stages.mjs +26 -14
- package/dist/admin/routes/settings/components/Stages.mjs.map +1 -1
- package/dist/admin/routes/settings/id.js +21 -6
- package/dist/admin/routes/settings/id.js.map +1 -1
- package/dist/admin/routes/settings/id.mjs +21 -6
- package/dist/admin/routes/settings/id.mjs.map +1 -1
- package/dist/admin/src/routes/settings/components/Stages.d.ts +1 -1
- package/dist/server/controllers/stages.js +18 -3
- package/dist/server/controllers/stages.js.map +1 -1
- package/dist/server/controllers/stages.mjs +18 -3
- package/dist/server/controllers/stages.mjs.map +1 -1
- package/dist/server/controllers/workflows.js +15 -8
- package/dist/server/controllers/workflows.js.map +1 -1
- package/dist/server/controllers/workflows.mjs +16 -9
- package/dist/server/controllers/workflows.mjs.map +1 -1
- package/dist/server/migrations/setup-stage-transfer-to-roles.js +70 -0
- package/dist/server/migrations/setup-stage-transfer-to-roles.js.map +1 -0
- package/dist/server/migrations/setup-stage-transfer-to-roles.mjs +68 -0
- package/dist/server/migrations/setup-stage-transfer-to-roles.mjs.map +1 -0
- package/dist/server/register.js +2 -1
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +2 -1
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/stage-permissions.js +72 -3
- package/dist/server/services/stage-permissions.js.map +1 -1
- package/dist/server/services/stage-permissions.mjs +73 -4
- package/dist/server/services/stage-permissions.mjs.map +1 -1
- package/dist/server/services/stages.js +72 -39
- package/dist/server/services/stages.js.map +1 -1
- package/dist/server/services/stages.mjs +72 -39
- package/dist/server/services/stages.mjs.map +1 -1
- package/dist/server/src/controllers/stages.d.ts +1 -1
- package/dist/server/src/controllers/stages.d.ts.map +1 -1
- package/dist/server/src/controllers/workflows.d.ts.map +1 -1
- package/dist/server/src/index.d.ts +35 -4
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/migrations/setup-stage-transfer-to-roles.d.ts +6 -0
- package/dist/server/src/migrations/setup-stage-transfer-to-roles.d.ts.map +1 -0
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +35 -4
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/stage-permissions.d.ts +39 -4
- package/dist/server/src/services/stage-permissions.d.ts.map +1 -1
- package/dist/server/src/services/stages.d.ts.map +1 -1
- package/dist/server/src/validation/review-workflows.d.ts.map +1 -1
- package/dist/server/validation/review-workflows.js +20 -10
- package/dist/server/validation/review-workflows.js.map +1 -1
- package/dist/server/validation/review-workflows.mjs +20 -10
- package/dist/server/validation/review-workflows.mjs.map +1 -1
- package/dist/shared/contracts/review-workflows.d.ts +4 -2
- package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
- package/package.json +5 -5
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Stages.mjs","sources":["../../../../../admin/src/routes/settings/components/Stages.tsx"],"sourcesContent":["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 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 <Menu.Item onClick={handleCloneClick}>\n {formatMessage({\n id: 'Settings.review-workflows.stage.delete',\n defaultMessage: 'Duplicate stage',\n })}\n </Menu.Item>\n )}\n\n {canDelete && (\n <Menu.Item\n onClick={() => removeFieldRow('stages', index)}\n variant=\"danger\"\n >\n {formatMessage({\n id: 'Settings.review-workflows.stage.delete',\n defaultMessage: 'Delete',\n })}\n </Menu.Item>\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\n key={field.name}\n col={size}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\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\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"],"names":["Stages","canDelete","canUpdate","isCreating","formatMessage","useIntl","trackUsage","useTracking","addFieldRow","useForm","state","value","stages","useField","_jsxs","Flex","direction","gap","width","Box","position","_jsx","Background","background","height","left","top","alignItems","tag","map","stage","index","Stage","length","canReorder","stagesCount","defaultOpen","id","__temp_key__","AddStage","type","onClick","name","defaultMessage","styled","permissions","color","liveText","setLiveText","React","useState","stageErrors","errors","error","moveFieldRow","removeFieldRow","getItemPos","handleGrabStage","item","handleDropStage","handleCancelDragStage","handleMoveStage","newIndex","oldIndex","handlerId","isDragging","handleKeyDown","stageRef","dropRef","dragRef","dragPreviewRef","useDragAndDrop","onGrabItem","onDropItem","onMoveItem","onCancel","DRAG_DROP_TYPES","STAGE","composedRef","useComposedRefs","useEffect","getEmptyImage","captureDraggingState","handleCloneClick","useId","ref","shadow","VisuallyHidden","aria-live","borderStyle","borderColor","borderWidth","display","hasRadius","padding","AccordionRoot","onValueChange","defaultValue","undefined","$error","Object","values","Accordion","Item","Header","Trigger","Actions","_Fragment","Menu","Root","ContextMenuTrigger","size","endIcon","paddingLeft","paddingRight","More","aria-hidden","focusable","Content","popoverPlacement","zIndex","SubRoot","variant","IconButton","data-handler-id","label","e","stopPropagation","onKeyDown","Drag","Grid","disabled","required","placeholder","field","col","xs","InputRenderer","theme","colors","danger600","neutral200","neutral100","props","ColorSelector","PermissionsField","AdminInputRenderer","onChange","colorOptions","AVAILABLE_COLORS","hex","themeColorName","getStageColorByHex","Field","Label","SingleSelect","v","toString","toUpperCase","startIcon","shrink","SingleSelectOption","Error","toggleNotification","useNotification","isApplyAllConfirmationOpen","setIsApplyAllConfirmationOpen","allStages","onFormValueChange","rolesErrorCount","useRef","data","roles","isLoading","getRolesError","useGetAdminRolesQuery","filteredRoles","filter","role","code","status","current","blockTransition","message","hint","TextInput","startAction","EyeStriked","fill","Hint","PermissionWrapper","grow","MultiSelect","parseInt","action","permission","withTags","MultiSelectGroup","r","NestedOption","Dialog","open","onOpenChange","Duplicate","ConfirmDialog","onConfirm","MultiSelectOption","spaces"],"mappings":";;;;;;;;;;;;;;AAuDA,MAAMA,MAAAA,GAAS,CAAC,EAAEC,SAAAA,GAAY,IAAI,EAAEC,SAAAA,GAAY,IAAI,EAAEC,UAAU,EAAe,GAAA;IAC7E,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;AACvB,IAAA,MAAMC,cAAcC,OAAAA,CAAQ,QAAA,EAAU,CAACC,KAAAA,GAAUA,MAAMF,WAAW,CAAA;AAClE,IAAA,MAAM,EAAEG,KAAAA,EAAOC,MAAAA,GAAS,EAAE,EAAE,GAAGC,QAAAA,CAA0B,QAAA,CAAA;AAEzD,IAAA,qBACEC,IAAA,CAACC,IAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;QAAGC,KAAAA,EAAM,MAAA;;0BACrCJ,IAAA,CAACK,GAAAA,EAAAA;gBAAIC,QAAAA,EAAS,UAAA;gBAAWF,KAAAA,EAAM,MAAA;;kCAC7BG,GAAA,CAACC,UAAAA,EAAAA;wBACCC,UAAAA,EAAW,YAAA;wBACXC,MAAAA,EAAO,MAAA;wBACPC,IAAAA,EAAK,KAAA;wBACLL,QAAAA,EAAS,UAAA;wBACTM,GAAAA,EAAI,GAAA;wBACJR,KAAAA,EAAO;;kCAGTG,GAAA,CAACN,IAAAA,EAAAA;wBAAKC,SAAAA,EAAU,QAAA;wBAASW,UAAAA,EAAW,SAAA;wBAAUV,GAAAA,EAAK,CAAA;wBAAGG,QAAAA,EAAS,UAAA;wBAAWQ,GAAAA,EAAI,IAAA;kCAC3EhB,MAAAA,CAAOiB,GAAG,CAAC,CAACC,KAAAA,EAAOC,KAAAA,GAAAA;AAClB,4BAAA,qBACEV,GAAA,CAACF,GAAAA,EAAAA;gCAA6BS,GAAAA,EAAI,IAAA;AAChC,gCAAA,QAAA,gBAAAP,GAAA,CAACW,KAAAA,EAAAA;oCACCD,KAAAA,EAAOA,KAAAA;oCACP9B,SAAAA,EAAWW,MAAAA,CAAOqB,MAAM,GAAG,CAAA,IAAKhC,SAAAA;oCAChCiC,UAAAA,EAAYtB,MAAAA,CAAOqB,MAAM,GAAG,CAAA;oCAC5B/B,SAAAA,EAAWA,SAAAA;AACXiC,oCAAAA,WAAAA,EAAavB,OAAOqB,MAAM;oCAC1BG,WAAAA,EAAa,CAACN,MAAMO,EAAE;AACrB,oCAAA,GAAGP;;AAREA,6BAAAA,EAAAA,KAAAA,CAAMQ,YAAY,CAAA;AAYhC,wBAAA,CAAA;;;;AAIHpC,YAAAA,SAAAA,kBACCmB,GAAA,CAACkB,QAAAA,EAAAA;gBACCC,IAAAA,EAAK,QAAA;gBACLC,OAAAA,EAAS,IAAA;AACPjC,oBAAAA,WAAAA,CAAY,QAAA,EAAU;wBAAEkC,IAAAA,EAAM;AAAG,qBAAA,CAAA;oBACjCpC,UAAAA,CAAW,iBAAA,CAAA;AACb,gBAAA,CAAA;0BAECF,aAAAA,CAAc;oBACbiC,EAAAA,EAAI,qCAAA;oBACJM,cAAAA,EAAgB;AAClB,iBAAA;;;;AAKV;AAEA,MAAMrB,UAAAA,GAAasB,MAAAA,CAAOzB,GAAAA,CAAI;;AAE9B,CAAC;AAcD,MAAMa,KAAAA,GAAQ,CAAC,EACbD,KAAK,EACL9B,SAAAA,GAAY,KAAK,EACjBiC,UAAAA,GAAa,KAAK,EAClBhC,YAAY,KAAK,EACjBiC,WAAW,EACXO,IAAI,EACJG,WAAW,EACXC,KAAK,EACLV,WAAW,EACA,GAAA;AACX,IAAA,MAAM,CAACW,QAAAA,EAAUC,WAAAA,CAAY,GAAGC,MAAMC,QAAQ,EAAA;IAC9C,MAAM,EAAE9C,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;IACvB,MAAM4C,WAAAA,GAAc1C,QAAQ,QAAA,EAAU,CAACC,QAAUA,KAAAA,CAAM0C,MAAM,CAACxC,MAAM,CAAA;IACpE,MAAMyC,KAAAA,GAAQF,WAAAA,GAAcpB,KAAAA,CAAM;AAClC,IAAA,MAAMvB,cAAcC,OAAAA,CAAQ,OAAA,EAAS,CAACC,KAAAA,GAAUA,MAAMF,WAAW,CAAA;AACjE,IAAA,MAAM8C,eAAe7C,OAAAA,CAAQ,OAAA,EAAS,CAACC,KAAAA,GAAUA,MAAM4C,YAAY,CAAA;AACnE,IAAA,MAAMC,iBAAiB9C,OAAAA,CAAQ,OAAA,EAAS,CAACC,KAAAA,GAAUA,MAAM6C,cAAc,CAAA;IAEvE,MAAMC,UAAAA,GAAa,CAACzB,KAAAA,GAAkB,CAAA,EAAGA,QAAQ,CAAA,CAAE,IAAI,EAAEI,WAAAA,CAAAA,CAAa;AAEtE,IAAA,MAAMsB,kBAAkB,CAAC1B,KAAAA,GAAAA;AACvBiB,QAAAA,WAAAA,CACE5C,aAAAA,CACE;YACEiC,EAAAA,EAAI,eAAA;YACJM,cAAAA,EAAgB,CAAC,sIAAsI;SACzJ,EACA;YACEe,IAAAA,EAAMhB,IAAAA;AACNtB,YAAAA,QAAAA,EAAUoC,UAAAA,CAAWzB,KAAAA;AACvB,SAAA,CAAA,CAAA;AAGN,IAAA,CAAA;AAEA,IAAA,MAAM4B,kBAAkB,CAAC5B,KAAAA,GAAAA;AACvBiB,QAAAA,WAAAA,CACE5C,aAAAA,CACE;YACEiC,EAAAA,EAAI,eAAA;YACJM,cAAAA,EAAgB,CAAC,oDAAoD;SACvE,EACA;YACEe,IAAAA,EAAMhB,IAAAA;AACNtB,YAAAA,QAAAA,EAAUoC,UAAAA,CAAWzB,KAAAA;AACvB,SAAA,CAAA,CAAA;AAGN,IAAA,CAAA;AAEA,IAAA,MAAM6B,qBAAAA,GAAwB,IAAA;AAC5BZ,QAAAA,WAAAA,CACE5C,aAAAA,CACE;YACEiC,EAAAA,EAAI,iBAAA;YACJM,cAAAA,EAAgB;SAClB,EACA;YACEe,IAAAA,EAAMhB;AACR,SAAA,CAAA,CAAA;AAGN,IAAA,CAAA;IAEA,MAAMmB,eAAAA,GAAkB,CAACC,QAAAA,EAAkBC,QAAAA,GAAAA;AACzCf,QAAAA,WAAAA,CACE5C,aAAAA,CACE;YACEiC,EAAAA,EAAI,aAAA;YACJM,cAAAA,EAAgB;SAClB,EACA;YACEe,IAAAA,EAAMhB,IAAAA;AACNtB,YAAAA,QAAAA,EAAUoC,UAAAA,CAAWM,QAAAA;AACvB,SAAA,CAAA,CAAA;AAIJR,QAAAA,YAAAA,CAAa,UAAUS,QAAAA,EAAUD,QAAAA,CAAAA;AACnC,IAAA,CAAA;AAEA,IAAA,MAAM,CAAC,EAAEE,SAAS,EAAEC,UAAU,EAAEC,aAAa,EAAE,EAAEC,UAAUC,OAAAA,EAASC,OAAAA,EAASC,cAAAA,CAAe,GAC1FC,eAAerC,UAAAA,EAAY;AACzBH,QAAAA,KAAAA;QACA2B,IAAAA,EAAM;AACJ3B,YAAAA,KAAAA;AACAW,YAAAA;AACF,SAAA;QACA8B,UAAAA,EAAYf,eAAAA;QACZgB,UAAAA,EAAYd,eAAAA;QACZe,UAAAA,EAAYb,eAAAA;QACZc,QAAAA,EAAUf,qBAAAA;AACVpB,QAAAA,IAAAA,EAAMoC,gBAAgBC;AACxB,KAAA,CAAA;;IAGF,MAAMC,WAAAA,GAAcC,gBAAgCZ,QAAAA,EAAUC,OAAAA,CAAAA;AAE9DnB,IAAAA,KAAAA,CAAM+B,SAAS,CAAC,IAAA;AACdV,QAAAA,cAAAA,CAAeW,aAAAA,EAAAA,EAAiB;YAAEC,oBAAAA,EAAsB;AAAM,SAAA,CAAA;IAChE,CAAA,EAAG;AAACZ,QAAAA,cAAAA;AAAgBvC,QAAAA;AAAM,KAAA,CAAA;AAE1B,IAAA,MAAMoD,gBAAAA,GAAmB,IAAA;AACvB3E,QAAAA,WAAAA,CAAY,QAAA,EAAU;AAAEkC,YAAAA,IAAAA;AAAMI,YAAAA,KAAAA;AAAOD,YAAAA;AAAY,SAAA,CAAA;AACnD,IAAA,CAAA;IAEA,MAAMR,EAAAA,GAAKY,MAAMmC,KAAK,EAAA;AAEtB,IAAA,qBACEtE,IAAA,CAACK,GAAAA,EAAAA;QAAIkE,GAAAA,EAAKP,WAAAA;QAAaQ,MAAAA,EAAO,aAAA;;AAC3BvC,YAAAA,QAAAA,kBAAY1B,GAAA,CAACkE,cAAAA,EAAAA;gBAAeC,WAAAA,EAAU,WAAA;AAAazC,gBAAAA,QAAAA,EAAAA;;AAEnDkB,YAAAA,UAAAA,iBACC5C,GAAA,CAACF,GAAAA,EAAAA;gBACCI,UAAAA,EAAW,YAAA;gBACXkE,WAAAA,EAAY,QAAA;gBACZC,WAAAA,EAAY,YAAA;gBACZC,WAAAA,EAAY,KAAA;gBACZC,OAAAA,EAAQ,OAAA;gBACRC,SAAS,EAAA,IAAA;gBACTC,OAAAA,EAAS;+BAGXzE,GAAA,CAAC0E,aAAAA,EAAAA;AACCC,gBAAAA,aAAAA,EAAe,CAACrF,KAAAA,GAAAA;AACd,oBAAA,IAAIA,KAAAA,EAAO;wBACTL,UAAAA,CAAW,eAAA,CAAA;AACb,oBAAA;AACF,gBAAA,CAAA;AACA2F,gBAAAA,YAAAA,EAAc7D,cAAcC,EAAAA,GAAK6D,SAAAA;AACjCC,gBAAAA,MAAAA,EAAQC,OAAOC,MAAM,CAAChD,SAAS,EAAC,CAAA,CAAGpB,MAAM,GAAG,CAAA;wCAE5CnB,IAAA,CAACwF,UAAUC,IAAI,EAAA;oBAAC5F,KAAAA,EAAO0B,EAAAA;;AACrB,sCAAAvB,IAAA,CAACwF,UAAUE,MAAM,EAAA;;AACf,8CAAAnF,GAAA,CAACiF,UAAUG,OAAO,EAAA;AAAE/D,oCAAAA,QAAAA,EAAAA;;AACpB,8CAAArB,GAAA,CAACiF,UAAUI,OAAO,EAAA;AACfzG,oCAAAA,QAAAA,EAAAA,SAAAA,IAAaC,SAAAA,iBACZY,IAAA,CAAA6F,QAAA,EAAA;;AACE,0DAAA7F,IAAA,CAAC8F,KAAKC,IAAI,EAAA;;kEACR/F,IAAA,CAACgG,kBAAAA,EAAAA;wDAAmBC,IAAAA,EAAK,GAAA;wDAAIC,OAAAA,EAAS,IAAA;wDAAMC,WAAAA,EAAa,CAAA;wDAAGC,YAAAA,EAAc,CAAA;;0EACxE7F,GAAA,CAAC8F,IAAAA,EAAAA;gEAAKC,aAAW,EAAA,IAAA;gEAACC,SAAAA,EAAW;;0EAC7BhG,GAAA,CAACkE,cAAAA,EAAAA;gEAAe3D,GAAAA,EAAI,MAAA;0EACjBxB,aAAAA,CAAc;oEACbiC,EAAAA,EAAI,4CAAA;oEACJM,cAAAA,EAAgB;AAClB,iEAAA;;;;AAMJ,kEAAAtB,GAAA,CAACuF,KAAKU,OAAO,EAAA;wDAACC,gBAAAA,EAAiB,YAAA;wDAAaC,MAAAA,EAAQ,CAAA;gFAClD1G,IAAA,CAAC8F,KAAKa,OAAO,EAAA;;gEACVvH,SAAAA,kBACCmB,GAAA,CAACuF,KAAKL,IAAI,EAAA;oEAAC9D,OAAAA,EAAS0C,gBAAAA;8EACjB/E,aAAAA,CAAc;wEACbiC,EAAAA,EAAI,wCAAA;wEACJM,cAAAA,EAAgB;AAClB,qEAAA;;gEAIH1C,SAAAA,kBACCoB,GAAA,CAACuF,KAAKL,IAAI,EAAA;oEACR9D,OAAAA,EAAS,IAAMc,eAAe,QAAA,EAAUxB,KAAAA,CAAAA;oEACxC2F,OAAAA,EAAQ,QAAA;8EAEPtH,aAAAA,CAAc;wEACbiC,EAAAA,EAAI,wCAAA;wEACJM,cAAAA,EAAgB;AAClB,qEAAA;;;;;;;AAOTzC,4CAAAA,SAAAA,kBACCmB,GAAA,CAACsG,UAAAA,EAAAA;gDACCpG,UAAAA,EAAW,aAAA;gDACXsE,SAAS,EAAA,IAAA;gDACT6B,OAAAA,EAAQ,OAAA;gDACRE,iBAAAA,EAAiB5D,SAAAA;gDACjBqB,GAAAA,EAAKhB,OAAAA;AACLwD,gDAAAA,KAAAA,EAAOzH,aAAAA,CAAc;oDACnBiC,EAAAA,EAAI,sCAAA;oDACJM,cAAAA,EAAgB;AAClB,iDAAA,CAAA;gDACAF,OAAAA,EAAS,CAACqF,CAAAA,GAAMA,CAAAA,CAAEC,eAAe,EAAA;gDACjCC,SAAAA,EAAW9D,aAAAA;AAEX,gDAAA,QAAA,gBAAA7C,GAAA,CAAC4G,IAAAA,EAAAA,EAAAA;;;AAIL,qCAAA,CAAA,GAAA;;;;AAGR,sCAAA5G,GAAA,CAACiF,UAAUgB,OAAO,EAAA;oDAChBjG,GAAA,CAAC6G,KAAKrB,IAAI,EAAA;gCAAC5F,GAAAA,EAAK,CAAA;gCAAG6E,OAAAA,EAAS,CAAA;AACzB,gCAAA,QAAA,EAAA;AACC,oCAAA;AACEqC,wCAAAA,QAAAA,EAAU,CAACjI,SAAAA;AACX2H,wCAAAA,KAAAA,EAAOzH,aAAAA,CAAc;4CACnBiC,EAAAA,EAAI,4CAAA;4CACJM,cAAAA,EAAgB;AAClB,yCAAA,CAAA;AACAD,wCAAAA,IAAAA,EAAM,CAAC,OAAO,EAAEX,KAAAA,CAAM,KAAK,CAAC;wCAC5BqG,QAAAA,EAAU,IAAA;wCACVrB,IAAAA,EAAM,CAAA;wCACNvE,IAAAA,EAAM;AACR,qCAAA;AACA,oCAAA;AACE2F,wCAAAA,QAAAA,EAAU,CAACjI,SAAAA;AACX2H,wCAAAA,KAAAA,EAAOzH,aAAAA,CAAc;4CACnBiC,EAAAA,EAAI,6CAAA;4CACJM,cAAAA,EAAgB;AAClB,yCAAA,CAAA;AACAD,wCAAAA,IAAAA,EAAM,CAAC,OAAO,EAAEX,KAAAA,CAAM,MAAM,CAAC;wCAC7BqG,QAAAA,EAAU,IAAA;wCACVrB,IAAAA,EAAM,CAAA;wCACNvE,IAAAA,EAAM;AACR,qCAAA;AACA,oCAAA;AACE2F,wCAAAA,QAAAA,EAAU,CAACjI,SAAAA;AACX2H,wCAAAA,KAAAA,EAAOzH,aAAAA,CAAc;4CACnBiC,EAAAA,EAAI,mDAAA;4CACJM,cAAAA,EAAgB;AAClB,yCAAA,CAAA;AACAD,wCAAAA,IAAAA,EAAM,CAAC,OAAO,EAAEX,KAAAA,CAAM,YAAY,CAAC;AACnCsG,wCAAAA,WAAAA,EAAajI,aAAAA,CAAc;4CACzBiC,EAAAA,EAAI,yDAAA;4CACJM,cAAAA,EAAgB;AAClB,yCAAA,CAAA;wCACAyF,QAAAA,EAAU,IAAA;wCACVrB,IAAAA,EAAM,CAAA;wCACNvE,IAAAA,EAAM;AACR;iCACD,CAACX,GAAG,CAAC,CAAC,EAAEkF,IAAI,EAAE,GAAGuB,KAAAA,EAAO,iBACvBjH,GAAA,CAAC6G,IAAAA,CAAK3B,IAAI,EAAA;wCAERgC,GAAAA,EAAKxB,IAAAA;wCACLyB,EAAAA,EAAI,EAAA;wCACJxH,SAAAA,EAAU,QAAA;wCACVW,UAAAA,EAAW,SAAA;AAEX,wCAAA,QAAA,gBAAAN,GAAA,CAACoH,aAAAA,EAAAA;AAAe,4CAAA,GAAGH;;AANdA,qCAAAA,EAAAA,KAAAA,CAAM5F,IAAI,CAAA;;;;;;;;AAgBnC,CAAA;AAEA,MAAMqD,aAAAA,GAAgBnD,MAAAA,CAAO0D,SAAAA,CAAUO,IAAI,CAAuB;;AAE9D,IAAA,EAAE,CAAC,EAAE6B,KAAK,EAAEvC,MAAM,EAAE,GAAMA,MAAAA,GAASuC,KAAAA,CAAMC,MAAM,CAACC,SAAS,GAAGF,MAAMC,MAAM,CAACE,UAAU,CAAE;AACzF,CAAC;AAED;AACA;AACA,MAAM/B,kBAAAA,GAAqBlE,MAAAA,CAAOgE,IAAAA,CAAKH,OAAO,CAAC;;;sBAGzB,EAAE,CAAC,EAAEiC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACG,UAAU,CAAC;;;;;;AAM/D,CAAC;AAQD,MAAML,gBAAgB,CAACM,KAAAA,GAAAA;AACrB,IAAA,OAAQA,MAAMvG,IAAI;QAChB,KAAK,OAAA;AACH,YAAA,qBAAOnB,GAAA,CAAC2H,aAAAA,EAAAA;AAAe,gBAAA,GAAGD;;QAC5B,KAAK,aAAA;AACH,YAAA,qBAAO1H,GAAA,CAAC4H,gBAAAA,EAAAA;AAAkB,gBAAA,GAAGF;;AAC/B,QAAA;AACE,YAAA,qBAAO1H,GAAA,CAAC6H,eAAAA,EAAAA;AAAoB,gBAAA,GAAGH;;AACnC;AACF,CAAA;AAWA,MAAMC,aAAAA,GAAgB,CAAC,EAAEb,QAAQ,EAAEN,KAAK,EAAEnF,IAAI,EAAE0F,QAAQ,EAAsB,GAAA;IAC5E,MAAM,EAAEhI,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEM,KAAK,EAAE0C,KAAK,EAAE8F,QAAQ,EAAE,GAAGtI,QAAAA,CAAiB6B,IAAAA,CAAAA;IAEpD,MAAM0G,YAAAA,GAAeC,gBAAAA,CAAiBxH,GAAG,CAAC,CAAC,EAAEyH,GAAG,EAAE5G,IAAI,EAAE,IAAM;YAC5D/B,KAAAA,EAAO2I,GAAAA;AACPzB,YAAAA,KAAAA,EAAOzH,aAAAA,CACL;gBACEiC,EAAAA,EAAI,4CAAA;gBACJM,cAAAA,EAAgB;aAClB,EACA;AAAED,gBAAAA;AAAK,aAAA,CAAA;YAETI,KAAAA,EAAOwG;SACT,CAAA,CAAA;AAEA,IAAA,MAAM,EAAEC,cAAc,EAAE,GAAGC,kBAAAA,CAAmB7I,UAAU,EAAC;IAEzD,qBACEG,IAAA,CAAC2I,MAAM5C,IAAI,EAAA;QAACxD,KAAAA,EAAOA,KAAAA;QAAOX,IAAAA,EAAMA,IAAAA;QAAM0F,QAAAA,EAAUA,QAAAA;;AAC9C,0BAAA/G,GAAA,CAACoI,MAAMC,KAAK,EAAA;AAAE7B,gBAAAA,QAAAA,EAAAA;;0BACdxG,GAAA,CAACsI,YAAAA,EAAAA;gBACCxB,QAAAA,EAAUA,QAAAA;AACVgB,gBAAAA,QAAAA,EAAU,CAACS,CAAAA,GAAAA;oBACTT,QAAAA,CAASzG,IAAAA,EAAMkH,EAAEC,QAAQ,EAAA,CAAA;AAC3B,gBAAA,CAAA;AACAlJ,gBAAAA,KAAAA,EAAOA,KAAAA,EAAOmJ,WAAAA,EAAAA;AACdC,gBAAAA,SAAAA,gBACE1I,GAAA,CAACN,IAAAA,EAAAA;oBACCa,GAAAA,EAAI,MAAA;oBACJJ,MAAAA,EAAQ,CAAA;oBACRD,UAAAA,EAAYZ,KAAAA;oBACZ+E,WAAAA,EAAa6D,cAAAA,KAAmB,aAAa,YAAA,GAAe,aAAA;oBAC5D1D,SAAS,EAAA,IAAA;oBACTmE,MAAAA,EAAQ,CAAA;oBACR9I,KAAAA,EAAO;;0BAIVkI,YAAAA,CAAavH,GAAG,CAAC,CAAC,EAAElB,KAAK,EAAEkH,KAAK,EAAE/E,KAAK,EAAE,GAAA;AACxC,oBAAA,MAAM,EAAEyG,cAAc,EAAE,GAAGC,kBAAAA,CAAmB1G,UAAU,EAAC;AAEzD,oBAAA,qBACEzB,GAAA,CAAC4I,kBAAAA,EAAAA;wBACCtJ,KAAAA,EAAOA,KAAAA;AAEPoJ,wBAAAA,SAAAA,gBACE1I,GAAA,CAACN,IAAAA,EAAAA;4BACCa,GAAAA,EAAI,MAAA;4BACJJ,MAAAA,EAAQ,CAAA;4BACRD,UAAAA,EAAYuB,KAAAA;4BACZ4C,WAAAA,EAAa6D,cAAAA,KAAmB,aAAa,YAAA,GAAe,aAAA;4BAC5D1D,SAAS,EAAA,IAAA;4BACTmE,MAAAA,EAAQ,CAAA;4BACR9I,KAAAA,EAAO;;AAIV2G,wBAAAA,QAAAA,EAAAA;AAbIlH,qBAAAA,EAAAA,KAAAA,CAAAA;AAgBX,gBAAA,CAAA;;AAEF,0BAAAU,GAAA,CAACoI,MAAMS,KAAK,EAAA,EAAA;;;AAGlB,CAAA;AAUA,MAAMjB,gBAAAA,GAAmB,CAAC,EAAEd,QAAQ,EAAEzF,IAAI,EAAE2F,WAAW,EAAED,QAAQ,EAAyB,GAAA;IACxF,MAAM,EAAEhI,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAE8J,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAC/B,IAAA,MAAM,CAACC,0BAAAA,EAA4BC,6BAAAA,CAA8B,GAAGrH,KAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;IACnF,MAAM,EAAEvC,QAAQ,EAAE,EAAE0C,KAAK,EAAE8F,QAAQ,EAAE,GAAGtI,QAAAA,CAA4B6B,IAAAA,CAAAA;IACpE,MAAM6H,SAAAA,GAAY9J,QAAyB,kBAAA,EAAoB,CAACC,QAAUA,KAAAA,CAAM2F,MAAM,CAACzF,MAAM,CAAA;AAC7F,IAAA,MAAM4J,oBAAoB/J,OAAAA,CAAQ,kBAAA,EAAoB,CAACC,KAAAA,GAAUA,MAAMyI,QAAQ,CAAA;IAC/E,MAAMsB,eAAAA,GAAkBxH,KAAAA,CAAMyH,MAAM,CAAC,CAAA,CAAA;IAErC,MAAM,EAAEC,IAAAA,EAAMC,KAAAA,GAAQ,EAAE,EAAEC,SAAS,EAAExH,KAAAA,EAAOyH,aAAa,EAAE,GAAGC,qBAAAA,EAAAA;;;IAI9D,MAAMC,aAAAA,GAAgBJ,OAAOK,MAAAA,CAAO,CAACC,OAASA,IAAAA,CAAKC,IAAI,KAAK,oBAAA,CAAA,IAAyB,EAAE;AAEvFlI,IAAAA,KAAAA,CAAM+B,SAAS,CAAC,IAAA;AACd,QAAA,IACE,CAAC6F,SAAAA,IACDC,aAAAA,IACA,QAAA,IAAYA,aAAAA,IACZA,aAAAA,CAAcM,MAAM,IAAI,GAAA,IACxBX,eAAAA,CAAgBY,OAAO,KAAK,CAAA,EAC5B;AACAZ,YAAAA,eAAAA,CAAgBY,OAAO,GAAG,CAAA;YAE1BlB,kBAAAA,CAAmB;gBACjBmB,eAAAA,EAAiB,IAAA;gBACjB9I,IAAAA,EAAM,QAAA;AACN+I,gBAAAA,OAAAA,EAASnL,aAAAA,CAAc;oBACrBiC,EAAAA,EAAI,8DAAA;oBACJM,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACvC,QAAAA,aAAAA;AAAeyK,QAAAA,SAAAA;AAAWD,QAAAA,KAAAA;AAAOT,QAAAA,kBAAAA;AAAoBW,QAAAA;AAAc,KAAA,CAAA;AAEvE,IAAA,IAAI,CAACD,SAAAA,IAAaG,aAAAA,CAAc/I,MAAM,KAAK,CAAA,EAAG;QAC5C,qBACEnB,IAAA,CAAC2I,MAAM5C,IAAI,EAAA;YACTnE,IAAAA,EAAMA,IAAAA;AACN8I,YAAAA,IAAAA,EAAMpL,aAAAA,CAAc;gBAClBiC,EAAAA,EAAI,uEAAA;gBACJM,cAAAA,EAAgB;AAClB,aAAA,CAAA;YACAyF,QAAAA,EAAUA,QAAAA;;AAEV,8BAAA/G,GAAA,CAACoI,MAAMC,KAAK,EAAA;8BACTtJ,aAAAA,CAAc;wBACbiC,EAAAA,EAAI,mDAAA;wBACJM,cAAAA,EAAgB;AAClB,qBAAA;;8BAEFtB,GAAA,CAACoK,SAAAA,EAAAA;oBACCtD,QAAQ,EAAA,IAAA;AACRE,oBAAAA,WAAAA,EAAajI,aAAAA,CAAc;wBACzBiC,EAAAA,EAAI,iCAAA;wBACJM,cAAAA,EAAgB;AAClB,qBAAA,CAAA;AACA+I,oBAAAA,WAAAA,gBAAarK,GAAA,CAACsK,UAAAA,EAAAA;wBAAWC,IAAAA,EAAK;;oBAC9BpJ,IAAAA,EAAK,MAAA;oBACL7B,KAAAA,EAAM;;AAER,8BAAAU,GAAA,CAACoI,MAAMoC,IAAI,EAAA,EAAA;;;AAGjB,IAAA;IAEA,qBACExK,GAAA,CAAAsF,QAAA,EAAA;AACE,QAAA,QAAA,gBAAA7F,IAAA,CAACC,IAAAA,EAAAA;YAAKY,UAAAA,EAAW,UAAA;YAAWV,GAAAA,EAAK,CAAA;;8BAC/BI,GAAA,CAACyK,iBAAAA,EAAAA;oBAAkBC,IAAAA,EAAM,CAAA;4CACvBjL,IAAA,CAAC2I,MAAM5C,IAAI,EAAA;wBAACxD,KAAAA,EAAOA,KAAAA;wBAAOX,IAAAA,EAAMA,IAAAA;wBAAM0F,QAAQ,EAAA,IAAA;;AAC5C,0CAAA/G,GAAA,CAACoI,MAAMC,KAAK,EAAA;0CACTtJ,aAAAA,CAAc;oCACbiC,EAAAA,EAAI,mDAAA;oCACJM,cAAAA,EAAgB;AAClB,iCAAA;;0CAEFtB,GAAA,CAAC2K,WAAAA,EAAAA;gCACC7D,QAAAA,EAAUA,QAAAA;AACVgB,gCAAAA,QAAAA,EAAU,CAAC9C,MAAAA,GAAAA;;;;AAIT,oCAAA,MAAMxD,cAAcwD,MAAAA,CAAOxE,GAAG,CAAC,CAAClB,SAAW;AACzCuK,4CAAAA,IAAAA,EAAMe,SAAStL,KAAAA,EAAO,EAAA,CAAA;4CACtBuL,MAAAA,EAAQ;yCACV,CAAA,CAAA;AAEA/C,oCAAAA,QAAAA,CAASzG,IAAAA,EAAMG,WAAAA,CAAAA;AACjB,gCAAA,CAAA;gCACAwF,WAAAA,EAAaA,WAAAA;;gCAEb1H,KAAAA,EAAOA,KAAAA,CAAMkB,GAAG,CAAC,CAACsK,aAAe,CAAA,EAAGA,UAAAA,CAAWjB,IAAI,CAAA,CAAE,CAAA;gCACrDkB,QAAQ,EAAA,IAAA;AAER,gCAAA,QAAA,gBAAA/K,GAAA,CAACgL,gBAAAA,EAAAA;AACCxE,oCAAAA,KAAAA,EAAOzH,aAAAA,CAAc;wCACnBiC,EAAAA,EAAI,4DAAA;wCACJM,cAAAA,EAAgB;AAClB,qCAAA,CAAA;oCACA0D,MAAAA,EAAQ2E,aAAAA,CAAcnJ,GAAG,CAAC,CAACyK,IAAM,CAAA,EAAGA,CAAAA,CAAEjK,EAAE,CAAA,CAAE,CAAA;8CAEzC2I,aAAAA,CAAcnJ,GAAG,CAAC,CAACqJ,IAAAA,GAAAA;AAClB,wCAAA,qBACE7J,GAAA,CAACkL,YAAAA,EAAAA;4CAA2B5L,KAAAA,EAAO,CAAA,EAAGuK,IAAAA,CAAK7I,EAAE,CAAA,CAAE;AAC5C6I,4CAAAA,QAAAA,EAAAA,IAAAA,CAAKxI;AADWwI,yCAAAA,EAAAA,IAAAA,CAAK7I,EAAE,CAAA;AAI9B,oCAAA,CAAA;;;AAGJ,0CAAAhB,GAAA,CAACoI,MAAMS,KAAK,EAAA,EAAA;;;;AAGhB,8BAAApJ,IAAA,CAAC0L,OAAO3F,IAAI,EAAA;oBAAC4F,IAAAA,EAAMpC,0BAAAA;oBAA4BqC,YAAAA,EAAcpC,6BAAAA;;AAC3D,sCAAAjJ,GAAA,CAACmL,OAAO/F,OAAO,EAAA;AACb,4BAAA,QAAA,gBAAApF,GAAA,CAACsG,UAAAA,EAAAA;gCACCQ,QAAAA,EAAUA,QAAAA;AACVN,gCAAAA,KAAAA,EAAOzH,aAAAA,CAAc;oCACnBiC,EAAAA,EAAI,yDAAA;oCACJM,cAAAA,EAAgB;AAClB,iCAAA,CAAA;gCACAoE,IAAAA,EAAK,GAAA;AAEL,gCAAA,QAAA,gBAAA1F,GAAA,CAACsL,SAAAA,EAAAA,EAAAA;;;sCAGLtL,GAAA,CAACuL,aAAAA,EAAAA;4BACCC,SAAAA,EAAW,IAAA;AACTrC,gCAAAA,iBAAAA,CACE,UACAD,SAAAA,CAAU1I,GAAG,CAAC,CAACC,SAAW;AACxB,wCAAA,GAAGA,KAAK;wCACRe,WAAAA,EAAalC;qCACf,CAAA,CAAA,CAAA;gCAGF2J,6BAAAA,CAA8B,KAAA,CAAA;gCAC9BH,kBAAAA,CAAmB;oCACjB3H,IAAAA,EAAM,SAAA;AACN+I,oCAAAA,OAAAA,EAASnL,aAAAA,CAAc;wCACrBiC,EAAAA,EAAI,6EAAA;wCACJM,cAAAA,EAAgB;AAClB,qCAAA;AACF,iCAAA,CAAA;AACF,4BAAA,CAAA;4BACA+E,OAAAA,EAAQ,SAAA;sCAEPtH,aAAAA,CAAc;gCACbiC,EAAAA,EAAI,qEAAA;gCACJM,cAAAA,EACE;AACJ,6BAAA;;;;;;;AAMZ,CAAA;AAEA,MAAM4J,YAAAA,GAAe3J,MAAAA,CAAOkK,iBAAAA,CAAkB;gBAC9B,EAAE,CAAC,EAAEpE,KAAK,EAAE,GAAKA,KAAAA,CAAMqE,MAAM,CAAC,CAAA,CAAE,CAAC;AACjD,CAAC;AAED;AACA,MAAMjB,iBAAAA,GAAoBlJ,MAAAA,CAAO7B,IAAAA,CAAK;;;;AAItC,CAAC;;;;"}
|
|
1
|
+
{"version":3,"file":"Stages.mjs","sources":["../../../../../admin/src/routes/settings/components/Stages.tsx"],"sourcesContent":["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 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\n extends Pick<IStage, 'id' | 'name' | 'fromPermissions' | 'toPermissions' | '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 fromPermissions,\n toPermissions,\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, fromPermissions, toPermissions });\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 <Menu.Item onClick={handleCloneClick}>\n {formatMessage({\n id: 'Settings.review-workflows.stage.delete',\n defaultMessage: 'Duplicate stage',\n })}\n </Menu.Item>\n )}\n\n {canDelete && (\n <Menu.Item\n onClick={() => removeFieldRow('stages', index)}\n variant=\"danger\"\n >\n {formatMessage({\n id: 'Settings.review-workflows.stage.delete',\n defaultMessage: 'Delete',\n })}\n </Menu.Item>\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 from this stage',\n }),\n name: `stages.${index}.fromPermissions`,\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 {\n disabled: !canUpdate,\n label: formatMessage({\n id: 'Settings.review-workflows.stage.toPermissions.label',\n defaultMessage: 'Roles that can move content to this stage',\n }),\n name: `stages.${index}.toPermissions`,\n placeholder: formatMessage({\n id: 'Settings.review-workflows.stage.toPermissions.placeholder',\n defaultMessage: 'Select a role',\n }),\n required: false,\n size: 6,\n type: 'permissions' as const,\n },\n ].map(({ size, ...field }) => (\n <Grid.Item\n key={field.name}\n col={size}\n xs={12}\n direction=\"column\"\n alignItems=\"stretch\"\n >\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\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 = ({\n label,\n disabled,\n name,\n placeholder,\n required,\n}: 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\n // Derive the field key (e.g. \"fromPermissions\" or \"toPermissions\") from the full field name\n const fieldKey = name.split('.').pop() as keyof WorkflowStage;\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>{label}</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>{label}</Field.Label>\n\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 [fieldKey]: 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"],"names":["Stages","canDelete","canUpdate","isCreating","formatMessage","useIntl","trackUsage","useTracking","addFieldRow","useForm","state","value","stages","useField","_jsxs","Flex","direction","gap","width","Box","position","_jsx","Background","background","height","left","top","alignItems","tag","map","stage","index","Stage","length","canReorder","stagesCount","defaultOpen","id","__temp_key__","AddStage","type","onClick","name","defaultMessage","styled","fromPermissions","toPermissions","color","liveText","setLiveText","React","useState","stageErrors","errors","error","moveFieldRow","removeFieldRow","getItemPos","handleGrabStage","item","handleDropStage","handleCancelDragStage","handleMoveStage","newIndex","oldIndex","handlerId","isDragging","handleKeyDown","stageRef","dropRef","dragRef","dragPreviewRef","useDragAndDrop","onGrabItem","onDropItem","onMoveItem","onCancel","DRAG_DROP_TYPES","STAGE","composedRef","useComposedRefs","useEffect","getEmptyImage","captureDraggingState","handleCloneClick","useId","ref","shadow","VisuallyHidden","aria-live","borderStyle","borderColor","borderWidth","display","hasRadius","padding","AccordionRoot","onValueChange","defaultValue","undefined","$error","Object","values","Accordion","Item","Header","Trigger","Actions","_Fragment","Menu","Root","ContextMenuTrigger","size","endIcon","paddingLeft","paddingRight","More","aria-hidden","focusable","Content","popoverPlacement","zIndex","SubRoot","variant","IconButton","data-handler-id","label","e","stopPropagation","onKeyDown","Drag","Grid","disabled","required","placeholder","field","col","xs","InputRenderer","theme","colors","danger600","neutral200","neutral100","props","ColorSelector","PermissionsField","AdminInputRenderer","onChange","colorOptions","AVAILABLE_COLORS","hex","themeColorName","getStageColorByHex","Field","Label","SingleSelect","v","toString","toUpperCase","startIcon","shrink","SingleSelectOption","Error","toggleNotification","useNotification","isApplyAllConfirmationOpen","setIsApplyAllConfirmationOpen","allStages","onFormValueChange","fieldKey","split","pop","rolesErrorCount","useRef","data","roles","isLoading","getRolesError","useGetAdminRolesQuery","filteredRoles","filter","role","code","status","current","blockTransition","message","hint","TextInput","startAction","EyeStriked","fill","Hint","PermissionWrapper","grow","MultiSelect","permissions","parseInt","action","permission","withTags","MultiSelectGroup","r","NestedOption","Dialog","open","onOpenChange","Duplicate","ConfirmDialog","onConfirm","MultiSelectOption","spaces"],"mappings":"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"}
|
|
@@ -39,6 +39,12 @@ function _interopNamespaceDefault(e) {
|
|
|
39
39
|
var React__namespace = /*#__PURE__*/_interopNamespaceDefault(React);
|
|
40
40
|
var yup__namespace = /*#__PURE__*/_interopNamespaceDefault(yup);
|
|
41
41
|
|
|
42
|
+
const havePermissionsChanged = (before, after)=>{
|
|
43
|
+
if (before?.length !== after?.length) {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
return !before?.every((beforePermission)=>after?.some((afterPermission)=>afterPermission.role === beforePermission.role));
|
|
47
|
+
};
|
|
42
48
|
/* -------------------------------------------------------------------------------------------------
|
|
43
49
|
* EditPage
|
|
44
50
|
* -----------------------------------------------------------------------------------------------*/ const WORKFLOW_SCHEMA = yup__namespace.object({
|
|
@@ -66,7 +72,17 @@ var yup__namespace = /*#__PURE__*/_interopNamespaceDefault(yup);
|
|
|
66
72
|
id: 'review-workflows.validation.stage.color',
|
|
67
73
|
defaultMessage: 'Color is required'
|
|
68
74
|
}).matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
|
|
69
|
-
|
|
75
|
+
fromPermissions: yup__namespace.array(yup__namespace.object({
|
|
76
|
+
role: yup__namespace.number().strict().typeError({
|
|
77
|
+
id: 'review-workflows.validation.stage.permissions.role.number',
|
|
78
|
+
defaultMessage: 'Role must be of type number'
|
|
79
|
+
}).required(),
|
|
80
|
+
action: yup__namespace.string().required({
|
|
81
|
+
id: 'review-workflows.validation.stage.permissions.action.required',
|
|
82
|
+
defaultMessage: 'Action is a required argument'
|
|
83
|
+
})
|
|
84
|
+
})).strict(),
|
|
85
|
+
toPermissions: yup__namespace.array(yup__namespace.object({
|
|
70
86
|
role: yup__namespace.number().strict().typeError({
|
|
71
87
|
id: 'review-workflows.validation.stage.permissions.role.number',
|
|
72
88
|
defaultMessage: 'Role must be of type number'
|
|
@@ -108,14 +124,13 @@ const EditPage = ()=>{
|
|
|
108
124
|
// changed; this enables partial updates e.g. for users who don't have
|
|
109
125
|
// permissions to see roles
|
|
110
126
|
stages: rest.stages.map((stage)=>{
|
|
111
|
-
let hasUpdatedPermissions = true;
|
|
112
127
|
const serverStage = currentWorkflow?.stages?.find((serverStage)=>serverStage.id === stage?.id);
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
}
|
|
128
|
+
const hasUpdatedPermissions = !serverStage || havePermissionsChanged(serverStage.fromPermissions, stage.fromPermissions);
|
|
129
|
+
const hasUpdatedToPermissions = !serverStage || havePermissionsChanged(serverStage.toPermissions, stage.toPermissions);
|
|
116
130
|
return {
|
|
117
131
|
...stage,
|
|
118
|
-
|
|
132
|
+
fromPermissions: hasUpdatedPermissions ? stage.fromPermissions : undefined,
|
|
133
|
+
toPermissions: hasUpdatedToPermissions ? stage.toPermissions : undefined
|
|
119
134
|
};
|
|
120
135
|
}),
|
|
121
136
|
stageRequiredToPublishName
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"id.js","sources":["../../../../admin/src/routes/settings/id.tsx"],"sourcesContent":["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 { Box, 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={\n // The back link for mobile works differently; it is placed higher up in the DOM.\n <Box display={{ initial: 'none', medium: 'block' }}>\n <BackButton fallback=\"..\" />\n </Box>\n }\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 fullWidth\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":["WORKFLOW_SCHEMA","yup","object","contentTypes","array","of","string","name","max","id","defaultMessage","required","nullable","stages","shape","test","stageName","context","from","value","filter","stage","length","color","matches","permissions","role","number","strict","typeError","action","min","stageRequiredToPublish","EditPage","useParams","isCreatingWorkflow","formatMessage","useIntl","_unstableFormatValidationErrors","formatValidationErrors","useAPIErrorHandler","navigate","useNavigate","toggleNotification","useNotification","isLoading","isLoadingWorkflow","meta","workflows","error","update","create","useReviewWorkflows","useTypedSelector","state","admin_app","allowedActions","canDelete","canUpdate","canCreate","useRBAC","savePrompts","setSavePrompts","React","useState","getFeature","isLicenseLoading","useLicenseLimits","showLimitModal","setShowLimitModal","currentWorkflow","find","workflow","parseInt","contentTypesFromOtherWorkflows","flatMap","limits","numberOfWorkflows","CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME","stagesPerWorkflow","CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME","submitForm","data","helpers","rest","stageRequiredToPublishName","Number","__temp_key__","res","map","hasUpdatedPermissions","serverStage","every","serverPermission","permission","undefined","isBaseQueryError","setErrors","replace","type","message","handleConfirmDeleteDialog","handleConfirmClose","handleSubmit","isContentTypeReassignment","some","contentType","includes","hasDeletedServerStages","newStage","workflowCount","prev","hasReassignedContentTypes","useEffect","initialValues","useMemo","addTmpKeysToStages","toString","_jsx","Page","Loading","Error","_jsxs","_Fragment","Layout","Form","method","validationSchema","onSubmit","modified","isSubmitting","values","navigationAction","Box","display","initial","medium","BackButton","fallback","primaryAction","Button","startIcon","Check","disabled","loading","Boolean","Object","keys","fullWidth","subtitle","count","title","Flex","alignItems","direction","gap","WorkflowAttributes","Stages","isCreating","Dialog","Root","open","onOpenChange","ConfirmDialog","onConfirm","Typography","textAlign","variant","LimitsModal","Title","Body","generateNKeysBetween","datum","index","ProtectedEditPage","read","settings","Protect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"id.js","sources":["../../../../admin/src/routes/settings/id.tsx"],"sourcesContent":["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 { Box, 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 {\n Stage,\n StagePermission,\n Workflow,\n} from '../../../../shared/contracts/review-workflows';\n\nconst havePermissionsChanged = (before?: StagePermission[], after?: StagePermission[]): boolean => {\n if (before?.length !== after?.length) {\n return true;\n }\n return !before?.every((beforePermission) =>\n after?.some((afterPermission) => afterPermission.role === beforePermission.role)\n );\n};\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 fromPermissions: 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 toPermissions: 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 const serverStage = currentWorkflow?.stages?.find(\n (serverStage) => serverStage.id === stage?.id\n );\n\n const hasUpdatedPermissions =\n !serverStage ||\n havePermissionsChanged(serverStage.fromPermissions, stage.fromPermissions);\n const hasUpdatedToPermissions =\n !serverStage ||\n havePermissionsChanged(serverStage.toPermissions, stage.toPermissions);\n\n return {\n ...stage,\n fromPermissions: hasUpdatedPermissions ? stage.fromPermissions : undefined,\n toPermissions: hasUpdatedToPermissions ? stage.toPermissions : 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={\n // The back link for mobile works differently; it is placed higher up in the DOM.\n <Box display={{ initial: 'none', medium: 'block' }}>\n <BackButton fallback=\"..\" />\n </Box>\n }\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 fullWidth\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":["havePermissionsChanged","before","after","length","every","beforePermission","some","afterPermission","role","WORKFLOW_SCHEMA","yup","object","contentTypes","array","of","string","name","max","id","defaultMessage","required","nullable","stages","shape","test","stageName","context","from","value","filter","stage","color","matches","fromPermissions","number","strict","typeError","action","toPermissions","min","stageRequiredToPublish","EditPage","useParams","isCreatingWorkflow","formatMessage","useIntl","_unstableFormatValidationErrors","formatValidationErrors","useAPIErrorHandler","navigate","useNavigate","toggleNotification","useNotification","isLoading","isLoadingWorkflow","meta","workflows","error","update","create","useReviewWorkflows","permissions","useTypedSelector","state","admin_app","allowedActions","canDelete","canUpdate","canCreate","useRBAC","savePrompts","setSavePrompts","React","useState","getFeature","isLicenseLoading","useLicenseLimits","showLimitModal","setShowLimitModal","currentWorkflow","find","workflow","parseInt","contentTypesFromOtherWorkflows","flatMap","limits","numberOfWorkflows","CHARGEBEE_WORKFLOW_ENTITLEMENT_NAME","stagesPerWorkflow","CHARGEBEE_STAGES_PER_WORKFLOW_ENTITLEMENT_NAME","submitForm","data","helpers","rest","stageRequiredToPublishName","Number","__temp_key__","res","map","serverStage","hasUpdatedPermissions","hasUpdatedToPermissions","undefined","isBaseQueryError","setErrors","replace","type","message","handleConfirmDeleteDialog","handleConfirmClose","handleSubmit","isContentTypeReassignment","contentType","includes","hasDeletedServerStages","newStage","workflowCount","prev","hasReassignedContentTypes","useEffect","initialValues","useMemo","addTmpKeysToStages","toString","_jsx","Page","Loading","Error","_jsxs","_Fragment","Layout","Form","method","validationSchema","onSubmit","modified","isSubmitting","values","navigationAction","Box","display","initial","medium","BackButton","fallback","primaryAction","Button","startIcon","Check","disabled","loading","Boolean","Object","keys","fullWidth","subtitle","count","title","Flex","alignItems","direction","gap","WorkflowAttributes","Stages","isCreating","Dialog","Root","open","onOpenChange","ConfirmDialog","onConfirm","Typography","textAlign","variant","LimitsModal","Title","Body","generateNKeysBetween","datum","index","ProtectedEditPage","read","settings","Protect"],"mappings":"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"}
|
|
@@ -17,6 +17,12 @@ import { Stages } from './components/Stages.mjs';
|
|
|
17
17
|
import { WorkflowAttributes } from './components/WorkflowAttributes.mjs';
|
|
18
18
|
import { useReviewWorkflows } from './hooks/useReviewWorkflows.mjs';
|
|
19
19
|
|
|
20
|
+
const havePermissionsChanged = (before, after)=>{
|
|
21
|
+
if (before?.length !== after?.length) {
|
|
22
|
+
return true;
|
|
23
|
+
}
|
|
24
|
+
return !before?.every((beforePermission)=>after?.some((afterPermission)=>afterPermission.role === beforePermission.role));
|
|
25
|
+
};
|
|
20
26
|
/* -------------------------------------------------------------------------------------------------
|
|
21
27
|
* EditPage
|
|
22
28
|
* -----------------------------------------------------------------------------------------------*/ const WORKFLOW_SCHEMA = yup.object({
|
|
@@ -44,7 +50,17 @@ import { useReviewWorkflows } from './hooks/useReviewWorkflows.mjs';
|
|
|
44
50
|
id: 'review-workflows.validation.stage.color',
|
|
45
51
|
defaultMessage: 'Color is required'
|
|
46
52
|
}).matches(/^#(?:[0-9a-fA-F]{3}){1,2}$/i),
|
|
47
|
-
|
|
53
|
+
fromPermissions: yup.array(yup.object({
|
|
54
|
+
role: yup.number().strict().typeError({
|
|
55
|
+
id: 'review-workflows.validation.stage.permissions.role.number',
|
|
56
|
+
defaultMessage: 'Role must be of type number'
|
|
57
|
+
}).required(),
|
|
58
|
+
action: yup.string().required({
|
|
59
|
+
id: 'review-workflows.validation.stage.permissions.action.required',
|
|
60
|
+
defaultMessage: 'Action is a required argument'
|
|
61
|
+
})
|
|
62
|
+
})).strict(),
|
|
63
|
+
toPermissions: yup.array(yup.object({
|
|
48
64
|
role: yup.number().strict().typeError({
|
|
49
65
|
id: 'review-workflows.validation.stage.permissions.role.number',
|
|
50
66
|
defaultMessage: 'Role must be of type number'
|
|
@@ -86,14 +102,13 @@ const EditPage = ()=>{
|
|
|
86
102
|
// changed; this enables partial updates e.g. for users who don't have
|
|
87
103
|
// permissions to see roles
|
|
88
104
|
stages: rest.stages.map((stage)=>{
|
|
89
|
-
let hasUpdatedPermissions = true;
|
|
90
105
|
const serverStage = currentWorkflow?.stages?.find((serverStage)=>serverStage.id === stage?.id);
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
}
|
|
106
|
+
const hasUpdatedPermissions = !serverStage || havePermissionsChanged(serverStage.fromPermissions, stage.fromPermissions);
|
|
107
|
+
const hasUpdatedToPermissions = !serverStage || havePermissionsChanged(serverStage.toPermissions, stage.toPermissions);
|
|
94
108
|
return {
|
|
95
109
|
...stage,
|
|
96
|
-
|
|
110
|
+
fromPermissions: hasUpdatedPermissions ? stage.fromPermissions : undefined,
|
|
111
|
+
toPermissions: hasUpdatedToPermissions ? stage.toPermissions : undefined
|
|
97
112
|
};
|
|
98
113
|
}),
|
|
99
114
|
stageRequiredToPublishName
|