@haniffalab/cherita-react 1.4.1-dev.2025-06-30.66ec83a3 → 1.4.1-dev.2025-08-13.8f63c242
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 +14 -23
- 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 +176 -41
- 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 +14 -23
- 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 +177 -42
- 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, _xData$serverError, _obsData$serverError, _labelObsData$serverE, _settings$selectedVar, _data$positions;
|
|
39
40
|
let {
|
|
40
41
|
radius = null,
|
|
41
42
|
setShowObs,
|
|
@@ -66,6 +67,7 @@ export function Scatterplot(_ref) {
|
|
|
66
67
|
values: []
|
|
67
68
|
});
|
|
68
69
|
const [coordsError, setCoordsError] = useState(null);
|
|
70
|
+
const selectedObs = useSelectedObs();
|
|
69
71
|
|
|
70
72
|
// EditableGeoJsonLayer
|
|
71
73
|
const [mode, setMode] = useState(() => ViewMode);
|
|
@@ -174,8 +176,7 @@ export function Scatterplot(_ref) {
|
|
|
174
176
|
getOriginalIndex,
|
|
175
177
|
sortedIndexMap
|
|
176
178
|
} = 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) {
|
|
179
|
+
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
180
|
const sortedIndices = _.map(data.values, (_v, i) => i).sort((a, b) => data.values[a] - data.values[b]);
|
|
180
181
|
const sortedIndexMap = new Map(_.map(sortedIndices, (originalIndex, sortedIndex) => [originalIndex, sortedIndex]));
|
|
181
182
|
return {
|
|
@@ -192,24 +193,17 @@ export function Scatterplot(_ref) {
|
|
|
192
193
|
// return original index
|
|
193
194
|
sortedIndexMap: identitySortedIndexMap // return original index
|
|
194
195
|
};
|
|
195
|
-
}, [data, identityGetOriginalIndex, identitySortedIndexMap,
|
|
196
|
+
}, [data, identityGetOriginalIndex, identitySortedIndexMap, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type, settings.colorEncoding]);
|
|
196
197
|
const sortedObsIndices = useMemo(() => {
|
|
197
198
|
return obsIndices ? new Set(Array.from(obsIndices, i => sortedIndexMap.get(i))) : obsIndices;
|
|
198
199
|
}, [obsIndices, sortedIndexMap]);
|
|
199
200
|
const isCategorical = useMemo(() => {
|
|
200
201
|
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;
|
|
202
|
+
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
203
|
} else {
|
|
204
204
|
return false;
|
|
205
205
|
}
|
|
206
|
-
}, [settings.colorEncoding,
|
|
207
|
-
useEffect(() => {
|
|
208
|
-
dispatch({
|
|
209
|
-
type: "set.controls.valueRange",
|
|
210
|
-
valueRange: [valueMin, valueMax]
|
|
211
|
-
});
|
|
212
|
-
}, [dispatch, valueMax, valueMin]);
|
|
206
|
+
}, [settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type]);
|
|
213
207
|
const {
|
|
214
208
|
min,
|
|
215
209
|
max
|
|
@@ -218,7 +212,6 @@ export function Scatterplot(_ref) {
|
|
|
218
212
|
max: settings.controls.range[1] * (valueMax - valueMin) + valueMin
|
|
219
213
|
};
|
|
220
214
|
const getFillColor = useCallback((_d, _ref2) => {
|
|
221
|
-
var _settings$selectedObs6, _settings$selectedObs7;
|
|
222
215
|
let {
|
|
223
216
|
index
|
|
224
217
|
} = _ref2;
|
|
@@ -227,10 +220,10 @@ export function Scatterplot(_ref) {
|
|
|
227
220
|
value: (sortedData.values[index] - min) / (max - min),
|
|
228
221
|
categorical: isCategorical,
|
|
229
222
|
grayOut: grayOut
|
|
230
|
-
}, useUnsColors && settings.colorEncoding === COLOR_ENCODINGS.OBS &&
|
|
231
|
-
colorscale:
|
|
223
|
+
}, useUnsColors && settings.colorEncoding === COLOR_ENCODINGS.OBS && selectedObs !== null && selectedObs !== void 0 && selectedObs.colors ? {
|
|
224
|
+
colorscale: selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors
|
|
232
225
|
} : {})) || [0, 0, 0, 100];
|
|
233
|
-
}, [isPending, sortedObsIndices, getColor, sortedData.values, min, max, isCategorical, useUnsColors, settings.colorEncoding,
|
|
226
|
+
}, [isPending, sortedObsIndices, getColor, sortedData.values, min, max, isCategorical, useUnsColors, settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors]);
|
|
234
227
|
|
|
235
228
|
// @TODO: add support for pseudospatial hover to reflect in radius
|
|
236
229
|
const getRadius = useCallback((_d, _ref3) => {
|
|
@@ -328,11 +321,9 @@ export function Scatterplot(_ref) {
|
|
|
328
321
|
} = _ref5;
|
|
329
322
|
if (!object || (object === null || object === void 0 ? void 0 : object.type) === "Feature") return;
|
|
330
323
|
const text = [];
|
|
331
|
-
if (settings.colorEncoding === COLOR_ENCODINGS.OBS &&
|
|
332
|
-
name: settings.selectedObs.name
|
|
333
|
-
})) {
|
|
324
|
+
if (settings.colorEncoding === COLOR_ENCODINGS.OBS && selectedObs && !_.includes(settings.labelObs, selectedObs.name)) {
|
|
334
325
|
var _data$values;
|
|
335
|
-
text.push(getLabel(
|
|
326
|
+
text.push(getLabel(selectedObs, (_data$values = data.values) === null || _data$values === void 0 ? void 0 : _data$values[getOriginalIndex(index)]));
|
|
336
327
|
}
|
|
337
328
|
if (settings.colorEncoding === COLOR_ENCODINGS.VAR && settings.selectedVar) {
|
|
338
329
|
var _data$values2;
|
|
@@ -340,7 +331,7 @@ export function Scatterplot(_ref) {
|
|
|
340
331
|
}
|
|
341
332
|
if (settings.labelObs.length) {
|
|
342
333
|
text.push(..._.map(labelObsData.data, (v, k) => {
|
|
343
|
-
const labelObs =
|
|
334
|
+
const labelObs = settings.data.obs[k];
|
|
344
335
|
return getLabel(labelObs, v[getOriginalIndex(index)]);
|
|
345
336
|
}));
|
|
346
337
|
}
|
|
@@ -410,7 +401,7 @@ export function Scatterplot(_ref) {
|
|
|
410
401
|
}, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
|
|
411
402
|
icon: faTriangleExclamation
|
|
412
403
|
}), "\xA0Error loading data"), /*#__PURE__*/React.createElement(Toolbox, {
|
|
413
|
-
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 ?
|
|
404
|
+
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
405
|
obsLength: parseInt((_data$positions = data.positions) === null || _data$positions === void 0 ? void 0 : _data$positions.length),
|
|
415
406
|
slicedLength: parseInt(slicedLength)
|
|
416
407
|
})), /*#__PURE__*/React.createElement(Legend, {
|
|
@@ -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-
|
|
53
|
+
buster: "1.4.1-dev.2025-08-13.8f63c242" || "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() {
|