@haniffalab/cherita-react 1.5.0 → 2.0.0
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 +24 -19
- package/dist/cjs/components/heatmap/Heatmap.js +24 -19
- package/dist/cjs/components/matrixplot/Matrixplot.js +24 -19
- package/dist/cjs/components/obs-list/ObsItem.js +2 -2
- package/dist/cjs/components/offcanvas/{index.js → OffCanvas.js} +34 -1
- package/dist/cjs/components/{full-page → plot}/PlotAlert.js +1 -1
- package/dist/cjs/components/scatterplot/Scatterplot.js +57 -32
- 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 +9 -4
- package/dist/cjs/components/search-bar/SearchInfo.js +68 -25
- package/dist/cjs/components/search-bar/SearchResults.js +56 -47
- 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 +26 -21
- package/dist/cjs/context/DatasetContext.js +10 -2
- package/dist/cjs/context/SettingsContext.js +19 -5
- package/dist/cjs/helpers/zarr-helper.js +20 -6
- package/dist/cjs/index.js +16 -23
- 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/useNCBIData.js +35 -0
- package/dist/cjs/utils/usePlotVisibility.js +21 -0
- package/dist/cjs/utils/zarrData.js +51 -2
- package/dist/cjs/{components/plot/Plot.js → views/ObservationFeature/EmbeddedPlot.js} +41 -37
- package/dist/cjs/{components/full-page/FullPage.js → views/ObservationFeature/StandardView.js} +40 -49
- package/dist/cjs/views/ObservationFeature/index.js +12 -0
- package/dist/cjs/views/PerturbationMap/EmbeddedPlot.js +56 -0
- package/dist/cjs/views/PerturbationMap/ObsExplorer.js +299 -0
- package/dist/cjs/{apps/perturbgen/PerturbGen.js → views/PerturbationMap/StandardView.js} +19 -27
- package/dist/cjs/views/PerturbationMap/index.js +12 -0
- package/dist/css/cherita.css +16 -7
- package/dist/css/cherita.css.map +1 -1
- package/dist/esm/components/dotplot/Dotplot.js +25 -20
- package/dist/esm/components/heatmap/Heatmap.js +25 -20
- package/dist/esm/components/matrixplot/Matrixplot.js +25 -20
- package/dist/esm/components/obs-list/ObsItem.js +2 -2
- package/dist/esm/components/offcanvas/{index.js → OffCanvas.js} +33 -1
- package/dist/esm/components/{full-page → plot}/PlotAlert.js +1 -1
- package/dist/esm/components/scatterplot/Scatterplot.js +57 -32
- 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 +9 -4
- package/dist/esm/components/search-bar/SearchInfo.js +69 -26
- package/dist/esm/components/search-bar/SearchResults.js +56 -47
- 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 +27 -22
- package/dist/esm/context/DatasetContext.js +10 -2
- package/dist/esm/context/SettingsContext.js +19 -5
- package/dist/esm/helpers/zarr-helper.js +19 -5
- package/dist/esm/index.js +4 -5
- 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/useNCBIData.js +28 -0
- package/dist/esm/utils/usePlotVisibility.js +14 -0
- package/dist/esm/utils/zarrData.js +48 -0
- package/dist/esm/{components/plot/Plot.js → views/ObservationFeature/EmbeddedPlot.js} +37 -33
- package/dist/esm/{components/full-page/FullPage.js → views/ObservationFeature/StandardView.js} +35 -44
- package/dist/esm/views/ObservationFeature/index.js +6 -0
- package/dist/esm/views/PerturbationMap/EmbeddedPlot.js +50 -0
- package/dist/esm/views/PerturbationMap/ObsExplorer.js +292 -0
- package/dist/esm/{apps/perturbgen/PerturbGen.js → views/PerturbationMap/StandardView.js} +15 -23
- package/dist/esm/views/PerturbationMap/index.js +6 -0
- package/package.json +8 -4
- package/scss/cherita.scss +1 -1
- 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/apps/perturbgen/ObsExplorer.js +0 -153
- package/dist/esm/apps/perturbgen/ObsExplorer.js +0 -147
- /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,6 +48,10 @@ 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)();
|
|
51
|
+
const {
|
|
52
|
+
showCategoriesBtn,
|
|
53
|
+
showSearchBtn
|
|
54
|
+
} = (0, _usePlotVisibility.default)(isFullscreen);
|
|
52
55
|
const params = (0, _react.useMemo)(() => {
|
|
53
56
|
var _selectedObs$omit;
|
|
54
57
|
return {
|
|
@@ -125,19 +128,21 @@ function Dotplot(_ref) {
|
|
|
125
128
|
});
|
|
126
129
|
});
|
|
127
130
|
}, [settings.controls.colorAxis.cmin, settings.controls.colorAxis.cmax]);
|
|
128
|
-
const
|
|
129
|
-
onClick: setShowObs
|
|
130
|
-
}), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
|
|
131
|
-
onClick: setShowVars
|
|
132
|
-
}), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
|
|
131
|
+
const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
|
|
133
132
|
onClick: setShowControls
|
|
134
|
-
})]);
|
|
135
|
-
const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
|
|
133
|
+
}), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
|
|
136
134
|
if (!serverError) {
|
|
137
135
|
if (hasSelections) {
|
|
138
136
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
139
137
|
className: "cherita-plot cherita-dotplot position-relative",
|
|
140
|
-
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, {
|
|
141
146
|
data: data,
|
|
142
147
|
layout: layout,
|
|
143
148
|
useResizeHandler: true,
|
|
@@ -159,15 +164,15 @@ function Dotplot(_ref) {
|
|
|
159
164
|
setPlotType: setPlotType,
|
|
160
165
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
|
|
161
166
|
className: "p-0 m-0",
|
|
162
|
-
children: ["Select one or more", ' ',
|
|
167
|
+
children: ["Select one or more", ' ', showSearchBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
163
168
|
variant: "link",
|
|
164
169
|
className: "border-0 p-0 align-baseline",
|
|
165
|
-
onClick:
|
|
170
|
+
onClick: setShowSearch,
|
|
166
171
|
children: "features"
|
|
167
|
-
}) : '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, {
|
|
168
173
|
variant: "link",
|
|
169
174
|
className: "border-0 p-0 align-baseline",
|
|
170
|
-
onClick:
|
|
175
|
+
onClick: setShowCategories,
|
|
171
176
|
children: "category"
|
|
172
177
|
}) : 'category', ' ', "to group observations in the dotplot."]
|
|
173
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,6 +47,10 @@ 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)();
|
|
50
|
+
const {
|
|
51
|
+
showCategoriesBtn,
|
|
52
|
+
showSearchBtn
|
|
53
|
+
} = (0, _usePlotVisibility.default)(isFullscreen);
|
|
51
54
|
const params = (0, _react.useMemo)(() => {
|
|
52
55
|
var _selectedObs$omit;
|
|
53
56
|
return {
|
|
@@ -99,19 +102,21 @@ function Heatmap(_ref) {
|
|
|
99
102
|
colorscale.current = settings.controls.colorScale;
|
|
100
103
|
updateColorscale(colorscale.current);
|
|
101
104
|
}, [settings.controls.colorScale, updateColorscale]);
|
|
102
|
-
const
|
|
103
|
-
onClick: setShowObs
|
|
104
|
-
}), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
|
|
105
|
-
onClick: setShowVars
|
|
106
|
-
}), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
|
|
105
|
+
const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
|
|
107
106
|
onClick: setShowControls
|
|
108
|
-
})]);
|
|
109
|
-
const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
|
|
107
|
+
}), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
|
|
110
108
|
if (!serverError) {
|
|
111
109
|
if (hasSelections) {
|
|
112
110
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
113
111
|
className: "cherita-plot cherita-heatmap position-relative",
|
|
114
|
-
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, {
|
|
115
120
|
data: data,
|
|
116
121
|
layout: layout,
|
|
117
122
|
useResizeHandler: true,
|
|
@@ -133,15 +138,15 @@ function Heatmap(_ref) {
|
|
|
133
138
|
setPlotType: setPlotType,
|
|
134
139
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
|
|
135
140
|
className: "p-0 m-0",
|
|
136
|
-
children: ["Select one or more", ' ',
|
|
141
|
+
children: ["Select one or more", ' ', showSearchBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
137
142
|
variant: "link",
|
|
138
143
|
className: "border-0 p-0 align-baseline",
|
|
139
|
-
onClick:
|
|
144
|
+
onClick: setShowSearch,
|
|
140
145
|
children: "features"
|
|
141
|
-
}) : 'features', ' ', "to display their expression, then choose a", ' ',
|
|
146
|
+
}) : 'features', ' ', "to display their expression, then choose a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
142
147
|
variant: "link",
|
|
143
148
|
className: "border-0 p-0 align-baseline",
|
|
144
|
-
onClick:
|
|
149
|
+
onClick: setShowCategories,
|
|
145
150
|
children: "category"
|
|
146
151
|
}) : 'category', ' ', "to group observations in the heatmap."]
|
|
147
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,6 +47,10 @@ 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)();
|
|
50
|
+
const {
|
|
51
|
+
showCategoriesBtn,
|
|
52
|
+
showSearchBtn
|
|
53
|
+
} = (0, _usePlotVisibility.default)(isFullscreen);
|
|
51
54
|
const params = (0, _react.useMemo)(() => {
|
|
52
55
|
var _selectedObs$omit;
|
|
53
56
|
return {
|
|
@@ -100,19 +103,21 @@ function Matrixplot(_ref) {
|
|
|
100
103
|
colorscale.current = settings.controls.colorScale;
|
|
101
104
|
updateColorscale(colorscale.current);
|
|
102
105
|
}, [settings.controls.colorScale, updateColorscale]);
|
|
103
|
-
const
|
|
104
|
-
onClick: setShowObs
|
|
105
|
-
}), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
|
|
106
|
-
onClick: setShowVars
|
|
107
|
-
}), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
|
|
106
|
+
const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
|
|
108
107
|
onClick: setShowControls
|
|
109
|
-
})]);
|
|
110
|
-
const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
|
|
108
|
+
}), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
|
|
111
109
|
if (!serverError) {
|
|
112
110
|
if (hasSelections) {
|
|
113
111
|
return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
114
112
|
className: "cherita-plot cherita-matrixplot position-relative",
|
|
115
|
-
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, {
|
|
116
121
|
data: data,
|
|
117
122
|
layout: layout,
|
|
118
123
|
useResizeHandler: true,
|
|
@@ -134,15 +139,15 @@ function Matrixplot(_ref) {
|
|
|
134
139
|
setPlotType: setPlotType,
|
|
135
140
|
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
|
|
136
141
|
className: "p-0 m-0",
|
|
137
|
-
children: ["Select a", ' ',
|
|
142
|
+
children: ["Select a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
|
|
138
143
|
variant: "link",
|
|
139
144
|
className: "border-0 p-0 align-baseline",
|
|
140
|
-
onClick:
|
|
145
|
+
onClick: setShowCategories,
|
|
141
146
|
children: "category"
|
|
142
|
-
}) : '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, {
|
|
143
148
|
variant: "link",
|
|
144
149
|
className: "border-0 p-0 align-baseline",
|
|
145
|
-
onClick:
|
|
150
|
+
onClick: setShowSearch,
|
|
146
151
|
children: "features"
|
|
147
152
|
}) : 'features', ' ', "to display the matrix plot."]
|
|
148
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 {
|
|
@@ -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,34 @@ 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: "Gene Perturbations"
|
|
132
|
+
})
|
|
133
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Body, {
|
|
134
|
+
className: "p-1",
|
|
135
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
136
|
+
className: "sidebar-features",
|
|
137
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchBar.SearchBar, {
|
|
138
|
+
searchDiseases: false,
|
|
139
|
+
searchVar: false,
|
|
140
|
+
searchObs: true
|
|
141
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
142
|
+
className: "sidebar-features-list",
|
|
143
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsExplorer.ObsExplorer, _objectSpread({}, props))
|
|
144
|
+
})]
|
|
145
|
+
})
|
|
146
|
+
})]
|
|
147
|
+
});
|
|
115
148
|
}
|
|
@@ -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]
|
|
@@ -27,8 +27,9 @@ var _Legend = require("../../utils/Legend");
|
|
|
27
27
|
var _LoadingIndicators = require("../../utils/LoadingIndicators");
|
|
28
28
|
var _Resolver = require("../../utils/Resolver");
|
|
29
29
|
var _string = require("../../utils/string");
|
|
30
|
+
var _usePlotVisibility = _interopRequireDefault(require("../../utils/usePlotVisibility"));
|
|
30
31
|
var _zarrData = require("../../utils/zarrData");
|
|
31
|
-
var _PlotAlert = require("../
|
|
32
|
+
var _PlotAlert = require("../plot/PlotAlert");
|
|
32
33
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
33
34
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
34
35
|
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; }
|
|
@@ -45,16 +46,24 @@ const INITIAL_VIEW_STATE = {
|
|
|
45
46
|
pitch: 0,
|
|
46
47
|
bearing: 0
|
|
47
48
|
};
|
|
49
|
+
const getRadiusScale = bounds => {
|
|
50
|
+
// From 28 degrees ~= 30km -> 30m radius
|
|
51
|
+
const lonDim = bounds[1][0] - bounds[0][0];
|
|
52
|
+
const latDim = bounds[1][1] - bounds[0][1];
|
|
53
|
+
const minDim = Math.min(lonDim, latDim);
|
|
54
|
+
const rs = 0.01 / minDim * 111111;
|
|
55
|
+
return rs;
|
|
56
|
+
};
|
|
48
57
|
function Scatterplot(_ref) {
|
|
49
58
|
var _features$features2, _obsmData$serverError, _labelObsData$serverE, _settings$selectedVar, _data$positions2;
|
|
50
59
|
let {
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
setShowVars,
|
|
60
|
+
setShowCategories,
|
|
61
|
+
setShowSearch,
|
|
54
62
|
plotType,
|
|
55
63
|
setPlotType,
|
|
56
64
|
isFullscreen = false,
|
|
57
|
-
pointInteractionEnabled = false
|
|
65
|
+
pointInteractionEnabled = false,
|
|
66
|
+
showSpatialControls = true
|
|
58
67
|
} = _ref;
|
|
59
68
|
const {
|
|
60
69
|
useUnsColors
|
|
@@ -71,9 +80,9 @@ function Scatterplot(_ref) {
|
|
|
71
80
|
getColor
|
|
72
81
|
} = (0, _colorHelper.useColor)();
|
|
73
82
|
const deckRef = (0, _react.useRef)(null);
|
|
83
|
+
const [viewport, setViewport] = (0, _react.useState)(null);
|
|
74
84
|
const [viewState, setViewState] = (0, _react.useState)(INITIAL_VIEW_STATE);
|
|
75
85
|
const [isRendering, setIsRendering] = (0, _react.useState)(true);
|
|
76
|
-
const [radiusScale, setRadiusScale] = (0, _react.useState)(radius || 1);
|
|
77
86
|
const [isPending, setIsPending] = (0, _react.useState)(false);
|
|
78
87
|
const [data, setData] = (0, _react.useState)({
|
|
79
88
|
positions: [],
|
|
@@ -82,10 +91,14 @@ function Scatterplot(_ref) {
|
|
|
82
91
|
const [coordsError, setCoordsError] = (0, _react.useState)(null);
|
|
83
92
|
const [hasObsm, setHasObsm] = (0, _react.useState)(true);
|
|
84
93
|
const [dataError, setDataError] = (0, _react.useState)(null);
|
|
94
|
+
const radiusScale = settings.controls.radiusScale[settings.selectedObsm] || 1;
|
|
85
95
|
const selectedObs = (0, _Resolver.useSelectedObs)();
|
|
86
96
|
const selectedObsIndex = settings.selectedObsIndex;
|
|
87
97
|
const [hoveredIndex, setHoveredIndex] = (0, _react.useState)(null);
|
|
88
98
|
const [isHoveringPoint, setIsHoveringPoint] = (0, _react.useState)(false);
|
|
99
|
+
const {
|
|
100
|
+
showSearchBtn
|
|
101
|
+
} = (0, _usePlotVisibility.default)(isFullscreen);
|
|
89
102
|
|
|
90
103
|
// EditableGeoJsonLayer
|
|
91
104
|
const [mode, setMode] = (0, _react.useState)(() => _editModes.ViewMode);
|
|
@@ -104,15 +117,6 @@ function Scatterplot(_ref) {
|
|
|
104
117
|
|
|
105
118
|
// @TODO: assert length of obsmData, xData, obsData is equal
|
|
106
119
|
|
|
107
|
-
const getRadiusScale = (0, _react.useCallback)(bounds => {
|
|
108
|
-
if (!!radius) return radius;
|
|
109
|
-
// From 28 degrees ~= 30km -> 30m radius
|
|
110
|
-
const lonDim = bounds[1][0] - bounds[0][0];
|
|
111
|
-
const latDim = bounds[1][1] - bounds[0][1];
|
|
112
|
-
const minDim = Math.min(lonDim, latDim);
|
|
113
|
-
const rs = 0.01 / minDim * 111111;
|
|
114
|
-
return rs;
|
|
115
|
-
}, [radius]);
|
|
116
120
|
(0, _react.useEffect)(() => {
|
|
117
121
|
if (obsmData.isPending || settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR && xData.isPending || settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && obsData.isPending) {
|
|
118
122
|
setIsPending(true);
|
|
@@ -159,7 +163,7 @@ function Scatterplot(_ref) {
|
|
|
159
163
|
}
|
|
160
164
|
}, [obsData.data, obsData.isPending, obsData.serverError, obsmData.data, obsmData.isPending, obsmData.serverError, settings.colorEncoding, xData.data, xData.isPending, xData.serverError]);
|
|
161
165
|
(0, _react.useEffect)(() => {
|
|
162
|
-
if (data.positions &&
|
|
166
|
+
if (data.positions && data.positions.length) {
|
|
163
167
|
var _deckRef$current, _deckRef$current2;
|
|
164
168
|
const mapHelper = new _mapHelper.MapHelper();
|
|
165
169
|
const {
|
|
@@ -171,16 +175,28 @@ function Scatterplot(_ref) {
|
|
|
171
175
|
width: deckRef === null || deckRef === void 0 || (_deckRef$current = deckRef.current) === null || _deckRef$current === void 0 || (_deckRef$current = _deckRef$current.deck) === null || _deckRef$current === void 0 ? void 0 : _deckRef$current.width,
|
|
172
176
|
height: deckRef === null || deckRef === void 0 || (_deckRef$current2 = deckRef.current) === null || _deckRef$current2 === void 0 || (_deckRef$current2 = _deckRef$current2.deck) === null || _deckRef$current2 === void 0 ? void 0 : _deckRef$current2.height
|
|
173
177
|
});
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
178
|
+
setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
|
|
179
|
+
latitude,
|
|
180
|
+
longitude,
|
|
181
|
+
zoom
|
|
182
|
+
}));
|
|
183
|
+
setViewport({
|
|
184
|
+
latitude,
|
|
185
|
+
longitude,
|
|
186
|
+
zoom,
|
|
187
|
+
bounds
|
|
188
|
+
});
|
|
189
|
+
}
|
|
190
|
+
}, [data.positions]);
|
|
191
|
+
(0, _react.useEffect)(() => {
|
|
192
|
+
if (viewport !== null && viewport !== void 0 && viewport.bounds && !settings.controls.radiusScale[settings.selectedObsm]) {
|
|
193
|
+
dispatch({
|
|
194
|
+
type: 'set.controls.radiusScale',
|
|
195
|
+
obsm: settings.selectedObsm,
|
|
196
|
+
radiusScale: getRadiusScale(viewport.bounds)
|
|
181
197
|
});
|
|
182
198
|
}
|
|
183
|
-
}, [
|
|
199
|
+
}, [dispatch, settings.controls.radiusScale, settings.selectedObsm, viewport === null || viewport === void 0 ? void 0 : viewport.bounds]);
|
|
184
200
|
(0, _react.useEffect)(() => {
|
|
185
201
|
var _data$positions;
|
|
186
202
|
if (!pointInteractionEnabled) return;
|
|
@@ -295,19 +311,19 @@ function Scatterplot(_ref) {
|
|
|
295
311
|
}, useUnsColors && settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && selectedObs !== null && selectedObs !== void 0 && selectedObs.colors ? {
|
|
296
312
|
colorscale: selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors
|
|
297
313
|
} : {})) || [0, 0, 0, 100];
|
|
298
|
-
}, [isPending, sortedObsIndices, getColor, sortedData.values, min, max, isCategorical, useUnsColors, settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors
|
|
314
|
+
}, [isPending, sortedObsIndices, pointInteractionEnabled, getOriginalIndex, selectedObsIndex, getColor, sortedData.values, min, max, isCategorical, useUnsColors, settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors]);
|
|
299
315
|
|
|
300
316
|
// @TODO: add support for pseudospatial hover to reflect in radius
|
|
301
|
-
const getRadius = (_d, _ref3) => {
|
|
317
|
+
const getRadius = (0, _react.useCallback)((_d, _ref3) => {
|
|
302
318
|
let {
|
|
303
319
|
index
|
|
304
320
|
} = _ref3;
|
|
305
321
|
const grayOut = sortedObsIndices && !sortedObsIndices.has(index);
|
|
306
322
|
if (pointInteractionEnabled && getOriginalIndex(index) === selectedObsIndex) {
|
|
307
|
-
return
|
|
323
|
+
return 50;
|
|
308
324
|
}
|
|
309
|
-
return grayOut ? 1 :
|
|
310
|
-
};
|
|
325
|
+
return (grayOut ? 1 : 3) * (pointInteractionEnabled ? 26 : 1);
|
|
326
|
+
}, [getOriginalIndex, pointInteractionEnabled, selectedObsIndex, sortedObsIndices]);
|
|
311
327
|
const memoizedLayers = (0, _react.useMemo)(() => {
|
|
312
328
|
return [new _layers.ScatterplotLayer({
|
|
313
329
|
id: 'cherita-layer-scatterplot',
|
|
@@ -399,12 +415,20 @@ function Scatterplot(_ref) {
|
|
|
399
415
|
type: 'set.selectedObsIndex',
|
|
400
416
|
index: originalIndex
|
|
401
417
|
});
|
|
418
|
+
// in collapsed view, open offcanvas
|
|
419
|
+
if (pointInteractionEnabled && showSearchBtn) {
|
|
420
|
+
setShowSearch(true);
|
|
421
|
+
}
|
|
402
422
|
}
|
|
403
423
|
}
|
|
404
424
|
const getLabel = function (o, v) {
|
|
405
425
|
let isVar = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
406
426
|
if (isVar || o.type === _constants.OBS_TYPES.CONTINUOUS) {
|
|
407
427
|
return "".concat(o.name, ": ").concat((0, _string.formatNumerical)(parseFloat(v)));
|
|
428
|
+
} else if (o.type === _constants.OBS_TYPES.DISCRETE) {
|
|
429
|
+
return "".concat(o.name, ": ").concat(v);
|
|
430
|
+
} else if (o.type === _constants.OBS_TYPES.BOOLEAN) {
|
|
431
|
+
return "".concat(o.name, ": ").concat(o.codesMap[+v]);
|
|
408
432
|
} else {
|
|
409
433
|
return "".concat(o.name, ": ").concat(o.codesMap[v]);
|
|
410
434
|
}
|
|
@@ -426,6 +450,7 @@ function Scatterplot(_ref) {
|
|
|
426
450
|
}
|
|
427
451
|
if (settings.labelObs.length) {
|
|
428
452
|
text.push(..._lodash.default.map(labelObsData.data, (v, k) => {
|
|
453
|
+
if (!v) return;
|
|
429
454
|
const labelObs = settings.data.obs[k];
|
|
430
455
|
return getLabel(labelObs, v[getOriginalIndex(index)]);
|
|
431
456
|
}));
|
|
@@ -492,7 +517,7 @@ function Scatterplot(_ref) {
|
|
|
492
517
|
return 'grab';
|
|
493
518
|
},
|
|
494
519
|
ref: deckRef
|
|
495
|
-
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_SpatialControls.SpatialControls, {
|
|
520
|
+
}), showSpatialControls && /*#__PURE__*/(0, _jsxRuntime.jsx)(_SpatialControls.SpatialControls, {
|
|
496
521
|
mode: mode,
|
|
497
522
|
setMode: setMode,
|
|
498
523
|
features: features,
|
|
@@ -505,8 +530,8 @@ function Scatterplot(_ref) {
|
|
|
505
530
|
decreaseZoom: () => setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
|
|
506
531
|
zoom: v.zoom - 1
|
|
507
532
|
})),
|
|
508
|
-
|
|
509
|
-
|
|
533
|
+
setShowCategories: setShowCategories,
|
|
534
|
+
setShowSearch: setShowSearch,
|
|
510
535
|
isFullscreen: isFullscreen
|
|
511
536
|
}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
|
|
512
537
|
className: "cherita-spatial-footer",
|