@haniffalab/cherita-react 1.3.0 → 1.3.1-dev.2025-10-29.6de4119f

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 (137) 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 +85 -57
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +167 -114
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +102 -0
  8. package/dist/cjs/components/heatmap/Heatmap.js +83 -53
  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 +83 -54
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +305 -216
  20. package/dist/cjs/components/obs-list/ObsList.js +164 -128
  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 +223 -175
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +143 -116
  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 +79 -85
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +111 -0
  34. package/dist/cjs/components/var-list/VarItem.js +131 -103
  35. package/dist/cjs/components/var-list/VarList.js +96 -74
  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 +124 -81
  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 +54 -39
  42. package/dist/cjs/context/DatasetContext.js +27 -17
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +339 -125
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/map-helper.js +2 -1
  48. package/dist/cjs/helpers/zarr-helper.js +3 -3
  49. package/dist/cjs/index.js +15 -21
  50. package/dist/cjs/utils/Filter.js +16 -11
  51. package/dist/cjs/utils/Histogram.js +35 -33
  52. package/dist/cjs/utils/ImageViewer.js +11 -8
  53. package/dist/cjs/utils/Legend.js +37 -30
  54. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  55. package/dist/cjs/utils/Resolver.js +213 -0
  56. package/dist/cjs/utils/Skeleton.js +10 -10
  57. package/dist/cjs/utils/StyledTooltip.js +44 -0
  58. package/dist/cjs/utils/VirtualizedList.js +36 -29
  59. package/dist/cjs/utils/errors.js +15 -15
  60. package/dist/cjs/utils/requests.js +21 -9
  61. package/dist/cjs/utils/search.js +4 -4
  62. package/dist/cjs/utils/string.js +6 -6
  63. package/dist/cjs/utils/zarrData.js +20 -21
  64. package/dist/css/cherita.css +188 -65
  65. package/dist/css/cherita.css.map +1 -1
  66. package/dist/esm/components/controls/Controls.js +43 -35
  67. package/dist/esm/components/dotplot/Dotplot.js +93 -64
  68. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  69. package/dist/esm/components/full-page/FullPage.js +180 -124
  70. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  71. package/dist/esm/components/full-page/PlotTypeSelector.js +95 -0
  72. package/dist/esm/components/heatmap/Heatmap.js +91 -60
  73. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  74. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  75. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  76. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  77. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  78. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  79. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  80. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  81. package/dist/esm/components/matrixplot/Matrixplot.js +91 -61
  82. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  83. package/dist/esm/components/obs-list/ObsItem.js +320 -228
  84. package/dist/esm/components/obs-list/ObsList.js +179 -142
  85. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  86. package/dist/esm/components/obsm-list/ObsmList.js +71 -32
  87. package/dist/esm/components/offcanvas/index.js +68 -33
  88. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  89. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  90. package/dist/esm/components/scatterplot/Scatterplot.js +243 -194
  91. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  92. package/dist/esm/components/scatterplot/SpatialControls.js +155 -127
  93. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  94. package/dist/esm/components/search-bar/SearchBar.js +187 -130
  95. package/dist/esm/components/search-bar/SearchInfo.js +86 -91
  96. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  97. package/dist/esm/components/toolbar/Toolbar.js +101 -0
  98. package/dist/esm/components/var-list/VarItem.js +142 -113
  99. package/dist/esm/components/var-list/VarList.js +108 -88
  100. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  101. package/dist/esm/components/var-list/VarSet.js +134 -115
  102. package/dist/esm/components/violin/Violin.js +135 -91
  103. package/dist/esm/components/violin/ViolinControls.js +10 -6
  104. package/dist/esm/constants/colorscales.js +19 -19
  105. package/dist/esm/constants/constants.js +53 -38
  106. package/dist/esm/context/DatasetContext.js +34 -23
  107. package/dist/esm/context/FilterContext.js +11 -8
  108. package/dist/esm/context/SettingsContext.js +341 -126
  109. package/dist/esm/context/ZarrDataContext.js +8 -6
  110. package/dist/esm/helpers/color-helper.js +5 -5
  111. package/dist/esm/helpers/map-helper.js +4 -3
  112. package/dist/esm/helpers/zarr-helper.js +6 -6
  113. package/dist/esm/index.js +22 -22
  114. package/dist/esm/utils/Filter.js +22 -17
  115. package/dist/esm/utils/Histogram.js +39 -37
  116. package/dist/esm/utils/ImageViewer.js +12 -8
  117. package/dist/esm/utils/Legend.js +44 -36
  118. package/dist/esm/utils/LoadingIndicators.js +16 -13
  119. package/dist/esm/utils/Resolver.js +201 -0
  120. package/dist/esm/utils/Skeleton.js +11 -10
  121. package/dist/esm/utils/StyledTooltip.js +38 -0
  122. package/dist/esm/utils/VirtualizedList.js +37 -29
  123. package/dist/esm/utils/errors.js +15 -15
  124. package/dist/esm/utils/requests.js +24 -12
  125. package/dist/esm/utils/search.js +7 -7
  126. package/dist/esm/utils/string.js +7 -7
  127. package/dist/esm/utils/zarrData.js +27 -28
  128. package/package.json +24 -10
  129. package/scss/cherita-bootstrap.scss +2 -2
  130. package/scss/cherita.scss +65 -17
  131. package/scss/components/accordions.scss +15 -2
  132. package/scss/components/layouts.scss +116 -30
  133. package/scss/components/lists.scss +16 -5
  134. package/scss/components/plotly.scss +40 -23
  135. package/scss/components/plots.scss +14 -1
  136. package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
  137. package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
