@haniffalab/cherita-react 1.3.0 → 1.4.0-dev.2025-06-09.09fbcbf5
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/assets/images/plots/dotplot.svg +152 -0
- package/dist/assets/images/plots/heatmap.svg +193 -0
- package/dist/assets/images/plots/matrixplot.svg +275 -0
- package/dist/assets/images/plots/scatterplot.svg +198 -0
- package/dist/assets/images/plots/violin.svg +50 -0
- package/dist/cjs/components/dotplot/Dotplot.js +35 -5
- package/dist/cjs/components/full-page/FullPage.js +109 -50
- package/dist/cjs/components/full-page/PlotTypeSelector.js +57 -0
- package/dist/cjs/components/heatmap/Heatmap.js +35 -5
- package/dist/cjs/components/matrixplot/Matrixplot.js +35 -5
- package/dist/cjs/components/obs-list/ObsItem.js +49 -22
- package/dist/cjs/components/obs-list/ObsList.js +9 -5
- package/dist/cjs/components/scatterplot/Scatterplot.js +115 -95
- package/dist/cjs/components/scatterplot/SpatialControls.js +3 -3
- package/dist/cjs/components/search-bar/SearchInfo.js +3 -35
- package/dist/cjs/components/toolbar/Toolbar.js +102 -0
- package/dist/cjs/components/var-list/VarList.js +11 -3
- package/dist/cjs/components/violin/Violin.js +37 -6
- package/dist/cjs/constants/constants.js +14 -2
- package/dist/cjs/context/DatasetContext.js +2 -1
- package/dist/cjs/context/SettingsContext.js +77 -46
- package/dist/cjs/helpers/map-helper.js +2 -1
- package/dist/cjs/index.js +15 -21
- package/dist/css/cherita.css +76 -23
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/dotplot/Dotplot.js +36 -6
- package/dist/esm/components/full-page/FullPage.js +111 -50
- package/dist/esm/components/full-page/PlotTypeSelector.js +50 -0
- package/dist/esm/components/heatmap/Heatmap.js +36 -6
- package/dist/esm/components/matrixplot/Matrixplot.js +36 -6
- package/dist/esm/components/obs-list/ObsItem.js +49 -22
- package/dist/esm/components/obs-list/ObsList.js +9 -5
- package/dist/esm/components/scatterplot/Scatterplot.js +115 -95
- package/dist/esm/components/scatterplot/SpatialControls.js +3 -3
- package/dist/esm/components/search-bar/SearchInfo.js +1 -33
- package/dist/esm/components/toolbar/Toolbar.js +91 -0
- package/dist/esm/components/var-list/VarList.js +10 -5
- package/dist/esm/components/violin/Violin.js +39 -8
- package/dist/esm/constants/constants.js +13 -1
- package/dist/esm/context/DatasetContext.js +2 -1
- package/dist/esm/context/SettingsContext.js +77 -46
- package/dist/esm/helpers/map-helper.js +2 -1
- package/dist/esm/index.js +4 -4
- package/package.json +6 -4
- package/scss/cherita.scss +0 -1
- package/scss/components/layouts.scss +69 -1
- package/scss/components/plotly.scss +19 -14
- package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
- package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import dotplotIcon from "../../../assets/images/plots/dotplot.svg";
|
|
3
|
+
import heatmapIcon from "../../../assets/images/plots/heatmap.svg";
|
|
4
|
+
import matrixplotIcon from "../../../assets/images/plots/matrixplot.svg";
|
|
5
|
+
import scatterplotIcon from "../../../assets/images/plots/scatterplot.svg";
|
|
6
|
+
import violinIcon from "../../../assets/images/plots/violin.svg";
|
|
7
|
+
import { PLOT_TYPES } from "../../constants/constants";
|
|
8
|
+
const iconMap = {
|
|
9
|
+
[PLOT_TYPES.DOTPLOT]: dotplotIcon,
|
|
10
|
+
[PLOT_TYPES.MATRIXPLOT]: matrixplotIcon,
|
|
11
|
+
[PLOT_TYPES.VIOLINPLOT]: violinIcon,
|
|
12
|
+
[PLOT_TYPES.SCATTERPLOT]: scatterplotIcon,
|
|
13
|
+
[PLOT_TYPES.HEATMAP]: heatmapIcon
|
|
14
|
+
};
|
|
15
|
+
const plotTypes = Object.entries(iconMap).map(_ref => {
|
|
16
|
+
let [type, icon] = _ref;
|
|
17
|
+
return {
|
|
18
|
+
type,
|
|
19
|
+
icon,
|
|
20
|
+
alt: type.charAt(0).toUpperCase() + type.slice(1)
|
|
21
|
+
};
|
|
22
|
+
});
|
|
23
|
+
export function PlotTypeSelector(_ref2) {
|
|
24
|
+
let {
|
|
25
|
+
currentType,
|
|
26
|
+
onChange
|
|
27
|
+
} = _ref2;
|
|
28
|
+
return /*#__PURE__*/React.createElement("div", {
|
|
29
|
+
className: "d-flex gap-2 justify-content-between"
|
|
30
|
+
}, plotTypes.map(_ref3 => {
|
|
31
|
+
let {
|
|
32
|
+
type,
|
|
33
|
+
icon,
|
|
34
|
+
alt
|
|
35
|
+
} = _ref3;
|
|
36
|
+
return /*#__PURE__*/React.createElement("img", {
|
|
37
|
+
key: type,
|
|
38
|
+
src: icon,
|
|
39
|
+
alt: alt,
|
|
40
|
+
height: 32,
|
|
41
|
+
width: 32,
|
|
42
|
+
className: "plotselector-icon".concat(currentType === type ? " active" : ""),
|
|
43
|
+
onClick: () => onChange(type),
|
|
44
|
+
style: {
|
|
45
|
+
borderBottom: currentType === type ? "2px solid #007bff" : "none"
|
|
46
|
+
},
|
|
47
|
+
title: alt
|
|
48
|
+
});
|
|
49
|
+
}));
|
|
50
|
+
}
|
|
@@ -5,15 +5,25 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
|
|
|
5
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); }
|
|
6
6
|
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
7
7
|
import _ from "lodash";
|
|
8
|
-
import { Alert } from "react-bootstrap";
|
|
8
|
+
import { Alert, Button } from "react-bootstrap";
|
|
9
9
|
import Plot from "react-plotly.js";
|
|
10
|
+
import { PLOTLY_MODEBAR_BUTTONS } from "../../constants/constants";
|
|
10
11
|
import { useDataset } from "../../context/DatasetContext";
|
|
11
12
|
import { useFilteredData } from "../../context/FilterContext";
|
|
12
13
|
import { useSettings } from "../../context/SettingsContext";
|
|
13
14
|
import { LoadingSpinner } from "../../utils/LoadingIndicators";
|
|
14
15
|
import { useDebouncedFetch } from "../../utils/requests";
|
|
15
|
-
|
|
16
|
+
import { ControlsPlotlyToolbar, ObsPlotlyToolbar, VarPlotlyToolbar } from "../toolbar/Toolbar";
|
|
17
|
+
export function Heatmap(_ref) {
|
|
16
18
|
var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
|
|
19
|
+
let {
|
|
20
|
+
showObsBtn = false,
|
|
21
|
+
showVarsBtn = false,
|
|
22
|
+
showCtrlsBtn = false,
|
|
23
|
+
setShowObs,
|
|
24
|
+
setShowVars,
|
|
25
|
+
setShowControls
|
|
26
|
+
} = _ref;
|
|
17
27
|
const ENDPOINT = "heatmap";
|
|
18
28
|
const dataset = useDataset();
|
|
19
29
|
const settings = useSettings();
|
|
@@ -90,17 +100,29 @@ export function Heatmap() {
|
|
|
90
100
|
colorscale.current = settings.controls.colorScale;
|
|
91
101
|
updateColorscale(colorscale.current);
|
|
92
102
|
}, [settings.controls.colorScale, updateColorscale]);
|
|
103
|
+
const customModeBarButtons = _.compact([showObsBtn && ObsPlotlyToolbar({
|
|
104
|
+
onClick: setShowObs
|
|
105
|
+
}), showVarsBtn && VarPlotlyToolbar({
|
|
106
|
+
onClick: setShowVars
|
|
107
|
+
}), showCtrlsBtn && ControlsPlotlyToolbar({
|
|
108
|
+
onClick: setShowControls
|
|
109
|
+
})]);
|
|
110
|
+
const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, PLOTLY_MODEBAR_BUTTONS] : [PLOTLY_MODEBAR_BUTTONS];
|
|
93
111
|
if (!serverError) {
|
|
94
112
|
if (hasSelections) {
|
|
95
113
|
return /*#__PURE__*/React.createElement("div", {
|
|
96
|
-
className: "cherita-heatmap position-relative"
|
|
114
|
+
className: "cherita-plot cherita-heatmap position-relative"
|
|
97
115
|
}, isPending && /*#__PURE__*/React.createElement(LoadingSpinner, null), /*#__PURE__*/React.createElement(Plot, {
|
|
98
116
|
data: data,
|
|
99
117
|
layout: layout,
|
|
100
118
|
useResizeHandler: true,
|
|
101
119
|
style: {
|
|
102
|
-
|
|
103
|
-
|
|
120
|
+
width: "100%",
|
|
121
|
+
height: "100%"
|
|
122
|
+
},
|
|
123
|
+
config: {
|
|
124
|
+
displaylogo: false,
|
|
125
|
+
modeBarButtons: modeBarButtons
|
|
104
126
|
}
|
|
105
127
|
}));
|
|
106
128
|
}
|
|
@@ -108,7 +130,15 @@ export function Heatmap() {
|
|
|
108
130
|
className: "cherita-heatmap"
|
|
109
131
|
}, /*#__PURE__*/React.createElement(Alert, {
|
|
110
132
|
variant: "light"
|
|
111
|
-
}, "Select
|
|
133
|
+
}, "Select", " ", showVarsBtn ? /*#__PURE__*/React.createElement(Button, {
|
|
134
|
+
variant: "link",
|
|
135
|
+
className: "border-0 p-0 align-baseline",
|
|
136
|
+
onClick: setShowVars
|
|
137
|
+
}, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/React.createElement(Button, {
|
|
138
|
+
variant: "link",
|
|
139
|
+
className: "border-0 p-0 align-baseline",
|
|
140
|
+
onClick: setShowObs
|
|
141
|
+
}, "category") : "category"));
|
|
112
142
|
} else {
|
|
113
143
|
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Alert, {
|
|
114
144
|
variant: "danger"
|
|
@@ -5,15 +5,25 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
|
|
|
5
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); }
|
|
6
6
|
import React, { useCallback, useEffect, useRef, useState } from "react";
|
|
7
7
|
import _ from "lodash";
|
|
8
|
-
import { Alert } from "react-bootstrap";
|
|
8
|
+
import { Alert, Button } from "react-bootstrap";
|
|
9
9
|
import Plot from "react-plotly.js";
|
|
10
|
+
import { PLOTLY_MODEBAR_BUTTONS } from "../../constants/constants";
|
|
10
11
|
import { useDataset } from "../../context/DatasetContext";
|
|
11
12
|
import { useFilteredData } from "../../context/FilterContext";
|
|
12
13
|
import { useSettings } from "../../context/SettingsContext";
|
|
13
14
|
import { LoadingSpinner } from "../../utils/LoadingIndicators";
|
|
14
15
|
import { useDebouncedFetch } from "../../utils/requests";
|
|
15
|
-
|
|
16
|
+
import { ControlsPlotlyToolbar, ObsPlotlyToolbar, VarPlotlyToolbar } from "../toolbar/Toolbar";
|
|
17
|
+
export function Matrixplot(_ref) {
|
|
16
18
|
var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
|
|
19
|
+
let {
|
|
20
|
+
showObsBtn = false,
|
|
21
|
+
showVarsBtn = false,
|
|
22
|
+
showCtrlsBtn = false,
|
|
23
|
+
setShowObs,
|
|
24
|
+
setShowVars,
|
|
25
|
+
setShowControls
|
|
26
|
+
} = _ref;
|
|
17
27
|
const ENDPOINT = "matrixplot";
|
|
18
28
|
const dataset = useDataset();
|
|
19
29
|
const settings = useSettings();
|
|
@@ -92,17 +102,29 @@ export function Matrixplot() {
|
|
|
92
102
|
colorscale.current = settings.controls.colorScale;
|
|
93
103
|
updateColorscale(colorscale.current);
|
|
94
104
|
}, [settings.controls.colorScale, updateColorscale]);
|
|
105
|
+
const customModeBarButtons = _.compact([showObsBtn && ObsPlotlyToolbar({
|
|
106
|
+
onClick: setShowObs
|
|
107
|
+
}), showVarsBtn && VarPlotlyToolbar({
|
|
108
|
+
onClick: setShowVars
|
|
109
|
+
}), showCtrlsBtn && ControlsPlotlyToolbar({
|
|
110
|
+
onClick: setShowControls
|
|
111
|
+
})]);
|
|
112
|
+
const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, PLOTLY_MODEBAR_BUTTONS] : [PLOTLY_MODEBAR_BUTTONS];
|
|
95
113
|
if (!serverError) {
|
|
96
114
|
if (hasSelections) {
|
|
97
115
|
return /*#__PURE__*/React.createElement("div", {
|
|
98
|
-
className: "cherita-matrixplot position-relative"
|
|
116
|
+
className: "cherita-plot cherita-matrixplot position-relative"
|
|
99
117
|
}, isPending && /*#__PURE__*/React.createElement(LoadingSpinner, null), /*#__PURE__*/React.createElement(Plot, {
|
|
100
118
|
data: data,
|
|
101
119
|
layout: layout,
|
|
102
120
|
useResizeHandler: true,
|
|
103
121
|
style: {
|
|
104
|
-
|
|
105
|
-
|
|
122
|
+
width: "100%",
|
|
123
|
+
height: "100%"
|
|
124
|
+
},
|
|
125
|
+
config: {
|
|
126
|
+
displaylogo: false,
|
|
127
|
+
modeBarButtons: modeBarButtons
|
|
106
128
|
}
|
|
107
129
|
}));
|
|
108
130
|
}
|
|
@@ -110,7 +132,15 @@ export function Matrixplot() {
|
|
|
110
132
|
className: "cherita-matrixplot"
|
|
111
133
|
}, /*#__PURE__*/React.createElement(Alert, {
|
|
112
134
|
variant: "light"
|
|
113
|
-
}, "Select
|
|
135
|
+
}, "Select", " ", showVarsBtn ? /*#__PURE__*/React.createElement(Button, {
|
|
136
|
+
variant: "link",
|
|
137
|
+
className: "border-0 p-0 align-baseline",
|
|
138
|
+
onClick: setShowVars
|
|
139
|
+
}, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/React.createElement(Button, {
|
|
140
|
+
variant: "link",
|
|
141
|
+
className: "border-0 p-0 align-baseline",
|
|
142
|
+
onClick: setShowObs
|
|
143
|
+
}, "category") : "category"));
|
|
114
144
|
} else {
|
|
115
145
|
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Alert, {
|
|
116
146
|
variant: "danger"
|
|
@@ -44,8 +44,11 @@ import { useObsData } from "../../utils/zarrData";
|
|
|
44
44
|
function getContinuousLabel(code, binEdges) {
|
|
45
45
|
return "[ ".concat(formatNumerical(binEdges[code][0]), ", ").concat(formatNumerical(binEdges[code][1], FORMATS.EXPONENTIAL)).concat(code === binEdges.length - 1 ? " ]" : " )");
|
|
46
46
|
}
|
|
47
|
-
const useObsHistogram = obs => {
|
|
47
|
+
const useObsHistogram = (obs, _ref) => {
|
|
48
48
|
var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedVar9, _settings$selectedVar0, _settings$selectedVar1, _settings$selectedVar10;
|
|
49
|
+
let {
|
|
50
|
+
enabled = true
|
|
51
|
+
} = _ref;
|
|
49
52
|
const ENDPOINT = "obs/histograms";
|
|
50
53
|
const dataset = useDataset();
|
|
51
54
|
const settings = useSettings();
|
|
@@ -77,7 +80,7 @@ const useObsHistogram = obs => {
|
|
|
77
80
|
});
|
|
78
81
|
}, [(_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]);
|
|
79
82
|
return useFetch(ENDPOINT, params, {
|
|
80
|
-
enabled: !!settings.selectedVar && settings.colorEncoding === COLOR_ENCODINGS.VAR,
|
|
83
|
+
enabled: enabled && !!settings.selectedVar && settings.colorEncoding === COLOR_ENCODINGS.VAR,
|
|
81
84
|
refetchOnMount: false
|
|
82
85
|
});
|
|
83
86
|
};
|
|
@@ -124,7 +127,7 @@ const useFilteredObsData = obs => {
|
|
|
124
127
|
pct: pct
|
|
125
128
|
};
|
|
126
129
|
};
|
|
127
|
-
function CategoricalItem(
|
|
130
|
+
function CategoricalItem(_ref2) {
|
|
128
131
|
let {
|
|
129
132
|
value,
|
|
130
133
|
label,
|
|
@@ -147,8 +150,12 @@ function CategoricalItem(_ref) {
|
|
|
147
150
|
pct: null
|
|
148
151
|
},
|
|
149
152
|
isSliced,
|
|
153
|
+
colors = null,
|
|
150
154
|
showColor = true
|
|
151
|
-
} =
|
|
155
|
+
} = _ref2;
|
|
156
|
+
const {
|
|
157
|
+
useUnsColors
|
|
158
|
+
} = useDataset();
|
|
152
159
|
const {
|
|
153
160
|
getColor
|
|
154
161
|
} = useColor();
|
|
@@ -233,7 +240,7 @@ function CategoricalItem(_ref) {
|
|
|
233
240
|
y: "0",
|
|
234
241
|
width: "10",
|
|
235
242
|
height: "10",
|
|
236
|
-
fill: "rgb(".concat(getColor({
|
|
243
|
+
fill: "rgb(".concat(getColor(_objectSpread({
|
|
237
244
|
value: (code - min) / (max - min),
|
|
238
245
|
categorical: true,
|
|
239
246
|
grayOut: isOmitted,
|
|
@@ -241,16 +248,19 @@ function CategoricalItem(_ref) {
|
|
|
241
248
|
alpha: 1
|
|
242
249
|
},
|
|
243
250
|
colorEncoding: "obs"
|
|
244
|
-
}
|
|
251
|
+
}, useUnsColors ? {
|
|
252
|
+
colorscale: colors
|
|
253
|
+
} : {})), ")")
|
|
245
254
|
}))) : null))));
|
|
246
255
|
}
|
|
247
|
-
export function CategoricalObs(
|
|
256
|
+
export function CategoricalObs(_ref3) {
|
|
248
257
|
let {
|
|
249
258
|
obs,
|
|
250
259
|
toggleAll,
|
|
251
260
|
toggleObs,
|
|
252
|
-
showColor = true
|
|
253
|
-
|
|
261
|
+
showColor = true,
|
|
262
|
+
showHistograms = true
|
|
263
|
+
} = _ref3;
|
|
254
264
|
const settings = useSettings();
|
|
255
265
|
const {
|
|
256
266
|
isSliced
|
|
@@ -258,7 +268,9 @@ export function CategoricalObs(_ref2) {
|
|
|
258
268
|
const totalCounts = _.sum(_.values(obs.value_counts));
|
|
259
269
|
const min = _.min(_.values(obs.codes));
|
|
260
270
|
const max = _.max(_.values(obs.codes));
|
|
261
|
-
const obsHistograms = useObsHistogram(obs
|
|
271
|
+
const obsHistograms = useObsHistogram(obs, {
|
|
272
|
+
enabled: showHistograms
|
|
273
|
+
});
|
|
262
274
|
const filteredObsData = useFilteredObsData(obs);
|
|
263
275
|
const getDataAtIndex = useCallback(index => {
|
|
264
276
|
var _obsHistograms$fetche;
|
|
@@ -271,7 +283,7 @@ export function CategoricalObs(_ref2) {
|
|
|
271
283
|
},
|
|
272
284
|
isOmitted: _.includes(obs.omit, obs.codes[obs.values[index]]),
|
|
273
285
|
label: obs.values[index],
|
|
274
|
-
histogramData: settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
|
|
286
|
+
histogramData: showHistograms && settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
|
|
275
287
|
data: (_obsHistograms$fetche = obsHistograms.fetchedData) === null || _obsHistograms$fetche === void 0 ? void 0 : _obsHistograms$fetche[obs.values[index]],
|
|
276
288
|
isPending: obsHistograms.isPending,
|
|
277
289
|
altColor: isSliced
|
|
@@ -283,9 +295,10 @@ export function CategoricalObs(_ref2) {
|
|
|
283
295
|
value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
|
|
284
296
|
pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
|
|
285
297
|
},
|
|
286
|
-
isSliced: isSliced
|
|
298
|
+
isSliced: isSliced,
|
|
299
|
+
colors: obs.colors
|
|
287
300
|
};
|
|
288
|
-
}, [settings.colorEncoding, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.
|
|
301
|
+
}, [obs.values, obs.codes, obs.value_counts, obs.omit, totalCounts, showHistograms, obs.colors, settings.colorEncoding, obsHistograms.fetchedData, obsHistograms.isPending, isSliced, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct]);
|
|
289
302
|
showColor &= settings.colorEncoding === COLOR_ENCODINGS.OBS;
|
|
290
303
|
return /*#__PURE__*/React.createElement(ListGroup, {
|
|
291
304
|
variant: "flush",
|
|
@@ -307,10 +320,10 @@ export function CategoricalObs(_ref2) {
|
|
|
307
320
|
estimateSize: 42
|
|
308
321
|
}));
|
|
309
322
|
}
|
|
310
|
-
function ObsContinuousStats(
|
|
323
|
+
function ObsContinuousStats(_ref4) {
|
|
311
324
|
let {
|
|
312
325
|
obs
|
|
313
|
-
} =
|
|
326
|
+
} = _ref4;
|
|
314
327
|
const ENDPOINT = "obs/distribution";
|
|
315
328
|
const dataset = useDataset();
|
|
316
329
|
const params = {
|
|
@@ -370,21 +383,26 @@ function ObsContinuousStats(_ref3) {
|
|
|
370
383
|
}
|
|
371
384
|
|
|
372
385
|
// @TODO: add bin controls
|
|
373
|
-
|
|
374
|
-
export function ContinuousObs(_ref4) {
|
|
386
|
+
export function ContinuousObs(_ref5) {
|
|
375
387
|
let {
|
|
376
388
|
obs,
|
|
377
389
|
toggleAll,
|
|
378
|
-
toggleObs
|
|
379
|
-
|
|
390
|
+
toggleObs,
|
|
391
|
+
showHistograms = true
|
|
392
|
+
} = _ref5;
|
|
393
|
+
const settings = useSettings();
|
|
380
394
|
const {
|
|
381
395
|
isSliced
|
|
382
396
|
} = useFilteredData();
|
|
383
397
|
const totalCounts = _.sum(_.values(obs.value_counts));
|
|
384
398
|
const min = _.min(_.values(obs.codes));
|
|
385
399
|
const max = _.max(_.values(obs.codes));
|
|
400
|
+
const obsHistograms = useObsHistogram(obs, {
|
|
401
|
+
enabled: showHistograms
|
|
402
|
+
});
|
|
386
403
|
const filteredObsData = useFilteredObsData(obs);
|
|
387
|
-
const getDataAtIndex = index => {
|
|
404
|
+
const getDataAtIndex = useCallback(index => {
|
|
405
|
+
var _obsHistograms$fetche2;
|
|
388
406
|
return {
|
|
389
407
|
value: obs.values[index],
|
|
390
408
|
code: obs.codes[obs.values[index]],
|
|
@@ -394,13 +412,21 @@ export function ContinuousObs(_ref4) {
|
|
|
394
412
|
},
|
|
395
413
|
isOmitted: _.includes(obs.omit, obs.codes[obs.values[index]]),
|
|
396
414
|
label: isNaN(obs.values[index]) ? "NaN" : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges),
|
|
415
|
+
histogramData: showHistograms && settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
|
|
416
|
+
data: (_obsHistograms$fetche2 = obsHistograms.fetchedData) === null || _obsHistograms$fetche2 === void 0 ? void 0 : _obsHistograms$fetche2[obs.values[index]],
|
|
417
|
+
isPending: obsHistograms.isPending,
|
|
418
|
+
altColor: isSliced
|
|
419
|
+
} : {
|
|
420
|
+
data: null,
|
|
421
|
+
isPending: false
|
|
422
|
+
},
|
|
397
423
|
filteredStats: {
|
|
398
424
|
value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
|
|
399
425
|
pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
|
|
400
426
|
},
|
|
401
427
|
isSliced: isSliced
|
|
402
428
|
};
|
|
403
|
-
};
|
|
429
|
+
}, [filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, isSliced, obs.bins.binEdges, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, settings.colorEncoding, showHistograms, totalCounts]);
|
|
404
430
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ListGroup, {
|
|
405
431
|
variant: "flush",
|
|
406
432
|
className: "cherita-list"
|
|
@@ -417,7 +443,8 @@ export function ContinuousObs(_ref4) {
|
|
|
417
443
|
min: min,
|
|
418
444
|
max: max,
|
|
419
445
|
onChange: toggleObs,
|
|
420
|
-
showColor: false
|
|
446
|
+
showColor: false,
|
|
447
|
+
estimateSize: 42
|
|
421
448
|
})), /*#__PURE__*/React.createElement(ObsContinuousStats, {
|
|
422
449
|
obs: obs
|
|
423
450
|
}));
|
|
@@ -48,7 +48,9 @@ export function ObsColsList(_ref2) {
|
|
|
48
48
|
var _settings$selectedObs;
|
|
49
49
|
let {
|
|
50
50
|
showColor = true,
|
|
51
|
-
enableObsGroups = true
|
|
51
|
+
enableObsGroups = true,
|
|
52
|
+
showSelectedAsActive = false,
|
|
53
|
+
showHistograms = true
|
|
52
54
|
} = _ref2;
|
|
53
55
|
const ENDPOINT = "obs/cols";
|
|
54
56
|
const dataset = useDataset();
|
|
@@ -215,7 +217,7 @@ export function ObsColsList(_ref2) {
|
|
|
215
217
|
}
|
|
216
218
|
const inLabelObs = _.some(settings.labelObs, i => i.name === item.name);
|
|
217
219
|
const inSliceObs = settings.sliceBy.obs && ((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.name) === item.name;
|
|
218
|
-
const isColorEncoding = settings.colorEncoding === COLOR_ENCODINGS.OBS && ((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name;
|
|
220
|
+
const isColorEncoding = (showSelectedAsActive || settings.colorEncoding === COLOR_ENCODINGS.OBS) && ((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name;
|
|
219
221
|
return /*#__PURE__*/React.createElement("div", {
|
|
220
222
|
className: "accordion-item",
|
|
221
223
|
key: item.name
|
|
@@ -242,7 +244,7 @@ export function ObsColsList(_ref2) {
|
|
|
242
244
|
event.stopPropagation();
|
|
243
245
|
toggleColor(item);
|
|
244
246
|
},
|
|
245
|
-
title: "Is color encoding"
|
|
247
|
+
title: showSelectedAsActive ? "Is selected" : "Is color encoding"
|
|
246
248
|
}, /*#__PURE__*/React.createElement(WaterDropIcon, null)))), /*#__PURE__*/React.createElement(Accordion.Collapse, {
|
|
247
249
|
eventKey: item.name
|
|
248
250
|
}, /*#__PURE__*/React.createElement("div", {
|
|
@@ -255,7 +257,8 @@ export function ObsColsList(_ref2) {
|
|
|
255
257
|
toggleLabel: () => toggleLabel(item),
|
|
256
258
|
toggleSlice: () => toggleSlice(item),
|
|
257
259
|
toggleColor: () => toggleColor(item),
|
|
258
|
-
showColor: showColor && isColorEncoding
|
|
260
|
+
showColor: showColor && isColorEncoding,
|
|
261
|
+
showHistograms: showHistograms
|
|
259
262
|
}) : /*#__PURE__*/React.createElement(ContinuousObs, {
|
|
260
263
|
key: item.name,
|
|
261
264
|
obs: item,
|
|
@@ -263,7 +266,8 @@ export function ObsColsList(_ref2) {
|
|
|
263
266
|
toggleObs: value => toggleObs(item, value),
|
|
264
267
|
toggleLabel: () => toggleLabel(item),
|
|
265
268
|
toggleSlice: () => toggleSlice(item),
|
|
266
|
-
toggleColor: () => toggleColor(item)
|
|
269
|
+
toggleColor: () => toggleColor(item),
|
|
270
|
+
showHistograms: showHistograms
|
|
267
271
|
})))));
|
|
268
272
|
};
|
|
269
273
|
const groupList = _.map(_.keys(obsGroups), group => {
|