@haniffalab/cherita-react 1.3.0-dev.2025-06-06.f1eddad0 → 1.3.1

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 +99 -105
  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 +267 -205
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -129
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +67 -28
  23. package/dist/cjs/components/offcanvas/index.js +62 -27
  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 +128 -100
  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 +176 -120
  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 +131 -103
  35. package/dist/cjs/components/var-list/VarList.js +85 -71
  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 -97
  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 +51 -48
  42. package/dist/cjs/context/DatasetContext.js +26 -17
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +271 -88
  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 +36 -29
  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 +135 -65
  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 +119 -124
  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 +282 -217
  82. package/dist/esm/components/obs-list/ObsList.js +176 -143
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +71 -32
  85. package/dist/esm/components/offcanvas/index.js +68 -33
  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 +149 -120
  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 +187 -130
  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 +142 -113
  97. package/dist/esm/components/var-list/VarList.js +99 -84
  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 -108
  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 +50 -47
  104. package/dist/esm/context/DatasetContext.js +33 -23
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +273 -89
  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 +37 -29
  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 -10
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +65 -16
  129. package/scss/components/accordions.scss +15 -2
  130. package/scss/components/layouts.scss +68 -50
  131. package/scss/components/lists.scss +16 -5
  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-title"
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,103 +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", null, item.name), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("span", {
228
- className: "mx-1 cursor-pointer ".concat(inLabelObs ? "active-icon" : "text-muted opacity-50"),
229
- onClick: event => {
230
- event.stopPropagation();
231
- toggleLabel(item);
232
- },
233
- title: "Add to tooltip"
234
- }, /*#__PURE__*/React.createElement(CommentIcon, null)), /*#__PURE__*/React.createElement("span", {
235
- className: "mx-1 cursor-pointer ".concat(inSliceObs ? "active-icon" : "text-muted opacity-50"),
236
- onClick: event => {
237
- event.stopPropagation();
238
- toggleSlice(item);
239
- },
240
- title: "Filter applied"
241
- }, /*#__PURE__*/React.createElement(JoinInnerIcon, null)), /*#__PURE__*/React.createElement("span", {
242
- className: "mx-1 cursor-pointer ".concat(isColorEncoding ? "active-icon" : "text-muted opacity-50"),
243
- onClick: event => {
244
- event.stopPropagation();
245
- toggleColor(item);
246
- },
247
- title: showSelectedAsActive ? "Is selected" : "Is color encoding"
248
- }, /*#__PURE__*/React.createElement(WaterDropIcon, null)))), /*#__PURE__*/React.createElement(Accordion.Collapse, {
249
- eventKey: item.name
250
- }, /*#__PURE__*/React.createElement("div", {
251
- className: "obs-accordion-body"
252
- }, active.includes(item.name) && (item.type === OBS_TYPES.CATEGORICAL || item.type === OBS_TYPES.BOOLEAN ? /*#__PURE__*/React.createElement(CategoricalObs, {
253
- key: item.name,
254
- obs: item,
255
- toggleAll: () => toggleAll(item),
256
- toggleObs: value => toggleObs(item, value),
257
- toggleLabel: () => toggleLabel(item),
258
- toggleSlice: () => toggleSlice(item),
259
- toggleColor: () => toggleColor(item),
260
- showColor: showColor && isColorEncoding,
261
- showHistograms: showHistograms
262
- }) : /*#__PURE__*/React.createElement(ContinuousObs, {
263
- key: item.name,
264
- obs: item,
265
- toggleAll: () => toggleAll(item),
266
- toggleObs: value => toggleObs(item, value),
267
- toggleLabel: () => toggleLabel(item),
268
- toggleSlice: () => toggleSlice(item),
269
- toggleColor: () => toggleColor(item),
270
- showHistograms: showHistograms
271
- })))));
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);
272
295
  };
273
296
  const groupList = _.map(_.keys(obsGroups), group => {
274
297
  const key = "group-".concat(group);
275
298
  const groupItems = _.compact(_.map(_.sortBy(obsGroups[group], o => _.lowerCase(o.name)), item => {
276
299
  return obsItem(obsCols === null || obsCols === void 0 ? void 0 : obsCols[item]);
277
300
  }));
278
- if (group === "default") {
301
+ if (group === 'default') {
279
302
  return groupItems;
280
303
  } else {
281
- return /*#__PURE__*/React.createElement(Accordion.Item, {
282
- key: key,
304
+ return /*#__PURE__*/_jsxs(Accordion.Item, {
283
305
  eventKey: key,
284
- className: "obs-group-accordion-item"
285
- }, /*#__PURE__*/React.createElement(Accordion.Header, {
286
- className: "obs-group-accordion-header"
287
- }, group), /*#__PURE__*/React.createElement(Accordion.Body, {
288
- className: "obs-group-accordion-body"
289
- }, 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);
290
315
  }
291
316
  });
292
- 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));
293
320
  const defaultActiveGroup = enableGroups ? "group-".concat(_.findKey(obsGroups, g => g.includes(active === null || active === void 0 ? void 0 : active[0]))) : null;
294
321
  if (!serverError) {
295
- return /*#__PURE__*/React.createElement("div", {
296
- className: "position-relative h-100"
297
- }, isPending ? /*#__PURE__*/React.createElement(LoadingSpinner, null) : !!obsCols && !_.size(obsCols) ? /*#__PURE__*/React.createElement(Alert, {
298
- variant: "danger"
299
- }, "No observations found.") : /*#__PURE__*/React.createElement(Accordion, {
300
- flush: true,
301
- defaultActiveKey: [...active, ...[defaultActiveGroup]],
302
- alwaysOpen: true,
303
- className: "obs-accordion"
304
- }, 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
+ });
305
335
  } else {
306
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Alert, {
307
- variant: "danger"
308
- }, serverError.message));
336
+ return /*#__PURE__*/_jsx("div", {
337
+ children: /*#__PURE__*/_jsx(Alert, {
338
+ variant: "danger",
339
+ children: serverError.message
340
+ })
341
+ });
309
342
  }
