widget/reply: load file upload progress indicator
[minimedit.git] / progress.js
1 function showsize(bytes) {
2         return (bytes / 1024 / 1024).toFixed(2);
3 }
4
5 function trackupload(input) {
6         var progress = document.getElementById('progress');
7         if (!progress) {
8                 progress = document.createElement('DIV');
9                 progress.id = 'progress';
10                 progress.textContent = '0%';
11                 progress.style.width = '0';
12                 var bar = document.createElement('DIV');
13                 bar.className = 'bar';
14                 bar.appendChild(progress);
15                 input.parentNode.insertBefore(bar, input.nextSibling);
16         }
17
18         var ajax = new XMLHttpRequest();
19         ajax.upload.addEventListener('progress', function (e) {
20                 var percent = (e.loaded / e.total) * 100;
21                 progress.style.width = percent + '%';
22                 progress.textContent = Math.floor(percent) + '%';
23                 progress.innerHTML += ' <small>(' + showsize(e.loaded) + ' / ' + showsize(e.total) + ' MB)</small>';
24         }, false);
25         ajax.addEventListener('load', function (e) {
26                 if (e.target.status == 200) {
27                         progress.textContent = 'voltooid';
28                         progress.innerHTML += ' <small>(' + showsize(input.files[0].size) + ' MB)</small>';
29                         input.value = '';
30                 }
31                 else {
32                         progress.textContent = 'fout';
33                         progress.innerHTML += ': <small>' + e.target.responseText + '</small>';
34                 }
35                 progress.style.width = '100%';
36                 input.parentNode.removeChild(cancel);
37         }, false);
38         ajax.addEventListener('error', function (e) {
39                 progress.textContent = 'mislukt: ' + e.target.responseText;
40         }, false);
41         ajax.addEventListener('abort', function (e) {
42                 progress.textContent = 'afgebroken';
43                 input.parentNode.removeChild(cancel);
44                 input.parentNode.removeChild(progress.parentNode);
45         }, false);
46
47         ajax.open('POST', input.form.action);
48         ajax.setRequestHeader('Accept', 'text/plain')
49         ajax.send(new FormData(input.form));
50
51         var cancel = document.createElement('BUTTON');
52         cancel.textContent = 'Afbreken';
53         cancel.onclick = function () { ajax.abort() };
54         cancel.style.float = 'left';
55         input.parentNode.insertBefore(cancel, progress.parentNode);
56 }
57
58 document.addEventListener('DOMContentLoaded', e => {
59         for (let row of document.forms[0].elements) {
60                 if (row.type == 'file') {
61                         row.form.onsubmit = () => {
62                                 trackupload(row);
63                                 return false;
64                         };
65                 }
66         }
67 });