diff --git a/addons/web/static/src/core/datepicker/datepicker.js b/addons/web/static/src/core/datepicker/datepicker.js
index cb621febd4f..ba14e5fb0f0 100644
--- a/addons/web/static/src/core/datepicker/datepicker.js
+++ b/addons/web/static/src/core/datepicker/datepicker.js
@@ -220,10 +220,10 @@ export class DatePicker extends Component {
const options = this.getOptions(useStatic);
const parsedDate = this.parseValue(value, options)[0];
this.state.warning = parsedDate && parsedDate > DateTime.local();
- if (value && !parsedDate) {
- // Reset to default (= given) date.
- this.updateInput();
- }
+ // Always update input.
+ // if the date is invalid, it will reset to default (= given) date.
+ // if the input is a computed date (+5d for instance), it will put the correct date.
+ this.updateInput();
if (parsedDate !== null && !areDateEquals(this.date, parsedDate)) {
this.props.onDateTimeChanged(parsedDate);
}
diff --git a/addons/web/static/tests/core/domain_selector_tests.js b/addons/web/static/tests/core/domain_selector_tests.js
index cf9b4396066..e8d27edcf3c 100644
--- a/addons/web/static/tests/core/domain_selector_tests.js
+++ b/addons/web/static/tests/core/domain_selector_tests.js
@@ -181,21 +181,33 @@ QUnit.module("Components", (hooks) => {
QUnit.test("building a domain with a datetime", async (assert) => {
assert.expect(4);
+ class Parent extends Component {
+ setup() {
+ this.value = `[("datetime", "=", "2017-03-27 15:42:00")]`;
+ }
+ onUpdate(newValue) {
+ assert.strictEqual(
+ newValue,
+ `[("datetime", "=", "2017-02-26 15:42:00")]`,
+ "datepicker value should have changed"
+ );
+ this.value = newValue;
+ this.render();
+ }
+ }
+ Parent.components = { DomainSelector };
+ Parent.template = xml`
+
+ `;
+
// Create the domain selector and its mock environment
- await mountComponent(DomainSelector, {
- props: {
- resModel: "partner",
- value: `[("datetime", "=", "2017-03-27 15:42:00")]`,
- readonly: false,
- update: (newValue) => {
- assert.strictEqual(
- newValue,
- `[("datetime", "=", "2017-02-26 15:42:00")]`,
- "datepicker value should have changed"
- );
- },
- },
- });
+ await mountComponent(Parent);
// Check that there is a datepicker to choose the date
assert.containsOnce(target, ".o_datepicker", "there should be a datepicker");
@@ -241,8 +253,9 @@ QUnit.module("Components", (hooks) => {
document.body.querySelector(`.bootstrap-datetimepicker-widget [data-action=close]`)
);
- // The input field should display an empty value. NB: this could be improved, but OK for now
- assert.equal(target.querySelector(".o_datepicker_input").value, "");
+ // The input field should continue displaying 'Invalid DateTime'.
+ // The value is still invalid.
+ assert.equal(target.querySelector(".o_datepicker_input").value, "Invalid DateTime");
assert.verifySteps([]);
});
diff --git a/addons/web/static/tests/views/fields/date_field_tests.js b/addons/web/static/tests/views/fields/date_field_tests.js
index e212538cd78..cd2df9ce7fa 100644
--- a/addons/web/static/tests/views/fields/date_field_tests.js
+++ b/addons/web/static/tests/views/fields/date_field_tests.js
@@ -4,9 +4,11 @@ import { makeFakeLocalizationService } from "@web/../tests/helpers/mock_services
import {
click,
clickCreate,
+ clickDiscard,
clickSave,
editInput,
getFixture,
+ patchDate,
patchTimeZone,
patchWithCleanup,
triggerEvent,
@@ -741,4 +743,35 @@ QUnit.module("Fields", (hooks) => {
`08/01/${year}`
);
});
+
+ QUnit.test("DateField: allow to use compute dates (+5d for instance)", async function (assert) {
+ patchDate(2021, 1, 15, 10, 0, 0); // current date : 15 Feb 2021 10:00:00
+ serverData.models.partner.fields.date.default = "2019-09-15";
+
+ await makeView({
+ type: "form",
+ resModel: "partner",
+ serverData,
+ arch: '
',
+ });
+
+ assert.strictEqual(target.querySelector(".o_field_widget input").value, "09/15/2019"); // default date
+
+ // Calculate a new date from current date + 5 days
+ await editInput(target, ".o_field_widget[name=date] input", "+5d");
+ assert.strictEqual(target.querySelector(".o_field_widget input").value, "02/20/2021");
+
+ // Discard and do it again
+ await clickDiscard(target);
+ assert.strictEqual(target.querySelector(".o_field_widget input").value, "09/15/2019"); // default date
+ await editInput(target, ".o_field_widget[name=date] input", "+5d");
+ assert.strictEqual(target.querySelector(".o_field_widget input").value, "02/20/2021");
+
+ // Save and do it again
+ await clickSave(target);
+ // new computed date (current date + 5 days) is saved
+ assert.strictEqual(target.querySelector(".o_field_widget input").value, "02/20/2021");
+ await editInput(target, ".o_field_widget[name=date] input", "+5d");
+ assert.strictEqual(target.querySelector(".o_field_widget input").value, "02/20/2021");
+ });
});