@haniffalab/cherita-react 1.2.0-dev.2025-05-21.31931945 → 1.2.0-dev.2025-05-21.e57ef5f2

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 (79) hide show
  1. package/dist/cjs/components/dotplot/Dotplot.js +26 -19
  2. package/dist/cjs/components/dotplot/DotplotControls.js +17 -19
  3. package/dist/cjs/components/full-page/FullPage.js +9 -7
  4. package/dist/cjs/components/full-page/FullPagePseudospatial.js +9 -7
  5. package/dist/cjs/components/heatmap/Heatmap.js +22 -13
  6. package/dist/cjs/components/matrixplot/Matrixplot.js +22 -13
  7. package/dist/cjs/components/obs-list/ObsItem.js +37 -29
  8. package/dist/cjs/components/obs-list/ObsList.js +47 -44
  9. package/dist/cjs/components/obsm-list/ObsmList.js +9 -6
  10. package/dist/cjs/components/offcanvas/index.js +13 -9
  11. package/dist/cjs/components/pseudospatial/Pseudospatial.js +61 -53
  12. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +17 -11
  13. package/dist/cjs/components/scatterplot/Scatterplot.js +52 -52
  14. package/dist/cjs/components/scatterplot/ScatterplotControls.js +3 -3
  15. package/dist/cjs/components/scatterplot/SpatialControls.js +4 -4
  16. package/dist/cjs/components/search-bar/SearchBar.js +12 -10
  17. package/dist/cjs/components/search-bar/SearchInfo.js +14 -13
  18. package/dist/cjs/components/search-bar/SearchResults.js +16 -14
  19. package/dist/cjs/components/var-list/VarItem.js +37 -120
  20. package/dist/cjs/components/var-list/VarList.js +16 -13
  21. package/dist/cjs/components/var-list/VarListToolbar.js +1 -2
  22. package/dist/cjs/components/var-list/VarSet.js +17 -29
  23. package/dist/cjs/components/violin/Violin.js +44 -35
  24. package/dist/cjs/context/DatasetContext.js +17 -11
  25. package/dist/cjs/context/FilterContext.js +9 -8
  26. package/dist/cjs/context/SettingsContext.js +169 -237
  27. package/dist/cjs/context/ZarrDataContext.js +1 -2
  28. package/dist/cjs/helpers/color-helper.js +3 -3
  29. package/dist/cjs/helpers/zarr-helper.js +15 -12
  30. package/dist/cjs/utils/Filter.js +13 -9
  31. package/dist/cjs/utils/Histogram.js +4 -3
  32. package/dist/cjs/utils/ImageViewer.js +1 -2
  33. package/dist/cjs/utils/Legend.js +3 -3
  34. package/dist/cjs/utils/LoadingIndicators.js +1 -1
  35. package/dist/cjs/utils/VirtualizedList.js +16 -13
  36. package/dist/cjs/utils/errors.js +20 -22
  37. package/dist/cjs/utils/requests.js +13 -10
  38. package/dist/cjs/utils/zarrData.js +12 -8
  39. package/dist/css/cherita.css +24 -10
  40. package/dist/css/cherita.css.map +1 -1
  41. package/dist/esm/components/dotplot/Dotplot.js +25 -17
  42. package/dist/esm/components/dotplot/DotplotControls.js +16 -17
  43. package/dist/esm/components/full-page/FullPage.js +8 -5
  44. package/dist/esm/components/full-page/FullPagePseudospatial.js +8 -5
  45. package/dist/esm/components/heatmap/Heatmap.js +21 -11
  46. package/dist/esm/components/matrixplot/Matrixplot.js +21 -11
  47. package/dist/esm/components/obs-list/ObsItem.js +36 -27
  48. package/dist/esm/components/obs-list/ObsList.js +46 -42
  49. package/dist/esm/components/obsm-list/ObsmList.js +8 -4
  50. package/dist/esm/components/offcanvas/index.js +13 -9
  51. package/dist/esm/components/pseudospatial/Pseudospatial.js +60 -51
  52. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +16 -9
  53. package/dist/esm/components/scatterplot/Scatterplot.js +51 -50
  54. package/dist/esm/components/scatterplot/ScatterplotControls.js +2 -1
  55. package/dist/esm/components/scatterplot/SpatialControls.js +3 -2
  56. package/dist/esm/components/search-bar/SearchBar.js +11 -8
  57. package/dist/esm/components/search-bar/SearchInfo.js +13 -11
  58. package/dist/esm/components/search-bar/SearchResults.js +15 -12
  59. package/dist/esm/components/var-list/VarItem.js +36 -117
  60. package/dist/esm/components/var-list/VarList.js +15 -11
  61. package/dist/esm/components/var-list/VarSet.js +17 -28
  62. package/dist/esm/components/violin/Violin.js +43 -33
  63. package/dist/esm/context/DatasetContext.js +16 -9
  64. package/dist/esm/context/FilterContext.js +8 -6
  65. package/dist/esm/context/SettingsContext.js +168 -235
  66. package/dist/esm/helpers/color-helper.js +3 -3
  67. package/dist/esm/helpers/zarr-helper.js +15 -12
  68. package/dist/esm/utils/Filter.js +13 -9
  69. package/dist/esm/utils/Histogram.js +4 -3
  70. package/dist/esm/utils/Legend.js +2 -1
  71. package/dist/esm/utils/LoadingIndicators.js +1 -1
  72. package/dist/esm/utils/VirtualizedList.js +15 -11
  73. package/dist/esm/utils/errors.js +20 -22
  74. package/dist/esm/utils/requests.js +13 -10
  75. package/dist/esm/utils/zarrData.js +12 -8
  76. package/package.json +4 -2
  77. package/scss/cherita.scss +5 -0
  78. package/scss/components/layouts.scss +4 -0
  79. package/scss/components/lists.scss +4 -5
