add reply box thing
This commit is contained in:
parent
0e8d277482
commit
172b1e7c8c
186
contrib/js/nntpchan/post-reply.js
Normal file
186
contrib/js/nntpchan/post-reply.js
Normal file
@ -0,0 +1,186 @@
|
||||
/**
|
||||
post reply box
|
||||
*/
|
||||
|
||||
|
||||
function table_insert_row(table, header, items) {
|
||||
var tr = document.createElement("tr");
|
||||
// insert header element
|
||||
var th = document.createElement("th");
|
||||
th.appendChild(header);
|
||||
tr.appendChild(th);
|
||||
// insert the rest of the elements
|
||||
for (var idx = 0; idx < items.length; idx ++ ) {
|
||||
var elem = document.createElement("td");
|
||||
elem.appendChild(items[idx]);
|
||||
tr.appendChild(elem);
|
||||
}
|
||||
table.appendChild(tr);
|
||||
}
|
||||
|
||||
/**
|
||||
reply box
|
||||
*/
|
||||
function ReplyBox() {
|
||||
var elem = document.createElement("div");
|
||||
this.elem = elem;
|
||||
// reference
|
||||
elem = document.createElement("input");
|
||||
elem.name = "reference";
|
||||
elem.type = "hidden";
|
||||
this.elem.appendChild(elem);
|
||||
|
||||
var table = document.createElement("table");
|
||||
table.setAttribute("class", "postform");
|
||||
var tbody = document.createElement("tbody");
|
||||
|
||||
var span = document.createElement("span");
|
||||
// name
|
||||
elem = document.createElement("input");
|
||||
elem.setAttribute("name", "name");
|
||||
elem.setAttribute("value", "Anonymous");
|
||||
span.appendChild(elem);
|
||||
// error message
|
||||
var err_elem = document.createElement("span");
|
||||
span.appendChild(err_elem);
|
||||
this._error = err_elem;
|
||||
table_insert_row(tbody, document.createTextNode("Name"), [span]);
|
||||
|
||||
// subject
|
||||
elem = document.createElement("input");
|
||||
elem.setAttribute("value", "");
|
||||
this.subject = elem;
|
||||
// submit
|
||||
var submit = document.createElement("button");
|
||||
submit.setAttribute("value", "reply");
|
||||
submit.setAttribute("class", "button");
|
||||
table_insert_row(tbody, document.createTextNode("Subject"), [elem, submit]);
|
||||
this.submit = submit;
|
||||
|
||||
// Comment
|
||||
elem = document.createElement("textarea");
|
||||
elem.setAttribute("cols", "40");
|
||||
elem.setAttribute("rows", "5");
|
||||
table_insert_row(tbody, document.createTextNode("Comment"), [elem]);
|
||||
this.message = elem;
|
||||
|
||||
// file
|
||||
elem = document.createElement("input");
|
||||
elem.setAttribute("class", "postform_attachment");
|
||||
elem.setAttribute("type", "file");
|
||||
elem.setAttribute("multiple", "multiple");
|
||||
this.files = elem;
|
||||
table_insert_row(tbody, document.createTextNode("Files"), [elem]);
|
||||
|
||||
// captcha
|
||||
elem = document.createElement("img");
|
||||
elem.alt = "captcha";
|
||||
table_insert_row(tbody, document.createTextNode("Captcha"), [elem]);
|
||||
this.captcha_img = elem;
|
||||
|
||||
// captcha solution
|
||||
elem = document.createElement("input");
|
||||
elem.name = "captcha";
|
||||
elem.autocomplete = "off";
|
||||
table_insert_row(tbody, document.createTextNode("Solution"), [elem]);
|
||||
this.captcha_solution = elem;
|
||||
table.appendChild(tbody);
|
||||
this.elem.appendChild(table);
|
||||
}
|
||||
|
||||
ReplyBox.prototype.result = function(msg, color) {
|
||||
var self = this;
|
||||
self._error.innerHTML = "";
|
||||
$(self._error).css("color", color);
|
||||
self._error.appendChild(document.createTextNode(msg));
|
||||
setTimeout(function() {
|
||||
$(self._error).fadeout(1000, function() {
|
||||
self._error.innerHTML = "";
|
||||
});
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
|
||||
ReplyBox.prototype.makePost = function(info) {
|
||||
var self = this;
|
||||
var data = new FormData();
|
||||
data.append("name", self.name.value);
|
||||
data.append("subject", self.subject.value);
|
||||
data.append("captcha", self.captcha_solution.value);
|
||||
data.append("message", self.message.value);
|
||||
$(self.files.files).each(function(_, f) {
|
||||
data.append("attachment_uploaded", f);
|
||||
});
|
||||
data.append("reference", info.reference);
|
||||
return data;
|
||||
}
|
||||
|
||||
ReplyBox.prototype.clear = function() {
|
||||
var self = this;
|
||||
self.name.value = "";
|
||||
self.subject.value = "";
|
||||
self.message.value = "";
|
||||
self.captcha_solution.value = "";
|
||||
}
|
||||
|
||||
ReplyBox.prototype.reload = function() {
|
||||
self.captcha_img.src = "/captcha/img?" + new Date().getTime();
|
||||
}
|
||||
|
||||
ReplyBox.prototype.show = function(info) {
|
||||
var self = this;
|
||||
$(self.elem).css("display", "inline-block");
|
||||
self.submit.onclick = function(ev) {
|
||||
$.ajax({
|
||||
data: self.makePost(info),
|
||||
url: info.url,
|
||||
method: "POST",
|
||||
dataType: "json"
|
||||
}).success(function(data, status, xhr) {
|
||||
if(xhr.statusCode == 201) {
|
||||
self.result("posted as "+data.message_id, "green");
|
||||
self.clear();
|
||||
self.submit.onclick = function(ev) {};
|
||||
} else {
|
||||
self.result("error: " + data.error, "red");
|
||||
}
|
||||
}).fail(function() {
|
||||
self.result("request failed", "red");
|
||||
}).done(function() {
|
||||
self.reload();
|
||||
});
|
||||
};
|
||||
}
|
||||
|
||||
ReplyBox.prototype.hide = function() {
|
||||
var self = this;
|
||||
$(self.elem).css("display", "none");
|
||||
self.submit.onclick = function(ev) {};
|
||||
}
|
||||
|
||||
onready(function(){
|
||||
var replyBox = new ReplyBox();
|
||||
replyBox.hide();
|
||||
$(".post").each(function(_, elem) {
|
||||
var replyInfo = {
|
||||
url: (prefix || "/") + "post/" + elem.dataset.newsgroup + "/json",
|
||||
reference: elem.dataset.rootmsgid,
|
||||
board: elem.dataset.newsgroup,
|
||||
elem: elem
|
||||
};
|
||||
var elems = elem.getElementsByClassName("postreply");
|
||||
if(elems && elems[0]) {
|
||||
var e = elems[0].children[1];
|
||||
e.onclick = function(ev) {
|
||||
if(!replyInfo.show) {
|
||||
// is hidden, show reply
|
||||
replyBox.show(replyInfo);
|
||||
} else {
|
||||
// is open, hide reply
|
||||
replyBox.hide();
|
||||
}
|
||||
replyInfo.show = ! replyInfo.show;
|
||||
}
|
||||
}
|
||||
});
|
||||
});
|
Reference in New Issue
Block a user