From 36ca72dc05d52b3f5b8448b574aa5cac24f8e15d Mon Sep 17 00:00:00 2001
From: Jessie Keck <jessie.keck@gmail.com>
Date: Fri, 1 Mar 2019 12:45:58 -0800
Subject: [PATCH] Use the id stored in config object in redux to create a
 scoped query selector to the mirador-viewer (and pass that to the various MUI
 Menus as the container prop.

---
 __tests__/src/components/WindowList.test.js    |  3 +++
 __tests__/src/components/WindowTopMenu.test.js |  1 +
 __tests__/src/components/WorkspaceMenu.test.js |  1 +
 src/components/WindowList.js                   | 12 ++++++++++--
 src/components/WindowTopMenu.js                | 14 ++++++++++++--
 src/components/WorkspaceMenu.js                | 12 ++++++++++--
 src/containers/WindowList.js                   |  1 +
 src/containers/WindowTopMenu.js                | 18 +++++++++++++++++-
 src/containers/WorkspaceMenu.js                |  7 ++++---
 9 files changed, 59 insertions(+), 10 deletions(-)

diff --git a/__tests__/src/components/WindowList.test.js b/__tests__/src/components/WindowList.test.js
index 06c65b65d..b96948578 100644
--- a/__tests__/src/components/WindowList.test.js
+++ b/__tests__/src/components/WindowList.test.js
@@ -17,6 +17,7 @@ describe('WindowList', () => {
 
     wrapper = shallow(
       <WindowList
+        containerId="mirador"
         anchorEl={{}}
         manifests={manifests}
         windows={windows}
@@ -36,6 +37,7 @@ describe('WindowList', () => {
 
       wrapper = shallow(
         <WindowList
+          containerId="mirador"
           anchorEl={{}}
           manifests={manifests}
           windows={windows}
@@ -64,6 +66,7 @@ describe('WindowList', () => {
 
       wrapper = shallow(
         <WindowList
+          containerId="mirador"
           anchorEl={{}}
           manifests={manifests}
           windows={windows}
diff --git a/__tests__/src/components/WindowTopMenu.test.js b/__tests__/src/components/WindowTopMenu.test.js
index db9671e41..38d40e464 100644
--- a/__tests__/src/components/WindowTopMenu.test.js
+++ b/__tests__/src/components/WindowTopMenu.test.js
@@ -11,6 +11,7 @@ import { WindowTopMenu } from '../../../src/components/WindowTopMenu';
 function createWrapper(props) {
   return shallow(
     <WindowTopMenu
+      containerId="mirador"
       windowId="xyz"
       handleClose={() => {}}
       anchorEl={null}
diff --git a/__tests__/src/components/WorkspaceMenu.test.js b/__tests__/src/components/WorkspaceMenu.test.js
index 0dbfcd067..383c63cc2 100644
--- a/__tests__/src/components/WorkspaceMenu.test.js
+++ b/__tests__/src/components/WorkspaceMenu.test.js
@@ -14,6 +14,7 @@ describe('WorkspaceMenu', () => {
     toggleZoomControls = jest.fn();
     wrapper = shallow(
       <WorkspaceMenu
+        containerId="mirador"
         handleClose={handleClose}
         showZoomControls={showZoomControls}
         toggleZoomControls={toggleZoomControls}
diff --git a/src/components/WindowList.js b/src/components/WindowList.js
index 921b11c3a..b592d66dc 100644
--- a/src/components/WindowList.js
+++ b/src/components/WindowList.js
@@ -4,6 +4,7 @@ import Menu from '@material-ui/core/Menu';
 import MenuItem from '@material-ui/core/MenuItem';
 import ListSubheader from '@material-ui/core/ListSubheader';
 import PropTypes from 'prop-types';
+import ns from '../config/css-ns';
 
 /**
  */
@@ -29,10 +30,16 @@ export class WindowList extends Component {
    */
   render() {
     const {
-      handleClose, anchorEl, windows, focusWindow, t,
+      containerId, handleClose, anchorEl, windows, focusWindow, t,
     } = this.props;
     return (
-      <Menu id="window-list-menu" anchorEl={anchorEl} open={Boolean(anchorEl)} onClose={handleClose}>
+      <Menu
+        id="window-list-menu"
+        container={document.querySelector(`#${containerId} .${ns('viewer')}`)}
+        anchorEl={anchorEl}
+        open={Boolean(anchorEl)}
+        onClose={handleClose}
+      >
         <ListSubheader>
           <Button color="inherit" aria-label={t('closeMenu')} onClick={handleClose} align="right" style={{ float: 'right' }}>&times;</Button>
           {t('openWindows')}
@@ -55,6 +62,7 @@ export class WindowList extends Component {
 }
 
 WindowList.propTypes = {
+  containerId: PropTypes.string.isRequired,
   focusWindow: PropTypes.func.isRequired,
   handleClose: PropTypes.func.isRequired,
   anchorEl: PropTypes.object, // eslint-disable-line react/forbid-prop-types
diff --git a/src/components/WindowTopMenu.js b/src/components/WindowTopMenu.js
index d19e3c14c..b0465003e 100644
--- a/src/components/WindowTopMenu.js
+++ b/src/components/WindowTopMenu.js
@@ -5,6 +5,7 @@ import Divider from '@material-ui/core/Divider';
 import PropTypes from 'prop-types';
 import WindowThumbnailSettings from '../containers/WindowThumbnailSettings';
 import WindowViewSettings from '../containers/WindowViewSettings';
+import ns from '../config/css-ns';
 
 /**
  */
@@ -14,12 +15,20 @@ export class WindowTopMenu extends Component {
    * @return
    */
   render() {
-    const { handleClose, anchorEl, windowId } = this.props;
+    const {
+      containerId, handleClose, anchorEl, windowId,
+    } = this.props;
     // const {} = this.state;
 
     return (
       <>
-        <Menu id={`window-menu_${windowId}`} anchorEl={anchorEl} open={Boolean(anchorEl)} onClose={handleClose}>
+        <Menu
+          id={`window-menu_${windowId}`}
+          container={document.querySelector(`#${containerId} .${ns('viewer')}`)}
+          anchorEl={anchorEl}
+          open={Boolean(anchorEl)}
+          onClose={handleClose}
+        >
           <ListItem>
             <WindowViewSettings windowId={windowId} />
           </ListItem>
@@ -35,6 +44,7 @@ export class WindowTopMenu extends Component {
 }
 
 WindowTopMenu.propTypes = {
+  containerId: PropTypes.string.isRequired,
   windowId: PropTypes.string.isRequired,
   handleClose: PropTypes.func.isRequired,
   anchorEl: PropTypes.object, // eslint-disable-line react/forbid-prop-types
diff --git a/src/components/WorkspaceMenu.js b/src/components/WorkspaceMenu.js
index 5019f94da..0d0a307fc 100644
--- a/src/components/WorkspaceMenu.js
+++ b/src/components/WorkspaceMenu.js
@@ -15,6 +15,7 @@ import { NestedMenu } from './NestedMenu';
 import WindowList from '../containers/WindowList';
 import WorkspaceSettings from '../containers/WorkspaceSettings';
 import WorkspaceExport from '../containers/WorkspaceExport';
+import ns from '../config/css-ns';
 
 /**
  */
@@ -72,7 +73,7 @@ export class WorkspaceMenu extends Component {
    */
   render() {
     const {
-      handleClose, anchorEl, t, showZoomControls,
+      containerId, handleClose, anchorEl, t, showZoomControls,
     } = this.props;
 
     const {
@@ -84,7 +85,13 @@ export class WorkspaceMenu extends Component {
 
     return (
       <>
-        <Menu id="workspace-menu" anchorEl={anchorEl} open={Boolean(anchorEl)} onClose={handleClose}>
+        <Menu
+          id="workspace-menu"
+          container={document.querySelector(`#${containerId} .${ns('viewer')}`)}
+          anchorEl={anchorEl}
+          open={Boolean(anchorEl)}
+          onClose={handleClose}
+        >
           <MenuItem
             aria-haspopup="true"
             onClick={(e) => { this.handleMenuItemClick('windowList', e); handleClose(e); }}
@@ -158,6 +165,7 @@ export class WorkspaceMenu extends Component {
 }
 
 WorkspaceMenu.propTypes = {
+  containerId: PropTypes.string.isRequired,
   handleClose: PropTypes.func.isRequired,
   toggleZoomControls: PropTypes.func,
   showZoomControls: PropTypes.bool,
diff --git a/src/containers/WindowList.js b/src/containers/WindowList.js
index ea83b10cb..3a77b6f8a 100644
--- a/src/containers/WindowList.js
+++ b/src/containers/WindowList.js
@@ -20,6 +20,7 @@ const mapDispatchToProps = {
  */
 const mapStateToProps = state => (
   {
+    containerId: state.config.id,
     windows: state.windows,
     manifests: state.manifests,
   }
diff --git a/src/containers/WindowTopMenu.js b/src/containers/WindowTopMenu.js
index 5cfba2887..1dedc34c1 100644
--- a/src/containers/WindowTopMenu.js
+++ b/src/containers/WindowTopMenu.js
@@ -1,4 +1,20 @@
+import { compose } from 'redux';
+import { connect } from 'react-redux';
 import miradorWithPlugins from '../lib/miradorWithPlugins';
 import { WindowTopMenu } from '../components/WindowTopMenu';
 
-export default miradorWithPlugins(WindowTopMenu);
+/**
+ * mapStateToProps - to hook up connect
+ * @memberof WindowTopMenu
+ * @private
+ */
+const mapStateToProps = state => ({
+  containerId: state.config.id,
+});
+
+const enhance = compose(
+  connect(mapStateToProps, null),
+  miradorWithPlugins,
+);
+
+export default enhance(WindowTopMenu);
diff --git a/src/containers/WorkspaceMenu.js b/src/containers/WorkspaceMenu.js
index 79392e276..7e4cd8e3f 100644
--- a/src/containers/WorkspaceMenu.js
+++ b/src/containers/WorkspaceMenu.js
@@ -17,9 +17,10 @@ const mapDispatchToProps = { toggleZoomControls: actions.toggleZoomControls };
  * @memberof WindowViewer
  * @private
  */
-const mapStateToProps = state => (
-  { showZoomControls: state.workspace.showZoomControls }
-);
+const mapStateToProps = state => ({
+  containerId: state.config.id,
+  showZoomControls: state.workspace.showZoomControls,
+});
 
 const enhance = compose(
   withTranslation(),
-- 
GitLab