@haniffalab/cherita-react 1.4.1 → 1.4.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (138) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/controls/Controls.js +38 -30
  3. package/dist/cjs/components/dotplot/Dotplot.js +67 -69
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +100 -74
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +89 -44
  8. package/dist/cjs/components/heatmap/Heatmap.js +65 -65
  9. package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
  10. package/dist/cjs/components/icons/DotPlotIcon.js +64 -0
  11. package/dist/cjs/components/icons/HeatmapIcon.js +45 -0
  12. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +57 -0
  13. package/dist/cjs/components/icons/MatrixPlotIcon.js +59 -0
  14. package/dist/cjs/components/icons/ScatterplotIcon.1.js +164 -0
  15. package/dist/cjs/components/icons/ScatterplotIcon.js +144 -0
  16. package/dist/cjs/components/icons/ViolinPlotIcon.js +42 -0
  17. package/dist/cjs/components/matrixplot/Matrixplot.js +65 -66
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +258 -210
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -133
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +53 -38
  23. package/dist/cjs/components/offcanvas/index.js +61 -31
  24. package/dist/cjs/components/pseudospatial/Pseudospatial.js +132 -76
  25. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +122 -74
  26. package/dist/cjs/components/scatterplot/Scatterplot.js +127 -99
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +140 -113
  29. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  30. package/dist/cjs/components/search-bar/SearchBar.js +168 -121
  31. package/dist/cjs/components/search-bar/SearchInfo.js +76 -50
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +46 -37
  34. package/dist/cjs/components/var-list/VarItem.js +115 -88
  35. package/dist/cjs/components/var-list/VarList.js +85 -69
  36. package/dist/cjs/components/var-list/VarListToolbar.js +59 -54
  37. package/dist/cjs/components/var-list/VarSet.js +126 -108
  38. package/dist/cjs/components/violin/Violin.js +109 -107
  39. package/dist/cjs/components/violin/ViolinControls.js +8 -5
  40. package/dist/cjs/constants/colorscales.js +19 -19
  41. package/dist/cjs/constants/constants.js +47 -47
  42. package/dist/cjs/context/DatasetContext.js +24 -16
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +255 -89
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/zarr-helper.js +3 -3
  48. package/dist/cjs/utils/Filter.js +16 -11
  49. package/dist/cjs/utils/Histogram.js +35 -33
  50. package/dist/cjs/utils/ImageViewer.js +11 -8
  51. package/dist/cjs/utils/Legend.js +37 -30
  52. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  53. package/dist/cjs/utils/Resolver.js +213 -0
  54. package/dist/cjs/utils/Skeleton.js +10 -10
  55. package/dist/cjs/utils/StyledTooltip.js +44 -0
  56. package/dist/cjs/utils/VirtualizedList.js +34 -27
  57. package/dist/cjs/utils/errors.js +15 -15
  58. package/dist/cjs/utils/requests.js +21 -9
  59. package/dist/cjs/utils/search.js +4 -4
  60. package/dist/cjs/utils/string.js +6 -6
  61. package/dist/cjs/utils/zarrData.js +20 -21
  62. package/dist/css/cherita.css +64 -42
  63. package/dist/css/cherita.css.map +1 -1
  64. package/dist/esm/components/controls/Controls.js +43 -35
  65. package/dist/esm/components/dotplot/Dotplot.js +77 -78
  66. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  67. package/dist/esm/components/full-page/FullPage.js +120 -93
  68. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  69. package/dist/esm/components/full-page/PlotTypeSelector.js +90 -45
  70. package/dist/esm/components/heatmap/Heatmap.js +75 -74
  71. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  72. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  73. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  74. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  75. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  76. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  77. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  78. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  79. package/dist/esm/components/matrixplot/Matrixplot.js +75 -75
  80. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  81. package/dist/esm/components/obs-list/ObsItem.js +273 -222
  82. package/dist/esm/components/obs-list/ObsList.js +176 -147
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +60 -44
  85. package/dist/esm/components/offcanvas/index.js +67 -37
  86. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  87. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  88. package/dist/esm/components/scatterplot/Scatterplot.js +148 -119
  89. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  90. package/dist/esm/components/scatterplot/SpatialControls.js +153 -125
  91. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  92. package/dist/esm/components/search-bar/SearchBar.js +180 -132
  93. package/dist/esm/components/search-bar/SearchInfo.js +86 -59
  94. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  95. package/dist/esm/components/toolbar/Toolbar.js +49 -39
  96. package/dist/esm/components/var-list/VarItem.js +126 -98
  97. package/dist/esm/components/var-list/VarList.js +99 -82
  98. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  99. package/dist/esm/components/var-list/VarSet.js +134 -115
  100. package/dist/esm/components/violin/Violin.js +121 -118
  101. package/dist/esm/components/violin/ViolinControls.js +10 -6
  102. package/dist/esm/constants/colorscales.js +19 -19
  103. package/dist/esm/constants/constants.js +47 -47
  104. package/dist/esm/context/DatasetContext.js +31 -22
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +257 -90
  107. package/dist/esm/context/ZarrDataContext.js +8 -6
  108. package/dist/esm/helpers/color-helper.js +5 -5
  109. package/dist/esm/helpers/map-helper.js +2 -2
  110. package/dist/esm/helpers/zarr-helper.js +6 -6
  111. package/dist/esm/index.js +22 -22
  112. package/dist/esm/utils/Filter.js +22 -17
  113. package/dist/esm/utils/Histogram.js +39 -37
  114. package/dist/esm/utils/ImageViewer.js +12 -8
  115. package/dist/esm/utils/Legend.js +44 -36
  116. package/dist/esm/utils/LoadingIndicators.js +16 -13
  117. package/dist/esm/utils/Resolver.js +201 -0
  118. package/dist/esm/utils/Skeleton.js +11 -10
  119. package/dist/esm/utils/StyledTooltip.js +38 -0
  120. package/dist/esm/utils/VirtualizedList.js +35 -27
  121. package/dist/esm/utils/errors.js +15 -15
  122. package/dist/esm/utils/requests.js +24 -12
  123. package/dist/esm/utils/search.js +7 -7
  124. package/dist/esm/utils/string.js +7 -7
  125. package/dist/esm/utils/zarrData.js +27 -28
  126. package/package.json +18 -7
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +43 -17
  129. package/scss/components/accordions.scss +4 -1
  130. package/scss/components/layouts.scss +15 -33
  131. package/scss/components/lists.scss +8 -4
  132. package/scss/components/plotly.scss +38 -26
  133. package/scss/components/plots.scss +14 -1
  134. package/dist/assets/images/plots/dotplot.svg +0 -152
  135. package/dist/assets/images/plots/heatmap.svg +0 -193
  136. package/dist/assets/images/plots/matrixplot.svg +0 -275
  137. package/dist/assets/images/plots/scatterplot.svg +0 -198
  138. package/dist/assets/images/plots/violin.svg +0 -50
@@ -5,10 +5,10 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.ZarrDataProvider = ZarrDataProvider;
7
7
  exports.useZarrData = useZarrData;
8
- var _react = _interopRequireWildcard(require("react"));
8
+ var _react = require("react");
9
9
  var _Filter = require("../utils/Filter");
10
10
  var _zarrData = require("../utils/zarrData");
11
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
12
  const ZarrDataContext = /*#__PURE__*/(0, _react.createContext)(null);
13
13
  function ZarrDataProvider(_ref) {
14
14
  let {
@@ -25,9 +25,10 @@ function ZarrDataProvider(_ref) {
25
25
  serverError: obsmData.serverError || obsData.serverError || xData.serverError
26
26
  };
27
27
  (0, _Filter.useFilter)(data);
28
- return /*#__PURE__*/_react.default.createElement(ZarrDataContext.Provider, {
29
- value: data
30
- }, children);
28
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(ZarrDataContext.Provider, {
29
+ value: data,
30
+ children: children
31
+ });
31
32
  }
32
33
  function useZarrData() {
33
34
  return (0, _react.useContext)(ZarrDataContext);
@@ -37,7 +37,7 @@ const computeColor = (colormap, value) => {
37
37
  };
38
38
  const rgbToHex = color => {
39
39
  const [r, g, b] = color || [0, 0, 0, 0];
40
- return "#" + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
40
+ return '#' + ((1 << 24) + (r << 16) + (g << 8) + b).toString(16).slice(1);
41
41
  };
42
42
  exports.rgbToHex = rgbToHex;
43
43
  const useColor = () => {
@@ -54,7 +54,7 @@ const useColor = () => {
54
54
  colorEncoding = settings.colorEncoding,
55
55
  colorscale = null
56
56
  } = _ref;
57
- const colormap = colorscale || _colorscales.COLORSCALES[categorical ? "Accent" : settings.controls.colorScale];
57
+ const colormap = colorscale || _colorscales.COLORSCALES[categorical ? 'Accent' : settings.controls.colorScale];
58
58
  if (colorEncoding) {
59
59
  if (grayOut) {
60
60
  // Mix color with gray manually instead of chroma.mix to get better performance with deck.gl
@@ -28,7 +28,7 @@ class ZarrHelper {
28
28
  const z = await (0, _zarr.openArray)({
29
29
  store: url,
30
30
  path: path,
31
- mode: "r"
31
+ mode: 'r'
32
32
  });
33
33
  return z;
34
34
  }
@@ -60,7 +60,7 @@ const useZarr = function (_ref2) {
60
60
  isLoading: isPending = false,
61
61
  error: serverError = null
62
62
  } = (0, _reactQuery.useQuery)(_objectSpread({
63
- queryKey: ["zarr", url, path, s],
63
+ queryKey: ['zarr', url, path, s],
64
64
  queryFn: () => fetchDataFromZarr(url, path, s, options),
65
65
  retry: (failureCount, _ref3) => {
66
66
  let {
@@ -102,7 +102,7 @@ const useMultipleZarr = function (inputs) {
102
102
  serverError = null
103
103
  } = (0, _reactQuery.useQueries)({
104
104
  queries: inputs.map(input => _objectSpread({
105
- queryKey: ["zarr", input.url, input.path, input.s],
105
+ queryKey: ['zarr', input.url, input.path, input.s],
106
106
  queryFn: () => fetchDataFromZarr(input.url, input.path, input.s, options),
107
107
  retry: (failureCount, _ref4) => {
108
108
  let {
@@ -7,6 +7,7 @@ exports.useFilter = void 0;
7
7
  var _react = require("react");
8
8
  var _turf = require("@turf/turf");
9
9
  var _lodash = _interopRequireDefault(require("lodash"));
10
+ var _Resolver = require("./Resolver");
10
11
  var _constants = require("../constants/constants");
11
12
  var _FilterContext = require("../context/FilterContext");
12
13
  var _SettingsContext = require("../context/SettingsContext");
@@ -36,9 +37,14 @@ const isInValues = (omit, value) => {
36
37
  return !_lodash.default.includes(omit, value);
37
38
  };
38
39
  const useFilter = data => {
39
- var _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3, _settings$selectedObs4, _settings$selectedObs7, _settings$selectedObs8;
40
+ var _selectedObs$omit, _selectedObs$bins2;
40
41
  const settings = (0, _SettingsContext.useSettings)();
41
42
  const filterDataDispatch = (0, _FilterContext.useFilteredDataDispatch)();
43
+ const selectedObs = (0, _Resolver.useSelectedObs)();
44
+ const omitCodes = _lodash.default.map((selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit) || [], o => {
45
+ var _selectedObs$codes;
46
+ return selectedObs === null || selectedObs === void 0 || (_selectedObs$codes = selectedObs.codes) === null || _selectedObs$codes === void 0 ? void 0 : _selectedObs$codes[o];
47
+ });
42
48
  const {
43
49
  obsmData,
44
50
  xData,
@@ -46,26 +52,25 @@ const useFilter = data => {
46
52
  isPending,
47
53
  serverError
48
54
  } = data;
49
- const isCategorical = ((_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.type) === _constants.OBS_TYPES.CATEGORICAL || ((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.type) === _constants.OBS_TYPES.BOOLEAN;
50
- const isContinuous = ((_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.type) === _constants.OBS_TYPES.CONTINUOUS;
51
- const sliceByObs = settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && !!((_settings$selectedObs4 = settings.selectedObs) !== null && _settings$selectedObs4 !== void 0 && _settings$selectedObs4.omit.length) || settings.sliceBy.obs;
55
+ const isCategorical = (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === _constants.OBS_TYPES.CATEGORICAL || (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === _constants.OBS_TYPES.BOOLEAN;
56
+ const isContinuous = (selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.type) === _constants.OBS_TYPES.CONTINUOUS;
57
+ const sliceByObs = settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && !!(selectedObs !== null && selectedObs !== void 0 && (_selectedObs$omit = selectedObs.omit) !== null && _selectedObs$omit !== void 0 && _selectedObs$omit.length) || settings.sliceBy.obs;
52
58
  const isInObsSlice = (0, _react.useCallback)((index, values) => {
53
59
  let inSlice = true;
54
60
  if (values && sliceByObs) {
55
61
  if (isCategorical) {
56
- var _settings$selectedObs5;
57
- inSlice &= isInValues((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.omit, values[index]);
62
+ inSlice &= isInValues(omitCodes, values[index]);
58
63
  } else if (isContinuous) {
59
64
  if (isNaN(values[index])) {
60
- var _settings$selectedObs6;
61
- inSlice &= isInValues((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.omit, -1);
65
+ inSlice &= isInValues(omitCodes, -1);
62
66
  } else {
63
- inSlice &= isInBins(values[index], settings.selectedObs.bins.binEdges, _lodash.default.without(settings.selectedObs.omit, -1));
67
+ var _selectedObs$bins;
68
+ inSlice &= isInBins(values[index], selectedObs === null || selectedObs === void 0 || (_selectedObs$bins = selectedObs.bins) === null || _selectedObs$bins === void 0 ? void 0 : _selectedObs$bins.binEdges, _lodash.default.without(omitCodes, -1));
64
69
  }
65
70
  }
66
71
  }
67
72
  return inSlice;
68
- }, [(_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 || (_settings$selectedObs7 = _settings$selectedObs7.bins) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.binEdges, (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.omit, isCategorical, isContinuous, sliceByObs]);
73
+ }, [sliceByObs, isCategorical, isContinuous, omitCodes, selectedObs === null || selectedObs === void 0 || (_selectedObs$bins2 = selectedObs.bins) === null || _selectedObs$bins2 === void 0 ? void 0 : _selectedObs$bins2.binEdges]);
69
74
  const isInPolygonsSlice = (0, _react.useCallback)((index, positions) => {
70
75
  let inSlice = true;
71
76
  if (settings.sliceBy.polygons && positions) {
@@ -146,7 +151,7 @@ const useFilter = data => {
146
151
  (0, _react.useEffect)(() => {
147
152
  if (!isPending && !serverError) {
148
153
  filterDataDispatch({
149
- type: "set.obs.indices",
154
+ type: 'set.obs.indices',
150
155
  indices: isSliced ? filteredIndices : null,
151
156
  valueMin: valueMin,
152
157
  valueMax: valueMax,
@@ -4,11 +4,11 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Histogram = Histogram;
7
- var _react = _interopRequireDefault(require("react"));
8
7
  var _xCharts = require("@mui/x-charts");
9
8
  var _lodash = _interopRequireDefault(require("lodash"));
10
9
  var _LoadingIndicators = require("./LoadingIndicators");
11
10
  var _string = require("./string");
11
+ var _jsxRuntime = require("react/jsx-runtime");
12
12
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
13
13
  function Histogram(_ref) {
14
14
  var _data$bin_edges;
@@ -17,36 +17,38 @@ function Histogram(_ref) {
17
17
  isPending,
18
18
  altColor = false
19
19
  } = _ref;
20
- return /*#__PURE__*/_react.default.createElement("div", {
21
- className: "feature-histogram-container"
22
- }, isPending ? /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingLinear, null) : data ? /*#__PURE__*/_react.default.createElement("div", {
23
- className: "feature-histogram m-1"
24
- }, /*#__PURE__*/_react.default.createElement(_xCharts.SparkLineChart, {
25
- plotType: "bar",
26
- data: data.log10,
27
- margin: {
28
- top: 0,
29
- right: 0,
30
- bottom: 0,
31
- left: 0
32
- },
33
- colors: altColor ? _xCharts.mangoFusionPalette : _xCharts.blueberryTwilightPalette,
34
- showHighlight: true,
35
- showTooltip: true,
36
- valueFormatter: (v, _ref2) => {
37
- let {
38
- dataIndex
39
- } = _ref2;
40
- return "".concat((0, _string.formatNumerical)(data.hist[dataIndex]));
41
- },
42
- xAxis: {
43
- data: _lodash.default.range((_data$bin_edges = data.bin_edges) === null || _data$bin_edges === void 0 ? void 0 : _data$bin_edges.length) || null,
44
- valueFormatter: v => "Bin [".concat((0, _string.formatNumerical)(data.bin_edges[v][0], _string.FORMATS.EXPONENTIAL), ", ").concat((0, _string.formatNumerical)(data.bin_edges[v][1], _string.FORMATS.EXPONENTIAL)).concat(v === data.bin_edges.length - 1 ? "]" : ")")
45
- },
46
- slotProps: {
47
- popper: {
48
- className: "feature-histogram-tooltip"
49
- }
50
- }
51
- })) : null);
20
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
21
+ className: "feature-histogram-container",
22
+ children: isPending ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingLinear, {}) : data ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
23
+ className: "feature-histogram m-1",
24
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_xCharts.SparkLineChart, {
25
+ plotType: "bar",
26
+ data: data.log10,
27
+ margin: {
28
+ top: 0,
29
+ right: 0,
30
+ bottom: 0,
31
+ left: 0
32
+ },
33
+ colors: altColor ? _xCharts.mangoFusionPalette : _xCharts.blueberryTwilightPalette,
34
+ showHighlight: true,
35
+ showTooltip: true,
36
+ valueFormatter: (v, _ref2) => {
37
+ let {
38
+ dataIndex
39
+ } = _ref2;
40
+ return "".concat((0, _string.formatNumerical)(data.hist[dataIndex]));
41
+ },
42
+ xAxis: {
43
+ data: _lodash.default.range((_data$bin_edges = data.bin_edges) === null || _data$bin_edges === void 0 ? void 0 : _data$bin_edges.length) || null,
44
+ valueFormatter: v => "Bin [".concat((0, _string.formatNumerical)(data.bin_edges[v][0], _string.FORMATS.EXPONENTIAL), ", ").concat((0, _string.formatNumerical)(data.bin_edges[v][1], _string.FORMATS.EXPONENTIAL)).concat(v === data.bin_edges.length - 1 ? ']' : ')')
45
+ },
46
+ slotProps: {
47
+ popper: {
48
+ className: 'feature-histogram-tooltip'
49
+ }
50
+ }
51
+ })
52
+ }) : null
53
+ });
52
54
  }
@@ -4,22 +4,22 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.ImageViewer = void 0;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
8
  var _reactBootstrap = require("react-bootstrap");
9
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
9
+ var _jsxRuntime = require("react/jsx-runtime");
10
10
  const ImageViewer = _ref => {
11
11
  let {
12
12
  src,
13
13
  alt,
14
- className = "img-fluid"
14
+ className = 'img-fluid'
15
15
  } = _ref;
16
16
  const [error, setError] = (0, _react.useState)(false);
17
17
  const handleError = () => {
18
- console.error("Error loading image from src:", src);
18
+ console.error('Error loading image from src:', src);
19
19
  setError(true);
20
20
  };
21
21
  if (!error) {
22
- return /*#__PURE__*/_react.default.createElement("img", {
22
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
23
23
  src: src,
24
24
  alt: alt,
25
25
  className: className,
@@ -27,9 +27,12 @@ const ImageViewer = _ref => {
27
27
  onError: handleError
28
28
  });
29
29
  } else {
30
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
31
- variant: "danger"
32
- }, "Failed to load image"));
30
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
31
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
32
+ variant: "danger",
33
+ children: "Failed to load image"
34
+ })
35
+ });
33
36
  }
34
37
  };
35
38
  exports.ImageViewer = ImageViewer;
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Legend = Legend;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
8
  var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
9
  var _reactFontawesome = require("@fortawesome/react-fontawesome");
10
10
  var _lodash = _interopRequireDefault(require("lodash"));
@@ -12,15 +12,15 @@ var _string = require("./string");
12
12
  var _constants = require("../constants/constants");
13
13
  var _SettingsContext = require("../context/SettingsContext");
14
14
  var _colorHelper = require("../helpers/color-helper");
15
+ var _jsxRuntime = require("react/jsx-runtime");
15
16
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
17
17
  function Legend(_ref) {
18
18
  let {
19
19
  isCategorical = false,
20
20
  min = 0,
21
21
  max = 1,
22
22
  colorscale = null,
23
- addText = ""
23
+ addText = ''
24
24
  } = _ref;
25
25
  const settings = (0, _SettingsContext.useSettings)();
26
26
  const {
@@ -33,41 +33,48 @@ function Legend(_ref) {
33
33
  categorical: isCategorical,
34
34
  colorscale: colorscale
35
35
  }));
36
- return /*#__PURE__*/_react.default.createElement("span", {
37
- key: i,
36
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
38
37
  className: "grad-step",
39
38
  style: {
40
39
  backgroundColor: color
41
40
  }
42
- });
41
+ }, i);
43
42
  });
44
43
  }, [colorscale, getColor, isCategorical]);
45
44
  if (settings.colorEncoding && !isCategorical) {
46
45
  var _settings$selectedVar, _settings$selectedObs;
47
- return /*#__PURE__*/_react.default.createElement("div", {
48
- className: "cherita-legend"
49
- }, /*#__PURE__*/_react.default.createElement("div", {
50
- className: "gradient"
51
- }, /*#__PURE__*/_react.default.createElement("p", {
52
- className: "small m-0 p-0"
53
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
54
- icon: _freeSolidSvgIcons.faDroplet,
55
- className: "me-1"
56
- }), (settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? (_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name : (_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name) + addText), spanList, /*#__PURE__*/_react.default.createElement("span", {
57
- className: "domain-min"
58
- }, (0, _string.formatNumerical)(min, _string.FORMATS.EXPONENTIAL)), /*#__PURE__*/_react.default.createElement("span", {
59
- className: "domain-med"
60
- }, (0, _string.formatNumerical)((min + max) * 0.5, _string.FORMATS.EXPONENTIAL)), /*#__PURE__*/_react.default.createElement("span", {
61
- className: "domain-max"
62
- }, (0, _string.formatNumerical)(max, _string.FORMATS.EXPONENTIAL))));
46
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
47
+ className: "cherita-legend",
48
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
49
+ className: "gradient",
50
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
51
+ className: "small m-0 p-0",
52
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
53
+ icon: _freeSolidSvgIcons.faDroplet,
54
+ className: "me-1"
55
+ }), (settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? (_settings$selectedVar = settings.selectedVar) === null || _settings$selectedVar === void 0 ? void 0 : _settings$selectedVar.name : (_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name) + addText]
56
+ }), spanList, /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
57
+ className: "domain-min",
58
+ children: (0, _string.formatNumerical)(min, _string.FORMATS.EXPONENTIAL)
59
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
60
+ className: "domain-med",
61
+ children: (0, _string.formatNumerical)((min + max) * 0.5, _string.FORMATS.EXPONENTIAL)
62
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
63
+ className: "domain-max",
64
+ children: (0, _string.formatNumerical)(max, _string.FORMATS.EXPONENTIAL)
65
+ })]
66
+ })
67
+ });
63
68
  } else if (settings.colorEncoding === _constants.COLOR_ENCODINGS.OBS && settings.selectedObs) {
64
- return /*#__PURE__*/_react.default.createElement("div", {
65
- className: "cherita-legend categorical"
66
- }, /*#__PURE__*/_react.default.createElement("p", {
67
- className: "legend-text text-end m-0 p-0"
68
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
69
- icon: _freeSolidSvgIcons.faDroplet,
70
- className: "me-2"
71
- }), settings.selectedObs.name));
69
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
70
+ className: "cherita-legend categorical",
71
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
72
+ className: "legend-text text-end m-0 p-0",
73
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
74
+ icon: _freeSolidSvgIcons.faDroplet,
75
+ className: "me-2"
76
+ }), settings.selectedObs.name]
77
+ })
78
+ });
72
79
  }
