globular_admin
Version:
Administration panel for a Globular server.
240 lines (205 loc) • 8.96 kB
text/typescript
import { Panel } from "./panel";
import { GetAllPeersInfo, getAllActions, getErrorMessage, AppendActionToPeer, RemoveActionFromPeer, DeletePeer } from "./backend";
import * as M from "materialize-css";
import "materialize-css/sass/materialize.scss";
import { randomUUID } from "./utility";
/**
* This class is use to manage file on the server.
*/
export class PeerManager extends Panel {
private editable: boolean;
// File panel constructor.
constructor(id: string) {
super(id);
this.displayPeers()
}
// Here I will react to login information...
onlogin(data: any) {
// overide...
this.editable = true;
this.displayPeers()
}
onlogout() {
// overide...
this.editable = false;
this.displayPeers()
}
/**
* Display the Peer.
* @param content
* @param Peer
*/
displayPeer(content: any, Peer: any) {
// reset the interface.
content.removeAllChilds();
// The start and end time.
let startTime = new Date(Peer.creation_date * 1000)
let releasedTime = new Date(Peer.last_deployed * 1000)
let path: string = Peer.path
let url: string = window.location.protocol + "//" + window.location.hostname + ":" + window.location.port + path
content.appendElement({ tag: "div", class: "row" }).down()
.appendElement({ tag: "div", class: "col s2", innerHtml: "path" })
.appendElement({ tag: "div", class: "col s10", innerHtml: path }).up()
.appendElement({ tag: "div", class: "row" }).down()
.appendElement({ tag: "div", class: "col s2", innerHtml: "created the" })
.appendElement({ tag: "div", class: "col s10", innerHtml: startTime.toLocaleDateString() + " " + startTime.toLocaleTimeString() }).up()
.appendElement({ tag: "div", class: "row" }).down()
.appendElement({ tag: "div", class: "col s2", innerHtml: "released the" })
.appendElement({ tag: "div", class: "col s10", innerHtml: releasedTime.toLocaleDateString() + " " + releasedTime.toLocaleTimeString() }).up()
.appendElement({ tag: "div", class: "row" }).down()
.appendElement({ tag: "div", class: "col s2", innerHtml: "link" })
.appendElement({ tag: "a", class: "col s10", href: url, innerHtml: url }).up()
.appendElement({ tag: "div", class: "row" }).down()
.appendElement({ tag: "div", class: "col s2", innerHtml: "actions" })
.appendElement({ tag: "div", id: "actions_div", class: "col s10" }).down()
.appendElement({ tag: "div", class: "row" }).down()
.appendElement({ tag: "div", id: "actions_ul", class: "collection col s12" })
let actions_div = content.getChildById("actions_div")
let actions_ul = content.getChildById("actions_ul")
// append the actions list.
if (!this.editable) {
// Now the actions...
if (Peer.actions != undefined) {
for (var j = 0; j < Peer.actions.length; j++) {
actions_ul.appendElement({ tag: "li", class: "collection-item", innerHtml: Peer.actions[j] })
}
}
} else {
// Here I will append the actions list.
let action_input = actions_div.prependElement({ tag: "div", class: "row" }).down()
.appendElement({ tag: "div", class: "input-field col s12" }).down()
.appendElement({ tag: "input", id:randomUUID(), class: "autocomplete", placeholder: "New Action" }).down()
getAllActions(
(actions: any) => {
// console.log(actions)
let data: any;
data = {};
if (Peer.actions != undefined) {
for (var i = 0; i < actions.length; i++) {
if (Peer.actions.indexOf(actions[i]) == -1) {
data[actions[i]] = null
}
}
} else {
for (var i = 0; i < actions.length; i++) {
data[actions[i]] = null
}
}
// The action call on auto complete...
let onAutocomplete = () => {
let action = action_input.element.value;
let PeerId = Peer._id;
// save the action in the role.
AppendActionToPeer(
PeerId,
action,
() => {
M.toast({
html: "Action " + action + "has been added!",
displayLength: 2000
});
// re-init the display.
content.removeAllChilds()
if (Peer.actions == null) {
Peer.actions = []
}
Peer.actions.push(action)
this.displayPeer(content, Peer)
},
(err: any) => {
M.toast({ html: getErrorMessage(err.message), displayLength: 2000 });
}
);
}
M.Autocomplete.init(document.getElementById(action_input.element.id), { data: data, onAutocomplete: onAutocomplete })
},
(err: any) => {
M.toast({ html: getErrorMessage(err.message), displayLength: 2000 });
})
// Now the actions...
if (Peer.actions != undefined) {
for (var j = 0; j < Peer.actions.length; j++) {
let action = Peer.actions[j]
let deleteBtn = actions_ul.appendElement({ tag: "li", class: "collection-item" }).down()
.appendElement({ tag: "div", class: "row", style: "margin-bottom: 0px;" }).down()
.appendElement({ tag: "div", class: "col s11", innerHtml: action })
.appendElement({ tag: "i", class: "tiny material-icons col s1", innerHtml: "remove" }).down()
deleteBtn.element.onmouseenter = function(){
this.style.cursor = "pointer"
}
deleteBtn.element.onmouseleave = function(){
this.style.cursor = "default"
}
// Here I will remove the action from the Peer.
deleteBtn.element.onclick = () => {
RemoveActionFromPeer(Peer._id, action,
() => {
M.toast({
html: "Action " + action + "has been remove!",
displayLength: 2000
});
// remove the action from the actions list
Peer.actions.splice( Peer.actions.indexOf(action),1);
// refresh the panel.
this.displayPeer(content, Peer)
},
(err: any) => {
M.toast({ html: getErrorMessage(err.message), displayLength: 2000 });
})
}
}
}
}
}
refresh(){
this.displayPeers()
}
displayPeers() {
// clear the panel before recreate information inside it.
this.div.removeAllChilds()
GetAllPeersInfo("", (Peers: Array<any>) => {
if(document.getElementById("peers_content_div") != undefined){
return
}
// Here I will get the list of all Peers.
let ul = this.div
.appendElement({ tag: "div", class: "row", id:"peers_content_div" }).down()
.appendElement({ tag: "div", class: "col s12 /*m10 offset-m1*/" }).down()
.appendElement({ tag: "ul", class: "collapsible" }).down()
for (var i = 0; i < Peers.length; i++) {
let li = ul.appendElement({ tag: "li" }).down()
let header = li.appendElement({ tag: "div", class: "collapsible-header" }).down()
let content = li.appendElement({ tag: "div", class: "collapsible-body" }).down()
let Peer = Peers[i]
if (this.editable) {
// Here I will display button to edit Peers...
// The delete icon.
// the Peer header.
header.appendElement({ tag: "span", class: "col s11", innerHtml: Peer._id })
let deleteBtn = header.appendElement({ tag: "i", class: "material-icons col s1", innerHtml: "delete" }).down()
// Now the remove Peer action.
deleteBtn.element.onclick = ()=>{
DeletePeer(Peer._id,
()=>{
M.toast({ html: "Peer " + Peer._id + " have been removed!", displayLength: 2000 });
// refresh the interface.
this.displayPeers()
},
(err: any) => {
M.toast({ html: getErrorMessage(err.message), displayLength: 2000 });
})
}
} else {
header.appendElement({ tag: "span", class: "col s12", innerHtml: Peer._id })
}
// Display the Peer.
this.displayPeer(content, Peer)
}
// init all collapsible panels...
M.Collapsible.init(ul.element)
},
(err: any) => {
M.toast({ html: getErrorMessage(err.message), displayLength: 2000 });
});
}
}