diff --git a/app/main/forms.py b/app/main/forms.py index 87fe8485e..1b5e01944 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -147,7 +147,7 @@ def email_address(label='Email address', gov_user=True, required=True): if required: validators.append(DataRequired(message='Cannot be empty')) - return EmailField(label, validators, render_kw={'spellcheck': 'false'}) + return GovukEmailField(label, validators, render_kw={'spellcheck': 'false'}) class UKMobileNumber(TelField): @@ -557,7 +557,7 @@ class OnOffField(RadioField): class LoginForm(StripWhitespaceForm): - email_address = EmailField('Email address', validators=[ + email_address = GovukEmailField('Email address', validators=[ Length(min=5, max=255), DataRequired(message='Cannot be empty'), ValidEmail() @@ -568,8 +568,10 @@ class LoginForm(StripWhitespaceForm): class RegisterUserForm(StripWhitespaceForm): - name = StringField('Full name', - validators=[DataRequired(message='Cannot be empty')]) + name = GovukTextInputField( + 'Full name', + validators=[DataRequired(message='Cannot be empty')] + ) email_address = email_address() mobile_number = international_phone_number() password = password() @@ -1299,7 +1301,7 @@ class CsvUploadForm(StripWhitespaceForm): class ChangeNameForm(StripWhitespaceForm): - new_name = StringField(u'Your name') + new_name = GovukTextInputField(u'Your name') class ChangeEmailForm(StripWhitespaceForm): @@ -1401,7 +1403,7 @@ class SupportRedirect(StripWhitespaceForm): class FeedbackOrProblem(StripWhitespaceForm): - name = StringField('Name (optional)') + name = GovukTextInputField('Name (optional)') email_address = email_address(label='Email address', gov_user=False, required=True) feedback = TextAreaField('Your message', validators=[DataRequired(message="Cannot be empty")]) @@ -1850,7 +1852,7 @@ def get_placeholder_form_instance( else: field = uk_mobile_number(label=placeholder_name) else: - field = StringField(placeholder_name, validators=[ + field = GovukTextInputField(placeholder_name, validators=[ DataRequired(message='Cannot be empty') ]) @@ -2191,7 +2193,7 @@ class AcceptAgreementForm(StripWhitespaceForm): on_behalf_of_email=org.agreement_signed_on_behalf_of_email_address, ) - version = StringField( + version = GovukTextInputField( 'Which version of the agreement do you want to accept?' ) @@ -2209,7 +2211,7 @@ class AcceptAgreementForm(StripWhitespaceForm): ), ) - on_behalf_of_name = StringField( + on_behalf_of_name = GovukTextInputField( 'What’s their name?' ) diff --git a/app/templates/views/agreement/agreement-accept.html b/app/templates/views/agreement/agreement-accept.html index 8a01e952a..8ecb3c2ac 100644 --- a/app/templates/views/agreement/agreement-accept.html +++ b/app/templates/views/agreement/agreement-accept.html @@ -1,5 +1,4 @@ {% extends "withnav_template.html" %} -{% from "components/textbox.html" import textbox %} {% from "components/radios.html" import radio, conditional_radio_panel %} {% from "components/select-input.html" import select_wrapper %} {% from "components/form.html" import form_wrapper %} @@ -28,10 +27,14 @@ {% endfor %} {% endcall %} {% call conditional_radio_panel('on-behalf-of') %} - {{ textbox(form.on_behalf_of_name, width='1-1') }} - {{ textbox(form.on_behalf_of_email, width='1-1') }} + {{ form.on_behalf_of_name(param_extensions={"classes": "govuk-!-width-full"}) }} + {{ form.on_behalf_of_email(param_extensions={"classes": "govuk-!-width-full"}) }} {% endcall %} - {{ textbox(form.version, width='1-3', hint='The version number is on the front page, for example ‘3.6’') }} + {{ form.version( + param_extensions={ + "hint": {"text": "The version number is on the front page, for example ‘3.6’"}, + "classes": "govuk-!-width-one-third"} + ) }} {{ page_footer('Continue') }} diff --git a/app/templates/views/forgot-password.html b/app/templates/views/forgot-password.html index 16c90e5c1..8364f1f30 100644 --- a/app/templates/views/forgot-password.html +++ b/app/templates/views/forgot-password.html @@ -1,5 +1,4 @@ {% extends "withoutnav_template.html" %} -{% from "components/textbox.html" import textbox %} {% from "components/page-footer.html" import page_footer %} {% from "components/form.html" import form_wrapper %} @@ -16,7 +15,7 @@ Create a new password

We’ll send you an email to create a new password.

{% call form_wrapper() %} - {{ textbox(form.email_address, safe_error_message=True) }} + {{ form.email_address(error_message_with_html=True) }} {{ page_footer("Send email") }} {% endcall %} diff --git a/app/templates/views/invite-user.html b/app/templates/views/invite-user.html index 11ae6a050..36e037ee5 100644 --- a/app/templates/views/invite-user.html +++ b/app/templates/views/invite-user.html @@ -1,5 +1,4 @@ {% extends "withnav_template.html" %} -{% from "components/textbox.html" import textbox %} {% from "components/page-header.html" import page_header %} {% from "components/page-footer.html" import page_footer %} {% from "components/form.html" import form_wrapper %} @@ -17,7 +16,12 @@ {% call form_wrapper() %} - {{ textbox(form.email_address, width='1-1', safe_error_message=True) }} + {{ form.email_address( + param_extensions={ + "classes": "govuk-!-width-full" + }, + error_message_with_html=True + ) }} {% include 'views/manage-users/permissions.html' %} diff --git a/app/templates/views/manage-users/edit-user-email.html b/app/templates/views/manage-users/edit-user-email.html index ca2823485..ee868be05 100644 --- a/app/templates/views/manage-users/edit-user-email.html +++ b/app/templates/views/manage-users/edit-user-email.html @@ -1,5 +1,4 @@ {% extends "withnav_template.html" %} -{% from "components/textbox.html" import textbox %} {% from "components/page-header.html" import page_header %} {% from "components/page-footer.html" import page_footer %} {% from "components/form.html" import form_wrapper %} @@ -17,7 +16,7 @@

This will change the email address for {{ user.name }}.

{% call form_wrapper() %} - {{ textbox(form.email_address, width='1-1', safe_error_message=True) }} + {{ form.email_address(param_extensions={"classes": "govuk-!-width-full"}, error_message_with_html=True) }} {{ page_footer('Save') }} {% endcall %} diff --git a/app/templates/views/organisations/organisation/users/invite-org-user.html b/app/templates/views/organisations/organisation/users/invite-org-user.html index 2768fcd39..1720e7d39 100644 --- a/app/templates/views/organisations/organisation/users/invite-org-user.html +++ b/app/templates/views/organisations/organisation/users/invite-org-user.html @@ -1,6 +1,5 @@ {% extends "org_template.html" %} -{% from "components/textbox.html" import textbox %} {% from "components/page-footer.html" import page_footer %} {% from "components/page-header.html" import page_header %} {% from "components/form.html" import form_wrapper %} @@ -16,7 +15,12 @@ back_link=url_for('.manage_org_users', org_id=current_org.id) ) }} {% call form_wrapper() %} - {{ textbox(form.email_address, width='1-1', safe_error_message=True) }} + {{ form.email_address( + param_extensions={ + "classes": "govuk-!-width-full" + }, + error_message_with_html=True + ) }}

diff --git a/app/templates/views/register.html b/app/templates/views/register.html index ee3a1e2c8..734c8e23c 100644 --- a/app/templates/views/register.html +++ b/app/templates/views/register.html @@ -13,8 +13,15 @@ Create an account

Create an account

{% call form_wrapper(autocomplete=True) %} - {{ textbox(form.name, width='3-4') }} - {{ textbox(form.email_address, hint="Must be from a public sector organisation", width='3-4', safe_error_message=True, autocomplete='email') }} + {{ form.name(param_extensions={"classes": "govuk-!-width-three-quarters"}) }} + {{ form.email_address( + param_extensions={ + "hint": {"text": "Must be from a public sector organisation"}, + "classes": "govuk-!-width-three-quarters", + "autocomplete": "email" + }, + error_message_with_html=True + ) }}
{{ textbox(form.mobile_number, width='3-4', hint='We’ll send you a security code by text message') }}
diff --git a/app/templates/views/service-settings/email-reply-to/_verify-updates.html b/app/templates/views/service-settings/email-reply-to/_verify-updates.html index 1a48fa1fc..ca1ba4a13 100644 --- a/app/templates/views/service-settings/email-reply-to/_verify-updates.html +++ b/app/templates/views/service-settings/email-reply-to/_verify-updates.html @@ -1,5 +1,4 @@ {% from "components/banner.html" import banner, banner_wrapper %} -{% from "components/textbox.html" import textbox %} {% from "components/page-footer.html" import page_footer %} {% from "components/form.html" import form_wrapper %} {% from "components/button/macro.njk" import govukButton %} @@ -47,11 +46,12 @@ {% call form_wrapper( action = form_url ) %} - {{ textbox( - form.email_address, - width='1-1', - safe_error_message=True, - hint='This should be a shared inbox managed by your team, not your own email address' + {{ form.email_address( + param_extensions={ + "hint": {"text": "This should be a shared inbox managed by your team, not your own email address"}, + "classes": "govuk-!-width-full" + }, + error_message_with_html=True ) }} {% if not first_email_address and not existing_is_default %} {{ form.is_default }} diff --git a/app/templates/views/service-settings/email-reply-to/add.html b/app/templates/views/service-settings/email-reply-to/add.html index a9b9774d6..cb7f41440 100644 --- a/app/templates/views/service-settings/email-reply-to/add.html +++ b/app/templates/views/service-settings/email-reply-to/add.html @@ -1,5 +1,4 @@ {% extends "withnav_template.html" %} -{% from "components/textbox.html" import textbox %} {% from "components/page-header.html" import page_header %} {% from "components/page-footer.html" import page_footer %} {% from "components/form.html" import form_wrapper %} @@ -16,11 +15,12 @@ ) }} {% call form_wrapper() %} - {{ textbox( - form.email_address, - width='1-1', - hint='This should be a shared inbox managed by your team, not your own email address', - safe_error_message=True + {{ form.email_address( + param_extensions={ + "hint": {"text": "This should be a shared inbox managed by your team, not your own email address"}, + "classes": "govuk-!-width-full" + }, + error_message_with_html=True ) }} {% if not first_email_address %} {{ form.is_default }} diff --git a/app/templates/views/service-settings/email-reply-to/edit.html b/app/templates/views/service-settings/email-reply-to/edit.html index 2d675fb1f..2fda009a1 100644 --- a/app/templates/views/service-settings/email-reply-to/edit.html +++ b/app/templates/views/service-settings/email-reply-to/edit.html @@ -16,11 +16,12 @@ back_link=url_for('main.service_email_reply_to', service_id=current_service.id) ) }} {% call form_wrapper() %} - {{ textbox( - form.email_address, - width='1-1', - safe_error_message=True, - hint='This should be a shared inbox managed by your team, not your own email address.' + {{ form.email_address( + param_extensions={ + "hint": {"text": "This should be a shared inbox managed by your team, not your own email address"}, + "classes": "govuk-!-width-full" + }, + error_message_with_html=True ) }} {% if form.is_default.data %}

diff --git a/app/templates/views/signin.html b/app/templates/views/signin.html index bbb57debb..374e59f89 100644 --- a/app/templates/views/signin.html +++ b/app/templates/views/signin.html @@ -1,5 +1,4 @@ {% extends "withoutnav_template.html" %} -{% from "components/textbox.html" import textbox %} {% from "components/page-footer.html" import page_footer %} {% from "components/form.html" import form_wrapper %} @@ -32,7 +31,7 @@ {% endif %} {% call form_wrapper(autocomplete=True) %} - {{ textbox(form.email_address, autocomplete='email') }} + {{ form.email_address(param_extensions={"autocomplete": "email"}) }} {{ form.password(param_extensions={"autocomplete": "current-password"}) }} {{ page_footer("Continue", secondary_link=url_for('.forgot_password'), secondary_link_text="Forgotten your password?") }} {% endcall %} diff --git a/app/templates/views/support/form.html b/app/templates/views/support/form.html index 4909aa991..a8b10d857 100644 --- a/app/templates/views/support/form.html +++ b/app/templates/views/support/form.html @@ -27,8 +27,8 @@ {% call form_wrapper() %} {{ textbox(form.feedback, width='1-1', hint='', rows=10, autosize=True) }} {% if not current_user.is_authenticated %} - {{ textbox(form.name, width='1-1') }} - {{ textbox(form.email_address, width='1-1') }} + {{ form.name(param_extensions={"classes": "govuk-!-width-full"}) }} + {{ form.email_address(param_extensions={"classes": "govuk-!-width-full"}) }} {% else %}

We’ll reply to {{ current_user.email_address }}

{% endif %} diff --git a/app/templates/views/user-profile/change.html b/app/templates/views/user-profile/change.html index 80ba1c4bb..d3db79e5a 100644 --- a/app/templates/views/user-profile/change.html +++ b/app/templates/views/user-profile/change.html @@ -1,5 +1,4 @@ {% extends "withoutnav_template.html" %} -{% from "components/textbox.html" import textbox %} {% from "components/page-header.html" import page_header %} {% from "components/page-footer.html" import page_footer %} {% from "components/form.html" import form_wrapper %} @@ -18,7 +17,7 @@
{% call form_wrapper() %} - {{ textbox(form_field, safe_error_message=True) }} + {{ form_field(error_message_with_html=True) }} {{ page_footer('Save') }} {% endcall %}
diff --git a/tests/app/main/views/organisations/test_organisation_invites.py b/tests/app/main/views/organisations/test_organisation_invites.py index 3adbfb62e..d32748310 100644 --- a/tests/app/main/views/organisations/test_organisation_invites.py +++ b/tests/app/main/views/organisations/test_organisation_invites.py @@ -80,7 +80,7 @@ def test_invite_org_user_errors_when_same_email_as_inviter( ) assert mock_invite_org_user.called is False - assert normalize_spaces(page.select_one('.error-message').text) == 'You cannot send an invitation to yourself' + assert 'You cannot send an invitation to yourself' in normalize_spaces(page.select_one('.govuk-error-message').text) def test_accepted_invite_when_other_user_already_logged_in( diff --git a/tests/app/main/views/test_agreement.py b/tests/app/main/views/test_agreement.py index 907980a51..8ee11e211 100644 --- a/tests/app/main/views/test_agreement.py +++ b/tests/app/main/views/test_agreement.py @@ -205,10 +205,13 @@ def test_show_accept_agreement_page( ] assert normalize_spaces(page.select_one('label[for=version]').text) == ( - 'Which version of the agreement do you want to accept? ' + 'Which version of the agreement do you want to accept?' + ) + + assert normalize_spaces(page.select_one('#version-hint').text) == ( 'The version number is on the front page, for example ‘3.6’' ) - assert page.select_one('input[name=version]')['value'] == '' + assert page.select_one('input[name=version]').get('value') is None assert normalize_spaces(page.select_one('#who legend').text) == ( 'Who are you accepting the agreement for?' @@ -235,12 +238,12 @@ def test_show_accept_agreement_page( assert normalize_spaces(page.select_one('label[for=on_behalf_of_name]').text) == ( 'What’s their name?' ) - assert page.select_one('input[name=on_behalf_of_name]')['value'] == '' + assert page.select_one('input[name=on_behalf_of_name]').get('value') is None assert normalize_spaces(page.select_one('label[for=on_behalf_of_email]').text) == ( 'What’s their email address?' ) - assert page.select_one('input[name=on_behalf_of_email]')['value'] == '' + assert page.select_one('input[name=on_behalf_of_email]').get('value') is None def test_accept_agreement_page_populates( @@ -278,8 +281,7 @@ def test_accept_agreement_page_populates( 'on_behalf_of_email': '', }, [ - 'Select an option', - 'Must be a number', + 'Error: Must be a number', ], ), ( @@ -290,7 +292,7 @@ def test_accept_agreement_page_populates( 'on_behalf_of_email': '', }, [ - 'Must be a number', + 'Error: Must be a number', ], ), ( @@ -301,8 +303,8 @@ def test_accept_agreement_page_populates( 'on_behalf_of_email': '', }, [ - 'Cannot be empty', - 'Cannot be empty', + 'Error: Cannot be empty', + 'Error: Cannot be empty', ], ), ( @@ -313,7 +315,7 @@ def test_accept_agreement_page_populates( 'on_behalf_of_email': '', }, [ - 'Cannot be empty', + 'Error: Cannot be empty', ], ), ( @@ -324,7 +326,7 @@ def test_accept_agreement_page_populates( 'on_behalf_of_email': 'test@example.com', }, [ - 'Cannot be empty', + 'Error: Cannot be empty', ], ), @@ -343,7 +345,7 @@ def test_accept_agreement_page_validates( _expected_status=200, ) assert [ - error.text.strip() for error in page.select('.error-message') + error.text.strip() for error in page.select('.govuk-error-message') ] == expected_errors diff --git a/tests/app/main/views/test_feedback.py b/tests/app/main/views/test_feedback.py index b05921ce8..1dbdad742 100644 --- a/tests/app/main/views/test_feedback.py +++ b/tests/app/main/views/test_feedback.py @@ -233,7 +233,7 @@ def test_email_address_required_for_problems_and_questions( _data=data, _expected_status=200 ) - assert isinstance(page.find('span', {'class': 'error-message'}), element.Tag) + assert isinstance(page.find('span', {'class': 'govuk-error-message'}), element.Tag) @freeze_time('2016-12-12 12:00:00.000000') @@ -255,8 +255,8 @@ def test_email_address_must_be_valid_if_provided_to_support_form( assert response.status_code == 200 page = BeautifulSoup(response.data.decode('utf-8'), 'html.parser') - assert normalize_spaces(page.select_one('span.error-message').text) == ( - 'Enter a valid email address' + assert normalize_spaces(page.select_one('span.govuk-error-message').text) == ( + 'Error: Enter a valid email address' ) diff --git a/tests/app/main/views/test_manage_users.py b/tests/app/main/views/test_manage_users.py index ea8433e19..e27250644 100644 --- a/tests/app/main/views/test_manage_users.py +++ b/tests/app/main/views/test_manage_users.py @@ -1116,8 +1116,8 @@ def test_user_cant_invite_themselves( _expected_status=200, ) assert page.h1.string.strip() == 'Invite a team member' - form_error = page.find('span', class_='error-message').string.strip() - assert form_error == "You cannot send an invitation to yourself" + form_error = page.find('span', class_='govuk-error-message').text.strip() + assert form_error == "Error: You cannot send an invitation to yourself" assert not mock_create_invite.called @@ -1404,7 +1404,7 @@ def test_edit_user_email_cannot_change_a_gov_email_address_to_a_non_gov_email_ad }, _expected_status=200, ) - assert 'Enter a public sector email address' in page.select_one('.error-message').text + assert 'Enter a public sector email address' in page.select_one('.govuk-error-message').text with client_request.session_transaction() as session: assert 'team_member_email_change-'.format(active_user_with_permissions['id']) not in session diff --git a/tests/app/main/views/test_register.py b/tests/app/main/views/test_register.py index b4052b9ed..618de2856 100644 --- a/tests/app/main/views/test_register.py +++ b/tests/app/main/views/test_register.py @@ -113,10 +113,10 @@ def test_should_return_200_when_email_is_not_gov_uk( _expected_status=200, ) - assert normalize_spaces(page.select_one('.error-message').text) == ( - 'Enter a public sector email address or find out who can use Notify' + assert 'Enter a public sector email address or find out who can use Notify' in normalize_spaces( + page.select_one('.govuk-error-message').text ) - assert page.select_one('.error-message a')['href'] == url_for( + assert page.select_one('.govuk-error-message a')['href'] == url_for( 'main.who_can_use_notify' ) @@ -199,9 +199,9 @@ def test_register_with_existing_email_sends_emails( ("first.1.2.3.last@example.com", "First Last"), ("first.last.1.2.3@example.com", "First Last"), # Instances where we can’t make a good-enough guess: - ("example123@example.com", ""), - ("f.last@example.com", ""), - ("f.m.last@example.com", ""), + ("example123@example.com", None), + ("f.last@example.com", None), + ("f.m.last@example.com", None), ]) def test_shows_name_on_registration_page_from_invite( client_request, @@ -223,7 +223,7 @@ def test_shows_name_on_registration_page_from_invite( } page = client_request.get('main.register_from_invite') - assert page.select_one('input[name=name]')['value'] == expected_value + assert page.select_one('input[name=name]').get('value') == expected_value def test_shows_hidden_email_address_on_registration_page_from_invite( @@ -247,7 +247,7 @@ def test_shows_hidden_email_address_on_registration_page_from_invite( assert normalize_spaces(page.select_one('main p').text) == ( 'Your account will be created with this email address: test@example.com' ) - hidden_input = page.select_one('form .visually-hidden input') + hidden_input = page.select_one('form .govuk-visually-hidden input') for attr, value in ( ('type', 'email'), ('name', 'username'), diff --git a/tests/app/main/views/test_send.py b/tests/app/main/views/test_send.py index 1733b05d5..a17fdb806 100644 --- a/tests/app/main/views/test_send.py +++ b/tests/app/main/views/test_send.py @@ -2266,7 +2266,7 @@ def test_send_one_off_letter_copes_with_placeholder_from_address_block( assert normalize_spaces(page.select_one('form label').text) == 'thing' assert page.select_one('form input[type=text]')['name'] == 'placeholder_value' - assert page.select_one('form input[type=text]')['value'] == '' + assert page.select_one('form input[type=text]').get('value') is None with client_request.session_transaction() as session: assert session['placeholders'] == { diff --git a/tests/app/main/views/test_service_settings.py b/tests/app/main/views/test_service_settings.py index 2cdbb6505..5a53d9293 100644 --- a/tests/app/main/views/test_service_settings.py +++ b/tests/app/main/views/test_service_settings.py @@ -2240,7 +2240,7 @@ def test_incorrect_reply_to_email_address_input( _expected_status=200 ) - assert normalize_spaces(page.select_one('.error-message').text) == expected_error + assert expected_error in normalize_spaces(page.select_one('.govuk-error-message').text) @pytest.mark.parametrize('contact_block_input, expected_error', [ diff --git a/tests/app/main/views/test_sign_in.py b/tests/app/main/views/test_sign_in.py index c89bc4b21..671305998 100644 --- a/tests/app/main/views/test_sign_in.py +++ b/tests/app/main/views/test_sign_in.py @@ -15,7 +15,7 @@ def test_render_sign_in_template_for_new_user( page = client_request.get('main.sign_in') assert normalize_spaces(page.select_one('h1').text) == 'Sign in' assert normalize_spaces(page.select('label')[0].text) == 'Email address' - assert page.select_one('#email_address')['value'] == '' + assert page.select_one('#email_address').get('value') is None assert page.select_one('#email_address')['autocomplete'] == 'email' assert normalize_spaces(page.select('label')[1].text) == 'Password' assert page.select_one('#password').get('value') is None