@haniffalab/cherita-react 1.2.0 → 1.3.0-dev.2025-05-29.ee7e9b72

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 (91) hide show
  1. package/dist/cjs/components/controls/Controls.js +60 -0
  2. package/dist/cjs/components/dotplot/Dotplot.js +47 -38
  3. package/dist/cjs/components/dotplot/DotplotControls.js +77 -114
  4. package/dist/cjs/components/full-page/FullPage.js +29 -33
  5. package/dist/cjs/components/full-page/FullPagePseudospatial.js +30 -33
  6. package/dist/cjs/components/heatmap/Heatmap.js +33 -22
  7. package/dist/cjs/components/heatmap/HeatmapControls.js +2 -19
  8. package/dist/cjs/components/matrixplot/Matrixplot.js +35 -24
  9. package/dist/cjs/components/matrixplot/MatrixplotControls.js +4 -34
  10. package/dist/cjs/components/obs-list/ObsItem.js +63 -51
  11. package/dist/cjs/components/obs-list/ObsList.js +53 -48
  12. package/dist/cjs/components/obsm-list/ObsmList.js +17 -12
  13. package/dist/cjs/components/offcanvas/index.js +14 -11
  14. package/dist/cjs/components/pseudospatial/Pseudospatial.js +78 -68
  15. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +27 -21
  16. package/dist/cjs/components/scatterplot/Scatterplot.js +82 -76
  17. package/dist/cjs/components/scatterplot/ScatterplotControls.js +18 -31
  18. package/dist/cjs/components/scatterplot/SpatialControls.js +53 -23
  19. package/dist/cjs/components/scatterplot/Toolbox.js +1 -18
  20. package/dist/cjs/components/search-bar/SearchBar.js +156 -59
  21. package/dist/cjs/components/search-bar/SearchInfo.js +182 -0
  22. package/dist/cjs/components/search-bar/SearchResults.js +90 -60
  23. package/dist/cjs/components/var-list/VarItem.js +52 -75
  24. package/dist/cjs/components/var-list/VarList.js +47 -172
  25. package/dist/cjs/components/var-list/VarListToolbar.js +7 -8
  26. package/dist/cjs/components/var-list/VarSet.js +66 -57
  27. package/dist/cjs/components/violin/Violin.js +54 -43
  28. package/dist/cjs/components/violin/ViolinControls.js +4 -20
  29. package/dist/cjs/context/DatasetContext.js +26 -513
  30. package/dist/cjs/context/FilterContext.js +9 -8
  31. package/dist/cjs/context/SettingsContext.js +539 -0
  32. package/dist/cjs/context/ZarrDataContext.js +1 -2
  33. package/dist/cjs/helpers/color-helper.js +8 -8
  34. package/dist/cjs/helpers/zarr-helper.js +19 -16
  35. package/dist/cjs/utils/Filter.js +25 -21
  36. package/dist/cjs/utils/Histogram.js +4 -3
  37. package/dist/cjs/utils/ImageViewer.js +1 -2
  38. package/dist/cjs/utils/Legend.js +18 -12
  39. package/dist/cjs/utils/LoadingIndicators.js +1 -1
  40. package/dist/cjs/utils/VirtualizedList.js +16 -13
  41. package/dist/cjs/utils/errors.js +20 -22
  42. package/dist/cjs/utils/requests.js +13 -10
  43. package/dist/cjs/utils/zarrData.js +31 -50
  44. package/dist/css/cherita.css +84 -24
  45. package/dist/css/cherita.css.map +1 -1
  46. package/dist/esm/components/controls/Controls.js +51 -0
  47. package/dist/esm/components/dotplot/Dotplot.js +47 -37
  48. package/dist/esm/components/dotplot/DotplotControls.js +77 -112
  49. package/dist/esm/components/full-page/FullPage.js +29 -32
  50. package/dist/esm/components/full-page/FullPagePseudospatial.js +30 -32
  51. package/dist/esm/components/heatmap/Heatmap.js +32 -20
  52. package/dist/esm/components/heatmap/HeatmapControls.js +3 -20
  53. package/dist/esm/components/matrixplot/Matrixplot.js +34 -22
  54. package/dist/esm/components/matrixplot/MatrixplotControls.js +5 -35
  55. package/dist/esm/components/obs-list/ObsItem.js +63 -49
  56. package/dist/esm/components/obs-list/ObsList.js +53 -47
  57. package/dist/esm/components/obsm-list/ObsmList.js +17 -11
  58. package/dist/esm/components/offcanvas/index.js +14 -11
  59. package/dist/esm/components/pseudospatial/Pseudospatial.js +77 -66
  60. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +27 -20
  61. package/dist/esm/components/scatterplot/Scatterplot.js +81 -74
  62. package/dist/esm/components/scatterplot/ScatterplotControls.js +18 -29
  63. package/dist/esm/components/scatterplot/SpatialControls.js +54 -23
  64. package/dist/esm/components/scatterplot/Toolbox.js +1 -18
  65. package/dist/esm/components/search-bar/SearchBar.js +156 -59
  66. package/dist/esm/components/search-bar/SearchInfo.js +173 -0
  67. package/dist/esm/components/search-bar/SearchResults.js +91 -60
  68. package/dist/esm/components/var-list/VarItem.js +53 -76
  69. package/dist/esm/components/var-list/VarList.js +47 -171
  70. package/dist/esm/components/var-list/VarListToolbar.js +6 -6
  71. package/dist/esm/components/var-list/VarSet.js +67 -57
  72. package/dist/esm/components/violin/Violin.js +53 -41
  73. package/dist/esm/components/violin/ViolinControls.js +5 -21
  74. package/dist/esm/context/DatasetContext.js +25 -510
  75. package/dist/esm/context/FilterContext.js +8 -6
  76. package/dist/esm/context/SettingsContext.js +528 -0
  77. package/dist/esm/helpers/color-helper.js +8 -8
  78. package/dist/esm/helpers/zarr-helper.js +19 -16
  79. package/dist/esm/utils/Filter.js +25 -21
  80. package/dist/esm/utils/Histogram.js +4 -3
  81. package/dist/esm/utils/Legend.js +17 -10
  82. package/dist/esm/utils/LoadingIndicators.js +1 -1
  83. package/dist/esm/utils/VirtualizedList.js +15 -11
  84. package/dist/esm/utils/errors.js +20 -22
  85. package/dist/esm/utils/requests.js +13 -10
  86. package/dist/esm/utils/zarrData.js +33 -51
  87. package/package.json +6 -3
  88. package/scss/cherita.scss +50 -9
  89. package/scss/components/layouts.scss +24 -13
  90. package/scss/components/lists.scss +10 -0
  91. package/scss/components/plots.scss +3 -5
