@haniffalab/cherita-react 1.2.0 → 1.3.0-dev.2025-05-29.ee7e9b72

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 (91) hide show
  1. package/dist/cjs/components/controls/Controls.js +60 -0
  2. package/dist/cjs/components/dotplot/Dotplot.js +47 -38
  3. package/dist/cjs/components/dotplot/DotplotControls.js +77 -114
  4. package/dist/cjs/components/full-page/FullPage.js +29 -33
  5. package/dist/cjs/components/full-page/FullPagePseudospatial.js +30 -33
  6. package/dist/cjs/components/heatmap/Heatmap.js +33 -22
  7. package/dist/cjs/components/heatmap/HeatmapControls.js +2 -19
  8. package/dist/cjs/components/matrixplot/Matrixplot.js +35 -24
  9. package/dist/cjs/components/matrixplot/MatrixplotControls.js +4 -34
  10. package/dist/cjs/components/obs-list/ObsItem.js +63 -51
  11. package/dist/cjs/components/obs-list/ObsList.js +53 -48
  12. package/dist/cjs/components/obsm-list/ObsmList.js +17 -12
  13. package/dist/cjs/components/offcanvas/index.js +14 -11
  14. package/dist/cjs/components/pseudospatial/Pseudospatial.js +78 -68
  15. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +27 -21
  16. package/dist/cjs/components/scatterplot/Scatterplot.js +82 -76
  17. package/dist/cjs/components/scatterplot/ScatterplotControls.js +18 -31
  18. package/dist/cjs/components/scatterplot/SpatialControls.js +53 -23
  19. package/dist/cjs/components/scatterplot/Toolbox.js +1 -18
  20. package/dist/cjs/components/search-bar/SearchBar.js +156 -59
  21. package/dist/cjs/components/search-bar/SearchInfo.js +182 -0
  22. package/dist/cjs/components/search-bar/SearchResults.js +90 -60
  23. package/dist/cjs/components/var-list/VarItem.js +52 -75
  24. package/dist/cjs/components/var-list/VarList.js +47 -172
  25. package/dist/cjs/components/var-list/VarListToolbar.js +7 -8
  26. package/dist/cjs/components/var-list/VarSet.js +66 -57
  27. package/dist/cjs/components/violin/Violin.js +54 -43
  28. package/dist/cjs/components/violin/ViolinControls.js +4 -20
  29. package/dist/cjs/context/DatasetContext.js +26 -513
  30. package/dist/cjs/context/FilterContext.js +9 -8
  31. package/dist/cjs/context/SettingsContext.js +539 -0
  32. package/dist/cjs/context/ZarrDataContext.js +1 -2
  33. package/dist/cjs/helpers/color-helper.js +8 -8
  34. package/dist/cjs/helpers/zarr-helper.js +19 -16
  35. package/dist/cjs/utils/Filter.js +25 -21
  36. package/dist/cjs/utils/Histogram.js +4 -3
  37. package/dist/cjs/utils/ImageViewer.js +1 -2
  38. package/dist/cjs/utils/Legend.js +18 -12
  39. package/dist/cjs/utils/LoadingIndicators.js +1 -1
  40. package/dist/cjs/utils/VirtualizedList.js +16 -13
  41. package/dist/cjs/utils/errors.js +20 -22
  42. package/dist/cjs/utils/requests.js +13 -10
  43. package/dist/cjs/utils/zarrData.js +31 -50
  44. package/dist/css/cherita.css +84 -24
  45. package/dist/css/cherita.css.map +1 -1
  46. package/dist/esm/components/controls/Controls.js +51 -0
  47. package/dist/esm/components/dotplot/Dotplot.js +47 -37
  48. package/dist/esm/components/dotplot/DotplotControls.js +77 -112
  49. package/dist/esm/components/full-page/FullPage.js +29 -32
  50. package/dist/esm/components/full-page/FullPagePseudospatial.js +30 -32
  51. package/dist/esm/components/heatmap/Heatmap.js +32 -20
  52. package/dist/esm/components/heatmap/HeatmapControls.js +3 -20
  53. package/dist/esm/components/matrixplot/Matrixplot.js +34 -22
  54. package/dist/esm/components/matrixplot/MatrixplotControls.js +5 -35
  55. package/dist/esm/components/obs-list/ObsItem.js +63 -49
  56. package/dist/esm/components/obs-list/ObsList.js +53 -47
  57. package/dist/esm/components/obsm-list/ObsmList.js +17 -11
  58. package/dist/esm/components/offcanvas/index.js +14 -11
  59. package/dist/esm/components/pseudospatial/Pseudospatial.js +77 -66
  60. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +27 -20
  61. package/dist/esm/components/scatterplot/Scatterplot.js +81 -74
  62. package/dist/esm/components/scatterplot/ScatterplotControls.js +18 -29
  63. package/dist/esm/components/scatterplot/SpatialControls.js +54 -23
  64. package/dist/esm/components/scatterplot/Toolbox.js +1 -18
  65. package/dist/esm/components/search-bar/SearchBar.js +156 -59
  66. package/dist/esm/components/search-bar/SearchInfo.js +173 -0
  67. package/dist/esm/components/search-bar/SearchResults.js +91 -60
  68. package/dist/esm/components/var-list/VarItem.js +53 -76
  69. package/dist/esm/components/var-list/VarList.js +47 -171
  70. package/dist/esm/components/var-list/VarListToolbar.js +6 -6
  71. package/dist/esm/components/var-list/VarSet.js +67 -57
  72. package/dist/esm/components/violin/Violin.js +53 -41
  73. package/dist/esm/components/violin/ViolinControls.js +5 -21
  74. package/dist/esm/context/DatasetContext.js +25 -510
  75. package/dist/esm/context/FilterContext.js +8 -6
  76. package/dist/esm/context/SettingsContext.js +528 -0
  77. package/dist/esm/helpers/color-helper.js +8 -8
  78. package/dist/esm/helpers/zarr-helper.js +19 -16
  79. package/dist/esm/utils/Filter.js +25 -21
  80. package/dist/esm/utils/Histogram.js +4 -3
  81. package/dist/esm/utils/Legend.js +17 -10
  82. package/dist/esm/utils/LoadingIndicators.js +1 -1
  83. package/dist/esm/utils/VirtualizedList.js +15 -11
  84. package/dist/esm/utils/errors.js +20 -22
  85. package/dist/esm/utils/requests.js +13 -10
  86. package/dist/esm/utils/zarrData.js +33 -51
  87. package/package.json +6 -3
  88. package/scss/cherita.scss +50 -9
  89. package/scss/components/layouts.scss +24 -13
  90. package/scss/components/lists.scss +10 -0
  91. package/scss/components/plots.scss +3 -5
