diff --git a/src/components/WorkspaceArea.js b/src/components/WorkspaceArea.js index 045b5fe7b6b57e20068ac3ca0ed7e2ae4440cdf2..84106824ac83fbd4c1d62ea0e4e5d0fcfaa75129 100644 --- a/src/components/WorkspaceArea.js +++ b/src/components/WorkspaceArea.js @@ -1,6 +1,7 @@ import React, { Component } from 'react'; import PropTypes from 'prop-types'; import classNames from 'classnames'; +import ErrorDialog from '../containers/ErrorDialog'; import WorkspaceControlPanel from '../containers/WorkspaceControlPanel'; import Workspace from '../containers/Workspace'; import WorkspaceAdd from '../containers/WorkspaceAdd'; @@ -30,7 +31,8 @@ export class WorkspaceArea extends Component { isWorkspaceAddVisible ? <WorkspaceAdd /> : <Workspace /> - } + } + {<ErrorDialog />} </main> ); } diff --git a/src/components/WorkspaceExport.js b/src/components/WorkspaceExport.js index 48559d65f0a6136fab6a38d5264eb5d542b0f218..c4143585eb569aecf54525798dfe6476260f25cd 100644 --- a/src/components/WorkspaceExport.js +++ b/src/components/WorkspaceExport.js @@ -13,12 +13,20 @@ export class WorkspaceExport extends Component { */ exportableState() { const { state } = this.props; - const { config, viewers, windows } = state; + const { + companionWindows, + config, + viewers, + windows, + workspace, + } = state; return JSON.stringify({ + companionWindows, config, viewers, windows, + workspace, }, null, 2); } diff --git a/src/containers/CompanionArea.js b/src/containers/CompanionArea.js index 7220e84f7311efd0d5d2282d9a23d8e94f111254..67d751551dcb95539d575681da3f66f27927a06c 100644 --- a/src/containers/CompanionArea.js +++ b/src/containers/CompanionArea.js @@ -11,7 +11,7 @@ import { CompanionArea } from '../components/CompanionArea'; const mapStateToProps = (state, { windowId, position }) => ({ companionAreaOpen: getCompanionAreaVisibility(state, { position, windowId }), companionWindows: getCompanionWindowsOfWindow(state, { windowId }) - .filter(cw => cw.position === position), + .filter(cw => cw && cw.position === position), sideBarOpen: getWindow(state, { windowId }).sideBarOpen, }); diff --git a/src/state/actions/window.js b/src/state/actions/window.js index e925af90750b16925f0752407f8576af1a37cbea..6acea0fe1767d589a96e0b28da6938636184296c 100644 --- a/src/state/actions/window.js +++ b/src/state/actions/window.js @@ -69,11 +69,13 @@ export function addWindow(options) { companionWindows: [ { content: 'info', + default: true, id: cwDefault, position: 'left', }, { content: 'thumbnail_navigation', + default: true, id: cwThumbs, position: options.thumbnailNavigationPosition || config.thumbnailNavigation.defaultPosition, diff --git a/src/state/actions/workspace.js b/src/state/actions/workspace.js index 125820e59e7de8e7f3c75a5b438f96a7b5ed9636..e412e26a0899b40eebf41416bf71329bd0923b95 100644 --- a/src/state/actions/workspace.js +++ b/src/state/actions/workspace.js @@ -1,12 +1,15 @@ import { difference, keys, + omit, + pick, slice, values, } from 'lodash'; import ActionTypes from './action-types'; import { importConfig } from './config'; import { addWindow, removeWindow, updateWindow } from './window'; +import { addCompanionWindow, removeCompanionWindow, updateCompanionWindow } from './companionWindow'; import { updateViewport } from './canvas'; import { fetchManifest } from './manifest'; @@ -100,13 +103,29 @@ export function toggleWorkspaceExposeMode() { * importWorkspace - action creator */ export function importWorkspace(stateExport) { + // debugger; return (dispatch, getState) => { - dispatch(importConfig(stateExport.config)); const { viewers } = stateExport || {}; + const { companionWindows } = stateExport || {}; + const { + exposeModeOn, + height, + viewportPosition, + width, + } = stateExport.workspace; + const imWins = values(stateExport.windows); const exWins = values(getState().windows); const exWinCnt = exWins.length > imWins.length ? imWins.length : exWins.length; + /* first do window independent stuff */ + dispatch(importConfig(stateExport.config)); + getState().workspace.exposeModeOn !== exposeModeOn && dispatch(toggleWorkspaceExposeMode()); + dispatch(setWorkspaceViewportDimensions({ width, height })); + dispatch(setWorkspaceViewportPosition(viewportPosition)); + + /* now import the windows */ + /* If the existing workspace already contains windows (exWins), we can re-use them in order to optimize the performance. @@ -116,20 +135,42 @@ export function importWorkspace(stateExport) { const exIds = slice(exWins, 0, exWinCnt).map((exWin) => { const imWin = imWins.shift(); const viewer = viewers[imWin.id]; - delete imWin.id; dispatch(fetchManifest(imWin.manifestId)); - dispatch(updateWindow(exWin.id, imWin)); - dispatch(updateViewport(exWin.id, viewer)); + /* + remove exisiting companionWindows, except the ones marked as default + */ + exWin.companionWindowIds + .filter(cwId => !getState().companionWindows[cwId].default) + .map(cwId => dispatch(removeCompanionWindow(exWin.id, cwId))); + /* update the window */ + dispatch(updateWindow(exWin.id, omit(imWin, 'id', 'companionWindowIds', 'thumbnailNavigationId'))); + + /* update default companionWindows */ + exWin.companionWindowIds + .filter(cwId => companionWindows[cwId].default) + .map(cwId => dispatch(updateCompanionWindow(exWin.id, cwId, companionWindows[cwId]))); + + /* create non-default companionWindows */ + imWin.companionWindowIds + .filter(cwId => !companionWindows[cwId].default) + .map(cwId => dispatch(addCompanionWindow(exWin.id, { ...omit(companionWindows[cwId], 'id') }))); + dispatch(updateViewport(exWin.id, viewer)); return exWin.id; }); /* create new windows for additionally imported ones */ const imIds = imWins.map((imWin) => { + const viewer = viewers[imWin.id]; + dispatch(fetchManifest(imWin.manifestId)); - dispatch(addWindow(imWin)); - dispatch(updateViewport(imWin.id, viewers[imWin.id])); + dispatch(addWindow(omit(imWin, ['companionWindowIds', 'thumbnailNavigationId']))); + dispatch(updateViewport(imWin.id, viewer)); + /* create companion windows */ + values(companionWindows) + .filter(cw => !cw.default) + .map(cw => dispatch(addCompanionWindow(imWin.id, { ...omit(cw, 'id') }, {}))); return imWin.id; });