Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
24 commits
Select commit Hold shift + click to select a range
59454d9
LG-5040: refactor text field
mdiarra3 Sep 22, 2021
d0eb3f3
Merge remote-tracking branch 'origin/main' into md-lg-5040-refactor-t…
mdiarra3 Sep 23, 2021
6cd90b1
add inline js
mdiarra3 Sep 24, 2021
cd90262
validation html
mdiarra3 Sep 24, 2021
9759f1e
LG-5040: refactor text field
mdiarra3 Sep 28, 2021
260e3f3
LG-5040: add inline validation
mdiarra3 Oct 1, 2021
046fefd
Merge remote-tracking branch 'origin/main' into md-lg-5040-refactor-t…
mdiarra3 Oct 1, 2021
cf9fc9a
LG-5040: validation yaml fixes
mdiarra3 Oct 1, 2021
a8a918a
Merge remote-tracking branch 'origin/main' into md-lg-5040-refactor-t…
mdiarra3 Oct 1, 2021
26b4c0b
LG-5040: updated inputs for inline-validation
mdiarra3 Oct 1, 2021
fde1b02
LG-5040: leverage css more
mdiarra3 Oct 4, 2021
ea6bad9
Merge remote-tracking branch 'origin/main' into md-lg-5040-refactor-t…
mdiarra3 Oct 4, 2021
a683928
LG-5040: fix linting issue
mdiarra3 Oct 4, 2021
4009f7e
LG-5040: lint fixes
mdiarra3 Oct 4, 2021
e9b0d1e
LG-5040: update spec to make sure its properly setting aria invalid p…
mdiarra3 Oct 4, 2021
7c27911
LG-5040: clean up styling, remove error-state css class
mdiarra3 Oct 6, 2021
8a6031c
LG-5040: lint fix
mdiarra3 Oct 6, 2021
96ca325
LG-5040: add validation to send link and verify account
mdiarra3 Oct 12, 2021
8e37a80
LG-5040: madd spacing
mdiarra3 Oct 12, 2021
cc1bcbe
LG-5040: update styling
mdiarra3 Oct 12, 2021
22266b9
Merge remote-tracking branch 'origin/main' into md-lg-5040-refactor-t…
mdiarra3 Oct 12, 2021
7911de7
LG-5040: add padding
mdiarra3 Oct 13, 2021
596ff89
Merge remote-tracking branch 'origin/main' into md-lg-5040-refactor-t…
mdiarra3 Oct 15, 2021
8c0fbaf
Merge remote-tracking branch 'origin/main' into md-lg-5040-refactor-t…
mdiarra3 Oct 18, 2021
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion app/assets/images/alert/error.svg

This file was deleted.

