Skip to content

Commit 679f6b0

Browse files
committed
Recover relationships after undoing 'field_delete'
1 parent 9c82066 commit 679f6b0

File tree

2 files changed

+79
-63
lines changed

2 files changed

+79
-63
lines changed

src/components/EditorHeader/ControlPanel.jsx

Lines changed: 29 additions & 27 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,
@@ -166,27 +167,49 @@ export default function ControlPanel({
166167
updateField(a.tid, a.fid, a.undo);
167168
} else if (a.component === "field_delete") {
168169
setRelationships((prev) => {
169-
return prev.map((e) => {
170-
if (e.startTableId === a.tid && e.startFieldId >= a.data.id) {
170+
let temp = [...prev];
171+
a.data.relationship.forEach((r) => {
172+
temp.splice(r.id, 0, r);
173+
});
174+
temp = temp.map((e, i) => {
175+
const recoveredRel = a.data.relationship.find(
176+
(x) =>
177+
(x.startTableId === e.startTableId &&
178+
x.startFieldId === e.startFieldId) ||
179+
(x.endTableId === e.endTableId &&
180+
x.endFieldId === a.endFieldId),
181+
);
182+
if (
183+
e.startTableId === a.tid &&
184+
e.startFieldId >= a.data.field.id &&
185+
!recoveredRel
186+
) {
171187
return {
172188
...e,
189+
id: i,
173190
startFieldId: e.startFieldId + 1,
174191
};
175192
}
176-
if (e.endTableId === a.tid && e.endFieldId >= a.data.id) {
193+
if (
194+
e.endTableId === a.tid &&
195+
e.endFieldId >= a.data.field.id &&
196+
!recoveredRel
197+
) {
177198
return {
178199
...e,
200+
id: i,
179201
endFieldId: e.endFieldId + 1,
180202
};
181203
}
182-
return e;
204+
return { ...e, id: i };
183205
});
206+
return temp;
184207
});
185208
setTables((prev) =>
186209
prev.map((t) => {
187210
if (t.id === a.tid) {
188211
const temp = t.fields.slice();
189-
temp.splice(a.data.id, 0, a.data);
212+
temp.splice(a.data.field.id, 0, a.data.field);
190213
return { ...t, fields: temp.map((t, i) => ({ ...t, id: i })) };
191214
}
192215
return t;
@@ -334,28 +357,7 @@ export default function ControlPanel({
334357
if (a.component === "field") {
335358
updateField(a.tid, a.fid, a.redo);
336359
} 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-
});
360+
deleteField(a.data.field, a.tid, false);
359361
} else if (a.component === "field_add") {
360362
updateTable(a.tid, {
361363
fields: [

src/context/TablesContext.jsx

Lines changed: 50 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -130,49 +130,63 @@ export default function TablesContextProvider({ children }) {
130130
);
131131
};
132132

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
133+
const deleteField = (field, tid, addToHistory = true) => {
134+
if (addToHistory) {
135+
const rels = relationships.reduce((acc, r) => {
136+
if (
137+
(r.startTableId === tid && r.startFieldId === field.id) ||
138+
(r.endTableId === tid && r.endFieldId === field.id)
139+
) {
140+
acc.push(r);
141+
}
142+
return acc;
143+
}, []);
144+
setUndoStack((prev) => [
145+
...prev,
146+
{
147+
action: Action.EDIT,
148+
element: ObjectType.TABLE,
149+
component: "field_delete",
150+
tid: tid,
151+
data: {
152+
field: field,
153+
relationship: rels,
154+
},
155+
message: t("edit_table", {
156+
tableName: tables[tid].name,
157+
extra: "[delete field]",
158+
}),
159+
},
160+
]);
161+
setRedoStack([]);
162+
}
163+
setRelationships((prev) => {
164+
const temp = prev
151165
.filter(
152166
(e) =>
153167
!(
154168
(e.startTableId === tid && e.startFieldId === field.id) ||
155169
(e.endTableId === tid && e.endFieldId === field.id)
156170
),
157171
)
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-
});
172+
.map((e, i) => {
173+
if (e.startTableId === tid && e.startFieldId > field.id) {
174+
return {
175+
...e,
176+
startFieldId: e.startFieldId - 1,
177+
id: i,
178+
};
179+
}
180+
if (e.endTableId === tid && e.endFieldId > field.id) {
181+
return {
182+
...e,
183+
endFieldId: e.endFieldId - 1,
184+
id: i,
185+
};
186+
}
187+
return { ...e, id: i };
188+
});
189+
return temp;
176190
});
177191
updateTable(tid, {
178192
fields: tables[tid].fields

0 commit comments

Comments
 (0)