@ohif/app 3.8.0-beta.73 → 3.8.0-beta.74

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 (46) hide show
  1. package/dist/{121.bundle.21827fec690c01ee9ab3.js → 121.bundle.bd8acf52b6a7047ae832.js} +2 -2
  2. package/dist/141.bundle.556b4c1e4cab770417ac.js +8620 -0
  3. package/dist/{191.bundle.c0ea2d031ffddeca32c9.js → 183.bundle.25293de927ef032a6695.js} +195 -122
  4. package/dist/{188.bundle.acfe3c0e6eb9cc90aef1.js → 188.bundle.f1b3909e55be12d37c4a.js} +2 -2
  5. package/dist/{987.bundle.e19408decfd59aadd118.js → 217.bundle.9631d914f170f8d7ef63.js} +31558 -39396
  6. package/dist/{295.bundle.3a0d5062d65296c4bf5d.js → 295.bundle.688b6bbff493cd904ae7.js} +2 -2
  7. package/dist/{155.bundle.64e00e96835d61e99c0e.js → 325.bundle.3d260b1a7f80cfc892a0.js} +43 -58
  8. package/dist/{425.bundle.f796ed1020fbed0f1e71.js → 335.bundle.ec53cc58116ef1dc5fa3.js} +132 -518
  9. package/dist/{342.bundle.521c0217f82380c0c2ad.js → 342.bundle.c6165579c4ac3ef0d6a8.js} +2 -2
  10. package/dist/{41.bundle.8b3f6e6f4bd71b85ef14.js → 41.bundle.3c9bb4e3800dcea2c043.js} +28 -29
  11. package/dist/{433.bundle.6f2308ab10593784778c.js → 433.bundle.1474591f213852cffcba.js} +188 -172
  12. package/dist/{290.bundle.952de53057f98e2c5ef0.js → 445.bundle.38c6d2af64e41cd7c614.js} +1 -1049
  13. package/dist/{448.bundle.19df2fef38bb0f6a272a.js → 448.bundle.e6af6868af55a353b12b.js} +16 -22
  14. package/dist/487.bundle.de932b440ffc809978b5.js +1875 -0
  15. package/dist/{530.bundle.f4b7966fb33eafb8cd5d.js → 530.bundle.7c94543955552475c56a.js} +9 -9
  16. package/dist/{540.bundle.32224b29bfa11d1f1cec.js → 540.bundle.31780163f7065fd4d325.js} +15 -15
  17. package/dist/{544.bundle.1110b24e96863d719a95.js → 544.bundle.fcb790bae53294b49b05.js} +8 -8
  18. package/dist/{574.bundle.2b3369042aad5d553463.js → 574.bundle.b4eb8773d7741868e84b.js} +166 -45
  19. package/dist/{594.bundle.61a9f0567260e9bb4480.js → 594.bundle.6c0b915507752363e82a.js} +4 -4
  20. package/dist/{2.bundle.a849401e1fefc0898248.js → 633.bundle.7f782a390a22d9c7ec1d.js} +35 -43
  21. package/dist/{699.bundle.9f4eddf87548c0d0dca3.js → 699.bundle.7642c1505c1685f63897.js} +18 -35
  22. package/dist/702.bundle.963481fbf871984b646f.js +8426 -0
  23. package/dist/722.bundle.afab1fe6bfcd569130ac.js +1083 -0
  24. package/dist/{724.bundle.b57096deac9649aada4b.js → 724.bundle.ad52afcbec7501305d25.js} +20 -11
  25. package/dist/{90.bundle.70f4752bb4ac79aef269.js → 83.bundle.ff7db010621303a71a50.js} +419 -137
  26. package/dist/{862.bundle.47305c27f0fb939c2f97.js → 862.bundle.f49a379497bb3b43a942.js} +3 -3
  27. package/dist/{889.bundle.3816444220909bd1fc78.js → 889.bundle.67ca151a5e2d653b0021.js} +8 -8
  28. package/dist/{595.bundle.e8ff2d0672cb195d4ab8.js → 896.bundle.ba0b4c73e2331281159f.js} +686 -57
  29. package/dist/{905.bundle.2dd7f62cb6e49851926b.js → 905.bundle.e67fd55073b8ff735ed5.js} +4 -4
  30. package/dist/{907.bundle.d22edc6203167e985ab3.js → 907.bundle.0167da9471dcfa5c862e.js} +2 -2
  31. package/dist/94.bundle.ccec301dfb972a375ecc.js +784 -0
  32. package/dist/{961.bundle.f207f1ac54a174e67d82.js → 961.bundle.711da9767a4e31ea5aef.js} +2 -2
  33. package/dist/{app.bundle.5e5ee16c43a68961e8c4.js → app.bundle.c0c40b901a1bf1043f08.js} +98584 -89435
  34. package/dist/app.bundle.css +5 -4
  35. package/dist/cornerstoneDICOMImageLoader.min.js +1 -1
  36. package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -1
  37. package/dist/histogram-worker.bundle.829e14ec12c2b41a4323.js +359 -0
  38. package/dist/index.html +1 -1
  39. package/dist/{polySeg.bundle.fe47718e6a8414f175b1.js → polySeg.bundle.c503e9460cef894737cd.js} +3 -6
  40. package/dist/sw.js +1 -1
  41. package/package.json +20 -19
  42. package/dist/425.css +0 -2
  43. /package/dist/{164.bundle.6b98e9caf53620fbd6ca.js → 164.bundle.55df0a2c8b3569d8e1f9.js} +0 -0
  44. /package/dist/{155.css → 325.css} +0 -0
  45. /package/dist/{2.css → 633.css} +0 -0
  46. /package/dist/{595.css → 896.css} +0 -0
