From 8acd7447107abdb5345af7867f672fc5d17fcb36 Mon Sep 17 00:00:00 2001 From: Erik Ziegler Date: Sat, 9 May 2020 10:57:52 +0200 Subject: [PATCH] Continue the ModeRoute work. Routes are reachable, but extensionManager needs to be improve to provide module entries correctly --- .../default/src/getLayoutTemplatesModule.js | 2 +- extensions/default/src/getSidePanelModule.js | 6 +++ modes/example/src/index.js | 4 +- .../core/src/extensions/ExtensionManager.js | 9 ++-- platform/viewer/public/config/default.js | 2 +- platform/viewer/src/App.js | 3 ++ platform/viewer/src/appInit.js | 5 +++ platform/viewer/src/routes/ModeRoute.js | 41 ++++++++++++++----- platform/viewer/src/routes/buildModeRoutes.js | 16 +++++--- 9 files changed, 65 insertions(+), 23 deletions(-) diff --git a/extensions/default/src/getLayoutTemplatesModule.js b/extensions/default/src/getLayoutTemplatesModule.js index cfbc938de..f85eba2b0 100644 --- a/extensions/default/src/getLayoutTemplatesModule.js +++ b/extensions/default/src/getLayoutTemplatesModule.js @@ -6,7 +6,7 @@ export default function() { return [ // Layout Template Definition { - name: 'myLayout', + id: 'org.ohif.defaults.viewerLayout', component: viewerLayout, }, ]; diff --git a/extensions/default/src/getSidePanelModule.js b/extensions/default/src/getSidePanelModule.js index 8c1eae334..0ab68ed47 100644 --- a/extensions/default/src/getSidePanelModule.js +++ b/extensions/default/src/getSidePanelModule.js @@ -8,10 +8,16 @@ function getSidePanelModule() { return [ { name: 'org.ohif.defaults.seriesList', + iconName: 'group-layers', + iconLabel: 'Studies', + label: 'Studies', component: helloWorldComponent, }, { name: 'org.ohif.defaults.measure', + iconName: 'list-bullets', + iconLabel: 'Measure', + label: 'Measurements', component: helloWorldComponent, }, ]; diff --git a/modes/example/src/index.js b/modes/example/src/index.js index b3528750b..bd54fbf00 100644 --- a/modes/example/src/index.js +++ b/modes/example/src/index.js @@ -21,7 +21,7 @@ export default function mode({ modeConfiguration }) { }, layoutTemplate: ({ routeProps }) => { return { - id: 'org.ohif.defaults.viewerlayout', + id: 'org.ohif.defaults.viewerLayout', props: { // named slots leftPanels: ['org.ohif.defaults.seriesList'], @@ -35,3 +35,5 @@ export default function mode({ modeConfiguration }) { sopClassHandlers: ['org.ohif.defaults.stack'], }; } + +window.exampleMode = mode({}); diff --git a/platform/core/src/extensions/ExtensionManager.js b/platform/core/src/extensions/ExtensionManager.js index 22ab070f9..c05548c13 100644 --- a/platform/core/src/extensions/ExtensionManager.js +++ b/platform/core/src/extensions/ExtensionManager.js @@ -97,7 +97,7 @@ export default class ExtensionManager { }); extensionModule.forEach(element => { - this.modulesMap[`${extensionId}.${moduleType}.${name}`]; + this.modulesMap[`${extensionId}.${moduleType}.${element.name}`]; }); } }); @@ -111,6 +111,7 @@ export default class ExtensionManager { } getDataSource(dataSourceId) { + // Note: this currently uses the data source name, which feels weird... return this.dataSourceMap[dataSourceId]; } @@ -163,11 +164,11 @@ export default class ExtensionManager { break; } case 'dataSourcesModule': { - break; - extensionModule.forEach(element => { - this.dataSourceMap[extensionModule.name] = element; + this.dataSourceMap[element.name] = element; }); + + break; } default: // code block diff --git a/platform/viewer/public/config/default.js b/platform/viewer/public/config/default.js index fb9cea8d3..1d31985b3 100644 --- a/platform/viewer/public/config/default.js +++ b/platform/viewer/public/config/default.js @@ -1,7 +1,7 @@ window.config = { routerBasename: '/', // whiteLabelling: {}, - extensions: [], + extensions: ['org.ohif.default'], modes: [], showStudyList: true, // filterQueryParam: false, diff --git a/platform/viewer/src/App.js b/platform/viewer/src/App.js index eefb5057c..ded9372ae 100644 --- a/platform/viewer/src/App.js +++ b/platform/viewer/src/App.js @@ -9,6 +9,9 @@ import { ThemeWrapper } from '@ohif/ui'; import createRoutes from './routes'; import appInit from './appInit.js'; +// Temporarily for testing +import '@ohif/mode-example'; + /** * ENV Variable to determine routing behavior */ diff --git a/platform/viewer/src/appInit.js b/platform/viewer/src/appInit.js index 0d612d6ed..279803a75 100644 --- a/platform/viewer/src/appInit.js +++ b/platform/viewer/src/appInit.js @@ -64,6 +64,11 @@ function appInit(appConfigOrFunc, defaultExtensions) { const { modes } = appConfig; + // Temporarily for testing + if (!modes.length) { + modes.push(window.exampleMode); + } + const appRoutes = buildModeRoutes(modes, extensionManager) || []; return { diff --git a/platform/viewer/src/routes/ModeRoute.js b/platform/viewer/src/routes/ModeRoute.js index 467d1bcc6..8014db6f9 100644 --- a/platform/viewer/src/routes/ModeRoute.js +++ b/platform/viewer/src/routes/ModeRoute.js @@ -18,15 +18,23 @@ export default function ModeRoute({ // Deal with toolbar. // Only handling one route per mode for now - const LayoutComponent = extensionManager.getModuleEntry( - routes[0].layoutTemplate + const layoutTemplateData = routes[0].layoutTemplate({ location }); + /*const LayoutComponent = extensionManager.getModuleEntry( + layoutTemplateData.id + );*/ + + // You can test via http://localhost:3000/example-mode/dicomweb + const LayoutComponent = () => ( +
+ {`Reached the route for Mode: ${mode.id} and Data Source: ${dataSourceId}`} +
); // Add SOPClassHandlers to a new SOPClassManager. - const manager = new SOPClassHandlerManager( + /*const manager = new SOPClassHandlerManager( extensionManager, sopClassHandlers - ); + );*/ const queryParams = location.search; @@ -38,16 +46,27 @@ export default function ModeRoute({ const onUpdatedCallback = () => { // TODO: This should append, not create from scratch so we don't nuke existing display sets // when e.g. a new series arrives - manager.createDisplaySets.then(setDisplaySetInstanceUids); + //manager.createDisplaySets.then(setDisplaySetInstanceUids); }; - const contextModules = extensions.getContextModules(); - const contextModuleProviders = contextModules.map(a => a.context.Provider); - const CombinedContextProvider = Compose(contextModuleProviders); + // TODO: For each extension, look up their context modules + //const contextModules = extensions.getContextModules(); + //const contextModuleProviders = contextModules.map(a => a.context.Provider); + //const CombinedContextProvider = Compose(contextModuleProviders); return ( - - - + ); + + /*return ( + + + + );*/ } diff --git a/platform/viewer/src/routes/buildModeRoutes.js b/platform/viewer/src/routes/buildModeRoutes.js index 22187e3c2..9490a7b27 100644 --- a/platform/viewer/src/routes/buildModeRoutes.js +++ b/platform/viewer/src/routes/buildModeRoutes.js @@ -1,6 +1,6 @@ -import { React } from 'react'; +import React from 'react'; import ModeRoute from './ModeRoute'; -import ViewModelProvider from './ViewModelContext'; +import { ViewModelProvider } from './ViewModelContext'; /* Routes uniquely define an entry point to: @@ -26,16 +26,22 @@ export default function buildModeRoutes(modes, extensionManager) { const routes = []; // TODO: Build api for this. - const dataSources = extensionManager.getDataSource(); + // Currently builds an endpoint for all data sources, which probably + // doesn't make sense + const dataSources = Object.keys(extensionManager.dataSourceMap).map(a => + extensionManager.getDataSource(a) + ); modes.forEach(mode => { dataSources.forEach(dataSource => { - const dataSourceId = dataSource.id; + // TODO: name vs id + const dataSourceId = dataSource.name; const path = `/${mode.id}/${dataSourceId}`; - const component = ( + const component = ({ location }) => (