PageRevisionList.jsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import React from 'react';
  2. import PropTypes from 'prop-types';
  3. import { withTranslation } from 'react-i18next';
  4. import Revision from './Revision';
  5. import RevisionDiff from './RevisionDiff';
  6. class PageRevisionList extends React.Component {
  7. constructor(props) {
  8. super(props);
  9. this.state = {
  10. isCompactNodiffRevisions: true,
  11. };
  12. this.cbCompactizeChangeHandler = this.cbCompactizeChangeHandler.bind(this);
  13. }
  14. cbCompactizeChangeHandler() {
  15. this.setState({ isCompactNodiffRevisions: !this.state.isCompactNodiffRevisions });
  16. }
  17. /**
  18. * render a row (Revision component and RevisionDiff component)
  19. * @param {Revison} revision
  20. * @param {Revision} previousRevision
  21. * @param {boolean} hasDiff whether revision has difference to previousRevision
  22. * @param {boolean} isContiguousNodiff true if the current 'hasDiff' and one of previous row is both false
  23. */
  24. renderRow(revision, previousRevision, hasDiff, isContiguousNodiff) {
  25. const revisionId = revision._id;
  26. const revisionDiffOpened = this.props.diffOpened[revisionId] || false;
  27. const classNames = ['revision-history-outer'];
  28. if (isContiguousNodiff) {
  29. classNames.push('revision-history-outer-contiguous-nodiff');
  30. }
  31. return (
  32. <div className={classNames.join(' ')} key={`revision-history-${revisionId}`}>
  33. <Revision
  34. t={this.props.t}
  35. revision={revision}
  36. revisionDiffOpened={revisionDiffOpened}
  37. hasDiff={hasDiff}
  38. isCompactNodiffRevisions={this.state.isCompactNodiffRevisions}
  39. onDiffOpenClicked={this.props.onDiffOpenClicked}
  40. key={`revision-history-rev-${revisionId}`}
  41. />
  42. { hasDiff
  43. && (
  44. <RevisionDiff
  45. revisionDiffOpened={revisionDiffOpened}
  46. currentRevision={revision}
  47. previousRevision={previousRevision}
  48. key={`revision-deff-${revisionId}`}
  49. />
  50. )
  51. }
  52. </div>
  53. );
  54. }
  55. render() {
  56. const { t } = this.props;
  57. const revisions = this.props.revisions;
  58. const revisionCount = this.props.revisions.length;
  59. let hasDiffPrev;
  60. const revisionList = this.props.revisions.map((revision, idx) => {
  61. let previousRevision;
  62. if (idx + 1 < revisionCount) {
  63. previousRevision = revisions[idx + 1];
  64. }
  65. else {
  66. previousRevision = revision; // if it is the first revision, show full text as diff text
  67. }
  68. const hasDiff = revision.hasDiffToPrev !== false; // set 'true' if undefined for backward compatibility
  69. const isContiguousNodiff = !hasDiff && !hasDiffPrev;
  70. hasDiffPrev = hasDiff;
  71. return this.renderRow(revision, previousRevision, hasDiff, isContiguousNodiff);
  72. });
  73. const classNames = ['revision-history-list'];
  74. if (this.state.isCompactNodiffRevisions) {
  75. classNames.push('revision-history-list-compact');
  76. }
  77. return (
  78. <React.Fragment>
  79. <div className="custom-control custom-checkbox custom-checkbox-info float-right">
  80. <input
  81. type="checkbox"
  82. id="cbCompactize"
  83. className="custom-control-input"
  84. checked={this.state.isCompactNodiffRevisions}
  85. onChange={this.cbCompactizeChangeHandler}
  86. />
  87. <label className="custom-control-label" htmlFor="cbCompactize">{ t('Shrink versions that have no diffs') }</label>
  88. </div>
  89. <div className="clearfix"></div>
  90. <div className={classNames.join(' ')}>
  91. {revisionList}
  92. </div>
  93. </React.Fragment>
  94. );
  95. }
  96. }
  97. PageRevisionList.propTypes = {
  98. t: PropTypes.func.isRequired, // i18next
  99. revisions: PropTypes.array,
  100. diffOpened: PropTypes.object,
  101. onDiffOpenClicked: PropTypes.func.isRequired,
  102. };
  103. export default withTranslation()(PageRevisionList);