diff --git a/NEWS b/NEWS index 122f234b6..3ed5e65de 100644 --- a/NEWS +++ b/NEWS @@ -5,6 +5,7 @@ New features - [core] Debian 10 (Buster) support for x86_64 (#4775) - [core] now possible to specify which domains you can forward your mails to - [core] added support for S/MIME opaque signing (#4582) + - [web] optionally expand LDAP groups in attendees editor (#2506) Enhancements - [web] avoid saving an empty calendar name diff --git a/UI/Contacts/UIxContactView.m b/UI/Contacts/UIxContactView.m index 578edb431..22e0d69c5 100644 --- a/UI/Contacts/UIxContactView.m +++ b/UI/Contacts/UIxContactView.m @@ -1,5 +1,5 @@ /* - Copyright (C) 2005-2017 Inverse inc. + Copyright (C) 2005-2019 Inverse inc. This file is part of SOGo. @@ -31,8 +31,10 @@ #import #import #import +#import #import #import +#import #import #import @@ -384,6 +386,55 @@ return result; } +- (id ) membersAction +{ + NSArray *allUsers; + NSDictionary *dict; + NSEnumerator *emails; + NSMutableArray *allUsersData, *allUserEmails; + NSMutableDictionary *userData; + NSString *email; + SOGoObject *contact; + SOGoUser *user; + id result; + unsigned int i, max; + + result = nil; + contact = [self clientObject]; + dict = [[SOGoUserManager sharedUserManager] contactInfosForUserWithUIDorEmail: [contact nameInContainer]]; + + if ([[dict objectForKey: @"isGroup"] boolValue]) + { + SOGoGroup *aGroup; + + aGroup = [SOGoGroup groupWithIdentifier: [contact nameInContainer] + inDomain: [[context activeUser] domain]]; + allUsers = [aGroup members]; // array of SOGoUser objects + max = [allUsers count]; + allUsersData = [NSMutableArray arrayWithCapacity: max]; + for (i = 0; i < max; i++) + { + user = [allUsers objectAtIndex: i]; + allUserEmails = [NSMutableArray array]; + emails = [[user allEmails] objectEnumerator]; + while ((email = [emails nextObject])) { + [allUserEmails addObject: [NSDictionary dictionaryWithObjectsAndKeys: + email, @"value", @"work", @"type", nil]]; + } + userData = [NSDictionary dictionaryWithObjectsAndKeys: + [user loginInDomain], @"c_uid", + [user cn], @"c_cn", + allUserEmails, @"emails", nil]; + [allUsersData addObject: userData]; + } + dict = [NSDictionary dictionaryWithObject: allUsersData forKey: @"members"]; + result = [self responseWithStatus: 200 + andString: [dict jsonRepresentation]]; + } + return result; +} + + - (BOOL) hasPhoto { return [[self clientObject] hasPhoto]; diff --git a/UI/Templates/SchedulerUI/UIxAttendeesEditor.wox b/UI/Templates/SchedulerUI/UIxAttendeesEditor.wox index 65e94f4d3..7b8576688 100644 --- a/UI/Templates/SchedulerUI/UIxAttendeesEditor.wox +++ b/UI/Templates/SchedulerUI/UIxAttendeesEditor.wox @@ -66,9 +66,14 @@ {{ editor.defaultIconForAttendee(currentAttendee) }} -
+
{{currentAttendee.name}}
-
{{currentAttendee.email}}
+
+
{{currentAttendee.email}}
+ + add_box + +
0) { + this.component.$attendees.remove(attendee); + _.forEach(attendee.members, function (member) { + vm.component.$attendees.add(member); + }); + } + }; + this.removeAttendee = function (attendee, form) { this.component.$attendees.remove(attendee); if (this.component.$attendees.getLength() === 0) diff --git a/UI/WebServerResources/js/Scheduler/sgFreebusy.directive.js b/UI/WebServerResources/js/Scheduler/sgFreebusy.directive.js index 2a655fc5e..423808c74 100644 --- a/UI/WebServerResources/js/Scheduler/sgFreebusy.directive.js +++ b/UI/WebServerResources/js/Scheduler/sgFreebusy.directive.js @@ -31,11 +31,15 @@ $scope.$watch( function() { - return $ctrl.component? [ _.pick($ctrl.component, watchedAttrs) ] : null; + return $ctrl.component? { + start: $ctrl.component.start, + end: $ctrl.component.end, + attendees: _.map($ctrl.component.attendees, 'email') + } : null; }, - function(newId, oldId) { - if ($ctrl.component) { - // Component has changed + function(newAttrs, oldAttrs) { + if (newAttrs.attendees) { + // Attendees have changed $q.all(_.values($ctrl.component.$attendees.$futureFreebusyData)).then(function() { $ctrl.onUpdate(); }); diff --git a/UI/WebServerResources/js/Scheduler/sgFreebusyDay.directive.js b/UI/WebServerResources/js/Scheduler/sgFreebusyDay.directive.js index cf9393b16..6f5b511d7 100644 --- a/UI/WebServerResources/js/Scheduler/sgFreebusyDay.directive.js +++ b/UI/WebServerResources/js/Scheduler/sgFreebusyDay.directive.js @@ -76,7 +76,7 @@ }); this.parentController.onUpdate = function () { - var freebusys = $ctrl.attendee.freebusy[$ctrl.day]; + var freebusys = $ctrl.attendee.uid ? $ctrl.attendee.freebusy[$ctrl.day] : null; if (!$ctrl.attendee.uid) { _.forEach(hours, function(div) { @@ -92,7 +92,7 @@ } else { quarters[index].classList.remove('event'); } - if (freebusys[hour][quarter]) { + if (freebusys && freebusys[hour][quarter]) { busys[index].classList.remove('ng-hide'); } else { busys[index].classList.add('ng-hide'); diff --git a/UI/WebServerResources/scss/components/list/list.scss b/UI/WebServerResources/scss/components/list/list.scss index 11b34f0bc..383e1c7ba 100644 --- a/UI/WebServerResources/scss/components/list/list.scss +++ b/UI/WebServerResources/scss/components/list/list.scss @@ -190,6 +190,7 @@ div.md-tile-left { min-height: auto; min-width: auto; padding: 0 3px !important; + margin: 0; font-weight: $sg-font-medium; md-icon { font-size: sg-size(body);