MarkdownTableDataImportForm.jsx 2.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  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 MarkdownTable from '../../models/MarkdownTable';
  8. import Collapse from 'react-bootstrap/es/Collapse';
  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;
  43. }
  44. render() {
  45. return (
  46. <form action="" className="data-import-form pt-5">
  47. <FormGroup>
  48. <ControlLabel>Select Data Format</ControlLabel>
  49. <FormControl componentClass="select" placeholder="select"
  50. value={this.state.dataFormat} onChange={e => this.setState({dataFormat: e.target.value})}>
  51. <option value="csv">CSV</option>
  52. <option value="tsv">TSV</option>
  53. <option value="html">HTML</option>
  54. </FormControl>
  55. </FormGroup>
  56. <FormGroup>
  57. <ControlLabel>Import Data</ControlLabel>
  58. <FormControl componentClass="textarea" placeholder="Paste table data" style={{ height: 200 }}
  59. onChange={e => this.setState({data: e.target.value})}/>
  60. </FormGroup>
  61. <Collapse in={this.state.parserErrorMessage != null}>
  62. <FormGroup>
  63. <ControlLabel>Parse Error</ControlLabel>
  64. <FormControl componentClass="textarea" style={{ height: 100 }} value={this.state.parserErrorMessage} readOnly/>
  65. </FormGroup>
  66. </Collapse>
  67. <div className="d-flex justify-content-end">
  68. <Button bsStyle="default" onClick={this.props.onCancel}>Cancel</Button>
  69. <Button bsStyle="primary" onClick={this.importButtonHandler}>Import</Button>
  70. </div>
  71. </form>
  72. );
  73. }
  74. }
  75. MarkdownTableDataImportForm.propTypes = {
  76. onCancel: PropTypes.func,
  77. onImport: PropTypes.func
  78. };