@haniffalab/cherita-react 1.3.0-dev.2025-06-06.c0b05a89 → 1.3.0-dev.2025-06-06.f1eddad0

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.
@@ -152,7 +152,8 @@ function FullPage(_ref) {
152
152
  }, /*#__PURE__*/_react.default.createElement("div", {
153
153
  className: "cherita-app-obs modern-scrollbars border-end h-100"
154
154
  }, /*#__PURE__*/_react.default.createElement(_ObsList.ObsColsList, _extends({}, props, {
155
- showSelectedAsActive: showSelectedAsActive
155
+ showSelectedAsActive: showSelectedAsActive,
156
+ showHistograms: varMode === _constants.SELECTION_MODES.SINGLE
156
157
  }))), /*#__PURE__*/_react.default.createElement("div", {
157
158
  className: "cherita-app-canvas"
158
159
  }, plot), /*#__PURE__*/_react.default.createElement("div", {
@@ -52,8 +52,11 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
52
52
  function getContinuousLabel(code, binEdges) {
53
53
  return "[ ".concat((0, _string.formatNumerical)(binEdges[code][0]), ", ").concat((0, _string.formatNumerical)(binEdges[code][1], _string.FORMATS.EXPONENTIAL)).concat(code === binEdges.length - 1 ? " ]" : " )");
54
54
  }
55
- const useObsHistogram = obs => {
55
+ const useObsHistogram = (obs, _ref) => {
56
56
  var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedVar9, _settings$selectedVar0, _settings$selectedVar1, _settings$selectedVar10;
57
+ let {
58
+ enabled = true
59
+ } = _ref;
57
60
  const ENDPOINT = "obs/histograms";
58
61
  const dataset = (0, _DatasetContext.useDataset)();
59
62
  const settings = (0, _SettingsContext.useSettings)();
@@ -85,7 +88,7 @@ const useObsHistogram = obs => {
85
88
  });
86
89
  }, [(_settings$selectedVar9 = settings.selectedVar) === null || _settings$selectedVar9 === void 0 ? void 0 : _settings$selectedVar9.index, (_settings$selectedVar0 = settings.selectedVar) === null || _settings$selectedVar0 === void 0 ? void 0 : _settings$selectedVar0.isSet, (_settings$selectedVar1 = settings.selectedVar) === null || _settings$selectedVar1 === void 0 ? void 0 : _settings$selectedVar1.name, (_settings$selectedVar10 = settings.selectedVar) === null || _settings$selectedVar10 === void 0 ? void 0 : _settings$selectedVar10.vars, obsIndices, isSliced, obs]);
87
90
  return (0, _requests.useFetch)(ENDPOINT, params, {
88
- enabled: !!settings.selectedVar && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR,
91
+ enabled: enabled && !!settings.selectedVar && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR,
89
92
  refetchOnMount: false
90
93
  });
91
94
  };
@@ -132,7 +135,7 @@ const useFilteredObsData = obs => {
132
135
  pct: pct
133
136
  };
134
137
  };
135
- function CategoricalItem(_ref) {
138
+ function CategoricalItem(_ref2) {
136
139
  let {
137
140
  value,
138
141
  label,
@@ -157,7 +160,7 @@ function CategoricalItem(_ref) {
157
160
  isSliced,
158
161
  colors = null,
159
162
  showColor = true
160
- } = _ref;
163
+ } = _ref2;
161
164
  const {
162
165
  useUnsColors
163
166
  } = (0, _DatasetContext.useDataset)();
@@ -258,13 +261,14 @@ function CategoricalItem(_ref) {
258
261
  } : {})), ")")
259
262
  }))) : null))));
260
263
  }
