@haniffalab/cherita-react 1.3.0 → 1.3.1-dev.2025-10-29.def77f5f

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 (137) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/controls/Controls.js +38 -30
  3. package/dist/cjs/components/dotplot/Dotplot.js +85 -57
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +167 -114
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +102 -0
  8. package/dist/cjs/components/heatmap/Heatmap.js +83 -53
  9. package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
  10. package/dist/cjs/components/icons/DotPlotIcon.js +64 -0
  11. package/dist/cjs/components/icons/HeatmapIcon.js +45 -0
  12. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +57 -0
  13. package/dist/cjs/components/icons/MatrixPlotIcon.js +59 -0
  14. package/dist/cjs/components/icons/ScatterplotIcon.1.js +164 -0
  15. package/dist/cjs/components/icons/ScatterplotIcon.js +144 -0
  16. package/dist/cjs/components/icons/ViolinPlotIcon.js +42 -0
  17. package/dist/cjs/components/matrixplot/Matrixplot.js +83 -54
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +305 -216
  20. package/dist/cjs/components/obs-list/ObsList.js +164 -128
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +67 -28
  23. package/dist/cjs/components/offcanvas/index.js +62 -27
  24. package/dist/cjs/components/pseudospatial/Pseudospatial.js +132 -76
  25. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +122 -74
  26. package/dist/cjs/components/scatterplot/Scatterplot.js +223 -175
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +143 -116
  29. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  30. package/dist/cjs/components/search-bar/SearchBar.js +176 -120
  31. package/dist/cjs/components/search-bar/SearchInfo.js +79 -85
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +111 -0
  34. package/dist/cjs/components/var-list/VarItem.js +131 -103
  35. package/dist/cjs/components/var-list/VarList.js +96 -74
  36. package/dist/cjs/components/var-list/VarListToolbar.js +59 -54
  37. package/dist/cjs/components/var-list/VarSet.js +126 -108
  38. package/dist/cjs/components/violin/Violin.js +124 -81
  39. package/dist/cjs/components/violin/ViolinControls.js +8 -5
  40. package/dist/cjs/constants/colorscales.js +19 -19
  41. package/dist/cjs/constants/constants.js +54 -39
  42. package/dist/cjs/context/DatasetContext.js +27 -17
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +339 -125
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/map-helper.js +2 -1
  48. package/dist/cjs/helpers/zarr-helper.js +3 -3
  49. package/dist/cjs/index.js +15 -21
  50. package/dist/cjs/utils/Filter.js +16 -11
  51. package/dist/cjs/utils/Histogram.js +35 -33
  52. package/dist/cjs/utils/ImageViewer.js +11 -8
  53. package/dist/cjs/utils/Legend.js +37 -30
  54. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  55. package/dist/cjs/utils/Resolver.js +213 -0
  56. package/dist/cjs/utils/Skeleton.js +10 -10
  57. package/dist/cjs/utils/StyledTooltip.js +44 -0
  58. package/dist/cjs/utils/VirtualizedList.js +36 -29
  59. package/dist/cjs/utils/errors.js +15 -15
  60. package/dist/cjs/utils/requests.js +21 -9
  61. package/dist/cjs/utils/search.js +4 -4
  62. package/dist/cjs/utils/string.js +6 -6
  63. package/dist/cjs/utils/zarrData.js +20 -21
  64. package/dist/css/cherita.css +188 -65
  65. package/dist/css/cherita.css.map +1 -1
  66. package/dist/esm/components/controls/Controls.js +43 -35
  67. package/dist/esm/components/dotplot/Dotplot.js +93 -64
  68. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  69. package/dist/esm/components/full-page/FullPage.js +180 -124
  70. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  71. package/dist/esm/components/full-page/PlotTypeSelector.js +95 -0
  72. package/dist/esm/components/heatmap/Heatmap.js +91 -60
  73. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  74. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  75. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  76. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  77. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  78. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  79. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  80. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  81. package/dist/esm/components/matrixplot/Matrixplot.js +91 -61
  82. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  83. package/dist/esm/components/obs-list/ObsItem.js +320 -228
  84. package/dist/esm/components/obs-list/ObsList.js +179 -142
  85. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  86. package/dist/esm/components/obsm-list/ObsmList.js +71 -32
  87. package/dist/esm/components/offcanvas/index.js +68 -33
  88. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  89. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  90. package/dist/esm/components/scatterplot/Scatterplot.js +243 -194
  91. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  92. package/dist/esm/components/scatterplot/SpatialControls.js +155 -127
  93. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  94. package/dist/esm/components/search-bar/SearchBar.js +187 -130
  95. package/dist/esm/components/search-bar/SearchInfo.js +86 -91
  96. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  97. package/dist/esm/components/toolbar/Toolbar.js +101 -0
  98. package/dist/esm/components/var-list/VarItem.js +142 -113
  99. package/dist/esm/components/var-list/VarList.js +108 -88
  100. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  101. package/dist/esm/components/var-list/VarSet.js +134 -115
  102. package/dist/esm/components/violin/Violin.js +135 -91
  103. package/dist/esm/components/violin/ViolinControls.js +10 -6
  104. package/dist/esm/constants/colorscales.js +19 -19
  105. package/dist/esm/constants/constants.js +53 -38
  106. package/dist/esm/context/DatasetContext.js +34 -23
  107. package/dist/esm/context/FilterContext.js +11 -8
  108. package/dist/esm/context/SettingsContext.js +341 -126
  109. package/dist/esm/context/ZarrDataContext.js +8 -6
  110. package/dist/esm/helpers/color-helper.js +5 -5
  111. package/dist/esm/helpers/map-helper.js +4 -3
  112. package/dist/esm/helpers/zarr-helper.js +6 -6
  113. package/dist/esm/index.js +22 -22
  114. package/dist/esm/utils/Filter.js +22 -17
  115. package/dist/esm/utils/Histogram.js +39 -37
  116. package/dist/esm/utils/ImageViewer.js +12 -8
  117. package/dist/esm/utils/Legend.js +44 -36
  118. package/dist/esm/utils/LoadingIndicators.js +16 -13
  119. package/dist/esm/utils/Resolver.js +201 -0
  120. package/dist/esm/utils/Skeleton.js +11 -10
  121. package/dist/esm/utils/StyledTooltip.js +38 -0
  122. package/dist/esm/utils/VirtualizedList.js +37 -29
  123. package/dist/esm/utils/errors.js +15 -15
  124. package/dist/esm/utils/requests.js +24 -12
  125. package/dist/esm/utils/search.js +7 -7
  126. package/dist/esm/utils/string.js +7 -7
  127. package/dist/esm/utils/zarrData.js +27 -28
  128. package/package.json +24 -10
  129. package/scss/cherita-bootstrap.scss +2 -2
  130. package/scss/cherita.scss +65 -17
  131. package/scss/components/accordions.scss +15 -2
  132. package/scss/components/layouts.scss +116 -30
  133. package/scss/components/lists.scss +16 -5
  134. package/scss/components/plotly.scss +40 -23
  135. package/scss/components/plots.scss +14 -1
  136. package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
  137. package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
