aril 1.0.39 → 1.0.40

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 (56) hide show
  1. package/esm2022/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.mjs +211 -0
  2. package/esm2022/theme/layout/app/favorite-pages/favorite-pages.service.mjs +55 -0
  3. package/esm2022/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.mjs +129 -0
  4. package/esm2022/theme/layout/app/history/history-sidebar.component.mjs +128 -0
  5. package/esm2022/theme/layout/app/history/history.service.mjs +146 -0
  6. package/esm2022/theme/layout/app/layout/app.layout.component.mjs +9 -3
  7. package/esm2022/theme/layout/app/profileSidebar/app.profilesidebar.component.mjs +100 -8
  8. package/esm2022/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.mjs +142 -0
  9. package/esm2022/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.mjs +123 -0
  10. package/esm2022/theme/layout/app/profileSidebar/profile.service.mjs +42 -0
  11. package/esm2022/theme/layout/app/site-map/site-map-sidebar.component.mjs +161 -0
  12. package/esm2022/theme/layout/app/topbar/app.topbar.component.mjs +23 -5
  13. package/esm2022/theme/layout/service/app.layout.service.mjs +13 -1
  14. package/fesm2022/aril-theme-layout.mjs +1197 -75
  15. package/fesm2022/aril-theme-layout.mjs.map +1 -1
  16. package/package.json +70 -69
  17. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.d.ts +42 -0
  18. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.html +106 -0
  19. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.scss +181 -0
  20. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.ts +253 -0
  21. package/theme/layout/app/favorite-pages/favorite-pages.service.d.ts +54 -0
  22. package/theme/layout/app/favorite-pages/favorite-pages.service.ts +87 -0
  23. package/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.d.ts +36 -0
  24. package/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.html +27 -0
  25. package/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.ts +165 -0
  26. package/theme/layout/app/history/history-sidebar.component.d.ts +30 -0
  27. package/theme/layout/app/history/history-sidebar.component.html +88 -0
  28. package/theme/layout/app/history/history-sidebar.component.scss +191 -0
  29. package/theme/layout/app/history/history-sidebar.component.ts +139 -0
  30. package/theme/layout/app/history/history.service.d.ts +36 -0
  31. package/theme/layout/app/history/history.service.ts +182 -0
  32. package/theme/layout/app/layout/app.layout.component.html +3 -0
  33. package/theme/layout/app/layout/app.layout.component.ts +7 -1
  34. package/theme/layout/app/profileSidebar/app.profilesidebar.component.d.ts +17 -2
  35. package/theme/layout/app/profileSidebar/app.profilesidebar.component.html +107 -135
  36. package/theme/layout/app/profileSidebar/app.profilesidebar.component.scss +152 -0
  37. package/theme/layout/app/profileSidebar/app.profilesidebar.component.ts +114 -7
  38. package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.d.ts +30 -0
  39. package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.html +46 -0
  40. package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.scss +28 -0
  41. package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.ts +178 -0
  42. package/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.d.ts +27 -0
  43. package/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.html +76 -0
  44. package/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.ts +141 -0
  45. package/theme/layout/app/profileSidebar/profile.service.d.ts +67 -0
  46. package/theme/layout/app/profileSidebar/profile.service.ts +89 -0
  47. package/theme/layout/app/site-map/site-map-sidebar.component.d.ts +37 -0
  48. package/theme/layout/app/site-map/site-map-sidebar.component.html +118 -0
  49. package/theme/layout/app/site-map/site-map-sidebar.component.scss +189 -0
  50. package/theme/layout/app/site-map/site-map-sidebar.component.ts +189 -0
  51. package/theme/layout/app/topbar/app.topbar.component.d.ts +7 -1
  52. package/theme/layout/app/topbar/app.topbar.component.html +37 -17
  53. package/theme/layout/app/topbar/app.topbar.component.scss +188 -12
  54. package/theme/layout/app/topbar/app.topbar.component.ts +29 -7
  55. package/theme/layout/service/app.layout.service.d.ts +6 -0
  56. package/theme/layout/service/app.layout.service.ts +19 -1
