@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.
Files changed (31) hide show
  1. package/dist/cjs/components/dotplot/Dotplot.js +12 -16
  2. package/dist/cjs/components/heatmap/Heatmap.js +11 -16
  3. package/dist/cjs/components/matrixplot/Matrixplot.js +11 -16
  4. package/dist/cjs/components/obs-list/ObsItem.js +14 -14
  5. package/dist/cjs/components/obs-list/ObsList.js +24 -23
  6. package/dist/cjs/components/pseudospatial/Pseudospatial.js +25 -31
  7. package/dist/cjs/components/scatterplot/Scatterplot.js +35 -29
  8. package/dist/cjs/components/scatterplot/ScatterplotControls.js +9 -3
  9. package/dist/cjs/components/var-list/VarList.js +16 -14
  10. package/dist/cjs/components/violin/Violin.js +21 -25
  11. package/dist/cjs/context/DatasetContext.js +4 -4
  12. package/dist/cjs/context/SettingsContext.js +175 -40
  13. package/dist/cjs/utils/Filter.js +15 -10
  14. package/dist/cjs/utils/Resolver.js +188 -0
  15. package/dist/cjs/utils/zarrData.js +16 -17
  16. package/dist/esm/components/dotplot/Dotplot.js +12 -16
  17. package/dist/esm/components/heatmap/Heatmap.js +11 -16
  18. package/dist/esm/components/matrixplot/Matrixplot.js +11 -16
  19. package/dist/esm/components/obs-list/ObsItem.js +14 -14
  20. package/dist/esm/components/obs-list/ObsList.js +24 -23
  21. package/dist/esm/components/pseudospatial/Pseudospatial.js +25 -31
  22. package/dist/esm/components/scatterplot/Scatterplot.js +35 -29
  23. package/dist/esm/components/scatterplot/ScatterplotControls.js +9 -3
  24. package/dist/esm/components/var-list/VarList.js +16 -14
  25. package/dist/esm/components/violin/Violin.js +21 -25
  26. package/dist/esm/context/DatasetContext.js +4 -4
  27. package/dist/esm/context/SettingsContext.js +176 -41
  28. package/dist/esm/utils/Filter.js +15 -10
  29. package/dist/esm/utils/Resolver.js +176 -0
  30. package/dist/esm/utils/zarrData.js +16 -17
  31. 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 _settings$selectedObs2, _settings$selectedObs5, _settings$selectedObs8, _features$features2, _obsmData$serverError, _xData$serverError, _obsData$serverError, _labelObsData$serverE, _settings$selectedVar, _settings$selectedObs9, _data$positions;
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
- values = !xData.serverError ? xData.data : values;
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
- values = !obsData.serverError ? obsData.data : values;
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
- var _settings$selectedObs;
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, settings.colorEncoding, (_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.type]);
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
- var _settings$selectedObs3, _settings$selectedObs4;
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, (_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.type]);
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 && (_settings$selectedObs6 = settings.selectedObs) !== null && _settings$selectedObs6 !== void 0 && _settings$selectedObs6.colors ? {
231
- colorscale: (_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.colors
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, (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.colors]);
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 && settings.selectedObs && !_.some(settings.labelObs, {
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(settings.selectedObs, (_data$values = data.values) === null || _data$values === void 0 ? void 0 : _data$values[getOriginalIndex(index)]));
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 = _.find(settings.labelObs, o => o.name === k);
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) || 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.length && ((_labelObsData$serverE = labelObsData.serverError) === null || _labelObsData$serverE === void 0 ? void 0 : _labelObsData$serverE.length) || coordsError;
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(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 ? (_settings$selectedObs9 = settings.selectedObs) === null || _settings$selectedObs9 === void 0 ? void 0 : _settings$selectedObs9.name : null,
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 isCategorical = settings.colorEncoding === COLOR_ENCODINGS.OBS ? ((_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.type) === OBS_TYPES.CATEGORICAL : false;
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 * (settings.controls.valueRange[1] - settings.controls.valueRange[0]) + settings.controls.valueRange[0]).toFixed(2);
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(v => v.index)
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(v => v.index)
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 [active, setActive] = useState(mode === SELECTION_MODES.SINGLE ? ((_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.matrix_index) || ((_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name) : settings.selectedMultiVar.map(i => i.matrix_index || i.name));
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
- var _settings$selectedVar3, _settings$selectedVar4;
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, settings.selectedVar]);
75
+ }, [mode, selectedVar]);
74
76
  useEffect(() => {
75
77
  if (mode === SELECTION_MODES.MULTIPLE) {
76
- setActive(settings.selectedMultiVar.map(i => i.matrix_index || i.name));
78
+ setActive(selectedMultiVar.map(i => i.matrix_index || i.name));
77
79
  }
78
- }, [mode, settings.selectedMultiVar]);
79
- const varMeans = useVarMean(settings.vars, settings.varSort.var.sort === VAR_SORT.MATRIX);
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(settings.vars, o => {
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(settings.vars, "name", settings.varSort.var.sortOrder));
92
+ setSortedVars(_.orderBy(settingsVars, "name", settings.varSort.var.sortOrder));
91
93
  } else {
92
- setSortedVars(settings.vars);
94
+ setSortedVars(settingsVars);
93
95
  }
94
- }, [settings.varSort.var.sort, settings.varSort.var.sortOrder, varMeans.isPending, varMeans.serverError, varMeans.fetchedData, settings.vars]);
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: settings.selectedMultiVar.map(i => i.isSet ? {
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: (_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet ? {
55
- name: (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name,
56
- indices: (_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars.map(v => v.index)
57
- } : (_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.index,
58
- obsCol: settings.selectedObs,
59
- obsValues: !((_settings$selectedObs = settings.selectedObs) !== null && _settings$selectedObs !== void 0 && _settings$selectedObs.omit.length) ? null : _.difference(_.values((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.codes), (_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.omit).map(c => {
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 (settings.selectedMultiVar.length) {
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: settings.selectedMultiVar.map(i => i.isSet ? {
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 (settings.selectedObs && settings.selectedVar) {
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: (_settings$selectedVar5 = settings.selectedVar) !== null && _settings$selectedVar5 !== void 0 && _settings$selectedVar5.isSet ? {
99
- name: (_settings$selectedVar6 = settings.selectedVar) === null || _settings$selectedVar6 === void 0 ? void 0 : _settings$selectedVar6.name,
100
- indices: (_settings$selectedVar7 = settings.selectedVar) === null || _settings$selectedVar7 === void 0 ? void 0 : _settings$selectedVar7.vars.map(v => v.index)
101
- } : (_settings$selectedVar8 = settings.selectedVar) === null || _settings$selectedVar8 === void 0 ? void 0 : _settings$selectedVar8.index,
102
- obsCol: settings.selectedObs,
103
- obsValues: !((_settings$selectedObs5 = settings.selectedObs) !== null && _settings$selectedObs5 !== void 0 && _settings$selectedObs5.omit.length) ? null : _.difference(_.values((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.codes), (_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.omit).map(c => {
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, settings.selectedMultiVar, settings.selectedObs, settings.selectedVar, dataset.url, dataset.varNamesCol, obsIndices, isSliced, mode]);
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-13.6fc43290" || "0.0.0"
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() {