@haniffalab/cherita-react 1.2.0 → 1.3.0-dev.2025-05-28.9afc380f

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
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ScaleSelect = exports.ColorscaleSelect = void 0;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _lodash = _interopRequireDefault(require("lodash"));
9
+ var _reactBootstrap = require("react-bootstrap");
10
+ var _colorscales = require("../../constants/colorscales");
11
+ var _constants = require("../../constants/constants");
12
+ var _SettingsContext = require("../../context/SettingsContext");
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ const ColorscaleSelect = () => {
15
+ const settings = (0, _SettingsContext.useSettings)();
16
+ const dispatch = (0, _SettingsContext.useSettingsDispatch)();
17
+ return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Group, {
18
+ className: "mb-2"
19
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Label, null, "Colorscale"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Select, {
20
+ value: settings.controls.colorScale,
21
+ onChange: e => {
22
+ dispatch({
23
+ type: "set.controls.colorScale",
24
+ colorScale: e.target.value
25
+ });
26
+ }
27
+ }, _lodash.default.keys(_colorscales.COLORSCALES).map(key => /*#__PURE__*/_react.default.createElement("option", {
28
+ key: key,
29
+ value: key
30
+ }, key))));
31
+ };
32
+ exports.ColorscaleSelect = ColorscaleSelect;
33
+ const ScaleSelect = _ref => {
34
+ let {
35
+ plot
36
+ } = _ref;
37
+ const settings = (0, _SettingsContext.useSettings)();
38
+ const dispatch = (0, _SettingsContext.useSettingsDispatch)();
39
+ const SCALES = {
40
+ dotplot: _constants.DOTPLOT_SCALES,
41
+ matrixplot: _constants.MATRIXPLOT_SCALES,
42
+ violinplot: _constants.VIOLINPLOT_SCALES
43
+ };
44
+ return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Group, {
45
+ className: "mb-2"
46
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Label, null, "Standard scale"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Select, {
47
+ value: settings.controls.scale[plot] || "",
48
+ onChange: e => {
49
+ dispatch({
50
+ type: "set.controls.scale",
51
+ plot: plot,
52
+ scale: !e.target.value.length ? null : e.target.value
53
+ });
54
+ }
55
+ }, _lodash.default.values(SCALES[plot]).map(scale => /*#__PURE__*/_react.default.createElement("option", {
56
+ key: scale.value,
57
+ value: scale.value || ""
58
+ }, scale.name))));
59
+ };
60
+ exports.ScaleSelect = ScaleSelect;
@@ -10,72 +10,83 @@ var _reactBootstrap = require("react-bootstrap");
10
10
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
11
11
  var _DatasetContext = require("../../context/DatasetContext");
12
12
  var _FilterContext = require("../../context/FilterContext");
13
+ var _SettingsContext = require("../../context/SettingsContext");
13
14
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
14
15
  var _requests = require("../../utils/requests");
15
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
- 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); }
17
- 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; }
17
+ 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); }
18
+ 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; }
19
+ 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; }
20
+ 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; }
21
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
22
+ 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); }
18
23
  function Dotplot() {
24
+ var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
19
25
  const ENDPOINT = "dotplot";
20
26
  const dataset = (0, _DatasetContext.useDataset)();
27
+ const settings = (0, _SettingsContext.useSettings)();
21
28
  const {
22
29
  obsIndices,
23
30
  isSliced
24
31
  } = (0, _FilterContext.useFilteredData)();
25
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
26
- const colorscale = (0, _react.useRef)(dataset.controls.colorScale);
32
+ const dispatch = (0, _SettingsContext.useSettingsDispatch)();
33
+ const colorscale = (0, _react.useRef)(settings.controls.colorScale);
27
34
  const [data, setData] = (0, _react.useState)([]);
28
35
  const [layout, setLayout] = (0, _react.useState)({});
29
36
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
30
37
  const [params, setParams] = (0, _react.useState)({
31
38
  url: dataset.url,
32
- obsCol: dataset.selectedObs,
33
- obsValues: !dataset.selectedObs?.omit.length ? null : _lodash.default.difference(_lodash.default.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c]),
34
- varKeys: dataset.selectedMultiVar.map(i => i.isSet ? {
39
+ obsCol: settings.selectedObs,
40
+ obsValues: !((_settings$selectedObs = settings.selectedObs) !== null && _settings$selectedObs !== void 0 && _settings$selectedObs.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.codes), (_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.omit).map(c => {
41
+ var _settings$selectedObs4;
42
+ return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
43
+ }),
44
+ varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
35
45
  name: i.name,
36
46
  indices: i.vars.map(v => v.index)
37
47
  } : i.index),
38
48
  obsIndices: isSliced ? [...(obsIndices || [])] : null,
39
- standardScale: dataset.controls.standardScale,
40
- meanOnlyExpressed: dataset.controls.meanOnlyExpressed,
41
- expressionCutoff: dataset.controls.expressionCutoff,
49
+ standardScale: settings.controls.scale.dotplot,
50
+ meanOnlyExpressed: settings.controls.meanOnlyExpressed,
51
+ expressionCutoff: settings.controls.expressionCutoff,
42
52
  varNamesCol: dataset.varNamesCol
43
53
  });
