fix(eraser): Remove binding from the other element

This commit is contained in:
Mark Tolmacs
2025-08-15 19:27:55 +02:00
parent ab24ebbf87
commit c1ce197b30

View File

@@ -243,6 +243,7 @@ import {
getBindingStrategyForDraggingBindingElementEndpoints,
getStartGlobalEndLocalPointsForSimpleArrowBinding,
snapToCenter,
mutateElement,
} from "@excalidraw/element";
import type { GlobalPoint, LocalPoint, Radians } from "@excalidraw/math";
@@ -10507,6 +10508,67 @@ class App extends React.Component<AppProps, AppState> {
private eraseElements = () => {
let didChange = false;
// Binding is double accounted on both elements and if one of them is
// deleted, the binding should be removed
this.elementsPendingErasure.forEach((id) => {
const element = this.scene.getElement(id);
if (isBindingElement(element)) {
if (element.startBinding) {
const bindable = this.scene.getElement(
element.startBinding.elementId,
)!;
// NOTE: We use the raw mutateElement() because we don't want history
// entries or multiplayer updates
mutateElement(bindable, this.scene.getElementsMapIncludingDeleted(), {
boundElements: bindable.boundElements!.filter(
(e) => e.id !== element.id,
),
});
}
if (element.endBinding) {
const bindable = this.scene.getElement(element.endBinding.elementId)!;
// NOTE: We use the raw mutateElement() because we don't want history
// entries or multiplayer updates
mutateElement(bindable, this.scene.getElementsMapIncludingDeleted(), {
boundElements: bindable.boundElements!.filter(
(e) => e.id !== element.id,
),
});
}
} else if (isBindableElement(element)) {
element.boundElements?.forEach((boundElement) => {
if (boundElement.type === "arrow") {
const arrow = this.scene.getElement(
boundElement.id,
) as ExcalidrawArrowElement;
if (arrow?.startBinding?.elementId === element.id) {
// NOTE: We use the raw mutateElement() because we don't want history
// entries or multiplayer updates
mutateElement(
arrow,
this.scene.getElementsMapIncludingDeleted(),
{
startBinding: null,
},
);
}
if (arrow?.endBinding?.elementId === element.id) {
// NOTE: We use the raw mutateElement() because we don't want history
// entries or multiplayer updates
mutateElement(
arrow,
this.scene.getElementsMapIncludingDeleted(),
{
endBinding: null,
},
);
}
}
});
}
});
const elements = this.scene.getElementsIncludingDeleted().map((ele) => {
if (
this.elementsPendingErasure.has(ele.id) ||