import { useEffect, useState, VFC } from 'react'; import { IconButton, ListItemIcon, ListItemText, MenuList, Popover, Tooltip, Typography, useMediaQuery, useTheme, } from '@mui/material'; import ColumnIcon from '@mui/icons-material/ViewWeek'; import CloseIcon from '@mui/icons-material/Close'; import { ConditionallyRender } from 'component/common/ConditionallyRender/ConditionallyRender'; import { StyledBoxContainer, StyledBoxMenuHeader, StyledCheckbox, StyledDivider, StyledIconButton, StyledMenuItem, } from './ColumnsMenu.styles'; interface IColumnsMenuProps { allColumns: { Header?: string | any; id: string; isVisible: boolean; toggleHidden: (state: boolean) => void; hideInMenu?: boolean; }[]; staticColumns?: string[]; dividerBefore?: string[]; dividerAfter?: string[]; isCustomized?: boolean; setHiddenColumns: (hiddenColumns: string[]) => void; onCustomize?: () => void; } const columnNameMap: Record = { favorite: 'Favorite', }; export const ColumnsMenu: VFC = ({ allColumns, staticColumns = [], dividerBefore = [], dividerAfter = [], isCustomized = false, onCustomize, setHiddenColumns, }) => { const [anchorEl, setAnchorEl] = useState(null); const theme = useTheme(); const isTinyScreen = useMediaQuery(theme.breakpoints.down('sm')); const isSmallScreen = useMediaQuery(theme.breakpoints.down('md')); const isMediumScreen = useMediaQuery(theme.breakpoints.down('lg')); useEffect(() => { if (isCustomized) { return; } const setVisibleColumns = ( columns: string[], environmentsToShow: number = 0, ) => { const visibleEnvColumns = allColumns .filter(({ id }) => id.startsWith('environment:') !== false) .map(({ id }) => id) .slice(0, environmentsToShow); const hiddenColumns = allColumns .map(({ id }) => id) .filter((id) => !columns.includes(id)) .filter((id) => !staticColumns.includes(id)) .filter((id) => !visibleEnvColumns.includes(id)); setHiddenColumns(hiddenColumns); }; if (isTinyScreen) { return setVisibleColumns(['createdAt']); } if (isSmallScreen) { return setVisibleColumns(['createdAt'], 1); } if (isMediumScreen) { return setVisibleColumns(['type', 'createdAt'], 1); } setVisibleColumns(['lastSeenAt', 'type', 'createdAt'], 3); // eslint-disable-next-line react-hooks/exhaustive-deps }, [isTinyScreen, isSmallScreen, isMediumScreen]); const handleClick = (event: React.MouseEvent) => { setAnchorEl(event.currentTarget); }; const handleClose = () => { setAnchorEl(null); }; const isOpen = Boolean(anchorEl); const id = `columns-menu`; const menuId = `columns-menu-list-${id}`; return ( ({ borderRadius: theme.shape.borderRadius, paddingBottom: theme.spacing(2), }), }} > Columns {allColumns .filter(({ hideInMenu }) => !hideInMenu) .map((column) => [ } />, { column.toggleHidden(column.isVisible); onCustomize?.(); }} disabled={staticColumns.includes(column.id)} > ( <>{column.Header} )} elseShow={() => columnNameMap[column.id] || column.id } /> } /> , } />, ])} ); };