Revision.jsx 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import UserDate from '../Common/UserDate';
  4. import UserPicture from '../User/UserPicture';
  5. export default class Revision extends React.Component {
  6. constructor(props) {
  7. super(props);
  8. this._onDiffOpenClicked = this._onDiffOpenClicked.bind(this);
  9. }
  10. componentDidMount() {
  11. }
  12. _onDiffOpenClicked() {
  13. this.props.onDiffOpenClicked(this.props.revision);
  14. }
  15. renderSimplifiedNodiff(revision) {
  16. const author = revision.author;
  17. let pic = '';
  18. if (typeof author === 'object') {
  19. pic = <UserPicture user={author} size='sm' />;
  20. }
  21. return (
  22. <div className="revision-history-main revision-history-main-nodiff my-1 d-flex align-items-center">
  23. <div className="picture-container">
  24. {pic}
  25. </div>
  26. <div className="m-l-10">
  27. <div className="revision-history-meta">
  28. <span className="text-muted small">
  29. <UserDate dateTime={revision.createdAt} /> (No diff)
  30. </span>
  31. </div>
  32. </div>
  33. </div>
  34. );
  35. }
  36. renderFull(revision) {
  37. const author = revision.author;
  38. let pic = '';
  39. if (typeof author === 'object') {
  40. pic = <UserPicture user={author} size='lg' />;
  41. }
  42. const iconClass = this.props.revisionDiffOpened ? 'caret caret-opened' : 'caret';
  43. return (
  44. <div className="revision-history-main d-flex mt-3">
  45. <div className="m-t-5">
  46. {pic}
  47. </div>
  48. <div className="m-l-10">
  49. <div className="revision-history-author">
  50. <strong>{author.username}</strong>
  51. </div>
  52. <div className="revision-history-meta">
  53. <p>
  54. <UserDate dateTime={revision.createdAt} />
  55. </p>
  56. <p>
  57. <span className='d-inline-block' style={{ minWidth: '80px' }}>
  58. { !this.props.hasDiff &&
  59. <span className='text-muted'>No diff</span>
  60. }
  61. { this.props.hasDiff &&
  62. <a className="diff-view" onClick={this._onDiffOpenClicked}>
  63. <i className={iconClass}></i> View diff
  64. </a>
  65. }
  66. </span>
  67. <a href={'?revision=' + revision._id } className="m-l-10">
  68. <i className="icon-login"></i> Go to this version
  69. </a>
  70. </p>
  71. </div>
  72. </div>
  73. </div>
  74. );
  75. }
  76. render() {
  77. const revision = this.props.revision;
  78. if (this.props.isCompactNodiffRevisions && !this.props.hasDiff) {
  79. return this.renderSimplifiedNodiff(revision);
  80. }
  81. else {
  82. return this.renderFull(revision);
  83. }
  84. }
  85. }
  86. Revision.propTypes = {
  87. revision: PropTypes.object,
  88. revisionDiffOpened: PropTypes.bool.isRequired,
  89. hasDiff: PropTypes.bool.isRequired,
  90. isCompactNodiffRevisions: PropTypes.bool.isRequired,
  91. onDiffOpenClicked: PropTypes.func.isRequired,
  92. };