@haniffalab/cherita-react 1.3.0 → 1.3.1-dev.2025-10-29.def77f5f

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 (137) hide show
  1. package/README.md +1 -1
  2. package/dist/cjs/components/controls/Controls.js +38 -30
  3. package/dist/cjs/components/dotplot/Dotplot.js +85 -57
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +167 -114
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +102 -0
  8. package/dist/cjs/components/heatmap/Heatmap.js +83 -53
  9. package/dist/cjs/components/heatmap/HeatmapControls.js +6 -3
  10. package/dist/cjs/components/icons/DotPlotIcon.js +64 -0
  11. package/dist/cjs/components/icons/HeatmapIcon.js +45 -0
  12. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +57 -0
  13. package/dist/cjs/components/icons/MatrixPlotIcon.js +59 -0
  14. package/dist/cjs/components/icons/ScatterplotIcon.1.js +164 -0
  15. package/dist/cjs/components/icons/ScatterplotIcon.js +144 -0
  16. package/dist/cjs/components/icons/ViolinPlotIcon.js +42 -0
  17. package/dist/cjs/components/matrixplot/Matrixplot.js +83 -54
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +305 -216
  20. package/dist/cjs/components/obs-list/ObsList.js +164 -128
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +67 -28
  23. package/dist/cjs/components/offcanvas/index.js +62 -27
  24. package/dist/cjs/components/pseudospatial/Pseudospatial.js +132 -76
  25. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +122 -74
  26. package/dist/cjs/components/scatterplot/Scatterplot.js +223 -175
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +143 -116
  29. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  30. package/dist/cjs/components/search-bar/SearchBar.js +176 -120
  31. package/dist/cjs/components/search-bar/SearchInfo.js +79 -85
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +111 -0
  34. package/dist/cjs/components/var-list/VarItem.js +131 -103
  35. package/dist/cjs/components/var-list/VarList.js +96 -74
  36. package/dist/cjs/components/var-list/VarListToolbar.js +59 -54
  37. package/dist/cjs/components/var-list/VarSet.js +126 -108
  38. package/dist/cjs/components/violin/Violin.js +124 -81
  39. package/dist/cjs/components/violin/ViolinControls.js +8 -5
  40. package/dist/cjs/constants/colorscales.js +19 -19
  41. package/dist/cjs/constants/constants.js +54 -39
  42. package/dist/cjs/context/DatasetContext.js +27 -17
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +339 -125
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/map-helper.js +2 -1
  48. package/dist/cjs/helpers/zarr-helper.js +3 -3
  49. package/dist/cjs/index.js +15 -21
  50. package/dist/cjs/utils/Filter.js +16 -11
  51. package/dist/cjs/utils/Histogram.js +35 -33
  52. package/dist/cjs/utils/ImageViewer.js +11 -8
  53. package/dist/cjs/utils/Legend.js +37 -30
  54. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  55. package/dist/cjs/utils/Resolver.js +213 -0
  56. package/dist/cjs/utils/Skeleton.js +10 -10
  57. package/dist/cjs/utils/StyledTooltip.js +44 -0
  58. package/dist/cjs/utils/VirtualizedList.js +36 -29
  59. package/dist/cjs/utils/errors.js +15 -15
  60. package/dist/cjs/utils/requests.js +21 -9
  61. package/dist/cjs/utils/search.js +4 -4
  62. package/dist/cjs/utils/string.js +6 -6
  63. package/dist/cjs/utils/zarrData.js +20 -21
  64. package/dist/css/cherita.css +188 -65
  65. package/dist/css/cherita.css.map +1 -1
  66. package/dist/esm/components/controls/Controls.js +43 -35
  67. package/dist/esm/components/dotplot/Dotplot.js +93 -64
  68. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  69. package/dist/esm/components/full-page/FullPage.js +180 -124
  70. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  71. package/dist/esm/components/full-page/PlotTypeSelector.js +95 -0
  72. package/dist/esm/components/heatmap/Heatmap.js +91 -60
  73. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  74. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  75. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  76. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  77. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  78. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  79. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  80. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  81. package/dist/esm/components/matrixplot/Matrixplot.js +91 -61
  82. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  83. package/dist/esm/components/obs-list/ObsItem.js +320 -228
  84. package/dist/esm/components/obs-list/ObsList.js +179 -142
  85. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  86. package/dist/esm/components/obsm-list/ObsmList.js +71 -32
  87. package/dist/esm/components/offcanvas/index.js +68 -33
  88. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  89. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  90. package/dist/esm/components/scatterplot/Scatterplot.js +243 -194
  91. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  92. package/dist/esm/components/scatterplot/SpatialControls.js +155 -127
  93. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  94. package/dist/esm/components/search-bar/SearchBar.js +187 -130
  95. package/dist/esm/components/search-bar/SearchInfo.js +86 -91
  96. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  97. package/dist/esm/components/toolbar/Toolbar.js +101 -0
  98. package/dist/esm/components/var-list/VarItem.js +142 -113
  99. package/dist/esm/components/var-list/VarList.js +108 -88
  100. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  101. package/dist/esm/components/var-list/VarSet.js +134 -115
  102. package/dist/esm/components/violin/Violin.js +135 -91
  103. package/dist/esm/components/violin/ViolinControls.js +10 -6
  104. package/dist/esm/constants/colorscales.js +19 -19
  105. package/dist/esm/constants/constants.js +53 -38
  106. package/dist/esm/context/DatasetContext.js +34 -23
  107. package/dist/esm/context/FilterContext.js +11 -8
  108. package/dist/esm/context/SettingsContext.js +341 -126
  109. package/dist/esm/context/ZarrDataContext.js +8 -6
  110. package/dist/esm/helpers/color-helper.js +5 -5
  111. package/dist/esm/helpers/map-helper.js +4 -3
  112. package/dist/esm/helpers/zarr-helper.js +6 -6
  113. package/dist/esm/index.js +22 -22
  114. package/dist/esm/utils/Filter.js +22 -17
  115. package/dist/esm/utils/Histogram.js +39 -37
  116. package/dist/esm/utils/ImageViewer.js +12 -8
  117. package/dist/esm/utils/Legend.js +44 -36
  118. package/dist/esm/utils/LoadingIndicators.js +16 -13
  119. package/dist/esm/utils/Resolver.js +201 -0
  120. package/dist/esm/utils/Skeleton.js +11 -10
  121. package/dist/esm/utils/StyledTooltip.js +38 -0
  122. package/dist/esm/utils/VirtualizedList.js +37 -29
  123. package/dist/esm/utils/errors.js +15 -15
  124. package/dist/esm/utils/requests.js +24 -12
  125. package/dist/esm/utils/search.js +7 -7
  126. package/dist/esm/utils/string.js +7 -7
  127. package/dist/esm/utils/zarrData.js +27 -28
  128. package/package.json +24 -10
  129. package/scss/cherita-bootstrap.scss +2 -2
  130. package/scss/cherita.scss +65 -17
  131. package/scss/components/accordions.scss +15 -2
  132. package/scss/components/layouts.scss +116 -30
  133. package/scss/components/lists.scss +16 -5
  134. package/scss/components/plotly.scss +40 -23
  135. package/scss/components/plots.scss +14 -1
  136. package/dist/cjs/components/full-page/FullPagePseudospatial.js +0 -157
  137. package/dist/esm/components/full-page/FullPagePseudospatial.js +0 -149
