viewy 2.0.6

A web UI toolkit that combine the advantages of a design system and an ui library.
window.addEventListener("startViewy", ({detail}) => {

    detail.root.querySelectorAll(".multiple-file-input")
        .forEach(fileInputComponent => {
            let triggerButton = fileInputComponent.querySelector(".multiple-file-input__button");
            if (triggerButton) {
                triggerButton.addEventListener("click", e => {
                    e.preventDefault();
                    fileInputComponent.querySelector("input[type='file']")
                        .click();
                });
            }
        });
    detail.root.querySelectorAll(".multiple-file-input")
        .forEach(fileInputComponent => {
            let input;
            if (fileInputComponent.classList.contains("multiple-file-input__input")) {
                input = fileInputComponent;
            } else {
                input = fileInputComponent.querySelector("input[type='file']");
            }

            let form = fileInputComponent.closest("form");

            async function uploadFile(files) {

                let formData = new FormData(form);
                formData.delete(input.name);

                await Promise.all(files.map(([id, file]) => new Promise((resolve, reject) => {
                    let xhr = new XMLHttpRequest();
                    xhr.open(form.method, form.action, true);
                    formData.set(input.name, file);

                    const progressBar = document.querySelector(`[data-file-id="${id}"] progress`);
                    progressBar.removeAttribute("value");
                    xhr.upload.addEventListener("progress", ({lengthComputable, loaded, total}) => {
                        console.log(lengthComputable, loaded, total);
                        if (lengthComputable) {

                            progressBar.max = total;
                            progressBar.value = loaded;
                        }
                    });
                    xhr.addEventListener("load", resolve);
                    xhr.addEventListener("error", reject);
                    xhr.send(formData);
                })));
                if (input.hasAttribute("data-redirect-uri")) {
                    window.location.replace(input.getAttribute("data-redirect-uri"));
                }

            }

            let instance_id = fileInputComponent.getAttribute("data-file-list");
            let fileInput;
            if (fileInputComponent.classList.contains("multiple-file-input--hidden")) {
                fileInput = fileInputComponent;
            } else {
                fileInput = fileInputComponent.querySelector("input[type='file']");
            }
            let file_list = document.getElementById(instance_id);
            file_list.querySelector(".multiple-file-input--hidden__file-list__control-bar__close-button").addEventListener("click", (e) => {
                file_list.style.display = "none";
            });
            let file_list_content = file_list.querySelector(".multiple-file-input__file-list__content");
            let template = file_list.querySelector("template").content;
            fileInput.addEventListener("change", e => {
                file_list_content.innerHTML = "";
                file_list.style.display = "flex";
                let files = [...e.target.files]
                    .map((file) => [crypto.randomUUID(), file]);

                files.forEach(([id, file]) => {
                    let template_instance = template.cloneNode(true);
                    template_instance.querySelector(".multiple-file-input__file-list__item").setAttribute("data-file-id", id);
                    template_instance.querySelector(".t-file-name").textContent = file.name;
                    file_list_content.appendChild(template_instance);
                });
                uploadFile(files);

            });
        });

});