@haniffalab/cherita-react 1.4.1 → 1.4.2-dev.2025-10-29.e8bbb191
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/README.md +1 -1
- package/dist/cjs/components/controls/Controls.js +38 -30
- package/dist/cjs/components/dotplot/Dotplot.js +67 -69
- package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
- package/dist/cjs/components/full-page/FullPage.js +100 -74
- package/dist/cjs/components/full-page/PlotAlert.js +45 -0
- package/dist/cjs/components/full-page/PlotTypeSelector.js +89 -44
- package/dist/cjs/components/heatmap/Heatmap.js +65 -65
- package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
- package/dist/cjs/components/icons/DotPlotIcon.js +64 -0
- package/dist/cjs/components/icons/HeatmapIcon.js +45 -0
- package/dist/cjs/components/icons/MatrixPlotIcon.1.js +57 -0
- package/dist/cjs/components/icons/MatrixPlotIcon.js +59 -0
- package/dist/cjs/components/icons/ScatterplotIcon.1.js +164 -0
- package/dist/cjs/components/icons/ScatterplotIcon.js +144 -0
- package/dist/cjs/components/icons/ViolinPlotIcon.js +42 -0
- package/dist/cjs/components/matrixplot/Matrixplot.js +65 -66
- package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
- package/dist/cjs/components/obs-list/ObsItem.js +258 -210
- package/dist/cjs/components/obs-list/ObsList.js +161 -133
- package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
- package/dist/cjs/components/obsm-list/ObsmList.js +53 -38
- package/dist/cjs/components/offcanvas/index.js +61 -31
- package/dist/cjs/components/pseudospatial/Pseudospatial.js +132 -76
- package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +122 -74
- package/dist/cjs/components/scatterplot/Scatterplot.js +127 -99
- package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
- package/dist/cjs/components/scatterplot/SpatialControls.js +140 -113
- package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
- package/dist/cjs/components/search-bar/SearchBar.js +168 -121
- package/dist/cjs/components/search-bar/SearchInfo.js +76 -50
- package/dist/cjs/components/search-bar/SearchResults.js +93 -71
- package/dist/cjs/components/toolbar/Toolbar.js +46 -37
- package/dist/cjs/components/var-list/VarItem.js +115 -88
- package/dist/cjs/components/var-list/VarList.js +85 -69
- package/dist/cjs/components/var-list/VarListToolbar.js +59 -54
- package/dist/cjs/components/var-list/VarSet.js +126 -108
- package/dist/cjs/components/violin/Violin.js +109 -107
- package/dist/cjs/components/violin/ViolinControls.js +8 -5
- package/dist/cjs/constants/colorscales.js +19 -19
- package/dist/cjs/constants/constants.js +47 -47
- package/dist/cjs/context/DatasetContext.js +24 -16
- package/dist/cjs/context/FilterContext.js +11 -9
- package/dist/cjs/context/SettingsContext.js +255 -89
- package/dist/cjs/context/ZarrDataContext.js +6 -5
- package/dist/cjs/helpers/color-helper.js +2 -2
- package/dist/cjs/helpers/zarr-helper.js +3 -3
- package/dist/cjs/utils/Filter.js +16 -11
- package/dist/cjs/utils/Histogram.js +35 -33
- package/dist/cjs/utils/ImageViewer.js +11 -8
- package/dist/cjs/utils/Legend.js +37 -30
- package/dist/cjs/utils/LoadingIndicators.js +15 -13
- package/dist/cjs/utils/Resolver.js +213 -0
- package/dist/cjs/utils/Skeleton.js +10 -10
- package/dist/cjs/utils/StyledTooltip.js +44 -0
- package/dist/cjs/utils/VirtualizedList.js +34 -27
- package/dist/cjs/utils/errors.js +15 -15
- package/dist/cjs/utils/requests.js +21 -9
- package/dist/cjs/utils/search.js +4 -4
- package/dist/cjs/utils/string.js +6 -6
- package/dist/cjs/utils/zarrData.js +20 -21
- package/dist/css/cherita.css +64 -42
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/controls/Controls.js +43 -35
- package/dist/esm/components/dotplot/Dotplot.js +77 -78
- package/dist/esm/components/dotplot/DotplotControls.js +106 -85
- package/dist/esm/components/full-page/FullPage.js +120 -93
- package/dist/esm/components/full-page/PlotAlert.js +39 -0
- package/dist/esm/components/full-page/PlotTypeSelector.js +90 -45
- package/dist/esm/components/heatmap/Heatmap.js +75 -74
- package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
- package/dist/esm/components/icons/DotPlotIcon.js +58 -0
- package/dist/esm/components/icons/HeatmapIcon.js +39 -0
- package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
- package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
- package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
- package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
- package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
- package/dist/esm/components/matrixplot/Matrixplot.js +75 -75
- package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
- package/dist/esm/components/obs-list/ObsItem.js +273 -222
- package/dist/esm/components/obs-list/ObsList.js +176 -147
- package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
- package/dist/esm/components/obsm-list/ObsmList.js +60 -44
- package/dist/esm/components/offcanvas/index.js +67 -37
- package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
- package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
- package/dist/esm/components/scatterplot/Scatterplot.js +148 -119
- package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
- package/dist/esm/components/scatterplot/SpatialControls.js +153 -125
- package/dist/esm/components/scatterplot/Toolbox.js +44 -32
- package/dist/esm/components/search-bar/SearchBar.js +180 -132
- package/dist/esm/components/search-bar/SearchInfo.js +86 -59
- package/dist/esm/components/search-bar/SearchResults.js +100 -77
- package/dist/esm/components/toolbar/Toolbar.js +49 -39
- package/dist/esm/components/var-list/VarItem.js +126 -98
- package/dist/esm/components/var-list/VarList.js +99 -82
- package/dist/esm/components/var-list/VarListToolbar.js +64 -58
- package/dist/esm/components/var-list/VarSet.js +134 -115
- package/dist/esm/components/violin/Violin.js +121 -118
- package/dist/esm/components/violin/ViolinControls.js +10 -6
- package/dist/esm/constants/colorscales.js +19 -19
- package/dist/esm/constants/constants.js +47 -47
- package/dist/esm/context/DatasetContext.js +31 -22
- package/dist/esm/context/FilterContext.js +11 -8
- package/dist/esm/context/SettingsContext.js +257 -90
- package/dist/esm/context/ZarrDataContext.js +8 -6
- package/dist/esm/helpers/color-helper.js +5 -5
- package/dist/esm/helpers/map-helper.js +2 -2
- package/dist/esm/helpers/zarr-helper.js +6 -6
- package/dist/esm/index.js +22 -22
- package/dist/esm/utils/Filter.js +22 -17
- package/dist/esm/utils/Histogram.js +39 -37
- package/dist/esm/utils/ImageViewer.js +12 -8
- package/dist/esm/utils/Legend.js +44 -36
- package/dist/esm/utils/LoadingIndicators.js +16 -13
- package/dist/esm/utils/Resolver.js +201 -0
- package/dist/esm/utils/Skeleton.js +11 -10
- package/dist/esm/utils/StyledTooltip.js +38 -0
- package/dist/esm/utils/VirtualizedList.js +35 -27
- package/dist/esm/utils/errors.js +15 -15
- package/dist/esm/utils/requests.js +24 -12
- package/dist/esm/utils/search.js +7 -7
- package/dist/esm/utils/string.js +7 -7
- package/dist/esm/utils/zarrData.js +27 -28
- package/package.json +21 -9
- package/scss/cherita-bootstrap.scss +2 -2
- package/scss/cherita.scss +43 -17
- package/scss/components/accordions.scss +4 -1
- package/scss/components/layouts.scss +15 -33
- package/scss/components/lists.scss +8 -4
- package/scss/components/plotly.scss +38 -26
- package/scss/components/plots.scss +14 -1
- package/dist/assets/images/plots/dotplot.svg +0 -152
- package/dist/assets/images/plots/heatmap.svg +0 -193
- package/dist/assets/images/plots/matrixplot.svg +0 -275
- package/dist/assets/images/plots/scatterplot.svg +0 -198
- package/dist/assets/images/plots/violin.svg +0 -50
|
@@ -3,23 +3,24 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
3
3
|
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; }
|
|
4
4
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
5
5
|
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); }
|
|
6
|
-
import
|
|
7
|
-
import { faChevronDown, faChevronRight } from
|
|
8
|
-
import { FontAwesomeIcon } from
|
|
9
|
-
import CommentIcon from
|
|
10
|
-
import JoinInnerIcon from
|
|
11
|
-
import WaterDropIcon from
|
|
12
|
-
import _ from
|
|
13
|
-
import { Alert } from
|
|
14
|
-
import Accordion from
|
|
15
|
-
import { useAccordionButton } from
|
|
16
|
-
import AccordionContext from
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
22
|
-
import {
|
|
6
|
+
import { useContext, useEffect, useMemo, useState } from 'react';
|
|
7
|
+
import { faChevronDown, faChevronRight } from '@fortawesome/free-solid-svg-icons';
|
|
8
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
9
|
+
import CommentIcon from '@mui/icons-material/Comment';
|
|
10
|
+
import JoinInnerIcon from '@mui/icons-material/JoinInner';
|
|
11
|
+
import WaterDropIcon from '@mui/icons-material/WaterDrop';
|
|
12
|
+
import _ from 'lodash';
|
|
13
|
+
import { Alert } from 'react-bootstrap';
|
|
14
|
+
import Accordion from 'react-bootstrap/Accordion';
|
|
15
|
+
import { useAccordionButton } from 'react-bootstrap/AccordionButton';
|
|
16
|
+
import AccordionContext from 'react-bootstrap/AccordionContext';
|
|
17
|
+
import { COLOR_ENCODINGS, DEFAULT_OBS_GROUP, OBS_TYPES } from '../../constants/constants';
|
|
18
|
+
import { useDataset } from '../../context/DatasetContext';
|
|
19
|
+
import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
|
|
20
|
+
import { LoadingSpinner } from '../../utils/LoadingIndicators';
|
|
21
|
+
import { useFetch } from '../../utils/requests';
|
|
22
|
+
import { CategoricalObs, ContinuousObs } from './ObsItem';
|
|
23
|
+
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
23
24
|
const ObsAccordionToggle = _ref => {
|
|
24
25
|
let {
|
|
25
26
|
children,
|
|
@@ -33,48 +34,55 @@ const ObsAccordionToggle = _ref => {
|
|
|
33
34
|
const decoratedOnClick = useAccordionButton(eventKey, () => {
|
|
34
35
|
handleAccordionToggle(eventKey, isCurrentEventKey);
|
|
35
36
|
});
|
|
36
|
-
return /*#__PURE__*/
|
|
37
|
-
className: "obs-accordion-header ".concat(isCurrentEventKey ?
|
|
38
|
-
onClick: decoratedOnClick
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
37
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
38
|
+
className: "obs-accordion-header ".concat(isCurrentEventKey ? 'active' : ''),
|
|
39
|
+
onClick: decoratedOnClick,
|
|
40
|
+
children: [/*#__PURE__*/_jsx("span", {
|
|
41
|
+
className: "obs-accordion-header-chevron",
|
|
42
|
+
children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
|
|
43
|
+
icon: isCurrentEventKey ? faChevronDown : faChevronRight
|
|
44
|
+
})
|
|
45
|
+
}), /*#__PURE__*/_jsx("span", {
|
|
46
|
+
className: "obs-accordion-header-span",
|
|
47
|
+
children: children
|
|
48
|
+
})]
|
|
49
|
+
});
|
|
46
50
|
};
|
|
47
51
|
export function ObsColsList(_ref2) {
|
|
48
|
-
var _settings$selectedObs;
|
|
52
|
+
var _settings$selectedObs, _settings$selectedObs3, _settings$selectedObs4;
|
|
49
53
|
let {
|
|
50
54
|
showColor = true,
|
|
51
55
|
enableObsGroups = true,
|
|
52
56
|
showSelectedAsActive = false,
|
|
53
57
|
showHistograms = true
|
|
54
58
|
} = _ref2;
|
|
55
|
-
const ENDPOINT =
|
|
59
|
+
const ENDPOINT = 'obs/cols';
|
|
56
60
|
const dataset = useDataset();
|
|
57
61
|
const settings = useSettings();
|
|
58
62
|
const dispatch = useSettingsDispatch();
|
|
59
63
|
const [enableGroups, setEnableGroups] = useState(enableObsGroups);
|
|
60
64
|
const [obsCols, setObsCols] = useState(null);
|
|
61
|
-
const [active, setActive] = useState([...[(_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name]]);
|
|
62
|
-
const [params, setParams] = useState({
|
|
63
|
-
url: dataset.url
|
|
64
|
-
});
|
|
65
|
+
const [active, setActive] = useState([...(settings.selectedObs ? [(_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name] : [])]);
|
|
65
66
|
const obsGroups = useMemo(() => {
|
|
66
67
|
var _dataset$obsGroups;
|
|
67
68
|
return _objectSpread({
|
|
68
69
|
default: _.union(DEFAULT_OBS_GROUP, (_dataset$obsGroups = dataset.obsGroups) === null || _dataset$obsGroups === void 0 ? void 0 : _dataset$obsGroups.default)
|
|
69
|
-
}, _.omit(dataset.obsGroups,
|
|
70
|
+
}, _.omit(dataset.obsGroups, 'default'));
|
|
70
71
|
}, [dataset.obsGroups]);
|
|
72
|
+
const [params, setParams] = useState(_objectSpread({
|
|
73
|
+
url: dataset.url
|
|
74
|
+
}, enableGroups ? {
|
|
75
|
+
cols: _.flatten(_.values(obsGroups))
|
|
76
|
+
} : {}));
|
|
71
77
|
useEffect(() => {
|
|
72
78
|
setParams(p => {
|
|
73
79
|
return _objectSpread(_objectSpread({}, p), {}, {
|
|
74
80
|
url: dataset.url
|
|
75
|
-
}
|
|
81
|
+
}, enableGroups ? {
|
|
82
|
+
cols: _.flatten(_.values(obsGroups))
|
|
83
|
+
} : {});
|
|
76
84
|
});
|
|
77
|
-
}, [dataset.url]);
|
|
85
|
+
}, [dataset.url, enableGroups, obsGroups]);
|
|
78
86
|
const {
|
|
79
87
|
fetchedData,
|
|
80
88
|
isPending,
|
|
@@ -104,25 +112,34 @@ export function ObsColsList(_ref2) {
|
|
|
104
112
|
return d.type !== OBS_TYPES.DISCRETE;
|
|
105
113
|
});
|
|
106
114
|
setObsCols(_.keyBy(_.map(filteredData, d => {
|
|
115
|
+
var _settings$selectedObs2;
|
|
116
|
+
if (((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.name) === d.name) {
|
|
117
|
+
return _objectSpread(_objectSpread({}, d), {}, {
|
|
118
|
+
omit: settings.selectedObs.omit || []
|
|
119
|
+
});
|
|
120
|
+
}
|
|
107
121
|
return _objectSpread(_objectSpread({}, d), {}, {
|
|
108
|
-
codesMap: _.invert(d.codes),
|
|
109
122
|
omit: []
|
|
110
123
|
});
|
|
111
|
-
}),
|
|
124
|
+
}), 'name'));
|
|
112
125
|
}
|
|
113
|
-
}, [fetchedData, isPending, obsGroups, serverError, enableGroups]);
|
|
126
|
+
}, [fetchedData, isPending, obsGroups, serverError, enableGroups, (_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.name, (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.omit]);
|
|
114
127
|
useEffect(() => {
|
|
115
|
-
if (obsCols) {
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
128
|
+
if (obsCols && settings.selectedObs) {
|
|
129
|
+
const {
|
|
130
|
+
name
|
|
131
|
+
} = settings.selectedObs;
|
|
132
|
+
if (!obsCols[name]) {
|
|
119
133
|
dispatch({
|
|
120
|
-
type:
|
|
134
|
+
type: 'select.obs',
|
|
121
135
|
obs: null
|
|
122
136
|
});
|
|
137
|
+
if (active.includes(name)) {
|
|
138
|
+
setActive(prev => _.without(prev, name));
|
|
139
|
+
}
|
|
123
140
|
}
|
|
124
141
|
}
|
|
125
|
-
}, [settings.selectedObs, dispatch, obsCols]);
|
|
142
|
+
}, [settings.selectedObs, dispatch, obsCols, active]);
|
|
126
143
|
const handleAccordionToggle = (itemName, isCurrentEventKey) => {
|
|
127
144
|
if (isCurrentEventKey) {
|
|
128
145
|
_.delay(() => setActive(prev => _.without(prev, itemName)), 250);
|
|
@@ -131,8 +148,8 @@ export function ObsColsList(_ref2) {
|
|
|
131
148
|
}
|
|
132
149
|
};
|
|
133
150
|
const toggleAll = item => {
|
|
134
|
-
var _settings$
|
|
135
|
-
const omit = item.omit.length ? [] :
|
|
151
|
+
var _settings$selectedObs5;
|
|
152
|
+
const omit = item.omit.length ? [] : item.values;
|
|
136
153
|
setObsCols(o => {
|
|
137
154
|
return _objectSpread(_objectSpread({}, o), {}, {
|
|
138
155
|
[item.name]: _objectSpread(_objectSpread({}, item), {}, {
|
|
@@ -140,9 +157,9 @@ export function ObsColsList(_ref2) {
|
|
|
140
157
|
})
|
|
141
158
|
});
|
|
142
159
|
});
|
|
143
|
-
if (((_settings$
|
|
160
|
+
if (((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.name) === item.name) {
|
|
144
161
|
dispatch({
|
|
145
|
-
type:
|
|
162
|
+
type: 'select.obs',
|
|
146
163
|
obs: _objectSpread(_objectSpread({}, item), {}, {
|
|
147
164
|
omit: omit
|
|
148
165
|
})
|
|
@@ -150,46 +167,42 @@ export function ObsColsList(_ref2) {
|
|
|
150
167
|
}
|
|
151
168
|
};
|
|
152
169
|
const toggleLabel = item => {
|
|
153
|
-
const inLabelObs = _.
|
|
170
|
+
const inLabelObs = _.includes(settings.labelObs, item.name);
|
|
154
171
|
if (inLabelObs) {
|
|
155
172
|
dispatch({
|
|
156
|
-
type:
|
|
173
|
+
type: 'remove.label.obs',
|
|
157
174
|
obsName: item.name
|
|
158
175
|
});
|
|
159
176
|
} else {
|
|
160
177
|
dispatch({
|
|
161
|
-
type:
|
|
162
|
-
obs:
|
|
163
|
-
name: item.name,
|
|
164
|
-
type: item.type,
|
|
165
|
-
codesMap: item.codesMap
|
|
166
|
-
}
|
|
178
|
+
type: 'add.label.obs',
|
|
179
|
+
obs: item
|
|
167
180
|
});
|
|
168
181
|
}
|
|
169
182
|
};
|
|
170
183
|
const toggleSlice = item => {
|
|
171
184
|
dispatch({
|
|
172
|
-
type:
|
|
185
|
+
type: 'toggle.slice.obs',
|
|
173
186
|
obs: item
|
|
174
187
|
});
|
|
175
188
|
};
|
|
176
189
|
const toggleColor = item => {
|
|
177
190
|
dispatch({
|
|
178
|
-
type:
|
|
191
|
+
type: 'select.obs',
|
|
179
192
|
obs: item
|
|
180
193
|
});
|
|
181
194
|
dispatch({
|
|
182
|
-
type:
|
|
195
|
+
type: 'set.colorEncoding',
|
|
183
196
|
value: COLOR_ENCODINGS.OBS
|
|
184
197
|
});
|
|
185
198
|
};
|
|
186
199
|
const toggleObs = (item, value) => {
|
|
187
|
-
var _settings$
|
|
200
|
+
var _settings$selectedObs6;
|
|
188
201
|
let omit;
|
|
189
|
-
if (_.includes(item.omit,
|
|
190
|
-
omit = item.omit.filter(i => i !==
|
|
202
|
+
if (_.includes(item.omit, value)) {
|
|
203
|
+
omit = item.omit.filter(i => i !== value);
|
|
191
204
|
} else {
|
|
192
|
-
omit = [...item.omit,
|
|
205
|
+
omit = [...item.omit, value];
|
|
193
206
|
}
|
|
194
207
|
setObsCols(o => {
|
|
195
208
|
return _objectSpread(_objectSpread({}, o), {}, {
|
|
@@ -198,9 +211,9 @@ export function ObsColsList(_ref2) {
|
|
|
198
211
|
})
|
|
199
212
|
});
|
|
200
213
|
});
|
|
201
|
-
if (((_settings$
|
|
214
|
+
if (((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name) {
|
|
202
215
|
dispatch({
|
|
203
|
-
type:
|
|
216
|
+
type: 'select.obs',
|
|
204
217
|
obs: _objectSpread(_objectSpread({}, item), {}, {
|
|
205
218
|
omit: omit
|
|
206
219
|
})
|
|
@@ -208,107 +221,123 @@ export function ObsColsList(_ref2) {
|
|
|
208
221
|
}
|
|
209
222
|
};
|
|
210
223
|
const obsItem = item => {
|
|
211
|
-
var _settings$
|
|
224
|
+
var _settings$selectedObs7, _settings$selectedObs8;
|
|
212
225
|
if (!item) {
|
|
213
226
|
return null;
|
|
214
227
|
}
|
|
215
228
|
if (item.type === OBS_TYPES.DISCRETE) {
|
|
216
229
|
return null;
|
|
217
230
|
}
|
|
218
|
-
const inLabelObs = _.
|
|
219
|
-
const inSliceObs = settings.sliceBy.obs && ((_settings$
|
|
220
|
-
const isColorEncoding = (showSelectedAsActive || settings.colorEncoding === COLOR_ENCODINGS.OBS) && ((_settings$
|
|
221
|
-
return /*#__PURE__*/
|
|
231
|
+
const inLabelObs = _.includes(settings.labelObs, item.name);
|
|
232
|
+
const inSliceObs = settings.sliceBy.obs && ((_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.name) === item.name;
|
|
233
|
+
const isColorEncoding = (showSelectedAsActive || settings.colorEncoding === COLOR_ENCODINGS.OBS) && ((_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.name) === item.name;
|
|
234
|
+
return /*#__PURE__*/_jsxs("div", {
|
|
222
235
|
className: "accordion-item",
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
236
|
+
children: [/*#__PURE__*/_jsxs(ObsAccordionToggle, {
|
|
237
|
+
eventKey: item.name,
|
|
238
|
+
handleAccordionToggle: handleAccordionToggle,
|
|
239
|
+
children: [/*#__PURE__*/_jsx("div", {
|
|
240
|
+
className: "accordion-header-title",
|
|
241
|
+
children: item.name
|
|
242
|
+
}), /*#__PURE__*/_jsxs("div", {
|
|
243
|
+
className: "accordion-header-toolbar",
|
|
244
|
+
children: [/*#__PURE__*/_jsx("span", {
|
|
245
|
+
className: "mx-1 cursor-pointer ".concat(inLabelObs ? 'active-icon' : 'text-muted opacity-50'),
|
|
246
|
+
onClick: event => {
|
|
247
|
+
event.stopPropagation();
|
|
248
|
+
toggleLabel(item);
|
|
249
|
+
},
|
|
250
|
+
title: "Add to tooltip",
|
|
251
|
+
children: /*#__PURE__*/_jsx(CommentIcon, {})
|
|
252
|
+
}), /*#__PURE__*/_jsx("span", {
|
|
253
|
+
className: "mx-1 cursor-pointer ".concat(inSliceObs ? 'active-icon' : 'text-muted opacity-50'),
|
|
254
|
+
onClick: event => {
|
|
255
|
+
event.stopPropagation();
|
|
256
|
+
toggleSlice(item);
|
|
257
|
+
},
|
|
258
|
+
title: "Filter applied",
|
|
259
|
+
children: /*#__PURE__*/_jsx(JoinInnerIcon, {})
|
|
260
|
+
}), /*#__PURE__*/_jsx("span", {
|
|
261
|
+
className: "mx-1 cursor-pointer ".concat(isColorEncoding ? 'active-icon' : 'text-muted opacity-50'),
|
|
262
|
+
onClick: event => {
|
|
263
|
+
event.stopPropagation();
|
|
264
|
+
toggleColor(item);
|
|
265
|
+
},
|
|
266
|
+
title: showSelectedAsActive ? 'Is selected' : 'Is color encoding',
|
|
267
|
+
children: /*#__PURE__*/_jsx(WaterDropIcon, {})
|
|
268
|
+
})]
|
|
269
|
+
})]
|
|
270
|
+
}), /*#__PURE__*/_jsx(Accordion.Collapse, {
|
|
271
|
+
eventKey: item.name,
|
|
272
|
+
children: /*#__PURE__*/_jsx("div", {
|
|
273
|
+
className: "obs-accordion-body",
|
|
274
|
+
children: active.includes(item.name) && (item.type === OBS_TYPES.CATEGORICAL || item.type === OBS_TYPES.BOOLEAN ? /*#__PURE__*/_jsx(CategoricalObs, {
|
|
275
|
+
obs: item,
|
|
276
|
+
toggleAll: () => toggleAll(item),
|
|
277
|
+
toggleObs: value => toggleObs(item, value),
|
|
278
|
+
toggleLabel: () => toggleLabel(item),
|
|
279
|
+
toggleSlice: () => toggleSlice(item),
|
|
280
|
+
toggleColor: () => toggleColor(item),
|
|
281
|
+
showColor: showColor && isColorEncoding,
|
|
282
|
+
showHistograms: showHistograms
|
|
283
|
+
}, item.name) : /*#__PURE__*/_jsx(ContinuousObs, {
|
|
284
|
+
obs: item,
|
|
285
|
+
toggleAll: () => toggleAll(item),
|
|
286
|
+
toggleObs: value => toggleObs(item, value),
|
|
287
|
+
toggleLabel: () => toggleLabel(item),
|
|
288
|
+
toggleSlice: () => toggleSlice(item),
|
|
289
|
+
toggleColor: () => toggleColor(item),
|
|
290
|
+
showHistograms: showHistograms
|
|
291
|
+
}, item.name))
|
|
292
|
+
})
|
|
293
|
+
})]
|
|
294
|
+
}, item.name);
|
|
276
295
|
};
|
|
277
296
|
const groupList = _.map(_.keys(obsGroups), group => {
|
|
278
297
|
const key = "group-".concat(group);
|
|
279
298
|
const groupItems = _.compact(_.map(_.sortBy(obsGroups[group], o => _.lowerCase(o.name)), item => {
|
|
280
299
|
return obsItem(obsCols === null || obsCols === void 0 ? void 0 : obsCols[item]);
|
|
281
300
|
}));
|
|
282
|
-
if (group ===
|
|
301
|
+
if (group === 'default') {
|
|
283
302
|
return groupItems;
|
|
284
303
|
} else {
|
|
285
|
-
return /*#__PURE__*/
|
|
286
|
-
key: key,
|
|
304
|
+
return /*#__PURE__*/_jsxs(Accordion.Item, {
|
|
287
305
|
eventKey: key,
|
|
288
|
-
className: "obs-group-accordion-item"
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
306
|
+
className: "obs-group-accordion-item",
|
|
307
|
+
children: [/*#__PURE__*/_jsx(Accordion.Header, {
|
|
308
|
+
className: "obs-group-accordion-header",
|
|
309
|
+
children: group
|
|
310
|
+
}), /*#__PURE__*/_jsx(Accordion.Body, {
|
|
311
|
+
className: "obs-group-accordion-body",
|
|
312
|
+
children: groupItems
|
|
313
|
+
})]
|
|
314
|
+
}, key);
|
|
294
315
|
}
|
|
295
316
|
});
|
|
296
|
-
const obsList = enableGroups ? /*#__PURE__*/
|
|
317
|
+
const obsList = enableGroups ? /*#__PURE__*/_jsx(_Fragment, {
|
|
318
|
+
children: groupList
|
|
319
|
+
}) : _.map(_.sortBy(obsCols, o => _.lowerCase(o.name)), item => obsItem(item));
|
|
297
320
|
const defaultActiveGroup = enableGroups ? "group-".concat(_.findKey(obsGroups, g => g.includes(active === null || active === void 0 ? void 0 : active[0]))) : null;
|
|
298
321
|
if (!serverError) {
|
|
299
|
-
return /*#__PURE__*/
|
|
300
|
-
className: "position-relative h-100"
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
322
|
+
return /*#__PURE__*/_jsx("div", {
|
|
323
|
+
className: "position-relative h-100",
|
|
324
|
+
children: isPending ? /*#__PURE__*/_jsx(LoadingSpinner, {}) : !!obsCols && !_.size(obsCols) ? /*#__PURE__*/_jsx(Alert, {
|
|
325
|
+
variant: "danger",
|
|
326
|
+
children: "No observations found."
|
|
327
|
+
}) : /*#__PURE__*/_jsx(Accordion, {
|
|
328
|
+
flush: true,
|
|
329
|
+
defaultActiveKey: [...active, ...[defaultActiveGroup]],
|
|
330
|
+
alwaysOpen: true,
|
|
331
|
+
className: "obs-accordion",
|
|
332
|
+
children: obsList
|
|
333
|
+
})
|
|
334
|
+
});
|
|
309
335
|
} else {
|
|
310
|
-
return /*#__PURE__*/
|
|
311
|
-
|
|
312
|
-
|
|
336
|
+
return /*#__PURE__*/_jsx("div", {
|
|
337
|
+
children: /*#__PURE__*/_jsx(Alert, {
|
|
338
|
+
variant: "danger",
|
|
339
|
+
children: serverError.message
|
|
340
|
+
})
|
|
341
|
+
});
|
|
313
342
|
}
|
|
314
343
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import
|
|
2
|
-
import {
|
|
1
|
+
import { Form } from 'react-bootstrap';
|
|
2
|
+
import { jsx as _jsx } from "react/jsx-runtime";
|
|
3
3
|
export function ObsToolbar(_ref) {
|
|
4
4
|
let {
|
|
5
5
|
item,
|
|
@@ -7,7 +7,7 @@ export function ObsToolbar(_ref) {
|
|
|
7
7
|
onToggleAllObs
|
|
8
8
|
} = _ref;
|
|
9
9
|
const allToggledOn = !item.omit.length;
|
|
10
|
-
return showToggleAllObs && /*#__PURE__*/
|
|
10
|
+
return showToggleAllObs && /*#__PURE__*/_jsx(Form.Check, {
|
|
11
11
|
type: "switch",
|
|
12
12
|
id: "custom-switch",
|
|
13
13
|
label: "Toggle all",
|
|
@@ -3,16 +3,20 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
|
|
|
3
3
|
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; }
|
|
4
4
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
|
|
5
5
|
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); }
|
|
6
|
-
import
|
|
7
|
-
import _ from
|
|
8
|
-
import { Button, ButtonGroup, Dropdown, DropdownButton, OverlayTrigger, Tooltip } from
|
|
9
|
-
import { DEFAULT_OBSM_KEYS } from
|
|
10
|
-
import { useDataset } from
|
|
11
|
-
import { useSettings, useSettingsDispatch } from
|
|
12
|
-
import { useFetch } from
|
|
13
|
-
import { ObsmKeysListBtn } from
|
|
14
|
-
|
|
15
|
-
|
|
6
|
+
import { useEffect, useState } from 'react';
|
|
7
|
+
import _ from 'lodash';
|
|
8
|
+
import { Button, ButtonGroup, Dropdown, DropdownButton, OverlayTrigger, Tooltip } from 'react-bootstrap';
|
|
9
|
+
import { DEFAULT_OBSM_KEYS } from '../../constants/constants';
|
|
10
|
+
import { useDataset } from '../../context/DatasetContext';
|
|
11
|
+
import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
|
|
12
|
+
import { useFetch } from '../../utils/requests';
|
|
13
|
+
import { ObsmKeysListBtn } from '../../utils/Skeleton';
|
|
14
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
15
|
+
export function ObsmKeysList(_ref) {
|
|
16
|
+
let {
|
|
17
|
+
setHasObsm
|
|
18
|
+
} = _ref;
|
|
19
|
+
const ENDPOINT = 'obsm/keys';
|
|
16
20
|
const dataset = useDataset();
|
|
17
21
|
const settings = useSettings();
|
|
18
22
|
const dispatch = useSettingsDispatch();
|
|
@@ -36,28 +40,33 @@ export function ObsmKeysList() {
|
|
|
36
40
|
refetchOnMount: false
|
|
37
41
|
});
|
|
38
42
|
useEffect(() => {
|
|
39
|
-
if (!isPending && !serverError
|
|
40
|
-
|
|
43
|
+
if (!isPending && !serverError) {
|
|
44
|
+
if (!fetchedData || !fetchedData.length) {
|
|
45
|
+
setHasObsm(false);
|
|
46
|
+
} else {
|
|
47
|
+
setHasObsm(true);
|
|
48
|
+
setObsmKeysList(fetchedData);
|
|
41
49
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
// Set default obsm if in keys list and not selected
|
|
51
|
+
if (!settings.selectedObsm) {
|
|
52
|
+
// Follow DEFAULT_OBSM_KEYS order
|
|
53
|
+
_.each(DEFAULT_OBSM_KEYS, k => {
|
|
54
|
+
const defaultObsm = _.find(fetchedData, item => item.toLowerCase() === k);
|
|
55
|
+
if (defaultObsm) {
|
|
56
|
+
dispatch({
|
|
57
|
+
type: 'select.obsm',
|
|
58
|
+
obsm: defaultObsm
|
|
59
|
+
});
|
|
60
|
+
return false; // break
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
}
|
|
55
64
|
}
|
|
56
65
|
if (settings.selectedObsm) {
|
|
57
66
|
// If selected obsm is not in keys list, reset to null
|
|
58
|
-
if (!_.includes(fetchedData, settings.selectedObsm)) {
|
|
67
|
+
if (!_.includes(fetchedData || [], settings.selectedObsm)) {
|
|
59
68
|
dispatch({
|
|
60
|
-
type:
|
|
69
|
+
type: 'select.obsm',
|
|
61
70
|
obsm: null
|
|
62
71
|
});
|
|
63
72
|
} else {
|
|
@@ -65,40 +74,47 @@ export function ObsmKeysList() {
|
|
|
65
74
|
}
|
|
66
75
|
}
|
|
67
76
|
}
|
|
68
|
-
}, [dispatch, fetchedData, isPending, serverError, settings.selectedObsm]);
|
|
77
|
+
}, [dispatch, fetchedData, isPending, serverError, setHasObsm, settings.selectedObsm]);
|
|
69
78
|
const obsmList = obsmKeysList.map(item => {
|
|
70
|
-
return /*#__PURE__*/
|
|
71
|
-
|
|
72
|
-
className: "custom ".concat(active === item && "active"),
|
|
79
|
+
return /*#__PURE__*/_jsx(Dropdown.Item, {
|
|
80
|
+
className: "custom ".concat(active === item && 'active'),
|
|
73
81
|
onClick: () => {
|
|
74
82
|
dispatch({
|
|
75
|
-
type:
|
|
83
|
+
type: 'select.obsm',
|
|
76
84
|
obsm: item
|
|
77
85
|
});
|
|
78
|
-
}
|
|
86
|
+
},
|
|
87
|
+
children: item
|
|
79
88
|
}, item);
|
|
80
89
|
});
|
|
81
90
|
if (!serverError) {
|
|
82
91
|
if (isPending) {
|
|
83
|
-
return /*#__PURE__*/
|
|
92
|
+
return /*#__PURE__*/_jsx(ObsmKeysListBtn, {});
|
|
84
93
|
}
|
|
85
|
-
return /*#__PURE__*/
|
|
94
|
+
return /*#__PURE__*/_jsxs(DropdownButton, {
|
|
86
95
|
as: ButtonGroup,
|
|
87
|
-
title: settings.selectedObsm ||
|
|
88
|
-
variant: settings.selectedObsm ?
|
|
96
|
+
title: settings.selectedObsm || 'Select an embedding',
|
|
97
|
+
variant: settings.selectedObsm ? 'primary' : 'warning',
|
|
89
98
|
id: "bg-nested-dropdown",
|
|
90
|
-
size: "sm"
|
|
91
|
-
|
|
99
|
+
size: "sm",
|
|
100
|
+
children: [/*#__PURE__*/_jsx(Dropdown.Header, {
|
|
101
|
+
children: "Embeddings"
|
|
102
|
+
}), obsmList]
|
|
103
|
+
});
|
|
92
104
|
} else {
|
|
93
|
-
return /*#__PURE__*/
|
|
105
|
+
return /*#__PURE__*/_jsx(OverlayTrigger, {
|
|
94
106
|
placement: "top",
|
|
95
107
|
delay: {
|
|
96
108
|
show: 100,
|
|
97
109
|
hide: 200
|
|
98
110
|
},
|
|
99
|
-
overlay: /*#__PURE__*/
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
111
|
+
overlay: /*#__PURE__*/_jsx(Tooltip, {
|
|
112
|
+
children: serverError.message
|
|
113
|
+
}),
|
|
114
|
+
children: /*#__PURE__*/_jsx(Button, {
|
|
115
|
+
variant: "danger",
|
|
116
|
+
children: "Error"
|
|
117
|
+
})
|
|
118
|
+
});
|
|
103
119
|
}
|
|
104
120
|
}
|