diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php index 8905012f6..711455de0 100644 --- a/modules/backend-rpc.php +++ b/modules/backend-rpc.php @@ -555,6 +555,11 @@ print __("Uncategorized"); print "]]>"; + print ""; + while ($line = db_fetch_assoc($result)) { print ""; var unread = get_local_feed_unread(-4); @@ -419,6 +421,10 @@ function render_offline_feedlist() { global_unread = unread; updateTitle(); + if (cats_enabled) { + tmp += printCategoryHeader(-1, getCookie("ttrss_vf_vclps"), false); + } + tmp += printFeedEntry(-4, __("All articles"), "feed", unread, "images/tag.png"); @@ -427,15 +433,27 @@ function render_offline_feedlist() { tmp += printFeedEntry(-1, __("Starred articles"), "feed", unread, "images/mark_set.png"); - tmp += "

  • "; + if (cats_enabled) { + tmp += ""; + } else { + tmp += "

  • "; + } /* var rs = db.execute("SELECT feeds.id,feeds.title,has_icon,COUNT(articles.id) "+ "FROM feeds LEFT JOIN articles ON (feed_id = feeds.id) "+ "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+ "ORDER BY feeds.title"); */ - var rs = db.execute("SELECT id,title,has_icon FROM feeds "+ - "ORDER BY title"); + var order_by = "feeds.title"; + + if (cats_enabled) order_by = "categories.title," + order_by; + + var rs = db.execute("SELECT "+ + "feeds.id,feeds.title,has_icon,cat_id,collapsed "+ + "FROM feeds,categories WHERE cat_id = categories.id "+ + "ORDER BY "+order_by); + + var tmp_cat_id = -1; while (rs.isValidRow()) { @@ -443,6 +461,16 @@ function render_offline_feedlist() { var title = rs.field(1); var has_icon = rs.field(2); var unread = get_local_feed_unread(id); + var cat_id = rs.field(3); + var cat_hidden = rs.field(4); + + if (cat_id != tmp_cat_id && cats_enabled) { + if (tmp_cat_id != -1) { + tmp += ""; + } + tmp += printCategoryHeader(cat_id, cat_hidden, false); + tmp_cat_id = cat_id; + } var icon = ""; @@ -450,7 +478,6 @@ function render_offline_feedlist() { icon = "icons/" + id + ".ico"; } - var feed_icon = ""; var row_class = "feed"; @@ -660,14 +687,24 @@ function update_offline_data(stage) { } } -function set_feedlist_counter(id, ctr) { +function set_feedlist_counter(id, ctr, is_cat) { try { var feedctr = document.getElementById("FEEDCTR-" + id); var feedu = document.getElementById("FEEDU-" + id); var feedr = document.getElementById("FEEDR-" + id); - if (feedctr && feedu && feedr) { + if (is_cat) { + var catctr = document.getElementById("FCATCTR-" + id); + if (catctr) { + catctr.innerHTML = "(" + ctr + ")"; + if (ctr > 0) { + catctr.className = "catCtrHasUnread"; + } else { + catctr.className = "catCtrNoUnread"; + } + } + } else if (feedctr && feedu && feedr) { var row_needs_hl = (ctr > 0 && ctr > parseInt(feedu.innerHTML)); @@ -713,15 +750,25 @@ function update_local_feedlist_counters() { "WHERE unread = 1 OR unread IS NULL GROUP BY feeds.id "+ "ORDER BY feeds.title"); */ - var rs = db.execute("SELECT id,title,has_icon FROM feeds "+ + var rs = db.execute("SELECT id FROM feeds "+ "ORDER BY title"); while (rs.isValidRow()) { var id = rs.field(0); var ctr = get_local_feed_unread(id); + set_feedlist_counter(id, ctr, false); + rs.next(); + } - set_feedlist_counter(id, ctr); + rs.close(); + var rs = db.execute("SELECT cat_id,SUM(unread) "+ + "FROM articles, feeds WHERE feeds.id = feed_id GROUP BY cat_id"); + + while (rs.isValidRow()) { + var id = rs.field(0); + var ctr = rs.field(1); + set_feedlist_counter(id, ctr, true); rs.next(); } @@ -840,3 +887,96 @@ function local_collapse_cat(id) { exception_error("local_collapse_cat", e); } } + +function get_local_category_title(id) { + try { + var rs = db.execute("SELECT title FROM categories WHERE id = ?", [id]); + var tmp = ""; + + if (rs.isValidRow()) { + tmp = rs.field(0); + } + + rs.close(); + + return tmp; + + } catch (e) { + exception_error("get_local_category_title", e); + } +} + +function get_local_category_unread(id) { + try { + var rs = db.execute("SELECT SUM(unread) FROM articles, feeds "+ + "WHERE feeds.id = feed_id AND cat_id = ?", + [id]); + + var tmp = 0; + + if (rs.isValidRow()) { + tmp = rs.field(0); + } + + rs.close(); + + return tmp; + + } catch (e) { + exception_error("get_local_category_unread", e); + } +} + +function printCategoryHeader(cat_id, hidden, can_browse) { + try { + if (hidden == undefined) hidden = false; + if (can_browse == undefined) can_browse = false; + + var tmp_category = get_local_category_title(cat_id); + var tmp = ""; + + var cat_unread = get_local_category_unread(cat_id); + + var holder_style = ""; + var ellipsis = ""; + + if (hidden) { + holder_style = "display:none;"; + ellipsis = "…"; + } + + var catctr_class = (cat_unread > 0) ? "catCtrHasUnread" : "catCtrNoUnread"; + + var browse_cat_link = ""; + var inner_title_class = "catTitleNL"; + + if (can_browse) { + browse_cat_link = "onclick=\"javascript:viewCategory($cat_id)\""; + inner_title_class = "catTitle"; + } + + var cat_class = "feedCat"; + + tmp += "
  • "+ + ""+tmp_category+""; + + tmp += ""; + + tmp += " ("+cat_unread+") "+ellipsis; + + tmp += ""; + + tmp += "