@complat/react-spectra-editor 1.2.2 → 1.3.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.
@@ -68,10 +68,13 @@ class ViewerLine extends _react.default.Component {
68
68
  let xxLabel = xLabel;
69
69
  let yyLabel = yLabel;
70
70
  if (axesUnitsSt) {
71
+ const {
72
+ axes
73
+ } = axesUnitsSt;
71
74
  const {
72
75
  xUnit,
73
76
  yUnit
74
- } = axesUnitsSt;
77
+ } = axes[0];
75
78
  xxLabel = xUnit === '' ? xLabel : xUnit;
76
79
  yyLabel = yUnit === '' ? yLabel : yUnit;
77
80
  }
@@ -123,10 +126,13 @@ class ViewerLine extends _react.default.Component {
123
126
  let xxLabel = xLabel;
124
127
  let yyLabel = yLabel;
125
128
  if (axesUnitsSt) {
129
+ const {
130
+ axes
131
+ } = axesUnitsSt;
126
132
  const {
127
133
  xUnit,
128
134
  yUnit
129
- } = axesUnitsSt;
135
+ } = axes[0];
130
136
  xxLabel = xUnit === '' ? xLabel : xUnit;
131
137
  yyLabel = yUnit === '' ? yLabel : yUnit;
132
138
  }
@@ -596,7 +596,7 @@ class LineFocus {
596
596
  return null;
597
597
  }
598
598
  reverseXAxis(layoutSt) {
599
- return [_list_layout.LIST_LAYOUT.UVVIS, _list_layout.LIST_LAYOUT.HPLC_UVVIS, _list_layout.LIST_LAYOUT.TGA, _list_layout.LIST_LAYOUT.XRD, _list_layout.LIST_LAYOUT.CYCLIC_VOLTAMMETRY, _list_layout.LIST_LAYOUT.CDS, _list_layout.LIST_LAYOUT.DLS_ACF, _list_layout.LIST_LAYOUT.SEC, _list_layout.LIST_LAYOUT.EMISSIONS, _list_layout.LIST_LAYOUT.DLS_INTENSITY].indexOf(layoutSt) < 0;
599
+ return [_list_layout.LIST_LAYOUT.UVVIS, _list_layout.LIST_LAYOUT.HPLC_UVVIS, _list_layout.LIST_LAYOUT.TGA, _list_layout.LIST_LAYOUT.DSC, _list_layout.LIST_LAYOUT.XRD, _list_layout.LIST_LAYOUT.CYCLIC_VOLTAMMETRY, _list_layout.LIST_LAYOUT.CDS, _list_layout.LIST_LAYOUT.DLS_ACF, _list_layout.LIST_LAYOUT.SEC, _list_layout.LIST_LAYOUT.EMISSIONS, _list_layout.LIST_LAYOUT.DLS_INTENSITY].indexOf(layoutSt) < 0;
600
600
  }
