@ohif/app 3.0.0 → 3.5.0

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 (125) hide show
  1. package/dist/151.bundle.07bac9172580a60fae7a.js +2579 -0
  2. package/dist/192.bundle.62be5f0ef9705a485071.js +894 -0
  3. package/dist/199.bundle.2286f24cf0a068e7f50c.js +480 -0
  4. package/dist/205.bundle.39e6c847d618ad2b1b7a.js +62 -0
  5. package/dist/208.bundle.23748a85dfdc79c05d3a.js +864 -0
  6. package/dist/270.bundle.abbdb5348274bae3e8bc.js +23906 -0
  7. package/dist/283.bundle.33f99a75a5e2d9333da2.js +2939 -0
  8. package/dist/295.bundle.5105ce962be15c92484d.js +48 -0
  9. package/dist/331.bundle.7ac7b142d249d14fd99e.js +73034 -0
  10. package/dist/351.bundle.c5d7279ef42e30f61e08.js +1471 -0
  11. package/dist/351.css +3 -0
  12. package/dist/36785fbd89b0e17f6099.wasm +0 -0
  13. package/dist/381.bundle.0905e683605fcbc0895f.js +1009 -0
  14. package/dist/404.bundle.0f7a500421f246153d89.js +706 -0
  15. package/dist/50.bundle.4cb103cd20f5ffccf927.js +324 -0
  16. package/dist/5004fdc02f329ce53b69.wasm +0 -0
  17. package/dist/531.bundle.1bc152c87c7e2e987d2b.js +5935 -0
  18. package/dist/55.bundle.a5a215e13a8511f7aee7.js +685 -0
  19. package/dist/55.css +3 -0
  20. package/dist/569.bundle.d147c0aa0604f8ea2094.js +514 -0
  21. package/dist/581.bundle.646c89c5c3e3ee096363.js +508 -0
  22. package/dist/606.bundle.5d876f5f3dd8287f0a28.js +4939 -0
  23. package/dist/610.min.worker.js +2 -0
  24. package/dist/610.min.worker.js.map +1 -0
  25. package/dist/616.bundle.bec4736d8c9513e62856.js +686 -0
  26. package/dist/62ab5d58a2bea7b5a1dc.wasm +0 -0
  27. package/dist/642.bundle.030d908e22c8ff5611f3.js +169 -0
  28. package/dist/65916ef3def695744bda.wasm +0 -0
  29. package/dist/664.bundle.4792c88ae0d6d4b5ed13.js +901 -0
  30. package/dist/707.bundle.0a74aa3e61ed002eb3c6.js +9049 -0
  31. package/dist/707.css +1 -0
  32. package/dist/728.bundle.d13856835357400fef82.js +26221 -0
  33. package/dist/744.bundle.53b07e48e07a11e920ac.js +2355 -0
  34. package/dist/75788f12450d4c5ed494.wasm +0 -0
  35. package/dist/75a0c2dfe07b824c7d21.wasm +0 -0
  36. package/dist/780.bundle.f60ac1906e0ae080dee8.js +4769 -0
  37. package/dist/790.bundle.b4df2c5d78a2a565b150.js +454 -0
  38. package/dist/799.bundle.3fff638815e355b0bdfd.js +271 -0
  39. package/dist/806.css +1 -0
  40. package/dist/82.bundle.a24015533196e05d190e.js +6104 -0
  41. package/dist/917.bundle.a094ae9e9de6df4119ae.js +196 -0
  42. package/dist/926.bundle.dbc9d0e591cb9217fda2.js +72552 -0
  43. package/dist/935.bundle.deeffff0e4f7b528e3c3.js +1849 -0
  44. package/dist/945.min.worker.js +2 -0
  45. package/dist/945.min.worker.js.map +1 -0
  46. package/dist/953.bundle.c14d9eb6400f697019ee.js +449 -0
  47. package/dist/973.bundle.4100cf103686b64938d1.js +261 -0
  48. package/dist/976.bundle.2720eb892514e1818018.js +2725 -0
  49. package/dist/984.bundle.157fc66ea5040e1364af.js +1842 -0
  50. package/dist/_headers +6 -0
  51. package/dist/_redirects +6 -0
  52. package/dist/app-config.js +215 -0
  53. package/dist/app.bundle.253eeb2a7ee986e89c50.js +154621 -0
  54. package/dist/app.bundle.css +21 -0
  55. package/dist/assets/android-chrome-144x144.png +0 -0
  56. package/dist/assets/android-chrome-192x192.png +0 -0
  57. package/dist/assets/android-chrome-256x256.png +0 -0
  58. package/dist/assets/android-chrome-36x36.png +0 -0
  59. package/dist/assets/android-chrome-384x384.png +0 -0
  60. package/dist/assets/android-chrome-48x48.png +0 -0
  61. package/dist/assets/android-chrome-512x512.png +0 -0
  62. package/dist/assets/android-chrome-72x72.png +0 -0
  63. package/dist/assets/android-chrome-96x96.png +0 -0
  64. package/dist/assets/apple-touch-icon-1024x1024.png +0 -0
  65. package/dist/assets/apple-touch-icon-114x114.png +0 -0
  66. package/dist/assets/apple-touch-icon-120x120.png +0 -0
  67. package/dist/assets/apple-touch-icon-144x144.png +0 -0
  68. package/dist/assets/apple-touch-icon-152x152.png +0 -0
  69. package/dist/assets/apple-touch-icon-167x167.png +0 -0
  70. package/dist/assets/apple-touch-icon-180x180.png +0 -0
  71. package/dist/assets/apple-touch-icon-57x57.png +0 -0
  72. package/dist/assets/apple-touch-icon-60x60.png +0 -0
  73. package/dist/assets/apple-touch-icon-72x72.png +0 -0
  74. package/dist/assets/apple-touch-icon-76x76.png +0 -0
  75. package/dist/assets/apple-touch-icon-precomposed.png +0 -0
  76. package/dist/assets/apple-touch-icon.png +0 -0
  77. package/dist/assets/apple-touch-startup-image-1182x2208.png +0 -0
  78. package/dist/assets/apple-touch-startup-image-1242x2148.png +0 -0
  79. package/dist/assets/apple-touch-startup-image-1496x2048.png +0 -0
  80. package/dist/assets/apple-touch-startup-image-1536x2008.png +0 -0
  81. package/dist/assets/apple-touch-startup-image-320x460.png +0 -0
  82. package/dist/assets/apple-touch-startup-image-640x1096.png +0 -0
  83. package/dist/assets/apple-touch-startup-image-640x920.png +0 -0
  84. package/dist/assets/apple-touch-startup-image-748x1024.png +0 -0
  85. package/dist/assets/apple-touch-startup-image-750x1294.png +0 -0
  86. package/dist/assets/apple-touch-startup-image-768x1004.png +0 -0
  87. package/dist/assets/browserconfig.xml +12 -0
  88. package/dist/assets/coast-228x228.png +0 -0
  89. package/dist/assets/favicon-16x16.png +0 -0
  90. package/dist/assets/favicon-32x32.png +0 -0
  91. package/dist/assets/favicon.ico +0 -0
  92. package/dist/assets/firefox_app_128x128.png +0 -0
  93. package/dist/assets/firefox_app_512x512.png +0 -0
  94. package/dist/assets/firefox_app_60x60.png +0 -0
  95. package/dist/assets/manifest.webapp +14 -0
  96. package/dist/assets/mstile-144x144.png +0 -0
  97. package/dist/assets/mstile-150x150.png +0 -0
  98. package/dist/assets/mstile-310x150.png +0 -0
  99. package/dist/assets/mstile-310x310.png +0 -0
  100. package/dist/assets/mstile-70x70.png +0 -0
  101. package/dist/assets/yandex-browser-50x50.png +0 -0
  102. package/dist/assets/yandex-browser-manifest.json +9 -0
  103. package/dist/b6b803111e2d06a825bd.wasm +0 -0
  104. package/dist/c22b37c3488e1d6c3aa4.wasm +0 -0
  105. package/dist/cornerstoneDICOMImageLoader.min.js +2 -0
  106. package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -0
  107. package/dist/dicom-microscopy-viewer.bundle.aa60bdf008c32c39cfd7.js +12 -0
  108. package/dist/dicomMicroscopyViewer.min.js +3 -0
  109. package/dist/dicomMicroscopyViewer.min.js.LICENSE.txt +29 -0
  110. package/dist/es6-shim.min.js +12 -0
  111. package/dist/google.js +75 -0
  112. package/dist/index.html +1 -0
  113. package/dist/index.worker.ea71efba2ce63c499055.worker.js +2 -0
  114. package/dist/index.worker.ea71efba2ce63c499055.worker.js.map +1 -0
  115. package/dist/index.worker.min.worker.js +2 -0
  116. package/dist/index.worker.min.worker.js.map +1 -0
  117. package/dist/init-service-worker.js +59 -0
  118. package/dist/manifest.json +59 -0
  119. package/dist/ohif-logo-light.svg +15 -0
  120. package/dist/ohif-logo.svg +15 -0
  121. package/dist/oidc-client.min.js +46 -0
  122. package/dist/polyfill.min.js +1 -0
  123. package/dist/silent-refresh.html +16 -0
  124. package/dist/sw.js +56 -0
  125. package/package.json +24 -23
