diff --git a/app/assets/javascripts/directives/functional/click-outside.ts b/app/assets/javascripts/directives/functional/click-outside.ts index 4f7d2e2c82a..0b6246bdd51 100644 --- a/app/assets/javascripts/directives/functional/click-outside.ts +++ b/app/assets/javascripts/directives/functional/click-outside.ts @@ -3,38 +3,35 @@ export function clickOutside($document: ng.IDocumentService) { return { restrict: 'A', replace: false, - link: function ($scope: ng.IScope, $element: JQLite, attrs: any) { - // Causes memory leak as-is: - // let didApplyClickOutside = false; + link($scope: ng.IScope, $element: JQLite, attrs: any) { + let didApplyClickOutside = false; - // $scope.$on('$destroy', () => { - // attrs.clickOutside = null; - // $element.unbind('click', $scope.onElementClick); - // $document.unbind('click', $scope.onDocumentClick); - // $scope.onElementClick = null; - // $scope.onDocumentClick = null; - // }); + function onElementClick(event: JQueryEventObject) { + didApplyClickOutside = false; + if (attrs.isOpen) { + event.stopPropagation(); + } + } - // $scope.onElementClick = (event) => { - // didApplyClickOutside = false; - // if (attrs.isOpen) { - // event.stopPropagation(); - // } - // }; - - // $scope.onDocumentClick = (event) => { - // /* Ignore click if on SKAlert */ - // if (event.target.closest('.sk-modal')) { - // return; - // } - // if (!didApplyClickOutside) { - // $scope.$apply(attrs.clickOutside); - // didApplyClickOutside = true; - // } - // }; + function onDocumentClick(event: JQueryEventObject) { + /** Ignore click if on SKAlert */ + if (event.target.closest('.sk-modal')) { + return; + } + if (!didApplyClickOutside) { + $scope.$apply(attrs.clickOutside); + didApplyClickOutside = true; + } + }; - // $element.bind('click', $scope.onElementClick); - // $document.bind('click', $scope.onDocumentClick); + $scope.$on('$destroy', () => { + attrs.clickOutside = undefined; + $element.unbind('click', onElementClick); + $document.unbind('click', onDocumentClick); + }); + + $element.bind('click', onElementClick); + $document.bind('click', onDocumentClick); } }; }