@haniffalab/cherita-react 0.2.0-dev.2024-12-16.f02cfae4 → 0.2.0-dev.2024-12-16.6be54149

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.
@@ -11,7 +11,6 @@ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
11
11
  var _reactFontawesome = require("@fortawesome/react-fontawesome");
12
12
  var _editModes = require("@nebula.gl/edit-modes");
13
13
  var _layers2 = require("@nebula.gl/layers");
14
- var _turf = require("@turf/turf");
15
14
  var _lodash = _interopRequireDefault(require("lodash"));
16
15
  var _reactBootstrap = require("react-bootstrap");
17
16
  var _SpatialControls = require("./SpatialControls");
@@ -19,6 +18,7 @@ var _Toolbox = require("./Toolbox");
19
18
  var _constants = require("../../constants/constants");
20
19
  var _DatasetContext = require("../../context/DatasetContext");
21
20
  var _FilterContext = require("../../context/FilterContext");
21
+ var _ZarrDataContext = require("../../context/ZarrDataContext");
22
22
  var _colorHelper = require("../../helpers/color-helper");
23
23
  var _mapHelper = require("../../helpers/map-helper");
24
24
  var _Legend = require("../../utils/Legend");
@@ -38,14 +38,18 @@ const INITIAL_VIEW_STATE = {
38
38
  pitch: 0,
39
39
  bearing: 0
40
40
  };
41
- const EPSILON = 1e-6;
42
41
  function Scatterplot(_ref) {
43
42
  let {
44
43
  radius = 30
45
44
  } = _ref;
46
45
  const dataset = (0, _DatasetContext.useDataset)();
46
+ const {
47
+ obsIndices,
48
+ valueMin,
49
+ valueMax,
50
+ slicedLength
51
+ } = (0, _FilterContext.useFilteredData)();
47
52
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
48
- const filterDispatch = (0, _FilterContext.useFilteredDataDispatch)();
49
53
  const {
50
54
  getColor
51
55
  } = (0, _colorHelper.useColor)();
@@ -63,12 +67,14 @@ function Scatterplot(_ref) {
63
67
  const [mode, setMode] = (0, _react.useState)(() => _editModes.ViewMode);
64
68
  const [features, setFeatures] = (0, _react.useState)({
65
69
  type: "FeatureCollection",
66
- features: []
70
+ features: dataset.polygons[dataset.selectedObsm] || []
67
71
  });
68
72
  const [selectedFeatureIndexes, setSelectedFeatureIndexes] = (0, _react.useState)([]);
69
- const obsmData = (0, _zarrData.useObsmData)();
70
- const xData = (0, _zarrData.useXData)();
71
- const obsData = (0, _zarrData.useObsData)();
73
+ const {
74
+ obsmData,
75
+ xData,
76
+ obsData
77
+ } = (0, _ZarrDataContext.useZarrData)();
72
78
  const labelObsData = (0, _zarrData.useLabelObsData)();
73
79
  // @TODO: assert length of obsmData, xData, obsData is equal
74
80
 
@@ -187,101 +193,6 @@ function Scatterplot(_ref) {
187
193
  return false;
188
194
  }
189
195
  }, [dataset.colorEncoding, dataset.selectedObs?.type]);
190
- const isInBins = (v, binEdges, indices) => {
191
- const lastEdge = _lodash.default.last(binEdges);
192
- const allButLastEdges = _lodash.default.initial(binEdges);
193
- // add epsilon to last edge to include the last value
194
- const modifiedBinEdges = [...allButLastEdges, [lastEdge[0], lastEdge[1] + EPSILON]];
195
- const binIndices = _lodash.default.difference(_lodash.default.range(binEdges.length), indices);
196
- const ranges = _lodash.default.at(modifiedBinEdges, binIndices);
197
- return _lodash.default.some(ranges, range => _lodash.default.inRange(v, ...range));
198
- };
199
- const isInSlice = (0, _react.useCallback)((index, values, positions) => {
200
- let inSlice = true;
201
- if (isCategorical && values) {
202
- inSlice &= !_lodash.default.includes(dataset.selectedObs?.omit, values[index]);
203
- } else if ((dataset.sliceBy.obs || dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && dataset.selectedObs?.type === _constants.OBS_TYPES.CONTINUOUS) && !!dataset.selectedObs?.omit.length && values) {
204
- if (dataset.selectedObs.type === _constants.OBS_TYPES.CATEGORICAL) {
205
- inSlice &= !_lodash.default.includes(dataset.selectedObs.omit, values[index]);
206
- } else if (dataset.selectedObs.type === _constants.OBS_TYPES.CONTINUOUS) {
207
- if (isNaN(values[index])) {
208
- inSlice &= !_lodash.default.includes(dataset.selectedObs.omit, -1);
209
- } else {
210
- inSlice &= isInBins(values[index], dataset.selectedObs.bins.binEdges, _lodash.default.without(dataset.selectedObs.omit, -1));
211
- }
212
- }
213
- }
214
- if (dataset.sliceBy.polygons && positions) {
215
- inSlice &= _lodash.default.some(features?.features, (_f, i) => {
216
- return (0, _turf.booleanPointInPolygon)((0, _turf.point)([positions[index][0], positions[index][1]]), features.features[i]);
217
- });
218
- }
219
- return inSlice;
220
- }, [dataset.colorEncoding, dataset.selectedObs?.bins?.binEdges, dataset.selectedObs?.omit, dataset.selectedObs?.type, dataset.sliceBy.obs, dataset.sliceBy.polygons, features.features, isCategorical]);
221
-
222
- // @TODO: abstract filtering out of this component, maybe in FilterContext ?
223
- const {
224
- filteredIndices,
225
- valueMin,
226
- valueMax,
227
- slicedLength
228
- } = (0, _react.useMemo)(() => {
229
- if (dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR) {
230
- const {
231
- filtered,
232
- filteredIndices
233
- } = _lodash.default.reduce(data.values, (acc, v, i) => {
234
- if (isInSlice(i, data.sliceValues, data.positions)) {
235
- acc.filtered.push(v);
236
- acc.filteredIndices.add(i);
237
- }
238
- return acc;
239
- }, {
240
- filtered: [],
241
- filteredIndices: new Set()
242
- });
243
- return {
244
- filteredIndices: filteredIndices,
245
- valueMin: _lodash.default.min(filtered),
246
- valueMax: _lodash.default.max(filtered),
247
- slicedLength: filtered.length
248
- };
249
- } else if (dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS) {
250
- const isContinuous = dataset.selectedObs?.type === _constants.OBS_TYPES.CONTINUOUS;
251
- const {
252
- filtered,
253
- filteredIndices
254
- } = _lodash.default.reduce(data.values, (acc, v, i) => {
255
- if (isInSlice(i, data.values, data.positions)) {
256
- acc.filtered.push(v);
257
- acc.filteredIndices.add(i);
258
- }
259
- return acc;
260
- }, {
261
- filtered: [],
262
- filteredIndices: new Set()
263
- });
264
- return {
265
- filteredIndices: filteredIndices,
266
- valueMin: _lodash.default.min(isContinuous ? filtered : data.values),
267
- valueMax: _lodash.default.max(isContinuous ? filtered : data.values),
268
- slicedLength: filtered.length
269
- };
270
- } else {
271
- return {
272
- filteredIndices: null,
273
- valueMin: _lodash.default.min(data.values),
274
- valueMax: _lodash.default.max(data.values),
275
- slicedLength: data.values.length
276
- };
277
- }
278
- }, [data.positions, data.sliceValues, data.values, dataset.colorEncoding, dataset.selectedObs?.type, isInSlice]);
279
- (0, _react.useEffect)(() => {
280
- filterDispatch({
281
- type: "set.obs.indices",
282
- indices: dataset.sliceBy.obs || dataset.sliceBy.polygons ? filteredIndices : null
283
- });
284
- }, [dataset.sliceBy.obs, dataset.sliceBy.polygons, filterDispatch, filteredIndices]);
285
196
  (0, _react.useEffect)(() => {
286
197
  dispatch({
287
198
  type: "set.controls.valueRange",
@@ -299,22 +210,22 @@ function Scatterplot(_ref) {
299
210
  let {
300
211
  index
301
212
  } = _ref2;
302
- const grayOut = filteredIndices && !filteredIndices.has(index);
213
+ const grayOut = obsIndices && !obsIndices.has(index);
303
214
  return getColor({
304
215
  value: (data.values[index] - min) / (max - min),
305
216
  categorical: isCategorical,
306
217
  grayOut: grayOut
307
218
  });
308
- }, [data.values, filteredIndices, getColor, isCategorical, max, min]);
219
+ }, [data.values, obsIndices, getColor, isCategorical, max, min]);
309
220
 
310
221
  // @TODO: add support for pseudospatial hover to reflect in radius
311
222
  const getRadius = (0, _react.useCallback)((_d, _ref3) => {
312
223
  let {
313
224
  index
314
225
  } = _ref3;
315
- const grayOut = filteredIndices && !filteredIndices.has(index);
226
+ const grayOut = obsIndices && !obsIndices.has(index);
316
227
  return grayOut ? 1 : 3;
317
- }, [filteredIndices]);
228
+ }, [obsIndices]);
318
229
  const memoizedLayers = (0, _react.useMemo)(() => {
319
230
  return [new _layers.ScatterplotLayer({
320
231
  id: "cherita-layer-scatterplot",
@@ -373,6 +284,13 @@ function Scatterplot(_ref) {
373
284
  });
374
285
  }
375
286
  }, [dispatch, features?.features?.length]);
287
+ (0, _react.useEffect)(() => {
288
+ dispatch({
289
+ type: "set.polygons",
290
+ obsm: dataset.selectedObsm,
291
+ polygons: features?.features || []
292
+ });
293
+ }, [dataset.selectedObsm, dispatch, features.features]);
376
294
  function onLayerClick(info) {
377
295
  if (mode !== _editModes.ViewMode) {
378
296
  // don't change selection while editing
@@ -393,7 +311,7 @@ function Scatterplot(_ref) {
393
311
  object,
394
312
  index
395
313
  } = _ref5;
396
- if (!object) return;
314
+ if (!object || object?.type === "Feature") return;
397
315
  const text = [];
398
316
  if (dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && dataset.selectedObs && !_lodash.default.some(dataset.labelObs, {
399
317
  name: dataset.selectedObs.name
@@ -410,7 +328,7 @@ function Scatterplot(_ref) {
410
328
  }));
411
329
  }
412
330
  if (!text.length) return;
413
- const grayOut = filteredIndices && !filteredIndices.has(index);
331
+ const grayOut = obsIndices && !obsIndices.has(index);
414
332
  return {
415
333
  text: text.length ? _lodash.default.compact(text).join("\n") : null,
416
334
  className: grayOut ? "tooltip-grayout" : "deck-tooltip",
@@ -9,16 +9,13 @@ var _react = _interopRequireWildcard(require("react"));
9
9
  var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
10
10
  var _reactFontawesome = require("@fortawesome/react-fontawesome");
11
11
  var _iconsMaterial = require("@mui/icons-material");
12
- var _xCharts = require("@mui/x-charts");
13
- var _colorPalettes = require("@mui/x-charts/colorPalettes");
14
12
  var _lodash = _interopRequireDefault(require("lodash"));
15
13
  var _reactBootstrap = require("react-bootstrap");
16
14
  var _constants = require("../../constants/constants");
17
15
  var _DatasetContext = require("../../context/DatasetContext");
18
16
  var _FilterContext = require("../../context/FilterContext");
19
- var _LoadingIndicators = require("../../utils/LoadingIndicators");
17
+ var _Histogram = require("../../utils/Histogram");
20
18
  var _requests = require("../../utils/requests");
21
- var _string = require("../../utils/string");
22
19
  var _VirtualizedList = require("../../utils/VirtualizedList");
23
20
  var _jsxRuntime = require("react/jsx-runtime");
24
21
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -30,21 +27,25 @@ function VarHistogram(_ref) {
30
27
  } = _ref;
31
28
  const ENDPOINT = "var/histograms";
32
29
  const dataset = (0, _DatasetContext.useDataset)();
33
- const filteredData = (0, _FilterContext.useFilteredData)();
30
+ const {
31
+ obsIndices
32
+ } = (0, _FilterContext.useFilteredData)();
33
+ // @TODO: consider using Filter's isSliced; would trigger more re-renders/requests
34
+ // const { obsIndices, isSliced } = useFilteredData();
34
35
  const isSliced = dataset.sliceBy.obs || dataset.sliceBy.polygons;
35
36
  const [params, setParams] = (0, _react.useState)({
36
37
  url: dataset.url,
37
38
  varKey: item.matrix_index,
38
- obsIndices: isSliced && Array.from(filteredData.obsIndices || [])
39
+ obsIndices: isSliced ? [...(obsIndices || [])] : null
39
40
  });
40
41
  (0, _react.useEffect)(() => {
41
42
  setParams(p => {
42
43
  return {
43
44
  ...p,
44
- obsIndices: isSliced && Array.from(filteredData.obsIndices || [])
45
+ obsIndices: isSliced ? [...(obsIndices || [])] : null
45
46
  };
46
47
  });
47
- }, [filteredData.obsIndices, isSliced]);
48
+ }, [obsIndices, isSliced]);
48
49
  const {
49
50
  fetchedData,
50
51
  isPending,
@@ -52,39 +53,10 @@ function VarHistogram(_ref) {
52
53
  } = (0, _requests.useDebouncedFetch)(ENDPOINT, params, {
53
54
  refetchOnMount: false
54
55
  });
55
- return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
56
- className: "feature-histogram-container",
57
- children: isPending ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingLinear, {}) : !serverError && fetchedData ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
58
- className: "feature-histogram m-1",
59
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_xCharts.SparkLineChart, {
60
- plotType: "bar",
61
- data: fetchedData.log10,
62
- margin: {
63
- top: 0,
64
- right: 0,
65
- bottom: 0,
66
- left: 0
67
- },
68
- colors: isSliced ? _colorPalettes.mangoFusionPalette : _colorPalettes.blueberryTwilightPalette,
69
- showHighlight: true,
70
- showTooltip: true,
71
- valueFormatter: (v, _ref2) => {
72
- let {
73
- dataIndex
74
- } = _ref2;
75
- return `${(0, _string.formatNumerical)(fetchedData.hist[dataIndex])}`;
76
- },
77
- xAxis: {
78
- data: _lodash.default.range(fetchedData.bin_edges?.length) || null,
79
- valueFormatter: v => `Bin [${(0, _string.formatNumerical)(fetchedData.bin_edges[v][0], _string.FORMATS.EXPONENTIAL)}, ${(0, _string.formatNumerical)(fetchedData.bin_edges[v][1], _string.FORMATS.EXPONENTIAL)}${v === fetchedData.bin_edges.length - 1 ? "]" : ")"}`
80
- },
81
- slotProps: {
82
- popper: {
83
- className: "feature-histogram-tooltip"
84
- }
85
- }
86
- })
87
- }) : null
56
+ return !serverError && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Histogram.Histogram, {
57
+ data: fetchedData,
58
+ isPending: isPending,
59
+ altColor: isSliced
88
60
  });
