diff --git a/NEWS b/NEWS index f385276b8..e7dee6926 100644 --- a/NEWS +++ b/NEWS @@ -35,6 +35,7 @@ Bug fixes - [web] handle URI in vCard photos (#2683) - [web] handle semicolon in values during LDIF import (#1760) - [web] fixed computation of week number (#3973, #3976) + - [web] fixed saving of inactive calendars (#3862, #3980) - [eas] properly skip folders we don't want to synchronize (#3943) - [eas] fixed 30 mins freebusy offset with S Planner - [eas] now correctly handles reminders on tasks (#3964) diff --git a/UI/Common/UIxParentFolderActions.m b/UI/Common/UIxParentFolderActions.m index 6669e3e71..e98c55061 100644 --- a/UI/Common/UIxParentFolderActions.m +++ b/UI/Common/UIxParentFolderActions.m @@ -20,12 +20,15 @@ #import -#import +#import #import #import #import +#import +#import +#import #import #import @@ -91,4 +94,49 @@ return response; } +- (WOResponse *) saveFoldersActivationAction +{ + NSDictionary *params; + NSEnumerator *foldersEnumerator; + NSMutableArray *folderSubscription; + NSMutableDictionary *moduleSettings; + NSString *baseFolder, *folderName; + SOGoParentFolder *clientObject; + SOGoUser *activeUser; + SOGoUserSettings *us; + WORequest *request; + BOOL makeActive; + + request = [context request]; + params = [[request contentAsString] objectFromJSONString]; + activeUser = [context activeUser]; + clientObject = [self clientObject]; + baseFolder = [clientObject nameInContainer]; + us = [activeUser userSettings]; + moduleSettings = [us objectForKey: baseFolder]; + if (!moduleSettings) + moduleSettings = [NSMutableDictionary dictionary]; + [us setObject: moduleSettings forKey: baseFolder]; + folderSubscription = [moduleSettings objectForKey: @"InactiveFolders"]; + if (!folderSubscription) + { + folderSubscription = [NSMutableArray array]; + [moduleSettings setObject: folderSubscription forKey: @"InactiveFolders"]; + } + + foldersEnumerator = [params keyEnumerator]; + while ((folderName = [foldersEnumerator nextObject])) + { + makeActive = [[params objectForKey: folderName] boolValue]; + if (makeActive) + [folderSubscription removeObject: folderName]; + else + [folderSubscription addObjectUniquely: folderName]; + } + [us synchronize]; + + return [self responseWith204]; +} + + @end diff --git a/UI/Common/product.plist b/UI/Common/product.plist index ff78c1f53..c8b7a62b2 100644 --- a/UI/Common/product.plist +++ b/UI/Common/product.plist @@ -78,6 +78,11 @@ actionClass = "UIxParentFolderActions"; actionName = "createFolder"; }; + saveFoldersActivation = { + protectedBy = "Change Images And Files"; + actionClass = "UIxParentFolderActions"; + actionName = "saveFoldersActivation"; + }; }; }; SOGoFolder = { diff --git a/UI/WebServerResources/js/Scheduler/Calendar.service.js b/UI/WebServerResources/js/Scheduler/Calendar.service.js index 87cfd566f..398f31f1d 100644 --- a/UI/WebServerResources/js/Scheduler/Calendar.service.js +++ b/UI/WebServerResources/js/Scheduler/Calendar.service.js @@ -94,7 +94,6 @@ list = this.$calendars; sibling = _.findIndex(list, function(o, i) { - console.debug(i + ': "' + o.id + '".localeCompare("' + calendar.name + '") = ' + o.name.localeCompare(calendar.name)); return (calendar.id == 'personal' || (o.id != 'personal' && o.name.localeCompare(calendar.name) > 0)); }); @@ -325,6 +324,24 @@ return Calendar.$q.all(promises); }; + /** + * @function saveFoldersActivation + * @memberof Calendar + * @desc Save to the user's settings the activation state of the calendars + * @param {string[]} folders - the folders IDs + * @returns a promise of the HTTP operation + */ + Calendar.saveFoldersActivation = function(ids) { + var request = {}; + + _.forEach(ids, function(id) { + var calendar = Calendar.$get(id); + request[calendar.id] = calendar.active; + }); + + return Calendar.$$resource.post(null, 'saveFoldersActivation', request); + }; + /** * @function saveFoldersOrder * @desc Save to the user's settings the current calendars order. diff --git a/UI/WebServerResources/js/Scheduler/CalendarsController.js b/UI/WebServerResources/js/Scheduler/CalendarsController.js index 15fbecf65..fc588e695 100644 --- a/UI/WebServerResources/js/Scheduler/CalendarsController.js +++ b/UI/WebServerResources/js/Scheduler/CalendarsController.js @@ -58,7 +58,7 @@ ); }, function(newList, oldList) { - var commonList, ids, promises; + var commonList, ids, promise; // Identify which calendar has changed commonList = _.intersectionBy(newList, oldList, 'id'); @@ -66,17 +66,14 @@ var oldObject = _.find(oldList, { id: o.id }); return !_.isEqual(o, oldObject); }), 'id'); - promises = []; + promise = Calendar.$q.when(); if (ids.length > 0) { $log.debug(ids.join(', ') + ' changed'); - _.forEach(ids, function(id) { - var calendar = Calendar.$get(id); - promises.push(calendar.$setActivation()); - }); + promise = Calendar.saveFoldersActivation(ids); } - if (promises.length > 0 || commonList.length != newList.length || commonList.length != oldList.length) - Calendar.$q.all(promises).then(function() { + if (ids.length > 0 || commonList.length != newList.length || commonList.length != oldList.length) + promise.then(function() { $rootScope.$emit('calendars:list'); }); },