@haniffalab/cherita-react 1.4.1 → 1.4.2-dev.2025-10-29.81a6b906

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/controls/Controls.js +38 -30
  3. package/dist/cjs/components/dotplot/Dotplot.js +67 -69
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +100 -74
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +89 -44
  8. package/dist/cjs/components/heatmap/Heatmap.js +65 -65
  9. package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
  10. package/dist/cjs/components/icons/DotPlotIcon.js +64 -0
  11. package/dist/cjs/components/icons/HeatmapIcon.js +45 -0
  12. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +57 -0
  13. package/dist/cjs/components/icons/MatrixPlotIcon.js +59 -0
  14. package/dist/cjs/components/icons/ScatterplotIcon.1.js +164 -0
  15. package/dist/cjs/components/icons/ScatterplotIcon.js +144 -0
  16. package/dist/cjs/components/icons/ViolinPlotIcon.js +42 -0
  17. package/dist/cjs/components/matrixplot/Matrixplot.js +65 -66
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +258 -210
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -133
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +53 -38
  23. package/dist/cjs/components/offcanvas/index.js +61 -31
  24. package/dist/cjs/components/pseudospatial/Pseudospatial.js +132 -76
  25. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +122 -74
  26. package/dist/cjs/components/scatterplot/Scatterplot.js +127 -99
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +140 -113
  29. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  30. package/dist/cjs/components/search-bar/SearchBar.js +168 -121
  31. package/dist/cjs/components/search-bar/SearchInfo.js +76 -50
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +46 -37
  34. package/dist/cjs/components/var-list/VarItem.js +115 -88
  35. package/dist/cjs/components/var-list/VarList.js +85 -69
  36. package/dist/cjs/components/var-list/VarListToolbar.js +59 -54
  37. package/dist/cjs/components/var-list/VarSet.js +126 -108
  38. package/dist/cjs/components/violin/Violin.js +109 -107
  39. package/dist/cjs/components/violin/ViolinControls.js +8 -5
  40. package/dist/cjs/constants/colorscales.js +19 -19
  41. package/dist/cjs/constants/constants.js +47 -47
  42. package/dist/cjs/context/DatasetContext.js +24 -16
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +255 -89
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/zarr-helper.js +3 -3
  48. package/dist/cjs/utils/Filter.js +16 -11
  49. package/dist/cjs/utils/Histogram.js +35 -33
  50. package/dist/cjs/utils/ImageViewer.js +11 -8
  51. package/dist/cjs/utils/Legend.js +37 -30
  52. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  53. package/dist/cjs/utils/Resolver.js +213 -0
  54. package/dist/cjs/utils/Skeleton.js +10 -10
  55. package/dist/cjs/utils/StyledTooltip.js +44 -0
  56. package/dist/cjs/utils/VirtualizedList.js +34 -27
  57. package/dist/cjs/utils/errors.js +15 -15
  58. package/dist/cjs/utils/requests.js +21 -9
  59. package/dist/cjs/utils/search.js +4 -4
  60. package/dist/cjs/utils/string.js +6 -6
  61. package/dist/cjs/utils/zarrData.js +20 -21
  62. package/dist/css/cherita.css +64 -42
  63. package/dist/css/cherita.css.map +1 -1
  64. package/dist/esm/components/controls/Controls.js +43 -35
  65. package/dist/esm/components/dotplot/Dotplot.js +77 -78
  66. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  67. package/dist/esm/components/full-page/FullPage.js +120 -93
  68. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  69. package/dist/esm/components/full-page/PlotTypeSelector.js +90 -45
  70. package/dist/esm/components/heatmap/Heatmap.js +75 -74
  71. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  72. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  73. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  74. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  75. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  76. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  77. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  78. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  79. package/dist/esm/components/matrixplot/Matrixplot.js +75 -75
  80. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  81. package/dist/esm/components/obs-list/ObsItem.js +273 -222
  82. package/dist/esm/components/obs-list/ObsList.js +176 -147
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +60 -44
  85. package/dist/esm/components/offcanvas/index.js +67 -37
  86. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  87. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  88. package/dist/esm/components/scatterplot/Scatterplot.js +148 -119
  89. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  90. package/dist/esm/components/scatterplot/SpatialControls.js +153 -125
  91. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  92. package/dist/esm/components/search-bar/SearchBar.js +180 -132
  93. package/dist/esm/components/search-bar/SearchInfo.js +86 -59
  94. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  95. package/dist/esm/components/toolbar/Toolbar.js +49 -39
  96. package/dist/esm/components/var-list/VarItem.js +126 -98
  97. package/dist/esm/components/var-list/VarList.js +99 -82
  98. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  99. package/dist/esm/components/var-list/VarSet.js +134 -115
  100. package/dist/esm/components/violin/Violin.js +121 -118
  101. package/dist/esm/components/violin/ViolinControls.js +10 -6
  102. package/dist/esm/constants/colorscales.js +19 -19
  103. package/dist/esm/constants/constants.js +47 -47
  104. package/dist/esm/context/DatasetContext.js +31 -22
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +257 -90
  107. package/dist/esm/context/ZarrDataContext.js +8 -6
  108. package/dist/esm/helpers/color-helper.js +5 -5
  109. package/dist/esm/helpers/map-helper.js +2 -2
  110. package/dist/esm/helpers/zarr-helper.js +6 -6
  111. package/dist/esm/index.js +22 -22
  112. package/dist/esm/utils/Filter.js +22 -17
  113. package/dist/esm/utils/Histogram.js +39 -37
  114. package/dist/esm/utils/ImageViewer.js +12 -8
  115. package/dist/esm/utils/Legend.js +44 -36
  116. package/dist/esm/utils/LoadingIndicators.js +16 -13
  117. package/dist/esm/utils/Resolver.js +201 -0
  118. package/dist/esm/utils/Skeleton.js +11 -10
  119. package/dist/esm/utils/StyledTooltip.js +38 -0
  120. package/dist/esm/utils/VirtualizedList.js +35 -27
  121. package/dist/esm/utils/errors.js +15 -15
  122. package/dist/esm/utils/requests.js +24 -12
  123. package/dist/esm/utils/search.js +7 -7
  124. package/dist/esm/utils/string.js +7 -7
  125. package/dist/esm/utils/zarrData.js +27 -28
  126. package/package.json +21 -9
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +43 -17
  129. package/scss/components/accordions.scss +4 -1
  130. package/scss/components/layouts.scss +15 -33
  131. package/scss/components/lists.scss +8 -4
  132. package/scss/components/plotly.scss +38 -26
  133. package/scss/components/plots.scss +14 -1
  134. package/dist/assets/images/plots/dotplot.svg +0 -152
  135. package/dist/assets/images/plots/heatmap.svg +0 -193
  136. package/dist/assets/images/plots/matrixplot.svg +0 -275
  137. package/dist/assets/images/plots/scatterplot.svg +0 -198
  138. package/dist/assets/images/plots/violin.svg +0 -50
@@ -1,41 +1,57 @@
1
1
  const _excluded = ["show", "handleClose"],
2
2
  _excluded2 = ["show", "handleClose", "Controls"];
3
+ 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; }
4
+ 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; }
5
+ 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; }
6
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
7
+ 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); }
3
8
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
4
9
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
5
- import React from "react";
6
- import Offcanvas from "react-bootstrap/Offcanvas";
7
- import { SELECTION_MODES } from "../../constants/constants";
8
- import { ObsColsList } from "../obs-list/ObsList";
9
- import { ObsmKeysList } from "../obsm-list/ObsmList";
10
- import { SearchBar } from "../search-bar/SearchBar";
11
- import { VarNamesList } from "../var-list/VarList";
10
+ import Offcanvas from 'react-bootstrap/Offcanvas';
11
+ import { SELECTION_MODES } from '../../constants/constants';
12
+ import { ObsColsList } from '../obs-list/ObsList';
13
+ import { ObsmKeysList } from '../obsm-list/ObsmList';
14
+ import { SearchBar } from '../search-bar/SearchBar';
15
+ import { VarNamesList } from '../var-list/VarList';
16
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
12
17
  export function OffcanvasObs(_ref) {
13
18
  let {
14
19
  show,
15
20
  handleClose
16
21
  } = _ref,
17
22
  props = _objectWithoutProperties(_ref, _excluded);
18
- return /*#__PURE__*/React.createElement(Offcanvas, {
23
+ return /*#__PURE__*/_jsxs(Offcanvas, {
19
24
  show: show,
20
25
  onHide: handleClose,
21
- scroll: true
22
- }, /*#__PURE__*/React.createElement(Offcanvas.Header, {
23
- closeButton: true
24
- }, /*#__PURE__*/React.createElement(Offcanvas.Title, null, "Categories")), /*#__PURE__*/React.createElement(Offcanvas.Body, {
25
- className: "p-0"
26
- }, /*#__PURE__*/React.createElement(ObsColsList, props)));
26
+ scroll: true,
27
+ children: [/*#__PURE__*/_jsx(Offcanvas.Header, {
28
+ closeButton: true,
29
+ children: /*#__PURE__*/_jsx(Offcanvas.Title, {
30
+ children: "Categories"
31
+ })
32
+ }), /*#__PURE__*/_jsx(Offcanvas.Body, {
33
+ className: "p-0",
34
+ children: /*#__PURE__*/_jsx(ObsColsList, _objectSpread({}, props))
35
+ })]
36
+ });
27
37
  }
28
38
  export function OffcanvasObsm(_ref2) {
29
39
  let {
30
40
  show,
31
41
  handleClose
32
42
  } = _ref2;
33
- return /*#__PURE__*/React.createElement(Offcanvas, {
43
+ return /*#__PURE__*/_jsxs(Offcanvas, {
34
44
  show: show,
35
- onHide: handleClose
36
- }, /*#__PURE__*/React.createElement(Offcanvas.Header, {
37
- closeButton: true
38
- }, /*#__PURE__*/React.createElement(Offcanvas.Title, null, "Embedding space")), /*#__PURE__*/React.createElement(Offcanvas.Body, null, /*#__PURE__*/React.createElement(ObsmKeysList, null)));
45
+ onHide: handleClose,
46
+ children: [/*#__PURE__*/_jsx(Offcanvas.Header, {
47
+ closeButton: true,
48
+ children: /*#__PURE__*/_jsx(Offcanvas.Title, {
49
+ children: "Embedding space"
50
+ })
51
+ }), /*#__PURE__*/_jsx(Offcanvas.Body, {
52
+ children: /*#__PURE__*/_jsx(ObsmKeysList, {})
53
+ })]
54
+ });
39
55
  }
40
56
  export function OffcanvasVars(_ref3) {
41
57
  let {
@@ -43,21 +59,29 @@ export function OffcanvasVars(_ref3) {
43
59
  handleClose,
44
60
  mode = SELECTION_MODES.MULTIPLE
45
61
  } = _ref3;
46
- return /*#__PURE__*/React.createElement(Offcanvas, {
62
+ return /*#__PURE__*/_jsxs(Offcanvas, {
47
63
  show: show,
48
64
  onHide: handleClose,
49
- className: "offcanvas-vars"
50
- }, /*#__PURE__*/React.createElement(Offcanvas.Header, {
51
- closeButton: true
52
- }, /*#__PURE__*/React.createElement(Offcanvas.Title, null, "Features")), /*#__PURE__*/React.createElement(Offcanvas.Body, null, /*#__PURE__*/React.createElement("div", {
53
- className: "sidebar-features"
54
- }, /*#__PURE__*/React.createElement(SearchBar, {
55
- searchDiseases: true
56
- }), /*#__PURE__*/React.createElement("div", {
57
- className: "sidebar-features-list"
58
- }, /*#__PURE__*/React.createElement(VarNamesList, {
59
- mode: mode
60
- })))));
65
+ className: "offcanvas-vars",
66
+ children: [/*#__PURE__*/_jsx(Offcanvas.Header, {
67
+ closeButton: true,
68
+ children: /*#__PURE__*/_jsx(Offcanvas.Title, {
69
+ children: "Features"
70
+ })
71
+ }), /*#__PURE__*/_jsx(Offcanvas.Body, {
72
+ children: /*#__PURE__*/_jsxs("div", {
73
+ className: "sidebar-features",
74
+ children: [/*#__PURE__*/_jsx(SearchBar, {
75
+ searchDiseases: true
76
+ }), /*#__PURE__*/_jsx("div", {
77
+ className: "sidebar-features-list",
78
+ children: /*#__PURE__*/_jsx(VarNamesList, {
79
+ mode: mode
80
+ })
81
+ })]
82
+ })
83
+ })]
84
+ });
61
85
  }
62
86
  export function OffcanvasControls(_ref4) {
63
87
  let {
@@ -66,10 +90,16 @@ export function OffcanvasControls(_ref4) {
66
90
  Controls
67
91
  } = _ref4,
68
92
  props = _objectWithoutProperties(_ref4, _excluded2);
69
- return /*#__PURE__*/React.createElement(Offcanvas, {
93
+ return /*#__PURE__*/_jsxs(Offcanvas, {
70
94
  show: show,
71
- onHide: handleClose
72
- }, /*#__PURE__*/React.createElement(Offcanvas.Header, {
73
- closeButton: true
74
- }, /*#__PURE__*/React.createElement(Offcanvas.Title, null, "Controls")), /*#__PURE__*/React.createElement(Offcanvas.Body, null, /*#__PURE__*/React.createElement(Controls, props)));
95
+ onHide: handleClose,
96
+ children: [/*#__PURE__*/_jsx(Offcanvas.Header, {
97
+ closeButton: true,
98
+ children: /*#__PURE__*/_jsx(Offcanvas.Title, {
99
+ children: "Controls"
100
+ })
101
+ }), /*#__PURE__*/_jsx(Offcanvas.Body, {
102
+ children: /*#__PURE__*/_jsx(Controls, _objectSpread({}, props))
103
+ })]
104
+ });
75
105
  }
@@ -3,31 +3,32 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
3
3
  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; }
4
4
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
5
  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); }
6
- import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";
7
- import { library } from "@fortawesome/fontawesome-svg-core";
8
- import { faSliders } from "@fortawesome/free-solid-svg-icons";
9
- import _ from "lodash";
10
- import { Alert } from "react-bootstrap";
11
- import Plot from "react-plotly.js";
12
- import { COLOR_ENCODINGS, OBS_TYPES, PSEUDOSPATIAL_PLOT_TYPES as PLOT_TYPES } from "../../constants/constants";
13
- import { useDataset } from "../../context/DatasetContext";
14
- import { useFilteredData } from "../../context/FilterContext";
15
- import { useSettings } from "../../context/SettingsContext";
16
- import { rgbToHex, useColor } from "../../helpers/color-helper";
17
- import { ImageViewer } from "../../utils/ImageViewer";
18
- import { Legend } from "../../utils/Legend";
19
- import { LoadingSpinner } from "../../utils/LoadingIndicators";
20
- import { useDebouncedFetch } from "../../utils/requests";
21
- library.add(faSliders);
6
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
7
+ import { faEye, faSliders } from '@fortawesome/free-solid-svg-icons';
8
+ import _ from 'lodash';
9
+ import { Alert } from 'react-bootstrap';
10
+ import Plot from 'react-plotly.js';
11
+ import { COLOR_ENCODINGS, OBS_TYPES, PSEUDOSPATIAL_PLOT_TYPES as PLOT_TYPES } from '../../constants/constants';
12
+ import { useDataset } from '../../context/DatasetContext';
13
+ import { useFilteredData } from '../../context/FilterContext';
14
+ import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
15
+ import { rgbToHex, useColor } from '../../helpers/color-helper';
16
+ import { ImageViewer } from '../../utils/ImageViewer';
17
+ import { Legend } from '../../utils/Legend';
18
+ import { LoadingSpinner } from '../../utils/LoadingIndicators';
19
+ import { useDebouncedFetch } from '../../utils/requests';
20
+ import { useSelectedObs, useSelectedVar } from '../../utils/Resolver';
21
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
22
22
  function usePseudospatialData(plotType) {
23
- var _settings$selectedVar5, _settings$selectedVar6, _settings$selectedVar7, _settings$selectedVar8;
24
- const ENDPOINT = "pseudospatial";
23
+ const ENDPOINT = 'pseudospatial';
25
24
  const dataset = useDataset();
26
25
  const settings = useSettings();
27
26
  const {
28
27
  obsIndices,
29
28
  isSliced
30
29
  } = useFilteredData();
30
+ const selectedVar = useSelectedVar();
31
+ const selectedObs = useSelectedObs();
31
32
  const baseParams = useMemo(() => {
32
33
  return {
33
34
  url: dataset.url,
@@ -36,54 +37,42 @@ function usePseudospatialData(plotType) {
36
37
  obsIndices: isSliced ? [...(obsIndices || [])] : null,
37
38
  varNamesCol: dataset.varNamesCol,
38
39
  showColorbar: false,
39
- format: "json"
40
+ format: 'json'
40
41
  };
41
42
  }, [dataset.url, settings.pseudospatial.maskSet, settings.pseudospatial.maskValues, dataset.varNamesCol, isSliced, obsIndices]);
42
43
  const getPlotParams = useCallback(() => {
43
44
  if (plotType === PLOT_TYPES.GENE) {
44
- var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
45
45
  return _objectSpread({
46
- varKey: (_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet ? {
47
- name: (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name,
48
- indices: (_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars.map(v => v.index)
49
- } : (_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.index
46
+ varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
47
+ name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
48
+ indices: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars.map(v => v.index)
49
+ } : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index
50
50
  }, settings.sliceBy.obs ? {
51
- obsCol: settings.selectedObs,
52
- obsValues: !((_settings$selectedObs = settings.selectedObs) !== null && _settings$selectedObs !== void 0 && _settings$selectedObs.omit.length) ? null : _.difference(_.values((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.codes), (_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.omit).map(c => {
53
- var _settings$selectedObs4;
54
- return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
55
- })
51
+ obsCol: selectedObs,
52
+ obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit)
56
53
  } : {});
57
54
  } else if (plotType === PLOT_TYPES.CATEGORICAL) {
58
- var _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
59
55
  return {
60
- obsCol: settings.selectedObs,
61
- obsValues: !((_settings$selectedObs5 = settings.selectedObs) !== null && _settings$selectedObs5 !== void 0 && _settings$selectedObs5.omit.length) ? null : _.difference(_.values((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.codes), (_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.omit).map(c => {
62
- var _settings$selectedObs8;
63
- return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
64
- }),
56
+ obsCol: selectedObs,
57
+ obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
65
58
  mode: settings.pseudospatial.categoricalMode
66
59
  };
67
- } else if (plotType === "continuous") {
68
- var _settings$selectedObs9, _settings$selectedObs0, _settings$selectedObs1;
60
+ } else if (plotType === 'continuous') {
69
61
  return {
70
- obsCol: settings.selectedObs,
71
- obsValues: !((_settings$selectedObs9 = settings.selectedObs) !== null && _settings$selectedObs9 !== void 0 && _settings$selectedObs9.omit.length) ? null : _.difference(_.values((_settings$selectedObs0 = settings.selectedObs) === null || _settings$selectedObs0 === void 0 ? void 0 : _settings$selectedObs0.codes), (_settings$selectedObs1 = settings.selectedObs) === null || _settings$selectedObs1 === void 0 ? void 0 : _settings$selectedObs1.omit).map(c => {
72
- var _settings$selectedObs10;
73
- return (_settings$selectedObs10 = settings.selectedObs) === null || _settings$selectedObs10 === void 0 ? void 0 : _settings$selectedObs10.codesMap[c];
74
- })
62
+ obsCol: selectedObs,
63
+ obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit)
75
64
  };
76
65
  }
77
- }, [settings.pseudospatial.categoricalMode, settings.selectedObs, (_settings$selectedVar5 = settings.selectedVar) === null || _settings$selectedVar5 === void 0 ? void 0 : _settings$selectedVar5.index, (_settings$selectedVar6 = settings.selectedVar) === null || _settings$selectedVar6 === void 0 ? void 0 : _settings$selectedVar6.isSet, (_settings$selectedVar7 = settings.selectedVar) === null || _settings$selectedVar7 === void 0 ? void 0 : _settings$selectedVar7.name, (_settings$selectedVar8 = settings.selectedVar) === null || _settings$selectedVar8 === void 0 ? void 0 : _settings$selectedVar8.vars, settings.sliceBy.obs, plotType]);
66
+ }, [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]);
78
67
  const params = useMemo(() => {
79
68
  return _objectSpread(_objectSpread({}, baseParams), getPlotParams());
80
69
  }, [baseParams, getPlotParams]);
81
- return useDebouncedFetch(ENDPOINT + "/" + plotType, params, 500, {
70
+ return useDebouncedFetch(ENDPOINT + '/' + plotType, params, 500, {
82
71
  enabled: !!plotType && !!settings.pseudospatial.maskSet
83
72
  });
84
73
  }
85
74
  export function Pseudospatial(_ref) {
86
- var _settings$selectedObs14, _layout$coloraxis3, _layout$coloraxis4;
75
+ var _layout$coloraxis3, _layout$coloraxis4, _settings$pseudospati2;
87
76
  let {
88
77
  showLegend = true,
89
78
  sharedScaleRange = false,
@@ -92,17 +81,33 @@ export function Pseudospatial(_ref) {
92
81
  plotType,
93
82
  setPlotType
94
83
  } = _ref;
84
+ const {
85
+ imageUrl
86
+ } = useDataset();
95
87
  const settings = useSettings();
88
+ const dispatch = useSettingsDispatch();
96
89
  const [data, setData] = useState([]);
97
90
  const [layout, setLayout] = useState({});
98
91
  const {
99
92
  getColor
100
93
  } = useColor();
101
94
  const colorscale = useRef(settings.controls.colorScale);
95
+ const {
96
+ valueMin,
97
+ valueMax
98
+ } = useFilteredData();
99
+ const selectedObs = useSelectedObs();
102
100
  useEffect(() => {
103
- var _settings$selectedObs11, _settings$selectedObs12, _settings$selectedObs13;
104
- setPlotType(settings.colorEncoding === COLOR_ENCODINGS.VAR ? PLOT_TYPES.GENE : ((_settings$selectedObs11 = settings.selectedObs) === null || _settings$selectedObs11 === void 0 ? void 0 : _settings$selectedObs11.type) === OBS_TYPES.CATEGORICAL || ((_settings$selectedObs12 = settings.selectedObs) === null || _settings$selectedObs12 === void 0 ? void 0 : _settings$selectedObs12.type) === OBS_TYPES.BOOLEAN ? PLOT_TYPES.CATEGORICAL : ((_settings$selectedObs13 = settings.selectedObs) === null || _settings$selectedObs13 === void 0 ? void 0 : _settings$selectedObs13.type) === OBS_TYPES.CONTINUOUS ? PLOT_TYPES.CONTINUOUS : PLOT_TYPES.MASKS);
105
- }, [settings.colorEncoding, (_settings$selectedObs14 = settings.selectedObs) === null || _settings$selectedObs14 === void 0 ? void 0 : _settings$selectedObs14.type, setPlotType]);
101
+ if (_.keys(settings.data.pseudospatial).length && !settings.pseudospatial.maskSet) {
102
+ dispatch({
103
+ type: 'set.pseudospatial.maskSet',
104
+ maskSet: _.keys(settings.data.pseudospatial)[0]
105
+ });
106
+ }
107
+ }, [dispatch, settings.data.pseudospatial, settings.pseudospatial.maskSet]);
108
+ useEffect(() => {
109
+ setPlotType(settings.colorEncoding === COLOR_ENCODINGS.VAR ? PLOT_TYPES.GENE : (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === OBS_TYPES.CATEGORICAL || (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === OBS_TYPES.BOOLEAN ? PLOT_TYPES.CATEGORICAL : (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === OBS_TYPES.CONTINUOUS ? PLOT_TYPES.CONTINUOUS : PLOT_TYPES.MASKS);
110
+ }, [settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type, setPlotType]);
106
111
  const updateColorscale = useCallback(colorscale => {
107
112
  setLayout(l => {
108
113
  return _objectSpread(_objectSpread({}, l), {}, {
@@ -154,8 +159,8 @@ export function Pseudospatial(_ref) {
154
159
  min,
155
160
  max
156
161
  } = {
157
- min: settings.controls.range[0] * (settings.controls.valueRange[1] - settings.controls.valueRange[0]) + settings.controls.valueRange[0],
158
- max: settings.controls.range[1] * (settings.controls.valueRange[1] - settings.controls.valueRange[0]) + settings.controls.valueRange[0]
162
+ min: settings.controls.range[0] * (valueMax - valueMin) + valueMin,
163
+ max: settings.controls.range[1] * (valueMax - valueMin) + valueMin
159
164
  };
160
165
  setData(d => {
161
166
  return _.map(d, trace => {
@@ -183,45 +188,97 @@ export function Pseudospatial(_ref) {
183
188
  });
184
189
  });
185
190
  }
186
- }, [settings.controls.range, settings.controls.valueMax, settings.controls.valueMin, settings.controls.valueRange, getColor, sharedScaleRange]);
191
+ }, [settings.controls.range, settings.controls.valueMax, settings.controls.valueMin, getColor, sharedScaleRange, valueMax, valueMin]);
187
192
  const hasSelections = !!plotType && !!settings.pseudospatial.maskSet;
188
- const faSlidersPath = faSliders.icon[4];
189
- if (!serverError) {
193
+ const images = useMemo(() => {
194
+ if (imageUrl) {
195
+ return [_objectSpread({
196
+ source: imageUrl,
197
+ xref: 'paper',
198
+ yref: 'paper',
199
+ x: 0.5,
200
+ y: 0.5,
201
+ sizex: 1,
202
+ sizey: 1,
203
+ sizing: 'contain',
204
+ layer: 'above',
205
+ xanchor: 'center',
206
+ yanchor: 'middle',
207
+ name: 'Reference Image'
208
+ }, settings.pseudospatial.refImg)];
209
+ }
210
+ return [];
211
+ }, [imageUrl, settings.pseudospatial.refImg]);
212
+ const modeBarButtons = useMemo(() => {
213
+ var _settings$pseudospati;
214
+ const isRefImgVisible = (_settings$pseudospati = settings.pseudospatial) === null || _settings$pseudospati === void 0 || (_settings$pseudospati = _settings$pseudospati.refImg) === null || _settings$pseudospati === void 0 ? void 0 : _settings$pseudospati.visible;
215
+ return [{
216
+ name: 'Open plot controls',
217
+ icon: {
218
+ width: 512,
219
+ height: 512,
220
+ path: faSliders.icon[4]
221
+ },
222
+ click: () => setShowControls(prev => !prev)
223
+ }, ...(imageUrl ? [{
224
+ name: isRefImgVisible ? 'Hide reference image' : 'Show reference image',
225
+ icon: {
226
+ width: 600,
227
+ height: 512,
228
+ path: faEye.icon[4]
229
+ },
230
+ click: () => dispatch({
231
+ type: 'toggle.pseudospatial.refImg.visible'
232
+ })
233
+ }] : [])];
234
+ }, [dispatch, imageUrl, setShowControls, (_settings$pseudospati2 = settings.pseudospatial) === null || _settings$pseudospati2 === void 0 || (_settings$pseudospati2 = _settings$pseudospati2.refImg) === null || _settings$pseudospati2 === void 0 ? void 0 : _settings$pseudospati2.visible]);
235
+ if (!_.keys(settings.data.pseudospatial).length) {
236
+ return /*#__PURE__*/_jsx(_Fragment, {
237
+ children: /*#__PURE__*/_jsx(Alert, {
238
+ variant: "warning",
239
+ children: "No pseudospatial data"
240
+ })
241
+ });
242
+ } else if (!serverError) {
190
243
  var _layout$coloraxis5, _layout$coloraxis6;
191
- return /*#__PURE__*/React.createElement("div", {
192
- className: "cherita-pseudospatial"
193
- }, /*#__PURE__*/React.createElement(React.Fragment, null, hasSelections && isPending && /*#__PURE__*/React.createElement(LoadingSpinner, null), hasSelections && /*#__PURE__*/React.createElement(Plot, {
194
- data: data,
195
- layout: _objectSpread(_objectSpread({}, layout), {}, {
196
- autosize: true,
197
- height: height
198
- }),
199
- useResizeHandler: true,
200
- className: "cherita-pseudospatial-plot",
201
- config: {
202
- displaylogo: false,
203
- displayModeBar: true,
204
- modeBarButtonsToAdd: [{
205
- name: "Open plot controls",
206
- icon: {
207
- width: 512,
208
- height: 512,
209
- path: faSlidersPath,
210
- ascent: 512,
211
- descent: 0
212
- },
213
- click: () => setShowControls(prev => !prev)
214
- }]
215
- }
216
- }), hasSelections && showLegend && /*#__PURE__*/React.createElement(Legend, {
217
- min: layout === null || layout === void 0 || (_layout$coloraxis5 = layout.coloraxis) === null || _layout$coloraxis5 === void 0 ? void 0 : _layout$coloraxis5.cmin,
218
- max: layout === null || layout === void 0 || (_layout$coloraxis6 = layout.coloraxis) === null || _layout$coloraxis6 === void 0 ? void 0 : _layout$coloraxis6.cmax,
219
- addText: plotType === PLOT_TYPES.GENE ? " - Mean expression" : plotType === PLOT_TYPES.CATEGORICAL ? " - %" : plotType === PLOT_TYPES.CONTINUOUS ? " - Mean value" : ""
220
- })));
244
+ return /*#__PURE__*/_jsx("div", {
245
+ className: "cherita-pseudospatial",
246
+ children: /*#__PURE__*/_jsxs(_Fragment, {
247
+ children: [hasSelections && isPending && /*#__PURE__*/_jsx(LoadingSpinner, {}), hasSelections && /*#__PURE__*/_jsx(Plot, {
248
+ data: data,
249
+ layout: _objectSpread(_objectSpread({}, layout), {}, {
250
+ autosize: true,
251
+ height: height,
252
+ margin: {
253
+ l: 0,
254
+ r: 0,
255
+ t: 0,
256
+ b: 0,
257
+ pad: 0
258
+ },
259
+ images: images
260
+ }),
261
+ useResizeHandler: true,
262
+ className: "cherita-pseudospatial-plot",
263
+ config: {
264
+ displaylogo: false,
265
+ displayModeBar: true,
266
+ modeBarButtonsToAdd: modeBarButtons
267
+ }
268
+ }), hasSelections && showLegend && /*#__PURE__*/_jsx(Legend, {
269
+ min: layout === null || layout === void 0 || (_layout$coloraxis5 = layout.coloraxis) === null || _layout$coloraxis5 === void 0 ? void 0 : _layout$coloraxis5.cmin,
270
+ max: layout === null || layout === void 0 || (_layout$coloraxis6 = layout.coloraxis) === null || _layout$coloraxis6 === void 0 ? void 0 : _layout$coloraxis6.cmax,
271
+ addText: plotType === PLOT_TYPES.GENE ? ' - Mean expression' : plotType === PLOT_TYPES.CATEGORICAL ? ' - %' : plotType === PLOT_TYPES.CONTINUOUS ? ' - Mean value' : ''
272
+ })]
273
+ })
274
+ });
221
275
  } else {
222
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Alert, {
223
- variant: "danger"
224
- }, serverError.message));
276
+ return /*#__PURE__*/_jsx(_Fragment, {
277
+ children: /*#__PURE__*/_jsx(Alert, {
278
+ variant: "danger",
279
+ children: serverError.message
280
+ })
281
+ });
225
282
  }
226
283
  }
227
284
 
@@ -229,11 +286,11 @@ export function Pseudospatial(_ref) {
229
286
  export function PseudospatialImage() {
230
287
  const dataset = useDataset();
231
288
  if (dataset.imageUrl) {
232
- return /*#__PURE__*/React.createElement(ImageViewer, {
289
+ return /*#__PURE__*/_jsx(ImageViewer, {
233
290
  src: dataset.imageUrl,
234
291
  alt: "Pseudospatial reference image"
235
292
  });
236
293
  } else {
237
- return /*#__PURE__*/React.createElement(React.Fragment, null);
294
+ return /*#__PURE__*/_jsx(_Fragment, {});
238
295
  }
239
296
  }