@haniffalab/cherita-react 1.4.6 → 1.5.0-dev.2026-02-19.5a87edc2

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 (84) hide show
  1. package/dist/cjs/components/dotplot/Dotplot.js +41 -33
  2. package/dist/cjs/components/heatmap/Heatmap.js +38 -30
  3. package/dist/cjs/components/matrixplot/Matrixplot.js +39 -31
  4. package/dist/cjs/components/obs-list/ObsItem.js +2 -2
  5. package/dist/cjs/components/obs-list/ObsList.js +8 -4
  6. package/dist/cjs/components/obsm-list/ObsmList.js +4 -15
  7. package/dist/cjs/components/offcanvas/{index.js → OffCanvas.js} +33 -1
  8. package/dist/cjs/components/{full-page → plot}/PlotAlert.js +1 -1
  9. package/dist/cjs/components/pseudospatial/Pseudospatial.js +6 -3
  10. package/dist/cjs/components/scatterplot/Scatterplot.js +140 -41
  11. package/dist/cjs/components/scatterplot/ScatterplotControls.js +74 -28
  12. package/dist/cjs/components/scatterplot/SpatialControls.js +37 -24
  13. package/dist/cjs/components/search-bar/SearchBar.js +63 -15
  14. package/dist/cjs/components/search-bar/SearchInfo.js +68 -25
  15. package/dist/cjs/components/search-bar/SearchResults.js +143 -130
  16. package/dist/cjs/components/toolbar/Toolbar.js +47 -42
  17. package/dist/cjs/components/var-list/VarList.js +18 -12
  18. package/dist/cjs/components/var-list/VarSet.js +1 -1
  19. package/dist/cjs/components/violin/Violin.js +52 -44
  20. package/dist/cjs/context/DatasetContext.js +12 -3
  21. package/dist/cjs/context/SettingsContext.js +25 -4
  22. package/dist/cjs/helpers/zarr-helper.js +39 -35
  23. package/dist/cjs/index.js +25 -12
  24. package/dist/cjs/utils/Skeleton.js +38 -2
  25. package/dist/cjs/utils/Slider.js +61 -0
  26. package/dist/cjs/utils/VirtualizedTable.js +97 -0
  27. package/dist/cjs/utils/parquetData.js +60 -0
  28. package/dist/cjs/utils/search.js +21 -2
  29. package/dist/cjs/utils/useNCBIData.js +35 -0
  30. package/dist/cjs/utils/usePlotVisibility.js +21 -0
  31. package/dist/cjs/utils/zarrData.js +57 -8
  32. package/dist/cjs/views/ObservationFeature/EmbeddedPlot.js +122 -0
  33. package/dist/cjs/{components/full-page/FullPage.js → views/ObservationFeature/StandardView.js} +38 -47
  34. package/dist/cjs/views/ObservationFeature/index.js +12 -0
  35. package/dist/cjs/views/PerturbationMap/ObsExplorer.js +299 -0
  36. package/dist/cjs/views/PerturbationMap/StandardView.js +104 -0
  37. package/dist/cjs/views/PerturbationMap/index.js +10 -0
  38. package/dist/css/cherita.css +20 -6
  39. package/dist/css/cherita.css.map +1 -1
  40. package/dist/esm/components/dotplot/Dotplot.js +42 -34
  41. package/dist/esm/components/heatmap/Heatmap.js +39 -31
  42. package/dist/esm/components/matrixplot/Matrixplot.js +40 -32
  43. package/dist/esm/components/obs-list/ObsItem.js +2 -2
  44. package/dist/esm/components/obs-list/ObsList.js +8 -4
  45. package/dist/esm/components/obsm-list/ObsmList.js +4 -15
  46. package/dist/esm/components/offcanvas/{index.js → OffCanvas.js} +32 -1
  47. package/dist/esm/components/{full-page → plot}/PlotAlert.js +1 -1
  48. package/dist/esm/components/pseudospatial/Pseudospatial.js +6 -3
  49. package/dist/esm/components/scatterplot/Scatterplot.js +140 -41
  50. package/dist/esm/components/scatterplot/ScatterplotControls.js +74 -28
  51. package/dist/esm/components/scatterplot/SpatialControls.js +37 -24
  52. package/dist/esm/components/search-bar/SearchBar.js +64 -16
  53. package/dist/esm/components/search-bar/SearchInfo.js +69 -26
  54. package/dist/esm/components/search-bar/SearchResults.js +144 -132
  55. package/dist/esm/components/toolbar/Toolbar.js +44 -39
  56. package/dist/esm/components/var-list/VarList.js +18 -12
  57. package/dist/esm/components/var-list/VarSet.js +1 -1
  58. package/dist/esm/components/violin/Violin.js +53 -45
  59. package/dist/esm/context/DatasetContext.js +13 -4
  60. package/dist/esm/context/SettingsContext.js +25 -4
  61. package/dist/esm/helpers/zarr-helper.js +36 -34
  62. package/dist/esm/index.js +4 -3
  63. package/dist/esm/utils/Skeleton.js +35 -1
  64. package/dist/esm/utils/Slider.js +54 -0
  65. package/dist/esm/utils/VirtualizedTable.js +89 -0
  66. package/dist/esm/utils/parquetData.js +51 -0
  67. package/dist/esm/utils/search.js +18 -0
  68. package/dist/esm/utils/useNCBIData.js +28 -0
  69. package/dist/esm/utils/usePlotVisibility.js +14 -0
  70. package/dist/esm/utils/zarrData.js +54 -6
  71. package/dist/esm/views/ObservationFeature/EmbeddedPlot.js +116 -0
  72. package/dist/esm/{components/full-page/FullPage.js → views/ObservationFeature/StandardView.js} +33 -42
  73. package/dist/esm/views/ObservationFeature/index.js +6 -0
  74. package/dist/esm/views/PerturbationMap/ObsExplorer.js +292 -0
  75. package/dist/esm/views/PerturbationMap/StandardView.js +98 -0
  76. package/dist/esm/views/PerturbationMap/index.js +4 -0
  77. package/package.json +12 -5
  78. package/scss/cherita.scss +7 -0
  79. package/scss/components/layouts.scss +0 -1
  80. package/scss/components/lists.scss +1 -1
  81. package/scss/components/plotly.scss +10 -1
  82. package/scss/components/plots.scss +7 -4
  83. /package/dist/cjs/components/{full-page → plot}/PlotTypeSelector.js +0 -0
  84. /package/dist/esm/components/{full-page → plot}/PlotTypeSelector.js +0 -0
@@ -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,12 @@ 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
33
  plotType,
36
- setPlotType
34
+ setPlotType,
35
+ isFullscreen = false
37
36
  } = _ref;
38
37
  const ENDPOINT = 'dotplot';
39
38
  const dataset = (0, _DatasetContext.useDataset)();
@@ -49,20 +48,27 @@ function Dotplot(_ref) {
49
48
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
50
49
  const selectedObs = (0, _Resolver.useSelectedObs)();
51
50
  const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
52
- const params = (0, _react.useMemo)(() => ({
53
- url: dataset.url,
54
- obsCol: selectedObs,
55
- 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),
56
- varKeys: selectedMultiVar.map(i => i.isSet ? {
57
- name: i.name,
58
- indices: i.vars.map(v => v.index)
59
- } : i.index),
60
- obsIndices: isSliced ? [...(obsIndices || [])] : null,
61
- standardScale: settings.controls.scale.dotplot,
62
- meanOnlyExpressed: settings.controls.meanOnlyExpressed,
63
- expressionCutoff: settings.controls.expressionCutoff,
64
- varNamesCol: dataset.varNamesCol
65
- }), [dataset.url, dataset.varNamesCol, isSliced, obsIndices, selectedMultiVar, selectedObs, settings.controls.expressionCutoff, settings.controls.meanOnlyExpressed, settings.controls.scale.dotplot]);
51
+ const {
52
+ showCategoriesBtn,
53
+ showSearchBtn
54
+ } = (0, _usePlotVisibility.default)(isFullscreen);
55
+ const params = (0, _react.useMemo)(() => {
56
+ var _selectedObs$omit;
57
+ return {
58
+ url: dataset.url,
59
+ obsCol: selectedObs,
60
+ obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit = selectedObs.omit) !== null && _selectedObs$omit !== 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),
61
+ varKeys: selectedMultiVar.map(i => i.isSet ? {
62
+ name: i.name,
63
+ indices: i.vars.map(v => v.index)
64
+ } : i.index),
65
+ obsIndices: isSliced ? [...(obsIndices || [])] : null,
66
+ standardScale: settings.controls.scale.dotplot,
67
+ meanOnlyExpressed: settings.controls.meanOnlyExpressed,
68
+ expressionCutoff: settings.controls.expressionCutoff,
69
+ varNamesCol: dataset.varNamesCol
70
+ };
71
+ }, [dataset.url, dataset.varNamesCol, isSliced, obsIndices, selectedMultiVar, selectedObs, settings.controls.expressionCutoff, settings.controls.meanOnlyExpressed, settings.controls.scale.dotplot]);
66
72
  // @TODO: set default scale
67
73
 
68
74
  (0, _react.useEffect)(() => {
@@ -122,19 +128,21 @@ function Dotplot(_ref) {
122
128
  });
123
129
  });
124
130
  }, [settings.controls.colorAxis.cmin, settings.controls.colorAxis.cmax]);
125
- const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
126
- onClick: setShowObs
127
- }), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
128
- onClick: setShowVars
129
- }), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
131
+ const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
130
132
  onClick: setShowControls
131
- })]);
132
- const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
133
+ }), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
133
134
  if (!serverError) {
134
135
  if (hasSelections) {
135
136
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
136
137
  className: "cherita-plot cherita-dotplot position-relative",
137
- children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
138
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
139
+ className: "plotly-toolbar",
140
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Toolbar.PlotlyToolbar, {
141
+ setShowCategories: setShowCategories,
142
+ setShowSearch: setShowSearch,
143
+ isFullscreen: isFullscreen
144
+ })
145
+ }), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
138
146
  data: data,
139
147
  layout: layout,
140
148
  useResizeHandler: true,
@@ -156,15 +164,15 @@ function Dotplot(_ref) {
156
164
  setPlotType: setPlotType,
157
165
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
158
166
  className: "p-0 m-0",
159
- children: ["Select one or more", ' ', showVarsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
167
+ children: ["Select one or more", ' ', showSearchBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
160
168
  variant: "link",
161
169
  className: "border-0 p-0 align-baseline",
162
- onClick: setShowVars,
170
+ onClick: setShowSearch,
163
171
  children: "features"
164
- }) : 'features', ' ', "to display their expression across groups, then choose a", ' ', showObsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
172
+ }) : 'features', ' ', "to display their expression across groups, then choose a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
165
173
  variant: "link",
166
174
  className: "border-0 p-0 align-baseline",
167
- onClick: setShowObs,
175
+ onClick: setShowCategories,
168
176
  children: "category"
169
177
  }) : 'category', ' ', "to group observations in the dotplot."]
170
178
  })
@@ -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,12 @@ 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
33
  plotType,
36
- setPlotType
34
+ setPlotType,
35
+ isFullscreen = false
37
36
  } = _ref;
38
37
  const ENDPOINT = 'heatmap';
39
38
  const dataset = (0, _DatasetContext.useDataset)();
@@ -48,17 +47,24 @@ function Heatmap(_ref) {
48
47
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
49
48
  const selectedObs = (0, _Resolver.useSelectedObs)();
50
49
  const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
51
- const params = (0, _react.useMemo)(() => ({
52
- url: dataset.url,
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 ? {
56
- name: i.name,
57
- indices: i.vars.map(v => v.index)
58
- } : i.index),
59
- obsIndices: isSliced ? [...(obsIndices || [])] : null,
60
- varNamesCol: dataset.varNamesCol
61
- }), [dataset.url, dataset.varNamesCol, isSliced, obsIndices, selectedMultiVar, selectedObs]);
50
+ const {
51
+ showCategoriesBtn,
52
+ showSearchBtn
53
+ } = (0, _usePlotVisibility.default)(isFullscreen);
54
+ const params = (0, _react.useMemo)(() => {
55
+ var _selectedObs$omit;
56
+ return {
57
+ url: dataset.url,
58
+ obsCol: selectedObs,
59
+ obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit = selectedObs.omit) !== null && _selectedObs$omit !== 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),
60
+ varKeys: selectedMultiVar.map(i => i.isSet ? {
61
+ name: i.name,
62
+ indices: i.vars.map(v => v.index)
63
+ } : i.index),
64
+ obsIndices: isSliced ? [...(obsIndices || [])] : null,
65
+ varNamesCol: dataset.varNamesCol
66
+ };
67
+ }, [dataset.url, dataset.varNamesCol, isSliced, obsIndices, selectedMultiVar, selectedObs]);
62
68
  (0, _react.useEffect)(() => {
63
69
  if (selectedObs && selectedMultiVar.length) {
64
70
  setHasSelections(true);
@@ -96,19 +102,21 @@ function Heatmap(_ref) {
96
102
  colorscale.current = settings.controls.colorScale;
97
103
  updateColorscale(colorscale.current);
98
104
  }, [settings.controls.colorScale, updateColorscale]);
99
- const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
100
- onClick: setShowObs
101
- }), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
102
- onClick: setShowVars
103
- }), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
105
+ const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
104
106
  onClick: setShowControls
105
- })]);
106
- const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
107
+ }), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
107
108
  if (!serverError) {
108
109
  if (hasSelections) {
109
110
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
110
111
  className: "cherita-plot cherita-heatmap position-relative",
111
- 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, {
112
120
  data: data,
113
121
  layout: layout,
114
122
  useResizeHandler: true,
@@ -130,15 +138,15 @@ function Heatmap(_ref) {
130
138
  setPlotType: setPlotType,
131
139
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
132
140
  className: "p-0 m-0",
133
- children: ["Select one or more", ' ', showVarsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
141
+ children: ["Select one or more", ' ', showSearchBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
134
142
  variant: "link",
135
143
  className: "border-0 p-0 align-baseline",
136
- onClick: setShowVars,
144
+ onClick: setShowSearch,
137
145
  children: "features"
138
- }) : 'features', ' ', "to display their expression, then choose a", ' ', showObsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
146
+ }) : 'features', ' ', "to display their expression, then choose a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
139
147
  variant: "link",
140
148
  className: "border-0 p-0 align-baseline",
141
- onClick: setShowObs,
149
+ onClick: setShowCategories,
142
150
  children: "category"
143
151
  }) : 'category', ' ', "to group observations in the heatmap."]
144
152
  })
@@ -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,12 @@ 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
33
  plotType,
36
- setPlotType
34
+ setPlotType,
35
+ isFullscreen = false
37
36
  } = _ref;
38
37
  const ENDPOINT = 'matrixplot';
39
38
  const dataset = (0, _DatasetContext.useDataset)();
@@ -48,18 +47,25 @@ function Matrixplot(_ref) {
48
47
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
49
48
  const selectedObs = (0, _Resolver.useSelectedObs)();
50
49
  const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
51
- const params = (0, _react.useMemo)(() => ({
52
- url: dataset.url,
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 ? {
56
- name: i.name,
57
- indices: i.vars.map(v => v.index)
58
- } : i.index),
59
- obsIndices: isSliced ? [...(obsIndices || [])] : null,
60
- standardScale: settings.controls.scale.matrixplot,
61
- varNamesCol: dataset.varNamesCol
62
- }), [dataset.url, dataset.varNamesCol, isSliced, obsIndices, selectedMultiVar, selectedObs, settings.controls.scale.matrixplot]);
50
+ const {
51
+ showCategoriesBtn,
52
+ showSearchBtn
53
+ } = (0, _usePlotVisibility.default)(isFullscreen);
54
+ const params = (0, _react.useMemo)(() => {
55
+ var _selectedObs$omit;
56
+ return {
57
+ url: dataset.url,
58
+ obsCol: selectedObs,
59
+ obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit = selectedObs.omit) !== null && _selectedObs$omit !== 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),
60
+ varKeys: selectedMultiVar.map(i => i.isSet ? {
61
+ name: i.name,
62
+ indices: i.vars.map(v => v.index)
63
+ } : i.index),
64
+ obsIndices: isSliced ? [...(obsIndices || [])] : null,
65
+ standardScale: settings.controls.scale.matrixplot,
66
+ varNamesCol: dataset.varNamesCol
67
+ };
68
+ }, [dataset.url, dataset.varNamesCol, isSliced, obsIndices, selectedMultiVar, selectedObs, settings.controls.scale.matrixplot]);
63
69
  (0, _react.useEffect)(() => {
64
70
  if (selectedObs && selectedMultiVar.length) {
65
71
  setHasSelections(true);
@@ -97,19 +103,21 @@ function Matrixplot(_ref) {
97
103
  colorscale.current = settings.controls.colorScale;
98
104
  updateColorscale(colorscale.current);
99
105
  }, [settings.controls.colorScale, updateColorscale]);
100
- const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
101
- onClick: setShowObs
102
- }), showVarsBtn && (0, _Toolbar.VarPlotlyToolbar)({
103
- onClick: setShowVars
104
- }), showCtrlsBtn && (0, _Toolbar.ControlsPlotlyToolbar)({
106
+ const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
105
107
  onClick: setShowControls
106
- })]);
107
- const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
108
+ }), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
108
109
  if (!serverError) {
109
110
  if (hasSelections) {
110
111
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
111
112
  className: "cherita-plot cherita-matrixplot position-relative",
112
- children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
113
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
114
+ className: "plotly-toolbar",
115
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Toolbar.PlotlyToolbar, {
116
+ setShowCategories: setShowCategories,
117
+ setShowSearch: setShowSearch,
118
+ isFullscreen: isFullscreen
119
+ })
120
+ }), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
113
121
  data: data,
114
122
  layout: layout,
115
123
  useResizeHandler: true,
@@ -131,15 +139,15 @@ function Matrixplot(_ref) {
131
139
  setPlotType: setPlotType,
132
140
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
133
141
  className: "p-0 m-0",
134
- children: ["Select a", ' ', showObsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
142
+ children: ["Select a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
135
143
  variant: "link",
136
144
  className: "border-0 p-0 align-baseline",
137
- onClick: setShowObs,
145
+ onClick: setShowCategories,
138
146
  children: "category"
139
- }) : 'category', ' ', "to group observations, then choose one or more", ' ', showVarsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
147
+ }) : 'category', ' ', "to group observations, then choose one or more", ' ', showSearchBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
140
148
  variant: "link",
141
149
  className: "border-0 p-0 align-baseline",
142
- onClick: setShowVars,
150
+ onClick: setShowSearch,
143
151
  children: "features"
144
152
  }) : 'features', ' ', "to display the matrix plot."]
145
153
  })
@@ -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 {
@@ -15,12 +15,12 @@ var _reactBootstrap = require("react-bootstrap");
15
15
  var _Accordion = _interopRequireDefault(require("react-bootstrap/Accordion"));
16
16
  var _AccordionButton = require("react-bootstrap/AccordionButton");
17
17
  var _AccordionContext = _interopRequireDefault(require("react-bootstrap/AccordionContext"));
18
+ var _ObsItem = require("./ObsItem");
18
19
  var _constants = require("../../constants/constants");
19
20
  var _DatasetContext = require("../../context/DatasetContext");
20
21
  var _SettingsContext = require("../../context/SettingsContext");
21
22
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
22
23
  var _requests = require("../../utils/requests");
23
- var _ObsItem = require("./ObsItem");
24
24
  var _jsxRuntime = require("react/jsx-runtime");
25
25
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
26
26
  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; }
@@ -328,9 +328,12 @@ function ObsColsList(_ref2) {
328
328
  if (!serverError) {
329
329
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
330
330
  className: "position-relative h-100",
331
- children: isPending ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}) : !!obsCols && !_lodash.default.size(obsCols) ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
332
- variant: "danger",
333
- children: "No observations found."
331
+ children: isPending ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}) : !!obsCols && !_lodash.default.size(obsCols) ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
332
+ className: "p-3",
333
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
334
+ variant: "danger",
335
+ children: "No observations found"
336
+ })
334
337
  }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Accordion.default, {
335
338
  flush: true,
336
339
  defaultActiveKey: [...active, ...[defaultActiveGroup]],
@@ -341,6 +344,7 @@ function ObsColsList(_ref2) {
341
344
  });
342
345
  } else {
343
346
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
347
+ className: "p-3",
344
348
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
345
349
  variant: "danger",
346
350
  children: serverError.message
@@ -23,7 +23,6 @@ function ObsmKeysList(_ref) {
23
23
  const settings = (0, _SettingsContext.useSettings)();
24
24
  const dispatch = (0, _SettingsContext.useSettingsDispatch)();
25
25
  const [keysList, setKeysList] = (0, _react.useState)([]);
26
- const [active, setActive] = (0, _react.useState)(null);
27
26
  const params = (0, _react.useMemo)(() => ({
28
27
  url: dataset.url
29
28
  }), [dataset.url]);
@@ -35,10 +34,9 @@ function ObsmKeysList(_ref) {
35
34
  refetchOnMount: false
36
35
  });
37
36
  (0, _react.useEffect)(() => {
38
- if (!isPending && !serverError) {
39
- if (!!fetchedData && !fetchedData.length) {
37
+ if (!isPending && fetchedData && !serverError) {
38
+ if (!fetchedData.length) {
40
39
  setHasObsm(false);
41
- setKeysList([]);
42
40
  if (settings.selectedObsm) {
43
41
  dispatch({
44
42
  type: 'select.obsm',
@@ -55,8 +53,6 @@ function ObsmKeysList(_ref) {
55
53
  type: 'select.obsm',
56
54
  obsm: null
57
55
  });
58
- } else {
59
- setActive(settings.selectedObsm);
60
56
  }
61
57
  } else {
62
58
  // Set default obsm if in keys list and not selected
@@ -73,18 +69,11 @@ function ObsmKeysList(_ref) {
73
69
  });
74
70
  }
75
71
  }
76
- } else if (!isPending && serverError) {
77
- if (settings.selectedObsm) {
78
- dispatch({
79
- type: 'select.obsm',
80
- obsm: null
81
- });
82
- }
83
72
  }
84
73
  }, [dispatch, fetchedData, isPending, serverError, setHasObsm, settings.selectedObsm]);
85
- const obsmList = keysList.map(item => {
74
+ const obsmList = _lodash.default.map(keysList, item => {
86
75
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
87
- className: "custom ".concat(active === item && 'active'),
76
+ className: "custom ".concat(settings.selectedObsm === item && 'active'),
88
77
  onClick: () => {
89
78
  dispatch({
90
79
  type: 'select.obsm',
@@ -5,17 +5,20 @@ 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 _ObsExplorer = require("../../views/PerturbationMap/ObsExplorer");
12
14
  var _ObsList = require("../obs-list/ObsList");
13
15
  var _ObsmList = require("../obsm-list/ObsmList");
14
16
  var _SearchBar = require("../search-bar/SearchBar");
15
17
  var _VarList = require("../var-list/VarList");
16
18
  var _jsxRuntime = require("react/jsx-runtime");
17
19
  const _excluded = ["show", "handleClose"],
18
- _excluded2 = ["show", "handleClose", "Controls"];
20
+ _excluded2 = ["show", "handleClose", "Controls"],
21
+ _excluded3 = ["show", "handleClose"];
19
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
23
  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
24
  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; }
@@ -112,4 +115,33 @@ function OffcanvasControls(_ref4) {
112
115
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Controls, _objectSpread({}, props))
113
116
  })]
114
117
  });
118
+ }
119
+ function OffcanvasObsExplorer(_ref5) {
120
+ let {
121
+ show,
122
+ handleClose
123
+ } = _ref5,
124
+ props = _objectWithoutProperties(_ref5, _excluded3);
125
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Offcanvas.default, {
126
+ show: show,
127
+ onHide: handleClose,
128
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Header, {
129
+ closeButton: true,
130
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Title, {
131
+ children: "Features"
132
+ })
133
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Body, {
134
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
135
+ className: "sidebar-features",
136
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchBar.SearchBar, {
137
+ searchDiseases: false,
138
+ searchVar: false,
139
+ searchObs: true
140
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
141
+ className: "sidebar-features-list",
142
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsExplorer.ObsExplorer, _objectSpread({}, props))
143
+ })]
144
+ })
145
+ })]
146
+ });
115
147
  }
@@ -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]
@@ -50,6 +50,7 @@ function usePseudospatialData(plotType) {
50
50
  }, [dataset.url, settings.pseudospatial.maskSet, settings.pseudospatial.maskValues, dataset.varNamesCol, isSliced, obsIndices]);
51
51
  const getPlotParams = (0, _react.useCallback)(() => {
52
52
  if (plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE) {
53
+ var _selectedObs$omit;
53
54
  return _objectSpread({
54
55
  varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
55
56
  name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
@@ -57,18 +58,20 @@ function usePseudospatialData(plotType) {
57
58
  } : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index
58
59
  }, settings.sliceBy.obs ? {
59
60
  obsCol: selectedObs,
60
- 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)
61
+ obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit = selectedObs.omit) !== null && _selectedObs$omit !== 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)
61
62
  } : {});
62
63
  } else if (plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL) {
64
+ var _selectedObs$omit2;
63
65
  return {
64
66
  obsCol: selectedObs,
65
- 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),
67
+ obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit2 = selectedObs.omit) !== null && _selectedObs$omit2 !== void 0 && _selectedObs$omit2.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
66
68
  mode: settings.pseudospatial.categoricalMode
67
69
  };
68
70
  } else if (plotType === 'continuous') {
71
+ var _selectedObs$omit3;
69
72
  return {
70
73
  obsCol: selectedObs,
71
- 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)
74
+ obsValues: !(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit3 = selectedObs.omit) !== null && _selectedObs$omit3 !== void 0 && _selectedObs$omit3.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit)
72
75
  };
73
76
  }
74
77
  }, [settings.pseudospatial.categoricalMode, selectedObs, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.isSet, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars, settings.sliceBy.obs, plotType]);