@haniffalab/cherita-react 1.4.1 → 1.4.2-dev.2025-10-29.e8bbb191

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 (138) 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 +67 -69
  4. package/dist/cjs/components/dotplot/DotplotControls.js +103 -83
  5. package/dist/cjs/components/full-page/FullPage.js +100 -74
  6. package/dist/cjs/components/full-page/PlotAlert.js +45 -0
  7. package/dist/cjs/components/full-page/PlotTypeSelector.js +89 -44
  8. package/dist/cjs/components/heatmap/Heatmap.js +65 -65
  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 +65 -66
  18. package/dist/cjs/components/matrixplot/MatrixplotControls.js +8 -5
  19. package/dist/cjs/components/obs-list/ObsItem.js +258 -210
  20. package/dist/cjs/components/obs-list/ObsList.js +161 -133
  21. package/dist/cjs/components/obs-list/ObsToolbar.js +2 -3
  22. package/dist/cjs/components/obsm-list/ObsmList.js +53 -38
  23. package/dist/cjs/components/offcanvas/index.js +61 -31
  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 +127 -99
  27. package/dist/cjs/components/scatterplot/ScatterplotControls.js +45 -31
  28. package/dist/cjs/components/scatterplot/SpatialControls.js +140 -113
  29. package/dist/cjs/components/scatterplot/Toolbox.js +41 -30
  30. package/dist/cjs/components/search-bar/SearchBar.js +168 -121
  31. package/dist/cjs/components/search-bar/SearchInfo.js +76 -50
  32. package/dist/cjs/components/search-bar/SearchResults.js +93 -71
  33. package/dist/cjs/components/toolbar/Toolbar.js +46 -37
  34. package/dist/cjs/components/var-list/VarItem.js +115 -88
  35. package/dist/cjs/components/var-list/VarList.js +85 -69
  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 +109 -107
  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 +47 -47
  42. package/dist/cjs/context/DatasetContext.js +24 -16
  43. package/dist/cjs/context/FilterContext.js +11 -9
  44. package/dist/cjs/context/SettingsContext.js +255 -89
  45. package/dist/cjs/context/ZarrDataContext.js +6 -5
  46. package/dist/cjs/helpers/color-helper.js +2 -2
  47. package/dist/cjs/helpers/zarr-helper.js +3 -3
  48. package/dist/cjs/utils/Filter.js +16 -11
  49. package/dist/cjs/utils/Histogram.js +35 -33
  50. package/dist/cjs/utils/ImageViewer.js +11 -8
  51. package/dist/cjs/utils/Legend.js +37 -30
  52. package/dist/cjs/utils/LoadingIndicators.js +15 -13
  53. package/dist/cjs/utils/Resolver.js +213 -0
  54. package/dist/cjs/utils/Skeleton.js +10 -10
  55. package/dist/cjs/utils/StyledTooltip.js +44 -0
  56. package/dist/cjs/utils/VirtualizedList.js +34 -27
  57. package/dist/cjs/utils/errors.js +15 -15
  58. package/dist/cjs/utils/requests.js +21 -9
  59. package/dist/cjs/utils/search.js +4 -4
  60. package/dist/cjs/utils/string.js +6 -6
  61. package/dist/cjs/utils/zarrData.js +20 -21
  62. package/dist/css/cherita.css +64 -42
  63. package/dist/css/cherita.css.map +1 -1
  64. package/dist/esm/components/controls/Controls.js +43 -35
  65. package/dist/esm/components/dotplot/Dotplot.js +77 -78
  66. package/dist/esm/components/dotplot/DotplotControls.js +106 -85
  67. package/dist/esm/components/full-page/FullPage.js +120 -93
  68. package/dist/esm/components/full-page/PlotAlert.js +39 -0
  69. package/dist/esm/components/full-page/PlotTypeSelector.js +90 -45
  70. package/dist/esm/components/heatmap/Heatmap.js +75 -74
  71. package/dist/esm/components/heatmap/HeatmapControls.js +8 -4
  72. package/dist/esm/components/icons/DotPlotIcon.js +58 -0
  73. package/dist/esm/components/icons/HeatmapIcon.js +39 -0
  74. package/dist/esm/components/icons/MatrixPlotIcon.1.js +51 -0
  75. package/dist/esm/components/icons/MatrixPlotIcon.js +53 -0
  76. package/dist/esm/components/icons/ScatterplotIcon.1.js +158 -0
  77. package/dist/esm/components/icons/ScatterplotIcon.js +138 -0
  78. package/dist/esm/components/icons/ViolinPlotIcon.js +36 -0
  79. package/dist/esm/components/matrixplot/Matrixplot.js +75 -75
  80. package/dist/esm/components/matrixplot/MatrixplotControls.js +10 -6
  81. package/dist/esm/components/obs-list/ObsItem.js +273 -222
  82. package/dist/esm/components/obs-list/ObsList.js +176 -147
  83. package/dist/esm/components/obs-list/ObsToolbar.js +3 -3
  84. package/dist/esm/components/obsm-list/ObsmList.js +60 -44
  85. package/dist/esm/components/offcanvas/index.js +67 -37
  86. package/dist/esm/components/pseudospatial/Pseudospatial.js +145 -88
  87. package/dist/esm/components/pseudospatial/PseudospatialToolbar.js +127 -78
  88. package/dist/esm/components/scatterplot/Scatterplot.js +148 -119
  89. package/dist/esm/components/scatterplot/ScatterplotControls.js +50 -35
  90. package/dist/esm/components/scatterplot/SpatialControls.js +153 -125
  91. package/dist/esm/components/scatterplot/Toolbox.js +44 -32
  92. package/dist/esm/components/search-bar/SearchBar.js +180 -132
  93. package/dist/esm/components/search-bar/SearchInfo.js +86 -59
  94. package/dist/esm/components/search-bar/SearchResults.js +100 -77
  95. package/dist/esm/components/toolbar/Toolbar.js +49 -39
  96. package/dist/esm/components/var-list/VarItem.js +126 -98
  97. package/dist/esm/components/var-list/VarList.js +99 -82
  98. package/dist/esm/components/var-list/VarListToolbar.js +64 -58
  99. package/dist/esm/components/var-list/VarSet.js +134 -115
  100. package/dist/esm/components/violin/Violin.js +121 -118
  101. package/dist/esm/components/violin/ViolinControls.js +10 -6
  102. package/dist/esm/constants/colorscales.js +19 -19
  103. package/dist/esm/constants/constants.js +47 -47
  104. package/dist/esm/context/DatasetContext.js +31 -22
  105. package/dist/esm/context/FilterContext.js +11 -8
  106. package/dist/esm/context/SettingsContext.js +257 -90
  107. package/dist/esm/context/ZarrDataContext.js +8 -6
  108. package/dist/esm/helpers/color-helper.js +5 -5
  109. package/dist/esm/helpers/map-helper.js +2 -2
  110. package/dist/esm/helpers/zarr-helper.js +6 -6
  111. package/dist/esm/index.js +22 -22
  112. package/dist/esm/utils/Filter.js +22 -17
  113. package/dist/esm/utils/Histogram.js +39 -37
  114. package/dist/esm/utils/ImageViewer.js +12 -8
  115. package/dist/esm/utils/Legend.js +44 -36
  116. package/dist/esm/utils/LoadingIndicators.js +16 -13
  117. package/dist/esm/utils/Resolver.js +201 -0
  118. package/dist/esm/utils/Skeleton.js +11 -10
  119. package/dist/esm/utils/StyledTooltip.js +38 -0
  120. package/dist/esm/utils/VirtualizedList.js +35 -27
  121. package/dist/esm/utils/errors.js +15 -15
  122. package/dist/esm/utils/requests.js +24 -12
  123. package/dist/esm/utils/search.js +7 -7
  124. package/dist/esm/utils/string.js +7 -7
  125. package/dist/esm/utils/zarrData.js +27 -28
  126. package/package.json +21 -9
  127. package/scss/cherita-bootstrap.scss +2 -2
  128. package/scss/cherita.scss +43 -17
  129. package/scss/components/accordions.scss +4 -1
  130. package/scss/components/layouts.scss +15 -33
  131. package/scss/components/lists.scss +8 -4
  132. package/scss/components/plotly.scss +38 -26
  133. package/scss/components/plots.scss +14 -1
  134. package/dist/assets/images/plots/dotplot.svg +0 -152
  135. package/dist/assets/images/plots/heatmap.svg +0 -193
  136. package/dist/assets/images/plots/matrixplot.svg +0 -275
  137. package/dist/assets/images/plots/scatterplot.svg +0 -198
  138. package/dist/assets/images/plots/violin.svg +0 -50
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.VarSet = VarSet;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
8
  var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