310
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,14 +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 { Button, ButtonGroup, Dropdown, DropdownButton, OverlayTrigger, Tooltip } from "react-bootstrap";
8
- import { useDataset } from "../../context/DatasetContext";
9
- import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
10
- import { useFetch } from "../../utils/requests";
11
- import { ObsmKeysListBtn } from "../../utils/Skeleton";
12
- export function ObsmKeysList() {
13
- 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';
14
20
  const dataset = useDataset();
15
21
  const settings = useSettings();
16
22
  const dispatch = useSettingsDispatch();
@@ -34,48 +40,81 @@ export function ObsmKeysList() {
34
40
  refetchOnMount: false
35
41
  });
36
42
  useEffect(() => {
37
- if (!isPending && !serverError && fetchedData) {
38
- setObsmKeysList(fetchedData);
39
- }
40
- }, [fetchedData, isPending, serverError]);
41
- useEffect(() => {
42
- if (settings.selectedObsm) {
43
- setActive(settings.selectedObsm);
43
+ if (!isPending && !serverError) {
44
+ if (!fetchedData || !fetchedData.length) {
45
+ setHasObsm(false);
46
+ } else {
47
+ setHasObsm(true);
48
+ setObsmKeysList(fetchedData);
49
+
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
+ }
64
+ }
65
+ if (settings.selectedObsm) {
66
+ // If selected obsm is not in keys list, reset to null
67
+ if (!_.includes(fetchedData || [], settings.selectedObsm)) {
68
+ dispatch({
69
+ type: 'select.obsm',
70
+ obsm: null
71
+ });
72
+ } else {
73
+ setActive(settings.selectedObsm);
74
+ }
75
+ }
44
76
  }
45
- }, [settings.selectedObsm]);
77
+ }, [dispatch, fetchedData, isPending, serverError, setHasObsm, settings.selectedObsm]);
46
78
  const obsmList = obsmKeysList.map(item => {
47
- return /*#__PURE__*/React.createElement(Dropdown.Item, {
48
- key: item,
49
- className: "custom ".concat(active === item && "active"),
79
+ return /*#__PURE__*/_jsx(Dropdown.Item, {
80
+ className: "custom ".concat(active === item && 'active'),
50
81
  onClick: () => {
51
82
  dispatch({
52
- type: "select.obsm",
83
+ type: 'select.obsm',
53
84
  obsm: item
54
85
  });
55
- }
86
+ },
87
+ children: item
56
88
  }, item);
57
89
  });
58
90
  if (!serverError) {
59
91
  if (isPending) {
60
- return /*#__PURE__*/React.createElement(ObsmKeysListBtn, null);
92
+ return /*#__PURE__*/_jsx(ObsmKeysListBtn, {});
61
93
  }
62
- return /*#__PURE__*/React.createElement(DropdownButton, {
94
+ return /*#__PURE__*/_jsxs(DropdownButton, {
63
95
  as: ButtonGroup,
64
- title: settings.selectedObsm || "Select an embedding",
65
- variant: settings.selectedObsm ? "primary" : "warning",
96
+ title: settings.selectedObsm || 'Select an embedding',
97
+ variant: settings.selectedObsm ? 'primary' : 'warning',
66
98
  id: "bg-nested-dropdown",
67
- size: "sm"
68
- }, /*#__PURE__*/React.createElement(Dropdown.Header, null, "Embeddings"), obsmList);
99
+ size: "sm",
100
+ children: [/*#__PURE__*/_jsx(Dropdown.Header, {
101
+ children: "Embeddings"
102
+ }), obsmList]
103
+ });
69
104
  } else {
70
- return /*#__PURE__*/React.createElement(OverlayTrigger, {
105
+ return /*#__PURE__*/_jsx(OverlayTrigger, {
71
106
  placement: "top",
72
107
  delay: {
73
108
  show: 100,
74
109
  hide: 200
75
110
  },
76
- overlay: /*#__PURE__*/React.createElement(Tooltip, null, serverError.message)
77
- }, /*#__PURE__*/React.createElement(Button, {
78
- variant: "danger"
79
- }, "Error"));
111
+ overlay: /*#__PURE__*/_jsx(Tooltip, {
112
+ children: serverError.message
113
+ }),
114
+ children: /*#__PURE__*/_jsx(Button, {
115
+ variant: "danger",
116
+ children: "Error"
117
+ })
118
+ });
80
119
  }
81
120
  }