import React from 'react';
import { useTranslation } from 'next-i18next';
import PropTypes from 'prop-types';
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, latestRevision, isOldestRevision, hasDiff) {
const {
t, sourceRevision, targetRevision, onChangeSourceInvoked, onChangeTargetInvoked,
} = this.props;
const revisionId = revision._id;
const handleCompareLatestRevisionButton = () => {
onChangeSourceInvoked(revision);
onChangeTargetInvoked(latestRevision);
};
const handleComparePreviousRevisionButton = () => {
onChangeSourceInvoked(previousRevision);
onChangeTargetInvoked(revision);
};
return (
{hasDiff && (
)}
|
{(hasDiff || revisionId === sourceRevision?._id) && (
onChangeSourceInvoked(revision)}
/>
)}
|
{(hasDiff || revisionId === targetRevision?._id) && (
onChangeTargetInvoked(revision)}
/>
)}
|
);
}
render() {
const { t, pagingLimit } = this.props;
const revisions = this.props.revisions;
const revisionCount = this.props.revisions.length;
const latestRevision = revisions[0];
const oldestRevision = revisions[revisions.length - 1];
let hasDiffPrev;
const revisionList = this.props.revisions.map((revision, idx) => {
// Returns null because the last revision is for the bottom diff display
if (idx === 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
}
const isOldestRevision = revision === oldestRevision;
const hasDiff = revision.hasDiffToPrev !== false; // set 'true' if undefined for backward compatibility
hasDiffPrev = hasDiff;
return this.renderRow(revision, previousRevision, latestRevision, isOldestRevision, hasDiff);
});
return (
| { t('page_history.revision') } |
{ t('page_history.comparing_source') } |
{ t('page_history.comparing_target') } |
{revisionList}
);
}
}
PageRevisionTable.propTypes = {
t: PropTypes.func.isRequired, // i18next
revisions: PropTypes.array,
pagingLimit: PropTypes.number,
sourceRevision: PropTypes.instanceOf(Object),
targetRevision: PropTypes.instanceOf(Object),
onChangeSourceInvoked: PropTypes.func.isRequired,
onChangeTargetInvoked: PropTypes.func.isRequired,
};
const PageRevisionTableWrapperFC = (props) => {
const { t } = useTranslation();
return ;
};
export default PageRevisionTableWrapperFC;