@@ -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,46 +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
- enableObsGroups = true
55
+ enableObsGroups = true,
56
+ showSelectedAsActive = false,
57
+ showHistograms = true
52
58
  } = _ref2;
53
- const ENDPOINT = "obs/cols";
59
+ const ENDPOINT = 'obs/cols';
54
60
  const dataset = useDataset();
55
61
  const settings = useSettings();
56
62
  const dispatch = useSettingsDispatch();
57
63
  const [enableGroups, setEnableGroups] = useState(enableObsGroups);
58
64
  const [obsCols, setObsCols] = useState(null);
59
- const [active, setActive] = useState([...[(_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name]]);
60
- const [params, setParams] = useState({
61
- url: dataset.url
62
- });
65
+ const [active, setActive] = useState([...(settings.selectedObs ? [(_settings$selectedObs = settings.selectedObs) === null || _settings$selectedObs === void 0 ? void 0 : _settings$selectedObs.name] : [])]);
63
66
  const obsGroups = useMemo(() => {
64
67
  var _dataset$obsGroups;
65
68
  return _objectSpread({
66
69
  default: _.union(DEFAULT_OBS_GROUP, (_dataset$obsGroups = dataset.obsGroups) === null || _dataset$obsGroups === void 0 ? void 0 : _dataset$obsGroups.default)
67
- }, _.omit(dataset.obsGroups, "default"));
70
+ }, _.omit(dataset.obsGroups, 'default'));
68
71
  }, [dataset.obsGroups]);
72
+ const [params, setParams] = useState(_objectSpread({
73
+ url: dataset.url
74
+ }, enableGroups ? {
75
+ cols: _.flatten(_.values(obsGroups))
76
+ } : {}));
69
77
  useEffect(() => {
70
78
  setParams(p => {
71
79
  return _objectSpread(_objectSpread({}, p), {}, {
72
80
  url: dataset.url
73
- });
81
+ }, enableGroups ? {
82
+ cols: _.flatten(_.values(obsGroups))
83
+ } : {});
74
84
  });
75
- }, [dataset.url]);
85
+ }, [dataset.url, enableGroups, obsGroups]);
76
86
  const {
77
87
  fetchedData,
78
88
  isPending,
@@ -102,25 +112,34 @@ export function ObsColsList(_ref2) {
102
112
  return d.type !== OBS_TYPES.DISCRETE;
103
113
  });
104
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
+ }
105
121
  return _objectSpread(_objectSpread({}, d), {}, {
106
- codesMap: _.invert(d.codes),
107
122
  omit: []
108
123
  });
109
- }), "name"));
124
+ }), 'name'));
110
125
  }
