diff --git a/addons/web/static/src/views/fields/datetime/datetime_field.js b/addons/web/static/src/views/fields/datetime/datetime_field.js
index b253bb518bf..42a2b470614 100644
--- a/addons/web/static/src/views/fields/datetime/datetime_field.js
+++ b/addons/web/static/src/views/fields/datetime/datetime_field.js
@@ -40,6 +40,7 @@ export class DateTimeField extends Component {
endDateField: { type: String, optional: true },
maxDate: { type: String, optional: true },
minDate: { type: String, optional: true },
+ alwaysRange: { type: Boolean, optional: true },
placeholder: { type: String, optional: true },
required: { type: Boolean, optional: true },
rounding: { type: Number, optional: true },
@@ -198,7 +199,11 @@ export class DateTimeField extends Component {
if (!this.relatedField) {
return false;
}
- return this.props.required || ensureArray(value).filter(Boolean).length === 2;
+ return (
+ this.props.alwaysRange ||
+ this.props.required ||
+ ensureArray(value).filter(Boolean).length === 2
+ );
}
/**
@@ -216,9 +221,10 @@ export class DateTimeField extends Component {
*/
shouldShowSeparator() {
return (
- this.state.range &&
- (this.props.required ||
- (!this.isEmpty(this.startDateField) && !this.isEmpty(this.endDateField)))
+ this.props.alwaysRange ||
+ (this.state.range &&
+ (this.props.required ||
+ (!this.isEmpty(this.startDateField) && !this.isEmpty(this.endDateField))))
);
}
@@ -275,6 +281,7 @@ export const dateField = {
endDateField: options[END_DATE_FIELD_OPTION],
maxDate: options.max_date,
minDate: options.min_date,
+ alwaysRange: archParseBoolean(options.always_range),
placeholder: attrs.placeholder,
required: dynamicInfo.required,
rounding: options.rounding && parseInt(options.rounding, 10),
@@ -342,6 +349,15 @@ export const dateRangeField = {
type: "field",
availableTypes: ["date", "datetime"],
},
+ {
+ label: _t("Always range"),
+ name: "always_range",
+ type: "boolean",
+ default: false,
+ help: _t(
+ `Set to true the full range input has to be display by default, even if empty.`
+ ),
+ },
],
supportedTypes: ["date", "datetime"],
};
diff --git a/addons/web/static/src/views/fields/datetime/datetime_field.xml b/addons/web/static/src/views/fields/datetime/datetime_field.xml
index 3dacd40d27f..b702fa41049 100644
--- a/addons/web/static/src/views/fields/datetime/datetime_field.xml
+++ b/addons/web/static/src/views/fields/datetime/datetime_field.xml
@@ -7,7 +7,7 @@
-
+
-
+
-
+
-
+
{
assert.deepEqual(textSiblings, ["->", "02/03/2017"]);
});
+
+ QUnit.test(
+ "always range: related end date, both start date and end date empty",
+ async (assert) => {
+ serverData.models.partner.records[0].datetime = false;
+
+ await makeView({
+ type: "form",
+ resModel: "partner",
+ serverData,
+ arch: /* xml */ `
+ `,
+ resId: 1,
+ });
+
+ assert.strictEqual(getInputs().length, 2);
+ assert.hasAttrValue(getInputs()[0], "data-field", "datetime");
+ assert.strictEqual(getInputs()[0].value, "");
+ assert.hasAttrValue(getInputs()[1], "data-field", "datetime_end");
+ assert.strictEqual(getInputs()[1].value, "");
+ assert.containsNone(target, ".o_add_date");
+
+ await editInput(getInputs()[0], null, "06/06/2023 12:00:00");
+
+ assert.strictEqual(getInputs().length, 2);
+ assert.hasAttrValue(getInputs()[0], "data-field", "datetime");
+ assert.strictEqual(getInputs()[0].value, "06/06/2023 12:00:00");
+ assert.hasAttrValue(getInputs()[1], "data-field", "datetime_end");
+ assert.strictEqual(getInputs()[1].value, "");
+ assert.containsNone(target, ".o_add_date");
+
+ await editInput(getInputs()[1], null, "07/07/2023 13:00:00");
+
+ assert.strictEqual(getInputs().length, 2);
+ assert.hasAttrValue(getInputs()[0], "data-field", "datetime");
+ assert.strictEqual(getInputs()[0].value, "06/06/2023 12:00:00");
+ assert.hasAttrValue(getInputs()[1], "data-field", "datetime_end");
+ assert.strictEqual(getInputs()[1].value, "07/07/2023 13:00:00");
+ assert.containsNone(target, ".o_add_date");
+
+ await editInput(getInputs()[0], null, "");
+
+ assert.strictEqual(getInputs().length, 2);
+ assert.hasAttrValue(getInputs()[0], "data-field", "datetime");
+ assert.strictEqual(getInputs()[0].value, "");
+ assert.hasAttrValue(getInputs()[1], "data-field", "datetime_end");
+ assert.strictEqual(getInputs()[1].value, "07/07/2023 13:00:00");
+ assert.containsNone(target, ".o_add_date");
+ }
+ );
});