@complat/react-spectra-editor 1.7.0 → 1.8.0

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 (111) hide show
  1. package/CHANGELOG.md +28 -0
  2. package/LICENSE +21 -662
  3. package/README.md +5 -0
  4. package/dist/__tests__/fixtures/lc_ms_jcamp.js +2329 -0
  5. package/dist/__tests__/fixtures/lc_ms_jcamp_2.js +2874 -0
  6. package/dist/__tests__/fixtures/lc_ms_jcamp_mz_chemstation.js +3242 -0
  7. package/dist/__tests__/fixtures/lc_ms_jcamp_tic_chemstation.js +854 -0
  8. package/dist/__tests__/fixtures/lc_ms_jcamp_tic_neg.js +1233 -0
  9. package/dist/__tests__/fixtures/lc_ms_jcamp_tic_pos.js +1233 -0
  10. package/dist/__tests__/fixtures/lc_ms_jcamp_uvvis.js +48908 -0
  11. package/dist/__tests__/fixtures/lc_ms_jcamp_uvvis_chemstation.js +15424 -0
  12. package/dist/__tests__/units/components/cmd_bar/r05_submit_btn.test.js +158 -3
  13. package/dist/__tests__/units/components/d3_line_rect.test.js +85 -0
  14. package/dist/__tests__/units/components/d3_multi/multi_focus.test.js +43 -0
  15. package/dist/__tests__/units/components/hplc_viewer.test.js +123 -0
  16. package/dist/__tests__/units/components/panel/info.test.js +55 -15
  17. package/dist/__tests__/units/features/lc-ms/parsing/lcmsCategory.test.js +73 -0
  18. package/dist/__tests__/units/features/lc-ms/submit/peaks.test.js +310 -0
  19. package/dist/actions/curve.js +5 -2
  20. package/dist/actions/hplc_ms.js +66 -0
  21. package/dist/actions/integration.js +17 -2
  22. package/dist/actions/ui.js +39 -11
  23. package/dist/app.js +21 -8
  24. package/dist/components/cmd_bar/01_viewer.js +15 -11
  25. package/dist/components/cmd_bar/03_peak.js +25 -16
  26. package/dist/components/cmd_bar/04_integration.js +116 -17
  27. package/dist/components/cmd_bar/08_peak_group.js +83 -0
  28. package/dist/components/cmd_bar/collapsible_toolbar_group.js +101 -0
  29. package/dist/components/cmd_bar/common.js +4 -3
  30. package/dist/components/cmd_bar/index.js +76 -18
  31. package/dist/components/cmd_bar/r01_layout.js +6 -0
  32. package/dist/components/cmd_bar/r02_scan.js +15 -11
  33. package/dist/components/cmd_bar/r03_threshold.js +19 -3
  34. package/dist/components/cmd_bar/r04_submit.js +61 -6
  35. package/dist/components/cmd_bar/r05_submit_btn.js +60 -13
  36. package/dist/components/cmd_bar/r06_predict_btn.js +4 -4
  37. package/dist/components/cmd_bar/r07_wavelength_btn.js +10 -9
  38. package/dist/components/cmd_bar/r09_detector.js +2 -2
  39. package/dist/components/cmd_bar/tri_btn.js +4 -1
  40. package/dist/components/common/draw.js +6 -5
  41. package/dist/components/d3_line/index.js +70 -15
  42. package/dist/components/d3_line/line_focus.js +104 -67
  43. package/dist/components/d3_line_rect/index.js +836 -0
  44. package/dist/components/d3_line_rect/line_focus.js +526 -0
  45. package/dist/components/d3_line_rect/multi_focus.js +433 -0
  46. package/dist/components/d3_line_rect/rect_focus.js +247 -0
  47. package/dist/components/d3_multi/index.js +154 -163
  48. package/dist/components/d3_multi/multi_focus.js +117 -68
  49. package/dist/components/d3_rect/index.js +6 -0
  50. package/dist/components/d3_rect/rect_focus.js +17 -5
  51. package/dist/components/hplc_viewer.js +169 -0
  52. package/dist/components/lc_ms_uv_tools_bar.js +175 -0
  53. package/dist/components/multi_jcamps_viewer.js +17 -5
  54. package/dist/components/panel/compare.js +84 -62
  55. package/dist/components/panel/cyclic_voltamery_data.js +15 -14
  56. package/dist/components/panel/graph_selection.js +32 -30
  57. package/dist/components/panel/index.js +28 -22
  58. package/dist/components/panel/info.js +90 -31
  59. package/dist/constants/action_type.js +23 -2
  60. package/dist/constants/list_graph.js +16 -0
  61. package/dist/constants/list_layout.js +2 -1
  62. package/dist/constants/list_ui.js +5 -2
  63. package/dist/features/lc-ms/entities/extractEntityLCMS.js +187 -0
  64. package/dist/features/lc-ms/parsing/chemstation.js +108 -0
  65. package/dist/features/lc-ms/parsing/index.js +46 -0
  66. package/dist/features/lc-ms/parsing/lcmsCategory.js +44 -0
  67. package/dist/features/lc-ms/parsing/lcmsJcampInfo.js +18 -0
  68. package/dist/features/lc-ms/parsing/lcmsMsPage.js +241 -0
  69. package/dist/features/lc-ms/parsing/pageValue.js +27 -0
  70. package/dist/features/lc-ms/submit/index.js +24 -0
  71. package/dist/features/lc-ms/submit/peaks.js +66 -0
  72. package/dist/features/lc-ms/ui/wavelengthSelect.js +54 -0
  73. package/dist/fn.js +4 -1
  74. package/dist/helpers/brush.js +74 -19
  75. package/dist/helpers/calc.js +4 -2
  76. package/dist/helpers/cfg.js +5 -4
  77. package/dist/helpers/chem.js +449 -71
  78. package/dist/helpers/compass.js +181 -17
  79. package/dist/helpers/extractEntityLCMS.js +24 -0
  80. package/dist/helpers/extractParams.js +118 -33
  81. package/dist/helpers/extractPeaksEdit.js +29 -9
  82. package/dist/helpers/format.js +189 -4
  83. package/dist/helpers/init.js +25 -5
  84. package/dist/helpers/integration.js +130 -17
  85. package/dist/helpers/integration_draft.js +43 -0
  86. package/dist/helpers/integration_focus.js +155 -0
  87. package/dist/helpers/integration_jcamp.js +68 -0
  88. package/dist/helpers/integration_split.js +202 -0
  89. package/dist/helpers/mount.js +8 -1
  90. package/dist/helpers/sweep.js +39 -0
  91. package/dist/index.js +284 -26
  92. package/dist/layer_content.js +17 -3
  93. package/dist/layer_init.js +124 -14
  94. package/dist/layer_prism.js +31 -5
  95. package/dist/reducers/index.js +3 -1
  96. package/dist/reducers/reducer_curve.js +54 -36
  97. package/dist/reducers/reducer_hplc_ms/hydrate.js +289 -0
  98. package/dist/reducers/reducer_hplc_ms/index.js +122 -0
  99. package/dist/reducers/reducer_hplc_ms/persistence.js +74 -0
  100. package/dist/reducers/reducer_hplc_ms/tic.js +70 -0
  101. package/dist/reducers/reducer_hplc_ms/utils.js +70 -0
  102. package/dist/reducers/reducer_hplc_ms/uvvis.js +377 -0
  103. package/dist/reducers/reducer_integration.js +265 -7
  104. package/dist/reducers/reducer_layout.js +1 -1
  105. package/dist/reducers/reducer_submit.js +2 -1
  106. package/dist/reducers/reducer_ui.js +149 -13
  107. package/dist/reducers/undo_redo_config.js +2 -2
  108. package/dist/sagas/saga_lcms_ui.js +85 -0
  109. package/dist/sagas/saga_ui.js +177 -74
  110. package/dist/setupTests.js +5 -5
  111. package/package.json +10 -7