@@ -3,10 +3,11 @@ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t =
3
3
  function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
4
4
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
5
5
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
6
- import React, { useEffect, useState } from "react";
7
- import { Button, Form, InputGroup } from "react-bootstrap";
8
- import { useSettings, useSettingsDispatch } from "../../context/SettingsContext";
9
- import { ColorscaleSelect, ScaleSelect } from "../controls/Controls";
6
+ import { useEffect, useState } from 'react';
7
+ import { Button, Form, InputGroup } from 'react-bootstrap';
8
+ import { useSettings, useSettingsDispatch } from '../../context/SettingsContext';
9
+ import { ColorscaleSelect, ScaleSelect } from '../controls/Controls';
10
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
10
11
  export function DotplotControls() {
11
12
  const settings = useSettings();
12
13
  const dispatch = useSettingsDispatch();
@@ -26,88 +27,108 @@ export function DotplotControls() {
26
27
  expressionCutoff: settings.controls.expressionCutoff
27
28
  }));
28
29
  }, [settings.controls.colorAxis.cmin, settings.controls.colorAxis.cmax, settings.controls.expressionCutoff]);
29
- return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Form, null, /*#__PURE__*/React.createElement(ColorscaleSelect, null), /*#__PURE__*/React.createElement(Form.Group, {
30
- className: "mb-2"
31
- }, /*#__PURE__*/React.createElement(InputGroup, null, /*#__PURE__*/React.createElement(InputGroup.Text, null, "min"), /*#__PURE__*/React.createElement(Form.Control, {
32
- name: "scaleMin",
33
- size: "sm",
34
- type: "number",
35
- value: controls.colorAxis.cmin,
36
- step: 0.1,
37
- min: Math.min(settings.controls.colorAxis.dmin, 0.0),
38
- max: settings.controls.colorAxis.dmax,
39
- onChange: e => {
40
- setControls(_objectSpread(_objectSpread({}, controls), {}, {
41
- colorAxis: _objectSpread(_objectSpread({}, controls.colorAxis), {}, {
42
- cmin: e.target.value
30
+ return /*#__PURE__*/_jsx(_Fragment, {
31
+ children: /*#__PURE__*/_jsxs(Form, {
32
+ children: [/*#__PURE__*/_jsx(ColorscaleSelect, {}), /*#__PURE__*/_jsx(Form.Group, {
33
+ className: "mb-2",
34
+ children: /*#__PURE__*/_jsxs(InputGroup, {
35
+ children: [/*#__PURE__*/_jsx(InputGroup.Text, {
36
+ children: "min"
37
+ }), /*#__PURE__*/_jsx(Form.Control, {
38
+ name: "scaleMin",
39
+ size: "sm",
40
+ type: "number",
41
+ value: controls.colorAxis.cmin,
42
+ step: 0.1,
43
+ min: Math.min(settings.controls.colorAxis.dmin, 0.0),
44
+ max: settings.controls.colorAxis.dmax,
45
+ onChange: e => {
46
+ setControls(_objectSpread(_objectSpread({}, controls), {}, {
47
+ colorAxis: _objectSpread(_objectSpread({}, controls.colorAxis), {}, {
48
+ cmin: e.target.value
49
+ })
50
+ }));
51
+ }
52
+ }), /*#__PURE__*/_jsx(InputGroup.Text, {
53
+ children: "max"
54
+ }), /*#__PURE__*/_jsx(Form.Control, {
55
+ name: "scaleMax",
56
+ size: "sm",
57
+ type: "number",
58
+ value: controls.colorAxis.cmax,
59
+ step: 0.1,
60
+ min: controls.colorAxis.cmin,
61
+ max: settings.controls.colorAxis.dmax,
62
+ onChange: e => {
63
+ if (parseFloat(e.target.value) > settings.controls.colorAxis.dmax) {
64
+ e.target.value = settings.controls.colorAxis.dmax.toFixed(1);
65
+ }
66
+ setControls(_objectSpread(_objectSpread({}, controls), {}, {
67
+ colorAxis: _objectSpread(_objectSpread({}, controls.colorAxis), {}, {
68
+ cmax: e.target.value
69
+ })
70
+ }));
71
+ }
72
+ }), /*#__PURE__*/_jsx(Button, {
73
+ variant: "outline-primary",
74
+ onClick: () => dispatch({
75
+ type: 'set.controls.colorAxis.crange',
76
+ cmin: controls.colorAxis.cmin,
77
+ cmax: controls.colorAxis.cmax
78
+ }),
79
+ children: "Apply"
80
+ }), /*#__PURE__*/_jsx(Button, {
81
+ variant: "outline-primary",
82
+ onClick: () => dispatch({
83
+ type: 'set.controls.colorAxis.crange',
84
+ cmin: settings.controls.colorAxis.dmin,
85
+ cmax: settings.controls.colorAxis.dmax
86
+ }),
87
+ children: "Reset"
88
+ })]
43
89
  })
44
- }));
45
- }
46
- }), /*#__PURE__*/React.createElement(InputGroup.Text, null, "max"), /*#__PURE__*/React.createElement(Form.Control, {
47
- name: "scaleMax",
48
- size: "sm",
49
- type: "number",
50
- value: controls.colorAxis.cmax,
51
- step: 0.1,
52
- min: controls.colorAxis.cmin,
53
- max: settings.controls.colorAxis.dmax,
54
- onChange: e => {
55
- if (parseFloat(e.target.value) > settings.controls.colorAxis.dmax) {
56
- e.target.value = settings.controls.colorAxis.dmax.toFixed(1);
57
- }
58
- setControls(_objectSpread(_objectSpread({}, controls), {}, {
59
- colorAxis: _objectSpread(_objectSpread({}, controls.colorAxis), {}, {
60
- cmax: e.target.value
90
+ }), /*#__PURE__*/_jsx(ScaleSelect, {
91
+ plot: "dotplot"
92
+ }), /*#__PURE__*/_jsxs(Form.Group, {
93
+ className: "mb-2",
94
+ children: [/*#__PURE__*/_jsx(Form.Label, {
95
+ children: "Expression Cutoff"
96
+ }), /*#__PURE__*/_jsxs(InputGroup, {
97
+ children: [/*#__PURE__*/_jsx(Form.Control, {
98
+ size: "sm",
99
+ type: "number",
100
+ step: '0.1',
101
+ min: 0.0,
102
+ value: controls.expressionCutoff,
103
+ onChange: e => {
104
+ setControls(_objectSpread(_objectSpread({}, controls), {}, {
105
+ expressionCutoff: e.target.value
106
+ }));
107
+ }
108
+ }), /*#__PURE__*/_jsx(Button, {
109
+ variant: "outline-primary",
110
+ onClick: () => dispatch({
111
+ type: 'set.controls.expressionCutoff',
112
+ expressionCutoff: parseFloat(controls.expressionCutoff)
113
+ }),
114
+ children: "Apply"
115
+ })]
116
+ })]
117
+ }), /*#__PURE__*/_jsx(Form.Group, {
118
+ className: "mb-2",
119
+ children: /*#__PURE__*/_jsx(Form.Check, {
120
+ type: "switch",
121
+ id: "meanOnlyExpressed",
122
+ label: "Average only above cutoff",
123
+ checked: settings.controls.meanOnlyExpressed,
124
+ onChange: () => {
125
+ dispatch({
126
+ type: 'set.controls.meanOnlyExpressed',
127
+ meanOnlyExpressed: !settings.controls.meanOnlyExpressed
128
+ });
129
+ }
61
130
  })
62
- }));
63
- }
64
- }), /*#__PURE__*/React.createElement(Button, {
65
- variant: "outline-primary",
66
- onClick: () => dispatch({
67
- type: "set.controls.colorAxis.crange",
68
- cmin: controls.colorAxis.cmin,
69
- cmax: controls.colorAxis.cmax
131
+ })]
70
132
  })
71
- }, "Apply"), /*#__PURE__*/React.createElement(Button, {
72
- variant: "outline-primary",
73
- onClick: () => dispatch({
74
- type: "set.controls.colorAxis.crange",
75
- cmin: settings.controls.colorAxis.dmin,
76
- cmax: settings.controls.colorAxis.dmax
77
- })
78
- }, "Reset"))), /*#__PURE__*/React.createElement(ScaleSelect, {
79
- plot: "dotplot"
80
- }), /*#__PURE__*/React.createElement(Form.Group, {
81
- className: "mb-2"
82
- }, /*#__PURE__*/React.createElement(Form.Label, null, "Expression Cutoff"), /*#__PURE__*/React.createElement(InputGroup, null, /*#__PURE__*/React.createElement(Form.Control, {
83
- size: "sm",
84
- type: "number",
85
- step: "0.1",
86
- min: 0.0,
87
- value: controls.expressionCutoff,
88
- onChange: e => {
89
- setControls(_objectSpread(_objectSpread({}, controls), {}, {
90
- expressionCutoff: e.target.value
91
- }));
92
- }
93
- }), /*#__PURE__*/React.createElement(Button, {
94
- variant: "outline-primary",
95
- onClick: () => dispatch({
96
- type: "set.controls.expressionCutoff",
97
- expressionCutoff: parseFloat(controls.expressionCutoff)
98
- })
99
- }, "Apply"))), /*#__PURE__*/React.createElement(Form.Group, {
100
- className: "mb-2"
101
- }, /*#__PURE__*/React.createElement(Form.Check, {
102
- type: "switch",
103
- id: "meanOnlyExpressed",
104
- label: "Average only above cutoff",
105
- checked: settings.controls.meanOnlyExpressed,
106
- onChange: () => {
107
- dispatch({
108
- type: "set.controls.meanOnlyExpressed",
109
- meanOnlyExpressed: !settings.controls.meanOnlyExpressed
110
- });
111
- }
112
- }))));
133
+ });
113
134
  }
@@ -1,140 +1,196 @@
1
- const _excluded = ["children", "varMode", "searchDiseases"];
2
- function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }
1
+ const _excluded = ["searchDiseases", "defaultPlotType"];
2
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
+ function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
5
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
6
+ function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
3
7
  function _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }
4
8
  function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }
5
- import React, { useEffect, useRef, useState } from "react";
6
- import { Card, Container, Modal } from "react-bootstrap";
7
- import { SELECTION_MODES, VIOLIN_MODES } from "../../constants/constants";
8
- import { DatasetProvider } from "../../context/DatasetContext";
9
- import { Dotplot } from "../dotplot/Dotplot";
10
- import { Heatmap } from "../heatmap/Heatmap";
11
- import { Matrixplot } from "../matrixplot/Matrixplot";
12
- import { ObsColsList } from "../obs-list/ObsList";
13
- import { OffcanvasControls, OffcanvasObs, OffcanvasObsm, OffcanvasVars } from "../offcanvas";
14
- import { Scatterplot } from "../scatterplot/Scatterplot";
15
- import { ScatterplotControls } from "../scatterplot/ScatterplotControls";
16
- import { SearchBar } from "../search-bar/SearchBar";
17
- import { VarNamesList } from "../var-list/VarList";
18
- import { Violin } from "../violin/Violin";
9
+ import { useEffect, useMemo, useState } from 'react';
10
+ import { useMediaQuery } from '@mui/material';
11
+ import { Card, Container, Modal } from 'react-bootstrap';
12
+ import { BREAKPOINTS, PLOT_TYPES, SELECTION_MODES, VIOLIN_MODES } from '../../constants/constants';
13
+ import { DatasetProvider } from '../../context/DatasetContext';
14
+ import { Dotplot } from '../dotplot/Dotplot';
15
+ import { DotplotControls } from '../dotplot/DotplotControls';
16
+ import { Heatmap } from '../heatmap/Heatmap';
17
+ import { HeatmapControls } from '../heatmap/HeatmapControls';
18
+ import { Matrixplot } from '../matrixplot/Matrixplot';
19
+ import { MatrixplotControls } from '../matrixplot/MatrixplotControls';
20
+ import { ObsColsList } from '../obs-list/ObsList';
21
+ import { OffcanvasControls, OffcanvasObs, OffcanvasObsm, OffcanvasVars } from '../offcanvas';
22
+ import { PlotTypeSelector } from './PlotTypeSelector';
23
+ import { Pseudospatial } from '../pseudospatial/Pseudospatial';
24
+ import { PseudospatialToolbar } from '../pseudospatial/PseudospatialToolbar';
25
+ import { Scatterplot } from '../scatterplot/Scatterplot';
26
+ import { ScatterplotControls } from '../scatterplot/ScatterplotControls';
27
+ import { SearchBar } from '../search-bar/SearchBar';
28
+ import { VarNamesList } from '../var-list/VarList';
29
+ import { Violin } from '../violin/Violin';
30
+ import { ViolinControls } from '../violin/ViolinControls';
31
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
19
32
  export function FullPage(_ref) {
20
33
  let {
21
- children,
22
- varMode = SELECTION_MODES.SINGLE,
23
- searchDiseases = false
34
+ searchDiseases = true,
35
+ defaultPlotType = PLOT_TYPES.SCATTERPLOT
24
36
  } = _ref,
25
37
  props = _objectWithoutProperties(_ref, _excluded);
26
- const appRef = useRef();
27
- const [appDimensions, setAppDimensions] = useState({
28
- width: 0,
29
- height: 0
30
- });
31
38
  const [showObs, setShowObs] = useState(false);
32
39
  const [showObsm, setShowObsm] = useState(false);
33
40
  const [showVars, setShowVars] = useState(false);
34
41
  const [showControls, setShowControls] = useState(false);
35
42
  const [showModal, setShowModal] = useState(false);
43
+ const [plotType, setPlotType] = useState(defaultPlotType || PLOT_TYPES.SCATTERPLOT);
44
+ const [showPseudospatialControls, setShowPseudospatialControls] = useState(false);
45
+ const [pseudospatialPlotType, setpseudospatialPlotType] = useState(null);
46
+ const {
47
+ isPseudospatial = false
48
+ } = props;
36
49
  useEffect(() => {
37
- const updateDimensions = () => {
38
- if (appRef.current) {
39
- // Get the distance from the top of the page to the target element
40
- const rect = appRef.current.getBoundingClientRect();
41
- const distanceFromTop = rect.top + window.scrollY;
42
-
43
- // Calculate the available height for the Cherita app
44
- const availableHeight = window.innerHeight - distanceFromTop;
45
-
46
- // Update the dimensions to fit the viewport minus the navbar height
47
- setAppDimensions({
48
- width: appRef.current.offsetWidth,
49
- height: availableHeight
50
- });
51
- }
52
- };
53
- window.addEventListener("resize", updateDimensions);
54
- updateDimensions(); // Initial update
55
- return () => window.removeEventListener("resize", updateDimensions);
56
- }, []);
57
- return /*#__PURE__*/React.createElement("div", {
58
- ref: appRef,
59
- className: "cherita-app",
60
- style: {
61
- height: appDimensions.height
62
- }
63
- }, /*#__PURE__*/React.createElement(DatasetProvider, props, /*#__PURE__*/React.createElement(Container, {
64
- fluid: true,
65
- className: "d-flex g-0",
66
- style: {
67
- height: appDimensions.height
50
+ setPlotType(defaultPlotType || PLOT_TYPES.SCATTERPLOT);
51
+ }, [defaultPlotType]);
52
+ const LgBreakpoint = useMediaQuery(BREAKPOINTS.LG);
53
+ const XlBreakpoint = useMediaQuery(BREAKPOINTS.XL);
54
+ const showObsBtn = LgBreakpoint;
55
+ const showVarsBtn = XlBreakpoint;
56
+ const {
57
+ plotControls,
58
+ varMode,
59
+ showSelectedAsActive
60
+ } = {
61
+ [PLOT_TYPES.SCATTERPLOT]: {
62
+ plotControls: ScatterplotControls,
63
+ varMode: SELECTION_MODES.SINGLE,
64
+ showSelectedAsActive: false
65
+ },
66
+ [PLOT_TYPES.DOTPLOT]: {
67
+ plotControls: DotplotControls,
68
+ varMode: SELECTION_MODES.MULTIPLE,
69
+ showSelectedAsActive: true
70
+ },
71
+ [PLOT_TYPES.MATRIXPLOT]: {
72
+ plotControls: MatrixplotControls,
73
+ varMode: SELECTION_MODES.MULTIPLE,
74
+ showSelectedAsActive: true
75
+ },
76
+ [PLOT_TYPES.HEATMAP]: {
77
+ plotControls: HeatmapControls,
78
+ varMode: SELECTION_MODES.MULTIPLE,
79
+ showSelectedAsActive: true
80
+ },
81
+ [PLOT_TYPES.VIOLINPLOT]: {
82
+ plotControls: ViolinControls,
83
+ varMode: SELECTION_MODES.MULTIPLE,
84
+ showSelectedAsActive: false
68
85
  }
69
- }, /*#__PURE__*/React.createElement("div", {
70
- className: "cherita-app-obs modern-scrollbars border-end h-100"
71
- }, /*#__PURE__*/React.createElement(ObsColsList, props)), /*#__PURE__*/React.createElement("div", {
72
- className: "cherita-app-canvas flex-grow-1"
73
- }, children({
74
- setShowObs,
75
- setShowVars
76
- })), /*#__PURE__*/React.createElement("div", {
77
- className: "cherita-app-sidebar p-3"
78
- }, /*#__PURE__*/React.createElement(Card, null, /*#__PURE__*/React.createElement(Card.Body, {
79
- className: "d-flex flex-column p-0"
80
- }, /*#__PURE__*/React.createElement("div", {
81
- className: "sidebar-features modern-scrollbars"
82
- }, /*#__PURE__*/React.createElement(SearchBar, {
83
- searchDiseases: searchDiseases,
84
- searchVar: true
85
- }), /*#__PURE__*/React.createElement(VarNamesList, {
86
- mode: varMode
87
- })))))), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement(Modal, {
88
- show: showModal,
89
- onHide: () => setShowModal(false),
90
- centered: true
91
- }, /*#__PURE__*/React.createElement(Modal.Header, {
92
- closeButton: true
93
- }), /*#__PURE__*/React.createElement(Modal.Body, null)), /*#__PURE__*/React.createElement(OffcanvasObs, {
94
- show: showObs,
95
- handleClose: () => setShowObs(false)
96
- }), /*#__PURE__*/React.createElement(OffcanvasVars, {
97
- show: showVars,
98
- handleClose: () => setShowVars(false),
99
- mode: varMode
100
- }), /*#__PURE__*/React.createElement(OffcanvasControls, {
101
- show: showControls,
102
- handleClose: () => setShowControls(false),
103
- Controls: ScatterplotControls
104
- }), /*#__PURE__*/React.createElement(OffcanvasObsm, {
105
- show: showObsm,
106
- handleClose: () => setShowObsm(false)
107
- }))));
108
- }
109
- export function FullPageScatterplot(props) {
110
- return /*#__PURE__*/React.createElement(FullPage, _extends({}, props, {
111
- varMode: SELECTION_MODES.SINGLE
112
- }), _ref2 => {
113
- let {
86
+ }[plotType];
87
+ const plot = useMemo(() => {
88
+ const commonProps = {
89
+ showObsBtn,
90
+ showVarsBtn,
91
+ showCtrlsBtn: true,
92
+ plotType,
114
93
  setShowObs,
115
- setShowVars
116
- } = _ref2;
117
- return /*#__PURE__*/React.createElement(Scatterplot, {
118
- setShowObs: setShowObs,
119
- setShowVars: setShowVars,
120
- isFullscreen: true
121
- });
94
+ setShowVars,
95
+ setShowControls,
96
+ setPlotType
97
+ };
98
+ switch (plotType) {
99
+ case PLOT_TYPES.DOTPLOT:
100
+ return /*#__PURE__*/_jsx(Dotplot, _objectSpread({}, commonProps));
101
+ case PLOT_TYPES.MATRIXPLOT:
102
+ return /*#__PURE__*/_jsx(Matrixplot, _objectSpread({}, commonProps));
103
+ case PLOT_TYPES.HEATMAP:
104
+ return /*#__PURE__*/_jsx(Heatmap, _objectSpread({}, commonProps));
105
+ case PLOT_TYPES.VIOLINPLOT:
106
+ return /*#__PURE__*/_jsx(Violin, _objectSpread({
107
+ mode: VIOLIN_MODES.MULTIKEY
108
+ }, commonProps));
109
+ case PLOT_TYPES.SCATTERPLOT:
110
+ default:
111
+ return /*#__PURE__*/_jsx(Scatterplot, _objectSpread(_objectSpread({}, commonProps), {}, {
112
+ isFullscreen: true
113
+ }));
114
+ }
115
+ }, [plotType, showObsBtn, showVarsBtn]);
116
+ return /*#__PURE__*/_jsx("div", {
117
+ className: "cherita-app",
118
+ children: /*#__PURE__*/_jsxs(DatasetProvider, _objectSpread(_objectSpread({}, props), {}, {
119
+ children: [/*#__PURE__*/_jsxs(Container, {
120
+ fluid: true,
121
+ className: "cherita-app-container",
122
+ children: [/*#__PURE__*/_jsx("div", {
123
+ className: "cherita-app-obs modern-scrollbars border-end h-100",
124
+ children: /*#__PURE__*/_jsx(ObsColsList, _objectSpread(_objectSpread({}, props), {}, {
125
+ showSelectedAsActive: showSelectedAsActive,
126
+ showHistograms: varMode === SELECTION_MODES.SINGLE,
127
+ showColor: varMode === SELECTION_MODES.SINGLE
128
+ }))
129
+ }), /*#__PURE__*/_jsx("div", {
130
+ className: "cherita-app-canvas",
131
+ children: plot
132
+ }), /*#__PURE__*/_jsx("div", {
133
+ className: "cherita-app-sidebar p-3",
134
+ children: /*#__PURE__*/_jsx(Card, {
135
+ children: /*#__PURE__*/_jsxs(Card.Body, {
136
+ children: [/*#__PURE__*/_jsx("div", {
137
+ className: "plotselector",
138
+ children: /*#__PURE__*/_jsx(PlotTypeSelector, {
139
+ currentType: plotType,
140
+ onChange: type => setPlotType(type)
141
+ })
142
+ }), plotType === PLOT_TYPES.SCATTERPLOT && isPseudospatial ? /*#__PURE__*/_jsx("div", {
143
+ className: "sidebar-pseudospatial",
144
+ children: /*#__PURE__*/_jsx(Pseudospatial, {
145
+ plotType: pseudospatialPlotType,
146
+ setPlotType: setpseudospatialPlotType,
147
+ setShowControls: setShowPseudospatialControls
148
+ })
149
+ }) : /*#__PURE__*/_jsx(_Fragment, {}), /*#__PURE__*/_jsxs("div", {
150
+ className: "sidebar-features",
151
+ children: [/*#__PURE__*/_jsx(SearchBar, {
152
+ searchDiseases: searchDiseases,
153
+ searchVar: true
154
+ }), /*#__PURE__*/_jsx("div", {
155
+ className: "sidebar-features-list",
156
+ children: /*#__PURE__*/_jsx(VarNamesList, {
157
+ mode: varMode
158
+ })
159
+ })]
160
+ })]
161
+ })
162
+ })
163
+ })]
164
+ }), /*#__PURE__*/_jsxs("div", {
165
+ children: [/*#__PURE__*/_jsxs(Modal, {
166
+ show: showModal,
167
+ onHide: () => setShowModal(false),
168
+ centered: true,
169
+ children: [/*#__PURE__*/_jsx(Modal.Header, {
170
+ closeButton: true
171
+ }), /*#__PURE__*/_jsx(Modal.Body, {})]
172
+ }), /*#__PURE__*/_jsx(OffcanvasObs, _objectSpread(_objectSpread({}, props), {}, {
173
+ showSelectedAsActive: showSelectedAsActive,
174
+ show: showObs,
175
+ handleClose: () => setShowObs(false)
176
+ })), /*#__PURE__*/_jsx(OffcanvasVars, {
177
+ show: showVars,
178
+ handleClose: () => setShowVars(false),
179
+ mode: varMode
180
+ }), plotControls && /*#__PURE__*/_jsx(OffcanvasControls, {
181
+ show: showControls,
182
+ handleClose: () => setShowControls(false),
183
+ Controls: plotControls
184
+ }), /*#__PURE__*/_jsx(OffcanvasObsm, {
185
+ show: showObsm,
186
+ handleClose: () => setShowObsm(false)
187
+ }), /*#__PURE__*/_jsx(OffcanvasControls, {
188
+ show: showPseudospatialControls,
189
+ handleClose: () => setShowPseudospatialControls(false),
190
+ Controls: PseudospatialToolbar,
191
+ plotType: pseudospatialPlotType
192
+ })]
193
+ })]
194
+ }))
122
195
  });
123
- }
124
- export function FullPagePlots(props) {
125
- return /*#__PURE__*/React.createElement(FullPage, _extends({}, props, {
126
- varMode: SELECTION_MODES.MULTIPLE
127
- }), /*#__PURE__*/React.createElement("div", {
128
- className: "container-fluid w-100 h-100 d-flex flex-column overflow-y-auto"
129
- }, /*#__PURE__*/React.createElement("div", {
130
- className: "row flex-grow-1"
131
- }, /*#__PURE__*/React.createElement(Heatmap, null)), /*#__PURE__*/React.createElement("div", {
132
- className: "row flex-grow-1"
133
- }, /*#__PURE__*/React.createElement(Matrixplot, null)), /*#__PURE__*/React.createElement("div", {
134
- className: "row flex-grow-1"
135
- }, /*#__PURE__*/React.createElement(Dotplot, null)), /*#__PURE__*/React.createElement("div", {
136
- className: "row flex-grow-1"
137
- }, /*#__PURE__*/React.createElement(Violin, {
138
- mode: VIOLIN_MODES.GROUPBY
139
- }))));
140
196
  }
@@ -0,0 +1,39 @@
1
+ import { useMediaQuery } from '@mui/material';
2
+ import { Alert } from 'react-bootstrap';
3
+ import { PlotTypeSelector } from './PlotTypeSelector';
4
+ import { BREAKPOINTS, PLOT_TYPES } from '../../constants/constants';
5
+ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
6
+ export function PlotAlert(_ref) {
7
+ let {
8
+ variant = 'warning',
9
+ plotType = PLOT_TYPES.SCATTERPLOT,
10
+ setPlotType,
11
+ heading,
12
+ children
13
+ } = _ref;
14
+ const XlBreakpoint = useMediaQuery(BREAKPOINTS.XL);
15
+ const showPlotSelector = XlBreakpoint;
16
+ return /*#__PURE__*/_jsxs(_Fragment, {
17
+ children: [showPlotSelector && /*#__PURE__*/_jsx("div", {
18
+ className: "plotselector",
19
+ children: /*#__PURE__*/_jsx(PlotTypeSelector, {
20
+ currentType: plotType,
21
+ onChange: type => {
22
+ if (setPlotType) setPlotType(type);
23
+ }
24
+ })
25
+ }), /*#__PURE__*/_jsx("div", {
26
+ className: "cherita-plot-alert h-100",
27
+ children: /*#__PURE__*/_jsx("div", {
28
+ className: "w-100 h-100 d-flex justify-content-center align-items-center",
29
+ children: /*#__PURE__*/_jsxs(Alert, {
30
+ variant: variant,
31
+ className: "m-0 w-75 w-lg-50 text-center",
32
+ children: [heading && /*#__PURE__*/_jsx(Alert.Heading, {
33
+ children: heading
34
+ }), " ", children]
35
+ })
36
+ })
37
+ })]
38
+ });
39
+ }