@haniffalab/cherita-react 1.4.1-dev.2025-10-20.528e0f75 → 1.4.1-dev.2025-10-22.61540191

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 (50) hide show
  1. package/dist/cjs/components/dotplot/Dotplot.js +23 -15
  2. package/dist/cjs/components/full-page/FullPage.js +32 -30
  3. package/dist/cjs/components/full-page/PlotAlert.js +36 -0
  4. package/dist/cjs/components/full-page/PlotTypeSelector.js +77 -39
  5. package/dist/cjs/components/heatmap/Heatmap.js +23 -15
  6. package/dist/cjs/components/icons/DotPlotIcon.js +58 -0
  7. package/dist/cjs/components/icons/HeatmapIcon.js +39 -0
  8. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +51 -0
  9. package/dist/cjs/components/icons/MatrixPlotIcon.js +53 -0
  10. package/dist/cjs/components/icons/ScatterplotIcon.1.js +158 -0
  11. package/dist/cjs/components/icons/ScatterplotIcon.js +138 -0
  12. package/dist/cjs/components/icons/ViolinPlotIcon.js +34 -0
  13. package/dist/cjs/components/matrixplot/Matrixplot.js +25 -17
  14. package/dist/cjs/components/pseudospatial/Pseudospatial.js +64 -25
  15. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +63 -15
  16. package/dist/cjs/components/violin/Violin.js +41 -30
  17. package/dist/cjs/context/DatasetContext.js +1 -1
  18. package/dist/cjs/context/SettingsContext.js +27 -3
  19. package/dist/cjs/utils/StyledTooltip.js +39 -0
  20. package/dist/css/cherita.css +37 -22
  21. package/dist/css/cherita.css.map +1 -1
  22. package/dist/esm/components/dotplot/Dotplot.js +22 -13
  23. package/dist/esm/components/full-page/FullPage.js +6 -3
  24. package/dist/esm/components/full-page/PlotAlert.js +30 -0
  25. package/dist/esm/components/full-page/PlotTypeSelector.js +76 -38
  26. package/dist/esm/components/heatmap/Heatmap.js +22 -13
  27. package/dist/esm/components/icons/DotPlotIcon.js +52 -0
  28. package/dist/esm/components/icons/HeatmapIcon.js +33 -0
  29. package/dist/esm/components/icons/MatrixPlotIcon.1.js +45 -0
  30. package/dist/esm/components/icons/MatrixPlotIcon.js +47 -0
  31. package/dist/esm/components/icons/ScatterplotIcon.1.js +152 -0
  32. package/dist/esm/components/icons/ScatterplotIcon.js +132 -0
  33. package/dist/esm/components/icons/ViolinPlotIcon.js +28 -0
  34. package/dist/esm/components/matrixplot/Matrixplot.js +24 -15
  35. package/dist/esm/components/pseudospatial/Pseudospatial.js +58 -18
  36. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +52 -4
  37. package/dist/esm/components/violin/Violin.js +36 -24
  38. package/dist/esm/context/DatasetContext.js +1 -1
  39. package/dist/esm/context/SettingsContext.js +27 -3
  40. package/dist/esm/utils/StyledTooltip.js +33 -0
  41. package/package.json +2 -2
  42. package/scss/cherita.scss +19 -1
  43. package/scss/components/layouts.scss +2 -21
  44. package/scss/components/plotly.scss +37 -26
  45. package/scss/components/plots.scss +14 -1
  46. package/dist/assets/images/plots/dotplot.svg +0 -152
  47. package/dist/assets/images/plots/heatmap.svg +0 -193
  48. package/dist/assets/images/plots/matrixplot.svg +0 -275
  49. package/dist/assets/images/plots/scatterplot.svg +0 -198
  50. package/dist/assets/images/plots/violin.svg +0 -50
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Dotplot = Dotplot;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = 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"));
@@ -15,9 +15,9 @@ var _SettingsContext = require("../../context/SettingsContext");
15
15
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
16
16
  var _requests = require("../../utils/requests");
17
17
  var _Resolver = require("../../utils/Resolver");
