@haniffalab/cherita-react 1.4.1 → 1.4.2

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.
Files changed (138) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/controls/Controls.js +38 -30
  3. package/dist/cjs/components/dotplot/Dotplot.js +67 -69
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +100 -74
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +89 -44
  8. package/dist/cjs/components/heatmap/Heatmap.js +65 -65
  9. package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
  10. package/dist/cjs/components/icons/DotPlotIcon.js +64 -0
  11. package/dist/cjs/components/icons/HeatmapIcon.js +45 -0
  12. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +57 -0
  13. package/dist/cjs/components/icons/MatrixPlotIcon.js +59 -0
  14. package/dist/cjs/components/icons/ScatterplotIcon.1.js +164 -0
  15. package/dist/cjs/components/icons/ScatterplotIcon.js +144 -0
  16. package/dist/cjs/components/icons/ViolinPlotIcon.js +42 -0
  17. package/dist/cjs/components/matrixplot/Matrixplot.js +65 -66
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +258 -210
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -133
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +53 -38
  23. package/dist/cjs/components/offcanvas/index.js +61 -31
  24. package/dist/cjs/components/pseudospatial/Pseudospatial.js +132 -76
  25. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +122 -74
  26. package/dist/cjs/components/scatterplot/Scatterplot.js +127 -99
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +140 -113
  29. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  30. package/dist/cjs/components/search-bar/SearchBar.js +168 -121
  31. package/dist/cjs/components/search-bar/SearchInfo.js +76 -50
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +46 -37
  34. package/dist/cjs/components/var-list/VarItem.js +115 -88
  35. package/dist/cjs/components/var-list/VarList.js +85 -69
  36. package/dist/cjs/components/var-list/VarListToolbar.js +59 -54
  37. package/dist/cjs/components/var-list/VarSet.js +126 -108
  38. package/dist/cjs/components/violin/Violin.js +109 -107
  39. package/dist/cjs/components/violin/ViolinControls.js +8 -5
  40. package/dist/cjs/constants/colorscales.js +19 -19
  41. package/dist/cjs/constants/constants.js +47 -47
  42. package/dist/cjs/context/DatasetContext.js +24 -16
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +255 -89
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/zarr-helper.js +3 -3
  48. package/dist/cjs/utils/Filter.js +16 -11
  49. package/dist/cjs/utils/Histogram.js +35 -33
  50. package/dist/cjs/utils/ImageViewer.js +11 -8
  51. package/dist/cjs/utils/Legend.js +37 -30
  52. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  53. package/dist/cjs/utils/Resolver.js +213 -0
  54. package/dist/cjs/utils/Skeleton.js +10 -10
  55. package/dist/cjs/utils/StyledTooltip.js +44 -0
  56. package/dist/cjs/utils/VirtualizedList.js +34 -27
  57. package/dist/cjs/utils/errors.js +15 -15
  58. package/dist/cjs/utils/requests.js +21 -9
  59. package/dist/cjs/utils/search.js +4 -4
  60. package/dist/cjs/utils/string.js +6 -6
  61. package/dist/cjs/utils/zarrData.js +20 -21
  62. package/dist/css/cherita.css +64 -42
  63. package/dist/css/cherita.css.map +1 -1
  64. package/dist/esm/components/controls/Controls.js +43 -35
  65. package/dist/esm/components/dotplot/Dotplot.js +77 -78
  66. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  67. package/dist/esm/components/full-page/FullPage.js +120 -93
  68. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  69. package/dist/esm/components/full-page/PlotTypeSelector.js +90 -45
  70. package/dist/esm/components/heatmap/Heatmap.js +75 -74
  71. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  72. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  73. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  74. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  75. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  76. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  77. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  78. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  79. package/dist/esm/components/matrixplot/Matrixplot.js +75 -75
  80. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  81. package/dist/esm/components/obs-list/ObsItem.js +273 -222
  82. package/dist/esm/components/obs-list/ObsList.js +176 -147
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +60 -44
  85. package/dist/esm/components/offcanvas/index.js +67 -37
  86. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  87. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  88. package/dist/esm/components/scatterplot/Scatterplot.js +148 -119
  89. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  90. package/dist/esm/components/scatterplot/SpatialControls.js +153 -125
  91. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  92. package/dist/esm/components/search-bar/SearchBar.js +180 -132
  93. package/dist/esm/components/search-bar/SearchInfo.js +86 -59
  94. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  95. package/dist/esm/components/toolbar/Toolbar.js +49 -39
  96. package/dist/esm/components/var-list/VarItem.js +126 -98
  97. package/dist/esm/components/var-list/VarList.js +99 -82
  98. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  99. package/dist/esm/components/var-list/VarSet.js +134 -115
  100. package/dist/esm/components/violin/Violin.js +121 -118
  101. package/dist/esm/components/violin/ViolinControls.js +10 -6
  102. package/dist/esm/constants/colorscales.js +19 -19
  103. package/dist/esm/constants/constants.js +47 -47
  104. package/dist/esm/context/DatasetContext.js +31 -22
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +257 -90
  107. package/dist/esm/context/ZarrDataContext.js +8 -6
  108. package/dist/esm/helpers/color-helper.js +5 -5
  109. package/dist/esm/helpers/map-helper.js +2 -2
  110. package/dist/esm/helpers/zarr-helper.js +6 -6
  111. package/dist/esm/index.js +22 -22
  112. package/dist/esm/utils/Filter.js +22 -17
  113. package/dist/esm/utils/Histogram.js +39 -37
  114. package/dist/esm/utils/ImageViewer.js +12 -8
  115. package/dist/esm/utils/Legend.js +44 -36
  116. package/dist/esm/utils/LoadingIndicators.js +16 -13
  117. package/dist/esm/utils/Resolver.js +201 -0
  118. package/dist/esm/utils/Skeleton.js +11 -10
  119. package/dist/esm/utils/StyledTooltip.js +38 -0
  120. package/dist/esm/utils/VirtualizedList.js +35 -27
  121. package/dist/esm/utils/errors.js +15 -15
  122. package/dist/esm/utils/requests.js +24 -12
  123. package/dist/esm/utils/search.js +7 -7
  124. package/dist/esm/utils/string.js +7 -7
  125. package/dist/esm/utils/zarrData.js +27 -28
  126. package/package.json +18 -7
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +43 -17
  129. package/scss/components/accordions.scss +4 -1
  130. package/scss/components/layouts.scss +15 -33
  131. package/scss/components/lists.scss +8 -4
  132. package/scss/components/plotly.scss +38 -26
  133. package/scss/components/plots.scss +14 -1
  134. package/dist/assets/images/plots/dotplot.svg +0 -152
  135. package/dist/assets/images/plots/heatmap.svg +0 -193
  136. package/dist/assets/images/plots/matrixplot.svg +0 -275
  137. package/dist/assets/images/plots/scatterplot.svg +0 -198
  138. package/dist/assets/images/plots/violin.svg +0 -50
@@ -7,12 +7,13 @@ exports.SettingsDispatchContext = exports.SettingsContext = void 0;
7
7
  exports.SettingsProvider = SettingsProvider;
8
8
  exports.useSettings = useSettings;
9
9
  exports.useSettingsDispatch = useSettingsDispatch;
10
- var _react = _interopRequireWildcard(require("react"));
10
+ var _react = require("react");
11
11
  var _lodash = _interopRequireDefault(require("lodash"));
12
12
  var _constants = require("../constants/constants");
13
+ var _Resolver = require("../utils/Resolver");
14
+ var _jsxRuntime = require("react/jsx-runtime");
13
15
  const _excluded = ["buster", "timestamp"];
14
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
15
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
16
17
  function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
17
18
  function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
18
19
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
@@ -22,29 +23,29 @@ function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i
22
23
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
23
24
  const SettingsContext = exports.SettingsContext = /*#__PURE__*/(0, _react.createContext)(null);
24
25
  const SettingsDispatchContext = exports.SettingsDispatchContext = /*#__PURE__*/(0, _react.createContext)(null);
25
-
26
- // @TODO: consider splitting constant values and dataset-resolved values
27
- // e.g. store only obs name in selectedObs, and resolved obs data (counts, values, etc.) elsewhere
28
- // e.g. store only var name in selectedVar, and resolved var data (index, matrix_index) elsewhere
29
- // would simplify passing and validating defaultSettings and localSettings
30
26
  const initialSettings = {
31
27
  selectedObs: null,
28
+ // { name: "obs_name", omit: ["obs_item"], bins: {} }
32
29
  selectedVar: null,
30
+ // { name: "var_name", isSet: false } or { name: "var_set_name", isSet: true, vars: [{ name: "var1" }, { name: "var2" }] }
33
31
  selectedObsm: null,
34
- selectedMultiObs: [],
32
+ // "obsm_name" (e.g. "X_umap")
35
33
  selectedMultiVar: [],
36
- colorEncoding: null,
34
+ // [{ name: "var_name", isSet: false }, { name: "var_set_name", isSet: true, vars: [{ name: "var1" }, { name: "var2" }] }]
37
35
  labelObs: [],
36
+ // [ "obs_name1", "obs_name2" ]
38
37
  vars: [],
38
+ // [{ name: "var_name", isSet: false }, { name: "var_set_name", isSet: true, vars: [{ name: "var1" }, { name: "var2" }] }]
39
+ colorEncoding: null,
39
40
  sliceBy: {
40
41
  obs: false,
41
42
  polygons: false
42
43
  },
43
44
  polygons: {},
44
45
  controls: {
45
- colorScale: "Viridis",
46
- valueRange: [0, 1],
46
+ colorScale: 'Viridis',
47
47
  range: [0, 1],
48
+ // normalized
48
49
  colorAxis: {
49
50
  dmin: 0,
50
51
  dmax: 1,
@@ -72,12 +73,26 @@ const initialSettings = {
72
73
  pseudospatial: {
73
74
  maskSet: null,
74
75
  maskValues: null,
75
- categoricalMode: _constants.PSEUDOSPATIAL_CATEGORICAL_MODES.ACROSS.value
76
+ categoricalMode: _constants.PSEUDOSPATIAL_CATEGORICAL_MODES.ACROSS.value,
77
+ refImg: {
78
+ visible: false,
79
+ opacity: 1
80
+ }
81
+ },
82
+ // dataset resolved values
83
+ data: {
84
+ // store resolved obs and vars from selectedObs, selectedVar, selectedMultiVar, vars, labelObs
85
+ // keys to be removed when not in any selection
86
+ obs: {},
87
+ vars: {},
88
+ // store maskSets and values
89
+ pseudospatial: {}
76
90
  }
77
91
  };
78
92
 
79
93
  // validate on initialization and reducer
80
94
  const validateSettings = settings => {
95
+ var _settings$selectedObs;
81
96
  // make sure selectedVar is in vars
82
97
  if (settings.selectedVar) {
83
98
  const inVars = _lodash.default.some(settings.vars, v => v.name === settings.selectedVar.name);
@@ -88,7 +103,7 @@ const validateSettings = settings => {
88
103
 
89
104
  // make sure selectedMultiVar are in vars
90
105
  if (settings.selectedMultiVar) {
91
- const notInVars = _lodash.default.differenceBy(settings.selectedMultiVar, settings.vars, "name");
106
+ const notInVars = _lodash.default.differenceBy(settings.selectedMultiVar, settings.vars, 'name');
92
107
  if (notInVars.length) {
93
108
  settings.vars = [...settings.vars, ...notInVars];
94
109
  }
@@ -110,6 +125,21 @@ const validateSettings = settings => {
110
125
  settings.colorEncoding = null;
111
126
  }
112
127
  }
128
+
129
+ // pseudospatial
130
+ if (!settings.pseudospatial.maskSet && settings.pseudospatial.maskValues) {
131
+ settings.pseudospatial.maskValues = null;
132
+ }
133
+
134
+ // Keep only obs in use (selectedObs, labelObs) in data.obs
135
+ const obsNames = _lodash.default.uniq(_lodash.default.compact([(_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name, ...settings.labelObs]));
136
+ const intersectionObs = _lodash.default.intersection(_lodash.default.keys(settings.data.obs), obsNames);
137
+ settings.data.obs = _lodash.default.pick(settings.data.obs, intersectionObs);
138
+
139
+ // Keep only vars in use (settings.vars) in data.vars
140
+ const varNames = _lodash.default.flatMap(settings.vars, v => v.isSet ? _lodash.default.map(v.vars, vv => vv.name) : v.name);
141
+ const intersectionVars = _lodash.default.intersection(_lodash.default.keys(settings.data.vars), varNames);
142
+ settings.data.vars = _lodash.default.pick(settings.data.vars, intersectionVars);
113
143
  return settings;
114
144
  };
115
145
  const initializer = _ref => {
@@ -118,9 +148,12 @@ const initializer = _ref => {
118
148
  defaultSettings,
119
149
  localSettings
120
150
  } = _ref;
121
- const mergedSettings = canOverrideSettings ? _lodash.default.assign({}, initialSettings, defaultSettings, localSettings) : _lodash.default.assign({}, initialSettings, defaultSettings);
151
+ const mergedSettings = canOverrideSettings ? _lodash.default.defaultsDeep({}, localSettings, defaultSettings, initialSettings) : _lodash.default.defaultsDeep({}, defaultSettings, initialSettings);
122
152
  return validateSettings(mergedSettings);
123
153
  };
154
+ const validate = settings => {
155
+ return settings ? validateSettings(settings) : null;
156
+ };
124
157
  function SettingsProvider(_ref2) {
125
158
  let {
126
159
  dataset_url,
@@ -140,35 +173,50 @@ function SettingsProvider(_ref2) {
140
173
 
141
174
  // If the buster is not set or does not match the current package version,
142
175
  // reset localSettings to avoid stale data
143
- if (!buster || buster !== "1.4.1") {
176
+ if (!buster || buster !== "1.4.2") {
144
177
  localSettings = {};
145
178
  }
146
- const [settings, dispatch] = (0, _react.useReducer)(settingsReducer, {
179
+ const initSettings = (0, _react.useRef)(initializer({
147
180
  canOverrideSettings,
148
181
  defaultSettings,
149
182
  localSettings
150
- }, initializer);
183
+ }));
184
+ const resolvedSettings = (0, _Resolver.useResolver)(initSettings.current);
185
+ const [settings, dispatch] = (0, _react.useReducer)(settingsReducer, resolvedSettings, validate);
151
186
  (0, _react.useEffect)(() => {
152
- if (canOverrideSettings) {
187
+ // If resolvedSettings is null, do not update settings
188
+ if (resolvedSettings) {
189
+ const validatedSettings = validateSettings(resolvedSettings);
190
+ console.log('Initial settings:', validatedSettings);
191
+ dispatch({
192
+ type: 'init',
193
+ settings: validatedSettings
194
+ });
195
+ }
196
+ }, [resolvedSettings]);
197
+ (0, _react.useEffect)(() => {
198
+ if (canOverrideSettings && settings) {
153
199
  try {
154
200
  localStorage.setItem(DATASET_STORAGE_KEY, JSON.stringify(_objectSpread({
155
- buster: "1.4.1" || "0.0.0",
201
+ buster: "1.4.2" || '0.0.0',
156
202
  timestamp: Date.now()
157
- }, settings)));
203
+ }, _lodash.default.omit(settings, 'data'))));
158
204
  } catch (err) {
159
- if (err.code === 22 || err.code === 1014 || err.name === "QuotaExceededError" || err.name === "NS_ERROR_DOM_QUOTA_REACHED") {
160
- console.err("Browser storage quota exceeded");
205
+ if (err.code === 22 || err.code === 1014 || err.name === 'QuotaExceededError' || err.name === 'NS_ERROR_DOM_QUOTA_REACHED') {
206
+ console.err('Browser storage quota exceeded');
161
207
  } else {
162
208
  console.err(err);
163
209
  }
164
210
  }
165
211
  }
166
212
  }, [DATASET_STORAGE_KEY, canOverrideSettings, settings]);
167
- return /*#__PURE__*/_react.default.createElement(SettingsContext.Provider, {
168
- value: settings
169
- }, /*#__PURE__*/_react.default.createElement(SettingsDispatchContext.Provider, {
170
- value: dispatch
171
- }, children));
213
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(SettingsContext.Provider, {
214
+ value: settings,
215
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(SettingsDispatchContext.Provider, {
216
+ value: dispatch,
217
+ children: settings && children
218
+ })
219
+ });
172
220
  }
173
221
  function useSettings() {
174
222
  return (0, _react.useContext)(SettingsContext);
@@ -176,13 +224,70 @@ function useSettings() {
176
224
  function useSettingsDispatch() {
177
225
  return (0, _react.useContext)(SettingsDispatchContext);
178
226
  }
227
+ const OBS_DATA_KEYS = ['name', 'type',
228
+ // categorical and numerical
229
+ 'codes', 'codesMap', 'values', 'n_values', 'value_counts',
230
+ // numerical
231
+ 'bins', 'min', 'max', 'mean', 'median', 'n_unique'];
232
+ const splitObs = obs => {
233
+ if (!obs) return {
234
+ settings: null,
235
+ data: {}
236
+ };
237
+ const settings = _lodash.default.pick(obs, ['name', 'omit', 'bins']);
238
+ const data = obs ? {
239
+ [obs.name]: _lodash.default.pick(obs, OBS_DATA_KEYS)
240
+ } : {};
241
+ return {
242
+ settings,
243
+ data
244
+ };
245
+ };
246
+ const splitVar = v => {
247
+ if (!v) return {
248
+ settings: null,
249
+ data: {}
250
+ };
251
+ let settings, data;
252
+ if (v.isSet) {
253
+ settings = _objectSpread(_objectSpread({}, _lodash.default.pick(v, ['name', 'isSet'])), {}, {
254
+ vars: _lodash.default.map(v.vars, vv => ({
255
+ name: vv.name
256
+ }))
257
+ });
258
+ data = _lodash.default.fromPairs(_lodash.default.map(v.vars, vv => [vv.name, _lodash.default.pick(vv, ['name', 'index', 'matrix_index'])]));
259
+ } else {
260
+ settings = _lodash.default.pick(v, ['name', 'isSet']);
261
+ data = {
262
+ [v.name]: _lodash.default.pick(v, ['name', 'index', 'matrix_index'])
263
+ };
264
+ }
265
+ return {
266
+ settings,
267
+ data
268
+ };
269
+ };
179
270
  function settingsReducer(settings, action) {
180
271
  switch (action.type) {
181
- case "select.obs":
272
+ case 'init':
273
+ {
274
+ return action.settings;
275
+ }
276
+ case 'select.obs':
182
277
  {
183
278
  var _action$obs;
184
- return _objectSpread(_objectSpread({}, settings), {}, {
185
- selectedObs: action.obs,
279
+ const {
280
+ settings: obsSettings,
281
+ data: obsData
282
+ } = splitObs(action.obs);
283
+ return _objectSpread(_objectSpread(_objectSpread({}, settings), action.obs ? {
284
+ selectedObs: obsSettings,
285
+ data: _objectSpread(_objectSpread({}, settings.data), {}, {
286
+ obs: _objectSpread(_objectSpread({}, settings.data.obs), obsData)
287
+ })
288
+ } : {
289
+ selectedObs: null
290
+ }), {}, {
186
291
  controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
187
292
  range: ((_action$obs = action.obs) === null || _action$obs === void 0 ? void 0 : _action$obs.type) === _constants.OBS_TYPES.CATEGORICAL ? [0, 1] : settings.controls.range
188
293
  }),
@@ -192,36 +297,50 @@ function settingsReducer(settings, action) {
192
297
  })
193
298
  });
194
299
  }
195
- case "select.obsm":
300
+ case 'select.obsm':
196
301
  {
197
302
  return _objectSpread(_objectSpread({}, settings), {}, {
198
303
  selectedObsm: action.obsm
199
304
  });
200
305
  }
201
- case "select.var":
306
+ case 'select.var':
202
307
  {
308
+ const {
309
+ settings: varSettings,
310
+ data: varData
311
+ } = splitVar(action.var);
203
312
  return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
204
- selectedVar: action.var
313
+ selectedVar: varSettings,
314
+ data: _objectSpread(_objectSpread({}, settings.data), {}, {
315
+ vars: _objectSpread(_objectSpread({}, settings.data.vars), varData)
316
+ })
205
317
  }));
206
318
  }
207
- case "select.multivar":
319
+ case 'select.multivar':
208
320
  {
209
321
  const inMultiVar = settings.selectedMultiVar.some(v => v.name === action.var.name);
210
322
  if (inMultiVar) {
211
323
  return validateSettings(_objectSpread({}, settings));
212
324
  } else {
325
+ const {
326
+ settings: varSettings,
327
+ data: varData
328
+ } = splitVar(action.var);
213
329
  return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
214
- selectedMultiVar: [...settings.selectedMultiVar, action.var]
330
+ selectedMultiVar: [...settings.selectedMultiVar, varSettings],
331
+ data: _objectSpread(_objectSpread({}, settings.data), {}, {
332
+ vars: _objectSpread(_objectSpread({}, settings.data.vars), varData)
333
+ })
215
334
  }));
216
335
  }
217
336
  }
218
- case "deselect.multivar":
337
+ case 'deselect.multivar':
219
338
  {
220
339
  return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
221
340
  selectedMultiVar: settings.selectedMultiVar.filter(v => v !== action.var.name)
222
341
  }));
223
342
  }
224
- case "toggle.multivar":
343
+ case 'toggle.multivar':
225
344
  {
226
345
  const inMultiVar = settings.selectedMultiVar.some(v => v.name === action.var.name);
227
346
  if (inMultiVar) {
@@ -229,18 +348,25 @@ function settingsReducer(settings, action) {
229
348
  selectedMultiVar: settings.selectedMultiVar.filter(v => v.name !== action.var.name)
230
349
  }));
231
350
  } else {
351
+ const {
352
+ settings: varSettings,
353
+ data: varData
354
+ } = splitVar(action.var);
232
355
  return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
233
- selectedMultiVar: [...settings.selectedMultiVar, action.var]
356
+ selectedMultiVar: [...settings.selectedMultiVar, varSettings],
357
+ data: _objectSpread(_objectSpread({}, settings.data), {}, {
358
+ vars: _objectSpread(_objectSpread({}, settings.data.vars), varData)
359
+ })
234
360
  }));
