@ohif/app 3.9.0-beta.76 → 3.9.0-beta.78
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{1169.bundle.a3d3d310f1d8d7e335bf.js → 1169.bundle.d32f38ab5aa329346850.js} +46 -106
- package/dist/{1202.bundle.1468f0e71fea0c593081.js → 1202.bundle.55f140afb05e1ad5512c.js} +503 -153
- package/dist/{2568.css → 1540.css} +1 -0
- package/dist/{1994.bundle.d347a831c1be751d0627.js → 1994.bundle.083fb36bc0648f2dbda6.js} +3 -3
- package/dist/{9824.bundle.e16a5ef35eedfa74b3be.js → 2119.bundle.3446480f91f1200cd45c.js} +4 -4
- package/dist/{9824.css → 2119.css} +1 -0
- package/dist/{2650.bundle.1f7d90198b9e361dfb9c.js → 2650.bundle.feb3b241748314884ae4.js} +57 -35
- package/dist/{3117.bundle.c83d0f403d17104a7c4c.js → 3117.bundle.463d5fa4671a93939d36.js} +8 -7
- package/dist/{4210.bundle.fb376c67d110f8177eea.js → 4210.bundle.38eb5056ac41a0b04d21.js} +2 -2
- package/dist/{4842.bundle.619edd60983634d9f8dd.js → 4842.bundle.0427b8aa1b52aa050ed2.js} +12 -8
- package/dist/{5888.bundle.91227a2efe569869fdd0.js → 5888.bundle.ebca6329037cf353968f.js} +14 -7
- package/dist/{2417.bundle.4a0334c8c4047005979e.js → 5898.bundle.be696e0b355efc1c7f05.js} +1947 -1
- package/dist/{2281.bundle.216a0d86eaed7f4870ae.js → 655.bundle.28f107410332c62993a3.js} +170 -66
- package/dist/{6591.bundle.ace15b11ac7df3edf1bb.js → 6591.bundle.92a28f98c3f45ac3b3f1.js} +15 -1
- package/dist/{7502.bundle.abf1ade64f101ba01596.js → 7502.bundle.550aee57ecd221eab7c1.js} +4 -6
- package/dist/{3424.bundle.1b6101d721148c04242b.js → 79.bundle.b03daeeef3e6faf9dca3.js} +5 -47
- package/dist/{8993.bundle.256bb3c84d2564a5f3cf.js → 8993.bundle.23cd5f8560800a97d798.js} +39 -32
- package/dist/{2065.bundle.5d8f4c26b1fa393e26a4.js → 8999.bundle.e23beb310b14ca9ded76.js} +13 -133
- package/dist/{9579.bundle.7212d7a737a71bb61502.js → 9579.bundle.f9c9be0c5ab6cddbde3d.js} +8 -7
- package/dist/{5516.bundle.074fac92088b103bf0e3.js → 962.bundle.04afab064299df16f869.js} +408 -179
- package/dist/app-config.js +1 -0
- package/dist/{app.bundle.016cbb7783086e131b26.js → app.bundle.53faac5b01b67714fad2.js} +658 -352
- package/dist/index.html +1 -1
- package/dist/{polySeg.bundle.40b9a8c9006bb15691ee.js → polySeg.bundle.0a70e65fe89169ec7508.js} +1 -1
- package/dist/{suv-peak-worker.bundle.a70e70b9ef87c18b896c.js → suv-peak-worker.bundle.54d68bc1808ad3d77994.js} +1 -1
- package/dist/sw.js +1 -1
- package/package.json +18 -18
- package/dist/7604.bundle.42d3f08efb3a9eae4581.js +0 -1950
- package/dist/{1498.bundle.d8f5281952d09c57ef87.js → 1498.bundle.a2d05ac1f27d0c2d2c9f.js} +0 -0
- package/dist/{153.bundle.35f9f8c81db7a40221cf.js → 153.bundle.3ba838ef3c08a266ae35.js} +0 -0
- package/dist/{2791.bundle.29069810b8cf85d6aa0f.js → 2791.bundle.cfa27e4347069ab301b7.js} +0 -0
- package/dist/{3497.bundle.a04a2444975bf50fddf8.js → 3497.bundle.512610422a2862584c55.js} +0 -0
- package/dist/{3962.bundle.9a463bda1035e46ebbba.js → 3962.bundle.31bfadcde7f5a2dd8932.js} +0 -0
- package/dist/{4353.bundle.ac8577aa909c2c56db16.js → 4353.bundle.c13a0c72c607850ea3c0.js} +0 -0
- package/dist/{4978.bundle.19b43e91a7fe302599c6.js → 4978.bundle.655344cfd52d9f0641e5.js} +0 -0
- package/dist/{5793.bundle.eed3fe9019c31999efff.js → 5793.bundle.d1b4e887564bbb98752d.js} +0 -0
- package/dist/{6904.bundle.27abf08c0f2e4fe5e06d.js → 6904.bundle.da0d83fcd48a48cfaac1.js} +0 -0
- package/dist/{7246.bundle.11a6fa77c63c0df329bc.js → 7246.bundle.f1cbdd5ec9387bb6f8fe.js} +0 -0
- package/dist/{7360.bundle.114b1294460b2d9bfeb9.js → 7360.bundle.d0bdb43af1494bccc433.js} +0 -0
- package/dist/{7376.bundle.e9fea4789985d4409171.js → 7376.bundle.d6b445de2d468ab2e8b3.js} +0 -0
- package/dist/{3424.css → 79.css} +1 -1
- /package/dist/{7913.bundle.dc45c449f89985c7dd7c.js → 7913.bundle.353baac2e2a5b4bb330d.js} +0 -0
- /package/dist/{818.bundle.b64fae7e982e16a82ca2.js → 818.bundle.b6027359846cc90e32ff.js} +0 -0
- /package/dist/{8944.bundle.a3cecebcc7b2ca3c7259.js → 8944.bundle.29926bb653a467c7e7d8.js} +0 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[
|
|
2
|
+
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[655],{
|
|
3
3
|
|
|
4
|
-
/***/
|
|
4
|
+
/***/ 10655:
|
|
5
5
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
6
6
|
|
|
7
7
|
// ESM COMPAT FLAG
|
|
@@ -12,6 +12,7 @@ __webpack_require__.d(__webpack_exports__, {
|
|
|
12
12
|
ContextMenuController: () => (/* reexport */ ContextMenuController),
|
|
13
13
|
CustomizableContextMenuTypes: () => (/* reexport */ types_namespaceObject),
|
|
14
14
|
StaticWadoClient: () => (/* reexport */ StaticWadoClient),
|
|
15
|
+
cleanDenaturalizedDataset: () => (/* reexport */ cleanDenaturalizedDataset),
|
|
15
16
|
createReportAsync: () => (/* reexport */ Actions_createReportAsync),
|
|
16
17
|
createReportDialogPrompt: () => (/* reexport */ CreateReportDialogPrompt),
|
|
17
18
|
"default": () => (/* binding */ default_src),
|
|
@@ -27,7 +28,10 @@ __webpack_require__.r(types_namespaceObject);
|
|
|
27
28
|
var utils_namespaceObject = {};
|
|
28
29
|
__webpack_require__.r(utils_namespaceObject);
|
|
29
30
|
__webpack_require__.d(utils_namespaceObject, {
|
|
30
|
-
|
|
31
|
+
cleanDenaturalizedDataset: () => (cleanDenaturalizedDataset),
|
|
32
|
+
fixBulkDataURI: () => (fixBulkDataURI),
|
|
33
|
+
fixMultiValueKeys: () => (fixMultiValueKeys),
|
|
34
|
+
transferDenaturalizedDataset: () => (transferDenaturalizedDataset)
|
|
31
35
|
});
|
|
32
36
|
|
|
33
37
|
// EXTERNAL MODULE: ../../../node_modules/dicomweb-client/build/dicomweb-client.es.js
|
|
@@ -1307,6 +1311,7 @@ function fixBulkDataURI(value, instance, dicomWebConfig) {
|
|
|
1307
1311
|
const {
|
|
1308
1312
|
bulkDataURI: uriConfig = {}
|
|
1309
1313
|
} = dicomWebConfig;
|
|
1314
|
+
BulkDataURI = uriConfig.transform?.(BulkDataURI) || BulkDataURI;
|
|
1310
1315
|
|
|
1311
1316
|
// Handle incorrectly prefixed origins
|
|
1312
1317
|
const {
|
|
@@ -1323,7 +1328,7 @@ function fixBulkDataURI(value, instance, dicomWebConfig) {
|
|
|
1323
1328
|
SeriesInstanceUID
|
|
1324
1329
|
} = instance;
|
|
1325
1330
|
const isInstanceStart = BulkDataURI.startsWith('instances/') || BulkDataURI.startsWith('../');
|
|
1326
|
-
if (BulkDataURI.startsWith('series/') || BulkDataURI.startsWith('bulkdata/') || uriConfig.relativeResolution === 'studies' && isInstanceStart) {
|
|
1331
|
+
if (BulkDataURI.startsWith('series/') || BulkDataURI.startsWith('bulkdata/') || uriConfig.relativeResolution === 'studies' && !isInstanceStart) {
|
|
1327
1332
|
value.BulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${StudyInstanceUID}/${BulkDataURI}`;
|
|
1328
1333
|
} else if (isInstanceStart || uriConfig.relativeResolution === 'series' || !uriConfig.relativeResolution) {
|
|
1329
1334
|
value.BulkDataURI = `${dicomWebConfig.wadoRoot}/studies/${StudyInstanceUID}/series/${SeriesInstanceUID}/${BulkDataURI}`;
|
|
@@ -1510,6 +1515,14 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
|
|
|
1510
1515
|
singlepart: dicomWebConfig.singlepart
|
|
1511
1516
|
}, params);
|
|
1512
1517
|
},
|
|
1518
|
+
/**
|
|
1519
|
+
* Provide direct access to the dicom web client for certain use cases
|
|
1520
|
+
* where the dicom web client is used by an external library such as the
|
|
1521
|
+
* microscopy viewer.
|
|
1522
|
+
* Note this instance only needs to support the wado queries, and may not
|
|
1523
|
+
* support any QIDO or STOW operations.
|
|
1524
|
+
*/
|
|
1525
|
+
getWadoDicomWebClient: () => wadoDicomWebClient,
|
|
1513
1526
|
bulkDataURI: async ({
|
|
1514
1527
|
StudyInstanceUID,
|
|
1515
1528
|
BulkDataURI
|
|
@@ -1634,6 +1647,31 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
|
|
|
1634
1647
|
promises: seriesPromises
|
|
1635
1648
|
} = await retrieveStudyMetadata(wadoDicomWebClient, StudyInstanceUID, enableStudyLazyLoad, filters, sortCriteria, sortFunction, dicomWebConfig);
|
|
1636
1649
|
|
|
1650
|
+
/**
|
|
1651
|
+
* Adds the retrieve bulkdata function to naturalized DICOM data.
|
|
1652
|
+
* This is done recursively, for sub-sequences.
|
|
1653
|
+
*/
|
|
1654
|
+
const addRetrieveBulkDataNaturalized = (naturalized, instance = naturalized) => {
|
|
1655
|
+
for (const key of Object.keys(naturalized)) {
|
|
1656
|
+
const value = naturalized[key];
|
|
1657
|
+
if (Array.isArray(value) && typeof value[0] === 'object') {
|
|
1658
|
+
// Fix recursive values
|
|
1659
|
+
value.forEach(child => addRetrieveBulkDataNaturalized(child, instance));
|
|
1660
|
+
continue;
|
|
1661
|
+
}
|
|
1662
|
+
|
|
1663
|
+
// The value.Value will be set with the bulkdata read value
|
|
1664
|
+
// in which case it isn't necessary to re-read this.
|
|
1665
|
+
if (value && value.BulkDataURI && !value.Value) {
|
|
1666
|
+
// handle the scenarios where bulkDataURI is relative path
|
|
1667
|
+
fixBulkDataURI(value, instance, dicomWebConfig);
|
|
1668
|
+
// Provide a method to fetch bulkdata
|
|
1669
|
+
value.retrieveBulkData = retrieveBulkData.bind(qidoDicomWebClient, value);
|
|
1670
|
+
}
|
|
1671
|
+
}
|
|
1672
|
+
return naturalized;
|
|
1673
|
+
};
|
|
1674
|
+
|
|
1637
1675
|
/**
|
|
1638
1676
|
* naturalizes the dataset, and adds a retrieve bulkdata method
|
|
1639
1677
|
* to any values containing BulkDataURI.
|
|
@@ -1647,49 +1685,7 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
|
|
|
1647
1685
|
if (!dicomWebConfig.bulkDataURI?.enabled) {
|
|
1648
1686
|
return naturalized;
|
|
1649
1687
|
}
|
|
1650
|
-
|
|
1651
|
-
const value = naturalized[key];
|
|
1652
|
-
|
|
1653
|
-
// The value.Value will be set with the bulkdata read value
|
|
1654
|
-
// in which case it isn't necessary to re-read this.
|
|
1655
|
-
if (value && value.BulkDataURI && !value.Value) {
|
|
1656
|
-
// handle the scenarios where bulkDataURI is relative path
|
|
1657
|
-
fixBulkDataURI(value, naturalized, dicomWebConfig);
|
|
1658
|
-
// Provide a method to fetch bulkdata
|
|
1659
|
-
value.retrieveBulkData = (options = {}) => {
|
|
1660
|
-
const {
|
|
1661
|
-
mediaType
|
|
1662
|
-
} = options;
|
|
1663
|
-
const useOptions = {
|
|
1664
|
-
// The bulkdata fetches work with either multipart or
|
|
1665
|
-
// singlepart, so set multipart to false to let the server
|
|
1666
|
-
// decide which type to respond with.
|
|
1667
|
-
multipart: false,
|
|
1668
|
-
BulkDataURI: value.BulkDataURI,
|
|
1669
|
-
// The study instance UID is required if the bulkdata uri
|
|
1670
|
-
// is relative - that isn't disallowed by DICOMweb, but
|
|
1671
|
-
// isn't well specified in the standard, but is needed in
|
|
1672
|
-
// any implementation that stores static copies of the metadata
|
|
1673
|
-
StudyInstanceUID: naturalized.StudyInstanceUID,
|
|
1674
|
-
mediaTypes: mediaType ? [{
|
|
1675
|
-
mediaType
|
|
1676
|
-
}, {
|
|
1677
|
-
mediaType: 'application/octet-stream'
|
|
1678
|
-
}] : undefined,
|
|
1679
|
-
...options
|
|
1680
|
-
};
|
|
1681
|
-
return qidoDicomWebClient.retrieveBulkData(useOptions).then(val => {
|
|
1682
|
-
// There are DICOM PDF cases where the first ArrayBuffer in the array is
|
|
1683
|
-
// the bulk data and DICOM video cases where the second ArrayBuffer is
|
|
1684
|
-
// the bulk data. Here we play it safe and do a find.
|
|
1685
|
-
const ret = val instanceof Array && val.find(arrayBuffer => arrayBuffer?.byteLength) || undefined;
|
|
1686
|
-
value.Value = ret;
|
|
1687
|
-
return ret;
|
|
1688
|
-
});
|
|
1689
|
-
};
|
|
1690
|
-
}
|
|
1691
|
-
});
|
|
1692
|
-
return naturalized;
|
|
1688
|
+
return addRetrieveBulkDataNaturalized(naturalized);
|
|
1693
1689
|
};
|
|
1694
1690
|
|
|
1695
1691
|
// Async load series, store as retrieved
|
|
@@ -1810,6 +1806,41 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
|
|
|
1810
1806
|
return src/* IWebApiDataSource */.Is.create(implementation);
|
|
1811
1807
|
}
|
|
1812
1808
|
|
|
1809
|
+
/**
|
|
1810
|
+
* A bindable function that retrieves the bulk data against this as the
|
|
1811
|
+
* dicomweb client, and on the given value element.
|
|
1812
|
+
*
|
|
1813
|
+
* @param value - a bind value that stores the retrieve value to short circuit the
|
|
1814
|
+
* next retrieve instance.
|
|
1815
|
+
* @param options - to allow specifying the content type.
|
|
1816
|
+
*/
|
|
1817
|
+
function retrieveBulkData(value, options = {}) {
|
|
1818
|
+
const {
|
|
1819
|
+
mediaType
|
|
1820
|
+
} = options;
|
|
1821
|
+
const useOptions = {
|
|
1822
|
+
// The bulkdata fetches work with either multipart or
|
|
1823
|
+
// singlepart, so set multipart to false to let the server
|
|
1824
|
+
// decide which type to respond with.
|
|
1825
|
+
multipart: false,
|
|
1826
|
+
BulkDataURI: value.BulkDataURI,
|
|
1827
|
+
mediaTypes: mediaType ? [{
|
|
1828
|
+
mediaType
|
|
1829
|
+
}, {
|
|
1830
|
+
mediaType: 'application/octet-stream'
|
|
1831
|
+
}] : undefined,
|
|
1832
|
+
...options
|
|
1833
|
+
};
|
|
1834
|
+
return this.retrieveBulkData(useOptions).then(val => {
|
|
1835
|
+
// There are DICOM PDF cases where the first ArrayBuffer in the array is
|
|
1836
|
+
// the bulk data and DICOM video cases where the second ArrayBuffer is
|
|
1837
|
+
// the bulk data. Here we play it safe and do a find.
|
|
1838
|
+
const ret = val instanceof Array && val.find(arrayBuffer => arrayBuffer?.byteLength) || undefined;
|
|
1839
|
+
value.Value = ret;
|
|
1840
|
+
return ret;
|
|
1841
|
+
});
|
|
1842
|
+
}
|
|
1843
|
+
|
|
1813
1844
|
;// CONCATENATED MODULE: ../../../extensions/default/src/DicomJSONDataSource/index.js
|
|
1814
1845
|
|
|
1815
1846
|
|
|
@@ -2854,8 +2885,8 @@ function ViewerHeader({
|
|
|
2854
2885
|
hotkeyDefinitions,
|
|
2855
2886
|
hotkeyDefaults
|
|
2856
2887
|
} = hotkeysManager;
|
|
2857
|
-
const versionNumber = "3.9.0-beta.
|
|
2858
|
-
const commitHash = "
|
|
2888
|
+
const versionNumber = "3.9.0-beta.78";
|
|
2889
|
+
const commitHash = "7599ec9421129dcade94e6fa6ec7908424ab3134";
|
|
2859
2890
|
const menuOptions = [{
|
|
2860
2891
|
title: t('Header:About'),
|
|
2861
2892
|
icon: 'info',
|
|
@@ -4188,14 +4219,6 @@ function getPanelModule({
|
|
|
4188
4219
|
}];
|
|
4189
4220
|
}
|
|
4190
4221
|
/* harmony default export */ const src_getPanelModule = (getPanelModule);
|
|
4191
|
-
// EXTERNAL MODULE: ../../core/src/utils/isImage.js
|
|
4192
|
-
var isImage = __webpack_require__(74440);
|
|
4193
|
-
// EXTERNAL MODULE: ../../core/src/utils/sopClassDictionary.js
|
|
4194
|
-
var sopClassDictionary = __webpack_require__(66050);
|
|
4195
|
-
// EXTERNAL MODULE: ../../core/src/classes/ImageSet.ts
|
|
4196
|
-
var ImageSet = __webpack_require__(15337);
|
|
4197
|
-
// EXTERNAL MODULE: ../../core/src/utils/isDisplaySetReconstructable.js
|
|
4198
|
-
var isDisplaySetReconstructable = __webpack_require__(74824);
|
|
4199
4222
|
;// CONCATENATED MODULE: ../../../extensions/default/package.json
|
|
4200
4223
|
const package_namespaceObject = JSON.parse('{"u2":"@ohif/extension-default"}');
|
|
4201
4224
|
;// CONCATENATED MODULE: ../../../extensions/default/src/id.js
|
|
@@ -4204,6 +4227,8 @@ const id = package_namespaceObject.u2;
|
|
|
4204
4227
|
|
|
4205
4228
|
// EXTERNAL MODULE: ../../core/src/utils/sortInstancesByPosition.ts
|
|
4206
4229
|
var sortInstancesByPosition = __webpack_require__(87134);
|
|
4230
|
+
// EXTERNAL MODULE: ../../core/src/utils/isDisplaySetReconstructable.js
|
|
4231
|
+
var isDisplaySetReconstructable = __webpack_require__(74824);
|
|
4207
4232
|
;// CONCATENATED MODULE: ../../../extensions/default/src/utils/validations/checkMultiframe.ts
|
|
4208
4233
|
|
|
4209
4234
|
|
|
@@ -4487,6 +4512,8 @@ function getDisplaySetMessages(instances, isReconstructable, isDynamicVolume) {
|
|
|
4487
4512
|
}
|
|
4488
4513
|
return messages;
|
|
4489
4514
|
}
|
|
4515
|
+
// EXTERNAL MODULE: ../../core/src/classes/ImageSet.ts
|
|
4516
|
+
var ImageSet = __webpack_require__(15337);
|
|
4490
4517
|
;// CONCATENATED MODULE: ../../../extensions/default/src/getDisplaySetsFromUnsupportedSeries.js
|
|
4491
4518
|
|
|
4492
4519
|
|
|
@@ -4603,9 +4630,14 @@ const chartHandler = {
|
|
|
4603
4630
|
|
|
4604
4631
|
|
|
4605
4632
|
|
|
4606
|
-
|
|
4607
|
-
|
|
4608
|
-
|
|
4633
|
+
const {
|
|
4634
|
+
isImage,
|
|
4635
|
+
sopClassDictionary,
|
|
4636
|
+
isDisplaySetReconstructable: getSopClassHandlerModule_isDisplaySetReconstructable
|
|
4637
|
+
} = src.utils;
|
|
4638
|
+
const {
|
|
4639
|
+
ImageSet: getSopClassHandlerModule_ImageSet
|
|
4640
|
+
} = src.classes;
|
|
4609
4641
|
const DEFAULT_VOLUME_LOADER_SCHEME = 'cornerstoneStreamingImageVolume';
|
|
4610
4642
|
const DYNAMIC_VOLUME_LOADER_SCHEME = 'cornerstoneStreamingDynamicImageVolume';
|
|
4611
4643
|
const sopClassHandlerName = 'stack';
|
|
@@ -4646,9 +4678,9 @@ function getDisplaySetInfo(instances) {
|
|
|
4646
4678
|
// O(n) to convert it into a map and O(1) to find each instance
|
|
4647
4679
|
instances.forEach(instance => instancesMap.set(instance.imageId, instance));
|
|
4648
4680
|
const firstTimePointInstances = timePoint.map(imageId => instancesMap.get(imageId));
|
|
4649
|
-
displaySetInfo = (
|
|
4681
|
+
displaySetInfo = getSopClassHandlerModule_isDisplaySetReconstructable(firstTimePointInstances, appConfig);
|
|
4650
4682
|
} else {
|
|
4651
|
-
displaySetInfo = (
|
|
4683
|
+
displaySetInfo = getSopClassHandlerModule_isDisplaySetReconstructable(instances, appConfig);
|
|
4652
4684
|
}
|
|
4653
4685
|
return {
|
|
4654
4686
|
isDynamicVolume,
|
|
@@ -4658,7 +4690,7 @@ function getDisplaySetInfo(instances) {
|
|
|
4658
4690
|
}
|
|
4659
4691
|
const makeDisplaySet = instances => {
|
|
4660
4692
|
const instance = instances[0];
|
|
4661
|
-
const imageSet = new
|
|
4693
|
+
const imageSet = new getSopClassHandlerModule_ImageSet(instances);
|
|
4662
4694
|
const {
|
|
4663
4695
|
isDynamicVolume,
|
|
4664
4696
|
value: isReconstructable,
|
|
@@ -4753,7 +4785,7 @@ function getDisplaySetsFromSeries(instances) {
|
|
|
4753
4785
|
const stackableInstances = [];
|
|
4754
4786
|
instances.forEach(instance => {
|
|
4755
4787
|
// All imaging modalities must have a valid value for sopClassUid (x00080016) or rows (x00280010)
|
|
4756
|
-
if (!
|
|
4788
|
+
if (!isImage(instance.SOPClassUID) && !instance.Rows) {
|
|
4757
4789
|
return;
|
|
4758
4790
|
}
|
|
4759
4791
|
let displaySet;
|
|
@@ -4761,7 +4793,6 @@ function getDisplaySetsFromSeries(instances) {
|
|
|
4761
4793
|
displaySet = makeDisplaySet([instance]);
|
|
4762
4794
|
displaySet.setAttributes({
|
|
4763
4795
|
sopClassUids,
|
|
4764
|
-
isClip: true,
|
|
4765
4796
|
numImageFrames: instance.NumberOfFrames,
|
|
4766
4797
|
instanceNumber: instance.InstanceNumber,
|
|
4767
4798
|
acquisitionDatetime: instance.AcquisitionDateTime
|
|
@@ -4789,7 +4820,10 @@ function getDisplaySetsFromSeries(instances) {
|
|
|
4789
4820
|
}
|
|
4790
4821
|
return displaySets;
|
|
4791
4822
|
}
|
|
4792
|
-
const getSopClassHandlerModule_sopClassUids = [sopClassDictionary
|
|
4823
|
+
const getSopClassHandlerModule_sopClassUids = [sopClassDictionary.ComputedRadiographyImageStorage, sopClassDictionary.DigitalXRayImageStorageForPresentation, sopClassDictionary.DigitalXRayImageStorageForProcessing, sopClassDictionary.DigitalMammographyXRayImageStorageForPresentation, sopClassDictionary.DigitalMammographyXRayImageStorageForProcessing, sopClassDictionary.DigitalIntraOralXRayImageStorageForPresentation, sopClassDictionary.DigitalIntraOralXRayImageStorageForProcessing, sopClassDictionary.CTImageStorage, sopClassDictionary.EnhancedCTImageStorage, sopClassDictionary.LegacyConvertedEnhancedCTImageStorage, sopClassDictionary.UltrasoundMultiframeImageStorage, sopClassDictionary.MRImageStorage, sopClassDictionary.EnhancedMRImageStorage, sopClassDictionary.EnhancedMRColorImageStorage, sopClassDictionary.LegacyConvertedEnhancedMRImageStorage, sopClassDictionary.UltrasoundImageStorage, sopClassDictionary.UltrasoundImageStorageRET, sopClassDictionary.SecondaryCaptureImageStorage, sopClassDictionary.MultiframeSingleBitSecondaryCaptureImageStorage, sopClassDictionary.MultiframeGrayscaleByteSecondaryCaptureImageStorage, sopClassDictionary.MultiframeGrayscaleWordSecondaryCaptureImageStorage, sopClassDictionary.MultiframeTrueColorSecondaryCaptureImageStorage, sopClassDictionary.XRayAngiographicImageStorage, sopClassDictionary.EnhancedXAImageStorage, sopClassDictionary.XRayRadiofluoroscopicImageStorage, sopClassDictionary.EnhancedXRFImageStorage, sopClassDictionary.XRay3DAngiographicImageStorage, sopClassDictionary.XRay3DCraniofacialImageStorage, sopClassDictionary.BreastTomosynthesisImageStorage, sopClassDictionary.BreastProjectionXRayImageStorageForPresentation, sopClassDictionary.BreastProjectionXRayImageStorageForProcessing, sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForPresentation, sopClassDictionary.IntravascularOpticalCoherenceTomographyImageStorageForProcessing, sopClassDictionary.NuclearMedicineImageStorage, sopClassDictionary.VLEndoscopicImageStorage, sopClassDictionary.VideoEndoscopicImageStorage, sopClassDictionary.VLMicroscopicImageStorage, sopClassDictionary.VideoMicroscopicImageStorage, sopClassDictionary.VLSlideCoordinatesMicroscopicImageStorage, sopClassDictionary.VLPhotographicImageStorage, sopClassDictionary.VideoPhotographicImageStorage, sopClassDictionary.OphthalmicPhotography8BitImageStorage, sopClassDictionary.OphthalmicPhotography16BitImageStorage, sopClassDictionary.OphthalmicTomographyImageStorage,
|
|
4824
|
+
// Handled by another sop class module
|
|
4825
|
+
// sopClassDictionary.VLWholeSlideMicroscopyImageStorage,
|
|
4826
|
+
sopClassDictionary.PositronEmissionTomographyImageStorage, sopClassDictionary.EnhancedPETImageStorage, sopClassDictionary.LegacyConvertedEnhancedPETImageStorage, sopClassDictionary.RTImageStorage, sopClassDictionary.EnhancedUSVolumeStorage];
|
|
4793
4827
|
function getSopClassHandlerModule(appContextParam) {
|
|
4794
4828
|
appContext = appContextParam;
|
|
4795
4829
|
return [{
|
|
@@ -8814,9 +8848,78 @@ const handlePETImageMetadata = ({
|
|
|
8814
8848
|
console.log(error);
|
|
8815
8849
|
}
|
|
8816
8850
|
};
|
|
8851
|
+
;// CONCATENATED MODULE: ../../../extensions/default/src/DicomWebDataSource/utils/cleanDenaturalizedDataset.ts
|
|
8852
|
+
|
|
8853
|
+
function isPrimitive(v) {
|
|
8854
|
+
return !(typeof v == 'object' || Array.isArray(v));
|
|
8855
|
+
}
|
|
8856
|
+
const vrNumerics = new Set(['DS', 'FL', 'FD', 'IS', 'OD', 'OF', 'OL', 'OV', 'SL', 'SS', 'SV', 'UL', 'US', 'UV']);
|
|
8857
|
+
|
|
8858
|
+
/**
|
|
8859
|
+
* Specialized for DICOM JSON format dataset cleaning.
|
|
8860
|
+
* @param obj
|
|
8861
|
+
* @returns
|
|
8862
|
+
*/
|
|
8863
|
+
function cleanDenaturalizedDataset(obj, options) {
|
|
8864
|
+
if (Array.isArray(obj)) {
|
|
8865
|
+
const newAry = obj.map(o => isPrimitive(o) ? o : cleanDenaturalizedDataset(o, options));
|
|
8866
|
+
return newAry;
|
|
8867
|
+
}
|
|
8868
|
+
if (isPrimitive(obj)) {
|
|
8869
|
+
return obj;
|
|
8870
|
+
}
|
|
8871
|
+
Object.keys(obj).forEach(key => {
|
|
8872
|
+
if (obj[key].Value === null && obj[key].vr) {
|
|
8873
|
+
delete obj[key].Value;
|
|
8874
|
+
} else if (Array.isArray(obj[key].Value) && obj[key].vr) {
|
|
8875
|
+
if (obj[key].Value.length === 1 && obj[key].Value[0].BulkDataURI) {
|
|
8876
|
+
if (options?.dataSourceConfig) {
|
|
8877
|
+
// Not needed unless data source is directly used for loading data.
|
|
8878
|
+
fixBulkDataURI(obj[key].Value[0], options, options.dataSourceConfig);
|
|
8879
|
+
}
|
|
8880
|
+
obj[key].BulkDataURI = obj[key].Value[0].BulkDataURI;
|
|
8881
|
+
|
|
8882
|
+
// prevent mixed-content blockage
|
|
8883
|
+
if (window.location.protocol === 'https:' && obj[key].BulkDataURI.startsWith('http:')) {
|
|
8884
|
+
obj[key].BulkDataURI = obj[key].BulkDataURI.replace('http:', 'https:');
|
|
8885
|
+
}
|
|
8886
|
+
delete obj[key].Value;
|
|
8887
|
+
} else if (vrNumerics.has(obj[key].vr)) {
|
|
8888
|
+
obj[key].Value = obj[key].Value.map(v => +v);
|
|
8889
|
+
} else {
|
|
8890
|
+
obj[key].Value = obj[key].Value.map(entry => cleanDenaturalizedDataset(entry, options));
|
|
8891
|
+
}
|
|
8892
|
+
}
|
|
8893
|
+
});
|
|
8894
|
+
return obj;
|
|
8895
|
+
}
|
|
8896
|
+
|
|
8897
|
+
/**
|
|
8898
|
+
* This is required to make the denaturalized data transferrable when it has
|
|
8899
|
+
* added proxy values.
|
|
8900
|
+
*/
|
|
8901
|
+
function transferDenaturalizedDataset(dataset) {
|
|
8902
|
+
const noNull = cleanDenaturalizedDataset(dataset);
|
|
8903
|
+
return JSON.parse(JSON.stringify(noNull));
|
|
8904
|
+
}
|
|
8905
|
+
;// CONCATENATED MODULE: ../../../extensions/default/src/DicomWebDataSource/utils/fixMultiValueKeys.ts
|
|
8906
|
+
/**
|
|
8907
|
+
* Fix multi-valued keys so that those which are strings split by
|
|
8908
|
+
* a backslash are returned as arrays.
|
|
8909
|
+
*/
|
|
8910
|
+
function fixMultiValueKeys(naturalData, keys = ['ImageType']) {
|
|
8911
|
+
for (const key of keys) {
|
|
8912
|
+
if (typeof naturalData[key] === 'string') {
|
|
8913
|
+
naturalData[key] = naturalData[key].split('\\');
|
|
8914
|
+
}
|
|
8915
|
+
}
|
|
8916
|
+
return naturalData;
|
|
8917
|
+
}
|
|
8817
8918
|
;// CONCATENATED MODULE: ../../../extensions/default/src/DicomWebDataSource/utils/index.ts
|
|
8818
8919
|
|
|
8819
8920
|
|
|
8921
|
+
|
|
8922
|
+
|
|
8820
8923
|
;// CONCATENATED MODULE: ../../../extensions/default/src/index.ts
|
|
8821
8924
|
|
|
8822
8925
|
|
|
@@ -8835,6 +8938,7 @@ const handlePETImageMetadata = ({
|
|
|
8835
8938
|
|
|
8836
8939
|
|
|
8837
8940
|
|
|
8941
|
+
|
|
8838
8942
|
const defaultExtension = {
|
|
8839
8943
|
/**
|
|
8840
8944
|
* Only required property. Should be a unique value across all extensions.
|
|
@@ -23,9 +23,12 @@ const SOPClassHandlerId = `${id}.sopClassHandlerModule.dicom-video`;
|
|
|
23
23
|
|
|
24
24
|
// EXTERNAL MODULE: ../../core/src/index.ts + 74 modules
|
|
25
25
|
var src = __webpack_require__(84793);
|
|
26
|
+
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 1 modules
|
|
27
|
+
var esm = __webpack_require__(12651);
|
|
26
28
|
;// CONCATENATED MODULE: ../../../extensions/dicom-video/src/getSopClassHandlerModule.js
|
|
27
29
|
|
|
28
30
|
|
|
31
|
+
|
|
29
32
|
const SOP_CLASS_UIDS = {
|
|
30
33
|
VIDEO_MICROSCOPIC_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.77.1.2.1',
|
|
31
34
|
VIDEO_PHOTOGRAPHIC_IMAGE_STORAGE: '1.2.840.10008.5.1.4.1.1.77.1.4.1',
|
|
@@ -64,7 +67,8 @@ const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager)
|
|
|
64
67
|
const {
|
|
65
68
|
Modality,
|
|
66
69
|
SOPInstanceUID,
|
|
67
|
-
SeriesDescription = 'VIDEO'
|
|
70
|
+
SeriesDescription = 'VIDEO',
|
|
71
|
+
imageId
|
|
68
72
|
} = instance;
|
|
69
73
|
const {
|
|
70
74
|
SeriesNumber,
|
|
@@ -93,7 +97,10 @@ const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager)
|
|
|
93
97
|
SOPClassHandlerId: SOPClassHandlerId,
|
|
94
98
|
referencedImages: null,
|
|
95
99
|
measurements: null,
|
|
100
|
+
viewportType: esm.Enums.ViewportType.VIDEO,
|
|
101
|
+
// The videoUrl is deprecated, the preferred URL is renderedUrl
|
|
96
102
|
videoUrl,
|
|
103
|
+
renderedUrl: videoUrl,
|
|
97
104
|
instances: [instance],
|
|
98
105
|
thumbnailSrc: dataSource.retrieve.directURL({
|
|
99
106
|
instance,
|
|
@@ -101,12 +108,19 @@ const _getDisplaySetsFromSeries = (instances, servicesManager, extensionManager)
|
|
|
101
108
|
defaultType: 'image/jpeg',
|
|
102
109
|
tag: 'Absent'
|
|
103
110
|
}),
|
|
111
|
+
imageIds: [imageId],
|
|
104
112
|
isDerivedDisplaySet: true,
|
|
105
113
|
isLoaded: false,
|
|
106
114
|
sopClassUids,
|
|
107
115
|
numImageFrames: NumberOfFrames,
|
|
108
116
|
instance
|
|
109
117
|
};
|
|
118
|
+
esm.utilities.genericMetadataProvider.add(imageId, {
|
|
119
|
+
type: 'imageUrlModule',
|
|
120
|
+
metadata: {
|
|
121
|
+
rendered: videoUrl
|
|
122
|
+
}
|
|
123
|
+
});
|
|
110
124
|
return displaySet;
|
|
111
125
|
});
|
|
112
126
|
};
|
|
@@ -273,7 +273,9 @@ function modeFactory({
|
|
|
273
273
|
rightPanels: ['@ohif/extension-dicom-microscopy.panelModule.measure'],
|
|
274
274
|
viewports: [{
|
|
275
275
|
namespace: '@ohif/extension-dicom-microscopy.viewportModule.microscopy-dicom',
|
|
276
|
-
displaySetsToDisplay: [
|
|
276
|
+
displaySetsToDisplay: [
|
|
277
|
+
// Share the sop class handler with cornerstone version of it
|
|
278
|
+
'@ohif/extension-cornerstone.sopClassHandlerModule.DicomMicroscopySopClassHandler', '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler']
|
|
277
279
|
}, {
|
|
278
280
|
namespace: dicomvideo.viewport,
|
|
279
281
|
displaySetsToDisplay: [dicomvideo.sopClassHandler]
|
|
@@ -287,11 +289,7 @@ function modeFactory({
|
|
|
287
289
|
}],
|
|
288
290
|
extensions: extensionDependencies,
|
|
289
291
|
hangingProtocol: ['default'],
|
|
290
|
-
|
|
291
|
-
// the same sop class under different situations. In that case, the more
|
|
292
|
-
// general handler needs to come last. For this case, the dicomvideo must
|
|
293
|
-
// come first to remove video transfer syntax before ohif uses images
|
|
294
|
-
sopClassHandlers: ['@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySopClassHandler', '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler', dicomvideo.sopClassHandler, dicompdf.sopClassHandler],
|
|
292
|
+
sopClassHandlers: ['@ohif/extension-cornerstone.sopClassHandlerModule.DicomMicroscopySopClassHandler', '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler', dicomvideo.sopClassHandler, dicompdf.sopClassHandler],
|
|
295
293
|
hotkeys: [...src/* hotkeys */.dD.defaults.hotkeyBindings],
|
|
296
294
|
...modeConfiguration
|
|
297
295
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[
|
|
2
|
+
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[79,4757],{
|
|
3
3
|
|
|
4
|
-
/***/
|
|
4
|
+
/***/ 30365:
|
|
5
5
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
6
6
|
|
|
7
7
|
// ESM COMPAT FLAG
|
|
@@ -19,6 +19,8 @@ var prop_types = __webpack_require__(3827);
|
|
|
19
19
|
var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
|
|
20
20
|
// EXTERNAL MODULE: ../../ui/src/index.js + 784 modules
|
|
21
21
|
var src = __webpack_require__(38604);
|
|
22
|
+
// EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 95 modules
|
|
23
|
+
var default_src = __webpack_require__(10655);
|
|
22
24
|
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/DicomMicroscopyViewport.css
|
|
23
25
|
// extracted by mini-css-extract-plugin
|
|
24
26
|
|
|
@@ -253,8 +255,6 @@ const itemGenerator = props => {
|
|
|
253
255
|
/* harmony default export */ const ViewportOverlay = (generateFromConfig({}));
|
|
254
256
|
// EXTERNAL MODULE: ../../core/src/index.ts + 74 modules
|
|
255
257
|
var core_src = __webpack_require__(84793);
|
|
256
|
-
// EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 93 modules
|
|
257
|
-
var default_src = __webpack_require__(32281);
|
|
258
258
|
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/utils/dicomWebClient.ts
|
|
259
259
|
|
|
260
260
|
|
|
@@ -328,48 +328,6 @@ function getDicomWebClient({
|
|
|
328
328
|
}
|
|
329
329
|
// EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
|
|
330
330
|
var dcmjs_es = __webpack_require__(67540);
|
|
331
|
-
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/utils/cleanDenaturalizedDataset.ts
|
|
332
|
-
|
|
333
|
-
function isPrimitive(v) {
|
|
334
|
-
return !(typeof v == 'object' || Array.isArray(v));
|
|
335
|
-
}
|
|
336
|
-
const vrNumerics = ['DS', 'FL', 'FD', 'IS', 'OD', 'OF', 'OL', 'OV', 'SL', 'SS', 'SV', 'UL', 'US', 'UV'];
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Specialized for DICOM JSON format dataset cleaning.
|
|
340
|
-
* @param obj
|
|
341
|
-
* @returns
|
|
342
|
-
*/
|
|
343
|
-
function cleanDenaturalizedDataset(obj, options) {
|
|
344
|
-
if (Array.isArray(obj)) {
|
|
345
|
-
const newAry = obj.map(o => isPrimitive(o) ? o : cleanDenaturalizedDataset(o, options));
|
|
346
|
-
return newAry;
|
|
347
|
-
} else if (isPrimitive(obj)) {
|
|
348
|
-
return obj;
|
|
349
|
-
} else {
|
|
350
|
-
Object.keys(obj).forEach(key => {
|
|
351
|
-
if (obj[key].Value === null && obj[key].vr) {
|
|
352
|
-
delete obj[key].Value;
|
|
353
|
-
} else if (Array.isArray(obj[key].Value) && obj[key].vr) {
|
|
354
|
-
if (obj[key].Value.length === 1 && obj[key].Value[0].BulkDataURI) {
|
|
355
|
-
default_src.dicomWebUtils.fixBulkDataURI(obj[key].Value[0], options, options.dataSourceConfig);
|
|
356
|
-
obj[key].BulkDataURI = obj[key].Value[0].BulkDataURI;
|
|
357
|
-
|
|
358
|
-
// prevent mixed-content blockage
|
|
359
|
-
if (window.location.protocol === 'https:' && obj[key].BulkDataURI.startsWith('http:')) {
|
|
360
|
-
obj[key].BulkDataURI = obj[key].BulkDataURI.replace('http:', 'https:');
|
|
361
|
-
}
|
|
362
|
-
delete obj[key].Value;
|
|
363
|
-
} else if (vrNumerics.includes(obj[key].vr)) {
|
|
364
|
-
obj[key].Value = obj[key].Value.map(v => +v);
|
|
365
|
-
} else {
|
|
366
|
-
obj[key].Value = obj[key].Value.map(entry => cleanDenaturalizedDataset(entry, options));
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
});
|
|
370
|
-
return obj;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
331
|
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/DicomMicroscopyViewport.tsx
|
|
374
332
|
|
|
375
333
|
|
|
@@ -495,7 +453,7 @@ class DicomMicroscopyViewport extends react.Component {
|
|
|
495
453
|
// NOTE: depending on different data source, image.ImageType sometimes
|
|
496
454
|
// is a string, not a string array.
|
|
497
455
|
m.ImageType = typeof m.ImageType === 'string' ? m.ImageType.split('\\') : m.ImageType;
|
|
498
|
-
const inst = cleanDenaturalizedDataset(dcmjs_es["default"].data.DicomMetaDictionary.denaturalizeDataset(m), {
|
|
456
|
+
const inst = (0,default_src.cleanDenaturalizedDataset)(dcmjs_es["default"].data.DicomMetaDictionary.denaturalizeDataset(m), {
|
|
499
457
|
StudyInstanceUID: m.StudyInstanceUID,
|
|
500
458
|
SeriesInstanceUID: m.SeriesInstanceUID,
|
|
501
459
|
dataSourceConfig: this.props.dataSource.getConfig()
|