@@ -14,18 +14,25 @@ var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
14
14
  var _constants = require("../../constants/constants");
15
15
  var _DatasetContext = require("../../context/DatasetContext");
16
16
  var _FilterContext = require("../../context/FilterContext");
17
+ var _SettingsContext = require("../../context/SettingsContext");
17
18
  var _colorHelper = require("../../helpers/color-helper");
18
19
  var _ImageViewer = require("../../utils/ImageViewer");
19
20
  var _Legend = require("../../utils/Legend");
20
21
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
21
22
  var _requests = require("../../utils/requests");
22
23
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
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); }
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; }
24
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
25
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
26
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
27
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
28
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
29
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
25
30
  _fontawesomeSvgCore.library.add(_freeSolidSvgIcons.faSliders);
26
31
  function usePseudospatialData(plotType) {
32
+ var _settings$selectedVar5, _settings$selectedVar6, _settings$selectedVar7, _settings$selectedVar8;
27
33
  const ENDPOINT = "pseudospatial";
28
34
  const dataset = (0, _DatasetContext.useDataset)();
35
+ const settings = (0, _SettingsContext.useSettings)();
29
36
  const {
30
37
  obsIndices,
31
38
  isSliced
@@ -33,50 +40,59 @@ function usePseudospatialData(plotType) {
33
40
  const baseParams = (0, _react.useMemo)(() => {
34
41
  return {
35
42
  url: dataset.url,
36
- maskSet: dataset.pseudospatial.maskSet,
37
- maskValues: dataset.pseudospatial.maskValues,
43
+ maskSet: settings.pseudospatial.maskSet,
44
+ maskValues: settings.pseudospatial.maskValues,
38
45
  obsIndices: isSliced ? [...(obsIndices || [])] : null,
39
46
  varNamesCol: dataset.varNamesCol,
40
47
  showColorbar: false,
41
48
  format: "json"
42
49
  };
43
- }, [dataset.url, dataset.pseudospatial.maskSet, dataset.pseudospatial.maskValues, dataset.varNamesCol, isSliced, obsIndices]);
50
+ }, [dataset.url, settings.pseudospatial.maskSet, settings.pseudospatial.maskValues, dataset.varNamesCol, isSliced, obsIndices]);
44
51
  const getPlotParams = (0, _react.useCallback)(() => {
45
52
  if (plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE) {
46
- return {
47
- varKey: dataset.selectedVar?.isSet ? {
48
- name: dataset.selectedVar?.name,
49
- indices: dataset.selectedVar?.vars.map(v => v.index)
50
- } : dataset.selectedVar?.index,
51
- ...(dataset.sliceBy.obs ? {
52
- obsCol: dataset.selectedObs,
53
- obsValues: !dataset.selectedObs?.omit.length ? null : _lodash.default.difference(_lodash.default.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c])
54
- } : {})
55
- };
53
+ var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
54
+ return _objectSpread({
55
+ varKey: (_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet ? {
56
+ name: (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name,
57
+ indices: (_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars.map(v => v.index)
58
+ } : (_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.index
59
+ }, settings.sliceBy.obs ? {
60
+ obsCol: settings.selectedObs,
61
+ obsValues: !((_settings$selectedObs = settings.selectedObs) !== null && _settings$selectedObs !== void 0 && _settings$selectedObs.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.codes), (_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.omit).map(c => {
62
+ var _settings$selectedObs4;
63
+ return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
64
+ })
65
+ } : {});
56
66
  } else if (plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL) {
67
+ var _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
57
68
  return {
58
- obsCol: dataset.selectedObs,
59
- obsValues: !dataset.selectedObs?.omit.length ? null : _lodash.default.difference(_lodash.default.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c]),
60
- mode: dataset.pseudospatial.categoricalMode
69
+ obsCol: settings.selectedObs,
70
+ obsValues: !((_settings$selectedObs5 = settings.selectedObs) !== null && _settings$selectedObs5 !== void 0 && _settings$selectedObs5.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.codes), (_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.omit).map(c => {
71
+ var _settings$selectedObs8;
72
+ return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
73
+ }),
74
+ mode: settings.pseudospatial.categoricalMode
61
75
  };
62
76
  } else if (plotType === "continuous") {
77
+ var _settings$selectedObs9, _settings$selectedObs0, _settings$selectedObs1;
63
78
  return {
64
- obsCol: dataset.selectedObs,
65
- obsValues: !dataset.selectedObs?.omit.length ? null : _lodash.default.difference(_lodash.default.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c])
79
+ obsCol: settings.selectedObs,
80
+ obsValues: !((_settings$selectedObs9 = settings.selectedObs) !== null && _settings$selectedObs9 !== void 0 && _settings$selectedObs9.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_settings$selectedObs0 = settings.selectedObs) === null || _settings$selectedObs0 === void 0 ? void 0 : _settings$selectedObs0.codes), (_settings$selectedObs1 = settings.selectedObs) === null || _settings$selectedObs1 === void 0 ? void 0 : _settings$selectedObs1.omit).map(c => {
81
+ var _settings$selectedObs10;
82
+ return (_settings$selectedObs10 = settings.selectedObs) === null || _settings$selectedObs10 === void 0 ? void 0 : _settings$selectedObs10.codesMap[c];
83
+ })
66
84
  };
67
85
  }
68
- }, [dataset.pseudospatial.categoricalMode, dataset.selectedObs, dataset.selectedVar?.index, dataset.selectedVar?.isSet, dataset.selectedVar?.name, dataset.selectedVar?.vars, dataset.sliceBy.obs, plotType]);
86
+ }, [settings.pseudospatial.categoricalMode, settings.selectedObs, (_settings$selectedVar5 = settings.selectedVar) === null || _settings$selectedVar5 === void 0 ? void 0 : _settings$selectedVar5.index, (_settings$selectedVar6 = settings.selectedVar) === null || _settings$selectedVar6 === void 0 ? void 0 : _settings$selectedVar6.isSet, (_settings$selectedVar7 = settings.selectedVar) === null || _settings$selectedVar7 === void 0 ? void 0 : _settings$selectedVar7.name, (_settings$selectedVar8 = settings.selectedVar) === null || _settings$selectedVar8 === void 0 ? void 0 : _settings$selectedVar8.vars, settings.sliceBy.obs, plotType]);
69
87
  const params = (0, _react.useMemo)(() => {
70
- return {
71
- ...baseParams,
72
- ...getPlotParams()
73
- };
88
+ return _objectSpread(_objectSpread({}, baseParams), getPlotParams());
74
89
  }, [baseParams, getPlotParams]);