@@ -3,14 +3,15 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
3
3
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
4
4
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
5
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
- import React, { useDeferredValue, useEffect, useMemo, useState } from "react";
7
- import { faPlus } from "@fortawesome/free-solid-svg-icons";
8
- import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
9
- import _ from "lodash";
10
- import { Button, ListGroup } from "react-bootstrap";
11
- import { useSettingsDispatch } from "../../context/SettingsContext";
12
- import { useDiseaseSearch, useVarSearch } from "../../utils/search";
13
- import { VirtualizedList } from "../../utils/VirtualizedList";
6
+ import { useDeferredValue, useEffect, useMemo, useState } from 'react';
7
+ import { faPlus } from '@fortawesome/free-solid-svg-icons';
8
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
9
+ import _ from 'lodash';
10
+ import { Button, ListGroup } from 'react-bootstrap';
11
+ import { useSettingsDispatch } from '../../context/SettingsContext';
12
+ import { useDiseaseSearch, useVarSearch } from '../../utils/search';
13
+ import { VirtualizedList } from '../../utils/VirtualizedList';
14
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
14
15
  export function VarSearchResults(_ref) {
15
16
  let {
16
17
  text,
@@ -55,47 +56,59 @@ export function VarSearchResults(_ref) {
55
56
  }
56
57
  }, [fetchedData, isPending, serverError, setResultsLength]);
57
58
  const getDataAtIndex = index => deferredData[index];
