@haniffalab/cherita-react 1.3.0-dev.2025-06-04.bee6fd81 → 1.3.0-dev.2025-06-04.6573608f

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.
@@ -44,7 +44,7 @@ const INITIAL_VIEW_STATE = {
44
44
  function Scatterplot(_ref) {
45
45
  var _settings$selectedObs3, _features$features2, _obsmData$serverError, _xData$serverError, _obsData$serverError, _labelObsData$serverE, _settings$selectedVar, _settings$selectedObs4, _obsmData$data;
46
46
  let {
47
- radius = 30,
47
+ radius = null,
48
48
  setShowObs,
49
49
  setShowVars,
50
50
  isFullscreen = false
@@ -69,6 +69,7 @@ function Scatterplot(_ref) {
69
69
  values: [],
70
70
  sliceValues: []
71
71
  });
72
+ const [radiusScale, setRadiusScale] = (0, _react.useState)(radius || 1);
72
73
 
73
74
  // EditableGeoJsonLayer
74
75
  const [mode, setMode] = (0, _react.useState)(() => _editModes.ViewMode);
@@ -85,6 +86,15 @@ function Scatterplot(_ref) {
85
86
  const labelObsData = (0, _zarrData.useLabelObsData)();
86
87
  // @TODO: assert length of obsmData, xData, obsData is equal
87
88
 
89
+ const getRadiusScale = (0, _react.useCallback)(bounds => {
90
+ if (!!radius) return radius;
91
+ // From 28 degrees ~= 30km -> 30m radius
92
+ const lonDim = bounds[1][0] - bounds[0][0];
93
+ const latDim = bounds[1][1] - bounds[0][1];
94
+ const minDim = Math.min(lonDim, latDim);
95
+ const rs = 0.01 / minDim * 111111;
96
+ return rs;
97
+ }, [radius]);
88
98
  (0, _react.useEffect)(() => {
89
99
  if (!obsmData.isPending && !obsmData.serverError) {
90
100
  var _deckRef$current, _deckRef$current2;
@@ -98,11 +108,13 @@ function Scatterplot(_ref) {
98
108
  const {
99
109
  latitude,
100
110
  longitude,
101
- zoom
111
+ zoom,
112
+ bounds
102
113
  } = mapHelper.fitBounds(obsmData.data, {
103
114
  width: deckRef === null || deckRef === void 0 || (_deckRef$current = deckRef.current) === null || _deckRef$current === void 0 || (_deckRef$current = _deckRef$current.deck) === null || _deckRef$current === void 0 ? void 0 : _deckRef$current.width,
104
115
  height: deckRef === null || deckRef === void 0 || (_deckRef$current2 = deckRef.current) === null || _deckRef$current2 === void 0 || (_deckRef$current2 = _deckRef$current2.deck) === null || _deckRef$current2 === void 0 ? void 0 : _deckRef$current2.height
105
116
  });
117
+ setRadiusScale(getRadiusScale(bounds));
106
118
  setViewState(v => {
107
119
  return _objectSpread(_objectSpread({}, v), {}, {
108
120
  longitude: longitude,
@@ -118,7 +130,7 @@ function Scatterplot(_ref) {
118
130
  });
119
131
  });
120
132
  }
121
- }, [settings.selectedObsm, obsmData.data, obsmData.isPending, obsmData.serverError]);
133
+ }, [settings.selectedObsm, getRadiusScale, obsmData.data, obsmData.isPending, obsmData.serverError]);
122
134
  const getBounds = (0, _react.useCallback)(() => {
123
135
  var _deckRef$current3, _deckRef$current4;
124
136
  const {
@@ -232,7 +244,7 @@ function Scatterplot(_ref) {
232
244
  id: "cherita-layer-scatterplot",
233
245
  pickable: true,
234
246
  data: data.positions,
235
- radiusScale: radius,
247
+ radiusScale: radiusScale,
236
248
  radiusMinPixels: 1,
237
249
  getPosition: d => d,
238
250
  getFillColor: getFillColor,
@@ -275,7 +287,7 @@ function Scatterplot(_ref) {
275
287
  }
276
288
  }
277
289
  })];
278
- }, [data.positions, features, getFillColor, getRadius, mode, radius, selectedFeatureIndexes]);
290
+ }, [data.positions, features, getFillColor, getRadius, mode, radiusScale, selectedFeatureIndexes]);
279
291
  const layers = (0, _react.useDeferredValue)(mode === _editModes.ViewMode ? memoizedLayers.reverse() : memoizedLayers); // draw scatterplot on top of polygons when in ViewMode
