diff --git a/plugins/calendar/calendar.php b/plugins/calendar/calendar.php index 70d58be1..2857ee3f 100644 --- a/plugins/calendar/calendar.php +++ b/plugins/calendar/calendar.php @@ -190,6 +190,8 @@ class calendar extends rcube_plugin $this->api->output->add_label('calendar.createfrommail'); } + + $this->add_hook('messages_list', array($this, 'mail_messages_list')); } else if ($args['task'] == 'addressbook') { if ($this->rc->config->get('calendar_contact_birthdays')) { @@ -2157,6 +2159,35 @@ class calendar extends rcube_plugin return html::tag('form', array('action' => $this->rc->url(array('task' => 'calendar', 'action' => 'attend')), 'method' => 'post', 'noclose' => true) + $attrib) . $hidden->show(); } + /** + * + */ + public function mail_messages_list($p) + { + if (in_array('attachment', (array)$p['cols'])) { + foreach ($p['messages'] as $i => $header) { + $part = new StdClass; + $part->mimetype = $header->ctype; + $part->filename = ''; + if ($this->is_vcalendar($part)) { + $header->list_flags['attachmentClass'] = 'ical'; + } + else if (in_array($header->ctype, array('multipart/alternative', 'multipart/mixed'))) { + // TODO: fetch bodystructure and search for ical parts. Maybe too expensive? + + if (!empty($header->structure) && is_array($header->structure->parts)) { + foreach ($header->structure->parts as $part) { + if ($this->is_vcalendar($part) && !empty($part->ctype_parameters['method'])) { + $header->list_flags['attachmentClass'] = 'ical'; + break; + } + } + } + } + } + } + } + /** * Check mail message structure of there are .ics files attached */ diff --git a/plugins/calendar/skins/classic/calendar.css b/plugins/calendar/skins/classic/calendar.css index 937a7b65..6c7ca146 100644 --- a/plugins/calendar/skins/classic/calendar.css +++ b/plugins/calendar/skins/classic/calendar.css @@ -1387,6 +1387,15 @@ fieldset #calendarcategories div { /* Invitation UI in mail */ +.messagelist tbody .attachment span.ical { + display: inline-block; + vertical-align: middle; + height: 18px; + width: 20px; + padding: 0; + background: url(images/calendar-small.png) 1px 1px no-repeat; +} + #messagemenu li a.calendarlink, #attachmentmenu li a.calendarlink { background-image: url(images/calendars.png); diff --git a/plugins/calendar/skins/classic/images/ical-attachment.png b/plugins/calendar/skins/classic/images/ical-attachment.png new file mode 100755 index 00000000..8dbd6694 Binary files /dev/null and b/plugins/calendar/skins/classic/images/ical-attachment.png differ diff --git a/plugins/calendar/skins/larry/calendar.css b/plugins/calendar/skins/larry/calendar.css index 25ad82cf..69a68ac6 100644 --- a/plugins/calendar/skins/larry/calendar.css +++ b/plugins/calendar/skins/larry/calendar.css @@ -1559,6 +1559,15 @@ fieldset #calendarcategories div { /* Invitation UI in mail */ +.messagelist tbody .attachment span.ical { + display: inline-block; + vertical-align: middle; + height: 18px; + width: 20px; + padding: 0; + background: url(images/ical-attachment.png) 2px 1px no-repeat; +} + #messagemenu li a.calendarlink span.calendar, #attachmentmenu li a.calendarlink span.calendar { background-position: 0px -2197px; diff --git a/plugins/calendar/skins/larry/images/ical-attachment.png b/plugins/calendar/skins/larry/images/ical-attachment.png new file mode 100755 index 00000000..8fa486ae Binary files /dev/null and b/plugins/calendar/skins/larry/images/ical-attachment.png differ