From de98a897f618c4d251a4d3a5e3d2e4f2bb9a441b Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Thu, 07 Feb 2013 11:18:54 -0500
Subject: [PATCH] Add link to pop the address group stack; add animations when pushing/popping lists (in larry skin)

---
 skins/larry/images/listicons.png   |    0 
 program/steps/addressbook/func.inc |    2 +
 skins/larry/styles.css             |    4 ++
 skins/larry/addressbook.css        |    7 +++
 program/js/app.js                  |   31 +++++++++++++--
 skins/larry/ui.js                  |   33 ++++++++++++++++
 6 files changed, 71 insertions(+), 6 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index 31a96b5..f9b72cd 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -251,6 +251,7 @@
           }
         }
         else if (this.env.action == 'compose') {
+          this.env.address_group_stack = [];
           this.env.compose_commands = ['send-attachment', 'remove-attachment', 'send', 'cancel', 'toggle-editor', 'list-adresses', 'pushgroup', 'search', 'reset-search', 'extwin'];
 
           if (this.env.drafts_mailbox)
@@ -318,13 +319,13 @@
         break;
 
       case 'addressbook':
+        this.env.address_group_stack = [];
+
         if (this.gui_objects.folderlist)
           this.env.contactfolders = $.extend($.extend({}, this.env.address_sources), this.env.contactgroups);
 
         this.enable_command('add', 'import', this.env.writable_source);
-        this.enable_command('list', 'listgroup', 'pushgroup', 'listsearch', 'advanced-search', true);
-
-        this.env.address_group_stack = [];
+        this.enable_command('list', 'listgroup', 'pushgroup', 'popgroup', 'listsearch', 'advanced-search', true);
 
         if (this.gui_objects.contactslist) {
           this.contact_list = new rcube_list_widget(this.gui_objects.contactslist,
@@ -1091,6 +1092,14 @@
       case 'listgroup':
         this.reset_qsearch();
         this.list_contacts(props.source, props.id);
+        break;
+
+      case 'popgroup':
+        if (this.env.address_group_stack.length > 1) {
+          this.env.address_group_stack.pop();
+          this.reset_qsearch();
+          this.list_contacts(props.source, this.env.address_group_stack[this.env.address_group_stack.length-1]);
+        }
         break;
 
       case 'import':
@@ -4198,8 +4207,20 @@
 
   this.set_group_prop = function(prop)
   {
-    if (this.gui_objects.addresslist_title)
-      $(this.gui_objects.addresslist_title).html(prop.name);
+    if (this.gui_objects.addresslist_title) {
+      var boxtitle = $(this.gui_objects.addresslist_title).html('');  // clear contents
+
+      // add link to pop back to parent group
+      if (this.env.address_group_stack.length > 1) {
+        $('<a href="#list">...</a>')
+          .addClass('poplink')
+          .appendTo(boxtitle)
+          .click(function(e){ return ref.command('popgroup','',this); });
+        boxtitle.append('&nbsp;&raquo;&nbsp;');
+      }
+
+      boxtitle.append($('<span>'+prop.name+'</span>'));
+    }
 
     this.triggerEvent('groupupdate', prop);
   };
diff --git a/program/steps/addressbook/func.inc b/program/steps/addressbook/func.inc
index 4d4bf22..60a1984 100644
--- a/program/steps/addressbook/func.inc
+++ b/program/steps/addressbook/func.inc
@@ -372,6 +372,8 @@
                             'onclick' => sprintf("return %s.command('pushgroup',{'source':'%s','id':'%s'},this,event)", JS_OBJECT_NAME, $source_id, $row['CID']),
                         ), '&raquo;');
                     }
+                    else
+                        $val = '&nbsp;';
                     break;
 
                 default:
diff --git a/skins/larry/addressbook.css b/skins/larry/addressbook.css
index 8d8a61b..090e54c 100644
--- a/skins/larry/addressbook.css
+++ b/skins/larry/addressbook.css
@@ -175,6 +175,13 @@
 	text-overflow: ellipsis;
 }
 
+#addresslist .boxtitle a.poplink {
+	color: #004458;
+	font-size: 14px;
+	line-height: 12px;
+	text-decoration: none;
+}
+
 #contact-frame {
 	position: absolute;
 	top: 0;
diff --git a/skins/larry/images/listicons.png b/skins/larry/images/listicons.png
index 5e48f17..e4ffef6 100644
--- a/skins/larry/images/listicons.png
+++ b/skins/larry/images/listicons.png
Binary files differ
diff --git a/skins/larry/styles.css b/skins/larry/styles.css
index 613a08a..3356413 100644
--- a/skins/larry/styles.css
+++ b/skins/larry/styles.css
@@ -995,6 +995,10 @@
 	background-color: #e8e798;
 }
 
+.listbox table.listing {
+	background-color: #d9ecf4;
+}
+
 table.listing,
 table.layout {
 	border: 0;
diff --git a/skins/larry/ui.js b/skins/larry/ui.js
index d2638bb..dad1093 100644
--- a/skins/larry/ui.js
+++ b/skins/larry/ui.js
@@ -175,6 +175,8 @@
     /***  addressbook task  ***/
     else if (rcmail.env.task == 'addressbook') {
       rcmail.addEventListener('afterupload-photo', show_uploadform);
+      rcmail.addEventListener('beforepushgroup', push_contactgroup);
+      rcmail.addEventListener('beforepopgroup', pop_contactgroup);
 
       if (rcmail.env.action == '') {
         new rcube_splitter({ id:'addressviewsplitterd', p1:'#addressview-left', p2:'#addressview-right',
@@ -745,6 +747,35 @@
     });
   }
 
+  function push_contactgroup(p)
+  {
+    // lets the contacts list swipe to the left, nice!
+    var table = $('#contacts-table'),
+      scroller = table.parent().css('overflow', 'hidden');
+
+    table.clone()
+      .css({ position:'absolute', top:'0', left:'0', width:table.width()+'px', 'z-index':10 })
+      .appendTo(scroller)
+      .animate({ left: -(table.width()+5) + 'px' }, 300, 'swing', function(){
+        $(this).remove();
+        scroller.css('overflow', 'auto')
+      });
+  }
+
+  function pop_contactgroup(p)
+  {
+    // lets the contacts list swipe to the left, nice!
+    var table = $('#contacts-table'),
+      scroller = table.parent().css('overflow', 'hidden'),
+      clone = table.clone().appendTo(scroller);
+
+      table.css({ position:'absolute', top:'0', left:-(table.width()+5) + 'px', width:table.width()+'px', height:table.height()+'px', 'z-index':10 })
+        .animate({ left:'0' }, 300, 'linear', function(){
+        clone.remove();
+        $(this).css({ position:'relative', left:'0', width:'100%', height:'auto', 'z-index':1 });
+        scroller.css('overflow', 'auto')
+      });
+  }
 
   function show_uploadform()
   {
@@ -755,7 +786,7 @@
       $dialog.dialog('close');
       return;
     }
-    
+
     // add icons to clone file input field
     if (rcmail.env.action == 'compose' && !$dialog.data('extended')) {
       $('<a>')

--
Gitblit v1.9.1