Merge branch 'dev/elastic'

This commit is contained in:
Aleksander Machniak 2018-04-09 12:17:36 +02:00
commit 4cd62009c0
169 changed files with 9766 additions and 7551 deletions

View file

@ -3,6 +3,3 @@
*.old
*~
config.inc.php
skins/*
!skins/default
!skins/larry

View file

@ -97,6 +97,7 @@ class calendar extends rcube_plugin
protected function setup()
{
$this->require_plugin('libcalendaring');
$this->require_plugin('libkolab');
$this->lib = libcalendaring::get_instance();
$this->timezone = $this->lib->timezone;
@ -152,8 +153,7 @@ class calendar extends rcube_plugin
$this->register_action('print', array($this,'print_view'));
$this->register_action('mailimportitip', array($this, 'mail_import_itip'));
$this->register_action('mailimportattach', array($this, 'mail_import_attachment'));
$this->register_action('mailtoevent', array($this, 'mail_message2event'));
$this->register_action('inlineui', array($this, 'get_inline_ui'));
$this->register_action('dialog-ui', array($this, 'mail_message2event'));
$this->register_action('check-recent', array($this, 'check_recent'));
$this->register_action('itip-status', array($this, 'event_itip_status'));
$this->register_action('itip-remove', array($this, 'event_itip_remove'));
@ -188,7 +188,7 @@ class calendar extends rcube_plugin
}
// add 'Create event' item to message menu
if ($this->api->output->type == 'html') {
if ($this->api->output->type == 'html' && $_GET['_rel'] != 'event') {
$this->api->add_content(html::tag('li', null,
$this->api->output->button(array(
'command' => 'calendar-create-from-mail',
@ -319,7 +319,11 @@ class calendar extends rcube_plugin
$this->rc->output->set_env('timezone', $this->timezone->getName());
$this->rc->output->set_env('calendar_driver', $this->rc->config->get('calendar_driver'), false);
$this->rc->output->set_env('calendar_resources', (bool)$this->rc->config->get('calendar_resources_driver'));
$this->rc->output->set_env('identities-selector', $this->ui->identity_select(array('id' => 'edit-identities-list', 'aria-label' => $this->gettext('roleorganizer'))));
$this->rc->output->set_env('identities-selector', $this->ui->identity_select(array(
'id' => 'edit-identities-list',
'aria-label' => $this->gettext('roleorganizer'),
'class' => 'form-control',
)));
$view = rcube_utils::get_input_value('view', rcube_utils::INPUT_GPC);
if (in_array($view, array('agendaWeek', 'agendaDay', 'month', 'table')))
@ -446,11 +450,16 @@ class calendar extends rcube_plugin
return $p;
}
$field_id = 'rcmfd_workstart';
$field_id = 'rcmfd_workstart';
$work_start = $this->rc->config->get('calendar_work_start', $this->defaults['calendar_work_start']);
$work_end = $this->rc->config->get('calendar_work_end', $this->defaults['calendar_work_end']);
$p['blocks']['view']['options']['workinghours'] = array(
'title' => html::label($field_id, rcube::Q($this->gettext('workinghours'))),
'content' => $select_hours->show($this->rc->config->get('calendar_work_start', $this->defaults['calendar_work_start']), array('name' => '_work_start', 'id' => $field_id)) .
' — ' . $select_hours->show($this->rc->config->get('calendar_work_end', $this->defaults['calendar_work_end']), array('name' => '_work_end', 'id' => $field_id)),
'title' => html::label($field_id, rcube::Q($this->gettext('workinghours'))),
'content' => html::div('input-group',
$select_hours->show($work_start, array('name' => '_work_start', 'id' => $field_id))
. html::span('input-group-append input-group-prepend', html::span('input-group-text',' — '))
. $select_hours->show($work_end, array('name' => '_work_end', 'id' => $field_id))
)
);
}
@ -468,7 +477,7 @@ class calendar extends rcube_plugin
$select_colors->add($this->gettext('coloringmode3'), 3);
$p['blocks']['view']['options']['eventcolors'] = array(
'title' => html::label($field_id . 'value', rcube::Q($this->gettext('eventcoloring'))),
'title' => html::label($field_id, rcube::Q($this->gettext('eventcoloring'))),
'content' => $select_colors->show($this->rc->config->get('calendar_event_coloring', $this->defaults['calendar_event_coloring'])),
);
}
@ -511,7 +520,7 @@ class calendar extends rcube_plugin
$p['blocks']['view']['options']['alarmtype'] = array(
'title' => html::label($field_id, rcube::Q($this->gettext('defaultalarmtype'))),
'content' => $alarm_type . ' ' . $alarm_offset,
'content' => html::div('input-group', $alarm_type . ' ' . $alarm_offset),
);
}
@ -529,7 +538,7 @@ class calendar extends rcube_plugin
$default_calendar = $id;
}
$p['blocks']['view']['options']['defaultcalendar'] = array(
'title' => html::label($field_id . 'value', rcube::Q($this->gettext('defaultcalendar'))),
'title' => html::label($field_id, rcube::Q($this->gettext('defaultcalendar'))),
'content' => $select_cal->show($this->rc->config->get('calendar_default_calendar', $default_calendar)),
);
}
@ -570,7 +579,7 @@ class calendar extends rcube_plugin
$p['blocks']['itip']['options']['after_action'] = array(
'title' => html::label($field_id, rcube::Q($this->gettext('afteraction'))),
'content' => $select->show($val) . $folders->show($folder),
'content' => html::div('input-group', $select->show($val) . $folders->show($folder)),
);
}
@ -588,11 +597,17 @@ class calendar extends rcube_plugin
foreach ($categories as $name => $color) {
$key = md5($name);
$field_class = 'rcmfd_category_' . str_replace(' ', '_', $name);
$category_remove = new html_inputfield(array('type' => 'button', 'value' => 'X', 'class' => 'button', 'onclick' => '$(this).parent().remove()', 'title' => $this->gettext('remove_category')));
$category_remove = html::span('input-group-append', html::a(array(
'class' => 'button icon delete input-group-text',
'onclick' => '$(this).parent().parent().remove()',
'title' => $this->gettext('remove_category'),
'href' => '#rcmfd_new_category',
), html::span('inner', $this->gettext('delete'))
));
$category_name = new html_inputfield(array('name' => "_categories[$key]", 'class' => $field_class, 'size' => 30, 'disabled' => $this->driver->categoriesimmutable));
$category_color = new html_inputfield(array('name' => "_colors[$key]", 'class' => "$field_class colors", 'size' => 6));
$hidden = $this->driver->categoriesimmutable ? html::tag('input', array('type' => 'hidden', 'name' => "_categories[$key]", 'value' => $name)) : '';
$categories_list .= html::div(null, $hidden . $category_name->show($name) . ' ' . $category_color->show($color) . ' ' . $category_remove->show());
$categories_list .= $hidden . html::div('input-group', $category_name->show($name) . $category_color->show($color) . $category_remove);
}
$p['blocks']['categories']['options']['category_' . $name] = array(
@ -601,24 +616,37 @@ class calendar extends rcube_plugin
$field_id = 'rcmfd_new_category';
$new_category = new html_inputfield(array('name' => '_new_category', 'id' => $field_id, 'size' => 30));
$add_category = new html_inputfield(array('type' => 'button', 'class' => 'button', 'value' => $this->gettext('add_category'), 'onclick' => "rcube_calendar_add_category()"));
$add_category = html::span('input-group-append', html::a(array(
'type' => 'button',
'class' => 'button create input-group-text',
'title' => $this->gettext('add_category'),
'onclick' => 'rcube_calendar_add_category()',
'href' => '#rcmfd_new_category',
), html::span('inner', $this->gettext('add_category'))
));
$p['blocks']['categories']['options']['categories'] = array(
'content' => $new_category->show('') . ' ' . $add_category->show(),
'content' => html::div('input-group', $new_category->show('') . $add_category),
);
$this->rc->output->add_script('function rcube_calendar_add_category(){
$this->rc->output->add_label('delete', 'calendar.remove_category');
$this->rc->output->add_script('function rcube_calendar_add_category() {
var name = $("#rcmfd_new_category").val();
if (name.length) {
var input = $("<input>").attr("type", "text").attr("name", "_categories[]").attr("size", 30).val(name);
var color = $("<input>").attr("type", "text").attr("name", "_colors[]").attr("size", 6).addClass("colors").val("000000");
var button = $("<input>").attr("type", "button").attr("value", "X").addClass("button").click(function(){ $(this).parent().remove() });
$("<div>").append(input).append("&nbsp;").append(color).append("&nbsp;").append(button).appendTo("#calendarcategories");
color.miniColors({ colorValues:(rcmail.env.mscolors || []) });
var button_label = rcmail.gettext("calendar.remove_category");
var input = $("<input>").attr({type: "text", name: "_categories[]", size: 30, "class": "form-control"}).val(name);
var color = $("<input>").attr({type: "text", name: "_colors[]", size: 6, "class": "colors form-control"}).val("000000");
var button = $("<a>").attr({"class": "button icon delete input-group-text", title: button_label, href: "#rcmfd_new_category"})
.click(function() { $(this).parent().parent().remove(); })
.append($("<span>").addClass("inner").text(rcmail.gettext("delete")));
$("<div>").addClass("input-group").append(input).append(color).append($("<span class=\'input-group-append\'>").append(button))
.appendTo("#calendarcategories");
color.minicolors(rcmail.env.minicolors_config || {});
$("#rcmfd_new_category").val("");
}
}');
}', 'foot');
$this->rc->output->add_script('$("#rcmfd_new_category").keypress(function(event){
$this->rc->output->add_script('$("#rcmfd_new_category").keypress(function(event) {
if (event.which == 13) {
rcube_calendar_add_category();
event.preventDefault();
@ -656,12 +684,12 @@ class calendar extends rcube_plugin
$checkbox = new html_checkbox(array('name' => '_birthday_adressbooks[]') + $input_attrib);
foreach ($this->rc->get_address_sources(false, true) as $source) {
$active = in_array($source['id'], (array)$this->rc->config->get('calendar_birthday_adressbooks', array())) ? $source['id'] : '';
$sources[] = html::label(null, $checkbox->show($active, array('value' => $source['id'])) . '&nbsp;' . rcube::Q($source['realname'] ?: $source['name']));
$sources[] = html::tag('li', null, html::label(null, $checkbox->show($active, array('value' => $source['id'])) . rcube::Q($source['realname'] ?: $source['name'])));
}
$p['blocks']['birthdays']['options']['birthday_adressbooks'] = array(
'title' => rcube::Q($this->gettext('birthdayscalendarsources')),
'content' => join(html::br(), $sources),
'content' => html::tag('ul', 'proplist', implode("\n", $sources)),
);
$field_id = 'rcmfd_birthdays_alarm';
@ -676,10 +704,12 @@ class calendar extends rcube_plugin
foreach (array('-M','-H','-D') as $trigger)
$select_offset->add($this->rc->gettext('trigger' . $trigger, 'libcalendaring'), $trigger);
$preset = libcalendaring::parse_alarm_value($this->rc->config->get('calendar_birthdays_alarm_offset', '-1D'));
$preset = libcalendaring::parse_alarm_value($this->rc->config->get('calendar_birthdays_alarm_offset', '-1D'));
$preset_type = $this->rc->config->get('calendar_birthdays_alarm_type', '');
$p['blocks']['birthdays']['options']['birthdays_alarmoffset'] = array(
'title' => html::label($field_id . 'value', rcube::Q($this->gettext('showalarms'))),
'content' => $select_type->show($this->rc->config->get('calendar_birthdays_alarm_type', '')) . ' ' . $input_value->show($preset[0]) . '&nbsp;' . $select_offset->show($preset[1]),
'title' => html::label($field_id, rcube::Q($this->gettext('showalarms'))),
'content' => html::div('input-group', $select_type->show($preset_type) . $input_value->show($preset[0]) . ' ' . $select_offset->show($preset[1])),
);
}
@ -839,12 +869,12 @@ class calendar extends rcube_plugin
}
// report more results available
if ($this->driver->search_more_results)
$this->rc->output->show_message('autocompletemore', 'info');
$this->rc->output->show_message('autocompletemore', 'notice');
$this->rc->output->command('multi_thread_http_response', $results, rcube_utils::get_input_value('_reqid', rcube_utils::INPUT_GPC));
return;
}
if ($success)
$this->rc->output->show_message('successfullysaved', 'confirmation');
else {
@ -1190,10 +1220,10 @@ class calendar extends rcube_plugin
}
// unlock client
$this->rc->output->command('plugin.unlock_saving');
$this->rc->output->command('plugin.unlock_saving', $success);
// update event object on the client or trigger a complete refresh if too complicated
if ($reload) {
if ($reload && empty($_REQUEST['_framed'])) {
$args = array('source' => $event['calendar']);
if ($reload > 1)
$args['refetch'] = true;
@ -1926,7 +1956,8 @@ class calendar extends rcube_plugin
*/
public function attachment_upload()
{
$this->lib->attachment_upload(self::SESSION_KEY, 'cal-');
$handler = new kolab_attachments_handler();
$handler->attachment_upload(self::SESSION_KEY, 'cal-');
}
/**
@ -1934,9 +1965,11 @@ class calendar extends rcube_plugin
*/
public function attachment_get()
{
$handler = new kolab_attachments_handler();
// show loading page
if (!empty($_GET['_preload'])) {
return $this->lib->attachment_loading_page();
return $handler->attachment_loading_page();
}
$event_id = rcube_utils::get_input_value('_event', rcube_utils::INPUT_GPC);
@ -1961,10 +1994,7 @@ class calendar extends rcube_plugin
// show part page
if (!empty($_GET['_frame'])) {
$this->lib->attachment = $attachment;
$this->register_handler('plugin.attachmentframe', array($this->lib, 'attachment_frame'));
$this->register_handler('plugin.attachmentcontrols', array($this->lib, 'attachment_header'));
$this->rc->output->send('calendar.attachment');
$handler->attachment_page($attachment);
}
// deliver attachment content
else if ($attachment) {
@ -1972,7 +2002,7 @@ class calendar extends rcube_plugin
$attachment['body'] = $this->driver->get_attachment_body($id, $event);
}
$this->lib->attachment_get($attachment);
$handler->attachment_get($attachment);
}
// if we arrive here, the requested part was not found
@ -2390,30 +2420,6 @@ class calendar extends rcube_plugin
$this->rc->output->send("calendar.print");
}
/**
*
*/
public function get_inline_ui()
{
foreach (array('save','cancel','savingdata') as $label)
$texts['calendar.'.$label] = $this->gettext($label);
$texts['calendar.new_event'] = $this->gettext('createfrommail');
$this->ui->init_templates();
$this->ui->calendar_list(); # set env['calendars']
echo $this->api->output->parse('calendar.eventedit', false, false);
echo html::tag('script', array('type' => 'text/javascript'),
"rcmail.set_env('calendars', " . rcube_output::json_serialize($this->api->output->env['calendars']) . ");\n".
"rcmail.set_env('deleteicon', '" . $this->api->output->env['deleteicon'] . "');\n".
"rcmail.set_env('cancelicon', '" . $this->api->output->env['cancelicon'] . "');\n".
"rcmail.set_env('loadingicon', '" . $this->api->output->env['loadingicon'] . "');\n".
"rcmail.gui_object('attachmentlist', '" . $this->ui->attachmentlist_id . "');\n".
"rcmail.add_label(" . rcube_output::json_serialize($texts) . ");\n"
);
exit;
}
/**
* Compare two event objects and return differing properties
*
@ -2615,7 +2621,7 @@ class calendar extends rcube_plugin
&& ($response['action'] == 'rsvp' || $response['action'] == 'import')
) {
$calendars = $this->driver->list_calendars($mode);
$calendar_select = new html_select(array('name' => 'calendar', 'id' => 'itip-saveto', 'is_escaped' => true));
$calendar_select = new html_select(array('name' => 'calendar', 'id' => 'itip-saveto', 'is_escaped' => true, 'class' => 'form-control'));
$calendar_select->add('--', '');
$numcals = 0;
foreach ($calendars as $calendar) {
@ -2640,8 +2646,8 @@ class calendar extends rcube_plugin
// render small agenda view for the respective day
if ($data['method'] == 'REQUEST' && !empty($data['date']) && $response['action'] == 'rsvp') {
$event_start = rcube_utils::anytodatetime($data['date']);
$day_start = new Datetime(gmdate('Y-m-d 00:00', $data['date']), $this->lib->timezone);
$day_end = new Datetime(gmdate('Y-m-d 23:59', $data['date']), $this->lib->timezone);
$day_start = new Datetime(gmdate('Y-m-d 00:00', $data['date']), $this->lib->timezone);
$day_end = new Datetime(gmdate('Y-m-d 23:59', $data['date']), $this->lib->timezone);
// get events on that day from the user's personal calendars
$calendars = $this->driver->list_calendars(calendar_driver::FILTER_PERSONAL);
@ -2650,6 +2656,7 @@ class calendar extends rcube_plugin
$before = $after = array();
foreach ($events as $event) {
// TODO: skip events with free_busy == 'free' ?
if ($event['uid'] == $data['uid'] || $event['end'] < $day_start || $event['start'] > $day_end)
continue;
@ -2841,7 +2848,6 @@ class calendar extends rcube_plugin
}
else if (in_array($header->ctype, array('multipart/alternative', 'multipart/mixed'))) {
// TODO: fetch bodystructure and search for ical parts. Maybe too expensive?
if (!empty($header->structure) && is_array($header->structure->parts)) {
foreach ($header->structure->parts as $part) {
if (libcalendaring::part_is_vcalendar($part) && !empty($part->ctype_parameters['method'])) {
@ -2889,7 +2895,7 @@ class calendar extends rcube_plugin
) . '%before%' . $this->mail_agenda_event_row($event, 'current') . '%after%');
}
$html .= html::div('calendar-invitebox',
$html .= html::div('calendar-invitebox invitebox boxinformation',
$this->itip->mail_itip_inline_ui(
$event,
$ical_objects->method,
@ -3368,17 +3374,21 @@ class calendar extends rcube_plugin
*/
public function mail_message2event()
{
$uid = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_POST);
$mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_POST);
$this->ui->init();
$this->ui->addJS();
$this->ui->init_templates();
$this->ui->calendar_list(array(), true); // set env['calendars']
$uid = rcube_utils::get_input_value('_uid', rcube_utils::INPUT_GET);
$mbox = rcube_utils::get_input_value('_mbox', rcube_utils::INPUT_GET);
$event = array();
// establish imap connection
$imap = $this->rc->get_storage();
$imap->set_folder($mbox);
$message = new rcube_message($uid);
$imap = $this->rc->get_storage();
$message = new rcube_message($uid, $mbox);
if ($message->headers) {
$event['title'] = trim($message->subject);
$event['title'] = trim($message->subject);
$event['description'] = trim($message->first_text_part());
$this->load_driver();
@ -3420,14 +3430,14 @@ class calendar extends rcube_plugin
}
}
}
$this->rc->output->command('plugin.mail2event_dialog', $event);
$this->rc->output->set_env('event_prop', $event);
}
else {
$this->rc->output->command('display_message', $this->gettext('messageopenerror'), 'error');
}
$this->rc->output->send();
$this->rc->output->send('calendar.dialog');
}
/**

View file

@ -33,53 +33,40 @@ function rcube_calendar(settings)
// extend base class
rcube_libcalendaring.call(this, settings);
// member vars
this.ui_loaded = false;
this.selected_attachment = null;
// private vars
var me = this;
// create new event from current mail message
this.create_from_mail = function(uid)
{
if (uid || (uid = rcmail.get_single_uid())) {
// load calendar UI (scripts and edit dialog template)
if (!this.ui_loaded) {
$.when(
$.getScript(rcmail.assets_path('plugins/calendar/calendar_ui.js')),
$.getScript(rcmail.assets_path('plugins/calendar/lib/js/fullcalendar.js')),
$.get(rcmail.url('calendar/inlineui'), function(html) { $(document.body).append(html); }, 'html')
).then(function() {
// disable attendees feature (autocompletion and stuff is not initialized)
for (var c in rcmail.env.calendars)
rcmail.env.calendars[c].attendees = rcmail.env.calendars[c].resources = false;
if (!uid && !(uid = rcmail.get_single_uid())) {
return;
}
me.ui_loaded = true;
me.ui = new rcube_calendar_ui(me.settings);
me.create_from_mail(uid); // start over
var url = {_mbox: rcmail.env.mailbox, _uid: uid, _framed: 1},
buttons = {},
button_classes = ['mainaction save', 'cancel'],
title = rcmail.gettext('calendar.createfrommail'),
dialog = $('<iframe>').attr({
id: 'kolabcalendarinlinegui',
name: 'kolabcalendardialog',
src: rcmail.url('calendar/dialog-ui', url)
});
return;
}
// dialog buttons
buttons[rcmail.gettext('save')] = function() {
var frame = rcmail.get_frame_window('kolabcalendarinlinegui');
frame.rcmail.command('event-save');
};
// get message contents for event dialog
var lock = rcmail.set_busy(true, 'loading');
rcmail.http_post('calendar/mailtoevent', {
'_mbox': rcmail.env.mailbox,
'_uid': uid
}, lock);
}
};
buttons[rcmail.gettext('cancel')] = function() {
dialog.dialog('destroy');
};
// callback function triggered from server with contents for the new event
this.mail2event_dialog = function(event)
{
if (event.title) {
this.ui.add_event(event);
if (rcmail.message_list)
rcmail.message_list.blur();
}
// open jquery UI dialog
window.kolab_event_dialog_element = dialog = rcmail.show_popup_dialog(dialog, title, buttons, {
button_classes: button_classes,
minWidth: 500,
width: 600,
height: 600
});
};
// handler for attachment-save-calendar commands
@ -94,7 +81,7 @@ function rcube_calendar(settings)
// _calendar: $('#calendar-attachment-saveto').val(),
}, rcmail.set_busy(true, 'itip.savingdata'));
}
}
};
}
@ -107,12 +94,9 @@ window.rcmail && rcmail.addEventListener('init', function(evt) {
if (rcmail.env.task == 'mail') {
rcmail.register_command('calendar-create-from-mail', function() { cal.create_from_mail(); });
rcmail.register_command('attachment-save-calendar', function() { cal.save_to_calendar(); });
rcmail.addEventListener('plugin.mail2event_dialog', function(p) { cal.mail2event_dialog(p); });
rcmail.addEventListener('plugin.unlock_saving', function(p) { cal.ui && cal.ui.unlock_saving(); });
if (rcmail.env.action != 'show') {
rcmail.env.message_commands.push('calendar-create-from-mail');
rcmail.add_element($('<a>'));
}
else {
rcmail.enable_command('calendar-create-from-mail', true);

File diff suppressed because it is too large Load diff

View file

@ -12,7 +12,7 @@
"role": "Lead"
},
{
"name": "Alensader Machniak",
"name": "Aleksander Machniak",
"email": "machniak@kolabsys.com",
"role": "Developer"
}
@ -26,6 +26,7 @@
"require": {
"php": ">=5.3.0",
"roundcube/plugin-installer": ">=0.1.3",
"kolab/libcalendaring": ">=3.3.0"
"kolab/libcalendaring": ">=3.3.0",
"kolab/libkolab": ">=3.3.0"
}
}

View file

@ -2325,7 +2325,14 @@ class kolab_driver extends calendar_driver
if (in_array($calendar['id'], array(self::BIRTHDAY_CALENDAR_ID, self::INVITATIONS_CALENDAR_PENDING, self::INVITATIONS_CALENDAR_DECLINED))) {
if ($calendar['id'] != self::BIRTHDAY_CALENDAR_ID)
unset($formfields['showalarms']);
return parent::calendar_form($action, $calendar, $formfields);
// General tab
$form['props'] = array(
'name' => $this->rc->gettext('properties'),
'fields' => $formfields,
);
return kolab_utils::folder_form($form, '', 'calendar');
}
$this->_read_calendars();
@ -2358,7 +2365,8 @@ class kolab_driver extends calendar_driver
// General tab
$form['props'] = array(
'name' => $this->rc->gettext('properties'),
'name' => $this->rc->gettext('properties'),
'fields' => array(),
);
// Disable folder name input
@ -2369,12 +2377,7 @@ class kolab_driver extends calendar_driver
}
// calendar name (default field)
$form['props']['fieldsets']['location'] = array(
'name' => $this->rc->gettext('location'),
'content' => array(
'name' => $formfields['name']
),
);
$form['props']['fields']['location'] = $formfields['name'];
if (!empty($options) && ($options['norename'] || $options['protected'])) {
// prevent user from moving folder
@ -2382,7 +2385,7 @@ class kolab_driver extends calendar_driver
}
else {
$select = kolab_storage::folder_selector('event', array('name' => 'parent', 'id' => 'calendar-parent'), $folder);
$form['props']['fieldsets']['location']['content']['path'] = array(
$form['props']['fields']['path'] = array(
'id' => 'calendar-parent',
'label' => $this->cal->gettext('parentcalendar'),
'value' => $select->show(strlen($folder) ? $path_imap : ''),
@ -2390,138 +2393,10 @@ class kolab_driver extends calendar_driver
}
// calendar color (default field)
$form['props']['fieldsets']['settings'] = array(
'name' => $this->rc->gettext('settings'),
'content' => array(
'color' => $formfields['color'],
'showalarms' => $formfields['showalarms'],
),
);
if ($action != 'form-new') {
$form['sharing'] = array(
'name' => rcube::Q($this->cal->gettext('tabsharing')),
'content' => html::tag('iframe', array(
'src' => $this->cal->rc->url(array('_action' => 'calendar-acl', 'id' => $calendar['id'], 'framed' => 1)),
'width' => '100%',
'height' => 350,
'border' => 0,
'style' => 'border:0'),
''),
);
}
$form['props']['fields']['color'] = $formfields['color'];
$form['props']['fields']['alarms'] = $formfields['showalarms'];
$this->form_html = '';
if (is_array($hidden_fields)) {
foreach ($hidden_fields as $field) {
$hiddenfield = new html_hiddenfield($field);
$this->form_html .= $hiddenfield->show() . "\n";
}
}
// Create form output
foreach ($form as $tab) {
if (!empty($tab['fieldsets']) && is_array($tab['fieldsets'])) {
$content = '';
foreach ($tab['fieldsets'] as $fieldset) {
$subcontent = $this->get_form_part($fieldset);
if ($subcontent) {
$content .= html::tag('fieldset', null, html::tag('legend', null, rcube::Q($fieldset['name'])) . $subcontent) ."\n";
}
}
}
else {
$content = $this->get_form_part($tab);
}
if ($content) {
$this->form_html .= html::tag('fieldset', null, html::tag('legend', null, rcube::Q($tab['name'])) . $content) ."\n";
}
}
// Parse form template for skin-dependent stuff
$this->rc->output->add_handler('calendarform', array($this, 'calendar_form_html'));
return $this->rc->output->parse('calendar.kolabform', false, false);
}
/**
* Handler for template object
*/
public function calendar_form_html()
{
return $this->form_html;
}
/**
* Helper function used in calendar_form_content(). Creates a part of the form.
*/
private function get_form_part($form)
{
$content = '';
if (is_array($form['content']) && !empty($form['content'])) {
$table = new html_table(array('cols' => 2));
foreach ($form['content'] as $col => $colprop) {
$label = !empty($colprop['label']) ? $colprop['label'] : $this->cal->gettext($col);
$table->add('title', html::label($colprop['id'], rcube::Q($label)));
$table->add(null, $colprop['value']);
}
$content = $table->show();
}
else {
$content = $form['content'];
}
return $content;
}
/**
* Handler to render ACL form for a calendar folder
*/
public function calendar_acl()
{
$this->rc->output->add_handler('folderacl', array($this, 'calendar_acl_form'));
$this->rc->output->send('calendar.kolabacl');
}
/**
* Handler for ACL form template object
*/
public function calendar_acl_form()
{
$calid = rcube_utils::get_input_value('_id', rcube_utils::INPUT_GPC);
if ($calid && ($cal = $this->get_calendar($calid))) {
$folder = $cal->get_realname(); // UTF7
$color = $cal->get_color();
}
else {
$folder = '';
$color = '';
}
$storage = $this->rc->get_storage();
$delim = $storage->get_hierarchy_delimiter();
$form = array();
if (strlen($folder)) {
$path_imap = explode($delim, $folder);
array_pop($path_imap); // pop off name part
$path_imap = implode($path_imap, $delim);
$options = $storage->folder_info($folder);
// Allow plugins to modify the form content (e.g. with ACL form)
$plugin = $this->rc->plugins->exec_hook('calendar_form_kolab',
array('form' => $form, 'options' => $options, 'name' => $folder));
}
if (!$plugin['form']['sharing']['content'])
$plugin['form']['sharing']['content'] = html::div('hint', $this->cal->gettext('aclnorights'));
return $plugin['form']['sharing']['content'];
return kolab_utils::folder_form($form, $folder, 'calendar', $hidden_fields);
}
/**

View file

@ -36,7 +36,7 @@ class calendar_ui
$this->rc = $cal->rc;
$this->screen = $this->rc->task == 'calendar' ? ($this->rc->action ? $this->rc->action: 'calendar') : 'other';
}
/**
* Calendar UI initialization and requests handlers
*/
@ -44,7 +44,7 @@ class calendar_ui
{
if ($this->ready) // already done
return;
// add taskbar button
$this->cal->add_button(array(
'command' => 'calendar',
@ -56,8 +56,10 @@ class calendar_ui
), 'taskbar');
// load basic client script
$this->cal->include_script('calendar_base.js');
if ($this->rc->action != 'print') {
$this->cal->include_script('calendar_base.js');
}
$skin_path = $this->cal->local_skin_path();
$this->cal->include_stylesheet($skin_path . '/calendar.css');
@ -80,9 +82,6 @@ class calendar_ui
$this->cal->register_handler('plugin.sensitivity_select', array($this, 'sensitivity_select'));
$this->cal->register_handler('plugin.alarm_select', array($this, 'alarm_select'));
$this->cal->register_handler('plugin.recurrence_form', array($this->cal->lib, 'recurrence_form'));
$this->cal->register_handler('plugin.attachments_form', array($this, 'attachments_form'));
$this->cal->register_handler('plugin.attachments_list', array($this, 'attachments_list'));
$this->cal->register_handler('plugin.filedroparea', array($this, 'file_drop_area'));
$this->cal->register_handler('plugin.attendees_list', array($this, 'attendees_list'));
$this->cal->register_handler('plugin.attendees_form', array($this, 'attendees_form'));
$this->cal->register_handler('plugin.resources_form', array($this, 'resources_form'));
@ -95,11 +94,13 @@ class calendar_ui
$this->cal->register_handler('plugin.edit_recurrence_sync', array($this, 'edit_recurrence_sync'));
$this->cal->register_handler('plugin.edit_recurring_warning', array($this, 'recurring_event_warning'));
$this->cal->register_handler('plugin.event_rsvp_buttons', array($this, 'event_rsvp_buttons'));
$this->cal->register_handler('plugin.angenda_options', array($this, 'angenda_options'));
$this->cal->register_handler('plugin.agenda_options', array($this, 'agenda_options'));
$this->cal->register_handler('plugin.events_import_form', array($this, 'events_import_form'));
$this->cal->register_handler('plugin.events_export_form', array($this, 'events_export_form'));
$this->cal->register_handler('plugin.object_changelog_table', array('libkolab', 'object_changelog_table'));
$this->cal->register_handler('plugin.searchform', array($this->rc->output, 'search_form')); // use generic method from rcube_template
kolab_attachments_handler::ui();
}
/**
@ -119,12 +120,7 @@ class calendar_ui
$this->cal->include_script('calendar_ui.js');
$this->cal->include_script('lib/js/fullcalendar.js');
$this->rc->output->include_script('treelist.js');
// include kolab folderlist widget if available
if (in_array('libkolab', $this->cal->api->loaded_plugins())) {
$this->cal->api->include_script('libkolab/js/folderlist.js');
$this->cal->api->include_script('libkolab/js/audittrail.js');
}
$this->cal->api->include_script('libkolab/libkolab.js');
jqueryui::miniColors();
}
@ -166,7 +162,7 @@ class calendar_ui
foreach ((array)$calendars as $id => $prop) {
if (!$prop['color'])
continue;
$css .= $this->calendar_css_classes($id, $prop, $mode);
$css .= $this->calendar_css_classes($id, $prop, $mode, $attrib);
}
return html::tag('style', array('type' => 'text/css'), $css);
@ -175,11 +171,18 @@ class calendar_ui
/**
*
*/
public function calendar_css_classes($id, $prop, $mode)
public function calendar_css_classes($id, $prop, $mode, $attrib)
{
$color = $prop['color'];
$color = $folder_color = $prop['color'];
// replace white with skin-defined color
if (!empty($attrib['folder-fallback-color']) && preg_match('/^f+$/i', $folder_color)) {
$folder_color = $attrib['folder-fallback-color'];
}
$class = 'cal-' . asciiwords($id, true);
$css .= "li .$class, #eventshow .$class { color: #$color; }\n";
$css = str_replace('$class', $class, $attrib['folder-class']) ?: "li .$class";
$css .= ", #eventshow .$class { color: #$folder_color; }\n";
if ($mode != 1) {
if ($mode == 3) {
@ -204,11 +207,11 @@ class calendar_ui
/**
*
*/
function calendar_list($attrib = array())
function calendar_list($attrib = array(), $js_only = false)
{
$html = '';
$jsenv = array();
$tree = true;
$html = '';
$jsenv = array();
$tree = true;
$calendars = $this->cal->driver->list_calendars(0, $tree);
// walk folder tree
@ -237,9 +240,14 @@ class calendar_ui
);
}
$this->rc->output->set_env('source', rcube_utils::get_input_value('source', rcube_utils::INPUT_GET));
$this->rc->output->set_env('calendars', $jsenv);
$this->rc->output->add_gui_object('calendarslist', $attrib['id']);
if ($js_only) {
return;
}
$this->rc->output->set_env('source', rcube_utils::get_input_value('source', rcube_utils::INPUT_GET));
$this->rc->output->add_gui_object('calendarslist', $attrib['id'] ?: 'unknown');
return html::tag('ul', $attrib, $html, html::$common_attrib);
}
@ -311,8 +319,8 @@ class calendar_ui
if (!$activeonly || $prop['active']) {
$label_id = 'cl:' . $id;
$content = html::div(join(' ', $classes),
html::span(array('class' => 'calname', 'id' => $label_id, 'title' => $title), $prop['editname'] ? rcube::Q($prop['editname']) : $prop['listname']) .
($prop['virtual'] ? '' :
html::a(array('class' => 'calname', 'id' => $label_id, 'title' => $title, 'href' => '#'), rcube::Q($prop['editname'] ?: $prop['listname']))
. ($prop['virtual'] ? '' :
html::tag('input', array('type' => 'checkbox', 'name' => '_cal[]', 'value' => $id, 'checked' => $prop['active'], 'aria-labelledby' => $label_id), '') .
html::span('actions',
($prop['removable'] ? html::a(array('href' => '#', 'class' => 'remove', 'title' => $this->cal->gettext('removelist')), ' ') : '') .
@ -328,30 +336,35 @@ class calendar_ui
}
/**
*
* Render a HTML for agenda options form
*/
function angenda_options($attrib = array())
function agenda_options($attrib = array())
{
$attrib += array('id' => 'agendaoptions');
$attrib['style'] .= 'display:none';
$select_range = new html_select(array('name' => 'listrange', 'id' => 'agenda-listrange'));
$select_range = new html_select(array('name' => 'listrange', 'id' => 'agenda-listrange', 'class' => 'form-control'));
$select_range->add(1 . ' ' . preg_replace('/\(.+\)/', '', $this->cal->lib->gettext('days')), $days);
foreach (array(2,5,7,14,30,60,90,180,365) as $days)
$select_range->add($days . ' ' . preg_replace('/\(|\)/', '', $this->cal->lib->gettext('days')), $days);
$html .= html::label('agenda-listrange', $this->cal->gettext('listrange'));
$html .= $select_range->show($this->rc->config->get('calendar_agenda_range', $this->cal->defaults['calendar_agenda_range']));
$select_sections = new html_select(array('name' => 'listsections', 'id' => 'agenda-listsections'));
$html = html::span('input-group',
html::label(array('for' => 'agenda-listrange', 'class' => 'input-group-prepend'),
html::span('input-group-text', $this->cal->gettext('listrange')))
. $select_range->show($this->rc->config->get('calendar_agenda_range', $this->cal->defaults['calendar_agenda_range']))
);
$select_sections = new html_select(array('name' => 'listsections', 'id' => 'agenda-listsections', 'class' => 'form-control'));
$select_sections->add('---', '');
foreach (array('day' => 'libcalendaring.days', 'week' => 'libcalendaring.weeks', 'month' => 'libcalendaring.months', 'smart' => 'calendar.smartsections') as $val => $label)
$select_sections->add(preg_replace('/\(|\)/', '', ucfirst($this->rc->gettext($label))), $val);
$html .= html::span('spacer', '&nbsp;');
$html .= html::label('agenda-listsections', $this->cal->gettext('listsections'));
$html .= $select_sections->show($this->rc->config->get('calendar_agenda_sections', $this->cal->defaults['calendar_agenda_sections']));
$html .= html::span('input-group',
html::label(array('for' => 'agenda-listsections', 'class' => 'input-group-prepend'),
html::span('input-group-text', $this->cal->gettext('listsections')))
. $select_sections->show($this->rc->config->get('calendar_agenda_sections', $this->cal->defaults['calendar_agenda_sections']))
);
return html::div($attrib, $html);
}
@ -478,7 +491,7 @@ class calendar_ui
*/
function edit_attendees_notify($attrib = array())
{
$checkbox = new html_checkbox(array('name' => '_notify', 'id' => 'edit-attendees-donotify', 'value' => 1));
$checkbox = new html_checkbox(array('name' => '_notify', 'id' => 'edit-attendees-donotify', 'value' => 1, 'class' => 'pretty-checkbox'));
return html::div($attrib, html::label(null, $checkbox->show(1) . ' ' . $this->cal->gettext('sendnotifications')));
}
@ -487,7 +500,7 @@ class calendar_ui
*/
function edit_recurrence_sync($attrib = array())
{
$checkbox = new html_checkbox(array('name' => '_start_sync', 'value' => 1));
$checkbox = new html_checkbox(array('name' => '_start_sync', 'value' => 1, 'class' => 'pretty-checkbox'));
return html::div($attrib, html::label(null, $checkbox->show(1) . ' ' . $this->cal->gettext('eventstartsync')));
}
@ -497,14 +510,14 @@ class calendar_ui
function recurring_event_warning($attrib = array())
{
$attrib['id'] = 'edit-recurring-warning';
$radio = new html_radiobutton(array('name' => '_savemode', 'class' => 'edit-recurring-savemode'));
$form = html::label(null, $radio->show('', array('value' => 'current')) . $this->cal->gettext('currentevent')) . ' ' .
html::label(null, $radio->show('', array('value' => 'future')) . $this->cal->gettext('futurevents')) . ' ' .
html::label(null, $radio->show('all', array('value' => 'all')) . $this->cal->gettext('allevents')) . ' ' .
html::label(null, $radio->show('', array('value' => 'new')) . $this->cal->gettext('saveasnew'));
return html::div($attrib, html::div('message', html::span('ui-icon ui-icon-alert', '') . $this->cal->gettext('changerecurringeventwarning')) . html::div('savemode', $form));
return html::div($attrib, html::div('message', $this->cal->gettext('changerecurringeventwarning')) . html::div('savemode', $form));
}
/**
@ -524,8 +537,11 @@ class calendar_ui
}
$input = new html_inputfield(array(
'type' => 'file', 'name' => '_data', 'size' => $attrib['uploadfieldsize'],
'accept' => $accept));
'type' => 'file',
'name' => '_data',
'size' => $attrib['uploadfieldsize'],
'accept' => $accept
));
$select = new html_select(array('name' => '_range', 'id' => 'event-import-range'));
$select->add(array(
@ -538,28 +554,32 @@ class calendar_ui
),
array('1','2','3','6','12',0));
$html .= html::div('form-section',
html::div(null, $input->show()) .
html::div('hint', $this->rc->gettext(array('name' => 'maxuploadsize', 'vars' => array('size' => $max_filesize))))
$html = html::div('form-section form-group row',
html::label(array('class' => 'col-sm-4 col-form-label', 'for' => 'importfile'), rcube::Q($this->rc->gettext('importfromfile')))
. html::div('col-sm-8', $input->show()
. html::div('hint', $this->rc->gettext(array('id' => 'importfile', 'name' => 'maxuploadsize', 'vars' => array('size' => $max_filesize)))))
);
$html .= html::div('form-section',
html::label('event-import-calendar', $this->cal->gettext('calendar')) .
$this->calendar_select(array('name' => 'calendar', 'id' => 'event-import-calendar'))
$html .= html::div('form-section form-group row',
html::label(array('for' => 'event-import-calendar', 'class' => 'col-form-label col-sm-4'), $this->cal->gettext('calendar'))
. html::div('col-sm-8', $this->calendar_select(array('name' => 'calendar', 'id' => 'event-import-calendar')))
);
$html .= html::div('form-section',
html::label('event-import-range', $this->cal->gettext('importrange')) .
$select->show(1)
$html .= html::div('form-section form-group row',
html::label(array('for' => 'event-import-range', 'class' => 'col-form-label col-sm-4'), $this->cal->gettext('importrange'))
. html::div('col-sm-8', $select->show(1))
);
$this->rc->output->add_gui_object('importform', $attrib['id']);
$this->rc->output->add_label('import');
return html::tag('form', array('action' => $this->rc->url(array('task' => 'calendar', 'action' => 'import_events')),
'method' => "post", 'enctype' => 'multipart/form-data', 'id' => $attrib['id']),
$html
);
return html::tag('p', null, $this->cal->gettext('importtext'))
. html::tag('form', array(
'action' => $this->rc->url(array('task' => 'calendar', 'action' => 'import_events')),
'method' => 'post',
'enctype' => 'multipart/form-data',
'id' => $attrib['id']
), $html);
}
/**
@ -570,12 +590,11 @@ class calendar_ui
if (!$attrib['id'])
$attrib['id'] = 'rcmExportForm';
$html .= html::div('form-section',
html::label('event-export-calendar', $this->cal->gettext('calendar')) .
$this->calendar_select(array('name' => 'calendar', 'id' => 'event-export-calendar'))
);
$html = html::div('form-section form-group row',
html::label(array('for' => 'event-export-calendar', 'class' => 'col-sm-4 col-form-label'), $this->cal->gettext('calendar'))
. html::div('col-sm-8', $this->calendar_select(array('name' => 'calendar', 'id' => 'event-export-calendar', 'class' => 'form-control'))));
$select = new html_select(array('name' => 'range', 'id' => 'event-export-range'));
$select = new html_select(array('name' => 'range', 'id' => 'event-export-range', 'class' => 'form-control'));
$select->add(array(
$this->cal->gettext('all'),
$this->cal->gettext('onemonthback'),
@ -589,106 +608,63 @@ class calendar_ui
$startdate = new html_inputfield(array('name' => 'start', 'size' => 11, 'id' => 'event-export-startdate'));
$html .= html::div('form-section',
html::label('event-export-range', $this->cal->gettext('exportrange')) .
$select->show(0) .
html::span(array('style'=>'display:none'), $startdate->show())
);
$html .= html::div('form-section form-group row',
html::label(array('for' => 'event-export-range', 'class' => 'col-sm-4 col-form-label'), $this->cal->gettext('exportrange'))
. html::div('col-sm-8', $select->show(0) . html::span(array('style'=>'display:none'), $startdate->show())));
$checkbox = new html_checkbox(array('name' => 'attachments', 'id' => 'event-export-attachments', 'value' => 1));
$html .= html::div('form-section',
html::label('event-export-attachments', $this->cal->gettext('exportattachments')) .
$checkbox->show(1)
);
$checkbox = new html_checkbox(array('name' => 'attachments', 'id' => 'event-export-attachments', 'value' => 1, 'class' => 'form-check-input pretty-checkbox'));
$html .= html::div('form-section form-check row',
html::label(array('for' => 'event-export-attachments', 'class' => 'col-sm-4 col-form-label'), $this->cal->gettext('exportattachments'))
. html::div('col-sm-8', $checkbox->show(1)));
$this->rc->output->add_gui_object('exportform', $attrib['id']);
return html::tag('form', array('action' => $this->rc->url(array('task' => 'calendar', 'action' => 'export_events')),
'method' => "post", 'id' => $attrib['id']),
return html::tag('form', $attrib + array(
'action' => $this->rc->url(array('task' => 'calendar', 'action' => 'export_events')),
'method' => "post",
'id' => $attrib['id']
),
$html
);
}
/**
* Generate the form for event attachments upload
*/
function attachments_form($attrib = array())
{
// add ID if not given
if (!$attrib['id'])
$attrib['id'] = 'rcmUploadForm';
// Get max filesize, enable upload progress bar
$max_filesize = $this->rc->upload_init();
$button = new html_inputfield(array('type' => 'button'));
$input = new html_inputfield(array(
'type' => 'file', 'name' => '_attachments[]',
'multiple' => 'multiple', 'size' => $attrib['attachmentfieldsize']));
return html::div($attrib,
html::div(null, $input->show()) .
html::div('buttons', $button->show($this->rc->gettext('upload'), array('class' => 'button mainaction',
'onclick' => rcmail_output::JS_OBJECT_NAME . ".upload_file(this.form)"))) .
html::div('hint', $this->rc->gettext(array('name' => 'maxuploadsize', 'vars' => array('size' => $max_filesize))))
);
}
/**
* Register UI object for HTML5 drag & drop file upload
*/
function file_drop_area($attrib = array())
{
if ($attrib['id']) {
$this->rc->output->add_gui_object('filedrop', $attrib['id']);
$this->rc->output->set_env('filedrop', array('action' => 'upload', 'fieldname' => '_attachments'));
}
}
/**
* Generate HTML element for attachments list
*/
function attachments_list($attrib = array())
{
if (!$attrib['id'])
$attrib['id'] = 'rcmAttachmentList';
$skin_path = $this->cal->local_skin_path();
if ($attrib['deleteicon']) {
$_SESSION[calendar::SESSION_KEY . '_deleteicon'] = $skin_path . $attrib['deleteicon'];
$this->rc->output->set_env('deleteicon', $skin_path . $attrib['deleteicon']);
}
if ($attrib['cancelicon'])
$this->rc->output->set_env('cancelicon', $skin_path . $attrib['cancelicon']);
if ($attrib['loadingicon'])
$this->rc->output->set_env('loadingicon', $skin_path . $attrib['loadingicon']);
$this->rc->output->add_gui_object('attachmentlist', $attrib['id']);
$this->attachmentlist_id = $attrib['id'];
return html::tag('ul', $attrib, '', html::$common_attrib);
}
/**
* Handler for calendar form template.
* The form content could be overriden by the driver
*/
function calendar_editform($action, $calendar = array())
{
$this->action = $action;
$this->calendar = $calendar;
// load miniColors js/css files
jqueryui::miniColors();
$this->rc->output->set_env('pagetitle', $this->cal->gettext('calendarprops'));
$this->rc->output->add_handler('folderform', array($this, 'calendarform'));
$this->rc->output->send('libkolab.folderform');
}
/**
* Handler for calendar form template.
* The form content could be overriden by the driver
*/
function calendarform($attrib)
{
// compose default calendar form fields
$input_name = new html_inputfield(array('name' => 'name', 'id' => 'calendar-name', 'size' => 20));
$input_color = new html_inputfield(array('name' => 'color', 'id' => 'calendar-color', 'size' => 6));
$input_name = new html_inputfield(array('name' => 'name', 'id' => 'calendar-name', 'size' => 20));
$input_color = new html_inputfield(array('name' => 'color', 'id' => 'calendar-color', 'size' => 7, 'class' => 'colors'));
$formfields = array(
'name' => array(
'label' => $this->cal->gettext('name'),
'value' => $input_name->show($calendar['name']),
'id' => 'calendar-name',
'id' => 'calendar-name',
),
'color' => array(
'label' => $this->cal->gettext('color'),
'value' => $input_color->show($calendar['color']),
'id' => 'calendar-color',
'id' => 'calendar-color',
),
);
@ -696,14 +672,14 @@ class calendar_ui
$checkbox = new html_checkbox(array('name' => 'showalarms', 'id' => 'calendar-showalarms', 'value' => 1));
$formfields['showalarms'] = array(
'label' => $this->cal->gettext('showalarms'),
'value' => $checkbox->show($calendar['showalarms']?1:0),
'id' => 'calendar-showalarms',
'value' => $checkbox->show($this->calendar['showalarms'] ? 1 :0),
'id' => 'calendar-showalarms',
);
}
// allow driver to extend or replace the form content
return html::tag('form', array('action' => "#", 'method' => "get", 'id' => 'calendarpropform'),
$this->cal->driver->calendar_form($action, $calendar, $formfields)
return html::tag('form', $attrib + array('action' => "#", 'method' => "get", 'id' => 'calendarpropform'),
$this->cal->driver->calendar_form($this->action, $this->calendar, $formfields)
);
}
@ -724,7 +700,7 @@ class calendar_ui
$table->add_header('confirmstate', $this->cal->gettext('confirmstate'));
if ($invitations) {
$table->add_header(array('class' => 'invite', 'title' => $this->cal->gettext('sendinvitations')),
$invite->show(1) . html::label('edit-attendees-invite', $this->cal->gettext('sendinvitations')));
$invite->show(1) . html::label('edit-attendees-invite', html::span('inner', $this->cal->gettext('sendinvitations'))));
}
$table->add_header('options', '');
@ -743,15 +719,15 @@ class calendar_ui
*/
function attendees_form($attrib = array())
{
$input = new html_inputfield(array('name' => 'participant', 'id' => 'edit-attendee-name', 'size' => 30));
$textarea = new html_textarea(array('name' => 'comment', 'id' => 'edit-attendees-comment',
$input = new html_inputfield(array('name' => 'participant', 'id' => 'edit-attendee-name', 'class' => 'form-control'));
$textarea = new html_textarea(array('name' => 'comment', 'id' => 'edit-attendees-comment', 'class' => 'form-control',
'rows' => 4, 'cols' => 55, 'title' => $this->cal->gettext('itipcommenttitle')));
return html::div($attrib,
html::div(null, $input->show() . " " .
html::div('form-searchbar', $input->show() . " " .
html::tag('input', array('type' => 'button', 'class' => 'button', 'id' => 'edit-attendee-add', 'value' => $this->cal->gettext('addattendee'))) . " " .
html::tag('input', array('type' => 'button', 'class' => 'button', 'id' => 'edit-attendee-schedule', 'value' => $this->cal->gettext('scheduletime').'...'))) .
html::p('attendees-commentbox', html::label(null, $this->cal->gettext('itipcomment') . $textarea->show()))
html::p('attendees-commentbox', html::label('edit-attendees-comment', $this->cal->gettext('itipcomment')) . $textarea->show())
);
}
@ -760,10 +736,10 @@ class calendar_ui
*/
function resources_form($attrib = array())
{
$input = new html_inputfield(array('name' => 'resource', 'id' => 'edit-resource-name', 'size' => 30));
$input = new html_inputfield(array('name' => 'resource', 'id' => 'edit-resource-name', 'class' => 'form-control'));
return html::div($attrib,
html::div(null, $input->show() . " " .
html::div('form-searchbar', $input->show() . " " .
html::tag('input', array('type' => 'button', 'class' => 'button', 'id' => 'edit-resource-add', 'value' => $this->cal->gettext('addresource'))) . " " .
html::tag('input', array('type' => 'button', 'class' => 'button', 'id' => 'edit-resource-find', 'value' => $this->cal->gettext('findresources').'...')))
);

View file

@ -38,6 +38,7 @@ $labels['calendar'] = 'Calendar';
$labels['calendars'] = 'Calendars';
$labels['category'] = 'Category';
$labels['categories'] = 'Categories';
$labels['addcalendar'] = 'Add calendar';
$labels['createcalendar'] = 'Create new calendar';
$labels['editcalendar'] = 'Edit calendar properties';
$labels['name'] = 'Name';
@ -102,6 +103,8 @@ $labels['printdescriptions'] = 'Print descriptions';
$labels['parentcalendar'] = 'Insert inside';
$labels['searchearlierdates'] = '« Search for earlier events';
$labels['searchlaterdates'] = 'Search for later events »';
$labels['earlierevents'] = 'Earlier';
$labels['laterevents'] = 'Later';
$labels['andnmore'] = '$nr more...';
$labels['togglerole'] = 'Click to toggle role';
$labels['createfrommail'] = 'Save as event';
@ -116,6 +119,7 @@ $labels['showfburl'] = 'Show free-busy URL';
$labels['fburldescription'] = 'Use the following address to access Free-Busy information from other applications. You can copy and paste this into any calendar software that supports free-busy information in iCal format. No authentication is required for this URL.';
$labels['findcalendars'] = 'Find calendars...';
$labels['searchterms'] = 'Search terms';
$labels['findevents'] = 'Find events';
$labels['calsearchresults'] = 'Available Calendars';
$labels['calendarsubscribe'] = 'List permanently';
$labels['nocalendarsfound'] = 'No calendars found';
@ -210,6 +214,7 @@ $labels['savetocalendar'] = 'Save to calendar';
$labels['openpreview'] = 'Check Calendar';
$labels['noearlierevents'] = 'No earlier events';
$labels['nolaterevents'] = 'No later events';
$labels['legend'] = 'Legend';
// resources
$labels['resource'] = 'Resource';
@ -259,6 +264,7 @@ $labels['importsuccess'] = 'Successfully imported $nr events';
$labels['importnone'] = 'No events found to be imported';
$labels['importerror'] = 'An error occured while importing';
$labels['aclnorights'] = 'You do not have administrator rights on this calendar.';
$labels['importtext'] = 'You can upload events in <a href="https://wikipedia.org/wiki/ICalendar">iCalendar</a> format (.ics).';
$labels['changeeventconfirm'] = 'Change event';
$labels['removeeventconfirm'] = 'Delete event';
@ -289,7 +295,6 @@ $labels['revisionrestoreconfirm'] = 'Do you really want to restore revision $rev
$labels['objectrestoresuccess'] = 'Revision $rev successfully restored';
$labels['objectrestoreerror'] = 'Failed to restore the old revision';
// (hidden) titles and labels for accessibility annotations
$labels['arialabelminical'] = 'Calendar date selection';
$labels['arialabelcalendarview'] = 'Calendar view';
@ -297,9 +302,11 @@ $labels['arialabelsearchform'] = 'Event search form';
$labels['arialabelquicksearchbox'] = 'Event search input';
$labels['arialabelcalsearchform'] = 'Calendars search form';
$labels['calendaractions'] = 'Calendar actions';
$labels['calendarprops'] = 'Calendar properties';
$labels['arialabeleventattendees'] = 'Event participants list';
$labels['arialabeleventresources'] = 'Event resources list';
$labels['arialabelresourcesearchform'] = 'Resources search form';
$labels['arialabelresourceselection'] = 'Available resources';
$labels['arialabeleventform'] = 'Event editing form';
?>

View file

@ -6,7 +6,7 @@
* @licstart The following is the entire license notice for the
* JavaScript code in this file.
*
* Copyright (C) 2011, Kolab Systems AG <contact@kolabsys.com>
* Copyright (C) 2011-2018, Kolab Systems AG <contact@kolabsys.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
@ -34,11 +34,11 @@ window.rcmail && rcmail.addEventListener('init', function(evt) {
{
return String(str).replace(/</g, '&lt;').replace(/>/g, '&gt;').replace(/"/g, '&quot;');
};
var rc_loading;
var showdesc = true;
var settings = $.extend(rcmail.env.calendar_settings, rcmail.env.libcal_settings);
// create list of event sources AKA calendars
var src, event_sources = [];
var add_url = (rcmail.env.search ? '&q='+escape(rcmail.env.search) : '');
@ -52,9 +52,11 @@ window.rcmail && rcmail.addEventListener('init', function(evt) {
id: id
}, rcmail.env.calendars[id]);
source.color = '#' + source.color.replace(/^#/, '');
event_sources.push(source);
}
var viewdate = new Date();
if (rcmail.env.date)
viewdate.setTime(rcmail.env.date * 1000);
@ -166,11 +168,38 @@ window.rcmail && rcmail.addEventListener('init', function(evt) {
}, 20);
}
});
// activate settings form
$('#propdescription').change(function(){
showdesc = this.checked;
fc.fullCalendar('render');
});
var selector = $('#calendar').data('view-selector');
if (selector) {
selector = $('#' + selector);
$('.fc-header-right > span').each(function() {
var cl = 'btn btn-secondary', btn = $(this);
if (btn.is('.fc-state-active')) {
cl += ' active';
}
$('<button>').attr({'class': cl})
.text(btn.text())
.appendTo(selector)
.on('click', function() {
selector.children('.active').removeClass('active');
$(this).addClass('active');
btn.click();
});
});
};
// Update layout after initialization
// In devel mode we have to wait until all styles are applied by less
if (rcmail.env.devel_mode && window.less) {
less.pageLoadFinished.then(function() { $(window).resize(); });
}
});

View file

@ -1,5 +0,0 @@
Icons by Fugue Icons <http://p.yusukekamiyamane.com/>
Copyright (C) 2010 Yusuke Kamiyamane. All rights reserved.
The icons are licensed under a Creative Commons Attribution
3.0 license. <http://creativecommons.org/licenses/by/3.0/>

File diff suppressed because it is too large Load diff

View file

@ -1 +0,0 @@
../larry/fullcalendar.css

View file

@ -1,80 +0,0 @@
/* CSS hacks for IE 6/7 */
#main {
width: expression(Math.max(300, parseInt(document.documentElement.clientWidth)-10)+'px');
height: expression(Math.max(300, parseInt(document.documentElement.clientHeight)-100)+'px');
}
#calendarsidebar,
#calendarsidebartoggle {
height: expression((parseInt(this.parentNode.offsetHeight)-37)+'px');
}
#calendar {
width: expression((parseInt(this.parentNode.offsetWidth)-parseInt(document.getElementById('calendarsidebartoggle').offsetWidth)-parseInt(document.getElementById('calendarsidebartoggle').offsetLeft)-4)+'px');
height: expression(parseInt(this.parentNode.offsetHeight)+'px');
}
#calendars {
height: expression((parseInt(this.parentNode.offsetHeight)-220)+'px');
}
#agendaoptions {
width: expression((parseInt(this.parentNode.offsetWidth)-12)+'px');
}
#calendartoolbar a.buttonPas {
filter: alpha(opacity=35);
}
html #calendartoolbar a.button,
html #calendartoolbar a.buttonPas {
background-image: url(images/toolbar.gif);
}
#datepicker a.ui-priority-secondary {
filter: alpha(opacity=40);
}
#calendarslist li span.handle {
background-image: url(images/calendars.gif);
}
#datepicker .ui-widget-header {
width: 102%;
}
.fc-day-content {
cursor: default;
}
.fc-header-title h2 {
font-size: 16px;
}
.fc-event-temp .fc-event-bg {
display: none; /* nested opacity filters while dragging don't work */
}
#schedule-event-time {
filter: alpha(opacity=40);
}
#eventfreebusy .schedule-buttons,
#edit-attendees-form #edit-attendee-schedule {
right: 0.6em;
}
#schedule-freebusy-times td.all-busy,
#schedule-freebusy-times td.all-tentative,
#schedule-freebusy-times td.all-out-of-office {
background-image: url('images/freebusy-colors.gif');
}
#schedule-freebusy-times tr.times td.allday {
width: expression(Math.max(60, parseInt(this.offsetWidth))+'px');
}
.ui-dialog .ui-dialog-titlebar {
width: expression((parseInt(this.parentNode.offsetWidth)-26)+'px');
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 896 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 546 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 888 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 758 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 107 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 746 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 408 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 631 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 361 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 322 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 847 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 869 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 807 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 110 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 15 KiB

View file

@ -1,209 +0,0 @@
/*** Printing styles for Calendar plugin ***/
body {
margin: 0;
color: #000;
background: #fff;
}
body, td, th, div, p, h3, select, input, textarea {
font-family: "Lucida Grande", Verdana, Arial, Helvetica, sans-serif;
font-size: 8pt;
}
#calendar {
position: relative;
top: 0;
left: 0;
height: auto;
margin: 5em auto 0 auto;
overflow: visible;
}
#calendar .fc-header-right {
padding-right: 0;
}
#printconfig {
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 10000;
padding: 0.5em;
background: #ebebeb;
border-bottom: 1px solid #999;
box-shadow: 0 3px 4px #ccc;
-moz-box-shadow: 0 3px 4px #ccc;
-webkit-box-shadow: 0 3px 4px #ccc;
}
#printconfig .prop {
padding-right: 2em;
}
#message {
position: absolute;
top: 5.5em;
left: 1em;
}
#message div.loading {
color: #666;
font-style: italic;
}
#calendarlist {
list-style-type: square;
margin: 2em 0;
padding-left: 1em;
}
#calendarlist li {
float: left;
padding-left: 0;
padding-right: 3em;
margin-left: 0;
font-weight: bold;
}
#calendarlist input,
#calendarlist .handle {
display: none;
}
.calwidth {
width: 700px;
margin: 0 auto;
}
.rightalign {
float: right;
padding-top: 0.3em;
}
@media print {
.noprint,
.fc-header-right span {
display: none;
}
#calendar {
margin-top: 0;
}
}
/* fullcalendar style overrides */
.fc-view {
overflow: visible;
}
.fc-event-skin,
.fc-event-inner .fc-event-skin {
color: black;
background-color: #fff !important;
}
.fc-event-title {
font-weight: bold;
}
.fc-event-hori .fc-event-title {
font-weight: normal;
white-space: nowrap;
}
.fc-event-hori .fc-event-time {
white-space: nowrap;
font-weight: normal !important;
font-size: 10px;
padding-right: 0.6em;
}
.fc-grid .fc-event-time {
font-weight: normal !important;
padding-right: 0.3em;
}
.fc-event-cateories {
font-style: italic;
}
.fc-event-location {
font-size: 90%;
}
.fc-agenda-slots td div {
height: 1.4em;
}
.fc-widget-header,
.fc-mon, .fc-tue, .fc-wed, .fc-thu, .fc-fri {
background-color: #fff;
}
.fc-widget-header, .fc-widget-content {
border-color: #ccc;
}
.fc-icon-alarms,
.fc-icon-recurring {
display: inline-block;
width: 11px;
height: 11px;
background: url('images/eventicons.gif') 0 0 no-repeat;
margin-left: 3px;
line-height: 10px;
}
.fc-icon-alarms {
background-position: 0 -13px;
}
.fc-view-list, .fc-view-table {
border: 0;
}
.fc-view-list div.fc-list-header,
.fc-view-table td.fc-list-header {
padding: 0.3em;
background: #fff;
font-weight: bold;
font-size: 1.2em;
color: #333;
border-color: #333;
border-style: solid;
border-width: 1px 0;
filter: none;
}
.fc-list-section .fc-event {
cursor: auto;
}
.fc-view-table tr.fc-event td,
.fc-view-table tr.fc-event td.fc-event-handle {
border-color: #999;
padding-top: 0.5em;
padding-bottom: 0.5em;
}
.fc-view-table tr.fc-last td {
border: 0;
}
.fc-view-table tr.fc-event .fc-event-description {
padding-left: 2em;
padding-top: 0em;
}
.fc-event-vert .fc-event-description {
font-size: 90%;
font-style: italic;
}
.fc-view-table col.fc-event-location {
width: 20%;
}

