From 58aad63768df57764358ccd60f199faa04d53df9 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Mathias=20Maa=C3=9F?= <mathias.maass@uni-leipzig.de>
Date: Thu, 20 Jun 2019 14:54:10 +0200
Subject: [PATCH] Add config option to show manifest list. Closes #2759

---
 __tests__/integration/mirador/index.html |  9 ++-------
 __tests__/src/actions/config.test.js     | 13 +++++++++++++
 __tests__/src/actions/workspace.test.js  |  9 ---------
 __tests__/src/reducers/workspace.test.js |  8 --------
 src/config/settings.js                   |  1 +
 src/containers/WindowListButton.js       |  4 ++--
 src/containers/WorkspaceAddButton.js     |  2 +-
 src/containers/WorkspaceArea.js          |  4 ++--
 src/containers/WorkspaceMenu.js          |  2 +-
 src/state/actions/config.js              | 12 ++++++++++++
 src/state/actions/workspace.js           | 10 ----------
 src/state/reducers/workspace.js          |  2 --
 12 files changed, 34 insertions(+), 42 deletions(-)

diff --git a/__tests__/integration/mirador/index.html b/__tests__/integration/mirador/index.html
index c97fa455c..172ea303e 100644
--- a/__tests__/integration/mirador/index.html
+++ b/__tests__/integration/mirador/index.html
@@ -13,14 +13,9 @@
     <script type="text/javascript">
      var miradorInstance = Mirador.viewer({
        id: 'mirador',
-       windows: [{
-         loadedManifest: 'https://iiif.harvardartmuseums.org/manifests/object/299843',
-         canvasIndex: 2,
-         thumbnailNavigationPosition: 'far-bottom',
+       workspace: {
+         isWorkspaceAddVisible: true,
        },
-       {
-         loadedManifest: 'https://iiif.bodleian.ox.ac.uk/iiif/manifest/e32a277e-91e2-4a6d-8ba6-cc4bad230410.json',
-       }],
        window: {
          hideSearchPanel: false,
        },
diff --git a/__tests__/src/actions/config.test.js b/__tests__/src/actions/config.test.js
index 31857f319..94c2d2986 100644
--- a/__tests__/src/actions/config.test.js
+++ b/__tests__/src/actions/config.test.js
@@ -43,4 +43,17 @@ describe('config actions', () => {
       expect(actions.importMiradorState(state).type).toEqual(ActionTypes.IMPORT_MIRADOR_STATE);
     });
   });
+  describe('setWorkspaceAddVisibility', () => {
+    it('should set the the isWorkspaceAddVisible property', () => {
+      expect(actions.setWorkspaceAddVisibility(true)).toEqual({
+        config: { workspace: { isWorkspaceAddVisible: true } },
+        type: ActionTypes.UPDATE_CONFIG,
+      });
+
+      expect(actions.setWorkspaceAddVisibility(true)).toEqual({
+        config: { workspace: { isWorkspaceAddVisible: true } },
+        type: ActionTypes.UPDATE_CONFIG,
+      });
+    });
+  });
 });
diff --git a/__tests__/src/actions/workspace.test.js b/__tests__/src/actions/workspace.test.js
index 4eec7ef21..d4acc6096 100644
--- a/__tests__/src/actions/workspace.test.js
+++ b/__tests__/src/actions/workspace.test.js
@@ -40,15 +40,6 @@ describe('workspace actions', () => {
       expect(actions.toggleZoomControls(true)).toEqual(expectedAction);
     });
   });
