@haniffalab/cherita-react 0.1.8 → 0.1.9

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.
@@ -12,6 +12,7 @@ var _react = _interopRequireWildcard(require("react"));
12
12
  var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
13
13
  var _DatasetContext = require("../context/DatasetContext");
14
14
  var _constants = require("../constants/constants");
15
+ var _reactBootstrap = require("react-bootstrap");
15
16
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
16
17
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
17
18
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
@@ -26,20 +27,52 @@ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o =
26
27
  function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
27
28
  function _iterableToArrayLimit(arr, i) { var _i = null == arr ? null : "undefined" != typeof Symbol && arr[Symbol.iterator] || arr["@@iterator"]; if (null != _i) { var _s, _e, _x, _r, _arr = [], _n = !0, _d = !1; try { if (_x = (_i = _i.call(arr)).next, 0 === i) { if (Object(_i) !== _i) return; _n = !1; } else for (; !(_n = (_s = _x.call(_i)).done) && (_arr.push(_s.value), _arr.length !== i); _n = !0); } catch (err) { _d = !0, _e = err; } finally { try { if (!_n && null != _i.return && (_r = _i.return(), Object(_r) !== _r)) return; } finally { if (_d) throw _e; } } return _arr; } }
28
29
  function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
29
- function DotplotControls() {
30
+ function DotplotControls(_ref) {
31
+ var scaleRange = _ref.scaleRange,
32
+ expressionCutoff = _ref.expressionCutoff,
33
+ meanOnlyExpressed = _ref.meanOnlyExpressed,
34
+ dataRange = _ref.dataRange,
35
+ setScaleRange = _ref.setScaleRange,
36
+ setExpressionCutoff = _ref.setExpressionCutoff,
37
+ setMeanOnlyExpressed = _ref.setMeanOnlyExpressed,
38
+ setStandardScale = _ref.setStandardScale;
30
39
  var dataset = (0, _DatasetContext.useDataset)();
31
40
  var dispatch = (0, _DatasetContext.useDatasetDispatch)();
32
41
  var _useState = (0, _react.useState)(dataset.colorscale),
33
42
  _useState2 = _slicedToArray(_useState, 2),
34
- active = _useState2[0],
35
- setActive = _useState2[1];
43
+ activeColorscale = _useState2[0],
44
+ setActiveColorscale = _useState2[1];
45
+ var _useState3 = (0, _react.useState)("None"),
46
+ _useState4 = _slicedToArray(_useState3, 2),
47
+ activeStandardScale = _useState4[0],
48
+ setActiveStandardScale = _useState4[1];
49
+ var _useState5 = (0, _react.useState)(expressionCutoff),
50
+ _useState6 = _slicedToArray(_useState5, 2),
51
+ cutoff = _useState6[0],
52
+ setCutoff = _useState6[1];
53
+ var scaleMinRef = (0, _react.useRef)(null);
54
+ var scaleMaxRef = (0, _react.useRef)(null);
55
+ var standardScaleOptions = [{
56
+ value: null,
57
+ name: "None"
58
+ }, {
59
+ value: "group",
60
+ name: "Group"
61
+ }, {
62
+ value: "var",
63
+ name: "Var"
64
+ }];
36
65
  (0, _react.useEffect)(function () {
37
- setActive(dataset.colorscale);
66
+ setActiveColorscale(dataset.colorscale);
38
67
  }, [dataset.colorscale]);
68
+ (0, _react.useEffect)(function () {
69
+ scaleMinRef.current.value = scaleRange.min;
70
+ scaleMaxRef.current.value = scaleRange.max;
71
+ }, [scaleRange]);
39
72
  var colormapList = _constants.PLOTLY_COLORSCALES.map(function (item) {
40
73
  return /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
41
74
  key: item,
42
- active: active === item,
75
+ active: activeColorscale === item,
43
76
  onClick: function onClick() {
44
77
  dispatch({
45
78
  type: "colorscaleSelected",
@@ -48,26 +81,137 @@ function DotplotControls() {
48
81
  }
49
82
  }, item);
50
83
  });
51
- return /*#__PURE__*/_react.default.createElement(_Dropdown.default, null, /*#__PURE__*/_react.default.createElement(_Dropdown.default.Toggle, {
84
+ var standardScaleList = standardScaleOptions.map(function (item) {
85
+ return /*#__PURE__*/_react.default.createElement(_Dropdown.default.Item, {
86
+ key: item.value,
87
+ active: activeStandardScale === item.name,
88
+ onClick: function onClick() {
89
+ setActiveStandardScale(item.name);
90
+ setStandardScale(item.value);
91
+ }
92
+ }, item.name);
93
+ });
94
+ return /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonToolbar, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(_Dropdown.default, null, /*#__PURE__*/_react.default.createElement(_Dropdown.default.Toggle, {
52
95
  id: "dropdownColorscale",
53
96
  variant: "light"
54
- }, dataset.colorscale), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Menu, null, colormapList));
97
+ }, dataset.colorscale), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Menu, null, colormapList))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup.Text, null, "Standard scale"), /*#__PURE__*/_react.default.createElement(_Dropdown.default, null, /*#__PURE__*/_react.default.createElement(_Dropdown.default.Toggle, {
98
+ id: "dropdownStandardScale",
99
+ variant: "light"
100
+ }, activeStandardScale), /*#__PURE__*/_react.default.createElement(_Dropdown.default.Menu, null, standardScaleList)))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.ButtonGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.ToggleButton, {
101
+ id: "toggleMeanOnlyExpressed",
102
+ type: "checkbox",
103
+ variant: "outline-primary",
104
+ checked: meanOnlyExpressed,
105
+ onChange: function onChange() {
106
+ setMeanOnlyExpressed(function (c) {
107
+ return !c;
108
+ });
109
+ }
110
+ }, "Average only above cutoff")), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form, {
111
+ onSubmit: function onSubmit(e) {
112
+ e.preventDefault();
113
+ setExpressionCutoff(parseFloat(cutoff));
114
+ }
115
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup.Text, null, "Expression Cutoff"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Control, {
116
+ size: "sm",
117
+ type: "number",
118
+ step: "0.1",
119
+ min: 0.0,
120
+ value: cutoff,
121
+ onChange: function onChange(e) {
122
+ setCutoff(e.target.value);
123
+ }
124
+ }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
125
+ type: "submit",
126
+ variant: "outline-primary"
127
+ }, "Apply"))), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form, {
128
+ onSubmit: function onSubmit(e) {
129
+ e.preventDefault();
130
+ var formData = new FormData(e.target),
131
+ formDataObj = Object.fromEntries(formData.entries());
132
+ setScaleRange({
133
+ min: parseFloat(formDataObj.scaleMin),
134
+ max: parseFloat(formDataObj.scaleMax)
135
+ });
136
+ }
137
+ }, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup, null, /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup.Text, null, "Colorscale"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup.Text, null, "min"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Control, {
138
+ ref: scaleMinRef,
139
+ name: "scaleMin",
140
+ size: "sm",
141
+ type: "number",
142
+ step: "0.1",
143
+ min: 0.0,
144
+ max: scaleRange.max,
145
+ defaultValue: scaleRange.min
146
+ }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.InputGroup.Text, null, "max"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Form.Control, {
147
+ ref: scaleMaxRef,
148
+ name: "scaleMax",
149
+ size: "sm",
150
+ type: "number",
151
+ step: "0.1",
152
+ min: scaleRange.min,
153
+ max: dataRange.max,
154
+ defaultValue: scaleRange.max,
155
+ onChange: function onChange(e) {
156
+ if (parseFloat(e.target.value) > dataRange.max) {
157
+ e.target.value = dataRange.max.toFixed(1);
158
+ }
159
+ }
160
+ }), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
161
+ type: "submit",
162
+ variant: "outline-primary"
163
+ }, "Apply"), /*#__PURE__*/_react.default.createElement(_reactBootstrap.Button, {
164
+ variant: "outline-primary",
165
+ onClick: function onClick() {
166
+ var scale = {
167
+ min: 0.0,
168
+ max: dataRange.max.toFixed(1)
169
+ };
170
+ setScaleRange(scale);
171
+ }
172
+ }, "Autoscale"))));
55
173
  }
