@haniffalab/cherita-react 2.0.0 → 2.1.0

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 (67) hide show
  1. package/dist/cjs/components/dotplot/Dotplot.js +4 -5
  2. package/dist/cjs/components/dotplot/DotplotControls.js +7 -3
  3. package/dist/cjs/components/heatmap/Heatmap.js +4 -5
  4. package/dist/cjs/components/icons/HeatmapIcon.js +2 -2
  5. package/dist/cjs/components/matrixplot/Matrixplot.js +4 -5
  6. package/dist/cjs/components/obs-list/ObsItem.js +7 -7
  7. package/dist/cjs/components/offcanvas/OffCanvas.js +7 -4
  8. package/dist/cjs/components/plot/PlotTypeSelector.js +49 -10
  9. package/dist/cjs/components/pseudospatial/Pseudospatial.js +8 -5
  10. package/dist/cjs/components/scatterplot/Scatterplot.js +134 -136
  11. package/dist/cjs/components/scatterplot/ScatterplotLayer.js +144 -0
  12. package/dist/cjs/components/scatterplot/SpatialControls.js +7 -4
  13. package/dist/cjs/components/scatterplot/Toolbox.js +8 -4
  14. package/dist/cjs/components/search-bar/SearchBar.js +51 -29
  15. package/dist/cjs/components/search-bar/SearchInfo.js +2 -2
  16. package/dist/cjs/components/search-bar/SearchResults.js +9 -6
  17. package/dist/cjs/components/toolbar/Toolbar.js +10 -65
  18. package/dist/cjs/components/var-list/VarItem.js +4 -6
  19. package/dist/cjs/components/var-list/VarList.js +17 -9
  20. package/dist/cjs/components/var-list/VarListToolbar.js +1 -1
  21. package/dist/cjs/components/var-list/VarSet.js +7 -5
  22. package/dist/cjs/components/violin/Violin.js +6 -7
  23. package/dist/cjs/constants/constants.js +6 -3
  24. package/dist/cjs/context/DatasetContext.js +11 -2
  25. package/dist/cjs/context/SettingsContext.js +27 -2
  26. package/dist/cjs/helpers/color-helper.js +17 -12
  27. package/dist/cjs/index.js +0 -7
  28. package/dist/cjs/utils/Legend.js +6 -5
  29. package/dist/cjs/utils/requests.js +2 -2
  30. package/dist/cjs/views/ObservationFeature/StandardView.js +1 -1
  31. package/dist/cjs/views/PerturbationMap/ObsExplorer.js +11 -9
  32. package/dist/cjs/views/PerturbationMap/StandardView.js +2 -1
  33. package/dist/cjs/workers/scatterplotData.js +16 -0
  34. package/dist/esm/components/dotplot/Dotplot.js +5 -6
  35. package/dist/esm/components/dotplot/DotplotControls.js +6 -3
  36. package/dist/esm/components/heatmap/Heatmap.js +5 -6
  37. package/dist/esm/components/icons/HeatmapIcon.js +2 -2
  38. package/dist/esm/components/matrixplot/Matrixplot.js +5 -6
  39. package/dist/esm/components/obs-list/ObsItem.js +7 -7
  40. package/dist/esm/components/offcanvas/OffCanvas.js +7 -4
  41. package/dist/esm/components/plot/PlotTypeSelector.js +49 -10
  42. package/dist/esm/components/pseudospatial/Pseudospatial.js +8 -5
  43. package/dist/esm/components/scatterplot/Scatterplot.js +132 -134
  44. package/dist/esm/components/scatterplot/ScatterplotLayer.js +137 -0
  45. package/dist/esm/components/scatterplot/SpatialControls.js +7 -4
  46. package/dist/esm/components/scatterplot/Toolbox.js +8 -4
  47. package/dist/esm/components/search-bar/SearchBar.js +52 -30
  48. package/dist/esm/components/search-bar/SearchInfo.js +2 -2
  49. package/dist/esm/components/search-bar/SearchResults.js +9 -6
  50. package/dist/esm/components/toolbar/Toolbar.js +9 -63
  51. package/dist/esm/components/var-list/VarItem.js +4 -6
  52. package/dist/esm/components/var-list/VarList.js +17 -9
  53. package/dist/esm/components/var-list/VarListToolbar.js +1 -1
  54. package/dist/esm/components/var-list/VarSet.js +7 -5
  55. package/dist/esm/components/violin/Violin.js +7 -8
  56. package/dist/esm/constants/constants.js +5 -2
  57. package/dist/esm/context/DatasetContext.js +11 -2
  58. package/dist/esm/context/SettingsContext.js +27 -2
  59. package/dist/esm/helpers/color-helper.js +17 -12
  60. package/dist/esm/index.js +0 -1
  61. package/dist/esm/utils/Legend.js +6 -5
  62. package/dist/esm/utils/requests.js +2 -2
  63. package/dist/esm/views/ObservationFeature/StandardView.js +1 -1
  64. package/dist/esm/views/PerturbationMap/ObsExplorer.js +11 -9
  65. package/dist/esm/views/PerturbationMap/StandardView.js +2 -1
  66. package/dist/esm/workers/scatterplotData.js +10 -0
  67. package/package.json +6 -3
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Toolbox = Toolbox;
7
7
  var _reactBootstrap = require("react-bootstrap");
8
+ var _DatasetContext = require("../../context/DatasetContext");
8
9
  var _string = require("../../utils/string");
9
10
  var _ObsmList = require("../obsm-list/ObsmList");
10
11
  var _jsxRuntime = require("react/jsx-runtime");
@@ -15,6 +16,9 @@ function Toolbox(_ref) {
15
16
  slicedLength,
16
17
  setHasObsm
17
18
  } = _ref;
19
+ const {
20
+ obsLabel
21
+ } = (0, _DatasetContext.useDataset)();
18
22
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
19
23
  className: "cherita-toolbox",
20
24
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.ButtonGroup, {
@@ -24,7 +28,7 @@ function Toolbox(_ref) {
24
28
  placement: "top",
25
29
  overlay: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Tooltip, {
26
30
  id: "tooltip-dropped-mode",
27
- children: ["You have selected ", (0, _string.formatNumerical)(slicedLength), " out of", ' ', (0, _string.formatNumerical)(obsLength), " cells"]
31
+ children: ["You have selected ", (0, _string.formatNumerical)(slicedLength), " out of", ' ', (0, _string.formatNumerical)(obsLength), " ", obsLabel.plural]
28
32
  }),
29
33
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Button, {
30
34
  size: "sm",
@@ -33,13 +37,13 @@ function Toolbox(_ref) {
33
37
  cursor: 'default'
34
38
  },
35
39
  "aria-disabled": "true",
36
- children: [(0, _string.formatNumerical)(slicedLength), " of ", (0, _string.formatNumerical)(obsLength), ' ', "cells"]
40
+ children: [(0, _string.formatNumerical)(slicedLength), " of ", (0, _string.formatNumerical)(obsLength), ' ', obsLabel.plural]
37
41
  })
38
42
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.OverlayTrigger, {
39
43
  placement: "top",
40
44
  overlay: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Tooltip, {
41
45
  id: "tooltip-dropped-mode",
42
- children: ["You are viewing ", (0, _string.formatNumerical)(obsLength), " cells"]
46
+ children: ["You are viewing ", (0, _string.formatNumerical)(obsLength), " ", obsLabel.plural]
43
47
  }),
44
48
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Button, {
45
49
  size: "sm",
@@ -48,7 +52,7 @@ function Toolbox(_ref) {
48
52
  cursor: 'default'
49
53
  },
50
54
  "aria-disabled": "true",
51
- children: [(0, _string.formatNumerical)(obsLength), " cells"]
55
+ children: [(0, _string.formatNumerical)(obsLength), " ", obsLabel.plural]
52
56
  })
53
57
  }))]
54
58
  })
@@ -18,6 +18,7 @@ var _Tab = _interopRequireDefault(require("react-bootstrap/Tab"));
18
18
  var _SearchInfo = require("./SearchInfo");
19
19
  var _SearchResults = require("./SearchResults");
20
20
  var _constants = require("../../constants/constants");
21
+ var _DatasetContext = require("../../context/DatasetContext");
21
22
  var _jsxRuntime = require("react/jsx-runtime");
22
23
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
23
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,27 +26,39 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
25
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; }
26
27
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
27
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); }
28
- const select = (dispatch, item) => {
29
- dispatch({
30
- type: 'select.var',
31
- var: item
32
- });
33
- dispatch({
34
- type: 'select.multivar',
35
- var: item
36
- });
37
- dispatch({
38
- type: 'set.colorEncoding',
39
- value: _constants.COLOR_ENCODINGS.VAR
40
- });
41
- };
42
- const debounceSelect = _lodash.default.debounce(select, 500);
43
- function onVarSelect(dispatch, item) {
44
- dispatch({
45
- type: 'add.var',
46
- var: item
47
- });
48
- debounceSelect(dispatch, item);
29
+ function useVarSelect() {
30
+ const pendingVars = (0, _react.useRef)(new Map());
31
+ const debouncedSelect = (0, _react.useMemo)(() => _lodash.default.debounce(dispatch => {
32
+ const vars = [...pendingVars.current.values()];
33
+ pendingVars.current.clear();
34
+ dispatch({
35
+ type: 'select.multivar.batch',
36
+ vars: vars
37
+ });
38
+ const lastItem = vars[vars.length - 1];
39
+ if (lastItem) {
40
+ dispatch({
41
+ type: 'select.var',
42
+ var: lastItem
43
+ });
44
+ dispatch({
45
+ type: 'set.colorEncoding',
46
+ value: _constants.COLOR_ENCODINGS.VAR
47
+ });
48
+ }
49
+ }, 500), []);
50
+ const onVarSelect = (0, _react.useCallback)((dispatch, item) => {
51
+ dispatch({
52
+ type: 'add.var',
53
+ var: item
54
+ });
55
+ pendingVars.current.set(item.name, item);
56
+ debouncedSelect(dispatch);
57
+ }, [debouncedSelect]);
58
+ return {
59
+ onVarSelect,
60
+ debouncedSelect
61
+ };
49
62
  }
50
63
  function addVarSet(dispatch, _ref) {
51
64
  let {
@@ -73,7 +86,7 @@ function SearchModal(_ref2) {
73
86
  text,
74
87
  setText,
75
88
  displayText,
76
- handleSelect = onVarSelect,
89
+ handleVarSelect,
77
90
  searchVar,
78
91
  searchDiseases,
79
92
  searchObs
@@ -93,6 +106,7 @@ function SearchModal(_ref2) {
93
106
  const [varResultsLength, setVarResultsLength] = (0, _react.useState)(null);
94
107
  const [diseaseResultsLength, setDiseaseResultsLength] = (0, _react.useState)(null);
95
108
  const [obsResultsLength, setObsResultsLength] = (0, _react.useState)(null);
109
+ const dataset = (0, _DatasetContext.useDataset)();
96
110
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Modal, {
97
111
  show: show,
98
112
  onHide: handleClose,
@@ -168,7 +182,7 @@ function SearchModal(_ref2) {
168
182
  children: [searchVar && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Nav.default.Item, {
169
183
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Nav.default.Link, {
170
184
  eventKey: FEATURE_TYPE.VAR,
171
- children: ["Genes", ' ', !!varResultsLength && "(".concat(varResultsLength, ")")]
185
+ children: [_lodash.default.capitalize(dataset.varLabel.plural), ' ', !!varResultsLength && "(".concat(varResultsLength, ")")]
172
186
  })
173
187
  }), searchDiseases && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Nav.default.Item, {
174
188
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Nav.default.Link, {
@@ -178,7 +192,7 @@ function SearchModal(_ref2) {
178
192
  }), searchObs && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Nav.default.Item, {
179
193
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Nav.default.Link, {
180
194
  eventKey: FEATURE_TYPE.OBS,
181
- children: ["Genes", ' ', !!obsResultsLength && "(".concat(obsResultsLength, ")")]
195
+ children: [_lodash.default.capitalize(dataset.obsLabel.plural), ' ', !!obsResultsLength && "(".concat(obsResultsLength, ")")]
182
196
  })
183
197
  })]
184
198
  })
@@ -190,7 +204,7 @@ function SearchModal(_ref2) {
190
204
  eventKey: FEATURE_TYPE.VAR,
191
205
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchResults.VarSearchResults, {
192
206
  text: text,
193
- handleSelect: handleSelect,
207
+ handleSelect: handleVarSelect,
194
208
  selectedResult: selectedResult.var,
195
209
  setSelectedResult: item => setSelectedResult(prev => {
196
210
  return _objectSpread(_objectSpread({}, prev), {}, {
@@ -215,7 +229,6 @@ function SearchModal(_ref2) {
215
229
  eventKey: FEATURE_TYPE.OBS,
216
230
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchResults.ObsSearchResults, {
217
231
  text: text,
218
- handleSelect: handleSelect,
219
232
  selectedResult: selectedResult.obs,
220
233
  setSelectedResult: item => setSelectedResult(prev => {
221
234
  return _objectSpread(_objectSpread({}, prev), {}, {
@@ -238,7 +251,7 @@ function SearchModal(_ref2) {
238
251
  if (tab === FEATURE_TYPE.DISEASE) {
239
252
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchInfo.DiseaseInfo, {
240
253
  disease: selectedResult.disease,
241
- handleSelect: handleSelect,
254
+ handleSelect: handleVarSelect,
242
255
  addVarSet: addVarSet
243
256
  });
244
257
  } else if (tab === FEATURE_TYPE.OBS) {
@@ -267,8 +280,13 @@ function SearchBar(_ref3) {
267
280
  searchObs = false
268
281
  } = _ref3;
269
282
  const [text, setText] = (0, _react.useState)('');
270
- const displayText = [...(searchVar ? ['features'] : []), ...(searchDiseases ? ['diseases'] : [])].join(' and ');
283
+ const dataset = (0, _DatasetContext.useDataset)();
284
+ const displayText = [...(searchVar ? [dataset.varLabel.plural] : []), ...(searchDiseases ? ['diseases'] : []), ...(searchObs ? [dataset.obsLabel.plural] : [])].join(' and ');
271
285
  const [showModal, setShowModal] = (0, _react.useState)(false);
286
+ const {
287
+ onVarSelect,
288
+ debouncedSelect
289
+ } = useVarSelect();
272
290
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
273
291
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form, {
274
292
  onSubmit: e => {
@@ -294,7 +312,11 @@ function SearchBar(_ref3) {
294
312
  searchVar: searchVar,
295
313
  searchDiseases: searchDiseases,
296
314
  searchObs: searchObs,
297
- handleClose: () => setShowModal(false)
315
+ handleVarSelect: onVarSelect,
316
+ handleClose: () => {
317
+ debouncedSelect.flush();
318
+ setShowModal(false);
319
+ }
298
320
  })]
299
321
  });
300
322
  }
@@ -184,8 +184,8 @@ function DiseaseInfo(_ref2) {
184
184
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
185
185
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
186
186
  children: disease.disease_name
187
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("h6", {
188
- children: "Implicated genes"
187
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("h6", {
188
+ children: ["Implicated ", dataset.varLabel.plural]
189
189
  }), isPending ? /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
190
190
  children: "Loading..."
191
191
  }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
@@ -11,6 +11,7 @@ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
11
11
  var _reactFontawesome = require("@fortawesome/react-fontawesome");
12
12
  var _lodash = _interopRequireDefault(require("lodash"));
13
13
  var _reactBootstrap = require("react-bootstrap");
14
+ var _DatasetContext = require("../../context/DatasetContext");
14
15
  var _SettingsContext = require("../../context/SettingsContext");
15
16
  var _search = require("../../utils/search");
16
17
  var _VirtualizedList = require("../../utils/VirtualizedList");
@@ -98,9 +99,10 @@ function SearchResultsBase(_ref) {
98
99
  });
99
100
  }
100
101
  function VarSearchResults(props) {
102
+ const dataset = (0, _DatasetContext.useDataset)();
101
103
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(SearchResultsBase, _objectSpread(_objectSpread({}, props), {}, {
102
104
  searchHook: _search.useVarSearch,
103
- emptyLabel: "Search features",
105
+ emptyLabel: "Search for ".concat(dataset.varLabel.plural),
104
106
  itemRenderer: _ref2 => {
105
107
  var _item$index, _item$index2;
106
108
  let {
@@ -138,17 +140,18 @@ function VarSearchResults(props) {
138
140
  }));
139
141
  }
140
142
  function ObsSearchResults(props) {
143
+ const dataset = (0, _DatasetContext.useDataset)();
141
144
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(SearchResultsBase, _objectSpread(_objectSpread({}, props), {}, {
142
145
  searchHook: _search.useObsSearch,
143
- emptyLabel: "Search observations",
146
+ emptyLabel: "Search for ".concat(dataset.obsLabel.plural),
144
147
  itemRenderer: _ref3 => {
145
148
  let {
146
149
  item,
147
150
  dispatch,
148
- handleClose,
149
151
  selectedResult,
150
152
  setSelectedResult,
151
- isStale
153
+ isStale,
154
+ handleClose
152
155
  } = _ref3;
153
156
  const onObsSelect = (dispatch, item, closeModal) => {
154
157
  dispatch({
@@ -172,7 +175,7 @@ function ObsSearchResults(props) {
172
175
  variant: "outline-secondary",
173
176
  title: "Add to list",
174
177
  disabled: isStale,
175
- onClick: () => onObsSelect(dispatch, item, props.handleClose),
178
+ onClick: () => onObsSelect(dispatch, item, handleClose),
176
179
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
177
180
  icon: _freeSolidSvgIcons.faPlus
178
181
  })
@@ -186,7 +189,7 @@ function ObsSearchResults(props) {
186
189
  function DiseasesSearchResults(props) {
187
190
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(SearchResultsBase, _objectSpread(_objectSpread({}, props), {}, {
188
191
  searchHook: _search.useDiseaseSearch,
189
- emptyLabel: "Search diseases",
192
+ emptyLabel: "Search for diseases",
190
193
  overscan: 250,
191
194
  estimateSize: () => 32,
192
195
  itemRenderer: _ref4 => {
@@ -3,81 +3,26 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.Toolbar = exports.PlotlyToolbar = exports.PlotlyModebarControls = void 0;
6
+ exports.PlotlyToolbar = exports.PlotlyModebarControls = void 0;
7
7
  var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
8
8
  var _reactFontawesome = require("@fortawesome/react-fontawesome");
9
+ var _lodash = _interopRequireDefault(require("lodash"));
9
10
  var _reactBootstrap = require("react-bootstrap");
11
+ var _DatasetContext = require("../../context/DatasetContext");
10
12
  var _usePlotVisibility = _interopRequireDefault(require("../../utils/usePlotVisibility"));
11
13
  var _jsxRuntime = require("react/jsx-runtime");
12
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
- const Toolbar = _ref => {
14
- let {
15
- setShowCategories,
16
- setShowSearch,
17
- setShowControls,
18
- Fullscreen
19
- } = _ref;
20
- const {
21
- showCategoriesBtn,
22
- showSearchBtn
23
- } = (0, _usePlotVisibility.default)(isFullscreen);
24
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Navbar, {
25
- expand: "md",
26
- bg: "primary",
27
- variant: "dark",
28
- className: "cherita-navbar",
29
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Container, {
30
- fluid: true,
31
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Navbar.Toggle, {
32
- "aria-controls": "navbarScroll"
33
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Navbar.Collapse, {
34
- id: "navbarScroll",
35
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Nav, {
36
- navbarScroll: true,
37
- children: [showCategoriesBtn && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Nav.Item, {
38
- className: "me-2",
39
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Nav.Link, {
40
- onClick: () => setShowCategories(true),
41
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
42
- icon: _freeSolidSvgIcons.faList,
43
- className: "me-2"
44
- }), "Explore Categories"]
45
- })
46
- }), showSearchBtn && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Nav.Item, {
47
- className: "me-2",
48
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Nav.Link, {
49
- onClick: () => setShowSearch(true),
50
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
51
- icon: _freeSolidSvgIcons.faSearch,
52
- className: "me-2"
53
- }), "Search Genes"]
54
- })
55
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Nav.Item, {
56
- className: "me-2",
57
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Nav.Link, {
58
- onClick: () => setShowControls(true),
59
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
60
- icon: _freeSolidSvgIcons.faSliders,
61
- className: "me-2"
62
- }), "Controls"]
63
- })
64
- }), ' ']
65
- })
66
- })]
67
- })
68
- });
69
- };
70
- exports.Toolbar = Toolbar;
71
- const PlotlyToolbar = _ref2 => {
15
+ const PlotlyToolbar = _ref => {
72
16
  let {
73
17
  setShowCategories,
74
18
  setShowSearch,
75
19
  isFullscreen
76
- } = _ref2;
20
+ } = _ref;
77
21
  const {
78
22
  showCategoriesBtn,
79
23
  showSearchBtn
80
24
  } = (0, _usePlotVisibility.default)(isFullscreen);
25
+ const dataset = (0, _DatasetContext.useDataset)();
81
26
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.ButtonGroup, {
82
27
  children: [showCategoriesBtn && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Button, {
83
28
  variant: "primary",
@@ -90,19 +35,19 @@ const PlotlyToolbar = _ref2 => {
90
35
  }), showSearchBtn && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Button, {
91
36
  variant: "primary",
92
37
  onClick: () => setShowSearch(true),
93
- title: "Search Genes",
38
+ title: "Search ".concat(dataset.varLabel.plural),
94
39
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
95
40
  icon: _freeSolidSvgIcons.faSearch,
96
41
  className: "me-1"
97
- }), "Genes"]
42
+ }), _lodash.default.capitalize(dataset.varLabel.plural)]
98
43
  })]
99
44
  });
100
45
  };
101
46
  exports.PlotlyToolbar = PlotlyToolbar;
102
- const PlotlyModebarControls = _ref3 => {
47
+ const PlotlyModebarControls = _ref2 => {
103
48
  let {
104
49
  onClick
105
- } = _ref3;
50
+ } = _ref2;
106
51
  return {
107
52
  name: 'Controls',
108
53
  icon: {
@@ -156,7 +156,7 @@ function SelectionItem(_ref3) {
156
156
  className: "ms-auto d-flex align-items-center gap-1",
157
157
  children: [hasDiseaseInfo && /*#__PURE__*/(0, _jsxRuntime.jsx)(_iconsMaterial.MoreVert, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(VarHistogram, {
158
158
  item: item
159
- }), showSetColorEncoding && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Button, {
159
+ }), showSetColorEncoding && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
160
160
  type: "button",
161
161
  variant: isActive ? 'primary' : isNotInData ? 'outline-secondary' : 'outline-primary',
162
162
  className: "m-0 p-0 px-1",
@@ -166,11 +166,9 @@ function SelectionItem(_ref3) {
166
166
  },
167
167
  disabled: isNotInData,
168
168
  title: isNotInData ? 'Not present in data' : isMultiple ? isActive ? 'Remove from plot' : 'Add to plot' : 'Set as color encoding',
169
- children: [!isMultiple && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
170
- icon: _freeSolidSvgIcons.faDroplet
171
- }), isMultiple && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
172
- icon: _freeSolidSvgIcons.faCheck
173
- })]
169
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
170
+ icon: isMultiple ? _freeSolidSvgIcons.faCheck : _freeSolidSvgIcons.faDroplet
171
+ })
174
172
  }, item.matrix_index), showRemove && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