9
  var _reactFontawesome = require("@fortawesome/react-fontawesome");
10
10
  var _lodash = _interopRequireDefault(require("lodash"));
@@ -13,13 +13,12 @@ var _VarItem = require("./VarItem");
13
13
  var _constants = require("../../constants/constants");
14
14
  var _SettingsContext = require("../../context/SettingsContext");
15
15
  var _SearchBar = require("../search-bar/SearchBar");
16
+ var _jsxRuntime = require("react/jsx-runtime");
16
17
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
17
- 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); }
18
18
  // @TODO: add button to score genes and plot
19
-
20
19
  const addVarToSet = (dispatch, set, v) => {
21
20
  dispatch({
22
- type: "add.varSet.var",
21
+ type: 'add.varSet.var',
23
22
  varSet: set,
24
23
  var: v
25
24
  });
@@ -35,100 +34,119 @@ function SelectionSet(_ref) {
35
34
  } = _ref;
36
35
  const [openSet, setOpenSet] = (0, _react.useState)(false);
37
36
  const [showModal, setShowModal] = (0, _react.useState)(false);
38
- const [searchText, setSearchText] = (0, _react.useState)("");
37
+ const [searchText, setSearchText] = (0, _react.useState)('');
39
38
  const varList = set.vars.length ? _lodash.default.map(set.vars, v => {
40
- return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, {
41
- key: v.name
42
- }, /*#__PURE__*/_react.default.createElement(_VarItem.SelectionItem, {
43
- item: v,
44
- showSetColorEncoding: false,
45
- removeVar: () => removeSetVar(v)
46
- }));
47
- }) : /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup.Item, null, /*#__PURE__*/_react.default.createElement("div", {
48
- className: "text-muted"
49
- }, "No features in this set"));
50
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement("div", {
51
- className: "d-flex justify-content-between cursor-pointer",
52
- onClick: () => {
53
- setOpenSet(o => !o);
54
- }
55
- }, /*#__PURE__*/_react.default.createElement("div", {
56
- className: "d-flex justify-content-between align-items-center w-100"
57
- }, /*#__PURE__*/_react.default.createElement("div", {
58
- className: "ellipsis-text",
59
- title: set.name
60
- }, set.name), /*#__PURE__*/_react.default.createElement("div", {
61
- className: "d-flex align-items-center gap-1"
62
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
63
- placement: "top",
64
- overlay: /*#__PURE__*/_react.default.createElement(_reactBootstrap.Tooltip, null, "This set represents the mean value of its features")
65
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
66
- icon: _freeSolidSvgIcons.faCircleInfo
67
- })), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
68
- type: "button",
69
- variant: "outline-primary",
70
- className: "m-0 p-0 px-1",
71
- disabled: !set.vars.length,
72
- title: "Open set"
73
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
74
- icon: openSet ? _freeSolidSvgIcons.faChevronUp : _freeSolidSvgIcons.faChevronDown
75
- })), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
76
- type: "button",
77
- variant: "outline-primary",
78
- className: "m-0 p-0 px-1",
79
- onClick: e => {
80
- e.stopPropagation();
81
- setShowModal(true);
82
- },
83
- title: "Add to set"
84
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
85
- icon: _freeSolidSvgIcons.faPlus
86
- })), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
87
- type: "button",
88
- variant: isActive ? "primary" : "outline-primary",
89
- className: "m-0 p-0 px-1",
90
- onClick: e => {
91
- e.stopPropagation();
92
- selectSet();
93
- },
94
- disabled: !set.vars.length,
95
- title: "Set as color encoding"
96
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
97
- icon: _freeSolidSvgIcons.faDroplet
98
- }), isMultiple && /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
99
- icon: _freeSolidSvgIcons.faPlus,
100
- size: "xs",
101
- className: "ps-xs-1"
102
- })), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
103
- type: "button",
104
- className: "m-0 p-0 px-1",
105
- variant: "outline-secondary",
106
- title: "Remove from list",
107
- onClick: e => {
108
- e.stopPropagation();
109
- removeSet();
110
- }
111
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
112
- icon: _freeSolidSvgIcons.faTrash
113
- }))))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Collapse, {
114
- in: openSet
115
- }, /*#__PURE__*/_react.default.createElement("div", {
116
- className: "mt-2"
117
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ListGroup, {
118
- variant: "flush",
119
- className: "cherita-list var-set-list"
120
- }, varList))), /*#__PURE__*/_react.default.createElement(_SearchBar.SearchModal, {
121
- show: showModal,
122
- handleClose: () => setShowModal(false),
123
- text: searchText,
124
- setText: setSearchText,
125
- displayText: "features",
126
- handleSelect: (d, i) => {
127
- addVarToSet(d, set, i);
128
- },
129
- searchVar: true,
130
- searchDiseases: false
131
- }));
39
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
40
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_VarItem.SelectionItem, {
41
+ item: v,
42
+ showSetColorEncoding: false,
43
+ removeVar: () => removeSetVar(v)
44
+ })
45
+ }, v.name);
46
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup.Item, {
47
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
48
+ className: "text-muted",
49
+ children: "No features in this set"
50
+ })
51
+ });
52
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
53
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
54
+ className: "d-flex justify-content-between cursor-pointer",
55
+ onClick: () => {
56
+ setOpenSet(o => !o);
57
+ },
58
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
59
+ className: "d-flex justify-content-between align-items-center w-100",
60
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
61
+ className: "ellipsis-text",
62
+ title: set.name,
63
+ children: set.name
64
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
65
+ className: "d-flex align-items-center gap-1",
66
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.OverlayTrigger, {
67
+ placement: "top",
68
+ overlay: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Tooltip, {
69
+ children: "This set represents the mean value of its features"
70
+ }),
71
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
72
+ icon: _freeSolidSvgIcons.faCircleInfo
73
+ })
74
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
75
+ type: "button",
76
+ variant: "outline-primary",
77
+ className: "m-0 p-0 px-1",
78
+ disabled: !set.vars.length,
79
+ title: "Open set",
80
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
81
+ icon: openSet ? _freeSolidSvgIcons.faChevronUp : _freeSolidSvgIcons.faChevronDown
82
+ })
83
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
84
+ type: "button",
85
+ variant: "outline-primary",
86
+ className: "m-0 p-0 px-1",
87
+ onClick: e => {
88
+ e.stopPropagation();
89
+ setShowModal(true);
90
+ },
91
+ title: "Add to set",
92
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
93
+ icon: _freeSolidSvgIcons.faPlus
94
+ })
95
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Button, {
96
+ type: "button",
97
+ variant: isActive ? 'primary' : 'outline-primary',
98
+ className: "m-0 p-0 px-1",
99
+ onClick: e => {
100
+ e.stopPropagation();
101
+ selectSet();
102
+ },
103
+ disabled: !set.vars.length,
104
+ title: "Set as color encoding",
105
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
106
+ icon: _freeSolidSvgIcons.faDroplet
107
+ }), isMultiple && /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
108
+ icon: _freeSolidSvgIcons.faPlus,
109
+ size: "xs",
110
+ className: "ps-xs-1"
111
+ })]
112
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
113
+ type: "button",
114
+ className: "m-0 p-0 px-1",
115
+ variant: "outline-secondary",
116
+ title: "Remove from list",
117
+ onClick: e => {
118
+ e.stopPropagation();
119
+ removeSet();
120
+ },
121
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
122
+ icon: _freeSolidSvgIcons.faTrash
123
+ })
124
+ })]
125
+ })]
126
+ })
127
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Collapse, {
128
+ in: openSet,
129
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
130
+ className: "mt-2",
131
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.ListGroup, {
132
+ variant: "flush",
133
+ className: "cherita-list var-set-list",
134
+ children: varList
135
+ })
136
+ })
137
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_SearchBar.SearchModal, {
138
+ show: showModal,
139
+ handleClose: () => setShowModal(false),
140
+ text: searchText,
141
+ setText: setSearchText,
142
+ displayText: 'features',
143
+ handleSelect: (d, i) => {
144
+ addVarToSet(d, set, i);
145
+ },
146
+ searchVar: true,
147
+ searchDiseases: false
148
+ })]
149
+ });
132
150
  }
