@haniffalab/cherita-react 1.4.1-dev.2025-10-22.61540191 → 1.4.1-dev.2025-10-23.3179e534

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 (103) hide show
  1. package/dist/cjs/components/controls/Controls.js +38 -30
  2. package/dist/cjs/components/dotplot/Dotplot.js +40 -33
  3. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  4. package/dist/cjs/components/full-page/FullPage.js +92 -69
  5. package/dist/cjs/components/full-page/PlotAlert.js +25 -16
  6. package/dist/cjs/components/full-page/PlotTypeSelector.js +43 -36
  7. package/dist/cjs/components/heatmap/Heatmap.js +40 -33
  8. package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
  9. package/dist/cjs/components/icons/DotPlotIcon.js +16 -10
  10. package/dist/cjs/components/icons/HeatmapIcon.js +17 -11
  11. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +22 -16
  12. package/dist/cjs/components/icons/MatrixPlotIcon.js +22 -16
  13. package/dist/cjs/components/icons/ScatterplotIcon.1.js +21 -15
  14. package/dist/cjs/components/icons/ScatterplotIcon.js +21 -15
  15. package/dist/cjs/components/icons/ViolinPlotIcon.js +22 -14
  16. package/dist/cjs/components/matrixplot/Matrixplot.js +40 -33
  17. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  18. package/dist/cjs/components/obs-list/ObsItem.js +238 -190
  19. package/dist/cjs/components/obs-list/ObsList.js +106 -87
  20. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  21. package/dist/cjs/components/obsm-list/ObsmList.js +47 -32
  22. package/dist/cjs/components/offcanvas/index.js +61 -31
  23. package/dist/cjs/components/pseudospatial/Pseudospatial.js +46 -36
  24. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +98 -68
  25. package/dist/cjs/components/scatterplot/Scatterplot.js +87 -65
  26. package/dist/cjs/components/scatterplot/ScatterplotControls.js +35 -27
  27. package/dist/cjs/components/scatterplot/SpatialControls.js +134 -107
  28. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  29. package/dist/cjs/components/search-bar/SearchBar.js +157 -110
  30. package/dist/cjs/components/search-bar/SearchInfo.js +73 -47
  31. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  32. package/dist/cjs/components/toolbar/Toolbar.js +43 -34
  33. package/dist/cjs/components/var-list/VarItem.js +106 -79
  34. package/dist/cjs/components/var-list/VarList.js +67 -53
  35. package/dist/cjs/components/var-list/VarListToolbar.js +56 -51
  36. package/dist/cjs/components/var-list/VarSet.js +115 -97
  37. package/dist/cjs/components/violin/Violin.js +77 -58
  38. package/dist/cjs/components/violin/ViolinControls.js +8 -5
  39. package/dist/cjs/context/DatasetContext.js +20 -13
  40. package/dist/cjs/context/FilterContext.js +9 -7
  41. package/dist/cjs/context/SettingsContext.js +11 -9
  42. package/dist/cjs/context/ZarrDataContext.js +6 -5
  43. package/dist/cjs/utils/Histogram.js +35 -33
  44. package/dist/cjs/utils/ImageViewer.js +9 -6
  45. package/dist/cjs/utils/Legend.js +36 -29
  46. package/dist/cjs/utils/LoadingIndicators.js +14 -12
  47. package/dist/cjs/utils/Skeleton.js +10 -10
  48. package/dist/cjs/utils/StyledTooltip.js +7 -2
  49. package/dist/cjs/utils/VirtualizedList.js +32 -25
  50. package/dist/cjs/utils/errors.js +1 -1
  51. package/dist/css/cherita.css +6 -1
  52. package/dist/css/cherita.css.map +1 -1
  53. package/dist/esm/components/controls/Controls.js +38 -30
  54. package/dist/esm/components/dotplot/Dotplot.js +40 -33
  55. package/dist/esm/components/dotplot/DotplotControls.js +103 -82
  56. package/dist/esm/components/full-page/FullPage.js +92 -69
  57. package/dist/esm/components/full-page/PlotAlert.js +25 -16
  58. package/dist/esm/components/full-page/PlotTypeSelector.js +43 -36
  59. package/dist/esm/components/heatmap/Heatmap.js +40 -33
  60. package/dist/esm/components/heatmap/HeatmapControls.js +6 -2
  61. package/dist/esm/components/icons/DotPlotIcon.js +16 -10
  62. package/dist/esm/components/icons/HeatmapIcon.js +17 -11
  63. package/dist/esm/components/icons/MatrixPlotIcon.1.js +22 -16
  64. package/dist/esm/components/icons/MatrixPlotIcon.js +22 -16
  65. package/dist/esm/components/icons/ScatterplotIcon.1.js +21 -15
  66. package/dist/esm/components/icons/ScatterplotIcon.js +21 -15
  67. package/dist/esm/components/icons/ViolinPlotIcon.js +22 -14
  68. package/dist/esm/components/matrixplot/Matrixplot.js +40 -33
  69. package/dist/esm/components/matrixplot/MatrixplotControls.js +8 -4
  70. package/dist/esm/components/obs-list/ObsItem.js +237 -186
  71. package/dist/esm/components/obs-list/ObsList.js +106 -86
  72. package/dist/esm/components/obs-list/ObsToolbar.js +2 -2
  73. package/dist/esm/components/obsm-list/ObsmList.js +47 -31
  74. package/dist/esm/components/offcanvas/index.js +61 -31
  75. package/dist/esm/components/pseudospatial/Pseudospatial.js +46 -36
  76. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +98 -68
  77. package/dist/esm/components/scatterplot/Scatterplot.js +87 -64
  78. package/dist/esm/components/scatterplot/ScatterplotControls.js +35 -26
  79. package/dist/esm/components/scatterplot/SpatialControls.js +134 -106
  80. package/dist/esm/components/scatterplot/Toolbox.js +41 -29
  81. package/dist/esm/components/search-bar/SearchBar.js +157 -109
  82. package/dist/esm/components/search-bar/SearchInfo.js +73 -46
  83. package/dist/esm/components/search-bar/SearchResults.js +93 -70
  84. package/dist/esm/components/toolbar/Toolbar.js +43 -33
  85. package/dist/esm/components/var-list/VarItem.js +106 -78
  86. package/dist/esm/components/var-list/VarList.js +67 -52
  87. package/dist/esm/components/var-list/VarListToolbar.js +56 -50
  88. package/dist/esm/components/var-list/VarSet.js +115 -96
  89. package/dist/esm/components/violin/Violin.js +77 -58
  90. package/dist/esm/components/violin/ViolinControls.js +8 -4
  91. package/dist/esm/context/DatasetContext.js +20 -12
  92. package/dist/esm/context/FilterContext.js +9 -6
  93. package/dist/esm/context/SettingsContext.js +11 -8
  94. package/dist/esm/context/ZarrDataContext.js +6 -4
  95. package/dist/esm/utils/Histogram.js +35 -33
  96. package/dist/esm/utils/ImageViewer.js +9 -5
  97. package/dist/esm/utils/Legend.js +36 -28
  98. package/dist/esm/utils/LoadingIndicators.js +14 -11
  99. package/dist/esm/utils/Skeleton.js +10 -9
  100. package/dist/esm/utils/StyledTooltip.js +7 -2
  101. package/dist/esm/utils/VirtualizedList.js +32 -24
  102. package/dist/esm/utils/errors.js +1 -1
  103. package/package.json +3 -3
