-
Notifications
You must be signed in to change notification settings - Fork 288
/
refile.js
128 lines (104 loc) · 4 KB
/
refile.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
118
119
120
121
122
123
124
125
126
127
128
(function() {
"use strict";
function isSuccess(xhr) {
return (xhr.status >= 200 && xhr.status < 300) || xhr.status === 304
}
function formData(as, file, fields) {
var data = new FormData();
if(fields) {
Object.keys(fields).forEach(function(key) {
data.append(key, fields[key]);
});
}
data.append(as, file);
return data;
}
if(!document.addEventListener) { return; } // IE8
document.addEventListener("change", function(changeEvent) {
var input = changeEvent.target;
if(input.tagName === "INPUT" && input.type === "file" && input.getAttribute("data-direct")) {
if(!input.files) { return; } // IE9, bail out if file API is not supported.
var reference = input.getAttribute("data-reference");
var metadataField = document.querySelector("input[type=hidden][data-reference='" + reference + "']");
var url = input.getAttribute("data-url");
var fields = JSON.parse(input.getAttribute("data-fields") || "null");
var requests = [].map.call(input.files, function(file, index) {
function dispatchEvent(element, name, progress) {
var ev = document.createEvent('CustomEvent');
ev.initCustomEvent(name, true, false, { xhr: xhr, file: file, index: index, progress: progress });
element.dispatchEvent(ev);
}
var xhr = new XMLHttpRequest();
xhr.file = file;
xhr.addEventListener("load", function() {
xhr.complete = true;
if(requests.every(function(xhr) { return xhr.complete })) {
finalizeUpload();
}
if(isSuccess(xhr)) {
dispatchEvent(input, "upload:success");
} else {
dispatchEvent(input, "upload:failure");
}
dispatchEvent(input, "upload:complete");
});
xhr.upload.addEventListener("progress", function(progressEvent) {
dispatchEvent(input, "upload:progress", progressEvent);
});
if(input.getAttribute("data-presigned")) {
dispatchEvent(input, "presign:start");
var presignXhr = new XMLHttpRequest();
var presignUrl = url + "?t=" + Date.now() + "." + index;
presignXhr.addEventListener("load", function() {
dispatchEvent(input, "presign:complete");
if(isSuccess(presignXhr)) {
dispatchEvent(input, "presign:success");
var data = JSON.parse(presignXhr.responseText)
xhr.id = data.id;
xhr.open("POST", data.url, true);
xhr.send(formData(data.as, file, data.fields));
dispatchEvent(input, "upload:start");
} else {
dispatchEvent(input, "presign:failure");
xhr.complete = true;
};
});
presignXhr.open("GET", presignUrl, true);
presignXhr.send();
} else {
xhr.open("POST", url, true);
xhr.send(formData(input.getAttribute("data-as"), file, fields));
dispatchEvent(input, "upload:start");
}
return xhr;
});
if(requests.length) {
input.classList.add("uploading");
}
var finalizeUpload = function() {
input.classList.remove("uploading");
if(requests.every(isSuccess)) {
var dataObj = requests.map(function(xhr) {
var json, data = { filename: xhr.file.name, content_type: xhr.file.type, size: xhr.file.size };
try {
json = JSON.parse(xhr.responseText);
} catch(e) {
json = {};
}
var id = xhr.id || json.id;
var url = xhr.url || json.url;
if (id) data.id = id;
if (url) data.url = url;
return data;
});
if(!input.multiple) dataObj = dataObj[0];
if(metadataField) {
metadataField.value = JSON.stringify(dataObj);
metadataField.removeAttribute('disabled');
};
input.removeAttribute("name");
}
}
}
});
})();