Skip to content

Commit

Permalink
[FIX] web: inconsistent daterange validation
Browse files Browse the repository at this point in the history
SPECIFICATION:
In the daterange widget, if the second date field is required and left empty,
the field should be marked as invalid and be colored red.

Observed behavior:
if the second field is empty so that fields is not highlighted in red.

Expected behavior:
if the second field is empty so that fields should be highlighted in red.

Task-3786540
  • Loading branch information
sabr-odoo committed Apr 16, 2024
1 parent 4a522be commit 42f0d94
Show file tree
Hide file tree
Showing 3 changed files with 68 additions and 1 deletion.
11 changes: 11 additions & 0 deletions addons/web/static/src/views/fields/datetime/datetime_field.js
Original file line number Diff line number Diff line change
Expand Up @@ -376,6 +376,17 @@ export const dateRangeField = {
},
],
supportedTypes: ["date", "datetime"],
isValid: (record, fieldname, fieldInfo) => {
if (fieldInfo.widget === "daterange") {
if (fieldInfo.options.end_date_field && (!record.data[fieldInfo.options.end_date_field] !== !record.data[fieldname])) {
return false;
}
if (fieldInfo.options.start_date_field && (!record.data[fieldInfo.options.start_date_field] !== !record.data[fieldname])) {
return false;
}
}
return !record.isFieldInvalid(fieldname);
}
};

registry
Expand Down
2 changes: 1 addition & 1 deletion addons/web/static/src/views/fields/field.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ export function fieldVisualFeedback(field, record, fieldName, fieldInfo) {
return {
readonly,
required,
invalid: record.isFieldInvalid(fieldName),
invalid: field.isValid ? !field.isValid(record, fieldName, fieldInfo) : record.isFieldInvalid(fieldName),
empty,
};
}
Expand Down
56 changes: 56 additions & 0 deletions addons/web/static/tests/views/fields/daterange_field_tests.js
Original file line number Diff line number Diff line change
Expand Up @@ -1240,4 +1240,60 @@ QUnit.module("Fields", (hooks) => {
assert.containsOnce(target, ".fa-long-arrow-right");
}
);

QUnit.test(
"date field should be highlighted if options of date_end is empty",
async (assert) => {
serverData.models.partner.fields.date_end = { string: "Date End", type: "date" };
serverData.models.partner.records[0].date_end = "2017-02-08";
await makeView({
type: "form",
resModel: "partner",
serverData,
arch: `
<form>
<label for="date" string="Daterange" />
<field name="date" widget="daterange" options="{'end_date_field': 'date_end'}" string="Planned Date" required="date or date_end"/>
<field name="date_end" invisible="1" required="date"/>
</form>`,
resId: 1,
});
await editInput(target, "input[data-field=date_end]", "");
await click(target);
assert.hasClass(
target.querySelector(".o_field_daterange"),
"o_field_invalid",
"date field should be displayed as invalid"
);
await editInput(target, "input[data-field=date_end]", "2017-02-08");
}
);

QUnit.test(
"date field should be highlighted if options of date_start is empty",
async (assert) => {
serverData.models.partner.fields.date_end = { string: "Date End", type: "date" };
serverData.models.partner.records[0].date_end = "2017-02-08";
await makeView({
type: "form",
resModel: "partner",
serverData,
arch: `
<form>
<label for="date" string="Daterange" />
<field name="date" widget="daterange" options="{'start_date_field': 'date_end'}" string="Planned Date" required="date or date_end"/>
<field name="date_end" invisible="1" required="date"/>
</form>`,
resId: 1,
});
await editInput(target, "input[data-field=date_end]", "");
await click(target);
assert.hasClass(
target.querySelector(".o_field_daterange"),
"o_field_invalid",
"date field should be displayed as invalid"
);
await editInput(target, "input[data-field=date_end]", "2017-02-08");
}
);
});

0 comments on commit 42f0d94

Please sign in to comment.