]> git.wh0rd.org - tt-rss.git/blobdiff - js/feedlist.js
fix infinite scrolling for search results
[tt-rss.git] / js / feedlist.js
index 75e97e884a6c402ad8e86f130aeae3900985c5e8..b737ba84a1ad899090bcd3fed3bc42912d8c73de 100644 (file)
@@ -1,6 +1,7 @@
 var _infscroll_disable = 0;
 var _infscroll_request_sent = 0;
 var _search_query = false;
+var _viewfeed_last = 0;
 
 var counter_timeout_id = false;
 
@@ -18,8 +19,9 @@ function loadMoreHeadlines() {
                var offset = 0;
 
                var view_mode = document.forms["main_toolbar_form"].view_mode.value;
-               var num_unread = $$("#headlines-frame > div[id*=RROW][class*=Unread]").length;
+               var unread_in_buffer = $$("#headlines-frame > div[id*=RROW][class*=Unread]").length;
                var num_all = $$("#headlines-frame > div[id*=RROW]").length;
+               var num_unread = getFeedUnread(getActiveFeedId(), activeFeedIsCat());
 
                // TODO implement marked & published
 
@@ -30,16 +32,20 @@ function loadMoreHeadlines() {
                        console.warn("loadMoreHeadlines: published is not implemented, falling back.");
                        offset = num_all;
                } else if (view_mode == "unread") {
-                       offset = num_unread;
+                       offset = unread_in_buffer;
+               } else if (_search_query) {
+                       offset = num_all;
                } else if (view_mode == "adaptive") {
                        if (num_unread > 0)
-                               offset = num_unread;
+                               offset = unread_in_buffer;
                        else
                                offset = num_all;
                } else {
                        offset = num_all;
                }
 
+               console.log("offset: " + offset);
+
                viewfeed(getActiveFeedId(), '', activeFeedIsCat(), offset, false, true);
 
        } catch (e) {
@@ -69,9 +75,12 @@ function viewfeed(feed, method, is_cat, offset, background, infscroll_req) {
                } else {
                        cached_headlines = cache_get("feed:" + feed + ":" + is_cat);
 
+                       if (_search_query) _search_query = false;
+
                        // switching to a different feed, we might as well catchup stuff visible
                        // in headlines buffer (if any)
-                       if (!background && isCdmMode() && getInitParam("cdm_auto_catchup") == 1 && parseInt(getActiveFeedId()) > 0) {
+                       // disabled for now because this behavior is considered confusing -fox
+                       /* if (!background && isCdmMode() && getInitParam("cdm_auto_catchup") == 1 && parseInt(getActiveFeedId()) > 0) {
 
                                $$("#headlines-frame > div[id*=RROW][class*=Unread]").each(
                                        function(child) {
@@ -97,7 +106,7 @@ function viewfeed(feed, method, is_cat, offset, background, infscroll_req) {
                                                }
 
                                        });
-                       }
+                       } */
                }
 
                if (offset == 0 && !background)
@@ -105,6 +114,8 @@ function viewfeed(feed, method, is_cat, offset, background, infscroll_req) {
                                dijit.byId("content-tabs").getChildren()[0]);
 
                if (!background) {
+                       _viewfeed_last = get_timestamp();
+
                        if (getActiveFeedId() != feed || offset == 0) {
                                active_post_id = 0;
                                _infscroll_disable = 0;
@@ -120,8 +131,7 @@ function viewfeed(feed, method, is_cat, offset, background, infscroll_req) {
                        }
 
                        if (offset != 0 && !method) {
-                               var date = new Date();
-                               var timestamp = Math.round(date.getTime() / 1000);
+                               var timestamp = get_timestamp();
 
                                if (_infscroll_request_sent && _infscroll_request_sent + 30 > timestamp) {
                                        //console.log("infscroll request in progress, aborting");
@@ -145,40 +155,7 @@ function viewfeed(feed, method, is_cat, offset, background, infscroll_req) {
                        if (_search_query) {
                                force_nocache = true;
                                query = query + "&" + _search_query;
-                               _search_query = false;
-                       }
-
-                       if (method == "MarkAllRead") {
-
-                               var show_next_feed = getInitParam("on_catchup_show_next_feed") == "1";
-
-                               if (show_next_feed) {
-                                       var nuf = getNextUnreadFeed(feed, is_cat);
-
-                                       if (nuf) {
-                                               var cached_nuf = cache_get("feed:" + nuf + ":false");
-
-                                               if (cached_nuf) {
-
-                                                       render_local_headlines(nuf, false, JSON.parse(cached_nuf));
-
-                                                       var catchup_query = "?op=rpc&method=catchupFeed&feed_id=" +
-                                                               feed + "&is_cat=" + is_cat;
-
-                                                       console.log(catchup_query);
-
-                                                       new Ajax.Request("backend.php", {
-                                                               parameters: catchup_query,
-                                                               onComplete: function(transport) {
-                                                                       handle_rpc_json(transport);
-                                                               } });
-
-                                                       return;
-                                               } else {
-                                                       query += "&nuf=" + param_escape(nuf);
-                                               }
-                                       }
-                               }
+                               //_search_query = false;
                        }
 
                        if (offset != 0) {
@@ -202,6 +179,7 @@ function viewfeed(feed, method, is_cat, offset, background, infscroll_req) {
                }
 
                query += "&cat=" + is_cat;
+               query += "&include_children=" + dijit.byId("include_children").attr("checked");
 
                console.log(query);
 
@@ -235,7 +213,7 @@ function feedlist_init() {
                hideOrShowFeeds(getInitParam("hide_read_feeds") == 1);
 
                setTimeout("timeout()", 5000);
-               setTimeout("precache_headlines_idle()", 3000);
+               setTimeout("precache_headlines_idle()", 15000);
 
        } catch (e) {
                exception_error("feedlist/init", e);
@@ -270,7 +248,7 @@ function request_counters() {
 
        try {
 
-               if (getInitParam("bw_limit") == "1") return;
+               //if (getInitParam("bw_limit") == "1") return;
 
                var date = new Date();
                var timestamp = Math.round(date.getTime() / 1000);
@@ -318,6 +296,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;
@@ -337,8 +316,11 @@ function parse_counters(elems, scheduled_call) {
                                displayNewContentPrompt(id);
                        }
 
-                       if (getFeedUnread(id, (kind == "cat")) != ctr)
+                       if (getFeedUnread(id, (kind == "cat")) != ctr ||
+                                       (kind == "cat" && getCatParam(id) != child_unread)) {
+
                                cache_delete("feed:" + id + ":" + (kind == "cat"));
+                       }
 
                        setFeedUnread(id, (kind == "cat"), ctr);
 
@@ -354,6 +336,8 @@ function parse_counters(elems, scheduled_call) {
                                                setFeedIcon(id, false, 'images/blank_icon.gif');
                                        }
                                }
+                       } else {
+                               setCatParam(id, child_unread);
                        }
                }
 
@@ -378,6 +362,20 @@ function getFeedUnread(feed, is_cat) {
        return -1;
 }
 
+function getFeedCategory(feed) {
+       try {
+               var tree = dijit.byId("feedTree");
+
+               if (tree && tree.model)
+                       return tree.getFeedCategory(feed);
+
+       } catch (e) {
+               //
+       }
+
+       return false;
+}
+
 function hideOrShowFeeds(hide) {
        var tree = dijit.byId("feedTree");
 
@@ -429,6 +427,27 @@ 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 getCatParam(cat) {
+       try {
+               return getFeedValue(cat, true, "child_unread");
+       } catch (e) {
+               //
+       }
+}
+
+
 function selectFeed(feed, is_cat) {
        try {
                var tree = dijit.byId("feedTree");
@@ -476,10 +495,32 @@ function getNextUnreadFeed(feed, is_cat) {
        }
 }
 
+function catchupCurrentFeed() {
+       return catchupFeed(getActiveFeedId(), activeFeedIsCat());
+}
+
+function catchupFeedInGroup(id) {
+       try {
+
+               var title = getFeedName(id);
+
+               var str = __("Mark all articles in %s as read?").replace("%s", title);
+
+               if (getInitParam("confirm_feed_catchup") != 1 || confirm(str)) {
+                       return viewCurrentFeed('MarkAllReadGR:' + id);
+               }
+
+       } catch (e) {
+               exception_error("catchupFeedInGroup", e);
+       }
+}
+
 function catchupFeed(feed, is_cat) {
        try {
+               if (is_cat == undefined) is_cat = false;
+
                var str = __("Mark all articles in %s as read?");
-               var fn = getFeedName(getActiveFeedId(), activeFeedIsCat());
+               var fn = getFeedName(feed, is_cat);
 
                str = str.replace("%s", fn);
 
@@ -487,8 +528,22 @@ function catchupFeed(feed, is_cat) {
                        return;
                }
 
+               var max_id = 0;
+
+               if (feed == getActiveFeedId() && is_cat == activeFeedIsCat()) {
+                       $$("#headlines-frame > div[id*=RROW]").each(
+                               function(child) {
+                                       var id = parseInt(child.id.replace("RROW-", ""));
+
+                                       if (id > max_id) max_id = id;
+                               }
+                       );
+               }
+
                var catchup_query = "?op=rpc&method=catchupFeed&feed_id=" +
-                       feed + "&is_cat=" + is_cat;
+                       feed + "&is_cat=" + is_cat + "&max_id=" + max_id;
+
+               console.log(catchup_query);
 
                notify_progress("Loading, please wait...", true);
 
@@ -496,6 +551,26 @@ function catchupFeed(feed, is_cat) {
                        parameters: catchup_query,
                        onComplete: function(transport) {
                                        handle_rpc_json(transport);
+
+                                       if (feed == getActiveFeedId() && is_cat == activeFeedIsCat()) {
+
+                                               $$("#headlines-frame > div[id*=RROW][class*=Unread]").each(
+                                                       function(child) {
+                                                               child.removeClassName("Unread");
+                                                       }
+                                               );
+                                       }
+
+                                       var show_next_feed = getInitParam("on_catchup_show_next_feed") == "1";
+
+                                       if (show_next_feed) {
+                                               var nuf = getNextUnreadFeed(feed, is_cat);
+
+                                               if (nuf) {
+                                                       viewfeed(nuf, '', is_cat);
+                                               }
+                                       }
+
                                        notify("");
                                } });
 
@@ -503,3 +578,35 @@ function catchupFeed(feed, is_cat) {
                exception_error("catchupFeed", e);
        }
 }
+
+function decrementFeedCounter(feed, is_cat) {
+       try {
+               // we have subcats, no way to figure out if this article is
+               // actually from this category
+               if (is_cat && getCatParam(feed) > 0)
+                       return;
+
+               var ctr = getFeedUnread(feed, is_cat);
+
+               if (ctr > 0) {
+                       setFeedUnread(feed, is_cat, ctr - 1);
+
+                       if (!is_cat) {
+                               var cat = parseInt(getFeedCategory(feed));
+
+                               if (!isNaN(cat)) {
+                                       ctr = getFeedUnread(cat, true);
+
+                                       if (ctr > 0) {
+                                               setFeedUnread(cat, true, ctr - 1);
+                                       }
+                               }
+                       }
+               }
+
+               cache_delete("feed:" + feed + ":" + is_cat);
+
+       } catch (e) {
+               exception_error("decrement_feed_counter", e);
+       }
+}