Skip to content

Commit 46a69a0

Browse files
committed
[FEATURE] Uses accept field to validate provided filetypes
1 parent 17826d3 commit 46a69a0

File tree

3 files changed

+48
-2
lines changed

3 files changed

+48
-2
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ It supports:
4444
* `accept` default `*`
4545
* `multiple` default `false`
4646
* `selectOnClick` default `true`
47+
* `validateExtensions` default `true`
4748
* `dropzone` default `true`
4849
* `preview` default `true`
4950
* `progress` default `true`

addon/components/file-picker.js

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ export default Component.extend({
2525
dropzone: true,
2626
progress: true,
2727
showProgress: false,
28+
validateExtension: true,
2829
hideFileInput: true,
2930
readAs: 'readAsFile',
3031
selectOnClick: true,
@@ -73,13 +74,39 @@ export default Component.extend({
7374
}
7475
},
7576

76-
handleFiles: function(files) {
77+
_invalidExtension: function(files) {
78+
let accept = this.get('accept');
79+
80+
if (accept === '*') {
81+
return;
82+
}
83+
84+
let validExtensions = accept.split(',');
85+
86+
let fileExtensions = files.map(file => `.${file.filename.split('.').slice(-1)[0]}`);
87+
88+
return fileExtensions.some(extension => validExtensions.indexOf(extension) === -1);
89+
},
90+
91+
_validate: function(files) {
7792
if (typeof(this.filesAreValid) === 'function') {
7893
if (!this.filesAreValid(files)) {
7994
return;
8095
}
8196
}
8297

98+
if (!this.get('validateExtension')) {
99+
return;
100+
}
101+
102+
return !this._invalidExtension(files);
103+
},
104+
105+
handleFiles: function(files) {
106+
if (!this._validate(files)) {
107+
return;
108+
}
109+
83110
if (this.get('preview')) {
84111
this.updatePreview(files);
85112
}

tests/unit/components/file-picker-test.js

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,4 +90,22 @@ test('it shows file input', function(assert) {
9090
this.render();
9191

9292
assert.equal(component.$('input:hidden').length, 0);
93-
});
93+
});
94+
95+
test('it rejects improper filetypes', function(assert) {
96+
assert.expect(2);
97+
98+
const component = this.subject({
99+
accept: '.jpg,.jpeg',
100+
multiple: true
101+
});
102+
103+
const files = [
104+
{ filename: 'goodfile.jpg' },
105+
{ filename: 'good_file.jpeg' },
106+
{ filename: 'badfile.html' }
107+
];
108+
109+
assert.strictEqual(component._invalidExtension(files), true);
110+
assert.strictEqual(component._invalidExtension(files.slice(0, 2)), false);
111+
});

0 commit comments

Comments
 (0)