89
61
  }
90
62
  function VarDiseaseInfoItem(item) {
@@ -134,10 +106,10 @@ function VarDiseaseInfoItem(item) {
134
106
  })
135
107
  }, item.disease_name);
136
108
  }
137
- function VarDiseaseInfo(_ref3) {
109
+ function VarDiseaseInfo(_ref2) {
138
110
  let {
139
111
  data
140
- } = _ref3;
112
+ } = _ref2;
141
113
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
142
114
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup, {
143
115
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_VirtualizedList.VirtualizedList, {
@@ -150,7 +122,7 @@ function VarDiseaseInfo(_ref3) {
150
122
  })
151
123
  });
152
124
  }
153
- function SingleSelectionItem(_ref4) {
125
+ function SingleSelectionItem(_ref3) {
154
126
  let {
155
127
  item,
156
128
  isActive,
@@ -159,7 +131,7 @@ function SingleSelectionItem(_ref4) {
159
131
  isDiseaseGene = false,
160
132
  showSetColorEncoding = true,
161
133
  showRemove = true
162
- } = _ref4;
134
+ } = _ref3;
163
135
  const ENDPOINT = "disease/gene";
164
136
  const [openInfo, setOpenInfo] = (0, _react.useState)(false);
165
137
  const dataset = (0, _DatasetContext.useDataset)();
@@ -172,7 +144,9 @@ function SingleSelectionItem(_ref4) {
172
144
  fetchedData,
173
145
  isPending,
174
146
  serverError
175
- } = (0, _requests.useFetch)(ENDPOINT, params);
147
+ } = (0, _requests.useFetch)(ENDPOINT, params, {
148
+ refetchOnMount: false
149
+ });
176
150
  const hasDiseaseInfo = !isPending && !serverError && !!fetchedData.length;
177
151
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
178
152
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
@@ -227,12 +201,12 @@ function SingleSelectionItem(_ref4) {
227
201
  })]
