@haniffalab/cherita-react 1.3.0 → 1.4.0-dev.2025-06-09.09fbcbf5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (49) hide show
  1. package/dist/assets/images/plots/dotplot.svg +152 -0
  2. package/dist/assets/images/plots/heatmap.svg +193 -0
  3. package/dist/assets/images/plots/matrixplot.svg +275 -0
  4. package/dist/assets/images/plots/scatterplot.svg +198 -0
  5. package/dist/assets/images/plots/violin.svg +50 -0
  6. package/dist/cjs/components/dotplot/Dotplot.js +35 -5
  7. package/dist/cjs/components/full-page/FullPage.js +109 -50
  8. package/dist/cjs/components/full-page/PlotTypeSelector.js +57 -0
  9. package/dist/cjs/components/heatmap/Heatmap.js +35 -5
  10. package/dist/cjs/components/matrixplot/Matrixplot.js +35 -5
  11. package/dist/cjs/components/obs-list/ObsItem.js +49 -22
  12. package/dist/cjs/components/obs-list/ObsList.js +9 -5
  13. package/dist/cjs/components/scatterplot/Scatterplot.js +115 -95
  14. package/dist/cjs/components/scatterplot/SpatialControls.js +3 -3
  15. package/dist/cjs/components/search-bar/SearchInfo.js +3 -35
  16. package/dist/cjs/components/toolbar/Toolbar.js +102 -0
  17. package/dist/cjs/components/var-list/VarList.js +11 -3
  18. package/dist/cjs/components/violin/Violin.js +37 -6
  19. package/dist/cjs/constants/constants.js +14 -2
  20. package/dist/cjs/context/DatasetContext.js +2 -1
  21. package/dist/cjs/context/SettingsContext.js +77 -46
  22. package/dist/cjs/helpers/map-helper.js +2 -1
  23. package/dist/cjs/index.js +15 -21
  24. package/dist/css/cherita.css +76 -23
  25. package/dist/css/cherita.css.map +1 -1
  26. package/dist/esm/components/dotplot/Dotplot.js +36 -6
  27. package/dist/esm/components/full-page/FullPage.js +111 -50
  28. package/dist/esm/components/full-page/PlotTypeSelector.js +50 -0
  29. package/dist/esm/components/heatmap/Heatmap.js +36 -6
  30. package/dist/esm/components/matrixplot/Matrixplot.js +36 -6
  31. package/dist/esm/components/obs-list/ObsItem.js +49 -22
  32. package/dist/esm/components/obs-list/ObsList.js +9 -5
  33. package/dist/esm/components/scatterplot/Scatterplot.js +115 -95
  34. package/dist/esm/components/scatterplot/SpatialControls.js +3 -3
  35. package/dist/esm/components/search-bar/SearchInfo.js +1 -33
  36. package/dist/esm/components/toolbar/Toolbar.js +91 -0
  37. package/dist/esm/components/var-list/VarList.js +10 -5
  38. package/dist/esm/components/violin/Violin.js +39 -8
  39. package/dist/esm/constants/constants.js +13 -1
  40. package/dist/esm/context/DatasetContext.js +2 -1
  41. package/dist/esm/context/SettingsContext.js +77 -46
  42. package/dist/esm/helpers/map-helper.js +2 -1
  43. package/dist/esm/index.js +4 -4
  44. package/package.json +6 -4
  45. package/scss/cherita.scss +0 -1
  46. package/scss/components/layouts.scss +69 -1
  47. package/scss/components/plotly.scss +19 -14
  48. package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
  49. 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$selectedObs3, _features$features2, _obsmData$serverError, _xData$serverError, _obsData$serverError, _labelObsData$serverE, _settings$selectedVar, _settings$selectedObs4, _obsmData$data;
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 = 30,
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 (!obsmData.isPending && !obsmData.serverError) {
90
- var _deckRef$current, _deckRef$current2;
91
- setIsRendering(true);
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
- return _objectSpread(_objectSpread({}, d), {}, {
94
- positions: obsmData.data
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
- } = mapHelper.fitBounds(obsmData.data, {
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
- (0, _react.useEffect)(() => {
139
- if (settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR) {
140
- setIsRendering(true);
141
- if (!xData.isPending && !xData.serverError) {
142
- // @TODO: add condition to check obs slicing
143
- setData(d => {
144
- return _objectSpread(_objectSpread({}, d), {}, {
145
- values: xData.data
146
- });
147
- });
148
- } else if (!xData.isPending && xData.serverError) {
149
- setData(d => {
150
- return _objectSpread(_objectSpread({}, d), {}, {
151
- values: []
152
- });
153
- });
154
- }
155
- }
156
- }, [settings.colorEncoding, xData.data, xData.isPending, xData.serverError, getColor]);
157
- (0, _react.useEffect)(() => {
158
- if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS) {
159
- setIsRendering(true);
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
- }, [settings.colorEncoding, obsData.data, obsData.isPending, obsData.serverError, settings.sliceBy.obs]);
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$selectedObs, _settings$selectedObs2;
192
- return ((_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.type) === _constants.OBS_TYPES.CATEGORICAL || ((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.type) === _constants.OBS_TYPES.BOOLEAN;
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$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.type]);
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 = obsIndices && !obsIndices.has(index);
215
- return getColor({
216
- value: (data.values[index] - min) / (max - min),
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
- }) || [0, 0, 0, 100];
220
- }, [data.values, obsIndices, getColor, isCategorical, max, min]);
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 = obsIndices && !obsIndices.has(index);
248
+ const grayOut = sortedObsIndices && !sortedObsIndices.has(index);
228
249
  return grayOut ? 1 : 3;
229
- }, [obsIndices]);
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: data.positions,
235
- radiusScale: radius,
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
- }, [data.positions, features, getFillColor, getRadius, mode, radius, selectedFeatureIndexes]);
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 _obsData$data;
322
- text.push(getLabel(settings.selectedObs, (_obsData$data = obsData.data) === null || _obsData$data === void 0 ? void 0 : _obsData$data[index]));
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 _xData$data;
326
- text.push(getLabel(settings.selectedVar, (_xData$data = xData.data) === null || _xData$data === void 0 ? void 0 : _xData$data[index], true));
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 = obsIndices && !obsIndices.has(index);
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 isPending = (isRendering || xData.isPending || obsmData.isPending) && !obsmData.isPending;
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 && !isPending && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
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$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.name : null,
402
- obsLength: parseInt((_obsmData$data = obsmData.data) === null || _obsmData$data === void 0 ? void 0 : _obsmData$data.length),
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)("(max-width: 991.98px)");
44
- const XlBreakpoint = (0, _useMediaQuery.default)("(max-width: 1199.98px)");
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
- // obsIndices:
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 {