280
292
 
281
293
  (0, _react.useEffect)(() => {
@@ -19,6 +19,11 @@ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol"
19
19
  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); }
20
20
  const SettingsContext = exports.SettingsContext = /*#__PURE__*/(0, _react.createContext)(null);
21
21
  const SettingsDispatchContext = exports.SettingsDispatchContext = /*#__PURE__*/(0, _react.createContext)(null);
22
+
23
+ // @TODO: consider splitting constant values and dataset-resolved values
24
+ // e.g. store only obs name in selectedObs, and resolved obs data (counts, values, etc.) elsewhere
25
+ // e.g. store only var name in selectedVar, and resolved var data (index, matrix_index) elsewhere
26
+ // would simplify passing and validating defaultSettings and localSettings
22
27
  const initialSettings = {
23
28
  selectedObs: null,
24
29
  selectedVar: null,
@@ -67,13 +72,51 @@ const initialSettings = {
67
72
  categoricalMode: _constants.PSEUDOSPATIAL_CATEGORICAL_MODES.ACROSS.value
68
73
  }
69
74
  };
75
+
76
+ // validate on initialization and reducer
77
+ const validateSettings = settings => {
78
+ // make sure selectedVar is in vars
79
+ if (settings.selectedVar) {
80
+ const inVars = _lodash.default.some(settings.vars, v => v.name === settings.selectedVar.name);
81
+ if (!inVars) {
82
+ settings.vars = [...settings.vars, settings.selectedVar];
83
+ }
84
+ }
85
+
86
+ // make sure selectedMultiVar are in vars
87
+ if (settings.selectedMultiVar) {
88
+ const notInVars = _lodash.default.differenceBy(settings.selectedMultiVar, settings.vars, "name");
89
+ if (notInVars.length) {
90
+ settings.vars = [...settings.vars, ...notInVars];
91
+ }
92
+ }
93
+
94
+ // make sure there's a selectedVar if colorEncoding is VAR
95
+ if (settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR) {
96
+ if (!settings.selectedVar) {
97
+ settings.colorEncoding = null;
98
+ } else if (settings.selectedVar.isSet && !settings.selectedVar.vars.length) {
99
+ settings.selectedVar = null;
100
+ settings.colorEncoding = null;
101
+ }
102
+ }
103
+
104
+ // make sure there's a selectedObs if colorEncoding is OBS
105
+ if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS) {
106
+ if (!settings.selectedObs) {
107
+ settings.colorEncoding = null;
108
+ }
109
+ }
110
+ return settings;
111
+ };
70
112
  const initializer = _ref => {
71
113
  let {
72
114
  canOverrideSettings,
73
115
  defaultSettings,
74
116
  localSettings
75
117
  } = _ref;
76
- return canOverrideSettings ? _lodash.default.assign({}, initialSettings, defaultSettings, localSettings) : _lodash.default.assign({}, initialSettings, defaultSettings);
118
+ const mergedSettings = canOverrideSettings ? _lodash.default.assign({}, initialSettings, defaultSettings, localSettings) : _lodash.default.assign({}, initialSettings, defaultSettings);
119
+ return validateSettings(mergedSettings);
77
120
  };
78
121
  function SettingsProvider(_ref2) {
79
122
  let {
@@ -140,77 +183,65 @@ function settingsReducer(settings, action) {
140
183
  }
141
184
  case "select.var":
142
185
  {
143
- if (settings.vars.find(v => _lodash.default.isEqual(v, action.var))) {
144
- return _objectSpread(_objectSpread({}, settings), {}, {
145
- selectedVar: action.var
146
- });
147
- } else {
148
- return _objectSpread(_objectSpread({}, settings), {}, {
149
- selectedVar: action.var,
150
- vars: [...settings.vars, action.var]
151
- });
152
- }
186
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
187
+ selectedVar: action.var
188
+ }));
153
189
  }
154
190
  case "select.multivar":
155
191
  {
156
- const vars = settings.vars.find(v => _lodash.default.isEqual(v, action.var)) ? settings.vars : [...settings.vars, action.var];
157
- if (settings.selectedMultiVar.find(v => _lodash.default.isEqual(v, action.var))) {
158
- return _objectSpread(_objectSpread({}, settings), {}, {
159
- vars: vars
160
- });
192
+ const inMultiVar = settings.selectedMultiVar.some(v => v.name === action.var.name);
193
+ if (inMultiVar) {
194
+ return validateSettings(_objectSpread({}, settings));
161
195
  } else {
162
- return _objectSpread(_objectSpread({}, settings), {}, {
163
- selectedMultiVar: [...settings.selectedMultiVar, action.var],
164
- vars: vars
165
- });
196
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
197
+ selectedMultiVar: [...settings.selectedMultiVar, action.var]
198
+ }));
166
199
  }
167
200
  }
168
201
  case "deselect.multivar":
169
202
  {
170
- return _objectSpread(_objectSpread({}, settings), {}, {
203
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
171
204
  selectedMultiVar: settings.selectedMultiVar.filter(v => v !== action.var.name)
172
- });
205
+ }));
173
206
  }
174
207
  case "toggle.multivar":
175
208
  {
176
209
  const inMultiVar = settings.selectedMultiVar.some(v => v.name === action.var.name);
177
210
  if (inMultiVar) {
178
- return _objectSpread(_objectSpread({}, settings), {}, {
211
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
179
212
  selectedMultiVar: settings.selectedMultiVar.filter(v => v.name !== action.var.name)
180
- });
213
+ }));
181
214
  } else {
182
- return _objectSpread(_objectSpread({}, settings), {}, {
215
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
183
216
  selectedMultiVar: [...settings.selectedMultiVar, action.var]
184
- });
217
+ }));
185
218
  }
186
219
  }
187
220
  case "set.colorEncoding":
188
221
  {
189
- return _objectSpread(_objectSpread({}, settings), {}, {
222
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
190
223
  colorEncoding: action.value
191
- });
224
+ }));
192
225
  }
193
226
  case "reset.vars":
194
227
  {
195
- return _objectSpread(_objectSpread({}, settings), {}, {
228
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
196
229
  vars: [],
197
230
  selectedVar: null,
198
231
  selectedMultiVar: []
199
- });
232
+ }));
200
233
  }
201
234
  case "reset.multiVar":
202
235
  {
203
- return _objectSpread(_objectSpread({}, settings), {}, {
204
- selectedMultiVar: [],
205
- colorEncoding: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? null : settings.colorEncoding
206
- });
236
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
237
+ selectedMultiVar: []
238
+ }));
207
239
  }
208
240
  case "reset.var":
209
241
  {
210
- return _objectSpread(_objectSpread({}, settings), {}, {
211
- selectedVar: null,
212
- colorEncoding: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? null : settings.colorEncoding
213
- });
242
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
243
+ selectedVar: null
244
+ }));
214
245
  }
215
246
  case "add.var":
216
247
  {
@@ -227,11 +258,11 @@ function settingsReducer(settings, action) {
227
258
  var _settings$selectedVar;
228
259
  const selectedVar = ((_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name) === action.var.name ? null : settings.selectedVar;
229
260
  const selectedMultiVar = settings.selectedMultiVar.filter(v => v.name !== action.var.name);
230
- return _objectSpread(_objectSpread({}, settings), {}, {
261
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
231
262
  vars: settings.vars.filter(a => a.name !== action.var.name),
232
263
  selectedVar: selectedVar,
233
264
  selectedMultiVar: selectedMultiVar
234
- });
265
+ }));
235
266
  }
236
267
  case "add.varSet.var":
237
268
  {
@@ -265,11 +296,11 @@ function settingsReducer(settings, action) {
265
296
  return v;
266
297
  }
267
298
  });
268
- return _objectSpread(_objectSpread({}, settings), {}, {
299
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
269
300
  vars: vars,
270
301
  selectedVar: selectedVar,
271
302
  selectedMultiVar: selectedMultiVar
272
- });
303
+ }));
273
304
  }
274
305
  }
275
306
  case "remove.varSet.var":
@@ -296,11 +327,11 @@ function settingsReducer(settings, action) {
296
327
  var _settings$selectedVar3;
297
328
  const selectedVar = ((_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.name) === action.varSet.name ? null : settings.selectedVar;
298
329
  const selectedMultiVar = settings.selectedMultiVar.filter(v => v.name !== action.varSet.name);
299
- return _objectSpread(_objectSpread({}, settings), {}, {
330
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
300
331
  vars: vars,
301
332
  selectedVar: selectedVar,
302
333
  selectedMultiVar: selectedMultiVar
303
- });
334
+ }));
304
335
  } else {
305
336
  var _settings$selectedVar4;
306
337
  // Update selected if varSet is selected
@@ -316,11 +347,11 @@ function settingsReducer(settings, action) {
316
347
  return v;
317
348
  }
318
349
  });
319
- return _objectSpread(_objectSpread({}, settings), {}, {
350
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
320
351
  vars: vars,
321
352
  selectedVar: selectedVar,
322
353
  selectedMultiVar: selectedMultiVar
323
- });
354
+ }));
324
355
  }
325
356
  }
326
357
  }
@@ -54,7 +54,8 @@ class MapHelper {
54
54
  return {
55
55
  longitude,
56
56
  latitude,
57
- zoom
57
+ zoom,
58
+ bounds
58
59
  };
59
60
  }
60
61
  }
