{"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 { Menu, AccessibleIcon, IconButton } 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\n// TODO: has to be fixed in the DS - https://github.com/strapi/design-system/issues/1934\nconst StyledMenuLink = styled(Menu.Item)`\n  span,\n  &:hover span {\n    color: ${({ theme }) => theme.colors['neutral800']};\n  }\n\n  svg path,\n  &:hover svg path {\n    fill: ${({ theme }) => theme.colors['neutral500']};\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    <Menu.Item variant=\"danger\" startIcon={<Cross />} onSelect={handleDeleteAction}>\n      {formatMessage({\n        id: 'content-releases.content-manager-edit-view.remove-from-release',\n        defaultMessage: 'Remove from release',\n      })}\n    </Menu.Item>\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    <StyledMenuLink\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      startIcon={<Pencil />}\n    >\n      {formatMessage({\n        id: 'content-releases.content-manager-edit-view.edit-entry',\n        defaultMessage: 'Edit entry',\n      })}\n    </StyledMenuLink>\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    <StyledMenuLink\n      /* @ts-expect-error inference isn't working in DS */\n      tag={NavLink}\n      isLink\n      to={`/plugins/content-releases/${releaseId}`}\n      startIcon={<Pencil />}\n    >\n      {formatMessage({\n        id: 'content-releases.content-manager-edit-view.edit-release',\n        defaultMessage: 'Edit release',\n      })}\n    </StyledMenuLink>\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\n          variant=\"tertiary\"\n          endIcon={null}\n          tag={IconButton}\n          icon={\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          }\n        />\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":["StyledMenuLink","styled","Menu","Item","theme","colors","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","variant","startIcon","Cross","onSelect","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","_jsxs","StyledMoreButton","endIcon","IconButton","icon","AccessibleIcon","label","More","Content","top","popoverPlacement","Trigger","ReleaseActionMenu"],"mappings":"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"}