@haniffalab/cherita-react 0.2.1-dev.2025-02-07.85514aee → 0.2.1-dev.2025-02-19.e6d8aac6

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.
@@ -5,7 +5,6 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.FullPage = FullPage;
7
7
  exports.FullPagePlots = FullPagePlots;
8
- exports.FullPagePseudospatial = FullPagePseudospatial;
9
8
  exports.FullPageScatterplot = FullPageScatterplot;
10
9
  var _react = _interopRequireWildcard(require("react"));
11
10
  var _reactBootstrap = require("react-bootstrap");
@@ -16,7 +15,6 @@ var _Heatmap = require("../heatmap/Heatmap");
16
15
  var _Matrixplot = require("../matrixplot/Matrixplot");
17
16
  var _ObsList = require("../obs-list/ObsList");
18
17
  var _offcanvas = require("../offcanvas");
19
- var _Pseudospatial = require("../pseudospatial/Pseudospatial");
20
18
  var _Scatterplot = require("../scatterplot/Scatterplot");
21
19
  var _ScatterplotControls = require("../scatterplot/ScatterplotControls");
22
20
  var _SearchBar = require("../search-bar/SearchBar");
@@ -126,27 +124,6 @@ function FullPage({
126
124
  function FullPageScatterplot(props) {
127
125
  return /*#__PURE__*/_react.default.createElement(FullPage, props, /*#__PURE__*/_react.default.createElement(_Scatterplot.Scatterplot, null));
128
126
  }
129
- function FullPagePseudospatial(props) {
130
- return /*#__PURE__*/_react.default.createElement(FullPage, props, /*#__PURE__*/_react.default.createElement("div", {
131
- className: "container-fluid h-100"
132
- }, /*#__PURE__*/_react.default.createElement("div", {
133
- className: "row"
134
- }, /*#__PURE__*/_react.default.createElement("div", {
135
- className: "col-12 col-lg-7"
136
- }, /*#__PURE__*/_react.default.createElement(_Scatterplot.Scatterplot, null)), /*#__PURE__*/_react.default.createElement("div", {
137
- className: "col-12 col-lg-5"
138
- }, /*#__PURE__*/_react.default.createElement("div", {
139
- className: "container-fluid h-100 d-flex align-itemms-center justify-content-center"
140
- }, /*#__PURE__*/_react.default.createElement("div", {
141
- className: "row w-100 py-3"
142
- }, /*#__PURE__*/_react.default.createElement("div", {
143
- className: "col-12"
144
- }, /*#__PURE__*/_react.default.createElement("div", {
145
- className: "p-2"
146
- }, /*#__PURE__*/_react.default.createElement(_Pseudospatial.Pseudospatial, null))), /*#__PURE__*/_react.default.createElement("div", {
147
- className: "col-12"
148
- }, /*#__PURE__*/_react.default.createElement(_Pseudospatial.PseudospatialImage, null))))))));
149
- }
150
127
  function FullPagePlots(props) {
151
128
  return /*#__PURE__*/_react.default.createElement(FullPage, _extends({}, props, {
152
129
  varMode: _constants.SELECTION_MODES.MULTIPLE
@@ -0,0 +1,214 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FullPage = FullPage;
7
+ exports.FullPagePseudospatial = FullPagePseudospatial;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
10
+ var _reactFontawesome = require("@fortawesome/react-fontawesome");
11
+ var _reactBootstrap = require("react-bootstrap");
12
+ var _AccordionButton = require("react-bootstrap/AccordionButton");
13
+ var _AccordionContext = _interopRequireDefault(require("react-bootstrap/AccordionContext"));
14
+ var _ButtonGroup = _interopRequireDefault(require("react-bootstrap/ButtonGroup"));
15
+ var _constants = require("../../constants/constants");
16
+ var _DatasetContext = require("../../context/DatasetContext");
17
+ var _ObsList = require("../obs-list/ObsList");
18
+ var _offcanvas = require("../offcanvas");
19
+ var _Pseudospatial = require("../pseudospatial/Pseudospatial");
20
+ var _PseudospatialToolbar = require("../pseudospatial/PseudospatialToolbar");
21
+ var _Scatterplot = require("../scatterplot/Scatterplot");
22
+ var _ScatterplotControls = require("../scatterplot/ScatterplotControls");
23
+ var _SearchBar = require("../search-bar/SearchBar");
24
+ var _VarList = require("../var-list/VarList");
25
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
26
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
27
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
28
+ function FullPage({
29
+ children,
30
+ varMode = _constants.SELECTION_MODES.SINGLE,
31
+ ...props
32
+ }) {
33
+ const appRef = (0, _react.useRef)();
34
+ const [appDimensions, setAppDimensions] = (0, _react.useState)({
35
+ width: 0,
36
+ height: 0
37
+ });
38
+ const [showObs, setShowObs] = (0, _react.useState)(false);
39
+ const [showObsm, setShowObsm] = (0, _react.useState)(false);
40
+ const [showVars, setShowVars] = (0, _react.useState)(false);
41
+ const [showControls, setShowControls] = (0, _react.useState)(false);
42
+ const [showPseudospatialControls, setShowPseudospatialControls] = (0, _react.useState)(false);
43
+ const [showModal, setShowModal] = (0, _react.useState)(false);
44
+ (0, _react.useLayoutEffect)(() => {
45
+ function updateDimensions() {
46
+ if (appRef.current) {
47
+ // Get the distance from the top of the page to the target element
48
+ const rect = appRef.current.getBoundingClientRect();
49
+ const distanceFromTop = rect.top + window.scrollY;
50
+
51
+ // Calculate the available height for the Cherita app
52
+ const availableHeight = window.innerHeight - distanceFromTop;
53
+
54
+ // Update the dimensions to fit the viewport minus the navbar height
55
+ setAppDimensions({
56
+ width: appRef.current.offsetWidth,
57
+ height: availableHeight
58
+ });
59
+ }
60
+ }
61
+
62
+ // Initial calculation
63
+ updateDimensions();
64
+
65
+ // Event listener for resize
66
+ window.addEventListener("resize", updateDimensions);
67
+
68
+ // Handle dimension recalculation when accordion expands/collapses
69
+ const accordionItems = document.querySelectorAll(".accordion-item");
70
+ accordionItems.forEach(item => {
71
+ item.addEventListener("transitionend", updateDimensions);
72
+ });
73
+
74
+ // Clean up event listeners
75
+ return () => {
76
+ window.removeEventListener("resize", updateDimensions);
77
+ accordionItems.forEach(item => {
78
+ item.removeEventListener("transitionend", updateDimensions);
79
+ });
80
+ };
81
+ }, []); // Dependency array to run only on mount/unmount
82
+
83
+ const [open, setOpen] = (0, _react.useState)(false);
84
+ const [isCollapsed, setIsCollapsed] = (0, _react.useState)(false);
85
+ function ObsAccordionToggle({
86
+ title,
87
+ eventKey,
88
+ buttons
89
+ }) {
90
+ const {
91
+ activeEventKey
92
+ } = (0, _react.useContext)(_AccordionContext.default);
93
+ // console.log("activeEventKey:", activeEventKey);
94
+
95
+ const decoratedOnClick = (0, _AccordionButton.useAccordionButton)(eventKey, () => {
96
+ console.log("Clicked accordion:", eventKey);
97
+ });
98
+ const isCurrentEventKey = Array.isArray(activeEventKey) ? activeEventKey.includes(eventKey) : activeEventKey === eventKey;
99
+ return /*#__PURE__*/_react.default.createElement("div", {
100
+ className: "accordion-header",
101
+ onClick: decoratedOnClick
102
+ }, /*#__PURE__*/_react.default.createElement("div", {
103
+ className: `accordion-header-wrapper d-flex align-items-center ${isCurrentEventKey ? "" : "collapsed"}`
104
+ }, /*#__PURE__*/_react.default.createElement("span", {
105
+ className: "accordion-title flex-grow-1"
106
+ }, title), /*#__PURE__*/_react.default.createElement("div", {
107
+ className: "accordion-buttons ms-auto"
108
+ }, /*#__PURE__*/_react.default.createElement(_ButtonGroup.default, null, buttons))));
109
+ }
110
+ return /*#__PURE__*/_react.default.createElement("div", {
111
+ ref: appRef,
112
+ className: "cherita-app",
113
+ style: {
114
+ height: appDimensions.height
115
+ }
116
+ }, /*#__PURE__*/_react.default.createElement(_DatasetContext.DatasetProvider, props, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Container, {
117
+ fluid: true,
118
+ className: "d-flex g-0",
119
+ style: {
120
+ height: appDimensions.height
121
+ }
122
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Navbar, {
123
+ expand: "sm",
124
+ bg: "primary",
125
+ className: "cherita-navbar"
126
+ }, /*#__PURE__*/_react.default.createElement("div", {
127
+ className: "container-fluid"
128
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Navbar.Toggle, {
129
+ "aria-controls": "navbarScroll"
130
+ }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Navbar.Collapse, {
131
+ id: "navbarScroll"
132
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav, {
133
+ className: "me-auto my-0",
134
+ navbarScroll: true
135
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Item, {
136
+ className: "d-block d-lg-none"
137
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Link, {
138
+ onClick: () => setShowObs(true)
139
+ }, "Observations")), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Item, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Link, {
140
+ onClick: () => setShowVars(true)
141
+ }, "Features"))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav, {
142
+ className: "d-flex"
143
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Item, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Nav.Link, {
144
+ onClick: () => setShowControls(true)
145
+ }, "Controls")))))), /*#__PURE__*/_react.default.createElement("div", {
146
+ className: "cherita-app-obs modern-scrollbars border-end h-100"
147
+ }, /*#__PURE__*/_react.default.createElement(_ObsList.ObsColsList, null)), /*#__PURE__*/_react.default.createElement("div", {
148
+ className: "cherita-app-canvas flex-grow-1"
149
+ }, children), /*#__PURE__*/_react.default.createElement("div", {
150
+ className: "cherita-app-sidebar p-3"
151
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card.Header, {
152
+ className: "d-flex justify-content-evenly align-items-center"
153
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
154
+ variant: "link",
155
+ onClick: () => setShowModal(true)
156
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
157
+ icon: _freeSolidSvgIcons.faChartSimple
158
+ })), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
159
+ variant: "link",
160
+ onClick: () => setShowModal(true)
161
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
162
+ icon: _freeSolidSvgIcons.faChartLine
163
+ })), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
164
+ variant: "link",
165
+ onClick: () => setShowModal(true)
166
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
167
+ icon: _freeSolidSvgIcons.faChartPie
168
+ })), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
169
+ variant: "link",
170
+ onClick: () => setShowModal(true)
171
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
172
+ icon: _freeSolidSvgIcons.faChartArea
173
+ }))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card.Body, {
174
+ className: "d-flex flex-column p-0"
175
+ }, /*#__PURE__*/_react.default.createElement("div", {
176
+ className: "sidebar-pseudospatial"
177
+ }, /*#__PURE__*/_react.default.createElement(_Pseudospatial.Pseudospatial, {
178
+ className: "sidebar-pseudospatial",
179
+ setShowPseudospatialControls: setShowPseudospatialControls
180
+ })), /*#__PURE__*/_react.default.createElement("div", {
181
+ className: "sidebar-features modern-scrollbars"
182
+ }, /*#__PURE__*/_react.default.createElement(_SearchBar.SearchBar, {
183
+ searchDiseases: true,
184
+ searchVar: true
185
+ }), /*#__PURE__*/_react.default.createElement(_VarList.VarNamesList, {
186
+ mode: varMode
187
+ })))))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal, {
188
+ show: showModal,
189
+ onHide: () => setShowModal(false),
190
+ centered: true
191
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Header, {
192
+ closeButton: true
193
+ }, /*#__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, {
194
+ show: showObs,
195
+ handleClose: () => setShowObs(false)
196
+ }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasVars, {
197
+ show: showVars,
198
+ handleClose: () => setShowVars(false)
199
+ }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
200
+ show: showControls,
201
+ handleClose: () => setShowControls(false),
202
+ Controls: _ScatterplotControls.ScatterplotControls
203
+ }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
204
+ show: showPseudospatialControls,
205
+ handleClose: () => setShowPseudospatialControls(false),
206
+ Controls: _PseudospatialToolbar.PseudospatialToolbar
207
+ }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObsm, {
208
+ show: showObsm,
209
+ handleClose: () => setShowObsm(false)
210
+ }))));
211
+ }
212
+ function FullPagePseudospatial(props) {
213
+ return /*#__PURE__*/_react.default.createElement(FullPage, props, /*#__PURE__*/_react.default.createElement(_Scatterplot.Scatterplot, null));
214
+ }
@@ -10,7 +10,6 @@ var _material = require("@mui/material");
10
10
  var _xCharts = require("@mui/x-charts");
