@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
@@ -8,8 +8,8 @@ var _react = require("react");
8
8
  var _turf = require("@turf/turf");
9
9
  var _lodash = _interopRequireDefault(require("lodash"));
10
10
  var _constants = require("../constants/constants");
11
- var _DatasetContext = require("../context/DatasetContext");
12
11
  var _FilterContext = require("../context/FilterContext");
12
+ var _SettingsContext = require("../context/SettingsContext");
13
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
14
  const EPSILON = 1e-6;
15
15
  const isInBins = (v, binEdges, indices) => {
@@ -22,7 +22,7 @@ const isInBins = (v, binEdges, indices) => {
22
22
  return _lodash.default.some(ranges, range => _lodash.default.inRange(v, ...range));
23
23
  };
24
24
  const isInPolygons = (polygons, positions, index) => {
25
- if (!polygons?.length || !positions?.length) {
25
+ if (!(polygons !== null && polygons !== void 0 && polygons.length) || !(positions !== null && positions !== void 0 && positions.length)) {
26
26
  return false;
27
27
  }
28
28
  return _lodash.default.some(polygons, (_f, i) => {
@@ -30,13 +30,14 @@ const isInPolygons = (polygons, positions, index) => {
30
30
  });
31
31
  };
32
32
  const isInValues = (omit, value) => {
33
- if (!omit?.length) {
33
+ if (!(omit !== null && omit !== void 0 && omit.length)) {
34
34
  return true;
35
35
  }
36
36
  return !_lodash.default.includes(omit, value);
37
37
  };
38
38
  const useFilter = data => {
39
- const dataset = (0, _DatasetContext.useDataset)();
39
+ var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3, _settings$selectedObs4, _settings$selectedObs7, _settings$selectedObs8;
40
+ const settings = (0, _SettingsContext.useSettings)();
40
41
  const filterDataDispatch = (0, _FilterContext.useFilteredDataDispatch)();
41
42
  const {
42
43
  obsmData,
@@ -45,31 +46,33 @@ const useFilter = data => {
45
46
  isPending,
46
47
  serverError
47
48
  } = data;
48
- const isCategorical = dataset.selectedObs?.type === _constants.OBS_TYPES.CATEGORICAL || dataset.selectedObs?.type === _constants.OBS_TYPES.BOOLEAN;
49
- const isContinuous = dataset.selectedObs?.type === _constants.OBS_TYPES.CONTINUOUS;
50
- const sliceByObs = dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && !!dataset.selectedObs?.omit.length || dataset.sliceBy.obs;
49
+ const isCategorical = ((_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.type) === _constants.OBS_TYPES.CATEGORICAL || ((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.type) === _constants.OBS_TYPES.BOOLEAN;
50
+ const isContinuous = ((_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.type) === _constants.OBS_TYPES.CONTINUOUS;
51
+ const sliceByObs = settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && !!((_settings$selectedObs4 = settings.selectedObs) !== null && _settings$selectedObs4 !== void 0 && _settings$selectedObs4.omit.length) || settings.sliceBy.obs;
51
52
  const isInObsSlice = (0, _react.useCallback)((index, values) => {
52
53
  let inSlice = true;
53
54
  if (values && sliceByObs) {
54
55
  if (isCategorical) {
55
- inSlice &= isInValues(dataset.selectedObs?.omit, values[index]);
56
+ var _settings$selectedObs5;
57
+ inSlice &= isInValues((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.omit, values[index]);
56
58
  } else if (isContinuous) {
57
59
  if (isNaN(values[index])) {
58
- inSlice &= isInValues(dataset.selectedObs?.omit, -1);
60
+ var _settings$selectedObs6;
61
+ inSlice &= isInValues((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.omit, -1);
59
62
  } else {
60
- inSlice &= isInBins(values[index], dataset.selectedObs.bins.binEdges, _lodash.default.without(dataset.selectedObs.omit, -1));
63
+ inSlice &= isInBins(values[index], settings.selectedObs.bins.binEdges, _lodash.default.without(settings.selectedObs.omit, -1));
61
64
  }
62
65
  }
63
66
  }
64
67
  return inSlice;
65
- }, [dataset.selectedObs?.bins?.binEdges, dataset.selectedObs?.omit, isCategorical, isContinuous, sliceByObs]);
68
+ }, [(_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 || (_settings$selectedObs7 = _settings$selectedObs7.bins) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.binEdges, (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.omit, isCategorical, isContinuous, sliceByObs]);
66
69
  const isInPolygonsSlice = (0, _react.useCallback)((index, positions) => {
67
70
  let inSlice = true;
68
- if (dataset.sliceBy.polygons && positions) {
69
- inSlice &= isInPolygons(dataset.polygons[dataset.selectedObsm], positions, index);
71
+ if (settings.sliceBy.polygons && positions) {
72
+ inSlice &= isInPolygons(settings.polygons[settings.selectedObsm], positions, index);
70
73
  }
71
74
  return inSlice;
72
- }, [dataset.polygons, dataset.selectedObsm, dataset.sliceBy.polygons]);
75
+ }, [settings.polygons, settings.selectedObsm, settings.sliceBy.polygons]);
73
76
  const isInSlice = (0, _react.useCallback)((index, values, positions) => {
74
77
  return isInObsSlice(index, values) && isInPolygonsSlice(index, positions);
75
78
  }, [isInObsSlice, isInPolygonsSlice]);
@@ -87,7 +90,7 @@ const useFilter = data => {
87
90
  slicedLength: null
88
91
  };
89
92
  }
90
- if (dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR) {
93
+ if (settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR) {
91
94
  const {
92
95
  filtered,
93
96
  filteredIndices
@@ -107,7 +110,7 @@ const useFilter = data => {
107
110
  valueMax: _lodash.default.max(filtered),
108
111
  slicedLength: filtered.length
109
112
  };
110
- } else if (dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS) {
113
+ } else if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS) {
111
114
  const {
112
115
  filtered,
113
116
  filteredIndices
@@ -128,16 +131,17 @@ const useFilter = data => {
128
131
  slicedLength: filtered.length
129
132
  };
130
133
  } else {
134
+ var _obsData$data;
131
135
  return {
132
136
  filteredIndices: null,
133
137
  valueMin: _lodash.default.min(obsData.data),
134
138
  valueMax: _lodash.default.max(obsData.data),
135
- slicedLength: obsData.data?.length
139
+ slicedLength: (_obsData$data = obsData.data) === null || _obsData$data === void 0 ? void 0 : _obsData$data.length
136
140
  };
137
141
  }
138
- }, [dataset.colorEncoding, isContinuous, isInSlice, isPending, obsData.data, obsmData.data, serverError, xData.data]);
139
- const isSliced = sliceByObs || dataset.sliceBy.polygons;
140
- // const isSliced = dataset.sliceBy.obs || dataset.sliceBy.polygons;
142
+ }, [settings.colorEncoding, isContinuous, isInSlice, isPending, obsData.data, obsmData.data, serverError, xData.data]);
143
+ const isSliced = sliceByObs || settings.sliceBy.polygons;
144
+ // const isSliced = settings.sliceBy.obs || settings.sliceBy.polygons;
141
145
 
142
146
  (0, _react.useEffect)(() => {
143
147
  if (!isPending && !serverError) {
@@ -150,6 +154,6 @@ const useFilter = data => {
150
154
  isSliced: isSliced
151
155
  });
152
156
  }
153
- }, [dataset.sliceBy.obs, dataset.sliceBy.polygons, filterDataDispatch, filteredIndices, isPending, isSliced, serverError, slicedLength, valueMax, valueMin]);
157
+ }, [settings.sliceBy.obs, settings.sliceBy.polygons, filterDataDispatch, filteredIndices, isPending, isSliced, serverError, slicedLength, valueMax, valueMin]);
154
158
  };
155
159
  exports.useFilter = useFilter;
@@ -11,6 +11,7 @@ var _LoadingIndicators = require("./LoadingIndicators");
11
11
  var _string = require("./string");
12
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
13
  function Histogram(_ref) {
14
+ var _data$bin_edges;
14
15
  let {
15
16
  data,
16
17
  isPending,
@@ -36,11 +37,11 @@ function Histogram(_ref) {
36
37
  let {
37
38
  dataIndex
38
39
  } = _ref2;
39
- return `${(0, _string.formatNumerical)(data.hist[dataIndex])}`;
40
+ return "".concat((0, _string.formatNumerical)(data.hist[dataIndex]));
40
41
  },
41
42
  xAxis: {
42
- data: _lodash.default.range(data.bin_edges?.length) || null,
43
- valueFormatter: v => `Bin [${(0, _string.formatNumerical)(data.bin_edges[v][0], _string.FORMATS.EXPONENTIAL)}, ${(0, _string.formatNumerical)(data.bin_edges[v][1], _string.FORMATS.EXPONENTIAL)}${v === data.bin_edges.length - 1 ? "]" : ")"}`
43
+ data: _lodash.default.range((_data$bin_edges = data.bin_edges) === null || _data$bin_edges === void 0 ? void 0 : _data$bin_edges.length) || null,
44
+ valueFormatter: v => "Bin [".concat((0, _string.formatNumerical)(data.bin_edges[v][0], _string.FORMATS.EXPONENTIAL), ", ").concat((0, _string.formatNumerical)(data.bin_edges[v][1], _string.FORMATS.EXPONENTIAL)).concat(v === data.bin_edges.length - 1 ? "]" : ")")
44
45
  },
45
46
  slotProps: {
46
47
  popper: {
@@ -6,8 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.ImageViewer = void 0;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactBootstrap = require("react-bootstrap");
9
- 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); }
10
- 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; }
9
+ 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); }
11
10
  const ImageViewer = _ref => {
12
11
  let {
13
12
  src,
@@ -5,14 +5,15 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Legend = Legend;
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 _string = require("./string");
10
12
  var _constants = require("../constants/constants");
11
- var _DatasetContext = require("../context/DatasetContext");
13
+ var _SettingsContext = require("../context/SettingsContext");
12
14
  var _colorHelper = require("../helpers/color-helper");
13
15
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
- 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); }
15
- 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; }
16
+ 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
17
  function Legend(_ref) {
17
18
  let {
18
19
  isCategorical = false,
@@ -21,7 +22,7 @@ function Legend(_ref) {
21
22
  colorscale = null,
22
23
  addText = ""
23
24
  } = _ref;
24
- const dataset = (0, _DatasetContext.useDataset)();
25
+ const settings = (0, _SettingsContext.useSettings)();
25
26
  const {
26
27
  getColor
27
28
  } = (0, _colorHelper.useColor)();
@@ -41,27 +42,32 @@ function Legend(_ref) {
41
42
  });
42
43
  });