175
173
  type: "button",
176
174
  className: "m-0 p-0 px-1",
@@ -68,25 +68,33 @@ const sortMeans = (i, means) => {
68
68
  };
69
69
  exports.sortMeans = sortMeans;
70
70
  function VarNamesList(_ref) {
71
+ var _selectedVar$matrix_i;
71
72
  let {
72
- mode = _constants.SELECTION_MODES.SINGLE,
73
- displayName = 'genes'
73
+ mode = _constants.SELECTION_MODES.SINGLE
74
74
  } = _ref;
75
75
  const settings = (0, _SettingsContext.useSettings)();
76
76
  const dispatch = (0, _SettingsContext.useSettingsDispatch)();
77
+ const dataset = (0, _DatasetContext.useDataset)();
77
78
  const selectedVar = (0, _Resolver.useSelectedVar)();
78
79
  const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
79
80
  const settingsVars = (0, _Resolver.useSettingsVars)();
80
- const [active, setActive] = (0, _react.useState)(mode === _constants.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));
81
+ const [active, setActive] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? (_selectedVar$matrix_i = selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.matrix_index) !== null && _selectedVar$matrix_i !== void 0 ? _selectedVar$matrix_i : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name : selectedMultiVar.map(i => {
82
+ var _i$matrix_index;
83
+ return (_i$matrix_index = i.matrix_index) !== null && _i$matrix_index !== void 0 ? _i$matrix_index : i.name;
84
+ }));
81
85
  const [sortedVars, setSortedVars] = (0, _react.useState)([]);
