HandsontableModal.jsx 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import Modal from 'react-bootstrap/es/Modal';
  4. import Button from 'react-bootstrap/es/Button';
  5. import ButtonGroup from 'react-bootstrap/es/ButtonGroup';
  6. import Navbar from 'react-bootstrap/es/Navbar';
  7. import Nav from 'react-bootstrap/es/Nav';
  8. import NavDropdown from 'react-bootstrap/es/NavDropdown';
  9. import MenuItem from 'react-bootstrap/es/MenuItem';
  10. import { HotTable } from '@handsontable/react';
  11. import MarkdownTable from '../../models/MarkdownTable';
  12. export default class HandsontableModal extends React.Component {
  13. constructor(props) {
  14. super(props);
  15. this.state = {
  16. show: false,
  17. };
  18. this.settings = {
  19. height: 300,
  20. rowHeaders: true,
  21. colHeaders: true,
  22. fixedRowsTop: [0, 1],
  23. contextMenu: ['row_above', 'row_below', 'col_left', 'col_right', '---------', 'remove_row', 'remove_col', '---------', 'alignment'],
  24. stretchH: 'all',
  25. selectionMode: 'multiple',
  26. };
  27. this.init = this.init.bind(this);
  28. this.cancel = this.cancel.bind(this);
  29. this.dispatchSave = this.dispatchSave.bind(this);
  30. }
  31. componentWillMount() {
  32. this.init(this.props.markdownTable);
  33. }
  34. init(markdownTable) {
  35. const initMarkdownTable = markdownTable || new MarkdownTable([
  36. ['col1', 'col2', 'col3'],
  37. ['', '', ''],
  38. ['', '', ''],
  39. ]);
  40. this.setState({ markdownTable: initMarkdownTable });
  41. }
  42. show(markdownTable, doneHandler) {
  43. this.init(markdownTable);
  44. this.setState({ show: true });
  45. }
  46. cancel() {
  47. this.setState({ show: false });
  48. }
  49. /**
  50. * dispatch save event
  51. */
  52. dispatchSave() {
  53. if (this.props.onSave != null) {
  54. this.props.onSave(this.state.markdownTable);
  55. }
  56. }
  57. render() {
  58. return (
  59. <Modal show={this.state.show} onHide={this.cancel} bsSize="large">
  60. <Modal.Header closeButton>
  61. <Modal.Title>Edit Table</Modal.Title>
  62. </Modal.Header>
  63. <Modal.Body className="p-0">
  64. <Navbar className="m-0">
  65. <Nav>
  66. <NavDropdown title="Data" id="ddData">
  67. <MenuItem>Paste HTML <code>&lt;table&gt;</code> tag</MenuItem>
  68. <MenuItem>Paste CSV</MenuItem>
  69. <MenuItem>Paste TSV</MenuItem>
  70. <MenuItem>Paste Excel data</MenuItem>
  71. </NavDropdown>
  72. </Nav>
  73. <Navbar.Form>
  74. <ButtonGroup className="ml-3">
  75. <Button><i className="ti-align-left"></i></Button>
  76. <Button><i className="ti-align-center"></i></Button>
  77. <Button><i className="ti-align-right"></i></Button>
  78. </ButtonGroup>
  79. </Navbar.Form>
  80. </Navbar>
  81. <div className="p-4">
  82. <HotTable data={this.state.markdownTable.table} settings={this.settings} />
  83. </div>
  84. </Modal.Body>
  85. <Modal.Footer>
  86. <div className="d-flex justify-content-between">
  87. <Button bsStyle="danger" onClick={() => this.init(this.props.markdownTable)}>Reset</Button>
  88. <div className="d-flex">
  89. <Button bsStyle="default" onClick={this.cancel}>Cancel</Button>
  90. <Button bsStyle="primary" onClick={this.dispatchSave}>Done</Button>
  91. </div>
  92. </div>
  93. </Modal.Footer>
  94. </Modal>
  95. );
  96. }
  97. }
  98. HandsontableModal.propTypes = {
  99. markdownTable: PropTypes.instanceOf(MarkdownTable),
  100. onSave: PropTypes.func,
  101. };