//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 jsonResponse: any; var xmlListingFile: any = new XMLHttpRequest(); xmlListingFile.open("GET", "https://baltig.infn.it/api/v4/projects/819/repository/tree?recursive=1&path=XRF-File-System", false); xmlListingFile.onreadystatechange = function(){ if(xmlListingFile.readyState === 4){ if(xmlListingFile.status === 200){ jsonResponse = JSON.parse(xmlListingFile.responseText); } } } xmlListingFile.send(null); //ora genero l'albero e definisco l'evento in caso di selezione di un nodo $('#FileTreeview').treeview({data: generateTree(jsonResponse)}); $('#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: any = document.getElementById('myImport'); fileInputButton.onchange = function(){ $("#load-spinner").css("display", "inline"); var fileName: string = fileInputButton.files[0]; var readerObject: any = new FileReader(); readerObject.readAsBinaryString(fileName); readerObject.onload = function() { var fileString: string = readerObject.result; readData(fileString); } } } //funzione che genera automaticamente l'albero function generateTree(jsonDoc){ var tree: any = [ { text:"XRF-File-System", nodes: [ ] }]; //scorro ogni elemento dell'albero for (var i: number = 0; i < jsonDoc.length; i++) { if(jsonDoc[i].type == "tree"){ //è una cartella var Folder = { //definisco l'oggetto Folder text: jsonDoc[i].name, relativePath: jsonDoc[i].path, nodes: [] } insertOBJinFS(Folder, tree); } else { //è un file var File = { //definisco l'oggetto File text: jsonDoc[i].name, relativePath: jsonDoc[i].path, icon: "glyphicon glyphicon-file", selectedIcon: "glyphicon glyphicon-file", url: jsonDoc[i].path } //inserisco il file nella giusta posizione insertOBJinFS(File, tree); } } return tree; } //funzione che posiziona l'oggetto passato in input nell'albero function insertOBJinFS(objfs, tree){ //tree[0].nodes.push(objfs); var parentPath: string = objfs.relativePath.slice(0, objfs.relativePath.lastIndexOf("/")); //se l'oggetto è figlio della radice lo colloco subito if(parentPath == tree[0].text){ tree[0].nodes.push(objfs); } else { //ricavo la profondità e posiziono l'oggetto var splitPath: string[] = parentPath.split("/"); var depth: number = splitPath.length; switch(depth){ case 2: var partialParentPath: string = splitPath[0]+"/"+splitPath[1]; for (var i: number = 0; i < tree[0].nodes.length; i++){ if(partialParentPath == tree[0].nodes[i].relativePath){ tree[0].nodes[i].nodes.push(objfs); break; } } break; case 3: var partialParentPath: string = splitPath[0]+"/"+splitPath[1]; for (var i: number = 0; i < tree[0].nodes.length; i++){ if(partialParentPath == tree[0].nodes[i].relativePath){ partialParentPath = splitPath[0]+"/"+splitPath[1]+"/"+splitPath[2]; for (var j: number = 0; j < tree[0].nodes[i].nodes.length; j++){ if(partialParentPath == tree[0].nodes[i].nodes[j].relativePath){ tree[0].nodes[i].nodes[j].nodes.push(objfs); break; } } break; } } break; case 4: var partialParentPath: string = splitPath[0]+"/"+splitPath[1]; for (var i: number = 0; i < tree[0].nodes.length; i++){ if(partialParentPath == tree[0].nodes[i].relativePath){ partialParentPath = splitPath[0]+"/"+splitPath[1]+"/"+splitPath[2]; for (var j: number = 0; j < tree[0].nodes[i].nodes.length; j++){ if(partialParentPath == tree[0].nodes[i].nodes[j].relativePath){ partialParentPath = splitPath[0]+"/"+splitPath[1]+"/"+splitPath[2]+"/"+splitPath[3]; for (var k: number = 0; k < tree[0].nodes[i].nodes[j].nodes.length; k++){ if(partialParentPath == tree[0].nodes[i].nodes[j].nodes[k].relativePath){ tree[0].nodes[i].nodes[j].nodes[k].nodes.push(objfs); break; } } break; } } break; } } break; case 5: var partialParentPath: string = splitPath[0]+"/"+splitPath[1]; for (var i: number = 0; i < tree[0].nodes.length; i++){ if(partialParentPath == tree[0].nodes[i].relativePath){ partialParentPath = splitPath[0]+"/"+splitPath[1]+"/"+splitPath[2]; for (var j: number = 0; j < tree[0].nodes[i].nodes.length; j++){ if(partialParentPath == tree[0].nodes[i].nodes[j].relativePath){ partialParentPath = splitPath[0]+"/"+splitPath[1]+"/"+splitPath[2]+"/"+splitPath[3]; for (var k: number = 0; k < tree[0].nodes[i].nodes[j].nodes.length; k++){ if(partialParentPath == tree[0].nodes[i].nodes[j].nodes[k].relativePath){ partialParentPath = splitPath[0]+"/"+splitPath[1]+"/"+splitPath[2]+"/"+splitPath[3]+"/"+splitPath[4]; for (var l: number = 0; l < tree[0].nodes[i].nodes[j].nodes[k].nodes.length; l++){ if(partialParentPath == tree[0].nodes[i].nodes[j].nodes[k].nodes[l].relativePath){ tree[0].nodes[i].nodes[j].nodes[k].nodes[l].nodes.push(objfs); break; } } break; } } break; } } break; } } break; } } } //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){ console.log("Try to open " + url.slice(url.lastIndexOf("/")+1, url.length)); url = "https://baltig.infn.it/api/v4/projects/819/repository/files/" + encodeURIComponent(url) + "?ref=master"; var jsonContentFile: any = new XMLHttpRequest(); jsonContentFile.open("GET", url, false); jsonContentFile.onreadystatechange = function(){ if(jsonContentFile.readyState === 4){ if(jsonContentFile.status === 200){ var jsonResponse: string = jsonContentFile.responseText; var startPoint: number = jsonResponse.indexOf("content") + 10; var endPoint: number = jsonResponse.indexOf("\", :ref"); readData(atob(jsonResponse.slice(startPoint, endPoint))); } } } jsonContentFile.send(null); }