18
+ var _PlotAlert = require("../full-page/PlotAlert");
18
19
  var _Toolbar = require("../toolbar/Toolbar");
19
20
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
- 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); }
21
21
  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; }
22
22
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
23
23
  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; }
@@ -30,7 +30,9 @@ function Dotplot(_ref) {
30
30
  showCtrlsBtn = false,
31
31
  setShowObs,
32
32
  setShowVars,
33
- setShowControls
33
+ setShowControls,
34
+ plotType,
35
+ setPlotType
34
36
  } = _ref;
35
37
  const ENDPOINT = "dotplot";
36
38
  const dataset = (0, _DatasetContext.useDataset)();
@@ -142,9 +144,9 @@ function Dotplot(_ref) {
142
144
  const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
143
145
  if (!serverError) {
144
146
  if (hasSelections) {
145
- return /*#__PURE__*/_react.default.createElement("div", {
147
+ return /*#__PURE__*/React.createElement("div", {
146
148
  className: "cherita-plot cherita-dotplot position-relative"
147
- }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
149
+ }, isPending && /*#__PURE__*/React.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/React.createElement(_reactPlotly.default, {
148
150
  data: data,
149
151
  layout: layout,
150
152
  useResizeHandler: true,
@@ -158,22 +160,28 @@ function Dotplot(_ref) {
158
160
  }
159
161
  }));
160
162
  }
161
- return /*#__PURE__*/_react.default.createElement("div", {
162
- className: "cherita-dotplot"
163
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
164
- variant: "light"
165
- }, "Select", " ", showVarsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
163
+ return /*#__PURE__*/React.createElement(_PlotAlert.PlotAlert, {
164
+ variant: "info",
165
+ heading: "Dotplot",
166
+ plotType: plotType,
167
+ setPlotType: setPlotType
168
+ }, /*#__PURE__*/React.createElement("p", {
169
+ className: "p-0 m-0"
170
+ }, "Select one or more", " ", showVarsBtn ? /*#__PURE__*/React.createElement(_reactBootstrap.Button, {
166
171
  variant: "link",
167
172
  className: "border-0 p-0 align-baseline",
168
173
  onClick: setShowVars
169
- }, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
174
+ }, "features") : "features", " ", "to display their expression across groups, then choose a", " ", showObsBtn ? /*#__PURE__*/React.createElement(_reactBootstrap.Button, {
170
175
  variant: "link",
171
176
  className: "border-0 p-0 align-baseline",
172
177
  onClick: setShowObs
173
- }, "category") : "category"));
178
+ }, "category") : "category", " ", "to group observations in the dotplot."));
174
179
  } else {
175
- return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
176
- variant: "danger"
177
- }, serverError.message));
180
+ return /*#__PURE__*/React.createElement(_PlotAlert.PlotAlert, {
181
+ variant: "danger",
182
+ heading: "Dotplot",
183
+ plotType: plotType,
184
+ setPlotType: setPlotType
185
+ }, serverError.message || "An unexpected error occurred while generating the plot.");
178
186
  }
179
187
  }
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.FullPage = FullPage;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
8
  var _material = require("@mui/material");
9
9
  var _reactBootstrap = require("react-bootstrap");
10
10
  var _constants = require("../../constants/constants");
@@ -27,7 +27,6 @@ var _VarList = require("../var-list/VarList");
27
27
  var _Violin = require("../violin/Violin");
28
28
  var _ViolinControls = require("../violin/ViolinControls");
29
29
  const _excluded = ["searchDiseases", "defaultPlotType"];
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); }
31
30
  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); }
32
31
  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; }
33
32
  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; }
