feat(OHIFv3):Add static e2e data (#2665)
This change wraps the E2E test data into a github repository, which is then included in the test builds as static data. That makes running the e2e tests as simple as: yarn test:e2e:server yarn test:e2e without any need to have docker etc installed/running.
This commit is contained in:
parent
72bb074f21
commit
0e2c31939c
@ -18,18 +18,17 @@ executors:
|
|||||||
# Custom executor to override Cypress config
|
# Custom executor to override Cypress config
|
||||||
deploy-to-prod-executor:
|
deploy-to-prod-executor:
|
||||||
docker:
|
docker:
|
||||||
- image: 'cypress/browsers:node14.15.0-chrome86-ff82'
|
- image: cimg/node:14.18
|
||||||
environment:
|
environment:
|
||||||
CYPRESS_BASE_URL: https://ohif-staging.netlify.com/
|
CYPRESS_BASE_URL: https://ohif-staging.netlify.com/
|
||||||
chrome-and-pacs:
|
chrome-and-pacs:
|
||||||
docker:
|
docker:
|
||||||
# Primary container image where all steps run.
|
# Primary container image where all steps run.
|
||||||
- image: 'cypress/browsers:node14.15.0-chrome86-ff82'
|
- image: 'cypress/browsers:node14.15.0-chrome86-ff82'
|
||||||
- image: 'ohif/viewer-testdata:0.1-test'
|
|
||||||
|
|
||||||
defaults: &defaults
|
defaults: &defaults
|
||||||
docker:
|
docker:
|
||||||
- image: circleci/node:14.15.0
|
- image: cimg/node:14.18-browsers
|
||||||
environment:
|
environment:
|
||||||
TERM: xterm # Enable colors in term
|
TERM: xterm # Enable colors in term
|
||||||
QUICK_BUILD: true
|
QUICK_BUILD: true
|
||||||
@ -335,15 +334,14 @@ workflows:
|
|||||||
browser: chrome
|
browser: chrome
|
||||||
pre-steps:
|
pre-steps:
|
||||||
- run: |
|
- run: |
|
||||||
# Clear yarn cache; update to latest
|
# Clear yarn cache; use yarn from image (update image to update yarn)
|
||||||
rm -rf ~/.yarn
|
rm -rf ~/.yarn
|
||||||
npm i -g yarn
|
|
||||||
yarn -v
|
yarn -v
|
||||||
yarn: true
|
yarn: true
|
||||||
record: true
|
record: true
|
||||||
store_artifacts: true
|
store_artifacts: true
|
||||||
working_directory: platform/viewer
|
working_directory: platform/viewer
|
||||||
build: npx cross-env QUICK_BUILD=true APP_CONFIG=config/dicomweb-server.js yarn run build
|
build: yarn test:data
|
||||||
start: yarn run test:e2e:serve
|
start: yarn run test:e2e:serve
|
||||||
spec: 'cypress/integration/**/*'
|
spec: 'cypress/integration/**/*'
|
||||||
wait-on: 'http://localhost:3000'
|
wait-on: 'http://localhost:3000'
|
||||||
@ -369,12 +367,12 @@ workflows:
|
|||||||
executor: cypress/browsers-chrome76
|
executor: cypress/browsers-chrome76
|
||||||
browser: chrome
|
browser: chrome
|
||||||
pre-steps:
|
pre-steps:
|
||||||
- run: 'rm -rf ~/.yarn && npm i -g yarn && yarn -v && yarn global
|
- run: 'rm -rf ~/.yarn && yarn -v && yarn global
|
||||||
add wait-on' # Use yarn latest
|
add wait-on'
|
||||||
yarn: true
|
yarn: true
|
||||||
store_artifacts: false
|
store_artifacts: false
|
||||||
working_directory: platform/viewer
|
working_directory: platform/viewer
|
||||||
build: npx cross-env QUICK_BUILD=true APP_CONFIG=config/dicomweb-server.js yarn run build
|
build: yarn test:data && npx cross-env QUICK_BUILD=true APP_CONFIG=config/dicomweb-server.js yarn run build
|
||||||
# start server --> verify running --> percy + chrome + cypress
|
# start server --> verify running --> percy + chrome + cypress
|
||||||
command: yarn run test:e2e:dist
|
command: yarn run test:e2e:dist
|
||||||
cache-key: 'yarn-packages-{{ checksum "yarn.lock" }}'
|
cache-key: 'yarn-packages-{{ checksum "yarn.lock" }}'
|
||||||
@ -436,7 +434,7 @@ workflows:
|
|||||||
yarn: true
|
yarn: true
|
||||||
store_artifacts: false
|
store_artifacts: false
|
||||||
working_directory: platform/viewer
|
working_directory: platform/viewer
|
||||||
build: npx cross-env QUICK_BUILD=true APP_CONFIG=config/dicomweb-server.js yarn run build
|
build: npx cross-env QUICK_BUILD=true APP_CONFIG=config/e2e.js yarn run build
|
||||||
# start server --> verify running --> percy + chrome + cypress
|
# start server --> verify running --> percy + chrome + cypress
|
||||||
command: yarn run test:e2e:dist
|
command: yarn run test:e2e:dist
|
||||||
cache-key: 'yarn-packages-{{ checksum "yarn.lock" }}'
|
cache-key: 'yarn-packages-{{ checksum "yarn.lock" }}'
|
||||||
|
|||||||
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
[submodule "testdata"]
|
||||||
|
path = testdata
|
||||||
|
url = https://github.com/OHIF/viewer-testdata-dicomweb.git
|
||||||
1
.node-version
Normal file
1
.node-version
Normal file
@ -0,0 +1 @@
|
|||||||
|
14.18.0
|
||||||
@ -15,6 +15,7 @@ export default class StaticWadoClient extends api.DICOMwebClient {
|
|||||||
"StudyDescription": "00081030",
|
"StudyDescription": "00081030",
|
||||||
"StudyDate": "00080020",
|
"StudyDate": "00080020",
|
||||||
"ModalitiesInStudy": "00080061",
|
"ModalitiesInStudy": "00080061",
|
||||||
|
AccessionNumber: "00080050",
|
||||||
};
|
};
|
||||||
|
|
||||||
constructor(qidoConfig) {
|
constructor(qidoConfig) {
|
||||||
@ -66,7 +67,16 @@ export default class StaticWadoClient extends api.DICOMwebClient {
|
|||||||
actual = actual.Alphabetic;
|
actual = actual.Alphabetic;
|
||||||
}
|
}
|
||||||
if (typeof (actual) == 'string') {
|
if (typeof (actual) == 'string') {
|
||||||
return actual.indexOf(desired) != -1;
|
if (actual.length === 0) return true;
|
||||||
|
if (desired.length === 0 || desired === '*') return true;
|
||||||
|
if (desired[0] === '*' && desired[desired.length - 1] === '*') {
|
||||||
|
console.log(`Comparing ${actual} to ${desired.substring(1, desired.length - 1)}`)
|
||||||
|
return actual.indexOf(desired.substring(1, desired.length - 1)) != -1;
|
||||||
|
} else if (desired[desired.length - 1] === '*') {
|
||||||
|
return actual.indexOf(desired.substring(0, desired.length - 1)) != -1;
|
||||||
|
} else if (desired[0] === '*') {
|
||||||
|
return actual.indexOf(desired.substring(1)) === actual.length - desired.length + 1;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return desired === actual;
|
return desired === actual;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -32,13 +32,14 @@
|
|||||||
"orthanc:up": "docker-compose -f .docker/Nginx-Orthanc/docker-compose.yml up",
|
"orthanc:up": "docker-compose -f .docker/Nginx-Orthanc/docker-compose.yml up",
|
||||||
"start": "yarn run dev",
|
"start": "yarn run dev",
|
||||||
"test": "yarn run test:unit",
|
"test": "yarn run test:unit",
|
||||||
|
"test:data": "git submodule update --init",
|
||||||
"test-watch": "jest --collectCoverage --watchAll",
|
"test-watch": "jest --collectCoverage --watchAll",
|
||||||
"test:unit": "jest --collectCoverage",
|
"test:unit": "jest --collectCoverage",
|
||||||
"test:unit:ci": "lerna run test:unit:ci --parallel --stream",
|
"test:unit:ci": "lerna run test:unit:ci --parallel --stream",
|
||||||
"test:e2e": "lerna run test:e2e --stream",
|
"test:e2e": "lerna run test:e2e --stream",
|
||||||
"test:e2e:ci": "lerna run test:e2e:ci --stream",
|
"test:e2e:ci": "lerna run test:e2e:ci --stream",
|
||||||
"test:e2e:dist": "lerna run test:e2e:dist --stream",
|
"test:e2e:dist": "lerna run test:e2e:dist --stream",
|
||||||
"test:e2e:serve": "lerna run test:e2e:serve --stream",
|
"test:e2e:serve": "yarn test:data && lerna run test:e2e:serve --stream",
|
||||||
"see-changed": "lerna changed",
|
"see-changed": "lerna changed",
|
||||||
"docs:preview": "lerna run docs:preview --stream",
|
"docs:preview": "lerna run docs:preview --stream",
|
||||||
"docs:publish": "chmod +x ./build-and-publish-docs.sh && ./build-and-publish-docs.sh",
|
"docs:publish": "chmod +x ./build-and-publish-docs.sh && ./build-and-publish-docs.sh",
|
||||||
@ -115,7 +116,7 @@
|
|||||||
"unused-webpack-plugin": "2.4.0",
|
"unused-webpack-plugin": "2.4.0",
|
||||||
"webpack": "^5.50.0",
|
"webpack": "^5.50.0",
|
||||||
"webpack-cli": "^4.7.2",
|
"webpack-cli": "^4.7.2",
|
||||||
"webpack-dev-server": "^3.11.2",
|
"webpack-dev-server": "4.7.3",
|
||||||
"webpack-hot-middleware": "^2.25.0",
|
"webpack-hot-middleware": "^2.25.0",
|
||||||
"webpack-merge": "^5.7.3",
|
"webpack-merge": "^5.7.3",
|
||||||
"workbox-webpack-plugin": "^6.1.5",
|
"workbox-webpack-plugin": "^6.1.5",
|
||||||
|
|||||||
@ -24,26 +24,14 @@ Running unit test will generate a report at the end showing the successful and
|
|||||||
unsuccessful tests with detailed explanations.
|
unsuccessful tests with detailed explanations.
|
||||||
|
|
||||||
## End-to-end test
|
## End-to-end test
|
||||||
|
|
||||||
For running the OHIF e2e test you need to run the following steps:
|
For running the OHIF e2e test you need to run the following steps:
|
||||||
|
|
||||||
- Create a mini-pacs for OHIF to access the images for testing. We download and
|
|
||||||
run our lightweight implementation which provides a collection of DICOM
|
|
||||||
studies ([source code][mini-pacs]).
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker run -p 5985:5985 -p 5984:5984 -e USE_POUCHDB=true -e DB_SERVER=http://0.0.0.0 ohif/viewer-testdata:0.1-test
|
|
||||||
```
|
|
||||||
|
|
||||||
Successful execution should be
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
- Open a new terminal, navigate to the OHIF project, and run OHIF with the
|
- Open a new terminal, navigate to the OHIF project, and run OHIF with the
|
||||||
dicom-server config
|
e2e config. The test:data only needs to be run once and checks the data out.
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
APP_CONFIG=config/dicomweb-server.js yarn start
|
yarn test:data
|
||||||
|
APP_CONFIG=config/e2e.js yarn start
|
||||||
```
|
```
|
||||||
|
|
||||||
You should be able to see test studies in the study list
|
You should be able to see test studies in the study list
|
||||||
@ -53,7 +41,7 @@ For running the OHIF e2e test you need to run the following steps:
|
|||||||
- Open a new terminal inside the OHIF project, and run the e2e cypress test
|
- Open a new terminal inside the OHIF project, and run the e2e cypress test
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
yarn run test:e2e
|
yarn test:e2e
|
||||||
```
|
```
|
||||||
|
|
||||||
You should be able to see the cypress window open
|
You should be able to see the cypress window open
|
||||||
@ -67,6 +55,27 @@ For running the OHIF e2e test you need to run the following steps:
|
|||||||
|
|
||||||

|

|
||||||
|
|
||||||
|
## Test Data
|
||||||
|
The testing data is stored in two OHIF repositories. The first contains the
|
||||||
|
binary DICOM data, at [viewer-testdata](https://github.com/OHIF/viewer-testdata.git)
|
||||||
|
while the second module contains data in the DICOMweb format, installed as a submodule
|
||||||
|
into OHIF in the `testdata` directory. This is retrieved via the command
|
||||||
|
```bash
|
||||||
|
yarn test:data
|
||||||
|
```
|
||||||
|
or the equivalent command `git submodule update --init`
|
||||||
|
When adding new data, run:
|
||||||
|
```
|
||||||
|
npm install -g dicomp10-to-dicomweb
|
||||||
|
mkdicomweb -d dicomweb dcm
|
||||||
|
```
|
||||||
|
to update the local dicomweb submodule in viewer-testdata. Then, commit
|
||||||
|
that data and update the submodules used in OHIF and in the viewer-testdata
|
||||||
|
parent modules.
|
||||||
|
|
||||||
|
All data MUST be fully anonymized and allowed to be used for open access.
|
||||||
|
Any attributions should be included in the DCM directory.
|
||||||
|
|
||||||
## Testing Philosophy
|
## Testing Philosophy
|
||||||
|
|
||||||
> Testing is an opinionated topic. Here is a rough overview of our testing
|
> Testing is an opinionated topic. Here is a rough overview of our testing
|
||||||
|
|||||||
@ -23,6 +23,15 @@ const PROXY_DOMAIN = process.env.PROXY_DOMAIN;
|
|||||||
const ENTRY_TARGET = process.env.ENTRY_TARGET || `${SRC_DIR}/index.js`;
|
const ENTRY_TARGET = process.env.ENTRY_TARGET || `${SRC_DIR}/index.js`;
|
||||||
const Dotenv = require('dotenv-webpack');
|
const Dotenv = require('dotenv-webpack');
|
||||||
|
|
||||||
|
const setHeaders = (res, path) => {
|
||||||
|
res.setHeader('Content-Type', 'text/plain')
|
||||||
|
if (path.indexOf('.gz') !== -1) {
|
||||||
|
res.setHeader('Content-Encoding', 'gzip')
|
||||||
|
} else if (path.indexOf('.br') !== -1) {
|
||||||
|
res.setHeader('Content-Encoding', 'br')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
module.exports = (env, argv) => {
|
module.exports = (env, argv) => {
|
||||||
const baseConfig = webpackBase(env, argv, { SRC_DIR, DIST_DIR });
|
const baseConfig = webpackBase(env, argv, { SRC_DIR, DIST_DIR });
|
||||||
const isProdBuild = process.env.NODE_ENV === 'production';
|
const isProdBuild = process.env.NODE_ENV === 'production';
|
||||||
@ -110,8 +119,32 @@ module.exports = (env, argv) => {
|
|||||||
hot: true,
|
hot: true,
|
||||||
open: true,
|
open: true,
|
||||||
port: 3000,
|
port: 3000,
|
||||||
host: '0.0.0.0',
|
client: {
|
||||||
public: 'http://localhost:' + 3000,
|
overlay: { errors: true, warnings: false },
|
||||||
|
},
|
||||||
|
'static': [
|
||||||
|
{
|
||||||
|
directory: path.join(require('os').homedir(), 'dicomweb'),
|
||||||
|
staticOptions: {
|
||||||
|
extensions: ['gz', 'br'],
|
||||||
|
index: "index.json.gz",
|
||||||
|
redirect: true,
|
||||||
|
setHeaders,
|
||||||
|
},
|
||||||
|
publicPath: '/dicomweb',
|
||||||
|
},
|
||||||
|
{
|
||||||
|
directory: '../../testdata',
|
||||||
|
staticOptions: {
|
||||||
|
extensions: ['gz', 'br'],
|
||||||
|
index: "index.json.gz",
|
||||||
|
redirect: true,
|
||||||
|
setHeaders,
|
||||||
|
},
|
||||||
|
publicPath: '/viewer-testdata',
|
||||||
|
},
|
||||||
|
],
|
||||||
|
//public: 'http://localhost:' + 3000,
|
||||||
//writeToDisk: true,
|
//writeToDisk: true,
|
||||||
historyApiFallback: {
|
historyApiFallback: {
|
||||||
disableDotRule: true,
|
disableDotRule: true,
|
||||||
@ -124,7 +157,7 @@ module.exports = (env, argv) => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
if (hasProxy) {
|
if (hasProxy) {
|
||||||
mergedConfig.devServer.proxy = {};
|
mergedConfig.devServer.proxy = mergedConfig.devServer.proxy || {};
|
||||||
mergedConfig.devServer.proxy[PROXY_TARGET] = PROXY_DOMAIN;
|
mergedConfig.devServer.proxy[PROXY_TARGET] = PROXY_DOMAIN;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -202,10 +202,17 @@ Cypress.Commands.add('waitDicomImage', (timeout = 50000) => {
|
|||||||
|
|
||||||
element.addEventListener('cornerstoneimagerendered', onEvent);
|
element.addEventListener('cornerstoneimagerendered', onEvent);
|
||||||
};
|
};
|
||||||
|
const enabledElements = $cornerstone.getEnabledElements();
|
||||||
|
if (enabledElements && enabledElements.length && !enabledElements[0].invalid) {
|
||||||
|
// Sometimes the page finishes rendering before this gets run,
|
||||||
|
// if so, just resolve immediately.
|
||||||
|
resolve();
|
||||||
|
} else {
|
||||||
$cornerstone.events.addEventListener(
|
$cornerstone.events.addEventListener(
|
||||||
'cornerstoneelementenabled',
|
'cornerstoneelementenabled',
|
||||||
onEnabled
|
onEnabled
|
||||||
);
|
);
|
||||||
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -35,7 +35,7 @@
|
|||||||
"test:e2e:ci": "percy exec -- cypress run --config video=false --record --browser chrome --spec 'cypress/integration/visual-regression/**/*'",
|
"test:e2e:ci": "percy exec -- cypress run --config video=false --record --browser chrome --spec 'cypress/integration/visual-regression/**/*'",
|
||||||
"test:e2e:local": "cypress run --config video=false --browser chrome --spec 'cypress/integration/common/**/*,cypress/integration/pwa/**/*'",
|
"test:e2e:local": "cypress run --config video=false --browser chrome --spec 'cypress/integration/common/**/*,cypress/integration/pwa/**/*'",
|
||||||
"test:e2e:dist": "start-server-and-test test:e2e:serve http://localhost:3000 test:e2e:ci",
|
"test:e2e:dist": "start-server-and-test test:e2e:serve http://localhost:3000 test:e2e:ci",
|
||||||
"test:e2e:serve": "serve -n -l 3000 -s dist",
|
"test:e2e:serve": "cross-env APP_CONFIG=config/e2e.js yarn start",
|
||||||
"test:unit": "jest --watchAll",
|
"test:unit": "jest --watchAll",
|
||||||
"test:unit:ci": "jest --ci --runInBand --collectCoverage",
|
"test:unit:ci": "jest --ci --runInBand --collectCoverage",
|
||||||
"ci:generateSuccessVersion": "node -p -e \"require('./package.json').version\" > success_version.txt"
|
"ci:generateSuccessVersion": "node -p -e \"require('./package.json').version\" > success_version.txt"
|
||||||
|
|||||||
177
platform/viewer/public/config/e2e.js
Normal file
177
platform/viewer/public/config/e2e.js
Normal file
@ -0,0 +1,177 @@
|
|||||||
|
window.config = {
|
||||||
|
routerBasename: '/',
|
||||||
|
// whiteLabelling: {},
|
||||||
|
extensions: [],
|
||||||
|
modes: [],
|
||||||
|
showStudyList: true,
|
||||||
|
// filterQueryParam: false,
|
||||||
|
dataSources: [
|
||||||
|
{
|
||||||
|
friendlyName: 'StaticWado test data',
|
||||||
|
namespace: 'org.ohif.default.dataSourcesModule.dicomweb',
|
||||||
|
sourceName: 'dicomweb',
|
||||||
|
configuration: {
|
||||||
|
name: 'DCM4CHEE',
|
||||||
|
wadoUriRoot: '/viewer-testdata',
|
||||||
|
qidoRoot: '/viewer-testdata',
|
||||||
|
wadoRoot: '/viewer-testdata',
|
||||||
|
qidoSupportsIncludeField: false,
|
||||||
|
supportsReject: false,
|
||||||
|
imageRendering: 'wadors',
|
||||||
|
thumbnailRendering: 'wadors',
|
||||||
|
enableStudyLazyLoad: true,
|
||||||
|
supportsFuzzyMatching: false,
|
||||||
|
supportsWildcard: true,
|
||||||
|
staticWado: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// {
|
||||||
|
// friendlyName: 'StaticWado default data',
|
||||||
|
// namespace: 'org.ohif.default.dataSourcesModule.dicomweb',
|
||||||
|
// sourceName: 'dicomweb',
|
||||||
|
// configuration: {
|
||||||
|
// name: 'DCM4CHEE',
|
||||||
|
// wadoUriRoot: '/dicomweb',
|
||||||
|
// qidoRoot: '/dicomweb',
|
||||||
|
// wadoRoot: '/dicomweb',
|
||||||
|
// qidoSupportsIncludeField: false,
|
||||||
|
// supportsReject: false,
|
||||||
|
// imageRendering: 'wadors',
|
||||||
|
// thumbnailRendering: 'wadors',
|
||||||
|
// enableStudyLazyLoad: true,
|
||||||
|
// supportsFuzzyMatching: false,
|
||||||
|
// supportsWildcard: true,
|
||||||
|
// staticWado: true,
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
{
|
||||||
|
friendlyName: 'dicom json',
|
||||||
|
namespace: 'org.ohif.default.dataSourcesModule.dicomjson',
|
||||||
|
sourceName: 'dicomjson',
|
||||||
|
configuration: {
|
||||||
|
name: 'json',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
friendlyName: 'dicom local',
|
||||||
|
namespace: 'org.ohif.default.dataSourcesModule.dicomlocal',
|
||||||
|
sourceName: 'dicomlocal',
|
||||||
|
configuration: {},
|
||||||
|
},
|
||||||
|
],
|
||||||
|
httpErrorHandler: error => {
|
||||||
|
// This is 429 when rejected from the public idc sandbox too often.
|
||||||
|
console.warn(error.status);
|
||||||
|
|
||||||
|
// Could use services manager here to bring up a dialog/modal if needed.
|
||||||
|
console.warn('test, navigate to https://ohif.org/');
|
||||||
|
},
|
||||||
|
// whiteLabeling: {
|
||||||
|
// /* Optional: Should return a React component to be rendered in the "Logo" section of the application's Top Navigation bar */
|
||||||
|
// createLogoComponentFn: function (React) {
|
||||||
|
// return React.createElement(
|
||||||
|
// 'a',
|
||||||
|
// {
|
||||||
|
// target: '_self',
|
||||||
|
// rel: 'noopener noreferrer',
|
||||||
|
// className: 'text-purple-600 line-through',
|
||||||
|
// href: '/',
|
||||||
|
// },
|
||||||
|
// React.createElement('img',
|
||||||
|
// {
|
||||||
|
// src: './customLogo.svg',
|
||||||
|
// className: 'w-8 h-8',
|
||||||
|
// }
|
||||||
|
// ))
|
||||||
|
// },
|
||||||
|
// },
|
||||||
|
defaultDataSourceName: 'dicomweb',
|
||||||
|
hotkeys: [
|
||||||
|
{
|
||||||
|
commandName: 'incrementActiveViewport',
|
||||||
|
label: 'Next Viewport',
|
||||||
|
keys: ['right'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
commandName: 'decrementActiveViewport',
|
||||||
|
label: 'Previous Viewport',
|
||||||
|
keys: ['left'],
|
||||||
|
},
|
||||||
|
{ commandName: 'rotateViewportCW', label: 'Rotate Right', keys: ['r'] },
|
||||||
|
{ commandName: 'rotateViewportCCW', label: 'Rotate Left', keys: ['l'] },
|
||||||
|
{ commandName: 'invertViewport', label: 'Invert', keys: ['i'] },
|
||||||
|
{
|
||||||
|
commandName: 'flipViewportVertical',
|
||||||
|
label: 'Flip Horizontally',
|
||||||
|
keys: ['h'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
commandName: 'flipViewportHorizontal',
|
||||||
|
label: 'Flip Vertically',
|
||||||
|
keys: ['v'],
|
||||||
|
},
|
||||||
|
{ commandName: 'scaleUpViewport', label: 'Zoom In', keys: ['+'] },
|
||||||
|
{ commandName: 'scaleDownViewport', label: 'Zoom Out', keys: ['-'] },
|
||||||
|
{ commandName: 'fitViewportToWindow', label: 'Zoom to Fit', keys: ['='] },
|
||||||
|
{ commandName: 'resetViewport', label: 'Reset', keys: ['space'] },
|
||||||
|
{ commandName: 'nextImage', label: 'Next Image', keys: ['down'] },
|
||||||
|
{ commandName: 'previousImage', label: 'Previous Image', keys: ['up'] },
|
||||||
|
{
|
||||||
|
commandName: 'previousViewportDisplaySet',
|
||||||
|
label: 'Previous Series',
|
||||||
|
keys: ['pagedown'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
commandName: 'nextViewportDisplaySet',
|
||||||
|
label: 'Next Series',
|
||||||
|
keys: ['pageup'],
|
||||||
|
},
|
||||||
|
{ commandName: 'setZoomTool', label: 'Zoom', keys: ['z'] },
|
||||||
|
// ~ Window level presets
|
||||||
|
{
|
||||||
|
commandName: 'windowLevelPreset1',
|
||||||
|
label: 'W/L Preset 1',
|
||||||
|
keys: ['1'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
commandName: 'windowLevelPreset2',
|
||||||
|
label: 'W/L Preset 2',
|
||||||
|
keys: ['2'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
commandName: 'windowLevelPreset3',
|
||||||
|
label: 'W/L Preset 3',
|
||||||
|
keys: ['3'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
commandName: 'windowLevelPreset4',
|
||||||
|
label: 'W/L Preset 4',
|
||||||
|
keys: ['4'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
commandName: 'windowLevelPreset5',
|
||||||
|
label: 'W/L Preset 5',
|
||||||
|
keys: ['5'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
commandName: 'windowLevelPreset6',
|
||||||
|
label: 'W/L Preset 6',
|
||||||
|
keys: ['6'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
commandName: 'windowLevelPreset7',
|
||||||
|
label: 'W/L Preset 7',
|
||||||
|
keys: ['7'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
commandName: 'windowLevelPreset8',
|
||||||
|
label: 'W/L Preset 8',
|
||||||
|
keys: ['8'],
|
||||||
|
},
|
||||||
|
{
|
||||||
|
commandName: 'windowLevelPreset9',
|
||||||
|
label: 'W/L Preset 9',
|
||||||
|
keys: ['9'],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
};
|
||||||
@ -7,21 +7,21 @@ window.config = {
|
|||||||
// filterQueryParam: false,
|
// filterQueryParam: false,
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
friendlyName: 'dcmjs DICOMWeb Server',
|
friendlyName: 'Static WADO Local Data',
|
||||||
namespace: 'org.ohif.default.dataSourcesModule.dicomweb',
|
namespace: 'org.ohif.default.dataSourcesModule.dicomweb',
|
||||||
sourceName: 'dicomweb',
|
sourceName: 'dicomweb',
|
||||||
configuration: {
|
configuration: {
|
||||||
name: 'DCM4CHEE',
|
name: 'DCM4CHEE',
|
||||||
wadoUriRoot: 'http://localhost:5000',
|
wadoUriRoot: '/dicomweb',
|
||||||
qidoRoot: 'http://localhost:5000',
|
qidoRoot: '/dicomweb',
|
||||||
wadoRoot: 'http://localhost:5000',
|
wadoRoot: '/dicomweb',
|
||||||
qidoSupportsIncludeField: false,
|
qidoSupportsIncludeField: false,
|
||||||
supportsReject: false,
|
supportsReject: false,
|
||||||
imageRendering: 'wadors',
|
imageRendering: 'wadors',
|
||||||
thumbnailRendering: 'wadors',
|
thumbnailRendering: 'wadors',
|
||||||
enableStudyLazyLoad: true,
|
enableStudyLazyLoad: true,
|
||||||
supportsFuzzyMatching: false,
|
supportsFuzzyMatching: false,
|
||||||
supportsWildcard: false,
|
supportsWildcard: true,
|
||||||
staticWado: true,
|
staticWado: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
1
runtime.txt
Normal file
1
runtime.txt
Normal file
@ -0,0 +1 @@
|
|||||||
|
3.7
|
||||||
1
testdata
Submodule
1
testdata
Submodule
@ -0,0 +1 @@
|
|||||||
|
Subproject commit 47d51e15a0d41c02f806570d8cf78ab39e782387
|
||||||
Loading…
Reference in New Issue
Block a user