235
361
  }
236
362
  }
237
- case "set.colorEncoding":
363
+ case 'set.colorEncoding':
238
364
  {
239
365
  return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
240
366
  colorEncoding: action.value
241
367
  }));
242
368
  }
243
- case "reset.vars":
369
+ case 'reset.vars':
244
370
  {
245
371
  return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
246
372
  vars: [],
@@ -248,29 +374,36 @@ function settingsReducer(settings, action) {
248
374
  selectedMultiVar: []
249
375
  }));
250
376
  }
251
- case "reset.multiVar":
377
+ case 'reset.multiVar':
252
378
  {
253
379
  return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
254
380
  selectedMultiVar: []
255
381
  }));
256
382
  }
257
- case "reset.var":
383
+ case 'reset.var':
258
384
  {
259
385
  return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
260
386
  selectedVar: null
261
387
  }));
262
388
  }
263
- case "add.var":
389
+ case 'add.var':
264
390
  {
265
391
  if (settings.vars.find(v => v.name === action.var.name)) {
266
392
  return settings;
267
393
  } else {
394
+ const {
395
+ settings: varSettings,
396
+ data: varData
397
+ } = splitVar(action.var);
268
398
  return _objectSpread(_objectSpread({}, settings), {}, {
269
- vars: [...settings.vars, action.var]
399
+ vars: [...settings.vars, varSettings],
400
+ data: _objectSpread(_objectSpread({}, settings.data), {}, {
401
+ vars: _objectSpread(_objectSpread({}, settings.data.vars), varData)
402
+ })
270
403
  });
271
404
  }
272
405
  }
