@haniffalab/cherita-react 1.3.0-dev.2025-05-28.9afc380f → 1.3.0-dev.2025-06-04.d986a94b

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.
Files changed (30) hide show
  1. package/dist/cjs/components/dotplot/Dotplot.js +35 -5
  2. package/dist/cjs/components/full-page/FullPage.js +108 -50
  3. package/dist/cjs/components/full-page/PlotTypeSelector.js +57 -0
  4. package/dist/cjs/components/heatmap/Heatmap.js +35 -5
  5. package/dist/cjs/components/matrixplot/Matrixplot.js +35 -5
  6. package/dist/cjs/components/obs-list/ObsList.js +4 -3
  7. package/dist/cjs/components/scatterplot/SpatialControls.js +3 -3
  8. package/dist/cjs/components/toolbar/Toolbar.js +102 -0
  9. package/dist/cjs/components/violin/Violin.js +37 -6
  10. package/dist/cjs/constants/constants.js +14 -2
  11. package/dist/cjs/index.js +15 -21
  12. package/dist/css/cherita.css +76 -23
  13. package/dist/css/cherita.css.map +1 -1
  14. package/dist/esm/components/dotplot/Dotplot.js +36 -6
  15. package/dist/esm/components/full-page/FullPage.js +110 -50
  16. package/dist/esm/components/full-page/PlotTypeSelector.js +50 -0
  17. package/dist/esm/components/heatmap/Heatmap.js +36 -6
  18. package/dist/esm/components/matrixplot/Matrixplot.js +36 -6
  19. package/dist/esm/components/obs-list/ObsList.js +4 -3
  20. package/dist/esm/components/scatterplot/SpatialControls.js +3 -3
  21. package/dist/esm/components/toolbar/Toolbar.js +91 -0
  22. package/dist/esm/components/violin/Violin.js +39 -8
  23. package/dist/esm/constants/constants.js +13 -1
  24. package/dist/esm/index.js +4 -4
  25. package/package.json +2 -2
  26. package/scss/cherita.scss +0 -1
  27. package/scss/components/layouts.scss +69 -1
  28. package/scss/components/plotly.scss +19 -14
  29. package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
  30. package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
@@ -8,11 +8,13 @@ var _react = _interopRequireWildcard(require("react"));
8
8
  var _lodash = _interopRequireDefault(require("lodash"));
9
9
  var _reactBootstrap = require("react-bootstrap");
10
10
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
11
+ var _constants = require("../../constants/constants");
11
12
  var _DatasetContext = require("../../context/DatasetContext");
12
13
  var _FilterContext = require("../../context/FilterContext");
13
14
  var _SettingsContext = require("../../context/SettingsContext");
14
15
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
15
16
  var _requests = require("../../utils/requests");
17
+ var _Toolbar = require("../toolbar/Toolbar");
16
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
19
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
18
20
  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; }
@@ -20,8 +22,16 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
20
22
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
21
23
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
22
24
  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); }
23
- function Dotplot() {
25
+ function Dotplot(_ref) {
24
26
  var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
27
+ let {
28
+ showObsBtn = false,
29
+ showVarsBtn = false,
30
+ showCtrlsBtn = false,
31
+ setShowObs,
32
+ setShowVars,
33
+ setShowControls
34
+ } = _ref;
25
35
  const ENDPOINT = "dotplot";
26
36
  const dataset = (0, _DatasetContext.useDataset)();
27
37
  const settings = (0, _SettingsContext.useSettings)();
@@ -126,17 +136,29 @@ function Dotplot() {
126
136
  });
127
137
  });
128
138
  }, [settings.controls.colorAxis.cmin, settings.controls.colorAxis.cmax]);
139
+ const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
140
+ onClick: setShowObs
141
+ }), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
142
+ onClick: setShowVars
143
+ }), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
144
+ onClick: setShowControls
145
+ })]);
146
+ const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
129
147
  if (!serverError) {
130
148
  if (hasSelections) {
131
149
  return /*#__PURE__*/_react.default.createElement("div", {
132
- className: "cherita-dotplot position-relative"
150
+ className: "cherita-plot cherita-dotplot position-relative"
133
151
  }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
134
152
  data: data,
135
153
  layout: layout,
136
154
  useResizeHandler: true,
137
155
  style: {
138
- maxWidth: "100%",
139
- maxHeight: "100%"
156
+ width: "100%",
157
+ height: "100%"
158
+ },
159
+ config: {
160
+ displaylogo: false,
161
+ modeBarButtons: modeBarButtons
140
162
  }
141
163
  }));
