@haniffalab/cherita-react 1.4.1 → 1.4.2-dev.2025-10-29.81a6b906

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 (138) 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 +67 -69
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +100 -74
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +89 -44
  8. package/dist/cjs/components/heatmap/Heatmap.js +65 -65
  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 +65 -66
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +258 -210
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -133
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +53 -38
  23. package/dist/cjs/components/offcanvas/index.js +61 -31
  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 +127 -99
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +140 -113
  29. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  30. package/dist/cjs/components/search-bar/SearchBar.js +168 -121
  31. package/dist/cjs/components/search-bar/SearchInfo.js +76 -50
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +46 -37
  34. package/dist/cjs/components/var-list/VarItem.js +115 -88
  35. package/dist/cjs/components/var-list/VarList.js +85 -69
  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 +109 -107
  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 +47 -47
  42. package/dist/cjs/context/DatasetContext.js +24 -16
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +255 -89
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/zarr-helper.js +3 -3
  48. package/dist/cjs/utils/Filter.js +16 -11
  49. package/dist/cjs/utils/Histogram.js +35 -33
  50. package/dist/cjs/utils/ImageViewer.js +11 -8
  51. package/dist/cjs/utils/Legend.js +37 -30
  52. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  53. package/dist/cjs/utils/Resolver.js +213 -0
  54. package/dist/cjs/utils/Skeleton.js +10 -10
  55. package/dist/cjs/utils/StyledTooltip.js +44 -0
  56. package/dist/cjs/utils/VirtualizedList.js +34 -27
  57. package/dist/cjs/utils/errors.js +15 -15
  58. package/dist/cjs/utils/requests.js +21 -9
  59. package/dist/cjs/utils/search.js +4 -4
  60. package/dist/cjs/utils/string.js +6 -6
  61. package/dist/cjs/utils/zarrData.js +20 -21
  62. package/dist/css/cherita.css +64 -42
  63. package/dist/css/cherita.css.map +1 -1
  64. package/dist/esm/components/controls/Controls.js +43 -35
  65. package/dist/esm/components/dotplot/Dotplot.js +77 -78
  66. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  67. package/dist/esm/components/full-page/FullPage.js +120 -93
  68. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  69. package/dist/esm/components/full-page/PlotTypeSelector.js +90 -45
  70. package/dist/esm/components/heatmap/Heatmap.js +75 -74
  71. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  72. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  73. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  74. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  75. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  76. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  77. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  78. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  79. package/dist/esm/components/matrixplot/Matrixplot.js +75 -75
  80. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  81. package/dist/esm/components/obs-list/ObsItem.js +273 -222
  82. package/dist/esm/components/obs-list/ObsList.js +176 -147
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +60 -44
  85. package/dist/esm/components/offcanvas/index.js +67 -37
  86. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  87. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  88. package/dist/esm/components/scatterplot/Scatterplot.js +148 -119
  89. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  90. package/dist/esm/components/scatterplot/SpatialControls.js +153 -125
  91. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  92. package/dist/esm/components/search-bar/SearchBar.js +180 -132
  93. package/dist/esm/components/search-bar/SearchInfo.js +86 -59
  94. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  95. package/dist/esm/components/toolbar/Toolbar.js +49 -39
  96. package/dist/esm/components/var-list/VarItem.js +126 -98
  97. package/dist/esm/components/var-list/VarList.js +99 -82
  98. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  99. package/dist/esm/components/var-list/VarSet.js +134 -115
  100. package/dist/esm/components/violin/Violin.js +121 -118
  101. package/dist/esm/components/violin/ViolinControls.js +10 -6
  102. package/dist/esm/constants/colorscales.js +19 -19
  103. package/dist/esm/constants/constants.js +47 -47
  104. package/dist/esm/context/DatasetContext.js +31 -22
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +257 -90
  107. package/dist/esm/context/ZarrDataContext.js +8 -6
  108. package/dist/esm/helpers/color-helper.js +5 -5
  109. package/dist/esm/helpers/map-helper.js +2 -2
  110. package/dist/esm/helpers/zarr-helper.js +6 -6
  111. package/dist/esm/index.js +22 -22
  112. package/dist/esm/utils/Filter.js +22 -17
  113. package/dist/esm/utils/Histogram.js +39 -37
  114. package/dist/esm/utils/ImageViewer.js +12 -8
  115. package/dist/esm/utils/Legend.js +44 -36
  116. package/dist/esm/utils/LoadingIndicators.js +16 -13
  117. package/dist/esm/utils/Resolver.js +201 -0
  118. package/dist/esm/utils/Skeleton.js +11 -10
  119. package/dist/esm/utils/StyledTooltip.js +38 -0
  120. package/dist/esm/utils/VirtualizedList.js +35 -27
  121. package/dist/esm/utils/errors.js +15 -15
  122. package/dist/esm/utils/requests.js +24 -12
  123. package/dist/esm/utils/search.js +7 -7
  124. package/dist/esm/utils/string.js +7 -7
  125. package/dist/esm/utils/zarrData.js +27 -28
  126. package/package.json +21 -9
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +43 -17
  129. package/scss/components/accordions.scss +4 -1
  130. package/scss/components/layouts.scss +15 -33
  131. package/scss/components/lists.scss +8 -4
  132. package/scss/components/plotly.scss +38 -26
  133. package/scss/components/plots.scss +14 -1
  134. package/dist/assets/images/plots/dotplot.svg +0 -152
  135. package/dist/assets/images/plots/heatmap.svg +0 -193
  136. package/dist/assets/images/plots/matrixplot.svg +0 -275
  137. package/dist/assets/images/plots/scatterplot.svg +0 -198
  138. package/dist/assets/images/plots/violin.svg +0 -50
