@haniffalab/cherita-react 1.4.1 → 1.4.2-dev.2025-10-29.81a6b906

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 +100 -74
  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 +258 -210
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -133
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +53 -38
  23. package/dist/cjs/components/offcanvas/index.js +61 -31
  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 +127 -99
  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 +168 -121
  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 +115 -88
  35. package/dist/cjs/components/var-list/VarList.js +85 -69
  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 -107
  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 +47 -47
  42. package/dist/cjs/context/DatasetContext.js +24 -16
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +255 -89
  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 +34 -27
  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 +64 -42
  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 +120 -93
  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 +273 -222
  82. package/dist/esm/components/obs-list/ObsList.js +176 -147
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +60 -44
  85. package/dist/esm/components/offcanvas/index.js +67 -37
  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 +148 -119
  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 +180 -132
  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 +126 -98
  97. package/dist/esm/components/var-list/VarList.js +99 -82
  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 -118
  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 +47 -47
  104. package/dist/esm/context/DatasetContext.js +31 -22
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +257 -90
  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 +35 -27
  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 +21 -9
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +43 -17
  129. package/scss/components/accordions.scss +4 -1
  130. package/scss/components/layouts.scss +15 -33
  131. package/scss/components/lists.scss +8 -4
  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,100 +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 flex-wrap"
177
- }, /*#__PURE__*/_react.default.createElement("div", {
178
- className: "flex-grow-1 me-auto mw-100"
179
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Check, {
180
- className: "obs-value-list-check",
181
- type: "switch",
182
- title: label,
183
- label: label,
184
- checked: !isOmitted,
185
- onChange: () => onChange(value)
186
- })), /*#__PURE__*/_react.default.createElement("div", {
187
- className: "d-flex align-items-center ms-auto"
188
- }, (!!histogramData.data || histogramData.isPending) && /*#__PURE__*/_react.default.createElement("div", {
189
- className: "pl-1 m-0"
190
- }, /*#__PURE__*/_react.default.createElement(_Histogram.Histogram, {
191
- data: histogramData.data,
192
- isPending: histogramData.isPending,
193
- altColor: histogramData.altColor
194
- })), /*#__PURE__*/_react.default.createElement("div", {
195
- className: "pl-1 m-0"
196
- }, /*#__PURE__*/_react.default.createElement(_material.Tooltip, {
197
- 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), "%"),
198
- placement: "left",
199
- arrow: true
200
- }, /*#__PURE__*/_react.default.createElement("div", {
201
- className: "d-flex align-items-center"
202
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Badge, {
203
- className: "value-count-badge"
204
- }, " ", isSliced && parseInt(filteredStats.value_counts) !== parseInt(stats.value_counts) && /*#__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", {
205
- className: "value-pct-gauge-container"
206
- }, isSliced ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_xCharts.Gauge, {
207
- className: "pct-gauge filtered-pct-gauge",
208
- value: filteredStats.pct,
209
- text: null,
210
- innerRadius: "50%",
211
- outerRadius: "75%",
212
- margin: {
213
- top: 0,
214
- right: 0,
215
- bottom: 0,
216
- left: 0
217
- }
218
- }), /*#__PURE__*/_react.default.createElement(_xCharts.Gauge, {
219
- className: "pct-gauge",
220
- value: stats.pct,
221
- text: null,
222
- innerRadius: "75%",
223
- margin: {
224
- top: 0,
225
- right: 0,
226
- bottom: 0,
227
- left: 0
228
- }
229
- })) : /*#__PURE__*/_react.default.createElement(_xCharts.Gauge, {
230
- value: stats.pct,
231
- text: null,
232
- innerRadius: "50%",
233
- margin: {
234
- top: 0,
235
- right: 0,
236
- bottom: 0,
237
- left: 0
238
- }
239
- }))))), showColor ? /*#__PURE__*/_react.default.createElement("div", {
240
- className: "pl-1"
241
- }, /*#__PURE__*/_react.default.createElement("svg", {
242
- xmlns: "http://www.w3.org/2000/svg",
243
- width: 24,
244
- height: 24,
245
- fill: "currentColor",
246
- viewBox: "0 0 10 10"
247
- }, /*#__PURE__*/_react.default.createElement("rect", {
248
- x: "0",
249
- y: "0",
250
- width: "10",
251
- height: "10",
252
- fill: "rgb(".concat(getColor(_objectSpread({
253
- value: (code - min) / (max - min),
254
- categorical: true,
255
- grayOut: isOmitted,
256
- grayParams: {
257
- alpha: 1
258
- },
259
- colorEncoding: "obs"
260
- }, useUnsColors ? {
261
- colorscale: colors
262
- } : {})), ")")
263
- }))) : 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
+ });
264
279
  }
