@haniffalab/cherita-react 1.3.0-dev.2025-06-06.f1eddad0 → 1.3.1-dev.2025-10-29.6de4119f

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 (138) 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 +67 -69
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +99 -105
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +89 -44
  8. package/dist/cjs/components/heatmap/Heatmap.js +65 -65
  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 +65 -66
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +267 -205
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -129
  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 +128 -100
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +140 -113
  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 +76 -50
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +46 -37
  34. package/dist/cjs/components/var-list/VarItem.js +131 -103
  35. package/dist/cjs/components/var-list/VarList.js +85 -71
  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 +109 -97
  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 +51 -48
  42. package/dist/cjs/context/DatasetContext.js +26 -17
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +271 -88
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/zarr-helper.js +3 -3
  48. package/dist/cjs/utils/Filter.js +16 -11
  49. package/dist/cjs/utils/Histogram.js +35 -33
  50. package/dist/cjs/utils/ImageViewer.js +11 -8
  51. package/dist/cjs/utils/Legend.js +37 -30
  52. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  53. package/dist/cjs/utils/Resolver.js +213 -0
  54. package/dist/cjs/utils/Skeleton.js +10 -10
  55. package/dist/cjs/utils/StyledTooltip.js +44 -0
  56. package/dist/cjs/utils/VirtualizedList.js +36 -29
  57. package/dist/cjs/utils/errors.js +15 -15
  58. package/dist/cjs/utils/requests.js +21 -9
  59. package/dist/cjs/utils/search.js +4 -4
  60. package/dist/cjs/utils/string.js +6 -6
  61. package/dist/cjs/utils/zarrData.js +20 -21
  62. package/dist/css/cherita.css +135 -65
  63. package/dist/css/cherita.css.map +1 -1
  64. package/dist/esm/components/controls/Controls.js +43 -35
  65. package/dist/esm/components/dotplot/Dotplot.js +77 -78
  66. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  67. package/dist/esm/components/full-page/FullPage.js +119 -124
  68. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  69. package/dist/esm/components/full-page/PlotTypeSelector.js +90 -45
  70. package/dist/esm/components/heatmap/Heatmap.js +75 -74
  71. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  72. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  73. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  74. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  75. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  76. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  77. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  78. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  79. package/dist/esm/components/matrixplot/Matrixplot.js +75 -75
  80. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  81. package/dist/esm/components/obs-list/ObsItem.js +282 -217
  82. package/dist/esm/components/obs-list/ObsList.js +176 -143
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +71 -32
  85. package/dist/esm/components/offcanvas/index.js +68 -33
  86. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  87. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  88. package/dist/esm/components/scatterplot/Scatterplot.js +149 -120
  89. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  90. package/dist/esm/components/scatterplot/SpatialControls.js +153 -125
  91. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  92. package/dist/esm/components/search-bar/SearchBar.js +187 -130
  93. package/dist/esm/components/search-bar/SearchInfo.js +86 -59
  94. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  95. package/dist/esm/components/toolbar/Toolbar.js +49 -39
  96. package/dist/esm/components/var-list/VarItem.js +142 -113
  97. package/dist/esm/components/var-list/VarList.js +99 -84
  98. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  99. package/dist/esm/components/var-list/VarSet.js +134 -115
  100. package/dist/esm/components/violin/Violin.js +121 -108
  101. package/dist/esm/components/violin/ViolinControls.js +10 -6
  102. package/dist/esm/constants/colorscales.js +19 -19
  103. package/dist/esm/constants/constants.js +50 -47
  104. package/dist/esm/context/DatasetContext.js +33 -23
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +273 -89
  107. package/dist/esm/context/ZarrDataContext.js +8 -6
  108. package/dist/esm/helpers/color-helper.js +5 -5
  109. package/dist/esm/helpers/map-helper.js +2 -2
  110. package/dist/esm/helpers/zarr-helper.js +6 -6
  111. package/dist/esm/index.js +22 -22
  112. package/dist/esm/utils/Filter.js +22 -17
  113. package/dist/esm/utils/Histogram.js +39 -37
  114. package/dist/esm/utils/ImageViewer.js +12 -8
  115. package/dist/esm/utils/Legend.js +44 -36
  116. package/dist/esm/utils/LoadingIndicators.js +16 -13
  117. package/dist/esm/utils/Resolver.js +201 -0
  118. package/dist/esm/utils/Skeleton.js +11 -10
  119. package/dist/esm/utils/StyledTooltip.js +38 -0
  120. package/dist/esm/utils/VirtualizedList.js +37 -29
  121. package/dist/esm/utils/errors.js +15 -15
  122. package/dist/esm/utils/requests.js +24 -12
  123. package/dist/esm/utils/search.js +7 -7
  124. package/dist/esm/utils/string.js +7 -7
  125. package/dist/esm/utils/zarrData.js +27 -28
  126. package/package.json +20 -8
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +65 -16
  129. package/scss/components/accordions.scss +15 -2
  130. package/scss/components/layouts.scss +68 -50
  131. package/scss/components/lists.scss +16 -5
  132. package/scss/components/plotly.scss +38 -26
  133. package/scss/components/plots.scss +14 -1
  134. package/dist/assets/images/plots/dotplot.svg +0 -152
  135. package/dist/assets/images/plots/heatmap.svg +0 -193
  136. package/dist/assets/images/plots/matrixplot.svg +0 -275
  137. package/dist/assets/images/plots/scatterplot.svg +0 -198
  138. package/dist/assets/images/plots/violin.svg +0 -50
