@ohif/app 3.13.0-beta.0 → 3.13.0-beta.10

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 (31) hide show
  1. package/dist/{1933.bundle.682f142e3217d4c7fbf7.js → 1933.bundle.b3c13990c2990085213b.js} +4 -3
  2. package/dist/{3081.bundle.41838985e0472851eadb.js → 3081.bundle.4e5f2f76dc80e817b870.js} +27 -6
  3. package/dist/{5802.bundle.3bf5e6b3ab330a594a47.js → 5802.bundle.552c1f4320fadbfc9b00.js} +65 -8
  4. package/dist/{6376.bundle.272e755bdcbb5615a44e.js → 6376.bundle.9cb74d7bc08476e2f1a7.js} +1 -1
  5. package/dist/{7190.bundle.d731ae6cf6e933a2c408.js → 7190.bundle.e8f0193e0e06472f795c.js} +491 -357
  6. package/dist/{9195.bundle.1d1484158b2f05246396.js → 9195.bundle.613833eca6f4de0163c4.js} +2 -6
  7. package/dist/{app.bundle.f9ef4f9dbc1c3e69a1ae.js → app.bundle.391d20d3233afbea3a62.js} +40 -6
  8. package/dist/index.html +1 -1
  9. package/dist/{interpolation.bundle.1938b79f9d6db363528a.js → interpolation.bundle.c70cb95d164dc494e6dc.js} +1 -1
  10. package/dist/sw.js +1 -1
  11. package/package.json +20 -20
  12. /package/dist/{1403.bundle.1c9ce804d1e88033e276.js → 1403.bundle.a27e93da0df0ac5e00ec.js} +0 -0
  13. /package/dist/{1459.bundle.e8802999a4d7f7edf628.js → 1459.bundle.008d9ec6f9be156cc7eb.js} +0 -0
  14. /package/dist/{1730.bundle.66a5e554ab20dab97b11.js → 1730.bundle.5517f6425625cdbe4295.js} +0 -0
  15. /package/dist/{2018.bundle.c06693143228cc034cb9.js → 2018.bundle.f803d6eed149702dbf96.js} +0 -0
  16. /package/dist/{213.bundle.c2d4d7370c26b0823880.js → 213.bundle.4da62ab9aad5bc5dfc8f.js} +0 -0
  17. /package/dist/{2424.bundle.c1e287e752f352b76543.js → 2424.bundle.3d8bbbb0d5b460421132.js} +0 -0
  18. /package/dist/{3461.bundle.a8fcefd1c6e389d905fc.js → 3461.bundle.d4b3be1127c5409178b1.js} +0 -0
  19. /package/dist/{4775.bundle.70bc407db26afaa4331a.js → 4775.bundle.0657b2fc04ff02e864ee.js} +0 -0
  20. /package/dist/{4819.bundle.47e7aa44747ddab3a39a.js → 4819.bundle.ed50b19e3201f03cd379.js} +0 -0
  21. /package/dist/{5028.bundle.274945a9ae69c6b6ad51.js → 5028.bundle.f0f27922d615c64fcec6.js} +0 -0
  22. /package/dist/{5457.bundle.f7de73bcfe1012a73b9f.js → 5457.bundle.f9939704daa9da5ffb8f.js} +0 -0
  23. /package/dist/{5485.bundle.4e0ec03c61ec5cadd9bb.js → 5485.bundle.349cbcd05639e5a99635.js} +0 -0
  24. /package/dist/{6027.bundle.2b12862684b0cb3af4b4.js → 6027.bundle.018be92e12bfc4aebc26.js} +0 -0
  25. /package/dist/{6163.bundle.ca93a4e6501880901f94.js → 6163.bundle.59d2aa5fcc846c9dc440.js} +0 -0
  26. /package/dist/{7639.bundle.32152cacb059089ed7d7.js → 7639.bundle.34966b47cb5e30e77f6a.js} +0 -0
  27. /package/dist/{8305.bundle.2ede68ba3c075928c9f4.js → 8305.bundle.b2e7cc8553f350b692eb.js} +0 -0
  28. /package/dist/{85.bundle.05591d5a14d74a502dfe.js → 85.bundle.cbadd8f432e9e83241af.js} +0 -0
  29. /package/dist/{8558.bundle.3e84c4ba2c7ec6fce52c.js → 8558.bundle.f0ca04e313d762510357.js} +0 -0
  30. /package/dist/{8583.bundle.2908eee785e7e4595d14.js → 8583.bundle.4930e7e2ee13e65c0a99.js} +0 -0
  31. /package/dist/{9927.bundle.e798a347dfe1f241578f.js → 9927.bundle.8dce9dab0a013bfa5c0b.js} +0 -0
