@haniffalab/cherita-react 1.0.0 → 1.1.0

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 (106) hide show
  1. package/LICENSE +1 -1
  2. package/dist/{components → cjs/components}/full-page/FullPage.js +32 -22
  3. package/dist/{components → cjs/components}/full-page/FullPagePseudospatial.js +7 -6
  4. package/dist/{components → cjs/components}/obs-list/ObsItem.js +88 -77
  5. package/dist/{components → cjs/components}/obs-list/ObsList.js +133 -50
  6. package/dist/cjs/components/obs-list/ObsToolbar.js +24 -0
  7. package/dist/{components → cjs/components}/obsm-list/ObsmList.js +8 -5
  8. package/dist/{components → cjs/components}/offcanvas/index.js +24 -20
  9. package/dist/{components → cjs/components}/pseudospatial/Pseudospatial.js +10 -9
  10. package/dist/{components → cjs/components}/pseudospatial/PseudospatialToolbar.js +4 -3
  11. package/dist/{components → cjs/components}/scatterplot/Scatterplot.js +33 -24
  12. package/dist/{components → cjs/components}/scatterplot/SpatialControls.js +43 -42
  13. package/dist/cjs/components/scatterplot/Toolbox.js +62 -0
  14. package/dist/{components → cjs/components}/search-bar/SearchBar.js +24 -7
  15. package/dist/{components → cjs/components}/search-bar/SearchResults.js +13 -17
  16. package/dist/{components → cjs/components}/var-list/VarItem.js +38 -29
  17. package/dist/{components → cjs/components}/var-list/VarList.js +59 -31
  18. package/dist/{components → cjs/components}/var-list/VarListToolbar.js +18 -14
  19. package/dist/{components → cjs/components}/var-list/VarSet.js +24 -20
  20. package/dist/{components → cjs/components}/violin/Violin.js +4 -3
  21. package/dist/{constants → cjs/constants}/constants.js +6 -2
  22. package/dist/{context → cjs/context}/DatasetContext.js +12 -11
  23. package/dist/{context → cjs/context}/FilterContext.js +4 -3
  24. package/dist/{context → cjs/context}/ZarrDataContext.js +4 -3
  25. package/dist/{helpers → cjs/helpers}/color-helper.js +12 -11
  26. package/dist/{helpers → cjs/helpers}/map-helper.js +8 -7
  27. package/dist/{helpers → cjs/helpers}/zarr-helper.js +30 -38
  28. package/dist/{utils → cjs/utils}/Filter.js +1 -1
  29. package/dist/{utils → cjs/utils}/Histogram.js +12 -8
  30. package/dist/{utils → cjs/utils}/ImageViewer.js +6 -5
  31. package/dist/{utils → cjs/utils}/Legend.js +8 -7
  32. package/dist/{utils → cjs/utils}/LoadingIndicators.js +5 -4
  33. package/dist/cjs/utils/Skeleton.js +19 -0
  34. package/dist/{utils → cjs/utils}/VirtualizedList.js +10 -9
  35. package/dist/{utils → cjs/utils}/requests.js +37 -39
  36. package/dist/{utils → cjs/utils}/string.js +9 -4
  37. package/dist/{utils → cjs/utils}/zarrData.js +12 -4
  38. package/dist/css/cherita.css +147 -152
  39. package/dist/css/cherita.css.map +1 -1
  40. package/dist/esm/components/dotplot/Dotplot.js +135 -0
  41. package/dist/esm/components/dotplot/DotplotControls.js +148 -0
  42. package/dist/esm/components/full-page/FullPage.js +143 -0
  43. package/dist/esm/components/full-page/FullPagePseudospatial.js +151 -0
  44. package/dist/esm/components/heatmap/Heatmap.js +105 -0
  45. package/dist/esm/components/heatmap/HeatmapControls.js +23 -0
  46. package/dist/esm/components/matrixplot/Matrixplot.js +107 -0
  47. package/dist/esm/components/matrixplot/MatrixplotControls.js +38 -0
  48. package/dist/esm/components/obs-list/ObsItem.js +484 -0
  49. package/dist/esm/components/obs-list/ObsList.js +338 -0
  50. package/dist/esm/components/obs-list/ObsToolbar.js +17 -0
  51. package/dist/esm/components/obsm-list/ObsmList.js +75 -0
  52. package/dist/esm/components/offcanvas/index.js +67 -0
  53. package/dist/esm/components/pseudospatial/Pseudospatial.js +228 -0
  54. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +123 -0
  55. package/dist/esm/components/scatterplot/Scatterplot.js +394 -0
  56. package/dist/esm/components/scatterplot/ScatterplotControls.js +71 -0
  57. package/dist/esm/components/scatterplot/SpatialControls.js +140 -0
  58. package/dist/esm/components/scatterplot/Toolbox.js +55 -0
  59. package/dist/esm/components/search-bar/SearchBar.js +90 -0
  60. package/dist/esm/components/search-bar/SearchResults.js +139 -0
  61. package/dist/esm/components/var-list/VarItem.js +254 -0
  62. package/dist/esm/components/var-list/VarList.js +291 -0
  63. package/dist/esm/components/var-list/VarListToolbar.js +87 -0
  64. package/dist/esm/components/var-list/VarSet.js +194 -0
  65. package/dist/esm/components/violin/Violin.js +141 -0
  66. package/dist/esm/components/violin/ViolinControls.js +24 -0
  67. package/dist/esm/constants/colorscales.js +22 -0
  68. package/dist/esm/constants/constants.js +88 -0
  69. package/dist/esm/context/DatasetContext.js +571 -0
  70. package/dist/esm/context/FilterContext.js +48 -0
  71. package/dist/esm/context/ZarrDataContext.js +26 -0
  72. package/dist/esm/helpers/color-helper.js +66 -0
  73. package/dist/esm/helpers/map-helper.js +53 -0
  74. package/dist/esm/helpers/zarr-helper.js +111 -0
  75. package/dist/esm/index.js +22 -0
  76. package/dist/esm/utils/Filter.js +147 -0
  77. package/dist/esm/utils/Histogram.js +44 -0
  78. package/dist/esm/utils/ImageViewer.js +27 -0
  79. package/dist/esm/utils/Legend.js +58 -0
  80. package/dist/esm/utils/LoadingIndicators.js +22 -0
  81. package/dist/esm/utils/Skeleton.js +12 -0
  82. package/dist/esm/utils/VirtualizedList.js +55 -0
  83. package/dist/esm/utils/errors.js +47 -0
  84. package/dist/esm/utils/requests.js +102 -0
  85. package/dist/esm/utils/search.js +39 -0
  86. package/dist/esm/utils/string.js +59 -0
  87. package/dist/esm/utils/zarrData.js +102 -0
  88. package/package.json +19 -7
  89. package/scss/cherita.scss +19 -50
  90. package/scss/components/accordions.scss +32 -0
  91. package/scss/components/layouts.scss +2 -1
  92. package/scss/components/lists.scss +14 -0
  93. package/dist/components/obs-list/ObsToolbar.js +0 -64
  94. package/dist/components/scatterplot/Toolbox.js +0 -31
  95. /package/dist/{components → cjs/components}/dotplot/Dotplot.js +0 -0
  96. /package/dist/{components → cjs/components}/dotplot/DotplotControls.js +0 -0
  97. /package/dist/{components → cjs/components}/heatmap/Heatmap.js +0 -0
  98. /package/dist/{components → cjs/components}/heatmap/HeatmapControls.js +0 -0
  99. /package/dist/{components → cjs/components}/matrixplot/Matrixplot.js +0 -0
  100. /package/dist/{components → cjs/components}/matrixplot/MatrixplotControls.js +0 -0
  101. /package/dist/{components → cjs/components}/scatterplot/ScatterplotControls.js +0 -0
  102. /package/dist/{components → cjs/components}/violin/ViolinControls.js +0 -0
  103. /package/dist/{constants → cjs/constants}/colorscales.js +0 -0
  104. /package/dist/{index.js → cjs/index.js} +0 -0
  105. /package/dist/{utils → cjs/utils}/errors.js +0 -0
  106. /package/dist/{utils → cjs/utils}/search.js +0 -0
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.ObsToolbar = ObsToolbar;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _reactBootstrap = require("react-bootstrap");
9
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
10
+ function ObsToolbar(_ref) {
11
+ let {
12
+ item,
13
+ showToggleAllObs = true,
14
+ onToggleAllObs
15
+ } = _ref;
16
+ const allToggledOn = !item.omit.length;
17
+ return showToggleAllObs && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Check, {
18
+ type: "switch",
19
+ id: "custom-switch",
20
+ label: "Toggle all",
21
+ checked: allToggledOn,
22
+ onChange: onToggleAllObs
23
+ });
24
+ }
@@ -7,8 +7,8 @@ exports.ObsmKeysList = ObsmKeysList;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
8
  var _reactBootstrap = require("react-bootstrap");
