@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.
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 +5 -3
  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 +5 -3
  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 +7 -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
@@ -0,0 +1,50 @@
1
+ import React from "react";
2
+ import dotplotIcon from "../../../assets/images/plots/dotplot.svg";
3
+ import heatmapIcon from "../../../assets/images/plots/heatmap.svg";
4
+ import matrixplotIcon from "../../../assets/images/plots/matrixplot.svg";
5
+ import scatterplotIcon from "../../../assets/images/plots/scatterplot.svg";
6
+ import violinIcon from "../../../assets/images/plots/violin.svg";
7
+ import { PLOT_TYPES } from "../../constants/constants";
8
+ const iconMap = {
9
+ [PLOT_TYPES.DOTPLOT]: dotplotIcon,
10
+ [PLOT_TYPES.MATRIXPLOT]: matrixplotIcon,
11
+ [PLOT_TYPES.VIOLINPLOT]: violinIcon,
12
+ [PLOT_TYPES.SCATTERPLOT]: scatterplotIcon,
13
+ [PLOT_TYPES.HEATMAP]: heatmapIcon
14
+ };
15
+ const plotTypes = Object.entries(iconMap).map(_ref => {
16
+ let [type, icon] = _ref;
17
+ return {
18
+ type,
19
+ icon,
20
+ alt: type.charAt(0).toUpperCase() + type.slice(1)
21
+ };
22
+ });
23
+ export function PlotTypeSelector(_ref2) {
24
+ let {
25
+ currentType,
26
+ onChange
27
+ } = _ref2;
28
+ return /*#__PURE__*/React.createElement("div", {
29
+ className: "d-flex gap-2 justify-content-between"
30
+ }, plotTypes.map(_ref3 => {
31
+ let {
32
+ type,
33
+ icon,
34
+ alt
35
+ } = _ref3;
36
+ return /*#__PURE__*/React.createElement("img", {
37
+ key: type,
38
+ src: icon,
39
+ alt: alt,
40
+ height: 32,
41
+ width: 32,
42
+ className: "plotselector-icon".concat(currentType === type ? " active" : ""),
43
+ onClick: () => onChange(type),
44
+ style: {
45
+ borderBottom: currentType === type ? "2px solid #007bff" : "none"
46
+ },
47
+ title: alt
48
+ });
49
+ }));
50
+ }
@@ -5,15 +5,25 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
5
5
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
6
  import React, { useCallback, useEffect, useRef, useState } from "react";
7
7
  import _ from "lodash";
8
- import { Alert } from "react-bootstrap";
8
+ import { Alert, Button } from "react-bootstrap";
9
9
  import Plot from "react-plotly.js";
10
+ import { PLOTLY_MODEBAR_BUTTONS } from "../../constants/constants";
10
11
  import { useDataset } from "../../context/DatasetContext";
11
12
  import { useFilteredData } from "../../context/FilterContext";
12
13
  import { useSettings } from "../../context/SettingsContext";
13
14
  import { LoadingSpinner } from "../../utils/LoadingIndicators";
14
15
  import { useDebouncedFetch } from "../../utils/requests";
