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.

152 lines (146 loc) 4.8 kB
import { useId } from 'react'; import PropTypes from 'prop-types'; import { styled } from '@mui/material/styles'; import Typography from '@mui/material/Typography'; import Link from '@mui/material/Link'; import classNames from 'classnames'; import { useTranslation } from 'react-i18next'; import CollapsibleSection from '../containers/CollapsibleSection'; import ns from '../config/css-ns'; import { PluginHook } from './PluginHook'; const StyledDl = styled('dl')(({ theme }) => ({ '& dd': { marginBottom: '.5em', marginLeft: '0', }, })); /** * ManifestRelatedLinks */ export function ManifestRelatedLinks({ homepage = null, manifestUrl = null, related = null, renderings = null, seeAlso = null, ...rest }) { const { t } = useTranslation(); const id = useId(); const titleId = useId(); const pluginProps = { homepage, manifestUrl, related, renderings, seeAlso, t, ...rest, }; return ( <CollapsibleSection aria-labelledby={titleId} id={id} label={t('related')} > <Typography aria-labelledby={`${id} ${titleId}`} id={titleId} variant="h4" component="h5" > {t('links')} </Typography> <StyledDl className={classNames(ns('label-value-metadata'))}> { homepage && ( <> <Typography variant="subtitle2" component="dt">{t('iiif_homepage')}</Typography> { homepage.map(page => ( <Typography key={page.value} variant="body1" component="dd"> <Link target="_blank" rel="noopener noreferrer" href={page.value}> {page.label || page.value} </Link> </Typography> )) } </> )} { renderings && renderings.length > 0 && ( <> <Typography variant="subtitle2" component="dt">{t('iiif_renderings')}</Typography> { renderings.map(rendering => ( <Typography key={rendering.value} variant="body1" component="dd"> <Link target="_blank" rel="noopener noreferrer" href={rendering.value}> {rendering.label || rendering.value} </Link> </Typography> )) } </> )} { related && ( <> <Typography variant="subtitle2" component="dt">{t('iiif_related')}</Typography> { related.map(relatedItem => ( <Typography key={relatedItem.value} variant="body1" component="dd"> <Link target="_blank" rel="noopener noreferrer" href={relatedItem.value}> {relatedItem.label || relatedItem.value} </Link> { relatedItem.format && ( <Typography component="span">{` (${relatedItem.format})`}</Typography> )} </Typography> )) } </> )} { seeAlso && ( <> <Typography variant="subtitle2" component="dt">{t('iiif_seeAlso')}</Typography> { seeAlso.map(seeAlsoItem => ( <Typography key={seeAlsoItem.value} variant="body1" component="dd"> <Link target="_blank" rel="noopener noreferrer" href={seeAlsoItem.value}> {seeAlsoItem.label || seeAlsoItem.value} </Link> { seeAlsoItem.format && ( <Typography component="span">{` (${seeAlsoItem.format})`}</Typography> )} </Typography> )) } </> )} { manifestUrl && ( <> <Typography variant="subtitle2" component="dt">{t('iiif_manifest')}</Typography> <Typography variant="body1" component="dd"> <Link target="_blank" rel="noopener noreferrer" href={manifestUrl}> {manifestUrl} </Link> </Typography> </> )} </StyledDl> <PluginHook targetName="ManifestRelatedLinks" {...pluginProps} /> </CollapsibleSection> ); } ManifestRelatedLinks.propTypes = { homepage: PropTypes.arrayOf(PropTypes.shape({ label: PropTypes.string, value: PropTypes.string, })), manifestUrl: PropTypes.string, related: PropTypes.arrayOf(PropTypes.shape({ format: PropTypes.string, label: PropTypes.string, value: PropTypes.string, })), renderings: PropTypes.arrayOf(PropTypes.shape({ label: PropTypes.string, value: PropTypes.string, })), seeAlso: PropTypes.arrayOf(PropTypes.shape({ format: PropTypes.string, label: PropTypes.string, value: PropTypes.string, })), };