@@ -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,47 +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
53
  const useObsHistogram = (obs, _ref) => {
56
- var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedVar9, _settings$selectedVar0, _settings$selectedVar1, _settings$selectedVar10;
57
54
  let {
58
55
  enabled = true
59
56
  } = _ref;
60
- const ENDPOINT = "obs/histograms";
57
+ const ENDPOINT = 'obs/histograms';
61
58
  const dataset = (0, _DatasetContext.useDataset)();
62
59
  const settings = (0, _SettingsContext.useSettings)();
63
60
  const {
64
61
  obsIndices,
65
62
  isSliced
66
63
  } = (0, _FilterContext.useFilteredData)();
64
+ const selectedVar = (0, _Resolver.useSelectedVar)();
67
65
  const [params, setParams] = (0, _react.useState)({
68
66
  url: dataset.url,
69
- obsCol: _lodash.default.omit(obs, "omit"),
67
+ obsCol: _lodash.default.omit(obs, 'omit'),
70
68
  // avoid re-rendering when toggling unselected obs
71
- varKey: (_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet ? {
72
- name: (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name,
73
- indices: (_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars.map(v => v.index)
74
- } : (_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,
75
73
  obsIndices: isSliced ? [...(obsIndices || [])] : null
76
74
  });
77
75
  (0, _react.useEffect)(() => {
78
76
  setParams(p => {
79
- var _settings$selectedVar5, _settings$selectedVar6, _settings$selectedVar7, _settings$selectedVar8;
80
77
  return _objectSpread(_objectSpread({}, p), {}, {
81
- obsCol: _lodash.default.omit(obs, "omit"),
82
- varKey: (_settings$selectedVar5 = settings.selectedVar) !== null && _settings$selectedVar5 !== void 0 && _settings$selectedVar5.isSet ? {
83
- name: (_settings$selectedVar6 = settings.selectedVar) === null || _settings$selectedVar6 === void 0 ? void 0 : _settings$selectedVar6.name,
84
- indices: (_settings$selectedVar7 = settings.selectedVar) === null || _settings$selectedVar7 === void 0 ? void 0 : _settings$selectedVar7.vars.map(v => v.index)
85
- } : (_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,
86
83
  obsIndices: isSliced ? [...(obsIndices || [])] : null
87
84
  });
88
85
  });
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]);
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]);
90
87
  return (0, _requests.useFetch)(ENDPOINT, params, {
91
- enabled: enabled && !!settings.selectedVar && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR,
88
+ enabled: enabled && !!selectedVar && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR,
92
89
  refetchOnMount: false
93
90
  });
94
91
  };
@@ -167,99 +164,118 @@ function CategoricalItem(_ref2) {
167
164
  const {
168
165
  getColor
169
166
  } = (0, _colorHelper.useColor)();
170
- return /*#__PURE__*/_react.default.createElement("div", {
171
- className: "virtualized-list-wrapper"
172
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
173
- key: value,
174
- className: "obs-item"
175
- }, /*#__PURE__*/_react.default.createElement("div", {
176
- className: "d-flex align-items-center"
177
- }, /*#__PURE__*/_react.default.createElement("div", {
178
- className: "flex-grow-1"
179
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Check, {
180
- className: "obs-value-list-check",
181
- type: "switch",
182
- label: label,
183
- checked: !isOmitted,
184
- onChange: () => onChange(value)
185
- })), /*#__PURE__*/_react.default.createElement("div", {
186
- className: "d-flex align-items-center"
187
- }, /*#__PURE__*/_react.default.createElement("div", {
188
- className: "pl-1 m-0 flex-grow-1"
189
- }, /*#__PURE__*/_react.default.createElement(_Histogram.Histogram, {
190
- data: histogramData.data,
191
- isPending: histogramData.isPending,
192
- altColor: histogramData.altColor
193
- })), /*#__PURE__*/_react.default.createElement("div", {
194
- className: "pl-1 m-0"
195
- }, /*#__PURE__*/_react.default.createElement(_material.Tooltip, {
196
- 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), "%"),
197
- placement: "left",
198
- arrow: true
199
- }, /*#__PURE__*/_react.default.createElement("div", {
200
- className: "d-flex align-items-center"
201
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Badge, {
202
- className: "value-count-badge"
203
- }, " ", 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", {
204
- className: "value-pct-gauge-container"
205
- }, isSliced ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_xCharts.Gauge, {
206
- className: "pct-gauge filtered-pct-gauge",
207
- value: filteredStats.pct,
208
- text: null,
209
- innerRadius: "50%",
210
- outerRadius: "75%",
211
- margin: {
212
- top: 0,
213
- right: 0,
214
- bottom: 0,
215
- left: 0
216
- }
217
- }), /*#__PURE__*/_react.default.createElement(_xCharts.Gauge, {
218
- className: "pct-gauge",
219
- value: stats.pct,
220
- text: null,
221
- innerRadius: "75%",
222
- margin: {
223
- top: 0,
224
- right: 0,
225
- bottom: 0,
226
- left: 0
227
- }
228
- })) : /*#__PURE__*/_react.default.createElement(_xCharts.Gauge, {
229
- value: stats.pct,
230
- text: null,
231
- innerRadius: "50%",
232
- margin: {
233
- top: 0,
234
- right: 0,
235
- bottom: 0,
236
- left: 0
237
- }
238
- }))))), showColor ? /*#__PURE__*/_react.default.createElement("div", {
239
- className: "pl-1"
240
- }, /*#__PURE__*/_react.default.createElement("svg", {
241
- xmlns: "http://www.w3.org/2000/svg",
242
- width: 24,
243
- height: 24,
244
- fill: "currentColor",
245
- viewBox: "0 0 10 10"
246
- }, /*#__PURE__*/_react.default.createElement("rect", {
247
- x: "0",
248
- y: "0",
249
- width: "10",
250
- height: "10",
251
- fill: "rgb(".concat(getColor(_objectSpread({
252
- value: (code - min) / (max - min),
253
- categorical: true,
254
- grayOut: isOmitted,
255
- grayParams: {
256
- alpha: 1
257
- },
258
- colorEncoding: "obs"
259
- }, useUnsColors ? {
260
- colorscale: colors
261
- } : {})), ")")
262
- }))) : 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
+ });
263
279
  }