@@ -3,7 +3,8 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.SingleSelectionItem = SingleSelectionItem;
6
+ exports.SelectionItem = SelectionItem;
7
+ exports.VarDiseaseInfo = VarDiseaseInfo;
7
8
  exports.VarItem = VarItem;
8
9
  var _react = _interopRequireWildcard(require("react"));
9
10
  var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
@@ -14,24 +15,30 @@ var _reactBootstrap = require("react-bootstrap");
14
15
  var _constants = require("../../constants/constants");
15
16
  var _DatasetContext = require("../../context/DatasetContext");
16
17
  var _FilterContext = require("../../context/FilterContext");
18
+ var _SettingsContext = require("../../context/SettingsContext");
17
19
  var _Histogram = require("../../utils/Histogram");
18
20
  var _requests = require("../../utils/requests");
19
- var _VirtualizedList = require("../../utils/VirtualizedList");
20
21
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
21
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
22
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
22
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
23
+ 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); }
24
+ 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; }
25
+ 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; }
26
+ 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; }
27
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
28
+ 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); }
23
29
  function VarHistogram(_ref) {
24
30
  let {
25
31
  item
26
32
  } = _ref;
27
33
  const ENDPOINT = "var/histograms";
28
34
  const dataset = (0, _DatasetContext.useDataset)();
35
+ const settings = (0, _SettingsContext.useSettings)();
29
36
  const {
30
37
  obsIndices
31
38
  } = (0, _FilterContext.useFilteredData)();
32
39
  // @TODO: consider using Filter's isSliced; would trigger more re-renders/requests
33
40
  // const { obsIndices, isSliced } = useFilteredData();
34
- const isSliced = dataset.sliceBy.obs || dataset.sliceBy.polygons;
41
+ const isSliced = settings.sliceBy.obs || settings.sliceBy.polygons;
35
42
  const [params, setParams] = (0, _react.useState)({
36
43
  url: dataset.url,
37
44
  varKey: item.matrix_index,
@@ -39,10 +46,9 @@ function VarHistogram(_ref) {
39
46
  });
40
47
  (0, _react.useEffect)(() => {
41
48
  setParams(p => {
42
- return {
43
- ...p,
49
+ return _objectSpread(_objectSpread({}, p), {}, {
44
50
  obsIndices: isSliced ? [...(obsIndices || [])] : null
45
- };
51
+ });
46
52
  });
47
53
  }, [obsIndices, isSliced]);
48
54
  const {
@@ -59,20 +65,12 @@ function VarHistogram(_ref) {
59
65
  });
60
66
  }
61
67
  function VarDiseaseInfoItem(item) {
62
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
63
68
  return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
64
69
  key: item.disease_id,
65
70
  className: "feature-disease-info"
66
71
  }, /*#__PURE__*/_react.default.createElement("button", {
67
72
  type: "button",
68
- className: "btn btn-link disease-link",
69
- onClick: () => {
70
- dispatch({
71
- type: "select.disease",
72
- id: item.disease_id,
73
- name: item.disease_name
74
- });
75
- }
73
+ className: "btn btn-link disease-link"
76
74
  }, item.disease_name), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Table, {
77
75
  striped: true,
78
76
  size: "sm",
@@ -89,23 +87,23 @@ function VarDiseaseInfo(_ref2) {
89
87
  let {
90
88
  data
91
89
  } = _ref2;
92
- return /*#__PURE__*/_react.default.createElement(_VirtualizedList.VirtualizedList, {
93
- getDataAtIndex: index => data[index],
94
- count: data.length,
95
- estimateSize: 140,
96
- maxHeight: "40vh",
97
- ItemComponent: VarDiseaseInfoItem
98
- });
90
+ return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
91
+ className: "feature-disease-info-list"
92
+ }, data.map(item => {
93
+ return /*#__PURE__*/_react.default.createElement(VarDiseaseInfoItem, _extends({
94
+ key: item.disease_id
95
+ }, item));
96
+ }));
99
97
  }
