@ohif/app 3.7.0-beta.43 → 3.7.0-beta.46

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 (24) hide show
  1. package/dist/{150.bundle.94cbce497cafacd4a7d7.js → 150.bundle.2fa62b4d658df1500a7a.js} +71 -3
  2. package/dist/{181.bundle.817ca1ba6479fca5fd15.js → 181.bundle.f5476625f4ca901a1b91.js} +13 -34
  3. package/dist/{236.bundle.3c5f844ce9de4ec0777d.js → 236.bundle.c0a68163699ecfe3169a.js} +25 -11
  4. package/dist/{250.bundle.ee4bcf159c4d610acc3e.js → 250.bundle.1c1cb3520a9285138cfa.js} +18 -6
  5. package/dist/{30.bundle.8fb93818b3a58f29f7e3.js → 30.bundle.c0b2fa8984080ebcfbbc.js} +3 -1
  6. package/dist/{378.bundle.c908a6194c50544b45db.js → 378.bundle.61261ee41e0ea0955440.js} +8 -6
  7. package/dist/{869.bundle.c9c018e6757410919ed8.js → 451.bundle.a08889b823fb10803bd8.js} +38 -68
  8. package/dist/{810.bundle.b3e2cf57e00d35a12f30.js → 471.bundle.3238a0647d80970085f7.js} +36 -65
  9. package/dist/{506.bundle.44629077a406500707ea.js → 506.bundle.b23fa19d91dd23ab44be.js} +73 -4
  10. package/dist/{663.bundle.2dcb8a60d59464f4e563.js → 663.bundle.f5db124e3e922e61e76b.js} +27 -9
  11. package/dist/{678.bundle.13062f7926c30056aee1.js → 678.bundle.c07616be5e27371d875c.js} +103 -21
  12. package/dist/{821.bundle.d4120df6baeed120be9e.js → 821.bundle.d175d0a8f3f0148a1993.js} +79 -29
  13. package/dist/{app.bundle.2905ffdd301e3c34286e.js → app.bundle.7e5633a7d73fc76a884d.js} +255 -95
  14. package/dist/index.html +1 -1
  15. package/dist/sw.js +1 -1
  16. package/package.json +18 -18
  17. /package/dist/{12.bundle.f46296f27a36e6b95f76.js → 12.bundle.cff58bede0136dc8d013.js} +0 -0
  18. /package/dist/{128.bundle.963d34d21c01231fc804.js → 128.bundle.620a2fdce44958dbb9fb.js} +0 -0
  19. /package/dist/{281.bundle.ac92bd142441f317f308.js → 281.bundle.be238c748373d907dffe.js} +0 -0
  20. /package/dist/{348.bundle.323f57efcc2239950451.js → 348.bundle.dcebcb7b75ff9fcc1d5b.js} +0 -0
  21. /package/dist/{359.bundle.3ae0f07b1c428eeb00a8.js → 359.bundle.3cdac00ab9649a10741b.js} +0 -0
  22. /package/dist/{410.bundle.b3cbeff9c619149a2234.js → 410.bundle.fe0269b702be9c375abb.js} +0 -0
  23. /package/dist/{782.bundle.c511611d980f9aa6563b.js → 782.bundle.f2a1076331c6a6816314.js} +0 -0
  24. /package/dist/{814.bundle.8391ddacf39d7c699c5f.js → 814.bundle.69e55909aa8b5a776fe4.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (self["webpackChunk"] = self["webpackChunk"] || []).push([[810],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[471],{
3
3
 
4
- /***/ 31810:
4
+ /***/ 56471:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -21,60 +21,8 @@ var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
21
21
  var src = __webpack_require__(20599);
22
22
  // EXTERNAL MODULE: ../../ui/src/index.js + 452 modules
23
23
  var ui_src = __webpack_require__(77284);
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);
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,
@@ -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
@@ -9,7 +9,8 @@ __webpack_require__.r(__webpack_exports__);
9
9
 
10
10
  // EXPORTS
11
11
  __webpack_require__.d(__webpack_exports__, {
12
- "default": () => (/* binding */ cornerstone_dicom_rt_src)
12
+ "default": () => (/* binding */ cornerstone_dicom_rt_src),
13
+ hydrateRTDisplaySet: () => (/* reexport */ _hydrateRT/* default */.Z)
13
14
  });
14
15
 
15
16
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/package.json
@@ -415,13 +416,16 @@ function getSopClassHandlerModule(_ref2) {
415
416
  }];
416
417
  }
417
418
  /* harmony default export */ const src_getSopClassHandlerModule = (getSopClassHandlerModule);
419
+ // EXTERNAL MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts
420
+ var _hydrateRT = __webpack_require__(50995);
418
421
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/index.tsx
419
422
  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); }
