@ohif/app 3.7.0-beta.57 → 3.7.0-beta.58

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 (28) hide show
  1. package/dist/{12.bundle.e700b4f7fed061124c30.js → 12.bundle.a98f63827a148e9fdaaf.js} +2 -2
  2. package/dist/{128.bundle.7a19676226ebadc64139.js → 128.bundle.beabde44babc7e667e74.js} +4 -4
  3. package/dist/{150.bundle.283cf42533b034afbc60.js → 150.bundle.c4ea65552293aff70c7a.js} +4 -4
  4. package/dist/{181.bundle.478d912299d128704269.js → 181.bundle.70c4340cbe29bd14aafc.js} +4 -4
  5. package/dist/{236.bundle.269d01bfd535b5114980.js → 236.bundle.d588fd25d68c6c017ee3.js} +5 -5
  6. package/dist/{250.bundle.390cb28f078d9c4b2995.js → 250.bundle.0d497b1b8afb0cbbe02f.js} +6 -6
  7. package/dist/{281.bundle.97a1fa1cf2b71bbfbba1.js → 281.bundle.5b0a5e6eb03470e23d2b.js} +2 -2
  8. package/dist/{30.bundle.f19f9496718d60d1c2f9.js → 30.bundle.9427944862190fc79970.js} +8 -8
  9. package/dist/{348.bundle.2e98107bfbeb8acaf2d6.js → 348.bundle.a2e21a04f2df1e420b22.js} +4 -4
  10. package/dist/{359.bundle.13aa30ac6c8f4d94d1c5.js → 359.bundle.535a337486c4789e15f7.js} +4 -4
  11. package/dist/{654.bundle.a2d29dc0d277100f8bee.js → 362.bundle.52c5185d34f5f0dac3ab.js} +439 -35
  12. package/dist/{410.bundle.819f12d4a10a16f66582.js → 410.bundle.73658423c3c2c6f7263f.js} +4 -4
  13. package/dist/{451.bundle.353be6110631bf74541b.js → 451.bundle.a573877dff7b43382138.js} +5 -4
  14. package/dist/{471.bundle.26a7b18545380999bf15.js → 471.bundle.e9ecd59867a19e323234.js} +5 -4
  15. package/dist/{506.bundle.a283db0a482175fbb3ac.js → 506.bundle.25789c2270ca2f0d97d1.js} +2 -2
  16. package/dist/{663.bundle.751d2d27e38cd81e4ecb.js → 663.bundle.55721e776396d06003ca.js} +4 -4
  17. package/dist/{678.bundle.9995ff30e61c63ed6e9b.js → 678.bundle.eb17b616827ad2710f8f.js} +4 -4
  18. package/dist/{782.bundle.5209b8b8d564411c6375.js → 782.bundle.20ddd47317996fe30e16.js} +4 -4
  19. package/dist/{814.bundle.335d0f516f0bea5a34a5.js → 814.bundle.9dab1ac2fed309c164d9.js} +2 -2
  20. package/dist/{822.bundle.19500eed01bd57ee812e.js → 822.bundle.99bf759483aa32086346.js} +3 -3
  21. package/dist/{886.bundle.0ebaa84a7952a2e1b780.js → 886.bundle.c5a6b96760ea43352375.js} +3 -2
  22. package/dist/{app.bundle.583f3a50698617e6ce16.js → app.bundle.0004f951b9afebc609b8.js} +122 -32
  23. package/dist/app.bundle.css +1 -1
  24. package/dist/google.js +1 -0
  25. package/dist/index.html +1 -1
  26. package/dist/sw.js +1 -1
  27. package/package.json +18 -18
  28. /package/dist/{378.bundle.6cc7898097ba34752e81.js → 378.bundle.c3502c268c2d82c78de2.js} +0 -0
@@ -1,7 +1,7 @@
1
1
  "use strict";