@@ -36,7 +36,7 @@ const INITIAL_VIEW_STATE = {
36
36
  export function Scatterplot(_ref) {
37
37
  var _settings$selectedObs3, _features$features2, _obsmData$serverError, _xData$serverError, _obsData$serverError, _labelObsData$serverE, _settings$selectedVar, _settings$selectedObs4, _obsmData$data;
38
38
  let {
39
- radius = 30,
39
+ radius = null,
40
40
  setShowObs,
41
41
  setShowVars,
42
42
  isFullscreen = false
@@ -61,6 +61,7 @@ export function Scatterplot(_ref) {
61
61
  values: [],
62
62
  sliceValues: []
63
63
  });
64
+ const [radiusScale, setRadiusScale] = useState(radius || 1);
64
65
 
65
66
  // EditableGeoJsonLayer
66
67
  const [mode, setMode] = useState(() => ViewMode);
@@ -77,6 +78,15 @@ export function Scatterplot(_ref) {
77
78
  const labelObsData = useLabelObsData();
78
79
  // @TODO: assert length of obsmData, xData, obsData is equal
79
80
 
81
+ const getRadiusScale = useCallback(bounds => {
82
+ if (!!radius) return radius;
83
+ // From 28 degrees ~= 30km -> 30m radius
84
+ const lonDim = bounds[1][0] - bounds[0][0];
85
+ const latDim = bounds[1][1] - bounds[0][1];
86
+ const minDim = Math.min(lonDim, latDim);
87
+ const rs = 0.01 / minDim * 111111;
88
+ return rs;
89
+ }, [radius]);
80
90
  useEffect(() => {
81
91
  if (!obsmData.isPending && !obsmData.serverError) {
82
92
  var _deckRef$current, _deckRef$current2;
@@ -90,11 +100,13 @@ export function Scatterplot(_ref) {
90
100
  const {
91
101
  latitude,
92
102
  longitude,
93
- zoom
103
+ zoom,
104
+ bounds
94
105
  } = mapHelper.fitBounds(obsmData.data, {
95
106
  width: deckRef === null || deckRef === void 0 || (_deckRef$current = deckRef.current) === null || _deckRef$current === void 0 || (_deckRef$current = _deckRef$current.deck) === null || _deckRef$current === void 0 ? void 0 : _deckRef$current.width,
96
107
  height: deckRef === null || deckRef === void 0 || (_deckRef$current2 = deckRef.current) === null || _deckRef$current2 === void 0 || (_deckRef$current2 = _deckRef$current2.deck) === null || _deckRef$current2 === void 0 ? void 0 : _deckRef$current2.height
97
108
  });
109
+ setRadiusScale(getRadiusScale(bounds));
98
110
  setViewState(v => {
99
111
  return _objectSpread(_objectSpread({}, v), {}, {
100
112
  longitude: longitude,
@@ -110,7 +122,7 @@ export function Scatterplot(_ref) {
110
122
  });
111
123
  });
112
124
  }
113
- }, [settings.selectedObsm, obsmData.data, obsmData.isPending, obsmData.serverError]);
125
+ }, [settings.selectedObsm, getRadiusScale, obsmData.data, obsmData.isPending, obsmData.serverError]);
114
126
  const getBounds = useCallback(() => {
115
127
  var _deckRef$current3, _deckRef$current4;
116
128
  const {
@@ -224,7 +236,7 @@ export function Scatterplot(_ref) {
224
236
  id: "cherita-layer-scatterplot",
225
237
  pickable: true,
226
238
  data: data.positions,
227
- radiusScale: radius,
239
+ radiusScale: radiusScale,
228
240
  radiusMinPixels: 1,
229
241
  getPosition: d => d,
230
242
  getFillColor: getFillColor,
@@ -267,7 +279,7 @@ export function Scatterplot(_ref) {
267
279
  }
268
280
  }
269
281
  })];
270
- }, [data.positions, features, getFillColor, getRadius, mode, radius, selectedFeatureIndexes]);
282
+ }, [data.positions, features, getFillColor, getRadius, mode, radiusScale, selectedFeatureIndexes]);
271
283
  const layers = useDeferredValue(mode === ViewMode ? memoizedLayers.reverse() : memoizedLayers); // draw scatterplot on top of polygons when in ViewMode
272
284
 
