diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php
index 0e2e86ea..5c45518e 100644
--- a/plugins/calendar/calendar.php
+++ b/plugins/calendar/calendar.php
@@ -265,7 +265,7 @@ class calendar extends rcube_plugin
$default_id = $this->rc->config->get('calendar_default_calendar');
$calendars = $this->driver->list_calendars(calendar_driver::FILTER_PERSONAL);
$calendar = $calendars[$default_id] ?: null;
- if (!$calendar || $confidential || ($writeable && $calendar['readonly'])) {
+ if (!$calendar || $confidential || ($writeable && !$calendar['writeable'])) {
foreach ($calendars as $cal) {
if ($confidential && $cal['subtype'] == 'confidential') {
$calendar = $cal;
@@ -276,7 +276,7 @@ class calendar extends rcube_plugin
if (!$confidential)
break;
}
- if (!$writeable || !$cal['readonly']) {
+ if (!$writeable || $cal['writeable']) {
$first = $cal;
}
}
@@ -2459,7 +2459,7 @@ class calendar extends rcube_plugin
$calendar_select->add('--', '');
$numcals = 0;
foreach ($calendars as $calendar) {
- if (!$calendar['readonly']) {
+ if ($calendar['writeable']) {
$calendar_select->add($calendar['name'], $calendar['id']);
$numcals++;
}
@@ -2840,7 +2840,7 @@ class calendar extends rcube_plugin
}
// save to calendar
- if ($calendar && !$calendar['readonly']) {
+ if ($calendar && $calendar['writeable']) {
// check for existing event with the same UID
$existing = $this->driver->get_event($event, calendar_driver::FILTER_WRITEABLE | calendar_driver::FILTER_PERSONAL);
@@ -3107,7 +3107,7 @@ class calendar extends rcube_plugin
foreach ($events as $event) {
// save to calendar
$calendar = $calendars[$cal_id] ?: $this->get_default_calendar(true, $event['sensitivity'] == 'confidential');
- if ($calendar && !$calendar['readonly'] && $event['_type'] == 'event') {
+ if ($calendar && $calendar['writeable'] && $event['_type'] == 'event') {
$event['calendar'] = $calendar['id'];
if (!$this->driver->get_event($event['uid'], calendar_driver::FILTER_WRITEABLE)) {
diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js
index 06e87593..9dd40141 100644
--- a/plugins/calendar/calendar_ui.js
+++ b/plugins/calendar/calendar_ui.js
@@ -63,7 +63,7 @@ function rcube_calendar_ui(settings)
var resources_data = {};
var resources_index = [];
var resource_owners = {};
- var resources_events_source = { url:null, editable:false };
+ var resources_events_source = { url:null, editable:false, insertable:false };
var freebusy_ui = { workinhoursonly:false, needsupdate:false };
var freebusy_data = {};
var current_view = null;
@@ -392,7 +392,7 @@ function rcube_calendar_ui(settings)
var event_show_dialog = function(event, ev, temp)
{
var $dialog = $("#eventshow");
- var calendar = event.calendar && me.calendars[event.calendar] ? me.calendars[event.calendar] : { editable:false };
+ var calendar = event.calendar && me.calendars[event.calendar] ? me.calendars[event.calendar] : { editable:false, insertable:false };
if (!temp)
me.selected_event = event;
@@ -687,7 +687,7 @@ function rcube_calendar_ui(settings)
$("#eventshow:ui-dialog").data('opener', null).dialog('close');
var $dialog = $('
');
- var calendar = event.calendar && me.calendars[event.calendar] ? me.calendars[event.calendar] : { editable:action=='new' };
+ var calendar = event.calendar && me.calendars[event.calendar] ? me.calendars[event.calendar] : { insertable:action=='new' };
me.selected_event = $.extend($.extend({}, event_defaults), event); // clone event object (with defaults)
event = me.selected_event; // change reference to clone
freebusy_ui.needsupdate = false;
@@ -734,6 +734,12 @@ function rcube_calendar_ui(settings)
allday.checked = false;
}
+ // set calendar selection according to permissions
+ calendars.find('option').each(function(i, opt) {
+ var cal = me.calendars[opt.value] || {};
+ $(opt).prop('disabled', !(cal.editable || (action == 'new' && cal.insertable)))
+ });
+
// set alarm(s)
me.set_alarms_edit('#edit-alarms', action != 'new' && event.valarms && calendar.alarms ? event.valarms : []);
@@ -808,7 +814,7 @@ function rcube_calendar_ui(settings)
// attachments
var load_attachments_tab = function()
{
- rcmail.enable_command('remove-attachment', !calendar.readonly && !event.recurrence_id);
+ rcmail.enable_command('remove-attachment', calendar.editable && !event.recurrence_id);
rcmail.env.deleted_attachments = [];
// we're sharing some code for uploads handling with app.js
rcmail.env.attachments = [];
@@ -3553,7 +3559,8 @@ function rcube_calendar_ui(settings)
me.calendars[id] = $.extend({
url: rcmail.url('calendar/load_events', { source: id }),
- editable: !cal.readonly,
+ editable: cal.writeable || false,
+ insertable: cal.insert || false,
className: 'fc-event-cal-'+id,
id: id
}, cal);
@@ -3583,7 +3590,7 @@ function rcube_calendar_ui(settings)
// insert to #calendar-select options if writeable
select = $('#edit-calendar');
- if (fc && !cal.readonly && select.length && !select.find('option[value="'+id+'"]').length) {
+ if (fc && (cal.writeable || cal.insert) && select.length && !select.find('option[value="'+id+'"]').length) {
$('