@ohif/app 3.10.0-beta.10 → 3.10.0-beta.11

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 (32) hide show
  1. package/dist/{1185.bundle.e63cef8446357b933672.js → 1185.bundle.e55356926e8d9454db40.js} +48 -14
  2. package/dist/{1266.bundle.6ffa84cbf1408fcfd010.js → 1266.bundle.a2e42f1cfddb11c1c61e.js} +5 -0
  3. package/dist/{3200.bundle.efc18fabd0ffd53057ad.js → 3200.bundle.332c2c2bd1f6be83e770.js} +15 -7
  4. package/dist/{5247.bundle.dc1f8916871daa28d1ec.js → 5247.bundle.9b06781f63cea6959619.js} +2 -2
  5. package/dist/{1520.bundle.5ebd373bdb50045c845d.js → 5630.bundle.af4fa8fb9b6446cf2fe3.js} +70 -59
  6. package/dist/{7197.bundle.d65cb32c7302143947d9.js → 7197.bundle.da8537eb3e4cbbafa89b.js} +2 -2
  7. package/dist/{7955.bundle.408d0c295e30bc15ec21.js → 7955.bundle.dca4bc7c9f7215335324.js} +1 -1
  8. package/dist/{8228.bundle.0c1f0d650adb9be44119.js → 8228.bundle.159ad73e559a130f3c50.js} +2 -2
  9. package/dist/{9551.bundle.5fafcf2062ff29fcc7d4.js → 9551.bundle.5ae9c8495962d2789437.js} +1 -1
  10. package/dist/{app.bundle.a1b3010c5d6c12837e17.js → app.bundle.c7b6e9550b04753d8968.js} +56 -51
  11. package/dist/app.bundle.css +2 -2
  12. package/dist/index.html +1 -1
  13. package/dist/serve.json +1 -10
  14. package/dist/{suv-peak-worker.bundle.cad6eeb6d738dc482be2.js → suv-peak-worker.bundle.2b1dc60a3ca73b7f3b13.js} +1 -1
  15. package/dist/sw.js +1 -1
  16. package/package.json +19 -19
  17. /package/dist/{1374.bundle.833030ac08325d881c61.js → 1374.bundle.ea1d9a39e49be66902c7.js} +0 -0
  18. /package/dist/{213.bundle.f197401cd6547f6ff838.js → 213.bundle.125147974624d2293c38.js} +0 -0
  19. /package/dist/{2424.bundle.8dc654dd5b8a1ea90c90.js → 2424.bundle.8e6703e2978234c93dbe.js} +0 -0
  20. /package/dist/{2825.bundle.96074384e8e37e0e021e.js → 2825.bundle.b64d9890a8e1802e473c.js} +0 -0
  21. /package/dist/{3198.bundle.4482082ca49ae5eea878.js → 3198.bundle.8ead2c27c7668ec9cab0.js} +0 -0
  22. /package/dist/{4834.bundle.7ee289df357aa46f131c.js → 4834.bundle.e2c9e5a5654a5b42d833.js} +0 -0
  23. /package/dist/{5139.bundle.d8f900bab68939cfd9fa.js → 5139.bundle.81ce6842991d71c9dcec.js} +0 -0
  24. /package/dist/{5687.bundle.0e0b349a72046c0e37bf.js → 5687.bundle.1ab8ce294e4bf416bd6f.js} +0 -0
  25. /package/dist/{717.bundle.06d5b435702c14013575.js → 717.bundle.77ae17bcd6d05ab83f61.js} +0 -0
  26. /package/dist/{8008.bundle.6dd3113a5e440da583d1.js → 8008.bundle.fc5d2681e2b77983c90a.js} +0 -0
  27. /package/dist/{8104.bundle.e1a5126a7f7ba0e15fae.js → 8104.bundle.c531eb360d74b235704a.js} +0 -0
  28. /package/dist/{8259.bundle.61d6c45f3146ae624d3f.js → 8259.bundle.979eb68fe1e25107d805.js} +0 -0
  29. /package/dist/{8558.bundle.34b846e3b0f870ea33cb.js → 8558.bundle.c47e5e4892f4d21a0bc9.js} +0 -0
  30. /package/dist/{9611.bundle.bde27586a38e3b906f40.js → 9611.bundle.8a0208eb6b187c83e43b.js} +0 -0
  31. /package/dist/{9862.bundle.589cd2f5bf71e03152a1.js → 9862.bundle.c967a6f6ff9ba90811e6.js} +0 -0
  32. /package/dist/{9909.bundle.3d2b059390abcf2c925b.js → 9909.bundle.0a5f1ba3b82fae90def1.js} +0 -0
