@haniffalab/cherita-react 1.4.1 → 1.4.2-dev.2025-10-29.e8bbb191

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 (138) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/controls/Controls.js +38 -30
  3. package/dist/cjs/components/dotplot/Dotplot.js +67 -69
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +100 -74
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +89 -44
  8. package/dist/cjs/components/heatmap/Heatmap.js +65 -65
  9. package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
  10. package/dist/cjs/components/icons/DotPlotIcon.js +64 -0
  11. package/dist/cjs/components/icons/HeatmapIcon.js +45 -0
  12. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +57 -0
  13. package/dist/cjs/components/icons/MatrixPlotIcon.js +59 -0
  14. package/dist/cjs/components/icons/ScatterplotIcon.1.js +164 -0
  15. package/dist/cjs/components/icons/ScatterplotIcon.js +144 -0
  16. package/dist/cjs/components/icons/ViolinPlotIcon.js +42 -0
  17. package/dist/cjs/components/matrixplot/Matrixplot.js +65 -66
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +258 -210
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -133
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +53 -38
  23. package/dist/cjs/components/offcanvas/index.js +61 -31
  24. package/dist/cjs/components/pseudospatial/Pseudospatial.js +132 -76
  25. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +122 -74
  26. package/dist/cjs/components/scatterplot/Scatterplot.js +127 -99
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +140 -113
  29. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  30. package/dist/cjs/components/search-bar/SearchBar.js +168 -121
  31. package/dist/cjs/components/search-bar/SearchInfo.js +76 -50
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +46 -37
  34. package/dist/cjs/components/var-list/VarItem.js +115 -88
  35. package/dist/cjs/components/var-list/VarList.js +85 -69
  36. package/dist/cjs/components/var-list/VarListToolbar.js +59 -54
  37. package/dist/cjs/components/var-list/VarSet.js +126 -108
  38. package/dist/cjs/components/violin/Violin.js +109 -107
  39. package/dist/cjs/components/violin/ViolinControls.js +8 -5
  40. package/dist/cjs/constants/colorscales.js +19 -19
  41. package/dist/cjs/constants/constants.js +47 -47
  42. package/dist/cjs/context/DatasetContext.js +24 -16
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +255 -89
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/zarr-helper.js +3 -3
  48. package/dist/cjs/utils/Filter.js +16 -11
  49. package/dist/cjs/utils/Histogram.js +35 -33
  50. package/dist/cjs/utils/ImageViewer.js +11 -8
  51. package/dist/cjs/utils/Legend.js +37 -30
  52. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  53. package/dist/cjs/utils/Resolver.js +213 -0
  54. package/dist/cjs/utils/Skeleton.js +10 -10
  55. package/dist/cjs/utils/StyledTooltip.js +44 -0
  56. package/dist/cjs/utils/VirtualizedList.js +34 -27
  57. package/dist/cjs/utils/errors.js +15 -15
  58. package/dist/cjs/utils/requests.js +21 -9
  59. package/dist/cjs/utils/search.js +4 -4
  60. package/dist/cjs/utils/string.js +6 -6
  61. package/dist/cjs/utils/zarrData.js +20 -21
  62. package/dist/css/cherita.css +64 -42
  63. package/dist/css/cherita.css.map +1 -1
  64. package/dist/esm/components/controls/Controls.js +43 -35
  65. package/dist/esm/components/dotplot/Dotplot.js +77 -78
  66. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  67. package/dist/esm/components/full-page/FullPage.js +120 -93
  68. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  69. package/dist/esm/components/full-page/PlotTypeSelector.js +90 -45
  70. package/dist/esm/components/heatmap/Heatmap.js +75 -74
  71. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  72. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  73. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  74. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  75. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  76. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  77. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  78. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  79. package/dist/esm/components/matrixplot/Matrixplot.js +75 -75
  80. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  81. package/dist/esm/components/obs-list/ObsItem.js +273 -222
  82. package/dist/esm/components/obs-list/ObsList.js +176 -147
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +60 -44
  85. package/dist/esm/components/offcanvas/index.js +67 -37
  86. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  87. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  88. package/dist/esm/components/scatterplot/Scatterplot.js +148 -119
  89. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  90. package/dist/esm/components/scatterplot/SpatialControls.js +153 -125
  91. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  92. package/dist/esm/components/search-bar/SearchBar.js +180 -132
  93. package/dist/esm/components/search-bar/SearchInfo.js +86 -59
  94. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  95. package/dist/esm/components/toolbar/Toolbar.js +49 -39
  96. package/dist/esm/components/var-list/VarItem.js +126 -98
  97. package/dist/esm/components/var-list/VarList.js +99 -82
  98. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  99. package/dist/esm/components/var-list/VarSet.js +134 -115
  100. package/dist/esm/components/violin/Violin.js +121 -118
  101. package/dist/esm/components/violin/ViolinControls.js +10 -6
  102. package/dist/esm/constants/colorscales.js +19 -19
  103. package/dist/esm/constants/constants.js +47 -47
  104. package/dist/esm/context/DatasetContext.js +31 -22
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +257 -90
  107. package/dist/esm/context/ZarrDataContext.js +8 -6
  108. package/dist/esm/helpers/color-helper.js +5 -5
  109. package/dist/esm/helpers/map-helper.js +2 -2
  110. package/dist/esm/helpers/zarr-helper.js +6 -6
  111. package/dist/esm/index.js +22 -22
  112. package/dist/esm/utils/Filter.js +22 -17
  113. package/dist/esm/utils/Histogram.js +39 -37
  114. package/dist/esm/utils/ImageViewer.js +12 -8
  115. package/dist/esm/utils/Legend.js +44 -36
  116. package/dist/esm/utils/LoadingIndicators.js +16 -13
  117. package/dist/esm/utils/Resolver.js +201 -0
  118. package/dist/esm/utils/Skeleton.js +11 -10
  119. package/dist/esm/utils/StyledTooltip.js +38 -0
  120. package/dist/esm/utils/VirtualizedList.js +35 -27
  121. package/dist/esm/utils/errors.js +15 -15
  122. package/dist/esm/utils/requests.js +24 -12
  123. package/dist/esm/utils/search.js +7 -7
  124. package/dist/esm/utils/string.js +7 -7
  125. package/dist/esm/utils/zarrData.js +27 -28
  126. package/package.json +21 -9
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +43 -17
  129. package/scss/components/accordions.scss +4 -1
  130. package/scss/components/layouts.scss +15 -33
  131. package/scss/components/lists.scss +8 -4
  132. package/scss/components/plotly.scss +38 -26
  133. package/scss/components/plots.scss +14 -1
  134. package/dist/assets/images/plots/dotplot.svg +0 -152
  135. package/dist/assets/images/plots/heatmap.svg +0 -193
  136. package/dist/assets/images/plots/matrixplot.svg +0 -275
  137. package/dist/assets/images/plots/scatterplot.svg +0 -198
  138. package/dist/assets/images/plots/violin.svg +0 -50
