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.
94 lines (86 loc) • 2.54 kB
JSX
import PropTypes from 'prop-types';
import { styled } from '@mui/material/styles';
import { Rnd } from 'react-rnd';
import ResizeObserver from 'react-resize-observer';
import WorkspaceElasticWindow from '../containers/WorkspaceElasticWindow';
import ns from '../config/css-ns';
const Root = styled('div', { name: 'WorkspaceElastic', slot: 'root' })({
height: '100%',
position: 'relative',
width: '100%',
});
const StyledRnd = styled(Rnd)({
boxSizing: 'border-box',
margin: 0,
position: 'absolute',
transitionDuration: '.7s',
// order matters
// eslint-disable-next-line sort-keys
'&.react-draggable-dragging': {
transitionDuration: 'unset',
},
});
/**
* Represents a work area that contains any number of windows
* @memberof Workspace
* @private
*/
function WorkspaceElastic({
workspace,
elasticLayout,
setWorkspaceViewportDimensions,
setWorkspaceViewportPosition,
}) {
const { viewportPosition } = workspace;
const offsetX = workspace.width / 2;
const offsetY = workspace.height / 2;
return (
<Root>
<ResizeObserver
onReflow={() => {}}
onResize={(rect) => { setWorkspaceViewportDimensions(rect); }}
/>
<StyledRnd
size={{
height: workspace.height,
width: workspace.width,
}}
position={{
x: -1 * viewportPosition.x - offsetX, y: -1 * viewportPosition.y - offsetY,
}}
enableResizing={{
bottom: false,
bottomLeft: false,
bottomRight: false,
left: false,
right: false,
top: false,
topLeft: false,
topRight: false,
}}
onDragStop={(e, d) => {
setWorkspaceViewportPosition({ x: -1 * d.x - offsetX, y: -1 * d.y - offsetY });
}}
cancel={`.${ns('window')}`}
className={ns('workspace')}
disableDragging={!workspace.draggingEnabled}
>
{
Object.keys(elasticLayout).map(windowId => (
<WorkspaceElasticWindow
key={windowId}
windowId={windowId}
/>
))
}
</StyledRnd>
</Root>
);
}
WorkspaceElastic.propTypes = {
elasticLayout: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
setWorkspaceViewportDimensions: PropTypes.func.isRequired,
setWorkspaceViewportPosition: PropTypes.func.isRequired,
workspace: PropTypes.object.isRequired, // eslint-disable-line react/forbid-prop-types
};
export default WorkspaceElastic;