@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.
- package/dist/cjs/components/controls/Controls.js +60 -0
- package/dist/cjs/components/dotplot/Dotplot.js +47 -38
- package/dist/cjs/components/dotplot/DotplotControls.js +77 -114
- package/dist/cjs/components/full-page/FullPage.js +29 -33
- package/dist/cjs/components/full-page/FullPagePseudospatial.js +30 -33
- package/dist/cjs/components/heatmap/Heatmap.js +33 -22
- package/dist/cjs/components/heatmap/HeatmapControls.js +2 -19
- package/dist/cjs/components/matrixplot/Matrixplot.js +35 -24
- package/dist/cjs/components/matrixplot/MatrixplotControls.js +4 -34
- package/dist/cjs/components/obs-list/ObsItem.js +63 -51
- package/dist/cjs/components/obs-list/ObsList.js +53 -48
- package/dist/cjs/components/obsm-list/ObsmList.js +17 -12
- package/dist/cjs/components/offcanvas/index.js +14 -11
- package/dist/cjs/components/pseudospatial/Pseudospatial.js +78 -68
- package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +27 -21
- package/dist/cjs/components/scatterplot/Scatterplot.js +82 -76
- package/dist/cjs/components/scatterplot/ScatterplotControls.js +18 -31
- package/dist/cjs/components/scatterplot/SpatialControls.js +53 -23
- package/dist/cjs/components/scatterplot/Toolbox.js +1 -18
- package/dist/cjs/components/search-bar/SearchBar.js +156 -59
- package/dist/cjs/components/search-bar/SearchInfo.js +182 -0
- package/dist/cjs/components/search-bar/SearchResults.js +90 -60
- package/dist/cjs/components/var-list/VarItem.js +52 -75
- package/dist/cjs/components/var-list/VarList.js +47 -172
- package/dist/cjs/components/var-list/VarListToolbar.js +7 -8
- package/dist/cjs/components/var-list/VarSet.js +66 -57
- package/dist/cjs/components/violin/Violin.js +54 -43
- package/dist/cjs/components/violin/ViolinControls.js +4 -20
- package/dist/cjs/context/DatasetContext.js +26 -513
- package/dist/cjs/context/FilterContext.js +9 -8
- package/dist/cjs/context/SettingsContext.js +539 -0
- package/dist/cjs/context/ZarrDataContext.js +1 -2
- package/dist/cjs/helpers/color-helper.js +8 -8
- package/dist/cjs/helpers/zarr-helper.js +19 -16
- package/dist/cjs/utils/Filter.js +25 -21
- package/dist/cjs/utils/Histogram.js +4 -3
- package/dist/cjs/utils/ImageViewer.js +1 -2
- package/dist/cjs/utils/Legend.js +18 -12
- package/dist/cjs/utils/LoadingIndicators.js +1 -1
- package/dist/cjs/utils/VirtualizedList.js +16 -13
- package/dist/cjs/utils/errors.js +20 -22
- package/dist/cjs/utils/requests.js +13 -10
- package/dist/cjs/utils/zarrData.js +31 -50
- package/dist/css/cherita.css +84 -24
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/controls/Controls.js +51 -0
- package/dist/esm/components/dotplot/Dotplot.js +47 -37
- package/dist/esm/components/dotplot/DotplotControls.js +77 -112
- package/dist/esm/components/full-page/FullPage.js +29 -32
- package/dist/esm/components/full-page/FullPagePseudospatial.js +30 -32
- package/dist/esm/components/heatmap/Heatmap.js +32 -20
- package/dist/esm/components/heatmap/HeatmapControls.js +3 -20
- package/dist/esm/components/matrixplot/Matrixplot.js +34 -22
- package/dist/esm/components/matrixplot/MatrixplotControls.js +5 -35
- package/dist/esm/components/obs-list/ObsItem.js +63 -49
- package/dist/esm/components/obs-list/ObsList.js +53 -47
- package/dist/esm/components/obsm-list/ObsmList.js +17 -11
- package/dist/esm/components/offcanvas/index.js +14 -11
- package/dist/esm/components/pseudospatial/Pseudospatial.js +77 -66
- package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +27 -20
- package/dist/esm/components/scatterplot/Scatterplot.js +81 -74
- package/dist/esm/components/scatterplot/ScatterplotControls.js +18 -29
- package/dist/esm/components/scatterplot/SpatialControls.js +54 -23
- package/dist/esm/components/scatterplot/Toolbox.js +1 -18
- package/dist/esm/components/search-bar/SearchBar.js +156 -59
- package/dist/esm/components/search-bar/SearchInfo.js +173 -0
- package/dist/esm/components/search-bar/SearchResults.js +91 -60
- package/dist/esm/components/var-list/VarItem.js +53 -76
- package/dist/esm/components/var-list/VarList.js +47 -171
- package/dist/esm/components/var-list/VarListToolbar.js +6 -6
- package/dist/esm/components/var-list/VarSet.js +67 -57
- package/dist/esm/components/violin/Violin.js +53 -41
- package/dist/esm/components/violin/ViolinControls.js +5 -21
- package/dist/esm/context/DatasetContext.js +25 -510
- package/dist/esm/context/FilterContext.js +8 -6
- package/dist/esm/context/SettingsContext.js +528 -0
- package/dist/esm/helpers/color-helper.js +8 -8
- package/dist/esm/helpers/zarr-helper.js +19 -16
- package/dist/esm/utils/Filter.js +25 -21
- package/dist/esm/utils/Histogram.js +4 -3
- package/dist/esm/utils/Legend.js +17 -10
- package/dist/esm/utils/LoadingIndicators.js +1 -1
- package/dist/esm/utils/VirtualizedList.js +15 -11
- package/dist/esm/utils/errors.js +20 -22
- package/dist/esm/utils/requests.js +13 -10
- package/dist/esm/utils/zarrData.js +33 -51
- package/package.json +6 -3
- package/scss/cherita.scss +50 -9
- package/scss/components/layouts.scss +24 -13
- package/scss/components/lists.scss +10 -0
- 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
|
|
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
|
|
11
|
-
const dispatch =
|
|
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:
|
|
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:
|
|
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
|
|
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:
|
|
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
|
-
|
|
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
|
|
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
|
-
|
|
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
|
|
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: !
|
|
103
|
+
checked: !settings.pseudospatial.maskValues || settings.pseudospatial.maskValues.includes(mask),
|
|
97
104
|
onChange: () => handleMaskChange(mask)
|
|
98
105
|
})));
|
|
99
|
-
const nMasks =
|
|
100
|
-
const toggleAllChecked = !
|
|
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(
|
|
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
|
|
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 =
|
|
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:
|
|
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
|
|
87
|
-
height: deckRef
|
|
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
|
-
}, [
|
|
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
|
|
114
|
-
height: deckRef
|
|
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 (
|
|
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
|
-
}, [
|
|
148
|
+
}, [settings.colorEncoding, xData.data, xData.isPending, xData.serverError, getColor]);
|
|
143
149
|
useEffect(() => {
|
|
144
|
-
if (
|
|
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 (
|
|
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
|
-
}, [
|
|
180
|
+
}, [settings.colorEncoding, obsData.data, obsData.isPending, obsData.serverError, settings.sliceBy.obs]);
|
|
179
181
|
const isCategorical = useMemo(() => {
|
|
180
|
-
if (
|
|
181
|
-
|
|
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
|
-
}, [
|
|
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:
|
|
197
|
-
max:
|
|
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
|
-
|
|
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
|
|
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:
|
|
281
|
-
polygons: features
|
|
284
|
+
obsm: settings.selectedObsm,
|
|
285
|
+
polygons: (features === null || features === void 0 ? void 0 : features.features) || []
|
|
282
286
|
});
|
|
283
|
-
}, [
|
|
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
|
|
298
|
+
return "".concat(o.name, ": ").concat(formatNumerical(parseFloat(v)));
|
|
295
299
|
} else {
|
|
296
|
-
return
|
|
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
|
|
308
|
+
if (!object || (object === null || object === void 0 ? void 0 : object.type) === "Feature") return;
|
|
305
309
|
const text = [];
|
|
306
|
-
if (
|
|
307
|
-
name:
|
|
310
|
+
if (settings.colorEncoding === COLOR_ENCODINGS.OBS && settings.selectedObs && !_.some(settings.labelObs, {
|
|
311
|
+
name: settings.selectedObs.name
|
|
308
312
|
})) {
|
|
309
|
-
|
|
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 (
|
|
312
|
-
|
|
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 (
|
|
320
|
+
if (settings.labelObs.length) {
|
|
315
321
|
text.push(..._.map(labelObsData.data, (v, k) => {
|
|
316
|
-
const labelObs = _.find(
|
|
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":
|
|
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 =
|
|
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:
|
|
387
|
-
obsLength: parseInt(obsmData.data
|
|
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
|
|
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 {
|
|
5
|
+
import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
|
|
6
|
+
import { ColorscaleSelect } from "../controls/Controls";
|
|
8
7
|
export const ScatterplotControls = () => {
|
|
9
|
-
|
|
10
|
-
const
|
|
11
|
-
const
|
|
12
|
-
const
|
|
13
|
-
const
|
|
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 * (
|
|
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(
|
|
45
|
-
}, [
|
|
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(
|
|
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(
|
|
66
|
-
|
|
67
|
-
|
|
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
|
};
|