@haniffalab/cherita-react 0.1.0 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/components/Dotplot.js +125 -0
- package/dist/components/Heatmap.js +125 -0
- package/dist/components/ObsList.js +66 -0
- package/dist/components/VarList.js +123 -0
- package/dist/constants/constants.js +8 -0
- package/dist/context/DatasetContext.js +100 -0
- package/dist/index.js +47 -0
- package/dist/lib/components/Dotplot.js +125 -0
- package/dist/lib/components/Heatmap.js +125 -0
- package/dist/lib/components/ObsList.js +66 -0
- package/dist/lib/components/VarList.js +123 -0
- package/dist/lib/constants/constants.js +8 -0
- package/dist/lib/context/DatasetContext.js +100 -0
- package/package.json +53 -46
- package/.eslintrc.json +0 -6
- package/public/index.html +0 -10
- package/src/App.js +0 -30
- package/src/DatasetContext.js +0 -68
- package/src/Heatmap.js +0 -107
- package/src/ObsList.js +0 -53
- package/src/VarList.js +0 -153
- package/src/constants.js +0 -20
- package/src/index.js +0 -10
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.Dotplot = Dotplot;
|
|
8
|
+
exports.DotplotControls = DotplotControls;
|
|
9
|
+
require("bootstrap/dist/css/bootstrap.min.css");
|
|
10
|
+
var _Dropdown = _interopRequireDefault(require("react-bootstrap/Dropdown"));
|
|
11
|
+
var _react = require("react");
|
|
12
|
+
var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
|
|
13
|
+
var _DatasetContext = require("./DatasetContext");
|
|
14
|
+
var _constants = require("./lib/constants/constants");
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
17
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
18
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
19
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
20
|
+
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
21
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
22
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
23
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
24
|
+
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; }
|
|
25
|
+
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; } }
|
|
26
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
27
|
+
function DotplotControls() {
|
|
28
|
+
var dataset = (0, _DatasetContext.useDataset)();
|
|
29
|
+
var dispatch = (0, _DatasetContext.useDatasetDispatch)();
|
|
30
|
+
var _useState = (0, _react.useState)(dataset.colorscale),
|
|
31
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
32
|
+
active = _useState2[0],
|
|
33
|
+
setActive = _useState2[1];
|
|
34
|
+
(0, _react.useEffect)(function () {
|
|
35
|
+
setActive(dataset.colorscale);
|
|
36
|
+
}, [dataset.colorscale]);
|
|
37
|
+
var colormapList = _constants.PLOTLY_COLORSCALES.map(function (item) {
|
|
38
|
+
return /*#__PURE__*/_react.React.createElement(_Dropdown.default.Item, {
|
|
39
|
+
key: item,
|
|
40
|
+
active: active === item,
|
|
41
|
+
onClick: function onClick() {
|
|
42
|
+
dispatch({
|
|
43
|
+
type: "colorscaleSelected",
|
|
44
|
+
colorscale: item
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}, item);
|
|
48
|
+
});
|
|
49
|
+
return /*#__PURE__*/_react.React.createElement(_Dropdown.default, null, /*#__PURE__*/_react.React.createElement(_Dropdown.default.Toggle, {
|
|
50
|
+
id: "dropdownColorscale",
|
|
51
|
+
variant: "light"
|
|
52
|
+
}, dataset.colorscale), /*#__PURE__*/_react.React.createElement(_Dropdown.default.Menu, null, colormapList));
|
|
53
|
+
}
|
|
54
|
+
function Dotplot() {
|
|
55
|
+
var dataset = (0, _DatasetContext.useDataset)();
|
|
56
|
+
var colorscale = (0, _react.useRef)(dataset.colorscale);
|
|
57
|
+
var _useState3 = (0, _react.useState)([]),
|
|
58
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
59
|
+
data = _useState4[0],
|
|
60
|
+
setData = _useState4[1];
|
|
61
|
+
var _useState5 = (0, _react.useState)({}),
|
|
62
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
63
|
+
layout = _useState6[0],
|
|
64
|
+
setLayout = _useState6[1];
|
|
65
|
+
var _useState7 = (0, _react.useState)(false),
|
|
66
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
67
|
+
hasSelections = _useState8[0],
|
|
68
|
+
setHasSelections = _useState8[1];
|
|
69
|
+
var updateColorscale = (0, _react.useCallback)(function (colorscale) {
|
|
70
|
+
setLayout(function (l) {
|
|
71
|
+
return _objectSpread(_objectSpread({}, l), {}, {
|
|
72
|
+
coloraxis: _objectSpread(_objectSpread({}, l.coloraxis), {}, {
|
|
73
|
+
colorscale: colorscale
|
|
74
|
+
})
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}, []);
|
|
78
|
+
(0, _react.useEffect)(function () {
|
|
79
|
+
if (dataset.selectedObs && dataset.selectedMultiVar.length) {
|
|
80
|
+
setHasSelections(true);
|
|
81
|
+
fetch(new URL("dotplot", process.env.REACT_APP_API_URL), {
|
|
82
|
+
method: "POST",
|
|
83
|
+
mode: "cors",
|
|
84
|
+
headers: {
|
|
85
|
+
"Content-Type": "application/json",
|
|
86
|
+
Accept: "application/json"
|
|
87
|
+
},
|
|
88
|
+
body: JSON.stringify({
|
|
89
|
+
url: dataset.url,
|
|
90
|
+
selectedObs: dataset.selectedObs,
|
|
91
|
+
selectedMultiVar: dataset.selectedMultiVar
|
|
92
|
+
})
|
|
93
|
+
}).then(function (response) {
|
|
94
|
+
return response.json();
|
|
95
|
+
}).then(function (data) {
|
|
96
|
+
setData(data.data);
|
|
97
|
+
setLayout(data.layout);
|
|
98
|
+
updateColorscale(colorscale.current);
|
|
99
|
+
});
|
|
100
|
+
} else {
|
|
101
|
+
setHasSelections(false);
|
|
102
|
+
}
|
|
103
|
+
}, [dataset.url, dataset.selectedObs, dataset.selectedMultiVar, updateColorscale]);
|
|
104
|
+
(0, _react.useEffect)(function () {
|
|
105
|
+
console.log("update colorscale");
|
|
106
|
+
colorscale.current = dataset.colorscale;
|
|
107
|
+
updateColorscale(colorscale.current);
|
|
108
|
+
}, [dataset.colorscale, updateColorscale]);
|
|
109
|
+
if (hasSelections) {
|
|
110
|
+
return /*#__PURE__*/_react.React.createElement("div", {
|
|
111
|
+
className: "container text-center"
|
|
112
|
+
}, /*#__PURE__*/_react.React.createElement("h5", null, dataset.url), /*#__PURE__*/_react.React.createElement(DotplotControls, null), /*#__PURE__*/_react.React.createElement(_reactPlotly.default, {
|
|
113
|
+
data: data,
|
|
114
|
+
layout: layout,
|
|
115
|
+
useResizeHandler: true,
|
|
116
|
+
style: {
|
|
117
|
+
width: "100%",
|
|
118
|
+
height: "100%"
|
|
119
|
+
}
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
return /*#__PURE__*/_react.React.createElement("div", {
|
|
123
|
+
className: "h-100"
|
|
124
|
+
}, /*#__PURE__*/_react.React.createElement("h5", null, dataset.url), /*#__PURE__*/_react.React.createElement("p", null, "Select OBS and VAR"));
|
|
125
|
+
}
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.Heatmap = Heatmap;
|
|
8
|
+
exports.HeatmapControls = HeatmapControls;
|
|
9
|
+
require("bootstrap/dist/css/bootstrap.min.css");
|
|
10
|
+
var _Dropdown = _interopRequireDefault(require("react-bootstrap/Dropdown"));
|
|
11
|
+
var _react = require("react");
|
|
12
|
+
var _reactPlotly = _interopRequireDefault(require("react-plotly.js"));
|
|
13
|
+
var _DatasetContext = require("./DatasetContext");
|
|
14
|
+
var _constants = require("./lib/constants/constants");
|
|
15
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
16
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
17
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
18
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
19
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
20
|
+
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
21
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
22
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
23
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
24
|
+
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; }
|
|
25
|
+
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; } }
|
|
26
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
27
|
+
function HeatmapControls() {
|
|
28
|
+
var dataset = (0, _DatasetContext.useDataset)();
|
|
29
|
+
var dispatch = (0, _DatasetContext.useDatasetDispatch)();
|
|
30
|
+
var _useState = (0, _react.useState)(dataset.colorscale),
|
|
31
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
32
|
+
active = _useState2[0],
|
|
33
|
+
setActive = _useState2[1];
|
|
34
|
+
(0, _react.useEffect)(function () {
|
|
35
|
+
setActive(dataset.colorscale);
|
|
36
|
+
}, [dataset.colorscale]);
|
|
37
|
+
var colormapList = _constants.PLOTLY_COLORSCALES.map(function (item) {
|
|
38
|
+
return /*#__PURE__*/_react.React.createElement(_Dropdown.default.Item, {
|
|
39
|
+
key: item,
|
|
40
|
+
active: active === item,
|
|
41
|
+
onClick: function onClick() {
|
|
42
|
+
dispatch({
|
|
43
|
+
type: "colorscaleSelected",
|
|
44
|
+
colorscale: item
|
|
45
|
+
});
|
|
46
|
+
}
|
|
47
|
+
}, item);
|
|
48
|
+
});
|
|
49
|
+
return /*#__PURE__*/_react.React.createElement(_Dropdown.default, null, /*#__PURE__*/_react.React.createElement(_Dropdown.default.Toggle, {
|
|
50
|
+
id: "dropdownColorscale",
|
|
51
|
+
variant: "light"
|
|
52
|
+
}, dataset.colorscale), /*#__PURE__*/_react.React.createElement(_Dropdown.default.Menu, null, colormapList));
|
|
53
|
+
}
|
|
54
|
+
function Heatmap() {
|
|
55
|
+
var dataset = (0, _DatasetContext.useDataset)();
|
|
56
|
+
var colorscale = (0, _react.useRef)(dataset.colorscale);
|
|
57
|
+
var _useState3 = (0, _react.useState)([]),
|
|
58
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
59
|
+
data = _useState4[0],
|
|
60
|
+
setData = _useState4[1];
|
|
61
|
+
var _useState5 = (0, _react.useState)({}),
|
|
62
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
63
|
+
layout = _useState6[0],
|
|
64
|
+
setLayout = _useState6[1];
|
|
65
|
+
var _useState7 = (0, _react.useState)(false),
|
|
66
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
67
|
+
hasSelections = _useState8[0],
|
|
68
|
+
setHasSelections = _useState8[1];
|
|
69
|
+
var updateColorscale = (0, _react.useCallback)(function (colorscale) {
|
|
70
|
+
setData(function (d) {
|
|
71
|
+
return d.map(function (i) {
|
|
72
|
+
return _objectSpread(_objectSpread({}, i), {}, {
|
|
73
|
+
colorscale: colorscale
|
|
74
|
+
});
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
}, []);
|
|
78
|
+
(0, _react.useEffect)(function () {
|
|
79
|
+
if (dataset.selectedObs && dataset.selectedMultiVar.length) {
|
|
80
|
+
setHasSelections(true);
|
|
81
|
+
fetch(new URL("heatmap", process.env.REACT_APP_API_URL), {
|
|
82
|
+
method: "POST",
|
|
83
|
+
mode: "cors",
|
|
84
|
+
headers: {
|
|
85
|
+
"Content-Type": "application/json",
|
|
86
|
+
Accept: "application/json"
|
|
87
|
+
},
|
|
88
|
+
body: JSON.stringify({
|
|
89
|
+
url: dataset.url,
|
|
90
|
+
selectedObs: dataset.selectedObs,
|
|
91
|
+
selectedMultiVar: dataset.selectedMultiVar
|
|
92
|
+
})
|
|
93
|
+
}).then(function (response) {
|
|
94
|
+
return response.json();
|
|
95
|
+
}).then(function (data) {
|
|
96
|
+
setData(data.data);
|
|
97
|
+
setLayout(data.layout);
|
|
98
|
+
updateColorscale(colorscale.current);
|
|
99
|
+
});
|
|
100
|
+
} else {
|
|
101
|
+
setHasSelections(false);
|
|
102
|
+
}
|
|
103
|
+
}, [dataset.url, dataset.selectedObs, dataset.selectedMultiVar, updateColorscale]);
|
|
104
|
+
(0, _react.useEffect)(function () {
|
|
105
|
+
console.log("update colorscale");
|
|
106
|
+
colorscale.current = dataset.colorscale;
|
|
107
|
+
updateColorscale(colorscale.current);
|
|
108
|
+
}, [dataset.colorscale, updateColorscale]);
|
|
109
|
+
if (hasSelections) {
|
|
110
|
+
return /*#__PURE__*/_react.React.createElement("div", {
|
|
111
|
+
className: "container text-center"
|
|
112
|
+
}, /*#__PURE__*/_react.React.createElement("h5", null, dataset.url), /*#__PURE__*/_react.React.createElement(HeatmapControls, null), /*#__PURE__*/_react.React.createElement(_reactPlotly.default, {
|
|
113
|
+
data: data,
|
|
114
|
+
layout: layout,
|
|
115
|
+
useResizeHandler: true,
|
|
116
|
+
style: {
|
|
117
|
+
width: "100%",
|
|
118
|
+
height: "100%"
|
|
119
|
+
}
|
|
120
|
+
}));
|
|
121
|
+
}
|
|
122
|
+
return /*#__PURE__*/_react.React.createElement("div", {
|
|
123
|
+
className: "h-100"
|
|
124
|
+
}, /*#__PURE__*/_react.React.createElement("h5", null, dataset.url), /*#__PURE__*/_react.React.createElement("p", null, "Select OBS and VAR"));
|
|
125
|
+
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ObsColsList = ObsColsList;
|
|
7
|
+
require("bootstrap/dist/css/bootstrap.min.css");
|
|
8
|
+
require("bootstrap/dist/js/bootstrap.bundle.min.js");
|
|
9
|
+
var _react = require("react");
|
|
10
|
+
var _DatasetContext = require("./DatasetContext");
|
|
11
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
12
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
13
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
14
|
+
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; }
|
|
15
|
+
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; } }
|
|
16
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
17
|
+
function ObsColsList() {
|
|
18
|
+
var dataset = (0, _DatasetContext.useDataset)();
|
|
19
|
+
var dispatch = (0, _DatasetContext.useDatasetDispatch)();
|
|
20
|
+
var _useState = (0, _react.useState)([]),
|
|
21
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
22
|
+
obsColsList = _useState2[0],
|
|
23
|
+
setObsColsList = _useState2[1];
|
|
24
|
+
var _useState3 = (0, _react.useState)(null),
|
|
25
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
26
|
+
active = _useState4[0],
|
|
27
|
+
setActive = _useState4[1];
|
|
28
|
+
(0, _react.useEffect)(function () {
|
|
29
|
+
fetch(new URL("obs/cols", process.env.REACT_APP_API_URL), {
|
|
30
|
+
method: "POST",
|
|
31
|
+
mode: "cors",
|
|
32
|
+
headers: {
|
|
33
|
+
"Content-Type": "application/json",
|
|
34
|
+
Accept: "application/json"
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify({
|
|
37
|
+
url: dataset.url
|
|
38
|
+
})
|
|
39
|
+
}).then(function (response) {
|
|
40
|
+
return response.json();
|
|
41
|
+
}).then(function (data) {
|
|
42
|
+
setObsColsList(data);
|
|
43
|
+
});
|
|
44
|
+
}, [dataset.url]);
|
|
45
|
+
(0, _react.useEffect)(function () {
|
|
46
|
+
setActive(dataset.selectedObs);
|
|
47
|
+
}, [dataset.selectedObs]);
|
|
48
|
+
var obsList = obsColsList.map(function (item) {
|
|
49
|
+
return /*#__PURE__*/_react.React.createElement("button", {
|
|
50
|
+
type: "button",
|
|
51
|
+
key: item,
|
|
52
|
+
className: "list-group-item list-grou-item-action ".concat(active === item && "active"),
|
|
53
|
+
onClick: function onClick() {
|
|
54
|
+
dispatch({
|
|
55
|
+
type: "obsSelected",
|
|
56
|
+
obs: item
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}, item);
|
|
60
|
+
});
|
|
61
|
+
return /*#__PURE__*/_react.React.createElement("div", {
|
|
62
|
+
className: "h-100"
|
|
63
|
+
}, /*#__PURE__*/_react.React.createElement("h5", null, dataset.url), /*#__PURE__*/_react.React.createElement("div", {
|
|
64
|
+
className: "list-group overflow-auto mh-100"
|
|
65
|
+
}, obsList));
|
|
66
|
+
}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.MultiVarNamesList = MultiVarNamesList;
|
|
7
|
+
exports.VarNamesList = VarNamesList;
|
|
8
|
+
require("bootstrap/dist/css/bootstrap.min.css");
|
|
9
|
+
var _react = require("react");
|
|
10
|
+
var _DatasetContext = require("./DatasetContext");
|
|
11
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
12
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
13
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
14
|
+
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; }
|
|
15
|
+
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; } }
|
|
16
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
17
|
+
function VarNamesList() {
|
|
18
|
+
var dataset = (0, _DatasetContext.useDataset)();
|
|
19
|
+
var dispatch = (0, _DatasetContext.useDatasetDispatch)();
|
|
20
|
+
var _useState = (0, _react.useState)([]),
|
|
21
|
+
_useState2 = _slicedToArray(_useState, 2),
|
|
22
|
+
varNames = _useState2[0],
|
|
23
|
+
setVarNames = _useState2[1];
|
|
24
|
+
var _useState3 = (0, _react.useState)([]),
|
|
25
|
+
_useState4 = _slicedToArray(_useState3, 2),
|
|
26
|
+
active = _useState4[0],
|
|
27
|
+
setActive = _useState4[1];
|
|
28
|
+
(0, _react.useEffect)(function () {
|
|
29
|
+
fetch(new URL("var/names", process.env.REACT_APP_API_URL), {
|
|
30
|
+
method: "POST",
|
|
31
|
+
mode: "cors",
|
|
32
|
+
headers: {
|
|
33
|
+
"Content-Type": "application/json",
|
|
34
|
+
Accept: "application/json"
|
|
35
|
+
},
|
|
36
|
+
body: JSON.stringify({
|
|
37
|
+
url: dataset.url
|
|
38
|
+
})
|
|
39
|
+
}).then(function (response) {
|
|
40
|
+
return response.json();
|
|
41
|
+
}).then(function (data) {
|
|
42
|
+
setVarNames(data);
|
|
43
|
+
});
|
|
44
|
+
}, [dataset.url]);
|
|
45
|
+
(0, _react.useEffect)(function () {
|
|
46
|
+
setActive(dataset.selectedVar);
|
|
47
|
+
}, [dataset.selectedVar]);
|
|
48
|
+
var varList = varNames.map(function (item) {
|
|
49
|
+
return /*#__PURE__*/_react.React.createElement("button", {
|
|
50
|
+
type: "button",
|
|
51
|
+
key: item,
|
|
52
|
+
className: "list-group-item list-grou-item-action ".concat(active === item && "active"),
|
|
53
|
+
onClick: function onClick() {
|
|
54
|
+
dispatch({
|
|
55
|
+
type: "varSelected",
|
|
56
|
+
var: item
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
}, item);
|
|
60
|
+
});
|
|
61
|
+
return /*#__PURE__*/_react.React.createElement("div", {
|
|
62
|
+
className: "h-100"
|
|
63
|
+
}, /*#__PURE__*/_react.React.createElement("h5", null, dataset.url), /*#__PURE__*/_react.React.createElement("div", {
|
|
64
|
+
className: "list-group overflow-auto mh-100"
|
|
65
|
+
}, varList));
|
|
66
|
+
}
|
|
67
|
+
function MultiVarNamesList() {
|
|
68
|
+
var dataset = (0, _DatasetContext.useDataset)();
|
|
69
|
+
var dispatch = (0, _DatasetContext.useDatasetDispatch)();
|
|
70
|
+
var _useState5 = (0, _react.useState)([]),
|
|
71
|
+
_useState6 = _slicedToArray(_useState5, 2),
|
|
72
|
+
varNames = _useState6[0],
|
|
73
|
+
setVarNames = _useState6[1];
|
|
74
|
+
var _useState7 = (0, _react.useState)([]),
|
|
75
|
+
_useState8 = _slicedToArray(_useState7, 2),
|
|
76
|
+
active = _useState8[0],
|
|
77
|
+
setActive = _useState8[1];
|
|
78
|
+
(0, _react.useEffect)(function () {
|
|
79
|
+
fetch(new URL("var/names", process.env.REACT_APP_API_URL), {
|
|
80
|
+
method: "POST",
|
|
81
|
+
mode: "cors",
|
|
82
|
+
headers: {
|
|
83
|
+
"Content-Type": "application/json",
|
|
84
|
+
Accept: "application/json"
|
|
85
|
+
},
|
|
86
|
+
body: JSON.stringify({
|
|
87
|
+
url: dataset.url
|
|
88
|
+
})
|
|
89
|
+
}).then(function (response) {
|
|
90
|
+
return response.json();
|
|
91
|
+
}).then(function (data) {
|
|
92
|
+
setVarNames(data);
|
|
93
|
+
});
|
|
94
|
+
}, [dataset.url]);
|
|
95
|
+
(0, _react.useEffect)(function () {
|
|
96
|
+
setActive(dataset.selectedMultiVar);
|
|
97
|
+
}, [dataset.selectedMultiVar]);
|
|
98
|
+
var varList = varNames.map(function (item) {
|
|
99
|
+
return /*#__PURE__*/_react.React.createElement("button", {
|
|
100
|
+
type: "button",
|
|
101
|
+
key: item,
|
|
102
|
+
className: "list-group-item list-grou-item-action ".concat(active.includes(item) && "active"),
|
|
103
|
+
onClick: function onClick() {
|
|
104
|
+
if (active.includes(item)) {
|
|
105
|
+
dispatch({
|
|
106
|
+
type: "multiVarDeselected",
|
|
107
|
+
var: item
|
|
108
|
+
});
|
|
109
|
+
} else {
|
|
110
|
+
dispatch({
|
|
111
|
+
type: "multiVarSelected",
|
|
112
|
+
var: item
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}, item);
|
|
117
|
+
});
|
|
118
|
+
return /*#__PURE__*/_react.React.createElement("div", {
|
|
119
|
+
className: "h-100"
|
|
120
|
+
}, /*#__PURE__*/_react.React.createElement("h5", null, dataset.url), /*#__PURE__*/_react.React.createElement("div", {
|
|
121
|
+
className: "list-group overflow-auto mh-100"
|
|
122
|
+
}, varList));
|
|
123
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.PLOTLY_COLORSCALES = void 0;
|
|
7
|
+
var PLOTLY_COLORSCALES = ["Blackbody", "Bluered", "Blues", "Cividis", "Earth", "Electric", "Greens", "Greys", "Hot", "Jet", "Picnic", "Portland", "Rainbow", "RdBu", "Reds", "Viridis", "YlGnBu", "YlOrRd"];
|
|
8
|
+
exports.PLOTLY_COLORSCALES = PLOTLY_COLORSCALES;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
exports.DatasetDispatchContext = exports.DatasetContext = void 0;
|
|
8
|
+
exports.DatasetProvider = DatasetProvider;
|
|
9
|
+
exports.useDataset = useDataset;
|
|
10
|
+
exports.useDatasetDispatch = useDatasetDispatch;
|
|
11
|
+
var _react = require("react");
|
|
12
|
+
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }
|
|
13
|
+
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
14
|
+
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
|
|
15
|
+
function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }
|
|
16
|
+
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
|
|
17
|
+
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
|
|
18
|
+
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
|
|
19
|
+
function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); }
|
|
20
|
+
function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); }
|
|
21
|
+
function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
|
|
22
|
+
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
23
|
+
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
|
|
24
|
+
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; }
|
|
25
|
+
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; } }
|
|
26
|
+
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
|
|
27
|
+
var DatasetContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
28
|
+
exports.DatasetContext = DatasetContext;
|
|
29
|
+
var DatasetDispatchContext = /*#__PURE__*/(0, _react.createContext)(null);
|
|
30
|
+
exports.DatasetDispatchContext = DatasetDispatchContext;
|
|
31
|
+
function DatasetProvider(_ref) {
|
|
32
|
+
var dataset_url = _ref.dataset_url,
|
|
33
|
+
children = _ref.children;
|
|
34
|
+
var _useReducer = (0, _react.useReducer)(datasetReducer, {
|
|
35
|
+
url: dataset_url,
|
|
36
|
+
selectedObs: null,
|
|
37
|
+
selectedVar: null,
|
|
38
|
+
selectedMultiObs: [],
|
|
39
|
+
selectedMultiVar: [],
|
|
40
|
+
colorscale: "Viridis"
|
|
41
|
+
}),
|
|
42
|
+
_useReducer2 = _slicedToArray(_useReducer, 2),
|
|
43
|
+
dataset = _useReducer2[0],
|
|
44
|
+
dispatch = _useReducer2[1];
|
|
45
|
+
return /*#__PURE__*/React.createElement(DatasetContext.Provider, {
|
|
46
|
+
value: dataset
|
|
47
|
+
}, /*#__PURE__*/React.createElement(DatasetDispatchContext.Provider, {
|
|
48
|
+
value: dispatch
|
|
49
|
+
}, children));
|
|
50
|
+
}
|
|
51
|
+
function useDataset() {
|
|
52
|
+
return (0, _react.useContext)(DatasetContext);
|
|
53
|
+
}
|
|
54
|
+
function useDatasetDispatch() {
|
|
55
|
+
return (0, _react.useContext)(DatasetDispatchContext);
|
|
56
|
+
}
|
|
57
|
+
function datasetReducer(dataset, action) {
|
|
58
|
+
switch (action.type) {
|
|
59
|
+
case "setDataset":
|
|
60
|
+
{
|
|
61
|
+
return action.dataset;
|
|
62
|
+
}
|
|
63
|
+
case "obsSelected":
|
|
64
|
+
{
|
|
65
|
+
return _objectSpread(_objectSpread({}, dataset), {}, {
|
|
66
|
+
selectedObs: action.obs
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
case "varSelected":
|
|
70
|
+
{
|
|
71
|
+
return _objectSpread(_objectSpread({}, dataset), {}, {
|
|
72
|
+
selectedVar: action.var
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
case "multiVarSelected":
|
|
76
|
+
{
|
|
77
|
+
return _objectSpread(_objectSpread({}, dataset), {}, {
|
|
78
|
+
selectedMultiVar: [].concat(_toConsumableArray(dataset.selectedMultiVar), [action.var])
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
case "multiVarDeselected":
|
|
82
|
+
{
|
|
83
|
+
return _objectSpread(_objectSpread({}, dataset), {}, {
|
|
84
|
+
selectedMultiVar: dataset.selectedMultiVar.filter(function (a) {
|
|
85
|
+
return a !== action.var;
|
|
86
|
+
})
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
case "colorscaleSelected":
|
|
90
|
+
{
|
|
91
|
+
return _objectSpread(_objectSpread({}, dataset), {}, {
|
|
92
|
+
colorscale: action.colorscale
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
default:
|
|
96
|
+
{
|
|
97
|
+
throw Error("Unknown action: " + action.type);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
package/package.json
CHANGED
|
@@ -1,46 +1,53 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "@haniffalab/cherita-react",
|
|
3
|
-
"version": "0.1.
|
|
4
|
-
"author": "",
|
|
5
|
-
"license": "",
|
|
6
|
-
"
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"react
|
|
15
|
-
"react-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
"
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
"
|
|
38
|
-
"
|
|
39
|
-
]
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
"
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
1
|
+
{
|
|
2
|
+
"name": "@haniffalab/cherita-react",
|
|
3
|
+
"version": "0.1.2",
|
|
4
|
+
"author": "",
|
|
5
|
+
"license": "",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"module": "dist/index.js",
|
|
8
|
+
"files": ["dist"],
|
|
9
|
+
"dependencies": {
|
|
10
|
+
"bootstrap": "^5.3.0",
|
|
11
|
+
"jquery": "^3.7.0",
|
|
12
|
+
"plotly.js": "^2.23.2",
|
|
13
|
+
"popper.js": "^1.16.1",
|
|
14
|
+
"react": "^18.2.0",
|
|
15
|
+
"react-bootstrap": "^2.7.4",
|
|
16
|
+
"react-dom": "^18.2.0",
|
|
17
|
+
"react-plotly.js": "^2.6.0",
|
|
18
|
+
"react-scripts": "^5.0.1"
|
|
19
|
+
},
|
|
20
|
+
"devDependencies": {
|
|
21
|
+
"@babel/cli": "^7.22.5",
|
|
22
|
+
"@babel/core": "^7.22.5",
|
|
23
|
+
"@babel/preset-env": "^7.22.5",
|
|
24
|
+
"@babel/preset-react": "^7.22.5",
|
|
25
|
+
"eslint": "^8.42.0",
|
|
26
|
+
"eslint-config-prettier": "^8.8.0",
|
|
27
|
+
"eslint-config-react-app": "^7.0.1"
|
|
28
|
+
},
|
|
29
|
+
"scripts": {
|
|
30
|
+
"start": "react-scripts start",
|
|
31
|
+
"build": "babel src/lib --out-dir dist --copy-files",
|
|
32
|
+
"test": "react-scripts test",
|
|
33
|
+
"eject": "react-scripts eject"
|
|
34
|
+
},
|
|
35
|
+
"eslintConfig": {
|
|
36
|
+
"extends": [
|
|
37
|
+
"react-app",
|
|
38
|
+
"prettier"
|
|
39
|
+
]
|
|
40
|
+
},
|
|
41
|
+
"browserslist": {
|
|
42
|
+
"production": [
|
|
43
|
+
">0.2%",
|
|
44
|
+
"not dead",
|
|
45
|
+
"not op_mini all"
|
|
46
|
+
],
|
|
47
|
+
"development": [
|
|
48
|
+
"last 1 chrome version",
|
|
49
|
+
"last 1 firefox version",
|
|
50
|
+
"last 1 safari version"
|
|
51
|
+
]
|
|
52
|
+
}
|
|
53
|
+
}
|