@complat/react-spectra-editor 1.7.1 → 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.
- package/CHANGELOG.md +28 -0
- package/LICENSE +21 -662
- package/README.md +5 -0
- package/dist/__tests__/fixtures/lc_ms_jcamp.js +2329 -0
- package/dist/__tests__/fixtures/lc_ms_jcamp_2.js +2874 -0
- package/dist/__tests__/fixtures/lc_ms_jcamp_mz_chemstation.js +3242 -0
- package/dist/__tests__/fixtures/lc_ms_jcamp_tic_chemstation.js +854 -0
- package/dist/__tests__/fixtures/lc_ms_jcamp_tic_neg.js +1233 -0
- package/dist/__tests__/fixtures/lc_ms_jcamp_tic_pos.js +1233 -0
- package/dist/__tests__/fixtures/lc_ms_jcamp_uvvis.js +48908 -0
- package/dist/__tests__/fixtures/lc_ms_jcamp_uvvis_chemstation.js +15424 -0
- package/dist/__tests__/units/components/cmd_bar/r05_submit_btn.test.js +158 -3
- package/dist/__tests__/units/components/d3_line_rect.test.js +85 -0
- package/dist/__tests__/units/components/d3_multi/multi_focus.test.js +43 -0
- package/dist/__tests__/units/components/hplc_viewer.test.js +123 -0
- package/dist/__tests__/units/components/panel/info.test.js +55 -15
- package/dist/__tests__/units/features/lc-ms/parsing/lcmsCategory.test.js +73 -0
- package/dist/__tests__/units/features/lc-ms/submit/peaks.test.js +310 -0
- package/dist/actions/curve.js +5 -2
- package/dist/actions/hplc_ms.js +66 -0
- package/dist/actions/integration.js +17 -2
- package/dist/actions/ui.js +39 -11
- package/dist/app.js +21 -8
- package/dist/components/cmd_bar/01_viewer.js +15 -11
- package/dist/components/cmd_bar/03_peak.js +25 -16
- package/dist/components/cmd_bar/04_integration.js +116 -17
- package/dist/components/cmd_bar/08_peak_group.js +83 -0
- package/dist/components/cmd_bar/collapsible_toolbar_group.js +101 -0
- package/dist/components/cmd_bar/common.js +4 -3
- package/dist/components/cmd_bar/index.js +76 -18
- package/dist/components/cmd_bar/r01_layout.js +6 -0
- package/dist/components/cmd_bar/r02_scan.js +15 -11
- package/dist/components/cmd_bar/r03_threshold.js +19 -3
- package/dist/components/cmd_bar/r04_submit.js +61 -6
- package/dist/components/cmd_bar/r05_submit_btn.js +60 -13
- package/dist/components/cmd_bar/r06_predict_btn.js +4 -4
- package/dist/components/cmd_bar/r07_wavelength_btn.js +10 -9
- package/dist/components/cmd_bar/r09_detector.js +2 -2
- package/dist/components/cmd_bar/tri_btn.js +4 -1
- package/dist/components/common/draw.js +6 -5
- package/dist/components/d3_line/index.js +70 -15
- package/dist/components/d3_line/line_focus.js +104 -67
- package/dist/components/d3_line_rect/index.js +836 -0
- package/dist/components/d3_line_rect/line_focus.js +526 -0
- package/dist/components/d3_line_rect/multi_focus.js +433 -0
- package/dist/components/d3_line_rect/rect_focus.js +247 -0
- package/dist/components/d3_multi/index.js +154 -163
- package/dist/components/d3_multi/multi_focus.js +117 -68
- package/dist/components/d3_rect/index.js +6 -0
- package/dist/components/d3_rect/rect_focus.js +17 -5
- package/dist/components/hplc_viewer.js +169 -0
- package/dist/components/lc_ms_uv_tools_bar.js +175 -0
- package/dist/components/multi_jcamps_viewer.js +17 -5
- package/dist/components/panel/compare.js +84 -62
- package/dist/components/panel/cyclic_voltamery_data.js +15 -14
- package/dist/components/panel/graph_selection.js +32 -30
- package/dist/components/panel/index.js +28 -22
- package/dist/components/panel/info.js +75 -26
- package/dist/constants/action_type.js +23 -2
- package/dist/constants/list_graph.js +16 -0
- package/dist/constants/list_layout.js +2 -1
- package/dist/constants/list_ui.js +5 -2
- package/dist/features/lc-ms/entities/extractEntityLCMS.js +187 -0
- package/dist/features/lc-ms/parsing/chemstation.js +108 -0
- package/dist/features/lc-ms/parsing/index.js +46 -0
- package/dist/features/lc-ms/parsing/lcmsCategory.js +44 -0
- package/dist/features/lc-ms/parsing/lcmsJcampInfo.js +18 -0
- package/dist/features/lc-ms/parsing/lcmsMsPage.js +241 -0
- package/dist/features/lc-ms/parsing/pageValue.js +27 -0
- package/dist/features/lc-ms/submit/index.js +24 -0
- package/dist/features/lc-ms/submit/peaks.js +66 -0
- package/dist/features/lc-ms/ui/wavelengthSelect.js +54 -0
- package/dist/fn.js +4 -1
- package/dist/helpers/brush.js +74 -19
- package/dist/helpers/calc.js +4 -2
- package/dist/helpers/cfg.js +5 -4
- package/dist/helpers/chem.js +449 -71
- package/dist/helpers/compass.js +181 -17
- package/dist/helpers/extractEntityLCMS.js +24 -0
- package/dist/helpers/extractParams.js +118 -33
- package/dist/helpers/extractPeaksEdit.js +29 -9
- package/dist/helpers/format.js +189 -4
- package/dist/helpers/init.js +25 -5
- package/dist/helpers/integration.js +130 -17
- package/dist/helpers/integration_draft.js +43 -0
- package/dist/helpers/integration_focus.js +155 -0
- package/dist/helpers/integration_jcamp.js +68 -0
- package/dist/helpers/integration_split.js +202 -0
- package/dist/helpers/mount.js +8 -1
- package/dist/helpers/sweep.js +39 -0
- package/dist/index.js +284 -26
- package/dist/layer_content.js +17 -3
- package/dist/layer_init.js +124 -14
- package/dist/layer_prism.js +31 -5
- package/dist/reducers/index.js +3 -1
- package/dist/reducers/reducer_curve.js +54 -36
- package/dist/reducers/reducer_hplc_ms/hydrate.js +289 -0
- package/dist/reducers/reducer_hplc_ms/index.js +122 -0
- package/dist/reducers/reducer_hplc_ms/persistence.js +74 -0
- package/dist/reducers/reducer_hplc_ms/tic.js +70 -0
- package/dist/reducers/reducer_hplc_ms/utils.js +70 -0
- package/dist/reducers/reducer_hplc_ms/uvvis.js +377 -0
- package/dist/reducers/reducer_integration.js +265 -7
- package/dist/reducers/reducer_layout.js +1 -1
- package/dist/reducers/reducer_submit.js +2 -1
- package/dist/reducers/reducer_ui.js +149 -13
- package/dist/reducers/undo_redo_config.js +2 -2
- package/dist/sagas/saga_lcms_ui.js +85 -0
- package/dist/sagas/saga_ui.js +177 -74
- package/dist/setupTests.js +5 -5
- 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:
|
|
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:
|
|
140
|
-
yLabel:
|
|
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.
|
|
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,
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
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
|
-
}) =>
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
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
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
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
|
-
|
|
251
|
-
|
|
252
|
-
|
|
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
|
-
|
|
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
|
-
} =
|
|
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,
|
|
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 =
|
|
174
|
-
const rawArea = (
|
|
175
|
-
const areaUnit =
|
|
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 /
|
|
181
|
-
unit = `${unit}
|
|
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,
|
|
230
|
-
min: o.min ? `E: ${_format.default.strNumberFixedLength(parseFloat(o.min.x), 3)} V,\nI: ${formatCurrent(o.min.y, feature,
|
|
231
|
-
pecker: o.pecker ? `${formatCurrent(o.pecker.y, feature,
|
|
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: ",
|
|
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
|
-
|
|
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
|
-
|
|
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,
|