aril 1.0.39 → 1.0.41

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 (59) hide show
  1. package/esm2022/http/src/serviceStateMethods.mjs +6 -2
  2. package/esm2022/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.mjs +211 -0
  3. package/esm2022/theme/layout/app/favorite-pages/favorite-pages.service.mjs +55 -0
  4. package/esm2022/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.mjs +129 -0
  5. package/esm2022/theme/layout/app/history/history-sidebar.component.mjs +128 -0
  6. package/esm2022/theme/layout/app/history/history.service.mjs +146 -0
  7. package/esm2022/theme/layout/app/layout/app.layout.component.mjs +9 -3
  8. package/esm2022/theme/layout/app/profileSidebar/app.profilesidebar.component.mjs +100 -8
  9. package/esm2022/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.mjs +142 -0
  10. package/esm2022/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.mjs +123 -0
  11. package/esm2022/theme/layout/app/profileSidebar/profile.service.mjs +42 -0
  12. package/esm2022/theme/layout/app/site-map/site-map-sidebar.component.mjs +161 -0
  13. package/esm2022/theme/layout/app/topbar/app.topbar.component.mjs +23 -5
  14. package/esm2022/theme/layout/service/app.layout.service.mjs +13 -1
  15. package/fesm2022/aril-http.mjs +5 -1
  16. package/fesm2022/aril-http.mjs.map +1 -1
  17. package/fesm2022/aril-theme-layout.mjs +1197 -75
  18. package/fesm2022/aril-theme-layout.mjs.map +1 -1
  19. package/package.json +84 -83
  20. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.d.ts +42 -0
  21. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.html +106 -0
  22. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.scss +181 -0
  23. package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.ts +253 -0
  24. package/theme/layout/app/favorite-pages/favorite-pages.service.d.ts +54 -0
  25. package/theme/layout/app/favorite-pages/favorite-pages.service.ts +87 -0
  26. package/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.d.ts +36 -0
  27. package/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.html +27 -0
  28. package/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.ts +165 -0
  29. package/theme/layout/app/history/history-sidebar.component.d.ts +30 -0
  30. package/theme/layout/app/history/history-sidebar.component.html +88 -0
  31. package/theme/layout/app/history/history-sidebar.component.scss +191 -0
  32. package/theme/layout/app/history/history-sidebar.component.ts +139 -0
  33. package/theme/layout/app/history/history.service.d.ts +36 -0
  34. package/theme/layout/app/history/history.service.ts +182 -0
  35. package/theme/layout/app/layout/app.layout.component.html +3 -0
  36. package/theme/layout/app/layout/app.layout.component.ts +7 -1
  37. package/theme/layout/app/profileSidebar/app.profilesidebar.component.d.ts +17 -2
  38. package/theme/layout/app/profileSidebar/app.profilesidebar.component.html +107 -135
  39. package/theme/layout/app/profileSidebar/app.profilesidebar.component.scss +152 -0
  40. package/theme/layout/app/profileSidebar/app.profilesidebar.component.ts +114 -7
  41. package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.d.ts +30 -0
  42. package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.html +46 -0
  43. package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.scss +28 -0
  44. package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.ts +178 -0
  45. package/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.d.ts +27 -0
  46. package/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.html +76 -0
  47. package/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.ts +141 -0
  48. package/theme/layout/app/profileSidebar/profile.service.d.ts +67 -0
  49. package/theme/layout/app/profileSidebar/profile.service.ts +89 -0
  50. package/theme/layout/app/site-map/site-map-sidebar.component.d.ts +37 -0
  51. package/theme/layout/app/site-map/site-map-sidebar.component.html +118 -0
  52. package/theme/layout/app/site-map/site-map-sidebar.component.scss +189 -0
  53. package/theme/layout/app/site-map/site-map-sidebar.component.ts +189 -0
  54. package/theme/layout/app/topbar/app.topbar.component.d.ts +7 -1
  55. package/theme/layout/app/topbar/app.topbar.component.html +37 -17
  56. package/theme/layout/app/topbar/app.topbar.component.scss +188 -12
  57. package/theme/layout/app/topbar/app.topbar.component.ts +29 -7
  58. package/theme/layout/service/app.layout.service.d.ts +6 -0
  59. package/theme/layout/service/app.layout.service.ts +19 -1
