mirror of
https://github.com/inverse-inc/sogo.git
synced 2026-03-11 01:41:22 +00:00
feat(calendar): optionally remove attendees that can't be invited
If some attendees have prevented others to invite them, offer the organizer to remove them when saving the invitation.
This commit is contained in:
@@ -531,11 +531,11 @@
|
||||
iCalPerson *currentAttendee;
|
||||
SOGoUser *user;
|
||||
SOGoUserSettings *us;
|
||||
NSMutableArray *unavailableAttendees;
|
||||
NSMutableArray *unavailableAttendees, *unavailableEmails;
|
||||
NSEnumerator *enumerator;
|
||||
NSString *currentUID, *ownerUID;
|
||||
NSMutableString *reason;
|
||||
NSDictionary *values;
|
||||
NSDictionary *values, *info;
|
||||
NSMutableDictionary *value, *moduleSettings;
|
||||
id whiteList;
|
||||
|
||||
@@ -545,6 +545,7 @@
|
||||
|
||||
// Build list of the attendees uids
|
||||
unavailableAttendees = [[NSMutableArray alloc] init];
|
||||
unavailableEmails = [NSMutableArray array];
|
||||
enumerator = [theAttendees objectEnumerator];
|
||||
ownerUID = [[[self context] activeUser] login];
|
||||
|
||||
@@ -573,6 +574,7 @@
|
||||
{
|
||||
values = [NSDictionary dictionaryWithObject:[user cn] forKey:@"Cn"];
|
||||
[unavailableAttendees addObject:values];
|
||||
[unavailableEmails addObject: [currentAttendee rfc822Email]];
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -592,7 +594,14 @@
|
||||
if (i < count-2)
|
||||
[reason appendString:@", "];
|
||||
}
|
||||
|
||||
|
||||
if (count < [theAttendees count])
|
||||
{
|
||||
info = [NSDictionary dictionaryWithObjectsAndKeys:
|
||||
reason, @"reject",
|
||||
unavailableEmails, @"unavailableAttendees", nil];
|
||||
reason = [NSMutableString stringWithString: [info jsonRepresentation]];
|
||||
}
|
||||
[unavailableAttendees release];
|
||||
|
||||
return [self exceptionWithHTTPStatus:409 reason: reason];
|
||||
|
||||
@@ -499,6 +499,8 @@ validate_untilbeforeend = "The recurrence must end after the first occurrence
|
||||
"and" = "and";
|
||||
"A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?"
|
||||
= "A time conflict exists with one or more attendees.\nWould you like to keep the current settings anyway?";
|
||||
"Would you like to remove them and send the invitation to the remaining attendees?"
|
||||
= "Would you like to remove them and send the invitation to the remaining attendees?";
|
||||
|
||||
/* events list */
|
||||
"Due" = "Due";
|
||||
|
||||
@@ -263,6 +263,24 @@
|
||||
return ex;
|
||||
}
|
||||
|
||||
- (void) _removeAttendees: (NSArray *) emails
|
||||
{
|
||||
NSString *email;
|
||||
iCalEvent *event;
|
||||
iCalPerson *attendee;
|
||||
unsigned int i;
|
||||
|
||||
event = [self event];
|
||||
attendee = [[[iCalPerson alloc] init] autorelease];
|
||||
|
||||
for (i = 0; i < [emails count]; i++)
|
||||
{
|
||||
email = [emails objectAtIndex: i];
|
||||
[attendee setEmail: email];
|
||||
[event removeFromAttendees: attendee];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @api {post} /so/:username/Calendar/:calendarId/:appointmentId/rsvpAppointment Set participation state
|
||||
* @apiVersion 1.0.0
|
||||
@@ -512,6 +530,7 @@
|
||||
*/
|
||||
- (id <WOActionResults>) saveAction
|
||||
{
|
||||
NSArray *removeAttendees;
|
||||
NSDictionary *params;
|
||||
NSString *jsonResponse;
|
||||
NSException *ex;
|
||||
@@ -545,12 +564,19 @@
|
||||
{
|
||||
[self setAttributes: params];
|
||||
forceSave = [[params objectForKey: @"ignoreConflicts"] boolValue];
|
||||
removeAttendees = [params objectForKey: @"removeAttendees"];
|
||||
|
||||
if ([event hasRecurrenceRules])
|
||||
ex = [self _adjustRecurrentRules];
|
||||
|
||||
if (!ex)
|
||||
{
|
||||
if (removeAttendees)
|
||||
{
|
||||
[co expandGroupsInEvent: event];
|
||||
[self _removeAttendees: removeAttendees];
|
||||
}
|
||||
|
||||
if ([co isNew])
|
||||
{
|
||||
if (componentCalendar
|
||||
|
||||
@@ -366,12 +366,15 @@
|
||||
</md-dialog-actions>
|
||||
|
||||
<!-- rejected attendee invitation -->
|
||||
<md-dialog-content class="md-default-theme md-bg md-warn md-padding sg-dialog-message ng-hide" layout="row"
|
||||
<md-dialog-content class="md-default-theme md-bg md-warn md-padding sg-dialog-message ng-hide" layout="column"
|
||||
ng-show="editor.attendeeConflictError.reject">
|
||||
<div class="md-flex">{{editor.attendeeConflictError.reject}}</div>
|
||||
<md-button class="md-icon-button" ng-click="editor.edit(eventForm)">
|
||||
<md-icon label:aria-label="Close">close</md-icon>
|
||||
</md-button>
|
||||
<div layout="row" layout-align="space-between start" layout-fill="layout-fill">
|
||||
<div ng-bind-html="editor.attendeeConflictError.reject | txt2html"><!-- error --></div>
|
||||
<md-button class="md-icon-button" ng-click="editor.edit(eventForm)">
|
||||
<md-icon label:aria-label="Close">close</md-icon>
|
||||
</md-button>
|
||||
</div>
|
||||
<div class="sg-padded--top"><var:string label:value="Would you like to remove them and send the invitation to the remaining attendees?"/></div>
|
||||
</md-dialog-content>
|
||||
<md-dialog-actions ng-show="editor.attendeeConflictError.reject">
|
||||
<md-button type="button" ng-click="editor.cancel(eventForm)">
|
||||
@@ -381,6 +384,11 @@
|
||||
ng-click="editor.edit(eventForm)">
|
||||
<var:string label:value="Edit"/>
|
||||
</md-button>
|
||||
<md-button class="md-warn" type="button"
|
||||
ng-click="editor.save(eventForm, { removeAttendees: editor.attendeeConflictError.unavailableAttendees })"
|
||||
ng-disabled="editor.eventForm.$invalid">
|
||||
<var:string label:value="Save"/>
|
||||
</md-button>
|
||||
</md-dialog-actions>
|
||||
</form>
|
||||
</md-dialog>
|
||||
|
||||
Reference in New Issue
Block a user