43
44
  }, [colorscale, getColor, isCategorical]);
44
- if (dataset.colorEncoding && !isCategorical) {
45
+ if (settings.colorEncoding && !isCategorical) {
46
+ var _settings$selectedVar, _settings$selectedObs;
45
47
  return /*#__PURE__*/_react.default.createElement("div", {
46
48
  className: "cherita-legend"
47
49
  }, /*#__PURE__*/_react.default.createElement("div", {
48
50
  className: "gradient"
49
51
  }, /*#__PURE__*/_react.default.createElement("p", {
50
52
  className: "small m-0 p-0"
51
- }, (dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? dataset.selectedVar?.name : dataset.selectedObs?.name) + addText), spanList, /*#__PURE__*/_react.default.createElement("span", {
53
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
54
+ icon: _freeSolidSvgIcons.faDroplet,
55
+ className: "me-1"
56
+ }), (settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? (_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name : (_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name) + addText), spanList, /*#__PURE__*/_react.default.createElement("span", {
52
57
  className: "domain-min"
53
58
  }, (0, _string.formatNumerical)(min, _string.FORMATS.EXPONENTIAL)), /*#__PURE__*/_react.default.createElement("span", {
54
59
  className: "domain-med"
55
60
  }, (0, _string.formatNumerical)((min + max) * 0.5, _string.FORMATS.EXPONENTIAL)), /*#__PURE__*/_react.default.createElement("span", {
56
61
  className: "domain-max"
57
62
  }, (0, _string.formatNumerical)(max, _string.FORMATS.EXPONENTIAL))));
58
- } else {
63
+ } else if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && settings.selectedObs) {
59
64
  return /*#__PURE__*/_react.default.createElement("div", {
60
- className: "cherita-legend"
61
- }, /*#__PURE__*/_react.default.createElement("div", {
62
- className: "gradient"
65
+ className: "cherita-legend categorical"
63
66
  }, /*#__PURE__*/_react.default.createElement("p", {
64
- className: "small m-0 p-0"
65
- }, dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && dataset.selectedObs ? dataset.selectedObs.name : "")));
67
+ className: "legend-text text-end m-0 p-0"
68
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
69
+ icon: _freeSolidSvgIcons.faDroplet,
70
+ className: "me-2"
71
+ }), settings.selectedObs.name));
66
72
  }
