@haniffalab/cherita-react 0.2.1 → 1.0.0-dev.2025-03-07.aedc1788
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/LICENSE +21 -0
- package/README.md +7 -1
- package/dist/components/full-page/FullPage.js +15 -38
- package/dist/components/full-page/FullPagePseudospatial.js +159 -0
- package/dist/components/obs-list/ObsItem.js +114 -20
- package/dist/components/obs-list/ObsList.js +57 -16
- package/dist/components/obs-list/ObsToolbar.js +4 -4
- package/dist/components/offcanvas/index.js +3 -2
- package/dist/components/pseudospatial/Pseudospatial.js +32 -9
- package/dist/components/pseudospatial/PseudospatialToolbar.js +2 -0
- package/dist/components/scatterplot/Scatterplot.js +1 -1
- package/dist/context/DatasetContext.js +11 -6
- package/dist/css/cherita.css +428 -230
- package/dist/css/cherita.css.map +1 -1
- package/dist/helpers/map-helper.js +21 -16
- package/dist/helpers/zarr-helper.js +63 -57
- package/dist/index.js +15 -14
- package/dist/utils/VirtualizedList.js +2 -1
- package/dist/utils/requests.js +14 -2
- package/dist/utils/zarrData.js +22 -12
- package/package.json +27 -20
- package/scss/cherita.scss +89 -47
- package/scss/components/layouts.scss +101 -0
- package/scss/components/plotly.scss +30 -0
- package/scss/components/plots.scss +13 -0
- package/scss/components/scrollbars.scss +18 -0
- package/dist/components/pseudospatial/PseudospatialControls.js +0 -11
|
@@ -61,12 +61,13 @@ function OffcanvasVars({
|
|
|
61
61
|
function OffcanvasControls({
|
|
62
62
|
show,
|
|
63
63
|
handleClose,
|
|
64
|
-
Controls
|
|
64
|
+
Controls,
|
|
65
|
+
...props
|
|
65
66
|
}) {
|
|
66
67
|
return /*#__PURE__*/_react.default.createElement(_Offcanvas.default, {
|
|
67
68
|
show: show,
|
|
68
69
|
onHide: handleClose
|
|
69
70
|
}, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Header, {
|
|
70
71
|
closeButton: true
|
|
71
|
-
}, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Title, null, "Controls")), /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Body, null, /*#__PURE__*/_react.default.createElement(Controls,
|
|
72
|
+
}, /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Title, null, "Controls")), /*#__PURE__*/_react.default.createElement(_Offcanvas.default.Body, null, /*#__PURE__*/_react.default.createElement(Controls, props)));
|
|
72
73
|
}
|
|
@@ -6,10 +6,11 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.Pseudospatial = Pseudospatial;
|
|
7
7
|
exports.PseudospatialImage = PseudospatialImage;
|
|
8
8
|
var _react = _interopRequireWildcard(require("react"));
|
|
9
|
+
var _fontawesomeSvgCore = require("@fortawesome/fontawesome-svg-core");
|
|
10
|
+
var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
|
|
9
11
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
10
12
|
var _reactBootstrap = require("react-bootstrap");
|
|
11
13
|
var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
|
|
12
|
-
var _PseudospatialToolbar = require("./PseudospatialToolbar");
|
|
13
14
|
var _constants = require("../../constants/constants");
|
|
14
15
|
var _DatasetContext = require("../../context/DatasetContext");
|
|
15
16
|
var _FilterContext = require("../../context/FilterContext");
|
|
@@ -21,6 +22,7 @@ var _requests = require("../../utils/requests");
|
|
|
21
22
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
22
23
|
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); }
|
|
23
24
|
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; }
|
|
25
|
+
_fontawesomeSvgCore.library.add(_freeSolidSvgIcons.faSliders);
|
|
24
26
|
function usePseudospatialData(plotType) {
|
|
25
27
|
const ENDPOINT = "pseudospatial";
|
|
26
28
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
@@ -76,7 +78,11 @@ function usePseudospatialData(plotType) {
|
|
|
76
78
|
}
|
|
77
79
|
function Pseudospatial({
|
|
78
80
|
showLegend = true,
|
|
79
|
-
sharedScaleRange = false
|
|
81
|
+
sharedScaleRange = false,
|
|
82
|
+
height = 200,
|
|
83
|
+
setShowControls,
|
|
84
|
+
plotType,
|
|
85
|
+
setPlotType
|
|
80
86
|
}) {
|
|
81
87
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
82
88
|
const [data, setData] = (0, _react.useState)([]);
|
|
@@ -85,7 +91,9 @@ function Pseudospatial({
|
|
|
85
91
|
getColor
|
|
86
92
|
} = (0, _colorHelper.useColor)();
|
|
87
93
|
const colorscale = (0, _react.useRef)(dataset.controls.colorScale);
|
|
88
|
-
|
|
94
|
+
(0, _react.useEffect)(() => {
|
|
95
|
+
setPlotType(dataset.colorEncoding === _constants.COLOR_ENCODINGS.VAR ? _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE : dataset.selectedObs?.type === _constants.OBS_TYPES.CATEGORICAL || dataset.selectedObs?.type === _constants.OBS_TYPES.BOOLEAN ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL : dataset.selectedObs?.type === _constants.OBS_TYPES.CONTINUOUS ? _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS : _constants.PSEUDOSPATIAL_PLOT_TYPES.MASKS);
|
|
96
|
+
}, [dataset.colorEncoding, dataset.selectedObs?.type, setPlotType]);
|
|
89
97
|
const updateColorscale = (0, _react.useCallback)(colorscale => {
|
|
90
98
|
setLayout(l => {
|
|
91
99
|
return {
|
|
@@ -175,18 +183,33 @@ function Pseudospatial({
|
|
|
175
183
|
}
|
|
176
184
|
}, [dataset.controls.range, dataset.controls.valueMax, dataset.controls.valueMin, dataset.controls.valueRange, getColor, sharedScaleRange]);
|
|
177
185
|
const hasSelections = !!plotType && !!dataset.pseudospatial.maskSet;
|
|
186
|
+
const faSlidersPath = _freeSolidSvgIcons.faSliders.icon[4];
|
|
178
187
|
if (!serverError) {
|
|
179
188
|
return /*#__PURE__*/_react.default.createElement("div", {
|
|
180
|
-
className: "cherita-pseudospatial
|
|
181
|
-
}, /*#__PURE__*/_react.default.createElement(
|
|
182
|
-
plotType: plotType
|
|
183
|
-
}), /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hasSelections && isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), hasSelections && /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
|
|
189
|
+
className: "cherita-pseudospatial"
|
|
190
|
+
}, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hasSelections && isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), hasSelections && /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
|
|
184
191
|
data: data,
|
|
185
|
-
layout:
|
|
192
|
+
layout: {
|
|
193
|
+
...layout,
|
|
194
|
+
autosize: true,
|
|
195
|
+
height: height
|
|
196
|
+
},
|
|
186
197
|
useResizeHandler: true,
|
|
187
198
|
className: "cherita-pseudospatial-plot",
|
|
188
199
|
config: {
|
|
189
|
-
displaylogo: false
|
|
200
|
+
displaylogo: false,
|
|
201
|
+
displayModeBar: true,
|
|
202
|
+
modeBarButtonsToAdd: [{
|
|
203
|
+
name: "Open plot controls",
|
|
204
|
+
icon: {
|
|
205
|
+
width: 512,
|
|
206
|
+
height: 512,
|
|
207
|
+
path: faSlidersPath,
|
|
208
|
+
ascent: 512,
|
|
209
|
+
descent: 0
|
|
210
|
+
},
|
|
211
|
+
click: () => setShowControls(prev => !prev)
|
|
212
|
+
}]
|
|
190
213
|
}
|
|
191
214
|
}), hasSelections && showLegend && /*#__PURE__*/_react.default.createElement(_Legend.Legend, {
|
|
192
215
|
min: layout?.coloraxis?.cmin,
|
|
@@ -5,6 +5,8 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.PseudospatialToolbar = PseudospatialToolbar;
|
|
7
7
|
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
|
|
9
|
+
var _reactFontawesome = require("@fortawesome/react-fontawesome");
|
|
8
10
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
9
11
|
var _reactBootstrap = require("react-bootstrap");
|
|
10
12
|
var _constants = require("../../constants/constants");
|
|
@@ -212,7 +212,7 @@ function Scatterplot({
|
|
|
212
212
|
value: (data.values[index] - min) / (max - min),
|
|
213
213
|
categorical: isCategorical,
|
|
214
214
|
grayOut: grayOut
|
|
215
|
-
});
|
|
215
|
+
}) || [0, 0, 0, 100];
|
|
216
216
|
}, [data.values, obsIndices, getColor, isCategorical, max, min]);
|
|
217
217
|
|
|
218
218
|
// @TODO: add support for pseudospatial hover to reflect in radius
|
|
@@ -23,17 +23,22 @@ const DatasetDispatchContext = exports.DatasetDispatchContext = /*#__PURE__*/(0,
|
|
|
23
23
|
const queryClient = new _reactQuery.QueryClient({
|
|
24
24
|
defaultOptions: {
|
|
25
25
|
queries: {
|
|
26
|
-
gcTime: 1000 * 60 *
|
|
26
|
+
gcTime: 1000 * 60 * 15,
|
|
27
|
+
// garbage collect after 15min of inactive
|
|
28
|
+
staleTime: 1000 * 60 * 60,
|
|
29
|
+
refetchOnMount: false,
|
|
30
|
+
refetchOnReconnect: false,
|
|
31
|
+
refetchOnWindowFocus: false
|
|
27
32
|
}
|
|
28
33
|
},
|
|
29
34
|
queryCache: new _reactQuery.QueryCache({
|
|
30
|
-
onError:
|
|
31
|
-
console.error(error
|
|
35
|
+
onError: error => {
|
|
36
|
+
console.error(error);
|
|
32
37
|
}
|
|
33
38
|
})
|
|
34
39
|
});
|
|
35
40
|
// Type of queries to store responses
|
|
36
|
-
const persistKeys = ["obs/cols", "var/names", "obsm/keys", "
|
|
41
|
+
const persistKeys = ["obs/cols", "var/names", "obsm/keys", "obs/bins", "obs/distribution"];
|
|
37
42
|
const persistOptions = {
|
|
38
43
|
persister: (0, _querySyncStoragePersister.createSyncStoragePersister)({
|
|
39
44
|
storage: window.localStorage
|
|
@@ -129,9 +134,9 @@ function DatasetProvider({
|
|
|
129
134
|
}));
|
|
130
135
|
} catch (err) {
|
|
131
136
|
if (err.code === 22 || err.code === 1014 || err.name === "QuotaExceededError" || err.name === "NS_ERROR_DOM_QUOTA_REACHED") {
|
|
132
|
-
console.
|
|
137
|
+
console.err("Browser storage quota exceeded");
|
|
133
138
|
} else {
|
|
134
|
-
console.
|
|
139
|
+
console.err(err);
|
|
135
140
|
}
|
|
136
141
|
}
|
|
137
142
|
}, [dataset]);
|