Skip to content
Snippets Groups Projects
Commit 992452ab authored by Glenn Fischer's avatar Glenn Fischer
Browse files

#1874: add import of companion windows and workspace config

parent 2cd08184
No related branches found
No related tags found
No related merge requests found
import React, { Component } from 'react'; import React, { Component } from 'react';
import PropTypes from 'prop-types'; import PropTypes from 'prop-types';
import classNames from 'classnames'; import classNames from 'classnames';
import ErrorDialog from '../containers/ErrorDialog';
import WorkspaceControlPanel from '../containers/WorkspaceControlPanel'; import WorkspaceControlPanel from '../containers/WorkspaceControlPanel';
import Workspace from '../containers/Workspace'; import Workspace from '../containers/Workspace';
import WorkspaceAdd from '../containers/WorkspaceAdd'; import WorkspaceAdd from '../containers/WorkspaceAdd';
...@@ -31,6 +32,7 @@ export class WorkspaceArea extends Component { ...@@ -31,6 +32,7 @@ export class WorkspaceArea extends Component {
? <WorkspaceAdd /> ? <WorkspaceAdd />
: <Workspace /> : <Workspace />
} }
{<ErrorDialog />}
</main> </main>
); );
} }
......
...@@ -13,12 +13,20 @@ export class WorkspaceExport extends Component { ...@@ -13,12 +13,20 @@ export class WorkspaceExport extends Component {
*/ */
exportableState() { exportableState() {
const { state } = this.props; const { state } = this.props;
const { config, viewers, windows } = state; const {
companionWindows,
config,
viewers,
windows,
workspace,
} = state;
return JSON.stringify({ return JSON.stringify({
companionWindows,
config, config,
viewers, viewers,
windows, windows,
workspace,
}, null, 2); }, null, 2);
} }
......
...@@ -11,7 +11,7 @@ import { CompanionArea } from '../components/CompanionArea'; ...@@ -11,7 +11,7 @@ import { CompanionArea } from '../components/CompanionArea';
const mapStateToProps = (state, { windowId, position }) => ({ const mapStateToProps = (state, { windowId, position }) => ({
companionAreaOpen: getCompanionAreaVisibility(state, { position, windowId }), companionAreaOpen: getCompanionAreaVisibility(state, { position, windowId }),
companionWindows: getCompanionWindowsOfWindow(state, { windowId }) companionWindows: getCompanionWindowsOfWindow(state, { windowId })
.filter(cw => cw.position === position), .filter(cw => cw && cw.position === position),
sideBarOpen: getWindow(state, { windowId }).sideBarOpen, sideBarOpen: getWindow(state, { windowId }).sideBarOpen,
}); });
......
...@@ -69,11 +69,13 @@ export function addWindow(options) { ...@@ -69,11 +69,13 @@ export function addWindow(options) {
companionWindows: [ companionWindows: [
{ {
content: 'info', content: 'info',
default: true,
id: cwDefault, id: cwDefault,
position: 'left', position: 'left',
}, },
{ {
content: 'thumbnail_navigation', content: 'thumbnail_navigation',
default: true,
id: cwThumbs, id: cwThumbs,
position: options.thumbnailNavigationPosition position: options.thumbnailNavigationPosition
|| config.thumbnailNavigation.defaultPosition, || config.thumbnailNavigation.defaultPosition,
......
import { import {
difference, difference,
keys, keys,
omit,
pick,
slice, slice,
values, values,
} from 'lodash'; } from 'lodash';
import ActionTypes from './action-types'; import ActionTypes from './action-types';
import { importConfig } from './config'; import { importConfig } from './config';
import { addWindow, removeWindow, updateWindow } from './window'; import { addWindow, removeWindow, updateWindow } from './window';
import { addCompanionWindow, removeCompanionWindow, updateCompanionWindow } from './companionWindow';
import { updateViewport } from './canvas'; import { updateViewport } from './canvas';
import { fetchManifest } from './manifest'; import { fetchManifest } from './manifest';
...@@ -100,13 +103,29 @@ export function toggleWorkspaceExposeMode() { ...@@ -100,13 +103,29 @@ export function toggleWorkspaceExposeMode() {
* importWorkspace - action creator * importWorkspace - action creator
*/ */
export function importWorkspace(stateExport) { export function importWorkspace(stateExport) {
// debugger;
return (dispatch, getState) => { return (dispatch, getState) => {
dispatch(importConfig(stateExport.config));
const { viewers } = stateExport || {}; const { viewers } = stateExport || {};
const { companionWindows } = stateExport || {};
const {
exposeModeOn,
height,
viewportPosition,
width,
} = stateExport.workspace;
const imWins = values(stateExport.windows); const imWins = values(stateExport.windows);
const exWins = values(getState().windows); const exWins = values(getState().windows);
const exWinCnt = exWins.length > imWins.length ? imWins.length : exWins.length; 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), If the existing workspace already contains windows (exWins),
we can re-use them in order to optimize the performance. we can re-use them in order to optimize the performance.
...@@ -116,20 +135,42 @@ export function importWorkspace(stateExport) { ...@@ -116,20 +135,42 @@ export function importWorkspace(stateExport) {
const exIds = slice(exWins, 0, exWinCnt).map((exWin) => { const exIds = slice(exWins, 0, exWinCnt).map((exWin) => {
const imWin = imWins.shift(); const imWin = imWins.shift();
const viewer = viewers[imWin.id]; const viewer = viewers[imWin.id];
delete imWin.id;
dispatch(fetchManifest(imWin.manifestId)); 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; return exWin.id;
}); });
/* create new windows for additionally imported ones */ /* create new windows for additionally imported ones */
const imIds = imWins.map((imWin) => { const imIds = imWins.map((imWin) => {
const viewer = viewers[imWin.id];
dispatch(fetchManifest(imWin.manifestId)); dispatch(fetchManifest(imWin.manifestId));
dispatch(addWindow(imWin)); dispatch(addWindow(omit(imWin, ['companionWindowIds', 'thumbnailNavigationId'])));
dispatch(updateViewport(imWin.id, viewers[imWin.id])); 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; return imWin.id;
}); });
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment