@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
@@ -66,21 +66,43 @@ const useZarr = function (_ref2) {
66
66
  };
67
67
  };
68
68
  exports.useZarr = useZarr;
69
+ const fetchDataFromZarrs = async (inputs, opts) => {
70
+ try {
71
+ const results = await Promise.all(inputs.map(input => fetchDataFromZarr(input.url, input.path, input.s, opts)));
72
+ return results;
73
+ } catch (error) {
74
+ throw new Error(error.message);
75
+ }
76
+ };
77
+ const aggregateData = (inputs, data) => {
78
+ const dataObject = {};
79
+ data.forEach((result, index) => {
80
+ const key = inputs[index].key;
81
+ dataObject[key] = result;
82
+ });
83
+ return dataObject;
84
+ };
69
85
  const useMultipleZarr = function (inputs) {
70
86
  let opts = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
71
- const [results, setResults] = (0, _react.useState)({});
87
+ let agg = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : aggregateData;
88
+ const [data, setData] = (0, _react.useState)(null);
89
+ const [isPending, setIsPending] = (0, _react.useState)(true);
90
+ const [serverError, setServerError] = (0, _react.useState)(null);
72
91
  (0, _react.useEffect)(() => {
73
- const fetchData = async () => {
74
- const results = await Promise.all(inputs.map(input => fetchDataFromZarr(input.url, input.path, input.s, opts)));
75
- const dataObject = {};
76
- results.forEach((result, index) => {
77
- const key = inputs[index].key;
78
- dataObject[key] = result;
79
- });
80
- setResults(dataObject);
81
- };
82
- fetchData();
83
- }, [inputs, opts]);
84
- return results;
92
+ setIsPending(true);
93
+ setServerError(null);
94
+ fetchDataFromZarrs(inputs, opts).then(data => {
95
+ setData(agg(inputs, data));
96
+ }).catch(error => {
97
+ setServerError(error.message);
98
+ }).finally(() => {
99
+ setIsPending(false);
100
+ });
101
+ }, [agg, inputs, opts]);
102
+ return {
103
+ data,
104
+ isPending,
105
+ serverError
106
+ };
85
107
  };
86
108
  exports.useMultipleZarr = useMultipleZarr;
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
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.useVarSearch = exports.useGetDisease = exports.useDiseaseSearch = void 0;
6
+ exports.useVarSearch = exports.useDiseaseSearch = void 0;
7
7
  var _react = require("react");
8
8
  var _requests = require("./requests");
9
9
  var _DatasetContext = require("../context/DatasetContext");
@@ -28,7 +28,6 @@ exports.useDiseaseSearch = useDiseaseSearch;
28
28
  const useVarSearch = () => {
29
29
  const ENDPOINT = "var/names";
30
30
  const dataset = (0, _DatasetContext.useDataset)();
31
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
32
31
  const [params, setParams] = (0, _react.useState)({
33
32
  url: dataset.url,
34
33
  col: dataset.varNamesCol,
@@ -37,62 +36,10 @@ const useVarSearch = () => {
37
36
  const data = (0, _requests.useFetch)(ENDPOINT, params, {
38
37
  enabled: !!params.text.length
39
38
  });
40
- const onSelect = item => {
41
- dispatch({
42
- type: "select.var",
43
- var: item
44
- });
45
- dispatch({
46
- type: "select.multivar",
47
- var: item
48
- });
49
- dispatch({
50
- type: "set.colorEncoding",
51
- value: "var"
52
- });
53
- };
54
39
  return {
55
40
  params,
56
41
  setParams,
57
- data,
58
- onSelect
42
+ data
59
43
  };
60
44
  };
61
- exports.useVarSearch = useVarSearch;
62
- const useGetDisease = () => {
63
- var _dataset$selectedDise, _dataset$selectedDise2, _params$diseaseName;
64
- const ENDPOINT = "disease/genes";
65
- const dataset = (0, _DatasetContext.useDataset)();
66
- const dispatch = (0, _DatasetContext.useDatasetDispatch)();
67
- const [params, setParams] = (0, _react.useState)({
68
- url: dataset.url,
69
- col: dataset.varNamesCol,
70
- diseaseName: (_dataset$selectedDise = dataset.selectedDisease) === null || _dataset$selectedDise === void 0 ? void 0 : _dataset$selectedDise.name,
71
- diseaseDatasets: dataset.diseaseDatasets
72
- });
73
- (0, _react.useEffect)(() => {
74
- setParams(p => {
75
- return {
76
- ...p,
77
- diseaseName: dataset.selectedDisease.name
78
- };
79
- });
80
- }, [(_dataset$selectedDise2 = dataset.selectedDisease) === null || _dataset$selectedDise2 === void 0 ? void 0 : _dataset$selectedDise2.name]);
81
- const {
82
- fetchedData,
83
- isPending,
84
- serverError
85
- } = (0, _requests.useFetch)(ENDPOINT, params, {
86
- enabled: !!((_params$diseaseName = params.diseaseName) !== null && _params$diseaseName !== void 0 && _params$diseaseName.length)
87
- });
88
- (0, _react.useEffect)(() => {
89
- if (!isPending && !serverError) {
90
- dispatch({
91
- type: "set.disease.genes",
92
- genes: fetchedData
93
- });
94
- }
95
- }, [dispatch, fetchedData, isPending, serverError]);
96
- return;
97
- };
98
- exports.useGetDisease = useGetDisease;
45
+ exports.useVarSearch = useVarSearch;
@@ -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.1ea62883",
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": "1ea628835d7acdea1f92e6058e59a72092d535c4"
88
89
  }
@@ -1,101 +0,0 @@
1
- "use strict";
2
-
3
- Object.defineProperty(exports, "__esModule", {
4
- value: true
5
- });
6
- exports.ObsValueList = ObsValueList;
7
- var _react = _interopRequireWildcard(require("react"));
8
- var _reactVirtual = require("@tanstack/react-virtual");
9
- var _lodash = _interopRequireDefault(require("lodash"));
10
- var _reactBootstrap = require("react-bootstrap");
11
- var _jsxRuntime = require("react/jsx-runtime");
12
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
- 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); }
14
- 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; }
15
- function ObsValueList(_ref) {
16
- var _virtualItems$0$start, _virtualItems$;
17
- let {
18
- item,
19
- onChange,
20
- getFillColor
21
- } = _ref;
22
- const [parentNode, setParentNode] = (0, _react.useState)(null);
23
- const valueVirtualizer = (0, _reactVirtual.useVirtualizer)({
24
- count: item.values.length,
25
- getScrollElement: () => parentNode,
26
- estimateSize: () => 44,
27
- overscan: 25
28
- });
29
- const refCallback = (0, _react.useCallback)(node => {
30
- setParentNode(node);
31
- }, []);
32
- const virtualItems = valueVirtualizer.getVirtualItems();
33
- (0, _react.useEffect)(() => {
34
- valueVirtualizer.measure();
35
- }, [valueVirtualizer, parentNode === null || parentNode === void 0 ? void 0 : parentNode.clientHeight]);
36
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
37
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
38
- ref: refCallback,
39
- style: {
40
- overflowY: "auto",
41
- maxHeight: "80vh"
42
- },
43
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
44
- style: {
45
- height: "".concat(valueVirtualizer.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 => {
59
- const value = item.values[virtualItem.index];
60
- return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
61
- "data-index": virtualItem.index,
62
- ref: valueVirtualizer.measureElement,
63
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
64
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
65
- className: "d-flex",
66
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
67
- className: "flex-grow-1",
68
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form.Check, {
69
- // prettier-ignore
70
- className: "obs-value-list-check",
71
- type: "switch",
72
- id: "custom-switch",
73
- label: value,
74
- checked: !_lodash.default.includes(item.omit, item.codes[value]),
75
- onChange: () => onChange(value)
76
- })
77
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
78
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)("svg", {
79
- xmlns: "http://www.w3.org/2000/svg",
80
- width: "24",
81
- height: "24",
82
- fill: "currentColor",
83
- viewBox: "0 0 10 10",
84
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)("rect", {
85
- x: "0",
86
- y: "0",
87
- width: "10",
88
- height: "10",
89
- fill: getFillColor(value)
90
- })
91
- })
92
- })]
93
- })
94
- }, value)
95
- }, virtualItem.key);
96
- })
97
- })
98
- })
99
- })
100
- });
101
- }