fix: Use correct external URL for rendered responses with relative URI (#4236)
This commit is contained in:
parent
6fc4390645
commit
d8f6991dbe
@ -14,7 +14,7 @@ import getImageId from './utils/getImageId.js';
|
|||||||
import dcmjs from 'dcmjs';
|
import dcmjs from 'dcmjs';
|
||||||
import { retrieveStudyMetadata, deleteStudyMetadataPromise } from './retrieveStudyMetadata.js';
|
import { retrieveStudyMetadata, deleteStudyMetadataPromise } from './retrieveStudyMetadata.js';
|
||||||
import StaticWadoClient from './utils/StaticWadoClient';
|
import StaticWadoClient from './utils/StaticWadoClient';
|
||||||
import getDirectURL from '../utils/getDirectURL.js';
|
import getDirectURL from '../utils/getDirectURL';
|
||||||
import { fixBulkDataURI } from './utils/fixBulkDataURI';
|
import { fixBulkDataURI } from './utils/fixBulkDataURI';
|
||||||
|
|
||||||
const { DicomMetaDictionary, DicomDict } = dcmjs.data;
|
const { DicomMetaDictionary, DicomDict } = dcmjs.data;
|
||||||
@ -393,10 +393,10 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
|
|||||||
// The value.Value will be set with the bulkdata read value
|
// The value.Value will be set with the bulkdata read value
|
||||||
// in which case it isn't necessary to re-read this.
|
// in which case it isn't necessary to re-read this.
|
||||||
if (value && value.BulkDataURI && !value.Value) {
|
if (value && value.BulkDataURI && !value.Value) {
|
||||||
|
// handle the scenarios where bulkDataURI is relative path
|
||||||
|
fixBulkDataURI(value, naturalized, dicomWebConfig);
|
||||||
// Provide a method to fetch bulkdata
|
// Provide a method to fetch bulkdata
|
||||||
value.retrieveBulkData = (options = {}) => {
|
value.retrieveBulkData = (options = {}) => {
|
||||||
// handle the scenarios where bulkDataURI is relative path
|
|
||||||
fixBulkDataURI(value, naturalized, dicomWebConfig);
|
|
||||||
|
|
||||||
const { mediaType } = options;
|
const { mediaType } = options;
|
||||||
const useOptions = {
|
const useOptions = {
|
||||||
@ -415,7 +415,6 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
|
|||||||
: undefined,
|
: undefined,
|
||||||
...options,
|
...options,
|
||||||
};
|
};
|
||||||
// Todo: this needs to be from wado dicom web client
|
|
||||||
return qidoDicomWebClient.retrieveBulkData(useOptions).then(val => {
|
return qidoDicomWebClient.retrieveBulkData(useOptions).then(val => {
|
||||||
// There are DICOM PDF cases where the first ArrayBuffer in the array is
|
// There are DICOM PDF cases where the first ArrayBuffer in the array is
|
||||||
// the bulk data and DICOM video cases where the second ArrayBuffer is
|
// the bulk data and DICOM video cases where the second ArrayBuffer is
|
||||||
|
|||||||
@ -20,16 +20,23 @@ function fixBulkDataURI(value, instance, dicomWebConfig) {
|
|||||||
// in case of the relative path, make it absolute. The current DICOM standard says
|
// in case of the relative path, make it absolute. The current DICOM standard says
|
||||||
// the bulkdataURI is relative to the series. However, there are situations where
|
// the bulkdataURI is relative to the series. However, there are situations where
|
||||||
// it can be relative to the study too
|
// it can be relative to the study too
|
||||||
if (!value.BulkDataURI.startsWith('http') && !value.BulkDataURI.startsWith('/')) {
|
const { BulkDataURI } = value;
|
||||||
if (dicomWebConfig.bulkDataURI?.relativeResolution === 'studies') {
|
if (!BulkDataURI.startsWith('http') && !value.BulkDataURI.startsWith('/')) {
|
||||||
value.BulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${instance.StudyInstanceUID}/${value.BulkDataURI}`;
|
const { StudyInstanceUID, SeriesInstanceUID } = instance;
|
||||||
|
const isInstanceStart = BulkDataURI.startsWith('instances/') || BulkDataURI.startsWith('../');
|
||||||
|
if (
|
||||||
|
BulkDataURI.startsWith('series/') ||
|
||||||
|
BulkDataURI.startsWith('bulkdata/') ||
|
||||||
|
(dicomWebConfig.bulkDataURI?.relativeResolution === 'studies' && isInstanceStart)
|
||||||
|
) {
|
||||||
|
value.BulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${StudyInstanceUID}/${BulkDataURI}`;
|
||||||
} else if (
|
} else if (
|
||||||
|
isInstanceStart ||
|
||||||
dicomWebConfig.bulkDataURI?.relativeResolution === 'series' ||
|
dicomWebConfig.bulkDataURI?.relativeResolution === 'series' ||
|
||||||
!dicomWebConfig.bulkDataURI?.relativeResolution
|
!dicomWebConfig.bulkDataURI?.relativeResolution
|
||||||
) {
|
) {
|
||||||
value.BulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${instance.StudyInstanceUID}/series/${instance.SeriesInstanceUID}/${value.BulkDataURI}`;
|
value.BulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/${BulkDataURI}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -39,11 +46,11 @@ function fixBulkDataURI(value, instance, dicomWebConfig) {
|
|||||||
// uri (e.g., bulkData: /bulk/1e, wado root: http://myserver.com/dicomweb, output: http://myserver.com/bulk/1e)
|
// uri (e.g., bulkData: /bulk/1e, wado root: http://myserver.com/dicomweb, output: http://myserver.com/bulk/1e)
|
||||||
// and in case of relative wado root, we need to prepend the bulkdata uri to the wado root (e.g,. bulkData: /bulk/1e
|
// and in case of relative wado root, we need to prepend the bulkdata uri to the wado root (e.g,. bulkData: /bulk/1e
|
||||||
// wado root: /dicomweb, output: /bulk/1e)
|
// wado root: /dicomweb, output: /bulk/1e)
|
||||||
if (value.BulkDataURI[0] === '/') {
|
if (BulkDataURI[0] === '/') {
|
||||||
if (dicomWebConfig.wadoRoot.startsWith('http')) {
|
if (dicomWebConfig.wadoRoot.startsWith('http')) {
|
||||||
// Absolute wado root
|
// Absolute wado root
|
||||||
const url = new URL(dicomWebConfig.wadoRoot);
|
const url = new URL(dicomWebConfig.wadoRoot);
|
||||||
value.BulkDataURI = `${url.origin}${value.BulkDataURI}`;
|
value.BulkDataURI = `${url.origin}${BulkDataURI}`;
|
||||||
} else {
|
} else {
|
||||||
// Relative wado root, we don't need to do anything, bulkdata uri is already correct
|
// Relative wado root, we don't need to do anything, bulkdata uri is already correct
|
||||||
}
|
}
|
||||||
|
|||||||
@ -17,7 +17,12 @@ const createRenderedRetrieve = (config, params) => {
|
|||||||
const { wadoRoot } = config;
|
const { wadoRoot } = config;
|
||||||
const { instance, tag = 'PixelData' } = params;
|
const { instance, tag = 'PixelData' } = params;
|
||||||
const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;
|
const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;
|
||||||
|
const value = instance[tag];
|
||||||
|
|
||||||
|
if (value?.BulkDataURI?.indexOf('?') !== -1) {
|
||||||
|
// The value instance has parameters, so it should not revert to the rendered
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (tag === 'PixelData' || tag === 'EncapsulatedDocument') {
|
if (tag === 'PixelData' || tag === 'EncapsulatedDocument') {
|
||||||
return `${wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/instances/${SOPInstanceUID}/rendered`;
|
return `${wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/instances/${SOPInstanceUID}/rendered`;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -22,7 +22,7 @@ const getBulkdataValue = (config, params) => {
|
|||||||
|
|
||||||
const value = instance[tag];
|
const value = instance[tag];
|
||||||
|
|
||||||
const { SeriesInstanceUID, SOPInstanceUID } = instance;
|
const { StudyInstanceUID, SeriesInstanceUID, SOPInstanceUID } = instance;
|
||||||
|
|
||||||
const BulkDataURI =
|
const BulkDataURI =
|
||||||
(value && value.BulkDataURI) ||
|
(value && value.BulkDataURI) ||
|
||||||
@ -32,6 +32,11 @@ const getBulkdataValue = (config, params) => {
|
|||||||
const acceptUri =
|
const acceptUri =
|
||||||
BulkDataURI + (hasAccept ? '' : (hasQuery ? '&' : '?') + `accept=${defaultType}`);
|
BulkDataURI + (hasAccept ? '' : (hasQuery ? '&' : '?') + `accept=${defaultType}`);
|
||||||
|
|
||||||
|
if (acceptUri.startsWith('series/')) {
|
||||||
|
const { wadoRoot } = config;
|
||||||
|
return `${wadoRoot}/studies/${StudyInstanceUID}/${acceptUri}`;
|
||||||
|
}
|
||||||
|
|
||||||
// The DICOMweb standard states that the default is multipart related, and then
|
// The DICOMweb standard states that the default is multipart related, and then
|
||||||
// separately states that the accept parameter is the URL parameter equivalent of the accept header.
|
// separately states that the accept parameter is the URL parameter equivalent of the accept header.
|
||||||
return acceptUri;
|
return acceptUri;
|
||||||
|
|||||||
@ -53,6 +53,12 @@ const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager)
|
|||||||
const { Modality, SOPInstanceUID, SeriesDescription = 'VIDEO' } = instance;
|
const { Modality, SOPInstanceUID, SeriesDescription = 'VIDEO' } = instance;
|
||||||
const { SeriesNumber, SeriesDate, SeriesInstanceUID, StudyInstanceUID, NumberOfFrames, url } =
|
const { SeriesNumber, SeriesDate, SeriesInstanceUID, StudyInstanceUID, NumberOfFrames, url } =
|
||||||
instance;
|
instance;
|
||||||
|
const videoUrl = dataSource.retrieve.directURL({
|
||||||
|
instance,
|
||||||
|
singlepart: 'video',
|
||||||
|
tag: 'PixelData',
|
||||||
|
url,
|
||||||
|
});
|
||||||
const displaySet = {
|
const displaySet = {
|
||||||
//plugin: id,
|
//plugin: id,
|
||||||
Modality,
|
Modality,
|
||||||
@ -66,12 +72,7 @@ const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager)
|
|||||||
SOPClassHandlerId,
|
SOPClassHandlerId,
|
||||||
referencedImages: null,
|
referencedImages: null,
|
||||||
measurements: null,
|
measurements: null,
|
||||||
videoUrl: dataSource.retrieve.directURL({
|
videoUrl,
|
||||||
instance,
|
|
||||||
singlepart: 'video',
|
|
||||||
tag: 'PixelData',
|
|
||||||
url,
|
|
||||||
}),
|
|
||||||
instances: [instance],
|
instances: [instance],
|
||||||
thumbnailSrc: dataSource.retrieve.directURL({
|
thumbnailSrc: dataSource.retrieve.directURL({
|
||||||
instance,
|
instance,
|
||||||
|
|||||||
@ -62,9 +62,10 @@ const config = {
|
|||||||
omitQuotationForMultipartRequest: true,
|
omitQuotationForMultipartRequest: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||||
sourceName: 'dicomweb2',
|
sourceName: 'ohif2',
|
||||||
configuration: {
|
configuration: {
|
||||||
friendlyName: 'AWS S3 Static wado secondary server',
|
friendlyName: 'AWS S3 Static wado secondary server',
|
||||||
name: 'aws',
|
name: 'aws',
|
||||||
@ -90,6 +91,60 @@ const config = {
|
|||||||
omitQuotationForMultipartRequest: true,
|
omitQuotationForMultipartRequest: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||||
|
sourceName: 'ohif3',
|
||||||
|
configuration: {
|
||||||
|
friendlyName: 'AWS S3 Static wado secondary server',
|
||||||
|
name: 'aws',
|
||||||
|
wadoUriRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb',
|
||||||
|
qidoRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb',
|
||||||
|
wadoRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb',
|
||||||
|
qidoSupportsIncludeField: false,
|
||||||
|
supportsReject: false,
|
||||||
|
imageRendering: 'wadors',
|
||||||
|
thumbnailRendering: 'wadors',
|
||||||
|
enableStudyLazyLoad: true,
|
||||||
|
supportsFuzzyMatching: false,
|
||||||
|
supportsWildcard: true,
|
||||||
|
staticWado: true,
|
||||||
|
singlepart: 'bulkdata,video',
|
||||||
|
// whether the data source should use retrieveBulkData to grab metadata,
|
||||||
|
// and in case of relative path, what would it be relative to, options
|
||||||
|
// are in the series level or study level (some servers like series some study)
|
||||||
|
bulkDataURI: {
|
||||||
|
enabled: true,
|
||||||
|
relativeResolution: 'studies',
|
||||||
|
},
|
||||||
|
omitQuotationForMultipartRequest: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||||
|
sourceName: 'local5000',
|
||||||
|
configuration: {
|
||||||
|
friendlyName: 'Static WADO Local Data',
|
||||||
|
name: 'DCM4CHEE',
|
||||||
|
qidoRoot: 'http://localhost:5000/dicomweb',
|
||||||
|
wadoRoot: 'http://localhost:5000/dicomweb',
|
||||||
|
qidoSupportsIncludeField: false,
|
||||||
|
supportsReject: true,
|
||||||
|
supportsStow: true,
|
||||||
|
imageRendering: 'wadors',
|
||||||
|
thumbnailRendering: 'wadors',
|
||||||
|
enableStudyLazyLoad: true,
|
||||||
|
supportsFuzzyMatching: false,
|
||||||
|
supportsWildcard: true,
|
||||||
|
staticWado: true,
|
||||||
|
singlepart: 'video',
|
||||||
|
bulkDataURI: {
|
||||||
|
enabled: true,
|
||||||
|
relativeResolution: 'studies',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
namespace: '@ohif/extension-default.dataSourcesModule.dicomwebproxy',
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomwebproxy',
|
||||||
sourceName: 'dicomwebproxy',
|
sourceName: 'dicomwebproxy',
|
||||||
|
|||||||
@ -49,7 +49,7 @@ window.config = {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||||
sourceName: 'local',
|
sourceName: 'local5000',
|
||||||
configuration: {
|
configuration: {
|
||||||
friendlyName: 'Static WADO Local Data',
|
friendlyName: 'Static WADO Local Data',
|
||||||
name: 'DCM4CHEE',
|
name: 'DCM4CHEE',
|
||||||
@ -118,9 +118,10 @@ window.config = {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||||
sourceName: 'dicomweb2',
|
sourceName: 'ohif2',
|
||||||
configuration: {
|
configuration: {
|
||||||
friendlyName: 'AWS S3 Static wado secondary server',
|
friendlyName: 'AWS S3 Static wado secondary server',
|
||||||
name: 'aws',
|
name: 'aws',
|
||||||
@ -146,6 +147,35 @@ window.config = {
|
|||||||
omitQuotationForMultipartRequest: true,
|
omitQuotationForMultipartRequest: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||||
|
sourceName: 'ohif3',
|
||||||
|
configuration: {
|
||||||
|
friendlyName: 'AWS S3 Static wado secondary server',
|
||||||
|
name: 'aws',
|
||||||
|
wadoUriRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb',
|
||||||
|
qidoRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb',
|
||||||
|
wadoRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb',
|
||||||
|
qidoSupportsIncludeField: false,
|
||||||
|
supportsReject: false,
|
||||||
|
imageRendering: 'wadors',
|
||||||
|
thumbnailRendering: 'wadors',
|
||||||
|
enableStudyLazyLoad: true,
|
||||||
|
supportsFuzzyMatching: false,
|
||||||
|
supportsWildcard: true,
|
||||||
|
staticWado: true,
|
||||||
|
singlepart: 'bulkdata,video',
|
||||||
|
// whether the data source should use retrieveBulkData to grab metadata,
|
||||||
|
// and in case of relative path, what would it be relative to, options
|
||||||
|
// are in the series level or study level (some servers like series some study)
|
||||||
|
bulkDataURI: {
|
||||||
|
enabled: true,
|
||||||
|
relativeResolution: 'studies',
|
||||||
|
},
|
||||||
|
omitQuotationForMultipartRequest: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
friendlyName: 'StaticWado default data',
|
friendlyName: 'StaticWado default data',
|
||||||
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||||
|
|||||||
@ -12,11 +12,11 @@ window.config = {
|
|||||||
strictZSpacingForVolumeViewport: true,
|
strictZSpacingForVolumeViewport: true,
|
||||||
groupEnabledModesFirst: true,
|
groupEnabledModesFirst: true,
|
||||||
// filterQueryParam: false,
|
// filterQueryParam: false,
|
||||||
defaultDataSourceName: 'dicomweb',
|
defaultDataSourceName: 'ohif',
|
||||||
dataSources: [
|
dataSources: [
|
||||||
{
|
{
|
||||||
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||||
sourceName: 'dicomweb',
|
sourceName: 'ohif',
|
||||||
configuration: {
|
configuration: {
|
||||||
friendlyName: 'AWS S3 Static wado server',
|
friendlyName: 'AWS S3 Static wado server',
|
||||||
name: 'aws',
|
name: 'aws',
|
||||||
@ -41,9 +41,10 @@ window.config = {
|
|||||||
omitQuotationForMultipartRequest: true,
|
omitQuotationForMultipartRequest: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||||
sourceName: 'dicomweb2',
|
sourceName: 'ohif2',
|
||||||
configuration: {
|
configuration: {
|
||||||
friendlyName: 'AWS S3 Static wado secondary server',
|
friendlyName: 'AWS S3 Static wado secondary server',
|
||||||
name: 'aws',
|
name: 'aws',
|
||||||
@ -69,6 +70,61 @@ window.config = {
|
|||||||
omitQuotationForMultipartRequest: true,
|
omitQuotationForMultipartRequest: true,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||||
|
sourceName: 'ohif3',
|
||||||
|
configuration: {
|
||||||
|
friendlyName: 'AWS S3 Static wado secondary server',
|
||||||
|
name: 'aws',
|
||||||
|
wadoUriRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb',
|
||||||
|
qidoRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb',
|
||||||
|
wadoRoot: 'https://d3t6nz73ql33tx.cloudfront.net/dicomweb',
|
||||||
|
qidoSupportsIncludeField: false,
|
||||||
|
supportsReject: false,
|
||||||
|
imageRendering: 'wadors',
|
||||||
|
thumbnailRendering: 'wadors',
|
||||||
|
enableStudyLazyLoad: true,
|
||||||
|
supportsFuzzyMatching: false,
|
||||||
|
supportsWildcard: true,
|
||||||
|
staticWado: true,
|
||||||
|
singlepart: 'bulkdata,video',
|
||||||
|
// whether the data source should use retrieveBulkData to grab metadata,
|
||||||
|
// and in case of relative path, what would it be relative to, options
|
||||||
|
// are in the series level or study level (some servers like series some study)
|
||||||
|
bulkDataURI: {
|
||||||
|
enabled: true,
|
||||||
|
relativeResolution: 'studies',
|
||||||
|
},
|
||||||
|
omitQuotationForMultipartRequest: true,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
|
{
|
||||||
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomweb',
|
||||||
|
sourceName: 'local5000',
|
||||||
|
configuration: {
|
||||||
|
friendlyName: 'Static WADO Local Data',
|
||||||
|
name: 'DCM4CHEE',
|
||||||
|
qidoRoot: 'http://localhost:5000/dicomweb',
|
||||||
|
wadoRoot: 'http://localhost:5000/dicomweb',
|
||||||
|
qidoSupportsIncludeField: false,
|
||||||
|
supportsReject: true,
|
||||||
|
supportsStow: true,
|
||||||
|
imageRendering: 'wadors',
|
||||||
|
thumbnailRendering: 'wadors',
|
||||||
|
enableStudyLazyLoad: true,
|
||||||
|
supportsFuzzyMatching: false,
|
||||||
|
supportsWildcard: true,
|
||||||
|
staticWado: true,
|
||||||
|
singlepart: 'video',
|
||||||
|
bulkDataURI: {
|
||||||
|
enabled: true,
|
||||||
|
relativeResolution: 'studies',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
namespace: '@ohif/extension-default.dataSourcesModule.dicomjson',
|
namespace: '@ohif/extension-default.dataSourcesModule.dicomjson',
|
||||||
sourceName: 'dicomjson',
|
sourceName: 'dicomjson',
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user