11
11
  var _lodash = _interopRequireDefault(require("lodash"));
12
12
  var _reactBootstrap = require("react-bootstrap");
13
- var _ObsToolbar = require("./ObsToolbar");
14
13
  var _constants = require("../../constants/constants");
15
14
  var _DatasetContext = require("../../context/DatasetContext");
16
15
  var _FilterContext = require("../../context/FilterContext");
@@ -20,6 +19,7 @@ var _LoadingIndicators = require("../../utils/LoadingIndicators");
20
19
  var _requests = require("../../utils/requests");
21
20
  var _string = require("../../utils/string");
22
21
  var _VirtualizedList = require("../../utils/VirtualizedList");
22
+ var _ObsToolbar = require("./ObsToolbar");
23
23
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
24
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
25
25
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -103,7 +103,7 @@ function CategoricalItem({
103
103
  key: value,
104
104
  className: "obs-item"
105
105
  }, /*#__PURE__*/_react.default.createElement("div", {
106
- className: "d-flex align-items-center"
106
+ className: "d-flex align-items-start"
107
107
  }, /*#__PURE__*/_react.default.createElement("div", {
108
108
  className: "flex-grow-1"
109
109
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Check, {
@@ -223,7 +223,9 @@ function CategoricalObs({
223
223
  };
224
224
  }, [dataset.colorEncoding, isSliced, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, totalCounts]);
225
225
  showColor &= dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS;
226
- return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, null, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
226
+ return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
227
+ variant: "flush"
228
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, null, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
227
229
  item: obs,
228
230
  onToggleAllObs: toggleAll,
229
231
  onToggleLabel: toggleLabel,
@@ -368,7 +370,9 @@ function ContinuousObs({
368
370
  label: isNaN(obs.values[index]) ? "NaN" : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges)
369
371
  };
370
372
  };
371
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingLinear, null), !serverError && updatedObs && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, null, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
373
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingLinear, null), !serverError && updatedObs && /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
374
+ variant: "flush"
375
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, null, /*#__PURE__*/_react.default.createElement(_ObsToolbar.ObsToolbar, {
372
376
  item: obs,
373
377
  onToggleAllObs: toggleAll,
374
378
  onToggleLabel: toggleLabel,
@@ -5,13 +5,18 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.ObsColsList = ObsColsList;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
+ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
+ var _reactFontawesome = require("@fortawesome/react-fontawesome");
8
10
  var _lodash = _interopRequireDefault(require("lodash"));
9
11
  var _reactBootstrap = require("react-bootstrap");
10
- var _ObsItem = require("./ObsItem");
12
+ var _Accordion = _interopRequireDefault(require("react-bootstrap/Accordion"));
13
+ var _AccordionButton = require("react-bootstrap/AccordionButton");
14
+ var _AccordionContext = _interopRequireDefault(require("react-bootstrap/AccordionContext"));
11
15
  var _constants = require("../../constants/constants");
12
16
  var _DatasetContext = require("../../context/DatasetContext");
13
17
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
14
18
  var _requests = require("../../utils/requests");
19
+ var _ObsItem = require("./ObsItem");
15
20
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
21
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
17
22
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -173,17 +178,42 @@ function ObsColsList({
173
178
  });
174
179
  }
175
180
  };
176
- const obsList = _lodash.default.map(obsCols, item => {
181
+ function ObsAccordionToggle({
182
+ children,
183
+ eventKey
184
+ }) {
185
+ const {
186
+ activeEventKey
187
+ } = (0, _react.useContext)(_AccordionContext.default);
188
+ // console.log("activeEventKey:", activeEventKey);
189
+
190
+ const decoratedOnClick = (0, _AccordionButton.useAccordionButton)(eventKey, () => {
191
+ console.log("Clicked accordion:", eventKey);
192
+ handleAccordionToggle(eventKey);
193
+ });
194
+ const isCurrentEventKey = Array.isArray(activeEventKey) ? activeEventKey.includes(eventKey) : activeEventKey === eventKey;
195
+ return /*#__PURE__*/_react.default.createElement("div", {
196
+ className: `obs-accordion-header ${isCurrentEventKey ? "active" : ""}`,
197
+ onClick: decoratedOnClick
198
+ }, /*#__PURE__*/_react.default.createElement("span", {
199
+ className: "obs-accordion-header-chevron"
200
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
201
+ icon: isCurrentEventKey ? _freeSolidSvgIcons.faChevronDown : _freeSolidSvgIcons.faChevronRight
202
+ })), /*#__PURE__*/_react.default.createElement("span", {
203
+ className: "obs-accordion-header-title"
204
+ }, children));
205
+ }
206
+ const obsList = _lodash.default.map(obsCols, (item, index) => {
177
207
  if (item.type === _constants.OBS_TYPES.DISCRETE) {
178
208
  return null;
179
209
  }
180
- return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Accordion.Item, {
181
- key: item.name,
182
- eventKey: item.name,
183
- className: active === item.name && dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && "cherita-accordion-active"
184
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Accordion.Header, {
185
- onClick: () => handleAccordionToggle(item.name)
186
- }, item.name), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Accordion.Body, null, expandedItems[item.name] && (item.type === _constants.OBS_TYPES.CATEGORICAL || item.type === _constants.OBS_TYPES.BOOLEAN ? /*#__PURE__*/_react.default.createElement(_ObsItem.CategoricalObs, {
210
+ return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(ObsAccordionToggle, {
211
+ eventKey: item.name
212
+ }, item.name), /*#__PURE__*/_react.default.createElement(_Accordion.default.Collapse, {
213
+ eventKey: item.name
214
+ }, /*#__PURE__*/_react.default.createElement("div", {
215
+ className: "obs-accordion-body"
216
+ }, expandedItems[item.name] && (item.type === _constants.OBS_TYPES.CATEGORICAL || item.type === _constants.OBS_TYPES.BOOLEAN ? /*#__PURE__*/_react.default.createElement(_ObsItem.CategoricalObs, {
187
217
  key: item.name,
188
218
  obs: item,
189
219
  updateObs: updateObs,
@@ -202,18 +232,15 @@ function ObsColsList({
202
232
  toggleLabel: () => toggleLabel(item),
203
233
  toggleSlice: () => toggleSlice(item),
204
234
  toggleColor: () => toggleColor(item)
205
- }))));
235
+ })))));
206
236
  });
207
237
  if (!serverError) {
208
- return /*#__PURE__*/_react.default.createElement("div", {
209
- className: "position-relative h-100"
210
- }, /*#__PURE__*/_react.default.createElement("div", {
211
- className: "list-group overflow-auto h-100"
212
- }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Accordion, {
238
+ return /*#__PURE__*/_react.default.createElement("div", null, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_Accordion.default, {
213
239
  flush: true,
214
240
  defaultActiveKey: [active],
215
- alwaysOpen: true
216
- }, obsList)));
241
+ alwaysOpen: true,
242
+ className: "obs-accordion"
243
+ }, obsList));
217
244
  } else {
218
245
  return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
219
246
  variant: "danger"
@@ -29,7 +29,7 @@ function ObsToolbar({
29
29
  const inSliceObs = dataset.sliceBy.obs && dataset.selectedObs?.name === item.name;
30
30
  const isColorEncoding = dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && dataset.selectedObs?.name === item.name;
31
31
  return /*#__PURE__*/_react.default.createElement("div", {
32
- className: "d-flex"
32
+ className: "d-flex align-items-center"
33
33
  }, /*#__PURE__*/_react.default.createElement("div", {
34
34
  className: "flex-grow-1"
35
35
  }, showToggleAllObs && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Check, {
@@ -45,14 +45,14 @@ function ObsToolbar({
45
45
  onClick: onToggleLabel,
46
46
  title: "Add to tooltip"
47
47
  }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
48
- icon: _freeSolidSvgIcons.faFont
48
+ icon: _freeSolidSvgIcons.faListOl
49
49
  })), showSlice && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
50
50
  variant: inSliceObs ? "primary" : "outline-primary",
51
51
  size: "sm",
52
52
  onClick: onToggleSlice,
53
53
  title: "Slice to selected"
54
54
  }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
55
- icon: _freeSolidSvgIcons.faEye
55
+ icon: _freeSolidSvgIcons.faScissors
56
56
  })), showColor && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
