• Atom
  • CORE COMPONENT
  • Taxonomic name: A-FILE-UPLOAD
  • Extension: FORMS-EXTENDED-B
  • Added on: v3.0.0 (15/09/17)
  • Updated on: v5.5.0 (23/03/21)

File upload

A control for selecting a file (for file upload) with a browse button. This file upload functionality allows users to browse the files on their computer and upload them to Aviva.


Design and usage

  • Carefully consider the use of file upload option - could it be easier for users to email documents rather than upload them?
  • Multiple files can be upload at once in the same input field
  • Aria-invalid must be used to indicate when an error has occurred with this element
  • Aria-describedby must be used to link any help, instructional and/or error text with the element/form fields

Examples

Standard

Interactive example

Code example

<fieldset class="m-form-row">
	<legend class="a-label">...</legend>
	<div class="m-form-row__content">
		<label class="a-file-upload" data-module="a-file-upload" for="..." >
			<input class="a-file-upload__input" type="file" name="..." id="..." />
			<span class="a-file-upload__label">Choose a file</span>
		</label>
	</div>
	</fieldset>	<!-- or for selecting multiple files -->	<fieldset class="m-form-row">
	<legend class="a-label">...</legend>
	<div class="m-form-row__content">
		<label class="a-file-upload" data-module="a-file-upload" for="..." >
			<input class="a-file-upload__input" type="file" name="..." id="..." multiple />
			<span class="a-file-upload__label">Choose file(s)</span>
		</label>
	</div>
</fieldset>

Valid

Interactive example

Code example

<fieldset class="m-form-row is-valid">
	<legend class="a-label">...</legend>
	<div class="m-form-row__content">
		<p class="m-form-row__validation-message">...</p>
		<label class="a-file-upload" data-module="a-file-upload" for="..." >
			<input class="a-file-upload__input" type="file" name="..." id="..." />
			<span class="a-file-upload__label">Choose a file</span>
		</label>
	</div>
</fieldset>

Errored

Interactive example

Code example

<fieldset class="m-form-row is-error">
	<legend class="a-label">...</legend>
	<div class="m-form-row__content">
		<p class="m-form-row__error-message" id="..." ><span class="u-hidden--visually">Error: </span>...</p>
		<label class="a-file-upload" data-module="a-file-upload" for="..." >
			<input class="a-file-upload__input" type="file" name="..." id="..." aria-invalid="true" aria-describedby="..." />
			<span class="a-file-upload__label">Choose a file</span>
		</label>
	</div>
</fieldset>

Disabled

Interactive example

Code example

<fieldset class="m-form-row is-disabled" disabled>
	<legend class="a-label">...</legend>
	<div class="m-form-row__content">
		<label class="a-file-upload" data-module="a-file-upload" for="..." >
			<input class="a-file-upload__input" type="file" name="..." id="..." />
			<span class="a-file-upload__label">Choose a file</span>
		</label>
	</div>
</fieldset>

Required

<fieldset class="m-form-row">
	<legend class="a-label">...</legend>
	<div class="m-form-row__content">
		<label class="a-file-upload" data-module="a-file-upload" for="..." >
			<input class="a-file-upload__input" type="file" name="..." id="..." aria-required="true" />
			<span class="a-file-upload__label">Choose a file</span>
		</label>
	</div>
</fieldset>

Development and test

Notes for developers

If the ability to select more that one file is required, the multiple attribute must be added to the file input.

To change the caption displayed when multiple files have been selected from "{count} files selected", the data attribute data-multiplecaption can be used. To show the number of files that have been selected, use "{count}" for where the number needs to be. For example:

<label class="a-file-upload" data-module="a-file-upload" data-multiplecaption="You have selected {count} files">
<input class="a-file-upload__input" type="file" id="" multiple />
<span class="a-file-upload__label">Choose file(s)</span>
</label>