58
- const ItemComponent = item => /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
59
- className: "virtualized-list-wrapper"
60
- }, /*#__PURE__*/React.createElement(ListGroup.Item, {
61
- key: item,
62
- onClick: () => {
63
- setSelectedResult(item);
64
- },
65
- active: (selectedResult === null || selectedResult === void 0 ? void 0 : selectedResult.index) === item.index
66
- }, /*#__PURE__*/React.createElement("div", {
67
- className: "d-flex justify-content-between align-items-center w-100"
68
- }, /*#__PURE__*/React.createElement("div", null, item.name), /*#__PURE__*/React.createElement("div", {
69
- className: "d-flex align-items-center gap-1"
70
- }, /*#__PURE__*/React.createElement(Button, {
71
- type: "button",
72
- className: "m-0 p-0 px-1",
73
- variant: "outline-secondary",
74
- title: "Add to list",
75
- disabled: isStale,
76
- onClick: () => {
77
- handleSelect(dispatch, item);
78
- }
79
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
80
- icon: faPlus
81
- })))))));
82
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
83
- className: "search-results"
84
- }, /*#__PURE__*/React.createElement(ListGroup, {
85
- variant: "flush",
86
- className: "cherita-list"
87
- }, deferredData !== null && deferredData !== void 0 && deferredData.length ? /*#__PURE__*/React.createElement(VirtualizedList, {
88
- getDataAtIndex: getDataAtIndex,
89
- count: deferredData.length,
90
- ItemComponent: ItemComponent,
91
- overscan: 500,
92
- estimateSize: 42,
93
- maxHeight: "70vh"
94
- }) : /*#__PURE__*/React.createElement(ListGroup.Item, {
95
- key: "empty",
96
- as: "button",
97
- disabled: true
98
- }, !text.length ? "Search features" : !serverError ? isStale || isPending ? "Loading..." : "No items found" : "Failed to fetch data"))));
59
+ const ItemComponent = item => /*#__PURE__*/_jsx(_Fragment, {
60
+ children: /*#__PURE__*/_jsx("div", {
61
+ className: "virtualized-list-wrapper",
62
+ children: /*#__PURE__*/_jsx(ListGroup.Item, {
63
+ onClick: () => {
64
+ setSelectedResult(item);
65
+ },
66
+ active: (selectedResult === null || selectedResult === void 0 ? void 0 : selectedResult.index) === item.index,
67
+ children: /*#__PURE__*/_jsxs("div", {
68
+ className: "d-flex justify-content-between align-items-center w-100",
69
+ children: [/*#__PURE__*/_jsx("div", {
70
+ children: item.name
71
+ }), /*#__PURE__*/_jsx("div", {
72
+ className: "d-flex align-items-center gap-1",
73
+ children: /*#__PURE__*/_jsx(Button, {
74
+ type: "button",
75
+ className: "m-0 p-0 px-1",
76
+ variant: "outline-secondary",
77
+ title: "Add to list",
78
+ disabled: isStale,
79
+ onClick: () => {
80
+ handleSelect(dispatch, item);
81
+ },
82
+ children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
83
+ icon: faPlus
84
+ })
85
+ })
86
+ })]
87
+ })
88
+ }, item)
89
+ })
90
+ });
91
+ return /*#__PURE__*/_jsx("div", {
92
+ children: /*#__PURE__*/_jsx("div", {
93
+ className: "search-results",
94
+ children: /*#__PURE__*/_jsx(ListGroup, {
95
+ variant: "flush",
96
+ className: "cherita-list",
97
+ children: deferredData !== null && deferredData !== void 0 && deferredData.length ? /*#__PURE__*/_jsx(VirtualizedList, {
98
+ getDataAtIndex: getDataAtIndex,
99
+ count: deferredData.length,
100
+ ItemComponent: ItemComponent,
101
+ overscan: 500,
102
+ estimateSize: () => 42,
103
+ maxHeight: "70vh"
104
+ }) : /*#__PURE__*/_jsx(ListGroup.Item, {
105
+ as: "button",
106
+ disabled: true,
107
+ children: !text.length ? 'Search features' : !serverError ? isStale || isPending ? 'Loading...' : 'No items found' : 'Failed to fetch data'
108
+ }, "empty")
109
+ })
110
+ })
111
+ });
99
112
  }
100
113
  export function DiseasesSearchResults(_ref2) {
101
114
  let {
@@ -139,32 +152,42 @@ export function DiseasesSearchResults(_ref2) {
139
152
  }
140
153
  }, [fetchedData, isPending, serverError, setResultsLength]);
141
154
  const getDataAtIndex = index => deferredData[index];
