@haniffalab/cherita-react 0.2.0-dev.2025-01-22.f523ac5e → 0.2.0-dev.2025-01-28.7a60aa67

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 (43) hide show
  1. package/README.md +5 -0
  2. package/dist/components/dotplot/Dotplot.js +19 -26
  3. package/dist/components/dotplot/DotplotControls.js +106 -147
  4. package/dist/components/full-page/FullPage.js +99 -148
  5. package/dist/components/heatmap/Heatmap.js +19 -26
  6. package/dist/components/heatmap/HeatmapControls.js +7 -13
  7. package/dist/components/matrixplot/Matrixplot.js +19 -26
  8. package/dist/components/matrixplot/MatrixplotControls.js +14 -35
  9. package/dist/components/obs-list/ObsItem.js +182 -239
  10. package/dist/components/obs-list/ObsList.js +40 -49
  11. package/dist/components/obs-list/ObsToolbar.js +44 -55
  12. package/dist/components/obsm-list/ObsmList.js +15 -23
  13. package/dist/components/offcanvas/index.js +45 -75
  14. package/dist/components/pseudospatial/Pseudospatial.js +26 -34
  15. package/dist/components/pseudospatial/PseudospatialControls.js +1 -2
  16. package/dist/components/pseudospatial/PseudospatialToolbar.js +37 -65
  17. package/dist/components/scatterplot/Scatterplot.js +74 -89
  18. package/dist/components/scatterplot/ScatterplotControls.js +28 -39
  19. package/dist/components/scatterplot/SpatialControls.js +94 -117
  20. package/dist/components/scatterplot/Toolbox.js +16 -24
  21. package/dist/components/search-bar/SearchBar.js +45 -54
  22. package/dist/components/search-bar/SearchResults.js +36 -49
  23. package/dist/components/var-list/VarItem.js +112 -160
  24. package/dist/components/var-list/VarList.js +81 -124
  25. package/dist/components/var-list/VarListToolbar.js +48 -59
  26. package/dist/components/var-list/VarSet.js +95 -120
  27. package/dist/components/violin/Violin.js +31 -46
  28. package/dist/components/violin/ViolinControls.js +8 -22
  29. package/dist/context/DatasetContext.js +17 -27
  30. package/dist/context/FilterContext.js +8 -12
  31. package/dist/context/ZarrDataContext.js +6 -9
  32. package/dist/helpers/color-helper.js +11 -12
  33. package/dist/helpers/map-helper.js +7 -8
  34. package/dist/helpers/zarr-helper.js +9 -15
  35. package/dist/utils/Histogram.js +34 -41
  36. package/dist/utils/ImageViewer.js +9 -14
  37. package/dist/utils/Legend.js +30 -40
  38. package/dist/utils/LoadingIndicators.js +16 -19
  39. package/dist/utils/VirtualizedList.js +32 -39
  40. package/dist/utils/requests.js +15 -25
  41. package/dist/utils/string.js +4 -9
  42. package/dist/utils/zarrData.js +2 -8
  43. package/package.json +40 -34
@@ -25,7 +25,6 @@ var _Legend = require("../../utils/Legend");
25
25
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
26
26
  var _string = require("../../utils/string");
27
27
  var _zarrData = require("../../utils/zarrData");
28
- var _jsxRuntime = require("react/jsx-runtime");
29
28
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
30
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); }
31
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; }
@@ -38,10 +37,9 @@ const INITIAL_VIEW_STATE = {
38
37
  pitch: 0,
39
38
  bearing: 0
40
39
  };
41
- function Scatterplot(_ref) {
42
- let {
43
- radius = 30
44
- } = _ref;
40
+ function Scatterplot({
41
+ radius = 30
42
+ }) {
45
43
  const dataset = (0, _DatasetContext.useDataset)();
46
44
  const {
47
45
  obsIndices,
@@ -206,10 +204,9 @@ function Scatterplot(_ref) {
206
204
  min: dataset.controls.range[0] * (valueMax - valueMin) + valueMin,
207
205
  max: dataset.controls.range[1] * (valueMax - valueMin) + valueMin
208
206
  };
209
- const getFillColor = (0, _react.useCallback)((_d, _ref2) => {
210
- let {
211
- index
212
- } = _ref2;
207
+ const getFillColor = (0, _react.useCallback)((_d, {
208
+ index
209
+ }) => {
213
210
  const grayOut = obsIndices && !obsIndices.has(index);
214
211
  return getColor({
215
212
  value: (data.values[index] - min) / (max - min),
@@ -219,10 +216,9 @@ function Scatterplot(_ref) {
219
216
  }, [data.values, obsIndices, getColor, isCategorical, max, min]);
220
217
 
221
218
  // @TODO: add support for pseudospatial hover to reflect in radius
222
- const getRadius = (0, _react.useCallback)((_d, _ref3) => {
223
- let {
224
- index
225
- } = _ref3;
219
+ const getRadius = (0, _react.useCallback)((_d, {
220
+ index
221
+ }) => {
226
222
  const grayOut = obsIndices && !obsIndices.has(index);
227
223
  return grayOut ? 1 : 3;
228
224
  }, [obsIndices]);
@@ -245,12 +241,11 @@ function Scatterplot(_ref) {
245
241
  data: features,
246
242
  mode: mode,
247
243
  selectedFeatureIndexes,
248
- onEdit: _ref4 => {
249
- let {
250
- updatedData,
251
- editType,
252
- editContext
253
- } = _ref4;
244
+ onEdit: ({
245
+ updatedData,
246
+ editType,
247
+ editContext
248
+ }) => {
254
249
  setFeatures(updatedData);
255
250
  let updatedSelectedFeatureIndexes = selectedFeatureIndexes;
256
251
  if (editType === "addFeature") {
@@ -298,19 +293,17 @@ function Scatterplot(_ref) {
298
293
  }
299
294
  setSelectedFeatureIndexes(f => info.object ? info.layer.id === "cherita-layer-draw" ? [info.index] : f : []);
300
295
  }
301
- const getLabel = function (o, v) {
302
- let isVar = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
296
+ const getLabel = (o, v, isVar = false) => {
303
297
  if (isVar || o.type === _constants.OBS_TYPES.CONTINUOUS) {
304
298
  return `${o.name}: ${(0, _string.formatNumerical)(parseFloat(v))}`;
305
299
  } else {
306
300
  return `${o.name}: ${o.codesMap[v]}`;
307
301
  }
308
302
  };
309
- const getTooltip = _ref5 => {
310
- let {
311
- object,
312
- index
313
- } = _ref5;
303
+ const getTooltip = ({
304
+ object,
305
+ index
306
+ }) => {
314
307
  if (!object || object?.type === "Feature") return;
315
308
  const text = [];
316
309
  if (dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && dataset.selectedObs && !_lodash.default.some(dataset.labelObs, {
@@ -343,67 +336,59 @@ function Scatterplot(_ref) {
343
336
  };
344
337
  const isPending = (isRendering || xData.isPending || obsmData.isPending) && !obsmData.isPending;
345
338
  const error = dataset.selectedObsm && obsmData.serverError?.length || dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR && xData.serverError?.length || dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS && obsData.serverError?.length || dataset.labelObs.lengh && labelObsData.serverError?.length;
346
- return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
347
- className: "cherita-container-scatterplot",
348
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
349
- className: "cherita-scatterplot",
350
- children: [obsmData.isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {
351
- disableShrink: true
352
- }), isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingLinear, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_react2.DeckGL, {
353
- viewState: viewState,
354
- onViewStateChange: e => setViewState(e.viewState),
355
- controller: {
356
- doubleClickZoom: mode === _editModes.ViewMode
357
- },
358
- layers: layers,
359
- onClick: onLayerClick,
360
- getTooltip: getTooltip,
361
- onAfterRender: () => {
362
- setIsRendering(false);
363
- },
364
- useDevicePixels: false,
365
- getCursor: _ref6 => {
366
- let {
367
- isDragging
368
- } = _ref6;
369
- return mode !== _editModes.ViewMode ? "crosshair" : isDragging ? "grabbing" : "grab";
370
- },
371
- ref: deckRef
372
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_SpatialControls.SpatialControls, {
373
- mode: mode,
374
- setMode: setMode,
375
- features: features,
376
- setFeatures: setFeatures,
377
- selectedFeatureIndexes: selectedFeatureIndexes,
378
- resetBounds: () => setViewState(getBounds()),
379
- increaseZoom: () => setViewState(v => ({
380
- ...v,
381
- zoom: v.zoom + 1
382
- })),
383
- decreaseZoom: () => setViewState(v => ({
384
- ...v,
385
- zoom: v.zoom - 1
386
- }))
387
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
388
- className: "cherita-spatial-footer",
389
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
390
- className: "cherita-toolbox-footer",
391
- children: [error && !isPending && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Alert, {
392
- variant: "danger",
393
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
394
- icon: _freeSolidSvgIcons.faTriangleExclamation
395
- }), "\xA0Error loading data"]
396
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Toolbox.Toolbox, {
397
- mode: dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? dataset.selectedVar.name : dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS ? dataset.selectedObs.name : null,
398
- obsLength: parseInt(obsmData.data?.length),
399
- slicedLength: parseInt(slicedLength)
400
- })]
401
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Legend.Legend, {
402
- isCategorical: isCategorical,
403
- min: min,
404
- max: max
405
- })]
406
- })]
407
- })
408
- });
339
+ return /*#__PURE__*/_react.default.createElement("div", {
340
+ className: "cherita-container-scatterplot"
341
+ }, /*#__PURE__*/_react.default.createElement("div", {
342
+ className: "cherita-scatterplot"
343
+ }, obsmData.isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, {
344
+ disableShrink: true
345
+ }), isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingLinear, null), /*#__PURE__*/_react.default.createElement(_react2.DeckGL, {
346
+ viewState: viewState,
347
+ onViewStateChange: e => setViewState(e.viewState),
348
+ controller: {
349
+ doubleClickZoom: mode === _editModes.ViewMode
350
+ },
351
+ layers: layers,
352
+ onClick: onLayerClick,
353
+ getTooltip: getTooltip,
354
+ onAfterRender: () => {
355
+ setIsRendering(false);
356
+ },
357
+ useDevicePixels: false,
358
+ getCursor: ({
359
+ isDragging
360
+ }) => mode !== _editModes.ViewMode ? "crosshair" : isDragging ? "grabbing" : "grab",
361
+ ref: deckRef
362
+ }), /*#__PURE__*/_react.default.createElement(_SpatialControls.SpatialControls, {
363
+ mode: mode,
364
+ setMode: setMode,
365
+ features: features,
366
+ setFeatures: setFeatures,
367
+ selectedFeatureIndexes: selectedFeatureIndexes,
368
+ resetBounds: () => setViewState(getBounds()),
369
+ increaseZoom: () => setViewState(v => ({
370
+ ...v,
371
+ zoom: v.zoom + 1
372
+ })),
373
+ decreaseZoom: () => setViewState(v => ({
374
+ ...v,
375
+ zoom: v.zoom - 1
376
+ }))
377
+ }), /*#__PURE__*/_react.default.createElement("div", {
378
+ className: "cherita-spatial-footer"
379
+ }, /*#__PURE__*/_react.default.createElement("div", {
380
+ className: "cherita-toolbox-footer"
381
+ }, error && !isPending && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
382
+ variant: "danger"
383
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
384
+ icon: _freeSolidSvgIcons.faTriangleExclamation
385
+ }), "\xA0Error loading data"), /*#__PURE__*/_react.default.createElement(_Toolbox.Toolbox, {
386
+ mode: dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? dataset.selectedVar.name : dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS ? dataset.selectedObs.name : null,
387
+ obsLength: parseInt(obsmData.data?.length),
388
+ slicedLength: parseInt(slicedLength)
389
+ })), /*#__PURE__*/_react.default.createElement(_Legend.Legend, {
390
+ isCategorical: isCategorical,
391
+ min: min,
392
+ max: max
393
+ }))));
409
394
  }
@@ -11,7 +11,6 @@ var _reactBootstrap = require("react-bootstrap");
11
11
  var _colorscales = require("../../constants/colorscales");
12
12
  var _constants = require("../../constants/constants");
13
13
  var _DatasetContext = require("../../context/DatasetContext");
14
- var _jsxRuntime = require("react/jsx-runtime");
15
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
15
  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); }
17
16
  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; }
@@ -20,15 +19,15 @@ const ScatterplotControls = () => {
20
19
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
21
20
  const [sliderValue, setSliderValue] = _react.default.useState(dataset.controls.range || [0, 1]);
22
21
  const isCategorical = dataset.colorEncoding === _constants.COLOR_ENCODINGS.OBS ? dataset.selectedObs?.type === _constants.OBS_TYPES.CATEGORICAL : false;
23
- const colormapList = _lodash.default.keys(_colorscales.COLORSCALES).map(key => /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Item, {
22
+ const colormapList = _lodash.default.keys(_colorscales.COLORSCALES).map(key => /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Item, {
23
+ key: key,
24
24
  active: dataset.controls.colorScale === key,
25
25
  onClick: () => {
26
26
  dispatch({
27
27
  type: "set.controls.colorScale",
28
28
  colorScale: key
29
29
  });
30
- },
31
- children: key
30
+ }
32
31
  }, key));
33
32
  const valueLabelFormat = value => {
34
33
  return (value * (dataset.controls.valueRange[1] - dataset.controls.valueRange[0]) + dataset.controls.valueRange[0]).toFixed(2);
@@ -53,40 +52,30 @@ const ScatterplotControls = () => {
53
52
  (0, _react.useEffect)(() => {
54
53
  setSliderValue(dataset.controls.range);
55
54
  }, [dataset.controls.range]);
56
- const rangeSlider = /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
57
- className: "w-100",
58
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Typography, {
59
- id: "colorscale-range",
60
- gutterBottom: true,
61
- children: "Colorscale range"
62
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Slider, {
63
- "aria-labelledby": "colorscale-range",
64
- min: 0,
65
- max: 1,
66
- step: 0.001,
67
- value: sliderValue,
68
- onChange: updateSlider,
69
- onChangeCommitted: updateRange,
70
- valueLabelDisplay: "auto",
71
- getAriaValueText: valueLabelFormat,
72
- valueLabelFormat: valueLabelFormat,
73
- marks: marks,
74
- disabled: isCategorical
75
- })]
76
- });
77
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
78
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Dropdown, {
79
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Toggle, {
80
- id: "dropdownColorscale",
81
- variant: "light",
82
- children: dataset.controls.colorScale
83
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Dropdown.Menu, {
84
- children: colormapList
85
- })]
86
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
87
- className: "m-4",
88
- children: rangeSlider
89
- })]
90
- });
55
+ const rangeSlider = /*#__PURE__*/_react.default.createElement(_material.Box, {
56
+ className: "w-100"
57
+ }, /*#__PURE__*/_react.default.createElement(_material.Typography, {
58
+ id: "colorscale-range",
59
+ gutterBottom: true
60
+ }, "Colorscale range"), /*#__PURE__*/_react.default.createElement(_material.Slider, {
61
+ "aria-labelledby": "colorscale-range",
62
+ min: 0,
63
+ max: 1,
64
+ step: 0.001,
65
+ value: sliderValue,
66
+ onChange: updateSlider,
67
+ onChangeCommitted: updateRange,
68
+ valueLabelDisplay: "auto",
69
+ getAriaValueText: valueLabelFormat,
70
+ valueLabelFormat: valueLabelFormat,
71
+ marks: marks,
72
+ disabled: isCategorical
73
+ }));
74
+ return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Toggle, {
75
+ id: "dropdownColorscale",
76
+ variant: "light"
77
+ }, dataset.controls.colorScale), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Dropdown.Menu, null, colormapList)), /*#__PURE__*/_react.default.createElement("div", {
78
+ className: "m-4"
79
+ }, rangeSlider));
91
80
  };
