@haniffalab/cherita-react 1.3.0 → 1.3.1

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 (137) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/controls/Controls.js +38 -30
  3. package/dist/cjs/components/dotplot/Dotplot.js +85 -57
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +167 -114
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +102 -0
  8. package/dist/cjs/components/heatmap/Heatmap.js +83 -53
  9. package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
  10. package/dist/cjs/components/icons/DotPlotIcon.js +64 -0
  11. package/dist/cjs/components/icons/HeatmapIcon.js +45 -0
  12. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +57 -0
  13. package/dist/cjs/components/icons/MatrixPlotIcon.js +59 -0
  14. package/dist/cjs/components/icons/ScatterplotIcon.1.js +164 -0
  15. package/dist/cjs/components/icons/ScatterplotIcon.js +144 -0
  16. package/dist/cjs/components/icons/ViolinPlotIcon.js +42 -0
  17. package/dist/cjs/components/matrixplot/Matrixplot.js +83 -54
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +305 -216
  20. package/dist/cjs/components/obs-list/ObsList.js +164 -128
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +67 -28
  23. package/dist/cjs/components/offcanvas/index.js +62 -27
  24. package/dist/cjs/components/pseudospatial/Pseudospatial.js +132 -76
  25. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +122 -74
  26. package/dist/cjs/components/scatterplot/Scatterplot.js +223 -175
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +143 -116
  29. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  30. package/dist/cjs/components/search-bar/SearchBar.js +176 -120
  31. package/dist/cjs/components/search-bar/SearchInfo.js +79 -85
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +111 -0
  34. package/dist/cjs/components/var-list/VarItem.js +131 -103
  35. package/dist/cjs/components/var-list/VarList.js +96 -74
  36. package/dist/cjs/components/var-list/VarListToolbar.js +59 -54
  37. package/dist/cjs/components/var-list/VarSet.js +126 -108
  38. package/dist/cjs/components/violin/Violin.js +124 -81
  39. package/dist/cjs/components/violin/ViolinControls.js +8 -5
  40. package/dist/cjs/constants/colorscales.js +19 -19
  41. package/dist/cjs/constants/constants.js +54 -39
  42. package/dist/cjs/context/DatasetContext.js +27 -17
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +339 -125
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/map-helper.js +2 -1
  48. package/dist/cjs/helpers/zarr-helper.js +3 -3
  49. package/dist/cjs/index.js +15 -21
  50. package/dist/cjs/utils/Filter.js +16 -11
  51. package/dist/cjs/utils/Histogram.js +35 -33
  52. package/dist/cjs/utils/ImageViewer.js +11 -8
  53. package/dist/cjs/utils/Legend.js +37 -30
  54. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  55. package/dist/cjs/utils/Resolver.js +213 -0
  56. package/dist/cjs/utils/Skeleton.js +10 -10
  57. package/dist/cjs/utils/StyledTooltip.js +44 -0
  58. package/dist/cjs/utils/VirtualizedList.js +36 -29
  59. package/dist/cjs/utils/errors.js +15 -15
  60. package/dist/cjs/utils/requests.js +21 -9
  61. package/dist/cjs/utils/search.js +4 -4
  62. package/dist/cjs/utils/string.js +6 -6
  63. package/dist/cjs/utils/zarrData.js +20 -21
  64. package/dist/css/cherita.css +188 -65
  65. package/dist/css/cherita.css.map +1 -1
  66. package/dist/esm/components/controls/Controls.js +43 -35
  67. package/dist/esm/components/dotplot/Dotplot.js +93 -64
  68. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  69. package/dist/esm/components/full-page/FullPage.js +180 -124
  70. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  71. package/dist/esm/components/full-page/PlotTypeSelector.js +95 -0
  72. package/dist/esm/components/heatmap/Heatmap.js +91 -60
  73. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  74. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  75. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  76. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  77. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  78. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  79. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  80. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  81. package/dist/esm/components/matrixplot/Matrixplot.js +91 -61
  82. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  83. package/dist/esm/components/obs-list/ObsItem.js +320 -228
  84. package/dist/esm/components/obs-list/ObsList.js +179 -142
  85. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  86. package/dist/esm/components/obsm-list/ObsmList.js +71 -32
  87. package/dist/esm/components/offcanvas/index.js +68 -33
  88. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  89. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  90. package/dist/esm/components/scatterplot/Scatterplot.js +243 -194
  91. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  92. package/dist/esm/components/scatterplot/SpatialControls.js +155 -127
  93. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  94. package/dist/esm/components/search-bar/SearchBar.js +187 -130
  95. package/dist/esm/components/search-bar/SearchInfo.js +86 -91
  96. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  97. package/dist/esm/components/toolbar/Toolbar.js +101 -0
  98. package/dist/esm/components/var-list/VarItem.js +142 -113
  99. package/dist/esm/components/var-list/VarList.js +108 -88
  100. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  101. package/dist/esm/components/var-list/VarSet.js +134 -115
  102. package/dist/esm/components/violin/Violin.js +135 -91
  103. package/dist/esm/components/violin/ViolinControls.js +10 -6
  104. package/dist/esm/constants/colorscales.js +19 -19
  105. package/dist/esm/constants/constants.js +53 -38
  106. package/dist/esm/context/DatasetContext.js +34 -23
  107. package/dist/esm/context/FilterContext.js +11 -8
  108. package/dist/esm/context/SettingsContext.js +341 -126
  109. package/dist/esm/context/ZarrDataContext.js +8 -6
  110. package/dist/esm/helpers/color-helper.js +5 -5
  111. package/dist/esm/helpers/map-helper.js +4 -3
  112. package/dist/esm/helpers/zarr-helper.js +6 -6
  113. package/dist/esm/index.js +22 -22
  114. package/dist/esm/utils/Filter.js +22 -17
  115. package/dist/esm/utils/Histogram.js +39 -37
  116. package/dist/esm/utils/ImageViewer.js +12 -8
  117. package/dist/esm/utils/Legend.js +44 -36
  118. package/dist/esm/utils/LoadingIndicators.js +16 -13
  119. package/dist/esm/utils/Resolver.js +201 -0
  120. package/dist/esm/utils/Skeleton.js +11 -10
  121. package/dist/esm/utils/StyledTooltip.js +38 -0
  122. package/dist/esm/utils/VirtualizedList.js +37 -29
  123. package/dist/esm/utils/errors.js +15 -15
  124. package/dist/esm/utils/requests.js +24 -12
  125. package/dist/esm/utils/search.js +7 -7
  126. package/dist/esm/utils/string.js +7 -7
  127. package/dist/esm/utils/zarrData.js +27 -28
  128. package/package.json +21 -8
  129. package/scss/cherita-bootstrap.scss +2 -2
  130. package/scss/cherita.scss +65 -17
  131. package/scss/components/accordions.scss +15 -2
  132. package/scss/components/layouts.scss +116 -30
  133. package/scss/components/lists.scss +16 -5
  134. package/scss/components/plotly.scss +40 -23
  135. package/scss/components/plots.scss +14 -1
  136. package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
  137. package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
