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
JSX
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,
})),
};