@@ -0,0 +1,118 @@
1
+ <p-sidebar
2
+ [(visible)]="visible"
3
+ position="right"
4
+ [transitionOptions]="'.3s cubic-bezier(0, 0, 0.2, 1)'"
5
+ styleClass="layout-sitemap-sidebar w-full sm:w-30rem"
6
+ *transloco="let t; read: 'siteMap'">
7
+ <ng-template pTemplate="header">
8
+ <div class="flex align-items-center justify-content-between gap-2 w-full">
9
+ <div class="flex align-items-center gap-2">
10
+ <i class="pi pi-sitemap text-primary text-xl"></i>
11
+ <span class="font-bold text-lg">{{ t('siteMap') }}</span>
12
+ <span class="total-pages">{{ totalPages() }} {{ t('pages') }}</span>
13
+ </div>
14
+ </div>
15
+ </ng-template>
16
+
17
+ <div class="sitemap-content">
18
+ <div class="search-section">
19
+ <aril-text [placeholder]="t('searchPages')" [(ngModel)]="searchTerm" (ngModelChange)="onSearchChange()">
20
+ </aril-text>
21
+ </div>
22
+
23
+ @if (filteredNodes().length > 0) {
24
+ <div class="quick-actions">
25
+ <aril-button
26
+ icon="PLUS"
27
+ color="primary"
28
+ [raised]="true"
29
+ size="sm"
30
+ [pTooltip]="t('expandAll')"
31
+ tooltipPosition="top"
32
+ (clickEvent)="expandAll()">
33
+ </aril-button>
34
+ <aril-button
35
+ icon="MINUS"
36
+ color="danger"
37
+ [raised]="false"
38
+ size="sm"
39
+ [pTooltip]="t('collapseAll')"
40
+ tooltipPosition="top"
41
+ (clickEvent)="collapseAll()">
42
+ </aril-button>
43
+ </div>
44
+ }
45
+
46
+ <!-- Site Map Tree -->
47
+ @if (filteredNodes().length > 0) {
48
+ <div class="sitemap-tree">
49
+ <p-scrollPanel [style]="{ width: '100%', height: '100%' }">
50
+ <div class="tree-container">
51
+ @for (node of filteredNodes(); track trackByKey($index, node)) {
52
+ <ng-container *ngTemplateOutlet="treeNodeTemplate; context: { $implicit: node, level: 0 }"></ng-container>
53
+ }
54
+ </div>
55
+ </p-scrollPanel>
56
+ </div>
57
+ } @else {
58
+ <div class="empty-state">
59
+ <div class="empty-content">
60
+ <i class="pi pi-sitemap empty-icon"></i>
61
+ <h3 class="empty-title">
62
+ {{ searchTerm() ? t('noSearchResults') : t('noPages') }}
63
+ </h3>
64
+ <p class="empty-message">
65
+ {{ searchTerm() ? t('tryDifferentKeywords') : '' }}
66
+ </p>
67
+ @if (searchTerm()) {
68
+ <aril-button
69
+ [label]="t('clearSearch')"
70
+ icon="TIMES"
71
+ color="secondary"
72
+ [outlined]="true"
73
+ size="sm"
74
+ (clickEvent)="searchTerm.set(''); onSearchChange()">
75
+ </aril-button>
76
+ }
77
+ </div>
78
+ </div>
79
+ }
80
+
81
+ <!-- Recursive Tree Node Template -->
82
+ <ng-template #treeNodeTemplate let-node let-level="level">
83
+ <div class="tree-node" [style.margin-left.px]="level * 20">
84
+ <div
85
+ class="node-item"
86
+ [class.has-children]="node.children && node.children.length > 0"
87
+ [class.is-page]="node.routerLink"
88
+ [routerLink]="node.routerLink"
89
+ (click)="!node.routerLink ? toggleNode(node) : (visible = false)">
90
+ <div class="node-content">
91
+ @if (node.children && node.children.length > 0) {
92
+ <div class="toggle-btn" (click)="$event.stopPropagation(); toggleNode(node)">
93
+ <i class="pi" [class.pi-chevron-right]="!node.expanded" [class.pi-chevron-down]="node.expanded"></i>
94
+ </div>
95
+ }
96
+
97
+ @if (node.icon) {
98
+ <i class="node-icon" [class]="node.icon"></i>
99
+ }
100
+ <span class="node-label">{{ node.label | translateJson }}</span>
101
+
102
+ @if (node.routerLink) {
103
+ <i class="external-icon pi pi-external-link"></i>
104
+ }
105
+ </div>
106
+ </div>
107
+
108
+ <!-- Recursive Children -->
109
+ @if (node.children && node.expanded) {
110
+ @for (child of node.children; track trackByKey($index, child)) {
111
+ <ng-container
112
+ *ngTemplateOutlet="treeNodeTemplate; context: { $implicit: child, level: level + 1 }"></ng-container>
113
+ }
114
+ }
115
+ </div>
116
+ </ng-template>
117
+ </div>
118
+ </p-sidebar>
@@ -0,0 +1,189 @@
1
+ :host ::ng-deep {
2
+ .layout-sitemap-sidebar {
3
+ .p-sidebar-content {
4
+ padding: 0;
5
+ background: var(--surface-ground);
6
+ }
7
+
8
+ .p-sidebar-header {
9
+ background: var(--primary-color);
10
+ color: var(--primary-color-text);
11
+ border-bottom: 1px solid var(--primary-600);
12
+ padding: 1rem 0.5rem;
13
+
14
+ span {
15
+ font-size: 1.1rem;
16
+ font-weight: 600;
17
+ }
18
+
19
+ .total-pages {
20
+ background: rgba(255, 255, 255, 0.2);
21
+ color: rgba(255, 255, 255, 0.9);
22
+ padding: 0.25rem 0.5rem;
23
+ border-radius: 12px;
24
+ font-size: 0.75rem;
25
+ font-weight: 500;
26
+ }
27
+ }
28
+ }
29
+ }
30
+
31
+ .sitemap-content {
32
+ display: flex;
33
+ flex-direction: column;
34
+ height: 90vh;
35
+ background: var(--surface-ground);
36
+ }
37
+
38
+ .search-section {
39
+ padding: 1rem;
40
+ border-bottom: 1px solid var(--surface-border);
41
+ background: var(--surface-0);
42
+ }
43
+
44
+ .quick-actions {
45
+ display: flex;
46
+ align-items: center;
47
+ justify-content: flex-end;
48
+ gap: 0.5rem;
49
+ padding: 0.75rem 1rem;
50
+ border-bottom: 1px solid var(--surface-border);
51
+ background: var(--surface-0);
52
+ }
53
+
54
+ .sitemap-tree {
55
+ flex: 1;
56
+ overflow: hidden;
57
+ }
58
+
59
+ .tree-container {
60
+ padding: 0.5rem 0;
61
+ }
62
+
63
+ .tree-node {
64
+ .node-item {
65
+ display: flex;
66
+ align-items: center;
67
+ padding: 0.5rem 1rem;
68
+ border-radius: 6px;
69
+ margin: 0.1rem 0.5rem;
70
+ cursor: pointer;
71
+ transition: all 0.2s ease;
72
+ border: 1px solid transparent;
73
+
74
+ &:hover {
75
+ background: var(--surface-hover);
76
+ border-color: var(--surface-border);
77
+ }
78
+
79
+ &.is-page {
80
+ &:hover {
81
+ background: var(--primary-50);
82
+ border-color: var(--primary-200);
83
+
84
+ .external-icon {
85
+ opacity: 1;
86
+ }
87
+ }
88
+ }
89
+
90
+ &.has-children {
91
+ font-weight: 500;
92
+ }
93
+ }
94
+
95
+ .node-content {
96
+ display: flex;
97
+ align-items: center;
98
+ gap: 0.5rem;
99
+ width: 100%;
100
+ min-width: 0;
101
+ }
102
+
103
+ .toggle-btn {
104
+ display: flex;
105
+ align-items: center;
106
+ justify-content: center;
107
+ width: 20px;
108
+ height: 20px;
109
+ background: transparent;
110
+ border: none;
111
+ border-radius: 4px;
112
+ color: var(--text-color-secondary);
113
+ cursor: pointer;
114
+ transition: all 0.2s ease;
115
+ flex-shrink: 0;
116
+
117
+ &:hover {
118
+ background: var(--surface-hover);
119
+ color: var(--primary-color);
120
+ }
121
+
122
+ i {
123
+ font-size: 0.7rem;
124
+ }
125
+ }
126
+
127
+ .node-icon {
128
+ color: var(--primary-color);
129
+ font-size: 0.9rem;
130
+ flex-shrink: 0;
131
+ }
132
+
133
+ .node-label {
134
+ flex: 1;
135
+ font-size: 0.9rem;
136
+ color: var(--text-color);
137
+ white-space: nowrap;
138
+ overflow: hidden;
139
+ text-overflow: ellipsis;
140
+ }
141
+
142
+ .external-icon {
143
+ color: var(--text-color-secondary);
144
+ font-size: 0.7rem;
145
+ opacity: 0.6;
146
+ transition: opacity 0.2s ease;
147
+ flex-shrink: 0;
148
+ }
149
+ }
150
+
151
+ .empty-state {
152
+ flex: 1;
153
+ display: flex;
154
+ align-items: center;
155
+ justify-content: center;
156
+ padding: 2rem;
157
+ }
158
+
159
+ .empty-content {
160
+ text-align: center;
161
+ max-width: 300px;
162
+ }
163
+
164
+ .empty-icon {
165
+ font-size: 3rem;
166
+ color: var(--text-color-secondary);
167
+ margin-bottom: 1rem;
168
+ opacity: 0.5;
169
+ }
170
+
171
+ .empty-message {
172
+ font-size: 0.9rem;
173
+ color: var(--text-color-secondary);
174
+ line-height: 1.4;
175
+ margin-bottom: 1.5rem;
176
+ }
177
+
178
+ // Custom Scrollbar
179
+ :host ::ng-deep {
180
+ .p-scrollpanel-bar-y {
181
+ background: var(--primary-200);
182
+ width: 4px;
183
+ border-radius: 2px;
184
+ }
185
+
186
+ .p-scrollpanel-bar-y:hover {
187
+ background: var(--primary-300);
188
+ }
189
+ }
@@ -0,0 +1,189 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, OnInit, signal } from '@angular/core';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { RouterModule } from '@angular/router';
5
+
6
+ import { ScrollPanelModule } from 'primeng/scrollpanel';
7
+ import { SidebarModule } from 'primeng/sidebar';
8
+ import { TooltipModule } from 'primeng/tooltip';
9
+
10
+ import { TranslocoModule, TranslocoService } from '@ngneat/transloco';
11
+
12
+ import { ButtonComponent } from 'aril/ui/button';
13
+ import { TextComponent } from 'aril/ui/text';
14
+ import { TranslateJsonPipe } from 'aril/util/pipes';
15
+
16
+ import { LayoutService } from '../../service/app.layout.service';
17
+
18
+ interface MenuNode {
19
+ key: string;
20
+ label: string | object;
21
+ icon?: string;
22
+ routerLink?: string;
23
+ children?: MenuNode[];
24
+ expanded?: boolean;
25
+ }
26
+
27
+ @Component({
28
+ standalone: true,
29
+ selector: 'app-site-map-sidebar',
30
+ imports: [
31
+ CommonModule,
32
+ FormsModule,
33
+ RouterModule,
34
+ SidebarModule,
35
+ ScrollPanelModule,
36
+ TooltipModule,
37
+ ButtonComponent,
38
+ TextComponent,
39
+ TranslocoModule,
40
+ TranslateJsonPipe
41
+ ],
42
+ templateUrl: './site-map-sidebar.component.html',
43
+ styleUrls: ['./site-map-sidebar.component.scss']
44
+ })
45
+ export class SiteMapSidebarComponent implements OnInit {
46
+ siteMapNodes = signal<MenuNode[]>([]);
47
+ filteredNodes = signal<MenuNode[]>([]);
48
+ searchTerm = signal<string>('');
49
+ totalPages = signal<number>(0);
50
+
51
+ constructor(
52
+ public layoutService: LayoutService,
53
+ private translocoService: TranslocoService
54
+ ) {}
55
+
56
+ ngOnInit(): void {
57
+ this.loadSiteMap();
58
+ }
59
+
60
+ get visible(): boolean {
61
+ return this.layoutService.state.siteMapSidebarVisible;
62
+ }
63
+
64
+ set visible(value: boolean) {
65
+ this.layoutService.state.siteMapSidebarVisible = value;
66
+ }
67
+
68
+ private loadSiteMap(): void {
69
+ const menuItems = (<any>globalThis).hostMenuItems?.() || [];
70
+ const nodes = this.buildSiteMapNodes(menuItems);
71
+ const totalCount = this.countTotalPages(nodes);
72
+
73
+ this.siteMapNodes.set(nodes);
74
+ this.filteredNodes.set(nodes);
75
+ this.totalPages.set(totalCount);
76
+ }
77
+
78
+ private buildSiteMapNodes(items: any[], parentKey = ''): MenuNode[] {
79
+ return items
80
+ .filter((item) => {
81
+ // Keep the home page route ("/") and any non-empty routes
82
+ return !item.routerLink || item.routerLink === '/' || item.routerLink.trim() !== '';
83
+ })
84
+ .map((item, index) => {
85
+ const key = parentKey ? `${parentKey}-${index}` : `${index}`;
86
+
87
+ let label: string | object;
88
+ if (item.routerLink === '/') {
89
+ label = { tr: 'Anasayfa', en: 'Home' };
90
+ } else {
91
+ label = item.label || { tr: 'Bilinmeyen', en: 'Unknown' };
92
+ }
93
+
94
+ const node: MenuNode = {
95
+ key,
96
+ label,
97
+ icon: item.icon,
98
+ routerLink: item.routerLink,
99
+ expanded: false
100
+ };
101
+
102
+ if (item.items && item.items.length > 0) {
103
+ node.children = this.buildSiteMapNodes(item.items, key);
104
+ }
105
+
106
+ return node;
107
+ });
108
+ }
109
+
110
+ private countTotalPages(nodes: MenuNode[]): number {
111
+ let count = 0;
112
+ for (const node of nodes) {
113
+ if (node.routerLink) {
114
+ count++;
115
+ }
116
+ if (node.children) {
117
+ count += this.countTotalPages(node.children);
118
+ }
119
+ }
120
+ return count;
121
+ }
122
+
123
+ onSearchChange(): void {
124
+ const searchTerm = this.searchTerm().toLowerCase().trim();
125
+ if (!searchTerm) {
126
+ this.filteredNodes.set(this.siteMapNodes());
127
+ } else {
128
+ const filtered = this.filterNodes(this.siteMapNodes(), searchTerm);
129
+ this.filteredNodes.set(filtered);
130
+ }
131
+ }
132
+
133
+ private filterNodes(nodes: MenuNode[], searchTerm: string): MenuNode[] {
134
+ const filtered: MenuNode[] = [];
135
+ const currentLang = this.translocoService.getActiveLang();
136
+
137
+ for (const node of nodes) {
138
+ // Convert label to string for search based on active language
139
+ const labelText =
140
+ typeof node.label === 'string' ?
141
+ node.label
142
+ : (node.label as any)?.[currentLang] || (node.label as any)?.tr || (node.label as any)?.en || '';
143
+
144
+ const matches = labelText.toLowerCase().includes(searchTerm);
145
+ let filteredChildren: MenuNode[] = [];
146
+
147
+ if (node.children) {
148
+ filteredChildren = this.filterNodes(node.children, searchTerm);
149
+ }
150
+
151
+ if (matches || filteredChildren.length > 0) {
152
+ filtered.push({
153
+ ...node,
154
+ children: filteredChildren.length > 0 ? filteredChildren : node.children,
155
+ expanded: filteredChildren.length > 0
156
+ });
157
+ }
158
+ }
159
+
160
+ return filtered;
161
+ }
162
+
163
+ expandAll(): void {
164
+ const expanded = this.expandNodes(this.filteredNodes(), true);
165
+ this.filteredNodes.set([...expanded]);
166
+ }
167
+
168
+ collapseAll(): void {
169
+ const collapsed = this.expandNodes(this.filteredNodes(), false);
170
+ this.filteredNodes.set([...collapsed]);
171
+ }
172
+
173
+ private expandNodes(nodes: MenuNode[], expanded: boolean): MenuNode[] {
174
+ return nodes.map((node) => ({
175
+ ...node,
176
+ expanded,
177
+ children: node.children ? this.expandNodes(node.children, expanded) : undefined
178
+ }));
179
+ }
180
+
181
+ toggleNode(node: MenuNode): void {
182
+ node.expanded = !node.expanded;
183
+ this.filteredNodes.set([...this.filteredNodes()]);
184
+ }
185
+
186
+ trackByKey(index: number, node: MenuNode): string {
187
+ return node.key || `${index}`;
188
+ }
189
+ }
@@ -1,10 +1,10 @@
1
1
  import { ElementRef } from '@angular/core';
