in ui/src/main/frontend/js/cms.fields.js [23:168]
created() {
const field = this;
const close = field.closest("form").querySelector("a.close");
function setProgress(m, progress) {
const meter = m;
meter.innerText = `${Math.round(progress)}%`;
meter.value = Math.round(progress);
}
function uploadFile(meter, action, file) {
const formData = new FormData();
formData.append("*", file);
formData.append("*@TypeHint", "sling:File");
formData.append("_charset_", "utf-8");
const xhr = new XMLHttpRequest();
xhr.upload.addEventListener(
"loadstart",
() => {
setProgress(meter, 0);
},
false
);
xhr.upload.addEventListener(
"progress",
(event) => {
const percent = (event.loaded / event.total) * 100;
setProgress(meter, percent);
},
false
);
xhr.upload.addEventListener(
"load",
() => {
meter.classList.add("is-info");
},
false
);
xhr.addEventListener(
"readystatechange",
(event) => {
let status;
let text;
let readyState;
try {
readyState = event.target.readyState;
text = event.target.responseText;
status = event.target.status;
} catch (e) {
meter.classList.add("is-danger");
}
if (readyState === 4) {
meter.classList.remove("is-info");
if (status === 200 && text) {
meter.classList.add("is-success");
} else {
meter.classList.add("is-danger");
console.warn(
"Failed to upload %s, recieved message %s",
file.name,
text
); // eslint-disable-line no-console
}
}
},
false
);
xhr.open("POST", action, true);
xhr.send(formData);
}
function handleFile(scope, file) {
const it = document.createElement("div");
const ctr = scope
.closest(".control")
.querySelector(".file-item-container");
let meter = null;
it.innerHTML = document.querySelector(".file-item-template").innerHTML;
meter = it.querySelector(".progress");
it.querySelector(".file-item-name").innerText = file.name;
ctr.classList.remove("is-hidden");
ctr.appendChild(it);
uploadFile(meter, scope.closest("form").action, file);
}
field.addEventListener(
"dragover",
(event) => {
event.preventDefault();
},
false
);
field.addEventListener(
"dragenter",
(event) => {
event.preventDefault();
field.classList.add("is-primary");
},
false
);
field.addEventListener(
"dragleave",
(event) => {
event.preventDefault();
if (!field.contains(event.fromElement)) {
field.classList.remove("is-primary");
}
},
false
);
field.addEventListener(
"drop",
(event) => {
event.preventDefault();
field.classList.remove("is-primary");
if (event.dataTransfer.items) {
const { items } = event.dataTransfer;
for (let i = 0; i < items.length; i++) {
// eslint-disable-line no-plusplus
if (items[i].kind === "file") {
handleFile(field, items[i].getAsFile());
}
}
} else {
const { files } = event.dataTransfer;
for (let i = 0; i < files.length; i++) {
// eslint-disable-line no-plusplus
handleFile(field, files[i]);
}
}
},
false
);
field.closest("form").querySelector("button[type=submit]").remove();
close.innerText = "Done";
close.addEventListener("click", () => {
window.Sling.CMS.ui.reloadContext();
});
field.querySelector("input").addEventListener("change", (event) => {
const { files } = event.target;
for (let i = 0; i < files.length; i++) {
// eslint-disable-line no-plusplus
handleFile(field, files[i]);
}
});
},