diff --git a/OHIFViewer-react/src/connectedComponents/ViewerMain.js b/OHIFViewer-react/src/connectedComponents/ViewerMain.js
index ba9629cbe..88e30a09d 100644
--- a/OHIFViewer-react/src/connectedComponents/ViewerMain.js
+++ b/OHIFViewer-react/src/connectedComponents/ViewerMain.js
@@ -14,6 +14,11 @@ class ViewerMain extends Component {
studies: PropTypes.array.isRequired
};
+ constructor(props) {
+ super(props);
+ OHIF.hotkeysUtil.setup('viewer');
+ }
+
getDisplaySets(studies) {
const displaySets = [];
studies.forEach((study) => {
@@ -51,7 +56,7 @@ class ViewerMain extends Component {
});
}
- setViewportData = ({viewportIndex, item}) => {
+ setViewportData = ({ viewportIndex, item }) => {
// TODO: Replace this with mapDispatchToProps call
// if we decide to put viewport info into redux
diff --git a/OHIFViewer-react/src/index.js b/OHIFViewer-react/src/index.js
index 79d80ae24..1bdce16a9 100644
--- a/OHIFViewer-react/src/index.js
+++ b/OHIFViewer-react/src/index.js
@@ -8,6 +8,7 @@ import OHIF from 'ohif-core';
import './config';
import ui from './redux/ui.js';
import App from './App.js';
+import { loadState, saveState } from './redux/localStorageState.js';
import OHIFCornerstoneViewportPlugin from "./connectedComponents/OHIFCornerstoneViewportPlugin/OHIFCornerstoneViewportPlugin.js";
//import ConnectedExampleViewportPlugin from './components/ConnectedExampleViewportPlugin.js';
@@ -15,13 +16,20 @@ import OHIFCornerstoneViewportPlugin from "./connectedComponents/OHIFCornerstone
import OHIFDicomPDFViewportPlugin from './connectedComponents/OHIFDicomPDFViewportPlugin/OHIFDicomPDFViewportPlugin.js';
import OHIFDicomPDFSopClassHandlerPlugin from './connectedComponents/OHIFDicomPDFViewportPlugin/OHIFDicomPDFSopClassHandlerPlugin.js';
-const reducers = OHIF.redux.reducers;
+let reducers = OHIF.redux.reducers;
reducers.ui = ui;
reducers.oidc = oidcReducer;
const Icons = '/icons.svg';
-const combined = combineReducers(reducers)
-const store = createStore(combined);
+const combined = combineReducers(reducers);
+const store = createStore(combined, loadState());
+
+// Subscribing store to save state of persistable data
+store.subscribe(() => {
+ saveState({
+ preferences: store.getState().preferences,
+ });
+});
// Note: Run your build like this:
// REACT_APP_CONFIG=$(cat ../config-react/ccc.json) yarn start
@@ -61,69 +69,69 @@ if (config && config.servers) {
}
const defaultButtons = [
- {
- command: 'StackScroll',
- type: 'tool',
- text: 'Stack Scroll',
- svgUrl: `${Icons}#icon-tools-stack-scroll`,
- active: false
- },
- {
- command: 'Zoom',
- type: 'tool',
- text: 'Zoom',
- svgUrl: `${Icons}#icon-tools-zoom`,
- active: false
- },
- {
- command: 'Wwwc',
- type: 'tool',
- text: 'Levels',
- svgUrl: `${Icons}#icon-tools-levels`,
- active: true
- },
- {
- command: 'Pan',
- type: 'tool',
- text: 'Pan',
- svgUrl: `${Icons}#icon-tools-pan`,
- active: false
- },
- {
- command: 'Length',
- type: 'tool',
- text: 'Length',
- svgUrl: `${Icons}#icon-tools-measure-temp`,
- active: false
- },
- /*{
- command: 'Annotate',
- type: 'tool',
- text: 'Annotate',
- svgUrl: `${Icons}#icon-tools-measure-non-target`,
- active: false
- },*/
- {
- command: 'Angle',
- type: 'tool',
- text: 'Angle',
- iconClasses: 'fa fa-angle-left',
- active: false
- },
- {
- command: 'Bidirectional',
- type: 'tool',
- text: 'Bidirectional',
- svgUrl: `${Icons}#icon-tools-measure-target`,
- active: false
- },
- {
- command: 'reset',
- type: 'command',
- text: 'Reset',
- svgUrl: `${Icons}#icon-tools-reset`,
- active: false
- },
+ {
+ command: 'StackScroll',
+ type: 'tool',
+ text: 'Stack Scroll',
+ svgUrl: `${Icons}#icon-tools-stack-scroll`,
+ active: false
+ },
+ {
+ command: 'Zoom',
+ type: 'tool',
+ text: 'Zoom',
+ svgUrl: `${Icons}#icon-tools-zoom`,
+ active: false
+ },
+ {
+ command: 'Wwwc',
+ type: 'tool',
+ text: 'Levels',
+ svgUrl: `${Icons}#icon-tools-levels`,
+ active: true
+ },
+ {
+ command: 'Pan',
+ type: 'tool',
+ text: 'Pan',
+ svgUrl: `${Icons}#icon-tools-pan`,
+ active: false
+ },
+ {
+ command: 'Length',
+ type: 'tool',
+ text: 'Length',
+ svgUrl: `${Icons}#icon-tools-measure-temp`,
+ active: false
+ },
+ /*{
+ command: 'Annotate',
+ type: 'tool',
+ text: 'Annotate',
+ svgUrl: `${Icons}#icon-tools-measure-non-target`,
+ active: false
+ },*/
+ {
+ command: 'Angle',
+ type: 'tool',
+ text: 'Angle',
+ iconClasses: 'fa fa-angle-left',
+ active: false
+ },
+ {
+ command: 'Bidirectional',
+ type: 'tool',
+ text: 'Bidirectional',
+ svgUrl: `${Icons}#icon-tools-measure-target`,
+ active: false
+ },
+ {
+ command: 'reset',
+ type: 'command',
+ text: 'Reset',
+ svgUrl: `${Icons}#icon-tools-reset`,
+ active: false
+ },
];
const buttonsAction = OHIF.redux.actions.setAvailableButtons(defaultButtons);
@@ -159,6 +167,36 @@ const pdfPluginAction = OHIF.redux.actions.addPlugin({
component: OHIFDicomPDFViewportPlugin
});
+const servers = {
+ dicomWeb: [
+ {
+ "name": "DCM4CHEE",
+ //"wadoUriRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/wado",
+ //"qidoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs",
+ //"wadoRoot": "http://localhost:8080/dcm4chee-arc/aets/DCM4CHEE/rs",
+ "wadoUriRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/wado",
+ "qidoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
+ "wadoRoot": "https://dcm4che.ohif.club/dcm4chee-arc/aets/DCM4CHEE/rs",
+ // "wadoUriRoot": "https://cancer.crowds-cure.org/dcm4chee-arc/aets/DCM4CHEE/wado",
+ // "qidoRoot": "https://cancer.crowds-cure.org/dcm4chee-arc/aets/DCM4CHEE/rs",
+ // "wadoRoot": "https://cancer.crowds-cure.org/dcm4chee-arc/aets/DCM4CHEE/rs",
+ "qidoSupportsIncludeField": true,
+ "imageRendering": "wadors",
+ "thumbnailRendering": "wadors",
+ "requestOptions": {
+ "requestFromBrowser": true,
+ "logRequests": true,
+ "logResponses": false,
+ "logTiming": true,
+ //"auth": "admin:admin"
+ //"auth": "cloud:healthcare"
+ }
+ }
+ ]
+};
+
+OHIF.utils.addServers(servers, store);
+
const pdfPluginActionSopClass = OHIF.redux.actions.addPlugin({
id: 'pdf_sopClassHandler',
type: PLUGIN_TYPES.SOP_CLASS_HANDLER,
@@ -177,7 +215,7 @@ if (userManager) {
-
+
,
@@ -186,9 +224,9 @@ if (userManager) {
} else {
ReactDOM.render(
-
-
-
+
+
+
,
document.getElementById('root')
);
diff --git a/OHIFViewer-react/src/redux/actions.js b/OHIFViewer-react/src/redux/actions.js
index 9ae04a9fd..0860e5756 100644
--- a/OHIFViewer-react/src/redux/actions.js
+++ b/OHIFViewer-react/src/redux/actions.js
@@ -8,9 +8,15 @@ export const setRightSidebarOpen = state => ({
state
});
+export const setUserPreferencesModalOpen = state => ({
+ type: 'SET_USER_PREFERENCES_MODAL_OPEN',
+ state
+});
+
const actions = {
setLeftSidebarOpen,
- setRightSidebarOpen
+ setRightSidebarOpen,
+ setUserPreferencesModalOpen
};
export default actions;
diff --git a/OHIFViewer-react/src/redux/localStorageState.js b/OHIFViewer-react/src/redux/localStorageState.js
new file mode 100644
index 000000000..d54967324
--- /dev/null
+++ b/OHIFViewer-react/src/redux/localStorageState.js
@@ -0,0 +1,21 @@
+export const loadState = () => {
+ try {
+ const serializedState = window.localStorage.getItem('state');
+ if (!serializedState) {
+ return undefined;
+ }
+
+ return JSON.parse(serializedState)
+ } catch (e) {
+ return undefined;
+ }
+}
+
+export const saveState = (state) => {
+ try {
+ const serializedState = JSON.stringify(state);
+ localStorage.setItem('state', serializedState);
+ } catch (e) {
+ console.warn(e);
+ }
+}
\ No newline at end of file
diff --git a/OHIFViewer-react/src/redux/ui.js b/OHIFViewer-react/src/redux/ui.js
index 01b558288..f5d83e573 100644
--- a/OHIFViewer-react/src/redux/ui.js
+++ b/OHIFViewer-react/src/redux/ui.js
@@ -1,6 +1,7 @@
const defaultState = {
leftSidebarOpen: true,
rightSidebarOpen: false,
+ userPreferencesModalOpen: false
}
const ui = (state = defaultState, action) => {
@@ -9,6 +10,8 @@ const ui = (state = defaultState, action) => {
return Object.assign({}, state, { leftSidebarOpen: action.state });
case 'SET_RIGHT_SIDEBAR_OPEN':
return Object.assign({}, state, { rightSidebarOpen: action.state });
+ case 'SET_USER_PREFERENCES_MODAL_OPEN':
+ return Object.assign({}, state, { userPreferencesModalOpen: action.state });
default:
return state;
}
diff --git a/OHIFViewer-react/src/studylist/StudyListWithData.js b/OHIFViewer-react/src/studylist/StudyListWithData.js
index 018f06906..f111da13e 100644
--- a/OHIFViewer-react/src/studylist/StudyListWithData.js
+++ b/OHIFViewer-react/src/studylist/StudyListWithData.js
@@ -2,8 +2,8 @@ import React, { Component } from "react";
import PropTypes from "prop-types";
import OHIF from 'ohif-core';
import { withRouter } from 'react-router-dom';
-import { StudyList } from "react-viewerbase";
-import Header from "../components/Header";
+import { StudyList } from 'react-viewerbase';
+import ConnectedHeader from "../components/Header/ConnectedHeader";
class StudyListWithData extends Component {
state = {
@@ -96,7 +96,7 @@ class StudyListWithData extends Component {
const studyCount = this.state.studies ? this.state.studies.length : 0;
return (<>
-
+
=11.0.0:
- version "13.1.0"
- resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-13.1.0.tgz#fa7356f0cc8111d0f1077cb7800d06f22f1d66c7"
- integrity sha512-C2Kp0qNuopw0smXFaHeayvharqF3kkcNqlcIlSX71+3XrsOFwkEPLt/9f5JksMmaul2JZYIQuY+WTpqHpQQcLg==
+ version "13.2.0"
+ resolved "https://registry.yarnpkg.com/jsdom/-/jsdom-13.2.0.tgz#b1a0dbdadc255435262be8ea3723d2dba0d7eb3a"
+ integrity sha512-cG1NtMWO9hWpqRNRR3dSvEQa8bFI6iLlqU2x4kwX51FQjp0qus8T9aBaAO6iGp3DeBrhdwuKxckknohkmfvsFw==
dependencies:
abab "^2.0.0"
acorn "^6.0.4"
@@ -6284,7 +6293,7 @@ jsdom@>=11.0.0:
pn "^1.1.0"
request "^2.88.0"
request-promise-native "^1.0.5"
- saxes "^3.1.4"
+ saxes "^3.1.5"
symbol-tree "^3.2.2"
tough-cookie "^2.5.0"
w3c-hr-time "^1.0.1"
@@ -7194,9 +7203,9 @@ mkdirp@0.5.1, mkdirp@0.5.x, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1, mkdi
minimist "0.0.8"
moment@^2.22.2, moment@^2.23.0:
- version "2.23.0"
- resolved "https://registry.yarnpkg.com/moment/-/moment-2.23.0.tgz#759ea491ac97d54bac5ad776996e2a58cc1bc225"
- integrity sha512-3IE39bHVqFbWWaPOMHZF98Q9c3LDKGTmypMiTM2QygGXXElkFWIH7GxfmlwmY2vwa+wmNsoYZmG2iusf1ZjJoA==
+ version "2.24.0"
+ resolved "https://registry.yarnpkg.com/moment/-/moment-2.24.0.tgz#0d055d53f5052aa653c9f6eb68bb5d12bf5c2b5b"
+ integrity sha512-bV7f+6l2QigeBBZSM/6yTNq4P2fNpSWj/0e7jQcy87A8e7o2nAfP/34/2ky5Vw4B9S446EtIhodAzkFCcR4dQg==
move-concurrently@^1.0.1:
version "1.0.1"
@@ -7814,10 +7823,10 @@ obuf@^1.0.0, obuf@^1.1.2:
resolved "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz#09bea3343d41859ebd446292d11c9d4db619084e"
integrity sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==
-ohif-core@^0.1.7:
- version "0.1.7"
- resolved "https://registry.yarnpkg.com/ohif-core/-/ohif-core-0.1.7.tgz#81f49f142d40338a3839f06c849aace675847002"
- integrity sha512-VXnpaw4VjKBR1P9tSB2ZGLpXYXwdbmL0oZ7P+bbKKOh2Q+8An4E9lTiKpUlUoxaf/HiTZIUQ/2Cjp7qJe88FDg==
+ohif-core@^0.1.7, ohif-core@^0.1.8:
+ version "0.1.8"
+ resolved "https://registry.yarnpkg.com/ohif-core/-/ohif-core-0.1.8.tgz#af0ff273e9ad3096d5d98187191a336e08e72f93"
+ integrity sha512-e5fIKDHOfVaYkrkKFjyqhad/vP7D2ynn2q77mNFMAX49Lo5y/WgXiXytJTeaXNJzksnzTQquOxA93XAh8viuWg==
dependencies:
"@babel/runtime" "^7.2.0"
dicomweb-client "^0.4.1"
@@ -8136,9 +8145,9 @@ param-case@2.1.x:
no-case "^2.2.0"
parse-asn1@^5.0.0:
- version "5.1.2"
- resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.2.tgz#13efbaaac8da669a9751a6b50a7cfccfdef756ae"
- integrity sha512-zVAb35DsNvwINEA7EEK+78YoNDGRpYEAGoIl3bSHyI9OU4IIrrrU5DC4xaCLZ42gvOfQg1+wS778WbJW+mCMCQ==
+ version "5.1.3"
+ resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.3.tgz#1600c6cc0727365d68b97f3aa78939e735a75204"
+ integrity sha512-VrPoetlz7B/FqjBLD2f5wBVZvsZVLnRUrxVLfRYhGXCODa/NWE4p3Wp+6+aV3ZPL3KM7/OZmxDIwwijD7yuucg==
dependencies:
asn1.js "^4.0.0"
browserify-aes "^1.0.0"
@@ -8992,10 +9001,10 @@ postcss@^6.0.1, postcss@^6.0.23:
source-map "^0.6.1"
supports-color "^5.4.0"
-postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.11, postcss@^7.0.2, postcss@^7.0.5:
- version "7.0.13"
- resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.13.tgz#42bf716413e8f1c786ab71dc6e722b3671b16708"
- integrity sha512-h8SY6kQTd1wISHWjz+E6cswdhMuyBZRb16pSTv3W4zYZ3/YbyWeJdNUeOXB5IdZqE1U76OUEjjjqsC3z2f3hVg==
+postcss@^7.0.0, postcss@^7.0.1, postcss@^7.0.13, postcss@^7.0.2, postcss@^7.0.5:
+ version "7.0.14"
+ resolved "https://registry.yarnpkg.com/postcss/-/postcss-7.0.14.tgz#4527ed6b1ca0d82c53ce5ec1a2041c2346bbd6e5"
+ integrity sha512-NsbD6XUUMZvBxtQAJuWDJeeC4QFsmWsfozWxCJPWf3M55K9iu2iMDaKqyoOdTJ1R4usBXuxlVFAIo8rZPQD4Bg==
dependencies:
chalk "^2.4.2"
source-map "^0.6.1"
@@ -9017,9 +9026,9 @@ preserve@^0.2.0:
integrity sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=
prettier@^1.14.2:
- version "1.15.3"
- resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.15.3.tgz#1feaac5bdd181237b54dbe65d874e02a1472786a"
- integrity sha512-gAU9AGAPMaKb3NNSUUuhhFAS7SCO4ALTN4nRIn6PJ075Qd28Yn2Ig2ahEJWdJwJmlEBTUfC7mMUSFy8MwsOCfg==
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/prettier/-/prettier-1.16.1.tgz#534c2c9d7853f8845e5e078384e71973bd74089f"
+ integrity sha512-XXUITwIkGb3CPJ2hforHah/zTINRyie5006Jd2HKy2qz7snEJXl0KLfsJZW/wst9g6R2rFvqba3VpNYdu1hDcA==
pretty-bytes@^4.0.2:
version "4.0.2"
@@ -9416,7 +9425,7 @@ react-error-overlay@^5.1.2:
resolved "https://registry.yarnpkg.com/react-error-overlay/-/react-error-overlay-5.1.2.tgz#888957b884d4b25b083a82ad550f7aad96585394"
integrity sha512-7kEBKwU9R8fKnZJBRa5RSIfay4KJwnYvKB6gODGicUmDSAhQJ7Tdnll5S0RLtYrzRfMVXlqYw61rzrSpP4ThLQ==
-react-is@^16.3.2, react-is@^16.6.3:
+react-is@^16.3.2, react-is@^16.6.3, react-is@^16.7.0:
version "16.7.0"
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.7.0.tgz#c1bd21c64f1f1364c6f70695ec02d69392f41bfa"
integrity sha512-Z0VRQdF4NPDoI0tsXVMLkJLiwEBa+RP66g0xDHxgxysxSoCUccSten4RTF/UFvZF1dZvZ9Zu1sx+MDXwcOR34g==
@@ -9540,10 +9549,10 @@ react-transition-group@^2.0.0, react-transition-group@^2.2.0:
prop-types "^15.6.2"
react-lifecycles-compat "^3.0.4"
-react-viewerbase@^0.2.1:
- version "0.2.1"
- resolved "https://registry.yarnpkg.com/react-viewerbase/-/react-viewerbase-0.2.1.tgz#1c7f1927e47ea5efd80ebe457eba7c95f485726d"
- integrity sha512-nDT1fIZ0HHgNf+GicvkuF9ZqSvkFjW8BHTMUnKkjW6rPPKUQ+zdAGQn4PyU1TH+rtfj67sqO6t1p0ekXX1nNgQ==
+react-viewerbase@^0.2.1, react-viewerbase@^0.2.2:
+ version "0.2.2"
+ resolved "https://registry.yarnpkg.com/react-viewerbase/-/react-viewerbase-0.2.2.tgz#b77d341c0dbb4efd4a63b1ae696ffd32668cb0e0"
+ integrity sha512-92x9Miraln+n3vtDLByT/2OUh6m4LdayZPrWIWy6Jw400H96x3JmuTFAC/ebYaQLllbns6AKVI0u6EXWjtQocg==
dependencies:
"@babel/runtime" "^7.2.0"
classnames "^2.2.6"
@@ -9834,6 +9843,15 @@ regex-not@^1.0.0, regex-not@^1.0.2:
extend-shallow "^3.0.2"
safe-regex "^1.1.0"
+regexp-tree@^0.1.0:
+ version "0.1.0"
+ resolved "https://registry.yarnpkg.com/regexp-tree/-/regexp-tree-0.1.0.tgz#a56ad7746097888ea16457479029ec9345b96ab0"
+ integrity sha512-rHQv+tzu+0l3KS/ERabas1yK49ahNVxuH40WcPg53CzP5p8TgmmyBgHELLyJcvjhTD0e5ahSY6C76LbEVtr7cg==
+ dependencies:
+ cli-table3 "^0.5.0"
+ colors "^1.1.2"
+ yargs "^10.0.3"
+
regexpp@^2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f"
@@ -10059,20 +10077,13 @@ resolve@1.8.1:
dependencies:
path-parse "^1.0.5"
-resolve@^1.1.6:
+resolve@^1.1.6, resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1:
version "1.10.0"
resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.10.0.tgz#3bdaaeaf45cc07f375656dfd2e54ed0810b101ba"
integrity sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==
dependencies:
path-parse "^1.0.6"
-resolve@^1.3.2, resolve@^1.5.0, resolve@^1.6.0, resolve@^1.8.1:
- version "1.9.0"
- resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.9.0.tgz#a14c6fdfa8f92a7df1d996cb7105fa744658ea06"
- integrity sha512-TZNye00tI67lwYvzxCxHGjwTNlUV70io54/Ed4j6PscB8xVfuBJpRenI/o6dVk0cY0PYTY27AgCoGGxRnYuItQ==
- dependencies:
- path-parse "^1.0.6"
-
restore-cursor@^2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf"
@@ -10207,7 +10218,7 @@ sax@^1.2.4, sax@~1.2.4:
resolved "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz#2816234e2378bddc4e5354fab5caa895df7100d9"
integrity sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==
-saxes@^3.1.4:
+saxes@^3.1.5:
version "3.1.6"
resolved "https://registry.yarnpkg.com/saxes/-/saxes-3.1.6.tgz#2d948a47b54918516c5a64096f08865deb5bd8cd"
integrity sha512-LAYs+lChg1v5uKNzPtsgTxSS5hLo8aIhSMCJt1WMpefAxm3D1RTpMwSpb6ebdL31cubiLTnhokVktBW+cv9Y9w==
@@ -10707,9 +10718,9 @@ sprintf-js@~1.0.2:
integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=
sshpk@^1.7.0:
- version "1.16.0"
- resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.0.tgz#1d4963a2fbffe58050aa9084ca20be81741c07de"
- integrity sha512-Zhev35/y7hRMcID/upReIvRse+I9SVhyVre/KTJSJQWMz3C3+G+HpO7m1wK/yckEtujKZ7dS4hkVxAnmHaIGVQ==
+ version "1.16.1"
+ resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz#fb661c0bef29b39db40769ee39fa70093d6f6877"
+ integrity sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==
dependencies:
asn1 "~0.2.3"
assert-plus "^1.0.0"
@@ -10769,9 +10780,9 @@ stealthy-require@^1.1.0:
integrity sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=
stream-browserify@^2.0.1:
- version "2.0.1"
- resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.1.tgz#66266ee5f9bdb9940a4e4514cafb43bb71e5c9db"
- integrity sha1-ZiZu5fm9uZQKTkUUyvtDu3Hlyds=
+ version "2.0.2"
+ resolved "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz#87521d38a44aa7ee91ce1cd2a47df0cb49dd660b"
+ integrity sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==
dependencies:
inherits "~2.0.1"
readable-stream "^2.0.2"
@@ -12023,7 +12034,7 @@ wrappy@1, wrappy@~1.0.2:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=
-write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
+write-file-atomic@^2.0.0, write-file-atomic@^2.1.0, write-file-atomic@^2.3.0:
version "2.4.2"
resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.4.2.tgz#a7181706dfba17855d221140a9c06e15fcdd87b9"
integrity sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==
@@ -12032,15 +12043,6 @@ write-file-atomic@^2.0.0, write-file-atomic@^2.3.0:
imurmurhash "^0.1.4"
signal-exit "^3.0.2"
-write-file-atomic@^2.1.0:
- version "2.3.0"
- resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.3.0.tgz#1ff61575c2e2a4e8e510d6fa4e243cce183999ab"
- integrity sha512-xuPeK4OdjWqtfi59ylvVL0Yn35SF3zgcAcv7rBPFHVaEapaDr4GdGgm3j7ckTwH9wHL7fGmgfAnb0+THrHb8tA==
- dependencies:
- graceful-fs "^4.1.11"
- imurmurhash "^0.1.4"
- signal-exit "^3.0.2"
-
write@^0.2.1:
version "0.2.1"
resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757"
@@ -12056,9 +12058,9 @@ ws@^5.2.0:
async-limiter "~1.0.0"
ws@^6.1.2:
- version "6.1.2"
- resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.2.tgz#3cc7462e98792f0ac679424148903ded3b9c3ad8"
- integrity sha512-rfUqzvz0WxmSXtJpPMX2EeASXabOrSMk1ruMOV3JBTBjo4ac2lDjGGsbQSyxj8Odhw5fBib8ZKEjDNvgouNKYw==
+ version "6.1.3"
+ resolved "https://registry.yarnpkg.com/ws/-/ws-6.1.3.tgz#d2d2e5f0e3c700ef2de89080ebc0ac6e1bf3a72d"
+ integrity sha512-tbSxiT+qJI223AP4iLfQbkbxkwdFcneYinM2+x46Gx2wgvbaOMO36czfdfVUBRTHvzAMRhDd98sA5d/BuWbQdg==
dependencies:
async-limiter "~1.0.0"
@@ -12114,6 +12116,13 @@ yargs-parser@^10.1.0:
dependencies:
camelcase "^4.1.0"
+yargs-parser@^8.1.0:
+ version "8.1.0"
+ resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-8.1.0.tgz#f1376a33b6629a5d063782944da732631e966950"
+ integrity sha512-yP+6QqN8BmrgW2ggLtTbdrOyBNSI7zBa4IykmiV5R1wl1JWNxQvWhMfMdmzIYtKU7oP3OOInY/tl2ov3BDjnJQ==
+ dependencies:
+ camelcase "^4.1.0"
+
yargs-parser@^9.0.2:
version "9.0.2"
resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-9.0.2.tgz#9ccf6a43460fe4ed40a9bb68f48d43b8a68cc077"
@@ -12139,6 +12148,24 @@ yargs@12.0.2:
y18n "^3.2.1 || ^4.0.0"
yargs-parser "^10.1.0"
+yargs@^10.0.3:
+ version "10.1.2"
+ resolved "https://registry.yarnpkg.com/yargs/-/yargs-10.1.2.tgz#454d074c2b16a51a43e2fb7807e4f9de69ccb5c5"
+ integrity sha512-ivSoxqBGYOqQVruxD35+EyCFDYNEFL/Uo6FcOnz+9xZdZzK0Zzw4r4KhbrME1Oo2gOggwJod2MnsdamSG7H9ig==
+ dependencies:
+ cliui "^4.0.0"
+ decamelize "^1.1.1"
+ find-up "^2.1.0"
+ get-caller-file "^1.0.1"
+ os-locale "^2.0.0"
+ require-directory "^2.1.1"
+ require-main-filename "^1.0.1"
+ set-blocking "^2.0.0"
+ string-width "^2.0.0"
+ which-module "^2.0.0"
+ y18n "^3.2.1"
+ yargs-parser "^8.1.0"
+
yargs@^11.0.0:
version "11.1.0"
resolved "https://registry.yarnpkg.com/yargs/-/yargs-11.1.0.tgz#90b869934ed6e871115ea2ff58b03f4724ed2d77"
diff --git a/Packages-react/ohif-viewer/src/App.js b/Packages-react/ohif-viewer/src/App.js
index 1e25facbd..3de42f6e5 100644
--- a/Packages-react/ohif-viewer/src/App.js
+++ b/Packages-react/ohif-viewer/src/App.js
@@ -13,7 +13,7 @@ import OHIFDicomPDFViewportPlugin from './connectedComponents/OHIFDicomPDFViewpo
import OHIFDicomPDFSopClassHandlerPlugin from './connectedComponents/OHIFDicomPDFViewportPlugin/OHIFDicomPDFSopClassHandlerPlugin.js';
import DicomMicroscopySopClassHandlerPlugin from './connectedComponents/DicomMicroscopyPlugin/DicomMicroscopySopClassHandlerPlugin.js';
import DicomMicroscopyViewport from './connectedComponents/DicomMicroscopyPlugin/DicomMicroscopyViewport.js';
-
+import { loadState, saveState } from './redux/localStorageState.js';
import {
loadUser,
OidcProvider,
@@ -26,13 +26,18 @@ import cornerstoneWADOImageLoader from 'cornerstone-wado-image-loader';
const Icons = '/icons.svg';
-const reducers = OHIF.redux.reducers;
+let reducers = OHIF.redux.reducers;
reducers.ui = ui;
reducers.oidc = oidcReducer;
const combined = combineReducers(reducers);
+const store = createStore(combined, loadState());
-const store = createStore(combined);
+store.subscribe(() => {
+ saveState({
+ preferences: store.getState().preferences
+ });
+});
const defaultButtons = [
{
@@ -206,7 +211,9 @@ class App extends Component {
static propTypes = {
servers: PropTypes.object,
oidc: PropTypes.array,
- routerBasename: PropTypes.string
+ routerBasename: PropTypes.string,
+ userManager: PropTypes.object,
+ location: PropTypes.object
};
static defaultProps = {
diff --git a/Packages-react/ohif-viewer/src/components/Header/Header.js b/Packages-react/ohif-viewer/src/components/Header/Header.js
index 2c787248e..014a8b704 100644
--- a/Packages-react/ohif-viewer/src/components/Header/Header.js
+++ b/Packages-react/ohif-viewer/src/components/Header/Header.js
@@ -1,61 +1,84 @@
-import React from 'react';
+import React, { Component } from 'react';
import PropTypes from 'prop-types';
import { Link, withRouter } from 'react-router-dom';
import { Dropdown } from 'react-viewerbase';
import './Header.css';
-import list from './HeaderMenuList.json';
import OHIFLogo from '../OHIFLogo/OHIFLogo.js';
+import ConnectedUserPreferencesModal from '../../connectedComponents/ConnectedUserPreferencesModal.js';
//import Icons from "../../images/icons.svg";
//const Icons = '/icons.svg';
-function Header({ home, location, children }) {
- const { state } = location;
+class Header extends Component {
+ static propTypes = {
+ home: PropTypes.bool.isRequired,
+ location: PropTypes.object.isRequired,
+ openUserPreferencesModal: PropTypes.func,
+ children: PropTypes.node
+ };
- if (!children) {
- children = OHIFLogo();
+ static defaultProps = {
+ home: true,
+ children: OHIFLogo()
+ };
+
+ constructor(props) {
+ super(props);
+
+ this.state = {
+ userPreferencesOpen: false
+ };
+
+ this.options = [
+ {
+ title: 'Preferences ',
+ icon: 'fa fa-user',
+ onClick: this.props.openUserPreferencesModal
+ },
+ {
+ title: 'About',
+ icon: 'fa fa-info',
+ link: 'http://ohif.org'
+ }
+ ];
}
- return (
-
-
- {state && state.studyLink && (
-
- Back to Viewer
-
- )}
+ render() {
+ return (
+
+
+ {this.props.location && this.props.location.studyLink && (
+
+ Back to Viewer
+
+ )}
- {children}
+ {this.props.children}
- {!home && (
-
- Study list
-
- )}
+ {!this.props.home && (
+
+ Study list
+
+ )}
+
+
+
+ INVESTIGATIONAL USE ONLY
+
+
+
-
-
- INVESTIGATIONAL USE ONLY
-
-
-
- );
+ );
+ }
}
-Header.propTypes = {
- home: PropTypes.bool.isRequired,
- location: PropTypes.object.isRequired,
- children: PropTypes.node
-};
-
-Header.defaultProps = {
- home: true
-};
-
export default withRouter(Header);
diff --git a/Packages-react/ohif-viewer/src/components/Header/HeaderMenuList.json b/Packages-react/ohif-viewer/src/components/Header/HeaderMenuList.json
deleted file mode 100644
index 7a374fed1..000000000
--- a/Packages-react/ohif-viewer/src/components/Header/HeaderMenuList.json
+++ /dev/null
@@ -1,12 +0,0 @@
-[
- {
- "title": "Preferences",
- "icon": "fa fa-user",
- "link": "http://www.google.com"
- },
- {
- "title": "About",
- "icon": "fa fa-info",
- "link": "http://ohif.org"
- }
-]
diff --git a/Packages-react/ohif-viewer/src/connectedComponents/ConnectedHeader.js b/Packages-react/ohif-viewer/src/connectedComponents/ConnectedHeader.js
new file mode 100644
index 000000000..22ca6a279
--- /dev/null
+++ b/Packages-react/ohif-viewer/src/connectedComponents/ConnectedHeader.js
@@ -0,0 +1,24 @@
+import { connect } from 'react-redux';
+import Header from '../components/Header/Header.js';
+import { setUserPreferencesModalOpen } from '../redux/actions.js';
+
+const mapStateToProps = state => {
+ return {
+ isOpen: state.ui.userPreferencesModalOpen
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ openUserPreferencesModal: () => {
+ dispatch(setUserPreferencesModalOpen(true));
+ }
+ };
+};
+
+const ConnectedHeader = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(Header);
+
+export default ConnectedHeader;
diff --git a/Packages-react/ohif-viewer/src/connectedComponents/ConnectedUserPreferencesModal.js b/Packages-react/ohif-viewer/src/connectedComponents/ConnectedUserPreferencesModal.js
new file mode 100644
index 000000000..62ef43432
--- /dev/null
+++ b/Packages-react/ohif-viewer/src/connectedComponents/ConnectedUserPreferencesModal.js
@@ -0,0 +1,48 @@
+import { connect } from 'react-redux';
+import { UserPreferencesModal } from 'react-viewerbase';
+import OHIF from 'ohif-core';
+import { setUserPreferencesModalOpen } from '../redux/actions.js';
+import cloneDeep from 'lodash.clonedeep';
+
+const { setUserPreferences } = OHIF.redux.actions;
+
+const mapStateToProps = state => {
+ const contextName = window.store.getState().commandContext.context;
+ return {
+ isOpen: state.ui.userPreferencesModalOpen,
+ windowLevelData: state.preferences[contextName]
+ ? state.preferences[contextName].windowLevelData
+ : {},
+ hotKeysData: state.preferences[contextName]
+ ? state.preferences[contextName].hotKeysData
+ : {}
+ };
+};
+
+const mapDispatchToProps = dispatch => {
+ return {
+ onCancel: () => {
+ dispatch(setUserPreferencesModalOpen(false));
+ },
+ onSave: data => {
+ const contextName = window.store.getState().commandContext.context;
+ const preferences = cloneDeep(window.store.getState().preferences);
+ preferences[contextName] = data;
+ dispatch(setUserPreferences(preferences));
+ dispatch(setUserPreferencesModalOpen(false));
+ OHIF.hotkeysUtil.setHotkeys(data.hotKeysData);
+ },
+ onResetToDefaults: () => {
+ dispatch(setUserPreferences());
+ dispatch(setUserPreferencesModalOpen(false));
+ OHIF.hotkeysUtil.setHotkeys();
+ }
+ };
+};
+
+const ConnectedUserPreferencesModal = connect(
+ mapStateToProps,
+ mapDispatchToProps
+)(UserPreferencesModal);
+
+export default ConnectedUserPreferencesModal;
diff --git a/Packages-react/ohif-viewer/src/connectedComponents/Viewer.js b/Packages-react/ohif-viewer/src/connectedComponents/Viewer.js
index ecc183113..3e28c8bc1 100644
--- a/Packages-react/ohif-viewer/src/connectedComponents/Viewer.js
+++ b/Packages-react/ohif-viewer/src/connectedComponents/Viewer.js
@@ -4,13 +4,12 @@ import PropTypes from 'prop-types';
//import { CineDialog } from 'react-viewerbase';
import WhiteLabellingContext from '../WhiteLabellingContext.js';
-import Header from '../components/Header';
+import ConnectedHeader from './ConnectedHeader.js';
import ConnectedFlexboxLayout from './ConnectedFlexboxLayout.js';
-import ConnectedToolbarRow from './ConnectedToolbarRow';
+import ConnectedToolbarRow from './ConnectedToolbarRow.js';
import ConnectedStudyLoadingMonitor from './ConnectedStudyLoadingMonitor.js';
import StudyPrefetcher from '../components/StudyPrefetcher.js';
import './Viewer.css';
-
/**
* Inits OHIF Hanging Protocol's onReady.
* It waits for OHIF Hanging Protocol to be ready to instantiate the ProtocolEngine
@@ -57,7 +56,9 @@ class Viewer extends Component {
<>
{whiteLabelling => (
- {whiteLabelling.logoComponent}
+
+ {whiteLabelling.logoComponent}
+
)}
diff --git a/Packages-react/ohif-viewer/src/connectedComponents/ViewerMain.js b/Packages-react/ohif-viewer/src/connectedComponents/ViewerMain.js
index 090264bae..625599d22 100644
--- a/Packages-react/ohif-viewer/src/connectedComponents/ViewerMain.js
+++ b/Packages-react/ohif-viewer/src/connectedComponents/ViewerMain.js
@@ -7,16 +7,21 @@ import './ViewerMain.css';
class ViewerMain extends Component {
state = {
- viewportData: [],
+ viewportData: []
};
static propTypes = {
studies: PropTypes.array.isRequired
};
+ constructor(props) {
+ super(props);
+ OHIF.hotkeysUtil.setup('viewer');
+ }
+
getDisplaySets(studies) {
const displaySets = [];
- studies.forEach((study) => {
+ studies.forEach(study => {
study.displaySets.forEach(dSet => {
displaySets.push(dSet);
});
@@ -51,7 +56,7 @@ class ViewerMain extends Component {
});
}
- setViewportData = ({viewportIndex, item}) => {
+ setViewportData = ({ viewportIndex, item }) => {
// TODO: Replace this with mapDispatchToProps call
// if we decide to put viewport info into redux
@@ -59,14 +64,18 @@ class ViewerMain extends Component {
// would not trigger a re-render. We have to create a copy.
const updatedViewportData = this.state.viewportData.slice(0);
- const displaySet = this.findDisplaySet(this.props.studies, item.studyInstanceUid, item.displaySetInstanceUid);
+ const displaySet = this.findDisplaySet(
+ this.props.studies,
+ item.studyInstanceUid,
+ item.displaySetInstanceUid
+ );
updatedViewportData[viewportIndex] = Object.assign({}, displaySet);
this.setState({
viewportData: updatedViewportData
});
- }
+ };
render() {
return (
diff --git a/Packages-react/ohif-viewer/src/redux/actions.js b/Packages-react/ohif-viewer/src/redux/actions.js
index 9ae04a9fd..d68e9a57e 100644
--- a/Packages-react/ohif-viewer/src/redux/actions.js
+++ b/Packages-react/ohif-viewer/src/redux/actions.js
@@ -1,16 +1,22 @@
export const setLeftSidebarOpen = state => ({
- type: 'SET_LEFT_SIDEBAR_OPEN',
- state
+ type: 'SET_LEFT_SIDEBAR_OPEN',
+ state
});
export const setRightSidebarOpen = state => ({
- type: 'SET_RIGHT_SIDEBAR_OPEN',
- state
+ type: 'SET_RIGHT_SIDEBAR_OPEN',
+ state
+});
+
+export const setUserPreferencesModalOpen = state => ({
+ type: 'SET_USER_PREFERENCES_MODAL_OPEN',
+ state
});
const actions = {
- setLeftSidebarOpen,
- setRightSidebarOpen
+ setLeftSidebarOpen,
+ setRightSidebarOpen,
+ setUserPreferencesModalOpen
};
export default actions;
diff --git a/Packages-react/ohif-viewer/src/redux/localStorageState.js b/Packages-react/ohif-viewer/src/redux/localStorageState.js
new file mode 100644
index 000000000..c774a1434
--- /dev/null
+++ b/Packages-react/ohif-viewer/src/redux/localStorageState.js
@@ -0,0 +1,19 @@
+export const loadState = () => {
+ try {
+ const serializedState = window.localStorage.getItem('state');
+ if (!serializedState) {
+ return undefined;
+ }
+
+ return JSON.parse(serializedState);
+ } catch (e) {
+ return undefined;
+ }
+};
+
+export const saveState = state => {
+ try {
+ const serializedState = JSON.stringify(state);
+ localStorage.setItem('state', serializedState);
+ } catch (e) {}
+};
diff --git a/Packages-react/ohif-viewer/src/redux/ui.js b/Packages-react/ohif-viewer/src/redux/ui.js
index 01b558288..74205b3ec 100644
--- a/Packages-react/ohif-viewer/src/redux/ui.js
+++ b/Packages-react/ohif-viewer/src/redux/ui.js
@@ -1,17 +1,22 @@
const defaultState = {
- leftSidebarOpen: true,
- rightSidebarOpen: false,
-}
+ leftSidebarOpen: true,
+ rightSidebarOpen: false,
+ userPreferencesModalOpen: false
+};
const ui = (state = defaultState, action) => {
- switch (action.type) {
- case 'SET_LEFT_SIDEBAR_OPEN':
- return Object.assign({}, state, { leftSidebarOpen: action.state });
- case 'SET_RIGHT_SIDEBAR_OPEN':
- return Object.assign({}, state, { rightSidebarOpen: action.state });
- default:
- return state;
- }
+ switch (action.type) {
+ case 'SET_LEFT_SIDEBAR_OPEN':
+ return Object.assign({}, state, { leftSidebarOpen: action.state });
+ case 'SET_RIGHT_SIDEBAR_OPEN':
+ return Object.assign({}, state, { rightSidebarOpen: action.state });
+ case 'SET_USER_PREFERENCES_MODAL_OPEN':
+ return Object.assign({}, state, {
+ userPreferencesModalOpen: action.state
+ });
+ default:
+ return state;
+ }
};
export default ui;
diff --git a/Packages-react/ohif-viewer/src/studylist/StudyListWithData.js b/Packages-react/ohif-viewer/src/studylist/StudyListWithData.js
index 018f06906..5eb375889 100644
--- a/Packages-react/ohif-viewer/src/studylist/StudyListWithData.js
+++ b/Packages-react/ohif-viewer/src/studylist/StudyListWithData.js
@@ -1,113 +1,123 @@
-import React, { Component } from "react";
-import PropTypes from "prop-types";
+import React, { Component } from 'react';
+import PropTypes from 'prop-types';
import OHIF from 'ohif-core';
import { withRouter } from 'react-router-dom';
-import { StudyList } from "react-viewerbase";
-import Header from "../components/Header";
+import { StudyList } from 'react-viewerbase';
+import Header from '../components/Header';
+import ConnectedHeader from '../connectedComponents/ConnectedHeader.js';
class StudyListWithData extends Component {
- state = {
- searchData: {},
- studies: null,
- error: null
+ state = {
+ searchData: {},
+ studies: null,
+ error: null
+ };
+
+ static propTypes = {
+ patientId: PropTypes.string,
+ server: PropTypes.object,
+ user: PropTypes.object,
+ history: PropTypes.object
+ };
+
+ static rowsPerPage = 25;
+ static defaultSort = { field: 'patientName', order: 'desc' };
+
+ componentDidMount() {
+ // TODO: Avoid using timepoints here
+ //const params = { studyInstanceUids, seriesInstanceUids, timepointId, timepointsFilter={} };
+
+ this.searchForStudies();
+ }
+
+ searchForStudies = (
+ searchData = {
+ currentPage: 0,
+ rowsPerPage: StudyListWithData.rowsPerPage
+ }
+ ) => {
+ const { server } = this.props;
+ const filter = {
+ patientId: searchData.patientId,
+ patientName: searchData.patientName,
+ accessionNumber: searchData.accessionNumber,
+ studyDescription: searchData.studyDescription,
+ modalitiesInStudy: searchData.modalitiesInStudy,
+ limit:
+ searchData.currentPage * searchData.rowsPerPage +
+ searchData.rowsPerPage,
+ offset: searchData.currentPage * searchData.rowsPerPage
};
- static propTypes = {
- patientId: PropTypes.string,
- server: PropTypes.object,
- user: PropTypes.object,
- history: PropTypes.object
- };
+ // TODO: add sorting
+ const promise = OHIF.studies.searchStudies(server, filter);
- static rowsPerPage = 25;
- static defaultSort = { field: 'patientName', order: 'desc' };
-
- componentDidMount() {
- // TODO: Avoid using timepoints here
- //const params = { studyInstanceUids, seriesInstanceUids, timepointId, timepointsFilter={} };
-
- this.searchForStudies();
- }
-
- searchForStudies = (searchData = {
- currentPage: 0,
- rowsPerPage: StudyListWithData.rowsPerPage
- }) => {
- const { server } = this.props;
- const filter = {
- patientId: searchData.patientId,
- patientName: searchData.patientName,
- accessionNumber: searchData.accessionNumber,
- studyDescription: searchData.studyDescription,
- modalitiesInStudy: searchData.modalitiesInStudy,
- limit: searchData.currentPage * searchData.rowsPerPage + searchData.rowsPerPage,
- offset: searchData.currentPage * searchData.rowsPerPage
- };
-
- // TODO: add sorting
- const promise = OHIF.studies.searchStudies(server, filter)
-
- // Render the viewer when the data is ready
- promise.then(studies => {
- if (!studies) {
- studies = [];
- }
-
- // TODO: Fix casing of this property!
- const fixedStudies = studies.map(study => {
- const fixedStudy = study;
- fixedStudy.studyInstanceUID = study.studyInstanceUid;
-
- return fixedStudy;
- })
-
- this.setState({
- studies: fixedStudies,
- });
- }).catch(error => {
- this.setState({
- error: true,
- });
-
- throw new Error(error);
- });
- }
-
- onImport = () => {
- //console.log('onImport');
- }
-
- onSelectItem = (studyInstanceUID) => {
- this.props.history.push(`/viewer/${studyInstanceUID}`);
- }
-
- onSearch = (searchData) => {
- // TODO: Update search filters
- this.searchForStudies(searchData);
- }
-
- render() {
- if (this.state.error) {
- return (
Error: {JSON.stringify(this.state.error)}
);
- } else if (this.state.studies === null) {
- return (
Loading...
);
+ // Render the viewer when the data is ready
+ promise
+ .then(studies => {
+ if (!studies) {
+ studies = [];
}
- const studyCount = this.state.studies ? this.state.studies.length : 0;
+ // TODO: Fix casing of this property!
+ const fixedStudies = studies.map(study => {
+ const fixedStudy = study;
+ fixedStudy.studyInstanceUID = study.studyInstanceUid;
- return (<>
-