@@ -12,9 +12,9 @@ __webpack_require__.r(__webpack_exports__);
12
12
  /* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
13
13
  /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(41766);
14
14
  /* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(80619);
15
- /* harmony import */ var _ohif_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(85073);
15
+ /* harmony import */ var _ohif_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(55411);
16
16
  /* harmony import */ var _tools_modules_dicomSRModule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(74334);
17
- /* harmony import */ var _ohif_ui__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(48804);
17
+ /* harmony import */ var _ohif_ui__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(5085);
18
18
  /* harmony import */ var _utils_hydrateStructuredReport__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(77089);
19
19
  /* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(15575);
20
20
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@@ -332,13 +332,13 @@ OHIFCornerstoneSRViewport.defaultProps = {
332
332
  customProps: {}
333
333
  };
334
334
  async function _getViewportReferencedDisplaySetData(displaySet, measurementSelected, displaySetService) {
335
- const {
336
- measurements
337
- } = displaySet;
338
- const measurement = measurements[measurementSelected];
339
- const {
340
- displaySetInstanceUID
341
- } = measurement;
335
+ if (!displaySet.keyImageDisplaySet) {
336
+ // Create a new display set, and preserve a reference to it here,
337
+ // so that it can be re-displayed and shown inside the SR viewport.
338
+ // This is only for ease of redisplay - the display set is stored in the
339
+ // usual manner in the display set service.
340
+ displaySet.keyImageDisplaySet = createReferencedImageDisplaySet(displaySetService, displaySet);
341
+ }
342
342
  const referencedDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
343
343
  const image0 = referencedDisplaySet.images[0];
344
344
  const referencedDisplaySetMetadata = {
@@ -25,14 +25,14 @@ const id = package_namespaceObject.UU;
25
25
  const SOPClassHandlerName = 'dicom-sr';
26
26
  const SOPClassHandlerId = `${id}.sopClassHandlerModule.${SOPClassHandlerName}`;
27
27
 
28
- // EXTERNAL MODULE: ../../core/src/index.ts + 68 modules
29
- var src = __webpack_require__(85073);
30
- // EXTERNAL MODULE: ../../../node_modules/gl-matrix/esm/index.js + 10 modules
31
- var esm = __webpack_require__(83636);
32
- // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 16 modules
33
- var dist_esm = __webpack_require__(20767);
34
- // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 383 modules
35
- var core_dist_esm = __webpack_require__(50719);
28
+ // EXTERNAL MODULE: ../../core/src/index.ts + 70 modules
29
+ var src = __webpack_require__(55411);
30
+ // EXTERNAL MODULE: ../../../node_modules/gl-matrix/esm/index.js + 1 modules
31
+ var esm = __webpack_require__(44753);
32
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 18 modules
33
+ var dist_esm = __webpack_require__(24542);
34
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 327 modules
35
+ var core_dist_esm = __webpack_require__(44656);
36
36
  // EXTERNAL MODULE: ../../../extensions/cornerstone-dicom-sr/src/tools/modules/dicomSRModule.js
37
37
  var dicomSRModule = __webpack_require__(74334);
38
38
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-sr/src/constants/scoordTypes.js
@@ -1571,7 +1571,7 @@ const dicomSRExtension = {
1571
1571
  /* harmony export */ m1: () => (/* binding */ setTrackingUniqueIdentifiersForElement)
1572
1572
  /* harmony export */ });
1573
1573
  /* unused harmony export setActiveTrackingUniqueIdentifierForElement */
1574
- /* harmony import */ var _cornerstonejs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(50719);
1574
+ /* harmony import */ var _cornerstonejs_core__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(44656);
1575
1575
 
