@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
@@ -4,79 +4,57 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.PseudospatialToolbar = PseudospatialToolbar;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
+ var _material = require("@mui/material");
8
9
  var _lodash = _interopRequireDefault(require("lodash"));
9
10
  var _reactBootstrap = require("react-bootstrap");
10
11
  var _constants = require("../../constants/constants");
11
12
  var _DatasetContext = require("../../context/DatasetContext");
12
13
  var _SettingsContext = require("../../context/SettingsContext");
13
- var _requests = require("../../utils/requests");
14
+ var _jsxRuntime = require("react/jsx-runtime");
14
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
- 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); }
16
- 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; }
17
- 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; }
18
- 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; }
19
- function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
20
- 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); }
21
16
  function CategoricalMode() {
22
17
  const settings = (0, _SettingsContext.useSettings)();
23
18
  const dispatch = (0, _SettingsContext.useSettingsDispatch)();
24
- const modeList = _lodash.default.map(_constants.PSEUDOSPATIAL_CATEGORICAL_MODES, (m, key) => /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Item, {
25
- key: key,
19
+ const modeList = _lodash.default.map(_constants.PSEUDOSPATIAL_CATEGORICAL_MODES, (m, key) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
26
20
  active: settings.pseudospatial.categoricalMode === m,
27
21
  onClick: () => {
28
22
  dispatch({
29
- type: "set.pseudospatial.categoricalMode",
23
+ type: 'set.pseudospatial.categoricalMode',
30
24
  categoricalMode: m.value
31
25
  });
32
- }
33
- }, _lodash.default.capitalize(m.name)));
26
+ },
27
+ children: _lodash.default.capitalize(m.name)
28
+ }, key));
34
29
  const mode = _lodash.default.find(_constants.PSEUDOSPATIAL_CATEGORICAL_MODES, {
35
30
  value: settings.pseudospatial.categoricalMode
36
31
  });
37
- return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Toggle, {
38
- variant: "light"
39
- }, _lodash.default.capitalize(mode.name)), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Menu, null, modeList));
32
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Dropdown, {
33
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Toggle, {
34
+ variant: "light",
35
+ children: _lodash.default.capitalize(mode.name)
36
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Menu, {
37
+ children: modeList
38
+ })]
39
+ });
40
40
  }
41
41
  function MaskSet() {
42
42
  var _settings$pseudospati5, _settings$pseudospati6, _maskSets$settings$ps2, _settings$pseudospati7, _settings$pseudospati8, _maskSets$settings$ps3, _settings$pseudospati9;
43
- const ENDPOINT = "masks";
44
- const dataset = (0, _DatasetContext.useDataset)();
45
43
  const settings = (0, _SettingsContext.useSettings)();
46
44
  const dispatch = (0, _SettingsContext.useSettingsDispatch)();
47
- const [maskSets, setMaskSets] = (0, _react.useState)(null);
48
- const [params, setParams] = (0, _react.useState)({
49
- url: dataset.url
50
- });
51
- (0, _react.useEffect)(() => {
52
- setParams(p => {
53
- return _objectSpread(_objectSpread({}, p), {}, {
54
- url: dataset.url
55
- });
56
- });
57
- }, [dataset.url]);
58
45
  const {
59
- fetchedData,
60
- isPending,
61
- serverError
62
- } = (0, _requests.useFetch)(ENDPOINT, params, {
63
- refetchOnMount: false
64
- });
65
- (0, _react.useEffect)(() => {
66
- if (!isPending && !serverError) {
67
- setMaskSets(fetchedData);
68
- }
69
- }, [fetchedData, isPending, serverError]);
70
- const maskSetList = _lodash.default.map(maskSets, (ms, key) => /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Item, {
71
- key: key,
46
+ pseudospatial: maskSets
47
+ } = settings.data;
48
+ const maskSetList = _lodash.default.map(maskSets, (ms, key) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
72
49
  active: settings.pseudospatial.maskSet === key,
73
50
  onClick: () => {
74
51
  dispatch({
75
- type: "set.pseudospatial.maskSet",
52
+ type: 'set.pseudospatial.maskSet',
76
53
  maskSet: key
77
54
  });
78
- }
79
- }, _lodash.default.capitalize(key)));
55
+ },
56
+ children: _lodash.default.capitalize(key)
57
+ }, key));
80
58
  const handleMaskChange = mask => {
81
59
  var _settings$pseudospati, _settings$pseudospati2;
82
60
  let newMasks = settings.pseudospatial.maskValues || (maskSets === null || maskSets === void 0 ? void 0 : maskSets[(_settings$pseudospati = settings.pseudospatial) === null || _settings$pseudospati === void 0 ? void 0 : _settings$pseudospati.maskSet]);
@@ -85,7 +63,7 @@ function MaskSet() {
85
63
  newMasks = null;
86
64
  }
87
65
  dispatch({
88
- type: "set.pseudospatial.maskValues",
66
+ type: 'set.pseudospatial.maskValues',
89
67
  maskValues: newMasks
90
68
  });
91
69
  };
