From 9a6c38e14895bd093627e12f2fcf2c6ff1e3af3c Mon Sep 17 00:00:00 2001
From: Thomas Bruederli <thomas@roundcube.net>
Date: Fri, 11 Jan 2013 08:39:23 -0500
Subject: [PATCH] New feature to export only selected contacts from addressbook (by Phil Weir)

---
 skins/classic/templates/addressbook.html |   10 +++++
 CHANGELOG                                |    1 
 skins/larry/templates/addressbook.html   |   12 +++++
 skins/classic/addressbook.css            |    8 ++++
 program/localization/en_US/labels.inc    |    2 +
 program/steps/addressbook/export.inc     |   23 +++++++++++
 skins/larry/styles.css                   |    2 
 program/js/app.js                        |    8 ++++
 8 files changed, 64 insertions(+), 2 deletions(-)

diff --git a/CHANGELOG b/CHANGELOG
index 25d79d1..ecc45c2 100644
--- a/CHANGELOG
+++ b/CHANGELOG
@@ -1,6 +1,7 @@
 CHANGELOG Roundcube Webmail
 ===========================
 
+- Feature to export only selected contacts from addressbook (by Phil Weir)
 - Force autocommit mode in mysql database driver (#1488902)
 
 RELEASE 0.9-beta
diff --git a/program/js/app.js b/program/js/app.js
index c627983..2804e88 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -1090,6 +1090,12 @@
         }
         break;
 
+      case 'export-selected':
+        if (this.contact_list.rowcount > 0) {
+          this.goto_url('export', { _source: this.env.source, _gid: this.env.group, _cid: this.contact_list.get_selection().join(',') });
+        }
+        break;
+
       case 'upload-photo':
         this.upload_contact_photo(props || this.gui_objects.uploadform);
         break;
@@ -4115,6 +4121,7 @@
     // thend we can enable the group-remove-selected command
     this.enable_command('group-remove-selected', this.env.group && list.selection.length > 0);
     this.enable_command('compose', this.env.group || list.selection.length > 0);
+    this.enable_command('export-selected', list.selection.length > 0);
     this.enable_command('edit', id && writable);
     this.enable_command('delete', list.selection.length && writable);
 
@@ -6238,6 +6245,7 @@
           this.enable_command('compose', (uid && this.contact_list.rows[uid]));
           this.enable_command('delete', 'edit', writable);
           this.enable_command('export', (this.contact_list && this.contact_list.rowcount > 0));
+          this.enable_command('export-selected', false);
         }
 
       case 'moveto':
diff --git a/program/localization/en_US/labels.inc b/program/localization/en_US/labels.inc
index 9deaa66..a0b6e6a 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -335,6 +335,8 @@
 $labels['contactsfromto'] = 'Contacts $from to $to of $count';
 $labels['print']          = 'Print';
 $labels['export']         = 'Export';
+$labels['exportall']      = 'Export all';
+$labels['exportsel']      = 'Export selected';
 $labels['exportvcards']   = 'Export contacts in vCard format';
 $labels['newcontactgroup'] = 'Create new contact group';
 $labels['grouprename']    = 'Rename group';
diff --git a/program/steps/addressbook/export.inc b/program/steps/addressbook/export.inc
index 850795c..bf0657b 100644
--- a/program/steps/addressbook/export.inc
+++ b/program/steps/addressbook/export.inc
@@ -56,6 +56,29 @@
     $result = new rcube_result_set($count);
     $result->records = array_values($records);
 }
+// selected contacts
+else if (!empty($_REQUEST['_cid'])) {
+    $sort_col = $RCMAIL->config->get('addressbook_sort_col', 'name');
+    $records = array();
+
+    $cids = explode(',', get_input_value('_cid', RCUBE_INPUT_GET));
+    $CONTACTS = rcmail_contact_source(null, true);
+
+    // Get records from all sources
+    foreach ($cids as $cid) {
+        $record = $CONTACTS->get_record($cid, true);
+        $key = rcmail_contact_key($record, $sort_col);
+        $records[$key] = $record;
+        unset($record);
+    }
+
+    ksort($records, SORT_LOCALE_STRING);
+
+    // create resultset object
+    $count  = count($records);
+    $result = new rcube_result_set($count);
+    $result->records = array_values($records);
+}
 // selected directory/group
 else {
     $CONTACTS = rcmail_contact_source(null, true);
diff --git a/skins/classic/addressbook.css b/skins/classic/addressbook.css
index a398325..1bb1e2c 100644
--- a/skins/classic/addressbook.css
+++ b/skins/classic/addressbook.css
@@ -67,6 +67,14 @@
   background-position: -128px -32px;
 }
 