@@ -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
  }
@@ -1,7 +1,7 @@
1
- import React from "react";
2
- import { faList, faSearch, faSliders } from "@fortawesome/free-solid-svg-icons";
3
- import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
4
- import { Container, Nav, Navbar } from "react-bootstrap";
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
5
  export const Toolbar = _ref => {
6
6
  let {
7
7
  showObsBtn = true,
@@ -11,48 +11,58 @@ export const Toolbar = _ref => {
11
11
  setShowVars,
12
12
  setShowControls
13
13
  } = _ref;
14
- return /*#__PURE__*/React.createElement(Navbar, {
14
+ return /*#__PURE__*/_jsx(Navbar, {
15
15
  expand: "md",
16
16
  bg: "primary",
17
17
  variant: "dark",
18
- className: "cherita-navbar"
19
- }, /*#__PURE__*/React.createElement(Container, {
20
- fluid: true
21
- }, /*#__PURE__*/React.createElement(Navbar.Toggle, {
22
- "aria-controls": "navbarScroll"
23
- }), /*#__PURE__*/React.createElement(Navbar.Collapse, {
24
- id: "navbarScroll"
25
- }, /*#__PURE__*/React.createElement(Nav, {
26
- navbarScroll: true
27
- }, showObsBtn && /*#__PURE__*/React.createElement(Nav.Item, {
28
- className: "me-2"
29
- }, /*#__PURE__*/React.createElement(Nav.Link, {
30
- onClick: () => setShowObs(true)
31
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
32
- icon: faList,
33
- className: "me-2"
34
- }), "Explore Categories")), showVarsBtn && /*#__PURE__*/React.createElement(Nav.Item, {
35
- className: "me-2"
36
- }, /*#__PURE__*/React.createElement(Nav.Link, {
37
- onClick: () => setShowVars(true)
38
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
39
- icon: faSearch,
40
- className: "me-2"
41
- }), "Search Genes")), showCtrlsBtn && /*#__PURE__*/React.createElement(Nav.Item, {
42
- className: "me-2"
43
- }, /*#__PURE__*/React.createElement(Nav.Link, {
44
- onClick: () => setShowControls(true)
45
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
46
- icon: faSliders,
47
- className: "me-2"
48
- }), "Controls"))))));
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
+ });
49
59
  };