2
- (self["webpackChunk"] = self["webpackChunk"] || []).push([[654],{
2
+ (self["webpackChunk"] = self["webpackChunk"] || []).push([[362],{
3
3
 
4
- /***/ 75654:
4
+ /***/ 13362:
5
5
  /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
6
6
 
7
7
  // ESM COMPAT FLAG
@@ -29,8 +29,8 @@ __webpack_require__.d(utils_namespaceObject, {
29
29
 
30
30
  // EXTERNAL MODULE: ../../../node_modules/dicomweb-client/build/dicomweb-client.es.js
31
31
  var dicomweb_client_es = __webpack_require__(97604);
32
- // EXTERNAL MODULE: ../../core/src/index.ts + 105 modules
33
- var src = __webpack_require__(61529);
32
+ // EXTERNAL MODULE: ../../core/src/index.ts + 106 modules
33
+ var src = __webpack_require__(38930);
34
34
  // EXTERNAL MODULE: ../../core/src/utils/sortStudy.ts
35
35
  var sortStudy = __webpack_require__(62971);
36
36
  ;// CONCATENATED MODULE: ../../../extensions/default/src/DicomWebDataSource/qido.js
@@ -2054,10 +2054,10 @@ var dist = __webpack_require__(62474);
2054
2054
  var es = __webpack_require__(69190);
2055
2055
  // EXTERNAL MODULE: ../node_modules/react-router/dist/index.js
2056
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);
2057
+ // EXTERNAL MODULE: ../../ui/src/index.js + 458 modules
2058
+ var ui_src = __webpack_require__(33570);
2059
+ // EXTERNAL MODULE: ../../i18n/src/index.js + 98 modules
2060
+ var i18n_src = __webpack_require__(43040);
2061
2061
  // EXTERNAL MODULE: ./state/index.js + 1 modules
2062
2062
  var state = __webpack_require__(62657);
2063
2063
  // EXTERNAL MODULE: ../../../node_modules/classnames/index.js
@@ -2211,8 +2211,8 @@ function ViewerLayout(_ref) {
2211
2211
  hotkeyDefinitions,
2212
2212
  hotkeyDefaults
2213
2213
  } = hotkeysManager;
2214
- const versionNumber = "3.7.0-beta.57";
2215
- const commitHash = "65b49aeb1b5f38224e4892bdf32453500ee351f8";
2214
+ const versionNumber = "3.7.0-beta.58";
2215
+ const commitHash = "a336992971c07552c9dbb6e1de43169d37762ef1";
2216
2216
  const menuOptions = [{
2217
2217
  title: t('Header:About'),
2218
2218
  icon: 'info',
@@ -4661,7 +4661,6 @@ function DicomTagTable(_ref2) {
4661
4661
 
4662
4662
 
4663
4663
 
4664
-
4665
4664
  const {
4666
4665
  ImageSet: DicomTagBrowser_ImageSet
4667
4666
  } = src.classes;
@@ -4690,7 +4689,6 @@ const DicomTagBrowser = _ref => {
4690
4689
  setSelectedDisplaySetInstanceUID(value.value);
4691
4690
  setInstanceNumber(1);
4692
4691
  };
4693
- const searchInputRef = (0,react.useRef)(null);
4694
4692
  const activeDisplaySet = displaySets.find(ds => ds.displaySetInstanceUID === selectedDisplaySetInstanceUID);
4695
4693
  const isImageStack = _isImageStack(activeDisplaySet);
4696
4694
  const showInstanceList = isImageStack && activeDisplaySet.images.length > 1;
@@ -4794,29 +4792,11 @@ const DicomTagBrowser = _ref => {
4794
4792
  className: "w-full h-1 bg-black"
4795
4793
  }), /*#__PURE__*/react.createElement("div", {
4796
4794
  className: "flex flex-row my-3 w-1/2"
4797
- }, /*#__PURE__*/react.createElement("label", {
4798
- className: "relative block w-full mr-8"
4799
- }, /*#__PURE__*/react.createElement("span", {
4800
- className: "absolute inset-y-0 left-0 flex items-center pl-2"
4801
- }, /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
4802
- name: "icon-search"
4803
- })), /*#__PURE__*/react.createElement("input", {
4804
- ref: searchInputRef,
4805
- type: "text",
4806
- className: "block bg-black w-full shadow transition duration-300 appearance-none border border-inputfield-main focus:border-inputfield-focus focus:outline-none disabled:border-inputfield-disabled rounded w-full py-2 px-9 text-base leading-tight placeholder:text-inputfield-placeholder",
4795
+ }, /*#__PURE__*/react.createElement(ui_src/* InputFilterText */.Xe, {
4796
+ className: "block w-full mr-8",
4807
4797
  placeholder: "Search metadata...",
4808
- onChange: event => debouncedSetFilterValue(event.target.value),
4809
- autoComplete: "off"
4810
- }), /*#__PURE__*/react.createElement("span", {
4811
- className: "absolute inset-y-0 right-0 flex items-center pr-2"
4812
- }, /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
4813
- name: "icon-clear-field",
4814
- className: classnames_default()('cursor-pointer', filterValue ? '' : 'hidden'),
4815
- onClick: () => {
4816
- searchInputRef.current.value = '';
4817
- debouncedSetFilterValue('');
4818
- }
4819
- })))), /*#__PURE__*/react.createElement(DicomTagBrowser_DicomTagTable, {
4798
+ onDebounceChange: setFilterValue
4799
+ })), /*#__PURE__*/react.createElement(DicomTagBrowser_DicomTagTable, {
4820
4800
  rows: filteredRows
4821
4801
  }));
4822
4802
  };
@@ -6331,10 +6311,419 @@ function DataSourceSelector() {
6331
6311
  }, ds.sourceName), /*#__PURE__*/react.createElement("br", null)))))));
6332
6312
  }
6333
6313
  /* harmony default export */ const Panels_DataSourceSelector = (DataSourceSelector);