@@ -5,7 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.CategoricalObs = CategoricalObs;
7
7
  exports.ContinuousObs = ContinuousObs;
8
- var _react = _interopRequireWildcard(require("react"));
8
+ var _react = require("react");
9
9
  var _material = require("@mui/material");
10
10
  var _xCharts = require("@mui/x-charts");
11
11
  var _lodash = _interopRequireDefault(require("lodash"));
@@ -19,18 +19,17 @@ var _colorHelper = require("../../helpers/color-helper");
19
19
  var _Histogram = require("../../utils/Histogram");
20
20
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
21
21
  var _requests = require("../../utils/requests");
22
+ var _Resolver = require("../../utils/Resolver");
22
23
  var _string = require("../../utils/string");
23
24
  var _VirtualizedList = require("../../utils/VirtualizedList");
24
25
  var _zarrData = require("../../utils/zarrData");
26
+ var _jsxRuntime = require("react/jsx-runtime");
25
27
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
26
- 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); }
27
28
  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; }
28
29
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
29
30
  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; }
30
31
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
31
- 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); }
32
- // const N_BINS = 5;
33
-
32
+ 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); } // const N_BINS = 5;
34
33
  // function binContinuous(data, nBins) {
35
34
  // const binSize = (data.max - data.min) * (1 / nBins);
36
35
  // const thresholds = _.range(nBins + 1).map((b) => {
@@ -48,44 +47,45 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
48
47
  // };
49
48
  // return { ...data, bins: bins };
50
49
  // }
51
-
52
50
  function getContinuousLabel(code, binEdges) {
53
- return "[ ".concat((0, _string.formatNumerical)(binEdges[code][0]), ", ").concat((0, _string.formatNumerical)(binEdges[code][1], _string.FORMATS.EXPONENTIAL)).concat(code === binEdges.length - 1 ? " ]" : " )");
51
+ return "[ ".concat((0, _string.formatNumerical)(binEdges[code][0]), ", ").concat((0, _string.formatNumerical)(binEdges[code][1], _string.FORMATS.EXPONENTIAL)).concat(code === binEdges.length - 1 ? ' ]' : ' )');
54
52
  }