261
- function CategoricalObs(_ref2) {
264
+ function CategoricalObs(_ref3) {
262
265
  let {
263
266
  obs,
264
267
  toggleAll,
265
268
  toggleObs,
266
- showColor = true
267
- } = _ref2;
269
+ showColor = true,
270
+ showHistograms = true
271
+ } = _ref3;
268
272
  const settings = (0, _SettingsContext.useSettings)();
269
273
  const {
270
274
  isSliced
@@ -272,7 +276,9 @@ function CategoricalObs(_ref2) {
272
276
  const totalCounts = _lodash.default.sum(_lodash.default.values(obs.value_counts));
273
277
  const min = _lodash.default.min(_lodash.default.values(obs.codes));
274
278
  const max = _lodash.default.max(_lodash.default.values(obs.codes));
275
- const obsHistograms = useObsHistogram(obs);
279
+ const obsHistograms = useObsHistogram(obs, {
280
+ enabled: showHistograms
281
+ });
276
282
  const filteredObsData = useFilteredObsData(obs);
277
283
  const getDataAtIndex = (0, _react.useCallback)(index => {
278
284
  var _obsHistograms$fetche;
@@ -285,7 +291,7 @@ function CategoricalObs(_ref2) {
285
291
  },
286
292
  isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
287
293
  label: obs.values[index],
288
- histogramData: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? {
294
+ histogramData: showHistograms && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? {
289
295
  data: (_obsHistograms$fetche = obsHistograms.fetchedData) === null || _obsHistograms$fetche === void 0 ? void 0 : _obsHistograms$fetche[obs.values[index]],
290
296
  isPending: obsHistograms.isPending,
291
297
  altColor: isSliced
@@ -300,7 +306,7 @@ function CategoricalObs(_ref2) {
300
306
  isSliced: isSliced,
301
307
  colors: obs.colors
302
308
  };
303
- }, [obs.values, obs.codes, obs.value_counts, obs.omit, obs.colors, totalCounts, settings.colorEncoding, obsHistograms.fetchedData, obsHistograms.isPending, isSliced, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct]);
309
+ }, [obs.values, obs.codes, obs.value_counts, obs.omit, totalCounts, showHistograms, obs.colors, settings.colorEncoding, obsHistograms.fetchedData, obsHistograms.isPending, isSliced, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct]);
304
310
  showColor &= settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS;
305
311
  return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
306
312
  variant: "flush",
@@ -322,10 +328,10 @@ function CategoricalObs(_ref2) {
322
328
  estimateSize: 42
323
329
  }));
324
330
  }