View file

@ -1,25 +0,0 @@
/* CSS hacks for IE 6/7 */
#calendar {
top: 5em;
}
.calwidth {
width: 172mm;
}
.fc-header-title h2 {
font-size: 16px;
}
#calendarlist li {
float: none;
padding: 0;
margin-left: 1em;
}
@media print {
#calendar {
top: 0;
}
}

View file

@ -1,26 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><roundcube:object name="pagetitle" /></title>
<roundcube:include file="/includes/links.html" />
</head>
<body class="extwin">
<roundcube:include file="/includes/header.html" />
<div id="partheader">
<roundcube:object name="plugin.attachmentcontrols" cellpadding="2" cellspacing="0" downloadlink="true" />
<div style="position:absolute; top:2px; right:0; width:12em; text-align:right">
[<a href="#close" class="closelink" onclick="self.close()"><roundcube:label name="close" /></a>]
</div>
</div>
<div id="attachmentcontainer">
<roundcube:object name="plugin.attachmentframe" id="attachmentframe" width="100%" height="100%" />
</div>
</body>
</html>

View file

@ -1,261 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><roundcube:object name="pagetitle" /></title>
<roundcube:include file="/includes/links.html" />
<script type="text/javascript" src="/functions.js"></script>
<!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="plugins/calendar/skins/classic/iehacks.css" /><![endif]-->
</head>
<roundcube:if condition="env:extwin" /><body class="calendarmain extwin"><roundcube:else /><body class="calendarmain"><roundcube:endif />
<roundcube:include file="/includes/taskbar.html" />
<roundcube:include file="/includes/header.html" />
<div id="main">
<div id="calendarsidebar">
<div id="calendartoolbar">
<roundcube:button command="addevent" type="link" class="buttonPas addevent" classAct="button addevent" classSel="button addeventSel" title="calendar.new_event" content=" " />
<roundcube:button command="print" type="link" class="buttonPas print" classAct="button print" classSel="button printSel" title="calendar.print" content=" " />
<roundcube:button command="events-import" type="link" class="buttonPas import" classAct="button import" classSel="button importSel" title="calendar.importevents" content=" " />
<roundcube:button command="export" type="link" class="buttonPas export" classAct="button export" classSel="button exportSel" title="calendar.export" content=" " />
<roundcube:container name="toolbar" id="calendartoolbar" />
</div>
<div id="datepicker"></div>
<div id="calendars" style="visibility:hidden">
<div class="boxtitle"><roundcube:label name="calendar.calendars" /></div>
<div class="listsearchbox">
<div class="searchbox">
<input type="text" name="q" id="calendarlistsearch" placeholder="<roundcube:label name='calendar.findcalendars' />" />
<a class="iconbutton searchicon"></a>
<roundcube:button command="reset-listsearch" id="calendarlistsearch-reset" class="reset searchreset" title="resetsearch" content="x" />
</div>
</div>
<div class="boxlistcontent">
<roundcube:object name="plugin.calendar_list" id="calendarslist" class="treelist" />
</div>
<div class="boxfooter">
<roundcube:button command="calendar-create" type="link" title="calendar.createcalendar" class="buttonPas addgroup" classAct="button addgroup" content=" " />
<roundcube:button name="calendaroptionslink" id="calendaroptionslink" type="link" title="moreactions" class="button groupactions" onclick="rcmail_ui.show_popup('calendaroptions');return false" content=" " />
</div>
</div>
</div>
<div id="calendarsidebartoggle"></div>
<div id="calendar">
<roundcube:object name="plugin.angenda_options" class="boxfooter" id="agendaoptions" />
</div>
</div>
<div id="calendaroptionsmenu" class="popupmenu">
<ul>
<li><roundcube:button command="calendar-edit" label="calendar.edit" classAct="active" /></li>
<li><roundcube:button command="calendar-delete" label="delete" classAct="active" /></li>
<roundcube:if condition="env:calendar_driver == 'kolab'" />
<li><roundcube:button command="calendar-remove" label="calendar.removelist" classAct="active" /></li>
<roundcube:endif />
<li><roundcube:button command="calendar-showurl" label="calendar.showurl" classAct="active" /></li>
<roundcube:if condition="env:calendar_driver == 'kolab'" />
<li class="separator_above"><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li>
<roundcube:endif />
</ul>
</div>
<div id="eventshow" class="uidialog">
<h1 id="event-title">Event Title</h1>
<div id="event-status-badge"><span></span></div>
<div class="event-section" id="event-location">Location</div>
<div class="event-section" id="event-date">From-To</div>
<div class="event-section" id="event-description">
<h5 class="label"><roundcube:label name="calendar.description" /></h5>
<div class="event-text"></div>
</div>
<div class="event-section" id="event-url">
<h5 class="label"><roundcube:label name="calendar.url" /></h5>
<div class="event-text"></div>
</div>
<div class="event-section" id="event-repeat">
<h5 class="label"><roundcube:label name="calendar.repeat" /></h5>
<div class="event-text"></div>
</div>
<div class="event-section" id="event-alarm">
<h5 class="label"><roundcube:label name="calendar.alarms" /></h5>
<div class="event-text"></div>
</div>
<div class="event-section event-attendees" id="event-attendees">
<h5 class="label"><roundcube:label name="calendar.tabattendees" /></h5>
<div class="event-text"></div>
</div>
<div class="event-line" id="event-partstat">
<label><roundcube:label name="calendar.mystatus" /></label>
<a href="#change" class="changersvp" title="<roundcube:label name='calendar.changepartstat' />">
<span class="event-text"></span>
</a>
</div>
<div class="event-line" id="event-calendar">
<label><roundcube:label name="calendar.calendar" /></label>
<span class="event-text">Default</span>
</div>
<div class="event-line" id="event-category">
<label><roundcube:label name="calendar.category" /></label>
<span class="event-text"></span>
</div>
<div class="event-line" id="event-free-busy">
<label><roundcube:label name="calendar.freebusy" /></label>
<span class="event-text"></span>
</div>
<div class="event-line" id="event-priority">
<label><roundcube:label name="calendar.priority" /></label>
<span class="event-text"></span>
</div>
<div class="event-line" id="event-sensitivity">
<label><roundcube:label name="calendar.sensitivity" /></label>
<span class="event-text"></span>
</div>
<div class="event-section" id="event-attachments">
<label><roundcube:label name="attachments" /></label>
<div class="event-text attachments-list"></div>
</div>
<roundcube:object name="plugin.event_rsvp_buttons" id="event-rsvp" style="display:none" />
</div>
<div id="eventoptionsmenu" class="popupmenu">
<ul>
<li><roundcube:button command="event-download" label="download" classAct="active" /></li>
<li><roundcube:button command="event-sendbymail" label="send" classAct="active" /></li>
<li><roundcube:button command="event-copy" label="copy" classAct="active" /></li>
</ul>
</div>
<roundcube:include file="/templates/eventedit.html" />
<div id="eventresourcesdialog" class="uidialog">
<div id="resource-dialog-left">
<div id="resource-selection" class="">
<div id="resourcequicksearch">
<roundcube:object name="plugin.resources_searchform" id="resourcesearchbox" />
<roundcube:button command="reset-resource-search" id="resourcesearchreset" image="/images/icons/reset.gif" title="resetsearch" width="13" height="13" />
</div>
<div class="boxlistcontent">
<roundcube:object name="plugin.resources_list" id="resources-list" class="treelist" />
</div>
</div>
</div>
<div id="resource-dialog-right">
<div id="resource-info">
<h2 class="boxtitle"><roundcube:label name="calendar.resourcedetails" /></h2>
<roundcube:object name="plugin.resource_info" id="resource-details" />
</div>
<div id="resource-availability">
<h2 class="boxtitle"><roundcube:label name="calendar.resourceavailability" /></h2>
<roundcube:object name="plugin.resource_calendar" id="resource-freebusy-calendar" />
</div>
</div>
</div>
<div id="eventfreebusy" class="uidialog">
<roundcube:object name="plugin.attendees_freebusy_table" id="attendees-freebusy-table" cellspacing="0" cellpadding="0" border="0" />
<div class="schedule-options">
&nbsp;
<div class="schedule-buttons">
<button id="shedule-freebusy-prev" title="<roundcube:label name='previouspage' />">&#9668;</button><button id="shedule-freebusy-next" title="<roundcube:label name='nextpage' />">&#9658;</button>
</div>
</div>
<div style="float:left; width:28em">
<div class="form-section">
<label for="schedule-startdate"><roundcube:label name="calendar.start" /></label>
<input type="text" name="startdate" size="11" id="schedule-startdate" disabled="true" /> &nbsp;
<input type="text" name="starttime" size="6" id="schedule-starttime" disabled="true" />
</div>
<div class="form-section">
<label for="schedule-enddate"><roundcube:label name="calendar.end" /></label>
<input type="text" name="enddate" size="11" id="schedule-enddate" disabled="true" /> &nbsp;
<input type="text" name="endtime" size="6" id="schedule-endtime" disabled="true" />
</div>
</div>
<div style="float:left">
<div class="schedule-find-buttons">
<button id="shedule-find-prev">&#9668; <roundcube:label name="calendar.prevslot" /></button>
<button id="shedule-find-next"><roundcube:label name="calendar.nextslot" /> &#9658;</button>
</div>
<div class="schedule-options">
<label><input type="checkbox" id="schedule-freebusy-workinghours" value="1" /><roundcube:label name="calendar.onlyworkinghours" /></label>
</div>
</div>
<br style="clear:both;" />
<roundcube:include file="/templates/freebusylegend.html" />
<div class="attendees-list">
<span class="attendee organizer"><roundcube:label name="calendar.roleorganizer" /></span>
<span class="attendee req-participant"><roundcube:label name="calendar.rolerequired" /></span>
<span class="attendee opt-participant"><roundcube:label name="calendar.roleoptional" /></span>
<span class="attendee non-participant"><roundcube:label name="calendar.rolenonparticipant" /></span>
<span class="attendee chair"><roundcube:label name="calendar.rolechair" /></span>
</div>
</div>
<div id="calendarform" class="uidialog">
<roundcube:label name="loading" />
</div>
<div id="eventsimport" class="uidialog">
<roundcube:object name="plugin.events_import_form" id="events-import-form" uploadFieldSize="30" />
</div>
<div id="eventsexport" class="uidialog">
<roundcube:object name="plugin.events_export_form" id="events-export-form" />
</div>
<div id="calendarurlbox" class="uidialog">
<p><roundcube:label name="calendar.showurldescription" /></p>
<textarea id="calfeedurl" rows="2" readonly="readonly"></textarea>
<div id="calendarcaldavurl" style="display:none">
<p><roundcube:label name="calendar.caldavurldescription" html="yes" /></p>
<textarea id="caldavurl" rows="2" readonly="readonly"></textarea>
</div>
</div>
<div id="quicksearchbar">
<roundcube:button name="searchmenulink" id="searchmenulink" image="/images/icons/glass.png" />
<roundcube:object name="plugin.searchform" id="quicksearchbox" />
<roundcube:button command="reset-search" id="searchreset" image="/images/icons/reset.gif" title="resetsearch" />
</div>
<roundcube:object name="plugin.calendar_css" />
<script type="text/javascript">
// use skin functions to handle popup-menus
rcube_init_mail_ui();
rcmail_ui.popups.calendaroptions = { id:'calendaroptionsmenu', above:1, obj:$('#calendaroptionsmenu') };
$(document).ready(function(e){
// initialize sidebar toggle
$('#calendarsidebartoggle').click(function() {
var width = $(this).data('sidebarwidth');
var offset = $(this).data('offset');
var $sidebar = $('#calendarsidebar'), time = 250;
if ($sidebar.is(':visible')) {
$sidebar.animate({ left:'-'+(width+10)+'px' }, time, function(){ $('#calendarsidebar').hide(); });
$(this).animate({ left:'8px'}, time, function(){ $('#calendarsidebartoggle').addClass('sidebarclosed') });
$('#calendar').animate({ left:'20px'}, time, function(){ $(this).fullCalendar('render'); });
}
else {
$sidebar.show().animate({ left:'10px' }, time);
$(this).animate({ left:offset+'px'}, time, function(){ $('#calendarsidebartoggle').removeClass('sidebarclosed'); });
$('#calendar').animate({ left:(width+16)+'px'}, time, function(){ $(this).fullCalendar('render'); });
}
})
.data('offset', $('#calendarsidebartoggle').position().left)
.data('sidebarwidth', $('#calendarsidebar').width() + $('#calendarsidebar').position().left);
});
</script>
</body>
</html>

