make NavEntry, NavDir, and NavFile classes, and global NavWindow class to display contents of /

This commit is contained in:
joshuaboud 2021-05-21 13:15:42 -03:00
parent a7972b9059
commit 2a70b36d68
No known key found for this signature in database
GPG Key ID: 17EFB59E2A8BF50E
3 changed files with 127 additions and 277 deletions

View File

@ -53,7 +53,7 @@
overflow: auto;
}
.item {
.nav-item {
margin: 0.5em;
flex: 0;
display: flex;
@ -62,13 +62,37 @@
cursor: pointer;
}
.item .icon {
.nav-item .nav-item-title {
text-align: center;
overflow-wrap: anywhere;
}
.nav-item .nav-dir-icon {
background-color: #212427;
border: 1px solid #3c3f42;
width: 3em;
width: 5em;
height: 4em;
}
.nav-item .nav-file-icon {
position: relative;
background-color: #212427;
width: 5em;
height: 4em;
}
.nav-item .nav-file-icon:before {
content: "";
position: absolute;
top: 0;
right: 0;
border-width: 0 16px 16px 0;
border-style: solid;
border-color: #3c3f42 #151515;
display: block;
width: 0;
}
.info-column {
background-color: #212427;
flex-basis: 0;

View File

@ -39,281 +39,9 @@
</div>
<div class="vertical-spacer"></div>
<div class="flex-row inner-container">
<div class="contents-view">
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
<div class="item">
<div class="icon"></div>
<div class="item-name">
test
</div>
</div>
</div>
<div class="contents-view" id="nav-contents-view"></div>
<div class="horizontal-spacer"></div>
<div class="info-column">
</div>
<div class="info-column"></div>
</div>
</div>
</body>

View File

@ -1 +1,99 @@
class NavEntry {
constructor(/*string or array*/ path) {
if(typeof path == 'string')
this.path = path.split('/').splice(1);
else
this.path = path;
this.dom_element = document.createElement("div");
this.dom_element.classList.add("nav-item");
let icon = this.dom_element.nav_item_icon = document.createElement("div");
let title = this.dom_element.nav_item_title = document.createElement("div");
title.classList.add("nav-item-title");
title.innerText = this.filename();
this.dom_element.appendChild(icon);
this.dom_element.appendChild(title);
}
destroy() {
while(this.dom_element.firstChild){
this.dom_element.removeChild(this.dom_element.firstChild);
}
if(this.dom_element.parentElement)
this.dom_element.parentElement.removeChild(this.dom_element);
}
filename() {
return this.path[this.path.length -1];
}
path_str() {
return "/" + this.path.join('/');
}
show() {
document.getElementById("nav-contents-view").appendChild(this.dom_element);
}
}
class NavFile extends NavEntry {
constructor(/*string or array*/ path) {
super(path);
this.dom_element.nav_item_icon.classList.add("nav-file-icon");
}
}
class NavDir extends NavEntry {
constructor(/*string or array*/ path) {
super(path);
this.dom_element.nav_item_icon.classList.add("nav-dir-icon");
}
async get_children() {
var children = [];
var data = await cockpit.spawn(["ls", "-lL", this.path_str()], {err:"out"});
var entries = data.split("\n");
entries = entries.splice(1, entries.length - 2);
entries.forEach(entry => {
var entry_array = entry.split(/\s+/);
var filename = entry_array[entry_array.length - 1];
if(entry[0] == 'd')
children.push(new NavDir([... this.path, filename]));
else
children.push(new NavFile([... this.path, filename]));
});
return children;
}
}
class NavWindow {
constructor() {
this.path_stack = [new NavDir("/")];
this.entries = [];
}
async refresh() {
while(this.entries.length){
var entry = this.entries.pop();
entry.destroy();
}
var files = await this.pwd().get_children();
files.forEach(file => {
file.show();
this.entries.push(file);
});
}
pwd() {
return this.path_stack[this.path_stack.length - 1];
}
}
var nav_window = new NavWindow();
async function main() {
nav_window.refresh();
}
main();
// setTimeout(function(){
// while(files.length){
// var file = files.pop();
// file.destroy();
// }
// }, 5000);