264
280
  function CategoricalObs(_ref3) {
265
281
  let {
@@ -280,6 +296,7 @@ function CategoricalObs(_ref3) {
280
296
  enabled: showHistograms
281
297
  });
282
298
  const filteredObsData = useFilteredObsData(obs);
299
+ const enabledHistograms = (0, _react.useMemo)(() => showHistograms && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR, [settings.colorEncoding, showHistograms]);
283
300
  const getDataAtIndex = (0, _react.useCallback)(index => {
284
301
  var _obsHistograms$fetche;
285
302
  return {
@@ -289,9 +306,9 @@ function CategoricalObs(_ref3) {
289
306
  value_counts: obs.value_counts[obs.values[index]],
290
307
  pct: obs.value_counts[obs.values[index]] / totalCounts * 100
291
308
  },
292
- isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
309
+ isOmitted: _lodash.default.includes(obs.omit, obs.values[index]),
293
310
  label: obs.values[index],
294
- histogramData: showHistograms && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? {
311
+ histogramData: enabledHistograms ? {
295
312
  data: (_obsHistograms$fetche = obsHistograms.fetchedData) === null || _obsHistograms$fetche === void 0 ? void 0 : _obsHistograms$fetche[obs.values[index]],
296
313
  isPending: obsHistograms.isPending,
297
314
  altColor: isSliced
@@ -306,33 +323,39 @@ function CategoricalObs(_ref3) {
306
323
  isSliced: isSliced,
307
324
  colors: obs.colors
308
325
  };
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]);
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]);
310
327
  showColor &= settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS;
311
- return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
328
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.ListGroup, {
312
329
  variant: "flush",
313
- className: "cherita-list"
314
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
315
- className: "unstyled"
316
- }, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
317
- item: obs,
318
- onToggleAllObs: toggleAll
319
- })), /*#__PURE__*/_react.default.createElement(_VirtualizedList.VirtualizedList, {
320
- getDataAtIndex: getDataAtIndex,
321
- count: obs.values.length,
322
- ItemComponent: CategoricalItem,
323
- totalCounts: totalCounts,
324
- min: min,
325
- max: max,
326
- onChange: toggleObs,
327
- showColor: showColor,
328
- estimateSize: 42
329
- }));
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
+ });
330
353
  }