@@ -983,8 +983,8 @@ function initWADOImageLoader(userAuthenticationService, appConfig, extensionMana
983
983
  function destroy() {
984
984
  console.debug('Destroying WADO Image Loader');
985
985
  }
986
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 114 modules
987
- var default_src = __webpack_require__(71520);
986
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 115 modules
987
+ var default_src = __webpack_require__(55630);
988
988
  // EXTERNAL MODULE: ../../../extensions/cornerstone/src/state.ts
989
989
  var state = __webpack_require__(71353);
990
990
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/utils/getActiveViewportEnabledElement.ts
@@ -4408,9 +4408,9 @@ const initMeasurementService = (measurementService, displaySetService, cornersto
4408
4408
  /* Mappings */
4409
4409
  measurementService.addMapping(csTools3DVer1MeasurementSource, 'Length', Length.matchingCriteria, Length.toAnnotation, Length.toMeasurement);
4410
4410
  measurementService.addMapping(csTools3DVer1MeasurementSource, 'Crosshairs', Length.matchingCriteria, () => {
4411
- console.warn('Crosshairs mapping not implemented.');
4411
+ return null;
4412
4412
  }, () => {
4413
- console.warn('Crosshairs mapping not implemented.');
4413
+ return null;
4414
4414
  });
4415
4415
  measurementService.addMapping(csTools3DVer1MeasurementSource, 'Bidirectional', Bidirectional.matchingCriteria, Bidirectional.toAnnotation, Bidirectional.toMeasurement);
4416
4416
  measurementService.addMapping(csTools3DVer1MeasurementSource, 'EllipticalROI', EllipticalROI.matchingCriteria, EllipticalROI.toAnnotation, EllipticalROI.toMeasurement);
@@ -5278,7 +5278,7 @@ function interleaveTopToBottom({
5278
5278
  const AllRequests = [];
5279
5279
  volumes.forEach(volume => {
5280
5280
  const requests = volume.getImageLoadRequests();
5281
- if (!requests.length || !requests[0] || !requests[0].imageId) {
5281
+ if (!requests?.[0]?.imageId) {
5282
5282
  return;
5283
5283
  }
5284
5284
 
@@ -5652,6 +5652,8 @@ var useLutPresentationStore = __webpack_require__(10182);
5652
5652
  var usePositionPresentationStore = __webpack_require__(44646);
5653
5653
  // EXTERNAL MODULE: ../../../extensions/cornerstone/src/stores/useSegmentationPresentationStore.ts + 1 modules
5654
5654
  var useSegmentationPresentationStore = __webpack_require__(2847);
5655
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/utilities/index.js + 40 modules
5656
+ var esm_utilities = __webpack_require__(49035);
5655
5657
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/init.tsx
5656
5658
 
5657
5659
 
@@ -5674,6 +5676,7 @@ var useSegmentationPresentationStore = __webpack_require__(2847);
5674
5676
 
5675
5677
 
5676
5678
 
5679
+
5677
5680
 
5678
5681
 
5679
5682
  const {
@@ -5755,9 +5758,18 @@ async function init({
5755
5758
  const metadataProvider = src/* default.classes */.Ay.classes.MetadataProvider;
5756
5759
  esm.volumeLoader.registerVolumeLoader('cornerstoneStreamingImageVolume', loaders/* cornerstoneStreamingImageVolumeLoader */.FC);
5757
5760
  esm.volumeLoader.registerVolumeLoader('cornerstoneStreamingDynamicImageVolume', loaders/* cornerstoneStreamingDynamicImageVolumeLoader */.Mr);
5758
- hangingProtocolService.registerImageLoadStrategy('interleaveCenter', interleaveCenterLoader);
5759
- hangingProtocolService.registerImageLoadStrategy('interleaveTopToBottom', interleaveTopToBottom);
5760
- hangingProtocolService.registerImageLoadStrategy('nth', interleaveNthLoader);
5761
+
5762
+ // Register strategies using the wrapper
5763
+ const imageLoadStrategies = {
5764
+ interleaveCenter: interleaveCenterLoader,
5765
+ interleaveTopToBottom: interleaveTopToBottom,
5766
+ nth: interleaveNthLoader
5767
+ };
5768
+ Object.entries(imageLoadStrategies).forEach(([name, strategyFn]) => {
5769
+ hangingProtocolService.registerImageLoadStrategy(name, createMetadataWrappedStrategy(strategyFn));
5770
+ });
5771
+
5772
+ // ... existing code ...
5761
5773
 
5762
5774
  // add metadata providers
5763
5775
  esm.metaData.addProvider(esm.utilities.calibratedPixelSpacingMetadataProvider.get.bind(esm.utilities.calibratedPixelSpacingMetadataProvider)); // this provider is required for Calibration tool
@@ -5920,6 +5932,27 @@ function initializeWebWorkerProgressHandler(uiNotificationService) {
5920
5932
  }
5921
5933
  });
5922
5934
  }
5935
+
5936
+ /**
5937
+ * Creates a wrapped image load strategy with metadata handling
5938
+ * @param strategyFn - The image loading strategy function to wrap
5939
+ * @returns A wrapped strategy function that handles metadata configuration
5940
+ */
5941
+ const createMetadataWrappedStrategy = strategyFn => {
5942
+ return args => {
5943
+ const clonedConfig = esm_utilities.imageRetrieveMetadataProvider.clone();
5944
+ esm_utilities.imageRetrieveMetadataProvider.clear();
5945
+ try {
5946
+ const result = strategyFn(args);
5947
+ return result;
5948
+ } finally {
5949
+ // Ensure metadata is always restored, even if there's an error
5950
+ setTimeout(() => {
5951
+ esm_utilities.imageRetrieveMetadataProvider.restore(clonedConfig);
5952
+ }, 10);
5953
+ }
5954
+ };
5955
+ };
5923
5956
  function CPUModal() {
5924
5957
  return /*#__PURE__*/react.createElement("div", null, /*#__PURE__*/react.createElement("p", null, "Your computer does not have enough GPU power to support the default GPU rendering mode. OHIF has switched to CPU rendering mode. Please note that CPU rendering does not support all features such as Volume Rendering, Multiplanar Reconstruction, and Segmentation Overlays."));
5925
5958
  }
@@ -14154,6 +14187,11 @@ class CornerstoneViewportService extends src/* PubSubService */.Rc {
14154
14187
  id: viewportId
14155
14188
  }) => {
14156
14189
  const presentation = this._getPositionPresentation(viewportId);
14190
+
14191
+ // During a resize, the slice index should remain unchanged. This is a temporary fix for
14192
+ // a larger issue regarding the definition of slice index with slab thickness.
14193
+ // We need to revisit this to make it more robust and understandable.
14194
+ delete presentation.viewReference.sliceIndex;
14157
14195
  this.beforeResizePositionPresentations.set(viewportId, presentation);
14158
14196
  });
14159
14197
 
@@ -14162,7 +14200,7 @@ class CornerstoneViewportService extends src/* PubSubService */.Rc {
14162
14200
  renderingEngine.resize(isImmediate);
14163
14201
  renderingEngine.render();
14164
14202
 
14165
- // Reset the camera for viewports that should reset their camera on resize,
14203
+ // Reset the camera for all viewports using position presentation to maintain relative size/position
14166
14204
  // which means only those viewports that have a zoom level of 1.
14167
14205
  this.beforeResizePositionPresentations.forEach((positionPresentation, viewportId) => {
14168
14206
  this.setPresentations(viewportId, {
@@ -14919,10 +14957,6 @@ function getDicomMicroscopySopClassHandler({
14919
14957
  function getSopClassHandlerModule(params) {
14920
14958
  return [getDicomMicroscopySopClassHandler(params)];
14921
14959
  }
14922
- // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/utilities/index.js + 40 modules
14923
- var esm_utilities = __webpack_require__(49035);
14924
- // EXTERNAL MODULE: ../../../extensions/default/src/stores/useToggleOneUpViewportGridStore.ts
14925
- var useToggleOneUpViewportGridStore = __webpack_require__(73325);
14926
14960
  // EXTERNAL MODULE: ../../../node_modules/lodash.debounce/index.js
14927
14961
  var lodash_debounce = __webpack_require__(62051);
14928
14962
  var lodash_debounce_default = /*#__PURE__*/__webpack_require__.n(lodash_debounce);
@@ -16803,7 +16837,7 @@ const cornerstoneExtension = {
16803
16837
  useLutPresentationStore/* useLutPresentationStore */.I.getState().clearLutPresentationStore();
16804
16838
  usePositionPresentationStore/* usePositionPresentationStore */.q.getState().clearPositionPresentationStore();
16805
16839
  useSynchronizersStore/* useSynchronizersStore */.U.getState().clearSynchronizersStore();
16806
- useToggleOneUpViewportGridStore/* useToggleOneUpViewportGridStore */.Y.getState().clearToggleOneUpViewportGridStore();
16840
+ default_src.useToggleOneUpViewportGridStore.getState().clearToggleOneUpViewportGridStore();
16807
16841
  useSegmentationPresentationStore/* useSegmentationPresentationStore */.v.getState().clearSegmentationPresentationStore();
16808
16842
  segmentationService.removeAllSegmentations();
16809
16843
  },
@@ -762,6 +762,11 @@ const performCustomizations = customizationService => {
762
762
  id: 'PanelSegmentation.disableEditing',
763
763
  disableEditing: true
764
764
  }
765
+ // to only show current study in the panel study browser
766
+ // {
767
+ // id: 'PanelStudyBrowser.studyMode',
768
+ // mode: 'primary',
769
+ // },
765
770
  // To disable editing in the MeasurementTable
766
771
  // {
767
772
  // id: 'PanelMeasurement.disableEditing',
@@ -22,8 +22,8 @@ var es = __webpack_require__(70574);
22
22
  var react_es = __webpack_require__(95261);
23
23
  // EXTERNAL MODULE: ../../ui/src/index.js + 690 modules
24
24
  var src = __webpack_require__(35647);
25
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 114 modules
26
- var default_src = __webpack_require__(71520);
25
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 115 modules
26
+ var default_src = __webpack_require__(55630);
27
27
  ;// CONCATENATED MODULE: ../../../extensions/measurement-tracking/src/contexts/TrackedMeasurementsContext/measurementTrackingMachine.js
28
28
 
29
29
  const RESPONSE = {
@@ -1159,8 +1159,8 @@ var src = __webpack_require__(29463);
1159
1159
  var ui_src = __webpack_require__(35647);
1160
1160
  // EXTERNAL MODULE: ../../ui-next/src/index.ts + 2483 modules
1161
1161
  var ui_next_src = __webpack_require__(35570);
1162
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 114 modules
1163
- var default_src = __webpack_require__(71520);
1162
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 115 modules
1163
+ var default_src = __webpack_require__(55630);
1164
1164
  ;// CONCATENATED MODULE: ../../../extensions/measurement-tracking/src/panels/PanelStudyBrowserTracking/constants/actionIcons.ts
1165
1165
  const defaultActionIcons = [{
1166
1166
  id: 'settings',
@@ -1222,6 +1222,12 @@ function PanelStudyBrowserTracking({
1222
1222
  customizationService
1223
1223
  } = servicesManager.services;
1224
1224
  const navigate = (0,dist/* useNavigate */.Zp)();
1225
+ const {
1226
+ mode: studyMode
1227
+ } = customizationService.getCustomization('PanelStudyBrowser.studyMode', {
1228
+ id: 'default',
1229
+ mode: 'all'
1230
+ });
1225
1231
  const {
1226
1232
  t
1227
1233
  } = (0,es/* useTranslation */.Bd)('Common');
@@ -1238,7 +1244,7 @@ function PanelStudyBrowserTracking({
1238
1244
  isHangingProtocolLayout
1239
1245
  }, viewportGridService] = (0,ui_src/* useViewportGrid */.ih)();
1240
1246
  const [trackedMeasurements, sendTrackedMeasurementsEvent] = (0,getContextModule/* useTrackedMeasurements */.B)();
1241
- const [activeTabName, setActiveTabName] = (0,react.useState)('all');
1247
+ const [activeTabName, setActiveTabName] = (0,react.useState)(studyMode);
1242
1248
  const [expandedStudyInstanceUIDs, setExpandedStudyInstanceUIDs] = (0,react.useState)([...StudyInstanceUIDs]);
1243
1249
  const [studyDisplayList, setStudyDisplayList] = (0,react.useState)([]);
1244
1250
  const [hasLoadedViewports, setHasLoadedViewports] = (0,react.useState)(false);
@@ -1283,6 +1289,9 @@ function PanelStudyBrowserTracking({
1283
1289
  const {
1284
1290
  trackedSeries
1285
1291
  } = trackedMeasurements.context;
1292
+ (0,react.useEffect)(() => {
1293
+ setActiveTabName(studyMode);
1294
+ }, [studyMode]);
1286
1295
 
1287
1296
  // ~~ studyDisplayList
1288
1297
  (0,react.useEffect)(() => {
@@ -1604,7 +1613,6 @@ PanelStudyBrowserTracking.propTypes = {
1604
1613
  getStudiesForPatientByMRN: (prop_types_default()).func.isRequired,
1605
1614
  requestDisplaySetCreationForStudy: (prop_types_default()).func.isRequired
1606
1615
  };
1607
- /* harmony default export */ const PanelStudyBrowserTracking_PanelStudyBrowserTracking = (PanelStudyBrowserTracking);
1608
1616
  function getImageIdForThumbnail(displaySet, imageIds) {
1609
1617
  let imageId;
1610
1618
  if (displaySet.isDynamicVolume) {
@@ -1841,7 +1849,7 @@ function WrappedPanelStudyBrowserTracking({
1841
1849
  const _getStudiesForPatientByMRN = getStudiesForPatientByMRN.bind(null, dataSource);
1842
1850
  const _getImageSrcFromImageId = (0,react.useCallback)(_createGetImageSrcFromImageIdFn(extensionManager), []);
1843
1851
  const _requestDisplaySetCreationForStudy = PanelStudyBrowserTracking_requestDisplaySetCreationForStudy.bind(null, dataSource);
1844
- return /*#__PURE__*/react.createElement(PanelStudyBrowserTracking_PanelStudyBrowserTracking, {
1852
+ return /*#__PURE__*/react.createElement(PanelStudyBrowserTracking, {
1845
1853
  servicesManager: servicesManager,
1846
1854
  commandsManager: commandsManager,
1847
1855
  dataSource: dataSource,
@@ -1379,8 +1379,8 @@ MicroscopyService.REGISTRATION = servicesManager => {
1379
1379
 
1380
1380
  // EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
1381
1381
  var dcmjs_es = __webpack_require__(5842);
1382
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 114 modules
1383
- var default_src = __webpack_require__(71520);
1382
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 115 modules
1383
+ var default_src = __webpack_require__(55630);
1384
1384
  ;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/utils/DEVICE_OBSERVER_UID.js
1385
1385
  // We need to define a UID for this extension as a device, and it should be the same for all saves:
1386
1386
 
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (self["webpackChunk"] = self["webpackChunk"] || []).push([[1520],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[5630],{
3
3
 
4
- /***/ 71520:
4
+ /***/ 55630:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -29,7 +29,7 @@ __webpack_require__.d(__webpack_exports__, {
29
29
  useHangingProtocolStageIndexStore: () => (/* reexport */ useHangingProtocolStageIndexStore),
30
30
  usePatientInfo: () => (/* reexport */ hooks_usePatientInfo),
31
31
  useToggleHangingProtocolStore: () => (/* reexport */ useToggleHangingProtocolStore),
32
- useToggleOneUpViewportGridStore: () => (/* reexport */ useToggleOneUpViewportGridStore/* useToggleOneUpViewportGridStore */.Y),
32
+ useToggleOneUpViewportGridStore: () => (/* reexport */ useToggleOneUpViewportGridStore),
33
33
  useUIStateStore: () => (/* reexport */ useUIStateStore),
34
34
  useViewportGridStore: () => (/* reexport */ useViewportGridStore),
35
35
  useViewportsByPositionStore: () => (/* reexport */ useViewportsByPositionStore),
@@ -1726,23 +1726,35 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
1726
1726
  naturalizedInstances.forEach(instance => {
1727
1727
  instance.wadoRoot = dicomWebConfig.wadoRoot;
1728
1728
  instance.wadoUri = dicomWebConfig.wadoUri;
1729
- const imageId = implementation.getImageIdsForInstance({
1730
- instance
1731
- });
1729
+ const {
1730
+ StudyInstanceUID,
1731
+ SeriesInstanceUID,
1732
+ SOPInstanceUID
1733
+ } = instance;
1734
+ const numberOfFrames = instance.NumberOfFrames || 1;
1735
+ // Process all frames consistently, whether single or multiframe
1736
+ for (let i = 0; i < numberOfFrames; i++) {
1737
+ const frameNumber = i + 1;
1738
+ const frameImageId = implementation.getImageIdsForInstance({
1739
+ instance,
1740
+ frame: frameNumber
1741
+ });
1742
+ // Add imageId specific mapping to this data as the URL isn't necessarily WADO-URI.
1743
+ metadataProvider.addImageIdToUIDs(frameImageId, {
1744
+ StudyInstanceUID,
1745
+ SeriesInstanceUID,
1746
+ SOPInstanceUID,
1747
+ frameNumber: numberOfFrames > 1 ? frameNumber : undefined
1748
+ });
1749
+ }
1732
1750
 
1733
1751
  // Adding imageId to each instance
1734
1752
  // Todo: This is not the best way I can think of to let external
1735
1753
  // metadata handlers know about the imageId that is stored in the store
1736
- instance.imageId = imageId;
1737
-
1738
- // Adding UIDs to metadataProvider
1739
- // Note: storing imageURI in metadataProvider since stack viewports
1740
- // will use the same imageURI
1741
- metadataProvider.addImageIdToUIDs(imageId, {
1742
- StudyInstanceUID,
1743
- SeriesInstanceUID: instance.SeriesInstanceUID,
1744
- SOPInstanceUID: instance.SOPInstanceUID
1754
+ const imageId = implementation.getImageIdsForInstance({
1755
+ instance
1745
1756
  });
1757
+ instance.imageId = imageId;
1746
1758
  });
1747
1759
  src/* DicomMetadataStore */.H8.addInstances(naturalizedInstances, madeInClient);
1748
1760
  }
@@ -1964,7 +1976,7 @@ function createDicomJSONApi(dicomJsonConfig) {
1964
1976
  query
1965
1977
  } = query_string.parseUrl(instance.url);
1966
1978
 
1967
- // Add imageId specific mapping to this data as the URL isn't necessarliy WADO-URI.
1979
+ // Add imageId specific mapping to this data as the URL isn't necessarily WADO-URI.
1968
1980
  DicomJSONDataSource_metadataProvider.addImageIdToUIDs(imageId, {
1969
1981
  StudyInstanceUID,
1970
1982
  SeriesInstanceUID,
@@ -2322,8 +2334,7 @@ function createDicomLocalApi(dicomLocalConfig) {
2322
2334
  const {
2323
2335
  SeriesInstanceUID
2324
2336
  } = aSeries;
2325
- const isMultiframe = aSeries.instances[0].NumberOfFrames > 1;
2326
- aSeries.instances.forEach((instance, index) => {
2337
+ aSeries.instances.forEach(instance => {
2327
2338
  const {
2328
2339
  url: imageId,
2329
2340
  StudyInstanceUID,
@@ -2331,14 +2342,22 @@ function createDicomLocalApi(dicomLocalConfig) {
2331
2342
  SOPInstanceUID
2332
2343
  } = instance;
2333
2344
  instance.imageId = imageId;
2334
-
2335
- // Add imageId specific mapping to this data as the URL isn't necessarily WADO-URI.
2336
- DicomLocalDataSource_metadataProvider.addImageIdToUIDs(imageId, {
2337
- StudyInstanceUID,
2338
- SeriesInstanceUID,
2339
- SOPInstanceUID,
2340
- frameIndex: isMultiframe ? index : 1
2341
- });
2345
+ const numberOfFrames = instance.NumberOfFrames || 1;
2346
+ // Process all frames consistently, whether single or multiframe
2347
+ for (let i = 0; i < numberOfFrames; i++) {
2348
+ const frameNumber = i + 1;
2349
+ const frameImageId = implementation.getImageIdsForInstance({
2350
+ instance,
2351
+ frame: frameNumber
2352
+ });
2353
+ // Add imageId specific mapping to this data as the URL isn't necessarily WADO-URI.
2354
+ DicomLocalDataSource_metadataProvider.addImageIdToUIDs(frameImageId, {
2355
+ StudyInstanceUID,
2356
+ SeriesInstanceUID,
2357
+ SOPInstanceUID,
2358
+ frameNumber: numberOfFrames > 1 ? frameNumber : undefined
2359
+ });
2360
+ }
2342
2361
  });
2343
2362
  src/* DicomMetadataStore */.H8._broadcastEvent(EVENTS.INSTANCES_ADDED, {
2344
2363
  StudyInstanceUID,
@@ -2388,9 +2407,12 @@ function createDicomLocalApi(dicomLocalConfig) {
2388
2407
  instance,
2389
2408
  frame
2390
2409
  }) {
2391
- if (instance.imageId) {
2392
- return instance.imageId;
2393
- }
2410
+ // Important: Never use instance.imageId because it might be multiframe,
2411
+ // which would make it an invalid imageId.
2412
+ // if (instance.imageId) {
2413
+ // return instance.imageId;
2414
+ // }
2415
+
2394
2416
  const {
2395
2417
  StudyInstanceUID,
2396
2418
  SeriesInstanceUID,
@@ -3056,8 +3078,8 @@ function ViewerHeader({
3056
3078
  hotkeyDefinitions,
3057
3079
  hotkeyDefaults
3058
3080
  } = hotkeysManager;
3059
- const versionNumber = "3.10.0-beta.10";
3060
- const commitHash = "397fd856539cd3b949a9614a9ea32d0d04a90000";
3081
+ const versionNumber = "3.10.0-beta.11";
3082
+ const commitHash = "7624ccb5e495c0a151227a458d8d5bfb8babb22c";
3061
3083
  const menuOptions = [{
3062
3084
  title: t('Header:About'),
3063
3085
  icon: 'info',
@@ -6495,8 +6517,21 @@ const createToggleHangingProtocolStore = set => ({
6495
6517
  const useToggleHangingProtocolStore = (0,zustand_esm/* create */.vt)()(useToggleHangingProtocolStore_DEBUG_STORE ? (0,middleware/* devtools */.lt)(createToggleHangingProtocolStore, {
6496
6518
  name: 'ToggleHangingProtocolStore'
6497
6519
  }) : createToggleHangingProtocolStore);
6498
- // EXTERNAL MODULE: ../../../extensions/default/src/stores/useToggleOneUpViewportGridStore.ts
6499
- var useToggleOneUpViewportGridStore = __webpack_require__(73325);
6520
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/stores/useToggleOneUpViewportGridStore.ts
6521
+
6522
+ const useToggleOneUpViewportGridStore_PRESENTATION_TYPE_ID = 'toggleOneUpViewportGridId';
6523
+ // Stores the entire ViewportGridService getState when toggling to one up
6524
+ // (e.g. via a double click) so that it can be restored when toggling back.
6525
+ const useToggleOneUpViewportGridStore = (0,zustand_esm/* create */.vt)(set => ({
6526
+ toggleOneUpViewportGridStore: null,
6527
+ type: useToggleOneUpViewportGridStore_PRESENTATION_TYPE_ID,
6528
+ setToggleOneUpViewportGridStore: state => set({
6529
+ toggleOneUpViewportGridStore: state
6530
+ }),
6531
+ clearToggleOneUpViewportGridStore: () => set({
6532
+ toggleOneUpViewportGridStore: null
6533
+ })
6534
+ }));
6500
6535
  ;// CONCATENATED MODULE: ../../../extensions/default/src/commandsModule.ts
6501
6536
 
6502
6537
 
@@ -6806,7 +6841,7 @@ const commandsModule = ({
6806
6841
  // The viewer is in one-up. Check if there is a state to restore/toggle back to.
6807
6842
  const {
6808
6843
  toggleOneUpViewportGridStore
6809
- } = useToggleOneUpViewportGridStore/* useToggleOneUpViewportGridStore */.Y.getState();
6844
+ } = useToggleOneUpViewportGridStore.getState();
6810
6845
  if (!toggleOneUpViewportGridStore) {
6811
6846
  return;
6812
6847
  }
@@ -6862,7 +6897,7 @@ const commandsModule = ({
6862
6897
  // Store the current viewport grid state so we can toggle it back later.
6863
6898
  const {
6864
6899
  setToggleOneUpViewportGridStore
6865
- } = useToggleOneUpViewportGridStore/* useToggleOneUpViewportGridStore */.Y.getState();
6900
+ } = useToggleOneUpViewportGridStore.getState();
6866
6901
  setToggleOneUpViewportGridStore(viewportGridState);
6867
6902
 
6868
6903
  // one being toggled to one up.
@@ -9628,30 +9663,6 @@ const defaultExtension = {
9628
9663
  /* harmony default export */ const default_src = (defaultExtension);
9629
9664
 
9630
9665
 
9631
- /***/ }),
9632
-
9633
- /***/ 73325:
9634
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
9635
-
9636
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
9637
- /* harmony export */ Y: () => (/* binding */ useToggleOneUpViewportGridStore)
9638
- /* harmony export */ });
9639
- /* harmony import */ var zustand__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(78713);
9640
-
9641
- const PRESENTATION_TYPE_ID = 'toggleOneUpViewportGridId';
9642
- // Stores the entire ViewportGridService getState when toggling to one up
9643
- // (e.g. via a double click) so that it can be restored when toggling back.
9644
- const useToggleOneUpViewportGridStore = (0,zustand__WEBPACK_IMPORTED_MODULE_0__/* .create */ .vt)(set => ({
9645
- toggleOneUpViewportGridStore: null,
9646
- type: PRESENTATION_TYPE_ID,
9647
- setToggleOneUpViewportGridStore: state => set({
9648
- toggleOneUpViewportGridStore: state
9649
- }),
9650
- clearToggleOneUpViewportGridStore: () => set({
9651
- toggleOneUpViewportGridStore: null
9652
- })
9653
- }));
9654
-
9655
9666
  /***/ })
9656
9667
 
9657
9668
  }]);
@@ -345,8 +345,8 @@ function getHangingProtocolModule() {
345
345
  }
346
346
  /* harmony default export */ const src_getHangingProtocolModule = (getHangingProtocolModule);
347
347
 
348
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 114 modules
349
- var default_src = __webpack_require__(71520);
348
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 115 modules
349
+ var default_src = __webpack_require__(55630);
350
350
  // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Filters/General/ImageMarchingSquares.js + 2 modules
351
351
  var ImageMarchingSquares = __webpack_require__(38993);
352
352
  // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/Core/DataArray.js
@@ -694,7 +694,7 @@ function modeFactory({
694
694
  lesionStats: 'Lesion Statistics',
695
695
  minValue: 'Minimum Value',
696
696
  maxValue: 'Maximum Value',
697
- meanValue: 'Mean Value',
697
+ meanValue: 'Mean Value (ml)',
698
698
  volume: 'Volume',
699
699
  suvPeak: 'SUV Peak',
700
700
  suvMax: 'Maximum SUV',
@@ -19,8 +19,8 @@ var prop_types = __webpack_require__(97598);
19
19
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
20
20
  // EXTERNAL MODULE: ../../ui/src/index.js + 690 modules
21
21
  var src = __webpack_require__(35647);
22
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 114 modules
23
- var default_src = __webpack_require__(71520);
22
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 115 modules
23
+ var default_src = __webpack_require__(55630);
24
24
  ;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/DicomMicroscopyViewport.css
25
25
  // extracted by mini-css-extract-plugin
26
26
 
@@ -632,7 +632,7 @@ function modeFactory({
632
632
  minValue: 'Minimum Value',
633
633
  maxValue: 'Maximum Value',
634
634
  meanValue: 'Mean Value',
635
- volume: 'Volume',
635
+ volume: 'Volume (ml)',
636
636
  suvPeak: 'SUV Peak',
637
637
  suvMax: 'Maximum SUV',
638
638
  suvMaxIJK: 'SUV Max IJK',