@haniffalab/cherita-react 1.1.1 → 1.2.0-dev.2025-04-09.382ade7b

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.
@@ -10,6 +10,7 @@ var _material = require("@mui/material");
10
10
  var _xCharts = require("@mui/x-charts");
11
11
  var _lodash = _interopRequireDefault(require("lodash"));
12
12
  var _reactBootstrap = require("react-bootstrap");
13
+ var _ObsToolbar = require("./ObsToolbar");
13
14
  var _constants = require("../../constants/constants");
14
15
  var _DatasetContext = require("../../context/DatasetContext");
15
16
  var _FilterContext = require("../../context/FilterContext");
@@ -20,7 +21,6 @@ var _requests = require("../../utils/requests");
20
21
  var _string = require("../../utils/string");
21
22
  var _VirtualizedList = require("../../utils/VirtualizedList");
22
23
  var _zarrData = require("../../utils/zarrData");
23
- var _ObsToolbar = require("./ObsToolbar");
24
24
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
25
25
  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); }
26
26
  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; }
@@ -149,7 +149,9 @@ function CategoricalItem(_ref) {
149
149
  const {
150
150
  getColor
151
151
  } = (0, _colorHelper.useColor)();
152
- return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
152
+ return /*#__PURE__*/_react.default.createElement("div", {
153
+ className: "virtualized-list-wrapper"
154
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
153
155
  key: value,
154
156
  className: "obs-item"
155
157
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -237,47 +239,24 @@ function CategoricalItem(_ref) {
237
239
  },
238
240
  colorEncoding: "obs"
239
241
  })})`
240
- }))) : null)));
242
+ }))) : null))));
241
243
  }
242
244
  function CategoricalObs(_ref2) {
243
245
  let {
244
246
  obs,
245
- updateObs,
246
247
  toggleAll,
247
248
  toggleObs,
248
- toggleLabel,
249
- toggleSlice,
250
- toggleColor,
251
249
  showColor = true
252
250
  } = _ref2;
253
251
  const dataset = (0, _DatasetContext.useDataset)();
254
252
  const {
255
253
  isSliced
256
254
  } = (0, _FilterContext.useFilteredData)();
257
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
258
255
  const totalCounts = _lodash.default.sum(_lodash.default.values(obs.value_counts));
259
256
  const min = _lodash.default.min(_lodash.default.values(obs.codes));
260
257
  const max = _lodash.default.max(_lodash.default.values(obs.codes));
261
258
  const obsHistograms = useObsHistogram(obs);
262
259
  const filteredObsData = useFilteredObsData(obs);
263
- (0, _react.useEffect)(() => {
264
- if (dataset.selectedObs?.name === obs.name) {
265
- const selectedObsData = _lodash.default.omit(dataset.selectedObs, ["omit"]);
266
- const obsData = _lodash.default.omit(obs, ["omit"]);
267
- if (!_lodash.default.isEqual(selectedObsData, obsData)) {
268
- // outdated selectedObs
269
- dispatch({
270
- type: "select.obs",
271
- obs: obs
272
- });
273
- } else if (!_lodash.default.isEqual(dataset.selectedObs.omit, obs.omit)) {
274
- updateObs({
275
- ...obs,
276
- omit: dataset.selectedObs.omit
277
- });
278
- }
279
- }
280
- }, [dataset.selectedObs, dispatch, obs, obs.name, updateObs]);
281
260
  const getDataAtIndex = (0, _react.useCallback)(index => {
282
261
  return {
283
262
  value: obs.values[index],
@@ -308,7 +287,7 @@ function CategoricalObs(_ref2) {
308
287
  variant: "flush",
309
288
  className: "cherita-list"
310
289
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
311
- className: "cherita-list-item-unstyled"
290
+ className: "unstyled"
312
291
  }, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
313
292
  item: obs,
314
293
  onToggleAllObs: toggleAll
@@ -320,7 +299,8 @@ function CategoricalObs(_ref2) {
320
299
  min: min,
321
300
  max: max,
322
301
  onChange: toggleObs,
323
- showColor: showColor
302
+ showColor: showColor,
303
+ estimateSize: 42
324
304
  }));
325
305
  }
326
306
  function ObsContinuousStats(_ref3) {
@@ -340,11 +320,8 @@ function ObsContinuousStats(_ref3) {
340
320
  } = (0, _requests.useFetch)(ENDPOINT, params);
341
321
 
342
322
  // @TODO: fix width issue when min/max/etc values are too large
343
- return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
344
- variant: "flush",
345
- className: "cherita-list"
346
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
347
- className: "obs-item"
323
+ return /*#__PURE__*/_react.default.createElement("div", {
324
+ className: "obs-statistics"
348
325
  }, /*#__PURE__*/_react.default.createElement("h5", {
349
326
  className: "mb-2"
350
327
  }, "Statistics"), /*#__PURE__*/_react.default.createElement("div", {
@@ -385,72 +362,24 @@ function ObsContinuousStats(_ref3) {
385
362
  className: "d-flex justify-content-between"
386
363
  }, /*#__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", {
387
364
  className: "d-flex justify-content-between"
388
- }, /*#__PURE__*/_react.default.createElement("span", null, "Median"), " ", /*#__PURE__*/_react.default.createElement("span", null, (0, _string.formatNumerical)(obs.median, _string.FORMATS.EXPONENTIAL)))))));
365
+ }, /*#__PURE__*/_react.default.createElement("span", null, "Median"), " ", /*#__PURE__*/_react.default.createElement("span", null, (0, _string.formatNumerical)(obs.median, _string.FORMATS.EXPONENTIAL))))));
389
366
  }
367
+
368
+ // @TODO: add bin controls
369
+ // @TODO: add histogram
390
370
  function ContinuousObs(_ref4) {
391
371
  let {
392
372
  obs,
393
- updateObs,
394
373
  toggleAll,
395
- toggleObs,
396
- toggleLabel,
397
- toggleSlice,
398
- toggleColor
374
+ toggleObs
399
375
  } = _ref4;
400
- const ENDPOINT = "obs/bins";
401
- const dataset = (0, _DatasetContext.useDataset)();
402
376
  const {
403
377
  isSliced
404
378
  } = (0, _FilterContext.useFilteredData)();
405
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
406
- const binnedObs = binContinuous(obs, _lodash.default.min([N_BINS, obs.n_unique]));
407
- const params = {
408
- url: dataset.url,
409
- obsCol: binnedObs.name,
410
- thresholds: binnedObs.bins.thresholds,
411
- nBins: binnedObs.bins.nBins
412
- };
413
- const {
414
- fetchedData,
415
- isPending,
416
- serverError
417
- } = (0, _requests.useFetch)(ENDPOINT, params, {
418
- refetchOnMount: false
419
- });
379
+ const totalCounts = _lodash.default.sum(_lodash.default.values(obs.value_counts));
380
+ const min = _lodash.default.min(_lodash.default.values(obs.codes));
381
+ const max = _lodash.default.max(_lodash.default.values(obs.codes));
420
382
  const filteredObsData = useFilteredObsData(obs);
421
- const updatedObs = fetchedData && _lodash.default.isMatch(obs, fetchedData);
422
- (0, _react.useEffect)(() => {
423
- // Update ObsList obsCols with bin data
424
- // after update -> re-render -> obs will already be updated
425
- if (!isPending && !serverError && !_lodash.default.isMatch(obs, fetchedData)) {
426
- updateObs({
427
- ...binnedObs,
428
- ...fetchedData,
429
- codesMap: _lodash.default.invert(fetchedData.codes)
430
- });
431
- }
432
- }, [binnedObs, fetchedData, isPending, obs, serverError, updateObs]);
433
- (0, _react.useEffect)(() => {
434
- if (updatedObs && dataset.selectedObs?.name === obs.name) {
435
- const selectedObsData = _lodash.default.omit(dataset.selectedObs, ["omit"]);
436
- const obsData = _lodash.default.omit(obs, ["omit"]);
437
- if (!_lodash.default.isEqual(selectedObsData, obsData)) {
438
- // outdated selectedObs
439
- dispatch({
440
- type: "select.obs",
441
- obs: obs
442
- });
443
- } else if (!_lodash.default.isEqual(dataset.selectedObs.omit, obs.omit)) {
444
- updateObs({
445
- ...obs,
446
- omit: dataset.selectedObs.omit
447
- });
448
- }
449
- }
450
- }, [dataset.selectedObs, dispatch, obs, obs.name, updateObs, updatedObs]);
451
- const totalCounts = _lodash.default.sum(_lodash.default.values(obs?.value_counts));
452
- const min = _lodash.default.min(_lodash.default.values(obs?.codes));
453
- const max = _lodash.default.max(_lodash.default.values(obs?.codes));
454
383
  const getDataAtIndex = index => {
455
384
  return {
456
385
  value: obs.values[index],
@@ -468,17 +397,14 @@ function ContinuousObs(_ref4) {
468
397
  isSliced: isSliced
469
398
  };
470
399
  };
471
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingLinear, null), !serverError && updatedObs && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
400
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
472
401
  variant: "flush",
473
402
  className: "cherita-list"
474
403
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
475
- className: "cherita-list-item-unstyled"
404
+ className: "unstyled"
476
405
  }, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
477
406
  item: obs,
478
- onToggleAllObs: toggleAll,
479
- onToggleLabel: toggleLabel,
480
- onToggleSlice: toggleSlice,
481
- onToggleColor: toggleColor
407
+ onToggleAllObs: toggleAll
482
408
  })), /*#__PURE__*/_react.default.createElement(_VirtualizedList.VirtualizedList, {
483
409
  getDataAtIndex: getDataAtIndex,
484
410
  count: obs.values.length,
@@ -490,5 +416,5 @@ function ContinuousObs(_ref4) {
490
416
  showColor: false
491
417
  })), /*#__PURE__*/_react.default.createElement(ObsContinuousStats, {
492
418
  obs: obs
493
- })));
419
+ }));
494
420
  }
@@ -15,16 +15,14 @@ var _reactBootstrap = require("react-bootstrap");
15
15
  var _Accordion = _interopRequireDefault(require("react-bootstrap/Accordion"));
16
16
  var _AccordionButton = require("react-bootstrap/AccordionButton");
17
17
  var _AccordionContext = _interopRequireDefault(require("react-bootstrap/AccordionContext"));
18
+ var _ObsItem = require("./ObsItem");
18
19
  var _constants = require("../../constants/constants");
19
20
  var _DatasetContext = require("../../context/DatasetContext");
20
21
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
21
22
  var _requests = require("../../utils/requests");
22
- var _ObsItem = require("./ObsItem");
23
23
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
24
  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); }
25
25
  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; }
26
- // @TODO: integrate ObsAccordionToggle with ObsColsList active, expandedItems, etc. to avoid duplication
27
-
28
26
  const ObsAccordionToggle = _ref => {
29
27
  let {
30
28
  children,
@@ -34,10 +32,10 @@ const ObsAccordionToggle = _ref => {
34
32
  const {
35
33
  activeEventKey
36
34
  } = (0, _react.useContext)(_AccordionContext.default);
35
+ const isCurrentEventKey = (activeEventKey || []).includes(eventKey);
37
36
  const decoratedOnClick = (0, _AccordionButton.useAccordionButton)(eventKey, () => {
38
- handleAccordionToggle(eventKey);
37
+ handleAccordionToggle(eventKey, isCurrentEventKey);
39
38
  });
40
- const isCurrentEventKey = Array.isArray(activeEventKey) ? activeEventKey.includes(eventKey) : activeEventKey === eventKey;
41
39
  return /*#__PURE__*/_react.default.createElement("div", {
42
40
  className: `obs-accordion-header ${isCurrentEventKey ? "active" : ""}`,
43
41
  onClick: decoratedOnClick
@@ -59,8 +57,7 @@ function ObsColsList(_ref2) {
59
57
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
60
58
  const [enableGroups, setEnableGroups] = (0, _react.useState)(enableObsGroups);
61
59
  const [obsCols, setObsCols] = (0, _react.useState)(null);
62
- const [active, setActive] = (0, _react.useState)(dataset.selectedObs?.name);
63
- const [expandedItems, setExpandedItems] = (0, _react.useState)({});
60
+ const [active, setActive] = (0, _react.useState)([...[dataset.selectedObs?.name]]);
64
61
  const [params, setParams] = (0, _react.useState)({
65
62
  url: dataset.url
66
63
  });
@@ -113,26 +110,10 @@ function ObsColsList(_ref2) {
113
110
  }), "name"));
114
111
  }
115
112
  }, [fetchedData, isPending, obsGroups, serverError, enableGroups]);
116
- (0, _react.useEffect)(() => {
117
- if (obsCols && Object.keys(expandedItems).length === 0) {
118
- const initialExpanded = Object.keys(obsCols).reduce((acc, key) => {
119
- acc[key] = false;
120
- return acc;
121
- }, {});
122
- if (active && obsCols[active]) {
123
- initialExpanded[active] = true;
124
- }
125
- setExpandedItems(initialExpanded);
126
- }
127
- }, [obsCols, expandedItems, active]);
128
-
129
- // @TODO: fix re-rendering performance issue
130
113
  (0, _react.useEffect)(() => {
131
114
  if (obsCols) {
132
- if (obsCols[dataset.selectedObs?.name]) {
133
- setActive(dataset.selectedObs?.name);
134
- } else {
135
- setActive(null);
115
+ if (!obsCols[dataset.selectedObs?.name]) {
116
+ setActive([]);
136
117
  dispatch({
137
118
  type: "select.obs",
138
119
  obs: null
@@ -140,25 +121,12 @@ function ObsColsList(_ref2) {
140
121
  }
141
122
  }
142
123
  }, [dataset.selectedObs, dispatch, obsCols]);
143
- const updateObs = updatedObs => {
144
- setObsCols(o => {
145
- return {
146
- ...o,
147
- [updatedObs.name]: updatedObs
148
- };
149
- });
150
- };
151
- const handleAccordionToggle = itemName => {
152
- _lodash.default.delay(
153
- // to avoid contents of accordion disappearing while closing
154
- () => {
155
- setExpandedItems(prev => {
156
- return {
157
- ...prev,
158
- [itemName]: !prev[itemName]
159
- };
160
- });
161
- }, expandedItems[itemName] ? 250 : 0);
124
+ const handleAccordionToggle = (itemName, isCurrentEventKey) => {
125
+ if (isCurrentEventKey) {
126
+ _lodash.default.delay(() => setActive(prev => _lodash.default.without(prev, itemName)), 250);
127
+ } else {
128
+ setActive(prev => [...prev, itemName]);
129
+ }
162
130
  };
163
131
  const toggleAll = item => {
164
132
  const omit = item.omit.length ? [] : _lodash.default.map(item.values, v => item.codes[v]);
@@ -171,7 +139,7 @@ function ObsColsList(_ref2) {
171
139
  }
172
140
  };
173
141
  });
174
- if (active === item.name) {
142
+ if (dataset.selectedObs?.name === item.name) {
175
143
  dispatch({
176
144
  type: "select.obs",
177
145
  obs: {
@@ -231,7 +199,7 @@ function ObsColsList(_ref2) {
231
199
  }
232
200
  };
233
201
  });
234
- if (active === item.name) {
202
+ if (dataset.selectedObs?.name === item.name) {
235
203
  dispatch({
236
204
  type: "select.obs",
237
205
  obs: {
@@ -282,20 +250,18 @@ function ObsColsList(_ref2) {
282
250
  eventKey: item.name
283
251
  }, /*#__PURE__*/_react.default.createElement("div", {
284
252
  className: "obs-accordion-body"
285
- }, expandedItems[item.name] && (item.type === _constants.OBS_TYPES.CATEGORICAL || item.type === _constants.OBS_TYPES.BOOLEAN ? /*#__PURE__*/_react.default.createElement(_ObsItem.CategoricalObs, {
253
+ }, active.includes(item.name) && (item.type === _constants.OBS_TYPES.CATEGORICAL || item.type === _constants.OBS_TYPES.BOOLEAN ? /*#__PURE__*/_react.default.createElement(_ObsItem.CategoricalObs, {
286
254
  key: item.name,
287
255
  obs: item,
288
- updateObs: updateObs,
289
256
  toggleAll: () => toggleAll(item),
290
257
  toggleObs: value => toggleObs(item, value),
291
258
  toggleLabel: () => toggleLabel(item),
292
259
  toggleSlice: () => toggleSlice(item),
293
260
  toggleColor: () => toggleColor(item),
294
- showColor: showColor
261
+ showColor: showColor && isColorEncoding
295
262
  }) : /*#__PURE__*/_react.default.createElement(_ObsItem.ContinuousObs, {
296
263
  key: item.name,
297
264
  obs: item,
298
- updateObs: updateObs,
299
265
  toggleAll: () => toggleAll(item),
300
266
  toggleObs: value => toggleObs(item, value),
301
267
  toggleLabel: () => toggleLabel(item),
@@ -322,11 +288,8 @@ function ObsColsList(_ref2) {
322
288
  }, groupItems));
323
289
  }
324
290
  });
325
- const obsList = enableGroups ? /*#__PURE__*/_react.default.createElement(_Accordion.default, {
326
- className: "obs-group-accordion",
327
- flush: true,
328
- alwaysOpen: true
329
- }, groupList) : _lodash.default.map(_lodash.default.sortBy(obsCols, o => _lodash.default.lowerCase(o.name)), item => obsItem(item));
291
+ const obsList = enableGroups ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, groupList) : _lodash.default.map(_lodash.default.sortBy(obsCols, o => _lodash.default.lowerCase(o.name)), item => obsItem(item));
292
+ const defaultActiveGroup = enableGroups ? `group-${_lodash.default.findKey(obsGroups, g => g.includes(active?.[0]))}` : null;
330
293
  if (!serverError) {
331
294
  return /*#__PURE__*/_react.default.createElement("div", {
332
295
  className: "position-relative h-100"
@@ -334,7 +297,7 @@ function ObsColsList(_ref2) {
334
297
  variant: "danger"
335
298
  }, "No observations found.") : /*#__PURE__*/_react.default.createElement(_Accordion.default, {
336
299
  flush: true,
337
- defaultActiveKey: [active],
300
+ defaultActiveKey: [...active, ...[defaultActiveGroup]],
338
301
  alwaysOpen: true,
339
302
  className: "obs-accordion"
340
303
  }, obsList));
@@ -61,11 +61,11 @@ function VarHistogram(_ref) {
61
61
  function VarDiseaseInfoItem(item) {
62
62
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
63
63
  return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
64
- key: item.disease_name,
64
+ key: item.disease_id,
65
65
  className: "feature-disease-info"
66
- }, /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("button", {
66
+ }, /*#__PURE__*/_react.default.createElement("button", {
67
67
  type: "button",
68
- className: "btn btn-link",
68
+ className: "btn btn-link disease-link",
69
69
  onClick: () => {
70
70
  dispatch({
71
71
  type: "select.disease",
@@ -73,25 +73,29 @@ function VarDiseaseInfoItem(item) {
73
73
  name: item.disease_name
74
74
  });
75
75
  }
76
- }, item.disease_name), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Table, {
77
- striped: true
76
+ }, item.disease_name), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Table, {
77
+ striped: true,
78
+ size: "sm",
79
+ responsive: true
78
80
  }, /*#__PURE__*/_react.default.createElement("tbody", null, /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("td", null, "Confidence"), /*#__PURE__*/_react.default.createElement("td", null, item.confidence || "unknown")), /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("td", null, "Organ", item.organs.length > 1 ? "s" : ""), /*#__PURE__*/_react.default.createElement("td", null, item.organs.map(o => o.name).join(", "))), !_lodash.default.isEmpty(item.metadata) && _lodash.default.map(item.metadata, (value, key) => {
79
81
  if (value !== null && value !== undefined) {
80
- return /*#__PURE__*/_react.default.createElement("tr", null, /*#__PURE__*/_react.default.createElement("td", null, key), /*#__PURE__*/_react.default.createElement("td", null, value));
82
+ return /*#__PURE__*/_react.default.createElement("tr", {
83
+ key: key
84
+ }, /*#__PURE__*/_react.default.createElement("td", null, _lodash.default.upperFirst(key)), /*#__PURE__*/_react.default.createElement("td", null, value));
81
85
  }
82
- })))));
86
+ }))));
83
87
  }
84
88
  function VarDiseaseInfo(_ref2) {
85
89
  let {
86
90
  data
87
91
  } = _ref2;
88
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, null, /*#__PURE__*/_react.default.createElement(_VirtualizedList.VirtualizedList, {
92
+ return /*#__PURE__*/_react.default.createElement(_VirtualizedList.VirtualizedList, {
89
93
  getDataAtIndex: index => data[index],
90
94
  count: data.length,
91
95
  estimateSize: 140,
92
- maxHeight: "100%",
96
+ maxHeight: "40vh",
93
97
  ItemComponent: VarDiseaseInfoItem
94
- })));
98
+ });
95
99
  }
96
100
  function SingleSelectionItem(_ref3) {
97
101
  let {
@@ -16,7 +16,7 @@ function VirtualizedList(_ref) {
16
16
  ItemComponent,
17
17
  estimateSize = 45,
18
18
  overscan = 25,
19
- maxHeight = "80vh",
19
+ maxHeight = "65vh",
20
20
  ...props
21
21
  } = _ref;
22
22
  const [parentNode, setParentNode] = (0, _react.useState)(null);
@@ -4592,21 +4592,21 @@ textarea.form-control-lg {
4592
4592
  padding: var(--bs-accordion-body-padding-y) var(--bs-accordion-body-padding-x);
4593
4593
  }
4594
4594
 
4595
- .accordion-flush > .accordion-item {
4595
+ .accordion-flush > .accordion-item, .obs-group-accordion-body > .accordion-item {
4596
4596
  border-right: 0;
4597
4597
  border-left: 0;
4598
4598
  border-radius: 0;
4599
4599
  }
4600
- .accordion-flush > .accordion-item:first-child {
4600
+ .accordion-flush > .accordion-item:first-child, .obs-group-accordion-body > .accordion-item:first-child {
4601
4601
  border-top: 0;
4602
4602
  }
4603
- .accordion-flush > .accordion-item:last-child {
4603
+ .accordion-flush > .accordion-item:last-child, .obs-group-accordion-body > .accordion-item:last-child {
4604
4604
  border-bottom: 0;
4605
4605
  }
4606
- .accordion-flush > .accordion-item > .accordion-header .accordion-button, .accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed {
4606
+ .accordion-flush > .accordion-item > .accordion-header .accordion-button, .obs-group-accordion-body > .accordion-item > .accordion-header .accordion-button, .accordion-flush > .accordion-item > .accordion-header .accordion-button.collapsed {
4607
4607
  border-radius: 0;
4608
4608
  }
4609
- .accordion-flush > .accordion-item > .accordion-collapse {
4609
+ .accordion-flush > .accordion-item > .accordion-collapse, .obs-group-accordion-body > .accordion-item > .accordion-collapse {
4610
4610
  border-radius: 0;
4611
4611
  }
4612
4612
 
@@ -11874,13 +11874,30 @@ textarea.form-control-lg {
11874
11874
  color: #0c63e4;
11875
11875
  }
11876
11876
 
11877
- .list-group-flush.cherita-list .list-group-item.cherita-list-item-unstyled {
11877
+ .obs-group-accordion-body {
11878
+ padding: 0;
11879
+ }
11880
+
11881
+ .list-group.cherita-list .virtualized-list-wrapper {
11882
+ padding: 0 0.25rem 0.25rem 0.25rem;
11883
+ }
11884
+ .list-group.cherita-list .list-group-item.unstyled {
11878
11885
  background-color: transparent;
11886
+ padding-left: 1rem;
11879
11887
  }
11880
- .list-group-flush.cherita-list .list-group-item {
11888
+ .list-group.cherita-list .list-group-item {
11889
+ border: 0;
11890
+ padding: 0.375rem 0.75rem;
11891
+ line-height: 1.5;
11892
+ color: var(--bs-body-color);
11893
+ background-color: var(--bs-tertiary-bg);
11894
+ border-radius: var(--bs-border-radius);
11895
+ }
11896
+
11897
+ .obs-statistics {
11881
11898
  border: 0;
11899
+ margin: 0 0.25rem 0.25rem 0.25rem;
11882
11900
  padding: 0.375rem 0.75rem;
11883
- margin-bottom: 0.215rem;
11884
11901
  line-height: 1.5;
11885
11902
  color: var(--bs-body-color);
11886
11903
  background-color: var(--bs-tertiary-bg);
@@ -12257,15 +12274,22 @@ textarea.form-control-lg {
12257
12274
  }
12258
12275
 
12259
12276
  .feature-disease-info {
12260
- font-weight: lighter;
12277
+ font-weight: 300;
12278
+ padding-left: 0 !important;
12261
12279
  border-top: 1px solid var(list-group-border-color);
12262
12280
  border-right: 0;
12263
12281
  border-left: 0;
12264
12282
  border-bottom: 0;
12265
12283
  }
12266
12284
 
12267
- .feature-disease-info table {
12268
- margin: 0;
12285
+ .disease-link {
12286
+ padding: 0;
12287
+ white-space: normal;
12288
+ text-align: left;
12289
+ width: 100%;
12290
+ position: sticky;
12291
+ top: 0;
12292
+ background-color: var(--bs-body-bg) !important;
12269
12293
  }
12270
12294
 
12271
12295
  .cherita-app-plot {
@@ -12307,15 +12331,10 @@ textarea.form-control-lg {
12307
12331
  }
12308
12332
 
12309
12333
  /* Add a bottom border to the last item in the Accordion */
12310
- .accordion-flush .accordion-item:last-child {
12334
+ .accordion-flush .accordion-item:last-child, .obs-group-accordion-body .accordion-item:last-child {
12311
12335
  border-bottom: 1px solid #dee2e6; /* Adjust the color and width as needed */
12312
12336
  }
12313
12337
 
12314
- .var-disease-info-collapse {
12315
- max-height: 40vh;
12316
- overflow-y: auto;
12317
- }
12318
-
12319
12338
  .cherita-scatterplot #deckgl-wrapper {
12320
12339
  z-index: 1 !important;
12321
12340
  }