73
80
  }
@@ -4,28 +4,30 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.LoadingSpinner = exports.LoadingLinear = void 0;
7
- var _react = _interopRequireDefault(require("react"));
8
7
  var _material = require("@mui/material");
9
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
8
+ var _jsxRuntime = require("react/jsx-runtime");
10
9
  const LoadingSpinner = _ref => {
11
10
  let {
12
11
  text = null,
13
12
  disableShrink = false
14
13
  } = _ref;
15
- return /*#__PURE__*/_react.default.createElement("div", {
16
- className: "loading-spinner"
17
- }, /*#__PURE__*/_react.default.createElement(_material.CircularProgress, {
18
- disableShrink: disableShrink
19
- }), (text === null || text === void 0 ? void 0 : text.length) && /*#__PURE__*/_react.default.createElement("span", {
20
- className: "visually-hidden"
21
- }, text));
14
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
15
+ className: "loading-spinner",
16
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.CircularProgress, {
17
+ disableShrink: disableShrink
18
+ }), (text === null || text === void 0 ? void 0 : text.length) && /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
19
+ className: "visually-hidden",
20
+ children: text
21
+ })]
22
+ });
22
23
  };
23
24
  exports.LoadingSpinner = LoadingSpinner;
24
25
  const LoadingLinear = () => {
25
- return /*#__PURE__*/_react.default.createElement(_material.Box, {
26
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
26
27
  sx: {
27
- width: "100%"
28
- }
29
- }, /*#__PURE__*/_react.default.createElement(_material.LinearProgress, null));
28
+ width: '100%'
29
+ },
30
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.LinearProgress, {})
31
+ });
30
32
  };