75
90
  return (0, _requests.useDebouncedFetch)(ENDPOINT + "/" + plotType, params, 500, {
76
- enabled: !!plotType && !!dataset.pseudospatial.maskSet
91
+ enabled: !!plotType && !!settings.pseudospatial.maskSet
77
92
  });
78
93
  }
79
94
  function Pseudospatial(_ref) {
95
+ var _settings$selectedObs14, _layout$coloraxis3, _layout$coloraxis4;
80
96
  let {
81
97
  showLegend = true,
82
98
  sharedScaleRange = false,
@@ -85,29 +101,29 @@ function Pseudospatial(_ref) {
85
101
  plotType,
86
102
  setPlotType
87
103
  } = _ref;
88
- const dataset = (0, _DatasetContext.useDataset)();
104
+ const settings = (0, _SettingsContext.useSettings)();
89
105
  const [data, setData] = (0, _react.useState)([]);
90
106
  const [layout, setLayout] = (0, _react.useState)({});
91
107
  const {
92
108
  getColor
93
109
  } = (0, _colorHelper.useColor)();
94
- const colorscale = (0, _react.useRef)(dataset.controls.colorScale);
110
+ const colorscale = (0, _react.useRef)(settings.controls.colorScale);
95
111
  (0, _react.useEffect)(() => {
96
- 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);
97
- }, [dataset.colorEncoding, dataset.selectedObs?.type, setPlotType]);
112
+ var _settings$selectedObs11, _settings$selectedObs12, _settings$selectedObs13;
113
+ setPlotType(settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE : ((_settings$selectedObs11 = settings.selectedObs) === null || _settings$selectedObs11 === void 0 ? void 0 : _settings$selectedObs11.type) === _constants.OBS_TYPES.CATEGORICAL || ((_settings$selectedObs12 = settings.selectedObs) === null || _settings$selectedObs12 === void 0 ? void 0 : _settings$selectedObs12.type) === _constants.OBS_TYPES.BOOLEAN ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL : ((_settings$selectedObs13 = settings.selectedObs) === null || _settings$selectedObs13 === void 0 ? void 0 : _settings$selectedObs13.type) === _constants.OBS_TYPES.CONTINUOUS ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS : _constants.PSEUDOSPATIAL_PLOT_TYPES.MASKS);
114
+ }, [settings.colorEncoding, (_settings$selectedObs14 = settings.selectedObs) === null || _settings$selectedObs14 === void 0 ? void 0 : _settings$selectedObs14.type, setPlotType]);
98
115
  const updateColorscale = (0, _react.useCallback)(colorscale => {
99
116
  setLayout(l => {
100
- return {
101
- ...l,
102
- coloraxis: {
103
- ...l.coloraxis,
117
+ return _objectSpread(_objectSpread({}, l), {}, {
118
+ coloraxis: _objectSpread(_objectSpread({}, l.coloraxis), {}, {
104
119
  colorscale: colorscale
105
- }
106
- };
120
+ })
121
+ });
107
122
  });
108
123
  setData(d => {
109
- const min = layout?.coloraxis?.cmin;
110
- const max = layout?.coloraxis?.cmax;
124
+ var _layout$coloraxis, _layout$coloraxis2;
125
+ const min = layout === null || layout === void 0 || (_layout$coloraxis = layout.coloraxis) === null || _layout$coloraxis === void 0 ? void 0 : _layout$coloraxis.cmin;
126
+ const max = layout === null || layout === void 0 || (_layout$coloraxis2 = layout.coloraxis) === null || _layout$coloraxis2 === void 0 ? void 0 : _layout$coloraxis2.cmax;
111
127
  return _lodash.default.map(d, trace => {
112
128
  const v = trace.meta.value;
113
129
  if (v === null) {
@@ -116,17 +132,15 @@ function Pseudospatial(_ref) {
116
132
  const color = (0, _colorHelper.rgbToHex)(getColor({
117
133
  value: (v - min) / (max - min)
118
134
  }));
119
- return {
120
- ...trace,
135
+ return _objectSpread(_objectSpread({}, trace), {}, {
121
136
  fillcolor: color,
122
- line: {
123
- ...trace.line,
137
+ line: _objectSpread(_objectSpread({}, trace.line), {}, {
124
138
  color: color
125
- }
126
- };
139
+ })
140
+ });
127
141
  });
128
142
  });
129
- }, [getColor, layout?.coloraxis?.cmax, layout?.coloraxis?.cmin]);
143
+ }, [getColor, layout === null || layout === void 0 || (_layout$coloraxis3 = layout.coloraxis) === null || _layout$coloraxis3 === void 0 ? void 0 : _layout$coloraxis3.cmax, layout === null || layout === void 0 || (_layout$coloraxis4 = layout.coloraxis) === null || _layout$coloraxis4 === void 0 ? void 0 : _layout$coloraxis4.cmin]);
130
144
  const {
131
145
  fetchedData,
132
146
  isPending,
@@ -140,17 +154,17 @@ function Pseudospatial(_ref) {
140
154
  }
141
155
  }, [fetchedData, isPending, serverError, sharedScaleRange, updateColorscale]);
