Revision.jsx 3.0 KB

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