273
- case "remove.var":
406
+ case 'remove.var':
274
407
  {
275
408
  var _settings$selectedVar;
276
409
  const selectedVar = ((_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name) === action.var.name ? null : settings.selectedVar;
@@ -281,7 +414,7 @@ function settingsReducer(settings, action) {
281
414
  selectedMultiVar: selectedMultiVar
282
415
  }));
283
416
  }
284
- case "add.varSet.var":
417
+ case 'add.varSet.var':
285
418
  {
286
419
  const varSet = settings.vars.find(s => s.isSet && s.name === action.varSet.name);
287
420
  if (!varSet) {
@@ -291,7 +424,11 @@ function settingsReducer(settings, action) {
291
424
  return settings;
292
425
  } else {
293
426
  var _settings$selectedVar2;
294
- const varSetVars = [...varSet.vars, action.var];
427
+ const {
428
+ settings: varSettings,
429
+ data: varData
430
+ } = splitVar(action.var);
431
+ const varSetVars = [...varSet.vars, varSettings];
295
432
  const vars = settings.vars.map(v => {
296
433
  if (v.name === varSet.name) {
297
434
  return _objectSpread(_objectSpread({}, v), {}, {
@@ -316,11 +453,14 @@ function settingsReducer(settings, action) {
316
453
  return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
317
454
  vars: vars,
318
455
  selectedVar: selectedVar,
319
- selectedMultiVar: selectedMultiVar
456
+ selectedMultiVar: selectedMultiVar,
457
+ data: _objectSpread(_objectSpread({}, settings.data), {}, {
458
+ vars: _objectSpread(_objectSpread({}, settings.data.vars), varData)
459
+ })
320
460
  }));
321
461
  }
322
462
  }
323
- case "remove.varSet.var":
463
+ case 'remove.varSet.var':
324
464
  {
325
465
  const varSet = settings.vars.find(s => s.isSet && s.name === action.varSet.name);
326
466
  if (!varSet) {
@@ -372,7 +512,7 @@ function settingsReducer(settings, action) {
372
512
  }
373
513
  }
374
514
  }
375
- case "set.controls.colorScale":
515
+ case 'set.controls.colorScale':
376
516
  {
377
517
  return _objectSpread(_objectSpread({}, settings), {}, {
378
518
  controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
@@ -380,15 +520,7 @@ function settingsReducer(settings, action) {
380
520
  })
381
521
  });
382
522
  }
383
- case "set.controls.valueRange":
384
- {
385
- return _objectSpread(_objectSpread({}, settings), {}, {
386
- controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
387
- valueRange: action.valueRange
388
- })
389
- });
390
- }
391
- case "set.controls.range":
523
+ case 'set.controls.range':
392
524
  {
393
525
  return _objectSpread(_objectSpread({}, settings), {}, {
394
526
  controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
@@ -396,7 +528,7 @@ function settingsReducer(settings, action) {
396
528
  })
397
529
  });
398
530
  }