142
156
  (0, _react.useEffect)(() => {
143
- colorscale.current = dataset.controls.colorScale;
157
+ colorscale.current = settings.controls.colorScale;
144
158
  updateColorscale(colorscale.current);
145
- }, [dataset.controls.colorScale, updateColorscale]);
159
+ }, [settings.controls.colorScale, updateColorscale]);
146
160
  (0, _react.useEffect)(() => {
147
161
  if (sharedScaleRange) {
148
162
  const {
149
163
  min,
150
164
  max
151
165
  } = {
152
- min: dataset.controls.range[0] * (dataset.controls.valueRange[1] - dataset.controls.valueRange[0]) + dataset.controls.valueRange[0],
153
- max: dataset.controls.range[1] * (dataset.controls.valueRange[1] - dataset.controls.valueRange[0]) + dataset.controls.valueRange[0]
166
+ min: settings.controls.range[0] * (settings.controls.valueRange[1] - settings.controls.valueRange[0]) + settings.controls.valueRange[0],
167
+ max: settings.controls.range[1] * (settings.controls.valueRange[1] - settings.controls.valueRange[0]) + settings.controls.valueRange[0]
154
168
  };
155
169
  setData(d => {
156
170
  return _lodash.default.map(d, trace => {
@@ -161,40 +175,36 @@ function Pseudospatial(_ref) {
161
175
  const color = (0, _colorHelper.rgbToHex)(getColor({
162
176
  value: (v - min) / (max - min)
163
177
  }));
164
- return {
165
- ...trace,
178
+ return _objectSpread(_objectSpread({}, trace), {}, {
166
179
  fillcolor: color,
167
- line: {
168
- ...trace.line,
180
+ line: _objectSpread(_objectSpread({}, trace.line), {}, {
169
181
  color: color
170
- }
171
- };
182
+ })
183
+ });
172
184
  });
173
185
  });
174
186
  setLayout(l => {
175
- return {
176
- ...l,
177
- coloraxis: {
178
- ...l.coloraxis,
187
+ return _objectSpread(_objectSpread({}, l), {}, {
188
+ coloraxis: _objectSpread(_objectSpread({}, l.coloraxis), {}, {
179
189
  cmin: min,
180
190
  cmax: max
181
- }
182
- };
191
+ })
192
+ });
183
193
  });
184
194
  }
185
- }, [dataset.controls.range, dataset.controls.valueMax, dataset.controls.valueMin, dataset.controls.valueRange, getColor, sharedScaleRange]);
186
- const hasSelections = !!plotType && !!dataset.pseudospatial.maskSet;
195
+ }, [settings.controls.range, settings.controls.valueMax, settings.controls.valueMin, settings.controls.valueRange, getColor, sharedScaleRange]);
196
+ const hasSelections = !!plotType && !!settings.pseudospatial.maskSet;
187
197
  const faSlidersPath = _freeSolidSvgIcons.faSliders.icon[4];
