@haniffalab/cherita-react 0.2.1-dev.2025-03-06.d6a782a3 → 0.2.1-dev.2025-03-06.b4baf3a1

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.
@@ -28,41 +28,41 @@ function FullPage({
28
28
  varMode = _constants.SELECTION_MODES.SINGLE,
29
29
  ...props
30
30
  }) {
31
- const targetRef = (0, _react.useRef)();
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
- const [dimensions, setDimensions] = (0, _react.useState)({
37
- width: 0,
38
- height: 0
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 = targetRef.current.getBoundingClientRect();
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
- setDimensions({
52
- width: targetRef.current.offsetWidth,
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: targetRef,
62
+ ref: appRef,
63
63
  className: "cherita-app",
64
64
  style: {
65
- height: dimensions.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.useLayoutEffect)(() => {
41
- function updateDimensions() {
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
- }, []); // Dependency array to run only on mount/unmount
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.faChartSimple
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
- setShowPseudospatialControls: setShowPseudospatialControls
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
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Title, null, "My Modal")), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Body, null, /*#__PURE__*/_react.default.createElement(_Pseudospatial.Pseudospatial, null))), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObs, {
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, null)));
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
- setShowPseudospatialControls
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
- const plotType = 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;
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: "200"
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: () => setShowPseudospatialControls(prev => !prev)
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.d6a782a3",
3
+ "version": "0.2.1-dev.2025-03-06.b4baf3a1",
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": "d6a782a3798d41af33364f925ba2669d99f6fe3a"
110
+ "prereleaseSha": "b4baf3a1ea64f986ea5205c4ad0755a0ff933a4c"
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
- }