@@ -93,46 +71,116 @@ function MaskSet() {
93
71
  var _settings$pseudospati3, _maskSets$settings$ps, _settings$pseudospati4;
94
72
  if (!settings.pseudospatial.maskValues || ((_settings$pseudospati3 = settings.pseudospatial.maskValues) === null || _settings$pseudospati3 === void 0 ? void 0 : _settings$pseudospati3.length) === (maskSets === null || maskSets === void 0 || (_maskSets$settings$ps = maskSets[(_settings$pseudospati4 = settings.pseudospatial) === null || _settings$pseudospati4 === void 0 ? void 0 : _settings$pseudospati4.maskSet]) === null || _maskSets$settings$ps === void 0 ? void 0 : _maskSets$settings$ps.length)) {
95
73
  dispatch({
96
- type: "set.pseudospatial.maskValues",
74
+ type: 'set.pseudospatial.maskValues',
97
75
  maskValues: []
98
76
  });
99
77
  } else {
100
78
  dispatch({
101
- type: "set.pseudospatial.maskValues",
79
+ type: 'set.pseudospatial.maskValues',
102
80
  maskValues: null
103
81
  });
104
82
  }
105
83
  };
106
- const masksList = _lodash.default.map(maskSets === null || maskSets === void 0 ? void 0 : maskSets[(_settings$pseudospati5 = settings.pseudospatial) === null || _settings$pseudospati5 === void 0 ? void 0 : _settings$pseudospati5.maskSet], mask => /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.ItemText, {
107
- key: mask
108
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Check, {
109
- type: "checkbox",
110
- label: mask,
111
- checked: !settings.pseudospatial.maskValues || settings.pseudospatial.maskValues.includes(mask),
112
- onChange: () => handleMaskChange(mask)
113
- })));
114
- const nMasks = settings.pseudospatial.maskValues ? (_settings$pseudospati6 = settings.pseudospatial.maskValues) === null || _settings$pseudospati6 === void 0 ? void 0 : _settings$pseudospati6.length : (maskSets === null || maskSets === void 0 || (_maskSets$settings$ps2 = maskSets[(_settings$pseudospati7 = settings.pseudospatial) === null || _settings$pseudospati7 === void 0 ? void 0 : _settings$pseudospati7.maskSet]) === null || _maskSets$settings$ps2 === void 0 ? void 0 : _maskSets$settings$ps2.length) || "No";
84
+ const masksList = _lodash.default.map(maskSets === null || maskSets === void 0 ? void 0 : maskSets[(_settings$pseudospati5 = settings.pseudospatial) === null || _settings$pseudospati5 === void 0 ? void 0 : _settings$pseudospati5.maskSet], mask => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.ItemText, {
85
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Check, {
86
+ type: "checkbox",
87
+ label: mask,
88
+ checked: !settings.pseudospatial.maskValues || settings.pseudospatial.maskValues.includes(mask),
89
+ onChange: () => handleMaskChange(mask)
90
+ })
91
+ }, mask));
92
+ const nMasks = settings.pseudospatial.maskValues ? (_settings$pseudospati6 = settings.pseudospatial.maskValues) === null || _settings$pseudospati6 === void 0 ? void 0 : _settings$pseudospati6.length : (maskSets === null || maskSets === void 0 || (_maskSets$settings$ps2 = maskSets[(_settings$pseudospati7 = settings.pseudospatial) === null || _settings$pseudospati7 === void 0 ? void 0 : _settings$pseudospati7.maskSet]) === null || _maskSets$settings$ps2 === void 0 ? void 0 : _maskSets$settings$ps2.length) || 'No';
115
93
  const toggleAllChecked = !settings.pseudospatial.maskValues || ((_settings$pseudospati8 = settings.pseudospatial.maskValues) === null || _settings$pseudospati8 === void 0 ? void 0 : _settings$pseudospati8.length) === (maskSets === null || maskSets === void 0 || (_maskSets$settings$ps3 = maskSets[(_settings$pseudospati9 = settings.pseudospatial) === null || _settings$pseudospati9 === void 0 ? void 0 : _settings$pseudospati9.maskSet]) === null || _maskSets$settings$ps3 === void 0 ? void 0 : _maskSets$settings$ps3.length);
