@haniffalab/cherita-react 1.4.1 → 1.4.2-dev.2025-10-29.81a6b906

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 +21 -9
  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
@@ -3,23 +3,24 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
3
3
  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; }
4
4
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
5
  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); }
6
- import React, { useContext, useEffect, useMemo, useState } from "react";
7
- import { faChevronDown, faChevronRight } from "@fortawesome/free-solid-svg-icons";
8
- import { FontAwesomeIcon } from "@fortawesome/react-fontawesome";
9
- import CommentIcon from "@mui/icons-material/Comment";
10
- import JoinInnerIcon from "@mui/icons-material/JoinInner";
11
- import WaterDropIcon from "@mui/icons-material/WaterDrop";
12
- import _ from "lodash";
13
- import { Alert } from "react-bootstrap";
14
- import Accordion from "react-bootstrap/Accordion";
15
- import { useAccordionButton } from "react-bootstrap/AccordionButton";
16
- import AccordionContext from "react-bootstrap/AccordionContext";
17
- import { CategoricalObs, ContinuousObs } from "./ObsItem";
18
- import { COLOR_ENCODINGS, DEFAULT_OBS_GROUP, OBS_TYPES } from "../../constants/constants";
19
- import { useDataset } from "../../context/DatasetContext";
20
- import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
21
- import { LoadingSpinner } from "../../utils/LoadingIndicators";
22
- import { useFetch } from "../../utils/requests";
6
+ import { useContext, useEffect, useMemo, useState } from 'react';
7
+ import { faChevronDown, faChevronRight } from '@fortawesome/free-solid-svg-icons';
8
+ import { FontAwesomeIcon } from '@fortawesome/react-fontawesome';
9
+ import CommentIcon from '@mui/icons-material/Comment';
10
+ import JoinInnerIcon from '@mui/icons-material/JoinInner';
11
+ import WaterDropIcon from '@mui/icons-material/WaterDrop';
12
+ import _ from 'lodash';
13
+ import { Alert } from 'react-bootstrap';
14
+ import Accordion from 'react-bootstrap/Accordion';
15
+ import { useAccordionButton } from 'react-bootstrap/AccordionButton';
16
+ import AccordionContext from 'react-bootstrap/AccordionContext';
17
+ import { COLOR_ENCODINGS, DEFAULT_OBS_GROUP, OBS_TYPES } from '../../constants/constants';
18
+ import { useDataset } from '../../context/DatasetContext';
19
+ import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
20
+ import { LoadingSpinner } from '../../utils/LoadingIndicators';
21
+ import { useFetch } from '../../utils/requests';
22
+ import { CategoricalObs, ContinuousObs } from './ObsItem';
23
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
23
24
  const ObsAccordionToggle = _ref => {
24
25
  let {
25
26
  children,
@@ -33,48 +34,55 @@ const ObsAccordionToggle = _ref => {
33
34
  const decoratedOnClick = useAccordionButton(eventKey, () => {
34
35
  handleAccordionToggle(eventKey, isCurrentEventKey);
35
36
  });
36
- return /*#__PURE__*/React.createElement("div", {
37
- className: "obs-accordion-header ".concat(isCurrentEventKey ? "active" : ""),
38
- onClick: decoratedOnClick
39
- }, /*#__PURE__*/React.createElement("span", {
40
- className: "obs-accordion-header-chevron"
41
- }, /*#__PURE__*/React.createElement(FontAwesomeIcon, {
42
- icon: isCurrentEventKey ? faChevronDown : faChevronRight
43
- })), /*#__PURE__*/React.createElement("span", {
44
- className: "obs-accordion-header-span"
45
- }, children));
37
+ return /*#__PURE__*/_jsxs("div", {
38
+ className: "obs-accordion-header ".concat(isCurrentEventKey ? 'active' : ''),
39
+ onClick: decoratedOnClick,
40
+ children: [/*#__PURE__*/_jsx("span", {
41
+ className: "obs-accordion-header-chevron",
42
+ children: /*#__PURE__*/_jsx(FontAwesomeIcon, {
43
+ icon: isCurrentEventKey ? faChevronDown : faChevronRight
44
+ })
45
+ }), /*#__PURE__*/_jsx("span", {
46
+ className: "obs-accordion-header-span",
47
+ children: children
48
+ })]
49
+ });
46
50
  };
47
51
  export function ObsColsList(_ref2) {
48
- var _settings$selectedObs;
52
+ var _settings$selectedObs, _settings$selectedObs3, _settings$selectedObs4;
49
53
  let {
50
54
  showColor = true,
51
55
  enableObsGroups = true,
52
56
  showSelectedAsActive = false,
53
57
  showHistograms = true
54
58
  } = _ref2;
55
- const ENDPOINT = "obs/cols";
59
+ const ENDPOINT = 'obs/cols';
56
60
  const dataset = useDataset();
57
61
  const settings = useSettings();
58
62
  const dispatch = useSettingsDispatch();
59
63
  const [enableGroups, setEnableGroups] = useState(enableObsGroups);
60
64
  const [obsCols, setObsCols] = useState(null);
61
- const [active, setActive] = useState([...[(_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name]]);
62
- const [params, setParams] = useState({
63
- url: dataset.url
64
- });
65
+ const [active, setActive] = useState([...(settings.selectedObs ? [(_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name] : [])]);
65
66
  const obsGroups = useMemo(() => {
66
67
  var _dataset$obsGroups;
67
68
  return _objectSpread({
68
69
  default: _.union(DEFAULT_OBS_GROUP, (_dataset$obsGroups = dataset.obsGroups) === null || _dataset$obsGroups === void 0 ? void 0 : _dataset$obsGroups.default)
69
- }, _.omit(dataset.obsGroups, "default"));
70
+ }, _.omit(dataset.obsGroups, 'default'));
70
71
  }, [dataset.obsGroups]);
72
+ const [params, setParams] = useState(_objectSpread({
73
+ url: dataset.url
74
+ }, enableGroups ? {
75
+ cols: _.flatten(_.values(obsGroups))
76
+ } : {}));
71
77
  useEffect(() => {
72
78
  setParams(p => {
73
79
  return _objectSpread(_objectSpread({}, p), {}, {
74
80
  url: dataset.url
75
- });
81
+ }, enableGroups ? {
82
+ cols: _.flatten(_.values(obsGroups))
83
+ } : {});
76
84
  });
77
- }, [dataset.url]);
85
+ }, [dataset.url, enableGroups, obsGroups]);
78
86
  const {
79
87
  fetchedData,
80
88
  isPending,
@@ -104,25 +112,34 @@ export function ObsColsList(_ref2) {
104
112
  return d.type !== OBS_TYPES.DISCRETE;
105
113
  });
106
114
  setObsCols(_.keyBy(_.map(filteredData, d => {
115
+ var _settings$selectedObs2;
116
+ if (((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.name) === d.name) {
117
+ return _objectSpread(_objectSpread({}, d), {}, {
118
+ omit: settings.selectedObs.omit || []
119
+ });
120
+ }
107
121
  return _objectSpread(_objectSpread({}, d), {}, {
108
- codesMap: _.invert(d.codes),
109
122
  omit: []
110
123
  });
111
- }), "name"));
124
+ }), 'name'));
112
125
  }
113
- }, [fetchedData, isPending, obsGroups, serverError, enableGroups]);
126
+ }, [fetchedData, isPending, obsGroups, serverError, enableGroups, (_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.name, (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.omit]);
114
127
  useEffect(() => {
115
- if (obsCols) {
116
- var _settings$selectedObs2;
117
- if (!obsCols[(_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.name]) {
118
- setActive([]);
128
+ if (obsCols && settings.selectedObs) {
129
+ const {
130
+ name
131
+ } = settings.selectedObs;
132
+ if (!obsCols[name]) {
119
133
  dispatch({
120
- type: "select.obs",
134
+ type: 'select.obs',
121
135
  obs: null
122
136
  });
137
+ if (active.includes(name)) {
138
+ setActive(prev => _.without(prev, name));
139
+ }
123
140
  }
124
141
  }
125
- }, [settings.selectedObs, dispatch, obsCols]);
142
+ }, [settings.selectedObs, dispatch, obsCols, active]);
126
143
  const handleAccordionToggle = (itemName, isCurrentEventKey) => {
127
144
  if (isCurrentEventKey) {
128
145
  _.delay(() => setActive(prev => _.without(prev, itemName)), 250);
@@ -131,8 +148,8 @@ export function ObsColsList(_ref2) {
131
148
  }
132
149
  };
133
150
  const toggleAll = item => {
134
- var _settings$selectedObs3;
135
- const omit = item.omit.length ? [] : _.map(item.values, v => item.codes[v]);
151
+ var _settings$selectedObs5;
152
+ const omit = item.omit.length ? [] : item.values;
136
153
  setObsCols(o => {
137
154
  return _objectSpread(_objectSpread({}, o), {}, {
138
155
  [item.name]: _objectSpread(_objectSpread({}, item), {}, {
@@ -140,9 +157,9 @@ export function ObsColsList(_ref2) {
140
157
  })
141
158
  });
142
159
  });
143
- if (((_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.name) === item.name) {
160
+ if (((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.name) === item.name) {
144
161
  dispatch({
145
- type: "select.obs",
162
+ type: 'select.obs',
146
163
  obs: _objectSpread(_objectSpread({}, item), {}, {
147
164
  omit: omit
148
165
  })
@@ -150,46 +167,42 @@ export function ObsColsList(_ref2) {
150
167
  }
151
168
  };
152
169
  const toggleLabel = item => {
153
- const inLabelObs = _.some(settings.labelObs, i => i.name === item.name);
170
+ const inLabelObs = _.includes(settings.labelObs, item.name);
154
171
  if (inLabelObs) {
155
172
  dispatch({
156
- type: "remove.label.obs",
173
+ type: 'remove.label.obs',
157
174
  obsName: item.name
158
175
  });
159
176
  } else {
160
177
  dispatch({
161
- type: "add.label.obs",
162
- obs: {
163
- name: item.name,
164
- type: item.type,
165
- codesMap: item.codesMap
166
- }
178
+ type: 'add.label.obs',
179
+ obs: item
167
180
  });
168
181
  }
169
182
  };
170
183
  const toggleSlice = item => {
171
184
  dispatch({
172
- type: "toggle.slice.obs",
185
+ type: 'toggle.slice.obs',
173
186
  obs: item
174
187
  });
175
188
  };
176
189
  const toggleColor = item => {
177
190
  dispatch({
178
- type: "select.obs",
191
+ type: 'select.obs',
179
192
  obs: item
180
193
  });
181
194
  dispatch({
182
- type: "set.colorEncoding",
195
+ type: 'set.colorEncoding',
183
196
  value: COLOR_ENCODINGS.OBS
184
197
  });
185
198
  };
186
199
  const toggleObs = (item, value) => {
187
- var _settings$selectedObs4;
200
+ var _settings$selectedObs6;
188
201
  let omit;
189
- if (_.includes(item.omit, item.codes[value])) {
190
- omit = item.omit.filter(i => i !== item.codes[value]);
202
+ if (_.includes(item.omit, value)) {
203
+ omit = item.omit.filter(i => i !== value);
191
204
  } else {
192
- omit = [...item.omit, item.codes[value]];
205
+ omit = [...item.omit, value];
193
206
  }
194
207
  setObsCols(o => {
195
208
  return _objectSpread(_objectSpread({}, o), {}, {
@@ -198,9 +211,9 @@ export function ObsColsList(_ref2) {
198
211
  })
199
212
  });
200
213
  });
201
- if (((_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.name) === item.name) {
214
+ if (((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name) {
202
215
  dispatch({
203
- type: "select.obs",
216
+ type: 'select.obs',
204
217
  obs: _objectSpread(_objectSpread({}, item), {}, {
205
218
  omit: omit
206
219
  })
@@ -208,107 +221,123 @@ export function ObsColsList(_ref2) {
208
221
  }
209
222
  };
210
223
  const obsItem = item => {
211
- var _settings$selectedObs5, _settings$selectedObs6;
224
+ var _settings$selectedObs7, _settings$selectedObs8;
212
225
  if (!item) {
213
226
  return null;
214
227
  }
215
228
  if (item.type === OBS_TYPES.DISCRETE) {
216
229
  return null;
217
230
  }
218
- const inLabelObs = _.some(settings.labelObs, i => i.name === item.name);
219
- const inSliceObs = settings.sliceBy.obs && ((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.name) === item.name;
220
- const isColorEncoding = (showSelectedAsActive || settings.colorEncoding === COLOR_ENCODINGS.OBS) && ((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name;
221
- return /*#__PURE__*/React.createElement("div", {
231
+ const inLabelObs = _.includes(settings.labelObs, item.name);
232
+ const inSliceObs = settings.sliceBy.obs && ((_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.name) === item.name;
233
+ const isColorEncoding = (showSelectedAsActive || settings.colorEncoding === COLOR_ENCODINGS.OBS) && ((_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.name) === item.name;
234
+ return /*#__PURE__*/_jsxs("div", {
222
235
  className: "accordion-item",
223
- key: item.name
224
- }, /*#__PURE__*/React.createElement(ObsAccordionToggle, {
225
- eventKey: item.name,
226
- handleAccordionToggle: handleAccordionToggle
227
- }, /*#__PURE__*/React.createElement("div", {
228
- className: "accordion-header-title"
229
- }, item.name), /*#__PURE__*/React.createElement("div", {
230
- className: "accordion-header-toolbar"
231
- }, /*#__PURE__*/React.createElement("span", {
232
- className: "mx-1 cursor-pointer ".concat(inLabelObs ? "active-icon" : "text-muted opacity-50"),
233
- onClick: event => {
234
- event.stopPropagation();
235
- toggleLabel(item);
236
- },
237
- title: "Add to tooltip"
238
- }, /*#__PURE__*/React.createElement(CommentIcon, null)), /*#__PURE__*/React.createElement("span", {
239
- className: "mx-1 cursor-pointer ".concat(inSliceObs ? "active-icon" : "text-muted opacity-50"),
240
- onClick: event => {
241
- event.stopPropagation();
242
- toggleSlice(item);
243
- },
244
- title: "Filter applied"
245
- }, /*#__PURE__*/React.createElement(JoinInnerIcon, null)), /*#__PURE__*/React.createElement("span", {
246
- className: "mx-1 cursor-pointer ".concat(isColorEncoding ? "active-icon" : "text-muted opacity-50"),
247
- onClick: event => {
248
- event.stopPropagation();
249
- toggleColor(item);
250
- },
251
- title: showSelectedAsActive ? "Is selected" : "Is color encoding"
252
- }, /*#__PURE__*/React.createElement(WaterDropIcon, null)))), /*#__PURE__*/React.createElement(Accordion.Collapse, {
253
- eventKey: item.name
254
- }, /*#__PURE__*/React.createElement("div", {
255
- className: "obs-accordion-body"
256
- }, active.includes(item.name) && (item.type === OBS_TYPES.CATEGORICAL || item.type === OBS_TYPES.BOOLEAN ? /*#__PURE__*/React.createElement(CategoricalObs, {
257
- key: item.name,
258
- obs: item,
259
- toggleAll: () => toggleAll(item),
260
- toggleObs: value => toggleObs(item, value),
261
- toggleLabel: () => toggleLabel(item),
262
- toggleSlice: () => toggleSlice(item),
263
- toggleColor: () => toggleColor(item),
264
- showColor: showColor && isColorEncoding,
265
- showHistograms: showHistograms
266
- }) : /*#__PURE__*/React.createElement(ContinuousObs, {
267
- key: item.name,
268
- obs: item,
269
- toggleAll: () => toggleAll(item),
270
- toggleObs: value => toggleObs(item, value),
271
- toggleLabel: () => toggleLabel(item),
272
- toggleSlice: () => toggleSlice(item),
273
- toggleColor: () => toggleColor(item),
274
- showHistograms: showHistograms
275
- })))));
236
+ children: [/*#__PURE__*/_jsxs(ObsAccordionToggle, {
237
+ eventKey: item.name,
238
+ handleAccordionToggle: handleAccordionToggle,
239
+ children: [/*#__PURE__*/_jsx("div", {
240
+ className: "accordion-header-title",
241
+ children: item.name
242
+ }), /*#__PURE__*/_jsxs("div", {
243
+ className: "accordion-header-toolbar",
244
+ children: [/*#__PURE__*/_jsx("span", {
245
+ className: "mx-1 cursor-pointer ".concat(inLabelObs ? 'active-icon' : 'text-muted opacity-50'),
246
+ onClick: event => {
247
+ event.stopPropagation();
248
+ toggleLabel(item);
249
+ },
250
+ title: "Add to tooltip",
251
+ children: /*#__PURE__*/_jsx(CommentIcon, {})
252
+ }), /*#__PURE__*/_jsx("span", {
253
+ className: "mx-1 cursor-pointer ".concat(inSliceObs ? 'active-icon' : 'text-muted opacity-50'),
254
+ onClick: event => {
255
+ event.stopPropagation();
256
+ toggleSlice(item);
257
+ },
258
+ title: "Filter applied",
259
+ children: /*#__PURE__*/_jsx(JoinInnerIcon, {})
260
+ }), /*#__PURE__*/_jsx("span", {
261
+ className: "mx-1 cursor-pointer ".concat(isColorEncoding ? 'active-icon' : 'text-muted opacity-50'),
262
+ onClick: event => {
263
+ event.stopPropagation();
264
+ toggleColor(item);
265
+ },
266
+ title: showSelectedAsActive ? 'Is selected' : 'Is color encoding',
267
+ children: /*#__PURE__*/_jsx(WaterDropIcon, {})
268
+ })]
269
+ })]
270
+ }), /*#__PURE__*/_jsx(Accordion.Collapse, {
271
+ eventKey: item.name,
272
+ children: /*#__PURE__*/_jsx("div", {
273
+ className: "obs-accordion-body",
274
+ children: active.includes(item.name) && (item.type === OBS_TYPES.CATEGORICAL || item.type === OBS_TYPES.BOOLEAN ? /*#__PURE__*/_jsx(CategoricalObs, {
275
+ obs: item,
276
+ toggleAll: () => toggleAll(item),
277
+ toggleObs: value => toggleObs(item, value),
278
+ toggleLabel: () => toggleLabel(item),
279
+ toggleSlice: () => toggleSlice(item),
280
+ toggleColor: () => toggleColor(item),
281
+ showColor: showColor && isColorEncoding,
282
+ showHistograms: showHistograms
283
+ }, item.name) : /*#__PURE__*/_jsx(ContinuousObs, {
284
+ obs: item,
285
+ toggleAll: () => toggleAll(item),
286
+ toggleObs: value => toggleObs(item, value),
287
+ toggleLabel: () => toggleLabel(item),
288
+ toggleSlice: () => toggleSlice(item),
289
+ toggleColor: () => toggleColor(item),
290
+ showHistograms: showHistograms
291
+ }, item.name))
292
+ })
293
+ })]
294
+ }, item.name);
276
295
  };
277
296
  const groupList = _.map(_.keys(obsGroups), group => {
278
297
  const key = "group-".concat(group);
279
298
  const groupItems = _.compact(_.map(_.sortBy(obsGroups[group], o => _.lowerCase(o.name)), item => {
280
299
  return obsItem(obsCols === null || obsCols === void 0 ? void 0 : obsCols[item]);
281
300
  }));
282
- if (group === "default") {
301
+ if (group === 'default') {
283
302
  return groupItems;
284
303
  } else {
285
- return /*#__PURE__*/React.createElement(Accordion.Item, {
286
- key: key,
304
+ return /*#__PURE__*/_jsxs(Accordion.Item, {
287
305
  eventKey: key,
288
- className: "obs-group-accordion-item"
289
- }, /*#__PURE__*/React.createElement(Accordion.Header, {
290
- className: "obs-group-accordion-header"
291
- }, group), /*#__PURE__*/React.createElement(Accordion.Body, {
292
- className: "obs-group-accordion-body"
293
- }, groupItems));
306
+ className: "obs-group-accordion-item",
307
+ children: [/*#__PURE__*/_jsx(Accordion.Header, {
308
+ className: "obs-group-accordion-header",
309
+ children: group
310
+ }), /*#__PURE__*/_jsx(Accordion.Body, {
311
+ className: "obs-group-accordion-body",
312
+ children: groupItems
313
+ })]
314
+ }, key);
294
315
  }
295
316
  });
296
- const obsList = enableGroups ? /*#__PURE__*/React.createElement(React.Fragment, null, groupList) : _.map(_.sortBy(obsCols, o => _.lowerCase(o.name)), item => obsItem(item));
317
+ const obsList = enableGroups ? /*#__PURE__*/_jsx(_Fragment, {
318
+ children: groupList
319
+ }) : _.map(_.sortBy(obsCols, o => _.lowerCase(o.name)), item => obsItem(item));
297
320
  const defaultActiveGroup = enableGroups ? "group-".concat(_.findKey(obsGroups, g => g.includes(active === null || active === void 0 ? void 0 : active[0]))) : null;
298
321
  if (!serverError) {
299
- return /*#__PURE__*/React.createElement("div", {
300
- className: "position-relative h-100"
301
- }, isPending ? /*#__PURE__*/React.createElement(LoadingSpinner, null) : !!obsCols && !_.size(obsCols) ? /*#__PURE__*/React.createElement(Alert, {
302
- variant: "danger"
303
- }, "No observations found.") : /*#__PURE__*/React.createElement(Accordion, {
304
- flush: true,
305
- defaultActiveKey: [...active, ...[defaultActiveGroup]],
306
- alwaysOpen: true,
307
- className: "obs-accordion"
308
- }, obsList));
322
+ return /*#__PURE__*/_jsx("div", {
323
+ className: "position-relative h-100",
324
+ children: isPending ? /*#__PURE__*/_jsx(LoadingSpinner, {}) : !!obsCols && !_.size(obsCols) ? /*#__PURE__*/_jsx(Alert, {
325
+ variant: "danger",
326
+ children: "No observations found."
327
+ }) : /*#__PURE__*/_jsx(Accordion, {
328
+ flush: true,
329
+ defaultActiveKey: [...active, ...[defaultActiveGroup]],
330
+ alwaysOpen: true,
331
+ className: "obs-accordion",
332
+ children: obsList
333
+ })
334
+ });
309
335
  } else {
310
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Alert, {
311
- variant: "danger"
312
- }, serverError.message));
336
+ return /*#__PURE__*/_jsx("div", {
337
+ children: /*#__PURE__*/_jsx(Alert, {
338
+ variant: "danger",
339
+ children: serverError.message
340
+ })
341
+ });
313
342
  }
314
343
  }
@@ -1,5 +1,5 @@
1
- import React from "react";
2
- import { Form } from "react-bootstrap";
1
+ import { Form } from 'react-bootstrap';
2
+ import { jsx as _jsx } from "react/jsx-runtime";
3
3
  export function ObsToolbar(_ref) {
4
4
  let {
5
5
  item,
@@ -7,7 +7,7 @@ export function ObsToolbar(_ref) {
7
7
  onToggleAllObs
8
8
  } = _ref;
9
9
  const allToggledOn = !item.omit.length;
10
- return showToggleAllObs && /*#__PURE__*/React.createElement(Form.Check, {
10
+ return showToggleAllObs && /*#__PURE__*/_jsx(Form.Check, {
11
11
  type: "switch",
12
12
  id: "custom-switch",
13
13
  label: "Toggle all",
@@ -3,16 +3,20 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
3
3
  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; }
4
4
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
5
  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); }
6
- import React, { useEffect, useState } from "react";
7
- import _ from "lodash";
8
- import { Button, ButtonGroup, Dropdown, DropdownButton, OverlayTrigger, Tooltip } from "react-bootstrap";
9
- import { DEFAULT_OBSM_KEYS } from "../../constants/constants";
10
- import { useDataset } from "../../context/DatasetContext";
11
- import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
12
- import { useFetch } from "../../utils/requests";
13
- import { ObsmKeysListBtn } from "../../utils/Skeleton";
14
- export function ObsmKeysList() {
15
- const ENDPOINT = "obsm/keys";
6
+ import { useEffect, useState } from 'react';
7
+ import _ from 'lodash';
8
+ import { Button, ButtonGroup, Dropdown, DropdownButton, OverlayTrigger, Tooltip } from 'react-bootstrap';
9
+ import { DEFAULT_OBSM_KEYS } from '../../constants/constants';
10
+ import { useDataset } from '../../context/DatasetContext';
11
+ import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
12
+ import { useFetch } from '../../utils/requests';
13
+ import { ObsmKeysListBtn } from '../../utils/Skeleton';
14
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
15
+ export function ObsmKeysList(_ref) {
16
+ let {
17
+ setHasObsm
18
+ } = _ref;
19
+ const ENDPOINT = 'obsm/keys';
16
20
  const dataset = useDataset();
17
21
  const settings = useSettings();
18
22
  const dispatch = useSettingsDispatch();
@@ -36,28 +40,33 @@ export function ObsmKeysList() {
36
40
  refetchOnMount: false
37
41
  });
38
42
  useEffect(() => {
39
- if (!isPending && !serverError && fetchedData) {
40
- setObsmKeysList(fetchedData);
43
+ if (!isPending && !serverError) {
44
+ if (!fetchedData || !fetchedData.length) {
45
+ setHasObsm(false);
46
+ } else {
47
+ setHasObsm(true);
48
+ setObsmKeysList(fetchedData);
41
49
 
42
- // Set default obsm if in keys list and not selected
43
- if (!settings.selectedObsm && !!fetchedData.length) {
44
- // Follow DEFAULT_OBSM_KEYS order
45
- _.each(DEFAULT_OBSM_KEYS, k => {
46
- const defaultObsm = _.find(fetchedData, item => item.toLowerCase() === k);
47
- if (defaultObsm) {
48
- dispatch({
49
- type: "select.obsm",
50
- obsm: defaultObsm
51
- });
52
- return false; // break
53
- }
54
- });
50
+ // Set default obsm if in keys list and not selected
51
+ if (!settings.selectedObsm) {
52
+ // Follow DEFAULT_OBSM_KEYS order
53
+ _.each(DEFAULT_OBSM_KEYS, k => {
54
+ const defaultObsm = _.find(fetchedData, item => item.toLowerCase() === k);
55
+ if (defaultObsm) {
56
+ dispatch({
57
+ type: 'select.obsm',
58
+ obsm: defaultObsm
59
+ });
60
+ return false; // break
61
+ }
62
+ });
63
+ }
55
64
  }
56
65
  if (settings.selectedObsm) {
57
66
  // If selected obsm is not in keys list, reset to null
58
- if (!_.includes(fetchedData, settings.selectedObsm)) {
67
+ if (!_.includes(fetchedData || [], settings.selectedObsm)) {
59
68
  dispatch({
60
- type: "select.obsm",
69
+ type: 'select.obsm',
61
70
  obsm: null
62
71
  });
63
72
  } else {
@@ -65,40 +74,47 @@ export function ObsmKeysList() {
65
74
  }
66
75
  }
67
76
  }
68
- }, [dispatch, fetchedData, isPending, serverError, settings.selectedObsm]);
77
+ }, [dispatch, fetchedData, isPending, serverError, setHasObsm, settings.selectedObsm]);
69
78
  const obsmList = obsmKeysList.map(item => {
70
- return /*#__PURE__*/React.createElement(Dropdown.Item, {
71
- key: item,
72
- className: "custom ".concat(active === item && "active"),
79
+ return /*#__PURE__*/_jsx(Dropdown.Item, {
80
+ className: "custom ".concat(active === item && 'active'),
73
81
  onClick: () => {
74
82
  dispatch({
75
- type: "select.obsm",
83
+ type: 'select.obsm',
76
84
  obsm: item
77
85
  });
78
- }
86
+ },
87
+ children: item
79
88
  }, item);
80
89
  });
81
90
  if (!serverError) {
82
91
  if (isPending) {
83
- return /*#__PURE__*/React.createElement(ObsmKeysListBtn, null);
92
+ return /*#__PURE__*/_jsx(ObsmKeysListBtn, {});
84
93
  }
85
- return /*#__PURE__*/React.createElement(DropdownButton, {
94
+ return /*#__PURE__*/_jsxs(DropdownButton, {
86
95
  as: ButtonGroup,
87
- title: settings.selectedObsm || "Select an embedding",
88
- variant: settings.selectedObsm ? "primary" : "warning",
96
+ title: settings.selectedObsm || 'Select an embedding',
97
+ variant: settings.selectedObsm ? 'primary' : 'warning',
89
98
  id: "bg-nested-dropdown",
90
- size: "sm"
91
- }, /*#__PURE__*/React.createElement(Dropdown.Header, null, "Embeddings"), obsmList);
99
+ size: "sm",
100
+ children: [/*#__PURE__*/_jsx(Dropdown.Header, {
101
+ children: "Embeddings"
102
+ }), obsmList]
103
+ });
92
104
  } else {
93
- return /*#__PURE__*/React.createElement(OverlayTrigger, {
105
+ return /*#__PURE__*/_jsx(OverlayTrigger, {
94
106
  placement: "top",
95
107
  delay: {
96
108
  show: 100,
97
109
  hide: 200
98
110
  },
99
- overlay: /*#__PURE__*/React.createElement(Tooltip, null, serverError.message)
100
- }, /*#__PURE__*/React.createElement(Button, {
101
- variant: "danger"
102
- }, "Error"));
111
+ overlay: /*#__PURE__*/_jsx(Tooltip, {
112
+ children: serverError.message
113
+ }),
114
+ children: /*#__PURE__*/_jsx(Button, {
115
+ variant: "danger",
116
+ children: "Error"
117
+ })
118
+ });
103
119
  }
104
120
  }