2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 class ClickedOutsideModel {
23 private clickedOutsideContainerSelector:string;
24 private onClickedOutsideGetter:Function;
25 private clickedOutsideEnableGetter:Function;
27 constructor(clickedOutsideData:any) {
28 this.clickedOutsideContainerSelector = clickedOutsideData.clickedOutsideContainerSelector;
29 this.onClickedOutsideGetter = clickedOutsideData.onClickedOutsideGetter;
30 this.clickedOutsideEnableGetter = clickedOutsideData.clickedOutsideEnableGetter;
33 public getClickedOutsideContainerSelector = ():string => {
34 return this.clickedOutsideContainerSelector;
37 public getOnClickedOutsideGetter = ():Function => {
38 return this.onClickedOutsideGetter;
41 public getClickedOutsideEnableGetter = ():Function => {
42 return this.clickedOutsideEnableGetter;
46 export interface IClickedOutsideDirectiveScope extends ng.IScope {
49 export class ClickedOutsideDirective implements ng.IDirective {
51 constructor(private $document:JQuery, private $parse:ng.IParseService) {
56 link = (scope:IClickedOutsideDirectiveScope, element:JQuery, attrs) => {
58 let container:HTMLElement;
59 let attrsAfterEval = scope.$eval(attrs.clickedOutside);
60 attrsAfterEval.onClickedOutsideGetter = this.$parse(attrsAfterEval.onClickedOutside);
61 attrsAfterEval.clickedOutsideEnableGetter = this.$parse(attrsAfterEval.clickedOutsideEnable);
63 let clickedOutsideModel:ClickedOutsideModel = new ClickedOutsideModel(attrsAfterEval);
66 let getContainer:Function = ():HTMLElement => {
68 let clickedOutsideContainerSelector:string = clickedOutsideModel.getClickedOutsideContainerSelector();
69 if (!angular.isUndefined(clickedOutsideContainerSelector) && clickedOutsideContainerSelector !== '') {
70 container = <HTMLElement>element.parents(clickedOutsideContainerSelector + ':first')[0];
72 container = <HTMLElement>element[0];
75 container = <HTMLElement>element[0];
82 let onClickedOutside = (event:JQueryEventObject) => {
83 let containerDomElement:HTMLElement = getContainer();
84 let targetDomElementJq:JQuery = angular.element(event.target);
85 if (targetDomElementJq.hasClass('tooltip') || targetDomElementJq.parents('.tooltip:first').length) {
88 let targetDomElement:HTMLElement = <HTMLElement>targetDomElementJq[0];
89 if (!containerDomElement.contains(targetDomElement)) {
91 let onClickedOutsideGetter:Function = clickedOutsideModel.getOnClickedOutsideGetter();
92 onClickedOutsideGetter(scope);
97 let attachDomEvents:Function = () => {
98 this.$document.on('mousedown', onClickedOutside);
101 let detachDomEvents:Function = () => {
102 this.$document.off('mousedown', onClickedOutside);
106 scope.$on('$destroy', () => {
112 let clickedOutsideEnableGetter:Function = clickedOutsideModel.getClickedOutsideEnableGetter();
113 return clickedOutsideEnableGetter(scope);
114 }, (newValue:boolean) => {
125 public static factory = ($document:JQuery, $parse:ng.IParseService) => {
126 return new ClickedOutsideDirective($document, $parse);
130 ClickedOutsideDirective.factory.$inject = ['$document', '$parse'];