MarkdownTableDataImportForm.jsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. // TODO: GW-333
  4. // import FormGroup from 'react-bootstrap/es/FormGroup';
  5. // import ControlLabel from 'react-bootstrap/es/ControlLabel';
  6. // import FormControl from 'react-bootstrap/es/FormControl';
  7. // import Collapse from 'react-bootstrap/es/Collapse';
  8. import {
  9. Button,
  10. } from 'reactstrap';
  11. import MarkdownTable from '../../models/MarkdownTable';
  12. export default class MarkdownTableDataImportForm extends React.Component {
  13. constructor(props) {
  14. super(props);
  15. this.state = {
  16. dataFormat: 'csv',
  17. data: '',
  18. parserErrorMessage: null,
  19. };
  20. this.importButtonHandler = this.importButtonHandler.bind(this);
  21. }
  22. importButtonHandler() {
  23. try {
  24. const markdownTable = this.convertFormDataToMarkdownTable();
  25. this.props.onImport(markdownTable);
  26. this.setState({ parserErrorMessage: null });
  27. }
  28. catch (e) {
  29. this.setState({ parserErrorMessage: e.message });
  30. }
  31. }
  32. convertFormDataToMarkdownTable() {
  33. let result;
  34. switch (this.state.dataFormat) {
  35. case 'csv':
  36. result = MarkdownTable.fromDSV(this.state.data, ',');
  37. break;
  38. case 'tsv':
  39. result = MarkdownTable.fromDSV(this.state.data, '\t');
  40. break;
  41. case 'html':
  42. result = MarkdownTable.fromHTMLTableTag(this.state.data);
  43. break;
  44. }
  45. return result.normalizeCells();
  46. }
  47. render() {
  48. return (
  49. <form action="" className="data-import-form pt-5">
  50. <FormGroup>
  51. <ControlLabel>Select Data Format</ControlLabel>
  52. <FormControl
  53. componentClass="select"
  54. placeholder="select"
  55. value={this.state.dataFormat}
  56. onChange={(e) => { return this.setState({ dataFormat: e.target.value }) }}
  57. >
  58. <option value="csv">CSV</option>
  59. <option value="tsv">TSV</option>
  60. <option value="html">HTML</option>
  61. </FormControl>
  62. </FormGroup>
  63. <FormGroup>
  64. <ControlLabel>Import Data</ControlLabel>
  65. <FormControl
  66. componentClass="textarea"
  67. placeholder="Paste table data"
  68. style={{ height: 200 }}
  69. onChange={(e) => { return this.setState({ data: e.target.value }) }}
  70. />
  71. </FormGroup>
  72. <Collapse in={this.state.parserErrorMessage != null}>
  73. <FormGroup>
  74. <ControlLabel>Parse Error</ControlLabel>
  75. <FormControl componentClass="textarea" style={{ height: 100 }} value={this.state.parserErrorMessage || ''} readOnly />
  76. </FormGroup>
  77. </Collapse>
  78. <div className="d-flex justify-content-end">
  79. <Button color="secondary" onClick={this.props.onCancel}>Cancel</Button>
  80. <Button color="primary" onClick={this.importButtonHandler}>Import</Button>
  81. </div>
  82. </form>
  83. );
  84. }
  85. }
  86. MarkdownTableDataImportForm.propTypes = {
  87. onCancel: PropTypes.func,
  88. onImport: PropTypes.func,
  89. };