@@ -0,0 +1,169 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _reactRedux = require("react-redux");
11
+ var _redux = require("redux");
12
+ var _styles = require("@mui/styles");
13
+ var _material = require("@mui/material");
14
+ var _index = _interopRequireDefault(require("./panel/index"));
15
+ var _index2 = _interopRequireDefault(require("./cmd_bar/index"));
16
+ var _index3 = _interopRequireDefault(require("./d3_line_rect/index"));
17
+ var _lc_ms_uv_tools_bar = _interopRequireDefault(require("./lc_ms_uv_tools_bar"));
18
+ var _extractEntityLCMS = require("../helpers/extractEntityLCMS");
19
+ var _jsxRuntime = require("react/jsx-runtime");
20
+ /* eslint-disable react/default-props-match-prop-types,
21
+ react/require-default-props, react/no-unused-prop-types, react/jsx-boolean-value,
22
+ prefer-object-spread */
23
+
24
+ const styles = () => ({
25
+ root: {
26
+ flexGrow: 1
27
+ },
28
+ appBar: {
29
+ backgroundColor: '#fff',
30
+ boxShadow: 'none'
31
+ },
32
+ tabLabel: {
33
+ fontSize: '14px'
34
+ }
35
+ });
36
+ class HPLCViewer extends _react.default.Component {
37
+ // eslint-disable-line
38
+ render() {
39
+ const {
40
+ classes,
41
+ curveState,
42
+ operations,
43
+ entityFileNames,
44
+ entities,
45
+ userManualLink,
46
+ molSvg,
47
+ theoryMass,
48
+ integrationState,
49
+ hplcMsState,
50
+ descriptions,
51
+ canChangeDescription,
52
+ onDescriptionChanged,
53
+ editorOnly,
54
+ forecast,
55
+ onLcmsPageRequest
56
+ } = this.props;
57
+ if (!entities || entities.length === 0) return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {});
58
+ const {
59
+ curveIdx
60
+ } = curveState;
61
+ const entity = entities[curveIdx];
62
+ if (!entity) return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {});
63
+ const {
64
+ feature,
65
+ topic
66
+ } = entity || {};
67
+ const {
68
+ ticEntities,
69
+ uvvisEntities,
70
+ mzEntities
71
+ } = (0, _extractEntityLCMS.splitAndReindexEntities)(entities);
72
+ const displayFeature = feature || entities[0]?.feature || entities[0]?.features?.[0] || {};
73
+ const hasEdit = !!displayFeature?.data?.[0]?.x?.length;
74
+ const {
75
+ integrations
76
+ } = integrationState;
77
+ const currentIntegration = integrations[curveIdx];
78
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
79
+ className: classes.root,
80
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_index2.default, {
81
+ feature: displayFeature,
82
+ hasEdit: hasEdit,
83
+ forecast: forecast || {},
84
+ operations: operations,
85
+ editorOnly: editorOnly,
86
+ hideThreshold: true,
87
+ hideMainEditTools: true,
88
+ prependLcMsToolbar: /*#__PURE__*/(0, _jsxRuntime.jsx)(_lc_ms_uv_tools_bar.default, {})
89
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
90
+ className: "react-spectrum-editor",
91
+ children: /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Grid, {
92
+ container: true,
93
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Grid, {
94
+ item: true,
95
+ xs: 9,
96
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_index3.default, {
97
+ ticEntities: ticEntities,
98
+ uvvisEntities: uvvisEntities,
99
+ mzEntities: mzEntities,
100
+ topic: topic,
101
+ xLabel: displayFeature?.xUnit || '',
102
+ yLabel: displayFeature?.yUnit || '',
103
+ feature: displayFeature,
104
+ jcampIdx: curveIdx,
105
+ hplcMsSt: hplcMsState,
106
+ isHidden: false,
107
+ omitUvvisToolbarRow: true,
108
+ onLcmsPageRequest: onLcmsPageRequest
109
+ })
110
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Grid, {
111
+ item: true,
112
+ xs: 3,
113
+ align: "center",
114
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_index.default, {
115
+ entities: entities,
116
+ jcampIdx: curveIdx,
117
+ entityFileNames: entityFileNames,
118
+ userManualLink: userManualLink,
119
+ feature: displayFeature,
120
+ molSvg: molSvg,
121
+ theoryMass: theoryMass,
122
+ descriptions: descriptions,
123
+ integration: currentIntegration,
124
+ canChangeDescription: canChangeDescription,
125
+ onDescriptionChanged: onDescriptionChanged,
126
+ editorOnly: editorOnly
127
+ })
128
+ })]
129
+ })
130
+ })]
131
+ });
132
+ }
133
+ }
134
+ const mapStateToProps = state => ({
135
+ curveState: state.curve,
136
+ entities: state.curve.listCurves,
137
+ integrationState: state.integration.present,
138
+ hplcMsState: state.hplcMs
139
+ });
140
+ HPLCViewer.propTypes = {
141
+ classes: _propTypes.default.object.isRequired,
142
+ entityFileNames: _propTypes.default.array.isRequired,
143
+ molSvg: _propTypes.default.string.isRequired,
144
+ curveState: _propTypes.default.object.isRequired,
145
+ operations: _propTypes.default.array.isRequired,
146
+ forecast: _propTypes.default.object,
147
+ userManualLink: _propTypes.default.object,
148
+ entities: _propTypes.default.array,
149
+ theoryMass: _propTypes.default.string,
150
+ integrationState: _propTypes.default.object.isRequired,
151
+ hplcMsState: _propTypes.default.object.isRequired,
152
+ descriptions: _propTypes.default.array.isRequired,
153
+ canChangeDescription: _propTypes.default.bool.isRequired,
154
+ onDescriptionChanged: _propTypes.default.func,
155
+ onLcmsPageRequest: _propTypes.default.func,
156
+ editorOnly: _propTypes.default.bool.isRequired
157
+ };
158
+ HPLCViewer.defaultProps = {
159
+ entityFileNames: [],
160
+ molSvg: '',
161
+ cLabel: '',
162
+ xLabel: '',
163
+ yLabel: '',
164
+ entities: [],
165
+ forecast: {},
166
+ onDescriptionChanged: () => {},
167
+ onLcmsPageRequest: null
168
+ };
169
+ var _default = exports.default = (0, _redux.compose)((0, _reactRedux.connect)(mapStateToProps), (0, _styles.withStyles)(styles))(HPLCViewer);
@@ -0,0 +1,175 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.default = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _propTypes = _interopRequireDefault(require("prop-types"));
10
+ var _reactRedux = require("react-redux");
11
+ var _redux = require("redux");
12
+ var _classnames = _interopRequireDefault(require("classnames"));
13
+ var _withStyles = _interopRequireDefault(require("@mui/styles/withStyles"));
14
+ var _material = require("@mui/material");
15
+ var _ZoomInOutlined = _interopRequireDefault(require("@mui/icons-material/ZoomInOutlined"));
16
+ var _FindReplaceOutlined = _interopRequireDefault(require("@mui/icons-material/FindReplaceOutlined"));
17
+ var _Undo = _interopRequireDefault(require("@mui/icons-material/Undo"));
18
+ var _Redo = _interopRequireDefault(require("@mui/icons-material/Redo"));
19
+ var _common = require("./cmd_bar/common");
20
+ var _integration = _interopRequireDefault(require("./cmd_bar/04_integration"));
21
+ var _peak = _interopRequireDefault(require("./cmd_bar/03_peak"));
22
+ var _ui = require("../actions/ui");
23
+ var _hplc_ms = require("../actions/hplc_ms");
24
+ var _list_ui = require("../constants/list_ui");
25
+ var _wavelengthSelect = _interopRequireDefault(require("../features/lc-ms/ui/wavelengthSelect"));
26
+ var _jsxRuntime = require("react/jsx-runtime");
27
+ /* eslint-disable no-mixed-operators, prefer-object-spread, react/function-component-definition */
28
+
29
+ const styles = () => Object.assign({}, _common.commonStyle);
30
+ const zoomView = (classes, graphIndex, uiSt, zoomInAct) => {
31
+ const onSweepZoomIn = () => {
32
+ zoomInAct({
33
+ graphIndex,
34
+ sweepType: _list_ui.LIST_UI_SWEEP_TYPE.ZOOMIN
35
+ });
36
+ };
37
+ const onSweepZoomReset = () => {
38
+ zoomInAct({
39
+ graphIndex,
40
+ sweepType: _list_ui.LIST_UI_SWEEP_TYPE.ZOOMRESET
41
+ });
42
+ zoomInAct({
43
+ graphIndex,
44
+ sweepType: _list_ui.LIST_UI_SWEEP_TYPE.ZOOMIN
45
+ });
46
+ };
47
+ const {
48
+ zoom
49
+ } = uiSt;
50
+ const {
51
+ sweepTypes
52
+ } = zoom;
53
+ const isZoomFocus = sweepTypes[graphIndex] === _list_ui.LIST_UI_SWEEP_TYPE.ZOOMIN;
54
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
55
+ className: classes.group,
56
+ "data-testid": "Zoom",
57
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
58
+ title: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
59
+ className: "txt-sv-tp",
60
+ children: "Zoom In"
61
+ }),
62
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_common.MuButton, {
63
+ className: (0, _classnames.default)((0, _common.focusStyle)(isZoomFocus, classes), 'btn-sv-bar-zoomin'),
64
+ onClick: onSweepZoomIn,
65
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ZoomInOutlined.default, {
66
+ className: (0, _classnames.default)(classes.icon, classes.iconWp)
67
+ })
68
+ })
69
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
70
+ title: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
71
+ className: "txt-sv-tp",
72
+ children: "Reset Zoom"
73
+ }),
74
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_common.MuButton, {
75
+ className: "btn-sv-bar-zoomreset",
76
+ onClick: onSweepZoomReset,
77
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FindReplaceOutlined.default, {
78
+ className: classes.icon
79
+ })
80
+ })
81
+ })]
82
+ });
83
+ };
84
+ const wavelengthSelect = (classes, hplcMsSt, updateWavelengthAct) => (0, _wavelengthSelect.default)(classes, hplcMsSt, updateWavelengthAct, {
85
+ labelId: 'lcms-select-wavelength-label',
86
+ label: 'Wavelength (nm)'
87
+ });
88
+ const LcMsUvToolsBar = ({
89
+ classes,
90
+ uiSt,
91
+ hplcMsSt,
92
+ feature,
93
+ zoomInAct,
94
+ selectWavelengthAct,
95
+ uvvisUndoAct,
96
+ uvvisRedoAct
97
+ }) => {
98
+ const handleWavelengthChange = event => {
99
+ selectWavelengthAct(event);
100
+ };
101
+ const hist = hplcMsSt?.uvvisEditHistory || {
102
+ past: [],
103
+ future: []
104
+ };
105
+ const canUndo = hist.past && hist.past.length > 0;
106
+ const canRedo = hist.future && hist.future.length > 0;
107
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
108
+ children: [zoomView(classes, 0, uiSt, zoomInAct), wavelengthSelect(classes, hplcMsSt, handleWavelengthChange), /*#__PURE__*/(0, _jsxRuntime.jsx)(_integration.default, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_peak.default, {
109
+ feature: feature || {}
110
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
111
+ className: classes.group,
112
+ style: {
113
+ display: 'inline-flex',
114
+ alignItems: 'center'
115
+ },
116
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
117
+ title: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
118
+ className: "txt-sv-tp",
119
+ children: "Undo"
120
+ }),
121
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_common.MuButton, {
122
+ className: "btn-sv-bar-uvvis-undo",
123
+ disabled: !canUndo,
124
+ onClick: () => uvvisUndoAct(),
125
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Undo.default, {
126
+ className: classes.icon
127
+ })
128
+ })
129
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
130
+ title: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
131
+ className: "txt-sv-tp",
132
+ children: "Redo"
133
+ }),
134
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_common.MuButton, {
135
+ className: "btn-sv-bar-uvvis-redo",
136
+ disabled: !canRedo,
137
+ onClick: () => uvvisRedoAct(),
138
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Redo.default, {
139
+ className: classes.icon
140
+ })
141
+ })
142
+ })]
143
+ })]
144
+ });
145
+ };
146
+ const mapStateToProps = state => {
147
+ const {
148
+ curveIdx,
149
+ listCurves
150
+ } = state.curve;
151
+ const entity = listCurves[curveIdx];
152
+ const displayFeature = entity?.feature || listCurves[0]?.feature || listCurves[0]?.features?.[0] || {};
153
+ return {
154
+ uiSt: state.ui,
155
+ hplcMsSt: state.hplcMs,
156
+ feature: displayFeature
157
+ };
158
+ };
159
+ const mapDispatchToProps = dispatch => (0, _redux.bindActionCreators)({
160
+ zoomInAct: _ui.setUiSweepType,
161
+ selectWavelengthAct: _hplc_ms.selectWavelength,
162
+ uvvisUndoAct: _hplc_ms.uvvisUndo,
163
+ uvvisRedoAct: _hplc_ms.uvvisRedo
164
+ }, dispatch);
165
+ LcMsUvToolsBar.propTypes = {
166
+ classes: _propTypes.default.object.isRequired,
167
+ uiSt: _propTypes.default.object.isRequired,
168
+ hplcMsSt: _propTypes.default.object.isRequired,
169
+ feature: _propTypes.default.object.isRequired,
170
+ zoomInAct: _propTypes.default.func.isRequired,
171
+ selectWavelengthAct: _propTypes.default.func.isRequired,
172
+ uvvisUndoAct: _propTypes.default.func.isRequired,
173
+ uvvisRedoAct: _propTypes.default.func.isRequired
174
+ };
175
+ var _default = exports.default = (0, _redux.compose)((0, _reactRedux.connect)(mapStateToProps, mapDispatchToProps), (0, _withStyles.default)(styles))(LcMsUvToolsBar);
@@ -97,7 +97,9 @@ class MultiJcampsViewer extends _react.default.Component {
97
97
  integrationSt,
98
98
  descriptions,
99
99
  canChangeDescription,
100
- onDescriptionChanged
100
+ onDescriptionChanged,
101
+ forecast,
102
+ editorOnly
101
103
  } = this.props;
