@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.
- package/README.md +5 -0
- package/dist/components/dotplot/Dotplot.js +19 -26
- package/dist/components/dotplot/DotplotControls.js +106 -147
- package/dist/components/full-page/FullPage.js +99 -148
- package/dist/components/heatmap/Heatmap.js +19 -26
- package/dist/components/heatmap/HeatmapControls.js +7 -13
- package/dist/components/matrixplot/Matrixplot.js +19 -26
- package/dist/components/matrixplot/MatrixplotControls.js +14 -35
- package/dist/components/obs-list/ObsItem.js +182 -239
- package/dist/components/obs-list/ObsList.js +40 -49
- package/dist/components/obs-list/ObsToolbar.js +44 -55
- package/dist/components/obsm-list/ObsmList.js +15 -23
- package/dist/components/offcanvas/index.js +45 -75
- package/dist/components/pseudospatial/Pseudospatial.js +26 -34
- package/dist/components/pseudospatial/PseudospatialControls.js +1 -2
- package/dist/components/pseudospatial/PseudospatialToolbar.js +37 -65
- package/dist/components/scatterplot/Scatterplot.js +74 -89
- package/dist/components/scatterplot/ScatterplotControls.js +28 -39
- package/dist/components/scatterplot/SpatialControls.js +94 -117
- package/dist/components/scatterplot/Toolbox.js +16 -24
- package/dist/components/search-bar/SearchBar.js +45 -54
- package/dist/components/search-bar/SearchResults.js +36 -49
- package/dist/components/var-list/VarItem.js +112 -160
- package/dist/components/var-list/VarList.js +81 -124
- package/dist/components/var-list/VarListToolbar.js +48 -59
- package/dist/components/var-list/VarSet.js +95 -120
- package/dist/components/violin/Violin.js +31 -46
- package/dist/components/violin/ViolinControls.js +8 -22
- package/dist/context/DatasetContext.js +17 -27
- package/dist/context/FilterContext.js +8 -12
- package/dist/context/ZarrDataContext.js +6 -9
- package/dist/helpers/color-helper.js +11 -12
- package/dist/helpers/map-helper.js +7 -8
- package/dist/helpers/zarr-helper.js +9 -15
- package/dist/utils/Histogram.js +34 -41
- package/dist/utils/ImageViewer.js +9 -14
- package/dist/utils/Legend.js +30 -40
- package/dist/utils/LoadingIndicators.js +16 -19
- package/dist/utils/VirtualizedList.js +32 -39
- package/dist/utils/requests.js +15 -25
- package/dist/utils/string.js +4 -9
- package/dist/utils/zarrData.js +2 -8
- 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(
|
|
42
|
-
|
|
43
|
-
|
|
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,
|
|
210
|
-
|
|
211
|
-
|
|
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,
|
|
223
|
-
|
|
224
|
-
|
|
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:
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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 =
|
|
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 =
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
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__*/
|
|
347
|
-
className: "cherita-container-scatterplot"
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
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__*/
|
|
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__*/
|
|
57
|
-
className: "w-100"
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
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(
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
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__*/
|
|
67
|
-
className: "mt-2"
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
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(
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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
|
}
|