diff --git a/public/locales/en/translation.json b/public/locales/en/translation.json index 3b80213489..99924dfcb1 100644 --- a/public/locales/en/translation.json +++ b/public/locales/en/translation.json @@ -436,6 +436,9 @@ "undo": { "undo": "Undo Merge", "undoDialog": "Undo this merge?", + "deleted": "Deleted:", + "undoDelete": "Undo Deletion", + "undoDeleteDialog": "Undo this deletion?", "undoDisabled": "Undo unavailable" } }, diff --git a/src/goals/MergeDuplicates/MergeDupsCompleted.tsx b/src/goals/MergeDuplicates/MergeDupsCompleted.tsx index 1b00f72cdf..8f05fcfaa9 100644 --- a/src/goals/MergeDuplicates/MergeDupsCompleted.tsx +++ b/src/goals/MergeDuplicates/MergeDupsCompleted.tsx @@ -27,7 +27,9 @@ export default function MergeDupsCompleted(): ReactElement { {t("mergeDups.title")} {MergesCount(changes)} - {changes.merges?.map(MergeChange)} + {changes.merges?.map((m, i) => ( + + ))} ); } @@ -43,52 +45,56 @@ export function MergesCount(changes: MergesCompleted): ReactElement { ); } -function MergeChange(change: MergeUndoIds): ReactElement { +export function MergeChange(props: { change: MergeUndoIds }): ReactElement { + const change = props.change; + const { t } = useTranslation(); const handleIsUndoAllowed = (): Promise => getFrontierWords().then((words) => doWordsIncludeMerges(words, change)); + const isDeletion = !change.parentIds.length; return ( -
- + {isDeletion && {t("mergeDups.undo.deleted")}} + {change.childIds.map((id) => ( + + ))} + {!isDeletion && ( + <> + + + + {change.parentIds.map((id) => ( + + ))} + + )} + { + await undoMerge(change); }} - > - {change.childIds.map((id) => ( - - ))} - - - - {change.parentIds.length ? ( - change.parentIds.map((id) => ) - ) : ( - - )} - { - await undoMerge(change); - }} - /> - -
+ /> + ); } diff --git a/src/goals/MergeDuplicates/tests/MergeDupsCompleted.test.tsx b/src/goals/MergeDuplicates/tests/MergeDupsCompleted.test.tsx index a744aa00cb..7d2dcc338d 100644 --- a/src/goals/MergeDuplicates/tests/MergeDupsCompleted.test.tsx +++ b/src/goals/MergeDuplicates/tests/MergeDupsCompleted.test.tsx @@ -1,7 +1,33 @@ +import { act, create } from "react-test-renderer"; + import { MergeUndoIds, Word } from "api/models"; -import { doWordsIncludeMerges } from "goals/MergeDuplicates/MergeDupsCompleted"; +import { + MergeChange, + doWordsIncludeMerges, +} from "goals/MergeDuplicates/MergeDupsCompleted"; import { newWord } from "types/word"; +jest.mock("backend", () => ({ + getFrontierWords: () => Promise.resolve([]), + getWord: () => Promise.resolve(undefined), +})); + +describe("MergeChange", () => { + const renderMergeChange = async (change: MergeUndoIds): Promise => { + await act(async () => { + create(); + }); + }; + + it("renders merge (with parents)", () => { + renderMergeChange({ childIds: ["c1", "c2"], parentIds: ["p1, p2"] }); + }); + + it("renders deletion (no parents)", () => { + renderMergeChange({ childIds: ["c1", "c2"], parentIds: [] }); + }); +}); + describe("doWordsIncludeMerges", () => { it("should return false if words doesn't contain all of the parentIds in merge", () => { const merge: MergeUndoIds = {