56
174
  function Dotplot() {
57
175
  var dataset = (0, _DatasetContext.useDataset)();
58
176
  var colorscale = (0, _react.useRef)(dataset.colorscale);
59
- var _useState3 = (0, _react.useState)([]),
60
- _useState4 = _slicedToArray(_useState3, 2),
61
- data = _useState4[0],
62
- setData = _useState4[1];
63
- var _useState5 = (0, _react.useState)({}),
64
- _useState6 = _slicedToArray(_useState5, 2),
65
- layout = _useState6[0],
66
- setLayout = _useState6[1];
67
- var _useState7 = (0, _react.useState)(false),
177
+ var _useState7 = (0, _react.useState)([]),
68
178
  _useState8 = _slicedToArray(_useState7, 2),
69
- hasSelections = _useState8[0],
70
- setHasSelections = _useState8[1];
179
+ data = _useState8[0],
180
+ setData = _useState8[1];
181
+ var _useState9 = (0, _react.useState)({}),
182
+ _useState10 = _slicedToArray(_useState9, 2),
183
+ layout = _useState10[0],
184
+ setLayout = _useState10[1];
185
+ var _useState11 = (0, _react.useState)(false),
186
+ _useState12 = _slicedToArray(_useState11, 2),
187
+ hasSelections = _useState12[0],
188
+ setHasSelections = _useState12[1];
189
+ var _useState13 = (0, _react.useState)(0.0),
190
+ _useState14 = _slicedToArray(_useState13, 2),
191
+ expressionCutoff = _useState14[0],
192
+ setExpressionCutoff = _useState14[1];
193
+ var _useState15 = (0, _react.useState)(false),
194
+ _useState16 = _slicedToArray(_useState15, 2),
195
+ meanOnlyExpressed = _useState16[0],
196
+ setMeanOnlyExpressed = _useState16[1];
197
+ var _useState17 = (0, _react.useState)(null),
198
+ _useState18 = _slicedToArray(_useState17, 2),
199
+ standardScale = _useState18[0],
200
+ setStandardScale = _useState18[1];
201
+ var _useState19 = (0, _react.useState)({
202
+ min: 0.0,
203
+ max: 0.0
204
+ }),
205
+ _useState20 = _slicedToArray(_useState19, 2),
206
+ dataRange = _useState20[0],
207
+ setDataRange = _useState20[1];
208
+ var _useState21 = (0, _react.useState)({
209
+ min: null,
210
+ max: null
211
+ }),
212
+ _useState22 = _slicedToArray(_useState21, 2),
213
+ scaleRange = _useState22[0],
214
+ setScaleRange = _useState22[1];
71
215
  var updateColorscale = (0, _react.useCallback)(function (colorscale) {
72
216
  setLayout(function (l) {
73
217
  return _objectSpread(_objectSpread({}, l), {}, {
@@ -78,6 +222,7 @@ function Dotplot() {
78
222
  });
79
223
  }, []);
80
224
  (0, _react.useEffect)(function () {
225
+ console.log("fetchdata");
81
226
  if (dataset.selectedObs && dataset.selectedMultiVar.length) {
82
227
  setHasSelections(true);
83
228
  fetch(new URL("dotplot", process.env.REACT_APP_API_URL), {
@@ -90,34 +235,62 @@ function Dotplot() {
90
235
  body: JSON.stringify({
91
236
  url: dataset.url,
92
237
  selectedObs: dataset.selectedObs,
93
- selectedMultiVar: dataset.selectedMultiVar
238
+ selectedMultiVar: dataset.selectedMultiVar,
239
+ expressionCutoff: expressionCutoff,
240
+ meanOnlyExpressed: meanOnlyExpressed,
241
+ standardScale: standardScale
94
242
  })
95
243
  }).then(function (response) {
96
244
  return response.json();
97
245
  }).then(function (data) {
98
246
  setData(data.data);
99
247
  setLayout(data.layout);
248
+ setDataRange(data.range);
249
+ setScaleRange(function (s) {
250
+ return {
251
+ min: 0.0,
252
+ max: data.range.max.toFixed(1)
253
+ };
254
+ });
100
255
  updateColorscale(colorscale.current);
101
256
  });
102
257
  } else {
103
258
  setHasSelections(false);
104
259
  }
105
- }, [dataset.url, dataset.selectedObs, dataset.selectedMultiVar, updateColorscale]);
260
+ }, [dataset.url, dataset.selectedObs, dataset.selectedMultiVar, expressionCutoff, meanOnlyExpressed, standardScale, updateColorscale]);
106
261
  (0, _react.useEffect)(function () {
107
- console.log("update colorscale");
108
262
  colorscale.current = dataset.colorscale;
109
263
  updateColorscale(colorscale.current);
110
264
  }, [dataset.colorscale, updateColorscale]);
265
+ (0, _react.useEffect)(function () {
266
+ setLayout(function (l) {
267
+ return _objectSpread(_objectSpread({}, l), {}, {
268
+ coloraxis: _objectSpread(_objectSpread({}, l.coloraxis), {}, {
269
+ cmin: scaleRange.min,
270
+ cmax: scaleRange.max
271
+ })
272
+ });
273
+ });
274
+ }, [scaleRange]);
111
275
  if (hasSelections) {
112
276
  return /*#__PURE__*/_react.default.createElement("div", {
113
277
  className: "container text-center"
114
- }, /*#__PURE__*/_react.default.createElement("h5", null, dataset.url), /*#__PURE__*/_react.default.createElement(DotplotControls, null), /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
278
+ }, /*#__PURE__*/_react.default.createElement("h5", null, dataset.url), /*#__PURE__*/_react.default.createElement(DotplotControls, {
279
+ scaleRange: scaleRange,
280
+ expressionCutoff: expressionCutoff,
281
+ meanOnlyExpressed: meanOnlyExpressed,
282
+ dataRange: dataRange,
283
+ setScaleRange: setScaleRange,
284
+ setExpressionCutoff: setExpressionCutoff,
285
+ setMeanOnlyExpressed: setMeanOnlyExpressed,
286
+ setStandardScale: setStandardScale
287
+ }), /*#__PURE__*/_react.default.createElement(_reactPlotly.default, {
115
288
  data: data,
116
289
  layout: layout,
117
290
  useResizeHandler: true,
118
291
  style: {
119
- width: "100%",
120
- height: "100%"
292
+ maxWidth: "100%",
293
+ maxHeight: "100%"
121
294
  }
122
295
  }));
123
296
  }
@@ -116,8 +116,8 @@ function Heatmap() {
116
116
  layout: layout,
117
117
  useResizeHandler: true,
118
118
  style: {
119
- width: "100%",
120
- height: "100%"
119
+ maxWidth: "100%",
120
+ maxHeight: "100%"
121
121
  }
122
122
  }));