@@ -4,20 +4,20 @@ 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");
11
11
  var _DatasetContext = require("../../context/DatasetContext");
12
12
  var _Dotplot = require("../dotplot/Dotplot");
13
13
  var _DotplotControls = require("../dotplot/DotplotControls");
14
- var _PlotTypeSelector = require("../full-page/PlotTypeSelector");
15
14
  var _Heatmap = require("../heatmap/Heatmap");
16
15
  var _HeatmapControls = require("../heatmap/HeatmapControls");
17
16
  var _Matrixplot = require("../matrixplot/Matrixplot");
18
17
  var _MatrixplotControls = require("../matrixplot/MatrixplotControls");
19
18
  var _ObsList = require("../obs-list/ObsList");
20
19
  var _offcanvas = require("../offcanvas");
20
+ var _PlotTypeSelector = require("./PlotTypeSelector");
21
21
  var _Pseudospatial = require("../pseudospatial/Pseudospatial");
22
22
  var _PseudospatialToolbar = require("../pseudospatial/PseudospatialToolbar");
23
23
  var _Scatterplot = require("../scatterplot/Scatterplot");
@@ -26,14 +26,17 @@ var _SearchBar = require("../search-bar/SearchBar");
26
26
  var _VarList = require("../var-list/VarList");
27
27
  var _Violin = require("../violin/Violin");
28
28
  var _ViolinControls = require("../violin/ViolinControls");
29
- const _excluded = ["isPseudospatial", "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
- 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); }
29
+ var _jsxRuntime = require("react/jsx-runtime");
30
+ const _excluded = ["searchDiseases", "defaultPlotType"];
31
+ 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; }
32
+ 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; }
33
+ 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; }
34
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
35
+ 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); }
32
36
  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
