HandsontableModal.jsx 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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 { HotTable } from '@handsontable/react';
  6. import MarkdownTable from '../../models/MarkdownTable';
  7. export default class HandsontableModal extends React.Component {
  8. constructor(props) {
  9. super(props);
  10. this.state = {
  11. show: false,
  12. markdownTableOnInit: HandsontableModal.getDefaultMarkdownTable(),
  13. markdownTable: HandsontableModal.getDefaultMarkdownTable()
  14. };
  15. this.settings = {
  16. height: 300,
  17. rowHeaders: true,
  18. colHeaders: true,
  19. fixedRowsTop: [0, 1],
  20. contextMenu: ['row_above', 'row_below', 'col_left', 'col_right', '---------', 'remove_row', 'remove_col', '---------', 'alignment'],
  21. stretchH: 'all',
  22. selectionMode: 'multiple',
  23. };
  24. this.init = this.init.bind(this);
  25. this.reset = this.reset.bind(this);
  26. this.cancel = this.cancel.bind(this);
  27. this.save = this.save.bind(this);
  28. }
  29. init(markdownTable) {
  30. const initMarkdownTable = markdownTable || HandsontableModal.getDefaultMarkdownTable();
  31. this.setState({ markdownTableOnInit: initMarkdownTable });
  32. this.setState({ markdownTable: initMarkdownTable.clone() });
  33. }
  34. show(markdownTable) {
  35. this.init(markdownTable);
  36. this.setState({ show: true });
  37. }
  38. reset() {
  39. this.setState({ markdownTable: this.state.markdownTableOnInit.clone() });
  40. }
  41. cancel() {
  42. this.setState({ show: false });
  43. }
  44. save() {
  45. if (this.props.onSave != null) {
  46. this.props.onSave(this.state.markdownTable);
  47. }
  48. this.setState({ show: false });
  49. }
  50. render() {
  51. return (
  52. <Modal show={this.state.show} onHide={this.cancel} bsSize="large">
  53. <Modal.Header closeButton>
  54. <Modal.Title>Edit Table</Modal.Title>
  55. </Modal.Header>
  56. <Modal.Body className="p-0">
  57. <div className="p-4">
  58. <HotTable data={this.state.markdownTable.table} settings={this.settings} />
  59. </div>
  60. </Modal.Body>
  61. <Modal.Footer>
  62. <div className="d-flex justify-content-between">
  63. <Button bsStyle="danger" onClick={this.reset}>Reset</Button>
  64. <div className="d-flex">
  65. <Button bsStyle="default" onClick={this.cancel}>Cancel</Button>
  66. <Button bsStyle="primary" onClick={this.save}>Done</Button>
  67. </div>
  68. </div>
  69. </Modal.Footer>
  70. </Modal>
  71. );
  72. }
  73. static getDefaultMarkdownTable() {
  74. return new MarkdownTable([
  75. ['col1', 'col2', 'col3'],
  76. ['', '', ''],
  77. ['', '', ''],
  78. ]);
  79. }
  80. }
  81. HandsontableModal.propTypes = {
  82. onSave: PropTypes.func
  83. };