@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
@@ -8,11 +8,13 @@ var _react = _interopRequireWildcard(require("react"));
8
8
  var _lodash = _interopRequireDefault(require("lodash"));
9
9
  var _reactBootstrap = require("react-bootstrap");
10
10
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
11
+ var _constants = require("../../constants/constants");
11
12
  var _DatasetContext = require("../../context/DatasetContext");
12
13
  var _FilterContext = require("../../context/FilterContext");
13
14
  var _SettingsContext = require("../../context/SettingsContext");
14
15
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
15
16
  var _requests = require("../../utils/requests");
17
+ var _Toolbar = require("../toolbar/Toolbar");
16
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
19
  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); }
18
20
  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; }
@@ -20,8 +22,16 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
20
22
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
21
23
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
22
24
  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); }
23
- function Heatmap() {
25
+ function Heatmap(_ref) {
24
26
  var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
27
+ let {
28
+ showObsBtn = false,
29
+ showVarsBtn = false,
30
+ showCtrlsBtn = false,
31
+ setShowObs,
32
+ setShowVars,
33
+ setShowControls
34
+ } = _ref;
25
35
  const ENDPOINT = "heatmap";
26
36
  const dataset = (0, _DatasetContext.useDataset)();
27
37
  const settings = (0, _SettingsContext.useSettings)();
@@ -98,17 +108,29 @@ function Heatmap() {
98
108
  colorscale.current = settings.controls.colorScale;
99
109
  updateColorscale(colorscale.current);
100
110
  }, [settings.controls.colorScale, updateColorscale]);
111
+ const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
112
+ onClick: setShowObs
113
+ }), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
114
+ onClick: setShowVars
115
+ }), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
116
+ onClick: setShowControls
117
+ })]);
118
+ const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
101
119
  if (!serverError) {
102
120
  if (hasSelections) {
103
121
  return /*#__PURE__*/_react.default.createElement("div", {
104
- className: "cherita-heatmap position-relative"
122
+ className: "cherita-plot cherita-heatmap position-relative"
105
123
  }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
106
124
  data: data,
107
125
  layout: layout,
108
126
  useResizeHandler: true,
109
127
  style: {
110
- maxWidth: "100%",
111
- maxHeight: "100%"
128
+ width: "100%",
129
+ height: "100%"
130
+ },
131
+ config: {
132
+ displaylogo: false,
133
+ modeBarButtons: modeBarButtons
112
134
  }
113
135
  }));
114
136
  }
@@ -116,7 +138,15 @@ function Heatmap() {
116
138
  className: "cherita-heatmap"
117
139
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
118
140
  variant: "light"
119
- }, "Select features and a category"));
141
+ }, "Select", " ", showVarsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
142
+ variant: "link",
143
+ className: "border-0 p-0 align-baseline",
144
+ onClick: setShowVars
145
+ }, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
146
+ variant: "link",
147
+ className: "border-0 p-0 align-baseline",
148
+ onClick: setShowObs
149
+ }, "category") : "category"));
120
150
  } else {
121
151
  return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
122
152
  variant: "danger"
@@ -8,11 +8,13 @@ var _react = _interopRequireWildcard(require("react"));
8
8
  var _lodash = _interopRequireDefault(require("lodash"));
9
9
  var _reactBootstrap = require("react-bootstrap");
10
10
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
11
+ var _constants = require("../../constants/constants");
11
12
  var _DatasetContext = require("../../context/DatasetContext");
12
13
  var _FilterContext = require("../../context/FilterContext");
13
14
  var _SettingsContext = require("../../context/SettingsContext");
14
15
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
15
16
  var _requests = require("../../utils/requests");
17
+ var _Toolbar = require("../toolbar/Toolbar");
16
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
19
  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); }
18
20
  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; }
@@ -20,8 +22,16 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
20
22
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
21
23
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
22
24
  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); }
23
- function Matrixplot() {
25
+ function Matrixplot(_ref) {
24
26
  var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
27
+ let {
28
+ showObsBtn = false,
29
+ showVarsBtn = false,
30
+ showCtrlsBtn = false,
31
+ setShowObs,
32
+ setShowVars,
33
+ setShowControls
34
+ } = _ref;
25
35
  const ENDPOINT = "matrixplot";
26
36
  const dataset = (0, _DatasetContext.useDataset)();
27
37
  const settings = (0, _SettingsContext.useSettings)();
@@ -100,17 +110,29 @@ function Matrixplot() {
100
110
  colorscale.current = settings.controls.colorScale;
101
111
  updateColorscale(colorscale.current);
102
112
  }, [settings.controls.colorScale, updateColorscale]);
113
+ const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
114
+ onClick: setShowObs
115
+ }), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
116
+ onClick: setShowVars
117
+ }), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
118
+ onClick: setShowControls
119
+ })]);
120
+ const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
103
121
  if (!serverError) {
104
122
  if (hasSelections) {
105
123
  return /*#__PURE__*/_react.default.createElement("div", {
106
- className: "cherita-matrixplot position-relative"
124
+ className: "cherita-plot cherita-matrixplot position-relative"
107
125
  }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
108
126
  data: data,
109
127
  layout: layout,
110
128
  useResizeHandler: true,
111
129
  style: {
112
- maxWidth: "100%",
113
- maxHeight: "100%"
130
+ width: "100%",
131
+ height: "100%"
132
+ },
133
+ config: {
134
+ displaylogo: false,
135
+ modeBarButtons: modeBarButtons
114
136
  }
115
137
  }));