@@ -20,6 +20,7 @@ var _Legend = require("../../utils/Legend");
20
20
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
21
21
  var _requests = require("../../utils/requests");
22
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
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; }
25
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; }
@@ -240,43 +241,52 @@ function Pseudospatial(_ref) {
240
241
  }] : [])];
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]);
242
243
  if (!_lodash.default.keys(settings.data.pseudospatial).length) {
243
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_reactBootstrap.Alert, {
244
- variant: "warning"
245
- }, "No pseudospatial data"));
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
+ });
246
250
  } else if (!serverError) {
247
251
  var _layout$coloraxis5, _layout$coloraxis6;
248
- return /*#__PURE__*/React.createElement("div", {
249
- className: "cherita-pseudospatial"
250
- }, /*#__PURE__*/React.createElement(React.Fragment, null, hasSelections && isPending && /*#__PURE__*/React.createElement(_LoadingIndicators.LoadingSpinner, null), hasSelections && /*#__PURE__*/React.createElement(_reactPlotly.default, {
251
- data: data,
252
- layout: _objectSpread(_objectSpread({}, layout), {}, {
253
- autosize: true,
254
- height: height,
255
- margin: {
256
- l: 0,
257
- r: 0,
258
- t: 0,
259
- b: 0,
260
- pad: 0
261
- },
262
- images: images
263
- }),
264
- useResizeHandler: true,
265
- className: "cherita-pseudospatial-plot",
266
- config: {
267
- displaylogo: false,
268
- displayModeBar: true,
269
- modeBarButtonsToAdd: modeBarButtons
270
- }
271
- }), hasSelections && showLegend && /*#__PURE__*/React.createElement(_Legend.Legend, {
272
- min: layout === null || layout === void 0 || (_layout$coloraxis5 = layout.coloraxis) === null || _layout$coloraxis5 === void 0 ? void 0 : _layout$coloraxis5.cmin,
273
- max: layout === null || layout === void 0 || (_layout$coloraxis6 = layout.coloraxis) === null || _layout$coloraxis6 === void 0 ? void 0 : _layout$coloraxis6.cmax,
274
- addText: plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE ? " - Mean expression" : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL ? " - %" : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS ? " - Mean value" : ""
275
- })));
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
+ });
276
283
  } else {
277
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_reactBootstrap.Alert, {
278
- variant: "danger"
279
- }, 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
+ });
280
290
  }