325
- function ObsContinuousStats(_ref3) {
331
+ function ObsContinuousStats(_ref4) {
326
332
  let {
327
333
  obs
328
- } = _ref3;
334
+ } = _ref4;
329
335
  const ENDPOINT = "obs/distribution";
330
336
  const dataset = (0, _DatasetContext.useDataset)();
331
337
  const params = {
@@ -385,12 +391,13 @@ function ObsContinuousStats(_ref3) {
385
391
  }
386
392
 
387
393
  // @TODO: add bin controls
388
- function ContinuousObs(_ref4) {
394
+ function ContinuousObs(_ref5) {
389
395
  let {
390
396
  obs,
391
397
  toggleAll,
392
- toggleObs
393
- } = _ref4;
398
+ toggleObs,
399
+ showHistograms = true
400
+ } = _ref5;
394
401
  const settings = (0, _SettingsContext.useSettings)();
395
402
  const {
396
403
  isSliced
@@ -398,7 +405,9 @@ function ContinuousObs(_ref4) {
398
405
  const totalCounts = _lodash.default.sum(_lodash.default.values(obs.value_counts));
399
406
  const min = _lodash.default.min(_lodash.default.values(obs.codes));
400
407
  const max = _lodash.default.max(_lodash.default.values(obs.codes));
401
- const obsHistograms = useObsHistogram(obs);
408
+ const obsHistograms = useObsHistogram(obs, {
409
+ enabled: showHistograms
410
+ });
402
411
  const filteredObsData = useFilteredObsData(obs);
403
412
  const getDataAtIndex = (0, _react.useCallback)(index => {
404
413
  var _obsHistograms$fetche2;
@@ -411,7 +420,7 @@ function ContinuousObs(_ref4) {
411
420
  },
412
421
  isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
413
422
  label: isNaN(obs.values[index]) ? "NaN" : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges),
414
- histogramData: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? {
423
+ histogramData: showHistograms && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? {
415
424
  data: (_obsHistograms$fetche2 = obsHistograms.fetchedData) === null || _obsHistograms$fetche2 === void 0 ? void 0 : _obsHistograms$fetche2[obs.values[index]],
416
425
  isPending: obsHistograms.isPending,
417
426
  altColor: isSliced
@@ -425,7 +434,7 @@ function ContinuousObs(_ref4) {
425
434
  },
426
435
  isSliced: isSliced
427
436
  };
428
- }, [filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, isSliced, obs.bins.binEdges, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, settings.colorEncoding, totalCounts]);
437
+ }, [filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, isSliced, obs.bins.binEdges, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, settings.colorEncoding, showHistograms, totalCounts]);
429
438
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
430
439
  variant: "flush",
431
440
  className: "cherita-list"
@@ -57,7 +57,8 @@ function ObsColsList(_ref2) {
57
57
  let {
58
58
  showColor = true,
59
59
  enableObsGroups = true,
60
- showSelectedAsActive = false
60
+ showSelectedAsActive = false,
61
+ showHistograms = true
61
62
  } = _ref2;
62
63
  const ENDPOINT = "obs/cols";
63
64
  const dataset = (0, _DatasetContext.useDataset)();
@@ -264,7 +265,8 @@ function ObsColsList(_ref2) {
264
265
  toggleLabel: () => toggleLabel(item),
265
266
  toggleSlice: () => toggleSlice(item),
266
267
  toggleColor: () => toggleColor(item),
267
- showColor: showColor && isColorEncoding
268
+ showColor: showColor && isColorEncoding,
269
+ showHistograms: showHistograms
268
270
  }) : /*#__PURE__*/_react.default.createElement(_ObsItem.ContinuousObs, {
269
271
  key: item.name,
270
272
  obs: item,
@@ -272,7 +274,8 @@ function ObsColsList(_ref2) {
272
274
  toggleObs: value => toggleObs(item, value),
273
275
  toggleLabel: () => toggleLabel(item),
274
276
  toggleSlice: () => toggleSlice(item),
275
- toggleColor: () => toggleColor(item)
277
+ toggleColor: () => toggleColor(item),
278
+ showHistograms: showHistograms
276
279
  })))));
277
280
  };
278
281
  const groupList = _lodash.default.map(_lodash.default.keys(obsGroups), group => {
@@ -73,6 +73,7 @@ function Scatterplot(_ref) {
73
73
  positions: [],
74
74
  values: []
75
75
  });
76
+ const [coordsError, setCoordsError] = (0, _react.useState)(null);
76
77
 
77
78
  // EditableGeoJsonLayer
78
79
  const [mode, setMode] = (0, _react.useState)(() => _editModes.ViewMode);
@@ -110,8 +111,22 @@ function Scatterplot(_ref) {
110
111
  } else if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS) {
111
112
  values = !obsData.serverError ? obsData.data : values;
112
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
+ }
113
128
  return {
114
- positions: !obsmData.serverError ? obsmData.data : d.positions,
129
+ positions: d.positions,
115
130
  values: values
116
131
  };
117
132
  });
@@ -351,7 +366,7 @@ function Scatterplot(_ref) {
351
366
  }
352
367
  };
353
368
  };