@@ -1,3 +1,8 @@
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; }
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; }
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
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
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); }
1
6
  import React, { useState, useEffect } from "react";
2
7
  import { faPlus } from "@fortawesome/free-solid-svg-icons";
3
8
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@@ -20,10 +25,9 @@ export function VarInfo(_ref) {
20
25
  });
21
26
  useEffect(() => {
22
27
  setParams(p => {
23
- return {
24
- ...p,
28
+ return _objectSpread(_objectSpread({}, p), {}, {
25
29
  geneName: varItem.name
26
- };
30
+ });
27
31
  });
28
32
  }, [varItem.name]);
29
33
  const {
@@ -34,7 +38,7 @@ export function VarInfo(_ref) {
34
38
  refetchOnMount: false,
35
39
  enabled: !!dataset.diseaseDatasets.length
36
40
  });
37
- const hasDiseaseInfo = !isPending && !serverError && !!fetchedData?.length;
41
+ const hasDiseaseInfo = !isPending && !serverError && !!(fetchedData !== null && fetchedData !== void 0 && fetchedData.length);
38
42
  return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h5", null, varItem.name), !!dataset.diseaseDatasets.length && isPending && /*#__PURE__*/React.createElement("p", null, "Loading..."), hasDiseaseInfo && /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("h6", null, "Associated diseases"), /*#__PURE__*/React.createElement(VarDiseaseInfo, {
39
43
  data: fetchedData
40
44
  })));
@@ -54,13 +58,12 @@ const useVarMean = function (varKeys) {
54
58
  });
55
59
  useEffect(() => {
56
60
  setParams(p => {
57
- return {
58
- ...p,
61
+ return _objectSpread(_objectSpread({}, p), {}, {
59
62
  varKeys: _.map(varKeys, v => v.isSet ? {
60
63
  name: v.name,
61
64
  indices: v.vars.map(v => v.index)
62
65
  } : v.index)
63
- };
66
+ });
64
67
  });
65
68
  }, [varKeys]);