44
54
  // @TODO: set default scale
45
55
 
46
56
  (0, _react.useEffect)(() => {
47
- if (dataset.selectedObs && dataset.selectedMultiVar.length) {
57
+ if (settings.selectedObs && settings.selectedMultiVar.length) {
48
58
  setHasSelections(true);
49
59
  } else {
50
60
  setHasSelections(false);
51
61
  }
52
62
  setParams(p => {
53
- return {
54
- ...p,
63
+ var _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
64
+ return _objectSpread(_objectSpread({}, p), {}, {
55
65
  url: dataset.url,
56
- obsCol: dataset.selectedObs,
57
- obsValues: !dataset.selectedObs?.omit.length ? null : _lodash.default.difference(_lodash.default.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c]),
58
- varKeys: dataset.selectedMultiVar.map(i => i.isSet ? {
66
+ obsCol: settings.selectedObs,
67
+ obsValues: !((_settings$selectedObs5 = settings.selectedObs) !== null && _settings$selectedObs5 !== void 0 && _settings$selectedObs5.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.codes), (_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.omit).map(c => {
68
+ var _settings$selectedObs8;
69
+ return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
70
+ }),
71
+ varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
59
72
  name: i.name,
60
73
  indices: i.vars.map(v => v.index)
61
74
  } : i.index),
62
75
  obsIndices: isSliced ? [...(obsIndices || [])] : null,
63
- standardScale: dataset.controls.standardScale,
64
- meanOnlyExpressed: dataset.controls.meanOnlyExpressed,
65
- expressionCutoff: dataset.controls.expressionCutoff,
76
+ standardScale: settings.controls.scale.dotplot,
77
+ meanOnlyExpressed: settings.controls.meanOnlyExpressed,
78
+ expressionCutoff: settings.controls.expressionCutoff,
66
79
  varNamesCol: dataset.varNamesCol
67
- };
80
+ });
68
81
  });
69
- }, [dataset.url, dataset.selectedObs, dataset.selectedMultiVar, dataset.controls.standardScale, dataset.controls.meanOnlyExpressed, dataset.controls.expressionCutoff, dataset.varNamesCol, isSliced, obsIndices]);
82
+ }, [dataset.url, settings.selectedObs, settings.selectedMultiVar, settings.controls.scale.dotplot, settings.controls.meanOnlyExpressed, settings.controls.expressionCutoff, dataset.varNamesCol, isSliced, obsIndices]);
70
83
  const updateColorscale = (0, _react.useCallback)(colorscale => {
71
84
  setLayout(l => {
72
- return {
73
- ...l,
74
- coloraxis: {
75
- ...l.coloraxis,
85
+ return _objectSpread(_objectSpread({}, l), {}, {
86
+ coloraxis: _objectSpread(_objectSpread({}, l.coloraxis), {}, {
76
87
  colorscale: colorscale
77
- }
78
- };
88
+ })
89
+ });
79
90
  });
80
91
  }, []);