31
33
  exports.LoadingLinear = LoadingLinear;
@@ -0,0 +1,213 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSettingsVars = exports.useSelectedVar = exports.useSelectedObs = exports.useSelectedMultiVar = exports.useResolver = void 0;
7
+ var _react = require("react");
8
+ var _lodash = _interopRequireDefault(require("lodash"));
9
+ var _requests = require("./requests");
10
+ var _constants = require("../constants/constants");
11
+ var _DatasetContext = require("../context/DatasetContext");
12
+ var _SettingsContext = require("../context/SettingsContext");
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
15
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
16
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
17
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
18
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
19
+ const cleanSettings = settings => {
20
+ var _settings$data$pseudo;
21
+ // Remove obs and vars from settings that are not in data
22
+
23
+ const selectedObs = settings.selectedObs && settings.data.obs[settings.selectedObs.name] ? settings.selectedObs : null;
24
+ const labelObs = _lodash.default.filter(settings.labelObs, obsName => settings.data.obs[obsName]);
25
+ const selectedVar = settings.selectedVar && (settings.selectedVar.isSet ? _lodash.default.every(settings.selectedVar.vars, vv => settings.data.vars[vv.name]) : settings.data.vars[settings.selectedVar.name]) ? settings.selectedVar : null;
26
+ const selectedMultiVar = _lodash.default.filter(settings.selectedMultiVar, v => {
27
+ if (v.isSet) {
28
+ return _lodash.default.every(v.vars, vv => settings.data.vars[vv.name]);
29
+ } else {
30
+ return settings.data.vars[v.name];
31
+ }
32
+ });
33
+ const vars = _lodash.default.filter(settings.vars, v => {
34
+ if (v.isSet) {
35
+ return _lodash.default.every(v.vars, vv => settings.data.vars[vv.name]);
36
+ } else {
37
+ return settings.data.vars[v.name];
38
+ }
39
+ });
40
+ let pseudospatial = settings.pseudospatial;
41
+ if (!_lodash.default.keys(settings.data.pseudospatial).length) {
42
+ pseudospatial = {
43
+ maskSet: null,
44
+ maskValues: null,
45
+ categoricalMode: _constants.PSEUDOSPATIAL_CATEGORICAL_MODES.ACROSS.value
46
+ };
47
+ }
48
+ if (pseudospatial.maskSet && !_lodash.default.includes(_lodash.default.keys(settings.data.pseudospatial), pseudospatial.maskSet)) {
49
+ pseudospatial = _objectSpread(_objectSpread({}, pseudospatial), {}, {
50
+ maskSet: null
51
+ });
52
+ }
53
+ if (pseudospatial.maskValues && !!_lodash.default.difference(pseudospatial.maskValues, ((_settings$data$pseudo = settings.data.pseudospatial) === null || _settings$data$pseudo === void 0 ? void 0 : _settings$data$pseudo[pseudospatial.maskSet]) || []).length) {
54
+ pseudospatial = _objectSpread(_objectSpread({}, pseudospatial), {}, {
55
+ maskValues: null
56
+ });
57
+ }
58
+ return _objectSpread(_objectSpread({}, settings), {}, {
59
+ selectedObs: selectedObs,
60
+ labelObs: labelObs,
61
+ selectedVar: selectedVar,
62
+ selectedMultiVar: selectedMultiVar,
63
+ vars: vars,
64
+ pseudospatial: pseudospatial
65
+ });
66
+ };
67
+ const useResolver = initSettings => {
68
+ const dataset = (0, _DatasetContext.useDataset)();
69
+ const {
70
+ isPseudospatial = false
71
+ } = dataset;
72
+ const [isPending, setisPending] = (0, _react.useState)(true);
73
+ const [resolvedSettings, setResolvedSettings] = (0, _react.useState)(null);
74
+
75
+ // obs
76
+ // all obs should be in initSettings.selectedObs and initSettings.labelObs
77
+ const initObs = _lodash.default.uniqBy(_lodash.default.compact([initSettings.selectedObs, ..._lodash.default.map(initSettings.labelObs, o => ({
78
+ name: o
79
+ }))]), 'name');
80
+ const initObsNames = _lodash.default.map(initObs, o => o.name);
81
+ const [obsParams] = (0, _react.useState)({
82
+ url: dataset.url,
83
+ cols: initObsNames,
84
+ obsParams: _lodash.default.fromPairs(_lodash.default.map(initObs, o => [o.name, {
85
+ bins: o.bins || {}
86
+ }]))
87
+ });
88
+ const {
89
+ fetchedData: obsData,
90
+ isPending: obsDataPending,
91
+ serverError: obsDataError
92
+ } = (0, _requests.useFetch)('obs/cols', obsParams, {
93
+ enabled: !!initObsNames.length
94
+ });
95
+
96
+ // vars
97
+ // all vars should be in initSettings.vars from validation
98
+ const initVars = initSettings.vars;
99
+ const initVarsNames = _lodash.default.flatMap(initVars, v => v.isSet ? _lodash.default.map(v.vars, vv => vv.name) : v.name);
100
+ const [varParams] = (0, _react.useState)({
101
+ url: dataset.url,
102
+ col: dataset.varNamesCol,
103
+ names: initVarsNames
104
+ });
105
+ const {
106
+ fetchedData: varData,
107
+ isPending: varDataPending,
108
+ serverError: varDataError
109
+ } = (0, _requests.useFetch)('var/cols/names', varParams, {
110
+ enabled: !!varParams.names.length
111
+ });
112
+
113
+ // pseudospatial
114
+ const [pseudospatialParams] = (0, _react.useState)({
115
+ url: dataset.url
116
+ });
117
+ const pseudospatialEnabled = isPseudospatial;
118
+ const {
119
+ fetchedData: pseudospatialData,
120
+ isPending: pseudospatialDataPending,
121
+ serverError: pseudospatialDataError
122
+ } = (0, _requests.useFetch)('masks', pseudospatialParams, {
123
+ enabled: pseudospatialEnabled,
124
+ retry: false
125
+ });
126
+
127
+ // Use isPending to help set initial state to true
128
+ (0, _react.useEffect)(() => {
129
+ setisPending(obsDataPending || varDataPending || pseudospatialDataPending);
130
+ }, [obsDataPending, pseudospatialDataPending, varDataPending]);
131
+
132
+ // Use isPending along with other pending states
133
+ // to ensure they've all converged after state updates
134
+ (0, _react.useEffect)(() => {
135
+ if (isPending || obsDataPending || varDataPending || pseudospatialDataPending) {
136
+ return;
137
+ }
138
+ if (obsDataError) {
139
+ console.error('Error fetching obs data:', obsDataError);
140
+ }
141
+ if (varDataError) {
142
+ console.error('Error fetching var data:', varDataError);
143
+ }
144
+ if (pseudospatialDataError) {
145
+ console.error('Error fetching pseudospatial masks data:', pseudospatialDataError);
146
+ }
147
+ const data = {
148
+ obs: obsData ? _lodash.default.fromPairs(_lodash.default.map(obsData, o => [o.name, o])) : {},
149
+ vars: varData ? _lodash.default.fromPairs(_lodash.default.map(varData, v => [v.name, v])) : {},
150
+ pseudospatial: pseudospatialData || {}
151
+ };
152
+ const cleanedSettings = cleanSettings(_objectSpread(_objectSpread({}, initSettings), {}, {
153
+ data: data
154
+ }));
155
+ setResolvedSettings(cleanedSettings);
156
+ }, [initSettings, isPending, obsData, obsDataError, obsDataPending, pseudospatialData, pseudospatialDataError, pseudospatialDataPending, pseudospatialEnabled, varData, varDataError, varDataPending]);
157
+ return resolvedSettings;
158
+ };
159
+ exports.useResolver = useResolver;
160
+ const useSelectedObs = () => {
161
+ const settings = (0, _SettingsContext.useSettings)();
162
+ return (0, _react.useMemo)(() => {
163
+ return settings.selectedObs ? _objectSpread(_objectSpread({}, settings.selectedObs), settings.data.obs[settings.selectedObs.name]) : null;
164
+ }, [settings.data.obs, settings.selectedObs]);
165
+ };
166
+ exports.useSelectedObs = useSelectedObs;
167
+ const useSelectedVar = () => {
168
+ const settings = (0, _SettingsContext.useSettings)();
169
+ return (0, _react.useMemo)(() => {
170
+ if (settings.selectedVar) {
171
+ if (settings.selectedVar.isSet) {
172
+ return _objectSpread(_objectSpread({}, settings.selectedVar), {}, {
173
+ vars: settings.selectedVar.vars.map(v => _objectSpread({}, settings.data.vars[v.name]))
174
+ });
175
+ } else {
176
+ return _objectSpread(_objectSpread({}, settings.selectedVar), settings.data.vars[settings.selectedVar.name]);
177
+ }
178
+ } else {
179
+ return null;
180
+ }
181
+ }, [settings.data.vars, settings.selectedVar]);
182
+ };
183
+ exports.useSelectedVar = useSelectedVar;
184
+ const useSelectedMultiVar = () => {
185
+ const settings = (0, _SettingsContext.useSettings)();
186
+ return (0, _react.useMemo)(() => {
187
+ return _lodash.default.map(settings.selectedMultiVar, v => {
188
+ if (v.isSet) {
189
+ return _objectSpread(_objectSpread({}, v), {}, {
190
+ vars: v.vars.map(vv => _objectSpread({}, settings.data.vars[vv.name]))
191
+ });
192
+ } else {
193
+ return _objectSpread(_objectSpread({}, v), settings.data.vars[v.name]);
194
+ }
195
+ });
196
+ }, [settings.data.vars, settings.selectedMultiVar]);
197
+ };
198
+ exports.useSelectedMultiVar = useSelectedMultiVar;
199
+ const useSettingsVars = () => {
200
+ const settings = (0, _SettingsContext.useSettings)();
201
+ return (0, _react.useMemo)(() => {
202
+ return _lodash.default.map(settings.vars, v => {
203
+ if (v.isSet) {
204
+ return _objectSpread(_objectSpread({}, v), {}, {
205
+ vars: v.vars.map(vv => _objectSpread({}, settings.data.vars[vv.name]))
206
+ });
207
+ } else {
208
+ return _objectSpread(_objectSpread({}, v), settings.data.vars[v.name]);
209
+ }
210
+ });
211
+ }, [settings.data.vars, settings.vars]);
212
+ };
213
+ exports.useSettingsVars = useSettingsVars;