2021-06-15 13:43:19 +00:00
|
|
|
|
var createProject = function () {
|
|
|
|
|
var body = "<div class='input-group mb-3'>";
|
|
|
|
|
body += "<div class='input-group-prepend'> <span class='input-group-text'>Project Name</span> </div>";
|
|
|
|
|
body += "<input type='text' id='newProjectNameInput' class='form-control' placeholder='Required'>";
|
|
|
|
|
body += "</div>";
|
|
|
|
|
|
|
|
|
|
body += "<div class='input-group mb-3'>";
|
|
|
|
|
body += "<div class='input-group-prepend'> <span class='input-group-text'>Project Template</span> </div>";
|
2021-06-15 11:56:39 +00:00
|
|
|
|
body += "<select class='custom-select ' id='selectProjectTemplate' aria-label='Example select with button addon' style='appearance: none'> <option selected>Empty Project</option> <option>Data Sharing Project</option> </select>";
|
2021-06-15 13:43:19 +00:00
|
|
|
|
body += "</div>";
|
2021-06-15 11:56:39 +00:00
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
body += "<div class='input-group mb-3'>";
|
|
|
|
|
body += "<div class='input-group-prepend'> <span class='input-group-text'>Project DOI</span> </div>";
|
|
|
|
|
body += "<input type='text' id='newProjectDOIInput' class='form-control' placeholder='Optional,A registered project DOI'>";
|
|
|
|
|
body += "</div>";
|
2021-06-15 11:56:39 +00:00
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
$("#dialogBodyDiv").html(body);
|
|
|
|
|
showDialog("Create New Project", sendCreateProject);
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var sendCreateProject = function () {
|
|
|
|
|
var projectName = $("#newProjectNameInput")[0].value;
|
|
|
|
|
if (projectName == undefined || projectName.length == 0) {
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
myToast("Create Failed", "Please input the project name.");
|
|
|
|
|
}, 1000);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var projectTemplate = $("#selectProjectTemplate")[0].value;
|
2021-06-15 11:56:39 +00:00
|
|
|
|
if (projectTemplate == undefined || projectName.length == 0) {
|
2021-06-15 13:43:19 +00:00
|
|
|
|
setTimeout(function () {
|
2021-06-15 11:56:39 +00:00
|
|
|
|
myToast("Create Failed", "Please select the project template.");
|
|
|
|
|
}, 1000);
|
|
|
|
|
return;
|
|
|
|
|
}
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var projectDOI = $("#newProjectDOIInput")[0].value;
|
|
|
|
|
// console.log("[sendCreateProject] projectName:" + projectName + ", projectTemplate:" + projectTemplate + ", projectDOI:" + projectDOI);
|
2021-06-15 11:56:39 +00:00
|
|
|
|
|
|
|
|
|
var arg = {};
|
|
|
|
|
var privateTab = $("#privateprojecttab").hasClass("active");
|
|
|
|
|
if (privateTab)
|
|
|
|
|
arg.isPrivate = true;
|
|
|
|
|
else
|
|
|
|
|
arg.isPrivate = false;
|
|
|
|
|
arg.dir = "./";
|
|
|
|
|
arg.action = "createFile";
|
|
|
|
|
arg.isFolder = true;
|
|
|
|
|
arg.name = projectName;
|
|
|
|
|
arg.projectTemplate = projectTemplate;
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
if (arg.dir.indexOf("..") != -1) {
|
|
|
|
|
console.log(arg.dir);
|
|
|
|
|
myToast("项目名称不符合规范!", "请勿包含 . .. / \\");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
if (arg.name.indexOf(".") != -1 || arg.name.indexOf("..") != -1 || arg.name.indexOf("/") != -1 || arg.name.indexOf("\\") != -1) {
|
|
|
|
|
console.log(arg.name);
|
|
|
|
|
myToast("项目名称不符合规范!", "请勿包含 . .. / \\");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2021-06-15 11:56:39 +00:00
|
|
|
|
|
|
|
|
|
if (!(projectDOI == undefined || projectDOI.length == 0))
|
|
|
|
|
arg.projectDOI = projectDOI;
|
|
|
|
|
global.filewssocket.send(JSON.stringify(arg));
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var listFiles = function () {
|
|
|
|
|
global.wssocket.send("{\"action\":\"listProjects\",\"isPrivate\":false}");
|
|
|
|
|
global.wssocket.send("{\"action\":\"listProjects\",\"isPrivate\":true}");
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var updateGlobalProject = function () {
|
|
|
|
|
setTimeout(updateGlobalProjectInternal, 100);
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var updateGlobalProjectInternal = function () {
|
|
|
|
|
var isPublic = $("#publicprojecttab").hasClass("active");
|
|
|
|
|
// console.log("updateGlobalProject, isPublic:" + isPublic);
|
|
|
|
|
if (isPublic)
|
|
|
|
|
global.projects = global.publicProjects;
|
|
|
|
|
else
|
|
|
|
|
global.projects = global.privateProjects;
|
|
|
|
|
mainVue.projects = global.projects;
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
// ==========WSHandler callbacks=========
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var onListProjects = function (obj) {
|
|
|
|
|
global.filewssocket = global.wssocket;
|
|
|
|
|
var data = JSON.parse(obj.data);
|
|
|
|
|
var projectDiv = "publicprojectAccordion";
|
|
|
|
|
var publicTab = $("#publicprojecttab").hasClass("active");
|
|
|
|
|
var pad = "";
|
|
|
|
|
if (obj.isPrivate != undefined && obj.isPrivate) {
|
|
|
|
|
pad = "_p";
|
|
|
|
|
global.privateProjects = data;
|
|
|
|
|
projectDiv = "privateprojectAccordion";
|
|
|
|
|
if (!publicTab)
|
|
|
|
|
global.projects = data;
|
|
|
|
|
global.privateProjects = data;
|
|
|
|
|
} else {
|
|
|
|
|
if (publicTab) {
|
|
|
|
|
global.projects = data;
|
|
|
|
|
}
|
|
|
|
|
global.publicProjects = data;
|
|
|
|
|
}
|
|
|
|
|
mainVue.projects = global.projects;
|
|
|
|
|
var html = "";
|
|
|
|
|
for (var i = 0; i < data.length; i++) {
|
|
|
|
|
var dataContent = data[i];
|
|
|
|
|
if (dataContent.length > 40) {
|
|
|
|
|
dataContent = dataContent.substr(0, 40) + "..."
|
|
|
|
|
}
|
|
|
|
|
html += getProjectLineHtml(i, dataContent, projectDiv, obj.isPrivate);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$("#" + projectDiv).html(html);
|
|
|
|
|
|
|
|
|
|
$.contextMenu({
|
|
|
|
|
selector: '#' + projectDiv + '> .headingDiv',
|
|
|
|
|
zIndex: 10,
|
|
|
|
|
callback: function (key, options) {
|
|
|
|
|
var projectID = this[0].id.replace("headingDiv", "").replace("_p",
|
|
|
|
|
"");
|
|
|
|
|
var projectName = global.projects[projectID];
|
|
|
|
|
global.projectName = projectName;
|
|
|
|
|
if (key == "Rename") {
|
|
|
|
|
showRename(projectName);
|
|
|
|
|
} else if (key == "Delete") {
|
|
|
|
|
showDelete(projectName);
|
|
|
|
|
} else if (key == "Export") {
|
|
|
|
|
downloadContract(projectName);
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
items: {
|
|
|
|
|
"Export": {
|
|
|
|
|
name: "Download Project",
|
|
|
|
|
icon: "copy"
|
|
|
|
|
},
|
|
|
|
|
"Rename": {
|
|
|
|
|
name: "Rename Project",
|
|
|
|
|
icon: "edit"
|
|
|
|
|
},
|
|
|
|
|
"Delete": {
|
|
|
|
|
name: "Delete Project",
|
|
|
|
|
icon: "delete"
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
});
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var onListProject = function (obj) {
|
|
|
|
|
var pad = "";
|
|
|
|
|
if (obj.isPrivate != undefined && obj.isPrivate) {
|
|
|
|
|
pad = "_p";
|
|
|
|
|
}
|
|
|
|
|
var data = JSON.parse(obj.data);
|
|
|
|
|
var title = global.projects[global.lastClickedProjectId];
|
|
|
|
|
if (!data.isDir) {
|
|
|
|
|
console.log("TODO dipslay fileContent");
|
|
|
|
|
} else {
|
|
|
|
|
var listDiv = $("#collapseDiv" + global.lastClickedProjectId + pad);
|
|
|
|
|
listDiv.html(getProjectTreeHtml2(data, "projectTreeUl", "/" + title
|
|
|
|
|
+ "/", 24, global.lastClickedProjectId + pad));
|
|
|
|
|
$.contextMenu({
|
|
|
|
|
selector: '.fileLine',
|
|
|
|
|
zIndex: 10,
|
|
|
|
|
callback: function (key, options) {
|
|
|
|
|
// console.log(this);
|
|
|
|
|
// console.log(key);
|
|
|
|
|
// console.log(this[0]);
|
|
|
|
|
var projectName = this[0].parentElement.onclick + "";
|
|
|
|
|
projectName = projectName.split("\n")[1];
|
|
|
|
|
projectName = projectName.replace(/^[^"]*"/g, "").replace(
|
|
|
|
|
/".*$/g, "");
|
|
|
|
|
global.projectName = projectName;
|
|
|
|
|
if (key == "Rename") {
|
|
|
|
|
showRename(projectName);
|
|
|
|
|
} else if (key == "Delete") {
|
|
|
|
|
showDelete(projectName);
|
|
|
|
|
} else if (key == "Create File") {
|
|
|
|
|
showCreateFile(projectName, false);
|
|
|
|
|
} else if (key == "Create Folder") {
|
|
|
|
|
showCreateFile(projectName, true);
|
|
|
|
|
} else if (key == "Upload File") {
|
|
|
|
|
global.lastClickProjectName = projectName;
|
|
|
|
|
$("#uploadFileInput").click();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
},
|
|
|
|
|
items: {
|
|
|
|
|
"New": {
|
|
|
|
|
name: "New",
|
|
|
|
|
icon: "add",
|
|
|
|
|
items: {
|
|
|
|
|
"Create File": {
|
|
|
|
|
name: "File",
|
|
|
|
|
icon: "copy"
|
|
|
|
|
},
|
|
|
|
|
"Create Folder": {
|
|
|
|
|
name: "Folder",
|
|
|
|
|
icon: "paste"
|
|
|
|
|
},
|
|
|
|
|
"Upload File": {
|
|
|
|
|
name: "Upload File",
|
|
|
|
|
icon: "loading"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
},
|
|
|
|
|
"Rename": {
|
|
|
|
|
name: "Rename",
|
|
|
|
|
icon: "edit"
|
|
|
|
|
},
|
|
|
|
|
"Delete": {
|
|
|
|
|
name: "Delete",
|
|
|
|
|
icon: "delete"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
2021-06-15 11:56:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ==========WSHandler done=====================
|
|
|
|
|
|
|
|
|
|
// projectbutton callbacks======================
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var getProjectLineHtml = function (i, dataContent, dataParent, isPrivate) {
|
|
|
|
|
var ret = "";
|
|
|
|
|
var pad = "";
|
|
|
|
|
if (isPrivate) {
|
|
|
|
|
pad = "_p";
|
|
|
|
|
}
|
|
|
|
|
ret += "<div class='headingDiv' id='headingDiv" + i + pad + "'>";
|
|
|
|
|
ret += " ";
|
|
|
|
|
ret += "<button style='text-align:left; border:0; box-shadow:none;' class='projectLine btn btn-outline-primary mt-1 btn-block collapsed' type='button' data-toggle='collapse' data-target='#collapseDiv"
|
|
|
|
|
+ i
|
|
|
|
|
+ pad
|
|
|
|
|
+ "' aria-expanded='false' aria-controls='collapseDiv"
|
|
|
|
|
+ i + pad + "' onclick=switchProject('" + i + "')>";
|
|
|
|
|
ret += "<img alt='Brand'";
|
|
|
|
|
ret += "class='trigimg mr-2' src='./images/onlineide/trigle.png' />";
|
|
|
|
|
ret += dataContent;
|
|
|
|
|
ret += "</button> </div>";
|
|
|
|
|
ret += "<div id='collapseDiv"
|
|
|
|
|
+ i
|
|
|
|
|
+ pad
|
|
|
|
|
+ "' class='collapse' aria-expanded='false' aria-labelledby='headingDiv"
|
|
|
|
|
+ i + pad + "' data-parent='#" + dataParent + "'>";
|
|
|
|
|
ret += "<div style='padding-left:15px; border-bottom: 1px solid #999; border-left: 1px solid #999; border-right: 1px solid #999;'>loading...</div></div>";
|
|
|
|
|
return ret;
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var switchProject = function (i) {
|
|
|
|
|
var pingObj = {};
|
|
|
|
|
pingObj.action = "listProject";
|
|
|
|
|
pingObj.project = global.projects[i];
|
|
|
|
|
var isPrivate = $("#privateprojecttab").hasClass("active");
|
|
|
|
|
pingObj.isPrivate = isPrivate;
|
|
|
|
|
global.lastClickedProjectId = i;
|
|
|
|
|
// if (global.fileContentMap.has(pingObj.project)) {
|
|
|
|
|
// clickTab(pingObj.project);
|
|
|
|
|
// } else
|
|
|
|
|
// console.log(pingObj.project);
|
|
|
|
|
// console.log(global.lastClickedProjectId);
|
|
|
|
|
global.filewssocket.send(JSON.stringify(pingObj));
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var getProjectTreeHtml2 = function (data, clz, preFix, extraPadding, order) {
|
|
|
|
|
if (data == undefined || data.subFiles == undefined)
|
|
|
|
|
return "";
|
|
|
|
|
var subLineID = "accrodionLine" + order;
|
|
|
|
|
var ret = "<div class='accordion " + clz + "' id='" + subLineID + "'>";
|
|
|
|
|
var dirIcon = "<img alt='Brand'";
|
|
|
|
|
dirIcon += "class='trigimg mr-1' src='./images/onlineide/trigle.png' />";
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < data.subFiles.length; i++) {
|
|
|
|
|
var obj = data.subFiles[i];
|
|
|
|
|
var divHtml = "";
|
|
|
|
|
var clickfun = "";
|
|
|
|
|
if (obj.subFiles == undefined) {
|
|
|
|
|
clickfun = "onclick = 'clickProjectFile(\"" + preFix + obj.name
|
|
|
|
|
+ "\")'" + " class='projectFileDiv' ";
|
|
|
|
|
} else {
|
|
|
|
|
clickfun = "onclick ='clickProjectDir(\"" + preFix + obj.name
|
|
|
|
|
+ "\")'" + " class='projectFileDiv' ";
|
|
|
|
|
}
|
|
|
|
|
if (obj.subFiles != undefined) {
|
|
|
|
|
divHtml = "<div class=' row ' "
|
|
|
|
|
+ clickfun
|
|
|
|
|
+ ">"
|
|
|
|
|
+ "<div class='col-sm-12 fileLine' data-toggle='collapse' data-target='#accrodionLine"
|
|
|
|
|
+ order
|
|
|
|
|
+ "_"
|
|
|
|
|
+ i
|
|
|
|
|
+ "' aria-expended='true' aria-controls='accrodionLine"
|
|
|
|
|
+ order
|
|
|
|
|
+ "_"
|
|
|
|
|
+ i
|
|
|
|
|
+ "' style='margin-left:"
|
|
|
|
|
+ extraPadding
|
|
|
|
|
+ "px; border-left:1px solid #999; padding:0;' id='headingSub"
|
|
|
|
|
+ order + "'>" + dirIcon + "<span >" + obj.name
|
|
|
|
|
+ "</span></div>";
|
|
|
|
|
divHtml += "<div id='accrodionLine" + order + "_" + i
|
|
|
|
|
+ "' class='collapse col-sm-12' aria-labeledby='headingSub"
|
|
|
|
|
+ order + "'>";
|
|
|
|
|
divHtml += getProjectTreeHtml2(obj, clz, preFix + obj.name + "/",
|
|
|
|
|
|
|
|
|
|
extraPadding + 12, order + "_" + i);
|
|
|
|
|
divHtml += "</div>";
|
|
|
|
|
divHtml += "</div>";
|
|
|
|
|
} else {
|
|
|
|
|
divHtml = "<div class='row ' " + clickfun + ">"
|
|
|
|
|
+ "<div class='col-sm-12 fileLine' style='margin-left:"
|
|
|
|
|
+ extraPadding + "px; border-left:1px solid #999;'><span>"
|
|
|
|
|
+ obj.name + "</span></div></div>";
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret += divHtml;
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
if (data.subFiles.length == 0) {
|
|
|
|
|
divHtml = "<div class='row ' onclick='clickEmpty(\"" + preFix + "\")'>"
|
|
|
|
|
+ "<div class='col-sm-12 fileLine' style='margin-left:"
|
|
|
|
|
+ extraPadding
|
|
|
|
|
+ "px; border-left:1px solid #999;'><span>当前目录为空"
|
|
|
|
|
+ "</span></div></div>";
|
|
|
|
|
ret += divHtml;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ret += "</div>";
|
|
|
|
|
|
|
|
|
|
return ret;
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
// Tab related handlers============
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var onListFile = function (obj) {
|
|
|
|
|
var data = JSON.parse(obj.data);
|
|
|
|
|
data.name = "...";
|
|
|
|
|
data.changed = false;
|
|
|
|
|
// .replace(/.*\//g,"");
|
|
|
|
|
data.isPrivate = obj.isPrivate;
|
|
|
|
|
mainVue.openedFiles.push(data);
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
clickTab(data.path);
|
|
|
|
|
}, 100);
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var onStaticVerify = function (obj) {
|
|
|
|
|
var data = {};
|
|
|
|
|
data.name = data.path = "/tmp/result_" + (new Date().getTime() % 1000)
|
|
|
|
|
+ ".txt";
|
|
|
|
|
obj = JSON.parse(obj.data);
|
|
|
|
|
obj.result = JSON.parse(obj.result);
|
|
|
|
|
data.val = JSON.stringify(obj, null, 4);
|
|
|
|
|
mainVue.openedFiles.push(data);
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
clickTab(data.path);
|
|
|
|
|
}, 100);
|
2021-06-15 11:56:39 +00:00
|
|
|
|
}
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var clickProjectDir = function () {
|
2021-06-15 11:56:39 +00:00
|
|
|
|
|
|
|
|
|
};
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var clickProjectFile = function (tar) {
|
|
|
|
|
var pingObj = {};
|
|
|
|
|
pingObj.action = "listFile";
|
|
|
|
|
pingObj.path = tar;
|
|
|
|
|
pingObj.isPrivate = $("#privateprojecttab").hasClass("active");
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < mainVue.openedFiles.length; i++) {
|
|
|
|
|
var file = mainVue.openedFiles[i];
|
|
|
|
|
if (file.path == tar) {
|
|
|
|
|
clickTab(tar);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
global.filewssocket.send(JSON.stringify(pingObj));
|
2021-06-15 11:56:39 +00:00
|
|
|
|
|
|
|
|
|
};
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var formatScriptEditor = function () {
|
|
|
|
|
var from = global.scriptEditor.getCursor(true);
|
|
|
|
|
var to = global.scriptEditor.getCursor(false);
|
|
|
|
|
if (from == to) {
|
|
|
|
|
from = {
|
|
|
|
|
line: 0,
|
|
|
|
|
ch: 0
|
|
|
|
|
};
|
|
|
|
|
to = {
|
|
|
|
|
line: global.scriptEditor.lastLine() + 1,
|
|
|
|
|
ch: 1
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
global.scriptEditor.autoFormatRange(from, to);
|
2021-06-15 11:56:39 +00:00
|
|
|
|
|
|
|
|
|
}
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var adjustFileName = function (title) {
|
|
|
|
|
if (mainVue.openedFiles.length < 2)
|
|
|
|
|
return;
|
|
|
|
|
var totalLen = 90;
|
|
|
|
|
var average = (totalLen - title.length - 6)
|
|
|
|
|
/ (mainVue.openedFiles.length - 1);
|
|
|
|
|
average -= 4;
|
|
|
|
|
for (var i = 0; i < mainVue.openedFiles.length; i++) {
|
|
|
|
|
var file = mainVue.openedFiles[i];
|
|
|
|
|
if (file.path == title)
|
|
|
|
|
file.name = file.path;
|
|
|
|
|
else {
|
|
|
|
|
if (file.path.length > average + 5)
|
|
|
|
|
file.name = file.path.substr(0, average) + " ...";
|
|
|
|
|
else
|
|
|
|
|
file.name = file.path;
|
|
|
|
|
}
|
|
|
|
|
if (file.changed) {
|
|
|
|
|
file.name = "* " + file.name;
|
|
|
|
|
}
|
|
|
|
|
}
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var clickTab = function (title) {
|
|
|
|
|
if (title.getAttribute != undefined) {
|
|
|
|
|
title = title.getAttribute("path");
|
|
|
|
|
}
|
|
|
|
|
if (global.currentFile != undefined && global.currentFile.val != undefined) {
|
|
|
|
|
var val = global.scriptEditor.getValue();
|
|
|
|
|
if (global.currentFile.val != val) {
|
|
|
|
|
global.currentFile.changed = true;
|
|
|
|
|
}
|
|
|
|
|
global.currentFile.val = val;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
for (var i = 0; i < mainVue.openedFiles.length; i++) {
|
|
|
|
|
var file = mainVue.openedFiles[i];
|
|
|
|
|
if (file.path == title) {
|
|
|
|
|
if (file.val != undefined) {
|
|
|
|
|
global.scriptEditor.setOption("mode", "application/javascript");
|
|
|
|
|
if (file.path.endsWith(".css")) {
|
|
|
|
|
global.scriptEditor.setOption("mode", "text/css");
|
|
|
|
|
}
|
|
|
|
|
if (file.path.endsWith(".html")) {
|
|
|
|
|
global.scriptEditor.setOption("mode", "text/html");
|
|
|
|
|
}
|
|
|
|
|
if (file.path.endsWith(".js")) {
|
|
|
|
|
global.scriptEditor.setOption("mode",
|
|
|
|
|
"application/javascript");
|
|
|
|
|
}
|
|
|
|
|
global.scriptEditor.setValue(file.val);
|
|
|
|
|
} else {
|
|
|
|
|
global.scriptEditor.setValue("not text file!");
|
|
|
|
|
}
|
|
|
|
|
$("#myFileTab a").removeClass("active");
|
|
|
|
|
$("#myFileTab a")[i].classList.add("active");
|
|
|
|
|
global.currentFile = file;
|
|
|
|
|
adjustFileName(title);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
// it is Hello
|
|
|
|
|
if (title == "Hello") {
|
|
|
|
|
$("#myFileTab a")[0].classList.add("active");
|
|
|
|
|
global.scriptEditor.setValue("Hello Page");
|
|
|
|
|
adjustFileName(title);
|
|
|
|
|
}
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var closeTab = function (ele) {
|
|
|
|
|
var path = ele.getAttribute("path");
|
|
|
|
|
var newList = [];
|
|
|
|
|
var pos = 0;
|
|
|
|
|
for (var i = 0; i < mainVue.openedFiles.length; i++) {
|
|
|
|
|
var file = mainVue.openedFiles[i];
|
|
|
|
|
if (file.path == global.currentFile.path) {
|
|
|
|
|
pos = i;
|
|
|
|
|
}
|
|
|
|
|
if (file.path == path) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
newList.push(file);
|
|
|
|
|
}
|
|
|
|
|
mainVue.openedFiles = newList;
|
|
|
|
|
if (pos < mainVue.openedFiles.length) {
|
|
|
|
|
clickTab(mainVue.openedFiles[pos].path);
|
|
|
|
|
} else {
|
|
|
|
|
pos--;
|
|
|
|
|
if (pos >= 0)
|
|
|
|
|
clickTab(mainVue.openedFiles[pos].path);
|
|
|
|
|
}
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
// Tab related handlers============
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var getProjectTreeHtml = function (data, clz, preFix) {
|
|
|
|
|
if (data == undefined || data.subFiles == undefined)
|
|
|
|
|
return "";
|
|
|
|
|
var ret = "<ul class='" + clz + "'>";
|
|
|
|
|
for (var i = 0; i < data.subFiles.length; i++) {
|
|
|
|
|
var obj = data.subFiles[i];
|
|
|
|
|
var clickfun = "";
|
|
|
|
|
if (obj.subFiles == undefined) {
|
|
|
|
|
clickfun = "onclick = 'clickProjectFile(\"" + preFix + obj.name
|
|
|
|
|
+ "\")'" + " class='projectFileDiv' ";
|
|
|
|
|
} else {
|
|
|
|
|
clickfun = "onclick ='clickProjectDir(\"" + preFix + obj.name
|
|
|
|
|
+ "\")'" + " class='projectFileDiv'";
|
|
|
|
|
}
|
|
|
|
|
ret += "<li><div " + clickfun + ">" + obj.name + "</div>";
|
|
|
|
|
if (obj.subFiles != undefined)
|
|
|
|
|
ret += getProjectTreeHtml(obj, "subFileTreeUl", preFix + obj.name
|
|
|
|
|
+ "/");
|
|
|
|
|
ret += "</li>"
|
|
|
|
|
}
|
|
|
|
|
return ret + "</ul>";
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// context menu callbacks=======================
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var showRename = function (projectName) {
|
|
|
|
|
var body = "<div class='input-group mb-3'>";
|
|
|
|
|
body += "<div class='input-group-prepend'>";
|
|
|
|
|
body += " <span class='input-group-text' >输入新名称</span>";
|
|
|
|
|
body += "</div> <input type='text' id='dialogInput' class='form-control' value='"
|
|
|
|
|
+ projectName + "'></div>";
|
|
|
|
|
$("#dialogBodyDiv").html(body);
|
|
|
|
|
showDialog("重命名项目", function () {
|
|
|
|
|
var pingObj = {};
|
|
|
|
|
var newVal = $("#dialogInput")[0].value;
|
|
|
|
|
if (newVal == undefined || newVal.length == 0 || newVal.indexOf("..") != -1 || newVal.indexOf("\\") != -1) {
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
myToast("重命名失败", "新文件名不符合规范");
|
|
|
|
|
}, 1000);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pingObj.newFile = newVal;
|
|
|
|
|
pingObj.action = "renameFile";
|
|
|
|
|
pingObj.oldFile = projectName;
|
|
|
|
|
pingObj.isPrivate = $("#privateprojecttab").hasClass("active");
|
|
|
|
|
global.filewssocket.send(JSON.stringify(pingObj));
|
|
|
|
|
});
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var showDelete = function (projectName) {
|
|
|
|
|
var body = "<div class='input-group mb-3'>";
|
|
|
|
|
body += " <span class='input-group-text' >请确认是否删除:" + projectName
|
|
|
|
|
+ "</span>";
|
|
|
|
|
body += " </div>";
|
|
|
|
|
$("#dialogBodyDiv").html(body);
|
|
|
|
|
showDialog("删除项目", function () {
|
|
|
|
|
global.projectName = projectName;
|
|
|
|
|
deleteFile();
|
|
|
|
|
});
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var showCreateFile = function (projectName, isDir) {
|
|
|
|
|
var body = "<div class='input-group mb-3'>";
|
|
|
|
|
body += "<div class='input-group-prepend'>";
|
|
|
|
|
body += " <span class='input-group-text' >创建文件" + (isDir ? "夹" : "")
|
|
|
|
|
+ "</span>";
|
|
|
|
|
body += "</div> <input type='text' id='newProjectNameInput' class='form-control' placeholder='新文件"
|
|
|
|
|
+ (isDir ? "夹" : "") + "'></div>";
|
|
|
|
|
$("#dialogBodyDiv").html(body);
|
|
|
|
|
showDialog("创建新文件", function () {
|
|
|
|
|
var fileName = $("#newProjectNameInput")[0].value;
|
|
|
|
|
if (fileName == undefined || fileName.length == 0) {
|
|
|
|
|
setTimeout(function () {
|
|
|
|
|
myToast("新建文件失败", "请输入文件名");
|
|
|
|
|
}, 1000);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var arg = {};
|
|
|
|
|
var privateTab = $("#privateprojecttab").hasClass("active");
|
|
|
|
|
if (privateTab)
|
|
|
|
|
arg.isPrivate = true;
|
|
|
|
|
else
|
|
|
|
|
arg.isPrivate = false;
|
|
|
|
|
arg.dir = projectName;
|
|
|
|
|
arg.action = "createFile";
|
|
|
|
|
arg.isFolder = isDir;
|
|
|
|
|
arg.name = fileName;
|
|
|
|
|
global.filewssocket.send(JSON.stringify(arg));
|
|
|
|
|
});
|
2021-06-15 11:56:39 +00:00
|
|
|
|
}
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var deleteFile = function () {
|
|
|
|
|
var pingObj = {};
|
|
|
|
|
pingObj.file = global.projectName;
|
|
|
|
|
pingObj.action = "deleteFile";
|
|
|
|
|
pingObj.isPrivate = $("#privateprojecttab").hasClass("active");
|
|
|
|
|
global.filewssocket.send(JSON.stringify(pingObj));
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var saveFile = function () {
|
|
|
|
|
var pingObj = {};
|
|
|
|
|
pingObj.isAppend = false;
|
|
|
|
|
pingObj.isPrivate = global.currentFile.isPrivate;
|
|
|
|
|
|
|
|
|
|
pingObj.path = global.currentFile.path;
|
|
|
|
|
|
|
|
|
|
pingObj.action = "saveFile";
|
|
|
|
|
pingObj.content = global.scriptEditor.getValue();
|
|
|
|
|
if (pingObj.path == "Hello") {
|
|
|
|
|
myToast("保存出错", "不能保存Hello");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
global.filewssocket.send(JSON.stringify(pingObj));
|
|
|
|
|
global.currentFile.changed = false;
|
|
|
|
|
adjustFileName(global.currentFile.path);
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var sliceFile = function (file) {
|
|
|
|
|
let piece = 1024 * 50;
|
|
|
|
|
let totalSize = file.size; // 文件总大小
|
|
|
|
|
let start = 0; // 每次上传的开始字节
|
|
|
|
|
let end = start + piece; // 每次上传的结尾字节
|
|
|
|
|
let chunks = []
|
|
|
|
|
while (start < totalSize) {
|
|
|
|
|
// 根据长度截取每次需要上传的数据
|
|
|
|
|
// File对象继承自Blob对象,因此包含slice方法
|
|
|
|
|
let blob = file.slice(start, end);
|
|
|
|
|
chunks.push(blob)
|
|
|
|
|
start = end;
|
|
|
|
|
end = start + piece;
|
|
|
|
|
}
|
|
|
|
|
return chunks;
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var uploadInternal = function () {
|
|
|
|
|
var isAppend = true;
|
|
|
|
|
if (global.uploadOrder == 0)
|
|
|
|
|
isAppend = false;
|
|
|
|
|
if (global.uploadOrder >= global.chunks.length) {
|
|
|
|
|
progressTextDiv.innerText = global.uploadFiles[global.fileOrder - 1].name + "上传已完成";
|
|
|
|
|
progressDiv.style.width = "100%";
|
|
|
|
|
setTimeout(uploadSingleFile, 500);
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var num = global.uploadOrder * 100 / global.chunks.length;
|
|
|
|
|
progressDiv.style.width = num.toFixed(2) + "%";
|
|
|
|
|
var chunk = global.chunks[global.uploadOrder];
|
|
|
|
|
let fd = new FormData();
|
|
|
|
|
fd.append("file", chunk);
|
|
|
|
|
var isPrivate = $("#privateprojecttab").hasClass("active");
|
|
|
|
|
var arg = "path=" + global.lastClickProjectName;
|
|
|
|
|
arg += "&fileName=" + global.uploadFileName;
|
|
|
|
|
arg += "&isPrivate=" + isPrivate;
|
|
|
|
|
arg += "&order=" + global.uploadOrder;
|
|
|
|
|
arg += "&count=" + global.chunks.length;
|
|
|
|
|
arg += "&pubKey=" + global.sm2Key.publicKey;
|
|
|
|
|
var sign = sm2.doSignature(arg, global.sm2Key.privateKey, {hash: true, der: true});
|
|
|
|
|
arg += "&sign=" + sign;
|
|
|
|
|
$.ajax({
|
|
|
|
|
url: `${global.urlparam ?
|
|
|
|
|
(location.href.startsWith('https') ? 'https://' : 'http://') + global.urlparam.nodeAddr :
|
|
|
|
|
'.'}/Upload?${arg}`,
|
|
|
|
|
type: 'POST',
|
|
|
|
|
data: fd,
|
|
|
|
|
processData: false, // tell jQuery not to process the data
|
|
|
|
|
contentType: false, // tell jQuery not to set contentType
|
|
|
|
|
success: function (data) {
|
|
|
|
|
uploadInternal();
|
|
|
|
|
},
|
|
|
|
|
error: function (data) {
|
|
|
|
|
console.log("[uploadFile] error!");
|
|
|
|
|
alert("Upload failed!");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
global.uploadOrder++;
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
var pingObj = {};
|
|
|
|
|
pingObj.isAppend = false;
|
|
|
|
|
pingObj.isPrivate = $("#privateprojecttab").hasClass("active");
|
|
|
|
|
pingObj.path = global.lastClickProjectName;
|
|
|
|
|
pingObj.fileName = global.uploadFileName;
|
|
|
|
|
pingObj.action = "uploadFile";
|
|
|
|
|
var text = btoa(new Uint8Array(chunk.arrayBuffer));
|
|
|
|
|
|
|
|
|
|
pingObj.content = text;
|
|
|
|
|
global.filewssocket.send(JSON.stringify(pingObj));
|
2021-06-15 11:56:39 +00:00
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var uploadFile = function (obj) {
|
|
|
|
|
console.log("uploadFile : ");
|
|
|
|
|
global.uploadFiles = $("#uploadFileInput")[0].files;
|
|
|
|
|
global.fileOrder = 0;
|
|
|
|
|
var body = "<div class='input-group mb-3'>";
|
|
|
|
|
body += " <span class='input-group-text' id='progressTextDiv' ></span>";
|
|
|
|
|
body += "</div>";
|
|
|
|
|
body += "<div class='row'><div class='col-sm-12'><div class='progress'> <div id='progressDiv' class='progress-bar-animated progress-bar progress-bar-striped' role='progressbar' style='width: 5%' aria-valuenow='5' aria-valuemin='0' aria-valuemax='100'></div>";
|
|
|
|
|
body += "</div></div></div>";
|
|
|
|
|
$("#dialogBodyDiv").html(body);
|
|
|
|
|
|
|
|
|
|
uploadSingleFile();
|
|
|
|
|
showDialog("正在上传文件", function () {
|
|
|
|
|
cancelUpload();
|
|
|
|
|
}, function () {
|
|
|
|
|
cancelUpload();
|
|
|
|
|
});
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var uploadSingleFile = function () {
|
|
|
|
|
var file = global.uploadFiles[global.fileOrder];
|
|
|
|
|
global.fileOrder++;
|
|
|
|
|
if (file == undefined) {
|
|
|
|
|
progressTextDiv.innerHTML = global.uploadFiles.length + "个文件全部上传完毕";
|
|
|
|
|
return;
|
|
|
|
|
} else {
|
|
|
|
|
progressTextDiv.innerHTML = "上传第("
|
|
|
|
|
+ (global.fileOrder) + "/" + global.uploadFiles.length + ")个文件:" + file.name;
|
|
|
|
|
}
|
|
|
|
|
global.uploadFile = file;
|
|
|
|
|
global.chunks = sliceFile(file);
|
|
|
|
|
global.uploadOrder = 0;
|
|
|
|
|
global.uploadFileName = file.name;
|
|
|
|
|
uploadInternal();
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var cancelUpload = function () {
|
|
|
|
|
global.uploadOrder = global.chunks.length + 1;
|
|
|
|
|
global.fileOrder = global.uploadFiles.length + 1;
|
2021-06-15 11:56:39 +00:00
|
|
|
|
}
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var downloadContract = function (projectName) {
|
|
|
|
|
var url;
|
|
|
|
|
if (window.location.href.indexOf("/SCIDE") != -1)
|
|
|
|
|
url = window.location.href.replace("/OnlineIDE.html", "/CMManager?");
|
|
|
|
|
else
|
|
|
|
|
url = window.location.href.replace("/OnlineIDE.html",
|
|
|
|
|
"/SCIDE/CMManager?");
|
|
|
|
|
|
|
|
|
|
var arg = "action=downloadContract&projectName="
|
|
|
|
|
arg += projectName;
|
|
|
|
|
var isPrivate = $("#privateprojecttab").hasClass("active");
|
|
|
|
|
arg += "&isPrivate=" + isPrivate;
|
|
|
|
|
arg += "&pubKey=" + global.sm2Key.publicKey;
|
|
|
|
|
arg += "×tamp=" + new Date().getTime();
|
|
|
|
|
var sign = sm2.doSignature(arg, global.sm2Key.privateKey);
|
|
|
|
|
arg += "&sign=" + sign;
|
|
|
|
|
window.open(url + arg);
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|
|
|
|
|
|
2021-06-15 13:43:19 +00:00
|
|
|
|
var staticVerify = function () {
|
|
|
|
|
var arg = {};
|
|
|
|
|
arg.action = "staticVerifyContract";
|
|
|
|
|
arg.contractid = "-";
|
|
|
|
|
arg.script = "-";
|
|
|
|
|
if (global.currentFile == undefined) {
|
|
|
|
|
myToast("提示", "请打开一个文件以静态分析该项目");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
var p = global.currentFile.path;
|
|
|
|
|
p = p.substr(0, p.indexOf("/", 1) + 1);
|
|
|
|
|
arg.path = p;
|
|
|
|
|
var privateTab = $("#privateprojecttab").hasClass("active");
|
|
|
|
|
if (privateTab)
|
|
|
|
|
arg.isPrivate = true;
|
|
|
|
|
else
|
|
|
|
|
arg.isPrivate = false;
|
|
|
|
|
global.wssocket.send(JSON.stringify(arg));
|
2021-06-15 11:56:39 +00:00
|
|
|
|
};
|