diff --git a/plugins/kolab_addressbook/kolab_addressbook.js b/plugins/kolab_addressbook/kolab_addressbook.js index 18147b7d..5c34138a 100644 --- a/plugins/kolab_addressbook/kolab_addressbook.js +++ b/plugins/kolab_addressbook/kolab_addressbook.js @@ -1,557 +1,566 @@ /** * Client script for the Kolab address book plugin * * @author Aleksander Machniak * @author Thomas Bruederli * * @licstart The following is the entire license notice for the * JavaScript code in this file. * * Copyright (C) 2011-2014, Kolab Systems AG * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as * published by the Free Software Foundation, either version 3 of the * License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . * * @licend The above is the entire license notice * for the JavaScript code in this file. */ if (window.rcmail) { rcmail.addEventListener('init', function() { rcmail.set_book_actions(); // contextmenu kolab_addressbook_contextmenu(); // append search form for address books if (rcmail.gui_objects.folderlist) { // remove event handlers set by the regular treelist widget rcmail.treelist.container.off('click mousedown focusin focusout'); // re-initialize folderlist widget // copy form app.js with additional parameters var widget_class = window.kolab_folderlist || rcube_treelist_widget; rcmail.treelist = new widget_class(rcmail.gui_objects.folderlist, { selectable: true, id_prefix: 'rcmli', id_encode: rcmail.html_identifier_encode, id_decode: rcmail.html_identifier_decode, searchbox: '#addressbooksearch', search_action: 'plugin.book-search', search_sources: [ 'folders', 'users' ], search_title: rcmail.gettext('listsearchresults','kolab_addressbook'), check_droptarget: function(node) { return !node.virtual && rcmail.check_droptarget(node.id) } }); rcmail.treelist .addEventListener('collapse', function(node) { rcmail.folder_collapsed(node) }) .addEventListener('expand', function(node) { rcmail.folder_collapsed(node) }) .addEventListener('select', function(node) { rcmail.triggerEvent('selectfolder', { folder:node.id, prefix:'rcmli' }) }) .addEventListener('subscribe', function(node) { var source; if ((source = rcmail.env.address_sources[node.id])) { source.subscribed = node.subscribed || false; rcmail.http_post('plugin.book-subscribe', { _source:node.id, _permanent:source.subscribed?1:0 }); } }) .addEventListener('remove', function(node) { if (rcmail.env.address_sources[node.id]) { rcmail.book_remove(node.id); } }) .addEventListener('insert-item', function(data) { // register new address source rcmail.env.address_sources[data.id] = rcmail.env.contactfolders[data.id] = data.data; // subscribe folder and load groups to add them to the list if (!data.data.virtual) rcmail.http_post('plugin.book-subscribe', { _source:data.id, _permanent:data.data.subscribed?1:0, _groups:1 }); }) .addEventListener('search-complete', function(data) { if (data.length) rcmail.display_message(rcmail.gettext('nraddressbooksfound','kolab_addressbook').replace('$nr', data.length), 'voice'); else rcmail.display_message(rcmail.gettext('noaddressbooksfound','kolab_addressbook'), 'notice'); }); } rcmail.contact_list && rcmail.contact_list.addEventListener('select', function(list) { var source, is_writable = true, is_traceable = false; // delete/move commands status was set by Roundcube core, // however, for Kolab addressbooks we like to check folder ACL if (list.selection.length && rcmail.commands['delete']) { $.each(rcmail.env.selection_sources, function() { source = rcmail.env.address_sources[this]; if (source && source.kolab && source.rights.indexOf('t') < 0) { return is_writable = false; } }); rcmail.enable_command('delete', 'move', is_writable); } if (list.get_single_selection()) { $.each(rcmail.env.selection_sources, function() { source = rcmail.env.address_sources[this]; is_traceable = source && !!source.audittrail; }); } rcmail.enable_command('contact-history-dialog', is_traceable); }); }); rcmail.addEventListener('listupdate', function() { rcmail.set_book_actions(); }); } // (De-)activates address book management commands rcube_webmail.prototype.set_book_actions = function() { var source = !this.env.group ? this.env.source : null, sources = this.env.address_sources || {}, props = source && sources[source] && sources[source].kolab ? sources[source] : { removable: false, rights: '' }; this.enable_command('book-create', true); this.enable_command('book-edit', props.rights.indexOf('a') >= 0); this.enable_command('book-delete', props.rights.indexOf('x') >= 0 || props.rights.indexOf('a') >= 0); this.enable_command('book-remove', props.removable); this.enable_command('book-showurl', !!props.carddavurl || source == this.env.kolab_addressbook_carddav_ldap); }; rcube_webmail.prototype.book_create = function() { this.book_dialog('create'); }; rcube_webmail.prototype.book_edit = function() { this.book_dialog('edit'); }; // displays page with book edit/create form rcube_webmail.prototype.book_dialog = function(action) { var title = rcmail.gettext('kolab_addressbook.book' + action), params = {_act: action, _framed: 1, _source: action == 'edit' ? this.env.source : ''}, dialog = $('