Skip to content

Commit 13a79d0

Browse files
committed
[FIX] figure: crash on deleting dragged figure
There was a traceback if a figure was deleted while being dragged. closes #5333 Task: 4329240 X-original-commit: fbae6df Signed-off-by: Lucas Lefèvre (lul) <[email protected]> Signed-off-by: Adrien Minne (adrm) <[email protected]>
1 parent b6a0772 commit 13a79d0

File tree

2 files changed

+33
-8
lines changed

2 files changed

+33
-8
lines changed

src/components/figures/figure_container/figure_container.ts

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Component, onMounted, useState } from "@odoo/owl";
1+
import { Component, onMounted, onWillUpdateProps, useState } from "@odoo/owl";
22
import { ComponentsImportance, MIN_FIG_SIZE } from "../../../constants";
33
import { isDefined } from "../../../helpers";
44
import { rectIntersection, rectUnion } from "../../../helpers/rectangle";
@@ -43,6 +43,7 @@ interface DndState {
4343
draggedFigure?: Figure;
4444
horizontalSnap?: Snap<HFigureAxisType>;
4545
verticalSnap?: Snap<VFigureAxisType>;
46+
cancelDnd: (() => void) | undefined;
4647
}
4748

4849
css/*SCSS*/ `
@@ -135,6 +136,7 @@ export class FiguresContainer extends Component<Props, SpreadsheetChildEnv> {
135136
draggedFigure: undefined,
136137
horizontalSnap: undefined,
137138
verticalSnap: undefined,
139+
cancelDnd: undefined,
138140
});
139141

140142
setup() {
@@ -148,6 +150,19 @@ export class FiguresContainer extends Component<Props, SpreadsheetChildEnv> {
148150
// new rendering
149151
this.render();
150152
});
153+
onWillUpdateProps(() => {
154+
const sheetId = this.env.model.getters.getActiveSheetId();
155+
const draggedFigureId = this.dnd.draggedFigure?.id;
156+
if (draggedFigureId && !this.env.model.getters.getFigure(sheetId, draggedFigureId)) {
157+
if (this.dnd.cancelDnd) {
158+
this.dnd.cancelDnd();
159+
}
160+
this.dnd.draggedFigure = undefined;
161+
this.dnd.horizontalSnap = undefined;
162+
this.dnd.verticalSnap = undefined;
163+
this.dnd.cancelDnd = undefined;
164+
}
165+
});
151166
}
152167

153168
private getVisibleFigures(): Figure[] {
@@ -156,12 +171,13 @@ export class FiguresContainer extends Component<Props, SpreadsheetChildEnv> {
156171
this.dnd.draggedFigure &&
157172
!visibleFigures.some((figure) => figure.id === this.dnd.draggedFigure?.id)
158173
) {
159-
visibleFigures.push(
160-
this.env.model.getters.getFigure(
161-
this.env.model.getters.getActiveSheetId(),
162-
this.dnd.draggedFigure?.id
163-
)!
174+
const draggedFigure = this.env.model.getters.getFigure(
175+
this.env.model.getters.getActiveSheetId(),
176+
this.dnd.draggedFigure?.id
164177
);
178+
if (draggedFigure) {
179+
visibleFigures.push(draggedFigure);
180+
}
165181
}
166182
return visibleFigures;
167183
}
@@ -314,7 +330,7 @@ export class FiguresContainer extends Component<Props, SpreadsheetChildEnv> {
314330
this.dnd.verticalSnap = undefined;
315331
this.env.model.dispatch("UPDATE_FIGURE", { sheetId, id: figure.id, x, y });
316332
};
317-
startDnd(onMouseMove, onMouseUp);
333+
this.dnd.cancelDnd = startDnd(onMouseMove, onMouseUp);
318334
}
319335

320336
/**
@@ -382,7 +398,7 @@ export class FiguresContainer extends Component<Props, SpreadsheetChildEnv> {
382398
this.dnd.horizontalSnap = undefined;
383399
this.dnd.verticalSnap = undefined;
384400
};
385-
startDnd(onMouseMove, onMouseUp);
401+
this.dnd.cancelDnd = startDnd(onMouseMove, onMouseUp);
386402
}
387403

388404
private getOtherFigures(figId: UID): Figure[] {

tests/figures/figure_component.test.ts

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,15 @@ describe("figures", () => {
419419
);
420420
}
421421
);
422+
423+
test("Deleting a figure during drag and drop does not crash", async () => {
424+
createFigure(model, { id: "someuuid", x: 200, y: 100 });
425+
await nextTick();
426+
await dragElement(".o-figure", { x: 150, y: 100 }, undefined, false);
427+
model.dispatch("DELETE_FIGURE", { id: "someuuid", sheetId });
428+
await nextTick();
429+
expect(model.getters.getFigure(sheetId, "someuuid")).toEqual(undefined);
430+
});
422431
});
423432

424433
test("Cannot select/move figure in readonly mode", async () => {

0 commit comments

Comments
 (0)