123
123
  }
package/dist/index.js CHANGED
@@ -1,53 +1,53 @@
1
1
  "use strict";
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
- value: true,
4
+ value: true
5
5
  });
6
6
  Object.defineProperty(exports, "DatasetProvider", {
7
7
  enumerable: true,
8
8
  get: function get() {
9
9
  return _DatasetContext.DatasetProvider;
10
- },
10
+ }
11
11
  });
12
12
  Object.defineProperty(exports, "Dotplot", {
13
13
  enumerable: true,
14
14
  get: function get() {
15
15
  return _Dotplot.Dotplot;
16
- },
16
+ }
17
17
  });
18
18
  Object.defineProperty(exports, "Heatmap", {
19
19
  enumerable: true,
20
20
  get: function get() {
21
21
  return _Heatmap.Heatmap;
22
- },
22
+ }
23
23
  });
24
24
  Object.defineProperty(exports, "MultiVarNamesList", {
25
25
  enumerable: true,
26
26
  get: function get() {
27
27
  return _VarList.MultiVarNamesList;
28
- },
28
+ }
29
29
  });
30
30
  Object.defineProperty(exports, "ObsColsList", {
31
31
  enumerable: true,
32
32
  get: function get() {
33
33
  return _ObsList.ObsColsList;
34
- },
34
+ }
35
35
  });
36
36
  Object.defineProperty(exports, "PLOTLY_COLORSCALES", {
37
37
  enumerable: true,
38
38
  get: function get() {
39
39
  return _constants.PLOTLY_COLORSCALES;
40
- },
40
+ }
41
41
  });
42
42
  Object.defineProperty(exports, "VarNamesList", {
43
43
  enumerable: true,
44
44
  get: function get() {
45
45
  return _VarList.VarNamesList;
46
- },
46
+ }
47
47
  });
48
48
  var _ObsList = require("./components/ObsList");
49
49
  var _VarList = require("./components/VarList");
50
50
  var _Heatmap = require("./components/Heatmap");
51
51
  var _Dotplot = require("./components/Dotplot");
52
52
  var _constants = require("./constants/constants");
53
- var _DatasetContext = require("./context/DatasetContext");
53
+ var _DatasetContext = require("./context/DatasetContext");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@haniffalab/cherita-react",
3
- "version": "0.1.8",
3
+ "version": "0.1.9",
4
4
  "author": "",
5
5
  "license": "",
6
6
  "main": "dist/index.js",
@@ -54,4 +54,4 @@
54
54
  "last 1 safari version"
55
55
  ]
56
56
  }
57
- }
57
+ }