@haniffalab/cherita-react 0.2.0-dev.2024-09-26.775b9a06 → 0.2.0-dev.2024-09-26.1ea62883

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 (32) hide show
  1. package/dist/App.scss +77 -8
  2. package/dist/components/Offcanvas/index.js +6 -2
  3. package/dist/components/dotplot/Dotplot.js +22 -5
  4. package/dist/components/dotplot/DotplotControls.js +11 -10
  5. package/dist/components/heatmap/Heatmap.js +22 -5
  6. package/dist/components/matrixplot/Matrixplot.js +22 -5
  7. package/dist/components/matrixplot/MatrixplotControls.js +8 -7
  8. package/dist/components/obs-list/ObsItem.js +394 -0
  9. package/dist/components/obs-list/ObsList.js +116 -299
  10. package/dist/components/obs-list/ObsToolbar.js +76 -0
  11. package/dist/components/scatterplot/Legend.js +4 -3
  12. package/dist/components/scatterplot/Scatterplot.js +129 -61
  13. package/dist/components/scatterplot/Toolbox.js +3 -2
  14. package/dist/components/search-bar/SearchBar.js +18 -2
  15. package/dist/components/search-bar/SearchResults.js +8 -8
  16. package/dist/components/var-list/VarItem.js +316 -0
  17. package/dist/components/var-list/VarList.js +167 -149
  18. package/dist/components/var-list/VarSet.js +214 -0
  19. package/dist/components/violin/Violin.js +46 -13
  20. package/dist/components/violin/ViolinControls.js +13 -18
  21. package/dist/constants/constants.js +41 -29
  22. package/dist/context/DatasetContext.js +91 -31
  23. package/dist/context/FilterContext.js +76 -0
  24. package/dist/helpers/map-helper.js +20 -15
  25. package/dist/helpers/zarr-helper.js +35 -13
  26. package/dist/index.js +7 -0
  27. package/dist/utils/VirtualizedList.js +69 -0
  28. package/dist/utils/requests.js +2 -2
  29. package/dist/utils/search.js +3 -56
  30. package/dist/utils/string.js +18 -0
  31. package/package.json +3 -2
  32. package/dist/components/obs-list/ObsValueList.js +0 -101
@@ -7,6 +7,7 @@ exports.Violin = Violin;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
9
  var _reactFontawesome = require("@fortawesome/react-fontawesome");
10
+ var _lodash = _interopRequireDefault(require("lodash"));
10
11
  var _reactBootstrap = require("react-bootstrap");
11
12
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
12
13
  var _constants = require("../../constants/constants");
@@ -18,6 +19,7 @@ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e
18
19
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
19
20
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
20
21
  function Violin(_ref) {
22
+ var _dataset$selectedVar, _dataset$selectedVar2, _dataset$selectedVar3, _dataset$selectedVar4, _dataset$selectedObs, _dataset$selectedObs2, _dataset$selectedObs3;
21
23
  let {
22
24
  mode = _constants.VIOLIN_MODES.MULTIKEY
23
25
  } = _ref;
@@ -28,9 +30,29 @@ function Violin(_ref) {
28
30
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
29
31
  const [params, setParams] = (0, _react.useState)({
30
32
  url: dataset.url,
31
- keys: [],
32
- scale: dataset.controls.standardScale,
33
- varNamesCol: dataset.varNamesCol
33
+ mode: mode,
34
+ scale: dataset.controls.scale.violinplot.value,
35
+ varNamesCol: dataset.varNamesCol,
36
+ ...{
37
+ [_constants.VIOLIN_MODES.MULTIKEY]: {
38
+ varKeys: dataset.selectedMultiVar.map(i => i.isSet ? {
39
+ name: i.name,
40
+ indices: i.vars.map(v => v.index)
41
+ } : i.index),
42
+ obsKeys: [] // @TODO: implement
43
+ },
44
+ [_constants.VIOLIN_MODES.GROUPBY]: {
45
+ varKey: (_dataset$selectedVar = dataset.selectedVar) !== null && _dataset$selectedVar !== void 0 && _dataset$selectedVar.isSet ? {
46
+ name: (_dataset$selectedVar2 = dataset.selectedVar) === null || _dataset$selectedVar2 === void 0 ? void 0 : _dataset$selectedVar2.name,
47
+ indices: (_dataset$selectedVar3 = dataset.selectedVar) === null || _dataset$selectedVar3 === void 0 ? void 0 : _dataset$selectedVar3.vars.map(v => v.index)
48
+ } : (_dataset$selectedVar4 = dataset.selectedVar) === null || _dataset$selectedVar4 === void 0 ? void 0 : _dataset$selectedVar4.index,
49
+ obsCol: dataset.selectedObs,
50
+ obsValues: !((_dataset$selectedObs = dataset.selectedObs) !== null && _dataset$selectedObs !== void 0 && _dataset$selectedObs.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_dataset$selectedObs2 = dataset.selectedObs) === null || _dataset$selectedObs2 === void 0 ? void 0 : _dataset$selectedObs2.codes), (_dataset$selectedObs3 = dataset.selectedObs) === null || _dataset$selectedObs3 === void 0 ? void 0 : _dataset$selectedObs3.omit).map(c => {
51
+ var _dataset$selectedObs4;
52
+ return (_dataset$selectedObs4 = dataset.selectedObs) === null || _dataset$selectedObs4 === void 0 ? void 0 : _dataset$selectedObs4.codesMap[c];
53
+ })
54
+ }
55
+ }[mode]
34
56
  });
