MarkdownTableDataImportForm.jsx 2.9 KB

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