routes config for Modes
This commit is contained in:
parent
a5e3f27cfd
commit
cd7ed9ee9a
68
platform/viewer/src/routes/ModeRoute.js
Normal file
68
platform/viewer/src/routes/ModeRoute.js
Normal file
@ -0,0 +1,68 @@
|
||||
export default function ModeRoute(mode, dataSourceId) {
|
||||
const [displaySets, setDisplaySets] = useState([]);
|
||||
const { routes, sopClassHandlers, extensions } = getMode(modeId);
|
||||
|
||||
// Deal with toolbar.
|
||||
|
||||
// Only handling one route per mode for now
|
||||
const LayoutComponent = routes[0].layoutTemplate;
|
||||
|
||||
// Add SOPClassHandlers to a new SOPClassManager.
|
||||
const manager = new SOPClassHandlerManager(sopClassHandlers);
|
||||
|
||||
const dataSource = getDataSource(dataSourceId);
|
||||
const queryParams = location.search;
|
||||
|
||||
// Call the data source to start building the view model?
|
||||
dataSource(queryParams);
|
||||
|
||||
metadataStore.onModified();
|
||||
|
||||
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(setDisplaySets);
|
||||
};
|
||||
|
||||
// TODO: Should extensions provide an array of these or one nested context?
|
||||
const contextModules = extensions.getContextModules();
|
||||
const ExtensionContexts = contextModules => {};
|
||||
|
||||
/*
|
||||
TODO: How are contexts provided by extensions passed into the mode?
|
||||
|
||||
return (
|
||||
<ExtensionContexts>
|
||||
<LayoutComponent displaySets={displaySets} setDisplaySets={setDisplaySets}/>
|
||||
</ExtensionContexts>
|
||||
);*/
|
||||
|
||||
return <LayoutComponent displaySetInstanceUids={displaySetInstanceUids} />;
|
||||
}
|
||||
|
||||
/*const ViewModelContext = React.createContext(
|
||||
displaySets: [],
|
||||
setDisplaySets: () => {}
|
||||
);
|
||||
|
||||
|
||||
class ViewModelProvider extends Component {
|
||||
state = {
|
||||
displaySets: []
|
||||
};
|
||||
|
||||
const setDisplaySets = displaySets => {
|
||||
this.setState({displaySets});
|
||||
};
|
||||
|
||||
render() {
|
||||
return (
|
||||
<ViewModelContext.Provider value={
|
||||
displaySets: this.state.displaySets,
|
||||
setDisplaySets
|
||||
}>
|
||||
{this.props.children}
|
||||
</ViewModelContext.Provider>
|
||||
);
|
||||
}
|
||||
}*/
|
||||
27
platform/viewer/src/routes/SOPClassHandlerManager.js
Normal file
27
platform/viewer/src/routes/SOPClassHandlerManager.js
Normal file
@ -0,0 +1,27 @@
|
||||
export default class SOPClassHandlerManager {
|
||||
constructor(sopClassHandlerIds) {
|
||||
this.SOPClassHandlers = sopClassHandlerIds.map(getSOPClassHandler);
|
||||
}
|
||||
|
||||
async createDisplaySets() {
|
||||
const SOPClassHandlers = this.SOPClassHandlers;
|
||||
|
||||
const displaySets = [];
|
||||
|
||||
// TODO
|
||||
StudyMetadata.forEachSeries(series => {
|
||||
for (let i = 0; i < SOPClassHandlers.length; i++) {
|
||||
const handler = SOPClassHandlers[i];
|
||||
|
||||
// TODO: This step is still unclear to me
|
||||
const displaySet = handler(series);
|
||||
|
||||
if (displaySet) {
|
||||
displaySets.push(displaySet);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
return displaySets;
|
||||
}
|
||||
}
|
||||
46
platform/viewer/src/routes/buildModeRoutes.js
Normal file
46
platform/viewer/src/routes/buildModeRoutes.js
Normal file
@ -0,0 +1,46 @@
|
||||
import { React } from 'react';
|
||||
import ModeRoute from './ModeRoute';
|
||||
|
||||
/*
|
||||
Routes uniquely define an entry point to:
|
||||
- A mode
|
||||
- Linked to a data source
|
||||
- With a specified data set.
|
||||
|
||||
The full route template is:
|
||||
|
||||
/:modeId/:modeRoute/:sourceType/?queryParameters=example
|
||||
|
||||
Where:
|
||||
:modeId - Is the mode selected.
|
||||
:modeRoute - Is the route within the mode to select.
|
||||
:sourceType - Is the data source identifier, which specifies which DataSource to use.
|
||||
?queryParameters - Are query parameters as defined by data source.
|
||||
|
||||
A default source can be specified at the app level configuration, and then that source is used if :sourceType is omitted:
|
||||
|
||||
/:modeId/:modeRoute/?queryParameters=example
|
||||
*/
|
||||
export default function buildModeRoutes(modes, extensionManager) {
|
||||
const routes = [];
|
||||
|
||||
// TODO: Build api for this.
|
||||
const dataSources = extensionManager.getDataSources();
|
||||
|
||||
modes.forEach(mode => {
|
||||
dataSources.forEach(dataSource => {
|
||||
const dataSourceId = dataSource.id;
|
||||
const path = `/${mode.id}/${dataSourceId}`;
|
||||
|
||||
const component = <ModeRoute mode={mode} dataSourceId={dataSourceId} />;
|
||||
|
||||
routes.push({
|
||||
path,
|
||||
component,
|
||||
exact: true,
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
return routes;
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user