@haniffalab/cherita-react 1.3.0 → 1.3.1-dev.2025-10-29.6de4119f

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 (137) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/controls/Controls.js +38 -30
  3. package/dist/cjs/components/dotplot/Dotplot.js +85 -57
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +167 -114
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +102 -0
  8. package/dist/cjs/components/heatmap/Heatmap.js +83 -53
  9. package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
  10. package/dist/cjs/components/icons/DotPlotIcon.js +64 -0
  11. package/dist/cjs/components/icons/HeatmapIcon.js +45 -0
  12. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +57 -0
  13. package/dist/cjs/components/icons/MatrixPlotIcon.js +59 -0
  14. package/dist/cjs/components/icons/ScatterplotIcon.1.js +164 -0
  15. package/dist/cjs/components/icons/ScatterplotIcon.js +144 -0
  16. package/dist/cjs/components/icons/ViolinPlotIcon.js +42 -0
  17. package/dist/cjs/components/matrixplot/Matrixplot.js +83 -54
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +305 -216
  20. package/dist/cjs/components/obs-list/ObsList.js +164 -128
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +67 -28
  23. package/dist/cjs/components/offcanvas/index.js +62 -27
  24. package/dist/cjs/components/pseudospatial/Pseudospatial.js +132 -76
  25. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +122 -74
  26. package/dist/cjs/components/scatterplot/Scatterplot.js +223 -175
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +143 -116
  29. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  30. package/dist/cjs/components/search-bar/SearchBar.js +176 -120
  31. package/dist/cjs/components/search-bar/SearchInfo.js +79 -85
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +111 -0
  34. package/dist/cjs/components/var-list/VarItem.js +131 -103
  35. package/dist/cjs/components/var-list/VarList.js +96 -74
  36. package/dist/cjs/components/var-list/VarListToolbar.js +59 -54
  37. package/dist/cjs/components/var-list/VarSet.js +126 -108
  38. package/dist/cjs/components/violin/Violin.js +124 -81
  39. package/dist/cjs/components/violin/ViolinControls.js +8 -5
  40. package/dist/cjs/constants/colorscales.js +19 -19
  41. package/dist/cjs/constants/constants.js +54 -39
  42. package/dist/cjs/context/DatasetContext.js +27 -17
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +339 -125
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/map-helper.js +2 -1
  48. package/dist/cjs/helpers/zarr-helper.js +3 -3
  49. package/dist/cjs/index.js +15 -21
  50. package/dist/cjs/utils/Filter.js +16 -11
  51. package/dist/cjs/utils/Histogram.js +35 -33
  52. package/dist/cjs/utils/ImageViewer.js +11 -8
  53. package/dist/cjs/utils/Legend.js +37 -30
  54. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  55. package/dist/cjs/utils/Resolver.js +213 -0
  56. package/dist/cjs/utils/Skeleton.js +10 -10
  57. package/dist/cjs/utils/StyledTooltip.js +44 -0
  58. package/dist/cjs/utils/VirtualizedList.js +36 -29
  59. package/dist/cjs/utils/errors.js +15 -15
  60. package/dist/cjs/utils/requests.js +21 -9
  61. package/dist/cjs/utils/search.js +4 -4
  62. package/dist/cjs/utils/string.js +6 -6
  63. package/dist/cjs/utils/zarrData.js +20 -21
  64. package/dist/css/cherita.css +188 -65
  65. package/dist/css/cherita.css.map +1 -1
  66. package/dist/esm/components/controls/Controls.js +43 -35
  67. package/dist/esm/components/dotplot/Dotplot.js +93 -64
  68. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  69. package/dist/esm/components/full-page/FullPage.js +180 -124
  70. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  71. package/dist/esm/components/full-page/PlotTypeSelector.js +95 -0
  72. package/dist/esm/components/heatmap/Heatmap.js +91 -60
  73. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  74. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  75. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  76. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  77. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  78. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  79. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  80. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  81. package/dist/esm/components/matrixplot/Matrixplot.js +91 -61
  82. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  83. package/dist/esm/components/obs-list/ObsItem.js +320 -228
  84. package/dist/esm/components/obs-list/ObsList.js +179 -142
  85. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  86. package/dist/esm/components/obsm-list/ObsmList.js +71 -32
  87. package/dist/esm/components/offcanvas/index.js +68 -33
  88. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  89. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  90. package/dist/esm/components/scatterplot/Scatterplot.js +243 -194
  91. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  92. package/dist/esm/components/scatterplot/SpatialControls.js +155 -127
  93. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  94. package/dist/esm/components/search-bar/SearchBar.js +187 -130
  95. package/dist/esm/components/search-bar/SearchInfo.js +86 -91
  96. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  97. package/dist/esm/components/toolbar/Toolbar.js +101 -0
  98. package/dist/esm/components/var-list/VarItem.js +142 -113
  99. package/dist/esm/components/var-list/VarList.js +108 -88
  100. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  101. package/dist/esm/components/var-list/VarSet.js +134 -115
  102. package/dist/esm/components/violin/Violin.js +135 -91
  103. package/dist/esm/components/violin/ViolinControls.js +10 -6
  104. package/dist/esm/constants/colorscales.js +19 -19
  105. package/dist/esm/constants/constants.js +53 -38
  106. package/dist/esm/context/DatasetContext.js +34 -23
  107. package/dist/esm/context/FilterContext.js +11 -8
  108. package/dist/esm/context/SettingsContext.js +341 -126
  109. package/dist/esm/context/ZarrDataContext.js +8 -6
  110. package/dist/esm/helpers/color-helper.js +5 -5
  111. package/dist/esm/helpers/map-helper.js +4 -3
  112. package/dist/esm/helpers/zarr-helper.js +6 -6
  113. package/dist/esm/index.js +22 -22
  114. package/dist/esm/utils/Filter.js +22 -17
  115. package/dist/esm/utils/Histogram.js +39 -37
  116. package/dist/esm/utils/ImageViewer.js +12 -8
  117. package/dist/esm/utils/Legend.js +44 -36
  118. package/dist/esm/utils/LoadingIndicators.js +16 -13
  119. package/dist/esm/utils/Resolver.js +201 -0
  120. package/dist/esm/utils/Skeleton.js +11 -10
  121. package/dist/esm/utils/StyledTooltip.js +38 -0
  122. package/dist/esm/utils/VirtualizedList.js +37 -29
  123. package/dist/esm/utils/errors.js +15 -15
  124. package/dist/esm/utils/requests.js +24 -12
  125. package/dist/esm/utils/search.js +7 -7
  126. package/dist/esm/utils/string.js +7 -7
  127. package/dist/esm/utils/zarrData.js +27 -28
  128. package/package.json +24 -10
  129. package/scss/cherita-bootstrap.scss +2 -2
  130. package/scss/cherita.scss +65 -17
  131. package/scss/components/accordions.scss +15 -2
  132. package/scss/components/layouts.scss +116 -30
  133. package/scss/components/lists.scss +16 -5
  134. package/scss/components/plotly.scss +40 -23
  135. package/scss/components/plots.scss +14 -1
  136. package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
  137. package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSettingsVars = exports.useSelectedVar = exports.useSelectedObs = exports.useSelectedMultiVar = exports.useResolver = void 0;