102
104
  if (!entities || entities.length === 0) return /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {});
103
105
  const separateCondition = _format.default.isGCLayout(layoutSt) ? 'yUnit' : 'xUnit';
@@ -114,13 +116,18 @@ class MultiJcampsViewer extends _react.default.Component {
114
116
  integrations
115
117
  } = integrationSt;
116
118
  const currentIntegration = integrations[curveIdx];
119
+ const hasEdit = !!feature?.data?.[0]?.x?.length;
120
+ const xLabel = feature?.xUnit || '';
121
+ const yLabel = feature?.yUnit || '';
117
122
  const isCyclicVolta = _format.default.isCyclicVoltaLayout(layoutSt);
118
123
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
119
124
  className: classes.root,
120
125
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_index2.default, {
121
126
  feature: feature,
127
+ hasEdit: hasEdit,
128
+ forecast: forecast || {},
122
129
  operations: operations,
123
- editorOnly: true,
130
+ editorOnly: editorOnly,
124
131
  hideThreshold: !_format.default.isNmrLayout(layoutSt)
125
132
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
126
133
  className: (0, _classnames.default)('react-spectrum-editor', isCyclicVolta && classes.cvEditor),
@@ -136,8 +143,8 @@ class MultiJcampsViewer extends _react.default.Component {
136
143
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_index3.default, {
137
144
  entities: entities,
138
145
  topic: topic,
139
- xLabel: feature.xUnit,
140
- yLabel: feature.yUnit,
146
+ xLabel: xLabel,
147
+ yLabel: yLabel,
141
148
  feature: feature
142
149
  })
143
150
  }), isCyclicVolta ? /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