228
202
  });
229
203
  }
230
- function MultipleSelectionItem(_ref5) {
204
+ function MultipleSelectionItem(_ref4) {
231
205
  let {
232
206
  item,
233
207
  isActive,
234
208
  toggleVar
235
- } = _ref5;
209
+ } = _ref4;
236
210
  const isNotInData = item.matrix_index === -1;
237
211
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
238
212
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
@@ -252,14 +226,14 @@ function MultipleSelectionItem(_ref5) {
252
226
  })
253
227
  });
254
228
  }
255
- function VarItem(_ref6) {
229
+ function VarItem(_ref5) {
256
230
  let {
257
231
  item,
258
232
  active,
259
233
  setVarButtons,
260
234
  mode = _constants.SELECTION_MODES.SINGLE,
261
235
  isDiseaseGene = false
262
- } = _ref6;
236
+ } = _ref5;
263
237
  const dataset = (0, _DatasetContext.useDataset)();
264
238
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
265
239
  const selectVar = () => {
@@ -30,6 +30,7 @@ const useVarMean = function (varKeys) {
30
30
  name: v.name,
31
31
  indices: v.vars.map(v => v.index)
32
32
  } : v.index),
33
+ // obsIndices:
33
34
  varNamesCol: dataset.varNamesCol
34
35
  });
