HandsontableModal.jsx 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156
  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 Handsontable from 'handsontable';
  6. import { HotTable } from '@handsontable/react';
  7. import MarkdownTable from '../../models/MarkdownTable';
  8. import HandsontableUtil from './HandsontableUtil';
  9. export default class HandsontableModal extends React.Component {
  10. constructor(props) {
  11. super(props);
  12. this.state = {
  13. show: false,
  14. markdownTableOnInit: HandsontableModal.getDefaultMarkdownTable(),
  15. markdownTable: HandsontableModal.getDefaultMarkdownTable(),
  16. handsontableSetting: HandsontableModal.getDefaultHandsotableSetting()
  17. };
  18. this.init = this.init.bind(this);
  19. this.reset = this.reset.bind(this);
  20. this.cancel = this.cancel.bind(this);
  21. this.save = this.save.bind(this);
  22. }
  23. init(markdownTable) {
  24. const initMarkdownTable = markdownTable || HandsontableModal.getDefaultMarkdownTable();
  25. this.setState(
  26. {
  27. markdownTableOnInit: initMarkdownTable,
  28. markdownTable: initMarkdownTable.clone(),
  29. handsontableSetting: Object.assign({}, this.state.handsontableSetting, {
  30. afterUpdateSettings: HandsontableUtil.createHandlerToSynchronizeHandontableAlignWith(initMarkdownTable.options.align),
  31. loadData: HandsontableUtil.createHandlerToSynchronizeHandontableAlignWith(initMarkdownTable.options.align)
  32. })
  33. }
  34. );
  35. }
  36. show(markdownTable) {
  37. this.init(markdownTable);
  38. this.setState({ show: true });
  39. }
  40. reset() {
  41. this.setState({ markdownTable: this.state.markdownTableOnInit.clone() });
  42. }
  43. cancel() {
  44. this.setState({ show: false });
  45. }
  46. save() {
  47. let newMarkdownTable = this.state.markdownTable.clone();
  48. newMarkdownTable.options.align = HandsontableUtil.getMarkdownTableAlignmentFrom(this.refs.hotTable.hotInstance);
  49. if (this.props.onSave != null) {
  50. this.props.onSave(newMarkdownTable);
  51. }
  52. this.setState({ show: false });
  53. }
  54. render() {
  55. return (
  56. <Modal show={this.state.show} onHide={this.cancel} bsSize="large">
  57. <Modal.Header closeButton>
  58. <Modal.Title>Edit Table</Modal.Title>
  59. </Modal.Header>
  60. <Modal.Body className="p-0">
  61. <div className="p-4">
  62. <HotTable ref='hotTable' data={this.state.markdownTable.table} settings={this.state.handsontableSetting} />
  63. </div>
  64. </Modal.Body>
  65. <Modal.Footer>
  66. <div className="d-flex justify-content-between">
  67. <Button bsStyle="danger" onClick={this.reset}>Reset</Button>
  68. <div className="d-flex">
  69. <Button bsStyle="default" onClick={this.cancel}>Cancel</Button>
  70. <Button bsStyle="primary" onClick={this.save}>Done</Button>
  71. </div>
  72. </div>
  73. </Modal.Footer>
  74. </Modal>
  75. );
  76. }
  77. static getDefaultMarkdownTable() {
  78. return new MarkdownTable(
  79. [
  80. ['col1', 'col2', 'col3'],
  81. ['', '', ''],
  82. ['', '', ''],
  83. ],
  84. {
  85. align: ['', '', '']
  86. }
  87. );
  88. }
  89. static getDefaultHandsotableSetting() {
  90. return {
  91. height: 300,
  92. rowHeaders: true,
  93. colHeaders: true,
  94. contextMenu: {
  95. items: {
  96. 'row_above': {}, 'row_below': {}, 'col_left': {}, 'col_right': {},
  97. 'separator1': Handsontable.plugins.ContextMenu.SEPARATOR,
  98. 'remove_row': {}, 'remove_col': {},
  99. 'separator2': Handsontable.plugins.ContextMenu.SEPARATOR,
  100. 'custom_alignment': {
  101. name: 'Align columns',
  102. key: 'align_columns',
  103. submenu: {
  104. items: [{
  105. name: 'Left',
  106. key: 'align_columns:1',
  107. callback: function(key, selection) {
  108. HandsontableUtil.setClassNameToColumns(this, selection[0].start.col, selection[0].end.col, 'htLeft');
  109. }}, {
  110. name: 'Center',
  111. key: 'align_columns:2',
  112. callback: function(key, selection) {
  113. HandsontableUtil.setClassNameToColumns(this, selection[0].start.col, selection[0].end.col, 'htCenter');
  114. }}, {
  115. name: 'Right',
  116. key: 'align_columns:3',
  117. callback: function(key, selection) {
  118. HandsontableUtil.setClassNameToColumns(this, selection[0].start.col, selection[0].end.col, 'htRight');
  119. }}
  120. ]
  121. }
  122. }
  123. }
  124. },
  125. selectionMode: 'multiple',
  126. modifyColWidth: function(width) {
  127. if (width < 100) {
  128. return 100;
  129. }
  130. if (width > 300) {
  131. return 300;
  132. }
  133. }
  134. };
  135. }
  136. }
  137. HandsontableModal.propTypes = {
  138. onSave: PropTypes.func
  139. };