webui: paste RS-links for download

This commit is contained in:
zeners 2016-03-26 18:19:33 +01:00
parent 30193fe79a
commit a67c1d7514
5 changed files with 333 additions and 1 deletions

View File

@ -2,7 +2,7 @@ libresapi: resource_api and new webinterface
============================================ ============================================
* ./api contains a C++ backend to control retroshare from webinterfaces or scripting * ./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) * ./webui-src contains HTML/CSS/JavaScript source files for the webinterface (NEW, webinterface made with mithril.js)
Quickinfo for builders and packagers Quickinfo for builders and packagers

View File

@ -57,3 +57,22 @@ need 4 master
[X] unread chat message counter in menu [X] unread chat message counter in menu
[X] list chat-lobby participants [X] list chat-lobby participants
[X] creating app.js on build (no need for npm on regulary build) [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

View File

@ -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;

View File

@ -50,6 +50,12 @@ module.exports = {
} }
return m("div", [ return m("div", [
m("h2","Downloads (" + paths.length +")"), m("h2","Downloads (" + paths.length +")"),
m("div.btn2", {
onclick: function(){
m.route("/downloads/add");
}
}, "add retrohare downloads"),
m("hr"),
m('table', [ m('table', [
m("tr",[ m("tr",[
m("th","name"), m("th","name"),

View File

@ -64,6 +64,12 @@ module.exports = { nodes: [
runstate: "running_ok.*", runstate: "running_ok.*",
counter: rs.counting("transfers/downloads") counter: rs.counting("transfers/downloads")
}, },
{
name: "adddownloads",
runstate: "running_ok.*",
path: "/downloads/add",
show: false,
},
{ {
name: "forums", name: "forums",
runstate: "running_ok.*", runstate: "running_ok.*",