@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.
- package/dist/cjs/components/obs-list/ObsItem.js +22 -96
- package/dist/cjs/components/obs-list/ObsList.js +19 -56
- package/dist/cjs/components/var-list/VarItem.js +14 -10
- package/dist/cjs/utils/VirtualizedList.js +1 -1
- package/dist/css/cherita.css +36 -17
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/obs-list/ObsItem.js +23 -97
- package/dist/esm/components/obs-list/ObsList.js +19 -57
- package/dist/esm/components/var-list/VarItem.js +14 -10
- package/dist/esm/utils/VirtualizedList.js +1 -1
- package/package.json +4 -3
- package/scss/cherita.scss +10 -8
- package/scss/components/accordions.scss +5 -0
- package/scss/components/lists.scss +15 -3
|
@@ -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(
|
|
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: "
|
|
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(
|
|
344
|
-
|
|
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
|
|
406
|
-
const
|
|
407
|
-
const
|
|
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,
|
|
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: "
|
|
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(
|
|
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
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
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 (
|
|
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 (
|
|
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
|
-
},
|
|
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(
|
|
326
|
-
|
|
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.
|
|
64
|
+
key: item.disease_id,
|
|
65
65
|
className: "feature-disease-info"
|
|
66
|
-
}, /*#__PURE__*/_react.default.createElement("
|
|
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(
|
|
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",
|
|
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(
|
|
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: "
|
|
96
|
+
maxHeight: "40vh",
|
|
93
97
|
ItemComponent: VarDiseaseInfoItem
|
|
94
|
-
})
|
|
98
|
+
});
|
|
95
99
|
}
|
|
96
100
|
function SingleSelectionItem(_ref3) {
|
|
97
101
|
let {
|
package/dist/css/cherita.css
CHANGED
|
@@ -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
|
-
.
|
|
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
|
|
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:
|
|
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
|
-
.
|
|
12268
|
-
|
|
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
|
}
|