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 = {