100
- function SingleSelectionItem(_ref3) {
98
+ function SelectionItem(_ref3) {
101
99
  let {
102
100
  item,
103
101
  isActive,
104
102
  selectVar,
105
103
  removeVar,
106
- isDiseaseGene = false,
107
104
  showSetColorEncoding = true,
108
- showRemove = true
105
+ showRemove = true,
106
+ isMultiple = false
109
107
  } = _ref3;
110
108
  const ENDPOINT = "disease/gene";
111
109
  const [openInfo, setOpenInfo] = (0, _react.useState)(false);
@@ -123,9 +121,9 @@ function SingleSelectionItem(_ref3) {
123
121
  refetchOnMount: false,
124
122
  enabled: !!dataset.diseaseDatasets.length
125
123
  });
126
- const hasDiseaseInfo = !isPending && !serverError && !!fetchedData?.length;
124
+ const hasDiseaseInfo = !isPending && !serverError && !!(fetchedData !== null && fetchedData !== void 0 && fetchedData.length);
127
125
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
128
- className: `d-flex justify-content-between ${hasDiseaseInfo ? "cursor-pointer" : ""}`,
126
+ className: "d-flex justify-content-between ".concat(hasDiseaseInfo ? "cursor-pointer" : ""),
129
127
  onClick: () => {
130
128
  setOpenInfo(o => !o);
131
129
  }
@@ -133,7 +131,7 @@ function SingleSelectionItem(_ref3) {
133
131
  className: "d-flex justify-content-between align-items-center w-100"
134
132
  }, /*#__PURE__*/_react.default.createElement("div", null, item.name), /*#__PURE__*/_react.default.createElement("div", {
135
133
  className: "d-flex align-items-center gap-1"
136
- }, hasDiseaseInfo && /*#__PURE__*/_react.default.createElement(_iconsMaterial.MoreVert, null), !isDiseaseGene && /*#__PURE__*/_react.default.createElement(VarHistogram, {
134
+ }, hasDiseaseInfo && /*#__PURE__*/_react.default.createElement(_iconsMaterial.MoreVert, null), /*#__PURE__*/_react.default.createElement(VarHistogram, {
137
135
  item: item
138
136
  }), showSetColorEncoding && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
139
137
  type: "button",
@@ -148,7 +146,11 @@ function SingleSelectionItem(_ref3) {
148
146
  title: isNotInData ? "Not present in data" : "Set as color encoding"
149
147
  }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
150
148
  icon: _freeSolidSvgIcons.faDroplet
151
- })), (!isDiseaseGene || !showRemove) && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
149
+ }), isMultiple && /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
150
+ icon: _freeSolidSvgIcons.faPlus,
151
+ size: "xs",
152
+ className: "ps-xs-1"
153
+ })), showRemove && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
152
154
  type: "button",