133
151
  function VarSet(_ref2) {
134
152
  let {
@@ -141,16 +159,16 @@ function VarSet(_ref2) {
141
159
  const selectSet = () => {
142
160
  if (mode === _constants.SELECTION_MODES.SINGLE) {
143
161
  dispatch({
144
- type: "select.var",
162
+ type: 'select.var',
145
163
  var: set
146
164
  });
147
165
  dispatch({
148
- type: "set.colorEncoding",
149
- value: "var"
166
+ type: 'set.colorEncoding',
167
+ value: 'var'
150
168
  });
151
169
  } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
152
170
  dispatch({
153
- type: "select.multivar",
171
+ type: 'select.multivar',
154
172
  var: set
155
173
  });
156
174
  }
@@ -159,37 +177,37 @@ function VarSet(_ref2) {
159
177
  if (mode === _constants.SELECTION_MODES.SINGLE) {
160
178
  if (active === set.name) {
161
179
  dispatch({
162
- type: "reset.var"
180
+ type: 'reset.var'
163
181
  });
164
182
  }
165
183
  } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
166
184
  if (active.includes(set.name)) {
167
185
  dispatch({
168
- type: "deselect.multivar",
186
+ type: 'deselect.multivar',
169
187
  var: set
170
188
  });
171
189
  }
172
190
  }
173
191
  dispatch({
174
- type: "remove.var",
192
+ type: 'remove.var',
175
193
  var: set
176
194
  });
177
195
  };
178
196
  const removeSetVar = v => {
179
197
  dispatch({
180
- type: "remove.varSet.var",
198
+ type: 'remove.varSet.var',
181
199
  varSet: set,
182
200
  var: v
183
201
  });
184
202
  };
185
203
  const toggleSet = () => {
186
204
  dispatch({
187
- type: "toggle.multivar",
205
+ type: 'toggle.multivar',
188
206
  var: set
189
207
  });
190
208
  };
191
209
  if (set && mode === _constants.SELECTION_MODES.SINGLE) {
192
- return /*#__PURE__*/_react.default.createElement(SelectionSet, {
210
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(SelectionSet, {
193
211
  set: set,
194
212
  isActive: settings.colorEncoding === _constants.COLOR_ENCODINGS.VAR && active === set.name,
195
213
  selectSet: selectSet,
@@ -197,7 +215,7 @@ function VarSet(_ref2) {
197
215
  removeSetVar: v => removeSetVar(v)
198
216
  });
199
217
  } else if (mode === _constants.SELECTION_MODES.MULTIPLE) {
200
- return /*#__PURE__*/_react.default.createElement(SelectionSet, {
218
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(SelectionSet, {
201
219
  set: set,
202
220
  isActive: _lodash.default.includes(active, set.name),
203
221
  selectSet: toggleSet,
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.Violin = Violin;
7
- var _react = _interopRequireWildcard(require("react"));
7
+ var _react = require("react");
8
8
  var _freeSolidSvgIcons = require("@fortawesome/free-solid-svg-icons");
9
9
  var _reactFontawesome = require("@fortawesome/react-fontawesome");
10
10
  var _lodash = _interopRequireDefault(require("lodash"));
@@ -16,16 +16,18 @@ var _FilterContext = require("../../context/FilterContext");
16
16
  var _SettingsContext = require("../../context/SettingsContext");
17
17
  var _LoadingIndicators = require("../../utils/LoadingIndicators");
18
18
  var _requests = require("../../utils/requests");
19
+ var _Resolver = require("../../utils/Resolver");
20
+ var _StyledTooltip = require("../../utils/StyledTooltip");
21
+ var _PlotAlert = require("../full-page/PlotAlert");
19
22
  var _Toolbar = require("../toolbar/Toolbar");
23
+ var _jsxRuntime = require("react/jsx-runtime");
20
24
  function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
21
- 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); }
22
25
  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; }
23
26
  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; }
24
27
  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; }
25
28
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
26
29
  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); }
27
30
  function Violin(_ref) {
28
- var _settings$selectedVar, _settings$selectedVar2, _settings$selectedVar3, _settings$selectedVar4, _settings$selectedObs, _settings$selectedObs2, _settings$selectedObs3;
29
31
  let {
30
32
  mode = _constants.VIOLIN_MODES.MULTIKEY,
31
33
  showObsBtn = false,
@@ -33,9 +35,11 @@ function Violin(_ref) {
33
35
  showCtrlsBtn = false,
34
36
  setShowObs,
35
37
  setShowVars,
36
- setShowControls
38
+ setShowControls,
39
+ plotType,
40
+ setPlotType
37
41
  } = _ref;
38
- const ENDPOINT = "violin";
42
+ const ENDPOINT = 'violin';
39
43
  const dataset = (0, _DatasetContext.useDataset)();
40
44
  const settings = (0, _SettingsContext.useSettings)();
41
45
  const {
@@ -45,91 +49,63 @@ function Violin(_ref) {
45
49
  const [data, setData] = (0, _react.useState)([]);
46
50
  const [layout, setLayout] = (0, _react.useState)({});
47
51
  const [hasSelections, setHasSelections] = (0, _react.useState)(false);
48
- const [params, setParams] = (0, _react.useState)(_objectSpread({
52
+ const selectedMultiVar = (0, _Resolver.useSelectedMultiVar)();
53
+ const selectedVar = (0, _Resolver.useSelectedVar)();
54
+ const selectedObs = (0, _Resolver.useSelectedObs)();
55
+ const params = (0, _react.useMemo)(() => _objectSpread({
49
56
  url: dataset.url,
50
57
  mode: mode,
51
58
  scale: settings.controls.scale.violinplot,
52
59
  varNamesCol: dataset.varNamesCol
53
60
  }, {
54
61
  [_constants.VIOLIN_MODES.MULTIKEY]: {
55
- varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
62
+ varKeys: selectedMultiVar.map(i => i.isSet ? {
56
63
  name: i.name,
57
64
  indices: i.vars.map(v => v.index)
58
65
  } : i.index),
59
66
  obsKeys: [] // @TODO: implement
60
67
  },
61
68
  [_constants.VIOLIN_MODES.GROUPBY]: {
62
- varKey: (_settings$selectedVar = settings.selectedVar) !== null && _settings$selectedVar !== void 0 && _settings$selectedVar.isSet ? {
63
- name: (_settings$selectedVar2 = settings.selectedVar) === null || _settings$selectedVar2 === void 0 ? void 0 : _settings$selectedVar2.name,
64
- indices: (_settings$selectedVar3 = settings.selectedVar) === null || _settings$selectedVar3 === void 0 ? void 0 : _settings$selectedVar3.vars.map(v => v.index)
65
- } : (_settings$selectedVar4 = settings.selectedVar) === null || _settings$selectedVar4 === void 0 ? void 0 : _settings$selectedVar4.index,
66
- obsCol: settings.selectedObs,
67
- obsValues: !((_settings$selectedObs = settings.selectedObs) !== null && _settings$selectedObs !== void 0 && _settings$selectedObs.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_settings$selectedObs2 = settings.selectedObs) === null || _settings$selectedObs2 === void 0 ? void 0 : _settings$selectedObs2.codes), (_settings$selectedObs3 = settings.selectedObs) === null || _settings$selectedObs3 === void 0 ? void 0 : _settings$selectedObs3.omit).map(c => {
68
- var _settings$selectedObs4;
69
- return (_settings$selectedObs4 = settings.selectedObs) === null || _settings$selectedObs4 === void 0 ? void 0 : _settings$selectedObs4.codesMap[c];
70
- }),
69
+ varKey: selectedVar !== null && selectedVar !== void 0 && selectedVar.isSet ? {
70
+ name: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name,
71
+ indices: selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars.map(v => v.index)
72
+ } : selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index,
73
+ obsCol: selectedObs,
74
+ obsValues: !(selectedObs !== null && selectedObs !== void 0 && selectedObs.omit.length) ? null : _lodash.default.difference(selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.values, selectedObs === null || selectedObs === void 0 ? void 0 : selectedObs.omit),
71
75
  obsIndices: isSliced ? [...(obsIndices || [])] : null
72
76
  }
73
- }[mode]));
77
+ }[mode]), [dataset.url, dataset.varNamesCol, isSliced, mode, obsIndices, selectedMultiVar, selectedObs, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.index, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.isSet, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.name, selectedVar === null || selectedVar === void 0 ? void 0 : selectedVar.vars, settings.controls.scale.violinplot]);
74
78
  // @TODO: set default scale
75
79
 
76
80
  (0, _react.useEffect)(() => {
77
81
  if (mode === _constants.VIOLIN_MODES.MULTIKEY) {
78
- if (settings.selectedMultiVar.length) {
82
+ if (selectedMultiVar.length) {
79
83
  setHasSelections(true);
80
84
  } else {
81
85
  setHasSelections(false);
82
86
  }
83
- setParams(p => {
84
- return _objectSpread(_objectSpread({}, p), {}, {
85
- url: dataset.url,
86
- mode: mode,
87
- varKeys: settings.selectedMultiVar.map(i => i.isSet ? {
88
- name: i.name,
89
- indices: i.vars.map(v => v.index)
90
- } : i.index),
91
- scale: settings.controls.scale.violinplot,
92
- varNamesCol: dataset.varNamesCol
93
- });
94
- });
95
87
  } else if (mode === _constants.VIOLIN_MODES.GROUPBY) {
96
- if (settings.selectedObs && settings.selectedVar) {
88
+ if (selectedObs && selectedVar) {
97
89
  setHasSelections(true);
98
90
  } else {
99
91
  setHasSelections(false);
100
92
  }
101
- setParams(p => {
102
- var _settings$selectedVar5, _settings$selectedVar6, _settings$selectedVar7, _settings$selectedVar8, _settings$selectedObs5, _settings$selectedObs6, _settings$selectedObs7;
103
- return _objectSpread(_objectSpread({}, p), {}, {
104
- url: dataset.url,
105
- mode: mode,
106
- varKey: (_settings$selectedVar5 = settings.selectedVar) !== null && _settings$selectedVar5 !== void 0 && _settings$selectedVar5.isSet ? {
107
- name: (_settings$selectedVar6 = settings.selectedVar) === null || _settings$selectedVar6 === void 0 ? void 0 : _settings$selectedVar6.name,
108
- indices: (_settings$selectedVar7 = settings.selectedVar) === null || _settings$selectedVar7 === void 0 ? void 0 : _settings$selectedVar7.vars.map(v => v.index)
109
- } : (_settings$selectedVar8 = settings.selectedVar) === null || _settings$selectedVar8 === void 0 ? void 0 : _settings$selectedVar8.index,
110
- obsCol: settings.selectedObs,
111
- obsValues: !((_settings$selectedObs5 = settings.selectedObs) !== null && _settings$selectedObs5 !== void 0 && _settings$selectedObs5.omit.length) ? null : _lodash.default.difference(_lodash.default.values((_settings$selectedObs6 = settings.selectedObs) === null || _settings$selectedObs6 === void 0 ? void 0 : _settings$selectedObs6.codes), (_settings$selectedObs7 = settings.selectedObs) === null || _settings$selectedObs7 === void 0 ? void 0 : _settings$selectedObs7.omit).map(c => {
112
- var _settings$selectedObs8;
113
- return (_settings$selectedObs8 = settings.selectedObs) === null || _settings$selectedObs8 === void 0 ? void 0 : _settings$selectedObs8.codesMap[c];
114
- }),
115
- obsIndices: isSliced ? [...(obsIndices || [])] : null,
116
- scale: settings.controls.scale.violinplot,
117
- varNamesCol: dataset.varNamesCol
118
- });
119
- });
120
93
  }
121
- }, [settings.controls.scale.violinplot, settings.selectedMultiVar, settings.selectedObs, settings.selectedVar, dataset.url, dataset.varNamesCol, obsIndices, isSliced, mode]);
94
+ }, [settings.controls.scale.violinplot, selectedMultiVar, selectedObs, selectedVar, dataset.url, dataset.varNamesCol, obsIndices, isSliced, mode]);
122
95
  const {
123
96
  fetchedData,
124
97
  isPending,
125
98
  serverError
126
99
  } = (0, _requests.useDebouncedFetch)(ENDPOINT, params, 500, {
127
- enabled: mode === _constants.VIOLIN_MODES.MULTIKEY && (!!params.varKeys.length || !!params.obsKeys.length) || mode === _constants.VIOLIN_MODES.GROUPBY && !!params.varKey && !!params.obsCol
100
+ isEnabled: mode === _constants.VIOLIN_MODES.MULTIKEY && (params => !!params.varKeys.length || !!params.obsKeys.length) || mode === _constants.VIOLIN_MODES.GROUPBY && (params => !!params.varKey && !!params.obsCol)
128
101
  });
129
102
  (0, _react.useEffect)(() => {
130
- if (hasSelections && !isPending && !serverError) {
103
+ if (hasSelections && !!fetchedData && !isPending && !serverError) {
131
104
  setData(fetchedData.data);
132
105
  setLayout(fetchedData.layout);
106
+ } else {
107
+ setData([]);
108
+ setLayout({});
133
109
  }
134
110
  }, [fetchedData, hasSelections, isPending, serverError]);
135
111
  const customModeBarButtons = _lodash.default.compact([showObsBtn && (0, _Toolbar.ObsPlotlyToolbar)({
@@ -142,61 +118,87 @@ function Violin(_ref) {
142
118
  const modeBarButtons = customModeBarButtons.length ? [customModeBarButtons, _constants.PLOTLY_MODEBAR_BUTTONS] : [_constants.PLOTLY_MODEBAR_BUTTONS];
143
119
  if (!serverError) {
144
120
  if (hasSelections) {
145
- return /*#__PURE__*/_react.default.createElement("div", {
146
- className: "cherita-plot cherita-violin"
147
- }, isPending && /*#__PURE__*/_react.default.createElement(_LoadingIndicators.LoadingSpinner, null), /*#__PURE__*/_react.default.createElement("div", {
148
- className: "d-flex flex-column h-100"
149
- }, /*#__PURE__*/_react.default.createElement("div", {
150
- className: "flex-grow-1 position-relative",
151
- style: {
152
- minHeight: "0"
153
- }
154
- }, /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
155
- data: data,
156
- layout: layout,
157
- useResizeHandler: true,
158
- style: {
159
- width: "100%",
160
- height: "100%"
161
- },
162
- config: {
163
- displaylogo: false,
164
- modeBarButtons: modeBarButtons
165
- }
166
- })), (fetchedData === null || fetchedData === void 0 ? void 0 : fetchedData.resampled) && /*#__PURE__*/_react.default.createElement("div", {
167
- className: "flex-shrink-0"
168
- }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
169
- variant: "warning",
170
- className: "mb-1"
171
- }, /*#__PURE__*/_react.default.createElement("b", null, "Warning:"), " For performance reasons this plot was generated with resampled data. It will not be exactly the same as one produced with the entire dataset. \xA0", /*#__PURE__*/_react.default.createElement(_reactBootstrap.OverlayTrigger, {
172
- placement: "top",
173
- overlay: /*#__PURE__*/_react.default.createElement(_reactBootstrap.Tooltip, null, "Resampled to 100K values following a Monte Carlo style approach to help ensure resampled data is a good representation of the original dataset's distribution.")
174
- }, /*#__PURE__*/_react.default.createElement(_reactFontawesome.FontAwesomeIcon, {
175
- icon: _freeSolidSvgIcons.faCircleInfo
176
- }))))));
121
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
122
+ className: "cherita-plot cherita-violin",
123
+ children: [isPending && /*#__PURE__*/(0, _jsxRuntime.jsx)(_LoadingIndicators.LoadingSpinner, {}), /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
124
+ className: "d-flex flex-column h-100",
125
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
126
+ className: "flex-grow-1 position-relative",
127
+ style: {
128
+ minHeight: '0'
129
+ },
130
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactPlotly.default, {
131
+ data: data,
132
+ layout: layout,
133
+ useResizeHandler: true,
134
+ style: {
135
+ width: '100%',
136
+ height: '100%'
137
+ },
138
+ config: {
139
+ displaylogo: false,
140
+ modeBarButtons: modeBarButtons
141
+ }
142
+ })
143
+ }), (fetchedData === null || fetchedData === void 0 ? void 0 : fetchedData.resampled) && /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
144
+ className: "resampled-tooltip-container",
145
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_StyledTooltip.StyledTooltip, {
146
+ title: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
147
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("strong", {
148
+ children: "Note:"
149
+ }), " This plot uses resampled data to improve performance, so values may differ slightly from the full dataset. The data were resampled to exactly 100,000 values using a Monte Carlo\u2013style approach to provide a representative view of the full distribution while reducing processing time."]
150
+ }),
151
+ placement: "bottom",
152
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_reactBootstrap.Badge, {
153
+ bg: "info",
154
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_reactFontawesome.FontAwesomeIcon, {
155
+ className: "fs-6",
156
+ icon: _freeSolidSvgIcons.faCircleInfo
157
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
158
+ className: "d-none d-lg-inline ms-2 fs-6 text-uppercase",
159
+ children: "Resampled"
160
+ })]
161
+ })
162
+ })
163
+ })]
164
+ })]
165
+ });
177
166
  }
