@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/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 _constants = require("../../constants/constants");
10
- var _DatasetContext = require("../../context/DatasetContext");
11
- var _colorHelper = require("../../helpers/color-helper");
12
- var _string = require("../../utils/string");
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(i / 100, isCategorical));
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",
@@ -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 => {
@@ -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 (isNaN(n)) {
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.f6e39628",
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": "f6e396285b478f157db2dd9d8bdd8adbaa262d4c"
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
+ }