GridEditModal.jsx 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import {
  4. Modal, ModalHeader, ModalBody, ModalFooter,
  5. } from 'reactstrap';
  6. import geu from './GridEditorUtil';
  7. import BootstrapGrid from '../../models/BootstrapGrid';
  8. export default class GridEditModal extends React.Component {
  9. constructor(props) {
  10. super(props);
  11. this.state = {
  12. colsRatios: [6, 6],
  13. responsiveSize: BootstrapGrid.ResponsiveSize.XS_SIZE,
  14. show: false,
  15. gridHtml: '',
  16. };
  17. this.init = this.init.bind(this);
  18. this.show = this.show.bind(this);
  19. this.hide = this.hide.bind(this);
  20. this.cancel = this.cancel.bind(this);
  21. this.pasteCodedGrid = this.pasteCodedGrid.bind(this);
  22. this.showGridPattern = this.showGridPattern.bind(this);
  23. this.checkResposiveSize = this.checkResposiveSize.bind(this);
  24. }
  25. async checkResposiveSize(rs) {
  26. await this.setState({ responsiveSize: rs });
  27. }
  28. async checkColsRatios(cr) {
  29. await this.setState({ colsRatios: cr });
  30. }
  31. showGridPattern() {
  32. const colsRatios = this.state.colsRatios;
  33. return colsRatios.join(' - ');
  34. }
  35. init(gridHtml) {
  36. const initGridHtml = gridHtml;
  37. this.setState({ gridHtml: initGridHtml }, function() {
  38. // display gridHtml for re-editing
  39. console.log(this.state.gridHtml);
  40. });
  41. }
  42. show(gridHtml) {
  43. this.init(gridHtml);
  44. this.setState({ show: true });
  45. }
  46. hide() {
  47. this.setState({ show: false });
  48. }
  49. cancel() {
  50. this.hide();
  51. }
  52. pasteCodedGrid() {
  53. // dummy data
  54. const convertedHTML = geu.convertRatiosAndSizeToHTML([1, 5, 6], 'sm');
  55. const pastedGridData = `::: editable-row\n<div class="container">\n\t<div class="row">\n${convertedHTML}\n\t</div>\n</div>\n:::`;
  56. // display converted html on console
  57. console.log(convertedHTML);
  58. if (this.props.onSave != null) {
  59. this.props.onSave(pastedGridData);
  60. }
  61. this.cancel();
  62. }
  63. gridDivisionMenu() {
  64. const gridDivisions = geu.mappingAllGridDivisionPatterns;
  65. return (
  66. <div className="container">
  67. <div className="row">
  68. {gridDivisions.map((gridDivion, i) => {
  69. return (
  70. <div className="col-md-4 text-center">
  71. <h6 className="dropdown-header">{gridDivion.numberOfGridDivisions}分割</h6>
  72. {gridDivion.mapping.map((gridOneDivision) => {
  73. return (
  74. <button className="dropdown-item" type="button" onClick={() => { this.checkColsRatios(gridOneDivision) }}>
  75. <div className="row">
  76. {gridOneDivision.map((god) => {
  77. const className = `bg-info col-${god} border`;
  78. return <span className={className}>{god}</span>;
  79. })}
  80. </div>
  81. </button>
  82. );
  83. })}
  84. </div>
  85. );
  86. })}
  87. </div>
  88. </div>
  89. );
  90. }
  91. render() {
  92. return (
  93. <Modal isOpen={this.state.show} toggle={this.cancel} size="xl" className="grw-grid-edit-modal">
  94. <ModalHeader tag="h4" toggle={this.cancel} className="bg-primary text-light">
  95. Create Bootstrap 4 Grid
  96. </ModalHeader>
  97. <ModalBody>
  98. <div className="container">
  99. <div className="row">
  100. <div className="col-lg-3 mb-3">
  101. <div className="mr-3 d-inline">
  102. <label htmlFor="gridPattern">Grid Pattern :</label>
  103. </div>
  104. <button
  105. className="btn btn-outline-secondary dropdown-toggle text-md-right col-3 col-md-auto"
  106. type="button"
  107. id="dropdownMenuButton"
  108. data-toggle="dropdown"
  109. aria-haspopup="true"
  110. aria-expanded="false"
  111. >
  112. {this.showGridPattern()}
  113. </button>
  114. <div className="dropdown-menu grid-division-menu" aria-labelledby="dropdownMenuButton">
  115. {this.gridDivisionMenu()}
  116. </div>
  117. </div>
  118. <div className="col-lg-3 text-lg-right pr-0 mb-2">
  119. <label className="pr-3 text-nowrap">Break point by display size :</label>
  120. </div>
  121. <div className="col-lg-3 text-left pl-lg-0">
  122. <div className="form-group inline-block">
  123. <div className="text-nowrap">
  124. {/* TODO unite radio button style with that of AppSetting.jsx by GW-3342 */}
  125. <input
  126. type="radio"
  127. id={BootstrapGrid.ResponsiveSize.XS_SIZE}
  128. name="responsiveSize"
  129. value={BootstrapGrid.ResponsiveSize.XS_SIZE}
  130. onChange={(e) => { this.checkResposiveSize(e.target.value) }}
  131. checked={this.state.responsiveSize === BootstrapGrid.ResponsiveSize.XS_SIZE}
  132. />
  133. <label htmlFor={BootstrapGrid.ResponsiveSize.XS_SIZE}>
  134. <i className="pl-2 pr-1 icon-screen-smartphone"></i> Mobile / No break point
  135. </label>
  136. </div>
  137. <div>
  138. <input
  139. type="radio"
  140. id={BootstrapGrid.ResponsiveSize.SM_SIZE}
  141. name="responsiveSize"
  142. value={BootstrapGrid.ResponsiveSize.SM_SIZE}
  143. onChange={(e) => { this.checkResposiveSize(e.target.value) }}
  144. checked={this.state.responsiveSize === BootstrapGrid.ResponsiveSize.SM_SIZE}
  145. />
  146. <label htmlFor={BootstrapGrid.ResponsiveSize.SM_SIZE}>
  147. <i className="pl-2 pr-1 icon-screen-tablet"></i> Tablet
  148. </label>
  149. </div>
  150. <div>
  151. <input
  152. type="radio"
  153. id={BootstrapGrid.ResponsiveSize.MD_SIZE}
  154. name="responsiveSize"
  155. value={BootstrapGrid.ResponsiveSize.MD_SIZE}
  156. onChange={(e) => { this.checkResposiveSize(e.target.value) }}
  157. checked={this.state.responsiveSize === BootstrapGrid.ResponsiveSize.MD_SIZE}
  158. />
  159. <label htmlFor={BootstrapGrid.ResponsiveSize.MD_SIZE}>
  160. <i className="pl-2 pr-1 icon-screen-desktop"></i> Desktop
  161. </label>
  162. </div>
  163. </div>
  164. </div>
  165. </div>
  166. <div className="row">
  167. <h1 className="pl-3 w-100">Preview</h1>
  168. <div className="col-lg-6">
  169. <label className="d-block pt-2"><i className="pr-2 icon-screen-desktop"></i>Desktop</label>
  170. <div className="desktop-preview border d-block"></div>
  171. </div>
  172. <div className="col-6 col-lg-3">
  173. <label className="d-block pt-2"><i className="pr-2 icon-screen-tablet"></i>Tablet</label>
  174. <div className="tablet-preview border d-block"></div>
  175. </div>
  176. <div className="col-6 col-lg-3">
  177. <label className="d-block pt-2"><i className="pr-2 icon-screen-smartphone"></i>Mobile</label>
  178. <div className="mobile-preview border d-block"></div>
  179. </div>
  180. </div>
  181. </div>
  182. </ModalBody>
  183. <ModalFooter className="grw-modal-footer">
  184. <div className="ml-auto">
  185. <button type="button" className="mr-2 btn btn-secondary" onClick={this.cancel}>
  186. Cancel
  187. </button>
  188. <button type="button" className="btn btn-primary" onClick={this.pasteCodedGrid}>
  189. Done
  190. </button>
  191. </div>
  192. </ModalFooter>
  193. </Modal>
  194. );
  195. }
  196. }
  197. GridEditModal.propTypes = {
  198. onSave: PropTypes.func,
  199. };