Elastic: Partial support for calendar plugin
This commit is contained in:
parent
6f73df9bbd
commit
21c4b6a5bb
16 changed files with 1221 additions and 428 deletions
|
@ -320,7 +320,11 @@ class calendar extends rcube_plugin
|
||||||
$this->rc->output->set_env('timezone', $this->timezone->getName());
|
$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_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('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);
|
$view = rcube_utils::get_input_value('view', rcube_utils::INPUT_GPC);
|
||||||
if (in_array($view, array('agendaWeek', 'agendaDay', 'month', 'table')))
|
if (in_array($view, array('agendaWeek', 'agendaDay', 'month', 'table')))
|
||||||
|
@ -2665,8 +2669,8 @@ class calendar extends rcube_plugin
|
||||||
// render small agenda view for the respective day
|
// render small agenda view for the respective day
|
||||||
if ($data['method'] == 'REQUEST' && !empty($data['date']) && $response['action'] == 'rsvp') {
|
if ($data['method'] == 'REQUEST' && !empty($data['date']) && $response['action'] == 'rsvp') {
|
||||||
$event_start = rcube_utils::anytodatetime($data['date']);
|
$event_start = rcube_utils::anytodatetime($data['date']);
|
||||||
$day_start = new Datetime(gmdate('Y-m-d 00:00', $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);
|
$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
|
// get events on that day from the user's personal calendars
|
||||||
$calendars = $this->driver->list_calendars(calendar_driver::FILTER_PERSONAL);
|
$calendars = $this->driver->list_calendars(calendar_driver::FILTER_PERSONAL);
|
||||||
|
@ -2675,6 +2679,7 @@ class calendar extends rcube_plugin
|
||||||
|
|
||||||
$before = $after = array();
|
$before = $after = array();
|
||||||
foreach ($events as $event) {
|
foreach ($events as $event) {
|
||||||
|
|
||||||
// TODO: skip events with free_busy == 'free' ?
|
// TODO: skip events with free_busy == 'free' ?
|
||||||
if ($event['uid'] == $data['uid'] || $event['end'] < $day_start || $event['start'] > $day_end)
|
if ($event['uid'] == $data['uid'] || $event['end'] < $day_start || $event['start'] > $day_end)
|
||||||
continue;
|
continue;
|
||||||
|
|
|
@ -66,7 +66,7 @@ function rcube_calendar_ui(settings)
|
||||||
var freebusy_data = {};
|
var freebusy_data = {};
|
||||||
var current_view = null;
|
var current_view = null;
|
||||||
var count_sources = [];
|
var count_sources = [];
|
||||||
var exec_deferred = bw.ie6 ? 5 : 1;
|
var exec_deferred = 1;
|
||||||
var sensitivitylabels = { 'public':rcmail.gettext('public','calendar'), 'private':rcmail.gettext('private','calendar'), 'confidential':rcmail.gettext('confidential','calendar') };
|
var sensitivitylabels = { 'public':rcmail.gettext('public','calendar'), 'private':rcmail.gettext('private','calendar'), 'confidential':rcmail.gettext('confidential','calendar') };
|
||||||
var ui_loading = rcmail.set_busy(true, 'loading');
|
var ui_loading = rcmail.set_busy(true, 'loading');
|
||||||
|
|
||||||
|
@ -548,6 +548,7 @@ function rcube_calendar_ui(settings)
|
||||||
if (!temp && calendar.editable && event.editable !== false) {
|
if (!temp && calendar.editable && event.editable !== false) {
|
||||||
buttons.push({
|
buttons.push({
|
||||||
text: rcmail.gettext('edit', 'calendar'),
|
text: rcmail.gettext('edit', 'calendar'),
|
||||||
|
'class': 'edit mainaction',
|
||||||
click: function() {
|
click: function() {
|
||||||
event_edit_dialog('edit', event);
|
event_edit_dialog('edit', event);
|
||||||
}
|
}
|
||||||
|
@ -567,7 +568,8 @@ function rcube_calendar_ui(settings)
|
||||||
if (!buttons.length) {
|
if (!buttons.length) {
|
||||||
buttons.push({
|
buttons.push({
|
||||||
text: rcmail.gettext('close', 'calendar'),
|
text: rcmail.gettext('close', 'calendar'),
|
||||||
click: function(){
|
'class': 'cancel',
|
||||||
|
click: function() {
|
||||||
$dialog.dialog('close');
|
$dialog.dialog('close');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
@ -575,9 +577,9 @@ function rcube_calendar_ui(settings)
|
||||||
|
|
||||||
// open jquery UI dialog
|
// open jquery UI dialog
|
||||||
$dialog.dialog({
|
$dialog.dialog({
|
||||||
modal: false,
|
modal: true,
|
||||||
resizable: !bw.ie6,
|
resizable: true,
|
||||||
closeOnEscape: (!bw.ie6 && !bw.ie7), // disable for performance reasons
|
closeOnEscape: true,
|
||||||
title: me.event_date_text(event),
|
title: me.event_date_text(event),
|
||||||
open: function() {
|
open: function() {
|
||||||
$dialog.attr('aria-hidden', 'false');
|
$dialog.attr('aria-hidden', 'false');
|
||||||
|
@ -585,17 +587,19 @@ function rcube_calendar_ui(settings)
|
||||||
$dialog.parent().find('.ui-button:not(.ui-dialog-titlebar-close)').first().focus();
|
$dialog.parent().find('.ui-button:not(.ui-dialog-titlebar-close)').first().focus();
|
||||||
}, 5);
|
}, 5);
|
||||||
},
|
},
|
||||||
close: function() {
|
beforeClose: function(e) {
|
||||||
|
rcmail.command('menu-close', 'eventoptionsmenu', null, e);
|
||||||
|
},
|
||||||
|
close: function(e) {
|
||||||
$dialog.dialog('destroy').attr('aria-hidden', 'true').hide();
|
$dialog.dialog('destroy').attr('aria-hidden', 'true').hide();
|
||||||
rcmail.command('menu-close','eventoptionsmenu');
|
|
||||||
$('.libcal-rsvp-replymode').hide();
|
$('.libcal-rsvp-replymode').hide();
|
||||||
},
|
},
|
||||||
dragStart: function() {
|
dragStart: function(e) {
|
||||||
rcmail.command('menu-close','eventoptionsmenu');
|
rcmail.command('menu-close', 'eventoptionsmenu', null, e);
|
||||||
$('.libcal-rsvp-replymode').hide();
|
$('.libcal-rsvp-replymode').hide();
|
||||||
},
|
},
|
||||||
resizeStart: function() {
|
resizeStart: function(e) {
|
||||||
rcmail.command('menu-close','eventoptionsmenu');
|
rcmail.command('menu-close', 'eventoptionsmenu', null, e);
|
||||||
$('.libcal-rsvp-replymode').hide();
|
$('.libcal-rsvp-replymode').hide();
|
||||||
},
|
},
|
||||||
buttons: buttons,
|
buttons: buttons,
|
||||||
|
@ -616,9 +620,8 @@ function rcube_calendar_ui(settings)
|
||||||
// add link for "more options" drop-down
|
// add link for "more options" drop-down
|
||||||
if (!temp && !event.temporary && event.calendar != '_resource') {
|
if (!temp && !event.temporary && event.calendar != '_resource') {
|
||||||
$('<a>')
|
$('<a>')
|
||||||
.attr('href', '#')
|
.attr({href: '#', 'class': 'dropdown-link btn btn-link options', 'data-popup-pos': 'top'})
|
||||||
.html(rcmail.gettext('eventoptions','calendar'))
|
.text(rcmail.gettext('eventoptions','calendar'))
|
||||||
.addClass('dropdown-link')
|
|
||||||
.click(function(e) {
|
.click(function(e) {
|
||||||
return rcmail.command('menu-open','eventoptionsmenu', this, e)
|
return rcmail.command('menu-open','eventoptionsmenu', this, e)
|
||||||
})
|
})
|
||||||
|
@ -818,7 +821,7 @@ function rcube_calendar_ui(settings)
|
||||||
// save action
|
// save action
|
||||||
buttons.push({
|
buttons.push({
|
||||||
text: rcmail.gettext('save', 'calendar'),
|
text: rcmail.gettext('save', 'calendar'),
|
||||||
'class': 'mainaction',
|
'class': 'save mainaction',
|
||||||
click: function() {
|
click: function() {
|
||||||
var start = parse_datetime(allday.checked ? '12:00' : starttime.val(), startdate.val());
|
var start = parse_datetime(allday.checked ? '12:00' : starttime.val(), startdate.val());
|
||||||
var end = parse_datetime(allday.checked ? '13:00' : endtime.val(), enddate.val());
|
var end = parse_datetime(allday.checked ? '13:00' : endtime.val(), enddate.val());
|
||||||
|
@ -919,6 +922,7 @@ function rcube_calendar_ui(settings)
|
||||||
|
|
||||||
buttons.push({
|
buttons.push({
|
||||||
text: rcmail.gettext('cancel', 'calendar'),
|
text: rcmail.gettext('cancel', 'calendar'),
|
||||||
|
'class': 'cancel',
|
||||||
click: function() {
|
click: function() {
|
||||||
$dialog.dialog("close");
|
$dialog.dialog("close");
|
||||||
}
|
}
|
||||||
|
@ -941,7 +945,7 @@ function rcube_calendar_ui(settings)
|
||||||
// open jquery UI dialog
|
// open jquery UI dialog
|
||||||
$dialog.dialog({
|
$dialog.dialog({
|
||||||
modal: true,
|
modal: true,
|
||||||
resizable: (!bw.ie6 && !bw.ie7), // disable for performance reasons
|
resizable: true,
|
||||||
closeOnEscape: false,
|
closeOnEscape: false,
|
||||||
title: rcmail.gettext((action == 'edit' ? 'edit_event' : 'new_event'), 'calendar'),
|
title: rcmail.gettext((action == 'edit' ? 'edit_event' : 'new_event'), 'calendar'),
|
||||||
open: function() {
|
open: function() {
|
||||||
|
@ -1129,10 +1133,11 @@ function rcube_calendar_ui(settings)
|
||||||
$('.event-date', $dialog).hide();
|
$('.event-date', $dialog).hide();
|
||||||
});
|
});
|
||||||
|
|
||||||
var buttons = {};
|
var buttons = [{
|
||||||
buttons[rcmail.gettext('close', 'calendar')] = function() {
|
text: rcmail.gettext('close', 'calendar'),
|
||||||
$dialog.dialog('close');
|
'class': 'cancel',
|
||||||
};
|
click: function() { $dialog.dialog('close'); }
|
||||||
|
}];
|
||||||
|
|
||||||
// open jquery UI dialog
|
// open jquery UI dialog
|
||||||
$dialog.dialog({
|
$dialog.dialog({
|
||||||
|
@ -1265,47 +1270,50 @@ function rcube_calendar_ui(settings)
|
||||||
});
|
});
|
||||||
|
|
||||||
// enable/disable buttons
|
// enable/disable buttons
|
||||||
$('#shedule-find-prev').button('option', 'disabled', (fb_start.getTime() < now.getTime()));
|
$('#schedule-find-prev').button('option', 'disabled', (fb_start.getTime() < now.getTime()));
|
||||||
|
|
||||||
// dialog buttons
|
// dialog buttons
|
||||||
var buttons = {};
|
var buttons = [
|
||||||
|
{
|
||||||
|
text: rcmail.gettext('select', 'calendar'),
|
||||||
|
'class': 'save mainaction',
|
||||||
|
click: function() {
|
||||||
|
$('#edit-startdate').val(freebusy_ui.startdate.val());
|
||||||
|
$('#edit-starttime').val(freebusy_ui.starttime.val());
|
||||||
|
$('#edit-enddate').val(freebusy_ui.enddate.val());
|
||||||
|
$('#edit-endtime').val(freebusy_ui.endtime.val());
|
||||||
|
|
||||||
buttons[rcmail.gettext('select', 'calendar')] = function() {
|
// write role changes back to main dialog
|
||||||
$('#edit-startdate').val(freebusy_ui.startdate.val());
|
$('select.edit-attendee-role').each(function(i, elem){
|
||||||
$('#edit-starttime').val(freebusy_ui.starttime.val());
|
if (event_attendees[i] && freebusy_ui.attendees[i]) {
|
||||||
$('#edit-enddate').val(freebusy_ui.enddate.val());
|
event_attendees[i].role = freebusy_ui.attendees[i].role;
|
||||||
$('#edit-endtime').val(freebusy_ui.endtime.val());
|
$(elem).val(event_attendees[i].role);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
// write role changes back to main dialog
|
if (freebusy_ui.needsupdate)
|
||||||
$('select.edit-attendee-role').each(function(i, elem){
|
update_freebusy_status(me.selected_event);
|
||||||
if (event_attendees[i] && freebusy_ui.attendees[i]) {
|
freebusy_ui.needsupdate = false;
|
||||||
event_attendees[i].role = freebusy_ui.attendees[i].role;
|
$dialog.dialog("close");
|
||||||
$(elem).val(event_attendees[i].role);
|
|
||||||
}
|
}
|
||||||
});
|
},
|
||||||
|
{
|
||||||
if (freebusy_ui.needsupdate)
|
text: rcmail.gettext('cancel', 'calendar'),
|
||||||
update_freebusy_status(me.selected_event);
|
'class': 'cancel',
|
||||||
freebusy_ui.needsupdate = false;
|
click: function() { $dialog.dialog("close"); }
|
||||||
$dialog.dialog("close");
|
}
|
||||||
};
|
];
|
||||||
|
|
||||||
buttons[rcmail.gettext('cancel', 'calendar')] = function() {
|
|
||||||
$dialog.dialog("close");
|
|
||||||
};
|
|
||||||
|
|
||||||
$dialog.dialog({
|
$dialog.dialog({
|
||||||
modal: true,
|
modal: true,
|
||||||
resizable: true,
|
resizable: true,
|
||||||
closeOnEscape: (!bw.ie6 && !bw.ie7),
|
closeOnEscape: true,
|
||||||
title: rcmail.gettext('scheduletime', 'calendar'),
|
title: rcmail.gettext('scheduletime', 'calendar'),
|
||||||
open: function() {
|
open: function() {
|
||||||
rcmail.ksearch_blur();
|
rcmail.ksearch_blur();
|
||||||
$dialog.attr('aria-hidden', 'false').find('#shedule-find-next, #shedule-find-prev').not(':disabled').first().focus();
|
$dialog.attr('aria-hidden', 'false').find('#schedule-find-next, #schedule-find-prev').not(':disabled').first().focus();
|
||||||
},
|
},
|
||||||
close: function() {
|
close: function() {
|
||||||
if (bw.ie6)
|
|
||||||
$("#edit-attendees-table").css('visibility','visible');
|
|
||||||
$dialog.dialog("destroy").attr('aria-hidden', 'true').hide();
|
$dialog.dialog("destroy").attr('aria-hidden', 'true').hide();
|
||||||
// TODO: focus opener button
|
// TODO: focus opener button
|
||||||
},
|
},
|
||||||
|
@ -1317,10 +1325,6 @@ function rcube_calendar_ui(settings)
|
||||||
width: 850
|
width: 850
|
||||||
}).show();
|
}).show();
|
||||||
|
|
||||||
// hide edit dialog on IE6 because of drop-down elements
|
|
||||||
if (bw.ie6)
|
|
||||||
$("#edit-attendees-table").css('visibility','hidden');
|
|
||||||
|
|
||||||
// adjust dialog size to fit grid without scrolling
|
// adjust dialog size to fit grid without scrolling
|
||||||
var gridw = $('#schedule-freebusy-times').width();
|
var gridw = $('#schedule-freebusy-times').width();
|
||||||
var overflow = gridw - $('#attendees-freebusy-table td.times').width();
|
var overflow = gridw - $('#attendees-freebusy-table td.times').width();
|
||||||
|
@ -1804,7 +1808,7 @@ function rcube_calendar_ui(settings)
|
||||||
render_freebusy_overlay();
|
render_freebusy_overlay();
|
||||||
|
|
||||||
var now = new Date();
|
var now = new Date();
|
||||||
$('#shedule-find-prev').button('option', 'disabled', (event.start.getTime() < now.getTime()));
|
$('#schedule-find-prev').button('option', 'disabled', (event.start.getTime() < now.getTime()));
|
||||||
|
|
||||||
// speak new selection
|
// speak new selection
|
||||||
rcmail.display_message(rcmail.gettext('suggestedslot', 'calendar') + ': ' + me.event_date_text(event, true), 'voice');
|
rcmail.display_message(rcmail.gettext('suggestedslot', 'calendar') + ': ' + me.event_date_text(event, true), 'voice');
|
||||||
|
@ -1895,16 +1899,15 @@ function rcube_calendar_ui(settings)
|
||||||
opts['CHAIR'] = rcmail.gettext('calendar.rolechair');
|
opts['CHAIR'] = rcmail.gettext('calendar.rolechair');
|
||||||
|
|
||||||
if (organizer && !readonly)
|
if (organizer && !readonly)
|
||||||
dispname = rcmail.env['identities-selector'];
|
dispname = rcmail.env['identities-selector'];
|
||||||
|
|
||||||
var select = '<select class="edit-attendee-role"' + (organizer || readonly ? ' disabled="true"' : '') + ' aria-label="' + rcmail.gettext('role','calendar') + '">';
|
var select = '<select class="edit-attendee-role form-control"'
|
||||||
|
+ (organizer || readonly ? ' disabled="true"' : '')
|
||||||
|
+ ' aria-label="' + rcmail.gettext('role','calendar') + '">';
|
||||||
for (var r in opts)
|
for (var r in opts)
|
||||||
select += '<option value="'+ r +'" class="' + r.toLowerCase() + '"' + (data.role == r ? ' selected="selected"' : '') +'>' + Q(opts[r]) + '</option>';
|
select += '<option value="'+ r +'" class="' + r.toLowerCase() + '"' + (data.role == r ? ' selected="selected"' : '') +'>' + Q(opts[r]) + '</option>';
|
||||||
select += '</select>';
|
select += '</select>';
|
||||||
|
|
||||||
// availability
|
|
||||||
var avail = data.email ? 'loading' : 'unknown';
|
|
||||||
|
|
||||||
// delete icon
|
// delete icon
|
||||||
var icon = rcmail.env.deleteicon ? '<img src="' + rcmail.env.deleteicon + '" alt="" />' : rcmail.gettext('delete');
|
var icon = rcmail.env.deleteicon ? '<img src="' + rcmail.env.deleteicon + '" alt="" />' : rcmail.gettext('delete');
|
||||||
var dellink = '<a href="#delete" class="iconlink delete deletelink" title="' + Q(rcmail.gettext('delete')) + '">' + icon + '</a>';
|
var dellink = '<a href="#delete" class="iconlink delete deletelink" title="' + Q(rcmail.gettext('delete')) + '">' + icon + '</a>';
|
||||||
|
@ -1919,6 +1922,8 @@ function rcube_calendar_ui(settings)
|
||||||
tooltip = rcmail.gettext('libcalendaring.delegatedto') + ' ' + data['delegated-to'];
|
tooltip = rcmail.gettext('libcalendaring.delegatedto') + ' ' + data['delegated-to'];
|
||||||
else if (data['delegated-from'])
|
else if (data['delegated-from'])
|
||||||
tooltip = rcmail.gettext('libcalendaring.delegatedfrom') + ' ' + data['delegated-from'];
|
tooltip = rcmail.gettext('libcalendaring.delegatedfrom') + ' ' + data['delegated-from'];
|
||||||
|
else if (!status && organizer)
|
||||||
|
tooltip = rcmail.gettext('statusorganizer', 'libcalendaring');
|
||||||
else if (status)
|
else if (status)
|
||||||
tooltip = status_label;
|
tooltip = status_label;
|
||||||
|
|
||||||
|
@ -1928,15 +1933,18 @@ function rcube_calendar_ui(settings)
|
||||||
rcmail.gettext('expandattendeegroup','libcalendaring') + '</a>';
|
rcmail.gettext('expandattendeegroup','libcalendaring') + '</a>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var avail = data.email ? 'loading' : 'unknown';
|
||||||
|
var table = rcmail.env.calendar_resources && data.cutype == 'RESOURCE' ? resources_list : attendees_list;
|
||||||
var img_src = rcmail.assets_path('program/resources/blank.gif');
|
var img_src = rcmail.assets_path('program/resources/blank.gif');
|
||||||
|
var elastic = $(table).parents('.no-img').length > 0;
|
||||||
|
var avail_tag = elastic ? ('<span class="' + avail + '"') : ('<img alt="" src="' + img_src + '" class="availabilityicon ' + avail + '"');
|
||||||
var html = '<td class="role">' + select + '</td>' +
|
var html = '<td class="role">' + select + '</td>' +
|
||||||
'<td class="name"><span class="attendee-name">' + dispname + '</span></td>' +
|
'<td class="name"><span class="attendee-name">' + dispname + '</span></td>' +
|
||||||
'<td class="availability"><img src="' + img_src + '" class="availabilityicon ' + avail + '" data-email="' + data.email + '" alt="" /></td>' +
|
'<td class="availability">' + avail_tag + ' data-email="' + data.email + '" /></td>' +
|
||||||
'<td class="confirmstate"><span class="' + status + '" title="' + Q(tooltip) + '">' + Q(status ? status_label : '') + '</span></td>' +
|
'<td class="confirmstate"><span class="attendee ' + (status || 'organizer') + '" title="' + Q(tooltip) + '">' + Q(status && !elastic ? status_label : '') + '</span></td>' +
|
||||||
(data.cutype != 'RESOURCE' ? '<td class="invite">' + (organizer || readonly || !invbox ? '' : invbox) + '</td>' : '') +
|
(data.cutype != 'RESOURCE' ? '<td class="invite">' + (organizer || readonly || !invbox ? '' : invbox) + '</td>' : '') +
|
||||||
'<td class="options">' + (organizer || readonly ? '' : dellink) + '</td>';
|
'<td class="options">' + (organizer || readonly ? '' : dellink) + '</td>';
|
||||||
|
|
||||||
var table = rcmail.env.calendar_resources && data.cutype == 'RESOURCE' ? resources_list : attendees_list;
|
|
||||||
var tr = $('<tr>')
|
var tr = $('<tr>')
|
||||||
.addClass(String(data.role).toLowerCase())
|
.addClass(String(data.role).toLowerCase())
|
||||||
.html(html);
|
.html(html);
|
||||||
|
@ -1960,7 +1968,7 @@ function rcube_calendar_ui(settings)
|
||||||
|
|
||||||
// check free-busy status
|
// check free-busy status
|
||||||
if (avail == 'loading') {
|
if (avail == 'loading') {
|
||||||
check_freebusy_status(tr.find('img.availabilityicon'), data.email, me.selected_event);
|
check_freebusy_status(tr.find('.availability > *:first'), data.email, me.selected_event);
|
||||||
}
|
}
|
||||||
|
|
||||||
event_attendees.push(data);
|
event_attendees.push(data);
|
||||||
|
@ -1970,7 +1978,7 @@ function rcube_calendar_ui(settings)
|
||||||
// iterate over all attendees and update their free-busy status display
|
// iterate over all attendees and update their free-busy status display
|
||||||
var update_freebusy_status = function(event)
|
var update_freebusy_status = function(event)
|
||||||
{
|
{
|
||||||
attendees_list.find('img.availabilityicon').each(function(i,v) {
|
attendees_list.find('.availability > *').each(function(i,v) {
|
||||||
var email, icon = $(this);
|
var email, icon = $(this);
|
||||||
if (email = icon.attr('data-email'))
|
if (email = icon.attr('data-email'))
|
||||||
check_freebusy_status(icon, email, event);
|
check_freebusy_status(icon, email, event);
|
||||||
|
@ -1997,10 +2005,10 @@ function rcube_calendar_ui(settings)
|
||||||
data: { email:email, start:date2servertime(clone_date(event.start, event.allDay?1:0)), end:date2servertime(clone_date(event.end, event.allDay?2:0)), _remote: 1 },
|
data: { email:email, start:date2servertime(clone_date(event.start, event.allDay?1:0)), end:date2servertime(clone_date(event.end, event.allDay?2:0)), _remote: 1 },
|
||||||
success: function(status){
|
success: function(status){
|
||||||
var avail = String(status).toLowerCase();
|
var avail = String(status).toLowerCase();
|
||||||
icon.removeClass('loading').addClass(avail).attr('alt', rcmail.gettext('avail' + avail, 'calendar'));
|
icon.removeClass('loading').addClass(avail).attr('title', rcmail.gettext('avail' + avail, 'calendar'));
|
||||||
},
|
},
|
||||||
error: function(){
|
error: function(){
|
||||||
icon.removeClass('loading').addClass('unknown').attr('alt', rcmail.gettext('availunknown', 'calendar'));
|
icon.removeClass('loading').addClass('unknown').attr('title', rcmail.gettext('availunknown', 'calendar'));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
@ -2021,15 +2029,18 @@ function rcube_calendar_ui(settings)
|
||||||
$dialog.dialog('close');
|
$dialog.dialog('close');
|
||||||
|
|
||||||
// dialog buttons
|
// dialog buttons
|
||||||
var buttons = {};
|
var buttons = [
|
||||||
|
{
|
||||||
buttons[rcmail.gettext('addresource', 'calendar')] = function() {
|
text: rcmail.gettext('addresource', 'calendar'),
|
||||||
rcmail.command('add-resource');
|
'class': 'mainaction create',
|
||||||
};
|
click: function() { rcmail.command('add-resource'); }
|
||||||
|
},
|
||||||
buttons[rcmail.gettext('close')] = function() {
|
{
|
||||||
$dialog.dialog("close");
|
text: rcmail.gettext('close'),
|
||||||
};
|
'class': 'cancel',
|
||||||
|
click: function() { $dialog.dialog("close"); }
|
||||||
|
}
|
||||||
|
];
|
||||||
|
|
||||||
// open jquery UI dialog
|
// open jquery UI dialog
|
||||||
$dialog.dialog({
|
$dialog.dialog({
|
||||||
|
@ -2597,6 +2608,7 @@ function rcube_calendar_ui(settings)
|
||||||
if (!event.recurrence) {
|
if (!event.recurrence) {
|
||||||
buttons.push({
|
buttons.push({
|
||||||
text: rcmail.gettext((action == 'remove' ? 'delete' : 'save'), 'calendar'),
|
text: rcmail.gettext((action == 'remove' ? 'delete' : 'save'), 'calendar'),
|
||||||
|
'class': action == 'remove' ? 'delete mainaction' : 'save mainaction',
|
||||||
click: function() {
|
click: function() {
|
||||||
data._notify = notify && $dialog.find('input.confirm-attendees-donotify:checked').length ? 1 : 0;
|
data._notify = notify && $dialog.find('input.confirm-attendees-donotify:checked').length ? 1 : 0;
|
||||||
data._decline = decline && $dialog.find('input.confirm-attendees-decline:checked').length ? 1 : 0;
|
data._decline = decline && $dialog.find('input.confirm-attendees-decline:checked').length ? 1 : 0;
|
||||||
|
@ -2608,6 +2620,7 @@ function rcube_calendar_ui(settings)
|
||||||
|
|
||||||
buttons.push({
|
buttons.push({
|
||||||
text: rcmail.gettext('cancel', 'calendar'),
|
text: rcmail.gettext('cancel', 'calendar'),
|
||||||
|
'class': 'cancel',
|
||||||
click: function() {
|
click: function() {
|
||||||
$(this).dialog("close");
|
$(this).dialog("close");
|
||||||
}
|
}
|
||||||
|
@ -2699,6 +2712,11 @@ function rcube_calendar_ui(settings)
|
||||||
width: 680,
|
width: 680,
|
||||||
height: h,
|
height: h,
|
||||||
title: $.fullCalendar.formatDate(date, 'dddd ' + settings['date_long']),
|
title: $.fullCalendar.formatDate(date, 'dddd ' + settings['date_long']),
|
||||||
|
buttons: [{
|
||||||
|
text: rcmail.gettext('cancel', 'calendar'),
|
||||||
|
'class': 'cancel',
|
||||||
|
click: function() { $(this).dialog("close"); }
|
||||||
|
}],
|
||||||
close: function(){
|
close: function(){
|
||||||
dialog.dialog("destroy");
|
dialog.dialog("destroy");
|
||||||
me.fisheye_date = null;
|
me.fisheye_date = null;
|
||||||
|
@ -2862,84 +2880,56 @@ function rcube_calendar_ui(settings)
|
||||||
// opens a jquery UI dialog with event properties (or empty for creating a new calendar)
|
// opens a jquery UI dialog with event properties (or empty for creating a new calendar)
|
||||||
this.calendar_edit_dialog = function(calendar)
|
this.calendar_edit_dialog = function(calendar)
|
||||||
{
|
{
|
||||||
// close show dialog first
|
|
||||||
var $dialog = $("#calendarform");
|
|
||||||
if ($dialog.is(':ui-dialog'))
|
|
||||||
$dialog.dialog('close');
|
|
||||||
|
|
||||||
if (!calendar)
|
if (!calendar)
|
||||||
calendar = { name:'', color:'cc0000', editable:true, showalarms:true };
|
calendar = { name:'', color:'cc0000', editable:true, showalarms:true };
|
||||||
|
|
||||||
var form, name, color, alarms;
|
var title = rcmail.gettext((calendar.id ? 'editcalendar' : 'createcalendar'), 'calendar'),
|
||||||
|
params = {action: calendar.id ? 'form-edit' : 'form-new', c: {id: calendar.id}, _framed: 1},
|
||||||
|
$dialog = $('<iframe>').attr('src', rcmail.url('calendar', params)).on('load', function() {
|
||||||
|
var contents = $(this).contents();
|
||||||
|
contents.find('#calendar-name')
|
||||||
|
.prop('disabled', !calendar.editable)
|
||||||
|
.val(calendar.editname || calendar.name)
|
||||||
|
.select();
|
||||||
|
contents.find('#calendar-color')
|
||||||
|
.val(calendar.color);
|
||||||
|
contents.find('#calendar-showalarms')
|
||||||
|
.prop('checked', calendar.showalarms);
|
||||||
|
}),
|
||||||
|
save_func = function() {
|
||||||
|
var data,
|
||||||
|
form = $dialog.contents().find('#calendarpropform'),
|
||||||
|
name = form.find('#calendar-name');
|
||||||
|
|
||||||
$dialog.html(rcmail.get_label('loading'));
|
// form is not loaded
|
||||||
$.ajax({
|
if (!form || !form.length)
|
||||||
type: 'GET',
|
return false;
|
||||||
dataType: 'html',
|
|
||||||
url: rcmail.url('calendar'),
|
// do some input validation
|
||||||
data: { action:(calendar.id ? 'form-edit' : 'form-new'), c:{ id:calendar.id } },
|
if (!name.val() || name.val().length < 2) {
|
||||||
success: function(data) {
|
rcmail.alert_dialog(rcmail.gettext('invalidcalendarproperties', 'calendar'), function() {
|
||||||
$dialog.html(data);
|
name.select();
|
||||||
// resize and reposition dialog window
|
});
|
||||||
form = $('#calendarpropform');
|
|
||||||
me.dialog_resize('#calendarform', form.height(), form.width());
|
return false;
|
||||||
name = $('#calendar-name').prop('disabled', !calendar.editable).val(calendar.editname || calendar.name);
|
}
|
||||||
color = $('#calendar-color').val(calendar.color).minicolors($.extend(rcmail.env.minicolors_config || {}, {value: calendar.color}));
|
|
||||||
alarms = $('#calendar-showalarms').prop('checked', calendar.showalarms).get(0);
|
// post data to server
|
||||||
name.select();
|
data = form.serializeJSON();
|
||||||
}
|
if (data.color)
|
||||||
|
data.color = data.color.replace(/^#/, '');
|
||||||
|
if (calendar.id)
|
||||||
|
data.id = calendar.id;
|
||||||
|
|
||||||
|
me.saving_lock = rcmail.set_busy(true, 'calendar.savingdata');
|
||||||
|
rcmail.http_post('calendar', { action:(calendar.id ? 'edit' : 'new'), c:data });
|
||||||
|
$dialog.dialog("close");
|
||||||
|
};
|
||||||
|
|
||||||
|
rcmail.simple_dialog($dialog, title, save_func, {
|
||||||
|
width: 600,
|
||||||
|
height: 400
|
||||||
});
|
});
|
||||||
|
|
||||||
// dialog buttons
|
|
||||||
var buttons = {};
|
|
||||||
|
|
||||||
buttons[rcmail.gettext('save', 'calendar')] = function() {
|
|
||||||
// form is not loaded
|
|
||||||
if (!form || !form.length)
|
|
||||||
return;
|
|
||||||
|
|
||||||
// TODO: do some input validation
|
|
||||||
if (!name.val() || name.val().length < 2) {
|
|
||||||
alert(rcmail.gettext('invalidcalendarproperties', 'calendar'));
|
|
||||||
name.select();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
// post data to server
|
|
||||||
var data = form.serializeJSON();
|
|
||||||
if (data.color)
|
|
||||||
data.color = data.color.replace(/^#/, '');
|
|
||||||
if (calendar.id)
|
|
||||||
data.id = calendar.id;
|
|
||||||
if (alarms)
|
|
||||||
data.showalarms = alarms.checked ? 1 : 0;
|
|
||||||
|
|
||||||
me.saving_lock = rcmail.set_busy(true, 'calendar.savingdata');
|
|
||||||
rcmail.http_post('calendar', { action:(calendar.id ? 'edit' : 'new'), c:data });
|
|
||||||
$dialog.dialog("close");
|
|
||||||
};
|
|
||||||
|
|
||||||
buttons[rcmail.gettext('cancel', 'calendar')] = function() {
|
|
||||||
$dialog.dialog("close");
|
|
||||||
};
|
|
||||||
|
|
||||||
// open jquery UI dialog
|
|
||||||
$dialog.dialog({
|
|
||||||
modal: true,
|
|
||||||
resizable: true,
|
|
||||||
closeOnEscape: false,
|
|
||||||
title: rcmail.gettext((calendar.id ? 'editcalendar' : 'createcalendar'), 'calendar'),
|
|
||||||
open: function() {
|
|
||||||
$dialog.parent().find('.ui-dialog-buttonset .ui-button').first().addClass('mainaction');
|
|
||||||
},
|
|
||||||
close: function() {
|
|
||||||
$dialog.html('').dialog("destroy").hide();
|
|
||||||
},
|
|
||||||
buttons: buttons,
|
|
||||||
minWidth: 400,
|
|
||||||
width: 420
|
|
||||||
}).show();
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
this.calendar_remove = function(calendar)
|
this.calendar_remove = function(calendar)
|
||||||
|
@ -2951,10 +2941,12 @@ function rcube_calendar_ui(settings)
|
||||||
|
|
||||||
this.calendar_delete = function(calendar)
|
this.calendar_delete = function(calendar)
|
||||||
{
|
{
|
||||||
if (confirm(rcmail.gettext(calendar.children ? 'deletecalendarconfirmrecursive' : 'deletecalendarconfirm', 'calendar'))) {
|
var label = calendar.children ? 'deletecalendarconfirmrecursive' : 'deletecalendarconfirm';
|
||||||
|
rcmail.confirm_dialog(rcmail.gettext(label, 'calendar'), 'delete', function() {
|
||||||
rcmail.http_post('calendar', { action:'delete', c:{ id:calendar.id } });
|
rcmail.http_post('calendar', { action:'delete', c:{ id:calendar.id } });
|
||||||
return true;
|
return true;
|
||||||
}
|
});
|
||||||
|
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3007,33 +2999,39 @@ function rcube_calendar_ui(settings)
|
||||||
if (calendar)
|
if (calendar)
|
||||||
$('#event-import-calendar').val(calendar.id);
|
$('#event-import-calendar').val(calendar.id);
|
||||||
|
|
||||||
var buttons = {};
|
var buttons = [
|
||||||
buttons[rcmail.gettext('import', 'calendar')] = function() {
|
{
|
||||||
if (form && form.elements._data.value) {
|
text: rcmail.gettext('import', 'calendar'),
|
||||||
rcmail.async_upload_form(form, 'import_events', function(e) {
|
'class' : 'mainaction import',
|
||||||
rcmail.set_busy(false, null, me.saving_lock);
|
click: function() {
|
||||||
$('.ui-dialog-buttonpane button', $dialog.parent()).button('enable');
|
if (form && form.elements._data.value) {
|
||||||
|
rcmail.async_upload_form(form, 'import_events', function(e) {
|
||||||
|
rcmail.set_busy(false, null, me.saving_lock);
|
||||||
|
$('.ui-dialog-buttonpane button', $dialog.parent()).button('enable');
|
||||||
|
|
||||||
// display error message if no sophisticated response from server arrived (e.g. iframe load error)
|
// display error message if no sophisticated response from server arrived (e.g. iframe load error)
|
||||||
if (me.import_succeeded === null)
|
if (me.import_succeeded === null)
|
||||||
rcmail.display_message(rcmail.get_label('importerror', 'calendar'), 'error');
|
rcmail.display_message(rcmail.get_label('importerror', 'calendar'), 'error');
|
||||||
});
|
});
|
||||||
|
|
||||||
// display upload indicator (with extended timeout)
|
// display upload indicator (with extended timeout)
|
||||||
var timeout = rcmail.env.request_timeout;
|
var timeout = rcmail.env.request_timeout;
|
||||||
rcmail.env.request_timeout = 600;
|
rcmail.env.request_timeout = 600;
|
||||||
me.import_succeeded = null;
|
me.import_succeeded = null;
|
||||||
me.saving_lock = rcmail.set_busy(true, 'uploading');
|
me.saving_lock = rcmail.set_busy(true, 'uploading');
|
||||||
$('.ui-dialog-buttonpane button', $dialog.parent()).button('disable');
|
$('.ui-dialog-buttonpane button', $dialog.parent()).button('disable');
|
||||||
|
|
||||||
// restore settings
|
// restore settings
|
||||||
rcmail.env.request_timeout = timeout;
|
rcmail.env.request_timeout = timeout;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: rcmail.gettext('cancel', 'calendar'),
|
||||||
|
'class': 'cancel',
|
||||||
|
click: function() { $dialog.dialog("close"); }
|
||||||
}
|
}
|
||||||
};
|
];
|
||||||
|
|
||||||
buttons[rcmail.gettext('cancel', 'calendar')] = function() {
|
|
||||||
$dialog.dialog("close");
|
|
||||||
};
|
|
||||||
|
|
||||||
// open jquery UI dialog
|
// open jquery UI dialog
|
||||||
$dialog.dialog({
|
$dialog.dialog({
|
||||||
|
@ -3041,9 +3039,6 @@ function rcube_calendar_ui(settings)
|
||||||
resizable: false,
|
resizable: false,
|
||||||
closeOnEscape: false,
|
closeOnEscape: false,
|
||||||
title: rcmail.gettext('importevents', 'calendar'),
|
title: rcmail.gettext('importevents', 'calendar'),
|
||||||
open: function() {
|
|
||||||
$dialog.parent().find('.ui-dialog-buttonset .ui-button').first().addClass('mainaction');
|
|
||||||
},
|
|
||||||
close: function() {
|
close: function() {
|
||||||
$('.ui-dialog-buttonpane button', $dialog.parent()).button('enable');
|
$('.ui-dialog-buttonpane button', $dialog.parent()).button('enable');
|
||||||
$dialog.dialog("destroy").hide();
|
$dialog.dialog("destroy").hide();
|
||||||
|
@ -3094,26 +3089,32 @@ function rcube_calendar_ui(settings)
|
||||||
input.select();
|
input.select();
|
||||||
})
|
})
|
||||||
|
|
||||||
var buttons = {};
|
var buttons = [
|
||||||
buttons[rcmail.gettext('export', 'calendar')] = function() {
|
{
|
||||||
if (form) {
|
text: rcmail.gettext('export', 'calendar'),
|
||||||
var start = 0, range = $('#event-export-range option:selected', this).val(),
|
'class': 'mainaction export',
|
||||||
source = $('#event-export-calendar option:selected').val(),
|
click: function() {
|
||||||
attachmt = $('#event-export-attachments').get(0).checked;
|
if (form) {
|
||||||
|
var start = 0, range = $('#event-export-range option:selected', this).val(),
|
||||||
|
source = $('#event-export-calendar option:selected').val(),
|
||||||
|
attachmt = $('#event-export-attachments').get(0).checked;
|
||||||
|
|
||||||
if (range == 'custom')
|
if (range == 'custom')
|
||||||
start = date2unixtime(parse_datetime('00:00', $('#event-export-startdate').val()));
|
start = date2unixtime(parse_datetime('00:00', $('#event-export-startdate').val()));
|
||||||
else if (range > 0)
|
else if (range > 0)
|
||||||
start = 'today -' + range + ' months';
|
start = 'today -' + range + ' months';
|
||||||
|
|
||||||
rcmail.goto_url('export_events', { source:source, start:start, attachments:attachmt?1:0 });
|
rcmail.goto_url('export_events', { source:source, start:start, attachments:attachmt?1:0 });
|
||||||
|
}
|
||||||
|
$dialog.dialog("close");
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: rcmail.gettext('cancel', 'calendar'),
|
||||||
|
'class': 'cancel',
|
||||||
|
click: function() { $dialog.dialog("close"); }
|
||||||
}
|
}
|
||||||
$dialog.dialog("close");
|
];
|
||||||
};
|
|
||||||
|
|
||||||
buttons[rcmail.gettext('cancel', 'calendar')] = function() {
|
|
||||||
$dialog.dialog("close");
|
|
||||||
};
|
|
||||||
|
|
||||||
// open jquery UI dialog
|
// open jquery UI dialog
|
||||||
$dialog.dialog({
|
$dialog.dialog({
|
||||||
|
@ -3121,9 +3122,6 @@ function rcube_calendar_ui(settings)
|
||||||
resizable: false,
|
resizable: false,
|
||||||
closeOnEscape: false,
|
closeOnEscape: false,
|
||||||
title: rcmail.gettext('exporttitle', 'calendar'),
|
title: rcmail.gettext('exporttitle', 'calendar'),
|
||||||
open: function() {
|
|
||||||
$dialog.parent().find('.ui-dialog-buttonset .ui-button').first().addClass('mainaction');
|
|
||||||
},
|
|
||||||
close: function() {
|
close: function() {
|
||||||
$('.ui-dialog-buttonpane button', $dialog.parent()).button('enable');
|
$('.ui-dialog-buttonpane button', $dialog.parent()).button('enable');
|
||||||
$dialog.dialog("destroy").hide();
|
$dialog.dialog("destroy").hide();
|
||||||
|
@ -3175,53 +3173,33 @@ function rcube_calendar_ui(settings)
|
||||||
// show URL of the given calendar in a dialog box
|
// show URL of the given calendar in a dialog box
|
||||||
this.showurl = function(calendar)
|
this.showurl = function(calendar)
|
||||||
{
|
{
|
||||||
var $dialog = $('#calendarurlbox');
|
|
||||||
|
|
||||||
if ($dialog.is(':ui-dialog'))
|
|
||||||
$dialog.dialog('close');
|
|
||||||
|
|
||||||
if (calendar.feedurl) {
|
if (calendar.feedurl) {
|
||||||
|
var dialog = $('#calendarurlbox').clone(true);
|
||||||
|
|
||||||
if (calendar.caldavurl) {
|
if (calendar.caldavurl) {
|
||||||
$('#caldavurl').val(calendar.caldavurl);
|
$('#caldavurl', dialog).val(calendar.caldavurl);
|
||||||
$('#calendarcaldavurl').show();
|
$('#calendarcaldavurl', dialog).show();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$('#calendarcaldavurl').hide();
|
$('#calendarcaldavurl', dialog).hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
$dialog.dialog({
|
rcmail.simple_dialog(dialog, rcmail.gettext('showurl', 'calendar'), null, {
|
||||||
resizable: true,
|
open: function() { $('#calfeedurl', dialog).val(calendar.feedurl).select(); },
|
||||||
closeOnEscape: true,
|
cancel_button: 'close'
|
||||||
title: rcmail.gettext('showurl', 'calendar'),
|
});
|
||||||
close: function() {
|
|
||||||
$dialog.dialog("destroy").hide();
|
|
||||||
},
|
|
||||||
width: 520
|
|
||||||
}).show();
|
|
||||||
|
|
||||||
$('#calfeedurl').val(calendar.feedurl).select();
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
// show free-busy URL in a dialog box
|
// show free-busy URL in a dialog box
|
||||||
this.showfburl = function()
|
this.showfburl = function()
|
||||||
{
|
{
|
||||||
var $dialog = $('#fburlbox');
|
var dialog = $('#fburlbox').clone(true);
|
||||||
|
|
||||||
if ($dialog.is(':ui-dialog'))
|
rcmail.simple_dialog(dialog, rcmail.gettext('showfburl', 'calendar'), null, {
|
||||||
$dialog.dialog('close');
|
open: function() { $('#fburl', dialog).val(settings.freebusy_url).select(); },
|
||||||
|
cancel_button: 'close'
|
||||||
$dialog.dialog({
|
});
|
||||||
resizable: true,
|
|
||||||
closeOnEscape: true,
|
|
||||||
title: rcmail.gettext('showfburl', 'calendar'),
|
|
||||||
close: function() {
|
|
||||||
$dialog.dialog("destroy").hide();
|
|
||||||
},
|
|
||||||
width: 520
|
|
||||||
}).show();
|
|
||||||
|
|
||||||
$('#fburl').val(settings.freebusy_url).select();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
// refresh the calendar view after saving event data
|
// refresh the calendar view after saving event data
|
||||||
|
@ -3736,6 +3714,16 @@ function rcube_calendar_ui(settings)
|
||||||
me.calendar_edit_dialog(me.calendars[id]);
|
me.calendar_edit_dialog(me.calendars[id]);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// Make Elastic checkboxes pretty
|
||||||
|
if (window.UI && UI.pretty_checkbox) {
|
||||||
|
$(rcmail.gui_objects.calendarslist).find('input[type=checkbox]').each(function() {
|
||||||
|
UI.pretty_checkbox($(this).addClass('flex-checkbox'));
|
||||||
|
});
|
||||||
|
calendars_list.addEventListener('add-item', function(prop) {
|
||||||
|
UI.pretty_checkbox($(prop.li).find('input').addClass('flex-checkbox'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
// select default calendar
|
// select default calendar
|
||||||
if (rcmail.env.source && this.calendars[rcmail.env.source])
|
if (rcmail.env.source && this.calendars[rcmail.env.source])
|
||||||
this.selected_calendar = rcmail.env.source;
|
this.selected_calendar = rcmail.env.source;
|
||||||
|
@ -4018,7 +4006,7 @@ function rcube_calendar_ui(settings)
|
||||||
// reload free-busy status when changing the organizer identity
|
// reload free-busy status when changing the organizer identity
|
||||||
$('#eventedit').on('change', '#edit-identities-list', function(e) {
|
$('#eventedit').on('change', '#edit-identities-list', function(e) {
|
||||||
var email = settings.identities[$(this).val()],
|
var email = settings.identities[$(this).val()],
|
||||||
icon = $(this).closest('tr').find('img.availabilityicon');
|
icon = $(this).closest('tr').find('.availability > *');
|
||||||
|
|
||||||
if (email && icon.length) {
|
if (email && icon.length) {
|
||||||
icon.attr('data-email', email);
|
icon.attr('data-email', email);
|
||||||
|
@ -4091,11 +4079,11 @@ function rcube_calendar_ui(settings)
|
||||||
event_freebusy_dialog();
|
event_freebusy_dialog();
|
||||||
});
|
});
|
||||||
|
|
||||||
$('#shedule-freebusy-prev').html(bw.ie6 ? '<<' : '◄').button().click(function(){ render_freebusy_grid(-1); });
|
$('#schedule-freebusy-prev').html('◄').button().click(function(){ render_freebusy_grid(-1); });
|
||||||
$('#shedule-freebusy-next').html(bw.ie6 ? '>>' : '►').button().click(function(){ render_freebusy_grid(1); }).parent().buttonset();
|
$('#schedule-freebusy-next').html('►').button().click(function(){ render_freebusy_grid(1); }).parent();//FIXME .buttonset();
|
||||||
|
|
||||||
$('#shedule-find-prev').button().click(function(){ freebusy_find_slot(-1); });
|
$('#schedule-find-prev').button().click(function(){ freebusy_find_slot(-1); });
|
||||||
$('#shedule-find-next').button().click(function(){ freebusy_find_slot(1); });
|
$('#schedule-find-next').button().click(function(){ freebusy_find_slot(1); });
|
||||||
|
|
||||||
$('#schedule-freebusy-workinghours').click(function(){
|
$('#schedule-freebusy-workinghours').click(function(){
|
||||||
freebusy_ui.workinhoursonly = this.checked;
|
freebusy_ui.workinhoursonly = this.checked;
|
||||||
|
@ -4166,17 +4154,6 @@ function rcube_calendar_ui(settings)
|
||||||
// add proprietary css styles if not IE
|
// add proprietary css styles if not IE
|
||||||
if (!bw.ie)
|
if (!bw.ie)
|
||||||
$('div.fc-content').addClass('rcube-fc-content');
|
$('div.fc-content').addClass('rcube-fc-content');
|
||||||
|
|
||||||
// IE supresses 2nd click event when double-clicking
|
|
||||||
if (bw.ie && bw.vendver < 9) {
|
|
||||||
$('div.fc-content').bind('dblclick', function(e){
|
|
||||||
if (!$(this).hasClass('fc-widget-header') && fc.fullCalendar('getView').name != 'table') {
|
|
||||||
var date = fc.fullCalendar('getDate');
|
|
||||||
var enddate = new Date(); enddate.setTime(date.getTime() + DAY_MS - 60000);
|
|
||||||
event_edit_dialog('new', { start:date, end:enddate, allDay:true, calendar:me.selected_calendar });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} // end rcube_calendar class
|
} // end rcube_calendar class
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
"role": "Lead"
|
"role": "Lead"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Alensader Machniak",
|
"name": "Aleksander Machniak",
|
||||||
"email": "machniak@kolabsys.com",
|
"email": "machniak@kolabsys.com",
|
||||||
"role": "Developer"
|
"role": "Developer"
|
||||||
}
|
}
|
||||||
|
|
|
@ -2358,7 +2358,8 @@ class kolab_driver extends calendar_driver
|
||||||
|
|
||||||
// General tab
|
// General tab
|
||||||
$form['props'] = array(
|
$form['props'] = array(
|
||||||
'name' => $this->rc->gettext('properties'),
|
'name' => $this->rc->gettext('properties'),
|
||||||
|
'content' => array(),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Disable folder name input
|
// Disable folder name input
|
||||||
|
@ -2369,12 +2370,7 @@ class kolab_driver extends calendar_driver
|
||||||
}
|
}
|
||||||
|
|
||||||
// calendar name (default field)
|
// calendar name (default field)
|
||||||
$form['props']['fieldsets']['location'] = array(
|
$form['props']['content']['location'] = $formfields['name'];
|
||||||
'name' => $this->rc->gettext('location'),
|
|
||||||
'content' => array(
|
|
||||||
'name' => $formfields['name']
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!empty($options) && ($options['norename'] || $options['protected'])) {
|
if (!empty($options) && ($options['norename'] || $options['protected'])) {
|
||||||
// prevent user from moving folder
|
// prevent user from moving folder
|
||||||
|
@ -2382,7 +2378,7 @@ class kolab_driver extends calendar_driver
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
$select = kolab_storage::folder_selector('event', array('name' => 'parent', 'id' => 'calendar-parent'), $folder);
|
$select = kolab_storage::folder_selector('event', array('name' => 'parent', 'id' => 'calendar-parent'), $folder);
|
||||||
$form['props']['fieldsets']['location']['content']['path'] = array(
|
$form['props']['content']['path'] = array(
|
||||||
'id' => 'calendar-parent',
|
'id' => 'calendar-parent',
|
||||||
'label' => $this->cal->gettext('parentcalendar'),
|
'label' => $this->cal->gettext('parentcalendar'),
|
||||||
'value' => $select->show(strlen($folder) ? $path_imap : ''),
|
'value' => $select->show(strlen($folder) ? $path_imap : ''),
|
||||||
|
@ -2390,25 +2386,13 @@ class kolab_driver extends calendar_driver
|
||||||
}
|
}
|
||||||
|
|
||||||
// calendar color (default field)
|
// calendar color (default field)
|
||||||
$form['props']['fieldsets']['settings'] = array(
|
$form['props']['content']['color'] = $formfields['color'];
|
||||||
'name' => $this->rc->gettext('settings'),
|
$form['props']['content']['alarms'] = $formfields['showalarms'];
|
||||||
'content' => array(
|
|
||||||
'color' => $formfields['color'],
|
|
||||||
'showalarms' => $formfields['showalarms'],
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
if ($action != 'form-new') {
|
if ($action != 'form-new') {
|
||||||
$form['sharing'] = array(
|
$form['sharing'] = array(
|
||||||
'name' => rcube::Q($this->cal->gettext('tabsharing')),
|
'name' => rcube::Q($this->cal->gettext('tabsharing')),
|
||||||
'content' => html::tag('iframe', array(
|
'content' => $this->folder_acl_form($folder)
|
||||||
'src' => $this->cal->rc->url(array('_action' => 'calendar-acl', 'id' => $calendar['id'], 'framed' => 1)),
|
|
||||||
'width' => '100%',
|
|
||||||
'height' => 350,
|
|
||||||
'border' => 0,
|
|
||||||
'style' => 'border:0'),
|
|
||||||
''),
|
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2422,35 +2406,30 @@ class kolab_driver extends calendar_driver
|
||||||
|
|
||||||
// Create form output
|
// Create form output
|
||||||
foreach ($form as $tab) {
|
foreach ($form as $tab) {
|
||||||
if (!empty($tab['fieldsets']) && is_array($tab['fieldsets'])) {
|
if ($content = $this->get_form_part($tab)) {
|
||||||
$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";
|
$this->form_html .= html::tag('fieldset', null, html::tag('legend', null, rcube::Q($tab['name'])) . $content) ."\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Parse form template for skin-dependent stuff
|
return $this->form_html;
|
||||||
$this->rc->output->add_handler('calendarform', array($this, 'calendar_form_html'));
|
|
||||||
return $this->rc->output->parse('calendar.kolabform', false, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Handler for template object
|
* Returns ACL form
|
||||||
*/
|
*/
|
||||||
public function calendar_form_html()
|
public function folder_acl_form($folder)
|
||||||
{
|
{
|
||||||
return $this->form_html;
|
if (strlen($folder)) {
|
||||||
|
$this->cal->require_plugin('acl');
|
||||||
|
$storage = $this->rc->get_storage();
|
||||||
|
$options = $storage->folder_info($folder);
|
||||||
|
|
||||||
|
// get sharing UI from acl plugin
|
||||||
|
$acl = $this->rc->plugins->exec_hook('folder_form',
|
||||||
|
array('form' => array(), 'options' => $options, 'name' => $folder));
|
||||||
|
}
|
||||||
|
|
||||||
|
return $acl['form']['sharing']['content'] ?: html::div('hint', $this->cal->gettext('aclnorights'));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -2461,7 +2440,7 @@ class kolab_driver extends calendar_driver
|
||||||
$content = '';
|
$content = '';
|
||||||
|
|
||||||
if (is_array($form['content']) && !empty($form['content'])) {
|
if (is_array($form['content']) && !empty($form['content'])) {
|
||||||
$table = new html_table(array('cols' => 2));
|
$table = new html_table(array('cols' => 2, 'class' => 'propform'));
|
||||||
foreach ($form['content'] as $col => $colprop) {
|
foreach ($form['content'] as $col => $colprop) {
|
||||||
$label = !empty($colprop['label']) ? $colprop['label'] : $this->cal->gettext($col);
|
$label = !empty($colprop['label']) ? $colprop['label'] : $this->cal->gettext($col);
|
||||||
|
|
||||||
|
|
|
@ -311,8 +311,8 @@ class calendar_ui
|
||||||
if (!$activeonly || $prop['active']) {
|
if (!$activeonly || $prop['active']) {
|
||||||
$label_id = 'cl:' . $id;
|
$label_id = 'cl:' . $id;
|
||||||
$content = html::div(join(' ', $classes),
|
$content = html::div(join(' ', $classes),
|
||||||
html::span(array('class' => 'calname', 'id' => $label_id, 'title' => $title), $prop['editname'] ? rcube::Q($prop['editname']) : $prop['listname']) .
|
html::a(array('class' => 'calname', 'id' => $label_id, 'title' => $title, 'href' => '#'), rcube::Q($prop['editname'] ?: $prop['listname']))
|
||||||
($prop['virtual'] ? '' :
|
. ($prop['virtual'] ? '' :
|
||||||
html::tag('input', array('type' => 'checkbox', 'name' => '_cal[]', 'value' => $id, 'checked' => $prop['active'], 'aria-labelledby' => $label_id), '') .
|
html::tag('input', array('type' => 'checkbox', 'name' => '_cal[]', 'value' => $id, 'checked' => $prop['active'], 'aria-labelledby' => $label_id), '') .
|
||||||
html::span('actions',
|
html::span('actions',
|
||||||
($prop['removable'] ? html::a(array('href' => '#', 'class' => 'remove', 'title' => $this->cal->gettext('removelist')), ' ') : '') .
|
($prop['removable'] ? html::a(array('href' => '#', 'class' => 'remove', 'title' => $this->cal->gettext('removelist')), ' ') : '') .
|
||||||
|
@ -335,7 +335,7 @@ class calendar_ui
|
||||||
$attrib += array('id' => 'agendaoptions');
|
$attrib += array('id' => 'agendaoptions');
|
||||||
$attrib['style'] .= 'display:none';
|
$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);
|
$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)
|
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);
|
$select_range->add($days . ' ' . preg_replace('/\(|\)/', '', $this->cal->lib->gettext('days')), $days);
|
||||||
|
@ -343,7 +343,7 @@ class calendar_ui
|
||||||
$html .= html::label('agenda-listrange', $this->cal->gettext('listrange'));
|
$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']));
|
$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'));
|
$select_sections = new html_select(array('name' => 'listsections', 'id' => 'agenda-listsections', 'class' => 'form-control'));
|
||||||
$select_sections->add('---', '');
|
$select_sections->add('---', '');
|
||||||
foreach (array('day' => 'libcalendaring.days', 'week' => 'libcalendaring.weeks', 'month' => 'libcalendaring.months', 'smart' => 'calendar.smartsections') as $val => $label)
|
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);
|
$select_sections->add(preg_replace('/\(|\)/', '', ucfirst($this->rc->gettext($label))), $val);
|
||||||
|
@ -570,12 +570,11 @@ class calendar_ui
|
||||||
if (!$attrib['id'])
|
if (!$attrib['id'])
|
||||||
$attrib['id'] = 'rcmExportForm';
|
$attrib['id'] = 'rcmExportForm';
|
||||||
|
|
||||||
$html .= html::div('form-section',
|
$html = html::div('form-section form-group row',
|
||||||
html::label('event-export-calendar', $this->cal->gettext('calendar')) .
|
html::label(array('for' => 'event-export-calendar', 'class' => 'col-sm-4 col-form-label'), $this->cal->gettext('calendar'))
|
||||||
$this->calendar_select(array('name' => 'calendar', 'id' => 'event-export-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(
|
$select->add(array(
|
||||||
$this->cal->gettext('all'),
|
$this->cal->gettext('all'),
|
||||||
$this->cal->gettext('onemonthback'),
|
$this->cal->gettext('onemonthback'),
|
||||||
|
@ -589,22 +588,22 @@ class calendar_ui
|
||||||
|
|
||||||
$startdate = new html_inputfield(array('name' => 'start', 'size' => 11, 'id' => 'event-export-startdate'));
|
$startdate = new html_inputfield(array('name' => 'start', 'size' => 11, 'id' => 'event-export-startdate'));
|
||||||
|
|
||||||
$html .= html::div('form-section',
|
$html .= html::div('form-section form-group row',
|
||||||
html::label('event-export-range', $this->cal->gettext('exportrange')) .
|
html::label(array('for' => 'event-export-range', 'class' => 'col-sm-4 col-form-label'), $this->cal->gettext('exportrange'))
|
||||||
$select->show(0) .
|
. html::div('col-sm-8', $select->show(0) . html::span(array('style'=>'display:none'), $startdate->show())));
|
||||||
html::span(array('style'=>'display:none'), $startdate->show())
|
|
||||||
);
|
|
||||||
|
|
||||||
$checkbox = new html_checkbox(array('name' => 'attachments', 'id' => 'event-export-attachments', 'value' => 1));
|
$checkbox = new html_checkbox(array('name' => 'attachments', 'id' => 'event-export-attachments', 'value' => 1));
|
||||||
$html .= html::div('form-section',
|
$html .= html::div('form-section form-group row',
|
||||||
html::label('event-export-attachments', $this->cal->gettext('exportattachments')) .
|
html::label(array('for' => 'event-export-attachments', 'class' => 'col-sm-4 col-form-label'), $this->cal->gettext('exportattachments'))
|
||||||
$checkbox->show(1)
|
. html::div('col-sm-8', $checkbox->show(1)));
|
||||||
);
|
|
||||||
|
|
||||||
$this->rc->output->add_gui_object('exportform', $attrib['id']);
|
$this->rc->output->add_gui_object('exportform', $attrib['id']);
|
||||||
|
|
||||||
return html::tag('form', array('action' => $this->rc->url(array('task' => 'calendar', 'action' => 'export_events')),
|
return html::tag('form', $attrib + array(
|
||||||
'method' => "post", 'id' => $attrib['id']),
|
'action' => $this->rc->url(array('task' => 'calendar', 'action' => 'export_events')),
|
||||||
|
'method' => "post",
|
||||||
|
'id' => $attrib['id']
|
||||||
|
),
|
||||||
$html
|
$html
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
@ -674,21 +673,37 @@ class calendar_ui
|
||||||
* The form content could be overriden by the driver
|
* The form content could be overriden by the driver
|
||||||
*/
|
*/
|
||||||
function calendar_editform($action, $calendar = array())
|
function calendar_editform($action, $calendar = array())
|
||||||
|
{
|
||||||
|
$this->action = $action;
|
||||||
|
$this->calendar = $calendar;
|
||||||
|
|
||||||
|
// load miniColors js/css files
|
||||||
|
jqueryui::miniColors();
|
||||||
|
|
||||||
|
$this->rc->output->add_handler('calendarform', array($this, 'calendarform'));
|
||||||
|
$this->rc->output->send('calendar.folderform');
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handler for calendar form template.
|
||||||
|
* The form content could be overriden by the driver
|
||||||
|
*/
|
||||||
|
function calendarform($attrib)
|
||||||
{
|
{
|
||||||
// compose default calendar form fields
|
// compose default calendar form fields
|
||||||
$input_name = new html_inputfield(array('name' => 'name', 'id' => 'calendar-name', 'size' => 20));
|
$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_color = new html_inputfield(array('name' => 'color', 'id' => 'calendar-color', 'size' => 7, 'class' => 'colors'));
|
||||||
|
|
||||||
$formfields = array(
|
$formfields = array(
|
||||||
'name' => array(
|
'name' => array(
|
||||||
'label' => $this->cal->gettext('name'),
|
'label' => $this->cal->gettext('name'),
|
||||||
'value' => $input_name->show($calendar['name']),
|
'value' => $input_name->show($calendar['name']),
|
||||||
'id' => 'calendar-name',
|
'id' => 'calendar-name',
|
||||||
),
|
),
|
||||||
'color' => array(
|
'color' => array(
|
||||||
'label' => $this->cal->gettext('color'),
|
'label' => $this->cal->gettext('color'),
|
||||||
'value' => $input_color->show($calendar['color']),
|
'value' => $input_color->show($calendar['color']),
|
||||||
'id' => 'calendar-color',
|
'id' => 'calendar-color',
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -696,14 +711,14 @@ class calendar_ui
|
||||||
$checkbox = new html_checkbox(array('name' => 'showalarms', 'id' => 'calendar-showalarms', 'value' => 1));
|
$checkbox = new html_checkbox(array('name' => 'showalarms', 'id' => 'calendar-showalarms', 'value' => 1));
|
||||||
$formfields['showalarms'] = array(
|
$formfields['showalarms'] = array(
|
||||||
'label' => $this->cal->gettext('showalarms'),
|
'label' => $this->cal->gettext('showalarms'),
|
||||||
'value' => $checkbox->show($calendar['showalarms']?1:0),
|
'value' => $checkbox->show($this->calendar['showalarms'] ? 1 :0),
|
||||||
'id' => 'calendar-showalarms',
|
'id' => 'calendar-showalarms',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
// allow driver to extend or replace the form content
|
// allow driver to extend or replace the form content
|
||||||
return html::tag('form', array('action' => "#", 'method' => "get", 'id' => 'calendarpropform'),
|
return html::tag('form', $attrib + array('action' => "#", 'method' => "get", 'id' => 'calendarpropform'),
|
||||||
$this->cal->driver->calendar_form($action, $calendar, $formfields)
|
$this->cal->driver->calendar_form($this->action, $this->calendar, $formfields)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -743,12 +758,12 @@ class calendar_ui
|
||||||
*/
|
*/
|
||||||
function attendees_form($attrib = array())
|
function attendees_form($attrib = array())
|
||||||
{
|
{
|
||||||
$input = new html_inputfield(array('name' => 'participant', 'id' => 'edit-attendee-name', 'size' => 30));
|
$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',
|
$textarea = new html_textarea(array('name' => 'comment', 'id' => 'edit-attendees-comment', 'class' => 'form-control',
|
||||||
'rows' => 4, 'cols' => 55, 'title' => $this->cal->gettext('itipcommenttitle')));
|
'rows' => 4, 'cols' => 55, 'title' => $this->cal->gettext('itipcommenttitle')));
|
||||||
|
|
||||||
return html::div($attrib,
|
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-add', 'value' => $this->cal->gettext('addattendee'))) . " " .
|
||||||
html::tag('input', array('type' => 'button', 'class' => 'button', 'id' => 'edit-attendee-schedule', 'value' => $this->cal->gettext('scheduletime').'...'))) .
|
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(null, $this->cal->gettext('itipcomment') . $textarea->show()))
|
||||||
|
@ -760,10 +775,10 @@ class calendar_ui
|
||||||
*/
|
*/
|
||||||
function resources_form($attrib = array())
|
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,
|
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-add', 'value' => $this->cal->gettext('addresource'))) . " " .
|
||||||
html::tag('input', array('type' => 'button', 'class' => 'button', 'id' => 'edit-resource-find', 'value' => $this->cal->gettext('findresources').'...')))
|
html::tag('input', array('type' => 'button', 'class' => 'button', 'id' => 'edit-resource-find', 'value' => $this->cal->gettext('findresources').'...')))
|
||||||
);
|
);
|
||||||
|
|
|
@ -38,6 +38,7 @@ $labels['calendar'] = 'Calendar';
|
||||||
$labels['calendars'] = 'Calendars';
|
$labels['calendars'] = 'Calendars';
|
||||||
$labels['category'] = 'Category';
|
$labels['category'] = 'Category';
|
||||||
$labels['categories'] = 'Categories';
|
$labels['categories'] = 'Categories';
|
||||||
|
$labels['addcalendar'] = 'Add calendar';
|
||||||
$labels['createcalendar'] = 'Create new calendar';
|
$labels['createcalendar'] = 'Create new calendar';
|
||||||
$labels['editcalendar'] = 'Edit calendar properties';
|
$labels['editcalendar'] = 'Edit calendar properties';
|
||||||
$labels['name'] = 'Name';
|
$labels['name'] = 'Name';
|
||||||
|
|
|
@ -196,7 +196,7 @@ pre {
|
||||||
height: 22px;
|
height: 22px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#calendars .treelist li span.calname {
|
#calendars .treelist li a.calname {
|
||||||
display: block;
|
display: block;
|
||||||
padding: 0px 18px 2px 2px;
|
padding: 0px 18px 2px 2px;
|
||||||
position: absolute;
|
position: absolute;
|
||||||
|
@ -221,18 +221,18 @@ pre {
|
||||||
background-image: none;
|
background-image: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
#calendars .treelist li div.virtual > span.calname {
|
#calendars .treelist li div.virtual > a.calname {
|
||||||
color: #aaa;
|
color: #aaa;
|
||||||
top: 4px;
|
top: 4px;
|
||||||
left: 20px;
|
left: 20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#calendars .treelist li.x-birthdays span.calname,
|
#calendars .treelist li.x-birthdays a.calname,
|
||||||
#calendars .treelist li.x-invitations span.calname {
|
#calendars .treelist li.x-invitations a.calname {
|
||||||
font-style: italic;
|
font-style: italic;
|
||||||
}
|
}
|
||||||
|
|
||||||
#calendars .treelist.flat li span.calname {
|
#calendars .treelist.flat li a.calname {
|
||||||
left: 24px;
|
left: 24px;
|
||||||
right: 42px;
|
right: 42px;
|
||||||
}
|
}
|
||||||
|
@ -376,27 +376,27 @@ pre {
|
||||||
background-color: #c7e3ef;
|
background-color: #c7e3ef;
|
||||||
}
|
}
|
||||||
|
|
||||||
#calendars .treelist li.selected > span.calname {
|
#calendars .treelist li.selected > a.calname {
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
}
|
}
|
||||||
|
|
||||||
#calendars .treelist div.readonly span.calname {
|
#calendars .treelist div.readonly a.calname {
|
||||||
background-position: right -20px;
|
background-position: right -20px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#calendars .treelist li.user > div > span.calname {
|
#calendars .treelist li.user > div > a.calname {
|
||||||
background-position: right -38px;
|
background-position: right -38px;
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
#calendars .treelist div.user.readonly span.calname {
|
#calendars .treelist div.user.readonly a.calname {
|
||||||
background-position: right -56px;
|
background-position: right -56px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#calendars .treelist div.shared span.calname {
|
#calendars .treelist div.shared a.calname {
|
||||||
background-position: right -74px;
|
background-position: right -74px;
|
||||||
}
|
}
|
||||||
|
|
||||||
#calendars .treelist div.shared.readonly span.calname {
|
#calendars .treelist div.shared.readonly a.calname {
|
||||||
background-position: right -92px;
|
background-position: right -92px;
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -301,7 +301,7 @@
|
||||||
<div class="schedule-options">
|
<div class="schedule-options">
|
||||||
|
|
||||||
<div class="schedule-buttons">
|
<div class="schedule-buttons">
|
||||||
<button id="shedule-freebusy-prev" title="<roundcube:label name='previouspage' />">◄</button><button id="shedule-freebusy-next" title="<roundcube:label name='nextpage' />">►</button>
|
<button id="schedule-freebusy-prev" title="<roundcube:label name='previouspage' />">◄</button><button id="schedule-freebusy-next" title="<roundcube:label name='nextpage' />">►</button>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -319,8 +319,8 @@
|
||||||
</div>
|
</div>
|
||||||
<div style="float:left">
|
<div style="float:left">
|
||||||
<div class="schedule-find-buttons">
|
<div class="schedule-find-buttons">
|
||||||
<button id="shedule-find-prev">◄ <roundcube:label name="calendar.prevslot" /></button>
|
<button id="schedule-find-prev">◄ <roundcube:label name="calendar.prevslot" /></button>
|
||||||
<button id="shedule-find-next"><roundcube:label name="calendar.nextslot" /> ►</button>
|
<button id="schedule-find-next"><roundcube:label name="calendar.nextslot" /> ►</button>
|
||||||
</div>
|
</div>
|
||||||
<div class="schedule-options">
|
<div class="schedule-options">
|
||||||
<label><input type="checkbox" id="schedule-freebusy-workinghours" value="1" /><roundcube:label name="calendar.onlyworkinghours" /></label>
|
<label><input type="checkbox" id="schedule-freebusy-workinghours" value="1" /><roundcube:label name="calendar.onlyworkinghours" /></label>
|
||||||
|
|
|
@ -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>
|
|
|
@ -24,6 +24,5 @@
|
||||||
|
|
||||||
<roundcube:object name="plugin.calendar_css" printmode="true" />
|
<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>
|
</body>
|
||||||
</html>
|
</html>
|
|
@ -50,7 +50,7 @@ libkolab_audittrail.object_history_dialog = function(p)
|
||||||
|
|
||||||
// open jquery UI dialog
|
// open jquery UI dialog
|
||||||
$dialog.dialog({
|
$dialog.dialog({
|
||||||
modal: false,
|
modal: true,
|
||||||
resizable: true,
|
resizable: true,
|
||||||
closeOnEscape: true,
|
closeOnEscape: true,
|
||||||
title: p.title,
|
title: p.title,
|
||||||
|
|
|
@ -25,6 +25,56 @@
|
||||||
a.calendarlink:before {
|
a.calendarlink:before {
|
||||||
.font-icon-regular(@fa-var-calendar);
|
.font-icon-regular(@fa-var-calendar);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a.send:before {
|
||||||
|
content: @fa-var-paper-plane;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Icon for resources in autocompletion list
|
||||||
|
.listing.iconized li.resource > i:before {
|
||||||
|
content: @fa-var-cube;
|
||||||
|
}
|
||||||
|
|
||||||
|
.listing {
|
||||||
|
li {
|
||||||
|
& > div {
|
||||||
|
&.calendar .calname:before {
|
||||||
|
&:extend(.font-icon-class);
|
||||||
|
content: @fa-var-calendar-alt;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.calendar.cal---invitation--pending .calname:before,
|
||||||
|
&.calendar.cal---invitation--declined .calname:before {
|
||||||
|
.font-icon-regular(@fa-var-calendar-alt);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.calendar.cal-__bdays__ .calname:before {
|
||||||
|
content: @fa-var-birthday-cake;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.calendar.cal---invitation--pending,
|
||||||
|
&.calendar.cal---invitation--declined,
|
||||||
|
&.calendar.cal-__bdays__ {
|
||||||
|
a.quickview {
|
||||||
|
padding-right: .25rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.calname {
|
||||||
|
padding-right: 4em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.count {
|
||||||
|
right: 5.5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Calednars list element (color indicator) used in Larry
|
||||||
|
span.handle {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#calendarcategories {
|
#calendarcategories {
|
||||||
|
@ -88,3 +138,750 @@ fieldset.categories .input-group {
|
||||||
.event-date {
|
.event-date {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.calendar-datepicker {
|
||||||
|
// overwrite jQuery-UI datepicker styles
|
||||||
|
.ui-datepicker {
|
||||||
|
top: initial !important;
|
||||||
|
left: initial !important;
|
||||||
|
position: relative !important;
|
||||||
|
transform: unset;
|
||||||
|
box-shadow: none;
|
||||||
|
border: 0;
|
||||||
|
border-radius: 0;
|
||||||
|
width: auto;
|
||||||
|
min-width: auto !important;
|
||||||
|
font-size: .9rem;
|
||||||
|
background-color: @color-black-shade-bg;
|
||||||
|
|
||||||
|
td a {
|
||||||
|
font-size: .9rem !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-datepicker-header {
|
||||||
|
background-color: @color-black-shade-bg;
|
||||||
|
border-top: 1px solid @color-layout-border;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fullcalendar styles
|
||||||
|
.fc {
|
||||||
|
flex: auto !important;
|
||||||
|
|
||||||
|
.fc-header {
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-header-left {
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-header-right {
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-header-title {
|
||||||
|
h2 {
|
||||||
|
font-size: 1.5rem;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-content {
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-view {
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Cell Styles
|
||||||
|
|
||||||
|
.fc-widget-header, // <th>, usually
|
||||||
|
.fc-widget-content { // <td>, usually
|
||||||
|
border: 1px solid #ddd;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-cell-overlay { // semi-transparent rectangle while dragging
|
||||||
|
background: #bce8f1;
|
||||||
|
opacity: .3;
|
||||||
|
filter: alpha(opacity=30); /* for IE */
|
||||||
|
}
|
||||||
|
|
||||||
|
// Buttons
|
||||||
|
|
||||||
|
.fc-button {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 0 .6em;
|
||||||
|
overflow: hidden;
|
||||||
|
height: 1.9em;
|
||||||
|
line-height: 1.9em;
|
||||||
|
white-space: nowrap;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Our default prev/next buttons use HTML entities like ‹ › « »
|
||||||
|
// and we'll try to make them look good cross-browser.
|
||||||
|
|
||||||
|
.fc-text-arrow {
|
||||||
|
margin: 0 .1em;
|
||||||
|
font-size: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-button-prev .fc-text-arrow,
|
||||||
|
.fc-button-next .fc-text-arrow { // for ‹ ›
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// icon (for jquery ui)
|
||||||
|
|
||||||
|
.fc-button {
|
||||||
|
.fc-icon-wrap {
|
||||||
|
position: relative;
|
||||||
|
float: left;
|
||||||
|
top: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-icon {
|
||||||
|
position: relative;
|
||||||
|
float: left;
|
||||||
|
margin-top: -50%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Button states
|
||||||
|
// borrowed from twitter bootstrap (http://twitter.github.com/bootstrap/)
|
||||||
|
|
||||||
|
.fc-state-highlight { // <td> today cell, TODO: add .fc-today to <th>
|
||||||
|
background: #fcf8e3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-state-default {
|
||||||
|
border: 1px solid;
|
||||||
|
background-color: #f5f5f5;
|
||||||
|
|
||||||
|
&.fc-corner-left { // non-theme
|
||||||
|
border-top-left-radius: 4px;
|
||||||
|
border-bottom-left-radius: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.fc-corner-right { // non-theme
|
||||||
|
border-top-right-radius: 4px;
|
||||||
|
border-bottom-right-radius: 4px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-state-hover,
|
||||||
|
.fc-state-down,
|
||||||
|
.fc-state-active,
|
||||||
|
.fc-state-disabled {
|
||||||
|
color: #333333;
|
||||||
|
background-color: #e6e6e6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-state-hover {
|
||||||
|
color: #333333;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-state-down,
|
||||||
|
.fc-state-active {
|
||||||
|
background-color: #cccccc;
|
||||||
|
outline: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-state-disabled {
|
||||||
|
cursor: default;
|
||||||
|
background-image: none;
|
||||||
|
opacity: 0.65;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Global Event Styles
|
||||||
|
|
||||||
|
.fc-event-container {
|
||||||
|
& > * {
|
||||||
|
z-index: 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
& > .ui-draggable-dragging,
|
||||||
|
& > .ui-resizable-resizing {
|
||||||
|
z-index: 9;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-event {
|
||||||
|
border: 1px solid #3a87ad; // default BORDER color
|
||||||
|
background-color: #3a87ad; // default BACKGROUND color
|
||||||
|
color: #fff; // default TEXT color
|
||||||
|
font-size: .85em;
|
||||||
|
cursor: default;
|
||||||
|
|
||||||
|
&:focus {
|
||||||
|
outline: 2px solid ActiveBorder;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-rtl & {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a.fc-event {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.fc-event,
|
||||||
|
.fc-event-draggable {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-event-inner {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-event-time,
|
||||||
|
.fc-event-title {
|
||||||
|
padding: 0 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ui-resizable-handle {
|
||||||
|
display: block;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 99999;
|
||||||
|
font-size: 300%;
|
||||||
|
line-height: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Horizontal Events
|
||||||
|
|
||||||
|
.fc-event-hori {
|
||||||
|
border-width: 1px 0;
|
||||||
|
margin-bottom: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-ltr .fc-event-hori.fc-event-start,
|
||||||
|
.fc-rtl .fc-event-hori.fc-event-end {
|
||||||
|
border-left-width: 1px;
|
||||||
|
border-top-left-radius: 3px;
|
||||||
|
border-bottom-left-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-ltr .fc-event-hori.fc-event-end,
|
||||||
|
.fc-rtl .fc-event-hori.fc-event-start {
|
||||||
|
border-right-width: 1px;
|
||||||
|
border-top-right-radius: 3px;
|
||||||
|
border-bottom-right-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// resizable
|
||||||
|
|
||||||
|
.fc-event-hori .ui-resizable-e {
|
||||||
|
top: 0 !important; // importants override pre jquery ui 1.7 styles
|
||||||
|
right: -3px !important;
|
||||||
|
width: 7px !important;
|
||||||
|
height: 100% !important;
|
||||||
|
cursor: e-resize;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-event-hori .ui-resizable-w {
|
||||||
|
top: 0 !important;
|
||||||
|
left: -3px !important;
|
||||||
|
width: 7px !important;
|
||||||
|
height: 100% !important;
|
||||||
|
cursor: w-resize;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reusable Separate-border Table
|
||||||
|
|
||||||
|
.fc-border-separate {
|
||||||
|
border-collapse: separate;
|
||||||
|
|
||||||
|
|
||||||
|
th,
|
||||||
|
td {
|
||||||
|
border-width: 1px 0 0 1px;
|
||||||
|
|
||||||
|
&.fc-last {
|
||||||
|
border-right-width: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.fc-last th,
|
||||||
|
tr.fc-last td {
|
||||||
|
border-bottom-width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tbody tr.fc-first td,
|
||||||
|
tbody tr.fc-first th {
|
||||||
|
border-top-width: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Month View, Basic Week View, Basic Day View
|
||||||
|
|
||||||
|
.fc-week-number {
|
||||||
|
width: 22px;
|
||||||
|
text-align: center;
|
||||||
|
|
||||||
|
div {
|
||||||
|
padding: 0 2px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-grid {
|
||||||
|
th {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-day-number {
|
||||||
|
float: right;
|
||||||
|
padding: 0 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-other-month .fc-day-number {
|
||||||
|
opacity: 0.3;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-day-content {
|
||||||
|
clear: both;
|
||||||
|
padding: 2px 2px 1px; // distance between events and day edges
|
||||||
|
}
|
||||||
|
|
||||||
|
// event styles
|
||||||
|
.fc-event-time {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
// right-to-left
|
||||||
|
.fc-rtl & .fc-day-number {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-rtl & .fc-event-time {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-more-link {
|
||||||
|
font-size: 0.85em;
|
||||||
|
white-space: nowrap;
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Agenda Week View, Agenda Day View
|
||||||
|
|
||||||
|
.fc-agenda-days th {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-agenda {
|
||||||
|
table {
|
||||||
|
border-collapse: separate;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-agenda-axis {
|
||||||
|
width: 50px;
|
||||||
|
padding: 0 4px;
|
||||||
|
vertical-align: middle;
|
||||||
|
text-align: right;
|
||||||
|
white-space: nowrap;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-week-number {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-agenda .fc-day-content {
|
||||||
|
padding: 2px 2px 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// make axis border take precedence
|
||||||
|
|
||||||
|
.fc-agenda-days .fc-agenda-axis {
|
||||||
|
border-right-width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-agenda-days .fc-col0 {
|
||||||
|
border-left-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// all-day area
|
||||||
|
|
||||||
|
.fc-agenda-allday {
|
||||||
|
th {
|
||||||
|
border-width: 0 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-day-content {
|
||||||
|
min-height: 34px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// divider (between all-day and slots)
|
||||||
|
|
||||||
|
.fc-agenda-divider-inner {
|
||||||
|
height: 2px;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
.fc-widget-header & {
|
||||||
|
background: #eee;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// slot rows
|
||||||
|
|
||||||
|
.fc-agenda-slots {
|
||||||
|
th {
|
||||||
|
border-width: 1px 1px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
td {
|
||||||
|
border-width: 1px 0 0;
|
||||||
|
background: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
td div {
|
||||||
|
height: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.fc-slot0 th,
|
||||||
|
tr.fc-slot0 td {
|
||||||
|
border-top-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
tr.fc-minor th,
|
||||||
|
tr.fc-minor td {
|
||||||
|
border-top-style: dotted;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Vertical Events
|
||||||
|
|
||||||
|
.fc-event-vert {
|
||||||
|
border-width: 0 1px;
|
||||||
|
|
||||||
|
.fc-event-head,
|
||||||
|
.fc-event-content {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.fc-event-start {
|
||||||
|
border-top-width: 1px;
|
||||||
|
border-top-left-radius: 3px;
|
||||||
|
border-top-right-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.fc-event-end {
|
||||||
|
border-bottom-width: 1px;
|
||||||
|
border-bottom-left-radius: 3px;
|
||||||
|
border-bottom-right-radius: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-event-time {
|
||||||
|
white-space: nowrap;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-event-inner {
|
||||||
|
position: relative;
|
||||||
|
z-index: 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-event-bg { // makes the event lighter w/ a semi-transparent overlay
|
||||||
|
position: absolute;
|
||||||
|
z-index: 1;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: #fff;
|
||||||
|
opacity: .25;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// resizable
|
||||||
|
|
||||||
|
.fc-event-vert .ui-resizable-s {
|
||||||
|
bottom: 0 !important; // importants override pre jquery ui 1.7 styles
|
||||||
|
width: 100% !important;
|
||||||
|
height: 8px !important;
|
||||||
|
overflow: hidden !important;
|
||||||
|
line-height: 8px !important;
|
||||||
|
font-size: 11px !important;
|
||||||
|
font-family: monospace;
|
||||||
|
text-align: center;
|
||||||
|
cursor: s-resize;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-timeline {
|
||||||
|
position: absolute;
|
||||||
|
width: 100%;
|
||||||
|
left: 0;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: none;
|
||||||
|
border-top: 2px solid #3ec400;
|
||||||
|
z-index: 999;
|
||||||
|
}
|
||||||
|
|
||||||
|
// List view (by bruederli@kolabsys.com)
|
||||||
|
|
||||||
|
.fc-view-list,
|
||||||
|
.fc-view-table {
|
||||||
|
border: 1px solid #ccc;
|
||||||
|
width: auto;
|
||||||
|
|
||||||
|
.fc-list-header,
|
||||||
|
td.fc-list-header {
|
||||||
|
border-width: 0;
|
||||||
|
border-bottom-width: 1px;
|
||||||
|
padding: 3px 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-list-section {
|
||||||
|
padding: 4px 2px;
|
||||||
|
border-width: 0;
|
||||||
|
border-bottom-width: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-view-list .fc-last {
|
||||||
|
border-bottom-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-list-section .fc-event {
|
||||||
|
position: relative;
|
||||||
|
margin: 1px 2px 3px 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-view-table {
|
||||||
|
tr.fc-event {
|
||||||
|
background: inherit;
|
||||||
|
color: inherit;
|
||||||
|
|
||||||
|
td {
|
||||||
|
padding: 2px;
|
||||||
|
border-bottom: 1px solid #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
td.fc-event-handle {
|
||||||
|
padding: 3px 8px 3px 3px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-first td.fc-list-header {
|
||||||
|
border-top-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-event-handle {
|
||||||
|
.fc-event-skin {
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-event-inner {
|
||||||
|
display: block;
|
||||||
|
width: 8px;
|
||||||
|
height: 10px;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
table {
|
||||||
|
table-layout: fixed;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-event-inner {
|
||||||
|
border-color: inherit;
|
||||||
|
background-color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
col.fc-event-handle {
|
||||||
|
width: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
col.fc-event-date {
|
||||||
|
width: 7em;
|
||||||
|
white-space: nowrap;
|
||||||
|
padding-right: 1em;
|
||||||
|
|
||||||
|
.fc-list-day & {
|
||||||
|
width: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
col.fc-event-time {
|
||||||
|
width: 9em;
|
||||||
|
white-space: nowrap;
|
||||||
|
padding-right: 1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-icon-alarms,
|
||||||
|
.fc-icon-sensitive,
|
||||||
|
.fc-icon-recurring {
|
||||||
|
display: inline-block;
|
||||||
|
width: 1em;
|
||||||
|
height: 1em;
|
||||||
|
margin-left: .25rem;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
&:extend(.font-icon-class);
|
||||||
|
font-size: 1em;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-icon-recurring:before {
|
||||||
|
.font-icon-regular(@fa-var-clone);
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-icon-alarms:before {
|
||||||
|
content: @fa-var-bell;
|
||||||
|
}
|
||||||
|
|
||||||
|
.fc-icon-sensitive:before {
|
||||||
|
content: @fa-var-lock;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#timezone-display {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#event-status-badge {
|
||||||
|
width: 7rem;
|
||||||
|
height: 7rem;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
|
||||||
|
span {
|
||||||
|
display: none;
|
||||||
|
text-transform: uppercase;
|
||||||
|
line-height: 20px;
|
||||||
|
position: absolute;
|
||||||
|
left: -2.4rem;
|
||||||
|
top: 2.4rem;
|
||||||
|
width: 13.2rem;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: .85rem;
|
||||||
|
color: #fff;
|
||||||
|
-webkit-transform: rotate(45deg);
|
||||||
|
transform: rotate(45deg);
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
&:extend(.font-icon-class);
|
||||||
|
display: inline;
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.status-cancelled & {
|
||||||
|
background-color: darken(@color-error, 10%);
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: @fa-var-times-circle;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sensitivity-private & {
|
||||||
|
background-color: darken(@color-warning, 10%);
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: @fa-var-lock;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.sensitivity-confidential & {
|
||||||
|
background-color: darken(@color-error, 10%);
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
content: @fa-var-user-secret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@color-availability-unknown: #ddd;
|
||||||
|
@color-availability-free: #abd640;
|
||||||
|
@color-availability-busy: #e26569;
|
||||||
|
@color-availability-tentative: #8383fc;
|
||||||
|
@color-availability-out-of-office: #fbaa68;
|
||||||
|
|
||||||
|
.availability {
|
||||||
|
span {
|
||||||
|
margin-right: .5rem;
|
||||||
|
color: @color-black-shade-text;
|
||||||
|
|
||||||
|
&:before {
|
||||||
|
&:extend(.font-icon-class);
|
||||||
|
content: @fa-var-square;
|
||||||
|
display: inline;
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.legend:before {
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.loading:before {
|
||||||
|
.animated-icon-class;
|
||||||
|
content: @fa-var-circle-notch;
|
||||||
|
display: block;
|
||||||
|
line-height: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.unknown:before {
|
||||||
|
color: @color-availability-unknown;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.free:before {
|
||||||
|
color: @color-availability-free;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.busy:before {
|
||||||
|
color: @color-availability-busy;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.tentative:before {
|
||||||
|
color: @color-availability-tentative;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.out-of-office:before {
|
||||||
|
color: @color-availability-out-of-office;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.calendar-scheduler {
|
||||||
|
.schedule-nav {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.schedule-range {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.slot-nav {
|
||||||
|
position: absolute;
|
||||||
|
top: 1rem;
|
||||||
|
right: 1rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
.schedule-legend {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -144,3 +144,73 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.attendee {
|
||||||
|
&:after {
|
||||||
|
&:extend(.font-icon-class);
|
||||||
|
content: @fa-var-question-circle;
|
||||||
|
display: inline;
|
||||||
|
float: none;
|
||||||
|
font-size: 1em;
|
||||||
|
margin-left: .2rem;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.req-participant:after {
|
||||||
|
content: @fa-var-user;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.opt-participant:after {
|
||||||
|
.font-icon-regular(@fa-var-user);
|
||||||
|
}
|
||||||
|
|
||||||
|
&.non-participant:after {
|
||||||
|
content: @fa-var-user;
|
||||||
|
color: #999;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.chair:after {
|
||||||
|
content: @fa-var-user; // todo
|
||||||
|
color: @color-warning;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.accepted:after {
|
||||||
|
content: @fa-var-check-circle;
|
||||||
|
color: @color-success;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.declined:after {
|
||||||
|
content: @fa-var-ban;
|
||||||
|
color: @color-error;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.tentative:after {
|
||||||
|
content: @fa-var-check-circle;
|
||||||
|
color: @color-warning;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.delegated:after {
|
||||||
|
content: @fa-var-share;
|
||||||
|
}
|
||||||
|
|
||||||
|
&.organizer:after {
|
||||||
|
content: @fa-var-briefcase; // TODO: better icon
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.form-searchbar {
|
||||||
|
display: flex;
|
||||||
|
margin-bottom: .5rem;
|
||||||
|
|
||||||
|
input[type=button] {
|
||||||
|
margin-left: .5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.attendees-comentbox {
|
||||||
|
label {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#edit-attendees-legend {
|
||||||
|
margin-top: 1rem;
|
||||||
|
}
|
||||||
|
|
|
@ -34,6 +34,17 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.listing {
|
||||||
|
li {
|
||||||
|
& > div {
|
||||||
|
&.tasklist .listname:before {
|
||||||
|
&:extend(.font-icon-class);
|
||||||
|
content: @fa-var-tasks;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@tasklist-record-height: 3.8rem;
|
@tasklist-record-height: 3.8rem;
|
||||||
|
|
||||||
#tasklist {
|
#tasklist {
|
||||||
|
|
|
@ -62,25 +62,12 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.tasklist .listname:before {
|
|
||||||
&:extend(.font-icon-class);
|
|
||||||
content: @fa-var-tasks;
|
|
||||||
}
|
|
||||||
|
|
||||||
&.calendar .calname:before {
|
|
||||||
.font-icon-regular(@fa-var-calendar);
|
|
||||||
}
|
|
||||||
|
|
||||||
&.folder .listname:before {
|
&.folder .listname:before {
|
||||||
&:extend(.font-icon-class);
|
&:extend(.font-icon-class);
|
||||||
content: @fa-var-sticky-note;
|
content: @fa-var-sticky-note;
|
||||||
margin-right: .5rem;
|
margin-right: .5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
span.handle {
|
|
||||||
// TODO calendar/tasklist color indicator
|
|
||||||
}
|
|
||||||
|
|
||||||
span.actions {
|
span.actions {
|
||||||
display: flex;
|
display: flex;
|
||||||
|
|
||||||
|
@ -110,6 +97,10 @@
|
||||||
color: @color-link;
|
color: @color-link;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
a.quickview:after {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
&.focusview {
|
&.focusview {
|
||||||
a.quickview:before {
|
a.quickview:before {
|
||||||
content: @fa-var-eye;
|
content: @fa-var-eye;
|
||||||
|
@ -149,7 +140,7 @@
|
||||||
color: @color-list-selected;
|
color: @color-list-selected;
|
||||||
background-color: @color-list-selected-background;
|
background-color: @color-list-selected-background;
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
&.shared > div a:first-child {
|
&.shared > div a:first-child {
|
||||||
padding-right: 1.6em;
|
padding-right: 1.6em;
|
||||||
|
|
||||||
|
@ -167,7 +158,7 @@
|
||||||
content: @fa-var-user;
|
content: @fa-var-user;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
& > div.readonly a:first-child,
|
& > div.readonly a:first-child,
|
||||||
&.readonly:not(.virtual) > div a:first-child {
|
&.readonly:not(.virtual) > div a:first-child {
|
||||||
padding-right: 1.6em;
|
padding-right: 1.6em;
|
||||||
|
@ -185,19 +176,18 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
&:after {
|
&:after {
|
||||||
content: "";
|
display: none;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
&.other.user > div {
|
& > div.virtual.shared > .listname,
|
||||||
span.calname {
|
&.virtual.shared > div a:first-child {
|
||||||
// TODO @fa-var-user;
|
&:before {
|
||||||
|
.font-icon-solid(@fa-var-share-alt);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
&.shared > div {
|
&:after {
|
||||||
span.calname {
|
display: none;
|
||||||
// TODO @fa-var-share-alt;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue