summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas Bruederli <thomas@roundcube.net>2013-01-11 14:39:23 +0100
committerThomas Bruederli <thomas@roundcube.net>2013-01-11 14:39:23 +0100
commit9a6c38e14895bd093627e12f2fcf2c6ff1e3af3c (patch)
tree26a847ee6e28a7c7bd53c89dbf1aa11b8fa70882
parentc59ef9542a93a5cbacd99fe3dcfc0975bc749a12 (diff)
New feature to export only selected contacts from addressbook (by Phil Weir)
-rw-r--r--CHANGELOG1
-rw-r--r--program/js/app.js8
-rw-r--r--program/localization/en_US/labels.inc2
-rw-r--r--program/steps/addressbook/export.inc23
-rw-r--r--skins/classic/addressbook.css8
-rw-r--r--skins/classic/templates/addressbook.html10
-rw-r--r--skins/larry/styles.css2
-rw-r--r--skins/larry/templates/addressbook.html12
8 files changed, 64 insertions, 2 deletions
diff --git a/CHANGELOG b/CHANGELOG
index 25d79d1e2..ecc45c220 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 c627983f4..2804e88df 100644
--- a/program/js/app.js
+++ b/program/js/app.js
@@ -1090,6 +1090,12 @@ function rcube_webmail()
}
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 @@ function rcube_webmail()
// 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 @@ function rcube_webmail()
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 9deaa6677..a0b6e6a31 100644
--- a/program/localization/en_US/labels.inc
+++ b/program/localization/en_US/labels.inc
@@ -335,6 +335,8 @@ $labels['composeto'] = 'Compose mail to';
$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 850795c85..bf0657b74 100644
--- a/program/steps/addressbook/export.inc
+++ b/program/steps/addressbook/export.inc
@@ -56,6 +56,29 @@ if (!empty($_REQUEST['_search']) && isset($_SESSION['search'][$_REQUEST['_search
$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 a398325b4..1bb1e2c61 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 74673007a..404fb2c11 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 9386c79d7..773ef23d4 100644
--- a/skins/larry/styles.css
+++ b/skins/larry/styles.css
@@ -1680,6 +1680,7 @@ ul.proplist li {
}
.toolbar a.button.export {
+ min-width: 74px;
background-position: center -1054px;
}
@@ -1695,7 +1696,6 @@ ul.proplist li {
background-position: 0 -1745px;
}
-
a.menuselector {
display: inline-block;
border: 1px solid #ababab;
diff --git a/skins/larry/templates/addressbook.html b/skins/larry/templates/addressbook.html
index 9a9a2d747..7904f6f3a 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">