From 87b16a0a6156e90f549f13f59e657ff03a33a7e4 Mon Sep 17 00:00:00 2001 From: Andrew Dolgov Date: Tue, 3 Feb 2009 15:28:37 +0300 Subject: [PATCH] add dialog to download articles for offline reading; start implementation --- feedlist.js | 8 +++ functions.js | 4 +- modules/backend-rpc.php | 28 +++++++++++ modules/popup-dialog.php | 39 +++++++++++++++ tt-rss.css | 14 ++++++ tt-rss.js | 103 +++++++++++++++++++++++++++++++++++++-- tt-rss.php | 3 +- 7 files changed, 193 insertions(+), 6 deletions(-) diff --git a/feedlist.js b/feedlist.js index 582509e40..4a892a907 100644 --- a/feedlist.js +++ b/feedlist.js @@ -30,6 +30,14 @@ function viewCategory(cat) { return false; } +function render_offline_feedlist() { + try { + // FIXME + } catch (e) { + exception_error("render_offline_feedlist", e); + } +} + function render_feedlist(data) { try { diff --git a/functions.js b/functions.js index 786023ffe..ecb41db2e 100644 --- a/functions.js +++ b/functions.js @@ -579,11 +579,11 @@ function parse_counters(reply, scheduled_call) { setTimeout('updateFeedList(false, false)', 50); } } else { - var fl = document.getElementById("feeds-frame").innerHTML; +/* var fl = document.getElementById("feeds-frame").innerHTML; if (fl) { cache_invalidate("FEEDLIST"); cache_inject("FEEDLIST", fl, getInitParam("num_feeds")); - } + } */ } } catch (e) { diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php index 04e2858ca..55ab73a20 100644 --- a/modules/backend-rpc.php +++ b/modules/backend-rpc.php @@ -514,6 +514,34 @@ return; } + if ($subop == "download") { + $stage = (int) $_REQUEST["stage"]; + + print ""; + + if ($stage == 0) { + print ""; + + $reply = array(); + + $result = db_query($link, "SELECT id, title FROM + ttrss_feeds WHERE owner_uid = ".$_SESSION["uid"]); + + while ($line = db_fetch_assoc($result)) { + print ""; + } + + print ""; + + } + + print ""; + + return; + } + print "Unknown method: $subop"; } ?> diff --git a/modules/popup-dialog.php b/modules/popup-dialog.php index 465d3bcd9..d89547fe9 100644 --- a/modules/popup-dialog.php +++ b/modules/popup-dialog.php @@ -461,6 +461,45 @@ return; } + if ($id == "offlineDownload") { + print "
".__('Download articles')."
"; + print "
"; + + print "
"; + + print "
".__("Download")."
"; + + print "
"; + + $amount = array( + 50 => 50, + 100 => 100, + 0 => "All unread"); + + print_select_hash("amount", 50, $amount); + + print " " . __("newest articles for offline reading."); + + print "
"; + + print "
"; + + print "
+
+
+
+ +
"; + + print "
"; + + return; + } + + print "
Internal Error

Unknown dialog $id

diff --git a/tt-rss.css b/tt-rss.css index 95938bc91..4909b20a3 100644 --- a/tt-rss.css +++ b/tt-rss.css @@ -1976,6 +1976,20 @@ div#l_progress_i { height : 10px; } +div#d_progress_o { + width : 100px; + border : 1px solid black; + background-color : white; + float : left; + margin-left : 10px; +} + +div#d_progress_i { + width : 10px; + background-color : #88b0f0; + height : 10px; +} + #content-insert { background-color : white; overflow : auto; diff --git a/tt-rss.js b/tt-rss.js index 24c80435b..3a4486707 100644 --- a/tt-rss.js +++ b/tt-rss.js @@ -23,6 +23,7 @@ var offline_mode = false; var store = false; var localServer = false; var db = false; +var download_progress_last = 0; function activeFeedIsCat() { return _active_feed_is_cat; @@ -135,7 +136,7 @@ function backend_sanity_check_callback(transport) { } if (!transport.responseXML) { - if (!google.gears) { + if (!window.google && !google.gears) { fatalError(3, "Sanity check: Received reply is not XML", transport.responseText); } else { init_offline(); @@ -662,6 +663,11 @@ function quickMenuGo(opid) { resize_headlines(); } + if (opid == "qmcDownload") { + displayDlg("offlineDownload"); + return; + } + if (opid == "qmcResetCats") { if (confirm(__("Reset category order?"))) { @@ -1295,6 +1301,16 @@ function hotkey_handler(e) { } } + if (keycode == 68 && shift_key) { // D + initiate_offline_download(); + return false; + } + + if (keycode == 68) { // d + displayDlg("offlineDownload"); + return false; + } + if (keycode == 87) { // w feeds_sort_by_unread = !feeds_sort_by_unread; return resort_feedlist(); @@ -1486,6 +1502,14 @@ function init_gears() { db.open('tt-rss'); db.execute("CREATE TABLE IF NOT EXISTS cache (id text, article text, param text, added text)"); + + db.execute("CREATE TABLE if not exists offline_feeds (id integer, title text)"); + + db.execute("CREATE TABLE if not exists offline_data (id integer, feed_id integer, title text, updated text, content text, tags text)"); + + var qmcDownload = document.getElementById("qmcDownload"); + if (qmcDownload) Element.show(qmcDownload); + } cache_expire(); @@ -1499,8 +1523,7 @@ function init_offline() { try { offline_mode = true; - render_feedlist(cache_find("FEEDLIST")); - document.getElementById("quickMenuChooser").disabled = true; + render_offline_feedlist(); remove_splash(); } catch (e) { @@ -1508,3 +1531,77 @@ function init_offline() { } } +function offline_download_parse(stage, transport) { + try { + if (transport.responseXML) { + + if (stage == 0) { + + var feeds = transport.responseXML.getElementsByTagName("feed"); + + if (feeds.length > 0) { + db.execute("DELETE FROM offline_feeds"); + } + + for (var i = 0; i < feeds.length; i++) { + var id = feeds[i].getAttribute("id"); + var title = feeds[i].firstChild.nodeValue; + + db.execute("INSERT INTO offline_feeds (id,title) VALUES (?,?)", + [id, title]); + } + + window.setTimeout("initiate_offline_download("+(stage+1)+")", 50); + } + + notify_info("All done."); + + } + } catch (e) { + exception_error("offline_download_parse", e); + } +} + +function download_set_progress(p) { + try { + var o = document.getElementById("d_progress_i"); + + if (!o) return; + + Element.show(o); + + new Effect.Scale(o, p, { + scaleY : false, + scaleFrom : download_progress_last, + scaleMode: { originalWidth : 100 }, + queue: { position: 'end', scope: 'LSP-Q', limit: 3 } }); + + download_progress_last = p; + } catch (e) { + exception_error("download_progress", e); + } +} + +function initiate_offline_download(stage) { + try { + + if (!stage) stage = 0; + + notify_progress("Loading, please wait... S" + stage, true); + download_set_progress(20); + + var query = "backend.php?op=rpc&subop=download&stage=" + stage; + + if (document.getElementById("download_ops_form")) { + query = query + "&" + Form.serialize("download_ops_form"); + } + + new Ajax.Request(query, { + onComplete: function(transport) { + offline_download_parse(stage, transport); + } }); + + } catch (e) { + exception_error("initiate_offline_download", e); + } +} diff --git a/tt-rss.php b/tt-rss.php index 09e7d1bc9..bb5ecc287 100644 --- a/tt-rss.php +++ b/tt-rss.php @@ -174,8 +174,9 @@ window.onload = init; - + +