66
69
  return useFetch(ENDPOINT, params, {
@@ -93,10 +96,9 @@ export function DiseaseInfo(_ref2) {
93
96
  });
94
97
  useEffect(() => {
95
98
  setParams(p => {
96
- return {
97
- ...p,
99
+ return _objectSpread(_objectSpread({}, p), {}, {
98
100
  diseaseId: disease.id
99
- };
101
+ });
100
102
  });
101
103
  }, [disease]);
102
104
  const diseaseData = useFetch(ENDPOINT, params, {
@@ -108,7 +110,7 @@ export function DiseaseInfo(_ref2) {
108
110
  setDiseaseVars(diseaseData.fetchedData);
109
111
  }
110
112
  }, [diseaseData.fetchedData, diseaseData.isPending, diseaseData.serverError]);
111
- const varMeans = useVarMean(diseaseVars, !!diseaseVars?.length && settings.varSort.disease.sort === VAR_SORT.MATRIX);
113
+ const varMeans = useVarMean(diseaseVars, !!(diseaseVars !== null && diseaseVars !== void 0 && diseaseVars.length) && settings.varSort.disease.sort === VAR_SORT.MATRIX);
112
114
  useEffect(() => {
113
115
  if (settings.varSort.disease.sort === VAR_SORT.MATRIX) {
114
116
  if (!varMeans.isPending && !varMeans.serverError) {
@@ -1,3 +1,8 @@
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; }
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; }
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
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
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); }
1
6
  import React, { useDeferredValue, useEffect, useMemo, useState } from "react";
2
7
  import { faPlus } from "@fortawesome/free-solid-svg-icons";
3
8
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@@ -30,10 +35,9 @@ export function VarSearchResults(_ref) {
30
35
  const setData = text => {
31
36
  if (text.length) {
32
37
  setParams(p => {
33
- return {
34
- ...p,
38
+ return _objectSpread(_objectSpread({}, p), {}, {
35
39
  text: text
36
- };
40
+ });
37
41
  });
38
42
  } else {
39
43
  setSuggestions([]);
@@ -47,7 +51,7 @@ export function VarSearchResults(_ref) {
47
51
  useEffect(() => {
48
52
  if (!isPending && !serverError) {
49
53
  setSuggestions(fetchedData);
50
- setResultsLength(fetchedData?.length);
54
+ setResultsLength(fetchedData === null || fetchedData === void 0 ? void 0 : fetchedData.length);
51
55
  }
52
56
  }, [fetchedData, isPending, serverError, setResultsLength]);
53
57
  const getDataAtIndex = index => deferredData[index];
@@ -58,7 +62,7 @@ export function VarSearchResults(_ref) {
58
62
  onClick: () => {
59
63
  setSelectedResult(item);
60
64
  },
61
- active: selectedResult?.index === item.index
65
+ active: (selectedResult === null || selectedResult === void 0 ? void 0 : selectedResult.index) === item.index
62
66
  }, /*#__PURE__*/React.createElement("div", {
63
67
  className: "d-flex justify-content-between align-items-center w-100"
64
68
  }, /*#__PURE__*/React.createElement("div", null, item.name), /*#__PURE__*/React.createElement("div", {
@@ -80,7 +84,7 @@ export function VarSearchResults(_ref) {
80
84
  }, /*#__PURE__*/React.createElement(ListGroup, {
81
85
  variant: "flush",
82
86
  className: "cherita-list"
83
- }, deferredData?.length ? /*#__PURE__*/React.createElement(VirtualizedList, {
87
+ }, deferredData !== null && deferredData !== void 0 && deferredData.length ? /*#__PURE__*/React.createElement(VirtualizedList, {
84
88
  getDataAtIndex: getDataAtIndex,
85
89
  count: deferredData.length,
86
90
  ItemComponent: ItemComponent,
@@ -115,10 +119,9 @@ export function DiseasesSearchResults(_ref2) {
115
119
  const setData = text => {
116
120
  if (text.length) {
117
121
  setParams(p => {
118
- return {
119
- ...p,
122
+ return _objectSpread(_objectSpread({}, p), {}, {
120
123
  text: text
121
- };
124
+ });
122
125
  });
123
126
  } else {
124
127
  setSuggestions([]);
@@ -132,7 +135,7 @@ export function DiseasesSearchResults(_ref2) {
132
135
  useEffect(() => {
133
136
  if (!isPending && !serverError) {
134
137
  setSuggestions(fetchedData);
135
- setResultsLength(fetchedData?.length);
138
+ setResultsLength(fetchedData === null || fetchedData === void 0 ? void 0 : fetchedData.length);
136
139
  }
137
140
  }, [fetchedData, isPending, serverError, setResultsLength]);
138
141
  const getDataAtIndex = index => deferredData[index];
@@ -143,7 +146,7 @@ export function DiseasesSearchResults(_ref2) {
143
146
  onClick: () => {
144
147
  setSelectedResult(item);
145
148
  },
146
- active: selectedResult?.id === item.id
149
+ active: (selectedResult === null || selectedResult === void 0 ? void 0 : selectedResult.id) === item.id
147
150
  }, /*#__PURE__*/React.createElement("div", {
148
151
  className: "d-flex justify-content-between align-items-center w-100"
149
152
  }, /*#__PURE__*/React.createElement("div", null, item.disease_name)))));
@@ -152,7 +155,7 @@ export function DiseasesSearchResults(_ref2) {
152
155
  }, /*#__PURE__*/React.createElement(ListGroup, {
153
156
  variant: "flush",
154
157
  className: "cherita-list"
155
- }, deferredData?.length ? /*#__PURE__*/React.createElement(VirtualizedList, {
158
+ }, deferredData !== null && deferredData !== void 0 && deferredData.length ? /*#__PURE__*/React.createElement(VirtualizedList, {
156
159
  getDataAtIndex: getDataAtIndex,
157
160
  count: deferredData.length,
158
161
  ItemComponent: ItemComponent,
@@ -1,5 +1,11 @@
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
+ 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
+ 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
+ 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
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
6
+ 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); }
1
7
  import React, { useEffect, useState } from "react";
2
- import { faDroplet, faTrash } from "@fortawesome/free-solid-svg-icons";
8
+ import { faDroplet, faPlus, faTrash } from "@fortawesome/free-solid-svg-icons";
3
9
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
4
10
  import { MoreVert } from "@mui/icons-material";
5
11
  import _ from "lodash";
@@ -10,7 +16,6 @@ import { useFilteredData } from "../../context/FilterContext";
10
16
  import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
11
17
  import { Histogram } from "../../utils/Histogram";
12
18
  import { useDebouncedFetch, useFetch } from "../../utils/requests";
13
- import { VirtualizedList } from "../../utils/VirtualizedList";
14
19
  function VarHistogram(_ref) {
15
20
  let {
16
21
  item
@@ -31,10 +36,9 @@ function VarHistogram(_ref) {
31
36
  });
32
37
  useEffect(() => {
33
38
  setParams(p => {
34
- return {
35
- ...p,
39
+ return _objectSpread(_objectSpread({}, p), {}, {
36
40
  obsIndices: isSliced ? [...(obsIndices || [])] : null
37
- };
41
+ });
38
42
  });
39
43
  }, [obsIndices, isSliced]);
40
44
  const {
@@ -73,23 +77,23 @@ export function VarDiseaseInfo(_ref2) {
73
77
  let {
74
78
  data
75
79
  } = _ref2;
76
- return /*#__PURE__*/React.createElement(VirtualizedList, {
77
- getDataAtIndex: index => data[index],
78
- count: data.length,
79
- estimateSize: 140,
80
- maxHeight: "40vh",
81
- ItemComponent: VarDiseaseInfoItem
82
- });
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
+ }));
83
87
  }
84
- export function SingleSelectionItem(_ref3) {
88
+ export function SelectionItem(_ref3) {
85
89
  let {
86
90
  item,
87
91
  isActive,
88
92
  selectVar,
89
93
  removeVar,
90
- isDiseaseGene = false,
91
94
  showSetColorEncoding = true,
92
- showRemove = true
95
+ showRemove = true,
96
+ isMultiple = false
93
97
  } = _ref3;
94
98
  const ENDPOINT = "disease/gene";
95
99
  const [openInfo, setOpenInfo] = useState(false);
@@ -107,9 +111,9 @@ export function SingleSelectionItem(_ref3) {
107
111
  refetchOnMount: false,
108
112
  enabled: !!dataset.diseaseDatasets.length
109
113
  });
110
- const hasDiseaseInfo = !isPending && !serverError && !!fetchedData?.length;
114
+ const hasDiseaseInfo = !isPending && !serverError && !!(fetchedData !== null && fetchedData !== void 0 && fetchedData.length);
111
115
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
112
- className: `d-flex justify-content-between ${hasDiseaseInfo ? "cursor-pointer" : ""}`,
116
+ className: "d-flex justify-content-between ".concat(hasDiseaseInfo ? "cursor-pointer" : ""),
113
117
  onClick: () => {
114
118
  setOpenInfo(o => !o);
115
119
  }
@@ -117,7 +121,7 @@ export function SingleSelectionItem(_ref3) {
117
121
  className: "d-flex justify-content-between align-items-center w-100"
118
122
  }, /*#__PURE__*/React.createElement("div", null, item.name), /*#__PURE__*/React.createElement("div", {
119
123
  className: "d-flex align-items-center gap-1"
120
- }, hasDiseaseInfo && /*#__PURE__*/React.createElement(MoreVert, null), !isDiseaseGene && /*#__PURE__*/React.createElement(VarHistogram, {
124
+ }, hasDiseaseInfo && /*#__PURE__*/React.createElement(MoreVert, null), /*#__PURE__*/React.createElement(VarHistogram, {
121
125
  item: item
122
126
  }), showSetColorEncoding && /*#__PURE__*/React.createElement(Button, {
123
127
  type: "button",
@@ -132,7 +136,11 @@ export function SingleSelectionItem(_ref3) {
132
136
  title: isNotInData ? "Not present in data" : "Set as color encoding"
133
137
  }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
134
138
  icon: faDroplet
135
- })), (!isDiseaseGene || !showRemove) && /*#__PURE__*/React.createElement(Button, {
139
+ }), isMultiple && /*#__PURE__*/React.createElement(FontAwesomeIcon, {
140
+ icon: faPlus,
141
+ size: "xs",
142
+ className: "ps-xs-1"
143
+ })), showRemove && /*#__PURE__*/React.createElement(Button, {
136
144
  type: "button",
137
145
  className: "m-0 p-0 px-1",
138
146
  variant: "outline-secondary",
@@ -151,34 +159,12 @@ export function SingleSelectionItem(_ref3) {
151
159
  data: fetchedData
152
160
  }))));
153
161
  }
154
- function MultipleSelectionItem(_ref4) {
155
- let {
156
- item,
157
- isActive,
158
- toggleVar
159
- } = _ref4;
160
- const isNotInData = item.matrix_index === -1;
161
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
162
- className: "d-flex"
163
- }, /*#__PURE__*/React.createElement("div", {
164
- className: "flex-grow-1"
165
- }, /*#__PURE__*/React.createElement(Button, {
166
- type: "button",
167
- key: item.matrix_index,
168
- variant: isActive ? "primary" : "outline-primary",
169
- className: "m-0 p-0 px-1",
170
- onClick: toggleVar,
171
- disabled: isNotInData,
172
- title: isNotInData ? "Not present in data" : item.name
173
- }, item.name))));
174
- }
175
- export function VarItem(_ref5) {
162
+ export function VarItem(_ref4) {
176
163
  let {
177
164
  item,
178
165
  active,
179
- mode = SELECTION_MODES.SINGLE,
180
- isDiseaseGene = false
181
- } = _ref5;
166
+ mode = SELECTION_MODES.SINGLE
167
+ } = _ref4;
182
168
  const settings = useSettings();
183
169
  const dispatch = useSettingsDispatch();
184
170
  const selectVar = () => {
@@ -229,88 +215,21 @@ export function VarItem(_ref5) {
229
215
  });
230
216
  };
231
217
  if (item && mode === SELECTION_MODES.SINGLE) {
232
- return /*#__PURE__*/React.createElement(SingleSelectionItem, {
218
+ return /*#__PURE__*/React.createElement(SelectionItem, {
233
219
  item: item,
234
220
  isActive: settings.colorEncoding === COLOR_ENCODINGS.VAR && active === item.matrix_index,
235
221
  selectVar: selectVar,
236
- removeVar: removeVar,
237
- isDiseaseGene: isDiseaseGene
222
+ removeVar: removeVar
238
223
  });
239
224
  } else if (mode === SELECTION_MODES.MULTIPLE) {
240
- return /*#__PURE__*/React.createElement(MultipleSelectionItem, {
225
+ return /*#__PURE__*/React.createElement(SelectionItem, {
241
226
  item: item,
242
227
  isActive: item.matrix_index !== -1 && _.includes(active, item.matrix_index),
243
- toggleVar: toggleVar
228
+ selectVar: toggleVar,
229
+ removeVar: removeVar,
230
+ isMultiple: true
244
231
  });
245
232
  } else {
246
233
  return null;
247
234
  }
248
- }
249
- export function SearchResultItem(_ref6) {
250
- let {
251
- item,
252
- isActive,
253
- selectVar,
254
- removeVar,
255
- isDiseaseGene = false,
256
- showSetColorEncoding = true,
257
- showRemove = true
258
- } = _ref6;
259
- const ENDPOINT = "disease/gene";
260
- const [openInfo, setOpenInfo] = useState(false);
261
- const dataset = useDataset();
262
- const params = {
263
- geneName: item.name,
264
- diseaseDatasets: dataset.diseaseDatasets
265
- };
266
- const isNotInData = item.matrix_index === -1;
267
- const {
268
- fetchedData,
269
- isPending,
270
- serverError
271
- } = useFetch(ENDPOINT, params, {
272
- refetchOnMount: false,
273
- enabled: !!dataset.diseaseDatasets.length
274
- });
275
- const hasDiseaseInfo = !isPending && !serverError && !!fetchedData?.length;
276
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
277
- className: `d-flex justify-content-between ${hasDiseaseInfo ? "cursor-pointer" : ""}`,
278
- onClick: () => {
279
- setOpenInfo(o => !o);
280
- }
281
- }, /*#__PURE__*/React.createElement("div", {
282
- className: "d-flex justify-content-between align-items-center w-100"
283
- }, /*#__PURE__*/React.createElement("div", null, item.name), /*#__PURE__*/React.createElement("div", {
284
- className: "d-flex align-items-center gap-1"
285
- }, hasDiseaseInfo && /*#__PURE__*/React.createElement(MoreVert, null), showSetColorEncoding && /*#__PURE__*/React.createElement(Button, {
286
- type: "button",
287
- key: item.matrix_index,
288
- variant: isActive ? "primary" : isNotInData ? "outline-secondary" : "outline-primary",
289
- className: "m-0 p-0 px-1",
290
- onClick: e => {
291
- e.stopPropagation();
292
- selectVar();
293
- },
294
- disabled: isNotInData,
295
- title: isNotInData ? "Not present in data" : "Set as color encoding"
296
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
297
- icon: faDroplet
298
- })), (!isDiseaseGene || !showRemove) && /*#__PURE__*/React.createElement(Button, {
299
- type: "button",
300
- className: "m-0 p-0 px-1",
301
- variant: "outline-secondary",
302
- title: "Remove from list",
303
- onClick: e => {
304
- e.stopPropagation();
305
- removeVar();
306
- }
307
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
308
- icon: faTrash
309
- }))))), hasDiseaseInfo && /*#__PURE__*/React.createElement(Collapse, {
310
- in: openInfo
311
- }, /*#__PURE__*/React.createElement("div", {
312
- className: "mt-2 var-disease-info-collapse"
313
- }, /*#__PURE__*/React.createElement(VarDiseaseInfo, {
314
- data: fetchedData
315
- }))));
316
235
  }
@@ -1,3 +1,8 @@
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; }
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; }
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
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
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); }
1
6
  import React, { useEffect, useState } from "react";
2
7
  import { faTimes } from "@fortawesome/free-solid-svg-icons";
3
8
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
@@ -27,13 +32,12 @@ const useVarMean = function (varKeys) {
27
32
  });
28
33
  useEffect(() => {
29
34
  setParams(p => {
30
- return {
31
- ...p,
35
+ return _objectSpread(_objectSpread({}, p), {}, {
32
36
  varKeys: _.map(varKeys, v => v.isSet ? {
33
37
  name: v.name,
34
38
  indices: v.vars.map(v => v.index)
35
39
  } : v.index)
36
- };
40
+ });
37
41
  });
38
42
  }, [varKeys]);
39
43
  return useFetch(ENDPOINT, params, {
@@ -47,17 +51,19 @@ const sortMeans = (i, means) => {
47
51
  return means[i.name] || _.min(_.values(means)) - 1;
48
52
  };
49
53
  export function VarNamesList(_ref) {
54
+ var _settings$selectedVar, _settings$selectedVar2;
50
55
  let {
51
56
  mode = SELECTION_MODES.SINGLE,
52
57
  displayName = "genes"
53
58
  } = _ref;
54
59
  const settings = useSettings();
55
60
  const dispatch = useSettingsDispatch();
56
- const [active, setActive] = useState(mode === SELECTION_MODES.SINGLE ? settings.selectedVar?.matrix_index || settings.selectedVar?.name : settings.selectedMultiVar.map(i => i.matrix_index || i.name));
61
+ 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));
57
62
  const [sortedVars, setSortedVars] = useState([]);
58
63
  useEffect(() => {
59
64
  if (mode === SELECTION_MODES.SINGLE) {
60
- setActive(settings.selectedVar?.matrix_index || settings.selectedVar?.name);
65
+ var _settings$selectedVar3, _settings$selectedVar4;
66
+ 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));
61
67
  }
62
68
  }, [mode, settings.selectedVar]);
63
69
  useEffect(() => {
@@ -81,15 +87,13 @@ export function VarNamesList(_ref) {
81
87
  setSortedVars(settings.vars);
82
88
  }
83
89
  }, [settings.varSort.var.sort, settings.varSort.var.sortOrder, varMeans.isPending, varMeans.serverError, varMeans.fetchedData, settings.vars]);
84
- const makeListItem = function (item) {
85
- let isDiseaseGene = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
90
+ const makeListItem = item => {
86
91
  return /*#__PURE__*/React.createElement(ListGroup.Item, {
87
92
  key: item.matrix_index
88
93
  }, /*#__PURE__*/React.createElement(VarItem, {
89
94
  item: item,
90
95
  active: active,
91
- mode: mode,
92
- isDiseaseGene: isDiseaseGene
96
+ mode: mode
93
97
  }));
94
98
  };
95
99
  const makeSetListItem = set => {
@@ -110,13 +114,13 @@ export function VarNamesList(_ref) {
110
114
  });
111
115
  const newSetName = () => {
112
116
  let n = 1;
113
- let setName = `Set ${n}`;
117
+ let setName = "Set ".concat(n);
114
118
  const nameExists = name => {
115
119
  return settings.vars.some(v => v.name === name);
116
120
  };
117
121
  while (nameExists(setName)) {
118
122
  n++;
119
- setName = `Set ${n}`;
123
+ setName = "Set ".concat(n);
120
124
  }
121
125
  return setName;
122
126
  };
@@ -3,7 +3,7 @@ import { faChevronDown, faChevronUp, faCircleInfo, faDroplet, faPlus, faTrash }
3
3
  import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
4
4
  import _ from "lodash";
5
5
  import { Button, Collapse, ListGroup, OverlayTrigger, Tooltip } from "react-bootstrap";
6
- import { SingleSelectionItem } from "./VarItem";
6
+ import { SelectionItem } from "./VarItem";
7
7
  import { COLOR_ENCODINGS, SELECTION_MODES } from "../../constants/constants";
8
8
  import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
9
9
  import { SearchModal } from "../search-bar/SearchBar";
@@ -17,13 +17,14 @@ const addVarToSet = (dispatch, set, v) => {
17
17
  var: v
18
18
  });
19
19
  };