281
291
  }
282
292
 
@@ -284,11 +294,11 @@ function Pseudospatial(_ref) {
284
294
  function PseudospatialImage() {
285
295
  const dataset = (0, _DatasetContext.useDataset)();
286
296
  if (dataset.imageUrl) {
287
- return /*#__PURE__*/React.createElement(_ImageViewer.ImageViewer, {
297
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_ImageViewer.ImageViewer, {
288
298
  src: dataset.imageUrl,
289
299
  alt: "Pseudospatial reference image"
290
300
  });
291
301
  } else {
292
- return /*#__PURE__*/React.createElement(React.Fragment, null);
302
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {});
293
303
  }
294
304
  }
@@ -11,26 +11,32 @@ var _reactBootstrap = require("react-bootstrap");
11
11
  var _constants = require("../../constants/constants");
12
12
  var _DatasetContext = require("../../context/DatasetContext");
13
13
  var _SettingsContext = require("../../context/SettingsContext");
14
+ var _jsxRuntime = require("react/jsx-runtime");
14
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
16
  function CategoricalMode() {
16
17
  const settings = (0, _SettingsContext.useSettings)();
17
18
  const dispatch = (0, _SettingsContext.useSettingsDispatch)();
18
- const modeList = _lodash.default.map(_constants.PSEUDOSPATIAL_CATEGORICAL_MODES, (m, key) => /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown.Item, {
19
- key: key,
19
+ const modeList = _lodash.default.map(_constants.PSEUDOSPATIAL_CATEGORICAL_MODES, (m, key) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
20
20
  active: settings.pseudospatial.categoricalMode === m,
21
21
  onClick: () => {
22
22
  dispatch({
23
23
  type: "set.pseudospatial.categoricalMode",
24
24
  categoricalMode: m.value
25
25
  });
26
- }
27
- }, _lodash.default.capitalize(m.name)));
26
+ },
27
+ children: _lodash.default.capitalize(m.name)
28
+ }, key));
28
29
  const mode = _lodash.default.find(_constants.PSEUDOSPATIAL_CATEGORICAL_MODES, {
29
30
  value: settings.pseudospatial.categoricalMode
30
31
  });
31
- return /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown, null, /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown.Toggle, {
32
- variant: "light"
33
- }, _lodash.default.capitalize(mode.name)), /*#__PURE__*/React.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
+ });
34
40
  }
35
41
  function MaskSet() {
36
42
  var _settings$pseudospati5, _settings$pseudospati6, _maskSets$settings$ps2, _settings$pseudospati7, _settings$pseudospati8, _maskSets$settings$ps3, _settings$pseudospati9;
@@ -39,16 +45,16 @@ function MaskSet() {
39
45
  const {
40
46
  pseudospatial: maskSets
41
47
  } = settings.data;
42
- const maskSetList = _lodash.default.map(maskSets, (ms, key) => /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown.Item, {
43
- key: key,
48
+ const maskSetList = _lodash.default.map(maskSets, (ms, key) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
44
49
  active: settings.pseudospatial.maskSet === key,
45
50
  onClick: () => {
46
51
  dispatch({
47
52
  type: "set.pseudospatial.maskSet",
48
53
  maskSet: key
49
54
  });
50
- }
51
- }, _lodash.default.capitalize(key)));
55
+ },
56
+ children: _lodash.default.capitalize(key)
57
+ }, key));
52
58
  const handleMaskChange = mask => {
53
59
  var _settings$pseudospati, _settings$pseudospati2;
54
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]);
@@ -75,28 +81,44 @@ function MaskSet() {
75
81
  });