153
155
  className: "m-0 p-0 px-1",
154
156
  variant: "outline-secondary",
@@ -167,37 +169,14 @@ function SingleSelectionItem(_ref3) {
167
169
  data: fetchedData
168
170
  }))));
169
171
  }
170
- function MultipleSelectionItem(_ref4) {
171
- let {
172
- item,
173
- isActive,
174
- toggleVar
175
- } = _ref4;
176
- const isNotInData = item.matrix_index === -1;
177
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
178
- className: "d-flex"
179
- }, /*#__PURE__*/_react.default.createElement("div", {
180
- className: "flex-grow-1"
181
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
182
- type: "button",
183
- key: item.matrix_index,
184
- variant: isActive ? "primary" : "outline-primary",
185
- className: "m-0 p-0 px-1",
186
- onClick: toggleVar,
187
- disabled: isNotInData,
188
- title: isNotInData ? "Not present in data" : item.name
189
- }, item.name))));
190
- }
191
- function VarItem(_ref5) {
172
+ function VarItem(_ref4) {
192
173
  let {
193
174
  item,
194
175
  active,
195
- setVarButtons,
196
- mode = _constants.SELECTION_MODES.SINGLE,
197
- isDiseaseGene = false
198
- } = _ref5;
199
- const dataset = (0, _DatasetContext.useDataset)();
200
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
176
+ mode = _constants.SELECTION_MODES.SINGLE
177
+ } = _ref4;
178
+ const settings = (0, _SettingsContext.useSettings)();
179
+ const dispatch = (0, _SettingsContext.useSettingsDispatch)();
201
180
  const selectVar = () => {
202
181
  if (mode === _constants.SELECTION_MODES.SINGLE) {
203
182
  dispatch({
@@ -220,8 +199,9 @@ function VarItem(_ref5) {
220
199
  }
221
200
  };
222
201
  const removeVar = () => {
223
- setVarButtons(b => {
224
- return b.filter(i => i.name !== item.name);
202
+ dispatch({
203
+ type: "remove.var",
204
+ var: item
225
205
  });
226
206
  if (mode === _constants.SELECTION_MODES.SINGLE) {
227
207
  if (active === item.matrix_index) {
@@ -239,28 +219,25 @@ function VarItem(_ref5) {
239
219
  }
240
220
  };
241
221
  const toggleVar = () => {
242
- if (active.includes(item.matrix_index)) {
243
- dispatch({
244
- type: "deselect.multivar",
245
- var: item
246
- });
247
- } else {
248
- selectVar(item);
249
- }
222
+ dispatch({
223
+ type: "toggle.multivar",
224
+ var: item
225
+ });
250
226
  };
251
227
  if (item && mode === _constants.SELECTION_MODES.SINGLE) {
252
- return /*#__PURE__*/_react.default.createElement(SingleSelectionItem, {
228
+ return /*#__PURE__*/_react.default.createElement(SelectionItem, {
253
229
  item: item,
254
- isActive: dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR && active === item.matrix_index,
230
+ isActive: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR && active === item.matrix_index,
255
231
  selectVar: selectVar,
256
- removeVar: removeVar,
257
- isDiseaseGene: isDiseaseGene
232
+ removeVar: removeVar
258
233
  });
259
234
  } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
260
- return /*#__PURE__*/_react.default.createElement(MultipleSelectionItem, {
235
+ return /*#__PURE__*/_react.default.createElement(SelectionItem, {
261
236
  item: item,
262
237
  isActive: item.matrix_index !== -1 && _lodash.default.includes(active, item.matrix_index),
263
- toggleVar: toggleVar
238
+ selectVar: toggleVar,
239
+ removeVar: removeVar,
240
+ isMultiple: true
264
241
  });
265
242
  } else {
266
243
  return null;
@@ -10,16 +10,21 @@ var _reactFontawesome = require("@fortawesome/react-fontawesome");
10
10
  var _lodash = _interopRequireDefault(require("lodash"));
11
11
  var _reactBootstrap = require("react-bootstrap");
12
12
  var _ButtonGroup = _interopRequireDefault(require("react-bootstrap/ButtonGroup"));
13
+ var _VarItem = require("./VarItem");
14
+ var _VarListToolbar = require("./VarListToolbar");
15
+ var _VarSet = require("./VarSet");
13
16
  var _constants = require("../../constants/constants");
14
17
  var _DatasetContext = require("../../context/DatasetContext");
18
+ var _SettingsContext = require("../../context/SettingsContext");
15
19
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
16
20
  var _requests = require("../../utils/requests");
17
- var _VarItem = require("./VarItem");
18
- var _VarListToolbar = require("./VarListToolbar");
19
- var _VarSet = require("./VarSet");
20
21
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
21
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
22
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
22
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
23
+ 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; }
24
+ 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; }
25
+ 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; }
26
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
27
+ 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); }
23
28
  const useVarMean = function (varKeys) {
24
29
  let enabled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
25
30
  const ENDPOINT = "matrix/mean";
@@ -35,13 +40,12 @@ const useVarMean = function (varKeys) {
35
40
  });
36
41
  (0, _react.useEffect)(() => {
37
42
  setParams(p => {
38
- return {
39
- ...p,
43
+ return _objectSpread(_objectSpread({}, p), {}, {
40
44
  varKeys: _lodash.default.map(varKeys, v => v.isSet ? {
41
45
  name: v.name,
42
46
  indices: v.vars.map(v => v.index)
43
47
  } : v.index)
44
- };
48
+ });
45
49
  });
46
50
  }, [varKeys]);
47
51
  return (0, _requests.useFetch)(ENDPOINT, params, {
@@ -54,173 +58,50 @@ const useVarMean = function (varKeys) {
54
58
  const sortMeans = (i, means) => {
55
59
  return means[i.name] || _lodash.default.min(_lodash.default.values(means)) - 1;
56
60
  };
57
-
58
- // @TODO: display where disease data comes from
59
- // add to disease dataset metadata
60
- function DiseaseVarList(_ref) {
61
- let {
62
- makeListItem
63
- } = _ref;
64
- const ENDPOINT = "disease/genes";
65
- const dataset = (0, _DatasetContext.useDataset)();
66
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
67
- const [diseaseVars, setDiseaseVars] = (0, _react.useState)([]);
68
- const [sortedDiseaseVars, setSortedDiseaseVars] = (0, _react.useState)([]);
69
- const [params, setParams] = (0, _react.useState)({
70
- url: dataset.url,
71
- col: dataset.varNamesCol,
72
- diseaseId: dataset.selectedDisease?.id,
73
- diseaseDatasets: dataset.diseaseDatasets
74
- });
75
- (0, _react.useEffect)(() => {
76
- setParams(p => {
77
- return {
78
- ...p,
79
- diseaseId: dataset.selectedDisease?.id
80
- };
81
- });
82
- }, [dataset.selectedDisease]);
83
- const diseaseData = (0, _requests.useFetch)(ENDPOINT, params, {
84
- enabled: !!params.diseaseId,
85
- refetchOnMount: false
86
- });
87
- (0, _react.useEffect)(() => {
88
- if (!diseaseData.isPending && !diseaseData.serverError) {
89
- setDiseaseVars(diseaseData.fetchedData);
90
- }
91
- }, [diseaseData.fetchedData, diseaseData.isPending, diseaseData.serverError]);
92
- const varMeans = useVarMean(diseaseVars, !!diseaseVars?.length && dataset.varSort.disease.sort === _constants.VAR_SORT.MATRIX);
93
- (0, _react.useEffect)(() => {
94
- if (dataset.varSort.disease.sort === _constants.VAR_SORT.MATRIX) {
95
- if (!varMeans.isPending && !varMeans.serverError) {
96
- setSortedDiseaseVars(_lodash.default.orderBy(diseaseVars, o => {
97
- return sortMeans(o, varMeans.fetchedData);
98
- }, dataset.varSort.disease.sortOrder));
99
- }
100
- } else if (dataset.varSort.disease.sort === _constants.VAR_SORT.NAME) {
101
- setSortedDiseaseVars(_lodash.default.orderBy(diseaseVars, "name", dataset.varSort.disease.sortOrder));
102
- } else {
103
- setSortedDiseaseVars(diseaseVars);
104
- }
105
- }, [dataset.varSort.disease.sort, dataset.varSort.disease.sortOrder, diseaseVars, varMeans.fetchedData, varMeans.isPending, varMeans.serverError]);
106
- const diseaseVarList = _lodash.default.map(sortedDiseaseVars, item => {
107
- return makeListItem(item, true);
108
- });
109
- const isPending = diseaseData.isPending || varMeans.isPending && dataset.varSort.disease.sort === _constants.VAR_SORT.MATRIX;
110
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, dataset.selectedDisease && (!isPending && !diseaseVars?.length ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
111
- className: "d-flex justify-content-between mt-3"
112
- }, /*#__PURE__*/_react.default.createElement("h5", null, "Disease genes")), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
113
- variant: "light"
114
- }, "No disease genes found.")) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
115
- className: "d-flex justify-content-between my-2"
116
- }, /*#__PURE__*/_react.default.createElement("h5", null, "Disease genes"), /*#__PURE__*/_react.default.createElement(_ButtonGroup.default, {
117
- "aria-label": "Feature options",
118
- size: "sm"
119
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
120
- variant: "info",
121
- onClick: () => {
122
- dispatch({
123
- type: "reset.disease"
124
- });
125
- }
126
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
127
- icon: _freeSolidSvgIcons.faTimes,
128
- className: "me-1"
129
- }), "Clear"))), /*#__PURE__*/_react.default.createElement("p", null, dataset.selectedDisease?.name), /*#__PURE__*/_react.default.createElement(_VarListToolbar.VarListToolbar, {
130
- varType: "disease"
131
- }), /*#__PURE__*/_react.default.createElement("div", {
132
- className: "position-relative"
133
- }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
134
- variant: "flush",
135
- className: "cherita-list"
136
- }, diseaseVarList)))));
137
- }
138
- function VarNamesList(_ref2) {
61
+ function VarNamesList(_ref) {
62
+ var _settings$selectedVar, _settings$selectedVar2;
139
63
  let {
140
64
  mode = _constants.SELECTION_MODES.SINGLE,
141
- displayName = "genes",
142
- showDiseaseVarList = true
143
- } = _ref2;
144
- const dataset = (0, _DatasetContext.useDataset)();
145
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
146
- const [varButtons, setVarButtons] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? dataset.selectedVar ? _lodash.default.unionWith([dataset.selectedVar], dataset.varSets, _lodash.default.isEqual) : [...dataset.varSets] : [...dataset.selectedMultiVar, ...dataset.varSets]);
147
- const [active, setActive] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? dataset.selectedVar?.matrix_index || dataset.selectedVar?.name : dataset.selectedMultiVar.map(i => i.matrix_index || i.name));
148
- const [sortedVarButtons, setSortedVarButtons] = (0, _react.useState)([]);
65
+ displayName = "genes"
66
+ } = _ref;
67
+ const settings = (0, _SettingsContext.useSettings)();
68
+ const dispatch = (0, _SettingsContext.useSettingsDispatch)();
69
+ const [active, setActive] = (0, _react.useState)(mode === _constants.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));
70
+ const [sortedVars, setSortedVars] = (0, _react.useState)([]);
149
71
  (0, _react.useEffect)(() => {
150
72
  if (mode === _constants.SELECTION_MODES.SINGLE) {
151
- setVarButtons(v => {
152
- if (dataset.selectedVar) {
153
- return _lodash.default.unionWith(v, [dataset.selectedVar], _lodash.default.isEqual);
154
- } else {
155
- return v;
156
- }
157
- });
158
- setActive(dataset.selectedVar?.matrix_index || dataset.selectedVar?.name);
73
+ var _settings$selectedVar3, _settings$selectedVar4;
74
+ 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));
159
75
  }
160
- }, [mode, dataset.selectedVar]);
76
+ }, [mode, settings.selectedVar]);
161
77
  (0, _react.useEffect)(() => {
162
78
  if (mode === _constants.SELECTION_MODES.MULTIPLE) {
163
- setVarButtons(v => {
164
- if (dataset.selectedMultiVar.length) {
165
- return _lodash.default.unionWith(v, dataset.selectedMultiVar, _lodash.default.isEqual);
166
- } else {
167
- return v;
168
- }
169
- });
170
- setActive(dataset.selectedMultiVar.map(i => i.matrix_index || i.name));
79
+ setActive(settings.selectedMultiVar.map(i => i.matrix_index || i.name));
171
80
  }
172
- }, [mode, dataset.selectedMultiVar]);
173
- (0, _react.useEffect)(() => {
174
- setVarButtons(v => {
175
- const updated = _lodash.default.compact(_lodash.default.map(v, i => {
176
- if (i.isSet) {
177
- return dataset.varSets.find(s => s.name === i.name);
178
- } else return i;
179
- }));
180
- const newSets = _lodash.default.difference(dataset.varSets, updated);
181
- return [...updated, ...newSets];
182
- });
183
- if (mode === _constants.SELECTION_MODES.SINGLE) {
184
- if (dataset.selectedVar?.isSet) {
185
- const selectedSet = dataset.varSets.find(s => s.name === dataset.selectedVar.name);
186
- dispatch({
187
- type: "select.var",
188
- var: selectedSet
189
- });
190
- }
191
- } else {
192
- dispatch({
193
- type: "update.multivar",
194
- vars: dataset.varSets
195
- });
196
- }
197
- }, [mode, dataset.varSets, dataset.selectedVar?.isSet, dataset.selectedVar?.name, dispatch]);
198
- const varMeans = useVarMean(varButtons, dataset.varSort.var.sort === _constants.VAR_SORT.MATRIX);
81
+ }, [mode, settings.selectedMultiVar]);
82
+ const varMeans = useVarMean(settings.vars, settings.varSort.var.sort === _constants.VAR_SORT.MATRIX);
199
83
 