82
86
  (0, _react.useEffect)(() => {
83
87
  if (mode === _constants.SELECTION_MODES.SINGLE) {
84
- setActive((selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.matrix_index) || (selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name));
88
+ var _selectedVar$matrix_i2;
89
+ setActive((_selectedVar$matrix_i2 = selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.matrix_index) !== null && _selectedVar$matrix_i2 !== void 0 ? _selectedVar$matrix_i2 : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name);
85
90
  }
86
91
  }, [mode, selectedVar]);
87
92
  (0, _react.useEffect)(() => {
88
93
  if (mode === _constants.SELECTION_MODES.MULTIPLE) {
89
- setActive(selectedMultiVar.map(i => i.matrix_index || i.name));
94
+ setActive(selectedMultiVar.map(i => {
95
+ var _i$matrix_index2;
96
+ return (_i$matrix_index2 = i.matrix_index) !== null && _i$matrix_index2 !== void 0 ? _i$matrix_index2 : i.name;
97
+ }));
90
98
  }
91
99
  }, [mode, selectedMultiVar]);
92
100
  const varMeans = useVarMean(settingsVars, settings.varSort.var.sort === _constants.VAR_SORT.MATRIX);
@@ -154,9 +162,9 @@ function VarNamesList(_ref) {
154
162
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
155
163
  className: "d-flex justify-content-between mb-2",
156
164
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
157
- children: _lodash.default.capitalize(displayName)
165
+ children: _lodash.default.capitalize(dataset.varLabel.plural)
158
166
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_ButtonGroup.default, {
159
- "aria-label": "Feature options",
167
+ "aria-label": "Options",
160
168
  size: "sm",
161
169
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
162
170
  variant: "info",
@@ -185,9 +193,9 @@ function VarNamesList(_ref) {
185
193
  })]
