@ohif/app 3.7.0-beta.5 → 3.7.0-beta.51

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 (54) hide show
  1. package/dist/{917.bundle.24fc5ca2280d2980bf0f.js → 12.bundle.d02c9736f7bdaabbf1df.js} +6 -6
  2. package/dist/{295.bundle.957b1159fec14b9199a1.js → 125.bundle.1ae4c6313c31cd0502cc.js} +4 -4
  3. package/dist/{208.bundle.e50761cf714ac772d9cc.js → 128.bundle.4b39b6452213ebee2101.js} +6 -6
  4. package/dist/{616.bundle.cbb2e0a23b1343b6441f.js → 150.bundle.4ff43d080c1803b2ccf6.js} +148 -104
  5. package/dist/{351.bundle.0742237651aef9694a65.js → 181.bundle.234fef330d4fe6baca8b.js} +139 -128
  6. package/dist/{351.css → 181.css} +1 -1
  7. package/dist/{606.bundle.5d876f5f3dd8287f0a28.js → 202.bundle.ac1e5e25d4daf54581b1.js} +3705 -981
  8. package/dist/{926.bundle.dbc9d0e591cb9217fda2.js → 220.bundle.f7e1c96c94245e70f2be.js} +990 -400
  9. package/dist/{664.bundle.09abae984223969d1bde.js → 23.bundle.e008ad788170f2ed5569.js} +5 -6
  10. package/dist/{976.bundle.3b8f97b61cdfa7dc32e3.js → 236.bundle.bce2af055e7783bd5df2.js} +38 -24
  11. package/dist/{55.bundle.550a823e75eb608e8d5e.js → 250.bundle.a523e899f4fb640949f9.js} +37 -25
  12. package/dist/{82.bundle.0456c9e58fa89b131f14.js → 260.bundle.32abfef92f05f0492bd7.js} +695 -159
  13. package/dist/{973.bundle.77245411064eaa3ee79a.js → 281.bundle.8b2abf41fb9774a672af.js} +18 -14
  14. package/dist/{744.bundle.81246dc9f043a17fde8a.js → 30.bundle.910818cf3256bcbe1e7b.js} +77 -89
  15. package/dist/{192.bundle.6dc1f92074738663620f.js → 348.bundle.90111e66d54917f1b2c2.js} +18 -14
  16. package/dist/{404.bundle.b7b371a30ca5bc5a0554.js → 359.bundle.86327c3bb486584e88a8.js} +13 -19
  17. package/dist/{50.bundle.135ada11018fff84d66b.js → 378.bundle.f7018f5e9dc009c1600b.js} +10 -8
  18. package/dist/{790.bundle.ca48b21507b91b675810.js → 410.bundle.92d296d4b09d8e82f386.js} +6 -6
  19. package/dist/{151.bundle.31ea35044218837bf73f.js → 417.bundle.720dc8f3a6e99f378aa9.js} +9 -11
  20. package/dist/{569.bundle.21f8ad57c06a210448b5.js → 451.bundle.9941d9134fcf747d452a.js} +62 -81
  21. package/dist/{581.bundle.dc6197189f7c88c27d4c.js → 471.bundle.c9e618aeda78362776aa.js} +43 -72
  22. package/dist/{199.bundle.dff92336f7bc36f2e484.js → 506.bundle.e7e138496747d049843e.js} +79 -15
  23. package/dist/{935.bundle.deeffff0e4f7b528e3c3.js → 604.bundle.a51f83e64004bca5f497.js} +2 -3
  24. package/dist/{984.bundle.0301a876361809048be0.js → 663.bundle.8f1eb54994e740164a70.js} +52 -35
  25. package/dist/{531.bundle.2a82fb1d69e5b57cc72b.js → 677.bundle.ec5f2b4707db33bd4d8e.js} +731 -447
  26. package/dist/{707.bundle.7068a46e5be26fe60fce.js → 678.bundle.fc6b51e7a4f17c57f311.js} +238 -247
  27. package/dist/{205.bundle.b5a473c200dcf2bbcdb4.js → 686.bundle.70565410179f1e7d22e6.js} +4 -4
  28. package/dist/{331.bundle.bd0c13931a21d53086c9.js → 754.bundle.8a16fc8ad21fe00c2e15.js} +12346 -7519
  29. package/dist/{728.bundle.d13856835357400fef82.js → 774.bundle.8ba82ee206266eb2da5e.js} +90 -63
  30. package/dist/{381.bundle.0905e683605fcbc0895f.js → 775.bundle.2285e7e0e67878948c0d.js} +16 -16
  31. package/dist/{283.bundle.f06203ec47c287f44cea.js → 782.bundle.4bcf99c54d62bacf5195.js} +57 -26
  32. package/dist/{642.bundle.e8d980d4ba95b0b2665f.js → 814.bundle.c0d69af52c06e4409f38.js} +6 -6
  33. package/dist/{799.bundle.758558e64147e5aad612.js → 822.bundle.d40c439da659f0e8500d.js} +65 -16
  34. package/dist/{953.bundle.3b0189ebc11cf0946f18.js → 886.bundle.68ef58774a6837f57631.js} +11 -10
  35. package/dist/{270.bundle.4564621556b0f963a004.js → 925.bundle.a2f1103d968c53a2b8fb.js} +626 -544
  36. package/dist/945.min.worker.js +1 -1
  37. package/dist/945.min.worker.js.map +1 -1
  38. package/dist/app-config.js +7 -7
  39. package/dist/{app.bundle.3ab8624d0394f1b10a0d.js → app.bundle.cbf4363d789f3e24553e.js} +59258 -59602
  40. package/dist/app.bundle.css +9 -9
  41. package/dist/cornerstoneDICOMImageLoader.min.js +1 -1
  42. package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -1
  43. package/dist/{dicom-microscopy-viewer.bundle.aa60bdf008c32c39cfd7.js → dicom-microscopy-viewer.bundle.44f7fedc03a58d5911d1.js} +3 -3
  44. package/dist/google.js +6 -5
  45. package/dist/index.html +1 -1
  46. package/dist/{index.worker.1c69152d710fa7b84bce.worker.js → index.worker.e62ecca63f1a2e124230.worker.js} +2 -2
  47. package/dist/index.worker.e62ecca63f1a2e124230.worker.js.map +1 -0
  48. package/dist/sw.js +1 -1
  49. package/package.json +19 -20
  50. package/dist/780.bundle.fd0f13dc92e9caa0581e.js +0 -4769
  51. package/dist/index.worker.1c69152d710fa7b84bce.worker.js.map +0 -1
  52. /package/dist/{55.css → 250.css} +0 -0
  53. /package/dist/{806.css → 579.css} +0 -0
  54. /package/dist/{707.css → 678.css} +0 -0
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[50],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[378],{
3
3
 
4
- /***/ 24050:
4
+ /***/ 34378:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -103,7 +103,9 @@ const codeMenuItem = {
103
103
  const {
104
104
  code: codeRef
105
105
  } = this;
106
- if (!codeRef) throw new Error(`item ${this} has no code ref`);
106
+ if (!codeRef) {
107
+ throw new Error(`item ${this} has no code ref`);
108
+ }
107
109
  const codingValues = customizationService.get('codingValues');
108
110
  const code = codingValues[codeRef];
109
111
  return {
@@ -239,7 +241,7 @@ function getCustomizationModule() {
239
241
  * From 'this', it uses:
240
242
  * `sameAttribute` as the attribute name to look for
241
243
  * `sameDisplaySetId` as the display set id to look for
242
- * From `options`, it looks for
244
+ * From `options`, it looks for
243
245
  */
244
246
  /* harmony default export */ function sameAs(displaySet, options) {
245
247
  const {
@@ -247,11 +249,11 @@ function getCustomizationModule() {
247
249
  sameDisplaySetId
248
250
  } = this;
249
251
  if (!sameAttribute) {
250
- console.log("sameAttribute not defined in", this);
252
+ console.log('sameAttribute not defined in', this);
251
253
  return `sameAttribute not defined in ${this.id}`;
252
254
  }
253
255
  if (!sameDisplaySetId) {
254
- console.log("sameDisplaySetId not defined in", this);
256
+ console.log('sameDisplaySetId not defined in', this);
255
257
  return `sameDisplaySetId not defined in ${this.id}`;
256
258
  }
257
259
  const {
@@ -260,7 +262,7 @@ function getCustomizationModule() {
260
262
  } = options;
261
263
  const match = displaySetMatchDetails.get(sameDisplaySetId);
262
264
  if (!match) {
263
- console.log("No match for display set", sameDisplaySetId);
265
+ console.log('No match for display set', sameDisplaySetId);
264
266
  return false;
265
267
  }
266
268
  const {
@@ -268,7 +270,7 @@ function getCustomizationModule() {
268
270
  } = match;
269
271
  const altDisplaySet = displaySets.find(it => it.displaySetInstanceUID == displaySetInstanceUID);
270
272
  if (!altDisplaySet) {
271
- console.log("No display set found with", displaySetInstanceUID, "in", displaySets);
273
+ console.log('No display set found with', displaySetInstanceUID, 'in', displaySets);
272
274
  return false;
273
275
  }
274
276
  const testValue = altDisplaySet[sameAttribute];
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[790],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[410],{
3
3
 
4
- /***/ 17790:
4
+ /***/ 15410:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -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 + 452 modules
16
- var src = __webpack_require__(28619);
17
- // EXTERNAL MODULE: ../../core/src/index.ts + 101 modules
18
- var core_src = __webpack_require__(48501);
15
+ // EXTERNAL MODULE: ../../ui/src/index.js + 456 modules
16
+ var src = __webpack_require__(60082);
17
+ // EXTERNAL MODULE: ../../core/src/index.ts + 104 modules
18
+ var core_src = __webpack_require__(24966);
19
19
  ;// CONCATENATED MODULE: ../../../modes/basic-dev-mode/src/toolbarButtons.js
20
20
  // TODO: torn, can either bake this here; or have to create a whole new button type
21
21
  // Only ways that you can pass in a custom React component for render :l
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[151],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[417],{
3
3
 
4
- /***/ 71251:
4
+ /***/ 15747:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
@@ -603,24 +603,23 @@ function calculateSUVScalingFactors(instances) {
603
603
  }
604
604
 
605
605
 
606
- //# sourceMappingURL=calculate-suv.esm.js.map
607
606
 
608
607
 
609
608
  /***/ }),
610
609
 
611
- /***/ 21767:
610
+ /***/ 94614:
612
611
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
613
612
 
614
613
  /* harmony export */ __webpack_require__.d(__webpack_exports__, {
615
614
  /* harmony export */ S_: () => (/* binding */ VariableSizeList)
616
615
  /* harmony export */ });
617
616
  /* unused harmony exports FixedSizeGrid, FixedSizeList, VariableSizeGrid, areEqual, shouldComponentUpdate */
618
- /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(20011);
619
- /* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(93173);
620
- /* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(23788);
621
- /* harmony import */ var memoize_one__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(89454);
622
- /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(32735);
623
- /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(66017);
617
+ /* harmony import */ var _babel_runtime_helpers_esm_extends__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(76805);
618
+ /* harmony import */ var _babel_runtime_helpers_esm_assertThisInitialized__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(80107);
619
+ /* harmony import */ var _babel_runtime_helpers_esm_inheritsLoose__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(84067);
620
+ /* harmony import */ var memoize_one__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(25539);
621
+ /* harmony import */ var react__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(43001);
622
+ /* harmony import */ var _babel_runtime_helpers_esm_objectWithoutPropertiesLoose__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(8339);
624
623
 
625
624
 
626
625
 
@@ -2571,7 +2570,6 @@ function shouldComponentUpdate(nextProps, nextState) {
2571
2570
  }
2572
2571
 
2573
2572
 
2574
- //# sourceMappingURL=index.esm.js.map
2575
2573
 
2576
2574
 
2577
2575
  /***/ })
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[569],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[451],{
3
3
 
4
- /***/ 33569:
4
+ /***/ 4451:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -13,16 +13,16 @@ __webpack_require__.d(__webpack_exports__, {
13
13
  });
14
14
 
15
15
  // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
16
- var prop_types = __webpack_require__(60216);
16
+ var prop_types = __webpack_require__(3827);
17
17
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
18
18
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
19
- var react = __webpack_require__(32735);
19
+ var react = __webpack_require__(43001);
20
20
  // EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
21
- var es = __webpack_require__(21572);
22
- // EXTERNAL MODULE: ../../core/src/index.ts + 101 modules
23
- var src = __webpack_require__(48501);
24
- // EXTERNAL MODULE: ../../ui/src/index.js + 452 modules
25
- var ui_src = __webpack_require__(28619);
21
+ var es = __webpack_require__(69190);
22
+ // EXTERNAL MODULE: ../../core/src/index.ts + 104 modules
23
+ var src = __webpack_require__(24966);
24
+ // EXTERNAL MODULE: ../../ui/src/index.js + 456 modules
25
+ var ui_src = __webpack_require__(60082);
26
26
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts
27
27
  function createSEGToolGroupAndAddTools(ToolGroupService, customizationService, toolGroupId) {
28
28
  const {
@@ -31,59 +31,8 @@ function createSEGToolGroupAndAddTools(ToolGroupService, customizationService, t
31
31
  return ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, {});
32
32
  }
33
33
  /* harmony default export */ const initSEGToolGroup = (createSEGToolGroupAndAddTools);
34
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts
35
- async function _hydrateSEGDisplaySet(_ref) {
36
- let {
37
- segDisplaySet,
38
- viewportIndex,
39
- servicesManager
40
- } = _ref;
41
- const {
42
- segmentationService,
43
- hangingProtocolService,
44
- viewportGridService
45
- } = servicesManager.services;
46
- const displaySetInstanceUID = segDisplaySet.referencedDisplaySetInstanceUID;
47
- let segmentationId = null;
48
-
49
- // We need the hydration to notify panels about the new segmentation added
50
- const suppressEvents = false;
51
- segmentationId = await segmentationService.createSegmentationForSEGDisplaySet(segDisplaySet, segmentationId, suppressEvents);
52
- segmentationService.hydrateSegmentation(segDisplaySet.displaySetInstanceUID);
53
- const {
54
- viewports
55
- } = viewportGridService.getState();
56
- const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(viewportIndex, displaySetInstanceUID);
57
-
58
- // Todo: fix this after we have a better way for stack viewport segmentations
59
-
60
- // check every viewport in the viewports to see if the displaySetInstanceUID
61
- // is being displayed, if so we need to update the viewport to use volume viewport
62
- // (if already is not using it) since Cornerstone3D currently only supports
63
- // volume viewport for segmentation
64
- viewports.forEach((viewport, index) => {
65
- if (index === viewportIndex) {
66
- return;
67
- }
68
- const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(viewport.displaySetInstanceUIDs, segDisplaySet.displaySetInstanceUID);
69
- if (shouldDisplaySeg) {
70
- updatedViewports.push({
71
- viewportIndex: index,
72
- displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
73
- viewportOptions: {
74
- initialImageOptions: {
75
- preset: 'middle'
76
- }
77
- }
78
- });
79
- }
80
- });
81
-
82
- // Do the entire update at once
83
- viewportGridService.setDisplaySetsForViewports(updatedViewports);
84
- return true;
85
- }
86
- /* harmony default export */ const _hydrateSEG = (_hydrateSEGDisplaySet);
34
+ // EXTERNAL MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/_hydrateSEG.ts
35
+ var _hydrateSEG = __webpack_require__(28417);
87
36
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts
88
37
 
89
38
 
@@ -96,7 +45,8 @@ function promptHydrateSEG(_ref) {
96
45
  let {
97
46
  servicesManager,
98
47
  segDisplaySet,
99
- viewportIndex
48
+ viewportIndex,
49
+ preHydrateCallbacks
100
50
  } = _ref;
101
51
  const {
102
52
  uiViewportDialogService
@@ -104,7 +54,10 @@ function promptHydrateSEG(_ref) {
104
54
  return new Promise(async function (resolve, reject) {
105
55
  const promptResult = await _askHydrate(uiViewportDialogService, viewportIndex);
106
56
  if (promptResult === RESPONSE.HYDRATE_SEG) {
107
- const isHydrated = await _hydrateSEG({
57
+ preHydrateCallbacks?.forEach(callback => {
58
+ callback();
59
+ });
60
+ const isHydrated = await (0,_hydrateSEG/* default */.Z)({
108
61
  segDisplaySet,
109
62
  viewportIndex,
110
63
  servicesManager
@@ -156,8 +109,8 @@ function _getStatusComponent(_ref) {
156
109
  let StatusIcon = null;
157
110
  const {
158
111
  t
159
- } = (0,es/* useTranslation */.$G)("Common");
160
- const loadStr = t("LOAD");
112
+ } = (0,es/* useTranslation */.$G)('Common');
113
+ const loadStr = t('LOAD');
161
114
  switch (isHydrated) {
162
115
  case true:
163
116
  StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
@@ -211,7 +164,8 @@ function OHIFCornerstoneSEGViewport(props) {
211
164
  viewportIndex,
212
165
  viewportLabel,
213
166
  servicesManager,
214
- extensionManager
167
+ extensionManager,
168
+ commandsManager
215
169
  } = props;
216
170
  const {
217
171
  t
@@ -233,7 +187,6 @@ function OHIFCornerstoneSEGViewport(props) {
233
187
  const [viewportGrid, viewportGridService] = (0,ui_src/* useViewportGrid */.O_)();
234
188
 
235
189
  // States
236
- const [isToolGroupCreated, setToolGroupCreated] = (0,react.useState)(false);
237
190
  const [selectedSegment, setSelectedSegment] = (0,react.useState)(1);
238
191
 
239
192
  // Hydration means that the SEG is opened and segments are loaded into the
@@ -256,7 +209,7 @@ function OHIFCornerstoneSEGViewport(props) {
256
209
  activeViewportIndex
257
210
  } = viewportGrid;
258
211
  const referencedDisplaySet = segDisplaySet.getReferenceDisplaySet();
259
- const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(referencedDisplaySet);
212
+ const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(referencedDisplaySet, segDisplaySet);
260
213
  referencedDisplaySetRef.current = {
261
214
  displaySet: referencedDisplaySet,
262
215
  metadata: referencedDisplaySetMetadata
@@ -273,6 +226,16 @@ function OHIFCornerstoneSEGViewport(props) {
273
226
  const onElementDisabled = () => {
274
227
  setElement(null);
275
228
  };
229
+ const storePresentationState = (0,react.useCallback)(() => {
230
+ viewportGrid?.viewports.forEach(_ref => {
231
+ let {
232
+ viewportIndex
233
+ } = _ref;
234
+ commandsManager.runCommand('storePresentation', {
235
+ viewportIndex
236
+ });
237
+ });
238
+ }, [viewportGrid]);
276
239
  const getCornerstoneViewport = (0,react.useCallback)(() => {
277
240
  const {
278
241
  component: Component
@@ -322,7 +285,8 @@ function OHIFCornerstoneSEGViewport(props) {
322
285
  utils_promptHydrateSEG({
323
286
  servicesManager,
324
287
  viewportIndex,
325
- segDisplaySet
288
+ segDisplaySet,
289
+ preHydrateCallbacks: [storePresentationState]
326
290
  }).then(isHydrated => {
327
291
  if (isHydrated) {
328
292
  setIsHydrated(true);
@@ -351,11 +315,11 @@ function OHIFCornerstoneSEGViewport(props) {
351
315
  (0,react.useEffect)(() => {
352
316
  const {
353
317
  unsubscribe
354
- } = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, _ref => {
318
+ } = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, _ref2 => {
355
319
  let {
356
320
  percentComplete,
357
321
  numSegments
358
- } = _ref;
322
+ } = _ref2;
359
323
  setProcessingProgress({
360
324
  percentComplete,
361
325
  totalSegments: numSegments
@@ -370,10 +334,10 @@ function OHIFCornerstoneSEGViewport(props) {
370
334
  Cleanup the SEG viewport when the viewport is destroyed
371
335
  */
372
336
  (0,react.useEffect)(() => {
373
- const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, _ref2 => {
337
+ const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, _ref3 => {
374
338
  let {
375
339
  displaySetInstanceUIDs
376
- } = _ref2;
340
+ } = _ref3;
377
341
  const activeViewport = viewports[activeViewportIndex];
378
342
  if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) {
379
343
  viewportGridService.setDisplaySetsForViewport({
@@ -395,7 +359,6 @@ function OHIFCornerstoneSEGViewport(props) {
395
359
  // This creates a custom tool group which has the lifetime of this view
396
360
  // only, and does NOT interfere with currently displayed segmentations.
397
361
  toolGroup = initSEGToolGroup(toolGroupService, customizationService, toolGroupId);
398
- setToolGroupCreated(true);
399
362
  return () => {
400
363
  // remove the segmentation representations if seg displayset changed
401
364
  segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);
@@ -438,7 +401,14 @@ function OHIFCornerstoneSEGViewport(props) {
438
401
  SpacingBetweenSlices
439
402
  } = referencedDisplaySetRef.current.metadata;
440
403
  const onStatusClick = async () => {
441
- const isHydrated = await _hydrateSEG({
404
+ // Before hydrating a SEG and make it added to all viewports in the grid
405
+ // that share the same frameOfReferenceUID, we need to store the viewport grid
406
+ // presentation state, so that we can restore it after hydrating the SEG. This is
407
+ // required if the user has changed the viewport (other viewport than SEG viewport)
408
+ // presentation state (w/l and invert) and then opens the SEG. If we don't store
409
+ // the presentation state, the viewport will be reset to the default presentation
410
+ storePresentationState();
411
+ const isHydrated = await (0,_hydrateSEG/* default */.Z)({
442
412
  segDisplaySet,
443
413
  viewportIndex,
444
414
  servicesManager
@@ -467,8 +437,9 @@ function OHIFCornerstoneSEGViewport(props) {
467
437
  patientSex: PatientSex || '',
468
438
  patientAge: PatientAge || '',
469
439
  MRN: PatientID || '',
470
- thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '',
471
- spacing: SpacingBetweenSlices !== undefined ? `${SpacingBetweenSlices.toFixed(2)}mm` : '',
440
+ thickness: SliceThickness ? src.utils.roundNumber(SliceThickness, 2) : '',
441
+ thicknessUnits: SliceThickness !== undefined ? 'mm' : '',
442
+ spacing: SpacingBetweenSlices !== undefined ? src.utils.roundNumber(SpacingBetweenSlices, 2) : '',
472
443
  scanner: ManufacturerModelName || ''
473
444
  }
474
445
  }
@@ -491,20 +462,30 @@ OHIFCornerstoneSEGViewport.propTypes = {
491
462
  OHIFCornerstoneSEGViewport.defaultProps = {
492
463
  customProps: {}
493
464
  };
494
- function _getReferencedDisplaySetMetadata(referencedDisplaySet) {
465
+ function _getReferencedDisplaySetMetadata(referencedDisplaySet, segDisplaySet) {
466
+ const {
467
+ SharedFunctionalGroupsSequence: [SharedFunctionalGroup]
468
+ } = segDisplaySet.instance;
469
+ const {
470
+ PixelMeasuresSequence: [PixelMeasures]
471
+ } = SharedFunctionalGroup;
472
+ const {
473
+ SpacingBetweenSlices,
474
+ SliceThickness
475
+ } = PixelMeasures;
495
476
  const image0 = referencedDisplaySet.images[0];
496
477
  const referencedDisplaySetMetadata = {
497
478
  PatientID: image0.PatientID,
498
479
  PatientName: image0.PatientName,
499
480
  PatientSex: image0.PatientSex,
500
481
  PatientAge: image0.PatientAge,
501
- SliceThickness: image0.SliceThickness,
482
+ SliceThickness: image0.SliceThickness || SliceThickness,
502
483
  StudyDate: image0.StudyDate,
503
484
  SeriesDescription: image0.SeriesDescription,
504
485
  SeriesInstanceUID: image0.SeriesInstanceUID,
505
486
  SeriesNumber: image0.SeriesNumber,
506
487
  ManufacturerModelName: image0.ManufacturerModelName,
507
- SpacingBetweenSlices: image0.SpacingBetweenSlices
488
+ SpacingBetweenSlices: image0.SpacingBetweenSlices || SpacingBetweenSlices
508
489
  };
509
490
  return referencedDisplaySetMetadata;
510
491
  }
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[581],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[471],{
3
3
 
4
- /***/ 72581:
4
+ /***/ 56471:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -13,68 +13,16 @@ __webpack_require__.d(__webpack_exports__, {
13
13
  });
14
14
 
15
15
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
16
- var react = __webpack_require__(32735);
16
+ var react = __webpack_require__(43001);
17
17
  // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
18
- var prop_types = __webpack_require__(60216);
18
+ var prop_types = __webpack_require__(3827);
19
19
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
20
- // EXTERNAL MODULE: ../../core/src/index.ts + 101 modules
21
- var src = __webpack_require__(48501);
22
- // EXTERNAL MODULE: ../../ui/src/index.js + 452 modules
23
- var ui_src = __webpack_require__(28619);
24
- ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts
25
- async function _hydrateRTDisplaySet(_ref) {
26
- let {
27
- rtDisplaySet,
28
- viewportIndex,
29
- servicesManager
30
- } = _ref;
31
- const {
32
- segmentationService,
33
- hangingProtocolService,
34
- viewportGridService
35
- } = servicesManager.services;
36
- const displaySetInstanceUID = rtDisplaySet.referencedDisplaySetInstanceUID;
37
- let segmentationId = null;
38
-
39
- // We need the hydration to notify panels about the new segmentation added
40
- const suppressEvents = false;
41
- segmentationId = await segmentationService.createSegmentationForRTDisplaySet(rtDisplaySet, segmentationId, suppressEvents);
42
- segmentationService.hydrateSegmentation(rtDisplaySet.displaySetInstanceUID);
43
- const {
44
- viewports
45
- } = viewportGridService.getState();
46
- const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(viewportIndex, displaySetInstanceUID);
47
- viewportGridService.setDisplaySetsForViewports(updatedViewports);
48
-
49
- // Todo: fix this after we have a better way for stack viewport segmentations
50
-
51
- // check every viewport in the viewports to see if the displaySetInstanceUID
52
- // is being displayed, if so we need to update the viewport to use volume viewport
53
- // (if already is not using it) since Cornerstone3D currently only supports
54
- // volume viewport for segmentation
55
- viewports.forEach((viewport, index) => {
56
- if (index === viewportIndex) {
57
- return;
58
- }
59
- const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(viewport.displaySetInstanceUIDs, rtDisplaySet.displaySetInstanceUID);
60
- if (shouldDisplaySeg) {
61
- updatedViewports.push({
62
- viewportIndex: index,
63
- displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
64
- viewportOptions: {
65
- initialImageOptions: {
66
- preset: 'middle'
67
- }
68
- }
69
- });
70
- }
71
- });
72
-
73
- // Do the entire update at once
74
- viewportGridService.setDisplaySetsForViewports(updatedViewports);
75
- return true;
76
- }
77
- /* harmony default export */ const _hydrateRT = (_hydrateRTDisplaySet);
20
+ // EXTERNAL MODULE: ../../core/src/index.ts + 104 modules
21
+ var src = __webpack_require__(24966);
22
+ // EXTERNAL MODULE: ../../ui/src/index.js + 456 modules
23
+ var ui_src = __webpack_require__(60082);
24
+ // EXTERNAL MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts
25
+ var _hydrateRT = __webpack_require__(50995);
78
26
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts
79
27
 
80
28
 
@@ -88,7 +36,8 @@ function promptHydrateRT(_ref) {
88
36
  servicesManager,
89
37
  rtDisplaySet,
90
38
  viewportIndex,
91
- toolGroupId = 'default'
39
+ toolGroupId = 'default',
40
+ preHydrateCallbacks
92
41
  } = _ref;
93
42
  const {
94
43
  uiViewportDialogService
@@ -96,7 +45,10 @@ function promptHydrateRT(_ref) {
96
45
  return new Promise(async function (resolve, reject) {
97
46
  const promptResult = await _askHydrate(uiViewportDialogService, viewportIndex);
98
47
  if (promptResult === RESPONSE.HYDRATE_SEG) {
99
- const isHydrated = await _hydrateRT({
48
+ preHydrateCallbacks?.forEach(callback => {
49
+ callback();
50
+ });
51
+ const isHydrated = await (0,_hydrateRT/* default */.Z)({
100
52
  rtDisplaySet,
101
53
  viewportIndex,
102
54
  toolGroupId,
@@ -137,7 +89,7 @@ function _askHydrate(uiViewportDialogService, viewportIndex) {
137
89
  }
138
90
  /* harmony default export */ const utils_promptHydrateRT = (promptHydrateRT);
139
91
  // EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
140
- var es = __webpack_require__(21572);
92
+ var es = __webpack_require__(69190);
141
93
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/viewports/_getStatusComponent.tsx
142
94
 
143
95
 
@@ -213,7 +165,8 @@ function OHIFCornerstoneRTViewport(props) {
213
165
  viewportIndex,
214
166
  viewportLabel,
215
167
  servicesManager,
216
- extensionManager
168
+ extensionManager,
169
+ commandsManager
217
170
  } = props;
218
171
  const {
219
172
  displaySetService,
@@ -272,6 +225,16 @@ function OHIFCornerstoneRTViewport(props) {
272
225
  const onElementDisabled = () => {
273
226
  setElement(null);
274
227
  };
228
+ const storePresentationState = (0,react.useCallback)(() => {
229
+ viewportGrid?.viewports.forEach(_ref => {
230
+ let {
231
+ viewportIndex
232
+ } = _ref;
233
+ commandsManager.runCommand('storePresentation', {
234
+ viewportIndex
235
+ });
236
+ });
237
+ }, [viewportGrid]);
275
238
  const getCornerstoneViewport = (0,react.useCallback)(() => {
276
239
  const {
277
240
  component: Component
@@ -319,7 +282,8 @@ function OHIFCornerstoneRTViewport(props) {
319
282
  utils_promptHydrateRT({
320
283
  servicesManager,
321
284
  viewportIndex,
322
- rtDisplaySet
285
+ rtDisplaySet,
286
+ preHydrateCallbacks: [storePresentationState]
323
287
  }).then(isHydrated => {
324
288
  if (isHydrated) {
325
289
  setIsHydrated(true);
@@ -348,11 +312,11 @@ function OHIFCornerstoneRTViewport(props) {
348
312
  (0,react.useEffect)(() => {
349
313
  const {
350
314
  unsubscribe
351
- } = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, _ref => {
315
+ } = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, _ref2 => {
352
316
  let {
353
317
  percentComplete,
354
318
  numSegments
355
- } = _ref;
319
+ } = _ref2;
356
320
  setProcessingProgress({
357
321
  percentComplete,
358
322
  totalSegments: numSegments
@@ -367,10 +331,10 @@ function OHIFCornerstoneRTViewport(props) {
367
331
  Cleanup the SEG viewport when the viewport is destroyed
368
332
  */
369
333
  (0,react.useEffect)(() => {
370
- const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, _ref2 => {
334
+ const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, _ref3 => {
371
335
  let {
372
336
  displaySetInstanceUIDs
373
- } = _ref2;
337
+ } = _ref3;
374
338
  const activeViewport = viewports[activeViewportIndex];
375
339
  if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) {
376
340
  viewportGridService.setDisplaySetsForViewport({
@@ -431,7 +395,14 @@ function OHIFCornerstoneRTViewport(props) {
431
395
  SeriesNumber
432
396
  } = referencedDisplaySetRef.current.metadata;
433
397
  const onStatusClick = async () => {
434
- const isHydrated = await _hydrateRT({
398
+ // Before hydrating a RT and make it added to all viewports in the grid
399
+ // that share the same frameOfReferenceUID, we need to store the viewport grid
400
+ // presentation state, so that we can restore it after hydrating the RT. This is
401
+ // required if the user has changed the viewport (other viewport than RT viewport)
402
+ // presentation state (w/l and invert) and then opens the RT. If we don't store
403
+ // the presentation state, the viewport will be reset to the default presentation
404
+ storePresentationState();
405
+ const isHydrated = await (0,_hydrateRT/* default */.Z)({
435
406
  rtDisplaySet,
436
407
  viewportIndex,
437
408
  servicesManager