@@ -162,6 +169,7 @@ class MultiJcampsViewer extends _react.default.Component {
162
169
  subLayoutsInfo: seperatedSubLayouts,
163
170
  integration: currentIntegration,
164
171
  descriptions: descriptions,
172
+ editorOnly: editorOnly,
165
173
  canChangeDescription: canChangeDescription,
166
174
  onDescriptionChanged: onDescriptionChanged,
167
175
  hideCyclicVolta: isCyclicVolta
@@ -199,7 +207,9 @@ MultiJcampsViewer.propTypes = {
199
207
  addNewCylicVoltaPairPeakAct: _propTypes.default.func.isRequired,
200
208
  addCylicVoltaMaxPeakAct: _propTypes.default.func.isRequired,
201
209
  addCylicVoltaMinPeakAct: _propTypes.default.func.isRequired,
202
- operations: _propTypes.default.func.isRequired,
210
+ operations: _propTypes.default.array.isRequired,
211
+ forecast: _propTypes.default.object,
212
+ editorOnly: _propTypes.default.bool,
203
213
  userManualLink: _propTypes.default.object,
204
214
  entities: _propTypes.default.array,
205
215
  layoutSt: _propTypes.default.string.isRequired,
@@ -217,6 +227,8 @@ MultiJcampsViewer.defaultProps = {
217
227
  xLabel: '',
218
228
  yLabel: '',
219
229
  entities: [],
230
+ forecast: {},
231
+ editorOnly: false,
220
232
  descriptions: [],
221
233
  canChangeDescription: false
222
234
  };
@@ -10,7 +10,6 @@ var _propTypes = _interopRequireDefault(require("prop-types"));
10
10
  var _classnames = _interopRequireDefault(require("classnames"));
11
11
  var _reactRedux = require("react-redux");
12
12
  var _redux = require("redux");
13
- var _reactDropzone = _interopRequireDefault(require("react-dropzone"));
14
13
  var _material = require("@mui/material");
15
14
  var _ExpandMore = _interopRequireDefault(require("@mui/icons-material/ExpandMore"));
16
15
  var _HighlightOff = _interopRequireDefault(require("@mui/icons-material/HighlightOff"));
@@ -130,38 +129,35 @@ const content = (classes, desc) => /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.T
130
129
  children: desc
131
130
  })
