@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
@@ -1,27 +1,38 @@
1
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
1
6
  import React, { useCallback, useEffect, useRef, useState } from "react";
2
7
  import _ from "lodash";
3
8
  import { Alert } from "react-bootstrap";
4
9
  import Plot from "react-plotly.js";
5
10
  import { useDataset } from "../../context/DatasetContext";
6
11
  import { useFilteredData } from "../../context/FilterContext";
12
+ import { useSettings } from "../../context/SettingsContext";
7
13
  import { LoadingSpinner } from "../../utils/LoadingIndicators";
8
14
  import { useDebouncedFetch } from "../../utils/requests";
9
15
  export function Heatmap() {
16
+ var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
10
17
  const ENDPOINT = "heatmap";
11
18
  const dataset = useDataset();
19
+ const settings = useSettings();
12
20
  const {
13
21
  obsIndices,
14
22
  isSliced
15
23
  } = useFilteredData();
16
- const colorscale = useRef(dataset.controls.colorScale);
24
+ const colorscale = useRef(settings.controls.colorScale);
17
25
  const [data, setData] = useState([]);
18
26
  const [layout, setLayout] = useState({});
19
27
  const [hasSelections, setHasSelections] = useState(false);
20
28
  const [params, setParams] = useState({
21
29
  url: dataset.url,
22
- obsCol: dataset.selectedObs,
23
- obsValues: !dataset.selectedObs?.omit.length ? null : _.difference(_.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c]),
24
- varKeys: dataset.selectedMultiVar.map(i => i.isSet ? {
30
+ obsCol: settings.selectedObs,
31
+ obsValues: !((_settings$selectedObs = settings.selectedObs) !== null && _settings$selectedObs !== void 0 && _settings$selectedObs.omit.length) ? null : _.difference(_.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 => {
32
+ var _settings$selectedObs4;
33
+ return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
34
+ }),
35
+ varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
25
36
  name: i.name,
26
37
  indices: i.vars.map(v => v.index)
27
38
  } : i.index),
@@ -29,35 +40,36 @@ export function Heatmap() {
29
40
  varNamesCol: dataset.varNamesCol
30
41
  });
31
42
  useEffect(() => {
32
- if (dataset.selectedObs && dataset.selectedMultiVar.length) {
43
+ if (settings.selectedObs && settings.selectedMultiVar.length) {
33
44
  setHasSelections(true);
34
45
  } else {
35
46
  setHasSelections(false);
36
47
  }
37
48
  setParams(p => {
38
- return {
39
- ...p,
49
+ var _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
50
+ return _objectSpread(_objectSpread({}, p), {}, {
40
51
  url: dataset.url,
41
- obsCol: dataset.selectedObs,
42
- obsValues: !dataset.selectedObs?.omit.length ? null : _.difference(_.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c]),
43
- varKeys: dataset.selectedMultiVar.map(i => i.isSet ? {
52
+ obsCol: settings.selectedObs,
53
+ obsValues: !((_settings$selectedObs5 = settings.selectedObs) !== null && _settings$selectedObs5 !== void 0 && _settings$selectedObs5.omit.length) ? null : _.difference(_.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 => {
54
+ var _settings$selectedObs8;
55
+ return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
56
+ }),
57
+ varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
44
58
  name: i.name,
45
59
  indices: i.vars.map(v => v.index)
46
60
  } : i.index),
47
61
  obsIndices: isSliced ? [...(obsIndices || [])] : null,
48
62
  varNamesCol: dataset.varNamesCol
49
- };
63
+ });
50
64
  });
51
- }, [dataset.selectedMultiVar, dataset.selectedObs, dataset.url, dataset.varNamesCol, obsIndices, isSliced]);
65
+ }, [settings.selectedMultiVar, settings.selectedObs, dataset.url, dataset.varNamesCol, obsIndices, isSliced]);
52
66
  const updateColorscale = useCallback(colorscale => {
53
67
  setLayout(l => {
54
- return {
55
- ...l,
56
- coloraxis: {
57
- ...l.coloraxis,
68
+ return _objectSpread(_objectSpread({}, l), {}, {
69
+ coloraxis: _objectSpread(_objectSpread({}, l.coloraxis), {}, {
58
70
  colorscale: colorscale
59
- }
60
- };
71
+ })
72
+ });
61
73
  });
62
74
  }, []);