331
354
  function ObsContinuousStats(_ref4) {
332
355
  let {
333
356
  obs
334
357
  } = _ref4;
335
- const ENDPOINT = "obs/distribution";
358
+ const ENDPOINT = 'obs/distribution';
336
359
  const dataset = (0, _DatasetContext.useDataset)();
337
360
  const params = {
338
361
  url: dataset.url,
@@ -345,49 +368,76 @@ function ObsContinuousStats(_ref4) {
345
368
  } = (0, _requests.useFetch)(ENDPOINT, params);
346
369
 
347
370
  // @TODO: fix width issue when min/max/etc values are too large
348
- return /*#__PURE__*/_react.default.createElement("div", {
349
- className: "obs-statistics"
350
- }, /*#__PURE__*/_react.default.createElement("h5", {
351
- className: "mb-2"
352
- }, "Statistics"), /*#__PURE__*/_react.default.createElement("div", {
353
- className: "row"
354
- }, /*#__PURE__*/_react.default.createElement("div", {
355
- className: "col-md-7"
356
- }, /*#__PURE__*/_react.default.createElement("p", {
357
- className: "mb-1 small"
358
- }, "Distribution of continuous values"), isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingLinear, null), !isPending && !serverError && /*#__PURE__*/_react.default.createElement("div", {
359
- className: "obs-distribution"
360
- }, /*#__PURE__*/_react.default.createElement(_xCharts.SparkLineChart, {
361
- data: fetchedData.kde_values[1],
362
- showHighlight: true,
363
- showTooltip: true,
364
- margin: {
365
- top: 10,
366
- right: 20,
367
- bottom: 10,
368
- left: 20
369
- },
370
- xAxis: {
371
- data: fetchedData.kde_values[0],
372
- valueFormatter: v => "".concat((0, _string.formatNumerical)(v, _string.FORMATS.EXPONENTIAL))
373
- },
374
- valueFormatter: v => "".concat((0, _string.formatNumerical)(v, _string.FORMATS.EXPONENTIAL)),
375
- slotProps: {
376
- popper: {
377
- className: "feature-histogram-tooltip"
378
- }
379
- }
380
- }))), /*#__PURE__*/_react.default.createElement("div", {
381
- className: "col-md-5 d-flex flex-column text-end"
382
- }, /*#__PURE__*/_react.default.createElement("div", {
383
- className: "d-flex justify-content-between"
384
- }, /*#__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", {
385
- className: "d-flex justify-content-between"
386
- }, /*#__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", {
387
- className: "d-flex justify-content-between"
388
- }, /*#__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", {
389
- className: "d-flex justify-content-between"
390
- }, /*#__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
+ });
391
441
  }
392
442
 
393
443
  // @TODO: add bin controls
@@ -409,6 +459,10 @@ function ContinuousObs(_ref5) {
409
459
  enabled: showHistograms
410
460
  });
411
461
  const filteredObsData = useFilteredObsData(obs);
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]);
412
466
  const getDataAtIndex = (0, _react.useCallback)(index => {
413
467
  var _obsHistograms$fetche2;
414
468
  return {
@@ -418,9 +472,9 @@ function ContinuousObs(_ref5) {
418
472
  value_counts: obs.value_counts[obs.values[index]],
419
473
  pct: obs.value_counts[obs.values[index]] / totalCounts * 100
420
474
  },
421
- isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
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 ? {
475
+ isOmitted: _lodash.default.includes(obs.omit, obs.values[index]),
476
+ label: getLabel(index),
477
+ histogramData: enabledHistograms ? {
424
478
  data: (_obsHistograms$fetche2 = obsHistograms.fetchedData) === null || _obsHistograms$fetche2 === void 0 ? void 0 : _obsHistograms$fetche2[obs.values[index]],
425
479
  isPending: obsHistograms.isPending,
426
480
  altColor: isSliced
@@ -434,26 +488,34 @@ function ContinuousObs(_ref5) {
434
488
  },
435
489
  isSliced: isSliced
436
490
  };
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]);
438
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
439
- variant: "flush",
440
- className: "cherita-list"
441
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
442
- className: "unstyled"
443
- }, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
444
- item: obs,
445
- onToggleAllObs: toggleAll
446
- })), /*#__PURE__*/_react.default.createElement(_VirtualizedList.VirtualizedList, {
447
- getDataAtIndex: getDataAtIndex,
448
- count: obs.values.length,
449
- ItemComponent: CategoricalItem,
450
- totalCounts: totalCounts,
451
- min: min,
452
- max: max,
453
- onChange: toggleObs,
454
- showColor: false,
455
- estimateSize: 42
456
- })), /*#__PURE__*/_react.default.createElement(ObsContinuousStats, {
457
- obs: obs
458
- }));
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
+ });
459
521
  }