20
- function SingleSelectionSet(_ref) {
20
+ function SelectionSet(_ref) {
21
21
  let {
22
22
  set,
23
23
  isActive,
24
24
  selectSet,
25
25
  removeSet,
26
- removeSetVar
26
+ removeSetVar,
27
+ isMultiple = false
27
28
  } = _ref;
28
29
  const [openSet, setOpenSet] = useState(false);
29
30
  const [showModal, setShowModal] = useState(false);
@@ -31,7 +32,7 @@ function SingleSelectionSet(_ref) {
31
32
  const varList = set.vars.length ? _.map(set.vars, v => {
32
33
  return /*#__PURE__*/React.createElement(ListGroup.Item, {
33
34
  key: v.name
34
- }, /*#__PURE__*/React.createElement(SingleSelectionItem, {
35
+ }, /*#__PURE__*/React.createElement(SelectionItem, {
35
36
  item: v,
36
37
  showSetColorEncoding: false,
37
38
  removeVar: () => removeSetVar(v)
@@ -87,6 +88,10 @@ function SingleSelectionSet(_ref) {
87
88
  title: "Set as color encoding"
88
89
  }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
89
90
  icon: faDroplet
91
+ }), isMultiple && /*#__PURE__*/React.createElement(FontAwesomeIcon, {
92
+ icon: faPlus,
93
+ size: "xs",
94
+ className: "ps-xs-1"
90
95
  })), /*#__PURE__*/React.createElement(Button, {
91
96
  type: "button",
92
97
  className: "m-0 p-0 px-1",
@@ -118,31 +123,12 @@ function SingleSelectionSet(_ref) {
118
123
  searchDiseases: false
119
124
  }));
120
125
  }
121
- function MultipleSelectionSet(_ref2) {
122
- let {
123
- set,
124
- isActive,
125
- toggleSet
126
- } = _ref2;
127
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("div", {
128
- className: "d-flex"
129
- }, /*#__PURE__*/React.createElement("div", {
130
- className: "flex-grow-1"
131
- }, /*#__PURE__*/React.createElement(Button, {
132
- type: "button",
133
- key: set.name,
134
- variant: isActive ? "primary" : "outline-primary",
135
- className: "m-0 p-0 px-1",
136
- onClick: toggleSet,
137
- title: set.name
138
- }, set.name))));
139
- }
140
- export function VarSet(_ref3) {
126
+ export function VarSet(_ref2) {
141
127
  let {
142
128
  set,
143
129
  active,
144
130
  mode = SELECTION_MODES.SINGLE
145
- } = _ref3;
131
+ } = _ref2;
146
132
  const settings = useSettings();
147
133
  const dispatch = useSettingsDispatch();
148
134
  const selectSet = () => {
@@ -196,7 +182,7 @@ export function VarSet(_ref3) {
196
182
  });
197
183
  };
198
184
  if (set && mode === SELECTION_MODES.SINGLE) {
199
- return /*#__PURE__*/React.createElement(SingleSelectionSet, {
185
+ return /*#__PURE__*/React.createElement(SelectionSet, {
200
186
  set: set,
201
187
  isActive: settings.colorEncoding === COLOR_ENCODINGS.VAR && active === set.name,
202
188
  selectSet: selectSet,
@@ -204,10 +190,13 @@ export function VarSet(_ref3) {
204
190
  removeSetVar: v => removeSetVar(v)
205
191
  });
206
192
  } else if (mode === SELECTION_MODES.MULTIPLE) {
207
- return /*#__PURE__*/React.createElement(MultipleSelectionSet, {
193
+ return /*#__PURE__*/React.createElement(SelectionSet, {
208
194
  set: set,
209
195
  isActive: _.includes(active, set.name),
210
- toggleSet: toggleSet
196
+ selectSet: toggleSet,
197
+ removeSet: removeSet,
198
+ removeSetVar: v => removeSetVar(v),
199
+ isMultiple: true
211
200
  });
212
201
  } else {
213
202
  return null;