GridEditModal.jsx 7.2 KB

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