142
164
  }
@@ -144,7 +166,15 @@ function Dotplot() {
144
166
  className: "cherita-dotplot"
145
167
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
146
168
  variant: "light"
147
- }, "Select features and a category"));
169
+ }, "Select", " ", showVarsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
170
+ variant: "link",
171
+ className: "border-0 p-0 align-baseline",
172
+ onClick: setShowVars
173
+ }, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
174
+ variant: "link",
175
+ className: "border-0 p-0 align-baseline",
176
+ onClick: setShowObs
177
+ }, "category") : "category"));
148
178
  } else {
149
179
  return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
150
180
  variant: "danger"
@@ -4,32 +4,38 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.FullPage = FullPage;
7
- exports.FullPagePlots = FullPagePlots;
8
- exports.FullPageScatterplot = FullPageScatterplot;
9
7
  var _react = _interopRequireWildcard(require("react"));
8
+ var _material = require("@mui/material");
10
9
  var _reactBootstrap = require("react-bootstrap");
11
10
  var _constants = require("../../constants/constants");
12
11
  var _DatasetContext = require("../../context/DatasetContext");
13
12
  var _Dotplot = require("../dotplot/Dotplot");
13
+ var _DotplotControls = require("../dotplot/DotplotControls");
14
+ var _PlotTypeSelector = require("../full-page/PlotTypeSelector");
14
15
  var _Heatmap = require("../heatmap/Heatmap");
16
+ var _HeatmapControls = require("../heatmap/HeatmapControls");
15
17
  var _Matrixplot = require("../matrixplot/Matrixplot");
18
+ var _MatrixplotControls = require("../matrixplot/MatrixplotControls");
16
19
  var _ObsList = require("../obs-list/ObsList");
17
20
  var _offcanvas = require("../offcanvas");
21
+ var _Pseudospatial = require("../pseudospatial/Pseudospatial");
22
+ var _PseudospatialToolbar = require("../pseudospatial/PseudospatialToolbar");
18
23
  var _Scatterplot = require("../scatterplot/Scatterplot");
19
24
  var _ScatterplotControls = require("../scatterplot/ScatterplotControls");
20
25
  var _SearchBar = require("../search-bar/SearchBar");
21
26
  var _VarList = require("../var-list/VarList");
22
27
  var _Violin = require("../violin/Violin");
23
- const _excluded = ["children", "varMode", "searchDiseases"];
28
+ var _ViolinControls = require("../violin/ViolinControls");
29
+ const _excluded = ["isPseudospatial", "searchDiseases", "defaultPlotType"];
24
30
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
25
31
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
26
32
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
27
33
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
28
34
  function FullPage(_ref) {
29
35
  let {
30
- children,
31
- varMode = _constants.SELECTION_MODES.SINGLE,
32
- searchDiseases = false
36
+ isPseudospatial = false,
37
+ searchDiseases = true,
38
+ defaultPlotType = _constants.PLOT_TYPES.SCATTERPLOT
33
39
  } = _ref,
34
40
  props = _objectWithoutProperties(_ref, _excluded);
35
41
  const appRef = (0, _react.useRef)();
@@ -42,6 +48,16 @@ function FullPage(_ref) {
42
48
  const [showVars, setShowVars] = (0, _react.useState)(false);
43
49
  const [showControls, setShowControls] = (0, _react.useState)(false);
44
50
  const [showModal, setShowModal] = (0, _react.useState)(false);
51
+ const [plotType, setPlotType] = (0, _react.useState)(defaultPlotType || _constants.PLOT_TYPES.SCATTERPLOT);
52
+ const [showPseudospatialControls, setShowPseudospatialControls] = (0, _react.useState)(false);
53
+ const [pseudospatialPlotType, setpseudospatialPlotType] = (0, _react.useState)(null);
54
+ (0, _react.useEffect)(() => {
55
+ setPlotType(defaultPlotType || _constants.PLOT_TYPES.SCATTERPLOT);
56
+ }, [defaultPlotType]);
57
+ const LgBreakpoint = (0, _material.useMediaQuery)(_constants.BREAKPOINTS.LG);
58
+ const XlBreakpoint = (0, _material.useMediaQuery)(_constants.BREAKPOINTS.XL);
59
+ const showObsBtn = LgBreakpoint;
60
+ const showVarsBtn = XlBreakpoint;
45
61
  (0, _react.useEffect)(() => {
46
62
  const updateDimensions = () => {
47
63
  if (appRef.current) {
@@ -60,9 +76,67 @@ function FullPage(_ref) {
60
76
  }
61
77
  };
62
78
  window.addEventListener("resize", updateDimensions);
63
- updateDimensions(); // Initial update
79
+ updateDimensions();
64
80
  return () => window.removeEventListener("resize", updateDimensions);
65
81
  }, []);
82
+ const {
83
+ plotControls,
84
+ varMode,
85
+ showSelectedAsActive
86
+ } = {
87
+ [_constants.PLOT_TYPES.SCATTERPLOT]: {
88
+ plotControls: _ScatterplotControls.ScatterplotControls,
89
+ varMode: _constants.SELECTION_MODES.SINGLE,
90
+ showSelectedAsActive: false
91
+ },
92
+ [_constants.PLOT_TYPES.DOTPLOT]: {
93
+ plotControls: _DotplotControls.DotplotControls,
94
+ varMode: _constants.SELECTION_MODES.MULTIPLE,
95
+ showSelectedAsActive: true
96
+ },
97
+ [_constants.PLOT_TYPES.MATRIXPLOT]: {
98
+ plotControls: _MatrixplotControls.MatrixplotControls,
99
+ varMode: _constants.SELECTION_MODES.MULTIPLE,
100
+ showSelectedAsActive: true
101
+ },
102
+ [_constants.PLOT_TYPES.HEATMAP]: {
103
+ plotControls: _HeatmapControls.HeatmapControls,
104
+ varMode: _constants.SELECTION_MODES.MULTIPLE,
105
+ showSelectedAsActive: true
106
+ },
107
+ [_constants.PLOT_TYPES.VIOLINPLOT]: {
108
+ plotControls: _ViolinControls.ViolinControls,
109
+ varMode: _constants.SELECTION_MODES.MULTIPLE,
110
+ showSelectedAsActive: false
111
+ }
112
+ }[plotType];
113
+ const plot = (0, _react.useMemo)(() => {
114
+ const commonProps = {
115
+ showObsBtn,
116
+ showVarsBtn,
117
+ showCtrlsBtn: true,
118
+ setShowObs,
119
+ setShowVars,
120
+ setShowControls
121
+ };
122
+ switch (plotType) {
123
+ case _constants.PLOT_TYPES.DOTPLOT:
124
+ return /*#__PURE__*/_react.default.createElement(_Dotplot.Dotplot, commonProps);
125
+ case _constants.PLOT_TYPES.MATRIXPLOT:
126
+ return /*#__PURE__*/_react.default.createElement(_Matrixplot.Matrixplot, commonProps);
127
+ case _constants.PLOT_TYPES.HEATMAP:
128
+ return /*#__PURE__*/_react.default.createElement(_Heatmap.Heatmap, commonProps);
129
+ case _constants.PLOT_TYPES.VIOLINPLOT:
130
+ return /*#__PURE__*/_react.default.createElement(_Violin.Violin, _extends({
131
+ mode: _constants.VIOLIN_MODES.MULTIKEY
132
+ }, commonProps));
133
+ case _constants.PLOT_TYPES.SCATTERPLOT:
134
+ default:
135
+ return /*#__PURE__*/_react.default.createElement(_Scatterplot.Scatterplot, _extends({}, commonProps, {
136
+ isFullscreen: true
137
+ }));
138
+ }
139
+ }, [plotType, showObsBtn, showVarsBtn]);
66
140
  return /*#__PURE__*/_react.default.createElement("div", {
67
141
  ref: appRef,
68
142
  className: "cherita-app",
@@ -71,22 +145,32 @@ function FullPage(_ref) {
71
145
  }
72
146
  }, /*#__PURE__*/_react.default.createElement(_DatasetContext.DatasetProvider, props, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Container, {
73
147
  fluid: true,
74
- className: "d-flex g-0",
148
+ className: "cherita-app-container",
75
149
  style: {
76
150
  height: appDimensions.height
77
151
  }
78
152
  }, /*#__PURE__*/_react.default.createElement("div", {
79
153
  className: "cherita-app-obs modern-scrollbars border-end h-100"
80
- }, /*#__PURE__*/_react.default.createElement(_ObsList.ObsColsList, props)), /*#__PURE__*/_react.default.createElement("div", {
81
- className: "cherita-app-canvas flex-grow-1"
82
- }, children({
83
- setShowObs,
84
- setShowVars
85
- })), /*#__PURE__*/_react.default.createElement("div", {
154
+ }, /*#__PURE__*/_react.default.createElement(_ObsList.ObsColsList, _extends({}, props, {
155
+ showSelectedAsActive: showSelectedAsActive
156
+ }))), /*#__PURE__*/_react.default.createElement("div", {
157
+ className: "cherita-app-canvas"
158
+ }, plot), /*#__PURE__*/_react.default.createElement("div", {
86
159
  className: "cherita-app-sidebar p-3"
87
160
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card.Body, {
88
161
  className: "d-flex flex-column p-0"
89
162
  }, /*#__PURE__*/_react.default.createElement("div", {
163
+ className: "sidebar-plotselector"
164
+ }, /*#__PURE__*/_react.default.createElement(_PlotTypeSelector.PlotTypeSelector, {
165
+ currentType: plotType,
166
+ onChange: type => setPlotType(type)
167
+ })), plotType === _constants.PLOT_TYPES.SCATTERPLOT && isPseudospatial ? /*#__PURE__*/_react.default.createElement("div", {
168
+ className: "sidebar-pseudospatial"
169
+ }, /*#__PURE__*/_react.default.createElement(_Pseudospatial.Pseudospatial, {
170
+ plotType: pseudospatialPlotType,
171
+ setPlotType: setpseudospatialPlotType,
172
+ setShowControls: setShowPseudospatialControls
173
+ })) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null), /*#__PURE__*/_react.default.createElement("div", {
90
174
  className: "sidebar-features modern-scrollbars"
91
175
  }, /*#__PURE__*/_react.default.createElement(_SearchBar.SearchBar, {
92
176
  searchDiseases: searchDiseases,
@@ -99,51 +183,25 @@ function FullPage(_ref) {
99
183
  centered: true
100
184
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Header, {
101
185
  closeButton: true
102
- }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Body, null)), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObs, {
186
+ }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Body, null)), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObs, _extends({}, props, {
187
+ showSelectedAsActive: showSelectedAsActive,
103
188
  show: showObs,
104
189
  handleClose: () => setShowObs(false)
105
- }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasVars, {
190
+ })), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasVars, {
106
191
  show: showVars,
107
192
  handleClose: () => setShowVars(false),
108
193
  mode: varMode
109
- }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
194
+ }), plotControls && /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
110
195
  show: showControls,
111
196
  handleClose: () => setShowControls(false),
112
- Controls: _ScatterplotControls.ScatterplotControls
197
+ Controls: plotControls
113
198
  }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObsm, {
114
199
  show: showObsm,
115
200
  handleClose: () => setShowObsm(false)
116
- }))));
117
- }
118
- function FullPageScatterplot(props) {
119
- return /*#__PURE__*/_react.default.createElement(FullPage, _extends({}, props, {
120
- varMode: _constants.SELECTION_MODES.SINGLE
121
- }), _ref2 => {
122
- let {
123
- setShowObs,
124
- setShowVars
125
- } = _ref2;
126
- return /*#__PURE__*/_react.default.createElement(_Scatterplot.Scatterplot, {
127
- setShowObs: setShowObs,
128
- setShowVars: setShowVars,
129
- isFullscreen: true
130
- });
131
- });
132
- }
133
- function FullPagePlots(props) {
134
- return /*#__PURE__*/_react.default.createElement(FullPage, _extends({}, props, {
135
- varMode: _constants.SELECTION_MODES.MULTIPLE
136
- }), /*#__PURE__*/_react.default.createElement("div", {
137
- className: "container-fluid w-100 h-100 d-flex flex-column overflow-y-auto"
138
- }, /*#__PURE__*/_react.default.createElement("div", {
139
- className: "row flex-grow-1"
140
- }, /*#__PURE__*/_react.default.createElement(_Heatmap.Heatmap, null)), /*#__PURE__*/_react.default.createElement("div", {
141
- className: "row flex-grow-1"
142
- }, /*#__PURE__*/_react.default.createElement(_Matrixplot.Matrixplot, null)), /*#__PURE__*/_react.default.createElement("div", {
143
- className: "row flex-grow-1"
144
- }, /*#__PURE__*/_react.default.createElement(_Dotplot.Dotplot, null)), /*#__PURE__*/_react.default.createElement("div", {
145
- className: "row flex-grow-1"
146
- }, /*#__PURE__*/_react.default.createElement(_Violin.Violin, {
147
- mode: _constants.VIOLIN_MODES.GROUPBY
201
+ }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
202
+ show: showPseudospatialControls,
203
+ handleClose: () => setShowPseudospatialControls(false),
204
+ Controls: _PseudospatialToolbar.PseudospatialToolbar,
205
+ plotType: pseudospatialPlotType
148
206
  }))));
