summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--feedlist.js4
-rw-r--r--functions.js4
-rw-r--r--manifest.json.php4
-rw-r--r--modules/backend-rpc.php2
-rw-r--r--offline.js103
-rw-r--r--tt-rss.css23
-rw-r--r--tt-rss.php20
7 files changed, 143 insertions, 17 deletions
diff --git a/feedlist.js b/feedlist.js
index 3634b87d7..93861bbd8 100644
--- a/feedlist.js
+++ b/feedlist.js
@@ -649,6 +649,10 @@ function mouse_up_handler(e) {
document.onselectstart = null;
var e = $("headlineActionsBody");
if (e) Element.hide(e);
+
+ var e = $("offlineModeDrop");
+ if (e) Element.hide(e);
+
}
} catch (e) {
diff --git a/functions.js b/functions.js
index 8355deb04..24230f57e 100644
--- a/functions.js
+++ b/functions.js
@@ -460,9 +460,7 @@ function parse_counters(reply, scheduled_call) {
if (id == "global-unread") {
if (ctr > global_unread) {
- if (db && getInitParam("offline_enabled") == "1") {
- window.setTimeout("update_offline_data(0)", 100);
- }
+ offlineDownloadStart();
}
global_unread = ctr;
diff --git a/manifest.json.php b/manifest.json.php
index 22ea4cda2..525bc6103 100644
--- a/manifest.json.php
+++ b/manifest.json.php
@@ -79,7 +79,7 @@
foreach ($manifest_files as $f) {
$tmp = filemtime($f);
- if ($tmp > $mtime) {
+ if ($tmp > $mtime_max) {
$mtime_max = $tmp;
}
@@ -89,7 +89,7 @@
{
"betaManifestVersion": 1,
- "version": "<?php echo $mtime_max ?>",
+ "version": "<?php echo date("Y.m.d H:i:s", $mtime_max) ?>",
"entries": [
<?php echo join(",\n ", $manifest_formatted); ?>
]
diff --git a/modules/backend-rpc.php b/modules/backend-rpc.php
index 3a63c6094..b28b27462 100644
--- a/modules/backend-rpc.php
+++ b/modules/backend-rpc.php
@@ -569,7 +569,7 @@
$query = "SELECT ref_id,unread FROM ttrss_user_entries
WHERE last_read >= '$last_online' AND
- owner_uid = ".$_SESSION["uid"];
+ owner_uid = ".$_SESSION["uid"] . " LIMIT 500";
$result = db_query($link, $query);
diff --git a/offline.js b/offline.js
index e6b77ed77..974fa7491 100644
--- a/offline.js
+++ b/offline.js
@@ -4,6 +4,8 @@ var offline_mode = false;
var store = false;
var localServer = false;
var db = false;
+var articles_synced = 0;
+var sync_in_progress = false;
function view_offline(id, feed_id) {
try {
@@ -564,6 +566,7 @@ function render_offline_feedlist() {
function init_offline() {
try {
offline_mode = true;
+ store.enabled = true;
Element.hide("dispSwitchPrompt");
Element.hide("feedBrowserPrompt");
@@ -720,6 +723,12 @@ function offline_download_parse(stage, transport) {
debug("downloaded articles: " + articles_found + " limit: " + limit);
+ articles_synced += articles_found;
+
+ var msg =__("Synchronizing (got %d articles)...").replace("%d", articles_synced);
+
+ $("offlineModeSyncMsg").innerHTML = msg;
+
var has_sync_data = has_local_sync_data();
if (articles_found >= limit || has_sync_data) {
@@ -730,13 +739,34 @@ function offline_download_parse(stage, transport) {
window.setTimeout("update_offline_data(0)", 180*1000);
debug("update_offline_data: finished");
- var pic = $("restartOfflinePic");
+ var pic = $("offlineModePic");
if (pic) {
pic.src = "images/offline.png";
- pic.title = __("Restart in offline mode");
+
+ var rs = db.execute("SELECT value FROM syncdata WHERE key = 'last_online'");
+ var last_sync = "";
+
+ if (rs.isValidRow()) {
+ last_sync = rs.field(0).substring(0,16);
+ }
+ rs.close();
+
+ var msg = __("Last sync: %s").replace("%s", last_sync);
+
+ articles_synced = 0;
+
+ $("offlineModeSyncMsg").innerHTML = msg;
}
+ var hide_elems = $$("div.hideWhenSyncing");
+
+ for (var j = 0; j < hide_elems.length; j++) {
+ Element.show(hide_elems[j]);
+ }
+
+ sync_in_progress = false;
+
db.execute("DELETE FROM articles WHERE "+
"updated < DATETIME('NOW', 'localtime', '-31 days')");
@@ -758,6 +788,7 @@ function update_offline_data(stage) {
try {
if (!stage) stage = 0;
+
if (!db || offline_mode || getInitParam("offline_enabled") != "1") return;
// notify_progress("Updating offline data... (" + stage +")", true);
@@ -790,12 +821,22 @@ function update_offline_data(stage) {
debug(query + "/" + to_sync);
- var pic = $("restartOfflinePic");
+ var pic = $("offlineModePic");
if (pic) {
pic.src = "images/offline-sync.gif";
- pic.title = __("Synchronizing offline data...");
+ if (articles_synced == 0) {
+ $("offlineModeSyncMsg").innerHTML = __("Synchronizing...");
+ }
+ }
+
+ var hide_elems = $$("div.hideWhenSyncing");
+
+ for (var j = 0; j < hide_elems.length; j++) {
+ Element.hide(hide_elems[j]);
}
+
+ sync_in_progress = true;
new Ajax.Request(query, {
parameters: to_sync,
@@ -959,8 +1000,8 @@ function enable_offline_reading() {
if (db && getInitParam("offline_enabled") == "1") {
init_local_sync_data();
- Element.show("restartOfflinePic");
- window.setTimeout("update_offline_data(0)", 100);
+ Element.show("offlineModePic");
+ offlineDownloadStart();
}
} catch (e) {
@@ -974,8 +1015,9 @@ function init_gears() {
if (window.google && google.gears) {
localServer = google.gears.factory.create("beta.localserver");
store = localServer.createManagedStore("tt-rss");
- store.manifestUrl = "manifest.json.php";
+ store.manifestUrl = "manifest.json.php";
store.checkForUpdate();
+ store.enabled = false;
db = google.gears.factory.create('beta.database');
db.open('tt-rss');
@@ -1454,3 +1496,50 @@ function catchup_local_feed(id, is_cat) {
exception_error("catchup_local_feed", e);
}
}
+
+function toggleOfflineModeInfo() {
+ try {
+ var e = $('offlineModeDrop');
+ var p = $('offlineModePic');
+
+ if (Element.visible(e)) {
+ Element.hide(e);
+ } else {
+ Element.show(e);
+ }
+
+ } catch (e) {
+ exception_error("toggleOfflineModeInfo", e);
+ }
+}
+
+function offlineDownloadStart() {
+ try {
+ if (db && !sync_in_progress && getInitParam("offline_enabled") == "1") {
+ window.setTimeout("update_offline_data(0)", 100);
+ }
+ } catch (e) {
+ exception_error("offlineDownloadStart", e);
+ }
+}
+
+function offlineClearData() {
+ try {
+ if (db) {
+
+ if (confirm(__("Remove offline data?"))) {
+
+ notify_progress("Removing offline data...");
+
+ db.execute("DELETE FROM articles");
+ db.execute("DELETE FROM article_labels");
+ db.execute("DELETE FROM labels");
+ db.execute("DELETE FROM feeds");
+
+ notify_info("Offline data removed");
+ }
+ }
+ } catch (e) {
+ exception_error("offlineClearData", e);
+ }
+}
diff --git a/tt-rss.css b/tt-rss.css
index 3fbf51fc0..5dc2fd825 100644
--- a/tt-rss.css
+++ b/tt-rss.css
@@ -1703,7 +1703,7 @@ div.topLinks img {
cursor : pointer;
}
-#restartOfflinePic {
+#offlineModePic {
margin-left : 5px;
}
@@ -2137,4 +2137,25 @@ div.colorPicker {
color : #909090;
}
+div#offlineModeDrop div {
+ padding : 2px 2px 2px 2px;
+ text-align : center;
+}
+
+div#offlineModeDrop {
+ position : absolute;
+ margin : 0px;
+ padding : 2px;
+ background-color : white;
+ z-index : 2;
+ margin : 2px 0px 0px 0px;
+ top : auto;
+ right : 0px;
+ border : 1px solid #cccccc;
+ background : white;
+ margin-left : -1px;
+ max-height : 250px;
+ overflow : auto;
+ color : #909090;
+}
diff --git a/tt-rss.php b/tt-rss.php
index 5d765b5d9..0ba76db30 100644
--- a/tt-rss.php
+++ b/tt-rss.php
@@ -131,9 +131,23 @@ window.onload = init;
| <a href="logout.php"><?php echo __('Logout') ?></a>
<?php } ?>
- <img id="restartOfflinePic" src="images/offline.png" style="display:none"
- onclick="gotoOffline()"
- title="<?php echo __('Restart in offline mode') ?>"/>
+ <img id="offlineModePic"
+ onmouseover="enable_selection(false)"
+ onmouseout="enable_selection(true)"
+ onclick="toggleOfflineModeInfo()"
+ src="images/offline.png" style="display:none"
+ title="<?php echo __('Offline mode') ?>"/>
+
+ <div id="offlineModeDrop" style="display : none">
+ <div id="offlineModeSyncMsg">---</div>
+ <div class="hideWhenSyncing">
+ <a href="javascript:offlineDownloadStart()">
+ <?php echo __('Start synchronization') ?></a></div>
+ <div class="hideWhenSyncing"><a href="javascript:offlineClearData()">
+ <?php echo __('Remove offline data') ?></a></div>
+ <div><a href="javascript:gotoOffline()">
+ <?php echo __('Restart in offline mode') ?></a></div>
+ </div>
<img id="newVersionIcon" style="display:none;" onclick="javascript:explainError(2)"
src="images/new_version.png" title="<?php echo __('New version of Tiny Tiny RSS is available!') ?>"