View file

@ -1,128 +0,0 @@
<div id="eventedit" class="uidialog">
<form id="eventtabs" action="#" method="post" enctype="multipart/form-data">
<ul>
<li><a href="#event-panel-1"><roundcube:label name="calendar.tabsummary" /></a></li>
<li id="edit-tab-recurrence"><a href="#event-panel-recurrence"><roundcube:label name="calendar.tabrecurrence" /></a></li>
<li id="edit-tab-attendees"><a href="#event-panel-attendees"><roundcube:label name="calendar.tabattendees" /></a></li>
<li id="edit-tab-resources"><a href="#event-panel-resources"><roundcube:label name="calendar.tabresources" /></a></li>
<li id="edit-tab-attachments"><a href="#event-panel-attachments"><roundcube:label name="calendar.tabattachments" /></a></li>
</ul>
<!-- basic info -->
<div id="event-panel-1">
<div class="event-section">
<label for="edit-title"><roundcube:label name="calendar.title" /></label>
<br />
<input type="text" class="text" name="title" id="edit-title" size="40" />
</div>
<div class="event-section">
<label for="edit-location"><roundcube:label name="calendar.location" /></label>
<br />
<input type="text" class="text" name="location" id="edit-location" size="40" />
</div>
<div class="event-section">
<label for="edit-description"><roundcube:label name="calendar.description" /></label>
<br />
<textarea name="description" id="edit-description" class="text" rows="5" cols="40"></textarea>
</div>
<div class="event-section">
<label for="edit-url"><roundcube:label name="calendar.url" /></label>
<br />
<input type="text" class="text" name="vurl" id="edit-url" size="40" />
</div>
<div class="event-section">
<label style="float:right;padding-right:0.5em"><input type="checkbox" name="allday" id="edit-allday" value="1" /><roundcube:label name="calendar.all-day" /></label>
<label for="edit-startdate"><roundcube:label name="calendar.start" /></label>
<input type="text" name="startdate" size="11" id="edit-startdate" /> &nbsp;
<input type="text" name="starttime" size="6" id="edit-starttime" />
</div>
<div class="event-section">
<label for="edit-enddate"><roundcube:label name="calendar.end" /></label>
<input type="text" name="enddate" size="11" id="edit-enddate" /> &nbsp;
<input type="text" name="endtime" size="6" id="edit-endtime" />
</div>
<div class="event-section" id="edit-alarms">
<div class="edit-alarm-item first">
<label for="edit-alarm"><roundcube:label name="calendar.alarms" /></label>
<roundcube:object name="plugin.alarm_select" />
<span class="edit-alarm-buttons">
<a href="#add" class="iconlink add add-alarm">+</a>
<a href="#delete" class="iconlink delete delete-alarm">-</a>
</span>
</div>
</div>
<div class="event-section" id="calendar-select">
<label for="edit-calendar"><roundcube:label name="calendar.calendar" /></label>
<roundcube:object name="plugin.calendar_select" id="edit-calendar" />
</div>
<div class="event-section">
<label for="edit-categories"><roundcube:label name="calendar.category" /></label>
<roundcube:object name="plugin.category_select" id="edit-categories" />
</div>
<div class="event-section">
<label for="edit-event-status"><roundcube:label name="calendar.status" /></label>
<roundcube:object name="plugin.status_select" id="edit-event-status" />
</div>
<div class="event-section">
<label for="edit-free-busy"><roundcube:label name="calendar.freebusy" /></label>
<roundcube:object name="plugin.freebusy_select" id="edit-free-busy" />
</div>
<div class="event-section">
<label for="edit-priority"><roundcube:label name="calendar.priority" /></label>
<roundcube:object name="plugin.priority_select" id="edit-priority" />
</div>
<div class="event-section">
<label for="edit-sensitivity"><roundcube:label name="calendar.sensitivity" /></label>
<roundcube:object name="plugin.sensitivity_select" id="edit-sensitivity" />
</div>
</div>
<!-- recurrence settings -->
<div id="event-panel-recurrence">
<div class="event-section border-after">
<roundcube:object name="plugin.recurrence_form" part="frequency" />
</div>
<div class="recurrence-form border-after" id="recurrence-form-daily">
<roundcube:object name="plugin.recurrence_form" part="daily" class="event-section" />
</div>
<div class="recurrence-form border-after" id="recurrence-form-weekly">
<roundcube:object name="plugin.recurrence_form" part="weekly" class="event-section" />
</div>
<div class="recurrence-form border-after" id="recurrence-form-monthly">
<roundcube:object name="plugin.recurrence_form" part="monthly" class="event-section" />
</div>
<div class="recurrence-form border-after" id="recurrence-form-yearly">
<roundcube:object name="plugin.recurrence_form" part="yearly" class="event-section" />
</div>
<div class="recurrence-form" id="recurrence-form-until">
<roundcube:object name="plugin.recurrence_form" part="until" class="event-section" />
</div>
<div class="recurrence-form" id="recurrence-form-rdate">
<roundcube:object name="plugin.recurrence_form" part="rdate" class="event-section" />
</div>
</div>
<!-- attendees list -->
<div id="event-panel-attendees">
<roundcube:object name="plugin.attendees_list" id="edit-attendees-table" class="edit-attendees-table" cellspacing="0" cellpadding="0" border="0" />
<roundcube:object name="plugin.attendees_form" id="edit-attendees-form" />
<roundcube:include file="/templates/freebusylegend.html" />
</div>
<!-- resources list -->
<div id="event-panel-resources">
<roundcube:object name="plugin.attendees_list" id="edit-resources-table" class="edit-attendees-table" cellspacing="0" cellpadding="0" border="0" coltitle="resource" />
<roundcube:object name="plugin.resources_form" id="edit-resources-form" />
<roundcube:include file="/templates/freebusylegend.html" />
</div>
<!-- attachments list (with upload form) -->
<div id="event-panel-attachments">
<div id="edit-attachments" class="attachments-list">
<roundcube:object name="plugin.attachments_list" id="attachmentlist" deleteIcon="/images/icons/delete.png" cancelIcon="/images/icons/delete.png" loadingIcon="/images/display/loading_blue.gif" />
</div>
<div id="edit-attachments-form">
<roundcube:object name="plugin.attachments_form" id="calendar-attachment-form" attachmentFieldSize="30" />
</div>
</div>
</form>
<roundcube:object name="plugin.edit_attendees_notify" id="edit-attendees-notify" class="event-dialog-message" style="display:none" />
<roundcube:object name="plugin.edit_recurring_warning" class="event-dialog-message edit-recurring-warning" style="display:none" />
<div id="edit-localchanges-warning" class="event-dialog-message" style="display:none"><roundcube:label name="calendar.localchangeswarning" /></div>
</div>