149
207
  }
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.PlotTypeSelector = PlotTypeSelector;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _dotplot = _interopRequireDefault(require("../../../assets/images/plots/dotplot.svg"));
9
+ var _heatmap = _interopRequireDefault(require("../../../assets/images/plots/heatmap.svg"));
10
+ var _matrixplot = _interopRequireDefault(require("../../../assets/images/plots/matrixplot.svg"));
11
+ var _scatterplot = _interopRequireDefault(require("../../../assets/images/plots/scatterplot.svg"));
12
+ var _violin = _interopRequireDefault(require("../../../assets/images/plots/violin.svg"));
13
+ var _constants = require("../../constants/constants");
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ const iconMap = {
16
+ [_constants.PLOT_TYPES.DOTPLOT]: _dotplot.default,
17
+ [_constants.PLOT_TYPES.MATRIXPLOT]: _matrixplot.default,
18
+ [_constants.PLOT_TYPES.VIOLINPLOT]: _violin.default,
19
+ [_constants.PLOT_TYPES.SCATTERPLOT]: _scatterplot.default,
20
+ [_constants.PLOT_TYPES.HEATMAP]: _heatmap.default
21
+ };
22
+ const plotTypes = Object.entries(iconMap).map(_ref => {
23
+ let [type, icon] = _ref;
24
+ return {
25
+ type,
26
+ icon,
27
+ alt: type.charAt(0).toUpperCase() + type.slice(1)
28
+ };
29
+ });
30
+ function PlotTypeSelector(_ref2) {
31
+ let {
32
+ currentType,
33
+ onChange
34
+ } = _ref2;
35
+ return /*#__PURE__*/_react.default.createElement("div", {
36
+ className: "d-flex gap-2 justify-content-between"
37
+ }, plotTypes.map(_ref3 => {
38
+ let {
39
+ type,
40
+ icon,
41
+ alt
42
+ } = _ref3;
43
+ return /*#__PURE__*/_react.default.createElement("img", {
44
+ key: type,
45
+ src: icon,
46
+ alt: alt,
47
+ height: 32,
48
+ width: 32,
49
+ className: "plotselector-icon".concat(currentType === type ? " active" : ""),
50
+ onClick: () => onChange(type),
51
+ style: {
52
+ borderBottom: currentType === type ? "2px solid #007bff" : "none"
53
+ },
54
+ title: alt
55
+ });
56
+ }));
57
+ }
@@ -8,11 +8,13 @@ var _react = _interopRequireWildcard(require("react"));
8
8
  var _lodash = _interopRequireDefault(require("lodash"));
