@ohif/app 3.7.0-beta.5 → 3.7.0-beta.50

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 (54) hide show
  1. package/dist/{917.bundle.24fc5ca2280d2980bf0f.js → 12.bundle.7348933f311b7e2e7d1e.js} +6 -6
  2. package/dist/{295.bundle.957b1159fec14b9199a1.js → 125.bundle.1ae4c6313c31cd0502cc.js} +4 -4
  3. package/dist/{208.bundle.e50761cf714ac772d9cc.js → 128.bundle.d933d385a22b1ce9ac77.js} +6 -6
  4. package/dist/{616.bundle.cbb2e0a23b1343b6441f.js → 150.bundle.e6880fd33346f8c24f6e.js} +148 -103
  5. package/dist/{351.bundle.0742237651aef9694a65.js → 181.bundle.234fef330d4fe6baca8b.js} +139 -128
  6. package/dist/{351.css → 181.css} +1 -1
  7. package/dist/{606.bundle.5d876f5f3dd8287f0a28.js → 202.bundle.ac1e5e25d4daf54581b1.js} +3705 -981
  8. package/dist/{926.bundle.dbc9d0e591cb9217fda2.js → 220.bundle.f7e1c96c94245e70f2be.js} +990 -400
  9. package/dist/{664.bundle.09abae984223969d1bde.js → 23.bundle.e008ad788170f2ed5569.js} +5 -6
  10. package/dist/{976.bundle.3b8f97b61cdfa7dc32e3.js → 236.bundle.765f3c70e21f29ab2e89.js} +38 -24
  11. package/dist/{55.bundle.550a823e75eb608e8d5e.js → 250.bundle.3bcee6d765a209281ddd.js} +37 -25
  12. package/dist/{973.bundle.77245411064eaa3ee79a.js → 281.bundle.dcc5492f44a83edd5320.js} +18 -14
  13. package/dist/{744.bundle.81246dc9f043a17fde8a.js → 30.bundle.5e2f6eeb779d579fc16e.js} +77 -89
  14. package/dist/{192.bundle.6dc1f92074738663620f.js → 348.bundle.c2deacff008bb8c68a14.js} +18 -14
  15. package/dist/{404.bundle.b7b371a30ca5bc5a0554.js → 359.bundle.594d68e783da31f97c30.js} +13 -19
  16. package/dist/{50.bundle.135ada11018fff84d66b.js → 378.bundle.6996a4170f4f05198f23.js} +10 -8
  17. package/dist/{790.bundle.ca48b21507b91b675810.js → 410.bundle.c8759293de9af17687c4.js} +6 -6
  18. package/dist/{151.bundle.31ea35044218837bf73f.js → 417.bundle.720dc8f3a6e99f378aa9.js} +9 -11
  19. package/dist/{569.bundle.21f8ad57c06a210448b5.js → 451.bundle.9941d9134fcf747d452a.js} +62 -81
  20. package/dist/{581.bundle.dc6197189f7c88c27d4c.js → 471.bundle.c9e618aeda78362776aa.js} +43 -72
  21. package/dist/{199.bundle.dff92336f7bc36f2e484.js → 506.bundle.8a2562b7038f6c983884.js} +79 -15
  22. package/dist/{935.bundle.deeffff0e4f7b528e3c3.js → 604.bundle.a51f83e64004bca5f497.js} +2 -3
  23. package/dist/{984.bundle.0301a876361809048be0.js → 663.bundle.e839c4819de3e372d07b.js} +52 -34
  24. package/dist/{531.bundle.2a82fb1d69e5b57cc72b.js → 677.bundle.ec5f2b4707db33bd4d8e.js} +731 -447
  25. package/dist/{707.bundle.7068a46e5be26fe60fce.js → 678.bundle.84a43fe18483016344de.js} +237 -244
  26. package/dist/{205.bundle.b5a473c200dcf2bbcdb4.js → 686.bundle.70565410179f1e7d22e6.js} +4 -4
  27. package/dist/{331.bundle.bd0c13931a21d53086c9.js → 754.bundle.8a16fc8ad21fe00c2e15.js} +12346 -7519
  28. package/dist/{728.bundle.d13856835357400fef82.js → 774.bundle.8ba82ee206266eb2da5e.js} +90 -63
  29. package/dist/{381.bundle.0905e683605fcbc0895f.js → 775.bundle.2285e7e0e67878948c0d.js} +16 -16
  30. package/dist/{283.bundle.f06203ec47c287f44cea.js → 782.bundle.0ea6e2a386f4ba43d830.js} +57 -25
  31. package/dist/{82.bundle.0456c9e58fa89b131f14.js → 789.bundle.aad9b29b476ea70e1350.js} +522 -157
  32. package/dist/{642.bundle.e8d980d4ba95b0b2665f.js → 814.bundle.2e308e04f0d21b4295a9.js} +6 -6
  33. package/dist/{799.bundle.758558e64147e5aad612.js → 822.bundle.d40c439da659f0e8500d.js} +65 -16
  34. package/dist/{953.bundle.3b0189ebc11cf0946f18.js → 886.bundle.68ef58774a6837f57631.js} +11 -10
  35. package/dist/{270.bundle.4564621556b0f963a004.js → 925.bundle.a2f1103d968c53a2b8fb.js} +626 -544
  36. package/dist/945.min.worker.js +1 -1
  37. package/dist/945.min.worker.js.map +1 -1
  38. package/dist/app-config.js +7 -7
  39. package/dist/{app.bundle.3ab8624d0394f1b10a0d.js → app.bundle.00cc8e251524b80d3347.js} +59252 -59601
  40. package/dist/app.bundle.css +9 -9
  41. package/dist/cornerstoneDICOMImageLoader.min.js +1 -1
  42. package/dist/cornerstoneDICOMImageLoader.min.js.map +1 -1
  43. package/dist/{dicom-microscopy-viewer.bundle.aa60bdf008c32c39cfd7.js → dicom-microscopy-viewer.bundle.44f7fedc03a58d5911d1.js} +3 -3
  44. package/dist/google.js +6 -5
  45. package/dist/index.html +1 -1
  46. package/dist/{index.worker.1c69152d710fa7b84bce.worker.js → index.worker.e62ecca63f1a2e124230.worker.js} +2 -2
  47. package/dist/index.worker.e62ecca63f1a2e124230.worker.js.map +1 -0
  48. package/dist/sw.js +1 -1
  49. package/package.json +19 -20
  50. package/dist/780.bundle.fd0f13dc92e9caa0581e.js +0 -4769
  51. package/dist/index.worker.1c69152d710fa7b84bce.worker.js.map +0 -1
  52. /package/dist/{55.css → 250.css} +0 -0
  53. /package/dist/{806.css → 579.css} +0 -0
  54. /package/dist/{707.css → 678.css} +0 -0
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (globalThis["webpackChunk"] = globalThis["webpackChunk"] || []).push([[82],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[789],{
3
3
 
4
- /***/ 96082:
4
+ /***/ 1789:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -28,11 +28,11 @@ __webpack_require__.d(utils_namespaceObject, {
28
28
  });
29
29
 
30
30
  // EXTERNAL MODULE: ../../../node_modules/dicomweb-client/build/dicomweb-client.es.js
31
- var dicomweb_client_es = __webpack_require__(75935);
32
- // EXTERNAL MODULE: ../../core/src/index.ts + 101 modules
33
- var src = __webpack_require__(48501);
31
+ var dicomweb_client_es = __webpack_require__(97604);
32
+ // EXTERNAL MODULE: ../../core/src/index.ts + 104 modules
33
+ var src = __webpack_require__(24966);
34
34
  // EXTERNAL MODULE: ../../core/src/utils/sortStudy.ts
35
- var sortStudy = __webpack_require__(87853);
35
+ var sortStudy = __webpack_require__(62971);
36
36
  ;// CONCATENATED MODULE: ../../../extensions/default/src/DicomWebDataSource/qido.js
37
37
  /**
38
38
  * QIDO - Query based on ID for DICOM Objects
@@ -378,7 +378,7 @@ function getImageId(_ref) {
378
378
  }
379
379
  }
380
380
  // EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
381
- var dcmjs_es = __webpack_require__(22737);
381
+ var dcmjs_es = __webpack_require__(67540);
382
382
  ;// CONCATENATED MODULE: ../../../extensions/default/src/DicomWebDataSource/wado/retrieveMetadataLoader.js
383
383
  /**
384
384
  * Class to define inheritance of load retrieve strategy.
@@ -708,12 +708,16 @@ class StaticWadoClient extends dicomweb_client_es.api.DICOMwebClient {
708
708
  * @returns
709
709
  */
710
710
  async searchForStudies(options) {
711
- if (!this.staticWado) return super.searchForStudies(options);
711
+ if (!this.staticWado) {
712
+ return super.searchForStudies(options);
713
+ }
712
714
  const searchResult = await super.searchForStudies(options);
713
715
  const {
714
716
  queryParams
715
717
  } = options;
716
- if (!queryParams) return searchResult;
718
+ if (!queryParams) {
719
+ return searchResult;
720
+ }
717
721
  const lowerParams = this.toLowerParams(queryParams);
718
722
  const filtered = searchResult.filter(study => {
719
723
  for (const key of Object.keys(StaticWadoClient.studyFilterKeys)) {
@@ -726,12 +730,16 @@ class StaticWadoClient extends dicomweb_client_es.api.DICOMwebClient {
726
730
  return filtered;
727
731
  }
728
732
  async searchForSeries(options) {
729
- if (!this.staticWado) return super.searchForSeries(options);
733
+ if (!this.staticWado) {
734
+ return super.searchForSeries(options);
735
+ }
730
736
  const searchResult = await super.searchForSeries(options);
731
737
  const {
732
738
  queryParams
733
739
  } = options;
734
- if (!queryParams) return searchResult;
740
+ if (!queryParams) {
741
+ return searchResult;
742
+ }
735
743
  const lowerParams = this.toLowerParams(queryParams);
736
744
  const filtered = searchResult.filter(series => {
737
745
  for (const key of Object.keys(StaticWadoClient.seriesFilterKeys)) {
@@ -767,8 +775,12 @@ class StaticWadoClient extends dicomweb_client_es.api.DICOMwebClient {
767
775
  actual = actual.Alphabetic;
768
776
  }
769
777
  if (typeof actual == 'string') {
770
- if (actual.length === 0) return true;
771
- if (desired.length === 0 || desired === '*') return true;
778
+ if (actual.length === 0) {
779
+ return true;
780
+ }
781
+ if (desired.length === 0 || desired === '*') {
782
+ return true;
783
+ }
772
784
  if (desired[0] === '*' && desired[desired.length - 1] === '*') {
773
785
  // console.log(`Comparing ${actual} to ${desired.substring(1, desired.length - 1)}`)
774
786
  return actual.indexOf(desired.substring(1, desired.length - 1)) != -1;
@@ -783,9 +795,13 @@ class StaticWadoClient extends dicomweb_client_es.api.DICOMwebClient {
783
795
 
784
796
  /** Compares a pair of dates to see if the value is within the range */
785
797
  compareDateRange(range, value) {
786
- if (!value) return true;
798
+ if (!value) {
799
+ return true;
800
+ }
787
801
  const dash = range.indexOf('-');
788
- if (dash === -1) return this.compareValues(range, value);
802
+ if (dash === -1) {
803
+ return this.compareValues(range, value);
804
+ }
789
805
  const start = range.substring(0, dash);
790
806
  const end = range.substring(dash + 1);
791
807
  return (!start || value >= start) && (!end || value <= end);
@@ -802,11 +818,17 @@ class StaticWadoClient extends dicomweb_client_es.api.DICOMwebClient {
802
818
  */
803
819
  filterItem(key, queryParams, study, sourceFilterMap) {
804
820
  const altKey = sourceFilterMap[key] || key;
805
- if (!queryParams) return true;
821
+ if (!queryParams) {
822
+ return true;
823
+ }
806
824
  const testValue = queryParams[key] || queryParams[altKey];
807
- if (!testValue) return true;
825
+ if (!testValue) {
826
+ return true;
827
+ }
808
828
  const valueElem = study[key] || study[altKey];
809
- if (!valueElem) return false;
829
+ if (!valueElem) {
830
+ return false;
831
+ }
810
832
  if (valueElem.vr == 'DA') {
811
833
  return this.compareDateRange(testValue, valueElem.Value[0]);
812
834
  }
@@ -867,8 +889,12 @@ const getDirectURL = (config, params) => {
867
889
  singlepart: fetchPart = 'video'
868
890
  } = params;
869
891
  const value = instance[tag];
870
- if (!value) return undefined;
871
- if (value.DirectRetrieveURL) return value.DirectRetrieveURL;
892
+ if (!value) {
893
+ return undefined;
894
+ }
895
+ if (value.DirectRetrieveURL) {
896
+ return value.DirectRetrieveURL;
897
+ }
872
898
  if (value.InlineBinary) {
873
899
  const blob = src.utils.b64toBlob(value.InlineBinary, defaultType);
874
900
  value.DirectRetrieveURL = URL.createObjectURL(blob);
@@ -991,65 +1017,69 @@ const metadataProvider = src.classes.MetadataProvider;
991
1017
  * @param {string|bool} singlepart - indicates of the retrieves can fetch singlepart. Options are bulkdata, video, image or boolean true
992
1018
  */
993
1019
  function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
994
- const {
995
- qidoRoot,
996
- wadoRoot,
997
- enableStudyLazyLoad,
998
- supportsFuzzyMatching,
999
- supportsWildcard,
1000
- supportsReject,
1001
- staticWado,
1002
- singlepart
1003
- } = dicomWebConfig;
1004
- const dicomWebConfigCopy = JSON.parse(JSON.stringify(dicomWebConfig));
1005
- const qidoConfig = {
1006
- url: qidoRoot,
1007
- staticWado,
1008
- singlepart,
1009
- headers: userAuthenticationService.getAuthorizationHeader(),
1010
- errorInterceptor: src/* errorHandler */.Po.getHTTPErrorHandler()
1011
- };
1012
- const wadoConfig = {
1013
- url: wadoRoot,
1014
- staticWado,
1015
- singlepart,
1016
- headers: userAuthenticationService.getAuthorizationHeader(),
1017
- errorInterceptor: src/* errorHandler */.Po.getHTTPErrorHandler()
1018
- };
1019
-
1020
- // TODO -> Two clients sucks, but its better than 1000.
1021
- // TODO -> We'll need to merge auth later.
1022
- const qidoDicomWebClient = staticWado ? new StaticWadoClient(qidoConfig) : new dicomweb_client_es.api.DICOMwebClient(qidoConfig);
1023
- const wadoDicomWebClient = staticWado ? new StaticWadoClient(wadoConfig) : new dicomweb_client_es.api.DICOMwebClient(wadoConfig);
1020
+ let dicomWebConfigCopy, qidoConfig, wadoConfig, qidoDicomWebClient, wadoDicomWebClient, getAuthrorizationHeader, generateWadoHeader;
1024
1021
  const implementation = {
1025
1022
  initialize: _ref => {
1026
1023
  let {
1027
1024
  params,
1028
1025
  query
1029
1026
  } = _ref;
1030
- const {
1031
- StudyInstanceUIDs: paramsStudyInstanceUIDs
1032
- } = params;
1033
- const queryStudyInstanceUIDs = src.utils.splitComma(query.getAll('StudyInstanceUIDs'));
1034
- const StudyInstanceUIDs = queryStudyInstanceUIDs.length && queryStudyInstanceUIDs || paramsStudyInstanceUIDs;
1035
- const StudyInstanceUIDsAsArray = StudyInstanceUIDs && Array.isArray(StudyInstanceUIDs) ? StudyInstanceUIDs : [StudyInstanceUIDs];
1036
- return StudyInstanceUIDsAsArray;
1027
+ if (dicomWebConfig.onConfiguration && typeof dicomWebConfig.onConfiguration === 'function') {
1028
+ dicomWebConfig = dicomWebConfig.onConfiguration(dicomWebConfig, {
1029
+ params,
1030
+ query
1031
+ });
1032
+ }
1033
+ dicomWebConfigCopy = JSON.parse(JSON.stringify(dicomWebConfig));
1034
+ getAuthrorizationHeader = () => {
1035
+ const xhrRequestHeaders = {};
1036
+ const authHeaders = userAuthenticationService.getAuthorizationHeader();
1037
+ if (authHeaders && authHeaders.Authorization) {
1038
+ xhrRequestHeaders.Authorization = authHeaders.Authorization;
1039
+ }
1040
+ return xhrRequestHeaders;
1041
+ };
1042
+ generateWadoHeader = () => {
1043
+ let authorizationHeader = getAuthrorizationHeader();
1044
+ //Generate accept header depending on config params
1045
+ let formattedAcceptHeader = src.utils.generateAcceptHeader(dicomWebConfig.acceptHeader, dicomWebConfig.requestTransferSyntaxUID, dicomWebConfig.omitQuotationForMultipartRequest);
1046
+ return {
1047
+ ...authorizationHeader,
1048
+ Accept: formattedAcceptHeader
1049
+ };
1050
+ };
1051
+ qidoConfig = {
1052
+ url: dicomWebConfig.qidoRoot,
1053
+ staticWado: dicomWebConfig.staticWado,
1054
+ singlepart: dicomWebConfig.singlepart,
1055
+ headers: userAuthenticationService.getAuthorizationHeader(),
1056
+ errorInterceptor: src/* errorHandler */.Po.getHTTPErrorHandler()
1057
+ };
1058
+ wadoConfig = {
1059
+ url: dicomWebConfig.wadoRoot,
1060
+ staticWado: dicomWebConfig.staticWado,
1061
+ singlepart: dicomWebConfig.singlepart,
1062
+ headers: userAuthenticationService.getAuthorizationHeader(),
1063
+ errorInterceptor: src/* errorHandler */.Po.getHTTPErrorHandler()
1064
+ };
1065
+
1066
+ // TODO -> Two clients sucks, but its better than 1000.
1067
+ // TODO -> We'll need to merge auth later.
1068
+ qidoDicomWebClient = dicomWebConfig.staticWado ? new StaticWadoClient(qidoConfig) : new dicomweb_client_es.api.DICOMwebClient(qidoConfig);
1069
+ wadoDicomWebClient = dicomWebConfig.staticWado ? new StaticWadoClient(wadoConfig) : new dicomweb_client_es.api.DICOMwebClient(wadoConfig);
1037
1070
  },
1038
1071
  query: {
1039
1072
  studies: {
1040
1073
  mapParams: mapParams.bind(),
1041
1074
  search: async function (origParams) {
1042
- const headers = userAuthenticationService.getAuthorizationHeader();
1043
- if (headers) {
1044
- qidoDicomWebClient.headers = headers;
1045
- }
1075
+ qidoDicomWebClient.headers = getAuthrorizationHeader();
1046
1076
  const {
1047
1077
  studyInstanceUid,
1048
1078
  seriesInstanceUid,
1049
1079
  ...mappedParams
1050
1080
  } = mapParams(origParams, {
1051
- supportsFuzzyMatching,
1052
- supportsWildcard
1081
+ supportsFuzzyMatching: dicomWebConfig.supportsFuzzyMatching,
1082
+ supportsWildcard: dicomWebConfig.supportsWildcard
1053
1083
  }) || {};
1054
1084
  const results = await search(qidoDicomWebClient, undefined, undefined, mappedParams);
1055
1085
  return processResults(results);
@@ -1059,10 +1089,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
1059
1089
  series: {
1060
1090
  // mapParams: mapParams.bind(),
1061
1091
  search: async function (studyInstanceUid) {
1062
- const headers = userAuthenticationService.getAuthorizationHeader();
1063
- if (headers) {
1064
- qidoDicomWebClient.headers = headers;
1065
- }
1092
+ qidoDicomWebClient.headers = getAuthrorizationHeader();
1066
1093
  const results = await seriesInStudy(qidoDicomWebClient, studyInstanceUid);
1067
1094
  return processSeriesResults(results);
1068
1095
  }
@@ -1071,10 +1098,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
1071
1098
 
1072
1099
  instances: {
1073
1100
  search: (studyInstanceUid, queryParameters) => {
1074
- const headers = userAuthenticationService.getAuthorizationHeader();
1075
- if (headers) {
1076
- qidoDicomWebClient.headers = headers;
1077
- }
1101
+ qidoDicomWebClient.headers = getAuthrorizationHeader();
1078
1102
  search.call(undefined, qidoDicomWebClient, studyInstanceUid, null, queryParameters);
1079
1103
  }
1080
1104
  }
@@ -1093,8 +1117,8 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
1093
1117
  */
1094
1118
  directURL: params => {
1095
1119
  return utils_getDirectURL({
1096
- wadoRoot,
1097
- singlepart
1120
+ wadoRoot: dicomWebConfig.wadoRoot,
1121
+ singlepart: dicomWebConfig.singlepart
1098
1122
  }, params);
1099
1123
  },
1100
1124
  bulkDataURI: async _ref2 => {
@@ -1102,6 +1126,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
1102
1126
  StudyInstanceUID,
1103
1127
  BulkDataURI
1104
1128
  } = _ref2;
1129
+ qidoDicomWebClient.headers = getAuthrorizationHeader();
1105
1130
  const options = {
1106
1131
  multipart: false,
1107
1132
  BulkDataURI,
@@ -1121,14 +1146,10 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
1121
1146
  sortFunction,
1122
1147
  madeInClient = false
1123
1148
  } = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
1124
- const headers = userAuthenticationService.getAuthorizationHeader();
1125
- if (headers) {
1126
- wadoDicomWebClient.headers = headers;
1127
- }
1128
1149
  if (!StudyInstanceUID) {
1129
1150
  throw new Error('Unable to query for SeriesMetadata without StudyInstanceUID');
1130
1151
  }
1131
- if (enableStudyLazyLoad) {
1152
+ if (dicomWebConfig.enableStudyLazyLoad) {
1132
1153
  return implementation._retrieveSeriesMetadataAsync(StudyInstanceUID, filters, sortCriteria, sortFunction, madeInClient);
1133
1154
  }
1134
1155
  return implementation._retrieveSeriesMetadataSync(StudyInstanceUID, filters, sortCriteria, sortFunction, madeInClient);
@@ -1137,10 +1158,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
1137
1158
  },
1138
1159
  store: {
1139
1160
  dicom: async (dataset, request) => {
1140
- const headers = userAuthenticationService.getAuthorizationHeader();
1141
- if (headers) {
1142
- wadoDicomWebClient.headers = headers;
1143
- }
1161
+ wadoDicomWebClient.headers = getAuthrorizationHeader();
1144
1162
  if (dataset instanceof ArrayBuffer) {
1145
1163
  const options = {
1146
1164
  datasets: [dataset],
@@ -1170,7 +1188,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
1170
1188
  },
1171
1189
  _retrieveSeriesMetadataSync: async (StudyInstanceUID, filters, sortCriteria, sortFunction, madeInClient) => {
1172
1190
  const enableStudyLazyLoad = false;
1173
-
1191
+ wadoDicomWebClient.headers = generateWadoHeader();
1174
1192
  // data is all SOPInstanceUIDs
1175
1193
  const data = await retrieveStudyMetadata(wadoDicomWebClient, StudyInstanceUID, enableStudyLazyLoad, filters, sortCriteria, sortFunction);
1176
1194
 
@@ -1215,6 +1233,7 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
1215
1233
  _retrieveSeriesMetadataAsync: async function (StudyInstanceUID, filters, sortCriteria, sortFunction) {
1216
1234
  let madeInClient = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
1217
1235
  const enableStudyLazyLoad = true;
1236
+ wadoDicomWebClient.headers = generateWadoHeader();
1218
1237
  // Get Series
1219
1238
  const {
1220
1239
  preLoadData: seriesSummaryMetadata,
@@ -1356,10 +1375,23 @@ function createDicomWebApi(dicomWebConfig, userAuthenticationService) {
1356
1375
  },
1357
1376
  getConfig() {
1358
1377
  return dicomWebConfigCopy;
1378
+ },
1379
+ getStudyInstanceUIDs(_ref4) {
1380
+ let {
1381
+ params,
1382
+ query
1383
+ } = _ref4;
1384
+ const {
1385
+ StudyInstanceUIDs: paramsStudyInstanceUIDs
1386
+ } = params;
1387
+ const queryStudyInstanceUIDs = src.utils.splitComma(query.getAll('StudyInstanceUIDs'));
1388
+ const StudyInstanceUIDs = queryStudyInstanceUIDs.length && queryStudyInstanceUIDs || paramsStudyInstanceUIDs;
1389
+ const StudyInstanceUIDsAsArray = StudyInstanceUIDs && Array.isArray(StudyInstanceUIDs) ? StudyInstanceUIDs : [StudyInstanceUIDs];
1390
+ return StudyInstanceUIDsAsArray;
1359
1391
  }
1360
1392
  };
1361
- if (supportsReject) {
1362
- implementation.reject = dcm4cheeReject(wadoRoot);
1393
+ if (dicomWebConfig.supportsReject) {
1394
+ implementation.reject = dcm4cheeReject(dicomWebConfig.wadoRoot);
1363
1395
  }
1364
1396
  return src/* IWebApiDataSource */.Is.create(implementation);
1365
1397
  }
@@ -1375,7 +1407,8 @@ const mappings = {
1375
1407
  patientId: 'PatientID'
1376
1408
  };
1377
1409
  let _store = {
1378
- urls: []
1410
+ urls: [],
1411
+ studyInstanceUIDMap: new Map() // map of urls to array of study instance UIDs
1379
1412
  // {
1380
1413
  // url: url1
1381
1414
  // studies: [Study1, Study2], // if multiple studies
@@ -1403,17 +1436,17 @@ const findStudies = (key, value) => {
1403
1436
  };
1404
1437
  function createDicomJSONApi(dicomJsonConfig) {
1405
1438
  const {
1406
- name,
1407
1439
  wadoRoot
1408
1440
  } = dicomJsonConfig;
1409
1441
  const implementation = {
1410
1442
  initialize: async _ref => {
1411
1443
  let {
1412
- params,
1413
1444
  query,
1414
1445
  url
1415
1446
  } = _ref;
1416
- if (!url) url = query.get('url');
1447
+ if (!url) {
1448
+ url = query.get('url');
1449
+ }
1417
1450
  let metaData = getMetaDataByURL(url);
1418
1451
 
1419
1452
  // if we have already cached the data from this specific url
@@ -1425,8 +1458,7 @@ function createDicomJSONApi(dicomJsonConfig) {
1425
1458
  });
1426
1459
  }
1427
1460
  const response = await fetch(url);
1428
- let data = await response.json();
1429
- const studyInstanceUIDs = data.studies.map(study => study.StudyInstanceUID);
1461
+ const data = await response.json();
1430
1462
  let StudyInstanceUID;
1431
1463
  let SeriesInstanceUID;
1432
1464
  data.studies.forEach(study => {
@@ -1452,7 +1484,7 @@ function createDicomJSONApi(dicomJsonConfig) {
1452
1484
  url,
1453
1485
  studies: [...data.studies]
1454
1486
  });
1455
- return studyInstanceUIDs;
1487
+ _store.studyInstanceUIDMap.set(url, data.studies.map(study => study.StudyInstanceUID));
1456
1488
  },
1457
1489
  query: {
1458
1490
  studies: {
@@ -1561,7 +1593,9 @@ function createDicomJSONApi(dicomJsonConfig) {
1561
1593
  return obj;
1562
1594
  });
1563
1595
  storeInstances(instances);
1564
- if (index === numberOfSeries - 1) setSuccessFlag();
1596
+ if (index === numberOfSeries - 1) {
1597
+ setSuccessFlag();
1598
+ }
1565
1599
  });
1566
1600
  }
1567
1601
  }
@@ -1608,6 +1642,14 @@ function createDicomJSONApi(dicomJsonConfig) {
1608
1642
  frame
1609
1643
  });
1610
1644
  return imageIds;
1645
+ },
1646
+ getStudyInstanceUIDs: _ref3 => {
1647
+ let {
1648
+ params,
1649
+ query
1650
+ } = _ref3;
1651
+ const url = query.get('url');
1652
+ return _store.studyInstanceUIDMap.get(url);
1611
1653
  }
1612
1654
  };
1613
1655
  return src/* IWebApiDataSource */.Is.create(implementation);
@@ -1628,8 +1670,12 @@ const END_MODALITIES = {
1628
1670
  };
1629
1671
  const compareValue = function (v1, v2) {
1630
1672
  let def = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 0;
1631
- if (v1 === v2) return def;
1632
- if (v1 < v2) return -1;
1673
+ if (v1 === v2) {
1674
+ return def;
1675
+ }
1676
+ if (v1 < v2) {
1677
+ return -1;
1678
+ }
1633
1679
  return 1;
1634
1680
  };
1635
1681
 
@@ -1660,19 +1706,6 @@ function createDicomLocalApi(dicomLocalConfig) {
1660
1706
  params,
1661
1707
  query
1662
1708
  } = _ref;
1663
- const {
1664
- StudyInstanceUIDs: paramsStudyInstanceUIDs
1665
- } = params;
1666
- const queryStudyInstanceUIDs = query.getAll('StudyInstanceUIDs');
1667
- const StudyInstanceUIDs = queryStudyInstanceUIDs || paramsStudyInstanceUIDs;
1668
- const StudyInstanceUIDsAsArray = StudyInstanceUIDs && Array.isArray(StudyInstanceUIDs) ? StudyInstanceUIDs : [StudyInstanceUIDs];
1669
-
1670
- // Put SRs at the end of series list to make sure images are loaded first
1671
- StudyInstanceUIDsAsArray.forEach(StudyInstanceUID => {
1672
- const study = src.DicomMetadataStore.getStudy(StudyInstanceUID);
1673
- study.series = study.series.sort(customSort);
1674
- });
1675
- return StudyInstanceUIDsAsArray;
1676
1709
  },
1677
1710
  query: {
1678
1711
  studies: {
@@ -1854,6 +1887,29 @@ function createDicomLocalApi(dicomLocalConfig) {
1854
1887
  },
1855
1888
  deleteStudyMetadataPromise() {
1856
1889
  console.log('deleteStudyMetadataPromise not implemented');
1890
+ },
1891
+ getStudyInstanceUIDs: _ref3 => {
1892
+ let {
1893
+ params,
1894
+ query
1895
+ } = _ref3;
1896
+ const {
1897
+ StudyInstanceUIDs: paramsStudyInstanceUIDs
1898
+ } = params;
1899
+ const queryStudyInstanceUIDs = query.getAll('StudyInstanceUIDs');
1900
+ const StudyInstanceUIDs = queryStudyInstanceUIDs || paramsStudyInstanceUIDs;
1901
+ const StudyInstanceUIDsAsArray = StudyInstanceUIDs && Array.isArray(StudyInstanceUIDs) ? StudyInstanceUIDs : [StudyInstanceUIDs];
1902
+
1903
+ // Put SRs at the end of series list to make sure images are loaded first
1904
+ let isStudyInCache = false;
1905
+ StudyInstanceUIDsAsArray.forEach(StudyInstanceUID => {
1906
+ const study = src.DicomMetadataStore.getStudy(StudyInstanceUID);
1907
+ if (study) {
1908
+ study.series = study.series.sort(customSort);
1909
+ isStudyInCache = true;
1910
+ }
1911
+ });
1912
+ return isStudyInCache ? StudyInstanceUIDsAsArray : [];
1857
1913
  }
1858
1914
  };
1859
1915
  return src/* IWebApiDataSource */.Is.create(implementation);
@@ -1882,13 +1938,6 @@ function createDicomWebProxyApi(dicomWebProxyConfig, UserAuthenticationService)
1882
1938
  params,
1883
1939
  query
1884
1940
  } = _ref;
1885
- let studyInstanceUIDs = [];
1886
-
1887
- // there seem to be a couple of variations of the case for this parameter
1888
- const queryStudyInstanceUIDs = query.get('studyInstanceUIDs') || query.get('studyInstanceUids');
1889
- if (!queryStudyInstanceUIDs) {
1890
- throw new Error(`No studyInstanceUids in request for '${name}'`);
1891
- }
1892
1941
  const url = query.get('url');
1893
1942
  if (!url) {
1894
1943
  throw new Error(`No url for '${name}'`);
@@ -1898,10 +1947,12 @@ function createDicomWebProxyApi(dicomWebProxyConfig, UserAuthenticationService)
1898
1947
  if (!data.servers?.dicomWeb?.[0]) {
1899
1948
  throw new Error('Invalid configuration returned by url');
1900
1949
  }
1901
- dicomWebDelegate = createDicomWebApi(data.servers.dicomWeb[0], UserAuthenticationService);
1902
- studyInstanceUIDs = queryStudyInstanceUIDs.split(';');
1950
+ dicomWebDelegate = createDicomWebApi(data.servers.dicomWeb[0].configuration, UserAuthenticationService);
1951
+ dicomWebDelegate.initialize({
1952
+ params,
1953
+ query
1954
+ });
1903
1955
  }
1904
- return studyInstanceUIDs;
1905
1956
  },
1906
1957
  query: {
1907
1958
  studies: {
@@ -1939,6 +1990,21 @@ function createDicomWebProxyApi(dicomWebProxyConfig, UserAuthenticationService)
1939
1990
  },
1940
1991
  getImageIdsForInstance: function () {
1941
1992
  return dicomWebDelegate.getImageIdsForInstance(...arguments);
1993
+ },
1994
+ getStudyInstanceUIDs(_ref2) {
1995
+ let {
1996
+ params,
1997
+ query
1998
+ } = _ref2;
1999
+ let studyInstanceUIDs = [];
2000
+
2001
+ // there seem to be a couple of variations of the case for this parameter
2002
+ const queryStudyInstanceUIDs = query.get('studyInstanceUIDs') || query.get('studyInstanceUids');
2003
+ if (!queryStudyInstanceUIDs) {
2004
+ throw new Error(`No studyInstanceUids in request for '${name}'`);
2005
+ }
2006
+ studyInstanceUIDs = queryStudyInstanceUIDs.split(';');
2007
+ return studyInstanceUIDs;
1942
2008
  }
1943
2009
  };
1944
2010
  return src/* IWebApiDataSource */.Is.create(implementation);
@@ -1978,24 +2044,24 @@ function getDataSourcesModule() {
1978
2044
  }
1979
2045
  /* harmony default export */ const src_getDataSourcesModule = (getDataSourcesModule);
1980
2046
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
1981
- var react = __webpack_require__(32735);
2047
+ var react = __webpack_require__(43001);
1982
2048
  // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
1983
- var prop_types = __webpack_require__(60216);
2049
+ var prop_types = __webpack_require__(3827);
1984
2050
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
1985
2051
  // EXTERNAL MODULE: ../node_modules/react-router-dom/dist/index.js
1986
- var dist = __webpack_require__(65783);
2052
+ var dist = __webpack_require__(62474);
1987
2053
  // EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
1988
- var es = __webpack_require__(21572);
2054
+ var es = __webpack_require__(69190);
1989
2055
  // EXTERNAL MODULE: ../node_modules/react-router/dist/index.js
1990
- var react_router_dist = __webpack_require__(14935);
1991
- // EXTERNAL MODULE: ../../ui/src/index.js + 452 modules
1992
- var ui_src = __webpack_require__(28619);
1993
- // EXTERNAL MODULE: ../../i18n/src/index.js + 95 modules
1994
- var i18n_src = __webpack_require__(93058);
2056
+ var react_router_dist = __webpack_require__(85066);
2057
+ // EXTERNAL MODULE: ../../ui/src/index.js + 456 modules
2058
+ var ui_src = __webpack_require__(60082);
2059
+ // EXTERNAL MODULE: ../../i18n/src/index.js + 97 modules
2060
+ var i18n_src = __webpack_require__(24908);
1995
2061
  // EXTERNAL MODULE: ./state/index.js + 1 modules
1996
- var state = __webpack_require__(22896);
2062
+ var state = __webpack_require__(62657);
1997
2063
  // EXTERNAL MODULE: ../../../node_modules/classnames/index.js
1998
- var classnames = __webpack_require__(40841);
2064
+ var classnames = __webpack_require__(44921);
1999
2065
  var classnames_default = /*#__PURE__*/__webpack_require__.n(classnames);
2000
2066
  ;// CONCATENATED MODULE: ../../../extensions/default/src/Toolbar/Toolbar.tsx
2001
2067
  function _extends() { _extends = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); }
@@ -2030,7 +2096,7 @@ function Toolbar(_ref) {
2030
2096
  unsub2();
2031
2097
  };
2032
2098
  }, [toolbarService]);
2033
- return /*#__PURE__*/react.createElement(react.Fragment, null, toolbarButtons.map((toolDef, index) => {
2099
+ return /*#__PURE__*/react.createElement(react.Fragment, null, toolbarButtons.map(toolDef => {
2034
2100
  const {
2035
2101
  id,
2036
2102
  Component,
@@ -2116,8 +2182,10 @@ function ViewerLayout(_ref) {
2116
2182
  // Todo: Handle parameters in a better way.
2117
2183
  const query = new URLSearchParams(window.location.search);
2118
2184
  const configUrl = query.get('configUrl');
2185
+ const dataSourceName = pathname.substring(dataSourceIdx + 1);
2186
+ const existingDataSource = extensionManager.getDataSources(dataSourceName);
2119
2187
  const searchQuery = new URLSearchParams();
2120
- if (dataSourceIdx !== -1) {
2188
+ if (dataSourceIdx !== -1 && existingDataSource) {
2121
2189
  searchQuery.append('datasources', pathname.substring(dataSourceIdx + 1));
2122
2190
  }
2123
2191
  if (configUrl) {
@@ -2143,8 +2211,8 @@ function ViewerLayout(_ref) {
2143
2211
  hotkeyDefinitions,
2144
2212
  hotkeyDefaults
2145
2213
  } = hotkeysManager;
2146
- const versionNumber = "3.7.0-beta.5";
2147
- const commitHash = "cc73f15c8ce3bf562081611e7a54ff4c3b9ef4f5";
2214
+ const versionNumber = "3.7.0-beta.50";
2215
+ const commitHash = "19408c987fa705aa8782a30820c0c012d0f3132f";
2148
2216
  const menuOptions = [{
2149
2217
  title: t('Header:About'),
2150
2218
  icon: 'info',
@@ -2364,6 +2432,7 @@ ViewerLayout.propTypes = {
2364
2432
 
2365
2433
 
2366
2434
 
2435
+
2367
2436
  const {
2368
2437
  sortStudyInstances,
2369
2438
  formatDate
@@ -2386,6 +2455,8 @@ function PanelStudyBrowser(_ref) {
2386
2455
  displaySetService,
2387
2456
  uiNotificationService
2388
2457
  } = servicesManager.services;
2458
+ const navigate = (0,dist/* useNavigate */.s0)();
2459
+
2389
2460
  // Normally you nest the components so the tree isn't so deep, and the data
2390
2461
  // doesn't have to have such an intense shape. This works well enough for now.
2391
2462
  // Tabs --> Studies --> DisplaySets --> Thumbnails
@@ -2427,6 +2498,10 @@ function PanelStudyBrowser(_ref) {
2427
2498
  const qidoForStudyUID = await dataSource.query.studies.search({
2428
2499
  studyInstanceUid: StudyInstanceUID
2429
2500
  });
2501
+ if (!qidoForStudyUID?.length) {
2502
+ navigate('/notfoundstudy', '_self');
2503
+ throw new Error('Invalid study URL');
2504
+ }
2430
2505
  let qidoStudiesForPatient = qidoForStudyUID;
2431
2506
 
2432
2507
  // try to fetch the prior studies based on the patientID if the
@@ -2617,6 +2692,7 @@ function _mapDisplaySets(displaySets, thumbnailImageSrcMap) {
2617
2692
  numInstances: ds.numImageFrames,
2618
2693
  countIcon: ds.countIcon,
2619
2694
  StudyInstanceUID: ds.StudyInstanceUID,
2695
+ messages: ds.messages,
2620
2696
  componentType,
2621
2697
  imageSrc,
2622
2698
  dragData: {
@@ -2819,7 +2895,7 @@ ActionButtons.defaultProps = {
2819
2895
  };
2820
2896
  /* harmony default export */ const Panels_ActionButtons = (ActionButtons);
2821
2897
  // EXTERNAL MODULE: ../../../node_modules/lodash.debounce/index.js
2822
- var lodash_debounce = __webpack_require__(40001);
2898
+ var lodash_debounce = __webpack_require__(8324);
2823
2899
  var lodash_debounce_default = /*#__PURE__*/__webpack_require__.n(lodash_debounce);
2824
2900
  ;// CONCATENATED MODULE: ../../../extensions/default/src/Panels/createReportDialogPrompt.tsx
2825
2901
  /* eslint-disable react/display-name */
@@ -3336,7 +3412,9 @@ function _mapMeasurementToDisplay(measurement, index, types) {
3336
3412
  if (findingSites) {
3337
3413
  const siteText = [];
3338
3414
  findingSites.forEach(site => {
3339
- if (site?.text !== label) siteText.push(site.text);
3415
+ if (site?.text !== label) {
3416
+ siteText.push(site.text);
3417
+ }
3340
3418
  });
3341
3419
  displayText = [...siteText, ...displayText];
3342
3420
  }
@@ -3403,25 +3481,297 @@ function getPanelModule(_ref) {
3403
3481
  }
3404
3482
  /* harmony default export */ const src_getPanelModule = (getPanelModule);
3405
3483
  // EXTERNAL MODULE: ../../core/src/utils/isImage.js
3406
- var isImage = __webpack_require__(81596);
3484
+ var isImage = __webpack_require__(11835);
3407
3485
  // EXTERNAL MODULE: ../../core/src/utils/sopClassDictionary.js
3408
- var sopClassDictionary = __webpack_require__(32746);
3486
+ var sopClassDictionary = __webpack_require__(24369);
3409
3487
  // EXTERNAL MODULE: ../../core/src/classes/ImageSet.ts
3410
- var ImageSet = __webpack_require__(4797);
3488
+ var ImageSet = __webpack_require__(13950);
3411
3489
  // EXTERNAL MODULE: ../../core/src/utils/isDisplaySetReconstructable.js
3412
- var isDisplaySetReconstructable = __webpack_require__(51227);
3490
+ var isDisplaySetReconstructable = __webpack_require__(89359);
3413
3491
  ;// CONCATENATED MODULE: ../../../extensions/default/package.json
3414
3492
  const package_namespaceObject = JSON.parse('{"u2":"@ohif/extension-default"}');
3415
3493
  ;// CONCATENATED MODULE: ../../../extensions/default/src/id.js
3416
3494
 
3417
3495
  const id = package_namespaceObject.u2;
3418
3496
 
3497
+ // EXTERNAL MODULE: ../../core/src/utils/sortInstancesByPosition.ts
3498
+ var sortInstancesByPosition = __webpack_require__(87425);
3499
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/utils/validations/checkMultiframe.ts
3500
+
3501
+
3502
+
3503
+ /**
3504
+ * Check various multi frame issues. It calls OHIF core functions
3505
+ * @param {*} multiFrameInstance
3506
+ * @param {*} warnings
3507
+ */
3508
+ function checkMultiFrame(multiFrameInstance, messages) {
3509
+ if (!(0,isDisplaySetReconstructable/* hasPixelMeasurements */.hu)(multiFrameInstance)) {
3510
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.MULTIFRAME_NO_PIXEL_MEASUREMENTS);
3511
+ }
3512
+ if (!(0,isDisplaySetReconstructable/* hasOrientation */.sb)(multiFrameInstance)) {
3513
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.MULTIFRAME_NO_ORIENTATION);
3514
+ }
3515
+ if (!(0,isDisplaySetReconstructable/* hasPosition */.kN)(multiFrameInstance)) {
3516
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.MULTIFRAME_NO_POSITION_INFORMATION);
3517
+ }
3518
+ }
3519
+ // EXTERNAL MODULE: ../../core/src/utils/toNumber.js
3520
+ var toNumber = __webpack_require__(94972);
3521
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/utils/validations/areAllImageDimensionsEqual.ts
3522
+
3523
+
3524
+ /**
3525
+ * Check if the frames in a series has different dimensions
3526
+ * @param {*} instances
3527
+ * @returns
3528
+ */
3529
+ function areAllImageDimensionsEqual(instances) {
3530
+ if (!instances?.length) {
3531
+ return false;
3532
+ }
3533
+ const firstImage = instances[0];
3534
+ const firstImageRows = (0,toNumber/* default */.Z)(firstImage.Rows);
3535
+ const firstImageColumns = (0,toNumber/* default */.Z)(firstImage.Columns);
3536
+ for (let i = 1; i < instances.length; i++) {
3537
+ const instance = instances[i];
3538
+ const {
3539
+ Rows,
3540
+ Columns
3541
+ } = instance;
3542
+ if (Rows !== firstImageRows || Columns !== firstImageColumns) {
3543
+ return false;
3544
+ }
3545
+ }
3546
+ return true;
3547
+ }
3548
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/utils/validations/areAllImageComponentsEqual.ts
3549
+
3550
+
3551
+ /**
3552
+ * Check if all voxels in series images has same number of components (samplesPerPixel)
3553
+ * @param {*} instances
3554
+ * @returns
3555
+ */
3556
+ function areAllImageComponentsEqual(instances) {
3557
+ if (!instances?.length) {
3558
+ return false;
3559
+ }
3560
+ const firstImage = instances[0];
3561
+ const firstImageSamplesPerPixel = (0,toNumber/* default */.Z)(firstImage.SamplesPerPixel);
3562
+ for (let i = 1; i < instances.length; i++) {
3563
+ const instance = instances[i];
3564
+ const {
3565
+ SamplesPerPixel
3566
+ } = instance;
3567
+ if (SamplesPerPixel !== firstImageSamplesPerPixel) {
3568
+ return false;
3569
+ }
3570
+ }
3571
+ return true;
3572
+ }
3573
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/utils/validations/areAllImageOrientationsEqual.ts
3574
+
3575
+
3576
+
3577
+ /**
3578
+ * Check is the series has frames with different orientations
3579
+ * @param {*} instances
3580
+ * @returns
3581
+ */
3582
+ function areAllImageOrientationsEqual(instances) {
3583
+ if (!instances?.length) {
3584
+ return false;
3585
+ }
3586
+ const firstImage = instances[0];
3587
+ const firstImageOrientationPatient = (0,toNumber/* default */.Z)(firstImage.ImageOrientationPatient);
3588
+ for (let i = 1; i < instances.length; i++) {
3589
+ const instance = instances[i];
3590
+ const imageOrientationPatient = (0,toNumber/* default */.Z)(instance.ImageOrientationPatient);
3591
+ if (!(0,isDisplaySetReconstructable/* _isSameOrientation */.NB)(imageOrientationPatient, firstImageOrientationPatient)) {
3592
+ return false;
3593
+ }
3594
+ }
3595
+ return true;
3596
+ }
3597
+ // EXTERNAL MODULE: ../../../node_modules/gl-matrix/esm/index.js + 10 modules
3598
+ var esm = __webpack_require__(45451);
3599
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/utils/calculateScanAxisNormal.ts
3600
+
3601
+
3602
+ /**
3603
+ * Calculates the scanAxisNormal based on a image orientation vector extract from a frame
3604
+ * @param {*} imageOrientation
3605
+ * @returns
3606
+ */
3607
+ function calculateScanAxisNormal(imageOrientation) {
3608
+ const rowCosineVec = esm/* vec3.fromValues */.R3.fromValues(imageOrientation[0], imageOrientation[1], imageOrientation[2]);
3609
+ const colCosineVec = esm/* vec3.fromValues */.R3.fromValues(imageOrientation[3], imageOrientation[4], imageOrientation[5]);
3610
+ return esm/* vec3.cross */.R3.cross(esm/* vec3.create */.R3.create(), rowCosineVec, colCosineVec);
3611
+ }
3612
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/utils/validations/areAllImagePositionsEqual.ts
3613
+
3614
+
3615
+
3616
+
3617
+
3618
+ /**
3619
+ * Checks if there is a position shift between consecutive frames
3620
+ * @param {*} previousPosition
3621
+ * @param {*} actualPosition
3622
+ * @param {*} scanAxisNormal
3623
+ * @param {*} averageSpacingBetweenFrames
3624
+ * @returns
3625
+ */
3626
+ function _checkSeriesPositionShift(previousPosition, actualPosition, scanAxisNormal, averageSpacingBetweenFrames) {
3627
+ // predicted position should be the previous position added by the multiplication
3628
+ // of the scanAxisNormal and the average spacing between frames
3629
+ const predictedPosition = esm/* vec3.scaleAndAdd */.R3.scaleAndAdd(esm/* vec3.create */.R3.create(), previousPosition, scanAxisNormal, averageSpacingBetweenFrames);
3630
+ return esm/* vec3.distance */.R3.distance(actualPosition, predictedPosition) > averageSpacingBetweenFrames;
3631
+ }
3632
+
3633
+ /**
3634
+ * Checks if a series has position shifts between consecutive frames
3635
+ * @param {*} instances
3636
+ * @returns
3637
+ */
3638
+ function areAllImagePositionsEqual(instances) {
3639
+ if (!instances?.length) {
3640
+ return false;
3641
+ }
3642
+ const firstImageOrientationPatient = (0,toNumber/* default */.Z)(instances[0].ImageOrientationPatient);
3643
+ const scanAxisNormal = calculateScanAxisNormal(firstImageOrientationPatient);
3644
+ const firstImagePositionPatient = (0,toNumber/* default */.Z)(instances[0].ImagePositionPatient);
3645
+ const lastIpp = (0,toNumber/* default */.Z)(instances[instances.length - 1].ImagePositionPatient);
3646
+ const averageSpacingBetweenFrames = (0,isDisplaySetReconstructable/* _getPerpendicularDistance */.Xn)(firstImagePositionPatient, lastIpp) / (instances.length - 1);
3647
+ let previousImagePositionPatient = firstImagePositionPatient;
3648
+ for (let i = 1; i < instances.length; i++) {
3649
+ const instance = instances[i];
3650
+ const imagePositionPatient = (0,toNumber/* default */.Z)(instance.ImagePositionPatient);
3651
+ if (_checkSeriesPositionShift(previousImagePositionPatient, imagePositionPatient, scanAxisNormal, averageSpacingBetweenFrames)) {
3652
+ return false;
3653
+ }
3654
+ previousImagePositionPatient = imagePositionPatient;
3655
+ }
3656
+ return true;
3657
+ }
3658
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/utils/validations/areAllImageSpacingEqual.ts
3659
+
3660
+
3661
+
3662
+ /**
3663
+ * Checks if series has spacing issues
3664
+ * @param {*} instances
3665
+ * @param {*} warnings
3666
+ */
3667
+ function areAllImageSpacingEqual(instances, messages) {
3668
+ if (!instances?.length) {
3669
+ return;
3670
+ }
3671
+ const firstImagePositionPatient = (0,toNumber/* default */.Z)(instances[0].ImagePositionPatient);
3672
+ const lastIpp = (0,toNumber/* default */.Z)(instances[instances.length - 1].ImagePositionPatient);
3673
+ const averageSpacingBetweenFrames = (0,isDisplaySetReconstructable/* _getPerpendicularDistance */.Xn)(firstImagePositionPatient, lastIpp) / (instances.length - 1);
3674
+ let previousImagePositionPatient = firstImagePositionPatient;
3675
+ const issuesFound = [];
3676
+ for (let i = 1; i < instances.length; i++) {
3677
+ const instance = instances[i];
3678
+ const imagePositionPatient = (0,toNumber/* default */.Z)(instance.ImagePositionPatient);
3679
+ const spacingBetweenFrames = (0,isDisplaySetReconstructable/* _getPerpendicularDistance */.Xn)(imagePositionPatient, previousImagePositionPatient);
3680
+ const spacingIssue = (0,isDisplaySetReconstructable/* _getSpacingIssue */.bg)(spacingBetweenFrames, averageSpacingBetweenFrames);
3681
+ if (spacingIssue) {
3682
+ const issue = spacingIssue.issue;
3683
+
3684
+ // avoid multiple warning of the same thing
3685
+ if (!issuesFound.includes(issue)) {
3686
+ issuesFound.push(issue);
3687
+ if (issue === isDisplaySetReconstructable/* reconstructionIssues */.e1.MISSING_FRAMES) {
3688
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.MISSING_FRAMES);
3689
+ } else if (issue === isDisplaySetReconstructable/* reconstructionIssues */.e1.IRREGULAR_SPACING) {
3690
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.IRREGULAR_SPACING);
3691
+ }
3692
+ }
3693
+ // we just want to find issues not how many
3694
+ if (issuesFound.length > 1) {
3695
+ break;
3696
+ }
3697
+ }
3698
+ previousImagePositionPatient = imagePositionPatient;
3699
+ }
3700
+ }
3701
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/utils/validations/checkSingleFrames.ts
3702
+
3703
+
3704
+
3705
+
3706
+
3707
+
3708
+
3709
+ /**
3710
+ * Runs various checks in a single frame series
3711
+ * @param {*} instances
3712
+ * @param {*} warnings
3713
+ */
3714
+ function checkSingleFrames(instances, messages) {
3715
+ if (instances.length > 2) {
3716
+ if (!areAllImageDimensionsEqual(instances)) {
3717
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.INCONSISTENT_DIMENSIONS);
3718
+ }
3719
+ if (!areAllImageComponentsEqual(instances)) {
3720
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.INCONSISTENT_COMPONENTS);
3721
+ }
3722
+ if (!areAllImageOrientationsEqual(instances)) {
3723
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.INCONSISTENT_ORIENTATIONS);
3724
+ }
3725
+ if (!areAllImagePositionsEqual(instances)) {
3726
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.INCONSISTENT_POSITION_INFORMATION);
3727
+ }
3728
+ areAllImageSpacingEqual(instances, messages);
3729
+ }
3730
+ }
3731
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/getDisplaySetMessages.ts
3732
+
3733
+
3734
+
3735
+
3736
+
3737
+ /**
3738
+ * Checks if a series is reconstructable to a 3D volume.
3739
+ *
3740
+ * @param {Object[]} instances An array of `OHIFInstanceMetadata` objects.
3741
+ */
3742
+ function getDisplaySetMessages(instances, isReconstructable) {
3743
+ const messages = new src/* DisplaySetMessageList */.iK();
3744
+ if (!instances.length) {
3745
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.NO_VALID_INSTANCES);
3746
+ }
3747
+ const firstInstance = instances[0];
3748
+ // Due to current requirements, LOCALIZER series doesn't have any messages
3749
+ if (firstInstance.ImageType.includes('LOCALIZER')) {
3750
+ return messages;
3751
+ }
3752
+ const Modality = firstInstance.Modality;
3753
+ if (!isDisplaySetReconstructable/* constructableModalities */.M6.includes(Modality)) {
3754
+ return messages;
3755
+ }
3756
+ const isMultiframe = firstInstance.NumberOfFrames > 1;
3757
+ // Can't reconstruct if all instances don't have the ImagePositionPatient.
3758
+ if (!isMultiframe && !instances.every(instance => instance.ImagePositionPatient)) {
3759
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.NO_POSITION_INFORMATION);
3760
+ }
3761
+ const sortedInstances = (0,sortInstancesByPosition/* default */.Z)(instances);
3762
+ isMultiframe ? checkMultiFrame(sortedInstances[0], messages) : checkSingleFrames(sortedInstances, messages);
3763
+ if (!isReconstructable) {
3764
+ messages.addMessage(src/* DisplaySetMessage */.Lt.CODES.NOT_RECONSTRUCTABLE);
3765
+ }
3766
+ return messages;
3767
+ }
3419
3768
  ;// CONCATENATED MODULE: ../../../extensions/default/src/getSopClassHandlerModule.js
3420
3769
 
3421
3770
 
3422
3771
 
3423
3772
 
3424
3773
 
3774
+
3425
3775
  const sopClassHandlerName = 'stack';
3426
3776
  const isMultiFrame = instance => {
3427
3777
  return instance.NumberOfFrames > 1;
@@ -3432,9 +3782,9 @@ const makeDisplaySet = instances => {
3432
3782
  const {
3433
3783
  value: isReconstructable,
3434
3784
  averageSpacingBetweenFrames
3435
- } = (0,isDisplaySetReconstructable/* default */.Z)(instances);
3436
-
3785
+ } = (0,isDisplaySetReconstructable/* default */.ZP)(instances);
3437
3786
  // set appropriate attributes to image set...
3787
+ const messages = getDisplaySetMessages(instances, isReconstructable);
3438
3788
  imageSet.setAttributes({
3439
3789
  displaySetInstanceUID: imageSet.uid,
3440
3790
  // create a local alias for the imageSet UID
@@ -3452,6 +3802,7 @@ const makeDisplaySet = instances => {
3452
3802
  numImageFrames: instances.length,
3453
3803
  SOPClassHandlerId: `${id}.sopClassHandlerModule.${sopClassHandlerName}`,
3454
3804
  isReconstructable,
3805
+ messages,
3455
3806
  averageSpacingBetweenFrames: averageSpacingBetweenFrames || null
3456
3807
  });
3457
3808
 
@@ -3856,7 +4207,7 @@ function adaptItem(item, subProps) {
3856
4207
  return newItem;
3857
4208
  }
3858
4209
  // EXTERNAL MODULE: ../../ui/src/components/ContextMenu/ContextMenu.tsx
3859
- var ContextMenu = __webpack_require__(63021);
4210
+ var ContextMenu = __webpack_require__(5638);
3860
4211
  ;// CONCATENATED MODULE: ../../../extensions/default/src/CustomizableContextMenu/ContextMenuController.tsx
3861
4212
 
3862
4213
 
@@ -4065,10 +4416,10 @@ const defaultContextMenu = {
4065
4416
 
4066
4417
 
4067
4418
  // EXTERNAL MODULE: ../../../node_modules/moment/moment.js
4068
- var moment = __webpack_require__(53806);
4419
+ var moment = __webpack_require__(71271);
4069
4420
  var moment_default = /*#__PURE__*/__webpack_require__.n(moment);
4070
4421
  // EXTERNAL MODULE: ../../../node_modules/react-window/dist/index.esm.js
4071
- var index_esm = __webpack_require__(21767);
4422
+ var index_esm = __webpack_require__(94614);
4072
4423
  ;// CONCATENATED MODULE: ../../../extensions/default/src/DicomTagBrowser/DicomTagTable.tsx
4073
4424
 
4074
4425
 
@@ -4637,10 +4988,14 @@ const reuseCachedLayout = (state, hangingProtocolService, syncService) => {
4637
4988
  displaySetOptions,
4638
4989
  displaySetInstanceUIDs
4639
4990
  } = viewport;
4640
- if (!displaySetOptions) continue;
4991
+ if (!displaySetOptions) {
4992
+ continue;
4993
+ }
4641
4994
  for (let i = 0; i < displaySetOptions.length; i++) {
4642
4995
  const displaySetUID = displaySetInstanceUIDs[i];
4643
- if (!displaySetUID) continue;
4996
+ if (!displaySetUID) {
4997
+ continue;
4998
+ }
4644
4999
  if (idx === activeViewportIndex && i === 0) {
4645
5000
  displaySetSelectorMap[`${activeStudyUID}:activeDisplaySet:0`] = displaySetUID;
4646
5001
  }
@@ -4673,9 +5028,11 @@ const reuseCachedLayout = (state, hangingProtocolService, syncService) => {
4673
5028
  */
4674
5029
  const findViewportsByPosition_findOrCreateViewport = (hangingProtocolService, viewportsByPosition, viewportIndex, positionId, options) => {
4675
5030
  const byPositionViewport = viewportsByPosition?.[positionId];
4676
- if (byPositionViewport) return {
4677
- ...byPositionViewport
4678
- };
5031
+ if (byPositionViewport) {
5032
+ return {
5033
+ ...byPositionViewport
5034
+ };
5035
+ }
4679
5036
  const {
4680
5037
  protocolId,
4681
5038
  stageIndex
@@ -4756,8 +5113,8 @@ const findViewportsByPosition = (state, _ref, syncService) => {
4756
5113
  };
4757
5114
  };
4758
5115
  /* harmony default export */ const src_findViewportsByPosition = (findViewportsByPosition);
4759
- // EXTERNAL MODULE: ./index.js + 32 modules
4760
- var index = __webpack_require__(97837);
5116
+ // EXTERNAL MODULE: ./index.js + 33 modules
5117
+ var index = __webpack_require__(59754);
4761
5118
  ;// CONCATENATED MODULE: ../../../extensions/default/src/commandsModule.ts
4762
5119
 
4763
5120
 
@@ -4859,7 +5216,9 @@ const commandsModule = _ref => {
4859
5216
  stage
4860
5217
  } = hangingProtocolService.getActiveProtocol();
4861
5218
  const enableListener = button => {
4862
- if (!button.id) return;
5219
+ if (!button.id) {
5220
+ return;
5221
+ }
4863
5222
  const {
4864
5223
  commands,
4865
5224
  items
@@ -4868,7 +5227,9 @@ const commandsModule = _ref => {
4868
5227
  items.forEach(enableListener);
4869
5228
  }
4870
5229
  const hpCommand = commands?.find?.(isHangingProtocolCommand);
4871
- if (!hpCommand) return;
5230
+ if (!hpCommand) {
5231
+ return;
5232
+ }
4872
5233
  const {
4873
5234
  protocolId,
4874
5235
  stageIndex,
@@ -5743,7 +6104,7 @@ function DataSourceSelector() {
5743
6104
  key: ds.sourceName
5744
6105
  }, /*#__PURE__*/react.createElement("h1", {
5745
6106
  className: "text-white"
5746
- }, ds.friendlyName), /*#__PURE__*/react.createElement(ui_src/* Button */.zx, {
6107
+ }, ds.configuration?.friendlyName || ds.friendlyName), /*#__PURE__*/react.createElement(ui_src/* Button */.zx, {
5747
6108
  type: ui_src/* ButtonEnums.type */.LZ.U.primary,
5748
6109
  className: classnames_default()('ml-2'),
5749
6110
  onClick: () => {
@@ -5835,12 +6196,16 @@ function getCustomizationModule() {
5835
6196
  {
5836
6197
  id: 'ohif.overlayItem',
5837
6198
  content: function (props) {
5838
- if (this.condition && !this.condition(props)) return null;
6199
+ if (this.condition && !this.condition(props)) {
6200
+ return null;
6201
+ }
5839
6202
  const {
5840
6203
  instance
5841
6204
  } = props;
5842
6205
  const value = instance && this.attribute ? instance[this.attribute] : this.contentF && typeof this.contentF === 'function' ? this.contentF(props) : null;
5843
- if (!value) return null;
6206
+ if (!value) {
6207
+ return null;
6208
+ }
5844
6209
  return /*#__PURE__*/react.createElement("span", {
5845
6210
  className: "overlay-item flex flex-row",
5846
6211
  style: {
@@ -5882,7 +6247,7 @@ function getCustomizationModule() {
5882
6247
  }];
5883
6248
  }
5884
6249
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/calculate-suv/dist/calculate-suv.esm.js
5885
- var calculate_suv_esm = __webpack_require__(71251);
6250
+ var calculate_suv_esm = __webpack_require__(15747);
5886
6251
  ;// CONCATENATED MODULE: ../../../extensions/default/src/getPTImageIdInstanceMetadata.ts
5887
6252
 
5888
6253
  const getPTImageIdInstanceMetadata_metadataProvider = src["default"].classes.MetadataProvider;