GridEditModal.jsx 7.0 KB

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