7
+ var _react = require("react");
8
+ var _lodash = _interopRequireDefault(require("lodash"));
9
+ var _requests = require("./requests");
10
+ var _constants = require("../constants/constants");
11
+ var _DatasetContext = require("../context/DatasetContext");
12
+ var _SettingsContext = require("../context/SettingsContext");
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ 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; }
15
+ 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; }
16
+ 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; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
18
+ 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); }
19
+ const cleanSettings = settings => {
20
+ var _settings$data$pseudo;
21
+ // Remove obs and vars from settings that are not in data
22
+
23
+ const selectedObs = settings.selectedObs && settings.data.obs[settings.selectedObs.name] ? settings.selectedObs : null;
24
+ const labelObs = _lodash.default.filter(settings.labelObs, obsName => settings.data.obs[obsName]);
25
+ const selectedVar = settings.selectedVar && (settings.selectedVar.isSet ? _lodash.default.every(settings.selectedVar.vars, vv => settings.data.vars[vv.name]) : settings.data.vars[settings.selectedVar.name]) ? settings.selectedVar : null;
26
+ const selectedMultiVar = _lodash.default.filter(settings.selectedMultiVar, v => {
27
+ if (v.isSet) {
28
+ return _lodash.default.every(v.vars, vv => settings.data.vars[vv.name]);
29
+ } else {
30
+ return settings.data.vars[v.name];
31
+ }
32
+ });
33
+ const vars = _lodash.default.filter(settings.vars, v => {
34
+ if (v.isSet) {
35
+ return _lodash.default.every(v.vars, vv => settings.data.vars[vv.name]);
36
+ } else {
37
+ return settings.data.vars[v.name];
38
+ }
39
+ });
40
+ let pseudospatial = settings.pseudospatial;
41
+ if (!_lodash.default.keys(settings.data.pseudospatial).length) {
42
+ pseudospatial = {
43
+ maskSet: null,
44
+ maskValues: null,
45
+ categoricalMode: _constants.PSEUDOSPATIAL_CATEGORICAL_MODES.ACROSS.value
46
+ };
47
+ }
48
+ if (pseudospatial.maskSet && !_lodash.default.includes(_lodash.default.keys(settings.data.pseudospatial), pseudospatial.maskSet)) {
49
+ pseudospatial = _objectSpread(_objectSpread({}, pseudospatial), {}, {
50
+ maskSet: null
51
+ });
52
+ }
53
+ if (pseudospatial.maskValues && !!_lodash.default.difference(pseudospatial.maskValues, ((_settings$data$pseudo = settings.data.pseudospatial) === null || _settings$data$pseudo === void 0 ? void 0 : _settings$data$pseudo[pseudospatial.maskSet]) || []).length) {
54
+ pseudospatial = _objectSpread(_objectSpread({}, pseudospatial), {}, {
55
+ maskValues: null
56
+ });
57
+ }
58
+ return _objectSpread(_objectSpread({}, settings), {}, {
59
+ selectedObs: selectedObs,
60
+ labelObs: labelObs,
61
+ selectedVar: selectedVar,
62
+ selectedMultiVar: selectedMultiVar,
63
+ vars: vars,
64
+ pseudospatial: pseudospatial
65
+ });
66
+ };
67
+ const useResolver = initSettings => {
68
+ const dataset = (0, _DatasetContext.useDataset)();
69
+ const {
70
+ isPseudospatial = false
71
+ } = dataset;
72
+ const [isPending, setisPending] = (0, _react.useState)(true);
73
+ const [resolvedSettings, setResolvedSettings] = (0, _react.useState)(null);
74
+
75
+ // obs
76
+ // all obs should be in initSettings.selectedObs and initSettings.labelObs
77
+ const initObs = _lodash.default.uniqBy(_lodash.default.compact([initSettings.selectedObs, ..._lodash.default.map(initSettings.labelObs, o => ({
78
+ name: o
79
+ }))]), 'name');
80
+ const initObsNames = _lodash.default.map(initObs, o => o.name);
81
+ const [obsParams] = (0, _react.useState)({
82
+ url: dataset.url,
83
+ cols: initObsNames,
84
+ obsParams: _lodash.default.fromPairs(_lodash.default.map(initObs, o => [o.name, {
85
+ bins: o.bins || {}
86
+ }]))
87
+ });
88
+ const {
89
+ fetchedData: obsData,
90
+ isPending: obsDataPending,
91
+ serverError: obsDataError
92
+ } = (0, _requests.useFetch)('obs/cols', obsParams, {
93
+ enabled: !!initObsNames.length
94
+ });
95
+
96
+ // vars
97
+ // all vars should be in initSettings.vars from validation
98
+ const initVars = initSettings.vars;
99
+ const initVarsNames = _lodash.default.flatMap(initVars, v => v.isSet ? _lodash.default.map(v.vars, vv => vv.name) : v.name);
100
+ const [varParams] = (0, _react.useState)({
101
+ url: dataset.url,
102
+ col: dataset.varNamesCol,
103
+ names: initVarsNames
104
+ });
105
+ const {
106
+ fetchedData: varData,
107
+ isPending: varDataPending,
108
+ serverError: varDataError
109
+ } = (0, _requests.useFetch)('var/cols/names', varParams, {
110
+ enabled: !!varParams.names.length
111
+ });
112
+
113
+ // pseudospatial
114
+ const [pseudospatialParams] = (0, _react.useState)({
115
+ url: dataset.url
116
+ });
117
+ const pseudospatialEnabled = isPseudospatial;
118
+ const {
119
+ fetchedData: pseudospatialData,
120
+ isPending: pseudospatialDataPending,
121
+ serverError: pseudospatialDataError
122
+ } = (0, _requests.useFetch)('masks', pseudospatialParams, {
123
+ enabled: pseudospatialEnabled,
124
+ retry: false
125
+ });
126
+
127
+ // Use isPending to help set initial state to true
128
+ (0, _react.useEffect)(() => {
129
+ setisPending(obsDataPending || varDataPending || pseudospatialDataPending);
130
+ }, [obsDataPending, pseudospatialDataPending, varDataPending]);
131
+
132
+ // Use isPending along with other pending states
133
+ // to ensure they've all converged after state updates
134
+ (0, _react.useEffect)(() => {
135
+ if (isPending || obsDataPending || varDataPending || pseudospatialDataPending) {
136
+ return;
137
+ }
138
+ if (obsDataError) {
139
+ console.error('Error fetching obs data:', obsDataError);
140
+ }
141
+ if (varDataError) {
142
+ console.error('Error fetching var data:', varDataError);
143
+ }
144
+ if (pseudospatialDataError) {
145
+ console.error('Error fetching pseudospatial masks data:', pseudospatialDataError);
146
+ }
147
+ const data = {
148
+ obs: obsData ? _lodash.default.fromPairs(_lodash.default.map(obsData, o => [o.name, o])) : {},
149
+ vars: varData ? _lodash.default.fromPairs(_lodash.default.map(varData, v => [v.name, v])) : {},
150
+ pseudospatial: pseudospatialData || {}
151
+ };
152
+ const cleanedSettings = cleanSettings(_objectSpread(_objectSpread({}, initSettings), {}, {
153
+ data: data
154
+ }));
155
+ setResolvedSettings(cleanedSettings);
156
+ }, [initSettings, isPending, obsData, obsDataError, obsDataPending, pseudospatialData, pseudospatialDataError, pseudospatialDataPending, pseudospatialEnabled, varData, varDataError, varDataPending]);
157
+ return resolvedSettings;
158
+ };
159
+ exports.useResolver = useResolver;
160
+ const useSelectedObs = () => {
161
+ const settings = (0, _SettingsContext.useSettings)();
162
+ return (0, _react.useMemo)(() => {
163
+ return settings.selectedObs ? _objectSpread(_objectSpread({}, settings.selectedObs), settings.data.obs[settings.selectedObs.name]) : null;
164
+ }, [settings.data.obs, settings.selectedObs]);
165
+ };
166
+ exports.useSelectedObs = useSelectedObs;
167
+ const useSelectedVar = () => {
168
+ const settings = (0, _SettingsContext.useSettings)();
169
+ return (0, _react.useMemo)(() => {
170
+ if (settings.selectedVar) {
171
+ if (settings.selectedVar.isSet) {
172
+ return _objectSpread(_objectSpread({}, settings.selectedVar), {}, {
173
+ vars: settings.selectedVar.vars.map(v => _objectSpread({}, settings.data.vars[v.name]))
174
+ });
175
+ } else {
176
+ return _objectSpread(_objectSpread({}, settings.selectedVar), settings.data.vars[settings.selectedVar.name]);
177
+ }
178
+ } else {
179
+ return null;
180
+ }
181
+ }, [settings.data.vars, settings.selectedVar]);
182
+ };
183
+ exports.useSelectedVar = useSelectedVar;
184
+ const useSelectedMultiVar = () => {
185
+ const settings = (0, _SettingsContext.useSettings)();
186
+ return (0, _react.useMemo)(() => {
187
+ return _lodash.default.map(settings.selectedMultiVar, v => {
188
+ if (v.isSet) {
189
+ return _objectSpread(_objectSpread({}, v), {}, {
190
+ vars: v.vars.map(vv => _objectSpread({}, settings.data.vars[vv.name]))
191
+ });
192
+ } else {
193
+ return _objectSpread(_objectSpread({}, v), settings.data.vars[v.name]);
194
+ }
195
+ });
196
+ }, [settings.data.vars, settings.selectedMultiVar]);
197
+ };
198
+ exports.useSelectedMultiVar = useSelectedMultiVar;
199
+ const useSettingsVars = () => {
200
+ const settings = (0, _SettingsContext.useSettings)();
201
+ return (0, _react.useMemo)(() => {
202
+ return _lodash.default.map(settings.vars, v => {
203
+ if (v.isSet) {
204
+ return _objectSpread(_objectSpread({}, v), {}, {
205
+ vars: v.vars.map(vv => _objectSpread({}, settings.data.vars[vv.name]))
206
+ });
207
+ } else {
208
+ return _objectSpread(_objectSpread({}, v), settings.data.vars[v.name]);
209
+ }
210
+ });
211
+ }, [settings.data.vars, settings.vars]);
212
+ };
213
+ exports.useSettingsVars = useSettingsVars;
@@ -4,18 +4,18 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.ObsmKeysListBtn = void 0;
7
- var _react = _interopRequireDefault(require("react"));
8
7
  var _reactBootstrap = require("react-bootstrap");
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
+ var _jsxRuntime = require("react/jsx-runtime");
10
9
  const ObsmKeysListBtn = () => {
11
- return /*#__PURE__*/_react.default.createElement(_reactBootstrap.Placeholder, {
10
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Placeholder, {
12
11
  as: _reactBootstrap.Button,
13
- animation: "glow"
14
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Placeholder, {
15
- xs: 6,
16
- style: {
17
- width: "40px"
18
- }
19
- }));
12
+ animation: "glow",
13
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Placeholder, {
14
+ xs: 6,
15
+ style: {
16
+ width: '40px'
17
+ }
18
+ })
19
+ });
20
20
  };
