aboutsummaryrefslogtreecommitdiff
path: root/themes/alps/assets
diff options
context:
space:
mode:
authorDrew DeVault <sir@cmpwn.com>2020-11-12 12:09:41 -0500
committerDrew DeVault <sir@cmpwn.com>2020-11-12 12:09:41 -0500
commitaad5f44f6cb605589fa017bc521e47a4a517b57d (patch)
tree4a13ff32477292a4c5a175ad0459fe4622fb84f8 /themes/alps/assets
parent231626a31a94c65dcce13765815f425b096ae2bb (diff)
downloadalps-aad5f44f6cb605589fa017bc521e47a4a517b57d.tar.gz
alps-aad5f44f6cb605589fa017bc521e47a4a517b57d.zip
Display server errors on attachment upload
Diffstat (limited to 'themes/alps/assets')
-rw-r--r--themes/alps/assets/attachments.js31
-rw-r--r--themes/alps/assets/style.css9
2 files changed, 38 insertions, 2 deletions
diff --git a/themes/alps/assets/attachments.js b/themes/alps/assets/attachments.js
index a57b4c5..612808a 100644
--- a/themes/alps/assets/attachments.js
+++ b/themes/alps/assets/attachments.js
@@ -85,17 +85,40 @@ function attachFile(file) {
let formData = new FormData();
formData.append("attachments", file);
+ const handleError = msg => {
+ attachments = attachments.filter(a => a !== attachment);
+ node.classList.add("error");
+ node.querySelector(".progress").remove();
+ node.querySelector(".size").remove();
+ node.querySelector("button").remove();
+ node.querySelector(".error").innerText = "Error: " + msg;
+ updateState();
+ };
+
xhr.open("POST", "/compose/attachment");
xhr.upload.addEventListener("progress", ev => {
attachment.progress = ev.loaded / ev.total;
updateState();
});
xhr.addEventListener("load", () => {
- // TODO: Handle errors
- const resp = JSON.parse(xhr.responseText);
+ let resp;
+ try {
+ resp = JSON.parse(xhr.responseText);
+ } catch {
+ resp = { "error": "Error: invalid response" };
+ }
+
+ if (xhr.status !== 200) {
+ handleError(resp["error"]);
+ return;
+ }
+
attachment.uuid = resp[0];
updateState();
});
+ xhr.addEventListener("error", () => {
+ handleError("an unexpected problem occured");
+ });
xhr.send(formData);
updateState();
@@ -105,6 +128,7 @@ function attachmentNodeFor(file) {
const node = document.createElement("div"),
progress = document.createElement("span"),
filename = document.createElement("span"),
+ error = document.createElement("span"),
size = document.createElement("span"),
button = document.createElement("button");
node.classList.add("upload");
@@ -116,6 +140,9 @@ function attachmentNodeFor(file) {
filename.innerText = file.name;
node.appendChild(filename);
+ error.classList.add("error");
+ node.appendChild(error);
+
size.classList.add("size");
size.innerText = formatSI(file.size) + "B";
node.appendChild(size);
diff --git a/themes/alps/assets/style.css b/themes/alps/assets/style.css
index 8b80504..79bc88a 100644
--- a/themes/alps/assets/style.css
+++ b/themes/alps/assets/style.css
@@ -245,6 +245,15 @@ main.create-update #attachment-list .upload .progress {
left: 0;
}
+main.create-update #attachment-list .upload .error {
+ display: none;
+}
+
+main.create-update #attachment-list .upload.error .error {
+ display: block;
+ color: red;
+}
+
main.create-update textarea {
flex: 1 auto;
resize: none;