|
1 | 1 | (function() { |
2 | 2 |
|
3 | | - var server_max_size = 0, ws; |
| 3 | + var server_max_size = 0, username = "", ws; |
4 | 4 |
|
5 | 5 | function san(s) |
6 | 6 | { |
|
16 | 16 |
|
17 | 17 | function pad(n) { |
18 | 18 | return n < 10 ? '0' + n : n; |
19 | | - } |
| 19 | + } |
20 | 20 |
|
21 | 21 | function lws_urlencode(s) |
22 | 22 | { |
|
68 | 68 | { |
69 | 69 | var da = document.getElementById("da"); |
70 | 70 |
|
71 | | - e.preventDefault(); |
| 71 | + e.preventDefault(); |
72 | 72 | da.classList.remove("trot"); |
73 | 73 | } |
74 | 74 |
|
75 | 75 | function da_over(e) |
76 | 76 | { |
77 | 77 | var da = document.getElementById("da"); |
78 | 78 |
|
79 | | - e.preventDefault(); |
| 79 | + e.preventDefault(); |
80 | 80 | da.classList.add("trot"); |
81 | 81 | } |
82 | 82 |
|
|
88 | 88 | t.deleteRow(n); |
89 | 89 | } |
90 | 90 |
|
91 | | - function do_upload(file) { |
92 | | - var formData = new FormData(); |
| 91 | + /* |
| 92 | + * Generic uploader: takes FormData, a display name and a display size |
| 93 | + */ |
| 94 | + function _do_upload(formData, displayName, displaySize) { |
93 | 95 | var t = document.getElementById("ongoing"); |
94 | | - |
95 | | - formData.append("file", file); |
96 | | - |
97 | 96 | var row = t.insertRow(0), c1 = row.insertCell(0), |
98 | | - c2 = row.insertCell(1), c3 = row.insertCell(2); |
| 97 | + c2 = row.insertCell(1), c3 = row.insertCell(2); |
99 | 98 |
|
100 | 99 | c1.classList.add("ogn"); |
101 | 100 | c1.classList.add("r"); |
102 | 101 |
|
103 | | - if (file.size > server_max_size) { |
| 102 | + if (displaySize > server_max_size) { |
104 | 103 | c1.innerHTML = "Too Large"; |
105 | 104 | c1.classList.add("err"); |
106 | 105 | } else |
107 | 106 | c1.innerHTML = "<img class=\"working\">"; |
108 | 107 |
|
109 | 108 | c2.classList.add("ogn"); |
110 | 109 | c2.classList.add("r"); |
111 | | - c2.innerHTML = humanize(file.size); |
| 110 | + c2.innerHTML = humanize(displaySize); |
112 | 111 |
|
113 | 112 | c3.classList.add("ogn"); |
114 | | - c3.innerHTML = san(file.name); |
| 113 | + c3.innerHTML = san(displayName); |
115 | 114 |
|
116 | | - if (file.size > server_max_size) |
| 115 | + if (displaySize > server_max_size) |
117 | 116 | return; |
118 | 117 |
|
119 | | - fetch("upload/" + lws_urlencode(file.name), { |
| 118 | + fetch("upload/" + lws_urlencode(displayName), { |
120 | 119 | method: "POST", |
121 | 120 | body: formData |
122 | 121 | }) |
123 | | - .then((e) => { /* this just means we got a response code */ |
| 122 | + .then((e) => { /* this just means we got a response code */ |
124 | 123 | var us = e.url.split("/"), ul = us[us.length - 1], n; |
125 | 124 |
|
126 | 125 | for (n = 0; n < t.rows.length; n++) |
|
149 | 148 | }); |
150 | 149 | } |
151 | 150 |
|
| 151 | + function do_upload(file) { |
| 152 | + var formData = new FormData(); |
| 153 | + formData.append("file", file); |
| 154 | + _do_upload(formData, file.name, file.size); |
| 155 | + } |
| 156 | + |
152 | 157 | function da_drop(e) { |
153 | 158 | var da = document.getElementById("da"); |
154 | 159 |
|
155 | | - e.preventDefault(); |
| 160 | + e.preventDefault(); |
156 | 161 | da.classList.remove("trot"); |
157 | 162 |
|
158 | 163 | clear_errors(); |
|
169 | 174 | ([...fi.files]).forEach(do_upload); |
170 | 175 | } |
171 | 176 |
|
172 | | - function body_drop(e) { |
| 177 | + function upl_text_button(e) { |
| 178 | + var content = document.getElementById("text_content"), |
| 179 | + d = new Date(), |
| 180 | + ts = d.getFullYear() + '-' + pad(d.getMonth() + 1) + '-' + |
| 181 | + pad(d.getDate()) + '_' + pad(d.getHours()) + '-' + |
| 182 | + pad(d.getMinutes()) + '-' + pad(d.getSeconds()), |
| 183 | + generated_filename = ts + (username ? '_' + username : '') + '.txt', |
| 184 | + formData = new FormData(), blob; |
| 185 | + |
173 | 186 | e.preventDefault(); |
174 | | - } |
| 187 | + clear_errors(); |
175 | 188 |
|
176 | | - function inp() { |
177 | | - var fi = document.getElementById("file"), |
178 | | - upl = document.getElementById("upl"); |
179 | | - console.log("inp"); |
180 | | - upl.disabled = !fi.files.length; |
| 189 | + blob = new Blob([content.value], { type: "text/plain" }); |
| 190 | + formData.append("file", blob, generated_filename); |
| 191 | + |
| 192 | + _do_upload(formData, generated_filename, blob.size); |
| 193 | + content.value = ""; |
| 194 | + text_inp(); // Manually update button state after clearing |
181 | 195 | } |
182 | 196 |
|
183 | 197 | function delfile(e) |
184 | 198 | { |
185 | 199 | e.stopPropagation(); |
186 | 200 | e.preventDefault(); |
187 | 201 |
|
188 | | - ws.send("{\"del\":\"" + decodeURI(e.target.getAttribute("file")) + |
189 | | - "\"}"); |
| 202 | + ws.send("{\"del\":\"" + e.target.getAttribute("file") + "\"}"); |
| 203 | + } |
| 204 | + |
| 205 | + function body_drop(e) { |
| 206 | + e.preventDefault(); |
| 207 | + } |
| 208 | + |
| 209 | + function file_inp() { |
| 210 | + var fi = document.getElementById("file"), |
| 211 | + upl = document.getElementById("upl"); |
| 212 | + upl.disabled = !fi.files.length; |
| 213 | + } |
| 214 | + |
| 215 | + function text_inp() { |
| 216 | + var content = document.getElementById("text_content"), |
| 217 | + upl_text = document.getElementById("upl_text"); |
| 218 | + upl_text.disabled = !content.value.length; |
190 | 219 | } |
191 | 220 |
|
192 | 221 | function get_appropriate_ws_url(extra_url) |
|
222 | 251 |
|
223 | 252 | document.addEventListener("DOMContentLoaded", function() { |
224 | 253 | var da = document.getElementById("da"), |
225 | | - fi = document.getElementById("file"), |
226 | | - upl = document.getElementById("upl"); |
| 254 | + fi = document.getElementById("file"), |
| 255 | + upl = document.getElementById("upl"), |
| 256 | + text_content = document.getElementById("text_content"), |
| 257 | + upl_text = document.getElementById("upl_text"); |
227 | 258 |
|
228 | 259 | da.addEventListener("dragenter", da_enter, false); |
229 | 260 | da.addEventListener("dragleave", da_leave, false); |
230 | 261 | da.addEventListener("dragover", da_over, false); |
231 | 262 | da.addEventListener("drop", da_drop, false); |
232 | 263 |
|
233 | | - upl.addEventListener("click", upl_button, false); |
234 | | - fi.addEventListener("change", inp, false); |
| 264 | + upl.addEventListener("click", upl_button, false); |
| 265 | + fi.addEventListener("change", file_inp, false); |
| 266 | + |
| 267 | + upl_text.addEventListener("click", upl_text_button, false); |
| 268 | + text_content.addEventListener("input", text_inp, false); |
235 | 269 |
|
236 | 270 | window.addEventListener("dragover", body_drop, false); |
237 | 271 | window.addEventListener("drop", body_drop, false); |
|
250 | 284 | var j = JSON.parse(msg.data), s = "", n, |
251 | 285 | t = document.getElementById("dd-list"); |
252 | 286 |
|
| 287 | + username = j.user || ""; |
253 | 288 | server_max_size = j.max_size; |
254 | 289 | document.getElementById("size").innerHTML = |
255 | 290 | "Server maximum file size " + |
|
262 | 297 | humanize(j.files[n].size) + |
263 | 298 | "</td><td class=\"dow\">" + |
264 | 299 | date.toDateString() + " " + |
265 | | - date.toLocaleTimeString() + |
266 | | - "</td><td>"; |
267 | | - if (j.files[n].yours === 1) |
| 300 | + date.toLocaleTimeString() + "</td><td>"; |
| 301 | + |
| 302 | + if (username) /* any authenticated user can delete */ |
268 | 303 | s += "<img id=\"d" + n + |
269 | 304 | "\" class=\"delbtn\" file=\"" + |
270 | | - lws_urlencode(san(j.files[n].name)) + "\">"; |
| 305 | + san(j.files[n].name) + "\">"; |
271 | 306 | else |
272 | 307 | s += " "; |
273 | 308 |
|
|
278 | 313 | } |
279 | 314 | s += "</table>"; |
280 | 315 |
|
281 | | - t.innerHTML = san(s); |
| 316 | + t.innerHTML = s; |
282 | 317 |
|
283 | 318 | for (n = 0; n < j.files.length; n++) { |
284 | 319 | var d = document.getElementById("d" + n); |
285 | 320 | if (d) |
286 | | - d.addEventListener("click", |
287 | | - delfile, false); |
| 321 | + d.addEventListener("click", delfile, false); |
288 | 322 | } |
289 | 323 | }; |
290 | 324 |
|
|
301 | 335 |
|
302 | 336 | }); |
303 | 337 | }()); |
| 338 | + |
0 commit comments