186
194
  })]
187
195
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
188
- children: !varList.length ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
196
+ children: !varList.length ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Alert, {
189
197
  variant: "light",
190
- children: "Search for a feature."
198
+ children: ["Search for ", dataset.varLabel.plural]
191
199
  }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
192
200
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_VarListToolbar.VarListToolbar, {}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
193
201
  className: "overflow-auto flex-grow-1 modern-scrollbars",
@@ -45,7 +45,7 @@ function VarListToolbar(_ref) {
45
45
  className: "d-flex justify-content-end align-items-center mb-2",
46
46
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.ToggleButtonGroup, {
47
47
  name: "sortfeatures",
48
- "aria-label": "Sort features by",
48
+ "aria-label": "Sort by",
49
49
  size: "sm",
50
50
  type: "radio",
51
51
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ToggleButton, {
@@ -11,6 +11,7 @@ var _lodash = _interopRequireDefault(require("lodash"));
11
11
  var _reactBootstrap = require("react-bootstrap");
12
12
  var _VarItem = require("./VarItem");
13
13
  var _constants = require("../../constants/constants");
14
+ var _DatasetContext = require("../../context/DatasetContext");
14
15
  var _SettingsContext = require("../../context/SettingsContext");
15
16
  var _SearchBar = require("../search-bar/SearchBar");
16
17
  var _jsxRuntime = require("react/jsx-runtime");
@@ -32,6 +33,7 @@ function SelectionSet(_ref) {
32
33
  removeSetVar,
33
34
  isMultiple = false
34
35
  } = _ref;
36
+ const dataset = (0, _DatasetContext.useDataset)();
35
37
  const [openSet, setOpenSet] = (0, _react.useState)(false);
36
38
  const [showModal, setShowModal] = (0, _react.useState)(false);
37
39
  const [searchText, setSearchText] = (0, _react.useState)('');
@@ -44,9 +46,9 @@ function SelectionSet(_ref) {
44
46
  })
45
47
  }, v.name);