2
2
  import { TranslocoService } from '@ngneat/transloco';
3
+ import { KeycloakService } from 'keycloak-angular';
3
4
  import { PubSubService } from 'aril/util/pub-sub';
4
5
  import { LayoutService } from '../../service/app.layout.service';
5
6
  import { LanguageCode } from '../../service/interfaces/enum';
6
7
  import { Language } from '../../service/interfaces/interfaces';
7
- import { KeycloakService } from 'keycloak-angular';
8
8
  import * as i0 from "@angular/core";
9
9
  export declare class AppTopbarComponent {
10
10
  private readonly translocoService;
@@ -15,12 +15,18 @@ export declare class AppTopbarComponent {
15
15
  layoutService: LayoutService;
16
16
  search: string;
17
17
  filePath: import("@angular/core").WritableSignal<string>;
18
+ isNotificationsVisible: import("@angular/core").WritableSignal<boolean>;
18
19
  currentLang: LanguageCode;
19
20
  languages: Language[];
20
21
  constructor(translocoService: TranslocoService, pubSubService: PubSubService, keycloak: KeycloakService);
21
22
  onMenuButtonClick(): void;
22
23
  onProfileButtonClick(): void;
23
24
  onConfigButtonClick(): void;
25
+ onHistoryButtonClick(): void;
26
+ onSiteMapButtonClick(): void;
27
+ onFavoritePagesButtonClick(): void;
28
+ onNotificationsButtonClick(): void;
29
+ onNotificationsClose(): void;
24
30
  onLanguageChange(): void;
25
31
  private publishLanguageChange;
26
32
  getFlagPath(lang: LanguageCode): string;
@@ -3,46 +3,66 @@
3
3
  <button #menubutton type="button" class="topbar-menubutton p-link p-trigger" (click)="onMenuButtonClick()">
4
4
  <i class="pi pi-bars"></i>
5
5
  </button>
6
- <img [src]="filePath()" class="mr-3" alt="yeap" />
6
+ <img [src]="filePath()" class="topbar-logo mr-3" alt="logo" />
7
7
  </div>
8
8
 
9
- <div class="topbar-search" style="width: 50rem">
10
- <span class="p-input-icon-left" style="width: 100%">
9
+ <div class="topbar-search" *transloco="let t; read: ''">
10
+ <span class="p-input-icon-left">
11
11
  <i class="pi pi-search"></i>
12
12
  <input
13
13
  type="text"
14
14
  pInputText
15
15
  variant="filled"
16
- placeholder="Genel Arama"
16
+ [placeholder]="t('searchGeneral')"
17
17
  style="background: #eff3f8; border: none; height: 42px"
18
- class="p-inputtext p-component p-element sm:w-full" />
18
+ class="p-inputtext p-component p-element topbar-search-input" />
19
19
  </span>
20
20
  </div>
21
21
 
22
22
  <div class="topbar-end mr-2">
23
23
  <ul class="topbar-menu">
24
- <li>
25
- <p-button icon="pi pi-sitemap" severity="secondary" [text]="true" [rounded]="true" />
24
+ <li class="topbar-menu-item">
25
+ <p-button
26
+ icon="pi pi-sitemap"
27
+ severity="secondary"
28
+ [text]="true"
29
+ [rounded]="true"
30
+ (click)="onSiteMapButtonClick()" />
26
31
  </li>
27
- <li>
28
- <p-button icon="pi pi-history" severity="secondary" [text]="true" [rounded]="true" />
32
+ <li class="topbar-menu-item">
33
+ <p-button
34
+ icon="pi pi-history"
35
+ severity="secondary"
36
+ [text]="true"
37
+ [rounded]="true"
38
+ (click)="onHistoryButtonClick()" />
29
39
  </li>
30
- <li>
31
- <p-button icon="pi pi-heart" severity="secondary" [text]="true" [rounded]="true" />
40
+ <li class="topbar-menu-item">
41
+ <p-button
42
+ icon="pi pi-heart"
43
+ severity="secondary"
44
+ [text]="true"
45
+ [rounded]="true"
46
+ (click)="onFavoritePagesButtonClick()" />
32
47
  </li>
33
48
 
34
- <li>
49
+ <li class="topbar-menu-item">
35
50
  <p-button severity="secondary" [text]="true" [rounded]="true" (click)="onProfileButtonClick()">
36
51
  {{ username[0] | uppercase }}
37
52
  </p-button>
38
53
  </li>
39
- <li>
54
+ <li class="topbar-menu-item">
40
55
  <p-divider layout="vertical" styleClass="h-1rem border-500 m-0" />
41
56
  </li>
42
- <li>
43
- <i class="pi pi-bell" severity="info" pBadge [value]="0"></i>
57
+ <li class="topbar-menu-item">
58
+ <i
59
+ class="pi pi-bell notification-icon"
60
+ severity="info"
61
+ pBadge
62
+ [value]="0"
63
+ (click)="onNotificationsButtonClick()"></i>
44
64
  </li>
45
- <li>
65
+ <li class="topbar-menu-item">
46
66
  <p-dropdown
47
67
  [options]="languages"
48
68
  [(ngModel)]="currentLang"
@@ -54,7 +74,7 @@
54
74
  <ng-template pTemplate="selectedItem">
55
75
  <div class="flex align-items-center gap-2">
56
76
  <img [src]="getFlagPath(currentLang)" class="flag-icon" alt="flag" />
57
- <span>{{ currentLang | uppercase }}</span>
77
+ <span class="language-text">{{ currentLang | uppercase }}</span>
58
78
  </div>
59
79
  </ng-template>
60
80
  <ng-template pTemplate="item" let-item>