@haniffalab/cherita-react 0.2.0-dev.2024-09-26.f9979478 → 0.2.0-dev.2024-09-26.d9293c4c

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.
package/dist/App.scss CHANGED
@@ -1,6 +1,11 @@
1
+ // Theme CSS
2
+ $accordion-button-active-bg: #e7edf0;
3
+
1
4
  @import "bootstrap/scss/bootstrap";
2
5
 
3
- // Theme CSS
6
+ input[type="checkbox"], .cursor-pointer {
7
+ cursor: pointer;
8
+ }
4
9
 
5
10
  .loading-spinner {
6
11
  @extend .bg-light;
@@ -78,12 +83,6 @@
78
83
  height: 100%;
79
84
  }
80
85
 
81
- .cherita-alert {
82
- position: absolute;
83
- z-index: 10;
84
- bottom: 40px;
85
- left: 20px;
86
- }
87
86
  .cherita-spatial-controls {
88
87
  position: absolute;
89
88
  z-index: 10;
@@ -110,6 +109,15 @@
110
109
  }
111
110
  }
112
111
 
112
+ .cherita-toolbox-footer {
113
+ display: flex;
114
+ flex-direction: column;
115
+ }
116
+
117
+ .cherita-toolbox-footer .alert {
118
+ width: fit-content;
119
+ }
120
+
113
121
  .cherita-toolbox {
114
122
  order: 1;
115
123
  }
@@ -126,7 +134,7 @@
126
134
  }
127
135
 
128
136
  .cherita-accordion-active .accordion-button {
129
- background-color: $accordion-button-active-bg
137
+ background-color: rgb(204, 227, 237)
130
138
  }
131
139
 
132
140
  .obs-value-list-check {
@@ -187,4 +195,65 @@
187
195
  .cm-small {
188
196
  height: 15px;
189
197
  width: 15px;
198
+ }
199
+
200
+ .obs-distribution {
201
+ width: 100%;
202
+ height: 4rem;
203
+ }
204
+
205
+ .obs-continuous-stats {
206
+ font-weight: lighter;
207
+ margin: 0;
208
+ }
209
+
210
+ .value-count-badge {
211
+ color: black !important;
212
+ background-color: rgb(222, 222, 222) !important;
213
+ }
214
+
215
+ .value-pct-gauge-container {
216
+ width: 1.5rem;
217
+ height: 1.5rem;
218
+ padding: 0.2rem;
219
+ }
220
+
221
+ .feature-histogram-container {
222
+ height: 1.25rem;
223
+ width: 5rem;
224
+ display: flex;
225
+ align-items: center;
226
+ }
227
+
228
+ .feature-histogram {
229
+ @extend .feature-histogram-container;
230
+ background-color: rgb(222, 222, 222);
231
+ }
232
+
233
+ .feature-histogram-tooltip .MuiChartsTooltip-markCell,.MuiChartsTooltip-labelCell {
234
+ display: none;
235
+ }
236
+
237
+ .feature-histogram-tooltip .MuiChartsTooltip-valueCell {
238
+ padding: 0.5rem !important;
239
+ }
240
+
241
+ .feature-histogram-tooltip .MuiChartsTooltip-valueCell > p {
242
+ font-size: 0.85rem !important;
243
+ }
244
+
245
+ .feature-histogram-tooltip td > p {
246
+ font-size: 0.85rem !important;
247
+ }
248
+
249
+ .feature-disease-info {
250
+ font-weight: lighter;
251
+ border-top: 1px solid var(list-group-border-color);
252
+ border-right: 0;
253
+ border-left: 0;
254
+ border-bottom: 0;
255
+ }
256
+
257
+ .feature-disease-info table {
258
+ margin: 0;
190
259
  }
@@ -20,7 +20,8 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
20
20
  function OffcanvasObs(_ref) {
21
21
  let {
22
22
  show,
23
- handleClose
23
+ handleClose,
24
+ ...props
24
25
  } = _ref;
25
26
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Offcanvas.default, {
26
27
  show: show,
@@ -33,7 +34,10 @@ function OffcanvasObs(_ref) {
33
34
  children: "Categories"
34
35
  })
35
36
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Body, {
36
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsList.ObsColsList, {})
37
+ className: "p-0",
38
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsList.ObsColsList, {
39
+ ...props
40
+ })
37
41
  })]
