Skip to content

Commit

Permalink
Add error message for invalid files selected (#526)
Browse files Browse the repository at this point in the history
Displays an error message in the form area when the user 
1. Drag and drop file(s) which have invalid type
2. After a user selects an invalid file(s) from OS-dialog

The HTML structure of the error is:

```
<div class="dff-uploader">
    <div class="dff-container" data-translations=“{… &quot;, &quot;Invalid file type&quot;: &quot;Invalid file type. Try again&quot;}">
        <input type="file" name=“…” accept=".doc, .docx, …” id=“…”>

	    <div class="dff-files”>…</div>
		<div class="dff-invalid-files">
			<ul>
				<li class="dff-error”>{file.name}: Invalid file type. Try again</li>
			</ul>
		</div>
	</div>
</div>
```
  • Loading branch information
theskumar authored Aug 24, 2022
1 parent 4eb1597 commit b22e499
Show file tree
Hide file tree
Showing 9 changed files with 102 additions and 21 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ testproject/t
django_file_form/static/file_form/file_form.coverage.js
django_file_form/static/file_form/file_form.coverage.js.map
node_modules/
build/
55 changes: 48 additions & 7 deletions django_file_form/static/file_form/file_form.debug.js

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion django_file_form/static/file_form/file_form.debug.js.map

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions django_file_form/static/file_form/file_form.js

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion django_file_form/static/file_form/file_form.js.map

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions django_file_form/widgets.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
"Delete failed": _("Delete failed"),
"Upload failed": _("Upload failed"),
"Drop your files here": _("Drop your files here"),
"Invalid file type": _("Invalid file type. Try again"),
}


Expand Down
23 changes: 18 additions & 5 deletions frontend/src/drop_area.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import AcceptedFileTypes from "./accepted_file_types";
import RenderUploadFile from "./render_upload_file";

const getEntriesFromDirectory = async (
directoryEntry: FileSystemDirectoryEntry
Expand Down Expand Up @@ -53,20 +54,24 @@ class DropArea {
acceptedFileTypes: AcceptedFileTypes;
container: Element;
onUploadFiles: (files: File[]) => void;
renderer: RenderUploadFile;

constructor({
container,
inputAccept,
onUploadFiles
onUploadFiles,
renderer
}: {
container: Element;
inputAccept: string;
onUploadFiles: (files: File[]) => void;
renderer: RenderUploadFile;
}) {
this.container = container;
this.onUploadFiles = onUploadFiles;
this.acceptedFileTypes = new AcceptedFileTypes(inputAccept);

this.renderer = renderer;

container.addEventListener("dragenter", () => {
container.classList.add("dff-dropping");
});
Expand All @@ -90,10 +95,18 @@ class DropArea {
try {
if (dragEvent.dataTransfer) {
const files = await getFilesFromDataTransfer(dragEvent.dataTransfer);
const acceptedFiles = files.filter(file =>
this.acceptedFileTypes.isAccepted(file.name)
);
const acceptedFiles: File[] = [];
const invalidFiles: File[] = [];

for (const file of files) {
if(this.acceptedFileTypes.isAccepted(file.name)){
acceptedFiles.push(file);
} else {
invalidFiles.push(file);
}
}

this.renderer.setErrorInvalidFiles(invalidFiles);
this.onUploadFiles(acceptedFiles);
}
} catch (error) {
Expand Down
12 changes: 7 additions & 5 deletions frontend/src/file_field.ts
Original file line number Diff line number Diff line change
Expand Up @@ -280,10 +280,7 @@ class FileField {
}

if (invalidFiles){
for (const file of invalidFiles){
// @TODO: find a better way to expose the error.
console.error(`File name ${file.name}: Not a valid file type. Update your selection.`)
}
void this.handleInvalidFiles([...invalidFiles]);
}

if (acceptedFiles) {
Expand All @@ -293,6 +290,10 @@ class FileField {
this.renderer.clearInput();
};

handleInvalidFiles = (files: File[]): void => {
this.renderer.setErrorInvalidFiles(files);
}

onClick = (e: Event): void => {
const target = e.target as HTMLInputElement;

Expand Down Expand Up @@ -409,7 +410,8 @@ class FileField {
new DropArea({
container,
inputAccept,
onUploadFiles: this.uploadFiles
onUploadFiles: this.uploadFiles,
renderer: this.renderer
});
}

Expand Down
23 changes: 23 additions & 0 deletions frontend/src/render_upload_file.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ class RenderUploadFile {
container: Element;
input: HTMLInputElement;
translations: { [key: string]: string };
errors: Element;

constructor({
parent,
Expand All @@ -18,6 +19,7 @@ class RenderUploadFile {
translations: { [key: string]: string };
}) {
this.container = this.createFilesContainer(parent);
this.errors = this.createErrorContainer(parent);
this.input = input;
this.translations = translations;

Expand Down Expand Up @@ -130,6 +132,20 @@ class RenderUploadFile {
this.removeCancel(index);
}

public setErrorInvalidFiles(files: File[]): void {
const errorsMessages = document.createElement("ul");

for (const file of files) {
const msg = document.createElement('li')
msg.innerHTML = `${file.name}: ${this.translations["Invalid file type"]}`
msg.className = 'dff-error'
errorsMessages.appendChild(msg);
}

this.errors.replaceChildren(errorsMessages);
this.clearInput();
}

public setSuccess(index: number, size?: number): void {
const { translations } = this;

Expand Down Expand Up @@ -169,6 +185,13 @@ class RenderUploadFile {
}
}

private createErrorContainer = (parent: Element): Element => {
const div = document.createElement("div");
div.className = "dff-invalid-files";
parent.appendChild(div);
return div;
}

private createFilesContainer = (parent: Element): Element => {
const div = document.createElement("div");
div.className = "dff-files";
Expand Down

0 comments on commit b22e499

Please sign in to comment.