@haniffalab/cherita-react 0.2.0-dev.2025-01-22.f523ac5e → 0.2.0-dev.2025-01-28.4d5ab0a4

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 (43) hide show
  1. package/README.md +5 -0
  2. package/dist/components/dotplot/Dotplot.js +19 -26
  3. package/dist/components/dotplot/DotplotControls.js +106 -147
  4. package/dist/components/full-page/FullPage.js +99 -148
  5. package/dist/components/heatmap/Heatmap.js +19 -26
  6. package/dist/components/heatmap/HeatmapControls.js +7 -13
  7. package/dist/components/matrixplot/Matrixplot.js +19 -26
  8. package/dist/components/matrixplot/MatrixplotControls.js +14 -35
  9. package/dist/components/obs-list/ObsItem.js +182 -239
  10. package/dist/components/obs-list/ObsList.js +40 -49
  11. package/dist/components/obs-list/ObsToolbar.js +44 -55
  12. package/dist/components/obsm-list/ObsmList.js +15 -23
  13. package/dist/components/offcanvas/index.js +45 -75
  14. package/dist/components/pseudospatial/Pseudospatial.js +26 -34
  15. package/dist/components/pseudospatial/PseudospatialControls.js +1 -2
  16. package/dist/components/pseudospatial/PseudospatialToolbar.js +37 -65
  17. package/dist/components/scatterplot/Scatterplot.js +74 -89
  18. package/dist/components/scatterplot/ScatterplotControls.js +28 -39
  19. package/dist/components/scatterplot/SpatialControls.js +94 -117
  20. package/dist/components/scatterplot/Toolbox.js +16 -24
  21. package/dist/components/search-bar/SearchBar.js +45 -54
  22. package/dist/components/search-bar/SearchResults.js +36 -49
  23. package/dist/components/var-list/VarItem.js +112 -160
  24. package/dist/components/var-list/VarList.js +81 -124
  25. package/dist/components/var-list/VarListToolbar.js +48 -59
  26. package/dist/components/var-list/VarSet.js +95 -120
  27. package/dist/components/violin/Violin.js +31 -46
  28. package/dist/components/violin/ViolinControls.js +8 -22
  29. package/dist/context/DatasetContext.js +17 -27
  30. package/dist/context/FilterContext.js +8 -12
  31. package/dist/context/ZarrDataContext.js +6 -9
  32. package/dist/helpers/color-helper.js +11 -12
  33. package/dist/helpers/map-helper.js +7 -8
  34. package/dist/helpers/zarr-helper.js +9 -15
  35. package/dist/utils/Histogram.js +34 -41
  36. package/dist/utils/ImageViewer.js +9 -14
  37. package/dist/utils/Legend.js +30 -40
  38. package/dist/utils/LoadingIndicators.js +16 -19
  39. package/dist/utils/VirtualizedList.js +32 -39
  40. package/dist/utils/requests.js +15 -25
  41. package/dist/utils/string.js +4 -9
  42. package/dist/utils/zarrData.js +2 -8
  43. package/package.json +40 -34
@@ -5,29 +5,26 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.LoadingSpinner = exports.LoadingLinear = void 0;
7
7
  var _material = require("@mui/material");
8
- var _jsxRuntime = require("react/jsx-runtime");
9
- const LoadingSpinner = _ref => {
10
- let {
11
- text = null,
12
- disableShrink = false
13
- } = _ref;
14
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
15
- className: "loading-spinner",
16
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.CircularProgress, {
17
- disableShrink: disableShrink
18
- }), text?.length && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
19
- className: "visually-hidden",
20
- children: text
21
- })]
22
- });
8
+ var _react = _interopRequireDefault(require("react"));
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ const LoadingSpinner = ({
11
+ text = null,
12
+ disableShrink = false
13
+ }) => {
14
+ return /*#__PURE__*/_react.default.createElement("div", {
15
+ className: "loading-spinner"
16
+ }, /*#__PURE__*/_react.default.createElement(_material.CircularProgress, {
17
+ disableShrink: disableShrink
18
+ }), text?.length && /*#__PURE__*/_react.default.createElement("span", {
19
+ className: "visually-hidden"
20
+ }, text));
23
21
  };
24
22
  exports.LoadingSpinner = LoadingSpinner;
25
23
  const LoadingLinear = () => {
26
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
24
+ return /*#__PURE__*/_react.default.createElement(_material.Box, {
27
25
  sx: {
28
26
  width: "100%"
29
- },
30
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.LinearProgress, {})
31
- });
27
+ }
28
+ }, /*#__PURE__*/_react.default.createElement(_material.LinearProgress, null));
32
29
  };
33
30
  exports.LoadingLinear = LoadingLinear;
@@ -6,19 +6,18 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.VirtualizedList = VirtualizedList;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactVirtual = require("@tanstack/react-virtual");
9
- var _jsxRuntime = require("react/jsx-runtime");
10
9
  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
10
  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
- let {
14
- getDataAtIndex,
15
- count,
16
- ItemComponent,
17
- estimateSize = 45,
18
- overscan = 25,
19
- maxHeight = "80vh",
20
- ...props
21
- } = _ref;
11
+ function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
12
+ function VirtualizedList({
13
+ getDataAtIndex,
14
+ count,
15
+ ItemComponent,
16
+ estimateSize = 45,
17
+ overscan = 25,
18
+ maxHeight = "80vh",
19
+ ...props
20
+ }) {
22
21
  const [parentNode, setParentNode] = (0, _react.useState)(null);
23
22
  const itemVirtualizer = (0, _reactVirtual.useVirtualizer)({
24
23
  count: count,
@@ -33,36 +32,30 @@ function VirtualizedList(_ref) {
33
32
  (0, _react.useEffect)(() => {
34
33
  itemVirtualizer.measure();
35
34
  }, [itemVirtualizer, parentNode?.clientHeight, getDataAtIndex]);
36
- return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
35
+ return /*#__PURE__*/_react.default.createElement("div", {
37
36
  ref: refCallback,
38
37
  style: {
39
38
  overflowY: "auto",
40
39
  maxHeight: maxHeight
41
- },
42
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
43
- style: {
44
- height: `${itemVirtualizer.getTotalSize()}px`,
45
- width: "100%",
46
- position: "relative",
47
- willChange: "transform"
48
- },
49
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
50
- style: {
51
- position: "absolute",
52
- top: 0,
53
- left: 0,
54
- width: "100%",
55
- transform: `translateY(${virtualItems[0]?.start ?? 0}px)`
56
- },
57
- children: virtualItems.map(virtualItem => /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
58
- "data-index": virtualItem.index,
59
- ref: itemVirtualizer.measureElement,
60
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(ItemComponent, {
61
- ...getDataAtIndex(virtualItem.index),
62
- ...props
63
- })
64
- }, virtualItem.key))
65
- })
66
- })
67
- });
40
+ }
41
+ }, /*#__PURE__*/_react.default.createElement("div", {
42
+ style: {
43
+ height: `${itemVirtualizer.getTotalSize()}px`,
44
+ width: "100%",
45
+ position: "relative",
46
+ willChange: "transform"
47
+ }
48
+ }, /*#__PURE__*/_react.default.createElement("div", {
49
+ style: {
50
+ position: "absolute",
51
+ top: 0,
52
+ left: 0,
53
+ width: "100%",
54
+ transform: `translateY(${virtualItems[0]?.start ?? 0}px)`
55
+ }
56
+ }, virtualItems.map(virtualItem => /*#__PURE__*/_react.default.createElement("div", {
57
+ key: virtualItem.key,
58
+ "data-index": virtualItem.index,
59
+ ref: itemVirtualizer.measureElement
60
+ }, /*#__PURE__*/_react.default.createElement(ItemComponent, _extends({}, getDataAtIndex(virtualItem.index), props)))))));
68
61
  }
@@ -10,10 +10,7 @@ var _usehooks = require("@uidotdev/usehooks");
10
10
  var _lodash = _interopRequireDefault(require("lodash"));
11
11
  var _errors = require("./errors");
12
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
- async function fetchData(endpoint, params) {
14
- let signal = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
15
- let ms = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 300000;
16
- let apiUrl = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
13
+ async function fetchData(endpoint, params, signal = null, ms = 300000, apiUrl = null) {
17
14
  apiUrl = apiUrl || process.env.REACT_APP_API_URL;
18
15
  const controller = new AbortController();
19
16
  const timeout = setTimeout(() => {
@@ -41,12 +38,10 @@ async function fetchData(endpoint, params) {
41
38
  }
42
39
  return await response.json();
43
40
  }
44
- const useFetch = function (endpoint, params) {
45
- let opts = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : {
46
- refetchOnMount: false,
47
- refetchOnWindowFocus: false
48
- };
49
- let apiUrl = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : null;
41
+ const useFetch = (endpoint, params, opts = {
42
+ refetchOnMount: false,
43
+ refetchOnWindowFocus: false
44
+ }, apiUrl = null) => {
50
45
  const {
51
46
  enabled = true
52
47
  } = opts;
@@ -56,10 +51,9 @@ const useFetch = function (endpoint, params) {
56
51
  error: serverError = null
57
52
  } = (0, _reactQuery.useQuery)({
58
53
  queryKey: [endpoint, params],
59
- queryFn: _ref => {
60
- let {
61
- signal
62
- } = _ref;
54
+ queryFn: ({
55
+ signal
56
+ }) => {
63
57
  if (enabled) {
64
58
  return fetchData(endpoint, params, signal, apiUrl);
65
59
  } else {
@@ -75,13 +69,10 @@ const useFetch = function (endpoint, params) {
75
69
  };
76
70
  };
77
71
  exports.useFetch = useFetch;
78
- const useDebouncedFetch = function (endpoint, params) {
79
- let delay = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 500;
80
- let opts = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {
81
- refetchOnMount: false,
82
- refetchOnWindowFocus: false
83
- };
84
- let apiUrl = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : null;
72
+ const useDebouncedFetch = (endpoint, params, delay = 500, opts = {
73
+ refetchOnMount: false,
74
+ refetchOnWindowFocus: false
75
+ }, apiUrl = null) => {
85
76
  const {
86
77
  enabled = true
87
78
  } = opts;
@@ -92,10 +83,9 @@ const useDebouncedFetch = function (endpoint, params) {
92
83
  error: serverError = null
93
84
  } = (0, _reactQuery.useQuery)({
94
85
  queryKey: [endpoint, debouncedParams],
95
- queryFn: _ref2 => {
96
- let {
97
- signal
98
- } = _ref2;
86
+ queryFn: ({
87
+ signal
88
+ }) => {
99
89
  if (enabled) {
100
90
  return fetchData(endpoint, debouncedParams, signal, apiUrl);
101
91
  } else {
@@ -13,33 +13,28 @@ const FORMATS = exports.FORMATS = {
13
13
  ABBREVIATION: "abbreviation",
14
14
  THOUSAND: "thousand"
15
15
  };
16
- function formatThousand(n) {
17
- let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
16
+ function formatThousand(n, precision = 3) {
18
17
  return (0, _numbro.default)(n).format({
19
18
  thousandSeparated: true,
20
19
  mantissa: precision,
21
20
  trimMantissa: true
22
21
  });
23
22
  }
24
- function formatExponential(n) {
25
- let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
23
+ function formatExponential(n, precision = 3) {
26
24
  return (0, _numbro.default)(n).format({
27
25
  exponential: true,
28
26
  mantissa: precision,
29
27
  trimMantissa: true
30
28
  });
31
29
  }
32
- function formatAbbreviation(n) {
33
- let precision = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 3;
30
+ function formatAbbreviation(n, precision = 3) {
34
31
  return (0, _numbro.default)(n).format({
35
32
  average: true,
36
33
  mantissa: precision,
37
34
  trimMantissa: true
38
35
  }).toUpperCase();
39
36
  }
40
- function formatNumerical(n) {
41
- let format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : FORMATS.THOUSAND;
42
- let precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 3;
37
+ function formatNumerical(n, format = FORMATS.THOUSAND, precision = 3) {
43
38
  if (n === 0) {
44
39
  return "0";
45
40
  } else if (!n || n === undefined || isNaN(n)) {
@@ -26,15 +26,9 @@ const useObsmData = () => {
26
26
  };
27
27
  exports.useObsmData = useObsmData;
28
28
  const meanData = (_i, data) => {
29
- return _lodash.default.zipWith(...data, function () {
30
- for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {
31
- values[_key] = arguments[_key];
32
- }
33
- return _lodash.default.mean(values);
34
- });
29
+ return _lodash.default.zipWith(...data, (...values) => _lodash.default.mean(values));
35
30
  };
36
- const useXData = function () {
37
- let agg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : meanData;
31
+ const useXData = (agg = meanData) => {
38
32
  const dataset = (0, _DatasetContext.useDataset)();
39
33
  const [xParams, setXParams] = (0, _react.useState)(!dataset.selectedVar ? [] : !dataset.selectedVar?.isSet ? [{
40
34
  url: dataset.url,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haniffalab/cherita-react",
3
- "version": "0.2.0-dev.2025-01-22.f523ac5e",
3
+ "version": "0.2.0-dev.2025-01-28.4d5ab0a4",
4
4
  "author": "",
5
5
  "license": "",
6
6
  "main": "dist/index.js",
@@ -12,30 +12,30 @@
12
12
  "scss"
13
13
  ],
14
14
  "dependencies": {
15
- "@emotion/react": "^11.11.4",
16
- "@emotion/styled": "^11.11.5",
17
- "@fortawesome/fontawesome-svg-core": "^6.4.0",
18
- "@fortawesome/free-solid-svg-icons": "^6.4.0",
19
- "@fortawesome/react-fontawesome": "^0.2.0",
20
- "@mui/icons-material": "^5.15.20",
21
- "@mui/material": "^5.15.19",
22
- "@mui/x-charts": "^7.7.1",
15
+ "@emotion/react": "^11.14.0",
16
+ "@emotion/styled": "^11.14.0",
17
+ "@fortawesome/fontawesome-svg-core": "^6.7.2",
18
+ "@fortawesome/free-solid-svg-icons": "^6.7.2",
19
+ "@fortawesome/react-fontawesome": "^0.2.2",
20
+ "@mui/icons-material": "^6.4.1",
21
+ "@mui/material": "^6.4.1",
22
+ "@mui/x-charts": "^7.24.1",
23
23
  "@nebula.gl/editor": "^1.0.4",
24
24
  "@nebula.gl/layers": "^1.0.4",
25
- "@tanstack/query-sync-storage-persister": "^4.36.1",
26
- "@tanstack/react-query": "^4.36.1",
27
- "@tanstack/react-query-persist-client": "^4.36.1",
28
- "@tanstack/react-virtual": "^3.7.0",
29
- "@turf/turf": "^7.0.0",
25
+ "@tanstack/query-sync-storage-persister": "^5.64.2",
26
+ "@tanstack/react-query": "^5.64.2",
27
+ "@tanstack/react-query-persist-client": "^5.64.2",
28
+ "@tanstack/react-virtual": "^3.11.2",
29
+ "@turf/turf": "^7.2.0",
30
30
  "@uidotdev/usehooks": "^2.4.1",
31
- "bootstrap": "^5.3.0",
32
- "deck.gl": "^8.9.19",
33
- "jquery": "^3.7.0",
31
+ "bootstrap": "^5.3.3",
32
+ "deck.gl": "^9.1.0",
33
+ "jquery": "^3.7.1",
34
34
  "nebula.gl": "^1.0.4",
35
35
  "numbro": "^2.5.0",
36
- "plotly.js": "^2.23.2",
36
+ "plotly.js": "^2.35.3",
37
37
  "popper.js": "^1.16.1",
38
- "react-bootstrap": "^2.7.4",
38
+ "react-bootstrap": "^2.10.8",
39
39
  "react-plotly.js": "^2.6.0",
40
40
  "react-scripts": "^5.0.1",
41
41
  "zarr": "^0.6.3"
@@ -45,30 +45,36 @@
45
45
  "react-dom": "^18.2.0"
46
46
  },
47
47
  "devDependencies": {
48
- "@babel/cli": "^7.22.5",
49
- "@babel/core": "^7.22.5",
48
+ "@babel/cli": "^7.26.4",
49
+ "@babel/core": "^7.26.7",
50
50
  "@babel/plugin-proposal-private-property-in-object": "^7.21.11",
51
- "@babel/preset-env": "^7.22.5",
52
- "@babel/preset-react": "^7.22.5",
51
+ "@babel/preset-env": "^7.26.7",
52
+ "@babel/preset-react": "^7.26.3",
53
+ "@testing-library/dom": "^10.4.0",
54
+ "@testing-library/jest-dom": "^6.6.3",
55
+ "@testing-library/react": "^16.2.0",
56
+ "babel-jest": "^29.7.0",
53
57
  "cpx": "^1.5.0",
54
- "eslint": "^8.42.0",
55
- "eslint-config-prettier": "^8.8.0",
58
+ "eslint": "^9.18.0",
59
+ "eslint-config-prettier": "^10.0.1",
56
60
  "eslint-config-react-app": "^7.0.1",
57
- "eslint-plugin-import": "^2.29.1",
58
- "prettier": "^3.3.3",
59
- "sass": "^1.79.5",
60
- "stylelint": "^16.10.0",
61
+ "eslint-plugin-import": "^2.31.0",
62
+ "jest": "^29.7.0",
63
+ "jest-environment-jsdom": "^29.7.0",
64
+ "prettier": "^3.4.2",
65
+ "react": "^18.2.0",
66
+ "react-dom": "^18.2.0",
67
+ "sass": "^1.83.4",
68
+ "stylelint": "^16.13.2",
61
69
  "stylelint-config-prettier": "^9.0.5",
62
- "stylelint-config-standard-scss": "^13.1.0"
70
+ "stylelint-config-standard-scss": "^14.0.0"
63
71
  },
64
72
  "scripts": {
65
- "start": "react-scripts start",
66
73
  "build:babel": "babel src/lib --out-dir dist --copy-files",
67
74
  "build:scss": "sass --load-path=node_modules src/scss/cherita-bootstrap.scss dist/css/cherita.css",
68
75
  "copy:scss": "cpx src/scss/**/* scss",
69
76
  "build": "npm run build:babel && npm run build:scss && npm run copy:scss",
70
- "test": "react-scripts test",
71
- "eject": "react-scripts eject",
77
+ "test": "jest --watchAll",
72
78
  "lint:scss": "stylelint 'src/**/*.scss' --fix",
73
79
  "lint:js": "eslint 'src/**/*.js' --fix",
74
80
  "lint": "npm run lint:scss && npm run lint:js",
@@ -101,5 +107,5 @@
101
107
  "url": "https://github.com/haniffalab/cherita-react/issues"
102
108
  },
103
109
  "homepage": "https://github.com/haniffalab/cherita-react#readme",
104
- "prereleaseSha": "f523ac5e8f96d002ae12a191e96c4eb9729c3f98"
110
+ "prereleaseSha": "4d5ab0a4d6e5d07c2fbc7786ad33294b2242d7ac"
105
111
  }