import React, { useEffect, useRef, useState } from "react"; import Mousetrap from "mousetrap"; import { Button, ButtonGroup, Dropdown, Overlay, OverlayTrigger, Popover, Tooltip, } from "react-bootstrap"; import { DisplayMode } from "src/models/list-filter/types"; import { IntlShape, useIntl } from "react-intl"; import { Icon } from "../Shared/Icon"; import { faChevronDown, faList, faSquare, faTags, faThLarge, } from "@fortawesome/free-solid-svg-icons"; import { ZoomSelect } from "./ZoomSlider"; interface IListViewOptionsProps { zoomIndex?: number; onSetZoom?: (zoomIndex: number) => void; displayMode: DisplayMode; onSetDisplayMode: (m: DisplayMode) => void; displayModeOptions: DisplayMode[]; } function getIcon(option: DisplayMode) { switch (option) { case DisplayMode.Grid: return faThLarge; case DisplayMode.List: return faList; case DisplayMode.Wall: return faSquare; case DisplayMode.Tagger: return faTags; } } function getLabelId(option: DisplayMode) { let displayModeId = "unknown"; switch (option) { case DisplayMode.Grid: displayModeId = "grid"; break; case DisplayMode.List: displayModeId = "list"; break; case DisplayMode.Wall: displayModeId = "wall"; break; case DisplayMode.Tagger: displayModeId = "tagger"; break; } return `display_mode.${displayModeId}`; } function getLabel(intl: IntlShape, option: DisplayMode) { return intl.formatMessage({ id: getLabelId(option) }); } export const ListViewOptions: React.FC = ({ zoomIndex, onSetZoom, displayMode, onSetDisplayMode, displayModeOptions, }) => { const intl = useIntl(); const overlayTarget = useRef(null); const [showOptions, setShowOptions] = useState(false); useEffect(() => { Mousetrap.bind("v g", () => { if (displayModeOptions.includes(DisplayMode.Grid)) { onSetDisplayMode(DisplayMode.Grid); } }); Mousetrap.bind("v l", () => { if (displayModeOptions.includes(DisplayMode.List)) { onSetDisplayMode(DisplayMode.List); } }); Mousetrap.bind("v w", () => { if (displayModeOptions.includes(DisplayMode.Wall)) { onSetDisplayMode(DisplayMode.Wall); } }); Mousetrap.bind("v t", () => { if (displayModeOptions.includes(DisplayMode.Tagger)) { onSetDisplayMode(DisplayMode.Tagger); } }); return () => { Mousetrap.unbind("v g"); Mousetrap.unbind("v l"); Mousetrap.unbind("v w"); Mousetrap.unbind("v t"); }; }); function onChangeZoom(v: number) { if (onSetZoom) { onSetZoom(v); } } return ( <> setShowOptions(false)} > {({ placement, arrowProps, show: _show, ...props }) => (
{onSetZoom && zoomIndex !== undefined && (displayMode === DisplayMode.Grid || displayMode === DisplayMode.Wall) ? (
) : null} {displayModeOptions.map((option) => ( { setShowOptions(false); onSetDisplayMode(option); }} > {getLabel(intl, option)} ))}
)}
); }; export const ListViewButtonGroup: React.FC = ({ zoomIndex, onSetZoom, displayMode, onSetDisplayMode, displayModeOptions, }) => { const intl = useIntl(); return ( <> {displayModeOptions.length > 1 && ( {displayModeOptions.map((option) => ( {getLabel(intl, option)} } > ))} )}
{onSetZoom && zoomIndex !== undefined && (displayMode === DisplayMode.Grid || displayMode === DisplayMode.Wall) ? ( ) : null}
); };