@@ -0,0 +1,129 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, effect } from '@angular/core';
3
+ import { toSignal } from '@angular/core/rxjs-interop';
4
+ import { FormsModule, ReactiveFormsModule, Validators } from '@angular/forms';
5
+ import { TranslocoModule } from '@ngneat/transloco';
6
+ import { Subject, switchMap } from 'rxjs';
7
+ import { ButtonComponent } from 'aril/ui/button';
8
+ import { FieldComponent } from 'aril/ui/field';
9
+ import { ARiLFormModule } from 'aril/ui/form';
10
+ import { TextComponent } from 'aril/ui/text';
11
+ import * as i0 from "@angular/core";
12
+ import * as i1 from "@angular/forms";
13
+ import * as i2 from "primeng/dynamicdialog";
14
+ import * as i3 from "../../favorite-pages.service";
15
+ import * as i4 from "primeng/api";
16
+ import * as i5 from "@ngneat/transloco";
17
+ import * as i6 from "aril/ui/form";
18
+ export class AddEditFavoriteModalComponent {
19
+ constructor(formBuilder, dialogRef, dialogConfig, favoritePagesService, messageService, translocoService) {
20
+ this.formBuilder = formBuilder;
21
+ this.dialogRef = dialogRef;
22
+ this.dialogConfig = dialogConfig;
23
+ this.favoritePagesService = favoritePagesService;
24
+ this.messageService = messageService;
25
+ this.translocoService = translocoService;
26
+ this.subjects = {
27
+ saveFavorite: new Subject(),
28
+ updateFavorite: new Subject()
29
+ };
30
+ this.saveFavoriteService = toSignal(this.subjects.saveFavorite.pipe(switchMap((data) => this.favoritePagesService.saveFavoritePage(data))));
31
+ this.updateFavoriteService = toSignal(this.subjects.updateFavorite.pipe(switchMap((data) => this.favoritePagesService.updateFavoritePage(this.modalData.favorite?.id, data))));
32
+ this.modalData = this.dialogConfig.data;
33
+ this.initializeEffects();
34
+ this.initializeForm();
35
+ }
36
+ ngOnInit() {
37
+ if (!this.modalData || !['add', 'edit'].includes(this.modalData.mode)) {
38
+ this.dialogRef.close('error');
39
+ }
40
+ }
41
+ initializeEffects() {
42
+ // Save favorite effect
43
+ effect(() => {
44
+ const service = this.saveFavoriteService();
45
+ if (service?.response) {
46
+ this.messageService.add({
47
+ severity: 'success',
48
+ summary: this.translocoService.translate('favoritePages.success'),
49
+ detail: this.translocoService.translate('favoritePages.saveSuccessfully'),
50
+ key: 'toast-root'
51
+ });
52
+ this.dialogRef.close({ status: 'success', data: service.response });
53
+ }
54
+ }, { allowSignalWrites: true });
55
+ // Update favorite effect
56
+ effect(() => {
57
+ const service = this.updateFavoriteService();
58
+ if (service?.response) {
59
+ this.messageService.add({
60
+ severity: 'success',
61
+ summary: this.translocoService.translate('favoritePages.success'),
62
+ detail: this.translocoService.translate('favoritePages.updatedSuccessfully'),
63
+ key: 'toast-root'
64
+ });
65
+ this.dialogRef.close({ status: 'success', data: service.response });
66
+ }
67
+ }, { allowSignalWrites: true });
68
+ }
69
+ initializeForm() {
70
+ if (this.modalData.mode === 'add') {
71
+ this.favoriteForm = this.formBuilder.group({
72
+ label: ['', [Validators.required, Validators.minLength(1), Validators.maxLength(100)]],
73
+ url: [{ value: this.modalData.url || '', disabled: true }]
74
+ });
75
+ }
76
+ else if (this.modalData.mode === 'edit' && this.modalData.favorite) {
77
+ this.favoriteForm = this.formBuilder.group({
78
+ label: [
79
+ this.modalData.favorite.label,
80
+ [Validators.required, Validators.minLength(1), Validators.maxLength(100)]
81
+ ],
82
+ url: [{ value: this.modalData.favorite.url, disabled: true }]
83
+ });
84
+ }
85
+ }
86
+ get isAddMode() {
87
+ return this.modalData.mode === 'add';
88
+ }
89
+ get isEditMode() {
90
+ return this.modalData.mode === 'edit';
91
+ }
92
+ submit() {
93
+ const formValue = this.favoriteForm.value;
94
+ if (this.isAddMode) {
95
+ const saveRequest = {
96
+ url: this.modalData.url,
97
+ label: formValue.label.trim()
98
+ };
99
+ this.subjects.saveFavorite.next(saveRequest);
100
+ }
101
+ else if (this.isEditMode && this.modalData.favorite) {
102
+ const updateRequest = {
103
+ label: formValue.label.trim(),
104
+ url: this.modalData.url,
105
+ version: this.modalData.favorite.version
106
+ };
107
+ this.subjects.updateFavorite.next(updateRequest);
108
+ }
109
+ }
110
+ cancel() {
111
+ this.dialogRef.close('cancel');
112
+ }
113
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AddEditFavoriteModalComponent, deps: [{ token: i1.FormBuilder }, { token: i2.DynamicDialogRef }, { token: i2.DynamicDialogConfig }, { token: i3.FavoritePagesService }, { token: i4.MessageService }, { token: i5.TranslocoService }], target: i0.ɵɵFactoryTarget.Component }); }
114
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.1.2", type: AddEditFavoriteModalComponent, isStandalone: true, selector: "ng-component", ngImport: i0, template: "<div *transloco=\"let t; read: 'favoritePages'\">\r\n\t<aril-form [formGroup]=\"favoriteForm\">\r\n\t\t<aril-field [label]=\"t('label')\" [cols]=\"{ xl: 12, lg: 12, md: 12, sm: 12 }\" [markAsRequired]=\"true\">\r\n\t\t\t<aril-text formControlName=\"label\" [placeholder]=\"t('labelPlaceholder')\"> </aril-text>\r\n\t\t</aril-field>\r\n\r\n\t\t<aril-field [label]=\"t('path')\" [cols]=\"{ xl: 12, lg: 12, md: 12, sm: 12 }\">\r\n\t\t\t<aril-text formControlName=\"url\"> </aril-text>\r\n\t\t</aril-field>\r\n\r\n\t\t<div class=\"col-12 flex justify-content-end mt-4 gap-2\">\r\n\t\t\t<aril-button\r\n\t\t\t\tcolor=\"danger\"\r\n\t\t\t\t[label]=\"t('cancel')\"\r\n\t\t\t\t[outlined]=\"true\"\r\n\t\t\t\ticon=\"TIMES\"\r\n\t\t\t\t(clickEvent)=\"cancel()\">\r\n\t\t\t</aril-button>\r\n\t\t\t<aril-form-submit\r\n\t\t\t\t[label]=\"t('save')\"\r\n\t\t\t\tcolor=\"success\"\r\n\t\t\t\ticon=\"CHECK\"\r\n\t\t\t\t[formGroup]=\"favoriteForm\"\r\n\t\t\t\t(validEvent)=\"submit()\" />\r\n\t\t</div>\r\n\t</aril-form>\r\n</div>\r\n", dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: ReactiveFormsModule }, { kind: "directive", type: i1.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1.NgControlStatusGroup, selector: "[formGroupName],[formArrayName],[ngModelGroup],[formGroup],form:not([ngNoForm]),[ngForm]" }, { kind: "directive", type: i1.FormGroupDirective, selector: "[formGroup]", inputs: ["formGroup"], outputs: ["ngSubmit"], exportAs: ["ngForm"] }, { kind: "directive", type: i1.FormControlName, selector: "[formControlName]", inputs: ["formControlName", "disabled", "ngModel"], outputs: ["ngModelChange"] }, { kind: "ngmodule", type: FormsModule }, { kind: "ngmodule", type: ARiLFormModule }, { kind: "component", type: i6.FormComponent, selector: "aril-form", inputs: ["formGroup"] }, { kind: "component", type: i6.FormSubmitButtonComponent, selector: "aril-form-submit:not([click])", inputs: ["formGroup"], outputs: ["validEvent", "inValidEvent"] }, { kind: "component", type: FieldComponent, selector: "aril-field", inputs: ["label", "color", "labelWidth", "valueWidth", "labelPos", "markAsRequired", "cols", "infoData"] }, { kind: "component", type: TextComponent, selector: "aril-text[ngModel], aril-text[formControl], aril-text[formControlName]", inputs: ["placeholder", "tabindex", "icon", "iconPos", "size"] }, { kind: "component", type: ButtonComponent, selector: "aril-button:not([click])", inputs: ["label", "loading", "disabled", "raised", "outlined", "badge", "size", "icon", "color"], outputs: ["clickEvent"] }, { kind: "ngmodule", type: TranslocoModule }, { kind: "directive", type: i5.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoLang", "translocoLoadingTpl"] }] }); }
115
+ }
116
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: AddEditFavoriteModalComponent, decorators: [{
117
+ type: Component,
118
+ args: [{ standalone: true, imports: [
119
+ CommonModule,
120
+ ReactiveFormsModule,
121
+ FormsModule,
122
+ ARiLFormModule,
123
+ FieldComponent,
124
+ TextComponent,
125
+ ButtonComponent,
126
+ TranslocoModule
127
+ ], template: "<div *transloco=\"let t; read: 'favoritePages'\">\r\n\t<aril-form [formGroup]=\"favoriteForm\">\r\n\t\t<aril-field [label]=\"t('label')\" [cols]=\"{ xl: 12, lg: 12, md: 12, sm: 12 }\" [markAsRequired]=\"true\">\r\n\t\t\t<aril-text formControlName=\"label\" [placeholder]=\"t('labelPlaceholder')\"> </aril-text>\r\n\t\t</aril-field>\r\n\r\n\t\t<aril-field [label]=\"t('path')\" [cols]=\"{ xl: 12, lg: 12, md: 12, sm: 12 }\">\r\n\t\t\t<aril-text formControlName=\"url\"> </aril-text>\r\n\t\t</aril-field>\r\n\r\n\t\t<div class=\"col-12 flex justify-content-end mt-4 gap-2\">\r\n\t\t\t<aril-button\r\n\t\t\t\tcolor=\"danger\"\r\n\t\t\t\t[label]=\"t('cancel')\"\r\n\t\t\t\t[outlined]=\"true\"\r\n\t\t\t\ticon=\"TIMES\"\r\n\t\t\t\t(clickEvent)=\"cancel()\">\r\n\t\t\t</aril-button>\r\n\t\t\t<aril-form-submit\r\n\t\t\t\t[label]=\"t('save')\"\r\n\t\t\t\tcolor=\"success\"\r\n\t\t\t\ticon=\"CHECK\"\r\n\t\t\t\t[formGroup]=\"favoriteForm\"\r\n\t\t\t\t(validEvent)=\"submit()\" />\r\n\t\t</div>\r\n\t</aril-form>\r\n</div>\r\n" }]
128
+ }], ctorParameters: () => [{ type: i1.FormBuilder }, { type: i2.DynamicDialogRef }, { type: i2.DynamicDialogConfig }, { type: i3.FavoritePagesService }, { type: i4.MessageService }, { type: i5.TranslocoService }] });
129
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWRkLWVkaXQtZmF2b3JpdGUtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC90aGVtZS9sYXlvdXQvYXBwL2Zhdm9yaXRlLXBhZ2VzL21vZGFscy9hZGQtZWRpdC1mYXZvcml0ZS1tb2RhbC9hZGQtZWRpdC1mYXZvcml0ZS1tb2RhbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3RoZW1lL2xheW91dC9hcHAvZmF2b3JpdGUtcGFnZXMvbW9kYWxzL2FkZC1lZGl0LWZhdm9yaXRlLW1vZGFsL2FkZC1lZGl0LWZhdm9yaXRlLW1vZGFsLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsU0FBUyxFQUFVLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMxRCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFDdEQsT0FBTyxFQUEwQixXQUFXLEVBQUUsbUJBQW1CLEVBQUUsVUFBVSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFLdEcsT0FBTyxFQUFFLGVBQWUsRUFBb0IsTUFBTSxtQkFBbUIsQ0FBQztBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUUxQyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUMvQyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7Ozs7Ozs7O0FBNkI3QyxNQUFNLE9BQU8sNkJBQTZCO0lBbUJ6QyxZQUNrQixX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QVEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQ2xELENBQUM7SUFDRixDQUFDO0lBRUQsTUFBTTtRQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBQ2hDLENBQUM7OEdBeEhXLDZCQUE2QjtrR0FBN0IsNkJBQTZCLHdFQzNDMUMsMi9CQTJCQSwyQ0RLRSxZQUFZLDhCQUNaLG1CQUFtQixtbEJBQ25CLFdBQVcsOEJBQ1gsY0FBYyxrU0FDZCxjQUFjLGlLQUNkLGFBQWEsbUxBQ2IsZUFBZSwrTEFDZixlQUFlOzsyRkFJSiw2QkFBNkI7a0JBZHpDLFNBQVM7aUNBQ0csSUFBSSxXQUNQO3dCQUNSLFlBQVk7d0JBQ1osbUJBQW1CO3dCQUNuQixXQUFXO3dCQUNYLGNBQWM7d0JBQ2QsY0FBYzt3QkFDZCxhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsZUFBZTtxQkFDZiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbW1vbk1vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbic7XHJcbmltcG9ydCB7IENvbXBvbmVudCwgT25Jbml0LCBlZmZlY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgdG9TaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlL3J4anMtaW50ZXJvcCc7XHJcbmltcG9ydCB7IEZvcm1CdWlsZGVyLCBGb3JtR3JvdXAsIEZvcm1zTW9kdWxlLCBSZWFjdGl2ZUZvcm1zTW9kdWxlLCBWYWxpZGF0b3JzIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xyXG5cclxuaW1wb3J0IHsgTWVzc2FnZVNlcnZpY2UgfSBmcm9tICdwcmltZW5nL2FwaSc7XHJcbmltcG9ydCB7IER5bmFtaWNEaWFsb2dDb25maWcsIER5bmFtaWNEaWFsb2dSZWYgfSBmcm9tICdwcmltZW5nL2R5bmFtaWNkaWFsb2cnO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNsb2NvTW9kdWxlLCBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQG5nbmVhdC90cmFuc2xvY28nO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCBzd2l0Y2hNYXAgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ2FyaWwvdWkvYnV0dG9uJztcclxuaW1wb3J0IHsgRmllbGRDb21wb25lbnQgfSBmcm9tICdhcmlsL3VpL2ZpZWxkJztcclxuaW1wb3J0IHsgQVJpTEZvcm1Nb2R1bGUgfSBmcm9tICdhcmlsL3VpL2Zvcm0nO1xyXG5pbXBvcnQgeyBUZXh0Q29tcG9uZW50IH0gZnJvbSAnYXJpbC91aS90ZXh0JztcclxuXHJcbmltcG9ydCB7XHJcblx0RmF2b3JpdGVQYWdlUmVzcG9uc2VEVE8sXHJcblx0RmF2b3JpdGVQYWdlU2F2ZVJlcXVlc3REVE8sXHJcblx0RmF2b3JpdGVQYWdlVXBkYXRlUmVxdWVzdERUTyxcclxuXHRGYXZvcml0ZVBhZ2VzU2VydmljZVxyXG59IGZyb20gJy4uLy4uL2Zhdm9yaXRlLXBhZ2VzLnNlcnZpY2UnO1xyXG5cclxuaW50ZXJmYWNlIE1vZGFsRGF0YSB7XHJcblx0bW9kZTogJ2FkZCcgfCAnZWRpdCc7XHJcblx0dXJsPzogc3RyaW5nOyAvLyBGb3IgYWRkIG1vZGVcclxuXHRmYXZvcml0ZT86IEZhdm9yaXRlUGFnZVJlc3BvbnNlRFRPOyAvLyBGb3IgZWRpdCBtb2RlXHJcbn1cclxuXHJcbkBDb21wb25lbnQoe1xyXG5cdHN0YW5kYWxvbmU6IHRydWUsXHJcblx0aW1wb3J0czogW1xyXG5cdFx0Q29tbW9uTW9kdWxlLFxyXG5cdFx0UmVhY3RpdmVGb3Jtc01vZHVsZSxcclxuXHRcdEZvcm1zTW9kdWxlLFxyXG5cdFx0QVJpTEZvcm1Nb2R1bGUsXHJcblx0XHRGaWVsZENvbXBvbmVudCxcclxuXHRcdFRleHRDb21wb25lbnQsXHJcblx0XHRCdXR0b25Db21wb25lbnQsXHJcblx0XHRUcmFuc2xvY29Nb2R1bGVcclxuXHRdLFxyXG5cdHRlbXBsYXRlVXJsOiAnLi9hZGQtZWRpdC1mYXZvcml0ZS1tb2RhbC5jb21wb25lbnQuaHRtbCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEFkZEVkaXRGYXZvcml0ZU1vZGFsQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcclxuXHRmYXZvcml0ZUZvcm0hOiBGb3JtR3JvdXA7XHJcblx0bW9kYWxEYXRhOiBNb2RhbERhdGE7XHJcblxyXG5cdHByaXZhdGUgc3ViamVjdHMgPSB7XHJcblx0XHRzYXZlRmF2b3JpdGU6IG5ldyBTdWJqZWN0PEZhdm9yaXRlUGFnZVNhdmVSZXF1ZXN0RFRPPigpLFxyXG5cdFx0dXBkYXRlRmF2b3JpdGU6IG5ldyBTdWJqZWN0PEZhdm9yaXRlUGFnZVVwZGF0ZVJlcXVlc3REVE8+KClcclxuXHR9O1xyXG5cclxuXHRzYXZlRmF2b3JpdGVTZXJ2aWNlID0gdG9TaWduYWwoXHJcblx0XHR0aGlzLnN1YmplY3RzLnNhdmVGYXZvcml0ZS5waXBlKHN3aXRjaE1hcCgoZGF0YSkgPT4gdGhpcy5mYXZvcml0ZVBhZ2VzU2VydmljZS5zYXZlRmF2b3JpdGVQYWdlKGRhdGEpKSlcclxuXHQpO1xyXG5cclxuXHR1cGRhdGVGYXZvcml0ZVNlcnZpY2UgPSB0b1NpZ25hbChcclxuXHRcdHRoaXMuc3ViamVjdHMudXBkYXRlRmF2b3JpdGUucGlwZShcclxuXHRcdFx0c3dpdGNoTWFwKChkYXRhKSA9PiB0aGlzLmZhdm9yaXRlUGFnZXNTZXJ2aWNlLnVwZGF0ZUZhdm9yaXRlUGFnZSh0aGlzLm1vZGFsRGF0YS5mYXZvcml0ZT8uaWQgYXMgbnVtYmVyLCBkYXRhKSlcclxuXHRcdClcclxuXHQpO1xyXG5cclxuXHRjb25zdHJ1Y3RvcihcclxuXHRcdHByaXZhdGUgcmVhZG9ubHkgZm9ybUJ1aWxkZXI6IEZvcm1CdWlsZGVyLFxyXG5cdFx0cHJpdmF0ZSByZWFkb25seSBkaWFsb2dSZWY6IER5bmFtaWNEaWFsb2dSZWYsXHJcblx0XHRwcml2YXRlIHJlYWRvbmx5IGRpYWxvZ0NvbmZpZzogRHluYW1pY0RpYWxvZ0NvbmZpZyxcclxuXHRcdHByaXZhdGUgcmVhZG9ubHkgZmF2b3JpdGVQYWdlc1NlcnZpY2U6IEZhdm9yaXRlUGFnZXNTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSByZWFkb25seSBtZXNzYWdlU2VydmljZTogTWVzc2FnZVNlcnZpY2UsXHJcblx0XHRwcml2YXRlIHJlYWRvbmx5IHRyYW5zbG9jb1NlcnZpY2U6IFRyYW5zbG9jb1NlcnZpY2VcclxuXHQpIHtcclxuXHRcdHRoaXMubW9kYWxEYXRhID0gdGhpcy5kaWFsb2dDb25maWcuZGF0YTtcclxuXHRcdHRoaXMuaW5pdGlhbGl6ZUVmZmVjdHMoKTtcclxuXHRcdHRoaXMuaW5pdGlhbGl6ZUZvcm0oKTtcclxuXHR9XHJcblxyXG5cdG5nT25Jbml0KCk6IHZvaWQge1xyXG5cdFx0aWYgKCF0aGlzLm1vZGFsRGF0YSB8fCAhWydhZGQnLCAnZWRpdCddLmluY2x1ZGVzKHRoaXMubW9kYWxEYXRhLm1vZGUpKSB7XHJcblx0XHRcdHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdlcnJvcicpO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBpbml0aWFsaXplRWZmZWN0cygpOiB2b2lkIHtcclxuXHRcdC8vIFNhdmUgZmF2b3JpdGUgZWZmZWN0XHJcblx0XHRlZmZlY3QoXHJcblx0XHRcdCgpID0+IHtcclxuXHRcdFx0XHRjb25zdCBzZXJ2aWNlID0gdGhpcy5zYXZlRmF2b3JpdGVTZXJ2aWNlKCk7XHJcblx0XHRcdFx0aWYgKHNlcnZpY2U/LnJlc3BvbnNlKSB7XHJcblx0XHRcdFx0XHR0aGlzLm1lc3NhZ2VTZXJ2aWNlLmFkZCh7XHJcblx0XHRcdFx0XHRcdHNldmVyaXR5OiAnc3VjY2VzcycsXHJcblx0XHRcdFx0XHRcdHN1bW1hcnk6IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ2Zhdm9yaXRlUGFnZXMuc3VjY2VzcycpLFxyXG5cdFx0XHRcdFx0XHRkZXRhaWw6IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ2Zhdm9yaXRlUGFnZXMuc2F2ZVN1Y2Nlc3NmdWxseScpLFxyXG5cdFx0XHRcdFx0XHRrZXk6ICd0b2FzdC1yb290J1xyXG5cdFx0XHRcdFx0fSk7XHJcblx0XHRcdFx0XHR0aGlzLmRpYWxvZ1JlZi5jbG9zZSh7IHN0YXR1czogJ3N1Y2Nlc3MnLCBkYXRhOiBzZXJ2aWNlLnJlc3BvbnNlIH0pO1xyXG5cdFx0XHRcdH1cclxuXHRcdFx0fSxcclxuXHRcdFx0eyBhbGxvd1NpZ25hbFdyaXRlczogdHJ1ZSB9XHJcblx0XHQpO1xyXG5cclxuXHRcdC8vIFVwZGF0ZSBmYXZvcml0ZSBlZmZlY3RcclxuXHRcdGVmZmVjdChcclxuXHRcdFx0KCkgPT4ge1xyXG5cdFx0XHRcdGNvbnN0IHNlcnZpY2UgPSB0aGlzLnVwZGF0ZUZhdm9yaXRlU2VydmljZSgpO1xyXG5cdFx0XHRcdGlmIChzZXJ2aWNlPy5yZXNwb25zZSkge1xyXG5cdFx0XHRcdFx0dGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG5cdFx0XHRcdFx0XHRzZXZlcml0eTogJ3N1Y2Nlc3MnLFxyXG5cdFx0XHRcdFx0XHRzdW1tYXJ5OiB0aGlzLnRyYW5zbG9jb1NlcnZpY2UudHJhbnNsYXRlKCdmYXZvcml0ZVBhZ2VzLnN1Y2Nlc3MnKSxcclxuXHRcdFx0XHRcdFx0ZGV0YWlsOiB0aGlzLnRyYW5zbG9jb1NlcnZpY2UudHJhbnNsYXRlKCdmYXZvcml0ZVBhZ2VzLnVwZGF0ZWRTdWNjZXNzZnVsbHknKSxcclxuXHRcdFx0XHRcdFx0a2V5OiAndG9hc3Qtcm9vdCdcclxuXHRcdFx0XHRcdH0pO1xyXG5cdFx0XHRcdFx0dGhpcy5kaWFsb2dSZWYuY2xvc2UoeyBzdGF0dXM6ICdzdWNjZXNzJywgZGF0YTogc2VydmljZS5yZXNwb25zZSB9KTtcclxuXHRcdFx0XHR9XHJcblx0XHRcdH0sXHJcblx0XHRcdHsgYWxsb3dTaWduYWxXcml0ZXM6IHRydWUgfVxyXG5cdFx0KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgaW5pdGlhbGl6ZUZvcm0oKTogdm9pZCB7XHJcblx0XHRpZiAodGhpcy5tb2RhbERhdGEubW9kZSA9PT0gJ2FkZCcpIHtcclxuXHRcdFx0dGhpcy5mYXZvcml0ZUZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuXHRcdFx0XHRsYWJlbDogWycnLCBbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCldXSxcclxuXHRcdFx0XHR1cmw6IFt7IHZhbHVlOiB0aGlzLm1vZGFsRGF0YS51cmwgfHwgJycsIGRpc2FibGVkOiB0cnVlIH1dXHJcblx0XHRcdH0pO1xyXG5cdFx0fSBlbHNlIGlmICh0aGlzLm1vZGFsRGF0YS5tb2RlID09PSAnZWRpdCcgJiYgdGhpcy5tb2RhbERhdGEuZmF2b3JpdGUpIHtcclxuXHRcdFx0dGhpcy5mYXZvcml0ZUZvcm0gPSB0aGlzLmZvcm1CdWlsZGVyLmdyb3VwKHtcclxuXHRcdFx0XHRsYWJlbDogW1xyXG5cdFx0XHRcdFx0dGhpcy5tb2RhbERhdGEuZmF2b3JpdGUubGFiZWwsXHJcblx0XHRcdFx0XHRbVmFsaWRhdG9ycy5yZXF1aXJlZCwgVmFsaWRhdG9ycy5taW5MZW5ndGgoMSksIFZhbGlkYXRvcnMubWF4TGVuZ3RoKDEwMCldXHJcblx0XHRcdFx0XSxcclxuXHRcdFx0XHR1cmw6IFt7IHZhbHVlOiB0aGlzLm1vZGFsRGF0YS5mYXZvcml0ZS51cmwsIGRpc2FibGVkOiB0cnVlIH1dXHJcblx0XHRcdH0pO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0Z2V0IGlzQWRkTW9kZSgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLm1vZGFsRGF0YS5tb2RlID09PSAnYWRkJztcclxuXHR9XHJcblxyXG5cdGdldCBpc0VkaXRNb2RlKCk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMubW9kYWxEYXRhLm1vZGUgPT09ICdlZGl0JztcclxuXHR9XHJcblxyXG5cdHN1Ym1pdCgpOiB2b2lkIHtcclxuXHRcdGNvbnN0IGZvcm1WYWx1ZSA9IHRoaXMuZmF2b3JpdGVGb3JtLnZhbHVlO1xyXG5cclxuXHRcdGlmICh0aGlzLmlzQWRkTW9kZSkge1xyXG5cdFx0XHRjb25zdCBzYXZlUmVxdWVzdDogRmF2b3JpdGVQYWdlU2F2ZVJlcXVlc3REVE8gPSB7XHJcblx0XHRcdFx0dXJsOiB0aGlzLm1vZGFsRGF0YS51cmwhLFxyXG5cdFx0XHRcdGxhYmVsOiBmb3JtVmFsdWUubGFiZWwudHJpbSgpXHJcblx0XHRcdH07XHJcblx0XHRcdHRoaXMuc3ViamVjdHMuc2F2ZUZhdm9yaXRlLm5leHQoc2F2ZVJlcXVlc3QpO1xyXG5cdFx0fSBlbHNlIGlmICh0aGlzLmlzRWRpdE1vZGUgJiYgdGhpcy5tb2RhbERhdGEuZmF2b3JpdGUpIHtcclxuXHRcdFx0Y29uc3QgdXBkYXRlUmVxdWVzdDogYW55ID0ge1xyXG5cdFx0XHRcdGxhYmVsOiBmb3JtVmFsdWUubGFiZWwudHJpbSgpLFxyXG5cdFx0XHRcdHVybDogdGhpcy5tb2RhbERhdGEudXJsISxcclxuXHRcdFx0XHR2ZXJzaW9uOiB0aGlzLm1vZGFsRGF0YS5mYXZvcml0ZS52ZXJzaW9uXHJcblx0XHRcdH07XHJcblx0XHRcdHRoaXMuc3ViamVjdHMudXBkYXRlRmF2b3JpdGUubmV4dCh1cGRhdGVSZXF1ZXN0KTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdGNhbmNlbCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuZGlhbG9nUmVmLmNsb3NlKCdjYW5jZWwnKTtcclxuXHR9XHJcbn1cclxuIiwiPGRpdiAqdHJhbnNsb2NvPVwibGV0IHQ7IHJlYWQ6ICdmYXZvcml0ZVBhZ2VzJ1wiPlxyXG5cdDxhcmlsLWZvcm0gW2Zvcm1Hcm91cF09XCJmYXZvcml0ZUZvcm1cIj5cclxuXHRcdDxhcmlsLWZpZWxkIFtsYWJlbF09XCJ0KCdsYWJlbCcpXCIgW2NvbHNdPVwieyB4bDogMTIsIGxnOiAxMiwgbWQ6IDEyLCBzbTogMTIgfVwiIFttYXJrQXNSZXF1aXJlZF09XCJ0cnVlXCI+XHJcblx0XHRcdDxhcmlsLXRleHQgZm9ybUNvbnRyb2xOYW1lPVwibGFiZWxcIiBbcGxhY2Vob2xkZXJdPVwidCgnbGFiZWxQbGFjZWhvbGRlcicpXCI+IDwvYXJpbC10ZXh0PlxyXG5cdFx0PC9hcmlsLWZpZWxkPlxyXG5cclxuXHRcdDxhcmlsLWZpZWxkIFtsYWJlbF09XCJ0KCdwYXRoJylcIiBbY29sc109XCJ7IHhsOiAxMiwgbGc6IDEyLCBtZDogMTIsIHNtOiAxMiB9XCI+XHJcblx0XHRcdDxhcmlsLXRleHQgZm9ybUNvbnRyb2xOYW1lPVwidXJsXCI+IDwvYXJpbC10ZXh0PlxyXG5cdFx0PC9hcmlsLWZpZWxkPlxyXG5cclxuXHRcdDxkaXYgY2xhc3M9XCJjb2wtMTIgZmxleCBqdXN0aWZ5LWNvbnRlbnQtZW5kIG10LTQgZ2FwLTJcIj5cclxuXHRcdFx0PGFyaWwtYnV0dG9uXHJcblx0XHRcdFx0Y29sb3I9XCJkYW5nZXJcIlxyXG5cdFx0XHRcdFtsYWJlbF09XCJ0KCdjYW5jZWwnKVwiXHJcblx0XHRcdFx0W291dGxpbmVkXT1cInRydWVcIlxyXG5cdFx0XHRcdGljb249XCJUSU1FU1wiXHJcblx0XHRcdFx0KGNsaWNrRXZlbnQpPVwiY2FuY2VsKClcIj5cclxuXHRcdFx0PC9hcmlsLWJ1dHRvbj5cclxuXHRcdFx0PGFyaWwtZm9ybS1zdWJtaXRcclxuXHRcdFx0XHRbbGFiZWxdPVwidCgnc2F2ZScpXCJcclxuXHRcdFx0XHRjb2xvcj1cInN1Y2Nlc3NcIlxyXG5cdFx0XHRcdGljb249XCJDSEVDS1wiXHJcblx0XHRcdFx0W2Zvcm1Hcm91cF09XCJmYXZvcml0ZUZvcm1cIlxyXG5cdFx0XHRcdCh2YWxpZEV2ZW50KT1cInN1Ym1pdCgpXCIgLz5cclxuXHRcdDwvZGl2PlxyXG5cdDwvYXJpbC1mb3JtPlxyXG48L2Rpdj5cclxuIl19
@@ -0,0 +1,128 @@
1
+ import { CommonModule } from '@angular/common';
2
+ import { Component, signal } from '@angular/core';
3
+ import { FormsModule } from '@angular/forms';
4
+ import { ConfirmationService } from 'primeng/api';
5
+ import { BadgeModule } from 'primeng/badge';
6
+ import { ConfirmDialogModule } from 'primeng/confirmdialog';
7
+ import { InputTextModule } from 'primeng/inputtext';
8
+ import { ScrollPanelModule } from 'primeng/scrollpanel';
9
+ import { SidebarModule } from 'primeng/sidebar';
10
+ import { TooltipModule } from 'primeng/tooltip';
11
+ import { TranslocoModule } from '@ngneat/transloco';
12
+ import { Subject, takeUntil } from 'rxjs';
13
+ import { ButtonComponent } from 'aril/ui/button';
14
+ import { TextComponent } from 'aril/ui/text';
15
+ import * as i0 from "@angular/core";
16
+ import * as i1 from "../../service/app.layout.service";
17
+ import * as i2 from "./history.service";
18
+ import * as i3 from "primeng/api";
19
+ import * as i4 from "@ngneat/transloco";
20
+ import * as i5 from "@angular/forms";
21
+ import * as i6 from "primeng/sidebar";
22
+ import * as i7 from "primeng/scrollpanel";
23
+ import * as i8 from "primeng/confirmdialog";
24
+ import * as i9 from "primeng/tooltip";
25
+ export class HistorySidebarComponent {
26
+ constructor(layoutService, historyService, confirmationService, messageService, translocoService) {
27
+ this.layoutService = layoutService;
28
+ this.historyService = historyService;
29
+ this.confirmationService = confirmationService;
30
+ this.messageService = messageService;
31
+ this.translocoService = translocoService;
32
+ this.history = signal([]);
33
+ this.filteredHistory = signal([]);
34
+ this.searchTerm = signal('');
35
+ this.destroy$ = new Subject();
36
+ }
37
+ ngOnInit() {
38
+ this.historyService.history$.pipe(takeUntil(this.destroy$)).subscribe((history) => {
39
+ this.history.set(history);
40
+ this.applyFilter();
41
+ });
42
+ }
43
+ ngOnDestroy() {
44
+ this.destroy$.next();
45
+ this.destroy$.complete();
46
+ }
47
+ get visible() {
48
+ return this.layoutService.state.historySidebarVisible;
49
+ }
50
+ set visible(value) {
51
+ this.layoutService.state.historySidebarVisible = value;
52
+ }
53
+ onSearchChange() {
54
+ this.applyFilter();
55
+ }
56
+ applyFilter() {
57
+ const searchTerm = this.searchTerm();
58
+ if (!searchTerm.trim()) {
59
+ this.filteredHistory.set(this.history());
60
+ }
61
+ else {
62
+ const filtered = this.historyService.getHistoryItemsBySearchTerm(searchTerm);
63
+ this.filteredHistory.set(filtered);
64
+ }
65
+ }
66
+ navigateToItem(item) {
67
+ this.historyService.navigateToHistoryItem(item);
68
+ this.visible = false;
69
+ }
70
+ clearAllHistory(event) {
71
+ this.confirmationService.confirm({
72
+ target: event.target,
73
+ message: this.translocoService.translate('history.confirmClearAllMessage'),
74
+ header: this.translocoService.translate('history.deleteConfirmation'),
75
+ icon: 'pi pi-info-circle',
76
+ acceptLabel: this.translocoService.translate('history.acceptButtonLabel'),
77
+ rejectLabel: this.translocoService.translate('history.rejectButtonLabel'),
78
+ acceptButtonStyleClass: 'p-button-success',
79
+ rejectButtonStyleClass: 'p-button-danger p-button-outlined',
80
+ accept: () => {
81
+ this.historyService.clearHistory();
82
+ this.messageService.add({
83
+ severity: 'success',
84
+ summary: this.translocoService.translate('history.acceptButtonLabel'),
85
+ detail: this.translocoService.translate('history.clearAll')
86
+ });
87
+ }
88
+ });
89
+ }
90
+ trackByItemId(index, item) {
91
+ return item.id || index;
92
+ }
93
+ getLocalizedTitle(item) {
94
+ const currentLang = this.translocoService.getActiveLang();
95
+ // Use multiLanguageTitle if available
96
+ if (item.multiLanguageTitle) {
97
+ const localizedTitle = item.multiLanguageTitle[currentLang];
98
+ if (localizedTitle) {
99
+ return localizedTitle;
100
+ }
101
+ // Fallback to Turkish if current language not available
102
+ if (item.multiLanguageTitle.tr) {
103
+ return item.multiLanguageTitle.tr;
104
+ }
105
+ }
106
+ // Fallback to original title
107
+ return item.title;
108
+ }
109
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: HistorySidebarComponent, deps: [{ token: i1.LayoutService }, { token: i2.HistoryService }, { token: i3.ConfirmationService }, { token: i3.MessageService }, { token: i4.TranslocoService }], target: i0.ɵɵFactoryTarget.Component }); }
110
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.1.2", type: HistorySidebarComponent, isStandalone: true, selector: "app-history-sidebar", providers: [ConfirmationService], 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-history-sidebar w-full sm:w-30rem\"\r\n\t*transloco=\"let t; read: 'history'\">\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-history text-primary text-xl\"></i>\r\n\t\t\t\t<span class=\"font-bold text-lg\">{{ t('pageHistory') }}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</ng-template>\r\n\r\n\t<div class=\"history-content\">\r\n\t\t@if (history().length > 0) {\r\n\t\t\t<div class=\"search-section\">\r\n\t\t\t\t<div class=\"search-input-container\">\r\n\t\t\t\t\t<aril-text\r\n\t\t\t\t\t\tclass=\"w-full\"\r\n\t\t\t\t\t\t[placeholder]=\"t('searchHistory')\"\r\n\t\t\t\t\t\t[(ngModel)]=\"searchTerm\"\r\n\t\t\t\t\t\t(ngModelChange)=\"onSearchChange()\">\r\n\t\t\t\t\t</aril-text>\r\n\r\n\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\ticon=\"TRASH\"\r\n\t\t\t\t\t\tcolor=\"danger\"\r\n\t\t\t\t\t\tsize=\"sm\"\r\n\t\t\t\t\t\tclass=\"ml-1\"\r\n\t\t\t\t\t\t[pTooltip]=\"t('confirmClearAll')\"\r\n\t\t\t\t\t\ttooltipPosition=\"left\"\r\n\t\t\t\t\t\t(clickEvent)=\"clearAllHistory($event)\">\r\n\t\t\t\t\t</aril-button>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t}\r\n\r\n\t\t@if (filteredHistory().length > 0) {\r\n\t\t\t<div class=\"history-list\">\r\n\t\t\t\t<p-scrollPanel [style]=\"{ width: '100%', height: '100%' }\">\r\n\t\t\t\t\t<div class=\"history-items\">\r\n\t\t\t\t\t\t@for (item of filteredHistory(); track trackByItemId($index, item)) {\r\n\t\t\t\t\t\t\t<div class=\"history-item\" (click)=\"navigateToItem(item)\">\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<i class=\"pi pi-external-link text-primary mr-2\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"title-info\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"title-text\">{{ getLocalizedTitle(item) }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"route-text\">{{ item.url }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\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-history empty-icon\"></i>\r\n\t\t\t\t\t<h3 class=\"empty-title\">\r\n\t\t\t\t\t\t{{ searchTerm() ? t('noSearchResults') : t('noHistory') }}\r\n\t\t\t\t\t</h3>\r\n\t\t\t\t\t<p class=\"empty-message\">\r\n\t\t\t\t\t\t{{ searchTerm() ? t('tryDifferentKeywords') : t('startBrowsing') }}\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t@if (searchTerm()) {\r\n\t\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\t\t[label]=\"t('clearSearch')\"\r\n\t\t\t\t\t\t\ticon=\"TIMES\"\r\n\t\t\t\t\t\t\tcolor=\"secondary\"\r\n\t\t\t\t\t\t\t[outlined]=\"true\"\r\n\t\t\t\t\t\t\tsize=\"sm\"\r\n\t\t\t\t\t\t\t(clickEvent)=\"searchTerm.set(''); onSearchChange()\">\r\n\t\t\t\t\t\t</aril-button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t}\r\n\t</div>\r\n\r\n\t<p-confirmDialog></p-confirmDialog>\r\n</p-sidebar>\r\n", styles: [":host ::ng-deep .layout-history-sidebar .p-sidebar-content{padding:0;background:var(--surface-ground)}:host ::ng-deep .layout-history-sidebar .p-sidebar-header{background:var(--primary-color);color:var(--primary-color-text);border-bottom:1px solid var(--primary-600);padding:1rem .5rem}:host ::ng-deep .layout-history-sidebar .p-sidebar-header i{color:var(--primary-color-text);font-size:1.1rem}:host ::ng-deep .layout-history-sidebar .p-sidebar-header span{font-size:1.1rem;font-weight:600;color:var(--primary-color-text)}.history-content{display:flex;flex-direction:column;height:92vh;background:var(--surface-0)}.search-section{padding:1rem;border-bottom:1px solid var(--surface-border);background:var(--surface-0);width:100%}.search-input-container{display:flex;align-items:center;justify-content:space-between;width:100%}.history-list{flex:1;overflow:hidden}.history-items{padding:.5rem}.history-item{background:var(--surface-0);border:1px solid var(--surface-border);border-radius:8px;margin-bottom:.5rem;cursor:pointer;transition:all .2s ease;position:relative;overflow:hidden}.history-item:hover{border-color:var(--primary-200);background:var(--primary-50);transform:translateY(-1px);box-shadow:0 2px 8px #0000001a}.history-item:hover .remove-btn{opacity:1}.history-item:last-child{margin-bottom:0}.item-content{padding:1rem .75rem}.item-header{display:flex;align-items:center;justify-content:space-between}.item-title{display:flex;align-items:center;flex:1;min-width:0}.item-title .title-info{display:flex;flex-direction:column;flex:1;min-width:0}.item-title .title-text{font-weight:600;color:var(--text-color);font-size:1rem;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.item-title .route-text{font-size:.75rem;color:var(--text-color-secondary);font-weight:400;line-height:1.2;margin-top:.25rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.8}.empty-state{flex:1;display:flex;align-items:center;justify-content:center;padding:2rem}.empty-content{text-align:center;max-width:300px}.empty-icon{font-size:3rem;color:var(--text-color-secondary);margin-bottom:1rem;opacity:.5}.empty-title{font-size:1.1rem;font-weight:600;color:var(--text-color);margin-bottom:.5rem}.empty-message{font-size:.9rem;color:var(--text-color-secondary);line-height:1.4;margin-bottom:1.5rem}@media (max-width: 768px){.history-content{height:calc(100vh - 3.5rem)}.search-section{padding:.75rem}.item-content{padding:.5rem}.item-title .title-text{font-size:.85rem}}:host ::ng-deep .p-scrollpanel-bar-y{background:var(--primary-200);width:4px;border-radius:2px}:host ::ng-deep .p-scrollpanel-bar-y:hover{background:var(--primary-300)}\n"], dependencies: [{ kind: "ngmodule", type: CommonModule }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i5.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i5.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: SidebarModule }, { kind: "component", type: i6.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: "component", type: ButtonComponent, selector: "aril-button:not([click])", inputs: ["label", "loading", "disabled", "raised", "outlined", "badge", "size", "icon", "color"], outputs: ["clickEvent"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "ngmodule", type: ScrollPanelModule }, { kind: "component", type: i7.ScrollPanel, selector: "p-scrollPanel", inputs: ["style", "styleClass", "step"] }, { kind: "ngmodule", type: ConfirmDialogModule }, { kind: "component", type: i8.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: TooltipModule }, { kind: "directive", type: i9.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: TranslocoModule }, { kind: "directive", type: i4.TranslocoDirective, selector: "[transloco]", inputs: ["transloco", "translocoParams", "translocoScope", "translocoRead", "translocoLang", "translocoLoadingTpl"] }, { kind: "component", type: TextComponent, selector: "aril-text[ngModel], aril-text[formControl], aril-text[formControlName]", inputs: ["placeholder", "tabindex", "icon", "iconPos", "size"] }] }); }
111
+ }
112
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: HistorySidebarComponent, decorators: [{
113
+ type: Component,
114
+ args: [{ standalone: true, selector: 'app-history-sidebar', imports: [
115
+ CommonModule,
116
+ FormsModule,
117
+ SidebarModule,
118
+ ButtonComponent,
119
+ InputTextModule,
120
+ ScrollPanelModule,
121
+ ConfirmDialogModule,
122
+ TooltipModule,
123
+ BadgeModule,
124
+ TranslocoModule,
125
+ TextComponent
126
+ ], providers: [ConfirmationService], 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-history-sidebar w-full sm:w-30rem\"\r\n\t*transloco=\"let t; read: 'history'\">\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-history text-primary text-xl\"></i>\r\n\t\t\t\t<span class=\"font-bold text-lg\">{{ t('pageHistory') }}</span>\r\n\t\t\t</div>\r\n\t\t</div>\r\n\t</ng-template>\r\n\r\n\t<div class=\"history-content\">\r\n\t\t@if (history().length > 0) {\r\n\t\t\t<div class=\"search-section\">\r\n\t\t\t\t<div class=\"search-input-container\">\r\n\t\t\t\t\t<aril-text\r\n\t\t\t\t\t\tclass=\"w-full\"\r\n\t\t\t\t\t\t[placeholder]=\"t('searchHistory')\"\r\n\t\t\t\t\t\t[(ngModel)]=\"searchTerm\"\r\n\t\t\t\t\t\t(ngModelChange)=\"onSearchChange()\">\r\n\t\t\t\t\t</aril-text>\r\n\r\n\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\ticon=\"TRASH\"\r\n\t\t\t\t\t\tcolor=\"danger\"\r\n\t\t\t\t\t\tsize=\"sm\"\r\n\t\t\t\t\t\tclass=\"ml-1\"\r\n\t\t\t\t\t\t[pTooltip]=\"t('confirmClearAll')\"\r\n\t\t\t\t\t\ttooltipPosition=\"left\"\r\n\t\t\t\t\t\t(clickEvent)=\"clearAllHistory($event)\">\r\n\t\t\t\t\t</aril-button>\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t}\r\n\r\n\t\t@if (filteredHistory().length > 0) {\r\n\t\t\t<div class=\"history-list\">\r\n\t\t\t\t<p-scrollPanel [style]=\"{ width: '100%', height: '100%' }\">\r\n\t\t\t\t\t<div class=\"history-items\">\r\n\t\t\t\t\t\t@for (item of filteredHistory(); track trackByItemId($index, item)) {\r\n\t\t\t\t\t\t\t<div class=\"history-item\" (click)=\"navigateToItem(item)\">\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<i class=\"pi pi-external-link text-primary mr-2\"></i>\r\n\t\t\t\t\t\t\t\t\t\t\t<div class=\"title-info\">\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"title-text\">{{ getLocalizedTitle(item) }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t\t<span class=\"route-text\">{{ item.url }}</span>\r\n\t\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t\t</div>\r\n\t\t\t\t\t\t\t\t\t</div>\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-history empty-icon\"></i>\r\n\t\t\t\t\t<h3 class=\"empty-title\">\r\n\t\t\t\t\t\t{{ searchTerm() ? t('noSearchResults') : t('noHistory') }}\r\n\t\t\t\t\t</h3>\r\n\t\t\t\t\t<p class=\"empty-message\">\r\n\t\t\t\t\t\t{{ searchTerm() ? t('tryDifferentKeywords') : t('startBrowsing') }}\r\n\t\t\t\t\t</p>\r\n\t\t\t\t\t@if (searchTerm()) {\r\n\t\t\t\t\t\t<aril-button\r\n\t\t\t\t\t\t\t[label]=\"t('clearSearch')\"\r\n\t\t\t\t\t\t\ticon=\"TIMES\"\r\n\t\t\t\t\t\t\tcolor=\"secondary\"\r\n\t\t\t\t\t\t\t[outlined]=\"true\"\r\n\t\t\t\t\t\t\tsize=\"sm\"\r\n\t\t\t\t\t\t\t(clickEvent)=\"searchTerm.set(''); onSearchChange()\">\r\n\t\t\t\t\t\t</aril-button>\r\n\t\t\t\t\t}\r\n\t\t\t\t</div>\r\n\t\t\t</div>\r\n\t\t}\r\n\t</div>\r\n\r\n\t<p-confirmDialog></p-confirmDialog>\r\n</p-sidebar>\r\n", styles: [":host ::ng-deep .layout-history-sidebar .p-sidebar-content{padding:0;background:var(--surface-ground)}:host ::ng-deep .layout-history-sidebar .p-sidebar-header{background:var(--primary-color);color:var(--primary-color-text);border-bottom:1px solid var(--primary-600);padding:1rem .5rem}:host ::ng-deep .layout-history-sidebar .p-sidebar-header i{color:var(--primary-color-text);font-size:1.1rem}:host ::ng-deep .layout-history-sidebar .p-sidebar-header span{font-size:1.1rem;font-weight:600;color:var(--primary-color-text)}.history-content{display:flex;flex-direction:column;height:92vh;background:var(--surface-0)}.search-section{padding:1rem;border-bottom:1px solid var(--surface-border);background:var(--surface-0);width:100%}.search-input-container{display:flex;align-items:center;justify-content:space-between;width:100%}.history-list{flex:1;overflow:hidden}.history-items{padding:.5rem}.history-item{background:var(--surface-0);border:1px solid var(--surface-border);border-radius:8px;margin-bottom:.5rem;cursor:pointer;transition:all .2s ease;position:relative;overflow:hidden}.history-item:hover{border-color:var(--primary-200);background:var(--primary-50);transform:translateY(-1px);box-shadow:0 2px 8px #0000001a}.history-item:hover .remove-btn{opacity:1}.history-item:last-child{margin-bottom:0}.item-content{padding:1rem .75rem}.item-header{display:flex;align-items:center;justify-content:space-between}.item-title{display:flex;align-items:center;flex:1;min-width:0}.item-title .title-info{display:flex;flex-direction:column;flex:1;min-width:0}.item-title .title-text{font-weight:600;color:var(--text-color);font-size:1rem;line-height:1.3;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.item-title .route-text{font-size:.75rem;color:var(--text-color-secondary);font-weight:400;line-height:1.2;margin-top:.25rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;opacity:.8}.empty-state{flex:1;display:flex;align-items:center;justify-content:center;padding:2rem}.empty-content{text-align:center;max-width:300px}.empty-icon{font-size:3rem;color:var(--text-color-secondary);margin-bottom:1rem;opacity:.5}.empty-title{font-size:1.1rem;font-weight:600;color:var(--text-color);margin-bottom:.5rem}.empty-message{font-size:.9rem;color:var(--text-color-secondary);line-height:1.4;margin-bottom:1.5rem}@media (max-width: 768px){.history-content{height:calc(100vh - 3.5rem)}.search-section{padding:.75rem}.item-content{padding:.5rem}.item-title .title-text{font-size:.85rem}}:host ::ng-deep .p-scrollpanel-bar-y{background:var(--primary-200);width:4px;border-radius:2px}:host ::ng-deep .p-scrollpanel-bar-y:hover{background:var(--primary-300)}\n"] }]
127
+ }], ctorParameters: () => [{ type: i1.LayoutService }, { type: i2.HistoryService }, { type: i3.ConfirmationService }, { type: i3.MessageService }, { type: i4.TranslocoService }] });
128
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS1zaWRlYmFyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2FyaWwvdGhlbWUvbGF5b3V0L2FwcC9oaXN0b3J5L2hpc3Rvcnktc2lkZWJhci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hcmlsL3RoZW1lL2xheW91dC9hcHAvaGlzdG9yeS9oaXN0b3J5LXNpZGViYXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQXFCLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNyRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFN0MsT0FBTyxFQUFFLG1CQUFtQixFQUFrQixNQUFNLGFBQWEsQ0FBQztBQUNsRSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBQzVELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxtQkFBbUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDaEQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRWhELE9BQU8sRUFBRSxlQUFlLEVBQW9CLE1BQU0sbUJBQW1CLENBQUM7QUFDdEUsT0FBTyxFQUFFLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFFMUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxjQUFjLENBQUM7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MEJDdkNqQyw0dEdBd0ZBLGtxRkQvREUsWUFBWSw4QkFDWixXQUFXLDhWQUNYLGFBQWEsb2RBQ2IsZUFBZSwrTEFDZixlQUFlLDhCQUNmLGlCQUFpQiwrSUFDakIsbUJBQW1CLG9tQkFDbkIsYUFBYSxxWEFDYixXQUFXLDhCQUNYLGVBQWUsaU9BQ2YsYUFBYTs7MkZBTUYsdUJBQXVCO2tCQXBCbkMsU0FBUztpQ0FDRyxJQUFJLFlBQ04scUJBQXFCLFdBQ3RCO3dCQUNSLFlBQVk7d0JBQ1osV0FBVzt3QkFDWCxhQUFhO3dCQUNiLGVBQWU7d0JBQ2YsZUFBZTt3QkFDZixpQkFBaUI7d0JBQ2pCLG1CQUFtQjt3QkFDbkIsYUFBYTt3QkFDYixXQUFXO3dCQUNYLGVBQWU7d0JBQ2YsYUFBYTtxQkFDYixhQUdVLENBQUMsbUJBQW1CLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21tb25Nb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uRGVzdHJveSwgT25Jbml0LCBzaWduYWwgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcblxyXG5pbXBvcnQgeyBDb25maXJtYXRpb25TZXJ2aWNlLCBNZXNzYWdlU2VydmljZSB9IGZyb20gJ3ByaW1lbmcvYXBpJztcclxuaW1wb3J0IHsgQmFkZ2VNb2R1bGUgfSBmcm9tICdwcmltZW5nL2JhZGdlJztcclxuaW1wb3J0IHsgQ29uZmlybURpYWxvZ01vZHVsZSB9IGZyb20gJ3ByaW1lbmcvY29uZmlybWRpYWxvZyc7XHJcbmltcG9ydCB7IElucHV0VGV4dE1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvaW5wdXR0ZXh0JztcclxuaW1wb3J0IHsgU2Nyb2xsUGFuZWxNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Njcm9sbHBhbmVsJztcclxuaW1wb3J0IHsgU2lkZWJhck1vZHVsZSB9IGZyb20gJ3ByaW1lbmcvc2lkZWJhcic7XHJcbmltcG9ydCB7IFRvb2x0aXBNb2R1bGUgfSBmcm9tICdwcmltZW5nL3Rvb2x0aXAnO1xyXG5cclxuaW1wb3J0IHsgVHJhbnNsb2NvTW9kdWxlLCBUcmFuc2xvY29TZXJ2aWNlIH0gZnJvbSAnQG5nbmVhdC90cmFuc2xvY28nO1xyXG5pbXBvcnQgeyBTdWJqZWN0LCB0YWtlVW50aWwgfSBmcm9tICdyeGpzJztcclxuXHJcbmltcG9ydCB7IEJ1dHRvbkNvbXBvbmVudCB9IGZyb20gJ2FyaWwvdWkvYnV0dG9uJztcclxuaW1wb3J0IHsgVGV4dENvbXBvbmVudCB9IGZyb20gJ2FyaWwvdWkvdGV4dCc7XHJcblxyXG5pbXBvcnQgeyBMYXlvdXRTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZS9hcHAubGF5b3V0LnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBIaXN0b3J5SXRlbSwgSGlzdG9yeVNlcnZpY2UgfSBmcm9tICcuL2hpc3Rvcnkuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuXHRzdGFuZGFsb25lOiB0cnVlLFxyXG5cdHNlbGVjdG9yOiAnYXBwLWhpc3Rvcnktc2lkZWJhcicsXHJcblx0aW1wb3J0czogW1xyXG5cdFx0Q29tbW9uTW9kdWxlLFxyXG5cdFx0Rm9ybXNNb2R1bGUsXHJcblx0XHRTaWRlYmFyTW9kdWxlLFxyXG5cdFx0QnV0dG9uQ29tcG9uZW50LFxyXG5cdFx0SW5wdXRUZXh0TW9kdWxlLFxyXG5cdFx0U2Nyb2xsUGFuZWxNb2R1bGUsXHJcblx0XHRDb25maXJtRGlhbG9nTW9kdWxlLFxyXG5cdFx0VG9vbHRpcE1vZHVsZSxcclxuXHRcdEJhZGdlTW9kdWxlLFxyXG5cdFx0VHJhbnNsb2NvTW9kdWxlLFxyXG5cdFx0VGV4dENvbXBvbmVudFxyXG5cdF0sXHJcblx0dGVtcGxhdGVVcmw6ICcuL2hpc3Rvcnktc2lkZWJhci5jb21wb25lbnQuaHRtbCcsXHJcblx0c3R5bGVVcmxzOiBbJy4vaGlzdG9yeS1zaWRlYmFyLmNvbXBvbmVudC5zY3NzJ10sXHJcblx0cHJvdmlkZXJzOiBbQ29uZmlybWF0aW9uU2VydmljZV1cclxufSlcclxuZXhwb3J0IGNsYXNzIEhpc3RvcnlTaWRlYmFyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xyXG5cdGhpc3RvcnkgPSBzaWduYWw8SGlzdG9yeUl0ZW1bXT4oW10pO1xyXG5cdGZpbHRlcmVkSGlzdG9yeSA9IHNpZ25hbDxIaXN0b3J5SXRlbVtdPihbXSk7XHJcblx0c2VhcmNoVGVybSA9IHNpZ25hbDxzdHJpbmc+KCcnKTtcclxuXHJcblx0cHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XHJcblxyXG5cdGNvbnN0cnVjdG9yKFxyXG5cdFx0cHVibGljIGxheW91dFNlcnZpY2U6IExheW91dFNlcnZpY2UsXHJcblx0XHRwcml2YXRlIGhpc3RvcnlTZXJ2aWNlOiBIaXN0b3J5U2VydmljZSxcclxuXHRcdHByaXZhdGUgY29uZmlybWF0aW9uU2VydmljZTogQ29uZmlybWF0aW9uU2VydmljZSxcclxuXHRcdHByaXZhdGUgbWVzc2FnZVNlcnZpY2U6IE1lc3NhZ2VTZXJ2aWNlLFxyXG5cdFx0cHJpdmF0ZSB0cmFuc2xvY29TZXJ2aWNlOiBUcmFuc2xvY29TZXJ2aWNlXHJcblx0KSB7fVxyXG5cclxuXHRuZ09uSW5pdCgpOiB2b2lkIHtcclxuXHRcdHRoaXMuaGlzdG9yeVNlcnZpY2UuaGlzdG9yeSQucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSgoaGlzdG9yeSkgPT4ge1xyXG5cdFx0XHR0aGlzLmhpc3Rvcnkuc2V0KGhpc3RvcnkpO1xyXG5cdFx0XHR0aGlzLmFwcGx5RmlsdGVyKCk7XHJcblx0XHR9KTtcclxuXHR9XHJcblxyXG5cdG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG5cdFx0dGhpcy5kZXN0cm95JC5uZXh0KCk7XHJcblx0XHR0aGlzLmRlc3Ryb3kkLmNvbXBsZXRlKCk7XHJcblx0fVxyXG5cclxuXHRnZXQgdmlzaWJsZSgpOiBib29sZWFuIHtcclxuXHRcdHJldHVybiB0aGlzLmxheW91dFNlcnZpY2Uuc3RhdGUuaGlzdG9yeVNpZGViYXJWaXNpYmxlO1xyXG5cdH1cclxuXHJcblx0c2V0IHZpc2libGUodmFsdWU6IGJvb2xlYW4pIHtcclxuXHRcdHRoaXMubGF5b3V0U2VydmljZS5zdGF0ZS5oaXN0b3J5U2lkZWJhclZpc2libGUgPSB2YWx1ZTtcclxuXHR9XHJcblxyXG5cdG9uU2VhcmNoQ2hhbmdlKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5hcHBseUZpbHRlcigpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhcHBseUZpbHRlcigpOiB2b2lkIHtcclxuXHRcdGNvbnN0IHNlYXJjaFRlcm0gPSB0aGlzLnNlYXJjaFRlcm0oKTtcclxuXHRcdGlmICghc2VhcmNoVGVybS50cmltKCkpIHtcclxuXHRcdFx0dGhpcy5maWx0ZXJlZEhpc3Rvcnkuc2V0KHRoaXMuaGlzdG9yeSgpKTtcclxuXHRcdH0gZWxzZSB7XHJcblx0XHRcdGNvbnN0IGZpbHRlcmVkID0gdGhpcy5oaXN0b3J5U2VydmljZS5nZXRIaXN0b3J5SXRlbXNCeVNlYXJjaFRlcm0oc2VhcmNoVGVybSk7XHJcblx0XHRcdHRoaXMuZmlsdGVyZWRIaXN0b3J5LnNldChmaWx0ZXJlZCk7XHJcblx0XHR9XHJcblx0fVxyXG5cclxuXHRuYXZpZ2F0ZVRvSXRlbShpdGVtOiBIaXN0b3J5SXRlbSk6IHZvaWQge1xyXG5cdFx0dGhpcy5oaXN0b3J5U2VydmljZS5uYXZpZ2F0ZVRvSGlzdG9yeUl0ZW0oaXRlbSk7XHJcblx0XHR0aGlzLnZpc2libGUgPSBmYWxzZTtcclxuXHR9XHJcblxyXG5cdGNsZWFyQWxsSGlzdG9yeShldmVudDogRXZlbnQpOiB2b2lkIHtcclxuXHRcdHRoaXMuY29uZmlybWF0aW9uU2VydmljZS5jb25maXJtKHtcclxuXHRcdFx0dGFyZ2V0OiBldmVudC50YXJnZXQgYXMgRXZlbnRUYXJnZXQsXHJcblx0XHRcdG1lc3NhZ2U6IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ2hpc3RvcnkuY29uZmlybUNsZWFyQWxsTWVzc2FnZScpLFxyXG5cdFx0XHRoZWFkZXI6IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ2hpc3RvcnkuZGVsZXRlQ29uZmlybWF0aW9uJyksXHJcblx0XHRcdGljb246ICdwaSBwaS1pbmZvLWNpcmNsZScsXHJcblx0XHRcdGFjY2VwdExhYmVsOiB0aGlzLnRyYW5zbG9jb1NlcnZpY2UudHJhbnNsYXRlKCdoaXN0b3J5LmFjY2VwdEJ1dHRvbkxhYmVsJyksXHJcblx0XHRcdHJlamVjdExhYmVsOiB0aGlzLnRyYW5zbG9jb1NlcnZpY2UudHJhbnNsYXRlKCdoaXN0b3J5LnJlamVjdEJ1dHRvbkxhYmVsJyksXHJcblx0XHRcdGFjY2VwdEJ1dHRvblN0eWxlQ2xhc3M6ICdwLWJ1dHRvbi1zdWNjZXNzJyxcclxuXHRcdFx0cmVqZWN0QnV0dG9uU3R5bGVDbGFzczogJ3AtYnV0dG9uLWRhbmdlciBwLWJ1dHRvbi1vdXRsaW5lZCcsXHJcblx0XHRcdGFjY2VwdDogKCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuaGlzdG9yeVNlcnZpY2UuY2xlYXJIaXN0b3J5KCk7XHJcblx0XHRcdFx0dGhpcy5tZXNzYWdlU2VydmljZS5hZGQoe1xyXG5cdFx0XHRcdFx0c2V2ZXJpdHk6ICdzdWNjZXNzJyxcclxuXHRcdFx0XHRcdHN1bW1hcnk6IHRoaXMudHJhbnNsb2NvU2VydmljZS50cmFuc2xhdGUoJ2hpc3RvcnkuYWNjZXB0QnV0dG9uTGFiZWwnKSxcclxuXHRcdFx0XHRcdGRldGFpbDogdGhpcy50cmFuc2xvY29TZXJ2aWNlLnRyYW5zbGF0ZSgnaGlzdG9yeS5jbGVhckFsbCcpXHJcblx0XHRcdFx0fSk7XHJcblx0XHRcdH1cclxuXHRcdH0pO1xyXG5cdH1cclxuXHJcblx0dHJhY2tCeUl0ZW1JZChpbmRleDogbnVtYmVyLCBpdGVtOiBIaXN0b3J5SXRlbSkge1xyXG5cdFx0cmV0dXJuIGl0ZW0uaWQgfHwgaW5kZXg7XHJcblx0fVxyXG5cclxuXHRnZXRMb2NhbGl6ZWRUaXRsZShpdGVtOiBIaXN0b3J5SXRlbSk6IHN0cmluZyB7XHJcblx0XHRjb25zdCBjdXJyZW50TGFuZyA9IHRoaXMudHJhbnNsb2NvU2VydmljZS5nZXRBY3RpdmVMYW5nKCkgYXMgJ3RyJyB8ICdlbic7XHJcblxyXG5cdFx0Ly8gVXNlIG11bHRpTGFuZ3VhZ2VUaXRsZSBpZiBhdmFpbGFibGVcclxuXHRcdGlmIChpdGVtLm11bHRpTGFuZ3VhZ2VUaXRsZSkge1xyXG5cdFx0XHRjb25zdCBsb2NhbGl6ZWRUaXRsZSA9IGl0ZW0ubXVsdGlMYW5ndWFnZVRpdGxlW2N1cnJlbnRMYW5nXTtcclxuXHRcdFx0aWYgKGxvY2FsaXplZFRpdGxlKSB7XHJcblx0XHRcdFx0cmV0dXJuIGxvY2FsaXplZFRpdGxlO1xyXG5cdFx0XHR9XHJcblx0XHRcdC8vIEZhbGxiYWNrIHRvIFR1cmtpc2ggaWYgY3VycmVudCBsYW5ndWFnZSBub3QgYXZhaWxhYmxlXHJcblx0XHRcdGlmIChpdGVtLm11bHRpTGFuZ3VhZ2VUaXRsZS50cikge1xyXG5cdFx0XHRcdHJldHVybiBpdGVtLm11bHRpTGFuZ3VhZ2VUaXRsZS50cjtcclxuXHRcdFx0fVxyXG5cdFx0fVxyXG5cclxuXHRcdC8vIEZhbGxiYWNrIHRvIG9yaWdpbmFsIHRpdGxlXHJcblx0XHRyZXR1cm4gaXRlbS50aXRsZTtcclxuXHR9XHJcbn1cclxuIiwiPHAtc2lkZWJhclxyXG5cdFsodmlzaWJsZSldPVwidmlzaWJsZVwiXHJcblx0cG9zaXRpb249XCJyaWdodFwiXHJcblx0W3RyYW5zaXRpb25PcHRpb25zXT1cIicuM3MgY3ViaWMtYmV6aWVyKDAsIDAsIDAuMiwgMSknXCJcclxuXHRzdHlsZUNsYXNzPVwibGF5b3V0LWhpc3Rvcnktc2lkZWJhciB3LWZ1bGwgc206dy0zMHJlbVwiXHJcblx0KnRyYW5zbG9jbz1cImxldCB0OyByZWFkOiAnaGlzdG9yeSdcIj5cclxuXHQ8bmctdGVtcGxhdGUgcFRlbXBsYXRlPVwiaGVhZGVyXCI+XHJcblx0XHQ8ZGl2IGNsYXNzPVwiZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWJldHdlZW4gdy1mdWxsXCI+XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJmbGV4IGFsaWduLWl0ZW1zLWNlbnRlclwiPlxyXG5cdFx0XHRcdDxpIGNsYXNzPVwicGkgcGktaGlzdG9yeSB0ZXh0LXByaW1hcnkgdGV4dC14bFwiPjwvaT5cclxuXHRcdFx0XHQ8c3BhbiBjbGFzcz1cImZvbnQtYm9sZCB0ZXh0LWxnXCI+e3sgdCgncGFnZUhpc3RvcnknKSB9fTwvc3Bhbj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHQ8L2Rpdj5cclxuXHQ8L25nLXRlbXBsYXRlPlxyXG5cclxuXHQ8ZGl2IGNsYXNzPVwiaGlzdG9yeS1jb250ZW50XCI+XHJcblx0XHRAaWYgKGhpc3RvcnkoKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJzZWFyY2gtc2VjdGlvblwiPlxyXG5cdFx0XHRcdDxkaXYgY2xhc3M9XCJzZWFyY2gtaW5wdXQtY29udGFpbmVyXCI+XHJcblx0XHRcdFx0XHQ8YXJpbC10ZXh0XHJcblx0XHRcdFx0XHRcdGNsYXNzPVwidy1mdWxsXCJcclxuXHRcdFx0XHRcdFx0W3BsYWNlaG9sZGVyXT1cInQoJ3NlYXJjaEhpc3RvcnknKVwiXHJcblx0XHRcdFx0XHRcdFsobmdNb2RlbCldPVwic2VhcmNoVGVybVwiXHJcblx0XHRcdFx0XHRcdChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VhcmNoQ2hhbmdlKClcIj5cclxuXHRcdFx0XHRcdDwvYXJpbC10ZXh0PlxyXG5cclxuXHRcdFx0XHRcdDxhcmlsLWJ1dHRvblxyXG5cdFx0XHRcdFx0XHRpY29uPVwiVFJBU0hcIlxyXG5cdFx0XHRcdFx0XHRjb2xvcj1cImRhbmdlclwiXHJcblx0XHRcdFx0XHRcdHNpemU9XCJzbVwiXHJcblx0XHRcdFx0XHRcdGNsYXNzPVwibWwtMVwiXHJcblx0XHRcdFx0XHRcdFtwVG9vbHRpcF09XCJ0KCdjb25maXJtQ2xlYXJBbGwnKVwiXHJcblx0XHRcdFx0XHRcdHRvb2x0aXBQb3NpdGlvbj1cImxlZnRcIlxyXG5cdFx0XHRcdFx0XHQoY2xpY2tFdmVudCk9XCJjbGVhckFsbEhpc3RvcnkoJGV2ZW50KVwiPlxyXG5cdFx0XHRcdFx0PC9hcmlsLWJ1dHRvbj5cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHR9XHJcblxyXG5cdFx0QGlmIChmaWx0ZXJlZEhpc3RvcnkoKS5sZW5ndGggPiAwKSB7XHJcblx0XHRcdDxkaXYgY2xhc3M9XCJoaXN0b3J5LWxpc3RcIj5cclxuXHRcdFx0XHQ8cC1zY3JvbGxQYW5lbCBbc3R5bGVdPVwieyB3aWR0aDogJzEwMCUnLCBoZWlnaHQ6ICcxMDAlJyB9XCI+XHJcblx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGlzdG9yeS1pdGVtc1wiPlxyXG5cdFx0XHRcdFx0XHRAZm9yIChpdGVtIG9mIGZpbHRlcmVkSGlzdG9yeSgpOyB0cmFjayB0cmFja0J5SXRlbUlkKCRpbmRleCwgaXRlbSkpIHtcclxuXHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaGlzdG9yeS1pdGVtXCIgKGNsaWNrKT1cIm5hdmlnYXRlVG9JdGVtKGl0ZW0pXCI+XHJcblx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwiaXRlbS1jb250ZW50XCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpdGVtLWhlYWRlclwiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdDxkaXYgY2xhc3M9XCJpdGVtLXRpdGxlXCI+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8aSBjbGFzcz1cInBpIHBpLWV4dGVybmFsLWxpbmsgdGV4dC1wcmltYXJ5IG1yLTJcIj48L2k+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8ZGl2IGNsYXNzPVwidGl0bGUtaW5mb1wiPlxyXG5cdFx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8c3BhbiBjbGFzcz1cInRpdGxlLXRleHRcIj57eyBnZXRMb2NhbGl6ZWRUaXRsZShpdGVtKSB9fTwvc3Bhbj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0PHNwYW4gY2xhc3M9XCJyb3V0ZS10ZXh0XCI+e3sgaXRlbS51cmwgfX08L3NwYW4+XHJcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0XHRcdFx0fVxyXG5cdFx0XHRcdFx0PC9kaXY+XHJcblx0XHRcdFx0PC9wLXNjcm9sbFBhbmVsPlxyXG5cdFx0XHQ8L2Rpdj5cclxuXHRcdH0gQGVsc2Uge1xyXG5cdFx0XHQ8ZGl2IGNsYXNzPVwiZW1wdHktc3RhdGVcIj5cclxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiZW1wdHktY29udGVudFwiPlxyXG5cdFx0XHRcdFx0PGkgY2xhc3M9XCJwaSBwaS1oaXN0b3J5IGVtcHR5LWljb25cIj48L2k+XHJcblx0XHRcdFx0XHQ8aDMgY2xhc3M9XCJlbXB0eS10aXRsZVwiPlxyXG5cdFx0XHRcdFx0XHR7eyBzZWFyY2hUZXJtKCkgPyB0KCdub1NlYXJjaFJlc3VsdHMnKSA6IHQoJ25vSGlzdG9yeScpIH19XHJcblx0XHRcdFx0XHQ8L2gzPlxyXG5cdFx0XHRcdFx0PHAgY2xhc3M9XCJlbXB0eS1tZXNzYWdlXCI+XHJcblx0XHRcdFx0XHRcdHt7IHNlYXJjaFRlcm0oKSA/IHQoJ3RyeURpZmZlcmVudEtleXdvcmRzJykgOiB0KCdzdGFydEJyb3dzaW5nJykgfX1cclxuXHRcdFx0XHRcdDwvcD5cclxuXHRcdFx0XHRcdEBpZiAoc2VhcmNoVGVybSgpKSB7XHJcblx0XHRcdFx0XHRcdDxhcmlsLWJ1dHRvblxyXG5cdFx0XHRcdFx0XHRcdFtsYWJlbF09XCJ0KCdjbGVhclNlYXJjaCcpXCJcclxuXHRcdFx0XHRcdFx0XHRpY29uPVwiVElNRVNcIlxyXG5cdFx0XHRcdFx0XHRcdGNvbG9yPVwic2Vjb25kYXJ5XCJcclxuXHRcdFx0XHRcdFx0XHRbb3V0bGluZWRdPVwidHJ1ZVwiXHJcblx0XHRcdFx0XHRcdFx0c2l6ZT1cInNtXCJcclxuXHRcdFx0XHRcdFx0XHQoY2xpY2tFdmVudCk9XCJzZWFyY2hUZXJtLnNldCgnJyk7IG9uU2VhcmNoQ2hhbmdlKClcIj5cclxuXHRcdFx0XHRcdFx0PC9hcmlsLWJ1dHRvbj5cclxuXHRcdFx0XHRcdH1cclxuXHRcdFx0XHQ8L2Rpdj5cclxuXHRcdFx0PC9kaXY+XHJcblx0XHR9XHJcblx0PC9kaXY+XHJcblxyXG5cdDxwLWNvbmZpcm1EaWFsb2c+PC9wLWNvbmZpcm1EaWFsb2c+XHJcbjwvcC1zaWRlYmFyPlxyXG4iXX0=
@@ -0,0 +1,146 @@
1
+ import { Injectable, inject } from '@angular/core';
2
+ import { Router, NavigationEnd } from '@angular/router';
3
+ import { BehaviorSubject } from 'rxjs';
4
+ import { filter, map } from 'rxjs/operators';
5
+ import { TranslocoService } from '@ngneat/transloco';
6
+ import * as i0 from "@angular/core";
7
+ export class HistoryService {
8
+ constructor() {
9
+ this.STORAGE_KEY = 'page_history';
10
+ this.MAX_HISTORY_SIZE = 20;
11
+ this.historySubject = new BehaviorSubject([]);
12
+ this.history$ = this.historySubject.asObservable();
13
+ // Excluded paths that shouldn't be tracked
14
+ this.excludedPaths = ['/login', '/logout', '/error', '/not-found', '/unauthorized'];
15
+ this.router = inject(Router);
16
+ this.translocoService = inject(TranslocoService);
17
+ this.loadHistoryFromStorage();
18
+ this.initializeRouterTracking();
19
+ }
20
+ initializeRouterTracking() {
21
+ this.router.events
22
+ .pipe(filter((event) => event instanceof NavigationEnd), map((event) => event))
23
+ .subscribe((event) => {
24
+ this.addToHistory(event.urlAfterRedirects || event.url);
25
+ });
26
+ }
27
+ addToHistory(url) {
28
+ // Skip if URL should be excluded
29
+ if (this.shouldExcludeUrl(url)) {
30
+ return;
31
+ }
32
+ const menuItem = this.findMenuItemByPath(url);
33
+ const multiLanguageTitle = {};
34
+ // Get titles for both languages if menu item exists
35
+ if (menuItem) {
36
+ multiLanguageTitle.tr = menuItem.label['tr'];
37
+ multiLanguageTitle.en = menuItem.label['en'];
38
+ }
39
+ else {
40
+ // Fallback for pages not in menu
41
+ multiLanguageTitle.tr = 'Bilinmeyen Sayfa';
42
+ multiLanguageTitle.en = 'Unknown Page';
43
+ }
44
+ const currentLang = this.translocoService.getActiveLang();
45
+ const title = multiLanguageTitle[currentLang] || multiLanguageTitle.tr || 'Unknown Page';
46
+ const timestamp = Date.now();
47
+ const id = this.generateId(url, timestamp);
48
+ const newItem = {
49
+ id,
50
+ title,
51
+ multiLanguageTitle,
52
+ url,
53
+ timestamp
54
+ };
55
+ let history = this.getHistoryFromStorage();
56
+ history = history.filter((item) => item.url !== url);
57
+ history.unshift(newItem);
58
+ // Limit history size
59
+ if (history.length > this.MAX_HISTORY_SIZE) {
60
+ history = history.slice(0, this.MAX_HISTORY_SIZE);
61
+ }
62
+ this.saveHistoryToStorage(history);
63
+ this.historySubject.next(history);
64
+ }
65
+ shouldExcludeUrl(url) {
66
+ return this.excludedPaths.some((excludedPath) => url.startsWith(excludedPath));
67
+ }
68
+ findMenuItemByPath(path) {
69
+ const menuItems = globalThis.hostMenuItems?.() || [];
70
+ // Special handling for home page route
71
+ if (path === '/' || path === '') {
72
+ return menuItems.find((item) => item.routerLink === '/') || null;
73
+ }
74
+ // Remove leading slash if present for other routes
75
+ const cleanPath = path.startsWith('/') ? path.substring(1) : path;
76
+ return this.findMenuItemRecursive(menuItems, cleanPath);
77
+ }
78
+ findMenuItemRecursive(items, path) {
79
+ for (const item of items) {
80
+ if (item.routerLink === path) {
81
+ return item;
82
+ }
83
+ if (item.routerLink && path.startsWith(item.routerLink + '/')) {
84
+ return item;
85
+ }
86
+ if (item.items) {
87
+ const found = this.findMenuItemRecursive(item.items, path);
88
+ if (found) {
89
+ return found;
90
+ }
91
+ }
92
+ }
93
+ return null;
94
+ }
95
+ generateId(url, timestamp) {
96
+ return `${url.replace(/[^a-zA-Z0-9]/g, '_')}_${timestamp}`;
97
+ }
98
+ loadHistoryFromStorage() {
99
+ const history = this.getHistoryFromStorage();
100
+ this.historySubject.next(history);
101
+ }
102
+ saveHistoryToStorage(history) {
103
+ try {
104
+ localStorage.setItem(this.STORAGE_KEY, JSON.stringify(history));
105
+ }
106
+ catch (error) {
107
+ console.warn('Failed to save navigation history to localStorage:', error);
108
+ }
109
+ }
110
+ clearHistory() {
111
+ localStorage.removeItem(this.STORAGE_KEY);
112
+ this.historySubject.next([]);
113
+ }
114
+ navigateToHistoryItem(item) {
115
+ this.router.navigate([item.url]);
116
+ }
117
+ getHistoryFromStorage() {
118
+ try {
119
+ const stored = localStorage.getItem(this.STORAGE_KEY);
120
+ return stored ? JSON.parse(stored) : [];
121
+ }
122
+ catch (error) {
123
+ console.warn('Failed to load navigation history from localStorage:', error);
124
+ return [];
125
+ }
126
+ }
127
+ getHistoryItemsBySearchTerm(searchTerm) {
128
+ const history = this.getHistoryFromStorage();
129
+ const lowerSearchTerm = searchTerm.toLowerCase();
130
+ const currentLang = this.translocoService.getActiveLang();
131
+ return history.filter((item) => {
132
+ // Search in current language title
133
+ const currentTitle = item.multiLanguageTitle?.[currentLang] || item.title;
134
+ return currentTitle.toLowerCase().includes(lowerSearchTerm) || item.url.toLowerCase().includes(lowerSearchTerm);
135
+ });
136
+ }
137
+ static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: HistoryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
138
+ static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: HistoryService, providedIn: 'root' }); }
139
+ }
140
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.1.2", ngImport: i0, type: HistoryService, decorators: [{
141
+ type: Injectable,
142
+ args: [{
143
+ providedIn: 'root'
144
+ }]
145
+ }], ctorParameters: () => [] });
146
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGlzdG9yeS5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXJpbC90aGVtZS9sYXlvdXQvYXBwL2hpc3RvcnkvaGlzdG9yeS5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGVBQWUsRUFBYyxNQUFNLE1BQU0sQ0FBQztBQUNuRCxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQzdDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLG1CQUFtQixDQUFDOztBQWtCckQsTUFBTSxPQUFPLGNBQWM7SUFhMUI7UUFaaUIsZ0JBQVcsR0FBRyxjQUFjLENBQUM7UUFDN0IscUJBQWdCLEdBQUcsRUFBRSxDQUFDO1FBRS9CLG1CQUFjLEdBQUcsSUFBSSxlQUFlLENBQWdCLEVBQUUsQ0FBQyxDQUFDO1FBQ3pELGFBQVEsR0FBOEIsSUFBSSxDQUFDLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUVoRiwyQ0FBMkM7UUFDbkMsa0JBQWEsR0FBRyxDQUFDLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFLFlBQVksRUFBRSxlQUFlLENBQUMsQ0FBQztRQUUvRSxXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBR25ELElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1FBQzlCLElBQUksQ0FBQyx3QkFBd0IsRUFBRSxDQUFDO0lBQ2pDLENBQUM7SUFFTyx3QkFBd0I7UUFDL0IsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNO2FBQ2hCLElB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NUUsT0FBTyxFQUFFLENBQUM7UUFDWCxDQUFDO0lBQ0YsQ0FBQztJQUVNLDJCQUEyQixDQUFDLFVBQWtCO1FBQ3BELE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxxQkFBcUIsRUFBRSxDQUFDO1FBQzdDLE1BQU0sZUFBZSxHQUFHLFVBQVUsQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNqRCxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsYUFBYSxFQUFpQixDQUFDO1FBRXpFLE9BQU8sT0FBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFO1lBQzlCLG1DQUFtQztZQUNuQyxNQUFNLFlBQVksR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxXQUFXLENBQUMsSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDO1lBQzFFLE9BQU8sWUFBWSxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsSUFBSSxJQUFJLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxDQUFDLFFBQVEsQ0FBQyxlQUFlLENBQUMsQ0FBQztRQUNqSCxDQUFDLENBQUMsQ0FBQztJQUNKLENBQUM7OEdBOUpXLGNBQWM7a0hBQWQsY0FBYyxjQUZkLE1BQU07OzJGQUVOLGNBQWM7a0JBSDFCLFVBQVU7bUJBQUM7b0JBQ1gsVUFBVSxFQUFFLE1BQU07aUJBQ2xCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IFJvdXRlciwgTmF2aWdhdGlvbkVuZCB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XHJcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcclxuaW1wb3J0IHsgVHJhbnNsb2NvU2VydmljZSB9IGZyb20gJ0BuZ25lYXQvdHJhbnNsb2NvJztcclxuXHJcbmltcG9ydCB7IFBsdWdpbk1lbnVJdGVtIH0gZnJvbSAnYXJpbC9ib290L2NvbmZpZy9hcHBzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgSGlzdG9yeUl0ZW0ge1xyXG5cdGlkOiBzdHJpbmc7XHJcblx0dGl0bGU6IHN0cmluZztcclxuXHRtdWx0aUxhbmd1YWdlVGl0bGU/OiB7XHJcblx0XHR0cj86IHN0cmluZztcclxuXHRcdGVuPzogc3RyaW5nO1xyXG5cdH07XHJcblx0dXJsOiBzdHJpbmc7XHJcblx0dGltZXN0YW1wOiBudW1iZXI7XHJcbn1cclxuXHJcbkBJbmplY3RhYmxlKHtcclxuXHRwcm92aWRlZEluOiAncm9vdCdcclxufSlcclxuZXhwb3J0IGNsYXNzIEhpc3RvcnlTZXJ2aWNlIHtcclxuXHRwcml2YXRlIHJlYWRvbmx5IFNUT1JBR0VfS0VZID0gJ3BhZ2VfaGlzdG9yeSc7XHJcblx0cHJpdmF0ZSByZWFkb25seSBNQVhfSElTVE9SWV9TSVpFID0gMjA7XHJcblxyXG5cdHByaXZhdGUgaGlzdG9yeVN1YmplY3QgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PEhpc3RvcnlJdGVtW10+KFtdKTtcclxuXHRwdWJsaWMgaGlzdG9yeSQ6IE9ic2VydmFibGU8SGlzdG9yeUl0ZW1bXT4gPSB0aGlzLmhpc3RvcnlTdWJqZWN0LmFzT2JzZXJ2YWJsZSgpO1xyXG5cclxuXHQvLyBFeGNsdWRlZCBwYXRocyB0aGF0IHNob3VsZG4ndCBiZSB0cmFja2VkXHJcblx0cHJpdmF0ZSBleGNsdWRlZFBhdGhzID0gWycvbG9naW4nLCAnL2xvZ291dCcsICcvZXJyb3InLCAnL25vdC1mb3VuZCcsICcvdW5hdXRob3JpemVkJ107XHJcblxyXG5cdHByaXZhdGUgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XHJcblx0cHJpdmF0ZSB0cmFuc2xvY29TZXJ2aWNlID0gaW5qZWN0KFRyYW5zbG9jb1NlcnZpY2UpO1xyXG5cclxuXHRjb25zdHJ1Y3RvcigpIHtcclxuXHRcdHRoaXMubG9hZEhpc3RvcnlGcm9tU3RvcmFnZSgpO1xyXG5cdFx0dGhpcy5pbml0aWFsaXplUm91dGVyVHJhY2tpbmcoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgaW5pdGlhbGl6ZVJvdXRlclRyYWNraW5nKCk6IHZvaWQge1xyXG5cdFx0dGhpcy5yb3V0ZXIuZXZlbnRzXHJcblx0XHRcdC5waXBlKFxyXG5cdFx0XHRcdGZpbHRlcigoZXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCksXHJcblx0XHRcdFx0bWFwKChldmVudCkgPT4gZXZlbnQgYXMgTmF2aWdhdGlvbkVuZClcclxuXHRcdFx0KVxyXG5cdFx0XHQuc3Vic2NyaWJlKChldmVudDogTmF2aWdhdGlvbkVuZCkgPT4ge1xyXG5cdFx0XHRcdHRoaXMuYWRkVG9IaXN0b3J5KGV2ZW50LnVybEFmdGVyUmVkaXJlY3RzIHx8IGV2ZW50LnVybCk7XHJcblx0XHRcdH0pO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBhZGRUb0hpc3RvcnkodXJsOiBzdHJpbmcpOiB2b2lkIHtcclxuXHRcdC8vIFNraXAgaWYgVVJMIHNob3VsZCBiZSBleGNsdWRlZFxyXG5cdFx0aWYgKHRoaXMuc2hvdWxkRXhjbHVkZVVybCh1cmwpKSB7XHJcblx0XHRcdHJldHVybjtcclxuXHRcdH1cclxuXHJcblx0XHRjb25zdCBtZW51SXRlbSA9IHRoaXMuZmluZE1lbnVJdGVtQnlQYXRoKHVybCk7XHJcblx0XHRjb25zdCBtdWx0aUxhbmd1YWdlVGl0bGU6IHsgdHI/OiBzdHJpbmc7IGVuPzogc3RyaW5nIH0gPSB7fTtcclxuXHJcblx0XHQvLyBHZXQgdGl0bGVzIGZvciBib3RoIGxhbmd1YWdlcyBpZiBtZW51IGl0ZW0gZXhpc3RzXHJcblx0XHRpZiAobWVudUl0ZW0pIHtcclxuXHRcdFx0bXVsdGlMYW5ndWFnZVRpdGxlLnRyID0gbWVudUl0ZW0ubGFiZWxbJ3RyJ107XHJcblx0XHRcdG11bHRpTGFuZ3VhZ2VUaXRsZS5lbiA9IG1lbnVJdGVtLmxhYmVsWydlbiddO1xyXG5cdFx0fSBlbHNlIHtcclxuXHRcdFx0Ly8gRmFsbGJhY2sgZm9yIHBhZ2VzIG5vdCBpbiBtZW51XHJcblx0XHRcdG11bHRpTGFuZ3VhZ2VUaXRsZS50ciA9ICdCaWxpbm1leWVuIFNheWZhJztcclxuXHRcdFx0bXVsdGlMYW5ndWFnZVRpdGxlLmVuID0gJ1Vua25vd24gUGFnZSc7XHJcblx0XHR9XHJcblxyXG5cdFx0Y29uc3QgY3VycmVudExhbmcgPSB0aGlzLnRyYW5zbG9jb1NlcnZpY2UuZ2V0QWN0aXZlTGFuZygpIGFzICd0cicgfCAnZW4nO1xyXG5cdFx0Y29uc3QgdGl0bGUgPSBtdWx0aUxhbmd1YWdlVGl0bGVbY3VycmVudExhbmddIHx8IG11bHRpTGFuZ3VhZ2VUaXRsZS50ciB8fCAnVW5rbm93biBQYWdlJztcclxuXHRcdGNvbnN0IHRpbWVzdGFtcCA9IERhdGUubm93KCk7XHJcblx0XHRjb25zdCBpZCA9IHRoaXMuZ2VuZXJhdGVJZCh1cmwsIHRpbWVzdGFtcCk7XHJcblxyXG5cdFx0Y29uc3QgbmV3SXRlbTogSGlzdG9yeUl0ZW0gPSB7XHJcblx0XHRcdGlkLFxyXG5cdFx0XHR0aXRsZSxcclxuXHRcdFx0bXVsdGlMYW5ndWFnZVRpdGxlLFxyXG5cdFx0XHR1cmwsXHJcblx0XHRcdHRpbWVzdGFtcFxyXG5cdFx0fTtcclxuXHJcblx0XHRsZXQgaGlzdG9yeSA9IHRoaXMuZ2V0SGlzdG9yeUZyb21TdG9yYWdlKCk7XHJcblx0XHRoaXN0b3J5ID0gaGlzdG9yeS5maWx0ZXIoKGl0ZW0pID0+IGl0ZW0udXJsICE9PSB1cmwpO1xyXG5cdFx0aGlzdG9yeS51bnNoaWZ0KG5ld0l0ZW0pO1xyXG5cclxuXHRcdC8vIExpbWl0IGhpc3Rvcnkgc2l6ZVxyXG5cdFx0aWYgKGhpc3RvcnkubGVuZ3RoID4gdGhpcy5NQVhfSElTVE9SWV9TSVpFKSB7XHJcblx0XHRcdGhpc3RvcnkgPSBoaXN0b3J5LnNsaWNlKDAsIHRoaXMuTUFYX0hJU1RPUllfU0laRSk7XHJcblx0XHR9XHJcblxyXG5cdFx0dGhpcy5zYXZlSGlzdG9yeVRvU3RvcmFnZShoaXN0b3J5KTtcclxuXHRcdHRoaXMuaGlzdG9yeVN1YmplY3QubmV4dChoaXN0b3J5KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc2hvdWxkRXhjbHVkZVVybCh1cmw6IHN0cmluZyk6IGJvb2xlYW4ge1xyXG5cdFx0cmV0dXJuIHRoaXMuZXhjbHVkZWRQYXRocy5zb21lKChleGNsdWRlZFBhdGgpID0+IHVybC5zdGFydHNXaXRoKGV4Y2x1ZGVkUGF0aCkpO1xyXG5cdH1cclxuXHJcblx0cHJpdmF0ZSBmaW5kTWVudUl0ZW1CeVBhdGgocGF0aDogc3RyaW5nKTogUGx1Z2luTWVudUl0ZW0gfCBudWxsIHtcclxuXHRcdGNvbnN0IG1lbnVJdGVtcyA9ICg8YW55Pmdsb2JhbFRoaXMpLmhvc3RNZW51SXRlbXM/LigpIHx8IFtdO1xyXG5cclxuXHRcdC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIGhvbWUgcGFnZSByb3V0ZVxyXG5cdFx0aWYgKHBhdGggPT09ICcvJyB8fCBwYXRoID09PSAnJykge1xyXG5cdFx0XHRyZXR1cm4gbWVudUl0ZW1zLmZpbmQoKGl0ZW06IFBsdWdpbk1lbnVJdGVtKSA9PiBpdGVtLnJvdXRlckxpbmsgPT09ICcvJykgfHwgbnVsbDtcclxuXHRcdH1cclxuXHJcblx0XHQvLyBSZW1vdmUgbGVhZGluZyBzbGFzaCBpZiBwcmVzZW50IGZvciBvdGhlciByb3V0ZXNcclxuXHRcdGNvbnN0IGNsZWFuUGF0aCA9IHBhdGguc3RhcnRzV2l0aCgnLycpID8gcGF0aC5zdWJzdHJpbmcoMSkgOiBwYXRoO1xyXG5cdFx0cmV0dXJuIHRoaXMuZmluZE1lbnVJdGVtUmVjdXJzaXZlKG1lbnVJdGVtcywgY2xlYW5QYXRoKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZmluZE1lbnVJdGVtUmVjdXJzaXZlKGl0ZW1zOiBQbHVnaW5NZW51SXRlbVtdLCBwYXRoOiBzdHJpbmcpOiBQbHVnaW5NZW51SXRlbSB8IG51bGwge1xyXG5cdFx0Zm9yIChjb25zdCBpdGVtIG9mIGl0ZW1zKSB7XHJcblx0XHRcdGlmIChpdGVtLnJvdXRlckxpbmsgPT09IHBhdGgpIHtcclxuXHRcdFx0XHRyZXR1cm4gaXRlbTtcclxuXHRcdFx0fVxyXG5cclxuXHRcdFx0aWYgKGl0ZW0ucm91dGVyTGluayAmJiBwYXRoLnN0YXJ0c1dpdGgoaXRlbS5yb3V0ZXJMaW5rICsgJy8nKSkge1xyXG5cdFx0XHRcdHJldHVybiBpdGVtO1xyXG5cdFx0XHR9XHJcblxyXG5cdFx0XHRpZiAoaXRlbS5pdGVtcykge1xyXG5cdFx0XHRcdGNvbnN0IGZvdW5kID0gdGhpcy5maW5kTWVudUl0ZW1SZWN1cnNpdmUoaXRlbS5pdGVtcywgcGF0aCk7XHJcblx0XHRcdFx0aWYgKGZvdW5kKSB7XHJcblx0XHRcdFx0XHRyZXR1cm4gZm91bmQ7XHJcblx0XHRcdFx0fVxyXG5cdFx0XHR9XHJcblx0XHR9XHJcblxyXG5cdFx0cmV0dXJuIG51bGw7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGdlbmVyYXRlSWQodXJsOiBzdHJpbmcsIHRpbWVzdGFtcDogbnVtYmVyKTogc3RyaW5nIHtcclxuXHRcdHJldHVybiBgJHt1cmwucmVwbGFjZSgvW15hLXpBLVowLTldL2csICdfJyl9XyR7dGltZXN0YW1wfWA7XHJcblx0fVxyXG5cclxuXHRwcml2YXRlIGxvYWRIaXN0b3J5RnJvbVN0b3JhZ2UoKTogdm9pZCB7XHJcblx0XHRjb25zdCBoaXN0b3J5ID0gdGhpcy5nZXRIaXN0b3J5RnJvbVN0b3JhZ2UoKTtcclxuXHRcdHRoaXMuaGlzdG9yeVN1YmplY3QubmV4dChoaXN0b3J5KTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgc2F2ZUhpc3RvcnlUb1N0b3JhZ2UoaGlzdG9yeTogSGlzdG9yeUl0ZW1bXSk6IHZvaWQge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0bG9jYWxTdG9yYWdlLnNldEl0ZW0odGhpcy5TVE9SQUdFX0tFWSwgSlNPTi5zdHJpbmdpZnkoaGlzdG9yeSkpO1xyXG5cdFx0fSBjYXRjaCAoZXJyb3IpIHtcclxuXHRcdFx0Y29uc29sZS53YXJuKCdGYWlsZWQgdG8gc2F2ZSBuYXZpZ2F0aW9uIGhpc3RvcnkgdG8gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcclxuXHRcdH1cclxuXHR9XHJcblxyXG5cdHB1YmxpYyBjbGVhckhpc3RvcnkoKTogdm9pZCB7XHJcblx0XHRsb2NhbFN0b3JhZ2UucmVtb3ZlSXRlbSh0aGlzLlNUT1JBR0VfS0VZKTtcclxuXHRcdHRoaXMuaGlzdG9yeVN1YmplY3QubmV4dChbXSk7XHJcblx0fVxyXG5cclxuXHRwdWJsaWMgbmF2aWdhdGVUb0hpc3RvcnlJdGVtKGl0ZW06IEhpc3RvcnlJdGVtKTogdm9pZCB7XHJcblx0XHR0aGlzLnJvdXRlci5uYXZpZ2F0ZShbaXRlbS51cmxdKTtcclxuXHR9XHJcblxyXG5cdHByaXZhdGUgZ2V0SGlzdG9yeUZyb21TdG9yYWdlKCk6IEhpc3RvcnlJdGVtW10ge1xyXG5cdFx0dHJ5IHtcclxuXHRcdFx0Y29uc3Qgc3RvcmVkID0gbG9jYWxTdG9yYWdlLmdldEl0ZW0odGhpcy5TVE9SQUdFX0tFWSk7XHJcblx0XHRcdHJldHVybiBzdG9yZWQgPyBKU09OLnBhcnNlKHN0b3JlZCkgOiBbXTtcclxuXHRcdH0gY2F0Y2ggKGVycm9yKSB7XHJcblx0XHRcdGNvbnNvbGUud2FybignRmFpbGVkIHRvIGxvYWQgbmF2aWdhdGlvbiBoaXN0b3J5IGZyb20gbG9jYWxTdG9yYWdlOicsIGVycm9yKTtcclxuXHRcdFx0cmV0dXJuIFtdO1xyXG5cdFx0fVxyXG5cdH1cclxuXHJcblx0cHVibGljIGdldEhpc3RvcnlJdGVtc0J5U2VhcmNoVGVybShzZWFyY2hUZXJtOiBzdHJpbmcpOiBIaXN0b3J5SXRlbVtdIHtcclxuXHRcdGNvbnN0IGhpc3RvcnkgPSB0aGlzLmdldEhpc3RvcnlGcm9tU3RvcmFnZSgpO1xyXG5cdFx0Y29uc3QgbG93ZXJTZWFyY2hUZXJtID0gc2VhcmNoVGVybS50b0xvd2VyQ2FzZSgpO1xyXG5cdFx0Y29uc3QgY3VycmVudExhbmcgPSB0aGlzLnRyYW5zbG9jb1NlcnZpY2UuZ2V0QWN0aXZlTGFuZygpIGFzICd0cicgfCAnZW4nO1xyXG5cclxuXHRcdHJldHVybiBoaXN0b3J5LmZpbHRlcigoaXRlbSkgPT4ge1xyXG5cdFx0XHQvLyBTZWFyY2ggaW4gY3VycmVudCBsYW5ndWFnZSB0aXRsZVxyXG5cdFx0XHRjb25zdCBjdXJyZW50VGl0bGUgPSBpdGVtLm11bHRpTGFuZ3VhZ2VUaXRsZT8uW2N1cnJlbnRMYW5nXSB8fCBpdGVtLnRpdGxlO1xyXG5cdFx0XHRyZXR1cm4gY3VycmVudFRpdGxlLnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMobG93ZXJTZWFyY2hUZXJtKSB8fCBpdGVtLnVybC50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKGxvd2VyU2VhcmNoVGVybSk7XHJcblx0XHR9KTtcclxuXHR9XHJcbn1cclxuIl19