399
- case "set.controls.colorAxis":
531
+ case 'set.controls.colorAxis':
400
532
  {
401
533
  return _objectSpread(_objectSpread({}, settings), {}, {
402
534
  controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
@@ -404,7 +536,7 @@ function settingsReducer(settings, action) {
404
536
  })
405
537
  });
406
538
  }
407
- case "set.controls.colorAxis.crange":
539
+ case 'set.controls.colorAxis.crange':
408
540
  {
409
541
  return _objectSpread(_objectSpread({}, settings), {}, {
410
542
  controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
@@ -415,7 +547,7 @@ function settingsReducer(settings, action) {
415
547
  })
416
548
  });
417
549
  }
418
- case "set.controls.colorAxis.cmin":
550
+ case 'set.controls.colorAxis.cmin':
419
551
  {
420
552
  return _objectSpread(_objectSpread({}, settings), {}, {
421
553
  controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
@@ -425,7 +557,7 @@ function settingsReducer(settings, action) {
425
557
  })
426
558
  });
427
559
  }
428
- case "set.controls.colorAxis.cmax":
560
+ case 'set.controls.colorAxis.cmax':
429
561
  {
430
562
  return _objectSpread(_objectSpread({}, settings), {}, {
431
563
  controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
@@ -435,7 +567,7 @@ function settingsReducer(settings, action) {
435
567
  })
436
568
  });
