mesauth-angular 0.2.15 → 0.2.20
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +139 -61
- package/dist/README.md +139 -61
- package/dist/{fesm2020 → fesm2022}/mesauth-angular.mjs +702 -691
- package/dist/fesm2022/mesauth-angular.mjs.map +1 -0
- package/dist/index.d.ts +269 -9
- package/package.json +12 -12
- package/dist/esm2020/index.mjs +0 -10
- package/dist/esm2020/ma-user.component.mjs +0 -32
- package/dist/esm2020/mes-auth.interceptor.mjs +0 -29
- package/dist/esm2020/mes-auth.module.mjs +0 -23
- package/dist/esm2020/mes-auth.service.mjs +0 -175
- package/dist/esm2020/mesauth-angular.mjs +0 -5
- package/dist/esm2020/notification-badge.component.mjs +0 -71
- package/dist/esm2020/notification-panel.component.mjs +0 -333
- package/dist/esm2020/theme.service.mjs +0 -63
- package/dist/esm2020/toast-container.component.mjs +0 -83
- package/dist/esm2020/toast.service.mjs +0 -41
- package/dist/esm2020/user-profile.component.mjs +0 -223
- package/dist/fesm2015/mesauth-angular.mjs +0 -1042
- package/dist/fesm2015/mesauth-angular.mjs.map +0 -1
- package/dist/fesm2020/mesauth-angular.mjs.map +0 -1
- package/dist/ma-user.component.d.ts +0 -8
- package/dist/mes-auth.interceptor.d.ts +0 -13
- package/dist/mes-auth.module.d.ts +0 -6
- package/dist/mes-auth.service.d.ts +0 -121
- package/dist/notification-badge.component.d.ts +0 -20
- package/dist/notification-panel.component.d.ts +0 -36
- package/dist/package.json +0 -52
- package/dist/theme.service.d.ts +0 -19
- package/dist/toast-container.component.d.ts +0 -18
- package/dist/toast.service.d.ts +0 -18
- package/dist/user-profile.component.d.ts +0 -31
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import { Injectable, Optional } from '@angular/core';
|
|
2
|
-
import { HubConnectionBuilder, LogLevel } from '@microsoft/signalr';
|
|
3
|
-
import { BehaviorSubject, Subject } from 'rxjs';
|
|
4
|
-
import { tap, filter, debounceTime } from 'rxjs/operators';
|
|
5
|
-
import { NavigationEnd } from '@angular/router';
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
import * as i1 from "@angular/common/http";
|
|
8
|
-
import * as i2 from "@angular/router";
|
|
9
|
-
export var NotificationType;
|
|
10
|
-
(function (NotificationType) {
|
|
11
|
-
NotificationType["Info"] = "Info";
|
|
12
|
-
NotificationType["Warning"] = "Warning";
|
|
13
|
-
NotificationType["Error"] = "Error";
|
|
14
|
-
NotificationType["Success"] = "Success";
|
|
15
|
-
})(NotificationType || (NotificationType = {}));
|
|
16
|
-
export class MesAuthService {
|
|
17
|
-
constructor(http, router) {
|
|
18
|
-
this.http = http;
|
|
19
|
-
this.router = router;
|
|
20
|
-
this.hubConnection = null;
|
|
21
|
-
this._currentUser = new BehaviorSubject(null);
|
|
22
|
-
this.currentUser$ = this._currentUser.asObservable();
|
|
23
|
-
this._notifications = new Subject();
|
|
24
|
-
this.notifications$ = this._notifications.asObservable();
|
|
25
|
-
this._feNav = new BehaviorSubject(null);
|
|
26
|
-
this.feNav$ = this._feNav.asObservable();
|
|
27
|
-
this.apiBase = '';
|
|
28
|
-
this.config = null;
|
|
29
|
-
// Listen for route changes - only refresh user data if needed for SPA navigation
|
|
30
|
-
// This helps maintain authentication state in single-page applications
|
|
31
|
-
if (this.router) {
|
|
32
|
-
this.router.events
|
|
33
|
-
.pipe(filter(event => event instanceof NavigationEnd), debounceTime(1000) // Longer debounce to avoid interfering with login flow
|
|
34
|
-
)
|
|
35
|
-
.subscribe((event) => {
|
|
36
|
-
// Only refresh if user is logged in and navigating to protected routes
|
|
37
|
-
// Avoid refreshing during login/logout flows
|
|
38
|
-
if (this._currentUser.value && this.isProtectedRoute(event.url)) {
|
|
39
|
-
// Small delay to ensure any login/logout operations complete
|
|
40
|
-
setTimeout(() => {
|
|
41
|
-
if (this._currentUser.value) {
|
|
42
|
-
this.refreshUser();
|
|
43
|
-
}
|
|
44
|
-
}, 100);
|
|
45
|
-
}
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
isProtectedRoute(url) {
|
|
50
|
-
// Consider routes protected if they don't include auth-related paths
|
|
51
|
-
return !url.includes('/login') && !url.includes('/auth') && !url.includes('/signin') && !url.includes('/logout');
|
|
52
|
-
}
|
|
53
|
-
init(config) {
|
|
54
|
-
this.config = config;
|
|
55
|
-
this.apiBase = config.apiBaseUrl.replace(/\/$/, '');
|
|
56
|
-
this.fetchCurrentUser();
|
|
57
|
-
this.fetchInitialNotifications();
|
|
58
|
-
}
|
|
59
|
-
getConfig() {
|
|
60
|
-
return this.config;
|
|
61
|
-
}
|
|
62
|
-
fetchCurrentUser() {
|
|
63
|
-
if (!this.apiBase)
|
|
64
|
-
return;
|
|
65
|
-
const url = `${this.apiBase}/auth/me`;
|
|
66
|
-
this.http.get(url, { withCredentials: this.config?.withCredentials ?? true }).subscribe({
|
|
67
|
-
next: (u) => {
|
|
68
|
-
this._currentUser.next(u);
|
|
69
|
-
if (u && this.config) {
|
|
70
|
-
this.startConnection(this.config);
|
|
71
|
-
this.fetchFeNav();
|
|
72
|
-
}
|
|
73
|
-
else {
|
|
74
|
-
this._feNav.next(null);
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
error: (err) => {
|
|
78
|
-
this._currentUser.next(null);
|
|
79
|
-
this._feNav.next(null);
|
|
80
|
-
}
|
|
81
|
-
});
|
|
82
|
-
}
|
|
83
|
-
fetchInitialNotifications() {
|
|
84
|
-
if (!this.apiBase)
|
|
85
|
-
return;
|
|
86
|
-
this.http.get(`${this.apiBase}/notif/me`, { withCredentials: this.config?.withCredentials ?? true }).subscribe({
|
|
87
|
-
next: (notifications) => {
|
|
88
|
-
if (Array.isArray(notifications?.items)) {
|
|
89
|
-
notifications.items.forEach((n) => this._notifications.next(n));
|
|
90
|
-
}
|
|
91
|
-
},
|
|
92
|
-
error: (err) => { }
|
|
93
|
-
});
|
|
94
|
-
}
|
|
95
|
-
fetchFeNav() {
|
|
96
|
-
if (!this.apiBase || !this._currentUser.value?.userId)
|
|
97
|
-
return;
|
|
98
|
-
const url = `${this.apiBase}/fenavs/${this._currentUser.value.userId}`;
|
|
99
|
-
this.http.get(url, { withCredentials: this.config?.withCredentials ?? true }).subscribe({
|
|
100
|
-
next: (response) => {
|
|
101
|
-
if (response?.content) {
|
|
102
|
-
const feNavData = {
|
|
103
|
-
items: response.content,
|
|
104
|
-
lastUpdated: new Date().toISOString()
|
|
105
|
-
};
|
|
106
|
-
this._feNav.next(feNavData);
|
|
107
|
-
}
|
|
108
|
-
},
|
|
109
|
-
error: (err) => {
|
|
110
|
-
this._feNav.next(null);
|
|
111
|
-
}
|
|
112
|
-
});
|
|
113
|
-
}
|
|
114
|
-
getUnreadCount() {
|
|
115
|
-
return this.http.get(`${this.apiBase}/notif/me/unread-count`, { withCredentials: this.config?.withCredentials ?? true });
|
|
116
|
-
}
|
|
117
|
-
getNotifications(page = 1, pageSize = 20, includeRead = false, type) {
|
|
118
|
-
let url = `${this.apiBase}/notif/me?page=${page}&pageSize=${pageSize}&includeRead=${includeRead}`;
|
|
119
|
-
if (type) {
|
|
120
|
-
url += `&type=${type}`;
|
|
121
|
-
}
|
|
122
|
-
return this.http.get(url, { withCredentials: this.config?.withCredentials ?? true });
|
|
123
|
-
}
|
|
124
|
-
markAsRead(notificationId) {
|
|
125
|
-
return this.http.patch(`${this.apiBase}/notif/${notificationId}/read`, {}, { withCredentials: this.config?.withCredentials ?? true });
|
|
126
|
-
}
|
|
127
|
-
markAllAsRead() {
|
|
128
|
-
return this.http.patch(`${this.apiBase}/notif/me/read-all`, {}, { withCredentials: this.config?.withCredentials ?? true });
|
|
129
|
-
}
|
|
130
|
-
deleteNotification(notificationId) {
|
|
131
|
-
return this.http.delete(`${this.apiBase}/notif/${notificationId}`, { withCredentials: this.config?.withCredentials ?? true });
|
|
132
|
-
}
|
|
133
|
-
startConnection(config) {
|
|
134
|
-
if (this.hubConnection)
|
|
135
|
-
return;
|
|
136
|
-
const signalrUrl = config.apiBaseUrl.replace(/\/$/, '') + '/hub/notification';
|
|
137
|
-
const builder = new HubConnectionBuilder()
|
|
138
|
-
.withUrl(signalrUrl, { withCredentials: config.withCredentials ?? true })
|
|
139
|
-
.withAutomaticReconnect()
|
|
140
|
-
.configureLogging(LogLevel.Warning);
|
|
141
|
-
this.hubConnection = builder.build();
|
|
142
|
-
this.hubConnection.on('ReceiveNotification', (n) => {
|
|
143
|
-
this._notifications.next(n);
|
|
144
|
-
});
|
|
145
|
-
this.hubConnection.start().then(() => { }).catch((err) => { });
|
|
146
|
-
this.hubConnection.onclose(() => { });
|
|
147
|
-
this.hubConnection.onreconnecting(() => { });
|
|
148
|
-
this.hubConnection.onreconnected(() => { });
|
|
149
|
-
}
|
|
150
|
-
stop() {
|
|
151
|
-
if (!this.hubConnection)
|
|
152
|
-
return;
|
|
153
|
-
this.hubConnection.stop().catch(() => { });
|
|
154
|
-
this.hubConnection = null;
|
|
155
|
-
}
|
|
156
|
-
logout() {
|
|
157
|
-
const url = `${this.apiBase}/auth/logout`;
|
|
158
|
-
return this.http.post(url, {}, { withCredentials: this.config?.withCredentials ?? true }).pipe(tap(() => {
|
|
159
|
-
this._currentUser.next(null);
|
|
160
|
-
this._feNav.next(null);
|
|
161
|
-
this.stop();
|
|
162
|
-
}));
|
|
163
|
-
}
|
|
164
|
-
refreshUser() {
|
|
165
|
-
this.fetchCurrentUser();
|
|
166
|
-
}
|
|
167
|
-
}
|
|
168
|
-
MesAuthService.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MesAuthService, deps: [{ token: i1.HttpClient }, { token: i2.Router, optional: true }], target: i0.ɵɵFactoryTarget.Injectable });
|
|
169
|
-
MesAuthService.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MesAuthService });
|
|
170
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: MesAuthService, decorators: [{
|
|
171
|
-
type: Injectable
|
|
172
|
-
}], ctorParameters: function () { return [{ type: i1.HttpClient }, { type: i2.Router, decorators: [{
|
|
173
|
-
type: Optional
|
|
174
|
-
}] }]; } });
|
|
175
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzLWF1dGguc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZXMtYXV0aC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBVSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBRTdELE9BQU8sRUFBaUIsb0JBQW9CLEVBQUUsUUFBUSxFQUFFLE1BQU0sb0JBQW9CLENBQUM7QUFDbkYsT0FBTyxFQUFFLGVBQWUsRUFBRSxPQUFPLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFDNUQsT0FBTyxFQUFFLEdBQUcsRUFBRSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFVLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDOzs7O0FBb0N4RCxNQUFNLENBQU4sSUFBWSxnQkFLWDtBQUxELFdBQVksZ0JBQWdCO0lBQzFCLGlDQUFhLENBQUE7SUFDYix1Q0FBbUIsQ0FBQTtJQUNuQixtQ0FBZSxDQUFBO0lBQ2YsdUNBQW1CLENBQUE7QUFDckIsQ0FBQyxFQUxXLGdCQUFnQixLQUFoQixnQkFBZ0IsUUFLM0I7QUF3REQsTUFBTSxPQUFPLGNBQWM7SUFZekIsWUFBb0IsSUFBZ0IsRUFBc0IsTUFBZTtRQUFyRCxTQUFJLEdBQUosSUFBSSxDQUFZO1FBQXNCLFdBQU0sR0FBTixNQUFNLENBQVM7UUFYakUsa0JBQWEsR0FBeUIsSUFBSSxDQUFDO1FBQzNDLGlCQUFZLEdBQUcsSUFBSSxlQUFlLENBQWUsSUFBSSxDQUFDLENBQUM7UUFDeEQsaUJBQVksR0FBNkIsSUFBSSxDQUFDLFlBQVksQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUN6RSxtQkFBYyxHQUFHLElBQUksT0FBTyxFQUFPLENBQUM7UUFDckMsbUJBQWMsR0FBb0IsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUNwRSxXQUFNLEdBQUcsSUFBSSxlQUFlLENBQW1CLElB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QUFDLElBQUksRUFBRSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQ0gsQ0FBQztJQUNKLENBQUM7SUFFTSxXQUFXO1FBQ2hCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0lBQzFCLENBQUM7OzJHQXZLVSxjQUFjOytHQUFkLGNBQWM7MkZBQWQsY0FBYztrQkFEMUIsVUFBVTs7MEJBYThCLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBpbmplY3QsIEluamVjdGFibGUsIE9wdGlvbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IEh0dHBDbGllbnQgfSBmcm9tICdAYW5ndWxhci9jb21tb24vaHR0cCc7XHJcbmltcG9ydCB7IEh1YkNvbm5lY3Rpb24sIEh1YkNvbm5lY3Rpb25CdWlsZGVyLCBMb2dMZXZlbCB9IGZyb20gJ0BtaWNyb3NvZnQvc2lnbmFscic7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyB0YXAsIGZpbHRlciwgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBSb3V0ZXIsIE5hdmlnYXRpb25FbmQgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBNZXNBdXRoQ29uZmlnIHsgIFxyXG4gIGFwaUJhc2VVcmw6IHN0cmluZztcclxuICB3aXRoQ3JlZGVudGlhbHM/OiBib29sZWFuO1xyXG4gIHVzZXJCYXNlVXJsPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIElVc2VyIHtcclxuICB1c2VySWQ/OiBzdHJpbmc7XHJcbiAgdXNlck5hbWU/OiBzdHJpbmc7XHJcbiAgZnVsbE5hbWU/OiBzdHJpbmc7XHJcbiAgZ2VuZGVyPzogc3RyaW5nO1xyXG4gIGVtYWlsPzogc3RyaW5nO1xyXG4gIHBob25lTnVtYmVyPzogc3RyaW5nO1xyXG4gIGRlcGFydG1lbnQ/OiBzdHJpbmc7XHJcbiAgcG9zaXRpb24/OiBzdHJpbmc7XHJcbiAgdG9rZW5WZXJzaW9uPzogc3RyaW5nO1xyXG4gIHBlcm1FbmRwb2ludD86IHN0cmluZztcclxuICBwZXJtcz86IFNldDxzdHJpbmc+O1xyXG4gIGVtcGxveWVlQ29kZT86IHN0cmluZztcclxuICBockZ1bGxOYW1lVm4/OiBzdHJpbmc7XHJcbiAgaHJGdWxsTmFtZUVuPzogc3RyaW5nO1xyXG4gIGhyUG9zaXRpb24/OiBzdHJpbmc7XHJcbiAgaHJKb2JUaXRsZT86IHN0cmluZztcclxuICBockdlbmRlcj86IHN0cmluZztcclxuICBock1vYmlsZT86IHN0cmluZztcclxuICBockVtYWlsPzogc3RyaW5nO1xyXG4gIGhySm9pbkRhdGU/OiBzdHJpbmc7XHJcbiAgaHJCaXJ0aERhdGU/OiBzdHJpbmc7XHJcbiAgaHJXb3JrU3RhdHVzPzogc3RyaW5nO1xyXG4gIGhyRG9pVHVvbmc/OiBzdHJpbmc7XHJcbiAgaHJUZWFtQ29kZT86IHN0cmluZztcclxuICBockxpbmVDb2RlPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgZW51bSBOb3RpZmljYXRpb25UeXBlIHtcclxuICBJbmZvID0gJ0luZm8nLFxyXG4gIFdhcm5pbmcgPSAnV2FybmluZycsXHJcbiAgRXJyb3IgPSAnRXJyb3InLFxyXG4gIFN1Y2Nlc3MgPSAnU3VjY2VzcydcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBOb3RpZmljYXRpb25EdG8ge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgbWVzc2FnZUh0bWw/OiBzdHJpbmc7XHJcbiAgdXJsPzogc3RyaW5nO1xyXG4gIHR5cGU6IE5vdGlmaWNhdGlvblR5cGU7XHJcbiAgaXNSZWFkOiBib29sZWFuO1xyXG4gIGNyZWF0ZWRBdDogc3RyaW5nO1xyXG4gIHNvdXJjZUFwcE5hbWU6IHN0cmluZztcclxuICBzb3VyY2VBcHBJY29uVXJsPzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFBhZ2VkTGlzdDxUPiB7XHJcbiAgaXRlbXM6IFRbXTtcclxuICB0b3RhbENvdW50OiBudW1iZXI7XHJcbiAgcGFnZTogbnVtYmVyO1xyXG4gIHBhZ2VTaXplOiBudW1iZXI7XHJcbiAgdG90YWxQYWdlczogbnVtYmVyO1xyXG4gIGhhc05leHQ6IGJvb2xlYW47XHJcbiAgaGFzUHJldmlvdXM6IGJvb2xlYW47XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgUmVhbFRpbWVOb3RpZmljYXRpb25EdG8ge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgdGl0bGU6IHN0cmluZztcclxuICBtZXNzYWdlOiBzdHJpbmc7XHJcbiAgbWVzc2FnZUh0bWw/OiBzdHJpbmc7XHJcbiAgdXJsPzogc3RyaW5nO1xyXG4gIHR5cGU6IE5vdGlmaWNhdGlvblR5cGU7XHJcbiAgY3JlYXRlZEF0OiBzdHJpbmc7XHJcbiAgc291cmNlQXBwTmFtZTogc3RyaW5nO1xyXG4gIHNvdXJjZUFwcEljb25Vcmw/OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgRmVOYXZJdGVtIHtcclxuICBpZDogbnVtYmVyO1xyXG4gIG5hbWU6IHN0cmluZztcclxuICByb3V0ZTogc3RyaW5nO1xyXG4gIHBhcmVudElkPzogbnVtYmVyO1xyXG4gIG9yZGVyOiBudW1iZXI7XHJcbiAgaWNvbjogc3RyaW5nO1xyXG4gIGFwcGxpY2F0aW9uSWQ6IHN0cmluZztcclxuICBpc1RpdGxlOiBib29sZWFuO1xyXG4gIGFjdGl2ZUZsYWc6IGJvb2xlYW47XHJcbiAgY2hpbGRyZW4/OiBGZU5hdkl0ZW1bXTtcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBGZU5hdkRhdGEge1xyXG4gIGl0ZW1zOiBGZU5hdkl0ZW1bXTtcclxuICBsYXN0VXBkYXRlZDogc3RyaW5nO1xyXG59XHJcblxyXG5ASW5qZWN0YWJsZSgpXHJcbmV4cG9ydCBjbGFzcyBNZXNBdXRoU2VydmljZSB7XHJcbiAgcHJpdmF0ZSBodWJDb25uZWN0aW9uOiBIdWJDb25uZWN0aW9uIHwgbnVsbCA9IG51bGw7XHJcbiAgcHJpdmF0ZSBfY3VycmVudFVzZXIgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PElVc2VyIHwgbnVsbD4obnVsbCk7XHJcbiAgcHVibGljIGN1cnJlbnRVc2VyJDogT2JzZXJ2YWJsZTxJVXNlciB8IG51bGw+ID0gdGhpcy5fY3VycmVudFVzZXIuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHJpdmF0ZSBfbm90aWZpY2F0aW9ucyA9IG5ldyBTdWJqZWN0PGFueT4oKTtcclxuICBwdWJsaWMgbm90aWZpY2F0aW9ucyQ6IE9ic2VydmFibGU8YW55PiA9IHRoaXMuX25vdGlmaWNhdGlvbnMuYXNPYnNlcnZhYmxlKCk7XHJcbiAgcHJpdmF0ZSBfZmVOYXYgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEZlTmF2RGF0YSB8IG51bGw+KG51bGwpO1xyXG4gIHB1YmxpYyBmZU5hdiQ6IE9ic2VydmFibGU8RmVOYXZEYXRhIHwgbnVsbD4gPSB0aGlzLl9mZU5hdi5hc09ic2VydmFibGUoKTtcclxuXHJcbiAgcHJpdmF0ZSBhcGlCYXNlID0gJyc7XHJcbiAgcHJpdmF0ZSBjb25maWc6IE1lc0F1dGhDb25maWcgfCBudWxsID0gbnVsbDtcclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBodHRwOiBIdHRwQ2xpZW50LCBAT3B0aW9uYWwoKSBwcml2YXRlIHJvdXRlcj86IFJvdXRlcikge1xyXG4gICAgLy8gTGlzdGVuIGZvciByb3V0ZSBjaGFuZ2VzIC0gb25seSByZWZyZXNoIHVzZXIgZGF0YSBpZiBuZWVkZWQgZm9yIFNQQSBuYXZpZ2F0aW9uXHJcbiAgICAvLyBUaGlzIGhlbHBzIG1haW50YWluIGF1dGhlbnRpY2F0aW9uIHN0YXRlIGluIHNpbmdsZS1wYWdlIGFwcGxpY2F0aW9uc1xyXG4gICAgaWYgKHRoaXMucm91dGVyKSB7XHJcbiAgICAgIHRoaXMucm91dGVyLmV2ZW50c1xyXG4gICAgICAgIC5waXBlKFxyXG4gICAgICAgICAgZmlsdGVyKGV2ZW50ID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCksXHJcbiAgICAgICAgICBkZWJvdW5jZVRpbWUoMTAwMCkgLy8gTG9uZ2VyIGRlYm91bmNlIHRvIGF2b2lkIGludGVyZmVyaW5nIHdpdGggbG9naW4gZmxvd1xyXG4gICAgICAgIClcclxuICAgICAgICAuc3Vic2NyaWJlKChldmVudDogTmF2aWdhdGlvbkVuZCkgPT4ge1xyXG4gICAgICAgICAgLy8gT25seSByZWZyZXNoIGlmIHVzZXIgaXMgbG9nZ2VkIGluIGFuZCBuYXZpZ2F0aW5nIHRvIHByb3RlY3RlZCByb3V0ZXNcclxuICAgICAgICAgIC8vIEF2b2lkIHJlZnJlc2hpbmcgZHVyaW5nIGxvZ2luL2xvZ291dCBmbG93c1xyXG4gICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRVc2VyLnZhbHVlICYmIHRoaXMuaXNQcm90ZWN0ZWRSb3V0ZShldmVudC51cmwpKSB7XHJcbiAgICAgICAgICAgIC8vIFNtYWxsIGRlbGF5IHRvIGVuc3VyZSBhbnkgbG9naW4vbG9nb3V0IG9wZXJhdGlvbnMgY29tcGxldGVcclxuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKHRoaXMuX2N1cnJlbnRVc2VyLnZhbHVlKSB7XHJcbiAgICAgICAgICAgICAgICB0aGlzLnJlZnJlc2hVc2VyKCk7XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9LCAxMDApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBpc1Byb3RlY3RlZFJvdXRlKHVybDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICAvLyBDb25zaWRlciByb3V0ZXMgcHJvdGVjdGVkIGlmIHRoZXkgZG9uJ3QgaW5jbHVkZSBhdXRoLXJlbGF0ZWQgcGF0aHNcclxuICAgIHJldHVybiAhdXJsLmluY2x1ZGVzKCcvbG9naW4nKSAmJiAhdXJsLmluY2x1ZGVzKCcvYXV0aCcpICYmICF1cmwuaW5jbHVkZXMoJy9zaWduaW4nKSAmJiAhdXJsLmluY2x1ZGVzKCcvbG9nb3V0Jyk7XHJcbiAgfVxyXG5cclxuICBpbml0KGNvbmZpZzogTWVzQXV0aENvbmZpZykge1xyXG4gICAgdGhpcy5jb25maWcgPSBjb25maWc7XHJcbiAgICB0aGlzLmFwaUJhc2UgPSBjb25maWcuYXBpQmFzZVVybC5yZXBsYWNlKC9cXC8kLywgJycpO1xyXG4gICAgdGhpcy5mZXRjaEN1cnJlbnRVc2VyKCk7XHJcbiAgICB0aGlzLmZldGNoSW5pdGlhbE5vdGlmaWNhdGlvbnMoKTtcclxuICB9XHJcblxyXG4gIGdldENvbmZpZygpOiBNZXNBdXRoQ29uZmlnIHwgbnVsbCB7XHJcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGZldGNoQ3VycmVudFVzZXIoKSB7XHJcbiAgICBpZiAoIXRoaXMuYXBpQmFzZSkgcmV0dXJuO1xyXG4gICAgY29uc3QgdXJsID0gIGAke3RoaXMuYXBpQmFzZX0vYXV0aC9tZWA7XHJcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCwgeyB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlnPy53aXRoQ3JlZGVudGlhbHMgPz8gdHJ1ZSB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAodSkgPT4ge1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRVc2VyLm5leHQodSk7XHJcbiAgICAgICAgaWYgKHUgJiYgdGhpcy5jb25maWcpIHtcclxuICAgICAgICAgIHRoaXMuc3RhcnRDb25uZWN0aW9uKHRoaXMuY29uZmlnKTtcclxuICAgICAgICAgIHRoaXMuZmV0Y2hGZU5hdigpO1xyXG4gICAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgICB0aGlzLl9mZU5hdi5uZXh0KG51bGwpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLl9jdXJyZW50VXNlci5uZXh0KG51bGwpO1xyXG4gICAgICAgIHRoaXMuX2ZlTmF2Lm5leHQobnVsbCk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmZXRjaEluaXRpYWxOb3RpZmljYXRpb25zKCkge1xyXG4gICAgaWYgKCF0aGlzLmFwaUJhc2UpIHJldHVybjtcclxuICAgIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5hcGlCYXNlfS9ub3RpZi9tZWAsIHsgd2l0aENyZWRlbnRpYWxzOiB0aGlzLmNvbmZpZz8ud2l0aENyZWRlbnRpYWxzID8/IHRydWUgfSkuc3Vic2NyaWJlKHtcclxuICAgICAgbmV4dDogKG5vdGlmaWNhdGlvbnM6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KG5vdGlmaWNhdGlvbnM/Lml0ZW1zKSkge1xyXG4gICAgICAgICAgbm90aWZpY2F0aW9ucy5pdGVtcy5mb3JFYWNoKChuOiBhbnkpID0+IHRoaXMuX25vdGlmaWNhdGlvbnMubmV4dChuKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9LFxyXG4gICAgICBlcnJvcjogKGVycikgPT4ge31cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBmZXRjaEZlTmF2KCkge1xyXG4gICAgaWYgKCF0aGlzLmFwaUJhc2UgfHwgIXRoaXMuX2N1cnJlbnRVc2VyLnZhbHVlPy51c2VySWQpIHJldHVybjtcclxuICAgIGNvbnN0IHVybCA9IGAke3RoaXMuYXBpQmFzZX0vZmVuYXZzLyR7dGhpcy5fY3VycmVudFVzZXIudmFsdWUudXNlcklkfWA7XHJcbiAgICB0aGlzLmh0dHAuZ2V0KHVybCwgeyB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlnPy53aXRoQ3JlZGVudGlhbHMgPz8gdHJ1ZSB9KS5zdWJzY3JpYmUoe1xyXG4gICAgICBuZXh0OiAocmVzcG9uc2U6IGFueSkgPT4ge1xyXG4gICAgICAgIGlmIChyZXNwb25zZT8uY29udGVudCkge1xyXG4gICAgICAgICAgY29uc3QgZmVOYXZEYXRhOiBGZU5hdkRhdGEgPSB7XHJcbiAgICAgICAgICAgIGl0ZW1zOiByZXNwb25zZS5jb250ZW50LFxyXG4gICAgICAgICAgICBsYXN0VXBkYXRlZDogbmV3IERhdGUoKS50b0lTT1N0cmluZygpXHJcbiAgICAgICAgICB9O1xyXG4gICAgICAgICAgdGhpcy5fZmVOYXYubmV4dChmZU5hdkRhdGEpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSxcclxuICAgICAgZXJyb3I6IChlcnIpID0+IHtcclxuICAgICAgICB0aGlzLl9mZU5hdi5uZXh0KG51bGwpO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXRVbnJlYWRDb3VudCgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQoYCR7dGhpcy5hcGlCYXNlfS9ub3RpZi9tZS91bnJlYWQtY291bnRgLCB7IHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWc/LndpdGhDcmVkZW50aWFscyA/PyB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldE5vdGlmaWNhdGlvbnMocGFnZTogbnVtYmVyID0gMSwgcGFnZVNpemU6IG51bWJlciA9IDIwLCBpbmNsdWRlUmVhZDogYm9vbGVhbiA9IGZhbHNlLCB0eXBlPzogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIGxldCB1cmwgPSBgJHt0aGlzLmFwaUJhc2V9L25vdGlmL21lP3BhZ2U9JHtwYWdlfSZwYWdlU2l6ZT0ke3BhZ2VTaXplfSZpbmNsdWRlUmVhZD0ke2luY2x1ZGVSZWFkfWA7XHJcbiAgICBpZiAodHlwZSkge1xyXG4gICAgICB1cmwgKz0gYCZ0eXBlPSR7dHlwZX1gO1xyXG4gICAgfVxyXG4gICAgcmV0dXJuIHRoaXMuaHR0cC5nZXQodXJsLCB7IHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWc/LndpdGhDcmVkZW50aWFscyA/PyB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1hcmtBc1JlYWQobm90aWZpY2F0aW9uSWQ6IHN0cmluZyk6IE9ic2VydmFibGU8YW55PiB7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBhdGNoKGAke3RoaXMuYXBpQmFzZX0vbm90aWYvJHtub3RpZmljYXRpb25JZH0vcmVhZGAsIHt9LCB7IHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWc/LndpdGhDcmVkZW50aWFscyA/PyB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIG1hcmtBbGxBc1JlYWQoKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAucGF0Y2goYCR7dGhpcy5hcGlCYXNlfS9ub3RpZi9tZS9yZWFkLWFsbGAsIHt9LCB7IHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWc/LndpdGhDcmVkZW50aWFscyA/PyB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZU5vdGlmaWNhdGlvbihub3RpZmljYXRpb25JZDogc3RyaW5nKTogT2JzZXJ2YWJsZTxhbnk+IHtcclxuICAgIHJldHVybiB0aGlzLmh0dHAuZGVsZXRlKGAke3RoaXMuYXBpQmFzZX0vbm90aWYvJHtub3RpZmljYXRpb25JZH1gLCB7IHdpdGhDcmVkZW50aWFsczogdGhpcy5jb25maWc/LndpdGhDcmVkZW50aWFscyA/PyB0cnVlIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBzdGFydENvbm5lY3Rpb24oY29uZmlnOiBNZXNBdXRoQ29uZmlnKSB7XHJcbiAgICBpZiAodGhpcy5odWJDb25uZWN0aW9uKSByZXR1cm47XHJcbiAgICBjb25zdCBzaWduYWxyVXJsID0gY29uZmlnLmFwaUJhc2VVcmwucmVwbGFjZSgvXFwvJC8sICcnKSArICcvaHViL25vdGlmaWNhdGlvbic7XHJcbiAgICBjb25zdCBidWlsZGVyID0gbmV3IEh1YkNvbm5lY3Rpb25CdWlsZGVyKClcclxuICAgICAgLndpdGhVcmwoc2lnbmFsclVybCwgeyB3aXRoQ3JlZGVudGlhbHM6IGNvbmZpZy53aXRoQ3JlZGVudGlhbHMgPz8gdHJ1ZSB9KVxyXG4gICAgICAud2l0aEF1dG9tYXRpY1JlY29ubmVjdCgpXHJcbiAgICAgIC5jb25maWd1cmVMb2dnaW5nKExvZ0xldmVsLldhcm5pbmcpO1xyXG5cclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbiA9IGJ1aWxkZXIuYnVpbGQoKTtcclxuXHJcbiAgICB0aGlzLmh1YkNvbm5lY3Rpb24ub24oJ1JlY2VpdmVOb3RpZmljYXRpb24nLCAobjogYW55KSA9PiB7XHJcbiAgICAgIHRoaXMuX25vdGlmaWNhdGlvbnMubmV4dChuKTtcclxuICAgIH0pO1xyXG5cclxuICAgIHRoaXMuaHViQ29ubmVjdGlvbi5zdGFydCgpLnRoZW4oKCkgPT4ge30pLmNhdGNoKChlcnIpID0+IHt9KTtcclxuXHJcbiAgICB0aGlzLmh1YkNvbm5lY3Rpb24ub25jbG9zZSgoKSA9PiB7fSk7XHJcbiAgICB0aGlzLmh1YkNvbm5lY3Rpb24ub25yZWNvbm5lY3RpbmcoKCkgPT4ge30pO1xyXG4gICAgdGhpcy5odWJDb25uZWN0aW9uLm9ucmVjb25uZWN0ZWQoKCkgPT4ge30pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHN0b3AoKSB7XHJcbiAgICBpZiAoIXRoaXMuaHViQ29ubmVjdGlvbikgcmV0dXJuO1xyXG4gICAgdGhpcy5odWJDb25uZWN0aW9uLnN0b3AoKS5jYXRjaCgoKSA9PiB7fSk7XHJcbiAgICB0aGlzLmh1YkNvbm5lY3Rpb24gPSBudWxsO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGxvZ291dCgpOiBPYnNlcnZhYmxlPGFueT4ge1xyXG4gICAgY29uc3QgdXJsID0gYCR7dGhpcy5hcGlCYXNlfS9hdXRoL2xvZ291dGA7XHJcbiAgICByZXR1cm4gdGhpcy5odHRwLnBvc3QodXJsLCB7fSwgeyB3aXRoQ3JlZGVudGlhbHM6IHRoaXMuY29uZmlnPy53aXRoQ3JlZGVudGlhbHMgPz8gdHJ1ZSB9KS5waXBlKFxyXG4gICAgICB0YXAoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMuX2N1cnJlbnRVc2VyLm5leHQobnVsbCk7XHJcbiAgICAgICAgdGhpcy5fZmVOYXYubmV4dChudWxsKTtcclxuICAgICAgICB0aGlzLnN0b3AoKTtcclxuICAgICAgfSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgcmVmcmVzaFVzZXIoKSB7XHJcbiAgICB0aGlzLmZldGNoQ3VycmVudFVzZXIoKTtcclxuICB9XHJcbn1cclxuIl19
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Generated bundle index. Do not edit.
|
|
3
|
-
*/
|
|
4
|
-
export * from './index';
|
|
5
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVzYXV0aC1hbmd1bGFyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lc2F1dGgtYW5ndWxhci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTs7R0FFRztBQUVILGNBQWMsU0FBUyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBHZW5lcmF0ZWQgYnVuZGxlIGluZGV4LiBEbyBub3QgZWRpdC5cbiAqL1xuXG5leHBvcnQgKiBmcm9tICcuL2luZGV4JztcbiJdfQ==
|
|
@@ -1,71 +0,0 @@
|
|
|
1
|
-
import { Component, Output, EventEmitter, HostBinding } from '@angular/core';
|
|
2
|
-
import { NgIf } from '@angular/common';
|
|
3
|
-
import { Subject } from 'rxjs';
|
|
4
|
-
import { takeUntil } from 'rxjs/operators';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
import * as i1 from "./mes-auth.service";
|
|
7
|
-
import * as i2 from "./theme.service";
|
|
8
|
-
export class NotificationBadgeComponent {
|
|
9
|
-
constructor(authService, themeService) {
|
|
10
|
-
this.authService = authService;
|
|
11
|
-
this.themeService = themeService;
|
|
12
|
-
this.notificationClick = new EventEmitter();
|
|
13
|
-
this.unreadCount = 0;
|
|
14
|
-
this.currentTheme = 'light';
|
|
15
|
-
this.destroy$ = new Subject();
|
|
16
|
-
}
|
|
17
|
-
get themeClass() {
|
|
18
|
-
return `theme-${this.currentTheme}`;
|
|
19
|
-
}
|
|
20
|
-
ngOnInit() {
|
|
21
|
-
this.themeService.currentTheme$
|
|
22
|
-
.pipe(takeUntil(this.destroy$))
|
|
23
|
-
.subscribe(theme => {
|
|
24
|
-
this.currentTheme = theme;
|
|
25
|
-
});
|
|
26
|
-
this.loadUnreadCount();
|
|
27
|
-
// Listen for new notifications
|
|
28
|
-
this.authService.notifications$
|
|
29
|
-
.pipe(takeUntil(this.destroy$))
|
|
30
|
-
.subscribe(() => {
|
|
31
|
-
this.loadUnreadCount();
|
|
32
|
-
});
|
|
33
|
-
}
|
|
34
|
-
ngOnDestroy() {
|
|
35
|
-
this.destroy$.next();
|
|
36
|
-
this.destroy$.complete();
|
|
37
|
-
}
|
|
38
|
-
loadUnreadCount() {
|
|
39
|
-
this.authService.getUnreadCount().subscribe({
|
|
40
|
-
next: (response) => {
|
|
41
|
-
this.unreadCount = response.unreadCount || 0;
|
|
42
|
-
},
|
|
43
|
-
error: (err) => console.error('Error loading unread count:', err)
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
onNotificationClick() {
|
|
47
|
-
this.notificationClick.emit();
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
NotificationBadgeComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NotificationBadgeComponent, deps: [{ token: i1.MesAuthService }, { token: i2.ThemeService }], target: i0.ɵɵFactoryTarget.Component });
|
|
51
|
-
NotificationBadgeComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: NotificationBadgeComponent, isStandalone: true, selector: "ma-notification-badge", outputs: { notificationClick: "notificationClick" }, host: { properties: { "class": "this.themeClass" } }, ngImport: i0, template: `
|
|
52
|
-
<button class="notification-btn" (click)="onNotificationClick()" title="Notifications">
|
|
53
|
-
<span class="icon">🔔</span>
|
|
54
|
-
<span class="badge" *ngIf="unreadCount > 0">{{ unreadCount }}</span>
|
|
55
|
-
</button>
|
|
56
|
-
`, isInline: true, styles: [":host{--error-color: #f44336}:host(.theme-dark){--error-color: #ef5350}.notification-btn{position:relative;background:none;border:none;font-size:24px;cursor:pointer;padding:8px;transition:opacity .2s}.notification-btn:hover{opacity:.7}.icon{display:inline-block}.badge{position:absolute;top:0;right:0;background-color:var(--error-color);color:#fff;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700}\n"], dependencies: [{ kind: "directive", type: NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }] });
|
|
57
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: NotificationBadgeComponent, decorators: [{
|
|
58
|
-
type: Component,
|
|
59
|
-
args: [{ selector: 'ma-notification-badge', standalone: true, imports: [NgIf], template: `
|
|
60
|
-
<button class="notification-btn" (click)="onNotificationClick()" title="Notifications">
|
|
61
|
-
<span class="icon">🔔</span>
|
|
62
|
-
<span class="badge" *ngIf="unreadCount > 0">{{ unreadCount }}</span>
|
|
63
|
-
</button>
|
|
64
|
-
`, styles: [":host{--error-color: #f44336}:host(.theme-dark){--error-color: #ef5350}.notification-btn{position:relative;background:none;border:none;font-size:24px;cursor:pointer;padding:8px;transition:opacity .2s}.notification-btn:hover{opacity:.7}.icon{display:inline-block}.badge{position:absolute;top:0;right:0;background-color:var(--error-color);color:#fff;border-radius:50%;width:20px;height:20px;display:flex;align-items:center;justify-content:center;font-size:12px;font-weight:700}\n"] }]
|
|
65
|
-
}], ctorParameters: function () { return [{ type: i1.MesAuthService }, { type: i2.ThemeService }]; }, propDecorators: { notificationClick: [{
|
|
66
|
-
type: Output
|
|
67
|
-
}], themeClass: [{
|
|
68
|
-
type: HostBinding,
|
|
69
|
-
args: ['class']
|
|
70
|
-
}] } });
|
|
71
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibm90aWZpY2F0aW9uLWJhZGdlLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9ub3RpZmljYXRpb24tYmFkZ2UuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sRUFBRSxZQUFZLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2hHLE9BQU8sRUFBRSxJQUFJLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUd2QyxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9CLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQzs7OztBQXdEM0MsTUFBTSxPQUFPLDBCQUEwQjtJQVVyQyxZQUFvQixXQUEyQixFQUFVLFlBQTBCO1FBQS9ELGdCQUFXLEdBQVgsV0FBVyxDQUFnQjtRQUFVLGlCQUFZLEdBQVosWUFBWSxDQUFjO1FBVHpFLHNCQUFpQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFLdkQsZ0JBQVcsR0FBRyxDQUFDLENBQUM7UUFDaEIsaUJBQVksR0FBVSxPQUFPLENBQUM7UUFDdEIsYUFBUSxHQUFHLElBQUksT0FBTyxFQUFRLENBQUM7SUFFK0MsQ0FBQztJQVJ2RixJQUEwQixVQUFVO1FBQ2xDLE9BQU8sU0FBUyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7SUFDdEMsQ0FBQztJQVFELFFBQVE7UUFDTixJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWE7YUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ2pCLElBQUksQ0FBQyxZQUFZLEdBQUcsS0FBSyxDQUFDO1FBQzVCLENBQUMsQ0FBQyxDQUFDO1FBRUwsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRXZCLCtCQUErQjtRQUMvQixJQUFJLENBQUMsV0FBVyxDQUFDLGNBQWM7YUFDNUIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDOUIsU0FBUyxDQUFDLEdBQUcsRUFBRTtZQUNkLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUN6QixDQUFDLENBQUMsQ0FBQztJQUNQLENBQUM7SUFFRCxXQUFXO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUNyQixJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQzNCLENBQUM7SUFFTyxlQUFlO1FBQ3JCLElBQUksQ0FBQyxXQUFXLENBQUMsY0FBYyxFQUFFLENBQUMsU0FBUyxDQUFDO1lBQzFDLElBQUksRUFBRSxDQUFDLFFBQWEsRUFBRSxFQUFFO2dCQUN0QixJQUFJLENBQUMsV0FBVyxHQUFHLFFBQVEsQ0FBQyxXQUFXLElBQUksQ0FBQyxDQUFDO1lBQy9DLENBQUM7WUFDRCxLQUFLLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsNkJBQTZCLEVBQUUsR0FBRyxDQUFDO1NBQ2xFLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxtQkFBbUI7UUFDakIsSUFBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksRUFBRSxDQUFDO0lBQ2hDLENBQUM7O3VIQTdDVSwwQkFBMEI7MkdBQTFCLDBCQUEwQiw0TEFsRDNCOzs7OztHQUtULHVpQkFOUyxJQUFJOzJGQW1ESCwwQkFBMEI7a0JBdER0QyxTQUFTOytCQUNFLHVCQUF1QixjQUNyQixJQUFJLFdBQ1AsQ0FBQyxJQUFJLENBQUMsWUFDTDs7Ozs7R0FLVDtnSUE4Q1MsaUJBQWlCO3NCQUExQixNQUFNO2dCQUNtQixVQUFVO3NCQUFuQyxXQUFXO3VCQUFDLE9BQU8iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgT25EZXN0cm95LCBPdXRwdXQsIEV2ZW50RW1pdHRlciwgSG9zdEJpbmRpbmcgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgTmdJZiB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IE1lc0F1dGhTZXJ2aWNlIH0gZnJvbSAnLi9tZXMtYXV0aC5zZXJ2aWNlJztcclxuaW1wb3J0IHsgVGhlbWVTZXJ2aWNlLCBUaGVtZSB9IGZyb20gJy4vdGhlbWUuc2VydmljZSc7XHJcbmltcG9ydCB7IFN1YmplY3QgfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdtYS1ub3RpZmljYXRpb24tYmFkZ2UnLFxyXG4gIHN0YW5kYWxvbmU6IHRydWUsXHJcbiAgaW1wb3J0czogW05nSWZdLFxyXG4gIHRlbXBsYXRlOiBgXHJcbiAgICA8YnV0dG9uIGNsYXNzPVwibm90aWZpY2F0aW9uLWJ0blwiIChjbGljayk9XCJvbk5vdGlmaWNhdGlvbkNsaWNrKClcIiB0aXRsZT1cIk5vdGlmaWNhdGlvbnNcIj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJpY29uXCI+8J+UlDwvc3Bhbj5cclxuICAgICAgPHNwYW4gY2xhc3M9XCJiYWRnZVwiICpuZ0lmPVwidW5yZWFkQ291bnQgPiAwXCI+e3sgdW5yZWFkQ291bnQgfX08L3NwYW4+XHJcbiAgICA8L2J1dHRvbj5cclxuICBgLFxyXG4gIHN0eWxlczogW2BcclxuICAgIDpob3N0IHtcclxuICAgICAgLS1lcnJvci1jb2xvcjogI2Y0NDMzNjtcclxuICAgIH1cclxuXHJcbiAgICA6aG9zdCgudGhlbWUtZGFyaykge1xyXG4gICAgICAtLWVycm9yLWNvbG9yOiAjZWY1MzUwO1xyXG4gICAgfVxyXG5cclxuICAgIC5ub3RpZmljYXRpb24tYnRuIHtcclxuICAgICAgcG9zaXRpb246IHJlbGF0aXZlO1xyXG4gICAgICBiYWNrZ3JvdW5kOiBub25lO1xyXG4gICAgICBib3JkZXI6IG5vbmU7XHJcbiAgICAgIGZvbnQtc2l6ZTogMjRweDtcclxuICAgICAgY3Vyc29yOiBwb2ludGVyO1xyXG4gICAgICBwYWRkaW5nOiA4cHg7XHJcbiAgICAgIHRyYW5zaXRpb246IG9wYWNpdHkgMC4ycztcclxuICAgIH1cclxuXHJcbiAgICAubm90aWZpY2F0aW9uLWJ0bjpob3ZlciB7XHJcbiAgICAgIG9wYWNpdHk6IDAuNztcclxuICAgIH1cclxuXHJcbiAgICAuaWNvbiB7XHJcbiAgICAgIGRpc3BsYXk6IGlubGluZS1ibG9jaztcclxuICAgIH1cclxuXHJcbiAgICAuYmFkZ2Uge1xyXG4gICAgICBwb3NpdGlvbjogYWJzb2x1dGU7XHJcbiAgICAgIHRvcDogMDtcclxuICAgICAgcmlnaHQ6IDA7XHJcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWVycm9yLWNvbG9yKTtcclxuICAgICAgY29sb3I6IHdoaXRlO1xyXG4gICAgICBib3JkZXItcmFkaXVzOiA1MCU7XHJcbiAgICAgIHdpZHRoOiAyMHB4O1xyXG4gICAgICBoZWlnaHQ6IDIwcHg7XHJcbiAgICAgIGRpc3BsYXk6IGZsZXg7XHJcbiAgICAgIGFsaWduLWl0ZW1zOiBjZW50ZXI7XHJcbiAgICAgIGp1c3RpZnktY29udGVudDogY2VudGVyO1xyXG4gICAgICBmb250LXNpemU6IDEycHg7XHJcbiAgICAgIGZvbnQtd2VpZ2h0OiBib2xkO1xyXG4gICAgfVxyXG4gIGBdXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBOb3RpZmljYXRpb25CYWRnZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICBAT3V0cHV0KCkgbm90aWZpY2F0aW9uQ2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XHJcbiAgQEhvc3RCaW5kaW5nKCdjbGFzcycpIGdldCB0aGVtZUNsYXNzKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gYHRoZW1lLSR7dGhpcy5jdXJyZW50VGhlbWV9YDtcclxuICB9XHJcbiAgXHJcbiAgdW5yZWFkQ291bnQgPSAwO1xyXG4gIGN1cnJlbnRUaGVtZTogVGhlbWUgPSAnbGlnaHQnO1xyXG4gIHByaXZhdGUgZGVzdHJveSQgPSBuZXcgU3ViamVjdDx2b2lkPigpO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGF1dGhTZXJ2aWNlOiBNZXNBdXRoU2VydmljZSwgcHJpdmF0ZSB0aGVtZVNlcnZpY2U6IFRoZW1lU2VydmljZSkge31cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnRoZW1lU2VydmljZS5jdXJyZW50VGhlbWUkXHJcbiAgICAgIC5waXBlKHRha2VVbnRpbCh0aGlzLmRlc3Ryb3kkKSlcclxuICAgICAgLnN1YnNjcmliZSh0aGVtZSA9PiB7XHJcbiAgICAgICAgdGhpcy5jdXJyZW50VGhlbWUgPSB0aGVtZTtcclxuICAgICAgfSk7XHJcblxyXG4gICAgdGhpcy5sb2FkVW5yZWFkQ291bnQoKTtcclxuICAgIFxyXG4gICAgLy8gTGlzdGVuIGZvciBuZXcgbm90aWZpY2F0aW9uc1xyXG4gICAgdGhpcy5hdXRoU2VydmljZS5ub3RpZmljYXRpb25zJFxyXG4gICAgICAucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpXHJcbiAgICAgIC5zdWJzY3JpYmUoKCkgPT4ge1xyXG4gICAgICAgIHRoaXMubG9hZFVucmVhZENvdW50KCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICB0aGlzLmRlc3Ryb3kkLm5leHQoKTtcclxuICAgIHRoaXMuZGVzdHJveSQuY29tcGxldGUoKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgbG9hZFVucmVhZENvdW50KCkge1xyXG4gICAgdGhpcy5hdXRoU2VydmljZS5nZXRVbnJlYWRDb3VudCgpLnN1YnNjcmliZSh7XHJcbiAgICAgIG5leHQ6IChyZXNwb25zZTogYW55KSA9PiB7XHJcbiAgICAgICAgdGhpcy51bnJlYWRDb3VudCA9IHJlc3BvbnNlLnVucmVhZENvdW50IHx8IDA7XHJcbiAgICAgIH0sXHJcbiAgICAgIGVycm9yOiAoZXJyKSA9PiBjb25zb2xlLmVycm9yKCdFcnJvciBsb2FkaW5nIHVucmVhZCBjb3VudDonLCBlcnIpXHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIG9uTm90aWZpY2F0aW9uQ2xpY2soKSB7XHJcbiAgICB0aGlzLm5vdGlmaWNhdGlvbkNsaWNrLmVtaXQoKTtcclxuICB9XHJcbn1cclxuIl19
|