MarkdownTableDataImportForm.jsx 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 action="" className="data-import-form pt-5">
  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. componentClass="select"
  52. placeholder="select"
  53. value={this.state.dataFormat}
  54. onChange={(e) => { return this.setState({ dataFormat: e.target.value }) }}
  55. >
  56. <option value="csv">CSV</option>
  57. <option value="tsv">TSV</option>
  58. <option value="html">HTML</option>
  59. </select>
  60. </div>
  61. <div className="form-group">
  62. <label htmlFor="data-import-form-type-textarea">Import Data</label>
  63. <textarea
  64. id="data-import-form-type-textarea"
  65. componentClass="textarea"
  66. className="w-100"
  67. placeholder="Paste table data"
  68. style={{ height: 200 }}
  69. onChange={(e) => { return this.setState({ data: e.target.value }) }}
  70. />
  71. </div>
  72. <Collapse isOpen={this.state.parserErrorMessage != null}>
  73. <div className="form-group">
  74. <label htmlFor="data-import-form-type-textarea-alert">Parse Error</label>
  75. <textarea
  76. id="data-import-form-type-textarea-alert"
  77. componentClass="textarea"
  78. style={{ height: 100 }}
  79. value={this.state.parserErrorMessage || ''}
  80. readOnly
  81. />
  82. </div>
  83. </Collapse>
  84. <div className="d-flex justify-content-end">
  85. <Button color="secondary mr-2" onClick={this.props.onCancel}>Cancel</Button>
  86. <Button color="primary" onClick={this.importButtonHandler}>Import</Button>
  87. </div>
  88. </form>
  89. );
  90. }
  91. }
  92. MarkdownTableDataImportForm.propTypes = {
  93. onCancel: PropTypes.func,
  94. onImport: PropTypes.func,
  95. };