15
- export function Heatmap() {
16
+ import { ControlsPlotlyToolbar, ObsPlotlyToolbar, VarPlotlyToolbar } from "../toolbar/Toolbar";
17
+ export function Heatmap(_ref) {
16
18
  var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
19
+ let {
20
+ showObsBtn = false,
21
+ showVarsBtn = false,
22
+ showCtrlsBtn = false,
23
+ setShowObs,
24
+ setShowVars,
25
+ setShowControls
26
+ } = _ref;
17
27
  const ENDPOINT = "heatmap";
18
28
  const dataset = useDataset();
19
29
  const settings = useSettings();
@@ -90,17 +100,29 @@ export function Heatmap() {
90
100
  colorscale.current = settings.controls.colorScale;
91
101
  updateColorscale(colorscale.current);
92
102
  }, [settings.controls.colorScale, updateColorscale]);
103
+ const customModeBarButtons = _.compact([showObsBtn && ObsPlotlyToolbar({
104
+ onClick: setShowObs
105
+ }), showVarsBtn && VarPlotlyToolbar({
106
+ onClick: setShowVars
107
+ }), showCtrlsBtn && ControlsPlotlyToolbar({
108
+ onClick: setShowControls
109
+ })]);
110
+ const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, PLOTLY_MODEBAR_BUTTONS] : [PLOTLY_MODEBAR_BUTTONS];
93
111
  if (!serverError) {
94
112
  if (hasSelections) {
95
113
  return /*#__PURE__*/React.createElement("div", {
96
- className: "cherita-heatmap position-relative"
114
+ className: "cherita-plot cherita-heatmap position-relative"
97
115
  }, isPending && /*#__PURE__*/React.createElement(LoadingSpinner, null), /*#__PURE__*/React.createElement(Plot, {
98
116
  data: data,
99
117
  layout: layout,
100
118
  useResizeHandler: true,
101
119
  style: {
102
- maxWidth: "100%",
103
- maxHeight: "100%"
120
+ width: "100%",
121
+ height: "100%"
122
+ },
123
+ config: {
124
+ displaylogo: false,
125
+ modeBarButtons: modeBarButtons
104
126
  }
105
127
  }));
106
128
  }
@@ -108,7 +130,15 @@ export function Heatmap() {
108
130
  className: "cherita-heatmap"
109
131
  }, /*#__PURE__*/React.createElement(Alert, {
110
132
  variant: "light"
111
- }, "Select features and a category"));
133
+ }, "Select", " ", showVarsBtn ? /*#__PURE__*/React.createElement(Button, {
134
+ variant: "link",
135
+ className: "border-0 p-0 align-baseline",
136
+ onClick: setShowVars
137
+ }, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/React.createElement(Button, {
138
+ variant: "link",
139
+ className: "border-0 p-0 align-baseline",
140
+ onClick: setShowObs
141
+ }, "category") : "category"));
112
142
  } else {
113
143
  return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Alert, {
114
144
  variant: "danger"
@@ -5,15 +5,25 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
5
5
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
6
  import React, { useCallback, useEffect, useRef, useState } from "react";
7
7
  import _ from "lodash";
8
- import { Alert } from "react-bootstrap";
8
+ import { Alert, Button } from "react-bootstrap";
9
9
  import Plot from "react-plotly.js";
10
+ import { PLOTLY_MODEBAR_BUTTONS } from "../../constants/constants";
10
11
  import { useDataset } from "../../context/DatasetContext";
11
12
  import { useFilteredData } from "../../context/FilterContext";
12
13
  import { useSettings } from "../../context/SettingsContext";
13
14
  import { LoadingSpinner } from "../../utils/LoadingIndicators";
14
15
  import { useDebouncedFetch } from "../../utils/requests";
15
- export function Matrixplot() {
16
+ import { ControlsPlotlyToolbar, ObsPlotlyToolbar, VarPlotlyToolbar } from "../toolbar/Toolbar";
17
+ export function Matrixplot(_ref) {
16
18
  var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
19
+ let {
20
+ showObsBtn = false,
21
+ showVarsBtn = false,
22
+ showCtrlsBtn = false,
23
+ setShowObs,
24
+ setShowVars,
25
+ setShowControls
26
+ } = _ref;
17
27
  const ENDPOINT = "matrixplot";
18
28
  const dataset = useDataset();
19
29
  const settings = useSettings();
@@ -92,17 +102,29 @@ export function Matrixplot() {
92
102
  colorscale.current = settings.controls.colorScale;
93
103
  updateColorscale(colorscale.current);
94
104
  }, [settings.controls.colorScale, updateColorscale]);
105
+ const customModeBarButtons = _.compact([showObsBtn && ObsPlotlyToolbar({
106
+ onClick: setShowObs
107
+ }), showVarsBtn && VarPlotlyToolbar({
108
+ onClick: setShowVars
109
+ }), showCtrlsBtn && ControlsPlotlyToolbar({
110
+ onClick: setShowControls
111
+ })]);
112
+ const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, PLOTLY_MODEBAR_BUTTONS] : [PLOTLY_MODEBAR_BUTTONS];
95
113
  if (!serverError) {
96
114
  if (hasSelections) {
97
115
  return /*#__PURE__*/React.createElement("div", {
98
- className: "cherita-matrixplot position-relative"
116
+ className: "cherita-plot cherita-matrixplot position-relative"
99
117
  }, isPending && /*#__PURE__*/React.createElement(LoadingSpinner, null), /*#__PURE__*/React.createElement(Plot, {
100
118
  data: data,
101
119
  layout: layout,
102
120
  useResizeHandler: true,
103
121
  style: {
104
- maxWidth: "100%",
105
- maxHeight: "100%"
122
+ width: "100%",
123
+ height: "100%"
124
+ },
125
+ config: {
126
+ displaylogo: false,
127
+ modeBarButtons: modeBarButtons
106
128
  }
107
129
  }));
108
130
  }
@@ -110,7 +132,15 @@ export function Matrixplot() {
110
132
  className: "cherita-matrixplot"
111
133
  }, /*#__PURE__*/React.createElement(Alert, {
112
134
  variant: "light"
113
- }, "Select features and a category"));
135
+ }, "Select", " ", showVarsBtn ? /*#__PURE__*/React.createElement(Button, {
136
+ variant: "link",
137
+ className: "border-0 p-0 align-baseline",
138
+ onClick: setShowVars
139
+ }, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/React.createElement(Button, {
140
+ variant: "link",
141
+ className: "border-0 p-0 align-baseline",
142
+ onClick: setShowObs
143
+ }, "category") : "category"));
114
144
  } else {
115
145
  return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Alert, {
116
146
  variant: "danger"
@@ -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,
@@ -147,8 +150,12 @@ function CategoricalItem(_ref) {
147
150
  pct: null
148
151
  },
149
152
  isSliced,
153
+ colors = null,
150
154
  showColor = true
151
- } = _ref;
155
+ } = _ref2;
156
+ const {
157
+ useUnsColors
158
+ } = useDataset();
152
159
  const {
153
160
  getColor
154
161
  } = useColor();
