MarkdownTableDataImportForm.jsx 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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. }
  24. catch (e) {
  25. this.setState({parserErrorMessage: e.message});
  26. }
  27. }
  28. convertFormDataToMarkdownTable() {
  29. let result;
  30. switch (this.state.dataFormat) {
  31. case 'csv':
  32. result = MarkdownTable.fromDSV(this.state.data, ',');
  33. break;
  34. case 'tsv':
  35. result = MarkdownTable.fromDSV(this.state.data, '\t');
  36. break;
  37. case 'html':
  38. result = MarkdownTable.fromHTMLTableTag(this.state.data);
  39. break;
  40. }
  41. return result;
  42. }
  43. render() {
  44. return (
  45. <form action="" className="data-import-form pt-5">
  46. <FormGroup>
  47. <ControlLabel>Select Data Format</ControlLabel>
  48. <FormControl componentClass="select" placeholder="select"
  49. value={this.state.dataFormat} onChange={e => this.setState({dataFormat: e.target.value})}>
  50. <option value="csv">CSV</option>
  51. <option value="tsv">TSV</option>
  52. <option value="html">HTML</option>
  53. </FormControl>
  54. </FormGroup>
  55. <FormGroup>
  56. <ControlLabel>Import Data</ControlLabel>
  57. <FormControl componentClass="textarea" placeholder="Paste table data" style={{ height: 200 }}
  58. onChange={e => this.setState({data: e.target.value})}/>
  59. </FormGroup>
  60. <Collapse in={this.state.parserErrorMessage != null}>
  61. <FormGroup>
  62. <ControlLabel>Parser Error</ControlLabel>
  63. <FormControl componentClass="textarea" style={{ height: 100 }} value={this.state.parserErrorMessage} readOnly/>
  64. </FormGroup>
  65. </Collapse>
  66. <div className="d-flex justify-content-end">
  67. <Button bsStyle="default" onClick={this.props.onCancel}>Cancel</Button>
  68. <Button bsStyle="primary" onClick={this.importButtonHandler}>Import</Button>
  69. </div>
  70. </form>
  71. );
  72. }
  73. }
  74. MarkdownTableDataImportForm.propTypes = {
  75. onCancel: PropTypes.func,
  76. onImport: PropTypes.func
  77. };