@haniffalab/cherita-react 1.5.0 → 2.0.0

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 (80) hide show
  1. package/dist/cjs/components/dotplot/Dotplot.js +24 -19
  2. package/dist/cjs/components/heatmap/Heatmap.js +24 -19
  3. package/dist/cjs/components/matrixplot/Matrixplot.js +24 -19
  4. package/dist/cjs/components/obs-list/ObsItem.js +2 -2
  5. package/dist/cjs/components/offcanvas/{index.js → OffCanvas.js} +34 -1
  6. package/dist/cjs/components/{full-page → plot}/PlotAlert.js +1 -1
  7. package/dist/cjs/components/scatterplot/Scatterplot.js +57 -32
  8. package/dist/cjs/components/scatterplot/ScatterplotControls.js +74 -28
  9. package/dist/cjs/components/scatterplot/SpatialControls.js +37 -24
  10. package/dist/cjs/components/search-bar/SearchBar.js +9 -4
  11. package/dist/cjs/components/search-bar/SearchInfo.js +68 -25
  12. package/dist/cjs/components/search-bar/SearchResults.js +56 -47
  13. package/dist/cjs/components/toolbar/Toolbar.js +47 -42
  14. package/dist/cjs/components/var-list/VarList.js +18 -12
  15. package/dist/cjs/components/var-list/VarSet.js +1 -1
  16. package/dist/cjs/components/violin/Violin.js +26 -21
  17. package/dist/cjs/context/DatasetContext.js +10 -2
  18. package/dist/cjs/context/SettingsContext.js +19 -5
  19. package/dist/cjs/helpers/zarr-helper.js +20 -6
  20. package/dist/cjs/index.js +16 -23
  21. package/dist/cjs/utils/Skeleton.js +38 -2
  22. package/dist/cjs/utils/Slider.js +61 -0
  23. package/dist/cjs/utils/VirtualizedTable.js +97 -0
  24. package/dist/cjs/utils/parquetData.js +60 -0
  25. package/dist/cjs/utils/useNCBIData.js +35 -0
  26. package/dist/cjs/utils/usePlotVisibility.js +21 -0
  27. package/dist/cjs/utils/zarrData.js +51 -2
  28. package/dist/cjs/{components/plot/Plot.js → views/ObservationFeature/EmbeddedPlot.js} +41 -37
  29. package/dist/cjs/{components/full-page/FullPage.js → views/ObservationFeature/StandardView.js} +40 -49
  30. package/dist/cjs/views/ObservationFeature/index.js +12 -0
  31. package/dist/cjs/views/PerturbationMap/EmbeddedPlot.js +56 -0
  32. package/dist/cjs/views/PerturbationMap/ObsExplorer.js +299 -0
  33. package/dist/cjs/{apps/perturbgen/PerturbGen.js → views/PerturbationMap/StandardView.js} +19 -27
  34. package/dist/cjs/views/PerturbationMap/index.js +12 -0
  35. package/dist/css/cherita.css +16 -7
  36. package/dist/css/cherita.css.map +1 -1
  37. package/dist/esm/components/dotplot/Dotplot.js +25 -20
  38. package/dist/esm/components/heatmap/Heatmap.js +25 -20
  39. package/dist/esm/components/matrixplot/Matrixplot.js +25 -20
  40. package/dist/esm/components/obs-list/ObsItem.js +2 -2
  41. package/dist/esm/components/offcanvas/{index.js → OffCanvas.js} +33 -1
  42. package/dist/esm/components/{full-page → plot}/PlotAlert.js +1 -1
  43. package/dist/esm/components/scatterplot/Scatterplot.js +57 -32
  44. package/dist/esm/components/scatterplot/ScatterplotControls.js +74 -28
  45. package/dist/esm/components/scatterplot/SpatialControls.js +37 -24
  46. package/dist/esm/components/search-bar/SearchBar.js +9 -4
  47. package/dist/esm/components/search-bar/SearchInfo.js +69 -26
  48. package/dist/esm/components/search-bar/SearchResults.js +56 -47
  49. package/dist/esm/components/toolbar/Toolbar.js +44 -39
  50. package/dist/esm/components/var-list/VarList.js +18 -12
  51. package/dist/esm/components/var-list/VarSet.js +1 -1
  52. package/dist/esm/components/violin/Violin.js +27 -22
  53. package/dist/esm/context/DatasetContext.js +10 -2
  54. package/dist/esm/context/SettingsContext.js +19 -5
  55. package/dist/esm/helpers/zarr-helper.js +19 -5
  56. package/dist/esm/index.js +4 -5
  57. package/dist/esm/utils/Skeleton.js +35 -1
  58. package/dist/esm/utils/Slider.js +54 -0
  59. package/dist/esm/utils/VirtualizedTable.js +89 -0
  60. package/dist/esm/utils/parquetData.js +51 -0
  61. package/dist/esm/utils/useNCBIData.js +28 -0
  62. package/dist/esm/utils/usePlotVisibility.js +14 -0
  63. package/dist/esm/utils/zarrData.js +48 -0
  64. package/dist/esm/{components/plot/Plot.js → views/ObservationFeature/EmbeddedPlot.js} +37 -33
  65. package/dist/esm/{components/full-page/FullPage.js → views/ObservationFeature/StandardView.js} +35 -44
  66. package/dist/esm/views/ObservationFeature/index.js +6 -0
  67. package/dist/esm/views/PerturbationMap/EmbeddedPlot.js +50 -0
  68. package/dist/esm/views/PerturbationMap/ObsExplorer.js +292 -0
  69. package/dist/esm/{apps/perturbgen/PerturbGen.js → views/PerturbationMap/StandardView.js} +15 -23
  70. package/dist/esm/views/PerturbationMap/index.js +6 -0
  71. package/package.json +8 -4
  72. package/scss/cherita.scss +1 -1
  73. package/scss/components/layouts.scss +0 -1
  74. package/scss/components/lists.scss +1 -1
  75. package/scss/components/plotly.scss +10 -1
  76. package/scss/components/plots.scss +7 -4
  77. package/dist/cjs/apps/perturbgen/ObsExplorer.js +0 -153
  78. package/dist/esm/apps/perturbgen/ObsExplorer.js +0 -147
  79. /package/dist/cjs/components/{full-page → plot}/PlotTypeSelector.js +0 -0
  80. /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,6 +48,10 @@ 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)();
51
+ const {
52
+ showCategoriesBtn,
53
+ showSearchBtn
54
+ } = (0, _usePlotVisibility.default)(isFullscreen);
52
55
  const params = (0, _react.useMemo)(() => {
53
56
  var _selectedObs$omit;
54
57
  return {
@@ -125,19 +128,21 @@ function Dotplot(_ref) {
125
128
  });
126
129
  });
127
130
  }, [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)({
131
+ const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
133
132
  onClick: setShowControls
134
- })]);
135
- const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
133
+ }), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
136
134
  if (!serverError) {
137
135
  if (hasSelections) {
138
136
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
139
137
  className: "cherita-plot cherita-dotplot position-relative",
140
- 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, {
141
146
  data: data,
142
147
  layout: layout,
143
148
  useResizeHandler: true,
@@ -159,15 +164,15 @@ function Dotplot(_ref) {
159
164
  setPlotType: setPlotType,
160
165
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
161
166
  className: "p-0 m-0",
162
- 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, {
163
168
  variant: "link",
164
169
  className: "border-0 p-0 align-baseline",
165
- onClick: setShowVars,
170
+ onClick: setShowSearch,
166
171
  children: "features"
167
- }) : '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, {
168
173
  variant: "link",
169
174
  className: "border-0 p-0 align-baseline",
170
- onClick: setShowObs,
175
+ onClick: setShowCategories,
171
176
  children: "category"
172
177
  }) : 'category', ' ', "to group observations in the dotplot."]
173
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,6 +47,10 @@ 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)();
50
+ const {
51
+ showCategoriesBtn,
52
+ showSearchBtn
53
+ } = (0, _usePlotVisibility.default)(isFullscreen);
51
54
  const params = (0, _react.useMemo)(() => {
52
55
  var _selectedObs$omit;
53
56
  return {
@@ -99,19 +102,21 @@ function Heatmap(_ref) {
99
102
  colorscale.current = settings.controls.colorScale;
100
103
  updateColorscale(colorscale.current);
101
104
  }, [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)({
105
+ const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
107
106
  onClick: setShowControls
108
- })]);
109
- const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
107
+ }), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
110
108
  if (!serverError) {
111
109
  if (hasSelections) {
112
110
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
113
111
  className: "cherita-plot cherita-heatmap position-relative",
114
- 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, {
115
120
  data: data,
116
121
  layout: layout,
117
122
  useResizeHandler: true,
@@ -133,15 +138,15 @@ function Heatmap(_ref) {
133
138
  setPlotType: setPlotType,
134
139
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
135
140
  className: "p-0 m-0",
136
- 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, {
137
142
  variant: "link",
138
143
  className: "border-0 p-0 align-baseline",
139
- onClick: setShowVars,
144
+ onClick: setShowSearch,
140
145
  children: "features"
141
- }) : '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, {
142
147
  variant: "link",
143
148
  className: "border-0 p-0 align-baseline",
144
- onClick: setShowObs,
149
+ onClick: setShowCategories,
145
150
  children: "category"
146
151
  }) : 'category', ' ', "to group observations in the heatmap."]
147
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,6 +47,10 @@ 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)();
50
+ const {
51
+ showCategoriesBtn,
52
+ showSearchBtn
53
+ } = (0, _usePlotVisibility.default)(isFullscreen);
51
54
  const params = (0, _react.useMemo)(() => {
52
55
  var _selectedObs$omit;
53
56
  return {
@@ -100,19 +103,21 @@ function Matrixplot(_ref) {
100
103
  colorscale.current = settings.controls.colorScale;
101
104
  updateColorscale(colorscale.current);
102
105
  }, [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)({
106
+ const modeBarButtons = [_lodash.default.compact([(0, _Toolbar.PlotlyModebarControls)({
108
107
  onClick: setShowControls
109
- })]);
110
- const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
108
+ }), ..._constants.PLOTLY_MODEBAR_BUTTONS])];
111
109
  if (!serverError) {
112
110
  if (hasSelections) {
113
111
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
114
112
  className: "cherita-plot cherita-matrixplot position-relative",
115
- 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, {
116
121
  data: data,
117
122
  layout: layout,
118
123
  useResizeHandler: true,
@@ -134,15 +139,15 @@ function Matrixplot(_ref) {
134
139
  setPlotType: setPlotType,
135
140
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
136
141
  className: "p-0 m-0",
137
- children: ["Select a", ' ', showObsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
142
+ children: ["Select a", ' ', showCategoriesBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
138
143
  variant: "link",
139
144
  className: "border-0 p-0 align-baseline",
140
- onClick: setShowObs,
145
+ onClick: setShowCategories,
141
146
  children: "category"
142
- }) : '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, {
143
148
  variant: "link",
144
149
  className: "border-0 p-0 align-baseline",
145
- onClick: setShowVars,
150
+ onClick: setShowSearch,
146
151
  children: "features"
147
152
  }) : 'features', ' ', "to display the matrix plot."]
148
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 {
@@ -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,34 @@ 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: "Gene Perturbations"
132
+ })
133
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Body, {
134
+ className: "p-1",
135
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
136
+ className: "sidebar-features",
137
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchBar.SearchBar, {
138
+ searchDiseases: false,
139
+ searchVar: false,
140
+ searchObs: true
141
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
142
+ className: "sidebar-features-list",
143
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsExplorer.ObsExplorer, _objectSpread({}, props))
144
+ })]
145
+ })
146
+ })]
147
+ });
115
148
  }
@@ -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]
@@ -27,8 +27,9 @@ var _Legend = require("../../utils/Legend");
27
27
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
28
28
  var _Resolver = require("../../utils/Resolver");
29
29
  var _string = require("../../utils/string");
30
+ var _usePlotVisibility = _interopRequireDefault(require("../../utils/usePlotVisibility"));
30
31
  var _zarrData = require("../../utils/zarrData");
31
- var _PlotAlert = require("../full-page/PlotAlert");
32
+ var _PlotAlert = require("../plot/PlotAlert");
32
33
  var _jsxRuntime = require("react/jsx-runtime");
33
34
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
34
35
  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; }
@@ -45,16 +46,24 @@ const INITIAL_VIEW_STATE = {
45
46
  pitch: 0,
46
47
  bearing: 0
47
48
  };
49
+ const getRadiusScale = bounds => {
50
+ // From 28 degrees ~= 30km -> 30m radius
51
+ const lonDim = bounds[1][0] - bounds[0][0];
52
+ const latDim = bounds[1][1] - bounds[0][1];
53
+ const minDim = Math.min(lonDim, latDim);
54
+ const rs = 0.01 / minDim * 111111;
55
+ return rs;
56
+ };
48
57
  function Scatterplot(_ref) {
49
58
  var _features$features2, _obsmData$serverError, _labelObsData$serverE, _settings$selectedVar, _data$positions2;
50
59
  let {
51
- radius = null,
52
- setShowObs,
53
- setShowVars,
60
+ setShowCategories,
61
+ setShowSearch,
54
62
  plotType,
55
63
  setPlotType,
56
64
  isFullscreen = false,
57
- pointInteractionEnabled = false
65
+ pointInteractionEnabled = false,
66
+ showSpatialControls = true
58
67
  } = _ref;
59
68
  const {
60
69
  useUnsColors
@@ -71,9 +80,9 @@ function Scatterplot(_ref) {
71
80
  getColor
72
81
  } = (0, _colorHelper.useColor)();
73
82
  const deckRef = (0, _react.useRef)(null);
83
+ const [viewport, setViewport] = (0, _react.useState)(null);
74
84
  const [viewState, setViewState] = (0, _react.useState)(INITIAL_VIEW_STATE);
75
85
  const [isRendering, setIsRendering] = (0, _react.useState)(true);
76
- const [radiusScale, setRadiusScale] = (0, _react.useState)(radius || 1);
77
86
  const [isPending, setIsPending] = (0, _react.useState)(false);
78
87
  const [data, setData] = (0, _react.useState)({
79
88
  positions: [],
@@ -82,10 +91,14 @@ function Scatterplot(_ref) {
82
91
  const [coordsError, setCoordsError] = (0, _react.useState)(null);
83
92
  const [hasObsm, setHasObsm] = (0, _react.useState)(true);
84
93
  const [dataError, setDataError] = (0, _react.useState)(null);
94
+ const radiusScale = settings.controls.radiusScale[settings.selectedObsm] || 1;
85
95
  const selectedObs = (0, _Resolver.useSelectedObs)();
86
96
  const selectedObsIndex = settings.selectedObsIndex;
87
97
  const [hoveredIndex, setHoveredIndex] = (0, _react.useState)(null);
88
98
  const [isHoveringPoint, setIsHoveringPoint] = (0, _react.useState)(false);
99
+ const {
100
+ showSearchBtn
101
+ } = (0, _usePlotVisibility.default)(isFullscreen);
89
102
 
90
103
  // EditableGeoJsonLayer
91
104
  const [mode, setMode] = (0, _react.useState)(() => _editModes.ViewMode);
@@ -104,15 +117,6 @@ function Scatterplot(_ref) {
104
117
 
105
118
  // @TODO: assert length of obsmData, xData, obsData is equal
106
119
 
107
- const getRadiusScale = (0, _react.useCallback)(bounds => {
108
- if (!!radius) return radius;
109
- // From 28 degrees ~= 30km -> 30m radius
110
- const lonDim = bounds[1][0] - bounds[0][0];
111
- const latDim = bounds[1][1] - bounds[0][1];
112
- const minDim = Math.min(lonDim, latDim);
113
- const rs = 0.01 / minDim * 111111;
114
- return rs;
115
- }, [radius]);
116
120
  (0, _react.useEffect)(() => {
117
121
  if (obsmData.isPending || settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR && xData.isPending || settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && obsData.isPending) {
118
122
  setIsPending(true);
@@ -159,7 +163,7 @@ function Scatterplot(_ref) {
159
163
  }
160
164
  }, [obsData.data, obsData.isPending, obsData.serverError, obsmData.data, obsmData.isPending, obsmData.serverError, settings.colorEncoding, xData.data, xData.isPending, xData.serverError]);
161
165
  (0, _react.useEffect)(() => {
162
- if (data.positions && !!data.positions.length) {
166
+ if (data.positions && data.positions.length) {
163
167
  var _deckRef$current, _deckRef$current2;
164
168
  const mapHelper = new _mapHelper.MapHelper();
165
169
  const {
@@ -171,16 +175,28 @@ function Scatterplot(_ref) {
171
175
  width: deckRef === null || deckRef === void 0 || (_deckRef$current = deckRef.current) === null || _deckRef$current === void 0 || (_deckRef$current = _deckRef$current.deck) === null || _deckRef$current === void 0 ? void 0 : _deckRef$current.width,
172
176
  height: deckRef === null || deckRef === void 0 || (_deckRef$current2 = deckRef.current) === null || _deckRef$current2 === void 0 || (_deckRef$current2 = _deckRef$current2.deck) === null || _deckRef$current2 === void 0 ? void 0 : _deckRef$current2.height
173
177
  });
174
- setRadiusScale(getRadiusScale(bounds));
175
- setViewState(v => {
176
- return _objectSpread(_objectSpread({}, v), {}, {
177
- longitude: longitude,
178
- latitude: latitude,
179
- zoom: zoom
180
- });
178
+ setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
179
+ latitude,
180
+ longitude,
181
+ zoom
182
+ }));
183
+ setViewport({
184
+ latitude,
185
+ longitude,
186
+ zoom,
187
+ bounds
188
+ });
189
+ }
190
+ }, [data.positions]);
191
+ (0, _react.useEffect)(() => {
192
+ if (viewport !== null && viewport !== void 0 && viewport.bounds && !settings.controls.radiusScale[settings.selectedObsm]) {
193
+ dispatch({
194
+ type: 'set.controls.radiusScale',
195
+ obsm: settings.selectedObsm,
196
+ radiusScale: getRadiusScale(viewport.bounds)
181
197
  });
182
198
  }
183
- }, [getRadiusScale, obsmData.data, obsmData.isPending, obsmData.serverError, data.positions]);
199
+ }, [dispatch, settings.controls.radiusScale, settings.selectedObsm, viewport === null || viewport === void 0 ? void 0 : viewport.bounds]);
184
200
  (0, _react.useEffect)(() => {
185
201
  var _data$positions;
186
202
  if (!pointInteractionEnabled) return;
@@ -295,19 +311,19 @@ function Scatterplot(_ref) {
295
311
  }, useUnsColors && settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && selectedObs !== null && selectedObs !== void 0 && selectedObs.colors ? {
296
312
  colorscale: selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors
297
313
  } : {})) || [0, 0, 0, 100];
298
- }, [isPending, sortedObsIndices, getColor, sortedData.values, min, max, isCategorical, useUnsColors, settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors, selectedObsIndex, getOriginalIndex]);
314
+ }, [isPending, sortedObsIndices, pointInteractionEnabled, getOriginalIndex, selectedObsIndex, getColor, sortedData.values, min, max, isCategorical, useUnsColors, settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors]);
299
315
 
300
316
  // @TODO: add support for pseudospatial hover to reflect in radius
301
- const getRadius = (_d, _ref3) => {
317
+ const getRadius = (0, _react.useCallback)((_d, _ref3) => {
302
318
  let {
303
319
  index
304
320
  } = _ref3;
305
321
  const grayOut = sortedObsIndices && !sortedObsIndices.has(index);
306
322
  if (pointInteractionEnabled && getOriginalIndex(index) === selectedObsIndex) {
307
- return grayOut ? 200 : 200;
323
+ return 50;
308
324
  }
309
- return grayOut ? 1 : 60;
310
- };
325
+ return (grayOut ? 1 : 3) * (pointInteractionEnabled ? 26 : 1);
326
+ }, [getOriginalIndex, pointInteractionEnabled, selectedObsIndex, sortedObsIndices]);
311
327
  const memoizedLayers = (0, _react.useMemo)(() => {
312
328
  return [new _layers.ScatterplotLayer({
313
329
  id: 'cherita-layer-scatterplot',
@@ -399,12 +415,20 @@ function Scatterplot(_ref) {
399
415
  type: 'set.selectedObsIndex',
400
416
  index: originalIndex
401
417
  });
418
+ // in collapsed view, open offcanvas
419
+ if (pointInteractionEnabled && showSearchBtn) {
420
+ setShowSearch(true);
421
+ }
402
422
  }
403
423
  }
404
424
  const getLabel = function (o, v) {
405
425
  let isVar = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
406
426
  if (isVar || o.type === _constants.OBS_TYPES.CONTINUOUS) {
407
427
  return "".concat(o.name, ": ").concat((0, _string.formatNumerical)(parseFloat(v)));
428
+ } else if (o.type === _constants.OBS_TYPES.DISCRETE) {
429
+ return "".concat(o.name, ": ").concat(v);
430
+ } else if (o.type === _constants.OBS_TYPES.BOOLEAN) {
431
+ return "".concat(o.name, ": ").concat(o.codesMap[+v]);
408
432
  } else {
409
433
  return "".concat(o.name, ": ").concat(o.codesMap[v]);
410
434
  }
@@ -426,6 +450,7 @@ function Scatterplot(_ref) {
426
450
  }
427
451
  if (settings.labelObs.length) {
428
452
  text.push(..._lodash.default.map(labelObsData.data, (v, k) => {
453
+ if (!v) return;
429
454
  const labelObs = settings.data.obs[k];
430
455
  return getLabel(labelObs, v[getOriginalIndex(index)]);
431
456
  }));
@@ -492,7 +517,7 @@ function Scatterplot(_ref) {
492
517
  return 'grab';
493
518
  },
494
519
  ref: deckRef
495
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_SpatialControls.SpatialControls, {
520
+ }), showSpatialControls && /*#__PURE__*/(0, _jsxRuntime.jsx)(_SpatialControls.SpatialControls, {
496
521
  mode: mode,
497
522
  setMode: setMode,
498
523
  features: features,
@@ -505,8 +530,8 @@ function Scatterplot(_ref) {
505
530
  decreaseZoom: () => setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
506
531
  zoom: v.zoom - 1
507
532
  })),
508
- setShowObs: setShowObs,
509
- setShowVars: setShowVars,
533
+ setShowCategories: setShowCategories,
534
+ setShowSearch: setShowSearch,
510
535
  isFullscreen: isFullscreen
511
536
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
512
537
  className: "cherita-spatial-footer",