@haniffalab/cherita-react 0.2.0-dev.2024-09-26.775b9a06 → 0.2.0-dev.2024-09-26.d9293c4c

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.
@@ -5,10 +5,9 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.VarNamesList = VarNamesList;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
- var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
- var _reactFontawesome = require("@fortawesome/react-fontawesome");
10
8
  var _lodash = _interopRequireDefault(require("lodash"));
11
9
  var _reactBootstrap = require("react-bootstrap");
10
+ var _VarItem = require("./VarItem");
12
11
  var _constants = require("../../constants/constants");
13
12
  var _DatasetContext = require("../../context/DatasetContext");
14
13
  var _jsxRuntime = require("react/jsx-runtime");
@@ -23,7 +22,7 @@ function VarNamesList(_ref) {
23
22
  } = _ref;
24
23
  const dataset = (0, _DatasetContext.useDataset)();
25
24
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
26
- const [varButtons, setVarButtons] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? [dataset.selectedVar] : dataset.selectedMultiVar);
25
+ const [varButtons, setVarButtons] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? dataset.selectedVar ? [dataset.selectedVar] : [] : dataset.selectedMultiVar);
27
26
  const [active, setActive] = (0, _react.useState)(mode === _constants.SELECTION_MODES.SINGLE ? (_dataset$selectedVar = dataset.selectedVar) === null || _dataset$selectedVar === void 0 ? void 0 : _dataset$selectedVar.matrix_index : dataset.selectedMultiVar.map(i => i.matrix_index));
28
27
  (0, _react.useEffect)(() => {
29
28
  if (mode === _constants.SELECTION_MODES.SINGLE) {
@@ -50,167 +49,70 @@ function VarNamesList(_ref) {
50
49
  setActive(dataset.selectedMultiVar.map(i => i.matrix_index));
51
50
  }
52
51
  }, [mode, dataset.selectedMultiVar]);
53
- const selectVar = (0, _react.useCallback)(item => {
54
- if (mode === _constants.SELECTION_MODES.SINGLE) {
55
- dispatch({
56
- type: "select.var",
57
- var: item
58
- });
59
- dispatch({
60
- type: "set.colorEncoding",
61
- value: "var"
62
- });
63
- } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
64
- dispatch({
65
- type: "select.multivar",
66
- var: item
67
- });
68
- }
69
- }, [dispatch, mode]);
70
- const removeVar = (0, _react.useCallback)(v => {
71
- setVarButtons(b => {
72
- return b.filter(i => i.name !== v.name);
73
- });
74
- if (mode === _constants.SELECTION_MODES.SINGLE) {
75
- if (active === v.matrix_index) {
76
- dispatch({
77
- type: "deselect.var"
78
- });
79
- }
80
- } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
81
- if (active.includes(v.matrix_index)) {
82
- dispatch({
83
- type: "deselect.multivar",
84
- var: v
85
- });
86
- }
87
- }
88
- }, [active, dispatch, mode]);
89
- const makeList = (0, _react.useCallback)(vars => {
90
- return vars.map(item => {
91
- if (item && mode === _constants.SELECTION_MODES.SINGLE) {
92
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
93
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
94
- className: "d-flex gap-1",
95
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
96
- className: "flex-grow-1",
97
- children: item.name
98
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
99
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
100
- icon: _freeSolidSvgIcons.faCircleInfo
101
- })
102
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
103
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
104
- type: "button",
105
- variant: dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR && active === item.matrix_index ? "primary" : "outline-primary",
106
- className: "m-0 p-0 px-1",
107
- onClick: () => {
108
- selectVar(item);
109
- },
110
- disabled: item.matrix_index === -1,
111
- title: item.matrix_index === -1 ? "Not present in data" : "Set as color encoding",
112
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
113
- icon: _freeSolidSvgIcons.faDroplet
114
- })
115
- }, item.matrix_index)
116
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
117
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
118
- type: "button",
119
- className: "m-0 p-0 px-1",
120
- variant: "outline-secondary",
121
- title: "Remove from list",
122
- onClick: () => removeVar(item),
123
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
124
- icon: _freeSolidSvgIcons.faTrash
125
- })
126
- })
127
- })]
128
- })
129
- }, item.name);
130
- } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
131
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
132
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
133
- className: "d-flex",
134
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
135
- className: "flex-grow-1",
136
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
137
- type: "button",
138
- variant: item.matrix_index !== -1 && _lodash.default.includes(active, item.matrix_index) ? "primary" : "outline-primary",
139
- className: "m-0 p-0 px-1",
140
- onClick: () => {
141
- if (active.includes(item.matrix_index)) {
142
- dispatch({
143
- type: "deselect.multivar",
144
- var: item
145
- });
146
- } else {
147
- selectVar(item);
148
- }
149
- },
150
- disabled: item.matrix_index === -1,
151
- title: item.matrix_index === -1 ? "Not present in data" : "",
152
- children: item.name
153
- }, item.matrix_index)
154
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
155
- children: [" ", /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
156
- icon: _freeSolidSvgIcons.faPlus
157
- })]
158
- })]
159
- })
160
- }, item.name);
161
- } else {
162
- return null;
163
- }
164
- });
165
- }, [active, dataset.colorEncoding, dispatch, mode, removeVar, selectVar]);
166
- const varList = (0, _react.useMemo)(() => {
167
- return makeList(varButtons);
168
- }, [makeList, varButtons]);
169
- const diseaseVarList = (0, _react.useMemo)(() => {
170
- return makeList(dataset.selectedDisease.genes);
171
- }, [makeList, dataset.selectedDisease.genes]);
52
+ const makeListItem = function (item) {
53
+ let isDiseaseGene = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
54
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
55
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_VarItem.VarItem, {
56
+ item: item,
57
+ active: active,
58
+ setVarButtons: setVarButtons,
59
+ mode: mode,
60
+ isDiseaseGene: isDiseaseGene
61
+ })
62
+ }, item.matrix_index);
63
+ };
64
+ const varList = _lodash.default.map(varButtons, item => {
65
+ return makeListItem(item);
66
+ });
67
+ const diseaseVarList = _lodash.default.map(dataset.selectedDisease.genes, item => {
68
+ return makeListItem(item, true);
69
+ });
172
70
  return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
