@haniffalab/cherita-react 1.3.0 → 1.3.1
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 +85 -57
- package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
- package/dist/cjs/components/full-page/FullPage.js +167 -114
- package/dist/cjs/components/full-page/PlotAlert.js +45 -0
- package/dist/cjs/components/full-page/PlotTypeSelector.js +102 -0
- package/dist/cjs/components/heatmap/Heatmap.js +83 -53
- 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 +83 -54
- package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
- package/dist/cjs/components/obs-list/ObsItem.js +305 -216
- package/dist/cjs/components/obs-list/ObsList.js +164 -128
- package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
- package/dist/cjs/components/obsm-list/ObsmList.js +67 -28
- package/dist/cjs/components/offcanvas/index.js +62 -27
- 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 +223 -175
- package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
- package/dist/cjs/components/scatterplot/SpatialControls.js +143 -116
- package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
- package/dist/cjs/components/search-bar/SearchBar.js +176 -120
- package/dist/cjs/components/search-bar/SearchInfo.js +79 -85
- package/dist/cjs/components/search-bar/SearchResults.js +93 -71
- package/dist/cjs/components/toolbar/Toolbar.js +111 -0
- package/dist/cjs/components/var-list/VarItem.js +131 -103
- package/dist/cjs/components/var-list/VarList.js +96 -74
- 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 +124 -81
- package/dist/cjs/components/violin/ViolinControls.js +8 -5
- package/dist/cjs/constants/colorscales.js +19 -19
- package/dist/cjs/constants/constants.js +54 -39
- package/dist/cjs/context/DatasetContext.js +27 -17
- package/dist/cjs/context/FilterContext.js +11 -9
- package/dist/cjs/context/SettingsContext.js +339 -125
- package/dist/cjs/context/ZarrDataContext.js +6 -5
- package/dist/cjs/helpers/color-helper.js +2 -2
- package/dist/cjs/helpers/map-helper.js +2 -1
- package/dist/cjs/helpers/zarr-helper.js +3 -3
- package/dist/cjs/index.js +15 -21
- 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 +36 -29
- 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 +188 -65
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/controls/Controls.js +43 -35
- package/dist/esm/components/dotplot/Dotplot.js +93 -64
- package/dist/esm/components/dotplot/DotplotControls.js +106 -85
- package/dist/esm/components/full-page/FullPage.js +180 -124
- package/dist/esm/components/full-page/PlotAlert.js +39 -0
- package/dist/esm/components/full-page/PlotTypeSelector.js +95 -0
- package/dist/esm/components/heatmap/Heatmap.js +91 -60
- 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 +91 -61
- package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
- package/dist/esm/components/obs-list/ObsItem.js +320 -228
- package/dist/esm/components/obs-list/ObsList.js +179 -142
- package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
- package/dist/esm/components/obsm-list/ObsmList.js +71 -32
- package/dist/esm/components/offcanvas/index.js +68 -33
- 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 +243 -194
- package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
- package/dist/esm/components/scatterplot/SpatialControls.js +155 -127
- package/dist/esm/components/scatterplot/Toolbox.js +44 -32
- package/dist/esm/components/search-bar/SearchBar.js +187 -130
- package/dist/esm/components/search-bar/SearchInfo.js +86 -91
- package/dist/esm/components/search-bar/SearchResults.js +100 -77
- package/dist/esm/components/toolbar/Toolbar.js +101 -0
- package/dist/esm/components/var-list/VarItem.js +142 -113
- package/dist/esm/components/var-list/VarList.js +108 -88
- 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 +135 -91
- package/dist/esm/components/violin/ViolinControls.js +10 -6
- package/dist/esm/constants/colorscales.js +19 -19
- package/dist/esm/constants/constants.js +53 -38
- package/dist/esm/context/DatasetContext.js +34 -23
- package/dist/esm/context/FilterContext.js +11 -8
- package/dist/esm/context/SettingsContext.js +341 -126
- package/dist/esm/context/ZarrDataContext.js +8 -6
- package/dist/esm/helpers/color-helper.js +5 -5
- package/dist/esm/helpers/map-helper.js +4 -3
- 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 +37 -29
- 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 -8
- package/scss/cherita-bootstrap.scss +2 -2
- package/scss/cherita.scss +65 -17
- package/scss/components/accordions.scss +15 -2
- package/scss/components/layouts.scss +116 -30
- package/scss/components/lists.scss +16 -5
- package/scss/components/plotly.scss +40 -23
- package/scss/components/plots.scss +14 -1
- package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
- package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
|
@@ -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,46 +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
|
-
enableObsGroups = true
|
|
55
|
+
enableObsGroups = true,
|
|
56
|
+
showSelectedAsActive = false,
|
|
57
|
+
showHistograms = true
|
|
52
58
|
} = _ref2;
|
|
53
|
-
const ENDPOINT =
|
|
59
|
+
const ENDPOINT = 'obs/cols';
|
|
54
60
|
const dataset = useDataset();
|
|
55
61
|
const settings = useSettings();
|
|
56
62
|
const dispatch = useSettingsDispatch();
|
|
57
63
|
const [enableGroups, setEnableGroups] = useState(enableObsGroups);
|
|
58
64
|
const [obsCols, setObsCols] = useState(null);
|
|
59
|
-
const [active, setActive] = useState([...[(_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name]]);
|
|
60
|
-
const [params, setParams] = useState({
|
|
61
|
-
url: dataset.url
|
|
62
|
-
});
|
|
65
|
+
const [active, setActive] = useState([...(settings.selectedObs ? [(_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name] : [])]);
|
|
63
66
|
const obsGroups = useMemo(() => {
|
|
64
67
|
var _dataset$obsGroups;
|
|
65
68
|
return _objectSpread({
|
|
66
69
|
default: _.union(DEFAULT_OBS_GROUP, (_dataset$obsGroups = dataset.obsGroups) === null || _dataset$obsGroups === void 0 ? void 0 : _dataset$obsGroups.default)
|
|
67
|
-
}, _.omit(dataset.obsGroups,
|
|
70
|
+
}, _.omit(dataset.obsGroups, 'default'));
|
|
68
71
|
}, [dataset.obsGroups]);
|
|
72
|
+
const [params, setParams] = useState(_objectSpread({
|
|
73
|
+
url: dataset.url
|
|
74
|
+
}, enableGroups ? {
|
|
75
|
+
cols: _.flatten(_.values(obsGroups))
|
|
76
|
+
} : {}));
|
|
69
77
|
useEffect(() => {
|
|
70
78
|
setParams(p => {
|
|
71
79
|
return _objectSpread(_objectSpread({}, p), {}, {
|
|
72
80
|
url: dataset.url
|
|
73
|
-
}
|
|
81
|
+
}, enableGroups ? {
|
|
82
|
+
cols: _.flatten(_.values(obsGroups))
|
|
83
|
+
} : {});
|
|
74
84
|
});
|
|
75
|
-
}, [dataset.url]);
|
|
85
|
+
}, [dataset.url, enableGroups, obsGroups]);
|
|
76
86
|
const {
|
|
77
87
|
fetchedData,
|
|
78
88
|
isPending,
|
|
@@ -102,25 +112,34 @@ export function ObsColsList(_ref2) {
|
|
|
102
112
|
return d.type !== OBS_TYPES.DISCRETE;
|
|
103
113
|
});
|
|
104
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
|
+
}
|
|
105
121
|
return _objectSpread(_objectSpread({}, d), {}, {
|
|
106
|
-
codesMap: _.invert(d.codes),
|
|
107
122
|
omit: []
|
|
108
123
|
});
|
|
109
|
-
}),
|
|
124
|
+
}), 'name'));
|
|
110
125
|
}
|
|
111
|
-
}, [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]);
|
|
112
127
|
useEffect(() => {
|
|
113
|
-
if (obsCols) {
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
128
|
+
if (obsCols && settings.selectedObs) {
|
|
129
|
+
const {
|
|
130
|
+
name
|
|
131
|
+
} = settings.selectedObs;
|
|
132
|
+
if (!obsCols[name]) {
|
|
117
133
|
dispatch({
|
|
118
|
-
type:
|
|
134
|
+
type: 'select.obs',
|
|
119
135
|
obs: null
|
|
120
136
|
});
|
|
137
|
+
if (active.includes(name)) {
|
|
138
|
+
setActive(prev => _.without(prev, name));
|
|
139
|
+
}
|
|
121
140
|
}
|
|
122
141
|
}
|
|
123
|
-
}, [settings.selectedObs, dispatch, obsCols]);
|
|
142
|
+
}, [settings.selectedObs, dispatch, obsCols, active]);
|
|
124
143
|
const handleAccordionToggle = (itemName, isCurrentEventKey) => {
|
|
125
144
|
if (isCurrentEventKey) {
|
|
126
145
|
_.delay(() => setActive(prev => _.without(prev, itemName)), 250);
|
|
@@ -129,8 +148,8 @@ export function ObsColsList(_ref2) {
|
|
|
129
148
|
}
|
|
130
149
|
};
|
|
131
150
|
const toggleAll = item => {
|
|
132
|
-
var _settings$
|
|
133
|
-
const omit = item.omit.length ? [] :
|
|
151
|
+
var _settings$selectedObs5;
|
|
152
|
+
const omit = item.omit.length ? [] : item.values;
|
|
134
153
|
setObsCols(o => {
|
|
135
154
|
return _objectSpread(_objectSpread({}, o), {}, {
|
|
136
155
|
[item.name]: _objectSpread(_objectSpread({}, item), {}, {
|
|
@@ -138,9 +157,9 @@ export function ObsColsList(_ref2) {
|
|
|
138
157
|
})
|
|
139
158
|
});
|
|
140
159
|
});
|
|
141
|
-
if (((_settings$
|
|
160
|
+
if (((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.name) === item.name) {
|
|
142
161
|
dispatch({
|
|
143
|
-
type:
|
|
162
|
+
type: 'select.obs',
|
|
144
163
|
obs: _objectSpread(_objectSpread({}, item), {}, {
|
|
145
164
|
omit: omit
|
|
146
165
|
})
|
|
@@ -148,46 +167,42 @@ export function ObsColsList(_ref2) {
|
|
|
148
167
|
}
|
|
149
168
|
};
|
|
150
169
|
const toggleLabel = item => {
|
|
151
|
-
const inLabelObs = _.
|
|
170
|
+
const inLabelObs = _.includes(settings.labelObs, item.name);
|
|
152
171
|
if (inLabelObs) {
|
|
153
172
|
dispatch({
|
|
154
|
-
type:
|
|
173
|
+
type: 'remove.label.obs',
|
|
155
174
|
obsName: item.name
|
|
156
175
|
});
|
|
157
176
|
} else {
|
|
158
177
|
dispatch({
|
|
159
|
-
type:
|
|
160
|
-
obs:
|
|
161
|
-
name: item.name,
|
|
162
|
-
type: item.type,
|
|
163
|
-
codesMap: item.codesMap
|
|
164
|
-
}
|
|
178
|
+
type: 'add.label.obs',
|
|
179
|
+
obs: item
|
|
165
180
|
});
|
|
166
181
|
}
|
|
167
182
|
};
|
|
168
183
|
const toggleSlice = item => {
|
|
169
184
|
dispatch({
|
|
170
|
-
type:
|
|
185
|
+
type: 'toggle.slice.obs',
|
|
171
186
|
obs: item
|
|
172
187
|
});
|
|
173
188
|
};
|
|
174
189
|
const toggleColor = item => {
|
|
175
190
|
dispatch({
|
|
176
|
-
type:
|
|
191
|
+
type: 'select.obs',
|
|
177
192
|
obs: item
|
|
178
193
|
});
|
|
179
194
|
dispatch({
|
|
180
|
-
type:
|
|
195
|
+
type: 'set.colorEncoding',
|
|
181
196
|
value: COLOR_ENCODINGS.OBS
|
|
182
197
|
});
|
|
183
198
|
};
|
|
184
199
|
const toggleObs = (item, value) => {
|
|
185
|
-
var _settings$
|
|
200
|
+
var _settings$selectedObs6;
|
|
186
201
|
let omit;
|
|
187
|
-
if (_.includes(item.omit,
|
|
188
|
-
omit = item.omit.filter(i => i !==
|
|
202
|
+
if (_.includes(item.omit, value)) {
|
|
203
|
+
omit = item.omit.filter(i => i !== value);
|
|
189
204
|
} else {
|
|
190
|
-
omit = [...item.omit,
|
|
205
|
+
omit = [...item.omit, value];
|
|
191
206
|
}
|
|
192
207
|
setObsCols(o => {
|
|
193
208
|
return _objectSpread(_objectSpread({}, o), {}, {
|
|
@@ -196,9 +211,9 @@ export function ObsColsList(_ref2) {
|
|
|
196
211
|
})
|
|
197
212
|
});
|
|
198
213
|
});
|
|
199
|
-
if (((_settings$
|
|
214
|
+
if (((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name) {
|
|
200
215
|
dispatch({
|
|
201
|
-
type:
|
|
216
|
+
type: 'select.obs',
|
|
202
217
|
obs: _objectSpread(_objectSpread({}, item), {}, {
|
|
203
218
|
omit: omit
|
|
204
219
|
})
|
|
@@ -206,101 +221,123 @@ export function ObsColsList(_ref2) {
|
|
|
206
221
|
}
|
|
207
222
|
};
|
|
208
223
|
const obsItem = item => {
|
|
209
|
-
var _settings$
|
|
224
|
+
var _settings$selectedObs7, _settings$selectedObs8;
|
|
210
225
|
if (!item) {
|
|
211
226
|
return null;
|
|
212
227
|
}
|
|
213
228
|
if (item.type === OBS_TYPES.DISCRETE) {
|
|
214
229
|
return null;
|
|
215
230
|
}
|
|
216
|
-
const inLabelObs = _.
|
|
217
|
-
const inSliceObs = settings.sliceBy.obs && ((_settings$
|
|
218
|
-
const isColorEncoding = settings.colorEncoding === COLOR_ENCODINGS.OBS && ((_settings$
|
|
219
|
-
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", {
|
|
220
235
|
className: "accordion-item",
|
|
221
|
-
|
|
222
|
-
|
|
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
|
-
|
|
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);
|
|
268
295
|
};
|
|
269
296
|
const groupList = _.map(_.keys(obsGroups), group => {
|
|
270
297
|
const key = "group-".concat(group);
|
|
271
298
|
const groupItems = _.compact(_.map(_.sortBy(obsGroups[group], o => _.lowerCase(o.name)), item => {
|
|
272
299
|
return obsItem(obsCols === null || obsCols === void 0 ? void 0 : obsCols[item]);
|
|
273
300
|
}));
|
|
274
|
-
if (group ===
|
|
301
|
+
if (group === 'default') {
|
|
275
302
|
return groupItems;
|
|
276
303
|
} else {
|
|
277
|
-
return /*#__PURE__*/
|
|
278
|
-
key: key,
|
|
304
|
+
return /*#__PURE__*/_jsxs(Accordion.Item, {
|
|
279
305
|
eventKey: key,
|
|
280
|
-
className: "obs-group-accordion-item"
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
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);
|
|
286
315
|
}
|
|
287
316
|
});
|
|
288
|
-
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));
|
|
289
320
|
const defaultActiveGroup = enableGroups ? "group-".concat(_.findKey(obsGroups, g => g.includes(active === null || active === void 0 ? void 0 : active[0]))) : null;
|
|
290
321
|
if (!serverError) {
|
|
291
|
-
return /*#__PURE__*/
|
|
292
|
-
className: "position-relative h-100"
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
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
|
+
});
|
|
301
335
|
} else {
|
|
302
|
-
return /*#__PURE__*/
|
|
303
|
-
|
|
304
|
-
|
|
336
|
+
return /*#__PURE__*/_jsx("div", {
|
|
337
|
+
children: /*#__PURE__*/_jsx(Alert, {
|
|
338
|
+
variant: "danger",
|
|
339
|
+
children: serverError.message
|
|
340
|
+
})
|
|
341
|
+
});
|
|
305
342
|
}
|
|
306
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,14 +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
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
|
|
13
|
-
|
|
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';
|
|
14
20
|
const dataset = useDataset();
|
|
15
21
|
const settings = useSettings();
|
|
16
22
|
const dispatch = useSettingsDispatch();
|
|
@@ -34,48 +40,81 @@ export function ObsmKeysList() {
|
|
|
34
40
|
refetchOnMount: false
|
|
35
41
|
});
|
|
36
42
|
useEffect(() => {
|
|
37
|
-
if (!isPending && !serverError
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
43
|
+
if (!isPending && !serverError) {
|
|
44
|
+
if (!fetchedData || !fetchedData.length) {
|
|
45
|
+
setHasObsm(false);
|
|
46
|
+
} else {
|
|
47
|
+
setHasObsm(true);
|
|
48
|
+
setObsmKeysList(fetchedData);
|
|
49
|
+
|
|
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
|
+
}
|
|
64
|
+
}
|
|
65
|
+
if (settings.selectedObsm) {
|
|
66
|
+
// If selected obsm is not in keys list, reset to null
|
|
67
|
+
if (!_.includes(fetchedData || [], settings.selectedObsm)) {
|
|
68
|
+
dispatch({
|
|
69
|
+
type: 'select.obsm',
|
|
70
|
+
obsm: null
|
|
71
|
+
});
|
|
72
|
+
} else {
|
|
73
|
+
setActive(settings.selectedObsm);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
44
76
|
}
|
|
45
|
-
}, [settings.selectedObsm]);
|
|
77
|
+
}, [dispatch, fetchedData, isPending, serverError, setHasObsm, settings.selectedObsm]);
|
|
46
78
|
const obsmList = obsmKeysList.map(item => {
|
|
47
|
-
return /*#__PURE__*/
|
|
48
|
-
|
|
49
|
-
className: "custom ".concat(active === item && "active"),
|
|
79
|
+
return /*#__PURE__*/_jsx(Dropdown.Item, {
|
|
80
|
+
className: "custom ".concat(active === item && 'active'),
|
|
50
81
|
onClick: () => {
|
|
51
82
|
dispatch({
|
|
52
|
-
type:
|
|
83
|
+
type: 'select.obsm',
|
|
53
84
|
obsm: item
|
|
54
85
|
});
|
|
55
|
-
}
|
|
86
|
+
},
|
|
87
|
+
children: item
|
|
56
88
|
}, item);
|
|
57
89
|
});
|
|
58
90
|
if (!serverError) {
|
|
59
91
|
if (isPending) {
|
|
60
|
-
return /*#__PURE__*/
|
|
92
|
+
return /*#__PURE__*/_jsx(ObsmKeysListBtn, {});
|
|
61
93
|
}
|
|
62
|
-
return /*#__PURE__*/
|
|
94
|
+
return /*#__PURE__*/_jsxs(DropdownButton, {
|
|
63
95
|
as: ButtonGroup,
|
|
64
|
-
title: settings.selectedObsm ||
|
|
65
|
-
variant: settings.selectedObsm ?
|
|
96
|
+
title: settings.selectedObsm || 'Select an embedding',
|
|
97
|
+
variant: settings.selectedObsm ? 'primary' : 'warning',
|
|
66
98
|
id: "bg-nested-dropdown",
|
|
67
|
-
size: "sm"
|
|
68
|
-
|
|
99
|
+
size: "sm",
|
|
100
|
+
children: [/*#__PURE__*/_jsx(Dropdown.Header, {
|
|
101
|
+
children: "Embeddings"
|
|
102
|
+
}), obsmList]
|
|
103
|
+
});
|
|
69
104
|
} else {
|
|
70
|
-
return /*#__PURE__*/
|
|
105
|
+
return /*#__PURE__*/_jsx(OverlayTrigger, {
|
|
71
106
|
placement: "top",
|
|
72
107
|
delay: {
|
|
73
108
|
show: 100,
|
|
74
109
|
hide: 200
|
|
75
110
|
},
|
|
76
|
-
overlay: /*#__PURE__*/
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
111
|
+
overlay: /*#__PURE__*/_jsx(Tooltip, {
|
|
112
|
+
children: serverError.message
|
|
113
|
+
}),
|
|
114
|
+
children: /*#__PURE__*/_jsx(Button, {
|
|
115
|
+
variant: "danger",
|
|
116
|
+
children: "Error"
|
|
117
|
+
})
|
|
118
|
+
});
|
|
80
119
|
}
|
|
81
120
|
}
|