mirror of
https://github.com/docmost/docmost.git
synced 2026-08-30 02:25:01 +08:00
* Show actual history changes * V2 - WIP * feat: page history diff * fix: exclude content from history listing --------- Co-authored-by: Jason Norwood-Young <jason@10layer.com>
112 lines
3.4 KiB
TypeScript
112 lines
3.4 KiB
TypeScript
import {
|
|
ActionIcon,
|
|
Group,
|
|
Paper,
|
|
ScrollArea,
|
|
Switch,
|
|
Text,
|
|
} from "@mantine/core";
|
|
import HistoryList from "@/features/page-history/components/history-list";
|
|
import classes from "./css/history.module.css";
|
|
import { useAtom, useAtomValue } from "jotai";
|
|
import {
|
|
activeHistoryIdAtom,
|
|
activeHistoryPrevIdAtom,
|
|
diffCountsAtom,
|
|
highlightChangesAtom,
|
|
} from "@/features/page-history/atoms/history-atoms";
|
|
import HistoryView from "@/features/page-history/components/history-view";
|
|
import { useRef } from "react";
|
|
import { IconChevronUp, IconChevronDown } from "@tabler/icons-react";
|
|
import { useTranslation } from "react-i18next";
|
|
import {
|
|
useDiffNavigation,
|
|
useHistoryReset,
|
|
} from "@/features/page-history/hooks";
|
|
|
|
interface Props {
|
|
pageId: string;
|
|
}
|
|
|
|
export default function HistoryModalBody({ pageId }: Props) {
|
|
const { t } = useTranslation();
|
|
const scrollViewportRef = useRef<HTMLDivElement>(null);
|
|
|
|
const activeHistoryId = useAtomValue(activeHistoryIdAtom);
|
|
const activeHistoryPrevId = useAtomValue(activeHistoryPrevIdAtom);
|
|
const [highlightChanges, setHighlightChanges] = useAtom(highlightChangesAtom);
|
|
const diffCounts = useAtomValue(diffCountsAtom);
|
|
|
|
useHistoryReset(pageId);
|
|
const { currentChangeIndex, handlePrevChange, handleNextChange } =
|
|
useDiffNavigation(scrollViewportRef);
|
|
|
|
return (
|
|
<div className={classes.sidebarFlex}>
|
|
<nav className={classes.sidebar}>
|
|
<div className={classes.sidebarMain}>
|
|
<HistoryList pageId={pageId} />
|
|
</div>
|
|
</nav>
|
|
|
|
<div style={{ position: "relative", flex: 1 }}>
|
|
<ScrollArea
|
|
h={650}
|
|
w="100%"
|
|
scrollbarSize={5}
|
|
viewportRef={scrollViewportRef}
|
|
>
|
|
<div className={classes.sidebarRightSection}>
|
|
{activeHistoryId && <HistoryView />}
|
|
</div>
|
|
</ScrollArea>
|
|
|
|
{activeHistoryId && activeHistoryPrevId && (
|
|
<Paper
|
|
shadow="md"
|
|
radius="xl"
|
|
px="md"
|
|
py="xs"
|
|
style={{
|
|
position: "absolute",
|
|
bottom: 16,
|
|
left: "50%",
|
|
transform: "translateX(-50%)",
|
|
}}
|
|
>
|
|
<Group gap="md" wrap="nowrap">
|
|
<Switch
|
|
label={t("Highlight changes")}
|
|
checked={highlightChanges}
|
|
onChange={(e) => setHighlightChanges(e.currentTarget.checked)}
|
|
styles={{ label: { userSelect: "none", whiteSpace: "nowrap" } }}
|
|
/>
|
|
{highlightChanges && diffCounts && diffCounts.total > 0 && (
|
|
<Group gap="xs" wrap="nowrap">
|
|
<Text size="sm" c="dimmed" style={{ whiteSpace: "nowrap" }}>
|
|
{currentChangeIndex} of {diffCounts.total}
|
|
</Text>
|
|
<ActionIcon
|
|
variant="subtle"
|
|
size="sm"
|
|
onClick={handlePrevChange}
|
|
>
|
|
<IconChevronUp size={16} />
|
|
</ActionIcon>
|
|
<ActionIcon
|
|
variant="subtle"
|
|
size="sm"
|
|
onClick={handleNextChange}
|
|
>
|
|
<IconChevronDown size={16} />
|
|
</ActionIcon>
|
|
</Group>
|
|
)}
|
|
</Group>
|
|
</Paper>
|
|
)}
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|