116
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Toggle, {
117
- variant: "light"
118
- }, _lodash.default.capitalize(settings.pseudospatial.maskSet || "Select a mask set")), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Menu, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Header, null, "Mask set"), maskSetList)), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Toggle, {
119
- variant: "light"
120
- }, nMasks, " masks selected"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Menu, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Header, null, "Masks"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.ItemText, {
121
- key: "toggle-all"
122
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Check, {
123
- type: "checkbox",
124
- label: "Toggle all",
125
- checked: toggleAllChecked,
126
- onChange: toggleMasks
127
- })), masksList)));
94
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
95
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Dropdown, {
96
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Toggle, {
97
+ variant: "light",
98
+ children: _lodash.default.capitalize(settings.pseudospatial.maskSet || 'Select a mask set')
99
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Dropdown.Menu, {
100
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Header, {
101
+ children: "Mask set"
102
+ }), maskSetList]
103
+ })]
104
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Dropdown, {
105
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Dropdown.Toggle, {
106
+ variant: "light",
107
+ children: [nMasks, " masks selected"]
108
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Dropdown.Menu, {
109
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Header, {
110
+ children: "Masks"
111
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.ItemText, {
112
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Check, {
113
+ type: "checkbox",
114
+ label: "Toggle all",
115
+ checked: toggleAllChecked,
116
+ onChange: toggleMasks
117
+ })
118
+ }, "toggle-all"), masksList]
119
+ })]
120
+ })]
121
+ });
122
+ }
123
+ function OpacitySlider(_ref) {
124
+ let {
125
+ opacity,
126
+ setOpacity
127
+ } = _ref;
128
+ const [sliderValue, setSliderValue] = (0, _react.useState)(opacity);
129
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
130
+ className: "w-100",
131
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Typography, {
132
+ id: "opacity-range",
133
+ gutterBottom: true,
134
+ children: "Reference image opacity"
135
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
136
+ className: "px-4",
137
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Slider, {
138
+ "aria-labelledby": "opacity-range",
139
+ min: 0,
140
+ max: 1,
141
+ step: 0.05,
142
+ value: sliderValue,
143
+ onChange: (_e, value) => setSliderValue(value),
144
+ onChangeCommitted: (_e, value) => setOpacity(value),
145
+ valueLabelDisplay: "auto",
146
+ getAriaValueText: value => "".concat(value * 100, "%"),
147
+ valueLabelFormat: value => "".concat((value * 100).toFixed(0), "%"),
148
+ marks: [{
149
+ value: 0,
150
+ label: '0%'
151
+ }, {
152
+ value: 1,
153
+ label: '100%'
154
+ }]
155
+ })
156
+ })]
157
+ });
128
158
  }
129
159
 
130
160
  // @TODO: add colormap, colorbar slider