9
9
  var _reactBootstrap = require("react-bootstrap");
10
10
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
11
+ var _constants = require("../../constants/constants");
11
12
  var _DatasetContext = require("../../context/DatasetContext");
12
13
  var _FilterContext = require("../../context/FilterContext");
13
14
  var _SettingsContext = require("../../context/SettingsContext");
14
15
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
15
16
  var _requests = require("../../utils/requests");
17
+ var _Toolbar = require("../toolbar/Toolbar");
16
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
19
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
18
20
  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; }
@@ -20,8 +22,16 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
20
22
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
21
23
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
22
24
  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); }
23
- function Heatmap() {
25
+ function Heatmap(_ref) {
24
26
  var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
27
+ let {
28
+ showObsBtn = false,
29
+ showVarsBtn = false,
30
+ showCtrlsBtn = false,
31
+ setShowObs,
32
+ setShowVars,
33
+ setShowControls
34
+ } = _ref;
25
35
  const ENDPOINT = "heatmap";
26
36
  const dataset = (0, _DatasetContext.useDataset)();
27
37
  const settings = (0, _SettingsContext.useSettings)();
@@ -98,17 +108,29 @@ function Heatmap() {
98
108
  colorscale.current = settings.controls.colorScale;
99
109
  updateColorscale(colorscale.current);
100
110
  }, [settings.controls.colorScale, updateColorscale]);
111
+ const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
112
+ onClick: setShowObs
113
+ }), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
114
+ onClick: setShowVars
115
+ }), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
116
+ onClick: setShowControls
117
+ })]);
118
+ const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
101
119
  if (!serverError) {
102
120
  if (hasSelections) {
103
121
  return /*#__PURE__*/_react.default.createElement("div", {
104
- className: "cherita-heatmap position-relative"
122
+ className: "cherita-plot cherita-heatmap position-relative"
105
123
  }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
106
124
  data: data,
107
125
  layout: layout,
108
126
  useResizeHandler: true,
109
127
  style: {
110
- maxWidth: "100%",
111
- maxHeight: "100%"
128
+ width: "100%",
129
+ height: "100%"
130
+ },
131
+ config: {
132
+ displaylogo: false,
133
+ modeBarButtons: modeBarButtons
112
134
  }
113
135
  }));