@@ -2692,12 +2692,13 @@ const extension = {
2692
2692
  handleHeight: true,
2693
2693
  handleWidth: true
2694
2694
  });
2695
+ const setViewportActive = (0,react.useCallback)(viewportId => {
2696
+ viewportGridService.setActiveViewportId(viewportId);
2697
+ }, [viewportGridService]);
2695
2698
  return /*#__PURE__*/react.createElement(MicroscopyViewport, _extends({
2696
2699
  key: displaySetsKey,
2697
2700
  activeViewportId: activeViewportId,
2698
- setViewportActive: viewportId => {
2699
- viewportGridService.setActiveViewportId(viewportId);
2700
- },
2701
+ setViewportActive: setViewportActive,
2701
2702
  viewportData: viewportOptions,
2702
2703
  resizeRef: resizeRef
2703
2704
  }, props));
@@ -6089,6 +6089,10 @@ const connectMeasurementServiceToTools = ({
6089
6089
 
6090
6090
 
6091
6091
  function _getVolumeFromViewport(viewport) {
6092
+ // Handle non-volume viewports that don't have getAllVolumeIds
6093
+ if (!viewport?.getAllVolumeIds) {
6094
+ return null;
6095
+ }
6092
6096
  const volumeIds = viewport.getAllVolumeIds();
6093
6097
  const volumes = volumeIds.map(id => esm.cache.getVolume(id));
6094
6098
  const dynamicVolume = volumes.find(volume => volume.isDynamicVolume());
@@ -25438,6 +25442,9 @@ const setUpAnnotationEventHandlers = () => {
25438
25442
  };
25439
25443
  return [annotationInterpolationProcessCompletedUnsubscribe];
25440
25444
  };
25445
+ // EXTERNAL MODULE: ../../../node_modules/immutability-helper/index.js
25446
+ var immutability_helper = __webpack_require__(1752);
25447
+ var immutability_helper_default = /*#__PURE__*/__webpack_require__.n(immutability_helper);
25441
25448
  ;// ../../../extensions/cornerstone/src/components/MeasurementsMenu.tsx
25442
25449
 
25443
25450
 
@@ -25802,6 +25809,7 @@ function src_extends() { return src_extends = Object.assign ? Object.assign.bind
25802
25809
 
25803
25810
 
25804
25811
 
25812
+
25805
25813
 
25806
25814
 
25807
25815
  const {
@@ -25815,7 +25823,7 @@ const OHIFCornerstoneViewport = props => {
25815
25823
  fallback: /*#__PURE__*/react.createElement("div", null, "Loading...")
25816
25824
  }, /*#__PURE__*/react.createElement(Component, props));
25817
25825
  };
25818
- const stackRetrieveOptions = {
25826
+ const DEFAULT_STACK_RETRIEVE_OPTIONS = {
25819
25827
  retrieveOptions: {
25820
25828
  single: {
25821
25829
  streaming: true,
@@ -25823,6 +25831,11 @@ const stackRetrieveOptions = {
25823
25831
  }
25824
25832
  }
25825
25833
  };
25834
+
25835
+ /** Normalize to immutability-helper spec: plain object → $merge, otherwise use as-is. */
25836
+ const toUpdateSpec = obj => obj != null && typeof obj === 'object' && Object.keys(obj).some(k => k.startsWith('$')) ? obj : {
25837
+ $merge: obj ?? {}
25838
+ };
25826
25839
  const unsubscriptions = [];
25827
25840
  /**
25828
25841
  *
@@ -25834,7 +25847,8 @@ const cornerstoneExtension = {
25834
25847
  id: id,
25835
25848
  onModeEnter: ({
25836
25849
  servicesManager,
25837
- commandsManager
25850
+ commandsManager,
25851
+ extensionManager
25838
25852
  }) => {
25839
25853
  const {
25840
25854
  cornerstoneViewportService,
@@ -25861,10 +25875,17 @@ const cornerstoneExtension = {
25861
25875
  // This interleaves images and replicates them for low-resolution depth volume
25862
25876
  // reconstruction, which progressively improves
25863
25877
  imageRetrieveMetadataProvider.add('volume', esm.ProgressiveRetrieveImages.interleavedRetrieveStages);
25864
- // The default stack loading option is to progressive load HTJ2K images
25865
- // There are other possible options, but these need more thought about
25866
- // how to define them.
25867
- imageRetrieveMetadataProvider.add('stack', stackRetrieveOptions);
25878
+
25879
+ /**
25880
+ * Stack retrieve options: read from active data source configuration.
25881
+ * Pass an immutability-helper spec (e.g. { $merge: {...} } or { $set: {...} }) in
25882
+ * stackRetrieveOptions to customize. Plain object is treated as $merge for backward compat.
25883
+ * Set streaming: false for uncompressed DICOM that requires full file before decode.
25884
+ */
25885
+ const sourceConfig = extensionManager?.getActiveDataSource?.()?.[0]?.getConfig?.() ?? {};
25886
+ const config = sourceConfig.stackRetrieveOptions ?? {};
25887
+ const stackOptions = immutability_helper_default()(DEFAULT_STACK_RETRIEVE_OPTIONS, toUpdateSpec(config));
25888
+ imageRetrieveMetadataProvider.add('stack', stackOptions);
25868
25889
  },
25869
25890
  getPanelModule: src_getPanelModule,
25870
25891
  onModeExit: ({
@@ -241,14 +241,20 @@ var dcmjs_es = __webpack_require__(5842);
241
241
 
242
242
 
243
243
 
244
- function DicomMicroscopyViewport({
244
+
245
+ // This component is wrapped with React.memo and uses a custom areEqual comparison
246
+ // function to prevent unnecessary re-renders when props are semantically identical
247
+ // (e.g. `displaySets` reference changes, but the content is the same).
248
+ // Note: If this component starts depending on additional props,
249
+ // update `areEqual` accordingly.
250
+ const DicomMicroscopyViewport = /*#__PURE__*/react.memo(({
245
251
  activeViewportId,
246
252
  setViewportActive,
247
253
  displaySets,
248
254
  viewportId,
249
255
  dataSource,
250
256
  resizeRef
251
- }) {
257
+ }) => {
252
258
  const {
253
259
  servicesManager,
254
260
  extensionManager
@@ -395,20 +401,23 @@ function DicomMicroscopyViewport({
395
401
  console.log('Loading viewer metadata', smDisplaySet);
396
402
  await loadViewer(smDisplaySet.others);
397
403
  if (displaySet.isOverlayDisplaySet && !displaySet.isLoaded && !displaySet.isLoading) {
398
- displaySet.load(smDisplaySet);
404
+ const referencedDisplaySet = displaySet.getSourceDisplaySet();
405
+ displaySet.load(referencedDisplaySet);
399
406
  }
400
407
  }, [dataSource, extensionManager, microscopyService, servicesManager, viewportId]);
401
408
  (0,react.useEffect)(() => {
402
- const displaySet = displaySets[0];
403
- installOpenLayersRenderer(container.current, displaySet).then(() => {
404
- setIsLoaded(true);
405
- });
409
+ if (!viewer) {
410
+ const displaySet = displaySets[0];
411
+ installOpenLayersRenderer(container.current, displaySet).then(() => {
412
+ setIsLoaded(true);
413
+ });
414
+ }
406
415
  return () => {
407
416
  if (viewer) {
408
417
  microscopyService.removeViewer(viewer);
409
418
  }
410
419
  };
411
- }, []);
420
+ }, [viewer]);
412
421
  (0,react.useEffect)(() => {
413
422
  const displaySet = displaySets[0];
414
423
  microscopyService.clearAnnotations();
@@ -464,7 +473,55 @@ function DicomMicroscopyViewport({
464
473
  }), isLoaded ? null : /*#__PURE__*/react.createElement(LoadingIndicatorProgress, {
465
474
  className: 'h-full w-full bg-black'
466
475
  }));
476
+ }, areEqual);
477
+
478
+ // Check if the props are the same
479
+ function areEqual(prevProps, nextProps) {
480
+ if (prevProps.setViewportActive !== nextProps.setViewportActive) {
481
+ return false;
482
+ }
483
+ if (prevProps.resizeRef !== nextProps.resizeRef) {
484
+ return false;
485
+ }
486
+ if (prevProps.viewportId !== nextProps.viewportId) {
487
+ return false;
488
+ }
489
+ if (prevProps.activeViewportId !== nextProps.activeViewportId) {
490
+ return false;
491
+ }
492
+ if (prevProps.dataSource !== nextProps.dataSource) {
493
+ return false;
494
+ }
495
+ const prevDisplaySets = prevProps.displaySets;
496
+ const nextDisplaySets = nextProps.displaySets;
497
+ if (prevDisplaySets.length !== nextDisplaySets.length) {
498
+ return false;
499
+ }
500
+
501
+ // Check if the displaySets are the same
502
+ for (let i = 0; i < prevDisplaySets.length; i++) {
503
+ const prevDisplaySet = prevDisplaySets[i];
504
+ const foundDisplaySet = nextDisplaySets.find(nextDisplaySet => nextDisplaySet.displaySetInstanceUID === prevDisplaySet.displaySetInstanceUID);
505
+ if (!foundDisplaySet) {
506
+ return false;
507
+ }
508
+ // Check if the displaySet's images are the same
509
+ if (foundDisplaySet.images?.length !== prevDisplaySet.images?.length) {
510
+ return false;
511
+ }
512
+
513
+ // Check if the displaySet's imageIds are the same
514
+ if (foundDisplaySet.images?.length) {
515
+ for (let j = 0; j < foundDisplaySet.images.length; j++) {
516
+ if (foundDisplaySet.images[j].imageId !== prevDisplaySet.images[j].imageId) {
517
+ return false;
518
+ }
519
+ }
520
+ }
521
+ }
522
+ return true;
467
523
  }
524
+ DicomMicroscopyViewport.displayName = 'DicomMicroscopyViewport';
468
525
  /* harmony default export */ const src_DicomMicroscopyViewport = (DicomMicroscopyViewport);
469
526
 
470
527
  /***/ })
@@ -683,7 +683,7 @@ expose(workerOperations);
683
683
  /******/ // This function allow to reference async chunks and sibling chunks for the entrypoint
684
684
  /******/ __webpack_require__.u = (chunkId) => {
685
685
  /******/ // return url for filenames based on template
686
- /******/ return "" + chunkId + ".bundle." + "d731ae6cf6e933a2c408" + ".js";
686
+ /******/ return "" + chunkId + ".bundle." + "e8f0193e0e06472f795c" + ".js";
687
687
  /******/ };
688
688
  /******/ })();
689
689
  /******/