/
Form.MultipleFileInput.js
117 lines (97 loc) · 2.75 KB
/
Form.MultipleFileInput.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
/*
---
name: Form.MultipleFileInput
description: Create a list of files that has to be uploaded
license: MIT-style license.
authors: Arian Stolwijk
requires: [Element.Event, Class, Options, Events]
provides: Form.MultipleFileInput
...
*/
Object.append(Element.NativeEvents, {
dragenter: 2, dragleave: 2, dragover: 2, dragend: 2, drop: 2
});
if (!this.Form) this.Form = {};
Form.MultipleFileInput = new Class({
Implements: [Options, Events],
options: {
itemClass: 'uploadItem'/*,
onAdd: function(file){},
onRemove: function(file){},
onEmpty: function(){},
onDragenter: function(event){},
onDragleave: function(event){},
onDragover: function(event){},
onDrop: function(event){}*/
},
_files: [],
initialize: function(input, list, drop, options){
input = this.element = document.id(input);
list = this.list = document.id(list);
drop = this.drop = document.id(drop);
this.setOptions(options);
var name = input.get('name');
if (name.slice(-2) != '[]') input.set('name', name + '[]');
input.set('multiple', true);
this.inputEvents = {
change: function(event){
Array.each(input.files, this.add, this);
this.fireEvent('change', event);
}.bind(this)
};
this.dragEvents = drop && (typeof document.body.draggable != 'undefined') ? {
dragenter: this.fireEvent.bind(this, 'dragenter'),
dragleave: this.fireEvent.bind(this, 'dragleave'),
dragend: this.fireEvent.bind(this, 'dragend'),
dragover: function(event){
event.preventDefault();
this.fireEvent('dragover', event);
}.bind(this),
drop: function(event){
event.preventDefault();
var dataTransfer = event.event.dataTransfer;
if (dataTransfer) Array.each(dataTransfer.files, this.add, this);
this.fireEvent('drop', event);
}.bind(this)
} : null;
this.attach();
},
attach: function(){
this.element.addEvents(this.inputEvents);
if (this.dragEvents) this.drop.addEvents(this.dragEvents);
},
detach: function(){
this.input.removeEvents(this.inputEvents);
if (this.dragEvents) this.drop.removeEvents(this.dragEvents);
},
add: function(file){
this._files.push(file);
var self = this;
new Element('li', {
'class': this.options.itemClass
}).grab(new Element('span', {
text: file.name
})).grab(new Element('a', {
text: 'x',
href: '#',
events: {click: function(e){
e.preventDefault();
self.remove(file);
}}
})).inject(this.list);
this.fireEvent('add', file);
return this;
},
remove: function(file){
var index = this._files.indexOf(file);
if (index == -1) return this;
this._files.splice(index, 1);
this.list.childNodes[index].destroy();
this.fireEvent('remove', file);
if (!this._files.length) this.fireEvent('empty');
return this;
},
getFiles: function(){
return this._files;
}
});