@@ -54,10 +56,10 @@
-
+
-
-
+
+
diff --git a/Frontend/static/css/dropdown.css b/Frontend/static/css/dropdown.css
index a937853..b83d8c7 100644
--- a/Frontend/static/css/dropdown.css
+++ b/Frontend/static/css/dropdown.css
@@ -1,6 +1,6 @@
-#context_menu {
+#context_menu {
display: none;
- z-index:100000;
+ z-index: 100000;
position: absolute;
background-color: rgb(229, 229, 229);
border-width: 1px;
@@ -10,10 +10,11 @@
width: 12em;
font-size: 12px;
overflow: hidden;
- white-space:nowrap;
+ white-space: nowrap;
list-style: none;
margin: 0;
}
+
#context_menu button {
display: block;
padding: 5px;
@@ -24,11 +25,13 @@
text-align: left;
color: #333;
}
+
#context_menu button:hover {
background-color: #DDD;
cursor: pointer;
color: #000;
}
+
#context_menu button > span {
display: inline;
position: absolute;
diff --git a/Frontend/static/css/popup.css b/Frontend/static/css/popup.css
index 3595ab6..189b657 100644
--- a/Frontend/static/css/popup.css
+++ b/Frontend/static/css/popup.css
@@ -8,7 +8,7 @@
width: 100%;
height: 100%;
overflow: auto;
- background-color: rgba(0,0,0, 0.8);
+ background-color: rgba(0, 0, 0, 0.8);
}
#content {
diff --git a/Frontend/static/js/callbacks.js b/Frontend/static/js/callbacks.js
index 4a4c4b0..8c8800b 100644
--- a/Frontend/static/js/callbacks.js
+++ b/Frontend/static/js/callbacks.js
@@ -1,3 +1,12 @@
+function logout_callback(response, code) {
+ if (code === 200) {
+ sessionStorage.removeItem('authorization');
+ location.reload();
+ } else {
+ create_error_view(response['error'] + `
Return to root directory`);
+ }
+}
+
function remove_callback(response, code) {
if (code === 200) {
create_success_view("Successfully deleted.");
diff --git a/Frontend/static/js/generate_directory_tree.js b/Frontend/static/js/generate_directory_tree.js
new file mode 100644
index 0000000..2f9221d
--- /dev/null
+++ b/Frontend/static/js/generate_directory_tree.js
@@ -0,0 +1,85 @@
+let tree = {};
+
+function create_tree_data(curr_dir) {
+ let url = base_url + curr_dir;
+
+ const xmlHttp = new XMLHttpRequest();
+ xmlHttp.onreadystatechange = function () {
+ if (this.readyState === 4) {
+ if (xmlHttp.status === 200) {
+ let data = JSON.parse(xmlHttp.responseText);
+
+ for (let i = 0; i < data.length; i++) {
+ if (data[i]['Type'] === 'dir') {
+ file_path.push(curr_dir + '/' + data[i]['Name']);
+ create_tree_data(curr_dir + '/' + data[i]['Name']);
+ }
+ }
+
+ tree = file_path.reduce((arr, path) => addPath(path.split('/'), arr), [])[0]['children'];
+ create_tree_view();
+ }
+ }
+ }
+
+ xmlHttp.open("GET", url, true);
+ xmlHttp.setRequestHeader('Authorization', 'Basic ' + sessionStorage.getItem('authorization'));
+ xmlHttp.send(null);
+}
+
+function create_tree_view() {
+ let html_tree = document.createElement('div');
+ html_tree.innerHTML = `
`;
+
+ document.getElementById("tree").innerHTML = '';
+ create_list_view(tree, document.getElementById("tree"), '');
+
+ // Remove nested-class from root element
+ document.getElementsByTagName('ul')[0].classList.remove('nested')
+
+ let icon = document.getElementsByClassName("folder");
+ for (let i = 0; i < icon.length; i++) {
+ icon[i].addEventListener("click", function () {
+ if (this.parentElement.querySelector(".nested") !== null) {
+ this.parentElement.querySelector(".nested").classList.toggle("active");
+ }
+ this.classList.toggle("folder-open");
+ });
+ }
+}
+
+function tree_onclick(url) {
+ window.history.pushState('index', 'Filemanager', 'index.html?path=' + url);
+ url_changed();
+}
+
+function create_list_view(dataRoot, elementRoot, url) {
+ if (dataRoot) {
+ const list = document.createElement('ul');
+ list.classList.add('nested');
+ elementRoot.appendChild(list);
+
+ Object.keys(dataRoot).forEach(key => {
+ // // Create a text node and a list element to put it in
+ const listElement = document.createElement('li');
+ listElement.innerHTML = `
${dataRoot[key].text}`;
+ list.appendChild(listElement);
+
+ // Continue recursively down now using the current list element
+ create_list_view(dataRoot[key]['children'], listElement, url + '/' + dataRoot[key].text);
+ });
+ }
+}
+
+function addPath(pathcomponents, arr) {
+ let component = pathcomponents.shift()
+ let comp = arr.find(item => item.text === component)
+ if (!comp) {
+ comp = {text: component}
+ arr.push(comp)
+ }
+ if (pathcomponents.length) {
+ addPath(pathcomponents, comp.children || (comp.children = []))
+ }
+ return arr
+}
\ No newline at end of file
diff --git a/Frontend/static/js/index.js b/Frontend/static/js/index.js
index 94bdbaf..b8657cf 100644
--- a/Frontend/static/js/index.js
+++ b/Frontend/static/js/index.js
@@ -1,13 +1,12 @@
base_url = 'http://localhost:8080'; //'http://192.168.178.98:8080';
file_path = [];
-tree = {};
window.addEventListener('load', function () {
if (sessionStorage.getItem("authorization") !== null) {
console.log('Logged in');
create_base_view();
create_logout_view();
- // create_tree_view_data('');
+ create_tree_data('');
url_changed();
} else {
console.log('Not logged in');
@@ -46,10 +45,12 @@ function login() {
create_base_view();
create_logout_view();
- // create_tree_view_data('');
+ create_tree_data('');
url_changed();
- } else {
+ } else if (xmlHttp.status === 401) {
create_error_view("Wrong username or password!");
+ } else {
+ create_error_view("Unknown error!");
}
}
}
@@ -69,8 +70,12 @@ function show_files(response, code) {
create_error_view(`Your session is expired.
Log in again`);
} else {
// Error
- response = JSON.parse(response);
- create_error_view(response['error'] + `
Return to root directory`);
+ try {
+ response = JSON.parse(response);
+ create_error_view(response['error'] + `
Return to root directory`);
+ } catch (e) {
+ create_error_view(`Unrecoverable error!
Return to root directory`);
+ }
}
}
diff --git a/Frontend/static/js/tools.js b/Frontend/static/js/tools.js
index 1068545..13a85f6 100644
--- a/Frontend/static/js/tools.js
+++ b/Frontend/static/js/tools.js
@@ -62,20 +62,6 @@ function httpDeleteAsync(url, data, callback) {
xmlHttp.send();
}
-function httpPutAsync(url, data, callback) {
- const xmlHttp = new XMLHttpRequest();
- xmlHttp.onreadystatechange = function () {
- if (this.readyState === 4) {
- callback(xmlHttp.responseText, xmlHttp.status);
- }
- }
-
- xmlHttp.open("PUT", url, true);
- xmlHttp.setRequestHeader('Authorization', 'Basic ' + sessionStorage.getItem('authorization'));
- xmlHttp.setRequestHeader('Content-Type', 'application/json');
- xmlHttp.send(JSON.stringify(data));
-}
-
function findGetParameter(parameterName) {
let result = null,
tmp = [];
diff --git a/Frontend/static/js/views.js b/Frontend/static/js/views.js
index 587f5c2..57e3273 100644
--- a/Frontend/static/js/views.js
+++ b/Frontend/static/js/views.js
@@ -34,97 +34,11 @@ function create_logout_view() {
logout.classList.add('logout');
logout.innerText = 'Logout';
logout.onclick = function () {
- sessionStorage.removeItem('authorization');
- location.reload();
+ httpGetAsync(base_url + '/logout', null, logout_callback);
}
document.getElementsByClassName('app-header')[0].appendChild(logout);
}
-//
-// function create_tree_view_data(curr_dir) {
-// let url = base_url + curr_dir;
-//
-// const xmlHttp = new XMLHttpRequest();
-// xmlHttp.onreadystatechange = function () {
-// if (this.readyState === 4) {
-// if (xmlHttp.status === 200) {
-// let data = JSON.parse(xmlHttp.responseText);
-//
-// for (let i = 0; i < data.length; i++) {
-// if (data[i]['Type'] === 'dir') {
-// file_path.push(curr_dir + '/' + data[i]['Name']);
-// create_tree_view_data(curr_dir + '/' + data[i]['Name']);
-// }
-// }
-//
-// tree = file_path.reduce((arr, path) => addPath(path.split('/'), arr), [])[0]['children'];
-// create_tree_view();
-// }
-// }
-// }
-//
-// xmlHttp.open("GET", url, true);
-// xmlHttp.setRequestHeader('Authorization', 'Basic ' + sessionStorage.getItem('authorization'));
-// xmlHttp.send(null);
-// }
-//
-// function addPath(pathcomponents, arr) {
-// let component = pathcomponents.shift()
-// let comp = arr.find(item => item.text === component)
-// if (!comp) {
-// comp = {text: component}
-// arr.push(comp)
-// }
-// if (pathcomponents.length) {
-// addPath(pathcomponents, comp.children || (comp.children = []))
-// }
-// return arr
-// }
-//
-// function create_tree_view() {
-// let tree = document.createElement('div');
-// tree.innerHTML = `
`;
-//
-// document.getElementById("tree").innerHTML = '';
-// create_list_view(this.tree, document.getElementById("tree"), '');
-//
-// // Remove nested-class from root element
-// document.getElementsByTagName('ul')[0].classList.remove('nested')
-//
-// let toggler = document.getElementsByClassName("folder");
-// for (let i = 0; i < toggler.length; i++) {
-// toggler[i].addEventListener("click", function () {
-// if (this.parentElement.querySelector(".nested") !== null) {
-// this.parentElement.querySelector(".nested").classList.toggle("active");
-// }
-// this.classList.toggle("folder-open");
-// });
-// }
-// }
-//
-// function tree_onclick(url) {
-// window.history.pushState('index', 'Filemanager', 'index.html?path=' + url);
-// url_changed();
-// }
-//
-// function create_list_view(dataRoot, elementRoot, url) {
-// if (dataRoot) {
-// const list = document.createElement('ul');
-// list.classList.add('nested');
-// elementRoot.appendChild(list);
-//
-// Object.keys(dataRoot).forEach(key => {
-// // // Create a text node and a list element to put it in
-// const listElement = document.createElement('li');
-// listElement.innerHTML = `
${dataRoot[key].text}`;
-// list.appendChild(listElement);
-//
-// // Continue recursively down now using the current list element
-// create_list_view(dataRoot[key]['children'], listElement, url + '/' + dataRoot[key].text);
-// });
-// }
-// }
-
function create_main_view(data) {
let curr_dir = get_path();