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.
Files changed (43) hide show
  1. package/boot/config/api/src/api.service.d.ts +2 -1
  2. package/esm2022/boot/config/api/src/api.service.mjs +24 -7
  3. package/esm2022/boot/host/src/bootstrap.mjs +13 -4
  4. package/esm2022/permission/aril-permission.mjs +5 -0
  5. package/esm2022/permission/index.mjs +4 -0
  6. package/esm2022/permission/src/constants.mjs +4 -0
  7. package/esm2022/permission/src/has-permission.directive.mjs +49 -0
  8. package/esm2022/permission/src/permission.service.mjs +57 -0
  9. package/esm2022/provider/src/index.mjs +2 -1
  10. package/esm2022/provider/src/prodiveHost.mjs +3 -2
  11. package/esm2022/provider/src/provideHostPermissions.mjs +43 -0
  12. package/esm2022/theme/layout/app/notifications/notifications-sidebar.component.mjs +146 -49
  13. package/esm2022/theme/layout/service/interfaces/interfaces.mjs +1 -1
  14. package/esm2022/theme/layout/service/notifications.service.mjs +8 -2
  15. package/fesm2022/{aril-app.component-W3wwVSp1.mjs → aril-app.component-BUjucZ0J.mjs} +2 -1
  16. package/fesm2022/{aril-app.component-W3wwVSp1.mjs.map → aril-app.component-BUjucZ0J.mjs.map} +1 -1
  17. package/fesm2022/aril-boot-config-api.mjs +23 -6
  18. package/fesm2022/aril-boot-config-api.mjs.map +1 -1
  19. package/fesm2022/aril-boot-host.mjs +12 -3
  20. package/fesm2022/aril-boot-host.mjs.map +1 -1
  21. package/fesm2022/aril-permission.mjs +114 -0
  22. package/fesm2022/aril-permission.mjs.map +1 -0
  23. package/fesm2022/aril-provider.mjs +44 -2
  24. package/fesm2022/aril-provider.mjs.map +1 -1
  25. package/fesm2022/aril-theme-layout.mjs +145 -39
  26. package/fesm2022/aril-theme-layout.mjs.map +1 -1
  27. package/fesm2022/aril.mjs +13 -4
  28. package/fesm2022/aril.mjs.map +1 -1
  29. package/package.json +87 -81
  30. package/permission/index.d.ts +3 -0
  31. package/permission/src/constants.d.ts +1 -0
  32. package/permission/src/has-permission.directive.d.ts +16 -0
  33. package/permission/src/permission.service.d.ts +15 -0
  34. package/provider/src/index.d.ts +1 -0
  35. package/provider/src/provideHostPermissions.d.ts +6 -0
  36. package/theme/layout/app/notifications/notifications-sidebar.component.d.ts +2288 -2267
  37. package/theme/layout/app/notifications/notifications-sidebar.component.html +66 -68
  38. package/theme/layout/app/notifications/notifications-sidebar.component.scss +234 -120
  39. package/theme/layout/app/notifications/notifications-sidebar.component.ts +182 -56
  40. package/theme/layout/service/interfaces/interfaces.d.ts +5 -1
  41. package/theme/layout/service/interfaces/interfaces.ts +6 -1
  42. package/theme/layout/service/notifications.service.d.ts +1 -0
  43. 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.selectedNotification = null;
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(switchMap((id) => this.notificationsService.markAsReadNotification(id))));
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: 10,
2625
- pageNumber: 1
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
- this.notifications.set(service.response.result);
2645
- // Update unread count in layoutService
2646
- this.layoutService.setUnreadNotificationCount(service?.response.resultInfo.totalItem || 0);
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.markAsReadService();
2682
+ const service = this.markAllAsReadService();
2651
2683
  if (service?.response) {
2652
- this.loadNotifications();
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
- this.selectedNotification = notification;
2667
- this.subjects.markAsRead.next(notification.id);
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
- else if (notification?.detailNotificationType === DetailNotificationTypeEnum.BATCH_JOB) {
2673
- this.router.navigate([`mng/bulk-operations/${notification?.referenceId}`]);
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
- markNotificationAsReadOnDotIcon(notification) {
2677
- if (!notification.read) {
2678
- this.subjects.markAsRead.next(notification.id);
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
- trackByNotificationId(index, notification) {
2682
- return notification.id;
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
- ScrollPanelModule,
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 {