1
0
mirror of https://tt-rss.org/git/tt-rss.git synced 2024-06-26 11:59:02 +02:00

use xhrPost is even more places!

This commit is contained in:
Andrew Dolgov 2018-11-30 09:23:51 +03:00
parent 3ad9944d5e
commit fc0a3050eb
3 changed files with 257 additions and 325 deletions

View File

@ -1711,11 +1711,11 @@ class Pref_Feeds extends Handler_Protected {
function regenFeedKey() { function regenFeedKey() {
$feed_id = clean($_REQUEST['id']); $feed_id = clean($_REQUEST['id']);
$is_cat = clean($_REQUEST['is_cat']) == "true"; $is_cat = clean($_REQUEST['is_cat']);
$new_key = $this->update_feed_access_key($feed_id, $is_cat); $new_key = $this->update_feed_access_key($feed_id, $is_cat);
print json_encode(array("link" => $new_key)); print json_encode(["link" => $new_key]);
} }
@ -1725,7 +1725,7 @@ class Pref_Feeds extends Handler_Protected {
// clear old value and generate new one // clear old value and generate new one
$sth = $this->pdo->prepare("DELETE FROM ttrss_access_keys $sth = $this->pdo->prepare("DELETE FROM ttrss_access_keys
WHERE feed_id = ? AND is_cat = ? AND owner_uid = ?"); WHERE feed_id = ? AND is_cat = ? AND owner_uid = ?");
$sth->execute([$feed_id, $is_cat, $owner_uid]); $sth->execute([$feed_id, bool_to_sql_bool($is_cat), $owner_uid]);
return get_feed_access_key($feed_id, $is_cat, $owner_uid); return get_feed_access_key($feed_id, $is_cat, $owner_uid);
} }

View File

@ -2093,7 +2093,7 @@
$sth = $pdo->prepare("SELECT access_key FROM ttrss_access_keys $sth = $pdo->prepare("SELECT access_key FROM ttrss_access_keys
WHERE feed_id = ? AND is_cat = ? WHERE feed_id = ? AND is_cat = ?
AND owner_uid = ?"); AND owner_uid = ?");
$sth->execute([$feed_id, (int)$is_cat, $owner_uid]); $sth->execute([$feed_id, $is_cat, $owner_uid]);
if ($row = $sth->fetch()) { if ($row = $sth->fetch()) {
return $row["access_key"]; return $row["access_key"];
@ -2104,7 +2104,7 @@
(access_key, feed_id, is_cat, owner_uid) (access_key, feed_id, is_cat, owner_uid)
VALUES (?, ?, ?, ?)"); VALUES (?, ?, ?, ?)");
$sth->execute([$key, $feed_id, (int)$is_cat, $owner_uid]); $sth->execute([$key, $feed_id, $is_cat, $owner_uid]);
return $key; return $key;
} }

View File