55
- const useObsHistogram = obs => {
56
- var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedVar9, _settings$selectedVar0, _settings$selectedVar1, _settings$selectedVar10;
57
- const ENDPOINT = "obs/histograms";
53
+ const useObsHistogram = (obs, _ref) => {
54
+ let {
55
+ enabled = true
56
+ } = _ref;
57
+ const ENDPOINT = 'obs/histograms';
58
58
  const dataset = (0, _DatasetContext.useDataset)();
59
59
  const settings = (0, _SettingsContext.useSettings)();
60
60
  const {
61
61
  obsIndices,
62
62
  isSliced
63
63
  } = (0, _FilterContext.useFilteredData)();
64
+ const selectedVar = (0, _Resolver.useSelectedVar)();
64
65
  const [params, setParams] = (0, _react.useState)({
65
66
  url: dataset.url,
66
- obsCol: _lodash.default.omit(obs, "omit"),
67
+ obsCol: _lodash.default.omit(obs, 'omit'),
67
68
  // avoid re-rendering when toggling unselected obs
68
- varKey: (_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet ? {
69
- name: (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name,
70
- indices: (_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars.map(v => v.index)
71
- } : (_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.index,
69
+ varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
70
+ name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
71
+ indices: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars.map(v => v.index)
72
+ } : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index,
72
73
  obsIndices: isSliced ? [...(obsIndices || [])] : null
73
74
  });
74
75
  (0, _react.useEffect)(() => {
75
76
  setParams(p => {
76
- var _settings$selectedVar5, _settings$selectedVar6, _settings$selectedVar7, _settings$selectedVar8;
77
77
  return _objectSpread(_objectSpread({}, p), {}, {
78
- obsCol: _lodash.default.omit(obs, "omit"),
79
- varKey: (_settings$selectedVar5 = settings.selectedVar) !== null && _settings$selectedVar5 !== void 0 && _settings$selectedVar5.isSet ? {
80
- name: (_settings$selectedVar6 = settings.selectedVar) === null || _settings$selectedVar6 === void 0 ? void 0 : _settings$selectedVar6.name,
81
- indices: (_settings$selectedVar7 = settings.selectedVar) === null || _settings$selectedVar7 === void 0 ? void 0 : _settings$selectedVar7.vars.map(v => v.index)
82
- } : (_settings$selectedVar8 = settings.selectedVar) === null || _settings$selectedVar8 === void 0 ? void 0 : _settings$selectedVar8.index,
78
+ obsCol: _lodash.default.omit(obs, 'omit'),
79
+ varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
80
+ name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
81
+ indices: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars.map(v => v.index)
82
+ } : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index,
83
83
  obsIndices: isSliced ? [...(obsIndices || [])] : null
84
84
  });
85
85
  });
86
- }, [(_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]);
86
+ }, [selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.isSet, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars, obsIndices, isSliced, obs]);
87
87
  return (0, _requests.useFetch)(ENDPOINT, params, {
88
- enabled: !!settings.selectedVar && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR,
88
+ enabled: enabled && !!selectedVar && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR,
89
89
  refetchOnMount: false
90
90
  });
91
91
  };
@@ -132,7 +132,7 @@ const useFilteredObsData = obs => {
132
132
  pct: pct
133
133
  };
134
134
  };
135
- function CategoricalItem(_ref) {
135
+ function CategoricalItem(_ref2) {
136
136
  let {
137
137
  value,
138
138
  label,
@@ -155,110 +155,136 @@ function CategoricalItem(_ref) {
155
155
  pct: null
156
156
  },
157
157
  isSliced,
158
+ colors = null,
158
159
  showColor = true
159
- } = _ref;
160
+ } = _ref2;
161
+ const {
162
+ useUnsColors
163
+ } = (0, _DatasetContext.useDataset)();
160
164
  const {
161
165
  getColor
162
166
  } = (0, _colorHelper.useColor)();
163
- return /*#__PURE__*/_react.default.createElement("div", {
164
- className: "virtualized-list-wrapper"
165
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
166
- key: value,
167
- className: "obs-item"
168
- }, /*#__PURE__*/_react.default.createElement("div", {
169
- className: "d-flex align-items-center"
170
- }, /*#__PURE__*/_react.default.createElement("div", {
171
- className: "flex-grow-1"
172
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Check, {
173
- className: "obs-value-list-check",
174
- type: "switch",
175
- label: label,
176
- checked: !isOmitted,
177
- onChange: () => onChange(value)
178
- })), /*#__PURE__*/_react.default.createElement("div", {
179
- className: "d-flex align-items-center"
180
- }, /*#__PURE__*/_react.default.createElement("div", {
181
- className: "pl-1 m-0 flex-grow-1"
182
- }, /*#__PURE__*/_react.default.createElement(_Histogram.Histogram, {
183
- data: histogramData.data,
184
- isPending: histogramData.isPending,
185
- altColor: histogramData.altColor
186
- })), /*#__PURE__*/_react.default.createElement("div", {
187
- className: "pl-1 m-0"
188
- }, /*#__PURE__*/_react.default.createElement(_material.Tooltip, {
189
- title: isSliced ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, "Filtered:", " ", (0, _string.formatNumerical)(filteredStats.pct, _string.FORMATS.EXPONENTIAL), "%", /*#__PURE__*/_react.default.createElement("br", null), "Total: ", (0, _string.formatNumerical)(stats.pct, _string.FORMATS.EXPONENTIAL), "%") : "".concat((0, _string.formatNumerical)(stats.pct, _string.FORMATS.EXPONENTIAL), "%"),
190
- placement: "left",
191
- arrow: true
192
- }, /*#__PURE__*/_react.default.createElement("div", {
193
- className: "d-flex align-items-center"
194
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Badge, {
195
- className: "value-count-badge"
196
- }, " ", isSliced && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, (0, _string.formatNumerical)(parseInt(filteredStats.value_counts)), " ", "out of", " "), (0, _string.formatNumerical)(parseInt(stats.value_counts), _string.FORMATS.EXPONENTIAL)), /*#__PURE__*/_react.default.createElement("div", {
197
- className: "value-pct-gauge-container"
198
- }, isSliced ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_xCharts.Gauge, {
199
- className: "pct-gauge filtered-pct-gauge",
200
- value: filteredStats.pct,
201
- text: null,
202
- innerRadius: "50%",
203
- outerRadius: "75%",
204
- margin: {
205
- top: 0,
206
- right: 0,
207
- bottom: 0,
208
- left: 0
209
- }
210
- }), /*#__PURE__*/_react.default.createElement(_xCharts.Gauge, {
211
- className: "pct-gauge",
212
- value: stats.pct,
213
- text: null,
214
- innerRadius: "75%",
215
- margin: {
216
- top: 0,
217
- right: 0,
218
- bottom: 0,
219
- left: 0
220
- }
221
- })) : /*#__PURE__*/_react.default.createElement(_xCharts.Gauge, {
222
- value: stats.pct,
223
- text: null,
224
- innerRadius: "50%",
225
- margin: {
226
- top: 0,
227
- right: 0,
228
- bottom: 0,
229
- left: 0
230
- }
231
- }))))), showColor ? /*#__PURE__*/_react.default.createElement("div", {
232
- className: "pl-1"
233
- }, /*#__PURE__*/_react.default.createElement("svg", {
234
- xmlns: "http://www.w3.org/2000/svg",
235
- width: 24,
236
- height: 24,
237
- fill: "currentColor",
238
- viewBox: "0 0 10 10"
239
- }, /*#__PURE__*/_react.default.createElement("rect", {
240
- x: "0",
241
- y: "0",
242
- width: "10",
243
- height: "10",
244
- fill: "rgb(".concat(getColor({
245
- value: (code - min) / (max - min),
246
- categorical: true,
247
- grayOut: isOmitted,
248
- grayParams: {
249
- alpha: 1
250
- },
251
- colorEncoding: "obs"
252
- }), ")")
253
- }))) : null))));
167
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
168
+ className: "virtualized-list-wrapper",
169
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
170
+ className: "obs-item",
171
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
172
+ className: "d-flex align-items-center flex-wrap",
173
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
174
+ className: "flex-grow-1 me-auto mw-100",
175
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Check, {
176
+ className: "obs-value-list-check",
177
+ type: "switch",
178
+ title: label,
179
+ label: label,
180
+ checked: !isOmitted,
181
+ onChange: () => onChange(value)
182
+ })
183
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
184
+ className: "d-flex align-items-center ms-auto",
185
+ children: [(!!histogramData.data || histogramData.isPending) && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
186
+ className: "pl-1 m-0",
187
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Histogram.Histogram, {
188
+ data: histogramData.data,
189
+ isPending: histogramData.isPending,
190
+ altColor: histogramData.altColor
191
+ })
192
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
193
+ className: "pl-1 m-0",
194
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
195
+ title: isSliced ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
196
+ children: ["Filtered:", ' ', (0, _string.formatNumerical)(filteredStats.pct, _string.FORMATS.EXPONENTIAL), "%", /*#__PURE__*/(0, _jsxRuntime.jsx)("br", {}), "Total: ", (0, _string.formatNumerical)(stats.pct, _string.FORMATS.EXPONENTIAL), "%"]
197
+ }) : "".concat((0, _string.formatNumerical)(stats.pct, _string.FORMATS.EXPONENTIAL), "%"),
198
+ placement: "left",
199
+ arrow: true,
200
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
201
+ className: "d-flex align-items-center",
202
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Badge, {
203
+ className: "value-count-badge",
204
+ children: [' ', isSliced && parseInt(filteredStats.value_counts) !== parseInt(stats.value_counts) && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
205
+ children: [(0, _string.formatNumerical)(parseInt(filteredStats.value_counts)), ' ', "out of", ' ']
206
+ }), (0, _string.formatNumerical)(parseInt(stats.value_counts), _string.FORMATS.EXPONENTIAL)]
207
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
208
+ className: "value-pct-gauge-container",
209
+ children: isSliced ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
210
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_xCharts.Gauge, {
211
+ className: "pct-gauge filtered-pct-gauge",
212
+ value: filteredStats.pct,
213
+ text: null,
214
+ innerRadius: '50%',
215
+ outerRadius: '75%',
216
+ margin: {
217
+ top: 0,
218
+ right: 0,
219
+ bottom: 0,
220
+ left: 0
221
+ }
222
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_xCharts.Gauge, {
223
+ className: "pct-gauge",
224
+ value: stats.pct,
225
+ text: null,
226
+ innerRadius: '75%',
227
+ margin: {
228
+ top: 0,
229
+ right: 0,
230
+ bottom: 0,
231
+ left: 0
232
+ }
233
+ })]
234
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_xCharts.Gauge, {
235
+ value: stats.pct,
236
+ text: null,
237
+ innerRadius: '50%',
238
+ margin: {
239
+ top: 0,
240
+ right: 0,
241
+ bottom: 0,
242
+ left: 0
243
+ }
244
+ })
245
+ })]
246
+ })
247
+ })
248
+ }), showColor ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
249
+ className: "pl-1",
250
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
251
+ xmlns: "http://www.w3.org/2000/svg",
252
+ width: 24,
253
+ height: 24,
254
+ fill: "currentColor",
255
+ viewBox: "0 0 10 10",
256
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("rect", {
257
+ x: "0",
258
+ y: "0",
259
+ width: "10",
260
+ height: "10",
261
+ fill: "rgb(".concat(getColor(_objectSpread({
262
+ value: (code - min) / (max - min),
263
+ categorical: true,
264
+ grayOut: isOmitted,
265
+ grayParams: {
266
+ alpha: 1
267
+ },
268
+ colorEncoding: 'obs'
269
+ }, useUnsColors ? {
270
+ colorscale: colors
271
+ } : {})), ")")
272
+ })
273
+ })
274
+ }) : null]
275
+ })]
276
+ })
277
+ }, value)
278
+ });
254
279
  }
