@haniffalab/cherita-react 1.4.1-dev.2025-10-20.528e0f75 → 1.4.1-dev.2025-10-22.61540191

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 (50) hide show
  1. package/dist/cjs/components/dotplot/Dotplot.js +23 -15
  2. package/dist/cjs/components/full-page/FullPage.js +32 -30
  3. package/dist/cjs/components/full-page/PlotAlert.js +36 -0
  4. package/dist/cjs/components/full-page/PlotTypeSelector.js +77 -39
  5. package/dist/cjs/components/heatmap/Heatmap.js +23 -15
  6. package/dist/cjs/components/icons/DotPlotIcon.js +58 -0
  7. package/dist/cjs/components/icons/HeatmapIcon.js +39 -0
  8. package/dist/cjs/components/icons/MatrixPlotIcon.1.js +51 -0
  9. package/dist/cjs/components/icons/MatrixPlotIcon.js +53 -0
  10. package/dist/cjs/components/icons/ScatterplotIcon.1.js +158 -0
  11. package/dist/cjs/components/icons/ScatterplotIcon.js +138 -0
  12. package/dist/cjs/components/icons/ViolinPlotIcon.js +34 -0
  13. package/dist/cjs/components/matrixplot/Matrixplot.js +25 -17
  14. package/dist/cjs/components/pseudospatial/Pseudospatial.js +64 -25
  15. package/dist/cjs/components/pseudospatial/PseudospatialToolbar.js +63 -15
  16. package/dist/cjs/components/violin/Violin.js +41 -30
  17. package/dist/cjs/context/DatasetContext.js +1 -1
  18. package/dist/cjs/context/SettingsContext.js +27 -3
  19. package/dist/cjs/utils/StyledTooltip.js +39 -0
  20. package/dist/css/cherita.css +37 -22
  21. package/dist/css/cherita.css.map +1 -1
  22. package/dist/esm/components/dotplot/Dotplot.js +22 -13
  23. package/dist/esm/components/full-page/FullPage.js +6 -3
  24. package/dist/esm/components/full-page/PlotAlert.js +30 -0
  25. package/dist/esm/components/full-page/PlotTypeSelector.js +76 -38
  26. package/dist/esm/components/heatmap/Heatmap.js +22 -13
  27. package/dist/esm/components/icons/DotPlotIcon.js +52 -0
  28. package/dist/esm/components/icons/HeatmapIcon.js +33 -0
  29. package/dist/esm/components/icons/MatrixPlotIcon.1.js +45 -0
  30. package/dist/esm/components/icons/MatrixPlotIcon.js +47 -0
  31. package/dist/esm/components/icons/ScatterplotIcon.1.js +152 -0
  32. package/dist/esm/components/icons/ScatterplotIcon.js +132 -0
  33. package/dist/esm/components/icons/ViolinPlotIcon.js +28 -0
  34. package/dist/esm/components/matrixplot/Matrixplot.js +24 -15
  35. package/dist/esm/components/pseudospatial/Pseudospatial.js +58 -18
  36. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +52 -4
  37. package/dist/esm/components/violin/Violin.js +36 -24
  38. package/dist/esm/context/DatasetContext.js +1 -1
  39. package/dist/esm/context/SettingsContext.js +27 -3
  40. package/dist/esm/utils/StyledTooltip.js +33 -0
  41. package/package.json +2 -2
  42. package/scss/cherita.scss +19 -1
  43. package/scss/components/layouts.scss +2 -21
  44. package/scss/components/plotly.scss +37 -26
  45. package/scss/components/plots.scss +14 -1
  46. package/dist/assets/images/plots/dotplot.svg +0 -152
  47. package/dist/assets/images/plots/heatmap.svg +0 -193
  48. package/dist/assets/images/plots/matrixplot.svg +0 -275
  49. package/dist/assets/images/plots/scatterplot.svg +0 -198
  50. package/dist/assets/images/plots/violin.svg +0 -50
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = MatrixPlotIcon;
7
+ const _excluded = ["size", "colour", "gap"];
8
+ 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); }
9
+ 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; }
10
+ 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; }
11
+ function MatrixPlotIcon(_ref) {
12
+ let {
13
+ size = 40,
14
+ colour = "#000",
15
+ gap = 2
16
+ } = _ref,
17
+ props = _objectWithoutProperties(_ref, _excluded);
18
+ const rows = 3;
19
+ const cols = 3;
20
+ const squareSize = (size - gap * (cols - 1)) / cols;
21
+ const squares = [];
22
+ for (let row = 0; row < rows; row++) {
23
+ for (let col = 0; col < cols; col++) {
24
+ squares.push({
25
+ x: col * (squareSize + gap),
26
+ y: row * (squareSize + gap)
27
+ });
28
+ }
29
+ }
30
+
31
+ // Example: corners semi-transparent
32
+ const semiTransparentSquares = [0, 2, 6, 8];
33
+ return /*#__PURE__*/React.createElement("svg", _extends({
34
+ width: size,
35
+ height: size,
36
+ viewBox: "0 0 ".concat(size, " ").concat(size),
37
+ xmlns: "http://www.w3.org/2000/svg"
38
+ }, props), squares.map((_ref2, i) => {
39
+ let {
40
+ x,
41
+ y
42
+ } = _ref2;
43
+ return /*#__PURE__*/React.createElement("rect", {
44
+ key: i,
45
+ x: x,
46
+ y: y,
47
+ width: squareSize,
48
+ height: squareSize,
49
+ fill: colour,
50
+ fillOpacity: semiTransparentSquares.includes(i) ? 0.5 : 1
51
+ });
52
+ }));
53
+ }
@@ -0,0 +1,158 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = ScatterplotIcon;
7
+ const _excluded = ["size", "colour"];
8
+ 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); }
9
+ 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; }
10
+ 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; }
11
+ function ScatterplotIcon(_ref) {
12
+ let {
13
+ size = 40,
14
+ colour = "#000"
15
+ } = _ref,
16
+ props = _objectWithoutProperties(_ref, _excluded);
17
+ // Points with cluster assignments
18
+ const points = [
19
+ // Cluster 0
20
+ {
21
+ x: 15.2,
22
+ y: 35.9,
23
+ cluster: 0
24
+ }, {
25
+ x: 10.0,
26
+ y: 38.0,
27
+ cluster: 0
28
+ }, {
29
+ x: 12.3,
30
+ y: 40.7,
31
+ cluster: 0
32
+ }, {
33
+ x: 15.7,
34
+ y: 39.9,
35
+ cluster: 0
36
+ }, {
37
+ x: 8.1,
38
+ y: 42.2,
39
+ cluster: 0
40
+ }, {
41
+ x: 10.8,
42
+ y: 44.5,
43
+ cluster: 0
44
+ }, {
45
+ x: 14.3,
46
+ y: 44.6,
47
+ cluster: 0
48
+ }, {
49
+ x: 7.4,
50
+ y: 46.7,
51
+ cluster: 0
52
+ }, {
53
+ x: 11.1,
54
+ y: 48.8,
55
+ cluster: 0
56
+ }, {
57
+ x: 14.8,
58
+ y: 48.5,
59
+ cluster: 0
60
+ }, {
61
+ x: 12.6,
62
+ y: 52.1,
63
+ cluster: 0
64
+ },
65
+ // Cluster 1
66
+ {
67
+ x: 29.4,
68
+ y: 37.0,
69
+ cluster: 1
70
+ }, {
71
+ x: 26.1,
72
+ y: 40.2,
73
+ cluster: 1
74
+ }, {
75
+ x: 29.8,
76
+ y: 42.0,
77
+ cluster: 1
78
+ }, {
79
+ x: 33.0,
80
+ y: 39.5,
81
+ cluster: 1
82
+ }, {
83
+ x: 34.9,
84
+ y: 43.6,
85
+ cluster: 1
86
+ }, {
87
+ x: 31.5,
88
+ y: 46.2,
89
+ cluster: 1
90
+ }, {
91
+ x: 29.3,
92
+ y: 49.5,
93
+ cluster: 1
94
+ }, {
95
+ x: 26.7,
96
+ y: 45.2,
97
+ cluster: 1
98
+ },
99
+ // Cluster 2
100
+ {
101
+ x: 21.6,
102
+ y: 53.1,
103
+ cluster: 2
104
+ }, {
105
+ x: 25.3,
106
+ y: 53.9,
107
+ cluster: 2
108
+ }, {
109
+ x: 25.8,
110
+ y: 57.9,
111
+ cluster: 2
112
+ }, {
113
+ x: 22.1,
114
+ y: 57.4,
115
+ cluster: 2
116
+ }, {
117
+ x: 18.4,
118
+ y: 56.0,
119
+ cluster: 2
120
+ }, {
121
+ x: 18.6,
122
+ y: 59.8,
123
+ cluster: 2
124
+ }, {
125
+ x: 22.5,
126
+ y: 61.7,
127
+ cluster: 2
128
+ }];
129
+ const radius = 1.8;
130
+ const opacity = 1.0; // uniform expression
131
+
132
+ // Compute viewBox dynamically
133
+ const xs = points.map(p => p.x);
134
+ const ys = points.map(p => p.y);
135
+ const minX = Math.min(...xs) - radius;
136
+ const minY = Math.min(...ys) - radius;
137
+ const maxX = Math.max(...xs) + radius;
138
+ const maxY = Math.max(...ys) + radius;
139
+ return /*#__PURE__*/React.createElement("svg", _extends({
140
+ width: size,
141
+ height: size,
142
+ viewBox: "".concat(minX, " ").concat(minY, " ").concat(maxX - minX, " ").concat(maxY - minY),
143
+ xmlns: "http://www.w3.org/2000/svg"
144
+ }, props), points.map((_ref2, i) => {
145
+ let {
146
+ x,
147
+ y
148
+ } = _ref2;
149
+ return /*#__PURE__*/React.createElement("circle", {
150
+ key: i,
151
+ cx: x,
152
+ cy: y,
153
+ r: radius,
154
+ fill: colour,
155
+ opacity: opacity
156
+ });
157
+ }));
158
+ }
@@ -0,0 +1,138 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = ScatterplotIcon;
7
+ const _excluded = ["size", "colour"];
8
+ 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); }
9
+ 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; }
10
+ 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; }
11
+ function ScatterplotIcon(_ref) {
12
+ let {
13
+ size = 40,
14
+ colour = "#000"
15
+ } = _ref,
16
+ props = _objectWithoutProperties(_ref, _excluded);
17
+ // Points with cluster assignments
18
+ const points = [
19
+ // Cluster 0
20
+ {
21
+ x: 15.2,
22
+ y: 35.9,
23
+ cluster: 0
24
+ }, {
25
+ x: 10.0,
26
+ y: 38.0,
27
+ cluster: 0
28
+ }, {
29
+ x: 12.3,
30
+ y: 40.7,
31
+ cluster: 0
32
+ }, {
33
+ x: 15.7,
34
+ y: 39.9,
35
+ cluster: 0
36
+ }, {
37
+ x: 8.1,
38
+ y: 42.2,
39
+ cluster: 0
40
+ }, {
41
+ x: 10.8,
42
+ y: 44.5,
43
+ cluster: 0
44
+ }, {
45
+ x: 14.3,
46
+ y: 44.6,
47
+ cluster: 0
48
+ }, {
49
+ x: 7.4,
50
+ y: 46.7,
51
+ cluster: 0
52
+ }, {
53
+ x: 11.1,
54
+ y: 48.8,
55
+ cluster: 0
56
+ },
57
+ // Cluster 1
58
+ {
59
+ x: 29.4,
60
+ y: 37.0,
61
+ cluster: 1
62
+ }, {
63
+ x: 26.1,
64
+ y: 40.2,
65
+ cluster: 1
66
+ }, {
67
+ x: 29.8,
68
+ y: 42.0,
69
+ cluster: 1
70
+ }, {
71
+ x: 33.0,
72
+ y: 39.5,
73
+ cluster: 1
74
+ }, {
75
+ x: 34.9,
76
+ y: 43.6,
77
+ cluster: 1
78
+ }, {
79
+ x: 31.5,
80
+ y: 46.2,
81
+ cluster: 1
82
+ },
83
+ // Cluster 2
84
+ {
85
+ x: 21.6,
86
+ y: 53.1,
87
+ cluster: 2
88
+ }, {
89
+ x: 25.3,
90
+ y: 53.9,
91
+ cluster: 2
92
+ }, {
93
+ x: 25.8,
94
+ y: 57.9,
95
+ cluster: 2
96
+ }, {
97
+ x: 22.1,
98
+ y: 57.4,
99
+ cluster: 2
100
+ }, {
101
+ x: 18.4,
102
+ y: 56.0,
103
+ cluster: 2
104
+ }, {
105
+ x: 22.5,
106
+ y: 61.7,
107
+ cluster: 2
108
+ }];
109
+ const radius = 1.8;
110
+ const opacity = 1.0; // uniform expression
111
+
112
+ // Compute viewBox dynamically
113
+ const xs = points.map(p => p.x);
114
+ const ys = points.map(p => p.y);
115
+ const minX = Math.min(...xs) - radius;
116
+ const minY = Math.min(...ys) - radius;
117
+ const maxX = Math.max(...xs) + radius;
118
+ const maxY = Math.max(...ys) + radius;
119
+ return /*#__PURE__*/React.createElement("svg", _extends({
120
+ width: size,
121
+ height: size,
122
+ viewBox: "".concat(minX, " ").concat(minY, " ").concat(maxX - minX, " ").concat(maxY - minY),
123
+ xmlns: "http://www.w3.org/2000/svg"
124
+ }, props), points.map((_ref2, i) => {
125
+ let {
126
+ x,
127
+ y
128
+ } = _ref2;
129
+ return /*#__PURE__*/React.createElement("circle", {
130
+ key: i,
131
+ cx: x,
132
+ cy: y,
133
+ r: radius,
134
+ fill: colour,
135
+ opacity: opacity
136
+ });
137
+ }));
138
+ }
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = ViolinPlotIcon;
7
+ const _excluded = ["size", "colour"];
8
+ 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); }
9
+ 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; }
10
+ 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; }
11
+ function ViolinPlotIcon(_ref) {
12
+ let {
13
+ size = 40,
14
+ colour = "#000"
15
+ } = _ref,
16
+ props = _objectWithoutProperties(_ref, _excluded);
17
+ return /*#__PURE__*/React.createElement("svg", _extends({
18
+ viewBox: "0 0 37 40",
19
+ width: size,
20
+ height: size,
21
+ xmlns: "http://www.w3.org/2000/svg"
22
+ }, props), /*#__PURE__*/React.createElement("g", {
23
+ fill: colour,
24
+ stroke: colour,
25
+ strokeWidth: "0.5",
26
+ transform: "translate(-12 -8)"
27
+ }, /*#__PURE__*/React.createElement("path", {
28
+ d: "M19.9971,24.5 A6.3078,6.3078 0 0 0 18.5732,20.8389 7.1479,7.1479 0 0 1 16.9971,16.5 V16.0029 H16.0029 V16.5 a7.1479,7.1479 0 0 1 -1.5761,4.3389 6.3078,6.3078 0 0 0 -1.4239,3.6611 12.4967,12.4967 0 0 1 -0.4853,3.38 13.5076,13.5076 0 0 0 -0.5147,3.62 6.3078,6.3078 0 0 0 1.4239,3.6611 7.1479,7.1479 0 0 1 1.5761,4.3389 19.2486,19.2486 0 0 0 0.5664,4.7246 13.6883,13.6883 0 0 1 0.4336,3.2754 v0.4971 h0.9942 V47.5 A13.6883,13.6883 0 0 1 17.4307,44.2246 19.2486,19.2486 0 0 0 17.9971,39.5 7.1479,7.1479 0 0 1 19.5732,35.1611 6.3078,6.3078 0 0 0 20.9971,31.5 13.5076,13.5076 0 0 0 20.4824,27.88 12.4967,12.4967 0 0 1 19.9971,24.5 Z"
29
+ }), /*#__PURE__*/React.createElement("path", {
30
+ d: "M34.6436,12.6963 C32.8506,11.5537 30.9971,10.3711 30.9971,8.5 V8.0029 H30.0029 V8.5 c0,1.8711 -1.8535,3.0537 -3.6465,4.1963 -1.7246,1.1006 -3.3535,2.1387 -3.3535,3.8037 0,1.6152 1.2188,2.7031 2.3975,3.7549 1.2793,1.1426 2.6025,2.3242 2.6025,4.2451 a18.1508,18.1508 0 0 1 -0.542,4.5068 14.5,14.5 0 0 0 -0.458,3.4932 6.038,6.038 0 0 0 1.6,3.7979 5.179,5.179 0 0 1 1.4,3.2021 v0.4971 h0.9942 V39.5 a5.179,5.179 0 0 1 1.4,-3.2021 6.038,6.038 0 0 0 1.6,-3.7979 14.5,14.5 0 0 0 -0.458,-3.4932 18.1508,18.1508 0 0 1 -0.542,-4.5068 c0,-1.9209 1.3232,-3.1025 2.6025,-4.2451 1.1787,-1.0518 2.3975,-2.14 2.3975,-3.7549 0,-1.665 -1.6289,-2.7031 -3.3535,-3.8037 z"
31
+ }), /*#__PURE__*/React.createElement("path", {
32
+ d: "M47.3975,35.7021 A5.179,5.179 0 0 1 45.9975,32.5 14.5,14.5 0 0 0 45.5395,29.0068 18.1508,18.1508 0 0 1 44.9975,24.5 V24.0029 H44.0033 V24.5 a18.1508,18.1508 0 0 1 -0.542,4.5068 14.5,14.5 0 0 0 -0.458,3.4932 5.179,5.179 0 0 1 -1.4,3.2021 6.038,6.038 0 0 0 -1.6,3.7979 c0,1.582 0.9717,2.667 1.9121,3.7158 1.0264,1.1455 2.0879,2.3311 2.0879,4.2842 v0.4971 h0.9942 V47.5 c0,-1.9531 1.0615,-3.1387 2.0879,-4.2842 0.94,-1.0488 1.9121,-2.1338 1.9121,-3.7158 a6.038,6.038 0 0 0 -1.6,-3.7979 z"
33
+ })));
34
+ }
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Matrixplot = Matrixplot;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
8
  var _lodash = _interopRequireDefault(require("lodash"));
9
9
  var _reactBootstrap = require("react-bootstrap");
10
10
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
@@ -15,9 +15,9 @@ var _SettingsContext = require("../../context/SettingsContext");
15
15
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
16
16
  var _requests = require("../../utils/requests");
17
17
  var _Resolver = require("../../utils/Resolver");
18
+ var _PlotAlert = require("../full-page/PlotAlert");
18
19
  var _Toolbar = require("../toolbar/Toolbar");
19
20
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
20
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
21
21
  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; }
22
22
  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; }
23
23
  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; }
@@ -30,7 +30,9 @@ function Matrixplot(_ref) {
30
30
  showCtrlsBtn = false,
31
31
  setShowObs,
32
32
  setShowVars,
33
- setShowControls
33
+ setShowControls,
34
+ plotType,
35
+ setPlotType
34
36
  } = _ref;
35
37
  const ENDPOINT = "matrixplot";
36
38
  const dataset = (0, _DatasetContext.useDataset)();
@@ -115,9 +117,9 @@ function Matrixplot(_ref) {
115
117
  const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
116
118
  if (!serverError) {
117
119
  if (hasSelections) {
118
- return /*#__PURE__*/_react.default.createElement("div", {
120
+ return /*#__PURE__*/React.createElement("div", {
119
121
  className: "cherita-plot cherita-matrixplot position-relative"
120
- }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
122
+ }, isPending && /*#__PURE__*/React.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/React.createElement(_reactPlotly.default, {
121
123
  data: data,
122
124
  layout: layout,
123
125
  useResizeHandler: true,
@@ -131,22 +133,28 @@ function Matrixplot(_ref) {
131
133
  }
132
134
  }));
133
135
  }
134
- return /*#__PURE__*/_react.default.createElement("div", {
135
- className: "cherita-matrixplot"
136
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
137
- variant: "light"
138
- }, "Select", " ", showVarsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
136
+ return /*#__PURE__*/React.createElement(_PlotAlert.PlotAlert, {
137
+ variant: "info",
138
+ heading: "Matrixplot",
139
+ plotType: plotType,
140
+ setPlotType: setPlotType
141
+ }, /*#__PURE__*/React.createElement("p", {
142
+ className: "p-0 m-0"
143
+ }, "Select a", " ", showObsBtn ? /*#__PURE__*/React.createElement(_reactBootstrap.Button, {
139
144
  variant: "link",
140
145
  className: "border-0 p-0 align-baseline",
141
- onClick: setShowVars
142
- }, "features") : "features", " ", "and a", " ", showObsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
146
+ onClick: setShowObs
147
+ }, "category") : "category", " ", "to group observations, then choose one or more", " ", showVarsBtn ? /*#__PURE__*/React.createElement(_reactBootstrap.Button, {
143
148
  variant: "link",
144
149
  className: "border-0 p-0 align-baseline",
145
- onClick: setShowObs
146
- }, "category") : "category"));
150
+ onClick: setShowVars
151
+ }, "features") : "features", " ", "to display the matrix plot."));
147
152
  } else {
148
- return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
149
- variant: "danger"
150
- }, serverError.message));
153
+ return /*#__PURE__*/React.createElement(_PlotAlert.PlotAlert, {
154
+ variant: "danger",
155
+ heading: "Matrixplot",
156
+ plotType: plotType,
157
+ setPlotType: setPlotType
158
+ }, serverError.message || "An unexpected error occurred while generating the plot.");
151
159
  }
152
160
  }
@@ -5,8 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.Pseudospatial = Pseudospatial;
7
7
  exports.PseudospatialImage = PseudospatialImage;
8
- var _react = _interopRequireWildcard(require("react"));
9
- var _fontawesomeSvgCore = require("@fortawesome/fontawesome-svg-core");
8
+ var _react = require("react");
10
9
  var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
11
10
  var _lodash = _interopRequireDefault(require("lodash"));
12
11
  var _reactBootstrap = require("react-bootstrap");
@@ -22,13 +21,11 @@ var _LoadingIndicators = require("../../utils/LoadingIndicators");
22
21
  var _requests = require("../../utils/requests");
23
22
  var _Resolver = require("../../utils/Resolver");
24
23
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
25
- function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); }
26
24
  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; }
27
25
  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; }
28
26
  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; }
29
27
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
30
28
  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); }
31
- _fontawesomeSvgCore.library.add(_freeSolidSvgIcons.faSliders);
32
29
  function usePseudospatialData(plotType) {
33
30
  const ENDPOINT = "pseudospatial";
34
31
  const dataset = (0, _DatasetContext.useDataset)();
@@ -82,7 +79,7 @@ function usePseudospatialData(plotType) {
82
79
  });
83
80
  }
84
81
  function Pseudospatial(_ref) {
85
- var _layout$coloraxis3, _layout$coloraxis4;
82
+ var _layout$coloraxis3, _layout$coloraxis4, _settings$pseudospati2;
86
83
  let {
87
84
  showLegend = true,
88
85
  sharedScaleRange = false,
@@ -91,6 +88,9 @@ function Pseudospatial(_ref) {
91
88
  plotType,
92
89
  setPlotType
93
90
  } = _ref;
91
+ const {
92
+ imageUrl
93
+ } = (0, _DatasetContext.useDataset)();
94
94
  const settings = (0, _SettingsContext.useSettings)();
95
95
  const dispatch = (0, _SettingsContext.useSettingsDispatch)();
96
96
  const [data, setData] = (0, _react.useState)([]);
@@ -197,45 +197,84 @@ function Pseudospatial(_ref) {
197
197
  }
198
198
  }, [settings.controls.range, settings.controls.valueMax, settings.controls.valueMin, getColor, sharedScaleRange, valueMax, valueMin]);