200
- // @TODO: deferr sortedVarButtons ?
84
+ // @TODO: deferr sortedVars ?
201
85
  (0, _react.useEffect)(() => {
202
- if (dataset.varSort.var.sort === _constants.VAR_SORT.MATRIX) {
86
+ if (settings.varSort.var.sort === _constants.VAR_SORT.MATRIX) {
203
87
  if (!varMeans.isPending && !varMeans.serverError && varMeans.fetchedData) {
204
- setSortedVarButtons(_lodash.default.orderBy(varButtons, o => {
88
+ setSortedVars(_lodash.default.orderBy(settings.vars, o => {
205
89
  return sortMeans(o, varMeans.fetchedData);
206
- }, dataset.varSort.var.sortOrder));
90
+ }, settings.varSort.var.sortOrder));
207
91
  }
208
- } else if (dataset.varSort.var.sort === _constants.VAR_SORT.NAME) {
209
- setSortedVarButtons(_lodash.default.orderBy(varButtons, "name", dataset.varSort.var.sortOrder));
92
+ } else if (settings.varSort.var.sort === _constants.VAR_SORT.NAME) {
93
+ setSortedVars(_lodash.default.orderBy(settings.vars, "name", settings.varSort.var.sortOrder));
210
94
  } else {
211
- setSortedVarButtons(varButtons);
95
+ setSortedVars(settings.vars);
212
96
  }
213
- }, [dataset.varSort.var.sort, dataset.varSort.var.sortOrder, varButtons, varMeans.isPending, varMeans.serverError, varMeans.fetchedData]);
214
- const makeListItem = function (item) {
215
- let isDiseaseGene = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
97
+ }, [settings.varSort.var.sort, settings.varSort.var.sortOrder, varMeans.isPending, varMeans.serverError, varMeans.fetchedData, settings.vars]);
98
+ const makeListItem = item => {
216
99
  return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
217
100
  key: item.matrix_index
218
101
  }, /*#__PURE__*/_react.default.createElement(_VarItem.VarItem, {
219
102
  item: item,
220
103
  active: active,
221
- setVarButtons: setVarButtons,
222
- mode: mode,
223
- isDiseaseGene: isDiseaseGene
104
+ mode: mode
224
105
  }));
