MarkdownTableDataImportForm.jsx 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import {
  4. Button,
  5. Collapse,
  6. } from 'reactstrap';
  7. import MarkdownTable from '../../models/MarkdownTable';
  8. export default class MarkdownTableDataImportForm extends React.Component {
  9. constructor(props) {
  10. super(props);
  11. this.state = {
  12. dataFormat: 'csv',
  13. data: '',
  14. parserErrorMessage: null,
  15. };
  16. this.importButtonHandler = this.importButtonHandler.bind(this);
  17. }
  18. importButtonHandler() {
  19. try {
  20. const markdownTable = this.convertFormDataToMarkdownTable();
  21. this.props.onImport(markdownTable);
  22. this.setState({ parserErrorMessage: null });
  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.normalizeCells();
  42. }
  43. render() {
  44. return (
  45. <form className="data-import-form">
  46. <div className="form-group">
  47. <label htmlFor="data-import-form-type-select">Select Data Format</label>
  48. <select
  49. id="data-import-form-type-select"
  50. className="form-control"
  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. </select>
  59. </div>
  60. <div className="form-group">
  61. <label htmlFor="data-import-form-type-textarea">Import Data</label>
  62. <textarea
  63. id="data-import-form-type-textarea"
  64. className="form-control"
  65. placeholder="Paste table data"
  66. rows="8"
  67. onChange={(e) => { return this.setState({ data: e.target.value }) }}
  68. />
  69. </div>
  70. <Collapse isOpen={this.state.parserErrorMessage != null}>
  71. <div className="form-group">
  72. <label htmlFor="data-import-form-type-textarea-alert">Parse Error</label>
  73. <textarea
  74. id="data-import-form-type-textarea-alert"
  75. className="form-control"
  76. rows="4"
  77. value={this.state.parserErrorMessage || ''}
  78. readOnly
  79. />
  80. </div>
  81. </Collapse>
  82. <div className="d-flex justify-content-end">
  83. <Button color="secondary mr-2" onClick={this.props.onCancel}>Cancel</Button>
  84. <Button color="primary" onClick={this.importButtonHandler}>Import</Button>
  85. </div>
  86. </form>
  87. );
  88. }
  89. }
  90. MarkdownTableDataImportForm.propTypes = {
  91. onCancel: PropTypes.func,
  92. onImport: PropTypes.func,
  93. };