57
57
  variant: isColorEncoding ? "primary" : "outline-primary",
58
58
  size: "sm",
@@ -6,10 +6,11 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.Pseudospatial = Pseudospatial;
7
7
  exports.PseudospatialImage = PseudospatialImage;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
+ var _fontawesomeSvgCore = require("@fortawesome/fontawesome-svg-core");
10
+ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
11
  var _lodash = _interopRequireDefault(require("lodash"));
10
12
  var _reactBootstrap = require("react-bootstrap");
11
13
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
12
- var _PseudospatialToolbar = require("./PseudospatialToolbar");
13
14
  var _constants = require("../../constants/constants");
14
15
  var _DatasetContext = require("../../context/DatasetContext");
15
16
  var _FilterContext = require("../../context/FilterContext");
@@ -21,6 +22,7 @@ var _requests = require("../../utils/requests");
21
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
23
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
23
24
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
25
+ _fontawesomeSvgCore.library.add(_freeSolidSvgIcons.faSliders);
24
26
  function usePseudospatialData(plotType) {
25
27
  const ENDPOINT = "pseudospatial";
26
28
  const dataset = (0, _DatasetContext.useDataset)();
@@ -76,7 +78,8 @@ function usePseudospatialData(plotType) {
76
78
  }
77
79
  function Pseudospatial({
78
80
  showLegend = true,
79
- sharedScaleRange = false
81
+ sharedScaleRange = false,
82
+ setShowPseudospatialControls
80
83
  }) {
81
84
  const dataset = (0, _DatasetContext.useDataset)();
82
85
  const [data, setData] = (0, _react.useState)([]);
@@ -175,18 +178,33 @@ function Pseudospatial({
175
178
  }
176
179
  }, [dataset.controls.range, dataset.controls.valueMax, dataset.controls.valueMin, dataset.controls.valueRange, getColor, sharedScaleRange]);
177
180
  const hasSelections = !!plotType && !!dataset.pseudospatial.maskSet;
181
+ const faSlidersPath = _freeSolidSvgIcons.faSliders.icon[4];
178
182
  if (!serverError) {
179
183
  return /*#__PURE__*/_react.default.createElement("div", {
180
- className: "cherita-pseudospatial position-relative"
181
- }, /*#__PURE__*/_react.default.createElement(_PseudospatialToolbar.PseudospatialToolbar, {
182
- plotType: plotType
183
- }), /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hasSelections && isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), hasSelections && /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
184
+ className: "cherita-pseudospatial"
185
+ }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hasSelections && isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), hasSelections && /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
184
186
  data: data,