35
36
  (0, _react.useEffect)(() => {
@@ -44,7 +45,8 @@ const useVarMean = function (varKeys) {
44
45
  });
45
46
  }, [varKeys]);
46
47
  return (0, _requests.useFetch)(ENDPOINT, params, {
47
- enabled: enabled
48
+ enabled: enabled,
49
+ refetchOnMount: false
48
50
  });
49
51
  };
50
52
 
@@ -74,7 +76,8 @@ function DiseaseVarList(_ref) {
74
76
  });
75
77
  }, [dataset.selectedDisease]);
76
78
  const diseaseData = (0, _requests.useFetch)(ENDPOINT, params, {
77
- enabled: !!params.diseaseId
79
+ enabled: !!params.diseaseId,
80
+ refetchOnMount: false
78
81
  });
79
82
  (0, _react.useEffect)(() => {
80
83
  if (!diseaseData.isPending && !diseaseData.serverError) {
@@ -12,6 +12,7 @@ var _reactBootstrap = require("react-bootstrap");
12
12
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
13
13
  var _constants = require("../../constants/constants");
14
14
  var _DatasetContext = require("../../context/DatasetContext");
15
+ var _FilterContext = require("../../context/FilterContext");
15
16
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
16
17
  var _requests = require("../../utils/requests");
17
18
  var _jsxRuntime = require("react/jsx-runtime");
@@ -24,6 +25,10 @@ function Violin(_ref) {
24
25
  } = _ref;
25
26
  const ENDPOINT = "violin";
26
27
  const dataset = (0, _DatasetContext.useDataset)();
28
+ const {
29
+ obsIndices,
30
+ isSliced
31
+ } = (0, _FilterContext.useFilteredData)();
27
32
  const [data, setData] = (0, _react.useState)([]);
28
33
  const [layout, setLayout] = (0, _react.useState)({});
29
34
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
@@ -46,7 +51,8 @@ function Violin(_ref) {
46
51
  indices: dataset.selectedVar?.vars.map(v => v.index)
47
52
  } : dataset.selectedVar?.index,
48
53
  obsCol: dataset.selectedObs,
49
- obsValues: !dataset.selectedObs?.omit.length ? null : _lodash.default.difference(_lodash.default.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c])
54
+ obsValues: !dataset.selectedObs?.omit.length ? null : _lodash.default.difference(_lodash.default.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c]),
55
+ obsIndices: isSliced ? [...(obsIndices || [])] : null
50
56
  }
