diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index eafb0154..350903d3 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -277,6 +277,7 @@ class calendar extends rcube_plugin $this->rc->output->set_env('calendar_driver', $this->rc->config->get('calendar_driver'), false); $this->rc->output->set_env('mscolors', $this->driver->get_color_values()); + $this->rc->output->set_env('identities-selector', $this->ui->identity_select(array('id' => 'edit-identities-list'))); $view = get_input_value('view', RCUBE_INPUT_GPC); if (in_array($view, array('agendaWeek', 'agendaDay', 'month', 'table'))) @@ -1058,6 +1059,7 @@ class calendar extends rcube_plugin if (!$identity) $identity = $rec; $identity['emails'][] = $rec['email']; + $settings['identities'][$rec['identity_id']] = $rec['email']; } $identity['emails'][] = $this->rc->user->get_username(); $settings['identity'] = array('name' => $identity['name'], 'email' => $identity['email'], 'emails' => ';' . join(';', $identity['emails'])); @@ -1278,24 +1280,32 @@ class calendar extends rcube_plugin $event['attachments'] = $attachments; // check for organizer in attendees - if ($event['attendees'] && ($action == 'new' || $action == 'edit')) { + if (!$event['attendees']) + $event['attendees'] = array(); + if ($action == 'new' || $action == 'edit') { $emails = $this->get_user_emails(); $organizer = $owner = false; - foreach ($event['attendees'] as $i => $attendee) { + foreach ((array)$event['attendees'] as $i => $attendee) { if ($attendee['role'] == 'ORGANIZER') - $organizer = true; + $organizer = $i; if ($attendee['email'] == in_array($attendee['email'], $emails)) $owner = $i; else if (!isset($attendee['rsvp'])) $event['attendees'][$i]['rsvp'] = true; } - + + // set new organizer identity + if ($organizer !== false && !empty($event['_identity']) && ($identity = $this->rc->user->get_identity($event['_identity']))) { + $event['attendees'][$organizer]['name'] = $identity['name']; + $event['attendees'][$organizer]['email'] = $identity['email']; + } + // set owner as organizer if yet missing - if (!$organizer && $owner !== false) { + if ($organizer === false && $owner !== false) { $event['attendees'][$owner]['role'] = 'ORGANIZER'; unset($event['attendees'][$owner]['rsvp']); } - else if (!$organizer && $action == 'new' && ($identity = $this->rc->user->get_identity()) && $identity['email']) { + else if ($organizer === false && $action == 'new' && ($identity = $this->rc->user->get_identity($event['_identity'])) && $identity['email']) { array_unshift($event['attendees'], array('role' => 'ORGANIZER', 'name' => $identity['name'], 'email' => $identity['email'], 'status' => 'ACCEPTED')); } } diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 57a59475..a93f0504 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -159,7 +159,7 @@ function rcube_calendar_ui(settings) { for (var i=0; event.attendees && i < event.attendees.length; i++) { if ((!role || event.attendees[i].role == role) && event.attendees[i].email && settings.identity.emails.indexOf(';'+event.attendees[i].email) >= 0) - return true; + return event.attendees[i]; } return false; }; @@ -521,6 +521,15 @@ function rcube_calendar_ui(settings) add_attendee(event.attendees[j], !organizer); } + // select the correct organizer identity + var identity_id = 0; + $.each(settings.identities, function(i,v){ + if (organizer && v == organizer.email) { + identity_id = i; + return false; + } + }); + $('#edit-identities-list').val(identity_id); $('#edit-attendees-form')[(organizer?'show':'hide')](); $('#edit-attendee-schedule')[(calendar.freebusy?'show':'hide')](); }; @@ -599,6 +608,9 @@ function rcube_calendar_ui(settings) data.attendees[i].role = $(elem).val(); }); + if (organizer) + data._identity = $('#edit-identities-list option:selected').val(); + // don't submit attendees if only myself is added as organizer if (data.attendees.length == 1 && data.attendees[0].role == 'ORGANIZER' && data.attendees[0].email == settings.identity.email) data.attendees = []; @@ -1371,6 +1383,9 @@ function rcube_calendar_ui(settings) opts['OPT-PARTICIPANT'] = rcmail.gettext('calendar.roleoptional'); opts['CHAIR'] = rcmail.gettext('calendar.roleresource'); + if (organizer && !readonly) + dispname = rcmail.env['identities-selector']; + var select = '   -
- - +
+ +
@@ -58,10 +58,6 @@
-
- - -
diff --git a/plugins/calendar/skins/larry/calendar.css b/plugins/calendar/skins/larry/calendar.css index 0f71aadc..a2097105 100644 --- a/plugins/calendar/skins/larry/calendar.css +++ b/plugins/calendar/skins/larry/calendar.css @@ -796,7 +796,7 @@ td.topalign { } .attendees-list .attendee { - padding: 3px 4px 3px 1px; + padding: 4px 4px 4px 1px; background: url(images/attendee-status.gif) 2px -97px no-repeat; white-space: nowrap; } @@ -851,7 +851,7 @@ td.topalign { } #schedule-freebusy-times td { - padding: 3px; + padding: 4px; border: 1px solid #ccc; } diff --git a/plugins/calendar/skins/larry/templates/eventedit.html b/plugins/calendar/skins/larry/templates/eventedit.html index 66dc6497..841baf74 100644 --- a/plugins/calendar/skins/larry/templates/eventedit.html +++ b/plugins/calendar/skins/larry/templates/eventedit.html @@ -31,9 +31,9 @@  
-
- - +
+ +
@@ -55,10 +55,6 @@
-
- - -