420
423
 
421
424
 
422
425
 
426
+
423
427
  const Component = /*#__PURE__*/react.lazy(() => {
424
- return __webpack_require__.e(/* import() */ 810).then(__webpack_require__.bind(__webpack_require__, 31810));
428
+ return __webpack_require__.e(/* import() */ 471).then(__webpack_require__.bind(__webpack_require__, 56471));
425
429
  });
426
430
  const OHIFCornerstoneRTViewport = props => {
427
431
  return /*#__PURE__*/react.createElement(react.Suspense, {
@@ -447,12 +451,14 @@ const extension = {
447
451
  getViewportModule(_ref) {
448
452
  let {
449
453
  servicesManager,
450
- extensionManager
454
+ extensionManager,
455
+ commandsManager
451
456
  } = _ref;
452
457
  const ExtendedOHIFCornerstoneRTViewport = props => {
453
458
  return /*#__PURE__*/react.createElement(OHIFCornerstoneRTViewport, _extends({
454
459
  servicesManager: servicesManager,
455
- extensionManager: extensionManager
460
+ extensionManager: extensionManager,
461
+ commandsManager: commandsManager
456
462
  }, props));
457
463
  };
458
464
  return [{
@@ -470,6 +476,69 @@ const extension = {
470
476
  };
471
477
  /* harmony default export */ const cornerstone_dicom_rt_src = (extension);
472
478
 
479
+
480
+ /***/ }),
481
+
482
+ /***/ 50995:
483
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
484
+
485
+ /* harmony export */ __webpack_require__.d(__webpack_exports__, {
486
+ /* harmony export */ Z: () => (__WEBPACK_DEFAULT_EXPORT__)
487
+ /* harmony export */ });
488
+ async function _hydrateRTDisplaySet(_ref) {
489
+ let {
490
+ rtDisplaySet,
491
+ viewportIndex,
492
+ servicesManager
493
+ } = _ref;
494
+ const {
495
+ segmentationService,
496
+ hangingProtocolService,
497
+ viewportGridService
498
+ } = servicesManager.services;
499
+ const displaySetInstanceUID = rtDisplaySet.referencedDisplaySetInstanceUID;
500
+ let segmentationId = null;
501
+
502
+ // We need the hydration to notify panels about the new segmentation added
503
+ const suppressEvents = false;
504
+ segmentationId = await segmentationService.createSegmentationForRTDisplaySet(rtDisplaySet, segmentationId, suppressEvents);
505
+ segmentationService.hydrateSegmentation(rtDisplaySet.displaySetInstanceUID);
506
+ const {
507
+ viewports
508
+ } = viewportGridService.getState();
509
+ const updatedViewports = hangingProtocolService.getViewportsRequireUpdate(viewportIndex, displaySetInstanceUID);
510
+ viewportGridService.setDisplaySetsForViewports(updatedViewports);
511
+
512
+ // Todo: fix this after we have a better way for stack viewport segmentations
513
+
514
+ // check every viewport in the viewports to see if the displaySetInstanceUID
515
+ // is being displayed, if so we need to update the viewport to use volume viewport
516
+ // (if already is not using it) since Cornerstone3D currently only supports
517
+ // volume viewport for segmentation
518
+ viewports.forEach((viewport, index) => {
519
+ if (index === viewportIndex) {
520
+ return;
521
+ }
522
+ const shouldDisplaySeg = segmentationService.shouldRenderSegmentation(viewport.displaySetInstanceUIDs, rtDisplaySet.displaySetInstanceUID);
523
+ if (shouldDisplaySeg) {
524
+ updatedViewports.push({
525
+ viewportIndex: index,
526
+ displaySetInstanceUIDs: viewport.displaySetInstanceUIDs,
527
+ viewportOptions: {
528
+ initialImageOptions: {
529
+ preset: 'middle'
530
+ }
531
+ }
532
+ });
533
+ }
534
+ });
535
+
536
+ // Do the entire update at once
537
+ viewportGridService.setDisplaySetsForViewports(updatedViewports);
538
+ return true;
539
+ }
540
+ /* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (_hydrateRTDisplaySet);
541
+
473
542
  /***/ })
474
543
 
475
544
  }]);
