Continue the ModeRoute work. Routes are reachable, but extensionManager needs to be improve to provide module entries correctly

This commit is contained in:
Erik Ziegler 2020-05-09 10:57:52 +02:00 committed by James A. Petts
parent 20dd83e702
commit 8acd744710
9 changed files with 65 additions and 23 deletions

View File

@ -6,7 +6,7 @@ export default function() {
return [ return [
// Layout Template Definition // Layout Template Definition
{ {
name: 'myLayout', id: 'org.ohif.defaults.viewerLayout',
component: viewerLayout, component: viewerLayout,
}, },
]; ];

View File

@ -8,10 +8,16 @@ function getSidePanelModule() {
return [ return [
{ {
name: 'org.ohif.defaults.seriesList', name: 'org.ohif.defaults.seriesList',
iconName: 'group-layers',
iconLabel: 'Studies',
label: 'Studies',
component: helloWorldComponent, component: helloWorldComponent,
}, },
{ {
name: 'org.ohif.defaults.measure', name: 'org.ohif.defaults.measure',
iconName: 'list-bullets',
iconLabel: 'Measure',
label: 'Measurements',
component: helloWorldComponent, component: helloWorldComponent,
}, },
]; ];

View File

@ -21,7 +21,7 @@ export default function mode({ modeConfiguration }) {
}, },
layoutTemplate: ({ routeProps }) => { layoutTemplate: ({ routeProps }) => {
return { return {
id: 'org.ohif.defaults.viewerlayout', id: 'org.ohif.defaults.viewerLayout',
props: { props: {
// named slots // named slots
leftPanels: ['org.ohif.defaults.seriesList'], leftPanels: ['org.ohif.defaults.seriesList'],
@ -35,3 +35,5 @@ export default function mode({ modeConfiguration }) {
sopClassHandlers: ['org.ohif.defaults.stack'], sopClassHandlers: ['org.ohif.defaults.stack'],
}; };
} }
window.exampleMode = mode({});

View File

@ -97,7 +97,7 @@ export default class ExtensionManager {
}); });
extensionModule.forEach(element => { extensionModule.forEach(element => {
this.modulesMap[`${extensionId}.${moduleType}.${name}`]; this.modulesMap[`${extensionId}.${moduleType}.${element.name}`];
}); });
} }
}); });
@ -111,6 +111,7 @@ export default class ExtensionManager {
} }
getDataSource(dataSourceId) { getDataSource(dataSourceId) {
// Note: this currently uses the data source name, which feels weird...
return this.dataSourceMap[dataSourceId]; return this.dataSourceMap[dataSourceId];
} }
@ -163,11 +164,11 @@ export default class ExtensionManager {
break; break;
} }
case 'dataSourcesModule': { case 'dataSourcesModule': {
break;
extensionModule.forEach(element => { extensionModule.forEach(element => {
this.dataSourceMap[extensionModule.name] = element; this.dataSourceMap[element.name] = element;
}); });
break;
} }
default: default:
// code block // code block

View File

@ -1,7 +1,7 @@
window.config = { window.config = {
routerBasename: '/', routerBasename: '/',
// whiteLabelling: {}, // whiteLabelling: {},
extensions: [], extensions: ['org.ohif.default'],
modes: [], modes: [],
showStudyList: true, showStudyList: true,
// filterQueryParam: false, // filterQueryParam: false,

View File

@ -9,6 +9,9 @@ import { ThemeWrapper } from '@ohif/ui';
import createRoutes from './routes'; import createRoutes from './routes';
import appInit from './appInit.js'; import appInit from './appInit.js';
// Temporarily for testing
import '@ohif/mode-example';
/** /**
* ENV Variable to determine routing behavior * ENV Variable to determine routing behavior
*/ */

View File

@ -64,6 +64,11 @@ function appInit(appConfigOrFunc, defaultExtensions) {
const { modes } = appConfig; const { modes } = appConfig;
// Temporarily for testing
if (!modes.length) {
modes.push(window.exampleMode);
}
const appRoutes = buildModeRoutes(modes, extensionManager) || []; const appRoutes = buildModeRoutes(modes, extensionManager) || [];
return { return {

View File

@ -18,15 +18,23 @@ export default function ModeRoute({
// Deal with toolbar. // Deal with toolbar.
// Only handling one route per mode for now // Only handling one route per mode for now
const LayoutComponent = extensionManager.getModuleEntry( const layoutTemplateData = routes[0].layoutTemplate({ location });
routes[0].layoutTemplate /*const LayoutComponent = extensionManager.getModuleEntry(
layoutTemplateData.id
);*/
// You can test via http://localhost:3000/example-mode/dicomweb
const LayoutComponent = () => (
<div>
{`Reached the route for Mode: ${mode.id} and Data Source: ${dataSourceId}`}
</div>
); );
// Add SOPClassHandlers to a new SOPClassManager. // Add SOPClassHandlers to a new SOPClassManager.
const manager = new SOPClassHandlerManager( /*const manager = new SOPClassHandlerManager(
extensionManager, extensionManager,
sopClassHandlers sopClassHandlers
); );*/
const queryParams = location.search; const queryParams = location.search;
@ -38,16 +46,27 @@ export default function ModeRoute({
const onUpdatedCallback = () => { const onUpdatedCallback = () => {
// TODO: This should append, not create from scratch so we don't nuke existing display sets // TODO: This should append, not create from scratch so we don't nuke existing display sets
// when e.g. a new series arrives // when e.g. a new series arrives
manager.createDisplaySets.then(setDisplaySetInstanceUids); //manager.createDisplaySets.then(setDisplaySetInstanceUids);
}; };
const contextModules = extensions.getContextModules(); // TODO: For each extension, look up their context modules
const contextModuleProviders = contextModules.map(a => a.context.Provider); //const contextModules = extensions.getContextModules();
const CombinedContextProvider = Compose(contextModuleProviders); //const contextModuleProviders = contextModules.map(a => a.context.Provider);
//const CombinedContextProvider = Compose(contextModuleProviders);
return ( return (
<CombinedContextProvider> <LayoutComponent
<LayoutComponent displaySetInstanceUids={displaySetInstanceUids} /> displaySetInstanceUids={displaySetInstanceUids}
</CombinedContextProvider> {...layoutTemplateData.props}
/>
); );
/*return (
<CombinedContextProvider>
<LayoutComponent
displaySetInstanceUids={displaySetInstanceUids}
{...layoutTemplateData.props}
/>
</CombinedContextProvider>
);*/
} }

View File

@ -1,6 +1,6 @@
import { React } from 'react'; import React from 'react';
import ModeRoute from './ModeRoute'; import ModeRoute from './ModeRoute';
import ViewModelProvider from './ViewModelContext'; import { ViewModelProvider } from './ViewModelContext';
/* /*
Routes uniquely define an entry point to: Routes uniquely define an entry point to:
@ -26,16 +26,22 @@ export default function buildModeRoutes(modes, extensionManager) {
const routes = []; const routes = [];
// TODO: Build api for this. // 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 => { modes.forEach(mode => {
dataSources.forEach(dataSource => { dataSources.forEach(dataSource => {
const dataSourceId = dataSource.id; // TODO: name vs id
const dataSourceId = dataSource.name;
const path = `/${mode.id}/${dataSourceId}`; const path = `/${mode.id}/${dataSourceId}`;
const component = ( const component = ({ location }) => (
<ViewModelProvider> <ViewModelProvider>
<ModeRoute <ModeRoute
location={location}
mode={mode} mode={mode}
dataSourceId={dataSourceId} dataSourceId={dataSourceId}
extensionManager={extensionManager} extensionManager={extensionManager}