@haniffalab/cherita-react 1.3.0-dev.2025-06-04.d986a94b → 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.
|
@@ -378,21 +378,23 @@ function ObsContinuousStats(_ref3) {
|
|
|
378
378
|
}
|
|
379
379
|
|
|
380
380
|
// @TODO: add bin controls
|
|
381
|
-
// @TODO: add histogram
|
|
382
381
|
function ContinuousObs(_ref4) {
|
|
383
382
|
let {
|
|
384
383
|
obs,
|
|
385
384
|
toggleAll,
|
|
386
385
|
toggleObs
|
|
387
386
|
} = _ref4;
|
|
387
|
+
const settings = (0, _SettingsContext.useSettings)();
|
|
388
388
|
const {
|
|
389
389
|
isSliced
|
|
390
390
|
} = (0, _FilterContext.useFilteredData)();
|
|
391
391
|
const totalCounts = _lodash.default.sum(_lodash.default.values(obs.value_counts));
|
|
392
392
|
const min = _lodash.default.min(_lodash.default.values(obs.codes));
|
|
393
393
|
const max = _lodash.default.max(_lodash.default.values(obs.codes));
|
|
394
|
+
const obsHistograms = useObsHistogram(obs);
|
|
394
395
|
const filteredObsData = useFilteredObsData(obs);
|
|
395
|
-
const getDataAtIndex = index => {
|
|
396
|
+
const getDataAtIndex = (0, _react.useCallback)(index => {
|
|
397
|
+
var _obsHistograms$fetche2;
|
|
396
398
|
return {
|
|
397
399
|
value: obs.values[index],
|
|
398
400
|
code: obs.codes[obs.values[index]],
|
|
@@ -402,13 +404,21 @@ function ContinuousObs(_ref4) {
|
|
|
402
404
|
},
|
|
403
405
|
isOmitted: _lodash.default.includes(obs.omit, obs.codes[obs.values[index]]),
|
|
404
406
|
label: isNaN(obs.values[index]) ? "NaN" : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges),
|
|
407
|
+
histogramData: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? {
|
|
408
|
+
data: (_obsHistograms$fetche2 = obsHistograms.fetchedData) === null || _obsHistograms$fetche2 === void 0 ? void 0 : _obsHistograms$fetche2[obs.values[index]],
|
|
409
|
+
isPending: obsHistograms.isPending,
|
|
410
|
+
altColor: isSliced
|
|
411
|
+
} : {
|
|
412
|
+
data: null,
|
|
413
|
+
isPending: false
|
|
414
|
+
},
|
|
405
415
|
filteredStats: {
|
|
406
416
|
value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
|
|
407
417
|
pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
|
|
408
418
|
},
|
|
409
419
|
isSliced: isSliced
|
|
410
420
|
};
|
|
411
|
-
};
|
|
421
|
+
}, [filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, isSliced, obs.bins.binEdges, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, settings.colorEncoding, totalCounts]);
|
|
412
422
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
|
|
413
423
|
variant: "flush",
|
|
414
424
|
className: "cherita-list"
|
|
@@ -425,7 +435,8 @@ function ContinuousObs(_ref4) {
|
|
|
425
435
|
min: min,
|
|
426
436
|
max: max,
|
|
427
437
|
onChange: toggleObs,
|
|
428
|
-
showColor: false
|
|
438
|
+
showColor: false,
|
|
439
|
+
estimateSize: 42
|
|
429
440
|
})), /*#__PURE__*/_react.default.createElement(ObsContinuousStats, {
|
|
430
441
|
obs: obs
|
|
431
442
|
}));
|
|
@@ -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
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
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
|
|
157
|
-
if (
|
|
158
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
}
|
|
@@ -370,21 +370,23 @@ function ObsContinuousStats(_ref3) {
|
|
|
370
370
|
}
|
|
371
371
|
|
|
372
372
|
// @TODO: add bin controls
|
|
373
|
-
// @TODO: add histogram
|
|
374
373
|
export function ContinuousObs(_ref4) {
|
|
375
374
|
let {
|
|
376
375
|
obs,
|
|
377
376
|
toggleAll,
|
|
378
377
|
toggleObs
|
|
379
378
|
} = _ref4;
|
|
379
|
+
const settings = useSettings();
|
|
380
380
|
const {
|
|
381
381
|
isSliced
|
|
382
382
|
} = useFilteredData();
|
|
383
383
|
const totalCounts = _.sum(_.values(obs.value_counts));
|
|
384
384
|
const min = _.min(_.values(obs.codes));
|
|
385
385
|
const max = _.max(_.values(obs.codes));
|
|
386
|
+
const obsHistograms = useObsHistogram(obs);
|
|
386
387
|
const filteredObsData = useFilteredObsData(obs);
|
|
387
|
-
const getDataAtIndex = index => {
|
|
388
|
+
const getDataAtIndex = useCallback(index => {
|
|
389
|
+
var _obsHistograms$fetche2;
|
|
388
390
|
return {
|
|
389
391
|
value: obs.values[index],
|
|
390
392
|
code: obs.codes[obs.values[index]],
|
|
@@ -394,13 +396,21 @@ export function ContinuousObs(_ref4) {
|
|
|
394
396
|
},
|
|
395
397
|
isOmitted: _.includes(obs.omit, obs.codes[obs.values[index]]),
|
|
396
398
|
label: isNaN(obs.values[index]) ? "NaN" : getContinuousLabel(obs.codes[obs.values[index]], obs.bins.binEdges),
|
|
399
|
+
histogramData: settings.colorEncoding === COLOR_ENCODINGS.VAR ? {
|
|
400
|
+
data: (_obsHistograms$fetche2 = obsHistograms.fetchedData) === null || _obsHistograms$fetche2 === void 0 ? void 0 : _obsHistograms$fetche2[obs.values[index]],
|
|
401
|
+
isPending: obsHistograms.isPending,
|
|
402
|
+
altColor: isSliced
|
|
403
|
+
} : {
|
|
404
|
+
data: null,
|
|
405
|
+
isPending: false
|
|
406
|
+
},
|
|
397
407
|
filteredStats: {
|
|
398
408
|
value_counts: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts[obs.values[index]]) || 0,
|
|
399
409
|
pct: (filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct[obs.values[index]]) || 0
|
|
400
410
|
},
|
|
401
411
|
isSliced: isSliced
|
|
402
412
|
};
|
|
403
|
-
};
|
|
413
|
+
}, [filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.pct, filteredObsData === null || filteredObsData === void 0 ? void 0 : filteredObsData.value_counts, isSliced, obs.bins.binEdges, obs.codes, obs.omit, obs.value_counts, obs.values, obsHistograms.fetchedData, obsHistograms.isPending, settings.colorEncoding, totalCounts]);
|
|
404
414
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(ListGroup, {
|
|
405
415
|
variant: "flush",
|
|
406
416
|
className: "cherita-list"
|
|
@@ -417,7 +427,8 @@ export function ContinuousObs(_ref4) {
|
|
|
417
427
|
min: min,
|
|
418
428
|
max: max,
|
|
419
429
|
onChange: toggleObs,
|
|
420
|
-
showColor: false
|
|
430
|
+
showColor: false,
|
|
431
|
+
estimateSize: 42
|
|
421
432
|
})), /*#__PURE__*/React.createElement(ObsContinuousStats, {
|
|
422
433
|
obs: obs
|
|
423
434
|
}));
|
|
@@ -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
|
-
|
|
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
|
-
|
|
133
|
-
|
|
134
|
-
|
|
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
|
|
146
|
-
if (
|
|
147
|
-
return
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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.
|
|
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": "
|
|
129
|
+
"prereleaseSha": "0123fe8ae9b9e8cac1b41bc7c5f201a4bbec8214"
|
|
130
130
|
}
|