Projects
Kolab:Winterfell
roundcubemail-plugins-kolab
Log In
Username
Password
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
Expand all
Collapse all
Changes of Revision 61
View file
roundcubemail-plugins-kolab.spec
Changed
@@ -48,6 +48,15 @@ Patch1001: roundcubemail-plugins-kolab-3.3-kolab-files-manticore-api.patch +Patch0001: 0001-Move-more-common-methods-used-by-tasklist-and-calend.patch +Patch0002: 0002-T2504-Fix-DTSTAMP-in-iTip-replies.patch +Patch0003: 0003-Add-missing-status-tentative-label.patch +Patch0004: 0004-T2531-Support-SCHEDULE-AGENT-in-iTip.patch +Patch0005: 0005-Don-t-ignore-global-userlogins-sendmail-logging-in-p.patch +Patch0006: 0006-Add-missing-type-link-for-template-buttons-for-compa.patch +Patch0007: 0007-Update-calendar-and-tasklist-styles-sprites-to-new-L.patch +Patch0008: 0008-T2561-Fix-recognizing-event-organizer-on-event-move-.patch + BuildRoot: %(mktemp -ud %{_tmppath}/%{name}-%{version}-%{release}-XXXXXX) BuildArch: noarch @@ -860,6 +869,15 @@ %patch1001 -p1 +%patch0001 -p1 +%patch0002 -p1 +%patch0003 -p1 +%patch0004 -p1 +%patch0005 -p1 +%patch0006 -p1 +%patch0007 -p1 +%patch0008 -p1 + find -type d -name "helpdocs" -exec rm -rvf {} \; 2>/dev/null || : rm -rf plugins/kolab_zpush
View file
0001-Move-more-common-methods-used-by-tasklist-and-calend.patch
Added
@@ -0,0 +1,489 @@ +From 2ad0d6651dfbcb32c146465ad9539848b285e3f9 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Thu, 29 Jun 2017 11:20:09 +0200 +Subject: [PATCH 1/8] Move more common methods used by tasklist and calendar to + libcalendaring + +--- + plugins/calendar/calendar_ui.js | 74 +++++--------------------- + plugins/libcalendaring/libcalendaring.js | 64 ++++++++++++++++++++++ + plugins/tasklist/tasklist.js | 91 ++++++++------------------------ + 3 files changed, 97 insertions(+), 132 deletions(-) + +diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js +index c8f67477..7da1f594 100644 +--- a/plugins/calendar/calendar_ui.js ++++ b/plugins/calendar/calendar_ui.js +@@ -283,49 +283,6 @@ function rcube_calendar_ui(settings) + else + return date.getHours() >= settings['work_start'] && date.getHours() < settings['work_end']; + }; +- +- // check if the event has 'real' attendees, excluding the current user +- var has_attendees = function(event) +- { +- return (event.attendees && event.attendees.length && (event.attendees.length > 1 || String(event.attendees[0].email).toLowerCase() != settings.identity.email)); +- }; +- +- // check if the current user is an attendee of this event +- var is_attendee = function(event, role, email) +- { +- var emails = email ? ';'+email.toLowerCase() : settings.identity.emails; +- for (var i=0; event.attendees && i < event.attendees.length; i++) { +- if ((!role || event.attendees[i].role == role) && event.attendees[i].email && emails.indexOf(';'+event.attendees[i].email.toLowerCase()) >= 0) +- return event.attendees[i]; +- } +- return false; +- }; +- +- // check if the current user is the organizer +- var is_organizer = function(event, email) +- { +- return is_attendee(event, 'ORGANIZER', email) || !event.id; +- }; +- +- /** +- * Check permissions on the given calendar object +- */ +- var has_permission = function(cal, perm) +- { +- // multiple chars means "either of" +- if (String(perm).length > 1) { +- for (var i=0; i < perm.length; i++) { +- if (has_permission(cal, perm[i])) +- return true; +- } +- } +- +- if (cal.rights && String(cal.rights).indexOf(perm) >= 0) { +- return true; +- } +- +- return (perm == 'i' && cal.editable) || (perm == 'v' && cal.editable); +- } + + var load_attachment = function(event, att) + { +@@ -514,7 +471,7 @@ function rcube_calendar_ui(settings) + }); + + var data, mystatus = null, rsvp, line, morelink, html = '', overflow = '', +- organizer = is_organizer(event); ++ organizer = me.is_organizer(event); + + for (var j=0; j < event.attendees.length; j++) { + data = event.attendees[j]; +@@ -568,7 +525,7 @@ function rcube_calendar_ui(settings) + .text(rcmail.gettext('status' + mystatus, 'libcalendaring')); + } + +- var show_rsvp = rsvp && !organizer && event.status != 'CANCELLED' && has_permission(calendar, 'v'); ++ var show_rsvp = rsvp && !organizer && event.status != 'CANCELLED' && me.has_permission(calendar, 'v'); + $('#event-rsvp')[(show_rsvp ? 'show' : 'hide')](); + $('#event-rsvp .rsvp-buttons input').prop('disabled', false).filter('input[rel='+mystatus+']').prop('disabled', true); + +@@ -596,7 +553,7 @@ function rcube_calendar_ui(settings) + } + }); + } +- if (!temp && has_permission(calendar, 'td') && event.editable !== false) { ++ if (!temp && me.has_permission(calendar, 'td') && event.editable !== false) { + buttons.push({ + text: rcmail.gettext('delete', 'calendar'), + 'class': 'delete', +@@ -737,7 +694,7 @@ function rcube_calendar_ui(settings) + calendars.val($('option:first', calendars).attr('value')); + + invite.checked = settings.itip_notify & 1 > 0; +- notify.checked = has_attendees(event) && invite.checked; ++ notify.checked = me.has_attendees(event) && invite.checked; + + if (event.allDay) { + starttime.val("12:00").hide(); +@@ -751,7 +708,7 @@ function rcube_calendar_ui(settings) + // set calendar selection according to permissions + calendars.find('option').each(function(i, opt) { + var cal = me.calendars[opt.value] || {}; +- $(opt).prop('disabled', !(cal.editable || (action == 'new' && has_permission(cal, 'i')))) ++ $(opt).prop('disabled', !(cal.editable || (action == 'new' && me.has_permission(cal, 'i')))) + }); + + // set alarm(s) +@@ -783,13 +740,13 @@ function rcube_calendar_ui(settings) + $('#edit-recurring-warning').hide(); + + // init attendees tab +- var organizer = !event.attendees || is_organizer(event), ++ var organizer = !event.attendees || me.is_organizer(event), + allow_invitations = organizer || (calendar.owner && calendar.owner == 'anonymous') || settings.invite_shared; + event_attendees = []; + attendees_list = $('#edit-attendees-table > tbody').html(''); + resources_list = $('#edit-resources-table > tbody').html(''); +- $('#edit-attendees-notify')[(action != 'new' && allow_invitations && has_attendees(event) && (settings.itip_notify & 2) ? 'show' : 'hide')](); +- $('#edit-localchanges-warning')[(action != 'new' && has_attendees(event) && !(allow_invitations || (calendar.owner && is_organizer(event, calendar.owner))) ? 'show' : 'hide')](); ++ $('#edit-attendees-notify')[(action != 'new' && allow_invitations && me.has_attendees(event) && (settings.itip_notify & 2) ? 'show' : 'hide')](); ++ $('#edit-localchanges-warning')[(action != 'new' && me.has_attendees(event) && !(allow_invitations || (calendar.owner && me.is_organizer(event, calendar.owner))) ? 'show' : 'hide')](); + + var load_attendees_tab = function() + { +@@ -2554,13 +2511,13 @@ function rcube_calendar_ui(settings) + + if (!data) data = event; + var decline = false, notify = false, html = '', cal = me.calendars[event.calendar], +- _has_attendees = has_attendees(event), _is_organizer = is_organizer(event); ++ _has_attendees = me.has_attendees(event), _is_organizer = me.is_organizer(event); + + // event has attendees, ask whether to notify them + if (_has_attendees) { + var checked = (settings.itip_notify & 1 ? ' checked="checked"' : ''); + +- if (action == 'remove' && cal.group != 'shared' && !_is_organizer && is_attendee(event)) { ++ if (action == 'remove' && cal.group != 'shared' && !_is_organizer && me.is_attendee(event)) { + decline = true; + checked = event.status != 'CANCELLED' ? checked : ''; + html += '<div class="message">' + +@@ -2588,7 +2545,7 @@ function rcube_calendar_ui(settings) + + // disable the 'future' savemode if I'm an attendee + // reason: no calendaring system supports the thisandfuture range parameter in iTip REPLY +- if (action == 'remove' && _has_attendees && !_is_organizer && is_attendee(event)) { ++ if (action == 'remove' && _has_attendees && !_is_organizer && me.is_attendee(event)) { + future_disabled = ' disabled'; + } + +@@ -3529,13 +3486,6 @@ function rcube_calendar_ui(settings) + this.fisheye_view(this.fisheye_date); + }; + +- // resize and reposition (center) the dialog window +- this.dialog_resize = function(id, height, width) +- { +- var win = $(window), w = win.width(), h = win.height(); +- $(id).dialog('option', { height: Math.min(h-20, height+130), width: Math.min(w-20, width+50) }); +- }; +- + // adjust calendar view size + this.view_resize = function() + { +@@ -3593,7 +3543,7 @@ function rcube_calendar_ui(settings) + + // insert to #calendar-select options if writeable + select = $('#edit-calendar'); +- if (fc && has_permission(cal, 'i') && select.length && !select.find('option[value="'+id+'"]').length) { ++ if (fc && me.has_permission(cal, 'i') && select.length && !select.find('option[value="'+id+'"]').length) { + $('<option>').attr('value', id).html(cal.name).appendTo(select); + } + } +diff --git a/plugins/libcalendaring/libcalendaring.js b/plugins/libcalendaring/libcalendaring.js +index c15fa048..c6bee178 100644 +--- a/plugins/libcalendaring/libcalendaring.js ++++ b/plugins/libcalendaring/libcalendaring.js +@@ -94,6 +94,59 @@ function rcube_libcalendaring(settings) + return fromto; + }; + ++ /** ++ * Checks if the event/task has 'real' attendees, excluding the current user ++ */ ++ this.has_attendees = function(event) ++ { ++ return !!(event.attendees && event.attendees.length && (event.attendees.length > 1 || String(event.attendees[0].email).toLowerCase() != settings.identity.email)); ++ }; ++ ++ /** ++ * Check if the current user is an attendee of this event/task ++ */ ++ this.is_attendee = function(event, role, email) ++ { ++ var i, emails = email ? ';' + email.toLowerCase() : settings.identity.emails; ++ ++ for (i=0; event.attendees && i < event.attendees.length; i++) { ++ if ((!role || event.attendees[i].role == role) && event.attendees[i].email && emails.indexOf(';'+event.attendees[i].email.toLowerCase()) >= 0) { ++ return event.attendees[i]; ++ } ++ } ++ ++ return false; ++ }; ++ ++ /** ++ * Checks if the current user is the organizer of the event/task ++ */ ++ this.is_organizer = function(event, email) ++ { ++ return this.is_attendee(event, 'ORGANIZER', email) || !event.id; ++ }; ++ ++ /** ++ * Check permissions on the given folder object ++ */ ++ this.has_permission = function(folder, perm) ++ { ++ // multiple chars means "either of" ++ if (String(perm).length > 1) { ++ for (var i=0; i < perm.length; i++) { ++ if (this.has_permission(folder, perm[i])) { ++ return true; ++ } ++ } ++ } ++ ++ if (folder.rights && String(folder.rights).indexOf(perm) >= 0) { ++ return true; ++ } ++ ++ return (perm == 'i' && folder.editable) || (perm == 'v' && folder.editable); ++ }; ++ + + /** + * From time and date strings to a real date object +@@ -1000,6 +1053,17 @@ function rcube_libcalendaring(settings) + + container.empty().append(ul); + } ++ ++ // resize and reposition (center) the dialog window ++ this.dialog_resize = function(id, height, width) ++ { ++ var win = $(window), w = win.width(), h = win.height(); ++ ++ $(id).dialog('option', { ++ height: Math.min(h-20, height+130), ++ width: Math.min(w-20, width+50) ++ }); ++ }; + } + + ////// static methods +diff --git a/plugins/tasklist/tasklist.js b/plugins/tasklist/tasklist.js +index a95b5960..42f7da3f 100644 +--- a/plugins/tasklist/tasklist.js ++++ b/plugins/tasklist/tasklist.js +@@ -173,9 +173,9 @@ function rcube_tasklist_ui(settings) + }); + tasklists_widget.addEventListener('select', function(node) { + var id = $(this).data('id'); +- rcmail.enable_command('list-edit', has_permission(me.tasklists[node.id], 'wa')); +- rcmail.enable_command('list-delete', has_permission(me.tasklists[node.id], 'xa')); +- rcmail.enable_command('list-import', has_permission(me.tasklists[node.id], 'i')); ++ rcmail.enable_command('list-edit', me.has_permission(me.tasklists[node.id], 'wa')); ++ rcmail.enable_command('list-delete', me.has_permission(me.tasklists[node.id], 'xa')); ++ rcmail.enable_command('list-import', me.has_permission(me.tasklists[node.id], 'i')); + rcmail.enable_command('list-remove', me.tasklists[node.id] && me.tasklists[node.id].removable); + rcmail.enable_command('list-showurl', me.tasklists[node.id] && !!me.tasklists[node.id].caldavurl); + me.selected_list = node.id; +@@ -739,27 +739,6 @@ function rcube_tasklist_ui(settings) + } + + /** +- * Check permissions on the given list object +- */ +- function has_permission(list, perm) +- { +- // multiple chars means "either of" +- if (String(perm).length > 1) { +- for (var i=0; i < perm.length; i++) { +- if (has_permission(list, perm[i])) { +- return true; +- } +- } +- } +- +- if (list.rights && String(list.rights).indexOf(perm) >= 0) { +- return true; +- } +- +- return (perm == 'i' && list.editable); +- } +- +- /** + * Request counts from the server + */ + function fetch_counts() +@@ -1247,7 +1226,7 @@ function rcube_tasklist_ui(settings) + list = drop_rec && me.tasklists[drop_rec.list] ? me.tasklists[drop_rec.list] : { editable:true }; + + // target is not editable or already has this tag assigned +- if (!drop_rec || drop_rec.readonly || !has_permission(list, 'i') || (drop_rec.tags && $.inArray(tag, drop_rec.tags) >= 0)) { ++ if (!drop_rec || drop_rec.readonly || !me.has_permission(list, 'i') || (drop_rec.tags && $.inArray(tag, drop_rec.tags) >= 0)) { + return false; + } + +@@ -1370,7 +1349,7 @@ function rcube_tasklist_ui(settings) + function save_task(rec, action) + { + // show confirmation dialog when status of an assigned task has changed +- if (rec._status_before !== undefined && is_attendee(rec)) ++ if (rec._status_before !== undefined && me.is_attendee(rec)) + return save_task_confirm(rec, action); + + if (!rcmail.busy) { +@@ -1393,7 +1372,7 @@ function rcube_tasklist_ui(settings) + do_confirm = settings.itip_notify & 2; + + // task has attendees, ask whether to notify them +- if (has_attendees(rec) && is_organizer(rec)) { ++ if (me.has_attendees(rec) && me.is_organizer(rec)) { + notify = true; + if (do_confirm) { + html = rcmail.gettext('changeconfirmnotifications', 'tasklist'); +@@ -1403,7 +1382,7 @@ function rcube_tasklist_ui(settings) + } + } + // ask whether to change my partstat and notify organizer +- else if (data._status_before !== undefined && data.status && data._status_before != data.status && is_attendee(rec)) { ++ else if (data._status_before !== undefined && data.status && data._status_before != data.status && me.is_attendee(rec)) { + partstat = true; + if (do_confirm) { + html = rcmail.gettext('partstatupdatenotification', 'tasklist'); +@@ -1885,29 +1864,8 @@ function rcube_tasklist_ui(settings) + scroll_timer = window.setTimeout(function(){ tasklist_drag_scroll(container, dir); }, scroll_speed); + } + +- // check if the task has 'real' attendees, excluding the current user +- var has_attendees = function(task) +- { +- return !!(task.attendees && task.attendees.length && (task.attendees.length > 1 || String(task.attendees[0].email).toLowerCase() != settings.identity.email)); +- }; +- +- // check if the current user is an attendee of this task +- var is_attendee = function(task, email, role) +- { +- var i, attendee, emails = email ? ';' + email.toLowerCase() : settings.identity.emails; +- +- for (i=0; task.attendees && i < task.attendees.length; i++) { +- attendee = task.attendees[i]; +- if ((!role || attendee.role == role) && attendee.email && emails.indexOf(';'+attendee.email.toLowerCase()) >= 0) { +- return attendee; +- } +- } +- +- return false; +- }; +- + // check if the current user is the organizer +- var is_organizer = function(task, email) ++ this.is_organizer = function(task, email) + { + if (!email) email = task.organizer ? task.organizer.email : null; + if (email) +@@ -2140,7 +2098,7 @@ function rcube_tasklist_ui(settings) + }); + */ + var j, data, rsvp = false, mystatus = null, line, morelink, html = '', overflow = '', +- organizer = is_organizer(rec); ++ organizer = me.is_organizer(rec); + + for (j=0; j < rec.attendees.length; j++) { + data = rec.attendees[j]; +@@ -2194,7 +2152,7 @@ function rcube_tasklist_ui(settings) + .html(rcmail.gettext('status' + mystatus, 'libcalendaring')); + } + */ +- var show_rsvp = !temp && rsvp && list.editable && !is_organizer(rec) && rec.status != 'CANCELLED'; ++ var show_rsvp = !temp && rsvp && list.editable && !me.is_organizer(rec) && rec.status != 'CANCELLED'; + $('#task-rsvp')[(show_rsvp ? 'show' : 'hide')](); + $('#task-rsvp .rsvp-buttons input').prop('disabled', false).filter('input[rel='+mystatus+']').prop('disabled', true); + +@@ -2221,7 +2179,7 @@ function rcube_tasklist_ui(settings) + }); + } + +- if (has_permission(list, 'td') && !rec.readonly) { ++ if (me.has_permission(list, 'td') && !rec.readonly) { + buttons.push({ + text: rcmail.gettext('delete','tasklist'), + 'class': 'delete', +@@ -2456,7 +2414,7 @@ function rcube_tasklist_ui(settings) + list = rec.list && me.tasklists[rec.list] ? me.tasklists[rec.list] : + (me.selected_list ? me.tasklists[me.selected_list] : { editable: action == 'new', rights: action == 'new' ? 'rwitd' : 'r' }); + +- if (rcmail.busy || !has_permission(list, 'i') || (action == 'edit' && (!rec || rec.readonly))) ++ if (rcmail.busy || !me.has_permission(list, 'i') || (action == 'edit' && (!rec || rec.readonly))) + return false; + + me.selected_task = $.extend({ valarms:[] }, rec); // clone task object +@@ -2488,12 +2446,12 @@ function rcube_tasklist_ui(settings) + var comment = $('#edit-attendees-comment'); + + invite.checked = settings.itip_notify & 1 > 0; +- notify.checked = has_attendees(rec) && invite.checked; ++ notify.checked = me.has_attendees(rec) && invite.checked; + + // set tasklist selection according to permissions + tasklist.find('option').each(function(i, opt) { + var l = me.tasklists[opt.value] || {}, +- writable = l.editable || (action == 'new' && has_permission(l, 'i')); ++ writable = l.editable || (action == 'new' && me.has_permission(l, 'i')); + $(opt).prop('disabled', !writable); + + if (!selected_list && writable) +@@ -2536,13 +2494,13 @@ function rcube_tasklist_ui(settings) + me.set_recurrence_edit(rec); + + // init attendees tab +- var organizer = !rec.attendees || is_organizer(rec), ++ var organizer = !rec.attendees || me.is_organizer(rec), + allow_invitations = organizer || (rec.owner && rec.owner == 'anonymous') || settings.invite_shared; + + task_attendees = []; + attendees_list = $('#edit-attendees-table > tbody').html(''); +- $('#edit-attendees-notify')[(allow_invitations && has_attendees(rec) && (settings.itip_notify & 2) ? 'show' : 'hide')](); +- $('#edit-localchanges-warning')[(has_attendees(rec) && !(allow_invitations || (rec.owner && is_organizer(rec, rec.owner))) ? 'show' : 'hide')](); ++ $('#edit-attendees-notify')[(allow_invitations && me.has_attendees(rec) && (settings.itip_notify & 2) ? 'show' : 'hide')](); ++ $('#edit-localchanges-warning')[(me.has_attendees(rec) && !(allow_invitations || (rec.owner && me.is_organizer(rec, rec.owner))) ? 'show' : 'hide')](); + + // attendees (aka assignees) + if (list.attendees) { +@@ -2697,7 +2655,7 @@ function rcube_tasklist_ui(settings) + } + + // tell server to send notifications +- if ((has_attendees(data) || (rec.id && has_attendees(rec))) && allow_invitations && (notify.checked || invite.checked || need_invitation)) { ++ if ((me.has_attendees(data) || (rec.id && me.has_attendees(rec))) && allow_invitations && (notify.checked || invite.checked || need_invitation)) { + data._notify = settings.itip_notify; + data._comment = comment.val(); + } +@@ -2935,13 +2893,13 @@ function rcube_tasklist_ui(settings) + }); + } + +- if (is_attendee(rec)) { ++ if (me.is_attendee(rec)) { + html += '<div class="task-dialog-message">' + + '<label><input class="confirm-attendees-decline" type="checkbox" checked="checked" value="1" name="_decline" /> ' + + rcmail.gettext('itipdeclinetask', 'tasklist') + + '</label></div>'; + } +- else if (has_attendees(rec) && is_organizer(rec)) { ++ else if (me.has_attendees(rec) && me.is_organizer(rec)) { + html += '<div class="task-dialog-message">' + + '<label><input class="confirm-attendees-notify" type="checkbox" checked="checked" value="1" name="_notify" /> ' + + rcmail.gettext('sendcancellation', 'tasklist') + +@@ -3107,7 +3065,7 @@ function rcube_tasklist_ui(settings) + editform = $('#tasklisteditform'); + me.dialog_resize(rcmail.gui_containers.tasklistform, editform.height(), editform.width()); + +- name = $('#taskedit-tasklistame').prop('disabled', !has_permission(list, 'a')||list.norename).val(list.editname || list.name); ++ name = $('#taskedit-tasklistame').prop('disabled', !me.has_permission(list, 'a')||list.norename).val(list.editname || list.name); + alarms = $('#taskedit-showalarms').prop('checked', list.showalarms).get(0); + name.select(); + +@@ -3427,13 +3385,6 @@ function rcube_tasklist_ui(settings) + return active; + } + +- // resize and reposition (center) the dialog window +- this.dialog_resize = function(id, height, width) +- { +- var win = $(window), w = win.width(), h = win.height(); +- $(id).dialog('option', { height: Math.min(h-20, height+130), width: Math.min(w-20, width+50) }); +- }; +- + /** + * Enable/disable focusview mode for the given list + */ +-- +2.13.2 +
View file
0002-T2504-Fix-DTSTAMP-in-iTip-replies.patch
Added
@@ -0,0 +1,26 @@ +From c2e8cc16abf3c016b32fa84eb7e0a9e693b0bb73 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Thu, 29 Jun 2017 13:08:35 +0000 +Subject: [PATCH 2/8] T2504: Fix DTSTAMP in iTip replies + +It should be set to NOW whenever METHOD is specified. +--- + plugins/libcalendaring/libvcalendar.php | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/plugins/libcalendaring/libvcalendar.php b/plugins/libcalendaring/libvcalendar.php +index 78a9e2c1..a84f1a98 100644 +--- a/plugins/libcalendaring/libvcalendar.php ++++ b/plugins/libcalendaring/libvcalendar.php +@@ -1002,7 +1002,7 @@ class libvcalendar implements Iterator + $ve->UID = $event['uid']; + + // set DTSTAMP according to RFC 5545, 3.8.7.2. +- $dtstamp = !empty($event['changed']) && !empty($this->method) ? $event['changed'] : new DateTime('now', new \DateTimeZone('UTC')); ++ $dtstamp = !empty($event['changed']) && empty($this->method) ? $event['changed'] : new DateTime('now', new \DateTimeZone('UTC')); + $ve->DTSTAMP = $this->datetime_prop($cal, 'DTSTAMP', $dtstamp, true); + + // all-day events end the next day +-- +2.13.2 +
View file
0003-Add-missing-status-tentative-label.patch
Added
@@ -0,0 +1,24 @@ +From 94dd9965a7553836851a51902bfc7f064aba27b3 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Mon, 3 Jul 2017 10:13:59 +0200 +Subject: [PATCH 3/8] Add missing status-tentative label + +--- + plugins/calendar/localization/en_US.inc | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/plugins/calendar/localization/en_US.inc b/plugins/calendar/localization/en_US.inc +index 43d07922..2e2952c2 100644 +--- a/plugins/calendar/localization/en_US.inc ++++ b/plugins/calendar/localization/en_US.inc +@@ -82,6 +82,7 @@ $labels['mystatus'] = 'My status'; + $labels['status'] = 'Status'; + $labels['status-confirmed'] = 'Confirmed'; + $labels['status-cancelled'] = 'Cancelled'; ++$labels['status-tentative'] = 'Tentative'; + $labels['priority'] = 'Priority'; + $labels['sensitivity'] = 'Privacy'; + $labels['public'] = 'public'; +-- +2.13.2 +
View file
0004-T2531-Support-SCHEDULE-AGENT-in-iTip.patch
Added
@@ -0,0 +1,105 @@ +From 0c02d0d45c63444588a666e5b9f1671f91bd99a1 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Tue, 4 Jul 2017 14:27:19 +0000 +Subject: [PATCH 4/8] T2531: Support SCHEDULE-AGENT in iTip + +This property is used when scheduling method on the original and updated +event via CalDAV (iRony) using SCHEDULING-AGENT=CLIENT. CANCEL invitations +are supposed to be sent to attendees only if the initial scheduling was not +done with SCHEDULING-AGENT=CLIENT. + +https://tools.ietf.org/html/rfc6638#section-3.2.1.2 +--- + plugins/libcalendaring/libvcalendar.php | 39 +++++++++++++++++++++++++++++---- + 1 file changed, 35 insertions(+), 4 deletions(-) + +diff --git a/plugins/libcalendaring/libvcalendar.php b/plugins/libcalendaring/libvcalendar.php +index a84f1a98..06e660b8 100644 +--- a/plugins/libcalendaring/libvcalendar.php ++++ b/plugins/libcalendaring/libvcalendar.php +@@ -45,11 +45,13 @@ class libvcalendar implements Iterator + 'delegated-from' => 'DELEGATED-FROM', + 'delegated-to' => 'DELEGATED-TO', + 'schedule-status' => 'SCHEDULE-STATUS', ++ 'schedule-agent' => 'SCHEDULE-AGENT', + 'sent-by' => 'SENT-BY', + ); + private $organizer_keymap = array( + 'name' => 'CN', + 'schedule-status' => 'SCHEDULE-STATUS', ++ 'schedule-agent' => 'SCHEDULE-AGENT', + 'sent-by' => 'SENT-BY', + ); + private $iteratorkey = 0; +@@ -549,6 +551,10 @@ class libvcalendar implements Iterator + $attendee['role'] = 'ORGANIZER'; + $attendee['status'] = 'ACCEPTED'; + $event['organizer'] = $attendee; ++ ++ if (array_key_exists('schedule-agent', $attendee)) { ++ $schedule_agent = $attendee['schedule-agent']; ++ } + } + else if ($attendee['email'] != $event['organizer']['email']) { + $event['attendees'][] = $attendee; +@@ -708,6 +714,12 @@ class libvcalendar implements Iterator + $event['end'] = clone $event['start']; + } + ++ // T2531: Remember SCHEDULE-AGENT in custom property to properly ++ // support event updates via CalDAV when SCHEDULE-AGENT=CLIENT is used ++ if (isset($schedule_agent)) { ++ $event['x-custom'][] = array('SCHEDULE-AGENT', $schedule_agent); ++ } ++ + // minimal validation + if (empty($event['uid']) || ($event['_type'] == 'event' && empty($event['start']) != empty($event['end']))) { + throw new VObject\ParseException('Object validation failed: missing mandatory object properties'); +@@ -1164,6 +1176,13 @@ class libvcalendar implements Iterator + $ve->add($va); + } + ++ // Find SCHEDULE-AGENT ++ foreach ((array)$event['x-custom'] as $prop) { ++ if ($prop[0] === 'SCHEDULE-AGENT') { ++ $schedule_agent = $prop[1]; ++ } ++ } ++ + foreach ((array)$event['attendees'] as $attendee) { + if ($attendee['role'] == 'ORGANIZER') { + if (empty($event['organizer'])) +@@ -1172,14 +1191,26 @@ class libvcalendar implements Iterator + else if (!empty($attendee['email'])) { + if (isset($attendee['rsvp'])) + $attendee['rsvp'] = $attendee['rsvp'] ? 'TRUE' : null; +- $ve->add('ATTENDEE', 'mailto:' . $attendee['email'], +- array_filter(self::map_keys($attendee, $this->attendee_keymap))); ++ ++ $mailto = $attendee['email']; ++ $attendee = array_filter(self::map_keys($attendee, $this->attendee_keymap)); ++ ++ if ($schedule_agent !== null && !isset($attendee['SCHEDULE-AGENT'])) { ++ $attendee['SCHEDULE-AGENT'] = $schedule_agent; ++ } ++ ++ $ve->add('ATTENDEE', 'mailto:' . $mailto, $attendee); + } + } + + if ($event['organizer']) { +- $ve->add('ORGANIZER', 'mailto:' . $event['organizer']['email'], +- array_filter(self::map_keys($event['organizer'], $this->organizer_keymap))); ++ $organizer = array_filter(self::map_keys($event['organizer'], $this->organizer_keymap)); ++ ++ if ($schedule_agent !== null && !isset($organizer['SCHEDULE-AGENT'])) { ++ $organizer['SCHEDULE-AGENT'] = $schedule_agent; ++ } ++ ++ $ve->add('ORGANIZER', 'mailto:' . $event['organizer']['email'], $organizer); + } + + foreach ((array)$event['url'] as $url) { +-- +2.13.2 +
View file
0005-Don-t-ignore-global-userlogins-sendmail-logging-in-p.patch
Added
@@ -0,0 +1,28 @@ +From 38e6afc90338def196f2d156825653a377f57c57 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Mon, 10 Jul 2017 16:35:42 +0200 +Subject: [PATCH 5/8] Don't ignore (global) userlogins/sendmail logging in + per_user_logging mode + +--- + plugins/kolab_auth/kolab_auth.php | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/plugins/kolab_auth/kolab_auth.php b/plugins/kolab_auth/kolab_auth.php +index 12e08169..f8628443 100644 +--- a/plugins/kolab_auth/kolab_auth.php ++++ b/plugins/kolab_auth/kolab_auth.php +@@ -298,8 +298,8 @@ class kolab_auth extends rcube_plugin + if (is_writable($user_log_dir)) { + $args['dir'] = $user_log_dir; + } +- else if ($args['name'] != 'errors') { +- $args['abort'] = true; // don't log if unauthenticed ++ else if (!in_array($args['name'], array('errors', 'userlogins', 'sendmail'))) { ++ $args['abort'] = true; // don't log if unauthenticed or no per-user log dir + } + } + +-- +2.13.2 +
View file
0006-Add-missing-type-link-for-template-buttons-for-compa.patch
Added
@@ -0,0 +1,379 @@ +From 8ce594f23aa1c450605b87808f4c4487307d2ab4 Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Tue, 11 Jul 2017 14:33:31 +0000 +Subject: [PATCH 6/8] Add missing type="link" for template buttons for compat. + with Roundcube 1.4 + +--- + plugins/calendar/lib/calendar_ui.php | 9 ++++---- + .../calendar/skins/larry/templates/calendar.html | 24 +++++++++++----------- + .../kolab_addressbook/lib/kolab_addressbook_ui.php | 3 ++- + plugins/kolab_files/lib/kolab_files_engine.php | 1 + + .../skins/larry/templates/compose_plugin.html | 6 +++--- + .../kolab_files/skins/larry/templates/files.html | 18 ++++++++-------- + .../skins/larry/templates/message_plugin.html | 2 +- + plugins/kolab_notes/kolab_notes_ui.php | 9 ++++---- + .../kolab_notes/skins/larry/templates/notes.html | 12 +++++------ + plugins/kolab_tags/skins/larry/templates/ui.html | 6 +++--- + .../tasklist/skins/larry/templates/mainview.html | 20 +++++++++--------- + plugins/tasklist/tasklist_ui.php | 1 + + 12 files changed, 58 insertions(+), 53 deletions(-) + +diff --git a/plugins/calendar/lib/calendar_ui.php b/plugins/calendar/lib/calendar_ui.php +index 4276fb48..5152c287 100644 +--- a/plugins/calendar/lib/calendar_ui.php ++++ b/plugins/calendar/lib/calendar_ui.php +@@ -47,11 +47,12 @@ class calendar_ui + + // add taskbar button + $this->cal->add_button(array( +- 'command' => 'calendar', +- 'class' => 'button-calendar', +- 'classsel' => 'button-calendar button-selected', ++ 'command' => 'calendar', ++ 'class' => 'button-calendar', ++ 'classsel' => 'button-calendar button-selected', + 'innerclass' => 'button-inner', +- 'label' => 'calendar.calendar', ++ 'label' => 'calendar.calendar', ++ 'type' => 'link' + ), 'taskbar'); + + // load basic client script +diff --git a/plugins/calendar/skins/larry/templates/calendar.html b/plugins/calendar/skins/larry/templates/calendar.html +index b7f04bd9..895b6cfb 100644 +--- a/plugins/calendar/skins/larry/templates/calendar.html ++++ b/plugins/calendar/skins/larry/templates/calendar.html +@@ -35,7 +35,7 @@ + <label for="calendarlistsearch" class="voice"><roundcube:label name="calendar.searchterms" /></label> + <input type="text" name="q" id="calendarlistsearch" placeholder="<roundcube:label name='calendar.findcalendars' />" /> + <a class="iconbutton searchicon"></a> +- <roundcube:button command="reset-listsearch" id="calendarlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-listsearch" id="calendarlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + </div> + <div class="scroller withfooter"> +@@ -52,7 +52,7 @@ + <label for="quicksearchbox" class="voice"><roundcube:label name="calendar.arialabelquicksearchbox" /></label> + <roundcube:object name="plugin.searchform" id="quicksearchbox" /> + <a id="searchmenulink" class="iconbutton searchoptions" tabindex="-1"> </a> +- <roundcube:button command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + + <h2 id="aria-label-calendarview" class="voice"><roundcube:label name="calendar.arialabelcalendarview" /></h2> +@@ -68,14 +68,14 @@ + <div id="calendaroptionsmenu" class="popupmenu" aria-hidden="true"> + <h3 id="aria-label-calendaroptions" class="voice"><roundcube:label name="calendar.calendaractions" /></h3> + <ul id="calendaroptionsmenu-menu" class="toolbarmenu" role="menu" aria-labelledby="aria-label-calendaroptions"> +- <li role="menuitem"><roundcube:button command="calendar-edit" label="calendar.edit" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="calendar-delete" label="delete" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="calendar-edit" label="calendar.edit" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="calendar-delete" label="delete" classAct="active" /></li> + <roundcube:if condition="env:calendar_driver == 'kolab'" /> +- <li role="menuitem"><roundcube:button command="calendar-remove" label="calendar.removelist" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="calendar-remove" label="calendar.removelist" classAct="active" /></li> + <roundcube:endif /> +- <li role="menuitem"><roundcube:button command="calendar-showurl" label="calendar.showurl" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="calendar-showurl" label="calendar.showurl" classAct="active" /></li> + <roundcube:if condition="env:calendar_driver == 'kolab'" /> +- <li role="menuitem"><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="folders" task="settings" label="managefolders" classAct="active" /></li> + <roundcube:endif /> + </ul> + </div> +@@ -162,11 +162,11 @@ + <div id="eventoptionsmenu" class="popupmenu" aria-hidden="true"> + <h3 id="aria-label-eventoptions" class="voice"><roundcube:label name="calendar.eventoptions" /></h3> + <ul id="eventoptionsmenu-menu" class="toolbarmenu" role="menu" aria-labelledby="aria-label-eventoptions"> +- <li role="menuitem"><roundcube:button command="event-download" label="download" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="event-sendbymail" label="send" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="event-copy" label="copy" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="event-download" label="download" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="event-sendbymail" label="send" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="event-copy" label="copy" classAct="active" /></li> + <roundcube:if condition="env:calendar_driver == 'kolab' && config:kolab_bonnie_api" /> +- <li role="menuitem"><roundcube:button command="event-history" type="link" label="calendar.eventhistory" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="event-history" label="calendar.eventhistory" classAct="active" /></li> + <roundcube:endif /> + </ul> + </div> +@@ -265,7 +265,7 @@ + <label for="resourcesearchbox" class="voice"><roundcube:label name="calendar.searchterms" /></label> + <roundcube:object name="plugin.resources_searchform" id="resourcesearchbox" /> + <a id="resourcesearchmenulink" class="iconbutton searchoptions"> </a> +- <roundcube:button command="reset-resource-search" id="resourcesearchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-resource-search" id="resourcesearchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + </div> + <div class="scroller"> +diff --git a/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php b/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php +index 26455cf1..941c4242 100644 +--- a/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php ++++ b/plugins/kolab_addressbook/lib/kolab_addressbook_ui.php +@@ -86,7 +86,8 @@ class kolab_addressbook_ui + 'label' => 'kolab_addressbook.'.str_replace('-', '', $command), + 'domain' => $this->ID, + 'classact' => 'active', +- 'command' => $command ++ 'command' => $command, ++ 'type' => 'link' + ))); + $this->plugin->api->add_content($content, 'groupoptions'); + $idx++; +diff --git a/plugins/kolab_files/lib/kolab_files_engine.php b/plugins/kolab_files/lib/kolab_files_engine.php +index 4ea58ba1..5d98a146 100644 +--- a/plugins/kolab_files/lib/kolab_files_engine.php ++++ b/plugins/kolab_files/lib/kolab_files_engine.php +@@ -127,6 +127,7 @@ class kolab_files_engine + 'classsel' => 'button-files button-selected', + 'innerclass' => 'button-inner', + 'label' => 'kolab_files.files', ++ 'type' => 'link' + ), 'taskbar'); + } + +diff --git a/plugins/kolab_files/skins/larry/templates/compose_plugin.html b/plugins/kolab_files/skins/larry/templates/compose_plugin.html +index 4e249edd..a823a2a1 100644 +--- a/plugins/kolab_files/skins/larry/templates/compose_plugin.html ++++ b/plugins/kolab_files/skins/larry/templates/compose_plugin.html +@@ -3,9 +3,9 @@ + <div id="quicksearchbar" class="searchbox" role="search" aria-labelledby="aria-label-searchform"> + <h3 id="aria-label-searchform" class="voice"><roundcube:label name="kolab_files.arialabelsearchform" /></h3> + <label for="quicksearchbox" class="voice"><roundcube:label name="arialabelquicksearchbox" /></label> +- <roundcube:button name="filesearchmenulink" id="filesearchmenulink" class="iconbutton searchoptions" onclick="return UI.toggle_popup('filesearchmenu', event)" title="searchmod" label="options" aria-haspopup="true" aria-expanded="false" aria-owns="filesearchmenu-menu" /> ++ <roundcube:button type="link" name="filesearchmenulink" id="filesearchmenulink" class="iconbutton searchoptions" onclick="return UI.toggle_popup('filesearchmenu', event)" title="searchmod" label="options" aria-haspopup="true" aria-expanded="false" aria-owns="filesearchmenu-menu" /> + <roundcube:object name="file-search-form" id="filesearchbox" /> +- <roundcube:button command="files-search-reset" id="searchreset" class="iconbutton reset" title="resetsearch" content=" " /> ++ <roundcube:button type="link" command="files-search-reset" id="searchreset" class="iconbutton reset" title="resetsearch" content=" " /> + </div> + + <div id="folderlistbox" class="uibox listbox" role="navigation" aria-labelledby="aria-label-folderlist"> +@@ -20,7 +20,7 @@ + <label for="foldersearch" class="voice"><roundcube:label name="arialabelsearchterms" /></label> + <input type="text" name="q" id="foldersearch" placeholder="<roundcube:label name='findfolders' />" /> + <a class="iconbutton searchicon"></a> +- <roundcube:button command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + </div> + <div id="files-folder-list" class="scroller"></div> +diff --git a/plugins/kolab_files/skins/larry/templates/files.html b/plugins/kolab_files/skins/larry/templates/files.html +index db5a222c..05772770 100644 +--- a/plugins/kolab_files/skins/larry/templates/files.html ++++ b/plugins/kolab_files/skins/larry/templates/files.html +@@ -29,9 +29,9 @@ + <div id="quicksearchbar" class="quicksearchbox" role="search" aria-labelledby="aria-label-searchform"> + <h2 id="aria-label-searchform" class="voice"><roundcube:label name="kolab_files.arialabelsearchform" /></h2> + <label for="quicksearchbox" class="voice"><roundcube:label name="arialabelquicksearchbox" /></label> +- <roundcube:button name="filesearchmenulink" id="filesearchmenulink" class="iconbutton searchoptions" onclick="UI.toggle_popup('filesearchmenu', event); return false" title="searchmod" label="options" aria-haspopup="true" aria-expanded="false" aria-owns="filesearchmenu-menu" /> ++ <roundcube:button type="link" name="filesearchmenulink" id="filesearchmenulink" class="iconbutton searchoptions" onclick="UI.toggle_popup('filesearchmenu', event); return false" title="searchmod" label="options" aria-haspopup="true" aria-expanded="false" aria-owns="filesearchmenu-menu" /> + <roundcube:object name="file-search-form" id="quicksearchbox" /> +- <roundcube:button command="files-search-reset" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="files-search-reset" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + + <div id="folderlistbox" class="uibox listbox" role="navigation" aria-labelledby="aria-label-folderlist"> +@@ -46,7 +46,7 @@ + <label for="foldersearch" class="voice"><roundcube:label name="arialabelsearchterms" /></label> + <input type="text" name="q" id="foldersearch" placeholder="<roundcube:label name='findfolders' />" /> + <a class="iconbutton searchicon"></a> +- <roundcube:button command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + </div> + <div id="files-folder-list" class="scroller withfooter"></div> +@@ -75,12 +75,12 @@ + <div id="folderoptions" class="popupmenu" data-editable="true" aria-hidden="true"> + <h3 id="aria-label-folderoptions" class="voice"><roundcube:label name="kolab_files.folderoptions" /></h3> + <ul id="folderoptionsmenu" class="toolbarmenu" role="menu" aria-labelledby="aria-label-folderoptions"> +- <li role="menuitem"><roundcube:button command="folder-rename" label="rename" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="files-folder-delete" label="delete" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="folder-rename" label="rename" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="files-folder-delete" label="delete" classAct="active" /></li> + <roundcube:if condition="!empty(env:external_sources)" /> +- <li role="menuitem"><roundcube:button command="folder-mount" label="kolab_files.foldermount" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="folder-mount" label="kolab_files.foldermount" classAct="active" /></li> + <roundcube:endif /> +- <li role="menuitem"><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="folders" task="settings" label="managefolders" classAct="active" /></li> + <roundcube:container name="filesfolderoptions" id="folderoptionsmenu" /> + </ul> + </div> +@@ -203,8 +203,8 @@ + + <div id="dragfilemenu" class="popupmenu" aria-hidden="true"> + <ul class="toolbarmenu" role="menu"> +- <li role="menuitem"><roundcube:button command="files-move" onclick="return kolab_files_drag_menu_action('files-move')" label="move" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="files-copy" onclick="return kolab_files_drag_menu_action('files-copy')" label="copy" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="files-move" onclick="return kolab_files_drag_menu_action('files-move')" label="move" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="files-copy" onclick="return kolab_files_drag_menu_action('files-copy')" label="copy" classAct="active" /></li> + </ul> + </div> + +diff --git a/plugins/kolab_files/skins/larry/templates/message_plugin.html b/plugins/kolab_files/skins/larry/templates/message_plugin.html +index df8452b0..0be224b5 100644 +--- a/plugins/kolab_files/skins/larry/templates/message_plugin.html ++++ b/plugins/kolab_files/skins/larry/templates/message_plugin.html +@@ -6,7 +6,7 @@ + <label for="foldersearch" class="voice"><roundcube:label name="arialabelsearchterms" /></label> + <input type="text" name="q" id="foldersearch" placeholder="<roundcube:label name='findfolders' />" /> + <a class="iconbutton searchicon"></a> +- <roundcube:button command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-foldersearch" id="folderlistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + </div> + <div id="folderlistbox" class="uibox listbox" role="navigation" aria-labelledby="aria-label-folderlist"> +diff --git a/plugins/kolab_notes/kolab_notes_ui.php b/plugins/kolab_notes/kolab_notes_ui.php +index f180f50a..bf790237 100644 +--- a/plugins/kolab_notes/kolab_notes_ui.php ++++ b/plugins/kolab_notes/kolab_notes_ui.php +@@ -22,11 +22,12 @@ class kolab_notes_ui + + // add taskbar button + $this->plugin->add_button(array( +- 'command' => 'notes', +- 'class' => 'button-notes', +- 'classsel' => 'button-notes button-selected', ++ 'command' => 'notes', ++ 'class' => 'button-notes', ++ 'classsel' => 'button-notes button-selected', + 'innerclass' => 'button-inner', +- 'label' => 'kolab_notes.navtitle', ++ 'label' => 'kolab_notes.navtitle', ++ 'type' => 'link' + ), 'taskbar'); + + $this->plugin->include_stylesheet($this->plugin->local_skin_path() . '/notes.css'); +diff --git a/plugins/kolab_notes/skins/larry/templates/notes.html b/plugins/kolab_notes/skins/larry/templates/notes.html +index e591ea70..4a6fdccc 100644 +--- a/plugins/kolab_notes/skins/larry/templates/notes.html ++++ b/plugins/kolab_notes/skins/larry/templates/notes.html +@@ -24,7 +24,7 @@ + <label for="quicksearchbox" class="voice"><roundcube:label name="kolab_notes.arialabelnotesquicksearchbox" /></label> + <a id="searchmenulink" class="iconbutton searchoptions" > </a> + <roundcube:object name="plugin.searchform" id="quicksearchbox" /> +- <roundcube:button command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" content=" " /> ++ <roundcube:button type="link" command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" content=" " /> + </div> + + <div id="mainscreencontent"> +@@ -47,7 +47,7 @@ + <label for="notebooksearch" class="voice"><roundcube:label name="kolab_notes.searchterms" /></label> + <input type="text" name="q" id="notebooksearch" placeholder="<roundcube:label name='kolab_notes.findnotebooks' />" /> + <a class="iconbutton searchicon"></a> +- <roundcube:button command="reset-listsearch" id="notebooksearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-listsearch" id="notebooksearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + </div> + <div class="scroller withfooter"> +@@ -61,10 +61,10 @@ + <div id="notesoptionsmenu" class="popupmenu" aria-hidden="true"> + <h3 id="aria-label-optionsmenu" class="voice"><roundcube:label name="kolab_notes.arialabelnotesoptionsmenu" /></h3> + <ul class="toolbarmenu" id="notesoptionsmenu-menu" role="menu" aria-labelledby="aria-label-optionsmenu"> +- <li role="menuitem"><roundcube:button command="list-edit" label="edit" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="list-delete" label="delete" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="list-remove" label="kolab_notes.removelist" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="list-edit" label="edit" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="list-delete" label="delete" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="list-remove" label="kolab_notes.removelist" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="folders" task="settings" label="managefolders" classAct="active" /></li> + </ul> + </div> + </div> +diff --git a/plugins/kolab_tags/skins/larry/templates/ui.html b/plugins/kolab_tags/skins/larry/templates/ui.html +index 1df50730..0b8d66a7 100644 +--- a/plugins/kolab_tags/skins/larry/templates/ui.html ++++ b/plugins/kolab_tags/skins/larry/templates/ui.html +@@ -20,9 +20,9 @@ + <div id="tagmessagemenu" class="popupmenu" aria-hidden="true"> + <ul class="toolbarmenu iconized"> + <li class="separator"><label><roundcube:label name="kolab_tags.tags" /></label></li> +- <li role="menuitem"><roundcube:button command="tag-add" label="kolab_tags.tagadd" classAct="icon active" class="icon" innerclass="icon tagadd folder-selector-link" /></li> +- <li role="menuitem"><roundcube:button command="tag-remove" label="kolab_tags.tagremove" classAct="icon active" class="icon" innerclass="icon tagremove folder-selector-link" /></li> +- <li role="menuitem"><roundcube:button command="tag-remove-all" label="kolab_tags.tagremoveall" classAct="icon active" class="icon" innerclass="icon tagremoveall" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="tag-add" label="kolab_tags.tagadd" classAct="icon active" class="icon" innerclass="icon tagadd folder-selector-link" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="tag-remove" label="kolab_tags.tagremove" classAct="icon active" class="icon" innerclass="icon tagremove folder-selector-link" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="tag-remove-all" label="kolab_tags.tagremoveall" classAct="icon active" class="icon" innerclass="icon tagremoveall" /></li> + </ul> + </div> + +diff --git a/plugins/tasklist/skins/larry/templates/mainview.html b/plugins/tasklist/skins/larry/templates/mainview.html +index 7f84cec6..ca40df13 100644 +--- a/plugins/tasklist/skins/larry/templates/mainview.html ++++ b/plugins/tasklist/skins/larry/templates/mainview.html +@@ -39,31 +39,31 @@ + <label for="tasklistsearch" class="voice"><roundcube:label name="tasklist.searchterms" /></label> + <input type="text" name="q" id="tasklistsearch" placeholder="<roundcube:label name='tasklist.findlists' />" /> + <a class="iconbutton searchicon"></a> +- <roundcube:button command="reset-listsearch" id="tasklistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-listsearch" id="tasklistsearch-reset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + </div> + <div class="scroller withfooter"> + <roundcube:object name="plugin.tasklists" id="tasklists" class="treelist listing" /> + </div> + <div class="boxfooter"> +- <roundcube:button command="list-create" type="link" title="tasklist.createlist" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" label="tasklist.createlist" /><roundcube:button name="tasklistoptionslink" id="tasklistoptionsmenulink" type="link" title="tasklist.listactions" class="listbutton groupactions" onclick="return UI.toggle_popup('tasklistoptionsmenu', event, { above:true })" innerClass="inner" label="tasklist.listactions" aria-haspopup="true" aria-expanded="false" aria-owns="tasklistoptionsmenu-menu" /> ++ <roundcube:button type="link" command="list-create" type="link" title="tasklist.createlist" class="listbutton add disabled" classAct="listbutton add" innerClass="inner" label="tasklist.createlist" /><roundcube:button name="tasklistoptionslink" id="tasklistoptionsmenulink" type="link" title="tasklist.listactions" class="listbutton groupactions" onclick="return UI.toggle_popup('tasklistoptionsmenu', event, { above:true })" innerClass="inner" label="tasklist.listactions" aria-haspopup="true" aria-expanded="false" aria-owns="tasklistoptionsmenu-menu" /> + </div> + </div> + + <div id="tasklistoptionsmenu" class="popupmenu" aria-hidden="true"> + <h3 id="aria-label-tasklistoptions" class="voice"><roundcube:label name="tasklist.listactions" /></h3> + <ul class="toolbarmenu" id="tasklistoptionsmenu-menu" role="menu" aria-labelledby="aria-label-tasklistoptions"> +- <li role="menuitem"><roundcube:button command="list-edit" label="edit" classAct="active" /></li> +- <li role="menuitem"><roundcube:button command="list-delete" label="delete" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="list-edit" label="edit" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="list-delete" label="delete" classAct="active" /></li> + <!--<li role="menuitem"><roundcube:button command="list-import" label="tasklist.import" classAct="active" /></li>--> + <roundcube:if condition="env:tasklist_driver == 'kolab'" /> +- <li role="menuitem"><roundcube:button command="list-remove" label="tasklist.removelist" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="list-remove" label="tasklist.removelist" classAct="active" /></li> + <roundcube:endif /> + <roundcube:if condition="config:calendar_caldav_url" /> +- <li role="menuitem"><roundcube:button command="list-showurl" label="tasklist.showcaldavurl" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="list-showurl" label="tasklist.showcaldavurl" classAct="active" /></li> + <roundcube:endif /> + <roundcube:if condition="env:tasklist_driver == 'kolab'" /> +- <li role="menuitem"><roundcube:button command="folders" task="settings" type="link" label="managefolders" classAct="active" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="folders" task="settings" label="managefolders" classAct="active" /></li> + <roundcube:endif /> + </ul> + </div> +@@ -81,7 +81,7 @@ + <label for="quicksearchbox" class="voice"><roundcube:label name="tasklist.arialabelquicksearchbox" /></label> + <roundcube:object name="plugin.searchform" id="quicksearchbox" /> + <a id="searchmenulink" class="iconbutton searchoptions" > </a> +- <roundcube:button command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> ++ <roundcube:button type="link" command="reset-search" id="searchreset" class="iconbutton reset" title="resetsearch" label="resetsearch" /> + </div> + + <div id="tasksview" class="uibox"> +@@ -131,8 +131,8 @@ + <div id="taskviewactions" class="popupmenu" aria-hidden="true" data-align="right"> + <h3 id="aria-label-taskviewactions" class="voice"><roundcube:label name="tasklist.viewactions" /></h3> + <ul class="toolbarmenu" id="taskviewactions-menu" role="menu" aria-labelledby="aria-label-taskviewactions"> +- <li role="menuitem"><roundcube:button command="expand-all" label="expand-all" class="icon" classAct="icon active" innerclass="icon expand" /></li> +- <li role="menuitem"><roundcube:button command="collapse-all" label="collapse-all" class="icon" classAct="icon active" innerclass="icon collapse" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="expand-all" label="expand-all" class="icon" classAct="icon active" innerclass="icon expand" /></li> ++ <li role="menuitem"><roundcube:button type="link" command="collapse-all" label="collapse-all" class="icon" classAct="icon active" innerclass="icon collapse" /></li> + </ul> + </div> + </div> +diff --git a/plugins/tasklist/tasklist_ui.php b/plugins/tasklist/tasklist_ui.php +index 502bb2f0..de23a87c 100644 +--- a/plugins/tasklist/tasklist_ui.php ++++ b/plugins/tasklist/tasklist_ui.php +@@ -51,6 +51,7 @@ class tasklist_ui + 'classsel' => 'button-tasklist button-selected', + 'innerclass' => 'button-inner', + 'label' => 'tasklist.navtitle', ++ 'type' => 'link' + ), 'taskbar'); + + $this->plugin->include_stylesheet($this->plugin->local_skin_path() . '/tasklist.css'); +-- +2.13.2 +
View file
0007-Update-calendar-and-tasklist-styles-sprites-to-new-L.patch
Added
@@ -0,0 +1,962 @@ +From d91bfd77a71512611b0c7d44d1840348737e518e Mon Sep 17 00:00:00 2001 +From: Thomas Bruederli <thomas@roundcube.net> +Date: Wed, 12 Jul 2017 15:00:24 +0200 +Subject: [PATCH 7/8] Update calendar and tasklist styles/sprites to new Larry + "flat" design + +Summary: With Roundcube version 1.3, the default Larry theme receives a small face-list. This change adapts the styles of the calendar and tasklist plugins to tat. + +Reviewers: machniak + +Differential Revision: https://git.kolab.org/D423 +--- + plugins/calendar/skins/larry/calendar.css | 122 ++++++--------------- + plugins/calendar/skins/larry/images/calendars.png | Bin 2582 -> 2350 bytes + .../calendar/skins/larry/images/sendinvitation.png | Bin 337 -> 204 bytes + plugins/calendar/skins/larry/images/toolbar.png | Bin 3662 -> 1112 bytes + plugins/tasklist/skins/larry/images/buttons.png | Bin 4645 -> 1096 bytes + .../tasklist/skins/larry/images/sendinvitation.png | Bin 337 -> 204 bytes + plugins/tasklist/skins/larry/images/sprites.png | Bin 5961 -> 3799 bytes + plugins/tasklist/skins/larry/tasklist.css | 56 +++------- + 8 files changed, 48 insertions(+), 130 deletions(-) + +diff --git a/plugins/calendar/skins/larry/calendar.css b/plugins/calendar/skins/larry/calendar.css +index c8f36b14..3db114ab 100644 +--- a/plugins/calendar/skins/larry/calendar.css ++++ b/plugins/calendar/skins/larry/calendar.css +@@ -69,31 +69,18 @@ body.calendarmain #mainscreen { + #datepicker .ui-datepicker-activerange a { + color: #185d7a; + background: #d9f1fb; +- background: -moz-linear-gradient(top, #d9f1fb 0%, #c5e3ee 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#d9f1fb), color-stop(100%,#c5e3ee)); +- background: -o-linear-gradient(top, #d9f1fb 0%, #c5e3ee 100%); +- background: -ms-linear-gradient(top, #d9f1fb 0%, #c5e3ee 100%); +- background: linear-gradient(top, #d9f1fb 0%, #c5e3ee 100%); +- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#d9f1fb', endColorstr='#c5e3ee', GradientType=0); + } + + #datepicker .ui-datepicker-days-cell-over a.ui-state-default { + color: #fff; + border-color: #2fa0c0; + background: rgba(73,180,210,0.6); +- text-shadow: 0px 1px 1px #666; + filter: none; + } + + #datepicker .ui-datepicker-activerange a.ui-state-active { + color: #fff; + background: #00acd4; +- background: -moz-linear-gradient(top, #00acd4 0%, #008fc7 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#00acd4), color-stop(100%,#008fc7)); +- background: -o-linear-gradient(top, #00acd4 0%, #008fc7 100%); +- background: -ms-linear-gradient(top, #00acd4 0%, #008fc7 100%); +- background: linear-gradient(top, #00acd4 0%, #008fc7 100%); +- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#00acd4', endColorstr='#008fc7', GradientType=0); + } + + #datepicker td.ui-datepicker-week-col { +@@ -253,17 +240,14 @@ pre { + #calendars .treelist li span.handle { + display: inline-block; + position: absolute; +- top: 8px; ++ top: 7px; + right: 6px; + padding: 0; +- width: 10px; +- height: 10px; +- border-radius: 7px; ++ width: 11px; ++ height: 11px; ++ border-radius: 8px; + font-size: 0.8em; +- border: 1px solid rgba(0, 0, 0, 0.5); +- -webkit-box-shadow: inset 0px 0 1px 1px rgba(0, 0, 0, 0.3); +- -moz-box-shadow: inset 0px 0 1px 1px rgba(0, 0, 0, 0.3); +- box-shadow: inset 0px 0 1px 1px rgba(0, 0, 0, 0.3); ++ border: 1px solid rgba(0, 0, 0, 0.4); + } + + #calendars .treelist div span.actions { +@@ -281,15 +265,9 @@ pre { + #calendars .treelist div:hover span.actions { + top: 1px; + right: 21px; +- border: 1px solid #c6c6c6; ++ border: 1px solid #ababab; + border-radius: 4px; +- background: #f7f7f7; +- background: -moz-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f9f9f9), color-stop(100%,#e6e6e6)); +- background: -o-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- background: -ms-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- background: linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#e6e6e6', GradientType=0); ++ background: #f1f1f1; + } + + #calendars .treelist li a.subscribed { +@@ -431,13 +409,6 @@ pre { + min-width: 1.3em; + padding: 2px 4px; + background: #005d76; +- background: -moz-linear-gradient(top, #005d76 0%, #004558 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#005d76), color-stop(100%,#004558)); +- background: -o-linear-gradient(top, #005d76 0%, #004558 100%); +- background: -ms-linear-gradient(top, #005d76 0%, #004558 100%); +- background: linear-gradient(to bottom, #005d76 0%, #004558 100%); +- -webkit-box-shadow: inset 0 1px 1px 0 #002635; +- box-shadow: inset 0 1px 1px 0 #002635; + border-radius: 10px; + color: #fff; + text-align: center; +@@ -545,6 +516,10 @@ body.calendarmain #searchmenulink { + display: none; + } + ++#calendarform { ++ overflow: visible; ++} ++ + #user { + position: absolute; + top: 10px; +@@ -627,7 +602,6 @@ a.miniColors-trigger { + color: #333; + font-weight: bold; + padding: 4px 4px 3px 30px; +- text-shadow: 0px 1px 1px #fff; + text-decoration: none; + white-space: nowrap; + line-height: 20px; +@@ -735,11 +709,6 @@ a.miniColors-trigger { + font-size: 11px; + font-weight: bold; + background: #d6eaf3; +- background: -moz-linear-gradient(left, #e3f2f6 0, #d6eaf3 14px, #d6eaf3 100%); +- background: -webkit-gradient(linear, left top, right top, color-stop(0,#e3f2f6), color-stop(8%,#d6eaf3), color-stop(100%,#d6eaf3)); +- background: -o-linear-gradient(left, #e3f2f6 0, #d6eaf3 14px, #d6eaf3 100%); +- background: -ms-linear-gradient(left, #e3f2f6 0, #d6eaf3 14px ,#d6eaf3 100%); +- background: linear-gradient(left, #e3f2f6 0, #d6eaf3 14px, #d6eaf3 100%); + border: 0; + border-bottom: 1px solid #ccc; + height: 18px; +@@ -1568,12 +1537,7 @@ a.dropdown-link:after { + border-top-color: #ddd; + border-bottom-color: #bbb; + border-radius: 0 0 4px 4px; +- background: #ebebeb; +- background: -moz-linear-gradient(top, #ebebeb 0%, #c6c6c6 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#ebebeb), color-stop(100%,#c6c6c6)); +- background: -o-linear-gradient(top, #ebebeb 0%, #c6c6c6 100%); +- background: -ms-linear-gradient(top, #ebebeb 0%, #c6c6c6 100%); +- background: linear-gradient(top, #ebebeb 0%, #c6c6c6 100%); ++ background: #eaeaea; + } + + #agendaoptions label { +@@ -1717,10 +1681,6 @@ a.dropdown-link:after { + overflow: hidden; + border: 0; + border-radius: 4px; +- box-shadow: 0 0 2px #999; +- -o-box-shadow: 0 0 2px #999; +- -webkit-box-shadow: 0 0 2px #999; +- -moz-box-shadow: 0 0 2px #999; + } + + .calendarmain .fc-content { +@@ -1752,39 +1712,23 @@ a.dropdown-link:after { + .calendarmain .fc-button.fc-state-default, + .calendarmain .fc-button.fc-state-hover { + background-color: #f5f5f5; +- background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); +- background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); +- background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); +- background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); +- background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); +- background-position: 0 0; + } + + .calendarmain #calendar .fc-button, + .calendarmain #calendar .fc-button.fc-state-default, + .calendarmain #calendar .fc-button.fc-state-hover { +- margin: 0 0 0 0; +- height: 20px; +- line-height: 20px; +- color: #505050; +- text-shadow: 0px 1px 1px #fff; +- border: 1px solid #e6e6e6; +- background: #d8d8d8; +- background: -moz-linear-gradient(top, #d8d8d8 0%, #bababa 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#d8d8d8), color-stop(100%,#bababa)); +- background: -o-linear-gradient(top, #d8d8d8 0%, #bababa 100%); +- background: -ms-linear-gradient(top, #d8d8d8 0%, #bababa 100%); +- background: linear-gradient(top, #d8d8d8 0%, #bababa 100%); +- box-shadow: 0 1px 1px 0 #999; +- -o-box-shadow: 0 1px 1px 0 #999; +- -webkit-box-shadow: 0 1px 1px 0 #999; +- -moz-box-shadow: 0 1px 1px 0 #999; ++ margin: -2px 0 0 0; ++ height: 24px; ++ line-height: 24px; ++ color: #333; ++ border: 1px solid #ababab; ++ background: #f1f1f1; + text-decoration: none; ++ text-shadow: none; + } + + .calendarmain #calendar .fc-button.fc-state-disabled { +- color: #999; +- background: #d8d8d8; ++ color: #666; + } + + .calendarmain .fc-button.fc-state-active, +@@ -1792,12 +1736,8 @@ a.dropdown-link:after { + .calendarmain #calendar .fc-button.fc-state-active, + .calendarmain #calendar .fc-button.fc-state-down { + color: #333; +- background: #bababa; +- background: -moz-linear-gradient(top, #bababa 0%, #d8d8d8 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#bababa), color-stop(100%,#d8d8d8)); +- background: -o-linear-gradient(top, #bababa 0%, #d8d8d8 100%); +- background: -ms-linear-gradient(top, #bababa 0%, #d8d8d8 100%); +- background: linear-gradient(top, #bababa 0%, #d8d8d8 100%); ++ background: #f1f1f1; ++ box-shadow: none; + } + + .calendarmain #calendar .fc-header .fc-button { +@@ -2054,6 +1994,15 @@ div.fc-event-location { + background-color: rgba(233,198,14, 0.12); + } + ++.fc-widget-header, ++.fc-widget-content { ++ border-color: #bbd3da !important; ++} ++ ++.fc-widget-header .fc-agenda-divider-inner { ++ background: #cad2d9 !important; ++} ++ + .fc-widget-header { + background-color: #d6eaf3; + color: #004458; +@@ -2098,15 +2047,15 @@ div.fc-event-location { + } + + .calendarmain .fc-view-table tr.fc-event td { +- border-color: #ddd; +- padding: 4px 7px; ++ border-color: #bbd3da; ++ padding: 6px 8px; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + } + + .calendarmain .fc-view-table tr.fc-event td.fc-event-handle { +- padding: 5px 0 2px 7px; ++ padding: 6px 0 2px 7px; + width: 12px; + } + +@@ -2129,9 +2078,6 @@ div.fc-event-location { + font-size: 10px; + border-radius: 8px; + border: 1px solid rgba(0, 0, 0, 0.4); +- -webkit-box-shadow: inset 0px 0 1px 1px rgba(0, 0, 0, 0.3); +- -moz-box-shadow: inset 0px 0 1px 1px rgba(0, 0, 0, 0.3); +- box-shadow: inset 0px 0 1px 1px rgba(0, 0, 0, 0.3); + } + + .calendarmain .fc-view-table col.fc-event-location { +diff --git a/plugins/calendar/skins/larry/images/calendars.png b/plugins/calendar/skins/larry/images/calendars.png +index 5b5ca85b2b95110ae2193769b04e6c17a6248d8b..41421a1692d5bf21ea6847483aeb2b4522efa89b 100644 +GIT binary patch +literal 2350 +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 +U;TxKeJ^%m!07*qoM6N<$g7~d$r~m)} + +literal 2582 +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 +GkbeWq3{k)U + +diff --git a/plugins/calendar/skins/larry/images/sendinvitation.png b/plugins/calendar/skins/larry/images/sendinvitation.png +index dea30fab7f37dda580d9d8996ff3997ccc235154..5e639c489cdec5aff4423239150fe0c2bebca4cb 100644 +GIT binary patch +delta 187 +zcmV;s07U=M0?YxB8Gi-<004=6%`gA}0Fy~XK~#7FW1ue>1vwLD6#(&nGVyyLcED$F +z0hxv-fG{qD_XF{Hkj)UqgbjtN4}hv~z-cg=3(gZTbUv~V2^)+sJOGd3{UC#2e8L7} +zYBqql3?UA6r2@!Oatxji#t3!;Eao8wBG{xDJRgfI*JDO1!ZdJ#2BRBF7$XeFXK(_t +pp=1~yfXm>13Ui(T!_Wt#003_@#Ruc3S*!p6002ovPDHLkV1kjIL&^XE + +delta 321 +zcmV-H0lxms0nq}G8Gi!+006$CJpup#0CG@FR7C&)0Be+>hp4few!YKf;*zkrcbuoh +z)Y)y7plOnxxy;gusk522z0TX;*y85@|NqI@+<c&`-RJ3rrm&B$x1zhlxXaPt>FfXh +z|CO@4ztPrdlAdXjp8x;<X_B7*|Nn)ju%Wxda+##r<mbK5)PJzW%+@H%{r~^~9&}Pp +zQvmbtz}ws9_4V)Gwy^Z`@7~+k*VWIcosWoda6m9H$A%yP003}FL_t&-)3wM~7K0!Z +zKtV|&*7V-4fV%%J>hXyO7T|nNva&Cc;wN2q1YGu(KI_)unSEYMZ%~;**b=tB$xrhA +zov^7c7U-TjYC3x(?Om&joeA2e!1bU&jqiKh+4OUlvdcfDD~SFh{c0k|f3m6pxHA){ +Tk+%FD00000NkvXXu0mjfdZo5S + +diff --git a/plugins/calendar/skins/larry/images/toolbar.png b/plugins/calendar/skins/larry/images/toolbar.png +index 5e79c66755a031e627b5ca222d52c2400b5e0f1c..5fe9f773fa7f47c17052a4fe095296d2e03179a9 100644 +GIT binary patch +delta 1092 +zcmV-K1iSmr9M}kuBYyy3P)t-s0001HZE<F8ab|6CW^Hk1ZE<F8ab|6CW^Hk1ZE<F8 +zab|6CW^Hk1ZE<F8ab|6CW^HlV+S~vC|Mm9vsjaV!l9k2C%Dlh9?CtG&e}m7_(&FUg +zvbMOEo1SoXdV`3JUsN}o0000HbW%=J0RO*0fZrexFwc*0uYXYQV4o0AXA=Mb1C~id +zK~#7F?9~U7q(BTr(M+YF@YVM}?b74gFVaMe=Y_+4JQO|%Y2P)HyOWK(w|J=NTnFbX +z;UV#yy)SAdk-el6j9xb0yb<Cxy)QBwHX~gs1zSYoilWhI(+r^X77#5IITun;PsO8V +zDKp*4Oym^@j(@EVnFwWKUjWZU-9iVFQN!L{$%sduimrqrT^S?MjSq=-yIp{h_Fbca +zFFbjiqXRNZ&sATL(k<i?YV6Gbap^Fa88+~wqE<LpiHIFAGaD^!x1=NX4TF(gi$u5< +zjik0y*GjDvjz~9}lTLnMBo%j6uX2}rEFyJ%qz{VR+kdyyYo+{=u===2DsK-r8u_(I +zbZay6d+`13cDqg|9fFJ}_Wh#jCl%X@-&62k&KpZZPe;R?k5(TR;ZiVi;gviZ(a+|C +zkzGW#9aURhMyrZ#7ZHNEjPja{dae%1s2nR#Mr##4(p9z0S{;Z~^#YknFR<I~ekb0y +zN5M$ArhgBN%J4E|4i=A$tF;=*aMZFXGYw=S>da9&!95YJ#)SfqiHflil2Om8AQ{a( +zvRqW{XaHdLfp5g9Ya{=)a|SAM!ax}AB%(Q6nkG6~?~-fZ|1FyhvVo-qM|Qx2{{u6} +z!G~dRVI0F;;HMz~0Dw9IQi#t4MQK@?Q>?6fTz_J!RO?1`SlZ})`5=x&0x5Hei9TZ~ +z0;zKQ-TshB3)6duLg^2EE>S3b&>faZiSMlU+_T~naSPAfP)7g&{s-y^^dnq*$Mvm? +zKiAbAk?i9j?9dt$7Sbi9seOkW>pHe?lN0(80D#wmIs*NO+}?3hT~l1^nvY1Ky-k<8 +zmVefm2$z%~Eg^&)x4LdI*L6WZ0s!!GP)Fc=gss7l=|N3$#<<zcdpIKb!H>f*_HaPz +z`|3eSa@I}OPJ5{Tli%sAB+nksM*sjcKplbe5upYq?m<n;%z5Q?4@aa_(pJjW!vU%9 +zs|O`1hrEQa>><V|ztee1nmwG4006uk)PE7^M-1)i45uWu?Tyw>qwS1p+w;aaZ#w?s +zDOboI`Vmq90H`C-k0|Zxlv9%0_O=j~Ep#@u?Iq@%xRWlPa;@y49|3?4({w_5`yqFJ +z5zSJ^Q^m_1OLu-c>5R!{O_C(g&fAp+d(s2jq?QkL$yw`!(s$dKB~s_qAVSq4m_5=d +zljnzE8sld(`x=Z9PMN&^5KP^9mZzj=)E?LqlKmIo0001hFTh_FuUf{(6a_#40000< +KMNUMnLSTY?<O`Yr + +literal 3662 +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 +I#K<%CzhgnwYXATM + +diff --git a/plugins/tasklist/skins/larry/images/buttons.png b/plugins/tasklist/skins/larry/images/buttons.png +index 81bb25587201ae9b8d8fa5ac89631a8c1b1064f1..097c8a32fd74c6356c638cfd32a9092fff0bc000 100644 +GIT binary patch +literal 1096 +zcmeAS@N?(olHy`uVBq!ia0vp^azK2YgBeI#aSFZxQj-IGLR|m<|Noanps?&WNhmG1 +zkR-Iub&Vs?d4?rHe!&du|DP9_U$DQS|Gk1kK*D_kbpHPT0SyZG9nK3R%ztmtU$B1d +z|HTg(7?_PcT^vIy81GzaJ*TZG(DpEY>aGP}zx`YPiRXeyn!1bsoBGF}*D(FyFRjg# +zXe^Y{o~s=i*j~4yM)dej(-ocb7>^lyEt#$RT=sGu|H;q(*9Ck&zg*2F!9VBnp9%Yl +zjG11GKF^h3oPB9>+25wq=Y@OR56;+B)?w~_u1+Spr}0ON+U2P88Ad;)eDyr%NuKw9 +z7aDuM;+^Z8!nqgt>KAR+ljM#_*Zw-SZH3$HQ~HH-b~hD$;W7B8G4bBJIr2VVg(v;> +zUoYTO{QWA!4e{qD^-I_9iF{D?u;#kqE;ZYi3&msV<{j9_dN|cq`JRsD@7voX+I}<x +zEvz<~`KL>5x=Qu2x|3E{GLOZbu6b-Q_2|#*b+HQWe9VCob%|}-D|CBreEjRbeVTRh +zg)N6%qyHWL$;P|tTijfwujzMQS~45g*<VQflNYJ0d-H1itjPLP=k`5c{XFg3jNdbA +zuRnOuZPn#)Vc|1}bK*-=(q>kMEQ*-Iv><ogj^!I&Tx=PvYV%x!`HZT=O@6X%jy`eb +zUz^$CFB!(_pEg`v_iUGGd%xt~RnkV^{=Jsl86Nrm-12wx8{8Z7&z;XZ9(UU3M4X|Q +ztG>eL!%M#NuUE34Z{J__?@N{P$ESZSu1vLj=ah2C@3O7jdDmw<|86?_XWp%vpDbyG +zn+wFxTylGw_cT`N{nWkl(|77*`v<RNUUQ&}&30O&M_5w9M41$`$!e2b`9$27>S=e@ +zDh0Vn`K4sU9oIeC<1wXX_D|cbH_J0VEwEHC^!MJi(R)YF{H^JBR~#hY8U>!p^>uk- +z(^qNzyz-Z3UC88&b4-0ZI5Gv!Mjda8nmsdkz2)Km4{l~XlPeZ_eOBzG*UA`U`>B43 +zZKlsf4l)Oc-B|v3k0pakNa2!=CuVym+zZ>Yk=4ylxO~FQz3pe-aPg*n&wb|d&iqxj +z+SYdgA2Tx(-}^;A_I~^J<4;}HHGK061CA?Q(0uAv<|TP;kF67XW$fcOA9u)Y*kBy- +zX|?Ip$m`j8p9FSHVBIw(usHtTQ~t}cwpn%2v5wK%+I%ig&aAlNxw?7T_bQK`6RQ-A +zt3UCk0aN4;u3abN9=pGuWt?5RIwIqt&I?BG#DGx4$IIXTW&UWf<JV2~qM5+F$KdJe +K=d#Wzp$PzNDluRH + +literal 4645 +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 +b>^c4$A%LCdn+#_c00000NkvXXu0mjfVd)QB + +diff --git a/plugins/tasklist/skins/larry/images/sendinvitation.png b/plugins/tasklist/skins/larry/images/sendinvitation.png +index dea30fab7f37dda580d9d8996ff3997ccc235154..5e639c489cdec5aff4423239150fe0c2bebca4cb 100644 +GIT binary patch +delta 187 +zcmV;s07U=M0?YxB8Gi-<004=6%`gA}0Fy~XK~#7FW1ue>1vwLD6#(&nGVyyLcED$F +z0hxv-fG{qD_XF{Hkj)UqgbjtN4}hv~z-cg=3(gZTbUv~V2^)+sJOGd3{UC#2e8L7} +zYBqql3?UA6r2@!Oatxji#t3!;Eao8wBG{xDJRgfI*JDO1!ZdJ#2BRBF7$XeFXK(_t +pp=1~yfXm>13Ui(T!_Wt#003_@#Ruc3S*!p6002ovPDHLkV1kjIL&^XE + +delta 321 +zcmV-H0lxms0nq}G8Gi!+006$CJpup#0CG@FR7C&)0Be+>hp4few!YKf;*zkrcbuoh +z)Y)y7plOnxxy;gusk522z0TX;*y85@|NqI@+<c&`-RJ3rrm&B$x1zhlxXaPt>FfXh +z|CO@4ztPrdlAdXjp8x;<X_B7*|Nn)ju%Wxda+##r<mbK5)PJzW%+@H%{r~^~9&}Pp +zQvmbtz}ws9_4V)Gwy^Z`@7~+k*VWIcosWoda6m9H$A%yP003}FL_t&-)3wM~7K0!Z +zKtV|&*7V-4fV%%J>hXyO7T|nNva&Cc;wN2q1YGu(KI_)unSEYMZ%~;**b=tB$xrhA +zov^7c7U-TjYC3x(?Om&joeA2e!1bU&jqiKh+4OUlvdcfDD~SFh{c0k|f3m6pxHA){ +Tk+%FD00000NkvXXu0mjfdZo5S + +diff --git a/plugins/tasklist/skins/larry/images/sprites.png b/plugins/tasklist/skins/larry/images/sprites.png +index 14f827197e7a3cdd2fd55339fc663648b2e610a1..a9f8a730072b1295591d0a8bc4e96d6dd35fba13 100644 +GIT binary patch +literal 3799 +zcmZ9Pc{CL2|Ho$-j3HUVOk^25VeDD5lVxmKv&%$TB4laMjC~zrZ#2r@D2?n(bc-<A +zvy5H1gCvq$_Vjh{@1EcJp6~0Q=Xsyc^E{t(-sf}9^ZBG&TV6W{xd;IO0Ow3i46mQ9 +zq5uGp3}!sr9k^EH003-HObzwyB4@XXS%U2*VST07d&2s^+8JvWdrey=){Tt?HbIbq +zj$m%o*kzvX0sIS58c^Z2sHb}Z7bo59+ugit8G2wtF_a$EU7H62b`VwJu{NYCb1@h> +z(m3279LG$BZY+mHG|Y6$FP-?FhVDN>4?hw7bU57R8&qFmD<LO$sqx|OSf**Fz4+Ar +z`;R~B0u#z={UwQ)^ggRAKtLjJOlKsj-|a`y1%=@9Y~4)di>HX62s1em3_=5*Yk*__ +z*+u7njyq2T(-&TLM~#kRUXCj7o-)zwGmMZa+fbpSSYqcV44-^a4pA8#V@LQ+M=Qfs +zSBngM2|BL04Ir(|CdBzpQ!n_i21Ki}sdr(Z7#9LIS^0Q*3*9-5>iDhzi7anEK@i^W +z^YVVJbnZ8&{k0yHJ6uY17X)kvf>JIK;myrd6NHl}--yvi7CD}0R{QBqO?>yWh#)S( +z-`Ufh$1N*ZdVeyVeqWCpJ9<w`s<W5!F8Iqi8a|21V}(Q0Ucb)xwoQk55D6lse_k7k +zPZH-J-C4G<)-eq#x%Qq&Y^gN_Eb9Z8*>ApiCvz3MQejCmH1_U;%4Vc+LI%93u-tiY +zoXu=|lR&@g*hJry)7_m{GnF`dxDZxY)Ob7D-#g4IVD?^}a*utL8u62!<9DDjnR?!h +za7%}k&^9+M^C9yv?hq7pE0M3p+?g)6wNSkVFu|Zj;Y7H)s?~_2(5_2DP8GdVa!R`V +zo)WFuMb-oBkwadhcxY;npOCMpsz%nya)9wo7w^^@R@!-b+Pba-2=0XeGp(F)^!o@^ +zKIin#46#cm_2?Y!dd+mE&oxFY2*x-tl%O|dEmX+u8SMb8df_>ULynpu9EZehJtgtH +z{D>G;g^$_EQl8SR3?WKcZYkA>L5XuM8$zyUsC`bxE-W!MK4`egp~bVfFpQ@Bq+-y$ +z5M?2{5+*oEzXj`yeceN6FUaU)0ot0JjR6h=B2pPiya#3dkDHAYL0g9VLXo$Xty%0A +z0~`_pyMaxZ+;ZR-wo_w{-Mb2aW%O!%P?lKXE<tVZv#ur&4W1buAzOf%yOVN0ToeX_ +z68SqD-Dx?RMG0ZDe50x9XKea>tcV(52o`ZdeWlmb*wucl8h8;P$0+YjWZveGN^t|m +z)&5!%vR%UgXlxANH^U5QLcQMByDN`y^qvx#7fMSKu+N$4$Ky9z>E<6BOJn225!O<r +zo&gv1agZly7)B^DL~%3@g5*!cm&dJ}vSJGLfBKX#k${JfDATtIB!t)QCZvK+GB*{; +zFY8hjOqc87D3q@ovZ$<hs}w^-5^RB@>lO;OJP?waE!9Q#A-Vs2(copgTej~a`(dbk +z>?q0yyKPOoalN&Acv$Z1yhZK}%bgO%9N{Vr&DXE~(o-g^g7&3FU~JMPCv*q0D_uFH +z8B7(dy}4z2lQR~U>FQeHZ<A@p#xUXIpy_XuX2xbu8m<Aq4G1F<FS(W47sM@2Ts?@v +zpLx}8H%WC<eFYHD_&)E$n8CsiN|){pDa=ObgV`$?L_GOJlD}OF<negm{mq^|61R#Z +z7z7DDouBy-G-6Uvx+7VrpsU@9C8s5^?(7an)B^JYq3kS)*W=sTur-RP0&_oq3-o|& +zMnT7Yr`@&wo}T+xzsQRiN8H0f$GLGjirlCr(ml6iZGxPr4~^ZiAbIH?2`~4EF^}kS +z(3h73*^TZN-`!(MHaSewP`o>fR1AowUabOHNEUAquJ|(F`L%*ljO93)_U&u<KCgr( +zt9uXxJ+zZiLvH#2<M!3J-`5HG>88tF&$YU}k}54T1~9`)!thjrz;U-o?pEpz0rXKQ +zi|Oggmo8!bqrfD(TX}h!2n{Rw8gXwHUwmKvGn2m5#ap6*R4uy0$tmj+vHL&c8`k8+ +zatkMOzB0(OM`vCe8M7B{*o}&t%4B#DwXlT5P+mHRX4di7@(GlNr6e%HE5h1g9L}yS +z;lZ<^>6CGE2Y2tweVa*i#p)5{k(p-Ikmjw9v^h%KU+c$E2*`g}c8Tm2upN_`zM1r~ +zybIL#X{>?4(Fcd=EA2`^BN;f;2GZ)Ky|BcV43ze33~D%1b-=EKcsO9XA;V`nGdqNu +z^%JaivMCIb9-UZis<`=U6Gcr@Gr94LNAczJ=4rc<w8?Xhn0~(IoRifTRgWP*o<EGx +zJ8XaH2>-E$wpcU%9ADmds@-`v{z4_8_AXpdr9~@1dX&0=MqfH<OsrXK%i<6G)e-Eq +zCDVxn9&U13g<F_Bo{(=VX%s?l=XBZ6MbMUh2s%1Br>sUUNaE#~?{Fn&49be$S<Of7 +zu3X$jPWmY}Jujd+PG!%F$(YOzs)K61uh!JcjJ9@^c~lM`Fnw@o&dGb*9?zWFz%o@z +zI5$@jdghqZ`OQs8<IP`Hv8{Wa>sK1|VgFw1F)xgb`aX6mWFzFb_kokgx0n9DM}n`7 +zz6?jRblplTi?Jjf;uNUs2}R$a-v28$a5m{@k!@&Gq$TP9g?E%CX#l5Cw4Ttu4J|(t +zoBt&!5gD#(-MwU`1Bda4fXn`r)(H;@B&9$#yt~)ehgIOXqHP4afBJgkO(6QW(b|Lx +zeu5DCfh08^9IEEGM4^$-3iy%3UhpqIO-`=|EZ3Z!O^pJta!?v*b*Z@x!RP?V!6n*v +zH^Kc2CN2dZN01SY<eGG*R~hzmC$#E%GfcnAUg}r#P1WhssHK>C)GwbL=VdXg3;EgE +zwpGg>;=!^DuZ+?r%B#7GlYp56vY%i3{aH}@Y?yfI_~S#D4>Tir{JkBluv9H2>dPRZ +z?nz>>yPX5S4z(oNv0Q?;H8&)kLg`qE`x&%#WboH_u0*f`W719=uj9h%++q0lNMxAR +zsX-DTaHey_*4fP*MB#-#?;3i&x3{}B@1iA;B%eQMrZqOND0-h7ouksQd&f=hR9UOq +z|Agz$;~}S`71H?nY`uGwzZ!?<x7_Q>A{(fk#|MowER>3wzp7Rw2px&`6*YdVc5YaK +z7-{dXJH%?yJ7&x<l_t?mr_J@$YJft|akRi)my3(DM%2zWrNV8t`6Zinx=f0Uc=b*l +zEF!<0WuRgtj7jG(kEju|CIwjr?JEU@%eu8>qhv|qxjd72__Tp7_{3Ist!B7&xY4Z@ +z;4;rbJO1{^$Y&G-aN_0C+yM@sF2niK?X?47&O1i%=&Cci2Ei7LpXH#>h(8=_5pfXW +zK;Fb&j~3K?APLxs_kUE%Vo2W;4by_ET*x%@P7w|Z2P7dpAda!CGcy7SE;z{6bXDu3 +ziN!27c$_qW;9yQV5_ot8%FoHWHBs7%!)squchN+Y!F}n{6m>F*vN<rZghxl%V4*aS +zLwXYFq!y~7IK+^zc#X+7|Dv7Uhs&eYa-*UA;vRV{rJNMrA-nU4bm6X<SC=6r7&ApC +z4alDb<=w24D&snIQ1v>7o*k8NP%n@8LldU6k4)G4gVfkZa9d-mut8r@$9dlWqcA%y +zE2{;&5SdYlE6}w>oUAS!7{4-DZI5^F*03xuGrXOw_v&pPOCxJ-Tc&^pHavq|S}?-U +zu$!8w$SV%Y^UNo#Tbl>V{R4T^{!`3;F@UGLwfD9V-xVk$<*sp_2^jkHMmLYNnWa*w +zDNO8-nGY{Ba>gM_I48IUD}F)oqgRP*^!>HJdzO`UpiUHMXFNF{Lvt%rd26S-zZREx +zh)nXlJ0Il2U{b;Nu!S2F7d9TGgr*F_#JPnwkul~k_5N;5T&I@9sq%Avb2qZ-@0EZx +zB(}ajGctI(ZNMa>0S-H;q7NDK@*bj-tYwZaIExDonKTdjD$hi}c-M0V_rgn>+EV_~ +z(;L7lmPnn><3bl83EveBezOqp=u_NCynMW%a{Zq!Zv}R;3|Q?GKO*GEahta!eMm)b +zTP`wBz&cW9n&A^MVI;Y@he5_<Av-bpN#iUrABlVF^grd+vbn3GI4+U3i)-NK?}G3B +z4MFlmoK)$Fa)I=QNvc2x4AVB-VT$H!Sz@__k;`X>k{|1H)n8?Ml{@Pt4yHSJSJvgU +zrhL)Z8ffE;fb=r583PjT2N(mg!Ja5C5e%(Ec+06@q8kGz`Ci87!%=Pg_0-D^^BSlR +z`Lj9uif8Zfxo25DeFCt|8e=Y^zv|#htovCU@xIowm{WwC+M_z{5L)v7<YZ93G~NQe +zmm(3T_nq^kMw?j2_HWQDDvE1)U-CUQSHkEM?$TJ@)|i-m!~Iw1nkV@`XA_BEn+FPe +z#@9#Eha@ahYTul;hrJJ__WMsW&iSz^OUlTs|L93ynerVm)1IA`CNFl}&`6T${wJ-@ +zv&yJAUb&P$VTsWp1i$9vqW6XFXbY{0`O7d5Z<u@TrWaqp3w7(?d3p1>fq^#%raaQ0 +zz76gOrKN-gXoMqc?%u{{)Xw-j@y>a=3}Lqgm3;cYhpxXruXBu?5B-b})7o1t%=vVD +z;Qe7&-G%9&L$PW%4PybPJ(`OTJx;95(<4D}_F*Tc&71#Z8o|<=FKPwrp3q*@zAqSm +zCZhPS2~X!^B6_Wk_g<#-PCI1H!A{HOikCdXMkB_W|E|JzaBOlNQzZBbFA+8SP5C<e +zNzc3k_Y@x_sd%|i_|E#=yXvLW9~6CY7;rojYkJPc7i{}1Yf-ndvE0?@{TJ?^Ik!9g +zI<agrf4nwJeqmp^9S)hauqyFCo%F(l-1&9-V35=;-B6v!aD6TBuCBBa%a*<911Y7= +zqtTFBa_W$7)ZC57Ige&qt@atRQ_WfsKfmNR*nDdOC;JGJ)uox`M#x)dQ%EIJ`%)E$ +xS7?p%)P?}va~%s;b@;KQ$!|+nSDwk=0LVMIQi#(A^lV@Sm>O9clJz~~{sX{#EM))y + +literal 5961 +zcmV-P7q;k$P)<h;3K|Lk000e1NJLTq001Na00FKD1^@s6_*|rt000*dNkl<Zc-rip +z3s6*7n#Vgan^-ZMp*FQ9wNvi0m1HWj?qtc#PS!Cmd?jjB&>$cPH1Y<OH$nq?06{<$ +z0YMP)1t=;HUqMYoz(?>A1&JC_0|J8LBZz<~pl82-SGRRXkcZOu_RQRW)xYlTbIzrI +z{hf2Wzk9e3g)CXR(2qa<Xhbd`7n4~p^#)=C)c{JfzCi<L2oTL{CKd=Hq9n&-DJVBZ +zoyLq@E+$YpqJi~3+HC-&7(j>)7mOjJ-r5O)#eizoMgYrxqG>1wP&}Dy25`B?#hQWc +z^;9(D#Q-wY0C{Q5P_Es>V8K^Ijac1QfHwmK{8Sx7#I$2fEFe=&l#CVnB29z}^a;pI +z6D31^0Wu&rtGi8>ELnf=;+z|ht;kX2PxS%D?QxV_)uTBd-F}>(ehRNquBo3u{(~4G +zzax9`J5Br5Fdr#+w~>N(en<{?tD?Fbaza~5Ohw1Hc|Yhpa%vc_X?2e$zTM8RoGa48 +zbc|N;wht8i?thQyyz}{cE!W;r@N32&-9~rn8fXkJNI!+hpqskPKf0}jX?|D1Z~nW2 +z1E%_46#T;L1bY5l5pDBZT|;GbPk6h%%l`B0T^TVI&w{CVMZvGySXWbfM_mJb)4eM2 +z93u1R^0}hB|Mzx#Z!qP<6#VR)BRad9n)cH+BXkKg;xP?sMCSftx2o1)x2nc>M|8F% +z##A)Sv#!>{Xx$VWQ-Qrs=YzY=X<FT_4@Pu$UOZRy;8;m1mD!TrT1!hx5g84TXx;X^ +z&a#qHbkp6$zm5RFFqrE-+^P^AKxzlJuAvg@{`6i;^<R4I-l!W%wi1Gh0W|s6ikJ$F +z8FUk(CiTz92<$-^FTc!~R)=w=kXjfojjF(Nx7VqE%f{#f&_9t))G)GS$<mR`%*;&Z +z&YjzAXJ^M@tfNeH5EBy<BXe_eV;>)%>V$-Z?n8$TaTx0;Lmk?P24rt<&%M07IAe@2 +zU%s42M@Pe0N13_~ZA1f7sZ@N$iWNLDF_Eucy&92$v5qoz9omQnR9#)o>+0(IG}?&y +zvthhs$&&K$@bF%ZI<!%UDSv-|9u^kXt5K&ATNDY5nO==L(SbH^-po@|Q+Zlin$YSp +z)QJv6Z{D1ooZJHlWvCM!C?zGOnYyP35Xw*|I?$dyduo!Bl6nB440WOdWoBlU(3fEk +zAe5m_iWHXdXNxIh$&&StA}cE^1Eo?~ZewGklpMy|+S<U=)3cKDA--tQB0g{4JV~LD +z+FB#G&dA8Xk1W!VTFJV}!NH+CFE4M|g$oyWc6K%|C@A3V?d_G4bko9x3oGe2>^>#< +zMSJ(|U3cZm6@LHz{Yw11L6R{;N!fjh$Xy%;#m2_g5{Rj!FuQi`x{F`>ZQHg<*G+(l +zi;L^ty?giFwQJY%+}vDgyNSAnr>Cc5kCF}s^7i&lp~3sGs;UafJoYBZU~o)tK;JD7 +zcJAESPSLp~X=I?lz`!6Jw-Zd~kt0W%C53@#++03$<_z!X=(vkCRZ<v;0E)?8Y7kkn +zWXbv)*C(HRV#GN&8nQn&apFWy%N`y-e!O<Q&o@IGWDF-yo_z5MQhYM}G0LO4qobqH +z>N3>z_vrzSwr*~2>H~sv=gz$t*x9pZ%kjs0Gd}eIqKprqZcqP?;K9McJS!`UU%Ytn +z`M|IdJ{kU)&?rOQV1YtHLU?3kBwx95r8>ttfByX7!LSiN8U7fIb%Y*uFA8+|^5ww; +zVFQF2e+Z^^L3Ez4%jmf7#l{l;06rCr{vX7iDjd{(cF~}tgb>4n`Gfe{z}|?RV@N=R +zLVx2EiulFYf0W4bS;Mkq$&#g48b3#={7UIuKGo5KPjPVPU)j6z@z(YQpMEoEP(KGW +zNjjDsLQWIdjXY{#AeOd<QytyQE&M~dGJH7?Tfc=b&(7l>amjp+Dx6Pq_2gez*mw;9 +z<Sik{;lqd1%F4>p4jecj1e?(JFSND2(KibNTINN>@z9Jd{8D`bFE0P7c5Bh$nw!mc +zTXr8i$(2i2@LAqLe4Lg2hCX0Mef#aV33$_@qN23hw{NG_)YL4a<SvRPO%rH#P6%b! +zJB*dmV2)pKgG=mc9=mN9Z|ita8=AUthXVoFQKT$`!dt3p>sMW@t>+#q*YH_B!TbwL +zJ7q60uNM{;#%QC`+1a_Qq@=_}3jokxfBn@Qkb-E9?Ey5~GhnYvOd=1@%Hyr~JJd60 +z_5`vZX&v`ST*qx#47U#sUxi=&k~5X<%E*;`re{F=C*RC5R0u>c^R<zA`0(LkYX3T3 +z3w`k5L35lvN+-1>;Wcf8<y#7&{1evP^-0U*OEb4W1PsdDR;2L2O}X5E{Wk8rVhxX3 +zpIL(P{G!rmhnOU8wRjm{6ccZ$5Qt8ET7@?$EiFw349cDcI(_=IFUsjZ0<*MbCr+IB +zvqGpV^$i#O)@|YLD^t0NhmU%E#P8V6gEI5E|Ay_{g~~71TwOKE&e>?TZ*Z$4b#2!E +zq8?c!bw~Kq;{$_P2!t-vjI%_%rsOXT5$kbqSa!aOd#%~Tm0>Y_wvVd(Qr)#v#TDoH +zw<pf<pRd+&&*+tYv%CWD+0me9>$d_XzL#WfRDFHD5Fq5vojWQz-zbd+GX^-K_a(-X +zW}E@W{8^cy@;E^SuFK}mG@k5e+^AAAD&w+ul-Y+xU$+Wg%I#_F#O3Vd_uB7Q_K{(Z +z1(a|Xr-8kgx@FP6efySc%Mdw?Geutl)UCTME!hW;aF2v^?i`!M9irm76D@<*X7Zzz +z7dWZ7zll*mVHdBcsCWVeYX>}lsg198ob?A~NZ!!?-~q3yyT&ipUgLF5Hvv)u;6dc# +zZ;|b2*GE^W-O|zmkSG8@?`1j0@QWNlAPN|?8jn)Qk|j&l0F=J}hyhtiW&$fwE(MG! +zxtYv+aWm@0gh3Se0IU=P#)!<}(^qQwrh{cd0K7)Iu*^u;Km}wD-@exdYoV~zmI;9h +zbPdGGJpgh_PxS!QS~MUb6eNI=fkf;w=?As+yS?;ZjMD#fNdMz1pBExamaKv33$r<| +z7@JuQr{&91a$uTy_!N5=rHQL2Gj;c7SWZ#8C?x~3@m2lVZgCV#$=}O<_~`;$x^XMB +z4UJ@9JGg%!36OJGw718KHLT(0Z5vGKR5#vOfY;v9EA1o!qIquSzH$u{-0I~Wx42}c +zN=o+=9p-CCkJnx4&D|&>CT`w_<1B0pP29Z=U1F11U~-0PveM->QGr|+FEv7R7A9pd +zYgIU#wZLD!^oUPmPRmv?8eboZ3bbZx?j)M`W<F_IY(e5WhIK5xQ!|-cTna<IxIj61 +zliUcxH+@SFqa5|3N63XD;hmP%!!A-pD0%CSNlvk=*}^rOdl==Y7Zs@O{{7MI9UZK_ +z<3SIj{QiRnqs2ZQdKh_lAAVUOOO~u5&{U<f(F~UbN>evaC6-f^&L2n$qzs7&c8{Yk +z$W>{~Ehdq<g~zx{3gnrvmW6HG!y<MRve4`T7PWC}prk+nYqMC?&hOc>T?bi2?miZp +zo)sb~P*isQ6QHH}`&r=H%q5ZnZ7)6=v@~!3lL!@^u9P-HKV7N*X35rF>L^8S-^=J6 +zl5vs(?LS)f{`sr*EW7kLyV7u7m6WyZeMvyRoNGUPy3_nIHbG%Q3s$aCWqw!UiQV5; +z6{bQt>cs+iWxA8cWD8#vb6Oh5e3Cb?Md{frAU%r(W^84?Yc?{c$Q2CrXovPX1+w)E +ze%CR4IrB@~%ofx44hA&#E_@F~<{!Xol&kB}4()Xcv~lO&G5GGmn`6&<mQjy(Xs=VC +z&aSTi?Ck1hUETc~?a*G=sq0JRR|esi6tZMVJx?e>#@PQnp#&LY|MP?*XN>*N6H1aX +z_CHTJ_>58HdBXlPMv><U`_C9fo+s=-V-#VYP=t(ep!0+xWQ>EGCln!L9Navi2pQwx +z<_YDDQPw|VV)qjHRZU_iy(Zf_{(idi0wi{nL%F$5vbL9Yj<Kww@=piKPO=qS^O<Ah +zN@nRFisa66yoJqhNr0R~BgW+(EHS|a26O=wi^|GnN*2RrdHA>^Jr)&al8wXg+1^3w +zlx5DMC0=oxw@xH5*USUOjIPomC|_}BWH;sQGB|wZEL*d)kU2)hv$??$jILcXB`DL> +zUHjCLqKoQ`MFX<+4f-&1&%P-wZSB@obq&mC^*Uxt2Mp$Z!Nx6ZZPwmN^g1{qWTLf5 +zlUH+mg1pRqgPDb2NYKthNB&rQqe%q_E9%17^_g!Ml>QLnfPwBE_?aj``;H#>4$H`5 +z%7{30m8$Sa+4}{hWg!mKeU5CI$)(!*$&Sksn0sX0LY;zqI@5gk#JLV*!c*5<(gk$x +z+YTLNO3Hogg2T;kH{YG;6rITCN3RONk&ItbI*Ul(9H3L6sq<W|=?Xn&?!TB>1}t{3 +zZn$pZND%(<DSk*>@(&$hc}1nZ+DCGbEp-ZH<`=>oV-nR_<s4N6LnO}sa+S5Tw$0N( +z7>oLpg4Db{%snxK&0oEN1yc?!xGGDUZ)beZbUb`WDegn|`0-;`eR*WmtK`?@j8K-W +zfoR8$9ZIsH;srHkhMDr?X|oJp6vl|$3}apKoce6Gwb7UMu6&}MbIaJ77Dg`$#L4VM +zpwe=3E#`zoa(JrC!h3*vUZ7&~20_==JP(wmf5<6Z^zD<nnOiT3em*EoRLY;xg#%7K +zzf`&~D~in0>^wd{Wg~Y>SVvGXe2VizK6aL+aeokA+NfyW*g#khK#iHA4~?_5^_pno +zP(0beZG*)k#=Tds=YDImx)-Eu;xxa+>Bm<cDUYya8~cMnmzd&BpY9qBWC36R`pk&f +zIeD4+sJKmN6sK&F`=qSrOE%{|@}%zaO3UI4Q#1Lh{6d~z`UAgt=hx_g>`}^IcYVMD +zq#qqQUB28qaUJ(ro2|CD+F9H?J)69RFW$I~E|G6PBD{C#V4#F$MgzUu+|}z%_d+-4 +z;Wi8EyBhdq<Zxf|BD#41WsnU38SED!*FvG2;KAMkkFL*e4<ML80t?u<gMha3<buM^ +zL0_G&>6&I(180D;K~KCdTXidB(+<vZcB>=hM?jwOYuX13<E4#`psO^y|G+ifb)gp> +zbMYU}Uu>_tdHdet%slSDK8J^_-SluUFa~{$A2#6c9a~2OyO4<c$12Zrk`i51d*kLk +z6#?aZSA2c25i%W$hm4;1>3kbtgky@_OlFcL`U+XHWXX~xOO~v@HEr6oH>XdZ?u6xl +z+UQ#JIF(8CjF(1o(To{0Mn7GTGSs0B+KQ1>jim>sHM+XGHrm?SUYa>`riHc+>nKAV +z-F~hSZN<v;e2*VL-Z+2${6>0YMk76YGakk|%BT)7PGYB@7IY)EMtbgMqr1C1tX@YM +z>a^`7fug4<!P3GAp{`xK)(8t>q=p&|D`d%%B}<kpS<ff+BxT>)AS%#=2@^h}XP0%* +z2>`q|o0^(BD@4|CdWhq}uC6XlH<^86yr$=y{Y>=+3bFO^#~)9-ckf;YMGB89<XF;u +zfO%+WXt+Wm4X63)gKceXoNm9%TU%T4RFWDhH&jR^M2T+Y+|k_JtOg1Q2#8iltl{)@ +z$%BYcWo4x%IudK{+_{zy9y}04M|v3q1qJ1(qoYUqKp{((ELpN-$$BwqAM~J4Ksdrc +za$iFaEmrCikUGJqgujMTS*6|pA&sT{n%}y03t(PUW*{XHl6*u7OSqNR{Uiax!6A;v +zkXPe4Ehi_Z#L&=?;j~ssfF3=1#Ocu}&Gbn5{TdKs@^DGU5Ix_gnV$N;lU{luB5Dw+ +zBmgl|=!F0xOO`BIvi?RyKeEN$-QC6X%U`T7Ku_kX^#X_@gM0|q4<ICHm^_E|0!Wy` +zN-<s-Wr-Ls=psY~Fi7%|upxWoH*enL*RNlPQKs90e(KbzjkHGzfe;zIF^)R4OMu}B +zg#S#^IS?WQC>Y}h(E$Kp@V^g$YE6$t)h&=FiDyCs2;GFpJXHsafAENZzF@o{N(y}t +zx(YxTGkO7py$s!juG0%3+L3DT&$|m3F4QRWM9L?YB}<kpS+WK%n%Vy^%Ck36R{0yr +zVJJ%+M)^^NCh?Edhg2j4c{V-D`{u}zBPU6HIP?bs>ZIjk2M32(DjFu%f#EQUf+vlY +zVS=uDl`_Y(=&J48x8u;~x1zw%5yvnB*+xefIQ+>a05ue4iws>=TU*;Cc2~VjheG>s +zh@*v~ZZbkw5m2|awRNPrt3=k+UAuN26F_0yaQeqf5!Jn;kVunqb8`;^in@?jS64T_ +z@x~kD6cTHEc6N3V4f1X?GqWY=PO{|se9Dw5iM0Gzh297-vSi7UB}<n0qVxH=-oS)} +zgm73dptK-ZYArd87D)0)@jj%GrP;Hd>N4%RWL>5O5L(hM15_U{(n9IiV3zkRS+Zow +z(uGV+OpNFzHpVd4B?Fl?YnCxha27i{I&!+3j@np98R|rZv9PdE0zjow@u;XM9vd4A +zV;yB`IJ6N3X7=pa26Pvl_Q=Rco|KftQ&UrUT3Q;6b#)o)&<1UF4&>qC5gi^L&Xbdq +z0nw{bhc;-db0F%L8amsY(@l?fSy@@HMjhIqt<Hhy(>KS&#BdVp%V>kPItNNgNomI5 +zr5k23J3G5xjXJbJTb%>Z4Yg|U>5*>w`ug^2)S(U9igEH%bYfy6Pe@4M@$vD!8g*!c +zwqoSH26P*Q_Wt%Vv_V_Z?rL%M>Q$bfpWowq2xX{48?lcNjLF3}ZrtE?b#-cE9c8GK +z^3cTy02<2|pU9H+_oLZMmP{wRJg27*eGVNG;=2FD34W)gg%4C{i*2y&&>vj{2D;s% +zH`sgZ7;kEB=3S2-^=Y(0TWo`EhaBi@KR=I7dZPw9XS$%IM7`|j>gv_PHrNK+4mr?Q +zo}LRjy1RKRoykz!)Wo-c|2>v?EpX2|Y=dow9B6{OyJu@>C;zp*UF|Ck4LrNB5X(Nx +zuno2y`qLMjoV=Uqf`A(|Cg57?j?&6XzG?SvexbG&#yZMS_oN-R!L~yV^cOoj-`gD> +zyq->X|Ao5a#HCB>Wo30W&!8L##=5W$ZLtlu9de-mwX*WRL8s(gY;5GmE?iJAt8d*> +z`}F0@@RQfVHrNK+4mr^On3)CE&?hcAdzPQ8ujiL20(}{6&=%WZ+aU+~kMZLd7o9o7 +zf1!&3>RVd}WVFRL*mlT)M!ff)>py?^Vbt>&+bVRRSIHyE|29aERBtOwmMmGiJCq(p +zo=o;7o0CUN36e`^4_~JXZ=2{8)LU5MHOfT=!<*3?SJBzQzh1t4xr(Olw$r3}B9?R; +z#Iq>ZfSHQ{^Cm^&5}mGm7XVabL;fRqlxAs8w?a&(%LAJbF~IBkZ1bgnp_6iV13()w +zbd#Xjdo(S)o=$6Sp|;sN1)}q(Yw_u6b*#4R=+UE7(M?Y^9gXg!^Q`Y6syYKgbm)Hg +zWx}$;!a`F-<LS0^68ILB(>1W4>tc`kncRRkz^BGKIZOyduN{Tk(X4(F%2BTvV*Q5x +z<rImo!W+Q!aEHTGK2G!Bq2E(9zN0H$ZW7dY+JRhERh5IbSy@>V6gtpIEtCdkvY_rY +zz>OI*CW0VNlASPasC(<^f|FWotI&}~{(n1XY=R*SMB#LnPGFTOB$Z3p*@+AMwF`;p +z0xqBnSOu$q-M@nG6K(8G<%37yntSA4?jVpj=UT*&5I%QOEHShmb`SVXU;cLHWuypE +z!bw~h8xOzbl<jVs=V^?9L}eS*0{&O?Tg9GLB6q~d(6hC+F%eNPF7T80enmtGVM7RU +rZg3E8A|t!ZU5P)jM#vfe@Iep`XQi%{iV(%%00000NkvXXu0mjfk2;Ei + +diff --git a/plugins/tasklist/skins/larry/tasklist.css b/plugins/tasklist/skins/larry/tasklist.css +index 29777e2b..4b47f63a 100644 +--- a/plugins/tasklist/skins/larry/tasklist.css ++++ b/plugins/tasklist/skins/larry/tasklist.css +@@ -159,16 +159,6 @@ ul.toolbarmenu li span.icon.taskadd, + #taskselector li.selected a { + color: #fff; + background: #005d76; +- background: -moz-linear-gradient(top, #005d76 0%, #004558 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#005d76), color-stop(100%,#004558)); +- background: -o-linear-gradient(top, #005d76 0%, #004558 100%); +- background: -ms-linear-gradient(top, #005d76 0%, #004558 100%); +- background: linear-gradient(top, #005d76 0%, #004558 100%); +- box-shadow: inset 0 1px 1px 0 #003645; +- -o-box-shadow: inset 0 1px 1px 0 #003645; +- -webkit-box-shadow: inset 0 1px 1px 0 #003645; +- -moz-box-shadow: inset 0 1px 1px 0 #003645; +- border-color: #003645; + border-radius: 10px; + text-shadow: none; + } +@@ -181,12 +171,6 @@ ul.toolbarmenu li span.icon.taskadd, + min-width: 1.8em; + padding: 2px 4px; + background: #004558; +- background: -moz-linear-gradient(top, #005d76 0%, #004558 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#005d76), color-stop(100%,#004558)); +- background: -o-linear-gradient(top, #005d76 0%, #004558 100%); +- background: -ms-linear-gradient(top, #005d76 0%, #004558 100%); +- background: linear-gradient(top, #005d76 0%, #004558 100%); +- box-shadow: 0 1px 2px 0 rgba(24,24,24,0.6); + color: #fff; + border-radius: 3px; + text-align: center; +@@ -244,19 +228,19 @@ ul.toolbarmenu li span.icon.taskadd, + position: relative; + top: -1px; + margin-left: 5px; +- padding: 0.15em 0.5em; ++ padding: 0.2em 0.5em; + font-size: 80%; + font-weight: bold; + color: #59838e; + background: #c7e3ef; +- box-shadow: inset 0 1px 1px 0 #b0ccd7; +- -o-box-shadow: inset 0 1px 1px 0 #b0ccd7; +- -webkit-box-shadow: inset 0 1px 1px 0 #b0ccd7; +- -moz-box-shadow: inset 0 1px 1px 0 #b0ccd7; +- border-color: #b0ccd7; ++ border: 1px solid #b0ccd7; + border-radius: 8px; + } + ++.tagcloud li.selected .count { ++ border: none; ++} ++ + .tag-draghelper .tag .count, + .tagcloud li.inactive .count { + display: none; +@@ -334,15 +318,9 @@ ul.toolbarmenu li span.icon.taskadd, + #tasklistsbox .treelist div:hover span.actions { + top: 1px; + right: 1px; +- border: 1px solid #c6c6c6; ++ border: 1px solid #ababab; + border-radius: 4px; +- background: #f7f7f7; +- background: -moz-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#f9f9f9), color-stop(100%,#e6e6e6)); +- background: -o-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- background: -ms-linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- background: linear-gradient(top, #f9f9f9 0%, #e6e6e6 100%); +- filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#f9f9f9', endColorstr='#e6e6e6', GradientType=0); ++ background: #f1f1f1; + } + + #tasklistsbox .treelist div a.remove, +@@ -499,7 +477,7 @@ ul.toolbarmenu li span.icon.taskadd, + + #quickaddbox .button { + margin-left: 5px; +- padding: 3px 10px; ++ padding: 4px 10px; + font-weight: bold; + } + +@@ -509,7 +487,7 @@ ul.toolbarmenu li span.icon.taskadd, + left: 0; + right: 0; + bottom: 0; +- background: rgba(255, 255, 255, 0.2); ++ background: rgba(255, 255, 255, 0.25); + overflow: visible; + } + +@@ -534,12 +512,7 @@ ul.toolbarmenu li span.icon.taskadd, + + #tasksview .buttonbar { + color: #777; +- background: #eee; +- background: -moz-linear-gradient(top, #eee 0%, #dfdfdf 100%); +- background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#eee), color-stop(100%,#dfdfdf)); +- background: -o-linear-gradient(top, #eee 0%, #dfdfdf 100%); +- background: -ms-linear-gradient(top, #eee 0%, #dfdfdf 100%); +- background: linear-gradient(top, #eee 0%, #dfdfdf 100%); ++ background: #eaeaea; + border-bottom: 1px solid #ccc; + position: relative; + line-height: 13px; +@@ -578,7 +551,6 @@ ul.toolbarmenu li span.icon.taskadd, + font-size: 14px; + color: #666; + margin: 1.5em; +- text-shadow: 0px 1px 1px #fff; + text-align:center; + } + +@@ -627,9 +599,9 @@ ul.toolbarmenu li span.icon.taskadd, + border: 1px solid #fff; + border-radius: 5px; + background: #fff; +- -webkit-box-shadow: 0 1px 1px 0 rgba(50, 50, 50, 0.5); +- -moz-box-shadow: 0 1px 1px 0 rgba(50, 50, 50, 0.5); +- box-shadow: 0 1px 1px 0 rgba(50, 50, 50, 0.5); ++ -webkit-box-shadow: 0 1px 1px 0 rgba(50, 50, 50, 0.4); ++ -moz-box-shadow: 0 1px 1px 0 rgba(50, 50, 50, 0.4); ++ box-shadow: 0 1px 1px 0 rgba(50, 50, 50, 0.4); + padding-right: 26em; + white-space: nowrap; + overflow: hidden; +-- +2.13.2 +
View file
0008-T2561-Fix-recognizing-event-organizer-on-event-move-.patch
Added
@@ -0,0 +1,59 @@ +From 40e0fa9155b5f971b802f57e32abbac18c9e45aa Mon Sep 17 00:00:00 2001 +From: Aleksander Machniak <machniak@kolabsys.com> +Date: Tue, 18 Jul 2017 14:04:18 +0000 +Subject: [PATCH 8/8] T2561: Fix recognizing event organizer on event + move/delete + +--- + plugins/calendar/calendar_ui.js | 12 +++++++----- + 1 file changed, 7 insertions(+), 5 deletions(-) + +diff --git a/plugins/calendar/calendar_ui.js b/plugins/calendar/calendar_ui.js +index 7da1f594..7aaf98b6 100644 +--- a/plugins/calendar/calendar_ui.js ++++ b/plugins/calendar/calendar_ui.js +@@ -2511,13 +2511,15 @@ function rcube_calendar_ui(settings) + + if (!data) data = event; + var decline = false, notify = false, html = '', cal = me.calendars[event.calendar], +- _has_attendees = me.has_attendees(event), _is_organizer = me.is_organizer(event); ++ _has_attendees = me.has_attendees(event), ++ _is_attendee = _has_attendees && me.is_attendee(event), ++ _is_organizer = me.is_organizer(event); + + // event has attendees, ask whether to notify them + if (_has_attendees) { + var checked = (settings.itip_notify & 1 ? ' checked="checked"' : ''); + +- if (action == 'remove' && cal.group != 'shared' && !_is_organizer && me.is_attendee(event)) { ++ if (action == 'remove' && cal.group != 'shared' && !_is_organizer && _is_attendee) { + decline = true; + checked = event.status != 'CANCELLED' ? checked : ''; + html += '<div class="message">' + +@@ -2525,12 +2527,12 @@ function rcube_calendar_ui(settings) + rcmail.gettext('itipdeclineevent', 'calendar') + + '</label></div>'; + } +- else { ++ else if (_is_organizer) { + notify = true; + if (settings.itip_notify & 2) { + html += '<div class="message">' + + '<label><input class="confirm-attendees-donotify" type="checkbox"' + checked + ' value="1" name="notify" /> ' + +- rcmail.gettext((action == 'remove' ? 'sendcancellation' : 'sendnotifications'), 'calendar') + ++ rcmail.gettext((action == 'remove' ? 'sendcancellation' : 'sendnotifications'), 'calendar') + + '</label></div>'; + } + else { +@@ -2545,7 +2547,7 @@ function rcube_calendar_ui(settings) + + // disable the 'future' savemode if I'm an attendee + // reason: no calendaring system supports the thisandfuture range parameter in iTip REPLY +- if (action == 'remove' && _has_attendees && !_is_organizer && me.is_attendee(event)) { ++ if (action == 'remove' && !_is_organizer && _is_attendee) { + future_disabled = ' disabled'; + } + +-- +2.13.2 +
View file
debian.changelog
Changed
@@ -1,3 +1,9 @@ +roundcubemail-plugins-kolab (1:3.3.2-0~kolab2) unstable; urgency=low + + * Backport calendar fixes + + -- Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Tue, 18 Jul 2017 11:11:11 +0200 + roundcubemail-plugins-kolab (1:3.3.2-0~kolab1) unstable; urgency=low * Release version 3.3.2
View file
debian.series
Changed
@@ -1,1 +1,9 @@ roundcubemail-plugins-kolab-3.3-kolab-files-manticore-api.patch -p1 +0001-Move-more-common-methods-used-by-tasklist-and-calend.patch -p1 +0002-T2504-Fix-DTSTAMP-in-iTip-replies.patch -p1 +0003-Add-missing-status-tentative-label.patch -p1 +0004-T2531-Support-SCHEDULE-AGENT-in-iTip.patch -p1 +0005-Don-t-ignore-global-userlogins-sendmail-logging-in-p.patch -p1 +0006-Add-missing-type-link-for-template-buttons-for-compa.patch -p1 +0007-Update-calendar-and-tasklist-styles-sprites-to-new-L.patch -p1 +0008-T2561-Fix-recognizing-event-organizer-on-event-move-.patch -p1
View file
roundcubemail-plugins-kolab.dsc
Changed
@@ -2,7 +2,7 @@ Source: roundcubemail-plugins-kolab Binary: roundcubemail-plugins-kolab Architecture: all -Version: 1:3.3.2-0~kolab1 +Version: 1:3.3.2-0~kolab2 Maintainer: Jeroen van Meeuwen (Kolab Systems) <vanmeeuwen@kolabsys.com> Uploaders: Paul Klos <kolab@klos2day.nl> Standards-Version: 3.9.3
Locations
Projects
Search
Status Monitor
Help
Open Build Service
OBS Manuals
API Documentation
OBS Portal
Reporting a Bug
Contact
Mailing List
Forums
Chat (IRC)
Twitter
Open Build Service (OBS)
is an
openSUSE project
.