50
60
  export const ObsPlotlyToolbar = _ref2 => {
51
61
  let {
52
62
  onClick
53
63
  } = _ref2;
54
64
  return {
55
- name: "Categories",
65
+ name: 'Categories',
56
66
  icon: {
57
67
  width: 512,
58
68
  height: 512,
@@ -66,7 +76,7 @@ export const VarPlotlyToolbar = _ref3 => {
66
76
  onClick
67
77
  } = _ref3;
68
78
  return {
69
- name: "Features",
79
+ name: 'Features',
70
80
  icon: {
71
81
  width: 512,
72
82
  height: 512,
@@ -80,7 +90,7 @@ export const ControlsPlotlyToolbar = _ref4 => {
80
90
  onClick
81
91
  } = _ref4;
82
92
  return {
83
- name: "Controls",
93
+ name: 'Controls',
84
94
  icon: {
85
95
  width: 512,
86
96
  height: 512,
@@ -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,70 +131,79 @@ 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: hasDiseaseInfo ? "cursor-pointer" : "",
117
- onClick: () => {
118
- setOpenInfo(o => !o);
119
- }
120
- }, /*#__PURE__*/React.createElement("div", {
121
- className: "d-flex align-items-center"
122
- }, /*#__PURE__*/React.createElement("div", {
123
- className: "var-item-name",
124
- title: item.name
125
- }, item.name), /*#__PURE__*/React.createElement("div", {
126
- className: "ms-auto d-flex align-items-center gap-1"
127
- }, hasDiseaseInfo && /*#__PURE__*/React.createElement(MoreVert, null), /*#__PURE__*/React.createElement(VarHistogram, {
128
- item: item
129
- }), showSetColorEncoding && /*#__PURE__*/React.createElement(Button, {
130
- type: "button",
131
- key: item.matrix_index,
132
- variant: isActive ? "primary" : isNotInData ? "outline-secondary" : "outline-primary",
133
- className: "m-0 p-0 px-1",
134
- onClick: e => {
135
- e.stopPropagation();
136
- selectVar();
137
- },
138
- disabled: isNotInData,
139
- title: isNotInData ? "Not present in data" : "Set as color encoding"
140
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
141
- icon: faDroplet
142
- }), isMultiple && /*#__PURE__*/React.createElement(FontAwesomeIcon, {
143
- icon: faPlus,
144
- size: "xs",
145
- className: "ps-xs-1"
146
- })), showRemove && /*#__PURE__*/React.createElement(Button, {
147
- type: "button",
148
- className: "m-0 p-0 px-1",
149
- variant: "outline-secondary",
150
- title: "Remove from list",
151
- onClick: e => {
152
- e.stopPropagation();
153
- removeVar();
154
- }
155
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
156
- icon: faTrash
157
- }))))), hasDiseaseInfo && /*#__PURE__*/React.createElement(Collapse, {
158
- in: openInfo
159
- }, /*#__PURE__*/React.createElement("div", {
160
- className: "mt-2 var-disease-info-collapse"
161
- }, /*#__PURE__*/React.createElement(VarDiseaseInfo, {
162
- data: fetchedData
163
- }))));
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
+ });
164
192
  }
165
193
  const select = (dispatch, mode, item) => {
166
194
  if (mode === SELECTION_MODES.SINGLE) {
167
195
  dispatch({
168
- type: "select.var",
196
+ type: 'select.var',
169
197
  var: item
170
198
  });
171
199
  } else if (mode === SELECTION_MODES.MULTIPLE) {
172
200
  dispatch({
173
- type: "select.multivar",
201
+ type: 'select.multivar',
174
202
  var: item
175
203
  });
176
204
  }
177
205
  dispatch({
178
- type: "set.colorEncoding",
206
+ type: 'set.colorEncoding',
179
207
  value: COLOR_ENCODINGS.VAR
180
208
  });
181
209
  };
@@ -191,19 +219,19 @@ export function VarItem(_ref4) {
191
219
  const selectVar = () => debounceSelect(dispatch, mode, item);
192
220
  const removeVar = () => {
193
221
  dispatch({
194
- type: "remove.var",
222
+ type: 'remove.var',
195
223
  var: item
196
224
  });
197
225
  if (mode === SELECTION_MODES.SINGLE) {
198
226
  if (active === item.matrix_index) {
199
227
  dispatch({
200
- type: "reset.var"
228
+ type: 'reset.var'
201
229
  });
202
230
  }
203
231
  } else if (mode === SELECTION_MODES.MULTIPLE) {
204
232
  if (active.includes(item.matrix_index)) {
205
233
  dispatch({
206
- type: "deselect.multivar",
234
+ type: 'deselect.multivar',
207
235
  var: item
208
236
  });
209
237
  }
@@ -211,19 +239,19 @@ export function VarItem(_ref4) {
211
239
  };
212
240
  const toggleVar = () => {
213
241
  dispatch({
214
- type: "toggle.multivar",
242
+ type: 'toggle.multivar',
215
243
  var: item
216
244
  });
217
245
  };
218
246
  if (item && mode === SELECTION_MODES.SINGLE) {
219
- return /*#__PURE__*/React.createElement(SelectionItem, {
247
+ return /*#__PURE__*/_jsx(SelectionItem, {
220
248
  item: item,
221
249
  isActive: settings.colorEncoding === COLOR_ENCODINGS.VAR && active === item.matrix_index,
222
250
  selectVar: selectVar,
223
251
  removeVar: removeVar
224
252
  });
225
253
  } else if (mode === SELECTION_MODES.MULTIPLE) {
226
- return /*#__PURE__*/React.createElement(SelectionItem, {
254
+ return /*#__PURE__*/_jsx(SelectionItem, {
227
255
  item: item,
228
256
  isActive: item.matrix_index !== -1 && _.includes(active, item.matrix_index),
229
257
  selectVar: toggleVar,