116
138
  }
@@ -118,7 +140,15 @@ function Matrixplot() {
118
140
  className: "cherita-matrixplot"
119
141
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
120
142
  variant: "light"
121
- }, "Select features and a category"));
143
+ }, "Select", " ", showVarsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
144
+ variant: "link",
145
+ className: "border-0 p-0 align-baseline",
146
+ onClick: setShowVars
147
+ }, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
148
+ variant: "link",
149
+ className: "border-0 p-0 align-baseline",
150
+ onClick: setShowObs
151
+ }, "category") : "category"));
122
152
  } else {
123
153
  return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
124
154
  variant: "danger"
@@ -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,
@@ -155,8 +158,12 @@ function CategoricalItem(_ref) {
155
158
  pct: null
156
159
  },
157
160
  isSliced,
161
+ colors = null,
158
162
  showColor = true
159
- } = _ref;
163
+ } = _ref2;
164
+ const {
165
+ useUnsColors
166
+ } = (0, _DatasetContext.useDataset)();
160
167
  const {
161
168
  getColor
162
169
  } = (0, _colorHelper.useColor)();
@@ -241,7 +248,7 @@ function CategoricalItem(_ref) {
241
248
  y: "0",
242
249
  width: "10",
243
250
  height: "10",
244
- fill: "rgb(".concat(getColor({
251
+ fill: "rgb(".concat(getColor(_objectSpread({
245
252
  value: (code - min) / (max - min),
246
253
  categorical: true,
247
254
  grayOut: isOmitted,
@@ -249,16 +256,19 @@ function CategoricalItem(_ref) {
249
256
  alpha: 1
250
257
  },
251
258
  colorEncoding: "obs"
252
- }), ")")
259
+ }, useUnsColors ? {
260
+ colorscale: colors
261
+ } : {})), ")")
253
262
  }))) : null))));
254
263
  }
255
- function CategoricalObs(_ref2) {
264
+ function CategoricalObs(_ref3) {
256
265
  let {
257
266
  obs,
258
267
  toggleAll,
259
268
  toggleObs,
260
- showColor = true
261
- } = _ref2;
269
+ showColor = true,
270
+ showHistograms = true
271
+ } = _ref3;
262
272
  const settings = (0, _SettingsContext.useSettings)();
263
273
  const {
264
274
  isSliced
@@ -266,7 +276,9 @@ function CategoricalObs(_ref2) {
266
276
  const totalCounts = _lodash.default.sum(_lodash.default.values(obs.value_counts));
267
277
  const min = _lodash.default.min(_lodash.default.values(obs.codes));
268
278
  const max = _lodash.default.max(_lodash.default.values(obs.codes));
269
- const obsHistograms = useObsHistogram(obs);
279
+ const obsHistograms = useObsHistogram(obs, {
280
+ enabled: showHistograms
281
+ });
270
282
  const filteredObsData = useFilteredObsData(obs);
271
283
  const getDataAtIndex = (0, _react.useCallback)(index => {
272
284
  var _obsHistograms$fetche;
@@ -279,7 +291,7 @@ function CategoricalObs(_ref2) {
279
291
  },
280
292
  isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
281
293
  label: obs.values[index],
282
- histogramData: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? {
294
+ histogramData: showHistograms && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? {
283
295
  data: (_obsHistograms$fetche = obsHistograms.fetchedData) === null || _obsHistograms$fetche === void 0 ? void 0 : _obsHistograms$fetche[obs.values[index]],
284
296
  isPending: obsHistograms.isPending,
285
297
  altColor: isSliced
@@ -291,9 +303,10 @@ function CategoricalObs(_ref2) {
291
303
  value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
292
304
  pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
293
305
  },
294
- isSliced: isSliced
306
+ isSliced: isSliced,
307
+ colors: obs.colors
295
308
  };
296
- }, [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]);
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]);
297
310
  showColor &= settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS;
298
311
  return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
299
312
  variant: "flush",
@@ -315,10 +328,10 @@ function CategoricalObs(_ref2) {
315
328
  estimateSize: 42
316
329
  }));
317
330
  }
