add dialog to download articles for offline reading; start implementation
This commit is contained in:
parent
d92d7f02ad
commit
87b16a0a61
|
@ -30,6 +30,14 @@ function viewCategory(cat) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function render_offline_feedlist() {
|
||||||
|
try {
|
||||||
|
// FIXME
|
||||||
|
} catch (e) {
|
||||||
|
exception_error("render_offline_feedlist", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
function render_feedlist(data) {
|
function render_feedlist(data) {
|
||||||
try {
|
try {
|
||||||
|
|
||||||
|
|
|
@ -579,11 +579,11 @@ function parse_counters(reply, scheduled_call) {
|
||||||
setTimeout('updateFeedList(false, false)', 50);
|
setTimeout('updateFeedList(false, false)', 50);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
var fl = document.getElementById("feeds-frame").innerHTML;
|
/* var fl = document.getElementById("feeds-frame").innerHTML;
|
||||||
if (fl) {
|
if (fl) {
|
||||||
cache_invalidate("FEEDLIST");
|
cache_invalidate("FEEDLIST");
|
||||||
cache_inject("FEEDLIST", fl, getInitParam("num_feeds"));
|
cache_inject("FEEDLIST", fl, getInitParam("num_feeds"));
|
||||||
}
|
} */
|
||||||
}
|
}
|
||||||
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
|
|
@ -514,6 +514,34 @@
|
||||||
return;
|
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>";
|
print "<rpc-reply><error>Unknown method: $subop</error></rpc-reply>";
|
||||||
}
|
}
|
||||||
?>
|
?>
|
||||||
|
|
|
@ -461,6 +461,45 @@
|
||||||
return;
|
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>
|
print "<div id='infoBoxTitle'>Internal Error</div>
|
||||||
<div id='infoBoxContents'>
|
<div id='infoBoxContents'>
|
||||||
<p>Unknown dialog <b>$id</b></p>
|
<p>Unknown dialog <b>$id</b></p>
|
||||||
|
|
14
tt-rss.css
14
tt-rss.css
|
@ -1976,6 +1976,20 @@ div#l_progress_i {
|
||||||
height : 10px;
|
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 {
|
#content-insert {
|
||||||
background-color : white;
|
background-color : white;
|
||||||
overflow : auto;
|
overflow : auto;
|
||||||
|
|
103
tt-rss.js
103
tt-rss.js
|
@ -23,6 +23,7 @@ var offline_mode = false;
|
||||||
var store = false;
|
var store = false;
|
||||||
var localServer = false;
|
var localServer = false;
|
||||||
var db = false;
|
var db = false;
|
||||||
|
var download_progress_last = 0;
|
||||||
|
|
||||||
function activeFeedIsCat() {
|
function activeFeedIsCat() {
|
||||||
return _active_feed_is_cat;
|
return _active_feed_is_cat;
|
||||||
|
@ -135,7 +136,7 @@ function backend_sanity_check_callback(transport) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!transport.responseXML) {
|
if (!transport.responseXML) {
|
||||||
if (!google.gears) {
|
if (!window.google && !google.gears) {
|
||||||
fatalError(3, "Sanity check: Received reply is not XML", transport.responseText);
|
fatalError(3, "Sanity check: Received reply is not XML", transport.responseText);
|
||||||
} else {
|
} else {
|
||||||
init_offline();
|
init_offline();
|
||||||
|
@ -662,6 +663,11 @@ function quickMenuGo(opid) {
|
||||||
resize_headlines();
|
resize_headlines();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (opid == "qmcDownload") {
|
||||||
|
displayDlg("offlineDownload");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (opid == "qmcResetCats") {
|
if (opid == "qmcResetCats") {
|
||||||
|
|
||||||
if (confirm(__("Reset category order?"))) {
|
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
|
if (keycode == 87) { // w
|
||||||
feeds_sort_by_unread = !feeds_sort_by_unread;
|
feeds_sort_by_unread = !feeds_sort_by_unread;
|
||||||
return resort_feedlist();
|
return resort_feedlist();
|
||||||
|
@ -1486,6 +1502,14 @@ function init_gears() {
|
||||||
db.open('tt-rss');
|
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 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();
|
cache_expire();
|
||||||
|
@ -1499,8 +1523,7 @@ function init_offline() {
|
||||||
try {
|
try {
|
||||||
offline_mode = true;
|
offline_mode = true;
|
||||||
|
|
||||||
render_feedlist(cache_find("FEEDLIST"));
|
render_offline_feedlist();
|
||||||
document.getElementById("quickMenuChooser").disabled = true;
|
|
||||||
|
|
||||||
remove_splash();
|
remove_splash();
|
||||||
} catch (e) {
|
} 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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -174,8 +174,9 @@ window.onload = init;
|
||||||
<option value="qmcAddFilter"> <?php echo __('Create filter...') ?></option>
|
<option value="qmcAddFilter"> <?php echo __('Create filter...') ?></option>
|
||||||
<option value="qmcResetUI"> <?php echo __('Reset UI layout') ?></option>
|
<option value="qmcResetUI"> <?php echo __('Reset UI layout') ?></option>
|
||||||
<option value="qmcResetCats"> <?php echo __('Reset category order') ?></option>
|
<option value="qmcResetCats"> <?php echo __('Reset category order') ?></option>
|
||||||
|
<option id="qmcDownload" style="display : none" value="qmcDownload"><?php echo __(' Download new articles...') ?></option>
|
||||||
<option value="qmcHKhelp"><?php echo __(' Keyboard shortcuts') ?></option>
|
<option value="qmcHKhelp"><?php echo __(' Keyboard shortcuts') ?></option>
|
||||||
|
|
||||||
</select>
|
</select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue