From e66a77e5601842a855963a25c3f4e229969c3392 Mon Sep 17 00:00:00 2001
From: Aleksander Machniak <alec@alec.pl>
Date: Sun, 17 Aug 2014 03:11:56 -0400
Subject: [PATCH] Fix contacts list update after adding/deleting/moving a contact (#1490028, #1490033)

---
 program/js/list.js                   |    3 +
 CHANGELOG                            |    1 
 program/steps/addressbook/move.inc   |   24 +++++++----
 program/steps/addressbook/undo.inc   |    3 -
 program/steps/addressbook/save.inc   |   21 +---------
 program/steps/addressbook/delete.inc |   40 ++++++++++++-------
 6 files changed, 45 insertions(+), 47 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index b4269c6..a484e68 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -54,6 +54,7 @@
 - Fix invalid Content-Type header when send_format_flowed=false (#1489992)
 - Fix errors when adding/updating contacts in active search (#1490015)
 - Fix incorrect thumbnail rotation with GD and exif orientation data (#1490029)
+- Fix contacts list update after adding/deleting/moving a contact (#1490028, #1490033)
 
 RELEASE 1.0.2
 -------------
diff --git a/program/js/list.js b/program/js/list.js
index 65e09e8..7e84ef2 100644
--- a/program/js/list.js
+++ b/program/js/list.js
@@ -1417,7 +1417,8 @@
  */
 scrollto: function(id)
 {
-  var row = this.rows[id].obj;
+  var row = this.rows[id] ? this.rows[id].obj : null;
+
   if (row && this.frame) {
     var scroll_to = Number(row.offsetTop),
       head_offset = 0;
diff --git a/program/steps/addressbook/delete.inc b/program/steps/addressbook/delete.inc
index 3d57d70..f5b8e4e 100644
--- a/program/steps/addressbook/delete.inc
+++ b/program/steps/addressbook/delete.inc
@@ -77,6 +77,17 @@
     }
 }
 
+if (!empty($_SESSION['contact_undo'])) {
+    $_SESSION['contact_undo']['ts'] = time();
+    $msg = html::span(null, $RCMAIL->gettext('contactdeleted'))
+        . ' ' . html::a(array('onclick' => rcmail_output::JS_OBJECT_NAME.".command('undo', '', this)"), $RCMAIL->gettext('undo'));
+
+    $OUTPUT->show_message($msg, 'confirmation', null, true, $undo_time);
+}
+else {
+    $OUTPUT->show_message('contactdeleted', 'confirmation');
+}
+
 $page = isset($_SESSION['page']) ? $_SESSION['page'] : 1;
 
 // update saved search after data changed
@@ -87,8 +98,13 @@
     $result = new rcube_result_set($count, $first);
     $pages  = ceil((count($records) + $delcnt) / $PAGE_SIZE);
 
+    // last page and it's empty, display previous one
+    if ($result->count && $result->count <= ($PAGE_SIZE * ($page - 1))) {
+        $OUTPUT->command('list_page', 'prev');
+        $rowcount = $RCMAIL->gettext('loading');
+    }
     // get records from the next page to add to the list
-    if ($_GET['_from'] != 'show' && $pages > 1 && $page < $pages) {
+    else if ($pages > 1 && $page < $pages) {
         // sort the records
         ksort($records, SORT_LOCALE_STRING);
 
@@ -110,10 +126,15 @@
 else {
     // count contacts for this user
     $result = $CONTACTS->count();
+    $pages  = ceil(($result->count + $delcnt) / $PAGE_SIZE);
 
+    // last page and it's empty, display previous one
+    if ($result->count && $result->count <= ($PAGE_SIZE * ($page - 1))) {
+        $OUTPUT->command('list_page', 'prev');
+        $rowcount = $RCMAIL->gettext('loading');
+    }
     // get records from the next page to add to the list
-    $pages = ceil(($result->count + $delcnt) / $PAGE_SIZE);
-    if ($_GET['_from'] != 'show' && $pages > 1 && $page < $pages) {
+    else if ($pages > 1 && $page < $pages) {
         $CONTACTS->set_page($page);
         $records = $CONTACTS->list_records(null, -$delcnt);
     }
@@ -121,18 +142,7 @@
 
 // update message count display
 $OUTPUT->set_env('pagecount', ceil($result->count / $PAGE_SIZE));
-$OUTPUT->command('set_rowcount', rcmail_get_rowcount_text($result));
-
-if (!empty($_SESSION['contact_undo'])) {
-    $_SESSION['contact_undo']['ts'] = time();
-    $msg = html::span(null, $RCMAIL->gettext('contactdeleted'))
-        . ' ' . html::a(array('onclick' => rcmail_output::JS_OBJECT_NAME.".command('undo', '', this)"), $RCMAIL->gettext('undo'));
-
-    $OUTPUT->show_message($msg, 'confirmation', null, true, $undo_time);
-}
-else {
-    $OUTPUT->show_message('contactdeleted', 'confirmation');
-}
+$OUTPUT->command('set_rowcount', $rowcount ? $rowcount : rcmail_get_rowcount_text($result));
 
 // add new rows from next page (if any)
 if (!empty($records)) {
diff --git a/program/steps/addressbook/move.inc b/program/steps/addressbook/move.inc
index 7a730af..e832765 100644
--- a/program/steps/addressbook/move.inc
+++ b/program/steps/addressbook/move.inc
@@ -142,10 +142,6 @@
 }
 
 if (!$deleted || $deleted != $all) {
-    // update saved search after data changed
-    if ($deleted) {
-        rcmail_search_update();
-    }
     $OUTPUT->command('list_contacts');
 }
 else {
@@ -157,8 +153,13 @@
         $result = new rcube_result_set($count, $first);
         $pages  = ceil((count($records) + $delcnt) / $PAGE_SIZE);
 
+        // last page and it's empty, display previous one
+        if ($result->count && $result->count <= ($PAGE_SIZE * ($page - 1))) {
+            $OUTPUT->command('list_page', 'prev');
+            $rowcount = $RCMAIL->gettext('loading');
+        }
         // get records from the next page to add to the list
-        if ($_GET['_from'] != 'show' && $pages > 1 && $page < $pages) {
+        else if ($pages > 1 && $page < $pages) {
             // sort the records
             ksort($records, SORT_LOCALE_STRING);
 
@@ -180,10 +181,15 @@
     else {
         // count contacts for this user
         $result = $CONTACTS->count();
-        // get records from the next page to add to the list
-        $pages = ceil(($result->count + $deleted) / $PAGE_SIZE);
+        $pages  = ceil(($result->count + $deleted) / $PAGE_SIZE);
 
-        if ($_GET['_from'] != 'show' && $pages > 1 && $page < $pages) {
+        // last page and it's empty, display previous one
+        if ($result->count && $result->count <= ($PAGE_SIZE * ($page - 1))) {
+            $OUTPUT->command('list_page', 'prev');
+            $rowcount = $RCMAIL->gettext('loading');
+        }
+        // get records from the next page to add to the list
+        else if ($pages > 1 && $page < $pages) {
             $CONTACTS->set_page($page);
             $records = $CONTACTS->list_records(null, -$deleted);
         }
@@ -191,7 +197,7 @@
 
     // update message count display
     $OUTPUT->set_env('pagecount', ceil($result->count / $PAGE_SIZE));
-    $OUTPUT->command('set_rowcount', rcmail_get_rowcount_text($result));
+    $OUTPUT->command('set_rowcount', $rowcount ? $rowcount : rcmail_get_rowcount_text($result));
 
     // add new rows from next page (if any)
     if (!empty($records)) {
diff --git a/program/steps/addressbook/save.inc b/program/steps/addressbook/save.inc
index fd0517f..4f30fd4 100644
--- a/program/steps/addressbook/save.inc
+++ b/program/steps/addressbook/save.inc
@@ -235,29 +235,12 @@
                 $CONTACTS->add_to_group($plugin['group_id'], $plugin['ids']);
             }
         }
-        else {
-            $counts = $CONTACTS->count();
-        }
 
         // show confirmation
         $OUTPUT->show_message('successfullysaved', 'confirmation', null, false);
 
-        // add contact row to the list
-        if (empty($_REQUEST['_search']) && (string)$source === (string)$orig_source) {
-            $CONTACTS->reset();
-            $result = $CONTACTS->search($CONTACTS->primary_key, $insert_id);
-
-            rcmail_js_contacts_list($result, 'parent.');
-            $OUTPUT->command('parent.contact_list.select', rcube_utils::html_identifier($insert_id));
-
-            // update record count display
-            $CONTACTS->reset();
-            $OUTPUT->command('parent.set_rowcount', rcmail_get_rowcount_text($counts));
-        }
-        // just refresh the list (#1490015)
-        else {
-            $OUTPUT->command('parent.command', 'list');
-        }
+        $OUTPUT->command('parent.set_rowcount', $RCMAIL->gettext('loading'));
+        $OUTPUT->command('parent.list_contacts');
 
         $OUTPUT->send('iframe');
     }
diff --git a/program/steps/addressbook/undo.inc b/program/steps/addressbook/undo.inc
index ec3feb9..91547b7 100644
--- a/program/steps/addressbook/undo.inc
+++ b/program/steps/addressbook/undo.inc
@@ -45,9 +45,6 @@
     }
 }
 
-// update saved search after data changed
-rcmail_search_update();
-
 $RCMAIL->session->remove('contact_undo');
 
 $OUTPUT->show_message('contactrestored', 'confirmation');

--
Gitblit v1.9.1