package/dist/55.css ADDED
@@ -0,0 +1,3 @@
1
+ .DicomMicroscopyViewer{--ol-partial-background-color:#7f7f7fb3;--ol-foreground-color:#000;--ol-subtle-foreground-color:#000;--ol-subtle-background-color:#4e4e4e80}.DicomMicroscopyViewer .ol-box{background-color:var(--ol-partial-background-color);border:1.5px solid var(--ol-background-color);border-radius:2px;-webkit-box-sizing:border-box;box-sizing:border-box}.DicomMicroscopyViewer .ol-mouse-position{position:absolute;right:8px;top:8px}.DicomMicroscopyViewer .ol-scale-line{background:var(--ol-partial-background-color);border-radius:4px;bottom:8px;left:8px;padding:2px;position:absolute}.DicomMicroscopyViewer .ol-scale-line-inner{border:1px solid var(--ol-subtle-foreground-color);border-top:none;color:var(--ol-foreground-color);font-size:10px;margin:1px;text-align:center;-webkit-transition:all .25s;transition:all .25s;will-change:contents,width}.DicomMicroscopyViewer .ol-scale-bar{bottom:8px;left:8px;position:absolute}.DicomMicroscopyViewer .ol-scale-bar-inner{display:-webkit-box;display:-ms-flexbox;display:flex}.DicomMicroscopyViewer .ol-scale-step-marker{background-color:var(--ol-foreground-color);float:right;height:15px;width:1px;z-index:10}.DicomMicroscopyViewer .ol-scale-step-text{bottom:-5px;font-size:10px;z-index:11}.DicomMicroscopyViewer .ol-scale-step-text,.DicomMicroscopyViewer .ol-scale-text{color:var(--ol-foreground-color);position:absolute;text-shadow:-1.5px 0 var(--ol-partial-background-color),0 1.5px var(--ol-partial-background-color),1.5px 0 var(--ol-partial-background-color),0 -1.5px var(--ol-partial-background-color)}.DicomMicroscopyViewer .ol-scale-text{bottom:25px;font-size:12px;text-align:center}.DicomMicroscopyViewer .ol-scale-singlebar{border:1px solid var(--ol-foreground-color);-webkit-box-sizing:border-box;box-sizing:border-box;height:10px;position:relative;z-index:9}.DicomMicroscopyViewer .ol-scale-singlebar-even{background-color:var(--ol-subtle-foreground-color)}.DicomMicroscopyViewer .ol-scale-singlebar-odd{background-color:var(--ol-background-color)}.DicomMicroscopyViewer .ol-unsupported{display:none}.DicomMicroscopyViewer .ol-unselectable,.DicomMicroscopyViewer .ol-viewport{-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-user-select:none;-moz-user-select:none; -ms-user-select:none; user-select:none}.DicomMicroscopyViewer .ol-viewport canvas{all:unset}.DicomMicroscopyViewer .ol-selectable{-webkit-touch-callout:default;-webkit-user-select:text;-moz-user-select:text; -ms-user-select:text; user-select:text}.DicomMicroscopyViewer .ol-grabbing{cursor:-webkit-grabbing;cursor:grabbing}.DicomMicroscopyViewer .ol-grab{cursor:move;cursor:-webkit-grab;cursor:grab}.DicomMicroscopyViewer .ol-control{background-color:var(--ol-subtle-background-color);border-radius:4px;position:absolute}.DicomMicroscopyViewer .ol-zoom{left:.5em;top:.5em}.DicomMicroscopyViewer .ol-rotate{right:.5em;top:.5em;-webkit-transition:opacity .25s linear,visibility 0s linear;transition:opacity .25s linear,visibility 0s linear}.DicomMicroscopyViewer .ol-rotate.ol-hidden{opacity:0;-webkit-transition:opacity .25s linear,visibility 0s linear .25s;transition:opacity .25s linear,visibility 0s linear .25s;visibility:hidden}.DicomMicroscopyViewer .ol-zoom-extent{left:.5em;top:4.643em}.DicomMicroscopyViewer .ol-full-screen{right:.5em;top:.5em}.DicomMicroscopyViewer .ol-control button{background-color:var(--ol-background-color);border:none;border-radius:2px;color:var(--ol-subtle-foreground-color);display:block;font-size:inherit;font-weight:700;height:1.375em;line-height:.4em;margin:1px;padding:0;text-align:center;text-decoration:none;width:1.375em}.DicomMicroscopyViewer .ol-control button::-moz-focus-inner{border:none;padding:0}.DicomMicroscopyViewer .ol-zoom-extent button{line-height:1.4em}.DicomMicroscopyViewer .ol-compass{display:block;font-weight:400;will-change:transform}.DicomMicroscopyViewer .ol-touch .ol-control button{font-size:1.5em}.DicomMicroscopyViewer .ol-touch .ol-zoom-extent{top:5.5em}.DicomMicroscopyViewer .ol-control button:focus,.DicomMicroscopyViewer .ol-control button:hover{color:var(--ol-foreground-color);outline:1px solid var(--ol-subtle-foreground-color);text-decoration:none}.DicomMicroscopyViewer .ol-zoom .ol-zoom-in{border-radius:2px 2px 0 0}.DicomMicroscopyViewer .ol-zoom .ol-zoom-out{border-radius:0 0 2px 2px}.DicomMicroscopyViewer .ol-attribution{-webkit-box-align:center;-ms-flex-align:center;align-items:center;bottom:.5em;display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-flow:row-reverse;flex-flow:row-reverse;max-width:calc(100% - 1.3em);right:.5em;text-align:right}.DicomMicroscopyViewer .ol-attribution a{color:var(--ol-subtle-foreground-color);text-decoration:none}.DicomMicroscopyViewer .ol-attribution ul{color:var(--ol-foreground-color);font-size:12px;margin:0;padding:1px .5em;text-shadow:0 0 2px var(--ol-background-color)}.DicomMicroscopyViewer .ol-attribution li{display:inline;list-style:none}.DicomMicroscopyViewer .ol-attribution li:not(:last-child):after{content:" "}.DicomMicroscopyViewer .ol-attribution img{max-height:2em;max-width:inherit;vertical-align:middle}.DicomMicroscopyViewer .ol-attribution button{-ms-flex-negative:0;flex-shrink:0}.DicomMicroscopyViewer .ol-attribution.ol-collapsed ul{display:none}.DicomMicroscopyViewer .ol-attribution:not(.ol-collapsed){background:var(--ol-partial-background-color)}.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible{border-radius:4px 0 0;bottom:0;right:0}.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible img{margin-top:-.2em;max-height:1.6em}.DicomMicroscopyViewer .ol-attribution.ol-uncollapsible button{display:none}.DicomMicroscopyViewer .ol-zoomslider{height:200px;left:.5em;top:4.5em}.DicomMicroscopyViewer .ol-zoomslider button{height:10px;position:relative}.DicomMicroscopyViewer .ol-touch .ol-zoomslider{top:5.5em}.DicomMicroscopyViewer .ol-overviewmap{bottom:.5em;left:.5em}.DicomMicroscopyViewer .ol-overviewmap.ol-uncollapsible{border-radius:0 4px 0 0;bottom:0;left:0}.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-map,.DicomMicroscopyViewer .ol-overviewmap button{display:block}.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-map{border:1px solid var(--ol-subtle-foreground-color);height:150px;width:150px}.DicomMicroscopyViewer .ol-overviewmap:not(.ol-collapsed) button{bottom:0;left:0;position:absolute}.DicomMicroscopyViewer .ol-overviewmap.ol-collapsed .ol-overviewmap-map,.DicomMicroscopyViewer .ol-overviewmap.ol-uncollapsible button{display:none}.DicomMicroscopyViewer .ol-overviewmap:not(.ol-collapsed){background:var(--ol-subtle-background-color)}.DicomMicroscopyViewer .ol-overviewmap-box{border:.5px dotted var(--ol-subtle-foreground-color)}.DicomMicroscopyViewer .ol-overviewmap .ol-overviewmap-box:hover{cursor:move}@layout-header-background: #007ea3;@primary-color: #007ea3;@processing-color: #8cb8c6;@success-color: #3f9c35;@warning-color: #eeaf30;@error-color: #96172e;@font-size-base: 14px;.DicomMicroscopyViewer .ol-tooltip{font-size:16px!important}
2
+ .DicomMicroscopyViewer .OpenLayersOverlay{display:block!important;height:100%;pointer-events:none!important;width:100%}.DicomMicroscopyViewer .text-primary-light{color:#ff0;font-size:14px;font-weight:400}.DicomMicroscopyViewer .text-primary-light span{max-width:300px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.DicomMicroscopyViewer .absolute{position:absolute}.DicomMicroscopyViewer .flex{display:-webkit-box;display:-ms-flexbox;display:flex}.DicomMicroscopyViewer .flex-row{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-ms-flex-direction:row;flex-direction:row}.DicomMicroscopyViewer .flex-col{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}.DicomMicroscopyViewer .pointer-events-none{pointer-events:none}.DicomMicroscopyViewer .left-viewport-scrollbar{left:.5rem}.DicomMicroscopyViewer .right-viewport-scrollbar{right:1.3rem}.DicomMicroscopyViewer .top-viewport{top:.5rem}.DicomMicroscopyViewer .bottom-viewport{bottom:.5rem}.DicomMicroscopyViewer .bottom-viewport.left-viewport{bottom:.5rem;left:calc(.5rem + 250px)}.DicomMicroscopyViewer .right-viewport-scrollbar .flex{-webkit-box-pack:end;-ms-flex-pack:end;justify-content:end}.DicomMicroscopyViewer .microscopy-viewport-overlay{background:#00000080;max-width:40%;padding:.5rem 1rem}.DicomMicroscopyViewer .microscopy-viewport-overlay .flex{max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.DicomMicroscopyViewer .top-viewport .flex span:not(.font-light){-ms-flex-negative:0;flex-shrink:0}
3
+ .dicom-tag-browser-table{margin-left:auto;margin-right:auto}.dicom-tag-browser-table-wrapper{overflow-x:scroll}.dicom-tag-browser-table tr{border-top:1px solid #ddd;color:#fff;padding-left:10px;padding-right:10px;white-space:nowrap}.stick{overflow:clip;position:sticky}.dicom-tag-browser-content{overflow:hidden;padding-bottom:50px;width:100%}.dicom-tag-browser-instance-range .range{height:20px}.dicom-tag-browser-instance-range{padding:20px 0}.dicom-tag-browser-table td.dicom-tag-browser-table-center{text-align:center}.dicom-tag-browser-table th{color:"#20A5D6";padding-left:10px;padding-right:10px;text-align:center}.dicom-tag-browser-table th.dicom-tag-browser-table-left{text-align:left}
@@ -0,0 +1,514 @@
1
+ "use strict";
2
+ (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[569],{
3
+
4
+ /***/ 33569:
5
+ /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
+
7
+ // ESM COMPAT FLAG
8
+ __webpack_require__.r(__webpack_exports__);
9
+
10
+ // EXPORTS
11
+ __webpack_require__.d(__webpack_exports__, {
12
+ "default": () => (/* binding */ viewports_OHIFCornerstoneSEGViewport)
13
+ });
14
+
15
+ // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
16
+ var prop_types = __webpack_require__(60216);
17
+ var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
18
+ // EXTERNAL MODULE: ../../../node_modules/react/index.js
19
+ var react = __webpack_require__(32735);
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 + 449 modules
25
+ var ui_src = __webpack_require__(43803);
26
+ ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts
27
+ function createSEGToolGroupAndAddTools(ToolGroupService, customizationService, toolGroupId) {
28
+ const {
29
+ tools
30
+ } = customizationService.get('cornerstone.overlayViewportTools') ?? {};
31
+ return ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, {});
32
+ }
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);
87
+ ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/promptHydrateSEG.ts
88
+
89
+ const RESPONSE = {
90
+ NO_NEVER: -1,
91
+ CANCEL: 0,
92
+ HYDRATE_SEG: 5
93
+ };
94
+ function promptHydrateSEG(_ref) {
95
+ let {
96
+ servicesManager,
97
+ segDisplaySet,
98
+ viewportIndex
99
+ } = _ref;
100
+ const {
101
+ uiViewportDialogService
102
+ } = servicesManager.services;
103
+ return new Promise(async function (resolve, reject) {
104
+ const promptResult = await _askHydrate(uiViewportDialogService, viewportIndex);
105
+ if (promptResult === RESPONSE.HYDRATE_SEG) {
106
+ const isHydrated = await _hydrateSEG({
107
+ segDisplaySet,
108
+ viewportIndex,
109
+ servicesManager
110
+ });
111
+ resolve(isHydrated);
112
+ }
113
+ });
114
+ }
115
+ function _askHydrate(uiViewportDialogService, viewportIndex) {
116
+ return new Promise(function (resolve, reject) {
117
+ const message = 'Do you want to open this Segmentation?';
118
+ const actions = [{
119
+ type: 'secondary',
120
+ text: 'No',
121
+ value: RESPONSE.CANCEL
122
+ }, {
123
+ type: 'primary',
124
+ text: 'Yes',
125
+ value: RESPONSE.HYDRATE_SEG
126
+ }];
127
+ const onSubmit = result => {
128
+ uiViewportDialogService.hide();
129
+ resolve(result);
130
+ };
131
+ uiViewportDialogService.show({
132
+ viewportIndex,
133
+ type: 'info',
134
+ message,
135
+ actions,
136
+ onSubmit,
137
+ onOutsideClick: () => {
138
+ uiViewportDialogService.hide();
139
+ resolve(RESPONSE.CANCEL);
140
+ }
141
+ });
142
+ });
143
+ }
144
+ /* harmony default export */ const utils_promptHydrateSEG = (promptHydrateSEG);
145
+ ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/viewports/_getStatusComponent.tsx
146
+
147
+
148
+
149
+ function _getStatusComponent(_ref) {
150
+ let {
151
+ isHydrated,
152
+ onStatusClick
153
+ } = _ref;
154
+ let ToolTipMessage = null;
155
+ let StatusIcon = null;
156
+ const {
157
+ t
158
+ } = (0,es/* useTranslation */.$G)("Common");
159
+ const loadStr = t("LOAD");
160
+ switch (isHydrated) {
161
+ case true:
162
+ StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
163
+ name: "status-alert"
164
+ });
165
+ ToolTipMessage = () => /*#__PURE__*/react.createElement("div", null, "This Segmentation is loaded in the segmentation panel");
166
+ break;
167
+ case false:
168
+ StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
169
+ name: "status-untracked"
170
+ });
171
+ ToolTipMessage = () => /*#__PURE__*/react.createElement("div", null, "Click LOAD to load segmentation.");
172
+ }
173
+ const StatusArea = () => /*#__PURE__*/react.createElement("div", {
174
+ className: "flex h-6 leading-6 cursor-default text-sm text-white"
175
+ }, /*#__PURE__*/react.createElement("div", {
176
+ className: "min-w-[45px] flex items-center p-1 rounded-l-xl rounded-r bg-customgray-100"
177
+ }, /*#__PURE__*/react.createElement(StatusIcon, null), /*#__PURE__*/react.createElement("span", {
178
+ className: "ml-1"
179
+ }, "SEG")), !isHydrated && /*#__PURE__*/react.createElement("div", {
180
+ className: "ml-1 px-1.5 rounded cursor-pointer hover:text-black bg-primary-main hover:bg-primary-light"
181
+ // Using onMouseUp here because onClick is not working when the viewport is not active and is styled with pointer-events:none
182
+ ,
183
+ onMouseUp: onStatusClick
184
+ }, loadStr));
185
+ return /*#__PURE__*/react.createElement(react.Fragment, null, ToolTipMessage && /*#__PURE__*/react.createElement(ui_src/* Tooltip */.u, {
186
+ content: /*#__PURE__*/react.createElement(ToolTipMessage, null),
187
+ position: "bottom-left"
188
+ }, /*#__PURE__*/react.createElement(StatusArea, null)), !ToolTipMessage && /*#__PURE__*/react.createElement(StatusArea, null));
189
+ }
190
+ ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/viewports/OHIFCornerstoneSEGViewport.tsx
191
+ 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); }
192
+
193
+
194
+
195
+
196
+
197
+
198
+
199
+
200
+
201
+ const {
202
+ formatDate
203
+ } = src.utils;
204
+ const SEG_TOOLGROUP_BASE_NAME = 'SEGToolGroup';
205
+ function OHIFCornerstoneSEGViewport(props) {
206
+ const {
207
+ children,
208
+ displaySets,
209
+ viewportOptions,
210
+ viewportIndex,
211
+ viewportLabel,
212
+ servicesManager,
213
+ extensionManager
214
+ } = props;
215
+ const {
216
+ t
217
+ } = (0,es/* useTranslation */.$G)('SEGViewport');
218
+ const {
219
+ displaySetService,
220
+ toolGroupService,
221
+ segmentationService,
222
+ uiNotificationService,
223
+ customizationService
224
+ } = servicesManager.services;
225
+ const toolGroupId = `${SEG_TOOLGROUP_BASE_NAME}-${viewportIndex}`;
226
+
227
+ // SEG viewport will always have a single display set
228
+ if (displaySets.length > 1) {
229
+ throw new Error('SEG viewport should only have a single display set');
230
+ }
231
+ const segDisplaySet = displaySets[0];
232
+ const [viewportGrid, viewportGridService] = (0,ui_src/* useViewportGrid */.O_)();
233
+
234
+ // States
235
+ const [isToolGroupCreated, setToolGroupCreated] = (0,react.useState)(false);
236
+ const [selectedSegment, setSelectedSegment] = (0,react.useState)(1);
237
+
238
+ // Hydration means that the SEG is opened and segments are loaded into the
239
+ // segmentation panel, and SEG is also rendered on any viewport that is in the
240
+ // same frameOfReferenceUID as the referencedSeriesUID of the SEG. However,
241
+ // loading basically means SEG loading over network and bit unpacking of the
242
+ // SEG data.
243
+ const [isHydrated, setIsHydrated] = (0,react.useState)(segDisplaySet.isHydrated);
244
+ const [segIsLoading, setSegIsLoading] = (0,react.useState)(!segDisplaySet.isLoaded);
245
+ const [element, setElement] = (0,react.useState)(null);
246
+ const [processingProgress, setProcessingProgress] = (0,react.useState)({
247
+ percentComplete: null,
248
+ totalSegments: null
249
+ });
250
+
251
+ // refs
252
+ const referencedDisplaySetRef = (0,react.useRef)(null);
253
+ const {
254
+ viewports,
255
+ activeViewportIndex
256
+ } = viewportGrid;
257
+ const referencedDisplaySet = segDisplaySet.getReferenceDisplaySet();
258
+ const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(referencedDisplaySet);
259
+ referencedDisplaySetRef.current = {
260
+ displaySet: referencedDisplaySet,
261
+ metadata: referencedDisplaySetMetadata
262
+ };
263
+ /**
264
+ * OnElementEnabled callback which is called after the cornerstoneExtension
265
+ * has enabled the element. Note: we delegate all the image rendering to
266
+ * cornerstoneExtension, so we don't need to do anything here regarding
267
+ * the image rendering, element enabling etc.
268
+ */
269
+ const onElementEnabled = evt => {
270
+ setElement(evt.detail.element);
271
+ };
272
+ const onElementDisabled = () => {
273
+ setElement(null);
274
+ };
275
+ const getCornerstoneViewport = (0,react.useCallback)(() => {
276
+ const {
277
+ component: Component
278
+ } = extensionManager.getModuleEntry('@ohif/extension-cornerstone.viewportModule.cornerstone');
279
+ const {
280
+ displaySet: referencedDisplaySet
281
+ } = referencedDisplaySetRef.current;
282
+
283
+ // Todo: jump to the center of the first segment
284
+ return /*#__PURE__*/react.createElement(Component, _extends({}, props, {
285
+ displaySets: [referencedDisplaySet, segDisplaySet],
286
+ viewportOptions: {
287
+ viewportType: 'volume',
288
+ toolGroupId: toolGroupId,
289
+ orientation: viewportOptions.orientation,
290
+ viewportId: viewportOptions.viewportId
291
+ },
292
+ onElementEnabled: onElementEnabled,
293
+ onElementDisabled: onElementDisabled
294
+ // initialImageIndex={initialImageIndex}
295
+ }));
296
+ }, [viewportIndex, segDisplaySet, toolGroupId]);
297
+ const onSegmentChange = (0,react.useCallback)(direction => {
298
+ direction = direction === 'left' ? -1 : 1;
299
+ const segmentationId = segDisplaySet.displaySetInstanceUID;
300
+ const segmentation = segmentationService.getSegmentation(segmentationId);
301
+ const {
302
+ segments
303
+ } = segmentation;
304
+ const numberOfSegments = Object.keys(segments).length;
305
+ let newSelectedSegmentIndex = selectedSegment + direction;
306
+
307
+ // Segment 0 is always background
308
+
309
+ if (newSelectedSegmentIndex > numberOfSegments - 1) {
310
+ newSelectedSegmentIndex = 1;
311
+ } else if (newSelectedSegmentIndex === 0) {
312
+ newSelectedSegmentIndex = numberOfSegments - 1;
313
+ }
314
+ segmentationService.jumpToSegmentCenter(segmentationId, newSelectedSegmentIndex, toolGroupId);
315
+ setSelectedSegment(newSelectedSegmentIndex);
316
+ }, [selectedSegment]);
317
+ (0,react.useEffect)(() => {
318
+ if (segIsLoading) {
319
+ return;
320
+ }
321
+ utils_promptHydrateSEG({
322
+ servicesManager,
323
+ viewportIndex,
324
+ segDisplaySet
325
+ }).then(isHydrated => {
326
+ if (isHydrated) {
327
+ setIsHydrated(true);
328
+ }
329
+ });
330
+ }, [servicesManager, viewportIndex, segDisplaySet, segIsLoading]);
331
+ (0,react.useEffect)(() => {
332
+ const {
333
+ unsubscribe
334
+ } = segmentationService.subscribe(segmentationService.EVENTS.SEGMENTATION_LOADING_COMPLETE, evt => {
335
+ if (evt.segDisplaySet.displaySetInstanceUID === segDisplaySet.displaySetInstanceUID) {
336
+ setSegIsLoading(false);
337
+ }
338
+ if (evt.overlappingSegments) {
339
+ uiNotificationService.show({
340
+ title: 'Overlapping Segments',
341
+ message: 'Overlapping segments detected which is not currently supported',
342
+ type: 'warning'
343
+ });
344
+ }
345
+ });
346
+ return () => {
347
+ unsubscribe();
348
+ };
349
+ }, [segDisplaySet]);
350
+ (0,react.useEffect)(() => {
351
+ const {
352
+ unsubscribe
353
+ } = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, _ref => {
354
+ let {
355
+ percentComplete,
356
+ numSegments
357
+ } = _ref;
358
+ setProcessingProgress({
359
+ percentComplete,
360
+ totalSegments: numSegments
361
+ });
362
+ });
363
+ return () => {
364
+ unsubscribe();
365
+ };
366
+ }, [segDisplaySet]);
367
+
368
+ /**
369
+ Cleanup the SEG viewport when the viewport is destroyed
370
+ */
371
+ (0,react.useEffect)(() => {
372
+ const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, _ref2 => {
373
+ let {
374
+ displaySetInstanceUIDs
375
+ } = _ref2;
376
+ const activeViewport = viewports[activeViewportIndex];
377
+ if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) {
378
+ viewportGridService.setDisplaySetsForViewport({
379
+ viewportIndex: activeViewportIndex,
380
+ displaySetInstanceUIDs: []
381
+ });
382
+ }
383
+ });
384
+ return () => {
385
+ onDisplaySetsRemovedSubscription.unsubscribe();
386
+ };
387
+ }, []);
388
+ (0,react.useEffect)(() => {
389
+ let toolGroup = toolGroupService.getToolGroup(toolGroupId);
390
+ if (toolGroup) {
391
+ return;
392
+ }
393
+
394
+ // This creates a custom tool group which has the lifetime of this view
395
+ // only, and does NOT interfere with currently displayed segmentations.
396
+ toolGroup = initSEGToolGroup(toolGroupService, customizationService, toolGroupId);
397
+ setToolGroupCreated(true);
398
+ return () => {
399
+ // remove the segmentation representations if seg displayset changed
400
+ segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);
401
+
402
+ // Only destroy the viewport specific implementation
403
+ toolGroupService.destroyToolGroup(toolGroupId);
404
+ };
405
+ }, []);
406
+ (0,react.useEffect)(() => {
407
+ setIsHydrated(segDisplaySet.isHydrated);
408
+ return () => {
409
+ // remove the segmentation representations if seg displayset changed
410
+ segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);
411
+ referencedDisplaySetRef.current = null;
412
+ };
413
+ }, [segDisplaySet]);
414
+
415
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
416
+ let childrenWithProps = null;
417
+ if (!referencedDisplaySetRef.current || referencedDisplaySet.displaySetInstanceUID !== referencedDisplaySetRef.current.displaySet.displaySetInstanceUID) {
418
+ return null;
419
+ }
420
+ if (children && children.length) {
421
+ childrenWithProps = children.map((child, index) => {
422
+ return child && /*#__PURE__*/react.cloneElement(child, {
423
+ viewportIndex,
424
+ key: index
425
+ });
426
+ });
427
+ }
428
+ const {
429
+ PatientID,
430
+ PatientName,
431
+ PatientSex,
432
+ PatientAge,
433
+ SliceThickness,
434
+ ManufacturerModelName,
435
+ StudyDate,
436
+ SeriesDescription,
437
+ SpacingBetweenSlices
438
+ } = referencedDisplaySetRef.current.metadata;
439
+ const onStatusClick = async () => {
440
+ const isHydrated = await _hydrateSEG({
441
+ segDisplaySet,
442
+ viewportIndex,
443
+ servicesManager
444
+ });
445
+ setIsHydrated(isHydrated);
446
+ };
447
+ return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(ui_src/* ViewportActionBar */.uY, {
448
+ onDoubleClick: evt => {
449
+ evt.stopPropagation();
450
+ evt.preventDefault();
451
+ },
452
+ onArrowsClick: onSegmentChange,
453
+ getStatusComponent: () => {
454
+ return _getStatusComponent({
455
+ isHydrated,
456
+ onStatusClick
457
+ });
458
+ },
459
+ studyData: {
460
+ label: viewportLabel,
461
+ useAltStyling: true,
462
+ studyDate: formatDate(StudyDate),
463
+ seriesDescription: `SEG Viewport ${SeriesDescription}`,
464
+ patientInformation: {
465
+ patientName: PatientName ? src["default"].utils.formatPN(PatientName.Alphabetic) : '',
466
+ patientSex: PatientSex || '',
467
+ patientAge: PatientAge || '',
468
+ MRN: PatientID || '',
469
+ thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '',
470
+ spacing: SpacingBetweenSlices !== undefined ? `${SpacingBetweenSlices.toFixed(2)}mm` : '',
471
+ scanner: ManufacturerModelName || ''
472
+ }
473
+ }
474
+ }), /*#__PURE__*/react.createElement("div", {
475
+ className: "relative flex flex-row w-full h-full overflow-hidden"
476
+ }, segIsLoading && /*#__PURE__*/react.createElement(ui_src/* LoadingIndicatorTotalPercent */.bk, {
477
+ className: "w-full h-full",
478
+ totalNumbers: processingProgress.totalSegments,
479
+ percentComplete: processingProgress.percentComplete,
480
+ loadingText: "Loading SEG..."
481
+ }), getCornerstoneViewport(), childrenWithProps));
482
+ }
483
+ OHIFCornerstoneSEGViewport.propTypes = {
484
+ displaySets: prop_types_default().arrayOf((prop_types_default()).object),
485
+ viewportIndex: (prop_types_default()).number.isRequired,
486
+ dataSource: (prop_types_default()).object,
487
+ children: (prop_types_default()).node,
488
+ customProps: (prop_types_default()).object
489
+ };
490
+ OHIFCornerstoneSEGViewport.defaultProps = {
491
+ customProps: {}
492
+ };
493
+ function _getReferencedDisplaySetMetadata(referencedDisplaySet) {
494
+ const image0 = referencedDisplaySet.images[0];
495
+ const referencedDisplaySetMetadata = {
496
+ PatientID: image0.PatientID,
497
+ PatientName: image0.PatientName,
498
+ PatientSex: image0.PatientSex,
499
+ PatientAge: image0.PatientAge,
500
+ SliceThickness: image0.SliceThickness,
501
+ StudyDate: image0.StudyDate,
502
+ SeriesDescription: image0.SeriesDescription,
503
+ SeriesInstanceUID: image0.SeriesInstanceUID,
504
+ SeriesNumber: image0.SeriesNumber,
505
+ ManufacturerModelName: image0.ManufacturerModelName,
506
+ SpacingBetweenSlices: image0.SpacingBetweenSlices
507
+ };
508
+ return referencedDisplaySetMetadata;
509
+ }
510
+ /* harmony default export */ const viewports_OHIFCornerstoneSEGViewport = (OHIFCornerstoneSEGViewport);
511
+
512
+ /***/ })
513
+
514
+ }]);