Skip to content
Snippets Groups Projects
loaddir.js 6.88 KiB
Newer Older
  • Learn to ignore specific revisions
  • "use strict";
    
    Francesco Giacomini's avatar
    Francesco Giacomini committed
    // Copyright 2017 Istituto Nazionale di Fisica Nucleare
    //
    // Licensed under the EUPL
    
    exports.__esModule = true;
    var $ = require("jquery");
    
    //funzione che definisce tutti gli elementi responsabili dell'apertura di un file.
    //Sono definiti quindi l'albero e il bottone per l'importazione da locale
    function setImportFile() {
        //genero e leggo il contenuto della directory "filesystem"
    
        var xmlListingFile = new XMLHttpRequest();
    
        xmlListingFile.open("PROPFIND", "CHNET/", false);
        xmlListingFile.setRequestHeader("Depth", "infinity");
    
        xmlListingFile.onreadystatechange = function () {
            if (xmlListingFile.readyState === 4) {
    
                if (xmlListingFile.status === 207) {
                    var parser = new DOMParser();
                    xmlDoc = parser.parseFromString(xmlListingFile.responseText, "text/xml");
    
                }
            }
        };
        xmlListingFile.send(null);
        //ora genero l'albero e definisco l'evento in caso di selezione di un nodo
    
        $('#FileTreeview').treeview({ data: generateTree(xmlDoc) });
    
        $('#FileTreeview').on('nodeSelected', function (e, node) {
            if (node['url'] != undefined) {
                $("#load-spinner").css("display", "inline");
                openFileFromServer(node['url']);
            }
        });
        //bottone per l'importazione locale
        var fileInputButton = document.getElementById('myImport');
        fileInputButton.onchange = function () {
            $("#load-spinner").css("display", "inline");
            var fileName = fileInputButton.files[0];
            var readerObject = new FileReader();
            readerObject.readAsBinaryString(fileName);
            readerObject.onload = function () {
                var fileString = readerObject.result;
                readData(fileString);
            };
        };
    }
    //funzione che genera automaticamente l'albero
    
    function generateTree(xmlDoc) {
        var tree = [];
        var first = true;
        var oldFolderParent = "";
        var oldFolder = "";
        //inizio leggendo tutti gli elementi da inserire nell'albero (caratterizzati
        //dall'avere un url di riferimento)
        var entry = xmlDoc.getElementsByTagName("D:href");
        //per ogni elemento controllo se si tratta di una cartella o di un documento
        for (var i = 0; i < entry.length; i++) {
            var path = entry[i].childNodes[0].nodeValue.split("");
            //cartella, creo l'oggetto corrsipondente
            if (path[path.length - 1] == "/") {
                var folderName = entry[i].childNodes[0].nodeValue.split("/");
    
                    text: folderName[folderName.length - 2],
    
                //posiziono la radice del file system, ne memorizzo il path e il padre
                if (first) {
                    tree.push(Folder);
                    first = false;
                    oldFolder = entry[i].childNodes[0].nodeValue;
                    oldFolderParent =
                        oldFolder.slice(0, oldFolder.lastIndexOf(folderName[folderName.length - 2]));
                    //per ogni cartella determino la relazione con la cartella precedente  
                }
                else {
                    var newFolder = entry[i].childNodes[0].nodeValue;
                    var newFolderParent = newFolder.slice(0, newFolder.lastIndexOf(folderName[folderName.length - 2]));
                    //cartella sorella con quella memorizzata
                    if (newFolderParent == oldFolderParent) {
                        oldFolder = newFolder;
                        insertOBJinFS(Folder, tree, folderName, 0);
                        //cartella figlia di quella memorizzata 
                    }
                    else if (newFolderParent == oldFolder) {
                        oldFolder = newFolder;
                        oldFolderParent = newFolderParent;
                        insertOBJinFS(Folder, tree, folderName, 0);
                        //nessuno dei casi precedenti
                    }
                    else {
                        //arretro nell'albero fino a trovare lo stesso padre. Per fare questo
                        //tolgo al padre memorizzato in precedenza prima "/" poi il nome dell'
                        //ultima cartella
                        while (newFolderParent != oldFolderParent) {
                            oldFolderParent = oldFolderParent.slice(0, oldFolderParent.length - 1);
                            oldFolderParent = oldFolderParent.slice(0, (oldFolderParent.lastIndexOf("/") + 1));
                        }
                        oldFolder = newFolder;
                        insertOBJinFS(Folder, tree, folderName, 0);
                    }
                }
                //documento, creo l'oggetto corrispondente e lo inserisco nell'albero
    
                var fileName = entry[i].childNodes[0].nodeValue.split("/");
                var filePath = entry[i].childNodes[0].nodeValue;
    
                    text: fileName[fileName.length - 1],
    
                    icon: "glyphicon glyphicon-file",
                    selectedIcon: "glyphicon glyphicon-file",
    
                insertOBJinFS(File, tree, fileName, 1);
    
            }
        }
        return tree;
    }
    //funzione che posiziona l'oggetto passato in input nell'albero
    
    function insertOBJinFS(objfs, tree, objfsName, type) {
        //determino la profondità dell'oggetto (se è un file devo aggiungere 1 a causa di "/")
        var depth = objfsName.length;
        if (type)
            depth++;
        //in base alla profondità determino a quale oggetto agganciare quello in input
        var treePosition;
        var l = tree.length - 1;
        switch (depth) {
            case 6:
                treePosition = tree;
                break;
            case 7:
                treePosition = tree[l].nodes;
                break;
            case 8:
                treePosition =
                    tree[l].nodes[tree[l].nodes.length - 1].nodes;
                break;
            case 9:
                treePosition =
                    tree[l].nodes[tree[l].nodes.length - 1].nodes[tree[l].nodes[tree[l].nodes.length - 1].nodes.length - 1].nodes;
                break;
            case 10:
                treePosition =
                    tree[l].nodes[tree[l].nodes.length - 1].nodes[tree[l].nodes[tree[l].nodes.length - 1].nodes.length - 1].nodes[tree[l].nodes[tree[l].nodes.length - 1].nodes[tree[l].nodes[tree[l].nodes.length - 1].nodes.length - 1].nodes.length - 1].nodes;
                break;
            default: break;
    
        treePosition[treePosition.length - 1].nodes.push(objfs);
    
    }
    //funzione che dato l'url di un file, lo apre e lo legge passandone il contenuto
    //alla funzione readData(). Questa funzione è invocata quando viene selezionato
    //un file dall'albero
    function openFileFromServer(url) {
    
        var fileName = url.split("/");
        console.log("Try to open " + fileName[fileName.length - 1] + " ...");
        var txtFile = new XMLHttpRequest();
        txtFile.open("GET", url, true);
        txtFile.onreadystatechange = function () {
            if (txtFile.readyState === 4) {
                if (txtFile.status === 200) {
                    readData((txtFile.responseText));