38
42
  });
39
43
  }
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Dotplot = Dotplot;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
+ var _lodash = _interopRequireDefault(require("lodash"));
8
9
  var _reactBootstrap = require("react-bootstrap");
9
10
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
10
11
  var _DatasetContext = require("../../context/DatasetContext");
@@ -15,6 +16,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
15
16
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
16
17
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
17
18
  function Dotplot() {
19
+ var _dataset$selectedObs, _dataset$selectedObs2, _dataset$selectedObs3;
18
20
  const ENDPOINT = "dotplot";
19
21
  const dataset = (0, _DatasetContext.useDataset)();
20
22
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
@@ -25,6 +27,10 @@ function Dotplot() {
25
27
  const [params, setParams] = (0, _react.useState)({
26
28
  url: dataset.url,
27
29
  selectedObs: dataset.selectedObs,
30
+ obsValues: !((_dataset$selectedObs = dataset.selectedObs) !== null && _dataset$selectedObs !== void 0 && _dataset$selectedObs.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_dataset$selectedObs2 = dataset.selectedObs) === null || _dataset$selectedObs2 === void 0 ? void 0 : _dataset$selectedObs2.codes), (_dataset$selectedObs3 = dataset.selectedObs) === null || _dataset$selectedObs3 === void 0 ? void 0 : _dataset$selectedObs3.omit).map(c => {
31
+ var _dataset$selectedObs4;
32
+ return (_dataset$selectedObs4 = dataset.selectedObs) === null || _dataset$selectedObs4 === void 0 ? void 0 : _dataset$selectedObs4.codesMap[c];
33
+ }),
28
34
  selectedMultiVar: dataset.selectedMultiVar.map(i => i.index),
29
35
  standardScale: dataset.controls.standardScale,
30
36
  meanOnlyExpressed: dataset.controls.meanOnlyExpressed,
@@ -40,10 +46,15 @@ function Dotplot() {
40
46
  setHasSelections(false);
41
47
  }
42
48
  setParams(p => {
49
+ var _dataset$selectedObs5, _dataset$selectedObs6, _dataset$selectedObs7;
43
50
  return {
44
51
  ...p,
45
52
  url: dataset.url,
46
53
  selectedObs: dataset.selectedObs,
54
+ obsValues: !((_dataset$selectedObs5 = dataset.selectedObs) !== null && _dataset$selectedObs5 !== void 0 && _dataset$selectedObs5.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_dataset$selectedObs6 = dataset.selectedObs) === null || _dataset$selectedObs6 === void 0 ? void 0 : _dataset$selectedObs6.codes), (_dataset$selectedObs7 = dataset.selectedObs) === null || _dataset$selectedObs7 === void 0 ? void 0 : _dataset$selectedObs7.omit).map(c => {
55
+ var _dataset$selectedObs8;
56
+ return (_dataset$selectedObs8 = dataset.selectedObs) === null || _dataset$selectedObs8 === void 0 ? void 0 : _dataset$selectedObs8.codesMap[c];
57
+ }),
47
58
  selectedMultiVar: dataset.selectedMultiVar.map(i => i.index),
48
59
  standardScale: dataset.controls.standardScale,
49
60
  meanOnlyExpressed: dataset.controls.meanOnlyExpressed,
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Heatmap = Heatmap;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
+ var _lodash = _interopRequireDefault(require("lodash"));
8
9
  var _reactBootstrap = require("react-bootstrap");
9
10
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
10
11
  var _DatasetContext = require("../../context/DatasetContext");
@@ -15,6 +16,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
15
16
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
16
17
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
17
18
  function Heatmap() {
19
+ var _dataset$selectedObs, _dataset$selectedObs2, _dataset$selectedObs3;
18
20
  const ENDPOINT = "heatmap";
19
21
  const dataset = (0, _DatasetContext.useDataset)();
20
22
  const colorscale = (0, _react.useRef)(dataset.controls.colorScale);
@@ -24,6 +26,10 @@ function Heatmap() {
24
26
  const [params, setParams] = (0, _react.useState)({
25
27
  url: dataset.url,
26
28
  selectedObs: dataset.selectedObs,
29
+ obsValues: !((_dataset$selectedObs = dataset.selectedObs) !== null && _dataset$selectedObs !== void 0 && _dataset$selectedObs.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_dataset$selectedObs2 = dataset.selectedObs) === null || _dataset$selectedObs2 === void 0 ? void 0 : _dataset$selectedObs2.codes), (_dataset$selectedObs3 = dataset.selectedObs) === null || _dataset$selectedObs3 === void 0 ? void 0 : _dataset$selectedObs3.omit).map(c => {
30
+ var _dataset$selectedObs4;
31
+ return (_dataset$selectedObs4 = dataset.selectedObs) === null || _dataset$selectedObs4 === void 0 ? void 0 : _dataset$selectedObs4.codesMap[c];
32
+ }),
27
33
  selectedMultiVar: dataset.selectedMultiVar.map(i => i.index),
28
34
  varNamesCol: dataset.varNamesCol
29
35
  });
@@ -34,10 +40,15 @@ function Heatmap() {
34
40
  setHasSelections(false);
35
41
  }
36
42
  setParams(p => {
43
+ var _dataset$selectedObs5, _dataset$selectedObs6, _dataset$selectedObs7;
37
44
  return {
38
45
  ...p,
39
46
  url: dataset.url,
40
47
  selectedObs: dataset.selectedObs,
48
+ obsValues: !((_dataset$selectedObs5 = dataset.selectedObs) !== null && _dataset$selectedObs5 !== void 0 && _dataset$selectedObs5.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_dataset$selectedObs6 = dataset.selectedObs) === null || _dataset$selectedObs6 === void 0 ? void 0 : _dataset$selectedObs6.codes), (_dataset$selectedObs7 = dataset.selectedObs) === null || _dataset$selectedObs7 === void 0 ? void 0 : _dataset$selectedObs7.omit).map(c => {
49
+ var _dataset$selectedObs8;
50
+ return (_dataset$selectedObs8 = dataset.selectedObs) === null || _dataset$selectedObs8 === void 0 ? void 0 : _dataset$selectedObs8.codesMap[c];
51
+ }),
41
52
  selectedMultiVar: dataset.selectedMultiVar.map(i => i.index),
42
53
  varNamesCol: dataset.varNamesCol
43
54
  };
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Matrixplot = Matrixplot;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
+ var _lodash = _interopRequireDefault(require("lodash"));
8
9
  var _reactBootstrap = require("react-bootstrap");
9
10
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
10
11
  var _DatasetContext = require("../../context/DatasetContext");
@@ -15,6 +16,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
15
16
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
16
17
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
17
18
  function Matrixplot() {
19
+ var _dataset$selectedObs, _dataset$selectedObs2, _dataset$selectedObs3;
18
20
  const ENDPOINT = "matrixplot";
19
21
  const dataset = (0, _DatasetContext.useDataset)();
20
22
  const colorscale = (0, _react.useRef)(dataset.controls.colorScale);
@@ -24,6 +26,10 @@ function Matrixplot() {
24
26
  const [params, setParams] = (0, _react.useState)({
25
27
  url: dataset.url,
26
28
  selectedObs: dataset.selectedObs,
29
+ obsValues: !((_dataset$selectedObs = dataset.selectedObs) !== null && _dataset$selectedObs !== void 0 && _dataset$selectedObs.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_dataset$selectedObs2 = dataset.selectedObs) === null || _dataset$selectedObs2 === void 0 ? void 0 : _dataset$selectedObs2.codes), (_dataset$selectedObs3 = dataset.selectedObs) === null || _dataset$selectedObs3 === void 0 ? void 0 : _dataset$selectedObs3.omit).map(c => {
30
+ var _dataset$selectedObs4;
31
+ return (_dataset$selectedObs4 = dataset.selectedObs) === null || _dataset$selectedObs4 === void 0 ? void 0 : _dataset$selectedObs4.codesMap[c];
32
+ }),
27
33
  selectedMultiVar: dataset.selectedMultiVar.map(i => i.index),
28
34
  standardScale: dataset.controls.standardScale,
29
35
  varNamesCol: dataset.varNamesCol
@@ -35,10 +41,15 @@ function Matrixplot() {
35
41
  setHasSelections(false);
36
42
  }
37
43
  setParams(p => {
44
+ var _dataset$selectedObs5, _dataset$selectedObs6, _dataset$selectedObs7;
38
45
  return {
39
46
  ...p,
40
47
  url: dataset.url,
41
48
  selectedObs: dataset.selectedObs,
49
+ obsValues: !((_dataset$selectedObs5 = dataset.selectedObs) !== null && _dataset$selectedObs5 !== void 0 && _dataset$selectedObs5.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_dataset$selectedObs6 = dataset.selectedObs) === null || _dataset$selectedObs6 === void 0 ? void 0 : _dataset$selectedObs6.codes), (_dataset$selectedObs7 = dataset.selectedObs) === null || _dataset$selectedObs7 === void 0 ? void 0 : _dataset$selectedObs7.omit).map(c => {
50
+ var _dataset$selectedObs8;
51
+ return (_dataset$selectedObs8 = dataset.selectedObs) === null || _dataset$selectedObs8 === void 0 ? void 0 : _dataset$selectedObs8.codesMap[c];
52
+ }),
42
53
  selectedMultiVar: dataset.selectedMultiVar.map(i => i.index),
43
54
  standardScale: dataset.controls.standardScale,
44
55
  varNamesCol: dataset.varNamesCol
@@ -0,0 +1,394 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CategoricalObs = CategoricalObs;
7
+ exports.ContinuousObs = ContinuousObs;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _material = require("@mui/material");
10
+ var _xCharts = require("@mui/x-charts");
11
+ var _lodash = _interopRequireDefault(require("lodash"));
12
+ var _reactBootstrap = require("react-bootstrap");
13
+ var _ObsToolbar = require("./ObsToolbar");
14
+ var _DatasetContext = require("../../context/DatasetContext");
15
+ var _colorHelper = require("../../helpers/color-helper");
16
+ var _LoadingIndicators = require("../../utils/LoadingIndicators");
17
+ var _requests = require("../../utils/requests");
18
+ var _string = require("../../utils/string");
19
+ var _VirtualizedList = require("../../utils/VirtualizedList");
20
+ var _jsxRuntime = require("react/jsx-runtime");
21
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
23
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
24
+ const N_BINS = 5;
25
+ function binContinuous(data) {
26
+ let nBins = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : N_BINS;
27
+ const binSize = (data.max - data.min) * (1 / nBins);
28
+ const thresholds = _lodash.default.range(nBins + 1).map(b => {
29
+ return data.min + binSize * b;
30
+ });
31
+ const binEdges = _lodash.default.range(thresholds.length - 1).map(i => [thresholds[i], thresholds[i + 1]]);
32
+ const bins = {
33
+ nBins: nBins,
34
+ binSize: binSize,
35
+ thresholds: thresholds,
36
+ binEdges: binEdges
37
+ };
38
+ return {
39
+ ...data,
40
+ bins: bins
41
+ };
42
+ }
43
+ function binDiscrete(data) {
44
+ let nBins = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : N_BINS;
45
+ const binSize = _lodash.default.round(data.n_values * (1 / nBins));
46
+ const bins = {
47
+ nBins: nBins,
48
+ binSize: binSize
49
+ };
50
+ return {
51
+ ...data,
52
+ bins: bins
53
+ };
54
+ }
55
+ function getContinuousLabel(code, binEdges) {
56
+ return "[ ".concat((0, _string.prettyNumerical)(binEdges[code][0]), ", ").concat((0, _string.prettyNumerical)(binEdges[code][1])).concat(code === binEdges.length - 1 ? " ]" : " )");
57
+ }
58
+ function CategoricalItem(_ref) {
59
+ let {
60
+ value,
61
+ label,
62
+ code,
63
+ value_counts,
64
+ pct,
65
+ isOmitted,
66
+ min,
67
+ max,
68
+ onChange,
69
+ showColor = true
70
+ } = _ref;
71
+ const {
72
+ getColor
73
+ } = (0, _colorHelper.useColor)();
74
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
75
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
76
+ className: "d-flex align-items-center",
77
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
78
+ className: "flex-grow-1",
79
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Check, {
80
+ className: "obs-value-list-check",
81
+ type: "switch",
82
+ label: label,
83
+ checked: !isOmitted,
84
+ onChange: () => onChange(value)
85
+ })
86
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
87
+ className: "d-flex align-items-center",
88
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
89
+ className: "pl-1 m-0",
90
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
91
+ title: "".concat((0, _string.prettyNumerical)(pct), "%"),
92
+ placement: "left",
93
+ arrow: true,
94
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
95
+ className: "d-flex align-items-center",
96
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Badge, {
97
+ className: "value-count-badge",
98
+ style: {
99
+ fontWeight: "lighter"
100
+ },
101
+ children: (0, _string.prettyNumerical)(parseInt(value_counts))
102
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
103
+ className: "value-pct-gauge-container",
104
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_xCharts.Gauge, {
105
+ value: pct,
106
+ text: null,
107
+ innerRadius: "50%",
108
+ margin: {
109
+ top: 0,
110
+ right: 0,
111
+ bottom: 0,
112
+ left: 0
113
+ }
114
+ })
115
+ })]
116
+ })
117
+ })
118
+ }), showColor && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
119
+ className: "pl-1",
120
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
121
+ xmlns: "http://www.w3.org/2000/svg",
122
+ width: 24,
123
+ height: 24,
124
+ fill: "currentColor",
125
+ viewBox: "0 0 10 10",
126
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("rect", {
127
+ x: "0",
128
+ y: "0",
129
+ width: "10",
130
+ height: "10",
131
+ fill: "rgb(".concat(getColor((code - min) / (max - min), true, isOmitted, {
132
+ alpha: 1
133
+ }, "obs"), ")")
134
+ })
135
+ })
136
+ })]
137
+ })]
138
+ })
139
+ }, value);
140
+ }
141
+ function CategoricalObs(_ref2) {
142
+ let {
143
+ obs,
144
+ updateObs,
145
+ toggleAll,
146
+ toggleObs,
147
+ toggleLabel,
148
+ toggleSlice,
149
+ toggleColor,
150
+ showColor = true
151
+ } = _ref2;
152
+ const dataset = (0, _DatasetContext.useDataset)();
153
+ const dispatch = (0, _DatasetContext.useDatasetDispatch)();
154
+ const totalCounts = _lodash.default.sum(_lodash.default.values(obs.value_counts));
155
+ const min = _lodash.default.min(_lodash.default.values(obs.codes));
156
+ const max = _lodash.default.max(_lodash.default.values(obs.codes));
157
+ (0, _react.useEffect)(() => {
158
+ var _dataset$selectedObs;
159
+ if (((_dataset$selectedObs = dataset.selectedObs) === null || _dataset$selectedObs === void 0 ? void 0 : _dataset$selectedObs.name) === obs.name) {
160
+ const selectedObsData = _lodash.default.omit(dataset.selectedObs, ["omit"]);
161
+ const obsData = _lodash.default.omit(obs, ["omit"]);
162
+ if (!_lodash.default.isEqual(selectedObsData, obsData)) {
163
+ // outdated selectedObs
164
+ dispatch({
165
+ type: "select.obs",
166
+ obs: obs
167
+ });
168
+ } else if (!_lodash.default.isEqual(dataset.selectedObs.omit, obs.omit)) {
169
+ updateObs({
170
+ ...obs,
171
+ omit: dataset.selectedObs.omit
172
+ });
173
+ }
174
+ }
175
+ }, [dataset.selectedObs, dispatch, obs, obs.name, updateObs]);
176
+ const getDataAtIndex = index => {
177
+ return {
178
+ value: obs.values[index],
179
+ code: obs.codes[obs.values[index]],
180
+ value_counts: obs.value_counts[obs.values[index]],
181
+ pct: obs.value_counts[obs.values[index]] / totalCounts * 100,
182
+ isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
183
+ label: (0, _string.prettyNumerical)(obs.values[index])
184
+ };
185
+ };
186
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.ListGroup, {
187
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
188
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsToolbar.ObsToolbar, {
189
+ item: obs,
190
+ onToggleAllObs: toggleAll,
191
+ onToggleLabel: toggleLabel,
192
+ onToggleSlice: toggleSlice,
193
+ onToggleColor: toggleColor
194
+ })
195
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_VirtualizedList.VirtualizedList, {
196
+ getDataAtIndex: getDataAtIndex,
197
+ count: obs.values.length,
198
+ ItemComponent: CategoricalItem,
199
+ totalCounts: totalCounts,
200
+ min: min,
201
+ max: max,
202
+ onChange: toggleObs,
203
+ showColor: showColor
204
+ })]
205
+ });
206
+ }
207
+ function ObsContinuousStats(_ref3) {
208
+ let {
209
+ obs
210
+ } = _ref3;
211
+ const ENDPOINT = "obs/distribution";
212
+ const dataset = (0, _DatasetContext.useDataset)();
213
+ const params = {
214
+ url: dataset.url,
215
+ obs_colname: obs.name
216
+ };
217
+ const {
218
+ fetchedData,
219
+ isPending,
220
+ serverError
221
+ } = (0, _requests.useFetch)(ENDPOINT, params);
222
+
223
+ // @TODO: fix width issue when min/max/etc values are too large
224
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
225
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
226
+ className: "d-flex justify-content-between mt-3 align-items-center",
227
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Table, {
228
+ size: "sm",
229
+ className: "obs-continuous-stats",
230
+ striped: true,
231
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("tbody", {
232
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("tr", {
233
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
234
+ children: "Min"
235
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
236
+ className: "text-end",
237
+ children: (0, _string.prettyNumerical)(obs.min)
238
+ })]
239
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("tr", {
240
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
241
+ children: "Max"
242
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
243
+ className: "text-end",
244
+ children: (0, _string.prettyNumerical)(obs.max)
245
+ })]
246
+ })]
247
+ })
248
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Table, {
249
+ size: "sm",
250
+ className: "obs-continuous-stats",
251
+ striped: true,
252
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("tbody", {
253
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("tr", {
254
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
255
+ children: "Mean"
256
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
257
+ className: "text-end",
258
+ children: (0, _string.prettyNumerical)(obs.mean)
259
+ })]
260
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("tr", {
261
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
262
+ children: "Median"
263
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("td", {
264
+ className: "text-end",
265
+ children: (0, _string.prettyNumerical)(obs.median)
266
+ })]
267
+ })]
268
+ })
269
+ }), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingLinear, {}), !isPending && !serverError && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
270
+ className: "obs-distribution",
271
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_xCharts.SparkLineChart, {
272
+ data: fetchedData.kde_values[1],
273
+ showHighlight: true,
274
+ showTooltip: true // throws Maximum update depth exceeded error. Documented here: https://github.com/mui/mui-x/issues/13450
275
+ ,
276
+ margin: {
277
+ top: 10,
278
+ right: 20,
279
+ bottom: 10,
280
+ left: 20
281
+ },
282
+ xAxis: {
283
+ data: fetchedData.kde_values[0],
284
+ valueFormatter: v => "".concat((0, _string.prettyNumerical)(v))
285
+ },
286
+ valueFormatter: v => "".concat((0, _string.prettyNumerical)(v)),
287
+ slotProps: {
288
+ popper: {
289
+ className: "feature-histogram-tooltip"
290
+ }
291
+ }
292
+ })
293
+ })]
294
+ })
295
+ });
296
+ }
297
+ function ContinuousObs(_ref4) {
298
+ let {
299
+ obs,
300
+ updateObs,
301
+ toggleAll,
302
+ toggleObs,
303
+ toggleLabel,
304
+ toggleSlice,
305
+ toggleColor
306
+ } = _ref4;
307
+ const ENDPOINT = "obs/bins";
308
+ const dataset = (0, _DatasetContext.useDataset)();
309
+ const dispatch = (0, _DatasetContext.useDatasetDispatch)();
310
+ const binnedObs = binContinuous(obs);
311
+ const params = {
312
+ url: dataset.url,
313
+ obs_col: binnedObs.name,
314
+ thresholds: binnedObs.bins.thresholds,
315
+ nBins: binnedObs.bins.nBins
316
+ };
317
+ const {
318
+ fetchedData,
319
+ isPending,
320
+ serverError
321
+ } = (0, _requests.useFetch)(ENDPOINT, params, {
322
+ refetchOnMount: false
323
+ });
324
+ const updatedObs = fetchedData && _lodash.default.isMatch(obs, fetchedData);
325
+ (0, _react.useEffect)(() => {
326
+ // Update ObsList obsCols with bin data
327
+ // after update -> re-render -> obs will already be updated
328
+ if (!isPending && !serverError && !_lodash.default.isMatch(obs, fetchedData)) {
329
+ updateObs({
330
+ ...binnedObs,
331
+ ...fetchedData,
332
+ codesMap: _lodash.default.invert(fetchedData.codes)
333
+ });
334
+ }
335
+ }, [binnedObs, fetchedData, isPending, obs, serverError, updateObs]);
336
+ (0, _react.useEffect)(() => {
337
+ var _dataset$selectedObs2;
338
+ if (updatedObs && ((_dataset$selectedObs2 = dataset.selectedObs) === null || _dataset$selectedObs2 === void 0 ? void 0 : _dataset$selectedObs2.name) === obs.name) {
339
+ const selectedObsData = _lodash.default.omit(dataset.selectedObs, ["omit"]);
340
+ const obsData = _lodash.default.omit(obs, ["omit"]);
341
+ if (!_lodash.default.isEqual(selectedObsData, obsData)) {
342
+ // outdated selectedObs
343
+ dispatch({
344
+ type: "select.obs",
345
+ obs: obs
346
+ });
347
+ } else if (!_lodash.default.isEqual(dataset.selectedObs.omit, obs.omit)) {
348
+ updateObs({
349
+ ...obs,
350
+ omit: dataset.selectedObs.omit
351
+ });
352
+ }
353
+ }
354
+ }, [dataset.selectedObs, dispatch, obs, obs.name, updateObs, updatedObs]);
355
+ const totalCounts = _lodash.default.sum(_lodash.default.values(obs === null || obs === void 0 ? void 0 : obs.value_counts));
356
+ const min = _lodash.default.min(_lodash.default.values(obs === null || obs === void 0 ? void 0 : obs.codes));
357
+ const max = _lodash.default.max(_lodash.default.values(obs === null || obs === void 0 ? void 0 : obs.codes));
358
+ const getDataAtIndex = index => {
359
+ return {
360
+ value: obs.values[index],
361
+ code: obs.codes[obs.values[index]],
362
+ value_counts: obs.value_counts[obs.values[index]],
363
+ pct: obs.value_counts[obs.values[index]] / totalCounts * 100,
364
+ isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
365
+ label: getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges)
366
+ };
367
+ };
368
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
369
+ children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingLinear, {}), !serverError && updatedObs && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
370
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.ListGroup, {
371
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
372
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsToolbar.ObsToolbar, {
373
+ item: obs,
374
+ onToggleAllObs: toggleAll,
375
+ onToggleLabel: toggleLabel,
376
+ onToggleSlice: toggleSlice,
377
+ onToggleColor: toggleColor
378
+ })
379
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_VirtualizedList.VirtualizedList, {
380
+ getDataAtIndex: getDataAtIndex,
381
+ count: obs.values.length,
382
+ ItemComponent: CategoricalItem,
383
+ totalCounts: totalCounts,
384
+ min: min,
385
+ max: max,
386
+ onChange: toggleObs,
387
+ showColor: false
388
+ })]
389
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(ObsContinuousStats, {
390
+ obs: obs
391
+ })]
392
+ })]
393
+ });
394
+ }