@haniffalab/cherita-react 0.2.1 → 1.0.0-dev.2025-03-07.aedc1788

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.
@@ -61,12 +61,13 @@ function OffcanvasVars({
61
61
  function OffcanvasControls({
62
62
  show,
63
63
  handleClose,
64
- Controls
64
+ Controls,
65
+ ...props
65
66
  }) {
66
67
  return /*#__PURE__*/_react.default.createElement(_Offcanvas.default, {
67
68
  show: show,
68
69
  onHide: handleClose
69
70
  }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Header, {
70
71
  closeButton: true
71
- }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Title, null, "Controls")), /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Body, null, /*#__PURE__*/_react.default.createElement(Controls, null)));
72
+ }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Title, null, "Controls")), /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Body, null, /*#__PURE__*/_react.default.createElement(Controls, props)));
72
73
  }
@@ -6,10 +6,11 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.Pseudospatial = Pseudospatial;
7
7
  exports.PseudospatialImage = PseudospatialImage;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
+ var _fontawesomeSvgCore = require("@fortawesome/fontawesome-svg-core");
10
+ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
11
  var _lodash = _interopRequireDefault(require("lodash"));
10
12
  var _reactBootstrap = require("react-bootstrap");
11
13
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
12
- var _PseudospatialToolbar = require("./PseudospatialToolbar");
13
14
  var _constants = require("../../constants/constants");
14
15
  var _DatasetContext = require("../../context/DatasetContext");
15
16
  var _FilterContext = require("../../context/FilterContext");
