summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Dolgov <[email protected]>2009-02-03 15:28:37 +0300
committerAndrew Dolgov <[email protected]>2009-02-03 15:28:37 +0300
commit87b16a0a6156e90f549f13f59e657ff03a33a7e4 (patch)
tree3a6cef1229645b9a24b6a4e72ba2b63f7934581a
parentd92d7f02ada5a6f7fbc39ae0de6811624724da29 (diff)
add dialog to download articles for offline reading; start implementation
-rw-r--r--feedlist.js8
-rw-r--r--functions.js4
-rw-r--r--modules/backend-rpc.php28
-rw-r--r--modules/popup-dialog.php39
-rw-r--r--tt-rss.css14
-rw-r--r--tt-rss.js103
-rw-r--r--tt-rss.php3
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 "<rpc-reply>";
+
+ if ($stage == 0) {
+ print "<feeds>";
+
+ $reply = array();
+
+ $result = db_query($link, "SELECT id, title FROM
+ ttrss_feeds WHERE owner_uid = ".$_SESSION["uid"]);
+
+ while ($line = db_fetch_assoc($result)) {
+ print "<feed id=\"".$line["id"]."\"><![CDATA[";
+ print $line["title"];
+ print "]]></feed>";
+ }
+
+ print "</feeds>";
+
+ }
+
+ print "</rpc-reply>";
+
+ return;
+ }
+
print "<rpc-reply><error>Unknown method: $subop</error></rpc-reply>";
}
?>
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 "<div id=\"infoBoxTitle\">".__('Download articles')."</div>";
+ print "<div class=\"infoBoxContents\">";
+
+ print "<form name='download_ops_form' id='download_ops_form'>";
+
+ print "<div class=\"dlgSec\">".__("Download")."</div>";
+
+ print "<div class=\"dlgSecCont\">";
+
+ $amount = array(
+ 50 => 50,
+ 100 => 100,
+ 0 => "All unread");
+
+ print_select_hash("amount", 50, $amount);
+
+ print " " . __("newest articles for offline reading.");
+
+ print "</div>";
+
+ print "</form>";
+
+ print "<div class=\"dlgButtons\">
+ <div id=\"d_progress_o\" style=\"display : none\">
+ <div id=\"d_progress_i\"></div>
+ </div>
+ <input class=\"button\"
+ type=\"submit\" onclick=\"return initiate_offline_download()\" value=\"".__('Download')."\">
+ <input class=\"button\"
+ type=\"submit\" onclick=\"return closeInfoBox()\"
+ value=\"".__('Cancel')."\"></div>";
+
+ print "</div>";
+
+ return;
+ }
+
+
print "<div id='infoBoxTitle'>Internal Error</div>
<div id='infoBoxContents'>
<p>Unknown dialog <b>$id</b></p>
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;
<option value="qmcAddFilter">&nbsp;&nbsp;<?php echo __('Create filter...') ?></option>
<option value="qmcResetUI">&nbsp;&nbsp;<?php echo __('Reset UI layout') ?></option>
<option value="qmcResetCats">&nbsp;&nbsp;<?php echo __('Reset category order') ?></option>
-
+ <option id="qmcDownload" style="display : none" value="qmcDownload"><?php echo __('&nbsp;&nbsp;Download new articles...') ?></option>
<option value="qmcHKhelp"><?php echo __('&nbsp;&nbsp;Keyboard shortcuts') ?></option>
+
</select>
</div>