diff --git a/UI/WebServerResources/js/Mailer/Mailbox.service.js b/UI/WebServerResources/js/Mailer/Mailbox.service.js index 3648643b5..69b81ffbb 100644 --- a/UI/WebServerResources/js/Mailer/Mailbox.service.js +++ b/UI/WebServerResources/js/Mailer/Mailbox.service.js @@ -31,11 +31,12 @@ * @desc The factory we'll use to register with Angular * @returns the Mailbox constructor */ - Mailbox.$factory = ['$q', '$timeout', '$log', 'sgSettings', 'Resource', 'Message', 'Acl', 'Preferences', 'sgMailbox_PRELOAD', 'sgMailbox_BATCH_DELETE_LIMIT', function($q, $timeout, $log, Settings, Resource, Message, Acl, Preferences, PRELOAD, BATCH_DELETE_LIMIT) { + Mailbox.$factory = ['$q', '$timeout', '$log', '$rootScope', 'sgSettings', 'Resource', 'Message', 'Acl', 'Preferences', 'sgMailbox_PRELOAD', 'sgMailbox_BATCH_DELETE_LIMIT', function ($q, $timeout, $log, $rootScope, Settings, Resource, Message, Acl, Preferences, PRELOAD, BATCH_DELETE_LIMIT) { angular.extend(Mailbox, { $q: $q, $timeout: $timeout, $log: $log, + $rootScope: $rootScope, $$resource: new Resource(Settings.activeUser('folderURL') + 'Mail', Settings.activeUser()), $Message: Message, $$Acl: Acl, @@ -1104,6 +1105,7 @@ * @returns a promise of the HTTP operation */ Mailbox.prototype.$unwrap = function(futureMailboxData) { + Mailbox.$rootScope.$broadcast('beforeListRefresh'); var _this = this, deferred = Mailbox.$q.defer(); @@ -1226,6 +1228,7 @@ Mailbox.$log.debug('mailbox ' + _this.id + ' ready'); _this.$isLoading = false; + Mailbox.$rootScope.$broadcast('listRefreshed'); deferred.resolve(_this.$messages); }); }, function(data) { diff --git a/UI/WebServerResources/js/Mailer/VirtualMailbox.service.js b/UI/WebServerResources/js/Mailer/VirtualMailbox.service.js index 96992e41c..b698cdf72 100644 --- a/UI/WebServerResources/js/Mailer/VirtualMailbox.service.js +++ b/UI/WebServerResources/js/Mailer/VirtualMailbox.service.js @@ -17,11 +17,12 @@ * @desc The factory we'll use to register with Angular * @returns the VirtualMailbox constructor */ - VirtualMailbox.$factory = ['$q', '$timeout', '$log', 'sgSettings', 'Resource', 'Message', 'Mailbox', 'sgMailbox_PRELOAD', function($q, $timeout, $log, Settings, Resource, Mailbox, Message, PRELOAD) { + VirtualMailbox.$factory = ['$q', '$timeout', '$log', '$rootScope', 'sgSettings', 'Resource', 'Message', 'Mailbox', 'sgMailbox_PRELOAD', function ($q, $timeout, $log, $rootScope, Settings, Resource, Mailbox, Message, PRELOAD) { angular.extend(VirtualMailbox, { $q: $q, $timeout: $timeout, $log: $log, + $rootScope: $rootScope, $$resource: new Resource(Settings.activeUser('folderURL') + 'Mail', Settings.activeUser()), $Message: Message, selectedFolder: null, diff --git a/UI/WebServerResources/js/Mailer/sgMessageListItem.directive.js b/UI/WebServerResources/js/Mailer/sgMessageListItem.directive.js index 31c515d63..1a23188e8 100644 --- a/UI/WebServerResources/js/Mailer/sgMessageListItem.directive.js +++ b/UI/WebServerResources/js/Mailer/sgMessageListItem.directive.js @@ -22,10 +22,10 @@ /** * @ngInject */ - sgMessageListItemController.$inject = ['$scope', '$element', 'Mailbox']; - function sgMessageListItemController($scope, $element, Mailbox) { + sgMessageListItemController.$inject = ['$scope', '$element', '$timeout', 'Mailbox']; + function sgMessageListItemController($scope, $element, $timeout, Mailbox) { var $ctrl = this; - + var scrollPosition = 0; this.$onInit = function () { var watchedAttrs = ['uid', 'isread', 'isflagged', 'flags', 'loading']; @@ -77,6 +77,28 @@ element.classList.add('ng-hide'); }; + // The following functions are used to store and restore the scroll position of the message list + // Position is stored and restored through the Mailbox service using broadcasting + function storeScrollPosition() { + if ($element.parent()[0] && $element.parent()[0].parentElement && $element.parent()[0].parentElement.parentElement) + scrollPosition = $element.parent()[0].parentElement.parentElement.scrollTop; + } + + function restoreScrollPosition() { + $timeout(function () { + if ($element.parent()[0] && $element.parent()[0].parentElement && $element.parent()[0].parentElement.parentElement) + $element.parent()[0].parentElement.parentElement.scrollTop = scrollPosition; + }, 0); + } + + $scope.$on('listRefreshed', function () { + restoreScrollPosition(); + }); + + $scope.$on('beforeListRefresh', function () { + storeScrollPosition(); + }); + }