@@ -55,6 +54,7 @@ function FullPage(_ref) {
55
54
  const XlBreakpoint = (0, _material.useMediaQuery)(_constants.BREAKPOINTS.XL);
56
55
  const showObsBtn = LgBreakpoint;
57
56
  const showVarsBtn = XlBreakpoint;
57
+ const showPlotBtn = showVarsBtn;
58
58
  const {
59
59
  plotControls,
60
60
  varMode,
@@ -91,85 +91,87 @@ function FullPage(_ref) {
91
91
  showObsBtn,
92
92
  showVarsBtn,
93
93
  showCtrlsBtn: true,
94
+ plotType,
94
95
  setShowObs,
95
96
  setShowVars,
96
- setShowControls
97
+ setShowControls,
98
+ setPlotType
97
99
  };
98
100
  switch (plotType) {
99
101
  case _constants.PLOT_TYPES.DOTPLOT:
100
- return /*#__PURE__*/_react.default.createElement(_Dotplot.Dotplot, commonProps);
102
+ return /*#__PURE__*/React.createElement(_Dotplot.Dotplot, commonProps);
101
103
  case _constants.PLOT_TYPES.MATRIXPLOT:
102
- return /*#__PURE__*/_react.default.createElement(_Matrixplot.Matrixplot, commonProps);
104
+ return /*#__PURE__*/React.createElement(_Matrixplot.Matrixplot, commonProps);
103
105
  case _constants.PLOT_TYPES.HEATMAP:
104
- return /*#__PURE__*/_react.default.createElement(_Heatmap.Heatmap, commonProps);
106
+ return /*#__PURE__*/React.createElement(_Heatmap.Heatmap, commonProps);
105
107
  case _constants.PLOT_TYPES.VIOLINPLOT:
106
- return /*#__PURE__*/_react.default.createElement(_Violin.Violin, _extends({
108
+ return /*#__PURE__*/React.createElement(_Violin.Violin, _extends({
107
109
  mode: _constants.VIOLIN_MODES.MULTIKEY
108
110
  }, commonProps));
109
111
  case _constants.PLOT_TYPES.SCATTERPLOT:
110
112
  default:
111
- return /*#__PURE__*/_react.default.createElement(_Scatterplot.Scatterplot, _extends({}, commonProps, {
113
+ return /*#__PURE__*/React.createElement(_Scatterplot.Scatterplot, _extends({}, commonProps, {
112
114
  isFullscreen: true
113
115
  }));
114
116
  }
115
117
  }, [plotType, showObsBtn, showVarsBtn]);
116
- return /*#__PURE__*/_react.default.createElement("div", {
118
+ return /*#__PURE__*/React.createElement("div", {
117
119
  className: "cherita-app"
118
- }, /*#__PURE__*/_react.default.createElement(_DatasetContext.DatasetProvider, props, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Container, {
120
+ }, /*#__PURE__*/React.createElement(_DatasetContext.DatasetProvider, props, /*#__PURE__*/React.createElement(_reactBootstrap.Container, {
119
121
  fluid: true,
120
122
  className: "cherita-app-container"
121
- }, /*#__PURE__*/_react.default.createElement("div", {
123
+ }, /*#__PURE__*/React.createElement("div", {
122
124
  className: "cherita-app-obs modern-scrollbars border-end h-100"
123
- }, /*#__PURE__*/_react.default.createElement(_ObsList.ObsColsList, _extends({}, props, {
125
+ }, /*#__PURE__*/React.createElement(_ObsList.ObsColsList, _extends({}, props, {
124
126
  showSelectedAsActive: showSelectedAsActive,
125
127
  showHistograms: varMode === _constants.SELECTION_MODES.SINGLE,
126
128
  showColor: varMode === _constants.SELECTION_MODES.SINGLE
127
- }))), /*#__PURE__*/_react.default.createElement("div", {
129
+ }))), /*#__PURE__*/React.createElement("div", {
128
130
  className: "cherita-app-canvas"
129
- }, plot), /*#__PURE__*/_react.default.createElement("div", {
131
+ }, plot), /*#__PURE__*/React.createElement("div", {
130
132
  className: "cherita-app-sidebar p-3"
131
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card.Body, null, /*#__PURE__*/_react.default.createElement("div", {
132
- className: "sidebar-plotselector"
133
- }, /*#__PURE__*/_react.default.createElement(_PlotTypeSelector.PlotTypeSelector, {
133
+ }, /*#__PURE__*/React.createElement(_reactBootstrap.Card, null, /*#__PURE__*/React.createElement(_reactBootstrap.Card.Body, null, /*#__PURE__*/React.createElement("div", {
134
+ className: "plotselector"
135
+ }, /*#__PURE__*/React.createElement(_PlotTypeSelector.PlotTypeSelector, {
134
136
  currentType: plotType,
135
137
  onChange: type => setPlotType(type)
136
- })), plotType === _constants.PLOT_TYPES.SCATTERPLOT && isPseudospatial ? /*#__PURE__*/_react.default.createElement("div", {
138
+ })), plotType === _constants.PLOT_TYPES.SCATTERPLOT && isPseudospatial ? /*#__PURE__*/React.createElement("div", {
137
139
  className: "sidebar-pseudospatial"
138
- }, /*#__PURE__*/_react.default.createElement(_Pseudospatial.Pseudospatial, {
140
+ }, /*#__PURE__*/React.createElement(_Pseudospatial.Pseudospatial, {
139
141
  plotType: pseudospatialPlotType,
140
142
  setPlotType: setpseudospatialPlotType,
141
143
  setShowControls: setShowPseudospatialControls
142
- })) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null), /*#__PURE__*/_react.default.createElement("div", {
144
+ })) : /*#__PURE__*/React.createElement(React.Fragment, null), /*#__PURE__*/React.createElement("div", {
143
145
  className: "sidebar-features"
144
- }, /*#__PURE__*/_react.default.createElement(_SearchBar.SearchBar, {
146
+ }, /*#__PURE__*/React.createElement(_SearchBar.SearchBar, {
145
147
  searchDiseases: searchDiseases,
146
148
  searchVar: true
147
- }), /*#__PURE__*/_react.default.createElement("div", {
149
+ }), /*#__PURE__*/React.createElement("div", {
148
150
  className: "sidebar-features-list"
149
- }, /*#__PURE__*/_react.default.createElement(_VarList.VarNamesList, {
151
+ }, /*#__PURE__*/React.createElement(_VarList.VarNamesList, {
150
152
  mode: varMode
151
- }))))))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal, {
153
+ }))))))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(_reactBootstrap.Modal, {
152
154
  show: showModal,
153
155
  onHide: () => setShowModal(false),
154
156
  centered: true
155
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Header, {
157
+ }, /*#__PURE__*/React.createElement(_reactBootstrap.Modal.Header, {
156
158
  closeButton: true
157
- }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Body, null)), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObs, _extends({}, props, {
159
+ }), /*#__PURE__*/React.createElement(_reactBootstrap.Modal.Body, null)), /*#__PURE__*/React.createElement(_offcanvas.OffcanvasObs, _extends({}, props, {
158
160
  showSelectedAsActive: showSelectedAsActive,
159
161
  show: showObs,
160
162
  handleClose: () => setShowObs(false)
161
- })), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasVars, {
163
+ })), /*#__PURE__*/React.createElement(_offcanvas.OffcanvasVars, {
162
164
  show: showVars,
163
165
  handleClose: () => setShowVars(false),
164
166
  mode: varMode
165
- }), plotControls && /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
167
+ }), plotControls && /*#__PURE__*/React.createElement(_offcanvas.OffcanvasControls, {
166
168
  show: showControls,
167
169
  handleClose: () => setShowControls(false),
168
170
  Controls: plotControls
169
- }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObsm, {
171
+ }), /*#__PURE__*/React.createElement(_offcanvas.OffcanvasObsm, {
170
172
  show: showObsm,
171
173
  handleClose: () => setShowObsm(false)
172
- }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
174
+ }), /*#__PURE__*/React.createElement(_offcanvas.OffcanvasControls, {
173
175
  show: showPseudospatialControls,
174
176
  handleClose: () => setShowPseudospatialControls(false),
175
177
  Controls: _PseudospatialToolbar.PseudospatialToolbar,
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.PlotAlert = PlotAlert;
7
+ var _material = require("@mui/material");
8
+ var _reactBootstrap = require("react-bootstrap");
9
+ var _constants = require("../../constants/constants");
10
+ var _PlotTypeSelector = require("./PlotTypeSelector");
11
+ function PlotAlert(_ref) {
12
+ let {
13
+ variant = "warning",
14
+ plotType = _constants.PLOT_TYPES.SCATTERPLOT,
15
+ setPlotType,
16
+ heading,
17
+ children
18
+ } = _ref;
19
+ const XlBreakpoint = (0, _material.useMediaQuery)(_constants.BREAKPOINTS.XL);
20
+ const showPlotSelector = XlBreakpoint;
21
+ return /*#__PURE__*/React.createElement(React.Fragment, null, showPlotSelector && /*#__PURE__*/React.createElement("div", {
22
+ className: "plotselector"
23
+ }, /*#__PURE__*/React.createElement(_PlotTypeSelector.PlotTypeSelector, {
24
+ currentType: plotType,
25
+ onChange: type => {
26
+ if (setPlotType) setPlotType(type);
27
+ }
28
+ })), /*#__PURE__*/React.createElement("div", {
29
+ className: "cherita-plot-alert h-100"
30
+ }, /*#__PURE__*/React.createElement("div", {
31
+ className: "w-100 h-100 d-flex justify-content-center align-items-center"
32
+ }, /*#__PURE__*/React.createElement(_reactBootstrap.Alert, {
33
+ variant: variant,
34
+ className: "m-0 w-75 w-lg-50 text-center"
35
+ }, heading && /*#__PURE__*/React.createElement(_reactBootstrap.Alert.Heading, null, heading), " ", children))));
36
+ }
@@ -4,54 +4,92 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
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"));
7
+ var _react = require("react");
13
8
  var _constants = require("../../constants/constants");
9
+ var _StyledTooltip = require("../../utils/StyledTooltip");
10
+ var _DotPlotIcon = _interopRequireDefault(require("../icons/DotPlotIcon"));
11
+ var _HeatmapIcon = _interopRequireDefault(require("../icons/HeatmapIcon"));
12
+ var _MatrixPlotIcon = _interopRequireDefault(require("../icons/MatrixPlotIcon"));
13
+ var _ScatterplotIcon = _interopRequireDefault(require("../icons/ScatterplotIcon"));
14
+ var _ViolinPlotIcon = _interopRequireDefault(require("../icons/ViolinPlotIcon"));
14
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
- const iconMap = {
16
- [_constants.PLOT_TYPES.SCATTERPLOT]: _scatterplot.default,
17
- [_constants.PLOT_TYPES.MATRIXPLOT]: _matrixplot.default,
18
- [_constants.PLOT_TYPES.HEATMAP]: _heatmap.default,
19
- [_constants.PLOT_TYPES.DOTPLOT]: _dotplot.default,
20
- [_constants.PLOT_TYPES.VIOLINPLOT]: _violin.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) {
16
+ 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; }
17
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
18
+ 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; }
19
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
20
+ 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); }
21
+ const plotTypes = [{
22
+ type: _constants.PLOT_TYPES.SCATTERPLOT,
23
+ icon: _ScatterplotIcon.default,
24
+ name: "Scatterplot",
25
+ description: "Displays cells in 2D based on dimensionality reduction."
26
+ }, {
27
+ type: _constants.PLOT_TYPES.MATRIXPLOT,
28
+ icon: _MatrixPlotIcon.default,
29
+ name: "Matrix Plot",
30
+ description: "Shows expression values of genes across categories."
31
+ }, {
32
+ type: _constants.PLOT_TYPES.DOTPLOT,
33
+ icon: _DotPlotIcon.default,
34
+ name: "Dot Plot",
35
+ description: "Shows proportion and expression of genes across groups."
36
+ }, {
37
+ type: _constants.PLOT_TYPES.HEATMAP,
38
+ icon: _HeatmapIcon.default,
39
+ name: "Heatmap",
40
+ description: "Visualises gene expression or feature activity as a colour-coded matrix."
41
+ }, {
42
+ type: _constants.PLOT_TYPES.VIOLINPLOT,
43
+ icon: _ViolinPlotIcon.default,
44
+ name: "Violin Plot",
45
+ description: "Displays distribution of gene expression across categories."
46
+ }];
47
+ function PlotTypeSelector(_ref) {
31
48
  let {
32
49
  currentType,
33
50
  onChange
34
- } = _ref2;
35
- return /*#__PURE__*/_react.default.createElement("div", {
51
+ } = _ref;
52
+ const [hoveredMap, setHoveredMap] = (0, _react.useState)({});
53
+ const handleMouseEnter = type => setHoveredMap(prev => _objectSpread(_objectSpread({}, prev), {}, {
54
+ [type]: true
55
+ }));
56
+ const handleMouseLeave = type => setHoveredMap(prev => _objectSpread(_objectSpread({}, prev), {}, {
57
+ [type]: false
58
+ }));
59
+ return /*#__PURE__*/React.createElement("div", {
36
60
  className: "d-flex gap-2 justify-content-between"
37
- }, plotTypes.map(_ref3 => {
61
+ }, plotTypes.map(_ref2 => {
38
62
  let {
39
63
  type,
40
- icon,
41
- alt
42
- } = _ref3;
43
- return /*#__PURE__*/_react.default.createElement("img", {
64
+ icon: Icon,
65
+ name,
66
+ description
67
+ } = _ref2;
68
+ const isActive = currentType === type;
69
+ const hovered = hoveredMap[type] || false;
70
+ const colour = isActive ? "#005a86" : hovered ? "#0071a7" : "#000";
71
+ return /*#__PURE__*/React.createElement(_StyledTooltip.StyledTooltip, {
44
72
  key: type,
45
- src: icon,
46
- alt: alt,
47
- height: 32,
48
- width: 32,
49
- className: "plotselector-icon".concat(currentType === type ? " active" : ""),
73
+ title: /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement("strong", null, name), /*#__PURE__*/React.createElement("br", null), description),
74
+ placement: "bottom",
75
+ slotProps: {
76
+ popper: {
77
+ modifiers: [{
78
+ name: "offset",
79
+ options: {
80
+ offset: [0, -12]
81
+ }
82
+ }]
83
+ }
84
+ }
85
+ }, /*#__PURE__*/React.createElement("div", {
86
+ onMouseEnter: () => handleMouseEnter(type),
87
+ onMouseLeave: () => handleMouseLeave(type),
50
88
  onClick: () => onChange(type),
51
- style: {
52
- borderBottom: currentType === type ? "2px solid #007bff" : "none"
53
- },
54
- title: alt
55
- });
89
+ className: "plotselector-icon".concat(isActive ? " active" : "")
90
+ }, /*#__PURE__*/React.createElement(Icon, {
91
+ size: 34,
92
+ colour: colour
93
+ })));
56
94
  }));
57
95
  }
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Heatmap = Heatmap;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = 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"));
@@ -15,9 +15,9 @@ var _SettingsContext = require("../../context/SettingsContext");
15
15
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
16
16
  var _requests = require("../../utils/requests");
17
17
  var _Resolver = require("../../utils/Resolver");
18
+ var _PlotAlert = require("../full-page/PlotAlert");
18
19
  var _Toolbar = require("../toolbar/Toolbar");
19
20
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
- 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); }
21
21
  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; }
22
22
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
23
23
  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; }