273
285
  useEffect(() => {
@@ -8,6 +8,11 @@ import _ from "lodash";
8
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
9
  export const SettingsContext = /*#__PURE__*/createContext(null);
10
10
  export const SettingsDispatchContext = /*#__PURE__*/createContext(null);
11
+
12
+ // @TODO: consider splitting constant values and dataset-resolved values
13
+ // e.g. store only obs name in selectedObs, and resolved obs data (counts, values, etc.) elsewhere
14
+ // e.g. store only var name in selectedVar, and resolved var data (index, matrix_index) elsewhere
15
+ // would simplify passing and validating defaultSettings and localSettings
11
16
  const initialSettings = {
12
17
  selectedObs: null,
13
18
  selectedVar: null,
@@ -56,13 +61,51 @@ const initialSettings = {
56
61
  categoricalMode: PSEUDOSPATIAL_CATEGORICAL_MODES.ACROSS.value
57
62
  }
58
63
  };
64
+
65
+ // validate on initialization and reducer
66
+ const validateSettings = settings => {
67
+ // make sure selectedVar is in vars
68
+ if (settings.selectedVar) {
69
+ const inVars = _.some(settings.vars, v => v.name === settings.selectedVar.name);
70
+ if (!inVars) {
71
+ settings.vars = [...settings.vars, settings.selectedVar];
72
+ }
73
+ }
74
+
75
+ // make sure selectedMultiVar are in vars
76
+ if (settings.selectedMultiVar) {
77
+ const notInVars = _.differenceBy(settings.selectedMultiVar, settings.vars, "name");
78
+ if (notInVars.length) {
79
+ settings.vars = [...settings.vars, ...notInVars];
80
+ }
81
+ }
82
+
83
+ // make sure there's a selectedVar if colorEncoding is VAR
84
+ if (settings.colorEncoding === COLOR_ENCODINGS.VAR) {
85
+ if (!settings.selectedVar) {
86
+ settings.colorEncoding = null;
87
+ } else if (settings.selectedVar.isSet && !settings.selectedVar.vars.length) {
88
+ settings.selectedVar = null;
89
+ settings.colorEncoding = null;
90
+ }
91
+ }
92
+
93
+ // make sure there's a selectedObs if colorEncoding is OBS
94
+ if (settings.colorEncoding === COLOR_ENCODINGS.OBS) {
95
+ if (!settings.selectedObs) {
96
+ settings.colorEncoding = null;
97
+ }
98
+ }
99
+ return settings;
100
+ };
59
101
  const initializer = _ref => {
60
102
  let {
61
103
  canOverrideSettings,
62
104
  defaultSettings,
63
105
  localSettings
64
106
  } = _ref;
65
- return canOverrideSettings ? _.assign({}, initialSettings, defaultSettings, localSettings) : _.assign({}, initialSettings, defaultSettings);
107
+ const mergedSettings = canOverrideSettings ? _.assign({}, initialSettings, defaultSettings, localSettings) : _.assign({}, initialSettings, defaultSettings);
108
+ return validateSettings(mergedSettings);
66
109
  };
67
110
  export function SettingsProvider(_ref2) {
68
111
  let {
@@ -129,77 +172,65 @@ function settingsReducer(settings, action) {
129
172
  }
130
173
  case "select.var":
131
174
  {
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
- }
175
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
176
+ selectedVar: action.var
177
+ }));
142
178
  }
143
179
  case "select.multivar":
144
180
  {
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
- });
181
+ const inMultiVar = settings.selectedMultiVar.some(v => v.name === action.var.name);
182
+ if (inMultiVar) {
183
+ return validateSettings(_objectSpread({}, settings));
150
184
  } else {
151
- return _objectSpread(_objectSpread({}, settings), {}, {
152
- selectedMultiVar: [...settings.selectedMultiVar, action.var],
153
- vars: vars
154
- });
185
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
186
+ selectedMultiVar: [...settings.selectedMultiVar, action.var]
187
+ }));
155
188
  }
156
189
  }
157
190
  case "deselect.multivar":
158
191
  {
159
- return _objectSpread(_objectSpread({}, settings), {}, {
192
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
160
193
  selectedMultiVar: settings.selectedMultiVar.filter(v => v !== action.var.name)
161
- });
194
+ }));
162
195
  }
163
196
  case "toggle.multivar":
164
197
  {
165
198
  const inMultiVar = settings.selectedMultiVar.some(v => v.name === action.var.name);
166
199
  if (inMultiVar) {
167
- return _objectSpread(_objectSpread({}, settings), {}, {
200
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
168
201
  selectedMultiVar: settings.selectedMultiVar.filter(v => v.name !== action.var.name)
169
- });
202
+ }));
170
203
  } else {
171
- return _objectSpread(_objectSpread({}, settings), {}, {
204
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
172
205
  selectedMultiVar: [...settings.selectedMultiVar, action.var]
173
- });
206
+ }));
174
207
  }
175
208
  }
176
209
  case "set.colorEncoding":
177
210
  {
178
- return _objectSpread(_objectSpread({}, settings), {}, {
211
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
179
212
  colorEncoding: action.value
180
- });
213
+ }));
181
214
  }
182
215
  case "reset.vars":
183
216
  {
184
- return _objectSpread(_objectSpread({}, settings), {}, {
217
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
185
218
  vars: [],
186
219
  selectedVar: null,
187
220
  selectedMultiVar: []
188
- });
221
+ }));
189
222
  }
190
223
  case "reset.multiVar":