188
198
  if (!serverError) {
199
+ var _layout$coloraxis5, _layout$coloraxis6;
189
200
  return /*#__PURE__*/_react.default.createElement("div", {
190
201
  className: "cherita-pseudospatial"
191
202
  }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hasSelections && isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), hasSelections && /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
192
203
  data: data,
193
- layout: {
194
- ...layout,
204
+ layout: _objectSpread(_objectSpread({}, layout), {}, {
195
205
  autosize: true,
196
206
  height: height
197
- },
207
+ }),
198
208
  useResizeHandler: true,
199
209
  className: "cherita-pseudospatial-plot",
200
210
  config: {
@@ -213,8 +223,8 @@ function Pseudospatial(_ref) {
213
223
  }]
214
224
  }
215
225
  }), hasSelections && showLegend && /*#__PURE__*/_react.default.createElement(_Legend.Legend, {
216
- min: layout?.coloraxis?.cmin,
217
- max: layout?.coloraxis?.cmax,
226
+ min: layout === null || layout === void 0 || (_layout$coloraxis5 = layout.coloraxis) === null || _layout$coloraxis5 === void 0 ? void 0 : _layout$coloraxis5.cmin,
227
+ max: layout === null || layout === void 0 || (_layout$coloraxis6 = layout.coloraxis) === null || _layout$coloraxis6 === void 0 ? void 0 : _layout$coloraxis6.cmax,
218
228
  addText: plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE ? " - Mean expression" : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL ? " - %" : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS ? " - Mean value" : ""
219
229
  })));
