diff --git a/app/assets/javascripts/modules/accessible-autocomplete.js b/app/assets/javascripts/modules/accessible-autocomplete.js index e72b8d00e..a7dbf4683 100644 --- a/app/assets/javascripts/modules/accessible-autocomplete.js +++ b/app/assets/javascripts/modules/accessible-autocomplete.js @@ -23,6 +23,7 @@ window.GOVUK.Modules = window.GOVUK.Modules || {} new window.accessibleAutocomplete.enhanceSelectElement(configOptions) // eslint-disable-line no-new, new-cap const autocompleteElement = selectElement.parentNode.querySelector('.autocomplete__input') + enableArrow(autocompleteElement) resetSelectWhenDesynced(selectElement, autocompleteElement) enableClearButton(selectElement, autocompleteElement) } @@ -30,6 +31,15 @@ window.GOVUK.Modules = window.GOVUK.Modules || {} Modules.AccessibleAutocomplete = AccessibleAutocomplete })(window.GOVUK.Modules) +function enableArrow (autocompleteElement) { + const arrowElement = autocompleteElement.parentNode.querySelector('.autocomplete__dropdown-arrow-down') + + arrowElement.addEventListener('click', function () { + autocompleteElement.click() + autocompleteElement.focus() + }) +} + function resetSelectWhenDesynced (selectElement, autocompleteElement) { // if the autocomplete element's value no longer matches the selected option // in the select element, reset the select element - in particular, this diff --git a/app/assets/stylesheets/components/_accessible-autocomplete.scss b/app/assets/stylesheets/components/_accessible-autocomplete.scss index de1f16a3e..09b38b0ca 100644 --- a/app/assets/stylesheets/components/_accessible-autocomplete.scss +++ b/app/assets/stylesheets/components/_accessible-autocomplete.scss @@ -12,6 +12,14 @@ z-index: 0; } +.autocomplete__input--focused + .autocomplete__dropdown-arrow-down { + display: none; +} + +.autocomplete__dropdown-arrow-down { + cursor: pointer; +} + // This ensures the empty option is the same height as the options with values .autocomplete__option { min-height: 1rem; diff --git a/spec/javascripts/modules/accessible-autocomplete-dropdown-spec.js b/spec/javascripts/modules/accessible-autocomplete-dropdown-spec.js new file mode 100644 index 000000000..18418f37c --- /dev/null +++ b/spec/javascripts/modules/accessible-autocomplete-dropdown-spec.js @@ -0,0 +1,46 @@ +describe('GOVUK.Modules.AccessibleAutocomplete', function () { + let component, module + + beforeEach(async function () { + component = document.createElement('div') + component.setAttribute('data-module', 'accessible-autocomplete') + component.innerHTML = ` + +
+ Search for the permission you want to add. + +
+ ` + module = new GOVUK.Modules.AccessibleAutocomplete(component) + module.init() + }) + + it('opens the menu when clicking the arrow', async function () { + const menuElement = component.querySelector('.autocomplete__menu') + const menuElementClassesBefore = Array.from(menuElement.classList) + expect(menuElementClassesBefore.includes('autocomplete__menu--visible')).toBe(false) + expect(menuElementClassesBefore.includes('autocomplete__menu--hidden')).toBe(true) + + const arrowElement = component.querySelector('.autocomplete__dropdown-arrow-down') + arrowElement.dispatchEvent(new Event('click')) + + await wait() + + const menuElementClassesAfter = Array.from(menuElement.classList) + expect(menuElementClassesAfter.includes('autocomplete__menu--visible')).toBe(true) + expect(menuElementClassesAfter.includes('autocomplete__menu--hidden')).toBe(false) + }) +}) + +const wait = async () => await new Promise(resolve => setTimeout(resolve, 100))