265
280
  function CategoricalObs(_ref3) {
266
281
  let {
@@ -291,7 +306,7 @@ function CategoricalObs(_ref3) {
291
306
  value_counts: obs.value_counts[obs.values[index]],
292
307
  pct: obs.value_counts[obs.values[index]] / totalCounts * 100
293
308
  },
294
- isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
309
+ isOmitted: _lodash.default.includes(obs.omit, obs.values[index]),
295
310
  label: obs.values[index],
296
311
  histogramData: enabledHistograms ? {
297
312
  data: (_obsHistograms$fetche = obsHistograms.fetchedData) === null || _obsHistograms$fetche === void 0 ? void 0 : _obsHistograms$fetche[obs.values[index]],
@@ -310,35 +325,37 @@ function CategoricalObs(_ref3) {
310
325
  };
311
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]);
312
327
  showColor &= settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS;
313
- return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
328
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.ListGroup, {
314
329
  variant: "flush",
315
- className: "cherita-list"
316
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
317
- className: "unstyled"
318
- }, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
319
- item: obs,
320
- onToggleAllObs: toggleAll
321
- })), /*#__PURE__*/_react.default.createElement(_VirtualizedList.VirtualizedList, {
322
- getDataAtIndex: getDataAtIndex,
323
- count: obs.values.length,
324
- ItemComponent: CategoricalItem,
325
- totalCounts: totalCounts,
326
- min: min,
327
- max: max,
328
- onChange: toggleObs,
329
- showColor: showColor,
330
- estimateSize: i =>
331
- // rough attempt to determine size based on label length
332
- // estimate size of 68 pixels if label is long (>=25 chars if enabledHistograms, >=30 if showColor, >=35 otherwise), else 42
333
- // TODO: consider isSliced as count badge will be longer ?
334
- obs.values[i].length >= (enabledHistograms ? 25 : showColor ? 30 : 35) ? 68 : 42
335
- }));
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
+ });
336
353
  }
