From 2c5f231e439dac3fc68422fbb1c8ec57e9d8b35d Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Mon, 13 Aug 2012 19:52:34 +0400 Subject: [PATCH] add special indication for categories having unread items in child categories --- classes/pref_feeds.php | 3 +++ include/functions.php | 28 +++++++++++++++++++++++++++- js/FeedTree.js | 27 +++++++++++++++++++++++++-- js/feedlist.js | 16 ++++++++++++++++ 4 files changed, 71 insertions(+), 3 deletions(-) diff --git a/classes/pref_feeds.php b/classes/pref_feeds.php index a6760b9e..c87b0e54 100644 --- a/classes/pref_feeds.php +++ b/classes/pref_feeds.php @@ -50,6 +50,7 @@ class Pref_Feeds extends Protected_Handler { $cat['hidden'] = sql_bool_to_bool($line['collapsed']); $cat['type'] = 'category'; $cat['unread'] = 0; + $cat['child_unread'] = 0; $cat['items'] = $this->get_category_items($line['id']); @@ -167,6 +168,7 @@ class Pref_Feeds extends Protected_Handler { $cat['hidden'] = sql_bool_to_bool($line['collapsed']); $cat['type'] = 'category'; $cat['unread'] = 0; + $cat['child_unread'] = 0; $cat['items'] = $this->get_category_items($line['id']); @@ -189,6 +191,7 @@ class Pref_Feeds extends Protected_Handler { $cat['type'] = 'category'; $cat['checkbox'] = false; $cat['unread'] = 0; + $cat['child_unread'] = 0; $feed_result = db_query($this->link, "SELECT id, title,last_error, ".SUBSTRING_FOR_DATE."(last_updated,1,19) AS last_updated diff --git a/include/functions.php b/include/functions.php index 009955c9..b2319e6e 100644 --- a/include/functions.php +++ b/include/functions.php @@ -1501,7 +1501,9 @@ array_push($ret_arr, $cv); - $result = db_query($link, "SELECT id AS cat_id, value AS unread + $result = db_query($link, "SELECT id AS cat_id, value AS unread, + (SELECT COUNT(id) FROM ttrss_feed_categories AS c2 + WHERE c2.parent_cat = ttrss_feed_categories.id) AS num_children FROM ttrss_feed_categories, ttrss_cat_counters_cache WHERE ttrss_cat_counters_cache.feed_id = id AND ttrss_feed_categories.owner_uid = " . $_SESSION["uid"]); @@ -1509,7 +1511,14 @@ while ($line = db_fetch_assoc($result)) { $line["cat_id"] = (int) $line["cat_id"]; + if ($line["num_children"] > 0) { + $child_counter = getCategoryUnreadRecursive($link, $line["cat_id"], $_SESSION["uid"]); + } else { + $child_counter = 0; + } + $cv = array("id" => $line["cat_id"], "kind" => "cat", + "child_counter" => $child_counter, "counter" => $line["unread"]); array_push($ret_arr, $cv); @@ -1525,6 +1534,23 @@ return $ret_arr; } + // only accepts real cats (>= 0) + function getCategoryUnreadRecursive($link, $cat, $owner_uid = false) { + if (!$owner_uid) $owner_uid = $_SESSION["uid"]; + + $result = db_query($link, "SELECT id FROM ttrss_feed_categories WHERE parent_cat = '$cat' + AND owner_uid = $owner_uid"); + + $unread = 0; + + while ($line = db_fetch_assoc($result)) { + $unread += getCategoryUnread($link, $line["id"], $owner_uid); + $unread += getCategoryUnreadRecursive($link, $line["id"], $owner_uid); + } + + return $unread; + } + function getCategoryUnread($link, $cat, $owner_uid = false) { if (!$owner_uid) $owner_uid = $_SESSION["uid"]; diff --git a/js/FeedTree.js b/js/FeedTree.js index 30e62501..b39e7286 100644 --- a/js/FeedTree.js +++ b/js/FeedTree.js @@ -120,6 +120,14 @@ dojo.declare("fox.FeedTree", dijit.Tree, { dojo.place(span, tnode.iconNode, 'replace'); } + if (id.match("CAT:") && bare_id > 0) { + param = dojo.doc.createElement('span'); + param.className = 'feedParam'; + param.innerHTML = ""; + dojo.place(param, tnode.labelNode, 'after'); + tnode._paramNode = param; + } + if (id.match("FEED:") && bare_id > 0) { var menu = new dijit.Menu(); menu.row_id = bare_id; @@ -183,11 +191,15 @@ dojo.declare("fox.FeedTree", dijit.Tree, { name = name.replace(/</g, "<"); name = name.replace(/>/g, ">"); + var label; + if (item.unread > 0) { - return name + " (" + item.unread + ")"; + label = name + " (" + item.unread + ")"; } else { - return name; + label = name; } + + return label; }, selectFeed: function(feed, is_cat) { if (is_cat) @@ -443,4 +455,15 @@ dojo.declare("fox.FeedTree", dijit.Tree, { return false; } }, + setCatParam: function(cat, value) { + var treeNode = this._itemNodesMap['CAT:' + cat]; + + if (treeNode && treeNode[0] && treeNode[0]._paramNode) { + if (value > 0) + treeNode[0]._paramNode.innerHTML = '+' + value; + else + treeNode[0]._paramNode.innerHTML = ""; + } + this.model.setFeedValue(cat, true, 'child_unread', value); + }, }); diff --git a/js/feedlist.js b/js/feedlist.js index 13cdc269..18d4a977 100644 --- a/js/feedlist.js +++ b/js/feedlist.js @@ -286,6 +286,7 @@ function parse_counters(elems, scheduled_call) { var error = elems[l].error; var has_img = elems[l].has_img; var updated = elems[l].updated; + var child_unread = parseInt(elems[l].child_counter); if (id == "global-unread") { global_unread = ctr; @@ -322,6 +323,8 @@ function parse_counters(elems, scheduled_call) { setFeedIcon(id, false, 'images/blank_icon.gif'); } } + } else { + setCatParam(id, child_unread); } } @@ -411,6 +414,19 @@ function setFeedValue(feed, is_cat, key, value) { } } +function setCatParam(cat, value) { + try { + var tree = dijit.byId("feedTree"); + + if (tree && tree.model) + return tree.setCatParam(cat, value); + + } catch (e) { + // + } +} + + function selectFeed(feed, is_cat) { try { var tree = dijit.byId("feedTree"); -- 2.39.2