@ohif/app 3.8.0-beta.43 → 3.8.0-beta.45

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 (21) hide show
  1. package/dist/{738.bundle.f5179d74c16cb154c759.js → 738.bundle.5842b81d54371825d781.js} +148 -50
  2. package/dist/{app.bundle.ab96a3986fbf883f78ea.js → app.bundle.67bbe7910a730e982a28.js} +91 -37
  3. package/dist/index.html +1 -1
  4. package/dist/sw.js +1 -1
  5. package/package.json +17 -17
  6. /package/dist/{12.bundle.e97b1190673797a03d1a.js → 12.bundle.40a66318189b9d077880.js} +0 -0
  7. /package/dist/{170.bundle.5632b1b6fab9906388e2.js → 170.bundle.83a5019554b04230cda3.js} +0 -0
  8. /package/dist/{185.bundle.6311718cd457884f813a.js → 185.bundle.02ded91a2ed1cc51df6c.js} +0 -0
  9. /package/dist/{19.bundle.2fa92040006123dc9251.js → 19.bundle.5deb3e67de1c828ce247.js} +0 -0
  10. /package/dist/{199.bundle.8a5e36ae7e18dd2de580.js → 199.bundle.9a12097c2666e0132afa.js} +0 -0
  11. /package/dist/{281.bundle.5eddac45a51ce75f55c4.js → 281.bundle.bb71140105c7a024252b.js} +0 -0
  12. /package/dist/{359.bundle.bb663da51cbd0b8d1eff.js → 359.bundle.b0606bd7dac37d4e1538.js} +0 -0
  13. /package/dist/{410.bundle.bd04d9a698385a43f682.js → 410.bundle.bb49d9044c24ae92517e.js} +0 -0
  14. /package/dist/{456.bundle.00c2bac49511bea54b5c.js → 456.bundle.9deaf3d7218e5daf29ed.js} +0 -0
  15. /package/dist/{466.bundle.8cdd9c3bcc81fe4cb8c6.js → 466.bundle.93a5c6c1911033287d0a.js} +0 -0
  16. /package/dist/{483.bundle.7a8402a110f9f42fdc94.js → 483.bundle.964610a9035ad21ba49e.js} +0 -0
  17. /package/dist/{506.bundle.4bcf51e2946dab485d2b.js → 506.bundle.bcb1411e2b52140dd368.js} +0 -0
  18. /package/dist/{613.bundle.a54c8cdf616a799bcf4b.js → 613.bundle.e161ed4732180b99b014.js} +0 -0
  19. /package/dist/{687.bundle.e798aa93251dc9bc87ef.js → 687.bundle.35d354a804ed3351f2b0.js} +0 -0
  20. /package/dist/{814.bundle.198efdffbe64f60e38ef.js → 814.bundle.611a6ebcf4df4ab71d06.js} +0 -0
  21. /package/dist/{965.bundle.254019aafbf9c9d3d800.js → 965.bundle.06d53a7fc8a88702b7f2.js} +0 -0