-  describe('setWorkspaceAddVisibility', () => {
-    it('should set the workspace add visibility', () => {
-      const expectedAction = {
-        isWorkspaceAddVisible: true,
-        type: ActionTypes.SET_WORKSPACE_ADD_VISIBILITY,
-      };
-      expect(actions.setWorkspaceAddVisibility(true)).toEqual(expectedAction);
-    });
-  });
   describe('setWorkspaceViewportDimensions', () => {
     it('should set the workspace add visibility', () => {
       const expectedAction = {
diff --git a/__tests__/src/reducers/workspace.test.js b/__tests__/src/reducers/workspace.test.js
index e03538874..7a825a9b9 100644
--- a/__tests__/src/reducers/workspace.test.js
+++ b/__tests__/src/reducers/workspace.test.js
@@ -71,14 +71,6 @@ describe('workspace reducer', () => {
       layout: { foo: 'bar' },
     });
   });
-  it('should handle SET_WORKSPACE_ADD_VISIBILITY', () => {
-    expect(workspaceReducer([], {
-      isWorkspaceAddVisible: true,
-      type: ActionTypes.SET_WORKSPACE_ADD_VISIBILITY,
-    })).toEqual({
-      isWorkspaceAddVisible: true,
-    });
-  });
   it('should handle SET_WORKSPACE_VIEWPORT_POSITION', () => {
     expect(workspaceReducer({ height: 5000, width: 5000 }, {
       payload: {
diff --git a/src/config/settings.js b/src/config/settings.js
index a20f3360a..d6ad00501 100644
--- a/src/config/settings.js
+++ b/src/config/settings.js
@@ -230,6 +230,7 @@ export default {
   workspace: {
     showZoomControls: false, // Configure if zoom controls should be displayed by default
     type: 'mosaic', // Which workspace type to load by default. Other possible values are "elastic"
+    isWorkspaceAddVisible: false,
   },
   workspaceControlPanel: {
     enabled: true, // Configure if the control panel should be rendered.  Useful if you want to lock the viewer down to only the configured manifests
diff --git a/src/containers/WindowListButton.js b/src/containers/WindowListButton.js
index f35f162ca..8e5cb9350 100644
--- a/src/containers/WindowListButton.js
+++ b/src/containers/WindowListButton.js
@@ -6,8 +6,8 @@ import { withPlugins } from '../extend/withPlugins';
 import { WindowListButton } from '../components/WindowListButton';
 
 /** */
-const mapStateToProps = ({ windows, workspace }) => ({
-  disabled: workspace.isWorkspaceAddVisible,
+const mapStateToProps = ({ windows, config }) => ({
+  disabled: config.workspace.isWorkspaceAddVisible,
   windowCount: Object.keys(windows).length,
 });
 
diff --git a/src/containers/WorkspaceAddButton.js b/src/containers/WorkspaceAddButton.js
index 4635e30a0..d8aa7bb94 100644
--- a/src/containers/WorkspaceAddButton.js
+++ b/src/containers/WorkspaceAddButton.js
@@ -13,7 +13,7 @@ import { WorkspaceAddButton } from '../components/WorkspaceAddButton';
  * @private
  */
 const mapStateToProps = (state, { width }) => {
-  const { isWorkspaceAddVisible } = state.workspace;
+  const { isWorkspaceAddVisible } = state.config.workspace;
   return {
     isWorkspaceAddVisible,
     useExtendedFab: (
diff --git a/src/containers/WorkspaceArea.js b/src/containers/WorkspaceArea.js
index 39ac37d02..2f3d2f9ee 100644
--- a/src/containers/WorkspaceArea.js
+++ b/src/containers/WorkspaceArea.js
@@ -12,8 +12,8 @@ import { WorkspaceArea } from '../components/WorkspaceArea';
  */
 const mapStateToProps = state => (
   {
-    controlPanelVariant: state.workspace.isWorkspaceAddVisible || Object.keys(state.windows).length > 0 ? undefined : 'wide',
-    isWorkspaceAddVisible: state.workspace.isWorkspaceAddVisible,
+    controlPanelVariant: state.config.workspace.isWorkspaceAddVisible || Object.keys(state.windows).length > 0 ? undefined : 'wide',
+    isWorkspaceAddVisible: state.config.workspace.isWorkspaceAddVisible,
     isWorkspaceControlPanelVisible: state.config.workspaceControlPanel.enabled,
   }
 );
diff --git a/src/containers/WorkspaceMenu.js b/src/containers/WorkspaceMenu.js
index dcf19e1e5..735200431 100644
--- a/src/containers/WorkspaceMenu.js
+++ b/src/containers/WorkspaceMenu.js
@@ -22,7 +22,7 @@ const mapDispatchToProps = {
  */
 const mapStateToProps = state => ({
   containerId: getContainerId(state),
-  isWorkspaceAddVisible: state.workspace.isWorkspaceAddVisible,
+  isWorkspaceAddVisible: state.config.workspace.isWorkspaceAddVisible,
   showThemePicker: getThemeIds(state).length > 0,
   showZoomControls: getShowZoomControlsConfig(state),
 });
diff --git a/src/state/actions/config.js b/src/state/actions/config.js
index ce047806a..99681a058 100644
--- a/src/state/actions/config.js
+++ b/src/state/actions/config.js
@@ -47,3 +47,15 @@ export function importMiradorState(state) {
   };
   return { state: newState, type: ActionTypes.IMPORT_MIRADOR_STATE };
 }
+
+/**
+ * @param  {Object} isWorkspaceAddVisible
+ * @memberof ActionCreators
+ */
+export function setWorkspaceAddVisibility(isWorkspaceAddVisible) {
+  return updateConfig({
+    workspace: {
+      isWorkspaceAddVisible,
+    },
+  });
+}
diff --git a/src/state/actions/workspace.js b/src/state/actions/workspace.js
index ff0f64b6d..01589e2c6 100644
--- a/src/state/actions/workspace.js
+++ b/src/state/actions/workspace.js
@@ -29,16 +29,6 @@ export function updateWorkspaceMosaicLayout(layout) {
   return { layout, type: ActionTypes.UPDATE_WORKSPACE_MOSAIC_LAYOUT };
 }
 
-/**
- * updateWorkspaceMosaicLayout - action creator
- *
- * @param  {Object} isWorkspaceAddVisible
- * @memberof ActionCreators
- */
-export function setWorkspaceAddVisibility(isWorkspaceAddVisible) {
-  return { isWorkspaceAddVisible, type: ActionTypes.SET_WORKSPACE_ADD_VISIBILITY };
-}
-
 /**
  * setWorkspaceViewportPosition - action creator
  *
diff --git a/src/state/reducers/workspace.js b/src/state/reducers/workspace.js
index c8a1e4fcb..039789080 100644
--- a/src/state/reducers/workspace.js
+++ b/src/state/reducers/workspace.js
@@ -63,8 +63,6 @@ export const workspaceReducer = (
       return { ...state, showZoomControls: action.showZoomControls };
     case ActionTypes.UPDATE_WORKSPACE_MOSAIC_LAYOUT:
       return { ...state, layout: action.layout };
-    case ActionTypes.SET_WORKSPACE_ADD_VISIBILITY:
-      return { ...state, isWorkspaceAddVisible: action.isWorkspaceAddVisible };
     case ActionTypes.SET_WORKSPACE_VIEWPORT_POSITION:
       newWorkspaceDimensions = {};
 
-- 
GitLab