225
106
  };
226
107
  const makeSetListItem = set => {
@@ -232,7 +113,7 @@ function VarNamesList(_ref2) {
232
113
  mode: mode
233
114
  }));
234
115
  };
235
- const varList = _lodash.default.map(sortedVarButtons, item => {
116
+ const varList = _lodash.default.map(sortedVars, item => {
236
117
  if (item.isSet) {
237
118
  return makeSetListItem(item);
238
119
  } else {
@@ -241,17 +122,17 @@ function VarNamesList(_ref2) {
241
122
  });
242
123
  const newSetName = () => {
243
124
  let n = 1;
244
- let setName = `Set ${n}`;
245
- const setNameExists = name => {
246
- return dataset.varSets.some(set => set.name === name);
125
+ let setName = "Set ".concat(n);
126
+ const nameExists = name => {
127
+ return settings.vars.some(v => v.name === name);
247
128
  };
248
- while (setNameExists(setName)) {
129
+ while (nameExists(setName)) {
249
130
  n++;
250
- setName = `Set ${n}`;
131
+ setName = "Set ".concat(n);
251
132
  }
252
133
  return setName;
253
134
  };
254
- const isPending = varMeans.isPending && dataset.varSort.var.sort === _constants.VAR_SORT.MATRIX;
135
+ const isPending = varMeans.isPending && settings.varSort.var.sort === _constants.VAR_SORT.MATRIX;
255
136
  return /*#__PURE__*/_react.default.createElement("div", {
256
137
  className: "position-relative"
257
138
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -265,8 +146,8 @@ function VarNamesList(_ref2) {
265
146
  variant: "info",
266
147
  onClick: () => {
267
148
  dispatch({
268
- type: "add.varSet",
269
- varSet: {
149
+ type: "add.var",
150
+ var: {
270
151
  name: newSetName(),
271
152
  vars: [],
272
153
  isSet: true
@@ -276,12 +157,8 @@ function VarNamesList(_ref2) {
276
157
  }, "New set"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
277
158
  variant: "info",
278
159
  onClick: () => {
279
- setVarButtons([]);
280
- dispatch({
281
- type: mode === _constants.SELECTION_MODES.SINGLE ? "reset.var" : "reset.multiVar"
282
- });
283
160
  dispatch({
284
- type: "reset.varSets"
161
+ type: "reset.vars"
285
162
  });
286
163
  }
287
164
  }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
@@ -294,7 +171,5 @@ function VarNamesList(_ref2) {
294
171
  }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
295
172
  variant: "flush",
296
173
  className: "cherita-list"
297
- }, varList)))), /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, showDiseaseVarList && /*#__PURE__*/_react.default.createElement(DiseaseVarList, {
298
- makeListItem: makeListItem
299
- }))));
174
+ }, varList))))));
300
175
  }
