@haniffalab/cherita-react 1.4.6 → 1.5.0-dev.2026-02-19.5a87edc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/components/dotplot/Dotplot.js +41 -33
- package/dist/cjs/components/heatmap/Heatmap.js +38 -30
- package/dist/cjs/components/matrixplot/Matrixplot.js +39 -31
- package/dist/cjs/components/obs-list/ObsItem.js +2 -2
- package/dist/cjs/components/obs-list/ObsList.js +8 -4
- package/dist/cjs/components/obsm-list/ObsmList.js +4 -15
- package/dist/cjs/components/offcanvas/{index.js → OffCanvas.js} +33 -1
- package/dist/cjs/components/{full-page → plot}/PlotAlert.js +1 -1
- package/dist/cjs/components/pseudospatial/Pseudospatial.js +6 -3
- package/dist/cjs/components/scatterplot/Scatterplot.js +140 -41
- package/dist/cjs/components/scatterplot/ScatterplotControls.js +74 -28
- package/dist/cjs/components/scatterplot/SpatialControls.js +37 -24
- package/dist/cjs/components/search-bar/SearchBar.js +63 -15
- package/dist/cjs/components/search-bar/SearchInfo.js +68 -25
- package/dist/cjs/components/search-bar/SearchResults.js +143 -130
- package/dist/cjs/components/toolbar/Toolbar.js +47 -42
- package/dist/cjs/components/var-list/VarList.js +18 -12
- package/dist/cjs/components/var-list/VarSet.js +1 -1
- package/dist/cjs/components/violin/Violin.js +52 -44
- package/dist/cjs/context/DatasetContext.js +12 -3
- package/dist/cjs/context/SettingsContext.js +25 -4
- package/dist/cjs/helpers/zarr-helper.js +39 -35
- package/dist/cjs/index.js +25 -12
- package/dist/cjs/utils/Skeleton.js +38 -2
- package/dist/cjs/utils/Slider.js +61 -0
- package/dist/cjs/utils/VirtualizedTable.js +97 -0
- package/dist/cjs/utils/parquetData.js +60 -0
- package/dist/cjs/utils/search.js +21 -2
- package/dist/cjs/utils/useNCBIData.js +35 -0
- package/dist/cjs/utils/usePlotVisibility.js +21 -0
- package/dist/cjs/utils/zarrData.js +57 -8
- package/dist/cjs/views/ObservationFeature/EmbeddedPlot.js +122 -0
- package/dist/cjs/{components/full-page/FullPage.js → views/ObservationFeature/StandardView.js} +38 -47
- package/dist/cjs/views/ObservationFeature/index.js +12 -0
- package/dist/cjs/views/PerturbationMap/ObsExplorer.js +299 -0
- package/dist/cjs/views/PerturbationMap/StandardView.js +104 -0
- package/dist/cjs/views/PerturbationMap/index.js +10 -0
- package/dist/css/cherita.css +20 -6
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/dotplot/Dotplot.js +42 -34
- package/dist/esm/components/heatmap/Heatmap.js +39 -31
- package/dist/esm/components/matrixplot/Matrixplot.js +40 -32
- package/dist/esm/components/obs-list/ObsItem.js +2 -2
- package/dist/esm/components/obs-list/ObsList.js +8 -4
- package/dist/esm/components/obsm-list/ObsmList.js +4 -15
- package/dist/esm/components/offcanvas/{index.js → OffCanvas.js} +32 -1
- package/dist/esm/components/{full-page → plot}/PlotAlert.js +1 -1
- package/dist/esm/components/pseudospatial/Pseudospatial.js +6 -3
- package/dist/esm/components/scatterplot/Scatterplot.js +140 -41
- package/dist/esm/components/scatterplot/ScatterplotControls.js +74 -28
- package/dist/esm/components/scatterplot/SpatialControls.js +37 -24
- package/dist/esm/components/search-bar/SearchBar.js +64 -16
- package/dist/esm/components/search-bar/SearchInfo.js +69 -26
- package/dist/esm/components/search-bar/SearchResults.js +144 -132
- package/dist/esm/components/toolbar/Toolbar.js +44 -39
- package/dist/esm/components/var-list/VarList.js +18 -12
- package/dist/esm/components/var-list/VarSet.js +1 -1
- package/dist/esm/components/violin/Violin.js +53 -45
- package/dist/esm/context/DatasetContext.js +13 -4
- package/dist/esm/context/SettingsContext.js +25 -4
- package/dist/esm/helpers/zarr-helper.js +36 -34
- package/dist/esm/index.js +4 -3
- package/dist/esm/utils/Skeleton.js +35 -1
- package/dist/esm/utils/Slider.js +54 -0
- package/dist/esm/utils/VirtualizedTable.js +89 -0
- package/dist/esm/utils/parquetData.js +51 -0
- package/dist/esm/utils/search.js +18 -0
- package/dist/esm/utils/useNCBIData.js +28 -0
- package/dist/esm/utils/usePlotVisibility.js +14 -0
- package/dist/esm/utils/zarrData.js +54 -6
- package/dist/esm/views/ObservationFeature/EmbeddedPlot.js +116 -0
- package/dist/esm/{components/full-page/FullPage.js → views/ObservationFeature/StandardView.js} +33 -42
- package/dist/esm/views/ObservationFeature/index.js +6 -0
- package/dist/esm/views/PerturbationMap/ObsExplorer.js +292 -0
- package/dist/esm/views/PerturbationMap/StandardView.js +98 -0
- package/dist/esm/views/PerturbationMap/index.js +4 -0
- package/package.json +12 -5
- package/scss/cherita.scss +7 -0
- package/scss/components/layouts.scss +0 -1
- package/scss/components/lists.scss +1 -1
- package/scss/components/plotly.scss +10 -1
- package/scss/components/plots.scss +7 -4
- /package/dist/cjs/components/{full-page → plot}/PlotTypeSelector.js +0 -0
- /package/dist/esm/components/{full-page → plot}/PlotTypeSelector.js +0 -0
|
@@ -15,7 +15,8 @@ var _SettingsContext = require("../../context/SettingsContext");
|
|
|
15
15
|
var _LoadingIndicators = require("../../utils/LoadingIndicators");
|
|
16
16
|
var _requests = require("../../utils/requests");
|
|
17
17
|
var _Resolver = require("../../utils/Resolver");
|
|
18
|
-
var
|
|
18
|
+
var _usePlotVisibility = _interopRequireDefault(require("../../utils/usePlotVisibility"));
|
|
19
|
+
var _PlotAlert = require("../plot/PlotAlert");
|
|
19
20
|
var _Toolbar = require("../toolbar/Toolbar");
|
|
20
21
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
21
22
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -26,14 +27,12 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
|
|
|
26
27
|
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); }
|
|
27
28
|
function Dotplot(_ref) {
|
|
28
29
|
let {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
showCtrlsBtn = false,
|
|
32
|
-
setShowObs,
|
|
33
|
-
setShowVars,
|
|
30
|
+
setShowCategories,
|
|
31
|
+
setShowSearch,
|
|
34
32
|
setShowControls,
|
|
35
33
|
plotType,
|
|
36
|
-
setPlotType
|
|
34
|
+
setPlotType,
|
|
35
|
+
isFullscreen = false
|
|
37
36
|
} = _ref;
|
|
38
37
|
const ENDPOINT = 'dotplot';
|
|
39
38
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
@@ -49,20 +48,27 @@ function Dotplot(_ref) {
|
|
|
49
48
|
const [hasSelections, setHasSelections] = (0, _react.useState)(false);
|
|
50
49
|
const selectedObs = (0, _Resolver.useSelectedObs)();
|
|
51
50
|
const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
|
|
52
|
-
const
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
51
|
+
const {
|
|
52
|
+
showCategoriesBtn,
|
|
53
|
+
showSearchBtn
|
|
54
|
+
} = (0, _usePlotVisibility.default)(isFullscreen);
|
|
55
|
+
const params = (0, _react.useMemo)(() => {
|
|
56
|
+
var _selectedObs$omit;
|
|
57
|
+
return {
|
|
58
|
+
url: dataset.url,
|
|
59
|
+
obsCol: selectedObs,
|
|
60
|
+
obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit = selectedObs.omit) !== null && _selectedObs$omit !== void 0 && _selectedObs$omit.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
|
|
61
|
+
varKeys: selectedMultiVar.map(i => i.isSet ? {
|
|
62
|
+
name: i.name,
|
|
63
|
+
indices: i.vars.map(v => v.index)
|
|
64
|
+
} : i.index),
|
|
65
|
+
obsIndices: isSliced ? [...(obsIndices || [])] : null,
|
|
66
|
+
standardScale: settings.controls.scale.dotplot,
|
|
67
|
+
meanOnlyExpressed: settings.controls.meanOnlyExpressed,
|
|
68
|
+
expressionCutoff: settings.controls.expressionCutoff,
|
|
69
|
+
varNamesCol: dataset.varNamesCol
|
|
70
|
+
};
|
|
71
|
+
}, [dataset.url, dataset.varNamesCol, isSliced, obsIndices, selectedMultiVar, selectedObs, settings.controls.expressionCutoff, settings.controls.meanOnlyExpressed, settings.controls.scale.dotplot]);
|
|
66
72
|
// @TODO: set default scale
|
|
67
73
|
|
|
68
74
|
(0, _react.useEffect)(() => {
|
|
@@ -122,19 +128,21 @@ function Dotplot(_ref) {
|
|
|
122
128
|
});
|
|
123
129
|
});
|
|
124
130
|
}, [settings.controls.colorAxis.cmin, settings.controls.colorAxis.cmax]);
|
|
125
|
-
const
|
|
126
|
-
onClick: setShowObs
|
|
127
|
-
}), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
|
|
128
|
-
onClick: setShowVars
|
|
129
|
-
}), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
|
|
131
|
+
const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
|
|
130
132
|
onClick: setShowControls
|
|
131
|
-
})]);
|
|
132
|
-
const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
|
|
133
|
+
}), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
|
|
133
134
|
if (!serverError) {
|
|
134
135
|
if (hasSelections) {
|
|
135
136
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
136
137
|
className: "cherita-plot cherita-dotplot position-relative",
|
|
137
|
-
children: [
|
|
138
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
139
|
+
className: "plotly-toolbar",
|
|
140
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Toolbar.PlotlyToolbar, {
|
|
141
|
+
setShowCategories: setShowCategories,
|
|
142
|
+
setShowSearch: setShowSearch,
|
|
143
|
+
isFullscreen: isFullscreen
|
|
144
|
+
})
|
|
145
|
+
}), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
|
|
138
146
|
data: data,
|
|
139
147
|
layout: layout,
|
|
140
148
|
useResizeHandler: true,
|
|
@@ -156,15 +164,15 @@ function Dotplot(_ref) {
|
|
|
156
164
|
setPlotType: setPlotType,
|
|
157
165
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
|
|
158
166
|
className: "p-0 m-0",
|
|
159
|
-
children: ["Select one or more", ' ',
|
|
167
|
+
children: ["Select one or more", ' ', showSearchBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
160
168
|
variant: "link",
|
|
161
169
|
className: "border-0 p-0 align-baseline",
|
|
162
|
-
onClick:
|
|
170
|
+
onClick: setShowSearch,
|
|
163
171
|
children: "features"
|
|
164
|
-
}) : 'features', ' ', "to display their expression across groups, then choose a", ' ',
|
|
172
|
+
}) : 'features', ' ', "to display their expression across groups, then choose a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
165
173
|
variant: "link",
|
|
166
174
|
className: "border-0 p-0 align-baseline",
|
|
167
|
-
onClick:
|
|
175
|
+
onClick: setShowCategories,
|
|
168
176
|
children: "category"
|
|
169
177
|
}) : 'category', ' ', "to group observations in the dotplot."]
|
|
170
178
|
})
|
|
@@ -15,7 +15,8 @@ var _SettingsContext = require("../../context/SettingsContext");
|
|
|
15
15
|
var _LoadingIndicators = require("../../utils/LoadingIndicators");
|
|
16
16
|
var _requests = require("../../utils/requests");
|
|
17
17
|
var _Resolver = require("../../utils/Resolver");
|
|
18
|
-
var
|
|
18
|
+
var _usePlotVisibility = _interopRequireDefault(require("../../utils/usePlotVisibility"));
|
|
19
|
+
var _PlotAlert = require("../plot/PlotAlert");
|
|
19
20
|
var _Toolbar = require("../toolbar/Toolbar");
|
|
20
21
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
21
22
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -26,14 +27,12 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
|
|
|
26
27
|
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); }
|
|
27
28
|
function Heatmap(_ref) {
|
|
28
29
|
let {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
showCtrlsBtn = false,
|
|
32
|
-
setShowObs,
|
|
33
|
-
setShowVars,
|
|
30
|
+
setShowCategories,
|
|
31
|
+
setShowSearch,
|
|
34
32
|
setShowControls,
|
|
35
33
|
plotType,
|
|
36
|
-
setPlotType
|
|
34
|
+
setPlotType,
|
|
35
|
+
isFullscreen = false
|
|
37
36
|
} = _ref;
|
|
38
37
|
const ENDPOINT = 'heatmap';
|
|
39
38
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
@@ -48,17 +47,24 @@ function Heatmap(_ref) {
|
|
|
48
47
|
const [hasSelections, setHasSelections] = (0, _react.useState)(false);
|
|
49
48
|
const selectedObs = (0, _Resolver.useSelectedObs)();
|
|
50
49
|
const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
50
|
+
const {
|
|
51
|
+
showCategoriesBtn,
|
|
52
|
+
showSearchBtn
|
|
53
|
+
} = (0, _usePlotVisibility.default)(isFullscreen);
|
|
54
|
+
const params = (0, _react.useMemo)(() => {
|
|
55
|
+
var _selectedObs$omit;
|
|
56
|
+
return {
|
|
57
|
+
url: dataset.url,
|
|
58
|
+
obsCol: selectedObs,
|
|
59
|
+
obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit = selectedObs.omit) !== null && _selectedObs$omit !== void 0 && _selectedObs$omit.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
|
|
60
|
+
varKeys: selectedMultiVar.map(i => i.isSet ? {
|
|
61
|
+
name: i.name,
|
|
62
|
+
indices: i.vars.map(v => v.index)
|
|
63
|
+
} : i.index),
|
|
64
|
+
obsIndices: isSliced ? [...(obsIndices || [])] : null,
|
|
65
|
+
varNamesCol: dataset.varNamesCol
|
|
66
|
+
};
|
|
67
|
+
}, [dataset.url, dataset.varNamesCol, isSliced, obsIndices, selectedMultiVar, selectedObs]);
|
|
62
68
|
(0, _react.useEffect)(() => {
|
|
63
69
|
if (selectedObs && selectedMultiVar.length) {
|
|
64
70
|
setHasSelections(true);
|
|
@@ -96,19 +102,21 @@ function Heatmap(_ref) {
|
|
|
96
102
|
colorscale.current = settings.controls.colorScale;
|
|
97
103
|
updateColorscale(colorscale.current);
|
|
98
104
|
}, [settings.controls.colorScale, updateColorscale]);
|
|
99
|
-
const
|
|
100
|
-
onClick: setShowObs
|
|
101
|
-
}), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
|
|
102
|
-
onClick: setShowVars
|
|
103
|
-
}), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
|
|
105
|
+
const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
|
|
104
106
|
onClick: setShowControls
|
|
105
|
-
})]);
|
|
106
|
-
const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
|
|
107
|
+
}), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
|
|
107
108
|
if (!serverError) {
|
|
108
109
|
if (hasSelections) {
|
|
109
110
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
110
111
|
className: "cherita-plot cherita-heatmap position-relative",
|
|
111
|
-
children: [
|
|
112
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
113
|
+
className: "plotly-toolbar",
|
|
114
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Toolbar.PlotlyToolbar, {
|
|
115
|
+
setShowCategories: setShowCategories,
|
|
116
|
+
setShowSearch: setShowSearch,
|
|
117
|
+
isFullscreen: isFullscreen
|
|
118
|
+
})
|
|
119
|
+
}), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
|
|
112
120
|
data: data,
|
|
113
121
|
layout: layout,
|
|
114
122
|
useResizeHandler: true,
|
|
@@ -130,15 +138,15 @@ function Heatmap(_ref) {
|
|
|
130
138
|
setPlotType: setPlotType,
|
|
131
139
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
|
|
132
140
|
className: "p-0 m-0",
|
|
133
|
-
children: ["Select one or more", ' ',
|
|
141
|
+
children: ["Select one or more", ' ', showSearchBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
134
142
|
variant: "link",
|
|
135
143
|
className: "border-0 p-0 align-baseline",
|
|
136
|
-
onClick:
|
|
144
|
+
onClick: setShowSearch,
|
|
137
145
|
children: "features"
|
|
138
|
-
}) : 'features', ' ', "to display their expression, then choose a", ' ',
|
|
146
|
+
}) : 'features', ' ', "to display their expression, then choose a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
139
147
|
variant: "link",
|
|
140
148
|
className: "border-0 p-0 align-baseline",
|
|
141
|
-
onClick:
|
|
149
|
+
onClick: setShowCategories,
|
|
142
150
|
children: "category"
|
|
143
151
|
}) : 'category', ' ', "to group observations in the heatmap."]
|
|
144
152
|
})
|
|
@@ -15,7 +15,8 @@ var _SettingsContext = require("../../context/SettingsContext");
|
|
|
15
15
|
var _LoadingIndicators = require("../../utils/LoadingIndicators");
|
|
16
16
|
var _requests = require("../../utils/requests");
|
|
17
17
|
var _Resolver = require("../../utils/Resolver");
|
|
18
|
-
var
|
|
18
|
+
var _usePlotVisibility = _interopRequireDefault(require("../../utils/usePlotVisibility"));
|
|
19
|
+
var _PlotAlert = require("../plot/PlotAlert");
|
|
19
20
|
var _Toolbar = require("../toolbar/Toolbar");
|
|
20
21
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
21
22
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
@@ -26,14 +27,12 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
|
|
|
26
27
|
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); }
|
|
27
28
|
function Matrixplot(_ref) {
|
|
28
29
|
let {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
showCtrlsBtn = false,
|
|
32
|
-
setShowObs,
|
|
33
|
-
setShowVars,
|
|
30
|
+
setShowCategories,
|
|
31
|
+
setShowSearch,
|
|
34
32
|
setShowControls,
|
|
35
33
|
plotType,
|
|
36
|
-
setPlotType
|
|
34
|
+
setPlotType,
|
|
35
|
+
isFullscreen = false
|
|
37
36
|
} = _ref;
|
|
38
37
|
const ENDPOINT = 'matrixplot';
|
|
39
38
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
@@ -48,18 +47,25 @@ function Matrixplot(_ref) {
|
|
|
48
47
|
const [hasSelections, setHasSelections] = (0, _react.useState)(false);
|
|
49
48
|
const selectedObs = (0, _Resolver.useSelectedObs)();
|
|
50
49
|
const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
|
|
51
|
-
const
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
50
|
+
const {
|
|
51
|
+
showCategoriesBtn,
|
|
52
|
+
showSearchBtn
|
|
53
|
+
} = (0, _usePlotVisibility.default)(isFullscreen);
|
|
54
|
+
const params = (0, _react.useMemo)(() => {
|
|
55
|
+
var _selectedObs$omit;
|
|
56
|
+
return {
|
|
57
|
+
url: dataset.url,
|
|
58
|
+
obsCol: selectedObs,
|
|
59
|
+
obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit = selectedObs.omit) !== null && _selectedObs$omit !== void 0 && _selectedObs$omit.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
|
|
60
|
+
varKeys: selectedMultiVar.map(i => i.isSet ? {
|
|
61
|
+
name: i.name,
|
|
62
|
+
indices: i.vars.map(v => v.index)
|
|
63
|
+
} : i.index),
|
|
64
|
+
obsIndices: isSliced ? [...(obsIndices || [])] : null,
|
|
65
|
+
standardScale: settings.controls.scale.matrixplot,
|
|
66
|
+
varNamesCol: dataset.varNamesCol
|
|
67
|
+
};
|
|
68
|
+
}, [dataset.url, dataset.varNamesCol, isSliced, obsIndices, selectedMultiVar, selectedObs, settings.controls.scale.matrixplot]);
|
|
63
69
|
(0, _react.useEffect)(() => {
|
|
64
70
|
if (selectedObs && selectedMultiVar.length) {
|
|
65
71
|
setHasSelections(true);
|
|
@@ -97,19 +103,21 @@ function Matrixplot(_ref) {
|
|
|
97
103
|
colorscale.current = settings.controls.colorScale;
|
|
98
104
|
updateColorscale(colorscale.current);
|
|
99
105
|
}, [settings.controls.colorScale, updateColorscale]);
|
|
100
|
-
const
|
|
101
|
-
onClick: setShowObs
|
|
102
|
-
}), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
|
|
103
|
-
onClick: setShowVars
|
|
104
|
-
}), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
|
|
106
|
+
const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
|
|
105
107
|
onClick: setShowControls
|
|
106
|
-
})]);
|
|
107
|
-
const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
|
|
108
|
+
}), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
|
|
108
109
|
if (!serverError) {
|
|
109
110
|
if (hasSelections) {
|
|
110
111
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
111
112
|
className: "cherita-plot cherita-matrixplot position-relative",
|
|
112
|
-
children: [
|
|
113
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
114
|
+
className: "plotly-toolbar",
|
|
115
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Toolbar.PlotlyToolbar, {
|
|
116
|
+
setShowCategories: setShowCategories,
|
|
117
|
+
setShowSearch: setShowSearch,
|
|
118
|
+
isFullscreen: isFullscreen
|
|
119
|
+
})
|
|
120
|
+
}), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
|
|
113
121
|
data: data,
|
|
114
122
|
layout: layout,
|
|
115
123
|
useResizeHandler: true,
|
|
@@ -131,15 +139,15 @@ function Matrixplot(_ref) {
|
|
|
131
139
|
setPlotType: setPlotType,
|
|
132
140
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
|
|
133
141
|
className: "p-0 m-0",
|
|
134
|
-
children: ["Select a", ' ',
|
|
142
|
+
children: ["Select a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
135
143
|
variant: "link",
|
|
136
144
|
className: "border-0 p-0 align-baseline",
|
|
137
|
-
onClick:
|
|
145
|
+
onClick: setShowCategories,
|
|
138
146
|
children: "category"
|
|
139
|
-
}) : 'category', ' ', "to group observations, then choose one or more", ' ',
|
|
147
|
+
}) : 'category', ' ', "to group observations, then choose one or more", ' ', showSearchBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
140
148
|
variant: "link",
|
|
141
149
|
className: "border-0 p-0 align-baseline",
|
|
142
|
-
onClick:
|
|
150
|
+
onClick: setShowSearch,
|
|
143
151
|
children: "features"
|
|
144
152
|
}) : 'features', ' ', "to display the matrix plot."]
|
|
145
153
|
})
|
|
@@ -165,7 +165,7 @@ function CategoricalItem(_ref2) {
|
|
|
165
165
|
getColor
|
|
166
166
|
} = (0, _colorHelper.useColor)();
|
|
167
167
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
168
|
-
className: "virtualized-list-wrapper",
|
|
168
|
+
className: "virtualized-list-wrapper ps-1",
|
|
169
169
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
|
|
170
170
|
className: "obs-item",
|
|
171
171
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
@@ -275,7 +275,7 @@ function CategoricalItem(_ref2) {
|
|
|
275
275
|
})]
|
|
276
276
|
})
|
|
277
277
|
}, value)
|
|
278
|
-
});
|
|
278
|
+
}, value);
|
|
279
279
|
}
|
|
280
280
|
function CategoricalObs(_ref3) {
|
|
281
281
|
let {
|
|
@@ -15,12 +15,12 @@ var _reactBootstrap = require("react-bootstrap");
|
|
|
15
15
|
var _Accordion = _interopRequireDefault(require("react-bootstrap/Accordion"));
|
|
16
16
|
var _AccordionButton = require("react-bootstrap/AccordionButton");
|
|
17
17
|
var _AccordionContext = _interopRequireDefault(require("react-bootstrap/AccordionContext"));
|
|
18
|
+
var _ObsItem = require("./ObsItem");
|
|
18
19
|
var _constants = require("../../constants/constants");
|
|
19
20
|
var _DatasetContext = require("../../context/DatasetContext");
|
|
20
21
|
var _SettingsContext = require("../../context/SettingsContext");
|
|
21
22
|
var _LoadingIndicators = require("../../utils/LoadingIndicators");
|
|
22
23
|
var _requests = require("../../utils/requests");
|
|
23
|
-
var _ObsItem = require("./ObsItem");
|
|
24
24
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
25
25
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
26
26
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
@@ -328,9 +328,12 @@ function ObsColsList(_ref2) {
|
|
|
328
328
|
if (!serverError) {
|
|
329
329
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
330
330
|
className: "position-relative h-100",
|
|
331
|
-
children: isPending ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}) : !!obsCols && !_lodash.default.size(obsCols) ? /*#__PURE__*/(0, _jsxRuntime.jsx)(
|
|
332
|
-
|
|
333
|
-
children:
|
|
331
|
+
children: isPending ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}) : !!obsCols && !_lodash.default.size(obsCols) ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
332
|
+
className: "p-3",
|
|
333
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
|
|
334
|
+
variant: "danger",
|
|
335
|
+
children: "No observations found"
|
|
336
|
+
})
|
|
334
337
|
}) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Accordion.default, {
|
|
335
338
|
flush: true,
|
|
336
339
|
defaultActiveKey: [...active, ...[defaultActiveGroup]],
|
|
@@ -341,6 +344,7 @@ function ObsColsList(_ref2) {
|
|
|
341
344
|
});
|
|
342
345
|
} else {
|
|
343
346
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
347
|
+
className: "p-3",
|
|
344
348
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
|
|
345
349
|
variant: "danger",
|
|
346
350
|
children: serverError.message
|
|
@@ -23,7 +23,6 @@ function ObsmKeysList(_ref) {
|
|
|
23
23
|
const settings = (0, _SettingsContext.useSettings)();
|
|
24
24
|
const dispatch = (0, _SettingsContext.useSettingsDispatch)();
|
|
25
25
|
const [keysList, setKeysList] = (0, _react.useState)([]);
|
|
26
|
-
const [active, setActive] = (0, _react.useState)(null);
|
|
27
26
|
const params = (0, _react.useMemo)(() => ({
|
|
28
27
|
url: dataset.url
|
|
29
28
|
}), [dataset.url]);
|
|
@@ -35,10 +34,9 @@ function ObsmKeysList(_ref) {
|
|
|
35
34
|
refetchOnMount: false
|
|
36
35
|
});
|
|
37
36
|
(0, _react.useEffect)(() => {
|
|
38
|
-
if (!isPending && !serverError) {
|
|
39
|
-
if (
|
|
37
|
+
if (!isPending && fetchedData && !serverError) {
|
|
38
|
+
if (!fetchedData.length) {
|
|
40
39
|
setHasObsm(false);
|
|
41
|
-
setKeysList([]);
|
|
42
40
|
if (settings.selectedObsm) {
|
|
43
41
|
dispatch({
|
|
44
42
|
type: 'select.obsm',
|
|
@@ -55,8 +53,6 @@ function ObsmKeysList(_ref) {
|
|
|
55
53
|
type: 'select.obsm',
|
|
56
54
|
obsm: null
|
|
57
55
|
});
|
|
58
|
-
} else {
|
|
59
|
-
setActive(settings.selectedObsm);
|
|
60
56
|
}
|
|
61
57
|
} else {
|
|
62
58
|
// Set default obsm if in keys list and not selected
|
|
@@ -73,18 +69,11 @@ function ObsmKeysList(_ref) {
|
|
|
73
69
|
});
|
|
74
70
|
}
|
|
75
71
|
}
|
|
76
|
-
} else if (!isPending && serverError) {
|
|
77
|
-
if (settings.selectedObsm) {
|
|
78
|
-
dispatch({
|
|
79
|
-
type: 'select.obsm',
|
|
80
|
-
obsm: null
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
72
|
}
|
|
84
73
|
}, [dispatch, fetchedData, isPending, serverError, setHasObsm, settings.selectedObsm]);
|
|
85
|
-
const obsmList =
|
|
74
|
+
const obsmList = _lodash.default.map(keysList, item => {
|
|
86
75
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
|
|
87
|
-
className: "custom ".concat(
|
|
76
|
+
className: "custom ".concat(settings.selectedObsm === item && 'active'),
|
|
88
77
|
onClick: () => {
|
|
89
78
|
dispatch({
|
|
90
79
|
type: 'select.obsm',
|
|
@@ -5,17 +5,20 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.OffcanvasControls = OffcanvasControls;
|
|
7
7
|
exports.OffcanvasObs = OffcanvasObs;
|
|
8
|
+
exports.OffcanvasObsExplorer = OffcanvasObsExplorer;
|
|
8
9
|
exports.OffcanvasObsm = OffcanvasObsm;
|
|
9
10
|
exports.OffcanvasVars = OffcanvasVars;
|
|
10
11
|
var _Offcanvas = _interopRequireDefault(require("react-bootstrap/Offcanvas"));
|
|
11
12
|
var _constants = require("../../constants/constants");
|
|
13
|
+
var _ObsExplorer = require("../../views/PerturbationMap/ObsExplorer");
|
|
12
14
|
var _ObsList = require("../obs-list/ObsList");
|
|
13
15
|
var _ObsmList = require("../obsm-list/ObsmList");
|
|
14
16
|
var _SearchBar = require("../search-bar/SearchBar");
|
|
15
17
|
var _VarList = require("../var-list/VarList");
|
|
16
18
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
17
19
|
const _excluded = ["show", "handleClose"],
|
|
18
|
-
_excluded2 = ["show", "handleClose", "Controls"]
|
|
20
|
+
_excluded2 = ["show", "handleClose", "Controls"],
|
|
21
|
+
_excluded3 = ["show", "handleClose"];
|
|
19
22
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
20
23
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
21
24
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
@@ -112,4 +115,33 @@ function OffcanvasControls(_ref4) {
|
|
|
112
115
|
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Controls, _objectSpread({}, props))
|
|
113
116
|
})]
|
|
114
117
|
});
|
|
118
|
+
}
|
|
119
|
+
function OffcanvasObsExplorer(_ref5) {
|
|
120
|
+
let {
|
|
121
|
+
show,
|
|
122
|
+
handleClose
|
|
123
|
+
} = _ref5,
|
|
124
|
+
props = _objectWithoutProperties(_ref5, _excluded3);
|
|
125
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Offcanvas.default, {
|
|
126
|
+
show: show,
|
|
127
|
+
onHide: handleClose,
|
|
128
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Header, {
|
|
129
|
+
closeButton: true,
|
|
130
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Title, {
|
|
131
|
+
children: "Features"
|
|
132
|
+
})
|
|
133
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Body, {
|
|
134
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
135
|
+
className: "sidebar-features",
|
|
136
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchBar.SearchBar, {
|
|
137
|
+
searchDiseases: false,
|
|
138
|
+
searchVar: false,
|
|
139
|
+
searchObs: true
|
|
140
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
141
|
+
className: "sidebar-features-list",
|
|
142
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsExplorer.ObsExplorer, _objectSpread({}, props))
|
|
143
|
+
})]
|
|
144
|
+
})
|
|
145
|
+
})]
|
|
146
|
+
});
|
|
115
147
|
}
|
|
@@ -34,7 +34,7 @@ function PlotAlert(_ref) {
|
|
|
34
34
|
className: "w-100 h-100 d-flex justify-content-center align-items-center",
|
|
35
35
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Alert, {
|
|
36
36
|
variant: variant,
|
|
37
|
-
className: "m-0 w-75 w-lg-50 text-center",
|
|
37
|
+
className: "m-0 my-3 w-75 w-lg-50 text-center",
|
|
38
38
|
children: [heading && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert.Heading, {
|
|
39
39
|
children: heading
|
|
40
40
|
}), " ", children]
|
|
@@ -50,6 +50,7 @@ function usePseudospatialData(plotType) {
|
|
|
50
50
|
}, [dataset.url, settings.pseudospatial.maskSet, settings.pseudospatial.maskValues, dataset.varNamesCol, isSliced, obsIndices]);
|
|
51
51
|
const getPlotParams = (0, _react.useCallback)(() => {
|
|
52
52
|
if (plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE) {
|
|
53
|
+
var _selectedObs$omit;
|
|
53
54
|
return _objectSpread({
|
|
54
55
|
varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
|
|
55
56
|
name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
|
|
@@ -57,18 +58,20 @@ function usePseudospatialData(plotType) {
|
|
|
57
58
|
} : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index
|
|
58
59
|
}, settings.sliceBy.obs ? {
|
|
59
60
|
obsCol: selectedObs,
|
|
60
|
-
obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit)
|
|
61
|
+
obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit = selectedObs.omit) !== null && _selectedObs$omit !== void 0 && _selectedObs$omit.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit)
|
|
61
62
|
} : {});
|
|
62
63
|
} else if (plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL) {
|
|
64
|
+
var _selectedObs$omit2;
|
|
63
65
|
return {
|
|
64
66
|
obsCol: selectedObs,
|
|
65
|
-
obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
|
|
67
|
+
obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit2 = selectedObs.omit) !== null && _selectedObs$omit2 !== void 0 && _selectedObs$omit2.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
|
|
66
68
|
mode: settings.pseudospatial.categoricalMode
|
|
67
69
|
};
|
|
68
70
|
} else if (plotType === 'continuous') {
|
|
71
|
+
var _selectedObs$omit3;
|
|
69
72
|
return {
|
|
70
73
|
obsCol: selectedObs,
|
|
71
|
-
obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit)
|
|
74
|
+
obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit3 = selectedObs.omit) !== null && _selectedObs$omit3 !== void 0 && _selectedObs$omit3.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit)
|
|
72
75
|
};
|
|
73
76
|
}
|
|
74
77
|
}, [settings.pseudospatial.categoricalMode, 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.sliceBy.obs, plotType]);
|