+#abooktoolbar a.exportAll {
+  background-position: -128px 0;
+}
+
+#abooktoolbar a.exportAllSel {
+  background-position: -128px -32px;
+}
+
 #abooktoolbar span.separator {
   width: 5px;
   background-position: -162px 0;
diff --git a/skins/classic/templates/addressbook.html b/skins/classic/templates/addressbook.html
index 7467300..404fb2c 100644
--- a/skins/classic/templates/addressbook.html
+++ b/skins/classic/templates/addressbook.html
@@ -27,7 +27,10 @@
 <roundcube:button command="delete" type="link" class="buttonPas delete" classAct="button delete" classSel="button deleteSel" title="deletecontact" content=" " />
 <span class="separator">&nbsp;</span>
 <roundcube:button command="import" type="link" class="buttonPas import" classAct="button import" classSel="button importSel" title="importcontacts" content=" " />
+<span class="dropbutton">
 <roundcube:button command="export" type="link" class="buttonPas export" classAct="button export" classSel="button exportSel" title="exportvcards" content=" " />
+<span id="exportmenulink" onclick="rcmail_ui.show_popup('exportmenu');return false"></span>
+</span>
 <roundcube:button command="advanced-search" type="link" class="buttonPas search" classAct="button search" classSel="button searchSel" title="advsearch" content=" " />
 <roundcube:container name="toolbar" id="abooktoolbar" />
 </div>
@@ -38,6 +41,13 @@
 <roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" width="13" height="13" />
 </div>
 
+<div id="exportmenu" class="popupmenu">
+    <ul>
+        <li><roundcube:button command="export" label="exportall" prop="sub" classAct="exportalllink active" class="exportalllink" /></li>
+        <li><roundcube:button command="export-selected" label="exportsel" prop="sub" classAct="exportsellink active" class="exportsellink" /></li>
+    </ul>
+</div>
+
 <div id="searchmenu" class="popupmenu">
   <ul class="toolbarmenu">
     <li><label><input type="checkbox" name="s_mods[]" value="name" id="s_mod_name" onclick="rcmail_ui.set_searchmod(this)" /> <span><roundcube:label name="name" /></span></label></li>
diff --git a/skins/larry/styles.css b/skins/larry/styles.css
index 9386c79..773ef23 100644
--- a/skins/larry/styles.css
+++ b/skins/larry/styles.css
@@ -1680,6 +1680,7 @@
 }
 
 .toolbar a.button.export {
+	min-width: 74px;
 	background-position: center -1054px;
 }
 
@@ -1694,7 +1695,6 @@
 .toolbar a.button.close {
 	background-position: 0 -1745px;
 }
-
 
 a.menuselector {
 	display: inline-block;
diff --git a/skins/larry/templates/addressbook.html b/skins/larry/templates/addressbook.html
index 9a9a2d7..7904f6f 100644
--- a/skins/larry/templates/addressbook.html
+++ b/skins/larry/templates/addressbook.html
@@ -13,7 +13,11 @@
 <!-- toolbar -->
 <div id="addressbooktoolbar" class="toolbar">
 	<roundcube:button command="import" type="link" class="button import disabled" classAct="button import" classSel="button import pressed" label="import" title="importcontacts" />
-	<roundcube:button command="export" type="link" class="button export disabled" classAct="button export" classSel="button export pressed" label="export" title="exportvcards" />
+	<span class="dropbutton">
+		<roundcube:button command="export" type="link" class="button export disabled" classAct="button export" classSel="button export pressed" label="export" title="exportvcards" />
+		<span class="dropbuttontip" id="exportmenulink" onclick="UI.show_popup('exportmenu');return false"></span>
+	</span>
+
 	<span class="spacer"></span>
 	<roundcube:button command="compose" type="link" class="button compose disabled" classAct="button compose" classSel="button compose pressed" label="compose" title="writenewmessage" />
 	<roundcube:button command="advanced-search" type="link" class="button search disabled" classAct="button search" classSel="button search pressed" label="advanced" title="advsearch" />
@@ -75,6 +79,12 @@
 
 </div><!-- end mainscreen -->
 
+<div id="exportmenu" class="popupmenu">
+	<ul class="toolbarmenu">
+		<li><roundcube:button command="export" label="exportall" prop="sub" class="exportalllink" classAct="exportalllink active" /></li>
+		<li><roundcube:button command="export-selected" label="exportsel" prop="sub" class="exportsellink" classAct="exportsellink active" /></li>
+	</ul>
+</div>
 
 <div id="searchmenu" class="popupmenu">
 	<ul class="toolbarmenu">

--
Gitblit v1.9.1