CommentForm.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import Button from 'react-bootstrap/es/Button';
  4. import FormControl from 'react-bootstrap/es/FormControl';
  5. import Tab from 'react-bootstrap/es/tab';
  6. import Tabs from 'react-bootstrap/es/tabs';
  7. import UserPicture from '../User/UserPicture';
  8. /**
  9. *
  10. * @author Yuki Takei <yuki@weseek.co.jp>
  11. *
  12. * @export
  13. * @class Comment
  14. * @extends {React.Component}
  15. */
  16. export default class CommentForm extends React.Component {
  17. constructor(props) {
  18. super(props);
  19. this.state = {
  20. comment: '# a',
  21. isMarkdown: false,
  22. html: '',
  23. };
  24. this.updateState = this.updateState.bind(this);
  25. this.postComment = this.postComment.bind(this);
  26. this.getCommentHtml = this.getCommentHtml.bind(this);
  27. this.renderHtml = this.renderHtml.bind(this);
  28. }
  29. updateState(event) {
  30. const target = event.target;
  31. const value = target.type === 'checkbox' ? target.checked : target.value;
  32. const name = target.name;
  33. this.setState({
  34. [name]: value
  35. });
  36. }
  37. /**
  38. * Load data of comments and rerender <PageComments />
  39. */
  40. postComment(event) {
  41. event.preventDefault();
  42. this.props.crowi.apiPost('/comments.add', {
  43. commentForm: {
  44. comment: this.state.comment,
  45. _csrf: this.props.crowi.csrfToken,
  46. page_id: this.props.pageId,
  47. revision_id: this.props.revisionId,
  48. is_markdown: this.state.isMarkdown,
  49. }
  50. })
  51. .then((res) => {
  52. if (this.props.onPostComplete != null) {
  53. this.props.onPostComplete(res.comment);
  54. }
  55. this.setState({
  56. comment: '',
  57. isMarkdown: false,
  58. });
  59. });
  60. }
  61. getCommentHtml(){
  62. if(!this.state.html){
  63. this.renderHtml(this.state.comment)
  64. }
  65. }
  66. renderHtml(markdown) {
  67. var context = {
  68. markdown,
  69. };
  70. const crowiRenderer = this.props.crowiRenderer;
  71. const interceptorManager = this.props.crowi.interceptorManager;
  72. interceptorManager.process('prePreviewRender', context)
  73. .then(() => interceptorManager.process('prePreviewPreProcess', context))
  74. .then(() => {
  75. context.markdown = crowiRenderer.preProcess(context.markdown);
  76. })
  77. .then(() => interceptorManager.process('postPreviewPreProcess', context))
  78. .then(() => {
  79. var parsedHTML = crowiRenderer.process(context.markdown);
  80. context['parsedHTML'] = parsedHTML;
  81. })
  82. .then(() => interceptorManager.process('prePreviewPostProcess', context))
  83. .then(() => {
  84. context.parsedHTML = crowiRenderer.postProcess(context.parsedHTML, context.dom);
  85. })
  86. .then(() => interceptorManager.process('postPreviewPostProcess', context))
  87. .then(() => interceptorManager.process('prePreviewRenderHtml', context))
  88. .then(() => {
  89.    this.setState({ html: context.parsedHTML });
  90. })
  91. // process interceptors for post rendering
  92. .then(() => interceptorManager.process('postPreviewRenderHtml', context));
  93. }
  94. generateInnerHtml(html) {
  95. return {__html: html};
  96. }
  97. render() {
  98. this.getCommentHtml()
  99. console.log(this.state.html)
  100. //{% if not user %}disabled{% endif %}をtextareaとbuttonに追加
  101. // denounce/throttle
  102. return (
  103. <div>
  104. <form className="form page-comment-form" id="page-comment-form" onSubmit={this.postComment}>
  105. <div className="comment-form">
  106. <div className="comment-form-user">
  107. </div>
  108. <div className="comment-form-main">
  109. <div className="comment-write">
  110. <Tabs defaultActiveKey={1} id="comment-form-tabs">
  111. <Tab eventKey={1} title="Write">
  112. <textarea className="comment-form-comment form-control" id="comment-form-comment" name="comment" required placeholder="Write comments here..." value={this.state.comment} onChange={this.updateState} >
  113. </textarea>
  114. <div className="form-check">
  115. <input type="checkbox" id="comment-form-is-markdown" name="isMarkdown" checked={this.state.isMarkdown} value="1" onChange={this.updateState} /> Markdown<br />
  116. </div>
  117. </Tab>
  118. <Tab eventKey={2} title="Prevrew">
  119. <div className="comment-form-prevew">
  120. <div className="commenthtml" dangerouslySetInnerHTML={this.generateInnerHtml(this.state.html)}>
  121. </div>
  122. </div>
  123. </Tab>
  124. </Tabs>
  125. </div>
  126. <div className="comment-submit">
  127. <div className="pull-right">
  128. <Button type="submit" value="Submit" bsStyle="primary" className="fcbtn btn btn-sm btn-primary btn-outline btn-rounded btn-1b">
  129. Comment
  130. </Button>
  131. </div>
  132. <div className="clearfix">
  133. </div>
  134. </div>
  135. </div>
  136. </div>
  137. </form>
  138. </div>
  139. );
  140. }
  141. }
  142. CommentForm.propTypes = {
  143. crowi: PropTypes.object.isRequired,
  144. onPostComplete: PropTypes.func,
  145. pageId: PropTypes.string,
  146. revisionId: PropTypes.string,
  147. crowiRenderer: PropTypes.object.isRequired,
  148. };