{"version":3,"file":"ReleaseActionMenu.mjs","sources":["../../../admin/src/components/ReleaseActionMenu.tsx"],"sourcesContent":["import * as React from 'react';\n\nimport {\n  useAPIErrorHandler,\n  useNotification,\n  useAuth,\n  useRBAC,\n  isFetchError,\n} from '@strapi/admin/strapi-admin';\nimport { Flex, Typography, Menu, AccessibleIcon } from '@strapi/design-system';\nimport { Cross, More, Pencil } from '@strapi/icons';\nimport { useIntl } from 'react-intl';\nimport { NavLink } from 'react-router-dom';\nimport { styled } from 'styled-components';\n\nimport { DeleteReleaseAction, ReleaseAction } from '../../../shared/contracts/release-actions';\nimport { Release } from '../../../shared/contracts/releases';\nimport { PERMISSIONS } from '../constants';\nimport { useDeleteReleaseActionMutation } from '../services/release';\n\nconst StyledMenuItem = styled(Menu.Item)<{ $variant?: 'neutral' | 'danger' }>`\n  &:hover {\n    background: ${({ theme, $variant = 'neutral' }) => theme.colors[`${$variant}100`]};\n\n    svg {\n      fill: ${({ theme, $variant = 'neutral' }) => theme.colors[`${$variant}600`]};\n    }\n\n    a {\n      color: ${({ theme }) => theme.colors.neutral800};\n    }\n  }\n\n  svg {\n    color: ${({ theme, $variant = 'neutral' }) => theme.colors[`${$variant}500`]};\n  }\n\n  span {\n    color: ${({ theme, $variant = 'neutral' }) => theme.colors[`${$variant}800`]};\n  }\n\n  span,\n  a {\n    width: 100%;\n  }\n`;\n\n/* -------------------------------------------------------------------------------------------------\n * DeleteReleaseActionItemProps\n * -----------------------------------------------------------------------------------------------*/\ninterface DeleteReleaseActionItemProps {\n  releaseId: DeleteReleaseAction.Request['params']['releaseId'];\n  actionId: DeleteReleaseAction.Request['params']['actionId'];\n}\n\nconst DeleteReleaseActionItem = ({ releaseId, actionId }: DeleteReleaseActionItemProps) => {\n  const { formatMessage } = useIntl();\n  const { toggleNotification } = useNotification();\n  const { formatAPIError } = useAPIErrorHandler();\n  const [deleteReleaseAction] = useDeleteReleaseActionMutation();\n  const {\n    allowedActions: { canDeleteAction },\n  } = useRBAC(PERMISSIONS);\n\n  const handleDeleteAction = async () => {\n    const response = await deleteReleaseAction({\n      params: { releaseId, actionId },\n    });\n\n    if ('data' in response) {\n      // Handle success\n      toggleNotification({\n        type: 'success',\n        message: formatMessage({\n          id: 'content-releases.content-manager-edit-view.remove-from-release.notification.success',\n          defaultMessage: 'Entry removed from release',\n        }),\n      });\n\n      return;\n    }\n\n    if ('error' in response) {\n      if (isFetchError(response.error)) {\n        // Handle fetch error\n        toggleNotification({\n          type: 'danger',\n          message: formatAPIError(response.error),\n        });\n      } else {\n        // Handle generic error\n        toggleNotification({\n          type: 'danger',\n          message: formatMessage({ id: 'notification.error', defaultMessage: 'An error occurred' }),\n        });\n      }\n    }\n  };\n\n  if (!canDeleteAction) {\n    return null;\n  }\n\n  return (\n    <StyledMenuItem $variant=\"danger\" onSelect={handleDeleteAction}>\n      <Flex gap={2}>\n        <Cross width=\"1.6rem\" height=\"1.6rem\" />\n        <Typography textColor=\"danger600\" variant=\"omega\">\n          {formatMessage({\n            id: 'content-releases.content-manager-edit-view.remove-from-release',\n            defaultMessage: 'Remove from release',\n          })}\n        </Typography>\n      </Flex>\n    </StyledMenuItem>\n  );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * ReleaseActionEntryLinkItem\n * -----------------------------------------------------------------------------------------------*/\ninterface ReleaseActionEntryLinkItemProps {\n  contentTypeUid: ReleaseAction['contentType'];\n  documentId: ReleaseAction['entry']['documentId'];\n  locale: ReleaseAction['locale'];\n}\n\nconst ReleaseActionEntryLinkItem = ({\n  contentTypeUid,\n  documentId,\n  locale,\n}: ReleaseActionEntryLinkItemProps) => {\n  const { formatMessage } = useIntl();\n  const userPermissions = useAuth('ReleaseActionEntryLinkItem', (state) => state.permissions);\n\n  // Confirm user has permissions to access the entry for the given locale\n  const canUpdateEntryForLocale = React.useMemo(() => {\n    const updatePermissions = userPermissions.find(\n      (permission) =>\n        permission.subject === contentTypeUid &&\n        permission.action === 'plugin::content-manager.explorer.update'\n    );\n\n    if (!updatePermissions) {\n      return false;\n    }\n\n    return Boolean(!locale || updatePermissions.properties?.locales?.includes(locale));\n  }, [contentTypeUid, locale, userPermissions]);\n\n  const {\n    allowedActions: { canUpdate: canUpdateContentType },\n  } = useRBAC({\n    updateContentType: [\n      {\n        action: 'plugin::content-manager.explorer.update',\n        subject: contentTypeUid,\n      },\n    ],\n  });\n\n  if (!canUpdateContentType || !canUpdateEntryForLocale) {\n    return null;\n  }\n\n  return (\n    <StyledMenuItem\n      /* @ts-expect-error inference isn't working in DS */\n      tag={NavLink}\n      isLink\n      to={{\n        pathname: `/content-manager/collection-types/${contentTypeUid}/${documentId}`,\n        search: locale && `?plugins[i18n][locale]=${locale}`,\n      }}\n    >\n      <Flex gap={2}>\n        <Pencil width=\"1.6rem\" height=\"1.6rem\" />\n        <Typography variant=\"omega\">\n          {formatMessage({\n            id: 'content-releases.content-manager-edit-view.edit-entry',\n            defaultMessage: 'Edit entry',\n          })}\n        </Typography>\n      </Flex>\n    </StyledMenuItem>\n  );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * EditReleaseItem\n * -----------------------------------------------------------------------------------------------*/\ninterface EditReleaseItemProps {\n  releaseId: Release['id'];\n}\n\nconst EditReleaseItem = ({ releaseId }: EditReleaseItemProps) => {\n  const { formatMessage } = useIntl();\n\n  return (\n    /* @ts-expect-error inference isn't working in DS */\n    <StyledMenuItem tag={NavLink} isLink to={`/plugins/content-releases/${releaseId}`}>\n      <Flex gap={2}>\n        <Pencil width=\"1.6rem\" height=\"1.6rem\" />\n        <Typography textColor=\"neutral800\" variant=\"omega\">\n          {formatMessage({\n            id: 'content-releases.content-manager-edit-view.edit-release',\n            defaultMessage: 'Edit release',\n          })}\n        </Typography>\n      </Flex>\n    </StyledMenuItem>\n  );\n};\n\n/* -------------------------------------------------------------------------------------------------\n * Root\n * -----------------------------------------------------------------------------------------------*/\n\ninterface RootProps {\n  children: React.ReactNode;\n  hasTriggerBorder?: boolean;\n}\n\nconst Root = ({ children }: RootProps) => {\n  const { formatMessage } = useIntl();\n\n  const { allowedActions } = useRBAC(PERMISSIONS);\n\n  return (\n    // A user can access the dropdown if they have permissions to delete a release-action OR update a release\n    allowedActions.canDeleteAction || allowedActions.canUpdate ? (\n      <Menu.Root>\n        <StyledMoreButton variant=\"tertiary\" endIcon={null} paddingLeft=\"7px\" paddingRight=\"7px\">\n          <AccessibleIcon\n            label={formatMessage({\n              id: 'content-releases.content-manager-edit-view.release-action-menu',\n              defaultMessage: 'Release action options',\n            })}\n          >\n            <More />\n          </AccessibleIcon>\n        </StyledMoreButton>\n        <Menu.Content top={1} popoverPlacement=\"bottom-end\">\n          {children}\n        </Menu.Content>\n      </Menu.Root>\n    ) : null\n  );\n};\n\nconst StyledMoreButton = styled(Menu.Trigger)`\n  & > span {\n    display: flex;\n  }\n`;\n\nexport const ReleaseActionMenu = {\n  Root,\n  EditReleaseItem,\n  DeleteReleaseActionItem,\n  ReleaseActionEntryLinkItem,\n};\n"],"names":["StyledMenuItem","styled","Menu","Item","theme","$variant","colors","neutral800","DeleteReleaseActionItem","releaseId","actionId","formatMessage","useIntl","toggleNotification","useNotification","formatAPIError","useAPIErrorHandler","deleteReleaseAction","useDeleteReleaseActionMutation","allowedActions","canDeleteAction","useRBAC","PERMISSIONS","handleDeleteAction","response","params","type","message","id","defaultMessage","isFetchError","error","_jsx","onSelect","_jsxs","Flex","gap","Cross","width","height","Typography","textColor","variant","ReleaseActionEntryLinkItem","contentTypeUid","documentId","locale","userPermissions","useAuth","state","permissions","canUpdateEntryForLocale","React","useMemo","updatePermissions","find","permission","subject","action","Boolean","properties","locales","includes","canUpdate","canUpdateContentType","updateContentType","tag","NavLink","isLink","to","pathname","search","Pencil","EditReleaseItem","Root","children","StyledMoreButton","endIcon","paddingLeft","paddingRight","AccessibleIcon","label","More","Content","top","popoverPlacement","Trigger","ReleaseActionMenu"],"mappings":"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"}