From ca38db5744bc8c46c4a23d1ba68c6c4c9b5b4a07 Mon Sep 17 00:00:00 2001
From: thomascube <thomas@roundcube.net>
Date: Tue, 01 Jun 2010 14:11:57 -0400
Subject: [PATCH] Allow to drag into groups of another address source

---
 skins/default/common.css                |   21 ++++++++++
 skins/default/images/messageactions.png |    0 
 skins/default/ie6hacks.css              |    4 ++
 skins/default/images/messageactions.gif |    0 
 program/js/app.js                       |   63 ++++++++++++++++++++++++-------
 program/steps/addressbook/copy.inc      |   14 +++++-
 6 files changed, 84 insertions(+), 18 deletions(-)

diff --git a/program/js/app.js b/program/js/app.js
index bbaa79d..fc9ef77 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -1243,7 +1243,11 @@
       var boffset = bw.ie ? -document.documentElement.scrollTop : this.initialBodyScrollTop;
       var moffset = this.initialListScrollTop-this.gui_objects.folderlist.parentNode.scrollTop;
       var toffset = -moffset-boffset;
-      var li, div, pos, mouse;
+      var li, div, pos, mouse, check, oldclass,
+        layerclass = 'draglayernormal';
+      
+      if (this.contact_list && this.contact_list.draglayer)
+        oldclass = this.contact_list.draglayer.attr('class');
 
       mouse = rcube_event.get_mouse_pos(e);
       pos = this.env.folderlist_coords;
@@ -1256,6 +1260,8 @@
           this.env.folder_coords[this.env.last_folder_target].on = 0;
           this.env.last_folder_target = null;
         }
+        if (layerclass != oldclass && this.contact_list && this.contact_list.draglayer)
+          this.contact_list.draglayer.attr('class', layerclass);
         return;
       }
 
@@ -1263,7 +1269,7 @@
       for (var k in this.env.folder_coords) {
         pos = this.env.folder_coords[k];
         if (mouse.x >= pos.x1 && mouse.x < pos.x2 && mouse.y >= pos.y1 && mouse.y < pos.y2){
-         if (this.check_droptarget(k)) {
+         if ((check = this.check_droptarget(k))) {
             li = this.get_folder_li(k);
             div = $(li.getElementsByTagName('div')[0]);
 
@@ -1286,6 +1292,7 @@
             $(li).addClass('droptarget');
             this.env.folder_coords[k].on = 1;
             this.env.last_folder_target = k;
+            layerclass = 'draglayer' + (check > 1 ? 'copy' : 'normal');
           } else { // Clear target, otherwise drag end will trigger move into last valid droptarget
             this.env.last_folder_target = null;
           }
@@ -1295,6 +1302,9 @@
           this.env.folder_coords[k].on = 0;
         }
       }
+      
+      if (layerclass != oldclass && this.contact_list && this.contact_list.draglayer)
+        this.contact_list.draglayer.attr('class', layerclass);
     }
   };
 
@@ -1509,16 +1519,27 @@
 
   this.check_droptarget = function(id)
   {
+    var allow = false, copy = false;
+    
     if (this.task == 'mail')
-      return (this.env.mailboxes[id] && this.env.mailboxes[id].id != this.env.mailbox && !this.env.mailboxes[id].virtual);
-    else if (this.task == 'addressbook')
-      return (id != this.env.source && this.env.contactfolders[id] && !this.env.contactfolders[id].readonly &&
-        !(!this.env.source && this.env.contactfolders[id].group) &&
-        !(this.env.contactfolders[id].type == 'group' && this.env.contactfolders[this.env.source].readonly) &&
-        !(this.env.contactfolders[id].type == 'group' && this.env.contactfolders[id].source != this.env.source) &&
-        !(this.env.contactfolders[id].type == 'group' && this.env.contactfolders[id].id == this.env.group));
+      allow = (this.env.mailboxes[id] && this.env.mailboxes[id].id != this.env.mailbox && !this.env.mailboxes[id].virtual);
     else if (this.task == 'settings')
-      return (id != this.env.folder);
+      allow = (id != this.env.folder);
+    else if (this.task == 'addressbook') {
+      if (id != this.env.source && this.env.contactfolders[id]) {
+        if (this.env.contactfolders[id].type == 'group') {
+          var target_abook = this.env.contactfolders[id].source;
+          allow = this.env.contactfolders[id].id != this.env.group && !this.env.contactfolders[target_abook].readonly;
+          copy = target_abook != this.env.source;
+        }
+        else {
+          allow = !this.env.contactfolders[id].readonly;
+          copy = true;
+        }
+      }
+    }
+    
+    return allow ? (copy ? 2 : 1) : 0;
   };
 
 
@@ -3633,10 +3654,24 @@
     if (!cid)
       cid = this.contact_list.get_selection().join(',');
 
-    if (to.type == 'group')
-      this.http_post('group-addmembers', '_cid='+urlencode(cid)+'&_source='+urlencode(this.env.source)+'&_gid='+urlencode(to.id));
-    else if (to.id != this.env.source && cid && this.env.address_sources[to.id] && !this.env.address_sources[to.id].readonly)
-      this.http_post('copy', '_cid='+urlencode(cid)+'&_source='+urlencode(this.env.source)+'&_to='+urlencode(to.id)+(this.env.group ? '&_gid='+urlencode(this.env.group) : ''));
+    if (to.type == 'group' && to.source == this.env.source) {
+      this.http_post('group-addmembers', '_cid='+urlencode(cid)
+        + '&_source='+urlencode(this.env.source)
+        + '&_gid='+urlencode(to.id));
+    }
+    else if (to.type == 'group' && !this.env.address_sources[to.source].readonly) {
+      this.http_post('copy', '_cid='+urlencode(cid)
+        + '&_source='+urlencode(this.env.source)
+        + '&_to='+urlencode(to.source)
+        + '&_togid='+urlencode(to.id)
+        + (this.env.group ? '&_gid='+urlencode(this.env.group) : ''));
+    }
+    else if (to.id != this.env.source && cid && this.env.address_sources[to.id] && !this.env.address_sources[to.id].readonly) {
+      this.http_post('copy', '_cid='+urlencode(cid)
+        + '&_source='+urlencode(this.env.source)
+        + '&_to='+urlencode(to.id)
+        + (this.env.group ? '&_gid='+urlencode(this.env.group) : ''));
+    }
   };
 
 
diff --git a/program/steps/addressbook/copy.inc b/program/steps/addressbook/copy.inc
index c8076c4..2d3a91a 100644
--- a/program/steps/addressbook/copy.inc
+++ b/program/steps/addressbook/copy.inc
@@ -25,6 +25,7 @@
 
 $cid = get_input_value('_cid', RCUBE_INPUT_POST);
 $target = get_input_value('_to', RCUBE_INPUT_POST);
+$target_group = get_input_value('_togid', RCUBE_INPUT_POST);
 
 if ($cid && preg_match('/^[a-z0-9\-_=]+(,[a-z0-9\-_=]+)*$/i', $cid) && strlen($target) && $target !== $source)
 {
@@ -32,12 +33,19 @@
   $TARGET = $RCMAIL->get_address_book($target);
 
   if ($TARGET && $TARGET->ready && !$TARGET->readonly) {
+    if ($target_group && $TARGET->groups)
+      $TARGET->set_group($target_group);
+    
     $arr_cids = explode(',', $cid);
     foreach ($arr_cids as $cid) {
-      $plugin = $RCMAIL->plugins->exec_hook('create_contact', array('record' => $CONTACTS->get_record($cid, true), 'source' => $target));
-    $a_record = $plugin['record'];
+      $plugin = $RCMAIL->plugins->exec_hook('create_contact', array(
+        'record' => $CONTACTS->get_record($cid, true),
+        'source' => $target,
+        'group' => $target_group,
+      ));
+      $a_record = $plugin['record'];
 
-    if (!$plugin['abort'])
+      if (!$plugin['abort'])
         if ($TARGET->insert($a_record, true))
           $success++;
     }
diff --git a/skins/default/common.css b/skins/default/common.css
index 7959e75..18cc811 100644
--- a/skins/default/common.css
+++ b/skins/default/common.css
@@ -510,7 +510,26 @@
   padding-bottom: 3px;
   font-size: 11px;
   white-space: nowrap;
-  opacity: 0.7;
+  opacity: 0.82;
+  border-radius: 3px;
+  -moz-border-radius: 3px;
+  -webkit-border-radius: 3px;
+  -moz-box-shadow: 1px 1px 12px #999;
+  -webkit-box-shadow: #999 1px 1px 12px;
+}
+
+.draglayernormal:before {
+  
+}
+
+.draglayercopy:before {
+  position: absolute;
+  bottom: -5px;
+  left: -6px;
+  content: " ";
+  width: 14px;
+  height: 14px;
+  background: url(images/messageactions.png) -2px -128px no-repeat;
 }
 
 a.rcmContactAddress
diff --git a/skins/default/ie6hacks.css b/skins/default/ie6hacks.css
index 87c6483..05c004c 100644
--- a/skins/default/ie6hacks.css
+++ b/skins/default/ie6hacks.css
@@ -69,3 +69,7 @@
 {
   padding-bottom: 8px;
 }
+
+.draglayercopy:before {
+  background-image: url(images/messageactions.png);
+}
diff --git a/skins/default/images/messageactions.gif b/skins/default/images/messageactions.gif
index 94fcba4..b73fbb3 100644
--- a/skins/default/images/messageactions.gif
+++ b/skins/default/images/messageactions.gif
Binary files differ
diff --git a/skins/default/images/messageactions.png b/skins/default/images/messageactions.png
index b3e648e..c09f60f 100644
--- a/skins/default/images/messageactions.png
+++ b/skins/default/images/messageactions.png
Binary files differ

--
Gitblit v1.9.1