37
  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; }
34
38
  function FullPage(_ref) {
35
39
  let {
36
- isPseudospatial = false,
37
40
  searchDiseases = true,
38
41
  defaultPlotType = _constants.PLOT_TYPES.SCATTERPLOT
39
42
  } = _ref,
@@ -46,6 +49,9 @@ function FullPage(_ref) {
46
49
  const [plotType, setPlotType] = (0, _react.useState)(defaultPlotType || _constants.PLOT_TYPES.SCATTERPLOT);
47
50
  const [showPseudospatialControls, setShowPseudospatialControls] = (0, _react.useState)(false);
48
51
  const [pseudospatialPlotType, setpseudospatialPlotType] = (0, _react.useState)(null);
52
+ const {
53
+ isPseudospatial = false
54
+ } = props;
49
55
  (0, _react.useEffect)(() => {
50
56
  setPlotType(defaultPlotType || _constants.PLOT_TYPES.SCATTERPLOT);
51
57
  }, [defaultPlotType]);
@@ -89,88 +95,108 @@ function FullPage(_ref) {
89
95
  showObsBtn,
90
96
  showVarsBtn,
91
97
  showCtrlsBtn: true,
98
+ plotType,
92
99
  setShowObs,
93
100
  setShowVars,
94
- setShowControls
101
+ setShowControls,
102
+ setPlotType
95
103
  };
96
104
  switch (plotType) {
97
105
  case _constants.PLOT_TYPES.DOTPLOT:
98
- return /*#__PURE__*/_react.default.createElement(_Dotplot.Dotplot, commonProps);
106
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Dotplot.Dotplot, _objectSpread({}, commonProps));
99
107
  case _constants.PLOT_TYPES.MATRIXPLOT:
100
- return /*#__PURE__*/_react.default.createElement(_Matrixplot.Matrixplot, commonProps);
108
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Matrixplot.Matrixplot, _objectSpread({}, commonProps));
101
109
  case _constants.PLOT_TYPES.HEATMAP:
102
- return /*#__PURE__*/_react.default.createElement(_Heatmap.Heatmap, commonProps);
110
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Heatmap.Heatmap, _objectSpread({}, commonProps));
103
111
  case _constants.PLOT_TYPES.VIOLINPLOT:
104
- return /*#__PURE__*/_react.default.createElement(_Violin.Violin, _extends({
112
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Violin.Violin, _objectSpread({
105
113
  mode: _constants.VIOLIN_MODES.MULTIKEY
106
114
  }, commonProps));
107
115
  case _constants.PLOT_TYPES.SCATTERPLOT:
108
116
  default:
109
- return /*#__PURE__*/_react.default.createElement(_Scatterplot.Scatterplot, _extends({}, commonProps, {
117
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Scatterplot.Scatterplot, _objectSpread(_objectSpread({}, commonProps), {}, {
110
118
  isFullscreen: true
111
119
  }));
112
120
  }
113
121
  }, [plotType, showObsBtn, showVarsBtn]);
114
- return /*#__PURE__*/_react.default.createElement("div", {
115
- className: "cherita-app"
116
- }, /*#__PURE__*/_react.default.createElement(_DatasetContext.DatasetProvider, props, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Container, {
117
- fluid: true,
118
- className: "cherita-app-container"
119
- }, /*#__PURE__*/_react.default.createElement("div", {
120
- className: "cherita-app-obs modern-scrollbars border-end h-100"
121
- }, /*#__PURE__*/_react.default.createElement(_ObsList.ObsColsList, _extends({}, props, {
122
- showSelectedAsActive: showSelectedAsActive,
123
- showHistograms: varMode === _constants.SELECTION_MODES.SINGLE,
124
- showColor: varMode === _constants.SELECTION_MODES.SINGLE
125
- }))), /*#__PURE__*/_react.default.createElement("div", {
126
- className: "cherita-app-canvas"
127
- }, plot), /*#__PURE__*/_react.default.createElement("div", {
128
- className: "cherita-app-sidebar p-3"
129
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Card.Body, null, /*#__PURE__*/_react.default.createElement("div", {
130
- className: "sidebar-plotselector"
131
- }, /*#__PURE__*/_react.default.createElement(_PlotTypeSelector.PlotTypeSelector, {
132
- currentType: plotType,
133
- onChange: type => setPlotType(type)
134
- })), plotType === _constants.PLOT_TYPES.SCATTERPLOT && isPseudospatial ? /*#__PURE__*/_react.default.createElement("div", {
135
- className: "sidebar-pseudospatial"
136
- }, /*#__PURE__*/_react.default.createElement(_Pseudospatial.Pseudospatial, {
137
- plotType: pseudospatialPlotType,
138
- setPlotType: setpseudospatialPlotType,
139
- setShowControls: setShowPseudospatialControls
140
- })) : /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null), /*#__PURE__*/_react.default.createElement("div", {
141
- className: "sidebar-features"
142
- }, /*#__PURE__*/_react.default.createElement(_SearchBar.SearchBar, {
143
- searchDiseases: searchDiseases,
144
- searchVar: true
145
- }), /*#__PURE__*/_react.default.createElement("div", {
146
- className: "sidebar-features-list"
147
- }, /*#__PURE__*/_react.default.createElement(_VarList.VarNamesList, {
148
- mode: varMode
149
- }))))))), /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal, {
150
- show: showModal,
151
- onHide: () => setShowModal(false),
152
- centered: true
153
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Header, {
154
- closeButton: true
155
- }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Modal.Body, null)), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObs, _extends({}, props, {
156
- showSelectedAsActive: showSelectedAsActive,
157
- show: showObs,
158
- handleClose: () => setShowObs(false)
159
- })), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasVars, {
160
- show: showVars,
161
- handleClose: () => setShowVars(false),
162
- mode: varMode
163
- }), plotControls && /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
164
- show: showControls,
165
- handleClose: () => setShowControls(false),
166
- Controls: plotControls
167
- }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasObsm, {
168
- show: showObsm,
169
- handleClose: () => setShowObsm(false)
170
- }), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
171
- show: showPseudospatialControls,
172
- handleClose: () => setShowPseudospatialControls(false),
173
- Controls: _PseudospatialToolbar.PseudospatialToolbar,
174
- plotType: pseudospatialPlotType
175
- }))));
122
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
123
+ className: "cherita-app",
124
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_DatasetContext.DatasetProvider, _objectSpread(_objectSpread({}, props), {}, {
125
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Container, {
126
+ fluid: true,
127
+ className: "cherita-app-container",
128
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
129
+ className: "cherita-app-obs modern-scrollbars border-end h-100",
130
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsList.ObsColsList, _objectSpread(_objectSpread({}, props), {}, {
131
+ showSelectedAsActive: showSelectedAsActive,
132
+ showHistograms: varMode === _constants.SELECTION_MODES.SINGLE,
133
+ showColor: varMode === _constants.SELECTION_MODES.SINGLE
134
+ }))
135
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
136
+ className: "cherita-app-canvas",
137
+ children: plot
138
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
139
+ className: "cherita-app-sidebar p-3",
140
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Card, {
141
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Card.Body, {
142
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
143
+ className: "plotselector",
144
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotTypeSelector.PlotTypeSelector, {
145
+ currentType: plotType,
146
+ onChange: type => setPlotType(type)
147
+ })
148
+ }), plotType === _constants.PLOT_TYPES.SCATTERPLOT && isPseudospatial ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
149
+ className: "sidebar-pseudospatial",
150
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Pseudospatial.Pseudospatial, {
151
+ plotType: pseudospatialPlotType,
152
+ setPlotType: setpseudospatialPlotType,
153
+ setShowControls: setShowPseudospatialControls
154
+ })
155
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
156
+ className: "sidebar-features",
157
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchBar.SearchBar, {
158
+ searchDiseases: searchDiseases,
159
+ searchVar: true
160
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
161
+ className: "sidebar-features-list",
162
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_VarList.VarNamesList, {
163
+ mode: varMode
164
+ })
165
+ })]
166
+ })]
167
+ })
168
+ })
169
+ })]
170
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
171
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Modal, {
172
+ show: showModal,
173
+ onHide: () => setShowModal(false),
174
+ centered: true,
175
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Modal.Header, {
176
+ closeButton: true
177
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Modal.Body, {})]
178
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_offcanvas.OffcanvasObs, _objectSpread(_objectSpread({}, props), {}, {
179
+ showSelectedAsActive: showSelectedAsActive,
180
+ show: showObs,
181
+ handleClose: () => setShowObs(false)
182
+ })), /*#__PURE__*/(0, _jsxRuntime.jsx)(_offcanvas.OffcanvasVars, {
183
+ show: showVars,
184
+ handleClose: () => setShowVars(false),
185
+ mode: varMode
186
+ }), plotControls && /*#__PURE__*/(0, _jsxRuntime.jsx)(_offcanvas.OffcanvasControls, {
187
+ show: showControls,
188
+ handleClose: () => setShowControls(false),
189
+ Controls: plotControls
190
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_offcanvas.OffcanvasObsm, {
191
+ show: showObsm,
192
+ handleClose: () => setShowObsm(false)
193
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_offcanvas.OffcanvasControls, {
194
+ show: showPseudospatialControls,
195
+ handleClose: () => setShowPseudospatialControls(false),
196
+ Controls: _PseudospatialToolbar.PseudospatialToolbar,
197
+ plotType: pseudospatialPlotType
198
+ })]
199
+ })]
200
+ }))
201
+ });
176
202
  }