131
- function PseudospatialToolbar(_ref) {
161
+ function PseudospatialToolbar(_ref2) {
132
162
  let {
133
163
  plotType
134
- } = _ref;
135
- return /*#__PURE__*/_react.default.createElement("div", {
136
- className: "cherita-pseudospatial-toolbar"
137
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(MaskSet, null)), /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL && /*#__PURE__*/_react.default.createElement(CategoricalMode, null)));
164
+ } = _ref2;
165
+ const {
166
+ imageUrl
167
+ } = (0, _DatasetContext.useDataset)();
168
+ const settings = (0, _SettingsContext.useSettings)();
169
+ const dispatch = (0, _SettingsContext.useSettingsDispatch)();
170
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
171
+ className: "cherita-pseudospatial-toolbar",
172
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ButtonGroup, {
173
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(MaskSet, {})
174
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ButtonGroup, {
175
+ children: plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL && /*#__PURE__*/(0, _jsxRuntime.jsx)(CategoricalMode, {})
176
+ }), imageUrl && /*#__PURE__*/(0, _jsxRuntime.jsx)(OpacitySlider, {
177
+ opacity: settings.pseudospatial.refImg.opacity,
178
+ setOpacity: opacity => {
179
+ dispatch({
180
+ type: 'set.pseudospatial.refImg.opacity',
181
+ opacity: opacity
182
+ });
183
+ }
184
+ })]
185
+ });
138
186
  }
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Scatterplot = Scatterplot;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
8
  var _layers = require("@deck.gl/layers");
9
9
  var _react2 = require("@deck.gl/react");
10
10
  var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
@@ -24,10 +24,12 @@ var _colorHelper = require("../../helpers/color-helper");
24
24
  var _mapHelper = require("../../helpers/map-helper");
25
25
  var _Legend = require("../../utils/Legend");
26
26
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
27
+ var _Resolver = require("../../utils/Resolver");
27
28
  var _string = require("../../utils/string");
28
29
  var _zarrData = require("../../utils/zarrData");
30
+ var _PlotAlert = require("../full-page/PlotAlert");
31
+ var _jsxRuntime = require("react/jsx-runtime");
29
32
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
30
- 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); }
31
33
  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; }
32
34
  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; }
33
35
  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; }
@@ -43,11 +45,13 @@ const INITIAL_VIEW_STATE = {
43
45
  bearing: 0
44
46
  };