21
21
  exports.ObsmKeysListBtn = ObsmKeysListBtn;
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.StyledTooltip = void 0;
7
+ var _material = require("@mui/material");
8
+ var _jsxRuntime = require("react/jsx-runtime");
9
+ const _excluded = ["className"];
10
+ 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; }
11
+ 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; }
12
+ 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; }
13
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
14
+ 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); }
15
+ 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; }
16
+ 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; }
17
+ const StyledTooltip = exports.StyledTooltip = (0, _material.styled)(_ref => {
18
+ let {
19
+ className
20
+ } = _ref,
21
+ props = _objectWithoutProperties(_ref, _excluded);
22
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, _objectSpread(_objectSpread({}, props), {}, {
23
+ classes: {
24
+ popper: className
25
+ }
26
+ }));
27
+ })(_ref2 => {
28
+ let {
29
+ theme
30
+ } = _ref2;
31
+ return {
32
+ ["& .".concat(_material.tooltipClasses.tooltip)]: {
33
+ backgroundColor: '#000',
34
+ color: '#fff',
35
+ maxWidth: 220,
36
+ fontSize: 13,
37
+ borderRadius: 4,
38
+ padding: theme.spacing(0.5, 1),
39
+ whiteSpace: 'pre-line',
40
+ textAlign: 'center',
41
+ boxShadow: '0 0.25rem 0.75rem rgba(0, 0, 0, 0.1)'
42
+ }
43
+ };
44
+ });
@@ -4,11 +4,15 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.VirtualizedList = VirtualizedList;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
8
  var _reactVirtual = require("@tanstack/react-virtual");
