UNPKG

mirador

Version:

An open-source, web-based 'multi-up' viewer that supports zoom-pan-rotate functionality, ability to display/compare simple images, and images with annotations.

178 lines (170 loc) 4.97 kB
import PropTypes from 'prop-types'; import { styled } from '@mui/material/styles'; import Badge from '@mui/material/Badge'; import Tabs from '@mui/material/Tabs'; import Tab from '@mui/material/Tab'; import Tooltip from '@mui/material/Tooltip'; import InfoIcon from '@mui/icons-material/InfoSharp'; import AnnotationIcon from '@mui/icons-material/CommentSharp'; import AttributionIcon from '@mui/icons-material/CopyrightSharp'; import LayersIcon from '@mui/icons-material/LayersSharp'; import SearchIcon from '@mui/icons-material/SearchSharp'; import { useTranslation } from 'react-i18next'; import CanvasIndexIcon from './icons/CanvasIndexIcon'; import { usePlugins } from '../extend/usePlugins'; const Root = styled(Tabs, { name: 'WindowSideBarButtons', slot: 'root' })({ '& .MuiTabs-flexContainer': { flexDirection: 'column', }, '&.MuiTabs-indicator': { display: 'none', }, }); const StyledTabButton = styled(Tab, { name: 'WindowSideBarButtons', slot: 'button' })(({ theme }) => ({ '&.Mui-selected': { borderRight: '2px solid', borderRightColor: theme.palette.primary.main, }, '&.MuiTab-root': { '&:active': { backgroundColor: theme.palette.action.active, }, '&:focus': { '@media (hover: none)': { backgroundColor: 'transparent', }, backgroundColor: theme.palette.action.hover, textDecoration: 'none', // Reset on touch devices, it doesn't add specificity }, '&:hover': { '@media (hover: none)': { backgroundColor: 'transparent', }, backgroundColor: theme.palette.action.hover, textDecoration: 'none', // Reset on touch devices, it doesn't add specificity }, borderRight: '2px solid transparent', minWidth: 'auto', }, fill: 'currentcolor', })); /** */ function TabButton({ value, ...tabProps }) { const { t } = useTranslation(); return ( <Tooltip title={t('openCompanionWindow', { context: value })}> <StyledTabButton {...tabProps} value={value} aria-label={ t('openCompanionWindow', { context: value }) } disableRipple /> </Tooltip> ); } TabButton.propTypes = { value: PropTypes.string.isRequired, }; /** * */ export function WindowSideBarButtons({ addCompanionWindow, hasAnnotations = false, hasAnyAnnotations = false, hasAnyLayers = false, hasCurrentLayers = false, hasSearchResults = false, hasSearchService = false, panels = [], sideBarPanel = 'closed', }) { const { t } = useTranslation(); const { PluginComponents } = usePlugins("WindowSideBarButtons"); /** */ const handleChange = (event, value) => { addCompanionWindow(value); }; return ( <Root value={sideBarPanel === 'closed' ? false : sideBarPanel} onChange={handleChange} variant="fullWidth" indicatorColor="primary" textColor="primary" orientation="vertical" aria-orientation="vertical" aria-label={t('sidebarPanelsNavigation')} > { panels.info && ( <TabButton value="info" icon={(<InfoIcon />)} /> )} { panels.attribution && ( <TabButton value="attribution" icon={(<AttributionIcon />)} /> )} { panels.canvas && ( <TabButton value="canvas" icon={(<CanvasIndexIcon />)} /> )} {panels.annotations && (hasAnnotations || hasAnyAnnotations) && ( <TabButton value="annotations" icon={( <Badge overlap="rectangular" color="notification" invisible={!hasAnnotations} variant="dot"> <AnnotationIcon /> </Badge> )} /> )} {panels.search && hasSearchService && ( <TabButton value="search" icon={( <Badge overlap="rectangular" color="notification" invisible={!hasSearchResults} variant="dot"> <SearchIcon /> </Badge> )} /> )} { panels.layers && hasAnyLayers && ( <TabButton value="layers" icon={( <Badge overlap="rectangular" color="notification" invisible={!hasCurrentLayers} variant="dot"> <LayersIcon /> </Badge> )} /> )} { PluginComponents && PluginComponents.map(PluginComponent => ( <TabButton key={PluginComponent.value} value={PluginComponent.value} icon={<PluginComponent />} /> ))} </Root> ); } WindowSideBarButtons.propTypes = { addCompanionWindow: PropTypes.func.isRequired, hasAnnotations: PropTypes.bool, hasAnyAnnotations: PropTypes.bool, hasAnyLayers: PropTypes.bool, hasCurrentLayers: PropTypes.bool, hasSearchResults: PropTypes.bool, hasSearchService: PropTypes.bool, panels: PropTypes.objectOf(PropTypes.bool), sideBarPanel: PropTypes.string, };