| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117 |
- import React, { useState } from 'react';
- import type { IRevisionHasPageId } from '@growi/core';
- import { pagePathUtils } from '@growi/core/dist/utils';
- import { useTranslation } from 'next-i18next';
- import { CopyToClipboard } from 'react-copy-to-clipboard';
- import {
- Dropdown, DropdownToggle, DropdownMenu, DropdownItem,
- } from 'reactstrap';
- import { RevisionDiff } from '../PageHistory/RevisionDiff';
- import styles from './RevisionComparer.module.scss';
- const { encodeSpaces } = pagePathUtils;
- const DropdownItemContents = ({ title, contents }) => (
- <>
- <div className="h6 mt-1 mb-2"><strong>{title}</strong></div>
- <div className="card mb-1 p-2">{contents}</div>
- </>
- );
- type RevisionComparerProps = {
- sourceRevision: IRevisionHasPageId
- targetRevision: IRevisionHasPageId
- currentPageId?: string
- currentPagePath: string
- onClose: () => void
- }
- export const RevisionComparer = (props: RevisionComparerProps): JSX.Element => {
- const { t } = useTranslation(['translation', 'commons']);
- const {
- sourceRevision, targetRevision, onClose, currentPageId, currentPagePath,
- } = props;
- const [dropdownOpen, setDropdownOpen] = useState(false);
- const toggleDropdown = () => {
- setDropdownOpen(!dropdownOpen);
- };
- const generateURL = (pathName: string) => {
- const { origin } = window.location;
- const url = new URL(pathName, origin);
- if (sourceRevision != null && targetRevision != null) {
- const urlParams = `${sourceRevision._id}...${targetRevision._id}`;
- url.searchParams.set('compare', urlParams);
- }
- return encodeSpaces(decodeURI(url.href));
- };
- const isNodiff = (sourceRevision == null || targetRevision == null) ? true : sourceRevision._id === targetRevision._id;
- if (currentPageId == null || currentPagePath == null) {
- return <>{ t('not_found_page.page_not_exist')}</>;
- }
- return (
- <div className={`${styles['revision-compare']} revision-compare`}>
- <div className="d-flex">
- <h4 className="align-self-center">{ t('page_history.comparing_revisions') }</h4>
- { !isNodiff && (
- <Dropdown
- className="grw-copy-dropdown align-self-center ms-auto"
- isOpen={dropdownOpen}
- toggle={() => toggleDropdown()}
- >
- <DropdownToggle className="btn-copy">
- <span className="material-symbols-outlined">content_paste</span>
- </DropdownToggle>
- <DropdownMenu strategy="fixed" end>
- {/* Page path URL */}
- <CopyToClipboard text={generateURL(currentPagePath)}>
- <DropdownItem className="px-3">
- <DropdownItemContents title={t('copy_to_clipboard.Page URL', { ns: 'commons' })} contents={generateURL(currentPagePath)} />
- </DropdownItem>
- </CopyToClipboard>
- {/* Permanent Link URL */}
- <CopyToClipboard text={generateURL(currentPageId)}>
- <DropdownItem className="px-3">
- <DropdownItemContents title={t('copy_to_clipboard.Permanent link', { ns: 'commons' })} contents={generateURL(currentPageId)} />
- </DropdownItem>
- </CopyToClipboard>
- <DropdownItem divider className="my-0"></DropdownItem>
- </DropdownMenu>
- </Dropdown>
- ) }
- </div>
- <div className={`revision-compare-container ${isNodiff ? 'nodiff' : ''}`}>
- { isNodiff
- ? (
- <span className="h3 text-muted">{t('No diff')}</span>
- )
- : (
- <RevisionDiff
- revisionDiffOpened
- previousRevision={sourceRevision}
- currentRevision={targetRevision}
- currentPageId={currentPageId}
- currentPagePath={currentPagePath}
- onClose={onClose}
- />
- )
- }
- </div>
- </div>
- );
- };
|