92
81
  exports.ScatterplotControls = ScatterplotControls;
@@ -16,21 +16,19 @@ var _DropdownButton = _interopRequireDefault(require("react-bootstrap/DropdownBu
16
16
  var _ScatterplotControls = require("./ScatterplotControls");
17
17
  var _DatasetContext = require("../../context/DatasetContext");
18
18
  var _offcanvas = require("../offcanvas");
19
- var _jsxRuntime = require("react/jsx-runtime");
20
19
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
21
20
  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); }
22
21
  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; }
23
- function SpatialControls(_ref) {
24
- let {
25
- mode,
26
- setMode,
27
- features,
28
- setFeatures,
29
- selectedFeatureIndexes,
30
- resetBounds,
31
- increaseZoom,
32
- decreaseZoom
33
- } = _ref;
22
+ function SpatialControls({
23
+ mode,
24
+ setMode,
25
+ features,
26
+ setFeatures,
27
+ selectedFeatureIndexes,
28
+ resetBounds,
29
+ increaseZoom,
30
+ decreaseZoom
31
+ }) {
34
32
  const dataset = (0, _DatasetContext.useDataset)();
35
33
  const dispatch = (0, _DatasetContext.useDatasetDispatch)();
36
34
  const [showControls, setShowControls] = (0, _react.useState)(false);
@@ -63,109 +61,88 @@ function SpatialControls(_ref) {
63
61
  features: []
64
62
  });
65
63
  };
66
- const polygonControls = /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
67
- className: "mt-2",
68
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_ButtonGroup.default, {
69
- vertical: true,
70
- className: "w-100",
71
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
72
- variant: dataset.sliceBy.polygons ? "primary" : "outline-primary",
73
- title: "Filter data with polygons",
74
- onClick: () => {
75
- setMode(() => _editModes.ViewMode);
76
- dispatch({
77
- type: "toggle.slice.polygons"
78
- });
79
- },
80
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_iconsMaterial.JoinInner, {})
81
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
82
- variant: "outline-primary",
83
- title: "Delete selected polygons",
84
- onClick: () => {
85
- const newFeatures = features.features.filter((_f, i) => !selectedFeatureIndexes.includes(i));
86
- setFeatures({
87
- type: "FeatureCollection",
88
- features: newFeatures
89
- });
90
- },
91
- disabled: !selectedFeatureIndexes.length,
92
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
93
- icon: _freeSolidSvgIcons.faTrash
94
- })
95
- })]
96
- })
97
- });
98
- return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
99
- className: "cherita-spatial-controls",
100
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_ButtonGroup.default, {
101
- vertical: true,
102
- className: "w-100",
103
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
104
- onClick: increaseZoom,
105
- title: "Increase zoom",
106
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
107
- icon: _freeSolidSvgIcons.faPlus
108
- })
109
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
110
- onClick: decreaseZoom,
111
- title: "Decrease zoom",
112
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
113
- icon: _freeSolidSvgIcons.faMinus
114
- })
115
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
116
- onClick: resetBounds,
117
- title: "Reset zoom and center",
118
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
119
- icon: _freeSolidSvgIcons.faCrosshairs
120
- })
121
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
122
- onClick: () => setMode(() => _editModes.ViewMode),
123
- title: "Set dragging mode",
124
- variant: mode === _editModes.ViewMode ? "primary" : "outline-primary",
125
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
126
- icon: _freeSolidSvgIcons.faHand
127
- })
128
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_DropdownButton.default, {
129
- as: _ButtonGroup.default,
130
- title: /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
131
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
132
- icon: _freeSolidSvgIcons.faDrawPolygon
133
- })
134
- }),
135
- drop: "end",
136
- id: "bg-vertical-dropdown-1",
137
- className: "caret-off",
138
- onSelect: onSelect,
139
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Dropdown.default.Header, {
140
- children: "Selection tools"
141
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Dropdown.default.Item, {
142
- eventKey: "DrawPolygonMode",
143
- children: "Draw a polygon"
144
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Dropdown.default.Item, {
145
- eventKey: "DrawPolygonByDraggingMode",
146
- children: "Draw a Polygon by Dragging"
147
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Dropdown.default.Item, {
148
- eventKey: "ModifyMode",
149
- children: "Modify polygons"
150
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Dropdown.default.Item, {
151
- eventKey: "ViewMode",
152
- children: "Viewing mode"
153
- }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Dropdown.default.Item, {
154
- onClick: deleteFeatures,
155
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
156
- icon: _freeSolidSvgIcons.faTrash
157
- }), " Delete polygons"]
158
- })]
159
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Button.default, {
160
- onClick: handleShowControls,
161
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
162
- icon: _freeSolidSvgIcons.faSliders
163
- })
164
- })]
165
- }), !!features?.features?.length && polygonControls, /*#__PURE__*/(0, _jsxRuntime.jsx)(_offcanvas.OffcanvasControls, {
166
- show: showControls,
167
- handleClose: handleCloseControls,
168
- Controls: _ScatterplotControls.ScatterplotControls
169
- })]
170
- });
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",
71
+ title: "Filter data with polygons",
72
+ onClick: () => {
73
+ setMode(() => _editModes.ViewMode);
74
+ dispatch({
75
+ type: "toggle.slice.polygons"
76
+ });
77
+ }
78
+ }, /*#__PURE__*/_react.default.createElement(_iconsMaterial.JoinInner, null)), /*#__PURE__*/_react.default.createElement(_Button.default, {
79
+ variant: "outline-primary",
80
+ title: "Delete selected polygons",
81
+ onClick: () => {
82
+ const newFeatures = features.features.filter((_f, i) => !selectedFeatureIndexes.includes(i));
83
+ setFeatures({
84
+ type: "FeatureCollection",
85
+ features: newFeatures
86
+ });
87
+ },
88
+ disabled: !selectedFeatureIndexes.length
89
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
90
+ icon: _freeSolidSvgIcons.faTrash
91
+ }))));
92
+ return /*#__PURE__*/_react.default.createElement("div", {
93
+ className: "cherita-spatial-controls"
94
+ }, /*#__PURE__*/_react.default.createElement(_ButtonGroup.default, {
95
+ vertical: true,
96
+ className: "w-100"
97
+ }, /*#__PURE__*/_react.default.createElement(_Button.default, {
98
+ onClick: increaseZoom,
99
+ title: "Increase zoom"
100
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
101
+ icon: _freeSolidSvgIcons.faPlus
102
+ })), /*#__PURE__*/_react.default.createElement(_Button.default, {
103
+ onClick: decreaseZoom,
104
+ title: "Decrease zoom"
105
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
106
+ icon: _freeSolidSvgIcons.faMinus
107
+ })), /*#__PURE__*/_react.default.createElement(_Button.default, {
108
+ onClick: resetBounds,
109
+ title: "Reset zoom and center"
110
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
111
+ icon: _freeSolidSvgIcons.faCrosshairs
112
+ })), /*#__PURE__*/_react.default.createElement(_Button.default, {
113
+ onClick: () => setMode(() => _editModes.ViewMode),
114
+ title: "Set dragging mode",
115
+ variant: mode === _editModes.ViewMode ? "primary" : "outline-primary"
116
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
117
+ icon: _freeSolidSvgIcons.faHand
118
+ })), /*#__PURE__*/_react.default.createElement(_DropdownButton.default, {
119
+ 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
+ className: "caret-off",
126
+ 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, {
130
+ eventKey: "DrawPolygonByDraggingMode"
131
+ }, "Draw a Polygon by Dragging"), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
132
+ 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
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
138
+ icon: _freeSolidSvgIcons.faTrash
139
+ }), " Delete polygons")), /*#__PURE__*/_react.default.createElement(_Button.default, {
140
+ onClick: handleShowControls
141
+ }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
142
+ icon: _freeSolidSvgIcons.faSliders
143
+ }))), !!features?.features?.length && polygonControls, /*#__PURE__*/_react.default.createElement(_offcanvas.OffcanvasControls, {
144
+ show: showControls,
145
+ handleClose: handleCloseControls,
146
+ Controls: _ScatterplotControls.ScatterplotControls
147
+ }));
171
148
  }