When disabling form elements, do not solely rely on the is-disabled class, but ensure that the disabled attribute is also set on the relevant form element or input. If an entire set of form elements is to be disabled, the is-disabled class and disabled attribute should be added directly to the fieldset instead, and not to each individual element within it. However if only one element from the set is disabled, then the class and attribute should be applied to that element only.

Aria usage for errors and help text

To aid screen reader users in completing forms without error and also with understanding and fixing any errors that have occured, some additional aria attributes are now recommended to be applied across all form fields/rows.

All form row help, explanatory text, form row instructions and form row errors must have a unique id assigned to them and be appropriately linked to either the individual form input or the form row using aria-describedby. This ensures that the help text is read out immediately on focus of the form input/fieldset. When there is more that one item that requires referencing within the aria-describedby attribute the id values must be supplied in the form of a space separated list. For example if there is an error with id of 'err1' and help text with id of 'help1' the value for the aria-describedby attribute would be 'err1 help1'.

All inline form error messages should start with the hidden text 'Error: ' so that when read by out by a screen reader it is immediately clear that the text being read is an error message.

All erroring form fields (or fieldset if a group or radios/checkboxes) must have aria-invalid="true" set on them, ensuring that when a user focus' on an errored form field, the field will be announced as invalid, so the user is then aware that there in an issue that requires fixing.

When linking help or errors, or even adding aria-invalid to the markup careful consideration must be taken as to where it is most appropriate to apply the value. The following rules should be used to decide where the attribute(s) should be applied.

  • Single form field - All attributes should be applied directly to that form field
  • Group of form fields but only one in error or help text applies to only one - Apply the attribute(s) to the only field in error or where the help text applies
  • Group of form field where all in error or the help text applies to all - Apply the attribute(s) to the groups surrounding fieldset (form row)

There may situations where more than one of these rules applies to the overall form row for example a date range where the instruction text applies to both fields so should be linked to the fieldset for the date range but one of the two fields is in error so the error should be linked to just that field not to the fieldset.

Important messages

To help those using assistive technologies, make sure that success/error messages which need to be announced to users have their aria attributes updated to role="alert" and/or aria-live="assertive".

Changing locale settings

Default text for the file input ('{count} files selected') can be changed for a particular locale.

en: {
	aFileUpload : { multipleCaption : '{count} files selected' },
},

For more information on this, see our page on how to change locale settings within JavaScript.

Extension component

This component forms part of the 'forms-extended-b' extension and so requires an additional stylesheet to be loaded in order to be used; include the following code in the header of your page to attach the relevant additional stylesheet:

<link media="all" href="./assets/[ theme type ]/[ release version ]/[ organisation ]/[ theme name ]/css/forms-extended-b.css" rel="stylesheet" />

Notes for testers

  • In this instance, the label for the input is the wording on the button for the file upload field; clicking / pressing the explanatory text for the file input will not transfer focus to the file input as it would for a text input.
  • There should be a clear visual distinction between the standard and hover button states.
  • There should be a clear visual distinction between the standard and focus states for the input.
  • Users should be able to copy and paste if necessary.

Classes overview

The following table gives you a quick overview of the CSS classes that can be applied.

Class Outcome Required Applied to Comments
.a-file-upload Base style for a file upload input Yes .m-form-row__content > label  
.a-file-upload__input Base style for a file upload input Yes .a-file-upload > input  
.a-file-upload__label Base style for a file upload input button Yes .a-file-upload__input + span  

Keyboard operations

TAB

Tabbing to an input field should make the input clearly visually different so that the focus point on the page is obvious to the user.

SPACE or ENTER

With focus on the file input, pressing SPACE or ENTER will open the the native file selection dialog.

Component releases

  • Added on: v3.0.0 (15/09/17)
  • Updated on: v5.5.0 (23/03/21)

Latest update:

  • updated: Additional aria attributes are now recommended to be applied across all form fields/rows so as to aid screen reader users in completing forms without error and also with understanding and fixing any errors that have occurred.

Full version history

A full history of changes and enhancements detailing all minor and major updates to the component.

View full version history

Want something new in Framework, or to chat about an issue you're having with it?

Contact the team