import React from 'react';
import PropTypes from 'prop-types';
import { withTranslation } from 'react-i18next';
import PageHistroyContainer from '../../services/PageHistoryContainer';
import RevisionComparerContainer from '../../services/RevisionComparerContainer';
import Revision from './Revision';
class PageRevisionTable extends React.Component {
/**
* render a row (Revision component and RevisionDiff component)
* @param {Revison} revision
* @param {Revision} previousRevision
* @param {boolean} hasDiff whether revision has difference to previousRevision
* @param {boolean} isContiguousNodiff true if the current 'hasDiff' and one of previous row is both false
*/
renderRow(revision, previousRevision, hasDiff, isContiguousNodiff) {
const { revisionComparerContainer, t } = this.props;
const { latestRevision, oldestRevision } = this.props.pageHistoryContainer.state;
const revisionId = revision._id;
const revisionDiffOpened = this.props.diffOpened[revisionId] || false;
const { sourceRevision, targetRevision } = revisionComparerContainer.state;
const handleCompareLatestRevisionButton = () => {
revisionComparerContainer.setState({ sourceRevision: revision });
revisionComparerContainer.setState({ targetRevision: latestRevision });
};
const handleComparePreviousRevisionButton = () => {
revisionComparerContainer.setState({ sourceRevision: previousRevision });
revisionComparerContainer.setState({ targetRevision: revision });
};
return (
{hasDiff && (
)}
|
{(hasDiff || revision._id === sourceRevision?._id) && (
revisionComparerContainer.setState({ sourceRevision: revision })}
/>
)}
|
{(hasDiff || revision._id === targetRevision?._id) && (
revisionComparerContainer.setState({ targetRevision: revision })}
/>
)}
|
);
}
render() {
const { t, pageHistoryContainer } = this.props;
const revisions = this.props.revisions;
const revisionCount = this.props.revisions.length;
let hasDiffPrev;
const revisionList = this.props.revisions.map((revision, idx) => {
// Returns null because the last revision is for the bottom diff display
if (idx === pageHistoryContainer.state.pagingLimit) {
return null;
}
let previousRevision;
if (idx + 1 < revisionCount) {
previousRevision = revisions[idx + 1];
}
else {
previousRevision = revision; // if it is the first revision, show full text as diff text
}
// let isOldestRevision;
// if (revision === revisionCount - 1) {
// isOldestRevision = true;
// }
const hasDiff = revision.hasDiffToPrev !== false; // set 'true' if undefined for backward compatibility
const isContiguousNodiff = !hasDiff && !hasDiffPrev;
hasDiffPrev = hasDiff;
return this.renderRow(revision, previousRevision, hasDiff, isContiguousNodiff);
});
return (
| { t('page_history.revision') } |
{ t('page_history.comparing_source') } |
{ t('page_history.comparing_target') } |
{revisionList}
);
}
}
PageRevisionTable.propTypes = {
t: PropTypes.func.isRequired, // i18next
pageHistoryContainer: PropTypes.instanceOf(PageHistroyContainer).isRequired,
revisionComparerContainer: PropTypes.instanceOf(RevisionComparerContainer).isRequired,
revisions: PropTypes.array,
diffOpened: PropTypes.object,
};
export default withTranslation()(PageRevisionTable);