@haniffalab/cherita-react 0.2.0-dev.2024-12-16.f02cfae4 → 0.2.0-dev.2024-12-16.6be54149
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/components/dotplot/Dotplot.js +8 -1
- package/dist/components/full-page/FullPage.js +31 -1
- package/dist/components/heatmap/Heatmap.js +8 -1
- package/dist/components/matrixplot/Matrixplot.js +8 -1
- package/dist/components/obs-list/ObsItem.js +69 -21
- package/dist/components/obs-list/ObsList.js +19 -3
- package/dist/components/pseudospatial/Pseudospatial.js +9 -2
- package/dist/components/pseudospatial/PseudospatialToolbar.js +3 -1
- package/dist/components/scatterplot/Scatterplot.js +26 -108
- package/dist/components/var-list/VarItem.js +24 -50
- package/dist/components/var-list/VarList.js +5 -2
- package/dist/components/violin/Violin.js +9 -2
- package/dist/context/DatasetContext.js +16 -2
- package/dist/context/FilterContext.js +10 -25
- package/dist/context/ZarrDataContext.js +37 -0
- package/dist/css/cherita.css +5 -0
- package/dist/css/cherita.css.map +1 -1
- package/dist/helpers/zarr-helper.js +36 -18
- package/dist/index.js +6 -0
- package/dist/utils/Filter.js +155 -0
- package/dist/utils/Histogram.js +54 -0
- package/dist/utils/Legend.js +3 -2
- package/dist/utils/VirtualizedList.js +2 -2
- package/dist/utils/requests.js +8 -2
- package/dist/utils/search.js +4 -2
- package/dist/utils/string.js +4 -0
- package/package.json +2 -2
- package/scss/cherita.scss +5 -0
|
@@ -11,7 +11,6 @@ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
|
|
|
11
11
|
var _reactFontawesome = require("@fortawesome/react-fontawesome");
|
|
12
12
|
var _editModes = require("@nebula.gl/edit-modes");
|
|
13
13
|
var _layers2 = require("@nebula.gl/layers");
|
|
14
|
-
var _turf = require("@turf/turf");
|
|
15
14
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
16
15
|
var _reactBootstrap = require("react-bootstrap");
|
|
17
16
|
var _SpatialControls = require("./SpatialControls");
|
|
@@ -19,6 +18,7 @@ var _Toolbox = require("./Toolbox");
|
|
|
19
18
|
var _constants = require("../../constants/constants");
|
|
20
19
|
var _DatasetContext = require("../../context/DatasetContext");
|
|
21
20
|
var _FilterContext = require("../../context/FilterContext");
|
|
21
|
+
var _ZarrDataContext = require("../../context/ZarrDataContext");
|
|
22
22
|
var _colorHelper = require("../../helpers/color-helper");
|
|
23
23
|
var _mapHelper = require("../../helpers/map-helper");
|
|
24
24
|
var _Legend = require("../../utils/Legend");
|
|
@@ -38,14 +38,18 @@ const INITIAL_VIEW_STATE = {
|
|
|
38
38
|
pitch: 0,
|
|
39
39
|
bearing: 0
|
|
40
40
|
};
|
|
41
|
-
const EPSILON = 1e-6;
|
|
42
41
|
function Scatterplot(_ref) {
|
|
43
42
|
let {
|
|
44
43
|
radius = 30
|
|
45
44
|
} = _ref;
|
|
46
45
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
46
|
+
const {
|
|
47
|
+
obsIndices,
|
|
48
|
+
valueMin,
|
|
49
|
+
valueMax,
|
|
50
|
+
slicedLength
|
|
51
|
+
} = (0, _FilterContext.useFilteredData)();
|
|
47
52
|
const dispatch = (0, _DatasetContext.useDatasetDispatch)();
|
|
48
|
-
const filterDispatch = (0, _FilterContext.useFilteredDataDispatch)();
|
|
49
53
|
const {
|
|
50
54
|
getColor
|
|
51
55
|
} = (0, _colorHelper.useColor)();
|
|
@@ -63,12 +67,14 @@ function Scatterplot(_ref) {
|
|
|
63
67
|
const [mode, setMode] = (0, _react.useState)(() => _editModes.ViewMode);
|
|
64
68
|
const [features, setFeatures] = (0, _react.useState)({
|
|
65
69
|
type: "FeatureCollection",
|
|
66
|
-
features: []
|
|
70
|
+
features: dataset.polygons[dataset.selectedObsm] || []
|
|
67
71
|
});
|
|
68
72
|
const [selectedFeatureIndexes, setSelectedFeatureIndexes] = (0, _react.useState)([]);
|
|
69
|
-
const
|
|
70
|
-
|
|
71
|
-
|
|
73
|
+
const {
|
|
74
|
+
obsmData,
|
|
75
|
+
xData,
|
|
76
|
+
obsData
|
|
77
|
+
} = (0, _ZarrDataContext.useZarrData)();
|
|
72
78
|
const labelObsData = (0, _zarrData.useLabelObsData)();
|
|
73
79
|
// @TODO: assert length of obsmData, xData, obsData is equal
|
|
74
80
|
|
|
@@ -187,101 +193,6 @@ function Scatterplot(_ref) {
|
|
|
187
193
|
return false;
|
|
188
194
|
}
|
|
189
195
|
}, [dataset.colorEncoding, dataset.selectedObs?.type]);
|
|
190
|
-
const isInBins = (v, binEdges, indices) => {
|
|
191
|
-
const lastEdge = _lodash.default.last(binEdges);
|
|
192
|
-
const allButLastEdges = _lodash.default.initial(binEdges);
|
|
193
|
-
// add epsilon to last edge to include the last value
|
|
194
|
-
const modifiedBinEdges = [...allButLastEdges, [lastEdge[0], lastEdge[1] + EPSILON]];
|
|
195
|
-
const binIndices = _lodash.default.difference(_lodash.default.range(binEdges.length), indices);
|
|
196
|
-
const ranges = _lodash.default.at(modifiedBinEdges, binIndices);
|
|
197
|
-
return _lodash.default.some(ranges, range => _lodash.default.inRange(v, ...range));
|
|
198
|
-
};
|
|
199
|
-
const isInSlice = (0, _react.useCallback)((index, values, positions) => {
|
|
200
|
-
let inSlice = true;
|
|
201
|
-
if (isCategorical && values) {
|
|
202
|
-
inSlice &= !_lodash.default.includes(dataset.selectedObs?.omit, values[index]);
|
|
203
|
-
} else if ((dataset.sliceBy.obs || dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && dataset.selectedObs?.type === _constants.OBS_TYPES.CONTINUOUS) && !!dataset.selectedObs?.omit.length && values) {
|
|
204
|
-
if (dataset.selectedObs.type === _constants.OBS_TYPES.CATEGORICAL) {
|
|
205
|
-
inSlice &= !_lodash.default.includes(dataset.selectedObs.omit, values[index]);
|
|
206
|
-
} else if (dataset.selectedObs.type === _constants.OBS_TYPES.CONTINUOUS) {
|
|
207
|
-
if (isNaN(values[index])) {
|
|
208
|
-
inSlice &= !_lodash.default.includes(dataset.selectedObs.omit, -1);
|
|
209
|
-
} else {
|
|
210
|
-
inSlice &= isInBins(values[index], dataset.selectedObs.bins.binEdges, _lodash.default.without(dataset.selectedObs.omit, -1));
|
|
211
|
-
}
|
|
212
|
-
}
|
|
213
|
-
}
|
|
214
|
-
if (dataset.sliceBy.polygons && positions) {
|
|
215
|
-
inSlice &= _lodash.default.some(features?.features, (_f, i) => {
|
|
216
|
-
return (0, _turf.booleanPointInPolygon)((0, _turf.point)([positions[index][0], positions[index][1]]), features.features[i]);
|
|
217
|
-
});
|
|
218
|
-
}
|
|
219
|
-
return inSlice;
|
|
220
|
-
}, [dataset.colorEncoding, dataset.selectedObs?.bins?.binEdges, dataset.selectedObs?.omit, dataset.selectedObs?.type, dataset.sliceBy.obs, dataset.sliceBy.polygons, features.features, isCategorical]);
|
|
221
|
-
|
|
222
|
-
// @TODO: abstract filtering out of this component, maybe in FilterContext ?
|
|
223
|
-
const {
|
|
224
|
-
filteredIndices,
|
|
225
|
-
valueMin,
|
|
226
|
-
valueMax,
|
|
227
|
-
slicedLength
|
|
228
|
-
} = (0, _react.useMemo)(() => {
|
|
229
|
-
if (dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR) {
|
|
230
|
-
const {
|
|
231
|
-
filtered,
|
|
232
|
-
filteredIndices
|
|
233
|
-
} = _lodash.default.reduce(data.values, (acc, v, i) => {
|
|
234
|
-
if (isInSlice(i, data.sliceValues, data.positions)) {
|
|
235
|
-
acc.filtered.push(v);
|
|
236
|
-
acc.filteredIndices.add(i);
|
|
237
|
-
}
|
|
238
|
-
return acc;
|
|
239
|
-
}, {
|
|
240
|
-
filtered: [],
|
|
241
|
-
filteredIndices: new Set()
|
|
242
|
-
});
|
|
243
|
-
return {
|
|
244
|
-
filteredIndices: filteredIndices,
|
|
245
|
-
valueMin: _lodash.default.min(filtered),
|
|
246
|
-
valueMax: _lodash.default.max(filtered),
|
|
247
|
-
slicedLength: filtered.length
|
|
248
|
-
};
|
|
249
|
-
} else if (dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS) {
|
|
250
|
-
const isContinuous = dataset.selectedObs?.type === _constants.OBS_TYPES.CONTINUOUS;
|
|
251
|
-
const {
|
|
252
|
-
filtered,
|
|
253
|
-
filteredIndices
|
|
254
|
-
} = _lodash.default.reduce(data.values, (acc, v, i) => {
|
|
255
|
-
if (isInSlice(i, data.values, data.positions)) {
|
|
256
|
-
acc.filtered.push(v);
|
|
257
|
-
acc.filteredIndices.add(i);
|
|
258
|
-
}
|
|
259
|
-
return acc;
|
|
260
|
-
}, {
|
|
261
|
-
filtered: [],
|
|
262
|
-
filteredIndices: new Set()
|
|
263
|
-
});
|
|
264
|
-
return {
|
|
265
|
-
filteredIndices: filteredIndices,
|
|
266
|
-
valueMin: _lodash.default.min(isContinuous ? filtered : data.values),
|
|
267
|
-
valueMax: _lodash.default.max(isContinuous ? filtered : data.values),
|
|
268
|
-
slicedLength: filtered.length
|
|
269
|
-
};
|
|
270
|
-
} else {
|
|
271
|
-
return {
|
|
272
|
-
filteredIndices: null,
|
|
273
|
-
valueMin: _lodash.default.min(data.values),
|
|
274
|
-
valueMax: _lodash.default.max(data.values),
|
|
275
|
-
slicedLength: data.values.length
|
|
276
|
-
};
|
|
277
|
-
}
|
|
278
|
-
}, [data.positions, data.sliceValues, data.values, dataset.colorEncoding, dataset.selectedObs?.type, isInSlice]);
|
|
279
|
-
(0, _react.useEffect)(() => {
|
|
280
|
-
filterDispatch({
|
|
281
|
-
type: "set.obs.indices",
|
|
282
|
-
indices: dataset.sliceBy.obs || dataset.sliceBy.polygons ? filteredIndices : null
|
|
283
|
-
});
|
|
284
|
-
}, [dataset.sliceBy.obs, dataset.sliceBy.polygons, filterDispatch, filteredIndices]);
|
|
285
196
|
(0, _react.useEffect)(() => {
|
|
286
197
|
dispatch({
|
|
287
198
|
type: "set.controls.valueRange",
|
|
@@ -299,22 +210,22 @@ function Scatterplot(_ref) {
|
|
|
299
210
|
let {
|
|
300
211
|
index
|
|
301
212
|
} = _ref2;
|
|
302
|
-
const grayOut =
|
|
213
|
+
const grayOut = obsIndices && !obsIndices.has(index);
|
|
303
214
|
return getColor({
|
|
304
215
|
value: (data.values[index] - min) / (max - min),
|
|
305
216
|
categorical: isCategorical,
|
|
306
217
|
grayOut: grayOut
|
|
307
218
|
});
|
|
308
|
-
}, [data.values,
|
|
219
|
+
}, [data.values, obsIndices, getColor, isCategorical, max, min]);
|
|
309
220
|
|
|
310
221
|
// @TODO: add support for pseudospatial hover to reflect in radius
|
|
311
222
|
const getRadius = (0, _react.useCallback)((_d, _ref3) => {
|
|
312
223
|
let {
|
|
313
224
|
index
|
|
314
225
|
} = _ref3;
|
|
315
|
-
const grayOut =
|
|
226
|
+
const grayOut = obsIndices && !obsIndices.has(index);
|
|
316
227
|
return grayOut ? 1 : 3;
|
|
317
|
-
}, [
|
|
228
|
+
}, [obsIndices]);
|
|
318
229
|
const memoizedLayers = (0, _react.useMemo)(() => {
|
|
319
230
|
return [new _layers.ScatterplotLayer({
|
|
320
231
|
id: "cherita-layer-scatterplot",
|
|
@@ -373,6 +284,13 @@ function Scatterplot(_ref) {
|
|
|
373
284
|
});
|
|
374
285
|
}
|
|
375
286
|
}, [dispatch, features?.features?.length]);
|
|
287
|
+
(0, _react.useEffect)(() => {
|
|
288
|
+
dispatch({
|
|
289
|
+
type: "set.polygons",
|
|
290
|
+
obsm: dataset.selectedObsm,
|
|
291
|
+
polygons: features?.features || []
|
|
292
|
+
});
|
|
293
|
+
}, [dataset.selectedObsm, dispatch, features.features]);
|
|
376
294
|
function onLayerClick(info) {
|
|
377
295
|
if (mode !== _editModes.ViewMode) {
|
|
378
296
|
// don't change selection while editing
|
|
@@ -393,7 +311,7 @@ function Scatterplot(_ref) {
|
|
|
393
311
|
object,
|
|
394
312
|
index
|
|
395
313
|
} = _ref5;
|
|
396
|
-
if (!object) return;
|
|
314
|
+
if (!object || object?.type === "Feature") return;
|
|
397
315
|
const text = [];
|
|
398
316
|
if (dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && dataset.selectedObs && !_lodash.default.some(dataset.labelObs, {
|
|
399
317
|
name: dataset.selectedObs.name
|
|
@@ -410,7 +328,7 @@ function Scatterplot(_ref) {
|
|
|
410
328
|
}));
|
|
411
329
|
}
|
|
412
330
|
if (!text.length) return;
|
|
413
|
-
const grayOut =
|
|
331
|
+
const grayOut = obsIndices && !obsIndices.has(index);
|
|
414
332
|
return {
|
|
415
333
|
text: text.length ? _lodash.default.compact(text).join("\n") : null,
|
|
416
334
|
className: grayOut ? "tooltip-grayout" : "deck-tooltip",
|
|
@@ -9,16 +9,13 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
9
9
|
var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
|
|
10
10
|
var _reactFontawesome = require("@fortawesome/react-fontawesome");
|
|
11
11
|
var _iconsMaterial = require("@mui/icons-material");
|
|
12
|
-
var _xCharts = require("@mui/x-charts");
|
|
13
|
-
var _colorPalettes = require("@mui/x-charts/colorPalettes");
|
|
14
12
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
13
|
var _reactBootstrap = require("react-bootstrap");
|
|
16
14
|
var _constants = require("../../constants/constants");
|
|
17
15
|
var _DatasetContext = require("../../context/DatasetContext");
|
|
18
16
|
var _FilterContext = require("../../context/FilterContext");
|
|
19
|
-
var
|
|
17
|
+
var _Histogram = require("../../utils/Histogram");
|
|
20
18
|
var _requests = require("../../utils/requests");
|
|
21
|
-
var _string = require("../../utils/string");
|
|
22
19
|
var _VirtualizedList = require("../../utils/VirtualizedList");
|
|
23
20
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
24
21
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -30,21 +27,25 @@ function VarHistogram(_ref) {
|
|
|
30
27
|
} = _ref;
|
|
31
28
|
const ENDPOINT = "var/histograms";
|
|
32
29
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
33
|
-
const
|
|
30
|
+
const {
|
|
31
|
+
obsIndices
|
|
32
|
+
} = (0, _FilterContext.useFilteredData)();
|
|
33
|
+
// @TODO: consider using Filter's isSliced; would trigger more re-renders/requests
|
|
34
|
+
// const { obsIndices, isSliced } = useFilteredData();
|
|
34
35
|
const isSliced = dataset.sliceBy.obs || dataset.sliceBy.polygons;
|
|
35
36
|
const [params, setParams] = (0, _react.useState)({
|
|
36
37
|
url: dataset.url,
|
|
37
38
|
varKey: item.matrix_index,
|
|
38
|
-
obsIndices: isSliced
|
|
39
|
+
obsIndices: isSliced ? [...(obsIndices || [])] : null
|
|
39
40
|
});
|
|
40
41
|
(0, _react.useEffect)(() => {
|
|
41
42
|
setParams(p => {
|
|
42
43
|
return {
|
|
43
44
|
...p,
|
|
44
|
-
obsIndices: isSliced
|
|
45
|
+
obsIndices: isSliced ? [...(obsIndices || [])] : null
|
|
45
46
|
};
|
|
46
47
|
});
|
|
47
|
-
}, [
|
|
48
|
+
}, [obsIndices, isSliced]);
|
|
48
49
|
const {
|
|
49
50
|
fetchedData,
|
|
50
51
|
isPending,
|
|
@@ -52,39 +53,10 @@ function VarHistogram(_ref) {
|
|
|
52
53
|
} = (0, _requests.useDebouncedFetch)(ENDPOINT, params, {
|
|
53
54
|
refetchOnMount: false
|
|
54
55
|
});
|
|
55
|
-
return /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_xCharts.SparkLineChart, {
|
|
60
|
-
plotType: "bar",
|
|
61
|
-
data: fetchedData.log10,
|
|
62
|
-
margin: {
|
|
63
|
-
top: 0,
|
|
64
|
-
right: 0,
|
|
65
|
-
bottom: 0,
|
|
66
|
-
left: 0
|
|
67
|
-
},
|
|
68
|
-
colors: isSliced ? _colorPalettes.mangoFusionPalette : _colorPalettes.blueberryTwilightPalette,
|
|
69
|
-
showHighlight: true,
|
|
70
|
-
showTooltip: true,
|
|
71
|
-
valueFormatter: (v, _ref2) => {
|
|
72
|
-
let {
|
|
73
|
-
dataIndex
|
|
74
|
-
} = _ref2;
|
|
75
|
-
return `${(0, _string.formatNumerical)(fetchedData.hist[dataIndex])}`;
|
|
76
|
-
},
|
|
77
|
-
xAxis: {
|
|
78
|
-
data: _lodash.default.range(fetchedData.bin_edges?.length) || null,
|
|
79
|
-
valueFormatter: v => `Bin [${(0, _string.formatNumerical)(fetchedData.bin_edges[v][0], _string.FORMATS.EXPONENTIAL)}, ${(0, _string.formatNumerical)(fetchedData.bin_edges[v][1], _string.FORMATS.EXPONENTIAL)}${v === fetchedData.bin_edges.length - 1 ? "]" : ")"}`
|
|
80
|
-
},
|
|
81
|
-
slotProps: {
|
|
82
|
-
popper: {
|
|
83
|
-
className: "feature-histogram-tooltip"
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
})
|
|
87
|
-
}) : null
|
|
56
|
+
return !serverError && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Histogram.Histogram, {
|
|
57
|
+
data: fetchedData,
|
|
58
|
+
isPending: isPending,
|
|
59
|
+
altColor: isSliced
|
|
88
60
|
});
|
|
89
61
|
}
|
|
90
62
|
function VarDiseaseInfoItem(item) {
|
|
@@ -134,10 +106,10 @@ function VarDiseaseInfoItem(item) {
|
|
|
134
106
|
})
|
|
135
107
|
}, item.disease_name);
|
|
136
108
|
}
|
|
137
|
-
function VarDiseaseInfo(
|
|
109
|
+
function VarDiseaseInfo(_ref2) {
|
|
138
110
|
let {
|
|
139
111
|
data
|
|
140
|
-
} =
|
|
112
|
+
} = _ref2;
|
|
141
113
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
142
114
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup, {
|
|
143
115
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_VirtualizedList.VirtualizedList, {
|
|
@@ -150,7 +122,7 @@ function VarDiseaseInfo(_ref3) {
|
|
|
150
122
|
})
|
|
151
123
|
});
|
|
152
124
|
}
|
|
153
|
-
function SingleSelectionItem(
|
|
125
|
+
function SingleSelectionItem(_ref3) {
|
|
154
126
|
let {
|
|
155
127
|
item,
|
|
156
128
|
isActive,
|
|
@@ -159,7 +131,7 @@ function SingleSelectionItem(_ref4) {
|
|
|
159
131
|
isDiseaseGene = false,
|
|
160
132
|
showSetColorEncoding = true,
|
|
161
133
|
showRemove = true
|
|
162
|
-
} =
|
|
134
|
+
} = _ref3;
|
|
163
135
|
const ENDPOINT = "disease/gene";
|
|
164
136
|
const [openInfo, setOpenInfo] = (0, _react.useState)(false);
|
|
165
137
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
@@ -172,7 +144,9 @@ function SingleSelectionItem(_ref4) {
|
|
|
172
144
|
fetchedData,
|
|
173
145
|
isPending,
|
|
174
146
|
serverError
|
|
175
|
-
} = (0, _requests.useFetch)(ENDPOINT, params
|
|
147
|
+
} = (0, _requests.useFetch)(ENDPOINT, params, {
|
|
148
|
+
refetchOnMount: false
|
|
149
|
+
});
|
|
176
150
|
const hasDiseaseInfo = !isPending && !serverError && !!fetchedData.length;
|
|
177
151
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
|
|
178
152
|
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
@@ -227,12 +201,12 @@ function SingleSelectionItem(_ref4) {
|
|
|
227
201
|
})]
|
|
228
202
|
});
|
|
229
203
|
}
|
|
230
|
-
function MultipleSelectionItem(
|
|
204
|
+
function MultipleSelectionItem(_ref4) {
|
|
231
205
|
let {
|
|
232
206
|
item,
|
|
233
207
|
isActive,
|
|
234
208
|
toggleVar
|
|
235
|
-
} =
|
|
209
|
+
} = _ref4;
|
|
236
210
|
const isNotInData = item.matrix_index === -1;
|
|
237
211
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
238
212
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
@@ -252,14 +226,14 @@ function MultipleSelectionItem(_ref5) {
|
|
|
252
226
|
})
|
|
253
227
|
});
|
|
254
228
|
}
|
|
255
|
-
function VarItem(
|
|
229
|
+
function VarItem(_ref5) {
|
|
256
230
|
let {
|
|
257
231
|
item,
|
|
258
232
|
active,
|
|
259
233
|
setVarButtons,
|
|
260
234
|
mode = _constants.SELECTION_MODES.SINGLE,
|
|
261
235
|
isDiseaseGene = false
|
|
262
|
-
} =
|
|
236
|
+
} = _ref5;
|
|
263
237
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
264
238
|
const dispatch = (0, _DatasetContext.useDatasetDispatch)();
|
|
265
239
|
const selectVar = () => {
|
|
@@ -30,6 +30,7 @@ const useVarMean = function (varKeys) {
|
|
|
30
30
|
name: v.name,
|
|
31
31
|
indices: v.vars.map(v => v.index)
|
|
32
32
|
} : v.index),
|
|
33
|
+
// obsIndices:
|
|
33
34
|
varNamesCol: dataset.varNamesCol
|
|
34
35
|
});
|
|
35
36
|
(0, _react.useEffect)(() => {
|
|
@@ -44,7 +45,8 @@ const useVarMean = function (varKeys) {
|
|
|
44
45
|
});
|
|
45
46
|
}, [varKeys]);
|
|
46
47
|
return (0, _requests.useFetch)(ENDPOINT, params, {
|
|
47
|
-
enabled: enabled
|
|
48
|
+
enabled: enabled,
|
|
49
|
+
refetchOnMount: false
|
|
48
50
|
});
|
|
49
51
|
};
|
|
50
52
|
|
|
@@ -74,7 +76,8 @@ function DiseaseVarList(_ref) {
|
|
|
74
76
|
});
|
|
75
77
|
}, [dataset.selectedDisease]);
|
|
76
78
|
const diseaseData = (0, _requests.useFetch)(ENDPOINT, params, {
|
|
77
|
-
enabled: !!params.diseaseId
|
|
79
|
+
enabled: !!params.diseaseId,
|
|
80
|
+
refetchOnMount: false
|
|
78
81
|
});
|
|
79
82
|
(0, _react.useEffect)(() => {
|
|
80
83
|
if (!diseaseData.isPending && !diseaseData.serverError) {
|
|
@@ -12,6 +12,7 @@ var _reactBootstrap = require("react-bootstrap");
|
|
|
12
12
|
var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
|
|
13
13
|
var _constants = require("../../constants/constants");
|
|
14
14
|
var _DatasetContext = require("../../context/DatasetContext");
|
|
15
|
+
var _FilterContext = require("../../context/FilterContext");
|
|
15
16
|
var _LoadingIndicators = require("../../utils/LoadingIndicators");
|
|
16
17
|
var _requests = require("../../utils/requests");
|
|
17
18
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
@@ -24,6 +25,10 @@ function Violin(_ref) {
|
|
|
24
25
|
} = _ref;
|
|
25
26
|
const ENDPOINT = "violin";
|
|
26
27
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
28
|
+
const {
|
|
29
|
+
obsIndices,
|
|
30
|
+
isSliced
|
|
31
|
+
} = (0, _FilterContext.useFilteredData)();
|
|
27
32
|
const [data, setData] = (0, _react.useState)([]);
|
|
28
33
|
const [layout, setLayout] = (0, _react.useState)({});
|
|
29
34
|
const [hasSelections, setHasSelections] = (0, _react.useState)(false);
|
|
@@ -46,7 +51,8 @@ function Violin(_ref) {
|
|
|
46
51
|
indices: dataset.selectedVar?.vars.map(v => v.index)
|
|
47
52
|
} : dataset.selectedVar?.index,
|
|
48
53
|
obsCol: dataset.selectedObs,
|
|
49
|
-
obsValues: !dataset.selectedObs?.omit.length ? null : _lodash.default.difference(_lodash.default.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c])
|
|
54
|
+
obsValues: !dataset.selectedObs?.omit.length ? null : _lodash.default.difference(_lodash.default.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c]),
|
|
55
|
+
obsIndices: isSliced ? [...(obsIndices || [])] : null
|
|
50
56
|
}
|
|
51
57
|
}[mode]
|
|
52
58
|
});
|
|
@@ -89,12 +95,13 @@ function Violin(_ref) {
|
|
|
89
95
|
} : dataset.selectedVar?.index,
|
|
90
96
|
obsCol: dataset.selectedObs,
|
|
91
97
|
obsValues: !dataset.selectedObs?.omit.length ? null : _lodash.default.difference(_lodash.default.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c]),
|
|
98
|
+
obsIndices: isSliced ? [...(obsIndices || [])] : null,
|
|
92
99
|
scale: dataset.controls.scale.violinplot.value,
|
|
93
100
|
varNamesCol: dataset.varNamesCol
|
|
94
101
|
};
|
|
95
102
|
});
|
|
96
103
|
}
|
|
97
|
-
}, [dataset.controls.scale.violinplot.value, dataset.selectedMultiVar, dataset.selectedObs, dataset.selectedVar, dataset.url, dataset.varNamesCol, mode]);
|
|
104
|
+
}, [dataset.controls.scale.violinplot.value, dataset.selectedMultiVar, dataset.selectedObs, dataset.selectedVar, dataset.url, dataset.varNamesCol, obsIndices, isSliced, mode]);
|
|
98
105
|
const {
|
|
99
106
|
fetchedData,
|
|
100
107
|
isPending,
|
|
@@ -13,6 +13,7 @@ var _reactQuery = require("@tanstack/react-query");
|
|
|
13
13
|
var _reactQueryPersistClient = require("@tanstack/react-query-persist-client");
|
|
14
14
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
15
15
|
var _FilterContext = require("./FilterContext");
|
|
16
|
+
var _ZarrDataContext = require("./ZarrDataContext");
|
|
16
17
|
var _constants = require("../constants/constants");
|
|
17
18
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
18
19
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -103,7 +104,8 @@ const initialDataset = {
|
|
|
103
104
|
maskSet: null,
|
|
104
105
|
maskValues: null,
|
|
105
106
|
categoricalMode: _constants.PSEUDOSPATIAL_CATEGORICAL_MODES.ACROSS.value
|
|
106
|
-
}
|
|
107
|
+
},
|
|
108
|
+
polygons: {}
|
|
107
109
|
};
|
|
108
110
|
const initializer = initialState => {
|
|
109
111
|
const localObj = (JSON.parse(localStorage.getItem(_constants.LOCAL_STORAGE_KEY)) || {})[initialState.url] || {};
|
|
@@ -144,7 +146,9 @@ function DatasetProvider(_ref2) {
|
|
|
144
146
|
client: queryClient,
|
|
145
147
|
persistOptions: persistOptions,
|
|
146
148
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FilterContext.FilterProvider, {
|
|
147
|
-
children:
|
|
149
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ZarrDataContext.ZarrDataProvider, {
|
|
150
|
+
children: children
|
|
151
|
+
})
|
|
148
152
|
})
|
|
149
153
|
})
|
|
150
154
|
})
|
|
@@ -535,6 +539,16 @@ function datasetReducer(dataset, action) {
|
|
|
535
539
|
}
|
|
536
540
|
};
|
|
537
541
|
}
|
|
542
|
+
case "set.polygons":
|
|
543
|
+
{
|
|
544
|
+
return {
|
|
545
|
+
...dataset,
|
|
546
|
+
polygons: {
|
|
547
|
+
...dataset.polygons,
|
|
548
|
+
[action.obsm]: action.polygons
|
|
549
|
+
}
|
|
550
|
+
};
|
|
551
|
+
}
|
|
538
552
|
case "set.pseudospatial.maskSet":
|
|
539
553
|
{
|
|
540
554
|
return {
|
|
@@ -14,9 +14,11 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
|
|
|
14
14
|
const FilteredDataContext = exports.FilteredDataContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
15
15
|
const FilteredDataDispatchContext = exports.FilteredDataDispatchContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
16
16
|
const initialFilterData = {
|
|
17
|
-
obsIndices:
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
obsIndices: null,
|
|
18
|
+
valueMin: null,
|
|
19
|
+
valueMax: null,
|
|
20
|
+
slicedLength: null,
|
|
21
|
+
isSliced: false
|
|
20
22
|
};
|
|
21
23
|
function FilterProvider(_ref) {
|
|
22
24
|
let {
|
|
@@ -45,28 +47,11 @@ function filterReducer(filteredData, action) {
|
|
|
45
47
|
{
|
|
46
48
|
return {
|
|
47
49
|
...filteredData,
|
|
48
|
-
obsIndices: action.indices
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
return {
|
|
54
|
-
...filteredData,
|
|
55
|
-
obsIndices: []
|
|
56
|
-
};
|
|
57
|
-
}
|
|
58
|
-
case "set.var.indices":
|
|
59
|
-
{
|
|
60
|
-
return {
|
|
61
|
-
...filteredData,
|
|
62
|
-
varIndices: action.indices
|
|
63
|
-
};
|
|
64
|
-
}
|
|
65
|
-
case "reset.var.indices":
|
|
66
|
-
{
|
|
67
|
-
return {
|
|
68
|
-
...filteredData,
|
|
69
|
-
varIndices: []
|
|
50
|
+
obsIndices: action.indices,
|
|
51
|
+
valueMin: action.valueMin,
|
|
52
|
+
valueMax: action.valueMax,
|
|
53
|
+
slicedLength: action.slicedLength,
|
|
54
|
+
isSliced: action.isSliced
|
|
70
55
|
};
|
|
71
56
|
}
|
|
72
57
|
default:
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ZarrDataProvider = ZarrDataProvider;
|
|
7
|
+
exports.useZarrData = useZarrData;
|
|
8
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _Filter = require("../utils/Filter");
|
|
10
|
+
var _zarrData = require("../utils/zarrData");
|
|
11
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
12
|
+
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
|
|
13
|
+
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
|
|
14
|
+
const ZarrDataContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
15
|
+
function ZarrDataProvider(_ref) {
|
|
16
|
+
let {
|
|
17
|
+
children
|
|
18
|
+
} = _ref;
|
|
19
|
+
const obsmData = (0, _zarrData.useObsmData)();
|
|
20
|
+
const obsData = (0, _zarrData.useObsData)();
|
|
21
|
+
const xData = (0, _zarrData.useXData)();
|
|
22
|
+
const data = {
|
|
23
|
+
obsmData: obsmData,
|
|
24
|
+
obsData: obsData,
|
|
25
|
+
xData: xData,
|
|
26
|
+
isPending: obsmData.isPending || obsData.isPending || xData.isPending,
|
|
27
|
+
serverError: obsmData.serverError || obsData.serverError || xData.serverError
|
|
28
|
+
};
|
|
29
|
+
(0, _Filter.useFilter)(data);
|
|
30
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(ZarrDataContext.Provider, {
|
|
31
|
+
value: data,
|
|
32
|
+
children: children
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
function useZarrData() {
|
|
36
|
+
return (0, _react.useContext)(ZarrDataContext);
|
|
37
|
+
}
|
package/dist/css/cherita.css
CHANGED
|
@@ -11964,6 +11964,10 @@ textarea.form-control-lg {
|
|
|
11964
11964
|
background-color: #cce3ed;
|
|
11965
11965
|
}
|
|
11966
11966
|
|
|
11967
|
+
.obs-item {
|
|
11968
|
+
box-sizing: border-box;
|
|
11969
|
+
}
|
|
11970
|
+
|
|
11967
11971
|
.obs-value-list-check {
|
|
11968
11972
|
padding-right: 1rem;
|
|
11969
11973
|
word-break: auto-phrase;
|
|
@@ -12094,6 +12098,7 @@ textarea.form-control-lg {
|
|
|
12094
12098
|
|
|
12095
12099
|
.cherita-app-plot {
|
|
12096
12100
|
position: relative;
|
|
12101
|
+
max-height: 100%;
|
|
12097
12102
|
}
|
|
12098
12103
|
|
|
12099
12104
|
.cherita-app-obs {
|