437
569
  }
438
- case "set.controls.scale":
570
+ case 'set.controls.scale':
439
571
  {
440
572
  return _objectSpread(_objectSpread({}, settings), {}, {
441
573
  controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
@@ -445,7 +577,7 @@ function settingsReducer(settings, action) {
445
577
  })
446
578
  });
447
579
  }
448
- case "set.controls.meanOnlyExpressed":
580
+ case 'set.controls.meanOnlyExpressed':
449
581
  {
450
582
  return _objectSpread(_objectSpread({}, settings), {}, {
451
583
  controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
@@ -453,7 +585,7 @@ function settingsReducer(settings, action) {
453
585
  })
454
586
  });
455
587
  }
456
- case "set.controls.expressionCutoff":
588
+ case 'set.controls.expressionCutoff':
457
589
  {
458
590
  return _objectSpread(_objectSpread({}, settings), {}, {
459
591
  controls: _objectSpread(_objectSpread({}, settings.controls), {}, {
@@ -461,24 +593,31 @@ function settingsReducer(settings, action) {
461
593
  })
462
594
  });
463
595
  }
464
- case "toggle.slice.obs":
596
+ case 'toggle.slice.obs':
465
597
  {
466
- if (_lodash.default.isEqual(settings.selectedObs, action.obs)) {
598
+ if (settings.selectedObs && settings.selectedObs.name === action.obs.name) {
467
599
  return _objectSpread(_objectSpread({}, settings), {}, {
468
600
  sliceBy: _objectSpread(_objectSpread({}, settings.sliceBy), {}, {
469
601
  obs: !settings.sliceBy.obs
470
602
  })
471
603
  });
472
604
  } else {
605
+ const {
606
+ settings: obsSettings,
607
+ data: obsData
608
+ } = splitObs(action.obs);
473
609
  return _objectSpread(_objectSpread({}, settings), {}, {
474
- selectedObs: action.obs,
610
+ selectedObs: obsSettings,
611
+ data: _objectSpread(_objectSpread({}, settings.data), {}, {
612
+ obs: _objectSpread(_objectSpread({}, settings.data.obs), obsData)
613
+ }),
475
614
  sliceBy: _objectSpread(_objectSpread({}, settings.sliceBy), {}, {
476
615
  obs: true
477
616
  })
478
617
  });
479
618
  }
480
619
  }
481
- case "toggle.slice.polygons":
620
+ case 'toggle.slice.polygons':
482
621
  {
483
622
  return _objectSpread(_objectSpread({}, settings), {}, {
484
623
  sliceBy: _objectSpread(_objectSpread({}, settings.sliceBy), {}, {
@@ -486,7 +625,7 @@ function settingsReducer(settings, action) {
486
625
  })
487
626
  });
488
627
  }
489
- case "disable.slice.polygons":
628
+ case 'disable.slice.polygons':
490
629
  {
491
630
  return _objectSpread(_objectSpread({}, settings), {}, {
492
631
  sliceBy: _objectSpread(_objectSpread({}, settings.sliceBy), {}, {
@@ -494,29 +633,36 @@ function settingsReducer(settings, action) {
494
633
  })
495
634
  });
496
635
  }
497
- case "add.label.obs":
636
+ case 'add.label.obs':
498
637
  {
499
- if (settings.labelObs.find(i => _lodash.default.isEqual(i, action.obs))) {
638
+ if (_lodash.default.includes(settings.labelObs, action.obs.name)) {
500
639
  return settings;
501
640
  } else {
641
+ const {
642
+ settings: obsSettings,
643
+ data: obsData
644
+ } = splitObs(action.obs);
502
645
  return _objectSpread(_objectSpread({}, settings), {}, {
503
- labelObs: [...settings.labelObs, action.obs]
646
+ labelObs: [...settings.labelObs, obsSettings.name],
647
+ data: _objectSpread(_objectSpread({}, settings.data), {}, {
648
+ obs: _objectSpread(_objectSpread({}, settings.data.obs), obsData)
649
+ })
504
650
  });
505
651
  }
506
652
  }
507
- case "remove.label.obs":
653
+ case 'remove.label.obs':
508
654
  {
509
- return _objectSpread(_objectSpread({}, settings), {}, {
510
- labelObs: settings.labelObs.filter(a => a.name !== action.obsName)
511
- });
655
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
656
+ labelObs: settings.labelObs.filter(a => a !== action.obsName)
657
+ }));
512
658
  }
513
- case "reset.label.obs":
659
+ case 'reset.label.obs':
514
660
  {
515
- return _objectSpread(_objectSpread({}, settings), {}, {
661
+ return validateSettings(_objectSpread(_objectSpread({}, settings), {}, {
516
662
  labelObs: []
517
- });
663
+ }));
518
664
  }
519
- case "set.varSort":
665
+ case 'set.varSort':
520
666
  {
521
667
  return _objectSpread(_objectSpread({}, settings), {}, {
522
668
  varSort: _objectSpread(_objectSpread({}, settings.varSort), {}, {
@@ -527,7 +673,7 @@ function settingsReducer(settings, action) {
527
673
  })
528
674
  });
529
675
  }
530
- case "set.varSort.sort":
676
+ case 'set.varSort.sort':
531
677
  {
532
678
  return _objectSpread(_objectSpread({}, settings), {}, {
533
679
  varSort: _objectSpread(_objectSpread({}, settings.varSort), {}, {
@@ -537,7 +683,7 @@ function settingsReducer(settings, action) {
537
683
  })
538
684
  });
539
685
  }
540
- case "set.varSort.sortOrder":
686
+ case 'set.varSort.sortOrder':
541
687
  {
542
688
  return _objectSpread(_objectSpread({}, settings), {}, {
543
689
  varSort: _objectSpread(_objectSpread({}, settings.varSort), {}, {
@@ -547,7 +693,7 @@ function settingsReducer(settings, action) {
547
693
  })
548
694
  });
549
695
  }
550
- case "set.polygons":
696
+ case 'set.polygons':
551
697
  {
552
698
  return _objectSpread(_objectSpread({}, settings), {}, {
553
699
  polygons: _objectSpread(_objectSpread({}, settings.polygons), {}, {
@@ -555,7 +701,7 @@ function settingsReducer(settings, action) {
555
701
  })
556
702
  });
557
703
  }
558
- case "set.pseudospatial.maskSet":
704
+ case 'set.pseudospatial.maskSet':
559
705
  {
560
706
  return _objectSpread(_objectSpread({}, settings), {}, {
561
707
  pseudospatial: _objectSpread(_objectSpread({}, settings.pseudospatial), {}, {
@@ -563,7 +709,7 @@ function settingsReducer(settings, action) {
563
709
  })
564
710
  });
565
711
  }
566
- case "set.pseudospatial.maskValues":
712
+ case 'set.pseudospatial.maskValues':
567
713
  {
568
714
  return _objectSpread(_objectSpread({}, settings), {}, {
569
715
  pseudospatial: _objectSpread(_objectSpread({}, settings.pseudospatial), {}, {
@@ -571,7 +717,7 @@ function settingsReducer(settings, action) {
571
717
  })
572
718
  });
573
719
  }
574
- case "set.pseudospatial.categoricalMode":
720
+ case 'set.pseudospatial.categoricalMode':
575
721
  {
576
722
  return _objectSpread(_objectSpread({}, settings), {}, {
577
723
  pseudospatial: _objectSpread(_objectSpread({}, settings.pseudospatial), {}, {
@@ -579,9 +725,29 @@ function settingsReducer(settings, action) {
579
725
  })
580
726
  });
581
727
  }
728
+ case 'toggle.pseudospatial.refImg.visible':
729
+ {
730
+ return _objectSpread(_objectSpread({}, settings), {}, {
731
+ pseudospatial: _objectSpread(_objectSpread({}, settings.pseudospatial), {}, {
732
+ refImg: _objectSpread(_objectSpread({}, settings.pseudospatial.refImg), {}, {
733
+ visible: !settings.pseudospatial.refImg.visible
734
+ })
735
+ })
736
+ });
737
+ }
738
+ case 'set.pseudospatial.refImg.opacity':
739
+ {
740
+ return _objectSpread(_objectSpread({}, settings), {}, {
741
+ pseudospatial: _objectSpread(_objectSpread({}, settings.pseudospatial), {}, {
742
+ refImg: _objectSpread(_objectSpread({}, settings.pseudospatial.refImg), {}, {
743
+ opacity: action.opacity
744
+ })
745
+ })
746
+ });
747
+ }
582
748
  default:
583
749
  {
584
- throw Error("Unknown action: " + action.type);
750
+ throw Error('Unknown action: ' + action.type);
585
751
  }
586
752
  }
587
753
  }