@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.
Files changed (41) hide show
  1. package/dist/{29.bundle.976319462f33868497c2.js → 117.bundle.403581eea72534ff9c7e.js} +1765 -582
  2. package/dist/{169.bundle.483057ed84ca3e92513a.js → 169.bundle.d28df3cf2d600fc3e146.js} +7 -5
  3. package/dist/{210.bundle.368d53177dc659dc6af0.js → 210.bundle.ea52c75bb27ab002dc4d.js} +2 -2
  4. package/dist/{281.bundle.49da07d997da7cc01705.js → 281.bundle.719e9e222fecb4e9e9c6.js} +18 -4
  5. package/dist/{360.bundle.2c117803c05f0bc31424.js → 360.bundle.9a0c682beae1ef7e40b1.js} +5 -5
  6. package/dist/{372.bundle.d97377781382080306bd.js → 372.bundle.9891a9938b28db4b36ce.js} +5 -4
  7. package/dist/424.bundle.1caecbb1bbefc271b621.js +663 -0
  8. package/dist/{497.bundle.ee102d6243f984113f08.js → 497.bundle.bbc07cef12d598653a65.js} +149 -117
  9. package/dist/{498.bundle.bb47c493dd02451f77ef.js → 498.bundle.e5ccb2bc38e4bfdd564b.js} +1 -1
  10. package/dist/{516.bundle.d777e4126814a5a47117.js → 516.bundle.e59c26f055d145ce835e.js} +47 -12
  11. package/dist/{196.bundle.cf8c2311aafb5312bbf7.js → 579.bundle.0b78fc095924efac431d.js} +1705 -493
  12. package/dist/{552.bundle.85aaefb5e22d6d1bffa9.js → 65.bundle.d15cc84a0b991e182649.js} +15 -680
  13. package/dist/{129.bundle.3102eccbd5c78524c3dd.js → 650.bundle.a65389abf76ad921aa17.js} +2671 -2975
  14. package/dist/{793.bundle.c92f52ddff0e3bf506e6.js → 793.bundle.e4c759b5cdfcc3c7494f.js} +2 -2
  15. package/dist/{818.bundle.cda4e369fdee5459a544.js → 818.bundle.b64fae7e982e16a82ca2.js} +133 -69
  16. package/dist/{842.bundle.a5533bc77e6f57b0ee30.js → 842.bundle.cccbb7e3611e3d220f07.js} +2 -2
  17. package/dist/{888.bundle.7ff5dfd3c14072cee2a9.js → 888.bundle.d3b2a82cb17155725342.js} +9 -3
  18. package/dist/{428.bundle.744fc5865b2d747de88a.js → 904.bundle.008f8a2095669f4eabba.js} +88 -50
  19. package/dist/{962.bundle.d5f55c85407221bbce7b.js → 962.bundle.868b30361a52b0ffa504.js} +2 -2
  20. package/dist/{993.bundle.aa31ebda5a5f62c44de5.js → 993.bundle.302a286ebb6e3fc0c35a.js} +1265 -485
  21. package/dist/{994.bundle.c4709bfb7fd9dcde0551.js → 994.bundle.3b5f396b62cce2990c03.js} +15 -1
  22. package/dist/{app.bundle.a69624a3e0becd131c65.js → app.bundle.14f126e3ec4491bb1948.js} +1393 -1321
  23. package/dist/app.bundle.css +2 -2
  24. package/dist/dicom-microscopy-viewer/dicomMicroscopyViewer.min.js.map +1 -0
  25. package/dist/{histogram-worker.bundle.e7e9fea2c3236b0e747a.js → histogram-worker.bundle.89729ccb99d170ff2f2f.js} +2 -1
  26. package/dist/index.html +3 -1
  27. package/dist/{polySeg.bundle.b25c61224998018d0f79.js → polySeg.bundle.d8943427beee7694621a.js} +3 -22
  28. package/dist/{suv-peak-worker.bundle.eb11e71db02e52601ecf.js → suv-peak-worker.bundle.15dcb8d1ab8e0528bfd9.js} +3 -22
  29. package/dist/sw.js +1 -1
  30. package/package.json +18 -18
  31. /package/dist/{153.bundle.62dad8e9c7532474e95c.js → 153.bundle.42a66f99ced5972aa0c0.js} +0 -0
  32. /package/dist/{202.bundle.bb0e8196739bb896dc9e.js → 202.bundle.f6d9ca4b1c16b1aa227f.js} +0 -0
  33. /package/dist/{246.bundle.27aca95ea22cd5fcd414.js → 246.bundle.912e9f8342cd5d6228e6.js} +0 -0
  34. /package/dist/{353.bundle.a741604612f3f1d18398.js → 353.bundle.5b11e6b395c5d5cc33bf.js} +0 -0
  35. /package/dist/{376.bundle.2657056d8bc2b11fb0e8.js → 376.bundle.ac0e23dc830cd982fd18.js} +0 -0
  36. /package/dist/{552.css → 424.css} +0 -0
  37. /package/dist/{502.bundle.e7e6c345146aef00a169.js → 502.bundle.823682db96d52df1b8cf.js} +0 -0
  38. /package/dist/{591.bundle.aa91409b528ae6b601e0.js → 591.bundle.39fa1e6e7285929f2e29.js} +0 -0
  39. /package/dist/{791.bundle.d614182fa975e92cf4f5.js → 791.bundle.ecf9b1f8892d5f8962a3.js} +0 -0
  40. /package/dist/{944.bundle.c2bcb49d5077bd6fcc87.js → 944.bundle.93eddec203a43754e826.js} +0 -0
  41. /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([[552,757],{
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(servicesManager) {
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
- configuration = {}
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
- await import( /* webpackIgnore: true */DicomMicroscopyViewport["default"].getImportPath());
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.resolve(/* import() */).then(__webpack_require__.bind(__webpack_require__, 3094));
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, {