@@ -9,19 +9,18 @@ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
9
  var _reactFontawesome = require("@fortawesome/react-fontawesome");
10
10
  var _reactBootstrap = require("react-bootstrap");
11
11
  var _constants = require("../../constants/constants");
12
- var _DatasetContext = require("../../context/DatasetContext");
13
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
14
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
12
+ var _SettingsContext = require("../../context/SettingsContext");
13
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
15
14
  // @TODO: set option for "var" and "disease"
16
15
  function VarListToolbar(_ref) {
17
16
  let {
18
17
  varType = "var"
19
18
  } = _ref;
20
- const dataset = (0, _DatasetContext.useDataset)();
21
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
22
- const [sort, setSort] = (0, _react.useState)(dataset.varSort.var.sort);
23
- const [nameSortOrder, setNameSortOrder] = (0, _react.useState)(dataset.varSort.var.sortOrder);
24
- const [matrixSortOrder, setMatrixSortOrder] = (0, _react.useState)(dataset.varSort.var.sortOrder);
19
+ const settings = (0, _SettingsContext.useSettings)();
20
+ const dispatch = (0, _SettingsContext.useSettingsDispatch)();
21
+ const [sort, setSort] = (0, _react.useState)(settings.varSort.var.sort);
22
+ const [nameSortOrder, setNameSortOrder] = (0, _react.useState)(settings.varSort.var.sortOrder);
23
+ const [matrixSortOrder, setMatrixSortOrder] = (0, _react.useState)(settings.varSort.var.sortOrder);
25
24
  const handleSort = (sortValue, sortOrder, setSortOrder) => {
26
25
  if (sort !== sortValue) {
27
26
  setSort(sortValue);