@haniffalab/cherita-react 1.3.0 → 1.4.0-dev.2025-06-09.7cd38232
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/assets/images/plots/dotplot.svg +152 -0
- package/dist/assets/images/plots/heatmap.svg +193 -0
- package/dist/assets/images/plots/matrixplot.svg +275 -0
- package/dist/assets/images/plots/scatterplot.svg +198 -0
- package/dist/assets/images/plots/violin.svg +50 -0
- package/dist/cjs/components/dotplot/Dotplot.js +35 -5
- package/dist/cjs/components/full-page/FullPage.js +109 -50
- package/dist/cjs/components/full-page/PlotTypeSelector.js +57 -0
- package/dist/cjs/components/heatmap/Heatmap.js +35 -5
- package/dist/cjs/components/matrixplot/Matrixplot.js +35 -5
- package/dist/cjs/components/obs-list/ObsItem.js +49 -22
- package/dist/cjs/components/obs-list/ObsList.js +9 -5
- package/dist/cjs/components/scatterplot/Scatterplot.js +115 -95
- package/dist/cjs/components/scatterplot/SpatialControls.js +3 -3
- package/dist/cjs/components/search-bar/SearchInfo.js +3 -35
- package/dist/cjs/components/toolbar/Toolbar.js +102 -0
- package/dist/cjs/components/var-list/VarList.js +11 -3
- package/dist/cjs/components/violin/Violin.js +37 -6
- package/dist/cjs/constants/constants.js +14 -2
- package/dist/cjs/context/DatasetContext.js +5 -3
- package/dist/cjs/context/SettingsContext.js +77 -46
- package/dist/cjs/helpers/map-helper.js +2 -1
- package/dist/cjs/index.js +15 -21
- package/dist/css/cherita.css +76 -23
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/dotplot/Dotplot.js +36 -6
- package/dist/esm/components/full-page/FullPage.js +111 -50
- package/dist/esm/components/full-page/PlotTypeSelector.js +50 -0
- package/dist/esm/components/heatmap/Heatmap.js +36 -6
- package/dist/esm/components/matrixplot/Matrixplot.js +36 -6
- package/dist/esm/components/obs-list/ObsItem.js +49 -22
- package/dist/esm/components/obs-list/ObsList.js +9 -5
- package/dist/esm/components/scatterplot/Scatterplot.js +115 -95
- package/dist/esm/components/scatterplot/SpatialControls.js +3 -3
- package/dist/esm/components/search-bar/SearchInfo.js +1 -33
- package/dist/esm/components/toolbar/Toolbar.js +91 -0
- package/dist/esm/components/var-list/VarList.js +10 -5
- package/dist/esm/components/violin/Violin.js +39 -8
- package/dist/esm/constants/constants.js +13 -1
- package/dist/esm/context/DatasetContext.js +5 -3
- package/dist/esm/context/SettingsContext.js +77 -46
- package/dist/esm/helpers/map-helper.js +2 -1
- package/dist/esm/index.js +4 -4
- package/package.json +7 -4
- package/scss/cherita.scss +0 -1
- package/scss/components/layouts.scss +69 -1
- package/scss/components/plotly.scss +19 -14
- package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
- package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
|
@@ -16,6 +16,7 @@ var _reactBootstrap = require("react-bootstrap");
|
|
|
16
16
|
var _SpatialControls = require("./SpatialControls");
|
|
17
17
|
var _Toolbox = require("./Toolbox");
|
|
18
18
|
var _constants = require("../../constants/constants");
|
|
19
|
+
var _DatasetContext = require("../../context/DatasetContext");
|
|
19
20
|
var _FilterContext = require("../../context/FilterContext");
|
|
20
21
|
var _SettingsContext = require("../../context/SettingsContext");
|
|
21
22
|
var _ZarrDataContext = require("../../context/ZarrDataContext");
|
|
@@ -42,13 +43,16 @@ const INITIAL_VIEW_STATE = {
|
|
|
42
43
|
bearing: 0
|
|
43
44
|
};
|
|
44
45
|
function Scatterplot(_ref) {
|
|
45
|
-
var _settings$
|
|
46
|
+
var _settings$selectedObs2, _settings$selectedObs5, _settings$selectedObs8, _features$features2, _obsmData$serverError, _xData$serverError, _obsData$serverError, _labelObsData$serverE, _settings$selectedVar, _settings$selectedObs9, _data$positions;
|
|
46
47
|
let {
|
|
47
|
-
radius =
|
|
48
|
+
radius = null,
|
|
48
49
|
setShowObs,
|
|
49
50
|
setShowVars,
|
|
50
51
|
isFullscreen = false
|
|
51
52
|
} = _ref;
|
|
53
|
+
const {
|
|
54
|
+
useUnsColors
|
|
55
|
+
} = (0, _DatasetContext.useDataset)();
|
|
52
56
|
const settings = (0, _SettingsContext.useSettings)();
|
|
53
57
|
const {
|
|
54
58
|
obsIndices,
|
|
@@ -63,12 +67,13 @@ function Scatterplot(_ref) {
|
|
|
63
67
|
const deckRef = (0, _react.useRef)(null);
|
|
64
68
|
const [viewState, setViewState] = (0, _react.useState)(INITIAL_VIEW_STATE);
|
|
65
69
|
const [isRendering, setIsRendering] = (0, _react.useState)(true);
|
|
70
|
+
const [radiusScale, setRadiusScale] = (0, _react.useState)(radius || 1);
|
|
71
|
+
const [isPending, setIsPending] = (0, _react.useState)(false);
|
|
66
72
|
const [data, setData] = (0, _react.useState)({
|
|
67
|
-
ids: [],
|
|
68
73
|
positions: [],
|
|
69
|
-
values: []
|
|
70
|
-
sliceValues: []
|
|
74
|
+
values: []
|
|
71
75
|
});
|
|
76
|
+
const [coordsError, setCoordsError] = (0, _react.useState)(null);
|
|
72
77
|
|
|
73
78
|
// EditableGeoJsonLayer
|
|
74
79
|
const [mode, setMode] = (0, _react.useState)(() => _editModes.ViewMode);
|
|
@@ -85,24 +90,62 @@ function Scatterplot(_ref) {
|
|
|
85
90
|
const labelObsData = (0, _zarrData.useLabelObsData)();
|
|
86
91
|
// @TODO: assert length of obsmData, xData, obsData is equal
|
|
87
92
|
|
|
93
|
+
const getRadiusScale = (0, _react.useCallback)(bounds => {
|
|
94
|
+
if (!!radius) return radius;
|
|
95
|
+
// From 28 degrees ~= 30km -> 30m radius
|
|
96
|
+
const lonDim = bounds[1][0] - bounds[0][0];
|
|
97
|
+
const latDim = bounds[1][1] - bounds[0][1];
|
|
98
|
+
const minDim = Math.min(lonDim, latDim);
|
|
99
|
+
const rs = 0.01 / minDim * 111111;
|
|
100
|
+
return rs;
|
|
101
|
+
}, [radius]);
|
|
88
102
|
(0, _react.useEffect)(() => {
|
|
89
|
-
if (
|
|
90
|
-
|
|
91
|
-
|
|
103
|
+
if (obsmData.isPending || settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR && xData.isPending || settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && obsData.isPending) {
|
|
104
|
+
setIsPending(true);
|
|
105
|
+
} else {
|
|
106
|
+
setIsPending(false);
|
|
92
107
|
setData(d => {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
108
|
+
let values = d.values;
|
|
109
|
+
if (settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR) {
|
|
110
|
+
values = !xData.serverError ? xData.data : values;
|
|
111
|
+
} else if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS) {
|
|
112
|
+
values = !obsData.serverError ? obsData.data : values;
|
|
113
|
+
}
|
|
114
|
+
if (!obsmData.serverError && obsmData.data) {
|
|
115
|
+
if (obsmData.data[0].length !== 2) {
|
|
116
|
+
setCoordsError("Invalid coordinates. Expected 2D coordinates");
|
|
117
|
+
return {
|
|
118
|
+
positions: [],
|
|
119
|
+
values: []
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
setCoordsError(null);
|
|
123
|
+
return {
|
|
124
|
+
positions: obsmData.data,
|
|
125
|
+
values: values
|
|
126
|
+
};
|
|
127
|
+
}
|
|
128
|
+
return {
|
|
129
|
+
positions: d.positions,
|
|
130
|
+
values: values
|
|
131
|
+
};
|
|
96
132
|
});
|
|
133
|
+
}
|
|
134
|
+
}, [obsData.data, obsData.isPending, obsData.serverError, obsmData.data, obsmData.isPending, obsmData.serverError, settings.colorEncoding, xData.data, xData.isPending, xData.serverError]);
|
|
135
|
+
(0, _react.useEffect)(() => {
|
|
136
|
+
if (data.positions && !!data.positions.length) {
|
|
137
|
+
var _deckRef$current, _deckRef$current2;
|
|
97
138
|
const mapHelper = new _mapHelper.MapHelper();
|
|
98
139
|
const {
|
|
99
140
|
latitude,
|
|
100
141
|
longitude,
|
|
101
|
-
zoom
|
|
102
|
-
|
|
142
|
+
zoom,
|
|
143
|
+
bounds
|
|
144
|
+
} = mapHelper.fitBounds(data.positions, {
|
|
103
145
|
width: deckRef === null || deckRef === void 0 || (_deckRef$current = deckRef.current) === null || _deckRef$current === void 0 || (_deckRef$current = _deckRef$current.deck) === null || _deckRef$current === void 0 ? void 0 : _deckRef$current.width,
|
|
104
146
|
height: deckRef === null || deckRef === void 0 || (_deckRef$current2 = deckRef.current) === null || _deckRef$current2 === void 0 || (_deckRef$current2 = _deckRef$current2.deck) === null || _deckRef$current2 === void 0 ? void 0 : _deckRef$current2.height
|
|
105
147
|
});
|
|
148
|
+
setRadiusScale(getRadiusScale(bounds));
|
|
106
149
|
setViewState(v => {
|
|
107
150
|
return _objectSpread(_objectSpread({}, v), {}, {
|
|
108
151
|
longitude: longitude,
|
|
@@ -110,15 +153,8 @@ function Scatterplot(_ref) {
|
|
|
110
153
|
zoom: zoom
|
|
111
154
|
});
|
|
112
155
|
});
|
|
113
|
-
} else if (!obsmData.isPending && obsmData.serverError) {
|
|
114
|
-
setIsRendering(true);
|
|
115
|
-
setData(d => {
|
|
116
|
-
return _objectSpread(_objectSpread({}, d), {}, {
|
|
117
|
-
positions: []
|
|
118
|
-
});
|
|
119
|
-
});
|
|
120
156
|
}
|
|
121
|
-
}, [settings.selectedObsm, obsmData.data, obsmData.isPending, obsmData.serverError]);
|
|
157
|
+
}, [settings.selectedObsm, getRadiusScale, obsmData.data, obsmData.isPending, obsmData.serverError, data.positions]);
|
|
122
158
|
const getBounds = (0, _react.useCallback)(() => {
|
|
123
159
|
var _deckRef$current3, _deckRef$current4;
|
|
124
160
|
const {
|
|
@@ -135,65 +171,47 @@ function Scatterplot(_ref) {
|
|
|
135
171
|
zoom
|
|
136
172
|
};
|
|
137
173
|
}, [data.positions]);
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
if (!obsData.isPending && !obsData.serverError) {
|
|
161
|
-
setData(d => {
|
|
162
|
-
return _objectSpread(_objectSpread({}, d), {}, {
|
|
163
|
-
values: obsData.data
|
|
164
|
-
});
|
|
165
|
-
});
|
|
166
|
-
} else if (!obsData.isPending && obsData.serverError) {
|
|
167
|
-
setData(d => {
|
|
168
|
-
return _objectSpread(_objectSpread({}, d), {}, {
|
|
169
|
-
values: []
|
|
170
|
-
});
|
|
171
|
-
});
|
|
172
|
-
}
|
|
173
|
-
} else if (settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR && settings.sliceBy.obs) {
|
|
174
|
-
if (!obsData.isPending && !obsData.serverError) {
|
|
175
|
-
setData(d => {
|
|
176
|
-
return _objectSpread(_objectSpread({}, d), {}, {
|
|
177
|
-
sliceValues: obsData.data
|
|
178
|
-
});
|
|
179
|
-
});
|
|
180
|
-
} else if (!obsData.isPending && obsData.serverError) {
|
|
181
|
-
setData(d => {
|
|
182
|
-
return _objectSpread(_objectSpread({}, d), {}, {
|
|
183
|
-
sliceValues: []
|
|
184
|
-
});
|
|
185
|
-
});
|
|
186
|
-
}
|
|
174
|
+
|
|
175
|
+
// Make stable references for getOriginalIndex and sortedIndexMap
|
|
176
|
+
const identityGetOriginalIndex = (0, _react.useCallback)(i => i, []);
|
|
177
|
+
const identitySortedIndexMap = (0, _react.useMemo)(() => ({
|
|
178
|
+
get: key => key
|
|
179
|
+
}), []);
|
|
180
|
+
const {
|
|
181
|
+
sortedData,
|
|
182
|
+
getOriginalIndex,
|
|
183
|
+
sortedIndexMap
|
|
184
|
+
} = (0, _react.useMemo)(() => {
|
|
185
|
+
var _settings$selectedObs;
|
|
186
|
+
if ((settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR || settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && ((_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.type) === _constants.OBS_TYPES.CONTINUOUS) && data.positions && data.values && data.positions.length === data.values.length) {
|
|
187
|
+
const sortedIndices = _lodash.default.map(data.values, (_v, i) => i).sort((a, b) => data.values[a] - data.values[b]);
|
|
188
|
+
const sortedIndexMap = new Map(_lodash.default.map(sortedIndices, (originalIndex, sortedIndex) => [originalIndex, sortedIndex]));
|
|
189
|
+
return {
|
|
190
|
+
sortedData: _lodash.default.mapValues(data, (v, _k) => {
|
|
191
|
+
return v ? _lodash.default.at(v, sortedIndices) : v;
|
|
192
|
+
}),
|
|
193
|
+
getOriginalIndex: i => sortedIndices[i],
|
|
194
|
+
sortedIndexMap: sortedIndexMap
|
|
195
|
+
};
|
|
187
196
|
}
|
|
188
|
-
|
|
197
|
+
return {
|
|
198
|
+
sortedData: data,
|
|
199
|
+
getOriginalIndex: identityGetOriginalIndex,
|
|
200
|
+
// return original index
|
|
201
|
+
sortedIndexMap: identitySortedIndexMap // return original index
|
|
202
|
+
};
|
|
203
|
+
}, [data, identityGetOriginalIndex, identitySortedIndexMap, settings.colorEncoding, (_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.type]);
|
|
204
|
+
const sortedObsIndices = (0, _react.useMemo)(() => {
|
|
205
|
+
return obsIndices ? new Set(Array.from(obsIndices, i => sortedIndexMap.get(i))) : obsIndices;
|
|
206
|
+
}, [obsIndices, sortedIndexMap]);
|
|
189
207
|
const isCategorical = (0, _react.useMemo)(() => {
|
|
190
208
|
if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS) {
|
|
191
|
-
var _settings$
|
|
192
|
-
return ((_settings$
|
|
209
|
+
var _settings$selectedObs3, _settings$selectedObs4;
|
|
210
|
+
return ((_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.type) === _constants.OBS_TYPES.CATEGORICAL || ((_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.type) === _constants.OBS_TYPES.BOOLEAN;
|
|
193
211
|
} else {
|
|
194
212
|
return false;
|
|
195
213
|
}
|
|
196
|
-
}, [settings.colorEncoding, (_settings$
|
|
214
|
+
}, [settings.colorEncoding, (_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.type]);
|
|
197
215
|
(0, _react.useEffect)(() => {
|
|
198
216
|
dispatch({
|
|
199
217
|
type: "set.controls.valueRange",
|
|
@@ -208,31 +226,34 @@ function Scatterplot(_ref) {
|
|
|
208
226
|
max: settings.controls.range[1] * (valueMax - valueMin) + valueMin
|
|
209
227
|
};
|
|
210
228
|
const getFillColor = (0, _react.useCallback)((_d, _ref2) => {
|
|
229
|
+
var _settings$selectedObs6, _settings$selectedObs7;
|
|
211
230
|
let {
|
|
212
231
|
index
|
|
213
232
|
} = _ref2;
|
|
214
|
-
const grayOut =
|
|
215
|
-
return getColor({
|
|
216
|
-
value: (
|
|
233
|
+
const grayOut = isPending || sortedObsIndices && !sortedObsIndices.has(index);
|
|
234
|
+
return getColor(_objectSpread({
|
|
235
|
+
value: (sortedData.values[index] - min) / (max - min),
|
|
217
236
|
categorical: isCategorical,
|
|
218
237
|
grayOut: grayOut
|
|
219
|
-
})
|
|
220
|
-
|
|
238
|
+
}, useUnsColors && settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && (_settings$selectedObs6 = settings.selectedObs) !== null && _settings$selectedObs6 !== void 0 && _settings$selectedObs6.colors ? {
|
|
239
|
+
colorscale: (_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.colors
|
|
240
|
+
} : {})) || [0, 0, 0, 100];
|
|
241
|
+
}, [isPending, sortedObsIndices, getColor, sortedData.values, min, max, isCategorical, useUnsColors, settings.colorEncoding, (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.colors]);
|
|
221
242
|
|
|
222
243
|
// @TODO: add support for pseudospatial hover to reflect in radius
|
|
223
244
|
const getRadius = (0, _react.useCallback)((_d, _ref3) => {
|
|
224
245
|
let {
|
|
225
246
|
index
|
|
226
247
|
} = _ref3;
|
|
227
|
-
const grayOut =
|
|
248
|
+
const grayOut = sortedObsIndices && !sortedObsIndices.has(index);
|
|
228
249
|
return grayOut ? 1 : 3;
|
|
229
|
-
}, [
|
|
250
|
+
}, [sortedObsIndices]);
|
|
230
251
|
const memoizedLayers = (0, _react.useMemo)(() => {
|
|
231
252
|
return [new _layers.ScatterplotLayer({
|
|
232
253
|
id: "cherita-layer-scatterplot",
|
|
233
254
|
pickable: true,
|
|
234
|
-
data:
|
|
235
|
-
radiusScale:
|
|
255
|
+
data: sortedData.positions,
|
|
256
|
+
radiusScale: radiusScale,
|
|
236
257
|
radiusMinPixels: 1,
|
|
237
258
|
getPosition: d => d,
|
|
238
259
|
getFillColor: getFillColor,
|
|
@@ -275,7 +296,7 @@ function Scatterplot(_ref) {
|
|
|
275
296
|
}
|
|
276
297
|
}
|
|
277
298
|
})];
|
|
278
|
-
}, [
|
|
299
|
+
}, [sortedData.positions, features, getFillColor, getRadius, mode, radiusScale, selectedFeatureIndexes]);
|
|
279
300
|
const layers = (0, _react.useDeferredValue)(mode === _editModes.ViewMode ? memoizedLayers.reverse() : memoizedLayers); // draw scatterplot on top of polygons when in ViewMode
|
|
280
301
|
|
|
281
302
|
(0, _react.useEffect)(() => {
|
|
@@ -318,21 +339,21 @@ function Scatterplot(_ref) {
|
|
|
318
339
|
if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && settings.selectedObs && !_lodash.default.some(settings.labelObs, {
|
|
319
340
|
name: settings.selectedObs.name
|
|
320
341
|
})) {
|
|
321
|
-
var
|
|
322
|
-
text.push(getLabel(settings.selectedObs, (
|
|
342
|
+
var _data$values;
|
|
343
|
+
text.push(getLabel(settings.selectedObs, (_data$values = data.values) === null || _data$values === void 0 ? void 0 : _data$values[getOriginalIndex(index)]));
|
|
323
344
|
}
|
|
324
345
|
if (settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR && settings.selectedVar) {
|
|
325
|
-
var
|
|
326
|
-
text.push(getLabel(settings.selectedVar, (
|
|
346
|
+
var _data$values2;
|
|
347
|
+
text.push(getLabel(settings.selectedVar, (_data$values2 = data.values) === null || _data$values2 === void 0 ? void 0 : _data$values2[getOriginalIndex(index)], true));
|
|
327
348
|
}
|
|
328
349
|
if (settings.labelObs.length) {
|
|
329
350
|
text.push(..._lodash.default.map(labelObsData.data, (v, k) => {
|
|
330
351
|
const labelObs = _lodash.default.find(settings.labelObs, o => o.name === k);
|
|
331
|
-
return getLabel(labelObs, v[index]);
|
|
352
|
+
return getLabel(labelObs, v[getOriginalIndex(index)]);
|
|
332
353
|
}));
|
|
333
354
|
}
|
|
334
355
|
if (!text.length) return;
|
|
335
|
-
const grayOut =
|
|
356
|
+
const grayOut = sortedObsIndices && !sortedObsIndices.has(index);
|
|
336
357
|
return {
|
|
337
358
|
text: text.length ? _lodash.default.compact(text).join("\n") : null,
|
|
338
359
|
className: grayOut ? "tooltip-grayout" : "deck-tooltip",
|
|
@@ -345,8 +366,7 @@ function Scatterplot(_ref) {
|
|
|
345
366
|
}
|
|
346
367
|
};
|
|
347
368
|
};
|
|
348
|
-
const
|
|
349
|
-
const error = settings.selectedObsm && ((_obsmData$serverError = obsmData.serverError) === null || _obsmData$serverError === void 0 ? void 0 : _obsmData$serverError.length) || settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR && ((_xData$serverError = xData.serverError) === null || _xData$serverError === void 0 ? void 0 : _xData$serverError.length) || settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && ((_obsData$serverError = obsData.serverError) === null || _obsData$serverError === void 0 ? void 0 : _obsData$serverError.length) || settings.labelObs.lengh && ((_labelObsData$serverE = labelObsData.serverError) === null || _labelObsData$serverE === void 0 ? void 0 : _labelObsData$serverE.length);
|
|
369
|
+
const error = settings.selectedObsm && ((_obsmData$serverError = obsmData.serverError) === null || _obsmData$serverError === void 0 ? void 0 : _obsmData$serverError.length) || settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR && ((_xData$serverError = xData.serverError) === null || _xData$serverError === void 0 ? void 0 : _xData$serverError.length) || settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && ((_obsData$serverError = obsData.serverError) === null || _obsData$serverError === void 0 ? void 0 : _obsData$serverError.length) || settings.labelObs.length && ((_labelObsData$serverE = labelObsData.serverError) === null || _labelObsData$serverE === void 0 ? void 0 : _labelObsData$serverE.length) || coordsError;
|
|
350
370
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
351
371
|
className: "cherita-container-scatterplot"
|
|
352
372
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
@@ -393,13 +413,13 @@ function Scatterplot(_ref) {
|
|
|
393
413
|
className: "cherita-spatial-footer"
|
|
394
414
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
395
415
|
className: "cherita-toolbox-footer"
|
|
396
|
-
}, error && !
|
|
416
|
+
}, !!error && !isRendering && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
|
|
397
417
|
variant: "danger"
|
|
398
418
|
}, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
|
|
399
419
|
icon: _freeSolidSvgIcons.faTriangleExclamation
|
|
400
420
|
}), "\xA0Error loading data"), /*#__PURE__*/_react.default.createElement(_Toolbox.Toolbox, {
|
|
401
|
-
mode: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? (_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name : settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS ? (_settings$
|
|
402
|
-
obsLength: parseInt((
|
|
421
|
+
mode: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? (_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name : settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS ? (_settings$selectedObs9 = settings.selectedObs) === null || _settings$selectedObs9 === void 0 ? void 0 : _settings$selectedObs9.name : null,
|
|
422
|
+
obsLength: parseInt((_data$positions = data.positions) === null || _data$positions === void 0 ? void 0 : _data$positions.length),
|
|
403
423
|
slicedLength: parseInt(slicedLength)
|
|
404
424
|
})), /*#__PURE__*/_react.default.createElement(_Legend.Legend, {
|
|
405
425
|
isCategorical: isCategorical,
|
|
@@ -14,9 +14,9 @@ var _reactBootstrap = require("react-bootstrap");
|
|
|
14
14
|
var _Button = _interopRequireDefault(require("react-bootstrap/Button"));
|
|
15
15
|
var _ButtonGroup = _interopRequireDefault(require("react-bootstrap/ButtonGroup"));
|
|
16
16
|
var _Dropdown = _interopRequireDefault(require("react-bootstrap/Dropdown"));
|
|
17
|
-
var _DatasetContext = require("../../context/DatasetContext");
|
|
18
17
|
var _offcanvas = require("../offcanvas");
|
|
19
18
|
var _ScatterplotControls = require("./ScatterplotControls");
|
|
19
|
+
var _constants = require("../../constants/constants");
|
|
20
20
|
var _SettingsContext = require("../../context/SettingsContext");
|
|
21
21
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
22
22
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
@@ -40,8 +40,8 @@ function SpatialControls(_ref) {
|
|
|
40
40
|
const [showControls, setShowControls] = (0, _react.useState)(false);
|
|
41
41
|
const handleCloseControls = () => setShowControls(false);
|
|
42
42
|
const handleShowControls = () => setShowControls(true);
|
|
43
|
-
const LgBreakpoint = (0, _useMediaQuery.default)(
|
|
44
|
-
const XlBreakpoint = (0, _useMediaQuery.default)(
|
|
43
|
+
const LgBreakpoint = (0, _useMediaQuery.default)(_constants.BREAKPOINTS.LG);
|
|
44
|
+
const XlBreakpoint = (0, _useMediaQuery.default)(_constants.BREAKPOINTS.XL);
|
|
45
45
|
const showObsBtn = isFullscreen ? LgBreakpoint : true;
|
|
46
46
|
const showVarsBtn = isFullscreen ? XlBreakpoint : true;
|
|
47
47
|
const onSelect = (eventKey, event) => {
|
|
@@ -15,6 +15,7 @@ var _DatasetContext = require("../../context/DatasetContext");
|
|
|
15
15
|
var _SettingsContext = require("../../context/SettingsContext");
|
|
16
16
|
var _requests = require("../../utils/requests");
|
|
17
17
|
var _VarItem = require("../var-list/VarItem");
|
|
18
|
+
var _VarList = require("../var-list/VarList");
|
|
18
19
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
19
20
|
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
|
|
20
21
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
@@ -52,39 +53,6 @@ function VarInfo(_ref) {
|
|
|
52
53
|
data: fetchedData
|
|
53
54
|
})));
|
|
54
55
|
}
|
|
55
|
-
const useVarMean = function (varKeys) {
|
|
56
|
-
let enabled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
57
|
-
const ENDPOINT = "matrix/mean";
|
|
58
|
-
const dataset = (0, _DatasetContext.useDataset)();
|
|
59
|
-
const [params, setParams] = (0, _react.useState)({
|
|
60
|
-
url: dataset.url,
|
|
61
|
-
varKeys: _lodash.default.map(varKeys, v => v.isSet ? {
|
|
62
|
-
name: v.name,
|
|
63
|
-
indices: v.vars.map(v => v.index)
|
|
64
|
-
} : v.index),
|
|
65
|
-
// obsIndices:
|
|
66
|
-
varNamesCol: dataset.varNamesCol
|
|
67
|
-
});
|
|
68
|
-
(0, _react.useEffect)(() => {
|
|
69
|
-
setParams(p => {
|
|
70
|
-
return _objectSpread(_objectSpread({}, p), {}, {
|
|
71
|
-
varKeys: _lodash.default.map(varKeys, v => v.isSet ? {
|
|
72
|
-
name: v.name,
|
|
73
|
-
indices: v.vars.map(v => v.index)
|
|
74
|
-
} : v.index)
|
|
75
|
-
});
|
|
76
|
-
});
|
|
77
|
-
}, [varKeys]);
|
|
78
|
-
return (0, _requests.useFetch)(ENDPOINT, params, {
|
|
79
|
-
enabled: enabled,
|
|
80
|
-
refetchOnMount: false
|
|
81
|
-
});
|
|
82
|
-
};
|
|
83
|
-
|
|
84
|
-
// ensure nulls are lowest values
|
|
85
|
-
const sortMeans = (i, means) => {
|
|
86
|
-
return means[i.name] || _lodash.default.min(_lodash.default.values(means)) - 1;
|
|
87
|
-
};
|
|
88
56
|
function DiseaseInfo(_ref2) {
|
|
89
57
|
let {
|
|
90
58
|
disease,
|
|
@@ -119,12 +87,12 @@ function DiseaseInfo(_ref2) {
|
|
|
119
87
|
setDiseaseVars(diseaseData.fetchedData);
|
|
120
88
|
}
|
|
121
89
|
}, [diseaseData.fetchedData, diseaseData.isPending, diseaseData.serverError]);
|
|
122
|
-
const varMeans = useVarMean(diseaseVars, !!(diseaseVars !== null && diseaseVars !== void 0 && diseaseVars.length) && settings.varSort.disease.sort === _constants.VAR_SORT.MATRIX);
|
|
90
|
+
const varMeans = (0, _VarList.useVarMean)(diseaseVars, !!(diseaseVars !== null && diseaseVars !== void 0 && diseaseVars.length) && settings.varSort.disease.sort === _constants.VAR_SORT.MATRIX);
|
|
123
91
|
(0, _react.useEffect)(() => {
|
|
124
92
|
if (settings.varSort.disease.sort === _constants.VAR_SORT.MATRIX) {
|
|
125
93
|
if (!varMeans.isPending && !varMeans.serverError) {
|
|
126
94
|
setSortedDiseaseVars(_lodash.default.orderBy(diseaseVars, o => {
|
|
127
|
-
return sortMeans(o, varMeans.fetchedData);
|
|
95
|
+
return (0, _VarList.sortMeans)(o, varMeans.fetchedData);
|
|
128
96
|
}, settings.varSort.disease.sortOrder));
|
|
129
97
|
}
|
|
130
98
|
} else if (settings.varSort.disease.sort === _constants.VAR_SORT.NAME) {
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.VarPlotlyToolbar = exports.Toolbar = exports.ObsPlotlyToolbar = exports.ControlsPlotlyToolbar = void 0;
|
|
7
|
+
var _react = _interopRequireDefault(require("react"));
|
|
8
|
+
var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
|
|
9
|
+
var _reactFontawesome = require("@fortawesome/react-fontawesome");
|
|
10
|
+
var _reactBootstrap = require("react-bootstrap");
|
|
11
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
12
|
+
const Toolbar = _ref => {
|
|
13
|
+
let {
|
|
14
|
+
showObsBtn = true,
|
|
15
|
+
showVarsBtn = true,
|
|
16
|
+
showCtrlsBtn = true,
|
|
17
|
+
setShowObs,
|
|
18
|
+
setShowVars,
|
|
19
|
+
setShowControls
|
|
20
|
+
} = _ref;
|
|
21
|
+
return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Navbar, {
|
|
22
|
+
expand: "md",
|
|
23
|
+
bg: "primary",
|
|
24
|
+
variant: "dark",
|
|
25
|
+
className: "cherita-navbar"
|
|
26
|
+
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Container, {
|
|
27
|
+
fluid: true
|
|
28
|
+
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Navbar.Toggle, {
|
|
29
|
+
"aria-controls": "navbarScroll"
|
|
30
|
+
}), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Navbar.Collapse, {
|
|
31
|
+
id: "navbarScroll"
|
|
32
|
+
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav, {
|
|
33
|
+
navbarScroll: true
|
|
34
|
+
}, showObsBtn && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Item, {
|
|
35
|
+
className: "me-2"
|
|
36
|
+
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Link, {
|
|
37
|
+
onClick: () => setShowObs(true)
|
|
38
|
+
}, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
|
|
39
|
+
icon: _freeSolidSvgIcons.faList,
|
|
40
|
+
className: "me-2"
|
|
41
|
+
}), "Explore Categories")), showVarsBtn && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Item, {
|
|
42
|
+
className: "me-2"
|
|
43
|
+
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Link, {
|
|
44
|
+
onClick: () => setShowVars(true)
|
|
45
|
+
}, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
|
|
46
|
+
icon: _freeSolidSvgIcons.faSearch,
|
|
47
|
+
className: "me-2"
|
|
48
|
+
}), "Search Genes")), showCtrlsBtn && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Item, {
|
|
49
|
+
className: "me-2"
|
|
50
|
+
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Link, {
|
|
51
|
+
onClick: () => setShowControls(true)
|
|
52
|
+
}, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
|
|
53
|
+
icon: _freeSolidSvgIcons.faSliders,
|
|
54
|
+
className: "me-2"
|
|
55
|
+
}), "Controls"))))));
|
|
56
|
+
};
|
|
57
|
+
exports.Toolbar = Toolbar;
|
|
58
|
+
const ObsPlotlyToolbar = _ref2 => {
|
|
59
|
+
let {
|
|
60
|
+
onClick
|
|
61
|
+
} = _ref2;
|
|
62
|
+
return {
|
|
63
|
+
name: "Categories",
|
|
64
|
+
icon: {
|
|
65
|
+
width: 512,
|
|
66
|
+
height: 512,
|
|
67
|
+
path: _freeSolidSvgIcons.faList.icon[4]
|
|
68
|
+
},
|
|
69
|
+
click: onClick
|
|
70
|
+
};
|
|
71
|
+
};
|
|
72
|
+
exports.ObsPlotlyToolbar = ObsPlotlyToolbar;
|
|
73
|
+
const VarPlotlyToolbar = _ref3 => {
|
|
74
|
+
let {
|
|
75
|
+
onClick
|
|
76
|
+
} = _ref3;
|
|
77
|
+
return {
|
|
78
|
+
name: "Features",
|
|
79
|
+
icon: {
|
|
80
|
+
width: 512,
|
|
81
|
+
height: 512,
|
|
82
|
+
path: _freeSolidSvgIcons.faSearch.icon[4]
|
|
83
|
+
},
|
|
84
|
+
click: onClick
|
|
85
|
+
};
|
|
86
|
+
};
|
|
87
|
+
exports.VarPlotlyToolbar = VarPlotlyToolbar;
|
|
88
|
+
const ControlsPlotlyToolbar = _ref4 => {
|
|
89
|
+
let {
|
|
90
|
+
onClick
|
|
91
|
+
} = _ref4;
|
|
92
|
+
return {
|
|
93
|
+
name: "Controls",
|
|
94
|
+
icon: {
|
|
95
|
+
width: 512,
|
|
96
|
+
height: 512,
|
|
97
|
+
path: _freeSolidSvgIcons.faSliders.icon[4]
|
|
98
|
+
},
|
|
99
|
+
click: onClick
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
exports.ControlsPlotlyToolbar = ControlsPlotlyToolbar;
|
|
@@ -4,6 +4,7 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.VarNamesList = VarNamesList;
|
|
7
|
+
exports.useVarMean = exports.sortMeans = void 0;
|
|
7
8
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
9
|
var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
|
|
9
10
|
var _reactFontawesome = require("@fortawesome/react-fontawesome");
|
|
@@ -15,6 +16,7 @@ var _VarListToolbar = require("./VarListToolbar");
|
|
|
15
16
|
var _VarSet = require("./VarSet");
|
|
16
17
|
var _constants = require("../../constants/constants");
|
|
17
18
|
var _DatasetContext = require("../../context/DatasetContext");
|
|
19
|
+
var _FilterContext = require("../../context/FilterContext");
|
|
18
20
|
var _SettingsContext = require("../../context/SettingsContext");
|
|
19
21
|
var _LoadingIndicators = require("../../utils/LoadingIndicators");
|
|
20
22
|
var _requests = require("../../utils/requests");
|
|
@@ -29,13 +31,16 @@ const useVarMean = function (varKeys) {
|
|
|
29
31
|
let enabled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
30
32
|
const ENDPOINT = "matrix/mean";
|
|
31
33
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
34
|
+
const {
|
|
35
|
+
obsIndices
|
|
36
|
+
} = (0, _FilterContext.useFilteredData)();
|
|
32
37
|
const [params, setParams] = (0, _react.useState)({
|
|
33
38
|
url: dataset.url,
|
|
34
39
|
varKeys: _lodash.default.map(varKeys, v => v.isSet ? {
|
|
35
40
|
name: v.name,
|
|
36
41
|
indices: v.vars.map(v => v.index)
|
|
37
42
|
} : v.index),
|
|
38
|
-
|
|
43
|
+
obsIndices: obsIndices,
|
|
39
44
|
varNamesCol: dataset.varNamesCol
|
|
40
45
|
});
|
|
41
46
|
(0, _react.useEffect)(() => {
|
|
@@ -44,10 +49,11 @@ const useVarMean = function (varKeys) {
|
|
|
44
49
|
varKeys: _lodash.default.map(varKeys, v => v.isSet ? {
|
|
45
50
|
name: v.name,
|
|
46
51
|
indices: v.vars.map(v => v.index)
|
|
47
|
-
} : v.index)
|
|
52
|
+
} : v.index),
|
|
53
|
+
obsIndices: obsIndices
|
|
48
54
|
});
|
|
49
55
|
});
|
|
50
|
-
}, [varKeys]);
|
|
56
|
+
}, [obsIndices, varKeys]);
|
|
51
57
|
return (0, _requests.useFetch)(ENDPOINT, params, {
|
|
52
58
|
enabled: enabled,
|
|
53
59
|
refetchOnMount: false
|
|
@@ -55,9 +61,11 @@ const useVarMean = function (varKeys) {
|
|
|
55
61
|
};
|
|
56
62
|
|
|
57
63
|
// ensure nulls are lowest values
|
|
64
|
+
exports.useVarMean = useVarMean;
|
|
58
65
|
const sortMeans = (i, means) => {
|
|
59
66
|
return means[i.name] || _lodash.default.min(_lodash.default.values(means)) - 1;
|
|
60
67
|
};
|
|
68
|
+
exports.sortMeans = sortMeans;
|
|
61
69
|
function VarNamesList(_ref) {
|
|
62
70
|
var _settings$selectedVar, _settings$selectedVar2;
|
|
63
71
|
let {
|