Revision.jsx 3.1 KB

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