PageHistory.js 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import Icon from './Common/Icon';
  4. import PageRevisionList from './PageHistory/PageRevisionList';
  5. export default class PageHistory extends React.Component {
  6. constructor(props) {
  7. super(props);
  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.props.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.props.crowi.findUserById(revision.author);
  27. if (user) {
  28. rev[i].author = user;
  29. }
  30. if (i === 0 || i === lastId) {
  31. diffOpened[revision._id] = true;
  32. } else {
  33. diffOpened[revision._id] = false;
  34. }
  35. });
  36. this.setState({
  37. revisions: rev,
  38. diffOpened: diffOpened,
  39. });
  40. // load 0, and last default
  41. if (rev[0]) {
  42. this.fetchPageRevisionBody(rev[0]);
  43. }
  44. if (rev[1]) {
  45. this.fetchPageRevisionBody(rev[1]);
  46. }
  47. if (lastId !== 0 && lastId !== 1 && rev[lastId]) {
  48. this.fetchPageRevisionBody(rev[lastId]);
  49. }
  50. }).catch(err => {
  51. // do nothing
  52. });
  53. }
  54. getPreviousRevision(currentRevision) {
  55. let cursor = null;
  56. for (let revision of this.state.revisions) {
  57. if (cursor && cursor._id == currentRevision._id) {
  58. cursor = revision;
  59. break;
  60. }
  61. cursor = revision;
  62. }
  63. return cursor;
  64. }
  65. onDiffOpenClicked(revision) {
  66. const diffOpened = this.state.diffOpened,
  67. revisionId = revision._id;
  68. if (diffOpened[revisionId]) {
  69. return ;
  70. }
  71. diffOpened[revisionId] = true;
  72. this.setState({
  73. diffOpened
  74. });
  75. this.fetchPageRevisionBody(revision);
  76. this.fetchPageRevisionBody(this.getPreviousRevision(revision));
  77. }
  78. fetchPageRevisionBody(revision) {
  79. if (revision.body) {
  80. return ;
  81. }
  82. this.props.crowi.apiGet('/revisions.get', {revision_id: revision._id})
  83. .then(res => {
  84. if (res.ok) {
  85. this.setState({
  86. revisions: this.state.revisions.map((rev) => {
  87. if (rev._id == res.revision._id) {
  88. return res.revision;
  89. }
  90. return rev;
  91. })
  92. })
  93. }
  94. }).catch(err => {
  95. });
  96. }
  97. render() {
  98. return (
  99. <div>
  100. <h1><Icon name="history" /> History</h1>
  101. <PageRevisionList
  102. revisions={this.state.revisions}
  103. diffOpened={this.state.diffOpened}
  104. getPreviousRevision={this.getPreviousRevision}
  105. onDiffOpenClicked={this.onDiffOpenClicked}
  106. />
  107. </div>
  108. );
  109. }
  110. }
  111. PageHistory.propTypes = {
  112. pageId: PropTypes.string,
  113. crowi: PropTypes.object.isRequired,
  114. };