185
- layout: layout,
187
+ layout: {
188
+ ...layout,
189
+ autosize: true,
190
+ height: "200"
191
+ },
186
192
  useResizeHandler: true,
187
193
  className: "cherita-pseudospatial-plot",
188
194
  config: {
189
- displaylogo: false
195
+ displaylogo: false,
196
+ displayModeBar: true,
197
+ modeBarButtonsToAdd: [{
198
+ name: "Open plot controls",
199
+ icon: {
200
+ width: 512,
201
+ height: 512,
202
+ path: faSlidersPath,
203
+ ascent: 512,
204
+ descent: 0
205
+ },
206
+ click: () => setShowPseudospatialControls(prev => !prev)
207
+ }]
190
208
  }
191
209
  }), hasSelections && showLegend && /*#__PURE__*/_react.default.createElement(_Legend.Legend, {
192
210
  min: layout?.coloraxis?.cmin,
@@ -4,7 +4,10 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.PseudospatialToolbar = PseudospatialToolbar;
7
+ exports.PseudospatialToolbarLite = PseudospatialToolbarLite;
7
8
  var _react = _interopRequireWildcard(require("react"));
9
+ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
10
+ var _reactFontawesome = require("@fortawesome/react-fontawesome");
8
11
  var _lodash = _interopRequireDefault(require("lodash"));
9
12
  var _reactBootstrap = require("react-bootstrap");
10
13
  var _constants = require("../../constants/constants");
@@ -126,4 +129,20 @@ function PseudospatialToolbar({
126
129
  return /*#__PURE__*/_react.default.createElement("div", {
127
130
  className: "cherita-pseudospatial-toolbar"
128
131
  }, /*#__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")));
129
148
  }