1576
1576
  const state = {
1577
1577
  TrackingUniqueIdentifier: null,
@@ -1632,10 +1632,10 @@ __webpack_require__.d(__webpack_exports__, {
1632
1632
  A: () => (/* binding */ hydrateStructuredReport)
1633
1633
  });
1634
1634
 
1635
- // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 383 modules
1636
- var esm = __webpack_require__(50719);
1637
- // EXTERNAL MODULE: ../../core/src/index.ts + 68 modules
1638
- var src = __webpack_require__(85073);
1635
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 327 modules
1636
+ var esm = __webpack_require__(44656);
1637
+ // EXTERNAL MODULE: ../../core/src/index.ts + 70 modules
1638
+ var src = __webpack_require__(55411);
1639
1639
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-sr/src/utils/getLabelFromDCMJSImportedToolData.js
1640
1640
  /**
1641
1641
  * Extracts the label from the toolData imported from dcmjs. We need to do this
@@ -1660,8 +1660,8 @@ function getLabelFromDCMJSImportedToolData(toolData) {
1660
1660
  }
1661
1661
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/adapters/dist/adapters.es.js
1662
1662
  var adapters_es = __webpack_require__(83342);
1663
- // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 16 modules
1664
- var dist_esm = __webpack_require__(20767);
1663
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 18 modules
1664
+ var dist_esm = __webpack_require__(24542);
1665
1665
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-sr/src/utils/hydrateStructuredReport.js
1666
1666
 
1667
1667
 
@@ -22,8 +22,8 @@ var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
22
22
  // EXTERNAL MODULE: ../../../node_modules/lodash.debounce/index.js
23
23
  var lodash_debounce = __webpack_require__(14771);
24
24
  var lodash_debounce_default = /*#__PURE__*/__webpack_require__.n(lodash_debounce);
25
- // EXTERNAL MODULE: ../../ui/src/index.js + 542 modules
26
- var src = __webpack_require__(48804);
25
+ // EXTERNAL MODULE: ../../ui/src/index.js + 785 modules
26
+ var src = __webpack_require__(5085);
27
27
  ;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/DicomMicroscopyViewport.css
28
28
  // extracted by mini-css-extract-plugin
29
29
 
@@ -59,8 +59,8 @@ const listComponentGenerator = props => {
59
59
 
60
60
  // EXTERNAL MODULE: ../../../node_modules/moment/moment.js
61
61
  var moment_moment = __webpack_require__(8291);
62
- // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 383 modules
63
- var esm = __webpack_require__(50719);
62
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 327 modules
63
+ var esm = __webpack_require__(44656);
64
64
  ;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts
65
65
 
66
66
 
@@ -258,8 +258,8 @@ const itemGenerator = props => {
258
258
  /* harmony default export */ const ViewportOverlay = (generateFromConfig({}));
259
259
  // EXTERNAL MODULE: ../../../node_modules/dicomweb-client/build/dicomweb-client.es.js
260
260
  var dicomweb_client_es = __webpack_require__(36922);
261
- // EXTERNAL MODULE: ../../core/src/index.ts + 68 modules
262
- var core_src = __webpack_require__(85073);
261
+ // EXTERNAL MODULE: ../../core/src/index.ts + 70 modules
262
+ var core_src = __webpack_require__(55411);
263
263
  ;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/utils/dicomWebClient.ts
264
264
 
265
265
 
@@ -339,8 +339,8 @@ function getDicomWebClient({
339
339
  }
340
340
  // EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
341
341
  var dcmjs_es = __webpack_require__(31426);
342
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 78 modules
343
- var default_src = __webpack_require__(54090);
342
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 83 modules
343
+ var default_src = __webpack_require__(88083);
344
344
  ;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/utils/cleanDenaturalizedDataset.ts
345
345
 
346
346
  function isPrimitive(v) {
@@ -19,14 +19,14 @@ var index_esm = __webpack_require__(78668);
19
19
  // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
20
20
  var prop_types = __webpack_require__(11374);
21
21
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
22
- // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 16 modules
23
- var esm = __webpack_require__(20767);
24
- // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 383 modules
25
- var dist_esm = __webpack_require__(50719);
26
- // EXTERNAL MODULE: ../../core/src/index.ts + 68 modules
27
- var src = __webpack_require__(85073);
28
- // EXTERNAL MODULE: ../../ui/src/index.js + 542 modules
29
- var ui_src = __webpack_require__(48804);
22
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 18 modules
23
+ var esm = __webpack_require__(24542);
24
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 327 modules
25
+ var dist_esm = __webpack_require__(44656);
26
+ // EXTERNAL MODULE: ../../core/src/index.ts + 70 modules
27
+ var src = __webpack_require__(55411);
28
+ // EXTERNAL MODULE: ../../ui/src/index.js + 785 modules
29
+ var ui_src = __webpack_require__(5085);
30
30
  // EXTERNAL MODULE: ../../../extensions/cornerstone/src/state.ts
31
31
  var state = __webpack_require__(71353);
32
32
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/Viewport/OHIFCornerstoneViewport.css
@@ -156,8 +156,8 @@ CornerstoneImageScrollbar.propTypes = {
156
156
  servicesManager: (prop_types_default()).object.isRequired
157
157
  };
158
158
  /* harmony default export */ const ViewportImageScrollbar = (CornerstoneImageScrollbar);
159
- // EXTERNAL MODULE: ../../../node_modules/gl-matrix/esm/index.js + 10 modules
160
- var gl_matrix_esm = __webpack_require__(83636);
159
+ // EXTERNAL MODULE: ../../../node_modules/gl-matrix/esm/index.js + 1 modules
160
+ var gl_matrix_esm = __webpack_require__(44753);
161
161
  // EXTERNAL MODULE: ../../../node_modules/moment/moment.js
162
162
  var moment = __webpack_require__(8291);
163
163
  var moment_default = /*#__PURE__*/__webpack_require__.n(moment);
@@ -482,7 +482,7 @@ function _getViewportInstances(viewportData) {
482
482
  } else if (viewportData.viewportType === dist_esm.Enums.ViewportType.ORTHOGRAPHIC) {
483
483
  const volumes = viewportData.data;
484
484
  volumes.forEach(volume => {
485
- if (!volume?.imageIds) {
485
+ if (!volume?.imageIds || volume.imageIds.length === 0) {
486
486
  return;
487
487
  }
488
488
  imageIds.push(volume.imageIds[0]);
@@ -966,6 +966,8 @@ function CornerstoneOverlays(props) {
966
966
  /* harmony default export */ const Overlays_CornerstoneOverlays = (CornerstoneOverlays);
967
967
  // EXTERNAL MODULE: ../../../extensions/cornerstone/src/utils/measurementServiceMappings/utils/getSOPInstanceAttributes.js
968
968
  var getSOPInstanceAttributes = __webpack_require__(1663);
969
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/index.js + 13 modules
970
+ var streaming_image_volume_loader_dist_esm = __webpack_require__(23722);
969
971
  // EXTERNAL MODULE: ./state/index.js + 1 modules
970
972
  var state_0 = __webpack_require__(15575);
971
973
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/components/CinePlayer/CinePlayer.tsx
@@ -973,6 +975,7 @@ var state_0 = __webpack_require__(15575);
973
975
 
974
976
 
975
977
 
978
+
976
979
  function WrappedCinePlayer({
977
980
  enabledVPElement,
978
981
  viewportId,
@@ -986,30 +989,28 @@ function WrappedCinePlayer({
986
989
  const [{
987
990
  isCineEnabled,
988
991
  cines
989
- }, api] = (0,ui_src/* useCine */.tq)();
992
+ }, cineService] = (0,ui_src/* useCine */.tq)();
990
993
  const [newStackFrameRate, setNewStackFrameRate] = (0,react.useState)(24);
994
+ const [dynamicInfo, setDynamicInfo] = (0,react.useState)(null);
991
995
  const [appConfig] = (0,state_0/* useAppConfig */.r)();
992
996
  const isMountedRef = (0,react.useRef)(null);
993
- const {
994
- component: CinePlayerComponent = ui_src/* CinePlayer */.F0
995
- } = customizationService.get('cinePlayer') ?? {};
996
997
  const cineHandler = () => {
997
- if (!cines || !cines[viewportId] || !enabledVPElement) {
998
+ if (!cines?.[viewportId] || !enabledVPElement) {
998
999
  return;
999
1000
  }
1000
- const cine = cines[viewportId];
1001
- const isPlaying = cine.isPlaying || false;
1002
- const frameRate = cine.frameRate || 24;
1001
+ const {
1002
+ isPlaying = false,
1003
+ frameRate = 24
1004
+ } = cines[viewportId];
1003
1005
  const validFrameRate = Math.max(frameRate, 1);
1004
- if (isPlaying) {
1005
- api.playClip(enabledVPElement, {
1006
- framesPerSecond: validFrameRate
1007
- });
1008
- } else {
1009
- api.stopClip(enabledVPElement);
1010
- }
1006
+ return isPlaying ? cineService.playClip(enabledVPElement, {
1007
+ framesPerSecond: validFrameRate
1008
+ }) : cineService.stopClip(enabledVPElement);
1011
1009
  };
1012
- const newStackCineHandler = (0,react.useCallback)(() => {
1010
+ const newDisplaySetHandler = (0,react.useCallback)(() => {
1011
+ if (!enabledVPElement || !isCineEnabled) {
1012
+ return;
1013
+ }
1013
1014
  const {
1014
1015
  viewports
1015
1016
  } = viewportGridService.getState();
@@ -1017,7 +1018,7 @@ function WrappedCinePlayer({
1017
1018
  displaySetInstanceUIDs
1018
1019
  } = viewports.get(viewportId);
1019
1020
  let frameRate = 24;
1020
- let isPlaying = cines[viewportId].isPlaying;
1021
+ let isPlaying = cines[viewportId]?.isPlaying || false;
1021
1022
  displaySetInstanceUIDs.forEach(displaySetInstanceUID => {
1022
1023
  const displaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
1023
1024
  if (displaySet.FrameRate) {
@@ -1026,63 +1027,178 @@ function WrappedCinePlayer({
1026
1027
  frameRate = Math.round(1000 / displaySet.FrameRate);
1027
1028
  isPlaying ||= !!appConfig.autoPlayCine;
1028
1029
  }
1030
+
1031
+ // check if the displaySet is dynamic and set the dynamic info
1032
+ if (displaySet.isDynamicVolume) {
1033
+ const {
1034
+ dynamicVolumeInfo
1035
+ } = displaySet;
1036
+ const numTimePoints = dynamicVolumeInfo.timePoints.length;
1037
+ const label = dynamicVolumeInfo.splittingTag;
1038
+ const timePointIndex = dynamicVolumeInfo.timePointIndex || 0;
1039
+ setDynamicInfo({
1040
+ volumeId: displaySet.displaySetInstanceUID,
1041
+ timePointIndex,
1042
+ numTimePoints,
1043
+ label
1044
+ });
1045
+ } else {
1046
+ setDynamicInfo(null);
1047
+ }
1029
1048
  });
1030
1049
  if (isPlaying) {
1031
- api.setIsCineEnabled(isPlaying);
1050
+ cineService.setIsCineEnabled(isPlaying);
1032
1051
  }
1033
- api.setCine({
1052
+ cineService.setCine({
1034
1053
  id: viewportId,
1035
1054
  isPlaying,
1036
1055
  frameRate
1037
1056
  });
1038
1057
  setNewStackFrameRate(frameRate);
1039
- }, [displaySetService, viewportId, viewportGridService, cines]);
1058
+ }, [displaySetService, viewportId, viewportGridService, cines, isCineEnabled]);
1040
1059
  (0,react.useEffect)(() => {
1041
1060
  isMountedRef.current = true;
1042
- dist_esm.eventTarget.addEventListener(dist_esm.Enums.Events.STACK_VIEWPORT_NEW_STACK, newStackCineHandler);
1061
+ newDisplaySetHandler();
1043
1062
  return () => {
1044
1063
  isMountedRef.current = false;
1045
- api.stopClip(enabledVPElement);
1046
- api.setCine({
1064
+ };
1065
+ }, [isCineEnabled, newDisplaySetHandler]);
1066
+
1067
+ /**
1068
+ * Use effect for handling new display set
1069
+ */
1070
+ (0,react.useEffect)(() => {
1071
+ if (!enabledVPElement) {
1072
+ return;
1073
+ }
1074
+ dist_esm.eventTarget.addEventListener(dist_esm.Enums.Events.STACK_VIEWPORT_NEW_STACK, newDisplaySetHandler);
1075
+ // this doesn't makes sense that we are listening to this event on viewport element
1076
+ enabledVPElement.addEventListener(dist_esm.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME, newDisplaySetHandler);
1077
+ return () => {
1078
+ cineService.setCine({
1047
1079
  id: viewportId,
1048
1080
  isPlaying: false
1049
1081
  });
1050
- dist_esm.eventTarget.removeEventListener(dist_esm.Enums.Events.STACK_VIEWPORT_NEW_STACK, newStackCineHandler);
1082
+ dist_esm.eventTarget.removeEventListener(dist_esm.Enums.Events.STACK_VIEWPORT_NEW_STACK, newDisplaySetHandler);
1083
+ enabledVPElement.removeEventListener(dist_esm.Enums.Events.VOLUME_VIEWPORT_NEW_VOLUME, newDisplaySetHandler);
1051
1084
  };
1052
- }, [enabledVPElement, newStackCineHandler]);
1085
+ }, [enabledVPElement, newDisplaySetHandler, viewportId]);
1053
1086
  (0,react.useEffect)(() => {
1054
1087
  if (!cines || !cines[viewportId] || !enabledVPElement || !isMountedRef.current) {
1055
1088
  return;
1056
1089
  }
1057
1090
  cineHandler();
1058
1091
  return () => {
1059
- api.stopClip(enabledVPElement);
1092
+ cineService.stopClip(enabledVPElement);
1060
1093
  };
1061
- }, [cines, viewportId, enabledVPElement, cineHandler]);
1094
+ }, [cines, viewportId, cineService, enabledVPElement, cineHandler]);
1095
+ if (!isCineEnabled) {
1096
+ return null;
1097
+ }
1062
1098
  const cine = cines[viewportId];
1063
- const isPlaying = cine && cine.isPlaying || false;
1064
- return isCineEnabled && /*#__PURE__*/react.createElement(CinePlayerComponent, {
1099
+ const isPlaying = cine?.isPlaying || false;
1100
+ return /*#__PURE__*/react.createElement(RenderCinePlayer, {
1101
+ viewportId: viewportId,
1102
+ cineService: cineService,
1103
+ newStackFrameRate: newStackFrameRate,
1104
+ isPlaying: isPlaying,
1105
+ dynamicInfo: dynamicInfo,
1106
+ customizationService: customizationService
1107
+ });
1108
+ }
1109
+ function RenderCinePlayer({
1110
+ viewportId,
1111
+ cineService,
1112
+ newStackFrameRate,
1113
+ isPlaying,
1114
+ dynamicInfo: dynamicInfoProp,
1115
+ customizationService
1116
+ }) {
1117
+ const {
1118
+ component: CinePlayerComponent = ui_src/* CinePlayer */.F0
1119
+ } = customizationService.get('cinePlayer') ?? {};
1120
+ const [dynamicInfo, setDynamicInfo] = (0,react.useState)(dynamicInfoProp);
1121
+ (0,react.useEffect)(() => {
1122
+ setDynamicInfo(dynamicInfoProp);
1123
+ }, [dynamicInfoProp]);
1124
+
1125
+ /**
1126
+ * Use effect for handling 4D time index changed
1127
+ */
1128
+ (0,react.useEffect)(() => {
1129
+ if (!dynamicInfo) {
1130
+ return;
1131
+ }
1132
+ const handleTimePointIndexChange = evt => {
1133
+ const {
1134
+ volumeId,
1135
+ timePointIndex,
1136
+ numTimePoints,
1137
+ splittingTag
1138
+ } = evt.detail;
1139
+ setDynamicInfo({
1140
+ volumeId,
1141
+ timePointIndex,
1142
+ numTimePoints,
1143
+ label: splittingTag
1144
+ });
1145
+ };
1146
+ dist_esm.eventTarget.addEventListener(streaming_image_volume_loader_dist_esm/* Enums.Events */.fX.s.DYNAMIC_VOLUME_TIME_POINT_INDEX_CHANGED, handleTimePointIndexChange);
1147
+ return () => {
1148
+ dist_esm.eventTarget.removeEventListener(streaming_image_volume_loader_dist_esm/* Enums.Events */.fX.s.DYNAMIC_VOLUME_TIME_POINT_INDEX_CHANGED, handleTimePointIndexChange);
1149
+ };
1150
+ }, [dynamicInfo]);
1151
+ (0,react.useEffect)(() => {
1152
+ if (!dynamicInfo) {
1153
+ return;
1154
+ }
1155
+ const {
1156
+ volumeId,
1157
+ timePointIndex,
1158
+ numTimePoints,
1159
+ splittingTag
1160
+ } = dynamicInfo || {};
1161
+ const volume = dist_esm.cache.getVolume(volumeId);
1162
+ volume.timePointIndex = timePointIndex;
1163
+ setDynamicInfo({
1164
+ volumeId,
1165
+ timePointIndex,
1166
+ numTimePoints,
1167
+ label: splittingTag
1168
+ });
1169
+ }, []);
1170
+ const updateDynamicInfo = (0,react.useCallback)(props => {
1171
+ const {
1172
+ volumeId,
1173
+ timePointIndex
1174
+ } = props;
1175
+ const volume = dist_esm.cache.getVolume(volumeId);
1176
+ volume.timePointIndex = timePointIndex;
1177
+ }, []);
1178
+ return /*#__PURE__*/react.createElement(CinePlayerComponent, {
1065
1179
  className: "absolute left-1/2 bottom-3 -translate-x-1/2",
1066
1180
  frameRate: newStackFrameRate,
1067
1181
  isPlaying: isPlaying,
1068
1182
  onClose: () => {
1069
1183
  // also stop the clip
1070
- api.setCine({
1184
+ cineService.setCine({
1071
1185
  id: viewportId,
1072
1186
  isPlaying: false
1073
1187
  });
1074
- api.setIsCineEnabled(false);
1188
+ cineService.setIsCineEnabled(false);
1075
1189
  },
1076
1190
  onPlayPauseChange: isPlaying => {
1077
- api.setCine({
1191
+ cineService.setCine({
1078
1192
  id: viewportId,
1079
1193
  isPlaying
1080
1194
  });
1081
1195
  },
1082
- onFrameRateChange: frameRate => api.setCine({
1196
+ onFrameRateChange: frameRate => cineService.setCine({
1083
1197
  id: viewportId,
1084
1198
  frameRate
1085
- })
1199
+ }),
1200
+ dynamicInfo: dynamicInfo,
1201
+ updateDynamicInfo: updateDynamicInfo
1086
1202
  });
1087
1203
  }
1088
1204
  /* harmony default export */ const CinePlayer = (WrappedCinePlayer);
@@ -2081,6 +2197,11 @@ const OHIFCornerstoneViewport = /*#__PURE__*/react.memo(props => {
2081
2197
  onReady
2082
2198
  } = props;
2083
2199
  const viewportId = viewportOptions.viewportId;
2200
+
2201
+ // Since we only have support for dynamic data in volume viewports, we should
2202
+ // handle this case here and set the viewportType to volume if any of the
2203
+ // displaySets are dynamic volumes
2204
+ viewportOptions.viewportType = displaySets.some(ds => ds.isDynamicVolume) ? 'volume' : viewportOptions.viewportType;
2084
2205
  const [scrollbarHeight, setScrollbarHeight] = (0,react.useState)('100px');
2085
2206
  const [enabledVPElement, setEnabledVPElement] = (0,react.useState)(null);
2086
2207
  const elementRef = (0,react.useRef)();
@@ -12,10 +12,10 @@ __webpack_require__.d(__webpack_exports__, {
12
12
  "default": () => (/* binding */ basic_dev_mode_src)
13
13
  });
14
14
 
15
- // EXTERNAL MODULE: ../../ui/src/index.js + 542 modules
16
- var src = __webpack_require__(48804);
17
- // EXTERNAL MODULE: ../../core/src/index.ts + 68 modules
18
- var core_src = __webpack_require__(85073);
15
+ // EXTERNAL MODULE: ../../ui/src/index.js + 785 modules
16
+ var src = __webpack_require__(5085);
17
+ // EXTERNAL MODULE: ../../core/src/index.ts + 70 modules
18
+ var core_src = __webpack_require__(55411);
19
19
  ;// CONCATENATED MODULE: ../../../modes/basic-dev-mode/src/toolbarButtons.js
20
20
 
21
21
 
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[2,481],{
2
+ (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[633,481],{
3
3
 
4
- /***/ 14349:
4
+ /***/ 27400:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -22,12 +22,12 @@ const SOPClassHandlerId = `${id}.sopClassHandlerModule.${SOPClassHandlerName}`;
22
22
 
23
23
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
24
24
  var react = __webpack_require__(41766);
25
- // EXTERNAL MODULE: ../../core/src/index.ts + 68 modules
26
- var src = __webpack_require__(85073);
27
- // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 383 modules
28
- var esm = __webpack_require__(50719);
29
- // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 16 modules
30
- var dist_esm = __webpack_require__(20767);
25
+ // EXTERNAL MODULE: ../../core/src/index.ts + 70 modules
26
+ var src = __webpack_require__(55411);
27
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 327 modules
28
+ var esm = __webpack_require__(44656);
29
+ // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 18 modules
30
+ var dist_esm = __webpack_require__(24542);
31
31
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/adapters/dist/adapters.es.js
32
32
  var adapters_es = __webpack_require__(83342);
33
33
  // EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
@@ -315,10 +315,10 @@ function getHangingProtocolModule() {
315
315
 
316
316
  // EXTERNAL MODULE: ./state/index.js + 1 modules
317
317
  var state = __webpack_require__(15575);
318
- // EXTERNAL MODULE: ../../ui/src/index.js + 542 modules
319
- var ui_src = __webpack_require__(48804);
320
- // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 78 modules
321
- var default_src = __webpack_require__(54090);
318
+ // EXTERNAL MODULE: ../../ui/src/index.js + 785 modules
319
+ var ui_src = __webpack_require__(5085);
320
+ // EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 83 modules
321
+ var default_src = __webpack_require__(88083);
322
322
  // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
323
323
  var prop_types = __webpack_require__(11374);
324
324
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
@@ -683,13 +683,16 @@ function PanelSegmentation({
683
683
  segmentationId
684
684
  });
685
685
  };
686
- const SegmentationGroupTableComponent = components[configuration?.segmentationPanelMode];
686
+ const SegmentationGroupTableComponent = components[configuration?.segmentationPanelMode] || ui_src/* SegmentationGroupTable */.QQ;
687
+ const allowAddSegment = configuration?.addSegment;
688
+ const onSegmentationAddWrapper = configuration?.onSegmentationAdd && typeof configuration?.onSegmentationAdd === 'function' ? configuration?.onSegmentationAdd : onSegmentationAdd;
687
689
  return /*#__PURE__*/react.createElement(SegmentationGroupTableComponent, {
688
690
  title: t('Segmentations'),
689
691
  segmentations: segmentations,
690
692
  disableEditing: configuration.disableEditing,
691
693
  activeSegmentationId: selectedSegmentationId || '',
692
- onSegmentationAdd: onSegmentationAdd,
694
+ onSegmentationAdd: onSegmentationAddWrapper,
695
+ showAddSegment: allowAddSegment,
693
696
  onSegmentationClick: onSegmentationClick,
694
697
  onSegmentationDelete: onSegmentationDelete,
695
698
  onSegmentationDownload: onSegmentationDownload,
@@ -738,7 +741,6 @@ PanelSegmentation.propTypes = {
738
741
 
739
742
 
740
743
 
741
-
742
744
  const getPanelModule = ({
743
745
  commandsManager,
744
746
  servicesManager,
@@ -751,22 +753,19 @@ const getPanelModule = ({
751
753
  } = servicesManager.services;
752
754
  const wrappedPanelSegmentation = configuration => {
753
755
  const [appConfig] = (0,state/* useAppConfig */.r)();
754
- const disableEditingForMode = customizationService.get('segmentation.disableEditing');
755
- const segmentationPanelMode = customizationService.get('segmentation.segmentationPanelMode')?.value || SegmentationPanelMode.Dropdown;
756
756
  return /*#__PURE__*/react.createElement(PanelSegmentation, {
757
757
  commandsManager: commandsManager,
758
758
  servicesManager: servicesManager,
759
759
  extensionManager: extensionManager,
760
760
  configuration: {
761
761
  ...configuration,
762
- disableEditing: appConfig.disableEditing || disableEditingForMode?.value,
763
- segmentationPanelMode: segmentationPanelMode
762
+ disableEditing: appConfig.disableEditing,
763
+ ...customizationService.get('segmentation.panel')
764
764
  }
765
765
  });
766
766
  };
767
767
  const wrappedPanelSegmentationWithTools = configuration => {
768
768
  const [appConfig] = (0,state/* useAppConfig */.r)();
769
- const segmentationPanelMode = customizationService.get('segmentation.segmentationPanelMode')?.value || SegmentationPanelMode.Dropdown;
770
769
  return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(ui_src/* Toolbox */.OO, {
771
770
  commandsManager: commandsManager,
772
771
  servicesManager: servicesManager,
@@ -782,7 +781,8 @@ const getPanelModule = ({
782
781
  extensionManager: extensionManager,
783
782
  configuration: {
784
783
  ...configuration,
785
- segmentationPanelMode: segmentationPanelMode
784
+ disableEditing: appConfig.disableEditing,
785
+ ...customizationService.get('segmentation.panel')
786
786
  }
787
787
  }));
788
788
  };
@@ -805,8 +805,8 @@ const getPanelModule = ({
805
805
  var ImageMarchingSquares = __webpack_require__(52754);
806
806
  // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/Core/DataArray.js
807
807
  var DataArray = __webpack_require__(45128);
808
- // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/DataModel/ImageData.js + 2 modules
809
- var ImageData = __webpack_require__(94448);
808
+ // EXTERNAL MODULE: ../../../node_modules/@kitware/vtk.js/Common/DataModel/ImageData.js
809
+ var ImageData = __webpack_require__(51250);
810
810
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/hydrationUtils.ts
811
811
 
812
812
 
@@ -1487,31 +1487,25 @@ function getToolbarModule({
1487
1487
  }
1488
1488
  }];
1489
1489
  }
1490
+
1491
+ // Todo: this is duplicate, we should move it to a shared location
1490
1492
  function getToolNameForButton(button) {
1491
1493
  const {
1492
1494
  props
1493
1495
  } = button;
1494
1496
  const commands = props?.commands || button.commands;
1495
- if (commands && commands.length) {
1496
- const command = commands[0];
1497
- const {
1498
- commandOptions
1499
- } = command;
1500
- const {
1501
- toolName
1502
- } = commandOptions || {
1503
- toolName: props?.id ?? button.id
1504
- };
1505
- return toolName;
1497
+ const commandsArray = Array.isArray(commands) ? commands : [commands];
1498
+ const firstCommand = commandsArray[0];
1499
+ if (typeof firstCommand === 'string') {
1500
+ // likely not a cornerstone tool
1501
+ return null;
1502
+ }
1503
+ if ('commandOptions' in firstCommand) {
1504
+ return firstCommand.commandOptions.toolName ?? props?.id ?? button.id;
1506
1505
  }
1507
- return null;
1508
- }
1509
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/init.ts
1510
1506
 
1511
- function init({
1512
- servicesManager
1513
- }) {
1514
- (0,dist_esm.addTool)(dist_esm.BrushTool);
1507
+ // use id as a fallback for toolName
1508
+ return props?.id ?? button.id;
1515
1509
  }
1516
1510
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/index.tsx
1517
1511
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@@ -1522,7 +1516,6 @@ function _extends() { _extends = Object.assign ? Object.assign.bind() : function
1522
1516
 
1523
1517
 
1524
1518
 
1525
-
1526
1519
  const Component = /*#__PURE__*/react.lazy(() => {
1527
1520
  return __webpack_require__.e(/* import() */ 295).then(__webpack_require__.bind(__webpack_require__, 58295));
1528
1521
  });
@@ -1541,7 +1534,6 @@ const extension = {
1541
1534
  * You ID can be anything you want, but it should be unique.
1542
1535
  */
1543
1536
  id: id,
1544
- preRegistration: init,
1545
1537
  /**
1546
1538
  * PanelModule should provide a list of panels that will be available in OHIF
1547
1539
  * for Modes to consume and render. Each panel is defined by a {name,