@haniffalab/cherita-react 0.2.0-dev.2024-12-16.f6e39628 → 0.2.0-dev.2024-12-16.f02cfae4
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/dist/components/full-page/FullPage.js +50 -6
- package/dist/components/obs-list/ObsItem.js +11 -5
- package/dist/components/obs-list/ObsList.js +8 -2
- package/dist/components/pseudospatial/Pseudospatial.js +215 -0
- package/dist/components/pseudospatial/PseudospatialControls.js +12 -0
- package/dist/components/pseudospatial/PseudospatialToolbar.js +155 -0
- package/dist/components/scatterplot/Scatterplot.js +100 -153
- package/dist/components/var-list/VarItem.js +20 -8
- package/dist/components/var-list/VarList.js +106 -22
- package/dist/components/var-list/VarListToolbar.js +101 -0
- package/dist/components/var-list/VarSet.js +1 -0
- package/dist/constants/constants.js +26 -1
- package/dist/context/DatasetContext.js +90 -3
- package/dist/context/FilterContext.js +1 -0
- package/dist/css/cherita.css +39 -0
- package/dist/css/cherita.css.map +1 -1
- package/dist/helpers/color-helper.js +12 -8
- package/dist/helpers/zarr-helper.js +2 -0
- package/dist/index.js +19 -0
- package/dist/utils/ImageViewer.js +40 -0
- package/dist/{components/scatterplot → utils}/Legend.js +12 -7
- package/dist/utils/requests.js +8 -6
- package/dist/utils/string.js +3 -3
- package/dist/utils/zarrData.js +101 -0
- package/package.json +2 -2
- package/scss/cherita.scss +39 -0
package/dist/index.js
CHANGED
|
@@ -39,6 +39,18 @@ Object.defineProperty(exports, "FullPage", {
|
|
|
39
39
|
return _FullPage.FullPage;
|
|
40
40
|
}
|
|
41
41
|
});
|
|
42
|
+
Object.defineProperty(exports, "FullPagePseudospatial", {
|
|
43
|
+
enumerable: true,
|
|
44
|
+
get: function () {
|
|
45
|
+
return _FullPage.FullPagePseudospatial;
|
|
46
|
+
}
|
|
47
|
+
});
|
|
48
|
+
Object.defineProperty(exports, "FullPageScatterplot", {
|
|
49
|
+
enumerable: true,
|
|
50
|
+
get: function () {
|
|
51
|
+
return _FullPage.FullPageScatterplot;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
42
54
|
Object.defineProperty(exports, "Heatmap", {
|
|
43
55
|
enumerable: true,
|
|
44
56
|
get: function () {
|
|
@@ -99,6 +111,12 @@ Object.defineProperty(exports, "OffcanvasVars", {
|
|
|
99
111
|
return _offcanvas.OffcanvasVars;
|
|
100
112
|
}
|
|
101
113
|
});
|
|
114
|
+
Object.defineProperty(exports, "Pseudospatial", {
|
|
115
|
+
enumerable: true,
|
|
116
|
+
get: function () {
|
|
117
|
+
return _Pseudospatial.Pseudospatial;
|
|
118
|
+
}
|
|
119
|
+
});
|
|
102
120
|
Object.defineProperty(exports, "SELECTION_MODES", {
|
|
103
121
|
enumerable: true,
|
|
104
122
|
get: function () {
|
|
@@ -161,6 +179,7 @@ var _Matrixplot = require("./components/matrixplot/Matrixplot");
|
|
|
161
179
|
var _MatrixplotControls = require("./components/matrixplot/MatrixplotControls");
|
|
162
180
|
var _Violin = require("./components/violin/Violin");
|
|
163
181
|
var _ViolinControls = require("./components/violin/ViolinControls");
|
|
182
|
+
var _Pseudospatial = require("./components/pseudospatial/Pseudospatial");
|
|
164
183
|
var _constants = require("./constants/constants");
|
|
165
184
|
var _colorscales = require("./constants/colorscales");
|
|
166
185
|
var _DatasetContext = require("./context/DatasetContext");
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ImageViewer = void 0;
|
|
7
|
+
var _react = _interopRequireWildcard(require("react"));
|
|
8
|
+
var _reactBootstrap = require("react-bootstrap");
|
|
9
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
10
|
+
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); }
|
|
11
|
+
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; }
|
|
12
|
+
const ImageViewer = _ref => {
|
|
13
|
+
let {
|
|
14
|
+
src,
|
|
15
|
+
alt,
|
|
16
|
+
className = "img-fluid"
|
|
17
|
+
} = _ref;
|
|
18
|
+
const [error, setError] = (0, _react.useState)(false);
|
|
19
|
+
const handleError = () => {
|
|
20
|
+
console.error("Error loading image from src:", src);
|
|
21
|
+
setError(true);
|
|
22
|
+
};
|
|
23
|
+
if (!error) {
|
|
24
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)("img", {
|
|
25
|
+
src: src,
|
|
26
|
+
alt: alt,
|
|
27
|
+
className: className,
|
|
28
|
+
loading: "lazy",
|
|
29
|
+
onError: handleError
|
|
30
|
+
});
|
|
31
|
+
} else {
|
|
32
|
+
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
|
|
33
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Alert, {
|
|
34
|
+
variant: "danger",
|
|
35
|
+
children: "Failed to load image"
|
|
36
|
+
})
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
exports.ImageViewer = ImageViewer;
|
|
@@ -6,17 +6,18 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
exports.Legend = Legend;
|
|
7
7
|
var _react = require("react");
|
|
8
8
|
var _lodash = _interopRequireDefault(require("lodash"));
|
|
9
|
-
var
|
|
10
|
-
var
|
|
11
|
-
var
|
|
12
|
-
var
|
|
9
|
+
var _string = require("./string");
|
|
10
|
+
var _constants = require("../constants/constants");
|
|
11
|
+
var _DatasetContext = require("../context/DatasetContext");
|
|
12
|
+
var _colorHelper = require("../helpers/color-helper");
|
|
13
13
|
var _jsxRuntime = require("react/jsx-runtime");
|
|
14
14
|
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
15
15
|
function Legend(_ref) {
|
|
16
16
|
let {
|
|
17
17
|
isCategorical = false,
|
|
18
18
|
min = 0,
|
|
19
|
-
max = 1
|
|
19
|
+
max = 1,
|
|
20
|
+
colorscale = null
|
|
20
21
|
} = _ref;
|
|
21
22
|
const dataset = (0, _DatasetContext.useDataset)();
|
|
22
23
|
const {
|
|
@@ -24,7 +25,11 @@ function Legend(_ref) {
|
|
|
24
25
|
} = (0, _colorHelper.useColor)();
|
|
25
26
|
const spanList = (0, _react.useMemo)(() => {
|
|
26
27
|
return _lodash.default.range(100).map(i => {
|
|
27
|
-
var color = (0, _colorHelper.rgbToHex)(getColor(
|
|
28
|
+
var color = (0, _colorHelper.rgbToHex)(getColor({
|
|
29
|
+
value: i / 100,
|
|
30
|
+
categorical: isCategorical,
|
|
31
|
+
colorscale: colorscale
|
|
32
|
+
}));
|
|
28
33
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
|
|
29
34
|
className: "grad-step",
|
|
30
35
|
style: {
|
|
@@ -32,7 +37,7 @@ function Legend(_ref) {
|
|
|
32
37
|
}
|
|
33
38
|
}, i);
|
|
34
39
|
});
|
|
35
|
-
}, [getColor, isCategorical]);
|
|
40
|
+
}, [colorscale, getColor, isCategorical]);
|
|
36
41
|
if (dataset.colorEncoding && !isCategorical) {
|
|
37
42
|
return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
|
|
38
43
|
className: "cherita-legend",
|
package/dist/utils/requests.js
CHANGED
|
@@ -7,7 +7,9 @@ exports.fetchData = fetchData;
|
|
|
7
7
|
exports.useFetch = exports.useDebouncedFetch = void 0;
|
|
8
8
|
var _reactQuery = require("@tanstack/react-query");
|
|
9
9
|
var _usehooks = require("@uidotdev/usehooks");
|
|
10
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
10
11
|
var _errors = require("./errors");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
11
13
|
async function fetchData(endpoint, params) {
|
|
12
14
|
let signal = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : null;
|
|
13
15
|
let ms = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 300000;
|
|
@@ -46,9 +48,9 @@ const useFetch = function (endpoint, params) {
|
|
|
46
48
|
enabled = true
|
|
47
49
|
} = opts;
|
|
48
50
|
const {
|
|
49
|
-
data: fetchedData,
|
|
50
|
-
isLoading: isPending,
|
|
51
|
-
error: serverError
|
|
51
|
+
data: fetchedData = null,
|
|
52
|
+
isLoading: isPending = false,
|
|
53
|
+
error: serverError = null
|
|
52
54
|
} = (0, _reactQuery.useQuery)({
|
|
53
55
|
queryKey: [endpoint, params],
|
|
54
56
|
queryFn: _ref => {
|
|
@@ -79,9 +81,9 @@ const useDebouncedFetch = function (endpoint, params) {
|
|
|
79
81
|
} = opts;
|
|
80
82
|
const debouncedParams = (0, _usehooks.useDebounce)(params, delay);
|
|
81
83
|
const {
|
|
82
|
-
data: fetchedData,
|
|
83
|
-
isLoading: isPending,
|
|
84
|
-
error: serverError
|
|
84
|
+
data: fetchedData = null,
|
|
85
|
+
isLoading: isPending = false,
|
|
86
|
+
error: serverError = null
|
|
85
87
|
} = (0, _reactQuery.useQuery)({
|
|
86
88
|
queryKey: [endpoint, debouncedParams],
|
|
87
89
|
queryFn: _ref2 => {
|
package/dist/utils/string.js
CHANGED
|
@@ -39,10 +39,10 @@ function formatAbbreviation(n) {
|
|
|
39
39
|
function formatNumerical(n) {
|
|
40
40
|
let format = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : FORMATS.THOUSAND;
|
|
41
41
|
let precision = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 3;
|
|
42
|
-
if (
|
|
43
|
-
return "NaN";
|
|
44
|
-
} else if (n === 0) {
|
|
42
|
+
if (n === 0) {
|
|
45
43
|
return "0";
|
|
44
|
+
} else if (!n || n === undefined || isNaN(n)) {
|
|
45
|
+
return "NaN";
|
|
46
46
|
}
|
|
47
47
|
switch (format) {
|
|
48
48
|
case FORMATS.EXPONENTIAL:
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.useXData = exports.useObsmData = exports.useObsData = exports.useLabelObsData = void 0;
|
|
7
|
+
var _react = require("react");
|
|
8
|
+
var _lodash = _interopRequireDefault(require("lodash"));
|
|
9
|
+
var _constants = require("../constants/constants");
|
|
10
|
+
var _DatasetContext = require("../context/DatasetContext");
|
|
11
|
+
var _zarrHelper = require("../helpers/zarr-helper");
|
|
12
|
+
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
|
|
13
|
+
const useObsmData = () => {
|
|
14
|
+
const dataset = (0, _DatasetContext.useDataset)();
|
|
15
|
+
const [obsmParams, setObsmParams] = (0, _react.useState)({
|
|
16
|
+
url: dataset.url,
|
|
17
|
+
path: "obsm/" + dataset.selectedObsm
|
|
18
|
+
});
|
|
19
|
+
(0, _react.useEffect)(() => {
|
|
20
|
+
setObsmParams({
|
|
21
|
+
url: dataset.url,
|
|
22
|
+
path: "obsm/" + dataset.selectedObsm
|
|
23
|
+
});
|
|
24
|
+
}, [dataset.url, dataset.selectedObsm]);
|
|
25
|
+
return (0, _zarrHelper.useZarr)(obsmParams, null, _zarrHelper.GET_OPTIONS);
|
|
26
|
+
};
|
|
27
|
+
exports.useObsmData = useObsmData;
|
|
28
|
+
const meanData = (_i, data) => {
|
|
29
|
+
return _lodash.default.zipWith(...data, function () {
|
|
30
|
+
for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {
|
|
31
|
+
values[_key] = arguments[_key];
|
|
32
|
+
}
|
|
33
|
+
return _lodash.default.mean(values);
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
const useXData = function () {
|
|
37
|
+
let agg = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : meanData;
|
|
38
|
+
const dataset = (0, _DatasetContext.useDataset)();
|
|
39
|
+
const [xParams, setXParams] = (0, _react.useState)(!dataset.selectedVar ? [] : !dataset.selectedVar?.isSet ? [{
|
|
40
|
+
url: dataset.url,
|
|
41
|
+
path: "X",
|
|
42
|
+
s: [null, dataset.selectedVar?.matrix_index]
|
|
43
|
+
}] : _lodash.default.map(dataset.selectedVar?.vars, v => {
|
|
44
|
+
return {
|
|
45
|
+
url: dataset.url,
|
|
46
|
+
path: "X",
|
|
47
|
+
s: [null, v.matrix_index]
|
|
48
|
+
};
|
|
49
|
+
}));
|
|
50
|
+
(0, _react.useEffect)(() => {
|
|
51
|
+
setXParams(!dataset.selectedVar ? [] : !dataset.selectedVar?.isSet ? [{
|
|
52
|
+
url: dataset.url,
|
|
53
|
+
path: "X",
|
|
54
|
+
s: [null, dataset.selectedVar?.matrix_index]
|
|
55
|
+
}] : _lodash.default.map(dataset.selectedVar?.vars, v => {
|
|
56
|
+
return {
|
|
57
|
+
url: dataset.url,
|
|
58
|
+
path: "X",
|
|
59
|
+
s: [null, v.matrix_index]
|
|
60
|
+
};
|
|
61
|
+
}));
|
|
62
|
+
}, [dataset.url, dataset.selectedVar]);
|
|
63
|
+
return (0, _zarrHelper.useMultipleZarr)(xParams, _zarrHelper.GET_OPTIONS, agg);
|
|
64
|
+
};
|
|
65
|
+
exports.useXData = useXData;
|
|
66
|
+
const useObsData = () => {
|
|
67
|
+
const dataset = (0, _DatasetContext.useDataset)();
|
|
68
|
+
const [obsParams, setObsParams] = (0, _react.useState)({
|
|
69
|
+
url: dataset.url,
|
|
70
|
+
path: "obs/" + dataset.selectedObs?.name + (dataset.selectedObs?.type === _constants.OBS_TYPES.CATEGORICAL ? "/codes" : "")
|
|
71
|
+
});
|
|
72
|
+
(0, _react.useEffect)(() => {
|
|
73
|
+
setObsParams({
|
|
74
|
+
url: dataset.url,
|
|
75
|
+
path: "obs/" + dataset.selectedObs?.name + (dataset.selectedObs?.type === _constants.OBS_TYPES.CATEGORICAL ? "/codes" : "")
|
|
76
|
+
});
|
|
77
|
+
}, [dataset.url, dataset.selectedObs]);
|
|
78
|
+
return (0, _zarrHelper.useZarr)(obsParams, null, _zarrHelper.GET_OPTIONS);
|
|
79
|
+
};
|
|
80
|
+
exports.useObsData = useObsData;
|
|
81
|
+
const useLabelObsData = () => {
|
|
82
|
+
const dataset = (0, _DatasetContext.useDataset)();
|
|
83
|
+
const [labelObsParams, setLabelObsParams] = (0, _react.useState)(_lodash.default.map(dataset.labelObs, obs => {
|
|
84
|
+
return {
|
|
85
|
+
url: dataset.url,
|
|
86
|
+
path: "obs/" + obs.name + (obs.type === _constants.OBS_TYPES.CATEGORICAL ? "/codes" : ""),
|
|
87
|
+
key: obs.name
|
|
88
|
+
};
|
|
89
|
+
}));
|
|
90
|
+
(0, _react.useEffect)(() => {
|
|
91
|
+
setLabelObsParams(_lodash.default.map(dataset.labelObs, obs => {
|
|
92
|
+
return {
|
|
93
|
+
url: dataset.url,
|
|
94
|
+
path: "obs/" + obs.name + (obs.type === _constants.OBS_TYPES.CATEGORICAL ? "/codes" : ""),
|
|
95
|
+
key: obs.name
|
|
96
|
+
};
|
|
97
|
+
}));
|
|
98
|
+
}, [dataset.labelObs, dataset.url]);
|
|
99
|
+
return (0, _zarrHelper.useMultipleZarr)(labelObsParams, _zarrHelper.GET_OPTIONS);
|
|
100
|
+
};
|
|
101
|
+
exports.useLabelObsData = useLabelObsData;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@haniffalab/cherita-react",
|
|
3
|
-
"version": "0.2.0-dev.2024-12-16.
|
|
3
|
+
"version": "0.2.0-dev.2024-12-16.f02cfae4",
|
|
4
4
|
"author": "",
|
|
5
5
|
"license": "",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -101,5 +101,5 @@
|
|
|
101
101
|
"url": "https://github.com/haniffalab/cherita-react/issues"
|
|
102
102
|
},
|
|
103
103
|
"homepage": "https://github.com/haniffalab/cherita-react#readme",
|
|
104
|
-
"prereleaseSha": "
|
|
104
|
+
"prereleaseSha": "f02cfae47749a5aeba88d12aefa8cee0367f9ddc"
|
|
105
105
|
}
|
package/scss/cherita.scss
CHANGED
|
@@ -308,3 +308,42 @@
|
|
|
308
308
|
.caret-off .dropdown-toggle::after {
|
|
309
309
|
display: none;
|
|
310
310
|
}
|
|
311
|
+
|
|
312
|
+
.cherita-pseudospatial {
|
|
313
|
+
width: 100%;
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
.cherita-pseudospatial-plot {
|
|
317
|
+
width: 100%;
|
|
318
|
+
height: 100%;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
.cherita-pseudospatial-toolbar {
|
|
322
|
+
display: flex;
|
|
323
|
+
flex-direction: column;
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
/* Add a bottom border to the last item in the Accordion */
|
|
327
|
+
.accordion-flush .accordion-item:last-child {
|
|
328
|
+
border-bottom: 1px solid #dee2e6; /* Adjust the color and width as needed */
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
.var-disease-info-collapse {
|
|
332
|
+
max-height: 40vh;
|
|
333
|
+
overflow-y: auto;
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
.cherita-scatterplot #deckgl-wrapper {
|
|
337
|
+
z-index: 1 !important;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
.tooltip-grayout {
|
|
341
|
+
color: #a0a7b4 !important;
|
|
342
|
+
background-color: #3a424b !important;
|
|
343
|
+
opacity: 0.8;
|
|
344
|
+
z-index: 100 !important;
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
.deck-tooltip {
|
|
348
|
+
z-index: 100 !important;
|
|
349
|
+
}
|