Newer
Older
Sunfish / Resources / $sunfish / sunfish-directory.js
@XWolf Override XWolf Override on 14 Mar 2021 12 KB Resources
(function () {

    /**
     * Get the item element form any sub element
     * @param {*} subElement DOM element child of item
     */
    function getItem(subElement) {
        while (subElement.className.indexOf("item-row") < 0)
            subElement = subElement.parentElement;
        return subElement;
    }

    sunfish.deleteFile = function (sender) {
        //TODO: use the DELTE http method
        var ask;
        var item = getItem(sender);
        var isfolder = item.className.indexOf("directory") >= 0;
        var file = item.querySelector("div.item-name").innerText;
        if (isfolder)
            ask = "Sure to delete folder " + file + " and all its contents? can not be undone.";
        else
            ask = "Sure to delete " + file + "? can not be undone.";
        sunfish.ask(ask,
            { b: 'Cancel' },
            {
                b: 'Delete', class: 'warning', do: function () {
                    var unlock = sunfish.lock("deleting...");
                    sunfish.ajax(document.location.href + file + "?action=delete", {
                        ok: function (result) {
                            if (result == "OK") {
                                unlock();
                                item.parentNode.removeChild(item);
                            } else {
                                unlock();
                                sunfish.error("Error deleting file", function () {
                                    document.location.reload();
                                });
                            }
                        }
                    })
                }
            }

        );
    }

    sunfish.renameFile = function (sender) {
        var item = getItem(sender);
        var file = item.querySelector("div.item-name").innerText;
        sunfish.askString('Rename to:', file, function (newName) {
            sunfish.ajax(document.location.href + file + "?action=rename&to=" + newName, {
                ok: function (result) {
                    if (result == "OK") {
                        item.querySelector("div.item-name").innerText = newName;
                    } else
                        sunfish.error("Error renaming file", function () {
                            document.location.reload();
                        });
                }
            });
        });
    }

    sunfish.openFile = function (sender) {
        var item = getItem(sender);
        var file = item.querySelector("div.item-name").innerText;
        sunfish.ajax(document.location.href + file + "?action=open", {
            ok: function (result) {
                if (result != "OK")
                    sunfish.error("Error opening file in server", function () {
                        document.location.reload();
                    });
            }
        });
    }

    sunfish.newFolder = function (sender) {
        sunfish.askString('Folder name:', "", function (name) {
            if (!name)
                return;
            sunfish.ajax(document.location.href + name + '/', {
                method: "PUT",
                ok: function (result) {
                    if (result != "OK")
                        sunfish.error("Error creading file", function () {
                            document.location.reload();
                        });
                    else
                        document.location.reload();
                }
            });
        });
    }

    sunfish.newFile = function (sender) {
        sunfish.askString('File name:', "", function (name) {
            if (!name)
                return;
            sunfish.ajax(document.location.href + name, {
                method: "PUT",
                ok: function (result) {
                    if (result != "OK")
                        sunfish.error("Error creading file", function () {
                            document.location.reload();
                        });
                    else
                        document.location.reload();
                }
            });
        });
    }

    sunfish.uploadFile = function (sender) {
        var efile = document.createElement("input");
        efile.type = "file";
        efile.onchange = () => {
            var fileList = efile.files;
            for (var i = 0; i < fileList.length; i++)
                upl.upload(fileList[i]);
        }
        efile.click();
    }

    // UPLOAD task
    var upl;
    function Uploader() {
        var pb, elist, uploads = [];
        var edrop = sunfish.build({
            $: "div", className: "popup-wall upload-drop", _: [
                {
                    $: "div", className: "upload-drop-icon", _: [
                        { $: "i", className: "material-icons-round", _: ["upload"] }
                    ]
                }
            ]
        });
        var ctt = edrop.querySelector("div.upload-drop-icon");

        document.body.appendChild(edrop);

        function show() {
            document.body.appendChild(edrop);
            var cbutton;
            ctt.innerHTML = "";
            elist = sunfish.build({ $: "div", className: "upload-list" }, ctt);
            elist.addItem = function (file, name, to) {
                if (!pb.updater) {
                    pb.updater = function () {
                        var tpos = 0, tmax = 0;
                        uploads.forEach(u => {
                            tpos += u.pos;
                            tmax += u.length;
                        })
                        if (tmax == 0)
                            tmax = 100;
                        pb.style.width = (tpos / tmax * 100) + "%";
                        if (tpos < tmax) {
                            setTimeout(pb.updater, 100);
                            cbutton.style.display = "none";
                        } else {
                            delete pb.updater;
                            cbutton.style.display = "";
                        }
                    }
                    setTimeout(pb.updater, 100);
                }
                var item = sunfish.build({
                    $: "div", className: "upload-item", _: [{ $: "div", _: [to] },
                    { $: "div", className: "upload-item-progress-box", _: [{ $: "div", className: "upload-item-progress" }] }]
                }, elist);
                var itemProgress = item.querySelector(".upload-item-progress");
                var me;
                uploads.push(me = {
                    file: file,
                    name: name,
                    to: to,
                    progress: itemProgress,
                    length: file.size,
                    pos: 0,
                    eof: false
                });
                function updateProgress() {
                    if (me.length <= 0)
                        return;
                    var pos = me.pos;
                    if (pos > me.length)
                        pos = me.length;
                    itemProgress.style.width = (pos / me.length) * 100 + "%";

                }
                function ko(info) {
                    itemProgress.style.width = "150%";
                    itemProgress.style.backgroundColor = "tomato";
                    if (info)
                        console.error(info);
                    me.pos = me.length;
                }
                function step() {
                    var length = Math.min(1024 * 512, me.length - me.pos);
                    var blob = file.slice(me.pos, me.pos + length);
                    if (blob.length == 0)
                        return ko("Nothing to send");
                    sunfish.ajax(document.location.href + to, {
                        method: "PUT",
                        data: blob,
                        headers: {
                            "X-Sunfish-Offset": me.pos,
                            "X-Sunfish-Length": blob.size
                        },
                        ok: function (result) {
                            if (result != "OK")
                                ko("Upload is " + result);
                            else {
                                me.pos += blob.size;
                                updateProgress();
                                if (me.pos < me.length)
                                    step();
                                else {
                                    itemProgress.style.backgroundColor = "#46ad33";
                                    me.eof = true;
                                }
                            }
                        },
                        ko: ko
                    });
                }
                step();
            }
            var pbb = sunfish.build({ $: "div", className: "upload-progress-box" }, ctt);
            pb = sunfish.build({
                $: "div", className: "upload-progress", _: [
                    {
                        $: "button", className: "upload-close", style: { display: "none" }, _: ["Close"], onclick: function () {
                            /*
                            document.body.removeChild(edrop);
                            uploads = [];
                            elist.innerHTML="";
                            cbutton.style.display = "none";
                            pb.style.width="0";
                            */
                            document.location.reload();
                        }
                    }
                ]
            }, pbb);
            cbutton = pb.querySelector(".upload-close");
        }

        document.body.addEventListener("drop", function (ev) {
            function processWKItem(item, path) {
                path = path || "";
                if (item.isFile) {
                    item.file(function (file) {
                        upload(file, path + file.name);
                    });
                } else if (item.isDirectory) {
                    // Get folder contents
                    var dirReader = item.createReader();
                    dirReader.readEntries(function (entries) {
                        for (var i = 0; i < entries.length; i++) {
                            processWKItem(entries[i], path + item.name + "/");
                        }
                    });
                }
            }
            ev.preventDefault();
            if (ev.dataTransfer.items) {
                var items = ev.dataTransfer.items;
                for (var i = 0; i < items.length; i++) {
                    var item = items[i];
                    if (item.kind === 'file')
                        if (item.webkitGetAsEntry)
                            processWKItem(item.webkitGetAsEntry());
                        else
                            upload(item.getAsFile());
                }
            } else {
                for (var i = 0; i < ev.dataTransfer.files.length; i++)
                    upload(ev.dataTransfer.files[i].getAsFile());
            }
        });
        document.body.addEventListener("dragover", function (ev) {
            console.info("drag-over");
            ev.stopPropagation();
            ev.preventDefault();
            var anyfile = false;
            if (ev.dataTransfer.items) {
                for (var i = 0; i < ev.dataTransfer.items.length; i++)
                    if (anyfile = ev.dataTransfer.items[i].kind == "file")
                        break;
            } else
                anyfile = ev.dataTransfer.files.length > 0;
            if (anyfile)
                document.body.classList.add("dragging");
        });

        edrop.addEventListener("dragleave", function (ev) {
            console.info("drag-leave");
            ev.stopPropagation();
            ev.preventDefault();
            var anyfile = false;
            if (ev.dataTransfer.items) {
                for (var i = 0; i < ev.dataTransfer.items.length; i++)
                    if (anyfile = ev.dataTransfer.items[i].kind == "file")
                        break;
            } else
                anyfile = ev.dataTransfer.files.length > 0;
            if (anyfile)
                document.body.classList.remove("dragging");
        });

        function upload(file, to) {
            document.body.appendChild(edrop);
            if (!elist)
                show();
            to = to || file.name;
            elist.addItem(file, file.name, to);
        }

        this.upload = upload;
    }

    window.addEventListener("load", function () {
        upl = new Uploader();
    });

})();