aril 1.2.36 → 1.2.38
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/boot/config/api/src/api.service.d.ts +2 -1
- package/esm2022/boot/config/api/src/api.service.mjs +24 -7
- package/esm2022/boot/host/src/bootstrap.mjs +13 -4
- package/esm2022/permission/aril-permission.mjs +5 -0
- package/esm2022/permission/index.mjs +4 -0
- package/esm2022/permission/src/constants.mjs +4 -0
- package/esm2022/permission/src/has-permission.directive.mjs +49 -0
- package/esm2022/permission/src/permission.service.mjs +57 -0
- package/esm2022/provider/src/index.mjs +2 -1
- package/esm2022/provider/src/prodiveHost.mjs +3 -2
- package/esm2022/provider/src/provideHostPermissions.mjs +43 -0
- package/esm2022/theme/layout/app/notifications/notifications-sidebar.component.mjs +146 -49
- package/esm2022/theme/layout/service/interfaces/interfaces.mjs +1 -1
- package/esm2022/theme/layout/service/notifications.service.mjs +8 -2
- package/fesm2022/{aril-app.component-W3wwVSp1.mjs → aril-app.component-BUjucZ0J.mjs} +2 -1
- package/fesm2022/{aril-app.component-W3wwVSp1.mjs.map → aril-app.component-BUjucZ0J.mjs.map} +1 -1
- package/fesm2022/aril-boot-config-api.mjs +23 -6
- package/fesm2022/aril-boot-config-api.mjs.map +1 -1
- package/fesm2022/aril-boot-host.mjs +12 -3
- package/fesm2022/aril-boot-host.mjs.map +1 -1
- package/fesm2022/aril-permission.mjs +114 -0
- package/fesm2022/aril-permission.mjs.map +1 -0
- package/fesm2022/aril-provider.mjs +44 -2
- package/fesm2022/aril-provider.mjs.map +1 -1
- package/fesm2022/aril-theme-layout.mjs +145 -39
- package/fesm2022/aril-theme-layout.mjs.map +1 -1
- package/fesm2022/aril.mjs +13 -4
- package/fesm2022/aril.mjs.map +1 -1
- package/package.json +87 -81
- package/permission/index.d.ts +3 -0
- package/permission/src/constants.d.ts +1 -0
- package/permission/src/has-permission.directive.d.ts +16 -0
- package/permission/src/permission.service.d.ts +15 -0
- package/provider/src/index.d.ts +1 -0
- package/provider/src/provideHostPermissions.d.ts +6 -0
- package/theme/layout/app/notifications/notifications-sidebar.component.d.ts +2288 -2267
- package/theme/layout/app/notifications/notifications-sidebar.component.html +66 -68
- package/theme/layout/app/notifications/notifications-sidebar.component.scss +234 -120
- package/theme/layout/app/notifications/notifications-sidebar.component.ts +182 -56
- package/theme/layout/service/interfaces/interfaces.d.ts +5 -1
- package/theme/layout/service/interfaces/interfaces.ts +6 -1
- package/theme/layout/service/notifications.service.d.ts +1 -0
- package/theme/layout/service/notifications.service.ts +5 -0
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i3$1 from '@angular/common';
|
|
2
2
|
import { CommonModule, UpperCasePipe, NgClass, NgTemplateOutlet } from '@angular/common';
|
|
3
3
|
import * as i0 from '@angular/core';
|
|
4
|
-
import { Component, Injectable, effect, signal, computed, inject, ViewChild, HostListener } from '@angular/core';
|
|
4
|
+
import { Component, Injectable, effect, signal, computed, inject, ViewChild, HostListener, untracked } from '@angular/core';
|
|
5
5
|
import * as i1$2 from '@angular/router';
|
|
6
6
|
import { Router, RouterModule, NavigationEnd, RouterLink, RouterOutlet, NavigationCancel, NavigationError, NavigationSkipped } from '@angular/router';
|
|
7
7
|
import * as i8$1 from 'primeng/confirmdialog';
|
|
@@ -14,7 +14,7 @@ import * as i7$4 from 'primeng/messages';
|
|
|
14
14
|
import { MessagesModule } from 'primeng/messages';
|
|
15
15
|
import * as i8$3 from 'primeng/toast';
|
|
16
16
|
import { ToastModule } from 'primeng/toast';
|
|
17
|
-
import { Observable, Subject, switchMap, BehaviorSubject, takeUntil, of, startWith, filter as filter$1, map as map$1, take } from 'rxjs';
|
|
17
|
+
import { Observable, Subject, switchMap, BehaviorSubject, takeUntil, of, startWith, filter as filter$1, mergeMap, map as map$1, take } from 'rxjs';
|
|
18
18
|
import * as i5 from '@ngneat/transloco';
|
|
19
19
|
import { TranslocoModule, TranslocoService } from '@ngneat/transloco';
|
|
20
20
|
import { API_CONFIGS } from 'aril/boot/config/api';
|
|
@@ -75,6 +75,9 @@ import * as i6$2 from 'primeng/autocomplete';
|
|
|
75
75
|
import { AutoCompleteModule } from 'primeng/autocomplete';
|
|
76
76
|
import { map, filter, switchMap as switchMap$1, catchError } from 'rxjs/operators';
|
|
77
77
|
import * as i7$3 from '@angular/common/http';
|
|
78
|
+
import * as i10$2 from 'primeng/menu';
|
|
79
|
+
import { MenuModule } from 'primeng/menu';
|
|
80
|
+
import { SwitchComponent } from 'aril/ui/switch';
|
|
78
81
|
import * as i4$1 from 'primeng/breadcrumb';
|
|
79
82
|
import { BreadcrumbModule } from 'primeng/breadcrumb';
|
|
80
83
|
|
|
@@ -2573,6 +2576,9 @@ class NotificationsService extends RestClient {
|
|
|
2573
2576
|
markAsReadNotification(pluginId) {
|
|
2574
2577
|
return new Observable();
|
|
2575
2578
|
}
|
|
2579
|
+
markAllAsReadNotification(post) {
|
|
2580
|
+
return new Observable();
|
|
2581
|
+
}
|
|
2576
2582
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: NotificationsService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
2577
2583
|
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: NotificationsService, providedIn: 'root' }); }
|
|
2578
2584
|
}
|
|
@@ -2582,10 +2588,13 @@ __decorate([
|
|
|
2582
2588
|
__decorate([
|
|
2583
2589
|
ServiceCall(HTTPMethods.PUTBYDYNAMICPATH, ProxyTypes.ClientSide, 'audits/$/read')
|
|
2584
2590
|
], NotificationsService.prototype, "markAsReadNotification", null);
|
|
2591
|
+
__decorate([
|
|
2592
|
+
ServiceCall(HTTPMethods.PUTBYPARAMS, ProxyTypes.ClientSide, 'audits/read-all', { success: 'notifications.markedAllAsRead' })
|
|
2593
|
+
], NotificationsService.prototype, "markAllAsReadNotification", null);
|
|
2585
2594
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: NotificationsService, decorators: [{
|
|
2586
2595
|
type: Injectable,
|
|
2587
2596
|
args: [{ providedIn: 'root' }]
|
|
2588
|
-
}], ctorParameters: () => [], propDecorators: { getNotifications: [], markAsReadNotification: [] } });
|
|
2597
|
+
}], ctorParameters: () => [], propDecorators: { getNotifications: [], markAsReadNotification: [], markAllAsReadNotification: [] } });
|
|
2589
2598
|
|
|
2590
2599
|
class NotificationsSidebarComponent {
|
|
2591
2600
|
get getUserPhones() {
|
|
@@ -2601,14 +2610,25 @@ class NotificationsSidebarComponent {
|
|
|
2601
2610
|
get getUserMail() {
|
|
2602
2611
|
return this.keycloak.getKeycloakInstance().profile?.email;
|
|
2603
2612
|
}
|
|
2613
|
+
get unreadCount() {
|
|
2614
|
+
return this.layoutService.getUnreadNotificationCount();
|
|
2615
|
+
}
|
|
2616
|
+
get loading() {
|
|
2617
|
+
return !!this.notificationsService.states.getNotifications?.waitingForResponse;
|
|
2618
|
+
}
|
|
2604
2619
|
constructor(layoutService, notificationsService, translocoService, router, keycloak) {
|
|
2605
2620
|
this.layoutService = layoutService;
|
|
2606
2621
|
this.notificationsService = notificationsService;
|
|
2607
2622
|
this.translocoService = translocoService;
|
|
2608
2623
|
this.router = router;
|
|
2609
2624
|
this.keycloak = keycloak;
|
|
2625
|
+
this.pageSize = 10;
|
|
2610
2626
|
this.notifications = signal([]);
|
|
2611
|
-
this.
|
|
2627
|
+
this.totalRecords = signal(0);
|
|
2628
|
+
this.onlyUnread = signal(true);
|
|
2629
|
+
this.pageNumber = signal(1);
|
|
2630
|
+
this.remainingCount = computed(() => Math.max(this.totalRecords() - this.notifications().length, 0));
|
|
2631
|
+
this.menuItems = [];
|
|
2612
2632
|
this.ActivityTypesEnum = ActivityTypesEnum;
|
|
2613
2633
|
this.DetailNotificationTypeEnum = DetailNotificationTypeEnum;
|
|
2614
2634
|
this.regularIcons = regularIcons;
|
|
@@ -2616,45 +2636,74 @@ class NotificationsSidebarComponent {
|
|
|
2616
2636
|
this.oneMonthAgo = new Date(new Date().getTime() - 30 * 24 * 60 * 60 * 1000);
|
|
2617
2637
|
this.subjects = {
|
|
2618
2638
|
markAsRead: new Subject(),
|
|
2639
|
+
markAllAsRead: new Subject(),
|
|
2619
2640
|
loadNotifications: new Subject()
|
|
2620
2641
|
};
|
|
2621
|
-
this.markAsReadService = toSignal(this.subjects.markAsRead.pipe(
|
|
2642
|
+
this.markAsReadService = toSignal(this.subjects.markAsRead.pipe(mergeMap((id) => this.notificationsService.markAsReadNotification(id).pipe(map$1((result) => ({ result, id }))))));
|
|
2643
|
+
this.markAllAsReadService = toSignal(this.subjects.markAllAsRead.pipe(switchMap(() => this.notificationsService.markAllAsReadNotification({
|
|
2644
|
+
toList: [this.getUserMail, ...this.getUserPhones],
|
|
2645
|
+
endDate: new Date().dateToLong('time') || 0
|
|
2646
|
+
}))));
|
|
2622
2647
|
this.loadNotificationsService = toSignal(this.subjects.loadNotifications.pipe(switchMap(() => this.notificationsService.getNotifications({
|
|
2623
2648
|
pager: {
|
|
2624
|
-
pageSize:
|
|
2625
|
-
pageNumber:
|
|
2649
|
+
pageSize: this.pageSize,
|
|
2650
|
+
pageNumber: this.pageNumber()
|
|
2626
2651
|
},
|
|
2627
2652
|
startDate: this.oneMonthAgo.dateToLong('time') || 0,
|
|
2628
2653
|
endDate: new Date().dateToLong('time') || 0,
|
|
2629
|
-
read: false,
|
|
2630
|
-
toList: [this.getUserMail, ...this.getUserPhones]
|
|
2654
|
+
...(this.onlyUnread() ? { read: false } : {}),
|
|
2655
|
+
toList: [this.getUserMail, ...this.getUserPhones]
|
|
2631
2656
|
}))));
|
|
2632
2657
|
this.initializeEffects();
|
|
2633
2658
|
}
|
|
2634
2659
|
ngOnInit() {
|
|
2635
|
-
this.loadNotifications();
|
|
2636
|
-
}
|
|
2637
|
-
loadNotifications() {
|
|
2638
2660
|
this.subjects.loadNotifications.next();
|
|
2639
2661
|
}
|
|
2640
2662
|
initializeEffects() {
|
|
2641
2663
|
effect(() => {
|
|
2642
2664
|
const service = this.loadNotificationsService();
|
|
2643
2665
|
if (service?.response) {
|
|
2644
|
-
|
|
2645
|
-
|
|
2646
|
-
this.
|
|
2666
|
+
const result = service.response.result || [];
|
|
2667
|
+
const isFirstPage = untracked(this.pageNumber) === 1;
|
|
2668
|
+
this.notifications.update((current) => isFirstPage ? result : [...current, ...result.filter((item) => !current.some((existing) => existing.id === item.id))]);
|
|
2669
|
+
this.totalRecords.set(service.response.resultInfo.totalItem || 0);
|
|
2670
|
+
if (untracked(this.onlyUnread)) {
|
|
2671
|
+
this.layoutService.setUnreadNotificationCount(service.response.resultInfo.totalItem || 0);
|
|
2672
|
+
}
|
|
2673
|
+
}
|
|
2674
|
+
}, { allowSignalWrites: true });
|
|
2675
|
+
effect(() => {
|
|
2676
|
+
const marked = this.markAsReadService();
|
|
2677
|
+
if (marked?.result?.response) {
|
|
2678
|
+
this.applyMarkedAsRead(marked.id);
|
|
2647
2679
|
}
|
|
2648
2680
|
}, { allowSignalWrites: true });
|
|
2649
2681
|
effect(() => {
|
|
2650
|
-
const service = this.
|
|
2682
|
+
const service = this.markAllAsReadService();
|
|
2651
2683
|
if (service?.response) {
|
|
2652
|
-
this.
|
|
2653
|
-
if (this.selectedNotification?.detailNotificationType === DetailNotificationTypeEnum.TODO_ITEM) {
|
|
2654
|
-
this.router.navigate([`mng/todo-tasks/detail/${this.selectedNotification?.referenceId}`]);
|
|
2655
|
-
}
|
|
2684
|
+
this.applyAllMarkedAsRead();
|
|
2656
2685
|
}
|
|
2657
|
-
});
|
|
2686
|
+
}, { allowSignalWrites: true });
|
|
2687
|
+
}
|
|
2688
|
+
applyMarkedAsRead(id) {
|
|
2689
|
+
if (untracked(this.onlyUnread)) {
|
|
2690
|
+
this.notifications.update((items) => items.filter((item) => item.id !== id));
|
|
2691
|
+
this.totalRecords.update((total) => Math.max(total - 1, 0));
|
|
2692
|
+
}
|
|
2693
|
+
else {
|
|
2694
|
+
this.notifications.update((items) => items.map((item) => (item.id === id ? { ...item, read: true } : item)));
|
|
2695
|
+
}
|
|
2696
|
+
this.layoutService.setUnreadNotificationCount(Math.max(this.layoutService.getUnreadNotificationCount() - 1, 0));
|
|
2697
|
+
}
|
|
2698
|
+
applyAllMarkedAsRead() {
|
|
2699
|
+
if (untracked(this.onlyUnread)) {
|
|
2700
|
+
this.notifications.set([]);
|
|
2701
|
+
this.totalRecords.set(0);
|
|
2702
|
+
}
|
|
2703
|
+
else {
|
|
2704
|
+
this.notifications.update((items) => items.map((item) => (item.read ? item : { ...item, read: true })));
|
|
2705
|
+
}
|
|
2706
|
+
this.layoutService.setUnreadNotificationCount(0);
|
|
2658
2707
|
}
|
|
2659
2708
|
get visible() {
|
|
2660
2709
|
return this.layoutService.state.notificationsSidebarVisible;
|
|
@@ -2662,24 +2711,82 @@ class NotificationsSidebarComponent {
|
|
|
2662
2711
|
set visible(value) {
|
|
2663
2712
|
this.layoutService.state.notificationsSidebarVisible = value;
|
|
2664
2713
|
}
|
|
2714
|
+
onOnlyUnreadChange(value) {
|
|
2715
|
+
this.onlyUnread.set(value);
|
|
2716
|
+
this.pageNumber.set(1);
|
|
2717
|
+
this.notifications.set([]);
|
|
2718
|
+
this.subjects.loadNotifications.next();
|
|
2719
|
+
}
|
|
2720
|
+
onSidebarShow() {
|
|
2721
|
+
this.pageNumber.set(1);
|
|
2722
|
+
this.subjects.loadNotifications.next();
|
|
2723
|
+
}
|
|
2724
|
+
showMore() {
|
|
2725
|
+
this.pageNumber.set(Math.floor(this.notifications().length / this.pageSize) + 1);
|
|
2726
|
+
this.subjects.loadNotifications.next();
|
|
2727
|
+
}
|
|
2728
|
+
toggleMenu(event, menu) {
|
|
2729
|
+
this.menuItems = [
|
|
2730
|
+
...(this.unreadCount > 0 ?
|
|
2731
|
+
[
|
|
2732
|
+
{
|
|
2733
|
+
label: this.translocoService.translate('notifications.markAllAsRead'),
|
|
2734
|
+
icon: 'pi pi-check-circle',
|
|
2735
|
+
command: () => this.subjects.markAllAsRead.next()
|
|
2736
|
+
}
|
|
2737
|
+
]
|
|
2738
|
+
: []),
|
|
2739
|
+
{
|
|
2740
|
+
label: this.translocoService.translate('notifications.allNotificationsPage'),
|
|
2741
|
+
icon: 'pi pi-external-link',
|
|
2742
|
+
command: () => this.navigateToAllNotifications()
|
|
2743
|
+
}
|
|
2744
|
+
];
|
|
2745
|
+
menu.toggle(event);
|
|
2746
|
+
}
|
|
2665
2747
|
markNotificationAsRead(notification) {
|
|
2666
|
-
|
|
2667
|
-
|
|
2668
|
-
this.visible = false;
|
|
2669
|
-
if (notification?.detailNotificationType === DetailNotificationTypeEnum.TODO_ITEM) {
|
|
2670
|
-
this.router.navigate([`mng/todo-tasks/detail/${notification?.referenceId}`]);
|
|
2748
|
+
if (!notification.read) {
|
|
2749
|
+
this.subjects.markAsRead.next(notification.id);
|
|
2671
2750
|
}
|
|
2672
|
-
|
|
2673
|
-
|
|
2751
|
+
}
|
|
2752
|
+
openNotification(notification) {
|
|
2753
|
+
const isTodo = notification.detailNotificationType === DetailNotificationTypeEnum.TODO_ITEM;
|
|
2754
|
+
const isBatch = notification.detailNotificationType === DetailNotificationTypeEnum.BATCH_JOB;
|
|
2755
|
+
if (!isTodo && !isBatch) {
|
|
2756
|
+
return;
|
|
2674
2757
|
}
|
|
2758
|
+
this.markNotificationAsRead(notification);
|
|
2759
|
+
this.visible = false;
|
|
2760
|
+
const route = isTodo ? `mng/todo-tasks/detail/${notification.referenceId}` : `mng/bulk-operations/${notification.referenceId}`;
|
|
2761
|
+
this.router.navigate([route]);
|
|
2675
2762
|
}
|
|
2676
|
-
|
|
2677
|
-
|
|
2678
|
-
|
|
2763
|
+
isNavigable(notification) {
|
|
2764
|
+
return (notification.detailNotificationType === DetailNotificationTypeEnum.TODO_ITEM ||
|
|
2765
|
+
notification.detailNotificationType === DetailNotificationTypeEnum.BATCH_JOB);
|
|
2766
|
+
}
|
|
2767
|
+
getNotificationIcon(notification) {
|
|
2768
|
+
if (notification.detailNotificationType === DetailNotificationTypeEnum.TODO_ITEM) {
|
|
2769
|
+
return solidIcons.faListCheck;
|
|
2770
|
+
}
|
|
2771
|
+
if (notification.detailNotificationType === DetailNotificationTypeEnum.BATCH_JOB) {
|
|
2772
|
+
return solidIcons.faGear;
|
|
2679
2773
|
}
|
|
2774
|
+
if (notification.type === ActivityTypesEnum.SMS) {
|
|
2775
|
+
return regularIcons.faMessage;
|
|
2776
|
+
}
|
|
2777
|
+
return notification.read ? regularIcons.faEnvelopeOpen : regularIcons.faEnvelope;
|
|
2680
2778
|
}
|
|
2681
|
-
|
|
2682
|
-
|
|
2779
|
+
getNotificationIconClass(notification) {
|
|
2780
|
+
if (notification.detailNotificationType === DetailNotificationTypeEnum.TODO_ITEM) {
|
|
2781
|
+
return 'todo';
|
|
2782
|
+
}
|
|
2783
|
+
if (notification.detailNotificationType === DetailNotificationTypeEnum.BATCH_JOB) {
|
|
2784
|
+
return 'batch';
|
|
2785
|
+
}
|
|
2786
|
+
if (notification.type === ActivityTypesEnum.SMS) {
|
|
2787
|
+
return 'sms';
|
|
2788
|
+
}
|
|
2789
|
+
return notification.read ? 'email-read' : 'email-unread';
|
|
2683
2790
|
}
|
|
2684
2791
|
getNotificationTitle(notification) {
|
|
2685
2792
|
return notification.templateTitle || notification.templateCode || '';
|
|
@@ -2731,23 +2838,22 @@ class NotificationsSidebarComponent {
|
|
|
2731
2838
|
this.visible = false;
|
|
2732
2839
|
}
|
|
2733
2840
|
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: NotificationsSidebarComponent, deps: [{ token: LayoutService }, { token: NotificationsService }, { token: i5.TranslocoService }, { token: i1$2.Router }, { token: i1.KeycloakService }], target: i0.ɵɵFactoryTarget.Component }); }
|
|
2734
|
-
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: NotificationsSidebarComponent, isStandalone: true, selector: "app-notifications-sidebar", ngImport: i0, template: "<p-sidebar\r\n\t[(visible)]=\"visible\"\r\n\tposition=\"right\"\r\n\t[transitionOptions]=\"'.3s cubic-bezier(0, 0, 0.2, 1)'\"\r\n\tstyleClass=\"layout-notifications-sidebar w-full sm:w-30rem\"\r\n\t*transloco=\"let t; read: 'notifications'\">\r\n\t<ng-template pTemplate=\"header\">\r\n\t\t<div class=\"flex align-items-center justify-content-between w-full\">\r\n\t\t\t<div class=\"flex align-items-center\">\r\n\t\t\t\t<i class=\"pi pi-bell text-primary text-xl\"></i>\r\n\t\t\t\t<span class=\"font-bold text-lg\">{{ t('title') }}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</ng-template>\r\n\r\n\t<div class=\"notifications-content\">\r\n\t\t@if (notifications().length > 0) {\r\n\t\t\t<div class=\"notifications-list\">\r\n\t\t\t\t<p-scrollPanel [style]=\"{ width: '100%', height: '100%' }\">\r\n\t\t\t\t\t<div class=\"notifications-items\">\r\n\t\t\t\t\t\t@for (notification of notifications(); track trackByNotificationId($index, notification)) {\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tclass=\"notification-item\"\r\n\t\t\t\t\t\t\t\t[class.unread-item]=\"!notification.read\"\r\n\t\t\t\t\t\t\t\t(click)=\"\r\n\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\tnotification?.detailNotificationType === DetailNotificationTypeEnum.TODO_ITEM ||\r\n\t\t\t\t\t\t\t\t\t\tnotification?.detailNotificationType === DetailNotificationTypeEnum.BATCH_JOB\r\n\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\tmarkNotificationAsRead(notification)\r\n\t\t\t\t\t\t\t\t\t:\tnull\r\n\t\t\t\t\t\t\t\t\">\r\n\t\t\t\t\t\t\t\t<div class=\"item-content\">\r\n\t\t\t\t\t\t\t\t\t<div class=\"item-header\">\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"item-title\">\r\n\t\t\t\t\t\t\t\t\t\t\t@if (notification.type === ActivityTypesEnum.SMS) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"notification-icon sms-icon\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<fa-icon [icon]=\"regularIcons.faMessage\" />\r\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t@if (!notification.read) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"notification-icon email-icon unread\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<fa-icon [icon]=\"regularIcons.faEnvelope\" />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"notification-icon email-icon read\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<fa-icon [icon]=\"regularIcons.faEnvelopeOpen\" />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t<p class=\"title-text ml-2\">{{ getNotificationTitle(notification) }}</p>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"notification-date\">{{ formatNotificationDate(notification.sendingDate) }}</span>\r\n\t\t\t\t\t\t\t\t\t\t@if (!notification.read) {\r\n\t\t\t\t\t\t\t\t\t\t\t<fa-icon\r\n\t\t\t\t\t\t\t\t\t\t\t\t[icon]=\"solidIcons.faCircle\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"unread-dot\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"t('markAsRead')\"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"left\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"markNotificationAsReadOnDotIcon(notification); $event.stopPropagation()\">\r\n\t\t\t\t\t\t\t\t\t\t\t</fa-icon>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div class=\"item-meta\"></div>\r\n\t\t\t\t\t\t\t\t\t@if (getNotificationContent(notification)) {\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"item-content-preview\">\r\n\t\t\t\t\t\t\t\t\t\t\t@if (notification.type === ActivityTypesEnum.EMAIL) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<div [innerHTML]=\"notification.content | safe: 'html'\" class=\"html-preview line-clamp-3\"></div>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"text-content\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{ getNotificationContent(notification) }}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</p-scrollPanel>\r\n\t\t\t</div>\r\n\t\t} @else {\r\n\t\t\t<div class=\"empty-state\">\r\n\t\t\t\t<div class=\"empty-content\">\r\n\t\t\t\t\t<i class=\"pi pi-bell empty-icon\"></i>\r\n\t\t\t\t\t<h3 class=\"empty-title\">{{ t('noNotifications') }}</h3>\r\n\t\t\t\t\t<p class=\"empty-message\">{{ t('noNotificationsDescription') }}</p>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t}\r\n\r\n\t\t<div class=\"flex justify-content-center p-2 border-top-1 surface-border\">\r\n\t\t\t<aril-button\r\n\t\t\t\t[label]=\"t('allShow')\"\r\n\t\t\t\ticon=\"EXTERNAL_LINK\"\r\n\t\t\t\tcolor=\"primary\"\r\n\t\t\t\tsize=\"md\"\r\n\t\t\t\t(clickEvent)=\"navigateToAllNotifications()\">\r\n\t\t\t</aril-button>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<p-confirmDialog></p-confirmDialog>\r\n</p-sidebar>\r\n", styles: [":host ::ng-deep .layout-notifications-sidebar .p-sidebar-content{padding:0;background:var(--surface-ground)}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header{background:var(--primary-color);color:var(--primary-color-text);padding:1rem 1.5rem}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header span{font-size:1.1rem;font-weight:600}.notifications-content{display:flex;flex-direction:column;height:100%;background:var(--surface-0)}.add-section{display:flex;align-items:center;gap:.5rem;padding:1rem;border-bottom:1px solid var(--surface-border);background:var(--surface-0)}.notifications-list{flex:1;overflow:hidden}.notifications-items{padding:0}.notification-item{background:transparent;border-bottom:1px solid var(--surface-border);cursor:pointer;transition:background-color .2s ease;position:relative}.notification-item:hover{background:var(--surface-hover)}.notification-item:last-child{border-bottom:none}.notification-item.unread-item{background:var(--surface-50)}.notification-item.unread-item:hover{background:var(--surface-100)}.notification-item.unread-item .title-text{font-weight:500}.item-content{padding:1.125rem 1rem}.item-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.625rem;gap:1rem}.item-title{display:flex;align-items:center;flex:1;min-width:0;gap:.4em}.item-title .notification-icon{width:1.75rem;height:1.75rem;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .2s ease}.item-title .notification-icon fa-icon{font-size:.875rem;transition:all .2s ease}.item-title .notification-icon.email-icon.unread{background-color:#3b82f6;color:#fff;box-shadow:0 1px 4px #00000026}.item-title .notification-icon.email-icon.unread fa-icon{color:#fff}.item-title .notification-icon.email-icon.read{background:var(--surface-200);color:var(--text-color-secondary)}.item-title .notification-icon.email-icon.read fa-icon{color:var(--text-color-secondary)}.item-title .notification-icon.sms-icon{background:linear-gradient(135deg,var(--green-500),var(--green-600));color:#fff;box-shadow:0 2px 8px #22c55e40}.item-title .notification-icon.sms-icon fa-icon{color:#fff}.item-title .title-text{font-weight:500;line-height:1.5;font-size:.975rem;margin:0}.notification-date{font-size:.8rem;color:var(--text-color-secondary);font-weight:500;white-space:nowrap;background:var(--surface-100);padding:.2rem .4rem;border-radius:.25rem}.item-content-preview{margin-top:.625rem;color:var(--text-color-secondary);padding-left:1.5rem;border-left:2px solid var(--surface-200)}.item-content-preview .text-content{font-size:.875rem;line-height:1.5;margin:0;font-style:italic}.item-content-preview .html-preview{font-size:.875rem;line-height:1.5;max-height:75px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3;overflow:hidden;word-break:break-word;white-space:normal;font-style:italic}.empty-state{display:flex;align-items:center;justify-content:center;flex:1;padding:2rem}.empty-state .empty-content{text-align:center}.empty-state .empty-content .empty-icon{font-size:4rem;color:var(--text-color-secondary);opacity:.3;margin-bottom:1rem}.empty-state .empty-content .empty-title{font-size:1.25rem;font-weight:600;color:var(--text-color);margin-bottom:.5rem}.empty-state .empty-content .empty-message{color:var(--text-color-secondary);margin:0}.unread-dot{color:#3b82f6;font-size:.625rem;cursor:pointer;transition:opacity .2s ease;opacity:.8}.unread-dot:hover{opacity:1}@media (max-width: 768px){.layout-notifications-sidebar ::ng-deep .p-sidebar{width:100%!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: SidebarModule }, { kind: "component", type: i6$1.Sidebar, selector: "p-sidebar", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ScrollPanelModule }, { kind: "component", type: i7$1.ScrollPanel, selector: "p-scrollPanel", inputs: ["style", "styleClass", "step"] }, { kind: "ngmodule", type: ConfirmDialogModule }, { kind: "component", type: i8$1.ConfirmDialog, selector: "p-confirmDialog", inputs: ["header", "icon", "message", "style", "styleClass", "maskStyleClass", "acceptIcon", "acceptLabel", "closeAriaLabel", "acceptAriaLabel", "acceptVisible", "rejectIcon", "rejectLabel", "rejectAriaLabel", "rejectVisible", "acceptButtonStyleClass", "rejectButtonStyleClass", "closeOnEscape", "dismissableMask", "blockScroll", "rtl", "closable", "appendTo", "key", "autoZIndex", "baseZIndex", "transitionOptions", "focusTrap", "defaultFocus", "breakpoints", "visible", "position"], outputs: ["onHide"] }, { kind: "ngmodule", type: PaginatorModule }, { kind: "component", type: ButtonComponent, selector: "aril-button:not([click])", inputs: ["label", "loading", "disabled", "raised", "rounded", "text", "outlined", "badge", "size", "icon", "iconPos", "color"], outputs: ["clickEvent"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i5.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "ngmodule", type: BadgeModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i10.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "pipe", type: SafePipe, name: "safe" }] }); }
|
|
2841
|
+
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: NotificationsSidebarComponent, isStandalone: true, selector: "app-notifications-sidebar", ngImport: i0, template: "<p-sidebar\r\n\t[(visible)]=\"visible\"\r\n\tposition=\"right\"\r\n\t[transitionOptions]=\"'.3s cubic-bezier(0, 0, 0.2, 1)'\"\r\n\tstyleClass=\"layout-notifications-sidebar w-full sm:w-30rem\"\r\n\t(onShow)=\"onSidebarShow()\"\r\n\t*transloco=\"let t; read: 'notifications'\">\r\n\t<ng-template pTemplate=\"header\">\r\n\t\t<div class=\"flex align-items-center justify-content-between w-full\">\r\n\t\t\t<div class=\"flex align-items-center gap-2\">\r\n\t\t\t\t<i class=\"pi pi-bell text-xl\"></i>\r\n\t\t\t\t<span class=\"font-bold text-lg\">{{ t('title') }}</span>\r\n\t\t\t\t@if (unreadCount > 0) {\r\n\t\t\t\t\t<span class=\"unread-count-chip\">{{ unreadCount }}</span>\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t\t<div class=\"flex align-items-center gap-2 header-actions\">\r\n\t\t\t\t<span class=\"only-unread-label\">{{ t('onlyUnread') }}</span>\r\n\t\t\t\t<aril-switch [ngModel]=\"onlyUnread()\" (ngModelChange)=\"onOnlyUnreadChange($event)\"></aril-switch>\r\n\t\t\t\t<i class=\"pi pi-ellipsis-v header-menu-icon\" (click)=\"toggleMenu($event, headerMenu)\"></i>\r\n\t\t\t\t<p-menu #headerMenu [popup]=\"true\" [model]=\"menuItems\" appendTo=\"body\"></p-menu>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</ng-template>\r\n\r\n\t<div class=\"notifications-content\">\r\n\t\t@if (notifications().length > 0) {\r\n\t\t\t<div class=\"notifications-list\">\r\n\t\t\t\t<div class=\"notifications-items\">\r\n\t\t\t\t\t@for (notification of notifications(); track notification.id) {\r\n\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\tclass=\"notification-item\"\r\n\t\t\t\t\t\t\t[class.unread-item]=\"!notification.read\"\r\n\t\t\t\t\t\t\t[class.navigable]=\"isNavigable(notification)\"\r\n\t\t\t\t\t\t\t(click)=\"openNotification(notification)\">\r\n\t\t\t\t\t\t\t<div class=\"notification-icon\" [ngClass]=\"getNotificationIconClass(notification)\">\r\n\t\t\t\t\t\t\t\t<fa-icon [icon]=\"getNotificationIcon(notification)\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class=\"item-body\">\r\n\t\t\t\t\t\t\t\t<div class=\"item-header\">\r\n\t\t\t\t\t\t\t\t\t<p class=\"item-title\">{{ getNotificationTitle(notification) }}</p>\r\n\t\t\t\t\t\t\t\t\t<span class=\"item-time\">{{ formatNotificationDate(notification.sendingDate) }}</span>\r\n\t\t\t\t\t\t\t\t\t@if (!notification.read) {\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"item-actions\">\r\n\t\t\t\t\t\t\t\t\t\t\t<fa-icon\r\n\t\t\t\t\t\t\t\t\t\t\t\t[icon]=\"solidIcons.faCircle\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"unread-dot\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"t('markAsRead')\"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"left\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"markNotificationAsRead(notification); $event.stopPropagation()\">\r\n\t\t\t\t\t\t\t\t\t\t\t</fa-icon>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"mark-read-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"t('markAsRead')\"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"left\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"markNotificationAsRead(notification); $event.stopPropagation()\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"pi pi-check\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t@if (getNotificationContent(notification)) {\r\n\t\t\t\t\t\t\t\t\t@if (notification.type === ActivityTypesEnum.EMAIL) {\r\n\t\t\t\t\t\t\t\t\t\t<div [innerHTML]=\"notification.content | safe: 'html'\" class=\"item-preview html-preview\"></div>\r\n\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t<p class=\"item-preview\">{{ getNotificationContent(notification) }}</p>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (notification.detailNotificationType === DetailNotificationTypeEnum.TODO_ITEM) {\r\n\t\t\t\t\t\t\t\t\t<span class=\"nav-chip\">{{ t('goToTaskDetail') }} <i class=\"pi pi-arrow-right\"></i></span>\r\n\t\t\t\t\t\t\t\t} @else if (notification.detailNotificationType === DetailNotificationTypeEnum.BATCH_JOB) {\r\n\t\t\t\t\t\t\t\t\t<span class=\"nav-chip\">{{ t('goToBulkOperations') }} <i class=\"pi pi-arrow-right\"></i></span>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t}\r\n\t\t\t\t\t@if (remainingCount() > 0) {\r\n\t\t\t\t\t\t<div class=\"show-more\">\r\n\t\t\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\t\t\t[label]=\"t('showMore', { count: remainingCount() })\"\r\n\t\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\t\tsize=\"sm\"\r\n\t\t\t\t\t\t\t\t[outlined]=\"true\"\r\n\t\t\t\t\t\t\t\t[loading]=\"loading\"\r\n\t\t\t\t\t\t\t\t(clickEvent)=\"showMore()\">\r\n\t\t\t\t\t\t\t</aril-button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t} @else if (!loading) {\r\n\t\t\t<div class=\"empty-state\">\r\n\t\t\t\t<div class=\"empty-content\">\r\n\t\t\t\t\t<i class=\"pi pi-bell empty-icon\"></i>\r\n\t\t\t\t\t<h3 class=\"empty-title\">{{ t('noNotifications') }}</h3>\r\n\t\t\t\t\t<p class=\"empty-message\">{{ t('noNotificationsDescription') }}</p>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t}\r\n\t</div>\r\n</p-sidebar>\r\n", styles: [":host ::ng-deep .layout-notifications-sidebar .p-sidebar-content{padding:0;background:var(--surface-ground)}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header{background:var(--primary-color);color:var(--primary-color-text);padding:1rem 1.5rem}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header span{font-size:1.1rem;font-weight:600}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header .p-sidebar-close{color:var(--primary-color-text)}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header .p-sidebar-close:enabled:hover{background:#ffffff26;color:var(--primary-color-text)}:host ::ng-deep .layout-notifications-sidebar .header-actions .p-inputswitch{transform:scale(.8)}:host ::ng-deep .layout-notifications-sidebar .header-actions .p-inputswitch .p-inputswitch-slider{background:#ffffff4d}:host ::ng-deep .layout-notifications-sidebar .header-actions .p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{background:var(--green-500)}:host ::ng-deep .layout-notifications-sidebar .header-actions .p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider{background:var(--green-600)}:host ::ng-deep .layout-notifications-sidebar .header-actions .only-unread-label{font-size:.78rem;font-weight:500}:host ::ng-deep .item-preview.html-preview *{font-family:inherit!important;font-size:inherit!important;font-weight:inherit!important;font-style:inherit!important;color:inherit!important;line-height:inherit!important;letter-spacing:inherit!important;text-align:left!important;margin:0!important;padding:0!important;border:none!important;background:transparent!important;display:inline!important}:host ::ng-deep .item-preview.html-preview p:after,:host ::ng-deep .item-preview.html-preview div:after,:host ::ng-deep .item-preview.html-preview li:after{content:\" \"}:host ::ng-deep .item-preview.html-preview img,:host ::ng-deep .item-preview.html-preview table,:host ::ng-deep .item-preview.html-preview hr,:host ::ng-deep .item-preview.html-preview br{display:none!important}.notifications-content{display:flex;flex-direction:column;height:100%;background:var(--surface-ground)}.unread-count-chip{background:#ffffff40;border-radius:999px;font-size:.72rem!important;font-weight:600!important;padding:.1rem .55rem}.header-menu-icon{cursor:pointer;font-size:1.1rem;padding:.25rem;color:var(--primary-color-text);border-radius:6px;transition:background-color .15s ease}.header-menu-icon:hover{background:#ffffff26}.notifications-list{flex:1;overflow-y:auto}.notifications-items{display:flex;flex-direction:column;gap:.625rem;padding:.75rem}.notification-item{display:flex;gap:.75rem;padding:.875rem 1rem .875rem calc(1rem + 4px);background:var(--surface-card);border:1px solid var(--surface-border);border-radius:8px;transition:background-color .2s ease,border-color .2s ease}.notification-item:hover{background:var(--surface-hover)}.notification-item:hover .unread-dot{display:none}.notification-item:hover .mark-read-action{display:flex}.notification-item.navigable{cursor:pointer}.notification-item.unread-item{border-left-width:5px;border-left-color:var(--primary-color);padding-left:1rem}.notification-item.unread-item .item-title{font-weight:600;color:var(--text-color)}.notification-icon{width:2.25rem;height:2.25rem;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}.notification-icon fa-icon{font-size:.9rem}.notification-icon.todo{background:var(--purple-100);color:var(--purple-600)}.notification-icon.batch{background:var(--orange-100);color:var(--orange-600)}.notification-icon.sms{background:var(--green-100);color:var(--green-600)}.notification-icon.email-unread{background:var(--blue-100);color:var(--blue-600)}.notification-icon.email-read{background:var(--surface-200);color:var(--text-color-secondary)}.item-body{flex:1;min-width:0}.item-header{display:flex;align-items:center;gap:.5rem;margin-bottom:.3rem;min-height:1.5rem}.item-title{flex:1;min-width:0;margin:0;font-size:.875rem;font-weight:500;color:var(--text-color-secondary);line-height:1.4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.item-time{font-size:.72rem;color:var(--text-color-secondary);white-space:nowrap}.item-actions{display:inline-flex;align-items:center;justify-content:center;width:1.5rem;flex-shrink:0}.unread-dot{color:var(--primary-color);font-size:.5rem;cursor:pointer;opacity:.85}.unread-dot:hover{opacity:1}.mark-read-action{display:none;width:1.5rem;height:1.5rem;border-radius:6px;border:1px solid var(--surface-border);background:var(--surface-card);color:var(--text-color-secondary);align-items:center;justify-content:center;cursor:pointer;padding:0}.mark-read-action:hover{color:var(--primary-color);border-color:var(--primary-color)}.mark-read-action i{font-size:.7rem}.item-preview{margin:0;font-size:.8rem;color:var(--text-color-secondary);line-height:1.5;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;word-break:break-word;white-space:normal}.nav-chip{display:inline-flex;align-items:center;gap:.3rem;margin-top:.4rem;font-size:.75rem;font-weight:600;color:var(--primary-color)}.nav-chip i{font-size:.65rem}.notification-item.navigable:hover .nav-chip{text-decoration:underline}.show-more{display:flex;justify-content:center;padding:.25rem 0 .5rem}.empty-state{display:flex;align-items:center;justify-content:center;flex:1;padding:2rem}.empty-state .empty-content{text-align:center}.empty-state .empty-content .empty-icon{font-size:4rem;color:var(--text-color-secondary);opacity:.3;margin-bottom:1rem}.empty-state .empty-content .empty-title{font-size:1.25rem;font-weight:600;color:var(--text-color);margin-bottom:.5rem}.empty-state .empty-content .empty-message{color:var(--text-color-secondary);margin:0}@media (max-width: 768px){.layout-notifications-sidebar ::ng-deep .p-sidebar{width:100%!important}}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "directive", type: i3$1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$1.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SidebarModule }, { kind: "component", type: i6$1.Sidebar, selector: "p-sidebar", inputs: ["appendTo", "blockScroll", "style", "styleClass", "ariaCloseLabel", "autoZIndex", "baseZIndex", "modal", "dismissible", "showCloseIcon", "closeOnEscape", "transitionOptions", "visible", "position", "fullScreen"], outputs: ["onShow", "onHide", "visibleChange"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: MenuModule }, { kind: "component", type: i10$2.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "appendTo", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "directive", type: i8.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }, { kind: "component", type: ButtonComponent, selector: "aril-button:not([click])", inputs: ["label", "loading", "disabled", "raised", "rounded", "text", "outlined", "badge", "size", "icon", "iconPos", "color"], outputs: ["clickEvent"] }, { kind: "component", type: SwitchComponent, selector: "aril-switch[ngModel], aril-switch[formControl], aril-switch[formControlName]", inputs: ["tabindex"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i5.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoLang", "translocoLoadingTpl"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "ngmodule", type: FontAwesomeModule }, { kind: "component", type: i10.FaIconComponent, selector: "fa-icon", inputs: ["icon", "title", "animation", "spin", "pulse", "mask", "styles", "flip", "size", "pull", "border", "inverse", "symbol", "rotate", "fixedWidth", "classes", "transform", "a11yRole"] }, { kind: "pipe", type: SafePipe, name: "safe" }] }); }
|
|
2735
2842
|
}
|
|
2736
2843
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: NotificationsSidebarComponent, decorators: [{
|
|
2737
2844
|
type: Component,
|
|
2738
2845
|
args: [{ standalone: true, selector: 'app-notifications-sidebar', imports: [
|
|
2739
2846
|
CommonModule,
|
|
2847
|
+
FormsModule,
|
|
2740
2848
|
SidebarModule,
|
|
2741
|
-
|
|
2742
|
-
ConfirmDialogModule,
|
|
2743
|
-
PaginatorModule,
|
|
2849
|
+
MenuModule,
|
|
2744
2850
|
ButtonComponent,
|
|
2851
|
+
SwitchComponent,
|
|
2745
2852
|
TranslocoModule,
|
|
2746
2853
|
TooltipModule,
|
|
2747
|
-
BadgeModule,
|
|
2748
2854
|
FontAwesomeModule,
|
|
2749
2855
|
SafePipe
|
|
2750
|
-
], template: "<p-sidebar\r\n\t[(visible)]=\"visible\"\r\n\tposition=\"right\"\r\n\t[transitionOptions]=\"'.3s cubic-bezier(0, 0, 0.2, 1)'\"\r\n\tstyleClass=\"layout-notifications-sidebar w-full sm:w-30rem\"\r\n\t*transloco=\"let t; read: 'notifications'\">\r\n\t<ng-template pTemplate=\"header\">\r\n\t\t<div class=\"flex align-items-center justify-content-between w-full\">\r\n\t\t\t<div class=\"flex align-items-center\">\r\n\t\t\t\t<i class=\"pi pi-bell text-primary text-xl\"></i>\r\n\t\t\t\t<span class=\"font-bold text-lg\">{{ t('title') }}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</ng-template>\r\n\r\n\t<div class=\"notifications-content\">\r\n\t\t@if (notifications().length > 0) {\r\n\t\t\t<div class=\"notifications-list\">\r\n\t\t\t\t<p-scrollPanel [style]=\"{ width: '100%', height: '100%' }\">\r\n\t\t\t\t\t<div class=\"notifications-items\">\r\n\t\t\t\t\t\t@for (notification of notifications(); track trackByNotificationId($index, notification)) {\r\n\t\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\t\tclass=\"notification-item\"\r\n\t\t\t\t\t\t\t\t[class.unread-item]=\"!notification.read\"\r\n\t\t\t\t\t\t\t\t(click)=\"\r\n\t\t\t\t\t\t\t\t\t(\r\n\t\t\t\t\t\t\t\t\t\tnotification?.detailNotificationType === DetailNotificationTypeEnum.TODO_ITEM ||\r\n\t\t\t\t\t\t\t\t\t\tnotification?.detailNotificationType === DetailNotificationTypeEnum.BATCH_JOB\r\n\t\t\t\t\t\t\t\t\t) ?\r\n\t\t\t\t\t\t\t\t\t\tmarkNotificationAsRead(notification)\r\n\t\t\t\t\t\t\t\t\t:\tnull\r\n\t\t\t\t\t\t\t\t\">\r\n\t\t\t\t\t\t\t\t<div class=\"item-content\">\r\n\t\t\t\t\t\t\t\t\t<div class=\"item-header\">\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"item-title\">\r\n\t\t\t\t\t\t\t\t\t\t\t@if (notification.type === ActivityTypesEnum.SMS) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"notification-icon sms-icon\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<fa-icon [icon]=\"regularIcons.faMessage\" />\r\n\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t@if (!notification.read) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"notification-icon email-icon unread\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<fa-icon [icon]=\"regularIcons.faEnvelope\" />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t<div class=\"notification-icon email-icon read\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t<fa-icon [icon]=\"regularIcons.faEnvelopeOpen\" />\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t\t<p class=\"title-text ml-2\">{{ getNotificationTitle(notification) }}</p>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"notification-date\">{{ formatNotificationDate(notification.sendingDate) }}</span>\r\n\t\t\t\t\t\t\t\t\t\t@if (!notification.read) {\r\n\t\t\t\t\t\t\t\t\t\t\t<fa-icon\r\n\t\t\t\t\t\t\t\t\t\t\t\t[icon]=\"solidIcons.faCircle\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"unread-dot\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"t('markAsRead')\"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"left\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"markNotificationAsReadOnDotIcon(notification); $event.stopPropagation()\">\r\n\t\t\t\t\t\t\t\t\t\t\t</fa-icon>\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t<div class=\"item-meta\"></div>\r\n\t\t\t\t\t\t\t\t\t@if (getNotificationContent(notification)) {\r\n\t\t\t\t\t\t\t\t\t\t<div class=\"item-content-preview\">\r\n\t\t\t\t\t\t\t\t\t\t\t@if (notification.type === ActivityTypesEnum.EMAIL) {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<div [innerHTML]=\"notification.content | safe: 'html'\" class=\"html-preview line-clamp-3\"></div>\r\n\t\t\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t\t\t<p class=\"text-content\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t{{ getNotificationContent(notification) }}\r\n\t\t\t\t\t\t\t\t\t\t\t\t</p>\r\n\t\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t</div>\r\n\t\t\t\t</p-scrollPanel>\r\n\t\t\t</div>\r\n\t\t} @else {\r\n\t\t\t<div class=\"empty-state\">\r\n\t\t\t\t<div class=\"empty-content\">\r\n\t\t\t\t\t<i class=\"pi pi-bell empty-icon\"></i>\r\n\t\t\t\t\t<h3 class=\"empty-title\">{{ t('noNotifications') }}</h3>\r\n\t\t\t\t\t<p class=\"empty-message\">{{ t('noNotificationsDescription') }}</p>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t}\r\n\r\n\t\t<div class=\"flex justify-content-center p-2 border-top-1 surface-border\">\r\n\t\t\t<aril-button\r\n\t\t\t\t[label]=\"t('allShow')\"\r\n\t\t\t\ticon=\"EXTERNAL_LINK\"\r\n\t\t\t\tcolor=\"primary\"\r\n\t\t\t\tsize=\"md\"\r\n\t\t\t\t(clickEvent)=\"navigateToAllNotifications()\">\r\n\t\t\t</aril-button>\r\n\t\t</div>\r\n\t</div>\r\n\r\n\t<p-confirmDialog></p-confirmDialog>\r\n</p-sidebar>\r\n", styles: [":host ::ng-deep .layout-notifications-sidebar .p-sidebar-content{padding:0;background:var(--surface-ground)}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header{background:var(--primary-color);color:var(--primary-color-text);padding:1rem 1.5rem}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header span{font-size:1.1rem;font-weight:600}.notifications-content{display:flex;flex-direction:column;height:100%;background:var(--surface-0)}.add-section{display:flex;align-items:center;gap:.5rem;padding:1rem;border-bottom:1px solid var(--surface-border);background:var(--surface-0)}.notifications-list{flex:1;overflow:hidden}.notifications-items{padding:0}.notification-item{background:transparent;border-bottom:1px solid var(--surface-border);cursor:pointer;transition:background-color .2s ease;position:relative}.notification-item:hover{background:var(--surface-hover)}.notification-item:last-child{border-bottom:none}.notification-item.unread-item{background:var(--surface-50)}.notification-item.unread-item:hover{background:var(--surface-100)}.notification-item.unread-item .title-text{font-weight:500}.item-content{padding:1.125rem 1rem}.item-header{display:flex;align-items:center;justify-content:space-between;margin-bottom:.625rem;gap:1rem}.item-title{display:flex;align-items:center;flex:1;min-width:0;gap:.4em}.item-title .notification-icon{width:1.75rem;height:1.75rem;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0;transition:all .2s ease}.item-title .notification-icon fa-icon{font-size:.875rem;transition:all .2s ease}.item-title .notification-icon.email-icon.unread{background-color:#3b82f6;color:#fff;box-shadow:0 1px 4px #00000026}.item-title .notification-icon.email-icon.unread fa-icon{color:#fff}.item-title .notification-icon.email-icon.read{background:var(--surface-200);color:var(--text-color-secondary)}.item-title .notification-icon.email-icon.read fa-icon{color:var(--text-color-secondary)}.item-title .notification-icon.sms-icon{background:linear-gradient(135deg,var(--green-500),var(--green-600));color:#fff;box-shadow:0 2px 8px #22c55e40}.item-title .notification-icon.sms-icon fa-icon{color:#fff}.item-title .title-text{font-weight:500;line-height:1.5;font-size:.975rem;margin:0}.notification-date{font-size:.8rem;color:var(--text-color-secondary);font-weight:500;white-space:nowrap;background:var(--surface-100);padding:.2rem .4rem;border-radius:.25rem}.item-content-preview{margin-top:.625rem;color:var(--text-color-secondary);padding-left:1.5rem;border-left:2px solid var(--surface-200)}.item-content-preview .text-content{font-size:.875rem;line-height:1.5;margin:0;font-style:italic}.item-content-preview .html-preview{font-size:.875rem;line-height:1.5;max-height:75px;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:3;line-clamp:3;overflow:hidden;word-break:break-word;white-space:normal;font-style:italic}.empty-state{display:flex;align-items:center;justify-content:center;flex:1;padding:2rem}.empty-state .empty-content{text-align:center}.empty-state .empty-content .empty-icon{font-size:4rem;color:var(--text-color-secondary);opacity:.3;margin-bottom:1rem}.empty-state .empty-content .empty-title{font-size:1.25rem;font-weight:600;color:var(--text-color);margin-bottom:.5rem}.empty-state .empty-content .empty-message{color:var(--text-color-secondary);margin:0}.unread-dot{color:#3b82f6;font-size:.625rem;cursor:pointer;transition:opacity .2s ease;opacity:.8}.unread-dot:hover{opacity:1}@media (max-width: 768px){.layout-notifications-sidebar ::ng-deep .p-sidebar{width:100%!important}}\n"] }]
|
|
2856
|
+
], template: "<p-sidebar\r\n\t[(visible)]=\"visible\"\r\n\tposition=\"right\"\r\n\t[transitionOptions]=\"'.3s cubic-bezier(0, 0, 0.2, 1)'\"\r\n\tstyleClass=\"layout-notifications-sidebar w-full sm:w-30rem\"\r\n\t(onShow)=\"onSidebarShow()\"\r\n\t*transloco=\"let t; read: 'notifications'\">\r\n\t<ng-template pTemplate=\"header\">\r\n\t\t<div class=\"flex align-items-center justify-content-between w-full\">\r\n\t\t\t<div class=\"flex align-items-center gap-2\">\r\n\t\t\t\t<i class=\"pi pi-bell text-xl\"></i>\r\n\t\t\t\t<span class=\"font-bold text-lg\">{{ t('title') }}</span>\r\n\t\t\t\t@if (unreadCount > 0) {\r\n\t\t\t\t\t<span class=\"unread-count-chip\">{{ unreadCount }}</span>\r\n\t\t\t\t}\r\n\t\t\t</div>\r\n\t\t\t<div class=\"flex align-items-center gap-2 header-actions\">\r\n\t\t\t\t<span class=\"only-unread-label\">{{ t('onlyUnread') }}</span>\r\n\t\t\t\t<aril-switch [ngModel]=\"onlyUnread()\" (ngModelChange)=\"onOnlyUnreadChange($event)\"></aril-switch>\r\n\t\t\t\t<i class=\"pi pi-ellipsis-v header-menu-icon\" (click)=\"toggleMenu($event, headerMenu)\"></i>\r\n\t\t\t\t<p-menu #headerMenu [popup]=\"true\" [model]=\"menuItems\" appendTo=\"body\"></p-menu>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</ng-template>\r\n\r\n\t<div class=\"notifications-content\">\r\n\t\t@if (notifications().length > 0) {\r\n\t\t\t<div class=\"notifications-list\">\r\n\t\t\t\t<div class=\"notifications-items\">\r\n\t\t\t\t\t@for (notification of notifications(); track notification.id) {\r\n\t\t\t\t\t\t<div\r\n\t\t\t\t\t\t\tclass=\"notification-item\"\r\n\t\t\t\t\t\t\t[class.unread-item]=\"!notification.read\"\r\n\t\t\t\t\t\t\t[class.navigable]=\"isNavigable(notification)\"\r\n\t\t\t\t\t\t\t(click)=\"openNotification(notification)\">\r\n\t\t\t\t\t\t\t<div class=\"notification-icon\" [ngClass]=\"getNotificationIconClass(notification)\">\r\n\t\t\t\t\t\t\t\t<fa-icon [icon]=\"getNotificationIcon(notification)\" />\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t<div class=\"item-body\">\r\n\t\t\t\t\t\t\t\t<div class=\"item-header\">\r\n\t\t\t\t\t\t\t\t\t<p class=\"item-title\">{{ getNotificationTitle(notification) }}</p>\r\n\t\t\t\t\t\t\t\t\t<span class=\"item-time\">{{ formatNotificationDate(notification.sendingDate) }}</span>\r\n\t\t\t\t\t\t\t\t\t@if (!notification.read) {\r\n\t\t\t\t\t\t\t\t\t\t<span class=\"item-actions\">\r\n\t\t\t\t\t\t\t\t\t\t\t<fa-icon\r\n\t\t\t\t\t\t\t\t\t\t\t\t[icon]=\"solidIcons.faCircle\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"unread-dot\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"t('markAsRead')\"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"left\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"markNotificationAsRead(notification); $event.stopPropagation()\">\r\n\t\t\t\t\t\t\t\t\t\t\t</fa-icon>\r\n\t\t\t\t\t\t\t\t\t\t\t<button\r\n\t\t\t\t\t\t\t\t\t\t\t\ttype=\"button\"\r\n\t\t\t\t\t\t\t\t\t\t\t\tclass=\"mark-read-action\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t[pTooltip]=\"t('markAsRead')\"\r\n\t\t\t\t\t\t\t\t\t\t\t\ttooltipPosition=\"left\"\r\n\t\t\t\t\t\t\t\t\t\t\t\t(click)=\"markNotificationAsRead(notification); $event.stopPropagation()\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<i class=\"pi pi-check\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t</button>\r\n\t\t\t\t\t\t\t\t\t\t</span>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t@if (getNotificationContent(notification)) {\r\n\t\t\t\t\t\t\t\t\t@if (notification.type === ActivityTypesEnum.EMAIL) {\r\n\t\t\t\t\t\t\t\t\t\t<div [innerHTML]=\"notification.content | safe: 'html'\" class=\"item-preview html-preview\"></div>\r\n\t\t\t\t\t\t\t\t\t} @else {\r\n\t\t\t\t\t\t\t\t\t\t<p class=\"item-preview\">{{ getNotificationContent(notification) }}</p>\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t@if (notification.detailNotificationType === DetailNotificationTypeEnum.TODO_ITEM) {\r\n\t\t\t\t\t\t\t\t\t<span class=\"nav-chip\">{{ t('goToTaskDetail') }} <i class=\"pi pi-arrow-right\"></i></span>\r\n\t\t\t\t\t\t\t\t} @else if (notification.detailNotificationType === DetailNotificationTypeEnum.BATCH_JOB) {\r\n\t\t\t\t\t\t\t\t\t<span class=\"nav-chip\">{{ t('goToBulkOperations') }} <i class=\"pi pi-arrow-right\"></i></span>\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t}\r\n\t\t\t\t\t@if (remainingCount() > 0) {\r\n\t\t\t\t\t\t<div class=\"show-more\">\r\n\t\t\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\t\t\t[label]=\"t('showMore', { count: remainingCount() })\"\r\n\t\t\t\t\t\t\t\tcolor=\"primary\"\r\n\t\t\t\t\t\t\t\tsize=\"sm\"\r\n\t\t\t\t\t\t\t\t[outlined]=\"true\"\r\n\t\t\t\t\t\t\t\t[loading]=\"loading\"\r\n\t\t\t\t\t\t\t\t(clickEvent)=\"showMore()\">\r\n\t\t\t\t\t\t\t</aril-button>\r\n\t\t\t\t\t\t</div>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t} @else if (!loading) {\r\n\t\t\t<div class=\"empty-state\">\r\n\t\t\t\t<div class=\"empty-content\">\r\n\t\t\t\t\t<i class=\"pi pi-bell empty-icon\"></i>\r\n\t\t\t\t\t<h3 class=\"empty-title\">{{ t('noNotifications') }}</h3>\r\n\t\t\t\t\t<p class=\"empty-message\">{{ t('noNotificationsDescription') }}</p>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t}\r\n\t</div>\r\n</p-sidebar>\r\n", styles: [":host ::ng-deep .layout-notifications-sidebar .p-sidebar-content{padding:0;background:var(--surface-ground)}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header{background:var(--primary-color);color:var(--primary-color-text);padding:1rem 1.5rem}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header span{font-size:1.1rem;font-weight:600}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header .p-sidebar-close{color:var(--primary-color-text)}:host ::ng-deep .layout-notifications-sidebar .p-sidebar-header .p-sidebar-close:enabled:hover{background:#ffffff26;color:var(--primary-color-text)}:host ::ng-deep .layout-notifications-sidebar .header-actions .p-inputswitch{transform:scale(.8)}:host ::ng-deep .layout-notifications-sidebar .header-actions .p-inputswitch .p-inputswitch-slider{background:#ffffff4d}:host ::ng-deep .layout-notifications-sidebar .header-actions .p-inputswitch.p-inputswitch-checked .p-inputswitch-slider{background:var(--green-500)}:host ::ng-deep .layout-notifications-sidebar .header-actions .p-inputswitch.p-inputswitch-checked:not(.p-disabled):hover .p-inputswitch-slider{background:var(--green-600)}:host ::ng-deep .layout-notifications-sidebar .header-actions .only-unread-label{font-size:.78rem;font-weight:500}:host ::ng-deep .item-preview.html-preview *{font-family:inherit!important;font-size:inherit!important;font-weight:inherit!important;font-style:inherit!important;color:inherit!important;line-height:inherit!important;letter-spacing:inherit!important;text-align:left!important;margin:0!important;padding:0!important;border:none!important;background:transparent!important;display:inline!important}:host ::ng-deep .item-preview.html-preview p:after,:host ::ng-deep .item-preview.html-preview div:after,:host ::ng-deep .item-preview.html-preview li:after{content:\" \"}:host ::ng-deep .item-preview.html-preview img,:host ::ng-deep .item-preview.html-preview table,:host ::ng-deep .item-preview.html-preview hr,:host ::ng-deep .item-preview.html-preview br{display:none!important}.notifications-content{display:flex;flex-direction:column;height:100%;background:var(--surface-ground)}.unread-count-chip{background:#ffffff40;border-radius:999px;font-size:.72rem!important;font-weight:600!important;padding:.1rem .55rem}.header-menu-icon{cursor:pointer;font-size:1.1rem;padding:.25rem;color:var(--primary-color-text);border-radius:6px;transition:background-color .15s ease}.header-menu-icon:hover{background:#ffffff26}.notifications-list{flex:1;overflow-y:auto}.notifications-items{display:flex;flex-direction:column;gap:.625rem;padding:.75rem}.notification-item{display:flex;gap:.75rem;padding:.875rem 1rem .875rem calc(1rem + 4px);background:var(--surface-card);border:1px solid var(--surface-border);border-radius:8px;transition:background-color .2s ease,border-color .2s ease}.notification-item:hover{background:var(--surface-hover)}.notification-item:hover .unread-dot{display:none}.notification-item:hover .mark-read-action{display:flex}.notification-item.navigable{cursor:pointer}.notification-item.unread-item{border-left-width:5px;border-left-color:var(--primary-color);padding-left:1rem}.notification-item.unread-item .item-title{font-weight:600;color:var(--text-color)}.notification-icon{width:2.25rem;height:2.25rem;border-radius:50%;display:flex;align-items:center;justify-content:center;flex-shrink:0}.notification-icon fa-icon{font-size:.9rem}.notification-icon.todo{background:var(--purple-100);color:var(--purple-600)}.notification-icon.batch{background:var(--orange-100);color:var(--orange-600)}.notification-icon.sms{background:var(--green-100);color:var(--green-600)}.notification-icon.email-unread{background:var(--blue-100);color:var(--blue-600)}.notification-icon.email-read{background:var(--surface-200);color:var(--text-color-secondary)}.item-body{flex:1;min-width:0}.item-header{display:flex;align-items:center;gap:.5rem;margin-bottom:.3rem;min-height:1.5rem}.item-title{flex:1;min-width:0;margin:0;font-size:.875rem;font-weight:500;color:var(--text-color-secondary);line-height:1.4;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.item-time{font-size:.72rem;color:var(--text-color-secondary);white-space:nowrap}.item-actions{display:inline-flex;align-items:center;justify-content:center;width:1.5rem;flex-shrink:0}.unread-dot{color:var(--primary-color);font-size:.5rem;cursor:pointer;opacity:.85}.unread-dot:hover{opacity:1}.mark-read-action{display:none;width:1.5rem;height:1.5rem;border-radius:6px;border:1px solid var(--surface-border);background:var(--surface-card);color:var(--text-color-secondary);align-items:center;justify-content:center;cursor:pointer;padding:0}.mark-read-action:hover{color:var(--primary-color);border-color:var(--primary-color)}.mark-read-action i{font-size:.7rem}.item-preview{margin:0;font-size:.8rem;color:var(--text-color-secondary);line-height:1.5;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;line-clamp:2;overflow:hidden;word-break:break-word;white-space:normal}.nav-chip{display:inline-flex;align-items:center;gap:.3rem;margin-top:.4rem;font-size:.75rem;font-weight:600;color:var(--primary-color)}.nav-chip i{font-size:.65rem}.notification-item.navigable:hover .nav-chip{text-decoration:underline}.show-more{display:flex;justify-content:center;padding:.25rem 0 .5rem}.empty-state{display:flex;align-items:center;justify-content:center;flex:1;padding:2rem}.empty-state .empty-content{text-align:center}.empty-state .empty-content .empty-icon{font-size:4rem;color:var(--text-color-secondary);opacity:.3;margin-bottom:1rem}.empty-state .empty-content .empty-title{font-size:1.25rem;font-weight:600;color:var(--text-color);margin-bottom:.5rem}.empty-state .empty-content .empty-message{color:var(--text-color-secondary);margin:0}@media (max-width: 768px){.layout-notifications-sidebar ::ng-deep .p-sidebar{width:100%!important}}\n"] }]
|
|
2751
2857
|
}], ctorParameters: () => [{ type: LayoutService }, { type: NotificationsService }, { type: i5.TranslocoService }, { type: i1$2.Router }, { type: i1.KeycloakService }] });
|
|
2752
2858
|
|
|
2753
2859
|
class AppLayoutComponent {
|