DEV: Add custom error messages to form template forms (#22169)

This commit is contained in:
Keegan George 2023-06-20 13:45:58 -07:00 committed by GitHub
parent 762dd971d6
commit 75e711284a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 98 additions and 15 deletions

View File

@ -1,3 +1,5 @@
import I18n from "I18n";
export default function prepareFormTemplateData(form) {
const formData = new FormData(form);
@ -61,7 +63,7 @@ function _validateFormTemplateData(form) {
field.insertAdjacentElement("afterend", errorBox);
}
errorBox.textContent = field.validationMessage;
_showErrorMessage(field, errorBox);
});
// Mark the field as valid as changed:
@ -80,3 +82,62 @@ function _validateFormTemplateData(form) {
});
});
}
function _showErrorMessage(field, element) {
if (field.validity.valueMissing) {
const prefix = "form_templates.errors.valueMissing";
const types = [
"select-one",
"select-multiple",
"checkbox",
"text",
"number",
];
_showErrorByType(element, field, prefix, types);
} else if (field.validity.typeMismatch) {
const prefix = "form_templates.errors.typeMismatch";
const types = [
"color",
"date",
"email",
"number",
"password",
"tel",
"text",
"url",
];
_showErrorByType(element, field, prefix, types);
} else if (field.validity.tooShort) {
element.textContent = I18n.t("form_templates.errors.tooShort", {
minLength: field.minLength,
});
} else if (field.validity.tooLong) {
element.textContent = I18n.t("form_templates.errors.tooLong", {
maxLength: field.maxLength,
});
} else if (field.validity.rangeOverflow) {
element.textContent = I18n.t("form_templates.errors.rangeOverflow", {
max: field.max,
});
} else if (field.validity.rangeUnderflow) {
element.textContent = I18n.t("form_templates.errors.rangeUnderflow", {
min: field.min,
});
} else if (field.validity.patternMismatch) {
element.textContent = I18n.t("form_templates.errors.patternMismatch");
} else if (field.validity.badInput) {
element.textContent = I18n.t("form_templates.errors.badInput");
}
}
function _showErrorByType(element, field, prefix, types) {
if (!types.includes(field.type)) {
element.textContent = I18n.t(`${prefix}.default`);
} else {
types.forEach((type) => {
if (field.type === type) {
element.textContent = I18n.t(`${prefix}.${type}`);
}
});
}
}

View File

@ -4511,6 +4511,30 @@ en:
form_template_chooser:
select_template: "Select form templates"
form_templates:
errors:
valueMissing:
default: "Please fill out this field."
text: "Please fill out this field."
select-one: "Please select an item in the list."
select-multiple: "Please select at least one item in the list."
checkbox: "Please check this box if you want to proceed."
typeMismatch:
default: "Please enter a valid value."
color: "Please enter a color."
date: "Please enter a date."
email: "Please enter a valid email address."
number: "Please enter a number."
password: "Please enter a valid password."
tel: "Please enter a valid telephone number."
text: "Please enter a text value."
url: "Please enter a valid URL."
tooShort: "The input must be %{minLength} characters or longer."
tooLong: "The input must be less than %{maxLength} characters."
rangeOverflow: "The input must be less than %{max}."
rangeUnderflow: "The input must be more than %{min}."
patternMismatch: "Please match the requested format."
badInput: "Please enter a valid input."
# This section is exported to the javascript for i18n in the admin section
admin_js:

View File

@ -51,16 +51,6 @@ describe "Composer Form Template Validations", type: :system, js: true do
end
let(:category_page) { PageObjects::Pages::Category.new }
let(:composer) { PageObjects::Components::Composer.new }
let(:error_types) do
{
required_error: "Please fill out this field.",
type_error: "Please include an '@' in the email address. 'Bruce Wayne' is missing an '@'.",
min_error:
"Please lengthen this text to 10 characters or more (you are currently using 7 characters).",
pattern_error: "Please match the requested format.",
}
end
let(:topic_title) { "A topic about Batman" }
before do
@ -79,7 +69,9 @@ describe "Composer Form Template Validations", type: :system, js: true do
category_page.new_topic_button.click
composer.fill_title(topic_title)
composer.create
expect(composer).to have_form_template_field_error(error_types[:required_error])
expect(composer).to have_form_template_field_error(
I18n.t("js.form_templates.errors.valueMissing.default"),
)
end
it "shows an error when an input filled doesn't satisfy the type expected" do
@ -88,7 +80,9 @@ describe "Composer Form Template Validations", type: :system, js: true do
composer.fill_title(topic_title)
composer.create
composer.fill_form_template_field("input", "Bruce Wayne")
expect(composer).to have_form_template_field_error(error_types[:type_error])
expect(composer).to have_form_template_field_error(
I18n.t("js.form_templates.errors.typeMismatch.email"),
)
end
it "shows an error when an input doesn't satisfy the min length expected" do
@ -97,7 +91,9 @@ describe "Composer Form Template Validations", type: :system, js: true do
composer.fill_title(topic_title)
composer.create
composer.fill_form_template_field("input", "b@b.com")
expect(composer).to have_form_template_field_error(error_types[:min_error])
expect(composer).to have_form_template_field_error(
I18n.t("js.form_templates.errors.tooShort", minLength: 10),
)
end
it "shows an error when an input doesn't satisfy the requested pattern" do
@ -106,6 +102,8 @@ describe "Composer Form Template Validations", type: :system, js: true do
composer.fill_title(topic_title)
composer.fill_form_template_field("input", "www.example.com")
composer.create
expect(composer).to have_form_template_field_error(error_types[:pattern_error])
expect(composer).to have_form_template_field_error(
I18n.t("js.form_templates.errors.patternMismatch"),
)
end
end