diff --git a/plugins/kolab_activesync/kolab_activesync.js b/plugins/kolab_activesync/kolab_activesync.js index b7ad998b..c28a8774 100644 --- a/plugins/kolab_activesync/kolab_activesync.js +++ b/plugins/kolab_activesync/kolab_activesync.js @@ -23,150 +23,153 @@ function kolab_activesync_config() { - /* private members */ - var me = this; - var http_lock = null; - var active_device = null; + /* private members */ + var me = this, + http_lock = null, + active_device = null; + rcmail.register_command('plugin.save-config', save_config); + rcmail.register_command('plugin.delete-device', delete_device_config); + rcmail.addEventListener('plugin.activesync_save_complete', save_complete); - /* constructor */ + if (rcmail.gui_objects.devicelist) { var devicelist = new rcube_list_widget(rcmail.gui_objects.devicelist, - { multiselect:true, draggable:false, keyboard:true }); + { multiselect:true, draggable:false, keyboard:true }); devicelist.addEventListener('select', select_device); devicelist.init(); - rcmail.register_command('plugin.save-config', save_config); - rcmail.register_command('plugin.delete-device', delete_device_config); - rcmail.addEventListener('plugin.activesync_data_ready', device_data_ready); - rcmail.addEventListener('plugin.activesync_save_complete', save_complete); + // load frame if there are no devices + if (!rcmail.env.devicecount) + device_select(); + } + else { + if (rcmail.env.active_device) + rcmail.enable_command('plugin.save-config', true); - $('input.alarm').change(function(e){ if (this.checked) $('#'+this.id.replace(/_alarm/, '')).prop('checked', this.checked); }); - $('input.subscription').change(function(e){ if (!this.checked) $('#'+this.id+'_alarm').prop('checked', false); }); - $(window).bind('resize', resize_ui); - - $('.subscriptionblock thead td.subscription img, .subscriptionblock thead td.alarm img').click(function(e){ - var $this = $(this); - var classname = $this.parent().get(0).className; - var check = !($this.data('checked') || false); - $this.css('cursor', 'pointer').data('checked', check) - .closest('table').find('input.'+classname).prop('checked', check).change(); + $('input.alarm').change(function(e) { + if (this.checked) + $('#'+this.id.replace(/_alarm/, '')).prop('checked', this.checked); }); - // select first device - if (rcmail.env.devicecount) { - for (var imei in rcmail.env.devices) - break; - devicelist.select(imei); + $('input.subscription').change(function(e) { + if (!this.checked) + $('#'+this.id+'_alarm').prop('checked', false); + }); + + $('.subscriptionblock thead td.subscription img, .subscriptionblock thead td.alarm img').click(function(e) { + var $this = $(this), + classname = $this.parent().get(0).className, + list = $this.closest('table').find('input.'+classname), + check = list.not(':checked').length > 0; + + list.prop('checked', check).change(); + }); + } + + /* private methods */ + function select_device(list) + { + active_device = list.get_single_selection(); + + if (active_device) + device_select(active_device); + else if (rcmail.env.contentframe) + rcmail.show_contentframe(false); + }; + + function device_select(id) + { + var win, target = window, url = '&_action=plugin.activesync-config'; + + if (id) + url += '&_id='+urlencode(id); + else if (!rcmail.env.devicecount) + url += '&_init=1'; + else { + rcmail.show_contentframe(false); + return; } - /* private methods */ - function select_device(list) - { - active_device = list.get_single_selection(); - rcmail.enable_command('plugin.save-config', 'plugin.delete-device', true); - - if (active_device) { - http_lock = rcmail.set_busy(true, 'loading'); - rcmail.http_request('plugin.activesyncjson', { cmd:'load', id:active_device }, http_lock); - } - - $('#introtext').hide(); + if (win = rcmail.get_frame_window(rcmail.env.contentframe)) { + target = win; + url += '&_framed=1'; } - // callback from server after loading device data - function device_data_ready(data) - { - // reset form first - $('input.alarm:checked').prop('checked', false); - $('input.subscription:checked').prop('checked', false).change(); + if (String(target.location.href).indexOf(url) >= 0) + rcmail.show_contentframe(true); + else + rcmail.location_href(rcmail.env.comm_path+url, target, true); + }; - if (data.id && data.id == active_device) { - $('#config-device-alias').val(data.devicealias); -// $('#config-device-mode').val(data.syncmode); -// $('#config-device-laxpic').prop('checked', data.laxpic ? true : false); + // submit current configuration form to server + function save_config() + { + // TODO: validate device info + var data = { + cmd: 'save', + id: rcmail.env.active_device, + devicealias: $('#config-device-alias').val(), +// syncmode: $('#config-device-mode option:selected').val(), +// laxpic: $('#config-device-laxpic').get(0).checked ? 1 : 0 + }; - $('input.subscription').each(function(i, elem){ - var key = elem.value; - elem.checked = data.subscribed[key] ? true : false; - }).change(); - $('input.alarm').each(function(i, elem){ - var key = elem.value; - elem.checked = data.subscribed[key] == 2; - }); + if (data.devicealias == data.id) + data.devicealias = ''; - $('#configform, #prefs-box .boxtitle').show(); - resize_ui(); - } - else { - $('#configform, #prefs-box .boxtitle').hide(); - } + data.subscribed = {}; + $('input.subscription:checked').each(function(i, elem) { + data.subscribed[elem.value] = 1; + }); + $('input.alarm:checked').each(function(i, elem) { + if (data.subscribed[elem.value]) + data.subscribed[elem.value] = 2; + }); + + http_lock = rcmail.set_busy(true, 'kolab_activesync.savingdata'); + rcmail.http_post('plugin.activesync-json', data, http_lock); + }; + + // callback function when saving has completed + function save_complete(p) + { + // device updated + if (p.success && p.alias) + parent.window.activesync_object.update_list(p.id, p.alias); + + // device deleted + if (p.success && p.id && p.delete) { + active_device = null; + device_select(); + devicelist.remove_row(p.id); + rcmail.enable_command('plugin.delete-device', false); } - - // submit current configuration form to server - function save_config() - { - // TODO: validate device info - var data = { - cmd: 'save', - id: active_device, - devicealias: $('#config-device-alias').val(), -// syncmode: $('#config-device-mode option:selected').val(), -// laxpic: $('#config-device-laxpic').get(0).checked ? 1 : 0 - }; - - data.subscribed = {}; - $('input.subscription:checked').each(function(i, elem){ - data.subscribed[elem.value] = 1; - }); - $('input.alarm:checked').each(function(i, elem){ - if (data.subscribed[elem.value]) - data.subscribed[elem.value] = 2; - }); - - http_lock = rcmail.set_busy(true, 'kolab_activesync.savingdata'); - rcmail.http_post('plugin.activesyncjson', data, http_lock); + }; + // handler for delete commands + function delete_device_config() + { + if (active_device && confirm(rcmail.gettext('devicedeleteconfirm', 'kolab_activesync'))) { + http_lock = rcmail.set_busy(true, 'kolab_activesync.savingdata'); + rcmail.http_post('plugin.activesync-json', { cmd:'delete', id:active_device }, http_lock); } + }; - // callback function when saving has completed - function save_complete(p) - { - if (p.success && p.devicealias) { - $('#devices-table tr.selected span.devicealias').html(p.devicealias); - rcmail.env.devices[p.id].ALIAS = p.devicealias; - } - } - - // handler for delete commands - function delete_device_config() - { - if (active_device && confirm(rcmail.gettext('devicedeleteconfirm', 'kolab_activesync'))) { - http_lock = rcmail.set_busy(true, 'kolab_activesync.savingdata'); - rcmail.http_post('plugin.activesyncjson', { cmd:'delete', id:active_device }, http_lock); - } - } - - // handler for window resize events: sets max-height of folders list scroll container - function resize_ui() - { - if (active_device) { -//@TODO: this doesn't work good with Larry - var h = $(window).height(), pos = $('#foldersubscriptions').offset(); - $('#foldersubscriptions').css('max-height', (h - pos.top - 90) + 'px'); - } - } -} + this.update_list = function(id, name) + { + $('#devices-table tr.selected span.devicealias').html(name); + } +}; window.rcmail && rcmail.addEventListener('init', function(evt) { - var ACTION_CONFIG = 'plugin.activesyncconfig'; + // add button to tabs list + var tab = $('').attr('id', 'settingstabpluginactivesync').addClass('tablink'), + button = $('').attr('href', rcmail.env.comm_path+'&_action=plugin.activesync') + .html(rcmail.gettext('tabtitle', 'kolab_activesync')) + .appendTo(tab); + rcmail.add_element(tab, 'tabs'); - // add button to tabs list - var tab = $('').attr('id', 'settingstabpluginactivesyncconfig').addClass('tablink'); - var button = $('').attr('href', rcmail.env.comm_path+'&_action=plugin.activesyncconfig').html(rcmail.gettext('tabtitle', 'kolab_activesync')).appendTo(tab); - rcmail.add_element(tab, 'tabs'); - - if (rcmail.env.action == ACTION_CONFIG) - new kolab_activesync_config(); + if (/^plugin.activesync/.test(rcmail.env.action)) + activesync_object = new kolab_activesync_config(); }); diff --git a/plugins/kolab_activesync/kolab_activesync.php b/plugins/kolab_activesync/kolab_activesync.php index b93b1043..c87e9197 100644 --- a/plugins/kolab_activesync/kolab_activesync.php +++ b/plugins/kolab_activesync/kolab_activesync.php @@ -49,8 +49,9 @@ class kolab_activesync extends rcube_plugin $this->require_plugin('jqueryui'); $this->require_plugin('libkolab'); - $this->register_action('plugin.activesyncconfig', array($this, 'config_view')); - $this->register_action('plugin.activesyncjson', array($this, 'json_command')); + $this->register_action('plugin.activesync', array($this, 'config_view')); + $this->register_action('plugin.activesync-config', array($this, 'config_frame')); + $this->register_action('plugin.activesync-json', array($this, 'json_command')); $this->add_texts('localization/', true); $this->include_script('kolab_activesync.js'); @@ -65,33 +66,9 @@ class kolab_activesync extends rcube_plugin $imei = get_input_value('id', RCUBE_INPUT_GPC); switch ($cmd) { - case 'load': - $devices = $this->list_devices(); - - if ($device = $devices[$imei]) { - $result['id'] = $imei; - $result['devicealias'] = $device['ALIAS']; -// $result['syncmode'] = intval($device['MODE']); -// $result['laxpic'] = intval($device['LAXPIC']); - $result['subscribed'] = array(); - - foreach ($this->folder_meta() as $folder => $meta) { - if ($meta['FOLDER'][$imei]['S']) { - $result['subscribed'][$folder] = intval($meta['FOLDER'][$imei]['S']); - } - } - - $this->rc->output->command('plugin.activesync_data_ready', $result); - } - else { - $this->rc->output->show_message($this->gettext('devicenotfound'), 'error'); - } - break; - case 'save': - $devices = $this->list_devices(); - $device = $devices[$imei]; - + $devices = $this->list_devices(); + $device = $devices[$imei]; $subscriptions = (array) get_input_value('subscribed', RCUBE_INPUT_POST); $devicealias = get_input_value('devicealias', RCUBE_INPUT_POST, true); // $syncmode = intval(get_input_value('syncmode', RCUBE_INPUT_POST)); @@ -115,7 +92,7 @@ class kolab_activesync extends rcube_plugin } $this->rc->output->command('plugin.activesync_save_complete', array( - 'success' => !$err, 'id' => $imei, 'devicealias' => Q($devicealias))); + 'success' => !$err, 'id' => $imei, 'alias' => Q($devicealias))); } if ($err) @@ -130,7 +107,8 @@ class kolab_activesync extends rcube_plugin if ($success) { $this->rc->output->show_message($this->gettext('successfullydeleted'), 'confirmation'); - $this->rc->output->redirect(array('action' => 'plugin.activesyncconfig')); // reload UI + $this->rc->output->command('plugin.activesync_save_complete', array( + 'success' => true, 'id' => $imei, 'delete' => true)); } else $this->rc->output->show_message($this->gettext('savingerror'), 'error'); @@ -142,7 +120,7 @@ class kolab_activesync extends rcube_plugin } /** - * Render main UI for device configuration + * Render main UI for devices configuration */ public function config_view() { @@ -158,10 +136,47 @@ class kolab_activesync extends rcube_plugin $this->ui = new kolab_activesync_ui($this); $this->register_handler('plugin.devicelist', array($this->ui, 'device_list')); + + $this->rc->output->send('kolab_activesync.config'); + } + + /** + * Render device configuration form + */ + public function config_frame() + { + $storage = $this->rc->get_storage(); + + // checks if IMAP server supports any of METADATA, ANNOTATEMORE, ANNOTATEMORE2 + if (!($storage->get_capability('METADATA') || $storage->get_capability('ANNOTATEMORE') || $storage->get_capability('ANNOTATEMORE2'))) { + $this->rc->output->show_message($this->gettext('notsupported'), 'error'); + } + + require_once $this->home . '/kolab_activesync_ui.php'; + + $this->ui = new kolab_activesync_ui($this); + + if (!empty($_GET['_init'])) { + return $this->rc->output->send('kolab_activesync.configempty'); + } + $this->register_handler('plugin.deviceconfigform', array($this->ui, 'device_config_form')); $this->register_handler('plugin.foldersubscriptions', array($this->ui, 'folder_subscriptions')); - $this->rc->output->send('kolab_activesync.config'); + $imei = get_input_value('_id', RCUBE_INPUT_GPC); + $devices = $this->list_devices(); + + if ($device = $devices[$imei]) { + $this->ui->device = $device; + $this->ui->device['_id'] = $imei; + $this->rc->output->set_env('active_device', $imei); + $this->rc->output->command('parent.enable_command','plugin.delete-device', true); + } + else { + $this->rc->output->show_message($this->gettext('devicenotfound'), 'error'); + } + + $this->rc->output->send('kolab_activesync.configedit'); } /** @@ -259,6 +274,10 @@ class kolab_activesync extends rcube_plugin */ public function folder_set($name, $deviceid, $flag) { + if (empty($deviceid)) { + return false; + } + // get folders activesync config $metadata = $this->folder_meta(); $metadata = $metadata[$name]; @@ -415,7 +434,7 @@ class kolab_activesync extends rcube_plugin private function unserialize_metadata($str) { if (!empty($str)) { - $data = json_decode($str, true); + $data = @json_decode($str, true); return $data; } diff --git a/plugins/kolab_activesync/kolab_activesync_ui.php b/plugins/kolab_activesync/kolab_activesync_ui.php index 3deb1364..9e4fe5ce 100644 --- a/plugins/kolab_activesync/kolab_activesync_ui.php +++ b/plugins/kolab_activesync/kolab_activesync_ui.php @@ -1,7 +1,7 @@ @@ -27,6 +27,7 @@ class kolab_activesync_ui { private $rc; private $plugin; + public $device = array(); public function __construct($plugin) { @@ -39,13 +40,12 @@ class kolab_activesync_ui $this->rc->output->include_script('list.js'); } - public function device_list($attrib = array()) { $attrib += array('id' => 'devices-list'); $devices = $this->plugin->list_devices(); - $table = new html_table(); + $table = new html_table(); foreach ($devices as $id => $device) { $name = $device['ALIAS'] ? $device['ALIAS'] : $id; @@ -54,7 +54,6 @@ class kolab_activesync_ui } $this->rc->output->add_gui_object('devicelist', $attrib['id']); - $this->rc->output->set_env('devices', $devices); $this->rc->output->set_env('devicecount', count($devices)); return $table->show($attrib); @@ -68,7 +67,7 @@ class kolab_activesync_ui $field_id = 'config-device-alias'; $input = new html_inputfield(array('name' => 'devicealias', 'id' => $field_id, 'size' => 40)); $table->add('title', html::label($field_id, $this->plugin->gettext('devicealias'))); - $table->add(null, $input->show()); + $table->add(null, $input->show($this->device['ALIAS'] ? $this->device['ALIAS'] : $this->device['_id'])); /* $field_id = 'config-device-mode'; $select = new html_select(array('name' => 'syncmode', 'id' => $field_id)); @@ -81,8 +80,9 @@ class kolab_activesync_ui $table->add('title', $this->plugin->gettext('imageformat')); $table->add(null, html::label($field_id, $checkbox->show() . ' ' . $this->plugin->gettext('laxpiclabel'))); */ - if ($attrib['form']) + if ($attrib['form']) { $this->rc->output->add_gui_object('editform', $attrib['form']); + } return $table->show($attrib); } @@ -95,8 +95,13 @@ class kolab_activesync_ui // group folders by type (show only known types) $folder_groups = array('mail' => array(), 'contact' => array(), 'event' => array(), 'task' => array()); - $folder_meta = $this->plugin->folder_meta(); $folder_types = $this->plugin->list_types(); + $imei = $this->device['_id']; + $subscribed = array(); + + if ($imei) { + $folder_meta = $this->plugin->folder_meta(); + } foreach ($this->plugin->list_folders() as $folder) { if ($folder_types[$folder]) { @@ -108,6 +113,12 @@ class kolab_activesync_ui if (is_array($folder_groups[$type])) { $folder_groups[$type][] = $folder; + + if (!empty($folder_meta) && ($meta = $folder_meta[$folder]) + && $meta['FOLDER'] && $meta['FOLDER'][$imei]['S'] + ) { + $subscribed[$folder] = intval($meta['FOLDER'][$imei]['S']); + } } } @@ -119,7 +130,7 @@ class kolab_activesync_ui $attrib['type'] = $type; $html .= html::div('subscriptionblock', html::tag('h3', $type, $this->plugin->gettext($type)) . - $this->folder_subscriptions_block($group, $attrib)); + $this->folder_subscriptions_block($group, $attrib, $subscribed)); } $this->rc->output->add_gui_object('subscriptionslist', $attrib['id']); @@ -127,7 +138,7 @@ class kolab_activesync_ui return html::div($attrib, $html); } - public function folder_subscriptions_block($a_folders, $attrib) + public function folder_subscriptions_block($a_folders, $attrib, $subscribed) { $alarms = ($attrib['type'] == 'event' || $attrib['type'] == 'task'); @@ -157,7 +168,6 @@ class kolab_activesync_ui } $names[] = $origname; - $classes = array('mailbox'); if ($folder_class = rcmail_folder_classname($folder)) { @@ -169,10 +179,14 @@ class kolab_activesync_ui $padding = str_repeat('    ', $level); $table->add_row(array('class' => (($level+1) * $idx++) % 2 == 0 ? 'even' : 'odd')); - $table->add('subscription', $checkbox_sync->show('', array('value' => $folder, 'id' => $folder_id))); + $table->add('subscription', $checkbox_sync->show( + !empty($subscribed[$folder]) ? $folder : null, + array('value' => $folder, 'id' => $folder_id))); if ($alarms) { - $table->add('alarm', $checkbox_alarm->show('', array('value' => $folder, 'id' => $folder_id.'_alarm'))); + $table->add('alarm', $checkbox_alarm->show( + intval($subscribed[$folder]) > 1 ? $folder : null, + array('value' => $folder, 'id' => $folder_id.'_alarm'))); } $table->add(join(' ', $classes), html::label($folder_id, $padding . Q($foldername))); diff --git a/plugins/kolab_activesync/localization/en_US.inc b/plugins/kolab_activesync/localization/en_US.inc index be9fdf2d..2399b13e 100644 --- a/plugins/kolab_activesync/localization/en_US.inc +++ b/plugins/kolab_activesync/localization/en_US.inc @@ -28,5 +28,6 @@ $labels['savingerror'] = 'Failed to save configuration'; $labels['notsupported'] = 'Your server does not support metadata/annotations'; $labels['devicedeleteconfirm'] = 'Do you really want to delete the configuration for this device?'; $labels['successfullydeleted'] = 'The device configuration was successfully removed'; +$labels['devicenotfound'] = 'Unable to read device configuration'; -?> \ No newline at end of file +?> diff --git a/plugins/kolab_activesync/package.xml b/plugins/kolab_activesync/package.xml index 464dc79b..09e8d668 100644 --- a/plugins/kolab_activesync/package.xml +++ b/plugins/kolab_activesync/package.xml @@ -19,9 +19,9 @@ bruederli@kolabsys.com yes - 2012-07-02 + 2012-08-29 - 1.0 + 0.9 1.0 @@ -39,6 +39,8 @@ + + @@ -46,6 +48,8 @@ + + diff --git a/plugins/kolab_activesync/skins/classic/config.css b/plugins/kolab_activesync/skins/classic/config.css index 176d1484..8d7e13dd 100644 --- a/plugins/kolab_activesync/skins/classic/config.css +++ b/plugins/kolab_activesync/skins/classic/config.css @@ -1,15 +1,9 @@ -/* Stylesheets for the Kolab Z-Push configuration UI */ -#configform { - padding-top: 15px; -} +/* Stylesheets for the Kolab ActiveSync configuration UI */ #devices-table { width: 100%; table-layout: fixed; -} - -#devices-table td { - cursor: pointer; + cursor: default; } #devices-table td span.devicetype { @@ -38,24 +32,24 @@ div.subscriptionblock h3 { font-size: 12px; color: #333; margin: 0 0 0.4em 0; - padding: 4px 4px 5px 30px; - background: url(foldertypes.png) 4px 4px no-repeat #fbfbfb; + padding: 4px 4px 0 30px; + background: url(foldertypes.png) 5px 4px no-repeat #eee; } div.subscriptionblock h3.contact { - background-position: 4px -16px; + background-position: 5px -16px; } div.subscriptionblock h3.event { - background-position: 4px -36px; + background-position: 5px -36px; } div.subscriptionblock h3.task { - background-position: 4px -56x; + background-position: 5px -56px; } div.subscriptionblock h3.note { - background-position: 4px -76px; + background-position: 5px -76px; } #foldersubscriptions thead td { @@ -65,13 +59,22 @@ div.subscriptionblock h3.note { text-align: center; } +#foldersubscriptions thead tr td { + border-top: 1px solid #ddd; +} + +#foldersubscriptions thead td img { + cursor: pointer; +} + #foldersubscriptions thead td.foldername { text-align: left; } #foldersubscriptions tbody td { - padding: 2px; + padding: 1px 2px; border-top: 1px solid #ddd; + background-color: white; } #foldersubscriptions td label { @@ -80,6 +83,7 @@ div.subscriptionblock h3.note { #foldersubscriptions td.mailbox { min-width: 12em; + padding-right: 10px; } #foldersubscriptions td.virtual { @@ -88,7 +92,6 @@ div.subscriptionblock h3.note { #foldersubscriptions { overflow: auto; - max-height: 400px; margin-top: 0.5em; } diff --git a/plugins/kolab_activesync/skins/classic/templates/config.html b/plugins/kolab_activesync/skins/classic/templates/config.html index 87ef4630..aea9f78c 100644 --- a/plugins/kolab_activesync/skins/classic/templates/config.html +++ b/plugins/kolab_activesync/skins/classic/templates/config.html @@ -15,38 +15,13 @@
-
-
- -
-
- -
-
- -
- - -
-
- -
-
+
+
+ +
+
+
-
-
+
+ +
+ +
+ diff --git a/plugins/kolab_activesync/skins/classic/templates/configedit.html b/plugins/kolab_activesync/skins/classic/templates/configedit.html new file mode 100644 index 00000000..8115ef6f --- /dev/null +++ b/plugins/kolab_activesync/skins/classic/templates/configedit.html @@ -0,0 +1,30 @@ + + + +<roundcube:object name="pagetitle" /> + + + + +
+ +
+
+
+ + +
+
+ + +
+
+
+
+ +
+
+
+ + + diff --git a/plugins/kolab_activesync/skins/classic/templates/configempty.html b/plugins/kolab_activesync/skins/classic/templates/configempty.html new file mode 100644 index 00000000..5afd3ce8 --- /dev/null +++ b/plugins/kolab_activesync/skins/classic/templates/configempty.html @@ -0,0 +1,19 @@ + + + +<roundcube:object name="pagetitle" /> + + + + +
+
+
+ +
+
+
+
+ + + diff --git a/plugins/kolab_activesync/skins/larry/config.css b/plugins/kolab_activesync/skins/larry/config.css index 20e9afc2..a676f2c8 100644 --- a/plugins/kolab_activesync/skins/larry/config.css +++ b/plugins/kolab_activesync/skins/larry/config.css @@ -1,8 +1,4 @@ -/* Stylesheets for the Kolab Z-Push configuration UI */ - -#configform { - padding-top: 15px; -} +/* Stylesheets for the Kolab ActiveSync configuration UI */ #sectionslist { width: 220px; @@ -16,15 +12,15 @@ bottom: 0; } +#activesync-frame { + border-radius: 3px; +} + #devices-table { width: 100%; table-layout: fixed; } -#devices-table td { - cursor: pointer; -} - #devices-table td span.devicetype { padding-left: 1em; font-style: italic; @@ -76,6 +72,10 @@ div.subscriptionblock h3.note { text-align: left; } +#foldersubscriptions thead td img { + cursor: pointer; +} + #foldersubscriptions tbody td { background: #eee; padding: 2px; @@ -98,7 +98,6 @@ div.subscriptionblock h3.note { #foldersubscriptions { overflow: auto; - max-height: 400px; margin-top: 0.5em; } diff --git a/plugins/kolab_activesync/skins/larry/templates/config.html b/plugins/kolab_activesync/skins/larry/templates/config.html index ae43a3d0..88d42bcc 100644 --- a/plugins/kolab_activesync/skins/larry/templates/config.html +++ b/plugins/kolab_activesync/skins/larry/templates/config.html @@ -15,44 +15,26 @@
-

-
- -
-
- -
+

+
+ +
+
+ +
-

- - -
-
- -
-
+
+
-
+
+