132
131
  });
133
- const inputOthers = (classes, jcampSt) => {
134
- const {
135
- selectedIdx,
136
- jcamps
137
- } = jcampSt;
138
- const selectedJcamp = jcamps[selectedIdx];
139
- const {
140
- addOthersCb
141
- } = selectedJcamp;
142
- const fileName = '';
143
- const desc = fileName || msgDefault;
144
- const onDrop = jcampFiles => {
145
- if (!addOthersCb) return;
146
- addOthersCb({
147
- jcamps: jcampFiles
148
- });
149
- };
150
- return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactDropzone.default, {
151
- className: "dropbox",
152
- onDrop: onDrop,
153
- children: ({
154
- getRootProps,
155
- getInputProps
156
- }) => /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
157
- ...getRootProps(),
158
- className: (0, _classnames.default)(classes.baseDD),
159
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
160
- ...getInputProps()
161
- }), content(classes, desc)]
162
- })
163
- });
164
- };
132
+ const inputOthers = (classes, desc, onDropFiles, onFileChange, inputRef) => /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
133
+ className: (0, _classnames.default)(classes.baseDD),
134
+ role: "button",
135
+ tabIndex: 0,
136
+ onClick: () => inputRef.current?.click(),
137
+ onKeyDown: event => {
138
+ if (event.key === 'Enter' || event.key === ' ') {
139
+ event.preventDefault();
140
+ inputRef.current?.click();
141
+ }
142
+ },
143
+ onDragOver: event => {
144
+ event.preventDefault();
145
+ },
146
+ onDrop: event => {
147
+ event.preventDefault();
148
+ onDropFiles(event.dataTransfer?.files);
149
+ },
150
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("input", {
151
+ ref: inputRef,
152
+ type: "file",
153
+ multiple: true,
154
+ accept: ".dx,.jdx,.jcamp,.JCAMP",
155
+ style: {
156
+ display: 'none'
157
+ },
158
+ onChange: onFileChange
159
+ }), content(classes, desc)]
160
+ });
165
161
  const compareList = (classes, jcampSt, rmOthersOneAct, toggleShowAct) => {
166
162
  const {
167
163
  selectedIdx,
@@ -221,37 +217,63 @@ const ComparePanel = ({
221
217
  jcampSt,
222
218
  rmOthersOneAct,
223
219
  toggleShowAct
224
- }) => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Accordion, {
225
- expanded: expand,
226
- onChange: onExapnd,
227
- disableGutters: true,
228
- sx: {
229
- '&.MuiAccordion-root.Mui-expanded': {
230
- margin: 0
231
- },
232
- '&:before': {
233
- display: 'none'
220
+ }) => {
221
+ const inputRef = _react.default.useRef(null);
222
+ const {
223
+ selectedIdx,
224
+ jcamps
225
+ } = jcampSt;
226
+ const selectedJcamp = jcamps[selectedIdx];
227
+ const {
228
+ addOthersCb
229
+ } = selectedJcamp;
230
+ const desc = msgDefault;
231
+ const onDropFiles = filesLike => {
232
+ if (!addOthersCb) return;
233
+ const droppedFiles = Array.from(filesLike || []);
234
+ if (droppedFiles.length === 0) return;
235
+ addOthersCb({
236
+ jcamps: droppedFiles
237
+ });
238
+ };
239
+ const onFileChange = event => {
240
+ onDropFiles(event.target.files);
241
+ if (inputRef.current) {
242
+ inputRef.current.value = '';
234
243
  }
235
- },
236
- TransitionProps: {
237
- unmountOnExit: true
238
- } // increase Accordion performance
239
- ,
240
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.AccordionSummary, {
241
- expandIcon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ExpandMore.default, {}),
242
- className: (0, _classnames.default)(classes.panelSummary),
243
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Typography, {
244
- className: "txt-panel-header",
245
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
246
- className: (0, _classnames.default)(classes.txtBadge, 'txt-sv-panel-title'),
247
- children: "Spectra Comparisons"
244
+ };
245
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Accordion, {
246
+ expanded: expand,
247
+ onChange: onExapnd,
248
+ disableGutters: true,
249
+ sx: {
250
+ '&.MuiAccordion-root.Mui-expanded': {
251
+ margin: 0
252
+ },
253
+ '&:before': {
254
+ display: 'none'
255
+ }
256
+ },
257
+ TransitionProps: {
258
+ unmountOnExit: true
259
+ } // increase Accordion performance
260
+ ,
261
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_material.AccordionSummary, {
262
+ expandIcon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ExpandMore.default, {}),
263
+ className: (0, _classnames.default)(classes.panelSummary),
264
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Typography, {
265
+ className: "txt-panel-header",
266
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
267
+ className: (0, _classnames.default)(classes.txtBadge, 'txt-sv-panel-title'),
268
+ children: "Spectra Comparisons"
269
+ })
248
270
  })
249
- })
250
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Divider, {}), inputOthers(classes, jcampSt), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
251
- className: (0, _classnames.default)(classes.panelDetail),
252
- children: compareList(classes, jcampSt, rmOthersOneAct, toggleShowAct)
253
- })]
254
- });
271
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Divider, {}), inputOthers(classes, desc, onDropFiles, onFileChange, inputRef), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
272
+ className: (0, _classnames.default)(classes.panelDetail),
273
+ children: compareList(classes, jcampSt, rmOthersOneAct, toggleShowAct)
274
+ })]
275
+ });
276
+ };
255
277
  const mapStateToProps = (state, props) => (
256
278
  // eslint-disable-line
257
279
  {
@@ -146,7 +146,7 @@ const styles = () => ({
146
146
  });
147
147
  const CyclicVoltammetryPanel = ({
148
148
  classes,
149
- cyclicVotaSt,
149
+ cyclicVoltaState,
150
150
  feature,
151
151
  addNewPairPeakAct,
152
152
  setWorkWithMaxPeakAct,
@@ -161,24 +161,25 @@ const CyclicVoltammetryPanel = ({
161
161
  const [isExpanded, setIsExpanded] = (0, _react.useState)(false);
162
162
  const {
163
163
  spectraList
164
- } = cyclicVotaSt;
164
+ } = cyclicVoltaState;
165
165
  const spectra = spectraList[jcampIdx];
166
166
  let list = [];
167
167
  if (spectra !== undefined) {
168
168
  list = spectra.list;
169
169
  }
170
- const formatCurrent = (y, feature, cyclicVotaSt) => {
170
+ const formatCurrent = (y, feature, cyclicVoltaState) => {
171
171
  const baseY = feature && feature.yUnit ? String(feature.yUnit) : 'A';
172
172
  const isMilli = /mA/i.test(baseY);
173
- const useDensity = cyclicVotaSt && cyclicVotaSt.useCurrentDensity;
174
- const rawArea = (cyclicVotaSt && cyclicVotaSt.areaValue === '' ? 1.0 : cyclicVotaSt?.areaValue) || 1.0;
175
- const areaUnit = cyclicVotaSt && cyclicVotaSt.areaUnit ? cyclicVotaSt.areaUnit : 'cm²';
173
+ const useDensity = cyclicVoltaState && cyclicVoltaState.useCurrentDensity;
174
+ const rawArea = (cyclicVoltaState && cyclicVoltaState.areaValue === '' ? 1.0 : cyclicVoltaState?.areaValue) || 1.0;
175
+ const areaUnit = cyclicVoltaState && cyclicVoltaState.areaUnit ? cyclicVoltaState.areaUnit : 'cm²';
176
176
  const safeArea = rawArea > 0 ? rawArea : 1.0;
177
+ const areaInCm2 = areaUnit === 'mm²' ? safeArea / 100.0 : safeArea;
177
178
  let val = y;
178
179
  let unit = isMilli ? 'mA' : 'A';
179
180
  if (useDensity) {
180
- val = y / safeArea;
181
- unit = `${unit}/${areaUnit}`;
181
+ val = y / areaInCm2;
182
+ unit = `${unit}/cm²`;
182
183
  }
183
184
  if (isMilli) {
184
185
  val *= 1000.0;
@@ -226,9 +227,9 @@ const CyclicVoltammetryPanel = ({
226
227
  };
227
228
  const rows = list.map((o, idx) => ({
228
229
  idx,
229
- max: o.max ? `E: ${_format.default.strNumberFixedLength(parseFloat(o.max.x), 3)} V,\nI: ${formatCurrent(o.max.y, feature, cyclicVotaSt)}` : 'nd',
230
- min: o.min ? `E: ${_format.default.strNumberFixedLength(parseFloat(o.min.x), 3)} V,\nI: ${formatCurrent(o.min.y, feature, cyclicVotaSt)}` : 'nd',
231
- pecker: o.pecker ? `${formatCurrent(o.pecker.y, feature, cyclicVotaSt)}` : 'nd',
230
+ max: o.max ? `E: ${_format.default.strNumberFixedLength(parseFloat(o.max.x), 3)} V,\nI: ${formatCurrent(o.max.y, feature, cyclicVoltaState)}` : 'nd',
231
+ min: o.min ? `E: ${_format.default.strNumberFixedLength(parseFloat(o.min.x), 3)} V,\nI: ${formatCurrent(o.min.y, feature, cyclicVoltaState)}` : 'nd',
232
+ pecker: o.pecker ? `${formatCurrent(o.pecker.y, feature, cyclicVoltaState)}` : 'nd',
232
233
  delta: `${getDelta(o)} mV`,
233
234
  ratio: getRatio(feature, o),
234
235
  e12: typeof o.e12 === 'number' ? `${_format.default.strNumberFixedLength(o.e12, 3)} V` : 'nd',
@@ -262,7 +263,7 @@ const CyclicVoltammetryPanel = ({
262
263
  className: (0, _classnames.default)(classes.txtBadge, 'txt-sv-panel-title'),
263
264
  children: "Voltammetry data"
264
265
  }), ' - ', /*#__PURE__*/(0, _jsxRuntime.jsxs)("span", {
265
- children: ["Mode: ", cyclicVotaSt.useCurrentDensity ? 'Current Density' : 'Current']
266
+ children: ["Mode: ", cyclicVoltaState.useCurrentDensity ? 'Current Density' : 'Current']
266
267
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
267
268
  className: classes.cvModeWarning,
268
269
  children: "WE-ECSA must be set when switching to Current Density."
@@ -436,7 +437,7 @@ const CyclicVoltammetryPanel = ({
436
437
  const mapStateToProps = (state, props) => (
437
438
  // eslint-disable-line
438
439
  {
439
- cyclicVotaSt: state.cyclicvolta,
440
+ cyclicVoltaState: state.cyclicvolta,
440
441
  sweepTypeSt: state.ui.sweepType
441
442
  });
442
443
  const mapDispatchToProps = dispatch => (0, _redux.bindActionCreators)({
@@ -450,7 +451,7 @@ const mapDispatchToProps = dispatch => (0, _redux.bindActionCreators)({
450
451
  CyclicVoltammetryPanel.propTypes = {
451
452
  classes: _propTypes.default.object.isRequired,
452
453
  feature: _propTypes.default.object.isRequired,
453
- cyclicVotaSt: _propTypes.default.object.isRequired,
454
+ cyclicVoltaState: _propTypes.default.object.isRequired,
454
455
  addNewPairPeakAct: _propTypes.default.func.isRequired,
455
456
  setWorkWithMaxPeakAct: _propTypes.default.func.isRequired,
456
457
  selectPairPeakAct: _propTypes.default.func.isRequired,