@haniffalab/cherita-react 1.3.0-dev.2025-06-06.f1eddad0 → 1.3.1

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 +99 -105
  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 +267 -205
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -129
  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 +128 -100
  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 +176 -120
  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 +131 -103
  35. package/dist/cjs/components/var-list/VarList.js +85 -71
  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 -97
  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 +51 -48
  42. package/dist/cjs/context/DatasetContext.js +26 -17
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +271 -88
  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 +36 -29
  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 +135 -65
  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 +119 -124
  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 +282 -217
  82. package/dist/esm/components/obs-list/ObsList.js +176 -143
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +71 -32
  85. package/dist/esm/components/offcanvas/index.js +68 -33
  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 +149 -120
  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 +187 -130
  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 +142 -113
  97. package/dist/esm/components/var-list/VarList.js +99 -84
  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 -108
  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 +50 -47
  104. package/dist/esm/context/DatasetContext.js +33 -23
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +273 -89
  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 +37 -29
  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 -10
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +65 -16
  129. package/scss/components/accordions.scss +15 -2
  130. package/scss/components/layouts.scss +68 -50
  131. package/scss/components/lists.scss +16 -5
  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
@@ -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,
@@ -3,24 +3,26 @@ 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, { useEffect, useState } from "react";
7
- import { faTimes } from "@fortawesome/free-solid-svg-icons";
8
- import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
9
- import _ from "lodash";
10
- import { Alert, Button, ListGroup } from "react-bootstrap";
11
- import ButtonGroup from "react-bootstrap/ButtonGroup";
12
- import { VarItem } from "./VarItem";
13
- import { VarListToolbar } from "./VarListToolbar";
14
- import { VarSet } from "./VarSet";
15
- import { SELECTION_MODES, VAR_SORT } from "../../constants/constants";
16
- import { useDataset } from "../../context/DatasetContext";
17
- import { useFilteredData } from "../../context/FilterContext";
18
- import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
19
- import { LoadingSpinner } from "../../utils/LoadingIndicators";
20
- import { useFetch } from "../../utils/requests";
6
+ import { useEffect, useState } from 'react';
7
+ import { faTimes } from '@fortawesome/free-solid-svg-icons';
8
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
9
+ import _ from 'lodash';
10
+ import { Alert, Button, ListGroup } from 'react-bootstrap';
11
+ import ButtonGroup from 'react-bootstrap/ButtonGroup';
12
+ import { VarItem } from './VarItem';
13
+ import { VarListToolbar } from './VarListToolbar';
14
+ import { VarSet } from './VarSet';
15
+ import { SELECTION_MODES, VAR_SORT } from '../../constants/constants';
16
+ import { useDataset } from '../../context/DatasetContext';
17
+ import { useFilteredData } from '../../context/FilterContext';
18
+ import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
19
+ import { LoadingSpinner } from '../../utils/LoadingIndicators';
20
+ import { useFetch } from '../../utils/requests';
21
+ import { useSelectedMultiVar, useSelectedVar, useSettingsVars } from '../../utils/Resolver';
22
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
21
23
  export const useVarMean = function (varKeys) {
22
24
  let enabled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
23
- const ENDPOINT = "matrix/mean";
25
+ const ENDPOINT = 'matrix/mean';
24
26
  const dataset = useDataset();
25
27
  const {
26
28
  obsIndices
@@ -29,7 +31,7 @@ export const useVarMean = function (varKeys) {
29
31
  url: dataset.url,
30
32
  varKeys: _.map(varKeys, v => v.isSet ? {
31
33
  name: v.name,
32
- indices: v.vars.map(v => v.index)
34
+ indices: v.vars.map(vv => vv.index)
33
35
  } : v.index),
34
36
  obsIndices: obsIndices,
35
37
  varNamesCol: dataset.varNamesCol
@@ -39,7 +41,7 @@ export const useVarMean = function (varKeys) {
39
41
  return _objectSpread(_objectSpread({}, p), {}, {
40
42
  varKeys: _.map(varKeys, v => v.isSet ? {
41
43
  name: v.name,
42
- indices: v.vars.map(v => v.index)
44
+ indices: v.vars.map(vv => vv.index)
43
45
  } : v.index),
44
46
  obsIndices: obsIndices
45
47
  });
@@ -56,59 +58,60 @@ export const sortMeans = (i, means) => {
56
58
  return means[i.name] || _.min(_.values(means)) - 1;
57
59
  };
58
60
  export function VarNamesList(_ref) {
59
- var _settings$selectedVar, _settings$selectedVar2;
60
61
  let {
61
62
  mode = SELECTION_MODES.SINGLE,
62
- displayName = "genes"
63
+ displayName = 'genes'
63
64
  } = _ref;
64
65
  const settings = useSettings();
65
66
  const dispatch = useSettingsDispatch();
66
- const [active, setActive] = useState(mode === SELECTION_MODES.SINGLE ? ((_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.matrix_index) || ((_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name) : settings.selectedMultiVar.map(i => i.matrix_index || i.name));
67
+ const selectedVar = useSelectedVar();
68
+ const selectedMultiVar = useSelectedMultiVar();
69
+ const settingsVars = useSettingsVars();
70
+ const [active, setActive] = useState(mode === SELECTION_MODES.SINGLE ? (selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.matrix_index) || (selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name) : selectedMultiVar.map(i => i.matrix_index || i.name));
67
71
  const [sortedVars, setSortedVars] = useState([]);
68
72
  useEffect(() => {
69
73
  if (mode === SELECTION_MODES.SINGLE) {
70
- var _settings$selectedVar3, _settings$selectedVar4;
71
- setActive(((_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.matrix_index) || ((_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.name));
74
+ setActive((selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.matrix_index) || (selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name));
72
75
  }
73
- }, [mode, settings.selectedVar]);
76
+ }, [mode, selectedVar]);
74
77
  useEffect(() => {
75
78
  if (mode === SELECTION_MODES.MULTIPLE) {
76
- setActive(settings.selectedMultiVar.map(i => i.matrix_index || i.name));
79
+ setActive(selectedMultiVar.map(i => i.matrix_index || i.name));
77
80
  }
78
- }, [mode, settings.selectedMultiVar]);
79
- const varMeans = useVarMean(settings.vars, settings.varSort.var.sort === VAR_SORT.MATRIX);
81
+ }, [mode, selectedMultiVar]);
82
+ const varMeans = useVarMean(settingsVars, settings.varSort.var.sort === VAR_SORT.MATRIX);
80
83
 
81
84
  // @TODO: deferr sortedVars ?
82
85
  useEffect(() => {
83
86
  if (settings.varSort.var.sort === VAR_SORT.MATRIX) {
84
87
  if (!varMeans.isPending && !varMeans.serverError && varMeans.fetchedData) {
85
- setSortedVars(_.orderBy(settings.vars, o => {
88
+ setSortedVars(_.orderBy(settingsVars, o => {
86
89
  return sortMeans(o, varMeans.fetchedData);
87
90
  }, settings.varSort.var.sortOrder));
88
91
  }
89
92
  } else if (settings.varSort.var.sort === VAR_SORT.NAME) {
90
- setSortedVars(_.orderBy(settings.vars, "name", settings.varSort.var.sortOrder));
93
+ setSortedVars(_.orderBy(settingsVars, 'name', settings.varSort.var.sortOrder));
91
94
  } else {
92
- setSortedVars(settings.vars);
95
+ setSortedVars(settingsVars);
93
96
  }
94
- }, [settings.varSort.var.sort, settings.varSort.var.sortOrder, varMeans.isPending, varMeans.serverError, varMeans.fetchedData, settings.vars]);
97
+ }, [settings.varSort.var.sort, settings.varSort.var.sortOrder, varMeans.isPending, varMeans.serverError, varMeans.fetchedData, settingsVars]);
95
98
  const makeListItem = item => {
96
- return /*#__PURE__*/React.createElement(ListGroup.Item, {
97
- key: item.matrix_index
98
- }, /*#__PURE__*/React.createElement(VarItem, {
99
- item: item,
100
- active: active,
101
- mode: mode
102
- }));
99
+ return /*#__PURE__*/_jsx(ListGroup.Item, {
100
+ children: /*#__PURE__*/_jsx(VarItem, {
101
+ item: item,
102
+ active: active,
103
+ mode: mode
104
+ })
105
+ }, item.matrix_index);
103
106
  };
104
107
  const makeSetListItem = set => {
105
- return /*#__PURE__*/React.createElement(ListGroup.Item, {
106
- key: set.name
107
- }, /*#__PURE__*/React.createElement(VarSet, {
108
- set: set,
109
- active: active,
110
- mode: mode
111
- }));
108
+ return /*#__PURE__*/_jsx(ListGroup.Item, {
109
+ children: /*#__PURE__*/_jsx(VarSet, {
110
+ set: set,
111
+ active: active,
112
+ mode: mode
113
+ })
114
+ }, set.name);
112
115
  };
113
116
  const varList = _.map(sortedVars, item => {
114
117
  if (item.isSet) {
@@ -130,43 +133,55 @@ export function VarNamesList(_ref) {
130
133
  return setName;
131
134
  };
132
135
  const isPending = varMeans.isPending && settings.varSort.var.sort === VAR_SORT.MATRIX;
133
- return /*#__PURE__*/React.createElement("div", {
134
- className: "position-relative"
135
- }, /*#__PURE__*/React.createElement("div", {
136
- className: "overflow-auto mt-3"
137
- }, /*#__PURE__*/React.createElement("div", {
138
- className: "d-flex justify-content-between mb-2"
139
- }, /*#__PURE__*/React.createElement("h5", null, _.capitalize(displayName)), /*#__PURE__*/React.createElement(ButtonGroup, {
140
- "aria-label": "Feature options",
141
- size: "sm"
142
- }, /*#__PURE__*/React.createElement(Button, {
143
- variant: "info",
144
- onClick: () => {
145
- dispatch({
146
- type: "add.var",
147
- var: {
148
- name: newSetName(),
149
- vars: [],
150
- isSet: true
151
- }
152
- });
153
- }
154
- }, "New set"), /*#__PURE__*/React.createElement(Button, {
155
- variant: "info",
156
- onClick: () => {
157
- dispatch({
158
- type: "reset.vars"
159
- });
160
- }
161
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
162
- icon: faTimes,
163
- className: "me-1"
164
- }), "Clear"))), /*#__PURE__*/React.createElement(React.Fragment, null, !varList.length ? /*#__PURE__*/React.createElement(Alert, {
165
- variant: "light"
166
- }, "Search for a feature.") : /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(VarListToolbar, null), /*#__PURE__*/React.createElement("div", {
167
- className: "position-relative"
168
- }, isPending && /*#__PURE__*/React.createElement(LoadingSpinner, null), /*#__PURE__*/React.createElement(ListGroup, {
169
- variant: "flush",
170
- className: "cherita-list"
171
- }, varList))))));
136
+ return /*#__PURE__*/_jsxs("div", {
137
+ className: "mt-3 d-flex flex-column h-100",
138
+ children: [/*#__PURE__*/_jsxs("div", {
139
+ className: "d-flex justify-content-between mb-2",
140
+ children: [/*#__PURE__*/_jsx("h5", {
141
+ children: _.capitalize(displayName)
142
+ }), /*#__PURE__*/_jsxs(ButtonGroup, {
143
+ "aria-label": "Feature options",
144
+ size: "sm",
145
+ children: [/*#__PURE__*/_jsx(Button, {
146
+ variant: "info",
147
+ onClick: () => {
148
+ dispatch({
149
+ type: 'add.var',
150
+ var: {
151
+ name: newSetName(),
152
+ vars: [],
153
+ isSet: true
154
+ }
155
+ });
156
+ },
157
+ children: "New set"
158
+ }), /*#__PURE__*/_jsxs(Button, {
159
+ variant: "info",
160
+ onClick: () => {
161
+ dispatch({
162
+ type: 'reset.vars'
163
+ });
164
+ },
165
+ children: [/*#__PURE__*/_jsx(FontAwesomeIcon, {
166
+ icon: faTimes,
167
+ className: "me-1"
168
+ }), "Clear"]
169
+ })]
170
+ })]
171
+ }), /*#__PURE__*/_jsx(_Fragment, {
172
+ children: !varList.length ? /*#__PURE__*/_jsx(Alert, {
173
+ variant: "light",
174
+ children: "Search for a feature."
175
+ }) : /*#__PURE__*/_jsxs(_Fragment, {
176
+ children: [/*#__PURE__*/_jsx(VarListToolbar, {}), /*#__PURE__*/_jsxs("div", {
177
+ className: "overflow-auto flex-grow-1 modern-scrollbars",
178
+ children: [isPending && /*#__PURE__*/_jsx(LoadingSpinner, {}), /*#__PURE__*/_jsx(ListGroup, {
179
+ variant: "flush",
180
+ className: "cherita-list",
181
+ children: varList
182
+ })]
183
+ })]
184
+ })
185
+ })]
186
+ });
172
187
  }