Greatly improved interface (use iframe for device form). Fixed layout/javascript issues.
This commit is contained in:
parent
defadb8cff
commit
892f7a2fb8
13 changed files with 362 additions and 255 deletions
|
@ -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 = $('<span>').attr('id', 'settingstabpluginactivesync').addClass('tablink'),
|
||||
button = $('<a>').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 = $('<span>').attr('id', 'settingstabpluginactivesyncconfig').addClass('tablink');
|
||||
var button = $('<a>').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();
|
||||
});
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
<?php
|
||||
|
||||
/**
|
||||
* Z-Push configuration user interface builder
|
||||
* ActiveSync configuration user interface builder
|
||||
*
|
||||
* @version @package_version@
|
||||
* @author Thomas Bruederli <bruederli@kolabsys.com>
|
||||
|
@ -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)));
|
||||
|
|
|
@ -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';
|
||||
|
||||
?>
|
||||
?>
|
||||
|
|
|
@ -19,9 +19,9 @@
|
|||
<email>bruederli@kolabsys.com</email>
|
||||
<active>yes</active>
|
||||
</lead>
|
||||
<date>2012-07-02</date>
|
||||
<date>2012-08-29</date>
|
||||
<version>
|
||||
<release>1.0</release>
|
||||
<release>0.9</release>
|
||||
<api>1.0</api>
|
||||
</version>
|
||||
<stability>
|
||||
|
@ -39,6 +39,8 @@
|
|||
<file name="localization/en_US.inc" role="data"></file>
|
||||
<file name="localization/pl_PL.inc" role="data"></file>
|
||||
<file name="skins/classic/templates/config.html" role="data"></file>
|
||||
<file name="skins/classic/templates/configedit.html" role="data"></file>
|
||||
<file name="skins/classic/templates/configempty.html" role="data"></file>
|
||||
<file name="skins/classic/config.css" role="data"></file>
|
||||
<file name="skins/classic/alarm-clock.png" role="data"></file>
|
||||
<file name="skins/classic/deviceactions.png" role="data"></file>
|
||||
|
@ -46,6 +48,8 @@
|
|||
<file name="skins/classic/pointer-left.gif" role="data"></file>
|
||||
<file name="skins/classic/synchronize.png" role="data"></file>
|
||||
<file name="skins/larry/templates/config.html" role="data"></file>
|
||||
<file name="skins/larry/templates/configedit.html" role="data"></file>
|
||||
<file name="skins/larry/templates/configempty.html" role="data"></file>
|
||||
<file name="skins/larry/config.css" role="data"></file>
|
||||
<file name="skins/larry/alarm-clock.png" role="data"></file>
|
||||
<file name="skins/larry/deviceactions.png" role="data"></file>
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,38 +15,13 @@
|
|||
<div id="mainscreen">
|
||||
|
||||
<div id="sectionslist">
|
||||
<div id="directorylist-title" class="boxtitle"><roundcube:label name="kolab_activesync.devices" /></div>
|
||||
<div class="boxlistcontent">
|
||||
<roundcube:object name="plugin.devicelist" id="devices-table" class="records-table" cellspacing="0" />
|
||||
</div>
|
||||
<div class="boxfooter">
|
||||
<roundcube:button type="link" command="plugin.delete-device" title="kolab_activesync.deletedevice" class="buttonPas delete" classAct="button delete" content=" " />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="prefs-box">
|
||||
<div class="boxtitle" style="display:none"><roundcube:label name="kolab_activesync.syncsettings"></div>
|
||||
<form action="#" method="post" id="configform" class="boxcontent" style="display:none">
|
||||
<fieldset>
|
||||
<legend><roundcube:label name="kolab_activesync.deviceconfig" /></legend>
|
||||
<roundcube:object name="plugin.deviceconfigform" form="configform" />
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><roundcube:label name="kolab_activesync.folderstosync" /></legend>
|
||||
<roundcube:object name="plugin.foldersubscriptions" form="configform" id="foldersubscriptions" syncicon="synchronize.png" alarmicon="alarm-clock.png" />
|
||||
</fieldset>
|
||||
<p class="formbuttons">
|
||||
<roundcube:button type="input" class="button mainaction" command="plugin.save-config" label="save" />
|
||||
</p>
|
||||
</form>
|
||||
<div id="introtext">
|
||||
<div class="inner"><div class="bordered">
|
||||
<roundcube:label name="kolab_activesync.nodevices" html="true" />
|
||||
</div></div>
|
||||
<div class="pointer-left"></div>
|
||||
<div id="directorylist-title" class="boxtitle"><roundcube:label name="kolab_activesync.devices" /></div>
|
||||
<div class="boxlistcontent">
|
||||
<roundcube:object name="plugin.devicelist" id="devices-table" class="records-table" cellspacing="0" />
|
||||
</div>
|
||||
<div class="boxfooter">
|
||||
<roundcube:button type="link" command="plugin.delete-device" title="kolab_activesync.deletedevice" class="buttonPas delete" classAct="button delete" content=" " />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<script type="text/javascript">
|
||||
|
@ -54,5 +29,11 @@
|
|||
rcmail.add_onload('viewsplit.init()');
|
||||
</script>
|
||||
|
||||
<div id="prefs-box">
|
||||
<roundcube:frame name="activesyncframe" id="activesync-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -0,0 +1,30 @@
|
|||
<roundcube:object name="doctype" value="html5" />
|
||||
<html>
|
||||
<head>
|
||||
<title><roundcube:object name="pagetitle" /></title>
|
||||
<roundcube:include file="/includes/links.html" />
|
||||
</head>
|
||||
<body class="iframe">
|
||||
|
||||
<div id="prefs-title" class="boxtitle"><roundcube:label name="kolab_activesync.syncsettings"></div>
|
||||
|
||||
<div id="prefs-details" class="boxcontent">
|
||||
<form action="#" method="post" id="configform">
|
||||
<fieldset>
|
||||
<legend><roundcube:label name="kolab_activesync.deviceconfig" /></legend>
|
||||
<roundcube:object name="plugin.deviceconfigform" form="configform" class="propform" />
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><roundcube:label name="kolab_activesync.folderstosync" /></legend>
|
||||
<roundcube:object name="plugin.foldersubscriptions" form="configform" id="foldersubscriptions" syncicon="synchronize.png" alarmicon="alarm-clock.png" />
|
||||
</fieldset>
|
||||
</form>
|
||||
<div id="formfooter">
|
||||
<div class="footerleft">
|
||||
<roundcube:button type="input" class="button mainaction" command="plugin.save-config" label="save" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,19 @@
|
|||
<roundcube:object name="doctype" value="html5" />
|
||||
<html>
|
||||
<head>
|
||||
<title><roundcube:object name="pagetitle" /></title>
|
||||
<roundcube:include file="/includes/links.html" />
|
||||
</head>
|
||||
<body class="iframe">
|
||||
|
||||
<div id="preferences-details" class="boxcontent">
|
||||
<div id="introtext">
|
||||
<div class="inner">
|
||||
<roundcube:label name="kolab_activesync.nodevices" html="true" />
|
||||
</div>
|
||||
<div class="pointer-left"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -15,44 +15,26 @@
|
|||
<div id="settings-right">
|
||||
|
||||
<div id="sectionslist" class="uibox listbox">
|
||||
<h2 id="directorylist-title" class="boxtitle"><roundcube:label name="kolab_activesync.devices" /></h2>
|
||||
<div class="boxlistcontent">
|
||||
<roundcube:object name="plugin.devicelist" id="devices-table" class="listing" cellspacing="0" />
|
||||
</div>
|
||||
<div class="boxfooter">
|
||||
<roundcube:button type="link" command="plugin.delete-device" title="kolab_activesync.deletedevice" class="listbutton delete disabled" classAct="listbutton delete" innerClass="inner" content="x" />
|
||||
</div>
|
||||
<h2 id="directorylist-title" class="boxtitle"><roundcube:label name="kolab_activesync.devices" /></h2>
|
||||
<div class="boxlistcontent">
|
||||
<roundcube:object name="plugin.devicelist" id="devices-table" class="listing" cellspacing="0" />
|
||||
</div>
|
||||
<div class="boxfooter">
|
||||
<roundcube:button type="link" command="plugin.delete-device" title="kolab_activesync.deletedevice" class="listbutton delete disabled" classAct="listbutton delete" innerClass="inner" content="x" />
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div id="prefs-box" class="uibox contentbox">
|
||||
<h1 class="boxtitle" style="display:none"><roundcube:label name="kolab_activesync.syncsettings"></h1>
|
||||
<form action="#" method="post" id="configform" class="boxcontent tabbed" style="display:none">
|
||||
<fieldset>
|
||||
<legend><roundcube:label name="kolab_activesync.deviceconfig" /></legend>
|
||||
<roundcube:object name="plugin.deviceconfigform" form="configform" class="propform" />
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><roundcube:label name="kolab_activesync.folderstosync" /></legend>
|
||||
<roundcube:object name="plugin.foldersubscriptions" form="configform" id="foldersubscriptions" syncicon="synchronize.png" alarmicon="alarm-clock.png" />
|
||||
</fieldset>
|
||||
|
||||
<p class="formbuttons">
|
||||
<roundcube:button type="input" class="button mainaction" command="plugin.save-config" label="save" />
|
||||
</p>
|
||||
</form>
|
||||
|
||||
<div id="introtext">
|
||||
<div class="inner">
|
||||
<roundcube:label name="kolab_activesync.nodevices" html="true" />
|
||||
</div>
|
||||
<div class="pointer-left"></div>
|
||||
<div class="iframebox">
|
||||
<roundcube:frame name="activesyncframe" id="activesync-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
|
||||
</div>
|
||||
|
||||
<roundcube:object name="message" id="message" class="statusbar" />
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<roundcube:include file="/includes/footer.html" />
|
||||
|
||||
<script type="text/javascript">
|
||||
|
|
|
@ -0,0 +1,31 @@
|
|||
<roundcube:object name="doctype" value="html5" />
|
||||
<html>
|
||||
<head>
|
||||
<title><roundcube:object name="pagetitle" /></title>
|
||||
<roundcube:include file="/includes/links.html" />
|
||||
</head>
|
||||
<body class="iframe floatingbuttons">
|
||||
|
||||
<h1 class="boxtitle"><roundcube:label name="kolab_activesync.syncsettings"></h1>
|
||||
|
||||
<div id="preferences-details" class="boxcontent">
|
||||
<form action="#" method="post" id="configform" class="tabbed">
|
||||
<fieldset>
|
||||
<legend><roundcube:label name="kolab_activesync.deviceconfig" /></legend>
|
||||
<roundcube:object name="plugin.deviceconfigform" form="configform" class="propform" />
|
||||
</fieldset>
|
||||
<fieldset>
|
||||
<legend><roundcube:label name="kolab_activesync.folderstosync" /></legend>
|
||||
<roundcube:object name="plugin.foldersubscriptions" form="configform" id="foldersubscriptions" syncicon="synchronize.png" alarmicon="alarm-clock.png" />
|
||||
</fieldset>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div class="footerleft formbuttons floating">
|
||||
<roundcube:button type="input" class="button mainaction" command="plugin.save-config" label="save" />
|
||||
</div>
|
||||
|
||||
<roundcube:include file="/includes/footer.html" />
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -0,0 +1,21 @@
|
|||
<roundcube:object name="doctype" value="html5" />
|
||||
<html>
|
||||
<head>
|
||||
<title><roundcube:object name="pagetitle" /></title>
|
||||
<roundcube:include file="/includes/links.html" />
|
||||
</head>
|
||||
<body class="iframe">
|
||||
|
||||
<div id="preferences-details" class="boxcontent">
|
||||
<div id="introtext">
|
||||
<div class="inner">
|
||||
<roundcube:label name="kolab_activesync.nodevices" html="true" />
|
||||
</div>
|
||||
<div class="pointer-left"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<roundcube:include file="/includes/footer.html" />
|
||||
|
||||
</body>
|
||||
</html>
|
Loading…
Add table
Reference in a new issue