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.

155 lines (149 loc) 4.72 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, }), ), };