354
- 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);
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;
355
370
  return /*#__PURE__*/_react.default.createElement("div", {
356
371
  className: "cherita-container-scatterplot"
357
372
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -145,7 +145,8 @@ export function FullPage(_ref) {
145
145
  }, /*#__PURE__*/React.createElement("div", {
146
146
  className: "cherita-app-obs modern-scrollbars border-end h-100"
147
147
  }, /*#__PURE__*/React.createElement(ObsColsList, _extends({}, props, {
148
- showSelectedAsActive: showSelectedAsActive
148
+ showSelectedAsActive: showSelectedAsActive,
149
+ showHistograms: varMode === SELECTION_MODES.SINGLE
149
150
  }))), /*#__PURE__*/React.createElement("div", {
150
151
  className: "cherita-app-canvas"
151
152
  }, plot), /*#__PURE__*/React.createElement("div", {
@@ -44,8 +44,11 @@ import { useObsData } from "../../utils/zarrData";
44
44
  function getContinuousLabel(code, binEdges) {
45
45
  return "[ ".concat(formatNumerical(binEdges[code][0]), ", ").concat(formatNumerical(binEdges[code][1], FORMATS.EXPONENTIAL)).concat(code === binEdges.length - 1 ? " ]" : " )");
46
46
  }
47
- const useObsHistogram = obs => {
47
+ const useObsHistogram = (obs, _ref) => {
48
48
  var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedVar9, _settings$selectedVar0, _settings$selectedVar1, _settings$selectedVar10;
49
+ let {
50
+ enabled = true
51
+ } = _ref;
49
52
  const ENDPOINT = "obs/histograms";
50
53
  const dataset = useDataset();
51
54
  const settings = useSettings();
@@ -77,7 +80,7 @@ const useObsHistogram = obs => {
77
80
  });
78
81
  }, [(_settings$selectedVar9 = settings.selectedVar) === null || _settings$selectedVar9 === void 0 ? void 0 : _settings$selectedVar9.index, (_settings$selectedVar0 = settings.selectedVar) === null || _settings$selectedVar0 === void 0 ? void 0 : _settings$selectedVar0.isSet, (_settings$selectedVar1 = settings.selectedVar) === null || _settings$selectedVar1 === void 0 ? void 0 : _settings$selectedVar1.name, (_settings$selectedVar10 = settings.selectedVar) === null || _settings$selectedVar10 === void 0 ? void 0 : _settings$selectedVar10.vars, obsIndices, isSliced, obs]);
79
82
  return useFetch(ENDPOINT, params, {
80
- enabled: !!settings.selectedVar && settings.colorEncoding === COLOR_ENCODINGS.VAR,
83
+ enabled: enabled && !!settings.selectedVar && settings.colorEncoding === COLOR_ENCODINGS.VAR,
81
84
  refetchOnMount: false
82
85
  });
83
86
  };
@@ -124,7 +127,7 @@ const useFilteredObsData = obs => {
124
127
  pct: pct
125
128
  };
126
129
  };
127
- function CategoricalItem(_ref) {
130
+ function CategoricalItem(_ref2) {
128
131
  let {
129
132
  value,
130
133
  label,
@@ -149,7 +152,7 @@ function CategoricalItem(_ref) {
149
152
  isSliced,
150
153
  colors = null,
151
154
  showColor = true
152
- } = _ref;
155
+ } = _ref2;
153
156
  const {
154
157
  useUnsColors
155
158
  } = useDataset();
@@ -250,13 +253,14 @@ function CategoricalItem(_ref) {
250
253
  } : {})), ")")
251
254
  }))) : null))));
252
255
  }
253
- export function CategoricalObs(_ref2) {
256
+ export function CategoricalObs(_ref3) {
254
257
  let {
255
258
  obs,
256
259
  toggleAll,
257
260
  toggleObs,
258
- showColor = true
259
- } = _ref2;
261
+ showColor = true,
262
+ showHistograms = true
263
+ } = _ref3;
260
264
  const settings = useSettings();
261
265
  const {
262
266
  isSliced
@@ -264,7 +268,9 @@ export function CategoricalObs(_ref2) {
264
268
  const totalCounts = _.sum(_.values(obs.value_counts));
265
269
  const min = _.min(_.values(obs.codes));
266
270
  const max = _.max(_.values(obs.codes));
267
- const obsHistograms = useObsHistogram(obs);
271
+ const obsHistograms = useObsHistogram(obs, {
272
+ enabled: showHistograms
273
+ });
268
274
  const filteredObsData = useFilteredObsData(obs);
269
275
  const getDataAtIndex = useCallback(index => {
270
276
  var _obsHistograms$fetche;
@@ -277,7 +283,7 @@ export function CategoricalObs(_ref2) {
277
283
  },
278
284
  isOmitted: _.includes(obs.omit, obs.codes[obs.values[index]]),
279
285
  label: obs.values[index],
280
- histogramData: settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
286
+ histogramData: showHistograms && settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
281
287
  data: (_obsHistograms$fetche = obsHistograms.fetchedData) === null || _obsHistograms$fetche === void 0 ? void 0 : _obsHistograms$fetche[obs.values[index]],
282
288
  isPending: obsHistograms.isPending,
283
289
  altColor: isSliced
@@ -292,7 +298,7 @@ export function CategoricalObs(_ref2) {
292
298
  isSliced: isSliced,
293
299
  colors: obs.colors
294
300
  };
295
- }, [obs.values, obs.codes, obs.value_counts, obs.omit, obs.colors, totalCounts, settings.colorEncoding, obsHistograms.fetchedData, obsHistograms.isPending, isSliced, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct]);
301
+ }, [obs.values, obs.codes, obs.value_counts, obs.omit, totalCounts, showHistograms, obs.colors, settings.colorEncoding, obsHistograms.fetchedData, obsHistograms.isPending, isSliced, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct]);
296
302
  showColor &= settings.colorEncoding === COLOR_ENCODINGS.OBS;
297
303
  return /*#__PURE__*/React.createElement(ListGroup, {
298
304
  variant: "flush",
@@ -314,10 +320,10 @@ export function CategoricalObs(_ref2) {
314
320
  estimateSize: 42
315
321
  }));
316
322
  }
