@haniffalab/cherita-react 1.4.1-dev.2025-08-13.6fc43290 → 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 +175 -40
- package/dist/cjs/utils/Filter.js +15 -10
- package/dist/cjs/utils/Resolver.js +188 -0
- package/dist/cjs/utils/zarrData.js +16 -17
- package/dist/esm/components/dotplot/Dotplot.js +12 -16
- package/dist/esm/components/heatmap/Heatmap.js +11 -16
- package/dist/esm/components/matrixplot/Matrixplot.js +11 -16
- package/dist/esm/components/obs-list/ObsItem.js +14 -14
- package/dist/esm/components/obs-list/ObsList.js +24 -23
- package/dist/esm/components/pseudospatial/Pseudospatial.js +25 -31
- package/dist/esm/components/scatterplot/Scatterplot.js +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 +176 -41
- package/dist/esm/utils/Filter.js +15 -10
- package/dist/esm/utils/Resolver.js +176 -0
- package/dist/esm/utils/zarrData.js +16 -17
- package/package.json +2 -2
|
@@ -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
|
|
43
|
-
const xParams = (0, _react.useMemo)(() => {
|
|
44
|
-
|
|
45
|
-
|
|
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,
|
|
49
|
-
}
|
|
50
|
-
|
|
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
|
|
67
|
-
obs = obs ||
|
|
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,
|
|
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:
|
|
42
|
-
obsValues: !(
|
|
43
|
-
|
|
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 (
|
|
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:
|
|
69
|
-
obsValues: !(
|
|
70
|
-
|
|
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,
|
|
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:
|
|
41
|
-
obsValues: !(
|
|
42
|
-
|
|
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 (
|
|
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:
|
|
63
|
-
obsValues: !(
|
|
64
|
-
|
|
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
|
-
}, [
|
|
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:
|
|
41
|
-
obsValues: !(
|
|
42
|
-
|
|
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 (
|
|
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:
|
|
64
|
-
obsValues: !(
|
|
65
|
-
|
|
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,
|
|
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:
|
|
64
|
-
name:
|
|
65
|
-
indices:
|
|
66
|
-
} :
|
|
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:
|
|
75
|
-
name:
|
|
76
|
-
indices:
|
|
77
|
-
} :
|
|
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
|
-
}, [
|
|
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 && !!
|
|
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.
|
|
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.
|
|
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$
|
|
117
|
-
if (!obsCols[(_settings$
|
|
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$
|
|
135
|
-
const omit = item.omit.length ? [] :
|
|
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$
|
|
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 = _.
|
|
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$
|
|
188
|
+
var _settings$selectedObs7;
|
|
188
189
|
let omit;
|
|
189
|
-
if (_.includes(item.omit,
|
|
190
|
-
omit = item.omit.filter(i => i !==
|
|
190
|
+
if (_.includes(item.omit, value)) {
|
|
191
|
+
omit = item.omit.filter(i => i !== value);
|
|
191
192
|
} else {
|
|
192
|
-
omit = [...item.omit,
|
|
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$
|
|
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$
|
|
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 = _.
|
|
219
|
-
const inSliceObs = settings.sliceBy.obs && ((_settings$
|
|
220
|
-
const isColorEncoding = (showSelectedAsActive || settings.colorEncoding === COLOR_ENCODINGS.OBS) && ((_settings$
|
|
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:
|
|
47
|
-
name:
|
|
48
|
-
indices:
|
|
49
|
-
} :
|
|
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:
|
|
52
|
-
obsValues: !(
|
|
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:
|
|
61
|
-
obsValues: !(
|
|
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:
|
|
71
|
-
obsValues: !(
|
|
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,
|
|
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
|
|
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
|
-
|
|
104
|
-
|
|
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] * (
|
|
158
|
-
max: settings.controls.range[1] * (
|
|
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,
|
|
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) {
|