@haniffalab/cherita-react 1.4.1-dev.2025-10-23.3179e534 → 1.4.1-dev.2025-10-23.55fbe6ff
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 +4 -4
- package/dist/cjs/components/dotplot/Dotplot.js +15 -28
- package/dist/cjs/components/dotplot/DotplotControls.js +5 -5
- package/dist/cjs/components/full-page/FullPage.js +1 -2
- package/dist/cjs/components/full-page/PlotAlert.js +1 -1
- package/dist/cjs/components/full-page/PlotTypeSelector.js +13 -13
- package/dist/cjs/components/heatmap/Heatmap.js +14 -24
- package/dist/cjs/components/icons/DotPlotIcon.js +1 -1
- package/dist/cjs/components/icons/HeatmapIcon.js +1 -1
- package/dist/cjs/components/icons/MatrixPlotIcon.1.js +1 -1
- package/dist/cjs/components/icons/MatrixPlotIcon.js +1 -1
- package/dist/cjs/components/icons/ScatterplotIcon.1.js +1 -1
- package/dist/cjs/components/icons/ScatterplotIcon.js +1 -1
- package/dist/cjs/components/icons/ViolinPlotIcon.js +1 -1
- package/dist/cjs/components/matrixplot/Matrixplot.js +15 -26
- package/dist/cjs/components/obs-list/ObsItem.js +19 -19
- package/dist/cjs/components/obs-list/ObsList.js +17 -17
- package/dist/cjs/components/obsm-list/ObsmList.js +7 -7
- package/dist/cjs/components/pseudospatial/Pseudospatial.js +16 -16
- package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +10 -10
- package/dist/cjs/components/scatterplot/Scatterplot.js +16 -16
- package/dist/cjs/components/scatterplot/ScatterplotControls.js +1 -1
- package/dist/cjs/components/scatterplot/SpatialControls.js +9 -9
- package/dist/cjs/components/scatterplot/Toolbox.js +4 -4
- package/dist/cjs/components/search-bar/SearchBar.js +14 -14
- package/dist/cjs/components/search-bar/SearchInfo.js +3 -3
- package/dist/cjs/components/search-bar/SearchResults.js +2 -2
- package/dist/cjs/components/toolbar/Toolbar.js +3 -3
- package/dist/cjs/components/var-list/VarItem.js +15 -15
- package/dist/cjs/components/var-list/VarList.js +5 -5
- package/dist/cjs/components/var-list/VarListToolbar.js +4 -4
- package/dist/cjs/components/var-list/VarSet.js +13 -13
- package/dist/cjs/components/violin/Violin.js +17 -41
- package/dist/cjs/constants/colorscales.js +19 -19
- package/dist/cjs/constants/constants.js +47 -47
- package/dist/cjs/context/DatasetContext.js +3 -3
- package/dist/cjs/context/FilterContext.js +2 -2
- package/dist/cjs/context/SettingsContext.js +57 -57
- package/dist/cjs/helpers/color-helper.js +2 -2
- package/dist/cjs/helpers/zarr-helper.js +3 -3
- package/dist/cjs/utils/Filter.js +1 -1
- package/dist/cjs/utils/Histogram.js +2 -2
- package/dist/cjs/utils/ImageViewer.js +2 -2
- package/dist/cjs/utils/Legend.js +1 -1
- package/dist/cjs/utils/LoadingIndicators.js +1 -1
- package/dist/cjs/utils/Resolver.js +7 -7
- package/dist/cjs/utils/Skeleton.js +1 -1
- package/dist/cjs/utils/StyledTooltip.js +5 -5
- package/dist/cjs/utils/VirtualizedList.js +7 -7
- package/dist/cjs/utils/errors.js +15 -15
- package/dist/cjs/utils/requests.js +14 -10
- package/dist/cjs/utils/search.js +4 -4
- package/dist/cjs/utils/string.js +6 -6
- package/dist/cjs/utils/zarrData.js +5 -5
- package/dist/css/cherita.css +21 -20
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/controls/Controls.js +9 -9
- package/dist/esm/components/dotplot/Dotplot.js +28 -41
- package/dist/esm/components/dotplot/DotplotControls.js +9 -9
- package/dist/esm/components/full-page/FullPage.js +22 -23
- package/dist/esm/components/full-page/PlotAlert.js +5 -5
- package/dist/esm/components/full-page/PlotTypeSelector.js +21 -21
- package/dist/esm/components/heatmap/Heatmap.js +27 -37
- package/dist/esm/components/heatmap/HeatmapControls.js +2 -2
- package/dist/esm/components/icons/DotPlotIcon.js +1 -1
- package/dist/esm/components/icons/HeatmapIcon.js +1 -1
- package/dist/esm/components/icons/MatrixPlotIcon.1.js +1 -1
- package/dist/esm/components/icons/MatrixPlotIcon.js +1 -1
- package/dist/esm/components/icons/ScatterplotIcon.1.js +1 -1
- package/dist/esm/components/icons/ScatterplotIcon.js +1 -1
- package/dist/esm/components/icons/ViolinPlotIcon.js +1 -1
- package/dist/esm/components/matrixplot/Matrixplot.js +28 -39
- package/dist/esm/components/matrixplot/MatrixplotControls.js +2 -2
- package/dist/esm/components/obs-list/ObsItem.js +37 -37
- package/dist/esm/components/obs-list/ObsList.js +34 -34
- package/dist/esm/components/obs-list/ObsToolbar.js +1 -1
- package/dist/esm/components/obsm-list/ObsmList.js +15 -15
- package/dist/esm/components/offcanvas/index.js +6 -6
- package/dist/esm/components/pseudospatial/Pseudospatial.js +31 -31
- package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +17 -17
- package/dist/esm/components/scatterplot/Scatterplot.js +38 -38
- package/dist/esm/components/scatterplot/ScatterplotControls.js +9 -9
- package/dist/esm/components/scatterplot/SpatialControls.js +23 -23
- package/dist/esm/components/scatterplot/Toolbox.js +7 -7
- package/dist/esm/components/search-bar/SearchBar.js +27 -27
- package/dist/esm/components/search-bar/SearchInfo.js +14 -14
- package/dist/esm/components/search-bar/SearchResults.js +10 -10
- package/dist/esm/components/toolbar/Toolbar.js +6 -6
- package/dist/esm/components/var-list/VarItem.js +27 -27
- package/dist/esm/components/var-list/VarList.js +21 -21
- package/dist/esm/components/var-list/VarListToolbar.js +10 -10
- package/dist/esm/components/var-list/VarSet.js +22 -22
- package/dist/esm/components/violin/Violin.js +33 -57
- package/dist/esm/components/violin/ViolinControls.js +2 -2
- package/dist/esm/constants/colorscales.js +19 -19
- package/dist/esm/constants/constants.js +47 -47
- package/dist/esm/context/DatasetContext.js +11 -11
- package/dist/esm/context/FilterContext.js +3 -3
- package/dist/esm/context/SettingsContext.js +61 -61
- package/dist/esm/context/ZarrDataContext.js +3 -3
- 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 +8 -8
- package/dist/esm/utils/Histogram.js +6 -6
- package/dist/esm/utils/ImageViewer.js +4 -4
- package/dist/esm/utils/Legend.js +9 -9
- package/dist/esm/utils/LoadingIndicators.js +2 -2
- package/dist/esm/utils/Resolver.js +13 -13
- package/dist/esm/utils/Skeleton.js +2 -2
- package/dist/esm/utils/StyledTooltip.js +6 -6
- package/dist/esm/utils/VirtualizedList.js +9 -9
- package/dist/esm/utils/errors.js +15 -15
- package/dist/esm/utils/requests.js +17 -13
- package/dist/esm/utils/search.js +7 -7
- package/dist/esm/utils/string.js +7 -7
- package/dist/esm/utils/zarrData.js +13 -13
- package/package.json +11 -7
- package/scss/cherita-bootstrap.scss +2 -2
- package/scss/cherita.scss +24 -17
- package/scss/components/accordions.scss +4 -1
- package/scss/components/layouts.scss +13 -12
- package/scss/components/lists.scss +8 -4
- package/scss/components/plotly.scss +1 -0
|
@@ -3,14 +3,14 @@ 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 { useDeferredValue, useEffect, useMemo, useState } from
|
|
7
|
-
import { faPlus } from
|
|
8
|
-
import { FontAwesomeIcon } from
|
|
9
|
-
import _ from
|
|
10
|
-
import { Button, ListGroup } from
|
|
11
|
-
import { useSettingsDispatch } from
|
|
12
|
-
import { useDiseaseSearch, useVarSearch } from
|
|
13
|
-
import { VirtualizedList } from
|
|
6
|
+
import { useDeferredValue, useEffect, useMemo, useState } from 'react';
|
|
7
|
+
import { faPlus } from '@fortawesome/free-solid-svg-icons';
|
|
8
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
9
|
+
import _ from 'lodash';
|
|
10
|
+
import { Button, ListGroup } from 'react-bootstrap';
|
|
11
|
+
import { useSettingsDispatch } from '../../context/SettingsContext';
|
|
12
|
+
import { useDiseaseSearch, useVarSearch } from '../../utils/search';
|
|
13
|
+
import { VirtualizedList } from '../../utils/VirtualizedList';
|
|
14
14
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
15
15
|
export function VarSearchResults(_ref) {
|
|
16
16
|
let {
|
|
@@ -104,7 +104,7 @@ export function VarSearchResults(_ref) {
|
|
|
104
104
|
}) : /*#__PURE__*/_jsx(ListGroup.Item, {
|
|
105
105
|
as: "button",
|
|
106
106
|
disabled: true,
|
|
107
|
-
children: !text.length ?
|
|
107
|
+
children: !text.length ? 'Search features' : !serverError ? isStale || isPending ? 'Loading...' : 'No items found' : 'Failed to fetch data'
|
|
108
108
|
}, "empty")
|
|
109
109
|
})
|
|
110
110
|
})
|
|
@@ -185,7 +185,7 @@ export function DiseasesSearchResults(_ref2) {
|
|
|
185
185
|
}) : /*#__PURE__*/_jsx(ListGroup.Item, {
|
|
186
186
|
as: "button",
|
|
187
187
|
disabled: true,
|
|
188
|
-
children: !text.length ?
|
|
188
|
+
children: !text.length ? 'Search diseases' : !serverError ? isStale || isPending ? 'Loading...' : 'No items found' : 'Failed to fetch data'
|
|
189
189
|
}, "empty")
|
|
190
190
|
})
|
|
191
191
|
})
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { faList, faSearch, faSliders } from
|
|
2
|
-
import { FontAwesomeIcon } from
|
|
3
|
-
import { Container, Nav, Navbar } from
|
|
1
|
+
import { faList, faSearch, faSliders } from '@fortawesome/free-solid-svg-icons';
|
|
2
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
3
|
+
import { Container, Nav, Navbar } from 'react-bootstrap';
|
|
4
4
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
5
5
|
export const Toolbar = _ref => {
|
|
6
6
|
let {
|
|
@@ -62,7 +62,7 @@ export const ObsPlotlyToolbar = _ref2 => {
|
|
|
62
62
|
onClick
|
|
63
63
|
} = _ref2;
|
|
64
64
|
return {
|
|
65
|
-
name:
|
|
65
|
+
name: 'Categories',
|
|
66
66
|
icon: {
|
|
67
67
|
width: 512,
|
|
68
68
|
height: 512,
|
|
@@ -76,7 +76,7 @@ export const VarPlotlyToolbar = _ref3 => {
|
|
|
76
76
|
onClick
|
|
77
77
|
} = _ref3;
|
|
78
78
|
return {
|
|
79
|
-
name:
|
|
79
|
+
name: 'Features',
|
|
80
80
|
icon: {
|
|
81
81
|
width: 512,
|
|
82
82
|
height: 512,
|
|
@@ -90,7 +90,7 @@ export const ControlsPlotlyToolbar = _ref4 => {
|
|
|
90
90
|
onClick
|
|
91
91
|
} = _ref4;
|
|
92
92
|
return {
|
|
93
|
-
name:
|
|
93
|
+
name: 'Controls',
|
|
94
94
|
icon: {
|
|
95
95
|
width: 512,
|
|
96
96
|
height: 512,
|
|
@@ -3,24 +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 { useEffect, useState } from
|
|
7
|
-
import { faDroplet, faPlus, faTrash } from
|
|
8
|
-
import { FontAwesomeIcon } from
|
|
9
|
-
import { MoreVert } from
|
|
10
|
-
import _ from
|
|
11
|
-
import { Button, Collapse, ListGroup, Table } from
|
|
12
|
-
import { COLOR_ENCODINGS, SELECTION_MODES } from
|
|
13
|
-
import { useDataset } from
|
|
14
|
-
import { useFilteredData } from
|
|
15
|
-
import { useSettings, useSettingsDispatch } from
|
|
16
|
-
import { Histogram } from
|
|
17
|
-
import { useDebouncedFetch, useFetch } from
|
|
6
|
+
import { useEffect, useState } from 'react';
|
|
7
|
+
import { faDroplet, faPlus, faTrash } from '@fortawesome/free-solid-svg-icons';
|
|
8
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
9
|
+
import { MoreVert } from '@mui/icons-material';
|
|
10
|
+
import _ from 'lodash';
|
|
11
|
+
import { Button, Collapse, ListGroup, Table } from 'react-bootstrap';
|
|
12
|
+
import { COLOR_ENCODINGS, SELECTION_MODES } from '../../constants/constants';
|
|
13
|
+
import { useDataset } from '../../context/DatasetContext';
|
|
14
|
+
import { useFilteredData } from '../../context/FilterContext';
|
|
15
|
+
import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
|
|
16
|
+
import { Histogram } from '../../utils/Histogram';
|
|
17
|
+
import { useDebouncedFetch, useFetch } from '../../utils/requests';
|
|
18
18
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
19
19
|
function VarHistogram(_ref) {
|
|
20
20
|
let {
|
|
21
21
|
item
|
|
22
22
|
} = _ref;
|
|
23
|
-
const ENDPOINT =
|
|
23
|
+
const ENDPOINT = 'var/histograms';
|
|
24
24
|
const dataset = useDataset();
|
|
25
25
|
const settings = useSettings();
|
|
26
26
|
const {
|
|
@@ -70,13 +70,13 @@ function VarDiseaseInfoItem(item) {
|
|
|
70
70
|
children: [/*#__PURE__*/_jsx("td", {
|
|
71
71
|
children: "Confidence"
|
|
72
72
|
}), /*#__PURE__*/_jsx("td", {
|
|
73
|
-
children: item.confidence ||
|
|
73
|
+
children: item.confidence || 'unknown'
|
|
74
74
|
})]
|
|
75
75
|
}), /*#__PURE__*/_jsxs("tr", {
|
|
76
76
|
children: [/*#__PURE__*/_jsxs("td", {
|
|
77
|
-
children: ["Organ", item.organs.length > 1 ?
|
|
77
|
+
children: ["Organ", item.organs.length > 1 ? 's' : '']
|
|
78
78
|
}), /*#__PURE__*/_jsx("td", {
|
|
79
|
-
children: item.organs.map(o => o.name).join(
|
|
79
|
+
children: item.organs.map(o => o.name).join(', ')
|
|
80
80
|
})]
|
|
81
81
|
}), !_.isEmpty(item.metadata) && _.map(item.metadata, (value, key) => {
|
|
82
82
|
if (value !== null && value !== undefined) {
|
|
@@ -114,7 +114,7 @@ export function SelectionItem(_ref3) {
|
|
|
114
114
|
showRemove = true,
|
|
115
115
|
isMultiple = false
|
|
116
116
|
} = _ref3;
|
|
117
|
-
const ENDPOINT =
|
|
117
|
+
const ENDPOINT = 'disease/gene';
|
|
118
118
|
const [openInfo, setOpenInfo] = useState(false);
|
|
119
119
|
const dataset = useDataset();
|
|
120
120
|
const params = {
|
|
@@ -133,7 +133,7 @@ export function SelectionItem(_ref3) {
|
|
|
133
133
|
const hasDiseaseInfo = !isPending && !serverError && !!(fetchedData !== null && fetchedData !== void 0 && fetchedData.length);
|
|
134
134
|
return /*#__PURE__*/_jsxs(_Fragment, {
|
|
135
135
|
children: [/*#__PURE__*/_jsx("div", {
|
|
136
|
-
className: hasDiseaseInfo ?
|
|
136
|
+
className: hasDiseaseInfo ? 'cursor-pointer' : '',
|
|
137
137
|
onClick: () => {
|
|
138
138
|
setOpenInfo(o => !o);
|
|
139
139
|
},
|
|
@@ -149,14 +149,14 @@ export function SelectionItem(_ref3) {
|
|
|
149
149
|
item: item
|
|
150
150
|
}), showSetColorEncoding && /*#__PURE__*/_jsxs(Button, {
|
|
151
151
|
type: "button",
|
|
152
|
-
variant: isActive ?
|
|
152
|
+
variant: isActive ? 'primary' : isNotInData ? 'outline-secondary' : 'outline-primary',
|
|
153
153
|
className: "m-0 p-0 px-1",
|
|
154
154
|
onClick: e => {
|
|
155
155
|
e.stopPropagation();
|
|
156
156
|
selectVar();
|
|
157
157
|
},
|
|
158
158
|
disabled: isNotInData,
|
|
159
|
-
title: isNotInData ?
|
|
159
|
+
title: isNotInData ? 'Not present in data' : 'Set as color encoding',
|
|
160
160
|
children: [/*#__PURE__*/_jsx(FontAwesomeIcon, {
|
|
161
161
|
icon: faDroplet
|
|
162
162
|
}), isMultiple && /*#__PURE__*/_jsx(FontAwesomeIcon, {
|
|
@@ -193,17 +193,17 @@ export function SelectionItem(_ref3) {
|
|
|
193
193
|
const select = (dispatch, mode, item) => {
|
|
194
194
|
if (mode === SELECTION_MODES.SINGLE) {
|
|
195
195
|
dispatch({
|
|
196
|
-
type:
|
|
196
|
+
type: 'select.var',
|
|
197
197
|
var: item
|
|
198
198
|
});
|
|
199
199
|
} else if (mode === SELECTION_MODES.MULTIPLE) {
|
|
200
200
|
dispatch({
|
|
201
|
-
type:
|
|
201
|
+
type: 'select.multivar',
|
|
202
202
|
var: item
|
|
203
203
|
});
|
|
204
204
|
}
|
|
205
205
|
dispatch({
|
|
206
|
-
type:
|
|
206
|
+
type: 'set.colorEncoding',
|
|
207
207
|
value: COLOR_ENCODINGS.VAR
|
|
208
208
|
});
|
|
209
209
|
};
|
|
@@ -219,19 +219,19 @@ export function VarItem(_ref4) {
|
|
|
219
219
|
const selectVar = () => debounceSelect(dispatch, mode, item);
|
|
220
220
|
const removeVar = () => {
|
|
221
221
|
dispatch({
|
|
222
|
-
type:
|
|
222
|
+
type: 'remove.var',
|
|
223
223
|
var: item
|
|
224
224
|
});
|
|
225
225
|
if (mode === SELECTION_MODES.SINGLE) {
|
|
226
226
|
if (active === item.matrix_index) {
|
|
227
227
|
dispatch({
|
|
228
|
-
type:
|
|
228
|
+
type: 'reset.var'
|
|
229
229
|
});
|
|
230
230
|
}
|
|
231
231
|
} else if (mode === SELECTION_MODES.MULTIPLE) {
|
|
232
232
|
if (active.includes(item.matrix_index)) {
|
|
233
233
|
dispatch({
|
|
234
|
-
type:
|
|
234
|
+
type: 'deselect.multivar',
|
|
235
235
|
var: item
|
|
236
236
|
});
|
|
237
237
|
}
|
|
@@ -239,7 +239,7 @@ export function VarItem(_ref4) {
|
|
|
239
239
|
};
|
|
240
240
|
const toggleVar = () => {
|
|
241
241
|
dispatch({
|
|
242
|
-
type:
|
|
242
|
+
type: 'toggle.multivar',
|
|
243
243
|
var: item
|
|
244
244
|
});
|
|
245
245
|
};
|
|
@@ -3,26 +3,26 @@ 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 { useEffect, useState } from
|
|
7
|
-
import { faTimes } from
|
|
8
|
-
import { FontAwesomeIcon } from
|
|
9
|
-
import _ from
|
|
10
|
-
import { Alert, Button, ListGroup } from
|
|
11
|
-
import ButtonGroup from
|
|
12
|
-
import { VarItem } from
|
|
13
|
-
import { VarListToolbar } from
|
|
14
|
-
import { VarSet } from
|
|
15
|
-
import { SELECTION_MODES, VAR_SORT } from
|
|
16
|
-
import { useDataset } from
|
|
17
|
-
import { useFilteredData } from
|
|
18
|
-
import { useSettings, useSettingsDispatch } from
|
|
19
|
-
import { LoadingSpinner } from
|
|
20
|
-
import { useFetch } from
|
|
21
|
-
import { useSelectedMultiVar, useSelectedVar, useSettingsVars } from
|
|
6
|
+
import { useEffect, useState } from 'react';
|
|
7
|
+
import { faTimes } from '@fortawesome/free-solid-svg-icons';
|
|
8
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
9
|
+
import _ from 'lodash';
|
|
10
|
+
import { Alert, Button, ListGroup } from 'react-bootstrap';
|
|
11
|
+
import ButtonGroup from 'react-bootstrap/ButtonGroup';
|
|
12
|
+
import { VarItem } from './VarItem';
|
|
13
|
+
import { VarListToolbar } from './VarListToolbar';
|
|
14
|
+
import { VarSet } from './VarSet';
|
|
15
|
+
import { SELECTION_MODES, VAR_SORT } from '../../constants/constants';
|
|
16
|
+
import { useDataset } from '../../context/DatasetContext';
|
|
17
|
+
import { useFilteredData } from '../../context/FilterContext';
|
|
18
|
+
import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
|
|
19
|
+
import { LoadingSpinner } from '../../utils/LoadingIndicators';
|
|
20
|
+
import { useFetch } from '../../utils/requests';
|
|
21
|
+
import { useSelectedMultiVar, useSelectedVar, useSettingsVars } from '../../utils/Resolver';
|
|
22
22
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
23
23
|
export const useVarMean = function (varKeys) {
|
|
24
24
|
let enabled = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
|
|
25
|
-
const ENDPOINT =
|
|
25
|
+
const ENDPOINT = 'matrix/mean';
|
|
26
26
|
const dataset = useDataset();
|
|
27
27
|
const {
|
|
28
28
|
obsIndices
|
|
@@ -60,7 +60,7 @@ export const sortMeans = (i, means) => {
|
|
|
60
60
|
export function VarNamesList(_ref) {
|
|
61
61
|
let {
|
|
62
62
|
mode = SELECTION_MODES.SINGLE,
|
|
63
|
-
displayName =
|
|
63
|
+
displayName = 'genes'
|
|
64
64
|
} = _ref;
|
|
65
65
|
const settings = useSettings();
|
|
66
66
|
const dispatch = useSettingsDispatch();
|
|
@@ -90,7 +90,7 @@ export function VarNamesList(_ref) {
|
|
|
90
90
|
}, settings.varSort.var.sortOrder));
|
|
91
91
|
}
|
|
92
92
|
} else if (settings.varSort.var.sort === VAR_SORT.NAME) {
|
|
93
|
-
setSortedVars(_.orderBy(settingsVars,
|
|
93
|
+
setSortedVars(_.orderBy(settingsVars, 'name', settings.varSort.var.sortOrder));
|
|
94
94
|
} else {
|
|
95
95
|
setSortedVars(settingsVars);
|
|
96
96
|
}
|
|
@@ -146,7 +146,7 @@ export function VarNamesList(_ref) {
|
|
|
146
146
|
variant: "info",
|
|
147
147
|
onClick: () => {
|
|
148
148
|
dispatch({
|
|
149
|
-
type:
|
|
149
|
+
type: 'add.var',
|
|
150
150
|
var: {
|
|
151
151
|
name: newSetName(),
|
|
152
152
|
vars: [],
|
|
@@ -159,7 +159,7 @@ export function VarNamesList(_ref) {
|
|
|
159
159
|
variant: "info",
|
|
160
160
|
onClick: () => {
|
|
161
161
|
dispatch({
|
|
162
|
-
type:
|
|
162
|
+
type: 'reset.vars'
|
|
163
163
|
});
|
|
164
164
|
},
|
|
165
165
|
children: [/*#__PURE__*/_jsx(FontAwesomeIcon, {
|
|
@@ -1,15 +1,15 @@
|
|
|
1
|
-
import { useState } from
|
|
2
|
-
import { faArrowDown19, faArrowDownAZ, faArrowUp91, faArrowUpZA, faXmark } from
|
|
3
|
-
import { FontAwesomeIcon } from
|
|
4
|
-
import { ToggleButton, ToggleButtonGroup } from
|
|
5
|
-
import { VAR_SORT, VAR_SORT_ORDER } from
|
|
6
|
-
import { useSettings, useSettingsDispatch } from
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { faArrowDown19, faArrowDownAZ, faArrowUp91, faArrowUpZA, faXmark } from '@fortawesome/free-solid-svg-icons';
|
|
3
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
4
|
+
import { ToggleButton, ToggleButtonGroup } from 'react-bootstrap';
|
|
5
|
+
import { VAR_SORT, VAR_SORT_ORDER } from '../../constants/constants';
|
|
6
|
+
import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
|
|
7
7
|
|
|
8
8
|
// @TODO: set option for "var" and "disease"
|
|
9
9
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
10
10
|
export function VarListToolbar(_ref) {
|
|
11
11
|
let {
|
|
12
|
-
varType =
|
|
12
|
+
varType = 'var'
|
|
13
13
|
} = _ref;
|
|
14
14
|
const settings = useSettings();
|
|
15
15
|
const dispatch = useSettingsDispatch();
|
|
@@ -20,7 +20,7 @@ export function VarListToolbar(_ref) {
|
|
|
20
20
|
if (sort !== sortValue) {
|
|
21
21
|
setSort(sortValue);
|
|
22
22
|
dispatch({
|
|
23
|
-
type:
|
|
23
|
+
type: 'set.varSort',
|
|
24
24
|
var: varType,
|
|
25
25
|
sort: sortValue,
|
|
26
26
|
sortOrder: sortOrder
|
|
@@ -29,7 +29,7 @@ export function VarListToolbar(_ref) {
|
|
|
29
29
|
const newSortOrder = sortOrder === VAR_SORT_ORDER.ASC ? VAR_SORT_ORDER.DESC : VAR_SORT_ORDER.ASC;
|
|
30
30
|
setSortOrder(newSortOrder);
|
|
31
31
|
dispatch({
|
|
32
|
-
type:
|
|
32
|
+
type: 'set.varSort',
|
|
33
33
|
var: varType,
|
|
34
34
|
sort: sortValue,
|
|
35
35
|
sortOrder: newSortOrder
|
|
@@ -79,7 +79,7 @@ export function VarListToolbar(_ref) {
|
|
|
79
79
|
onClick: () => {
|
|
80
80
|
setSort(VAR_SORT.NONE);
|
|
81
81
|
dispatch({
|
|
82
|
-
type:
|
|
82
|
+
type: 'set.varSort.sort',
|
|
83
83
|
var: varType,
|
|
84
84
|
sort: VAR_SORT.NONE
|
|
85
85
|
});
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { useState } from
|
|
2
|
-
import { faChevronDown, faChevronUp, faCircleInfo, faDroplet, faPlus, faTrash } from
|
|
3
|
-
import { FontAwesomeIcon } from
|
|
4
|
-
import _ from
|
|
5
|
-
import { Button, Collapse, ListGroup, OverlayTrigger, Tooltip } from
|
|
6
|
-
import { SelectionItem } from
|
|
7
|
-
import { COLOR_ENCODINGS, SELECTION_MODES } from
|
|
8
|
-
import { useSettings, useSettingsDispatch } from
|
|
9
|
-
import { SearchModal } from
|
|
1
|
+
import { useState } from 'react';
|
|
2
|
+
import { faChevronDown, faChevronUp, faCircleInfo, faDroplet, faPlus, faTrash } from '@fortawesome/free-solid-svg-icons';
|
|
3
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
4
|
+
import _ from 'lodash';
|
|
5
|
+
import { Button, Collapse, ListGroup, OverlayTrigger, Tooltip } from 'react-bootstrap';
|
|
6
|
+
import { SelectionItem } from './VarItem';
|
|
7
|
+
import { COLOR_ENCODINGS, SELECTION_MODES } from '../../constants/constants';
|
|
8
|
+
import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
|
|
9
|
+
import { SearchModal } from '../search-bar/SearchBar';
|
|
10
10
|
|
|
11
11
|
// @TODO: add button to score genes and plot
|
|
12
12
|
import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
|
|
13
13
|
const addVarToSet = (dispatch, set, v) => {
|
|
14
14
|
dispatch({
|
|
15
|
-
type:
|
|
15
|
+
type: 'add.varSet.var',
|
|
16
16
|
varSet: set,
|
|
17
17
|
var: v
|
|
18
18
|
});
|
|
@@ -28,7 +28,7 @@ function SelectionSet(_ref) {
|
|
|
28
28
|
} = _ref;
|
|
29
29
|
const [openSet, setOpenSet] = useState(false);
|
|
30
30
|
const [showModal, setShowModal] = useState(false);
|
|
31
|
-
const [searchText, setSearchText] = useState(
|
|
31
|
+
const [searchText, setSearchText] = useState('');
|
|
32
32
|
const varList = set.vars.length ? _.map(set.vars, v => {
|
|
33
33
|
return /*#__PURE__*/_jsx(ListGroup.Item, {
|
|
34
34
|
children: /*#__PURE__*/_jsx(SelectionItem, {
|
|
@@ -88,7 +88,7 @@ function SelectionSet(_ref) {
|
|
|
88
88
|
})
|
|
89
89
|
}), /*#__PURE__*/_jsxs(Button, {
|
|
90
90
|
type: "button",
|
|
91
|
-
variant: isActive ?
|
|
91
|
+
variant: isActive ? 'primary' : 'outline-primary',
|
|
92
92
|
className: "m-0 p-0 px-1",
|
|
93
93
|
onClick: e => {
|
|
94
94
|
e.stopPropagation();
|
|
@@ -133,7 +133,7 @@ function SelectionSet(_ref) {
|
|
|
133
133
|
handleClose: () => setShowModal(false),
|
|
134
134
|
text: searchText,
|
|
135
135
|
setText: setSearchText,
|
|
136
|
-
displayText:
|
|
136
|
+
displayText: 'features',
|
|
137
137
|
handleSelect: (d, i) => {
|
|
138
138
|
addVarToSet(d, set, i);
|
|
139
139
|
},
|
|
@@ -153,16 +153,16 @@ export function VarSet(_ref2) {
|
|
|
153
153
|
const selectSet = () => {
|
|
154
154
|
if (mode === SELECTION_MODES.SINGLE) {
|
|
155
155
|
dispatch({
|
|
156
|
-
type:
|
|
156
|
+
type: 'select.var',
|
|
157
157
|
var: set
|
|
158
158
|
});
|
|
159
159
|
dispatch({
|
|
160
|
-
type:
|
|
161
|
-
value:
|
|
160
|
+
type: 'set.colorEncoding',
|
|
161
|
+
value: 'var'
|
|
162
162
|
});
|
|
163
163
|
} else if (mode === SELECTION_MODES.MULTIPLE) {
|
|
164
164
|
dispatch({
|
|
165
|
-
type:
|
|
165
|
+
type: 'select.multivar',
|
|
166
166
|
var: set
|
|
167
167
|
});
|
|
168
168
|
}
|
|
@@ -171,32 +171,32 @@ export function VarSet(_ref2) {
|
|
|
171
171
|
if (mode === SELECTION_MODES.SINGLE) {
|
|
172
172
|
if (active === set.name) {
|
|
173
173
|
dispatch({
|
|
174
|
-
type:
|
|
174
|
+
type: 'reset.var'
|
|
175
175
|
});
|
|
176
176
|
}
|
|
177
177
|
} else if (mode === SELECTION_MODES.MULTIPLE) {
|
|
178
178
|
if (active.includes(set.name)) {
|
|
179
179
|
dispatch({
|
|
180
|
-
type:
|
|
180
|
+
type: 'deselect.multivar',
|
|
181
181
|
var: set
|
|
182
182
|
});
|
|
183
183
|
}
|
|
184
184
|
}
|
|
185
185
|
dispatch({
|
|
186
|
-
type:
|
|
186
|
+
type: 'remove.var',
|
|
187
187
|
var: set
|
|
188
188
|
});
|
|
189
189
|
};
|
|
190
190
|
const removeSetVar = v => {
|
|
191
191
|
dispatch({
|
|
192
|
-
type:
|
|
192
|
+
type: 'remove.varSet.var',
|
|
193
193
|
varSet: set,
|
|
194
194
|
var: v
|
|
195
195
|
});
|
|
196
196
|
};
|
|
197
197
|
const toggleSet = () => {
|
|
198
198
|
dispatch({
|
|
199
|
-
type:
|
|
199
|
+
type: 'toggle.multivar',
|
|
200
200
|
var: set
|
|
201
201
|
});
|
|
202
202
|
};
|
|
@@ -3,22 +3,22 @@ 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 { useEffect, useState } from
|
|
7
|
-
import { faCircleInfo } from
|
|
8
|
-
import { FontAwesomeIcon } from
|
|
9
|
-
import _ from
|
|
10
|
-
import { Badge, Button } from
|
|
11
|
-
import Plot from
|
|
12
|
-
import { PLOTLY_MODEBAR_BUTTONS, VIOLIN_MODES } from
|
|
13
|
-
import { useDataset } from
|
|
14
|
-
import { useFilteredData } from
|
|
15
|
-
import { useSettings } from
|
|
16
|
-
import { LoadingSpinner } from
|
|
17
|
-
import { useDebouncedFetch } from
|
|
18
|
-
import { useSelectedMultiVar, useSelectedObs, useSelectedVar } from
|
|
19
|
-
import { StyledTooltip } from
|
|
20
|
-
import { PlotAlert } from
|
|
21
|
-
import { ControlsPlotlyToolbar, ObsPlotlyToolbar, VarPlotlyToolbar } from
|
|
6
|
+
import { useEffect, useMemo, useState } from 'react';
|
|
7
|
+
import { faCircleInfo } from '@fortawesome/free-solid-svg-icons';
|
|
8
|
+
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
|
|
9
|
+
import _ from 'lodash';
|
|
10
|
+
import { Badge, Button } from 'react-bootstrap';
|
|
11
|
+
import Plot from 'react-plotly.js';
|
|
12
|
+
import { PLOTLY_MODEBAR_BUTTONS, VIOLIN_MODES } from '../../constants/constants';
|
|
13
|
+
import { useDataset } from '../../context/DatasetContext';
|
|
14
|
+
import { useFilteredData } from '../../context/FilterContext';
|
|
15
|
+
import { useSettings } from '../../context/SettingsContext';
|
|
16
|
+
import { LoadingSpinner } from '../../utils/LoadingIndicators';
|
|
17
|
+
import { useDebouncedFetch } from '../../utils/requests';
|
|
18
|
+
import { useSelectedMultiVar, useSelectedObs, useSelectedVar } from '../../utils/Resolver';
|
|
19
|
+
import { StyledTooltip } from '../../utils/StyledTooltip';
|
|
20
|
+
import { PlotAlert } from '../full-page/PlotAlert';
|
|
21
|
+
import { ControlsPlotlyToolbar, ObsPlotlyToolbar, VarPlotlyToolbar } from '../toolbar/Toolbar';
|
|
22
22
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
23
23
|
export function Violin(_ref) {
|
|
24
24
|
let {
|
|
@@ -32,7 +32,7 @@ export function Violin(_ref) {
|
|
|
32
32
|
plotType,
|
|
33
33
|
setPlotType
|
|
34
34
|
} = _ref;
|
|
35
|
-
const ENDPOINT =
|
|
35
|
+
const ENDPOINT = 'violin';
|
|
36
36
|
const dataset = useDataset();
|
|
37
37
|
const settings = useSettings();
|
|
38
38
|
const {
|
|
@@ -45,7 +45,7 @@ export function Violin(_ref) {
|
|
|
45
45
|
const selectedMultiVar = useSelectedMultiVar();
|
|
46
46
|
const selectedVar = useSelectedVar();
|
|
47
47
|
const selectedObs = useSelectedObs();
|
|
48
|
-
const
|
|
48
|
+
const params = useMemo(() => _objectSpread({
|
|
49
49
|
url: dataset.url,
|
|
50
50
|
mode: mode,
|
|
51
51
|
scale: settings.controls.scale.violinplot,
|
|
@@ -67,7 +67,7 @@ export function Violin(_ref) {
|
|
|
67
67
|
obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
|
|
68
68
|
obsIndices: isSliced ? [...(obsIndices || [])] : null
|
|
69
69
|
}
|
|
70
|
-
}[mode]));
|
|
70
|
+
}[mode]), [dataset.url, dataset.varNamesCol, isSliced, mode, obsIndices, selectedMultiVar, selectedObs, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.isSet, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars, settings.controls.scale.violinplot]);
|
|
71
71
|
// @TODO: set default scale
|
|
72
72
|
|
|
73
73
|
useEffect(() => {
|
|
@@ -77,39 +77,12 @@ export function Violin(_ref) {
|
|
|
77
77
|
} else {
|
|
78
78
|
setHasSelections(false);
|
|
79
79
|
}
|
|
80
|
-
setParams(p => {
|
|
81
|
-
return _objectSpread(_objectSpread({}, p), {}, {
|
|
82
|
-
url: dataset.url,
|
|
83
|
-
mode: mode,
|
|
84
|
-
varKeys: selectedMultiVar.map(i => i.isSet ? {
|
|
85
|
-
name: i.name,
|
|
86
|
-
indices: i.vars.map(v => v.index)
|
|
87
|
-
} : i.index),
|
|
88
|
-
scale: settings.controls.scale.violinplot,
|
|
89
|
-
varNamesCol: dataset.varNamesCol
|
|
90
|
-
});
|
|
91
|
-
});
|
|
92
80
|
} else if (mode === VIOLIN_MODES.GROUPBY) {
|
|
93
81
|
if (selectedObs && selectedVar) {
|
|
94
82
|
setHasSelections(true);
|
|
95
83
|
} else {
|
|
96
84
|
setHasSelections(false);
|
|
97
85
|
}
|
|
98
|
-
setParams(p => {
|
|
99
|
-
return _objectSpread(_objectSpread({}, p), {}, {
|
|
100
|
-
url: dataset.url,
|
|
101
|
-
mode: mode,
|
|
102
|
-
varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
|
|
103
|
-
name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
|
|
104
|
-
indices: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars.map(v => v.index)
|
|
105
|
-
} : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index,
|
|
106
|
-
obsCol: selectedObs,
|
|
107
|
-
obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
|
|
108
|
-
obsIndices: isSliced ? [...(obsIndices || [])] : null,
|
|
109
|
-
scale: settings.controls.scale.violinplot,
|
|
110
|
-
varNamesCol: dataset.varNamesCol
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
86
|
}
|
|
114
87
|
}, [settings.controls.scale.violinplot, selectedMultiVar, selectedObs, selectedVar, dataset.url, dataset.varNamesCol, obsIndices, isSliced, mode]);
|
|
115
88
|
const {
|
|
@@ -117,12 +90,15 @@ export function Violin(_ref) {
|
|
|
117
90
|
isPending,
|
|
118
91
|
serverError
|
|
119
92
|
} = useDebouncedFetch(ENDPOINT, params, 500, {
|
|
120
|
-
|
|
93
|
+
isEnabled: mode === VIOLIN_MODES.MULTIKEY && (params => !!params.varKeys.length || !!params.obsKeys.length) || mode === VIOLIN_MODES.GROUPBY && (params => !!params.varKey && !!params.obsCol)
|
|
121
94
|
});
|
|
122
95
|
useEffect(() => {
|
|
123
|
-
if (hasSelections && !isPending && !serverError) {
|
|
96
|
+
if (hasSelections && !!fetchedData && !isPending && !serverError) {
|
|
124
97
|
setData(fetchedData.data);
|
|
125
98
|
setLayout(fetchedData.layout);
|
|
99
|
+
} else {
|
|
100
|
+
setData([]);
|
|
101
|
+
setLayout({});
|
|
126
102
|
}
|
|
127
103
|
}, [fetchedData, hasSelections, isPending, serverError]);
|
|
128
104
|
const customModeBarButtons = _.compact([showObsBtn && ObsPlotlyToolbar({
|
|
@@ -142,15 +118,15 @@ export function Violin(_ref) {
|
|
|
142
118
|
children: [/*#__PURE__*/_jsx("div", {
|
|
143
119
|
className: "flex-grow-1 position-relative",
|
|
144
120
|
style: {
|
|
145
|
-
minHeight:
|
|
121
|
+
minHeight: '0'
|
|
146
122
|
},
|
|
147
123
|
children: /*#__PURE__*/_jsx(Plot, {
|
|
148
124
|
data: data,
|
|
149
125
|
layout: layout,
|
|
150
126
|
useResizeHandler: true,
|
|
151
127
|
style: {
|
|
152
|
-
width:
|
|
153
|
-
height:
|
|
128
|
+
width: '100%',
|
|
129
|
+
height: '100%'
|
|
154
130
|
},
|
|
155
131
|
config: {
|
|
156
132
|
displaylogo: false,
|
|
@@ -188,25 +164,25 @@ export function Violin(_ref) {
|
|
|
188
164
|
setPlotType: setPlotType,
|
|
189
165
|
children: [mode === VIOLIN_MODES.MULTIKEY && /*#__PURE__*/_jsxs("p", {
|
|
190
166
|
className: "p-0 m-0",
|
|
191
|
-
children: ["Select one or more",
|
|
167
|
+
children: ["Select one or more", ' ', showVarsBtn ? /*#__PURE__*/_jsx(Button, {
|
|
192
168
|
variant: "link",
|
|
193
169
|
className: "border-0 p-0 align-baseline",
|
|
194
170
|
onClick: setShowVars,
|
|
195
171
|
children: "features"
|
|
196
|
-
}) :
|
|
172
|
+
}) : 'features', ' ', "to display their expression distributions across all observations."]
|
|
197
173
|
}), mode === VIOLIN_MODES.GROUPBY && /*#__PURE__*/_jsxs("p", {
|
|
198
174
|
className: "p-0 m-0",
|
|
199
|
-
children: ["Select a",
|
|
175
|
+
children: ["Select a", ' ', showObsBtn ? /*#__PURE__*/_jsx(Button, {
|
|
200
176
|
variant: "link",
|
|
201
177
|
className: "border-0 p-0 align-baseline",
|
|
202
178
|
onClick: setShowObs,
|
|
203
179
|
children: "category"
|
|
204
|
-
}) :
|
|
180
|
+
}) : 'category', ' ', "to group observations, and choose a", ' ', showVarsBtn ? /*#__PURE__*/_jsx(Button, {
|
|
205
181
|
variant: "link",
|
|
206
182
|
className: "border-0 p-0 align-baseline",
|
|
207
183
|
onClick: setShowVars,
|
|
208
184
|
children: "feature"
|
|
209
|
-
}) :
|
|
185
|
+
}) : 'feature', ' ', "to view its distribution within each group."]
|
|
210
186
|
})]
|
|
211
187
|
});
|
|
212
188
|
} else {
|
|
@@ -215,7 +191,7 @@ export function Violin(_ref) {
|
|
|
215
191
|
heading: "Error displaying the violin plot",
|
|
216
192
|
plotType: plotType,
|
|
217
193
|
setPlotType: setPlotType,
|
|
218
|
-
children: serverError.message ||
|
|
194
|
+
children: serverError.message || 'An unexpected error occurred while generating the plot.'
|
|
219
195
|
});
|
|
220
196
|
}
|
|
221
197
|
}
|