box-ui-elements-mlh
Version:
131 lines (122 loc) • 4.49 kB
Flow
// @flow
import React from 'react';
import { FormattedMessage } from 'react-intl';
import Button from '../../components/button/Button';
import DropdownMenu from '../../components/dropdown-menu/DropdownMenu';
import Menu from '../../components/menu/Menu';
import MenuItem from '../../components/menu/MenuItem';
import Browser from '../../utils/Browser';
import IconEllipsis from '../../icons/general/IconEllipsis';
import { bdlGray50 } from '../../styles/variables';
import messages from '../common/messages';
import {
PERMISSION_CAN_DOWNLOAD,
PERMISSION_CAN_RENAME,
PERMISSION_CAN_DELETE,
PERMISSION_CAN_SHARE,
PERMISSION_CAN_PREVIEW,
TYPE_FILE,
TYPE_WEBLINK,
} from '../../constants';
import type { CommonGridViewFunctions } from './flowTypes';
import type { BoxItem } from '../../common/types/core';
import './MoreOptionsCell.scss';
type Props = {
canDelete: boolean,
canDownload: boolean,
canPreview: boolean,
canRename: boolean,
canShare: boolean,
isSmall: boolean,
item: BoxItem,
...$Exact<CommonGridViewFunctions>,
};
const MoreOptions = ({
canPreview,
canShare,
canDownload,
canDelete,
canRename,
onItemSelect,
onItemDelete,
onItemDownload,
onItemRename,
onItemShare,
onItemPreview,
isSmall,
item,
}: Props) => {
const onFocus = () => onItemSelect(item);
const onDelete = () => onItemDelete(item);
const onDownload = () => onItemDownload(item);
const onRename = () => onItemRename(item);
const onShare = () => onItemShare(item);
const onPreview = () => onItemPreview(item);
const { permissions, type } = item;
if (!permissions) {
return <span />;
}
const allowPreview = type === TYPE_FILE && canPreview && permissions[PERMISSION_CAN_PREVIEW];
const allowOpen = type === TYPE_WEBLINK;
const allowDelete = canDelete && permissions[PERMISSION_CAN_DELETE];
const allowShare = canShare && permissions[PERMISSION_CAN_SHARE];
const allowRename = canRename && permissions[PERMISSION_CAN_RENAME];
const allowDownload =
canDownload && permissions[PERMISSION_CAN_DOWNLOAD] && type === TYPE_FILE && !Browser.isMobile();
const allowed = allowDelete || allowRename || allowDownload || allowPreview || allowShare || allowOpen;
if (!allowed) {
return <span />;
}
return (
<div className="bce-more-options">
<DropdownMenu constrainToScrollParent isRightAligned>
<Button
className="bce-btn-more-options"
data-testid="bce-btn-more-options"
onFocus={onFocus}
type="button"
>
<IconEllipsis color={bdlGray50} height={10} width={16} />
</Button>
<Menu>
{allowPreview && (
<MenuItem onClick={onPreview}>
<FormattedMessage {...messages.preview} />
</MenuItem>
)}
{allowOpen && (
<MenuItem onClick={onPreview}>
<FormattedMessage {...messages.open} />
</MenuItem>
)}
{allowDelete && (
<MenuItem onClick={onDelete}>
<FormattedMessage {...messages.delete} />
</MenuItem>
)}
{allowDownload && (
<MenuItem onClick={onDownload}>
<FormattedMessage {...messages.download} />
</MenuItem>
)}
{allowRename && (
<MenuItem onClick={onRename}>
<FormattedMessage {...messages.rename} />
</MenuItem>
)}
{allowShare && (
<MenuItem onClick={onShare}>
<FormattedMessage {...messages.share} />
</MenuItem>
)}
</Menu>
</DropdownMenu>
{allowShare && !isSmall && (
<Button onClick={onShare} onFocus={onFocus} type="button">
<FormattedMessage {...messages.share} />
</Button>
)}
</div>
);
};
export default MoreOptions;