81
92
  const {
@@ -102,21 +113,19 @@ function Dotplot() {
102
113
  }
103
114
  }, [fetchedData, isPending, serverError, hasSelections, dispatch, updateColorscale]);
104
115
  (0, _react.useEffect)(() => {
105
- colorscale.current = dataset.controls.colorScale;
116
+ colorscale.current = settings.controls.colorScale;
106
117
  updateColorscale(colorscale.current);
107
- }, [dataset.controls.colorScale, updateColorscale]);
118
+ }, [settings.controls.colorScale, updateColorscale]);
108
119
  (0, _react.useEffect)(() => {
109
120
  setLayout(l => {
110
- return {
111
- ...l,
112
- coloraxis: {
113
- ...l.coloraxis,
114
- cmin: dataset.controls.colorAxis.cmin,
115
- cmax: dataset.controls.colorAxis.cmax
116
- }
117
- };
121
+ return _objectSpread(_objectSpread({}, l), {}, {
122
+ coloraxis: _objectSpread(_objectSpread({}, l.coloraxis), {}, {
123
+ cmin: settings.controls.colorAxis.cmin,
124
+ cmax: settings.controls.colorAxis.cmax
125
+ })
126
+ });
118
127
  });
119
- }, [dataset.controls.colorAxis.cmin, dataset.controls.colorAxis.cmax]);
128
+ }, [settings.controls.colorAxis.cmin, settings.controls.colorAxis.cmax]);
120
129
  if (!serverError) {
121
130
  if (hasSelections) {
122
131
  return /*#__PURE__*/_react.default.createElement("div", {
@@ -5,121 +5,50 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.DotplotControls = DotplotControls;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
- var _lodash = _interopRequireDefault(require("lodash"));
9
8
  var _reactBootstrap = require("react-bootstrap");
10
- var _Dropdown = _interopRequireDefault(require("react-bootstrap/Dropdown"));
11
- var _colorscales = require("../../constants/colorscales");
12
- var _constants = require("../../constants/constants");
13
- var _DatasetContext = require("../../context/DatasetContext");
14
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
- 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); }
16
- 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; }
9
+ var _SettingsContext = require("../../context/SettingsContext");
10
+ var _Controls = require("../controls/Controls");
11
+ 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); }
12
+ 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; }
13
+ 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; }
14
+ 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; }
15
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
16
+ 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); }
17
17
  function DotplotControls() {
18
- const dataset = (0, _DatasetContext.useDataset)();
19
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
18
+ const settings = (0, _SettingsContext.useSettings)();
19
+ const dispatch = (0, _SettingsContext.useSettingsDispatch)();
20
20
  const [controls, setControls] = (0, _react.useState)({
21
- expressionCutoff: dataset.controls.expressionCutoff,
21
+ expressionCutoff: settings.controls.expressionCutoff,
22
22
  colorAxis: {
23
- cmin: dataset.controls.colorAxis.cmin,
24
- cmax: dataset.controls.colorAxis.cmax
23
+ cmin: settings.controls.colorAxis.cmin,
24
+ cmax: settings.controls.colorAxis.cmax
25
25
  }
26
26
  });
27
27
  (0, _react.useEffect)(() => {
28
- setControls(c => ({
29
- ...c,
28
+ setControls(c => _objectSpread(_objectSpread({}, c), {}, {
30
29
  colorAxis: {
31
- cmin: dataset.controls.colorAxis.cmin,
32
- cmax: dataset.controls.colorAxis.cmax
30
+ cmin: settings.controls.colorAxis.cmin,
31
+ cmax: settings.controls.colorAxis.cmax
33
32
  },
34
- expressionCutoff: dataset.controls.expressionCutoff
33
+ expressionCutoff: settings.controls.expressionCutoff
35
34
  }));
36
- }, [dataset.controls.colorAxis.cmin, dataset.controls.colorAxis.cmax, dataset.controls.expressionCutoff]);
37
- const colorScaleList = _lodash.default.keys(_colorscales.COLORSCALES).map(key => /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
38
- key: key,
39
- active: dataset.controls.colorScale === key,
40
- onClick: () => {
41
- dispatch({
42
- type: "set.controls.colorScale",
43
- colorScale: key
44
- });
45
- }
46
- }, key));
47
- const standardScaleList = _lodash.default.values(_constants.DOTPLOT_SCALES).map(scale => /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
48
- key: scale.value,
49
- active: dataset.controls.scale.dotplot === scale,
50
- onClick: () => {
51
- dispatch({
52
- type: "set.controls.scale",
53
- plot: "dotplot",
54
- scale: scale
55
- });
56
- }
57
- }, scale.name));
58
- return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonToolbar, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(_Dropdown.default, null, /*#__PURE__*/_react.default.createElement(_Dropdown.default.Toggle, {
59
- id: "dropdownColorscale",
60
- variant: "light"
61
- }, dataset.controls.colorScale), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Menu, null, colorScaleList))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup.Text, null, "Standard scale"), /*#__PURE__*/_react.default.createElement(_Dropdown.default, null, /*#__PURE__*/_react.default.createElement(_Dropdown.default.Toggle, {
62
- id: "dropdownStandardScale",
63
- variant: "light"
64
- }, dataset.controls.scale.dotplot.name), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Menu, null, standardScaleList)))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ToggleButton, {
65
- id: "toggleMeanOnlyExpressed",
66
- type: "checkbox",
67
- variant: "outline-primary",
68
- checked: dataset.controls.meanOnlyExpressed,
69
- onChange: () => {
70
- dispatch({
71
- type: "set.controls.meanOnlyExpressed",
72
- meanOnlyExpressed: !dataset.controls.meanOnlyExpressed
73
- });
74
- }
75
- }, "Average only above cutoff")), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form, {
76
- onSubmit: e => {
77
- e.preventDefault();
78
- dispatch({
79
- type: "set.controls.expressionCutoff",
80
- expressionCutoff: parseFloat(controls.expressionCutoff)
81
- });
82
- }
83
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup.Text, null, "Expression Cutoff"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Control, {
84
- size: "sm",
85
- type: "number",
86
- step: "0.1",
87
- min: 0.0,
88
- value: controls.expressionCutoff,
89
- onChange: e => {
90
- setControls({
91
- ...controls,
92
- expressionCutoff: e.target.value
93
- });
94
- }
95
- }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
96
- type: "submit",
97
- variant: "outline-primary"
98
- }, "Apply"))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form, {
99
- onSubmit: e => {
100
- e.preventDefault();
101
- dispatch({
102
- type: "set.controls.colorAxis.crange",
103
- cmin: controls.colorAxis.cmin,
104
- cmax: controls.colorAxis.cmax
105
- });
106
- }
107
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup.Text, null, "Colorscale"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup.Text, null, "min"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Control, {
35
+ }, [settings.controls.colorAxis.cmin, settings.controls.colorAxis.cmax, settings.controls.expressionCutoff]);
36
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form, null, /*#__PURE__*/_react.default.createElement(_Controls.ColorscaleSelect, null), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Group, {
37
+ className: "mb-2"
38
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup.Text, null, "min"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Control, {
108
39
  name: "scaleMin",
109
40
  size: "sm",
110
41
  type: "number",
111
42
  value: controls.colorAxis.cmin,
112
43
  step: 0.1,
113
- min: Math.min(dataset.controls.colorAxis.dmin, 0.0),
114
- max: dataset.controls.colorAxis.dmax,
44
+ min: Math.min(settings.controls.colorAxis.dmin, 0.0),
45
+ max: settings.controls.colorAxis.dmax,
115
46
  onChange: e => {
116
- setControls({
117
- ...controls,
118
- colorAxis: {
119
- ...controls.colorAxis,
47
+ setControls(_objectSpread(_objectSpread({}, controls), {}, {
48
+ colorAxis: _objectSpread(_objectSpread({}, controls.colorAxis), {}, {
120
49
  cmin: e.target.value
121
- }
122
- });
50
+ })
51
+ }));
123
52
  }
124
53
  }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup.Text, null, "max"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Control, {
125
54
  name: "scaleMax",
@@ -128,30 +57,64 @@ function DotplotControls() {
128
57
  value: controls.colorAxis.cmax,
129
58
  step: 0.1,
130
59
  min: controls.colorAxis.cmin,
131
- max: dataset.controls.colorAxis.dmax,
60
+ max: settings.controls.colorAxis.dmax,
132
61
  onChange: e => {
133
- if (parseFloat(e.target.value) > dataset.controls.colorAxis.dmax) {
134
- e.target.value = dataset.controls.colorAxis.dmax.toFixed(1);
62
+ if (parseFloat(e.target.value) > settings.controls.colorAxis.dmax) {
63
+ e.target.value = settings.controls.colorAxis.dmax.toFixed(1);
135
64
  }
136
- setControls({
137
- ...controls,
138
- colorAxis: {
139
- ...controls.colorAxis,
65
+ setControls(_objectSpread(_objectSpread({}, controls), {}, {
66
+ colorAxis: _objectSpread(_objectSpread({}, controls.colorAxis), {}, {
140
67
  cmax: e.target.value
141
- }
142
- });
68
+ })
69
+ }));
143
70
  }
144
71
  }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
145
- type: "submit",
146
- variant: "outline-primary"
72
+ variant: "outline-primary",
73
+ onClick: () => dispatch({
74
+ type: "set.controls.colorAxis.crange",
75
+ cmin: controls.colorAxis.cmin,
76
+ cmax: controls.colorAxis.cmax
77
+ })
147
78
  }, "Apply"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
148
79
  variant: "outline-primary",
149
- onClick: () => {
80
+ onClick: () => dispatch({
81
+ type: "set.controls.colorAxis.crange",
82
+ cmin: settings.controls.colorAxis.dmin,
83
+ cmax: settings.controls.colorAxis.dmax
84
+ })
85
+ }, "Reset"))), /*#__PURE__*/_react.default.createElement(_Controls.ScaleSelect, {
86
+ plot: "dotplot"
87
+ }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Group, {
88
+ className: "mb-2"
89
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Label, null, "Expression Cutoff"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Control, {
90
+ size: "sm",
91
+ type: "number",
92
+ step: "0.1",
93
+ min: 0.0,
94
+ value: controls.expressionCutoff,
95
+ onChange: e => {
96
+ setControls(_objectSpread(_objectSpread({}, controls), {}, {
97
+ expressionCutoff: e.target.value
98
+ }));
99
+ }
100
+ }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
101
+ variant: "outline-primary",
102
+ onClick: () => dispatch({
103
+ type: "set.controls.expressionCutoff",
104
+ expressionCutoff: parseFloat(controls.expressionCutoff)
105
+ })
106
+ }, "Apply"))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Group, {
107
+ className: "mb-2"
108
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Check, {
109
+ type: "switch",
110
+ id: "meanOnlyExpressed",
111
+ label: "Average only above cutoff",
112
+ checked: settings.controls.meanOnlyExpressed,
113
+ onChange: () => {
150
114
  dispatch({
151
- type: "set.controls.colorAxis.crange",
152
- cmin: dataset.controls.colorAxis.dmin,
153
- cmax: dataset.controls.colorAxis.dmax
115
+ type: "set.controls.meanOnlyExpressed",
116
+ meanOnlyExpressed: !settings.controls.meanOnlyExpressed
154
117
  });
155
118
  }
156
- }, "Autoscale"))));
119
+ }))));
157
120
  }