318
- function ObsContinuousStats(_ref3) {
331
+ function ObsContinuousStats(_ref4) {
319
332
  let {
320
333
  obs
321
- } = _ref3;
334
+ } = _ref4;
322
335
  const ENDPOINT = "obs/distribution";
323
336
  const dataset = (0, _DatasetContext.useDataset)();
324
337
  const params = {
@@ -378,21 +391,26 @@ function ObsContinuousStats(_ref3) {
378
391
  }
379
392
 
380
393
  // @TODO: add bin controls
381
- // @TODO: add histogram
382
- function ContinuousObs(_ref4) {
394
+ function ContinuousObs(_ref5) {
383
395
  let {
384
396
  obs,
385
397
  toggleAll,
386
- toggleObs
387
- } = _ref4;
398
+ toggleObs,
399
+ showHistograms = true
400
+ } = _ref5;
401
+ const settings = (0, _SettingsContext.useSettings)();
388
402
  const {
389
403
  isSliced
390
404
  } = (0, _FilterContext.useFilteredData)();
391
405
  const totalCounts = _lodash.default.sum(_lodash.default.values(obs.value_counts));
392
406
  const min = _lodash.default.min(_lodash.default.values(obs.codes));
393
407
  const max = _lodash.default.max(_lodash.default.values(obs.codes));
408
+ const obsHistograms = useObsHistogram(obs, {
409
+ enabled: showHistograms
410
+ });
394
411
  const filteredObsData = useFilteredObsData(obs);
395
- const getDataAtIndex = index => {
412
+ const getDataAtIndex = (0, _react.useCallback)(index => {
413
+ var _obsHistograms$fetche2;
396
414
  return {
397
415
  value: obs.values[index],
398
416
  code: obs.codes[obs.values[index]],
@@ -402,13 +420,21 @@ function ContinuousObs(_ref4) {
402
420
  },
403
421
  isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
404
422
  label: isNaN(obs.values[index]) ? "NaN" : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges),
423
+ histogramData: showHistograms && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? {
424
+ data: (_obsHistograms$fetche2 = obsHistograms.fetchedData) === null || _obsHistograms$fetche2 === void 0 ? void 0 : _obsHistograms$fetche2[obs.values[index]],
425
+ isPending: obsHistograms.isPending,
426
+ altColor: isSliced
427
+ } : {
428
+ data: null,
429
+ isPending: false
430
+ },
405
431
  filteredStats: {
406
432
  value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
407
433
  pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
408
434
  },
409
435
  isSliced: isSliced
410
436
  };
411
- };
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]);
412
438
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
413
439
  variant: "flush",
414
440
  className: "cherita-list"
@@ -425,7 +451,8 @@ function ContinuousObs(_ref4) {
425
451
  min: min,
426
452
  max: max,
427
453
  onChange: toggleObs,
428
- showColor: false
454
+ showColor: false,
455
+ estimateSize: 42
429
456
  })), /*#__PURE__*/_react.default.createElement(ObsContinuousStats, {
430
457
  obs: obs
431
458
  }));
@@ -56,7 +56,9 @@ function ObsColsList(_ref2) {
56
56
  var _settings$selectedObs;
57
57
  let {
58
58
  showColor = true,
59
- enableObsGroups = true
59
+ enableObsGroups = true,
60
+ showSelectedAsActive = false,
61
+ showHistograms = true
60
62
  } = _ref2;
61
63
  const ENDPOINT = "obs/cols";
62
64
  const dataset = (0, _DatasetContext.useDataset)();
@@ -223,7 +225,7 @@ function ObsColsList(_ref2) {
223
225
  }
224
226
  const inLabelObs = _lodash.default.some(settings.labelObs, i => i.name === item.name);
225
227
  const inSliceObs = settings.sliceBy.obs && ((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.name) === item.name;
226
- const isColorEncoding = settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && ((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name;
228
+ const isColorEncoding = (showSelectedAsActive || settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS) && ((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name;
227
229
  return /*#__PURE__*/_react.default.createElement("div", {
228
230
  className: "accordion-item",
229
231
  key: item.name
@@ -250,7 +252,7 @@ function ObsColsList(_ref2) {
250
252
  event.stopPropagation();
251
253
  toggleColor(item);
252
254
  },
253
- title: "Is color encoding"
255
+ title: showSelectedAsActive ? "Is selected" : "Is color encoding"
254
256
  }, /*#__PURE__*/_react.default.createElement(_WaterDrop.default, null)))), /*#__PURE__*/_react.default.createElement(_Accordion.default.Collapse, {
255
257
  eventKey: item.name
256
258
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -263,7 +265,8 @@ function ObsColsList(_ref2) {
263
265
  toggleLabel: () => toggleLabel(item),
264
266
  toggleSlice: () => toggleSlice(item),
265
267
  toggleColor: () => toggleColor(item),
266
- showColor: showColor && isColorEncoding
268
+ showColor: showColor && isColorEncoding,
269
+ showHistograms: showHistograms
267
270
  }) : /*#__PURE__*/_react.default.createElement(_ObsItem.ContinuousObs, {
268
271
  key: item.name,
269
272
  obs: item,
@@ -271,7 +274,8 @@ function ObsColsList(_ref2) {
271
274
  toggleObs: value => toggleObs(item, value),
272
275
  toggleLabel: () => toggleLabel(item),
273
276
  toggleSlice: () => toggleSlice(item),
274
- toggleColor: () => toggleColor(item)
277
+ toggleColor: () => toggleColor(item),
278
+ showHistograms: showHistograms
275
279
  })))));
276
280
  };
277
281
  const groupList = _lodash.default.map(_lodash.default.keys(obsGroups), group => {