173
71
  className: "position-relative",
174
72
  children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
175
- className: "overflow-auto mt-2",
73
+ className: "overflow-auto mt-3",
176
74
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
75
+ className: "d-flex justify-content-between",
76
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
77
+ children: _lodash.default.capitalize(displayName)
78
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
79
+ variant: "link",
80
+ onClick: () => {
81
+ setVarButtons([]);
82
+ dispatch({
83
+ type: mode === _constants.SELECTION_MODES.SINGLE ? "reset.var" : "reset.multiVar"
84
+ });
85
+ },
86
+ children: "clear"
87
+ })]
88
+ }), !varList.length ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
89
+ variant: "light",
90
+ children: "Search for a feature."
91
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup, {
92
+ children: varList
93
+ }), ((_dataset$selectedDise = dataset.selectedDisease) === null || _dataset$selectedDise === void 0 ? void 0 : _dataset$selectedDise.id) && (!((_dataset$selectedDise2 = dataset.selectedDisease) !== null && _dataset$selectedDise2 !== void 0 && (_dataset$selectedDise2 = _dataset$selectedDise2.genes) !== null && _dataset$selectedDise2 !== void 0 && _dataset$selectedDise2.length) ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
94
+ variant: "light",
95
+ children: "No disease genes found."
96
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
177
97
  children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
178
- className: "d-flex justify-content-between",
98
+ className: "d-flex justify-content-between mt-3",
179
99
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
180
- children: _lodash.default.capitalize(displayName)
100
+ children: "Disease genes"
181
101
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
182
102
  variant: "link",
183
103
  onClick: () => {
184
- setVarButtons([]);
185
104
  dispatch({
186
- type: mode === _constants.SELECTION_MODES.SINGLE ? "reset.var" : "reset.multiVar"
105
+ type: "reset.disease"
187
106
  });
188
107
  },
189
108
  children: "clear"
190
109
  })]
110
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
111
+ children: (_dataset$selectedDise3 = dataset.selectedDisease) === null || _dataset$selectedDise3 === void 0 ? void 0 : _dataset$selectedDise3.name
191
112
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup, {
192
- children: varList
113
+ children: diseaseVarList
193
114
  })]
194
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
195
- children: ((_dataset$selectedDise = dataset.selectedDisease) === null || _dataset$selectedDise === void 0 ? void 0 : _dataset$selectedDise.id) && ((_dataset$selectedDise2 = dataset.selectedDisease) === null || _dataset$selectedDise2 === void 0 || (_dataset$selectedDise2 = _dataset$selectedDise2.genes) === null || _dataset$selectedDise2 === void 0 ? void 0 : _dataset$selectedDise2.length) > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
196
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
197
- className: "d-flex justify-content-between",
198
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("h5", {
199
- children: "Disease genes"
200
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
201
- variant: "link",
202
- onClick: () => {
203
- dispatch({
204
- type: "reset.disease"
205
- });
206
- },
207
- children: "clear"
208
- })]
209
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("p", {
210
- children: (_dataset$selectedDise3 = dataset.selectedDisease) === null || _dataset$selectedDise3 === void 0 ? void 0 : _dataset$selectedDise3.name
211
- }), diseaseVarList]
212
- })
213
- })]
115
+ }))]
214
116
  })
215
117
  });
216
118
  }
@@ -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$selectedObs, _dataset$selectedObs2, _dataset$selectedObs3;
21
23
  let {
22
24
  mode = _constants.VIOLIN_MODES.MULTIKEY
23
25
  } = _ref;
@@ -26,11 +28,21 @@ function Violin(_ref) {
26
28
  const [data, setData] = (0, _react.useState)([]);
27
29
  const [layout, setLayout] = (0, _react.useState)({});
28
30
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
29
- const [params, setParams] = (0, _react.useState)({
31
+ const [params, setParams] = (0, _react.useState)(mode === _constants.VIOLIN_MODES.MULTIKEY ? {
30
32
  url: dataset.url,
31
33
  keys: [],
32
34
  scale: dataset.controls.standardScale,
33
35
  varNamesCol: dataset.varNamesCol
36
+ } : {
37
+ url: dataset.url,
38
+ keys: dataset.selectedVar.index,
39
+ selectedObs: dataset.selectedObs,
40
+ 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 => {
41
+ var _dataset$selectedObs4;
42
+ return (_dataset$selectedObs4 = dataset.selectedObs) === null || _dataset$selectedObs4 === void 0 ? void 0 : _dataset$selectedObs4.codesMap[c];
43
+ }),
44
+ scale: dataset.controls.standardScale,
45
+ varNamesCol: dataset.varNamesCol
34
46
  });
35
47
  // @TODO: set default scale
36
48
 
@@ -57,11 +69,16 @@ function Violin(_ref) {
57
69
  setHasSelections(false);
58
70
  }
59
71
  setParams(p => {
72
+ var _dataset$selectedObs5, _dataset$selectedObs6, _dataset$selectedObs7;
60
73
  return {
61
74
  ...p,
62
75
  url: dataset.url,
63
76
  keys: dataset.selectedVar.index,
64
77
  selectedObs: dataset.selectedObs,
78
+ 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 => {
79
+ var _dataset$selectedObs8;
80
+ return (_dataset$selectedObs8 = dataset.selectedObs) === null || _dataset$selectedObs8 === void 0 ? void 0 : _dataset$selectedObs8.codesMap[c];
81
+ }),
65
82
  scale: dataset.controls.standardScale,
66
83
  varNamesCol: dataset.varNamesCol
67
84
  };
@@ -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];
@@ -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 }; }
@@ -32,7 +33,7 @@ const queryClient = new _reactQuery.QueryClient({
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
@@ -123,7 +124,9 @@ function DatasetProvider(_ref2) {
123
124
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactQueryPersistClient.PersistQueryClientProvider, {
124
125
  client: queryClient,
125
126
  persistOptions: persistOptions,
126
- children: children
127
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FilterContext.FilterProvider, {
128
+ children: children
129
+ })
127
130
  })
128
131
  })
129
132
  });
@@ -145,6 +148,11 @@ function datasetReducer(dataset, action) {
145
148
  controls: {
146
149
  ...dataset.controls,
147
150
  range: ((_action$obs = action.obs) === null || _action$obs === void 0 ? void 0 : _action$obs.type) === _constants.OBS_TYPES.CATEGORICAL ? [0, 1] : dataset.controls.range
151
+ },
152
+ colorEncoding: dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && !action.obs ? null : dataset.colorEncoding,
153
+ sliceBy: {
154
+ ...dataset.sliceBy,
155
+ obs: action.obs ? dataset.sliceBy.obs : false
148
156
  }
149
157
  };
150
158
  }
@@ -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
  }
package/dist/index.js CHANGED
@@ -27,6 +27,12 @@ Object.defineProperty(exports, "DotplotControls", {
27
27
  return _DotplotControls.DotplotControls;
28
28
  }
29
29
  });