@@ -776,7 +776,9 @@ function _measurementReferencesSOPInstanceUID(measurement, SOPInstanceUID, frame
776
776
  // NOTE: The ReferencedFrameNumber can be multiple values according to the DICOM
777
777
  // Standard. But for now, we will support only one ReferenceFrameNumber.
778
778
  const ReferencedFrameNumber = measurement.coords[0].ReferencedSOPSequence && measurement.coords[0].ReferencedSOPSequence[0]?.ReferencedFrameNumber || 1;
779
- if (frameNumber && Number(frameNumber) !== Number(ReferencedFrameNumber)) return false;
779
+ if (frameNumber && Number(frameNumber) !== Number(ReferencedFrameNumber)) {
780
+ return false;
781
+ }
780
782
  for (let j = 0; j < coords.length; j++) {
781
783
  const coord = coords[j];
782
784
  const {
@@ -985,7 +987,9 @@ function _getReferencedImagesList(ImagingMeasurementReportContentSequence) {
985
987
  const {
986
988
  ReferencedSOPSequence
987
989
  } = item;
988
- if (!ReferencedSOPSequence) return;
990
+ if (!ReferencedSOPSequence) {
991
+ return;
992
+ }
989
993
  for (const ref of _getSequenceAsArray(ReferencedSOPSequence)) {
990
994
  if (ref.ReferencedSOPClassUID) {
991
995
  const {
@@ -1002,7 +1006,9 @@ function _getReferencedImagesList(ImagingMeasurementReportContentSequence) {
1002
1006
  return referencedImages;
1003
1007
  }
1004
1008
  function _getSequenceAsArray(sequence) {
1005
- if (!sequence) return [];
1009
+ if (!sequence) {
1010
+ return [];
1011
+ }
1006
1012
  return Array.isArray(sequence) ? sequence : [sequence];
1007
1013
  }
1008
1014
  /* harmony default export */ const src_getSopClassHandlerModule = (getSopClassHandlerModule);
@@ -1366,7 +1372,9 @@ const findInstance = (measurement, displaySetService) => {
1366
1372
  ReferencedSOPInstanceUID: sopUid
1367
1373
  } = measurement;
1368
1374
  const referencedDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
1369
- if (!referencedDisplaySet.images) return;
1375
+ if (!referencedDisplaySet.images) {
1376
+ return;
1377
+ }
1370
1378
  return referencedDisplaySet.images.find(it => it.SOPInstanceUID === sopUid);
1371
1379
  };
1372
1380
 
@@ -1381,8 +1389,12 @@ const findReferencedInstances = (displaySetService, displaySet) => {
1381
1389
  const {
1382
1390
  imageId
1383
1391
  } = measurement;
1384
- if (!imageId) continue;
1385
- if (instanceById[imageId]) continue;
1392
+ if (!imageId) {
1393
+ continue;
1394
+ }
1395
+ if (instanceById[imageId]) {
1396
+ continue;
1397
+ }
1386
1398
  const instance = findInstance(measurement, displaySetService);
1387
1399
  if (!instance) {
1388
1400
  console.log('Measurement', measurement, 'had no instances found');
@@ -1627,7 +1639,9 @@ const CORNERSTONE_3D_TOOLS_SOURCE_NAME = 'Cornerstone3DTools';
1627
1639
  const CORNERSTONE_3D_TOOLS_SOURCE_VERSION = '0.1';
1628
1640
  const supportedLegacyCornerstoneTags = ['cornerstoneTools@^4.0.0'];
1629
1641
  const convertCode = (codingValues, code) => {
1630
- if (!code || code.CodingSchemeDesignator === 'CORNERSTONEJS') return;
1642
+ if (!code || code.CodingSchemeDesignator === 'CORNERSTONEJS') {
1643
+ return;
1644
+ }
1631
1645
  const ref = `${code.CodingSchemeDesignator}:${code.CodeValue}`;
1632
1646
  const ret = {
1633
1647
  ...codingValues[ref],
@@ -1638,13 +1652,17 @@ const convertCode = (codingValues, code) => {
1638
1652
  return ret;
1639
1653
  };
1640
1654
  const convertSites = (codingValues, sites) => {
1641
- if (!sites || !sites.length) return;
1655
+ if (!sites || !sites.length) {
1656
+ return;
1657
+ }
1642
1658
  const ret = [];
1643
1659
  // Do as a loop to convert away from Proxy instances
1644
1660
  for (let i = 0; i < sites.length; i++) {
1645
1661
  // Deal with irregular conversion from dcmjs
1646
1662
  const site = convertCode(codingValues, sites[i][0] || sites[i]);
1647
- if (site) ret.push(site);
1663
+ if (site) {
1664
+ ret.push(site);
1665
+ }
1648
1666
  }
1649
1667
  return ret.length && ret || undefined;
1650
1668
  };
@@ -151,7 +151,9 @@ function callInputDialog(uiDialogService, data, callback) {
151
151
  } = _ref;
152
152
  switch (action.id) {
153
153
  case 'save':
154
- if (typeof validateFunc === 'function' && !validateFunc(value.label)) return;
154
+ if (typeof validateFunc === 'function' && !validateFunc(value.label)) {
155
+ return;
156
+ }
155
157
  callback(value.label, action.id);
156
158
  break;
157
159
  case 'cancel':
@@ -601,7 +603,9 @@ function getDisplayText(mappedAnnotations, displaySet) {
601
603
  }
602
604
  const instanceText = InstanceNumber ? ` I: ${InstanceNumber}` : '';
603
605
  const frameText = displaySet.isMultiFrame ? ` F: ${frameNumber}` : '';
604
- if (length === null || length === undefined) return displayText;
606
+ if (length === null || length === undefined) {
607
+ return displayText;
608
+ }
605
609
  const roundedLength = src.utils.roundNumber(length, 2);
606
610
  displayText.push(`${roundedLength} mm (S: ${SeriesNumber}${instanceText}${frameText})`);
607
611
  return displayText;
@@ -1496,7 +1500,9 @@ function CobbAngle_getDisplayText(mappedAnnotations, displaySet) {
1496
1500
  }
1497
1501
  const instanceText = InstanceNumber ? ` I: ${InstanceNumber}` : '';
1498
1502
  const frameText = displaySet.isMultiFrame ? ` F: ${frameNumber}` : '';
1499
- if (angle === undefined) return displayText;
1503
+ if (angle === undefined) {
1504
+ return displayText;
1505
+ }
1500
1506
  const roundedAngle = src.utils.roundNumber(angle, 2);
1501
1507
  displayText.push(`${roundedAngle} ${unit} (S: ${SeriesNumber}${instanceText}${frameText})`);
1502
1508
  return displayText;
@@ -1676,7 +1682,9 @@ function Angle_getDisplayText(mappedAnnotations, displaySet) {
1676
1682
  }
1677
1683
  const instanceText = InstanceNumber ? ` I: ${InstanceNumber}` : '';
1678
1684
  const frameText = displaySet.isMultiFrame ? ` F: ${frameNumber}` : '';
1679
- if (angle === undefined) return displayText;
1685
+ if (angle === undefined) {
1686
+ return displayText;
1687
+ }
1680
1688
  const roundedAngle = src.utils.roundNumber(angle, 2);
1681
1689
  displayText.push(`${roundedAngle} ${unit} (S: ${SeriesNumber}${instanceText}${frameText})`);
1682
1690
  return displayText;
@@ -2710,8 +2718,12 @@ function getNthFrames(imageIds) {
2710
2718
  * @returns [] reordered to be breadth first traversal of lists
2711
2719
  */
2712
2720
  function interleave(lists) {
2713
- if (!lists || !lists.length) return [];
2714
- if (lists.length === 1) return lists[0];
2721
+ if (!lists || !lists.length) {
2722
+ return [];
2723
+ }
2724
+ if (lists.length === 1) {
2725
+ return lists[0];
2726
+ }
2715
2727
  console.time('interleave');
2716
2728
  const useLists = [...lists];
2717
2729
  const ret = [];
@@ -3000,9 +3012,15 @@ const DEFAULT_CONTEXT_MENU_CLICKS = {
3000
3012
  function getEventName(evt) {
3001
3013
  const button = evt.detail.event.which;
3002
3014
  const nameArr = [];
3003
- if (evt.detail.event.altKey) nameArr.push('alt');
3004
- if (evt.detail.event.ctrlKey) nameArr.push('ctrl');
3005
- if (evt.detail.event.shiftKey) nameArr.push('shift');
3015
+ if (evt.detail.event.altKey) {
3016
+ nameArr.push('alt');
3017
+ }
3018
+ if (evt.detail.event.ctrlKey) {
3019
+ nameArr.push('ctrl');
3020
+ }
3021
+ if (evt.detail.event.shiftKey) {
3022
+ nameArr.push('shift');
3023
+ }
3006
3024
  nameArr.push('button');
3007
3025
  nameArr.push(button);
3008
3026
  return nameArr.join('');
@@ -3037,7 +3055,9 @@ function initContextMenu(_ref) {
3037
3055
  element
3038
3056
  } = evt.detail;
3039
3057
  const viewportInfo = cornerstoneViewportService.getViewportInfo(viewportId);
3040
- if (!viewportInfo) return;
3058
+ if (!viewportInfo) {
3059
+ return;
3060
+ }
3041
3061
  const viewportIndex = viewportInfo.getViewportIndex();
3042
3062
  // TODO check update upstream
3043
3063
  (0,state/* setEnabledElement */.Yc)(viewportIndex, element);
@@ -3074,9 +3094,15 @@ const DEFAULT_DOUBLE_CLICK = {
3074
3094
  */
3075
3095
  function getDoubleClickEventName(evt) {
3076
3096
  const nameArr = [];
3077
- if (evt.detail.event.altKey) nameArr.push('alt');
3078
- if (evt.detail.event.ctrlKey) nameArr.push('ctrl');
3079
- if (evt.detail.event.shiftKey) nameArr.push('shift');
3097
+ if (evt.detail.event.altKey) {
3098
+ nameArr.push('alt');
3099
+ }
3100
+ if (evt.detail.event.ctrlKey) {
3101
+ nameArr.push('ctrl');
3102
+ }
3103
+ if (evt.detail.event.shiftKey) {
3104
+ nameArr.push('shift');
3105
+ }
3080
3106
  nameArr.push('doubleClick');
3081
3107
  return nameArr.join('');
3082
3108
  }
@@ -3517,7 +3543,9 @@ class DicomFileUploader extends src/* PubSubService */.hC {
3517
3543
  request.addEventListener('loadend', cleanUpCallback);
3518
3544
  }
3519
3545
  _checkDicomFile(arrayBuffer) {
3520
- if (arrayBuffer.length <= 132) return false;
3546
+ if (arrayBuffer.length <= 132) {
3547
+ return false;
3548
+ }
3521
3549
  const arr = new Uint8Array(arrayBuffer.slice(128, 132));
3522
3550
  // bytes from 128 to 132 must be "DICM"
3523
3551
  return Array.from('DICM').every((char, i) => char.charCodeAt(0) === arr[i]);
@@ -4432,6 +4460,7 @@ function commandsModule(_ref) {
4432
4460
  toolGroupService,
4433
4461
  cineService,
4434
4462
  toolbarService,
4463
+ stateSyncService,
4435
4464
  uiDialogService,
4436
4465
  cornerstoneViewportService,
4437
4466
  uiNotificationService,
@@ -5033,6 +5062,40 @@ function commandsModule(_ref) {
5033
5062
  );
5034
5063
 
5035
5064
  toolGroup.setToolEnabled(dist_esm.ReferenceLinesTool.toolName);
5065
+ },
5066
+ storePresentation: _ref18 => {
5067
+ let {
5068
+ viewportIndex
5069
+ } = _ref18;
5070
+ const presentation = cornerstoneViewportService.getPresentation(viewportIndex);
5071
+ if (!presentation || !presentation.presentationIds) {
5072
+ return;
5073
+ }
5074
+ const {
5075
+ lutPresentationStore,
5076
+ positionPresentationStore
5077
+ } = stateSyncService.getState();
5078
+ const {
5079
+ presentationIds
5080
+ } = presentation;
5081
+ const {
5082
+ lutPresentationId,
5083
+ positionPresentationId
5084
+ } = presentationIds || {};
5085
+ const storeState = {};
5086
+ if (lutPresentationId) {
5087
+ storeState.lutPresentationStore = {
5088
+ ...lutPresentationStore,
5089
+ [lutPresentationId]: presentation
5090
+ };
5091
+ }
5092
+ if (positionPresentationId) {
5093
+ storeState.positionPresentationStore = {
5094
+ ...positionPresentationStore,
5095
+ [positionPresentationId]: presentation
5096
+ };
5097
+ }
5098
+ stateSyncService.store(storeState);
5036
5099
  }
5037
5100
  };
5038
5101
  const definitions = {
@@ -5169,6 +5232,11 @@ function commandsModule(_ref) {
5169
5232
  },
5170
5233
  toggleReferenceLines: {
5171
5234
  commandFn: actions.toggleReferenceLines
5235
+ },
5236
+ storePresentation: {
5237
+ commandFn: actions.storePresentation,
5238
+ storeContexts: [],
5239
+ options: {}
5172
5240
  }
5173
5241
  };
5174
5242
  return {
@@ -7650,7 +7718,9 @@ const DEFAULT_TOOLGROUP_ID = 'default';
7650
7718
  // Return true if the data contains the given display set UID OR the imageId
7651
7719
  // if it is a composite object.
7652
7720
  const dataContains = (data, displaySetUID, imageId) => {
7653
- if (data.displaySetInstanceUID === displaySetUID) return true;
7721
+ if (data.displaySetInstanceUID === displaySetUID) {
7722
+ return true;
7723
+ }
7654
7724
  if (imageId && data.isCompositeStack && data.imageIds) {
7655
7725
  return !!data.imageIds.find(dataId => dataId === imageId);
7656
7726
  }
@@ -7682,7 +7752,9 @@ class ViewportInfo {
7682
7752
  * OR if it is a composite stack and contains the given imageId
7683
7753
  */
7684
7754
  contains(displaySetUID, imageId) {
7685
- if (!this.viewportData?.data) return false;
7755
+ if (!this.viewportData?.data) {
7756
+ return false;
7757
+ }
7686
7758
  if (this.viewportData.data.length) {
7687
7759
  return !!this.viewportData.data.find(data => dataContains(data, displaySetUID, imageId));
7688
7760
  }
@@ -7977,19 +8049,27 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
7977
8049
  }
7978
8050
  setPresentations(viewport, presentations) {
7979
8051
  const properties = presentations?.lutPresentation?.properties;
7980
- if (properties) viewport.setProperties(properties);
8052
+ if (properties) {
8053
+ viewport.setProperties(properties);
8054
+ }
7981
8055
  const camera = presentations?.positionPresentation?.camera;
7982
- if (camera) viewport.setCamera(camera);
8056
+ if (camera) {
8057
+ viewport.setCamera(camera);
8058
+ }
7983
8059
  }
7984
8060
  getPresentation(viewportIndex) {
7985
8061
  const viewportInfo = this.viewportsInfo.get(viewportIndex);
7986
- if (!viewportInfo) return;
8062
+ if (!viewportInfo) {
8063
+ return;
8064
+ }
7987
8065
  const {
7988
8066
  viewportType,
7989
8067
  presentationIds
7990
8068
  } = viewportInfo.getViewportOptions();
7991
8069
  const csViewport = this.getCornerstoneViewportByIndex(viewportIndex);
7992
- if (!csViewport) return;
8070
+ if (!csViewport) {
8071
+ return;
8072
+ }
7993
8073
  const properties = csViewport.getProperties();
7994
8074
  if (properties.isComputedVOI) {
7995
8075
  delete properties.voiRange;
@@ -8141,7 +8221,9 @@ class CornerstoneViewportService extends src/* PubSubService */.hC {
8141
8221
  viewport.setStack(imageIds, initialImageIndexToUse).then(() => {
8142
8222
  viewport.setProperties(properties);
8143
8223
  const camera = presentations.positionPresentation?.camera;
8144
- if (camera) viewport.setCamera(camera);
8224
+ if (camera) {
8225
+ viewport.setCamera(camera);
8226
+ }
8145
8227
  });
8146
8228
  }
8147
8229
  _getInitialImageIndexForViewport(viewportInfo, imageIds) {