diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index 1d40efe5..154b0a3b 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -728,6 +728,30 @@ class calendar extends rcube_plugin if (!$this->driver->subscribe_calendar($cal)) $this->rc->output->show_message($this->gettext('errorsaving'), 'error'); return; + case "search": + $results = array(); + $color_mode = $this->rc->config->get('calendar_event_coloring', $this->defaults['calendar_event_coloring']); + foreach ((array)$this->driver->search_calendars(get_input_value('q', RCUBE_INPUT_GPC), get_input_value('source', RCUBE_INPUT_GPC)) as $id => $prop) { + $editname = $prop['editname']; + unset($prop['editname']); // force full name to be displayed + $prop['active'] = false; + + // let the UI generate HTML and CSS representation for this calendar + $html = $this->ui->calendar_list_item($id, $prop, $jsenv); + $cal = $jsenv[$id]; + $cal['editname'] = $editname; + $cal['html'] = $html; + if (!empty($prop['color'])) + $cal['css'] = $this->ui->calendar_css_classes($id, $prop, $color_mode); + + $results[] = $cal; + } + // report more results available + if ($this->driver->search_more_results) + $this->rc->output->show_message('autocompletemore', 'info'); + + $this->rc->output->command('multi_thread_http_response', $results, get_input_value('_reqid', RCUBE_INPUT_GPC)); + return; } if ($success) @@ -2086,7 +2110,7 @@ class calendar extends rcube_plugin */ public function mail_messages_list($p) { - if (in_array('attachment', (array)$p['cols'])) { + if (in_array('attachment', (array)$p['cols']) && !empty($p['messages'])) { foreach ($p['messages'] as $i => $header) { $part = new StdClass; $part->mimetype = $header->ctype; diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js index 116b490e..68ae94f3 100644 --- a/plugins/calendar/calendar_ui.js +++ b/plugins/calendar/calendar_ui.js @@ -39,6 +39,7 @@ function rcube_calendar_ui(settings) this.selected_calendar = null; this.search_request = null; this.saving_lock; + this.calendars = {}; /*** private vars ***/ @@ -51,6 +52,10 @@ function rcube_calendar_ui(settings) var ignore_click = false; var event_defaults = { free_busy:'busy', alarms:'' }; var event_attendees = []; + var calendars_list; + var calenders_search_list; + var calenders_search_container; + var search_calendars = {}; var attendees_list; var resources_list; var resources_treelist; @@ -1543,7 +1548,8 @@ function rcube_calendar_ui(settings) id_prefix: 'rcres', id_encode: rcmail.html_identifier_encode, id_decode: rcmail.html_identifier_decode, - selectable: true + selectable: true, + save_state: true }); resources_treelist.addEventListener('select', function(node) { if (resources_data[node.id]) { @@ -2658,29 +2664,21 @@ function rcube_calendar_ui(settings) // mark the given calendar folder as selected this.select_calendar = function(id) { - var prefix = 'rcmlical'; - - $(rcmail.gui_objects.calendarslist).find('li.selected') - .removeClass('selected').addClass('unfocused'); - $('#' + prefix + id, rcmail.gui_objects.calendarslist) - .removeClass('unfocused').addClass('selected'); + calendars_list.select(id); // trigger event hook - rcmail.triggerEvent('selectfolder', { folder:name, prefix:prefix }); + rcmail.triggerEvent('selectfolder', { folder:id, prefix:'rcmlical' }); this.selected_calendar = id; }; + // register the given calendar to the current view + var add_calendar_source = function(cal) + { + var color, brightness, select, id = cal.id; - /*** startup code ***/ - - // create list of event sources AKA calendars - this.calendars = {}; - var id, li, cal, active, color, brightness, event_sources = []; - for (id in rcmail.env.calendars) { - cal = rcmail.env.calendars[id]; - this.calendars[id] = $.extend({ - url: "./?_task=calendar&_action=load_events&source="+escape(id), + me.calendars[id] = $.extend({ + url: rcmail.url('calendar/load_events', { source: id }), editable: !cal.readonly, className: 'fc-event-cal-'+id, id: id @@ -2693,52 +2691,117 @@ function rcube_calendar_ui(settings) // http://javascriptrules.com/2009/08/05/css-color-brightness-contrast-using-javascript/ brightness = (parseInt(RegExp.$1, 16) * 299 + parseInt(RegExp.$2, 16) * 587 + parseInt(RegExp.$3, 16) * 114) / 1000; if (brightness > 125) - this.calendars[id].textColor = 'black'; + me.calendars[id].textColor = 'black'; } + + me.calendars[id].color = color; } - this.calendars[id].color = color; + if (fc && (cal.active || cal.subscribed)) { + if (cal.active) + fc.fullCalendar('addEventSource', me.calendars[id]); - if ((active = cal.active || false)) { + var submit = { id: id, active: cal.active ? 1 : 0 }; + if (cal.subscribed !== undefined) + submit.permanent = cal.subscribed ? 1 : 0; + rcmail.http_post('calendar', { action:'subscribe', c:submit }); + } + + // insert to #calendar-select options if writeable + select = $('#edit-calendar'); + if (fc && !cal.readonly && select.length && !select.find('option[value="'+id+'"]').length) { + $('