View file

@ -1,7 +0,0 @@
<div id="edit-attendees-legend" class="availability">
<span class="legend"><img class="availabilityicon free" src="program/resources/blank.gif" /> <roundcube:label name="calendar.availfree" /></span>
<span class="legend"><img class="availabilityicon busy" src="program/resources/blank.gif" /> <roundcube:label name="calendar.availbusy" /></span>
<span class="legend"><img class="availabilityicon tentative" src="program/resources/blank.gif" /> <roundcube:label name="calendar.availtentative" /></span>
<!--<span class="legend"><img class="availabilityicon out-of-office" src="program/resources/blank.gif" /> <roundcube:label name="calendar.availoutofoffice" /></span>-->
<span class="legend"><img class="availabilityicon unknown" src="program/resources/blank.gif" /> <roundcube:label name="calendar.availunknown" /></span>
</div>

View file

@ -1,21 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><roundcube:object name="pagetitle" /></title>
<roundcube:include file="/includes/links.html" />
</head>
<body class="calendaritipattend">
<roundcube:object name="logo" src="/images/roundcube_logo.png" id="logo" border="0" style="margin:0 11px" />
<roundcube:object name="message" id="message" />
<div class="centerbox">
<roundcube:object name="plugin.event_inviteform" />
<roundcube:object name="plugin.event_invitebox" class="calendar-invitebox" />
<roundcube:object name="plugin.event_rsvp_buttons" type="submit" iname="rsvp" id="event-rsvp" delegate="false" />
</form>
</div>
</body>
</html>

View file

@ -1,13 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><roundcube:object name="pagetitle" /></title>
<roundcube:include file="/includes/links.html" />
<script type="text/javascript" src="/functions.js"></script>
</head>
<body class="iframe" style="background:#fff; margin:0">
<roundcube:object name="folderacl" />
</body>
</html>

View file

@ -1,7 +0,0 @@
<div id="calendar-kolabform">
<roundcube:object name="calendarform" />
</div>
<script type="text/javascript">rcube_init_tabs('calendar-kolabform');</script>
<style type="text/css">
#calendarpropform { min-width:680px }
</style>

View file

@ -1,28 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><roundcube:object name="pagetitle" /></title>
</head>
<body class="calendarprint">
<div id="printconfig" class="noprint">
<div class="calwidth">
<a href="#close" onclick="window.close()" class="rightalign"><roundcube:label name="close" /></a>
<span class="prop"><input type="button" id="printme" value="<roundcube:label name='print' />" onclick="window.print()"></span>
<span class="prop"><label><input type="checkbox" id="propdescription" checked="checked" /> <roundcube:label name="calendar.printdescriptions" /></label></span>
</div>
</div>
<roundcube:object name="message" id="message" class="noprint" />
<div id="calendar" class="calwidth"></div>
<div class="calwidth">
<roundcube:object name="plugin.calendar_list" activeonly="true" id="calendarlist" />
</div>
<roundcube:object name="plugin.calendar_css" printmode="true" />
<!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="plugins/calendar/skins/classic/print.iehacks.css" /><![endif]-->
</body>
</html>

View file