35
57
  // @TODO: set default scale
36
58
 
@@ -45,8 +67,12 @@ function Violin(_ref) {
45
67
  return {
46
68
  ...p,
47
69
  url: dataset.url,
48
- keys: dataset.selectedMultiVar.map(i => i.index),
49
- scale: dataset.controls.standardScale,
70
+ mode: mode,
71
+ varKeys: dataset.selectedMultiVar.map(i => i.isSet ? {
72
+ name: i.name,
73
+ indices: i.vars.map(v => v.index)
74
+ } : i.index),
75
+ scale: dataset.controls.scale.violinplot.value,
50
76
  varNamesCol: dataset.varNamesCol
51
77
  };
52
78
  });
@@ -57,23 +83,32 @@ function Violin(_ref) {
57
83
  setHasSelections(false);
58
84
  }
59
85
  setParams(p => {
86
+ var _dataset$selectedVar5, _dataset$selectedVar6, _dataset$selectedVar7, _dataset$selectedVar8, _dataset$selectedObs5, _dataset$selectedObs6, _dataset$selectedObs7;
60
87
  return {
61
88
  ...p,
62
89
  url: dataset.url,
63
- keys: dataset.selectedVar.index,
64
- selectedObs: dataset.selectedObs,
65
- scale: dataset.controls.standardScale,
90
+ mode: mode,
91
+ varKey: (_dataset$selectedVar5 = dataset.selectedVar) !== null && _dataset$selectedVar5 !== void 0 && _dataset$selectedVar5.isSet ? {
92
+ name: (_dataset$selectedVar6 = dataset.selectedVar) === null || _dataset$selectedVar6 === void 0 ? void 0 : _dataset$selectedVar6.name,
93
+ indices: (_dataset$selectedVar7 = dataset.selectedVar) === null || _dataset$selectedVar7 === void 0 ? void 0 : _dataset$selectedVar7.vars.map(v => v.index)
94
+ } : (_dataset$selectedVar8 = dataset.selectedVar) === null || _dataset$selectedVar8 === void 0 ? void 0 : _dataset$selectedVar8.index,
95
+ obsCol: dataset.selectedObs,
96
+ obsValues: !((_dataset$selectedObs5 = dataset.selectedObs) !== null && _dataset$selectedObs5 !== void 0 && _dataset$selectedObs5.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_dataset$selectedObs6 = dataset.selectedObs) === null || _dataset$selectedObs6 === void 0 ? void 0 : _dataset$selectedObs6.codes), (_dataset$selectedObs7 = dataset.selectedObs) === null || _dataset$selectedObs7 === void 0 ? void 0 : _dataset$selectedObs7.omit).map(c => {
97
+ var _dataset$selectedObs8;
98
+ return (_dataset$selectedObs8 = dataset.selectedObs) === null || _dataset$selectedObs8 === void 0 ? void 0 : _dataset$selectedObs8.codesMap[c];
99
+ }),
100
+ scale: dataset.controls.scale.violinplot.value,
66
101
  varNamesCol: dataset.varNamesCol
67
102
  };