@@ -233,7 +240,7 @@ function CategoricalItem(_ref) {
233
240
  y: "0",
234
241
  width: "10",
235
242
  height: "10",
236
- fill: "rgb(".concat(getColor({
243
+ fill: "rgb(".concat(getColor(_objectSpread({
237
244
  value: (code - min) / (max - min),
238
245
  categorical: true,
239
246
  grayOut: isOmitted,
@@ -241,16 +248,19 @@ function CategoricalItem(_ref) {
241
248
  alpha: 1
242
249
  },
243
250
  colorEncoding: "obs"
244
- }), ")")
251
+ }, useUnsColors ? {
252
+ colorscale: colors
253
+ } : {})), ")")
245
254
  }))) : null))));
246
255
  }
247
- export function CategoricalObs(_ref2) {
256
+ export function CategoricalObs(_ref3) {
248
257
  let {
249
258
  obs,
250
259
  toggleAll,
251
260
  toggleObs,
252
- showColor = true
253
- } = _ref2;
261
+ showColor = true,
262
+ showHistograms = true
263
+ } = _ref3;
254
264
  const settings = useSettings();
255
265
  const {
256
266
  isSliced
@@ -258,7 +268,9 @@ export function CategoricalObs(_ref2) {
258
268
  const totalCounts = _.sum(_.values(obs.value_counts));
259
269
  const min = _.min(_.values(obs.codes));
260
270
  const max = _.max(_.values(obs.codes));
261
- const obsHistograms = useObsHistogram(obs);
271
+ const obsHistograms = useObsHistogram(obs, {
272
+ enabled: showHistograms
273
+ });
262
274
  const filteredObsData = useFilteredObsData(obs);
263
275
  const getDataAtIndex = useCallback(index => {
264
276
  var _obsHistograms$fetche;
@@ -271,7 +283,7 @@ export function CategoricalObs(_ref2) {
271
283
  },
272
284
  isOmitted: _.includes(obs.omit, obs.codes[obs.values[index]]),
273
285
  label: obs.values[index],
274
- histogramData: settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
286
+ histogramData: showHistograms && settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
275
287
  data: (_obsHistograms$fetche = obsHistograms.fetchedData) === null || _obsHistograms$fetche === void 0 ? void 0 : _obsHistograms$fetche[obs.values[index]],
276
288
  isPending: obsHistograms.isPending,
277
289
  altColor: isSliced
@@ -283,9 +295,10 @@ export function CategoricalObs(_ref2) {
283
295
  value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
284
296
  pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
285
297
  },
286
- isSliced: isSliced
298
+ isSliced: isSliced,
299
+ colors: obs.colors
287
300
  };
288
- }, [settings.colorEncoding, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, isSliced, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, totalCounts]);
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]);
289
302
  showColor &= settings.colorEncoding === COLOR_ENCODINGS.OBS;
290
303
  return /*#__PURE__*/React.createElement(ListGroup, {
291
304
  variant: "flush",
@@ -307,10 +320,10 @@ export function CategoricalObs(_ref2) {
307
320
  estimateSize: 42
308
321
  }));
309
322
  }
