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