PageHistory.js 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. import React from 'react';
  2. import Icon from './Common/Icon';
  3. import PageRevisionList from './PageHistory/PageRevisionList';
  4. export default class PageHistory extends React.Component {
  5. constructor(props) {
  6. super(props);
  7. this.crowi = window.crowi; // FIXME
  8. this.state = {
  9. revisions: [],
  10. diffOpened: {},
  11. };
  12. this.getPreviousRevision = this.getPreviousRevision.bind(this);
  13. this.onDiffOpenClicked = this.onDiffOpenClicked.bind(this);
  14. }
  15. componentDidMount() {
  16. const pageId = this.props.pageId;
  17. if (!pageId) {
  18. return ;
  19. }
  20. this.crowi.apiGet('/revisions.ids', {page_id: pageId})
  21. .then(res => {
  22. const rev = res.revisions;
  23. let diffOpened = {};
  24. const lastId = rev.length - 1;
  25. res.revisions.map((revision, i) => {
  26. const user = this.crowi.findUserById(revision.author);
  27. if (user) {
  28. rev[i].author = user;
  29. }
  30. if (i === 0 || i === lastId) {
  31. console.log('DEbug, diffopen', revision._id);
  32. diffOpened[revision._id] = true;
  33. } else {
  34. diffOpened[revision._id] = false;
  35. }
  36. });
  37. this.setState({
  38. revisions: rev,
  39. diffOpened: diffOpened,
  40. });
  41. // load 0, and last default
  42. if (rev[0]) {
  43. this.fetchPageRevisionBody(rev[0]);
  44. }
  45. if (rev[1]) {
  46. this.fetchPageRevisionBody(rev[1]);
  47. }
  48. if (lastId !== 0 && lastId !== 1 && rev[lastId]) {
  49. this.fetchPageRevisionBody(rev[lastId]);
  50. }
  51. }).catch(err => {
  52. // do nothing
  53. });
  54. }
  55. getPreviousRevision(currentRevision) {
  56. console.log('getPreviousRevision', currentRevision, this.state.revisions);
  57. let cursor = null;
  58. for (let revision of this.state.revisions) {
  59. if (cursor && cursor._id == currentRevision._id) {
  60. cursor = revision;
  61. break;
  62. }
  63. cursor = revision;
  64. }
  65. return cursor;
  66. }
  67. onDiffOpenClicked(revision)
  68. {
  69. const diffOpened = this.state.diffOpened,
  70. revisionId = revision._id;
  71. if (diffOpened[revisionId]) {
  72. return ;
  73. }
  74. diffOpened[revisionId] = true;
  75. this.setState({
  76. diffOpened
  77. });
  78. this.fetchPageRevisionBody(revision);
  79. this.fetchPageRevisionBody(this.getPreviousRevision(revision));
  80. }
  81. fetchPageRevisionBody(revision)
  82. {
  83. if (revision.body) {
  84. return ;
  85. }
  86. this.crowi.apiGet('/revisions.get', {revision_id: revision._id})
  87. .then(res => {
  88. if (res.ok) {
  89. this.setState({
  90. revisions: this.state.revisions.map((rev) => {
  91. if (rev._id == res.revision._id) {
  92. return res.revision;
  93. }
  94. return rev;
  95. })
  96. })
  97. }
  98. }).catch(err => {
  99. });
  100. }
  101. render() {
  102. return (
  103. <div>
  104. <h1><Icon name="history" /> History</h1>
  105. <PageRevisionList
  106. revisions={this.state.revisions}
  107. diffOpened={this.state.diffOpened}
  108. getPreviousRevision={this.getPreviousRevision}
  109. onDiffOpenClicked={this.onDiffOpenClicked}
  110. />
  111. </div>
  112. );
  113. }
  114. }
  115. PageHistory.propTypes = {
  116. pageId: React.PropTypes.string,
  117. };
  118. /*
  119. <div class="tab-pane revision-history" id="revision-history">
  120. <div class="revision-history-list">
  121. {% for tt in tree %}
  122. <div class="revision-hisory-outer">
  123. <img src="{{ tt.author|picture }}" class="picture picture-rounded">
  124. <div class="revision-history-main">
  125. <div class="revision-history-author">
  126. <strong>{% if tt.author %}{{ tt.author.username }}{% else %}-{% endif %}</strong>
  127. </div>
  128. <div class="revision-history-comment">
  129. </div>
  130. <div class="revision-history-meta">
  131. {{ tt.createdAt|datetz('Y-m-d H:i:s') }}
  132. <br>
  133. <a href="?revision={{ tt._id.toString() }}"><i class="fa fa-history"></i> {{ t('View this version') }}</a>
  134. <a class="diff-view" data-revision-id="{{ tt._id.toString() }}">
  135. <i id="diff-icon-{{ tt._id.toString() }}" class="fa fa-arrow-circle-right"></i> {{ t('View diff') }}
  136. </a>
  137. <div class="" id="diff-display-{{ tt._id.toString()}}" style="display: none"></div>
  138. </div>
  139. </div>
  140. </div>
  141. {% endfor %}
  142. </div>
  143. */