601
601
  create(_ref) {
602
602
  let {
@@ -69,10 +69,23 @@ class ViewerMulti extends _react.default.Component {
69
69
  let xxLabel = xLabel;
70
70
  let yyLabel = yLabel;
71
71
  if (axesUnitsSt) {
72
+ const {
73
+ curveIdx
74
+ } = curveSt;
75
+ const {
76
+ axes
77
+ } = axesUnitsSt;
78
+ let selectedAxes = axes[curveIdx];
79
+ if (!selectedAxes) {
80
+ selectedAxes = {
81
+ xUnit: '',
82
+ yUnit: ''
83
+ };
84
+ }
72
85
  const {
73
86
  xUnit,
74
87
  yUnit
75
- } = axesUnitsSt;
88
+ } = selectedAxes;
76
89
  xxLabel = xUnit === '' ? xLabel : xUnit;
77
90
  yyLabel = yUnit === '' ? yLabel : yUnit;
78
91
  }
@@ -122,10 +135,23 @@ class ViewerMulti extends _react.default.Component {
122
135
  let xxLabel = xLabel;
123
136
  let yyLabel = yLabel;
124
137
  if (axesUnitsSt) {
138
+ const {
139
+ curveIdx
140
+ } = curveSt;
141
+ const {
142
+ axes
143
+ } = axesUnitsSt;
144
+ let selectedAxes = axes[curveIdx];
145
+ if (!selectedAxes) {
146
+ selectedAxes = {
147
+ xUnit: '',
148
+ yUnit: ''
149
+ };
150
+ }
125
151
  const {
126
152
  xUnit,
127
153
  yUnit
128
- } = axesUnitsSt;
154
+ } = selectedAxes;
129
155
  xxLabel = xUnit === '' ? xLabel : xUnit;
130
156
  yyLabel = yUnit === '' ? yLabel : yUnit;
131
157
  }
@@ -388,6 +388,29 @@ class MultiFocus {
388
388
  yt
389
389
  } = (0, _compass.TfRescale)(this);
390
390
  const dPks = this.mergedPeaks(editPeakSt);
391
+ const {
392
+ spectraList
393
+ } = this.cyclicvoltaSt;
394
+ const spectra = spectraList[this.jcampIdx];
395
+ let indexOfCVRefPeaks = [];
396
+ if (spectra) {
397
+ const {
398
+ shift,
399
+ hasRefPeak
400
+ } = spectra;
401
+ const {
402
+ ref
403
+ } = shift;
404
+ if (ref && hasRefPeak) {
405
+ const {
406
+ min,
407
+ max
408
+ } = ref;
409
+ indexOfCVRefPeaks = dPks.map((p, index) => {
410
+ return p === min || p === max ? -1 : index;
411
+ });
412
+ }
413
+ }
391
414
  const mpp = this.tags.pPath.selectAll('path').data(dPks);
392
415
  mpp.exit().attr('class', 'exit').remove();
393
416
  const linePath = [{
@@ -404,7 +427,25 @@ class MultiFocus {
404
427
  y: 10
405
428
  }];
406
429
  const lineSymbol = d3.line().x(d => d.x).y(d => d.y)(linePath);
407
- mpp.enter().append('path').attr('d', lineSymbol).attr('class', 'enter-peak').attr('fill', 'red').attr('stroke', 'pink').attr('stroke-width', 3).attr('stroke-opacity', 0.0).merge(mpp).attr('id', d => `mpp${Math.round(1000 * d.x)}`).attr('transform', d => `translate(${xt(d.x)}, ${yt(d.y)})`).on('mouseover', (event, d) => {
430
+ const lineRefPath = [{
431
+ x: -0.5,
432
+ y: 10
433
+ }, {
434
+ x: -4,
435
+ y: -20
436
+ }, {
437
+ x: 4,
438
+ y: -20
439
+ }, {
440
+ x: 0.5,
441
+ y: 10
442
+ }];
443
+ const lineSymbolRef = d3.line().x(d => d.x).y(d => d.y)(lineRefPath);
444
+ mpp.enter().append('path').attr('d', (_, index) => {
445
+ return indexOfCVRefPeaks[index] === -1 ? lineSymbolRef : lineSymbol;
446
+ }).attr('class', 'enter-peak').attr('fill', (_, index) => {
447
+ return indexOfCVRefPeaks[index] === -1 ? 'blue' : 'red';
448
+ }).attr('stroke', 'pink').attr('stroke-width', 3).attr('stroke-opacity', 0.0).merge(mpp).attr('id', d => `mpp${Math.round(1000 * d.x)}`).attr('transform', d => `translate(${xt(d.x)}, ${yt(d.y)})`).on('mouseover', (event, d) => {
408
449
  d3.select(`#mpp${Math.round(1000 * d.x)}`).attr('stroke-opacity', '1.0');
409
450
  d3.select(`#bpt${Math.round(1000 * d.x)}`).style('fill', 'blue');
410
451
  const tipParams = {
@@ -427,6 +468,12 @@ class MultiFocus {
427
468
  bpTxt.exit().attr('class', 'exit').remove();
428
469
  bpTxt.enter().append('text').attr('class', 'peak-text').attr('font-family', 'Helvetica').style('font-size', '12px').attr('fill', '#228B22').style('text-anchor', 'middle').merge(bpTxt).attr('id', d => `mpp${Math.round(1000 * d.x)}`).text(d => d.x.toFixed(2)).attr('transform', d => `translate(${xt(d.x)}, ${yt(d.y) - 25})`).on('click', (event, d) => this.onClickTarget(event, d));
429
470
  }
471
+ mpp.attr('fill', (_, index) => {
472
+ return indexOfCVRefPeaks[index] === -1 ? 'blue' : 'red';
473
+ });
474
+ mpp.attr('d', (_, index) => {
475
+ return indexOfCVRefPeaks[index] === -1 ? lineSymbolRef : lineSymbol;
476
+ });
430
477
  }
431
478
  drawPeckers() {
432
479
  const {
@@ -738,7 +785,7 @@ class MultiFocus {
738
785
  ccp.enter().append('path').attr('d', lineSymbol).attr('class', 'enter-ref').attr('fill', 'green').attr('fill-opacity', 0.8).merge(ccp).attr('transform', d => `translate(${xt(d.x)}, ${yt(d.y)})`);
739
786
  }
740
787
  reverseXAxis(layoutSt) {
741
- return [_list_layout.LIST_LAYOUT.UVVIS, _list_layout.LIST_LAYOUT.HPLC_UVVIS, _list_layout.LIST_LAYOUT.TGA, _list_layout.LIST_LAYOUT.XRD, _list_layout.LIST_LAYOUT.CYCLIC_VOLTAMMETRY, _list_layout.LIST_LAYOUT.CDS, _list_layout.LIST_LAYOUT.SEC, _list_layout.LIST_LAYOUT.AIF].indexOf(layoutSt) < 0;
788
+ return [_list_layout.LIST_LAYOUT.UVVIS, _list_layout.LIST_LAYOUT.HPLC_UVVIS, _list_layout.LIST_LAYOUT.TGA, _list_layout.LIST_LAYOUT.DSC, _list_layout.LIST_LAYOUT.XRD, _list_layout.LIST_LAYOUT.CYCLIC_VOLTAMMETRY, _list_layout.LIST_LAYOUT.CDS, _list_layout.LIST_LAYOUT.SEC, _list_layout.LIST_LAYOUT.AIF].indexOf(layoutSt) < 0;
742
789
  }
743
790
  create(_ref) {
744
791
  let {
@@ -188,10 +188,10 @@ const CyclicVoltammetryPanel = _ref => {
188
188
  }, "Ref"), /*#__PURE__*/_react.default.createElement(_material.TableCell, {
189
189
  align: "left",
190
190
  className: (0, _classnames.default)(classes.tTxt, classes.square, 'txt-sv-panel-txt')
191
- }, "Ox"), /*#__PURE__*/_react.default.createElement(_material.TableCell, {
191
+ }, "Anodic"), /*#__PURE__*/_react.default.createElement(_material.TableCell, {
192
192
  align: "left",
193
193
  className: (0, _classnames.default)(classes.tTxt, classes.square, 'txt-sv-panel-txt')
194
- }, "Red"), /*#__PURE__*/_react.default.createElement(_material.TableCell, {
194
+ }, "Cathodic"), /*#__PURE__*/_react.default.createElement(_material.TableCell, {
195
195
  align: "left",
196
196
  className: (0, _classnames.default)(classes.tTxt, classes.square, 'txt-sv-panel-txt')
197
197
  }, "I ", /*#__PURE__*/_react.default.createElement("sub", null, "\u03BB0"), /*#__PURE__*/_react.default.createElement(_material.Tooltip, {
@@ -16,8 +16,9 @@ var _material = require("@mui/material");
16
16
  var _ExpandMore = _interopRequireDefault(require("@mui/icons-material/ExpandMore"));
17
17
  var _styles = require("@mui/styles");
18
18
  var _format = _interopRequireDefault(require("../../helpers/format"));
19
+ var _meta = require("../../actions/meta");
19
20
  /* eslint-disable no-mixed-operators, react/function-component-definition,
20
- react/require-default-props */
21
+ react/require-default-props, max-len */
21
22
 
22
23
  const styles = () => ({
23
24
  chip: {
@@ -109,7 +110,115 @@ const aucValue = integration => {
109
110
  }
110
111
  return values.join(', ');
111
112
  };
112
- const InfoPanel = _ref => {
113
+ const SECData = _ref => {
114
+ let {
115
+ classes,
116
+ layout,
117
+ detector,
118
+ secData
119
+ } = _ref;
120
+ if (_format.default.isSECLayout(layout) && secData) {
121
+ const {
122
+ d,
123
+ mn,
124
+ mp,
125
+ mw
126
+ } = secData;
127
+ return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
128
+ className: (0, _classnames.default)(classes.rowRoot, classes.rowOdd)
129
+ }, /*#__PURE__*/_react.default.createElement("span", {
130
+ className: (0, _classnames.default)(classes.tTxt, classes.tHead, 'txt-sv-panel-txt')
131
+ }, "Detector: "), /*#__PURE__*/_react.default.createElement("span", {
132
+ className: (0, _classnames.default)(classes.tTxt, 'txt-sv-panel-txt')
133
+ }, detector)), /*#__PURE__*/_react.default.createElement("div", {
134
+ className: (0, _classnames.default)(classes.rowRoot, classes.rowEven)
135
+ }, /*#__PURE__*/_react.default.createElement("span", {
136
+ className: (0, _classnames.default)(classes.tTxt, classes.tHead, 'txt-sv-panel-txt')
137
+ }, "D: "), /*#__PURE__*/_react.default.createElement("span", {
138
+ className: (0, _classnames.default)(classes.tTxt, 'txt-sv-panel-txt')
139
+ }, d)), /*#__PURE__*/_react.default.createElement("div", {
140
+ className: (0, _classnames.default)(classes.rowRoot, classes.rowOdd)
141
+ }, /*#__PURE__*/_react.default.createElement("span", {
142
+ className: (0, _classnames.default)(classes.tTxt, classes.tHead, 'txt-sv-panel-txt')
143
+ }, "MN: "), /*#__PURE__*/_react.default.createElement("span", {
144
+ className: (0, _classnames.default)(classes.tTxt, 'txt-sv-panel-txt')
145
+ }, mn)), /*#__PURE__*/_react.default.createElement("div", {
146
+ className: (0, _classnames.default)(classes.rowRoot, classes.rowEven)
147
+ }, /*#__PURE__*/_react.default.createElement("span", {
148
+ className: (0, _classnames.default)(classes.tTxt, classes.tHead, 'txt-sv-panel-txt')
149
+ }, "MP: "), /*#__PURE__*/_react.default.createElement("span", {
150
+ className: (0, _classnames.default)(classes.tTxt, 'txt-sv-panel-txt')
151
+ }, mp)), /*#__PURE__*/_react.default.createElement("div", {
152
+ className: (0, _classnames.default)(classes.rowRoot, classes.rowOdd)
153
+ }, /*#__PURE__*/_react.default.createElement("span", {
154
+ className: (0, _classnames.default)(classes.tTxt, classes.tHead, 'txt-sv-panel-txt')
155
+ }, "MW: "), /*#__PURE__*/_react.default.createElement("span", {
156
+ className: (0, _classnames.default)(classes.tTxt, 'txt-sv-panel-txt')
157
+ }, mw)));
158
+ }
159
+ return null;
160
+ };
161
+ SECData.propTypes = {
162
+ classes: _propTypes.default.object.isRequired,
163
+ layout: _propTypes.default.string.isRequired,
164
+ detector: _propTypes.default.object.isRequired,
165
+ secData: _propTypes.default.object.isRequired
166
+ };
167
+ const DSCData = _ref2 => {
168
+ let {
169
+ classes,
170
+ layout,
171
+ dscMetaData,
172
+ updateAction
173
+ } = _ref2;
174
+ if (_format.default.isDSCLayout(layout) && dscMetaData !== undefined) {
175
+ const {
176
+ meltingPoint,
177
+ tg
178
+ } = dscMetaData;
179
+ const onChange = e => {
180
+ const {
181
+ name,
182
+ value
183
+ } = e.target;
184
+ const dataToUpdate = {
185
+ meltingPoint,
186
+ tg
187
+ };
188
+ dataToUpdate[name] = value;
189
+ updateAction(dataToUpdate);
190
+ };
191
+ return /*#__PURE__*/_react.default.createElement("div", null, /*#__PURE__*/_react.default.createElement("div", {
192
+ className: (0, _classnames.default)(classes.rowRoot, classes.rowOdd)
193
+ }, /*#__PURE__*/_react.default.createElement("span", {
194
+ className: (0, _classnames.default)(classes.tTxt, classes.tHead, 'txt-sv-panel-txt')
195
+ }, "Melting Point: "), /*#__PURE__*/_react.default.createElement("input", {
196
+ type: "text",
197
+ name: "meltingPoint",
198
+ className: (0, _classnames.default)(classes.tTxt, 'txt-sv-panel-txt'),
199
+ value: meltingPoint,
200
+ onChange: onChange
201
+ })), /*#__PURE__*/_react.default.createElement("div", {
202
+ className: (0, _classnames.default)(classes.rowRoot, classes.rowEven)
203
+ }, /*#__PURE__*/_react.default.createElement("span", {
204
+ className: (0, _classnames.default)(classes.tTxt, classes.tHead, 'txt-sv-panel-txt')
205
+ }, "TG: "), /*#__PURE__*/_react.default.createElement("input", {
206
+ type: "text",
207
+ name: "tg",
208
+ className: (0, _classnames.default)(classes.tTxt, 'txt-sv-panel-txt'),
209
+ value: tg,
210
+ onChange: onChange
211
+ })));
212
+ }
213
+ return null;
214
+ };
215
+ DSCData.propTypes = {
216
+ classes: _propTypes.default.object.isRequired,
217
+ layout: _propTypes.default.string.isRequired,
218
+ dscMetaData: _propTypes.default.object.isRequired,
219
+ updateAction: _propTypes.default.func.isRequired
220
+ };
221
+ const InfoPanel = _ref3 => {
113
222
  let {
114
223
  classes,
115
224
  expand,
@@ -126,14 +235,20 @@ const InfoPanel = _ref => {
126
235
  onExapnd,
127
236
  canChangeDescription,
128
237
  onDescriptionChanged,
129
- detectorSt
130
- } = _ref;
238
+ detectorSt,
239
+ metaSt,
240
+ updateDSCMetaDataAct
241
+ } = _ref3;
131
242
  if (!feature) return null;
132
243
  const {
133
244
  title,
134
245
  observeFrequency,
135
- solventName
246
+ solventName,
247
+ secData
136
248
  } = feature;
249
+ const {
250
+ dscMetaData
251
+ } = metaSt;
137
252
  const {
138
253
  curveIdx
139
254
  } = curveSt;
@@ -204,13 +319,12 @@ const InfoPanel = _ref => {
204
319
  className: (0, _classnames.default)(classes.tTxt, classes.tHead, 'txt-sv-panel-txt')
205
320
  }, "Theoretical mass: "), /*#__PURE__*/_react.default.createElement("span", {
206
321
  className: (0, _classnames.default)(classes.tTxt, 'txt-sv-panel-txt')
207
- }, `${parseFloat(theoryMass).toFixed(6)} g/mol`)) : null, _format.default.isSECLayout(layoutSt) ? /*#__PURE__*/_react.default.createElement("div", {
208
- className: (0, _classnames.default)(classes.rowRoot, classes.rowOdd)
209
- }, /*#__PURE__*/_react.default.createElement("span", {
210
- className: (0, _classnames.default)(classes.tTxt, classes.tHead, 'txt-sv-panel-txt')
211
- }, "Detector: "), /*#__PURE__*/_react.default.createElement("span", {
212
- className: (0, _classnames.default)(classes.tTxt, 'txt-sv-panel-txt')
213
- }, selectedDetector)) : null, !molSvg ? null : /*#__PURE__*/_react.default.createElement(_reactSvgFileZoomPan.default, {
322
+ }, `${parseFloat(theoryMass).toFixed(6)} g/mol`)) : null, /*#__PURE__*/_react.default.createElement(SECData, {
323
+ classes: classes,
324
+ layout: layoutSt,
325
+ detector: selectedDetector,
326
+ secData: secData
327
+ }), !molSvg ? null : /*#__PURE__*/_react.default.createElement(_reactSvgFileZoomPan.default, {
214
328
  svg: molSvg,
215
329
  duration: 300,
216
330
  resize: true
@@ -220,7 +334,12 @@ const InfoPanel = _ref => {
220
334
  className: (0, _classnames.default)(classes.tTxt, classes.tHead, 'txt-sv-panel-txt')
221
335
  }, "Area under curve (AUC):"), /*#__PURE__*/_react.default.createElement("br", null), /*#__PURE__*/_react.default.createElement("span", {
222
336
  className: (0, _classnames.default)(classes.tTxt, classes.tTxtSim, 'txt-sv-panel-txt')
223
- }, aucValue(integration))) : null), !_format.default.isCyclicVoltaLayout(layoutSt) ? /*#__PURE__*/_react.default.createElement(_reactQuill.default, {
337
+ }, aucValue(integration))) : null, /*#__PURE__*/_react.default.createElement(DSCData, {
338
+ classes: classes,
339
+ layout: layoutSt,
340
+ dscMetaData: dscMetaData,
341
+ updateAction: updateDSCMetaDataAct
342
+ })), !_format.default.isCyclicVoltaLayout(layoutSt) ? /*#__PURE__*/_react.default.createElement(_reactQuill.default, {
224
343
  className: (0, _classnames.default)(classes.quill, 'card-sv-quill'),
225
344
  value: descriptions,
226
345
  modules: {
@@ -243,9 +362,12 @@ const mapStateToProps = (state, props) => (
243
362
  simulationSt: state.simulation,
244
363
  shiftSt: state.shift,
245
364
  curveSt: state.curve,
246
- detectorSt: state.detector
365
+ detectorSt: state.detector,
366
+ metaSt: state.meta
247
367
  });
248
- const mapDispatchToProps = dispatch => (0, _redux.bindActionCreators)({}, dispatch);
368
+ const mapDispatchToProps = dispatch => (0, _redux.bindActionCreators)({
369
+ updateDSCMetaDataAct: _meta.updateDSCMetaData
370
+ }, dispatch);
249
371
  InfoPanel.propTypes = {
250
372
  classes: _propTypes.default.object.isRequired,
251
373
  expand: _propTypes.default.bool.isRequired,
@@ -262,7 +384,9 @@ InfoPanel.propTypes = {
262
384
  canChangeDescription: _propTypes.default.bool.isRequired,
263
385
  onDescriptionChanged: _propTypes.default.func,
264
386
  theoryMass: _propTypes.default.string,
265
- detectorSt: _propTypes.default.object.isRequired
387
+ detectorSt: _propTypes.default.object.isRequired,
388
+ metaSt: _propTypes.default.object.isRequired,
389
+ updateDSCMetaDataAct: _propTypes.default.func.isRequired
266
390
  };
267
391
  var _default = exports.default = (0, _reactRedux.connect)(
268
392
  // eslint-disable-line
@@ -106,7 +106,9 @@ const MULTIPLICITY = exports.MULTIPLICITY = {
106
106
  };
107
107
  const META = exports.META = {
108
108
  UPDATE_PEAKS: 'META_UPDATE_PEAKS',
109
- UPDATE_PEAKS_RDC: 'META_UPDATE_PEAKS_RDC'
109
+ UPDATE_PEAKS_RDC: 'META_UPDATE_PEAKS_RDC',
110
+ UPDATE_META_DATA: 'UPDATE_META_DATA',
111
+ UPDATE_META_DATA_RDC: 'UPDATE_META_DATA_RDC'
110
112
  };
111
113
  const JCAMP = exports.JCAMP = {
112
114
  ADD_OTHERS: 'JCAMP_ADD_OTHERS',
@@ -25,5 +25,6 @@ const LIST_LAYOUT = exports.LIST_LAYOUT = {
25
25
  AIF: 'AIF',
26
26
  EMISSIONS: 'Emissions',
27
27
  DLS_ACF: 'DLS ACF',
28
- DLS_INTENSITY: 'DLS intensity'
28
+ DLS_INTENSITY: 'DLS intensity',
29
+ DSC: 'DIFFERENTIAL SCANNING CALORIMETRY'
29
30
  };
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.default = void 0;
8
8
  var _format = _interopRequireDefault(require("./format"));
9
- const btnCmdAnaViewer = layoutSt => _format.default.isMsLayout(layoutSt) || _format.default.isRamanLayout(layoutSt) || _format.default.is19FLayout(layoutSt) || _format.default.isUvVisLayout(layoutSt) || _format.default.isHplcUvVisLayout(layoutSt) || _format.default.isTGALayout(layoutSt) || _format.default.isXRDLayout(layoutSt) || _format.default.is31PLayout(layoutSt) || _format.default.is15NLayout(layoutSt) || _format.default.is29SiLayout(layoutSt) || _format.default.isCyclicVoltaLayout(layoutSt) || _format.default.isCDSLayout(layoutSt) || _format.default.isSECLayout(layoutSt);
9
+ const btnCmdAnaViewer = layoutSt => _format.default.isMsLayout(layoutSt) || _format.default.isRamanLayout(layoutSt) || _format.default.is19FLayout(layoutSt) || _format.default.isUvVisLayout(layoutSt) || _format.default.isHplcUvVisLayout(layoutSt) || _format.default.isTGALayout(layoutSt) || _format.default.isDSCLayout(layoutSt) || _format.default.isXRDLayout(layoutSt) || _format.default.is31PLayout(layoutSt) || _format.default.is15NLayout(layoutSt) || _format.default.is29SiLayout(layoutSt) || _format.default.isCyclicVoltaLayout(layoutSt) || _format.default.isCDSLayout(layoutSt) || _format.default.isSECLayout(layoutSt);
10
10
  const hideCmdAnaViewer = () => false;
11
11
  const btnCmdAddPeak = layoutSt => _format.default.isMsLayout(layoutSt);
12
12
  const btnCmdRmPeak = layoutSt => _format.default.isMsLayout(layoutSt);
@@ -14,7 +14,8 @@ var _list_layout = require("../constants/list_layout");
14
14
  var _integration = require("./integration");
15
15
  /* eslint-disable
16
16
  no-mixed-operators, react/function-component-definition,
17
- prefer-object-spread, camelcase, no-plusplus, prefer-destructuring */
17
+ prefer-object-spread, camelcase, no-plusplus, prefer-destructuring,
18
+ max-len */
18
19
 
19
20
  const getTopic = (_, props) => props.topic;
20
21
  const getFeature = (_, props) => props.feature;
@@ -271,32 +272,6 @@ const Convert2MaxMinPeak = (layout, feature, offset) => {
271
272
  peaks.refIndex = refIndex;
272
273
  return peaks;
273
274
  }
274
-
275
- // // let upperThresVal = upperThres;
276
- // // if (!upperThresVal) {
277
- // // upperThresVal = 1.0;
278
- // // }
279
-
280
- // // let lowerThresVal = lowerThres;
281
- // // if (!lowerThresVal) {
282
- // // lowerThresVal = 1.0;
283
- // // }
284
-
285
- // // const yUpperThres = parseFloat(upperThresVal) / 100.0 * maxY;
286
- // // const yLowerThres = parseFloat(lowerThresVal) / 100.0 * minY;
287
-
288
- // // const corrOffset = offset || 0.0;
289
- // // for (let i = 0; i < data.y.length; i += 1) {
290
- // // const y = data.y[i];
291
- // // const overUpperThres = y >= yUpperThres;
292
- // // const belowThres = y <= yLowerThres;
293
- // // const x = data.x[i] - corrOffset;
294
- // // if (overUpperThres) {
295
- // // peaks.max.push({ x, y });
296
- // // } else if (belowThres) {
297
- // // peaks.min.push({ x, y });
298
- // // }
299
- // // }
300
275
  return peaks;
301
276
  };
302
277
  exports.Convert2MaxMinPeak = Convert2MaxMinPeak;
@@ -375,6 +350,9 @@ const readLayout = jcamp => {
375
350
  if (dataType.includes('THERMOGRAVIMETRIC ANALYSIS')) {
376
351
  return _list_layout.LIST_LAYOUT.TGA;
377
352
  }
353
+ if (dataType.includes('DIFFERENTIAL SCANNING CALORIMETRY')) {
354
+ return _list_layout.LIST_LAYOUT.DSC;
355
+ }
378
356
  if (dataType.includes('X-RAY DIFFRACTION')) {
379
357
  return _list_layout.LIST_LAYOUT.XRD;
380
358
  }
@@ -539,7 +517,8 @@ const buildPeakFeature = function (jcamp, layout, peakUp, s, thresRef) {
539
517
  solventName: info['.SOLVENTNAME'],
540
518
  upperThres,
541
519
  lowerThres,
542
- volammetryData: extractVoltammetryData(jcamp)
520
+ volammetryData: extractVoltammetryData(jcamp),
521
+ scanRate: +info.$CSSCANRATE || 0.1
543
522
  }, s);
544
523
  };
545
524
  const maxArray = arr => {
@@ -708,6 +687,7 @@ const extrFeaturesNi = (jcamp, layout, peakUp, spectra) => {
708
687
  nfs.simulation = buildSimFeature(jcamp);
709
688
  return nfs;
710
689
  }
690
+
711
691
  // workaround for legacy design
712
692
  const features = jcamp.spectra.map(s => {
713
693
  const thresRef = calcThresRef(s, peakUp);
@@ -773,9 +753,29 @@ const extrFeaturesCylicVolta = (jcamp, layout, peakUp) => {
773
753
  const lowerThres = _format.default.isXRDLayout(layout) ? 100 : calcLowerThres(s);
774
754
  const cpo = buildPeakFeature(jcamp, layout, peakUp, s, 100, upperThres, lowerThres);
775
755
  const bnd = getBoundary(s);
776
- const detector = _format.default.isSECLayout(layout) && jcamp.info.$DETECTOR ? jcamp.info.$DETECTOR : '';
756
+ let detector = '';
757
+ let secData = null;
758
+ if (_format.default.isSECLayout(layout)) {
759
+ const {
760
+ info
761
+ } = jcamp;
762
+ detector = info.$DETECTOR ? info.$DETECTOR : '';
763
+ const {
764
+ D,
765
+ MN,
766
+ MP,
767
+ MW
768
+ } = info;
769
+ secData = {
770
+ d: D,
771
+ mn: MN,
772
+ mp: MP,
773
+ mw: MW
774
+ };
775
+ }
777
776
  return Object.assign({}, base, cpo, bnd, {
778
- detector
777
+ detector,
778
+ secData
779
779
  });
780
780
  }).filter(r => r != null);
781
781
  return features;
@@ -822,7 +822,7 @@ const extractTemperature = jcamp => {
822
822
  const ExtractJcamp = source => {
823
823
  const jcamp = _jcampconverter.default.convert(source, {
824
824
  xy: true,
825
- keepRecordsRegExp: /(\$CSTHRESHOLD|\$CSSCANAUTOTARGET|\$CSSCANEDITTARGET|\$CSSCANCOUNT|\$CSSOLVENTNAME|\$CSSOLVENTVALUE|\$CSSOLVENTX|\$CSCATEGORY|\$CSITAREA|\$CSITFACTOR|\$OBSERVEDINTEGRALS|\$OBSERVEDMULTIPLETS|\$OBSERVEDMULTIPLETSPEAKS|\.SOLVENTNAME|\.OBSERVEFREQUENCY|\$CSSIMULATIONPEAKS|\$CSUPPERTHRESHOLD|\$CSLOWERTHRESHOLD|\$CSCYCLICVOLTAMMETRYDATA|UNITS|SYMBOL|CSAUTOMETADATA|\$DETECTOR)/ // eslint-disable-line
825
+ keepRecordsRegExp: /(\$CSTHRESHOLD|\$CSSCANAUTOTARGET|\$CSSCANEDITTARGET|\$CSSCANCOUNT|\$CSSOLVENTNAME|\$CSSOLVENTVALUE|\$CSSOLVENTX|\$CSCATEGORY|\$CSITAREA|\$CSITFACTOR|\$OBSERVEDINTEGRALS|\$OBSERVEDMULTIPLETS|\$OBSERVEDMULTIPLETSPEAKS|\.SOLVENTNAME|\.OBSERVEFREQUENCY|\$CSSIMULATIONPEAKS|\$CSUPPERTHRESHOLD|\$CSLOWERTHRESHOLD|\$CSCYCLICVOLTAMMETRYDATA|UNITS|SYMBOL|CSAUTOMETADATA|\$DETECTOR|MN|MW|D|MP|MELTINGPOINT|TG|\$CSSCANRATE|\$CSSPECTRUMDIRECTION)/ // eslint-disable-line
826
826
  });
827
827
  const layout = readLayout(jcamp);
828
828
  const peakUp = !_format.default.isIrLayout(layout);
@@ -843,6 +843,22 @@ const ExtractJcamp = source => {
843
843
  features = extrFeaturesCylicVolta(jcamp, layout, peakUp);
844
844
  } else {
845
845
  features = extrFeaturesNi(jcamp, layout, peakUp, spectra);
846
+ if (_format.default.isDSCLayout(layout)) {
847
+ const {
848
+ info
849
+ } = jcamp;
850
+ const {
851
+ MELTINGPOINT,
852
+ TG
853
+ } = info;
854
+ const dscMetaData = {
855
+ meltingPoint: MELTINGPOINT,
856
+ tg: TG
857
+ };
858
+ features = Object.assign({}, features, {
859
+ dscMetaData
860
+ });
861
+ }
846
862
  }
847
863
  // const features = Format.isMsLayout(layout)
848
864
  // ? extrFeaturesMs(jcamp, layout, peakUp)
@@ -910,11 +926,12 @@ const GetCyclicVoltaPreviousShift = (cyclicVolta, curveIdx) => {
910
926
  return 0.0;
911
927
  }
912
928
  const {
913
- shift
929
+ shift,
930
+ hasRefPeak
914
931
  } = spectraList[curveIdx];
915
932
  const {
916
933
  prevValue
917
934
  } = shift;
918
- return prevValue;
935
+ return hasRefPeak ? prevValue : -prevValue;
919
936
  };
920
937
  exports.GetCyclicVoltaPreviousShift = GetCyclicVoltaPreviousShift;
@@ -97,7 +97,7 @@ const MouseMove = (event, focus) => {
97
97
  dValue = (0, _chem.Convert2DValue)(pt.x).toExponential(2);
98
98
  }
99
99
  focus.root.select('.cursor-txt-hz').attr('transform', `translate(${tx},${ty - 30})`).text(`2Theta: ${pt.x.toExponential(2)}, d-value: ${dValue}`);
100
- } else if (_format.default.isTGALayout(layout)) {
100
+ } else if (_format.default.isTGALayout(layout) || _format.default.isDSCLayout(layout)) {
101
101
  focus.root.select('.cursor-txt').attr('transform', `translate(${tx},${10})`).text(`X: ${pt.x.toFixed(3)}, Y: ${pt.y.toFixed(3)}`);
102
102
  } else {
103
103
  focus.root.select('.cursor-txt').attr('transform', `translate(${tx},${10})`).text(pt.x.toFixed(3));