@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.
- package/dist/cjs/components/scatterplot/Scatterplot.js +17 -5
- package/dist/cjs/context/SettingsContext.js +77 -46
- package/dist/cjs/helpers/map-helper.js +2 -1
- package/dist/esm/components/scatterplot/Scatterplot.js +17 -5
- package/dist/esm/context/SettingsContext.js +77 -46
- package/dist/esm/helpers/map-helper.js +2 -1
- package/package.json +2 -2
|
@@ -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 =
|
|
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:
|
|
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,
|
|
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
|
-
|
|
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
|
}
|
|
@@ -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 =
|
|
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:
|
|
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,
|
|
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
|
-
|
|
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.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": "
|
|
129
|
+
"prereleaseSha": "6573608f6ab26442b5badaea1be8d5dff17b1344"
|
|
130
130
|
}
|