142
- const ItemComponent = item => /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
143
- className: "virtualized-list-wrapper"
144
- }, /*#__PURE__*/React.createElement(ListGroup.Item, {
145
- key: item.name,
146
- onClick: () => {
147
- setSelectedResult(item);
148
- },
149
- active: (selectedResult === null || selectedResult === void 0 ? void 0 : selectedResult.id) === item.id
150
- }, /*#__PURE__*/React.createElement("div", {
151
- className: "d-flex justify-content-between align-items-center w-100"
152
- }, /*#__PURE__*/React.createElement("div", null, item.disease_name)))));
153
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
154
- className: "search-results"
155
- }, /*#__PURE__*/React.createElement(ListGroup, {
156
- variant: "flush",
157
- className: "cherita-list"
158
- }, deferredData !== null && deferredData !== void 0 && deferredData.length ? /*#__PURE__*/React.createElement(VirtualizedList, {
159
- getDataAtIndex: getDataAtIndex,
160
- count: deferredData.length,
161
- ItemComponent: ItemComponent,
162
- overscan: 250,
163
- estimateSize: 32,
164
- maxHeight: "70vh"
165
- }) : /*#__PURE__*/React.createElement(ListGroup.Item, {
166
- key: "empty",
167
- as: "button",
168
- disabled: true
169
- }, !text.length ? "Search diseases" : !serverError ? isStale || isPending ? "Loading..." : "No items found" : "Failed to fetch data"))));
155
+ const ItemComponent = item => /*#__PURE__*/_jsx(_Fragment, {
156
+ children: /*#__PURE__*/_jsx("div", {
157
+ className: "virtualized-list-wrapper",
158
+ children: /*#__PURE__*/_jsx(ListGroup.Item, {
159
+ onClick: () => {
160
+ setSelectedResult(item);
161
+ },
162
+ active: (selectedResult === null || selectedResult === void 0 ? void 0 : selectedResult.id) === item.id,
163
+ children: /*#__PURE__*/_jsx("div", {
164
+ className: "d-flex justify-content-between align-items-center w-100",
165
+ children: /*#__PURE__*/_jsx("div", {
166
+ children: item.disease_name
167
+ })
168
+ })
169
+ }, item.name)
170
+ })
171
+ });
172
+ return /*#__PURE__*/_jsx("div", {
173
+ children: /*#__PURE__*/_jsx("div", {
174
+ className: "search-results",
175
+ children: /*#__PURE__*/_jsx(ListGroup, {
176
+ variant: "flush",
177
+ className: "cherita-list",
178
+ children: deferredData !== null && deferredData !== void 0 && deferredData.length ? /*#__PURE__*/_jsx(VirtualizedList, {
179
+ getDataAtIndex: getDataAtIndex,
180
+ count: deferredData.length,
181
+ ItemComponent: ItemComponent,
182
+ overscan: 250,
183
+ estimateSize: () => 32,
184
+ maxHeight: "70vh"
185
+ }) : /*#__PURE__*/_jsx(ListGroup.Item, {
186
+ as: "button",
187
+ disabled: true,
188
+ children: !text.length ? 'Search diseases' : !serverError ? isStale || isPending ? 'Loading...' : 'No items found' : 'Failed to fetch data'
189
+ }, "empty")
190
+ })
191
+ })
192
+ });
170
193
  }
