From 76af6afea8d421771645ff49bf0f2809fc6fbfe1 Mon Sep 17 00:00:00 2001 From: Benjamin Armintor Date: Tue, 28 Jan 2025 18:20:22 -0500 Subject: [PATCH] COLUMBIA: src/culPlugins/mirador-nativeObjectViewer plugin for text resources - Rudimentary fullscreen resizing for NativeObjectViewer - NativeObjectViewer use a ResizeObserver effect directly --- __tests__/integration/mirador/cul.html | 2 +- src/culPlugins/index.js | 2 + .../components/NativeObjectViewer.js | 70 +++++++++++++++++++ .../containers/NativeObjectViewer.js | 23 ++++++ .../mirador-nativeObjectViewer/index.js | 12 ++++ 5 files changed, 108 insertions(+), 1 deletion(-) create mode 100644 src/culPlugins/mirador-nativeObjectViewer/components/NativeObjectViewer.js create mode 100644 src/culPlugins/mirador-nativeObjectViewer/containers/NativeObjectViewer.js create mode 100644 src/culPlugins/mirador-nativeObjectViewer/index.js diff --git a/__tests__/integration/mirador/cul.html b/__tests__/integration/mirador/cul.html index 77bc5c6865..dac958a8d0 100644 --- a/__tests__/integration/mirador/cul.html +++ b/__tests__/integration/mirador/cul.html @@ -43,7 +43,7 @@ allowTopCollectionButton: true, } }, - [...Mirador.culPlugins.downloadDialogPlugin].concat([...Mirador.culPlugins.viewXmlPlugin]).concat([...Mirador.culPlugins.citationsSidebarPlugin]).concat([...Mirador.culPlugins.videojsPlugin]).concat([...Mirador.culPlugins.canvasRelatedLinksPlugin]).concat([...Mirador.culPlugins.hintingSideBar]).concat([...Mirador.culPlugins.viewerNavigation]).concat([...Mirador.culPlugins.collectionFoldersPlugin]) + [...Mirador.culPlugins.downloadDialogPlugin].concat([...Mirador.culPlugins.viewXmlPlugin]).concat([...Mirador.culPlugins.citationsSidebarPlugin]).concat([...Mirador.culPlugins.videojsPlugin]).concat([...Mirador.culPlugins.canvasRelatedLinksPlugin]).concat([...Mirador.culPlugins.hintingSideBar]).concat([...Mirador.culPlugins.viewerNavigation]).concat([...Mirador.culPlugins.collectionFoldersPlugin]).concat([...Mirador.culPlugins.nativeObjectViewerPlugin]) ); diff --git a/src/culPlugins/index.js b/src/culPlugins/index.js index f3364204b3..a1bd9743df 100644 --- a/src/culPlugins/index.js +++ b/src/culPlugins/index.js @@ -4,6 +4,7 @@ import citationsSidebarPlugin from './mirador-citations'; import collectionFoldersPlugin from './mirador-selectCollectionFolders'; import downloadDialogPlugin from './mirador-downloaddialog'; import hintingSideBar from './mirador-hinting-sidebar'; +import nativeObjectViewerPlugin from './mirador-nativeObjectViewer'; import videojsPlugin from './mirador-videojs'; import viewerNavigation from './mirador-pageIconViewerNavigation'; import viewXmlPlugin from './mirador-viewXml'; @@ -15,6 +16,7 @@ export default { collectionFoldersPlugin, downloadDialogPlugin, hintingSideBar, + nativeObjectViewerPlugin, videojsPlugin, viewerNavigation, viewXmlPlugin, diff --git a/src/culPlugins/mirador-nativeObjectViewer/components/NativeObjectViewer.js b/src/culPlugins/mirador-nativeObjectViewer/components/NativeObjectViewer.js new file mode 100644 index 0000000000..555266727f --- /dev/null +++ b/src/culPlugins/mirador-nativeObjectViewer/components/NativeObjectViewer.js @@ -0,0 +1,70 @@ +import { + Fragment, useEffect, useRef, useState, +} from 'react'; +import PropTypes from 'prop-types'; +import { styled } from '@mui/material/styles'; + +const StyledContainer = styled('div')({ + alignItems: 'center', + display: 'flex', + width: '100%', +}); + +const StyledObject = styled('object')({ + width: '100%', +}); + +/** */ +export function NativeObjectViewer({ nativeObjectOptions = {}, nativeObjectResources = [], windowId }) { + /** */ + const defaultDimensions = (originalDimensions) => (originalDimensions || document.body.querySelector(`#${windowId} .mirador-primary-window`)?.getBoundingClientRect()); + + const eleRef = useRef(null); + + const [currentDimensions, setCurrentDimensions] = useState({ + current: eleRef.current?.getBoundingClientRect(), + original: defaultDimensions(null), + }); + + useEffect(() => { + const element = eleRef.current; + + if (!element) return () => {}; + + const originalDimensions = element.getBoundingClientRect(); + const observer = new ResizeObserver((entries) => { + if (entries.length === 0) return; + const current = (document.fullscreenElement) ? entries[0].contentRect : originalDimensions; + + setCurrentDimensions({ current, original: originalDimensions }); + }); + + observer.observe(element); + return () => { + // Cleanup the observer like any event handlers + observer.disconnect(); + }; + }, [eleRef]); + + const dimensions = currentDimensions.current || currentDimensions.original; + /* eslint-disable jsx-a11y/alt-text */ + return ( + + + {nativeObjectResources.map((nativeObject) => ( + + + + ))} + + + ); + /* eslint-disable jsx-a11y/alt-text */ +} +/* eslint-enable jsx-a11y/media-has-caption */ + +NativeObjectViewer.propTypes = { + nativeObjectOptions: PropTypes.object, // eslint-disable-line react/forbid-prop-types + nativeObjectResources: PropTypes.arrayOf(PropTypes.object), // eslint-disable-line react/forbid-prop-types + windowId: PropTypes.string.isRequired, // eslint-disable-line react/forbid-prop-types +}; diff --git a/src/culPlugins/mirador-nativeObjectViewer/containers/NativeObjectViewer.js b/src/culPlugins/mirador-nativeObjectViewer/containers/NativeObjectViewer.js new file mode 100644 index 0000000000..68e4e89d82 --- /dev/null +++ b/src/culPlugins/mirador-nativeObjectViewer/containers/NativeObjectViewer.js @@ -0,0 +1,23 @@ +import { connect } from 'react-redux'; +import { compose } from 'redux'; +import { withTranslation } from 'react-i18next'; +import { withPlugins } from '../../../extend/withPlugins'; +import { NativeObjectViewer } from '../components/NativeObjectViewer'; +import { getConfig, getVisibleCanvasTextResources } from '../../../state/selectors'; + +/** */ +const mapStateToProps = (state, { windowId }) => ( + { + nativeObjectOptions: getConfig(state).nativeObjectOptions, + nativeObjectResources: getVisibleCanvasTextResources(state, { windowId }) || [], + windowId, + } +); + +const enhance = compose( + withTranslation(), + connect(mapStateToProps, null), + withPlugins('NativeObjectViewer'), +); + +export default enhance(NativeObjectViewer); diff --git a/src/culPlugins/mirador-nativeObjectViewer/index.js b/src/culPlugins/mirador-nativeObjectViewer/index.js new file mode 100644 index 0000000000..43bfa3ab89 --- /dev/null +++ b/src/culPlugins/mirador-nativeObjectViewer/index.js @@ -0,0 +1,12 @@ +import NativeObjectViewerComponent from './containers/NativeObjectViewer'; + +export default [ + { + component: NativeObjectViewerComponent, + mode: 'wrap', + name: 'NativeObjectViewer', + target: 'TextViewer', + }, +]; + +export { NativeObjectViewerComponent };