@haniffalab/cherita-react 1.4.1-dev.2025-08-13.6fc43290 → 1.4.1-dev.2025-08-18.6fbf7a74
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/dotplot/Dotplot.js +12 -16
- package/dist/cjs/components/heatmap/Heatmap.js +11 -16
- package/dist/cjs/components/matrixplot/Matrixplot.js +11 -16
- package/dist/cjs/components/obs-list/ObsItem.js +14 -14
- package/dist/cjs/components/obs-list/ObsList.js +24 -23
- package/dist/cjs/components/pseudospatial/Pseudospatial.js +25 -31
- package/dist/cjs/components/scatterplot/Scatterplot.js +35 -29
- package/dist/cjs/components/scatterplot/ScatterplotControls.js +9 -3
- package/dist/cjs/components/var-list/VarList.js +16 -14
- package/dist/cjs/components/violin/Violin.js +21 -25
- package/dist/cjs/context/DatasetContext.js +4 -4
- package/dist/cjs/context/SettingsContext.js +175 -40
- package/dist/cjs/utils/Filter.js +15 -10
- package/dist/cjs/utils/Resolver.js +188 -0
- package/dist/cjs/utils/zarrData.js +16 -17
- package/dist/esm/components/dotplot/Dotplot.js +12 -16
- package/dist/esm/components/heatmap/Heatmap.js +11 -16
- package/dist/esm/components/matrixplot/Matrixplot.js +11 -16
- package/dist/esm/components/obs-list/ObsItem.js +14 -14
- package/dist/esm/components/obs-list/ObsList.js +24 -23
- package/dist/esm/components/pseudospatial/Pseudospatial.js +25 -31
- package/dist/esm/components/scatterplot/Scatterplot.js +35 -29
- package/dist/esm/components/scatterplot/ScatterplotControls.js +9 -3
- package/dist/esm/components/var-list/VarList.js +16 -14
- package/dist/esm/components/violin/Violin.js +21 -25
- package/dist/esm/context/DatasetContext.js +4 -4
- package/dist/esm/context/SettingsContext.js +176 -41
- package/dist/esm/utils/Filter.js +15 -10
- package/dist/esm/utils/Resolver.js +176 -0
- package/dist/esm/utils/zarrData.js +16 -17
- package/package.json +2 -2
|
@@ -23,6 +23,7 @@ import { rgbToHex, useColor } from "../../helpers/color-helper";
|
|
|
23
23
|
import { MapHelper } from "../../helpers/map-helper";
|
|
24
24
|
import { Legend } from "../../utils/Legend";
|
|
25
25
|
import { LoadingLinear, LoadingSpinner } from "../../utils/LoadingIndicators";
|
|
26
|
+
import { useSelectedObs } from "../../utils/Resolver";
|
|
26
27
|
import { formatNumerical } from "../../utils/string";
|
|
27
28
|
import { useLabelObsData } from "../../utils/zarrData";
|
|
28
29
|
window.deck.log.level = 1;
|
|
@@ -35,7 +36,7 @@ const INITIAL_VIEW_STATE = {
|
|
|
35
36
|
bearing: 0
|
|
36
37
|
};
|
|
37
38
|
export function Scatterplot(_ref) {
|
|
38
|
-
var
|
|
39
|
+
var _features$features2, _obsmData$serverError, _labelObsData$serverE, _settings$selectedVar, _data$positions;
|
|
39
40
|
let {
|
|
40
41
|
radius = null,
|
|
41
42
|
setShowObs,
|
|
@@ -66,6 +67,8 @@ export function Scatterplot(_ref) {
|
|
|
66
67
|
values: []
|
|
67
68
|
});
|
|
68
69
|
const [coordsError, setCoordsError] = useState(null);
|
|
70
|
+
const [dataError, setDataError] = useState(null);
|
|
71
|
+
const selectedObs = useSelectedObs();
|
|
69
72
|
|
|
70
73
|
// EditableGeoJsonLayer
|
|
71
74
|
const [mode, setMode] = useState(() => ViewMode);
|
|
@@ -99,9 +102,21 @@ export function Scatterplot(_ref) {
|
|
|
99
102
|
setData(d => {
|
|
100
103
|
let values = d.values;
|
|
101
104
|
if (settings.colorEncoding === COLOR_ENCODINGS.VAR) {
|
|
102
|
-
|
|
105
|
+
if (!xData.serverError) {
|
|
106
|
+
values = xData.data;
|
|
107
|
+
setDataError(null);
|
|
108
|
+
} else {
|
|
109
|
+
values = [];
|
|
110
|
+
setDataError(xData.serverError);
|
|
111
|
+
}
|
|
103
112
|
} else if (settings.colorEncoding === COLOR_ENCODINGS.OBS) {
|
|
104
|
-
|
|
113
|
+
if (!obsData.serverError) {
|
|
114
|
+
values = obsData.data;
|
|
115
|
+
setDataError(null);
|
|
116
|
+
} else {
|
|
117
|
+
values = [];
|
|
118
|
+
setDataError(obsData.serverError);
|
|
119
|
+
}
|
|
105
120
|
}
|
|
106
121
|
if (!obsmData.serverError && obsmData.data) {
|
|
107
122
|
if (obsmData.data[0].length !== 2) {
|
|
@@ -174,8 +189,7 @@ export function Scatterplot(_ref) {
|
|
|
174
189
|
getOriginalIndex,
|
|
175
190
|
sortedIndexMap
|
|
176
191
|
} = useMemo(() => {
|
|
177
|
-
|
|
178
|
-
if ((settings.colorEncoding === COLOR_ENCODINGS.VAR || settings.colorEncoding === COLOR_ENCODINGS.OBS && ((_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.type) === OBS_TYPES.CONTINUOUS) && data.positions && data.values && data.positions.length === data.values.length) {
|
|
192
|
+
if ((settings.colorEncoding === COLOR_ENCODINGS.VAR || settings.colorEncoding === COLOR_ENCODINGS.OBS && (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === OBS_TYPES.CONTINUOUS) && data.positions && data.values && data.positions.length === data.values.length) {
|
|
179
193
|
const sortedIndices = _.map(data.values, (_v, i) => i).sort((a, b) => data.values[a] - data.values[b]);
|
|
180
194
|
const sortedIndexMap = new Map(_.map(sortedIndices, (originalIndex, sortedIndex) => [originalIndex, sortedIndex]));
|
|
181
195
|
return {
|
|
@@ -192,24 +206,17 @@ export function Scatterplot(_ref) {
|
|
|
192
206
|
// return original index
|
|
193
207
|
sortedIndexMap: identitySortedIndexMap // return original index
|
|
194
208
|
};
|
|
195
|
-
}, [data, identityGetOriginalIndex, identitySortedIndexMap,
|
|
209
|
+
}, [data, identityGetOriginalIndex, identitySortedIndexMap, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type, settings.colorEncoding]);
|
|
196
210
|
const sortedObsIndices = useMemo(() => {
|
|
197
211
|
return obsIndices ? new Set(Array.from(obsIndices, i => sortedIndexMap.get(i))) : obsIndices;
|
|
198
212
|
}, [obsIndices, sortedIndexMap]);
|
|
199
213
|
const isCategorical = useMemo(() => {
|
|
200
214
|
if (settings.colorEncoding === COLOR_ENCODINGS.OBS) {
|
|
201
|
-
|
|
202
|
-
return ((_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.type) === OBS_TYPES.CATEGORICAL || ((_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.type) === OBS_TYPES.BOOLEAN;
|
|
215
|
+
return (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === OBS_TYPES.CATEGORICAL || (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === OBS_TYPES.BOOLEAN;
|
|
203
216
|
} else {
|
|
204
217
|
return false;
|
|
205
218
|
}
|
|
206
|
-
}, [settings.colorEncoding,
|
|
207
|
-
useEffect(() => {
|
|
208
|
-
dispatch({
|
|
209
|
-
type: "set.controls.valueRange",
|
|
210
|
-
valueRange: [valueMin, valueMax]
|
|
211
|
-
});
|
|
212
|
-
}, [dispatch, valueMax, valueMin]);
|
|
219
|
+
}, [settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type]);
|
|
213
220
|
const {
|
|
214
221
|
min,
|
|
215
222
|
max
|
|
@@ -218,7 +225,6 @@ export function Scatterplot(_ref) {
|
|
|
218
225
|
max: settings.controls.range[1] * (valueMax - valueMin) + valueMin
|
|
219
226
|
};
|
|
220
227
|
const getFillColor = useCallback((_d, _ref2) => {
|
|
221
|
-
var _settings$selectedObs6, _settings$selectedObs7;
|
|
222
228
|
let {
|
|
223
229
|
index
|
|
224
230
|
} = _ref2;
|
|
@@ -227,10 +233,10 @@ export function Scatterplot(_ref) {
|
|
|
227
233
|
value: (sortedData.values[index] - min) / (max - min),
|
|
228
234
|
categorical: isCategorical,
|
|
229
235
|
grayOut: grayOut
|
|
230
|
-
}, useUnsColors && settings.colorEncoding === COLOR_ENCODINGS.OBS &&
|
|
231
|
-
colorscale:
|
|
236
|
+
}, useUnsColors && settings.colorEncoding === COLOR_ENCODINGS.OBS && selectedObs !== null && selectedObs !== void 0 && selectedObs.colors ? {
|
|
237
|
+
colorscale: selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors
|
|
232
238
|
} : {})) || [0, 0, 0, 100];
|
|
233
|
-
}, [isPending, sortedObsIndices, getColor, sortedData.values, min, max, isCategorical, useUnsColors, settings.colorEncoding,
|
|
239
|
+
}, [isPending, sortedObsIndices, getColor, sortedData.values, min, max, isCategorical, useUnsColors, settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors]);
|
|
234
240
|
|
|
235
241
|
// @TODO: add support for pseudospatial hover to reflect in radius
|
|
236
242
|
const getRadius = useCallback((_d, _ref3) => {
|
|
@@ -328,11 +334,9 @@ export function Scatterplot(_ref) {
|
|
|
328
334
|
} = _ref5;
|
|
329
335
|
if (!object || (object === null || object === void 0 ? void 0 : object.type) === "Feature") return;
|
|
330
336
|
const text = [];
|
|
331
|
-
if (settings.colorEncoding === COLOR_ENCODINGS.OBS &&
|
|
332
|
-
name: settings.selectedObs.name
|
|
333
|
-
})) {
|
|
337
|
+
if (settings.colorEncoding === COLOR_ENCODINGS.OBS && selectedObs && !_.includes(settings.labelObs, selectedObs.name)) {
|
|
334
338
|
var _data$values;
|
|
335
|
-
text.push(getLabel(
|
|
339
|
+
text.push(getLabel(selectedObs, (_data$values = data.values) === null || _data$values === void 0 ? void 0 : _data$values[getOriginalIndex(index)]));
|
|
336
340
|
}
|
|
337
341
|
if (settings.colorEncoding === COLOR_ENCODINGS.VAR && settings.selectedVar) {
|
|
338
342
|
var _data$values2;
|
|
@@ -340,7 +344,7 @@ export function Scatterplot(_ref) {
|
|
|
340
344
|
}
|
|
341
345
|
if (settings.labelObs.length) {
|
|
342
346
|
text.push(..._.map(labelObsData.data, (v, k) => {
|
|
343
|
-
const labelObs =
|
|
347
|
+
const labelObs = settings.data.obs[k];
|
|
344
348
|
return getLabel(labelObs, v[getOriginalIndex(index)]);
|
|
345
349
|
}));
|
|
346
350
|
}
|
|
@@ -358,7 +362,7 @@ export function Scatterplot(_ref) {
|
|
|
358
362
|
}
|
|
359
363
|
};
|
|
360
364
|
};
|
|
361
|
-
const error = settings.selectedObsm && ((_obsmData$serverError = obsmData.serverError) === null || _obsmData$serverError === void 0 ? void 0 : _obsmData$serverError.length) ||
|
|
365
|
+
const error = settings.selectedObsm && ((_obsmData$serverError = obsmData.serverError) === null || _obsmData$serverError === void 0 ? void 0 : _obsmData$serverError.length) || dataError || settings.labelObs.length && ((_labelObsData$serverE = labelObsData.serverError) === null || _labelObsData$serverE === void 0 ? void 0 : _labelObsData$serverE.length) || coordsError;
|
|
362
366
|
return /*#__PURE__*/React.createElement("div", {
|
|
363
367
|
className: "cherita-container-scatterplot"
|
|
364
368
|
}, /*#__PURE__*/React.createElement("div", {
|
|
@@ -407,13 +411,15 @@ export function Scatterplot(_ref) {
|
|
|
407
411
|
className: "cherita-toolbox-footer"
|
|
408
412
|
}, !!error && !isRendering && /*#__PURE__*/React.createElement(Alert, {
|
|
409
413
|
variant: "danger"
|
|
410
|
-
}, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
414
|
+
}, /*#__PURE__*/React.createElement(Alert.Heading, null, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
411
415
|
icon: faTriangleExclamation
|
|
412
|
-
}), "\xA0Error loading data"), /*#__PURE__*/React.createElement(
|
|
413
|
-
|
|
416
|
+
}), "\xA0Error loading data"), /*#__PURE__*/React.createElement("p", {
|
|
417
|
+
className: "mb-0"
|
|
418
|
+
}, error.message)), /*#__PURE__*/React.createElement(Toolbox, {
|
|
419
|
+
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 ? selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.name : null,
|
|
414
420
|
obsLength: parseInt((_data$positions = data.positions) === null || _data$positions === void 0 ? void 0 : _data$positions.length),
|
|
415
421
|
slicedLength: parseInt(slicedLength)
|
|
416
|
-
})), /*#__PURE__*/React.createElement(Legend, {
|
|
422
|
+
})), !error && /*#__PURE__*/React.createElement(Legend, {
|
|
417
423
|
isCategorical: isCategorical,
|
|
418
424
|
min: min,
|
|
419
425
|
max: max
|
|
@@ -2,16 +2,22 @@ import React, { useEffect } from "react";
|
|
|
2
2
|
import { Box, Slider, Typography } from "@mui/material";
|
|
3
3
|
import { Form } from "react-bootstrap";
|
|
4
4
|
import { COLOR_ENCODINGS, OBS_TYPES } from "../../constants/constants";
|
|
5
|
+
import { useFilteredData } from "../../context/FilterContext";
|
|
5
6
|
import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
|
|
7
|
+
import { useSelectedObs } from "../../utils/Resolver";
|
|
6
8
|
import { ColorscaleSelect } from "../controls/Controls";
|
|
7
9
|
export const ScatterplotControls = () => {
|
|
8
|
-
var _settings$selectedObs;
|
|
9
10
|
const settings = useSettings();
|
|
10
11
|
const dispatch = useSettingsDispatch();
|
|
11
12
|
const [sliderValue, setSliderValue] = React.useState(settings.controls.range || [0, 1]);
|
|
12
|
-
const
|
|
13
|
+
const {
|
|
14
|
+
valueMin,
|
|
15
|
+
valueMax
|
|
16
|
+
} = useFilteredData();
|
|
17
|
+
const selectedObs = useSelectedObs();
|
|
18
|
+
const isCategorical = settings.colorEncoding === COLOR_ENCODINGS.OBS ? (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === OBS_TYPES.CATEGORICAL : false;
|
|
13
19
|
const valueLabelFormat = value => {
|
|
14
|
-
return (value * (
|
|
20
|
+
return (value * (valueMax - valueMin) + valueMin).toFixed(2);
|
|
15
21
|
};
|
|
16
22
|
const marks = [{
|
|
17
23
|
value: 0,
|
|
@@ -18,6 +18,7 @@ import { useFilteredData } from "../../context/FilterContext";
|
|
|
18
18
|
import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
|
|
19
19
|
import { LoadingSpinner } from "../../utils/LoadingIndicators";
|
|
20
20
|
import { useFetch } from "../../utils/requests";
|
|
21
|
+
import { useSelectedMultiVar, useSelectedVar, useSettingsVars } from "../../utils/Resolver";
|
|
21
22
|
export const useVarMean = function (varKeys) {
|
|
22
23
|
let enabled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
23
24
|
const ENDPOINT = "matrix/mean";
|
|
@@ -29,7 +30,7 @@ export const useVarMean = function (varKeys) {
|
|
|
29
30
|
url: dataset.url,
|
|
30
31
|
varKeys: _.map(varKeys, v => v.isSet ? {
|
|
31
32
|
name: v.name,
|
|
32
|
-
indices: v.vars.map(
|
|
33
|
+
indices: v.vars.map(vv => vv.index)
|
|
33
34
|
} : v.index),
|
|
34
35
|
obsIndices: obsIndices,
|
|
35
36
|
varNamesCol: dataset.varNamesCol
|
|
@@ -39,7 +40,7 @@ export const useVarMean = function (varKeys) {
|
|
|
39
40
|
return _objectSpread(_objectSpread({}, p), {}, {
|
|
40
41
|
varKeys: _.map(varKeys, v => v.isSet ? {
|
|
41
42
|
name: v.name,
|
|
42
|
-
indices: v.vars.map(
|
|
43
|
+
indices: v.vars.map(vv => vv.index)
|
|
43
44
|
} : v.index),
|
|
44
45
|
obsIndices: obsIndices
|
|
45
46
|
});
|
|
@@ -56,42 +57,43 @@ export const sortMeans = (i, means) => {
|
|
|
56
57
|
return means[i.name] || _.min(_.values(means)) - 1;
|
|
57
58
|
};
|
|
58
59
|
export function VarNamesList(_ref) {
|
|
59
|
-
var _settings$selectedVar, _settings$selectedVar2;
|
|
60
60
|
let {
|
|
61
61
|
mode = SELECTION_MODES.SINGLE,
|
|
62
62
|
displayName = "genes"
|
|
63
63
|
} = _ref;
|
|
64
64
|
const settings = useSettings();
|
|
65
65
|
const dispatch = useSettingsDispatch();
|
|
66
|
-
const
|
|
66
|
+
const selectedVar = useSelectedVar();
|
|
67
|
+
const selectedMultiVar = useSelectedMultiVar();
|
|
68
|
+
const settingsVars = useSettingsVars();
|
|
69
|
+
const [active, setActive] = useState(mode === SELECTION_MODES.SINGLE ? (selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.matrix_index) || (selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name) : selectedMultiVar.map(i => i.matrix_index || i.name));
|
|
67
70
|
const [sortedVars, setSortedVars] = useState([]);
|
|
68
71
|
useEffect(() => {
|
|
69
72
|
if (mode === SELECTION_MODES.SINGLE) {
|
|
70
|
-
|
|
71
|
-
setActive(((_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.matrix_index) || ((_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.name));
|
|
73
|
+
setActive((selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.matrix_index) || (selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name));
|
|
72
74
|
}
|
|
73
|
-
}, [mode,
|
|
75
|
+
}, [mode, selectedVar]);
|
|
74
76
|
useEffect(() => {
|
|
75
77
|
if (mode === SELECTION_MODES.MULTIPLE) {
|
|
76
|
-
setActive(
|
|
78
|
+
setActive(selectedMultiVar.map(i => i.matrix_index || i.name));
|
|
77
79
|
}
|
|
78
|
-
}, [mode,
|
|
79
|
-
const varMeans = useVarMean(
|
|
80
|
+
}, [mode, selectedMultiVar]);
|
|
81
|
+
const varMeans = useVarMean(settingsVars, settings.varSort.var.sort === VAR_SORT.MATRIX);
|
|
80
82
|
|
|
81
83
|
// @TODO: deferr sortedVars ?
|
|
82
84
|
useEffect(() => {
|
|
83
85
|
if (settings.varSort.var.sort === VAR_SORT.MATRIX) {
|
|
84
86
|
if (!varMeans.isPending && !varMeans.serverError && varMeans.fetchedData) {
|
|
85
|
-
setSortedVars(_.orderBy(
|
|
87
|
+
setSortedVars(_.orderBy(settingsVars, o => {
|
|
86
88
|
return sortMeans(o, varMeans.fetchedData);
|
|
87
89
|
}, settings.varSort.var.sortOrder));
|
|
88
90
|
}
|
|
89
91
|
} else if (settings.varSort.var.sort === VAR_SORT.NAME) {
|
|
90
|
-
setSortedVars(_.orderBy(
|
|
92
|
+
setSortedVars(_.orderBy(settingsVars, "name", settings.varSort.var.sortOrder));
|
|
91
93
|
} else {
|
|
92
|
-
setSortedVars(
|
|
94
|
+
setSortedVars(settingsVars);
|
|
93
95
|
}
|
|
94
|
-
}, [settings.varSort.var.sort, settings.varSort.var.sortOrder, varMeans.isPending, varMeans.serverError, varMeans.fetchedData,
|
|
96
|
+
}, [settings.varSort.var.sort, settings.varSort.var.sortOrder, varMeans.isPending, varMeans.serverError, varMeans.fetchedData, settingsVars]);
|
|
95
97
|
const makeListItem = item => {
|
|
96
98
|
return /*#__PURE__*/React.createElement(ListGroup.Item, {
|
|
97
99
|
key: item.matrix_index
|
|
@@ -15,9 +15,9 @@ import { useFilteredData } from "../../context/FilterContext";
|
|
|
15
15
|
import { useSettings } from "../../context/SettingsContext";
|
|
16
16
|
import { LoadingSpinner } from "../../utils/LoadingIndicators";
|
|
17
17
|
import { useDebouncedFetch } from "../../utils/requests";
|
|
18
|
+
import { useSelectedMultiVar, useSelectedObs, useSelectedVar } from "../../utils/Resolver";
|
|
18
19
|
import { ControlsPlotlyToolbar, ObsPlotlyToolbar, VarPlotlyToolbar } from "../toolbar/Toolbar";
|
|
19
20
|
export function Violin(_ref) {
|
|
20
|
-
var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
|
|
21
21
|
let {
|
|
22
22
|
mode = VIOLIN_MODES.MULTIKEY,
|
|
23
23
|
showObsBtn = false,
|
|
@@ -37,6 +37,9 @@ export function Violin(_ref) {
|
|
|
37
37
|
const [data, setData] = useState([]);
|
|
38
38
|
const [layout, setLayout] = useState({});
|
|
39
39
|
const [hasSelections, setHasSelections] = useState(false);
|
|
40
|
+
const selectedMultiVar = useSelectedMultiVar();
|
|
41
|
+
const selectedVar = useSelectedVar();
|
|
42
|
+
const selectedObs = useSelectedObs();
|
|
40
43
|
const [params, setParams] = useState(_objectSpread({
|
|
41
44
|
url: dataset.url,
|
|
42
45
|
mode: mode,
|
|
@@ -44,22 +47,19 @@ export function Violin(_ref) {
|
|
|
44
47
|
varNamesCol: dataset.varNamesCol
|
|
45
48
|
}, {
|
|
46
49
|
[VIOLIN_MODES.MULTIKEY]: {
|
|
47
|
-
varKeys:
|
|
50
|
+
varKeys: selectedMultiVar.map(i => i.isSet ? {
|
|
48
51
|
name: i.name,
|
|
49
52
|
indices: i.vars.map(v => v.index)
|
|
50
53
|
} : i.index),
|
|
51
54
|
obsKeys: [] // @TODO: implement
|
|
52
55
|
},
|
|
53
56
|
[VIOLIN_MODES.GROUPBY]: {
|
|
54
|
-
varKey:
|
|
55
|
-
name:
|
|
56
|
-
indices:
|
|
57
|
-
} :
|
|
58
|
-
obsCol:
|
|
59
|
-
obsValues: !(
|
|
60
|
-
var _settings$selectedObs4;
|
|
61
|
-
return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
|
|
62
|
-
}),
|
|
57
|
+
varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
|
|
58
|
+
name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
|
|
59
|
+
indices: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars.map(v => v.index)
|
|
60
|
+
} : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index,
|
|
61
|
+
obsCol: selectedObs,
|
|
62
|
+
obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
|
|
63
63
|
obsIndices: isSliced ? [...(obsIndices || [])] : null
|
|
64
64
|
}
|
|
65
65
|
}[mode]));
|
|
@@ -67,7 +67,7 @@ export function Violin(_ref) {
|
|
|
67
67
|
|
|
68
68
|
useEffect(() => {
|
|
69
69
|
if (mode === VIOLIN_MODES.MULTIKEY) {
|
|
70
|
-
if (
|
|
70
|
+
if (selectedMultiVar.length) {
|
|
71
71
|
setHasSelections(true);
|
|
72
72
|
} else {
|
|
73
73
|
setHasSelections(false);
|
|
@@ -76,7 +76,7 @@ export function Violin(_ref) {
|
|
|
76
76
|
return _objectSpread(_objectSpread({}, p), {}, {
|
|
77
77
|
url: dataset.url,
|
|
78
78
|
mode: mode,
|
|
79
|
-
varKeys:
|
|
79
|
+
varKeys: selectedMultiVar.map(i => i.isSet ? {
|
|
80
80
|
name: i.name,
|
|
81
81
|
indices: i.vars.map(v => v.index)
|
|
82
82
|
} : i.index),
|
|
@@ -85,32 +85,28 @@ export function Violin(_ref) {
|
|
|
85
85
|
});
|
|
86
86
|
});
|
|
87
87
|
} else if (mode === VIOLIN_MODES.GROUPBY) {
|
|
88
|
-
if (
|
|
88
|
+
if (selectedObs && selectedVar) {
|
|
89
89
|
setHasSelections(true);
|
|
90
90
|
} else {
|
|
91
91
|
setHasSelections(false);
|
|
92
92
|
}
|
|
93
93
|
setParams(p => {
|
|
94
|
-
var _settings$selectedVar5, _settings$selectedVar6, _settings$selectedVar7, _settings$selectedVar8, _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
|
|
95
94
|
return _objectSpread(_objectSpread({}, p), {}, {
|
|
96
95
|
url: dataset.url,
|
|
97
96
|
mode: mode,
|
|
98
|
-
varKey:
|
|
99
|
-
name:
|
|
100
|
-
indices:
|
|
101
|
-
} :
|
|
102
|
-
obsCol:
|
|
103
|
-
obsValues: !(
|
|
104
|
-
var _settings$selectedObs8;
|
|
105
|
-
return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
|
|
106
|
-
}),
|
|
97
|
+
varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
|
|
98
|
+
name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
|
|
99
|
+
indices: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars.map(v => v.index)
|
|
100
|
+
} : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index,
|
|
101
|
+
obsCol: selectedObs,
|
|
102
|
+
obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
|
|
107
103
|
obsIndices: isSliced ? [...(obsIndices || [])] : null,
|
|
108
104
|
scale: settings.controls.scale.violinplot,
|
|
109
105
|
varNamesCol: dataset.varNamesCol
|
|
110
106
|
});
|
|
111
107
|
});
|
|
112
108
|
}
|
|
113
|
-
}, [settings.controls.scale.violinplot,
|
|
109
|
+
}, [settings.controls.scale.violinplot, selectedMultiVar, selectedObs, selectedVar, dataset.url, dataset.varNamesCol, obsIndices, isSliced, mode]);
|
|
114
110
|
const {
|
|
115
111
|
fetchedData,
|
|
116
112
|
isPending,
|
|
@@ -50,7 +50,7 @@ const persistOptions = {
|
|
|
50
50
|
return false;
|
|
51
51
|
}
|
|
52
52
|
},
|
|
53
|
-
buster: "1.4.1-dev.2025-08-
|
|
53
|
+
buster: "1.4.1-dev.2025-08-18.6fbf7a74" || "0.0.0"
|
|
54
54
|
// @TODO: add maxAge and api version numbers as buster
|
|
55
55
|
};
|
|
56
56
|
const initialDataset = {
|
|
@@ -74,13 +74,13 @@ export function DatasetProvider(_ref2) {
|
|
|
74
74
|
}, dataset_params));
|
|
75
75
|
return /*#__PURE__*/React.createElement(DatasetContext.Provider, {
|
|
76
76
|
value: dataset
|
|
77
|
+
}, /*#__PURE__*/React.createElement(PersistQueryClientProvider, {
|
|
78
|
+
client: queryClient,
|
|
79
|
+
persistOptions: persistOptions
|
|
77
80
|
}, /*#__PURE__*/React.createElement(SettingsProvider, {
|
|
78
81
|
dataset_url: dataset.url,
|
|
79
82
|
defaultSettings: dataset.defaultSettings,
|
|
80
83
|
canOverrideSettings: dataset.canOverrideSettings
|
|
81
|
-
}, /*#__PURE__*/React.createElement(PersistQueryClientProvider, {
|
|
82
|
-
client: queryClient,
|
|
83
|
-
persistOptions: persistOptions
|
|
84
84
|
}, /*#__PURE__*/React.createElement(FilterProvider, null, /*#__PURE__*/React.createElement(ZarrDataProvider, null, children)))));
|
|
85
85
|
}
|
|
86
86
|
export function useDataset() {
|