9
9
  var _DatasetContext = require("../../context/DatasetContext");
10
- var _LoadingIndicators = require("../../utils/LoadingIndicators");
11
10
  var _requests = require("../../utils/requests");
11
+ var _Skeleton = require("../../utils/Skeleton");
12
12
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
13
13
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
14
14
  function ObsmKeysList() {
@@ -36,7 +36,7 @@ function ObsmKeysList() {
36
36
  refetchOnMount: false
37
37
  });
38
38
  (0, _react.useEffect)(() => {
39
- if (!isPending && !serverError) {
39
+ if (!isPending && !serverError && fetchedData) {
40
40
  setObsmKeysList(fetchedData);
41
41
  }
42
42
  }, [fetchedData, isPending, serverError]);
@@ -58,13 +58,16 @@ function ObsmKeysList() {
58
58
  }, item);
59
59
  });
60
60
  if (!serverError) {
61
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactBootstrap.DropdownButton, {
61
+ if (isPending) {
62
+ return /*#__PURE__*/_react.default.createElement(_Skeleton.ObsmKeysListBtn, null);
63
+ }
64
+ return /*#__PURE__*/_react.default.createElement(_reactBootstrap.DropdownButton, {
62
65
  as: _reactBootstrap.ButtonGroup,
63
66
  title: dataset.selectedObsm || "Select an embedding",
64
- variant: dataset.selectedObsm ? "primary" : "outline-primary",
67
+ variant: dataset.selectedObsm ? "primary" : "warning",
65
68
  id: "bg-nested-dropdown",
66
69
  size: "sm"
67
- }, obsmList));
70
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Header, null, "Embeddings"), obsmList);
68
71
  } else {
69
72
  return /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
70
73
  placement: "top",
@@ -15,11 +15,12 @@ var _ObsmList = require("../obsm-list/ObsmList");
15
15
  var _SearchBar = require("../search-bar/SearchBar");
16
16
  var _VarList = require("../var-list/VarList");
17
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
18
- function OffcanvasObs({
19
- show,
20
- handleClose,
21
- ...props
22
- }) {
18
+ function OffcanvasObs(_ref) {
19
+ let {
20
+ show,
21
+ handleClose,
22
+ ...props
23
+ } = _ref;
23
24
  return /*#__PURE__*/_react.default.createElement(_Offcanvas.default, {
24
25
  show: show,
25
26
  onHide: handleClose,
@@ -31,10 +32,11 @@ function OffcanvasObs({
31
32
  className: "p-0"
32
33
  }, /*#__PURE__*/_react.default.createElement(_ObsList.ObsColsList, props)));
33
34
  }
34
- function OffcanvasObsm({
35
- show,
36
- handleClose
37
- }) {
35
+ function OffcanvasObsm(_ref2) {
36
+ let {
37
+ show,
38
+ handleClose
39
+ } = _ref2;
38
40
  return /*#__PURE__*/_react.default.createElement(_Offcanvas.default, {
39
41
  show: show,
40
42
  onHide: handleClose
@@ -42,11 +44,12 @@ function OffcanvasObsm({
42
44
  closeButton: true
43
45
  }, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Title, null, "Embedding space")), /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Body, null, /*#__PURE__*/_react.default.createElement(_ObsmList.ObsmKeysList, null)));
44
46
  }
45
- function OffcanvasVars({
46
- show,
47
- handleClose,
48
- mode = _constants.SELECTION_MODES.MULTIPLE
49
- }) {
47
+ function OffcanvasVars(_ref3) {
48
+ let {
49
+ show,
50
+ handleClose,
51
+ mode = _constants.SELECTION_MODES.MULTIPLE
52
+ } = _ref3;
50
53
  return /*#__PURE__*/_react.default.createElement(_Offcanvas.default, {
51
54
  show: show,
52
55
  onHide: handleClose
@@ -58,12 +61,13 @@ function OffcanvasVars({
58
61
  mode: mode
59
62
  })));
60
63
  }
61
- function OffcanvasControls({
62
- show,
63
- handleClose,
64
- Controls,
65
- ...props
66
- }) {
64
+ function OffcanvasControls(_ref4) {
65
+ let {
66
+ show,
67
+ handleClose,
68
+ Controls,
69
+ ...props
70
+ } = _ref4;
67
71
  return /*#__PURE__*/_react.default.createElement(_Offcanvas.default, {
68
72
  show: show,
69
73
  onHide: handleClose
@@ -76,14 +76,15 @@ function usePseudospatialData(plotType) {
76
76
  enabled: !!plotType && !!dataset.pseudospatial.maskSet
77
77
  });
78
78
  }
79
- function Pseudospatial({
80
- showLegend = true,
81
- sharedScaleRange = false,
82
- height = 200,
83
- setShowControls,
84
- plotType,
85
- setPlotType
86
- }) {
79
+ function Pseudospatial(_ref) {
80
+ let {
81
+ showLegend = true,
82
+ sharedScaleRange = false,
83
+ height = 200,
84
+ setShowControls,
85
+ plotType,
86
+ setPlotType
87
+ } = _ref;
87
88
  const dataset = (0, _DatasetContext.useDataset)();
88
89
  const [data, setData] = (0, _react.useState)([]);
89
90
  const [layout, setLayout] = (0, _react.useState)({});
@@ -132,7 +133,7 @@ function Pseudospatial({
132
133
  serverError
133
134
  } = usePseudospatialData(plotType);
134
135
  (0, _react.useEffect)(() => {
135
- if (!isPending && !serverError) {
136
+ if (!isPending && !serverError && fetchedData) {
136
137
  setData(fetchedData.data);
137
138
  setLayout(fetchedData.layout);
138
139
  updateColorscale(colorscale.current);
@@ -122,9 +122,10 @@ function MaskSet() {
122
122
  }
123
123
 
124
124
  // @TODO: add colormap, colorbar slider
125
- function PseudospatialToolbar({
126
- plotType
127
- }) {
125
+ function PseudospatialToolbar(_ref) {
126
+ let {
127
+ plotType
128
+ } = _ref;
128
129
  return /*#__PURE__*/_react.default.createElement("div", {
129
130
  className: "cherita-pseudospatial-toolbar"
130
131
  }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(MaskSet, null)), /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL && /*#__PURE__*/_react.default.createElement(CategoricalMode, null)));
@@ -13,8 +13,6 @@ var _editModes = require("@nebula.gl/edit-modes");
13
13
  var _layers2 = require("@nebula.gl/layers");
14
14
  var _lodash = _interopRequireDefault(require("lodash"));
15
15
  var _reactBootstrap = require("react-bootstrap");
16
- var _SpatialControls = require("./SpatialControls");
17
- var _Toolbox = require("./Toolbox");
18
16
  var _constants = require("../../constants/constants");
19
17
  var _DatasetContext = require("../../context/DatasetContext");
20
18
  var _FilterContext = require("../../context/FilterContext");
@@ -25,6 +23,8 @@ var _Legend = require("../../utils/Legend");
25
23
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
26
24
  var _string = require("../../utils/string");
27
25
  var _zarrData = require("../../utils/zarrData");
26
+ var _SpatialControls = require("./SpatialControls");
27
+ var _Toolbox = require("./Toolbox");
28
28
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
29
29
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
30
30
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
@@ -37,9 +37,10 @@ const INITIAL_VIEW_STATE = {
37
37
  pitch: 0,
38
38
  bearing: 0
39
39
  };
40
- function Scatterplot({
41
- radius = 30
42
- }) {
40
+ function Scatterplot(_ref) {
41
+ let {
42
+ radius = 30
43
+ } = _ref;
43
44
  const dataset = (0, _DatasetContext.useDataset)();
44
45
  const {
45
46
  obsIndices,
@@ -204,9 +205,10 @@ function Scatterplot({
204
205
  min: dataset.controls.range[0] * (valueMax - valueMin) + valueMin,
205
206
  max: dataset.controls.range[1] * (valueMax - valueMin) + valueMin
206
207
  };
207
- const getFillColor = (0, _react.useCallback)((_d, {
208
- index
209
- }) => {
208
+ const getFillColor = (0, _react.useCallback)((_d, _ref2) => {
209
+ let {
210
+ index
211
+ } = _ref2;
210
212
  const grayOut = obsIndices && !obsIndices.has(index);
211
213
  return getColor({
212
214
  value: (data.values[index] - min) / (max - min),
@@ -216,9 +218,10 @@ function Scatterplot({
216
218
  }, [data.values, obsIndices, getColor, isCategorical, max, min]);
217
219
 
218
220
  // @TODO: add support for pseudospatial hover to reflect in radius
219
- const getRadius = (0, _react.useCallback)((_d, {
220
- index
221
- }) => {
221
+ const getRadius = (0, _react.useCallback)((_d, _ref3) => {
222
+ let {
223
+ index
224
+ } = _ref3;
222
225
  const grayOut = obsIndices && !obsIndices.has(index);
223
226
  return grayOut ? 1 : 3;
224
227
  }, [obsIndices]);
@@ -241,11 +244,12 @@ function Scatterplot({
241
244
  data: features,
242
245
  mode: mode,
243
246
  selectedFeatureIndexes,
244
- onEdit: ({
245
- updatedData,
246
- editType,
247
- editContext
248
- }) => {
247
+ onEdit: _ref4 => {
248
+ let {
249
+ updatedData,
250
+ editType,
251
+ editContext
252
+ } = _ref4;
249
253
  setFeatures(updatedData);
250
254
  let updatedSelectedFeatureIndexes = selectedFeatureIndexes;
251
255
  if (editType === "addFeature") {
@@ -293,17 +297,19 @@ function Scatterplot({
293
297
  }
294
298
  setSelectedFeatureIndexes(f => info.object ? info.layer.id === "cherita-layer-draw" ? [info.index] : f : []);
295
299
  }
296
- const getLabel = (o, v, isVar = false) => {
300
+ const getLabel = function (o, v) {
301
+ let isVar = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
297
302
  if (isVar || o.type === _constants.OBS_TYPES.CONTINUOUS) {
298
303
  return `${o.name}: ${(0, _string.formatNumerical)(parseFloat(v))}`;
299
304
  } else {
300
305
  return `${o.name}: ${o.codesMap[v]}`;
301
306
  }
302
307
  };
303
- const getTooltip = ({
304
- object,
305
- index
306
- }) => {
308
+ const getTooltip = _ref5 => {
309
+ let {
310
+ object,
311
+ index
312
+ } = _ref5;
307
313
  if (!object || object?.type === "Feature") return;
308
314
  const text = [];
309
315
  if (dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && dataset.selectedObs && !_lodash.default.some(dataset.labelObs, {
@@ -355,9 +361,12 @@ function Scatterplot({
355
361
  setIsRendering(false);
356
362
  },
357
363
  useDevicePixels: false,
358
- getCursor: ({
359
- isDragging
360
- }) => mode !== _editModes.ViewMode ? "crosshair" : isDragging ? "grabbing" : "grab",
364
+ getCursor: _ref6 => {
365
+ let {
366
+ isDragging
367
+ } = _ref6;
368
+ return mode !== _editModes.ViewMode ? "crosshair" : isDragging ? "grabbing" : "grab";
369
+ },
361
370
  ref: deckRef
362
371
  }), /*#__PURE__*/_react.default.createElement(_SpatialControls.SpatialControls, {
363
372
  mode: mode,
@@ -12,23 +12,23 @@ var _editModes = require("@nebula.gl/edit-modes");
12
12
  var _Button = _interopRequireDefault(require("react-bootstrap/Button"));
13
13
  var _ButtonGroup = _interopRequireDefault(require("react-bootstrap/ButtonGroup"));
14
14
  var _Dropdown = _interopRequireDefault(require("react-bootstrap/Dropdown"));
15
- var _DropdownButton = _interopRequireDefault(require("react-bootstrap/DropdownButton"));
16
- var _ScatterplotControls = require("./ScatterplotControls");
17
15
  var _DatasetContext = require("../../context/DatasetContext");
18
16
  var _offcanvas = require("../offcanvas");
17
+ var _ScatterplotControls = require("./ScatterplotControls");
19
18
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
19
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
21
20
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
22
- function SpatialControls({
23
- mode,
24
- setMode,
25
- features,
26
- setFeatures,
27
- selectedFeatureIndexes,
28
- resetBounds,
29
- increaseZoom,
30
- decreaseZoom
31
- }) {
21
+ function SpatialControls(_ref) {
22
+ let {
23
+ mode,
24
+ setMode,
25
+ features,
26
+ setFeatures,
27
+ selectedFeatureIndexes,
28
+ resetBounds,
29
+ increaseZoom,
30
+ decreaseZoom
31
+ } = _ref;
32
32
  const dataset = (0, _DatasetContext.useDataset)();
33
33
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
34
34
  const [showControls, setShowControls] = (0, _react.useState)(false);
@@ -61,13 +61,8 @@ function SpatialControls({
61
61
  features: []
62
62
  });
63
63
  };
64
- const polygonControls = /*#__PURE__*/_react.default.createElement("div", {
65
- className: "mt-2"
66
- }, /*#__PURE__*/_react.default.createElement(_ButtonGroup.default, {
67
- vertical: true,
68
- className: "w-100"
69
- }, /*#__PURE__*/_react.default.createElement(_Button.default, {
70
- variant: dataset.sliceBy.polygons ? "primary" : "outline-primary",
64
+ const polygonControls = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_Button.default, {
65
+ active: dataset.sliceBy.polygons,
71
66
  title: "Filter data with polygons",
72
67
  onClick: () => {
73
68
  setMode(() => _editModes.ViewMode);
@@ -76,7 +71,6 @@ function SpatialControls({
76
71
  });
77
72
  }
78
73
  }, /*#__PURE__*/_react.default.createElement(_iconsMaterial.JoinInner, null)), /*#__PURE__*/_react.default.createElement(_Button.default, {
79
- variant: "outline-primary",
80
74
  title: "Delete selected polygons",
81
75
  onClick: () => {
82
76
  const newFeatures = features.features.filter((_f, i) => !selectedFeatureIndexes.includes(i));
@@ -88,12 +82,12 @@ function SpatialControls({
88
82
  disabled: !selectedFeatureIndexes.length
89
83
  }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
90
84
  icon: _freeSolidSvgIcons.faTrash
91
- }))));
85
+ })));
92
86
  return /*#__PURE__*/_react.default.createElement("div", {
93
87
  className: "cherita-spatial-controls"
94
88
  }, /*#__PURE__*/_react.default.createElement(_ButtonGroup.default, {
95
89
  vertical: true,
96
- className: "w-100"
90
+ className: "w-100 mb-1"
97
91
  }, /*#__PURE__*/_react.default.createElement(_Button.default, {
98
92
  onClick: increaseZoom,
99
93
  title: "Increase zoom"
@@ -110,37 +104,44 @@ function SpatialControls({
110
104
  }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
111
105
  icon: _freeSolidSvgIcons.faCrosshairs
112
106
  })), /*#__PURE__*/_react.default.createElement(_Button.default, {
107
+ onClick: handleShowControls
108
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
109
+ icon: _freeSolidSvgIcons.faSliders
110
+ }))), /*#__PURE__*/_react.default.createElement(_ButtonGroup.default, {
111
+ vertical: true,
112
+ className: "w-100"
113
+ }, /*#__PURE__*/_react.default.createElement(_Button.default, {
113
114
  onClick: () => setMode(() => _editModes.ViewMode),
114
115
  title: "Set dragging mode",
115
- variant: mode === _editModes.ViewMode ? "primary" : "outline-primary"
116
+ active: mode === _editModes.ViewMode
116
117
  }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
117
118
  icon: _freeSolidSvgIcons.faHand
118
- })), /*#__PURE__*/_react.default.createElement(_DropdownButton.default, {
119
+ })), /*#__PURE__*/_react.default.createElement(_Dropdown.default, {
119
120
  as: _ButtonGroup.default,
120
- title: /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
121
- icon: _freeSolidSvgIcons.faDrawPolygon
122
- })),
123
- drop: "end",
124
- id: "bg-vertical-dropdown-1",
125
121
  className: "caret-off",
122
+ drop: "end",
126
123
  onSelect: onSelect
127
- }, /*#__PURE__*/_react.default.createElement(_Dropdown.default.Header, null, "Selection tools"), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
128
- eventKey: "DrawPolygonMode"
129
- }, "Draw a polygon"), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
124
+ }, /*#__PURE__*/_react.default.createElement(_Dropdown.default.Toggle, {
125
+ id: "dropdown-autoclose-outside",
126
+ className: `caret-off ${mode === _editModes.DrawPolygonByDraggingMode || mode === _editModes.ModifyMode ? "active" : ""}`
127
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
128
+ icon: _freeSolidSvgIcons.faDrawPolygon
129
+ })), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Menu, null, /*#__PURE__*/_react.default.createElement(_Dropdown.default.Header, null, "Polygon tools"), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
130
130
  eventKey: "DrawPolygonByDraggingMode"
131
- }, "Draw a Polygon by Dragging"), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
131
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
132
+ icon: _freeSolidSvgIcons.faDrawPolygon,
133
+ className: "nav-icon"
134
+ }), "Draw a polygon"), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
132
135
  eventKey: "ModifyMode"
133
- }, "Modify polygons"), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
134
- eventKey: "ViewMode"
135
- }, "Viewing mode"), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
136
- onClick: deleteFeatures
137
136
  }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
138
- icon: _freeSolidSvgIcons.faTrash
139
- }), " Delete polygons")), /*#__PURE__*/_react.default.createElement(_Button.default, {
140
- onClick: handleShowControls
137
+ icon: _freeSolidSvgIcons.faPen,
138
+ className: "nav-icon"
139
+ }), "Modify polygons"), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
140
+ onClick: deleteFeatures
141
141
  }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
142
- icon: _freeSolidSvgIcons.faSliders
143
- }))), !!features?.features?.length && polygonControls, /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
142
+ icon: _freeSolidSvgIcons.faTrash,
143
+ className: "nav-icon"
144
+ }), "Delete polygons"))), !!features?.features?.length && polygonControls), /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
144
145
  show: showControls,
145
146
  handleClose: handleCloseControls,
146
147
  Controls: _ScatterplotControls.ScatterplotControls
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.Toolbox = Toolbox;
7
+ var _react = _interopRequireDefault(require("react"));
8
+ var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
+ var _reactFontawesome = require("@fortawesome/react-fontawesome");
10
+ var _reactBootstrap = require("react-bootstrap");
11
+ var _string = require("../../utils/string");
12
+ var _ObsmList = require("../obsm-list/ObsmList");
13
+ function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
+ function Toolbox(_ref) {
15
+ let {
16
+ mode,
17
+ obsLength,
18
+ slicedLength
19
+ } = _ref;
20
+ return /*#__PURE__*/_react.default.createElement("div", {
21
+ className: "cherita-toolbox"
22
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(_ObsmList.ObsmKeysList, null), mode && /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
23
+ placement: "top",
24
+ overlay: /*#__PURE__*/_react.default.createElement(_reactBootstrap.Tooltip, {
25
+ id: "tooltip-dropped-mode"
26
+ }, "The color scale is currently set to ", mode)
27
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
28
+ size: "sm",
29
+ variant: "primary",
30
+ style: {
31
+ cursor: "default"
32
+ },
33
+ "aria-disabled": "true"
34
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
35
+ icon: _freeSolidSvgIcons.faDroplet,
36
+ className: "me-1"
37
+ }), " ", mode)), (mode || !isNaN(obsLength)) && (mode !== null && !isNaN(slicedLength) && slicedLength !== obsLength ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
38
+ placement: "top",
39
+ overlay: /*#__PURE__*/_react.default.createElement(_reactBootstrap.Tooltip, {
40
+ id: "tooltip-dropped-mode"
41
+ }, "You have selected ", (0, _string.formatNumerical)(slicedLength), " out of", " ", (0, _string.formatNumerical)(obsLength), " cells")
42
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
43
+ size: "sm",
44
+ variant: "primary",
45
+ style: {
46
+ cursor: "default"
47
+ },
48
+ "aria-disabled": "true"
49
+ }, (0, _string.formatNumerical)(slicedLength), " of ", (0, _string.formatNumerical)(obsLength), " ", "cells")) : /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
50
+ placement: "top",
51
+ overlay: /*#__PURE__*/_react.default.createElement(_reactBootstrap.Tooltip, {
52
+ id: "tooltip-dropped-mode"
53
+ }, "You are viewing ", (0, _string.formatNumerical)(obsLength), " cells")
54
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
55
+ size: "sm",
56
+ variant: "primary",
57
+ style: {
58
+ cursor: "default"
59
+ },
60
+ "aria-disabled": "true"
61
+ }, (0, _string.formatNumerical)(obsLength), " cells")))));
62
+ }
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.SearchBar = SearchBar;
7
7
  var _react = _interopRequireWildcard(require("react"));