255
- function CategoricalObs(_ref2) {
280
+ function CategoricalObs(_ref3) {
256
281
  let {
257
282
  obs,
258
283
  toggleAll,
259
284
  toggleObs,
260
- showColor = true
261
- } = _ref2;
285
+ showColor = true,
286
+ showHistograms = true
287
+ } = _ref3;
262
288
  const settings = (0, _SettingsContext.useSettings)();
263
289
  const {
264
290
  isSliced
@@ -266,8 +292,11 @@ function CategoricalObs(_ref2) {
266
292
  const totalCounts = _lodash.default.sum(_lodash.default.values(obs.value_counts));
267
293
  const min = _lodash.default.min(_lodash.default.values(obs.codes));
268
294
  const max = _lodash.default.max(_lodash.default.values(obs.codes));
269
- const obsHistograms = useObsHistogram(obs);
295
+ const obsHistograms = useObsHistogram(obs, {
296
+ enabled: showHistograms
297
+ });
270
298
  const filteredObsData = useFilteredObsData(obs);
299
+ const enabledHistograms = (0, _react.useMemo)(() => showHistograms && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR, [settings.colorEncoding, showHistograms]);
271
300
  const getDataAtIndex = (0, _react.useCallback)(index => {
272
301
  var _obsHistograms$fetche;
273
302
  return {
@@ -277,9 +306,9 @@ function CategoricalObs(_ref2) {
277
306
  value_counts: obs.value_counts[obs.values[index]],
278
307
  pct: obs.value_counts[obs.values[index]] / totalCounts * 100
279
308
  },
280
- isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
309
+ isOmitted: _lodash.default.includes(obs.omit, obs.values[index]),
281
310
  label: obs.values[index],
282
- histogramData: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? {
311
+ histogramData: enabledHistograms ? {
283
312
  data: (_obsHistograms$fetche = obsHistograms.fetchedData) === null || _obsHistograms$fetche === void 0 ? void 0 : _obsHistograms$fetche[obs.values[index]],
284
313
  isPending: obsHistograms.isPending,
285
314
  altColor: isSliced
@@ -291,35 +320,42 @@ function CategoricalObs(_ref2) {
291
320
  value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
292
321
  pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
293
322
  },
294
- isSliced: isSliced
323
+ isSliced: isSliced,
324
+ colors: obs.colors
295
325
  };
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]);
326
+ }, [obs.values, obs.codes, obs.value_counts, obs.omit, obs.colors, totalCounts, enabledHistograms, 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
327
  showColor &= settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS;
298
- return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
328
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.ListGroup, {
299
329
  variant: "flush",
300
- className: "cherita-list"
301
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
302
- className: "unstyled"
303
- }, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
304
- item: obs,
305
- onToggleAllObs: toggleAll
306
- })), /*#__PURE__*/_react.default.createElement(_VirtualizedList.VirtualizedList, {
307
- getDataAtIndex: getDataAtIndex,
308
- count: obs.values.length,
309
- ItemComponent: CategoricalItem,
310
- totalCounts: totalCounts,
311
- min: min,
312
- max: max,
313
- onChange: toggleObs,
314
- showColor: showColor,
315
- estimateSize: 42
316
- }));
330
+ className: "cherita-list",
331
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
332
+ className: "unstyled",
333
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsToolbar.ObsToolbar, {
334
+ item: obs,
335
+ onToggleAllObs: toggleAll
336
+ })
337
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_VirtualizedList.VirtualizedList, {
338
+ getDataAtIndex: getDataAtIndex,
339
+ count: obs.values.length,
340
+ ItemComponent: CategoricalItem,
341
+ totalCounts: totalCounts,
342
+ min: min,
343
+ max: max,
344
+ onChange: toggleObs,
345
+ showColor: showColor,
346
+ estimateSize: i =>
347
+ // rough attempt to determine size based on label length
348
+ // estimate size of 68 pixels if label is long (>=25 chars if enabledHistograms, >=30 if showColor, >=35 otherwise), else 42
349
+ // TODO: consider isSliced as count badge will be longer ?
350
+ obs.values[i].length >= (enabledHistograms ? 25 : showColor ? 30 : 35) ? 68 : 42
351
+ })]
352
+ });
317
353
  }