199
199
  const hasSelections = !!plotType && !!settings.pseudospatial.maskSet;
200
- const faSlidersPath = _freeSolidSvgIcons.faSliders.icon[4];
200
+ const images = (0, _react.useMemo)(() => {
201
+ if (imageUrl) {
202
+ return [_objectSpread({
203
+ source: imageUrl,
204
+ xref: "paper",
205
+ yref: "paper",
206
+ x: 0.5,
207
+ y: 0.5,
208
+ sizex: 1,
209
+ sizey: 1,
210
+ sizing: "contain",
211
+ layer: "above",
212
+ xanchor: "center",
213
+ yanchor: "middle",
214
+ name: "Reference Image"
215
+ }, settings.pseudospatial.refImg)];
216
+ }
217
+ return [];
218
+ }, [imageUrl, settings.pseudospatial.refImg]);
219
+ const modeBarButtons = (0, _react.useMemo)(() => {
220
+ var _settings$pseudospati;
221
+ const isRefImgVisible = (_settings$pseudospati = settings.pseudospatial) === null || _settings$pseudospati === void 0 || (_settings$pseudospati = _settings$pseudospati.refImg) === null || _settings$pseudospati === void 0 ? void 0 : _settings$pseudospati.visible;
222
+ return [{
223
+ name: "Open plot controls",
224
+ icon: {
225
+ width: 512,
226
+ height: 512,
227
+ path: _freeSolidSvgIcons.faSliders.icon[4]
228
+ },
229
+ click: () => setShowControls(prev => !prev)
230
+ }, ...(imageUrl ? [{
231
+ name: isRefImgVisible ? "Hide reference image" : "Show reference image",
232
+ icon: {
233
+ width: 600,
234
+ height: 512,
235
+ path: _freeSolidSvgIcons.faEye.icon[4]
236
+ },
237
+ click: () => dispatch({
238
+ type: "toggle.pseudospatial.refImg.visible"
239
+ })
240
+ }] : [])];
241
+ }, [dispatch, imageUrl, setShowControls, (_settings$pseudospati2 = settings.pseudospatial) === null || _settings$pseudospati2 === void 0 || (_settings$pseudospati2 = _settings$pseudospati2.refImg) === null || _settings$pseudospati2 === void 0 ? void 0 : _settings$pseudospati2.visible]);
201
242
  if (!_lodash.default.keys(settings.data.pseudospatial).length) {
202
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
243
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_reactBootstrap.Alert, {
203
244
  variant: "warning"
204
245
  }, "No pseudospatial data"));