@ -0,0 +1,382 @@
<roundcube:include file="includes/layout.html" />
<roundcube:include file="includes/menu.html" />
<h1 class="voice"><roundcube:label name="calendar.calendar" /></h1>
<!-- calendars list -->
<div class="sidebar listbox" role="navigation" aria-labelledby="arial-label-calendars">
<div class="header">
<a class="button icon back-content-button" href="#back" data-hidden="big"><span class="inner"><roundcube:label name="back" /></span></a>
<span id="aria-label-calendars" class="header-title"><roundcube:label name="calendar.calendars" /></span>
<div id="calendar-search" class="searchbar toolbar" role="search" aria-labelledby="aria-label-calendarsearchform">
<h2 id="aria-label-calendarsearchform" class="voice"><roundcube:label name="calendar.arialabelcalsearchform" /></h2>
<form name="foldersearchform" onsubmit="return false">
<input id="calendarlistsearch" type="text" name="q" placeholder="<roundcube:label name="searchplaceholder" />" />
<a class="button reset" href="#" onclick="return rcmail.command(\'reset-listsearch\',null,this,event)" title="<roundcube:label name="resetsearch" />" tabindex="0">
<span class="inner"><roundcube:label name="resetsearch" /></span>
</a>
</form>
<a class="button search" href="#" title="<roundcube:label name="calendar.findcalendars" />" tabindex="0">
<span class="inner"><roundcube:label name="calendar.findcalendars" /></span>
</a>
</div>
</div>
<div id="calendars-content" class="scroller">
<roundcube:object name="plugin.calendar_list" id="calendarslist" class="treelist listing iconized" />
</div>
<h2 id="aria-label-minical" class="voice"><roundcube:label name="calendar.arialabelminical" /></h2>
<div id="datepicker" class="calendar-datepicker" role="presentation"></div>
<div class="footer toolbar" role="toolbar">
<roundcube:button command="calendar-create" type="link"
title="calendar.createcalendar" label="calendar.addcalendar"
class="button create disabled" classAct="button create" innerClass="inner" />
<roundcube:button name="calendaractionsmenu" id="calendaroptionsmenulink" type="link"
title="calendar.calendaractions" class="button actions" data-popup="calendaractions-menu"
innerClass="inner" label="actions" />
</div>
</div>
<!-- calendar -->
<div class="content selected no-navbar" role="main">
<h2 id="aria-label-toolbar" class="voice"><roundcube:label name="arialabeltoolbar" /></h2>
<div class="header" role="toolbar" aria-labelledby="aria-label-toolbar">
<a class="button icon menu-button" href="#menu"><span class="inner"><roundcube:label name="menu" /></span></a>
<a class="button icon back-sidebar-button folders" href="#sidebar" data-hidden="big"><span class="inner"><roundcube:label name="calendar.calendars" /></span></a>
<span class="header-title"></span>
<!-- toolbar -->
<div id="calendartoolbar" class="toolbar">
<roundcube:button command="addevent" type="link"
class="button create disabled" classAct="button create"
label="create" title="calendar.new_event" innerClass="inner" />
<roundcube:button command="print" type="link" data-hidden="small"
class="button print disabled" classAct="button print"
label="calendar.print" title="calendar.printtitle" innerClass="inner" />
<span class="spacer"></span>
<roundcube:button command="events-import" type="link"
class="button import disabled" classAct="button import"
label="import" title="calendar.importevents" innerClass="inner" />
<roundcube:button command="export" type="link"
class="button export disabled" classAct="button export"
label="calendar.export" title="calendar.exporttitle" innerClass="inner" />
<roundcube:container name="toolbar" id="calendartoolbar" />
</div>
<roundcube:object name="plugin.searchform" id="searchform" wrapper="searchbar toolbar"
label="searchform" buttontitle="calendar.findevents" label-domain="calendar" ariatag="h2" />
</div>
<h2 id="aria-label-calendarview" class="voice"><roundcube:label name="calendar.arialabelcalendarview" /></h2>
<div id="calendar" class="content" role="main" aria-labelledby="aria-label-calendarview" data-elastic-mode="true">
<roundcube:object name="plugin.agenda_options" id="agendaoptions" />
<div id="searchcontrols" class="search-controls"></div>
</div>
<div class="footer toolbar" role="toolbar" data-hidden="big">
<a href="#" class="button prev" onclick="$('.fc-button-prev').click()"><span class="inner"><roundcube:label name="previous" /></span></a>
<a href="#" class="button today" onclick="$('.fc-button-today').click()"><span class="inner"><roundcube:label name="today" /></span></a>
<a href="#" class="button date" onclick="window.calendar_datepicker()"><span class="inner"><roundcube:label name="date" /></span></a>
<a href="#" class="button next" onclick="$('.fc-button-next').click()"><span class="inner"><roundcube:label name="next" /></span></a>
</div>
</div>
<div id="timezone-display" class="hidden"><roundcube:var name="env:timezone" /></div>
<div id="eventshow" class="popupmenu formcontent propform text-only">
<h1 id="event-title" class="event-title form-group">Event Title</h1>
<div id="event-status-badge"><span></span></div>
<div class="event-location form-group" id="event-location">Location</div>
<div class="event-date form-group" id="event-date">From-To</div>
<div class="event-description form-group" id="event-description">
<div class="event-text"></div>
</div>
<div class="event-attendees form-group" id="event-attendees">
<div class="event-text"></div>
</div>
<div id="event-url" class="form-group row">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.url" /></label>
<span class="event-text col-sm-8 form-control-plaintext"></span>
</div>
<div id="event-repeat" class="form-group row">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.repeat" /></label>
<span class="event-text col-sm-8 form-control-plaintext"></span>
</div>
<div id="event-alarm" class="form-group row">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.alarms" /></label>
<span class="event-text col-sm-8 form-control-plaintext"></span>
</div>
<div id="event-partstat" class="form-group row event-partstat">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.mystatus" /></label>
<span class="col-sm-8 form-control-plaintext">
<span class="event-text rsvp-status"></span>
<a class="changersvp button edit" href="#" title="<roundcube:label name='calendar.changepartstat' />"><span class="inner"><roundcube:label name='calendar.changepartstat' /></span></a>
</span>
</div>
<div id="event-calendar" class="form-group row">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.calendar" /></label>
<span class="col-sm-8 form-control-plaintext event-text">Default</span>
</div>
<div id="event-category" class="form-group row">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.category" /></label>
<span class="col-sm-8 form-control-plaintext event-text"></span>
</div>
<div id="event-status" class="form-group row">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.status" /></label>
<span class="event-text col-sm-8 form-control-plaintext"></span>
</div>
<div id="event-free-busy" class="form-group row">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.freebusy" /></label>
<span class="event-text col-sm-8 form-control-plaintext"></span>
</div>
<div id="event-priority" class="form-group row">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.priority" /></label>
<span class="event-text col-sm-8 form-control-plaintext"></span>
</div>
<div id="event-rsvp-comment" class="form-group row">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.rsvpcomment" /></label>
<span class="event-text col-sm-8 form-control-plaintext"></span>
</div>
<div id="event-links" class="form-group row">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.links" /></label>
<span class="event-text col-sm-8"></span>
</div>
<div id="event-created" class="form-group row faded">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.created" /></label>
<span class="event-text event-created col-sm-8 form-control-plaintext"></span>
</div>
<div id="event-changed" class="form-group row faded">
<label class="col-sm-4 col-form-label"><roundcube:label name="calendar.changed" /></label>
<span class="event-text event-changed col-sm-8 form-control-plaintext"></span>
</div>
<div id="event-attachments" class="form-group row">
<div class="event-text"></div>
</div>
<roundcube:object name="plugin.event_rsvp_buttons" id="event-rsvp" class="calendar-invitebox invitebox boxinformation" style="display:none" />
</div>
<roundcube:include file="/templates/eventedit.html" />
<div id="calendaractions-menu" class="popupmenu">
<h3 id="aria-label-calendaroptions" class="voice"><roundcube:label name="calendar.calendaractions" /></h3>
<ul class="toolbarmenu listing" role="menu" aria-labelledby="aria-label-calendaroptions">
<roundcube:button type="link-menuitem" command="calendar-edit" label="calendar.edit" class="edit disabled" classAct="edit active" />
<roundcube:button type="link-menuitem" command="calendar-delete" label="delete" class="delete disabled" classAct="delete active" />
<roundcube:if condition="env:calendar_driver == 'kolab'" />
<roundcube:button type="link-menuitem" command="calendar-remove" label="calendar.removelist" class="remove disabled" classAct="remove active" />
<roundcube:endif />
<roundcube:button type="link-menuitem" command="calendar-showurl" label="calendar.showurl" class="showurl disabled" classAct="showurl active" />
<roundcube:if condition="!empty(env:calendar_settings['freebusy_url'])" />
<roundcube:button type="link-menuitem" command="calendar-showfburl" label="calendar.showfburl" class="showurl disabled" classAct="showurl active" />
<roundcube:endif />
<roundcube:if condition="env:calendar_driver == 'kolab'" />
<roundcube:button type="link-menuitem" command="folders" task="settings" label="managefolders" class="folders disabled" classAct="folders active" />
<roundcube:endif />
</ul>
</div>
<div id="eventoptionsmenu" class="popupmenu">
<h3 id="aria-label-eventoptions" class="voice"><roundcube:label name="calendar.eventoptions" /></h3>
<ul class="toolbarmenu listing" role="menu" aria-labelledby="aria-label-eventoptions">
<roundcube:button type="link-menuitem" command="event-download" label="download" class="download disabled" classAct="download active" />
<roundcube:button type="link-menuitem" command="event-sendbymail" label="send" class="send disabled" classAct="send active" />
<roundcube:button type="link-menuitem" command="event-copy" label="copy" class="copy disabled" classAct="copy active" />
<roundcube:if condition="env:calendar_driver == 'kolab' && config:kolab_bonnie_api" />
<roundcube:button type="link-menuitem" command="event-history" label="calendar.eventhistory" class="history disabled" classAct="history active" />
<roundcube:endif />
</ul>
</div>
<div id="eventresourcesdialog" class="popupmenu">
<div class="resources-dialog">
<h3 class="voice" id="aria-label-resourceselection"><roundcube:label name="calendar.arialabelresourceselection" /></h3>
<div class="resource-selection uibox listbox" role="navigation" aria-labelledby="aria-label-resourceselection">
<span class="header-title"><roundcube:label name="calendar.tabresources" /></span>
<div id="resourcequicksearch" class="header">
<div class="searchbox" role="search" aria-labelledby="aria-label-resourcesearchform" aria-controls="resources-list">
<h3 id="aria-label-resourcesearchform" class="voice"><roundcube:label name="calendar.arialabelresourcesearchform" /></h3>
<label for="resourcesearchbox" class="voice"><roundcube:label name="calendar.searchterms" /></label>
<roundcube:object name="plugin.resources_searchform" id="resourcesearchbox" />
<a id="resourcesearchmenulink" class="iconbutton searchoptions"> </a>
<roundcube:button type="link" command="reset-resource-search" id="resourcesearchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" />
</div>
</div>
<div class="scroller">
<roundcube:object name="plugin.resources_list" id="resources-list" class="listing treelist" />
</div>
</div>
<div class="resource-content">
<div id="resource-info" class="uibox contentbox" role="region" aria-labelledby="aria-label-resourcedetails">
<h2 class="boxtitle" id="aria-label-resourcedetails"><roundcube:label name="calendar.resourcedetails" /></h2>
<div class="scroller">
<roundcube:object name="plugin.resource_info" id="resource-details" class="propform" aria-live="polite" aria-relevant="text" aria-atomic="true" />
</div>
</div>
<div id="resource-availability" class="uibox contentbox" role="region" aria-labelledby="aria-label-resourceavailability">
<h2 class="boxtitle" id="aria-label-resourceavailability"><roundcube:label name="calendar.resourceavailability" /></h2>
<roundcube:object name="plugin.resource_calendar" id="resource-freebusy-calendar" />
<div class="boxpagenav">
<roundcube:button name="resource-cal-prev" id="resource-calendar-prev" type="link" class="icon prevpage" title="calendar.prevslot" label="calendar.prevweek" />
<roundcube:button name="resource-cal-next" id="resource-calendar-next" type="link" class="icon nextpage" title="calendar.nextslot" label="calendar.nextweek" />
</div>
</div>
</div>
</div>
</div>
<div id="eventfreebusy" class="popupmenu calendar-scheduler formcontent">
<roundcube:object name="plugin.attendees_freebusy_table" id="attendees-freebusy-table"
class="schedule-table" data-h-margin="-1" data-v-margin="1" />
<div class="schedule-nav">
<button id="schedule-freebusy-prev" title="<roundcube:label name='previouspage' />">&#9668;</button>
<button id="schedule-freebusy-next" title="<roundcube:label name='nextpage' />">&#9658;</button>
</div>
<div class="slot-nav">
<div class="schedule-find-buttons">
<button id="schedule-find-prev" class="btn btn-secondary prev-slot"><roundcube:label name="calendar.prevslot" /></button>
<button id="schedule-find-next" class="btn btn-secondary next-slot"><roundcube:label name="calendar.nextslot" /></button>
</div>
<div class="schedule-options">
<label><input type="checkbox" id="schedule-freebusy-workinghours" value="1" class="pretty-checkbox" /><roundcube:label name="calendar.onlyworkinghours" /></label>
</div>
</div>
<div class="schedule-range">
<div class="form-group row">
<label for="schedule-startdate" class="col-form-label col-sm-2"><roundcube:label name="calendar.start" /></label>
<span class="col-sm-10 datetime">
<input type="text" name="startdate" size="11" id="schedule-startdate" class="form-control" disabled="true" /> &nbsp;
<input type="text" name="starttime" size="6" id="schedule-starttime" class="form-control" disabled="true" />
</span>
</div>
<div class="form-group row">
<label for="schedule-enddate" class="col-form-label col-sm-2"><roundcube:label name="calendar.end" /></label>
<span class="col-sm-10 datetime">
<input type="text" name="enddate" size="11" id="schedule-enddate" class="form-control" disabled="true" /> &nbsp;
<input type="text" name="endtime" size="6" id="schedule-endtime" class="form-control" disabled="true" />
</span>
</div>
<div class="schedule-legend form-group row">
<label class="col-form-label col-sm-2"><roundcube:label name="calendar.legend" /></label>
<span class="col-sm-10 form-control-plaintext">
<roundcube:include file="/templates/freebusylegend.html" />
<span class="attendee organizer"><roundcube:label name="calendar.roleorganizer" /></span>
<span class="attendee req-participant"><roundcube:label name="calendar.rolerequired" /></span>
<span class="attendee opt-participant"><roundcube:label name="calendar.roleoptional" /></span>
<span class="attendee non-participant"><roundcube:label name="calendar.rolenonparticipant" /></span>
<span class="attendee chair"><roundcube:label name="calendar.rolechair" /></span>
</span>
</div>
</div>
</div>
<div id="eventsimport" class="popupmenu formcontent">
<roundcube:object name="plugin.events_import_form" id="events-import-form" />
</div>
<div id="eventsexport" class="popupmenu formcontent">
<roundcube:object name="plugin.events_export_form" id="events-export-form" />
</div>
<div id="calendarurlbox" class="popupmenu">
<p><roundcube:label name="calendar.showurldescription" /></p>
<textarea id="calfeedurl" rows="2" readonly="readonly"></textarea>
<div id="calendarcaldavurl" style="display:none; margin-top:1rem">
<p><roundcube:label name="calendar.caldavurldescription" html="yes" /></p>
<textarea id="caldavurl" rows="2" readonly="readonly"></textarea>
</div>
</div>
<div id="fburlbox" class="popupmenu">
<p><roundcube:label name="calendar.fburldescription" /></p>
<textarea id="fburl" rows="2" readonly="readonly"></textarea>
</div>
<roundcube:if condition="config:kolab_bonnie_api" />
<div id="eventhistory" class="popupmenu" aria-hidden="true">
<roundcube:object name="plugin.object_changelog_table" id="event-changelog-table" class="changelog-table" />
<div class="compare-button"><input type="button" class="button" value="<roundcube:label name='libkolab.compare' />" /></div>
</div>
<div id="eventdiff" class="popupmenu formcontent text-only">
<h1 class="event-title">Event Title</h1>
<h1 class="event-title-new event-text-new"></h1>
<div class="form-group row event-date"></div>
<div class="form-group row event-location">
<h5 class="label"><roundcube:label name="calendar.location" /></h5>
<div class="event-text-old"></div>
<div class="event-text-new"></div>
</div>
<div class="form-group row event-description">
<h5 class="label"><roundcube:label name="calendar.description" /></h5>
<div class="event-text-diff" style="white-space:pre-wrap"></div>
<div class="event-text-old"></div>
<div class="event-text-new"></div>
</div>
<div class="form-group row event-url">
<h5 class="label"><roundcube:label name="calendar.url" /></h5>
<div class="event-text-old"></div>
<div class="event-text-new"></div>
</div>
<div class="form-group row event-recurrence">
<h5 class="label"><roundcube:label name="calendar.repeat" /></h5>
<div class="event-text-old"></div>
<div class="event-text-new"></div>
</div>
<div class="form-group row event-alarms">
<h5 class="label"><roundcube:label name="calendar.alarms" /><span class="index"></span></h5>
<div class="event-text-old"></div>
<div class="event-text-new"></div>
</div>
<div class="event-line event-start">
<label><roundcube:label name="calendar.start" /></label>
<span class="event-text-old"></span> &#8674;
<span class="event-text-new"></span>
</div>
<div class="event-line event-end">
<label><roundcube:label name="calendar.end" /></label>
<span class="event-text-old"></span> &#8674;
<span class="event-text-new"></span>
</div>
<div class="event-line event-attendees">
<label><roundcube:label name="calendar.tabattendees" /><span class="index"></span></label>
<span class="event-text-old"></span> &#8674;
<span class="event-text-new"></span>
</div>
<div class="event-line event-calendar">
<label><roundcube:label name="calendar.calendar" /></label>
<span class="event-text-old"></span> &#8674;
<span class="event-text-new"></span>
</div>
<div class="event-line event-categories">
<label><roundcube:label name="calendar.category" /></label>
<span class="event-text-old"></span> &#8674;
<span class="event-text-new"></span>
</div>
<div class="event-line event-status">
<label><roundcube:label name="calendar.status" /></label>
<span class="event-text-old"></span> &#8674;
<span class="event-text-new"></span>
</div>
<div class="event-line event-free_busy">
<label><roundcube:label name="calendar.freebusy" /></label>
<span class="event-text-old"></span> &#8674;
<span class="event-text-new"></span>
</div>
<div class="event-line event-priority">
<label><roundcube:label name="calendar.priority" /></label>
<span class="event-text-old"></span> &#8674;
<span class="event-text-new"></span>
</div>
<div class="event-line event-sensitivity">
<label><roundcube:label name="calendar.sensitivity" /></label>
<span class="event-text-old"></span> &#8674;
<span class="event-text-new"></span>
</div>
<div class="form-group row event-attachments">
<label><roundcube:label name="attachments" /><span class="index"></span></label>
<div class="event-text-old"></div>
<div class="event-text-new"></div>
</div>
</div>
<roundcube:endif />
<roundcube:object name="plugin.calendar_css" folder-class="div.$class a.calname:before" folder-fallback-color="#161b1d" />
<roundcube:include file="includes/footer.html" />

View file

@ -0,0 +1,158 @@
<div id="eventedit" class="<roundcube:exp expression="env:framed ? '' : 'popupmenu '">formcontent" aria-hidden="true" data-notabs="true">
<form class="tabbed" action="#" method="post" enctype="multipart/form-data">
<!-- basic info -->
<fieldset id="event-panel-summary">
<legend><roundcube:label name="calendar.tabsummary" /></legend>
<div class="form-group">
<label for="edit-title"><roundcube:label name="calendar.title" /></label>
<input type="text" class="form-control" name="title" id="edit-title" size="40" required="true" />
</div>
<div class="form-group">
<label for="edit-location"><roundcube:label name="calendar.location" /></label>
<input type="text" class="form-control" name="location" id="edit-location" size="40" />
</div>
<div class="form-group">
<label for="edit-description"><roundcube:label name="calendar.description" /></label>
<textarea name="description" id="edit-description" class="form-control" rows="5" cols="40"></textarea>
</div>
<div class="form-group row">
<label for="edit-startdate" class="col-sm-2 col-form-label"><roundcube:label name="calendar.start" /></label>
<div class="col-sm-10 datetime">
<input type="text" name="startdate" size="11" id="edit-startdate" class="form-control" required="true" /> &nbsp;
<input type="text" name="starttime" size="6" id="edit-starttime" class="form-control" aria-label="<roundcube:label name='calendar.starttime' />" />
<label><input type="checkbox" name="allday" id="edit-allday" value="1" class="pretty-checkbox" /><roundcube:label name="calendar.all-day" /></label>
</div>
</div>
<div class="form-group row">
<label for="edit-enddate" class="col-sm-2 col-form-label"><roundcube:label name="calendar.end" /></label>
<div class="col-sm-10 datetime">
<input type="text" name="enddate" size="11" id="edit-enddate" class="form-control" required="true" /> &nbsp;
<input type="text" name="endtime" size="6" id="edit-endtime" class="form-control" aria-label="<roundcube:label name='calendar.endtime' />" />
</div>
</div>
<div class="form-group row" id="edit-alarms">
<label for="edit-alarm-item" class="col-sm-2 col-form-label"><roundcube:label name="calendar.alarms" /></label>
<div class="col-sm-10 alarms-input">
<div class="edit-alarm-item first">
<roundcube:object name="plugin.alarm_select" id="edit-alarm-item" />
<span class="edit-alarm-buttons">
<a href="#add" class="icon button btn create add-alarm"><span class="inner"><roundcube:label name="libcalendaring.addalarm" /></span></a>
<a href="#delete" class="icon button btn delete delete-alarm"><span class="inner"><roundcube:label name="libcalendaring.removealarm" /></span></a>
</span>
</div>
</div>
</div>
<div class="form-group row" id="calendar-select">
<label for="edit-calendar" class="col-sm-2 col-form-label"><roundcube:label name="calendar.calendar" /></label>
<div class="col-sm-10">
<roundcube:object name="plugin.calendar_select" id="edit-calendar" class="form-control" />
</div>
</div>
<div class="form-group row">
<label for="edit-categories" class="col-sm-2 col-form-label"><roundcube:label name="calendar.category" /></label>
<div class="col-sm-10">
<roundcube:object name="plugin.category_select" id="edit-categories" class="form-control" />
</div>
</div>
<div class="form-group row">
<label for="edit-event-status" class="col-sm-2 col-form-label"><roundcube:label name="calendar.status" /></label>
<div class="col-sm-10">
<roundcube:object name="plugin.status_select" id="edit-event-status" class="form-control" />
</div>
</div>
<div class="form-group row">
<label for="edit-free-busy" class="col-sm-2 col-form-label"><roundcube:label name="calendar.freebusy" /></label>
<div class="col-sm-10">
<roundcube:object name="plugin.freebusy_select" id="edit-free-busy" class="form-control" />
</div>
</div>
<div class="form-group row">
<label for="edit-priority" class="col-sm-2 col-form-label"><roundcube:label name="calendar.priority" /></label>
<div class="col-sm-10">
<roundcube:object name="plugin.priority_select" id="edit-priority" class="form-control" />
</div>
</div>
<div class="form-group row">
<label for="edit-sensitivity" class="col-sm-2 col-form-label"><roundcube:label name="calendar.sensitivity" /></label>
<div class="col-sm-10">
<roundcube:object name="plugin.sensitivity_select" id="edit-sensitivity" class="form-control" />
</div>
</div>
<div class="form-group row">
<label for="edit-url" class="col-sm-2 col-form-label"><roundcube:label name="calendar.url" /></label>
<div class="col-sm-10">
<input type="text" class="form-control" name="vurl" id="edit-url" size="40" />
</div>
</div>
<div class="form-group row" id="edit-event-links">
<label class="col-sm-2 col-form-label"><roundcube:label name="calendar.links" /></label>
<div class="col-sm-10">
<div class="event-text"></div>
</div>
</div>
</fieldset>
<!-- recurrence settings -->
<fieldset id="event-panel-recurrence">
<legend><roundcube:label name="calendar.tabrecurrence" /></legend>
<div class="form-group row border-after">
<roundcube:object name="plugin.recurrence_form" part="frequency" />
</div>
<div class="recurrence-form border-after" id="recurrence-form-daily">
<roundcube:object name="plugin.recurrence_form" part="daily" class="form-group row" />
</div>
<div class="recurrence-form border-after" id="recurrence-form-weekly">
<roundcube:object name="plugin.recurrence_form" part="weekly" class="form-group row" />
</div>
<div class="recurrence-form border-after" id="recurrence-form-monthly">
<roundcube:object name="plugin.recurrence_form" part="monthly" class="form-group row" />
</div>
<div class="recurrence-form border-after" id="recurrence-form-yearly">
<roundcube:object name="plugin.recurrence_form" part="yearly" class="form-group row" />
</div>
<div class="recurrence-form" id="recurrence-form-until">
<roundcube:object name="plugin.recurrence_form" part="until" class="form-group row" />
</div>
<div class="recurrence-form" id="recurrence-form-rdate">
<roundcube:object name="plugin.recurrence_form" part="rdate" class="form-group row" />
</div>
</fieldset>
<!-- attendees list -->
<fieldset id="event-panel-attendees">
<legend><roundcube:label name="calendar.tabattendees" /></legend>
<h3 id="aria-label-attendeestable" class="voice"><roundcube:label name="calendar.arialabeleventattendees" /></h3>
<roundcube:object name="plugin.attendees_list" id="edit-attendees-table" class="edit-attendees-table no-img table table-sm"
coltitle="attendee" aria-labelledby="aria-label-attendeestable" />
<roundcube:object name="plugin.attendees_form" id="edit-attendees-form" />
<roundcube:include file="/templates/freebusylegend.html" />
</fieldset>
<!-- resources list -->
<fieldset id="event-panel-resources">
<legend><roundcube:label name="calendar.tabresources" /></legend>
<h3 id="aria-label-resourcestable" class="voice"><roundcube:label name="calendar.arialabeleventresources" /></h3>
<roundcube:object name="plugin.attendees_list" id="edit-resources-table" class="edit-attendees-table no-img table table-sm"
coltitle="resource" aria-labelledby="aria-label-resourcestable" />
<roundcube:object name="plugin.resources_form" id="edit-resources-form" />
<roundcube:include file="/templates/freebusylegend.html" />
</fieldset>
<!-- attachments list (with upload form) -->
<fieldset id="event-panel-attachments">
<legend><roundcube:label name="calendar.tabattachments" /></legend>
<div id="edit-attachments-droparea" class="file-upload">
<h3 id="aria-label-attachmentuploadform" class="voice"><roundcube:label name="arialabelattachmentuploadform" /></h3>
<div id="edit-attachments-form" class="upload-form" role="region" aria-labelledby="aria-label-attachmentuploadform">
<roundcube:object name="plugin.attachments_form" mode="hint" />
<button class="btn btn-secondary attach" href="#" onclick="rcmail.upload_input('event-attachment-form'); return false"><roundcube:label name="addattachment" /></button>
</div>
<div id="edit-attachments">
<roundcube:object name="plugin.attachments_list" id="attachmentlist" class="attachmentslist" />
</div>
</div>
<roundcube:object name="plugin.filedroparea" id="event-panel-attachments" />
</fieldset>
</form>
<roundcube:object name="plugin.edit_recurrence_sync" id="edit-recurrence-syncstart" class="dialog-message" style="display:none" />
<roundcube:object name="plugin.edit_attendees_notify" id="edit-attendees-notify" class="dialog-message" style="display:none" />
<roundcube:object name="plugin.edit_recurring_warning" class="dialog-message edit-recurring-warning" style="display:none" />
<roundcube:object name="plugin.attachments_form" id="event-attachment-form" mode="smart" />
<div id="edit-localchanges-warning" class="dialog-message" style="display:none"><roundcube:label name="calendar.localchangeswarning" /></div>
</div>

View file

@ -0,0 +1,9 @@
<div id="edit-attendees-legend" class="availability">
<span class="legend free"><roundcube:label name="calendar.availfree" /></span>
<span class="legend busy"><roundcube:label name="calendar.availbusy" /></span>
<span class="legend tentative"><roundcube:label name="calendar.availtentative" /></span>
<!--
<span class="legend out-of-office"><roundcube:label name="calendar.availoutofoffice" /></span>
-->
<span class="legend unknown"><roundcube:label name="calendar.availunknown" /></span>
</div>

View file

@ -0,0 +1,10 @@
<roundcube:include file="includes/layout.html" />
<roundcube:object name="plugin.event_inviteform" class="standalone-invitebox" />
<div class="calendar-invitebox invitebox boxinformation">
<roundcube:object name="plugin.event_invitebox" />
<roundcube:object name="plugin.event_rsvp_buttons" type="submit" iname="rsvp" id="event-rsvp" delegate="false" />
</div>
</form>
<roundcube:include file="includes/footer.html" />

View file

@ -0,0 +1,19 @@
<roundcube:include file="includes/layout.html" />
<div class="print-config">
<button class="btn btn-primary print" onclick="window.print()"><roundcube:label name='print' /></button>
<span class="prop">
<input type="checkbox" id="propdescription" checked="checked" class="pretty-checkbox" />
<label for="propdescription"><roundcube:label name="calendar.printdescriptions" /></label>
</span>
<div id="calendar-view-selector" class="btn-group btn-group-toggle" role="group"></div>
</div>
<div class="print-content">
<div id="calendar" data-view-selector="calendar-view-selector"></div>
</div>
<roundcube:object name="plugin.calendar_list" activeonly="true" id="calendarlist" class="hidden" />
<roundcube:object name="plugin.calendar_css" printmode="true" />
<roundcube:include file="includes/footer.html" />

View file

@ -196,7 +196,7 @@ pre {
height: 22px;
}
#calendars .treelist li span.calname {
#calendars .treelist li a.calname {
display: block;
padding: 0px 18px 2px 2px;
position: absolute;
@ -221,18 +221,18 @@ pre {
background-image: none;
}
#calendars .treelist li div.virtual > span.calname {
#calendars .treelist li div.virtual > a.calname {
color: #aaa;
top: 4px;
left: 20px;
}
#calendars .treelist li.x-birthdays span.calname,
#calendars .treelist li.x-invitations span.calname {
#calendars .treelist li.x-birthdays a.calname,
#calendars .treelist li.x-invitations a.calname {
font-style: italic;
}
#calendars .treelist.flat li span.calname {
#calendars .treelist.flat li a.calname {
left: 24px;
right: 42px;
}
@ -376,27 +376,27 @@ pre {
background-color: #c7e3ef;
}
#calendars .treelist li.selected > span.calname {
#calendars .treelist li.selected > a.calname {
font-weight: bold;
}
#calendars .treelist div.readonly span.calname {
#calendars .treelist div.readonly a.calname {
background-position: right -20px;
}
#calendars .treelist li.user > div > span.calname {
#calendars .treelist li.user > div > a.calname {
background-position: right -38px;
}
/*
#calendars .treelist div.user.readonly span.calname {
#calendars .treelist div.user.readonly a.calname {
background-position: right -56px;
}
#calendars .treelist div.shared span.calname {
#calendars .treelist div.shared a.calname {
background-position: right -74px;
}
#calendars .treelist div.shared.readonly span.calname {
#calendars .treelist div.shared.readonly a.calname {
background-position: right -92px;
}
*/
@ -608,7 +608,7 @@ a.miniColors-trigger {
line-height: 20px;
}
#edit-attachments ul li a.file {
#edit-attachments ul li a.filename {
padding: 0;
}
@ -742,52 +742,6 @@ a.miniColors-trigger {
margin: 0 -0.2em;
}
#event-status-badge {
width: 100px;
height: 100px;
position: absolute;
top: 0;
right: 0;
overflow: hidden;
}
#event-status-badge span {
display: none;
text-transform: uppercase;
width: 150px;
height: 20px;
line-height: 20px;
position: absolute;
left: -20px;
top: 35px;
padding-left: 10px;
text-align: center;
font-weight: bold;
font-size: 12px;
color: #fff;
box-shadow: 1px 1px 2px #ccc, -1px -1px 2px #ccc;
-webkit-transform: rotate(45deg);
-moz-transform: rotate(45deg);
-ms-transform: rotate(45deg);
-o-transform: rotate(45deg);
transform: rotate(45deg);
}
.eventdialog.status-cancelled #event-status-badge span {
background: url(images/badge.png) 26px -24px no-repeat #cc0000;
display: block;
}
.eventdialog.sensitivity-private #event-status-badge span {
background: url(images/badge.png) 40px -52px no-repeat #0066ff;
display: block;
}
.eventdialog.sensitivity-confidential #event-status-badge span {
background: url(images/badge.png) 20px 2px no-repeat #cc0000;
display: block;
}
.calendarmain .status-cancelled #event-title,
.calendarmain .sensitivity-private #event-title,
.calendarmain .sensitivity-confidential #event-title {
@ -933,6 +887,18 @@ a.miniColors-trigger {
visibility: visible;
}
body.eventdialog {
margin: 0;
overflow-y: auto;
}
body.eventdialog #eventedit {
display: block;
top: 0;
padding: 1em;
border-bottom: 0;
}
#eventedit {
position: relative;
top: -1.5em;
@ -965,6 +931,10 @@ div.form-section,
border-bottom: 2px solid #fafafa;
}
div.event-section > .col-form-label {
float: left;
}
.calendarmain .eventdialog label,
#eventedit label,
.form-section label {
@ -1025,7 +995,7 @@ td.topalign {
padding: 0 0.5em 0.5em 0.5em;
}
.event-dialog-message,
.dialog-message,
.event-update-confirm .message {
margin-top: 0.5em;
padding: 0.8em;
@ -1033,7 +1003,7 @@ td.topalign {
background-color: #fef893;
}
.event-dialog-message .message,
.dialog-message .message,
.event-update-confirm .message {
margin-bottom: 0.5em;
}
@ -1046,13 +1016,13 @@ td.topalign {
padding-left: 30px;
}
.event-dialog-message span.ui-icon,
.dialog-message span.ui-icon,
.event-update-confirm span.ui-icon {
float: left;
margin: 0 7px 20px 0;
}
.event-dialog-message label,
.dialog-message label,
.event-update-confirm label {
min-width: 3em;
padding-right: 1em;
@ -1421,6 +1391,7 @@ td.topalign {
#schedule-freebusy-times tr.times td {
cursor: pointer;
white-space: nowrap;
}
#schedule-freebusy-times #fbrowall td {
@ -1547,20 +1518,6 @@ a.dropdown-link:after {
padding-right: 0.5em;
}
#calendar-kolabform {
position: relative;
margin: 0 -8px;
min-width: 660px;
min-height: 400px;
}
#calendar-kolabform table td.title {
font-weight: bold;
white-space: nowrap;
color: #666;
padding-right: 10px;
}
#resource-selection {
position: absolute;
top: 0;
@ -2111,6 +2068,7 @@ div.fc-event-location {
.fc-listappend .formlinks a {
font-size: 12px;
padding: 0 0.3em;
max-width: initial;
}
.fc-event-temp {

View file

@ -1,25 +0,0 @@
/* CSS hacks for IE 7 */
#calendar {
top: 5em;
}
.calwidth {
width: 172mm;
}
.fc-header-title h2 {
font-size: 16px;
}
#calendarlist li {
float: none;
padding: 0;
margin-left: 1em;
}
@media print {
#calendar {
top: 0;
}
}