318
- function ObsContinuousStats(_ref3) {
354
+ function ObsContinuousStats(_ref4) {
319
355
  let {
320
356
  obs
321
- } = _ref3;
322
- const ENDPOINT = "obs/distribution";
357
+ } = _ref4;
358
+ const ENDPOINT = 'obs/distribution';
323
359
  const dataset = (0, _DatasetContext.useDataset)();
324
360
  const params = {
325
361
  url: dataset.url,
@@ -332,67 +368,103 @@ function ObsContinuousStats(_ref3) {
332
368
  } = (0, _requests.useFetch)(ENDPOINT, params);
333
369
 
334
370
  // @TODO: fix width issue when min/max/etc values are too large
335
- return /*#__PURE__*/_react.default.createElement("div", {
336
- className: "obs-statistics"
337
- }, /*#__PURE__*/_react.default.createElement("h5", {
338
- className: "mb-2"
339
- }, "Statistics"), /*#__PURE__*/_react.default.createElement("div", {
340
- className: "row"
341
- }, /*#__PURE__*/_react.default.createElement("div", {
342
- className: "col-md-7"
343
- }, /*#__PURE__*/_react.default.createElement("p", {
344
- className: "mb-1 small"
345
- }, "Distribution of continuous values"), isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingLinear, null), !isPending && !serverError && /*#__PURE__*/_react.default.createElement("div", {
346
- className: "obs-distribution"
347
- }, /*#__PURE__*/_react.default.createElement(_xCharts.SparkLineChart, {
348
- data: fetchedData.kde_values[1],
349
- showHighlight: true,
350
- showTooltip: true,
351
- margin: {
352
- top: 10,
353
- right: 20,
354
- bottom: 10,
355
- left: 20
356
- },
357
- xAxis: {
358
- data: fetchedData.kde_values[0],
359
- valueFormatter: v => "".concat((0, _string.formatNumerical)(v, _string.FORMATS.EXPONENTIAL))
360
- },
361
- valueFormatter: v => "".concat((0, _string.formatNumerical)(v, _string.FORMATS.EXPONENTIAL)),
362
- slotProps: {
363
- popper: {
364
- className: "feature-histogram-tooltip"
365
- }
366
- }
367
- }))), /*#__PURE__*/_react.default.createElement("div", {
368
- className: "col-md-5 d-flex flex-column text-end"
369
- }, /*#__PURE__*/_react.default.createElement("div", {
370
- className: "d-flex justify-content-between"
371
- }, /*#__PURE__*/_react.default.createElement("span", null, "Min"), " ", /*#__PURE__*/_react.default.createElement("span", null, (0, _string.formatNumerical)(obs.min, _string.FORMATS.EXPONENTIAL))), /*#__PURE__*/_react.default.createElement("div", {
372
- className: "d-flex justify-content-between"
373
- }, /*#__PURE__*/_react.default.createElement("span", null, "Max"), " ", /*#__PURE__*/_react.default.createElement("span", null, (0, _string.formatNumerical)(obs.max, _string.FORMATS.EXPONENTIAL))), /*#__PURE__*/_react.default.createElement("div", {
374
- className: "d-flex justify-content-between"
375
- }, /*#__PURE__*/_react.default.createElement("span", null, "Mean"), " ", /*#__PURE__*/_react.default.createElement("span", null, (0, _string.formatNumerical)(obs.mean, _string.FORMATS.EXPONENTIAL))), /*#__PURE__*/_react.default.createElement("div", {
376
- className: "d-flex justify-content-between"
377
- }, /*#__PURE__*/_react.default.createElement("span", null, "Median"), " ", /*#__PURE__*/_react.default.createElement("span", null, (0, _string.formatNumerical)(obs.median, _string.FORMATS.EXPONENTIAL))))));
371
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
372
+ className: "obs-statistics",
373
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
374
+ className: "mb-2",
375
+ children: "Statistics"
376
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
377
+ className: "row",
378
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
379
+ className: "col-md-7",
380
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
381
+ className: "mb-1 small",
382
+ children: "Distribution of continuous values"
383
+ }), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingLinear, {}), !isPending && !serverError && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
384
+ className: "obs-distribution",
385
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_xCharts.SparkLineChart, {
386
+ data: fetchedData.kde_values[1],
387
+ showHighlight: true,
388
+ showTooltip: true,
389
+ margin: {
390
+ top: 10,
391
+ right: 20,
392
+ bottom: 10,
393
+ left: 20
394
+ },
395
+ xAxis: {
396
+ data: fetchedData.kde_values[0],
397
+ valueFormatter: v => "".concat((0, _string.formatNumerical)(v, _string.FORMATS.EXPONENTIAL))
398
+ },
399
+ valueFormatter: v => "".concat((0, _string.formatNumerical)(v, _string.FORMATS.EXPONENTIAL)),
400
+ slotProps: {
401
+ popper: {
402
+ className: 'feature-histogram-tooltip'
403
+ }
404
+ }
405
+ })
406
+ })]
407
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
408
+ className: "col-md-5 d-flex flex-column text-end",
409
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
410
+ className: "d-flex justify-content-between",
411
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
412
+ children: "Min"
413
+ }), ' ', /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
414
+ children: (0, _string.formatNumerical)(obs.min, _string.FORMATS.EXPONENTIAL)
415
+ })]
416
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
417
+ className: "d-flex justify-content-between",
418
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
419
+ children: "Max"
420
+ }), ' ', /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
421
+ children: (0, _string.formatNumerical)(obs.max, _string.FORMATS.EXPONENTIAL)
422
+ })]
423
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
424
+ className: "d-flex justify-content-between",
425
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
426
+ children: "Mean"
427
+ }), ' ', /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
428
+ children: (0, _string.formatNumerical)(obs.mean, _string.FORMATS.EXPONENTIAL)
429
+ })]
430
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
431
+ className: "d-flex justify-content-between",
432
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
433
+ children: "Median"
434
+ }), ' ', /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
435
+ children: (0, _string.formatNumerical)(obs.median, _string.FORMATS.EXPONENTIAL)
436
+ })]
437
+ })]
438
+ })]
439
+ })]
440
+ });
378
441
  }