9
+ var _jsxRuntime = require("react/jsx-runtime");
9
10
  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
- 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); }
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); }
12
16
  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
17
  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; }
14
18
  function VirtualizedList(_ref) {
@@ -17,16 +21,16 @@ function VirtualizedList(_ref) {
17
21
  getDataAtIndex,
18
22
  count,
19
23
  ItemComponent,
20
- estimateSize = 45,
24
+ estimateSize = () => 45,
21
25
  overscan = 25,
22
- maxHeight = "65vh"
26
+ maxHeight = '65vh'
23
27
  } = _ref,
24
28
  props = _objectWithoutProperties(_ref, _excluded);
25
29
  const [parentNode, setParentNode] = (0, _react.useState)(null);
26
30
  const itemVirtualizer = (0, _reactVirtual.useVirtualizer)({
27
31
  count: count,
28
32
  getScrollElement: () => parentNode,
29
- estimateSize: () => estimateSize,
33
+ estimateSize: i => estimateSize(i),
30
34
  overscan: overscan
31
35
  });
32
36
  const refCallback = (0, _react.useCallback)(node => {
@@ -36,31 +40,34 @@ function VirtualizedList(_ref) {
36
40
  (0, _react.useEffect)(() => {
37
41
  itemVirtualizer.measure();
38
42
  }, [itemVirtualizer, parentNode === null || parentNode === void 0 ? void 0 : parentNode.clientHeight, getDataAtIndex]);
39
- return /*#__PURE__*/_react.default.createElement("div", {
43
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
40
44
  ref: refCallback,
41
45
  style: {
42
- overflowY: "auto",
46
+ overflowY: 'auto',
43
47
  maxHeight: maxHeight
44
48
  },
45
- className: "modern-scrollbars"
46
- }, /*#__PURE__*/_react.default.createElement("div", {
47
- style: {
48
- height: "".concat(itemVirtualizer.getTotalSize(), "px"),
49
- width: "100%",
50
- position: "relative",
51
- willChange: "transform"
52
- }
53
- }, /*#__PURE__*/_react.default.createElement("div", {
54
- style: {
55
- position: "absolute",
56
- top: 0,
57
- left: 0,
58
- width: "100%",
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)")
60
- }
61
- }, virtualItems.map(virtualItem => /*#__PURE__*/_react.default.createElement("div", {
62
- key: virtualItem.key,
63
- "data-index": virtualItem.index,
64
- ref: itemVirtualizer.measureElement
65
- }, /*#__PURE__*/_react.default.createElement(ItemComponent, _extends({}, getDataAtIndex(virtualItem.index), props)))))));
49
+ className: "modern-scrollbars",
50
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
51
+ style: {
52
+ height: "".concat(itemVirtualizer.getTotalSize(), "px"),
53
+ width: '100%',
54
+ position: 'relative',
55
+ willChange: 'transform'
56
+ },
57
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
58
+ style: {
59
+ position: 'absolute',
60
+ top: 0,
61
+ left: 0,
62
+ width: '100%',
63
+ 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)")
64
+ },
65
+ children: virtualItems.map(virtualItem => /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
66
+ "data-index": virtualItem.index,
67
+ ref: itemVirtualizer.measureElement,
68
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ItemComponent, _objectSpread(_objectSpread({}, getDataAtIndex(virtualItem.index)), props))
69
+ }, virtualItem.key))
70
+ })
71
+ })
72
+ });
66
73
  }
