LinkEditModal.jsx 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { Modal, ModalHeader, ModalBody } from 'reactstrap';
  4. import PublishLink from './PublishLink';
  5. import PageContainer from '../../services/PageContainer';
  6. import { withUnstatedContainers } from '../UnstatedUtils';
  7. class LinkEditModal extends React.PureComponent {
  8. constructor(props) {
  9. super(props);
  10. this.state = {
  11. show: false,
  12. isUseRelativePath: false,
  13. linkInputValue: '',
  14. labelInputValue: '',
  15. linkerType: 'pukiwikiLink',
  16. };
  17. this.cancel = this.cancel.bind(this);
  18. this.toggleIsUseRelativePath = this.toggleIsUseRelativePath.bind(this);
  19. this.handleChangeLinkInput = this.handleChangeLinkInput.bind(this);
  20. this.handleChangeLabelInput = this.handleChangeLabelInput.bind(this);
  21. this.handleSelecteLinkerType = this.handleSelecteLinkerType.bind(this);
  22. this.showLog = this.showLog.bind(this);
  23. }
  24. show() {
  25. this.setState({ show: true });
  26. }
  27. cancel() {
  28. this.hide();
  29. }
  30. hide() {
  31. this.setState({
  32. show: false,
  33. });
  34. }
  35. toggleIsUseRelativePath() {
  36. if (this.state.linkerType === 'growiLink') {
  37. return;
  38. }
  39. this.setState({ isUseRelativePath: !this.state.isUseRelativePath });
  40. }
  41. renderPreview() {
  42. // TODO GW-2658
  43. }
  44. insertLinkIntoEditor() {
  45. // TODO GW-2659
  46. }
  47. showLog() {
  48. console.log(this.state.linkInputValue);
  49. }
  50. handleChangeLinkInput(linkValue) {
  51. this.setState({ linkInputValue: linkValue });
  52. }
  53. handleChangeLabelInput(labelValue) {
  54. this.setState({ labelInputValue: labelValue });
  55. }
  56. handleSelecteLinkerType(linkerType) {
  57. if (this.state.isUseRelativePath && linkerType === 'growiLink') {
  58. this.toggleIsUseRelativePath();
  59. }
  60. this.setState({ linkerType });
  61. }
  62. render() {
  63. const { pageContainer } = this.props;
  64. return (
  65. <Modal isOpen={this.state.show} toggle={this.cancel} size="lg">
  66. <ModalHeader tag="h4" toggle={this.cancel} className="bg-primary text-light">
  67. Edit Links
  68. </ModalHeader>
  69. <ModalBody className="container">
  70. <div className="row">
  71. <div className="col">
  72. <div className="form-gorup my-3">
  73. <label htmlFor="linkInput">Link</label>
  74. <div className="input-group">
  75. <input
  76. className="form-control"
  77. id="linkInput"
  78. type="text"
  79. placeholder="URL or page path"
  80. aria-describedby="button-addon"
  81. value={this.state.linkInputValue}
  82. onChange={e => this.handleChangeLinkInput(e.target.value)}
  83. />
  84. <div className="input-group-append">
  85. <button type="button" id="button-addon" className="btn btn-secondary" onClick={this.showLog}>
  86. Preview
  87. </button>
  88. </div>
  89. </div>
  90. </div>
  91. <div className="d-block d-lg-none">
  92. {this.renderPreview}
  93. render preview
  94. </div>
  95. <div className="link-edit-tabs">
  96. <ul className="nav nav-tabs" role="tabist">
  97. <li className="nav-item">
  98. <a
  99. className="nav-link active"
  100. name="pukiwikiLink"
  101. onClick={e => this.handleSelecteLinkerType(e.target.name)}
  102. href="#Pukiwiki"
  103. role="tab"
  104. data-toggle="tab"
  105. >
  106. Pukiwiki
  107. </a>
  108. </li>
  109. <li className="nav-item">
  110. <a
  111. className="nav-link"
  112. name="growiLink"
  113. onClick={e => this.handleSelecteLinkerType(e.target.name)}
  114. href="#Growi"
  115. role="tab"
  116. data-toggle="tab"
  117. >
  118. Growi Original
  119. </a>
  120. </li>
  121. <li className="nav-item">
  122. <a className="nav-link" name="mdLink" onClick={e => this.handleSelecteLinkerType(e.target.name)} href="#MD" role="tab" data-toggle="tab">
  123. Markdown
  124. </a>
  125. </li>
  126. </ul>
  127. <div className="tab-content pt-3">
  128. <form className="form-group">
  129. <div className="form-group">
  130. <label htmlFor="label">Label</label>
  131. <input
  132. type="text"
  133. className="form-control"
  134. id="label"
  135. value={this.state.labelInputValue}
  136. onChange={e => this.handleChangeLabelInput(e.target.value)}
  137. disabled={this.state.linkerType === 'growiLink'}
  138. />
  139. <PublishLink
  140. link={this.state.linkInputValue}
  141. label={this.state.labelInputValue}
  142. type={this.state.linkerType}
  143. isUseRelativePath={this.state.isUseRelativePath}
  144. currentPagePath={pageContainer.state.path}
  145. />
  146. </div>
  147. <div className="form-inline">
  148. <div className="custom-control custom-checkbox custom-checkbox-info">
  149. <input
  150. className="custom-control-input"
  151. id="relativePath"
  152. type="checkbox"
  153. checked={this.state.isUseRelativePath}
  154. disabled={this.state.linkerType === 'growiLink'}
  155. />
  156. <label className="custom-control-label" htmlFor="relativePath" onClick={this.toggleIsUseRelativePath}>
  157. Use relative path
  158. </label>
  159. </div>
  160. <button type="button" className="btn btn-primary ml-auto">
  161. Done
  162. </button>
  163. </div>
  164. </form>
  165. </div>
  166. </div>
  167. </div>
  168. <div className="col d-none d-lg-block">
  169. {this.renderPreview}
  170. render preview
  171. </div>
  172. </div>
  173. </ModalBody>
  174. </Modal>
  175. );
  176. }
  177. }
  178. LinkEditModal.propTypes = {
  179. pageContainer: PropTypes.instanceOf(PageContainer).isRequired,
  180. };
  181. /**
  182. * Wrapper component for using unstated
  183. */
  184. const LinkEditModalWrapper = withUnstatedContainers(LinkEditModal, [PageContainer]);
  185. export default LinkEditModalWrapper;