63
75
  const {
@@ -75,9 +87,9 @@ export function Heatmap() {
75
87
  }
76
88
  }, [fetchedData, hasSelections, isPending, serverError, updateColorscale]);
77
89
  useEffect(() => {
78
- colorscale.current = dataset.controls.colorScale;
90
+ colorscale.current = settings.controls.colorScale;
79
91
  updateColorscale(colorscale.current);
80
- }, [dataset.controls.colorScale, updateColorscale]);
92
+ }, [settings.controls.colorScale, updateColorscale]);
81
93
  if (!serverError) {
82
94
  if (hasSelections) {
83
95
  return /*#__PURE__*/React.createElement("div", {
@@ -1,23 +1,6 @@
1
1
  import React from "react";
2
- import _ from "lodash";
3
- import { Dropdown } from "react-bootstrap";
4
- import { COLORSCALES } from "../../constants/colorscales";
5
- import { useDataset, useDatasetDispatch } from "../../context/DatasetContext";
2
+ import { Form } from "react-bootstrap";
3
+ import { ColorscaleSelect } from "../controls/Controls";
6
4
  export function HeatmapControls() {
7
- const dataset = useDataset();
8
- const dispatch = useDatasetDispatch();
9
- const colormapList = _.keys(COLORSCALES).map(key => /*#__PURE__*/React.createElement(Dropdown.Item, {
10
- key: key,
11
- active: dataset.controls.colorScale === key,
12
- onClick: () => {
13
- dispatch({
14
- type: "set.controls.colorScale",
15
- colorScale: key
16
- });
17
- }
18
- }, key));
19
- return /*#__PURE__*/React.createElement(Dropdown, null, /*#__PURE__*/React.createElement(Dropdown.Toggle, {
20
- id: "dropdownColorscale",
21
- variant: "light"
22
- }, dataset.controls.colorScale), /*#__PURE__*/React.createElement(Dropdown.Menu, null, colormapList));
5
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Form, null, /*#__PURE__*/React.createElement(ColorscaleSelect, null)));
23
6
  }
@@ -1,65 +1,77 @@
1
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
1
6
  import React, { useCallback, useEffect, useRef, useState } from "react";
2
7
  import _ from "lodash";
3
8
  import { Alert } from "react-bootstrap";
4
9
  import Plot from "react-plotly.js";
5
10
  import { useDataset } from "../../context/DatasetContext";
6
11
  import { useFilteredData } from "../../context/FilterContext";
12
+ import { useSettings } from "../../context/SettingsContext";
7
13
  import { LoadingSpinner } from "../../utils/LoadingIndicators";
8
14
  import { useDebouncedFetch } from "../../utils/requests";
9
15
  export function Matrixplot() {
16
+ var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
10
17
  const ENDPOINT = "matrixplot";
11
18
  const dataset = useDataset();
19
+ const settings = useSettings();
12
20
  const {
13
21
  obsIndices,
14
22
  isSliced
15
23
  } = useFilteredData();
16
- const colorscale = useRef(dataset.controls.colorScale);
24
+ const colorscale = useRef(settings.controls.colorScale);
17
25
  const [data, setData] = useState([]);
18
26
  const [layout, setLayout] = useState({});
19
27
  const [hasSelections, setHasSelections] = useState(false);
20
28
  const [params, setParams] = useState({
21
29
  url: dataset.url,
22
- obsCol: dataset.selectedObs,
23
- obsValues: !dataset.selectedObs?.omit.length ? null : _.difference(_.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c]),
24
- varKeys: dataset.selectedMultiVar.map(i => i.isSet ? {
30
+ obsCol: settings.selectedObs,
31
+ obsValues: !((_settings$selectedObs = settings.selectedObs) !== null && _settings$selectedObs !== void 0 && _settings$selectedObs.omit.length) ? null : _.difference(_.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 => {
32
+ var _settings$selectedObs4;
33
+ return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
34
+ }),
35
+ varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
25
36
  name: i.name,
26
37
  indices: i.vars.map(v => v.index)
27
38
  } : i.index),
28
39
  obsIndices: isSliced ? [...(obsIndices || [])] : null,
29
- standardScale: dataset.controls.standardScale,
40
+ standardScale: settings.controls.scale.matrixplot,
30
41
  varNamesCol: dataset.varNamesCol
31
42
  });
32
43
  useEffect(() => {
33
- if (dataset.selectedObs && dataset.selectedMultiVar.length) {
44
+ if (settings.selectedObs && settings.selectedMultiVar.length) {
34
45
  setHasSelections(true);
35
46
  } else {
36
47
  setHasSelections(false);
37
48
  }
38
49
  setParams(p => {
39
- return {
40
- ...p,
50
+ var _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
51
+ return _objectSpread(_objectSpread({}, p), {}, {
41
52
  url: dataset.url,
42
- obsCol: dataset.selectedObs,
43
- obsValues: !dataset.selectedObs?.omit.length ? null : _.difference(_.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c]),
44
- varKeys: dataset.selectedMultiVar.map(i => i.isSet ? {
53
+ obsCol: settings.selectedObs,
54
+ obsValues: !((_settings$selectedObs5 = settings.selectedObs) !== null && _settings$selectedObs5 !== void 0 && _settings$selectedObs5.omit.length) ? null : _.difference(_.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 => {
55
+ var _settings$selectedObs8;
56
+ return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
57
+ }),
58
+ varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
45
59
  name: i.name,
46
60
  indices: i.vars.map(v => v.index)
47
61
  } : i.index),
48
62
  obsIndices: isSliced ? [...(obsIndices || [])] : null,
49
- standardScale: dataset.controls.standardScale,
63
+ standardScale: settings.controls.scale.matrixplot,
50
64
  varNamesCol: dataset.varNamesCol
51
- };
65
+ });
52
66
  });
53
- }, [dataset.controls.standardScale, dataset.selectedMultiVar, dataset.selectedObs, dataset.url, dataset.varNamesCol, obsIndices, isSliced]);
67
+ }, [settings.controls.scale.matrixplot, settings.selectedMultiVar, settings.selectedObs, dataset.url, dataset.varNamesCol, obsIndices, isSliced]);
54
68
  const updateColorscale = useCallback(colorscale => {
55
69
  setLayout(l => {
56
- return {
57
- ...l,
58
- coloraxis: {
59
- ...l.coloraxis,
70
+ return _objectSpread(_objectSpread({}, l), {}, {
71
+ coloraxis: _objectSpread(_objectSpread({}, l.coloraxis), {}, {
60
72
  colorscale: colorscale
61
- }
62
- };
73
+ })
74
+ });
63
75
  });
64
76
  }, []);
