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) { $('