@strapi/review-workflows 5.57.0 → 5.59.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/content-manager/model/id/components/Header.js +6 -6
- package/dist/admin/routes/content-manager/model/id/components/Header.js.map +1 -1
- package/dist/admin/routes/content-manager/model/id/components/Header.mjs +6 -6
- package/dist/admin/routes/content-manager/model/id/components/Header.mjs.map +1 -1
- package/dist/admin/routes/content-manager/model/id/components/Panel.js +6 -6
- package/dist/admin/routes/content-manager/model/id/components/Panel.js.map +1 -1
- package/dist/admin/routes/content-manager/model/id/components/Panel.mjs +6 -6
- package/dist/admin/routes/content-manager/model/id/components/Panel.mjs.map +1 -1
- package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.js +13 -0
- package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.js.map +1 -0
- package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.mjs +11 -0
- package/dist/admin/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.mjs.map +1 -0
- package/dist/admin/routes/settings/components/Stages.js.map +1 -1
- package/dist/admin/routes/settings/components/Stages.mjs.map +1 -1
- package/dist/admin/src/routes/content-manager/model/id/components/Header.d.ts +2 -1
- package/dist/admin/src/routes/content-manager/model/id/hooks/useIsReviewWorkflowVisible.d.ts +5 -0
- package/dist/server/controllers/workflows.js +6 -10
- package/dist/server/controllers/workflows.js.map +1 -1
- package/dist/server/controllers/workflows.mjs +6 -10
- package/dist/server/controllers/workflows.mjs.map +1 -1
- package/dist/server/entitlements.js +29 -0
- package/dist/server/entitlements.js.map +1 -0
- package/dist/server/entitlements.mjs +27 -0
- package/dist/server/entitlements.mjs.map +1 -0
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -1
- package/dist/server/index.mjs +5 -0
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/register.js +2 -0
- package/dist/server/register.js.map +1 -1
- package/dist/server/register.mjs +2 -0
- package/dist/server/register.mjs.map +1 -1
- package/dist/server/services/metrics/index.js +2 -2
- package/dist/server/services/metrics/index.js.map +1 -1
- package/dist/server/services/metrics/index.mjs +2 -2
- package/dist/server/services/metrics/index.mjs.map +1 -1
- package/dist/server/services/metrics/weekly-metrics.js +1 -1
- package/dist/server/services/metrics/weekly-metrics.js.map +1 -1
- package/dist/server/services/metrics/weekly-metrics.mjs +1 -1
- package/dist/server/services/metrics/weekly-metrics.mjs.map +1 -1
- package/dist/server/services/stage-permissions.js +4 -4
- package/dist/server/services/stage-permissions.js.map +1 -1
- package/dist/server/services/stage-permissions.mjs +4 -4
- package/dist/server/services/stage-permissions.mjs.map +1 -1
- package/dist/server/services/stages.js +2 -2
- package/dist/server/services/stages.js.map +1 -1
- package/dist/server/services/stages.mjs +2 -2
- package/dist/server/services/stages.mjs.map +1 -1
- package/dist/server/services/workflows.js +2 -2
- package/dist/server/services/workflows.js.map +1 -1
- package/dist/server/services/workflows.mjs +2 -2
- package/dist/server/services/workflows.mjs.map +1 -1
- package/dist/server/src/controllers/workflows.d.ts.map +1 -1
- package/dist/server/src/entitlements.d.ts +7 -0
- package/dist/server/src/entitlements.d.ts.map +1 -0
- package/dist/server/src/index.d.ts +21 -21
- package/dist/server/src/index.d.ts.map +1 -1
- package/dist/server/src/register.d.ts.map +1 -1
- package/dist/server/src/services/index.d.ts +5 -8
- package/dist/server/src/services/index.d.ts.map +1 -1
- package/dist/server/src/services/metrics/index.d.ts +8 -2
- package/dist/server/src/services/metrics/index.d.ts.map +1 -1
- package/dist/server/src/services/metrics/weekly-metrics.d.ts +2 -6
- package/dist/server/src/services/metrics/weekly-metrics.d.ts.map +1 -1
- package/dist/server/src/services/workflows.d.ts +5 -3
- package/dist/server/src/services/workflows.d.ts.map +1 -1
- package/dist/shared/contracts/review-workflows.d.ts.map +1 -1
- package/package.json +10 -8
|
@@ -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 type FormErrors,\n type 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\ntype WorkflowFormValues = {\n stages: WorkflowStage[];\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 }: 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(\n 'Stages',\n (state) => (state.errors as FormErrors<WorkflowFormValues>).stages\n );\n const stageError = Array.isArray(stageErrors) ? stageErrors[index] : undefined;\n const error = typeof stageError === 'object' && stageError !== null ? stageError : undefined;\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: 'review-workflows.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(\n 'PermissionsField',\n (state) => (state.values as Partial<WorkflowFormValues>).stages ?? []\n );\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","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","stageError","Array","isArray","undefined","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","$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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"}
|
|
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 type FormErrors,\n type 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<\n IStage,\n 'id' | 'name' | 'fromPermissions' | 'toPermissions' | 'color'\n> {\n __temp_key__: string;\n}\n\ntype WorkflowFormValues = {\n stages: WorkflowStage[];\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 }: 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(\n 'Stages',\n (state) => (state.errors as FormErrors<WorkflowFormValues>).stages\n );\n const stageError = Array.isArray(stageErrors) ? stageErrors[index] : undefined;\n const error = typeof stageError === 'object' && stageError !== null ? stageError : undefined;\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: 'review-workflows.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 extends Omit<\n Extract<InputProps, { type: 'enumeration' }>,\n 'type' | 'options'\n> {\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 extends Omit<\n Extract<InputProps, { type: 'enumeration' }>,\n 'type' | 'options'\n> {\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(\n 'PermissionsField',\n (state) => (state.values as Partial<WorkflowFormValues>).stages ?? []\n );\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","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","stageError","Array","isArray","undefined","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","$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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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
|
+
import type { DocumentActionProps } from '@strapi/content-manager/strapi-admin';
|
|
1
2
|
declare const Header: {
|
|
2
|
-
(): import("react/jsx-runtime").JSX.Element | null;
|
|
3
|
+
({ activeTab }: Partial<Pick<DocumentActionProps, "activeTab">>): import("react/jsx-runtime").JSX.Element | null;
|
|
3
4
|
type: string;
|
|
4
5
|
};
|
|
5
6
|
export { Header };
|
|
@@ -42,16 +42,14 @@ var workflows = {
|
|
|
42
42
|
/**
|
|
43
43
|
* Create a new workflow
|
|
44
44
|
*/ async create (ctx) {
|
|
45
|
-
const { body
|
|
46
|
-
const { sanitizeCreateInput, sanitizeOutput
|
|
45
|
+
const { body } = ctx.request;
|
|
46
|
+
const { sanitizeCreateInput, sanitizeOutput } = getWorkflowsPermissionChecker({
|
|
47
47
|
strapi
|
|
48
48
|
}, ctx.state.userAbility);
|
|
49
|
-
const { populate } = await sanitizedQuery.create(query);
|
|
50
49
|
const workflowBody = await reviewWorkflows.validateWorkflowCreate(body.data);
|
|
51
50
|
const workflowService = index.getService('workflows');
|
|
52
51
|
const createdWorkflow = await workflowService.create({
|
|
53
|
-
data: await sanitizeCreateInput(workflowBody)
|
|
54
|
-
populate
|
|
52
|
+
data: await sanitizeCreateInput(workflowBody)
|
|
55
53
|
}).then(formatWorkflowToAdmin);
|
|
56
54
|
ctx.created({
|
|
57
55
|
data: await sanitizeOutput(createdWorkflow)
|
|
@@ -61,12 +59,11 @@ var workflows = {
|
|
|
61
59
|
* Update a workflow
|
|
62
60
|
*/ async update (ctx) {
|
|
63
61
|
const { id } = ctx.params;
|
|
64
|
-
const { body
|
|
62
|
+
const { body } = ctx.request;
|
|
65
63
|
const workflowService = index.getService('workflows');
|
|
66
|
-
const { sanitizeUpdateInput, sanitizeOutput
|
|
64
|
+
const { sanitizeUpdateInput, sanitizeOutput } = getWorkflowsPermissionChecker({
|
|
67
65
|
strapi
|
|
68
66
|
}, ctx.state.userAbility);
|
|
69
|
-
const { populate } = await sanitizedQuery.update(query);
|
|
70
67
|
const workflowBody = await reviewWorkflows.validateWorkflowUpdate(body.data);
|
|
71
68
|
// Find if workflow exists
|
|
72
69
|
const workflow = await workflowService.findById(id, {
|
|
@@ -80,8 +77,7 @@ var workflows = {
|
|
|
80
77
|
const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);
|
|
81
78
|
// Update workflow
|
|
82
79
|
const updatedWorkflow = await workflowService.update(workflow, {
|
|
83
|
-
data: dataToUpdate
|
|
84
|
-
populate
|
|
80
|
+
data: dataToUpdate
|
|
85
81
|
}).then(formatWorkflowToAdmin);
|
|
86
82
|
// Send sanitized response
|
|
87
83
|
ctx.body = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.js","sources":["../../../server/src/controllers/workflows.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport type { StagePermission } from '../../../shared/contracts/review-workflows';\nimport { getService } from '../utils';\nimport { validateWorkflowCreate, validateWorkflowUpdate } from '../validation/review-workflows';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\n\n/**\n *\n * @param { Core.Strapi } strapi - Strapi instance\n * @param userAbility\n * @return { PermissionChecker }\n */\nfunction getWorkflowsPermissionChecker({ strapi }: { strapi: Core.Strapi }, userAbility: unknown) {\n return strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model: WORKFLOW_MODEL_UID });\n}\n\n/**\n * Transforms workflow to an admin UI format.\n * Some attributes (like permissions) are presented in a different format in the admin UI.\n *\n * Permissions stored on each stage are split into two arrays:\n * - `fromPermissions`: entries with `actionParameters.from` (controls who can move\n * content out of the stage)\n * - `toPermissions`: entries with `actionParameters.to` (controls who can move\n * content into the stage)\n *\n * Role objects are also flattened to their numeric id.\n */\n\n/**\n * Shape of a permission row as returned by the DB populate.\n */\ninterface PopulatedPermission {\n action: string;\n subject?: string | null;\n role: number | { id: number };\n actionParameters?: { from?: number; to?: number };\n}\n\ninterface PopulatedStage {\n permissions?: PopulatedPermission[];\n [key: string]: unknown;\n}\n\nfunction formatWorkflowToAdmin(workflow: { stages?: PopulatedStage[]; [key: string]: unknown }) {\n if (!workflow) return;\n if (!workflow.stages) return workflow;\n\n const transformRoleToId = ({\n actionParameters: _,\n role,\n ...rest\n }: PopulatedPermission): StagePermission => ({\n ...rest,\n role: typeof role === 'object' ? role.id : role,\n });\n\n const stages = workflow.stages.map((stage) => {\n const { permissions: allPermissions = [], ...rest } = stage;\n\n const fromPermissions = allPermissions\n .filter((p) => p.actionParameters?.from)\n .map((permission) => transformRoleToId(permission));\n\n const toPermissions = allPermissions\n .filter((p) => p.actionParameters?.to)\n .map((permission) => transformRoleToId(permission));\n\n return {\n ...rest,\n fromPermissions,\n toPermissions,\n };\n });\n\n return { ...workflow, stages };\n}\n\nexport default {\n /**\n * Create a new workflow\n */\n async create(ctx: Context) {\n const { body, query } = ctx.request;\n const { sanitizeCreateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.create(query);\n\n const workflowBody = await validateWorkflowCreate(body.data);\n\n const workflowService = getService('workflows');\n const createdWorkflow = await workflowService\n .create({\n data: await sanitizeCreateInput(workflowBody),\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n ctx.created({\n data: await sanitizeOutput(createdWorkflow),\n });\n },\n\n /**\n * Update a workflow\n */\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { body, query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeUpdateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.update(query);\n const workflowBody = await validateWorkflowUpdate(body.data);\n\n // Find if workflow exists\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound();\n }\n\n // Sanitize input data\n const getPermittedFieldToUpdate = sanitizeUpdateInput(workflow);\n const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);\n\n // Update workflow\n const updatedWorkflow = await workflowService\n .update(workflow, {\n data: dataToUpdate,\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n // Send sanitized response\n ctx.body = {\n data: await sanitizeOutput(updatedWorkflow),\n };\n },\n\n /**\n * Delete a workflow\n */\n async delete(ctx: Context) {\n const { id } = ctx.params;\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.delete(query);\n\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound(\"Workflow doesn't exist\");\n }\n\n const deletedWorkflow = await workflowService\n .delete(workflow, { populate })\n .then(formatWorkflowToAdmin);\n\n ctx.body = {\n data: await sanitizeOutput(deletedWorkflow),\n };\n },\n\n /**\n * List all workflows\n */\n async find(ctx: Context) {\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate, filters, sort } = await sanitizedQuery.read(query);\n\n const [workflows, workflowCount] = await Promise.all([\n workflowService\n .find({ populate, filters, sort })\n .then((workflows: Parameters<typeof formatWorkflowToAdmin>[0][]) =>\n workflows.map((workflow) => formatWorkflowToAdmin(workflow))\n ),\n workflowService.count(),\n ]);\n\n ctx.body = {\n data: await async.map(workflows, sanitizeOutput),\n meta: {\n workflowCount,\n },\n };\n },\n};\n"],"names":["getWorkflowsPermissionChecker","strapi","userAbility","plugin","service","create","model","WORKFLOW_MODEL_UID","formatWorkflowToAdmin","workflow","stages","transformRoleToId","actionParameters","_","role","rest","id","map","stage","permissions","allPermissions","fromPermissions","filter","p","from","permission","toPermissions","to","ctx","body","query","request","sanitizeCreateInput","sanitizeOutput","sanitizedQuery","state","populate","workflowBody","validateWorkflowCreate","data","workflowService","getService","createdWorkflow","then","created","update","params","sanitizeUpdateInput","validateWorkflowUpdate","findById","WORKFLOW_POPULATE","notFound","getPermittedFieldToUpdate","dataToUpdate","updatedWorkflow","delete","deletedWorkflow","find","filters","sort","read","workflows","workflowCount","Promise","all","count","async","meta"],"mappings":";;;;;;;AAUA;;;;;AAKC,IACD,SAASA,6BAAAA,CAA8B,EAAEC,QAAAA,OAAM,EAA2B,EAAEC,WAAoB,EAAA;IAC9F,OAAOD,OAAAA,CACJE,MAAM,CAAC,iBAAA,CAAA,CACPC,OAAO,CAAC,oBAAA,CAAA,CACRC,MAAM,CAAC;AAAEH,QAAAA,WAAAA;QAAaI,KAAAA,EAAOC;AAAmB,KAAA,CAAA;AACrD;AA8BA,SAASC,sBAAsBC,QAA+D,EAAA;AAC5F,IAAA,IAAI,CAACA,QAAAA,EAAU;AACf,IAAA,IAAI,CAACA,QAAAA,CAASC,MAAM,EAAE,OAAOD,QAAAA;IAE7B,MAAME,iBAAAA,GAAoB,CAAC,EACzBC,gBAAAA,EAAkBC,CAAC,EACnBC,IAAI,EACJ,GAAGC,IAAAA,EACiB,IAAuB;AAC3C,YAAA,GAAGA,IAAI;AACPD,YAAAA,IAAAA,EAAM,OAAOA,IAAAA,KAAS,QAAA,GAAWA,IAAAA,CAAKE,EAAE,GAAGF;SAC7C,CAAA;AAEA,IAAA,MAAMJ,SAASD,QAAAA,CAASC,MAAM,CAACO,GAAG,CAAC,CAACC,KAAAA,GAAAA;AAClC,QAAA,MAAM,EAAEC,WAAAA,EAAaC,cAAAA,GAAiB,EAAE,EAAE,GAAGL,MAAM,GAAGG,KAAAA;AAEtD,QAAA,MAAMG,eAAAA,GAAkBD,cAAAA,CACrBE,MAAM,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEX,gBAAgB,EAAEY,IAAAA,CAAAA,CAClCP,GAAG,CAAC,CAACQ,aAAed,iBAAAA,CAAkBc,UAAAA,CAAAA,CAAAA;AAEzC,QAAA,MAAMC,aAAAA,GAAgBN,cAAAA,CACnBE,MAAM,CAAC,CAACC,CAAAA,GAAMA,CAAAA,CAAEX,gBAAgB,EAAEe,EAAAA,CAAAA,CAClCV,GAAG,CAAC,CAACQ,aAAed,iBAAAA,CAAkBc,UAAAA,CAAAA,CAAAA;QAEzC,OAAO;AACL,YAAA,GAAGV,IAAI;AACPM,YAAAA,eAAAA;AACAK,YAAAA;AACF,SAAA;AACF,IAAA,CAAA,CAAA;IAEA,OAAO;AAAE,QAAA,GAAGjB,QAAQ;AAAEC,QAAAA;AAAO,KAAA;AAC/B;AAEA,gBAAe;AACb;;MAGA,MAAML,QAAOuB,GAAY,EAAA;AACvB,QAAA,MAAM,EAAEC,IAAI,EAAEC,KAAK,EAAE,GAAGF,IAAIG,OAAO;QACnC,MAAM,EAAEC,mBAAmB,EAAEC,cAAc,EAAEC,cAAc,EAAE,GAAGlC,6BAAAA,CAC9D;AAAEC,YAAAA;SAAO,EACT2B,GAAAA,CAAIO,KAAK,CAACjC,WAAW,CAAA;AAEvB,QAAA,MAAM,EAAEkC,QAAQ,EAAE,GAAG,MAAMF,cAAAA,CAAe7B,MAAM,CAACyB,KAAAA,CAAAA;AAEjD,QAAA,MAAMO,YAAAA,GAAe,MAAMC,sCAAAA,CAAuBT,IAAAA,CAAKU,IAAI,CAAA;AAE3D,QAAA,MAAMC,kBAAkBC,gBAAAA,CAAW,WAAA,CAAA;AACnC,QAAA,MAAMC,eAAAA,GAAkB,MAAMF,eAAAA,CAC3BnC,MAAM,CAAC;AACNkC,YAAAA,IAAAA,EAAM,MAAMP,mBAAAA,CAAoBK,YAAAA,CAAAA;AAChCD,YAAAA;AACF,SAAA,CAAA,CACCO,IAAI,CAACnC,qBAAAA,CAAAA;AAERoB,QAAAA,GAAAA,CAAIgB,OAAO,CAAC;AACVL,YAAAA,IAAAA,EAAM,MAAMN,cAAAA,CAAeS,eAAAA;AAC7B,SAAA,CAAA;AACF,IAAA,CAAA;AAEA;;MAGA,MAAMG,QAAOjB,GAAY,EAAA;AACvB,QAAA,MAAM,EAAEZ,EAAE,EAAE,GAAGY,IAAIkB,MAAM;AACzB,QAAA,MAAM,EAAEjB,IAAI,EAAEC,KAAK,EAAE,GAAGF,IAAIG,OAAO;AACnC,QAAA,MAAMS,kBAAkBC,gBAAAA,CAAW,WAAA,CAAA;QACnC,MAAM,EAAEM,mBAAmB,EAAEd,cAAc,EAAEC,cAAc,EAAE,GAAGlC,6BAAAA,CAC9D;AAAEC,YAAAA;SAAO,EACT2B,GAAAA,CAAIO,KAAK,CAACjC,WAAW,CAAA;AAEvB,QAAA,MAAM,EAAEkC,QAAQ,EAAE,GAAG,MAAMF,cAAAA,CAAeW,MAAM,CAACf,KAAAA,CAAAA;AACjD,QAAA,MAAMO,YAAAA,GAAe,MAAMW,sCAAAA,CAAuBnB,IAAAA,CAAKU,IAAI,CAAA;;AAG3D,QAAA,MAAM9B,QAAAA,GAAW,MAAM+B,eAAAA,CAAgBS,QAAQ,CAACjC,EAAAA,EAAI;YAAEoB,QAAAA,EAAUc;AAAkB,SAAA,CAAA;AAClF,QAAA,IAAI,CAACzC,QAAAA,EAAU;AACb,YAAA,OAAOmB,IAAIuB,QAAQ,EAAA;AACrB,QAAA;;AAGA,QAAA,MAAMC,4BAA4BL,mBAAAA,CAAoBtC,QAAAA,CAAAA;QACtD,MAAM4C,YAAAA,GAAe,MAAMD,yBAAAA,CAA0Bf,YAAAA,CAAAA;;AAGrD,QAAA,MAAMiB,eAAAA,GAAkB,MAAMd,eAAAA,CAC3BK,MAAM,CAACpC,QAAAA,EAAU;YAChB8B,IAAAA,EAAMc,YAAAA;AACNjB,YAAAA;AACF,SAAA,CAAA,CACCO,IAAI,CAACnC,qBAAAA,CAAAA;;AAGRoB,QAAAA,GAAAA,CAAIC,IAAI,GAAG;AACTU,YAAAA,IAAAA,EAAM,MAAMN,cAAAA,CAAeqB,eAAAA;AAC7B,SAAA;AACF,IAAA,CAAA;AAEA;;MAGA,MAAMC,QAAO3B,GAAY,EAAA;AACvB,QAAA,MAAM,EAAEZ,EAAE,EAAE,GAAGY,IAAIkB,MAAM;AACzB,QAAA,MAAM,EAAEhB,KAAK,EAAE,GAAGF,IAAIG,OAAO;AAC7B,QAAA,MAAMS,kBAAkBC,gBAAAA,CAAW,WAAA,CAAA;AACnC,QAAA,MAAM,EAAER,cAAc,EAAEC,cAAc,EAAE,GAAGlC,6BAAAA,CACzC;AAAEC,YAAAA;SAAO,EACT2B,GAAAA,CAAIO,KAAK,CAACjC,WAAW,CAAA;AAEvB,QAAA,MAAM,EAAEkC,QAAQ,EAAE,GAAG,MAAMF,cAAAA,CAAeqB,MAAM,CAACzB,KAAAA,CAAAA;AAEjD,QAAA,MAAMrB,QAAAA,GAAW,MAAM+B,eAAAA,CAAgBS,QAAQ,CAACjC,EAAAA,EAAI;YAAEoB,QAAAA,EAAUc;AAAkB,SAAA,CAAA;AAClF,QAAA,IAAI,CAACzC,QAAAA,EAAU;YACb,OAAOmB,GAAAA,CAAIuB,QAAQ,CAAC,wBAAA,CAAA;AACtB,QAAA;AAEA,QAAA,MAAMK,eAAAA,GAAkB,MAAMhB,eAAAA,CAC3Be,MAAM,CAAC9C,QAAAA,EAAU;AAAE2B,YAAAA;AAAS,SAAA,CAAA,CAC5BO,IAAI,CAACnC,qBAAAA,CAAAA;AAERoB,QAAAA,GAAAA,CAAIC,IAAI,GAAG;AACTU,YAAAA,IAAAA,EAAM,MAAMN,cAAAA,CAAeuB,eAAAA;AAC7B,SAAA;AACF,IAAA,CAAA;AAEA;;MAGA,MAAMC,MAAK7B,GAAY,EAAA;AACrB,QAAA,MAAM,EAAEE,KAAK,EAAE,GAAGF,IAAIG,OAAO;AAC7B,QAAA,MAAMS,kBAAkBC,gBAAAA,CAAW,WAAA,CAAA;AACnC,QAAA,MAAM,EAAER,cAAc,EAAEC,cAAc,EAAE,GAAGlC,6BAAAA,CACzC;AAAEC,YAAAA;SAAO,EACT2B,GAAAA,CAAIO,KAAK,CAACjC,WAAW,CAAA;QAEvB,MAAM,EAAEkC,QAAQ,EAAEsB,OAAO,EAAEC,IAAI,EAAE,GAAG,MAAMzB,cAAAA,CAAe0B,IAAI,CAAC9B,KAAAA,CAAAA;AAE9D,QAAA,MAAM,CAAC+B,SAAAA,EAAWC,aAAAA,CAAc,GAAG,MAAMC,OAAAA,CAAQC,GAAG,CAAC;AACnDxB,YAAAA,eAAAA,CACGiB,IAAI,CAAC;AAAErB,gBAAAA,QAAAA;AAAUsB,gBAAAA,OAAAA;AAASC,gBAAAA;aAAK,CAAA,CAC/BhB,IAAI,CAAC,CAACkB,SAAAA,GACLA,UAAU5C,GAAG,CAAC,CAACR,QAAAA,GAAaD,qBAAAA,CAAsBC,QAAAA,CAAAA,CAAAA,CAAAA;AAEtD+B,YAAAA,eAAAA,CAAgByB,KAAK;AACtB,SAAA,CAAA;AAEDrC,QAAAA,GAAAA,CAAIC,IAAI,GAAG;AACTU,YAAAA,IAAAA,EAAM,MAAM2B,WAAAA,CAAMjD,GAAG,CAAC4C,SAAAA,EAAW5B,cAAAA,CAAAA;YACjCkC,IAAAA,EAAM;AACJL,gBAAAA;AACF;AACF,SAAA;AACF,IAAA;AACF,CAAA;;;;"}
|
|
1
|
+
{"version":3,"file":"workflows.js","sources":["../../../server/src/controllers/workflows.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport type { StagePermission } from '../../../shared/contracts/review-workflows';\nimport { getService } from '../utils';\nimport { validateWorkflowCreate, validateWorkflowUpdate } from '../validation/review-workflows';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\n\n/**\n *\n * @param { Core.Strapi } strapi - Strapi instance\n * @param userAbility\n * @return { PermissionChecker }\n */\nfunction getWorkflowsPermissionChecker({ strapi }: { strapi: Core.Strapi }, userAbility: unknown) {\n return strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model: WORKFLOW_MODEL_UID });\n}\n\n/**\n * Transforms workflow to an admin UI format.\n * Some attributes (like permissions) are presented in a different format in the admin UI.\n *\n * Permissions stored on each stage are split into two arrays:\n * - `fromPermissions`: entries with `actionParameters.from` (controls who can move\n * content out of the stage)\n * - `toPermissions`: entries with `actionParameters.to` (controls who can move\n * content into the stage)\n *\n * Role objects are also flattened to their numeric id.\n */\n\n/**\n * Shape of a permission row as returned by the DB populate.\n */\ninterface PopulatedPermission {\n action: string;\n subject?: string | null;\n role: number | { id: number };\n actionParameters?: { from?: number; to?: number };\n}\n\ninterface PopulatedStage {\n permissions?: PopulatedPermission[];\n [key: string]: unknown;\n}\n\nfunction formatWorkflowToAdmin(workflow: { stages?: PopulatedStage[]; [key: string]: unknown }) {\n if (!workflow) return;\n if (!workflow.stages) return workflow;\n\n const transformRoleToId = ({\n actionParameters: _,\n role,\n ...rest\n }: PopulatedPermission): StagePermission => ({\n ...rest,\n role: typeof role === 'object' ? role.id : role,\n });\n\n const stages = workflow.stages.map((stage) => {\n const { permissions: allPermissions = [], ...rest } = stage;\n\n const fromPermissions = allPermissions\n .filter((p) => p.actionParameters?.from)\n .map((permission) => transformRoleToId(permission));\n\n const toPermissions = allPermissions\n .filter((p) => p.actionParameters?.to)\n .map((permission) => transformRoleToId(permission));\n\n return {\n ...rest,\n fromPermissions,\n toPermissions,\n };\n });\n\n return { ...workflow, stages };\n}\n\nexport default {\n /**\n * Create a new workflow\n */\n async create(ctx: Context) {\n const { body } = ctx.request;\n const { sanitizeCreateInput, sanitizeOutput } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n\n const workflowBody = await validateWorkflowCreate(body.data);\n\n const workflowService = getService('workflows');\n const createdWorkflow = await workflowService\n .create({\n data: await sanitizeCreateInput(workflowBody),\n })\n .then(formatWorkflowToAdmin);\n\n ctx.created({\n data: await sanitizeOutput(createdWorkflow),\n });\n },\n\n /**\n * Update a workflow\n */\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { body } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeUpdateInput, sanitizeOutput } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const workflowBody = await validateWorkflowUpdate(body.data);\n\n // Find if workflow exists\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound();\n }\n\n // Sanitize input data\n const getPermittedFieldToUpdate = sanitizeUpdateInput(workflow);\n const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);\n\n // Update workflow\n const updatedWorkflow = await workflowService\n .update(workflow, {\n data: dataToUpdate,\n })\n .then(formatWorkflowToAdmin);\n\n // Send sanitized response\n ctx.body = {\n data: await sanitizeOutput(updatedWorkflow),\n };\n },\n\n /**\n * Delete a workflow\n */\n async delete(ctx: Context) {\n const { id } = ctx.params;\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.delete(query);\n\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound(\"Workflow doesn't exist\");\n }\n\n const deletedWorkflow = await workflowService\n .delete(workflow, { populate })\n .then(formatWorkflowToAdmin);\n\n ctx.body = {\n data: await sanitizeOutput(deletedWorkflow),\n };\n },\n\n /**\n * List all workflows\n */\n async find(ctx: Context) {\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate, filters, sort } = await sanitizedQuery.read(query);\n\n const [workflows, workflowCount] = await Promise.all([\n workflowService\n .find({ populate, filters, sort })\n .then((workflows: Parameters<typeof formatWorkflowToAdmin>[0][]) =>\n workflows.map((workflow) => formatWorkflowToAdmin(workflow))\n ),\n workflowService.count(),\n ]);\n\n ctx.body = {\n data: await async.map(workflows, sanitizeOutput),\n meta: {\n workflowCount,\n },\n };\n },\n};\n"],"names":["getWorkflowsPermissionChecker","strapi","userAbility","plugin","service","create","model","WORKFLOW_MODEL_UID","formatWorkflowToAdmin","workflow","stages","transformRoleToId","actionParameters","_","role","rest","id","map","stage","permissions","allPermissions","fromPermissions","filter","p","from","permission","toPermissions","to","ctx","body","request","sanitizeCreateInput","sanitizeOutput","state","workflowBody","validateWorkflowCreate","data","workflowService","getService","createdWorkflow","then","created","update","params","sanitizeUpdateInput","validateWorkflowUpdate","findById","populate","WORKFLOW_POPULATE","notFound","getPermittedFieldToUpdate","dataToUpdate","updatedWorkflow","delete","query","sanitizedQuery","deletedWorkflow","find","filters","sort","read","workflows","workflowCount","Promise","all","count","async","meta"],"mappings":"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"}
|
|
@@ -40,16 +40,14 @@ var workflows = {
|
|
|
40
40
|
/**
|
|
41
41
|
* Create a new workflow
|
|
42
42
|
*/ async create (ctx) {
|
|
43
|
-
const { body
|
|
44
|
-
const { sanitizeCreateInput, sanitizeOutput
|
|
43
|
+
const { body } = ctx.request;
|
|
44
|
+
const { sanitizeCreateInput, sanitizeOutput } = getWorkflowsPermissionChecker({
|
|
45
45
|
strapi
|
|
46
46
|
}, ctx.state.userAbility);
|
|
47
|
-
const { populate } = await sanitizedQuery.create(query);
|
|
48
47
|
const workflowBody = await validateWorkflowCreate(body.data);
|
|
49
48
|
const workflowService = getService('workflows');
|
|
50
49
|
const createdWorkflow = await workflowService.create({
|
|
51
|
-
data: await sanitizeCreateInput(workflowBody)
|
|
52
|
-
populate
|
|
50
|
+
data: await sanitizeCreateInput(workflowBody)
|
|
53
51
|
}).then(formatWorkflowToAdmin);
|
|
54
52
|
ctx.created({
|
|
55
53
|
data: await sanitizeOutput(createdWorkflow)
|
|
@@ -59,12 +57,11 @@ var workflows = {
|
|
|
59
57
|
* Update a workflow
|
|
60
58
|
*/ async update (ctx) {
|
|
61
59
|
const { id } = ctx.params;
|
|
62
|
-
const { body
|
|
60
|
+
const { body } = ctx.request;
|
|
63
61
|
const workflowService = getService('workflows');
|
|
64
|
-
const { sanitizeUpdateInput, sanitizeOutput
|
|
62
|
+
const { sanitizeUpdateInput, sanitizeOutput } = getWorkflowsPermissionChecker({
|
|
65
63
|
strapi
|
|
66
64
|
}, ctx.state.userAbility);
|
|
67
|
-
const { populate } = await sanitizedQuery.update(query);
|
|
68
65
|
const workflowBody = await validateWorkflowUpdate(body.data);
|
|
69
66
|
// Find if workflow exists
|
|
70
67
|
const workflow = await workflowService.findById(id, {
|
|
@@ -78,8 +75,7 @@ var workflows = {
|
|
|
78
75
|
const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);
|
|
79
76
|
// Update workflow
|
|
80
77
|
const updatedWorkflow = await workflowService.update(workflow, {
|
|
81
|
-
data: dataToUpdate
|
|
82
|
-
populate
|
|
78
|
+
data: dataToUpdate
|
|
83
79
|
}).then(formatWorkflowToAdmin);
|
|
84
80
|
// Send sanitized response
|
|
85
81
|
ctx.body = {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflows.mjs","sources":["../../../server/src/controllers/workflows.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport type { StagePermission } from '../../../shared/contracts/review-workflows';\nimport { getService } from '../utils';\nimport { validateWorkflowCreate, validateWorkflowUpdate } from '../validation/review-workflows';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\n\n/**\n *\n * @param { Core.Strapi } strapi - Strapi instance\n * @param userAbility\n * @return { PermissionChecker }\n */\nfunction getWorkflowsPermissionChecker({ strapi }: { strapi: Core.Strapi }, userAbility: unknown) {\n return strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model: WORKFLOW_MODEL_UID });\n}\n\n/**\n * Transforms workflow to an admin UI format.\n * Some attributes (like permissions) are presented in a different format in the admin UI.\n *\n * Permissions stored on each stage are split into two arrays:\n * - `fromPermissions`: entries with `actionParameters.from` (controls who can move\n * content out of the stage)\n * - `toPermissions`: entries with `actionParameters.to` (controls who can move\n * content into the stage)\n *\n * Role objects are also flattened to their numeric id.\n */\n\n/**\n * Shape of a permission row as returned by the DB populate.\n */\ninterface PopulatedPermission {\n action: string;\n subject?: string | null;\n role: number | { id: number };\n actionParameters?: { from?: number; to?: number };\n}\n\ninterface PopulatedStage {\n permissions?: PopulatedPermission[];\n [key: string]: unknown;\n}\n\nfunction formatWorkflowToAdmin(workflow: { stages?: PopulatedStage[]; [key: string]: unknown }) {\n if (!workflow) return;\n if (!workflow.stages) return workflow;\n\n const transformRoleToId = ({\n actionParameters: _,\n role,\n ...rest\n }: PopulatedPermission): StagePermission => ({\n ...rest,\n role: typeof role === 'object' ? role.id : role,\n });\n\n const stages = workflow.stages.map((stage) => {\n const { permissions: allPermissions = [], ...rest } = stage;\n\n const fromPermissions = allPermissions\n .filter((p) => p.actionParameters?.from)\n .map((permission) => transformRoleToId(permission));\n\n const toPermissions = allPermissions\n .filter((p) => p.actionParameters?.to)\n .map((permission) => transformRoleToId(permission));\n\n return {\n ...rest,\n fromPermissions,\n toPermissions,\n };\n });\n\n return { ...workflow, stages };\n}\n\nexport default {\n /**\n * Create a new workflow\n */\n async create(ctx: Context) {\n const { body, query } = ctx.request;\n const { sanitizeCreateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.create(query);\n\n const workflowBody = await validateWorkflowCreate(body.data);\n\n const workflowService = getService('workflows');\n const createdWorkflow = await workflowService\n .create({\n data: await sanitizeCreateInput(workflowBody),\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n ctx.created({\n data: await sanitizeOutput(createdWorkflow),\n });\n },\n\n /**\n * Update a workflow\n */\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { body, query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeUpdateInput, sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.update(query);\n const workflowBody = await validateWorkflowUpdate(body.data);\n\n // Find if workflow exists\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound();\n }\n\n // Sanitize input data\n const getPermittedFieldToUpdate = sanitizeUpdateInput(workflow);\n const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);\n\n // Update workflow\n const updatedWorkflow = await workflowService\n .update(workflow, {\n data: dataToUpdate,\n populate,\n })\n .then(formatWorkflowToAdmin);\n\n // Send sanitized response\n ctx.body = {\n data: await sanitizeOutput(updatedWorkflow),\n };\n },\n\n /**\n * Delete a workflow\n */\n async delete(ctx: Context) {\n const { id } = ctx.params;\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.delete(query);\n\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound(\"Workflow doesn't exist\");\n }\n\n const deletedWorkflow = await workflowService\n .delete(workflow, { populate })\n .then(formatWorkflowToAdmin);\n\n ctx.body = {\n data: await sanitizeOutput(deletedWorkflow),\n };\n },\n\n /**\n * List all workflows\n */\n async find(ctx: Context) {\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate, filters, sort } = await sanitizedQuery.read(query);\n\n const [workflows, workflowCount] = await Promise.all([\n workflowService\n .find({ populate, filters, sort })\n .then((workflows: Parameters<typeof formatWorkflowToAdmin>[0][]) =>\n workflows.map((workflow) => formatWorkflowToAdmin(workflow))\n ),\n workflowService.count(),\n ]);\n\n ctx.body = {\n data: await async.map(workflows, sanitizeOutput),\n meta: {\n workflowCount,\n },\n };\n },\n};\n"],"names":["getWorkflowsPermissionChecker","strapi","userAbility","plugin","service","create","model","WORKFLOW_MODEL_UID","formatWorkflowToAdmin","workflow","stages","transformRoleToId","actionParameters","_","role","rest","id","map","stage","permissions","allPermissions","fromPermissions","filter","p","from","permission","toPermissions","to","ctx","body","query","request","sanitizeCreateInput","sanitizeOutput","sanitizedQuery","state","populate","workflowBody","validateWorkflowCreate","data","workflowService","getService","createdWorkflow","then","created","update","params","sanitizeUpdateInput","validateWorkflowUpdate","findById","WORKFLOW_POPULATE","notFound","getPermittedFieldToUpdate","dataToUpdate","updatedWorkflow","delete","deletedWorkflow","find","filters","sort","read","workflows","workflowCount","Promise","all","count","async","meta"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"workflows.mjs","sources":["../../../server/src/controllers/workflows.ts"],"sourcesContent":["import type { Context } from 'koa';\n\nimport type { Core } from '@strapi/types';\nimport { async } from '@strapi/utils';\n\nimport type { StagePermission } from '../../../shared/contracts/review-workflows';\nimport { getService } from '../utils';\nimport { validateWorkflowCreate, validateWorkflowUpdate } from '../validation/review-workflows';\nimport { WORKFLOW_MODEL_UID, WORKFLOW_POPULATE } from '../constants/workflows';\n\n/**\n *\n * @param { Core.Strapi } strapi - Strapi instance\n * @param userAbility\n * @return { PermissionChecker }\n */\nfunction getWorkflowsPermissionChecker({ strapi }: { strapi: Core.Strapi }, userAbility: unknown) {\n return strapi\n .plugin('content-manager')\n .service('permission-checker')\n .create({ userAbility, model: WORKFLOW_MODEL_UID });\n}\n\n/**\n * Transforms workflow to an admin UI format.\n * Some attributes (like permissions) are presented in a different format in the admin UI.\n *\n * Permissions stored on each stage are split into two arrays:\n * - `fromPermissions`: entries with `actionParameters.from` (controls who can move\n * content out of the stage)\n * - `toPermissions`: entries with `actionParameters.to` (controls who can move\n * content into the stage)\n *\n * Role objects are also flattened to their numeric id.\n */\n\n/**\n * Shape of a permission row as returned by the DB populate.\n */\ninterface PopulatedPermission {\n action: string;\n subject?: string | null;\n role: number | { id: number };\n actionParameters?: { from?: number; to?: number };\n}\n\ninterface PopulatedStage {\n permissions?: PopulatedPermission[];\n [key: string]: unknown;\n}\n\nfunction formatWorkflowToAdmin(workflow: { stages?: PopulatedStage[]; [key: string]: unknown }) {\n if (!workflow) return;\n if (!workflow.stages) return workflow;\n\n const transformRoleToId = ({\n actionParameters: _,\n role,\n ...rest\n }: PopulatedPermission): StagePermission => ({\n ...rest,\n role: typeof role === 'object' ? role.id : role,\n });\n\n const stages = workflow.stages.map((stage) => {\n const { permissions: allPermissions = [], ...rest } = stage;\n\n const fromPermissions = allPermissions\n .filter((p) => p.actionParameters?.from)\n .map((permission) => transformRoleToId(permission));\n\n const toPermissions = allPermissions\n .filter((p) => p.actionParameters?.to)\n .map((permission) => transformRoleToId(permission));\n\n return {\n ...rest,\n fromPermissions,\n toPermissions,\n };\n });\n\n return { ...workflow, stages };\n}\n\nexport default {\n /**\n * Create a new workflow\n */\n async create(ctx: Context) {\n const { body } = ctx.request;\n const { sanitizeCreateInput, sanitizeOutput } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n\n const workflowBody = await validateWorkflowCreate(body.data);\n\n const workflowService = getService('workflows');\n const createdWorkflow = await workflowService\n .create({\n data: await sanitizeCreateInput(workflowBody),\n })\n .then(formatWorkflowToAdmin);\n\n ctx.created({\n data: await sanitizeOutput(createdWorkflow),\n });\n },\n\n /**\n * Update a workflow\n */\n async update(ctx: Context) {\n const { id } = ctx.params;\n const { body } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeUpdateInput, sanitizeOutput } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const workflowBody = await validateWorkflowUpdate(body.data);\n\n // Find if workflow exists\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound();\n }\n\n // Sanitize input data\n const getPermittedFieldToUpdate = sanitizeUpdateInput(workflow);\n const dataToUpdate = await getPermittedFieldToUpdate(workflowBody);\n\n // Update workflow\n const updatedWorkflow = await workflowService\n .update(workflow, {\n data: dataToUpdate,\n })\n .then(formatWorkflowToAdmin);\n\n // Send sanitized response\n ctx.body = {\n data: await sanitizeOutput(updatedWorkflow),\n };\n },\n\n /**\n * Delete a workflow\n */\n async delete(ctx: Context) {\n const { id } = ctx.params;\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate } = await sanitizedQuery.delete(query);\n\n const workflow = await workflowService.findById(id, { populate: WORKFLOW_POPULATE });\n if (!workflow) {\n return ctx.notFound(\"Workflow doesn't exist\");\n }\n\n const deletedWorkflow = await workflowService\n .delete(workflow, { populate })\n .then(formatWorkflowToAdmin);\n\n ctx.body = {\n data: await sanitizeOutput(deletedWorkflow),\n };\n },\n\n /**\n * List all workflows\n */\n async find(ctx: Context) {\n const { query } = ctx.request;\n const workflowService = getService('workflows');\n const { sanitizeOutput, sanitizedQuery } = getWorkflowsPermissionChecker(\n { strapi },\n ctx.state.userAbility\n );\n const { populate, filters, sort } = await sanitizedQuery.read(query);\n\n const [workflows, workflowCount] = await Promise.all([\n workflowService\n .find({ populate, filters, sort })\n .then((workflows: Parameters<typeof formatWorkflowToAdmin>[0][]) =>\n workflows.map((workflow) => formatWorkflowToAdmin(workflow))\n ),\n workflowService.count(),\n ]);\n\n ctx.body = {\n data: await async.map(workflows, sanitizeOutput),\n meta: {\n workflowCount,\n },\n };\n },\n};\n"],"names":["getWorkflowsPermissionChecker","strapi","userAbility","plugin","service","create","model","WORKFLOW_MODEL_UID","formatWorkflowToAdmin","workflow","stages","transformRoleToId","actionParameters","_","role","rest","id","map","stage","permissions","allPermissions","fromPermissions","filter","p","from","permission","toPermissions","to","ctx","body","request","sanitizeCreateInput","sanitizeOutput","state","workflowBody","validateWorkflowCreate","data","workflowService","getService","createdWorkflow","then","created","update","params","sanitizeUpdateInput","validateWorkflowUpdate","findById","populate","WORKFLOW_POPULATE","notFound","getPermittedFieldToUpdate","dataToUpdate","updatedWorkflow","delete","query","sanitizedQuery","deletedWorkflow","find","filters","sort","read","workflows","workflowCount","Promise","all","count","async","meta"],"mappings":"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"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var workflows = require('./constants/workflows.js');
|
|
4
|
+
var reviewWorkflows = require('./utils/review-workflows.js');
|
|
5
|
+
|
|
6
|
+
const optionsOf = (feature)=>typeof feature === 'object' ? feature.options : undefined;
|
|
7
|
+
/**
|
|
8
|
+
* Exposes the clamped workflow limits to the Plan card and the debug dump. Registered whatever
|
|
9
|
+
* the boot-time license says, so a lapsed or later-renewed license still resolves.
|
|
10
|
+
*/ const registerReviewWorkflowsEntitlements = (strapi)=>{
|
|
11
|
+
strapi.ee.entitlements.register({
|
|
12
|
+
feature: 'review-workflows',
|
|
13
|
+
limits: [
|
|
14
|
+
{
|
|
15
|
+
key: 'numberOfWorkflows',
|
|
16
|
+
unit: 'count',
|
|
17
|
+
get: (feature)=>reviewWorkflows.clampMaxWorkflows(Number(optionsOf(feature)?.numberOfWorkflows) || workflows.MAX_WORKFLOWS)
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
key: 'stagesPerWorkflow',
|
|
21
|
+
unit: 'count',
|
|
22
|
+
get: (feature)=>reviewWorkflows.clampMaxStagesPerWorkflow(Number(optionsOf(feature)?.stagesPerWorkflow) || workflows.MAX_STAGES_PER_WORKFLOW)
|
|
23
|
+
}
|
|
24
|
+
]
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
exports.registerReviewWorkflowsEntitlements = registerReviewWorkflowsEntitlements;
|
|
29
|
+
//# sourceMappingURL=entitlements.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlements.js","sources":["../../server/src/entitlements.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport { MAX_WORKFLOWS, MAX_STAGES_PER_WORKFLOW } from './constants/workflows';\nimport { clampMaxWorkflows, clampMaxStagesPerWorkflow } from './utils/review-workflows';\n\ntype Feature = Parameters<\n Parameters<Core.Strapi['ee']['entitlements']['register']>[0]['limits'][number]['get']\n>[0];\n\nconst optionsOf = (feature: Feature) => (typeof feature === 'object' ? feature.options : undefined);\n\n/**\n * Exposes the clamped workflow limits to the Plan card and the debug dump. Registered whatever\n * the boot-time license says, so a lapsed or later-renewed license still resolves.\n */\nexport const registerReviewWorkflowsEntitlements = (strapi: Core.Strapi) => {\n strapi.ee.entitlements.register({\n feature: 'review-workflows',\n limits: [\n {\n key: 'numberOfWorkflows',\n unit: 'count',\n get: (feature) =>\n clampMaxWorkflows(Number(optionsOf(feature)?.numberOfWorkflows) || MAX_WORKFLOWS),\n },\n {\n key: 'stagesPerWorkflow',\n unit: 'count',\n get: (feature) =>\n clampMaxStagesPerWorkflow(\n Number(optionsOf(feature)?.stagesPerWorkflow) || MAX_STAGES_PER_WORKFLOW\n ),\n },\n ],\n });\n};\n"],"names":["optionsOf","feature","options","undefined","registerReviewWorkflowsEntitlements","strapi","ee","entitlements","register","limits","key","unit","get","clampMaxWorkflows","Number","numberOfWorkflows","MAX_WORKFLOWS","clampMaxStagesPerWorkflow","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW"],"mappings":";;;;;AASA,MAAMA,SAAAA,GAAY,CAACC,OAAAA,GAAsB,OAAOA,YAAY,QAAA,GAAWA,OAAAA,CAAQC,OAAO,GAAGC,SAAAA;AAEzF;;;IAIO,MAAMC,mCAAAA,GAAsC,CAACC,MAAAA,GAAAA;AAClDA,IAAAA,MAAAA,CAAOC,EAAE,CAACC,YAAY,CAACC,QAAQ,CAAC;QAC9BP,OAAAA,EAAS,kBAAA;QACTQ,MAAAA,EAAQ;AACN,YAAA;gBACEC,GAAAA,EAAK,mBAAA;gBACLC,IAAAA,EAAM,OAAA;AACNC,gBAAAA,GAAAA,EAAK,CAACX,OAAAA,GACJY,iCAAAA,CAAkBC,MAAAA,CAAOd,SAAAA,CAAUC,UAAUc,iBAAAA,CAAAA,IAAsBC,uBAAAA;AACvE,aAAA;AACA,YAAA;gBACEN,GAAAA,EAAK,mBAAA;gBACLC,IAAAA,EAAM,OAAA;AACNC,gBAAAA,GAAAA,EAAK,CAACX,OAAAA,GACJgB,yCAAAA,CACEH,MAAAA,CAAOd,SAAAA,CAAUC,UAAUiB,iBAAAA,CAAAA,IAAsBC,iCAAAA;AAEvD;AACD;AACH,KAAA,CAAA;AACF;;;;"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { MAX_WORKFLOWS, MAX_STAGES_PER_WORKFLOW } from './constants/workflows.mjs';
|
|
2
|
+
import { clampMaxWorkflows, clampMaxStagesPerWorkflow } from './utils/review-workflows.mjs';
|
|
3
|
+
|
|
4
|
+
const optionsOf = (feature)=>typeof feature === 'object' ? feature.options : undefined;
|
|
5
|
+
/**
|
|
6
|
+
* Exposes the clamped workflow limits to the Plan card and the debug dump. Registered whatever
|
|
7
|
+
* the boot-time license says, so a lapsed or later-renewed license still resolves.
|
|
8
|
+
*/ const registerReviewWorkflowsEntitlements = (strapi)=>{
|
|
9
|
+
strapi.ee.entitlements.register({
|
|
10
|
+
feature: 'review-workflows',
|
|
11
|
+
limits: [
|
|
12
|
+
{
|
|
13
|
+
key: 'numberOfWorkflows',
|
|
14
|
+
unit: 'count',
|
|
15
|
+
get: (feature)=>clampMaxWorkflows(Number(optionsOf(feature)?.numberOfWorkflows) || MAX_WORKFLOWS)
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
key: 'stagesPerWorkflow',
|
|
19
|
+
unit: 'count',
|
|
20
|
+
get: (feature)=>clampMaxStagesPerWorkflow(Number(optionsOf(feature)?.stagesPerWorkflow) || MAX_STAGES_PER_WORKFLOW)
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
});
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export { registerReviewWorkflowsEntitlements };
|
|
27
|
+
//# sourceMappingURL=entitlements.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entitlements.mjs","sources":["../../server/src/entitlements.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport { MAX_WORKFLOWS, MAX_STAGES_PER_WORKFLOW } from './constants/workflows';\nimport { clampMaxWorkflows, clampMaxStagesPerWorkflow } from './utils/review-workflows';\n\ntype Feature = Parameters<\n Parameters<Core.Strapi['ee']['entitlements']['register']>[0]['limits'][number]['get']\n>[0];\n\nconst optionsOf = (feature: Feature) => (typeof feature === 'object' ? feature.options : undefined);\n\n/**\n * Exposes the clamped workflow limits to the Plan card and the debug dump. Registered whatever\n * the boot-time license says, so a lapsed or later-renewed license still resolves.\n */\nexport const registerReviewWorkflowsEntitlements = (strapi: Core.Strapi) => {\n strapi.ee.entitlements.register({\n feature: 'review-workflows',\n limits: [\n {\n key: 'numberOfWorkflows',\n unit: 'count',\n get: (feature) =>\n clampMaxWorkflows(Number(optionsOf(feature)?.numberOfWorkflows) || MAX_WORKFLOWS),\n },\n {\n key: 'stagesPerWorkflow',\n unit: 'count',\n get: (feature) =>\n clampMaxStagesPerWorkflow(\n Number(optionsOf(feature)?.stagesPerWorkflow) || MAX_STAGES_PER_WORKFLOW\n ),\n },\n ],\n });\n};\n"],"names":["optionsOf","feature","options","undefined","registerReviewWorkflowsEntitlements","strapi","ee","entitlements","register","limits","key","unit","get","clampMaxWorkflows","Number","numberOfWorkflows","MAX_WORKFLOWS","clampMaxStagesPerWorkflow","stagesPerWorkflow","MAX_STAGES_PER_WORKFLOW"],"mappings":";;;AASA,MAAMA,SAAAA,GAAY,CAACC,OAAAA,GAAsB,OAAOA,YAAY,QAAA,GAAWA,OAAAA,CAAQC,OAAO,GAAGC,SAAAA;AAEzF;;;IAIO,MAAMC,mCAAAA,GAAsC,CAACC,MAAAA,GAAAA;AAClDA,IAAAA,MAAAA,CAAOC,EAAE,CAACC,YAAY,CAACC,QAAQ,CAAC;QAC9BP,OAAAA,EAAS,kBAAA;QACTQ,MAAAA,EAAQ;AACN,YAAA;gBACEC,GAAAA,EAAK,mBAAA;gBACLC,IAAAA,EAAM,OAAA;AACNC,gBAAAA,GAAAA,EAAK,CAACX,OAAAA,GACJY,iBAAAA,CAAkBC,MAAAA,CAAOd,SAAAA,CAAUC,UAAUc,iBAAAA,CAAAA,IAAsBC,aAAAA;AACvE,aAAA;AACA,YAAA;gBACEN,GAAAA,EAAK,mBAAA;gBACLC,IAAAA,EAAM,OAAA;AACNC,gBAAAA,GAAAA,EAAK,CAACX,OAAAA,GACJgB,yBAAAA,CACEH,MAAAA,CAAOd,SAAAA,CAAUC,UAAUiB,iBAAAA,CAAAA,IAAsBC,uBAAAA;AAEvD;AACD;AACH,KAAA,CAAA;AACF;;;;"}
|
package/dist/server/index.js
CHANGED
|
@@ -7,6 +7,7 @@ var destroy = require('./destroy.js');
|
|
|
7
7
|
var index$1 = require('./routes/index.js');
|
|
8
8
|
var index$3 = require('./services/index.js');
|
|
9
9
|
var index$2 = require('./controllers/index.js');
|
|
10
|
+
var entitlements = require('./entitlements.js');
|
|
10
11
|
|
|
11
12
|
const getPlugin = ()=>{
|
|
12
13
|
if (strapi.ee.features.isEnabled('review-workflows')) {
|
|
@@ -21,6 +22,10 @@ const getPlugin = ()=>{
|
|
|
21
22
|
};
|
|
22
23
|
}
|
|
23
24
|
return {
|
|
25
|
+
// Keeps the limits resolvable for a license that lapsed before boot
|
|
26
|
+
register ({ strapi: strapi1 }) {
|
|
27
|
+
entitlements.registerReviewWorkflowsEntitlements(strapi1);
|
|
28
|
+
},
|
|
24
29
|
// Always return contentTypes to avoid losing data when the feature is disabled
|
|
25
30
|
// or downgrading the license
|
|
26
31
|
contentTypes: index$4
|
package/dist/server/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../server/src/index.ts"],"sourcesContent":["import register from './register';\nimport contentTypes from './content-types';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport routes from './routes';\nimport services from './services';\nimport controllers from './controllers';\n\nconst getPlugin = () => {\n if (strapi.ee.features.isEnabled('review-workflows')) {\n return {\n register,\n bootstrap,\n destroy,\n contentTypes,\n services,\n controllers,\n routes,\n };\n }\n\n return {\n // Always return contentTypes to avoid losing data when the feature is disabled\n // or downgrading the license\n contentTypes,\n };\n};\n\nexport default getPlugin();\n"],"names":["getPlugin","strapi","ee","features","isEnabled","register","bootstrap","destroy","contentTypes","services","controllers","routes"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport register from './register';\nimport contentTypes from './content-types';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport routes from './routes';\nimport services from './services';\nimport controllers from './controllers';\nimport { registerReviewWorkflowsEntitlements } from './entitlements';\n\nconst getPlugin = () => {\n if (strapi.ee.features.isEnabled('review-workflows')) {\n return {\n register,\n bootstrap,\n destroy,\n contentTypes,\n services,\n controllers,\n routes,\n };\n }\n\n return {\n // Keeps the limits resolvable for a license that lapsed before boot\n register({ strapi }: { strapi: Core.Strapi }) {\n registerReviewWorkflowsEntitlements(strapi);\n },\n // Always return contentTypes to avoid losing data when the feature is disabled\n // or downgrading the license\n contentTypes,\n };\n};\n\nexport default getPlugin();\n"],"names":["getPlugin","strapi","ee","features","isEnabled","register","bootstrap","destroy","contentTypes","services","controllers","routes","registerReviewWorkflowsEntitlements"],"mappings":";;;;;;;;;;;AAWA,MAAMA,SAAAA,GAAY,IAAA;AAChB,IAAA,IAAIC,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,kBAAA,CAAA,EAAqB;QACpD,OAAO;AACLC,YAAAA,QAAAA;AACAC,YAAAA,SAAAA;AACAC,YAAAA,OAAAA;AACAC,0BAAAA,OAAAA;AACAC,sBAAAA,OAAAA;AACAC,yBAAAA,OAAAA;AACAC,oBAAAA;AACF,SAAA;AACF,IAAA;IAEA,OAAO;;QAELN,QAAAA,CAAAA,CAAS,EAAEJ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;YAC1CW,gDAAAA,CAAoCX,OAAAA,CAAAA;AACtC,QAAA,CAAA;;;AAGAO,sBAAAA;AACF,KAAA;AACF,CAAA;AAEA,YAAeR,SAAAA,EAAAA;;;;"}
|
package/dist/server/index.mjs
CHANGED
|
@@ -5,6 +5,7 @@ import destroy from './destroy.mjs';
|
|
|
5
5
|
import routes from './routes/index.mjs';
|
|
6
6
|
import services from './services/index.mjs';
|
|
7
7
|
import controllers from './controllers/index.mjs';
|
|
8
|
+
import { registerReviewWorkflowsEntitlements } from './entitlements.mjs';
|
|
8
9
|
|
|
9
10
|
const getPlugin = ()=>{
|
|
10
11
|
if (strapi.ee.features.isEnabled('review-workflows')) {
|
|
@@ -19,6 +20,10 @@ const getPlugin = ()=>{
|
|
|
19
20
|
};
|
|
20
21
|
}
|
|
21
22
|
return {
|
|
23
|
+
// Keeps the limits resolvable for a license that lapsed before boot
|
|
24
|
+
register ({ strapi: strapi1 }) {
|
|
25
|
+
registerReviewWorkflowsEntitlements(strapi1);
|
|
26
|
+
},
|
|
22
27
|
// Always return contentTypes to avoid losing data when the feature is disabled
|
|
23
28
|
// or downgrading the license
|
|
24
29
|
contentTypes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../server/src/index.ts"],"sourcesContent":["import register from './register';\nimport contentTypes from './content-types';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport routes from './routes';\nimport services from './services';\nimport controllers from './controllers';\n\nconst getPlugin = () => {\n if (strapi.ee.features.isEnabled('review-workflows')) {\n return {\n register,\n bootstrap,\n destroy,\n contentTypes,\n services,\n controllers,\n routes,\n };\n }\n\n return {\n // Always return contentTypes to avoid losing data when the feature is disabled\n // or downgrading the license\n contentTypes,\n };\n};\n\nexport default getPlugin();\n"],"names":["getPlugin","strapi","ee","features","isEnabled","register","bootstrap","destroy","contentTypes","services","controllers","routes"],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../server/src/index.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\n\nimport register from './register';\nimport contentTypes from './content-types';\nimport bootstrap from './bootstrap';\nimport destroy from './destroy';\nimport routes from './routes';\nimport services from './services';\nimport controllers from './controllers';\nimport { registerReviewWorkflowsEntitlements } from './entitlements';\n\nconst getPlugin = () => {\n if (strapi.ee.features.isEnabled('review-workflows')) {\n return {\n register,\n bootstrap,\n destroy,\n contentTypes,\n services,\n controllers,\n routes,\n };\n }\n\n return {\n // Keeps the limits resolvable for a license that lapsed before boot\n register({ strapi }: { strapi: Core.Strapi }) {\n registerReviewWorkflowsEntitlements(strapi);\n },\n // Always return contentTypes to avoid losing data when the feature is disabled\n // or downgrading the license\n contentTypes,\n };\n};\n\nexport default getPlugin();\n"],"names":["getPlugin","strapi","ee","features","isEnabled","register","bootstrap","destroy","contentTypes","services","controllers","routes","registerReviewWorkflowsEntitlements"],"mappings":";;;;;;;;;AAWA,MAAMA,SAAAA,GAAY,IAAA;AAChB,IAAA,IAAIC,OAAOC,EAAE,CAACC,QAAQ,CAACC,SAAS,CAAC,kBAAA,CAAA,EAAqB;QACpD,OAAO;AACLC,YAAAA,QAAAA;AACAC,YAAAA,SAAAA;AACAC,YAAAA,OAAAA;AACAC,YAAAA,YAAAA;AACAC,YAAAA,QAAAA;AACAC,YAAAA,WAAAA;AACAC,YAAAA;AACF,SAAA;AACF,IAAA;IAEA,OAAO;;QAELN,QAAAA,CAAAA,CAAS,EAAEJ,MAAAA,EAAAA,OAAM,EAA2B,EAAA;YAC1CW,mCAAAA,CAAoCX,OAAAA,CAAAA;AACtC,QAAA,CAAA;;;AAGAO,QAAAA;AACF,KAAA;AACF,CAAA;AAEA,YAAeR,SAAAA,EAAAA;;;;"}
|
package/dist/server/register.js
CHANGED
|
@@ -10,6 +10,7 @@ var multipleWorkflows = require('./migrations/multiple-workflows.js');
|
|
|
10
10
|
var handleDeletedCtInWorkflows = require('./migrations/handle-deleted-ct-in-workflows.js');
|
|
11
11
|
var reviewWorkflows = require('./middlewares/review-workflows.js');
|
|
12
12
|
var reviewWorkflows$1 = require('./utils/review-workflows.js');
|
|
13
|
+
var entitlements = require('./entitlements.js');
|
|
13
14
|
var workflows = require('./constants/workflows.js');
|
|
14
15
|
|
|
15
16
|
const setRelation = (attributeName, target, contentType)=>{
|
|
@@ -106,6 +107,7 @@ var register = (async ({ strapi })=>{
|
|
|
106
107
|
strapi
|
|
107
108
|
});
|
|
108
109
|
workflowsValidationService.register(reviewWorkflowsOptions);
|
|
110
|
+
entitlements.registerReviewWorkflowsEntitlements(strapi);
|
|
109
111
|
});
|
|
110
112
|
|
|
111
113
|
module.exports = register;
|