@@ -20,15 +20,18 @@ var _ScatterplotControls = require("../scatterplot/ScatterplotControls");
20
20
  var _SearchBar = require("../search-bar/SearchBar");
21
21
  var _VarList = require("../var-list/VarList");
22
22
  var _Violin = require("../violin/Violin");
23
- 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); }
24
- 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; }
23
+ const _excluded = ["children", "varMode", "searchDiseases"];
24
+ 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); }
25
25
  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); }
26
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
27
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
26
28
  function FullPage(_ref) {
27
29
  let {
28
- children,
29
- varMode = _constants.SELECTION_MODES.SINGLE,
30
- ...props
31
- } = _ref;
30
+ children,
31
+ varMode = _constants.SELECTION_MODES.SINGLE,
32
+ searchDiseases = false
33
+ } = _ref,
34
+ props = _objectWithoutProperties(_ref, _excluded);
32
35
  const appRef = (0, _react.useRef)();
33
36
  const [appDimensions, setAppDimensions] = (0, _react.useState)({
34
37
  width: 0,
@@ -72,41 +75,21 @@ function FullPage(_ref) {
72
75
  style: {
73
76
  height: appDimensions.height
74
77
  }
75
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Navbar, {
76
- expand: "sm",
77
- bg: "primary",
78
- className: "cherita-navbar"
79
78
  }, /*#__PURE__*/_react.default.createElement("div", {
80
- className: "container-fluid"
81
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Navbar.Toggle, {
82
- "aria-controls": "navbarScroll"
83
- }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Navbar.Collapse, {
84
- id: "navbarScroll"
85
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav, {
86
- className: "me-auto my-0",
87
- navbarScroll: true
88
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Item, {
89
- className: "d-block d-lg-none"
90
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Link, {
91
- onClick: () => setShowObs(true)
92
- }, "Observations")), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Item, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Link, {
93
- onClick: () => setShowVars(true)
94
- }, "Features"))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav, {
95
- className: "d-flex"
96
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Item, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Link, {
97
- onClick: () => setShowControls(true)
98
- }, "Controls")))))), /*#__PURE__*/_react.default.createElement("div", {
99
79
  className: "cherita-app-obs modern-scrollbars border-end h-100"
100
80
  }, /*#__PURE__*/_react.default.createElement(_ObsList.ObsColsList, props)), /*#__PURE__*/_react.default.createElement("div", {
101
81
  className: "cherita-app-canvas flex-grow-1"
102
- }, children), /*#__PURE__*/_react.default.createElement("div", {
82
+ }, children({
83
+ setShowObs,
84
+ setShowVars
85
+ })), /*#__PURE__*/_react.default.createElement("div", {
103
86
  className: "cherita-app-sidebar p-3"
104
87
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card.Body, {
105
88
  className: "d-flex flex-column p-0"
106
89
  }, /*#__PURE__*/_react.default.createElement("div", {
107
90
  className: "sidebar-features modern-scrollbars"
108
91
  }, /*#__PURE__*/_react.default.createElement(_SearchBar.SearchBar, {
109
- searchDiseases: true,
92
+ searchDiseases: searchDiseases,
110
93
  searchVar: true
111
94
  }), /*#__PURE__*/_react.default.createElement(_VarList.VarNamesList, {
112
95
  mode: varMode
@@ -121,7 +104,8 @@ function FullPage(_ref) {
121
104
  handleClose: () => setShowObs(false)
122
105
  }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasVars, {
123
106
  show: showVars,
124
- handleClose: () => setShowVars(false)
107
+ handleClose: () => setShowVars(false),
108
+ mode: varMode
125
109
  }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
126
110
  show: showControls,
127
111
  handleClose: () => setShowControls(false),
@@ -132,7 +116,19 @@ function FullPage(_ref) {
132
116
  }))));
133
117
  }
134
118
  function FullPageScatterplot(props) {
135
- return /*#__PURE__*/_react.default.createElement(FullPage, props, /*#__PURE__*/_react.default.createElement(_Scatterplot.Scatterplot, null));
119
+ return /*#__PURE__*/_react.default.createElement(FullPage, _extends({}, props, {
120
+ varMode: _constants.SELECTION_MODES.SINGLE
121
+ }), _ref2 => {
122
+ let {
123
+ setShowObs,
124
+ setShowVars
125
+ } = _ref2;
126
+ return /*#__PURE__*/_react.default.createElement(_Scatterplot.Scatterplot, {
127
+ setShowObs: setShowObs,
128
+ setShowVars: setShowVars,
129
+ isFullscreen: true
130
+ });
131
+ });
136
132
  }
137
133
  function FullPagePlots(props) {
138
134
  return /*#__PURE__*/_react.default.createElement(FullPage, _extends({}, props, {