]> git.wh0rd.org - tt-rss.git/commitdiff
scrollable feedlist (iframe)
authorAndrew Dolgov <fox@madoka.spb.ru>
Wed, 7 Sep 2005 03:53:29 +0000 (04:53 +0100)
committerAndrew Dolgov <fox@madoka.spb.ru>
Wed, 7 Sep 2005 03:53:29 +0000 (04:53 +0100)
TODO
backend.php
feedlist.js [new file with mode: 0644]
functions.js
tt-rss.css
tt-rss.js
tt-rss.php
viewfeed.js

diff --git a/TODO b/TODO
index 6c829ea19584e4036dd2dacfe7237f0531a67188..bfdd8182132e4600cca9b6c835a4f4de941db3fb 100644 (file)
--- a/TODO
+++ b/TODO
@@ -2,7 +2,6 @@
 
 - better error handling
 - better keyboard navigation
-- add another iframe for scrollable feedlist
 
 Mysterious Future
 
index 8ed16ee5808576d46b38fee3be48a9eaba9ad384..bb8f86534faa130c9bbe3f83968d1320029a9eb5 100644 (file)
 
        function outputFeedList($link) {
 
+               print "<html><head>
+                       <title>Tiny Tiny RSS : Feedlist</title>
+                       <link rel=\"stylesheet\" href=\"tt-rss.css\" type=\"text/css\">
+                       <script type=\"text/javascript\" src=\"functions.js\"></script>
+                       <script type=\"text/javascript\" src=\"feedlist.js\"></script>
+                       <meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
+                       </head><body>";
+                       
                $result = pg_query($link, "SELECT *,
                        (SELECT count(id) FROM ttrss_entries 
                                WHERE feed_id = ttrss_feeds.id) AS total,
@@ -30,7 +38,9 @@
                                WHERE feed_id = ttrss_feeds.id AND unread = true) as unread
                        FROM ttrss_feeds ORDER BY title");                      
 
-               print "<table width=\"100%\" class=\"feeds\" id=\"feedsList\">";
+               $actid = $_GET["actid"];
+
+               print "<table width=\"100%\" class=\"feedsList\" id=\"feedsList\">";
 
                $lnum = 0;
 
 
                        if ($unread > 0) $class .= "Unread";
 
+                       if ($actid == $feed_id) {
+                               $class .= "Selected";
+                       }
+
                        $total_unread += $unread;
 
                        print "<tr class=\"$class\" id=\"FEEDR-$feed_id\">";
                print "</table>";
 
                print "<div class=\"invisible\" id=\"FEEDTU\">$total_unread</div>";
+               print "<div class=\"invisible\" id=\"ACTFEEDID\">$actid</div>";
 
 /*
                print "<p align=\"center\">All feeds: 
                print "<div class=\"invisible\" id=\"FEEDTU\">$total_unread</div>";
 */
 
+       
 
        }
 
 
                if ($subop == "forceUpdateAllFeeds") {
                        update_all_feeds($link, true);                  
-                       outputFeedList($link);
                }
 
                if ($subop == "updateAllFeeds") {
                        update_all_feeds($link, false);
-                       outputFeedList($link);
                }
                
                if ($subop == "catchupPage") {
 
                // FIXME: check for null value here
 
-               $result = pg_query("SELECT *,SUBSTRING(last_updated,1,16) as last_updated,
+               $result = pg_query("SELECT *,SUBSTRING(last_updated,1,16) as last_updated_s,
                        EXTRACT(EPOCH FROM NOW()) - EXTRACT(EPOCH FROM last_updated) as update_timeout
                        FROM ttrss_feeds WHERE id = '$feed'");
 
                        $line = pg_fetch_assoc($result);
 
                        if ($subop == "ForceUpdate" ||
-                               (!$subop && $line["update_timeout"] > MIN_UPDATE_TIME)) {                               
+                               $line["last_updated"] == "" ||
+                               $line["update_timeout"] > MIN_UPDATE_TIME) {            
 
                                update_rss_feed($link, $line["feed_url"], $feed);
                                
                print "<script type=\"text/javascript\">
                        document.onkeydown = hotkey_handler;
 
-                       var feedr = parent.document.getElementById(\"FEEDR-\" + $feed);
-                       var feedt = parent.document.getElementById(\"FEEDT-\" + $feed);
-                       var feedu = parent.document.getElementById(\"FEEDU-\" + $feed);
+                       var p_document = parent.frames['feeds-frame'].document;
+
+                       var feedr = p_document.getElementById(\"FEEDR-\" + $feed);
+                       var feedt = p_document.getElementById(\"FEEDT-\" + $feed);
+                       var feedu = p_document.getElementById(\"FEEDU-\" + $feed);
 
                        feedt.innerHTML = \"$total\";
                        feedu.innerHTML = \"$unread\";
diff --git a/feedlist.js b/feedlist.js
new file mode 100644 (file)
index 0000000..dd0d049
--- /dev/null
@@ -0,0 +1,89 @@
+var active_feed_id = 666;
+var active_offset;
+
+function viewfeed(feed, skip, subop, doc) {
+
+       if (!doc) doc = parent.document;
+
+       p_notify("Loading headlines...");
+
+       enableHotkeys();
+
+       var searchbox = doc.getElementById("searchbox");
+
+       if (searchbox) {
+               search_query = searchbox.value;
+       } else {
+               search_query = "";
+       } 
+
+       var viewbox = doc.getElementById("viewbox");
+
+       var view_mode;
+
+       if (viewbox) {
+               view_mode = viewbox.value;
+       } else {
+               view_mode = "All Posts";
+       }
+
+       setCookie("ttrss_vf_vmode", view_mode);
+
+       var limitbox = doc.getElementById("limitbox");
+
+       var limit;
+
+       if (limitbox) {
+               limit = limitbox.value;
+               setCookie("ttrss_vf_limit", limit);
+       } else {
+               limit = "All";
+       }
+
+       active_feed_id = feed;
+       active_offset = skip;
+
+       document.getElementById("ACTFEEDID").innerHTML = feed;
+
+       setCookie("ttrss_vf_actfeed", feed);
+
+       if (subop == "MarkAllRead") {
+
+               var feedr = document.getElementById("FEEDR-" + feed);
+               var feedt = document.getElementById("FEEDT-" + feed);
+               var feedu = document.getElementById("FEEDU-" + feed);
+
+               feedu.innerHTML = "0";
+
+               if (feedr.className.match("Unread")) {
+                       feedr.className = feedr.className.replace("Unread", "");
+               }
+       }
+
+       var query = "backend.php?op=viewfeed&feed=" + param_escape(feed) +
+               "&skip=" + param_escape(skip) + "&subop=" + param_escape(subop) +
+               "&view=" + param_escape(view_mode) + "&limit=" + limit;
+
+       if (search_query != "") {
+               query = query + "&search=" + param_escape(search_query);
+       }
+       
+       var headlines_frame = parent.frames["headlines-frame"];
+
+//     alert(headlines_frame)
+
+       headlines_frame.location.href = query + "&addheader=true";
+
+       cleanSelected("feedsList");
+       var feedr = document.getElementById("FEEDR-" + feed);
+       if (feedr) {
+               feedr.className = feedr.className + "Selected";
+       }
+       
+       disableContainerChildren("headlinesToolbar", false, doc);
+
+//     notify("");
+
+}
+
+
index d1f445ec2ba948573974e3b7090ebfde650b7e5e..7faf42874864fa8ae3bbba9838fb725c4043c110 100644 (file)
@@ -223,8 +223,11 @@ function getCookie(name) {
        return unescape(dc.substring(begin + prefix.length, end));
 }
 
-function disableContainerChildren(id, disable) {
-       var container = document.getElementById(id);
+function disableContainerChildren(id, disable, doc) {
+
+       if (!doc) doc = document;
+
+       var container = doc.getElementById(id);
 
        for (var i = 0; i < container.childNodes.length; i++) {
                var child = container.childNodes[i];
@@ -244,3 +247,4 @@ function disableContainerChildren(id, disable) {
 
 }
 
+
index 7f2be2155521b7f23226d2e38bcef85d373da13d..37518b3d14055d6f993903e1ab5b5a6ac3a1ed24 100644 (file)
@@ -45,12 +45,6 @@ td.headlinesToolbar {
        padding : 10px;
 }
 
-td.headlinesTitle {
-       text-align : right;
-       font-size : large;
-       font-weight : bold;
-}
-
 table.headlinesList td.title, table.headlinesHeader td.title {
        font-weight : bold;
        font-size : large;
@@ -98,6 +92,10 @@ table.main td.toolbar {
        width : 300px;
 }
 
+table.feedsList td {
+       font-size : x-small;
+}
+
 table.main td.header {
        font-size : 21pt;
        background-color : #f0f0f0;
@@ -112,11 +110,11 @@ table.main td.header {
 }
 
 table.main td.feeds {
-       width : 250px;
+       width : 300px;
        border-width : 1px 1px 0px 0px;
        border-color : #c0c0c0;
        border-style : solid;
-       padding : 10px;
+       padding : 5px;
 }
 
 div.headlineToolbar {
@@ -138,6 +136,7 @@ table.main td.headlines {
        border-width : 1px 0px 0px 0px;
        border-color : #c0c0c0;
        border-style : solid;
+       font-size : small;
 }
 
 table.main td.prefContent {
@@ -365,6 +364,14 @@ div.expPane {
        margin : 15px;
 }
 
+iframe.feedsFrame {
+       width : 100%;
+       height : 90%;
+       border-width : 0px;
+       margin : 0px;
+       padding : 0px;
+}
+
 iframe.contentFrame, iframe.headlinesFrame {
        width : 100%;
        border-width : 0px;
index 701bec89d1cb8c59bfba7aa2f210810a9472d975..2bd19f13863da9ce555463b9f724db10314a16f2 100644 (file)
--- a/tt-rss.js
+++ b/tt-rss.js
@@ -10,9 +10,7 @@ var xmlhttp_view = false;
 var total_unread = 0;
 var first_run = true;
 
-var active_post_id = false;
 var active_feed_id = false;
-var active_offset = false;
 
 var search_query = "";
 
@@ -41,6 +39,7 @@ if (!xmlhttp && typeof XMLHttpRequest!='undefined') {
        xmlhttp_view = new XMLHttpRequest();
 }
 
+/*
 function feedlist_callback() {
        var container = document.getElementById('feeds');
        if (xmlhttp.readyState == 4) {
@@ -57,25 +56,24 @@ function feedlist_callback() {
                } 
        } 
 }
+*/
+
 
 function refetch_callback() {
 
        if (xmlhttp_rpc.readyState == 4) {
                notify("All feeds updated");
-               var container = document.getElementById('feeds');
-               container.innerHTML = xmlhttp_rpc.responseText;
-               document.title = "Tiny Tiny RSS";
 
-               cleanSelected("feedsList");
+               active_feed_id = frames["feeds-frame"].document.getElementById("ACTFEEDID").innerHTML;
+               
+               document.title = "Tiny Tiny RSS";
+               
+               updateFeedList();
                
-               var feedr = document.getElementById("FEEDR-" + active_feed_id);
-               if (feedr) {
-                       feedr.className = feedr.className + "Selected";
-               }
-
        } 
 }
 
+
 function updateFeed(feed_id) {
 
        var query_str = "backend.php?op=rpc&subop=updateFeed&feed=" + feed_id;
@@ -115,110 +113,47 @@ function scheduleFeedUpdate(force) {
 
 function updateFeedList(silent, fetch) {
 
-       if (silent != true) {
-               notify("Loading feed list...");
-       }
+//     if (silent != true) {
+//             notify("Loading feed list...");
+//     }
 
        var query_str = "backend.php?op=feeds";
 
-       if (fetch) query_str = query_str + "&fetch=yes";
-
-       if (xmlhttp_ready(xmlhttp)) {
-               xmlhttp.open("GET", query_str, true);
-               xmlhttp.onreadystatechange=feedlist_callback;
-               xmlhttp.send(null);
-       } else {
-               printLockingError();
-       }
-}
-
-/*
-function catchupPage(feed) {
-
-       if (!xmlhttp_ready(xmlhttp)) {
-               printLockingError();
-               return
-       }
-
-       var content = document.getElementById("headlinesList");
-
-       var rows = new Array();
-
-       for (i = 0; i < content.rows.length; i++) {
-               var row_id = content.rows[i].id.replace("RROW-", "");
-               if (row_id.length > 0) {
-                       if (content.rows[i].className.match("Unread")) {
-                               rows.push(row_id);      
-                               content.rows[i].className = content.rows[i].className.replace("Unread", "");
-                       }
-
-                       var upd_img_pic = document.getElementById("FUPDPIC-" + row_id);
-                       if (upd_img_pic) {
-                               upd_img_pic.innerHTML = "";
-                       } 
-               }
+       if (active_feed_id) {
+               query_str = query_str + "&actid=" + active_feed_id;
        }
 
-       if (rows.length > 0) {
-
-               var feedr = document.getElementById("FEEDR-" + feed);
-               var feedu = document.getElementById("FEEDU-" + feed);
-       
-               feedu.innerHTML = feedu.innerHTML - rows.length;
-       
-               if (feedu.innerHTML > 0 && !feedr.className.match("Unread")) {
-                               feedr.className = feedr.className + "Unread";
-               } else if (feedu.innerHTML <= 0) {      
-                               feedr.className = feedr.className.replace("Unread", "");
-               } 
-
-               var query_str = "backend.php?op=rpc&subop=catchupPage&ids=" + 
-                       param_escape(rows.toString());
-       
-               notify("Marking this page as read...");
+       if (fetch) query_str = query_str + "&fetch=yes";
 
-               var button = document.getElementById("btnCatchupPage");
+       var feeds_frame = document.getElementById("feeds-frame");
 
-               if (button) {
-                       button.className = "disabledButton";
-                       button.href = "";
-               }
-       
-               xmlhttp.open("GET", query_str, true);
-               xmlhttp.onreadystatechange=notify_callback;
-               xmlhttp.send(null);
-
-       } else {
-               notify("No unread items on this page.");
-
-       }
-} */
+       feeds_frame.src = query_str;
+}
 
 function catchupAllFeeds() {
 
-       if (!xmlhttp_ready(xmlhttp)) {
-               printLockingError();
-               return
-       }
        var query_str = "backend.php?op=feeds&subop=catchupAll";
 
        notify("Marking all feeds as read...");
 
-       xmlhttp.open("GET", query_str, true);
-       xmlhttp.onreadystatechange=feedlist_callback;
-       xmlhttp.send(null);
+       var feeds_frame = document.getElementById("feeds-frame");
+
+       feeds_frame.src = query_str;
 
 }
 
 function viewCurrentFeed(skip, subop) {
-       if (active_feed_id ) {
+
+       active_feed_id = frames["feeds-frame"].document.getElementById("ACTFEEDID").innerHTML;
+
+       if (active_feed_id) {
                viewfeed(active_feed_id, skip, subop);
        }
 }
 
 function viewfeed(feed, skip, subop) {
 
-//     notify("Loading headlines...");
+       notify("Loading headlines...");
 
        enableHotkeys();
 
@@ -253,21 +188,20 @@ function viewfeed(feed, skip, subop) {
                limit = "All";
        }
 
-       if (active_feed_id != feed || skip != active_offset) {
-               active_post_id = false;
-       }
-
        active_feed_id = feed;
-       active_offset = skip;
+
+       var f_doc = frames["feeds-frame"].document;
+
+       f_doc.getElementById("ACTFEEDID").innerHTML = feed;
 
        setCookie("ttrss_vf_actfeed", feed);
 
        if (subop == "MarkAllRead") {
 
-               var feedr = document.getElementById("FEEDR-" + feed);
-               var feedt = document.getElementById("FEEDT-" + feed);
-               var feedu = document.getElementById("FEEDU-" + feed);
-
+               var feedr = f_doc.getElementById("FEEDR-" + feed);
+               var feedt = f_doc.getElementById("FEEDT-" + feed);
+               var feedu = f_doc.getElementById("FEEDU-" + feed);
+               
                feedu.innerHTML = "0";
 
                if (feedr.className.match("Unread")) {
@@ -283,9 +217,9 @@ function viewfeed(feed, skip, subop) {
                query = query + "&search=" + param_escape(search_query);
        }
        
-       var headlines_frame = document.getElementById("headlines-frame");
-       
-       headlines_frame.src = query + "&addheader=true";
+       var headlines_frame = parent.frames["headlines-frame"];
+
+       headlines_frame.location.href = query + "&addheader=true";
 
        cleanSelected("feedsList");
        var feedr = document.getElementById("FEEDR-" + feed);
@@ -293,12 +227,13 @@ function viewfeed(feed, skip, subop) {
                feedr.className = feedr.className + "Selected";
        }
        
-       disableContainerChildren("headlinesToolbar", false);
+       disableContainerChildren("headlinesToolbar", false, doc);
 
 //     notify("");
 
 }
 
+
 function timeout() {
        scheduleFeedUpdate(true);
        setTimeout("timeout()", 1800*1000);
@@ -334,47 +269,6 @@ function localPiggieFunction(enable) {
        }
 }
 
-/*
-function moveToPost(mode) {
-
-       var rows = getVisibleHeadlineIds();
-
-       var prev_id;
-       var next_id;
-
-       if (active_post_id == false) {
-               next_id = getFirstVisibleHeadlineId();
-               prev_id = getLastVisibleHeadlineId();
-       } else {        
-               for (var i = 0; i < rows.length; i++) {
-                       if (rows[i] == active_post_id) {
-                               prev_id = rows[i-1];
-                               next_id = rows[i+1];                    
-                       }
-               }
-       }
-
-       if (mode == "next") {
-               if (next_id != undefined) {
-                       view(next_id, active_feed_id);
-               } else {
-                       _viewfeed_autoselect_first = true;
-                       viewfeed(active_feed_id, active_offset+15);
-               }
-       }
-
-       if (mode == "prev") {
-               if ( prev_id != undefined) {
-                       view(prev_id, active_feed_id);
-               } else {
-                       _viewfeed_autoselect_last = true;
-                       viewfeed(active_feed_id, active_offset-15);
-               }
-       }
-
-}
-*/
-
 function localHotkeyHandler(keycode) {
 
 /*     if (keycode == 78) {
@@ -419,6 +313,8 @@ function init() {
        document.onkeydown = hotkey_handler;
        setTimeout("timeout()", 1800*1000);
 
+       scheduleFeedUpdate(true);
+
        var content = document.getElementById("content");
 
        if (getCookie("ttrss_vf_vmode")) {
index ad922a6f3e8cccf2885cf91f56df4eb0a3df2740..e240365ef6563d81088b6edc23b5acea4f830c1f 100644 (file)
@@ -34,7 +34,9 @@
 <tr>
        <td valign="top" rowspan="3" class="feeds"> 
                
-               <div id="feeds">&nbsp;</div>
+               <!-- <div id="feeds">&nbsp;</div> -->
+
+               <iframe id="feeds-frame" name="feeds-frame" class="feedsFrame"> </iframe>
        
                <p align="center">All feeds:
                
index 6d73da8869363119d81594cdf97d64c41a65d73b..55656cd113d30694688979278fb530695ad2a121 100644 (file)
@@ -32,12 +32,12 @@ function view(id, feed_id) {
        var crow = document.getElementById("RROW-" + id);
 
        if (crow.className.match("Unread")) {
-               var umark = parent.document.getElementById("FEEDU-" + feed_id);
+               var umark = parent.frames["feeds-frame"].document.getElementById("FEEDU-" + feed_id);
                umark.innerHTML = umark.innerHTML - 1;
                crow.className = crow.className.replace("Unread", "");
 
                if (umark.innerHTML == "0") {
-                       var feedr = parent.document.getElementById("FEEDR-" + feed_id);
+                       var feedr = parent.frames["feeds-frame"].document.getElementById("FEEDR-" + feed_id);                   
                        feedr.className = feedr.className.replace("Unread", "");
                }