@haniffalab/cherita-react 0.2.1-dev.2025-03-06.d6a782a3 → 0.2.1-dev.2025-03-06.1e22e923
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/components/full-page/FullPage.js +14 -14
- package/dist/components/full-page/FullPagePseudospatial.js +19 -43
- package/dist/components/offcanvas/index.js +3 -2
- package/dist/components/pseudospatial/Pseudospatial.js +9 -4
- package/dist/components/pseudospatial/PseudospatialToolbar.js +0 -17
- package/package.json +2 -2
- package/dist/components/pseudospatial/PseudospatialControls.js +0 -11
|
@@ -28,41 +28,41 @@ function FullPage({
|
|
|
28
28
|
varMode = _constants.SELECTION_MODES.SINGLE,
|
|
29
29
|
...props
|
|
30
30
|
}) {
|
|
31
|
-
const
|
|
31
|
+
const appRef = (0, _react.useRef)();
|
|
32
|
+
const [appDimensions, setAppDimensions] = (0, _react.useState)({
|
|
33
|
+
width: 0,
|
|
34
|
+
height: 0
|
|
35
|
+
});
|
|
32
36
|
const [showObs, setShowObs] = (0, _react.useState)(false);
|
|
33
37
|
const [showObsm, setShowObsm] = (0, _react.useState)(false);
|
|
34
38
|
const [showVars, setShowVars] = (0, _react.useState)(false);
|
|
35
39
|
const [showControls, setShowControls] = (0, _react.useState)(false);
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
});
|
|
40
|
-
(0, _react.useLayoutEffect)(() => {
|
|
41
|
-
function updateDimensions() {
|
|
42
|
-
if (targetRef.current) {
|
|
40
|
+
(0, _react.useEffect)(() => {
|
|
41
|
+
const updateDimensions = () => {
|
|
42
|
+
if (appRef.current) {
|
|
43
43
|
// Get the distance from the top of the page to the target element
|
|
44
|
-
const rect =
|
|
44
|
+
const rect = appRef.current.getBoundingClientRect();
|
|
45
45
|
const distanceFromTop = rect.top + window.scrollY;
|
|
46
46
|
|
|
47
47
|
// Calculate the available height for the Cherita app
|
|
48
48
|
const availableHeight = window.innerHeight - distanceFromTop;
|
|
49
49
|
|
|
50
50
|
// Update the dimensions to fit the viewport minus the navbar height
|
|
51
|
-
|
|
52
|
-
width:
|
|
51
|
+
setAppDimensions({
|
|
52
|
+
width: appRef.current.offsetWidth,
|
|
53
53
|
height: availableHeight
|
|
54
54
|
});
|
|
55
55
|
}
|
|
56
|
-
}
|
|
56
|
+
};
|
|
57
57
|
window.addEventListener("resize", updateDimensions);
|
|
58
58
|
updateDimensions(); // Initial update
|
|
59
59
|
return () => window.removeEventListener("resize", updateDimensions);
|
|
60
60
|
}, []);
|
|
61
61
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
62
|
-
ref:
|
|
62
|
+
ref: appRef,
|
|
63
63
|
className: "cherita-app",
|
|
64
64
|
style: {
|
|
65
|
-
height:
|
|
65
|
+
height: appDimensions.height
|
|
66
66
|
}
|
|
67
67
|
}, /*#__PURE__*/_react.default.createElement(_DatasetContext.DatasetProvider, props, /*#__PURE__*/_react.default.createElement("div", {
|
|
68
68
|
className: "row g-0"
|
|
@@ -37,8 +37,9 @@ function FullPage({
|
|
|
37
37
|
const [showControls, setShowControls] = (0, _react.useState)(false);
|
|
38
38
|
const [showPseudospatialControls, setShowPseudospatialControls] = (0, _react.useState)(false);
|
|
39
39
|
const [showModal, setShowModal] = (0, _react.useState)(false);
|
|
40
|
-
(0, _react.
|
|
41
|
-
|
|
40
|
+
const [pseudospatialPlotType, setpseudospatialPlotType] = (0, _react.useState)(null);
|
|
41
|
+
(0, _react.useEffect)(() => {
|
|
42
|
+
const updateDimensions = () => {
|
|
42
43
|
if (appRef.current) {
|
|
43
44
|
// Get the distance from the top of the page to the target element
|
|
44
45
|
const rect = appRef.current.getBoundingClientRect();
|
|
@@ -53,29 +54,11 @@ function FullPage({
|
|
|
53
54
|
height: availableHeight
|
|
54
55
|
});
|
|
55
56
|
}
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
// Initial calculation
|
|
59
|
-
updateDimensions();
|
|
60
|
-
|
|
61
|
-
// Event listener for resize
|
|
62
|
-
window.addEventListener("resize", updateDimensions);
|
|
63
|
-
|
|
64
|
-
// Handle dimension recalculation when accordion expands/collapses
|
|
65
|
-
const accordionItems = document.querySelectorAll(".accordion-item");
|
|
66
|
-
accordionItems.forEach(item => {
|
|
67
|
-
item.addEventListener("transitionend", updateDimensions);
|
|
68
|
-
});
|
|
69
|
-
|
|
70
|
-
// Clean up event listeners
|
|
71
|
-
return () => {
|
|
72
|
-
window.removeEventListener("resize", updateDimensions);
|
|
73
|
-
accordionItems.forEach(item => {
|
|
74
|
-
item.removeEventListener("transitionend", updateDimensions);
|
|
75
|
-
});
|
|
76
57
|
};
|
|
77
|
-
|
|
78
|
-
|
|
58
|
+
window.addEventListener("resize", updateDimensions);
|
|
59
|
+
updateDimensions(); // Initial update
|
|
60
|
+
return () => window.removeEventListener("resize", updateDimensions);
|
|
61
|
+
}, []);
|
|
79
62
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
80
63
|
ref: appRef,
|
|
81
64
|
className: "cherita-app",
|
|
@@ -123,29 +106,16 @@ function FullPage({
|
|
|
123
106
|
variant: "link",
|
|
124
107
|
onClick: () => setShowModal(true)
|
|
125
108
|
}, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
|
|
126
|
-
icon: _freeSolidSvgIcons.
|
|
127
|
-
})), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
|
|
128
|
-
variant: "link",
|
|
129
|
-
onClick: () => setShowModal(true)
|
|
130
|
-
}, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
|
|
131
|
-
icon: _freeSolidSvgIcons.faChartLine
|
|
132
|
-
})), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
|
|
133
|
-
variant: "link",
|
|
134
|
-
onClick: () => setShowModal(true)
|
|
135
|
-
}, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
|
|
136
|
-
icon: _freeSolidSvgIcons.faChartPie
|
|
137
|
-
})), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
|
|
138
|
-
variant: "link",
|
|
139
|
-
onClick: () => setShowModal(true)
|
|
140
|
-
}, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
|
|
141
|
-
icon: _freeSolidSvgIcons.faChartArea
|
|
109
|
+
icon: _freeSolidSvgIcons.faArrowUpRightFromSquare
|
|
142
110
|
}))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card.Body, {
|
|
143
111
|
className: "d-flex flex-column p-0"
|
|
144
112
|
}, /*#__PURE__*/_react.default.createElement("div", {
|
|
145
113
|
className: "sidebar-pseudospatial"
|
|
146
114
|
}, /*#__PURE__*/_react.default.createElement(_Pseudospatial.Pseudospatial, {
|
|
147
115
|
className: "sidebar-pseudospatial",
|
|
148
|
-
|
|
116
|
+
plotType: pseudospatialPlotType,
|
|
117
|
+
setPlotType: setpseudospatialPlotType,
|
|
118
|
+
setShowControls: setShowPseudospatialControls
|
|
149
119
|
})), /*#__PURE__*/_react.default.createElement("div", {
|
|
150
120
|
className: "sidebar-features modern-scrollbars"
|
|
151
121
|
}, /*#__PURE__*/_react.default.createElement(_SearchBar.SearchBar, {
|
|
@@ -159,7 +129,12 @@ function FullPage({
|
|
|
159
129
|
centered: true
|
|
160
130
|
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Header, {
|
|
161
131
|
closeButton: true
|
|
162
|
-
}
|
|
132
|
+
}), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Body, null, /*#__PURE__*/_react.default.createElement(_Pseudospatial.Pseudospatial, {
|
|
133
|
+
plotType: pseudospatialPlotType,
|
|
134
|
+
setPlotType: setpseudospatialPlotType,
|
|
135
|
+
setShowControls: setShowPseudospatialControls,
|
|
136
|
+
height: 500
|
|
137
|
+
}))), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObs, {
|
|
163
138
|
show: showObs,
|
|
164
139
|
handleClose: () => setShowObs(false)
|
|
165
140
|
}), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasVars, {
|
|
@@ -172,7 +147,8 @@ function FullPage({
|
|
|
172
147
|
}), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
|
|
173
148
|
show: showPseudospatialControls,
|
|
174
149
|
handleClose: () => setShowPseudospatialControls(false),
|
|
175
|
-
Controls: _PseudospatialToolbar.PseudospatialToolbar
|
|
150
|
+
Controls: _PseudospatialToolbar.PseudospatialToolbar,
|
|
151
|
+
plotType: pseudospatialPlotType
|
|
176
152
|
}), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObsm, {
|
|
177
153
|
show: showObsm,
|
|
178
154
|
handleClose: () => setShowObsm(false)
|
|
@@ -61,12 +61,13 @@ function OffcanvasVars({
|
|
|
61
61
|
function OffcanvasControls({
|
|
62
62
|
show,
|
|
63
63
|
handleClose,
|
|
64
|
-
Controls
|
|
64
|
+
Controls,
|
|
65
|
+
...props
|
|
65
66
|
}) {
|
|
66
67
|
return /*#__PURE__*/_react.default.createElement(_Offcanvas.default, {
|
|
67
68
|
show: show,
|
|
68
69
|
onHide: handleClose
|
|
69
70
|
}, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Header, {
|
|
70
71
|
closeButton: true
|
|
71
|
-
}, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Title, null, "Controls")), /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Body, null, /*#__PURE__*/_react.default.createElement(Controls,
|
|
72
|
+
}, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Title, null, "Controls")), /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Body, null, /*#__PURE__*/_react.default.createElement(Controls, props)));
|
|
72
73
|
}
|
|
@@ -79,7 +79,10 @@ function usePseudospatialData(plotType) {
|
|
|
79
79
|
function Pseudospatial({
|
|
80
80
|
showLegend = true,
|
|
81
81
|
sharedScaleRange = false,
|
|
82
|
-
|
|
82
|
+
height = 200,
|
|
83
|
+
setShowControls,
|
|
84
|
+
plotType,
|
|
85
|
+
setPlotType
|
|
83
86
|
}) {
|
|
84
87
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
85
88
|
const [data, setData] = (0, _react.useState)([]);
|
|
@@ -88,7 +91,9 @@ function Pseudospatial({
|
|
|
88
91
|
getColor
|
|
89
92
|
} = (0, _colorHelper.useColor)();
|
|
90
93
|
const colorscale = (0, _react.useRef)(dataset.controls.colorScale);
|
|
91
|
-
|
|
94
|
+
(0, _react.useEffect)(() => {
|
|
95
|
+
setPlotType(dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE : dataset.selectedObs?.type === _constants.OBS_TYPES.CATEGORICAL || dataset.selectedObs?.type === _constants.OBS_TYPES.BOOLEAN ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL : dataset.selectedObs?.type === _constants.OBS_TYPES.CONTINUOUS ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS : _constants.PSEUDOSPATIAL_PLOT_TYPES.MASKS);
|
|
96
|
+
}, [dataset.colorEncoding, dataset.selectedObs?.type, setPlotType]);
|
|
92
97
|
const updateColorscale = (0, _react.useCallback)(colorscale => {
|
|
93
98
|
setLayout(l => {
|
|
94
99
|
return {
|
|
@@ -187,7 +192,7 @@ function Pseudospatial({
|
|
|
187
192
|
layout: {
|
|
188
193
|
...layout,
|
|
189
194
|
autosize: true,
|
|
190
|
-
height:
|
|
195
|
+
height: height
|
|
191
196
|
},
|
|
192
197
|
useResizeHandler: true,
|
|
193
198
|
className: "cherita-pseudospatial-plot",
|
|
@@ -203,7 +208,7 @@ function Pseudospatial({
|
|
|
203
208
|
ascent: 512,
|
|
204
209
|
descent: 0
|
|
205
210
|
},
|
|
206
|
-
click: () =>
|
|
211
|
+
click: () => setShowControls(prev => !prev)
|
|
207
212
|
}]
|
|
208
213
|
}
|
|
209
214
|
}), hasSelections && showLegend && /*#__PURE__*/_react.default.createElement(_Legend.Legend, {
|
|
@@ -4,7 +4,6 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
6
|
exports.PseudospatialToolbar = PseudospatialToolbar;
|
|
7
|
-
exports.PseudospatialToolbarLite = PseudospatialToolbarLite;
|
|
8
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
9
8
|
var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
|
|
10
9
|
var _reactFontawesome = require("@fortawesome/react-fontawesome");
|
|
@@ -129,20 +128,4 @@ function PseudospatialToolbar({
|
|
|
129
128
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
130
129
|
className: "cherita-pseudospatial-toolbar"
|
|
131
130
|
}, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(MaskSet, null)), /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL && /*#__PURE__*/_react.default.createElement(CategoricalMode, null)));
|
|
132
|
-
}
|
|
133
|
-
|
|
134
|
-
// @TODO: add colormap, colorbar slider
|
|
135
|
-
function PseudospatialToolbarLite({
|
|
136
|
-
plotType
|
|
137
|
-
}) {
|
|
138
|
-
return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Toggle, {
|
|
139
|
-
variant: "success",
|
|
140
|
-
id: "dropdown-basic"
|
|
141
|
-
}, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
|
|
142
|
-
icon: _freeSolidSvgIcons.faChevronDown
|
|
143
|
-
})), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Menu, null, /*#__PURE__*/_react.default.createElement(MaskSet, null), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Item, {
|
|
144
|
-
href: "#/action-2"
|
|
145
|
-
}, "Another action"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Item, {
|
|
146
|
-
href: "#/action-3"
|
|
147
|
-
}, "Something else")));
|
|
148
131
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haniffalab/cherita-react",
|
|
3
|
-
"version": "0.2.1-dev.2025-03-06.
|
|
3
|
+
"version": "0.2.1-dev.2025-03-06.1e22e923",
|
|
4
4
|
"author": "",
|
|
5
5
|
"license": "",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -107,5 +107,5 @@
|
|
|
107
107
|
"url": "https://github.com/haniffalab/cherita-react/issues"
|
|
108
108
|
},
|
|
109
109
|
"homepage": "https://github.com/haniffalab/cherita-react#readme",
|
|
110
|
-
"prereleaseSha": "
|
|
110
|
+
"prereleaseSha": "1e22e923e02495d8b82a6974f7454520bd88fd31"
|
|
111
111
|
}
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
Object.defineProperty(exports, "__esModule", {
|
|
4
|
-
value: true
|
|
5
|
-
});
|
|
6
|
-
exports.PseudospatialControls = PseudospatialControls;
|
|
7
|
-
var _react = _interopRequireDefault(require("react"));
|
|
8
|
-
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
9
|
-
function PseudospatialControls() {
|
|
10
|
-
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
|
|
11
|
-
}
|