@@ -0,0 +1,101 @@
1
+ import { faList, faSearch, faSliders } from '@fortawesome/free-solid-svg-icons';
2
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
3
+ import { Container, Nav, Navbar } from 'react-bootstrap';
4
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
5
+ export const Toolbar = _ref => {
6
+ let {
7
+ showObsBtn = true,
8
+ showVarsBtn = true,
9
+ showCtrlsBtn = true,
10
+ setShowObs,
11
+ setShowVars,
12
+ setShowControls
13
+ } = _ref;
14
+ return /*#__PURE__*/_jsx(Navbar, {
15
+ expand: "md",
16
+ bg: "primary",
17
+ variant: "dark",
18
+ className: "cherita-navbar",
19
+ children: /*#__PURE__*/_jsxs(Container, {
20
+ fluid: true,
21
+ children: [/*#__PURE__*/_jsx(Navbar.Toggle, {
22
+ "aria-controls": "navbarScroll"
23
+ }), /*#__PURE__*/_jsx(Navbar.Collapse, {
24
+ id: "navbarScroll",
25
+ children: /*#__PURE__*/_jsxs(Nav, {
26
+ navbarScroll: true,
27
+ children: [showObsBtn && /*#__PURE__*/_jsx(Nav.Item, {
28
+ className: "me-2",
29
+ children: /*#__PURE__*/_jsxs(Nav.Link, {
30
+ onClick: () => setShowObs(true),
31
+ children: [/*#__PURE__*/_jsx(FontAwesomeIcon, {
32
+ icon: faList,
33
+ className: "me-2"
34
+ }), "Explore Categories"]
35
+ })
36
+ }), showVarsBtn && /*#__PURE__*/_jsx(Nav.Item, {
37
+ className: "me-2",
38
+ children: /*#__PURE__*/_jsxs(Nav.Link, {
39
+ onClick: () => setShowVars(true),
40
+ children: [/*#__PURE__*/_jsx(FontAwesomeIcon, {
41
+ icon: faSearch,
42
+ className: "me-2"
43
+ }), "Search Genes"]
44
+ })
45
+ }), showCtrlsBtn && /*#__PURE__*/_jsx(Nav.Item, {
46
+ className: "me-2",
47
+ children: /*#__PURE__*/_jsxs(Nav.Link, {
48
+ onClick: () => setShowControls(true),
49
+ children: [/*#__PURE__*/_jsx(FontAwesomeIcon, {
50
+ icon: faSliders,
51
+ className: "me-2"
52
+ }), "Controls"]
53
+ })
54
+ })]
55
+ })
56
+ })]
57
+ })
58
+ });
59
+ };
60
+ export const ObsPlotlyToolbar = _ref2 => {
61
+ let {
62
+ onClick
63
+ } = _ref2;
64
+ return {
65
+ name: 'Categories',
66
+ icon: {
67
+ width: 512,
68
+ height: 512,
69
+ path: faList.icon[4]
70
+ },
71
+ click: onClick
72
+ };
73
+ };
74
+ export const VarPlotlyToolbar = _ref3 => {
75
+ let {
76
+ onClick
77
+ } = _ref3;
78
+ return {
79
+ name: 'Features',
80
+ icon: {
81
+ width: 512,
82
+ height: 512,
83
+ path: faSearch.icon[4]
84
+ },
85
+ click: onClick
86
+ };
87
+ };
88
+ export const ControlsPlotlyToolbar = _ref4 => {
89
+ let {
90
+ onClick
91
+ } = _ref4;
92
+ return {
93
+ name: 'Controls',
94
+ icon: {
95
+ width: 512,
96
+ height: 512,
97
+ path: faSliders.icon[4]
98
+ },
99
+ click: onClick
100
+ };
101
+ };
@@ -1,26 +1,26 @@
1
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
2
1
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
2
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
3
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
4
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
6
5
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
7
- import React, { useEffect, useState } from "react";
8
- import { faDroplet, faPlus, faTrash } from "@fortawesome/free-solid-svg-icons";
9
- import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
10
- import { MoreVert } from "@mui/icons-material";
11
- import _ from "lodash";
12
- import { Button, Collapse, ListGroup, Table } from "react-bootstrap";
13
- import { COLOR_ENCODINGS, SELECTION_MODES } from "../../constants/constants";
14
- import { useDataset } from "../../context/DatasetContext";
15
- import { useFilteredData } from "../../context/FilterContext";
16
- import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
17
- import { Histogram } from "../../utils/Histogram";
18
- import { useDebouncedFetch, useFetch } from "../../utils/requests";
6
+ import { useEffect, useState } from 'react';
7
+ import { faDroplet, faPlus, faTrash } from '@fortawesome/free-solid-svg-icons';
8
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
9
+ import { MoreVert } from '@mui/icons-material';
10
+ import _ from 'lodash';
11
+ import { Button, Collapse, ListGroup, Table } from 'react-bootstrap';
12
+ import { COLOR_ENCODINGS, SELECTION_MODES } from '../../constants/constants';
13
+ import { useDataset } from '../../context/DatasetContext';
14
+ import { useFilteredData } from '../../context/FilterContext';
15
+ import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
16
+ import { Histogram } from '../../utils/Histogram';
17
+ import { useDebouncedFetch, useFetch } from '../../utils/requests';
18
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
19
19
  function VarHistogram(_ref) {
20
20
  let {
21
21
  item
22
22
  } = _ref;
23
- const ENDPOINT = "var/histograms";
23
+ const ENDPOINT = 'var/histograms';
24
24
  const dataset = useDataset();
25
25
  const settings = useSettings();
26
26
  const {
@@ -48,42 +48,61 @@ function VarHistogram(_ref) {
48
48
  } = useDebouncedFetch(ENDPOINT, params, {
49
49
  refetchOnMount: false
50
50
  });
51
- return !serverError && /*#__PURE__*/React.createElement(Histogram, {
51
+ return !serverError && /*#__PURE__*/_jsx(Histogram, {
52
52
  data: fetchedData,
53
53
  isPending: isPending,
54
54
  altColor: isSliced
55
55
  });
56
56
  }
57
57
  function VarDiseaseInfoItem(item) {
58
- return /*#__PURE__*/React.createElement(ListGroup.Item, {
59
- key: item.disease_id,
60
- className: "feature-disease-info"
61
- }, /*#__PURE__*/React.createElement("button", {
62
- type: "button",
63
- className: "btn btn-link disease-link"
64
- }, item.disease_name), /*#__PURE__*/React.createElement(Table, {
65
- striped: true,
66
- size: "sm",
67
- responsive: true
68
- }, /*#__PURE__*/React.createElement("tbody", null, /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, "Confidence"), /*#__PURE__*/React.createElement("td", null, item.confidence || "unknown")), /*#__PURE__*/React.createElement("tr", null, /*#__PURE__*/React.createElement("td", null, "Organ", item.organs.length > 1 ? "s" : ""), /*#__PURE__*/React.createElement("td", null, item.organs.map(o => o.name).join(", "))), !_.isEmpty(item.metadata) && _.map(item.metadata, (value, key) => {
69
- if (value !== null && value !== undefined) {
70
- return /*#__PURE__*/React.createElement("tr", {
71
- key: key
72
- }, /*#__PURE__*/React.createElement("td", null, _.upperFirst(key)), /*#__PURE__*/React.createElement("td", null, value));
73
- }
74
- }))));
58
+ return /*#__PURE__*/_jsxs(ListGroup.Item, {
59
+ className: "feature-disease-info",
60
+ children: [/*#__PURE__*/_jsx("button", {
61
+ type: "button",
62
+ className: "btn btn-link disease-link",
63
+ children: item.disease_name
64
+ }), /*#__PURE__*/_jsx(Table, {
65
+ striped: true,
66
+ size: "sm",
67
+ responsive: true,
68
+ children: /*#__PURE__*/_jsxs("tbody", {
69
+ children: [/*#__PURE__*/_jsxs("tr", {
70
+ children: [/*#__PURE__*/_jsx("td", {
71
+ children: "Confidence"
72
+ }), /*#__PURE__*/_jsx("td", {
73
+ children: item.confidence || 'unknown'
74
+ })]
75
+ }), /*#__PURE__*/_jsxs("tr", {
76
+ children: [/*#__PURE__*/_jsxs("td", {
77
+ children: ["Organ", item.organs.length > 1 ? 's' : '']
78
+ }), /*#__PURE__*/_jsx("td", {
79
+ children: item.organs.map(o => o.name).join(', ')
80
+ })]
81
+ }), !_.isEmpty(item.metadata) && _.map(item.metadata, (value, key) => {
82
+ if (value !== null && value !== undefined) {
83
+ return /*#__PURE__*/_jsxs("tr", {
84
+ children: [/*#__PURE__*/_jsx("td", {
85
+ children: _.upperFirst(key)
86
+ }), /*#__PURE__*/_jsx("td", {
87
+ children: value
88
+ })]
89
+ }, key);
90
+ }
91
+ })]
92
+ })
93
+ })]
94
+ }, item.disease_id);
75
95
  }
76
96
  export function VarDiseaseInfo(_ref2) {
77
97
  let {
78
98
  data
79
99
  } = _ref2;
80
- return /*#__PURE__*/React.createElement(ListGroup, {
81
- className: "feature-disease-info-list"
82
- }, data.map(item => {
83
- return /*#__PURE__*/React.createElement(VarDiseaseInfoItem, _extends({
84
- key: item.disease_id
85
- }, item));
86
- }));
100
+ return /*#__PURE__*/_jsx(ListGroup, {
101
+ className: "feature-disease-info-list",
102
+ children: data.map(item => {
103
+ return /*#__PURE__*/_jsx(VarDiseaseInfoItem, _objectSpread({}, item), item.disease_id);
104
+ })
105
+ });
87
106
  }
88
107
  export function SelectionItem(_ref3) {
89
108
  let {
@@ -95,7 +114,7 @@ export function SelectionItem(_ref3) {
95
114
  showRemove = true,
96
115
  isMultiple = false
97
116
  } = _ref3;
98
- const ENDPOINT = "disease/gene";
117
+ const ENDPOINT = 'disease/gene';
99
118
  const [openInfo, setOpenInfo] = useState(false);
100
119
  const dataset = useDataset();
101
120
  const params = {
@@ -112,53 +131,83 @@ export function SelectionItem(_ref3) {
112
131
  enabled: !!dataset.diseaseDatasets.length
113
132
  });
114
133
  const hasDiseaseInfo = !isPending && !serverError && !!(fetchedData !== null && fetchedData !== void 0 && fetchedData.length);
115
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
116
- className: "d-flex justify-content-between ".concat(hasDiseaseInfo ? "cursor-pointer" : ""),
117
- onClick: () => {
118
- setOpenInfo(o => !o);
119
- }
120
- }, /*#__PURE__*/React.createElement("div", {
121
- className: "d-flex justify-content-between align-items-center w-100"
122
- }, /*#__PURE__*/React.createElement("div", null, item.name), /*#__PURE__*/React.createElement("div", {
123
- className: "d-flex align-items-center gap-1"
124
- }, hasDiseaseInfo && /*#__PURE__*/React.createElement(MoreVert, null), /*#__PURE__*/React.createElement(VarHistogram, {
125
- item: item
126
- }), showSetColorEncoding && /*#__PURE__*/React.createElement(Button, {
127
- type: "button",
128
- key: item.matrix_index,
129
- variant: isActive ? "primary" : isNotInData ? "outline-secondary" : "outline-primary",
130
- className: "m-0 p-0 px-1",
131
- onClick: e => {
132
- e.stopPropagation();
133
- selectVar();
134
- },
135
- disabled: isNotInData,
136
- title: isNotInData ? "Not present in data" : "Set as color encoding"
137
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
138
- icon: faDroplet
139
- }), isMultiple && /*#__PURE__*/React.createElement(FontAwesomeIcon, {
140
- icon: faPlus,
141
- size: "xs",
142
- className: "ps-xs-1"
143
- })), showRemove && /*#__PURE__*/React.createElement(Button, {
144
- type: "button",
145
- className: "m-0 p-0 px-1",
146
- variant: "outline-secondary",
147
- title: "Remove from list",
148
- onClick: e => {
149
- e.stopPropagation();
150
- removeVar();
151
- }
152
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
153
- icon: faTrash
154
- }))))), hasDiseaseInfo && /*#__PURE__*/React.createElement(Collapse, {
155
- in: openInfo
156
- }, /*#__PURE__*/React.createElement("div", {
157
- className: "mt-2 var-disease-info-collapse"
158
- }, /*#__PURE__*/React.createElement(VarDiseaseInfo, {
159
- data: fetchedData
160
- }))));
134
+ return /*#__PURE__*/_jsxs(_Fragment, {
135
+ children: [/*#__PURE__*/_jsx("div", {
136
+ className: hasDiseaseInfo ? 'cursor-pointer' : '',
137
+ onClick: () => {
138
+ setOpenInfo(o => !o);
139
+ },
140
+ children: /*#__PURE__*/_jsxs("div", {
141
+ className: "d-flex align-items-center",
142
+ children: [/*#__PURE__*/_jsx("div", {
143
+ className: "var-item-name",
144
+ title: item.name,
145
+ children: item.name
146
+ }), /*#__PURE__*/_jsxs("div", {
147
+ className: "ms-auto d-flex align-items-center gap-1",
148
+ children: [hasDiseaseInfo && /*#__PURE__*/_jsx(MoreVert, {}), /*#__PURE__*/_jsx(VarHistogram, {
149
+ item: item
150
+ }), showSetColorEncoding && /*#__PURE__*/_jsxs(Button, {
151
+ type: "button",
152
+ variant: isActive ? 'primary' : isNotInData ? 'outline-secondary' : 'outline-primary',
153
+ className: "m-0 p-0 px-1",
154
+ onClick: e => {
155
+ e.stopPropagation();
156
+ selectVar();
157
+ },
158
+ disabled: isNotInData,
159
+ title: isNotInData ? 'Not present in data' : 'Set as color encoding',
160
+ children: [/*#__PURE__*/_jsx(FontAwesomeIcon, {
161
+ icon: faDroplet
162
+ }), isMultiple && /*#__PURE__*/_jsx(FontAwesomeIcon, {
163
+ icon: faPlus,
164
+ size: "xs",
165
+ className: "ps-xs-1"
166
+ })]
167
+ }, item.matrix_index), showRemove && /*#__PURE__*/_jsx(Button, {
168
+ type: "button",
169
+ className: "m-0 p-0 px-1",
170
+ variant: "outline-secondary",
171
+ title: "Remove from list",
172
+ onClick: e => {
173
+ e.stopPropagation();
174
+ removeVar();
175
+ },
176
+ children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
177
+ icon: faTrash
178
+ })
179
+ })]
180
+ })]
181
+ })
182
+ }), hasDiseaseInfo && /*#__PURE__*/_jsx(Collapse, {
183
+ in: openInfo,
184
+ children: /*#__PURE__*/_jsx("div", {
185
+ className: "mt-2 var-disease-info-collapse",
186
+ children: /*#__PURE__*/_jsx(VarDiseaseInfo, {
187
+ data: fetchedData
188
+ })
189
+ })
190
+ })]
191
+ });
161
192
  }
