@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
@@ -0,0 +1,508 @@
1
+ "use strict";
2
+ (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[581],{
3
+
4
+ /***/ 72581:
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_OHIFCornerstoneRTViewport)
13
+ });
14
+
15
+ // EXTERNAL MODULE: ../../../node_modules/react/index.js
16
+ var react = __webpack_require__(32735);
17
+ // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
18
+ var prop_types = __webpack_require__(60216);
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 + 449 modules
23
+ var ui_src = __webpack_require__(43803);
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);
78
+ ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts
79
+
80
+ const RESPONSE = {
81
+ NO_NEVER: -1,
82
+ CANCEL: 0,
83
+ HYDRATE_SEG: 5
84
+ };
85
+ function promptHydrateRT(_ref) {
86
+ let {
87
+ servicesManager,
88
+ rtDisplaySet,
89
+ viewportIndex,
90
+ toolGroupId = 'default'
91
+ } = _ref;
92
+ const {
93
+ uiViewportDialogService
94
+ } = servicesManager.services;
95
+ return new Promise(async function (resolve, reject) {
96
+ const promptResult = await _askHydrate(uiViewportDialogService, viewportIndex);
97
+ if (promptResult === RESPONSE.HYDRATE_SEG) {
98
+ const isHydrated = await _hydrateRT({
99
+ rtDisplaySet,
100
+ viewportIndex,
101
+ toolGroupId,
102
+ servicesManager
103
+ });
104
+ resolve(isHydrated);
105
+ }
106
+ });
107
+ }
108
+ function _askHydrate(uiViewportDialogService, viewportIndex) {
109
+ return new Promise(function (resolve, reject) {
110
+ const message = 'Do you want to open this Segmentation?';
111
+ const actions = [{
112
+ type: 'secondary',
113
+ text: 'No',
114
+ value: RESPONSE.CANCEL
115
+ }, {
116
+ type: 'primary',
117
+ text: 'Yes',
118
+ value: RESPONSE.HYDRATE_SEG
119
+ }];
120
+ const onSubmit = result => {
121
+ uiViewportDialogService.hide();
122
+ resolve(result);
123
+ };
124
+ uiViewportDialogService.show({
125
+ viewportIndex,
126
+ type: 'info',
127
+ message,
128
+ actions,
129
+ onSubmit,
130
+ onOutsideClick: () => {
131
+ uiViewportDialogService.hide();
132
+ resolve(RESPONSE.CANCEL);
133
+ }
134
+ });
135
+ });
136
+ }
137
+ /* harmony default export */ const utils_promptHydrateRT = (promptHydrateRT);
138
+ // EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
139
+ var es = __webpack_require__(21572);
140
+ ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/viewports/_getStatusComponent.tsx
141
+
142
+
143
+
144
+ function _getStatusComponent(_ref) {
145
+ let {
146
+ isHydrated,
147
+ onStatusClick
148
+ } = _ref;
149
+ let ToolTipMessage = null;
150
+ let StatusIcon = null;
151
+ const {
152
+ t
153
+ } = (0,es/* useTranslation */.$G)('Common');
154
+ const loadStr = t('LOAD');
155
+ switch (isHydrated) {
156
+ case true:
157
+ StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
158
+ name: "status-alert"
159
+ });
160
+ ToolTipMessage = () => /*#__PURE__*/react.createElement("div", null, "This Segmentation is loaded in the segmentation panel");
161
+ break;
162
+ case false:
163
+ StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
164
+ name: "status-untracked"
165
+ });
166
+ ToolTipMessage = () => /*#__PURE__*/react.createElement("div", null, "Click LOAD to load RTSTRUCT.");
167
+ }
168
+ const StatusArea = () => /*#__PURE__*/react.createElement("div", {
169
+ className: "flex h-6 leading-6 cursor-default text-sm text-white"
170
+ }, /*#__PURE__*/react.createElement("div", {
171
+ className: "min-w-[45px] flex items-center p-1 rounded-l-xl rounded-r bg-customgray-100"
172
+ }, /*#__PURE__*/react.createElement(StatusIcon, null), /*#__PURE__*/react.createElement("span", {
173
+ className: "ml-1"
174
+ }, "RTSTRUCT")), !isHydrated && /*#__PURE__*/react.createElement("div", {
175
+ className: "ml-1 px-1.5 rounded cursor-pointer hover:text-black bg-primary-main hover:bg-primary-light"
176
+ // Using onMouseUp here because onClick is not working when the viewport is not active and is styled with pointer-events:none
177
+ ,
178
+ onMouseUp: onStatusClick
179
+ }, loadStr));
180
+ return /*#__PURE__*/react.createElement(react.Fragment, null, ToolTipMessage && /*#__PURE__*/react.createElement(ui_src/* Tooltip */.u, {
181
+ content: /*#__PURE__*/react.createElement(ToolTipMessage, null),
182
+ position: "bottom-left"
183
+ }, /*#__PURE__*/react.createElement(StatusArea, null)), !ToolTipMessage && /*#__PURE__*/react.createElement(StatusArea, null));
184
+ }
185
+ ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/initRTToolGroup.ts
186
+ function createRTToolGroupAndAddTools(ToolGroupService, customizationService, toolGroupId) {
187
+ const {
188
+ tools
189
+ } = customizationService.get('cornerstone.overlayViewportTools') ?? {};
190
+ return ToolGroupService.createToolGroupAndAddTools(toolGroupId, tools, {});
191
+ }
192
+ /* harmony default export */ const initRTToolGroup = (createRTToolGroupAndAddTools);
193
+ ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/viewports/OHIFCornerstoneRTViewport.tsx
194
+ 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); }
195
+
196
+
197
+
198
+
199
+
200
+
201
+
202
+
203
+ const {
204
+ formatDate
205
+ } = src.utils;
206
+ const RT_TOOLGROUP_BASE_NAME = 'RTToolGroup';
207
+ function OHIFCornerstoneRTViewport(props) {
208
+ const {
209
+ children,
210
+ displaySets,
211
+ viewportOptions,
212
+ viewportIndex,
213
+ viewportLabel,
214
+ servicesManager,
215
+ extensionManager
216
+ } = props;
217
+ const {
218
+ displaySetService,
219
+ toolGroupService,
220
+ segmentationService,
221
+ uiNotificationService,
222
+ customizationService
223
+ } = servicesManager.services;
224
+ const toolGroupId = `${RT_TOOLGROUP_BASE_NAME}-${viewportIndex}`;
225
+
226
+ // RT viewport will always have a single display set
227
+ if (displaySets.length > 1) {
228
+ throw new Error('RT viewport should only have a single display set');
229
+ }
230
+ const rtDisplaySet = displaySets[0];
231
+ const [viewportGrid, viewportGridService] = (0,ui_src/* useViewportGrid */.O_)();
232
+
233
+ // States
234
+ const [isToolGroupCreated, setToolGroupCreated] = (0,react.useState)(false);
235
+ const [selectedSegment, setSelectedSegment] = (0,react.useState)(1);
236
+
237
+ // Hydration means that the RT is opened and segments are loaded into the
238
+ // segmentation panel, and RT is also rendered on any viewport that is in the
239
+ // same frameOfReferenceUID as the referencedSeriesUID of the RT. However,
240
+ // loading basically means RT loading over network and bit unpacking of the
241
+ // RT data.
242
+ const [isHydrated, setIsHydrated] = (0,react.useState)(rtDisplaySet.isHydrated);
243
+ const [rtIsLoading, setRtIsLoading] = (0,react.useState)(!rtDisplaySet.isLoaded);
244
+ const [element, setElement] = (0,react.useState)(null);
245
+ const [processingProgress, setProcessingProgress] = (0,react.useState)({
246
+ percentComplete: null,
247
+ totalSegments: null
248
+ });
249
+
250
+ // refs
251
+ const referencedDisplaySetRef = (0,react.useRef)(null);
252
+ const {
253
+ viewports,
254
+ activeViewportIndex
255
+ } = viewportGrid;
256
+ const referencedDisplaySet = rtDisplaySet.getReferenceDisplaySet();
257
+ const referencedDisplaySetMetadata = _getReferencedDisplaySetMetadata(referencedDisplaySet);
258
+ referencedDisplaySetRef.current = {
259
+ displaySet: referencedDisplaySet,
260
+ metadata: referencedDisplaySetMetadata
261
+ };
262
+ /**
263
+ * OnElementEnabled callback which is called after the cornerstoneExtension
264
+ * has enabled the element. Note: we delegate all the image rendering to
265
+ * cornerstoneExtension, so we don't need to do anything here regarding
266
+ * the image rendering, element enabling etc.
267
+ */
268
+ const onElementEnabled = evt => {
269
+ setElement(evt.detail.element);
270
+ };
271
+ const onElementDisabled = () => {
272
+ setElement(null);
273
+ };
274
+ const getCornerstoneViewport = (0,react.useCallback)(() => {
275
+ const {
276
+ component: Component
277
+ } = extensionManager.getModuleEntry('@ohif/extension-cornerstone.viewportModule.cornerstone');
278
+ const {
279
+ displaySet: referencedDisplaySet
280
+ } = referencedDisplaySetRef.current;
281
+
282
+ // Todo: jump to the center of the first segment
283
+ return /*#__PURE__*/react.createElement(Component, _extends({}, props, {
284
+ displaySets: [referencedDisplaySet, rtDisplaySet],
285
+ viewportOptions: {
286
+ viewportType: 'volume',
287
+ toolGroupId: toolGroupId,
288
+ orientation: viewportOptions.orientation,
289
+ viewportId: viewportOptions.viewportId
290
+ },
291
+ onElementEnabled: onElementEnabled,
292
+ onElementDisabled: onElementDisabled
293
+ }));
294
+ }, [viewportIndex, rtDisplaySet, toolGroupId]);
295
+ const onSegmentChange = (0,react.useCallback)(direction => {
296
+ direction = direction === 'left' ? -1 : 1;
297
+ const segmentationId = rtDisplaySet.displaySetInstanceUID;
298
+ const segmentation = segmentationService.getSegmentation(segmentationId);
299
+ const {
300
+ segments
301
+ } = segmentation;
302
+ const numberOfSegments = Object.keys(segments).length;
303
+ let newSelectedSegmentIndex = selectedSegment + direction;
304
+
305
+ // Segment 0 is always background
306
+ if (newSelectedSegmentIndex >= numberOfSegments - 1) {
307
+ newSelectedSegmentIndex = 1;
308
+ } else if (newSelectedSegmentIndex === 0) {
309
+ newSelectedSegmentIndex = numberOfSegments - 1;
310
+ }
311
+ segmentationService.jumpToSegmentCenter(segmentationId, newSelectedSegmentIndex, toolGroupId);
312
+ setSelectedSegment(newSelectedSegmentIndex);
313
+ }, [selectedSegment]);
314
+ (0,react.useEffect)(() => {
315
+ if (rtIsLoading) {
316
+ return;
317
+ }
318
+ utils_promptHydrateRT({
319
+ servicesManager,
320
+ viewportIndex,
321
+ rtDisplaySet
322
+ }).then(isHydrated => {
323
+ if (isHydrated) {
324
+ setIsHydrated(true);
325
+ }
326
+ });
327
+ }, [servicesManager, viewportIndex, rtDisplaySet, rtIsLoading]);
328
+ (0,react.useEffect)(() => {
329
+ const {
330
+ unsubscribe
331
+ } = segmentationService.subscribe(segmentationService.EVENTS.SEGMENTATION_LOADING_COMPLETE, evt => {
332
+ if (evt.rtDisplaySet.displaySetInstanceUID === rtDisplaySet.displaySetInstanceUID) {
333
+ setRtIsLoading(false);
334
+ }
335
+ if (evt.overlappingSegments) {
336
+ uiNotificationService.show({
337
+ title: 'Overlapping Segments',
338
+ message: 'Overlapping segments detected which is not currently supported',
339
+ type: 'warning'
340
+ });
341
+ }
342
+ });
343
+ return () => {
344
+ unsubscribe();
345
+ };
346
+ }, [rtDisplaySet]);
347
+ (0,react.useEffect)(() => {
348
+ const {
349
+ unsubscribe
350
+ } = segmentationService.subscribe(segmentationService.EVENTS.SEGMENT_LOADING_COMPLETE, _ref => {
351
+ let {
352
+ percentComplete,
353
+ numSegments
354
+ } = _ref;
355
+ setProcessingProgress({
356
+ percentComplete,
357
+ totalSegments: numSegments
358
+ });
359
+ });
360
+ return () => {
361
+ unsubscribe();
362
+ };
363
+ }, [rtDisplaySet]);
364
+
365
+ /**
366
+ Cleanup the SEG viewport when the viewport is destroyed
367
+ */
368
+ (0,react.useEffect)(() => {
369
+ const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, _ref2 => {
370
+ let {
371
+ displaySetInstanceUIDs
372
+ } = _ref2;
373
+ const activeViewport = viewports[activeViewportIndex];
374
+ if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) {
375
+ viewportGridService.setDisplaySetsForViewport({
376
+ viewportIndex: activeViewportIndex,
377
+ displaySetInstanceUIDs: []
378
+ });
379
+ }
380
+ });
381
+ return () => {
382
+ onDisplaySetsRemovedSubscription.unsubscribe();
383
+ };
384
+ }, []);
385
+ (0,react.useEffect)(() => {
386
+ let toolGroup = toolGroupService.getToolGroup(toolGroupId);
387
+ if (toolGroup) {
388
+ return;
389
+ }
390
+ toolGroup = initRTToolGroup(toolGroupService, customizationService, toolGroupId);
391
+ setToolGroupCreated(true);
392
+ return () => {
393
+ // remove the segmentation representations if seg displayset changed
394
+ segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);
395
+ toolGroupService.destroyToolGroup(toolGroupId);
396
+ };
397
+ }, []);
398
+ (0,react.useEffect)(() => {
399
+ setIsHydrated(rtDisplaySet.isHydrated);
400
+ return () => {
401
+ // remove the segmentation representations if seg displayset changed
402
+ segmentationService.removeSegmentationRepresentationFromToolGroup(toolGroupId);
403
+ referencedDisplaySetRef.current = null;
404
+ };
405
+ }, [rtDisplaySet]);
406
+
407
+ // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
408
+ let childrenWithProps = null;
409
+ if (!referencedDisplaySetRef.current || referencedDisplaySet.displaySetInstanceUID !== referencedDisplaySetRef.current.displaySet.displaySetInstanceUID) {
410
+ return null;
411
+ }
412
+ if (children && children.length) {
413
+ childrenWithProps = children.map((child, index) => {
414
+ return child && /*#__PURE__*/react.cloneElement(child, {
415
+ viewportIndex,
416
+ key: index
417
+ });
418
+ });
419
+ }
420
+ const {
421
+ PatientID,
422
+ PatientName,
423
+ PatientSex,
424
+ PatientAge,
425
+ SliceThickness,
426
+ ManufacturerModelName,
427
+ StudyDate,
428
+ SeriesDescription,
429
+ SpacingBetweenSlices,
430
+ SeriesNumber
431
+ } = referencedDisplaySetRef.current.metadata;
432
+ const onStatusClick = async () => {
433
+ const isHydrated = await _hydrateRT({
434
+ rtDisplaySet,
435
+ viewportIndex,
436
+ servicesManager
437
+ });
438
+ setIsHydrated(isHydrated);
439
+ };
440
+ return /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement(ui_src/* ViewportActionBar */.uY, {
441
+ onDoubleClick: evt => {
442
+ evt.stopPropagation();
443
+ evt.preventDefault();
444
+ },
445
+ onArrowsClick: onSegmentChange,
446
+ getStatusComponent: () => {
447
+ return _getStatusComponent({
448
+ isHydrated,
449
+ onStatusClick
450
+ });
451
+ },
452
+ studyData: {
453
+ label: viewportLabel,
454
+ useAltStyling: true,
455
+ studyDate: formatDate(StudyDate),
456
+ currentSeries: SeriesNumber,
457
+ seriesDescription: `RT Viewport ${SeriesDescription}`,
458
+ patientInformation: {
459
+ patientName: PatientName ? src["default"].utils.formatPN(PatientName.Alphabetic) : '',
460
+ patientSex: PatientSex || '',
461
+ patientAge: PatientAge || '',
462
+ MRN: PatientID || '',
463
+ thickness: SliceThickness ? `${SliceThickness.toFixed(2)}mm` : '',
464
+ spacing: SpacingBetweenSlices !== undefined ? `${SpacingBetweenSlices.toFixed(2)}mm` : '',
465
+ scanner: ManufacturerModelName || ''
466
+ }
467
+ }
468
+ }), /*#__PURE__*/react.createElement("div", {
469
+ className: "relative flex flex-row w-full h-full overflow-hidden"
470
+ }, rtIsLoading && /*#__PURE__*/react.createElement(ui_src/* LoadingIndicatorTotalPercent */.bk, {
471
+ className: "w-full h-full",
472
+ totalNumbers: processingProgress.totalSegments,
473
+ percentComplete: processingProgress.percentComplete,
474
+ loadingText: "Loading RTSTRUCT..."
475
+ }), getCornerstoneViewport(), childrenWithProps));
476
+ }
477
+ OHIFCornerstoneRTViewport.propTypes = {
478
+ displaySets: prop_types_default().arrayOf((prop_types_default()).object),
479
+ viewportIndex: (prop_types_default()).number.isRequired,
480
+ dataSource: (prop_types_default()).object,
481
+ children: (prop_types_default()).node,
482
+ customProps: (prop_types_default()).object
483
+ };
484
+ OHIFCornerstoneRTViewport.defaultProps = {
485
+ customProps: {}
486
+ };
487
+ function _getReferencedDisplaySetMetadata(referencedDisplaySet) {
488
+ const image0 = referencedDisplaySet.images[0];
489
+ const referencedDisplaySetMetadata = {
490
+ PatientID: image0.PatientID,
491
+ PatientName: image0.PatientName,
492
+ PatientSex: image0.PatientSex,
493
+ PatientAge: image0.PatientAge,
494
+ SliceThickness: image0.SliceThickness,
495
+ StudyDate: image0.StudyDate,
496
+ SeriesDescription: image0.SeriesDescription,
497
+ SeriesInstanceUID: image0.SeriesInstanceUID,
498
+ SeriesNumber: image0.SeriesNumber,
499
+ ManufacturerModelName: image0.ManufacturerModelName,
500
+ SpacingBetweenSlices: image0.SpacingBetweenSlices
501
+ };
502
+ return referencedDisplaySetMetadata;
503
+ }
504
+ /* harmony default export */ const viewports_OHIFCornerstoneRTViewport = (OHIFCornerstoneRTViewport);
505
+
506
+ /***/ })
507
+
508
+ }]);