67
73
  }
@@ -16,7 +16,7 @@ const LoadingSpinner = _ref => {
16
16
  className: "loading-spinner"
17
17
  }, /*#__PURE__*/_react.default.createElement(_material.CircularProgress, {
18
18
  disableShrink: disableShrink
19
- }), text?.length && /*#__PURE__*/_react.default.createElement("span", {
19
+ }), (text === null || text === void 0 ? void 0 : text.length) && /*#__PURE__*/_react.default.createElement("span", {
20
20
  className: "visually-hidden"
21
21
  }, text));
22
22
  };
@@ -6,19 +6,22 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.VirtualizedList = VirtualizedList;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactVirtual = require("@tanstack/react-virtual");
9
- 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); }
10
- 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; }
9
+ const _excluded = ["getDataAtIndex", "count", "ItemComponent", "estimateSize", "overscan", "maxHeight"];
10
+ 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); }
11
11
  function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
12
+ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
13
+ function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
12
14
  function VirtualizedList(_ref) {
15
+ var _virtualItems$0$start, _virtualItems$;
13
16
  let {
14
- getDataAtIndex,
15
- count,
16
- ItemComponent,
17
- estimateSize = 45,
18
- overscan = 25,
19
- maxHeight = "65vh",
20
- ...props
21
- } = _ref;
17
+ getDataAtIndex,
18
+ count,
19
+ ItemComponent,
20
+ estimateSize = 45,
21
+ overscan = 25,
22
+ maxHeight = "65vh"
23
+ } = _ref,
24
+ props = _objectWithoutProperties(_ref, _excluded);
22
25
  const [parentNode, setParentNode] = (0, _react.useState)(null);