@@ -21,6 +22,7 @@ var _requests = require("../../utils/requests");
21
22
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
22
23
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
23
24
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
25
+ _fontawesomeSvgCore.library.add(_freeSolidSvgIcons.faSliders);
24
26
  function usePseudospatialData(plotType) {
25
27
  const ENDPOINT = "pseudospatial";
26
28
  const dataset = (0, _DatasetContext.useDataset)();
@@ -76,7 +78,11 @@ function usePseudospatialData(plotType) {
76
78
  }
77
79
  function Pseudospatial({
78
80
  showLegend = true,
79
- sharedScaleRange = false
81
+ sharedScaleRange = false,
82
+ height = 200,
83
+ setShowControls,
84
+ plotType,
85
+ setPlotType
80
86
  }) {
81
87
  const dataset = (0, _DatasetContext.useDataset)();
82
88
  const [data, setData] = (0, _react.useState)([]);
@@ -85,7 +91,9 @@ function Pseudospatial({
85
91
  getColor
86
92
  } = (0, _colorHelper.useColor)();
87
93
  const colorscale = (0, _react.useRef)(dataset.controls.colorScale);
88
- const plotType = dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE : dataset.selectedObs?.type === _constants.OBS_TYPES.CATEGORICAL || dataset.selectedObs?.type === _constants.OBS_TYPES.BOOLEAN ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL : dataset.selectedObs?.type === _constants.OBS_TYPES.CONTINUOUS ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS : _constants.PSEUDOSPATIAL_PLOT_TYPES.MASKS;
94
+ (0, _react.useEffect)(() => {
95
+ setPlotType(dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE : dataset.selectedObs?.type === _constants.OBS_TYPES.CATEGORICAL || dataset.selectedObs?.type === _constants.OBS_TYPES.BOOLEAN ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL : dataset.selectedObs?.type === _constants.OBS_TYPES.CONTINUOUS ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS : _constants.PSEUDOSPATIAL_PLOT_TYPES.MASKS);
96
+ }, [dataset.colorEncoding, dataset.selectedObs?.type, setPlotType]);
89
97
  const updateColorscale = (0, _react.useCallback)(colorscale => {
90
98
  setLayout(l => {
91
99
  return {
@@ -175,18 +183,33 @@ function Pseudospatial({
175
183
  }
176
184
  }, [dataset.controls.range, dataset.controls.valueMax, dataset.controls.valueMin, dataset.controls.valueRange, getColor, sharedScaleRange]);
177
185
  const hasSelections = !!plotType && !!dataset.pseudospatial.maskSet;
186
+ const faSlidersPath = _freeSolidSvgIcons.faSliders.icon[4];
178
187
  if (!serverError) {
179
188
  return /*#__PURE__*/_react.default.createElement("div", {
180
- className: "cherita-pseudospatial position-relative"
181
- }, /*#__PURE__*/_react.default.createElement(_PseudospatialToolbar.PseudospatialToolbar, {
182
- plotType: plotType
183
- }), /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hasSelections && isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), hasSelections && /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
189
+ className: "cherita-pseudospatial"
190
+ }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hasSelections && isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), hasSelections && /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
184
191
  data: data,
185
- layout: layout,
192
+ layout: {
193
+ ...layout,
194
+ autosize: true,
195
+ height: height
196
+ },
186
197
  useResizeHandler: true,
187
198
  className: "cherita-pseudospatial-plot",
188
199
  config: {
189
- displaylogo: false
200
+ displaylogo: false,
201
+ displayModeBar: true,
202
+ modeBarButtonsToAdd: [{
203
+ name: "Open plot controls",
204
+ icon: {
205
+ width: 512,
206
+ height: 512,
207
+ path: faSlidersPath,
208
+ ascent: 512,
209
+ descent: 0
210
+ },
211
+ click: () => setShowControls(prev => !prev)
212
+ }]
190
213
  }
191
214
  }), hasSelections && showLegend && /*#__PURE__*/_react.default.createElement(_Legend.Legend, {
192
215
  min: layout?.coloraxis?.cmin,
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.PseudospatialToolbar = PseudospatialToolbar;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
+ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
+ var _reactFontawesome = require("@fortawesome/react-fontawesome");
8
10
  var _lodash = _interopRequireDefault(require("lodash"));
9
11
  var _reactBootstrap = require("react-bootstrap");
10
12
  var _constants = require("../../constants/constants");
@@ -212,7 +212,7 @@ function Scatterplot({
212
212
  value: (data.values[index] - min) / (max - min),
213
213
  categorical: isCategorical,
214
214
  grayOut: grayOut
215
- });
215
+ }) || [0, 0, 0, 100];
216
216
  }, [data.values, obsIndices, getColor, isCategorical, max, min]);
217
217
 
218
218
  // @TODO: add support for pseudospatial hover to reflect in radius
@@ -23,17 +23,22 @@ const DatasetDispatchContext = exports.DatasetDispatchContext = /*#__PURE__*/(0,
23
23
  const queryClient = new _reactQuery.QueryClient({
24
24
  defaultOptions: {
25
25
  queries: {
26
- gcTime: 1000 * 60 * 60 * 24 * 7 // store for a week
26
+ gcTime: 1000 * 60 * 15,
27
+ // garbage collect after 15min of inactive
28
+ staleTime: 1000 * 60 * 60,
29
+ refetchOnMount: false,
30
+ refetchOnReconnect: false,
31
+ refetchOnWindowFocus: false
27
32
  }
28
33
  },
29
34
  queryCache: new _reactQuery.QueryCache({
30
- onError: (error, query) => {
31
- console.error(error, query);
35
+ onError: error => {
36
+ console.error(error);
32
37
  }
33
38
  })
34
39
  });
35
40
  // Type of queries to store responses
36
- const persistKeys = ["obs/cols", "var/names", "obsm/keys", "var/histograms", "obs/bins", "obs/distribution"];
41
+ const persistKeys = ["obs/cols", "var/names", "obsm/keys", "obs/bins", "obs/distribution"];
37
42
  const persistOptions = {
38
43
  persister: (0, _querySyncStoragePersister.createSyncStoragePersister)({
39
44
  storage: window.localStorage
@@ -129,9 +134,9 @@ function DatasetProvider({
129
134
  }));
130
135
  } catch (err) {
131
136
  if (err.code === 22 || err.code === 1014 || err.name === "QuotaExceededError" || err.name === "NS_ERROR_DOM_QUOTA_REACHED") {
132
- console.log("Browser storage quota exceeded");
137
+ console.err("Browser storage quota exceeded");
133
138
  } else {
134
- console.log(err);
139
+ console.err(err);
135
140
  }
136
141
  }
137
142
  }, [dataset]);