205
246
  } else if (!serverError) {
206
247
  var _layout$coloraxis5, _layout$coloraxis6;
207
- return /*#__PURE__*/_react.default.createElement("div", {
248
+ return /*#__PURE__*/React.createElement("div", {
208
249
  className: "cherita-pseudospatial"
209
- }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, hasSelections && isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), hasSelections && /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
250
+ }, /*#__PURE__*/React.createElement(React.Fragment, null, hasSelections && isPending && /*#__PURE__*/React.createElement(_LoadingIndicators.LoadingSpinner, null), hasSelections && /*#__PURE__*/React.createElement(_reactPlotly.default, {
210
251
  data: data,
211
252
  layout: _objectSpread(_objectSpread({}, layout), {}, {
212
253
  autosize: true,
213
- height: height
254
+ height: height,
255
+ margin: {
256
+ l: 0,
257
+ r: 0,
258
+ t: 0,
259
+ b: 0,
260
+ pad: 0
261
+ },
262
+ images: images
214
263
  }),
215
264
  useResizeHandler: true,
216
265
  className: "cherita-pseudospatial-plot",
217
266
  config: {
218
267
  displaylogo: false,
219
268
  displayModeBar: true,
220
- modeBarButtonsToAdd: [{
221
- name: "Open plot controls",
222
- icon: {
223
- width: 512,
224
- height: 512,
225
- path: faSlidersPath,
226
- ascent: 512,
227
- descent: 0
228
- },
229
- click: () => setShowControls(prev => !prev)
230
- }]
269
+ modeBarButtonsToAdd: modeBarButtons
231
270
  }
232
- }), hasSelections && showLegend && /*#__PURE__*/_react.default.createElement(_Legend.Legend, {
271
+ }), hasSelections && showLegend && /*#__PURE__*/React.createElement(_Legend.Legend, {
233
272
  min: layout === null || layout === void 0 || (_layout$coloraxis5 = layout.coloraxis) === null || _layout$coloraxis5 === void 0 ? void 0 : _layout$coloraxis5.cmin,
234
273
  max: layout === null || layout === void 0 || (_layout$coloraxis6 = layout.coloraxis) === null || _layout$coloraxis6 === void 0 ? void 0 : _layout$coloraxis6.cmax,
235
274
  addText: plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.GENE ? " - Mean expression" : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CATEGORICAL ? " - %" : plotType === _constants.PSEUDOSPATIAL_PLOT_TYPES.CONTINUOUS ? " - Mean value" : ""
236
275
  })));
237
276
  } else {
238
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
277
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(_reactBootstrap.Alert, {
239
278
  variant: "danger"
240
279
  }, serverError.message));
241
280
  }
@@ -245,11 +284,11 @@ function Pseudospatial(_ref) {
245
284
  function PseudospatialImage() {
246
285
  const dataset = (0, _DatasetContext.useDataset)();
247
286
  if (dataset.imageUrl) {
248
- return /*#__PURE__*/_react.default.createElement(_ImageViewer.ImageViewer, {
287
+ return /*#__PURE__*/React.createElement(_ImageViewer.ImageViewer, {
249
288
  src: dataset.imageUrl,
250
289
  alt: "Pseudospatial reference image"
251
290
  });
252
291
  } else {
253
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null);
292
+ return /*#__PURE__*/React.createElement(React.Fragment, null);
254
293
  }
255
294
  }