45
47
  function Scatterplot(_ref) {
46
- var _settings$selectedObs2, _settings$selectedObs5, _settings$selectedObs8, _features$features2, _obsmData$serverError, _xData$serverError, _obsData$serverError, _labelObsData$serverE, _settings$selectedVar, _settings$selectedObs9, _data$positions;
48
+ var _features$features2, _obsmData$serverError, _labelObsData$serverE, _settings$selectedVar, _data$positions;
47
49
  let {
48
50
  radius = null,
49
51
  setShowObs,
50
52
  setShowVars,
53
+ plotType,
54
+ setPlotType,
51
55
  isFullscreen = false
52
56
  } = _ref;
53
57
  const {
@@ -74,11 +78,14 @@ function Scatterplot(_ref) {
74
78
  values: []
75
79
  });
76
80
  const [coordsError, setCoordsError] = (0, _react.useState)(null);
81
+ const [hasObsm, setHasObsm] = (0, _react.useState)(true);
82
+ const [dataError, setDataError] = (0, _react.useState)(null);
83
+ const selectedObs = (0, _Resolver.useSelectedObs)();
77
84
 
78
85
  // EditableGeoJsonLayer
79
86
  const [mode, setMode] = (0, _react.useState)(() => _editModes.ViewMode);
80
87
  const [features, setFeatures] = (0, _react.useState)({
81
- type: "FeatureCollection",
88
+ type: 'FeatureCollection',
82
89
  features: settings.polygons[settings.selectedObsm] || []
83
90
  });
84
91
  const [selectedFeatureIndexes, setSelectedFeatureIndexes] = (0, _react.useState)([]);
@@ -107,13 +114,25 @@ function Scatterplot(_ref) {
107
114
  setData(d => {
108
115
  let values = d.values;
109
116
  if (settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR) {
110
- values = !xData.serverError ? xData.data : values;
117
+ if (!xData.serverError) {
118
+ values = xData.data;
119
+ setDataError(null);
120
+ } else {
121
+ values = [];
122
+ setDataError(xData.serverError);
123
+ }
111
124
  } else if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS) {
112
- values = !obsData.serverError ? obsData.data : values;
125
+ if (!obsData.serverError) {
126
+ values = obsData.data;
127
+ setDataError(null);
128
+ } else {
129
+ values = [];
130
+ setDataError(obsData.serverError);
131
+ }
113
132
  }
114
133
  if (!obsmData.serverError && obsmData.data) {
115
134
  if (obsmData.data[0].length !== 2) {
116
- setCoordsError("Invalid coordinates. Expected 2D coordinates");
135
+ setCoordsError('Invalid coordinates. Expected 2D coordinates');
117
136
  return {
118
137
  positions: [],
119
138
  values: []
@@ -182,8 +201,7 @@ function Scatterplot(_ref) {
182
201
  getOriginalIndex,
183
202
  sortedIndexMap
184
203
  } = (0, _react.useMemo)(() => {
185
- var _settings$selectedObs;
186
- if ((settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR || settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && ((_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.type) === _constants.OBS_TYPES.CONTINUOUS) && data.positions && data.values && data.positions.length === data.values.length) {
204
+ if ((settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR || settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === _constants.OBS_TYPES.CONTINUOUS) && data.positions && data.values && data.positions.length === data.values.length) {
187
205
  const sortedIndices = _lodash.default.map(data.values, (_v, i) => i).sort((a, b) => data.values[a] - data.values[b]);
188
206
  const sortedIndexMap = new Map(_lodash.default.map(sortedIndices, (originalIndex, sortedIndex) => [originalIndex, sortedIndex]));
189
207
  return {
@@ -200,24 +218,17 @@ function Scatterplot(_ref) {
200
218
  // return original index
201
219
  sortedIndexMap: identitySortedIndexMap // return original index
202
220
  };
203
- }, [data, identityGetOriginalIndex, identitySortedIndexMap, settings.colorEncoding, (_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.type]);
221
+ }, [data, identityGetOriginalIndex, identitySortedIndexMap, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type, settings.colorEncoding]);
204
222
  const sortedObsIndices = (0, _react.useMemo)(() => {
205
223
  return obsIndices ? new Set(Array.from(obsIndices, i => sortedIndexMap.get(i))) : obsIndices;
206
224
  }, [obsIndices, sortedIndexMap]);
207
225
  const isCategorical = (0, _react.useMemo)(() => {
208
226
  if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS) {
209
- var _settings$selectedObs3, _settings$selectedObs4;
210
- return ((_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.type) === _constants.OBS_TYPES.CATEGORICAL || ((_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.type) === _constants.OBS_TYPES.BOOLEAN;
227
+ return (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;
211
228
  } else {
212
229
  return false;
213
230
  }
214
- }, [settings.colorEncoding, (_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.type]);
215
- (0, _react.useEffect)(() => {
216
- dispatch({
217
- type: "set.controls.valueRange",
218
- valueRange: [valueMin, valueMax]
219
- });
220
- }, [dispatch, valueMax, valueMin]);
231
+ }, [settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type]);
221
232
  const {
222
233
  min,
223
234
  max
@@ -226,7 +237,6 @@ function Scatterplot(_ref) {
226
237
  max: settings.controls.range[1] * (valueMax - valueMin) + valueMin
227
238
  };
228
239
  const getFillColor = (0, _react.useCallback)((_d, _ref2) => {
229
- var _settings$selectedObs6, _settings$selectedObs7;
230
240
  let {
231
241
  index
232
242
  } = _ref2;
@@ -235,10 +245,10 @@ function Scatterplot(_ref) {
235
245
  value: (sortedData.values[index] - min) / (max - min),
236
246
  categorical: isCategorical,
237
247
  grayOut: grayOut
238
- }, useUnsColors && settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && (_settings$selectedObs6 = settings.selectedObs) !== null && _settings$selectedObs6 !== void 0 && _settings$selectedObs6.colors ? {
239
- colorscale: (_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.colors
248
+ }, useUnsColors && settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && selectedObs !== null && selectedObs !== void 0 && selectedObs.colors ? {
249
+ colorscale: selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors
240
250
  } : {})) || [0, 0, 0, 100];
241
- }, [isPending, sortedObsIndices, getColor, sortedData.values, min, max, isCategorical, useUnsColors, settings.colorEncoding, (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.colors]);
251
+ }, [isPending, sortedObsIndices, getColor, sortedData.values, min, max, isCategorical, useUnsColors, settings.colorEncoding, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.colors]);
242
252
 
243
253
  // @TODO: add support for pseudospatial hover to reflect in radius
244
254
  const getRadius = (0, _react.useCallback)((_d, _ref3) => {
@@ -250,7 +260,7 @@ function Scatterplot(_ref) {
250
260
  }, [sortedObsIndices]);
251
261
  const memoizedLayers = (0, _react.useMemo)(() => {
252
262
  return [new _layers.ScatterplotLayer({
253
- id: "cherita-layer-scatterplot",
263
+ id: 'cherita-layer-scatterplot',
254
264
  pickable: true,
255
265
  data: sortedData.positions,
256
266
  radiusScale: radiusScale,
@@ -263,7 +273,7 @@ function Scatterplot(_ref) {
263
273
  getRadius: getRadius
264
274
  }
265
275
  }), new _layers2.EditableGeoJsonLayer({
266
- id: "cherita-layer-draw",
276
+ id: 'cherita-layer-draw',
267
277
  data: features,
268
278
  mode: mode,
269
279
  selectedFeatureIndexes,
@@ -275,7 +285,7 @@ function Scatterplot(_ref) {
275
285
  } = _ref4;
276
286
  setFeatures(updatedData);
277
287
  let updatedSelectedFeatureIndexes = selectedFeatureIndexes;
278
- if (editType === "addFeature") {
288
+ if (editType === 'addFeature') {
279
289
  const {
280
290
  featureIndexes
281
291
  } = editContext;
@@ -303,13 +313,13 @@ function Scatterplot(_ref) {
303
313
  var _features$features;
304
314
  if (!(features !== null && features !== void 0 && (_features$features = features.features) !== null && _features$features !== void 0 && _features$features.length)) {
305
315
  dispatch({
306
- type: "disable.slice.polygons"
316
+ type: 'disable.slice.polygons'
307
317
  });
308
318
  }
309
319
  }, [dispatch, features === null || features === void 0 || (_features$features2 = features.features) === null || _features$features2 === void 0 ? void 0 : _features$features2.length]);
310
320
  (0, _react.useEffect)(() => {
311
321
  dispatch({
312
- type: "set.polygons",
322
+ type: 'set.polygons',
313
323
  obsm: settings.selectedObsm,
314
324
  polygons: (features === null || features === void 0 ? void 0 : features.features) || []
315
325
  });
@@ -319,7 +329,7 @@ function Scatterplot(_ref) {
319
329
  // don't change selection while editing
320
330
  return;
321
331
  }
322
- setSelectedFeatureIndexes(f => info.object ? info.layer.id === "cherita-layer-draw" ? [info.index] : f : []);
332
+ setSelectedFeatureIndexes(f => info.object ? info.layer.id === 'cherita-layer-draw' ? [info.index] : f : []);
323
333
  }
324
334
  const getLabel = function (o, v) {
325
335
  let isVar = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
@@ -334,13 +344,11 @@ function Scatterplot(_ref) {
334
344
  object,
335
345
  index
336
346
  } = _ref5;
337
- if (!object || (object === null || object === void 0 ? void 0 : object.type) === "Feature") return;
347
+ if (!object || (object === null || object === void 0 ? void 0 : object.type) === 'Feature') return;
338
348
  const text = [];
339
- if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && settings.selectedObs && !_lodash.default.some(settings.labelObs, {
340
- name: settings.selectedObs.name
341
- })) {
349
+ if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && selectedObs && !_lodash.default.includes(settings.labelObs, selectedObs.name)) {
342
350
  var _data$values;
343
- text.push(getLabel(settings.selectedObs, (_data$values = data.values) === null || _data$values === void 0 ? void 0 : _data$values[getOriginalIndex(index)]));
351
+ text.push(getLabel(selectedObs, (_data$values = data.values) === null || _data$values === void 0 ? void 0 : _data$values[getOriginalIndex(index)]));
344
352
  }
345
353
  if (settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR && settings.selectedVar) {
346
354
  var _data$values2;
@@ -348,82 +356,102 @@ function Scatterplot(_ref) {
348
356
  }
349
357
  if (settings.labelObs.length) {
350
358
  text.push(..._lodash.default.map(labelObsData.data, (v, k) => {
351
- const labelObs = _lodash.default.find(settings.labelObs, o => o.name === k);
359
+ const labelObs = settings.data.obs[k];
352
360
  return getLabel(labelObs, v[getOriginalIndex(index)]);
353
361
  }));
354
362
  }
355
363
  if (!text.length) return;
356
364
  const grayOut = sortedObsIndices && !sortedObsIndices.has(index);
357
365
  return {
358
- text: text.length ? _lodash.default.compact(text).join("\n") : null,
359
- className: grayOut ? "tooltip-grayout" : "deck-tooltip",
366
+ text: text.length ? _lodash.default.compact(text).join('\n') : null,
367
+ className: grayOut ? 'tooltip-grayout' : 'deck-tooltip',
360
368
  style: !grayOut ? {
361
- "border-left": "3px solid ".concat((0, _colorHelper.rgbToHex)(getFillColor(null, {
369
+ 'border-left': "3px solid ".concat((0, _colorHelper.rgbToHex)(getFillColor(null, {
362
370
  index
363
371
  })))
364
372
  } : {
365
- "border-left": "none"
373
+ 'border-left': 'none'
366
374
  }
367
375
  };
368
376
  };
369
- const error = settings.selectedObsm && ((_obsmData$serverError = obsmData.serverError) === null || _obsmData$serverError === void 0 ? void 0 : _obsmData$serverError.length) || settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR && ((_xData$serverError = xData.serverError) === null || _xData$serverError === void 0 ? void 0 : _xData$serverError.length) || settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && ((_obsData$serverError = obsData.serverError) === null || _obsData$serverError === void 0 ? void 0 : _obsData$serverError.length) || settings.labelObs.length && ((_labelObsData$serverE = labelObsData.serverError) === null || _labelObsData$serverE === void 0 ? void 0 : _labelObsData$serverE.length) || coordsError;
370
- return /*#__PURE__*/_react.default.createElement("div", {
371
- className: "cherita-container-scatterplot"
372
- }, /*#__PURE__*/_react.default.createElement("div", {
373
- className: "cherita-scatterplot"
374
- }, obsmData.isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, {
375
- disableShrink: true
376
- }), isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingLinear, null), /*#__PURE__*/_react.default.createElement(_react2.DeckGL, {
377
- viewState: viewState,
378
- onViewStateChange: e => setViewState(e.viewState),
379
- controller: {
380
- doubleClickZoom: mode === _editModes.ViewMode
381
- },
382
- layers: layers,
383
- onClick: onLayerClick,
384
- getTooltip: getTooltip,
385
- onAfterRender: () => {
386
- setIsRendering(false);
387
- },
388
- useDevicePixels: false,
389
- getCursor: _ref6 => {
390
- let {
391
- isDragging
392
- } = _ref6;
393
- return mode !== _editModes.ViewMode ? "crosshair" : isDragging ? "grabbing" : "grab";
394
- },
395
- ref: deckRef
396
- }), /*#__PURE__*/_react.default.createElement(_SpatialControls.SpatialControls, {
397
- mode: mode,
398
- setMode: setMode,
399
- features: features,
400
- setFeatures: setFeatures,
401
- selectedFeatureIndexes: selectedFeatureIndexes,
402
- resetBounds: () => setViewState(getBounds()),
403
- increaseZoom: () => setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
404
- zoom: v.zoom + 1
405
- })),
406
- decreaseZoom: () => setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
407
- zoom: v.zoom - 1
408
- })),
409
- setShowObs: setShowObs,
410
- setShowVars: setShowVars,
411
- isFullscreen: isFullscreen
412
- }), /*#__PURE__*/_react.default.createElement("div", {
413
- className: "cherita-spatial-footer"
414
- }, /*#__PURE__*/_react.default.createElement("div", {
415
- className: "cherita-toolbox-footer"
416
- }, !!error && !isRendering && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
417
- variant: "danger"
418
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
419
- icon: _freeSolidSvgIcons.faTriangleExclamation
420
- }), "\xA0Error loading data"), /*#__PURE__*/_react.default.createElement(_Toolbox.Toolbox, {
421
- mode: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? (_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name : settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS ? (_settings$selectedObs9 = settings.selectedObs) === null || _settings$selectedObs9 === void 0 ? void 0 : _settings$selectedObs9.name : null,
422
- obsLength: parseInt((_data$positions = data.positions) === null || _data$positions === void 0 ? void 0 : _data$positions.length),
423
- slicedLength: parseInt(slicedLength)
424
- })), /*#__PURE__*/_react.default.createElement(_Legend.Legend, {
425
- isCategorical: isCategorical,
426
- min: min,
427
- max: max
428
- }))));
377
+ const error = settings.selectedObsm && ((_obsmData$serverError = obsmData.serverError) === null || _obsmData$serverError === void 0 ? void 0 : _obsmData$serverError.length) || dataError || settings.labelObs.length && ((_labelObsData$serverE = labelObsData.serverError) === null || _labelObsData$serverE === void 0 ? void 0 : _labelObsData$serverE.length) || coordsError;
378
+ if (!hasObsm) {
379
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotAlert.PlotAlert, {
380
+ variant: "info",
381
+ heading: "Scatterplot unavailable for this dataset",
382
+ plotType: plotType,
383
+ setPlotType: setPlotType,
384
+ children: "This dataset does not include any embeddings, so a scatterplot cannot be displayed. Please choose a different plot type to explore the data."
385
+ });
386
+ }
387
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
388
+ className: "cherita-container-scatterplot",
389
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
390
+ className: "cherita-scatterplot",
391
+ children: [obsmData.isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {
392
+ disableShrink: true
393
+ }), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingLinear, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_react2.DeckGL, {
394
+ viewState: viewState,
395
+ onViewStateChange: e => setViewState(e.viewState),
396
+ controller: {
397
+ doubleClickZoom: mode === _editModes.ViewMode
398
+ },
399
+ layers: layers,
400
+ onClick: onLayerClick,
401
+ getTooltip: getTooltip,
402
+ onAfterRender: () => {
403
+ setIsRendering(false);
404
+ },
405
+ useDevicePixels: false,
406
+ getCursor: _ref6 => {
407
+ let {
408
+ isDragging
409
+ } = _ref6;
410
+ return mode !== _editModes.ViewMode ? 'crosshair' : isDragging ? 'grabbing' : 'grab';
411
+ },
412
+ ref: deckRef
413
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_SpatialControls.SpatialControls, {
414
+ mode: mode,
415
+ setMode: setMode,
416
+ features: features,
417
+ setFeatures: setFeatures,
418
+ selectedFeatureIndexes: selectedFeatureIndexes,
419
+ resetBounds: () => setViewState(getBounds()),
420
+ increaseZoom: () => setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
421
+ zoom: v.zoom + 1
422
+ })),
423
+ decreaseZoom: () => setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
424
+ zoom: v.zoom - 1
425
+ })),
426
+ setShowObs: setShowObs,
427
+ setShowVars: setShowVars,
428
+ isFullscreen: isFullscreen
429
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
430
+ className: "cherita-spatial-footer",
431
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
432
+ className: "cherita-toolbox-footer",
433
+ children: [!!error && !isRendering && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Alert, {
434
+ variant: "danger",
435
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Alert.Heading, {
436
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
437
+ icon: _freeSolidSvgIcons.faTriangleExclamation
438
+ }), "\xA0Error loading data"]
439
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
440
+ className: "mb-0",
441
+ children: error.message
442
+ })]
443
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Toolbox.Toolbox, {
444
+ mode: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? (_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name : settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS ? selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.name : null,
445
+ obsLength: parseInt((_data$positions = data.positions) === null || _data$positions === void 0 ? void 0 : _data$positions.length),
446
+ slicedLength: parseInt(slicedLength),
447
+ setHasObsm: setHasObsm
448
+ })]
449
+ }), !error && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Legend.Legend, {
450
+ isCategorical: isCategorical,
451
+ min: min,
452
+ max: max
453
+ })]
454
+ })]
455
+ })
456
+ });
429
457
  }