178
- return /*#__PURE__*/_react.default.createElement("div", {
179
- className: "cherita-violin"
180
- }, mode === _constants.VIOLIN_MODES.MULTIKEY && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
181
- variant: "light"
182
- }, "Select", " ", showVarsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
183
- variant: "link",
184
- className: "border-0 p-0 align-baseline",
185
- onClick: setShowVars
186
- }, "features") : "features"), mode === _constants.VIOLIN_MODES.GROUPBY && /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
187
- variant: "light"
188
- }, "Select", " ", showObsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
189
- variant: "link",
190
- className: "border-0 p-0 align-baseline",
191
- onClick: setShowObs
192
- }, "categories") : "categories", " ", "and a", " ", showVarsBtn ? /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
193
- variant: "link",
194
- className: "border-0 p-0 align-baseline",
195
- onClick: setShowVars
196
- }, "feature") : "feature"));
167
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_PlotAlert.PlotAlert, {
168
+ variant: "info",
169
+ heading: "Set up your violin plot",
170
+ plotType: plotType,
171
+ setPlotType: setPlotType,
172
+ children: [mode === _constants.VIOLIN_MODES.MULTIKEY && /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
173
+ className: "p-0 m-0",
174
+ children: ["Select one or more", ' ', showVarsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
175
+ variant: "link",
176
+ className: "border-0 p-0 align-baseline",
177
+ onClick: setShowVars,
178
+ children: "features"
179
+ }) : 'features', ' ', "to display their expression distributions across all observations."]
180
+ }), mode === _constants.VIOLIN_MODES.GROUPBY && /*#__PURE__*/(0, _jsxRuntime.jsxs)("p", {
181
+ className: "p-0 m-0",
182
+ children: ["Select a", ' ', showObsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
183
+ variant: "link",
184
+ className: "border-0 p-0 align-baseline",
185
+ onClick: setShowObs,
186
+ children: "category"
187
+ }) : 'category', ' ', "to group observations, and choose a", ' ', showVarsBtn ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Button, {
188
+ variant: "link",
189
+ className: "border-0 p-0 align-baseline",
190
+ onClick: setShowVars,
191
+ children: "feature"
192
+ }) : 'feature', ' ', "to view its distribution within each group."]
193
+ })]
194
+ });
197
195
  } else {
198
- return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Alert, {
199
- variant: "danger"
200
- }, serverError.message));
196
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_PlotAlert.PlotAlert, {
197
+ variant: "danger",
198
+ heading: "Error displaying the violin plot",
199
+ plotType: plotType,
200
+ setPlotType: setPlotType,
201
+ children: serverError.message || 'An unexpected error occurred while generating the plot.'
202
+ });
201
203
  }
202
204
  }
@@ -4,12 +4,15 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.ViolinControls = ViolinControls;
7
- var _react = _interopRequireDefault(require("react"));
8
7
  var _reactBootstrap = require("react-bootstrap");
9
8
  var _Controls = require("../controls/Controls");
10
- function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
9
+ var _jsxRuntime = require("react/jsx-runtime");
11
10
  function ViolinControls() {
12
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form, null, /*#__PURE__*/_react.default.createElement(_Controls.ScaleSelect, {
13
- plot: "violinplot"
14
- })));
11
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_jsxRuntime.Fragment, {
12
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.Form, {
13
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Controls.ScaleSelect, {
14
+ plot: "violinplot"
15
+ })
16
+ })
17
+ });
15
18
  }