51
57
  }[mode]
52
58
  });
@@ -89,12 +95,13 @@ function Violin(_ref) {
89
95
  } : dataset.selectedVar?.index,
90
96
  obsCol: dataset.selectedObs,
91
97
  obsValues: !dataset.selectedObs?.omit.length ? null : _lodash.default.difference(_lodash.default.values(dataset.selectedObs?.codes), dataset.selectedObs?.omit).map(c => dataset.selectedObs?.codesMap[c]),
98
+ obsIndices: isSliced ? [...(obsIndices || [])] : null,
92
99
  scale: dataset.controls.scale.violinplot.value,
93
100
  varNamesCol: dataset.varNamesCol
94
101
  };
95
102
  });
96
103
  }
97
- }, [dataset.controls.scale.violinplot.value, dataset.selectedMultiVar, dataset.selectedObs, dataset.selectedVar, dataset.url, dataset.varNamesCol, mode]);
104
+ }, [dataset.controls.scale.violinplot.value, dataset.selectedMultiVar, dataset.selectedObs, dataset.selectedVar, dataset.url, dataset.varNamesCol, obsIndices, isSliced, mode]);
98
105
  const {
99
106
  fetchedData,
100
107
  isPending,
@@ -13,6 +13,7 @@ var _reactQuery = require("@tanstack/react-query");
13
13
  var _reactQueryPersistClient = require("@tanstack/react-query-persist-client");
14
14
  var _lodash = _interopRequireDefault(require("lodash"));
15
15
  var _FilterContext = require("./FilterContext");
16
+ var _ZarrDataContext = require("./ZarrDataContext");
16
17
  var _constants = require("../constants/constants");
17
18
  var _jsxRuntime = require("react/jsx-runtime");
18
19
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -103,7 +104,8 @@ const initialDataset = {
103
104
  maskSet: null,
104
105
  maskValues: null,
105
106
  categoricalMode: _constants.PSEUDOSPATIAL_CATEGORICAL_MODES.ACROSS.value
106
- }
107
+ },
108
+ polygons: {}
107
109
  };
108
110
  const initializer = initialState => {
109
111
  const localObj = (JSON.parse(localStorage.getItem(_constants.LOCAL_STORAGE_KEY)) || {})[initialState.url] || {};
@@ -144,7 +146,9 @@ function DatasetProvider(_ref2) {
144
146
  client: queryClient,
145
147
  persistOptions: persistOptions,
146
148
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FilterContext.FilterProvider, {
147
- children: children
149
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ZarrDataContext.ZarrDataProvider, {
150
+ children: children
151
+ })
148
152
  })
149
153
  })
150
154
  })
