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 ( {revisionList}
{ t('page_history.revision') } { t('page_history.comparing_source') } { t('page_history.comparing_target') }
); } } 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;