114
136
  }
@@ -116,7 +138,15 @@ function Heatmap() {
116
138
  className: "cherita-heatmap"
117
139
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
118
140
  variant: "light"
119
- }, "Select features and a category"));
141
+ }, "Select", " ", showVarsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
142
+ variant: "link",
143
+ className: "border-0 p-0 align-baseline",
144
+ onClick: setShowVars
145
+ }, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
146
+ variant: "link",
147
+ className: "border-0 p-0 align-baseline",
148
+ onClick: setShowObs
149
+ }, "category") : "category"));
120
150
  } else {
121
151
  return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
122
152
  variant: "danger"
@@ -8,11 +8,13 @@ var _react = _interopRequireWildcard(require("react"));
8
8
  var _lodash = _interopRequireDefault(require("lodash"));
9
9
  var _reactBootstrap = require("react-bootstrap");
10
10
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
11
+ var _constants = require("../../constants/constants");
11
12
  var _DatasetContext = require("../../context/DatasetContext");
12
13
  var _FilterContext = require("../../context/FilterContext");
13
14
  var _SettingsContext = require("../../context/SettingsContext");
14
15
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
15
16
  var _requests = require("../../utils/requests");
17
+ var _Toolbar = require("../toolbar/Toolbar");
16
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
19
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
18
20
  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; }