193
+ const select = (dispatch, mode, item) => {
194
+ if (mode === SELECTION_MODES.SINGLE) {
195
+ dispatch({
196
+ type: 'select.var',
197
+ var: item
198
+ });
199
+ } else if (mode === SELECTION_MODES.MULTIPLE) {
200
+ dispatch({
201
+ type: 'select.multivar',
202
+ var: item
203
+ });
204
+ }
205
+ dispatch({
206
+ type: 'set.colorEncoding',
207
+ value: COLOR_ENCODINGS.VAR
208
+ });
209
+ };
210
+ const debounceSelect = _.debounce(select, 200);
162
211
  export function VarItem(_ref4) {
163
212
  let {
164
213
  item,
@@ -167,42 +216,22 @@ export function VarItem(_ref4) {
167
216
  } = _ref4;
168
217
  const settings = useSettings();
169
218
  const dispatch = useSettingsDispatch();
170
- const selectVar = () => {
171
- if (mode === SELECTION_MODES.SINGLE) {
172
- dispatch({
173
- type: "select.var",
174
- var: item
175
- });
176
- dispatch({
177
- type: "set.colorEncoding",
178
- value: COLOR_ENCODINGS.VAR
179
- });
180
- } else if (mode === SELECTION_MODES.MULTIPLE) {
181
- dispatch({
182
- type: "select.multivar",
183
- var: item
184
- });
185
- dispatch({
186
- type: "set.colorEncoding",
187
- value: COLOR_ENCODINGS.VAR
188
- });
189
- }
190
- };
219
+ const selectVar = () => debounceSelect(dispatch, mode, item);
191
220
  const removeVar = () => {
192
221
  dispatch({
193
- type: "remove.var",
222
+ type: 'remove.var',
194
223
  var: item
195
224
  });
196
225
  if (mode === SELECTION_MODES.SINGLE) {
197
226
  if (active === item.matrix_index) {
198
227
  dispatch({
199
- type: "reset.var"
228
+ type: 'reset.var'
200
229
  });
201
230
  }
202
231
  } else if (mode === SELECTION_MODES.MULTIPLE) {
203
232
  if (active.includes(item.matrix_index)) {
204
233
  dispatch({
205
- type: "deselect.multivar",
234
+ type: 'deselect.multivar',
206
235
  var: item
207
236
  });
208
237
  }
@@ -210,19 +239,19 @@ export function VarItem(_ref4) {
210
239
  };
211
240
  const toggleVar = () => {
212
241
  dispatch({
213
- type: "toggle.multivar",
242
+ type: 'toggle.multivar',
214
243
  var: item
215
244
  });
216
245
  };
217
246
  if (item && mode === SELECTION_MODES.SINGLE) {
218
- return /*#__PURE__*/React.createElement(SelectionItem, {
247
+ return /*#__PURE__*/_jsx(SelectionItem, {
219
248
  item: item,
220
249
  isActive: settings.colorEncoding === COLOR_ENCODINGS.VAR && active === item.matrix_index,
221
250
  selectVar: selectVar,
222
251
  removeVar: removeVar
223
252
  });
224
253
  } else if (mode === SELECTION_MODES.MULTIPLE) {
225
- return /*#__PURE__*/React.createElement(SelectionItem, {
254
+ return /*#__PURE__*/_jsx(SelectionItem, {
226
255
  item: item,
227
256
  isActive: item.matrix_index !== -1 && _.includes(active, item.matrix_index),
228
257
  selectVar: toggleVar,