From 824e4e01b5fe3720168c23fe94be4391be67ea7c Mon Sep 17 00:00:00 2001 From: Florian Damhaut Date: Tue, 2 Dec 2025 16:50:10 +0100 Subject: [PATCH] [IMP] formats: Set format when writing date on number format Task: 5349524 --- .../src/plugins/core/cell.ts | 13 +++++++++++- tests/formats/formatting_plugin.test.ts | 20 +++++++++++++++++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/packages/o-spreadsheet-engine/src/plugins/core/cell.ts b/packages/o-spreadsheet-engine/src/plugins/core/cell.ts index ba294ed64d..f54758fa12 100644 --- a/packages/o-spreadsheet-engine/src/plugins/core/cell.ts +++ b/packages/o-spreadsheet-engine/src/plugins/core/cell.ts @@ -29,6 +29,7 @@ import { parseLiteral } from "../../helpers/cells/cell_evaluation"; import { detectDateFormat, detectNumberFormat, + isDateTimeFormat, isExcelCompatible, isTextFormat, } from "../../helpers/format/format"; @@ -510,8 +511,18 @@ export class CellPlugin extends CorePlugin implements CoreState { // Compute the new cell properties const afterContent = hasContent ? replaceNewLines(after?.content) : before?.content || ""; - const format = "format" in after ? after.format : before && before.format; + let format: Format | undefined = undefined; + if (after.format !== undefined) { + format = after.format; + } else if (before?.format && (before?.format === "@" || isDateTimeFormat(before?.format))) { + format = before.format; + } else if (after.content) { + format = detectDateFormat(after.content, this.getters.getLocale()); + } + if (format === undefined) { + format = before?.format || undefined; + } /* Read the following IF as: * we need to remove the cell if it is completely empty, but we can know if it completely empty if: * - the command says the new content is empty and has no format diff --git a/tests/formats/formatting_plugin.test.ts b/tests/formats/formatting_plugin.test.ts index 7b2fdeaf38..fdc1327c8d 100644 --- a/tests/formats/formatting_plugin.test.ts +++ b/tests/formats/formatting_plugin.test.ts @@ -445,6 +445,26 @@ describe("formatting values (when change decimal)", () => { expect(getCell(model, "A1")!.format).toBe("0%"); }); + test.each(["", "0%", "#,##0", "#,##0[$ THUNE ]"])( + "Set Date to a cell formatted with format %s, format should be adapted", + (format: string) => { + const model = new Model(); + setFormat(model, "A1", format); + setCellContent(model, "A1", "12/12/2025"); + expect(getEvaluatedCell(model, "A1").format).toBe("m/d/yyyy"); + } + ); + + test.each(["@", "d/m/yyyy"])( + "Set date to a cell formatted with format %s, format should not be adapted", + (format: string) => { + const model = new Model(); + setFormat(model, "A1", format); + setCellContent(model, "A1", "12/12/2025"); + expect(getEvaluatedCell(model, "A1").format).toBe(format); + } + ); + test.each([ ["0%", "0.0%", "0.00%"], ["#,##0", "#,##0.0", "#,##0.00"],