76
82
  }
77
83
  };
78
- 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.createElement(_reactBootstrap.Dropdown.ItemText, {
79
- key: mask
80
- }, /*#__PURE__*/React.createElement(_reactBootstrap.Form.Check, {
81
- type: "checkbox",
82
- label: mask,
83
- checked: !settings.pseudospatial.maskValues || settings.pseudospatial.maskValues.includes(mask),
84
- onChange: () => handleMaskChange(mask)
85
- })));
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));
86
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";
87
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);
88
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown, null, /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown.Toggle, {
89
- variant: "light"
90
- }, _lodash.default.capitalize(settings.pseudospatial.maskSet || "Select a mask set")), /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown.Menu, null, /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown.Header, null, "Mask set"), maskSetList)), /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown, null, /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown.Toggle, {
91
- variant: "light"
92
- }, nMasks, " masks selected"), /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown.Menu, null, /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown.Header, null, "Masks"), /*#__PURE__*/React.createElement(_reactBootstrap.Dropdown.ItemText, {
93
- key: "toggle-all"
94
- }, /*#__PURE__*/React.createElement(_reactBootstrap.Form.Check, {
95
- type: "checkbox",
96
- label: "Toggle all",
97
- checked: toggleAllChecked,
98
- onChange: toggleMasks
99
- })), 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
+ });
100
122
  }
101
123
  function OpacitySlider(_ref) {
102
124
  let {
@@ -104,32 +126,35 @@ function OpacitySlider(_ref) {
104
126
  setOpacity
105
127
  } = _ref;
106
128
  const [sliderValue, setSliderValue] = (0, _react.useState)(opacity);
107
- return /*#__PURE__*/React.createElement(_material.Box, {
108
- className: "w-100"
109
- }, /*#__PURE__*/React.createElement(_material.Typography, {
110
- id: "opacity-range",
111
- gutterBottom: true
112
- }, "Reference image opacity"), /*#__PURE__*/React.createElement("div", {
113
- className: "px-4"
114
- }, /*#__PURE__*/React.createElement(_material.Slider, {
115
- "aria-labelledby": "opacity-range",
116
- min: 0,
117
- max: 1,
118
- step: 0.05,
119
- value: sliderValue,
120
- onChange: (_e, value) => setSliderValue(value),
121
- onChangeCommitted: (_e, value) => setOpacity(value),
122
- valueLabelDisplay: "auto",
123
- getAriaValueText: value => "".concat(value * 100, "%"),
124
- valueLabelFormat: value => "".concat((value * 100).toFixed(0), "%"),
125
- marks: [{
126
- value: 0,
127
- label: "0%"
128
- }, {
129
- value: 1,
130
- label: "100%"
131
- }]
132
- })));
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
+ });
133
158
  }
134
159
 
135
160
  // @TODO: add colormap, colorbar slider
@@ -142,15 +167,20 @@ function PseudospatialToolbar(_ref2) {
142
167
  } = (0, _DatasetContext.useDataset)();
143
168
  const settings = (0, _SettingsContext.useSettings)();
144
169
  const dispatch = (0, _SettingsContext.useSettingsDispatch)();
145
- return /*#__PURE__*/React.createElement("div", {
146
- className: "cherita-pseudospatial-toolbar"
147
- }, /*#__PURE__*/React.createElement(_reactBootstrap.ButtonGroup, null, /*#__PURE__*/React.createElement(MaskSet, null)), /*#__PURE__*/React.createElement(_reactBootstrap.ButtonGroup, null, plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL && /*#__PURE__*/React.createElement(CategoricalMode, null)), imageUrl && /*#__PURE__*/React.createElement(OpacitySlider, {
148
- opacity: settings.pseudospatial.refImg.opacity,
149
- setOpacity: opacity => {
150
- dispatch({
151
- type: "set.pseudospatial.refImg.opacity",
152
- opacity: opacity
153
- });
154
- }
155
- }));
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
+ });
156
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");
@@ -13,8 +13,6 @@ var _editModes = require("@nebula.gl/edit-modes");
13
13
  var _layers2 = require("@nebula.gl/layers");