46
48
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
47
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
49
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
48
50
  className: "text-muted",
49
- children: "No features in this set"
51
+ children: ["No ", dataset.varLabel.plural, " in this set"]
50
52
  })
51
53
  });
52
54
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
@@ -65,8 +67,8 @@ function SelectionSet(_ref) {
65
67
  className: "d-flex align-items-center gap-1",
66
68
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.OverlayTrigger, {
67
69
  placement: "top",
68
- overlay: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Tooltip, {
69
- children: "This set represents the mean value of its features"
70
+ overlay: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Tooltip, {
71
+ children: ["This set represents the mean value of its", ' ', dataset.varLabel.plural]
70
72
  }),
71
73
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
72
74
  icon: _freeSolidSvgIcons.faCircleInfo
@@ -137,7 +139,7 @@ function SelectionSet(_ref) {
137
139
  handleClose: () => setShowModal(false),
138
140
  text: searchText,
139
141
  setText: setSearchText,
140
- displayText: 'features',
142
+ displayText: dataset.varLabel.plural,
141
143
  handleSelect: (d, i) => {
142
144
  addVarToSet(d, set, i);
143
145
  },
@@ -34,7 +34,6 @@ function Violin(_ref) {
34
34
  setShowCategories,
35
35
  setShowSearch,
36
36
  setShowControls,
37
- plotType,
38
37
  setPlotType,
39
38
  isFullscreen = false
40
39
  } = _ref;
@@ -175,7 +174,7 @@ function Violin(_ref) {
175
174
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_PlotAlert.PlotAlert, {
176
175
  variant: "info",
177
176
  heading: "Set up your violin plot",
178
- plotType: plotType,
177
+ plotType: _constants.PLOT_TYPES.VIOLINPLOT,
179
178
  setPlotType: setPlotType,
180
179
  children: [mode === _constants.VIOLIN_MODES.MULTIKEY && /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
181
180
  className: "p-0 m-0",
@@ -183,8 +182,8 @@ function Violin(_ref) {
183
182
  variant: "link",
184
183
  className: "border-0 p-0 align-baseline",
185
184
  onClick: setShowSearch,
186
- children: "features"
187
- }) : 'features', ' ', "to display their expression distributions across all observations."]
185
+ children: dataset.varLabel.plural
186
+ }) : dataset.varLabel.plural, ' ', "to display their ", dataset.valueLabel, " distributions across all", ' ', dataset.obsLabel.plural, "."]
188
187
  }), mode === _constants.VIOLIN_MODES.GROUPBY && /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
189
188
  className: "p-0 m-0",
190
189
  children: ["Select a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
@@ -196,15 +195,15 @@ function Violin(_ref) {
196
195
  variant: "link",
197
196
  className: "border-0 p-0 align-baseline",
198
197
  onClick: setShowSearch,
199
- children: "feature"
200
- }) : 'feature', ' ', "to view its distribution within each group."]
198
+ children: dataset.varLabel.singular
199
+ }) : dataset.varLabel.singular, ' ', "to view its distribution within each group."]
201
200
  })]
202
201
  });
