diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 44f84798..71134ab7 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -675,11 +675,21 @@ function rcube_calendar_ui(settings) var load_attendees_tab = function() { + var j, data, reply_selected = 0; if (event.attendees) { - for (var j=0; j < event.attendees.length; j++) - add_attendee(event.attendees[j], !allow_invitations); + for (j=0; j < event.attendees.length; j++) { + data = event.attendees[j]; + add_attendee(data, !allow_invitations); + if (allow_invitations && data.role != 'ORGANIZER' && !data.noreply) + reply_selected++; + } } + // make sure comment box is visible if at least one attendee has reply enabled + // or global "send invitations" checkbox is checked + if (reply_selected || $('#edit-attendees-invite:checked').length) + $('p.attendees-commentbox').show(); + // select the correct organizer identity var identity_id = 0; $.each(settings.identities, function(i,v){ @@ -772,6 +782,7 @@ function rcube_calendar_ui(settings) if (v.role != 'ORGANIZER') { if ($('input.edit-attendee-reply[value="' + v.email + '"]').prop('checked')) { need_invitation = true; + delete data.attendees[i]['noreply']; } else { data.attendees[i].noreply = 1; @@ -1570,7 +1581,8 @@ function rcube_calendar_ui(settings) var tooltip = data.status || ''; // send invitation checkbox - var invbox = ''; + var invbox = ''; if (data['delegated-to']) tooltip = rcmail.gettext('delegatedto', 'calendar') + data['delegated-to']; @@ -1581,7 +1593,8 @@ function rcube_calendar_ui(settings) '' + dispname + '' + '' + '' + Q(data.status || '') + '' + - '' + (organizer || readonly ? '' : dellink + invbox) + ''; + (data.cutype != 'RESOURCE' ? '' + (organizer || readonly || !invbox ? '' : invbox) + '' : '') + + '' + (organizer || readonly ? '' : dellink) + ''; var table = rcmail.env.calendar_resources && data.cutype == 'RESOURCE' ? resources_list : attendees_list; var tr = $('') @@ -1591,6 +1604,10 @@ function rcube_calendar_ui(settings) tr.find('a.deletelink').click({ id:(data.email || data.name) }, function(e) { remove_attendee(this, e.data.id); return false; }); tr.find('a.mailtolink').click(event_attendee_click); + tr.find('input.edit-attendee-reply').click(function() { + var enabled = $('#edit-attendees-invite:checked').length || $('input.edit-attendee-reply:checked').length; + $('p.attendees-commentbox')[enabled ? 'show' : 'hide'](); + }); // select organizer identity if (data.identity_id) diff --git a/plugins/calendar/lib/calendar_ui.php b/plugins/calendar/lib/calendar_ui.php index 635ff535..4d03299d 100644 --- a/plugins/calendar/lib/calendar_ui.php +++ b/plugins/calendar/lib/calendar_ui.php @@ -693,13 +693,21 @@ class calendar_ui */ function attendees_list($attrib = array()) { - $table = new html_table(array('cols' => 5, 'border' => 0, 'cellpadding' => 0, 'class' => 'rectable')); + // add "noreply" checkbox to attendees table only + $invitations = strpos($attrib['id'], 'attend') !== false; + + $invite = new html_checkbox(array('value' => 1, 'id' => 'edit-attendees-invite')); + $table = new html_table(array('cols' => 5 + intval($invitations), 'border' => 0, 'cellpadding' => 0, 'class' => 'rectable')); + $table->add_header('role', $this->cal->gettext('role')); $table->add_header('name', $this->cal->gettext($attrib['coltitle'] ?: 'attendee')); $table->add_header('availability', $this->cal->gettext('availability')); $table->add_header('confirmstate', $this->cal->gettext('confirmstate')); + if ($invitations) { + $table->add_header(array('class' => 'sendmail', 'title' => $this->cal->gettext('sendinvitations')), $invite->show(1)); + } $table->add_header('options', ''); - + return $table->show($attrib); } @@ -709,12 +717,10 @@ class calendar_ui function attendees_form($attrib = array()) { $input = new html_inputfield(array('name' => 'participant', 'id' => 'edit-attendee-name', 'size' => 30)); - $checkbox = new html_checkbox(array('name' => 'invite', 'id' => 'edit-attendees-invite', 'value' => 1)); $textarea = new html_textarea(array('name' => 'comment', 'id' => 'edit-attendees-comment', 'rows' => 4, 'cols' => 55, 'title' => $this->cal->gettext('itipcommenttitle'))); return html::div($attrib, - html::p('attendees-invitebox', html::label(null, $this->cal->gettext('sendinvitations') . $checkbox->show(1))) . html::div(null, $input->show() . " " . html::tag('input', array('type' => 'button', 'class' => 'button', 'id' => 'edit-attendee-add', 'value' => $this->cal->gettext('addattendee'))) . " " . html::tag('input', array('type' => 'button', 'class' => 'button', 'id' => 'edit-attendee-schedule', 'value' => $this->cal->gettext('scheduletime').'...'))) . diff --git a/plugins/calendar/skins/larry/calendar.css b/plugins/calendar/skins/larry/calendar.css index cfba7c14..71f83502 100644 --- a/plugins/calendar/skins/larry/calendar.css +++ b/plugins/calendar/skins/larry/calendar.css @@ -865,10 +865,22 @@ td.topalign { .edit-attendees-table th.options, .edit-attendees-table td.options { - width: 40px; + width: 16px; padding: 2px 4px; } +.edit-attendees-table th.sendmail, +.edit-attendees-table td.sendmail { + width: 50px; + padding: 2px; +} + +.edit-attendees-table th.sendmail { + background-image: url(../../../../skins/larry/images/buttons.png); + background-position: 20px 4px; + background-repeat: no-repeat; +} + .edit-attendees-table th.name, .edit-attendees-table td.name { width: auto; @@ -893,7 +905,7 @@ td.topalign { #edit-attendees-form, #edit-resources-form { position: relative; - margin-top: 3px; + margin-top: 15px; } #edit-attendees-form .attendees-invitebox { @@ -912,7 +924,8 @@ td.topalign { } #edit-attendees-form #edit-attendee-schedule { - margin-left: 20px; + position: absolute; + right: 0; } .edit-attendees-table select.edit-attendee-role {