@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
@@ -0,0 +1,528 @@
1
+ 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; }
2
+ 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; }
3
+ 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; }
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
+ 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); }
6
+ import React, { createContext, useContext, useEffect, useReducer } from "react";
7
+ import _ from "lodash";
8
+ import { COLOR_ENCODINGS, DOTPLOT_SCALES, LOCAL_STORAGE_KEY, MATRIXPLOT_SCALES, OBS_TYPES, PSEUDOSPATIAL_CATEGORICAL_MODES, VAR_SORT, VAR_SORT_ORDER, VIOLINPLOT_SCALES } from "../constants/constants";
9
+ export const SettingsContext = /*#__PURE__*/createContext(null);
10
+ export const SettingsDispatchContext = /*#__PURE__*/createContext(null);
11
+ const initialSettings = {
12
+ selectedObs: null,
13
+ selectedVar: null,
14
+ selectedObsm: null,
15
+ selectedMultiObs: [],
16
+ selectedMultiVar: [],
17
+ colorEncoding: null,
18
+ labelObs: [],
19
+ vars: [],
20
+ sliceBy: {
21
+ obs: false,
22
+ polygons: false
23
+ },
24
+ polygons: {},
25
+ controls: {
26
+ colorScale: "Viridis",
27
+ valueRange: [0, 1],
28
+ range: [0, 1],
29
+ colorAxis: {
30
+ dmin: 0,
31
+ dmax: 1,
32
+ cmin: 0,
33
+ cmax: 1
34
+ },
35
+ scale: {
36
+ dotplot: DOTPLOT_SCALES.NONE.value,
37
+ matrixplot: MATRIXPLOT_SCALES.NONE.value,
38
+ violinplot: VIOLINPLOT_SCALES.WIDTH.value
39
+ },
40
+ meanOnlyExpressed: false,
41
+ expressionCutoff: 0.0
42
+ },
43
+ varSort: {
44
+ var: {
45
+ sort: VAR_SORT.NONE,
46
+ sortOrder: VAR_SORT_ORDER.ASC
47
+ },
48
+ disease: {
49
+ sort: VAR_SORT.NONE,
50
+ sortOrder: VAR_SORT_ORDER.ASC
51
+ }
52
+ },
53
+ pseudospatial: {
54
+ maskSet: null,
55
+ maskValues: null,
56
+ categoricalMode: PSEUDOSPATIAL_CATEGORICAL_MODES.ACROSS.value
57
+ }
58
+ };
59
+ const initializer = _ref => {
60
+ let {
61
+ canOverrideSettings,
62
+ defaultSettings,
63
+ localSettings
64
+ } = _ref;
65
+ return canOverrideSettings ? _.assign({}, initialSettings, defaultSettings, localSettings) : _.assign({}, initialSettings, defaultSettings);
66
+ };
67
+ export function SettingsProvider(_ref2) {
68
+ let {
69
+ dataset_url,
70
+ defaultSettings,
71
+ canOverrideSettings,
72
+ children
73
+ } = _ref2;
74
+ const DATASET_STORAGE_KEY = "".concat(LOCAL_STORAGE_KEY, "-").concat(dataset_url);
75
+ // Use localStorage directly instead of useLocalStorage due to unnecessary re-renders
76
+ // https://github.com/uidotdev/usehooks/issues/157
77
+ const localSettings = JSON.parse(localStorage.getItem(DATASET_STORAGE_KEY)) || {};
78
+ const [settings, dispatch] = useReducer(settingsReducer, {
79
+ canOverrideSettings,
80
+ defaultSettings,
81
+ localSettings
82
+ }, initializer);
83
+ useEffect(() => {
84
+ if (canOverrideSettings) {
85
+ try {
86
+ localStorage.setItem(DATASET_STORAGE_KEY, JSON.stringify(settings));
87
+ } catch (err) {
88
+ if (err.code === 22 || err.code === 1014 || err.name === "QuotaExceededError" || err.name === "NS_ERROR_DOM_QUOTA_REACHED") {
89
+ console.err("Browser storage quota exceeded");
90
+ } else {
91
+ console.err(err);
92
+ }
93
+ }
94
+ }
95
+ }, [DATASET_STORAGE_KEY, canOverrideSettings, settings]);
96
+ return /*#__PURE__*/React.createElement(SettingsContext.Provider, {
97
+ value: settings
98
+ }, /*#__PURE__*/React.createElement(SettingsDispatchContext.Provider, {
99
+ value: dispatch
100
+ }, children));
101
+ }
102
+ export function useSettings() {
103
+ return useContext(SettingsContext);
104
+ }
105
+ export function useSettingsDispatch() {
106
+ return useContext(SettingsDispatchContext);
107
+ }
108
+ function settingsReducer(settings, action) {
109
+ switch (action.type) {
110
+ case "select.obs":
111
+ {
112
+ var _action$obs;
113
+ return _objectSpread(_objectSpread({}, settings), {}, {
114
+ selectedObs: action.obs,
115
+ controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
116
+ range: ((_action$obs = action.obs) === null || _action$obs === void 0 ? void 0 : _action$obs.type) === OBS_TYPES.CATEGORICAL ? [0, 1] : settings.controls.range
117
+ }),
118
+ colorEncoding: settings.colorEncoding === COLOR_ENCODINGS.OBS && !action.obs ? null : settings.colorEncoding,
119
+ sliceBy: _objectSpread(_objectSpread({}, settings.sliceBy), {}, {
120
+ obs: action.obs ? settings.sliceBy.obs : false
121
+ })
122
+ });
123
+ }
124
+ case "select.obsm":
125
+ {
126
+ return _objectSpread(_objectSpread({}, settings), {}, {
127
+ selectedObsm: action.obsm
128
+ });
129
+ }
130
+ case "select.var":
131
+ {
132
+ if (settings.vars.find(v => _.isEqual(v, action.var))) {
133
+ return _objectSpread(_objectSpread({}, settings), {}, {
134
+ selectedVar: action.var
135
+ });
136
+ } else {
137
+ return _objectSpread(_objectSpread({}, settings), {}, {
138
+ selectedVar: action.var,
139
+ vars: [...settings.vars, action.var]
140
+ });
141
+ }
142
+ }
143
+ case "select.multivar":
144
+ {
145
+ const vars = settings.vars.find(v => _.isEqual(v, action.var)) ? settings.vars : [...settings.vars, action.var];
146
+ if (settings.selectedMultiVar.find(v => _.isEqual(v, action.var))) {
147
+ return _objectSpread(_objectSpread({}, settings), {}, {
148
+ vars: vars
149
+ });
150
+ } else {
151
+ return _objectSpread(_objectSpread({}, settings), {}, {
152
+ selectedMultiVar: [...settings.selectedMultiVar, action.var],
153
+ vars: vars
154
+ });
155
+ }
156
+ }
157
+ case "deselect.multivar":
158
+ {
159
+ return _objectSpread(_objectSpread({}, settings), {}, {
160
+ selectedMultiVar: settings.selectedMultiVar.filter(v => v !== action.var.name)
161
+ });
162
+ }
163
+ case "toggle.multivar":
164
+ {
165
+ const inMultiVar = settings.selectedMultiVar.some(v => v.name === action.var.name);
166
+ if (inMultiVar) {
167
+ return _objectSpread(_objectSpread({}, settings), {}, {
168
+ selectedMultiVar: settings.selectedMultiVar.filter(v => v.name !== action.var.name)
169
+ });
170
+ } else {
171
+ return _objectSpread(_objectSpread({}, settings), {}, {
172
+ selectedMultiVar: [...settings.selectedMultiVar, action.var]
173
+ });
174
+ }
175
+ }
176
+ case "set.colorEncoding":
177
+ {
178
+ return _objectSpread(_objectSpread({}, settings), {}, {
179
+ colorEncoding: action.value
180
+ });
181
+ }
182
+ case "reset.vars":
183
+ {
184
+ return _objectSpread(_objectSpread({}, settings), {}, {
185
+ vars: [],
186
+ selectedVar: null,
187
+ selectedMultiVar: []
188
+ });
189
+ }
190
+ case "reset.multiVar":
191
+ {
192
+ return _objectSpread(_objectSpread({}, settings), {}, {
193
+ selectedMultiVar: [],
194
+ colorEncoding: settings.colorEncoding === COLOR_ENCODINGS.VAR ? null : settings.colorEncoding
195
+ });
196
+ }
197
+ case "reset.var":
198
+ {
199
+ return _objectSpread(_objectSpread({}, settings), {}, {
200
+ selectedVar: null,
201
+ colorEncoding: settings.colorEncoding === COLOR_ENCODINGS.VAR ? null : settings.colorEncoding
202
+ });
203
+ }
204
+ case "add.var":
205
+ {
206
+ if (settings.vars.find(v => v.name === action.var.name)) {
207
+ return settings;
208
+ } else {
209
+ return _objectSpread(_objectSpread({}, settings), {}, {
210
+ vars: [...settings.vars, action.var]
211
+ });
212
+ }
213
+ }
214
+ case "remove.var":
215
+ {
216
+ var _settings$selectedVar;
217
+ const selectedVar = ((_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name) === action.var.name ? null : settings.selectedVar;
218
+ const selectedMultiVar = settings.selectedMultiVar.filter(v => v.name !== action.var.name);
219
+ return _objectSpread(_objectSpread({}, settings), {}, {
220
+ vars: settings.vars.filter(a => a.name !== action.var.name),
221
+ selectedVar: selectedVar,
222
+ selectedMultiVar: selectedMultiVar
223
+ });
224
+ }
225
+ case "add.varSet.var":
226
+ {
227
+ const varSet = settings.vars.find(s => s.isSet && s.name === action.varSet.name);
228
+ if (!varSet) {
229
+ return settings;
230
+ }
231
+ if (varSet.vars.some(v => v.name === action.var.name)) {
232
+ return settings;
233
+ } else {
234
+ var _settings$selectedVar2;
235
+ const varSetVars = [...varSet.vars, action.var];
236
+ const vars = settings.vars.map(v => {
237
+ if (v.name === varSet.name) {
238
+ return _objectSpread(_objectSpread({}, v), {}, {
239
+ vars: varSetVars
240
+ });
241
+ } else {
242
+ return v;
243
+ }
244
+ });
245
+ const selectedVar = ((_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name) === action.varSet.name ? _objectSpread(_objectSpread({}, varSet), {}, {
246
+ vars: varSetVars
247
+ }) : settings.selectedVar;
248
+ const selectedMultiVar = settings.selectedMultiVar.map(v => {
249
+ if (v.name === varSet.name) {
250
+ return _objectSpread(_objectSpread({}, v), {}, {
251
+ vars: varSetVars
252
+ });
253
+ } else {
254
+ return v;
255
+ }
256
+ });
257
+ return _objectSpread(_objectSpread({}, settings), {}, {
258
+ vars: vars,
259
+ selectedVar: selectedVar,
260
+ selectedMultiVar: selectedMultiVar
261
+ });
262
+ }
263
+ }
264
+ case "remove.varSet.var":
265
+ {
266
+ const varSet = settings.vars.find(s => s.isSet && s.name === action.varSet.name);
267
+ if (!varSet) {
268
+ return settings;
269
+ }
270
+ if (!varSet.vars.some(v => v.name === action.var.name)) {
271
+ return settings;
272
+ } else {
273
+ const varSetVars = varSet.vars.filter(v => v.name !== action.var.name);
274
+ const vars = settings.vars.map(v => {
275
+ if (v.name === varSet.name) {
276
+ return _objectSpread(_objectSpread({}, v), {}, {
277
+ vars: varSetVars
278
+ });
279
+ } else {
280
+ return v;
281
+ }
282
+ });
283
+ // Remove from selected if varSet vars is empty
284
+ if (!varSetVars.length) {
285
+ var _settings$selectedVar3;
286
+ const selectedVar = ((_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.name) === action.varSet.name ? null : settings.selectedVar;
287
+ const selectedMultiVar = settings.selectedMultiVar.filter(v => v.name !== action.varSet.name);
288
+ return _objectSpread(_objectSpread({}, settings), {}, {
289
+ vars: vars,
290
+ selectedVar: selectedVar,
291
+ selectedMultiVar: selectedMultiVar
292
+ });
293
+ } else {
294
+ var _settings$selectedVar4;
295
+ // Update selected if varSet is selected
296
+ const selectedVar = ((_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.name) === action.varSet.name ? _objectSpread(_objectSpread({}, varSet), {}, {
297
+ vars: varSetVars
298
+ }) : settings.selectedVar;
299
+ const selectedMultiVar = settings.selectedMultiVar.map(v => {
300
+ if (v.name === varSet.name) {
301
+ return _objectSpread(_objectSpread({}, v), {}, {
302
+ vars: varSetVars
303
+ });
304
+ } else {
305
+ return v;
306
+ }
307
+ });
308
+ return _objectSpread(_objectSpread({}, settings), {}, {
309
+ vars: vars,
310
+ selectedVar: selectedVar,
311
+ selectedMultiVar: selectedMultiVar
312
+ });
313
+ }
314
+ }
315
+ }
316
+ case "set.controls.colorScale":
317
+ {
318
+ return _objectSpread(_objectSpread({}, settings), {}, {
319
+ controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
320
+ colorScale: action.colorScale
321
+ })
322
+ });
323
+ }
324
+ case "set.controls.valueRange":
325
+ {
326
+ return _objectSpread(_objectSpread({}, settings), {}, {
327
+ controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
328
+ valueRange: action.valueRange
329
+ })
330
+ });
331
+ }
332
+ case "set.controls.range":
333
+ {
334
+ return _objectSpread(_objectSpread({}, settings), {}, {
335
+ controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
336
+ range: action.range
337
+ })
338
+ });
339
+ }
340
+ case "set.controls.colorAxis":
341
+ {
342
+ return _objectSpread(_objectSpread({}, settings), {}, {
343
+ controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
344
+ colorAxis: action.colorAxis
345
+ })
346
+ });
347
+ }
348
+ case "set.controls.colorAxis.crange":
349
+ {
350
+ return _objectSpread(_objectSpread({}, settings), {}, {
351
+ controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
352
+ colorAxis: _objectSpread(_objectSpread({}, settings.controls.colorAxis), {}, {
353
+ cmin: action.cmin,
354
+ cmax: action.cmax
355
+ })
356
+ })
357
+ });
358
+ }
359
+ case "set.controls.colorAxis.cmin":
360
+ {
361
+ return _objectSpread(_objectSpread({}, settings), {}, {
362
+ controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
363
+ colorAxis: _objectSpread(_objectSpread({}, settings.controls.colorAxis), {}, {
364
+ cmin: action.cmin
365
+ })
366
+ })
367
+ });
368
+ }
369
+ case "set.controls.colorAxis.cmax":
370
+ {
371
+ return _objectSpread(_objectSpread({}, settings), {}, {
372
+ controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
373
+ colorAxis: _objectSpread(_objectSpread({}, settings.controls.colorAxis), {}, {
374
+ cmax: action.cmax
375
+ })
376
+ })
377
+ });
378
+ }
379
+ case "set.controls.scale":
380
+ {
381
+ return _objectSpread(_objectSpread({}, settings), {}, {
382
+ controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
383
+ scale: _objectSpread(_objectSpread({}, settings.controls.scale), {}, {
384
+ [action.plot]: action.scale
385
+ })
386
+ })
387
+ });
388
+ }
389
+ case "set.controls.meanOnlyExpressed":
390
+ {
391
+ return _objectSpread(_objectSpread({}, settings), {}, {
392
+ controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
393
+ meanOnlyExpressed: action.meanOnlyExpressed
394
+ })
395
+ });
396
+ }
397
+ case "set.controls.expressionCutoff":
398
+ {
399
+ return _objectSpread(_objectSpread({}, settings), {}, {
400
+ controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
401
+ expressionCutoff: action.expressionCutoff
402
+ })
403
+ });
404
+ }
405
+ case "toggle.slice.obs":
406
+ {
407
+ if (_.isEqual(settings.selectedObs, action.obs)) {
408
+ return _objectSpread(_objectSpread({}, settings), {}, {
409
+ sliceBy: _objectSpread(_objectSpread({}, settings.sliceBy), {}, {
410
+ obs: !settings.sliceBy.obs
411
+ })
412
+ });
413
+ } else {
414
+ return _objectSpread(_objectSpread({}, settings), {}, {
415
+ selectedObs: action.obs,
416
+ sliceBy: _objectSpread(_objectSpread({}, settings.sliceBy), {}, {
417
+ obs: true
418
+ })
419
+ });
420
+ }
421
+ }
422
+ case "toggle.slice.polygons":
423
+ {
424
+ return _objectSpread(_objectSpread({}, settings), {}, {
425
+ sliceBy: _objectSpread(_objectSpread({}, settings.sliceBy), {}, {
426
+ polygons: !settings.sliceBy.polygons
427
+ })
428
+ });
429
+ }
430
+ case "disable.slice.polygons":
431
+ {
432
+ return _objectSpread(_objectSpread({}, settings), {}, {
433
+ sliceBy: _objectSpread(_objectSpread({}, settings.sliceBy), {}, {
434
+ polygons: false
435
+ })
436
+ });
437
+ }
438
+ case "add.label.obs":
439
+ {
440
+ if (settings.labelObs.find(i => _.isEqual(i, action.obs))) {
441
+ return settings;
442
+ } else {
443
+ return _objectSpread(_objectSpread({}, settings), {}, {
444
+ labelObs: [...settings.labelObs, action.obs]
445
+ });
446
+ }
447
+ }
448
+ case "remove.label.obs":
449
+ {
450
+ return _objectSpread(_objectSpread({}, settings), {}, {
451
+ labelObs: settings.labelObs.filter(a => a.name !== action.obsName)
452
+ });
453
+ }
454
+ case "reset.label.obs":
455
+ {
456
+ return _objectSpread(_objectSpread({}, settings), {}, {
457
+ labelObs: []
458
+ });
459
+ }
460
+ case "set.varSort":
461
+ {
462
+ return _objectSpread(_objectSpread({}, settings), {}, {
463
+ varSort: _objectSpread(_objectSpread({}, settings.varSort), {}, {
464
+ [action.var]: {
465
+ sort: action.sort,
466
+ sortOrder: action.sortOrder
467
+ }
468
+ })
469
+ });
470
+ }
471
+ case "set.varSort.sort":
472
+ {
473
+ return _objectSpread(_objectSpread({}, settings), {}, {
474
+ varSort: _objectSpread(_objectSpread({}, settings.varSort), {}, {
475
+ [action.var]: _objectSpread(_objectSpread({}, settings.varSort[action.var]), {}, {
476
+ sort: action.sort
477
+ })
478
+ })
479
+ });
480
+ }
481
+ case "set.varSort.sortOrder":
482
+ {
483
+ return _objectSpread(_objectSpread({}, settings), {}, {
484
+ varSort: _objectSpread(_objectSpread({}, settings.varSort), {}, {
485
+ [action.var]: _objectSpread(_objectSpread({}, settings.varSort[action.var]), {}, {
486
+ sortOrder: action.sortOrder
487
+ })
488
+ })
489
+ });
490
+ }
491
+ case "set.polygons":
492
+ {
493
+ return _objectSpread(_objectSpread({}, settings), {}, {
494
+ polygons: _objectSpread(_objectSpread({}, settings.polygons), {}, {
495
+ [action.obsm]: action.polygons
496
+ })
497
+ });
498
+ }
499
+ case "set.pseudospatial.maskSet":
500
+ {
501
+ return _objectSpread(_objectSpread({}, settings), {}, {
502
+ pseudospatial: _objectSpread(_objectSpread({}, settings.pseudospatial), {}, {
503
+ maskSet: action.maskSet
504
+ })
505
+ });
506
+ }
507
+ case "set.pseudospatial.maskValues":
508
+ {
509
+ return _objectSpread(_objectSpread({}, settings), {}, {
510
+ pseudospatial: _objectSpread(_objectSpread({}, settings.pseudospatial), {}, {
511
+ maskValues: action.maskValues
512
+ })
513
+ });
514
+ }
515
+ case "set.pseudospatial.categoricalMode":
516
+ {
517
+ return _objectSpread(_objectSpread({}, settings), {}, {
518
+ pseudospatial: _objectSpread(_objectSpread({}, settings.pseudospatial), {}, {
519
+ categoricalMode: action.categoricalMode
520
+ })
521
+ });
522
+ }
523
+ default:
524
+ {
525
+ throw Error("Unknown action: " + action.type);
526
+ }
527
+ }
528
+ }
@@ -1,11 +1,11 @@
1
1
  import { useCallback } from "react";
