@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.
Files changed (44) hide show
  1. package/dist/{1169.bundle.a3d3d310f1d8d7e335bf.js → 1169.bundle.d32f38ab5aa329346850.js} +46 -106
  2. package/dist/{1202.bundle.1468f0e71fea0c593081.js → 1202.bundle.55f140afb05e1ad5512c.js} +503 -153
  3. package/dist/{2568.css → 1540.css} +1 -0
  4. package/dist/{1994.bundle.d347a831c1be751d0627.js → 1994.bundle.083fb36bc0648f2dbda6.js} +3 -3
  5. package/dist/{9824.bundle.e16a5ef35eedfa74b3be.js → 2119.bundle.3446480f91f1200cd45c.js} +4 -4
  6. package/dist/{9824.css → 2119.css} +1 -0
  7. package/dist/{2650.bundle.1f7d90198b9e361dfb9c.js → 2650.bundle.feb3b241748314884ae4.js} +57 -35
  8. package/dist/{3117.bundle.c83d0f403d17104a7c4c.js → 3117.bundle.463d5fa4671a93939d36.js} +8 -7
  9. package/dist/{4210.bundle.fb376c67d110f8177eea.js → 4210.bundle.38eb5056ac41a0b04d21.js} +2 -2
  10. package/dist/{4842.bundle.619edd60983634d9f8dd.js → 4842.bundle.0427b8aa1b52aa050ed2.js} +12 -8
  11. package/dist/{5888.bundle.91227a2efe569869fdd0.js → 5888.bundle.ebca6329037cf353968f.js} +14 -7
  12. package/dist/{2417.bundle.4a0334c8c4047005979e.js → 5898.bundle.be696e0b355efc1c7f05.js} +1947 -1
  13. package/dist/{2281.bundle.216a0d86eaed7f4870ae.js → 655.bundle.28f107410332c62993a3.js} +170 -66
  14. package/dist/{6591.bundle.ace15b11ac7df3edf1bb.js → 6591.bundle.92a28f98c3f45ac3b3f1.js} +15 -1
  15. package/dist/{7502.bundle.abf1ade64f101ba01596.js → 7502.bundle.550aee57ecd221eab7c1.js} +4 -6
  16. package/dist/{3424.bundle.1b6101d721148c04242b.js → 79.bundle.b03daeeef3e6faf9dca3.js} +5 -47
  17. package/dist/{8993.bundle.256bb3c84d2564a5f3cf.js → 8993.bundle.23cd5f8560800a97d798.js} +39 -32
  18. package/dist/{2065.bundle.5d8f4c26b1fa393e26a4.js → 8999.bundle.e23beb310b14ca9ded76.js} +13 -133
  19. package/dist/{9579.bundle.7212d7a737a71bb61502.js → 9579.bundle.f9c9be0c5ab6cddbde3d.js} +8 -7
  20. package/dist/{5516.bundle.074fac92088b103bf0e3.js → 962.bundle.04afab064299df16f869.js} +408 -179
  21. package/dist/app-config.js +1 -0
  22. package/dist/{app.bundle.016cbb7783086e131b26.js → app.bundle.53faac5b01b67714fad2.js} +658 -352
  23. package/dist/index.html +1 -1
  24. package/dist/{polySeg.bundle.40b9a8c9006bb15691ee.js → polySeg.bundle.0a70e65fe89169ec7508.js} +1 -1
  25. package/dist/{suv-peak-worker.bundle.a70e70b9ef87c18b896c.js → suv-peak-worker.bundle.54d68bc1808ad3d77994.js} +1 -1
  26. package/dist/sw.js +1 -1
  27. package/package.json +18 -18
  28. package/dist/7604.bundle.42d3f08efb3a9eae4581.js +0 -1950
  29. package/dist/{1498.bundle.d8f5281952d09c57ef87.js → 1498.bundle.a2d05ac1f27d0c2d2c9f.js} +0 -0
  30. package/dist/{153.bundle.35f9f8c81db7a40221cf.js → 153.bundle.3ba838ef3c08a266ae35.js} +0 -0
  31. package/dist/{2791.bundle.29069810b8cf85d6aa0f.js → 2791.bundle.cfa27e4347069ab301b7.js} +0 -0
  32. package/dist/{3497.bundle.a04a2444975bf50fddf8.js → 3497.bundle.512610422a2862584c55.js} +0 -0
  33. package/dist/{3962.bundle.9a463bda1035e46ebbba.js → 3962.bundle.31bfadcde7f5a2dd8932.js} +0 -0
  34. package/dist/{4353.bundle.ac8577aa909c2c56db16.js → 4353.bundle.c13a0c72c607850ea3c0.js} +0 -0
  35. package/dist/{4978.bundle.19b43e91a7fe302599c6.js → 4978.bundle.655344cfd52d9f0641e5.js} +0 -0
  36. package/dist/{5793.bundle.eed3fe9019c31999efff.js → 5793.bundle.d1b4e887564bbb98752d.js} +0 -0
  37. package/dist/{6904.bundle.27abf08c0f2e4fe5e06d.js → 6904.bundle.da0d83fcd48a48cfaac1.js} +0 -0
  38. package/dist/{7246.bundle.11a6fa77c63c0df329bc.js → 7246.bundle.f1cbdd5ec9387bb6f8fe.js} +0 -0
  39. package/dist/{7360.bundle.114b1294460b2d9bfeb9.js → 7360.bundle.d0bdb43af1494bccc433.js} +0 -0
  40. package/dist/{7376.bundle.e9fea4789985d4409171.js → 7376.bundle.d6b445de2d468ab2e8b3.js} +0 -0
  41. package/dist/{3424.css → 79.css} +1 -1
  42. /package/dist/{7913.bundle.dc45c449f89985c7dd7c.js → 7913.bundle.353baac2e2a5b4bb330d.js} +0 -0
  43. /package/dist/{818.bundle.b64fae7e982e16a82ca2.js → 818.bundle.b6027359846cc90e32ff.js} +0 -0
  44. /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([[2281],{
2
+ (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[655],{
3
3
 
4
- /***/ 32281:
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
- fixBulkDataURI: () => (fixBulkDataURI)
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
- Object.keys(naturalized).forEach(key => {
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.76";
2858
- const commitHash = "ab6e341731652a4fa894fcb576eb23dc95aefa11";
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 = (0,isDisplaySetReconstructable/* default */.ZP)(firstTimePointInstances, appConfig);
4681
+ displaySetInfo = getSopClassHandlerModule_isDisplaySetReconstructable(firstTimePointInstances, appConfig);
4650
4682
  } else {
4651
- displaySetInfo = (0,isDisplaySetReconstructable/* default */.ZP)(instances, appConfig);
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 ImageSet/* default */.Z(instances);
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 (!(0,isImage/* isImage */.O)(instance.SOPClassUID) && !instance.Rows) {
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/* default */.Z.ComputedRadiographyImageStorage, sopClassDictionary/* default */.Z.DigitalXRayImageStorageForPresentation, sopClassDictionary/* default */.Z.DigitalXRayImageStorageForProcessing, sopClassDictionary/* default */.Z.DigitalMammographyXRayImageStorageForPresentation, sopClassDictionary/* default */.Z.DigitalMammographyXRayImageStorageForProcessing, sopClassDictionary/* default */.Z.DigitalIntraOralXRayImageStorageForPresentation, sopClassDictionary/* default */.Z.DigitalIntraOralXRayImageStorageForProcessing, sopClassDictionary/* default */.Z.CTImageStorage, sopClassDictionary/* default */.Z.EnhancedCTImageStorage, sopClassDictionary/* default */.Z.LegacyConvertedEnhancedCTImageStorage, sopClassDictionary/* default */.Z.UltrasoundMultiframeImageStorage, sopClassDictionary/* default */.Z.MRImageStorage, sopClassDictionary/* default */.Z.EnhancedMRImageStorage, sopClassDictionary/* default */.Z.EnhancedMRColorImageStorage, sopClassDictionary/* default */.Z.LegacyConvertedEnhancedMRImageStorage, sopClassDictionary/* default */.Z.UltrasoundImageStorage, sopClassDictionary/* default */.Z.UltrasoundImageStorageRET, sopClassDictionary/* default */.Z.SecondaryCaptureImageStorage, sopClassDictionary/* default */.Z.MultiframeSingleBitSecondaryCaptureImageStorage, sopClassDictionary/* default */.Z.MultiframeGrayscaleByteSecondaryCaptureImageStorage, sopClassDictionary/* default */.Z.MultiframeGrayscaleWordSecondaryCaptureImageStorage, sopClassDictionary/* default */.Z.MultiframeTrueColorSecondaryCaptureImageStorage, sopClassDictionary/* default */.Z.XRayAngiographicImageStorage, sopClassDictionary/* default */.Z.EnhancedXAImageStorage, sopClassDictionary/* default */.Z.XRayRadiofluoroscopicImageStorage, sopClassDictionary/* default */.Z.EnhancedXRFImageStorage, sopClassDictionary/* default */.Z.XRay3DAngiographicImageStorage, sopClassDictionary/* default */.Z.XRay3DCraniofacialImageStorage, sopClassDictionary/* default */.Z.BreastTomosynthesisImageStorage, sopClassDictionary/* default */.Z.BreastProjectionXRayImageStorageForPresentation, sopClassDictionary/* default */.Z.BreastProjectionXRayImageStorageForProcessing, sopClassDictionary/* default */.Z.IntravascularOpticalCoherenceTomographyImageStorageForPresentation, sopClassDictionary/* default */.Z.IntravascularOpticalCoherenceTomographyImageStorageForProcessing, sopClassDictionary/* default */.Z.NuclearMedicineImageStorage, sopClassDictionary/* default */.Z.VLEndoscopicImageStorage, sopClassDictionary/* default */.Z.VideoEndoscopicImageStorage, sopClassDictionary/* default */.Z.VLMicroscopicImageStorage, sopClassDictionary/* default */.Z.VideoMicroscopicImageStorage, sopClassDictionary/* default */.Z.VLSlideCoordinatesMicroscopicImageStorage, sopClassDictionary/* default */.Z.VLPhotographicImageStorage, sopClassDictionary/* default */.Z.VideoPhotographicImageStorage, sopClassDictionary/* default */.Z.OphthalmicPhotography8BitImageStorage, sopClassDictionary/* default */.Z.OphthalmicPhotography16BitImageStorage, sopClassDictionary/* default */.Z.OphthalmicTomographyImageStorage, sopClassDictionary/* default */.Z.VLWholeSlideMicroscopyImageStorage, sopClassDictionary/* default */.Z.PositronEmissionTomographyImageStorage, sopClassDictionary/* default */.Z.EnhancedPETImageStorage, sopClassDictionary/* default */.Z.LegacyConvertedEnhancedPETImageStorage, sopClassDictionary/* default */.Z.RTImageStorage, sopClassDictionary/* default */.Z.EnhancedUSVolumeStorage];
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: ['@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySopClassHandler', '@ohif/extension-dicom-microscopy.sopClassHandlerModule.DicomMicroscopySRSopClassHandler']
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
- // Order is important in sop class handlers when two handlers both use
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([[3424,4757],{
2
+ (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[79,4757],{
3
3
 
4
- /***/ 3094:
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()