From a67c1d7514a4a34becbed5e856676a3e57d35be8 Mon Sep 17 00:00:00 2001 From: zeners Date: Sat, 26 Mar 2016 18:19:33 +0100 Subject: [PATCH] webui: paste RS-links for download --- libresapi/src/README.md | 2 +- libresapi/src/webui-src/README.md | 19 ++ libresapi/src/webui-src/app/adddownloads.js | 301 ++++++++++++++++++++ libresapi/src/webui-src/app/downloads.js | 6 + libresapi/src/webui-src/app/menudef.js | 6 + 5 files changed, 333 insertions(+), 1 deletion(-) create mode 100644 libresapi/src/webui-src/app/adddownloads.js diff --git a/libresapi/src/README.md b/libresapi/src/README.md index 9c4350fd4..b5aaa4760 100644 --- a/libresapi/src/README.md +++ b/libresapi/src/README.md @@ -2,7 +2,7 @@ libresapi: resource_api and new webinterface ============================================ * ./api contains a C++ backend to control retroshare from webinterfaces or scripting -* ./webui contains contains compiled files for the webinterface (after build) +* ./webui contains compiled files for the webinterface (after build) * ./webui-src contains HTML/CSS/JavaScript source files for the webinterface (NEW, webinterface made with mithril.js) Quickinfo for builders and packagers diff --git a/libresapi/src/webui-src/README.md b/libresapi/src/webui-src/README.md index e8ef0fb2f..26a52a2c5 100644 --- a/libresapi/src/webui-src/README.md +++ b/libresapi/src/webui-src/README.md @@ -57,3 +57,22 @@ need 4 master [X] unread chat message counter in menu [X] list chat-lobby participants [X] creating app.js on build (no need for npm on regulary build) + +url-handling (brainstorming) +---------------------------- +* normal weblinks (bbcode? => only with gui support) +* rslinks + - files + - (chatrooms) + - forum retroshare://forum?name=Developers%27%20Discussions&id=8fd22bd8f99754461e7ba1ca8a727995 + - own cert link (paste) + - cert-links + - searches + - [X] downloads pasten + - uploads? +* enter / display urls + - use urls in href like used for input (so it can be copy-link) + - handle RS-urls with javascript, other with target _blank +* smilies +* Bilder +* KEEP IT SIMPLE diff --git a/libresapi/src/webui-src/app/adddownloads.js b/libresapi/src/webui-src/app/adddownloads.js new file mode 100644 index 000000000..15ab9187b --- /dev/null +++ b/libresapi/src/webui-src/app/adddownloads.js @@ -0,0 +1,301 @@ +var m = require("mithril"); +var rs = require("retroshare"); + +var me = { + toParse: [], // links to parse ( = pasted content) + toConfirm: [], // links to confirm + toAdd: [], // links to add + toResult: [], // Result to show + index: 0, + view: function(){ + return m("div", { + style: { + height:"100%", + boxSizing: "border-box", + paddingBottom: "130px", + } + },[ + m("h2","add downloads"), + m("hr"), + this.toParse.length + ? step2() + : this.toConfirm.length + ? step3() + : this.toAdd.length + ? step4() + : this.toResult.length + ? step5() + : step1() + , + ]); + }, + parseOne: function(){ + if (me.index == null) { + return null; + } + var startindex = me.index; + while (me.toParse.length > me.index && me.index - startindex < 10) { + var src = me.toParse[me.index].split("?",2); + console.log(src); + if (src[0] == "retroshare://file" && src.length == 2) { + var target = {action: "begin"}; + var errText = "Error: link missing name and/or hash" + src[1].split("&").map(function(parm){ + var pos = parm.indexOf("="); + if (pos >0){ + if (parm.substr(0,pos) == "name") { + var sname=decodeURIComponent(parm.substr(pos+1)) + if (sname.match("[\\\\/]")) { + errText="name contains illegal char " + + sname.match("[\\\\/]"); + } else { + target.name=sname; + } + } else if (parm.substr(0,pos) == "size") { + target.size=parseFloat(parm.substr(pos+1)); + } else if (parm.substr(0,pos) == "hash") { + target.hash=parm.substr(pos+1); + } + } + }); + if (target['name'] && target['hash']){ + me.toConfirm.push({ + text: target.name, + target: target, + confirmed: true, + }); + } else { + me.toConfirm.push({ + text:errText, + }); + } + } else { + me.toConfirm.push({ text: "Error: no Retroshare-file link"}) + } + me.index++; + } + if (me.toParse.length > me.index) { + window.setTimeout("require(\"adddownloads\").parseOne()",1); + } else { + me.toParse = []; + console.log(me.toConfirm.length); + } + refresh(); + }, + addOne: function(){ + if (me.index == null) { + cancel(); + } else if (me.index >= me.toAdd.length) { + me.toResult=me.toAdd; + me.toAdd=[]; + refresh(); + } else { + console.log([ + me.toAdd[me.index].action, + me.toAdd[me.index].name, + me.toAdd[me.index].size, + me.toAdd[me.index].hash, + ]); + refresh(); + rs.request("transfers/control_download", me.toAdd[me.index], + function(data,statetoken){ + if (me.index != null) { + me.toAdd[me.index].ok=true; + me.index++; + me.addOne(); + } + }, { + onfail: function(value){ + me.toAdd[me.index].ok=false; + me.toAdd[me.index].debug_msg=value; + me.index++; + me.addOne(); + }, + onmismatch: function(response){ + me.toAdd[me.index].ok=false; + me.toAdd[me.index].debug_msg=response.debug_msg; + me.index++; + me.addOne(); + }, + } + ); + } + } +}; + +function cancel() { + me.toAdd=[]; + me.toConfirm=[]; + me.toParse=[]; + me.toResult=[]; + me.index=null; + refresh(); +} + +function parseDownloads(){ + me.toParse = document.getElementById("txtInput").value.replace("\r\n","\n").split("\n"); + var pos; + while ((pos=me.toParse.indexOf(""))>=0) { + me.toParse.splice(pos,1); + } + var parser = document.createElement('a'); + me.toConfirm = []; + me.index = 0; + if (me.toParse.length > me.index){ + window.setTimeout("require(\"adddownloads\").parseOne()",1); + } +} + +function addDownloads(){ + me.toConfirm.map(function(item){ + if (item.confirmed) { + item.debug_msg=""; + me.toAdd.push(item.target); + } + }); + me.toConfirm=[]; + if (me.toAdd.length > 0){ + me.index=0; + window.setTimeout("require(\"adddownloads\").addOne()",1); + } else { + cancel(); + } + refresh(); +} + +function refresh(){ + m.startComputation(); + m.endComputation(); +} + +function cancelBtn(){ + return m("div.btn2", { + style:{ + textAlign: "center", + color: "red", + borderColor: "red", + }, + onclick:cancel, + },"cancel"); +} + +// paste links +function step1(){ + rs.initControl = "txt"; + return [ + m("h3","step 1 / 5: paste retroshare-links:"), + m("textarea[id=txtInput]", { + style: { + height:"100%", + } + }), + m("div.btn2", { + style:{ + textAlign:"center", + }, + onclick:parseDownloads, + },"add downloads") + ] +} + +// parsing links +function step2(){ + rs.initControl = "txt"; + return [ + m("h3","step 2 / 5: parsing input ..."), + m("p", + "parsing " + (me.index) + " / " + me.toParse.length), + cancelBtn(), + ] +} + +// parsing confirm +function step3(){ + rs.initControl = "txt"; + return [ + m("h3","step 3 / 5: confirm-links:"), + m("ul", + me.toConfirm.map(function(item){ + return m("li", { + style:{ + color: item.confirmed + ? "lime" + : "red" + }, + }, item.text); + }) + ), + m("div.btn2", { + style:{ + textAlign:"center", + }, + onclick:addDownloads, + },"add green listed downloads"), + cancelBtn(), + ] +} + +// adding links +function step4(){ + rs.initControl = "txt"; + return [ + m("h3","step 4 / 5: adding downloads:"), + m("p", + "adding " + (me.index) + " / " + me.toParse.length), + m("ul", + me.toAdd.map(function(item){ + return m("li", { + style:{ + color: item.ok === undefined + ? "white" + : item.ok == null + ? "grey" + : item.ok + ? "lime" + : "red" + }, + }, (item.debug_msg ? item.debug_msg + ": " : "") + item.name + + " " + item.size + " " + item.hash); + }) + ), + cancelBtn(), + ] +} + +// show result +function step5(){ + rs.initControl = "txt"; + return [ + m("h3","step 5 / 5: Result:"), + m("p", + "verarbeitet: " + me.toResult.length), + m("ul", + me.toResult.map(function(item){ + return m("li", { + style:{ + color: item.ok === undefined + ? "white" + : item.ok == null + ? "grey" + : item.ok + ? "lime" + : "red" + }, + }, (item.debug_msg ? item.debug_msg + ": " : "") + item.name); + }) + ), + m("div.btn2", { + style:{ + textAlign: "center", + }, + onclick: function(){ + me.toResult=[]; + refresh(); + }, + },"ok"), + ] +} + + + +module.exports = me; diff --git a/libresapi/src/webui-src/app/downloads.js b/libresapi/src/webui-src/app/downloads.js index 543f2a810..26dac3b1e 100644 --- a/libresapi/src/webui-src/app/downloads.js +++ b/libresapi/src/webui-src/app/downloads.js @@ -50,6 +50,12 @@ module.exports = { } return m("div", [ m("h2","Downloads (" + paths.length +")"), + m("div.btn2", { + onclick: function(){ + m.route("/downloads/add"); + } + }, "add retrohare downloads"), + m("hr"), m('table', [ m("tr",[ m("th","name"), diff --git a/libresapi/src/webui-src/app/menudef.js b/libresapi/src/webui-src/app/menudef.js index 7181a986f..ae591aae6 100644 --- a/libresapi/src/webui-src/app/menudef.js +++ b/libresapi/src/webui-src/app/menudef.js @@ -64,6 +64,12 @@ module.exports = { nodes: [ runstate: "running_ok.*", counter: rs.counting("transfers/downloads") }, + { + name: "adddownloads", + runstate: "running_ok.*", + path: "/downloads/add", + show: false, + }, { name: "forums", runstate: "running_ok.*",