@haniffalab/cherita-react 1.3.0-dev.2025-06-04.bee6fd81 → 1.3.0-dev.2025-06-04.0123fe8a

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.
@@ -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
  }
@@ -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
  }
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.0123fe8a",
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": "0123fe8ae9b9e8cac1b41bc7c5f201a4bbec8214"
130
130
  }