220
230
  } else {
@@ -5,22 +5,25 @@ 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");
10
8
  var _lodash = _interopRequireDefault(require("lodash"));
11
9
  var _reactBootstrap = require("react-bootstrap");
12
10
  var _constants = require("../../constants/constants");
13
11
  var _DatasetContext = require("../../context/DatasetContext");
12
+ var _SettingsContext = require("../../context/SettingsContext");
14
13
  var _requests = require("../../utils/requests");
15
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
- 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); }
17
- 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; }
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); }
18
21
  function CategoricalMode() {
19
- const dataset = (0, _DatasetContext.useDataset)();
20
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
22
+ const settings = (0, _SettingsContext.useSettings)();
23
+ const dispatch = (0, _SettingsContext.useSettingsDispatch)();
21
24
  const modeList = _lodash.default.map(_constants.PSEUDOSPATIAL_CATEGORICAL_MODES, (m, key) => /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Item, {
22
25
  key: key,
23
- active: dataset.pseudospatial.categoricalMode === m,
26
+ active: settings.pseudospatial.categoricalMode === m,
24
27
  onClick: () => {
25
28
  dispatch({
26
29
  type: "set.pseudospatial.categoricalMode",
@@ -29,26 +32,27 @@ function CategoricalMode() {
29
32
  }
30
33
  }, _lodash.default.capitalize(m.name)));
31
34
  const mode = _lodash.default.find(_constants.PSEUDOSPATIAL_CATEGORICAL_MODES, {
32
- value: dataset.pseudospatial.categoricalMode
35
+ value: settings.pseudospatial.categoricalMode
33
36
  });
34
37
  return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Toggle, {
35
38
  variant: "light"
36
39
  }, _lodash.default.capitalize(mode.name)), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Menu, null, modeList));
37
40
  }