68
103
  });
69
104
  }
70
- }, [dataset.controls.standardScale, dataset.selectedMultiVar, dataset.selectedObs, dataset.selectedVar, dataset.url, dataset.varNamesCol, mode]);
105
+ }, [dataset.controls.scale.violinplot.value, dataset.selectedMultiVar, dataset.selectedObs, dataset.selectedVar, dataset.url, dataset.varNamesCol, mode]);
71
106
  const {
72
107
  fetchedData,
73
108
  isPending,
74
109
  serverError
75
110
  } = (0, _requests.useDebouncedFetch)(ENDPOINT, params, 500, {
76
- enabled: mode === _constants.VIOLIN_MODES.MULTIKEY && !!params.keys || mode === _constants.VIOLIN_MODES.GROUPBY && !!params.keys.length && !!params.selectedObs
111
+ enabled: mode === _constants.VIOLIN_MODES.MULTIKEY && (!!params.varKeys.length || !!params.obsKeys.length) || mode === _constants.VIOLIN_MODES.GROUPBY && !!params.varKey && !!params.obsCol
77
112
  });
78
113
  (0, _react.useEffect)(() => {
79
114
  if (hasSelections && !isPending && !serverError) {
@@ -85,9 +120,7 @@ function Violin(_ref) {
85
120
  if (hasSelections) {
86
121
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
87
122
  className: "cherita-violin position-relative",
88
- children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
89
- children: mode
90
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
123
+ children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
91
124
  data: data,
92
125
  layout: layout,
93
126
  useResizeHandler: true,
@@ -4,44 +4,39 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.ViolinControls = ViolinControls;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _lodash = _interopRequireDefault(require("lodash"));
8
9
  var _reactBootstrap = require("react-bootstrap");
9
10
  var _constants = require("../../constants/constants");
10
11
  var _DatasetContext = require("../../context/DatasetContext");
11
12
  var _jsxRuntime = require("react/jsx-runtime");
12
- function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
13
- function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
14
  function ViolinControls() {
15
15
  const dataset = (0, _DatasetContext.useDataset)();
16
16
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
17
- const [activeStandardScale, setActiveStandardScale] = (0, _react.useState)(dataset.controls.standardScale);
18
- (0, _react.useEffect)(() => {
19
- if (dataset.controls.standardScale) {
20
- setActiveStandardScale(_constants.VIOLINPLOT_STANDARDSCALES.find(obs => obs.value === dataset.controls.standardScale).name);
21
- }
22
- }, [dataset.controls.standardScale]);
23
- const standardScaleList = _constants.VIOLINPLOT_STANDARDSCALES.map(item => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
24
- active: activeStandardScale === item.value,
17
+ const scaleList = _lodash.default.values(_constants.VIOLINPLOT_SCALES).map(scale => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
18
+ active: dataset.controls.scale.violinplot === scale,
25
19
  onClick: () => {
26
20
  dispatch({
27
- type: "set.controls.standardScale",
28
- standardScale: item.value
21
+ type: "set.controls.scale",
22
+ plot: "violinplot",
23
+ scale: scale
29
24
  });
30
25
  },
31
- children: item.name
32
- }, item.value));
26
+ children: scale.name
27
+ }, scale.value));
33
28
  return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ButtonToolbar, {
34
29
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ButtonGroup, {
35
30
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.InputGroup, {
36
31
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.InputGroup.Text, {
37
- children: "Standard scale"
32
+ children: "Scale"
38
33
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Dropdown, {
39
34
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Toggle, {
40
35
  id: "dropdownStandardScale",
41
36
  variant: "light",
42
- children: activeStandardScale
37
+ children: dataset.controls.scale.violinplot.name
43
38
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Menu, {
44
- children: standardScaleList
39
+ children: scaleList
45
40
  })]
46
41
  })]
47
42
  })
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.VIOLIN_MODES = exports.VIOLINPLOT_STANDARDSCALES = exports.UNSELECTED_POLYGON_FILLCOLOR = exports.SELECTION_MODES = exports.SELECTED_POLYGON_FILLCOLOR = exports.OBS_TYPES = exports.MATRIXPLOT_STANDARDSCALES = exports.LOCAL_STORAGE_KEY = exports.DOTPLOT_STANDARDSCALES = exports.COLOR_ENCODINGS = void 0;
6
+ exports.VIOLIN_MODES = exports.VIOLINPLOT_SCALES = exports.UNSELECTED_POLYGON_FILLCOLOR = exports.SELECTION_MODES = exports.SELECTED_POLYGON_FILLCOLOR = exports.OBS_TYPES = exports.MATRIXPLOT_SCALES = exports.LOCAL_STORAGE_KEY = exports.DOTPLOT_SCALES = exports.COLOR_ENCODINGS = void 0;
7
7
  const LOCAL_STORAGE_KEY = exports.LOCAL_STORAGE_KEY = "CHERITA";
8
8
  const COLOR_ENCODINGS = exports.COLOR_ENCODINGS = {
9
9
  VAR: "var",
@@ -12,7 +12,8 @@ const COLOR_ENCODINGS = exports.COLOR_ENCODINGS = {
12
12
  const OBS_TYPES = exports.OBS_TYPES = {
13
13
  CATEGORICAL: "categorical",
14
14
  DISCRETE: "discrete",
15
- CONTINUOUS: "continuous"
15
+ CONTINUOUS: "continuous",
16
+ BOOLEAN: "boolean"
16
17
  };
17
18
  const SELECTED_POLYGON_FILLCOLOR = exports.SELECTED_POLYGON_FILLCOLOR = [107, 170, 209, 255 / 2];
18
19
  const UNSELECTED_POLYGON_FILLCOLOR = exports.UNSELECTED_POLYGON_FILLCOLOR = [167, 191, 211, 255 / 3];
@@ -24,30 +25,41 @@ const VIOLIN_MODES = exports.VIOLIN_MODES = {
24
25
  MULTIKEY: "multikey",
25
26
  GROUPBY: "groupby"
26
27
  };
27
- const MATRIXPLOT_STANDARDSCALES = exports.MATRIXPLOT_STANDARDSCALES = [{
28
- value: null,
29
- name: "None"
30
- }, {
31
- value: "group",
32
- name: "Group"
33
- }, {
34
- value: "var",
35
- name: "Var"
36
- }];
37
- const DOTPLOT_STANDARDSCALES = exports.DOTPLOT_STANDARDSCALES = [{
38
- value: null,
39
- name: "None"
40
- }, {
41
- value: "group",
42
- name: "Group"
43
- }, {
44
- value: "var",
45
- name: "Var"
46
- }];
47
- const VIOLINPLOT_STANDARDSCALES = exports.VIOLINPLOT_STANDARDSCALES = [{
48
- value: "width",
49
- name: "Width"
50
- }, {
51
- value: "count",
52
- name: "Count"
53
- }];
28
+ const MATRIXPLOT_SCALES = exports.MATRIXPLOT_SCALES = {
29
+ NONE: {
30
+ value: null,
31
+ name: "None"
32
+ },
33
+ GROUP: {
34
+ value: "group",
35
+ name: "Group"
36
+ },
37
+ VAR: {
38
+ value: "var",
39
+ name: "Var"
40
+ }
41
+ };
42
+ const DOTPLOT_SCALES = exports.DOTPLOT_SCALES = {
43
+ NONE: {
44
+ value: null,
45
+ name: "None"
46
+ },
47
+ GROUP: {
48
+ value: "group",
49
+ name: "Group"
50
+ },
51
+ VAR: {
52
+ value: "var",
53
+ name: "Var"
54
+ }
55
+ };
56
+ const VIOLINPLOT_SCALES = exports.VIOLINPLOT_SCALES = {
57
+ WIDTH: {
58
+ value: "width",
59
+ name: "Width"
60
+ },
61
+ COUNT: {
62
+ value: "count",
63
+ name: "Count"
64
+ }
65
+ };
@@ -12,6 +12,7 @@ var _querySyncStoragePersister = require("@tanstack/query-sync-storage-persister
12
12
  var _reactQuery = require("@tanstack/react-query");
13
13
  var _reactQueryPersistClient = require("@tanstack/react-query-persist-client");
14
14
  var _lodash = _interopRequireDefault(require("lodash"));
15
+ var _FilterContext = require("./FilterContext");
15
16
  var _constants = require("../constants/constants");
16
17
  var _jsxRuntime = require("react/jsx-runtime");
17
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
@@ -27,12 +28,12 @@ const queryClient = new _reactQuery.QueryClient({
27
28
  },
28
29
  queryCache: new _reactQuery.QueryCache({
29
30
  onError: (error, query) => {
30
- console.error(error);
31
+ console.error(error, query);
31
32
  }
32
33
  })
33
34
  });
34
35
  // Type of queries to store responses
35
- const persistKeys = ["obs/cols", "var/names", "obsm/keys"];
36
+ const persistKeys = ["obs/cols", "var/names", "obsm/keys", "var/histograms", "obs/bins", "obs/distribution"];
36
37
  const persistOptions = {
37
38
  persister: (0, _querySyncStoragePersister.createSyncStoragePersister)({
38
39
  storage: window.localStorage
@@ -60,6 +61,7 @@ const initialDataset = {
60
61
  selectedMultiVar: [],
61
62
  colorEncoding: null,
62
63
  labelObs: [],
64
+ varSets: [],
63
65
  sliceBy: {
64
66
  obs: false,
65
67
  polygons: false
@@ -74,16 +76,16 @@ const initialDataset = {
74
76
  cmin: 0,
75
77
  cmax: 1
76
78
  },
77
- standardScale: null,
79
+ scale: {
80
+ dotplot: _constants.DOTPLOT_SCALES.NONE,
81
+ matrixplot: _constants.MATRIXPLOT_SCALES.NONE,
82
+ violinplot: _constants.VIOLINPLOT_SCALES.WIDTH
83
+ },
78
84
  meanOnlyExpressed: false,
79
85
  expressionCutoff: 0.0
80
86
  },
81
87
  diseaseDatasets: [],
82
- selectedDisease: {
83
- id: null,
84
- name: null,
85
- genes: []
86
- }
88
+ selectedDisease: null
87
89
  };
88
90
  const initializer = initialState => {
89
91
  const localObj = (JSON.parse(localStorage.getItem(_constants.LOCAL_STORAGE_KEY)) || {})[initialState.url] || {};
@@ -123,7 +125,9 @@ function DatasetProvider(_ref2) {
123
125
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactQueryPersistClient.PersistQueryClientProvider, {
124
126
  client: queryClient,
125
127
  persistOptions: persistOptions,
126
- children: children
128
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FilterContext.FilterProvider, {
129
+ children: children
130
+ })
127
131
  })
128
132
  })
129
133
  });
@@ -145,6 +149,11 @@ function datasetReducer(dataset, action) {
145
149
  controls: {
146
150
  ...dataset.controls,
147
151
  range: ((_action$obs = action.obs) === null || _action$obs === void 0 ? void 0 : _action$obs.type) === _constants.OBS_TYPES.CATEGORICAL ? [0, 1] : dataset.controls.range
152
+ },
153
+ colorEncoding: dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && !action.obs ? null : dataset.colorEncoding,
154
+ sliceBy: {
155
+ ...dataset.sliceBy,
156
+ obs: action.obs ? dataset.sliceBy.obs : false
148
157
  }
149
158
  };
150
159
  }
@@ -164,7 +173,7 @@ function datasetReducer(dataset, action) {
164
173
  }
165
174
  case "select.multivar":
166
175
  {
167
- if (dataset.selectedMultiVar.find(i => _lodash.default.isEqual(i, action.var))) {
176
+ if (dataset.selectedMultiVar.find(i => action.var.isSet ? i.name === action.var.name : i.matrix_index === action.var.matrix_index)) {
168
177
  return dataset;
169
178
  } else {
170
179
  return {
@@ -173,19 +182,23 @@ function datasetReducer(dataset, action) {
173
182
  };
174
183
  }
175
184
  }
176
- case "deselect.var":
185
+ case "deselect.multivar":
177
186
  {
178
187
  return {
179
188
  ...dataset,
180
- selectedVar: null,
181
- colorEncoding: dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? null : dataset.colorEncoding
189
+ selectedMultiVar: dataset.selectedMultiVar.filter(a => action.var.isSet ? a.name !== action.var.name : a.matrix_index !== action.var.matrix_index)
182
190
  };
183
191
  }
184
- case "deselect.multivar":
192
+ case "update.multivar":
185
193
  {
186
194
  return {
187
195
  ...dataset,
188
- selectedMultiVar: dataset.selectedMultiVar.filter(a => a.matrix_index !== action.var.matrix_index)
196
+ selelectedMultiVar: dataset.selectedMultiVar.map(i => {
197
+ if (i.isSet) {
198
+ return action.vars.find(s => s.name === i.name);
199
+ }
200
+ return i;
201
+ })
189
202
  };
190
203
  }
191
204
  case "set.colorEncoding":
@@ -211,24 +224,72 @@ function datasetReducer(dataset, action) {
211
224
  colorEncoding: dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? null : dataset.colorEncoding
212
225
  };
213
226
  }
214
- case "select.disease":
227
+ case "add.varSet":
215
228
  {
216
229
  return {
217
230
  ...dataset,
218
- selectedDisease: {
219
- id: action.id,
220
- name: action.name,
221
- genes: []
222
- }
231
+ varSets: [...dataset.varSets, action.varSet]
232
+ };
233
+ }
234
+ case "remove.varSet":
235
+ {
236
+ return {
237
+ ...dataset,
238
+ varSets: dataset.varSets.filter(a => a.name !== action.varSet.name)
239
+ };
240
+ }
241
+ case "reset.varSets":
242
+ {
243
+ return {
244
+ ...dataset,
245
+ varSets: []
223
246
  };
224
247
  }
225
- case "set.disease.genes":
248
+ case "add.varSet.var":
249
+ {
250
+ const varSet = dataset.varSets.find(s => s.name === action.varSet.name);
251
+ if (varSet.vars.find(v => _lodash.default.isEqual(v, action.var))) {
252
+ return dataset;
253
+ } else {
254
+ return {
255
+ ...dataset,
256
+ varSets: dataset.varSets.map(s => {
257
+ if (s.name === varSet.name) {
258
+ return {
259
+ ...s,
260
+ vars: [...s.vars, action.var]
261
+ };
262
+ } else {
263
+ return s;
264
+ }
265
+ })
266
+ };
267
+ }
268
+ }
269
+ case "remove.varSet.var":
270
+ {
271
+ const varSet = dataset.varSets.find(s => s.name === action.varSet.name);
272
+ return {
273
+ ...dataset,
274
+ varSets: dataset.varSets.map(s => {
275
+ if (s.name === varSet.name) {
276
+ return {
277
+ ...s,
278
+ vars: s.vars.filter(v => v.name !== action.var.name)
279
+ };
280
+ } else {
281
+ return s;
282
+ }
283
+ })
284
+ };
285
+ }
286
+ case "select.disease":
226
287
  {
227
288
  return {
228
289
  ...dataset,
229
290
  selectedDisease: {
230
- ...dataset.selectedDisease,
231
- genes: action.genes
291
+ id: action.id,
292
+ name: action.name
232
293
  }
233
294
  };
234
295
  }
@@ -236,11 +297,7 @@ function datasetReducer(dataset, action) {
236
297
  {
237
298
  return {
238
299
  ...dataset,
239
- selectedDisease: {
240
- id: null,
241
- name: null,
242
- genes: []
243
- }
300
+ selectedDisease: null
244
301
  };
245
302
  }
246
303
  case "set.controls.colorScale":
@@ -323,13 +380,16 @@ function datasetReducer(dataset, action) {
323
380
  }
324
381
  };
325
382
  }
326
- case "set.controls.standardScale":
383
+ case "set.controls.scale":
327
384
  {
328
385
  return {
329
386
  ...dataset,
330
387
  controls: {
331
388
  ...dataset.controls,
332
- standardScale: action.standardScale
389
+ scale: {
390
+ ...dataset.controls.scale,
391
+ [action.plot]: action.scale
392
+ }
333
393
  }
334
394
  };
335
395
  }
@@ -0,0 +1,76 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.FilterProvider = FilterProvider;
7
+ exports.FilteredDataDispatchContext = exports.FilteredDataContext = void 0;
8
+ exports.useFilteredData = useFilteredData;
9
+ exports.useFilteredDataDispatch = useFilteredDataDispatch;
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
13
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
+ const FilteredDataContext = exports.FilteredDataContext = /*#__PURE__*/(0, _react.createContext)(null);
15
+ const FilteredDataDispatchContext = exports.FilteredDataDispatchContext = /*#__PURE__*/(0, _react.createContext)(null);
16
+ const initialFilterData = {
17
+ obsIndices: [],
18
+ varIndices: []
19
+ };
20
+ function FilterProvider(_ref) {
21
+ let {
22
+ children
23
+ } = _ref;
24
+ const [filteredData, dispatch] = (0, _react.useReducer)(filterReducer, {
25
+ ...initialFilterData
26
+ });
27
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(FilteredDataContext.Provider, {
28
+ value: filteredData,
29
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(FilteredDataDispatchContext.Provider, {
30
+ value: dispatch,
31
+ children: children
32
+ })
33
+ });
34
+ }
35
+ function useFilteredData() {
36
+ return (0, _react.useContext)(FilteredDataContext);
37
+ }
38
+ function useFilteredDataDispatch() {
39
+ return (0, _react.useContext)(FilteredDataDispatchContext);
40
+ }
41
+ function filterReducer(filteredData, action) {
42
+ switch (action.type) {
43
+ case "set.obs.indices":
44
+ {
45
+ return {
46
+ ...filteredData,
47
+ obsIndices: action.indices
48
+ };
49
+ }
50
+ case "reset.obs.indices":
51
+ {
52
+ return {
53
+ ...filteredData,
54
+ obsIndices: []
55
+ };
56
+ }
57
+ case "set.var.indices":
58
+ {
59
+ return {
60
+ ...filteredData,
61
+ varIndices: action.indices
62
+ };
63
+ }
64
+ case "reset.var.indices":
65
+ {
66
+ return {
67
+ ...filteredData,
68
+ varIndices: []
69
+ };
70
+ }
71
+ default:
72
+ {
73
+ throw Error("Unknown action: " + action.type);
74
+ }
75
+ }
76
+ }
@@ -7,28 +7,33 @@ exports.MapHelper = void 0;
7
7
  var _core = require("@deck.gl/core");
8
8
  class MapHelper {
9
9
  fitBounds(coords) {
10
+ let {
11
+ width = 400,
12
+ height = 600
13
+ } = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {
14
+ width: 400,
15
+ height: 600
16
+ };
10
17
  let view = new _core.WebMercatorViewport({
11
- width: 600,
12
- height: 400,
13
- longitude: -122.45,
14
- latitude: 37.78,
15
- zoom: 12,
16
- pitch: 30,
17
- bearing: 15
18
+ width: width,
19
+ height: height,
20
+ longitude: 0,
21
+ latitude: 0,
22
+ zoom: 12
18
23
  });
19
- let latMin = 90;
20
- let latMax = -90;
21
- let lonMin = 180;
22
- let lonMax = -180;
24
+ let latMin = Infinity;
25
+ let latMax = -Infinity;
26
+ let lonMin = Infinity;
27
+ let lonMax = -Infinity;
28
+ const RECT_LON_INDEX = 0;
29
+ const RECT_LAT_INDEX = 1;
23
30
  coords.forEach(function (coord) {
24
- const RECT_LAT_INDEX = "0";
25
- const RECT_LON_INDEX = "1";
26
31
  if (coord[RECT_LAT_INDEX] < latMin) latMin = coord[RECT_LAT_INDEX];
27
32
  if (coord[RECT_LAT_INDEX] > latMax) latMax = coord[RECT_LAT_INDEX];
28
33
  if (coord[RECT_LON_INDEX] < lonMin) lonMin = coord[RECT_LON_INDEX];
29
34
  if (coord[RECT_LON_INDEX] > lonMax) lonMax = coord[RECT_LON_INDEX];
30
35
  });
31
- const bounds = [[lonMin, latMax], [lonMax, latMin]];
36
+ const bounds = [[lonMin, latMin], [lonMax, latMax]];
32
37
  const {
33
38
  longitude,
34
39
  latitude,
@@ -36,7 +41,7 @@ class MapHelper {
36
41
  } = view.fitBounds(bounds, {
37
42
  padding: {
38
43
  top: 50,
39
- bottom: 50,
44
+ bottom: 70,
40
45
  left: 50,
41
46
  right: 50
42
47
  }