sync modified scores via mutation observer

This commit is contained in:
Andrew Dolgov 2018-12-11 10:30:32 +03:00
parent 25ca144bb7
commit f3c04fc5d8
3 changed files with 51 additions and 42 deletions

View File

@ -342,8 +342,6 @@ class Feeds extends Handler_Protected {
$line['imported'] = T_sprintf("Imported at %s", $line['imported'] = T_sprintf("Imported at %s",
make_local_datetime($line["date_entered"], false)); make_local_datetime($line["date_entered"], false));
$score = $line["score"];
if ($line["tag_cache"]) if ($line["tag_cache"])
$tags = explode(",", $line["tag_cache"]); $tags = explode(",", $line["tag_cache"]);
else else
@ -372,7 +370,8 @@ class Feeds extends Handler_Protected {
/* we don't need those */ /* we don't need those */
foreach (["date_entered", "guid", "last_published", "last_marked", "tag_cache", "favicon_avg_color", "uuid", "label_cache"] as $k) foreach (["date_entered", "guid", "last_published", "last_marked", "tag_cache", "favicon_avg_color",
"uuid", "label_cache", "yyiw"] as $k)
unset($line[$k]); unset($line[$k]);
array_push($reply['content'], $line); array_push($reply['content'], $line);

View File

@ -30,37 +30,27 @@ define(["dojo/_base/declare"], function (declare) {
const ids = Headlines.getSelected(); const ids = Headlines.getSelected();
if (ids.length > 0) { if (ids.length > 0) {
console.log(ids);
const score = prompt(__("Please enter new score for selected articles:")); const score = prompt(__("Please enter new score for selected articles:"));
if (score != undefined) { if (parseInt(score) != undefined) {
const query = { ids.each((id) => {
op: "article", method: "setScore", id: ids.toString(),
score: score
};
xhrJson("backend.php", query, (reply) => {
if (reply) {
reply.id.each((id) => {
const row = $("RROW-" + id); const row = $("RROW-" + id);
["score-low", "score-high", "score-half-low", "score-half-high", "score-neutral"]
.each(function(scl) {
row.removeClassName(scl);
});
row.addClassName(Article.getScoreClass(reply['score']));
if (row) { if (row) {
row.setAttribute("data-score", reply["score"]); row.setAttribute("data-score", score);
const pic = row.select(".icon-score")[0]; const pic = row.select(".icon-score")[0];
pic.innerHTML = reply["score_pic"]; pic.innerHTML = Article.getScorePic(score);
pic.setAttribute("title", reply["score"]); pic.setAttribute("title", score);
}
["score-low", "score-high", "score-half-low", "score-half-high", "score-neutral"]
.each(function(scl) {
if (row.hasClassName(scl))
row.removeClassName(scl);
}); });
row.addClassName(Article.getScoreClass(score));
} }
}); });
} }
@ -71,26 +61,27 @@ define(["dojo/_base/declare"], function (declare) {
}, },
setScore: function (id, pic) { setScore: function (id, pic) {
const row = pic.up("div[id*=RROW]"); const row = pic.up("div[id*=RROW]");
const score = row.getAttribute("data-score");
const new_score = prompt(__("Please enter new score for this article:"), score); if (row) {
const score_old = row.getAttribute("data-score");
const score = prompt(__("Please enter new score for this article:"), score_old);
if (row && new_score != undefined) { if (parseInt(score) != undefined) {
const query = {op: "article", method: "setScore", id: id, score: new_score}; row.setAttribute("data-score", score);
xhrJson("backend.php", query, (reply) => { const pic = row.select(".icon-score")[0];
if (reply) {
pic.innerHTML = reply["score_pic"]; pic.innerHTML = Article.getScorePic(score);
row.setAttribute("title", new_score); pic.setAttribute("title", score);
["score-low", "score-high", "score-half-low", "score-half-high", "score-neutral"] ["score-low", "score-high", "score-half-low", "score-half-high", "score-neutral"]
.each(function(scl) { .each(function(scl) {
if (row.hasClassName(scl))
row.removeClassName(scl); row.removeClassName(scl);
}); });
row.addClassName(Article.getScoreClass(reply['score'])); row.addClassName(Article.getScoreClass(score));
} }
});
} }
}, },
cdmUnsetActive: function (event) { cdmUnsetActive: function (event) {

View File

@ -10,7 +10,7 @@ define(["dojo/_base/declare"], function (declare) {
const modified = []; const modified = [];
mutations.each((m) => { mutations.each((m) => {
if (m.type == 'attributes' && m.attributeName == 'class') { if (m.type == 'attributes' && ['class', 'data-score'].indexOf(m.attributeName) != -1) {
const row = m.target; const row = m.target;
const id = row.getAttribute("data-article-id"); const id = row.getAttribute("data-article-id");
@ -29,6 +29,8 @@ define(["dojo/_base/declare"], function (declare) {
hl.selected = row.hasClassName("Selected"); hl.selected = row.hasClassName("Selected");
hl.active = row.hasClassName("active"); hl.active = row.hasClassName("active");
hl.score = row.getAttribute("data-score");
modified.push({id: hl.id, new: hl, old: hl_old, row: row}); modified.push({id: hl.id, new: hl, old: hl_old, row: row});
} }
} }
@ -52,6 +54,7 @@ define(["dojo/_base/declare"], function (declare) {
deselect: [], deselect: [],
activate: [], activate: [],
deactivate: [], deactivate: [],
rescore: {},
}; };
modified.each(function(m) { modified.each(function(m) {
@ -69,6 +72,13 @@ define(["dojo/_base/declare"], function (declare) {
if (m.old.active != m.new.active) if (m.old.active != m.new.active)
m.new.active ? ops.activate.push(m.row) : ops.deactivate.push(m.row); m.new.active ? ops.activate.push(m.row) : ops.deactivate.push(m.row);
if (m.old.score != m.new.score) {
const score = m.new.score;
ops.rescore[score] = ops.rescore[score] || [];
ops.rescore[score].push(m.id);
}
}); });
ops.select.each((row) => { ops.select.each((row) => {
@ -117,6 +127,15 @@ define(["dojo/_base/declare"], function (declare) {
promises.push(xhrPost("backend.php", promises.push(xhrPost("backend.php",
{ op: "rpc", method: "catchupSelected", ids: ops.unread.toString(), cmode: 1})); { op: "rpc", method: "catchupSelected", ids: ops.unread.toString(), cmode: 1}));
const scores = Object.keys(ops.rescore);
if (scores.length != 0) {
scores.each((score) => {
promises.push(xhrPost("backend.php",
{ op: "article", method: "setScore", id: ops.rescore[score].toString(), score: score }));
});
}
if (promises.length > 0) if (promises.length > 0)
Promise.all([promises]).then(() => { Promise.all([promises]).then(() => {
Feeds.requestCounters(true); Feeds.requestCounters(true);