65
77
  const {
@@ -77,9 +89,9 @@ export function Matrixplot() {
77
89
  }
78
90
  }, [fetchedData, hasSelections, isPending, serverError, updateColorscale]);
79
91
  useEffect(() => {
80
- colorscale.current = dataset.controls.colorScale;
92
+ colorscale.current = settings.controls.colorScale;
81
93
  updateColorscale(colorscale.current);
82
- }, [dataset.controls.colorScale, updateColorscale]);
94
+ }, [settings.controls.colorScale, updateColorscale]);
83
95
  if (!serverError) {
84
96
  if (hasSelections) {
85
97
  return /*#__PURE__*/React.createElement("div", {
@@ -1,38 +1,8 @@
1
1
  import React from "react";
2
- import _ from "lodash";
3
- import { Dropdown, ButtonGroup, ButtonToolbar, InputGroup } from "react-bootstrap";
4
- import { COLORSCALES } from "../../constants/colorscales";
5
- import { MATRIXPLOT_SCALES } from "../../constants/constants";
6
- import { useDataset, useDatasetDispatch } from "../../context/DatasetContext";
2
+ import { Form } from "react-bootstrap";
3
+ import { ColorscaleSelect, ScaleSelect } from "../controls/Controls";
7
4
  export function MatrixplotControls() {
8
- const dataset = useDataset();
9
- const dispatch = useDatasetDispatch();
10
- const colorScaleList = _.keys(COLORSCALES).map(key => /*#__PURE__*/React.createElement(Dropdown.Item, {
11
- key: key,
12
- active: dataset.controls.colorScale === key,
13
- onClick: () => {
14
- dispatch({
15
- type: "set.controls.colorScale",
16
- colorScale: key
17
- });
18
- }
19
- }, key));
20
- const standardScaleList = _.values(MATRIXPLOT_SCALES).map(scale => /*#__PURE__*/React.createElement(Dropdown.Item, {
21
- key: scale.value,
22
- active: dataset.controls.scale.matrixplot.name === scale.name,
23
- onClick: () => {
24
- dispatch({
25
- type: "set.controls.scale",
26
- plot: "matrixplot",
27
- scale: scale
28
- });
29
- }
30
- }, scale.name));
31
- return /*#__PURE__*/React.createElement(ButtonToolbar, null, /*#__PURE__*/React.createElement(ButtonGroup, null, /*#__PURE__*/React.createElement(Dropdown, null, /*#__PURE__*/React.createElement(Dropdown.Toggle, {
32
- id: "dropdownColorscale",
33
- variant: "light"
34
- }, dataset.controls.colorScale), /*#__PURE__*/React.createElement(Dropdown.Menu, null, colorScaleList))), /*#__PURE__*/React.createElement(ButtonGroup, null, /*#__PURE__*/React.createElement(InputGroup, null, /*#__PURE__*/React.createElement(InputGroup.Text, null, "Standard scale"), /*#__PURE__*/React.createElement(Dropdown, null, /*#__PURE__*/React.createElement(Dropdown.Toggle, {
35
- id: "dropdownStandardScale",
36
- variant: "light"
37
- }, dataset.controls.scale.matrixplot.name), /*#__PURE__*/React.createElement(Dropdown.Menu, null, standardScaleList)))));
5
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Form, null, /*#__PURE__*/React.createElement(ColorscaleSelect, null), /*#__PURE__*/React.createElement(ScaleSelect, {
6
+ plot: "matrixplot"
7
+ })));
38
8
  }
@@ -1,3 +1,8 @@
1
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
1
6
  import React, { useCallback, useEffect, useMemo, useState } from "react";
2
7
  import { Tooltip } from "@mui/material";
3
8
  import { Gauge, SparkLineChart } from "@mui/x-charts";
@@ -7,6 +12,7 @@ import { ObsToolbar } from "./ObsToolbar";
7
12
  import { COLOR_ENCODINGS, OBS_TYPES } from "../../constants/constants";
8
13
  import { useDataset } from "../../context/DatasetContext";
9
14
  import { useFilteredData } from "../../context/FilterContext";
15
+ import { useSettings } from "../../context/SettingsContext";
10
16
  import { useColor } from "../../helpers/color-helper";
11
17
  import { Histogram } from "../../utils/Histogram";
12
18
  import { LoadingLinear } from "../../utils/LoadingIndicators";
@@ -14,30 +20,35 @@ import { useFetch } from "../../utils/requests";
14
20
  import { formatNumerical, FORMATS } from "../../utils/string";
15
21
  import { VirtualizedList } from "../../utils/VirtualizedList";
16
22
  import { useObsData } from "../../utils/zarrData";
17
- const N_BINS = 5;
18
- function binContinuous(data, nBins) {
19
- const binSize = (data.max - data.min) * (1 / nBins);
20
- const thresholds = _.range(nBins + 1).map(b => {
21
- return data.min + binSize * b;
22
- });
23
- const binEdges = _.range(thresholds.length - 1).map(i => [thresholds[i], thresholds[i + 1]]);
24
- const bins = {
25
- nBins: nBins,
26
- binSize: binSize,
27
- thresholds: thresholds,
28
- binEdges: binEdges
29
- };
30
- return {
31
- ...data,
32
- bins: bins
33
- };
34
- }
23
+
24
+ // const N_BINS = 5;
25
+
26
+ // function binContinuous(data, nBins) {
27
+ // const binSize = (data.max - data.min) * (1 / nBins);
28
+ // const thresholds = _.range(nBins + 1).map((b) => {
29
+ // return data.min + binSize * b;
30
+ // });
31
+ // const binEdges = _.range(thresholds.length - 1).map((i) => [
32
+ // thresholds[i],
33
+ // thresholds[i + 1],
34
+ // ]);
35
+ // const bins = {
36
+ // nBins: nBins,
37
+ // binSize: binSize,
38
+ // thresholds: thresholds,
39
+ // binEdges: binEdges,
40
+ // };
41
+ // return { ...data, bins: bins };
42
+ // }
43
+
35
44
  function getContinuousLabel(code, binEdges) {
36
- return `[ ${formatNumerical(binEdges[code][0])}, ${formatNumerical(binEdges[code][1], FORMATS.EXPONENTIAL)}${code === binEdges.length - 1 ? " ]" : " )"}`;
45
+ return "[ ".concat(formatNumerical(binEdges[code][0]), ", ").concat(formatNumerical(binEdges[code][1], FORMATS.EXPONENTIAL)).concat(code === binEdges.length - 1 ? " ]" : " )");
37
46
  }
38
47
  const useObsHistogram = obs => {
48
+ var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedVar9, _settings$selectedVar0, _settings$selectedVar1, _settings$selectedVar10;
39
49
  const ENDPOINT = "obs/histograms";
40
50
  const dataset = useDataset();
51
+ const settings = useSettings();
41
52
  const {
42
53
  obsIndices,
43
54
  isSliced
@@ -46,27 +57,27 @@ const useObsHistogram = obs => {
46
57
  url: dataset.url,
47
58
  obsCol: _.omit(obs, "omit"),
48
59
  // avoid re-rendering when toggling unselected obs
49
- varKey: dataset.selectedVar?.isSet ? {
50
- name: dataset.selectedVar?.name,
51
- indices: dataset.selectedVar?.vars.map(v => v.index)
52
- } : dataset.selectedVar?.index,
60
+ varKey: (_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet ? {
61
+ name: (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name,
62
+ indices: (_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars.map(v => v.index)
63
+ } : (_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.index,
53
64
  obsIndices: isSliced ? [...(obsIndices || [])] : null
54
65
  });
55
66
  useEffect(() => {
56
67
  setParams(p => {
57
- return {
58
- ...p,
68
+ var _settings$selectedVar5, _settings$selectedVar6, _settings$selectedVar7, _settings$selectedVar8;
69
+ return _objectSpread(_objectSpread({}, p), {}, {
59
70
  obsCol: _.omit(obs, "omit"),
60
- varKey: dataset.selectedVar?.isSet ? {
61
- name: dataset.selectedVar?.name,
62
- indices: dataset.selectedVar?.vars.map(v => v.index)
63
- } : dataset.selectedVar?.index,
71
+ varKey: (_settings$selectedVar5 = settings.selectedVar) !== null && _settings$selectedVar5 !== void 0 && _settings$selectedVar5.isSet ? {
72
+ name: (_settings$selectedVar6 = settings.selectedVar) === null || _settings$selectedVar6 === void 0 ? void 0 : _settings$selectedVar6.name,
73
+ indices: (_settings$selectedVar7 = settings.selectedVar) === null || _settings$selectedVar7 === void 0 ? void 0 : _settings$selectedVar7.vars.map(v => v.index)
74
+ } : (_settings$selectedVar8 = settings.selectedVar) === null || _settings$selectedVar8 === void 0 ? void 0 : _settings$selectedVar8.index,
64
75
  obsIndices: isSliced ? [...(obsIndices || [])] : null
65
- };
76
+ });
66
77
  });
67
- }, [dataset.selectedVar?.index, dataset.selectedVar?.isSet, dataset.selectedVar?.name, dataset.selectedVar?.vars, obsIndices, isSliced, obs]);
78
+ }, [(_settings$selectedVar9 = settings.selectedVar) === null || _settings$selectedVar9 === void 0 ? void 0 : _settings$selectedVar9.index, (_settings$selectedVar0 = settings.selectedVar) === null || _settings$selectedVar0 === void 0 ? void 0 : _settings$selectedVar0.isSet, (_settings$selectedVar1 = settings.selectedVar) === null || _settings$selectedVar1 === void 0 ? void 0 : _settings$selectedVar1.name, (_settings$selectedVar10 = settings.selectedVar) === null || _settings$selectedVar10 === void 0 ? void 0 : _settings$selectedVar10.vars, obsIndices, isSliced, obs]);
68
79
  return useFetch(ENDPOINT, params, {
69
- enabled: !!dataset.selectedVar && dataset.colorEncoding === COLOR_ENCODINGS.VAR,
80
+ enabled: !!settings.selectedVar && settings.colorEncoding === COLOR_ENCODINGS.VAR,
70
81
  refetchOnMount: false
71
82
  });
72
83
  };
@@ -78,6 +89,7 @@ const getBinIndex = (v, binEdges) => {
78
89
  return _.findIndex(modifiedBinEdges, range => _.inRange(v, ...range));
79
90
  };
80
91
  const useFilteredObsData = obs => {
92
+ var _obs$bins2;
81
93
  const {
82
94
  obsIndices
83
95
  } = useFilteredData();
@@ -93,19 +105,20 @@ const useFilteredObsData = obs => {
93
105
  valueCounts = _.countBy(filteredObsValues);
94
106
  } else {
95
107
  valueCounts = _.countBy(filteredObsValues, v => {
96
- return getBinIndex(v, obs.bins?.binEdges || [[null, null]]);
108
+ var _obs$bins;
109
+ return getBinIndex(v, ((_obs$bins = obs.bins) === null || _obs$bins === void 0 ? void 0 : _obs$bins.binEdges) || [[null, null]]);
97
110
  });
98
111
  }
99
112
  valueCounts = _.mapKeys(valueCounts, (_v, i) => {
100
113
  return obs.codesMap[i];
101
114
  });
102
- const totalCounts = obsIndices?.size;
115
+ const totalCounts = obsIndices === null || obsIndices === void 0 ? void 0 : obsIndices.size;
103
116
  const pct = _.mapValues(valueCounts, v => v / totalCounts * 100);
104
117
  return {
105
118
  valueCounts,
106
119
  pct
107
120
  };
108
- }, [isCategorical, obs.bins?.binEdges, obs.codesMap, obsData.data, obsIndices]);
121
+ }, [isCategorical, (_obs$bins2 = obs.bins) === null || _obs$bins2 === void 0 ? void 0 : _obs$bins2.binEdges, obs.codesMap, obsData.data, obsIndices]);
109
122
  return {
110
123
  value_counts: valueCounts,
111
124
  pct: pct
@@ -165,7 +178,7 @@ function CategoricalItem(_ref) {
165
178
  })), /*#__PURE__*/React.createElement("div", {
166
179
  className: "pl-1 m-0"
167
180
  }, /*#__PURE__*/React.createElement(Tooltip, {
168
- title: isSliced ? /*#__PURE__*/React.createElement(React.Fragment, null, "Filtered:", " ", formatNumerical(filteredStats.pct, FORMATS.EXPONENTIAL), "%", /*#__PURE__*/React.createElement("br", null), "Total: ", formatNumerical(stats.pct, FORMATS.EXPONENTIAL), "%") : `${formatNumerical(stats.pct, FORMATS.EXPONENTIAL)}%`,
181
+ title: isSliced ? /*#__PURE__*/React.createElement(React.Fragment, null, "Filtered:", " ", formatNumerical(filteredStats.pct, FORMATS.EXPONENTIAL), "%", /*#__PURE__*/React.createElement("br", null), "Total: ", formatNumerical(stats.pct, FORMATS.EXPONENTIAL), "%") : "".concat(formatNumerical(stats.pct, FORMATS.EXPONENTIAL), "%"),
169
182
  placement: "left",
170
183
  arrow: true
171
184
  }, /*#__PURE__*/React.createElement("div", {
@@ -220,7 +233,7 @@ function CategoricalItem(_ref) {
220
233
  y: "0",
221
234
  width: "10",
222
235
  height: "10",
223
- fill: `rgb(${getColor({
236
+ fill: "rgb(".concat(getColor({
224
237
  value: (code - min) / (max - min),
225
238
  categorical: true,
226
239
  grayOut: isOmitted,
@@ -228,7 +241,7 @@ function CategoricalItem(_ref) {
228
241
  alpha: 1
229
242
  },
230
243
  colorEncoding: "obs"
231
- })})`
244
+ }), ")")
232
245
  }))) : null))));
