cardActionsMenu.tsx
TLDR
This file is the implementation of the CardActionsMenu
component, which is a menu that provides options to delete or duplicate a card. It also includes a "Copy Link" option to copy the link of the card to the clipboard.
Methods
handleDeleteCard
This method is called when the "Delete" option is clicked in the menu. It tracks the delete action using the TelemetryClient and calls the onClickDelete
prop.
handleDuplicateCard
This method is called when the "Duplicate" option is clicked in the menu. It tracks the duplicate action using the TelemetryClient and calls the onClickDuplicate
prop, if provided.
Classes
None
// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
import React, {ReactNode} from 'react'
import {useIntl} from 'react-intl'
import DeleteIcon from '../../widgets/icons/delete'
import Menu from '../../widgets/menu'
import BoardPermissionGate from '../permissions/boardPermissionGate'
import DuplicateIcon from '../../widgets/icons/duplicate'
import LinkIcon from '../../widgets/icons/Link'
import {Utils} from '../../utils'
import {Permission} from '../../constants'
import {sendFlashMessage} from '../flashMessages'
import {IUser} from '../../user'
import {getMe} from '../../store/users'
import {useAppSelector} from '../../store/hooks'
import TelemetryClient, {TelemetryActions, TelemetryCategory} from '../../telemetry/telemetryClient'
type Props = {
cardId: string
boardId: string
onClickDelete: () => void
onClickDuplicate?: () => void
children?: ReactNode
}
export const CardActionsMenu = (props: Props): JSX.Element => {
const {cardId} = props
const me = useAppSelector<IUser|null>(getMe)
const intl = useIntl()
const handleDeleteCard = () => {
TelemetryClient.trackEvent(TelemetryCategory, TelemetryActions.DeleteCard, {board: props.boardId, card: props.cardId})
props.onClickDelete()
}
const handleDuplicateCard = () => {
if (props.onClickDuplicate) {
TelemetryClient.trackEvent(TelemetryCategory, TelemetryActions.DuplicateCard, {board: props.boardId, card: props.cardId})
props.onClickDuplicate()
}
}
return (
<Menu position='left'>
<BoardPermissionGate permissions={[Permission.ManageBoardCards]}>
<Menu.Text
icon={<DeleteIcon/>}
id='delete'
name={intl.formatMessage({id: 'CardActionsMenu.delete', defaultMessage: 'Delete'})}
onClick={handleDeleteCard}
/>
{props.onClickDuplicate &&
<Menu.Text
icon={<DuplicateIcon/>}
id='duplicate'
name={intl.formatMessage({id: 'CardActionsMenu.duplicate', defaultMessage: 'Duplicate'})}
onClick={handleDuplicateCard}
/>}
</BoardPermissionGate>
{me?.id !== 'single-user' &&
<Menu.Text
icon={<LinkIcon/>}
id='copy'
name={intl.formatMessage({id: 'CardActionsMenu.copyLink', defaultMessage: 'Copy link'})}
onClick={() => {
let cardLink = window.location.href
if (!cardLink.includes(cardId)) {
cardLink += `/${cardId}`
}
Utils.copyTextToClipboard(cardLink)
sendFlashMessage({content: intl.formatMessage({id: 'CardActionsMenu.copiedLink', defaultMessage: 'Copied!'}), severity: 'high'})
}}
/>
}
{props.children}
</Menu>
)
}
export default CardActionsMenu