Catalog alignment
[sdc.git] / catalog-ui / src / app / ng2 / services / event-bus.service.ts
1 import {Injectable} from '@angular/core';
2 import {BasePubSub, IPubSubEvent} from "sdc-pubsub";
3
4 @Injectable()
5 export class EventBusService extends BasePubSub {
6
7     NoWindowOutEvents: Array<string>;
8
9     constructor() {
10         super("sdc-hub");
11         this.NoWindowOutEvents = ["CHECK_IN", "SUBMIT_FOR_TESTING", "UNDO_CHECK_OUT"];
12     }
13
14     public unregister(pluginId: string) {
15         const unregisterData = {
16             pluginId: pluginId
17         };
18
19         this.notify('PLUGIN_CLOSE', unregisterData).subscribe(() => {
20             super.unregister(pluginId);
21         });
22     }
23
24     public disableNavigation(isDisable: boolean) {
25         let iframes = document.getElementsByClassName("plugin-iframe");
26
27         if (isDisable) {
28             _.forEach(iframes, (iframeElement: HTMLElement) => {
29                 iframeElement.style.zIndex = '1300';
30             });
31             let disableDiv = document.createElement('div');
32             disableDiv.style.cssText = "position: fixed;\n" +
33                 "z-index: 1029;\n" +
34                 "background: rgba(0,0,0,0.5);\n" +
35                 "width: 100%;\n" +
36                 "height: 100%;\n" +
37                 "top: 0;\n" +
38                 "left: 0;";
39             disableDiv.setAttribute("class", "disable-navigation-div");
40             document.body.appendChild(disableDiv);
41         } else {
42             document.getElementsByClassName("disable-navigation-div")[0].remove();
43
44             _.forEach(iframes, (iframeElement: HTMLElement) => {
45                 iframeElement.style.zIndex = '';
46             });
47         }
48     }
49
50     public notify(eventType: string, eventData?: any, disableOnWaiting: boolean = true) {
51         let doDisable = false;
52
53         if (disableOnWaiting) {
54             doDisable = this.isWaitingForEvent(eventType);
55
56             if (doDisable) {
57                 this.disableNavigation(true);
58             }
59         }
60
61         const origSubscribe = super.notify(eventType, eventData).subscribe;
62
63         return {
64             subscribe: function (callbackFn) {
65                 origSubscribe(() => {
66                     if (doDisable) {
67                         this.disableNavigation(false);
68                     }
69
70                     callbackFn();
71                 });
72             }.bind(this)
73         };
74     }
75
76     protected handlePluginRegistration(eventData: IPubSubEvent, event: any) {
77         if (eventData.type === 'PLUGIN_REGISTER') {
78             this.register(eventData.data.pluginId, event.source, event.origin);
79
80             let newEventsList = [];
81
82             if (this.eventsToWait.has(eventData.data.pluginId)) {
83                 newEventsList = _.union(this.eventsToWait.get(eventData.data.pluginId), eventData.data.eventsToWait);
84             } else {
85                 newEventsList = eventData.data.eventsToWait;
86             }
87
88             this.eventsToWait.set(eventData.data.pluginId, newEventsList);
89
90         } else if (eventData.type === 'PLUGIN_UNREGISTER') {
91             this.unregister(eventData.data.pluginId);
92         }
93     }
94
95     protected onMessage(event: any) {
96         if (event.data.type === 'PLUGIN_REGISTER') {
97             this.handlePluginRegistration(event.data, event);
98         }
99
100         super.onMessage(event);
101
102         if (event.data.type === 'PLUGIN_UNREGISTER') {
103             this.handlePluginRegistration(event.data, event);
104         }
105     }
106 }