14
14
  var _lodash = _interopRequireDefault(require("lodash"));
15
15
  var _reactBootstrap = require("react-bootstrap");
16
- var _SpatialControls = require("./SpatialControls");
17
- var _Toolbox = require("./Toolbox");
18
16
  var _constants = require("../../constants/constants");
19
17
  var _DatasetContext = require("../../context/DatasetContext");
20
18
  var _FilterContext = require("../../context/FilterContext");
@@ -27,8 +25,11 @@ var _LoadingIndicators = require("../../utils/LoadingIndicators");
27
25
  var _Resolver = require("../../utils/Resolver");
28
26
  var _string = require("../../utils/string");
29
27
  var _zarrData = require("../../utils/zarrData");
28
+ var _PlotAlert = require("../full-page/PlotAlert");
29
+ var _SpatialControls = require("./SpatialControls");
30
+ var _Toolbox = require("./Toolbox");
31
+ var _jsxRuntime = require("react/jsx-runtime");
30
32
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
31
- 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); }
32
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; }
33
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; }
34
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; }
@@ -49,6 +50,8 @@ function Scatterplot(_ref) {
49
50
  radius = null,
50
51
  setShowObs,
51
52
  setShowVars,
53
+ plotType,
54
+ setPlotType,
52
55
  isFullscreen = false
53
56
  } = _ref;
54
57
  const {
@@ -75,6 +78,7 @@ function Scatterplot(_ref) {
75
78
  values: []
76
79
  });
77
80
  const [coordsError, setCoordsError] = (0, _react.useState)(null);
81
+ const [hasObsm, setHasObsm] = (0, _react.useState)(true);
78
82
  const [dataError, setDataError] = (0, _react.useState)(null);
79
83
  const selectedObs = (0, _Resolver.useSelectedObs)();
80
84
 
@@ -371,65 +375,83 @@ function Scatterplot(_ref) {
371
375
  };
372
376
  };
373
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;
374
- return /*#__PURE__*/_react.default.createElement("div", {
375
- className: "cherita-container-scatterplot"
376
- }, /*#__PURE__*/_react.default.createElement("div", {
377
- className: "cherita-scatterplot"
378
- }, obsmData.isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, {
379
- disableShrink: true
380
- }), isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingLinear, null), /*#__PURE__*/_react.default.createElement(_react2.DeckGL, {
381
- viewState: viewState,
382
- onViewStateChange: e => setViewState(e.viewState),
383
- controller: {
384
- doubleClickZoom: mode === _editModes.ViewMode
385
- },
386
- layers: layers,
387
- onClick: onLayerClick,
388
- getTooltip: getTooltip,
389
- onAfterRender: () => {
390
- setIsRendering(false);
391
- },
392
- useDevicePixels: false,
393
- getCursor: _ref6 => {
394
- let {
395
- isDragging
396
- } = _ref6;
397
- return mode !== _editModes.ViewMode ? "crosshair" : isDragging ? "grabbing" : "grab";
398
- },
399
- ref: deckRef
400
- }), /*#__PURE__*/_react.default.createElement(_SpatialControls.SpatialControls, {
401
- mode: mode,
402
- setMode: setMode,
403
- features: features,
404
- setFeatures: setFeatures,
405
- selectedFeatureIndexes: selectedFeatureIndexes,
406
- resetBounds: () => setViewState(getBounds()),
407
- increaseZoom: () => setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
408
- zoom: v.zoom + 1
409
- })),
410
- decreaseZoom: () => setViewState(v => _objectSpread(_objectSpread({}, v), {}, {
411
- zoom: v.zoom - 1
412
- })),
413
- setShowObs: setShowObs,
414
- setShowVars: setShowVars,
415
- isFullscreen: isFullscreen
416
- }), /*#__PURE__*/_react.default.createElement("div", {
417
- className: "cherita-spatial-footer"
418
- }, /*#__PURE__*/_react.default.createElement("div", {
419
- className: "cherita-toolbox-footer"
420
- }, !!error && !isRendering && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
421
- variant: "danger"
422
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert.Heading, null, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
423
- icon: _freeSolidSvgIcons.faTriangleExclamation
424
- }), "\xA0Error loading data"), /*#__PURE__*/_react.default.createElement("p", {
425
- className: "mb-0"
426
- }, error.message)), /*#__PURE__*/_react.default.createElement(_Toolbox.Toolbox, {
427
- 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,
428
- obsLength: parseInt((_data$positions = data.positions) === null || _data$positions === void 0 ? void 0 : _data$positions.length),
429
- slicedLength: parseInt(slicedLength)
430
- })), !error && /*#__PURE__*/_react.default.createElement(_Legend.Legend, {
431
- isCategorical: isCategorical,
432
- min: min,
433
- max: max
434
- }))));
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
+ });
435
457
  }
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.ScatterplotControls = void 0;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
8
  var _material = require("@mui/material");