38
41
  function MaskSet() {
42
+ var _settings$pseudospati5, _settings$pseudospati6, _maskSets$settings$ps2, _settings$pseudospati7, _settings$pseudospati8, _maskSets$settings$ps3, _settings$pseudospati9;
39
43
  const ENDPOINT = "masks";
40
44
  const dataset = (0, _DatasetContext.useDataset)();
41
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
45
+ const settings = (0, _SettingsContext.useSettings)();
46
+ const dispatch = (0, _SettingsContext.useSettingsDispatch)();
42
47
  const [maskSets, setMaskSets] = (0, _react.useState)(null);
43
48
  const [params, setParams] = (0, _react.useState)({
44
49
  url: dataset.url
45
50
  });
46
51
  (0, _react.useEffect)(() => {
47
52
  setParams(p => {
48
- return {
49
- ...p,
53
+ return _objectSpread(_objectSpread({}, p), {}, {
50
54
  url: dataset.url
51
- };
55
+ });
52
56
  });
53
57
  }, [dataset.url]);
54
58
  const {
@@ -65,7 +69,7 @@ function MaskSet() {
65
69
  }, [fetchedData, isPending, serverError]);
66
70
  const maskSetList = _lodash.default.map(maskSets, (ms, key) => /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Item, {
67
71
  key: key,
68
- active: dataset.pseudospatial.maskSet === key,
72
+ active: settings.pseudospatial.maskSet === key,
69
73
  onClick: () => {
70
74
  dispatch({
71
75
  type: "set.pseudospatial.maskSet",
@@ -74,9 +78,10 @@ function MaskSet() {
74
78
  }
75
79
  }, _lodash.default.capitalize(key)));
76
80
  const handleMaskChange = mask => {
77
- let newMasks = dataset.pseudospatial.maskValues || maskSets?.[dataset.pseudospatial?.maskSet];
81
+ var _settings$pseudospati, _settings$pseudospati2;
82
+ 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]);
78
83
  newMasks = newMasks.includes(mask) ? newMasks.filter(m => m !== mask) : [...newMasks, mask];
79
- if (!_lodash.default.difference(maskSets?.[dataset.pseudospatial?.maskSet], newMasks).length) {
84
+ if (!_lodash.default.difference(maskSets === null || maskSets === void 0 ? void 0 : maskSets[(_settings$pseudospati2 = settings.pseudospatial) === null || _settings$pseudospati2 === void 0 ? void 0 : _settings$pseudospati2.maskSet], newMasks).length) {
80
85
  newMasks = null;
81
86
  }
82
87
  dispatch({
@@ -85,7 +90,8 @@ function MaskSet() {
85
90
  });
86
91
  };
87
92
  const toggleMasks = () => {
88
- if (!dataset.pseudospatial.maskValues || dataset.pseudospatial.maskValues?.length === maskSets?.[dataset.pseudospatial?.maskSet]?.length) {
93
+ var _settings$pseudospati3, _maskSets$settings$ps, _settings$pseudospati4;
94
+ 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)) {
89
95
  dispatch({
90
96
  type: "set.pseudospatial.maskValues",
91
97
  maskValues: []
@@ -97,19 +103,19 @@ function MaskSet() {
97
103
  });
98
104
  }
99
105
  };
100
- const masksList = _lodash.default.map(maskSets?.[dataset.pseudospatial?.maskSet], mask => /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.ItemText, {
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, {
101
107
  key: mask
102
108
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Check, {
103
109
  type: "checkbox",
104
110
  label: mask,
105
- checked: !dataset.pseudospatial.maskValues || dataset.pseudospatial.maskValues.includes(mask),
111
+ checked: !settings.pseudospatial.maskValues || settings.pseudospatial.maskValues.includes(mask),
106
112
  onChange: () => handleMaskChange(mask)
107
113
  })));
108
- const nMasks = dataset.pseudospatial.maskValues ? dataset.pseudospatial.maskValues?.length : maskSets?.[dataset.pseudospatial?.maskSet]?.length || "No";
109
- const toggleAllChecked = !dataset.pseudospatial.maskValues || dataset.pseudospatial.maskValues?.length === maskSets?.[dataset.pseudospatial?.maskSet]?.length;
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";
115
+ 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);
110
116
  return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Toggle, {
111
117
  variant: "light"
112
- }, _lodash.default.capitalize(dataset.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, {
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, {
113
119
  variant: "light"
114
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, {
115
121
  key: "toggle-all"