@@ -20,8 +22,16 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
20
22
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
21
23
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
22
24
  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); }
23
- function Matrixplot() {
25
+ function Matrixplot(_ref) {
24
26
  var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
27
+ let {
28
+ showObsBtn = false,
29
+ showVarsBtn = false,
30
+ showCtrlsBtn = false,
31
+ setShowObs,
32
+ setShowVars,
33
+ setShowControls
34
+ } = _ref;
25
35
  const ENDPOINT = "matrixplot";
26
36
  const dataset = (0, _DatasetContext.useDataset)();
27
37
  const settings = (0, _SettingsContext.useSettings)();
@@ -100,17 +110,29 @@ function Matrixplot() {
100
110
  colorscale.current = settings.controls.colorScale;
101
111
  updateColorscale(colorscale.current);
102
112
  }, [settings.controls.colorScale, updateColorscale]);
113
+ const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
114
+ onClick: setShowObs
115
+ }), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
116
+ onClick: setShowVars
117
+ }), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
118
+ onClick: setShowControls
119
+ })]);
120
+ const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
103
121
  if (!serverError) {
104
122
  if (hasSelections) {
105
123
  return /*#__PURE__*/_react.default.createElement("div", {
106
- className: "cherita-matrixplot position-relative"
124
+ className: "cherita-plot cherita-matrixplot position-relative"
107
125
  }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
108
126
  data: data,
109
127
  layout: layout,
110
128
  useResizeHandler: true,
111
129
  style: {
112
- maxWidth: "100%",
113
- maxHeight: "100%"
130
+ width: "100%",
131
+ height: "100%"
132
+ },
133
+ config: {
134
+ displaylogo: false,
135
+ modeBarButtons: modeBarButtons
114
136
  }
115
137
  }));