2
2
  import { COLORSCALES } from "../constants/colorscales";
3
- import { useDataset } from "../context/DatasetContext";
3
+ import { useSettings } from "../context/SettingsContext";
4
4
  const GRAY = [214, 212, 212];
5
5
  const parseHexColor = color => {
6
- const r = parseInt(color?.substring(1, 3), 16);
7
- const g = parseInt(color?.substring(3, 5), 16);
8
- const b = parseInt(color?.substring(5, 7), 16);
6
+ const r = parseInt(color === null || color === void 0 ? void 0 : color.substring(1, 3), 16);
7
+ const g = parseInt(color === null || color === void 0 ? void 0 : color.substring(3, 5), 16);
8
+ const b = parseInt(color === null || color === void 0 ? void 0 : color.substring(5, 7), 16);
9
9
  return [r, g, b];
10
10
  };
11
11
  const interpolateColor = (color1, color2, factor) => {
@@ -34,7 +34,7 @@ export const rgbToHex = color => {
34
34
  return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
35
35
  };
36
36
  export const useColor = () => {
37
- const dataset = useDataset();
37
+ const settings = useSettings();
38
38
  const getColor = useCallback(_ref => {
39
39
  let {
40
40
  value,
@@ -44,10 +44,10 @@ export const useColor = () => {
44
44
  alpha = 0.75,
45
45
  gray = 0.95
46
46
  } = {},
47
- colorEncoding = dataset.colorEncoding,
47
+ colorEncoding = settings.colorEncoding,
48
48
  colorscale = null
49
49
  } = _ref;
50
- const colormap = colorscale || COLORSCALES[categorical ? "Accent" : dataset.controls.colorScale];
50
+ const colormap = colorscale || COLORSCALES[categorical ? "Accent" : settings.controls.colorScale];
51
51
  if (colorEncoding) {
52
52
  if (grayOut) {
53
53
  // Mix color with gray manually instead of chroma.mix to get better performance with deck.gl
@@ -59,7 +59,7 @@ export const useColor = () => {
59
59
  } else {
60
60
  return null;
61
61
  }
62
- }, [dataset.colorEncoding, dataset.controls.colorScale]);
62
+ }, [settings.colorEncoding, settings.controls.colorScale]);
63
63
  return {
64
64
  getColor
65
65
  };
@@ -1,3 +1,8 @@
1
+ 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; }
2
+ 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; }
3
+ 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; }
4
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
+ 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); }
1
6
  import { useCallback } from "react";