@@ -30,7 +30,9 @@ function Heatmap(_ref) {
30
30
  showCtrlsBtn = false,
31
31
  setShowObs,
32
32
  setShowVars,
33
- setShowControls
33
+ setShowControls,
34
+ plotType,
35
+ setPlotType
34
36
  } = _ref;
35
37
  const ENDPOINT = "heatmap";
36
38
  const dataset = (0, _DatasetContext.useDataset)();
@@ -113,9 +115,9 @@ function Heatmap(_ref) {
113
115
  const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
114
116
  if (!serverError) {
115
117
  if (hasSelections) {
116
- return /*#__PURE__*/_react.default.createElement("div", {
118
+ return /*#__PURE__*/React.createElement("div", {
117
119
  className: "cherita-plot cherita-heatmap position-relative"
118
- }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
120
+ }, isPending && /*#__PURE__*/React.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/React.createElement(_reactPlotly.default, {
119
121
  data: data,
120
122
  layout: layout,
121
123
  useResizeHandler: true,
@@ -129,22 +131,28 @@ function Heatmap(_ref) {
129
131
  }
130
132
  }));
131
133
  }
132
- return /*#__PURE__*/_react.default.createElement("div", {
133
- className: "cherita-heatmap"
134
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
135
- variant: "light"
136
- }, "Select", " ", showVarsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
134
+ return /*#__PURE__*/React.createElement(_PlotAlert.PlotAlert, {
135
+ variant: "info",
136
+ heading: "Heatmap",
137
+ plotType: plotType,
138
+ setPlotType: setPlotType
139
+ }, /*#__PURE__*/React.createElement("p", {
140
+ className: "p-0 m-0"
141
+ }, "Select one or more", " ", showVarsBtn ? /*#__PURE__*/React.createElement(_reactBootstrap.Button, {
137
142
  variant: "link",
138
143
  className: "border-0 p-0 align-baseline",
139
144
  onClick: setShowVars
140
- }, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
145
+ }, "features") : "features", " ", "to display their expression, then choose a", " ", showObsBtn ? /*#__PURE__*/React.createElement(_reactBootstrap.Button, {
141
146
  variant: "link",
142
147
  className: "border-0 p-0 align-baseline",
143
148
  onClick: setShowObs
144
- }, "category") : "category"));
149
+ }, "category") : "category", " ", "to group observations in the heatmap."));
145
150
  } else {
146
- return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
147
- variant: "danger"
148
- }, serverError.message));
151
+ return /*#__PURE__*/React.createElement(_PlotAlert.PlotAlert, {
152
+ variant: "danger",
153
+ heading: "Heatmap",
154
+ plotType: plotType,
155
+ setPlotType: setPlotType
156
+ }, serverError.message || "An unexpected error occurred while generating the plot.");
149
157
  }