116
138
  }
@@ -118,7 +140,15 @@ function Matrixplot() {
118
140
  className: "cherita-matrixplot"
119
141
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
120
142
  variant: "light"
121
- }, "Select features and a category"));
143
+ }, "Select", " ", showVarsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
144
+ variant: "link",
145
+ className: "border-0 p-0 align-baseline",
146
+ onClick: setShowVars
147
+ }, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
148
+ variant: "link",
149
+ className: "border-0 p-0 align-baseline",
150
+ onClick: setShowObs
151
+ }, "category") : "category"));
122
152
  } else {
123
153
  return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
124
154
  variant: "danger"
@@ -56,7 +56,8 @@ function ObsColsList(_ref2) {
56
56
  var _settings$selectedObs;
57
57
  let {
58
58
  showColor = true,
59
- enableObsGroups = true
59
+ enableObsGroups = true,
60
+ showSelectedAsActive = false
60
61
  } = _ref2;
61
62
  const ENDPOINT = "obs/cols";
62
63
  const dataset = (0, _DatasetContext.useDataset)();
@@ -223,7 +224,7 @@ function ObsColsList(_ref2) {
223
224
  }
224
225
  const inLabelObs = _lodash.default.some(settings.labelObs, i => i.name === item.name);
225
226
  const inSliceObs = settings.sliceBy.obs && ((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.name) === item.name;
226
- const isColorEncoding = settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && ((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name;
227
+ const isColorEncoding = (showSelectedAsActive || settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS) && ((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name;
227
228
  return /*#__PURE__*/_react.default.createElement("div", {
228
229
  className: "accordion-item",
229
230
  key: item.name
@@ -250,7 +251,7 @@ function ObsColsList(_ref2) {
250
251
  event.stopPropagation();
251
252
  toggleColor(item);
252
253
  },
253
- title: "Is color encoding"
254
+ title: showSelectedAsActive ? "Is selected" : "Is color encoding"
254
255
  }, /*#__PURE__*/_react.default.createElement(_WaterDrop.default, null)))), /*#__PURE__*/_react.default.createElement(_Accordion.default.Collapse, {
255
256
  eventKey: item.name
256
257
  }, /*#__PURE__*/_react.default.createElement("div", {
@@ -14,9 +14,9 @@ var _reactBootstrap = require("react-bootstrap");
14
14
  var _Button = _interopRequireDefault(require("react-bootstrap/Button"));
15
15
  var _ButtonGroup = _interopRequireDefault(require("react-bootstrap/ButtonGroup"));
16
16
  var _Dropdown = _interopRequireDefault(require("react-bootstrap/Dropdown"));
17
- var _DatasetContext = require("../../context/DatasetContext");
18
17
  var _offcanvas = require("../offcanvas");
19
18
  var _ScatterplotControls = require("./ScatterplotControls");
19
+ var _constants = require("../../constants/constants");
20
20
  var _SettingsContext = require("../../context/SettingsContext");
21
21
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
22
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
@@ -40,8 +40,8 @@ function SpatialControls(_ref) {
40
40
  const [showControls, setShowControls] = (0, _react.useState)(false);
41
41
  const handleCloseControls = () => setShowControls(false);
42
42
  const handleShowControls = () => setShowControls(true);
43
- const LgBreakpoint = (0, _useMediaQuery.default)("(max-width: 991.98px)");
44
- const XlBreakpoint = (0, _useMediaQuery.default)("(max-width: 1199.98px)");
43
+ const LgBreakpoint = (0, _useMediaQuery.default)(_constants.BREAKPOINTS.LG);
44
+ const XlBreakpoint = (0, _useMediaQuery.default)(_constants.BREAKPOINTS.XL);
45
45
  const showObsBtn = isFullscreen ? LgBreakpoint : true;
46
46
  const showVarsBtn = isFullscreen ? XlBreakpoint : true;
47
47
  const onSelect = (eventKey, event) => {