8
+ var _Search = _interopRequireDefault(require("@mui/icons-material/Search"));
8
9
  var _lodash = _interopRequireDefault(require("lodash"));
9
10
  var _reactBootstrap = require("react-bootstrap");
10
11
  var _SearchResults = require("./SearchResults");
@@ -25,11 +26,12 @@ function onVarSelect(dispatch, item) {
25
26
  value: "var"
26
27
  });
27
28
  }
28
- function SearchBar({
29
- searchVar = true,
30
- searchDiseases = false,
31
- handleSelect = onVarSelect
32
- }) {
29
+ function SearchBar(_ref) {
30
+ let {
31
+ searchVar = true,
32
+ searchDiseases = false,
33
+ handleSelect = onVarSelect
34
+ } = _ref;
33
35
  const [showSuggestions, setShowSuggestions] = (0, _react.useState)(false);
34
36
  const [text, setText] = (0, _react.useState)("");
35
37
  const inputRef = (0, _react.useRef)(null);
@@ -39,11 +41,13 @@ function SearchBar({
39
41
  setShowSuggestions(true);
40
42
  }
41
43
  }, [text]);
44
+
45
+ //@TODO: Abstract styles
42
46
  return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form, {
43
47
  onSubmit: e => {
44
48
  e.preventDefault();
45
49
  }
46
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.FormGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Control, {
50
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.FormGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Control, {
47
51
  ref: inputRef,
48
52
  onFocus: () => {
49
53
  setShowSuggestions(text.length > 0);
@@ -58,8 +62,21 @@ function SearchBar({
58
62
  value: text,
59
63
  onChange: e => {
60
64
  setText(e.target.value);
65
+ },
66
+ style: {
67
+ paddingLeft: "2.5rem",
68
+ borderRadius: "5px"
69
+ }
70
+ }), /*#__PURE__*/_react.default.createElement("div", {
71
+ style: {
72
+ position: "absolute",
73
+ left: "10px",
74
+ top: "50%",
75
+ transform: "translateY(-50%)",
76
+ pointerEvents: "none",
77
+ zIndex: 10
61
78
  }
62
- }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown, {
79
+ }, /*#__PURE__*/_react.default.createElement(_Search.default, null))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown, {
63
80
  show: showSuggestions,
64
81
  onMouseDown: e => {
65
82
  e.preventDefault();
@@ -13,11 +13,12 @@ var _search = require("../../utils/search");
13
13
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
14
14
  function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
15
15
  function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
16
- function VarSearchResults({
17
- text,
18
- setShowSuggestions,
19
- handleSelect
20
- }) {
16
+ function VarSearchResults(_ref) {
17
+ let {
18
+ text,
19
+ setShowSuggestions,
20
+ handleSelect
21
+ } = _ref;
21
22
  const [suggestions, setSuggestions] = (0, _react.useState)([]);
22
23
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
23
24
  const {
@@ -71,20 +72,18 @@ function VarSearchResults({
71
72
  });
72
73
  }, [deferredData, dispatch, handleSelect, isStale, setShowSuggestions]);
73
74
  return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Header, null, "Features"), /*#__PURE__*/_react.default.createElement("div", {
74
- style: {
75
- maxHeight: "25vh",
76
- overflowY: "scroll"
77
- }
75
+ className: "search-results"
78
76
  }, deferredData?.length ? suggestionsList : /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Item, {
79
77
  key: "empty",
80
78
  as: "button",
81
79
  disabled: true
82
80
  }, !serverError ? isStale || isPending ? "Loading..." : "No items found" : "Failed to fetch data")));
83
81
  }
84
- function DiseasesSearchResults({
85
- text,
86
- setShowSuggestions
87
- }) {
82
+ function DiseasesSearchResults(_ref2) {
83
+ let {
84
+ text,
85
+ setShowSuggestions
86
+ } = _ref2;
88
87
  const [suggestions, setSuggestions] = (0, _react.useState)([]);
89
88
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
90
89
  const {
@@ -141,10 +140,7 @@ function DiseasesSearchResults({
141
140
  });
142
141
  }, [deferredData, dispatch, isStale, setShowSuggestions]);
143
142
  return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Header, null, "Diseases"), /*#__PURE__*/_react.default.createElement("div", {
144
- style: {
145
- maxHeight: "25vh",
146
- overflowY: "scroll"
147
- }
143
+ className: "search-results"
148
144
  }, deferredData?.length ? suggestionsList : /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Item, {
149
145
  key: "empty",
150
146
  as: "button",