@haniffalab/cherita-react 1.5.0 → 2.0.0-dev.2026-04-27.sha-2acdfe23

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 (94) hide show
  1. package/dist/cjs/components/dotplot/Dotplot.js +27 -23
  2. package/dist/cjs/components/dotplot/DotplotControls.js +7 -3
  3. package/dist/cjs/components/heatmap/Heatmap.js +27 -23
  4. package/dist/cjs/components/icons/HeatmapIcon.js +2 -2
  5. package/dist/cjs/components/matrixplot/Matrixplot.js +28 -24
  6. package/dist/cjs/components/obs-list/ObsItem.js +2 -2
  7. package/dist/cjs/components/offcanvas/{index.js → OffCanvas.js} +39 -3
  8. package/dist/cjs/components/{full-page → plot}/PlotAlert.js +1 -1
  9. package/dist/cjs/components/{full-page → plot}/PlotTypeSelector.js +49 -10
  10. package/dist/cjs/components/pseudospatial/Pseudospatial.js +3 -2
  11. package/dist/cjs/components/scatterplot/Scatterplot.js +61 -35
  12. package/dist/cjs/components/scatterplot/ScatterplotControls.js +74 -28
  13. package/dist/cjs/components/scatterplot/SpatialControls.js +44 -28
  14. package/dist/cjs/components/scatterplot/Toolbox.js +8 -4
  15. package/dist/cjs/components/search-bar/SearchBar.js +14 -6
  16. package/dist/cjs/components/search-bar/SearchInfo.js +70 -27
  17. package/dist/cjs/components/search-bar/SearchResults.js +62 -50
  18. package/dist/cjs/components/toolbar/Toolbar.js +35 -85
  19. package/dist/cjs/components/var-list/VarList.js +24 -18
  20. package/dist/cjs/components/var-list/VarListToolbar.js +1 -1
  21. package/dist/cjs/components/var-list/VarSet.js +8 -6
  22. package/dist/cjs/components/violin/Violin.js +32 -28
  23. package/dist/cjs/constants/constants.js +1 -1
  24. package/dist/cjs/context/DatasetContext.js +19 -2
  25. package/dist/cjs/context/SettingsContext.js +19 -5
  26. package/dist/cjs/helpers/zarr-helper.js +20 -6
  27. package/dist/cjs/index.js +16 -30
  28. package/dist/cjs/utils/Skeleton.js +38 -2
  29. package/dist/cjs/utils/Slider.js +61 -0
  30. package/dist/cjs/utils/VirtualizedTable.js +97 -0
  31. package/dist/cjs/utils/parquetData.js +60 -0
  32. package/dist/cjs/utils/requests.js +2 -2
  33. package/dist/cjs/utils/useNCBIData.js +35 -0
  34. package/dist/cjs/utils/usePlotVisibility.js +21 -0
  35. package/dist/cjs/utils/zarrData.js +51 -2
  36. package/dist/cjs/{components/plot/Plot.js → views/ObservationFeature/EmbeddedPlot.js} +41 -37
  37. package/dist/cjs/{components/full-page/FullPage.js → views/ObservationFeature/StandardView.js} +40 -49
  38. package/dist/cjs/views/ObservationFeature/index.js +12 -0
  39. package/dist/cjs/views/PerturbationMap/EmbeddedPlot.js +56 -0
  40. package/dist/cjs/views/PerturbationMap/ObsExplorer.js +301 -0
  41. package/dist/cjs/{apps/perturbgen/PerturbGen.js → views/PerturbationMap/StandardView.js} +21 -28
  42. package/dist/cjs/views/PerturbationMap/index.js +12 -0
  43. package/dist/css/cherita.css +16 -7
  44. package/dist/css/cherita.css.map +1 -1
  45. package/dist/esm/components/dotplot/Dotplot.js +29 -25
  46. package/dist/esm/components/dotplot/DotplotControls.js +6 -3
  47. package/dist/esm/components/heatmap/Heatmap.js +29 -25
  48. package/dist/esm/components/icons/HeatmapIcon.js +2 -2
  49. package/dist/esm/components/matrixplot/Matrixplot.js +30 -26
  50. package/dist/esm/components/obs-list/ObsItem.js +2 -2
  51. package/dist/esm/components/offcanvas/{index.js → OffCanvas.js} +38 -3
  52. package/dist/esm/components/{full-page → plot}/PlotAlert.js +1 -1
  53. package/dist/esm/components/{full-page → plot}/PlotTypeSelector.js +49 -10
  54. package/dist/esm/components/pseudospatial/Pseudospatial.js +3 -2
  55. package/dist/esm/components/scatterplot/Scatterplot.js +62 -36
  56. package/dist/esm/components/scatterplot/ScatterplotControls.js +74 -28
  57. package/dist/esm/components/scatterplot/SpatialControls.js +44 -28
  58. package/dist/esm/components/scatterplot/Toolbox.js +8 -4
  59. package/dist/esm/components/search-bar/SearchBar.js +14 -6
  60. package/dist/esm/components/search-bar/SearchInfo.js +71 -28
  61. package/dist/esm/components/search-bar/SearchResults.js +62 -50
  62. package/dist/esm/components/toolbar/Toolbar.js +32 -81
  63. package/dist/esm/components/var-list/VarList.js +24 -18
  64. package/dist/esm/components/var-list/VarListToolbar.js +1 -1
  65. package/dist/esm/components/var-list/VarSet.js +8 -6
  66. package/dist/esm/components/violin/Violin.js +34 -30
  67. package/dist/esm/constants/constants.js +1 -1
  68. package/dist/esm/context/DatasetContext.js +19 -2
  69. package/dist/esm/context/SettingsContext.js +19 -5
  70. package/dist/esm/helpers/zarr-helper.js +19 -5
  71. package/dist/esm/index.js +4 -6
  72. package/dist/esm/utils/Skeleton.js +35 -1
  73. package/dist/esm/utils/Slider.js +54 -0
  74. package/dist/esm/utils/VirtualizedTable.js +89 -0
  75. package/dist/esm/utils/parquetData.js +51 -0
  76. package/dist/esm/utils/requests.js +2 -2
  77. package/dist/esm/utils/useNCBIData.js +28 -0
  78. package/dist/esm/utils/usePlotVisibility.js +14 -0
  79. package/dist/esm/utils/zarrData.js +48 -0
  80. package/dist/esm/{components/plot/Plot.js → views/ObservationFeature/EmbeddedPlot.js} +37 -33
  81. package/dist/esm/{components/full-page/FullPage.js → views/ObservationFeature/StandardView.js} +35 -44
  82. package/dist/esm/views/ObservationFeature/index.js +6 -0
  83. package/dist/esm/views/PerturbationMap/EmbeddedPlot.js +50 -0
  84. package/dist/esm/views/PerturbationMap/ObsExplorer.js +294 -0
  85. package/dist/esm/{apps/perturbgen/PerturbGen.js → views/PerturbationMap/StandardView.js} +17 -24
  86. package/dist/esm/views/PerturbationMap/index.js +6 -0
  87. package/package.json +16 -8
  88. package/scss/cherita.scss +1 -1
  89. package/scss/components/layouts.scss +0 -1
  90. package/scss/components/lists.scss +1 -1
  91. package/scss/components/plotly.scss +10 -1
  92. package/scss/components/plots.scss +7 -4
  93. package/dist/cjs/apps/perturbgen/ObsExplorer.js +0 -153
  94. package/dist/esm/apps/perturbgen/ObsExplorer.js +0 -147
@@ -15,7 +15,8 @@ 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
+ var _usePlotVisibility = _interopRequireDefault(require("../../utils/usePlotVisibility"));
19
+ var _PlotAlert = require("../plot/PlotAlert");
19
20
  var _Toolbar = require("../toolbar/Toolbar");
20
21
  var _jsxRuntime = require("react/jsx-runtime");
21
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -26,14 +27,11 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
26
27
  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); }
27
28
  function Dotplot(_ref) {
28
29
  let {
29
- showObsBtn = false,
30
- showVarsBtn = false,
31
- showCtrlsBtn = false,
32
- setShowObs,
33
- setShowVars,
30
+ setShowCategories,
31
+ setShowSearch,
34
32
  setShowControls,
35
- plotType,
36
- setPlotType
33
+ setPlotType,
34
+ isFullscreen = false
37
35
  } = _ref;
38
36
  const ENDPOINT = 'dotplot';
39
37
  const dataset = (0, _DatasetContext.useDataset)();
@@ -49,6 +47,10 @@ function Dotplot(_ref) {
49
47
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
50
48
  const selectedObs = (0, _Resolver.useSelectedObs)();
51
49
  const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
50
+ const {
51
+ showCategoriesBtn,
52
+ showSearchBtn
53
+ } = (0, _usePlotVisibility.default)(isFullscreen);
52
54
  const params = (0, _react.useMemo)(() => {
53
55
  var _selectedObs$omit;
54
56
  return {
@@ -125,19 +127,21 @@ function Dotplot(_ref) {
125
127
  });
126
128
  });
127
129
  }, [settings.controls.colorAxis.cmin, settings.controls.colorAxis.cmax]);
128
- const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
129
- onClick: setShowObs
130
- }), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
131
- onClick: setShowVars
132
- }), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
130
+ const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
133
131
  onClick: setShowControls
134
- })]);
135
- const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
132
+ }), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
136
133
  if (!serverError) {
137
134
  if (hasSelections) {
138
135
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
139
136
  className: "cherita-plot cherita-dotplot position-relative",
140
- children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
137
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
138
+ className: "plotly-toolbar",
139
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Toolbar.PlotlyToolbar, {
140
+ setShowCategories: setShowCategories,
141
+ setShowSearch: setShowSearch,
142
+ isFullscreen: isFullscreen
143
+ })
144
+ }), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
141
145
  data: data,
142
146
  layout: layout,
143
147
  useResizeHandler: true,
@@ -155,19 +159,19 @@ function Dotplot(_ref) {
155
159
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotAlert.PlotAlert, {
156
160
  variant: "info",
157
161
  heading: "Set up your dotplot",
158
- plotType: plotType,
162
+ plotType: _constants.PLOT_TYPES.DOTPLOT,
159
163
  setPlotType: setPlotType,
160
164
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
161
165
  className: "p-0 m-0",
162
- children: ["Select one or more", ' ', showVarsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
166
+ children: ["Select one or more", ' ', showSearchBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
163
167
  variant: "link",
164
168
  className: "border-0 p-0 align-baseline",
165
- onClick: setShowVars,
166
- children: "features"
167
- }) : 'features', ' ', "to display their expression across groups, then choose a", ' ', showObsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
169
+ onClick: setShowSearch,
170
+ children: dataset.varLabel.plural
171
+ }) : dataset.varLabel.plural, ' ', "to display their ", dataset.valueLabel, " across groups, then choose a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
168
172
  variant: "link",
169
173
  className: "border-0 p-0 align-baseline",
170
- onClick: setShowObs,
174
+ onClick: setShowCategories,
171
175
  children: "category"
172
176
  }) : 'category', ' ', "to group observations in the dotplot."]
173
177
  })
@@ -176,7 +180,7 @@ function Dotplot(_ref) {
176
180
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotAlert.PlotAlert, {
177
181
  variant: "danger",
178
182
  heading: "Error displaying the dotplot",
179
- plotType: plotType,
183
+ plotType: _constants.PLOT_TYPES.DOTPLOT,
180
184
  setPlotType: setPlotType,
181
185
  children: serverError.message || 'An unexpected error occurred while generating the plot.'
182
186
  });
@@ -5,10 +5,13 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.DotplotControls = DotplotControls;
7
7
  var _react = require("react");
8
+ var _lodash = _interopRequireDefault(require("lodash"));
8
9
  var _reactBootstrap = require("react-bootstrap");
10
+ var _DatasetContext = require("../../context/DatasetContext");
9
11
  var _SettingsContext = require("../../context/SettingsContext");
10
12
  var _Controls = require("../controls/Controls");
11
13
  var _jsxRuntime = require("react/jsx-runtime");
14
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
12
15
  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; }
13
16
  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; }
14
17
  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; }
@@ -17,6 +20,7 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
17
20
  function DotplotControls() {
18
21
  const settings = (0, _SettingsContext.useSettings)();
19
22
  const dispatch = (0, _SettingsContext.useSettingsDispatch)();
23
+ const dataset = (0, _DatasetContext.useDataset)();
20
24
  const [controls, setControls] = (0, _react.useState)({
21
25
  expressionCutoff: settings.controls.expressionCutoff,
22
26
  colorAxis: {
@@ -97,8 +101,8 @@ function DotplotControls() {
97
101
  plot: "dotplot"
98
102
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Form.Group, {
99
103
  className: "mb-2",
100
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Label, {
101
- children: "Expression Cutoff"
104
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Form.Label, {
105
+ children: [_lodash.default.capitalize(dataset.valueLabel), " Cutoff"]
102
106
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.InputGroup, {
103
107
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Control, {
104
108
  size: "sm",
@@ -125,7 +129,7 @@ function DotplotControls() {
125
129
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Check, {
126
130
  type: "switch",
127
131
  id: "meanOnlyExpressed",
128
- label: "Average only above cutoff",
132
+ label: "Average only above ".concat(dataset.valueLabel, " cutoff"),
129
133
  checked: settings.controls.meanOnlyExpressed,
130
134
  onChange: () => {
131
135
  dispatch({
@@ -15,7 +15,8 @@ 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
+ var _usePlotVisibility = _interopRequireDefault(require("../../utils/usePlotVisibility"));
19
+ var _PlotAlert = require("../plot/PlotAlert");
19
20
  var _Toolbar = require("../toolbar/Toolbar");
20
21
  var _jsxRuntime = require("react/jsx-runtime");
21
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -26,14 +27,11 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
26
27
  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); }
27
28
  function Heatmap(_ref) {
28
29
  let {
29
- showObsBtn = false,
30
- showVarsBtn = false,
31
- showCtrlsBtn = false,
32
- setShowObs,
33
- setShowVars,
30
+ setShowCategories,
31
+ setShowSearch,
34
32
  setShowControls,
35
- plotType,
36
- setPlotType
33
+ setPlotType,
34
+ isFullscreen = false
37
35
  } = _ref;
38
36
  const ENDPOINT = 'heatmap';
39
37
  const dataset = (0, _DatasetContext.useDataset)();
@@ -48,6 +46,10 @@ function Heatmap(_ref) {
48
46
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
49
47
  const selectedObs = (0, _Resolver.useSelectedObs)();
50
48
  const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
49
+ const {
50
+ showCategoriesBtn,
51
+ showSearchBtn
52
+ } = (0, _usePlotVisibility.default)(isFullscreen);
51
53
  const params = (0, _react.useMemo)(() => {
52
54
  var _selectedObs$omit;
53
55
  return {
@@ -99,19 +101,21 @@ function Heatmap(_ref) {
99
101
  colorscale.current = settings.controls.colorScale;
100
102
  updateColorscale(colorscale.current);
101
103
  }, [settings.controls.colorScale, updateColorscale]);
102
- const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
103
- onClick: setShowObs
104
- }), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
105
- onClick: setShowVars
106
- }), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
104
+ const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
107
105
  onClick: setShowControls
108
- })]);
109
- const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
106
+ }), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
110
107
  if (!serverError) {
111
108
  if (hasSelections) {
112
109
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
113
110
  className: "cherita-plot cherita-heatmap position-relative",
114
- children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
111
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
112
+ className: "plotly-toolbar",
113
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Toolbar.PlotlyToolbar, {
114
+ setShowCategories: setShowCategories,
115
+ setShowSearch: setShowSearch,
116
+ isFullscreen: isFullscreen
117
+ })
118
+ }), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
115
119
  data: data,
116
120
  layout: layout,
117
121
  useResizeHandler: true,
@@ -129,19 +133,19 @@ function Heatmap(_ref) {
129
133
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotAlert.PlotAlert, {
130
134
  variant: "info",
131
135
  heading: "Set up your heatmap",
132
- plotType: plotType,
136
+ plotType: _constants.PLOT_TYPES.HEATMAP,
133
137
  setPlotType: setPlotType,
134
138
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
135
139
  className: "p-0 m-0",
136
- children: ["Select one or more", ' ', showVarsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
140
+ children: ["Select one or more", ' ', showSearchBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
137
141
  variant: "link",
138
142
  className: "border-0 p-0 align-baseline",
139
- onClick: setShowVars,
140
- children: "features"
141
- }) : 'features', ' ', "to display their expression, then choose a", ' ', showObsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
143
+ onClick: setShowSearch,
144
+ children: dataset.varLabel.plural
145
+ }) : dataset.varLabel.plural, ' ', "to display their ", dataset.valueLabel, ", then choose a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
142
146
  variant: "link",
143
147
  className: "border-0 p-0 align-baseline",
144
- onClick: setShowObs,
148
+ onClick: setShowCategories,
145
149
  children: "category"
146
150
  }) : 'category', ' ', "to group observations in the heatmap."]
147
151
  })
@@ -150,7 +154,7 @@ function Heatmap(_ref) {
150
154
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotAlert.PlotAlert, {
151
155
  variant: "danger",
152
156
  heading: "Error displaying the heatmap",
153
- plotType: plotType,
157
+ plotType: _constants.PLOT_TYPES.HEATMAP,
154
158
  setPlotType: setPlotType,
155
159
  children: serverError.message || 'An unexpected error occurred while generating the plot.'
156
160
  });
@@ -20,8 +20,8 @@ function HeatmapIcon(_ref) {
20
20
  gap = 1
21
21
  } = _ref,
22
22
  props = _objectWithoutProperties(_ref, _excluded);
23
- const rows = 6; // genes
24
- const cols = 8; // cells
23
+ const rows = 6; // features
24
+ const cols = 8; // observations
25
25
 
26
26
  // Example expression pattern for visual clusters
27
27
  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]];
@@ -15,7 +15,8 @@ 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
+ var _usePlotVisibility = _interopRequireDefault(require("../../utils/usePlotVisibility"));
19
+ var _PlotAlert = require("../plot/PlotAlert");
19
20
  var _Toolbar = require("../toolbar/Toolbar");
20
21
  var _jsxRuntime = require("react/jsx-runtime");
21
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -26,14 +27,11 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
26
27
  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); }
27
28
  function Matrixplot(_ref) {
28
29
  let {
29
- showObsBtn = false,
30
- showVarsBtn = false,
31
- showCtrlsBtn = false,
32
- setShowObs,
33
- setShowVars,
30
+ setShowCategories,
31
+ setShowSearch,
34
32
  setShowControls,
35
- plotType,
36
- setPlotType
33
+ setPlotType,
34
+ isFullscreen = false
37
35
  } = _ref;
38
36
  const ENDPOINT = 'matrixplot';
39
37
  const dataset = (0, _DatasetContext.useDataset)();
@@ -48,6 +46,10 @@ function Matrixplot(_ref) {
48
46
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
49
47
  const selectedObs = (0, _Resolver.useSelectedObs)();
50
48
  const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
49
+ const {
50
+ showCategoriesBtn,
51
+ showSearchBtn
52
+ } = (0, _usePlotVisibility.default)(isFullscreen);
51
53
  const params = (0, _react.useMemo)(() => {
52
54
  var _selectedObs$omit;
53
55
  return {
@@ -100,19 +102,21 @@ function Matrixplot(_ref) {
100
102
  colorscale.current = settings.controls.colorScale;
101
103
  updateColorscale(colorscale.current);
102
104
  }, [settings.controls.colorScale, updateColorscale]);
103
- const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
104
- onClick: setShowObs
105
- }), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
106
- onClick: setShowVars
107
- }), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
105
+ const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
108
106
  onClick: setShowControls
109
- })]);
110
- const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
107
+ }), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
111
108
  if (!serverError) {
112
109
  if (hasSelections) {
113
110
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
114
111
  className: "cherita-plot cherita-matrixplot position-relative",
115
- children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
112
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
113
+ className: "plotly-toolbar",
114
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Toolbar.PlotlyToolbar, {
115
+ setShowCategories: setShowCategories,
116
+ setShowSearch: setShowSearch,
117
+ isFullscreen: isFullscreen
118
+ })
119
+ }), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
116
120
  data: data,
117
121
  layout: layout,
118
122
  useResizeHandler: true,
@@ -130,28 +134,28 @@ function Matrixplot(_ref) {
130
134
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotAlert.PlotAlert, {
131
135
  variant: "info",
132
136
  heading: "Set up your matrix plot",
133
- plotType: plotType,
137
+ plotType: _constants.PLOT_TYPES.MATRIXPLOT,
134
138
  setPlotType: setPlotType,
135
139
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
136
140
  className: "p-0 m-0",
137
- children: ["Select a", ' ', showObsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
141
+ children: ["Select a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
138
142
  variant: "link",
139
143
  className: "border-0 p-0 align-baseline",
140
- onClick: setShowObs,
144
+ onClick: setShowCategories,
141
145
  children: "category"
142
- }) : 'category', ' ', "to group observations, then choose one or more", ' ', showVarsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
146
+ }) : 'category', ' ', "to group observations, then choose one or more", ' ', showSearchBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
143
147
  variant: "link",
144
148
  className: "border-0 p-0 align-baseline",
145
- onClick: setShowVars,
146
- children: "features"
147
- }) : 'features', ' ', "to display the matrix plot."]
149
+ onClick: setShowSearch,
150
+ children: dataset.varLabel.plural
151
+ }) : dataset.varLabel.plural, ' ', "to display the matrix plot."]
148
152
  })
149
153
  });
150
154
  } else {
151
155
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotAlert.PlotAlert, {
152
156
  variant: "danger",
153
157
  heading: "Error displaying the matrix plot",
154
- plotType: plotType,
158
+ plotType: _constants.PLOT_TYPES.MATRIXPLOT,
155
159
  setPlotType: setPlotType,
156
160
  children: serverError.message || 'An unexpected error occurred while generating the plot.'
157
161
  });
@@ -165,7 +165,7 @@ function CategoricalItem(_ref2) {
165
165
  getColor
166
166
  } = (0, _colorHelper.useColor)();
167
167
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
168
- className: "virtualized-list-wrapper",
168
+ className: "virtualized-list-wrapper ps-1",
169
169
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
170
170
  className: "obs-item",
171
171
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
@@ -275,7 +275,7 @@ function CategoricalItem(_ref2) {
275
275
  })]
276
276
  })
277
277
  }, value)
278
- });
278
+ }, value);
279
279
  }
280
280
  function CategoricalObs(_ref3) {
281
281
  let {
@@ -5,17 +5,21 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.OffcanvasControls = OffcanvasControls;
7
7
  exports.OffcanvasObs = OffcanvasObs;
8
+ exports.OffcanvasObsExplorer = OffcanvasObsExplorer;
8
9
  exports.OffcanvasObsm = OffcanvasObsm;
9
10
  exports.OffcanvasVars = OffcanvasVars;
10
11
  var _Offcanvas = _interopRequireDefault(require("react-bootstrap/Offcanvas"));
11
12
  var _constants = require("../../constants/constants");
13
+ var _DatasetContext = require("../../context/DatasetContext");
14
+ var _ObsExplorer = require("../../views/PerturbationMap/ObsExplorer");
12
15
  var _ObsList = require("../obs-list/ObsList");
13
16
  var _ObsmList = require("../obsm-list/ObsmList");
14
17
  var _SearchBar = require("../search-bar/SearchBar");
15
18
  var _VarList = require("../var-list/VarList");
16
19
  var _jsxRuntime = require("react/jsx-runtime");
17
20
  const _excluded = ["show", "handleClose"],
18
- _excluded2 = ["show", "handleClose", "Controls"];
21
+ _excluded2 = ["show", "handleClose", "Controls"],
22
+ _excluded3 = ["show", "handleClose"];
19
23
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
24
  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
25
  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; }
@@ -69,14 +73,15 @@ function OffcanvasVars(_ref3) {
69
73
  handleClose,
70
74
  mode = _constants.SELECTION_MODES.MULTIPLE
71
75
  } = _ref3;
76
+ const dataset = (0, _DatasetContext.useDataset)();
72
77
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Offcanvas.default, {
73
78
  show: show,
74
79
  onHide: handleClose,
75
80
  className: "offcanvas-vars",
76
81
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Header, {
77
82
  closeButton: true,
78
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Title, {
79
- children: "Features"
83
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Offcanvas.default.Title, {
84
+ children: ["Search for ", dataset.varLabel.plural]
80
85
  })
81
86
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Body, {
82
87
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
@@ -112,4 +117,35 @@ function OffcanvasControls(_ref4) {
112
117
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Controls, _objectSpread({}, props))
113
118
  })]
114
119
  });
120
+ }
121
+ function OffcanvasObsExplorer(_ref5) {
122
+ let {
123
+ show,
124
+ handleClose
125
+ } = _ref5,
126
+ props = _objectWithoutProperties(_ref5, _excluded3);
127
+ const dataset = (0, _DatasetContext.useDataset)();
128
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Offcanvas.default, {
129
+ show: show,
130
+ onHide: handleClose,
131
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Header, {
132
+ closeButton: true,
133
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Offcanvas.default.Title, {
134
+ children: ["Search for ", dataset.obsLabel.plural]
135
+ })
136
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Body, {
137
+ className: "p-1",
138
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
139
+ className: "sidebar-features",
140
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchBar.SearchBar, {
141
+ searchDiseases: false,
142
+ searchVar: false,
143
+ searchObs: true
144
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
145
+ className: "sidebar-features-list",
146
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsExplorer.ObsExplorer, _objectSpread({}, props))
147
+ })]
148
+ })
149
+ })]
150
+ });
115
151
  }
@@ -34,7 +34,7 @@ function PlotAlert(_ref) {
34
34
  className: "w-100 h-100 d-flex justify-content-center align-items-center",
35
35
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Alert, {
36
36
  variant: variant,
37
- className: "m-0 w-75 w-lg-50 text-center",
37
+ className: "m-0 my-3 w-75 w-lg-50 text-center",
38
38
  children: [heading && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert.Heading, {
39
39
  children: heading
40
40
  }), " ", children]
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.PlotTypeSelector = PlotTypeSelector;
7
7
  var _react = require("react");
8
8
  var _constants = require("../../constants/constants");
9
+ var _DatasetContext = require("../../context/DatasetContext");
9
10
  var _StyledTooltip = require("../../utils/StyledTooltip");
10
11
  var _DotPlotIcon = _interopRequireDefault(require("../icons/DotPlotIcon"));
11
12
  var _HeatmapIcon = _interopRequireDefault(require("../icons/HeatmapIcon"));
@@ -23,33 +24,67 @@ const plotTypes = [{
23
24
  type: _constants.PLOT_TYPES.SCATTERPLOT,
24
25
  icon: _ScatterplotIcon.default,
25
26
  name: 'Scatterplot',
26
- description: 'Displays cells in 2D based on dimensionality reduction.'
27
+ description: _ref => {
28
+ let {
29
+ obsLabel
30
+ } = _ref;
31
+ return "Displays ".concat(obsLabel.plural, " in 2D based on dimensionality reduction.");
32
+ }
27
33
  }, {
28
34
  type: _constants.PLOT_TYPES.MATRIXPLOT,
29
35
  icon: _MatrixPlotIcon.default,
30
36
  name: 'Matrix Plot',
31
- description: 'Shows expression values of genes across categories.'
37
+ description: _ref2 => {
38
+ let {
39
+ varLabel,
40
+ valueLabel
41
+ } = _ref2;
42
+ return "Shows ".concat(valueLabel, " values of ").concat(varLabel.plural, " across categories.");
43
+ }
32
44
  }, {
33
45
  type: _constants.PLOT_TYPES.DOTPLOT,
34
46
  icon: _DotPlotIcon.default,
35
47
  name: 'Dot Plot',
36
- description: 'Shows proportion and expression of genes across groups.'
48
+ description: _ref3 => {
49
+ let {
50
+ varLabel,
51
+ valueLabel
52
+ } = _ref3;
53
+ return "Shows proportion and ".concat(valueLabel, " of ").concat(varLabel.plural, " across groups.");
54
+ }
37
55
  }, {
38
56
  type: _constants.PLOT_TYPES.HEATMAP,
39
57
  icon: _HeatmapIcon.default,
40
58
  name: 'Heatmap',
41
- description: 'Visualises gene expression or feature activity as a colour-coded matrix.'
59
+ description: _ref4 => {
60
+ let {
61
+ varLabel,
62
+ valueLabel
63
+ } = _ref4;
64
+ return "Visualises ".concat(valueLabel, " of ").concat(varLabel.plural, " as a colour-coded matrix.");
65
+ }
42
66
  }, {
43
67
  type: _constants.PLOT_TYPES.VIOLINPLOT,
44
68
  icon: _ViolinPlotIcon.default,
45
69
  name: 'Violin Plot',
46
- description: 'Displays distribution of gene expression across categories.'
70
+ description: _ref5 => {
71
+ let {
72
+ obsLabel,
73
+ valueLabel
74
+ } = _ref5;
75
+ return "Displays distribution of ".concat(valueLabel, " across ").concat(obsLabel.plural, ".");
76
+ }
47
77
  }];
48
- function PlotTypeSelector(_ref) {
78
+ function PlotTypeSelector(_ref6) {
49
79
  let {
50
80
  currentType,
51
81
  onChange
52
- } = _ref;
82
+ } = _ref6;
83
+ const {
84
+ obsLabel,
85
+ varLabel,
86
+ valueLabel
87
+ } = (0, _DatasetContext.useDataset)();
53
88
  const [hoveredMap, setHoveredMap] = (0, _react.useState)({});
54
89
  const handleMouseEnter = type => setHoveredMap(prev => _objectSpread(_objectSpread({}, prev), {}, {
55
90
  [type]: true
@@ -59,13 +94,13 @@ function PlotTypeSelector(_ref) {
59
94
  }));
60
95
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
61
96
  className: "d-flex gap-2 justify-content-between",
62
- children: plotTypes.map(_ref2 => {
97
+ children: plotTypes.map(_ref7 => {
63
98
  let {
64
99
  type,
65
100
  icon: Icon,
66
101
  name,
67
102
  description
68
- } = _ref2;
103
+ } = _ref7;
69
104
  const isActive = currentType === type;
70
105
  const hovered = hoveredMap[type] || false;
71
106
  const colour = isActive ? '#005a86' : hovered ? '#0071a7' : '#000';
@@ -73,7 +108,11 @@ function PlotTypeSelector(_ref) {
73
108
  title: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
74
109
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("strong", {
75
110
  children: name
76
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("br", {}), description]
111
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("br", {}), description({
112
+ obsLabel,
113
+ varLabel,
114
+ valueLabel
115
+ })]
77
116
  }),
78
117
  placement: "bottom",
79
118
  slotProps: {
@@ -93,7 +93,8 @@ function Pseudospatial(_ref) {
93
93
  setPlotType
94
94
  } = _ref;
95
95
  const {
96
- imageUrl
96
+ imageUrl,
97
+ valueLabel
97
98
  } = (0, _DatasetContext.useDataset)();
98
99
  const settings = (0, _SettingsContext.useSettings)();
99
100
  const dispatch = (0, _SettingsContext.useSettingsDispatch)();
@@ -279,7 +280,7 @@ function Pseudospatial(_ref) {
279
280
  }), hasSelections && showLegend && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Legend.Legend, {
280
281
  min: layout === null || layout === void 0 || (_layout$coloraxis5 = layout.coloraxis) === null || _layout$coloraxis5 === void 0 ? void 0 : _layout$coloraxis5.cmin,
281
282
  max: layout === null || layout === void 0 || (_layout$coloraxis6 = layout.coloraxis) === null || _layout$coloraxis6 === void 0 ? void 0 : _layout$coloraxis6.cmax,
282
- addText: plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE ? ' - Mean expression' : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL ? ' - %' : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS ? ' - Mean value' : ''
283
+ addText: plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE ? " - Mean ".concat(valueLabel) : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL ? ' - %' : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS ? ' - Mean value' : ''
283
284
  })]
284
285
  })
285
286
  });