2
7
  import { useQueries, useQuery } from "@tanstack/react-query";
3
8
  import { ArrayNotFoundError, GroupNotFoundError, openArray } from "zarr";
@@ -9,7 +14,7 @@ export const GET_OPTIONS = {
9
14
  progress,
10
15
  queueSize
11
16
  } = _ref;
12
- console.debug(`${progress / queueSize * 100}% complete.`);
17
+ console.debug("".concat(progress / queueSize * 100, "% complete."));
13
18
  } // callback executed after each request
14
19
  };
15
20
  export class ZarrHelper {
@@ -38,27 +43,26 @@ const fetchDataFromZarr = async (url, path, s, opts) => {
38
43
  export const useZarr = function (_ref2) {
39
44
  let {
40
45
  url,
41
- path
46
+ path,
47
+ s = null
42
48
  } = _ref2;
43
- let s = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
44
- let options = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : GET_OPTIONS;
45
- let opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
49
+ let options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : GET_OPTIONS;
50
+ let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
46
51
  const {
47
52
  data = null,
48
53
  isLoading: isPending = false,
49
54
  error: serverError = null
50
- } = useQuery({
55
+ } = useQuery(_objectSpread({
51
56
  queryKey: ["zarr", url, path, s],
52
57
  queryFn: () => fetchDataFromZarr(url, path, s, options),
53
58
  retry: (failureCount, _ref3) => {
54
59
  let {
55
60
  error
56
61
  } = _ref3;
57
- if ([400, 401, 403, 404, 422].includes(error?.status)) return false;
62
+ if ([400, 401, 403, 404, 422].includes(error === null || error === void 0 ? void 0 : error.status)) return false;
58
63
  return failureCount < 3;
59
- },
60
- ...opts
61
- });
64
+ }
65
+ }, opts));
62
66
  return {
63
67
  data,
64
68
  isPending,
@@ -69,7 +73,7 @@ const aggregateData = (inputs, data) => {
69
73
  const dataObject = {};
70
74
  inputs.forEach((input, index) => {
71
75
  const key = input.key;
72
- dataObject[key] = data?.[index];
76
+ dataObject[key] = data === null || data === void 0 ? void 0 : data[index];
73
77
  });
74
78
  return dataObject;
75
79
  };
@@ -89,18 +93,17 @@ export const useMultipleZarr = function (inputs) {
89
93
  isLoading: isPending = false,
90
94
  serverError = null
91
95
  } = useQueries({
92
- queries: inputs.map(input => ({
96
+ queries: inputs.map(input => _objectSpread({
93
97
  queryKey: ["zarr", input.url, input.path, input.s],
94
98
  queryFn: () => fetchDataFromZarr(input.url, input.path, input.s, options),
95
99
  retry: (failureCount, _ref4) => {
96
100
  let {
97
101
  error
98
102
  } = _ref4;
99
- if ([400, 401, 403, 404, 422].includes(error?.status)) return false;
103
+ if ([400, 401, 403, 404, 422].includes(error === null || error === void 0 ? void 0 : error.status)) return false;
100
104
  return failureCount < 3;
101
- },
102
- ...opts
103
- })),
105
+ }
106
+ }, opts)),
104
107
  combine
105
108
  });
106
109
  return {