317
- function ObsContinuousStats(_ref3) {
323
+ function ObsContinuousStats(_ref4) {
318
324
  let {
319
325
  obs
320
- } = _ref3;
326
+ } = _ref4;
321
327
  const ENDPOINT = "obs/distribution";
322
328
  const dataset = useDataset();
323
329
  const params = {
@@ -377,12 +383,13 @@ function ObsContinuousStats(_ref3) {
377
383
  }
378
384
 
379
385
  // @TODO: add bin controls
380
- export function ContinuousObs(_ref4) {
386
+ export function ContinuousObs(_ref5) {
381
387
  let {
382
388
  obs,
383
389
  toggleAll,
384
- toggleObs
385
- } = _ref4;
390
+ toggleObs,
391
+ showHistograms = true
392
+ } = _ref5;
386
393
  const settings = useSettings();
387
394
  const {
388
395
  isSliced
@@ -390,7 +397,9 @@ export function ContinuousObs(_ref4) {
390
397
  const totalCounts = _.sum(_.values(obs.value_counts));
391
398
  const min = _.min(_.values(obs.codes));
392
399
  const max = _.max(_.values(obs.codes));
393
- const obsHistograms = useObsHistogram(obs);
400
+ const obsHistograms = useObsHistogram(obs, {
401
+ enabled: showHistograms
402
+ });
394
403
  const filteredObsData = useFilteredObsData(obs);
395
404
  const getDataAtIndex = useCallback(index => {
396
405
  var _obsHistograms$fetche2;
@@ -403,7 +412,7 @@ export function ContinuousObs(_ref4) {
403
412
  },
404
413
  isOmitted: _.includes(obs.omit, obs.codes[obs.values[index]]),
405
414
  label: isNaN(obs.values[index]) ? "NaN" : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges),
406
- histogramData: settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
415
+ histogramData: showHistograms && settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
407
416
  data: (_obsHistograms$fetche2 = obsHistograms.fetchedData) === null || _obsHistograms$fetche2 === void 0 ? void 0 : _obsHistograms$fetche2[obs.values[index]],
408
417
  isPending: obsHistograms.isPending,
409
418
  altColor: isSliced
@@ -417,7 +426,7 @@ export function ContinuousObs(_ref4) {
417
426
  },
418
427
  isSliced: isSliced
419
428
  };
420
- }, [filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, isSliced, obs.bins.binEdges, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, settings.colorEncoding, totalCounts]);
429
+ }, [filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, isSliced, obs.bins.binEdges, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, settings.colorEncoding, showHistograms, totalCounts]);
421
430
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ListGroup, {
422
431
  variant: "flush",
423
432
  className: "cherita-list"
@@ -49,7 +49,8 @@ export function ObsColsList(_ref2) {
49
49
  let {
50
50
  showColor = true,
51
51
  enableObsGroups = true,
52
- showSelectedAsActive = false
52
+ showSelectedAsActive = false,
53
+ showHistograms = true
53
54
  } = _ref2;
54
55
  const ENDPOINT = "obs/cols";
55
56
  const dataset = useDataset();
@@ -256,7 +257,8 @@ export function ObsColsList(_ref2) {
256
257
  toggleLabel: () => toggleLabel(item),
257
258
  toggleSlice: () => toggleSlice(item),
258
259
  toggleColor: () => toggleColor(item),
259
- showColor: showColor && isColorEncoding
260
+ showColor: showColor && isColorEncoding,
261
+ showHistograms: showHistograms
260
262
  }) : /*#__PURE__*/React.createElement(ContinuousObs, {
261
263
  key: item.name,
262
264
  obs: item,
@@ -264,7 +266,8 @@ export function ObsColsList(_ref2) {
264
266
  toggleObs: value => toggleObs(item, value),
265
267
  toggleLabel: () => toggleLabel(item),
266
268
  toggleSlice: () => toggleSlice(item),
267
- toggleColor: () => toggleColor(item)
269
+ toggleColor: () => toggleColor(item),
270
+ showHistograms: showHistograms
268
271
  })))));