9
9
  var _reactBootstrap = require("react-bootstrap");
10
10
  var _constants = require("../../constants/constants");
@@ -12,11 +12,11 @@ var _FilterContext = require("../../context/FilterContext");
12
12
  var _SettingsContext = require("../../context/SettingsContext");
13
13
  var _Resolver = require("../../utils/Resolver");
14
14
  var _Controls = require("../controls/Controls");
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); }
15
+ var _jsxRuntime = require("react/jsx-runtime");
16
16
  const ScatterplotControls = () => {
17
17
  const settings = (0, _SettingsContext.useSettings)();
18
18
  const dispatch = (0, _SettingsContext.useSettingsDispatch)();
19
- const [sliderValue, setSliderValue] = _react.default.useState(settings.controls.range || [0, 1]);
19
+ const [sliderValue, setSliderValue] = (0, _react.useState)(settings.controls.range || [0, 1]);
20
20
  const {
21
21
  valueMin,
22
22
  valueMax
@@ -46,29 +46,37 @@ const ScatterplotControls = () => {
46
46
  (0, _react.useEffect)(() => {
47
47
  setSliderValue(settings.controls.range);
48
48
  }, [settings.controls.range]);
49
- const rangeSlider = /*#__PURE__*/_react.default.createElement(_material.Box, {
50
- className: "w-100"
51
- }, /*#__PURE__*/_react.default.createElement(_material.Typography, {
52
- id: "colorscale-range",
53
- gutterBottom: true
54
- }, "Colorscale range"), /*#__PURE__*/_react.default.createElement("div", {
55
- className: "px-4"
56
- }, /*#__PURE__*/_react.default.createElement(_material.Slider, {
57
- "aria-labelledby": "colorscale-range",
58
- min: 0,
59
- max: 1,
60
- step: 0.001,
61
- value: sliderValue,
62
- onChange: updateSlider,
63
- onChangeCommitted: updateRange,
64
- valueLabelDisplay: "auto",
65
- getAriaValueText: valueLabelFormat,
66
- valueLabelFormat: valueLabelFormat,
67
- marks: marks,
68
- disabled: isCategorical
69
- })));
70
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form, null, /*#__PURE__*/_react.default.createElement(_Controls.ColorscaleSelect, null), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Group, {
71
- className: "mb-2"
72
- }, rangeSlider)));
49
+ const rangeSlider = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
50
+ className: "w-100",
51
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Typography, {
52
+ id: "colorscale-range",
53
+ gutterBottom: true,
54
+ children: "Colorscale range"
55
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
56
+ className: "px-4",
57
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Slider, {
58
+ "aria-labelledby": "colorscale-range",
59
+ min: 0,
60
+ max: 1,
61
+ step: 0.001,
62
+ value: sliderValue,
63
+ onChange: updateSlider,
64
+ onChangeCommitted: updateRange,
65
+ valueLabelDisplay: "auto",
66
+ getAriaValueText: valueLabelFormat,
67
+ valueLabelFormat: valueLabelFormat,
68
+ marks: marks,
69
+ disabled: isCategorical
70
+ })
71
+ })]
72
+ });
73
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
74
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Form, {
75
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Controls.ColorscaleSelect, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Group, {
76
+ className: "mb-2",
77
+ children: rangeSlider
78
+ })]
79
+ })
80
+ });
73
81
  };
74
82
  exports.ScatterplotControls = ScatterplotControls;