310
- function ObsContinuousStats(_ref3) {
323
+ function ObsContinuousStats(_ref4) {
311
324
  let {
312
325
  obs
313
- } = _ref3;
326
+ } = _ref4;
314
327
  const ENDPOINT = "obs/distribution";
315
328
  const dataset = useDataset();
316
329
  const params = {
@@ -370,21 +383,26 @@ function ObsContinuousStats(_ref3) {
370
383
  }
371
384
 
372
385
  // @TODO: add bin controls
373
- // @TODO: add histogram
374
- export function ContinuousObs(_ref4) {
386
+ export function ContinuousObs(_ref5) {
375
387
  let {
376
388
  obs,
377
389
  toggleAll,
378
- toggleObs
379
- } = _ref4;
390
+ toggleObs,
391
+ showHistograms = true
392
+ } = _ref5;
393
+ const settings = useSettings();
380
394
  const {
381
395
  isSliced
382
396
  } = useFilteredData();
383
397
  const totalCounts = _.sum(_.values(obs.value_counts));
384
398
  const min = _.min(_.values(obs.codes));
385
399
  const max = _.max(_.values(obs.codes));
400
+ const obsHistograms = useObsHistogram(obs, {
401
+ enabled: showHistograms
402
+ });
386
403
  const filteredObsData = useFilteredObsData(obs);
387
- const getDataAtIndex = index => {
404
+ const getDataAtIndex = useCallback(index => {
405
+ var _obsHistograms$fetche2;
388
406
  return {
389
407
  value: obs.values[index],
390
408
  code: obs.codes[obs.values[index]],
@@ -394,13 +412,21 @@ export function ContinuousObs(_ref4) {
394
412
  },
395
413
  isOmitted: _.includes(obs.omit, obs.codes[obs.values[index]]),
396
414
  label: isNaN(obs.values[index]) ? "NaN" : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges),
415
+ histogramData: showHistograms && settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
416
+ data: (_obsHistograms$fetche2 = obsHistograms.fetchedData) === null || _obsHistograms$fetche2 === void 0 ? void 0 : _obsHistograms$fetche2[obs.values[index]],
417
+ isPending: obsHistograms.isPending,
418
+ altColor: isSliced
419
+ } : {
420
+ data: null,
421
+ isPending: false
422
+ },
397
423
  filteredStats: {
398
424
  value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
399
425
  pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
400
426
  },
401
427
  isSliced: isSliced
402
428
  };
403
- };
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]);
404
430
  return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ListGroup, {
405
431
  variant: "flush",
406
432
  className: "cherita-list"
@@ -417,7 +443,8 @@ export function ContinuousObs(_ref4) {
417
443
  min: min,
418
444
  max: max,
419
445
  onChange: toggleObs,
420
- showColor: false
446
+ showColor: false,
447
+ estimateSize: 42
421
448
  })), /*#__PURE__*/React.createElement(ObsContinuousStats, {
422
449
  obs: obs
423
450
  }));
@@ -48,7 +48,9 @@ export function ObsColsList(_ref2) {
48
48
  var _settings$selectedObs;
49
49
  let {
50
50
  showColor = true,
51
- enableObsGroups = true
51
+ enableObsGroups = true,
52
+ showSelectedAsActive = false,
53
+ showHistograms = true
52
54
  } = _ref2;
53
55
  const ENDPOINT = "obs/cols";
54
56
  const dataset = useDataset();
@@ -215,7 +217,7 @@ export function ObsColsList(_ref2) {
215
217
  }
216
218
  const inLabelObs = _.some(settings.labelObs, i => i.name === item.name);
217
219
  const inSliceObs = settings.sliceBy.obs && ((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.name) === item.name;
218
- const isColorEncoding = settings.colorEncoding === COLOR_ENCODINGS.OBS && ((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name;
220
+ const isColorEncoding = (showSelectedAsActive || settings.colorEncoding === COLOR_ENCODINGS.OBS) && ((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name;
219
221
  return /*#__PURE__*/React.createElement("div", {
220
222
  className: "accordion-item",
221
223
  key: item.name
@@ -242,7 +244,7 @@ export function ObsColsList(_ref2) {
242
244
  event.stopPropagation();
243
245
  toggleColor(item);
244
246
  },
245
- title: "Is color encoding"
247
+ title: showSelectedAsActive ? "Is selected" : "Is color encoding"
246
248
  }, /*#__PURE__*/React.createElement(WaterDropIcon, null)))), /*#__PURE__*/React.createElement(Accordion.Collapse, {
247
249
  eventKey: item.name
248
250
  }, /*#__PURE__*/React.createElement("div", {
@@ -255,7 +257,8 @@ export function ObsColsList(_ref2) {
255
257
  toggleLabel: () => toggleLabel(item),
256
258
  toggleSlice: () => toggleSlice(item),
257
259
  toggleColor: () => toggleColor(item),
258
- showColor: showColor && isColorEncoding
260
+ showColor: showColor && isColorEncoding,
261
+ showHistograms: showHistograms
259
262
  }) : /*#__PURE__*/React.createElement(ContinuousObs, {
260
263
  key: item.name,
261
264
  obs: item,
@@ -263,7 +266,8 @@ export function ObsColsList(_ref2) {
263
266
  toggleObs: value => toggleObs(item, value),
264
267
  toggleLabel: () => toggleLabel(item),
265
268
  toggleSlice: () => toggleSlice(item),
266
- toggleColor: () => toggleColor(item)
269
+ toggleColor: () => toggleColor(item),
270
+ showHistograms: showHistograms
267
271
  })))));
268
272
  };
269
273
  const groupList = _.map(_.keys(obsGroups), group => {