diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 986ea8c3..86cd6b04 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -286,7 +286,7 @@ function rcube_calendar_ui(settings) // event details dialog (show only) var event_show_dialog = function(event) { - var $dialog = $("#eventshow").removeClass().addClass('uidialog'); + var $dialog = $("#eventshow").attr('class', 'uidialog'); var calendar = event.calendar && me.calendars[event.calendar] ? me.calendars[event.calendar] : { editable:false }; me.selected_event = event; @@ -314,9 +314,9 @@ function rcube_calendar_ui(settings) $('#event-alarm').show().children('.event-text').html(Q(event.alarms_text)); if (calendar.name) - $('#event-calendar').show().children('.event-text').html(Q(calendar.name)).removeClass().addClass('event-text').addClass('cal-'+calendar.id); + $('#event-calendar').show().children('.event-text').html(Q(calendar.name)).attr('class', 'event-text').addClass('cal-'+calendar.id); if (event.categories) - $('#event-category').show().children('.event-text').html(Q(event.categories)).removeClass().addClass('event-text cat-'+String(event.categories).toLowerCase().replace(rcmail.identifier_expr, '')); + $('#event-category').show().children('.event-text').html(Q(event.categories)).attr('class', 'event-text cat-'+String(event.categories).toLowerCase().replace(rcmail.identifier_expr, '')); if (event.free_busy) $('#event-free-busy').show().children('.event-text').html(Q(rcmail.gettext(event.free_busy, 'calendar'))); if (event.priority > 0) { @@ -354,7 +354,7 @@ function rcube_calendar_ui(settings) data = event.attendees[j]; dispname = Q(data.name || data.email); if (data.email) { - dispname = '' + dispname + ''; + dispname = '' + dispname + ''; if (data.role == 'ORGANIZER') organizer = true; else if ((data.status == 'NEEDS-ACTION' || data.status == 'TENTATIVE' || data.rsvp) && settings.identity.emails.indexOf(';'+data.email) >= 0) @@ -377,7 +377,7 @@ function rcube_calendar_ui(settings) $('#event-attendees').show() .children('.event-text') .html(html) - .find('a.mailtolink').click(function(e) { rcmail.redirect(rcmail.url('mail/compose', { _to:this.href.substr(7) })); return false; }); + .find('a.mailtolink').click(event_attendee_click); // display all attendees in a popup when clicking the "more" link if (morelink) { @@ -388,7 +388,7 @@ function rcube_calendar_ui(settings) rcmail.gettext('tabattendees','calendar'), null, { width:450, modal:false }); - $('#all-event-attendees a.mailtolink').click(function(e) { rcmail.redirect(rcmail.url('mail/compose', { _to:this.href.substr(7) })); return false; }); + $('#all-event-attendees a.mailtolink').click(event_attendee_click); return false; }) } @@ -444,6 +444,20 @@ function rcube_calendar_ui(settings) */ }; + // event handler for clicks on an attendee link + var event_attendee_click = function(e) + { + var cutype = $(this).attr('data-cutype'), + mailto = this.href.substr(7); + if (rcmail.env.calendar_resources && cutype == 'RESOURCE') { + event_resources_dialog(mailto); + } + else { + rcmail.redirect(rcmail.url('mail/compose', { _to:mailto })); + } + return false; + }; + // bring up the event dialog (jquery-ui popup) var event_edit_dialog = function(action, event) { @@ -885,7 +899,7 @@ function rcube_calendar_ui(settings) var j = $.inArray(attendee.role, roles); j = (j+1) % roles.length; attendee.role = roles[j]; - $(e.target).parent().removeClass().addClass('attendee '+String(attendee.role).toLowerCase()); + $(e.target).parent().attr('class', 'attendee '+String(attendee.role).toLowerCase()); // update total display if required-status changed if (req != (roles[j] != 'OPT-PARTICIPANT' && roles[j] != 'NON-PARTICIPANT')) { @@ -1481,7 +1495,7 @@ function rcube_calendar_ui(settings) var dispname = Q(data.name || data.email); if (data.email) - dispname = '' + dispname + ''; + dispname = '' + dispname + ''; // role selection var organizer = data.role == 'ORGANIZER'; @@ -1523,7 +1537,7 @@ function rcube_calendar_ui(settings) .appendTo(table); 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(function(e) { rcmail.redirect(rcmail.url('mail/compose', { _to:this.href.substr(7) })); return false; }); + tr.find('a.mailtolink').click(event_attendee_click); // select organizer identity if (data.identity_id) @@ -1555,11 +1569,11 @@ function rcube_calendar_ui(settings) { var calendar = event.calendar && me.calendars[event.calendar] ? me.calendars[event.calendar] : { freebusy:false }; if (!calendar.freebusy) { - $(icon).removeClass().addClass('availabilityicon unknown'); + $(icon).attr('class', 'availabilityicon unknown'); return; } - icon = $(icon).removeClass().addClass('availabilityicon loading'); + icon = $(icon).attr('class', 'availabilityicon loading'); $.ajax({ type: 'GET', @@ -1583,10 +1597,9 @@ function rcube_calendar_ui(settings) }; // open a dialog to display detailed free-busy information and to find free slots - var event_resources_dialog = function() + var event_resources_dialog = function(search) { - var $dialog = $('#eventresourcesdialog'), - event = me.selected_event; + var $dialog = $('#eventresourcesdialog'); if ($dialog.is(':ui-dialog')) $dialog.dialog('close'); @@ -1621,6 +1634,9 @@ function rcube_calendar_ui(settings) me.dialog_resize($dialog.get(0), 540, Math.min(1000, $(window).width() - 50)); + // set search query + $('#resourcesearchbox').val(search || ''); + // initialize the treelist widget if (!resources_treelist) { resources_treelist = new rcube_treelist_widget(rcmail.gui_objects.resourceslist, { @@ -1632,7 +1648,7 @@ function rcube_calendar_ui(settings) resources_treelist.addEventListener('select', function(node) { if (resources_data[node.id]) { resource_showinfo(resources_data[node.id]); - rcmail.enable_command('add-resource', me.selected_event ? true : false); + rcmail.enable_command('add-resource', me.selected_event && $("#eventedit").is(':visible') ? true : false); } else { rcmail.enable_command('add-resource', false); @@ -1650,6 +1666,8 @@ function rcube_calendar_ui(settings) } else { resources_treelist.select('__none__'); + if (search) + resource_search(); } }; @@ -1717,7 +1735,13 @@ function rcube_calendar_ui(settings) }); resources_index.reverse(); - resource_render_list(resources_index); + + // apply search filter... + if ($('#resourcesearchbox').val() != '') + resource_search(); + else // ...or render full list + resource_render_list(resources_index); + rcmail.set_busy(false, null, me.loading_lock); }; @@ -1752,7 +1776,7 @@ function rcube_calendar_ui(settings) continue; table.append($('').addClass(k) - .append('' + Q(ucfirst(rcmail.get_label('owner'+k, 'calendar'))) + '') + .append('' + Q(ucfirst(rcmail.get_label(k, 'calendar'))) + '') .append('' + text2html(data[k]) + '') ); } @@ -1771,7 +1795,7 @@ function rcube_calendar_ui(settings) // search by iterating over all resource records for (var dn in resources_data) { rec = resources_data[dn]; - if (String(rec.name).toLowerCase().indexOf(q) >= 0) { + if (String(rec.name).toLowerCase().indexOf(q) >= 0 || String(rec.email).toLowerCase() == q) { dataset.push(rec.ID); } } @@ -2634,6 +2658,11 @@ function rcube_calendar_ui(settings) /*** startup code ***/ + // destroy wrongly configured treelist widget for the calendars list + if (rcmail.gui_objects.folderlist && rcmail.treelist) { + rcmail.treelist = null; + } + // create list of event sources AKA calendars this.calendars = {}; var id, li, cal, active, color, brightness, event_sources = []; @@ -2705,6 +2734,9 @@ function rcube_calendar_ui(settings) if (settings.default_calendar && this.calendars[settings.default_calendar] && !this.calendars[settings.default_calendar].readonly) this.selected_calendar = settings.default_calendar; + if (this.selected_calendar) + rcmail.select_folder(this.selected_calendar, 'rcmlical'); + var viewdate = new Date(); if (rcmail.env.date) viewdate.setTime(fromunixtime(rcmail.env.date)); diff --git a/plugins/calendar/lib/calendar_ui.php b/plugins/calendar/lib/calendar_ui.php index 14bc422f..127456f9 100644 --- a/plugins/calendar/lib/calendar_ui.php +++ b/plugins/calendar/lib/calendar_ui.php @@ -797,6 +797,9 @@ class calendar_ui $this->rc->output->add_gui_object('resourceinfo', $attrib['id']); $this->rc->output->add_gui_object('resourceownerinfo', $attrib['id'] . '-owner'); + // copy address book labels for owner details to client + $this->rc->output->add_label('name','firstname','surname','department','jobtitle','email','phone','address'); + $table_attrib = array('id','class','style','width','summary','cellpadding','cellspacing','border'); return html::tag('table', $attrib,