6314
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/Components/ItemListComponent.tsx
6315
+
6316
+
6317
+
6318
+
6319
+ function ItemListComponent(_ref) {
6320
+ let {
6321
+ itemLabel,
6322
+ itemList,
6323
+ onItemClicked
6324
+ } = _ref;
6325
+ const {
6326
+ t
6327
+ } = (0,es/* useTranslation */.$G)('DataSourceConfiguration');
6328
+ const [filterValue, setFilterValue] = (0,react.useState)('');
6329
+ (0,react.useEffect)(() => {
6330
+ setFilterValue('');
6331
+ }, [itemList]);
6332
+ return /*#__PURE__*/react.createElement("div", {
6333
+ className: "flex flex-col gap-4 min-h-[1px] grow"
6334
+ }, /*#__PURE__*/react.createElement("div", {
6335
+ className: "flex justify-between items-center"
6336
+ }, /*#__PURE__*/react.createElement("div", {
6337
+ className: "text-primary-light text-[20px]"
6338
+ }, t(`Select ${itemLabel}`)), /*#__PURE__*/react.createElement(ui_src/* InputFilterText */.Xe, {
6339
+ className: "grow max-w-[40%]",
6340
+ value: filterValue,
6341
+ onDebounceChange: setFilterValue,
6342
+ placeholder: t(`Search ${itemLabel} list`)
6343
+ })), /*#__PURE__*/react.createElement("div", {
6344
+ className: "flex flex-col relative min-h-[1px] grow text-[14px] bg-black"
6345
+ }, itemList == null ? /*#__PURE__*/react.createElement(ui_src/* LoadingIndicatorProgress */.LE, {
6346
+ className: 'w-full h-full'
6347
+ }) : itemList.length === 0 ? /*#__PURE__*/react.createElement("div", {
6348
+ className: "flex flex-col h-full px-6 py-4 items-center justify-center text-primary-light"
6349
+ }, /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
6350
+ name: "magnifier",
6351
+ className: "mb-4"
6352
+ }), /*#__PURE__*/react.createElement("span", null, t(`No ${itemLabel} available`))) : /*#__PURE__*/react.createElement(react.Fragment, null, /*#__PURE__*/react.createElement("div", {
6353
+ className: "bg-secondary-dark text-white px-3 py-1.5"
6354
+ }, t(itemLabel)), /*#__PURE__*/react.createElement("div", {
6355
+ className: "overflow-auto ohif-scrollbar"
6356
+ }, itemList.filter(item => !filterValue || item.name.toLowerCase().includes(filterValue.toLowerCase())).map(item => {
6357
+ const border = 'rounded border-transparent border-b-secondary-light border-[1px] hover:border-primary-light';
6358
+ return /*#__PURE__*/react.createElement("div", {
6359
+ className: classnames_default()('group mx-2 px-6 py-2 flex justify-between items-center hover:text-primary-light hover:bg-primary-dark', border),
6360
+ key: item.id
6361
+ }, /*#__PURE__*/react.createElement("div", null, item.name), /*#__PURE__*/react.createElement(ui_src/* Button */.zx, {
6362
+ onClick: () => onItemClicked(item),
6363
+ className: "invisible group-hover:visible",
6364
+ endIcon: /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
6365
+ name: "arrow-left"
6366
+ })
6367
+ }, t('Select')));
6368
+ })))));
6369
+ }
6370
+ /* harmony default export */ const Components_ItemListComponent = (ItemListComponent);
6371
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/Components/DataSourceConfigurationModalComponent.tsx
6372
+
6373
+
6374
+
6375
+
6376
+
6377
+ const NO_WRAP_ELLIPSIS_CLASS_NAMES = 'text-ellipsis whitespace-nowrap overflow-hidden';
6378
+ function DataSourceConfigurationModalComponent(_ref) {
6379
+ let {
6380
+ configurationAPI,
6381
+ configuredItems,
6382
+ onHide
6383
+ } = _ref;
6384
+ const {
6385
+ t
6386
+ } = (0,es/* useTranslation */.$G)('DataSourceConfiguration');
6387
+ const [itemList, setItemList] = (0,react.useState)();
6388
+ const [selectedItems, setSelectedItems] = (0,react.useState)(configuredItems);
6389
+
6390
+ // Determines whether to show the full configuration for the data source.
6391
+ // This typically occurs when the configuration component is first displayed.
6392
+ const [showFullConfig, setShowFullConfig] = (0,react.useState)(true);
6393
+ const [errorMessage, setErrorMessage] = (0,react.useState)();
6394
+ const [itemLabels] = (0,react.useState)(configurationAPI.getItemLabels());
6395
+
6396
+ /**
6397
+ * The index of the selected item that is considered current and for which
6398
+ * its sub-items should be displayed in the items list component. When the
6399
+ * full/existing configuration for a data source is to be shown, the current
6400
+ * selected item is the second to last in the `selectedItems` list.
6401
+ */
6402
+ const currentSelectedItemIndex = showFullConfig ? selectedItems.length - 2 : selectedItems.length - 1;
6403
+ (0,react.useEffect)(() => {
6404
+ let shouldUpdate = true;
6405
+ setErrorMessage(null);
6406
+
6407
+ // Clear out the former/old list while we fetch the next sub item list.
6408
+ setItemList(null);
6409
+ if (selectedItems.length === 0) {
6410
+ configurationAPI.initialize().then(items => {
6411
+ if (shouldUpdate) {
6412
+ setItemList(items);
6413
+ }
6414
+ }).catch(error => setErrorMessage(error.message));
6415
+ } else if (!showFullConfig && selectedItems.length === itemLabels.length) {
6416
+ // The last item to configure the data source (path) has been selected.
6417
+ configurationAPI.setCurrentItem(selectedItems[selectedItems.length - 1]);
6418
+ // We can hide the modal dialog now.
6419
+ onHide();
6420
+ } else {
6421
+ configurationAPI.setCurrentItem(selectedItems[currentSelectedItemIndex]).then(items => {
6422
+ if (shouldUpdate) {
6423
+ setItemList(items);
6424
+ }
6425
+ }).catch(error => setErrorMessage(error.message));
6426
+ }
6427
+ return () => {
6428
+ shouldUpdate = false;
6429
+ };
6430
+ }, [selectedItems, configurationAPI, onHide, itemLabels, showFullConfig, currentSelectedItemIndex]);
6431
+ const getSelectedItemCursorClasses = itemIndex => itemIndex !== itemLabels.length - 1 && itemIndex < selectedItems.length ? 'cursor-pointer' : 'cursor-auto';
6432
+ const getSelectedItemBackgroundClasses = itemIndex => itemIndex < selectedItems.length ? classnames_default()('bg-black/[.4]', itemIndex !== itemLabels.length - 1 ? 'hover:bg-transparent active:bg-secondary-dark' : '') : 'bg-transparent';
6433
+ const getSelectedItemBorderClasses = itemIndex => itemIndex === currentSelectedItemIndex + 1 ? classnames_default()('border-2', 'border-solid', 'border-primary-light') : itemIndex < selectedItems.length ? 'border border-solid border-primary-active hover:border-primary-light active:border-white' : 'border border-dashed border-secondary-light';
6434
+ const getSelectedItemTextClasses = itemIndex => itemIndex <= selectedItems.length ? 'text-primary-light' : 'text-primary-active';
6435
+ const getErrorComponent = () => {
6436
+ return /*#__PURE__*/react.createElement("div", {
6437
+ className: "flex flex-col gap-4 min-h-[1px] grow"
6438
+ }, /*#__PURE__*/react.createElement("div", {
6439
+ className: "text-primary-light text-[20px]"
6440
+ }, t(`Error fetching ${itemLabels[selectedItems.length]} list`)), /*#__PURE__*/react.createElement("div", {
6441
+ className: "bg-black text-[14px] grow p-4"
6442
+ }, errorMessage));
6443
+ };
6444
+ const getSelectedItemsComponent = () => {
6445
+ return /*#__PURE__*/react.createElement("div", {
6446
+ className: "flex gap-4"
6447
+ }, itemLabels.map((itemLabel, itemLabelIndex) => {
6448
+ return /*#__PURE__*/react.createElement("div", {
6449
+ key: itemLabel,
6450
+ className: classnames_default()('rounded-md p-3.5 flex flex-col gap-1 shrink min-w-[1px] basis-[200px]', getSelectedItemCursorClasses(itemLabelIndex), getSelectedItemBackgroundClasses(itemLabelIndex), getSelectedItemBorderClasses(itemLabelIndex), getSelectedItemTextClasses(itemLabelIndex)),
6451
+ onClick: showFullConfig && itemLabelIndex < currentSelectedItemIndex || itemLabelIndex <= currentSelectedItemIndex ? () => {
6452
+ setShowFullConfig(false);
6453
+ setSelectedItems(theList => theList.slice(0, itemLabelIndex));
6454
+ } : undefined
6455
+ }, /*#__PURE__*/react.createElement("div", {
6456
+ className: "flex gap-2 items-center text-"
6457
+ }, itemLabelIndex < selectedItems.length ? /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
6458
+ name: "status-tracked"
6459
+ }) : /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
6460
+ name: "status-untracked"
6461
+ }), /*#__PURE__*/react.createElement("div", {
6462
+ className: classnames_default()(NO_WRAP_ELLIPSIS_CLASS_NAMES)
6463
+ }, t(itemLabel))), itemLabelIndex < selectedItems.length ? /*#__PURE__*/react.createElement("div", {
6464
+ className: classnames_default()('text-white text-[14px]', NO_WRAP_ELLIPSIS_CLASS_NAMES)
6465
+ }, selectedItems[itemLabelIndex].name) : /*#__PURE__*/react.createElement("br", null));
6466
+ }));
6467
+ };
6468
+ return /*#__PURE__*/react.createElement("div", {
6469
+ className: "h-[calc(100vh-300px)] flex flex-col pt-0.5 gap-4 select-none"
6470
+ }, getSelectedItemsComponent(), /*#__PURE__*/react.createElement("div", {
6471
+ className: "w-full h-0.5 shrink-0 bg-black"
6472
+ }), errorMessage ? getErrorComponent() : /*#__PURE__*/react.createElement(Components_ItemListComponent, {
6473
+ itemLabel: itemLabels[currentSelectedItemIndex + 1],
6474
+ itemList: itemList,
6475
+ onItemClicked: item => {
6476
+ setShowFullConfig(false);
6477
+ setSelectedItems(theList => [...theList.slice(0, currentSelectedItemIndex + 1), item]);
6478
+ }
6479
+ }));
6480
+ }
6481
+ /* harmony default export */ const Components_DataSourceConfigurationModalComponent = (DataSourceConfigurationModalComponent);
6482
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/Components/DataSourceConfigurationComponent.tsx
6483
+
6484
+
6485
+
6486
+
6487
+ function DataSourceConfigurationComponent(_ref) {
6488
+ let {
6489
+ servicesManager,
6490
+ extensionManager
6491
+ } = _ref;
6492
+ const {
6493
+ t
6494
+ } = (0,es/* useTranslation */.$G)('DataSourceConfiguration');
6495
+ const {
6496
+ show,
6497
+ hide
6498
+ } = (0,ui_src/* useModal */.dd)();
6499
+ const {
6500
+ customizationService
6501
+ } = servicesManager.services;
6502
+ const [configurationAPI, setConfigurationAPI] = (0,react.useState)();
6503
+ const [configuredItems, setConfiguredItems] = (0,react.useState)();
6504
+ (0,react.useEffect)(() => {
6505
+ let shouldUpdate = true;
6506
+ const dataSourceChangedCallback = async () => {
6507
+ const activeDataSourceDef = extensionManager.getActiveDataSourceDefinition();
6508
+ if (!activeDataSourceDef.configuration.configurationAPI) {
6509
+ return;
6510
+ }
6511
+ const {
6512
+ factory: configurationAPIFactory
6513
+ } = customizationService.get(activeDataSourceDef.configuration.configurationAPI) ?? {};
6514
+ if (!configurationAPIFactory) {
6515
+ return;
6516
+ }
6517
+ const configAPI = configurationAPIFactory(activeDataSourceDef.sourceName);
6518
+ setConfigurationAPI(configAPI);
6519
+ configAPI.getConfiguredItems().then(list => {
6520
+ if (shouldUpdate) {
6521
+ setConfiguredItems(list);
6522
+ }
6523
+ });
6524
+ };
6525
+ const sub = extensionManager.subscribe(extensionManager.EVENTS.ACTIVE_DATA_SOURCE_CHANGED, dataSourceChangedCallback);
6526
+ dataSourceChangedCallback();
6527
+ return () => {
6528
+ shouldUpdate = false;
6529
+ sub.unsubscribe();
6530
+ };
6531
+ }, []);
6532
+ return configuredItems ? /*#__PURE__*/react.createElement("div", {
6533
+ className: "flex text-aqua-pale overflow-hidden items-center"
6534
+ }, /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
6535
+ name: "settings",
6536
+ className: "cursor-pointer shrink-0 w-3.5 h-3.5 mr-2.5",
6537
+ onClick: () => show({
6538
+ content: Components_DataSourceConfigurationModalComponent,
6539
+ title: t('Configure Data Source'),
6540
+ contentProps: {
6541
+ configurationAPI,
6542
+ configuredItems,
6543
+ onHide: hide
6544
+ }
6545
+ })
6546
+ }), configuredItems.map((item, itemIndex) => {
6547
+ return /*#__PURE__*/react.createElement("div", {
6548
+ key: itemIndex,
6549
+ className: "flex overflow-hidden"
6550
+ }, /*#__PURE__*/react.createElement("div", {
6551
+ key: itemIndex,
6552
+ className: "text-ellipsis whitespace-nowrap overflow-hidden"
6553
+ }, item.name), itemIndex !== configuredItems.length - 1 && /*#__PURE__*/react.createElement("div", {
6554
+ className: "px-2.5"
6555
+ }, "|"));
6556
+ })) : /*#__PURE__*/react.createElement(react.Fragment, null);
6557
+ }
6558
+ /* harmony default export */ const Components_DataSourceConfigurationComponent = (DataSourceConfigurationComponent);
6559
+ ;// CONCATENATED MODULE: ../../../extensions/default/src/DataSourceConfigurationAPI/GoogleCloudDataSourceConfigurationAPI.ts
6560
+ /**
6561
+ * This file contains the implementations of BaseDataSourceConfigurationAPIItem
6562
+ * and BaseDataSourceConfigurationAPI for the Google cloud healthcare API. To
6563
+ * better understand this implementation and/or to implement custom implementations,
6564
+ * see the platform\core\src\types\DataSourceConfigurationAPI.ts and its JS doc
6565
+ * comments as a guide.
6566
+ */
6567
+ /**
6568
+ * The various Google Cloud Healthcare path item types.
6569
+ */
6570
+ var ItemType = /*#__PURE__*/function (ItemType) {
6571
+ ItemType[ItemType["projects"] = 0] = "projects";
6572
+ ItemType[ItemType["locations"] = 1] = "locations";
6573
+ ItemType[ItemType["datasets"] = 2] = "datasets";
6574
+ ItemType[ItemType["dicomStores"] = 3] = "dicomStores";
6575
+ return ItemType;
6576
+ }(ItemType || {});
6577
+ const initialUrl = 'https://cloudresourcemanager.googleapis.com/v1';
6578
+ const baseHealthcareUrl = 'https://healthcare.googleapis.com/v1';
6579
+ class GoogleCloudDataSourceConfigurationAPIItem {
6580
+ constructor() {
6581
+ this.id = void 0;
6582
+ this.name = void 0;
6583
+ this.url = void 0;
6584
+ this.itemType = void 0;
6585
+ }
6586
+ }
6587
+ class GoogleCloudDataSourceConfigurationAPI {
6588
+ constructor(dataSourceName, servicesManager, extensionManager) {
6589
+ this._extensionManager = void 0;
6590
+ this._fetchOptions = void 0;
6591
+ this._dataSourceName = void 0;
6592
+ this.getItemLabels = () => ['Project', 'Location', 'Data set', 'DICOM store'];
6593
+ this._dataSourceName = dataSourceName;
6594
+ this._extensionManager = extensionManager;
6595
+ const userAuthenticationService = servicesManager.services.userAuthenticationService;
6596
+ this._fetchOptions = {
6597
+ method: 'GET',
6598
+ headers: userAuthenticationService.getAuthorizationHeader()
6599
+ };
6600
+ }
6601
+ async initialize() {
6602
+ const url = `${initialUrl}/projects`;
6603
+ const projects = await GoogleCloudDataSourceConfigurationAPI._doFetch(url, ItemType.projects, this._fetchOptions);
6604
+ if (!projects?.length) {
6605
+ return [];
6606
+ }
6607
+ const projectItems = projects.map(project => {
6608
+ return {
6609
+ id: project.projectId,
6610
+ name: project.name,
6611
+ itemType: ItemType.projects,
6612
+ url: `${baseHealthcareUrl}/projects/${project.projectId}`
6613
+ };
6614
+ });
6615
+ return projectItems;
6616
+ }
6617
+ async setCurrentItem(anItem) {
6618
+ const googleCloudItem = anItem;
6619
+ if (googleCloudItem.itemType === ItemType.dicomStores) {
6620
+ // Last configurable item, so update the data source configuration.
6621
+ const url = `${googleCloudItem.url}/dicomWeb`;
6622
+ const dataSourceDefCopy = JSON.parse(JSON.stringify(this._extensionManager.getDataSourceDefinition(this._dataSourceName)));
6623
+ dataSourceDefCopy.configuration = {
6624
+ ...dataSourceDefCopy.configuration,
6625
+ wadoUriRoot: url,
6626
+ qidoRoot: url,
6627
+ wadoRoot: url
6628
+ };
6629
+ this._extensionManager.updateDataSourceConfiguration(dataSourceDefCopy.sourceName, dataSourceDefCopy.configuration);
6630
+ return [];
6631
+ }
6632
+ const subItemType = googleCloudItem.itemType + 1;
6633
+ const subItemField = `${ItemType[subItemType]}`;
6634
+ const url = `${googleCloudItem.url}/${subItemField}`;
6635
+ const fetchedSubItems = await GoogleCloudDataSourceConfigurationAPI._doFetch(url, subItemType, this._fetchOptions);
6636
+ if (!fetchedSubItems?.length) {
6637
+ return [];
6638
+ }
6639
+ const subItems = fetchedSubItems.map(subItem => {
6640
+ const nameSplit = subItem.name.split('/');
6641
+ return {
6642
+ id: subItem.name,
6643
+ name: nameSplit[nameSplit.length - 1],
6644
+ itemType: subItemType,
6645
+ url: `${baseHealthcareUrl}/${subItem.name}`
6646
+ };
6647
+ });
6648
+ return subItems;
6649
+ }
6650
+ async getConfiguredItems() {
6651
+ const dataSourceDefinition = this._extensionManager.getDataSourceDefinition(this._dataSourceName);
6652
+ const url = dataSourceDefinition.configuration.wadoUriRoot;
6653
+ const projectsIndex = url.indexOf('projects');
6654
+ const urlSplit = url.substring(projectsIndex).split('/');
6655
+ const configuredItems = [];
6656
+ for (let itemType = 0; itemType < 4; itemType += 1) {
6657
+ if (itemType === ItemType.projects) {
6658
+ const projectId = urlSplit[1];
6659
+ const projectUrl = `${initialUrl}/projects/${projectId}`;
6660
+ const data = await GoogleCloudDataSourceConfigurationAPI._doFetch(projectUrl, ItemType.projects, this._fetchOptions);
6661
+ const project = data[0];
6662
+ configuredItems.push({
6663
+ id: project.projectId,
6664
+ name: project.name,
6665
+ itemType: itemType,
6666
+ url: `${baseHealthcareUrl}/projects/${project.projectId}`
6667
+ });
6668
+ } else {
6669
+ const relativePath = urlSplit.slice(0, itemType * 2 + 2).join('/');
6670
+ configuredItems.push({
6671
+ id: relativePath,
6672
+ name: urlSplit[itemType * 2 + 1],
6673
+ itemType: itemType,
6674
+ url: `${baseHealthcareUrl}/${relativePath}`
6675
+ });
6676
+ }
6677
+ }
6678
+ return configuredItems;
6679
+ }
6680
+
6681
+ /**
6682
+ * Fetches an array of items the specified item type.
6683
+ * @param urlStr the fetch url
6684
+ * @param fetchItemType the type to fetch
6685
+ * @param fetchOptions the header options for the fetch (e.g. authorization header)
6686
+ * @param fetchSearchParams any search query params; currently only used for paging results
6687
+ * @returns an array of items of the specified type
6688
+ */
6689
+ static async _doFetch(urlStr, fetchItemType) {
6690
+ let fetchOptions = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
6691
+ let fetchSearchParams = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
6692
+ try {
6693
+ const url = new URL(urlStr);
6694
+ url.search = new URLSearchParams(fetchSearchParams).toString();
6695
+ const response = await fetch(url, fetchOptions);
6696
+ const data = await response.json();
6697
+ if (response.status >= 200 && response.status < 300 && data != null) {
6698
+ if (data.nextPageToken != null) {
6699
+ fetchSearchParams.pageToken = data.nextPageToken;
6700
+ const subPageData = await this._doFetch(urlStr, fetchItemType, fetchOptions, fetchSearchParams);
6701
+ data[ItemType[fetchItemType]] = data[ItemType[fetchItemType]].concat(subPageData);
6702
+ }
6703
+ if (data[ItemType[fetchItemType]]) {
6704
+ return data[ItemType[fetchItemType]];
6705
+ } else if (data.name) {
6706
+ return [data];
6707
+ } else {
6708
+ return [];
6709
+ }
6710
+ } else {
6711
+ const message = data?.error?.message || `Error returned from Google Cloud Healthcare: ${response.status} - ${response.statusText}`;
6712
+ throw new Error(message);
6713
+ }
6714
+ } catch (err) {
6715
+ const message = err?.message || 'Error occurred during fetch request.';
6716
+ throw new Error(message);
6717
+ }
6718
+ }
6719
+ }
6720
+
6334
6721
  ;// CONCATENATED MODULE: ../../../extensions/default/src/getCustomizationModule.tsx
6335
6722
 
6336
6723
 
6337
6724
 
6725
+
6726
+
6338
6727
  /**
6339
6728
  *
6340
6729
  * Note: this is an example of how the customization module can be used
@@ -6344,7 +6733,11 @@ function DataSourceSelector() {
6344
6733
  * custom page for the user to view their profile, or to add a custom
6345
6734
  * page for login etc.
6346
6735
  */
6347
- function getCustomizationModule() {
6736
+ function getCustomizationModule(_ref) {
6737
+ let {
6738
+ servicesManager,
6739
+ extensionManager
6740
+ } = _ref;
6348
6741
  return [{
6349
6742
  name: 'helloPage',
6350
6743
  value: {
@@ -6458,6 +6851,17 @@ function getCustomizationModule() {
6458
6851
  }
6459
6852
  return clonedObject;
6460
6853
  }
6854
+ }, {
6855
+ // the generic GUI component to configure a data source using an instance of a BaseDataSourceConfigurationAPI
6856
+ id: 'ohif.dataSourceConfigurationComponent',
6857
+ component: Components_DataSourceConfigurationComponent.bind(null, {
6858
+ servicesManager,
6859
+ extensionManager
6860
+ })
6861
+ }, {
6862
+ // The factory for creating an instance of a BaseDataSourceConfigurationAPI for Google Cloud Healthcare
6863
+ id: 'ohif.dataSourceConfigurationAPI.google',
6864
+ factory: dataSourceName => new GoogleCloudDataSourceConfigurationAPI(dataSourceName, servicesManager, extensionManager)
6461
6865
  }]
6462
6866
  }];
