From d28b9b48abbc79afab636eaa2c4ce23cdcf9f8e5 Mon Sep 17 00:00:00 2001 From: "Adrien Minne (adrm)" Date: Mon, 22 Apr 2024 11:41:46 +0200 Subject: [PATCH] [FIX] borders: wrong borders on remove rows MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When removing multiple headers, the borders are not shifted correctly, leading to incorrect borders. This happens because we modify the borders for each deleted rows separately. But we don't sort the rows before modifying the borders. So we first delete the row 1, then the row 2. But the row 2 is now the row 1, since the old row 1 has been deleted. So we end up with wrong operations. This is solved by simply sorting the rows in reverse order before modifying the borders. closes odoo/o-spreadsheet#4121 Task: 3884112 X-original-commit: 0dbad31a48ed0f82b16e4f0e95d2898fac6a4a0b Signed-off-by: Adrien Minne (adrm) Signed-off-by: Lucas Lefèvre (lul) --- src/plugins/core/borders.ts | 2 +- tests/borders/border_plugin.test.ts | 17 +++++++++++++++++ 2 files changed, 18 insertions(+), 1 deletion(-) diff --git a/src/plugins/core/borders.ts b/src/plugins/core/borders.ts index f24626b24..b36984b89 100644 --- a/src/plugins/core/borders.ts +++ b/src/plugins/core/borders.ts @@ -100,7 +100,7 @@ export class BordersPlugin extends CorePlugin implements Bor this.clearBorders(cmd.sheetId, cmd.target); break; case "REMOVE_COLUMNS_ROWS": - for (let el of cmd.elements) { + for (let el of [...cmd.elements].sort((a, b) => b - a)) { if (cmd.dimension === "COL") { this.shiftBordersHorizontally(cmd.sheetId, el + 1, -1); } else { diff --git a/tests/borders/border_plugin.test.ts b/tests/borders/border_plugin.test.ts index 720b920c1..2e55a68fd 100644 --- a/tests/borders/border_plugin.test.ts +++ b/tests/borders/border_plugin.test.ts @@ -6,6 +6,8 @@ import { addRows, cut, deleteCells, + deleteColumns, + deleteRows, paste, selectCell, setAnchorCorner, @@ -573,6 +575,21 @@ describe("Grid manipulation", () => { expect(getBorder(model, "B4")).toEqual({ top: DEFAULT_BORDER_DESC }); }); + test("Remove multiple headers before the borders", () => { + const b = DEFAULT_BORDER_DESC; + setZoneBorders(model, { position: "external" }, ["C3"]); + deleteRows(model, [0, 1]); + expect(getBorder(model, "B1")).toEqual({ right: b }); + expect(getBorder(model, "C1")).toEqual({ top: b, left: b, right: b, bottom: b }); + expect(getBorder(model, "D1")).toEqual({ left: b }); + expect(getBorder(model, "C2")).toEqual({ top: b }); + + deleteColumns(model, ["A", "B"]); + expect(getBorder(model, "A1")).toEqual({ top: b, left: b, right: b, bottom: b }); + expect(getBorder(model, "B1")).toEqual({ left: b }); + expect(getBorder(model, "A2")).toEqual({ top: b }); + }); + test("Borders are correctly duplicated on sheet dup", () => { setZoneBorders(model, { position: "external" }, ["B2"]); const sheetId = model.getters.getActiveSheetId();