233
246
  }
234
247
  export function CategoricalObs(_ref2) {
@@ -238,7 +251,7 @@ export function CategoricalObs(_ref2) {
238
251
  toggleObs,
239
252
  showColor = true
240
253
  } = _ref2;
241
- const dataset = useDataset();
254
+ const settings = useSettings();
242
255
  const {
243
256
  isSliced
244
257
  } = useFilteredData();
@@ -248,6 +261,7 @@ export function CategoricalObs(_ref2) {
248
261
  const obsHistograms = useObsHistogram(obs);
249
262
  const filteredObsData = useFilteredObsData(obs);
250
263
  const getDataAtIndex = useCallback(index => {
264
+ var _obsHistograms$fetche;
251
265
  return {
252
266
  value: obs.values[index],
253
267
  code: obs.codes[obs.values[index]],
@@ -257,8 +271,8 @@ export function CategoricalObs(_ref2) {
257
271
  },
258
272
  isOmitted: _.includes(obs.omit, obs.codes[obs.values[index]]),
259
273
  label: obs.values[index],
260
- histogramData: dataset.colorEncoding === COLOR_ENCODINGS.VAR ? {
261
- data: obsHistograms.fetchedData?.[obs.values[index]],
274
+ histogramData: settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
275
+ data: (_obsHistograms$fetche = obsHistograms.fetchedData) === null || _obsHistograms$fetche === void 0 ? void 0 : _obsHistograms$fetche[obs.values[index]],
262
276
  isPending: obsHistograms.isPending,
263
277
  altColor: isSliced
264
278
  } : {
@@ -266,13 +280,13 @@ export function CategoricalObs(_ref2) {
266
280
  isPending: false
267
281
  },
268
282
  filteredStats: {
269
- value_counts: filteredObsData?.value_counts[obs.values[index]] || 0,
270
- pct: filteredObsData?.pct[obs.values[index]] || 0
283
+ value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
284
+ pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
271
285
  },
272
286
  isSliced: isSliced
273
287
  };
274
- }, [dataset.colorEncoding, filteredObsData?.pct, filteredObsData?.value_counts, isSliced, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, totalCounts]);
275
- showColor &= dataset.colorEncoding === COLOR_ENCODINGS.OBS;
288
+ }, [settings.colorEncoding, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, isSliced, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, totalCounts]);
289
+ showColor &= settings.colorEncoding === COLOR_ENCODINGS.OBS;
276
290
  return /*#__PURE__*/React.createElement(ListGroup, {
277
291
  variant: "flush",
278
292
  className: "cherita-list"
@@ -334,9 +348,9 @@ function ObsContinuousStats(_ref3) {
334
348
  },
335
349
  xAxis: {
336
350
  data: fetchedData.kde_values[0],
337
- valueFormatter: v => `${formatNumerical(v, FORMATS.EXPONENTIAL)}`
351
+ valueFormatter: v => "".concat(formatNumerical(v, FORMATS.EXPONENTIAL))
338
352
  },
339
- valueFormatter: v => `${formatNumerical(v, FORMATS.EXPONENTIAL)}`,
353
+ valueFormatter: v => "".concat(formatNumerical(v, FORMATS.EXPONENTIAL)),
340
354
  slotProps: {
341
355
  popper: {
342
356
  className: "feature-histogram-tooltip"
@@ -381,8 +395,8 @@ export function ContinuousObs(_ref4) {
381
395
  isOmitted: _.includes(obs.omit, obs.codes[obs.values[index]]),
382
396
  label: isNaN(obs.values[index]) ? "NaN" : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges),
383
397
  filteredStats: {
384
- value_counts: filteredObsData?.value_counts[obs.values[index]] || 0,
385
- pct: filteredObsData?.pct[obs.values[index]] || 0
398
+ value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
399
+ pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
386
400
  },
387
401
  isSliced: isSliced
388
402
  };