mirror of
https://github.com/45Drives/cockpit-navigator.git
synced 2025-07-30 00:55:30 +02:00
implement changing directory
This commit is contained in:
parent
f9a0ec952d
commit
4c18ddd76a
@ -36,54 +36,82 @@ class NavEntry {
|
|||||||
class NavFile extends NavEntry {
|
class NavFile extends NavEntry {
|
||||||
constructor(/*string or array*/ path) {
|
constructor(/*string or array*/ path) {
|
||||||
super(path);
|
super(path);
|
||||||
|
this.nav_type = "file";
|
||||||
this.dom_element.nav_item_icon.classList.add("nav-file-icon");
|
this.dom_element.nav_item_icon.classList.add("nav-file-icon");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class NavDir extends NavEntry {
|
class NavDir extends NavEntry {
|
||||||
constructor(/*string or array*/ path) {
|
constructor(/*string or array*/ path, nav_window_ref) {
|
||||||
super(path);
|
super(path);
|
||||||
|
this.nav_type = "dir";
|
||||||
this.dom_element.nav_item_icon.classList.add("nav-dir-icon");
|
this.dom_element.nav_item_icon.classList.add("nav-dir-icon");
|
||||||
|
this.nav_window_ref = nav_window_ref;
|
||||||
|
this.dom_element.nav_item_icon.addEventListener("click", this)
|
||||||
}
|
}
|
||||||
async get_children() {
|
handleEvent(e) {
|
||||||
|
switch(e.type){
|
||||||
|
case "click":
|
||||||
|
this.nav_window_ref.cd(this);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
async get_children(nav_window_ref) {
|
||||||
var children = [];
|
var children = [];
|
||||||
var data = await cockpit.spawn(["ls", "-lL", this.path_str()], {err:"out"});
|
var data = await cockpit.spawn(["/usr/share/cockpit/navigator/scripts/ls-no-fail.sh", this.path_str()], {err:"ignore"});
|
||||||
var entries = data.split("\n");
|
var entries = data.split("\n");
|
||||||
entries = entries.splice(1, entries.length - 2);
|
entries = entries.splice(1, entries.length - 2);
|
||||||
entries.forEach(entry => {
|
entries.forEach(entry => {
|
||||||
var entry_array = entry.split(/\s+/);
|
var entry_array = entry.split(/\s+/);
|
||||||
var filename = entry_array[entry_array.length - 1];
|
var filename = entry_array[entry_array.length - 1];
|
||||||
|
var path = (this.path.length >= 1 && this.path[0]) ? [... this.path, filename] : [filename];
|
||||||
if(entry[0] == 'd')
|
if(entry[0] == 'd')
|
||||||
children.push(new NavDir([... this.path, filename]));
|
children.push(new NavDir(path, nav_window_ref));
|
||||||
else
|
else
|
||||||
children.push(new NavFile([... this.path, filename]));
|
children.push(new NavFile(path));
|
||||||
});
|
});
|
||||||
|
children.sort((first, second) => {
|
||||||
|
if(first.nav_type === second.nav_type)
|
||||||
|
return 0;
|
||||||
|
if(first.nav_type == "dir")
|
||||||
|
return -1;
|
||||||
|
return 1;
|
||||||
|
})
|
||||||
return children;
|
return children;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class NavWindow {
|
class NavWindow {
|
||||||
constructor() {
|
constructor() {
|
||||||
this.path_stack = [new NavDir("/")];
|
this.path_stack = [new NavDir("/", this)];
|
||||||
this.entries = [];
|
this.entries = [];
|
||||||
}
|
}
|
||||||
async refresh() {
|
async refresh() {
|
||||||
|
var files = await this.pwd().get_children(this);
|
||||||
while(this.entries.length){
|
while(this.entries.length){
|
||||||
var entry = this.entries.pop();
|
var entry = this.entries.pop();
|
||||||
entry.destroy();
|
entry.destroy();
|
||||||
}
|
}
|
||||||
var files = await this.pwd().get_children();
|
|
||||||
files.forEach(file => {
|
files.forEach(file => {
|
||||||
file.show();
|
file.show();
|
||||||
this.entries.push(file);
|
this.entries.push(file);
|
||||||
});
|
});
|
||||||
|
document.getElementById("pwd").innerText = this.pwd().path_str();
|
||||||
}
|
}
|
||||||
pwd() {
|
pwd() {
|
||||||
return this.path_stack[this.path_stack.length - 1];
|
return this.path_stack[this.path_stack.length - 1];
|
||||||
}
|
}
|
||||||
|
cd(new_dir) {
|
||||||
|
this.path_stack.push(new_dir);
|
||||||
|
this.refresh().catch(() => {
|
||||||
|
this.path_stack.pop();
|
||||||
|
this.refresh();
|
||||||
|
window.alert(new_dir.path_str() + " is inaccessible.");
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var nav_window = new NavWindow();
|
let nav_window = new NavWindow();
|
||||||
|
|
||||||
async function main() {
|
async function main() {
|
||||||
nav_window.refresh();
|
nav_window.refresh();
|
||||||
|
Loading…
x
Reference in New Issue
Block a user