203
202
  } else {
204
203
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotAlert.PlotAlert, {
205
204
  variant: "danger",
206
205
  heading: "Error displaying the violin plot",
207
- plotType: plotType,
206
+ plotType: _constants.PLOT_TYPES.VIOLINPLOT,
208
207
  setPlotType: setPlotType,
209
208
  children: serverError.message || 'An unexpected error occurred while generating the plot.'
210
209
  });
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.VIOLIN_MODES = exports.VIOLINPLOT_SCALES = exports.VAR_SORT_ORDER = exports.VAR_SORT = exports.UNSELECTED_POLYGON_FILLCOLOR = exports.SELECTION_MODES = exports.SELECTED_POLYGON_FILLCOLOR = exports.PSEUDOSPATIAL_PLOT_TYPES = exports.PSEUDOSPATIAL_CATEGORICAL_MODES = exports.PLOT_TYPES = exports.PLOTLY_MODEBAR_BUTTONS = exports.OBS_TYPES = exports.MATRIXPLOT_SCALES = exports.LOCAL_STORAGE_KEY = exports.DOTPLOT_SCALES = exports.DEFAULT_OBS_GROUP = exports.DEFAULT_OBSM_KEYS = exports.COLOR_ENCODINGS = exports.BREAKPOINTS = void 0;
6
+ exports.VIOLIN_MODES = exports.VIOLINPLOT_SCALES = exports.VAR_SORT_ORDER = exports.VAR_SORT = exports.UNSELECTED_POLYGON_FILLCOLOR = exports.SELECTION_MODES = exports.SELECTED_POLYGON_FILLCOLOR = exports.PSEUDOSPATIAL_PLOT_TYPES = exports.PSEUDOSPATIAL_CATEGORICAL_MODES = exports.PLOT_TYPES = exports.PLOTLY_MODEBAR_BUTTONS = exports.OBS_TYPES = exports.MATRIXPLOT_SCALES = exports.LOCAL_STORAGE_KEY = exports.GRAY_MIX = exports.GRAY_ALPHA = exports.GRAY = exports.DOTPLOT_SCALES = exports.DEFAULT_OBS_GROUP = exports.DEFAULT_OBSM_KEYS = exports.COLOR_ENCODINGS = exports.BREAKPOINTS = void 0;
7
7
  const LOCAL_STORAGE_KEY = exports.LOCAL_STORAGE_KEY = 'CHERITA';
8
8
  const PLOT_TYPES = exports.PLOT_TYPES = {
9
9
  SCATTERPLOT: 'scatterplot',
@@ -99,11 +99,14 @@ const PSEUDOSPATIAL_CATEGORICAL_MODES = exports.PSEUDOSPATIAL_CATEGORICAL_MODES
99
99
  // `default` cols to be shown out of accordion, at top of obslist
100
100
  // default values from cellxgene schema
101
101
  const DEFAULT_OBS_GROUP = exports.DEFAULT_OBS_GROUP = ['assay', 'cell_type', 'development_stage', 'disease', 'donor_id', 'organism', 'self_reported_ethnicity', 'sex', 'suspension_type', 'tissue', 'tissue_type'];
102
- const PLOTLY_MODEBAR_BUTTONS = exports.PLOTLY_MODEBAR_BUTTONS = ['toImage', 'zoom2d', 'pan2d', 'zoomIn2d', 'zoomOut2d', 'autoScale2d', 'resetScale2d'];
102
+ const PLOTLY_MODEBAR_BUTTONS = exports.PLOTLY_MODEBAR_BUTTONS = ['toImage', 'zoom2d', 'pan2d', 'zoomIn2d', 'zoomOut2d', 'autoScale2d'];
103
103
  const BREAKPOINTS = exports.BREAKPOINTS = {
104
104
  LG: '(max-width: 991.98px)',
105
105
  XL: '(max-width: 1199.98px)'
106
106
  };
107
107
 
108
108
  // In order of priority
109
- const DEFAULT_OBSM_KEYS = exports.DEFAULT_OBSM_KEYS = ['x_umap', 'x_tsne', 'x_scvi', 'x_pca'];
109
+ const DEFAULT_OBSM_KEYS = exports.DEFAULT_OBSM_KEYS = ['x_umap', 'x_tsne', 'x_scvi', 'x_pca'];
110
+ const GRAY = exports.GRAY = [214, 212, 212];
111
+ const GRAY_MIX = exports.GRAY_MIX = 0.95;
112
+ const GRAY_ALPHA = exports.GRAY_ALPHA = 0.75;
@@ -60,7 +60,7 @@ const persistOptions = {
60
60
  return false;
61
61
  }
62
62
  },
63
- buster: "2.0.0" || '0.0.0'
63
+ buster: "2.1.0" || '0.0.0'
64
64
  // @TODO: add maxAge and api version numbers as buster
65
65
  };
66
66
  const initialDataset = {
@@ -81,7 +81,16 @@ const initialDataset = {
81
81
  dataUrl: null,
82
82
  // for additional data in a remote .parquet file
83
83
  dataFilterCols: null // map of obs cols to filter data in .parquet file
84
- }
84
+ },
85
+ obsLabel: {
86
+ singular: 'cell',
87
+ plural: 'cells'
88
+ },
89
+ varLabel: {
90
+ singular: 'gene',
91
+ plural: 'genes'
92
+ },
93
+ valueLabel: 'expression'
85
94
  };
86
95
  function DatasetProvider(_ref2) {
87
96
  let {