@strapi/review-workflows 5.58.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/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/index.d.ts +5 -8
- package/dist/server/src/index.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":";;;;;;;;;;;;;;AA+DA,MAAMA,MAAAA,GAAS,CAAC,EAAEC,SAAAA,GAAY,IAAI,EAAEC,SAAAA,GAAY,IAAI,EAAe,GAAA;IACjE,MAAM,EAAEC,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;AACvB,IAAA,MAAMC,cAAcC,OAAAA,CAAQ,QAAA,EAAU,CAACC,KAAAA,GAAUA,MAAMF,WAAW,CAAA;AAClE,IAAA,MAAM,EAAEG,KAAAA,EAAOC,MAAAA,GAAS,EAAE,EAAE,GAAGC,QAAAA,CAA0B,QAAA,CAAA;AAEzD,IAAA,qBACEC,IAAA,CAACC,IAAAA,EAAAA;QAAKC,SAAAA,EAAU,QAAA;QAASC,GAAAA,EAAK,CAAA;QAAGC,KAAAA,EAAM,MAAA;;0BACrCJ,IAAA,CAACK,GAAAA,EAAAA;gBAAIC,QAAAA,EAAS,UAAA;gBAAWF,KAAAA,EAAM,MAAA;;kCAC7BG,GAAA,CAACC,UAAAA,EAAAA;wBACCC,UAAAA,EAAW,YAAA;wBACXC,MAAAA,EAAO,MAAA;wBACPC,IAAAA,EAAK,KAAA;wBACLL,QAAAA,EAAS,UAAA;wBACTM,GAAAA,EAAI,GAAA;wBACJR,KAAAA,EAAO;;kCAGTG,GAAA,CAACN,IAAAA,EAAAA;wBAAKC,SAAAA,EAAU,QAAA;wBAASW,UAAAA,EAAW,SAAA;wBAAUV,GAAAA,EAAK,CAAA;wBAAGG,QAAAA,EAAS,UAAA;wBAAWQ,GAAAA,EAAI,IAAA;kCAC3EhB,MAAAA,CAAOiB,GAAG,CAAC,CAACC,KAAAA,EAAOC,KAAAA,GAAAA;AAClB,4BAAA,qBACEV,GAAA,CAACF,GAAAA,EAAAA;gCAA6BS,GAAAA,EAAI,IAAA;AAChC,gCAAA,QAAA,gBAAAP,GAAA,CAACW,KAAAA,EAAAA;oCACCD,KAAAA,EAAOA,KAAAA;oCACP7B,SAAAA,EAAWU,MAAAA,CAAOqB,MAAM,GAAG,CAAA,IAAK/B,SAAAA;oCAChCgC,UAAAA,EAAYtB,MAAAA,CAAOqB,MAAM,GAAG,CAAA;oCAC5B9B,SAAAA,EAAWA,SAAAA;AACXgC,oCAAAA,WAAAA,EAAavB,OAAOqB,MAAM;oCAC1BG,WAAAA,EAAa,CAACN,MAAMO,EAAE;AACrB,oCAAA,GAAGP;;AAREA,6BAAAA,EAAAA,KAAAA,CAAMQ,YAAY,CAAA;AAYhC,wBAAA,CAAA;;;;AAIHnC,YAAAA,SAAAA,kBACCkB,GAAA,CAACkB,QAAAA,EAAAA;gBACCC,IAAAA,EAAK,QAAA;gBACLC,OAAAA,EAAS,IAAA;AACPjC,oBAAAA,WAAAA,CAAY,QAAA,EAAU;wBAAEkC,IAAAA,EAAM;AAAG,qBAAA,CAAA;oBACjCpC,UAAAA,CAAW,iBAAA,CAAA;AACb,gBAAA,CAAA;0BAECF,aAAAA,CAAc;oBACbiC,EAAAA,EAAI,qCAAA;oBACJM,cAAAA,EAAgB;AAClB,iBAAA;;;;AAKV;AAEA,MAAMrB,UAAAA,GAAasB,MAAAA,CAAOzB,GAAAA,CAAI;;AAE9B,CAAC;AAcD,MAAMa,KAAAA,GAAQ,CAAC,EACbD,KAAK,EACL7B,YAAY,KAAK,EACjBgC,UAAAA,GAAa,KAAK,EAClB/B,SAAAA,GAAY,KAAK,EACjBgC,WAAW,EACXO,IAAI,EACJG,eAAe,EACfC,aAAa,EACbC,KAAK,EACLX,WAAW,EACA,GAAA;AACX,IAAA,MAAM,CAACY,QAAAA,EAAUC,WAAAA,CAAY,GAAGC,MAAMC,QAAQ,EAAA;IAC9C,MAAM,EAAE/C,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEC,UAAU,EAAE,GAAGC,WAAAA,EAAAA;IACvB,MAAM6C,WAAAA,GAAc3C,QAClB,QAAA,EACA,CAACC,QAAU,KAACA,CAAM2C,MAAM,CAAoCzC,MAAM,CAAA;IAEpE,MAAM0C,UAAAA,GAAaC,MAAMC,OAAO,CAACJ,eAAeA,WAAW,CAACrB,MAAM,GAAG0B,SAAAA;AACrE,IAAA,MAAMC,QAAQ,OAAOJ,UAAAA,KAAe,QAAA,IAAYA,UAAAA,KAAe,OAAOA,UAAAA,GAAaG,SAAAA;AACnF,IAAA,MAAMjD,cAAcC,OAAAA,CAAQ,OAAA,EAAS,CAACC,KAAAA,GAAUA,MAAMF,WAAW,CAAA;AACjE,IAAA,MAAMmD,eAAelD,OAAAA,CAAQ,OAAA,EAAS,CAACC,KAAAA,GAAUA,MAAMiD,YAAY,CAAA;AACnE,IAAA,MAAMC,iBAAiBnD,OAAAA,CAAQ,OAAA,EAAS,CAACC,KAAAA,GAAUA,MAAMkD,cAAc,CAAA;IAEvE,MAAMC,UAAAA,GAAa,CAAC9B,KAAAA,GAAkB,CAAA,EAAGA,QAAQ,CAAA,CAAE,IAAI,EAAEI,WAAAA,CAAAA,CAAa;AAEtE,IAAA,MAAM2B,kBAAkB,CAAC/B,KAAAA,GAAAA;AACvBkB,QAAAA,WAAAA,CACE7C,aAAAA,CACE;YACEiC,EAAAA,EAAI,eAAA;YACJM,cAAAA,EAAgB,CAAC,sIAAsI;SACzJ,EACA;YACEoB,IAAAA,EAAMrB,IAAAA;AACNtB,YAAAA,QAAAA,EAAUyC,UAAAA,CAAW9B,KAAAA;AACvB,SAAA,CAAA,CAAA;AAGN,IAAA,CAAA;AAEA,IAAA,MAAMiC,kBAAkB,CAACjC,KAAAA,GAAAA;AACvBkB,QAAAA,WAAAA,CACE7C,aAAAA,CACE;YACEiC,EAAAA,EAAI,eAAA;YACJM,cAAAA,EAAgB,CAAC,oDAAoD;SACvE,EACA;YACEoB,IAAAA,EAAMrB,IAAAA;AACNtB,YAAAA,QAAAA,EAAUyC,UAAAA,CAAW9B,KAAAA;AACvB,SAAA,CAAA,CAAA;AAGN,IAAA,CAAA;AAEA,IAAA,MAAMkC,qBAAAA,GAAwB,IAAA;AAC5BhB,QAAAA,WAAAA,CACE7C,aAAAA,CACE;YACEiC,EAAAA,EAAI,iBAAA;YACJM,cAAAA,EAAgB;SAClB,EACA;YACEoB,IAAAA,EAAMrB;AACR,SAAA,CAAA,CAAA;AAGN,IAAA,CAAA;IAEA,MAAMwB,eAAAA,GAAkB,CAACC,QAAAA,EAAkBC,QAAAA,GAAAA;AACzCnB,QAAAA,WAAAA,CACE7C,aAAAA,CACE;YACEiC,EAAAA,EAAI,aAAA;YACJM,cAAAA,EAAgB;SAClB,EACA;YACEoB,IAAAA,EAAMrB,IAAAA;AACNtB,YAAAA,QAAAA,EAAUyC,UAAAA,CAAWM,QAAAA;AACvB,SAAA,CAAA,CAAA;AAIJR,QAAAA,YAAAA,CAAa,UAAUS,QAAAA,EAAUD,QAAAA,CAAAA;AACnC,IAAA,CAAA;AAEA,IAAA,MAAM,CAAC,EAAEE,SAAS,EAAEC,UAAU,EAAEC,aAAa,EAAE,EAAEC,UAAUC,OAAAA,EAASC,OAAAA,EAASC,cAAAA,CAAe,GAC1FC,eAAe1C,UAAAA,EAAY;AACzBH,QAAAA,KAAAA;QACAgC,IAAAA,EAAM;AACJhC,YAAAA,KAAAA;AACAW,YAAAA;AACF,SAAA;QACAmC,UAAAA,EAAYf,eAAAA;QACZgB,UAAAA,EAAYd,eAAAA;QACZe,UAAAA,EAAYb,eAAAA;QACZc,QAAAA,EAAUf,qBAAAA;AACVzB,QAAAA,IAAAA,EAAMyC,gBAAgBC;AACxB,KAAA,CAAA;;IAGF,MAAMC,WAAAA,GAAcC,gBAAgCZ,QAAAA,EAAUC,OAAAA,CAAAA;AAE9DvB,IAAAA,KAAAA,CAAMmC,SAAS,CAAC,IAAA;AACdV,QAAAA,cAAAA,CAAeW,aAAAA,EAAAA,EAAiB;YAAEC,oBAAAA,EAAsB;AAAM,SAAA,CAAA;IAChE,CAAA,EAAG;AAACZ,QAAAA,cAAAA;AAAgB5C,QAAAA;AAAM,KAAA,CAAA;AAE1B,IAAA,MAAMyD,gBAAAA,GAAmB,IAAA;AACvBhF,QAAAA,WAAAA,CAAY,QAAA,EAAU;AAAEkC,YAAAA,IAAAA;AAAMK,YAAAA,KAAAA;AAAOF,YAAAA,eAAAA;AAAiBC,YAAAA;AAAc,SAAA,CAAA;AACtE,IAAA,CAAA;IAEA,MAAMT,EAAAA,GAAKa,MAAMuC,KAAK,EAAA;AAEtB,IAAA,qBACE3E,IAAA,CAACK,GAAAA,EAAAA;QAAIuE,GAAAA,EAAKP,WAAAA;QAAaQ,MAAAA,EAAO,aAAA;;AAC3B3C,YAAAA,QAAAA,kBAAY3B,GAAA,CAACuE,cAAAA,EAAAA;gBAAeC,WAAAA,EAAU,WAAA;AAAa7C,gBAAAA,QAAAA,EAAAA;;AAEnDsB,YAAAA,UAAAA,iBACCjD,GAAA,CAACF,GAAAA,EAAAA;gBACCI,UAAAA,EAAW,YAAA;gBACXuE,WAAAA,EAAY,QAAA;gBACZC,WAAAA,EAAY,YAAA;gBACZC,WAAAA,EAAY,KAAA;gBACZC,OAAAA,EAAQ,OAAA;gBACRC,SAAS,EAAA,IAAA;gBACTC,OAAAA,EAAS;+BAGX9E,GAAA,CAAC+E,aAAAA,EAAAA;AACCC,gBAAAA,aAAAA,EAAe,CAAC1F,KAAAA,GAAAA;AACd,oBAAA,IAAIA,KAAAA,EAAO;wBACTL,UAAAA,CAAW,eAAA,CAAA;AACb,oBAAA;AACF,gBAAA,CAAA;AACAgG,gBAAAA,YAAAA,EAAclE,cAAcC,EAAAA,GAAKoB,SAAAA;AACjC8C,gBAAAA,MAAAA,EAAQC,OAAOC,MAAM,CAAC/C,SAAS,EAAC,CAAA,CAAGzB,MAAM,GAAG,CAAA;wCAE5CnB,IAAA,CAAC4F,UAAUC,IAAI,EAAA;oBAAChG,KAAAA,EAAO0B,EAAAA;;AACrB,sCAAAvB,IAAA,CAAC4F,UAAUE,MAAM,EAAA;;AACf,8CAAAvF,GAAA,CAACqF,UAAUG,OAAO,EAAA;AAAEnE,oCAAAA,QAAAA,EAAAA;;AACpB,8CAAArB,GAAA,CAACqF,UAAUI,OAAO,EAAA;AACf5G,oCAAAA,QAAAA,EAAAA,SAAAA,IAAaC,SAAAA,iBACZW,IAAA,CAAAiG,QAAA,EAAA;;AACE,0DAAAjG,IAAA,CAACkG,KAAKC,IAAI,EAAA;;kEACRnG,IAAA,CAACoG,kBAAAA,EAAAA;wDAAmBC,IAAAA,EAAK,GAAA;wDAAIC,OAAAA,EAAS,IAAA;wDAAMC,WAAAA,EAAa,CAAA;wDAAGC,YAAAA,EAAc,CAAA;;0EACxEjG,GAAA,CAACkG,IAAAA,EAAAA;gEAAKC,aAAW,EAAA,IAAA;gEAACC,SAAAA,EAAW;;0EAC7BpG,GAAA,CAACuE,cAAAA,EAAAA;gEAAehE,GAAAA,EAAI,MAAA;0EACjBxB,aAAAA,CAAc;oEACbiC,EAAAA,EAAI,4CAAA;oEACJM,cAAAA,EAAgB;AAClB,iEAAA;;;;AAMJ,kEAAAtB,GAAA,CAAC2F,KAAKU,OAAO,EAAA;wDAACC,gBAAAA,EAAiB,YAAA;wDAAaC,MAAAA,EAAQ,CAAA;gFAClD9G,IAAA,CAACkG,KAAKa,OAAO,EAAA;;gEACV1H,SAAAA,kBACCkB,GAAA,CAAC2F,KAAKL,IAAI,EAAA;oEAAClE,OAAAA,EAAS+C,gBAAAA;8EACjBpF,aAAAA,CAAc;wEACbiC,EAAAA,EAAI,wCAAA;wEACJM,cAAAA,EAAgB;AAClB,qEAAA;;gEAIHzC,SAAAA,kBACCmB,GAAA,CAAC2F,KAAKL,IAAI,EAAA;oEACRlE,OAAAA,EAAS,IAAMmB,eAAe,QAAA,EAAU7B,KAAAA,CAAAA;oEACxC+F,OAAAA,EAAQ,QAAA;8EAEP1H,aAAAA,CAAc;wEACbiC,EAAAA,EAAI,wCAAA;wEACJM,cAAAA,EAAgB;AAClB,qEAAA;;;;;;;AAOTxC,4CAAAA,SAAAA,kBACCkB,GAAA,CAAC0G,UAAAA,EAAAA;gDACCxG,UAAAA,EAAW,aAAA;gDACX2E,SAAS,EAAA,IAAA;gDACT4B,OAAAA,EAAQ,OAAA;gDACRE,iBAAAA,EAAiB3D,SAAAA;gDACjBqB,GAAAA,EAAKhB,OAAAA;AACLuD,gDAAAA,KAAAA,EAAO7H,aAAAA,CAAc;oDACnBiC,EAAAA,EAAI,sCAAA;oDACJM,cAAAA,EAAgB;AAClB,iDAAA,CAAA;gDACAF,OAAAA,EAAS,CAACyF,CAAAA,GAAMA,CAAAA,CAAEC,eAAe,EAAA;gDACjCC,SAAAA,EAAW7D,aAAAA;AAEX,gDAAA,QAAA,gBAAAlD,GAAA,CAACgH,IAAAA,EAAAA,EAAAA;;;AAIL,qCAAA,CAAA,GAAA;;;;AAGR,sCAAAhH,GAAA,CAACqF,UAAUgB,OAAO,EAAA;oDAChBrG,GAAA,CAACiH,KAAKrB,IAAI,EAAA;gCAAChG,GAAAA,EAAK,CAAA;gCAAGkF,OAAAA,EAAS,CAAA;AACzB,gCAAA,QAAA,EAAA;AACC,oCAAA;AACEoC,wCAAAA,QAAAA,EAAU,CAACpI,SAAAA;AACX8H,wCAAAA,KAAAA,EAAO7H,aAAAA,CAAc;4CACnBiC,EAAAA,EAAI,4CAAA;4CACJM,cAAAA,EAAgB;AAClB,yCAAA,CAAA;AACAD,wCAAAA,IAAAA,EAAM,CAAC,OAAO,EAAEX,KAAAA,CAAM,KAAK,CAAC;wCAC5ByG,QAAAA,EAAU,IAAA;wCACVrB,IAAAA,EAAM,CAAA;wCACN3E,IAAAA,EAAM;AACR,qCAAA;AACA,oCAAA;AACE+F,wCAAAA,QAAAA,EAAU,CAACpI,SAAAA;AACX8H,wCAAAA,KAAAA,EAAO7H,aAAAA,CAAc;4CACnBiC,EAAAA,EAAI,8BAAA;4CACJM,cAAAA,EAAgB;AAClB,yCAAA,CAAA;AACAD,wCAAAA,IAAAA,EAAM,CAAC,OAAO,EAAEX,KAAAA,CAAM,MAAM,CAAC;wCAC7ByG,QAAAA,EAAU,IAAA;wCACVrB,IAAAA,EAAM,CAAA;wCACN3E,IAAAA,EAAM;AACR,qCAAA;AACA,oCAAA;AACE+F,wCAAAA,QAAAA,EAAU,CAACpI,SAAAA;AACX8H,wCAAAA,KAAAA,EAAO7H,aAAAA,CAAc;4CACnBiC,EAAAA,EAAI,mDAAA;4CACJM,cAAAA,EAAgB;AAClB,yCAAA,CAAA;AACAD,wCAAAA,IAAAA,EAAM,CAAC,OAAO,EAAEX,KAAAA,CAAM,gBAAgB,CAAC;AACvC0G,wCAAAA,WAAAA,EAAarI,aAAAA,CAAc;4CACzBiC,EAAAA,EAAI,yDAAA;4CACJM,cAAAA,EAAgB;AAClB,yCAAA,CAAA;wCACA6F,QAAAA,EAAU,IAAA;wCACVrB,IAAAA,EAAM,CAAA;wCACN3E,IAAAA,EAAM;AACR,qCAAA;AACA,oCAAA;AACE+F,wCAAAA,QAAAA,EAAU,CAACpI,SAAAA;AACX8H,wCAAAA,KAAAA,EAAO7H,aAAAA,CAAc;4CACnBiC,EAAAA,EAAI,qDAAA;4CACJM,cAAAA,EAAgB;AAClB,yCAAA,CAAA;AACAD,wCAAAA,IAAAA,EAAM,CAAC,OAAO,EAAEX,KAAAA,CAAM,cAAc,CAAC;AACrC0G,wCAAAA,WAAAA,EAAarI,aAAAA,CAAc;4CACzBiC,EAAAA,EAAI,2DAAA;4CACJM,cAAAA,EAAgB;AAClB,yCAAA,CAAA;wCACA6F,QAAAA,EAAU,KAAA;wCACVrB,IAAAA,EAAM,CAAA;wCACN3E,IAAAA,EAAM;AACR;iCACD,CAACX,GAAG,CAAC,CAAC,EAAEsF,IAAI,EAAE,GAAGuB,KAAAA,EAAO,iBACvBrH,GAAA,CAACiH,IAAAA,CAAK3B,IAAI,EAAA;wCAERgC,GAAAA,EAAKxB,IAAAA;wCACLyB,EAAAA,EAAI,EAAA;wCACJ5H,SAAAA,EAAU,QAAA;wCACVW,UAAAA,EAAW,SAAA;AAEX,wCAAA,QAAA,gBAAAN,GAAA,CAACwH,aAAAA,EAAAA;AAAe,4CAAA,GAAGH;;AANdA,qCAAAA,EAAAA,KAAAA,CAAMhG,IAAI,CAAA;;;;;;;;AAgBnC,CAAA;AAEA,MAAM0D,aAAAA,GAAgBxD,MAAAA,CAAO8D,SAAAA,CAAUO,IAAI,CAAuB;;AAE9D,IAAA,EAAE,CAAC,EAAE6B,KAAK,EAAEvC,MAAM,EAAE,GAAMA,MAAAA,GAASuC,KAAAA,CAAMC,MAAM,CAACC,SAAS,GAAGF,MAAMC,MAAM,CAACE,UAAU,CAAE;AACzF,CAAC;AAED;AACA;AACA,MAAM/B,kBAAAA,GAAqBtE,MAAAA,CAAOoE,IAAAA,CAAKH,OAAO,CAAC;;;sBAGzB,EAAE,CAAC,EAAEiC,KAAK,EAAE,GAAKA,KAAAA,CAAMC,MAAM,CAACG,UAAU,CAAC;;;;;;AAM/D,CAAC;AAQD,MAAML,gBAAgB,CAACM,KAAAA,GAAAA;AACrB,IAAA,OAAQA,MAAM3G,IAAI;QAChB,KAAK,OAAA;AACH,YAAA,qBAAOnB,GAAA,CAAC+H,aAAAA,EAAAA;AAAe,gBAAA,GAAGD;;QAC5B,KAAK,aAAA;AACH,YAAA,qBAAO9H,GAAA,CAACgI,gBAAAA,EAAAA;AAAkB,gBAAA,GAAGF;;AAC/B,QAAA;AACE,YAAA,qBAAO9H,GAAA,CAACiI,eAAAA,EAAAA;AAAoB,gBAAA,GAAGH;;AACnC;AACF,CAAA;AAaA,MAAMC,aAAAA,GAAgB,CAAC,EAAEb,QAAQ,EAAEN,KAAK,EAAEvF,IAAI,EAAE8F,QAAQ,EAAsB,GAAA;IAC5E,MAAM,EAAEpI,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEM,KAAK,EAAE+C,KAAK,EAAE6F,QAAQ,EAAE,GAAG1I,QAAAA,CAAiB6B,IAAAA,CAAAA;IAEpD,MAAM8G,YAAAA,GAAeC,gBAAAA,CAAiB5H,GAAG,CAAC,CAAC,EAAE6H,GAAG,EAAEhH,IAAI,EAAE,IAAM;YAC5D/B,KAAAA,EAAO+I,GAAAA;AACPzB,YAAAA,KAAAA,EAAO7H,aAAAA,CACL;gBACEiC,EAAAA,EAAI,4CAAA;gBACJM,cAAAA,EAAgB;aAClB,EACA;AAAED,gBAAAA;AAAK,aAAA,CAAA;YAETK,KAAAA,EAAO2G;SACT,CAAA,CAAA;AAEA,IAAA,MAAM,EAAEC,cAAc,EAAE,GAAGC,kBAAAA,CAAmBjJ,UAAU,EAAC;IAEzD,qBACEG,IAAA,CAAC+I,MAAM5C,IAAI,EAAA;QAACvD,KAAAA,EAAOA,KAAAA;QAAOhB,IAAAA,EAAMA,IAAAA;QAAM8F,QAAAA,EAAUA,QAAAA;;AAC9C,0BAAAnH,GAAA,CAACwI,MAAMC,KAAK,EAAA;AAAE7B,gBAAAA,QAAAA,EAAAA;;0BACd5G,GAAA,CAAC0I,YAAAA,EAAAA;gBACCxB,QAAAA,EAAUA,QAAAA;AACVgB,gBAAAA,QAAAA,EAAU,CAACS,CAAAA,GAAAA;oBACTT,QAAAA,CAAS7G,IAAAA,EAAMsH,EAAEC,QAAQ,EAAA,CAAA;AAC3B,gBAAA,CAAA;AACAtJ,gBAAAA,KAAAA,EAAOA,KAAAA,EAAOuJ,WAAAA,EAAAA;AACdC,gBAAAA,SAAAA,gBACE9I,GAAA,CAACN,IAAAA,EAAAA;oBACCa,GAAAA,EAAI,MAAA;oBACJJ,MAAAA,EAAQ,CAAA;oBACRD,UAAAA,EAAYZ,KAAAA;oBACZoF,WAAAA,EAAa4D,cAAAA,KAAmB,aAAa,YAAA,GAAe,aAAA;oBAC5DzD,SAAS,EAAA,IAAA;oBACTkE,MAAAA,EAAQ,CAAA;oBACRlJ,KAAAA,EAAO;;0BAIVsI,YAAAA,CAAa3H,GAAG,CAAC,CAAC,EAAElB,KAAK,EAAEsH,KAAK,EAAElF,KAAK,EAAE,GAAA;AACxC,oBAAA,MAAM,EAAE4G,cAAc,EAAE,GAAGC,kBAAAA,CAAmB7G,UAAU,EAAC;AAEzD,oBAAA,qBACE1B,GAAA,CAACgJ,kBAAAA,EAAAA;wBACC1J,KAAAA,EAAOA,KAAAA;AAEPwJ,wBAAAA,SAAAA,gBACE9I,GAAA,CAACN,IAAAA,EAAAA;4BACCa,GAAAA,EAAI,MAAA;4BACJJ,MAAAA,EAAQ,CAAA;4BACRD,UAAAA,EAAYwB,KAAAA;4BACZgD,WAAAA,EAAa4D,cAAAA,KAAmB,aAAa,YAAA,GAAe,aAAA;4BAC5DzD,SAAS,EAAA,IAAA;4BACTkE,MAAAA,EAAQ,CAAA;4BACRlJ,KAAAA,EAAO;;AAIV+G,wBAAAA,QAAAA,EAAAA;AAbItH,qBAAAA,EAAAA,KAAAA,CAAAA;AAgBX,gBAAA,CAAA;;AAEF,0BAAAU,GAAA,CAACwI,MAAMS,KAAK,EAAA,EAAA;;;AAGlB,CAAA;AAYA,MAAMjB,gBAAAA,GAAmB,CAAC,EACxBpB,KAAK,EACLM,QAAQ,EACR7F,IAAI,EACJ+F,WAAW,EACXD,QAAQ,EACc,GAAA;IACtB,MAAM,EAAEpI,aAAa,EAAE,GAAGC,OAAAA,EAAAA;IAC1B,MAAM,EAAEkK,kBAAkB,EAAE,GAAGC,eAAAA,EAAAA;AAC/B,IAAA,MAAM,CAACC,0BAAAA,EAA4BC,6BAAAA,CAA8B,GAAGxH,KAAAA,CAAMC,QAAQ,CAAC,KAAA,CAAA;IACnF,MAAM,EAAExC,QAAQ,EAAE,EAAE+C,KAAK,EAAE6F,QAAQ,EAAE,GAAG1I,QAAAA,CAA4B6B,IAAAA,CAAAA;IACpE,MAAMiI,SAAAA,GAAYlK,OAAAA,CAChB,kBAAA,EACA,CAACC,KAAAA,GAAU,KAACA,CAAM+F,MAAM,CAAiC7F,MAAM,IAAI,EAAE,CAAA;AAEvE,IAAA,MAAMgK,oBAAoBnK,OAAAA,CAAQ,kBAAA,EAAoB,CAACC,KAAAA,GAAUA,MAAM6I,QAAQ,CAAA;;AAG/E,IAAA,MAAMsB,QAAAA,GAAWnI,IAAAA,CAAKoI,KAAK,CAAC,KAAKC,GAAG,EAAA;IACpC,MAAMC,eAAAA,GAAkB9H,KAAAA,CAAM+H,MAAM,CAAC,CAAA,CAAA;IAErC,MAAM,EAAEC,IAAAA,EAAMC,KAAAA,GAAQ,EAAE,EAAEC,SAAS,EAAE1H,KAAAA,EAAO2H,aAAa,EAAE,GAAGC,qBAAAA,EAAAA;;;IAI9D,MAAMC,aAAAA,GAAgBJ,OAAOK,MAAAA,CAAO,CAACC,OAASA,IAAAA,CAAKC,IAAI,KAAK,oBAAA,CAAA,IAAyB,EAAE;AAEvFxI,IAAAA,KAAAA,CAAMmC,SAAS,CAAC,IAAA;AACd,QAAA,IACE,CAAC+F,SAAAA,IACDC,aAAAA,IACA,QAAA,IAAYA,aAAAA,IACZA,aAAAA,CAAcM,MAAM,IAAI,GAAA,IACxBX,eAAAA,CAAgBY,OAAO,KAAK,CAAA,EAC5B;AACAZ,YAAAA,eAAAA,CAAgBY,OAAO,GAAG,CAAA;YAE1BrB,kBAAAA,CAAmB;gBACjBsB,eAAAA,EAAiB,IAAA;gBACjBrJ,IAAAA,EAAM,QAAA;AACNsJ,gBAAAA,OAAAA,EAAS1L,aAAAA,CAAc;oBACrBiC,EAAAA,EAAI,8DAAA;oBACJM,cAAAA,EAAgB;AAClB,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;IACF,CAAA,EAAG;AAACvC,QAAAA,aAAAA;AAAegL,QAAAA,SAAAA;AAAWD,QAAAA,KAAAA;AAAOZ,QAAAA,kBAAAA;AAAoBc,QAAAA;AAAc,KAAA,CAAA;AAEvE,IAAA,IAAI,CAACD,SAAAA,IAAaG,aAAAA,CAActJ,MAAM,KAAK,CAAA,EAAG;QAC5C,qBACEnB,IAAA,CAAC+I,MAAM5C,IAAI,EAAA;YACTvE,IAAAA,EAAMA,IAAAA;AACNqJ,YAAAA,IAAAA,EAAM3L,aAAAA,CAAc;gBAClBiC,EAAAA,EAAI,uEAAA;gBACJM,cAAAA,EAAgB;AAClB,aAAA,CAAA;YACA6F,QAAAA,EAAUA,QAAAA;;AAEV,8BAAAnH,GAAA,CAACwI,MAAMC,KAAK,EAAA;AAAE7B,oBAAAA,QAAAA,EAAAA;;8BACd5G,GAAA,CAAC2K,SAAAA,EAAAA;oBACCzD,QAAQ,EAAA,IAAA;AACRE,oBAAAA,WAAAA,EAAarI,aAAAA,CAAc;wBACzBiC,EAAAA,EAAI,iCAAA;wBACJM,cAAAA,EAAgB;AAClB,qBAAA,CAAA;AACAsJ,oBAAAA,WAAAA,gBAAa5K,GAAA,CAAC6K,UAAAA,EAAAA;wBAAWC,IAAAA,EAAK;;oBAC9B3J,IAAAA,EAAK,MAAA;oBACL7B,KAAAA,EAAM;;AAER,8BAAAU,GAAA,CAACwI,MAAMuC,IAAI,EAAA,EAAA;;;AAGjB,IAAA;IAEA,qBACE/K,GAAA,CAAA0F,QAAA,EAAA;AACE,QAAA,QAAA,gBAAAjG,IAAA,CAACC,IAAAA,EAAAA;YAAKY,UAAAA,EAAW,UAAA;YAAWV,GAAAA,EAAK,CAAA;;8BAC/BI,GAAA,CAACgL,iBAAAA,EAAAA;oBAAkBC,IAAAA,EAAM,CAAA;4CACvBxL,IAAA,CAAC+I,MAAM5C,IAAI,EAAA;wBAACvD,KAAAA,EAAOA,KAAAA;wBAAOhB,IAAAA,EAAMA,IAAAA;wBAAM8F,QAAQ,EAAA,IAAA;;AAC5C,0CAAAnH,GAAA,CAACwI,MAAMC,KAAK,EAAA;AAAE7B,gCAAAA,QAAAA,EAAAA;;0CAEd5G,GAAA,CAACkL,WAAAA,EAAAA;gCACChE,QAAAA,EAAUA,QAAAA;AACVgB,gCAAAA,QAAAA,EAAU,CAAC9C,MAAAA,GAAAA;;;;AAIT,oCAAA,MAAM+F,cAAc/F,MAAAA,CAAO5E,GAAG,CAAC,CAAClB,SAAW;AACzC8K,4CAAAA,IAAAA,EAAMgB,SAAS9L,KAAAA,EAAO,EAAA,CAAA;4CACtB+L,MAAAA,EAAQ;yCACV,CAAA,CAAA;AAEAnD,oCAAAA,QAAAA,CAAS7G,IAAAA,EAAM8J,WAAAA,CAAAA;AACjB,gCAAA,CAAA;gCACA/D,WAAAA,EAAaA,WAAAA;;gCAEb9H,KAAAA,EAAOA,KAAAA,CAAMkB,GAAG,CAAC,CAAC8K,aAAe,CAAA,EAAGA,UAAAA,CAAWlB,IAAI,CAAA,CAAE,CAAA;gCACrDmB,QAAQ,EAAA,IAAA;AAER,gCAAA,QAAA,gBAAAvL,GAAA,CAACwL,gBAAAA,EAAAA;AACC5E,oCAAAA,KAAAA,EAAO7H,aAAAA,CAAc;wCACnBiC,EAAAA,EAAI,4DAAA;wCACJM,cAAAA,EAAgB;AAClB,qCAAA,CAAA;oCACA8D,MAAAA,EAAQ8E,aAAAA,CAAc1J,GAAG,CAAC,CAACiL,IAAM,CAAA,EAAGA,CAAAA,CAAEzK,EAAE,CAAA,CAAE,CAAA;8CAEzCkJ,aAAAA,CAAc1J,GAAG,CAAC,CAAC4J,IAAAA,GAAAA;AAClB,wCAAA,qBACEpK,GAAA,CAAC0L,YAAAA,EAAAA;4CAA2BpM,KAAAA,EAAO,CAAA,EAAG8K,IAAAA,CAAKpJ,EAAE,CAAA,CAAE;AAC5CoJ,4CAAAA,QAAAA,EAAAA,IAAAA,CAAK/I;AADW+I,yCAAAA,EAAAA,IAAAA,CAAKpJ,EAAE,CAAA;AAI9B,oCAAA,CAAA;;;AAGJ,0CAAAhB,GAAA,CAACwI,MAAMS,KAAK,EAAA,EAAA;;;;AAGhB,8BAAAxJ,IAAA,CAACkM,OAAO/F,IAAI,EAAA;oBAACgG,IAAAA,EAAMxC,0BAAAA;oBAA4ByC,YAAAA,EAAcxC,6BAAAA;;AAC3D,sCAAArJ,GAAA,CAAC2L,OAAOnG,OAAO,EAAA;AACb,4BAAA,QAAA,gBAAAxF,GAAA,CAAC0G,UAAAA,EAAAA;gCACCQ,QAAAA,EAAUA,QAAAA;AACVN,gCAAAA,KAAAA,EAAO7H,aAAAA,CAAc;oCACnBiC,EAAAA,EAAI,yDAAA;oCACJM,cAAAA,EAAgB;AAClB,iCAAA,CAAA;gCACAwE,IAAAA,EAAK,GAAA;AAEL,gCAAA,QAAA,gBAAA9F,GAAA,CAAC8L,SAAAA,EAAAA,EAAAA;;;sCAGL9L,GAAA,CAAC+L,aAAAA,EAAAA;4BACCC,SAAAA,EAAW,IAAA;AACTzC,gCAAAA,iBAAAA,CACE,UACAD,SAAAA,CAAU9I,GAAG,CAAC,CAACC,SAAW;AACxB,wCAAA,GAAGA,KAAK;AACR,wCAAA,CAAC+I,WAAWlK;qCACd,CAAA,CAAA,CAAA;gCAGF+J,6BAAAA,CAA8B,KAAA,CAAA;gCAC9BH,kBAAAA,CAAmB;oCACjB/H,IAAAA,EAAM,SAAA;AACNsJ,oCAAAA,OAAAA,EAAS1L,aAAAA,CAAc;wCACrBiC,EAAAA,EAAI,6EAAA;wCACJM,cAAAA,EAAgB;AAClB,qCAAA;AACF,iCAAA,CAAA;AACF,4BAAA,CAAA;4BACAmF,OAAAA,EAAQ,SAAA;sCAEP1H,aAAAA,CAAc;gCACbiC,EAAAA,EAAI,qEAAA;gCACJM,cAAAA,EACE;AACJ,6BAAA;;;;;;;AAMZ,CAAA;AAEA,MAAMoK,YAAAA,GAAenK,MAAAA,CAAO0K,iBAAAA,CAAkB;gBAC9B,EAAE,CAAC,EAAExE,KAAK,EAAE,GAAKA,KAAAA,CAAMyE,MAAM,CAAC,CAAA,CAAE,CAAC;AACjD,CAAC;AAED;AACA,MAAMlB,iBAAAA,GAAoBzJ,MAAAA,CAAO7B,IAAAA,CAAK;;;;AAItC,CAAC;;;;"}
|
|
@@ -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":"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"}
|
|
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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"}
|
|
@@ -34,8 +34,8 @@ const sendDidEditAssignee = async (fromId, toId)=>{
|
|
|
34
34
|
to: toId
|
|
35
35
|
});
|
|
36
36
|
};
|
|
37
|
-
const sendDidSendReviewWorkflowPropertiesOnceAWeek = async (numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes)=>{
|
|
38
|
-
strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {
|
|
37
|
+
const sendDidSendReviewWorkflowPropertiesOnceAWeek = async ({ numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes })=>{
|
|
38
|
+
await strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {
|
|
39
39
|
groupProperties: {
|
|
40
40
|
numberOfActiveWorkflows,
|
|
41
41
|
avgStagesCount,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["../../../../server/src/services/metrics/index.ts"],"sourcesContent":["import '@strapi/types';\n\nexport const sendDidCreateStage = async () => {\n strapi.telemetry.send('didCreateStage', {});\n};\n\nexport const sendDidEditStage = async () => {\n strapi.telemetry.send('didEditStage', {});\n};\n\nexport const sendDidDeleteStage = async () => {\n strapi.telemetry.send('didDeleteStage', {});\n};\n\nexport const sendDidChangeEntryStage = async () => {\n strapi.telemetry.send('didChangeEntryStage', {});\n};\n\nexport const sendDidCreateWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didCreateWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didEditWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditAssignee = async (fromId: any, toId: any) => {\n strapi.telemetry.send('didEditAssignee', { from: fromId, to: toId });\n};\n\nexport
|
|
1
|
+
{"version":3,"file":"index.js","sources":["../../../../server/src/services/metrics/index.ts"],"sourcesContent":["import '@strapi/types';\n\nexport const sendDidCreateStage = async () => {\n strapi.telemetry.send('didCreateStage', {});\n};\n\nexport const sendDidEditStage = async () => {\n strapi.telemetry.send('didEditStage', {});\n};\n\nexport const sendDidDeleteStage = async () => {\n strapi.telemetry.send('didDeleteStage', {});\n};\n\nexport const sendDidChangeEntryStage = async () => {\n strapi.telemetry.send('didChangeEntryStage', {});\n};\n\nexport const sendDidCreateWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didCreateWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didEditWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditAssignee = async (fromId: any, toId: any) => {\n strapi.telemetry.send('didEditAssignee', { from: fromId, to: toId });\n};\n\nexport type WeeklyMetrics = {\n numberOfActiveWorkflows: number;\n avgStagesCount: number;\n maxStagesCount: number | undefined;\n activatedContentTypes: number;\n};\n\nexport const sendDidSendReviewWorkflowPropertiesOnceAWeek = async ({\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n}: WeeklyMetrics) => {\n await strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {\n groupProperties: {\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n },\n });\n};\n\nexport default {\n sendDidCreateStage,\n sendDidEditStage,\n sendDidDeleteStage,\n sendDidChangeEntryStage,\n sendDidCreateWorkflow,\n sendDidEditWorkflow,\n sendDidSendReviewWorkflowPropertiesOnceAWeek,\n sendDidEditAssignee,\n};\n"],"names":["sendDidCreateStage","strapi","telemetry","send","sendDidEditStage","sendDidDeleteStage","sendDidChangeEntryStage","sendDidCreateWorkflow","workflowId","hasRequiredStageToPublish","sendDidEditWorkflow","sendDidEditAssignee","fromId","toId","from","to","sendDidSendReviewWorkflowPropertiesOnceAWeek","numberOfActiveWorkflows","avgStagesCount","maxStagesCount","activatedContentTypes","groupProperties"],"mappings":";;;;;;MAEaA,kBAAAA,GAAqB,UAAA;AAChCC,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaC,gBAAAA,GAAmB,UAAA;AAC9BH,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,gBAAgB,EAAC,CAAA;AACzC;MAEaE,kBAAAA,GAAqB,UAAA;AAChCJ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaG,uBAAAA,GAA0B,UAAA;AACrCL,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,uBAAuB,EAAC,CAAA;AAChD;AAEO,MAAMI,qBAAAA,GAAwB,OACnCC,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,mBAAA,EAAqB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACrF;AAEO,MAAMC,mBAAAA,GAAsB,OACjCF,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACnF;AAEO,MAAME,mBAAAA,GAAsB,OAAOC,MAAAA,EAAaC,IAAAA,GAAAA;AACrDZ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;QAAEW,IAAAA,EAAMF,MAAAA;QAAQG,EAAAA,EAAIF;AAAK,KAAA,CAAA;AACpE;AASO,MAAMG,4CAAAA,GAA+C,OAAO,EACjEC,uBAAuB,EACvBC,cAAc,EACdC,cAAc,EACdC,qBAAqB,EACP,GAAA;AACd,IAAA,MAAMnB,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,0CAAA,EAA4C;QACtEkB,eAAAA,EAAiB;AACfJ,YAAAA,uBAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA;AACF;AACF,KAAA,CAAA;AACF;AAEA,6BAAe;AACbpB,IAAAA,kBAAAA;AACAI,IAAAA,gBAAAA;AACAC,IAAAA,kBAAAA;AACAC,IAAAA,uBAAAA;AACAC,IAAAA,qBAAAA;AACAG,IAAAA,mBAAAA;AACAM,IAAAA,4CAAAA;AACAL,IAAAA;AACF,CAAA;;;;;;;;;;;;"}
|
|
@@ -30,8 +30,8 @@ const sendDidEditAssignee = async (fromId, toId)=>{
|
|
|
30
30
|
to: toId
|
|
31
31
|
});
|
|
32
32
|
};
|
|
33
|
-
const sendDidSendReviewWorkflowPropertiesOnceAWeek = async (numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes)=>{
|
|
34
|
-
strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {
|
|
33
|
+
const sendDidSendReviewWorkflowPropertiesOnceAWeek = async ({ numberOfActiveWorkflows, avgStagesCount, maxStagesCount, activatedContentTypes })=>{
|
|
34
|
+
await strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {
|
|
35
35
|
groupProperties: {
|
|
36
36
|
numberOfActiveWorkflows,
|
|
37
37
|
avgStagesCount,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../../../server/src/services/metrics/index.ts"],"sourcesContent":["import '@strapi/types';\n\nexport const sendDidCreateStage = async () => {\n strapi.telemetry.send('didCreateStage', {});\n};\n\nexport const sendDidEditStage = async () => {\n strapi.telemetry.send('didEditStage', {});\n};\n\nexport const sendDidDeleteStage = async () => {\n strapi.telemetry.send('didDeleteStage', {});\n};\n\nexport const sendDidChangeEntryStage = async () => {\n strapi.telemetry.send('didChangeEntryStage', {});\n};\n\nexport const sendDidCreateWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didCreateWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didEditWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditAssignee = async (fromId: any, toId: any) => {\n strapi.telemetry.send('didEditAssignee', { from: fromId, to: toId });\n};\n\nexport
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../../../server/src/services/metrics/index.ts"],"sourcesContent":["import '@strapi/types';\n\nexport const sendDidCreateStage = async () => {\n strapi.telemetry.send('didCreateStage', {});\n};\n\nexport const sendDidEditStage = async () => {\n strapi.telemetry.send('didEditStage', {});\n};\n\nexport const sendDidDeleteStage = async () => {\n strapi.telemetry.send('didDeleteStage', {});\n};\n\nexport const sendDidChangeEntryStage = async () => {\n strapi.telemetry.send('didChangeEntryStage', {});\n};\n\nexport const sendDidCreateWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didCreateWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditWorkflow = async (\n workflowId: string,\n hasRequiredStageToPublish: boolean\n) => {\n strapi.telemetry.send('didEditWorkflow', { workflowId, hasRequiredStageToPublish });\n};\n\nexport const sendDidEditAssignee = async (fromId: any, toId: any) => {\n strapi.telemetry.send('didEditAssignee', { from: fromId, to: toId });\n};\n\nexport type WeeklyMetrics = {\n numberOfActiveWorkflows: number;\n avgStagesCount: number;\n maxStagesCount: number | undefined;\n activatedContentTypes: number;\n};\n\nexport const sendDidSendReviewWorkflowPropertiesOnceAWeek = async ({\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n}: WeeklyMetrics) => {\n await strapi.telemetry.send('didSendReviewWorkflowPropertiesOnceAWeek', {\n groupProperties: {\n numberOfActiveWorkflows,\n avgStagesCount,\n maxStagesCount,\n activatedContentTypes,\n },\n });\n};\n\nexport default {\n sendDidCreateStage,\n sendDidEditStage,\n sendDidDeleteStage,\n sendDidChangeEntryStage,\n sendDidCreateWorkflow,\n sendDidEditWorkflow,\n sendDidSendReviewWorkflowPropertiesOnceAWeek,\n sendDidEditAssignee,\n};\n"],"names":["sendDidCreateStage","strapi","telemetry","send","sendDidEditStage","sendDidDeleteStage","sendDidChangeEntryStage","sendDidCreateWorkflow","workflowId","hasRequiredStageToPublish","sendDidEditWorkflow","sendDidEditAssignee","fromId","toId","from","to","sendDidSendReviewWorkflowPropertiesOnceAWeek","numberOfActiveWorkflows","avgStagesCount","maxStagesCount","activatedContentTypes","groupProperties"],"mappings":";;MAEaA,kBAAAA,GAAqB,UAAA;AAChCC,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaC,gBAAAA,GAAmB,UAAA;AAC9BH,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,gBAAgB,EAAC,CAAA;AACzC;MAEaE,kBAAAA,GAAqB,UAAA;AAChCJ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,kBAAkB,EAAC,CAAA;AAC3C;MAEaG,uBAAAA,GAA0B,UAAA;AACrCL,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,uBAAuB,EAAC,CAAA;AAChD;AAEO,MAAMI,qBAAAA,GAAwB,OACnCC,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,mBAAA,EAAqB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACrF;AAEO,MAAMC,mBAAAA,GAAsB,OACjCF,UAAAA,EACAC,yBAAAA,GAAAA;AAEAR,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;AAAEK,QAAAA,UAAAA;AAAYC,QAAAA;AAA0B,KAAA,CAAA;AACnF;AAEO,MAAME,mBAAAA,GAAsB,OAAOC,MAAAA,EAAaC,IAAAA,GAAAA;AACrDZ,IAAAA,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,iBAAA,EAAmB;QAAEW,IAAAA,EAAMF,MAAAA;QAAQG,EAAAA,EAAIF;AAAK,KAAA,CAAA;AACpE;AASO,MAAMG,4CAAAA,GAA+C,OAAO,EACjEC,uBAAuB,EACvBC,cAAc,EACdC,cAAc,EACdC,qBAAqB,EACP,GAAA;AACd,IAAA,MAAMnB,MAAAA,CAAOC,SAAS,CAACC,IAAI,CAAC,0CAAA,EAA4C;QACtEkB,eAAAA,EAAiB;AACfJ,YAAAA,uBAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA,cAAAA;AACAC,YAAAA;AACF;AACF,KAAA,CAAA;AACF;AAEA,6BAAe;AACbpB,IAAAA,kBAAAA;AACAI,IAAAA,gBAAAA;AACAC,IAAAA,kBAAAA;AACAC,IAAAA,uBAAAA;AACAC,IAAAA,qBAAAA;AACAG,IAAAA,mBAAAA;AACAM,IAAAA,4CAAAA;AACAL,IAAAA;AACF,CAAA;;;;"}
|
|
@@ -44,7 +44,7 @@ var reviewWorkflowsWeeklyMetrics = (({ strapi })=>{
|
|
|
44
44
|
},
|
|
45
45
|
async sendMetrics () {
|
|
46
46
|
const computedMetrics = await this.computeMetrics();
|
|
47
|
-
metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
|
|
47
|
+
await metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
|
|
48
48
|
const metricsInfoStored = await getMetricsStoreValue();
|
|
49
49
|
// @ts-expect-error metricsInfoStored can use spread
|
|
50
50
|
await setMetricsStoreValue({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"weekly-metrics.js","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi });\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics() {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":";;;;;;
|
|
1
|
+
{"version":3,"file":"weekly-metrics.js","sources":["../../../../server/src/services/metrics/weekly-metrics.ts"],"sourcesContent":["import type { Core } from '@strapi/types';\nimport { defaultTo, map, size, mean, max, sum } from 'lodash';\nimport { add } from 'date-fns';\nimport { getService } from '../../utils';\nimport type workflowMetrics from './index';\nimport type { WeeklyMetrics } from './index';\n\nconst ONE_WEEK = 7 * 24 * 60 * 60 * 1000;\n\nconst getWeeklyCronScheduleAt = (date: Date) =>\n `${date.getSeconds()} ${date.getMinutes()} ${date.getHours()} * * ${date.getDay()}`;\n\nexport default ({ strapi }: { strapi: Core.Strapi }) => {\n const metrics = getService('workflow-metrics', { strapi }) as typeof workflowMetrics;\n const workflowsService = getService('workflows', { strapi });\n\n const getMetricsStoreValue = async () => {\n const value = await strapi.store.get({ type: 'plugin', name: 'ee', key: 'metrics' });\n return defaultTo(value, {});\n };\n\n const setMetricsStoreValue = (value: unknown) =>\n strapi.store.set({ type: 'plugin', name: 'ee', key: 'metrics', value });\n\n return {\n async computeMetrics(): Promise<WeeklyMetrics> {\n // There will never be more than 200 workflow, so we can safely fetch them all\n const workflows = await workflowsService.find({ populate: 'stages' });\n\n const stagesCount = map(workflows, (workflow) => size(workflow.stages));\n\n const contentTypesCount = map(workflows, (workflow) => size(workflow.contentTypes));\n\n return {\n numberOfActiveWorkflows: size(workflows),\n avgStagesCount: mean(stagesCount),\n maxStagesCount: max(stagesCount),\n activatedContentTypes: sum(contentTypesCount),\n };\n },\n\n async sendMetrics() {\n const computedMetrics = await this.computeMetrics();\n await metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);\n\n const metricsInfoStored = await getMetricsStoreValue();\n // @ts-expect-error metricsInfoStored can use spread\n await setMetricsStoreValue({ ...metricsInfoStored, lastWeeklyUpdate: new Date().getTime() });\n },\n\n async ensureWeeklyStoredCronSchedule() {\n const metricsInfoStored: any = await getMetricsStoreValue();\n const { weeklySchedule: currentSchedule, lastWeeklyUpdate } = metricsInfoStored;\n\n const now = new Date();\n let weeklySchedule = currentSchedule;\n\n if (!currentSchedule || !lastWeeklyUpdate || lastWeeklyUpdate + ONE_WEEK < now.getTime()) {\n weeklySchedule = getWeeklyCronScheduleAt(add(now, { seconds: 15 }));\n await setMetricsStoreValue({ ...metricsInfoStored, weeklySchedule });\n }\n\n return weeklySchedule;\n },\n\n async registerCron() {\n const weeklySchedule = await this.ensureWeeklyStoredCronSchedule();\n\n strapi.cron.add({\n reviewWorkflowsWeekly: {\n task: this.sendMetrics.bind(this),\n options: weeklySchedule,\n },\n });\n },\n };\n};\n"],"names":["ONE_WEEK","getWeeklyCronScheduleAt","date","getSeconds","getMinutes","getHours","getDay","strapi","metrics","getService","workflowsService","getMetricsStoreValue","value","store","get","type","name","key","defaultTo","setMetricsStoreValue","set","computeMetrics","workflows","find","populate","stagesCount","map","workflow","size","stages","contentTypesCount","contentTypes","numberOfActiveWorkflows","avgStagesCount","mean","maxStagesCount","max","activatedContentTypes","sum","sendMetrics","computedMetrics","sendDidSendReviewWorkflowPropertiesOnceAWeek","metricsInfoStored","lastWeeklyUpdate","Date","getTime","ensureWeeklyStoredCronSchedule","weeklySchedule","currentSchedule","now","add","seconds","registerCron","cron","reviewWorkflowsWeekly","task","bind","options"],"mappings":";;;;;;AAOA,MAAMA,QAAAA,GAAW,CAAA,GAAI,EAAA,GAAK,EAAA,GAAK,EAAA,GAAK,IAAA;AAEpC,MAAMC,uBAAAA,GAA0B,CAACC,IAAAA,GAC/B,CAAA,EAAGA,KAAKC,UAAU,EAAA,CAAG,CAAC,EAAED,IAAAA,CAAKE,UAAU,EAAA,CAAG,CAAC,EAAEF,IAAAA,CAAKG,QAAQ,GAAG,KAAK,EAAEH,IAAAA,CAAKI,MAAM,EAAA,CAAA,CAAI;AAErF,mCAAe,CAAA,CAAC,EAAEC,MAAM,EAA2B,GAAA;IACjD,MAAMC,OAAAA,GAAUC,iBAAW,kBAAA,EAAoB;AAAEF,QAAAA;AAAO,KAAA,CAAA;IACxD,MAAMG,gBAAAA,GAAmBD,iBAAW,WAAA,EAAa;AAAEF,QAAAA;AAAO,KAAA,CAAA;AAE1D,IAAA,MAAMI,oBAAAA,GAAuB,UAAA;AAC3B,QAAA,MAAMC,QAAQ,MAAML,MAAAA,CAAOM,KAAK,CAACC,GAAG,CAAC;YAAEC,IAAAA,EAAM,QAAA;YAAUC,IAAAA,EAAM,IAAA;YAAMC,GAAAA,EAAK;AAAU,SAAA,CAAA;QAClF,OAAOC,gBAAAA,CAAUN,OAAO,EAAC,CAAA;AAC3B,IAAA,CAAA;AAEA,IAAA,MAAMO,uBAAuB,CAACP,KAAAA,GAC5BL,OAAOM,KAAK,CAACO,GAAG,CAAC;YAAEL,IAAAA,EAAM,QAAA;YAAUC,IAAAA,EAAM,IAAA;YAAMC,GAAAA,EAAK,SAAA;AAAWL,YAAAA;AAAM,SAAA,CAAA;IAEvE,OAAO;QACL,MAAMS,cAAAA,CAAAA,GAAAA;;AAEJ,YAAA,MAAMC,SAAAA,GAAY,MAAMZ,gBAAAA,CAAiBa,IAAI,CAAC;gBAAEC,QAAAA,EAAU;AAAS,aAAA,CAAA;AAEnE,YAAA,MAAMC,cAAcC,UAAAA,CAAIJ,SAAAA,EAAW,CAACK,QAAAA,GAAaC,WAAAA,CAAKD,SAASE,MAAM,CAAA,CAAA;AAErE,YAAA,MAAMC,oBAAoBJ,UAAAA,CAAIJ,SAAAA,EAAW,CAACK,QAAAA,GAAaC,WAAAA,CAAKD,SAASI,YAAY,CAAA,CAAA;YAEjF,OAAO;AACLC,gBAAAA,uBAAAA,EAAyBJ,WAAAA,CAAKN,SAAAA,CAAAA;AAC9BW,gBAAAA,cAAAA,EAAgBC,WAAAA,CAAKT,WAAAA,CAAAA;AACrBU,gBAAAA,cAAAA,EAAgBC,UAAAA,CAAIX,WAAAA,CAAAA;AACpBY,gBAAAA,qBAAAA,EAAuBC,UAAAA,CAAIR,iBAAAA;AAC7B,aAAA;AACF,QAAA,CAAA;QAEA,MAAMS,WAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMC,eAAAA,GAAkB,MAAM,IAAI,CAACnB,cAAc,EAAA;YACjD,MAAMb,OAAAA,CAAQiC,4CAA4C,CAACD,eAAAA,CAAAA;AAE3D,YAAA,MAAME,oBAAoB,MAAM/B,oBAAAA,EAAAA;;AAEhC,YAAA,MAAMQ,oBAAAA,CAAqB;AAAE,gBAAA,GAAGuB,iBAAiB;gBAAEC,gBAAAA,EAAkB,IAAIC,OAAOC,OAAO;AAAG,aAAA,CAAA;AAC5F,QAAA,CAAA;QAEA,MAAMC,8BAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAMJ,oBAAyB,MAAM/B,oBAAAA,EAAAA;AACrC,YAAA,MAAM,EAAEoC,cAAAA,EAAgBC,eAAe,EAAEL,gBAAgB,EAAE,GAAGD,iBAAAA;AAE9D,YAAA,MAAMO,MAAM,IAAIL,IAAAA,EAAAA;AAChB,YAAA,IAAIG,cAAAA,GAAiBC,eAAAA;YAErB,IAAI,CAACA,mBAAmB,CAACL,gBAAAA,IAAoBA,mBAAmB3C,QAAAA,GAAWiD,GAAAA,CAAIJ,OAAO,EAAA,EAAI;gBACxFE,cAAAA,GAAiB9C,uBAAAA,CAAwBiD,YAAID,GAAAA,EAAK;oBAAEE,OAAAA,EAAS;AAAG,iBAAA,CAAA,CAAA;AAChE,gBAAA,MAAMhC,oBAAAA,CAAqB;AAAE,oBAAA,GAAGuB,iBAAiB;AAAEK,oBAAAA;AAAe,iBAAA,CAAA;AACpE,YAAA;YAEA,OAAOA,cAAAA;AACT,QAAA,CAAA;QAEA,MAAMK,YAAAA,CAAAA,GAAAA;AACJ,YAAA,MAAML,cAAAA,GAAiB,MAAM,IAAI,CAACD,8BAA8B,EAAA;YAEhEvC,MAAAA,CAAO8C,IAAI,CAACH,GAAG,CAAC;gBACdI,qBAAAA,EAAuB;AACrBC,oBAAAA,IAAAA,EAAM,IAAI,CAAChB,WAAW,CAACiB,IAAI,CAAC,IAAI,CAAA;oBAChCC,OAAAA,EAASV;AACX;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF,CAAA;;;;"}
|
|
@@ -42,7 +42,7 @@ var reviewWorkflowsWeeklyMetrics = (({ strapi })=>{
|
|
|
42
42
|
},
|
|
43
43
|
async sendMetrics () {
|
|
44
44
|
const computedMetrics = await this.computeMetrics();
|
|
45
|
-
metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
|
|
45
|
+
await metrics.sendDidSendReviewWorkflowPropertiesOnceAWeek(computedMetrics);
|
|
46
46
|
const metricsInfoStored = await getMetricsStoreValue();
|
|
47
47
|
// @ts-expect-error metricsInfoStored can use spread
|
|
48
48
|
await setMetricsStoreValue({
|