@@ -393,10 +393,11 @@ class RetrieveMetadataLoader {
393
393
  * @param {Object} client The dicomweb-client.
394
394
  * @param {Array} studyInstanceUID Study instance ui to be retrieved
395
395
  * @param {Object} [filters] - Object containing filters to be applied on retrieve metadata process
396
- * @param {string} [filter.seriesInstanceUID] - series instance uid to filter results against
397
- * @param {Function} [sortSeries] - Custom sort function for series
396
+ * @param {string} [filters.seriesInstanceUID] - series instance uid to filter results against
397
+ * @param {Object} [sortCriteria] - Custom sort criteria used for series
398
+ * @param {Function} [sortFunction] - Custom sort function for series
398
399
  */
399
- constructor(client, studyInstanceUID, filters = {}, sortCriteria, sortFunction) {
400
+ constructor(client, studyInstanceUID, filters = {}, sortCriteria = undefined, sortFunction = undefined) {
400
401
  this.client = client;
401
402
  this.studyInstanceUID = studyInstanceUID;
402
403
  this.filters = filters;
@@ -417,13 +418,9 @@ class RetrieveMetadataLoader {
417
418
  async runLoaders(loaders) {
418
419
  let result;
419
420
  for (const loader of loaders) {
420
- try {
421
- result = await loader();
422
- if (result && result.length) {
423
- break; // closes iterator in case data is retrieved successfully
424
- }
425
- } catch (e) {
426
- throw e;
421
+ result = await loader();
422
+ if (result && result.length) {
423
+ break; // closes iterator in case data is retrieved successfully
427
424
  }
428
425
  }
429
426
  if (loaders.next().done && !result) {
@@ -506,6 +503,57 @@ class RetrieveMetadataLoaderSync extends RetrieveMetadataLoader {
506
503
 
507
504
 
508
505
 
506
+ // Series Date, Series Time, Series Description and Series Number to be included
507
+ // in the series metadata query result
508
+ const includeField = ['00080021', '00080031', '0008103E', '00200011'].join(',');
509
+ class DeferredPromise {
510
+ constructor() {
511
+ this.metadata = undefined;
512
+ this.processFunction = undefined;
513
+ this.internalPromise = undefined;
514
+ this.thenFunction = undefined;
515
+ this.rejectFunction = undefined;
516
+ }
517
+ setMetadata(metadata) {
518
+ this.metadata = metadata;
519
+ }
520
+ setProcessFunction(func) {
521
+ this.processFunction = func;
522
+ }
523
+ getPromise() {
524
+ return this.start();
525
+ }
526
+ start() {
527
+ if (this.internalPromise) {
528
+ return this.internalPromise;
529
+ }
530
+ this.internalPromise = this.processFunction();
531
+ // in case then and reject functions called before start
532
+ if (this.thenFunction) {
533
+ this.then(this.thenFunction);
534
+ this.thenFunction = undefined;
535
+ }
536
+ if (this.rejectFunction) {
537
+ this.reject(this.rejectFunction);
538
+ this.rejectFunction = undefined;
539
+ }
540
+ return this.internalPromise;
541
+ }
542
+ then(func) {
543
+ if (this.internalPromise) {
544
+ return this.internalPromise.then(func);
545
+ } else {
546
+ this.thenFunction = func;
547
+ }
548
+ }
549
+ reject(func) {
550
+ if (this.internalPromise) {
551
+ return this.internalPromise.reject(func);
552
+ } else {
553
+ this.rejectFunction = func;
554
+ }
555
+ }
556
+ }
509
557
  /**
510
558
  * Creates an immutable series loader object which loads each series sequentially using the iterator interface.
511
559
  *
@@ -520,12 +568,20 @@ function makeSeriesAsyncLoader(client, studyInstanceUID, seriesInstanceUIDList)
520
568
  hasNext() {
521
569
  return seriesInstanceUIDList.length > 0;
522
570
  },
523
- async next() {
524
- const seriesInstanceUID = seriesInstanceUIDList.shift();
525
- return client.retrieveSeriesMetadata({
526
- studyInstanceUID,
527
- seriesInstanceUID
571
+ next() {
572
+ const {
573
+ seriesInstanceUID,
574
+ metadata
575
+ } = seriesInstanceUIDList.shift();
576
+ const promise = new DeferredPromise();
577
+ promise.setMetadata(metadata);
578
+ promise.setProcessFunction(() => {
579
+ return client.retrieveSeriesMetadata({
580
+ studyInstanceUID,
581
+ seriesInstanceUID
582
+ });
528
583
  });
584
+ return promise;
529
585
  }
530
586
  });
531
587
  }
@@ -549,19 +605,22 @@ class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader {
549
605
  } = {},
550
606
  client
551
607
  } = this;
608
+
609
+ // asking to include Series Date, Series Time, Series Description
610
+ // and Series Number in the series metadata returned to better sort series
611
+ // in preLoad function
612
+ let options = {
613
+ studyInstanceUID,
614
+ queryParams: {
615
+ includefield: includeField
616
+ }
617
+ };
552
618
  if (seriesInstanceUID) {
553
- const options = {
554
- studyInstanceUID,
555
- queryParams: {
556
- SeriesInstanceUID: seriesInstanceUID
557
- }
558
- };
619
+ options.queryParams.SeriesInstanceUID = seriesInstanceUID;
559
620
  preLoaders.push(client.searchForSeries.bind(client, options));
560
621
  }
561
622
  // Fallback preloader
562
- preLoaders.push(client.searchForSeries.bind(client, {
563
- studyInstanceUID
564
- }));
623
+ preLoaders.push(client.searchForSeries.bind(client, options));
565
624
  yield* preLoaders;
566
625
  }
567
626
  async preLoad() {
@@ -573,18 +632,24 @@ class RetrieveMetadataLoaderAsync extends RetrieveMetadataLoader {
573
632
  naturalizeDataset
574
633
  } = dcmjs_es["default"].data.DicomMetaDictionary;
575
634
  const naturalized = result.map(naturalizeDataset);
576
- return (0,sortStudy/* sortStudySeries */.IO)(naturalized, sortCriteria || sortStudy/* sortingCriteria */.S1.seriesSortCriteria.seriesInfoSortingCriteria, sortFunction);
635
+ return (0,sortStudy/* sortStudySeries */.IO)(naturalized, sortCriteria, sortFunction);
577
636
  }
578
637
  async load(preLoadData) {
579
638
  const {
580
639
  client,
581
640
  studyInstanceUID
582
641
  } = this;
583
- const seriesInstanceUIDs = preLoadData.map(s => s.SeriesInstanceUID);
642
+ const seriesInstanceUIDs = preLoadData.map(seriesMetadata => {
643
+ return {
644
+ seriesInstanceUID: seriesMetadata.SeriesInstanceUID,
645
+ metadata: seriesMetadata
646
+ };
647
+ });
584
648
  const seriesAsyncLoader = makeSeriesAsyncLoader(client, studyInstanceUID, seriesInstanceUIDs);
585
649
  const promises = [];
586
650
  while (seriesAsyncLoader.hasNext()) {
587
- promises.push(seriesAsyncLoader.next());
651
+ const promise = seriesAsyncLoader.next();
652
+ promises.push(promise);
588
653
  }
589
654
  return {
590
655
  preLoadData,
@@ -748,6 +813,7 @@ function deleteStudyMetadataPromise(StudyInstanceUID) {
748
813
  * performing searches doesn't work. This version fixes the query issue
749
814
  * by manually implementing a query option.
750
815
  */
816
+
751
817
  class StaticWadoClient extends dicomweb_client_es.api.DICOMwebClient {
752
818
  constructor(qidoConfig) {
753
819
  super(qidoConfig);
@@ -1060,17 +1126,35 @@ const EXPLICIT_VR_LITTLE_ENDIAN = '1.2.840.10008.1.2.1';
1060
1126
  const metadataProvider = src.classes.MetadataProvider;
1061
1127
 
1062
1128
  /**
1129
+ * Creates a DICOM Web API based on the provided configuration.
1063
1130
  *
1064
- * @param {string} name - Data source name
1065
- * @param {string} wadoUriRoot - Legacy? (potentially unused/replaced)
1066
- * @param {string} qidoRoot - Base URL to use for QIDO requests
1067
- * @param {string} wadoRoot - Base URL to use for WADO requests
1068
- * @param {boolean} qidoSupportsIncludeField - Whether QIDO supports the "Include" option to request additional fields in response
1069
- * @param {string} imageRengering - wadors | ? (unsure of where/how this is used)
1070
- * @param {string} thumbnailRendering - wadors | ? (unsure of where/how this is used)
1071
- * @param {bool} supportsReject - Whether the server supports reject calls (i.e. DCM4CHEE)
1072
- * @param {bool} lazyLoadStudy - "enableStudyLazyLoad"; Request series meta async instead of blocking
1073
- * @param {string|bool} singlepart - indicates of the retrieves can fetch singlepart. Options are bulkdata, video, image or boolean true
1131
+ * @param {object} dicomWebConfig - Configuration for the DICOM Web API
1132
+ * @param {string} dicomWebConfig.name - Data source name
1133
+ * @param {string} dicomWebConfig.wadoUriRoot - Legacy? (potentially unused/replaced)
1134
+ * @param {string} dicomWebConfig.qidoRoot - Base URL to use for QIDO requests
1135
+ * @param {string} dicomWebConfig.wadoRoot - Base URL to use for WADO requests
1136
+ * @param {string} dicomWebConfig.wadoUri - Base URL to use for WADO URI requests
1137
+ * @param {boolean} dicomWebConfig.qidoSupportsIncludeField - Whether QIDO supports the "Include" option to request additional fields in response
1138
+ * @param {string} dicomWebConfig.imageRendering - wadors | ? (unsure of where/how this is used)
1139
+ * @param {string} dicomWebConfig.thumbnailRendering - wadors | ? (unsure of where/how this is used)
1140
+ * @param {boolean} dicomWebConfig.supportsReject - Whether the server supports reject calls (i.e. DCM4CHEE)
1141
+ * @param {boolean} dicomWebConfig.lazyLoadStudy - "enableStudyLazyLoad"; Request series meta async instead of blocking
1142
+ * @param {string|boolean} dicomWebConfig.singlepart - indicates if the retrieves can fetch singlepart. Options are bulkdata, video, image, or boolean true
1143
+ * @param {string} dicomWebConfig.requestTransferSyntaxUID - Transfer syntax to request from the server
1144
+ * @param {object} dicomWebConfig.acceptHeader - Accept header to use for requests
1145
+ * @param {boolean} dicomWebConfig.omitQuotationForMultipartRequest - Whether to omit quotation marks for multipart requests
1146
+ * @param {boolean} dicomWebConfig.supportsFuzzyMatching - Whether the server supports fuzzy matching
1147
+ * @param {boolean} dicomWebConfig.supportsWildcard - Whether the server supports wildcard matching
1148
+ * @param {boolean} dicomWebConfig.supportsNativeDICOMModel - Whether the server supports the native DICOM model
1149
+ * @param {boolean} dicomWebConfig.enableStudyLazyLoad - Whether to enable study lazy loading
1150
+ * @param {boolean} dicomWebConfig.enableRequestTag - Whether to enable request tag
1151
+ * @param {boolean} dicomWebConfig.enableStudyLazyLoad - Whether to enable study lazy loading
1152
+ * @param {boolean} dicomWebConfig.bulkDataURI - Whether to enable bulkDataURI
1153
+ * @param {function} dicomWebConfig.onConfiguration - Function that is called after the configuration is initialized
1154
+ * @param {boolean} dicomWebConfig.staticWado - Whether to use the static WADO client
1155
+ * @param {object} userAuthenticationService - User authentication service
1156
+ * @param {object} userAuthenticationService.getAuthorizationHeader - Function that returns the authorization header
1157
+ * @returns {object} - DICOM Web API object
1074
1158
  */
1075
1159
  function createDicomWebApi(dicomWebConfig, servicesManager) {
1076
1160
  const {
@@ -1200,13 +1284,14 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
1200
1284
  filters,
1201
1285
  sortCriteria,
1202
1286
  sortFunction,
1203
- madeInClient = false
1287
+ madeInClient = false,
1288
+ returnPromises = false
1204
1289
  } = {}) => {
1205
1290
  if (!StudyInstanceUID) {
1206
1291
  throw new Error('Unable to query for SeriesMetadata without StudyInstanceUID');
1207
1292
  }
1208
1293
  if (dicomWebConfig.enableStudyLazyLoad) {
1209
- return implementation._retrieveSeriesMetadataAsync(StudyInstanceUID, filters, sortCriteria, sortFunction, madeInClient);
1294
+ return implementation._retrieveSeriesMetadataAsync(StudyInstanceUID, filters, sortCriteria, sortFunction, madeInClient, returnPromises);
1210
1295
  }
1211
1296
  return implementation._retrieveSeriesMetadataSync(StudyInstanceUID, filters, sortCriteria, sortFunction, madeInClient);
1212
1297
  }
@@ -1293,7 +1378,7 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
1293
1378
  Object.keys(instancesPerSeries).forEach(seriesInstanceUID => src.DicomMetadataStore.addInstances(instancesPerSeries[seriesInstanceUID], madeInClient));
1294
1379
  return seriesSummaryMetadata;
1295
1380
  },
1296
- _retrieveSeriesMetadataAsync: async (StudyInstanceUID, filters, sortCriteria, sortFunction, madeInClient = false) => {
1381
+ _retrieveSeriesMetadataAsync: async (StudyInstanceUID, filters, sortCriteria, sortFunction, madeInClient = false, returnPromises = false) => {
1297
1382
  const enableStudyLazyLoad = true;
1298
1383
  wadoDicomWebClient.headers = generateWadoHeader();
1299
1384
  // Get Series
@@ -1366,7 +1451,7 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
1366
1451
  const naturalizedInstances = instances.map(addRetrieveBulkData);
1367
1452
 
1368
1453
  // Adding instanceMetadata to OHIF MetadataProvider
1369
- naturalizedInstances.forEach((instance, index) => {
1454
+ naturalizedInstances.forEach(instance => {
1370
1455
  instance.wadoRoot = dicomWebConfig.wadoRoot;
1371
1456
  instance.wadoUri = dicomWebConfig.wadoUri;
1372
1457
  const imageId = implementation.getImageIdsForInstance({
@@ -1390,7 +1475,7 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
1390
1475
  src.DicomMetadataStore.addInstances(naturalizedInstances, madeInClient);
1391
1476
  }
1392
1477
  function setSuccessFlag() {
1393
- const study = src.DicomMetadataStore.getStudy(StudyInstanceUID, madeInClient);
1478
+ const study = src.DicomMetadataStore.getStudy(StudyInstanceUID);
1394
1479
  if (!study) {
1395
1480
  return;
1396
1481
  }
@@ -1403,11 +1488,21 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
1403
1488
  aSeries.StudyInstanceUID = StudyInstanceUID;
1404
1489
  });
1405
1490
  src.DicomMetadataStore.addSeriesMetadata(seriesSummaryMetadata, madeInClient);
1406
- const seriesDeliveredPromises = seriesPromises.map(promise => promise.then(instances => {
1407
- storeInstances(instances);
1408
- }));
1409
- await Promise.all(seriesDeliveredPromises);
1410
- setSuccessFlag();
1491
+ const seriesDeliveredPromises = seriesPromises.map(promise => {
1492
+ if (!returnPromises) {
1493
+ promise?.start();
1494
+ }
1495
+ return promise.then(instances => {
1496
+ storeInstances(instances);
1497
+ });
1498
+ });
1499
+ if (returnPromises) {
1500
+ Promise.all(seriesDeliveredPromises).then(() => setSuccessFlag());
1501
+ return seriesPromises;
1502
+ } else {
1503
+ await Promise.all(seriesDeliveredPromises);
1504
+ setSuccessFlag();
1505
+ }
1411
1506
  return seriesSummaryMetadata;
1412
1507
  },
1413
1508
  deleteStudyMetadataPromise: deleteStudyMetadataPromise,
@@ -1438,7 +1533,7 @@ function createDicomWebApi(dicomWebConfig, servicesManager) {
1438
1533
  },
1439
1534
  getImageIdsForInstance({
1440
1535
  instance,
1441
- frame
1536
+ frame = undefined
1442
1537
  }) {
1443
1538
  const imageIds = getImageId({
1444
1539
  instance,
@@ -2475,8 +2570,8 @@ function ViewerHeader({
2475
2570
  hotkeyDefinitions,
2476
2571
  hotkeyDefaults
2477
2572
  } = hotkeysManager;
2478
- const versionNumber = "3.8.0-beta.43";
2479
- const commitHash = "b1efe40aa146e4052cc47b3f774cabbb47a8d1a6";
2573
+ const versionNumber = "3.8.0-beta.45";
2574
+ const commitHash = "0049f4c0303f0b6ea995972326fc8784259f5a47";
2480
2575
  const menuOptions = [{
2481
2576
  title: t('Header:About'),
2482
2577
  icon: 'info',
@@ -6748,6 +6843,9 @@ const defaultProtocol = {
6748
6843
  editableBy: {},
6749
6844
  protocolMatchingRules: [],
6750
6845
  toolGroupIds: ['default'],
6846
+ hpInitiationCriteria: {
6847
+ minSeriesLoaded: 1
6848
+ },
6751
6849
  // -1 would be used to indicate active only, whereas other values are
6752
6850
  // the number of required priors referenced - so 0 means active with
6753
6851
  // 0 or more priors.
@@ -987,8 +987,8 @@ function WorkList({
987
987
  };
988
988
  });
989
989
  const hasStudies = numOfStudies > 0;
990
- const versionNumber = "3.8.0-beta.43";
991
- const commitHash = "b1efe40aa146e4052cc47b3f774cabbb47a8d1a6";
990
+ const versionNumber = "3.8.0-beta.45";
991
+ const commitHash = "0049f4c0303f0b6ea995972326fc8784259f5a47";
992
992
  const menuOptions = [{
993
993
  title: t('Header:About'),
994
994
  icon: 'info',
@@ -2039,7 +2039,8 @@ function isSeriesFilterUsed(instances, filters) {
2039
2039
 
2040
2040
 
2041
2041
  const {
2042
- getSplitParam
2042
+ getSplitParam,
2043
+ sortingCriteria
2043
2044
  } = core_src.utils;
2044
2045
  const {
2045
2046
  TimingEnum: Mode_TimingEnum
@@ -2058,13 +2059,40 @@ function defaultRouteInit({
2058
2059
  servicesManager,
2059
2060
  studyInstanceUIDs,
2060
2061
  dataSource,
2061
- filters
2062
+ filters,
2063
+ appConfig
2062
2064
  }, hangingProtocolId) {
2063
2065
  const {
2064
2066
  displaySetService,
2065
2067
  hangingProtocolService,
2066
- uiNotificationService
2068
+ uiNotificationService,
2069
+ customizationService
2067
2070
  } = servicesManager.services;
2071
+ /**
2072
+ * Function to apply the hanging protocol when the minimum number of display sets were
2073
+ * received or all display sets retrieval were completed
2074
+ * @returns
2075
+ */
2076
+ function applyHangingProtocol() {
2077
+ const displaySets = displaySetService.getActiveDisplaySets();
2078
+ if (!displaySets || !displaySets.length) {
2079
+ return;
2080
+ }
2081
+
2082
+ // Gets the studies list to use
2083
+ const studies = studiesList(studyInstanceUIDs, displaySets);
2084
+
2085
+ // study being displayed, and is thus the "active" study.
2086
+ const activeStudy = studies[0];
2087
+
2088
+ // run the hanging protocol matching on the displaySets with the predefined
2089
+ // hanging protocol in the mode configuration
2090
+ hangingProtocolService.run({
2091
+ studies,
2092
+ activeStudy,
2093
+ displaySets
2094
+ }, hangingProtocolId);
2095
+ }
2068
2096
  const unsubscriptions = [];
2069
2097
  const issuedWarningSeries = [];
2070
2098
  const {
@@ -2095,7 +2123,9 @@ function defaultRouteInit({
2095
2123
  core_src/* log */.cM.time(Mode_TimingEnum.STUDY_TO_FIRST_IMAGE);
2096
2124
  const allRetrieves = studyInstanceUIDs.map(StudyInstanceUID => dataSource.retrieve.series.metadata({
2097
2125
  StudyInstanceUID,
2098
- filters
2126
+ filters,
2127
+ returnPromises: true,
2128
+ sortCriteria: customizationService.get('sortingCriteria') || sortingCriteria.seriesSortCriteria.seriesInfoSortingCriteria
2099
2129
  }));
2100
2130
 
2101
2131
  // log the error if this fails, otherwise it's so difficult to tell what went wrong...
@@ -2104,35 +2134,30 @@ function defaultRouteInit({
2104
2134
  console.error(error);
2105
2135
  });
2106
2136
  });
2107
-
2108
- // The hanging protocol matching service is fairly expensive to run multiple
2109
- // times, and doesn't allow partial matches to be made (it will simply fail
2110
- // to display anything if a required match fails), so we wait here until all metadata
2111
- // is retrieved (which will synchronously trigger the display set creation)
2112
- // until we run the hanging protocol matching service.
2113
-
2114
- Promise.allSettled(allRetrieves).then(() => {
2137
+ Promise.allSettled(allRetrieves).then(promises => {
2115
2138
  core_src/* log */.cM.timeEnd(Mode_TimingEnum.STUDY_TO_DISPLAY_SETS);
2116
2139
  core_src/* log */.cM.time(Mode_TimingEnum.DISPLAY_SETS_TO_FIRST_IMAGE);
2117
2140
  core_src/* log */.cM.time(Mode_TimingEnum.DISPLAY_SETS_TO_ALL_IMAGES);
2118
- const displaySets = displaySetService.getActiveDisplaySets();
2119
- if (!displaySets || !displaySets.length) {
2120
- return;
2121
- }
2122
-
2123
- // Gets the studies list to use
2124
- const studies = studiesList(studyInstanceUIDs, displaySets);
2125
-
2126
- // study being displayed, and is thus the "active" study.
2127
- const activeStudy = studies[0];
2128
-
2129
- // run the hanging protocol matching on the displaySets with the predefined
2130
- // hanging protocol in the mode configuration
2131
- hangingProtocolService.run({
2132
- studies,
2133
- activeStudy,
2134
- displaySets
2135
- }, hangingProtocolId);
2141
+ const allPromises = [];
2142
+ const remainingPromises = [];
2143
+ function startRemainingPromises(remainingPromises) {
2144
+ remainingPromises.forEach(p => p.forEach(p => p.start()));
2145
+ }
2146
+ promises.forEach(promise => {
2147
+ const retrieveSeriesMetadataPromise = promise.value;
2148
+ if (Array.isArray(retrieveSeriesMetadataPromise)) {
2149
+ const {
2150
+ requiredSeries,
2151
+ remaining
2152
+ } = hangingProtocolService.filterSeriesRequiredForRun(hangingProtocolId, retrieveSeriesMetadataPromise);
2153
+ const requiredSeriesPromises = requiredSeries.map(promise => promise.start());
2154
+ allPromises.push(Promise.allSettled(requiredSeriesPromises));
2155
+ remainingPromises.push(remaining);
2156
+ }
2157
+ });
2158
+ Promise.allSettled(allPromises).then(applyHangingProtocol);
2159
+ startRemainingPromises(remainingPromises);
2160
+ applyHangingProtocol();
2136
2161
  });
2137
2162
  return unsubscriptions;
2138
2163
  }
@@ -2408,7 +2433,8 @@ function ModeRoute({
2408
2433
  servicesManager,
2409
2434
  studyInstanceUIDs,
2410
2435
  dataSource,
2411
- filters
2436
+ filters,
2437
+ appConfig
2412
2438
  }, hangingProtocolIdToUse);
2413
2439
  };
2414
2440
  let unsubscriptions;
@@ -2458,7 +2484,8 @@ ModeRoute.propTypes = {
2458
2484
  dataSourceName: (prop_types_default()).string,
2459
2485
  extensionManager: (prop_types_default()).object,
2460
2486
  servicesManager: (prop_types_default()).object,
2461
- hotkeysManager: (prop_types_default()).object
2487
+ hotkeysManager: (prop_types_default()).object,
2488
+ commandsManager: (prop_types_default()).object
2462
2489
  };
2463
2490
  ;// CONCATENATED MODULE: ./routes/Mode/index.js
2464
2491
 
@@ -3964,7 +3991,9 @@ function formatPN(name) {
3964
3991
  return cleaned.trim();
3965
3992
  }
3966
3993
  ;// CONCATENATED MODULE: ../../core/src/utils/generateAcceptHeader.ts
3967
- const generateAcceptHeader = (configAcceptHeader = [], requestTransferSyntaxUID = null, omitQuotationForMultipartRequest = false) => {
3994
+ const generateAcceptHeader = (configAcceptHeader = [], requestTransferSyntaxUID = '*',
3995
+ //default to accept all transfer syntax
3996
+ omitQuotationForMultipartRequest = false) => {
3968
3997
  //if acceptedHeader is passed by config use it as it.
3969
3998
  if (configAcceptHeader.length > 0) {
3970
3999
  return configAcceptHeader;
@@ -3977,6 +4006,7 @@ const generateAcceptHeader = (configAcceptHeader = [], requestTransferSyntaxUID
3977
4006
  } else {
3978
4007
  acceptHeader.push('type=application/octet-stream');
3979
4008
  }
4009
+ acceptHeader.push('transfer-syntax=*');
3980
4010
  if (!omitQuotationForMultipartRequest) {
3981
4011
  //need to add quotation for each mime type of each accept entry
3982
4012
  acceptHeader = acceptHeader.map(mime => {
@@ -6427,7 +6457,7 @@ const detectionOptions = {
6427
6457
  }
6428
6458
  });
6429
6459
  ;// CONCATENATED MODULE: ../../i18n/package.json
6430
- const package_namespaceObject = JSON.parse('{"i8":"3.8.0-beta.42"}');
6460
+ const package_namespaceObject = JSON.parse('{"i8":"3.8.0-beta.44"}');
6431
6461
  ;// CONCATENATED MODULE: ../../i18n/src/utils.js
6432
6462
  const languagesMap = {
6433
6463
  ar: 'Arabic',
@@ -53227,6 +53257,30 @@ class HangingProtocolService extends pubSubServiceInterface/* PubSubService */.h
53227
53257
  };
53228
53258
  }
53229
53259
 
53260
+ /**
53261
+ * Filters the series required for running a hanging protocol.
53262
+ *
53263
+ * This can be extended in the future with more complex selection rules e.g.
53264
+ * N series of a given type, and M of a different type, such as all CT series,
53265
+ * and all SR, and then everything else.
53266
+ *
53267
+ * @param protocolId - The ID of the hanging protocol.
53268
+ * @param seriesPromises - An array of promises representing the series.
53269
+ * @returns An object containing the required series and the remaining series.
53270
+ */
53271
+ filterSeriesRequiredForRun(protocolId, seriesPromises) {
53272
+ if (Array.isArray(protocolId)) {
53273
+ protocolId = protocolId[0];
53274
+ }
53275
+ const minSeriesLoadedToRunHP = this.getProtocolById(protocolId)?.hpInitiationCriteria?.minSeriesLoaded || seriesPromises.length;
53276
+ const requiredSeries = seriesPromises.slice(0, minSeriesLoadedToRunHP);
53277
+ const remaining = seriesPromises.slice(minSeriesLoadedToRunHP);
53278
+ return {
53279
+ requiredSeries,
53280
+ remaining
53281
+ };
53282
+ }
53283
+
53230
53284
  /** Gets the protocol with id 'default' */
53231
53285
  getDefaultProtocol() {
53232
53286
  return this.getProtocolById('default');
@@ -282854,7 +282908,7 @@ var selectOrdinal = function selectOrdinal() {
282854
282908
  /******/ // This function allow to reference async chunks
282855
282909
  /******/ __webpack_require__.u = (chunkId) => {
282856
282910
  /******/ // return url for filenames based on template
282857
- /******/ return "" + (chunkId === 18 ? "dicom-microscopy-viewer" : chunkId) + ".bundle." + {"12":"e97b1190673797a03d1a","18":"a7d5060eead13771e784","19":"2fa92040006123dc9251","23":"9d989522a6e4fdcb9c72","95":"644c927d99988ff60b36","125":"df666cb677e5a8982157","170":"5632b1b6fab9906388e2","181":"a2d7b26d73467d2ce8cd","185":"6311718cd457884f813a","199":"8a5e36ae7e18dd2de580","202":"c7c412d83b745f890834","223":"d4ac6ef2cfe47a9c4afc","250":"96a47756a15efbdf78af","281":"5eddac45a51ce75f55c4","359":"bb663da51cbd0b8d1eff","410":"bd04d9a698385a43f682","417":"5c66801d23d0e98c00e6","451":"9b9abf9ca8967a46fa93","456":"00c2bac49511bea54b5c","466":"8cdd9c3bcc81fe4cb8c6","471":"a646b0616732bbc945b4","483":"7a8402a110f9f42fdc94","506":"4bcf51e2946dab485d2b","530":"f904325ef4195d69ac0e","579":"8c45043bf461a6808b54","613":"a54c8cdf616a799bcf4b","661":"949c984fe2f9f753b65c","686":"62c827fe4f0d054c164e","687":"e798aa93251dc9bc87ef","738":"f5179d74c16cb154c759","814":"198efdffbe64f60e38ef","822":"2092dbfefbc1b5834965","831":"127a3064e8844d6d2c82","886":"69f07c567a3dc69b060f","965":"254019aafbf9c9d3d800"}[chunkId] + ".js";
282911
+ /******/ return "" + (chunkId === 18 ? "dicom-microscopy-viewer" : chunkId) + ".bundle." + {"12":"40a66318189b9d077880","18":"a7d5060eead13771e784","19":"5deb3e67de1c828ce247","23":"9d989522a6e4fdcb9c72","95":"644c927d99988ff60b36","125":"df666cb677e5a8982157","170":"83a5019554b04230cda3","181":"a2d7b26d73467d2ce8cd","185":"02ded91a2ed1cc51df6c","199":"9a12097c2666e0132afa","202":"c7c412d83b745f890834","223":"d4ac6ef2cfe47a9c4afc","250":"96a47756a15efbdf78af","281":"bb71140105c7a024252b","359":"b0606bd7dac37d4e1538","410":"bb49d9044c24ae92517e","417":"5c66801d23d0e98c00e6","451":"9b9abf9ca8967a46fa93","456":"9deaf3d7218e5daf29ed","466":"93a5c6c1911033287d0a","471":"a646b0616732bbc945b4","483":"964610a9035ad21ba49e","506":"bcb1411e2b52140dd368","530":"f904325ef4195d69ac0e","579":"8c45043bf461a6808b54","613":"e161ed4732180b99b014","661":"949c984fe2f9f753b65c","686":"62c827fe4f0d054c164e","687":"35d354a804ed3351f2b0","738":"5842b81d54371825d781","814":"611a6ebcf4df4ab71d06","822":"2092dbfefbc1b5834965","831":"127a3064e8844d6d2c82","886":"69f07c567a3dc69b060f","965":"06d53a7fc8a88702b7f2"}[chunkId] + ".js";
282858
282912
  /******/ };
282859
282913
  /******/ })();
282860
282914
  /******/
package/dist/index.html CHANGED
@@ -1,2 +1,2 @@
1
1
  <!doctype html><html lang="en"><head><meta charset="UTF-8"/><meta name="viewport" content="width=device-width,initial-scale=1,shrink-to-fit=no"/><meta name="theme-color" content="#000000"/><meta name="mobile-web-app-capable" content="yes"/><meta name="application-name" content="OHIF Viewer"/><meta name="apple-mobile-web-app-capable" content="yes"/><meta name="apple-mobile-web-app-status-bar-style" content="black-translucent"/><meta name="apple-mobile-web-app-title" content="@ohif/app"/><meta name="msapplication-TileColor" content="#fff"/><meta name="msapplication-TileImage" content="/assets/mstile-144x144.png"/><meta name="msapplication-config" content="/assets/browserconfig.xml"/><script>console.time('scriptToView');
2
- window.PUBLIC_URL = '/';</script><link rel="manifest" href="/manifest.json"/><link rel="shortcut icon" href="/assets/favicon.ico"/><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"/><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"/><link rel="apple-touch-icon" sizes="57x57" href="/assets/apple-touch-icon-57x57.png"/><link rel="apple-touch-icon" sizes="60x60" href="/assets/apple-touch-icon-60x60.png"/><link rel="apple-touch-icon" sizes="72x72" href="/assets/apple-touch-icon-72x72.png"/><link rel="apple-touch-icon" sizes="76x76" href="/assets/apple-touch-icon-76x76.png"/><link rel="apple-touch-icon" sizes="114x114" href="/assets/apple-touch-icon-114x114.png"/><link rel="apple-touch-icon" sizes="120x120" href="/assets/apple-touch-icon-120x120.png"/><link rel="apple-touch-icon" sizes="144x144" href="/assets/apple-touch-icon-144x144.png"/><link rel="apple-touch-icon" sizes="152x152" href="/assets/apple-touch-icon-152x152.png"/><link rel="apple-touch-icon" sizes="167x167" href="/assets/apple-touch-icon-167x167.png"/><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon-180x180.png"/><link rel="apple-touch-icon" sizes="1024x1024" href="/assets/apple-touch-icon-1024x1024.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 480px) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-320x460.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 480px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-640x920.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-640x1096.png"/><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-750x1294.png"/><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 3)" href="/assets/apple-touch-startup-image-1182x2208.png"/><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 3)" href="/assets/apple-touch-startup-image-1242x2148.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-748x1024.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-768x1004.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-1496x2048.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-1536x2008.png"/><link rel="icon" type="image/png" sizes="228x228" href="/assets/coast-228x228.png"/><link rel="yandex-tableau-widget" href="/assets/yandex-browser-manifest.json"/><script rel="preload" as="script" src="/app-config.js"></script><script rel="preload" as="script" type="module" src="/init-service-worker.js"></script><title>OHIF Viewer</title><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/><link href="https://fonts.googleapis.com/css?family=Inter:100,300,400,500,700&display=swap" rel="stylesheet" rel="preload" as="style"/><script defer="defer" src="/app.bundle.ab96a3986fbf883f78ea.js"></script><link href="/app.bundle.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
2
+ window.PUBLIC_URL = '/';</script><link rel="manifest" href="/manifest.json"/><link rel="shortcut icon" href="/assets/favicon.ico"/><link rel="icon" type="image/png" sizes="16x16" href="/assets/favicon-16x16.png"/><link rel="icon" type="image/png" sizes="32x32" href="/assets/favicon-32x32.png"/><link rel="apple-touch-icon" sizes="57x57" href="/assets/apple-touch-icon-57x57.png"/><link rel="apple-touch-icon" sizes="60x60" href="/assets/apple-touch-icon-60x60.png"/><link rel="apple-touch-icon" sizes="72x72" href="/assets/apple-touch-icon-72x72.png"/><link rel="apple-touch-icon" sizes="76x76" href="/assets/apple-touch-icon-76x76.png"/><link rel="apple-touch-icon" sizes="114x114" href="/assets/apple-touch-icon-114x114.png"/><link rel="apple-touch-icon" sizes="120x120" href="/assets/apple-touch-icon-120x120.png"/><link rel="apple-touch-icon" sizes="144x144" href="/assets/apple-touch-icon-144x144.png"/><link rel="apple-touch-icon" sizes="152x152" href="/assets/apple-touch-icon-152x152.png"/><link rel="apple-touch-icon" sizes="167x167" href="/assets/apple-touch-icon-167x167.png"/><link rel="apple-touch-icon" sizes="180x180" href="/assets/apple-touch-icon-180x180.png"/><link rel="apple-touch-icon" sizes="1024x1024" href="/assets/apple-touch-icon-1024x1024.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 480px) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-320x460.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 480px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-640x920.png"/><link rel="apple-touch-startup-image" media="(device-width: 320px) and (device-height: 568px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-640x1096.png"/><link rel="apple-touch-startup-image" media="(device-width: 375px) and (device-height: 667px) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-750x1294.png"/><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 3)" href="/assets/apple-touch-startup-image-1182x2208.png"/><link rel="apple-touch-startup-image" media="(device-width: 414px) and (device-height: 736px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 3)" href="/assets/apple-touch-startup-image-1242x2148.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-748x1024.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 1)" href="/assets/apple-touch-startup-image-768x1004.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: landscape) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-1496x2048.png"/><link rel="apple-touch-startup-image" media="(device-width: 768px) and (device-height: 1024px) and (orientation: portrait) and (-webkit-device-pixel-ratio: 2)" href="/assets/apple-touch-startup-image-1536x2008.png"/><link rel="icon" type="image/png" sizes="228x228" href="/assets/coast-228x228.png"/><link rel="yandex-tableau-widget" href="/assets/yandex-browser-manifest.json"/><script rel="preload" as="script" src="/app-config.js"></script><script rel="preload" as="script" type="module" src="/init-service-worker.js"></script><title>OHIF Viewer</title><link rel="preconnect" href="https://fonts.gstatic.com" crossorigin/><link href="https://fonts.googleapis.com/css?family=Inter:100,300,400,500,700&display=swap" rel="stylesheet" rel="preload" as="style"/><script defer="defer" src="/app.bundle.67bbe7910a730e982a28.js"></script><link href="/app.bundle.css" rel="stylesheet"></head><body><noscript>You need to enable JavaScript to run this app.</noscript><div id="root"></div></body></html>
package/dist/sw.js CHANGED
@@ -51,7 +51,7 @@ self.addEventListener('message', event => {
51
51
  }
52
52
  }
53
53
  });
54
- workbox.precaching.precacheAndRoute([{'revision':null,'url':'/12.bundle.e97b1190673797a03d1a.js'},{'revision':null,'url':'/125.bundle.df666cb677e5a8982157.js'},{'revision':null,'url':'/170.bundle.5632b1b6fab9906388e2.js'},{'revision':null,'url':'/181.bundle.a2d7b26d73467d2ce8cd.js'},{'revision':'a04a2f233dc569826f5f6e21b65bc87b','url':'/181.css'},{'revision':null,'url':'/185.bundle.6311718cd457884f813a.js'},{'revision':null,'url':'/19.bundle.2fa92040006123dc9251.js'},{'revision':'51b8ed55f5b8d448837222f03bdd6de8','url':'/19.css'},{'revision':null,'url':'/199.bundle.8a5e36ae7e18dd2de580.js'},{'revision':null,'url':'/202.bundle.c7c412d83b745f890834.js'},{'revision':'d32549aa3716d55d525e59e31e2f6591','url':'/20fc4c659b85ccd2a9c0.wasm'},{'revision':null,'url':'/223.bundle.d4ac6ef2cfe47a9c4afc.js'},{'revision':null,'url':'/23.bundle.9d989522a6e4fdcb9c72.js'},{'revision':null,'url':'/250.bundle.96a47756a15efbdf78af.js'},{'revision':'0afb25509c7f072fbd7eda42c6895dbf','url':'/250.css'},{'revision':null,'url':'/281.bundle.5eddac45a51ce75f55c4.js'},{'revision':null,'url':'/359.bundle.bb663da51cbd0b8d1eff.js'},{'revision':'c4ea120c6da08aa75348edfa3e57ece9','url':'/36785fbd89b0e17f6099.wasm'},{'revision':null,'url':'/410.bundle.bd04d9a698385a43f682.js'},{'revision':null,'url':'/417.bundle.5c66801d23d0e98c00e6.js'},{'revision':null,'url':'/451.bundle.9b9abf9ca8967a46fa93.js'},{'revision':null,'url':'/456.bundle.00c2bac49511bea54b5c.js'},{'revision':'185e5e0a10fa6ab2fc7b3c38e63d550b','url':'/456.css'},{'revision':null,'url':'/466.bundle.8cdd9c3bcc81fe4cb8c6.js'},{'revision':'aa1d1f3e32367e42fe90399144d94577','url':'/466.css'},{'revision':null,'url':'/471.bundle.a646b0616732bbc945b4.js'},{'revision':null,'url':'/483.bundle.7a8402a110f9f42fdc94.js'},{'revision':'c377e1f5fe4a207d270c3f7a8dd3e3ca','url':'/5004fdc02f329ce53b69.wasm'},{'revision':null,'url':'/506.bundle.4bcf51e2946dab485d2b.js'},{'revision':null,'url':'/530.bundle.f904325ef4195d69ac0e.js'},{'revision':'51b8ed55f5b8d448837222f03bdd6de8','url':'/579.css'},{'revision':'62b4ae8445d191d5aab5503ce475724d','url':'/610.min.worker.js'},{'revision':'3c2206525c18cd87dd28082949a4e43e','url':'/610.min.worker.js.map'},{'revision':null,'url':'/613.bundle.a54c8cdf616a799bcf4b.js'},{'revision':'5800265b6831396572fb5d32c6bd8eef','url':'/62ab5d58a2bea7b5a1dc.wasm'},{'revision':'ce10eced3ce34e663d86569b27f5bffb','url':'/65916ef3def695744bda.wasm'},{'revision':null,'url':'/661.bundle.949c984fe2f9f753b65c.js'},{'revision':null,'url':'/686.bundle.62c827fe4f0d054c164e.js'},{'revision':null,'url':'/687.bundle.e798aa93251dc9bc87ef.js'},{'revision':null,'url':'/738.bundle.f5179d74c16cb154c759.js'},{'revision':'cc4a3a4da4ac1b863a714f93c66c6ef2','url':'/75a0c2dfe07b824c7d21.wasm'},{'revision':null,'url':'/814.bundle.198efdffbe64f60e38ef.js'},{'revision':null,'url':'/822.bundle.2092dbfefbc1b5834965.js'},{'revision':null,'url':'/831.bundle.127a3064e8844d6d2c82.js'},{'revision':null,'url':'/886.bundle.69f07c567a3dc69b060f.js'},{'revision':'74c9647440e51f149ad12923d6ead952','url':'/945.min.worker.js'},{'revision':'cdf6f0457d4af2cef04fc41816241bc1','url':'/945.min.worker.js.map'},{'revision':null,'url':'/95.bundle.644c927d99988ff60b36.js'},{'revision':null,'url':'/965.bundle.254019aafbf9c9d3d800.js'},{'revision':'d1895aa7a4595dc279c382e5a31ef9f4','url':'/_headers'},{'revision':'e3bf0f3e9c34f51ad59836ae8e8eaf43','url':'/_redirects'},{'revision':'41bb4b36a914c2db5c383a627162b3da','url':'/app-config.js'},{'revision':null,'url':'/app.bundle.ab96a3986fbf883f78ea.js'},{'revision':'768881741792bf8d96b04e00da8ad850','url':'/app.bundle.css'},{'revision':'cb4f64534cdf8dd88f1d7219d44490db','url':'/assets/android-chrome-144x144.png'},{'revision':'5cde390de8a619ebe55a669d2ac3effd','url':'/assets/android-chrome-192x192.png'},{'revision':'e7466a67e90471de05401e53b8fe20be','url':'/assets/android-chrome-256x256.png'},{'revision':'9bbe9b80156e930d19a4e1725aa9ddae','url':'/assets/android-chrome-36x36.png'},{'revision':'5698b2ac0c82fe06d84521fc5482df04','url':'/assets/android-chrome-384x384.png'},{'revision':'56bef3fceec344d9747f8abe9c0bba27','url':'/assets/android-chrome-48x48.png'},{'revision':'3e8b8a01290992e82c242557417b0596','url':'/assets/android-chrome-512x512.png'},{'revision':'517925e91e2ce724432d296b687d25e2','url':'/assets/android-chrome-72x72.png'},{'revision':'4c3289bc690f8519012686888e08da71','url':'/assets/android-chrome-96x96.png'},{'revision':'cf464289183184df09292f581df0fb4f','url':'/assets/apple-touch-icon-1024x1024.png'},{'revision':'0857c5282c594e4900e8b31e3bade912','url':'/assets/apple-touch-icon-114x114.png'},{'revision':'4208f41a28130a67e9392a9dfcee6011','url':'/assets/apple-touch-icon-120x120.png'},{'revision':'cb4f64534cdf8dd88f1d7219d44490db','url':'/assets/apple-touch-icon-144x144.png'},{'revision':'977d293982af7e9064ba20806b45cf35','url':'/assets/apple-touch-icon-152x152.png'},{'revision':'6de91b4d2a30600b410758405cb567b4','url':'/assets/apple-touch-icon-167x167.png'},{'revision':'87bff140e3773bd7479a620501c4aa5c','url':'/assets/apple-touch-icon-180x180.png'},{'revision':'647386c34e75f1213830ea9a38913525','url':'/assets/apple-touch-icon-57x57.png'},{'revision':'0c200fe83953738b330ea431083e7a86','url':'/assets/apple-touch-icon-60x60.png'},{'revision':'517925e91e2ce724432d296b687d25e2','url':'/assets/apple-touch-icon-72x72.png'},{'revision':'c9989a807bb18633f6dcf254b5b56124','url':'/assets/apple-touch-icon-76x76.png'},{'revision':'87bff140e3773bd7479a620501c4aa5c','url':'/assets/apple-touch-icon-precomposed.png'},{'revision':'87bff140e3773bd7479a620501c4aa5c','url':'/assets/apple-touch-icon.png'},{'revision':'05fa74ea9c1c0c3931ba96467999081d','url':'/assets/apple-touch-startup-image-1182x2208.png'},{'revision':'9e2cd03e1e6fd0520eea6846f4278018','url':'/assets/apple-touch-startup-image-1242x2148.png'},{'revision':'5591e3a1822cbc8439b99c1a40d53425','url':'/assets/apple-touch-startup-image-1496x2048.png'},{'revision':'337de578c5ca04bd7d2be19d24d83821','url':'/assets/apple-touch-startup-image-1536x2008.png'},{'revision':'cafb4ab4eafe6ef946bd229a1d88e7de','url':'/assets/apple-touch-startup-image-320x460.png'},{'revision':'d9bb9e558d729eeac5efb8be8d6111cc','url':'/assets/apple-touch-startup-image-640x1096.png'},{'revision':'038b5b02bac8b82444bf9a87602ac216','url':'/assets/apple-touch-startup-image-640x920.png'},{'revision':'2177076eb07b1d64d663d7c03268be00','url':'/assets/apple-touch-startup-image-748x1024.png'},{'revision':'4fc097443815fe92503584c4bd73c630','url':'/assets/apple-touch-startup-image-750x1294.png'},{'revision':'2e29914062dce5c5141ab47eea2fc5d9','url':'/assets/apple-touch-startup-image-768x1004.png'},{'revision':'f692ec286b3a332c17985f4ed38b1076','url':'/assets/browserconfig.xml'},{'revision':'f3d9a3b647853c45b0e132e4acd0cc4a','url':'/assets/coast-228x228.png'},{'revision':'ad6e1def5c66193d649a31474bbfe45d','url':'/assets/favicon-16x16.png'},{'revision':'84d1dcdb6cdfa55e2f46be0c80fa5698','url':'/assets/favicon-32x32.png'},{'revision':'95fb44c4998a46109e49d724c060db24','url':'/assets/favicon.ico'},{'revision':'5df2a5b0cee399ac0bc40af74ba3c2cb','url':'/assets/firefox_app_128x128.png'},{'revision':'11fd9098c4b07c8a07e1d2a1e309e046','url':'/assets/firefox_app_512x512.png'},{'revision':'27cddfc922dca3bfa27b4a00fc2f5e36','url':'/assets/firefox_app_60x60.png'},{'revision':'2017d95fae79dcf34b5a5b52586d4763','url':'/assets/manifest.webapp'},{'revision':'cb4f64534cdf8dd88f1d7219d44490db','url':'/assets/mstile-144x144.png'},{'revision':'334895225e16a7777e45d81964725a97','url':'/assets/mstile-150x150.png'},{'revision':'e295cca4af6ed0365cf7b014d91b0e9d','url':'/assets/mstile-310x150.png'},{'revision':'cbefa8c42250e5f2443819fe2c69d91e','url':'/assets/mstile-310x310.png'},{'revision':'aa411a69df2b33a1362fa38d1257fa9d','url':'/assets/mstile-70x70.png'},{'revision':'5609af4f69e40e33471aee770ea1d802','url':'/assets/yandex-browser-50x50.png'},{'revision':'dd001f21b3970d5a7f3e245cc10d21df','url':'/assets/yandex-browser-manifest.json'},{'revision':'52b9a07fe0541fe8c313d9788550bf51','url':'/b6b803111e2d06a825bd.wasm'},{'revision':'7edb59d2be7c993050cb31ded36afa31','url':'/c22b37c3488e1d6c3aa4.wasm'},{'revision':'17975bfd8614e2483aa78a523f21c484','url':'/cornerstoneDICOMImageLoader.min.js'},{'revision':'234568117b86fd4526187ca7fa69ee91','url':'/cornerstoneDICOMImageLoader.min.js.map'},{'revision':null,'url':'/dicom-microscopy-viewer.bundle.a7d5060eead13771e784.js'},{'revision':'9d8c85b42d04bb117a3b583d654fbb08','url':'/dicomMicroscopyViewer.min.js'},{'revision':'450494c199cf8dd8e8c34d5e98bf5334','url':'/dicomMicroscopyViewer.min.js.LICENSE.txt'},{'revision':'4acdd19a35d759ec2669f1ba9490937d','url':'/es6-shim.min.js'},{'revision':'791565db341e8852807303918f5f9939','url':'/google.js'},{'revision':'49af1aed9eedb4edc6cd9268b9d0c0fb','url':'/index.html'},{'revision':'df70845c6ce2109b2bc2c1bf14bd65a0','url':'/index.worker.64c896c4316fcd506666.worker.js'},{'revision':'143490b997e10b23c1debfa35afeb9e4','url':'/index.worker.64c896c4316fcd506666.worker.js.map'},{'revision':'71cec55513e051f0778ad89be760c11a','url':'/index.worker.min.worker.js'},{'revision':'fd1116add443fee52a935df926396e0f','url':'/index.worker.min.worker.js.map'},{'revision':'31c0367ca4160b2c6373e905739c5719','url':'/init-service-worker.js'},{'revision':'74fc9658b62903be2048c1f82a22b4d4','url':'/manifest.json'},{'revision':'3fa71aa0af3e34b4ebd9a71eee0f4bdd','url':'/ohif-logo-light.svg'},{'revision':'7e81da785c63e75650101db6c5d7560e','url':'/ohif-logo.svg'},{'revision':'eadf8bf1d85032a029e2c0df4b8938b0','url':'/oidc-client.min.js'},{'revision':'a1aef5311245f5864315443d12246c37','url':'/polyfill.min.js'},{'revision':'af9346d3e597071ba9ee8cd32f8cc0ea','url':'/serve.json'},{'revision':'b1e488d9955b62bd2858874df11d5223','url':'/silent-refresh.html'}]);
54
+ workbox.precaching.precacheAndRoute([{'revision':null,'url':'/12.bundle.40a66318189b9d077880.js'},{'revision':null,'url':'/125.bundle.df666cb677e5a8982157.js'},{'revision':null,'url':'/170.bundle.83a5019554b04230cda3.js'},{'revision':null,'url':'/181.bundle.a2d7b26d73467d2ce8cd.js'},{'revision':'a04a2f233dc569826f5f6e21b65bc87b','url':'/181.css'},{'revision':null,'url':'/185.bundle.02ded91a2ed1cc51df6c.js'},{'revision':null,'url':'/19.bundle.5deb3e67de1c828ce247.js'},{'revision':'51b8ed55f5b8d448837222f03bdd6de8','url':'/19.css'},{'revision':null,'url':'/199.bundle.9a12097c2666e0132afa.js'},{'revision':null,'url':'/202.bundle.c7c412d83b745f890834.js'},{'revision':'d32549aa3716d55d525e59e31e2f6591','url':'/20fc4c659b85ccd2a9c0.wasm'},{'revision':null,'url':'/223.bundle.d4ac6ef2cfe47a9c4afc.js'},{'revision':null,'url':'/23.bundle.9d989522a6e4fdcb9c72.js'},{'revision':null,'url':'/250.bundle.96a47756a15efbdf78af.js'},{'revision':'0afb25509c7f072fbd7eda42c6895dbf','url':'/250.css'},{'revision':null,'url':'/281.bundle.bb71140105c7a024252b.js'},{'revision':null,'url':'/359.bundle.b0606bd7dac37d4e1538.js'},{'revision':'c4ea120c6da08aa75348edfa3e57ece9','url':'/36785fbd89b0e17f6099.wasm'},{'revision':null,'url':'/410.bundle.bb49d9044c24ae92517e.js'},{'revision':null,'url':'/417.bundle.5c66801d23d0e98c00e6.js'},{'revision':null,'url':'/451.bundle.9b9abf9ca8967a46fa93.js'},{'revision':null,'url':'/456.bundle.9deaf3d7218e5daf29ed.js'},{'revision':'185e5e0a10fa6ab2fc7b3c38e63d550b','url':'/456.css'},{'revision':null,'url':'/466.bundle.93a5c6c1911033287d0a.js'},{'revision':'aa1d1f3e32367e42fe90399144d94577','url':'/466.css'},{'revision':null,'url':'/471.bundle.a646b0616732bbc945b4.js'},{'revision':null,'url':'/483.bundle.964610a9035ad21ba49e.js'},{'revision':'c377e1f5fe4a207d270c3f7a8dd3e3ca','url':'/5004fdc02f329ce53b69.wasm'},{'revision':null,'url':'/506.bundle.bcb1411e2b52140dd368.js'},{'revision':null,'url':'/530.bundle.f904325ef4195d69ac0e.js'},{'revision':'51b8ed55f5b8d448837222f03bdd6de8','url':'/579.css'},{'revision':'62b4ae8445d191d5aab5503ce475724d','url':'/610.min.worker.js'},{'revision':'3c2206525c18cd87dd28082949a4e43e','url':'/610.min.worker.js.map'},{'revision':null,'url':'/613.bundle.e161ed4732180b99b014.js'},{'revision':'5800265b6831396572fb5d32c6bd8eef','url':'/62ab5d58a2bea7b5a1dc.wasm'},{'revision':'ce10eced3ce34e663d86569b27f5bffb','url':'/65916ef3def695744bda.wasm'},{'revision':null,'url':'/661.bundle.949c984fe2f9f753b65c.js'},{'revision':null,'url':'/686.bundle.62c827fe4f0d054c164e.js'},{'revision':null,'url':'/687.bundle.35d354a804ed3351f2b0.js'},{'revision':null,'url':'/738.bundle.5842b81d54371825d781.js'},{'revision':'cc4a3a4da4ac1b863a714f93c66c6ef2','url':'/75a0c2dfe07b824c7d21.wasm'},{'revision':null,'url':'/814.bundle.611a6ebcf4df4ab71d06.js'},{'revision':null,'url':'/822.bundle.2092dbfefbc1b5834965.js'},{'revision':null,'url':'/831.bundle.127a3064e8844d6d2c82.js'},{'revision':null,'url':'/886.bundle.69f07c567a3dc69b060f.js'},{'revision':'74c9647440e51f149ad12923d6ead952','url':'/945.min.worker.js'},{'revision':'cdf6f0457d4af2cef04fc41816241bc1','url':'/945.min.worker.js.map'},{'revision':null,'url':'/95.bundle.644c927d99988ff60b36.js'},{'revision':null,'url':'/965.bundle.06d53a7fc8a88702b7f2.js'},{'revision':'d1895aa7a4595dc279c382e5a31ef9f4','url':'/_headers'},{'revision':'e3bf0f3e9c34f51ad59836ae8e8eaf43','url':'/_redirects'},{'revision':'41bb4b36a914c2db5c383a627162b3da','url':'/app-config.js'},{'revision':null,'url':'/app.bundle.67bbe7910a730e982a28.js'},{'revision':'768881741792bf8d96b04e00da8ad850','url':'/app.bundle.css'},{'revision':'cb4f64534cdf8dd88f1d7219d44490db','url':'/assets/android-chrome-144x144.png'},{'revision':'5cde390de8a619ebe55a669d2ac3effd','url':'/assets/android-chrome-192x192.png'},{'revision':'e7466a67e90471de05401e53b8fe20be','url':'/assets/android-chrome-256x256.png'},{'revision':'9bbe9b80156e930d19a4e1725aa9ddae','url':'/assets/android-chrome-36x36.png'},{'revision':'5698b2ac0c82fe06d84521fc5482df04','url':'/assets/android-chrome-384x384.png'},{'revision':'56bef3fceec344d9747f8abe9c0bba27','url':'/assets/android-chrome-48x48.png'},{'revision':'3e8b8a01290992e82c242557417b0596','url':'/assets/android-chrome-512x512.png'},{'revision':'517925e91e2ce724432d296b687d25e2','url':'/assets/android-chrome-72x72.png'},{'revision':'4c3289bc690f8519012686888e08da71','url':'/assets/android-chrome-96x96.png'},{'revision':'cf464289183184df09292f581df0fb4f','url':'/assets/apple-touch-icon-1024x1024.png'},{'revision':'0857c5282c594e4900e8b31e3bade912','url':'/assets/apple-touch-icon-114x114.png'},{'revision':'4208f41a28130a67e9392a9dfcee6011','url':'/assets/apple-touch-icon-120x120.png'},{'revision':'cb4f64534cdf8dd88f1d7219d44490db','url':'/assets/apple-touch-icon-144x144.png'},{'revision':'977d293982af7e9064ba20806b45cf35','url':'/assets/apple-touch-icon-152x152.png'},{'revision':'6de91b4d2a30600b410758405cb567b4','url':'/assets/apple-touch-icon-167x167.png'},{'revision':'87bff140e3773bd7479a620501c4aa5c','url':'/assets/apple-touch-icon-180x180.png'},{'revision':'647386c34e75f1213830ea9a38913525','url':'/assets/apple-touch-icon-57x57.png'},{'revision':'0c200fe83953738b330ea431083e7a86','url':'/assets/apple-touch-icon-60x60.png'},{'revision':'517925e91e2ce724432d296b687d25e2','url':'/assets/apple-touch-icon-72x72.png'},{'revision':'c9989a807bb18633f6dcf254b5b56124','url':'/assets/apple-touch-icon-76x76.png'},{'revision':'87bff140e3773bd7479a620501c4aa5c','url':'/assets/apple-touch-icon-precomposed.png'},{'revision':'87bff140e3773bd7479a620501c4aa5c','url':'/assets/apple-touch-icon.png'},{'revision':'05fa74ea9c1c0c3931ba96467999081d','url':'/assets/apple-touch-startup-image-1182x2208.png'},{'revision':'9e2cd03e1e6fd0520eea6846f4278018','url':'/assets/apple-touch-startup-image-1242x2148.png'},{'revision':'5591e3a1822cbc8439b99c1a40d53425','url':'/assets/apple-touch-startup-image-1496x2048.png'},{'revision':'337de578c5ca04bd7d2be19d24d83821','url':'/assets/apple-touch-startup-image-1536x2008.png'},{'revision':'cafb4ab4eafe6ef946bd229a1d88e7de','url':'/assets/apple-touch-startup-image-320x460.png'},{'revision':'d9bb9e558d729eeac5efb8be8d6111cc','url':'/assets/apple-touch-startup-image-640x1096.png'},{'revision':'038b5b02bac8b82444bf9a87602ac216','url':'/assets/apple-touch-startup-image-640x920.png'},{'revision':'2177076eb07b1d64d663d7c03268be00','url':'/assets/apple-touch-startup-image-748x1024.png'},{'revision':'4fc097443815fe92503584c4bd73c630','url':'/assets/apple-touch-startup-image-750x1294.png'},{'revision':'2e29914062dce5c5141ab47eea2fc5d9','url':'/assets/apple-touch-startup-image-768x1004.png'},{'revision':'f692ec286b3a332c17985f4ed38b1076','url':'/assets/browserconfig.xml'},{'revision':'f3d9a3b647853c45b0e132e4acd0cc4a','url':'/assets/coast-228x228.png'},{'revision':'ad6e1def5c66193d649a31474bbfe45d','url':'/assets/favicon-16x16.png'},{'revision':'84d1dcdb6cdfa55e2f46be0c80fa5698','url':'/assets/favicon-32x32.png'},{'revision':'95fb44c4998a46109e49d724c060db24','url':'/assets/favicon.ico'},{'revision':'5df2a5b0cee399ac0bc40af74ba3c2cb','url':'/assets/firefox_app_128x128.png'},{'revision':'11fd9098c4b07c8a07e1d2a1e309e046','url':'/assets/firefox_app_512x512.png'},{'revision':'27cddfc922dca3bfa27b4a00fc2f5e36','url':'/assets/firefox_app_60x60.png'},{'revision':'2017d95fae79dcf34b5a5b52586d4763','url':'/assets/manifest.webapp'},{'revision':'cb4f64534cdf8dd88f1d7219d44490db','url':'/assets/mstile-144x144.png'},{'revision':'334895225e16a7777e45d81964725a97','url':'/assets/mstile-150x150.png'},{'revision':'e295cca4af6ed0365cf7b014d91b0e9d','url':'/assets/mstile-310x150.png'},{'revision':'cbefa8c42250e5f2443819fe2c69d91e','url':'/assets/mstile-310x310.png'},{'revision':'aa411a69df2b33a1362fa38d1257fa9d','url':'/assets/mstile-70x70.png'},{'revision':'5609af4f69e40e33471aee770ea1d802','url':'/assets/yandex-browser-50x50.png'},{'revision':'dd001f21b3970d5a7f3e245cc10d21df','url':'/assets/yandex-browser-manifest.json'},{'revision':'52b9a07fe0541fe8c313d9788550bf51','url':'/b6b803111e2d06a825bd.wasm'},{'revision':'7edb59d2be7c993050cb31ded36afa31','url':'/c22b37c3488e1d6c3aa4.wasm'},{'revision':'17975bfd8614e2483aa78a523f21c484','url':'/cornerstoneDICOMImageLoader.min.js'},{'revision':'234568117b86fd4526187ca7fa69ee91','url':'/cornerstoneDICOMImageLoader.min.js.map'},{'revision':null,'url':'/dicom-microscopy-viewer.bundle.a7d5060eead13771e784.js'},{'revision':'9d8c85b42d04bb117a3b583d654fbb08','url':'/dicomMicroscopyViewer.min.js'},{'revision':'450494c199cf8dd8e8c34d5e98bf5334','url':'/dicomMicroscopyViewer.min.js.LICENSE.txt'},{'revision':'4acdd19a35d759ec2669f1ba9490937d','url':'/es6-shim.min.js'},{'revision':'791565db341e8852807303918f5f9939','url':'/google.js'},{'revision':'b98d9aedd2740617d2cc95cd55a44bff','url':'/index.html'},{'revision':'df70845c6ce2109b2bc2c1bf14bd65a0','url':'/index.worker.64c896c4316fcd506666.worker.js'},{'revision':'143490b997e10b23c1debfa35afeb9e4','url':'/index.worker.64c896c4316fcd506666.worker.js.map'},{'revision':'71cec55513e051f0778ad89be760c11a','url':'/index.worker.min.worker.js'},{'revision':'fd1116add443fee52a935df926396e0f','url':'/index.worker.min.worker.js.map'},{'revision':'31c0367ca4160b2c6373e905739c5719','url':'/init-service-worker.js'},{'revision':'74fc9658b62903be2048c1f82a22b4d4','url':'/manifest.json'},{'revision':'3fa71aa0af3e34b4ebd9a71eee0f4bdd','url':'/ohif-logo-light.svg'},{'revision':'7e81da785c63e75650101db6c5d7560e','url':'/ohif-logo.svg'},{'revision':'eadf8bf1d85032a029e2c0df4b8938b0','url':'/oidc-client.min.js'},{'revision':'a1aef5311245f5864315443d12246c37','url':'/polyfill.min.js'},{'revision':'af9346d3e597071ba9ee8cd32f8cc0ea','url':'/serve.json'},{'revision':'b1e488d9955b62bd2858874df11d5223','url':'/silent-refresh.html'}]);
55
55
 
56
56
  // TODO: Cache API
57
57
  // https://developers.google.com/web/fundamentals/instant-and-offline/web-storage/cache-api
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ohif/app",
3
- "version": "3.8.0-beta.43",
3
+ "version": "3.8.0-beta.45",
4
4
  "productVersion": "3.4.0",
5
5
  "description": "OHIF Viewer",
6
6
  "author": "OHIF Contributors",
@@ -52,22 +52,22 @@
52
52
  "@cornerstonejs/codec-openjpeg": "^1.2.2",
53
53
  "@cornerstonejs/codec-openjph": "^2.4.5",
54
54
  "@cornerstonejs/dicom-image-loader": "^1.43.7",
55
- "@ohif/core": "3.8.0-beta.43",
56
- "@ohif/extension-cornerstone": "3.8.0-beta.43",
57
- "@ohif/extension-cornerstone-dicom-rt": "3.8.0-beta.43",
58
- "@ohif/extension-cornerstone-dicom-seg": "3.8.0-beta.43",
59
- "@ohif/extension-cornerstone-dicom-sr": "3.8.0-beta.43",
60
- "@ohif/extension-default": "3.8.0-beta.43",
61
- "@ohif/extension-dicom-microscopy": "3.8.0-beta.43",
62
- "@ohif/extension-dicom-pdf": "3.8.0-beta.43",
63
- "@ohif/extension-dicom-video": "3.8.0-beta.43",
64
- "@ohif/extension-test": "3.8.0-beta.43",
65
- "@ohif/i18n": "3.8.0-beta.43",
66
- "@ohif/mode-basic-dev-mode": "3.8.0-beta.43",
67
- "@ohif/mode-longitudinal": "3.8.0-beta.43",
68
- "@ohif/mode-microscopy": "3.8.0-beta.43",
69
- "@ohif/mode-test": "3.8.0-beta.43",
70
- "@ohif/ui": "3.8.0-beta.43",
55
+ "@ohif/core": "3.8.0-beta.45",
56
+ "@ohif/extension-cornerstone": "3.8.0-beta.45",
57
+ "@ohif/extension-cornerstone-dicom-rt": "3.8.0-beta.45",
58
+ "@ohif/extension-cornerstone-dicom-seg": "3.8.0-beta.45",
59
+ "@ohif/extension-cornerstone-dicom-sr": "3.8.0-beta.45",
60
+ "@ohif/extension-default": "3.8.0-beta.45",
61
+ "@ohif/extension-dicom-microscopy": "3.8.0-beta.45",
62
+ "@ohif/extension-dicom-pdf": "3.8.0-beta.45",
63
+ "@ohif/extension-dicom-video": "3.8.0-beta.45",
64
+ "@ohif/extension-test": "3.8.0-beta.45",
65
+ "@ohif/i18n": "3.8.0-beta.45",
66
+ "@ohif/mode-basic-dev-mode": "3.8.0-beta.45",
67
+ "@ohif/mode-longitudinal": "3.8.0-beta.45",
68
+ "@ohif/mode-microscopy": "3.8.0-beta.45",
69
+ "@ohif/mode-test": "3.8.0-beta.45",
70
+ "@ohif/ui": "3.8.0-beta.45",
71
71
  "@types/react": "^17.0.38",
72
72
  "classnames": "^2.3.2",
73
73
  "core-js": "^3.16.1",