@@ -535,6 +539,16 @@ function datasetReducer(dataset, action) {
535
539
  }
536
540
  };
537
541
  }
542
+ case "set.polygons":
543
+ {
544
+ return {
545
+ ...dataset,
546
+ polygons: {
547
+ ...dataset.polygons,
548
+ [action.obsm]: action.polygons
549
+ }
550
+ };
551
+ }
538
552
  case "set.pseudospatial.maskSet":
539
553
  {
540
554
  return {
@@ -14,9 +14,11 @@ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e;
14
14
  const FilteredDataContext = exports.FilteredDataContext = /*#__PURE__*/(0, _react.createContext)(null);
15
15
  const FilteredDataDispatchContext = exports.FilteredDataDispatchContext = /*#__PURE__*/(0, _react.createContext)(null);
16
16
  const initialFilterData = {
17
- obsIndices: [],
18
- // @TODO: split to byObs and byPolygons ?
19
- varIndices: []
17
+ obsIndices: null,
18
+ valueMin: null,
19
+ valueMax: null,
20
+ slicedLength: null,
21
+ isSliced: false
20
22
  };
21
23
  function FilterProvider(_ref) {
22
24
  let {
@@ -45,28 +47,11 @@ function filterReducer(filteredData, action) {
45
47
  {
46
48
  return {
47
49
  ...filteredData,
48
- obsIndices: action.indices
49
- };
50
- }
51
- case "reset.obs.indices":
52
- {
53
- return {
54
- ...filteredData,
55
- obsIndices: []
56
- };
57
- }
58
- case "set.var.indices":
59
- {
60
- return {
61
- ...filteredData,
62
- varIndices: action.indices
63
- };
64
- }
65
- case "reset.var.indices":
66
- {
67
- return {
68
- ...filteredData,
69
- varIndices: []
50
+ obsIndices: action.indices,
51
+ valueMin: action.valueMin,
52
+ valueMax: action.valueMax,
53
+ slicedLength: action.slicedLength,
54
+ isSliced: action.isSliced
70
55
  };
71
56
  }
72
57
  default:
@@ -0,0 +1,37 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ZarrDataProvider = ZarrDataProvider;
7
+ exports.useZarrData = useZarrData;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _Filter = require("../utils/Filter");
10
+ var _zarrData = require("../utils/zarrData");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ 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); }
13
+ 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; }
14
+ const ZarrDataContext = /*#__PURE__*/(0, _react.createContext)(null);
15
+ function ZarrDataProvider(_ref) {
16
+ let {
17
+ children
18
+ } = _ref;
19
+ const obsmData = (0, _zarrData.useObsmData)();
20
+ const obsData = (0, _zarrData.useObsData)();
21
+ const xData = (0, _zarrData.useXData)();
22
+ const data = {
23
+ obsmData: obsmData,
24
+ obsData: obsData,
25
+ xData: xData,
26
+ isPending: obsmData.isPending || obsData.isPending || xData.isPending,
27
+ serverError: obsmData.serverError || obsData.serverError || xData.serverError
28
+ };
29
+ (0, _Filter.useFilter)(data);
30
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(ZarrDataContext.Provider, {
31
+ value: data,
32
+ children: children
33
+ });
34
+ }
35
+ function useZarrData() {
36
+ return (0, _react.useContext)(ZarrDataContext);
37
+ }
@@ -11964,6 +11964,10 @@ textarea.form-control-lg {
11964
11964
  background-color: #cce3ed;
11965
11965
  }
11966
11966
 
11967
+ .obs-item {
11968
+ box-sizing: border-box;
11969
+ }
11970
+
11967
11971
  .obs-value-list-check {
11968
11972
  padding-right: 1rem;
11969
11973
  word-break: auto-phrase;
@@ -12094,6 +12098,7 @@ textarea.form-control-lg {
12094
12098
 
12095
12099
  .cherita-app-plot {
12096
12100
  position: relative;
12101
+ max-height: 100%;
12097
12102
  }
12098
12103
 
12099
12104
  .cherita-app-obs {