6463
6867
  }
@@ -12,10 +12,10 @@ __webpack_require__.d(__webpack_exports__, {
12
12
  "default": () => (/* binding */ basic_dev_mode_src)
13
13
  });
14
14
 
15
- // EXTERNAL MODULE: ../../ui/src/index.js + 456 modules
16
- var src = __webpack_require__(60082);
17
- // EXTERNAL MODULE: ../../core/src/index.ts + 105 modules
18
- var core_src = __webpack_require__(61529);
15
+ // EXTERNAL MODULE: ../../ui/src/index.js + 458 modules
16
+ var src = __webpack_require__(33570);
17
+ // EXTERNAL MODULE: ../../core/src/index.ts + 106 modules
18
+ var core_src = __webpack_require__(38930);
19
19
  ;// CONCATENATED MODULE: ../../../modes/basic-dev-mode/src/toolbarButtons.js
20
20
  // TODO: torn, can either bake this here; or have to create a whole new button type
21
21
  // Only ways that you can pass in a custom React component for render :l
@@ -19,10 +19,10 @@ var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
19
19
  var react = __webpack_require__(43001);
20
20
  // EXTERNAL MODULE: ../../../node_modules/react-i18next/dist/es/index.js + 15 modules
21
21
  var es = __webpack_require__(69190);