View file

@ -1,64 +0,0 @@
<roundcube:object name="doctype" value="html5" />
<html>
<head>
<title><roundcube:object name="pagetitle" /></title>
<roundcube:include file="/includes/links.html" />
</head>
<body class="extwin calendar attachmentwin">
<div id="header">
<div id="topline" role="banner" aria-labelledby="aria-label-topnav">
<div class="topleft">
<roundcube:container name="topline-left" id="topline-left" />
</div>
<roundcube:container name="topline-center" id="topline-center" />
<div class="topright">
<roundcube:container name="topline-right" id="topline-right" />
<roundcube:button name="close" type="link" label="close" class="closelink" onclick="self.close()" />
</div>
</div>
</div>
<div id="mainscreen">
<h1 class="voice"><roundcube:label name="attachment" />: <roundcube:var name="env:filename" /></h1>
<h2 id="aria-label-toolbar" class="voice"><roundcube:label name="arialabeltoolbar" /></h2>
<div id="attachmenttoolbar" class="toolbar fullwidth" role="toolbar" aria-labelledby="aria-label-toolbar">
<roundcube:button command="download-attachment" type="link" class="button download disabled" classAct="button download" classSel="button download pressed" label="download" title="download" />
<roundcube:button command="print-attachment" type="link" class="button print disabled" classAct="button print" classSel="button print pressed" label="print" title="print" />
<roundcube:container name="toolbar" id="messagetoolbar" />
</div>
<div id="mainscreencontent">
<div id="partheader" class="uibox listbox" role="contentinfo" aria-labelledby="aria-label-contentinfo">
<h2 class="boxtitle" id="aria-label-contentinfo"><roundcube:label name="properties" /></h2>
<div class="scroller">
<roundcube:object name="plugin.attachmentcontrols" class="listing" />
</div>
</div>
<div id="attachmentcontainer" class="uibox" role="main" aria-labelledby="aria-label-messagepart">
<h2 id="aria-label-messagepart" class="voice"><roundcube:label name="arialabelattachmentpreview" /></h2>
<div class="iframebox">
<roundcube:object name="plugin.attachmentframe" id="attachmentframe" frameborder="0" title="arialabelattachmentpreview" />
</div>
</div>
</div>
</div>
<script type="text/javascript">
$(document).ready(function() {
if (window.rcube_splitter) {
new rcube_splitter({ id:'mailpartsplitterv', p1:'#partheader', p2:'#attachmentcontainer',
orientation:'v', relative:true, start:226, min:150, size:12}).init();
}
});
</script>
</body>
</html>

View file

@ -57,7 +57,7 @@
<h2 id="aria-label-calendarview" class="voice"><roundcube:label name="calendar.arialabelcalendarview" /></h2>
<div id="calendar" role="main" aria-labelledby="aria-label-calendarview">
<roundcube:object name="plugin.angenda_options" class="boxfooter" id="agendaoptions" />
<roundcube:object name="plugin.agenda_options" class="boxfooter" id="agendaoptions" />
</div>
</div>
@ -158,7 +158,7 @@
<div class="event-text"></div>
</div>
<roundcube:object name="plugin.event_rsvp_buttons" id="event-rsvp" class="event-dialog-message" style="display:none" />
<roundcube:object name="plugin.event_rsvp_buttons" id="event-rsvp" class="dialog-message" style="display:none" />
</div>
<div id="eventoptionsmenu" class="popupmenu" aria-hidden="true">
@ -301,7 +301,7 @@
<div class="schedule-options">
&nbsp;
<div class="schedule-buttons">
<button id="shedule-freebusy-prev" title="<roundcube:label name='previouspage' />">&#9668;</button><button id="shedule-freebusy-next" title="<roundcube:label name='nextpage' />">&#9658;</button>
<button id="schedule-freebusy-prev" title="<roundcube:label name='previouspage' />">&#9668;</button><button id="schedule-freebusy-next" title="<roundcube:label name='nextpage' />">&#9658;</button>
</div>
</div>
@ -319,8 +319,8 @@
</div>
<div style="float:left">
<div class="schedule-find-buttons">
<button id="shedule-find-prev">&#9668; <roundcube:label name="calendar.prevslot" /></button>
<button id="shedule-find-next"><roundcube:label name="calendar.nextslot" /> &#9658;</button>
<button id="schedule-find-prev">&#9668; <roundcube:label name="calendar.prevslot" /></button>
<button id="schedule-find-next"><roundcube:label name="calendar.nextslot" /> &#9658;</button>
</div>
<div class="schedule-options">
<label><input type="checkbox" id="schedule-freebusy-workinghours" value="1" /><roundcube:label name="calendar.onlyworkinghours" /></label>

View file

@ -1,4 +1,4 @@
<div id="eventedit" class="uidialog uidialog-tabbed" aria-hidden="true">
<div id="eventedit" class="<roundcube:exp expression="env:framed ? '' : 'uidialog '">uidialog-tabbed" aria-hidden="true">
<form id="eventtabs" action="#" method="post" enctype="multipart/form-data">
<ul>
<li><a href="#event-panel-summary"><roundcube:label name="calendar.tabsummary" /></a></li><li id="edit-tab-recurrence"><a href="#event-panel-recurrence"><roundcube:label name="calendar.tabrecurrence" /></a></li><li id="edit-tab-attendees"><a href="#event-panel-attendees"><roundcube:label name="calendar.tabattendees" /></a></li><li id="edit-tab-resources"><a href="#event-panel-resources"><roundcube:label name="calendar.tabresources" /></a></li><li id="edit-tab-attachments"><a href="#event-panel-attachments"><roundcube:label name="calendar.tabattachments" /></a></li>
@ -119,16 +119,18 @@
<div id="edit-attachments">
<roundcube:object name="plugin.attachments_list" id="attachmentlist" class="attachmentslist" />
</div>
<div id="edit-attachments-form" role="region" aria-labelledby="aria-label-attachmentuploadform">
<div id="edit-attachments-form" role="region" aria-labelledby="aria-label-attachmentuploadform" style="text-align:center">
<h3 id="aria-label-attachmentuploadform" class="voice"><roundcube:label name="arialabelattachmentuploadform" /></h3>
<roundcube:object name="plugin.attachments_form" id="calendar-attachment-form" attachmentFieldSize="30" />
<roundcube:object name="plugin.attachments_form" id="calendar-attachment-form" mode="hint" />
<a class="button" tabindex="1" href="#" onclick="rcmail.upload_input('edit-attachment-form')"><roundcube:label name="addattachment" /></a>
</div>
<roundcube:object name="plugin.filedroparea" id="event-panel-attachments" />
</div>
</form>
<roundcube:object name="plugin.edit_recurrence_sync" id="edit-recurrence-syncstart" class="event-dialog-message" style="display:none" />
<roundcube:object name="plugin.edit_attendees_notify" id="edit-attendees-notify" class="event-dialog-message" style="display:none" />
<roundcube:object name="plugin.edit_recurring_warning" class="event-dialog-message edit-recurring-warning" style="display:none" />
<div id="edit-localchanges-warning" class="event-dialog-message" style="display:none"><roundcube:label name="calendar.localchangeswarning" /></div>
<roundcube:object name="plugin.edit_recurrence_sync" id="edit-recurrence-syncstart" class="dialog-message" style="display:none" />
<roundcube:object name="plugin.edit_attendees_notify" id="edit-attendees-notify" class="dialog-message" style="display:none" />
<roundcube:object name="plugin.edit_recurring_warning" class="dialog-message edit-recurring-warning" style="display:none" />
<roundcube:object name="plugin.attachments_form" id="edit-attachment-form" mode="smart" />
<div id="edit-localchanges-warning" class="dialog-message" style="display:none"><roundcube:label name="calendar.localchangeswarning" /></div>
</div>

View file

@ -1,26 +0,0 @@
<roundcube:object name="doctype" value="html5" />
<html>
<head>
<title><roundcube:object name="pagetitle" /></title>
<roundcube:include file="/includes/links.html" />
<style type="text/css" media="screen">
body.aclform {
background: #efefef;
margin: 0;
}
body.aclform .hint {
margin: 1em;
}
</style>
</head>
<body class="iframe aclform">
<roundcube:object name="folderacl" />
<roundcube:include file="/includes/footer.html" />
</body>
</html>

View file

@ -1,9 +0,0 @@
<div id="calendar-kolabform" class="propform tabbed">
<roundcube:object name="calendarform" />
</div>
<style type="text/css">
#calendarpropform { min-width:680px; margin-top:-12px; }
</style>
<script type="text/javascript">
UI.init_tabs('#calendar-kolabform');
</script>

View file

@ -24,6 +24,5 @@
<roundcube:object name="plugin.calendar_css" printmode="true" />
<!--[if lte IE 7]><link rel="stylesheet" type="text/css" href="plugins/calendar/skins/classic/print.iehacks.css" /><![endif]-->
</body>
</html>

View file

@ -51,10 +51,13 @@ window.rcmail && rcmail.addEventListener('init', function(evt) {
var rows = 0;
$.each(rcmail.env.kolab_2fa_factors, function(id, props) {
if (props.active) {
var tr = $('<tr>').addClass(props.method).appendTo(table);
var tr = $('<tr>').addClass(props.method).appendTo(table),
button = $('<a class="button icon delete">').attr({href: '#', rel: id})
.append($('<span class="inner">').text(rcmail.get_label('remove','kolab_2fa')));
$('<td>').addClass('name').text(props.label || props.name).appendTo(tr);
$('<td>').addClass('created').text(props.created || '??').appendTo(tr);
$('<td>').addClass('actions').html('<a class="button delete" rel="'+id+'">' + rcmail.get_label('remove','kolab_2fa') + '</a>').appendTo(tr);
$('<td>').addClass('actions buttons-cell').append(button).appendTo(tr);
rows++;
}
});
@ -80,13 +83,14 @@ window.rcmail && rcmail.addEventListener('init', function(evt) {
[
{
text: rcmail.gettext('save', 'kolab_2fa'),
'class': 'mainaction',
'class': 'mainaction save',
click: function(e) {
save_data(method);
}
},
{
text: rcmail.gettext('cancel'),
'class': 'cancel',
click: function() {
factor_dialog.dialog('close');
}
@ -106,7 +110,6 @@ window.rcmail && rcmail.addEventListener('init', function(evt) {
}
}
)
.addClass('propform')
.data('method', method)
.data('timestamp', time());
@ -224,10 +227,11 @@ window.rcmail && rcmail.addEventListener('init', function(evt) {
highsec_dialog.find('input[name="_code"]').select();
}
},
'class': 'mainaction'
'class': 'mainaction save'
},
{
text: rcmail.gettext('cancel'),
'class': 'cancel',
click: function() {
highsec_dialog.dialog('close');
}

View file

@ -3,8 +3,6 @@
/**
* Kolab 2-Factor-Authentication plugin
*
* ...
*
* @author Thomas Bruederli <bruederli@kolabsys.com>
*
* Copyright (C) 2015, Kolab Systems AG <contact@kolabsys.com>
@ -252,8 +250,14 @@ class kolab_2fa extends rcube_plugin
}
$field_id = "rcmlogin2fa$method";
$input_code = new html_inputfield(array('name' => "_${nonce}_${method}", 'class' => 'kolab2facode', 'id' => $field_id, 'required' => $required, 'autocomplete' => 'off')
+ $attrib);
$input_code = new html_inputfield(array(
'name' => "_${nonce}_${method}",
'class' => 'kolab2facode',
'id' => $field_id,
'required' => $required,
'autocomplete' => 'off',
'data-icon' => 'key' // for Elastic
) + $attrib);
$table->add('title', html::label($field_id, html::quote($this->gettext($method))));
$table->add('input', $input_code->show(''));
}
@ -266,9 +270,12 @@ class kolab_2fa extends rcube_plugin
// add submit button
if (rcube_utils::get_boolean($attrib['submit'])) {
$submit = new html_inputfield(array('type' => 'submit', 'id' => 'rcmloginsubmit',
'class' => 'button mainaction', 'value' => $this->gettext('continue')));
$out .= html::p('formbuttons', $submit->show());
$out .= html::p('formbuttons', html::tag('button', array(
'type' => 'submit',
'id' => 'rcmloginsubmit',
'class' => 'button mainaction save',
), $this->gettext('continue'))
);
}
// surround html output with a form tag
@ -377,7 +384,7 @@ class kolab_2fa extends rcube_plugin
// register as settings action
$args['actions'][] = array(
'action' => 'plugin.kolab-2fa',
'class' => '2factorauth',
'class' => 'twofactorauth',
'label' => 'settingslist',
'title' => 'settingstitle',
'domain' => 'kolab_2fa',
@ -415,7 +422,9 @@ class kolab_2fa extends rcube_plugin
{
$rcmail = rcmail::get_instance();
$select = new html_select(array('id' => 'kolab2fa-add'));
$attrib['id'] = 'kolab2fa-add';
$select = new html_select($attrib);
$select->add($this->gettext('addfactor') . '...', '');
foreach ((array)$rcmail->config->get('kolab_2fa_drivers', array()) as $method) {
$select->add($this->gettext($method), $method);
@ -515,7 +524,7 @@ class kolab_2fa extends rcube_plugin
}
$explain_label = $field . 'explain' . $method;
$explain_html = $rcmail->text_exists($explain_label, 'kolab_2fa') ? html::p('explain', $this->gettext($explain_label)) : '';
$explain_html = $rcmail->text_exists($explain_label, 'kolab_2fa') ? html::div('explain form-text', $this->gettext($explain_label)) : '';
$field_id = 'rcmk2fa' . $method . $field;
$table->add('title', html::label($field_id, $this->gettext($field)));
@ -526,12 +535,8 @@ class kolab_2fa extends rcube_plugin
if (method_exists($driver, 'get_provisioning_uri')) {
$table->add('title', $this->gettext('qrcode'));
$table->add(null,
html::p('explain',
$this->gettext("qrcodeexplain$method")
) .
html::p(null,
html::tag('img', array('src' => 'data:image/gif;base64,R0lGODlhDwAPAIAAAMDAwAAAACH5BAEAAAAALAAAAAAPAA8AQAINhI+py+0Po5y02otnAQA7', 'class' => 'qrcode', 'rel' => $method))
)
html::div('explain form-text', $this->gettext("qrcodeexplain$method"))
. html::tag('img', array('src' => 'data:image/gif;base64,R0lGODlhDwAPAIAAAMDAwAAAACH5BAEAAAAALAAAAAAPAA8AQAINhI+py+0Po5y02otnAQA7', 'class' => 'qrcode', 'rel' => $method))
);
// add row for testing the factor
@ -539,7 +544,7 @@ class kolab_2fa extends rcube_plugin
$table->add('title', html::label($field_id, $this->gettext('verifycode')));
$table->add(null,
html::tag('input', array('type' => 'text', 'name' => '_verify_code', 'id' => $field_id, 'class' => 'k2fa-verify', 'size' => 20, 'required' => true)) .
html::p('explain', $this->gettext("verifycodeexplain$method"))
html::div('explain form-text', $this->gettext("verifycodeexplain$method"))
);
}
@ -549,8 +554,9 @@ class kolab_2fa extends rcube_plugin
$out .= html::tag('form', array(
'method' => 'post',
'action' => '#',
'id' => 'kolab2fa-prop-' . $method,
'style' => 'display:none',
'id' => 'kolab2fa-prop-' . $method,
'style' => 'display:none',
'class' => 'propform',
),
html::tag('fieldset', array(),
html::tag('legend', array(), $this->gettext($method)) .
@ -562,9 +568,9 @@ class kolab_2fa extends rcube_plugin
return $out;
}
/**
* Render th
* Render the high-security-dialog content
*/
public function settings_highsecuritydialog($attrib = array())
{
@ -572,10 +578,11 @@ class kolab_2fa extends rcube_plugin
$field_id = 'rcmk2facode';
$input = new html_inputfield(array('name' => '_code', 'id' => $field_id, 'class' => 'verifycode', 'size' => 20));
$label = html::label(array('for' => $field_id, 'class' => 'col-form-label col-sm-4'), '$name');
return html::div($attrib,
html::p('explain', $this->gettext('highsecuritydialog')) .
html::div('propform', html::label($field_id, '$name') . $input->show(''))
html::div('explain form-text', $this->gettext('highsecuritydialog'))
. html::div('propform row form-group', $label . html::div('col-sm-8', $input->show('')))
);
}

View file

@ -0,0 +1,25 @@
<roundcube:include file="includes/layout.html" />
<roundcube:include file="includes/menu.html" />
<roundcube:include file="includes/settings-menu.html" />
<h1 class="voice"><roundcube:label name="kolab_2fa.settingstitle" /></h1>
<div class="content selected no-navbar" role="main">
<h2 id="aria-label-toolbar" class="voice"><roundcube:label name="arialabeltoolbar" /></h2>
<div class="header" role="toolbar" aria-labelledby="aria-label-toolbar">
<a class="button icon back-list-button" href="#back"><span class="inner"><roundcube:label name="back" /></span></a>
<span class="header-title"><roundcube:label name="kolab_2fa.settingstitle" /></span>
<div class="toolbar"></div>
</div>
<div class="scroller frame-content">
<p class="addfactor">
<roundcube:object name="plugin.factoradder" class="form-control" />
</p>
<roundcube:object name="plugin.settingslist" class="authentication-factors" />
</div>
</div>
<roundcube:object name="plugin.settingsform" class="propform" />
<roundcube:object name="plugin.highsecuritydialog" class="kolab2fa-highsecuritydialog hidden" />
<roundcube:include file="includes/footer.html" />

View file

@ -56,7 +56,7 @@ function kolab_activesync_config()
});
var fn = function(elem) {
var classname = elem.className,
var classname = elem.className.split(' ')[0],
list = $(elem).closest('table').find('input.' + classname),
check = list.not(':checked').length > 0;

View file

@ -109,7 +109,7 @@ class kolab_activesync extends rcube_plugin
if ($content = $this->ui->folder_options_table($mbox_imap, $devices, $type)) {
$args['form']['activesync'] = array(
'name' => rcube::Q($this->gettext('tabtitle')),
'name' => $this->gettext('tabtitle'),
'content' => $content,
);
}

View file

@ -52,7 +52,8 @@ class kolab_activesync_ui
foreach ($devices as $id => $device) {
$name = $device['ALIAS'] ? $device['ALIAS'] : $id;
$table->add_row(array('id' => 'rcmrow' . $id));
$table->add(null, html::span('devicealias', rcube::Q($name)) . html::span('devicetype', rcube::Q($device['TYPE'])));
$table->add(null, html::span('devicealias', rcube::Q($name))
. ' ' . html::span('devicetype secondary', rcube::Q($device['TYPE'])));
}
$this->rc->output->add_gui_object('devicelist', $attrib['id']);
@ -79,7 +80,7 @@ class kolab_activesync_ui
if (!empty($info)) {
foreach ($info as $key => $value) {
if ($value) {
$table->add('title', rcube::Q($this->plugin->gettext($key)));
$table->add('title', html::label(null, rcube::Q($this->plugin->gettext($key))));
$table->add(null, rcube::Q($value));
}
}
@ -95,12 +96,14 @@ class kolab_activesync_ui
public function folder_subscriptions($attrib = array())
{
if (!$attrib['id'])
if (!$attrib['id']) {
$attrib['id'] = 'foldersubscriptions';
}
// group folders by type (show only known types)
$folder_groups = array('mail' => array(), 'contact' => array(), 'event' => array(), 'task' => array(), 'note' => array());
$folder_types = kolab_storage::folders_typedata();
$use_fieldsets = rcube_utils::get_boolean($attrib['use-fieldsets']);
$imei = $this->device['_id'];
$subscribed = array();
@ -132,10 +135,17 @@ class kolab_activesync_ui
if (empty($group)) {
continue;
}
$attrib['type'] = $type;
$html .= html::div('subscriptionblock',
html::tag('h3', $type, $this->plugin->gettext($type)) .
$this->folder_subscriptions_block($group, $attrib, $subscribed));
$table = $this->folder_subscriptions_block($group, $attrib, $subscribed);
$label = $this->plugin->gettext($type);
if ($use_fieldsets) {
$html .= html::tag('fieldset', 'subscriptionblock', html::tag('legend', $type, $label) . $table);
}
else {
$html .= html::div('subscriptionblock', html::tag('h3', $type, $label) . $table);
}
}
$this->rc->output->add_gui_object('subscriptionslist', $attrib['id']);
@ -148,14 +158,26 @@ class kolab_activesync_ui
$alarms = ($attrib['type'] == 'event' || $attrib['type'] == 'task');
$table = new html_table(array('cellspacing' => 0));
$table->add_header(array('class' => 'subscription', 'title' => $this->plugin->gettext('synchronize'), 'tabindex' => 0),
$table->add_header(array(
'class' => 'subscription checkbox-cell',
'title' => $this->plugin->gettext('synchronize'),
'tabindex' => 0
),
$attrib['syncicon'] ? html::img(array('src' => $this->skin_path . $attrib['syncicon'])) :
$this->plugin->gettext('synchronize'));
$this->plugin->gettext('synchronize')
);
if ($alarms) {
$table->add_header(array('class' => 'alarm', 'title' => $this->plugin->gettext('withalarms'), 'tabindex' => 0),
$table->add_header(array(
'class' => 'alarm checkbox-cell',
'title' => $this->plugin->gettext('withalarms'),
'tabindex' => 0
),
$attrib['alarmicon'] ? html::img(array('src' => $this->skin_path . $attrib['alarmicon'])) :
$this->plugin->gettext('withalarms'));
$this->plugin->gettext('withalarms')
);
}
$table->add_header('foldername', $this->plugin->gettext('folder'));
$checkbox_sync = new html_checkbox(array('name' => 'subscribed[]', 'class' => 'subscription'));
@ -186,12 +208,12 @@ class kolab_activesync_ui
}
$table->add_row();
$table->add('subscription', $checkbox_sync->show(
$table->add('subscription checkbox-cell', $checkbox_sync->show(
!empty($subscribed[$folder]) ? $folder : null,
array('value' => $folder, 'id' => $folder_id)));
if ($alarms) {
$table->add('alarm', $checkbox_alarm->show(
$table->add('alarm checkbox-cell', $checkbox_alarm->show(
intval($subscribed[$folder]) > 1 ? $folder : null,
array('value' => $folder, 'id' => $folder_id.'_alarm')));
}
@ -236,13 +258,13 @@ class kolab_activesync_ui
$table->add_row();
$table->add(array('class' => 'device', 'title' => $title), $name);
$table->add('subscription', $checkbox->show(!empty($folder_data[$id]['S']) ? 1 : 0));
$table->add('subscription checkbox-cell', $checkbox->show(!empty($folder_data[$id]['S']) ? 1 : 0));
if ($alarms) {
$checkbox_alarm = new html_checkbox(array('name' => "_alarms[$id]", 'value' => 1,
'onchange' => 'return activesync_object.update_sync_data(this)'));
$table->add('alarm', $checkbox_alarm->show($folder_data[$id]['S'] > 1 ? 1 : 0));
$table->add('alarm checkbox-cell', $checkbox_alarm->show($folder_data[$id]['S'] > 1 ? 1 : 0));
}
}

View file

@ -10,7 +10,7 @@ $labels['syncsettings'] = 'Synchronization settings';
$labels['deviceconfig'] = 'Device configuration';
$labels['folderstosync'] = 'Folders to synchronize';
$labels['mail'] = 'Email';
$labels['contact'] = 'Address Books';
$labels['contact'] = 'Contacts';
$labels['event'] = 'Calendars';
$labels['task'] = 'Tasks';
$labels['note'] = 'Notes';

Binary file not shown.

Before

Width:  |  Height:  |  Size: 841 B

View file

@ -1,124 +0,0 @@
/* Stylesheets for the Kolab ActiveSync configuration UI */
#devices-table {
width: 100%;
table-layout: fixed;
cursor: default;
}
#devices-table td span.devicetype {
padding-left: 1em;
font-style: italic;
color: #666;
}
#devices-table tr.selected td span.devicetype {
color: #ccc;
}
.boxfooter a.button.delete,
.boxfooter a.buttonPas.delete {
background-image: url(deviceactions.png);
}
div.subscriptionblock {
float: left;
margin: 0.5em 3em 2em 0;
padding: 0;
border: 1px solid #ddd;
}
div.subscriptionblock h3 {
font-size: 12px;
color: #333;
margin: 0 0 0.4em 0;
padding: 4px 4px 0 30px;
background: url(foldertypes.png) 5px 4px no-repeat #eee;
}
div.subscriptionblock h3.contact {
background-position: 5px -16px;
}
div.subscriptionblock h3.event {
background-position: 5px -36px;
}
div.subscriptionblock h3.task {
background-position: 5px -56px;
}
div.subscriptionblock h3.note {
background-position: 5px -76px;
}
#foldersubscriptions thead th {
color: #999;
font-weight: bold;
padding: 2px;
text-align: center;
}
#foldersubscriptions thead tr th {
border-top: 1px solid #ddd;
}
#foldersubscriptions thead th {
cursor: pointer;
}
#foldersubscriptions thead th.foldername {
text-align: left;
}
#foldersubscriptions tbody td {
padding: 1px 2px;
border-top: 1px solid #ddd;
background-color: white;
}
#foldersubscriptions td label {
display: block;
}
#foldersubscriptions td.mailbox {
min-width: 12em;
padding-right: 10px;
}
#foldersubscriptions td.virtual {
color: #999;
}
#foldersubscriptions {
overflow: auto;
margin-top: 0.5em;
}
#introtext {
position: absolute;
top: 12px;
left: 5px;
padding-left: 10px;
max-width: 40em;
}
#introtext .pointer-left {
position: absolute;
top: 0;
left: 0;
width: 14px;
height: 100%;
background: url(pointer-left.gif) right center no-repeat;
}
#introtext .inner {
border: 3px solid #e7e7e7;
background: #fff;
}
#introtext .bordered {
padding: 12px;
border: 1px solid #ccc;
background: #fff;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 173 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 836 B

