@ohif/app 3.9.0-beta.57 → 3.9.0-beta.59
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/{29.bundle.976319462f33868497c2.js → 117.bundle.403581eea72534ff9c7e.js} +1765 -582
- package/dist/{169.bundle.483057ed84ca3e92513a.js → 169.bundle.d28df3cf2d600fc3e146.js} +7 -5
- package/dist/{210.bundle.368d53177dc659dc6af0.js → 210.bundle.ea52c75bb27ab002dc4d.js} +2 -2
- package/dist/{281.bundle.49da07d997da7cc01705.js → 281.bundle.719e9e222fecb4e9e9c6.js} +18 -4
- package/dist/{360.bundle.2c117803c05f0bc31424.js → 360.bundle.9a0c682beae1ef7e40b1.js} +5 -5
- package/dist/{372.bundle.d97377781382080306bd.js → 372.bundle.9891a9938b28db4b36ce.js} +5 -4
- package/dist/424.bundle.1caecbb1bbefc271b621.js +663 -0
- package/dist/{497.bundle.ee102d6243f984113f08.js → 497.bundle.bbc07cef12d598653a65.js} +149 -117
- package/dist/{498.bundle.bb47c493dd02451f77ef.js → 498.bundle.e5ccb2bc38e4bfdd564b.js} +1 -1
- package/dist/{516.bundle.d777e4126814a5a47117.js → 516.bundle.e59c26f055d145ce835e.js} +47 -12
- package/dist/{196.bundle.cf8c2311aafb5312bbf7.js → 579.bundle.0b78fc095924efac431d.js} +1705 -493
- package/dist/{552.bundle.85aaefb5e22d6d1bffa9.js → 65.bundle.d15cc84a0b991e182649.js} +15 -680
- package/dist/{129.bundle.3102eccbd5c78524c3dd.js → 650.bundle.a65389abf76ad921aa17.js} +2671 -2975
- package/dist/{793.bundle.c92f52ddff0e3bf506e6.js → 793.bundle.e4c759b5cdfcc3c7494f.js} +2 -2
- package/dist/{818.bundle.cda4e369fdee5459a544.js → 818.bundle.b64fae7e982e16a82ca2.js} +133 -69
- package/dist/{842.bundle.a5533bc77e6f57b0ee30.js → 842.bundle.cccbb7e3611e3d220f07.js} +2 -2
- package/dist/{888.bundle.7ff5dfd3c14072cee2a9.js → 888.bundle.d3b2a82cb17155725342.js} +9 -3
- package/dist/{428.bundle.744fc5865b2d747de88a.js → 904.bundle.008f8a2095669f4eabba.js} +88 -50
- package/dist/{962.bundle.d5f55c85407221bbce7b.js → 962.bundle.868b30361a52b0ffa504.js} +2 -2
- package/dist/{993.bundle.aa31ebda5a5f62c44de5.js → 993.bundle.302a286ebb6e3fc0c35a.js} +1265 -485
- package/dist/{994.bundle.c4709bfb7fd9dcde0551.js → 994.bundle.3b5f396b62cce2990c03.js} +15 -1
- package/dist/{app.bundle.a69624a3e0becd131c65.js → app.bundle.14f126e3ec4491bb1948.js} +1393 -1321
- package/dist/app.bundle.css +2 -2
- package/dist/dicom-microscopy-viewer/dicomMicroscopyViewer.min.js.map +1 -0
- package/dist/{histogram-worker.bundle.e7e9fea2c3236b0e747a.js → histogram-worker.bundle.89729ccb99d170ff2f2f.js} +2 -1
- package/dist/index.html +3 -1
- package/dist/{polySeg.bundle.b25c61224998018d0f79.js → polySeg.bundle.d8943427beee7694621a.js} +3 -22
- package/dist/{suv-peak-worker.bundle.eb11e71db02e52601ecf.js → suv-peak-worker.bundle.15dcb8d1ab8e0528bfd9.js} +3 -22
- package/dist/sw.js +1 -1
- package/package.json +18 -18
- /package/dist/{153.bundle.62dad8e9c7532474e95c.js → 153.bundle.42a66f99ced5972aa0c0.js} +0 -0
- /package/dist/{202.bundle.bb0e8196739bb896dc9e.js → 202.bundle.f6d9ca4b1c16b1aa227f.js} +0 -0
- /package/dist/{246.bundle.27aca95ea22cd5fcd414.js → 246.bundle.912e9f8342cd5d6228e6.js} +0 -0
- /package/dist/{353.bundle.a741604612f3f1d18398.js → 353.bundle.5b11e6b395c5d5cc33bf.js} +0 -0
- /package/dist/{376.bundle.2657056d8bc2b11fb0e8.js → 376.bundle.ac0e23dc830cd982fd18.js} +0 -0
- /package/dist/{552.css → 424.css} +0 -0
- /package/dist/{502.bundle.e7e6c345146aef00a169.js → 502.bundle.823682db96d52df1b8cf.js} +0 -0
- /package/dist/{591.bundle.aa91409b528ae6b601e0.js → 591.bundle.39fa1e6e7285929f2e29.js} +0 -0
- /package/dist/{791.bundle.d614182fa975e92cf4f5.js → 791.bundle.ecf9b1f8892d5f8962a3.js} +0 -0
- /package/dist/{944.bundle.c2bcb49d5077bd6fcc87.js → 944.bundle.93eddec203a43754e826.js} +0 -0
- /package/dist/{978.bundle.cd27543a62e7230557b2.js → 978.bundle.c12902cf44dca926bcb8.js} +0 -0
|
@@ -1,671 +1,5 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[
|
|
3
|
-
|
|
4
|
-
/***/ 3094:
|
|
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 */ src_DicomMicroscopyViewport)
|
|
13
|
-
});
|
|
14
|
-
|
|
15
|
-
// EXTERNAL MODULE: ../../../node_modules/react/index.js
|
|
16
|
-
var react = __webpack_require__(43001);
|
|
17
|
-
// EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
|
|
18
|
-
var prop_types = __webpack_require__(3827);
|
|
19
|
-
var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
|
|
20
|
-
// EXTERNAL MODULE: ../../ui/src/index.js + 784 modules
|
|
21
|
-
var src = __webpack_require__(38604);
|
|
22
|
-
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/DicomMicroscopyViewport.css
|
|
23
|
-
// extracted by mini-css-extract-plugin
|
|
24
|
-
|
|
25
|
-
// EXTERNAL MODULE: ../../../node_modules/classnames/index.js
|
|
26
|
-
var classnames = __webpack_require__(33901);
|
|
27
|
-
var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
|
|
28
|
-
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/components/ViewportOverlay/listComponentGenerator.tsx
|
|
29
|
-
const listComponentGenerator = props => {
|
|
30
|
-
const {
|
|
31
|
-
list,
|
|
32
|
-
itemGenerator
|
|
33
|
-
} = props;
|
|
34
|
-
if (!list) {
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
return list.map(item => {
|
|
38
|
-
if (!item) {
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
const generator = item.generator || itemGenerator;
|
|
42
|
-
if (!generator) {
|
|
43
|
-
throw new Error(`No generator for ${item}`);
|
|
44
|
-
}
|
|
45
|
-
return generator({
|
|
46
|
-
...props,
|
|
47
|
-
item
|
|
48
|
-
});
|
|
49
|
-
});
|
|
50
|
-
};
|
|
51
|
-
/* harmony default export */ const ViewportOverlay_listComponentGenerator = (listComponentGenerator);
|
|
52
|
-
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/components/ViewportOverlay/ViewportOverlay.css
|
|
53
|
-
// extracted by mini-css-extract-plugin
|
|
54
|
-
|
|
55
|
-
// EXTERNAL MODULE: ../../../node_modules/moment/moment.js
|
|
56
|
-
var moment_moment = __webpack_require__(71271);
|
|
57
|
-
// EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 28 modules
|
|
58
|
-
var esm = __webpack_require__(62709);
|
|
59
|
-
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/components/ViewportOverlay/utils.ts
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
/**
|
|
64
|
-
* Checks if value is valid.
|
|
65
|
-
*
|
|
66
|
-
* @param {number} value
|
|
67
|
-
* @returns {boolean} is valid.
|
|
68
|
-
*/
|
|
69
|
-
function isValidNumber(value) {
|
|
70
|
-
return typeof value === 'number' && !isNaN(value);
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Formats number precision.
|
|
75
|
-
*
|
|
76
|
-
* @param {number} number
|
|
77
|
-
* @param {number} precision
|
|
78
|
-
* @returns {number} formatted number.
|
|
79
|
-
*/
|
|
80
|
-
function utils_formatNumberPrecision(number, precision) {
|
|
81
|
-
if (number !== null) {
|
|
82
|
-
return parseFloat(number).toFixed(precision);
|
|
83
|
-
}
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Formats DICOM date.
|
|
88
|
-
*
|
|
89
|
-
* @param {string} date
|
|
90
|
-
* @param {string} strFormat
|
|
91
|
-
* @returns {string} formatted date.
|
|
92
|
-
*/
|
|
93
|
-
function utils_formatDICOMDate(date, strFormat = 'MMM D, YYYY') {
|
|
94
|
-
return moment(date, 'YYYYMMDD').format(strFormat);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
/**
|
|
98
|
-
* DICOM Time is stored as HHmmss.SSS, where:
|
|
99
|
-
* HH 24 hour time:
|
|
100
|
-
* m mm 0..59 Minutes
|
|
101
|
-
* s ss 0..59 Seconds
|
|
102
|
-
* S SS SSS 0..999 Fractional seconds
|
|
103
|
-
*
|
|
104
|
-
* Goal: '24:12:12'
|
|
105
|
-
*
|
|
106
|
-
* @param {*} time
|
|
107
|
-
* @param {string} strFormat
|
|
108
|
-
* @returns {string} formatted name.
|
|
109
|
-
*/
|
|
110
|
-
function utils_formatDICOMTime(time, strFormat = 'HH:mm:ss') {
|
|
111
|
-
return moment(time, 'HH:mm:ss').format(strFormat);
|
|
112
|
-
}
|
|
113
|
-
|
|
114
|
-
/**
|
|
115
|
-
* Formats a patient name for display purposes
|
|
116
|
-
*
|
|
117
|
-
* @param {string} name
|
|
118
|
-
* @returns {string} formatted name.
|
|
119
|
-
*/
|
|
120
|
-
function utils_formatPN(name) {
|
|
121
|
-
if (!name) {
|
|
122
|
-
return;
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
// Convert the first ^ to a ', '. String.replace() only affects
|
|
126
|
-
// the first appearance of the character.
|
|
127
|
-
const commaBetweenFirstAndLast = name.replace('^', ', ');
|
|
128
|
-
|
|
129
|
-
// Replace any remaining '^' characters with spaces
|
|
130
|
-
const cleaned = commaBetweenFirstAndLast.replace(/\^/g, ' ');
|
|
131
|
-
|
|
132
|
-
// Trim any extraneous whitespace
|
|
133
|
-
return cleaned.trim();
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
/**
|
|
137
|
-
* Gets compression type
|
|
138
|
-
*
|
|
139
|
-
* @param {number} imageId
|
|
140
|
-
* @returns {string} compression type.
|
|
141
|
-
*/
|
|
142
|
-
function getCompression(imageId) {
|
|
143
|
-
const generalImageModule = cornerstone.metaData.get('generalImageModule', imageId) || {};
|
|
144
|
-
const {
|
|
145
|
-
lossyImageCompression,
|
|
146
|
-
lossyImageCompressionRatio,
|
|
147
|
-
lossyImageCompressionMethod
|
|
148
|
-
} = generalImageModule;
|
|
149
|
-
if (lossyImageCompression === '01' && lossyImageCompressionRatio !== '') {
|
|
150
|
-
const compressionMethod = lossyImageCompressionMethod || 'Lossy: ';
|
|
151
|
-
const compressionRatio = utils_formatNumberPrecision(lossyImageCompressionRatio, 2);
|
|
152
|
-
return compressionMethod + compressionRatio + ' : 1';
|
|
153
|
-
}
|
|
154
|
-
return 'Lossless / Uncompressed';
|
|
155
|
-
}
|
|
156
|
-
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/components/ViewportOverlay/index.tsx
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
/**
|
|
163
|
-
*
|
|
164
|
-
* @param {*} config is a configuration object that defines four lists of elements,
|
|
165
|
-
* one topLeft, topRight, bottomLeft, bottomRight contents.
|
|
166
|
-
* @param {*} extensionManager is used to load the image data.
|
|
167
|
-
* @returns
|
|
168
|
-
*/
|
|
169
|
-
const generateFromConfig = ({
|
|
170
|
-
topLeft = [],
|
|
171
|
-
topRight = [],
|
|
172
|
-
bottomLeft = [],
|
|
173
|
-
bottomRight = [],
|
|
174
|
-
itemGenerator = () => {}
|
|
175
|
-
}) => {
|
|
176
|
-
return props => {
|
|
177
|
-
const topLeftClass = 'top-viewport left-viewport text-primary-light';
|
|
178
|
-
const topRightClass = 'top-viewport right-viewport-scrollbar text-primary-light';
|
|
179
|
-
const bottomRightClass = 'bottom-viewport right-viewport-scrollbar text-primary-light';
|
|
180
|
-
const bottomLeftClass = 'bottom-viewport left-viewport text-primary-light';
|
|
181
|
-
const overlay = 'absolute pointer-events-none microscopy-viewport-overlay';
|
|
182
|
-
return /*#__PURE__*/react.createElement(react.Fragment, null, topLeft && topLeft.length > 0 && /*#__PURE__*/react.createElement("div", {
|
|
183
|
-
"data-cy": 'viewport-overlay-top-left',
|
|
184
|
-
className: classnames_default()(overlay, topLeftClass)
|
|
185
|
-
}, ViewportOverlay_listComponentGenerator({
|
|
186
|
-
...props,
|
|
187
|
-
list: topLeft,
|
|
188
|
-
itemGenerator
|
|
189
|
-
})), topRight && topRight.length > 0 && /*#__PURE__*/react.createElement("div", {
|
|
190
|
-
"data-cy": 'viewport-overlay-top-right',
|
|
191
|
-
className: classnames_default()(overlay, topRightClass)
|
|
192
|
-
}, ViewportOverlay_listComponentGenerator({
|
|
193
|
-
...props,
|
|
194
|
-
list: topRight,
|
|
195
|
-
itemGenerator
|
|
196
|
-
})), bottomRight && bottomRight.length > 0 && /*#__PURE__*/react.createElement("div", {
|
|
197
|
-
"data-cy": 'viewport-overlay-bottom-right',
|
|
198
|
-
className: classnames_default()(overlay, bottomRightClass)
|
|
199
|
-
}, ViewportOverlay_listComponentGenerator({
|
|
200
|
-
...props,
|
|
201
|
-
list: bottomRight,
|
|
202
|
-
itemGenerator
|
|
203
|
-
})), bottomLeft && bottomLeft.length > 0 && /*#__PURE__*/react.createElement("div", {
|
|
204
|
-
"data-cy": 'viewport-overlay-bottom-left',
|
|
205
|
-
className: classnames_default()(overlay, bottomLeftClass)
|
|
206
|
-
}, ViewportOverlay_listComponentGenerator({
|
|
207
|
-
...props,
|
|
208
|
-
list: bottomLeft,
|
|
209
|
-
itemGenerator
|
|
210
|
-
})));
|
|
211
|
-
};
|
|
212
|
-
};
|
|
213
|
-
const itemGenerator = props => {
|
|
214
|
-
const {
|
|
215
|
-
item
|
|
216
|
-
} = props;
|
|
217
|
-
const {
|
|
218
|
-
title,
|
|
219
|
-
value: valueFunc,
|
|
220
|
-
condition,
|
|
221
|
-
contents
|
|
222
|
-
} = item;
|
|
223
|
-
props.image = {
|
|
224
|
-
...props.image,
|
|
225
|
-
...props.metadata
|
|
226
|
-
};
|
|
227
|
-
props.formatDate = formatDICOMDate;
|
|
228
|
-
props.formatTime = formatDICOMTime;
|
|
229
|
-
props.formatPN = formatPN;
|
|
230
|
-
props.formatNumberPrecision = formatNumberPrecision;
|
|
231
|
-
if (condition && !condition(props)) {
|
|
232
|
-
return null;
|
|
233
|
-
}
|
|
234
|
-
if (!contents && !valueFunc) {
|
|
235
|
-
return null;
|
|
236
|
-
}
|
|
237
|
-
const value = valueFunc && valueFunc(props);
|
|
238
|
-
const contentsValue = contents && contents(props) || [{
|
|
239
|
-
className: 'mr-1',
|
|
240
|
-
value: title
|
|
241
|
-
}, {
|
|
242
|
-
classname: 'mr-1 font-light',
|
|
243
|
-
value
|
|
244
|
-
}];
|
|
245
|
-
return /*#__PURE__*/React.createElement("div", {
|
|
246
|
-
key: item.id,
|
|
247
|
-
className: "flex flex-row"
|
|
248
|
-
}, contentsValue.map((content, idx) => /*#__PURE__*/React.createElement("span", {
|
|
249
|
-
key: idx,
|
|
250
|
-
className: content.className
|
|
251
|
-
}, content.value)));
|
|
252
|
-
};
|
|
253
|
-
/* harmony default export */ const ViewportOverlay = (generateFromConfig({}));
|
|
254
|
-
// EXTERNAL MODULE: ../../core/src/index.ts + 74 modules
|
|
255
|
-
var core_src = __webpack_require__(84793);
|
|
256
|
-
// EXTERNAL MODULE: ../../../extensions/default/src/index.ts + 93 modules
|
|
257
|
-
var default_src = __webpack_require__(32281);
|
|
258
|
-
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/utils/dicomWebClient.ts
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
/**
|
|
263
|
-
* create a DICOMwebClient object to be used by Dicom Microscopy Viewer
|
|
264
|
-
*
|
|
265
|
-
* Referenced the code from `/extensions/default/src/DicomWebDataSource/index.js`
|
|
266
|
-
*
|
|
267
|
-
* @param param0
|
|
268
|
-
* @returns
|
|
269
|
-
*/
|
|
270
|
-
function getDicomWebClient({
|
|
271
|
-
extensionManager,
|
|
272
|
-
servicesManager
|
|
273
|
-
}) {
|
|
274
|
-
const dataSourceConfig = window.config.dataSources.find(ds => ds.sourceName === extensionManager.activeDataSource);
|
|
275
|
-
const {
|
|
276
|
-
userAuthenticationService
|
|
277
|
-
} = servicesManager.services;
|
|
278
|
-
const {
|
|
279
|
-
wadoRoot,
|
|
280
|
-
staticWado,
|
|
281
|
-
singlepart
|
|
282
|
-
} = dataSourceConfig.configuration;
|
|
283
|
-
const wadoConfig = {
|
|
284
|
-
url: wadoRoot || '/dicomlocal',
|
|
285
|
-
staticWado,
|
|
286
|
-
singlepart,
|
|
287
|
-
headers: userAuthenticationService.getAuthorizationHeader(),
|
|
288
|
-
errorInterceptor: core_src/* errorHandler */.Po.getHTTPErrorHandler()
|
|
289
|
-
};
|
|
290
|
-
const client = new default_src.StaticWadoClient(wadoConfig);
|
|
291
|
-
client.wadoURL = wadoConfig.url;
|
|
292
|
-
if (extensionManager.activeDataSource === 'dicomlocal') {
|
|
293
|
-
/**
|
|
294
|
-
* For local data source, override the retrieveInstanceFrames() method of the
|
|
295
|
-
* dicomweb-client to retrieve image data from memory cached metadata.
|
|
296
|
-
* Other methods of the client doesn't matter, as we are feeding the DMV
|
|
297
|
-
* with the series metadata already.
|
|
298
|
-
*
|
|
299
|
-
* @param {Object} options
|
|
300
|
-
* @param {String} options.studyInstanceUID - Study Instance UID
|
|
301
|
-
* @param {String} options.seriesInstanceUID - Series Instance UID
|
|
302
|
-
* @param {String} options.sopInstanceUID - SOP Instance UID
|
|
303
|
-
* @param {String} options.frameNumbers - One-based indices of Frame Items
|
|
304
|
-
* @param {Object} [options.queryParams] - HTTP query parameters
|
|
305
|
-
* @returns {ArrayBuffer[]} Rendered Frame Items as byte arrays
|
|
306
|
-
*/
|
|
307
|
-
//
|
|
308
|
-
client.retrieveInstanceFrames = async options => {
|
|
309
|
-
if (!('studyInstanceUID' in options)) {
|
|
310
|
-
throw new Error('Study Instance UID is required for retrieval of instance frames');
|
|
311
|
-
}
|
|
312
|
-
if (!('seriesInstanceUID' in options)) {
|
|
313
|
-
throw new Error('Series Instance UID is required for retrieval of instance frames');
|
|
314
|
-
}
|
|
315
|
-
if (!('sopInstanceUID' in options)) {
|
|
316
|
-
throw new Error('SOP Instance UID is required for retrieval of instance frames');
|
|
317
|
-
}
|
|
318
|
-
if (!('frameNumbers' in options)) {
|
|
319
|
-
throw new Error('frame numbers are required for retrieval of instance frames');
|
|
320
|
-
}
|
|
321
|
-
console.log(`retrieve frames ${options.frameNumbers.toString()} of instance ${options.sopInstanceUID}`);
|
|
322
|
-
const instance = core_src.DicomMetadataStore.getInstance(options.studyInstanceUID, options.seriesInstanceUID, options.sopInstanceUID);
|
|
323
|
-
const frameNumbers = Array.isArray(options.frameNumbers) ? options.frameNumbers : options.frameNumbers.split(',');
|
|
324
|
-
return frameNumbers.map(fr => Array.isArray(instance.PixelData) ? instance.PixelData[+fr - 1] : instance.PixelData);
|
|
325
|
-
};
|
|
326
|
-
}
|
|
327
|
-
return client;
|
|
328
|
-
}
|
|
329
|
-
// EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
|
|
330
|
-
var dcmjs_es = __webpack_require__(67540);
|
|
331
|
-
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/utils/cleanDenaturalizedDataset.ts
|
|
332
|
-
|
|
333
|
-
function isPrimitive(v) {
|
|
334
|
-
return !(typeof v == 'object' || Array.isArray(v));
|
|
335
|
-
}
|
|
336
|
-
const vrNumerics = ['DS', 'FL', 'FD', 'IS', 'OD', 'OF', 'OL', 'OV', 'SL', 'SS', 'SV', 'UL', 'US', 'UV'];
|
|
337
|
-
|
|
338
|
-
/**
|
|
339
|
-
* Specialized for DICOM JSON format dataset cleaning.
|
|
340
|
-
* @param obj
|
|
341
|
-
* @returns
|
|
342
|
-
*/
|
|
343
|
-
function cleanDenaturalizedDataset(obj, options) {
|
|
344
|
-
if (Array.isArray(obj)) {
|
|
345
|
-
const newAry = obj.map(o => isPrimitive(o) ? o : cleanDenaturalizedDataset(o, options));
|
|
346
|
-
return newAry;
|
|
347
|
-
} else if (isPrimitive(obj)) {
|
|
348
|
-
return obj;
|
|
349
|
-
} else {
|
|
350
|
-
Object.keys(obj).forEach(key => {
|
|
351
|
-
if (obj[key].Value === null && obj[key].vr) {
|
|
352
|
-
delete obj[key].Value;
|
|
353
|
-
} else if (Array.isArray(obj[key].Value) && obj[key].vr) {
|
|
354
|
-
if (obj[key].Value.length === 1 && obj[key].Value[0].BulkDataURI) {
|
|
355
|
-
default_src.dicomWebUtils.fixBulkDataURI(obj[key].Value[0], options, options.dataSourceConfig);
|
|
356
|
-
obj[key].BulkDataURI = obj[key].Value[0].BulkDataURI;
|
|
357
|
-
|
|
358
|
-
// prevent mixed-content blockage
|
|
359
|
-
if (window.location.protocol === 'https:' && obj[key].BulkDataURI.startsWith('http:')) {
|
|
360
|
-
obj[key].BulkDataURI = obj[key].BulkDataURI.replace('http:', 'https:');
|
|
361
|
-
}
|
|
362
|
-
delete obj[key].Value;
|
|
363
|
-
} else if (vrNumerics.includes(obj[key].vr)) {
|
|
364
|
-
obj[key].Value = obj[key].Value.map(v => +v);
|
|
365
|
-
} else {
|
|
366
|
-
obj[key].Value = obj[key].Value.map(entry => cleanDenaturalizedDataset(entry, options));
|
|
367
|
-
}
|
|
368
|
-
}
|
|
369
|
-
});
|
|
370
|
-
return obj;
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/DicomMicroscopyViewport.tsx
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
class DicomMicroscopyViewport extends react.Component {
|
|
383
|
-
constructor(props) {
|
|
384
|
-
super(props);
|
|
385
|
-
this.state = {
|
|
386
|
-
error: null,
|
|
387
|
-
isLoaded: false
|
|
388
|
-
};
|
|
389
|
-
this.microscopyService = void 0;
|
|
390
|
-
this.viewer = null;
|
|
391
|
-
// dicom-microscopy-viewer instance
|
|
392
|
-
this.managedViewer = null;
|
|
393
|
-
// managed wrapper of microscopy-dicom extension
|
|
394
|
-
this.container = /*#__PURE__*/react.createRef();
|
|
395
|
-
this.overlayElement = /*#__PURE__*/react.createRef();
|
|
396
|
-
this.setViewportActiveHandler = () => {
|
|
397
|
-
const {
|
|
398
|
-
setViewportActive,
|
|
399
|
-
viewportId,
|
|
400
|
-
activeViewportId
|
|
401
|
-
} = this.props;
|
|
402
|
-
if (viewportId !== activeViewportId) {
|
|
403
|
-
setViewportActive(viewportId);
|
|
404
|
-
}
|
|
405
|
-
};
|
|
406
|
-
const {
|
|
407
|
-
microscopyService
|
|
408
|
-
} = this.props.servicesManager.services;
|
|
409
|
-
this.microscopyService = microscopyService;
|
|
410
|
-
}
|
|
411
|
-
/**
|
|
412
|
-
* Need to return this as a function to prevent webpack from munging it.
|
|
413
|
-
*/
|
|
414
|
-
static getImportPath() {
|
|
415
|
-
return '/dicom-microscopy-viewer/dicomMicroscopyViewer.min.js';
|
|
416
|
-
}
|
|
417
|
-
|
|
418
|
-
/**
|
|
419
|
-
* Get the nearest ROI from the mouse click point
|
|
420
|
-
*
|
|
421
|
-
* @param event
|
|
422
|
-
* @param autoselect
|
|
423
|
-
* @returns
|
|
424
|
-
*/
|
|
425
|
-
getNearbyROI(event, autoselect = true) {
|
|
426
|
-
const symbols = Object.getOwnPropertySymbols(this.viewer);
|
|
427
|
-
const _drawingSource = symbols.find(p => p.description === 'drawingSource');
|
|
428
|
-
const _pyramid = symbols.find(p => p.description === 'pyramid');
|
|
429
|
-
const _map = symbols.find(p => p.description === 'map');
|
|
430
|
-
const _affine = symbols.find(p => p.description === 'affine');
|
|
431
|
-
const feature = this.viewer[_drawingSource].getClosestFeatureToCoordinate(this.viewer[_map].getEventCoordinate(event));
|
|
432
|
-
if (!feature) {
|
|
433
|
-
return null;
|
|
434
|
-
}
|
|
435
|
-
const roiAnnotation = this.viewer._getROIFromFeature(feature, this.viewer[_pyramid].metadata, this.viewer[_affine]);
|
|
436
|
-
if (roiAnnotation && autoselect) {
|
|
437
|
-
this.microscopyService.selectAnnotation(roiAnnotation);
|
|
438
|
-
}
|
|
439
|
-
return roiAnnotation;
|
|
440
|
-
}
|
|
441
|
-
|
|
442
|
-
// install the microscopy renderer into the web page.
|
|
443
|
-
// you should only do this once.
|
|
444
|
-
async installOpenLayersRenderer(container, displaySet) {
|
|
445
|
-
const loadViewer = async metadata => {
|
|
446
|
-
await import( /* webpackIgnore: true */DicomMicroscopyViewport.getImportPath());
|
|
447
|
-
const {
|
|
448
|
-
viewer: DicomMicroscopyViewer,
|
|
449
|
-
metadata: metadataUtils
|
|
450
|
-
} = window.dicomMicroscopyViewer;
|
|
451
|
-
const microscopyViewer = DicomMicroscopyViewer.VolumeImageViewer;
|
|
452
|
-
const client = getDicomWebClient({
|
|
453
|
-
extensionManager: this.props.extensionManager,
|
|
454
|
-
servicesManager: this.props.servicesManager
|
|
455
|
-
});
|
|
456
|
-
|
|
457
|
-
// Parse, format, and filter metadata
|
|
458
|
-
const volumeImages = [];
|
|
459
|
-
|
|
460
|
-
/**
|
|
461
|
-
* This block of code is the original way of loading DICOM into dicom-microscopy-viewer
|
|
462
|
-
* as in their documentation.
|
|
463
|
-
* But we have the metadata already loaded by our loaders.
|
|
464
|
-
* As the metadata for microscopy DIOM files tends to be big and we don't
|
|
465
|
-
* want to double load it, below we have the mechanism to reconstruct the
|
|
466
|
-
* DICOM JSON structure (denaturalized) from naturalized metadata.
|
|
467
|
-
* (NOTE: Our loaders cache only naturalized metadata, not the denaturalized.)
|
|
468
|
-
*/
|
|
469
|
-
// {
|
|
470
|
-
// const retrieveOptions = {
|
|
471
|
-
// studyInstanceUID: metadata[0].StudyInstanceUID,
|
|
472
|
-
// seriesInstanceUID: metadata[0].SeriesInstanceUID,
|
|
473
|
-
// };
|
|
474
|
-
// metadata = await client.retrieveSeriesMetadata(retrieveOptions);
|
|
475
|
-
// // Parse, format, and filter metadata
|
|
476
|
-
// metadata.forEach(m => {
|
|
477
|
-
// if (
|
|
478
|
-
// volumeImages.length > 0 &&
|
|
479
|
-
// m['00200052'].Value[0] != volumeImages[0].FrameOfReferenceUID
|
|
480
|
-
// ) {
|
|
481
|
-
// console.warn(
|
|
482
|
-
// 'Expected FrameOfReferenceUID of difference instances within a series to be the same, found multiple different values',
|
|
483
|
-
// m['00200052'].Value[0]
|
|
484
|
-
// );
|
|
485
|
-
// m['00200052'].Value[0] = volumeImages[0].FrameOfReferenceUID;
|
|
486
|
-
// }
|
|
487
|
-
// NOTE: depending on different data source, image.ImageType sometimes
|
|
488
|
-
// is a string, not a string array.
|
|
489
|
-
// m['00080008'] = transformImageTypeUnnaturalized(m['00080008']);
|
|
490
|
-
|
|
491
|
-
// const image = new metadataUtils.VLWholeSlideMicroscopyImage({
|
|
492
|
-
// metadata: m,
|
|
493
|
-
// });
|
|
494
|
-
// const imageFlavor = image.ImageType[2];
|
|
495
|
-
// if (imageFlavor === 'VOLUME' || imageFlavor === 'THUMBNAIL') {
|
|
496
|
-
// volumeImages.push(image);
|
|
497
|
-
// }
|
|
498
|
-
// });
|
|
499
|
-
// }
|
|
500
|
-
|
|
501
|
-
metadata.forEach(m => {
|
|
502
|
-
// NOTE: depending on different data source, image.ImageType sometimes
|
|
503
|
-
// is a string, not a string array.
|
|
504
|
-
m.ImageType = typeof m.ImageType === 'string' ? m.ImageType.split('\\') : m.ImageType;
|
|
505
|
-
const inst = cleanDenaturalizedDataset(dcmjs_es["default"].data.DicomMetaDictionary.denaturalizeDataset(m), {
|
|
506
|
-
StudyInstanceUID: m.StudyInstanceUID,
|
|
507
|
-
SeriesInstanceUID: m.SeriesInstanceUID,
|
|
508
|
-
dataSourceConfig: this.props.dataSource.getConfig()
|
|
509
|
-
});
|
|
510
|
-
if (!inst['00480105']) {
|
|
511
|
-
// Optical Path Sequence, no OpticalPathIdentifier?
|
|
512
|
-
// NOTE: this is actually a not-well formatted DICOM VL Whole Slide Microscopy Image.
|
|
513
|
-
inst['00480105'] = {
|
|
514
|
-
vr: 'SQ',
|
|
515
|
-
Value: [{
|
|
516
|
-
'00480106': {
|
|
517
|
-
vr: 'SH',
|
|
518
|
-
Value: ['1']
|
|
519
|
-
}
|
|
520
|
-
}]
|
|
521
|
-
};
|
|
522
|
-
}
|
|
523
|
-
const image = new metadataUtils.VLWholeSlideMicroscopyImage({
|
|
524
|
-
metadata: inst
|
|
525
|
-
});
|
|
526
|
-
const imageFlavor = image.ImageType[2];
|
|
527
|
-
if (imageFlavor === 'VOLUME' || imageFlavor === 'THUMBNAIL') {
|
|
528
|
-
volumeImages.push(image);
|
|
529
|
-
}
|
|
530
|
-
});
|
|
531
|
-
|
|
532
|
-
// format metadata for microscopy-viewer
|
|
533
|
-
const options = {
|
|
534
|
-
client,
|
|
535
|
-
metadata: volumeImages,
|
|
536
|
-
retrieveRendered: false,
|
|
537
|
-
controls: ['overview', 'position']
|
|
538
|
-
};
|
|
539
|
-
this.viewer = new microscopyViewer(options);
|
|
540
|
-
if (this.overlayElement && this.overlayElement.current && this.viewer.addViewportOverlay) {
|
|
541
|
-
this.viewer.addViewportOverlay({
|
|
542
|
-
element: this.overlayElement.current,
|
|
543
|
-
coordinates: [0, 0],
|
|
544
|
-
// TODO: dicom-microscopy-viewer documentation says this can be false to be automatically, but it is not.
|
|
545
|
-
navigate: true,
|
|
546
|
-
className: 'OpenLayersOverlay'
|
|
547
|
-
});
|
|
548
|
-
}
|
|
549
|
-
this.viewer.render({
|
|
550
|
-
container
|
|
551
|
-
});
|
|
552
|
-
const {
|
|
553
|
-
StudyInstanceUID,
|
|
554
|
-
SeriesInstanceUID
|
|
555
|
-
} = displaySet;
|
|
556
|
-
this.managedViewer = this.microscopyService.addViewer(this.viewer, this.props.viewportId, container, StudyInstanceUID, SeriesInstanceUID);
|
|
557
|
-
this.managedViewer.addContextMenuCallback(event => {
|
|
558
|
-
// TODO: refactor this after Bill's changes on ContextMenu feature get merged
|
|
559
|
-
// const roiAnnotationNearBy = this.getNearbyROI(event);
|
|
560
|
-
});
|
|
561
|
-
};
|
|
562
|
-
this.microscopyService.clearAnnotations();
|
|
563
|
-
let smDisplaySet = displaySet;
|
|
564
|
-
if (displaySet.Modality === 'SR') {
|
|
565
|
-
// for SR displaySet, let's load the actual image displaySet
|
|
566
|
-
smDisplaySet = displaySet.getSourceDisplaySet();
|
|
567
|
-
}
|
|
568
|
-
console.log('Loading viewer metadata', smDisplaySet);
|
|
569
|
-
await loadViewer(smDisplaySet.others);
|
|
570
|
-
if (displaySet.Modality === 'SR') {
|
|
571
|
-
displaySet.load(smDisplaySet);
|
|
572
|
-
}
|
|
573
|
-
}
|
|
574
|
-
componentDidMount() {
|
|
575
|
-
const {
|
|
576
|
-
displaySets,
|
|
577
|
-
viewportOptions
|
|
578
|
-
} = this.props;
|
|
579
|
-
// Todo-rename: this is always getting the 0
|
|
580
|
-
const displaySet = displaySets[0];
|
|
581
|
-
this.installOpenLayersRenderer(this.container.current, displaySet).then(() => {
|
|
582
|
-
this.setState({
|
|
583
|
-
isLoaded: true
|
|
584
|
-
});
|
|
585
|
-
});
|
|
586
|
-
}
|
|
587
|
-
componentDidUpdate(prevProps, prevState, snapshot) {
|
|
588
|
-
if (this.managedViewer && prevProps.displaySets !== this.props.displaySets) {
|
|
589
|
-
const {
|
|
590
|
-
displaySets
|
|
591
|
-
} = this.props;
|
|
592
|
-
const displaySet = displaySets[0];
|
|
593
|
-
this.microscopyService.clearAnnotations();
|
|
594
|
-
|
|
595
|
-
// loading SR
|
|
596
|
-
if (displaySet.Modality === 'SR') {
|
|
597
|
-
const referencedDisplaySet = displaySet.getSourceDisplaySet();
|
|
598
|
-
displaySet.load(referencedDisplaySet);
|
|
599
|
-
}
|
|
600
|
-
}
|
|
601
|
-
}
|
|
602
|
-
componentWillUnmount() {
|
|
603
|
-
this.microscopyService.removeViewer(this.viewer);
|
|
604
|
-
}
|
|
605
|
-
render() {
|
|
606
|
-
const style = {
|
|
607
|
-
width: '100%',
|
|
608
|
-
height: '100%'
|
|
609
|
-
};
|
|
610
|
-
const displaySet = this.props.displaySets[0];
|
|
611
|
-
const firstInstance = displaySet.firstInstance || displaySet.instance;
|
|
612
|
-
return /*#__PURE__*/react.createElement("div", {
|
|
613
|
-
className: 'DicomMicroscopyViewer',
|
|
614
|
-
style: style,
|
|
615
|
-
onClick: this.setViewportActiveHandler
|
|
616
|
-
}, /*#__PURE__*/react.createElement("div", {
|
|
617
|
-
style: {
|
|
618
|
-
...style,
|
|
619
|
-
display: 'none'
|
|
620
|
-
}
|
|
621
|
-
}, /*#__PURE__*/react.createElement("div", {
|
|
622
|
-
style: {
|
|
623
|
-
...style
|
|
624
|
-
},
|
|
625
|
-
ref: this.overlayElement
|
|
626
|
-
}, /*#__PURE__*/react.createElement("div", {
|
|
627
|
-
style: {
|
|
628
|
-
position: 'relative',
|
|
629
|
-
height: '100%',
|
|
630
|
-
width: '100%'
|
|
631
|
-
}
|
|
632
|
-
}, displaySet && firstInstance.imageId && /*#__PURE__*/react.createElement(ViewportOverlay, {
|
|
633
|
-
displaySet: displaySet,
|
|
634
|
-
instance: displaySet.instance,
|
|
635
|
-
metadata: displaySet.metadata
|
|
636
|
-
})))), this.state.error ? /*#__PURE__*/react.createElement("h2", null, JSON.stringify(this.state.error)) : /*#__PURE__*/react.createElement("div", {
|
|
637
|
-
style: style,
|
|
638
|
-
ref: ref => {
|
|
639
|
-
this.container.current = ref;
|
|
640
|
-
this.props.resizeRef.current = ref;
|
|
641
|
-
}
|
|
642
|
-
}), this.state.isLoaded ? null : /*#__PURE__*/react.createElement(src/* LoadingIndicatorProgress */.LE, {
|
|
643
|
-
className: 'h-full w-full bg-black'
|
|
644
|
-
}));
|
|
645
|
-
}
|
|
646
|
-
}
|
|
647
|
-
DicomMicroscopyViewport.propTypes = {
|
|
648
|
-
viewportData: (prop_types_default()).object,
|
|
649
|
-
activeViewportId: (prop_types_default()).string,
|
|
650
|
-
setViewportActive: (prop_types_default()).func,
|
|
651
|
-
// props from OHIF Viewport Grid
|
|
652
|
-
displaySets: (prop_types_default()).array,
|
|
653
|
-
viewportId: (prop_types_default()).string,
|
|
654
|
-
viewportLabel: (prop_types_default()).string,
|
|
655
|
-
dataSource: (prop_types_default()).object,
|
|
656
|
-
viewportOptions: (prop_types_default()).object,
|
|
657
|
-
displaySetOptions: (prop_types_default()).array,
|
|
658
|
-
// other props from wrapping component
|
|
659
|
-
servicesManager: (prop_types_default()).object,
|
|
660
|
-
extensionManager: (prop_types_default()).object,
|
|
661
|
-
commandsManager: (prop_types_default()).object,
|
|
662
|
-
resizeRef: prop_types_default().oneOfType([(prop_types_default()).func, prop_types_default().shape({
|
|
663
|
-
current: (prop_types_default()).any
|
|
664
|
-
})])
|
|
665
|
-
};
|
|
666
|
-
/* harmony default export */ const src_DicomMicroscopyViewport = (DicomMicroscopyViewport);
|
|
667
|
-
|
|
668
|
-
/***/ }),
|
|
2
|
+
(globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[65],{
|
|
669
3
|
|
|
670
4
|
/***/ 82065:
|
|
671
5
|
/***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
|
|
@@ -1453,7 +787,10 @@ const MicroscopyService_EVENTS = {
|
|
|
1453
787
|
* ROI annotations relevant to the application
|
|
1454
788
|
*/
|
|
1455
789
|
class MicroscopyService extends core_src/* PubSubService */.hC {
|
|
1456
|
-
constructor(
|
|
790
|
+
constructor({
|
|
791
|
+
servicesManager,
|
|
792
|
+
extensionManager
|
|
793
|
+
}) {
|
|
1457
794
|
super(MicroscopyService_EVENTS);
|
|
1458
795
|
this.servicesManager = void 0;
|
|
1459
796
|
this.managedViewers = new Set();
|
|
@@ -1462,6 +799,7 @@ class MicroscopyService extends core_src/* PubSubService */.hC {
|
|
|
1462
799
|
this.selectedAnnotation = null;
|
|
1463
800
|
this.pendingFocus = false;
|
|
1464
801
|
this.servicesManager = servicesManager;
|
|
802
|
+
this.peerImport = extensionManager.appConfig.peerImport;
|
|
1465
803
|
this._onRoiAdded = this._onRoiAdded.bind(this);
|
|
1466
804
|
this._onRoiModified = this._onRoiModified.bind(this);
|
|
1467
805
|
this._onRoiRemoved = this._onRoiRemoved.bind(this);
|
|
@@ -1489,6 +827,9 @@ class MicroscopyService extends core_src/* PubSubService */.hC {
|
|
|
1489
827
|
this.removeAnnotation(this.annotations[uid]);
|
|
1490
828
|
});
|
|
1491
829
|
}
|
|
830
|
+
importDicomMicroscopyViewer() {
|
|
831
|
+
return this.peerImport("dicom-microscopy-viewer");
|
|
832
|
+
}
|
|
1492
833
|
|
|
1493
834
|
/**
|
|
1494
835
|
* Observes when a ROI graphic is added, creating the correspondent annotation
|
|
@@ -2030,10 +1371,8 @@ MicroscopyService.REGISTRATION = servicesManager => {
|
|
|
2030
1371
|
return {
|
|
2031
1372
|
name: 'microscopyService',
|
|
2032
1373
|
altName: 'MicroscopyService',
|
|
2033
|
-
create:
|
|
2034
|
-
|
|
2035
|
-
}) => {
|
|
2036
|
-
return new _MicroscopyService(servicesManager);
|
|
1374
|
+
create: props => {
|
|
1375
|
+
return new _MicroscopyService(props);
|
|
2037
1376
|
}
|
|
2038
1377
|
};
|
|
2039
1378
|
};
|
|
@@ -2971,13 +2310,10 @@ const DCM_CODE_VALUES = {
|
|
|
2971
2310
|
function toArray(item) {
|
|
2972
2311
|
return Array.isArray(item) ? item : [item];
|
|
2973
2312
|
}
|
|
2974
|
-
// EXTERNAL MODULE: ../../../extensions/dicom-microscopy/src/DicomMicroscopyViewport.tsx + 7 modules
|
|
2975
|
-
var DicomMicroscopyViewport = __webpack_require__(3094);
|
|
2976
2313
|
;// CONCATENATED MODULE: ../../../extensions/dicom-microscopy/src/utils/loadSR.ts
|
|
2977
2314
|
|
|
2978
2315
|
|
|
2979
2316
|
|
|
2980
|
-
|
|
2981
2317
|
const MeasurementReport = dcmjs_es["default"].adapters.DICOMMicroscopyViewer.MeasurementReport;
|
|
2982
2318
|
|
|
2983
2319
|
// Define as async so that it returns a promise, expected by the ViewportGrid
|
|
@@ -2995,7 +2331,7 @@ async function loadSR(microscopyService, microscopySRDisplaySet, referencedDispl
|
|
|
2995
2331
|
const {
|
|
2996
2332
|
rois,
|
|
2997
2333
|
labels
|
|
2998
|
-
} = await _getROIsFromToolState(naturalizedDataset, FrameOfReferenceUID);
|
|
2334
|
+
} = await _getROIsFromToolState(microscopyService, naturalizedDataset, FrameOfReferenceUID);
|
|
2999
2335
|
const managedViewer = managedViewers[0];
|
|
3000
2336
|
for (let i = 0; i < rois.length; i++) {
|
|
3001
2337
|
// NOTE: When saving Microscopy SR, we are attaching identifier property
|
|
@@ -3012,12 +2348,11 @@ async function loadSR(microscopyService, microscopySRDisplaySet, referencedDispl
|
|
|
3012
2348
|
managedViewer.addRoiGraphicWithLabel(roi, labels[i]);
|
|
3013
2349
|
}
|
|
3014
2350
|
}
|
|
3015
|
-
async function _getROIsFromToolState(naturalizedDataset, FrameOfReferenceUID) {
|
|
2351
|
+
async function _getROIsFromToolState(microscopyService, naturalizedDataset, FrameOfReferenceUID) {
|
|
3016
2352
|
const toolState = MeasurementReport.generateToolState(naturalizedDataset);
|
|
3017
2353
|
const tools = Object.getOwnPropertyNames(toolState);
|
|
3018
2354
|
// Does a dynamic import to prevent webpack from rebuilding the library
|
|
3019
|
-
|
|
3020
|
-
const DICOMMicroscopyViewer = window.dicomMicroscopyViewer;
|
|
2355
|
+
const DICOMMicroscopyViewer = await microscopyService.importDicomMicroscopyViewer();
|
|
3021
2356
|
const measurementGroupContentItems = _getMeasurementGroups(naturalizedDataset);
|
|
3022
2357
|
const rois = [];
|
|
3023
2358
|
const labels = [];
|
|
@@ -3263,7 +2598,7 @@ function _extends() { return _extends = Object.assign ? Object.assign.bind() : f
|
|
|
3263
2598
|
|
|
3264
2599
|
|
|
3265
2600
|
const Component = /*#__PURE__*/react.lazy(() => {
|
|
3266
|
-
return Promise.
|
|
2601
|
+
return Promise.all(/* import() */[__webpack_require__.e(904), __webpack_require__.e(818), __webpack_require__.e(497), __webpack_require__.e(993), __webpack_require__.e(604), __webpack_require__.e(417), __webpack_require__.e(281), __webpack_require__.e(424)]).then(__webpack_require__.bind(__webpack_require__, 3094));
|
|
3267
2602
|
});
|
|
3268
2603
|
const MicroscopyViewport = props => {
|
|
3269
2604
|
return /*#__PURE__*/react.createElement(react.Suspense, {
|