13 changes: 12 additions & 1 deletion app/assets/stylesheets/components/_form.scss
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@ textarea {

// error states
.has-error input {
background-image: url(image-path('alert/error.svg'));
background-position: center right $form-field-padding-x;
background-repeat: no-repeat;
background-size: 1rem 1rem;
Expand Down Expand Up @@ -74,6 +73,18 @@ input::-webkit-inner-spin-button {
[aria-invalid="true"] ~ & {
display: block;
}

[aria-invalid="value-missing"] ~ &.display-if-invalid--value-missing {
display: block;
}

[aria-invalid="pattern-mismatch"] ~ &.display-if-invalid--pattern-mismatch {
display: block;
}
}

.usa-input--error.field:invalid {
@include u-border($theme-input-state-border-width, 'error');
}

.usa-hint {
Expand Down
22 changes: 19 additions & 3 deletions app/javascript/packs/form-validation.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,25 +19,41 @@ function disableFormSubmit(event) {
});
}

function kebabCase(string) {
return string.replace(/(.)([A-Z])/g, '$1-$2').toLowerCase();
}

function resetInput(input) {
input.setCustomValidity('');
input.setAttribute('aria-invalid', 'false');
input.classList.remove('usa-input--error');
}

/**
* Given an `input` or `invalid` event, updates custom validity of the given input.
*
* @param {Event} event Input or invalid event.
*/

function checkInputValidity(event) {
const input = /** @type {HTMLInputElement} */ (event.target);
input.setCustomValidity('');
input.setAttribute('aria-invalid', String(!input.validity.valid));
resetInput(input);
if (
event.type === 'invalid' &&
!input.validity.valid &&
input.parentNode?.querySelector('.display-if-invalid')
) {
event.preventDefault();
const errors = Object.keys(ValidityState.prototype)
.filter((key) => key !== 'valid')
.filter((key) => input.validity[key]);

input.setAttribute('aria-invalid', errors.length ? kebabCase(errors[0]) : 'false');
input.classList.add('usa-input--error');
input.focus();
}
const { I18n } = /** @type {typeof window & LoginGovGlobal} */ (window).LoginGov;

const { I18n } = /** @type {typeof window & LoginGovGlobal} */ (window).LoginGov;
if (input.validity.valueMissing) {
input.setCustomValidity(I18n.t('simple_form.required.text'));
} else if (input.validity.patternMismatch) {
Expand Down
5 changes: 4 additions & 1 deletion app/javascript/packs/ial2-consent-button.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,10 @@ function toggleButton() {

function sync() {
continueButton.classList.toggle('usa-button--disabled', !checkbox.checked);
errorMessage.classList.toggle('display-none', checkbox.getAttribute('aria-invalid') !== 'true');
errorMessage.classList.toggle(
'display-none',
checkbox.getAttribute('aria-invalid') !== 'value-missing',
);
}

sync();
Expand Down
3 changes: 2 additions & 1 deletion app/views/idv/doc_auth/agreement.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,8 @@
<%= t('doc_auth.instructions.consent', app_name: APP_NAME) %>
<%= new_window_link_to t('doc_auth.instructions.learn_more'), MarketingSite.security_and_privacy_practices_url %>
</label>
<div class="usa-error-message display-if-invalid" role="alert">

<div class="usa-error-message display-if-invalid display-if-invalid--value-missing" role="alert">
<%= t('forms.validation.required_checkbox') %>
</div>
</div>
Expand Down
1 change: 0 additions & 1 deletion app/views/idv/doc_auth/send_link.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,6 @@
<p class="margin-y-4"><strong><%= t('doc_auth.info.camera_required') %></strong></p>

<p><%= t('doc_auth.instructions.send_sms') %></p>

<%= validated_form_for(
:doc_auth,
url: url_for,
Expand Down
13 changes: 9 additions & 4 deletions app/views/idv/phone/new.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -57,10 +57,15 @@
method: :put,
class: 'margin-top-2',
}) do |f| %>
<%= f.label :phone, label: t('idv.form.phone'), class: 'bold' %>
<%= f.input :phone, required: true, input_html: { aria: { invalid: false }, class: 'sm-col-8' }, label: false,
wrapper_html: { class: 'margin-right-2' } %>

<%= f.input :phone, required: true,
input_html: { aria: { invalid: false },
class: 'sm-col-8' },
label: t('idv.form.phone'),
wrapper: false,
label_html: { class: 'bold' } %>
<span class='usa-error-message margin-top-2 display-if-invalid display-if-invalid--value-missing margin-bottom-1' role='alert'>
<%= t('simple_form.required.text') %>
</span>
<div class="margin-y-5">
<%= render('shared/spinner_button', action_message: t('doc_auth.info.verifying')) do %>
<%= f.button :submit, t('forms.buttons.continue'), class: 'usa-button--big usa-button--wide' %>
Expand Down
10 changes: 8 additions & 2 deletions app/views/idv/review/new.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,14 @@
current_user, url: idv_review_path,
html: { autocomplete: 'off', method: :put }
) do |f| %>
<%= f.input :password, label: t('idv.form.password'), required: true,
input_html: { aria: { invalid: false }, class: 'password-toggle' } %>

<div class="margin-bottom-4">
<%= f.input :password, label: t('idv.form.password'), required: true,
input_html: { aria: { invalid: false }, class: 'password-toggle' }, wrapper: false %>
<span class='usa-error-message margin-top-2 display-if-invalid display-if-invalid--value-missing margin-bottom-1' role='alert'>
<%= t('simple_form.required.text') %>
</span>
</div>
<div class="right-align margin-top-neg-2 margin-bottom-6">
<%= t(
'idv.forgot_password.link_html',
Expand Down
10 changes: 9 additions & 1 deletion app/views/shared/_ssn_field.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,18 @@ locals:
<%= f.input(
:ssn,
as: :password,
wrapper: false,
label: false,
required: true,
pattern: '^\d{3}-?\d{2}-?\d{4}$',
maxlength: 11,
input_html: { aria: { invalid: false }, class: 'ssn ssn-toggle', value: '' }
input_html: { aria: { invalid: false }, class: 'ssn ssn-toggle usa-input', value: '' }
) %>
<span class='usa-error-message margin-top-7 display-if-invalid display-if-invalid--value-missing margin-bottom-1' role='alert'>
<%= t('simple_form.required.text') %>
</span>

<span class='usa-error-message margin-top-7 pattern-mismatch display-if-invalid display-if-invalid--pattern-mismatch margin-bottom-1' role='alert'>
<%= t('idv.errors.pattern_mismatch.ssn') %>
</span>
<%= javascript_packs_tag_once('ssn-field') %>
2 changes: 1 addition & 1 deletion app/views/sign_up/registrations/new.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@
<%= t('sign_up.terms', app_name: APP_NAME) %>
<%= new_window_link_to(t('titles.rules_of_use'), MarketingSite.rules_of_use_url) %>
</label>
<div class="usa-error-message display-if-invalid" role="alert">
<div class="usa-error-message display-if-invalid display-if-invalid--value-missing" role="alert">
<%= t('forms.validation.required_checkbox') %>
</div>
</div>
Expand Down
2 changes: 1 addition & 1 deletion app/views/users/rules_of_use/new.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
<%= t('users.rules_of_use.check_box_to_accept', app_name: APP_NAME) %>
<%= new_window_link_to(t('titles.rules_of_use'), MarketingSite.rules_of_use_url) %>
<% end %>
<div class="usa-error-message display-if-invalid" role="alert">
<div class="usa-error-message display-if-invalid display-if-invalid--value-missing" role="alert">
<%= t('errors.rules_of_use') %>
</div>
</div>
Expand Down
8 changes: 6 additions & 2 deletions app/views/users/verify_account/index.html.erb
Original file line number Diff line number Diff line change
Expand Up @@ -34,10 +34,14 @@
value: @code,
},
label: t('forms.verify_profile.name'),
class: 'margin-bottom-5' %>
wrapper: false %>

<span class='usa-error-message margin-top-1 display-if-invalid display-if-invalid--value-missing' role='alert'>
<%= t('simple_form.required.text') %>
</span>
<%= f.button :submit,
t('forms.verify_profile.submit'),
class: 'usa-button--big usa-button--full-width' %>
class: 'usa-button--big usa-button--full-width margin-top-5' %>
</div>
</div>
<% end %>
Expand Down
3 changes: 2 additions & 1 deletion spec/features/idv/doc_auth/ssn_step_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -27,9 +27,10 @@

it 'does not proceed to the next page with invalid info', js: true do
fill_out_ssn_form_fail
expect(page.find('#doc_auth_ssn')['aria-invalid']).to eq('true')
click_idv_continue

expect(page.find('#doc_auth_ssn')['aria-invalid']).to eq('value-missing')

expect(page).to have_current_path(idv_doc_auth_ssn_step)
end

Expand Down