Basic implementation
Import
Import the settings and the file uploader scss files.
@import 'settings-tools/all-settings';
@import 'components/_c.file-uploader';
Basic usage
Natively, to upload files we use an
<input type="file" />, but in Mozaic, we will customize it with a<label>that will act as a button.
Wrap a input[type="file"] and a label inside a div and apply the following classes :
<div class="mc-fileuploader"> <input type="file" class="mc-fileuploader__input" id="import-file-id1"> <label for="import-file-id1" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label></div>
<div class="example"> <div class="mc-fileuploader"> <input type="file" class="mc-fileuploader__input" id="import-file-id1" /> <label for="import-file-id1" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label> </div></div>
Behaviors
Standard file uploader states :
hoverfocusdisabled
<div class="example"> <h2>Hover</h2> <div class="mc-fileuploader"> <input type="file" class="mc-fileuploader__input is-hover" id="import-file-id1" /> <label for="import-file-id1" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label> </div></div>
<div class="example"> <h2>Focus</h2> <div class="mc-fileuploader"> <input type="file" class="mc-fileuploader__input is-focus" id="import-file-id2" /> <label for="import-file-id2" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label> </div></div>
<div class="example"> <h2>Disabled</h2> <div class="mc-fileuploader"> <input type="file" class="mc-fileuploader__input is-disabled" id="import-file-id3" disabled /> <label for="import-file-id3" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label> </div></div>
Multiple files
You can choose to upload several files at the same time by adding the multiple attribute to your input element.
<div class="example"> <div class="mc-fileuploader"> <input type="file" class="mc-fileuploader__input" id="import-file-id1" multiple /> <label for="import-file-id1" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select multiple files to upload </span> </label> </div></div>
Accept type of files
You can also restrict the type or the path of the file to be uploaded by using the accept attribute: accept=".jpg, .jpeg, .png" or accept="image/*.
<div class="example"> <div class="mc-fileuploader"> <input type="file" accept=".jpg, .jpeg, .png" class="mc-fileuploader__input" id="import-file-id1" /> <label for="import-file-id1" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label> </div></div>
Display uploaded files and errors
Html and css do not provide a native way to achieve this, but using some Javascript, it is possible to display errors and uploaded files to the user.
Inside the file uploader, right after the label, add a list of files :
<div class="mc-fileuploader"> <-- label and input here --!> <ul class="mc-fileuploader__files"> <li class="mc-fileuploader__file mc-fileuploader__file--is-valid"> <span class="mc-fileuploader__file-name">filename-valid.jpg</span> <span class="mc-fileuploader__file-icon"></span> <button type="button" class="mc-fileuploader__delete"></button> </li> <li class="mc-fileuploader__file mc-fileuploader__file--is-invalid"> <span class="mc-fileuploader__file-name">filename-invalid.jpg</span> <span class="mc-fileuploader__file-icon"></span> <button type="button" class="mc-fileuploader__delete"></button> <div class="mc-fileuploader__file-message"> Oops, the file "filename-invalid.jpg" was not uploaded. please try again </div> </li> </ul></div>
<div class="example"> <div class="mc-fileuploader"> <input type="file" class="mc-fileuploader__input" id="import-file-id4" /> <label for="import-file-id4" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label> <ul class="mc-fileuploader__files"> <li class="mc-fileuploader__file mc-fileuploader__file--is-valid"> <span class="mc-fileuploader__file-name">filename-valid.jpg</span> <span class="mc-fileuploader__file-icon"></span> <button type="button" class="mc-fileuploader__delete"></button> </li> <li class="mc-fileuploader__file mc-fileuploader__file--is-valid"> <span class="mc-fileuploader__file-name"> here-is-a-veryveryvery-veryveryveryveryvery-veryvery-long-uploaded-filename.png </span> <span class="mc-fileuploader__file-icon"></span> <button type="button" class="mc-fileuploader__delete"></button> </li> <li class="mc-fileuploader__file mc-fileuploader__file--is-invalid"> <span class="mc-fileuploader__file-name">filename-invalid.jpg</span> <span class="mc-fileuploader__file-icon"></span> <button type="button" class="mc-fileuploader__delete"></button> <div class="mc-fileuploader__file-message"> Oops, the file is not uploaded. </div> </li> </ul> </div></div>
Use in a form field
Import
Import the settings, the file uploader and the fields scss files.
@import 'settings-tools/all-settings';
@import 'components/_c.file-uploader';
@import 'components/_c.fields';
Note that the import order is important to get the right rendering of the component.
Usage
When using the file uploader as part of a form, you must make sure to respect the following structure:
<div class="mc-field"> <label class="mc-field__label" for="default"> Label </label>
<div class="mc-field__element mc-fileuploader"> <input type="file" class="mc-fileuploader__input" id="default" /> <label for="default" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label> </div></div>
<div class="example"> <div class="mc-field"> <label class="mc-field__label" for="default"> Attachments </label>
<div class="mc-field__element mc-fileuploader"> <input type="file" class="mc-fileuploader__input" id="default" /> <label for="default" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label> </div> </div></div>
Behaviors
Help text
You have the option of defining a help text for the user if necessary.
For this you have to add a span with the mc-field__help class below the label.
<label class="mc-field__label"> Label</label><span class="mc-field__help"> Help text</span>
<div class="example"> <div class="mc-field"> <label class="mc-field__label" for="default"> Attachments </label> <span class="mc-field__help"> Only .jpg and .png files </span>
<div class="mc-field__element mc-fileuploader"> <input type="file" class="mc-fileuploader__input" id="default" /> <label for="default" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label> </div> </div></div>
Requirement
When the file uploader is mandatory, you must specify it to the user.
For this you have to add a span with the class mc-field__requirement right after the label text.
<label class="mc-field__label"> Label <span class="mc-field__requirement"> mandatory </span></label>
When the file uploader is mandatory the required attribute must be added on the mc-fileuploader__input element
<div class="example"> <div class="mc-field"> <label class="mc-field__label" for="default"> Attachments <span class="mc-field__requirement"> mandatory </span> </label>
<div class="mc-field__element mc-fileuploader"> <input type="file" class="mc-fileuploader__input" id="default" required /> <label for="default" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label> </div> </div></div>
Validation
Invalid
To indicate that your file uploader is not valid, several steps are to be implemented:
- Add the
is-invalidclass and thearia-invalidattribute to themc-fileuploader__inputelement - You can add in addition a text detailing the error. This text must be added in a span with the class
mc-field__error-messageand positioned below themc-field__elementelement
If you use an error message you must comply with the following accessibility rules:
- the span
mc-field__error-messagemust always have anid - the
aria-describedbyattribute must be added on themc-fileuploader__inputelement and must refer to the id of the error message
<div class="example"> <div class="mc-field"> <label class="mc-field__label" for="default"> Label </label>
<div class="mc-field__element mc-fileuploader"> <input type="file" class="mc-fileuploader__input is-invalid" id="default" required aria-describedBy="err_1" aria-invalid="true" /> <label for="default" class="mc-fileuploader__label"> <span class="mc-fileuploader__label--center"> Select a file to upload </span> </label> </div>
<span id="err_1" class="mc-field__error-message"> Error: this field is mandatory. Don't forget to fill it in. </span> </div></div>