30
+ Object.defineProperty(exports, "FilterProvider", {
31
+ enumerable: true,
32
+ get: function () {
33
+ return _FilterContext.FilterProvider;
34
+ }
35
+ });
30
36
  Object.defineProperty(exports, "Heatmap", {
31
37
  enumerable: true,
32
38
  get: function () {
@@ -158,4 +164,5 @@ var _ViolinControls = require("./components/violin/ViolinControls");
158
164
  var _constants = require("./constants/constants");
159
165
  var _colorscales = require("./constants/colorscales");
160
166
  var _DatasetContext = require("./context/DatasetContext");
167
+ var _FilterContext = require("./context/FilterContext");
161
168
  var _Offcanvas = require("./components/Offcanvas");
@@ -0,0 +1,69 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.VirtualizedList = VirtualizedList;
7
+ var _react = _interopRequireWildcard(require("react"));
8
+ var _reactVirtual = require("@tanstack/react-virtual");
9
+ var _jsxRuntime = require("react/jsx-runtime");
10
+ 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); }
11
+ 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; }
12
+ function VirtualizedList(_ref) {
13
+ var _virtualItems$0$start, _virtualItems$;
14
+ let {
15
+ getDataAtIndex,
16
+ count,
17
+ ItemComponent,
18
+ estimateSize = 44,
19
+ overscan = 25,
20
+ maxHeight = "80vh",
21
+ ...props
22
+ } = _ref;
23
+ const [parentNode, setParentNode] = (0, _react.useState)(null);
24
+ const itemVirtualizer = (0, _reactVirtual.useVirtualizer)({
25
+ count: count,
26
+ getScrollElement: () => parentNode,
27
+ estimateSize: () => estimateSize,
28
+ overscan: overscan
29
+ });
30
+ const refCallback = (0, _react.useCallback)(node => {
31
+ setParentNode(node);
32
+ }, []);
33
+ const virtualItems = itemVirtualizer.getVirtualItems();
34
+ (0, _react.useEffect)(() => {
35
+ itemVirtualizer.measure();
36
+ }, [itemVirtualizer, parentNode === null || parentNode === void 0 ? void 0 : parentNode.clientHeight]);
37
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
38
+ ref: refCallback,
39
+ style: {
40
+ overflowY: "auto",
41
+ maxHeight: maxHeight
42
+ },
43
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
44
+ style: {
45
+ height: "".concat(itemVirtualizer.getTotalSize(), "px"),
46
+ width: "100%",
47
+ position: "relative",
48
+ willChange: "transform"
49
+ },
50
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
51
+ style: {
52
+ position: "absolute",
53
+ top: 0,
54
+ left: 0,
55
+ width: "100%",
56
+ transform: "translateY(".concat((_virtualItems$0$start = (_virtualItems$ = virtualItems[0]) === null || _virtualItems$ === void 0 ? void 0 : _virtualItems$.start) !== null && _virtualItems$0$start !== void 0 ? _virtualItems$0$start : 0, "px)")
57
+ },
58
+ children: virtualItems.map(virtualItem => /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
59
+ "data-index": virtualItem.index,
60
+ ref: itemVirtualizer.measureElement,
61
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ItemComponent, {
62
+ ...getDataAtIndex(virtualItem.index),
63
+ ...props
64
+ })
65
+ }, virtualItem.key))
66
+ })
67
+ })
68
+ });
69
+ }
@@ -40,7 +40,7 @@ async function fetchData(endpoint, params) {
40
40
  return await response.json();
41
41
  }
42
42
  const useFetch = function (endpoint, params) {
43
- let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
43
+ let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {};
44
44
  let apiUrl = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
45
45
  const {
46
46
  enabled = true
@@ -72,7 +72,7 @@ const useFetch = function (endpoint, params) {
72
72
  exports.useFetch = useFetch;
73
73
  const useDebouncedFetch = function (endpoint, params) {
74
74
  let delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 500;
75
- let opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
75
+ let opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
76
76
  let apiUrl = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
77
77
  const {
78
78
  enabled = true
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.prettyNumerical = prettyNumerical;
7
+ function prettyNumerical(n) {
8
+ let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
9
+ if (n === 0) {
10
+ return "0";
11
+ } else if (n < 1 / 10 ** precision) {
12
+ return n.toExponential(precision);
13
+ } else {
14
+ return n.toLocaleString(undefined, {
15
+ maximumFractionDigits: precision
16
+ });
17
+ }
18
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haniffalab/cherita-react",
3
- "version": "0.2.0-dev.2024-09-26.775b9a06",
3
+ "version": "0.2.0-dev.2024-09-26.d9293c4c",
4
4
  "author": "",
5
5
  "license": "",
6
6
  "main": "dist/index.js",
@@ -16,6 +16,7 @@
16
16
  "@fortawesome/react-fontawesome": "^0.2.0",
17
17
  "@mui/icons-material": "^5.15.20",
18
18
  "@mui/material": "^5.15.19",
19
+ "@mui/x-charts": "^7.7.1",
19
20
  "@nebula.gl/editor": "^1.0.4",
20
21
  "@nebula.gl/layers": "^1.0.4",
21
22
  "@tanstack/query-sync-storage-persister": "^4.36.1",
@@ -84,5 +85,5 @@
84
85
  "url": "https://github.com/haniffalab/cherita-react/issues"
85
86
  },
86
87
  "homepage": "https://github.com/haniffalab/cherita-react#readme",
87
- "prereleaseSha": "775b9a06d3c2ea887c69919e42fe5e7ba672dd23"
88
+ "prereleaseSha": "d9293c4c3c66bc0c5d0c5012ccc39c0913e7bb93"
88
89
  }