23
26
  const itemVirtualizer = (0, _reactVirtual.useVirtualizer)({
24
27
  count: count,
@@ -32,7 +35,7 @@ function VirtualizedList(_ref) {
32
35
  const virtualItems = itemVirtualizer.getVirtualItems();
33
36
  (0, _react.useEffect)(() => {
34
37
  itemVirtualizer.measure();
35
- }, [itemVirtualizer, parentNode?.clientHeight, getDataAtIndex]);
38
+ }, [itemVirtualizer, parentNode === null || parentNode === void 0 ? void 0 : parentNode.clientHeight, getDataAtIndex]);
36
39
  return /*#__PURE__*/_react.default.createElement("div", {
37
40
  ref: refCallback,
38
41
  style: {
@@ -42,7 +45,7 @@ function VirtualizedList(_ref) {
42
45
  className: "modern-scrollbars"
43
46
  }, /*#__PURE__*/_react.default.createElement("div", {
44
47
  style: {
45
- height: `${itemVirtualizer.getTotalSize()}px`,
48
+ height: "".concat(itemVirtualizer.getTotalSize(), "px"),
46
49
  width: "100%",
47
50
  position: "relative",
48
51
  willChange: "transform"
@@ -53,7 +56,7 @@ function VirtualizedList(_ref) {
53
56
  top: 0,
54
57
  left: 0,
55
58
  width: "100%",
56
- transform: `translateY(${virtualItems[0]?.start ?? 0}px)`
59
+ transform: "translateY(".concat((_virtualItems$0$start = (_virtualItems$ = virtualItems[0]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.start) !== null && _virtualItems$0$start !== void 0 ? _virtualItems$0$start : 0, "px)")
57
60
  }
58
61
  }, virtualItems.map(virtualItem => /*#__PURE__*/_react.default.createElement("div", {
59
62
  key: virtualItem.key,
@@ -4,6 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.parseError = void 0;
7
+ 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; }
8
+ 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; }
9
+ 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; }
10
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
11
+ 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); }
7
12
  const parseError = err => {
8
13
  if (err === DOMException.TIMEOUT_ERR) {
9
14
  return {
@@ -11,42 +16,35 @@ const parseError = err => {
11
16
  name: err
12
17
  };
13
18
  }
14
- switch (err?.name) {
19
+ switch (err === null || err === void 0 ? void 0 : err.name) {
15
20
  case "TypeError":
16
- return {
17
- ...err,
21
+ return _objectSpread(_objectSpread({}, err), {}, {
18
22
  message: "Failed to fetch data from server"
19
- };
23
+ });
20
24
  case "ReadZarrError":
21
- return {
22
- ...err,
25
+ return _objectSpread(_objectSpread({}, err), {}, {
23
26
  message: "Failed to read AnnData-Zarr"
24
- };
27
+ });
25
28
  case "InvalidObs":
26
- return {
27
- ...err,
29
+ return _objectSpread(_objectSpread({}, err), {}, {
28
30
  message: "Observation not found in dataset"
29
- };
31
+ });
30
32
  case "InvalidVar":
31
- return {
32
- ...err,
33
+ return _objectSpread(_objectSpread({}, err), {}, {
33
34
  message: "Feature not found in dataset"
34
- };
35
+ });
35
36
  case "InvalidKey":
36
- return {
37
- ...err,
37
+ return _objectSpread(_objectSpread({}, err), {}, {
38
38
  message: "Key not found in datset"
39
- };
39
+ });
40
40
  case "BadRequest":
41
- return {
42
- ...err,
41
+ return _objectSpread(_objectSpread({}, err), {}, {
43
42
  message: "Invalid request to server"
44
- };
43
+ });
45
44
  case "InternalServerError":
46
- return {
47
- ...err,
45
+ return _objectSpread(_objectSpread({}, err), {}, {
48
46
  message: "Server error"
49
- };
47
+ });
50
48
  default:
51
49
  return err;
52
50
  }
@@ -8,6 +8,11 @@ exports.useFetch = exports.useDebouncedFetch = void 0;
8
8
  var _reactQuery = require("@tanstack/react-query");
9
9
  var _usehooks = require("@uidotdev/usehooks");
10
10
  var _errors = require("./errors");
11
+ 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; }
12
+ 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; }
13
+ 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; }
14
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
15
+ 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); }
11
16
  async function fetchData(endpoint, params) {
12
17
  let signal = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
13
18
  let ms = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 300000;
@@ -49,7 +54,7 @@ const useFetch = function (endpoint, params) {
49
54
  data: fetchedData = null,
50
55
  isLoading: isPending = false,
51
56
  error: serverError = null
52
- } = (0, _reactQuery.useQuery)({
57
+ } = (0, _reactQuery.useQuery)(_objectSpread({
53
58
  queryKey: [endpoint, params],
54
59
  queryFn: _ref => {
55
60
  let {
@@ -61,11 +66,10 @@ const useFetch = function (endpoint, params) {
61
66
  let {
62
67
  error
63
68
  } = _ref2;
64
- if ([400, 401, 403, 404, 422].includes(error?.status)) return false;
69
+ if ([400, 401, 403, 404, 422].includes(error === null || error === void 0 ? void 0 : error.status)) return false;
65
70
  return failureCount < 3;
66
- },
67
- ...opts
68
- });
71
+ }
72
+ }, opts));
69
73
  return {
70
74
  fetchedData,
71
75
  isPending,
@@ -85,7 +89,7 @@ const useDebouncedFetch = function (endpoint, params) {
85
89
  data: fetchedData = null,
86
90
  isLoading: isPending = false,
87
91
  error: serverError = null
88
- } = (0, _reactQuery.useQuery)({
92
+ } = (0, _reactQuery.useQuery)(_objectSpread({
89
93
  queryKey: [endpoint, debouncedParams],
90
94
  queryFn: _ref3 => {
91
95
  let {
@@ -97,11 +101,10 @@ const useDebouncedFetch = function (endpoint, params) {
97
101
  let {
98
102
  error
99
103
  } = _ref4;
100
- if ([400, 401, 403, 404, 422].includes(error?.status)) return false;
104
+ if ([400, 401, 403, 404, 422].includes(error === null || error === void 0 ? void 0 : error.status)) return false;
101
105
  return failureCount < 3;
102
- },
103
- ...opts
104
- });
106
+ }
107
+ }, opts));
105
108
  return {
106
109
  fetchedData,
107
110
  isPending,
@@ -6,25 +6,24 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.useXData = exports.useObsmData = exports.useObsData = exports.useLabelObsData = void 0;
7
7
  var _react = require("react");
8
8
  var _lodash = _interopRequireDefault(require("lodash"));
9
+ var _zarr = require("zarr");
9
10
  var _constants = require("../constants/constants");
10
11
  var _DatasetContext = require("../context/DatasetContext");
12
+ var _SettingsContext = require("../context/SettingsContext");
11
13
  var _zarrHelper = require("../helpers/zarr-helper");
12
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
+ // @TODO: support specifying slice to load from context
13
16
  const useObsmData = function () {
14
17
  let obsm = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
15
18
  const dataset = (0, _DatasetContext.useDataset)();
16
- obsm = obsm || dataset.selectedObsm;
17
- const [obsmParams, setObsmParams] = (0, _react.useState)({
19
+ const settings = (0, _SettingsContext.useSettings)();
20
+ obsm = obsm || settings.selectedObsm;
21
+ const obsmParams = (0, _react.useMemo)(() => ({
18
22
  url: dataset.url,
19
- path: "obsm/" + obsm
20
- });
21
- (0, _react.useEffect)(() => {
22
- setObsmParams({
23
- url: dataset.url,
24
- path: "obsm/" + obsm
25
- });
26
- }, [dataset.url, obsm]);
27
- return (0, _zarrHelper.useZarr)(obsmParams, null, _zarrHelper.GET_OPTIONS, {
23
+ path: "obsm/" + obsm,
24
+ s: [null, (0, _zarr.slice)(null, 2)] // load only [:, :2]
25
+ }), [dataset.url, obsm]);
26
+ return (0, _zarrHelper.useZarr)(obsmParams, _zarrHelper.GET_OPTIONS, {
28
27
  enabled: !!obsm
29
28
  });
30
29
  };
@@ -40,72 +39,54 @@ const meanData = (_i, data) => {
40
39
  const useXData = function () {
41
40
  let agg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : meanData;
42
41
  const dataset = (0, _DatasetContext.useDataset)();
43
- const [xParams, setXParams] = (0, _react.useState)(!dataset.selectedVar ? [] : !dataset.selectedVar?.isSet ? [{
44
- url: dataset.url,
45
- path: "X",
46
- s: [null, dataset.selectedVar?.matrix_index]
47
- }] : _lodash.default.map(dataset.selectedVar?.vars, v => {
48
- return {
42
+ const settings = (0, _SettingsContext.useSettings)();
43
+ const xParams = (0, _react.useMemo)(() => {
44
+ var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3;
45
+ return !settings.selectedVar ? [] : !((_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet) ? [{
49
46
  url: dataset.url,
50
47
  path: "X",
51
- s: [null, v.matrix_index]
52
- };
53
- }));
54
- (0, _react.useEffect)(() => {
55
- setXParams(!dataset.selectedVar ? [] : !dataset.selectedVar?.isSet ? [{
56
- url: dataset.url,
57
- path: "X",
58
- s: [null, dataset.selectedVar?.matrix_index]
59
- }] : _lodash.default.map(dataset.selectedVar?.vars, v => {
48
+ s: [null, (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.matrix_index]
49
+ }] : _lodash.default.map((_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars, v => {
60
50
  return {
61
51
  url: dataset.url,
62
52
  path: "X",
63
53
  s: [null, v.matrix_index]
64
54
  };
65
- }));
66
- }, [dataset.url, dataset.selectedVar]);
55
+ });
56
+ }, [dataset.url, settings.selectedVar]);
67
57
  return (0, _zarrHelper.useMultipleZarr)(xParams, _zarrHelper.GET_OPTIONS, {
68
58
  enabled: !!xParams.length
69
59
  }, agg);
70
60
  };
71
61
  exports.useXData = useXData;
72
62
  const useObsData = function () {
63
+ var _obs3, _obs4;
73
64
  let obs = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
74
65
  const dataset = (0, _DatasetContext.useDataset)();
75
- obs = obs || dataset.selectedObs;
76
- const [obsParams, setObsParams] = (0, _react.useState)({
77
- url: dataset.url,
78
- path: "obs/" + obs?.name + (obs?.type === _constants.OBS_TYPES.CATEGORICAL ? "/codes" : "")
79
- });
80
- (0, _react.useEffect)(() => {
81
- setObsParams({
66
+ const settings = (0, _SettingsContext.useSettings)();
67
+ obs = obs || settings.selectedObs;
68
+ const obsParams = (0, _react.useMemo)(() => {
69
+ var _obs, _obs2;
70
+ return {
82
71
  url: dataset.url,
83
- path: "obs/" + obs?.name + (obs?.type === _constants.OBS_TYPES.CATEGORICAL ? "/codes" : "")
84
- });
85
- }, [dataset.url, obs]);
86
- return (0, _zarrHelper.useZarr)(obsParams, null, _zarrHelper.GET_OPTIONS, {
72
+ path: "obs/" + ((_obs = obs) === null || _obs === void 0 ? void 0 : _obs.name) + (((_obs2 = obs) === null || _obs2 === void 0 ? void 0 : _obs2.type) === _constants.OBS_TYPES.CATEGORICAL ? "/codes" : "")
73
+ };
74
+ }, [dataset.url, (_obs3 = obs) === null || _obs3 === void 0 ? void 0 : _obs3.name, (_obs4 = obs) === null || _obs4 === void 0 ? void 0 : _obs4.type]);
75
+ return (0, _zarrHelper.useZarr)(obsParams, _zarrHelper.GET_OPTIONS, {
87
76
  enabled: !!obs
88
77
  });
89
78
  };
90
79
  exports.useObsData = useObsData;
91
80
  const useLabelObsData = () => {
92
81
  const dataset = (0, _DatasetContext.useDataset)();
93
- const [labelObsParams, setLabelObsParams] = (0, _react.useState)(_lodash.default.map(dataset.labelObs, obs => {
82
+ const settings = (0, _SettingsContext.useSettings)();
83
+ const labelObsParams = (0, _react.useMemo)(() => _lodash.default.map(settings.labelObs, obs => {
94
84
  return {
95
85
  url: dataset.url,
96
86
  path: "obs/" + obs.name + (obs.type === _constants.OBS_TYPES.CATEGORICAL ? "/codes" : ""),
97
87
  key: obs.name
98
88
  };
99
- }));
100
- (0, _react.useEffect)(() => {
101
- setLabelObsParams(_lodash.default.map(dataset.labelObs, obs => {
102
- return {
103
- url: dataset.url,
104
- path: "obs/" + obs.name + (obs.type === _constants.OBS_TYPES.CATEGORICAL ? "/codes" : ""),
105
- key: obs.name
106
- };
107
- }));
108
- }, [dataset.labelObs, dataset.url]);
89
+ }), [dataset.url, settings.labelObs]);
109
90
  return (0, _zarrHelper.useMultipleZarr)(labelObsParams, _zarrHelper.GET_OPTIONS, {
110
91
  enabled: !!labelObsParams.length
111
92
  });