diff --git a/addons/spreadsheet/static/src/global_filters/components/year_picker.js b/addons/spreadsheet/static/src/global_filters/components/year_picker.js index b2bd97cb59c..390e03970fa 100644 --- a/addons/spreadsheet/static/src/global_filters/components/year_picker.js +++ b/addons/spreadsheet/static/src/global_filters/components/year_picker.js @@ -3,18 +3,6 @@ import { DatePicker } from "@web/core/datepicker/datepicker"; const { DateTime } = luxon; -/** - * @param {string} format - * @returns {boolean} - */ -const isValidStaticFormat = (format) => { - try { - return /^[\d\s/:-]+$/.test(DateTime.local().toFormat(format)); - } catch { - return false; - } -}; - const DEFAULT_DATE = DateTime.local(); export class YearPicker extends DatePicker { /** @@ -33,7 +21,7 @@ export class YearPicker extends DatePicker { getOptions(useStatic = false) { return { format: - !useStatic || isValidStaticFormat(this.format) ? this.format : this.staticFormat, + !useStatic || this.isValidStaticFormat(this.format) ? this.format : this.staticFormat, locale: DEFAULT_DATE.locale, }; } diff --git a/addons/web/static/src/core/datepicker/datepicker.js b/addons/web/static/src/core/datepicker/datepicker.js index 9c0d9e4c455..e218fc57669 100644 --- a/addons/web/static/src/core/datepicker/datepicker.js +++ b/addons/web/static/src/core/datepicker/datepicker.js @@ -27,14 +27,6 @@ const { DateTime } = luxon; let datePickerId = 0; -/** - * @param {string} format - * @returns {boolean} - */ -function isValidStaticFormat(format) { - return /^[\d\s/:-]+$/.test(DateTime.local().toFormat(format)); -} - /** * @param {Function} fn * @returns {[any, null] | [null, Error]} @@ -124,10 +116,18 @@ export class DatePicker extends Component { // Protected //--------------------------------------------------------------------- + /** + * @param {string} format + * @returns {boolean} + */ + isValidStaticFormat(format) { + return /^[\d\s\/.,:-]+$/.test(DateTime.local().toFormat(format)); + } + getOptions(useStatic = false) { return { format: - !useStatic || isValidStaticFormat(this.format) ? this.format : this.staticFormat, + !useStatic || this.isValidStaticFormat(this.format) ? this.format : this.staticFormat, locale: this.props.locale || (this.date && this.date.locale), }; } @@ -180,7 +180,7 @@ export class DatePicker extends Component { */ bootstrapDateTimePicker(commandOrParams) { if (typeof commandOrParams === "object") { - const format = isValidStaticFormat(this.format) ? this.format : this.staticFormat; + const format = this.isValidStaticFormat(this.format) ? this.format : this.staticFormat; const params = { ...commandOrParams, date: this.date || null, diff --git a/addons/web/static/tests/core/datepicker_tests.js b/addons/web/static/tests/core/datepicker_tests.js index 346050a4c52..bd9651b1fdf 100644 --- a/addons/web/static/tests/core/datepicker_tests.js +++ b/addons/web/static/tests/core/datepicker_tests.js @@ -495,6 +495,22 @@ QUnit.module("Components", ({ beforeEach }) => { assert.verifySteps(["datetime-changed"]); }); + QUnit.test("Datepicker works with dots and commas in format", async (assert) => { + assert.expect(2); + + await mountPicker(DateTimePicker, { + date: DateTime.fromFormat("10/03/2023 13:14:27", "dd/MM/yyyy HH:mm:ss"), + format: "dd.MM,yyyy", + }); + let input = target.querySelector(".o_datepicker_input"); + + assert.strictEqual(input.value, "10.03,2023"); + + await click(input); + + assert.strictEqual(input.value, "10.03,2023"); + }); + QUnit.test("custom filter date", async function (assert) { assert.expect(3); class MockedSearchModel extends ActionModel {