View file

@ -1,39 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><roundcube:object name="pagetitle" /></title>
<roundcube:include file="/includes/links.html" />
<script type="text/javascript" src="/functions.js"></script>
<script type="text/javascript" src="/splitter.js"></script>
</head>
<body>
<roundcube:include file="/includes/taskbar.html" />
<roundcube:include file="/includes/header.html" />
<roundcube:include file="/includes/settingstabs.html" />
<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>
<script type="text/javascript">
var viewsplit = new rcube_splitter({ id:'devicelistsplitter', p1: 'sectionslist', p2: 'prefs-box', orientation: 'v', relative: true, start: 195 });
rcmail.add_onload('viewsplit.init()');
</script>
<div id="prefs-box">
<roundcube:frame contentframe="activesync-frame" id="activesync-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
</div>
</div>
</body>
</html>

View file

@ -1,30 +0,0 @@
<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

@ -1,19 +0,0 @@
<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:object name="initmessage" />
</div>
<div class="pointer-left"></div>
</div>
</div>
</body>
</html>

View file

@ -0,0 +1,41 @@
<roundcube:include file="includes/layout.html" />
<roundcube:include file="includes/menu.html" />
<roundcube:include file="includes/settings-menu.html" />
<h1 class="voice"><roundcube:label name="kolab_activesync.tabtitle" /></h1>
<!-- devices list -->
<div class="list listbox selected" aria-labelledby="aria-label-deviceslist">
<div class="header">
<a class="button icon back-sidebar-button" href="#sidebar"><span class="inner"><roundcube:label name="settings" /></span></a>
<span id="aria-label-deviceslist" class="header-title"><roundcube:label name="kolab_activesync.devices" /></span>
<a class="button icon toolbar-menu-button" href="#list-menu"><span class="inner"><roundcube:label name="menu" /></span></a>
</div>
<div class="scroller">
<roundcube:object name="plugin.devicelist" id="devices-table" class="listing"
data-label-msg="listempty" role="listbox" />
</div>
<!--
<div class="footer"></div>
-->
</div>
<!-- device info frame -->
<div class="content" role="main">
<h2 id="aria-label-toolbar" class="voice"><roundcube:label name="arialabeltoolbar" /></h2>
<div class="header" role="toolbar" aria-labelledby="aria-label-toolbar">
<a class="button icon back-list-button" href="#back"><span class="inner"><roundcube:label name="back" /></span></a>
<span class="header-title"></span>
<!-- toolbar -->
<div class="toolbar">
<roundcube:button command="plugin.delete-device" type="link"
class="button delete disabled" classAct="button delete"
label="delete" title="kolab_activesync.deletedevice" innerclass="inner" />
</div>
</div>
<div class="iframe-wrapper">
<roundcube:frame contentframe="activesync-frame" id="activesync-frame" src="/watermark.html" title="arialabeldeviceframe" />
</div>
</div>
<roundcube:include file="includes/footer.html" />

View file

@ -0,0 +1,23 @@
<roundcube:include file="includes/layout.html" />
<h1 class="voice"><roundcube:label name="kolab_activesync.syncsettings" /></h1>
<div class="formcontent">
<form action="#" method="post" id="configform" class="propform">
<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" use-fieldsets="true" class="tabbed" />
</fieldset>
</form>
</div>
<div class="formbuttons">
<roundcube:button command="plugin.save-config" class="btn btn-primary submit" label="save" />
</div>
<roundcube:include file="includes/footer.html" />

View file

@ -0,0 +1,11 @@
<roundcube:include file="includes/layout.html" />
<h1 class="voice"><roundcube:label name="kolab_activesync.syncsettings" /></h1>
<div class="formcontent">
<div class="boxinformation">
<roundcube:object name="initmessage" />
</div>
</div>
<roundcube:include file="includes/footer.html" />

View file

@ -29,55 +29,12 @@
if (window.rcmail) {
rcmail.addEventListener('init', function() {
rcmail.set_book_actions();
if (rcmail.gui_objects.editform && rcmail.env.action.match(/^plugin\.book/)) {
rcmail.enable_command('book-save', true);
}
// contextmenu
kolab_addressbook_contextmenu();
// append search form for address books
if (rcmail.gui_objects.folderlist) {
var container = $(rcmail.gui_objects.folderlist);
$('<div class="listsearchbox" style="display:none">' +
'<div class="searchbox" role="search" aria-labelledby="aria-labelfoldersearchform" aria-controls="' + rcmail.gui_objects.folderlist.id + '">' +
'<h3 id="aria-label-labelfoldersearchform" class="voice">' + rcmail.gettext('foldersearchform', 'kolab_addressbook') + '" /></h3>' +
'<label for="addressbooksearch" class="voice">' + rcmail.gettext('searchterms', 'kolab_addressbook') + '</label>' +
'<input type="text" name="q" id="addressbooksearch" placeholder="' + rcmail.gettext('findaddressbooks', 'kolab_addressbook') + '" />' +
'<a class="iconbutton searchicon"></a>' +
'<a href="#reset" onclick="return rcmail.command(\'reset-listsearch\',null,this,event)" id="directorylistsearch-reset" class="iconbutton reset" title="' + rcmail.gettext('resetsearch') + '">' +
rcmail.gettext('resetsearch') + '</a>' +
'</div>' +
'</div>')
.insertBefore(container.parent());
$('<a href="#search" class="iconbutton search" title="' + rcmail.gettext('findaddressbooks', 'kolab_addressbook') + '" tabindex="0">' +
rcmail.gettext('findaddressbooks', 'kolab_addressbook') + '</a>')
.appendTo('#directorylistbox h2.boxtitle')
.click(function(e){
var title = $('#directorylistbox .boxtitle'),
box = $('#directorylistbox .listsearchbox'),
dir = box.is(':visible') ? -1 : 1;
box.slideToggle({
duration: 160,
progress: function(animation, progress) {
if (dir < 0) progress = 1 - progress;
$('#directorylistbox .scroller').css('top', (title.outerHeight() + 34 * progress) + 'px');
},
complete: function() {
box.toggleClass('expanded');
if (box.is(':visible')) {
box.find('input[type=text]').focus();
}
else {
$('#directorylistsearch-reset').click();
}
}
});
});
// remove event handlers set by the regular treelist widget
rcmail.treelist.container.off('click mousedown focusin focusout');
@ -123,13 +80,14 @@ if (window.rcmail) {
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'), 'info');
rcmail.display_message(rcmail.gettext('noaddressbooksfound','kolab_addressbook'), 'notice');
});
}
// append button to show contact audit trail
if (rcmail.env.action == 'show' && rcmail.env.kolab_audit_trail && rcmail.env.cid) {
$('<a href="#history" class="btn-contact-history active" role="button" tabindex="0">' + rcmail.get_label('kolab_addressbook.showhistory') + '</a>')
$('<a>').attr({href: '#history', 'class': 'btn btn-secondary history contact-history', role: 'button', tabindex: 0})
.append($('<span class="inner">').text(rcmail.get_label('kolab_addressbook.showhistory')))
.click(function(e) {
var rc = rcmail.is_framed() && parent.rcmail.contact_history_dialog ? parent.rcmail : rcmail;
rc.contact_history_dialog();
@ -181,12 +139,48 @@ rcube_webmail.prototype.set_book_actions = function()
rcube_webmail.prototype.book_create = function()
{
this.book_show_contentframe('create');
this.book_dialog('create');
};
rcube_webmail.prototype.book_edit = function()
{
this.book_show_contentframe('edit');
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, _source: this.book_realname(), _framed: 1},
dialog = $('<iframe>').attr('src', rcmail.url('plugin.book', params)),
save_func = function() {
var data,
form = dialog.contents().find('form'),
input = form.find("input[name='_name']");
// form is not loaded
if (!form || !form.length)
return false;
if (input.length && input.val() == '') {
rcmail.alert_dialog(rcmail.get_label('kolab_addressbook.nobooknamewarning'), function() {
input.focus();
});
return;
}
// post data to server
data = form.serializeJSON();
rcmail.http_post('plugin.book-save', data, rcmail.set_busy(true, 'kolab_addressbook.booksaving'));
return true;
};
rcmail.simple_dialog(dialog, title, save_func, {
width: 600,
height: 400
});
};
rcube_webmail.prototype.book_remove = function(id)
@ -200,9 +194,11 @@ rcube_webmail.prototype.book_remove = function(id)
rcube_webmail.prototype.book_delete = function()
{
if (this.env.source != '' && confirm(this.get_label('kolab_addressbook.bookdeleteconfirm'))) {
var lock = this.set_busy(true, 'kolab_addressbook.bookdeleting');
this.http_request('plugin.book', '_act=delete&_source='+urlencode(this.book_realname()), lock);
if (this.env.source != '') {
this.confirm_dialog(this.get_label('kolab_addressbook.bookdeleteconfirm'), 'delete', function() {
var lock = rcmail.set_busy(true, 'kolab_addressbook.bookdeleting');
rcmail.http_request('plugin.book', '_act=delete&_source='+urlencode(rcmail.book_realname()), lock);
});
}
};
@ -218,71 +214,16 @@ rcube_webmail.prototype.book_showurl = function()
}
if (url) {
$('div.showurldialog:ui-dialog').dialog('close');
var txt = rcmail.gettext('carddavurldescription', 'kolab_addressbook'),
$dialog = $('<div>').addClass('showurldialog').append('<p>' + txt + '</p>'),
textbox = $('<textarea>').addClass('urlbox').css('width', '100%').attr('rows', 2).appendTo($dialog);
dialog = $('<div>').addClass('showurldialog').append('<p>' + txt + '</p>'),
textbox = $('<textarea>').addClass('urlbox').css('width', '100%').attr('rows', 3).appendTo(dialog);
$dialog.dialog({
resizable: true,
closeOnEscape: true,
title: rcmail.gettext('bookshowurl', 'kolab_addressbook'),
close: function() {
$dialog.dialog("destroy").remove();
},
width: 520
}).show();
this.simple_dialog(dialog, rcmail.gettext('bookshowurl', 'kolab_addressbook'), null, {width: 520});
textbox.val(url).select();
}
};
// displays page with book edit/create form
rcube_webmail.prototype.book_show_contentframe = function(action, framed)
{
var add_url = '', target = window;
// unselect contact
this.contact_list.clear_selection();
this.enable_command('edit', 'delete', 'compose', false);
if (this.env.contentframe && window.frames && window.frames[this.env.contentframe]) {
add_url = '&_framed=1';
target = window.frames[this.env.contentframe];
this.show_contentframe(true);
}
else if (framed)
return false;
if (action) {
this.lock_frame();
this.location_href(this.env.comm_path+'&_action=plugin.book&_act='+action
+'&_source='+urlencode(this.book_realname())
+add_url, target);
}
return true;
};
// submits book create/update form
rcube_webmail.prototype.book_save = function()
{
var form = this.gui_objects.editform,
input = $("input[name='_name']", form)
if (input.length && input.val() == '') {
alert(this.get_label('kolab_addressbook.nobooknamewarning'));
input.focus();
return;
}
input = this.display_message(this.get_label('kolab_addressbook.booksaving'), 'loading');
$('<input type="hidden" name="_unlock" />').val(input).appendTo(form);
form.submit();
};
// action executed after book delete
rcube_webmail.prototype.book_delete_done = function(id, recur)
{
@ -332,8 +273,6 @@ rcube_webmail.prototype.book_update = function(data, old)
})
);
this.show_contentframe(false);
// set row attributes
if (data.readonly)
classes.push('readonly');
@ -597,9 +536,29 @@ function kolab_addressbook_contextmenu()
rcmail.addEventListener('contextmenu_init', function(menu) {
if (menu.menu_name == 'abooklist') {
menu.addEventListener('activate', function(p) {
// deactivate kolab addressbook actions
if (p.command.match(/^book-/)) {
return p.command == 'book-create';
var source = !rcmail.env.group ? rcmail.env.source : null,
sources = rcmail.env.address_sources,
props = source && sources[source] && sources[source].kolab ?
sources[source] : { readonly: true, removable: false, rights: '' };
if (p.command == 'book-create') {
return true;
}
if (p.command == 'book-edit') {
return props.rights.indexOf('a') >= 0;
}
if (p.command == 'book-delete') {
return props.rights.indexOf('a') >= 0 || props.rights.indexOf('x') >= 0;
}
if (p.command == 'book-remove') {
return props.removable;
}
if (p.command == 'book-showurl') {
return !!(props.carddavurl);
}
});
}
@ -620,78 +579,4 @@ function kolab_addressbook_contextmenu()
}
});
}
rcmail.env.kolab_addressbook_contextmenu = true;
// add menu on kolab addressbooks
var menu = rcm_callbackmenu_init({
menu_name: 'kolab_abooklist',
mouseover_timeout: -1, // no submenus here
menu_source: ['#directorylist-footer', '#groupoptionsmenu']
}, {
'activate': function(p) {
var source = !rcmail.env.group ? rcmail.env.source : null,
sources = rcmail.env.address_sources,
props = source && sources[source] && sources[source].kolab ?
sources[source] : { readonly: true, removable: false, rights: '' };
if (p.command == 'book-create') {
return true;
}
if (p.command == 'book-edit') {
return props.rights.indexOf('a') >= 0;
}
if (p.command == 'book-delete') {
return props.rights.indexOf('a') >= 0 || props.rights.indexOf('x') >= 0;
}
if (p.command == 'group-create') {
return !props.readonly;
}
if (p.command == 'book-remove') {
return props.removable;
}
if (p.command == 'book-showurl') {
return !!(props.carddavurl);
}
if (p.command == 'group-rename' || p.command == 'group-delete') {
return !!(rcmail.env.group && sources[rcmail.env.source] && !sources[rcmail.env.source].readonly);
}
return false;
},
'beforeactivate': function(p) {
// remove dummy items
$('li.submenu', p.ref.container).remove();
rcmail.env.kolab_old_source = rcmail.env.source;
rcmail.env.kolab_old_group = rcmail.env.group;
var elem = $(p.source), onclick = elem.attr('onclick');
if (onclick && onclick.match(rcmail.context_menu_command_pattern)) {
rcmail.env.source = RegExp.$2;
rcmail.env.group = null;
}
else if (elem.parent().hasClass('contactgroup')) {
var grp = String(elem.attr('rel')).split(':');
rcmail.env.source = grp[0];
rcmail.env.group = grp[1];
}
},
'aftercommand': function(p) {
rcmail.env.source = rcmail.env.kolab_old_source;
rcmail.env.group = rcmail.env.kolab_old_group;
}
}
);
$('#directorylist').off('contextmenu').on('contextmenu', 'div > a, li.contactgroup > a', function(e) {
$(this).blur();
rcm_show_menu(e, this, $(this).attr('rel'), menu);
});
};

View file