269
272
  };
270
273
  const groupList = _.map(_.keys(obsGroups), group => {
@@ -65,6 +65,7 @@ export function Scatterplot(_ref) {
65
65
  positions: [],
66
66
  values: []
67
67
  });
68
+ const [coordsError, setCoordsError] = useState(null);
68
69
 
69
70
  // EditableGeoJsonLayer
70
71
  const [mode, setMode] = useState(() => ViewMode);
@@ -102,8 +103,22 @@ export function Scatterplot(_ref) {
102
103
  } else if (settings.colorEncoding === COLOR_ENCODINGS.OBS) {
103
104
  values = !obsData.serverError ? obsData.data : values;
104
105
  }
106
+ if (!obsmData.serverError && obsmData.data) {
107
+ if (obsmData.data[0].length !== 2) {
108
+ setCoordsError("Invalid coordinates. Expected 2D coordinates");
109
+ return {
110
+ positions: [],
111
+ values: []
112
+ };
113
+ }
114
+ setCoordsError(null);
115
+ return {
116
+ positions: obsmData.data,
117
+ values: values
118
+ };
119
+ }
105
120
  return {
106
- positions: !obsmData.serverError ? obsmData.data : d.positions,
121
+ positions: d.positions,
107
122
  values: values
108
123
  };
109
124
  });
@@ -343,7 +358,7 @@ export function Scatterplot(_ref) {
343
358
  }
344
359
  };
345
360
  };
346
- const error = settings.selectedObsm && ((_obsmData$serverError = obsmData.serverError) === null || _obsmData$serverError === void 0 ? void 0 : _obsmData$serverError.length) || settings.colorEncoding === COLOR_ENCODINGS.VAR && ((_xData$serverError = xData.serverError) === null || _xData$serverError === void 0 ? void 0 : _xData$serverError.length) || settings.colorEncoding === 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);
361
+ const error = settings.selectedObsm && ((_obsmData$serverError = obsmData.serverError) === null || _obsmData$serverError === void 0 ? void 0 : _obsmData$serverError.length) || settings.colorEncoding === COLOR_ENCODINGS.VAR && ((_xData$serverError = xData.serverError) === null || _xData$serverError === void 0 ? void 0 : _xData$serverError.length) || settings.colorEncoding === 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;
347
362
  return /*#__PURE__*/React.createElement("div", {
348
363
  className: "cherita-container-scatterplot"
349
364
  }, /*#__PURE__*/React.createElement("div", {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haniffalab/cherita-react",
3
- "version": "1.3.0-dev.2025-06-06.c0b05a89",
3
+ "version": "1.3.0-dev.2025-06-06.f1eddad0",
4
4
  "author": "Haniffa Lab",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -127,5 +127,5 @@
127
127
  "url": "https://github.com/haniffalab/cherita-react/issues"
128
128
  },
129
129
  "homepage": "https://github.com/haniffalab/cherita-react#readme",
130
- "prereleaseSha": "c0b05a895b3e582b1719870cbd23b084095c36de"
130
+ "prereleaseSha": "f1eddad0f8fea03ef886db127e9a9d50766aab8e"
131
131
  }