Greatly improved interface (use iframe for device form). Fixed layout/javascript issues.

This commit is contained in:
Aleksander Machniak 2012-08-29 15:47:37 +02:00
parent defadb8cff
commit 892f7a2fb8
13 changed files with 362 additions and 255 deletions

View file

@ -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();
});

View file

@ -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;
}

View file

@ -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('&nbsp;&nbsp;&nbsp;&nbsp;', $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)));

View file

@ -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';
?>
?>

View file

@ -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>

View 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;
}

View file

@ -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>

View file

@ -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>

View file

@ -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>

View file

@ -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;
}

View file

@ -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">

View file

@ -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>

View file

@ -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>