@@ -0,0 +1,45 @@
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 _PlotTypeSelector = require("./PlotTypeSelector");
10
+ var _constants = require("../../constants/constants");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function PlotAlert(_ref) {
13
+ let {
14
+ variant = 'warning',
15
+ plotType = _constants.PLOT_TYPES.SCATTERPLOT,
16
+ setPlotType,
17
+ heading,
18
+ children
19
+ } = _ref;
20
+ const XlBreakpoint = (0, _material.useMediaQuery)(_constants.BREAKPOINTS.XL);
21
+ const showPlotSelector = XlBreakpoint;
22
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
23
+ children: [showPlotSelector && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
24
+ className: "plotselector",
25
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotTypeSelector.PlotTypeSelector, {
26
+ currentType: plotType,
27
+ onChange: type => {
28
+ if (setPlotType) setPlotType(type);
29
+ }
30
+ })
31
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
32
+ className: "cherita-plot-alert h-100",
33
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
34
+ className: "w-100 h-100 d-flex justify-content-center align-items-center",
35
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Alert, {
36
+ variant: variant,
37
+ className: "m-0 w-75 w-lg-50 text-center",
38
+ children: [heading && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert.Heading, {
39
+ children: heading
40
+ }), " ", children]
41
+ })
42
+ })
43
+ })]
44
+ });
45
+ }
@@ -4,54 +4,99 @@ 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"));
15
+ var _jsxRuntime = require("react/jsx-runtime");
14
16
  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) {
17
+ 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; }
18
+ 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; }
19
+ 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; }
20
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
21
+ 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); }
22
+ const plotTypes = [{
23
+ type: _constants.PLOT_TYPES.SCATTERPLOT,
24
+ icon: _ScatterplotIcon.default,
25
+ name: 'Scatterplot',
26
+ description: 'Displays cells in 2D based on dimensionality reduction.'
27
+ }, {
28
+ type: _constants.PLOT_TYPES.MATRIXPLOT,
29
+ icon: _MatrixPlotIcon.default,
30
+ name: 'Matrix Plot',
31
+ description: 'Shows expression values of genes across categories.'
32
+ }, {
33
+ type: _constants.PLOT_TYPES.DOTPLOT,
34
+ icon: _DotPlotIcon.default,
35
+ name: 'Dot Plot',
36
+ description: 'Shows proportion and expression of genes across groups.'
37
+ }, {
38
+ type: _constants.PLOT_TYPES.HEATMAP,
39
+ icon: _HeatmapIcon.default,
40
+ name: 'Heatmap',
41
+ description: 'Visualises gene expression or feature activity as a colour-coded matrix.'
42
+ }, {
43
+ type: _constants.PLOT_TYPES.VIOLINPLOT,
44
+ icon: _ViolinPlotIcon.default,
45
+ name: 'Violin Plot',
46
+ description: 'Displays distribution of gene expression across categories.'
47
+ }];
48
+ function PlotTypeSelector(_ref) {
31
49
  let {
32
50
  currentType,
33
51
  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
- });
52
+ } = _ref;
53
+ const [hoveredMap, setHoveredMap] = (0, _react.useState)({});
54
+ const handleMouseEnter = type => setHoveredMap(prev => _objectSpread(_objectSpread({}, prev), {}, {
55
+ [type]: true
56
+ }));
57
+ const handleMouseLeave = type => setHoveredMap(prev => _objectSpread(_objectSpread({}, prev), {}, {
58
+ [type]: false
56
59
  }));
60
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
61
+ className: "d-flex gap-2 justify-content-between",
62
+ children: plotTypes.map(_ref2 => {
63
+ let {
64
+ type,
65
+ icon: Icon,
66
+ name,
67
+ description
68
+ } = _ref2;
69
+ const isActive = currentType === type;
70
+ const hovered = hoveredMap[type] || false;
71
+ const colour = isActive ? '#005a86' : hovered ? '#0071a7' : '#000';
72
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_StyledTooltip.StyledTooltip, {
73
+ title: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
74
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("strong", {
75
+ children: name
76
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("br", {}), description]
77
+ }),
78
+ placement: "bottom",
79
+ slotProps: {
80
+ popper: {
81
+ modifiers: [{
82
+ name: 'offset',
83
+ options: {
84
+ offset: [0, -12]
85
+ }
86
+ }]
87
+ }
88
+ },
89
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
90
+ onMouseEnter: () => handleMouseEnter(type),
91
+ onMouseLeave: () => handleMouseLeave(type),
92
+ onClick: () => onChange(type),
93
+ className: "plotselector-icon".concat(isActive ? ' active' : ''),
94
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Icon, {
95
+ size: 34,
96
+ colour: colour
97
+ })
98
+ })
99
+ }, type);
100
+ })
101
+ });
57
102
  }
@@ -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"));
@@ -14,25 +14,28 @@ var _FilterContext = require("../../context/FilterContext");
14
14
  var _SettingsContext = require("../../context/SettingsContext");
15
15
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
16
16
  var _requests = require("../../utils/requests");
17
+ var _Resolver = require("../../utils/Resolver");
18
+ var _PlotAlert = require("../full-page/PlotAlert");
17
19
  var _Toolbar = require("../toolbar/Toolbar");
20
+ var _jsxRuntime = require("react/jsx-runtime");
18
21
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
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); }
20
22
  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; }
21
23
  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; }
22
24
  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; }
23
25
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
24
26
  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); }
25
27
  function Heatmap(_ref) {
26
- var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
27
28
  let {
28
29
  showObsBtn = false,
29
30
  showVarsBtn = false,
30
31
  showCtrlsBtn = false,
31
32
  setShowObs,
32
33
  setShowVars,
33
- setShowControls
34
+ setShowControls,
35
+ plotType,
36
+ setPlotType
34
37
  } = _ref;
35
- const ENDPOINT = "heatmap";
38
+ const ENDPOINT = 'heatmap';
36
39
  const dataset = (0, _DatasetContext.useDataset)();
37
40
  const settings = (0, _SettingsContext.useSettings)();
38
41
  const {
@@ -43,44 +46,26 @@ function Heatmap(_ref) {
43
46
  const [data, setData] = (0, _react.useState)([]);
44
47
  const [layout, setLayout] = (0, _react.useState)({});
45
48
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
46
- const [params, setParams] = (0, _react.useState)({
49
+ const selectedObs = (0, _Resolver.useSelectedObs)();
50
+ const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
51
+ const params = (0, _react.useMemo)(() => ({
47
52
  url: dataset.url,
48
- obsCol: settings.selectedObs,
49
- obsValues: !((_settings$selectedObs = settings.selectedObs) !== null && _settings$selectedObs !== void 0 && _settings$selectedObs.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.codes), (_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.omit).map(c => {
50
- var _settings$selectedObs4;
51
- return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
52
- }),
53
- varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
53
+ obsCol: selectedObs,
54
+ obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
55
+ varKeys: selectedMultiVar.map(i => i.isSet ? {
54
56
  name: i.name,
55
57
  indices: i.vars.map(v => v.index)
56
58
  } : i.index),
57
59
  obsIndices: isSliced ? [...(obsIndices || [])] : null,
58
60
  varNamesCol: dataset.varNamesCol
59
- });
61
+ }), [dataset.url, dataset.varNamesCol, isSliced, obsIndices, selectedMultiVar, selectedObs]);
60
62
  (0, _react.useEffect)(() => {
61
- if (settings.selectedObs && settings.selectedMultiVar.length) {
63
+ if (selectedObs && selectedMultiVar.length) {
62
64
  setHasSelections(true);
63
65
  } else {
64
66
  setHasSelections(false);
65
67
  }
66
- setParams(p => {
67
- var _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
68
- return _objectSpread(_objectSpread({}, p), {}, {
69
- url: dataset.url,
70
- obsCol: settings.selectedObs,
71
- obsValues: !((_settings$selectedObs5 = settings.selectedObs) !== null && _settings$selectedObs5 !== void 0 && _settings$selectedObs5.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.codes), (_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.omit).map(c => {
72
- var _settings$selectedObs8;
73
- return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
74
- }),
75
- varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
76
- name: i.name,
77
- indices: i.vars.map(v => v.index)
78
- } : i.index),
79
- obsIndices: isSliced ? [...(obsIndices || [])] : null,
80
- varNamesCol: dataset.varNamesCol
81
- });
82
- });
83
- }, [settings.selectedMultiVar, settings.selectedObs, dataset.url, dataset.varNamesCol, obsIndices, isSliced]);
68
+ }, [selectedMultiVar, selectedObs, dataset.url, dataset.varNamesCol, obsIndices, isSliced]);
84
69
  const updateColorscale = (0, _react.useCallback)(colorscale => {
85
70
  setLayout(l => {
86
71
  return _objectSpread(_objectSpread({}, l), {}, {
@@ -95,13 +80,16 @@ function Heatmap(_ref) {
95
80
  isPending,
96
81
  serverError
97
82
  } = (0, _requests.useDebouncedFetch)(ENDPOINT, params, 500, {
98
- enabled: !!params.obsCol && !!params.varKeys.length
83
+ isEnabled: params => !!params.obsCol && !!params.varKeys.length
99
84
  });
100
85
  (0, _react.useEffect)(() => {
101
- if (hasSelections && !isPending && !serverError) {
86
+ if (hasSelections && !!fetchedData && !isPending && !serverError) {
102
87
  setData(fetchedData.data);
103
88
  setLayout(fetchedData.layout);
104
89
  updateColorscale(colorscale.current);
90
+ } else {
91
+ setData([]);
92
+ setLayout({});
105
93
  }
106
94
  }, [fetchedData, hasSelections, isPending, serverError, updateColorscale]);
107
95
  (0, _react.useEffect)(() => {
@@ -118,38 +106,50 @@ function Heatmap(_ref) {
118
106
  const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
119
107
  if (!serverError) {
120
108
  if (hasSelections) {
121
- return /*#__PURE__*/_react.default.createElement("div", {
122
- className: "cherita-plot cherita-heatmap position-relative"
123
- }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
124
- data: data,
125
- layout: layout,
126
- useResizeHandler: true,
127
- style: {
128
- width: "100%",
129
- height: "100%"
130
- },
131
- config: {
132
- displaylogo: false,
133
- modeBarButtons: modeBarButtons
134
- }
135
- }));
109
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
110
+ className: "cherita-plot cherita-heatmap position-relative",
111
+ children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
112
+ data: data,
113
+ layout: layout,
114
+ useResizeHandler: true,
115
+ style: {
116
+ width: '100%',
117
+ height: '100%'
118
+ },
119
+ config: {
120
+ displaylogo: false,
121
+ modeBarButtons: modeBarButtons
122
+ }
123
+ })]
124
+ });
136
125
  }
137
- return /*#__PURE__*/_react.default.createElement("div", {
138
- className: "cherita-heatmap"
139
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
140
- variant: "light"
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"));
126
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotAlert.PlotAlert, {
127
+ variant: "info",
128
+ heading: "Set up your heatmap",
129
+ plotType: plotType,
130
+ setPlotType: setPlotType,
131
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
132
+ className: "p-0 m-0",
133
+ children: ["Select one or more", ' ', showVarsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
134
+ variant: "link",
135
+ className: "border-0 p-0 align-baseline",
136
+ onClick: setShowVars,
137
+ children: "features"
138
+ }) : 'features', ' ', "to display their expression, then choose a", ' ', showObsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
139
+ variant: "link",
140
+ className: "border-0 p-0 align-baseline",
141
+ onClick: setShowObs,
142
+ children: "category"
143
+ }) : 'category', ' ', "to group observations in the heatmap."]
144
+ })
145
+ });
150
146
  } else {
151
- return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
152
- variant: "danger"
153
- }, serverError.message));
147
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotAlert.PlotAlert, {
148
+ variant: "danger",
149
+ heading: "Error displaying the heatmap",
150
+ plotType: plotType,
151
+ setPlotType: setPlotType,
152
+ children: serverError.message || 'An unexpected error occurred while generating the plot.'
153
+ });
154
154
  }
155
155
  }