@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
@@ -7,6 +7,7 @@ exports.useXData = exports.useObsmData = exports.useObsData = exports.useLabelOb
7
7
  var _react = require("react");
8
8
  var _lodash = _interopRequireDefault(require("lodash"));
9
9
  var _zarr = require("zarr");
10
+ var _Resolver = require("./Resolver");
10
11
  var _constants = require("../constants/constants");
11
12
  var _DatasetContext = require("../context/DatasetContext");
12
13
  var _SettingsContext = require("../context/SettingsContext");
@@ -39,21 +40,18 @@ const meanData = (_i, data) => {
39
40
  const useXData = function () {
40
41
  let agg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : meanData;
41
42
  const dataset = (0, _DatasetContext.useDataset)();
42
- const settings = (0, _SettingsContext.useSettings)();
43
- const xParams = (0, _react.useMemo)(() => {
44
- var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3;
45
- return !settings.selectedVar ? [] : !((_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet) ? [{
43
+ const selectedVar = (0, _Resolver.useSelectedVar)();
44
+ const xParams = (0, _react.useMemo)(() => !selectedVar ? [] : !(selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet) ? [{
45
+ url: dataset.url,
46
+ path: "X",
47
+ s: [null, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.matrix_index]
48
+ }] : _lodash.default.map(selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars, v => {
49
+ return {
46
50
  url: dataset.url,
47
51
  path: "X",
48
- s: [null, (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.matrix_index]
49
- }] : _lodash.default.map((_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars, v => {
50
- return {
51
- url: dataset.url,
52
- path: "X",
53
- s: [null, v.matrix_index]
54
- };
55
- });
56
- }, [dataset.url, settings.selectedVar]);
52
+ s: [null, v.matrix_index]
53
+ };
54
+ }), [dataset.url, selectedVar]);
57
55
  return (0, _zarrHelper.useMultipleZarr)(xParams, _zarrHelper.GET_OPTIONS, {
58
56
  enabled: !!xParams.length
59
57
  }, agg);
@@ -63,8 +61,8 @@ const useObsData = function () {
63
61
  var _obs3, _obs4;
64
62
  let obs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
65
63
  const dataset = (0, _DatasetContext.useDataset)();
66
- const settings = (0, _SettingsContext.useSettings)();
67
- obs = obs || settings.selectedObs;
64
+ const selectedObs = (0, _Resolver.useSelectedObs)();
65
+ obs = obs || selectedObs;
68
66
  const obsParams = (0, _react.useMemo)(() => {
69
67
  var _obs, _obs2;
70
68
  return {
@@ -80,13 +78,14 @@ exports.useObsData = useObsData;
80
78
  const useLabelObsData = () => {
81
79
  const dataset = (0, _DatasetContext.useDataset)();
82
80
  const settings = (0, _SettingsContext.useSettings)();
83
- const labelObsParams = (0, _react.useMemo)(() => _lodash.default.map(settings.labelObs, obs => {
81
+ const labelObsParams = (0, _react.useMemo)(() => _lodash.default.map(settings.labelObs, obsName => {
82
+ const obs = settings.data.obs[obsName] || null;
84
83
  return {
85
84
  url: dataset.url,
86
85
  path: "obs/" + obs.name + (obs.type === _constants.OBS_TYPES.CATEGORICAL ? "/codes" : ""),
87
86
  key: obs.name
88
87
  };
89
- }), [dataset.url, settings.labelObs]);
88
+ }), [dataset.url, settings.data.obs, settings.labelObs]);
90
89
  return (0, _zarrHelper.useMultipleZarr)(labelObsParams, _zarrHelper.GET_OPTIONS, {
91
90
  enabled: !!labelObsParams.length
92
91
  });
@@ -13,9 +13,9 @@ import { useFilteredData } from "../../context/FilterContext";
13
13
  import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
14
14
  import { LoadingSpinner } from "../../utils/LoadingIndicators";
15
15
  import { useDebouncedFetch } from "../../utils/requests";
16
+ import { useSelectedMultiVar, useSelectedObs } from "../../utils/Resolver";
16
17
  import { ControlsPlotlyToolbar, ObsPlotlyToolbar, VarPlotlyToolbar } from "../toolbar/Toolbar";
17
18
  export function Dotplot(_ref) {
18
- var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
19
19
  let {
20
20
  showObsBtn = false,
21
21
  showVarsBtn = false,
@@ -36,14 +36,13 @@ export function Dotplot(_ref) {
36
36
  const [data, setData] = useState([]);
37
37
  const [layout, setLayout] = useState({});
38
38
  const [hasSelections, setHasSelections] = useState(false);
39
+ const selectedObs = useSelectedObs();
40
+ const selectedMultiVar = useSelectedMultiVar();
39
41
  const [params, setParams] = useState({
40
42
  url: dataset.url,
41
- obsCol: settings.selectedObs,
42
- 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 => {
43
- var _settings$selectedObs4;
44
- return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
45
- }),
46
- varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
43
+ obsCol: selectedObs,
44
+ 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),
45
+ varKeys: selectedMultiVar.map(i => i.isSet ? {
47
46
  name: i.name,
48
47
  indices: i.vars.map(v => v.index)
49
48
  } : i.index),
@@ -56,21 +55,17 @@ export function Dotplot(_ref) {
56
55
  // @TODO: set default scale
57
56
 
58
57
  useEffect(() => {
59
- if (settings.selectedObs && settings.selectedMultiVar.length) {
58
+ if (selectedObs && selectedMultiVar.length) {
60
59
  setHasSelections(true);
61
60
  } else {
62
61
  setHasSelections(false);
63
62
  }
64
63
  setParams(p => {
65
- var _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
66
64
  return _objectSpread(_objectSpread({}, p), {}, {
67
65
  url: dataset.url,
68
- obsCol: settings.selectedObs,
69
- 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 => {
70
- var _settings$selectedObs8;
71
- return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
72
- }),
73
- varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
66
+ obsCol: selectedObs,
67
+ 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),
68
+ varKeys: selectedMultiVar.map(i => i.isSet ? {
74
69
  name: i.name,
75
70
  indices: i.vars.map(v => v.index)
76
71
  } : i.index),
@@ -81,7 +76,7 @@ export function Dotplot(_ref) {
81
76
  varNamesCol: dataset.varNamesCol
82
77
  });
83
78
  });
84
- }, [dataset.url, settings.selectedObs, settings.selectedMultiVar, settings.controls.scale.dotplot, settings.controls.meanOnlyExpressed, settings.controls.expressionCutoff, dataset.varNamesCol, isSliced, obsIndices]);
79
+ }, [dataset.url, selectedObs, settings.controls.scale.dotplot, settings.controls.meanOnlyExpressed, settings.controls.expressionCutoff, dataset.varNamesCol, isSliced, obsIndices, selectedMultiVar]);
85
80
  const updateColorscale = useCallback(colorscale => {
86
81
  setLayout(l => {
87
82
  return _objectSpread(_objectSpread({}, l), {}, {
@@ -102,6 +97,7 @@ export function Dotplot(_ref) {
102
97
  if (hasSelections && !isPending && !serverError) {
103
98
  setData(fetchedData.data);
104
99
  setLayout(fetchedData.layout);
100
+ // @TODO: keep colorAxis range from settings
105
101
  dispatch({
106
102
  type: "set.controls.colorAxis",
107
103
  colorAxis: {
@@ -13,9 +13,9 @@ import { useFilteredData } from "../../context/FilterContext";
13
13
  import { useSettings } from "../../context/SettingsContext";
14
14
  import { LoadingSpinner } from "../../utils/LoadingIndicators";
15
15
  import { useDebouncedFetch } from "../../utils/requests";
16
+ import { useSelectedMultiVar, useSelectedObs } from "../../utils/Resolver";
16
17
  import { ControlsPlotlyToolbar, ObsPlotlyToolbar, VarPlotlyToolbar } from "../toolbar/Toolbar";
17
18
  export function Heatmap(_ref) {
18
- var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
19
19
  let {
20
20
  showObsBtn = false,
21
21
  showVarsBtn = false,
@@ -35,14 +35,13 @@ export function Heatmap(_ref) {
35
35
  const [data, setData] = useState([]);
36
36
  const [layout, setLayout] = useState({});
37
37
  const [hasSelections, setHasSelections] = useState(false);
38
+ const selectedObs = useSelectedObs();
39
+ const selectedMultiVar = useSelectedMultiVar();
38
40
  const [params, setParams] = useState({
39
41
  url: dataset.url,
40
- obsCol: settings.selectedObs,
41
- 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 => {
42
- var _settings$selectedObs4;
43
- return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
44
- }),
45
- varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
42
+ obsCol: selectedObs,
43
+ 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),
44
+ varKeys: selectedMultiVar.map(i => i.isSet ? {
46
45
  name: i.name,
47
46
  indices: i.vars.map(v => v.index)
48
47
  } : i.index),
@@ -50,21 +49,17 @@ export function Heatmap(_ref) {
50
49
  varNamesCol: dataset.varNamesCol
51
50
  });
52
51
  useEffect(() => {
53
- if (settings.selectedObs && settings.selectedMultiVar.length) {
52
+ if (selectedObs && selectedMultiVar.length) {
54
53
  setHasSelections(true);
55
54
  } else {
56
55
  setHasSelections(false);
57
56
  }
58
57
  setParams(p => {
59
- var _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
60
58
  return _objectSpread(_objectSpread({}, p), {}, {
61
59
  url: dataset.url,
62
- obsCol: settings.selectedObs,
63
- 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 => {
64
- var _settings$selectedObs8;
65
- return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
66
- }),
67
- varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
60
+ obsCol: selectedObs,
61
+ 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),
62
+ varKeys: selectedMultiVar.map(i => i.isSet ? {
68
63
  name: i.name,
69
64
  indices: i.vars.map(v => v.index)
70
65
  } : i.index),
@@ -72,7 +67,7 @@ export function Heatmap(_ref) {
72
67
  varNamesCol: dataset.varNamesCol
73
68
  });
74
69
  });
75
- }, [settings.selectedMultiVar, settings.selectedObs, dataset.url, dataset.varNamesCol, obsIndices, isSliced]);
70
+ }, [selectedMultiVar, selectedObs, dataset.url, dataset.varNamesCol, obsIndices, isSliced]);
76
71
  const updateColorscale = useCallback(colorscale => {
77
72
  setLayout(l => {
78
73
  return _objectSpread(_objectSpread({}, l), {}, {
@@ -13,9 +13,9 @@ import { useFilteredData } from "../../context/FilterContext";
13
13
  import { useSettings } from "../../context/SettingsContext";
14
14
  import { LoadingSpinner } from "../../utils/LoadingIndicators";
15
15
  import { useDebouncedFetch } from "../../utils/requests";
16
+ import { useSelectedMultiVar, useSelectedObs } from "../../utils/Resolver";
16
17
  import { ControlsPlotlyToolbar, ObsPlotlyToolbar, VarPlotlyToolbar } from "../toolbar/Toolbar";
17
18
  export function Matrixplot(_ref) {
18
- var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
19
19
  let {
20
20
  showObsBtn = false,
21
21
  showVarsBtn = false,
@@ -35,14 +35,13 @@ export function Matrixplot(_ref) {
35
35
  const [data, setData] = useState([]);
36
36
  const [layout, setLayout] = useState({});
37
37
  const [hasSelections, setHasSelections] = useState(false);
38
+ const selectedObs = useSelectedObs();
39
+ const selectedMultiVar = useSelectedMultiVar();
38
40
  const [params, setParams] = useState({
39
41
  url: dataset.url,
40
- obsCol: settings.selectedObs,
41
- 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 => {
42
- var _settings$selectedObs4;
43
- return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
44
- }),
45
- varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
42
+ obsCol: selectedObs,
43
+ 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),
44
+ varKeys: selectedMultiVar.map(i => i.isSet ? {
46
45
  name: i.name,
47
46
  indices: i.vars.map(v => v.index)
48
47
  } : i.index),
@@ -51,21 +50,17 @@ export function Matrixplot(_ref) {
51
50
  varNamesCol: dataset.varNamesCol
52
51
  });
53
52
  useEffect(() => {
54
- if (settings.selectedObs && settings.selectedMultiVar.length) {
53
+ if (selectedObs && selectedMultiVar.length) {
55
54
  setHasSelections(true);
56
55
  } else {
57
56
  setHasSelections(false);
58
57
  }
59
58
  setParams(p => {
60
- var _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
61
59
  return _objectSpread(_objectSpread({}, p), {}, {
62
60
  url: dataset.url,
63
- obsCol: settings.selectedObs,
64
- 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 => {
65
- var _settings$selectedObs8;
66
- return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
67
- }),
68
- varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
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
+ varKeys: selectedMultiVar.map(i => i.isSet ? {
69
64
  name: i.name,
70
65
  indices: i.vars.map(v => v.index)
71
66
  } : i.index),
@@ -74,7 +69,7 @@ export function Matrixplot(_ref) {
74
69
  varNamesCol: dataset.varNamesCol
75
70
  });
76
71
  });
77
- }, [settings.controls.scale.matrixplot, settings.selectedMultiVar, settings.selectedObs, dataset.url, dataset.varNamesCol, obsIndices, isSliced]);
72
+ }, [settings.controls.scale.matrixplot, selectedMultiVar, selectedObs, dataset.url, dataset.varNamesCol, obsIndices, isSliced]);
78
73
  const updateColorscale = useCallback(colorscale => {
79
74
  setLayout(l => {
80
75
  return _objectSpread(_objectSpread({}, l), {}, {
@@ -17,6 +17,7 @@ import { useColor } from "../../helpers/color-helper";
17
17
  import { Histogram } from "../../utils/Histogram";
18
18
  import { LoadingLinear } from "../../utils/LoadingIndicators";
19
19
  import { useFetch } from "../../utils/requests";
20
+ import { useSelectedVar } from "../../utils/Resolver";
20
21
  import { formatNumerical, FORMATS } from "../../utils/string";
21
22
  import { VirtualizedList } from "../../utils/VirtualizedList";
22
23
  import { useObsData } from "../../utils/zarrData";
@@ -45,7 +46,6 @@ function getContinuousLabel(code, binEdges) {
45
46
  return "[ ".concat(formatNumerical(binEdges[code][0]), ", ").concat(formatNumerical(binEdges[code][1], FORMATS.EXPONENTIAL)).concat(code === binEdges.length - 1 ? " ]" : " )");
46
47
  }
47
48
  const useObsHistogram = (obs, _ref) => {
48
- var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedVar9, _settings$selectedVar0, _settings$selectedVar1, _settings$selectedVar10;
49
49
  let {
50
50
  enabled = true
51
51
  } = _ref;
@@ -56,31 +56,31 @@ const useObsHistogram = (obs, _ref) => {
56
56
  obsIndices,
57
57
  isSliced
58
58
  } = useFilteredData();
59
+ const selectedVar = useSelectedVar();
59
60
  const [params, setParams] = useState({
60
61
  url: dataset.url,
61
62
  obsCol: _.omit(obs, "omit"),
62
63
  // avoid re-rendering when toggling unselected obs
63
- varKey: (_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet ? {
64
- name: (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name,
65
- indices: (_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars.map(v => v.index)
66
- } : (_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.index,
64
+ varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
65
+ name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
66
+ indices: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars.map(v => v.index)
67
+ } : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index,
67
68
  obsIndices: isSliced ? [...(obsIndices || [])] : null
68
69
  });
69
70
  useEffect(() => {
70
71
  setParams(p => {
71
- var _settings$selectedVar5, _settings$selectedVar6, _settings$selectedVar7, _settings$selectedVar8;
72
72
  return _objectSpread(_objectSpread({}, p), {}, {
73
73
  obsCol: _.omit(obs, "omit"),
74
- varKey: (_settings$selectedVar5 = settings.selectedVar) !== null && _settings$selectedVar5 !== void 0 && _settings$selectedVar5.isSet ? {
75
- name: (_settings$selectedVar6 = settings.selectedVar) === null || _settings$selectedVar6 === void 0 ? void 0 : _settings$selectedVar6.name,
76
- indices: (_settings$selectedVar7 = settings.selectedVar) === null || _settings$selectedVar7 === void 0 ? void 0 : _settings$selectedVar7.vars.map(v => v.index)
77
- } : (_settings$selectedVar8 = settings.selectedVar) === null || _settings$selectedVar8 === void 0 ? void 0 : _settings$selectedVar8.index,
74
+ varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
75
+ name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
76
+ indices: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars.map(v => v.index)
77
+ } : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index,
78
78
  obsIndices: isSliced ? [...(obsIndices || [])] : null
79
79
  });
80
80
  });
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]);
81
+ }, [selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.isSet, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars, obsIndices, isSliced, obs]);
82
82
  return useFetch(ENDPOINT, params, {
83
- enabled: enabled && !!settings.selectedVar && settings.colorEncoding === COLOR_ENCODINGS.VAR,
83
+ enabled: enabled && !!selectedVar && settings.colorEncoding === COLOR_ENCODINGS.VAR,
84
84
  refetchOnMount: false
85
85
  });
86
86
  };
@@ -283,7 +283,7 @@ export function CategoricalObs(_ref3) {
283
283
  value_counts: obs.value_counts[obs.values[index]],
284
284
  pct: obs.value_counts[obs.values[index]] / totalCounts * 100
285
285
  },
286
- isOmitted: _.includes(obs.omit, obs.codes[obs.values[index]]),
286
+ isOmitted: _.includes(obs.omit, obs.values[index]),
287
287
  label: obs.values[index],
288
288
  histogramData: enabledHistograms ? {
289
289
  data: (_obsHistograms$fetche = obsHistograms.fetchedData) === null || _obsHistograms$fetche === void 0 ? void 0 : _obsHistograms$fetche[obs.values[index]],
@@ -420,7 +420,7 @@ export function ContinuousObs(_ref5) {
420
420
  value_counts: obs.value_counts[obs.values[index]],
421
421
  pct: obs.value_counts[obs.values[index]] / totalCounts * 100
422
422
  },
423
- isOmitted: _.includes(obs.omit, obs.codes[obs.values[index]]),
423
+ isOmitted: _.includes(obs.omit, obs.values[index]),
424
424
  label: getLabel(index),
425
425
  histogramData: enabledHistograms ? {
426
426
  data: (_obsHistograms$fetche2 = obsHistograms.fetchedData) === null || _obsHistograms$fetche2 === void 0 ? void 0 : _obsHistograms$fetche2[obs.values[index]],
@@ -45,7 +45,7 @@ const ObsAccordionToggle = _ref => {
45
45
  }, children));
46
46
  };
47
47
  export function ObsColsList(_ref2) {
48
- var _settings$selectedObs;
48
+ var _settings$selectedObs, _settings$selectedObs3, _settings$selectedObs4;
49
49
  let {
50
50
  showColor = true,
51
51
  enableObsGroups = true,
@@ -104,17 +104,22 @@ export function ObsColsList(_ref2) {
104
104
  return d.type !== OBS_TYPES.DISCRETE;
105
105
  });
106
106
  setObsCols(_.keyBy(_.map(filteredData, d => {
107
+ var _settings$selectedObs2;
108
+ if (((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.name) === d.name) {
109
+ return _objectSpread(_objectSpread({}, d), {}, {
110
+ omit: settings.selectedObs.omit || []
111
+ });
112
+ }
107
113
  return _objectSpread(_objectSpread({}, d), {}, {
108
- codesMap: _.invert(d.codes),
109
114
  omit: []
110
115
  });
111
116
  }), "name"));
112
117
  }
113
- }, [fetchedData, isPending, obsGroups, serverError, enableGroups]);
118
+ }, [fetchedData, isPending, obsGroups, serverError, enableGroups, (_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.name, (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.omit]);
114
119
  useEffect(() => {
115
120
  if (obsCols) {
116
- var _settings$selectedObs2;
117
- if (!obsCols[(_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.name]) {
121
+ var _settings$selectedObs5;
122
+ if (!obsCols[(_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.name]) {
118
123
  setActive([]);
119
124
  dispatch({
120
125
  type: "select.obs",
@@ -131,8 +136,8 @@ export function ObsColsList(_ref2) {
131
136
  }
132
137
  };
133
138
  const toggleAll = item => {
134
- var _settings$selectedObs3;
135
- const omit = item.omit.length ? [] : _.map(item.values, v => item.codes[v]);
139
+ var _settings$selectedObs6;
140
+ const omit = item.omit.length ? [] : item.values;
136
141
  setObsCols(o => {
137
142
  return _objectSpread(_objectSpread({}, o), {}, {
138
143
  [item.name]: _objectSpread(_objectSpread({}, item), {}, {
@@ -140,7 +145,7 @@ export function ObsColsList(_ref2) {
140
145
  })
141
146
  });
142
147
  });
143
- if (((_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.name) === item.name) {
148
+ if (((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name) {
144
149
  dispatch({
145
150
  type: "select.obs",
146
151
  obs: _objectSpread(_objectSpread({}, item), {}, {
@@ -150,7 +155,7 @@ export function ObsColsList(_ref2) {
150
155
  }
151
156
  };
152
157
  const toggleLabel = item => {
153
- const inLabelObs = _.some(settings.labelObs, i => i.name === item.name);
158
+ const inLabelObs = _.includes(settings.labelObs, item.name);
154
159
  if (inLabelObs) {
155
160
  dispatch({
156
161
  type: "remove.label.obs",
@@ -159,11 +164,7 @@ export function ObsColsList(_ref2) {
159
164
  } else {
160
165
  dispatch({
161
166
  type: "add.label.obs",
162
- obs: {
163
- name: item.name,
164
- type: item.type,
165
- codesMap: item.codesMap
166
- }
167
+ obs: item
167
168
  });
168
169
  }
169
170
  };
@@ -184,12 +185,12 @@ export function ObsColsList(_ref2) {
184
185
  });
185
186
  };
186
187
  const toggleObs = (item, value) => {
187
- var _settings$selectedObs4;
188
+ var _settings$selectedObs7;
188
189
  let omit;
189
- if (_.includes(item.omit, item.codes[value])) {
190
- omit = item.omit.filter(i => i !== item.codes[value]);
190
+ if (_.includes(item.omit, value)) {
191
+ omit = item.omit.filter(i => i !== value);
191
192
  } else {
192
- omit = [...item.omit, item.codes[value]];
193
+ omit = [...item.omit, value];
193
194
  }
194
195
  setObsCols(o => {
195
196
  return _objectSpread(_objectSpread({}, o), {}, {
@@ -198,7 +199,7 @@ export function ObsColsList(_ref2) {
198
199
  })
199
200
  });
200
201
  });
201
- if (((_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.name) === item.name) {
202
+ if (((_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.name) === item.name) {
202
203
  dispatch({
203
204
  type: "select.obs",
204
205
  obs: _objectSpread(_objectSpread({}, item), {}, {
@@ -208,16 +209,16 @@ export function ObsColsList(_ref2) {
208
209
  }
209
210
  };
210
211
  const obsItem = item => {
211
- var _settings$selectedObs5, _settings$selectedObs6;
212
+ var _settings$selectedObs8, _settings$selectedObs9;
212
213
  if (!item) {
213
214
  return null;
214
215
  }
215
216
  if (item.type === OBS_TYPES.DISCRETE) {
216
217
  return null;
217
218
  }
218
- const inLabelObs = _.some(settings.labelObs, i => i.name === item.name);
219
- const inSliceObs = settings.sliceBy.obs && ((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.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
+ const inLabelObs = _.includes(settings.labelObs, item.name);
220
+ const inSliceObs = settings.sliceBy.obs && ((_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.name) === item.name;
221
+ const isColorEncoding = (showSelectedAsActive || settings.colorEncoding === COLOR_ENCODINGS.OBS) && ((_settings$selectedObs9 = settings.selectedObs) === null || _settings$selectedObs9 === void 0 ? void 0 : _settings$selectedObs9.name) === item.name;
221
222
  return /*#__PURE__*/React.createElement("div", {
222
223
  className: "accordion-item",
223
224
  key: item.name
@@ -18,9 +18,9 @@ import { ImageViewer } from "../../utils/ImageViewer";
18
18
  import { Legend } from "../../utils/Legend";
19
19
  import { LoadingSpinner } from "../../utils/LoadingIndicators";
20
20
  import { useDebouncedFetch } from "../../utils/requests";
21
+ import { useSelectedObs, useSelectedVar } from "../../utils/Resolver";
21
22
  library.add(faSliders);
22
23
  function usePseudospatialData(plotType) {
23
- var _settings$selectedVar5, _settings$selectedVar6, _settings$selectedVar7, _settings$selectedVar8;
24
24
  const ENDPOINT = "pseudospatial";
25
25
  const dataset = useDataset();
26
26
  const settings = useSettings();
@@ -28,6 +28,8 @@ function usePseudospatialData(plotType) {
28
28
  obsIndices,
29
29
  isSliced
30
30
  } = useFilteredData();
31
+ const selectedVar = useSelectedVar();
32
+ const selectedObs = useSelectedObs();
31
33
  const baseParams = useMemo(() => {
32
34
  return {
33
35
  url: dataset.url,
@@ -41,40 +43,28 @@ function usePseudospatialData(plotType) {
41
43
  }, [dataset.url, settings.pseudospatial.maskSet, settings.pseudospatial.maskValues, dataset.varNamesCol, isSliced, obsIndices]);
42
44
  const getPlotParams = useCallback(() => {
43
45
  if (plotType === PLOT_TYPES.GENE) {
44
- var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
45
46
  return _objectSpread({
46
- varKey: (_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet ? {
47
- name: (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name,
48
- indices: (_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars.map(v => v.index)
49
- } : (_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.index
47
+ varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
48
+ name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
49
+ indices: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars.map(v => v.index)
50
+ } : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index
50
51
  }, settings.sliceBy.obs ? {
51
- obsCol: settings.selectedObs,
52
- 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 => {
53
- var _settings$selectedObs4;
54
- return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
55
- })
52
+ obsCol: selectedObs,
53
+ 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)
56
54
  } : {});
57
55
  } else if (plotType === PLOT_TYPES.CATEGORICAL) {
58
- var _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
59
56
  return {
60
- obsCol: settings.selectedObs,
61
- 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 => {
62
- var _settings$selectedObs8;
63
- return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
64
- }),
57
+ obsCol: selectedObs,
58
+ 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),
65
59
  mode: settings.pseudospatial.categoricalMode
66
60
  };
67
61
  } else if (plotType === "continuous") {
68
- var _settings$selectedObs9, _settings$selectedObs0, _settings$selectedObs1;
69
62
  return {
70
- obsCol: settings.selectedObs,
71
- obsValues: !((_settings$selectedObs9 = settings.selectedObs) !== null && _settings$selectedObs9 !== void 0 && _settings$selectedObs9.omit.length) ? null : _.difference(_.values((_settings$selectedObs0 = settings.selectedObs) === null || _settings$selectedObs0 === void 0 ? void 0 : _settings$selectedObs0.codes), (_settings$selectedObs1 = settings.selectedObs) === null || _settings$selectedObs1 === void 0 ? void 0 : _settings$selectedObs1.omit).map(c => {
72
- var _settings$selectedObs10;
73
- return (_settings$selectedObs10 = settings.selectedObs) === null || _settings$selectedObs10 === void 0 ? void 0 : _settings$selectedObs10.codesMap[c];
74
- })
63
+ obsCol: selectedObs,
64
+ 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)
75
65
  };
76
66
  }
77
- }, [settings.pseudospatial.categoricalMode, settings.selectedObs, (_settings$selectedVar5 = settings.selectedVar) === null || _settings$selectedVar5 === void 0 ? void 0 : _settings$selectedVar5.index, (_settings$selectedVar6 = settings.selectedVar) === null || _settings$selectedVar6 === void 0 ? void 0 : _settings$selectedVar6.isSet, (_settings$selectedVar7 = settings.selectedVar) === null || _settings$selectedVar7 === void 0 ? void 0 : _settings$selectedVar7.name, (_settings$selectedVar8 = settings.selectedVar) === null || _settings$selectedVar8 === void 0 ? void 0 : _settings$selectedVar8.vars, settings.sliceBy.obs, plotType]);
67
+ }, [settings.pseudospatial.categoricalMode, selectedObs, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.isSet, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars, settings.sliceBy.obs, plotType]);
78
68
  const params = useMemo(() => {
79
69
  return _objectSpread(_objectSpread({}, baseParams), getPlotParams());
80
70
  }, [baseParams, getPlotParams]);
@@ -83,7 +73,7 @@ function usePseudospatialData(plotType) {
83
73
  });
84
74
  }
85
75
  export function Pseudospatial(_ref) {
86
- var _settings$selectedObs14, _layout$coloraxis3, _layout$coloraxis4;
76
+ var _layout$coloraxis3, _layout$coloraxis4;
87
77
  let {
88
78
  showLegend = true,
89
79
  sharedScaleRange = false,
@@ -99,10 +89,14 @@ export function Pseudospatial(_ref) {
99
89
  getColor
100
90
  } = useColor();
101
91
  const colorscale = useRef(settings.controls.colorScale);
92
+ const {
93
+ valueMin,
94
+ valueMax
95
+ } = useFilteredData();
96
+ const selectedObs = useSelectedObs();
102
97
  useEffect(() => {
103
- var _settings$selectedObs11, _settings$selectedObs12, _settings$selectedObs13;
104
- setPlotType(settings.colorEncoding === COLOR_ENCODINGS.VAR ? PLOT_TYPES.GENE : ((_settings$selectedObs11 = settings.selectedObs) === null || _settings$selectedObs11 === void 0 ? void 0 : _settings$selectedObs11.type) === OBS_TYPES.CATEGORICAL || ((_settings$selectedObs12 = settings.selectedObs) === null || _settings$selectedObs12 === void 0 ? void 0 : _settings$selectedObs12.type) === OBS_TYPES.BOOLEAN ? PLOT_TYPES.CATEGORICAL : ((_settings$selectedObs13 = settings.selectedObs) === null || _settings$selectedObs13 === void 0 ? void 0 : _settings$selectedObs13.type) === OBS_TYPES.CONTINUOUS ? PLOT_TYPES.CONTINUOUS : PLOT_TYPES.MASKS);
105
- }, [settings.colorEncoding, (_settings$selectedObs14 = settings.selectedObs) === null || _settings$selectedObs14 === void 0 ? void 0 : _settings$selectedObs14.type, setPlotType]);
98
+ setPlotType(settings.colorEncoding === COLOR_ENCODINGS.VAR ? PLOT_TYPES.GENE : (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === OBS_TYPES.CATEGORICAL || (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === OBS_TYPES.BOOLEAN ? PLOT_TYPES.CATEGORICAL : (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === OBS_TYPES.CONTINUOUS ? PLOT_TYPES.CONTINUOUS : PLOT_TYPES.MASKS);
99
+ }, [settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type, setPlotType]);
106
100
  const updateColorscale = useCallback(colorscale => {
107
101
  setLayout(l => {
108
102
  return _objectSpread(_objectSpread({}, l), {}, {
@@ -154,8 +148,8 @@ export function Pseudospatial(_ref) {
154
148
  min,
155
149
  max
156
150
  } = {
157
- min: settings.controls.range[0] * (settings.controls.valueRange[1] - settings.controls.valueRange[0]) + settings.controls.valueRange[0],
158
- max: settings.controls.range[1] * (settings.controls.valueRange[1] - settings.controls.valueRange[0]) + settings.controls.valueRange[0]
151
+ min: settings.controls.range[0] * (valueMax - valueMin) + valueMin,
152
+ max: settings.controls.range[1] * (valueMax - valueMin) + valueMin
159
153
  };
160
154
  setData(d => {
161
155
  return _.map(d, trace => {
@@ -183,7 +177,7 @@ export function Pseudospatial(_ref) {
183
177
  });
184
178
  });
185
179
  }
186
- }, [settings.controls.range, settings.controls.valueMax, settings.controls.valueMin, settings.controls.valueRange, getColor, sharedScaleRange]);
180
+ }, [settings.controls.range, settings.controls.valueMax, settings.controls.valueMin, getColor, sharedScaleRange, valueMax, valueMin]);
187
181
  const hasSelections = !!plotType && !!settings.pseudospatial.maskSet;
188
182
  const faSlidersPath = faSliders.icon[4];
189
183
  if (!serverError) {