111
- }, [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]);
112
127
  useEffect(() => {
113
- if (obsCols) {
114
- var _settings$selectedObs2;
115
- if (!obsCols[(_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.name]) {
116
- setActive([]);
128
+ if (obsCols && settings.selectedObs) {
129
+ const {
130
+ name
131
+ } = settings.selectedObs;
132
+ if (!obsCols[name]) {
117
133
  dispatch({
118
- type: "select.obs",
134
+ type: 'select.obs',
119
135
  obs: null
120
136
  });
137
+ if (active.includes(name)) {
138
+ setActive(prev => _.without(prev, name));
139
+ }
121
140
  }
122
141
  }
123
- }, [settings.selectedObs, dispatch, obsCols]);
142
+ }, [settings.selectedObs, dispatch, obsCols, active]);
124
143
  const handleAccordionToggle = (itemName, isCurrentEventKey) => {
125
144
  if (isCurrentEventKey) {
126
145
  _.delay(() => setActive(prev => _.without(prev, itemName)), 250);
@@ -129,8 +148,8 @@ export function ObsColsList(_ref2) {
129
148
  }
130
149
  };
131
150
  const toggleAll = item => {
132
- var _settings$selectedObs3;
133
- const omit = item.omit.length ? [] : _.map(item.values, v => item.codes[v]);
151
+ var _settings$selectedObs5;
152
+ const omit = item.omit.length ? [] : item.values;
134
153
  setObsCols(o => {
135
154
  return _objectSpread(_objectSpread({}, o), {}, {
136
155
  [item.name]: _objectSpread(_objectSpread({}, item), {}, {
@@ -138,9 +157,9 @@ export function ObsColsList(_ref2) {
138
157
  })
139
158
  });
140
159
  });
141
- 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) {
142
161
  dispatch({
143
- type: "select.obs",
162
+ type: 'select.obs',
144
163
  obs: _objectSpread(_objectSpread({}, item), {}, {
145
164
  omit: omit
146
165
  })
@@ -148,46 +167,42 @@ export function ObsColsList(_ref2) {
148
167
  }
149
168
  };
150
169
  const toggleLabel = item => {
151
- const inLabelObs = _.some(settings.labelObs, i => i.name === item.name);
170
+ const inLabelObs = _.includes(settings.labelObs, item.name);
152
171
  if (inLabelObs) {
153
172
  dispatch({
154
- type: "remove.label.obs",
173
+ type: 'remove.label.obs',
155
174
  obsName: item.name
156
175
  });
157
176
  } else {
158
177
  dispatch({
159
- type: "add.label.obs",
160
- obs: {
161
- name: item.name,
162
- type: item.type,
163
- codesMap: item.codesMap
164
- }
178
+ type: 'add.label.obs',
179
+ obs: item
165
180
  });
166
181
  }
167
182
  };
168
183
  const toggleSlice = item => {
169
184
  dispatch({
170
- type: "toggle.slice.obs",
185
+ type: 'toggle.slice.obs',
171
186
  obs: item
172
187
  });
173
188
  };
174
189
  const toggleColor = item => {
175
190
  dispatch({
176
- type: "select.obs",
191
+ type: 'select.obs',
177
192
  obs: item
178
193
  });
179
194
  dispatch({
180
- type: "set.colorEncoding",
195
+ type: 'set.colorEncoding',
181
196
  value: COLOR_ENCODINGS.OBS
182
197
  });
183
198
  };
184
199
  const toggleObs = (item, value) => {
185
- var _settings$selectedObs4;
200
+ var _settings$selectedObs6;
186
201
  let omit;
187
- if (_.includes(item.omit, item.codes[value])) {
188
- omit = item.omit.filter(i => i !== item.codes[value]);
202
+ if (_.includes(item.omit, value)) {
203
+ omit = item.omit.filter(i => i !== value);
189
204
  } else {
190
- omit = [...item.omit, item.codes[value]];
205
+ omit = [...item.omit, value];
191
206
  }
192
207
  setObsCols(o => {
193
208
  return _objectSpread(_objectSpread({}, o), {}, {
@@ -196,9 +211,9 @@ export function ObsColsList(_ref2) {
196
211
  })
197
212
  });
198
213
  });
199
- 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) {
200
215
  dispatch({
201
- type: "select.obs",
216
+ type: 'select.obs',
202
217
  obs: _objectSpread(_objectSpread({}, item), {}, {
203
218
  omit: omit
204
219
  })
@@ -206,101 +221,123 @@ export function ObsColsList(_ref2) {
206
221
  }
207
222
  };
208
223
  const obsItem = item => {
209
- var _settings$selectedObs5, _settings$selectedObs6;
224
+ var _settings$selectedObs7, _settings$selectedObs8;
210
225
  if (!item) {
211
226
  return null;
212
227
  }
213
228
  if (item.type === OBS_TYPES.DISCRETE) {
214
229
  return null;
215
230
  }
216
- const inLabelObs = _.some(settings.labelObs, i => i.name === item.name);
217
- const inSliceObs = settings.sliceBy.obs && ((_settings$selectedObs5 = settings.selectedObs) === null || _settings$selectedObs5 === void 0 ? void 0 : _settings$selectedObs5.name) === item.name;
218
- const isColorEncoding = settings.colorEncoding === COLOR_ENCODINGS.OBS && ((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.name) === item.name;
219
- 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", {
220
235
  className: "accordion-item",
221
- key: item.name
222
- }, /*#__PURE__*/React.createElement(ObsAccordionToggle, {
223
- eventKey: item.name,
224
- handleAccordionToggle: handleAccordionToggle
225
- }, /*#__PURE__*/React.createElement("div", null, item.name), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("span", {
226
- className: "mx-1 cursor-pointer ".concat(inLabelObs ? "active-icon" : "text-muted opacity-50"),
227
- onClick: event => {
228
- event.stopPropagation();
229
- toggleLabel(item);
230
- },
231
- title: "Add to tooltip"
232
- }, /*#__PURE__*/React.createElement(CommentIcon, null)), /*#__PURE__*/React.createElement("span", {
233
- className: "mx-1 cursor-pointer ".concat(inSliceObs ? "active-icon" : "text-muted opacity-50"),
234
- onClick: event => {
235
- event.stopPropagation();
236
- toggleSlice(item);
237
- },
238
- title: "Filter applied"
239
- }, /*#__PURE__*/React.createElement(JoinInnerIcon, null)), /*#__PURE__*/React.createElement("span", {
240
- className: "mx-1 cursor-pointer ".concat(isColorEncoding ? "active-icon" : "text-muted opacity-50"),
241
- onClick: event => {
242
- event.stopPropagation();
243
- toggleColor(item);
244
- },
245
- title: "Is color encoding"
246
- }, /*#__PURE__*/React.createElement(WaterDropIcon, null)))), /*#__PURE__*/React.createElement(Accordion.Collapse, {
247
- eventKey: item.name
248
- }, /*#__PURE__*/React.createElement("div", {
249
- className: "obs-accordion-body"
250
- }, active.includes(item.name) && (item.type === OBS_TYPES.CATEGORICAL || item.type === OBS_TYPES.BOOLEAN ? /*#__PURE__*/React.createElement(CategoricalObs, {
251
- key: item.name,
252
- obs: item,
253
- toggleAll: () => toggleAll(item),
254
- toggleObs: value => toggleObs(item, value),
255
- toggleLabel: () => toggleLabel(item),
256
- toggleSlice: () => toggleSlice(item),
257
- toggleColor: () => toggleColor(item),
258
- showColor: showColor && isColorEncoding
259
- }) : /*#__PURE__*/React.createElement(ContinuousObs, {
260
- key: item.name,
261
- obs: item,
262
- toggleAll: () => toggleAll(item),
263
- toggleObs: value => toggleObs(item, value),
264
- toggleLabel: () => toggleLabel(item),
265
- toggleSlice: () => toggleSlice(item),
266
- toggleColor: () => toggleColor(item)
267
- })))));
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);
268
295
  };
269
296
  const groupList = _.map(_.keys(obsGroups), group => {
270
297
  const key = "group-".concat(group);
271
298
  const groupItems = _.compact(_.map(_.sortBy(obsGroups[group], o => _.lowerCase(o.name)), item => {
272
299
  return obsItem(obsCols === null || obsCols === void 0 ? void 0 : obsCols[item]);
273
300
  }));
274
- if (group === "default") {
301
+ if (group === 'default') {
275
302
  return groupItems;
276
303
  } else {
277
- return /*#__PURE__*/React.createElement(Accordion.Item, {
278
- key: key,
304
+ return /*#__PURE__*/_jsxs(Accordion.Item, {
279
305
  eventKey: key,
280
- className: "obs-group-accordion-item"
281
- }, /*#__PURE__*/React.createElement(Accordion.Header, {
282
- className: "obs-group-accordion-header"
283
- }, group), /*#__PURE__*/React.createElement(Accordion.Body, {
284
- className: "obs-group-accordion-body"
285
- }, 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);
286
315
  }
287
316
  });
288
- 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));
289
320
  const defaultActiveGroup = enableGroups ? "group-".concat(_.findKey(obsGroups, g => g.includes(active === null || active === void 0 ? void 0 : active[0]))) : null;
290
321
  if (!serverError) {
291
- return /*#__PURE__*/React.createElement("div", {
292
- className: "position-relative h-100"
293
- }, isPending ? /*#__PURE__*/React.createElement(LoadingSpinner, null) : !!obsCols && !_.size(obsCols) ? /*#__PURE__*/React.createElement(Alert, {
294
- variant: "danger"
295
- }, "No observations found.") : /*#__PURE__*/React.createElement(Accordion, {
296
- flush: true,
297
- defaultActiveKey: [...active, ...[defaultActiveGroup]],
298
- alwaysOpen: true,
299
- className: "obs-accordion"
300
- }, 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
+ });
301
335
  } else {
302
- return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Alert, {
303
- variant: "danger"
304
- }, serverError.message));
336
+ return /*#__PURE__*/_jsx("div", {
337
+ children: /*#__PURE__*/_jsx(Alert, {
338
+ variant: "danger",
339
+ children: serverError.message
340
+ })
341
+ });
305
342
  }
306
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
  }