@ -934,15 +934,16 @@ class kolab_addressbook extends rcube_plugin
$this->rc->output->show_message('kolab_addressbook.book'.$type.'d', 'confirmation');
$this->rc->output->command('book_update', $props, kolab_storage::folder_id($prop['oldname'], true));
$this->rc->output->send('iframe');
}
else {
if (!$error) {
$error = $plugin['message'] ? $plugin['message'] : 'kolab_addressbook.book'.$type.'error';
}
$this->rc->output->show_message($error, 'error');
}
if (!$error)
$error = $plugin['message'] ? $plugin['message'] : 'kolab_addressbook.book'.$type.'error';
$this->rc->output->show_message($error, 'error');
// display the form again
$this->ui->book_edit();
$this->rc->output->send('iframe');
}
/**
@ -1027,7 +1028,7 @@ class kolab_addressbook extends rcube_plugin
// report more results available
if ($search_more_results) {
$this->rc->output->show_message('autocompletemore', 'info');
$this->rc->output->show_message('autocompletemore', 'notice');
}
$this->rc->output->command('multi_thread_http_response', $results, rcube_utils::get_input_value('_reqid', rcube_utils::INPUT_GPC));

View file

@ -59,6 +59,8 @@ class kolab_addressbook_ui
$this->plugin->api->include_script('libkolab/js/folderlist.js');
}
$this->rc->output->add_footer($this->rc->output->parse('kolab_addressbook.search_addon', false, false));
// Add actions on address books
$options = array('book-create', 'book-edit', 'book-delete', 'book-remove');
$idx = 0;
@ -85,7 +87,8 @@ class kolab_addressbook_ui
$this->plugin->api->output->button(array(
'label' => 'kolab_addressbook.'.str_replace('-', '', $command),
'domain' => $this->ID,
'classact' => 'active',
'class' => str_replace('-', ' ', $command) . ' disabled',
'classact' => str_replace('-', ' ', $command) . ' active',
'command' => $command,
'type' => 'link'
)));
@ -98,7 +101,8 @@ class kolab_addressbook_ui
$this->plugin->api->output->button(array(
'label' => 'managefolders',
'type' => 'link',
'classact' => 'active',
'class' => 'folders disabled',
'classact' => 'folders active',
'command' => 'folders',
'task' => 'settings',
)));
@ -117,12 +121,16 @@ class kolab_addressbook_ui
'kolab_addressbook.nraddressbooksfound',
'kolab_addressbook.noaddressbooksfound',
'kolab_addressbook.foldersubscribe',
'resetsearch');
'kolab_addressbook.bookedit',
'kolab_addressbook.bookcreate',
'kolab_addressbook.nobooknamewarning',
'kolab_addressbook.booksaving',
'resetsearch'
);
if ($this->plugin->bonnie_api) {
$this->rc->output->set_env('kolab_audit_trail', true);
$this->plugin->api->include_script('libkolab/js/audittrail.js');
$this->plugin->api->include_script('libkolab/libkolab.js');
$this->rc->output->add_label(
'kolab_addressbook.showhistory',
@ -139,27 +147,21 @@ class kolab_addressbook_ui
}
// include stylesheet for audit trail
else if ($this->rc->action == 'show' && $this->plugin->bonnie_api) {
$this->plugin->include_stylesheet($this->plugin->local_skin_path().'/kolab_addressbook.css');
$this->plugin->include_stylesheet($this->plugin->local_skin_path().'/kolab_addressbook.css', true);
$this->rc->output->add_label('kolab_addressbook.showhistory');
}
// book create/edit form
else {
$this->rc->output->add_label('kolab_addressbook.nobooknamewarning',
'kolab_addressbook.booksaving');
}
}
/**
* Handler for address book create/edit action
*/
public function book_edit()
{
$this->rc->output->add_handler('bookdetails', array($this, 'book_form'));
$this->rc->output->send('kolab_addressbook.bookedit');
$this->rc->output->set_env('pagetitle', $this->plugin->gettext('bookproperties'));
$this->rc->output->add_handler('folderform', array($this, 'book_form'));
$this->rc->output->send('libkolab.folderform');
}
/**
* Handler for 'bookdetails' object returning form content for book create/edit
*
@ -178,17 +180,7 @@ class kolab_addressbook_ui
$storage = $this->rc->get_storage();
$delim = $storage->get_hierarchy_delimiter();
if ($this->rc->action == 'plugin.book-save') {
// save error
$name = trim(rcube_utils::get_input_value('_name', rcube_utils::INPUT_GPC, true)); // UTF8
$old = trim(rcube_utils::get_input_value('_oldname', rcube_utils::INPUT_GPC, true)); // UTF7-IMAP
$path_imap = trim(rcube_utils::get_input_value('_parent', rcube_utils::INPUT_GPC, true)); // UTF7-IMAP
$hidden_fields[] = array('name' => '_oldname', 'value' => $old);
$folder = $old;
}
else if ($action == 'edit') {
if ($action == 'edit') {
$path_imap = explode($delim, $folder);
$name = rcube_charset::convert(array_pop($path_imap), 'UTF7-IMAP');
$path_imap = implode($path_imap, $delim);
@ -206,11 +198,12 @@ class kolab_addressbook_ui
$options = $storage->folder_info($folder);
}
$form = array();
$form = array();
// General tab
$form['props'] = array(
'name' => $this->rc->gettext('properties'),
$form['properties'] = array(
'name' => $this->rc->gettext('properties'),
'fields' => array(),
);
if (!empty($options) && ($options['norename'] || $options['protected'])) {
@ -221,14 +214,10 @@ class kolab_addressbook_ui
$foldername = $foldername->show($name);
}
$form['props']['fieldsets']['location'] = array(
'name' => $this->rc->gettext('location'),
'content' => array(
'name' => array(
'label' => $this->plugin->gettext('bookname'),
'value' => $foldername,
),
),
$form['properties']['fields']['name'] = array(
'label' => $this->plugin->gettext('bookname'),
'value' => $foldername,
'id' => '_name',
);
if (!empty($options) && ($options['norename'] || $options['protected'])) {
@ -236,51 +225,19 @@ class kolab_addressbook_ui
$hidden_fields[] = array('name' => '_parent', 'value' => $path_imap);
}
else {
$select = kolab_storage::folder_selector('contact', array('name' => '_parent'), $folder);
$prop = array('name' => '_parent', 'id' => '_parent');
$select = kolab_storage::folder_selector('contact', $prop, $folder);
$form['props']['fieldsets']['location']['content']['path'] = array(
$form['properties']['fields']['parent'] = array(
'label' => $this->plugin->gettext('parentbook'),
'value' => $select->show(strlen($folder) ? $path_imap : ''),
'id' => '_parent',
);
}
// Allow plugins to modify address book form content (e.g. with ACL form)
$plugin = $this->rc->plugins->exec_hook('addressbook_form',
array('form' => $form, 'options' => $options, 'name' => $folder));
$form_html = kolab_utils::folder_form($form, $folder, 'calendar', $hidden_fields);
$form = $plugin['form'];
// Set form tags and hidden fields
list($form_start, $form_end) = $this->get_form_tags($attrib, 'plugin.book-save', null, $hidden_fields);
unset($attrib['form']);
// return the complete edit form as table
$out = "$form_start\n";
// Create form output
foreach ($form as $tab) {
if (!empty($tab['fieldsets']) && is_array($tab['fieldsets'])) {
$content = '';
foreach ($tab['fieldsets'] as $fieldset) {
$subcontent = $this->get_form_part($fieldset);
if ($subcontent) {
$content .= html::tag('fieldset', null, html::tag('legend', null, rcube::Q($fieldset['name'])) . $subcontent) ."\n";
}
}
}
else {
$content = $this->get_form_part($tab);
}
if ($content) {
$out .= html::tag('fieldset', null, html::tag('legend', null, rcube::Q($tab['name'])) . $content) ."\n";
}
}
$out .= "\n$form_end";
return $out;
return html::tag('form', $attrib + array('action' => 'plugin.book-save', 'method' => 'post', 'id' => 'bookpropform'), $form_html);
}
/**
@ -296,58 +253,4 @@ class kolab_addressbook_ui
return $p;
}
private function get_form_part($form)
{
$content = '';
if (is_array($form['content']) && !empty($form['content'])) {
$table = new html_table(array('cols' => 2, 'class' => 'propform'));
foreach ($form['content'] as $col => $colprop) {
$colprop['id'] = '_'.$col;
$label = !empty($colprop['label']) ? $colprop['label'] : $this->rc->gettext($col);
$table->add('title', sprintf('<label for="%s">%s</label>', $colprop['id'], rcube::Q($label)));
$table->add(null, $colprop['value']);
}
$content = $table->show();
}
else {
$content = $form['content'];
}
return $content;
}
private function get_form_tags($attrib, $action, $id = null, $hidden = null)
{
$form_start = $form_end = '';
$request_key = $action . (isset($id) ? '.'.$id : '');
$form_start = $this->rc->output->request_form(array(
'name' => 'form',
'method' => 'post',
'task' => $this->rc->task,
'action' => $action,
'request' => $request_key,
'noclose' => true,
) + $attrib);
if (is_array($hidden)) {
foreach ($hidden as $field) {
$hiddenfield = new html_hiddenfield($field);
$form_start .= $hiddenfield->show();
}
}
$form_end = !strlen($attrib['form']) ? '</form>' : '';
$EDIT_FORM = !empty($attrib['form']) ? $attrib['form'] : 'form';
$this->rc->output->add_gui_object('editform', $EDIT_FORM);
return array($form_start, $form_end);
}
}

View file

@ -1,49 +0,0 @@
#directorylistbox ul.treelist li.virtual {
background-image: none !important;
}
#directorylistbox ul.treelist li.virtual > div a {
color: #aaa;
background-image: none;
}
#directorylistbox ul.treelist li.virtual > .treetoggle {
top: -2px !important;
}
/*
#directorylist li.addressbook.readonly
{
background-image: url(kolab_folders.png);
background-position: 5px 0px;
background-repeat: no-repeat;
}
#directorylist li.addressbook.shared
{
background-image: url(kolab_folders.png);
background-position: 5px -54px;
background-repeat: no-repeat;
}
#directorylist li.addressbook.shared.readonly
{
background-image: url(kolab_folders.png);
background-position: 5px -72px;
background-repeat: no-repeat;
}
#directorylist li.addressbook.other
{
background-image: url(kolab_folders.png);
background-position: 5px -18px;
background-repeat: no-repeat;
}
#directorylist li.addressbook.other.readonly
{
background-image: url(kolab_folders.png);
background-position: 5px -36px;
background-repeat: no-repeat;
}
*/

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.1 KiB

View file

@ -1,27 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><roundcube:object name="pagetitle" /></title>
<roundcube:include file="/includes/links.html" />
<link rel="stylesheet" type="text/css" href="/settings.css" />
<script type="text/javascript" src="/functions.js"></script>
</head>
<body class="iframe">
<div id="folder-title" class="boxtitle"><roundcube:label name="kolab_addressbook.bookproperties" /></div>
<div id="folder-details" class="boxcontent">
<roundcube:object name="bookdetails" />
<p>
<!--
<roundcube:if condition="!strlen(request:_source)" />
<input type="button" value="<roundcube:label name="cancel" />" class="button" onclick="history.back()" />&nbsp;
<roundcube:endif />
-->
<roundcube:button command="book-save" type="input" class="button mainaction" label="save" />
</p>
</div>
<script type="text/javascript">rcube_init_tabs('folder-details > form')</script>
</body>
</html>

View file

@ -0,0 +1,143 @@
<div id="contacthistory" class="popupmenu" aria-hidden="true">
<roundcube:object name="plugin.object_changelog_table" class="records-table changelog-table" />
<div class="compare-button"><input type="button" class="button" value="↳ <roundcube:label name='libkolab.compare' />" /></div>
</div>
<div id="contactdiff" class="popupmenu" aria-hidden="true">
<h2 class="contact-names">Contact Name</h2>
<h2 class="contact-names-new diff-text-new"></h2>
<div class="form-section contact-name">
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-nickname">
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-organization">
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-department">
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-jobtitle">
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-photo">
<img class="diff-img-old" /> &#8674;
<img class="diff-img-new" />
</div>
<div class="form-section contact-email">
<label><roundcube:label name="email" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-phone">
<label><roundcube:label name="phone" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-address">
<label><roundcube:label name="address" /><span class="index"></span></label>
<div class="diff-text-diff" style="white-space:pre-wrap"></div>
<div class="diff-text-old"></div>
<div class="diff-text-new"></div>
</div>
<div class="form-section contact-website">
<label><roundcube:label name="website" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-im">
<label><roundcube:label name="instantmessenger" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-gender">
<label><roundcube:label name="gender" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-birthday">
<label><roundcube:label name="birthday" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-anniversary">
<label><roundcube:label name="anniversary" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-profession">
<label><roundcube:label name="profession" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-manager">
<label><roundcube:label name="manager" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-assistant">
<label><roundcube:label name="assistant" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-spouse">
<label><roundcube:label name="spouse" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-children">
<label><roundcube:label name="children" /><span class="index"></span></label>
<span class="diff-text-old"></span> &#8674;
<span class="diff-text-new"></span>
</div>
<div class="form-section contact-notes">
<label><roundcube:label name="notes" /></label>
<div class="diff-text-diff" style="white-space:pre-wrap"></div>
<div class="diff-text-old"></div>
<div class="diff-text-new"></div>
</div>
<div class="form-section contact-freebusyurl">
<label><roundcube:label name="kolab_addressbook.freebusyurl" /></label>
<div class="diff-text-old"></div>
<div class="diff-text-new"></div>
</div>
<div class="form-section contact-pgppublickey">
<label><roundcube:label name="kolab_addressbook.pgppublickey" /></label>
<div class="diff-text-old" style="white-space:pre-wrap"></div>
<div class="diff-text-new" style="white-space:pre-wrap"></div>
</div>
<div class="form-section contact-pkcs7publickey">
<label><roundcube:label name="kolab_addressbook.pkcs7publickey" /></label>
<div class="diff-text-old" style="white-space:pre-wrap"></div>
<div class="diff-text-new" style="white-space:pre-wrap"></div>
</div>
</div>

View file

@ -0,0 +1,32 @@
<div id="search-addon" class="searchbar toolbar" role="search" aria-labelledby="aria-labelfoldersearchform">
<h2 id="aria-label-labelfoldersearchform" class="voice"><roundcube:label name="kolab_addressbook.foldersearchform" /></h2>
<form name="foldersearchform" onsubmit="return false">
<input id="addressbooksearch" type="text" name="q" placeholder="<roundcube:label name="searchplaceholder" />" />
<a class="button reset" href="#" onclick="return rcmail.command(\'reset-listsearch\',null,this,event)" title="<roundcube:label name="resetsearch" />" tabindex="0">
<span class="inner"><roundcube:label name="resetsearch" /></span>
</a>
</form>
<a class="button search" href="#"title="<roundcube:label name="kolab_addressbook.findaddressbooks" />" tabindex="0" >
<span class="inner"><roundcube:label name="kolab_addressbook.findaddressbooks" /></span>
</a>
</div>
<script>
// append search form for address books
if (rcmail.gui_objects.folderlist) {
var searchbar = $('#search-addon')
.attr('aria-controls', rcmail.gui_objects.folderlist)
.insertAfter($('#layout > .sidebar > .header > .header-title'))
.get(0);
// Initialize searchbar
UI.searchbar_init(searchbar);
// Make checkboxes pretty
rcmail.addEventListener('init', function() {
rcmail.treelist.addEventListener('add-item', function(prop) {
UI.pretty_checkbox($(prop.li).find('input').addClass('flex-checkbox'));
});
});
}
</script>

View file

@ -156,18 +156,18 @@
text-align: center;
}
.formbuttons .btn-contact-history {
.formbuttons .contact-history {
display: inline-block;
padding: 1px;
color: #333;
text-decoration: none;
}
.formbuttons .btn-contact-history:hover {
.formbuttons .contact-history:hover {
text-decoration: underline;
}
.formbuttons .btn-contact-history:before {
.formbuttons .contact-history:before {
content: "";
display: inline-block;
position: relative;

View file

@ -1,22 +0,0 @@
<roundcube:object name="doctype" value="html5" />
<html>
<head>
<title><roundcube:object name="pagetitle" /></title>
<roundcube:include file="/includes/links.html" />
</head>
<body class="iframe">
<h1 class="boxtitle"><roundcube:label name="kolab_addressbook.bookproperties" /></h1>
<div class="boxcontent">
<roundcube:object name="bookdetails" class="propform tabbed" />
</div>
<div class="footerleft formbuttons">
<roundcube:button command="book-save" type="input" class="button mainaction" label="save" />
</div>
<roundcube:include file="/includes/footer.html" />
</body>
</html>

View file

@ -0,0 +1,43 @@
<script>
// append search form for address books
if (rcmail.gui_objects.folderlist) {
var container = $('#' + rcmail.gui_objects.folderlist);
$('<div class="listsearchbox" style="display:none">' +
'<div class="searchbox" role="search" aria-labelledby="aria-labelfoldersearchform" aria-controls="' + rcmail.gui_objects.folderlist + '">' +
'<h3 id="aria-label-labelfoldersearchform" class="voice">' + rcmail.gettext('foldersearchform', 'kolab_addressbook') + '" /></h3>' +
'<label for="addressbooksearch" class="voice">' + rcmail.gettext('searchterms', 'kolab_addressbook') + '</label>' +
'<input type="text" name="q" id="addressbooksearch" placeholder="' + rcmail.gettext('findaddressbooks', 'kolab_addressbook') + '" />' +
'<a class="iconbutton searchicon"></a>' +
'<a href="#reset" onclick="return rcmail.command(\'reset-listsearch\',null,this,event)" id="directorylistsearch-reset" class="iconbutton reset" title="' + rcmail.gettext('resetsearch') + '">' +
rcmail.gettext('resetsearch') + '</a>' +
'</div>' +
'</div>')
.insertBefore(container.parent());
$('<a>').attr({href: "#search", "class": "iconbutton search", title: rcmail.gettext('findaddressbooks', 'kolab_addressbook'), tabindex: 0})
.text(rcmail.gettext('findaddressbooks', 'kolab_addressbook'))
.appendTo('#directorylistbox h2.boxtitle')
.click(function(e) {
var title = $('#directorylistbox .boxtitle'),
box = $('#directorylistbox .listsearchbox'),
dir = box.is(':visible') ? -1 : 1;
box.slideToggle({
duration: 160,
progress: function(animation, progress) {
if (dir < 0) progress = 1 - progress;
$('#directorylistbox .scroller').css('top', (title.outerHeight() + 34 * progress) + 'px');
},
complete: function() {
box.toggleClass('expanded');
if (box.is(':visible')) {
box.find('input[type=text]').focus();
}
else {
$('#directorylistsearch-reset').click();
}
}
});
});
}
</script>

View file

@ -93,7 +93,7 @@ window.rcmail && rcmail.addEventListener('init', function(evt) {
});
var fn = function(elem) {
var classname = elem.className,
var classname = elem.className.split(' ')[0],
list = $(elem).closest('table').find('input.' + classname),
check = list.not(':checked').length > 0;
@ -164,29 +164,24 @@ rcube_webmail.prototype.delegate_delete = function()
if (!this.env.active_delegate)
return;
var $dialog = $("#delegate-delete-dialog").addClass('uidialog'),
buttons = {};
buttons[this.gettext('no', 'kolab_delegation')] = function() {
$dialog.dialog('close');
};
buttons[this.gettext('yes', 'kolab_delegation')] = function() {
$dialog.dialog('close');
var lock = rcmail.set_busy(true, 'kolab_delegation.savingdata');
rcmail.http_post('plugin.delegation-delete', {id: rcmail.env.active_delegate,
acl: $("#delegate-delete-dialog input:checked").length}, lock);
}
var content = $("#delegate-delete-dialog").addClass('uidialog').clone(),
title = this.gettext('deleteconfirm', 'kolab_delegation'),
save_func = function() {
var lock = rcmail.set_busy(true, 'kolab_delegation.savingdata'),
props = {id: rcmail.env.active_delegate, acl: $("#delegate-delete-dialog input:checked").length};
rcmail.http_post('plugin.delegation-delete', props, lock);
return true;
},
opts = {
resizable: false,
closeOnEscape: true,
width: 400,
button: 'kolab_delegation.yes',
cancel_button: 'kolab_delegation.no'
};
// open jquery UI dialog
$dialog.dialog({
modal: true,
resizable: false,
closeOnEscape: true,
title: this.gettext('deleteconfirm', 'kolab_delegation'),
close: function() { $dialog.dialog('destroy').hide(); },
buttons: buttons,
width: 400
}).show();
this.simple_dialog(content, title, save_func, opts);
};
// submit delegate form to the server

View file

@ -512,6 +512,7 @@ class kolab_delegation extends rcube_plugin
}
$folder_data = $engine->list_folders($delegate['uid']);
$use_fieldsets = rcube_utils::get_boolean($attrib['use-fieldsets']);
$rights = array();
$folder_groups = array();
@ -525,10 +526,17 @@ class kolab_delegation extends rcube_plugin
if (empty($group)) {
continue;
}
$attrib['type'] = $type;
$html .= html::div('foldersblock',
html::tag('h3', $type, $this->gettext($type)) .
$this->delegate_folders_block($group, $attrib, $rights));
$table = $this->delegate_folders_block($group, $attrib, $rights);
$label = $this->gettext($type);
if ($use_fieldsets) {
$html .= html::tag('fieldset', 'foldersblock', html::tag('legend', $type, $label) . $table);
}
else {
$html .= html::div('foldersblock', html::tag('h3', $type, $label) . $table);
}
}
$this->rc->output->add_gui_object('folderslist', $attrib['id']);
@ -546,8 +554,8 @@ class kolab_delegation extends rcube_plugin
$write_ico = $attrib['writeicon'] ? html::img(array('src' => $path . $attrib['writeicon'], 'title' => $this->gettext('write'))) : '';
$table = new html_table(array('cellspacing' => 0));
$table->add_header(array('class' => 'read', 'title' => $this->gettext('read'), 'tabindex' => 0), $read_ico);
$table->add_header(array('class' => 'write', 'title' => $this->gettext('write'), 'tabindex' => 0), $write_ico);
$table->add_header(array('class' => 'read checkbox-cell', 'title' => $this->gettext('read'), 'tabindex' => 0), $read_ico);
$table->add_header(array('class' => 'write checkbox-cell', 'title' => $this->gettext('write'), 'tabindex' => 0), $write_ico);
$table->add_header('foldername', $this->rc->gettext('folder'));
$checkbox_read = new html_checkbox(array('name' => 'read[]', 'class' => 'read'));
@ -578,10 +586,10 @@ class kolab_delegation extends rcube_plugin
}
$table->add_row();
$table->add('read', $checkbox_read->show(
$table->add('read checkbox-cell', $checkbox_read->show(
$rights[$folder] >= kolab_delegation_engine::ACL_READ ? $folder : null,
array('value' => $folder)));
$table->add('write', $checkbox_write->show(
$table->add('write checkbox-cell', $checkbox_write->show(
$rights[$folder] >= kolab_delegation_engine::ACL_WRITE ? $folder : null,
array('value' => $folder, 'id' => $folder_id)));

View file

@ -14,8 +14,10 @@ $labels['tabtitle'] = 'Delegation';
$labels['delegationtitle'] = 'Manage delegates';
$labels['delegates'] = 'Delegates';
$labels['delegate'] = 'Delegate';
$labels['delegatefolders'] = 'Delegated folders';
$labels['delegateprops'] = 'Delegate properties';
$labels['mail'] = 'Email';
$labels['contact'] = 'Address Books';
$labels['contact'] = 'Contacts';
$labels['event'] = 'Calendars';
$labels['task'] = 'Tasks';
$labels['note'] = 'Notes';

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 908 B

View file

@ -1,95 +0,0 @@
/* Stylesheets for the Kolab ActiveSync configuration UI */
#delegates-table {
width: 100%;
table-layout: fixed;
cursor: default;
}
.boxfooter a.button.delete,
.boxfooter a.buttonPas.delete {
background-image: url(deviceactions.png);
}
div.foldersblock {
float: left;
margin: 0.5em 3em 2em 0;
padding: 0;
border: 1px solid #ddd;
}
div.foldersblock h3 {
font-size: 12px;
color: #333;
margin: 0 0 0.4em 0;
padding: 4px 4px 0 30px;
background: url(foldertypes.png) 5px 4px no-repeat #eee;
}
div.foldersblock h3.contact {
background-position: 5px -16px;
}
div.foldersblock h3.event {
background-position: 5px -36px;
}
div.foldersblock h3.task {
background-position: 5px -56px;
}
div.foldersblock h3.note {
background-position: 5px -76px;
}
#delegatefolders thead th {
color: #999;
font-weight: bold;
padding: 2px;
text-align: center;
}
#delegatefolders thead tr th {
border-top: 1px solid #ddd;
}
#delegatefolders thead th.read,
#delegatefolders thead th.write {
cursor: pointer;
}
#delegatefolders thead th.foldername {
text-align: left;
}
#delegatefolders tbody td {
padding: 1px 2px;
border-top: 1px solid #ddd;
background-color: white;
}
#delegatefolders td label {
display: block;
}
#delegatefolders td.mailbox {
min-width: 12em;
padding-right: 10px;
}
#delegatefolders td.virtual {
color: #999;
}
#delegatefolders {
overflow: auto;
margin-top: 0.5em;
}
#delegate-delete-dialog {
display: none;
}
#delegate-delete-dialog p {
font-weight: bold;
}

View file

@ -1,24 +0,0 @@
<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_delegation.delegate"></div>
<div id="prefs-details" class="boxcontent">
<form action="#" method="post" id="delegateform">
<roundcube:object name="plugin.delegateform" form="delegateform" class="propform" />
<roundcube:object name="plugin.delegatefolders" form="delegateform" id="delegatefolders" readicon="read.png" writeicon="write.png" />
</form>
<div id="formfooter">
<div class="footerleft">
<roundcube:button type="input" class="button mainaction" command="delegate-save" label="save" />
</div>
</div>
</div>
</body>
</html>

View file

@ -1,44 +0,0 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title><roundcube:object name="pagetitle" /></title>
<roundcube:include file="/includes/links.html" />
<script type="text/javascript" src="/functions.js"></script>
<script type="text/javascript" src="/splitter.js"></script>
</head>
<body>
<roundcube:include file="/includes/taskbar.html" />
<roundcube:include file="/includes/header.html" />
<roundcube:include file="/includes/settingstabs.html" />
<div id="mainscreen">
<div id="sectionslist">
<div id="delegateslist-title" class="boxtitle"><roundcube:label name="kolab_delegation.delegates" /></div>
<div class="boxlistcontent">
<roundcube:object name="plugin.delegatelist" id="delegates-table" class="records-table" cellspacing="0" />
</div>
<div class="boxfooter">
<roundcube:button command="delegate-add" type="link" title="kolab_delegation.adddelegate" class="buttonPas addgroup" classAct="button addgroup" content=" " /><roundcube:button type="link" command="delegate-elete" title="kolab_delegation.deletedelegate" class="buttonPas delete" classAct="button delete" content=" " />
</div>
</div>
<script type="text/javascript">
var viewsplit = new rcube_splitter({ id:'delegatelistsplitter', p1: 'sectionslist', p2: 'prefs-box', orientation: 'v', relative: true, start: 300 });
rcmail.add_onload('viewsplit.init()');
</script>
<div id="prefs-box">
<roundcube:frame contentframe="delegation-frame" id="delegation-frame" style="width:100%; height:100%" frameborder="0" src="/watermark.html" />
</div>
</div>
<div id="delegate-delete-dialog">
<p><roundcube:label name="kolab_delegation.delegatedeleteconfirm" /></p>
<span><input type="checkbox" value="1" checked="checked" /><roundcube:label name="kolab_delegation.delegateremoveacl" /></span>
</div>
</body>
</html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 699 B

Some files were not shown because too many files have changed in this diff Show more