@@ -11,29 +11,21 @@ var _Button = _interopRequireDefault(require("react-bootstrap/Button"));
11
11
  var _ButtonGroup = _interopRequireDefault(require("react-bootstrap/ButtonGroup"));
12
12
  var _string = require("../../utils/string");
13
13
  var _ObsmList = require("../obsm-list/ObsmList");
14
- var _jsxRuntime = require("react/jsx-runtime");
15
14
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
16
- function Toolbox(_ref) {
17
- let {
18
- mode,
19
- obsLength,
20
- slicedLength
21
- } = _ref;
22
- return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
23
- className: "cherita-toolbox",
24
- children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_ButtonGroup.default, {
25
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ObsmList.ObsmKeysList, {}), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
26
- size: "sm",
27
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
28
- icon: _freeSolidSvgIcons.faDroplet
29
- }), " ", mode]
30
- }), (mode || !isNaN(obsLength)) && (mode !== null && !isNaN(slicedLength) && slicedLength !== obsLength ? /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
31
- size: "sm",
32
- children: [(0, _string.formatNumerical)(slicedLength), " out of", " ", (0, _string.formatNumerical)(obsLength), " cells"]
33
- }) : /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
34
- size: "sm",
35
- children: [(0, _string.formatNumerical)(obsLength), " cells"]
36
- }))]
37
- })
38
- });
15
+ function Toolbox({
16
+ mode,
17
+ obsLength,
18
+ slicedLength
19
+ }) {
20
+ return /*#__PURE__*/_react.React.createElement("div", {
21
+ className: "cherita-toolbox"
22
+ }, /*#__PURE__*/_react.React.createElement(_ButtonGroup.default, null, /*#__PURE__*/_react.React.createElement(_ObsmList.ObsmKeysList, null), /*#__PURE__*/_react.React.createElement(_Button.default, {
23
+ size: "sm"
24
+ }, /*#__PURE__*/_react.React.createElement(_reactFontawesome.FontAwesomeIcon, {
25
+ icon: _freeSolidSvgIcons.faDroplet
26
+ }), " ", mode), (mode || !isNaN(obsLength)) && (mode !== null && !isNaN(slicedLength) && slicedLength !== obsLength ? /*#__PURE__*/_react.React.createElement(_Button.default, {
27
+ size: "sm"
28
+ }, (0, _string.formatNumerical)(slicedLength), " out of", " ", (0, _string.formatNumerical)(obsLength), " cells") : /*#__PURE__*/_react.React.createElement(_Button.default, {
29
+ size: "sm"
30
+ }, (0, _string.formatNumerical)(obsLength), " cells"))));
39
31
  }