@ohif/app 3.9.0-beta.63 → 3.9.0-beta.65
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.
- package/dist/{281.bundle.7c7901a50253c44b7442.js → 281.bundle.b8b7d64372d238b1bed7.js} +2 -2
- package/dist/{360.bundle.8a8f7bd0f6abe249c0bf.js → 360.bundle.e9046bdadd9127c4c283.js} +64 -42
- package/dist/{516.bundle.2ef0b13819eba82a074a.js → 516.bundle.693f55fcf3bb54b40468.js} +2 -2
- package/dist/714.bundle.9b2c17c05367d7c0d610.js +714 -0
- package/dist/{842.bundle.1f7c1ed6e3fc4b3d6c0d.js → 842.bundle.a18175a4463177477ae0.js} +2 -2
- package/dist/app.bundle.css +2 -2
- package/dist/{app.bundle.7f68c3bf1b59a4296eb8.js → app.bundle.ebe09d60104c52d101df.js} +24 -9
- package/dist/index.html +1 -1
- package/dist/sw.js +1 -1
- package/package.json +18 -18
- package/dist/571.bundle.2b4e21bc61d7685a5fdb.js +0 -439
- /package/dist/{153.bundle.afe3ef7a718e10fe4dad.js → 153.bundle.0ae1608ab0c459f10034.js} +0 -0
- /package/dist/{210.bundle.ab7a30ddd8918c2430c0.js → 210.bundle.257ad99561da3bcd8898.js} +0 -0
- /package/dist/{246.bundle.56cb7242fd5fffa7e162.js → 246.bundle.fbf55ff25ff129a8803b.js} +0 -0
- /package/dist/{353.bundle.f24a9a5a6c132b064183.js → 353.bundle.35ad75ecf210b279b5d2.js} +0 -0
- /package/dist/{376.bundle.ba616b300f3928c0ff01.js → 376.bundle.c07661d7af53d348e9a6.js} +0 -0
- /package/dist/{502.bundle.ebdcf21b4235a0467291.js → 502.bundle.5ccd0605d5f7143e1a18.js} +0 -0
- /package/dist/{591.bundle.f10188994bacf4ea603f.js → 591.bundle.93e22748fb59e587b62c.js} +0 -0
- /package/dist/{65.bundle.51f001957a96f638b829.js → 65.bundle.9b25384f1dd15b04c099.js} +0 -0
- /package/dist/{791.bundle.4b3194aec51358ee63b5.js → 791.bundle.4debb283e99b3c663b79.js} +0 -0
- /package/dist/{888.bundle.e4baf21a08c731ff0cde.js → 888.bundle.f2989b50bdb1b0d4b5da.js} +0 -0
- /package/dist/{913.bundle.92c848a924160e13ea85.js → 913.bundle.f982e2af9e7287fc3539.js} +0 -0
- /package/dist/{944.bundle.4cae5a299a033b49d859.js → 944.bundle.c6c7ffe0ac1321ccbcea.js} +0 -0
- /package/dist/{962.bundle.716a1bdba3c497f813d3.js → 962.bundle.85a0fcaaf3c0aeeb6789.js} +0 -0
- /package/dist/{978.bundle.b4c917071818698e2d80.js → 978.bundle.56bcd4d2eea3e8622913.js} +0 -0
- /package/dist/{994.bundle.69e100d89d343c11903d.js → 994.bundle.ceeeed48891cf977dd14.js} +0 -0
|
@@ -1,439 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[571],{
|
|
3
|
-
|
|
4
|
-
/***/ 85571:
|
|
5
|
-
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
6
|
-
|
|
7
|
-
__webpack_require__.r(__webpack_exports__);
|
|
8
|
-
/* harmony export */ __webpack_require__.d(__webpack_exports__, {
|
|
9
|
-
/* harmony export */ "default": () => (__WEBPACK_DEFAULT_EXPORT__)
|
|
10
|
-
/* harmony export */ });
|
|
11
|
-
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(3827);
|
|
12
|
-
/* harmony import */ var prop_types__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(prop_types__WEBPACK_IMPORTED_MODULE_0__);
|
|
13
|
-
/* harmony import */ var react__WEBPACK_IMPORTED_MODULE_1__ = __webpack_require__(43001);
|
|
14
|
-
/* harmony import */ var react_i18next__WEBPACK_IMPORTED_MODULE_2__ = __webpack_require__(69190);
|
|
15
|
-
/* harmony import */ var _ohif_core__WEBPACK_IMPORTED_MODULE_3__ = __webpack_require__(84793);
|
|
16
|
-
/* harmony import */ var _tools_modules_dicomSRModule__WEBPACK_IMPORTED_MODULE_4__ = __webpack_require__(75449);
|
|
17
|
-
/* harmony import */ var _ohif_ui__WEBPACK_IMPORTED_MODULE_5__ = __webpack_require__(38604);
|
|
18
|
-
/* harmony import */ var _utils_hydrateStructuredReport__WEBPACK_IMPORTED_MODULE_6__ = __webpack_require__(83330);
|
|
19
|
-
/* harmony import */ var _state__WEBPACK_IMPORTED_MODULE_7__ = __webpack_require__(52490);
|
|
20
|
-
/* harmony import */ var _utils_createReferencedImageDisplaySet__WEBPACK_IMPORTED_MODULE_8__ = __webpack_require__(92522);
|
|
21
|
-
function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
const MEASUREMENT_TRACKING_EXTENSION_ID = '@ohif/extension-measurement-tracking';
|
|
32
|
-
const SR_TOOLGROUP_BASE_NAME = 'SRToolGroup';
|
|
33
|
-
function OHIFCornerstoneSRViewport(props) {
|
|
34
|
-
const {
|
|
35
|
-
children,
|
|
36
|
-
dataSource,
|
|
37
|
-
displaySets,
|
|
38
|
-
viewportOptions,
|
|
39
|
-
servicesManager,
|
|
40
|
-
extensionManager
|
|
41
|
-
} = props;
|
|
42
|
-
const [appConfig] = (0,_state__WEBPACK_IMPORTED_MODULE_7__/* .useAppConfig */ .M)();
|
|
43
|
-
const {
|
|
44
|
-
displaySetService,
|
|
45
|
-
cornerstoneViewportService,
|
|
46
|
-
measurementService,
|
|
47
|
-
viewportActionCornersService
|
|
48
|
-
} = servicesManager.services;
|
|
49
|
-
const viewportId = viewportOptions.viewportId;
|
|
50
|
-
|
|
51
|
-
// SR viewport will always have a single display set
|
|
52
|
-
if (displaySets.length > 1) {
|
|
53
|
-
throw new Error('SR viewport should only have a single display set');
|
|
54
|
-
}
|
|
55
|
-
const srDisplaySet = displaySets[0];
|
|
56
|
-
const [viewportGrid, viewportGridService] = (0,_ohif_ui__WEBPACK_IMPORTED_MODULE_5__/* .useViewportGrid */ .O_)();
|
|
57
|
-
const [measurementSelected, setMeasurementSelected] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(0);
|
|
58
|
-
const [measurementCount, setMeasurementCount] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(1);
|
|
59
|
-
const [activeImageDisplaySetData, setActiveImageDisplaySetData] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);
|
|
60
|
-
const [referencedDisplaySetMetadata, setReferencedDisplaySetMetadata] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);
|
|
61
|
-
const [element, setElement] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(null);
|
|
62
|
-
const {
|
|
63
|
-
viewports,
|
|
64
|
-
activeViewportId
|
|
65
|
-
} = viewportGrid;
|
|
66
|
-
const {
|
|
67
|
-
t
|
|
68
|
-
} = (0,react_i18next__WEBPACK_IMPORTED_MODULE_2__/* .useTranslation */ .$G)('Common');
|
|
69
|
-
|
|
70
|
-
// Optional hook into tracking extension, if present.
|
|
71
|
-
let trackedMeasurements;
|
|
72
|
-
let sendTrackedMeasurementsEvent;
|
|
73
|
-
const hasMeasurementTrackingExtension = extensionManager.registeredExtensionIds.includes(MEASUREMENT_TRACKING_EXTENSION_ID);
|
|
74
|
-
if (hasMeasurementTrackingExtension) {
|
|
75
|
-
const contextModule = extensionManager.getModuleEntry('@ohif/extension-measurement-tracking.contextModule.TrackedMeasurementsContext');
|
|
76
|
-
const tracked = (0,react__WEBPACK_IMPORTED_MODULE_1__.useContext)(contextModule.context);
|
|
77
|
-
trackedMeasurements = tracked?.[0];
|
|
78
|
-
sendTrackedMeasurementsEvent = tracked?.[1];
|
|
79
|
-
}
|
|
80
|
-
if (!sendTrackedMeasurementsEvent) {
|
|
81
|
-
// if no panels from measurement-tracking extension is used, this code will run
|
|
82
|
-
trackedMeasurements = null;
|
|
83
|
-
sendTrackedMeasurementsEvent = (eventName, {
|
|
84
|
-
displaySetInstanceUID
|
|
85
|
-
}) => {
|
|
86
|
-
measurementService.clearMeasurements();
|
|
87
|
-
const {
|
|
88
|
-
SeriesInstanceUIDs
|
|
89
|
-
} = (0,_utils_hydrateStructuredReport__WEBPACK_IMPORTED_MODULE_6__/* ["default"] */ .Z)({
|
|
90
|
-
servicesManager,
|
|
91
|
-
extensionManager,
|
|
92
|
-
appConfig
|
|
93
|
-
}, displaySetInstanceUID);
|
|
94
|
-
const displaySets = displaySetService.getDisplaySetsForSeries(SeriesInstanceUIDs[0]);
|
|
95
|
-
if (displaySets.length) {
|
|
96
|
-
viewportGridService.setDisplaySetsForViewports([{
|
|
97
|
-
viewportId: activeViewportId,
|
|
98
|
-
displaySetInstanceUIDs: [displaySets[0].displaySetInstanceUID]
|
|
99
|
-
}]);
|
|
100
|
-
}
|
|
101
|
-
};
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
/**
|
|
105
|
-
* Store the tracking identifiers per viewport in order to be able to
|
|
106
|
-
* show the SR measurements on the referenced image on the correct viewport,
|
|
107
|
-
* when multiple viewports are used.
|
|
108
|
-
*/
|
|
109
|
-
const setTrackingIdentifiers = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(measurementSelected => {
|
|
110
|
-
const {
|
|
111
|
-
measurements
|
|
112
|
-
} = srDisplaySet;
|
|
113
|
-
(0,_tools_modules_dicomSRModule__WEBPACK_IMPORTED_MODULE_4__/* .setTrackingUniqueIdentifiersForElement */ .l2)(element, measurements.map(measurement => measurement.TrackingUniqueIdentifier), measurementSelected);
|
|
114
|
-
}, [element, measurementSelected, srDisplaySet]);
|
|
115
|
-
|
|
116
|
-
/**
|
|
117
|
-
* OnElementEnabled callback which is called after the cornerstoneExtension
|
|
118
|
-
* has enabled the element. Note: we delegate all the image rendering to
|
|
119
|
-
* cornerstoneExtension, so we don't need to do anything here regarding
|
|
120
|
-
* the image rendering, element enabling etc.
|
|
121
|
-
*/
|
|
122
|
-
const onElementEnabled = evt => {
|
|
123
|
-
setElement(evt.detail.element);
|
|
124
|
-
};
|
|
125
|
-
const updateViewport = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(newMeasurementSelected => {
|
|
126
|
-
const {
|
|
127
|
-
StudyInstanceUID,
|
|
128
|
-
displaySetInstanceUID,
|
|
129
|
-
sopClassUids
|
|
130
|
-
} = srDisplaySet;
|
|
131
|
-
if (!StudyInstanceUID || !displaySetInstanceUID) {
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
if (sopClassUids && sopClassUids.length > 1) {
|
|
135
|
-
// Todo: what happens if there are multiple SOP Classes? Why we are
|
|
136
|
-
// not throwing an error?
|
|
137
|
-
console.warn('More than one SOPClassUID in the same series is not yet supported.');
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
// if (!srDisplaySet.measurements || !srDisplaySet.measurements.length) {
|
|
141
|
-
// return;
|
|
142
|
-
// }
|
|
143
|
-
|
|
144
|
-
_getViewportReferencedDisplaySetData(srDisplaySet, newMeasurementSelected, displaySetService).then(({
|
|
145
|
-
referencedDisplaySet,
|
|
146
|
-
referencedDisplaySetMetadata
|
|
147
|
-
}) => {
|
|
148
|
-
setMeasurementSelected(newMeasurementSelected);
|
|
149
|
-
setActiveImageDisplaySetData(referencedDisplaySet);
|
|
150
|
-
setReferencedDisplaySetMetadata(referencedDisplaySetMetadata);
|
|
151
|
-
if (referencedDisplaySet.displaySetInstanceUID === activeImageDisplaySetData?.displaySetInstanceUID) {
|
|
152
|
-
const {
|
|
153
|
-
measurements
|
|
154
|
-
} = srDisplaySet;
|
|
155
|
-
|
|
156
|
-
// it means that we have a new referenced display set, and the
|
|
157
|
-
// imageIdIndex will handle it by updating the viewport, but if they
|
|
158
|
-
// are the same we just need to use measurementService to jump to the
|
|
159
|
-
// new measurement
|
|
160
|
-
const csViewport = cornerstoneViewportService.getCornerstoneViewport(viewportId);
|
|
161
|
-
const imageIds = csViewport.getImageIds();
|
|
162
|
-
const imageIdIndex = imageIds.indexOf(measurements[newMeasurementSelected].imageId);
|
|
163
|
-
if (imageIdIndex !== -1) {
|
|
164
|
-
csViewport.setImageIdIndex(imageIdIndex);
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
});
|
|
168
|
-
}, [dataSource, srDisplaySet, activeImageDisplaySetData, viewportId]);
|
|
169
|
-
const getCornerstoneViewport = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(() => {
|
|
170
|
-
if (!activeImageDisplaySetData) {
|
|
171
|
-
return null;
|
|
172
|
-
}
|
|
173
|
-
const {
|
|
174
|
-
component: Component
|
|
175
|
-
} = extensionManager.getModuleEntry('@ohif/extension-cornerstone.viewportModule.cornerstone');
|
|
176
|
-
const {
|
|
177
|
-
measurements
|
|
178
|
-
} = srDisplaySet;
|
|
179
|
-
const measurement = measurements[measurementSelected];
|
|
180
|
-
if (!measurement) {
|
|
181
|
-
return null;
|
|
182
|
-
}
|
|
183
|
-
const initialImageIndex = activeImageDisplaySetData.images.findIndex(image => image.imageId === measurement.imageId);
|
|
184
|
-
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(Component, _extends({}, props, {
|
|
185
|
-
// should be passed second since we don't want SR displaySet to
|
|
186
|
-
// override the activeImageDisplaySetData
|
|
187
|
-
displaySets: [activeImageDisplaySetData]
|
|
188
|
-
// It is possible that there is a hanging protocol applying viewportOptions
|
|
189
|
-
// for the SR, so inherit the viewport options
|
|
190
|
-
// TODO: Ensure the viewport options are set correctly with respect to
|
|
191
|
-
// stack etc, in the incoming viewport options.
|
|
192
|
-
,
|
|
193
|
-
viewportOptions: {
|
|
194
|
-
...viewportOptions,
|
|
195
|
-
toolGroupId: `${SR_TOOLGROUP_BASE_NAME}`,
|
|
196
|
-
// viewportType should not be required, as the stack type should be
|
|
197
|
-
// required already in order to view SR, but sometimes segmentation
|
|
198
|
-
// views set the viewport type without fixing the allowed display
|
|
199
|
-
viewportType: 'stack',
|
|
200
|
-
// The positionIds for the viewport aren't meaningful for the child display sets
|
|
201
|
-
positionIds: null
|
|
202
|
-
},
|
|
203
|
-
onElementEnabled: evt => {
|
|
204
|
-
props.onElementEnabled?.(evt);
|
|
205
|
-
onElementEnabled(evt);
|
|
206
|
-
},
|
|
207
|
-
initialImageIndex: initialImageIndex,
|
|
208
|
-
isJumpToMeasurementDisabled: true
|
|
209
|
-
}));
|
|
210
|
-
}, [activeImageDisplaySetData, viewportId, measurementSelected]);
|
|
211
|
-
const onMeasurementChange = (0,react__WEBPACK_IMPORTED_MODULE_1__.useCallback)(direction => {
|
|
212
|
-
let newMeasurementSelected = measurementSelected;
|
|
213
|
-
newMeasurementSelected += direction;
|
|
214
|
-
if (newMeasurementSelected >= measurementCount) {
|
|
215
|
-
newMeasurementSelected = 0;
|
|
216
|
-
} else if (newMeasurementSelected < 0) {
|
|
217
|
-
newMeasurementSelected = measurementCount - 1;
|
|
218
|
-
}
|
|
219
|
-
setTrackingIdentifiers(newMeasurementSelected);
|
|
220
|
-
updateViewport(newMeasurementSelected);
|
|
221
|
-
}, [measurementSelected, measurementCount, updateViewport, setTrackingIdentifiers]);
|
|
222
|
-
|
|
223
|
-
/**
|
|
224
|
-
Cleanup the SR viewport when the viewport is destroyed
|
|
225
|
-
*/
|
|
226
|
-
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
|
|
227
|
-
const onDisplaySetsRemovedSubscription = displaySetService.subscribe(displaySetService.EVENTS.DISPLAY_SETS_REMOVED, ({
|
|
228
|
-
displaySetInstanceUIDs
|
|
229
|
-
}) => {
|
|
230
|
-
const activeViewport = viewports.get(activeViewportId);
|
|
231
|
-
if (displaySetInstanceUIDs.includes(activeViewport.displaySetInstanceUID)) {
|
|
232
|
-
viewportGridService.setDisplaySetsForViewport({
|
|
233
|
-
viewportId: activeViewportId,
|
|
234
|
-
displaySetInstanceUIDs: []
|
|
235
|
-
});
|
|
236
|
-
}
|
|
237
|
-
});
|
|
238
|
-
return () => {
|
|
239
|
-
onDisplaySetsRemovedSubscription.unsubscribe();
|
|
240
|
-
};
|
|
241
|
-
}, []);
|
|
242
|
-
|
|
243
|
-
/**
|
|
244
|
-
* Loading the measurements from the SR viewport, which goes through the
|
|
245
|
-
* isHydratable check, the outcome for the isHydrated state here is always FALSE
|
|
246
|
-
* since we don't do the hydration here. Todo: can't we just set it as false? why
|
|
247
|
-
* we are changing the state here? isHydrated is always false at this stage, and
|
|
248
|
-
* if it is hydrated we don't even use the SR viewport.
|
|
249
|
-
*/
|
|
250
|
-
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
|
|
251
|
-
const loadSR = async () => {
|
|
252
|
-
if (!srDisplaySet.isLoaded) {
|
|
253
|
-
await srDisplaySet.load();
|
|
254
|
-
}
|
|
255
|
-
const numMeasurements = srDisplaySet.measurements.length;
|
|
256
|
-
setMeasurementCount(numMeasurements);
|
|
257
|
-
updateViewport(measurementSelected);
|
|
258
|
-
};
|
|
259
|
-
loadSR();
|
|
260
|
-
}, [srDisplaySet]);
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* Hook to update the tracking identifiers when the selected measurement changes or
|
|
264
|
-
* the element changes
|
|
265
|
-
*/
|
|
266
|
-
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
|
|
267
|
-
const updateSR = async () => {
|
|
268
|
-
if (!srDisplaySet.isLoaded) {
|
|
269
|
-
await srDisplaySet.load();
|
|
270
|
-
}
|
|
271
|
-
if (!element || !srDisplaySet.isLoaded) {
|
|
272
|
-
return;
|
|
273
|
-
}
|
|
274
|
-
setTrackingIdentifiers(measurementSelected);
|
|
275
|
-
};
|
|
276
|
-
updateSR();
|
|
277
|
-
}, [measurementSelected, element, setTrackingIdentifiers, srDisplaySet]);
|
|
278
|
-
|
|
279
|
-
/**
|
|
280
|
-
* Todo: what is this, not sure what it does regarding the react aspect,
|
|
281
|
-
* it is updating a local variable? which is not state.
|
|
282
|
-
*/
|
|
283
|
-
const [isLocked, setIsLocked] = (0,react__WEBPACK_IMPORTED_MODULE_1__.useState)(trackedMeasurements?.context?.trackedSeries?.length > 0);
|
|
284
|
-
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
|
|
285
|
-
setIsLocked(trackedMeasurements?.context?.trackedSeries?.length > 0);
|
|
286
|
-
}, [trackedMeasurements]);
|
|
287
|
-
(0,react__WEBPACK_IMPORTED_MODULE_1__.useEffect)(() => {
|
|
288
|
-
viewportActionCornersService.setComponents([{
|
|
289
|
-
viewportId,
|
|
290
|
-
id: 'viewportStatusComponent',
|
|
291
|
-
component: _getStatusComponent({
|
|
292
|
-
srDisplaySet,
|
|
293
|
-
viewportId,
|
|
294
|
-
isRehydratable: srDisplaySet.isRehydratable,
|
|
295
|
-
isLocked,
|
|
296
|
-
sendTrackedMeasurementsEvent,
|
|
297
|
-
t
|
|
298
|
-
}),
|
|
299
|
-
indexPriority: -100,
|
|
300
|
-
location: viewportActionCornersService.LOCATIONS.topLeft
|
|
301
|
-
}, {
|
|
302
|
-
viewportId,
|
|
303
|
-
id: 'viewportActionArrowsComponent',
|
|
304
|
-
index: 0,
|
|
305
|
-
component: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(_ohif_ui__WEBPACK_IMPORTED_MODULE_5__/* .ViewportActionArrows */ .PG, {
|
|
306
|
-
key: "actionArrows",
|
|
307
|
-
onArrowsClick: onMeasurementChange
|
|
308
|
-
}),
|
|
309
|
-
indexPriority: 0,
|
|
310
|
-
location: viewportActionCornersService.LOCATIONS.topRight
|
|
311
|
-
}]);
|
|
312
|
-
}, [isLocked, onMeasurementChange, sendTrackedMeasurementsEvent, srDisplaySet, t, viewportActionCornersService, viewportId]);
|
|
313
|
-
|
|
314
|
-
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
315
|
-
let childrenWithProps = null;
|
|
316
|
-
if (!activeImageDisplaySetData || !referencedDisplaySetMetadata) {
|
|
317
|
-
return null;
|
|
318
|
-
}
|
|
319
|
-
if (children && children.length) {
|
|
320
|
-
childrenWithProps = children.map((child, index) => {
|
|
321
|
-
return child && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.cloneElement(child, {
|
|
322
|
-
viewportId,
|
|
323
|
-
key: index
|
|
324
|
-
});
|
|
325
|
-
});
|
|
326
|
-
}
|
|
327
|
-
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("div", {
|
|
328
|
-
className: "relative flex h-full w-full flex-row overflow-hidden"
|
|
329
|
-
}, getCornerstoneViewport(), childrenWithProps));
|
|
330
|
-
}
|
|
331
|
-
OHIFCornerstoneSRViewport.propTypes = {
|
|
332
|
-
displaySets: prop_types__WEBPACK_IMPORTED_MODULE_0___default().arrayOf((prop_types__WEBPACK_IMPORTED_MODULE_0___default().object)),
|
|
333
|
-
viewportId: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().string).isRequired,
|
|
334
|
-
dataSource: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().object),
|
|
335
|
-
children: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().node),
|
|
336
|
-
viewportLabel: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().string),
|
|
337
|
-
viewportOptions: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().object),
|
|
338
|
-
servicesManager: (prop_types__WEBPACK_IMPORTED_MODULE_0___default().object).isRequired,
|
|
339
|
-
extensionManager: prop_types__WEBPACK_IMPORTED_MODULE_0___default().instanceOf(_ohif_core__WEBPACK_IMPORTED_MODULE_3__/* .ExtensionManager */ .W$).isRequired
|
|
340
|
-
};
|
|
341
|
-
async function _getViewportReferencedDisplaySetData(displaySet, measurementSelected, displaySetService) {
|
|
342
|
-
const {
|
|
343
|
-
measurements
|
|
344
|
-
} = displaySet;
|
|
345
|
-
const measurement = measurements[measurementSelected];
|
|
346
|
-
const {
|
|
347
|
-
displaySetInstanceUID
|
|
348
|
-
} = measurement;
|
|
349
|
-
if (!displaySet.keyImageDisplaySet) {
|
|
350
|
-
// Create a new display set, and preserve a reference to it here,
|
|
351
|
-
// so that it can be re-displayed and shown inside the SR viewport.
|
|
352
|
-
// This is only for ease of redisplay - the display set is stored in the
|
|
353
|
-
// usual manner in the display set service.
|
|
354
|
-
displaySet.keyImageDisplaySet = (0,_utils_createReferencedImageDisplaySet__WEBPACK_IMPORTED_MODULE_8__/* ["default"] */ .Z)(displaySetService, displaySet);
|
|
355
|
-
}
|
|
356
|
-
const referencedDisplaySet = displaySetService.getDisplaySetByUID(displaySetInstanceUID);
|
|
357
|
-
const image0 = referencedDisplaySet.images[0];
|
|
358
|
-
const referencedDisplaySetMetadata = {
|
|
359
|
-
PatientID: image0.PatientID,
|
|
360
|
-
PatientName: image0.PatientName,
|
|
361
|
-
PatientSex: image0.PatientSex,
|
|
362
|
-
PatientAge: image0.PatientAge,
|
|
363
|
-
SliceThickness: image0.SliceThickness,
|
|
364
|
-
StudyDate: image0.StudyDate,
|
|
365
|
-
SeriesDescription: image0.SeriesDescription,
|
|
366
|
-
SeriesInstanceUID: image0.SeriesInstanceUID,
|
|
367
|
-
SeriesNumber: image0.SeriesNumber,
|
|
368
|
-
ManufacturerModelName: image0.ManufacturerModelName,
|
|
369
|
-
SpacingBetweenSlices: image0.SpacingBetweenSlices
|
|
370
|
-
};
|
|
371
|
-
return {
|
|
372
|
-
referencedDisplaySetMetadata,
|
|
373
|
-
referencedDisplaySet
|
|
374
|
-
};
|
|
375
|
-
}
|
|
376
|
-
function _getStatusComponent({
|
|
377
|
-
srDisplaySet,
|
|
378
|
-
viewportId,
|
|
379
|
-
isRehydratable,
|
|
380
|
-
isLocked,
|
|
381
|
-
sendTrackedMeasurementsEvent,
|
|
382
|
-
t
|
|
383
|
-
}) {
|
|
384
|
-
const handleMouseUp = () => {
|
|
385
|
-
sendTrackedMeasurementsEvent('HYDRATE_SR', {
|
|
386
|
-
displaySetInstanceUID: srDisplaySet.displaySetInstanceUID,
|
|
387
|
-
viewportId
|
|
388
|
-
});
|
|
389
|
-
};
|
|
390
|
-
const loadStr = t('LOAD');
|
|
391
|
-
|
|
392
|
-
// 1 - Incompatible
|
|
393
|
-
// 2 - Locked
|
|
394
|
-
// 3 - Rehydratable / Open
|
|
395
|
-
const state = isRehydratable && !isLocked ? 3 : isRehydratable && isLocked ? 2 : 1;
|
|
396
|
-
let ToolTipMessage = null;
|
|
397
|
-
let StatusIcon = null;
|
|
398
|
-
switch (state) {
|
|
399
|
-
case 1:
|
|
400
|
-
StatusIcon = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(_ohif_ui__WEBPACK_IMPORTED_MODULE_5__/* .Icon */ .JO, {
|
|
401
|
-
name: "status-alert"
|
|
402
|
-
});
|
|
403
|
-
ToolTipMessage = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("div", null, "This structured report is not compatible", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("br", null), "with this application.");
|
|
404
|
-
break;
|
|
405
|
-
case 2:
|
|
406
|
-
StatusIcon = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(_ohif_ui__WEBPACK_IMPORTED_MODULE_5__/* .Icon */ .JO, {
|
|
407
|
-
name: "status-locked"
|
|
408
|
-
});
|
|
409
|
-
ToolTipMessage = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("div", null, "This structured report is currently read-only", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("br", null), "because you are tracking measurements in", /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("br", null), "another viewport.");
|
|
410
|
-
break;
|
|
411
|
-
case 3:
|
|
412
|
-
StatusIcon = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(_ohif_ui__WEBPACK_IMPORTED_MODULE_5__/* .Icon */ .JO, {
|
|
413
|
-
className: "text-aqua-pale",
|
|
414
|
-
name: "status-untracked"
|
|
415
|
-
});
|
|
416
|
-
ToolTipMessage = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("div", null, `Click ${loadStr} to restore measurements.`);
|
|
417
|
-
}
|
|
418
|
-
const StatusArea = () => /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("div", {
|
|
419
|
-
className: "flex h-6 cursor-default text-sm leading-6 text-white"
|
|
420
|
-
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("div", {
|
|
421
|
-
className: "bg-customgray-100 flex min-w-[45px] items-center rounded-l-xl rounded-r p-1"
|
|
422
|
-
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(StatusIcon, null), /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("span", {
|
|
423
|
-
className: "ml-1"
|
|
424
|
-
}, "SR")), state === 3 && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement("div", {
|
|
425
|
-
className: "bg-primary-main hover:bg-primary-light ml-1 cursor-pointer rounded px-1.5 hover:text-black"
|
|
426
|
-
// Using onMouseUp here because onClick is not working when the viewport is not active and is styled with pointer-events:none
|
|
427
|
-
,
|
|
428
|
-
onMouseUp: handleMouseUp
|
|
429
|
-
}, loadStr));
|
|
430
|
-
return /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(react__WEBPACK_IMPORTED_MODULE_1__.Fragment, null, ToolTipMessage && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(_ohif_ui__WEBPACK_IMPORTED_MODULE_5__/* .Tooltip */ .u, {
|
|
431
|
-
content: /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(ToolTipMessage, null),
|
|
432
|
-
position: "bottom-left"
|
|
433
|
-
}, /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(StatusArea, null)), !ToolTipMessage && /*#__PURE__*/react__WEBPACK_IMPORTED_MODULE_1__.createElement(StatusArea, null));
|
|
434
|
-
}
|
|
435
|
-
/* harmony default export */ const __WEBPACK_DEFAULT_EXPORT__ = (OHIFCornerstoneSRViewport);
|
|
436
|
-
|
|
437
|
-
/***/ })
|
|
438
|
-
|
|
439
|
-
}]);
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|