191
224
  {
192
- return _objectSpread(_objectSpread({}, settings), {}, {
193
- selectedMultiVar: [],
194
- colorEncoding: settings.colorEncoding === COLOR_ENCODINGS.VAR ? null : settings.colorEncoding
195
- });
225
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
226
+ selectedMultiVar: []
227
+ }));
196
228
  }
197
229
  case "reset.var":
198
230
  {
199
- return _objectSpread(_objectSpread({}, settings), {}, {
200
- selectedVar: null,
201
- colorEncoding: settings.colorEncoding === COLOR_ENCODINGS.VAR ? null : settings.colorEncoding
202
- });
231
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
232
+ selectedVar: null
233
+ }));
203
234
  }
204
235
  case "add.var":
205
236
  {
@@ -216,11 +247,11 @@ function settingsReducer(settings, action) {
216
247
  var _settings$selectedVar;
217
248
  const selectedVar = ((_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name) === action.var.name ? null : settings.selectedVar;
218
249
  const selectedMultiVar = settings.selectedMultiVar.filter(v => v.name !== action.var.name);
219
- return _objectSpread(_objectSpread({}, settings), {}, {
250
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
220
251
  vars: settings.vars.filter(a => a.name !== action.var.name),
221
252
  selectedVar: selectedVar,
222
253
  selectedMultiVar: selectedMultiVar
223
- });
254
+ }));
224
255
  }
225
256
  case "add.varSet.var":
226
257
  {
@@ -254,11 +285,11 @@ function settingsReducer(settings, action) {
254
285
  return v;
255
286
  }
256
287
  });
257
- return _objectSpread(_objectSpread({}, settings), {}, {
288
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
258
289
  vars: vars,
259
290
  selectedVar: selectedVar,
260
291
  selectedMultiVar: selectedMultiVar
261
- });
292
+ }));
262
293
  }
263
294
  }
264
295
  case "remove.varSet.var":
@@ -285,11 +316,11 @@ function settingsReducer(settings, action) {
285
316
  var _settings$selectedVar3;
286
317
  const selectedVar = ((_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.name) === action.varSet.name ? null : settings.selectedVar;
287
318
  const selectedMultiVar = settings.selectedMultiVar.filter(v => v.name !== action.varSet.name);
288
- return _objectSpread(_objectSpread({}, settings), {}, {
319
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
289
320
  vars: vars,
290
321
  selectedVar: selectedVar,
291
322
  selectedMultiVar: selectedMultiVar
292
- });
323
+ }));
293
324
  } else {
294
325
  var _settings$selectedVar4;
295
326
  // Update selected if varSet is selected
@@ -305,11 +336,11 @@ function settingsReducer(settings, action) {
305
336
  return v;
306
337
  }
307
338
  });
308
- return _objectSpread(_objectSpread({}, settings), {}, {
339
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
309
340
  vars: vars,
310
341
  selectedVar: selectedVar,
311
342
  selectedMultiVar: selectedMultiVar
312
- });
343
+ }));
313
344
  }
314
345
  }
315
346
  }
@@ -47,7 +47,8 @@ export class MapHelper {
47
47
  return {
48
48
  longitude,
49
49
  latitude,
50
- zoom
50
+ zoom,
51
+ bounds
51
52
  };
52
53
  }
53
54
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haniffalab/cherita-react",
3
- "version": "1.3.0-dev.2025-06-04.bee6fd81",
3
+ "version": "1.3.0-dev.2025-06-04.6573608f",
4
4
  "author": "Haniffa Lab",
5
5
  "license": "MIT",
6
6
  "keywords": [
@@ -126,5 +126,5 @@
126
126
  "url": "https://github.com/haniffalab/cherita-react/issues"
127
127
  },
128
128
  "homepage": "https://github.com/haniffalab/cherita-react#readme",
129
- "prereleaseSha": "bee6fd816597b2a731ce2565b16db2d9fa63bb06"
129
+ "prereleaseSha": "6573608f6ab26442b5badaea1be8d5dff17b1344"
130
130
  }