@ -336,15 +336,12 @@ function displayDlg(title, id, param, callback) {
notify_progress("Loading, please wait...", true); notify_progress("Loading, please wait...", true);
const query = "?op=dlg&method=" + const query = { op: "dlg", method: id, param: param };
param_escape(id) + "&param=" + param_escape(param);
new Ajax.Request("backend.php", { xhrPost("backend.php", query, (transport) => {
parameters: query, infobox_callback2(transport, title);
onComplete: function (transport) { if (callback) callback(transport);
infobox_callback2(transport, title); });
if (callback) callback(transport);
} });
return false; return false;
} }
@ -527,22 +524,19 @@ function uploadIconHandler(rc) {
function removeFeedIcon(id) { function removeFeedIcon(id) {
if (confirm(__("Remove stored feed icon?"))) { if (confirm(__("Remove stored feed icon?"))) {
const query = "backend.php?op=pref-feeds&method=removeicon&feed_id=" + param_escape(id);
console.log(query);
notify_progress("Removing feed icon...", true); notify_progress("Removing feed icon...", true);
new Ajax.Request("backend.php", { const query = { op: "pref-feeds", method: "removeicon", feed_id: id };
parameters: query,
onComplete: function(transport) { xhrPost("backend.php", query, (transport) => {
notify_info("Feed icon removed."); notify_info("Feed icon removed.");
if (inPreferences()) { if (inPreferences()) {
updateFeedList(); updateFeedList();
} else { } else {
setTimeout('updateFeedList(false, false)', 50); setTimeout('updateFeedList(false, false)', 50);
} }
} }); });
} }
return false; return false;
@ -572,26 +566,22 @@ function addLabel(select, callback) {
return false; return false;
} }
let query = "?op=pref-labels&method=add&caption=" + const query = { op: "pref-labels", method: "add", caption: caption };
param_escape(caption);
if (select) if (select)
query += "&output=select"; Object.extend(query, {output: "select"});
notify_progress("Loading, please wait...", true); notify_progress("Loading, please wait...", true);
new Ajax.Request("backend.php", { xhrPost("backend.php", query, (transport) => {
parameters: query, if (callback) {
onComplete: function(transport) { callback(transport);
if (callback) { } else if (inPreferences()) {
callback(transport); updateLabelList();
} else if (inPreferences()) { } else {
updateLabelList(); updateFeedList();
} else { }
updateFeedList(); });
}
} });
} }
} }
@ -625,82 +615,78 @@ function quickAddFeed() {
Element.show("feed_add_spinner"); Element.show("feed_add_spinner");
Element.hide("fadd_error_message"); Element.hide("fadd_error_message");
new Ajax.Request("backend.php", { xhrPost("backend.php", this.attr('value'), (transport) => {
parameters: dojo.objectToQuery(this.attr('value')), try {
onComplete: function(transport) {
try {
try { try {
var reply = JSON.parse(transport.responseText); var reply = JSON.parse(transport.responseText);
} catch (e) { } catch (e) {
Element.hide("feed_add_spinner"); Element.hide("feed_add_spinner");
alert(__("Failed to parse output. This can indicate server timeout and/or network issues. Backend output was logged to browser console.")); alert(__("Failed to parse output. This can indicate server timeout and/or network issues. Backend output was logged to browser console."));
console.log('quickAddFeed, backend returned:' + transport.responseText); console.log('quickAddFeed, backend returned:' + transport.responseText);
return; return;
} }
const rc = reply['result']; const rc = reply['result'];
notify(''); notify('');
Element.hide("feed_add_spinner"); Element.hide("feed_add_spinner");
console.log(rc); console.log(rc);
switch (parseInt(rc['code'])) { switch (parseInt(rc['code'])) {
case 1: case 1:
dialog.hide(); dialog.hide();
notify_info(__("Subscribed to %s").replace("%s", feed_url)); notify_info(__("Subscribed to %s").replace("%s", feed_url));
updateFeedList(); updateFeedList();
break; break;
case 2: case 2:
dialog.show_error(__("Specified URL seems to be invalid.")); dialog.show_error(__("Specified URL seems to be invalid."));
break; break;
case 3: case 3:
dialog.show_error(__("Specified URL doesn't seem to contain any feeds.")); dialog.show_error(__("Specified URL doesn't seem to contain any feeds."));
break; break;
case 4: case 4:
var feeds = rc['feeds']; const feeds = rc['feeds'];
Element.show("fadd_multiple_notify"); Element.show("fadd_multiple_notify");
var select = dijit.byId("feedDlg_feedContainerSelect"); const select = dijit.byId("feedDlg_feedContainerSelect");
while (select.getOptions().length > 0) while (select.getOptions().length > 0)
select.removeOption(0); select.removeOption(0);
select.addOption({value: '', label: __("Expand to select feed")}); select.addOption({value: '', label: __("Expand to select feed")});
var count = 0; let count = 0;
for (const feedUrl in feeds) { for (const feedUrl in feeds) {
select.addOption({value: feedUrl, label: feeds[feedUrl]}); select.addOption({value: feedUrl, label: feeds[feedUrl]});
count++; count++;
} }
Effect.Appear('feedDlg_feedsContainer', {duration : 0.5}); Effect.Appear('feedDlg_feedsContainer', {duration : 0.5});
break; break;
case 5: case 5:
dialog.show_error(__("Couldn't download the specified URL: %s"). dialog.show_error(__("Couldn't download the specified URL: %s").
replace("%s", rc['message'])); replace("%s", rc['message']));
break; break;
case 6: case 6:
dialog.show_error(__("XML validation failed: %s"). dialog.show_error(__("XML validation failed: %s").
replace("%s", rc['message'])); replace("%s", rc['message']));
break; break;
case 0: case 0:
dialog.show_error(__("You are already subscribed to this feed.")); dialog.show_error(__("You are already subscribed to this feed."));
break; break;
} }
} catch (e) { } catch (e) {
console.error(transport.responseText); console.error(transport.responseText);
exception_error(e); exception_error(e);
} }
});
} }); }
}
}, },
href: query}); href: query});
@ -712,43 +698,38 @@ function createNewRuleElement(parentNode, replaceNode) {
//form.reg_exp.value = form.reg_exp.value.replace(/(<([^>]+)>)/ig,""); //form.reg_exp.value = form.reg_exp.value.replace(/(<([^>]+)>)/ig,"");
const query = "backend.php?op=pref-filters&method=printrulename&rule="+ const query = { op: "pref-filters", method: "printrulename", rule: dojo.formToJson(form) };
param_escape(dojo.formToJson(form));
console.log(query); xhrPost("backend.php", query, (transport) => {
try {
const li = dojo.create("li");
new Ajax.Request("backend.php", { const cb = dojo.create("input", { type: "checkbox" }, li);
parameters: query,
onComplete: function (transport) {
try {
const li = dojo.create("li");
const cb = dojo.create("input", { type: "checkbox" }, li); new dijit.form.CheckBox({
onChange: function() {
toggleSelectListRow2(this) },
}, cb);
new dijit.form.CheckBox({ dojo.create("input", { type: "hidden",
onChange: function() { name: "rule[]",
toggleSelectListRow2(this) }, value: dojo.formToJson(form) }, li);
}, cb);
dojo.create("input", { type: "hidden", dojo.create("span", {
name: "rule[]", onclick: function() {
value: dojo.formToJson(form) }, li); dijit.byId('filterEditDlg').editRule(this);
},
innerHTML: transport.responseText }, li);
dojo.create("span", { if (replaceNode) {
onclick: function() { parentNode.replaceChild(li, replaceNode);
dijit.byId('filterEditDlg').editRule(this); } else {
}, parentNode.appendChild(li);
innerHTML: transport.responseText }, li);
if (replaceNode) {
parentNode.replaceChild(li, replaceNode);
} else {
parentNode.appendChild(li);
}
} catch (e) {
exception_error(e);
} }
} }); } catch (e) {
exception_error(e);
}
});
} }
function createNewActionElement(parentNode, replaceNode) { function createNewActionElement(parentNode, replaceNode) {
@ -760,44 +741,40 @@ function createNewActionElement(parentNode, replaceNode) {
form.action_param.value = form.action_param_plugin.value; form.action_param.value = form.action_param_plugin.value;
} }
const query = "backend.php?op=pref-filters&method=printactionname&action="+ const query = { op: "pref-filters", method: "printactionname",
param_escape(dojo.formToJson(form)); action: dojo.formToJson(form) };
console.log(query); xhrPost("backend.php", query, (transport) => {
try {
const li = dojo.create("li");
new Ajax.Request("backend.php", { const cb = dojo.create("input", { type: "checkbox" }, li);
parameters: query,
onComplete: function (transport) {
try {
const li = dojo.create("li");
const cb = dojo.create("input", { type: "checkbox" }, li); new dijit.form.CheckBox({
onChange: function() {
toggleSelectListRow2(this) },
}, cb);
new dijit.form.CheckBox({ dojo.create("input", { type: "hidden",
onChange: function() { name: "action[]",
toggleSelectListRow2(this) }, value: dojo.formToJson(form) }, li);
}, cb);
dojo.create("input", { type: "hidden", dojo.create("span", {
name: "action[]", onclick: function() {
value: dojo.formToJson(form) }, li); dijit.byId('filterEditDlg').editAction(this);
},
innerHTML: transport.responseText }, li);
dojo.create("span", { if (replaceNode) {
onclick: function() { parentNode.replaceChild(li, replaceNode);
dijit.byId('filterEditDlg').editAction(this); } else {
}, parentNode.appendChild(li);
innerHTML: transport.responseText }, li);
if (replaceNode) {
parentNode.replaceChild(li, replaceNode);
} else {
parentNode.appendChild(li);
}
} catch (e) {
exception_error(e);
} }
} });
} catch (e) {
exception_error(e);
}
});
} }
@ -858,72 +835,70 @@ function editFilterTest(query) {
limit: 100, limit: 100,
max_offset: 10000, max_offset: 10000,
getTestResults: function(query, offset) { getTestResults: function(query, offset) {
const updquery = query + "&offset=" + offset + "&limit=" + test_dlg.limit; const updquery = query + "&offset=" + offset + "&limit=" + test_dlg.limit;
console.log("getTestResults:" + offset); console.log("getTestResults:" + offset);
new Ajax.Request("backend.php", { xhrPost("backend.php", updquery, (transport) => {
parameters: updquery, try {
onComplete: function (transport) { const result = JSON.parse(transport.responseText);
try {
const result = JSON.parse(transport.responseText);
if (result && dijit.byId("filterTestDlg") && dijit.byId("filterTestDlg").open) { if (result && dijit.byId("filterTestDlg") && dijit.byId("filterTestDlg").open) {
test_dlg.results += result.length; test_dlg.results += result.length;
console.log("got results:" + result.length); console.log("got results:" + result.length);
$("prefFilterProgressMsg").innerHTML = __("Looking for articles (%d processed, %f found)...") $("prefFilterProgressMsg").innerHTML = __("Looking for articles (%d processed, %f found)...")
.replace("%f", test_dlg.results) .replace("%f", test_dlg.results)
.replace("%d", offset); .replace("%d", offset);
console.log(offset + " " + test_dlg.max_offset); console.log(offset + " " + test_dlg.max_offset);
for (let i = 0; i < result.length; i++) { for (let i = 0; i < result.length; i++) {
const tmp = new Element("table"); const tmp = new Element("table");
tmp.innerHTML = result[i]; tmp.innerHTML = result[i];
dojo.parser.parse(tmp); dojo.parser.parse(tmp);
$("prefFilterTestResultList").innerHTML += tmp.innerHTML; $("prefFilterTestResultList").innerHTML += tmp.innerHTML;
} }
if (test_dlg.results < 30 && offset < test_dlg.max_offset) { if (test_dlg.results < 30 && offset < test_dlg.max_offset) {
// get the next batch // get the next batch
window.setTimeout(function () { window.setTimeout(function () {
test_dlg.getTestResults(query, offset + test_dlg.limit); test_dlg.getTestResults(query, offset + test_dlg.limit);
}, 0); }, 0);
} else { } else {
// all done // all done
Element.hide("prefFilterLoadingIndicator");
if (test_dlg.results == 0) {
$("prefFilterTestResultList").innerHTML = "<tr><td align='center'>No recent articles matching this filter have been found.</td></tr>";
$("prefFilterProgressMsg").innerHTML = "Articles matching this filter:";
} else {
$("prefFilterProgressMsg").innerHTML = __("Found %d articles matching this filter:")
.replace("%d", test_dlg.results);
}
}
} else if (!result) {
console.log("getTestResults: can't parse results object");
Element.hide("prefFilterLoadingIndicator"); Element.hide("prefFilterLoadingIndicator");
notify_error("Error while trying to get filter test results."); if (test_dlg.results == 0) {
$("prefFilterTestResultList").innerHTML = "<tr><td align='center'>No recent articles matching this filter have been found.</td></tr>";
$("prefFilterProgressMsg").innerHTML = "Articles matching this filter:";
} else {
$("prefFilterProgressMsg").innerHTML = __("Found %d articles matching this filter:")
.replace("%d", test_dlg.results);
}
} else {
console.log("getTestResults: dialog closed, bailing out.");
} }
} catch (e) {
exception_error(e);
}
} }); } else if (!result) {
console.log("getTestResults: can't parse results object");
Element.hide("prefFilterLoadingIndicator");
notify_error("Error while trying to get filter test results.");
} else {
console.log("getTestResults: dialog closed, bailing out.");
}
} catch (e) {
exception_error(e);
}
});
}, },
href: query}); href: query});
@ -1005,17 +980,13 @@ function quickAddFilter() {
const query = dojo.formToQuery("filter_new_form"); const query = dojo.formToQuery("filter_new_form");
console.log(query); xhrPost("backend.php", query, (transport) => {
if (inPreferences()) {
updateFilterList();
}
new Ajax.Request("backend.php", { dialog.hide();
parameters: query, });
onComplete: function (transport) {
if (inPreferences()) {
updateFilterList();
}
dialog.hide();
} });
} }
}, },
href: query}); href: query});
@ -1037,11 +1008,9 @@ function quickAddFilter() {
} else { } else {
const query = "op=rpc&method=getlinktitlebyid&id=" + getActiveArticleId(); const query = { op: "rpc", method: "getlinktitlebyid", id: getActiveArticleId() };
new Ajax.Request("backend.php", { xhrPost("backend.php", query, (transport) => {
parameters: query,
onComplete: function(transport) {
const reply = JSON.parse(transport.responseText); const reply = JSON.parse(transport.responseText);
let title = false; let title = false;
@ -1059,11 +1028,8 @@ function quickAddFilter() {
addFilterRule(null, dojo.toJson(rule)); addFilterRule(null, dojo.toJson(rule));
} }
});
} });
} }
}); });
} }
@ -1078,24 +1044,20 @@ function unsubscribeFeed(feed_id, title) {
if (title == undefined || confirm(msg)) { if (title == undefined || confirm(msg)) {
notify_progress("Removing feed..."); notify_progress("Removing feed...");
const query = "?op=pref-feeds&quiet=1&method=remove&ids=" + feed_id; const query = { op: "pref-feeds", quiet: 1, method: "remove", ids: feed_id };
new Ajax.Request("backend.php", { xhrPost("backend.php", query, (transport) => {
parameters: query, if (dijit.byId("feedEditDlg")) dijit.byId("feedEditDlg").hide();
onComplete: function(transport) {
if (dijit.byId("feedEditDlg")) dijit.byId("feedEditDlg").hide(); if (inPreferences()) {
updateFeedList();
} else {
if (feed_id == getActiveFeedId())
setTimeout(function() { viewfeed({feed:-5}) }, 100);
if (inPreferences()) { if (feed_id < 0) updateFeedList();
updateFeedList(); }
} else { });
if (feed_id == getActiveFeedId())
setTimeout(function() { viewfeed({feed:-5}) }, 100);
if (feed_id < 0) updateFeedList();
}
} });
} }
return false; return false;
@ -1145,33 +1107,27 @@ function genUrlChangeKey(feed, is_cat) {
notify_progress("Trying to change address...", true); notify_progress("Trying to change address...", true);
const query = "?op=pref-feeds&method=regenFeedKey&id=" + param_escape(feed) + const query = { op: "pref-feeds", method: "regenFeedKey", id: feed, is_cat: is_cat };
"&is_cat=" + param_escape(is_cat);
new Ajax.Request("backend.php", { xhrJson("backend.php", query, (reply) => {
parameters: query, const new_link = reply.link;
onComplete: function(transport) { const e = $('gen_feed_url');
const reply = JSON.parse(transport.responseText);
const new_link = reply.link;
const e = $('gen_feed_url'); if (new_link) {
e.innerHTML = e.innerHTML.replace(/\&amp;key=.*$/,
"&amp;key=" + new_link);
if (new_link) { e.href = e.href.replace(/\&key=.*$/,
"&key=" + new_link);
e.innerHTML = e.innerHTML.replace(/\&amp;key=.*$/, new Effect.Highlight(e);
"&amp;key=" + new_link);
e.href = e.href.replace(/\&key=.*$/, notify('');
"&key=" + new_link);
new Effect.Highlight(e); } else {
notify_error("Could not change feed URL.");
notify(''); }
});
} else {
notify_error("Could not change feed URL.");
}
} });
} }
return false; return false;
} }
@ -1267,17 +1223,13 @@ function editFeed(feed) {
style: "width: 600px", style: "width: 600px",
execute: function() { execute: function() {
if (this.validate()) { if (this.validate()) {
// console.log(dojo.objectToQuery(this.attr('value')));
notify_progress("Saving data...", true); notify_progress("Saving data...", true);
new Ajax.Request("backend.php", { xhrPost("backend.php", dialog.attr('value'), (transport) => {
parameters: dojo.objectToQuery(dialog.attr('value')), dialog.hide();
onComplete: function(transport) { notify('');
dialog.hide(); updateFeedList();
notify(''); });
updateFeedList();
}});
} }
}, },
href: query}); href: query});
@ -1341,20 +1293,12 @@ function feedBrowser() {
notify_progress("Loading, please wait...", true); notify_progress("Loading, please wait...", true);
// we use dojo.toJson instead of JSON.stringify because const query = { op: "rpc", method: "massSubscribe",
// it somehow escapes everything TWICE, at least in Chrome 9 payload: JSON.stringify(selected), mode: mode };
const query = "?op=rpc&method=massSubscribe&payload=" + xhrPost("backend.php", query, () => {
param_escape(dojo.toJson(selected)) + "&mode=" + param_escape(mode); notify('');
updateFeedList();
console.log(query);
new Ajax.Request("backend.php", {
parameters: query,
onComplete: function (transport) {
notify('');
updateFeedList();
}
}); });
} else { } else {
@ -1363,32 +1307,26 @@ function feedBrowser() {
}, },
update: function () { update: function () {
const query = dojo.objectToQuery(dialog.attr('value'));
Element.show('feed_browser_spinner'); Element.show('feed_browser_spinner');
new Ajax.Request("backend.php", { xhrPost("backend.php", dialog.attr("value"), (transport) => {
parameters: query, notify('');
onComplete: function (transport) {
notify('');
Element.hide('feed_browser_spinner'); Element.hide('feed_browser_spinner');
const reply = JSON.parse(transport.responseText); const reply = JSON.parse(transport.responseText);
const mode = reply['mode']; const mode = reply['mode'];
if ($("browseFeedList") && reply['content']) { if ($("browseFeedList") && reply['content']) {
$("browseFeedList").innerHTML = reply['content']; $("browseFeedList").innerHTML = reply['content'];
} }
dojo.parser.parse("browseFeedList"); dojo.parser.parse("browseFeedList");
if (mode == 2) {
Element.show(dijit.byId('feed_archive_remove').domNode);
} else {
Element.hide(dijit.byId('feed_archive_remove').domNode);
}
if (mode == 2) {
Element.show(dijit.byId('feed_archive_remove').domNode);
} else {
Element.hide(dijit.byId('feed_archive_remove').domNode);
} }
}); });
}, },
@ -1402,15 +1340,10 @@ function feedBrowser() {
if (confirm(pr)) { if (confirm(pr)) {
Element.show('feed_browser_spinner'); Element.show('feed_browser_spinner');
const query = "?op=rpc&method=remarchive&ids=" + const query = { op: "rpc", method: "remarchive", ids: selected.toString() };
param_escape(selected.toString());
xhrPost("backend.php", query, () => {
new Ajax.Request("backend.php", { dialog.update();
parameters: query,
onComplete: function (transport) {
dialog.update();
}
}); });
} }
} }
@ -1450,16 +1383,14 @@ function showFeedsWithErrors() {
if (ok) { if (ok) {
notify_progress("Removing selected feeds...", true); notify_progress("Removing selected feeds...", true);
const query = "?op=pref-feeds&method=remove&ids="+ const query = { op: "pref-feeds", method: "remove",
param_escape(sel_rows.toString()); ids: sel_rows.toString() };
new Ajax.Request("backend.php", { xhrPost("backend.php", query, () => {
parameters: query, notify('');
onComplete: function(transport) { dialog.hide();
notify(''); updateFeedList();
dialog.hide(); });
updateFeedList();
} });
} }
} else { } else {
@ -1468,6 +1399,7 @@ function showFeedsWithErrors() {
}, },
execute: function() { execute: function() {
if (this.validate()) { if (this.validate()) {
//
} }
}, },
href: query}); href: query});