@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,17 +1,21 @@
1
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
2
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
3
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
1
6
  import React, { useEffect, useState } from "react";
2
- import { faChevronDown } from "@fortawesome/free-solid-svg-icons";
3
- import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
4
7
  import _ from "lodash";
5
8
  import { ButtonGroup, Dropdown, Form } from "react-bootstrap";
6
9
  import { PSEUDOSPATIAL_CATEGORICAL_MODES as MODES, PSEUDOSPATIAL_PLOT_TYPES as PLOT_TYPES } from "../../constants/constants";
7
- import { useDataset, useDatasetDispatch } from "../../context/DatasetContext";
10
+ import { useDataset } from "../../context/DatasetContext";
11
+ import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
8
12
  import { useFetch } from "../../utils/requests";
9
13
  function CategoricalMode() {
10
- const dataset = useDataset();
11
- const dispatch = useDatasetDispatch();
14
+ const settings = useSettings();
15
+ const dispatch = useSettingsDispatch();
12
16
  const modeList = _.map(MODES, (m, key) => /*#__PURE__*/React.createElement(Dropdown.Item, {
13
17
  key: key,
14
- active: dataset.pseudospatial.categoricalMode === m,
18
+ active: settings.pseudospatial.categoricalMode === m,
15
19
  onClick: () => {
16
20
  dispatch({
17
21
  type: "set.pseudospatial.categoricalMode",
@@ -20,26 +24,27 @@ function CategoricalMode() {
20
24
  }
21
25
  }, _.capitalize(m.name)));
22
26
  const mode = _.find(MODES, {
23
- value: dataset.pseudospatial.categoricalMode
27
+ value: settings.pseudospatial.categoricalMode
24
28
  });
25
29
  return /*#__PURE__*/React.createElement(Dropdown, null, /*#__PURE__*/React.createElement(Dropdown.Toggle, {
26
30
  variant: "light"
27
31
  }, _.capitalize(mode.name)), /*#__PURE__*/React.createElement(Dropdown.Menu, null, modeList));
28
32
  }
29
33
  function MaskSet() {
34
+ var _settings$pseudospati5, _settings$pseudospati6, _maskSets$settings$ps2, _settings$pseudospati7, _settings$pseudospati8, _maskSets$settings$ps3, _settings$pseudospati9;
30
35
  const ENDPOINT = "masks";
31
36
  const dataset = useDataset();
32
- const dispatch = useDatasetDispatch();
37
+ const settings = useSettings();
38
+ const dispatch = useSettingsDispatch();
33
39
  const [maskSets, setMaskSets] = useState(null);
34
40
  const [params, setParams] = useState({
35
41
  url: dataset.url
36
42
  });
37
43
  useEffect(() => {
38
44
  setParams(p => {
39
- return {
40
- ...p,
45
+ return _objectSpread(_objectSpread({}, p), {}, {
41
46
  url: dataset.url
42
- };
47
+ });
43
48
  });
44
49
  }, [dataset.url]);
45
50
  const {
@@ -56,7 +61,7 @@ function MaskSet() {
56
61
  }, [fetchedData, isPending, serverError]);
57
62
  const maskSetList = _.map(maskSets, (ms, key) => /*#__PURE__*/React.createElement(Dropdown.Item, {
58
63
  key: key,
59
- active: dataset.pseudospatial.maskSet === key,
64
+ active: settings.pseudospatial.maskSet === key,
60
65
  onClick: () => {
61
66
  dispatch({
62
67
  type: "set.pseudospatial.maskSet",
@@ -65,9 +70,10 @@ function MaskSet() {
65
70
  }
66
71
  }, _.capitalize(key)));
67
72
  const handleMaskChange = mask => {
68
- let newMasks = dataset.pseudospatial.maskValues || maskSets?.[dataset.pseudospatial?.maskSet];
73
+ var _settings$pseudospati, _settings$pseudospati2;
74
+ let newMasks = settings.pseudospatial.maskValues || (maskSets === null || maskSets === void 0 ? void 0 : maskSets[(_settings$pseudospati = settings.pseudospatial) === null || _settings$pseudospati === void 0 ? void 0 : _settings$pseudospati.maskSet]);
69
75
  newMasks = newMasks.includes(mask) ? newMasks.filter(m => m !== mask) : [...newMasks, mask];
70
- if (!_.difference(maskSets?.[dataset.pseudospatial?.maskSet], newMasks).length) {
76
+ if (!_.difference(maskSets === null || maskSets === void 0 ? void 0 : maskSets[(_settings$pseudospati2 = settings.pseudospatial) === null || _settings$pseudospati2 === void 0 ? void 0 : _settings$pseudospati2.maskSet], newMasks).length) {
71
77
  newMasks = null;
72
78
  }
73
79
  dispatch({
@@ -76,7 +82,8 @@ function MaskSet() {
76
82
  });
77
83
  };
78
84
  const toggleMasks = () => {
79
- if (!dataset.pseudospatial.maskValues || dataset.pseudospatial.maskValues?.length === maskSets?.[dataset.pseudospatial?.maskSet]?.length) {
85
+ var _settings$pseudospati3, _maskSets$settings$ps, _settings$pseudospati4;
86
+ if (!settings.pseudospatial.maskValues || ((_settings$pseudospati3 = settings.pseudospatial.maskValues) === null || _settings$pseudospati3 === void 0 ? void 0 : _settings$pseudospati3.length) === (maskSets === null || maskSets === void 0 || (_maskSets$settings$ps = maskSets[(_settings$pseudospati4 = settings.pseudospatial) === null || _settings$pseudospati4 === void 0 ? void 0 : _settings$pseudospati4.maskSet]) === null || _maskSets$settings$ps === void 0 ? void 0 : _maskSets$settings$ps.length)) {
80
87
  dispatch({
81
88
  type: "set.pseudospatial.maskValues",
82
89
  maskValues: []
@@ -88,19 +95,19 @@ function MaskSet() {
88
95
  });
89
96
  }
90
97
  };
91
- const masksList = _.map(maskSets?.[dataset.pseudospatial?.maskSet], mask => /*#__PURE__*/React.createElement(Dropdown.ItemText, {
98
+ const masksList = _.map(maskSets === null || maskSets === void 0 ? void 0 : maskSets[(_settings$pseudospati5 = settings.pseudospatial) === null || _settings$pseudospati5 === void 0 ? void 0 : _settings$pseudospati5.maskSet], mask => /*#__PURE__*/React.createElement(Dropdown.ItemText, {
92
99
  key: mask
93
100
  }, /*#__PURE__*/React.createElement(Form.Check, {
94
101
  type: "checkbox",
95
102
  label: mask,
96
- checked: !dataset.pseudospatial.maskValues || dataset.pseudospatial.maskValues.includes(mask),
103
+ checked: !settings.pseudospatial.maskValues || settings.pseudospatial.maskValues.includes(mask),
97
104
  onChange: () => handleMaskChange(mask)
98
105
  })));
99
- const nMasks = dataset.pseudospatial.maskValues ? dataset.pseudospatial.maskValues?.length : maskSets?.[dataset.pseudospatial?.maskSet]?.length || "No";
100
- const toggleAllChecked = !dataset.pseudospatial.maskValues || dataset.pseudospatial.maskValues?.length === maskSets?.[dataset.pseudospatial?.maskSet]?.length;
106
+ const nMasks = settings.pseudospatial.maskValues ? (_settings$pseudospati6 = settings.pseudospatial.maskValues) === null || _settings$pseudospati6 === void 0 ? void 0 : _settings$pseudospati6.length : (maskSets === null || maskSets === void 0 || (_maskSets$settings$ps2 = maskSets[(_settings$pseudospati7 = settings.pseudospatial) === null || _settings$pseudospati7 === void 0 ? void 0 : _settings$pseudospati7.maskSet]) === null || _maskSets$settings$ps2 === void 0 ? void 0 : _maskSets$settings$ps2.length) || "No";
107
+ const toggleAllChecked = !settings.pseudospatial.maskValues || ((_settings$pseudospati8 = settings.pseudospatial.maskValues) === null || _settings$pseudospati8 === void 0 ? void 0 : _settings$pseudospati8.length) === (maskSets === null || maskSets === void 0 || (_maskSets$settings$ps3 = maskSets[(_settings$pseudospati9 = settings.pseudospatial) === null || _settings$pseudospati9 === void 0 ? void 0 : _settings$pseudospati9.maskSet]) === null || _maskSets$settings$ps3 === void 0 ? void 0 : _maskSets$settings$ps3.length);
101
108
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Dropdown, null, /*#__PURE__*/React.createElement(Dropdown.Toggle, {
102
109
  variant: "light"
103
- }, _.capitalize(dataset.pseudospatial.maskSet || "Select a mask set")), /*#__PURE__*/React.createElement(Dropdown.Menu, null, /*#__PURE__*/React.createElement(Dropdown.Header, null, "Mask set"), maskSetList)), /*#__PURE__*/React.createElement(Dropdown, null, /*#__PURE__*/React.createElement(Dropdown.Toggle, {
110
+ }, _.capitalize(settings.pseudospatial.maskSet || "Select a mask set")), /*#__PURE__*/React.createElement(Dropdown.Menu, null, /*#__PURE__*/React.createElement(Dropdown.Header, null, "Mask set"), maskSetList)), /*#__PURE__*/React.createElement(Dropdown, null, /*#__PURE__*/React.createElement(Dropdown.Toggle, {
104
111
  variant: "light"
105
112
  }, nMasks, " masks selected"), /*#__PURE__*/React.createElement(Dropdown.Menu, null, /*#__PURE__*/React.createElement(Dropdown.Header, null, "Masks"), /*#__PURE__*/React.createElement(Dropdown.ItemText, {
106
113
  key: "toggle-all"
@@ -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, useDeferredValue, useEffect, useMemo, useRef, useState } from "react";
2
7
  import { ScatterplotLayer } from "@deck.gl/layers";
3
8
  import { DeckGL } from "@deck.gl/react";
@@ -7,9 +12,11 @@ import { ViewMode } from "@nebula.gl/edit-modes";
7
12
  import { EditableGeoJsonLayer } from "@nebula.gl/layers";
8
13
  import _ from "lodash";
9
14
  import { Alert } from "react-bootstrap";
15
+ import { SpatialControls } from "./SpatialControls";
16
+ import { Toolbox } from "./Toolbox";
10
17
  import { COLOR_ENCODINGS, OBS_TYPES, SELECTED_POLYGON_FILLCOLOR, UNSELECTED_POLYGON_FILLCOLOR } from "../../constants/constants";
11
- import { useDataset, useDatasetDispatch } from "../../context/DatasetContext";
12
18
  import { useFilteredData } from "../../context/FilterContext";
19
+ import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
13
20
  import { useZarrData } from "../../context/ZarrDataContext";
14
21
  import { rgbToHex, useColor } from "../../helpers/color-helper";
15
22
  import { MapHelper } from "../../helpers/map-helper";
@@ -17,8 +24,6 @@ import { Legend } from "../../utils/Legend";
17
24
  import { LoadingLinear, LoadingSpinner } from "../../utils/LoadingIndicators";
18
25
  import { formatNumerical } from "../../utils/string";
19
26
  import { useLabelObsData } from "../../utils/zarrData";
20
- import { SpatialControls } from "./SpatialControls";
21
- import { Toolbox } from "./Toolbox";
22
27
  window.deck.log.level = 1;
23
28
  const INITIAL_VIEW_STATE = {
24
29
  longitude: 0,
@@ -29,17 +34,21 @@ const INITIAL_VIEW_STATE = {
29
34
  bearing: 0
30
35
  };
31
36
  export function Scatterplot(_ref) {
37
+ var _settings$selectedObs3, _features$features2, _obsmData$serverError, _xData$serverError, _obsData$serverError, _labelObsData$serverE, _settings$selectedVar, _settings$selectedObs4, _obsmData$data;
32
38
  let {
33
- radius = 30
39
+ radius = 30,
40
+ setShowObs,
41
+ setShowVars,
42
+ isFullscreen = false
34
43
  } = _ref;
35
- const dataset = useDataset();
44
+ const settings = useSettings();
36
45
  const {
37
46
  obsIndices,
38
47
  valueMin,
39
48
  valueMax,
40
49
  slicedLength
41
50
  } = useFilteredData();
42
- const dispatch = useDatasetDispatch();
51
+ const dispatch = useSettingsDispatch();
43
52
  const {
44
53
  getColor
45
54
  } = useColor();
@@ -57,7 +66,7 @@ export function Scatterplot(_ref) {
57
66
  const [mode, setMode] = useState(() => ViewMode);
58
67
  const [features, setFeatures] = useState({
59
68
  type: "FeatureCollection",
60
- features: dataset.polygons[dataset.selectedObsm] || []
69
+ features: settings.polygons[settings.selectedObsm] || []
61
70
  });
62
71
  const [selectedFeatureIndexes, setSelectedFeatureIndexes] = useState([]);
63
72
  const {
@@ -70,12 +79,12 @@ export function Scatterplot(_ref) {
70
79
 
71
80
  useEffect(() => {
72
81
  if (!obsmData.isPending && !obsmData.serverError) {
82
+ var _deckRef$current, _deckRef$current2;
73
83
  setIsRendering(true);
74
84
  setData(d => {
75
- return {
76
- ...d,
85
+ return _objectSpread(_objectSpread({}, d), {}, {
77
86
  positions: obsmData.data
78
- };
87
+ });
79
88
  });
80
89
  const mapHelper = new MapHelper();
81
90
  const {
@@ -83,35 +92,34 @@ export function Scatterplot(_ref) {
83
92
  longitude,
84
93
  zoom
85
94
  } = mapHelper.fitBounds(obsmData.data, {
86
- width: deckRef?.current?.deck?.width,
87
- height: deckRef?.current?.deck?.height
95
+ width: deckRef === null || deckRef === void 0 || (_deckRef$current = deckRef.current) === null || _deckRef$current === void 0 || (_deckRef$current = _deckRef$current.deck) === null || _deckRef$current === void 0 ? void 0 : _deckRef$current.width,
96
+ height: deckRef === null || deckRef === void 0 || (_deckRef$current2 = deckRef.current) === null || _deckRef$current2 === void 0 || (_deckRef$current2 = _deckRef$current2.deck) === null || _deckRef$current2 === void 0 ? void 0 : _deckRef$current2.height
88
97
  });
89
98
  setViewState(v => {
90
- return {
91
- ...v,
99
+ return _objectSpread(_objectSpread({}, v), {}, {
92
100
  longitude: longitude,
93
101
  latitude: latitude,
94
102
  zoom: zoom
95
- };
103
+ });
96
104
  });
97
105
  } else if (!obsmData.isPending && obsmData.serverError) {
98
106
  setIsRendering(true);
99
107
  setData(d => {
100
- return {
101
- ...d,
108
+ return _objectSpread(_objectSpread({}, d), {}, {
102
109
  positions: []
103
- };
110
+ });
104
111
  });
105
112
  }
106
- }, [dataset.selectedObsm, obsmData.data, obsmData.isPending, obsmData.serverError]);
113
+ }, [settings.selectedObsm, obsmData.data, obsmData.isPending, obsmData.serverError]);
107
114
  const getBounds = useCallback(() => {
115
+ var _deckRef$current3, _deckRef$current4;
108
116
  const {
109
117
  latitude,
110
118
  longitude,
111
119
  zoom
112
120
  } = new MapHelper().fitBounds(data.positions, {
113
- width: deckRef?.current?.deck?.width,
114
- height: deckRef?.current?.deck?.height
121
+ width: deckRef === null || deckRef === void 0 || (_deckRef$current3 = deckRef.current) === null || _deckRef$current3 === void 0 || (_deckRef$current3 = _deckRef$current3.deck) === null || _deckRef$current3 === void 0 ? void 0 : _deckRef$current3.width,
122
+ height: deckRef === null || deckRef === void 0 || (_deckRef$current4 = deckRef.current) === null || _deckRef$current4 === void 0 || (_deckRef$current4 = _deckRef$current4.deck) === null || _deckRef$current4 === void 0 ? void 0 : _deckRef$current4.height
115
123
  });
116
124
  return {
117
125
  latitude,
@@ -120,69 +128,64 @@ export function Scatterplot(_ref) {
120
128
  };
121
129
  }, [data.positions]);
122
130
  useEffect(() => {
123
- if (dataset.colorEncoding === COLOR_ENCODINGS.VAR) {
131
+ if (settings.colorEncoding === COLOR_ENCODINGS.VAR) {
124
132
  setIsRendering(true);
125
133
  if (!xData.isPending && !xData.serverError) {
126
134
  // @TODO: add condition to check obs slicing
127
135
  setData(d => {
128
- return {
129
- ...d,
136
+ return _objectSpread(_objectSpread({}, d), {}, {
130
137
  values: xData.data
131
- };
138
+ });
132
139
  });
133
140
  } else if (!xData.isPending && xData.serverError) {
134
141
  setData(d => {
135
- return {
136
- ...d,
142
+ return _objectSpread(_objectSpread({}, d), {}, {
137
143
  values: []
138
- };
144
+ });
139
145
  });
140
146
  }
141
147
  }
142
- }, [dataset.colorEncoding, xData.data, xData.isPending, xData.serverError, getColor]);
148
+ }, [settings.colorEncoding, xData.data, xData.isPending, xData.serverError, getColor]);
143
149
  useEffect(() => {
144
- if (dataset.colorEncoding === COLOR_ENCODINGS.OBS) {
150
+ if (settings.colorEncoding === COLOR_ENCODINGS.OBS) {
145
151
  setIsRendering(true);
146
152
  if (!obsData.isPending && !obsData.serverError) {
147
153
  setData(d => {
148
- return {
149
- ...d,
154
+ return _objectSpread(_objectSpread({}, d), {}, {
150
155
  values: obsData.data
151
- };
156
+ });
152
157
  });
153
158
  } else if (!obsData.isPending && obsData.serverError) {
154
159
  setData(d => {
155
- return {
156
- ...d,
160
+ return _objectSpread(_objectSpread({}, d), {}, {
157
161
  values: []
158
- };
162
+ });
159
163
  });
160
164
  }
161
- } else if (dataset.colorEncoding === COLOR_ENCODINGS.VAR && dataset.sliceBy.obs) {
165
+ } else if (settings.colorEncoding === COLOR_ENCODINGS.VAR && settings.sliceBy.obs) {
162
166
  if (!obsData.isPending && !obsData.serverError) {
163
167
  setData(d => {
164
- return {
165
- ...d,
168
+ return _objectSpread(_objectSpread({}, d), {}, {
166
169
  sliceValues: obsData.data
167
- };
170
+ });
168
171
  });
169
172
  } else if (!obsData.isPending && obsData.serverError) {
170
173
  setData(d => {
171
- return {
172
- ...d,
174
+ return _objectSpread(_objectSpread({}, d), {}, {
173
175
  sliceValues: []
174
- };
176
+ });
175
177
  });
176
178
  }
177
179
  }
178
- }, [dataset.colorEncoding, obsData.data, obsData.isPending, obsData.serverError, dataset.sliceBy.obs]);
180
+ }, [settings.colorEncoding, obsData.data, obsData.isPending, obsData.serverError, settings.sliceBy.obs]);
179
181
  const isCategorical = useMemo(() => {
180
- if (dataset.colorEncoding === COLOR_ENCODINGS.OBS) {
181
- return dataset.selectedObs?.type === OBS_TYPES.CATEGORICAL || dataset.selectedObs?.type === OBS_TYPES.BOOLEAN;
182
+ if (settings.colorEncoding === COLOR_ENCODINGS.OBS) {
183
+ var _settings$selectedObs, _settings$selectedObs2;
184
+ return ((_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.type) === OBS_TYPES.CATEGORICAL || ((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.type) === OBS_TYPES.BOOLEAN;
182
185
  } else {
183
186
  return false;
184
187
  }
185
- }, [dataset.colorEncoding, dataset.selectedObs?.type]);
188
+ }, [settings.colorEncoding, (_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.type]);
186
189
  useEffect(() => {
187
190
  dispatch({
188
191
  type: "set.controls.valueRange",
@@ -193,8 +196,8 @@ export function Scatterplot(_ref) {
193
196
  min,
194
197
  max
195
198
  } = {
196
- min: dataset.controls.range[0] * (valueMax - valueMin) + valueMin,
197
- max: dataset.controls.range[1] * (valueMax - valueMin) + valueMin
199
+ min: settings.controls.range[0] * (valueMax - valueMin) + valueMin,
200
+ max: settings.controls.range[1] * (valueMax - valueMin) + valueMin
198
201
  };
199
202
  const getFillColor = useCallback((_d, _ref2) => {
200
203
  let {
@@ -268,19 +271,20 @@ export function Scatterplot(_ref) {
268
271
  const layers = useDeferredValue(mode === ViewMode ? memoizedLayers.reverse() : memoizedLayers); // draw scatterplot on top of polygons when in ViewMode
269
272
 
270
273
  useEffect(() => {
271
- if (!features?.features?.length) {
274
+ var _features$features;
275
+ if (!(features !== null && features !== void 0 && (_features$features = features.features) !== null && _features$features !== void 0 && _features$features.length)) {
272
276
  dispatch({
273
277
  type: "disable.slice.polygons"
274
278
  });
275
279
  }
276
- }, [dispatch, features?.features?.length]);
280
+ }, [dispatch, features === null || features === void 0 || (_features$features2 = features.features) === null || _features$features2 === void 0 ? void 0 : _features$features2.length]);
277
281
  useEffect(() => {
278
282
  dispatch({
279
283
  type: "set.polygons",
280
- obsm: dataset.selectedObsm,
281
- polygons: features?.features || []
284
+ obsm: settings.selectedObsm,
285
+ polygons: (features === null || features === void 0 ? void 0 : features.features) || []
282
286
  });
283
- }, [dataset.selectedObsm, dispatch, features.features]);
287
+ }, [settings.selectedObsm, dispatch, features.features]);
284
288
  function onLayerClick(info) {
285
289
  if (mode !== ViewMode) {
286
290
  // don't change selection while editing
@@ -291,9 +295,9 @@ export function Scatterplot(_ref) {
291
295
  const getLabel = function (o, v) {
292
296
  let isVar = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
293
297
  if (isVar || o.type === OBS_TYPES.CONTINUOUS) {
294
- return `${o.name}: ${formatNumerical(parseFloat(v))}`;
298
+ return "".concat(o.name, ": ").concat(formatNumerical(parseFloat(v)));
295
299
  } else {
296
- return `${o.name}: ${o.codesMap[v]}`;
300
+ return "".concat(o.name, ": ").concat(o.codesMap[v]);
297
301
  }
298
302
  };
299
303
  const getTooltip = _ref5 => {
@@ -301,19 +305,21 @@ export function Scatterplot(_ref) {
301
305
  object,
302
306
  index
303
307
  } = _ref5;
304
- if (!object || object?.type === "Feature") return;
308
+ if (!object || (object === null || object === void 0 ? void 0 : object.type) === "Feature") return;
305
309
  const text = [];
306
- if (dataset.colorEncoding === COLOR_ENCODINGS.OBS && dataset.selectedObs && !_.some(dataset.labelObs, {
307
- name: dataset.selectedObs.name
310
+ if (settings.colorEncoding === COLOR_ENCODINGS.OBS && settings.selectedObs && !_.some(settings.labelObs, {
311
+ name: settings.selectedObs.name
308
312
  })) {
309
- text.push(getLabel(dataset.selectedObs, obsData.data?.[index]));
313
+ var _obsData$data;
314
+ text.push(getLabel(settings.selectedObs, (_obsData$data = obsData.data) === null || _obsData$data === void 0 ? void 0 : _obsData$data[index]));
310
315
  }
311
- if (dataset.colorEncoding === COLOR_ENCODINGS.VAR && dataset.selectedVar) {
312
- text.push(getLabel(dataset.selectedVar, xData.data?.[index], true));
316
+ if (settings.colorEncoding === COLOR_ENCODINGS.VAR && settings.selectedVar) {
317
+ var _xData$data;
318
+ text.push(getLabel(settings.selectedVar, (_xData$data = xData.data) === null || _xData$data === void 0 ? void 0 : _xData$data[index], true));
313
319
  }
314
- if (dataset.labelObs.length) {
320
+ if (settings.labelObs.length) {
315
321
  text.push(..._.map(labelObsData.data, (v, k) => {
316
- const labelObs = _.find(dataset.labelObs, o => o.name === k);
322
+ const labelObs = _.find(settings.labelObs, o => o.name === k);
317
323
  return getLabel(labelObs, v[index]);
318
324
  }));
319
325
  }
@@ -323,16 +329,16 @@ export function Scatterplot(_ref) {
323
329
  text: text.length ? _.compact(text).join("\n") : null,
324
330
  className: grayOut ? "tooltip-grayout" : "deck-tooltip",
325
331
  style: !grayOut ? {
326
- "border-left": `3px solid ${rgbToHex(getFillColor(null, {
332
+ "border-left": "3px solid ".concat(rgbToHex(getFillColor(null, {
327
333
  index
328
- }))}`
334
+ })))
329
335
  } : {
330
336
  "border-left": "none"
331
337
  }
332
338
  };
333
339
  };
334
340
  const isPending = (isRendering || xData.isPending || obsmData.isPending) && !obsmData.isPending;
335
- const error = dataset.selectedObsm && obsmData.serverError?.length || dataset.colorEncoding === COLOR_ENCODINGS.VAR && xData.serverError?.length || dataset.colorEncoding === COLOR_ENCODINGS.OBS && obsData.serverError?.length || dataset.labelObs.lengh && labelObsData.serverError?.length;
341
+ const error = settings.selectedObsm && ((_obsmData$serverError = obsmData.serverError) === null || _obsmData$serverError === void 0 ? void 0 : _obsmData$serverError.length) || settings.colorEncoding === COLOR_ENCODINGS.VAR && ((_xData$serverError = xData.serverError) === null || _xData$serverError === void 0 ? void 0 : _xData$serverError.length) || settings.colorEncoding === COLOR_ENCODINGS.OBS && ((_obsData$serverError = obsData.serverError) === null || _obsData$serverError === void 0 ? void 0 : _obsData$serverError.length) || settings.labelObs.lengh && ((_labelObsData$serverE = labelObsData.serverError) === null || _labelObsData$serverE === void 0 ? void 0 : _labelObsData$serverE.length);
336
342
  return /*#__PURE__*/React.createElement("div", {
337
343
  className: "cherita-container-scatterplot"
338
344
  }, /*#__PURE__*/React.createElement("div", {
@@ -366,14 +372,15 @@ export function Scatterplot(_ref) {
366
372
  setFeatures: setFeatures,
367
373
  selectedFeatureIndexes: selectedFeatureIndexes,
368
374
  resetBounds: () => setViewState(getBounds()),
369
- increaseZoom: () => setViewState(v => ({
370
- ...v,
375
+ increaseZoom: () => setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
371
376
  zoom: v.zoom + 1
372
377
  })),
373
- decreaseZoom: () => setViewState(v => ({
374
- ...v,
378
+ decreaseZoom: () => setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
375
379
  zoom: v.zoom - 1
376
- }))
380
+ })),
381
+ setShowObs: setShowObs,
382
+ setShowVars: setShowVars,
383
+ isFullscreen: isFullscreen
377
384
  }), /*#__PURE__*/React.createElement("div", {
378
385
  className: "cherita-spatial-footer"
379
386
  }, /*#__PURE__*/React.createElement("div", {
@@ -383,8 +390,8 @@ export function Scatterplot(_ref) {
383
390
  }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
384
391
  icon: faTriangleExclamation
385
392
  }), "\xA0Error loading data"), /*#__PURE__*/React.createElement(Toolbox, {
386
- mode: dataset.colorEncoding === COLOR_ENCODINGS.VAR ? dataset.selectedVar.name : dataset.colorEncoding === COLOR_ENCODINGS.OBS ? dataset.selectedObs.name : null,
387
- obsLength: parseInt(obsmData.data?.length),
393
+ mode: settings.colorEncoding === COLOR_ENCODINGS.VAR ? (_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name : settings.colorEncoding === COLOR_ENCODINGS.OBS ? (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.name : null,
394
+ obsLength: parseInt((_obsmData$data = obsmData.data) === null || _obsmData$data === void 0 ? void 0 : _obsmData$data.length),
388
395
  slicedLength: parseInt(slicedLength)
389
396
  })), /*#__PURE__*/React.createElement(Legend, {
390
397
  isCategorical: isCategorical,
@@ -1,27 +1,17 @@
1
1
  import React, { useEffect } from "react";
2
2
  import { Box, Slider, Typography } from "@mui/material";
3
- import _ from "lodash";
4
- import { Dropdown } from "react-bootstrap";
5
- import { COLORSCALES } from "../../constants/colorscales";
3
+ import { Form } from "react-bootstrap";
6
4
  import { COLOR_ENCODINGS, OBS_TYPES } from "../../constants/constants";
7
- import { useDataset, useDatasetDispatch } from "../../context/DatasetContext";
5
+ import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
6
+ import { ColorscaleSelect } from "../controls/Controls";
8
7
  export const ScatterplotControls = () => {
9
- const dataset = useDataset();
10
- const dispatch = useDatasetDispatch();
11
- const [sliderValue, setSliderValue] = React.useState(dataset.controls.range || [0, 1]);
12
- const isCategorical = dataset.colorEncoding === COLOR_ENCODINGS.OBS ? dataset.selectedObs?.type === OBS_TYPES.CATEGORICAL : false;
13
- const colormapList = _.keys(COLORSCALES).map(key => /*#__PURE__*/React.createElement(Dropdown.Item, {
14
- key: key,
15
- active: dataset.controls.colorScale === key,
16
- onClick: () => {
17
- dispatch({
18
- type: "set.controls.colorScale",
19
- colorScale: key
20
- });
21
- }
22
- }, key));
8
+ var _settings$selectedObs;
9
+ const settings = useSettings();
10
+ const dispatch = useSettingsDispatch();
11
+ const [sliderValue, setSliderValue] = React.useState(settings.controls.range || [0, 1]);
12
+ const isCategorical = settings.colorEncoding === COLOR_ENCODINGS.OBS ? ((_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.type) === OBS_TYPES.CATEGORICAL : false;
23
13
  const valueLabelFormat = value => {
24
- return (value * (dataset.controls.valueRange[1] - dataset.controls.valueRange[0]) + dataset.controls.valueRange[0]).toFixed(2);
14
+ return (value * (settings.controls.valueRange[1] - settings.controls.valueRange[0]) + settings.controls.valueRange[0]).toFixed(2);
25
15
  };
26
16
  const marks = [{
27
17
  value: 0,
@@ -41,14 +31,16 @@ export const ScatterplotControls = () => {
41
31
  });
42
32
  };
43
33
  useEffect(() => {
44
- setSliderValue(dataset.controls.range);
45
- }, [dataset.controls.range]);
34
+ setSliderValue(settings.controls.range);
35
+ }, [settings.controls.range]);
46
36
  const rangeSlider = /*#__PURE__*/React.createElement(Box, {
47
37
  className: "w-100"
48
38
  }, /*#__PURE__*/React.createElement(Typography, {
49
39
  id: "colorscale-range",
50
40
  gutterBottom: true
51
- }, "Colorscale range"), /*#__PURE__*/React.createElement(Slider, {
41
+ }, "Colorscale range"), /*#__PURE__*/React.createElement("div", {
42
+ className: "px-4"
43
+ }, /*#__PURE__*/React.createElement(Slider, {
52
44
  "aria-labelledby": "colorscale-range",
53
45
  min: 0,
54
46
  max: 1,
@@ -61,11 +53,8 @@ export const ScatterplotControls = () => {
61
53
  valueLabelFormat: valueLabelFormat,
62
54
  marks: marks,
63
55
  disabled: isCategorical
64
- }));
65
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Dropdown, null, /*#__PURE__*/React.createElement(Dropdown.Toggle, {
66
- id: "dropdownColorscale",
67
- variant: "light"
68
- }, dataset.controls.colorScale), /*#__PURE__*/React.createElement(Dropdown.Menu, null, colormapList)), /*#__PURE__*/React.createElement("div", {
69
- className: "m-4"
70
- }, rangeSlider));
56
+ })));
57
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Form, null, /*#__PURE__*/React.createElement(ColorscaleSelect, null), /*#__PURE__*/React.createElement(Form.Group, {
58
+ className: "mb-2"
59
+ }, rangeSlider)));
71
60
  };