@@ -12,38 +12,38 @@ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e =
12
12
  const parseError = err => {
13
13
  if (err === DOMException.TIMEOUT_ERR) {
14
14
  return {
15
- message: "Timeout error",
15
+ message: 'Timeout error',
16
16
  name: err
17
17
  };
18
18
  }
19
19
  switch (err === null || err === void 0 ? void 0 : err.name) {
20
- case "TypeError":
20
+ case 'TypeError':
21
21
  return _objectSpread(_objectSpread({}, err), {}, {
22
- message: "Failed to fetch data from server"
22
+ message: 'Failed to fetch data from server'
23
23
  });
24
- case "ReadZarrError":
24
+ case 'ReadZarrError':
25
25
  return _objectSpread(_objectSpread({}, err), {}, {
26
- message: "Failed to read AnnData-Zarr"
26
+ message: 'Failed to read AnnData-Zarr'
27
27
  });
28
- case "InvalidObs":
28
+ case 'InvalidObs':
29
29
  return _objectSpread(_objectSpread({}, err), {}, {
30
- message: "Observation not found in dataset"
30
+ message: 'Observation not found in dataset'
31
31
  });
32
- case "InvalidVar":
32
+ case 'InvalidVar':
33
33
  return _objectSpread(_objectSpread({}, err), {}, {
34
- message: "Feature not found in dataset"
34
+ message: 'Feature not found in dataset'
35
35
  });
36
- case "InvalidKey":
36
+ case 'InvalidKey':
37
37
  return _objectSpread(_objectSpread({}, err), {}, {
38
- message: "Key not found in datset"
38
+ message: 'Key not found in dataset'
39
39
  });
40
- case "BadRequest":
40
+ case 'BadRequest':
41
41
  return _objectSpread(_objectSpread({}, err), {}, {
42
- message: "Invalid request to server"
42
+ message: 'Invalid request to server'
43
43
  });
44
- case "InternalServerError":
44
+ case 'InternalServerError':
45
45
  return _objectSpread(_objectSpread({}, err), {}, {
46
- message: "Server error"
46
+ message: 'Server error'
47
47
  });
48
48
  default:
49
49
  return err;
@@ -22,13 +22,13 @@ async function fetchData(endpoint, params) {
22
22
  const timeout = setTimeout(() => {
23
23
  controller.abort(DOMException.TIMEOUT_ERR);
24
24
  }, ms || 300000);
25
- if (signal) signal.addEventListener("abort", () => controller.abort());
25
+ if (signal) signal.addEventListener('abort', () => controller.abort());
26
26
  const response = await fetch(new URL(endpoint, apiUrl), {
27
- method: "POST",
28
- mode: "cors",
27
+ method: 'POST',
28
+ mode: 'cors',
29
29
  headers: {
30
- "Content-Type": "application/json",
31
- Accept: "application/json"
30
+ 'Content-Type': 'application/json',
31
+ Accept: 'application/json'
32
32
  },
33
33
  body: JSON.stringify(params),
34
34
  signal: controller.signal
@@ -44,12 +44,17 @@ async function fetchData(endpoint, params) {
44
44
  }
45
45
  return await response.json();
46
46
  }
47
+
48
+ // @TODO: update to match isLoading
47
49
  const useFetch = function (endpoint, params) {
48
50
  let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
49
51
  refetchOnMount: false,
50
52
  refetchOnWindowFocus: false
51
53
  };
52
54
  let apiUrl = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
55
+ const {
56
+ retry = null
57
+ } = opts;
53
58
  const {
54
59
  data: fetchedData = null,
55
60
  isLoading: isPending = false,
@@ -62,13 +67,13 @@ const useFetch = function (endpoint, params) {
62
67
  } = _ref;
63
68
  return fetchData(endpoint, params, signal, apiUrl);
64
69
  },
65
- retry: (failureCount, _ref2) => {
70
+ retry: retry || ((failureCount, _ref2) => {
66
71
  let {
67
72
  error
68
73
  } = _ref2;
69
74
  if ([400, 401, 403, 404, 422].includes(error === null || error === void 0 ? void 0 : error.status)) return false;
70
75
  return failureCount < 3;
71
- }
76
+ })
72
77
  }, opts));
73
78
  return {
74
79
  fetchedData,
@@ -84,12 +89,17 @@ const useDebouncedFetch = function (endpoint, params) {
84
89
  refetchOnWindowFocus: false
85
90
  };
86
91
  let apiUrl = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
92
+ // Optional isEnabled function to determine if enabled based on debouncedParams instead of params
93
+ const {
94
+ enabled = true,
95
+ isEnabled = () => true
96
+ } = opts;
87
97
  const debouncedParams = (0, _usehooks.useDebounce)(params, delay);
88
98
  const {
89
99
  data: fetchedData = null,
90
100
  isLoading: isPending = false,
91
101
  error: serverError = null
92
- } = (0, _reactQuery.useQuery)(_objectSpread({
102
+ } = (0, _reactQuery.useQuery)(_objectSpread(_objectSpread({
93
103
  queryKey: [endpoint, debouncedParams],
94
104
  queryFn: _ref3 => {
95
105
  let {
@@ -104,7 +114,9 @@ const useDebouncedFetch = function (endpoint, params) {
104
114
  if ([400, 401, 403, 404, 422].includes(error === null || error === void 0 ? void 0 : error.status)) return false;
105
115
  return failureCount < 3;
106
116
  }
107
- }, opts));
117
+ }, opts), {}, {
118
+ enabled: enabled && isEnabled(debouncedParams)
119
+ }));
108
120
  return {
109
121
  fetchedData,
110
122
  isPending,
@@ -8,12 +8,12 @@ var _react = require("react");
8
8
  var _requests = require("./requests");
9
9
  var _DatasetContext = require("../context/DatasetContext");
10
10
  const useDiseaseSearch = () => {
11
- const ENDPOINT = "diseases";
11
+ const ENDPOINT = 'diseases';
12
12
  const dataset = (0, _DatasetContext.useDataset)();
13
13
  const [params, setParams] = (0, _react.useState)({
14
14
  url: dataset.url,
15
15
  diseaseDatasets: dataset.diseaseDatasets,
16
- text: ""
16
+ text: ''
17
17
  });
18
18
  const data = (0, _requests.useFetch)(ENDPOINT, params, {
19
19
  enabled: !!params.text.length,
@@ -27,12 +27,12 @@ const useDiseaseSearch = () => {
27
27
  };
28
28
  exports.useDiseaseSearch = useDiseaseSearch;
29
29
  const useVarSearch = () => {
30
- const ENDPOINT = "var/names";
30
+ const ENDPOINT = 'var/names';
31
31
  const dataset = (0, _DatasetContext.useDataset)();
32
32
  const [params, setParams] = (0, _react.useState)({
33
33
  url: dataset.url,
34
34
  col: dataset.varNamesCol,
35
- text: ""
35
+ text: ''
36
36
  });
37
37
  const data = (0, _requests.useFetch)(ENDPOINT, params, {
38
38
  enabled: !!params.text.length,
@@ -9,9 +9,9 @@ exports.formatString = formatString;
9
9
  var _numbro = _interopRequireDefault(require("numbro"));
10
10
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
11
11
  const FORMATS = exports.FORMATS = {
12
- EXPONENTIAL: "exponential",
13
- ABBREVIATION: "abbreviation",
14
- THOUSAND: "thousand"
12
+ EXPONENTIAL: 'exponential',
13
+ ABBREVIATION: 'abbreviation',
14
+ THOUSAND: 'thousand'
15
15
  };
16
16
  function formatThousand(n) {
17
17
  let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
@@ -41,9 +41,9 @@ function formatNumerical(n) {
41
41
  let format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : FORMATS.THOUSAND;
42
42
  let precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 3;
43
43
  if (n === 0) {
44
- return "0";
44
+ return '0';
45
45
  } else if (!n || n === undefined || isNaN(n)) {
46
- return "NaN";
46
+ return 'NaN';
47
47
  }
48
48
  switch (format) {
49
49
  case FORMATS.EXPONENTIAL:
@@ -64,5 +64,5 @@ function formatNumerical(n) {
64
64
  }
65
65
  }
66
66
  function formatString(s) {
67
- return s.trim().replace(/_/g, " ");
67
+ return s.trim().replace(/_/g, ' ');
68
68
  }