shelloid
Version:
Simple and secure Node.js web application server.
336 lines (319 loc) • 12.2 kB
JavaScript
/**
* Created by Harikrishnan on 4/6/14.
*/
var deviceDataSet = [];
function initNodesTab() {
if (isLoggedIn()) {
registerForm(addNodeForm());
setupAddNodeHandlers();
refreshNodesList();
pollForNewDeviceShares();
$("#addNodePanelBtn").tooltip({
'delay': {hide: 5000 }
});
}
else {
window.location = window.actualSite + "/?msgId=1";
}
}
function pollForNewDeviceShares() {
poll.addLongPollHandler("newShareStatus:" + getUser().id, -1, function (ch, res) {
var userId = (res.from == "db" ? res.refId : getUser().id);
var nodeId = (res.from == "db" ? res.params : res.nodeId);
if (!isThereInDataSet(deviceDataSet, "node" + nodeId)) {
doPost("/getDeviceInfo", {nodeId: nodeId}, function (resp) {
if (resp.status == 200) {
if (!isThereInDataSet(deviceDataSet, "node" + nodeId)) {
deviceDataSet.push(getNewNodeRow(nodeId, resp.info.name, resp.info.device_key, resp.info.secret, resp.info.type, resp.info.disabled, resp.info.owner_id, resp.info.status));
showDeviceDataTable();
updateNodeList();
}
else{
//console.log("skipping...");
}
} else {
console.log(resp);
}
});
}
else{
//console.log("skipping...");
}
});
}
function pollForNodeStatus(id) {
poll.addLongPollHandler("nodeStatus:" + id, -1, function (ch, res) {
var nodeId = (res.from == "db" ? res.refId : res.nodeId);
var status = (res.from == "db" ? res.status : res.msg);
if (status == "U") {
//console.log("Device unshare status arrived for " + nodeId + ", so refreshing table");
doPost("/getDeviceInfo", {nodeId: nodeId}, function (resp) {
if (resp.status == 200) {
if (resp.info.owner_id != getUser().id){
removeDeviceFromTableAndRefresh(nodeId);
}
} else {
removeDeviceFromTableAndRefresh(nodeId);
}
updateNodeList();
});
}
else {
$("#nodeStatusPicture" + nodeId).attr("src", "images/" + ((status == "C") ? "online" : "offline") + ".png");
}
}, function (err) {
console.log("Error: ", err);
});
}
var addNodeForm = function () {
var form = {};
form.name = 'frmNode';
form.obj = $('#' + form.name);
form.validator = form.obj.validate();
form.addNodeBtn = function (e) {
e.preventDefault();
form.obj.validate();
if (form.validator.form()) {
var data = {
sNodeName: undefined,
sNodeKey: undefined,
sNodeSecret: undefined,
sNodeType: undefined,
addingNewNode: undefined,
editingNodeId: undefined
};
fillModel(form.obj, data);
addWaitingOverlay();
doPost("/addDevice", data, function (resp) {
removeWaitingOverlay();
if (resp.status == 200) {
if (data.addingNewNode == "true") {
deviceDataSet.push(getNewNodeRow(resp.insertId, data.sNodeName, data.sNodeKey, data.sNodeSecret, data.sNodeType, 0, getUser().id, 'D'));
}
else {
updateDataSet(deviceDataSet, "node" + data.editingNodeId, "1", data.sNodeName);
updateDataSet(deviceDataSet, "node" + data.editingNodeId, "2", data.sNodeKey);
updateDataSet(deviceDataSet, "node" + data.editingNodeId, "3", data.sNodeSecret);
updateDataSet(deviceDataSet, "node" + data.editingNodeId, "5", getType(data.sNodeType));
}
showDeviceDataTable();
updateNodeList();
}
else {
console.log(resp);
bootbox.alert("<b>An error has occurred while adding the device.</b><br/>" + (typeof resp.msg == "string" ? resp.msg : ""));
}
}, function (err) {
removeWaitingOverlay();
console.log(err);
bootbox.alert("Server Error: " + err.error);
});
$("#addingNewNode").val("true");
$("#editingNodeId").val("");
$("#sNodeName").val("");
$("#sNodeKey").val("");
$("#sNodeSecret").val("");
$("#addNodeCancelBtn").click();
}
else {
bootbox.alert('Please fix input errors and try again.');
}
};
return form;
};
function setupAddNodeHandlers() {
$("#addNodePanel").hide();
$("#addNodePanelBtn").click(function (e) {
e.preventDefault();
getNewDeviceSecret();
getNewDeviceKey();
$("#addNodePanel").show("fast");
$("#addNodePanelBtn").hide();
});
$("#addNodeCancelBtn").click(function (e) {
e.preventDefault();
$("#addNodePanel").hide("fast");
$("#addingNewNode").val("true");
$("#editingNodeId").val("");
$("#sNodeName").val("");
$("#sNodeKey").val("");
$("#sNodeSecret").val("");
$("#addNodePanelBtn").show();
});
$("#refreshDeviceSecretBtn").click(function (e) {
getNewDeviceSecret();
});
}
function getNewDeviceSecret() {
addWaitingOverlay();
doPost("/getNewDeviceSecret", {outerHeight: window.outerHeight}, function (resp) {
removeWaitingOverlay();
$("#sNodeSecret").val(resp.secret);
}, function (){
removeWaitingOverlay();
});
}
function getNewDeviceKey() {
addWaitingOverlay();
doPost("/getNewDeviceKey", {}, function (resp) {
removeWaitingOverlay();
$("#sNodeKey").val(resp.key);
}, function (){
removeWaitingOverlay();
});
}
function refreshNodesList() {
doPost("/listDevices", {disabled: true, showShares: true}, function (resp) {
if (resp.status == 200) {
deviceDataSet = [];
for (var i = 0; i < resp.list.length; i++) {
deviceDataSet.push(getNewNodeRow(resp.list[i].id, resp.list[i].name, resp.list[i].device_key, resp.list[i].secret, resp.list[i].type, resp.list[i].disabled, resp.list[i].owner_id, resp.list[i].status));
}
showDeviceDataTable();
$("[data-toggle='tooltip']").tooltip();
}
else {
bootbox.alert("<b>An error has occurred while listing the devices.</b><br/>" + (typeof resp.msg == "string" ? resp.msg : ""));
}
});
}
function showDeviceDataTable() {
$('#nodesListTbl').dataTable().fnDestroy();
$('#nodesListTbl').dataTable({
destroy: true,
data: deviceDataSet,
paging: false,
searching: true,
autoWidth: false,
"columns": [
{ "data": "1" },
{ "data": "2" },
{ "data": "3" },
{ "data": "4" },
{ "data": "5" },
{ "data": "6" },
{ "data": "7" }
],
fnCreatedRow: function (nRow, aData, iDataIndex) {
if (aData[8] == 1) {
$(nRow).addClass("disabled_row");
}
doPost("/getUserInfoById", {id: aData[4]}, function (resp) {
$(nRow).children().eq(3).text(resp.user.name);
});
}
});
}
function getNewNodeRow(id, name, node_key, secret, type, disabled, owner, status) {
var userId = getUser().id;
var actionTd = '<span class="glyphicon glyphicon-remove" onclick="deleteNode(' + id + ', ' + (owner == userId) + ')" data-toggle="tooltip" data-placement="top" title="Remove This ' + ((owner == userId) ? "Device" : "Share") + '"></span>';
if (owner == userId) {
actionTd += '<span class="glyphicon glyphicon-edit" onclick="editNode(' + id + ')" data-toggle="tooltip" data-placement="top" title="Edit this device"></span>';
}
var tr = {
DT_RowId: "node" + id,
"1": name,
"2": (node_key == undefined ? "---" : node_key),
"3": (secret == undefined ? "---" : secret),
"4": owner,
"5": getType(type),
"6": "<img src='images/" + (status == 'D' ? "offline" : "online") + ".png' id='nodeStatusPicture" + id + "'/>",
"7": actionTd,
"8": disabled
};
pollForNodeStatus(id);
return tr;
}
function getType(type) {
var typeStr;
switch (type) {
case "L":
{
typeStr = "Laptop";
break;
}
case "S":
{
typeStr = "Server";
break;
}
case "E":
{
typeStr = "Embedded";
break;
}
default:
{
typeStr = "Workstation";
break;
}
}
return typeStr;
}
function editNode(id) {
var node = $("#node" + id).children();
$("#addNodePanel").show("fast");
$("#addNodePanelBtn").hide();
$("#editingNodeId").val(id);
$("#sNodeName").val(node.eq(0).text());
$("#sNodeSecret").val(node.eq(2).text());
$("#sNodeType").find(":selected").text(node.eq(4).text());
$("#sNodeKey").val(node.eq(1).text());
$("#addingNewNode").val(false);
}
function deleteNode(id, ownNode) {
if (ownNode) {
bootbox.dialog({
message: 'If you want to delete the device, please type the word "delete" without double quotes in the below text box and click Delete <br/><br/><input type="text" class="form-control" id="removeDeviceConfirmTextBox"/>',
title: "Deleting your own device (" + getFromDataSet(deviceDataSet, "node" + id, "1" )+")",
buttons: {
success: {
label: "Cancel",
className: "btn-success",
},
danger: {
label: "Delete",
className: "btn-danger",
callback: function() {
if($("#removeDeviceConfirmTextBox").val() == "delete"){
var data = {nodeId: id};
doPost("/deleteDevice", data, function (resp) {
if (resp.status == 200) {
removeDeviceFromTableAndRefresh(id);
}
else if (resp.status == 201) {
bootbox.alert("Warning: " + resp.msg);
}
else {
bootbox.alert("Error: " + (typeof resp.msg == "string" ? resp.msg : "Can't delete device"));
}
}, function (err) {
bootbox.alert("Error: " + err);
});
} else {
bootbox.alert("You typed the wrong word.");
}
}
}
}
});
}
else {
deleteNodeShare("#node", getUser().id, id, false, function (){
removeDeviceFromTableAndRefresh(id);
});
}
}
function removeDeviceFromTableAndRefresh(id) {
removeFromDataset(deviceDataSet, "node" + id);
removeDeviceStatusPoll(id);
updateNodeList();
showDeviceDataTable();
}
function updateNodeList() {
updateNodeListInNodeShares();
updateNodeListInPortMappings();
}
function removeDeviceStatusPoll(id) {
poll.removeLongPollHandler("nodeStatus:" + id);
}