379
442
 
380
443
  // @TODO: add bin controls
381
- // @TODO: add histogram
382
- function ContinuousObs(_ref4) {
444
+ function ContinuousObs(_ref5) {
383
445
  let {
384
446
  obs,
385
447
  toggleAll,
386
- toggleObs
387
- } = _ref4;
448
+ toggleObs,
449
+ showHistograms = true
450
+ } = _ref5;
451
+ const settings = (0, _SettingsContext.useSettings)();
388
452
  const {
389
453
  isSliced
390
454
  } = (0, _FilterContext.useFilteredData)();
391
455
  const totalCounts = _lodash.default.sum(_lodash.default.values(obs.value_counts));
392
456
  const min = _lodash.default.min(_lodash.default.values(obs.codes));
393
457
  const max = _lodash.default.max(_lodash.default.values(obs.codes));
458
+ const obsHistograms = useObsHistogram(obs, {
459
+ enabled: showHistograms
460
+ });
394
461
  const filteredObsData = useFilteredObsData(obs);
395
- const getDataAtIndex = index => {
462
+ const enabledHistograms = (0, _react.useMemo)(() => showHistograms && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR, [settings.colorEncoding, showHistograms]);
463
+ const getLabel = (0, _react.useCallback)(index => {
464
+ return isNaN(obs.values[index]) ? 'NaN' : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges);
465
+ }, [obs.bins.binEdges, obs.codes, obs.values]);
466
+ const getDataAtIndex = (0, _react.useCallback)(index => {
467
+ var _obsHistograms$fetche2;
396
468
  return {
397
469
  value: obs.values[index],
398
470
  code: obs.codes[obs.values[index]],
@@ -400,33 +472,50 @@ function ContinuousObs(_ref4) {
400
472
  value_counts: obs.value_counts[obs.values[index]],
401
473
  pct: obs.value_counts[obs.values[index]] / totalCounts * 100
402
474
  },
403
- isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
404
- label: isNaN(obs.values[index]) ? "NaN" : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges),
475
+ isOmitted: _lodash.default.includes(obs.omit, obs.values[index]),
476
+ label: getLabel(index),
477
+ histogramData: enabledHistograms ? {
478
+ data: (_obsHistograms$fetche2 = obsHistograms.fetchedData) === null || _obsHistograms$fetche2 === void 0 ? void 0 : _obsHistograms$fetche2[obs.values[index]],
479
+ isPending: obsHistograms.isPending,
480
+ altColor: isSliced
481
+ } : {
482
+ data: null,
483
+ isPending: false
484
+ },
405
485
  filteredStats: {
406
486
  value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
407
487
  pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
408
488
  },
409
489
  isSliced: isSliced
410
490
  };
411
- };
412
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
413
- variant: "flush",
414
- className: "cherita-list"
415
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
416
- className: "unstyled"
417
- }, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
418
- item: obs,
419
- onToggleAllObs: toggleAll
420
- })), /*#__PURE__*/_react.default.createElement(_VirtualizedList.VirtualizedList, {
421
- getDataAtIndex: getDataAtIndex,
422
- count: obs.values.length,
423
- ItemComponent: CategoricalItem,
424
- totalCounts: totalCounts,
425
- min: min,
426
- max: max,
427
- onChange: toggleObs,
428
- showColor: false
429
- })), /*#__PURE__*/_react.default.createElement(ObsContinuousStats, {
430
- obs: obs
431
- }));
491
+ }, [enabledHistograms, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, getLabel, isSliced, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, totalCounts]);
492
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
493
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.ListGroup, {
494
+ variant: "flush",
495
+ className: "cherita-list",
496
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
497
+ className: "unstyled",
498
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsToolbar.ObsToolbar, {
499
+ item: obs,
500
+ onToggleAllObs: toggleAll
501
+ })
502
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_VirtualizedList.VirtualizedList, {
503
+ getDataAtIndex: getDataAtIndex,
504
+ count: obs.values.length,
505
+ ItemComponent: CategoricalItem,
506
+ totalCounts: totalCounts,
507
+ min: min,
508
+ max: max,
509
+ onChange: toggleObs,
510
+ showColor: false,
511
+ estimateSize: i =>
512
+ // rough attempt to determine size based on label length
513
+ // estimate size of 68 pixels if label is long (>=20 chars if enabledHistograms, >=30 otherwise), else 42
514
+ // TODO: consider isSliced as count badge will be longer ?
515
+ getLabel(i).length >= (enabledHistograms ? 20 : 30) ? 68 : 42
516
+ })]
517
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(ObsContinuousStats, {
518
+ obs: obs
519
+ })]
520
+ });
432
521
  }