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.
77 lines (73 loc) • 2.31 kB
JSX
import { useRef } from 'react';
import PropTypes from 'prop-types';
import Button from '@mui/material/Button';
import Chip from '@mui/material/Chip';
import Typography from '@mui/material/Typography';
import { useTranslation } from 'react-i18next';
import CompanionWindow from '../containers/CompanionWindow';
import SearchPanelControls from '../containers/SearchPanelControls';
import SearchResults from '../containers/SearchResults';
/** */
export function SearchPanel({
fetchSearch = undefined,
id,
query = '',
removeSearch,
searchService,
suggestedSearches = [],
windowId,
}) {
const { t } = useTranslation();
const containerRef = useRef(null);
return (
<CompanionWindow
ariaLabel={t('searchTitle')}
title={
<>
{t('searchTitle')}
{query && query !== '' && (
<Chip
aria-label={t('clearSearchAria')}
role="button"
sx={{ marginLeft: 1 }}
color="secondary"
label={t('clearSearch')}
onClick={removeSearch}
onDelete={removeSearch}
size="small"
tabIndex={0}
variant="outlined"
/>
)}
</>
}
windowId={windowId}
id={id}
titleControls={<SearchPanelControls companionWindowId={id} windowId={windowId} />}
ref={containerRef}
>
<SearchResults containerRef={containerRef} companionWindowId={id} windowId={windowId} />
{fetchSearch &&
suggestedSearches &&
query === '' &&
suggestedSearches.map((search) => (
<Typography component="p" key={search} variant="body1" sx={{ margin: 2 }}>
<Button variant="inlineText" color="secondary" onClick={() => fetchSearch(`${searchService.id}?q=${search}`, search)}>
{t('suggestSearch', { query: search })}
</Button>
</Typography>
))}
</CompanionWindow>
);
}
SearchPanel.propTypes = {
fetchSearch: PropTypes.func,
id: PropTypes.string.isRequired,
query: PropTypes.string,
removeSearch: PropTypes.func.isRequired,
searchService: PropTypes.shape({
id: PropTypes.string,
}).isRequired,
suggestedSearches: PropTypes.arrayOf(PropTypes.string),
windowId: PropTypes.string.isRequired,
};