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 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';
......@@ -31,6 +32,7 @@ export class WorkspaceArea extends Component {
? <WorkspaceAdd />
: <Workspace />
}
{<ErrorDialog />}
</main>
);
}
......
......@@ -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);
}
......
......@@ -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,
});
......
......@@ -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,
......
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;
});
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment