@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
@@ -7,16 +7,21 @@ exports.OffcanvasControls = OffcanvasControls;
7
7
  exports.OffcanvasObs = OffcanvasObs;
8
8
  exports.OffcanvasObsm = OffcanvasObsm;
9
9
  exports.OffcanvasVars = OffcanvasVars;
10
- var _react = _interopRequireDefault(require("react"));
11
10
  var _Offcanvas = _interopRequireDefault(require("react-bootstrap/Offcanvas"));
12
11
  var _constants = require("../../constants/constants");
13
12
  var _ObsList = require("../obs-list/ObsList");
14
13
  var _ObsmList = require("../obsm-list/ObsmList");
15
14
  var _SearchBar = require("../search-bar/SearchBar");
16
15
  var _VarList = require("../var-list/VarList");
16
+ var _jsxRuntime = require("react/jsx-runtime");
17
17
  const _excluded = ["show", "handleClose"],
18
18
  _excluded2 = ["show", "handleClose", "Controls"];
19
19
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
+ 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
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
22
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
23
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
24
+ 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); }
20
25
  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; }
21
26
  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; }
22
27
  function OffcanvasObs(_ref) {
@@ -25,27 +30,38 @@ function OffcanvasObs(_ref) {
25
30
  handleClose
26
31
  } = _ref,
27
32
  props = _objectWithoutProperties(_ref, _excluded);
28
- return /*#__PURE__*/_react.default.createElement(_Offcanvas.default, {
33
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Offcanvas.default, {
29
34
  show: show,
30
35
  onHide: handleClose,
31
- scroll: true
32
- }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Header, {
33
- closeButton: true
34
- }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Title, null, "Categories")), /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Body, {
35
- className: "p-0"
36
- }, /*#__PURE__*/_react.default.createElement(_ObsList.ObsColsList, props)));
36
+ scroll: true,
37
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Header, {
38
+ closeButton: true,
39
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Title, {
40
+ children: "Categories"
41
+ })
42
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Body, {
43
+ className: "p-0",
44
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsList.ObsColsList, _objectSpread({}, props))
45
+ })]
46
+ });
37
47
  }
38
48
  function OffcanvasObsm(_ref2) {
39
49
  let {
40
50
  show,
41
51
  handleClose
42
52
  } = _ref2;
43
- return /*#__PURE__*/_react.default.createElement(_Offcanvas.default, {
53
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Offcanvas.default, {
44
54
  show: show,
45
- onHide: handleClose
46
- }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Header, {
47
- closeButton: true
48
- }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Title, null, "Embedding space")), /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Body, null, /*#__PURE__*/_react.default.createElement(_ObsmList.ObsmKeysList, null)));
55
+ onHide: handleClose,
56
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Header, {
57
+ closeButton: true,
58
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Title, {
59
+ children: "Embedding space"
60
+ })
61
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Body, {
62
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsmList.ObsmKeysList, {})
63
+ })]
64
+ });
49
65
  }
50
66
  function OffcanvasVars(_ref3) {
51
67
  let {
@@ -53,21 +69,29 @@ function OffcanvasVars(_ref3) {
53
69
  handleClose,
54
70
  mode = _constants.SELECTION_MODES.MULTIPLE
55
71
  } = _ref3;
56
- return /*#__PURE__*/_react.default.createElement(_Offcanvas.default, {
72
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Offcanvas.default, {
57
73
  show: show,
58
74
  onHide: handleClose,
59
- className: "offcanvas-vars"
60
- }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Header, {
61
- closeButton: true
62
- }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Title, null, "Features")), /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Body, null, /*#__PURE__*/_react.default.createElement("div", {
63
- className: "sidebar-features"
64
- }, /*#__PURE__*/_react.default.createElement(_SearchBar.SearchBar, {
65
- searchDiseases: true
66
- }), /*#__PURE__*/_react.default.createElement("div", {
67
- className: "sidebar-features-list"
68
- }, /*#__PURE__*/_react.default.createElement(_VarList.VarNamesList, {
69
- mode: mode
70
- })))));
75
+ className: "offcanvas-vars",
76
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Header, {
77
+ closeButton: true,
78
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Title, {
79
+ children: "Features"
80
+ })
81
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Body, {
82
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
83
+ className: "sidebar-features",
84
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchBar.SearchBar, {
85
+ searchDiseases: true
86
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
87
+ className: "sidebar-features-list",
88
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_VarList.VarNamesList, {
89
+ mode: mode
90
+ })
91
+ })]
92
+ })
93
+ })]
94
+ });
71
95
  }
72
96
  function OffcanvasControls(_ref4) {
73
97
  let {
@@ -76,10 +100,16 @@ function OffcanvasControls(_ref4) {
76
100
  Controls
77
101
  } = _ref4,
78
102
  props = _objectWithoutProperties(_ref4, _excluded2);
79
- return /*#__PURE__*/_react.default.createElement(_Offcanvas.default, {
103
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Offcanvas.default, {
80
104
  show: show,
81
- onHide: handleClose
82
- }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Header, {
83
- closeButton: true
84
- }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Title, null, "Controls")), /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Body, null, /*#__PURE__*/_react.default.createElement(Controls, props)));
105
+ onHide: handleClose,
106
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Header, {
107
+ closeButton: true,
108
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Title, {
109
+ children: "Controls"
110
+ })
111
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Offcanvas.default.Body, {
112
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(Controls, _objectSpread({}, props))
113
+ })]
114
+ });
85
115
  }
@@ -5,8 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Pseudospatial = Pseudospatial;
7
7
  exports.PseudospatialImage = PseudospatialImage;
8
- var _react = _interopRequireWildcard(require("react"));
9
- var _fontawesomeSvgCore = require("@fortawesome/fontawesome-svg-core");
8
+ var _react = require("react");
10
9
  var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
11
10
  var _lodash = _interopRequireDefault(require("lodash"));
12
11
  var _reactBootstrap = require("react-bootstrap");
@@ -20,23 +19,24 @@ var _ImageViewer = require("../../utils/ImageViewer");
20
19
  var _Legend = require("../../utils/Legend");
21
20
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
22
21
  var _requests = require("../../utils/requests");
22
+ var _Resolver = require("../../utils/Resolver");
23
+ var _jsxRuntime = require("react/jsx-runtime");
23
24
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
24
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
25
25
  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; }
26
26
  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; }
27
27
  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; }
28
28
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
29
29
  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); }
30
- _fontawesomeSvgCore.library.add(_freeSolidSvgIcons.faSliders);
31
30
  function usePseudospatialData(plotType) {
32
- var _settings$selectedVar5, _settings$selectedVar6, _settings$selectedVar7, _settings$selectedVar8;
33
- const ENDPOINT = "pseudospatial";
31
+ const ENDPOINT = 'pseudospatial';
34
32
  const dataset = (0, _DatasetContext.useDataset)();
35
33
  const settings = (0, _SettingsContext.useSettings)();
36
34
  const {
37
35
  obsIndices,
38
36
  isSliced
39
37
  } = (0, _FilterContext.useFilteredData)();
38
+ const selectedVar = (0, _Resolver.useSelectedVar)();
39
+ const selectedObs = (0, _Resolver.useSelectedObs)();
40
40
  const baseParams = (0, _react.useMemo)(() => {
41
41
  return {
42
42
  url: dataset.url,
@@ -45,54 +45,42 @@ function usePseudospatialData(plotType) {
45
45
  obsIndices: isSliced ? [...(obsIndices || [])] : null,
46
46
  varNamesCol: dataset.varNamesCol,
47
47
  showColorbar: false,
48
- format: "json"
48
+ format: 'json'
49
49
  };
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 _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
54
53
  return _objectSpread({
55
- varKey: (_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet ? {
56
- name: (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name,
57
- indices: (_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars.map(v => v.index)
58
- } : (_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.index
54
+ varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
55
+ name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
56
+ indices: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars.map(v => v.index)
57
+ } : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index
59
58
  }, settings.sliceBy.obs ? {
60
- obsCol: settings.selectedObs,
61
- obsValues: !((_settings$selectedObs = settings.selectedObs) !== null && _settings$selectedObs !== void 0 && _settings$selectedObs.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.codes), (_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.omit).map(c => {
62
- var _settings$selectedObs4;
63
- return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
64
- })
59
+ 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)
65
61
  } : {});
66
62
  } else if (plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL) {
67
- var _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
68
63
  return {
69
- obsCol: settings.selectedObs,
70
- obsValues: !((_settings$selectedObs5 = settings.selectedObs) !== null && _settings$selectedObs5 !== void 0 && _settings$selectedObs5.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.codes), (_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.omit).map(c => {
71
- var _settings$selectedObs8;
72
- return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
73
- }),
64
+ 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),
74
66
  mode: settings.pseudospatial.categoricalMode
75
67
  };
76
- } else if (plotType === "continuous") {
77
- var _settings$selectedObs9, _settings$selectedObs0, _settings$selectedObs1;
68
+ } else if (plotType === 'continuous') {
78
69
  return {
79
- obsCol: settings.selectedObs,
80
- obsValues: !((_settings$selectedObs9 = settings.selectedObs) !== null && _settings$selectedObs9 !== void 0 && _settings$selectedObs9.omit.length) ? null : _lodash.default.difference(_lodash.default.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 => {
81
- var _settings$selectedObs10;
82
- return (_settings$selectedObs10 = settings.selectedObs) === null || _settings$selectedObs10 === void 0 ? void 0 : _settings$selectedObs10.codesMap[c];
83
- })
70
+ 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)
84
72
  };
85
73
  }
86
- }, [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]);
74
+ }, [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]);
87
75
  const params = (0, _react.useMemo)(() => {
88
76
  return _objectSpread(_objectSpread({}, baseParams), getPlotParams());
89
77
  }, [baseParams, getPlotParams]);
90
- return (0, _requests.useDebouncedFetch)(ENDPOINT + "/" + plotType, params, 500, {
78
+ return (0, _requests.useDebouncedFetch)(ENDPOINT + '/' + plotType, params, 500, {
91
79
  enabled: !!plotType && !!settings.pseudospatial.maskSet
92
80
  });
93
81
  }
94
82
  function Pseudospatial(_ref) {
95
- var _settings$selectedObs14, _layout$coloraxis3, _layout$coloraxis4;
83
+ var _layout$coloraxis3, _layout$coloraxis4, _settings$pseudospati2;
96
84
  let {
97
85
  showLegend = true,
98
86
  sharedScaleRange = false,
@@ -101,17 +89,33 @@ function Pseudospatial(_ref) {
101
89
  plotType,
102
90
  setPlotType
103
91
  } = _ref;
92
+ const {
93
+ imageUrl
94
+ } = (0, _DatasetContext.useDataset)();
104
95
  const settings = (0, _SettingsContext.useSettings)();
96
+ const dispatch = (0, _SettingsContext.useSettingsDispatch)();
105
97
  const [data, setData] = (0, _react.useState)([]);
106
98
  const [layout, setLayout] = (0, _react.useState)({});
107
99
  const {
108
100
  getColor
109
101
  } = (0, _colorHelper.useColor)();
110
102
  const colorscale = (0, _react.useRef)(settings.controls.colorScale);
103
+ const {
104
+ valueMin,
105
+ valueMax
106
+ } = (0, _FilterContext.useFilteredData)();
107
+ const selectedObs = (0, _Resolver.useSelectedObs)();
111
108
  (0, _react.useEffect)(() => {
112
- var _settings$selectedObs11, _settings$selectedObs12, _settings$selectedObs13;
113
- setPlotType(settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE : ((_settings$selectedObs11 = settings.selectedObs) === null || _settings$selectedObs11 === void 0 ? void 0 : _settings$selectedObs11.type) === _constants.OBS_TYPES.CATEGORICAL || ((_settings$selectedObs12 = settings.selectedObs) === null || _settings$selectedObs12 === void 0 ? void 0 : _settings$selectedObs12.type) === _constants.OBS_TYPES.BOOLEAN ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL : ((_settings$selectedObs13 = settings.selectedObs) === null || _settings$selectedObs13 === void 0 ? void 0 : _settings$selectedObs13.type) === _constants.OBS_TYPES.CONTINUOUS ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS : _constants.PSEUDOSPATIAL_PLOT_TYPES.MASKS);
114
- }, [settings.colorEncoding, (_settings$selectedObs14 = settings.selectedObs) === null || _settings$selectedObs14 === void 0 ? void 0 : _settings$selectedObs14.type, setPlotType]);
109
+ if (_lodash.default.keys(settings.data.pseudospatial).length && !settings.pseudospatial.maskSet) {
110
+ dispatch({
111
+ type: 'set.pseudospatial.maskSet',
112
+ maskSet: _lodash.default.keys(settings.data.pseudospatial)[0]
113
+ });
114
+ }
115
+ }, [dispatch, settings.data.pseudospatial, settings.pseudospatial.maskSet]);
116
+ (0, _react.useEffect)(() => {
117
+ setPlotType(settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE : (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === _constants.OBS_TYPES.CATEGORICAL || (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === _constants.OBS_TYPES.BOOLEAN ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL : (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === _constants.OBS_TYPES.CONTINUOUS ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS : _constants.PSEUDOSPATIAL_PLOT_TYPES.MASKS);
118
+ }, [settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type, setPlotType]);
115
119
  const updateColorscale = (0, _react.useCallback)(colorscale => {
116
120
  setLayout(l => {
117
121
  return _objectSpread(_objectSpread({}, l), {}, {
@@ -163,8 +167,8 @@ function Pseudospatial(_ref) {
163
167
  min,
164
168
  max
165
169
  } = {
166
- min: settings.controls.range[0] * (settings.controls.valueRange[1] - settings.controls.valueRange[0]) + settings.controls.valueRange[0],
167
- max: settings.controls.range[1] * (settings.controls.valueRange[1] - settings.controls.valueRange[0]) + settings.controls.valueRange[0]
170
+ min: settings.controls.range[0] * (valueMax - valueMin) + valueMin,
171
+ max: settings.controls.range[1] * (valueMax - valueMin) + valueMin
168
172
  };
169
173
  setData(d => {
170
174
  return _lodash.default.map(d, trace => {
@@ -192,45 +196,97 @@ function Pseudospatial(_ref) {
192
196
  });
193
197
  });
194
198
  }
195
- }, [settings.controls.range, settings.controls.valueMax, settings.controls.valueMin, settings.controls.valueRange, getColor, sharedScaleRange]);
199
+ }, [settings.controls.range, settings.controls.valueMax, settings.controls.valueMin, getColor, sharedScaleRange, valueMax, valueMin]);
196
200
  const hasSelections = !!plotType && !!settings.pseudospatial.maskSet;
197
- const faSlidersPath = _freeSolidSvgIcons.faSliders.icon[4];
198
- if (!serverError) {
201
+ const images = (0, _react.useMemo)(() => {
202
+ if (imageUrl) {
203
+ return [_objectSpread({
204
+ source: imageUrl,
205
+ xref: 'paper',
206
+ yref: 'paper',
207
+ x: 0.5,
208
+ y: 0.5,
209
+ sizex: 1,
210
+ sizey: 1,
211
+ sizing: 'contain',
212
+ layer: 'above',
213
+ xanchor: 'center',
214
+ yanchor: 'middle',
215
+ name: 'Reference Image'
216
+ }, settings.pseudospatial.refImg)];
217
+ }
218
+ return [];
219
+ }, [imageUrl, settings.pseudospatial.refImg]);
220
+ const modeBarButtons = (0, _react.useMemo)(() => {
221
+ var _settings$pseudospati;
222
+ 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;
223
+ return [{
224
+ name: 'Open plot controls',
225
+ icon: {
226
+ width: 512,
227
+ height: 512,
228
+ path: _freeSolidSvgIcons.faSliders.icon[4]
229
+ },
230
+ click: () => setShowControls(prev => !prev)
231
+ }, ...(imageUrl ? [{
232
+ name: isRefImgVisible ? 'Hide reference image' : 'Show reference image',
233
+ icon: {
234
+ width: 600,
235
+ height: 512,
236
+ path: _freeSolidSvgIcons.faEye.icon[4]
237
+ },
238
+ click: () => dispatch({
239
+ type: 'toggle.pseudospatial.refImg.visible'
240
+ })
241
+ }] : [])];
242
+ }, [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]);
243
+ if (!_lodash.default.keys(settings.data.pseudospatial).length) {
244
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
245
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
246
+ variant: "warning",
247
+ children: "No pseudospatial data"
248
+ })
249
+ });
250
+ } else if (!serverError) {
199
251
  var _layout$coloraxis5, _layout$coloraxis6;
200
- return /*#__PURE__*/_react.default.createElement("div", {
201
- className: "cherita-pseudospatial"
202
- }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hasSelections && isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), hasSelections && /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
203
- data: data,
204
- layout: _objectSpread(_objectSpread({}, layout), {}, {
205
- autosize: true,
206
- height: height
207
- }),
208
- useResizeHandler: true,
209
- className: "cherita-pseudospatial-plot",
210
- config: {
211
- displaylogo: false,
212
- displayModeBar: true,
213
- modeBarButtonsToAdd: [{
214
- name: "Open plot controls",
215
- icon: {
216
- width: 512,
217
- height: 512,
218
- path: faSlidersPath,
219
- ascent: 512,
220
- descent: 0
221
- },
222
- click: () => setShowControls(prev => !prev)
223
- }]
224
- }
225
- }), hasSelections && showLegend && /*#__PURE__*/_react.default.createElement(_Legend.Legend, {
226
- min: layout === null || layout === void 0 || (_layout$coloraxis5 = layout.coloraxis) === null || _layout$coloraxis5 === void 0 ? void 0 : _layout$coloraxis5.cmin,
227
- max: layout === null || layout === void 0 || (_layout$coloraxis6 = layout.coloraxis) === null || _layout$coloraxis6 === void 0 ? void 0 : _layout$coloraxis6.cmax,
228
- addText: plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE ? " - Mean expression" : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL ? " - %" : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS ? " - Mean value" : ""
229
- })));
252
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
253
+ className: "cherita-pseudospatial",
254
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
255
+ children: [hasSelections && isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), hasSelections && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
256
+ data: data,
257
+ layout: _objectSpread(_objectSpread({}, layout), {}, {
258
+ autosize: true,
259
+ height: height,
260
+ margin: {
261
+ l: 0,
262
+ r: 0,
263
+ t: 0,
264
+ b: 0,
265
+ pad: 0
266
+ },
267
+ images: images
268
+ }),
269
+ useResizeHandler: true,
270
+ className: "cherita-pseudospatial-plot",
271
+ config: {
272
+ displaylogo: false,
273
+ displayModeBar: true,
274
+ modeBarButtonsToAdd: modeBarButtons
275
+ }
276
+ }), hasSelections && showLegend && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Legend.Legend, {
277
+ min: layout === null || layout === void 0 || (_layout$coloraxis5 = layout.coloraxis) === null || _layout$coloraxis5 === void 0 ? void 0 : _layout$coloraxis5.cmin,
278
+ max: layout === null || layout === void 0 || (_layout$coloraxis6 = layout.coloraxis) === null || _layout$coloraxis6 === void 0 ? void 0 : _layout$coloraxis6.cmax,
279
+ addText: plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE ? ' - Mean expression' : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL ? ' - %' : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS ? ' - Mean value' : ''
280
+ })]
281
+ })
282
+ });
230
283
  } else {
231
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
232
- variant: "danger"
233
- }, serverError.message));
284
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
285
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
286
+ variant: "danger",
287
+ children: serverError.message
288
+ })
289
+ });
234
290
  }
235
291
  }
236
292
 
@@ -238,11 +294,11 @@ function Pseudospatial(_ref) {
238
294
  function PseudospatialImage() {
239
295
  const dataset = (0, _DatasetContext.useDataset)();
240
296
  if (dataset.imageUrl) {
241
- return /*#__PURE__*/_react.default.createElement(_ImageViewer.ImageViewer, {
297
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ImageViewer.ImageViewer, {
242
298
  src: dataset.imageUrl,
243
299
  alt: "Pseudospatial reference image"
244
300
  });
245
301
  } else {
246
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
302
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {});
247
303
  }
248
304
  }