337
354
  function ObsContinuousStats(_ref4) {
338
355
  let {
339
356
  obs
340
357
  } = _ref4;
341
- const ENDPOINT = "obs/distribution";
358
+ const ENDPOINT = 'obs/distribution';
342
359
  const dataset = (0, _DatasetContext.useDataset)();
343
360
  const params = {
344
361
  url: dataset.url,
@@ -351,49 +368,76 @@ function ObsContinuousStats(_ref4) {
351
368
  } = (0, _requests.useFetch)(ENDPOINT, params);
352
369
 
353
370
  // @TODO: fix width issue when min/max/etc values are too large
354
- return /*#__PURE__*/_react.default.createElement("div", {
355
- className: "obs-statistics"
356
- }, /*#__PURE__*/_react.default.createElement("h5", {
357
- className: "mb-2"
358
- }, "Statistics"), /*#__PURE__*/_react.default.createElement("div", {
359
- className: "row"
360
- }, /*#__PURE__*/_react.default.createElement("div", {
361
- className: "col-md-7"
362
- }, /*#__PURE__*/_react.default.createElement("p", {
363
- className: "mb-1 small"
364
- }, "Distribution of continuous values"), isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingLinear, null), !isPending && !serverError && /*#__PURE__*/_react.default.createElement("div", {
365
- className: "obs-distribution"
366
- }, /*#__PURE__*/_react.default.createElement(_xCharts.SparkLineChart, {
367
- data: fetchedData.kde_values[1],
368
- showHighlight: true,
369
- showTooltip: true,
370
- margin: {
371
- top: 10,
372
- right: 20,
373
- bottom: 10,
374
- left: 20
375
- },
376
- xAxis: {
377
- data: fetchedData.kde_values[0],
378
- valueFormatter: v => "".concat((0, _string.formatNumerical)(v, _string.FORMATS.EXPONENTIAL))
379
- },
380
- valueFormatter: v => "".concat((0, _string.formatNumerical)(v, _string.FORMATS.EXPONENTIAL)),
381
- slotProps: {
382
- popper: {
383
- className: "feature-histogram-tooltip"
384
- }
385
- }
386
- }))), /*#__PURE__*/_react.default.createElement("div", {
387
- className: "col-md-5 d-flex flex-column text-end"
388
- }, /*#__PURE__*/_react.default.createElement("div", {
389
- className: "d-flex justify-content-between"
390
- }, /*#__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", {
391
- className: "d-flex justify-content-between"
392
- }, /*#__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", {
393
- className: "d-flex justify-content-between"
394
- }, /*#__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", {
395
- className: "d-flex justify-content-between"
396
- }, /*#__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
+ });
397
441
  }
398
442
 
399
443
  // @TODO: add bin controls
@@ -417,7 +461,7 @@ function ContinuousObs(_ref5) {
417
461
  const filteredObsData = useFilteredObsData(obs);
418
462
  const enabledHistograms = (0, _react.useMemo)(() => showHistograms && settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR, [settings.colorEncoding, showHistograms]);
419
463
  const getLabel = (0, _react.useCallback)(index => {
420
- return isNaN(obs.values[index]) ? "NaN" : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges);
464
+ return isNaN(obs.values[index]) ? 'NaN' : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges);
421
465
  }, [obs.bins.binEdges, obs.codes, obs.values]);
422
466
  const getDataAtIndex = (0, _react.useCallback)(index => {
423
467
  var _obsHistograms$fetche2;
@@ -428,7 +472,7 @@ function ContinuousObs(_ref5) {
428
472
  value_counts: obs.value_counts[obs.values[index]],
429
473
  pct: obs.value_counts[obs.values[index]] / totalCounts * 100
430
474
  },
431
- isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
475
+ isOmitted: _lodash.default.includes(obs.omit, obs.values[index]),
432
476
  label: getLabel(index),
433
477
  histogramData: enabledHistograms ? {
434
478
  data: (_obsHistograms$fetche2 = obsHistograms.fetchedData) === null || _obsHistograms$fetche2 === void 0 ? void 0 : _obsHistograms$fetche2[obs.values[index]],
@@ -445,29 +489,33 @@ function ContinuousObs(_ref5) {
445
489
  isSliced: isSliced
446
490
  };
447
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]);
448
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
449
- variant: "flush",
450
- className: "cherita-list"
451
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
452
- className: "unstyled"
453
- }, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
454
- item: obs,
455
- onToggleAllObs: toggleAll
456
- })), /*#__PURE__*/_react.default.createElement(_VirtualizedList.VirtualizedList, {
457
- getDataAtIndex: getDataAtIndex,
458
- count: obs.values.length,
459
- ItemComponent: CategoricalItem,
460
- totalCounts: totalCounts,
461
- min: min,
462
- max: max,
463
- onChange: toggleObs,
464
- showColor: false,
465
- estimateSize: i =>
466
- // rough attempt to determine size based on label length
467
- // estimate size of 68 pixels if label is long (>=20 chars if enabledHistograms, >=30 otherwise), else 42
468
- // TODO: consider isSliced as count badge will be longer ?
469
- getLabel(i).length >= (enabledHistograms ? 20 : 30) ? 68 : 42
470
- })), /*#__PURE__*/_react.default.createElement(ObsContinuousStats, {
471
- obs: obs
472
- }));
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
+ });
473
521
  }