Skip to content

Commit 44d5f7b

Browse files
committed
Fix recovering relationships after delete operations (#84)
2 parents 1768c39 + 3988b8d commit 44d5f7b

File tree

3 files changed

+90
-67
lines changed

3 files changed

+90
-67
lines changed

src/components/EditorCanvas/Canvas.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ export default function Canvas() {
362362
tables[linkingLine.startTableId].fields[linkingLine.startFieldId].type !==
363363
tables[hoveredTable.tableId].fields[hoveredTable.field].type
364364
) {
365-
Toast.info(t("connot_connect"));
365+
Toast.info(t("cannot_connect"));
366366
return;
367367
}
368368
if (

src/components/EditorHeader/ControlPanel.jsx

Lines changed: 32 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ export default function ControlPanel({
8888
setTables,
8989
addTable,
9090
updateTable,
91+
deleteField,
9192
deleteTable,
9293
updateField,
9394
setRelationships,
@@ -145,7 +146,8 @@ export default function ControlPanel({
145146
}
146147
} else if (a.action === Action.DELETE) {
147148
if (a.element === ObjectType.TABLE) {
148-
addTable(a.data, false);
149+
a.data.relationship.forEach((x) => addRelationship(x, false));
150+
addTable(a.data.table, false);
149151
} else if (a.element === ObjectType.RELATIONSHIP) {
150152
addRelationship(a.data, false);
151153
} else if (a.element === ObjectType.NOTE) {
@@ -166,27 +168,49 @@ export default function ControlPanel({
166168
updateField(a.tid, a.fid, a.undo);
167169
} else if (a.component === "field_delete") {
168170
setRelationships((prev) => {
169-
return prev.map((e) => {
170-
if (e.startTableId === a.tid && e.startFieldId >= a.data.id) {
171+
let temp = [...prev];
172+
a.data.relationship.forEach((r) => {
173+
temp.splice(r.id, 0, r);
174+
});
175+
temp = temp.map((e, i) => {
176+
const recoveredRel = a.data.relationship.find(
177+
(x) =>
178+
(x.startTableId === e.startTableId &&
179+
x.startFieldId === e.startFieldId) ||
180+
(x.endTableId === e.endTableId &&
181+
x.endFieldId === a.endFieldId),
182+
);
183+
if (
184+
e.startTableId === a.tid &&
185+
e.startFieldId >= a.data.field.id &&
186+
!recoveredRel
187+
) {
171188
return {
172189
...e,
190+
id: i,
173191
startFieldId: e.startFieldId + 1,
174192
};
175193
}
176-
if (e.endTableId === a.tid && e.endFieldId >= a.data.id) {
194+
if (
195+
e.endTableId === a.tid &&
196+
e.endFieldId >= a.data.field.id &&
197+
!recoveredRel
198+
) {
177199
return {
178200
...e,
201+
id: i,
179202
endFieldId: e.endFieldId + 1,
180203
};
181204
}
182-
return e;
205+
return { ...e, id: i };
183206
});
207+
return temp;
184208
});
185209
setTables((prev) =>
186210
prev.map((t) => {
187211
if (t.id === a.tid) {
188212
const temp = t.fields.slice();
189-
temp.splice(a.data.id, 0, a.data);
213+
temp.splice(a.data.field.id, 0, a.data.field);
190214
return { ...t, fields: temp.map((t, i) => ({ ...t, id: i })) };
191215
}
192216
return t;
@@ -314,7 +338,7 @@ export default function ControlPanel({
314338
}
315339
} else if (a.action === Action.DELETE) {
316340
if (a.element === ObjectType.TABLE) {
317-
deleteTable(a.data.id, false);
341+
deleteTable(a.data.table.id, false);
318342
} else if (a.element === ObjectType.RELATIONSHIP) {
319343
deleteRelationship(a.data.id, false);
320344
} else if (a.element === ObjectType.NOTE) {
@@ -334,28 +358,7 @@ export default function ControlPanel({
334358
if (a.component === "field") {
335359
updateField(a.tid, a.fid, a.redo);
336360
} else if (a.component === "field_delete") {
337-
setRelationships((prev) => {
338-
return prev.map((e) => {
339-
if (e.startTableId === a.tid && e.startFieldId > a.data.id) {
340-
return {
341-
...e,
342-
startFieldId: e.startFieldId - 1,
343-
};
344-
}
345-
if (e.endTableId === a.tid && e.endFieldId > a.data.id) {
346-
return {
347-
...e,
348-
endFieldId: e.endFieldId - 1,
349-
};
350-
}
351-
return e;
352-
});
353-
});
354-
updateTable(a.tid, {
355-
fields: tables[a.tid].fields
356-
.filter((field) => field.id !== a.data.id)
357-
.map((e, i) => ({ ...e, id: i })),
358-
});
361+
deleteField(a.data.field, a.tid, false);
359362
} else if (a.component === "field_add") {
360363
updateTable(a.tid, {
361364
fields: [

src/context/TablesContext.jsx

Lines changed: 57 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -68,12 +68,18 @@ export default function TablesContextProvider({ children }) {
6868
const deleteTable = (id, addToHistory = true) => {
6969
if (addToHistory) {
7070
Toast.success(t("table_deleted"));
71+
const rels = relationships.reduce((acc, r) => {
72+
if (r.startTableId === id || r.endTableId === id) {
73+
acc.push(r);
74+
}
75+
return acc;
76+
}, []);
7177
setUndoStack((prev) => [
7278
...prev,
7379
{
7480
action: Action.DELETE,
7581
element: ObjectType.TABLE,
76-
data: tables[id],
82+
data: { table: tables[id], relationship: rels },
7783
message: t("delete_table", { tableName: tables[id] }),
7884
},
7985
]);
@@ -130,49 +136,63 @@ export default function TablesContextProvider({ children }) {
130136
);
131137
};
132138

133-
const deleteField = (field, tid) => {
134-
setUndoStack((prev) => [
135-
...prev,
136-
{
137-
action: Action.EDIT,
138-
element: ObjectType.TABLE,
139-
component: "field_delete",
140-
tid: tid,
141-
data: field,
142-
message: t("edit_table", {
143-
tableName: tables[tid].name,
144-
extra: "[delete field]",
145-
}),
146-
},
147-
]);
148-
setRedoStack([]);
149-
setRelationships((prev) =>
150-
prev
139+
const deleteField = (field, tid, addToHistory = true) => {
140+
if (addToHistory) {
141+
const rels = relationships.reduce((acc, r) => {
142+
if (
143+
(r.startTableId === tid && r.startFieldId === field.id) ||
144+
(r.endTableId === tid && r.endFieldId === field.id)
145+
) {
146+
acc.push(r);
147+
}
148+
return acc;
149+
}, []);
150+
setUndoStack((prev) => [
151+
...prev,
152+
{
153+
action: Action.EDIT,
154+
element: ObjectType.TABLE,
155+
component: "field_delete",
156+
tid: tid,
157+
data: {
158+
field: field,
159+
relationship: rels,
160+
},
161+
message: t("edit_table", {
162+
tableName: tables[tid].name,
163+
extra: "[delete field]",
164+
}),
165+
},
166+
]);
167+
setRedoStack([]);
168+
}
169+
setRelationships((prev) => {
170+
const temp = prev
151171
.filter(
152172
(e) =>
153173
!(
154174
(e.startTableId === tid && e.startFieldId === field.id) ||
155175
(e.endTableId === tid && e.endFieldId === field.id)
156176
),
157177
)
158-
.map((e, i) => ({ ...e, id: i })),
159-
);
160-
setRelationships((prev) => {
161-
return prev.map((e) => {
162-
if (e.startTableId === tid && e.startFieldId > field.id) {
163-
return {
164-
...e,
165-
startFieldId: e.startFieldId - 1,
166-
};
167-
}
168-
if (e.endTableId === tid && e.endFieldId > field.id) {
169-
return {
170-
...e,
171-
endFieldId: e.endFieldId - 1,
172-
};
173-
}
174-
return e;
175-
});
178+
.map((e, i) => {
179+
if (e.startTableId === tid && e.startFieldId > field.id) {
180+
return {
181+
...e,
182+
startFieldId: e.startFieldId - 1,
183+
id: i,
184+
};
185+
}
186+
if (e.endTableId === tid && e.endFieldId > field.id) {
187+
return {
188+
...e,
189+
endFieldId: e.endFieldId - 1,
190+
id: i,
191+
};
192+
}
193+
return { ...e, id: i };
194+
});
195+
return temp;
176196
});
177197
updateTable(tid, {
178198
fields: tables[tid].fields

0 commit comments

Comments
 (0)