150
158
  }
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = DotPlotIcon;
7
+ const _excluded = ["size", "colour", "gap"];
8
+ 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); }
9
+ 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; }
10
+ 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; }
11
+ function DotPlotIcon(_ref) {
12
+ let {
13
+ size = 40,
14
+ colour = "#000",
15
+ gap = 20
16
+ } = _ref,
17
+ props = _objectWithoutProperties(_ref, _excluded);
18
+ const rows = 3;
19
+ const cols = 3;
20
+
21
+ // Define two radii: small and large
22
+ const smallR = 10;
23
+ const largeR = 16;
24
+
25
+ // Indices for large circles
26
+ const largeIndices = [1, 4, 5, 6, 7];
27
+
28
+ // Indices for semi-transparent circles
29
+ const semiTransparentIndices = [0, 4, 8];
30
+ const circles = [];
31
+ for (let row = 0; row < rows; row++) {
32
+ for (let col = 0; col < cols; col++) {
33
+ const index = row * cols + col;
34
+ const r = largeIndices.includes(index) ? largeR : smallR;
35
+ circles.push({
36
+ cx: col * (2 * largeR + gap) + largeR,
37
+ cy: row * (2 * largeR + gap) + largeR,
38
+ r,
39
+ fill: colour,
40
+ fillOpacity: semiTransparentIndices.includes(index) ? 0.5 : 1
41
+ });
42
+ }
43
+ }
44
+ const viewBoxSize = (cols - 1) * (2 * largeR + gap) + 2 * largeR;
45
+ return /*#__PURE__*/React.createElement("svg", _extends({
46
+ width: size,
47
+ height: size,
48
+ viewBox: "0 0 ".concat(viewBoxSize, " ").concat(viewBoxSize),
49
+ xmlns: "http://www.w3.org/2000/svg"
50
+ }, props), circles.map((circle, i) => /*#__PURE__*/React.createElement("circle", {
51
+ key: i,
52
+ cx: circle.cx,
53
+ cy: circle.cy,
54
+ r: circle.r,
55
+ fill: circle.fill,
56
+ fillOpacity: circle.fillOpacity
57
+ })));
58
+ }
@@ -0,0 +1,39 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = HeatmapIcon;
7
+ const _excluded = ["size", "colour", "gap"];
8
+ 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); }
9
+ 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; }
10
+ 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; }
11
+ function HeatmapIcon(_ref) {
12
+ let {
13
+ size = 40,
14
+ colour = "#000",
15
+ gap = 1
16
+ } = _ref,
17
+ props = _objectWithoutProperties(_ref, _excluded);
18
+ const rows = 6; // genes
19
+ const cols = 8; // cells
20
+
21
+ // Example expression pattern for visual clusters
22
+ const expressionLevels = [[1, 0.8, 0.2, 0.2, 0.5, 0.9, 1, 0.7], [0.9, 0.7, 0.1, 0.2, 0.4, 0.8, 0.9, 0.6], [0.1, 0.2, 0.8, 0.9, 0.7, 0.2, 0.1, 0.3], [0.2, 0.3, 0.9, 1, 0.8, 0.3, 0.2, 0.4], [0.5, 0.6, 0.2, 0.1, 0.9, 0.7, 0.6, 0.8], [0.6, 0.7, 0.3, 0.2, 0.8, 0.6, 0.7, 0.9]];
23
+ const cellWidth = (size - (cols - 1) * gap) / cols;
24
+ const cellHeight = (size - (rows - 1) * gap) / rows;
25
+ return /*#__PURE__*/React.createElement("svg", _extends({
26
+ width: size,
27
+ height: size,
28
+ viewBox: "0 0 ".concat(size, " ").concat(size),
29
+ xmlns: "http://www.w3.org/2000/svg"
30
+ }, props), expressionLevels.map((row, rowIndex) => row.map((value, colIndex) => /*#__PURE__*/React.createElement("rect", {
31
+ key: "".concat(rowIndex, "-").concat(colIndex),
32
+ x: colIndex * (cellWidth + gap),
33
+ y: rowIndex * (cellHeight + gap),
34
+ width: cellWidth,
35
+ height: cellHeight,
36
+ fill: colour,
37
+ fillOpacity: value
38
+ }))));
39
+ }
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = MatrixPlotIcon;
7
+ const _excluded = ["size", "colour", "gap"];
8
+ 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); }
9
+ 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; }
10
+ 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; }
11
+ function MatrixPlotIcon(_ref) {
12
+ let {
13
+ size = 40,
14
+ colour = "#000",
15
+ gap = 2
16
+ } = _ref,
17
+ props = _objectWithoutProperties(_ref, _excluded);
18
+ const rows = 4;
19
+ const cols = 4;
20
+ const squareSize = (size - gap * (cols - 1)) / cols;
21
+ const squares = [];
22
+ for (let row = 0; row < rows; row++) {
23
+ for (let col = 0; col < cols; col++) {
24
+ squares.push({
25
+ x: col * (squareSize + gap),
26
+ y: row * (squareSize + gap)
27
+ });
28
+ }
29
+ }
30
+ const semiTransparentSquares = [0, 5, 10, 15];
31
+ return /*#__PURE__*/React.createElement("svg", _extends({
32
+ width: size,
33
+ height: size,
34
+ viewBox: "0 0 ".concat(size, " ").concat(size),
35
+ xmlns: "http://www.w3.org/2000/svg"
36
+ }, props), squares.map((_ref2, i) => {
37
+ let {
38
+ x,
39
+ y
40
+ } = _ref2;
41
+ return /*#__PURE__*/React.createElement("rect", {
42
+ key: i,
43
+ x: x,
44
+ y: y,
45
+ width: squareSize,
46
+ height: squareSize,
47
+ fill: colour,
48
+ fillOpacity: semiTransparentSquares.includes(i) ? 0.5 : 1
49
+ });
50
+ }));
51
+ }