22
- // EXTERNAL MODULE: ../../core/src/index.ts + 105 modules
23
- var src = __webpack_require__(61529);
24
- // EXTERNAL MODULE: ../../ui/src/index.js + 456 modules
25
- var ui_src = __webpack_require__(60082);
22
+ // EXTERNAL MODULE: ../../core/src/index.ts + 106 modules
23
+ var src = __webpack_require__(38930);
24
+ // EXTERNAL MODULE: ../../ui/src/index.js + 458 modules
25
+ var ui_src = __webpack_require__(33570);
26
26
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-seg/src/utils/initSEGToolGroup.ts
27
27
  function createSEGToolGroupAndAddTools(ToolGroupService, customizationService, toolGroupId) {
28
28
  const {
@@ -120,6 +120,7 @@ function _getStatusComponent(_ref) {
120
120
  break;
121
121
  case false:
122
122
  StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
123
+ className: "text-aqua-pale",
123
124
  name: "status-untracked"
124
125
  });
125
126
  ToolTipMessage = () => /*#__PURE__*/react.createElement("div", null, "Click LOAD to load segmentation.");
@@ -17,10 +17,10 @@ var react = __webpack_require__(43001);
17
17
  // EXTERNAL MODULE: ../../../node_modules/prop-types/index.js
18
18
  var prop_types = __webpack_require__(3827);
19
19
  var prop_types_default = /*#__PURE__*/__webpack_require__.n(prop_types);
20
- // EXTERNAL MODULE: ../../core/src/index.ts + 105 modules
21
- var src = __webpack_require__(61529);
22
- // EXTERNAL MODULE: ../../ui/src/index.js + 456 modules
23
- var ui_src = __webpack_require__(60082);
20
+ // EXTERNAL MODULE: ../../core/src/index.ts + 106 modules
21
+ var src = __webpack_require__(38930);
22
+ // EXTERNAL MODULE: ../../ui/src/index.js + 458 modules
23
+ var ui_src = __webpack_require__(33570);
24
24
  // EXTERNAL MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/_hydrateRT.ts
25
25
  var _hydrateRT = __webpack_require__(50995);
26
26
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/utils/promptHydrateRT.ts
@@ -114,6 +114,7 @@ function _getStatusComponent(_ref) {
114
114
  break;
115
115
  case false:
116
116
  StatusIcon = () => /*#__PURE__*/react.createElement(ui_src/* Icon */.JO, {
117
+ className: "text-aqua-pale",
117
118
  name: "status-untracked"
118
119
  });
119
120
  ToolTipMessage = () => /*#__PURE__*/react.createElement("div", null, "Click LOAD to load RTSTRUCT.");
@@ -23,8 +23,8 @@ const SOPClassHandlerId = `${id}.sopClassHandlerModule.${SOPClassHandlerName}`;
23
23
 
24
24
  // EXTERNAL MODULE: ../../../node_modules/react/index.js
25
25
  var react = __webpack_require__(43001);
26
- // EXTERNAL MODULE: ../../core/src/index.ts + 105 modules
27
- var src = __webpack_require__(61529);
26
+ // EXTERNAL MODULE: ../../core/src/index.ts + 106 modules
27
+ var src = __webpack_require__(38930);
28
28
  // EXTERNAL MODULE: ../../../node_modules/dcmjs/build/dcmjs.es.js
29
29
  var dcmjs_es = __webpack_require__(67540);
30
30
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-rt/src/loadRTStruct.js
@@ -25,8 +25,8 @@ const id = package_namespaceObject.u2;
25
25
  const SOPClassHandlerName = 'dicom-sr';
26
26
  const SOPClassHandlerId = `${id}.sopClassHandlerModule.${SOPClassHandlerName}`;
27
27
 
28
- // EXTERNAL MODULE: ../../core/src/index.ts + 105 modules
29
- var src = __webpack_require__(61529);
28
+ // EXTERNAL MODULE: ../../core/src/index.ts + 106 modules
29
+ var src = __webpack_require__(38930);
30
30
  // EXTERNAL MODULE: ../../../node_modules/gl-matrix/esm/index.js + 10 modules
31
31
  var esm = __webpack_require__(45451);
32
32
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 323 modules
@@ -1596,8 +1596,8 @@ __webpack_require__.d(__webpack_exports__, {
1596
1596
 
1597
1597
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/core/dist/esm/index.js + 337 modules
1598
1598
  var esm = __webpack_require__(45754);
1599
- // EXTERNAL MODULE: ../../core/src/index.ts + 105 modules
1600
- var src = __webpack_require__(61529);
1599
+ // EXTERNAL MODULE: ../../core/src/index.ts + 106 modules
1600
+ var src = __webpack_require__(38930);
1601
1601
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone-dicom-sr/src/utils/getLabelFromDCMJSImportedToolData.js
1602
1602
  /**
1603
1603
  * Extracts the label from the toolData imported from dcmjs. We need to do this
@@ -37,8 +37,8 @@ var react = __webpack_require__(43001);
37
37
  var esm = __webpack_require__(45754);
38
38
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/tools/dist/esm/index.js + 323 modules
39
39
  var dist_esm = __webpack_require__(26925);
40
- // EXTERNAL MODULE: ../../core/src/index.ts + 105 modules
41
- var src = __webpack_require__(61529);
40
+ // EXTERNAL MODULE: ../../core/src/index.ts + 106 modules
41
+ var src = __webpack_require__(38930);
42
42
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/streaming-image-volume-loader/dist/esm/index.js + 13 modules
43
43
  var streaming_image_volume_loader_dist_esm = __webpack_require__(7087);
44
44
  // EXTERNAL MODULE: ../../../node_modules/@cornerstonejs/dicom-image-loader/dist/dynamic-import/cornerstoneDICOMImageLoader.min.js
@@ -116,8 +116,8 @@ function destroy() {
116
116
  }
117
117
  webWorkers.length = 0;
118
118
  }
119
- // EXTERNAL MODULE: ../../ui/src/index.js + 456 modules
120
- var ui_src = __webpack_require__(60082);
119
+ // EXTERNAL MODULE: ../../ui/src/index.js + 458 modules
120
+ var ui_src = __webpack_require__(33570);
121
121
  ;// CONCATENATED MODULE: ../../../extensions/cornerstone/src/utils/callInputDialog.tsx
122
122
 
123
123