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.
- package/esm2022/http/src/serviceStateMethods.mjs +6 -2
- package/esm2022/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.mjs +211 -0
- package/esm2022/theme/layout/app/favorite-pages/favorite-pages.service.mjs +55 -0
- package/esm2022/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.mjs +129 -0
- package/esm2022/theme/layout/app/history/history-sidebar.component.mjs +128 -0
- package/esm2022/theme/layout/app/history/history.service.mjs +146 -0
- package/esm2022/theme/layout/app/layout/app.layout.component.mjs +9 -3
- package/esm2022/theme/layout/app/profileSidebar/app.profilesidebar.component.mjs +100 -8
- package/esm2022/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.mjs +142 -0
- package/esm2022/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.mjs +123 -0
- package/esm2022/theme/layout/app/profileSidebar/profile.service.mjs +42 -0
- package/esm2022/theme/layout/app/site-map/site-map-sidebar.component.mjs +161 -0
- package/esm2022/theme/layout/app/topbar/app.topbar.component.mjs +23 -5
- package/esm2022/theme/layout/service/app.layout.service.mjs +13 -1
- package/fesm2022/aril-http.mjs +5 -1
- package/fesm2022/aril-http.mjs.map +1 -1
- package/fesm2022/aril-theme-layout.mjs +1197 -75
- package/fesm2022/aril-theme-layout.mjs.map +1 -1
- package/package.json +84 -83
- package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.d.ts +42 -0
- package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.html +106 -0
- package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.scss +181 -0
- package/theme/layout/app/favorite-pages/favorite-pages-sidebar.component.ts +253 -0
- package/theme/layout/app/favorite-pages/favorite-pages.service.d.ts +54 -0
- package/theme/layout/app/favorite-pages/favorite-pages.service.ts +87 -0
- package/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.d.ts +36 -0
- package/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.html +27 -0
- package/theme/layout/app/favorite-pages/modals/add-edit-favorite-modal/add-edit-favorite-modal.component.ts +165 -0
- package/theme/layout/app/history/history-sidebar.component.d.ts +30 -0
- package/theme/layout/app/history/history-sidebar.component.html +88 -0
- package/theme/layout/app/history/history-sidebar.component.scss +191 -0
- package/theme/layout/app/history/history-sidebar.component.ts +139 -0
- package/theme/layout/app/history/history.service.d.ts +36 -0
- package/theme/layout/app/history/history.service.ts +182 -0
- package/theme/layout/app/layout/app.layout.component.html +3 -0
- package/theme/layout/app/layout/app.layout.component.ts +7 -1
- package/theme/layout/app/profileSidebar/app.profilesidebar.component.d.ts +17 -2
- package/theme/layout/app/profileSidebar/app.profilesidebar.component.html +107 -135
- package/theme/layout/app/profileSidebar/app.profilesidebar.component.scss +152 -0
- package/theme/layout/app/profileSidebar/app.profilesidebar.component.ts +114 -7
- package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.d.ts +30 -0
- package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.html +46 -0
- package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.scss +28 -0
- package/theme/layout/app/profileSidebar/modals/change-password-modal/change-password-modal.component.ts +178 -0
- package/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.d.ts +27 -0
- package/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.html +76 -0
- package/theme/layout/app/profileSidebar/modals/edit-profile-modal/edit-profile-modal.component.ts +141 -0
- package/theme/layout/app/profileSidebar/profile.service.d.ts +67 -0
- package/theme/layout/app/profileSidebar/profile.service.ts +89 -0
- package/theme/layout/app/site-map/site-map-sidebar.component.d.ts +37 -0
- package/theme/layout/app/site-map/site-map-sidebar.component.html +118 -0
- package/theme/layout/app/site-map/site-map-sidebar.component.scss +189 -0
- package/theme/layout/app/site-map/site-map-sidebar.component.ts +189 -0
- package/theme/layout/app/topbar/app.topbar.component.d.ts +7 -1
- package/theme/layout/app/topbar/app.topbar.component.html +37 -17
- package/theme/layout/app/topbar/app.topbar.component.scss +188 -12
- package/theme/layout/app/topbar/app.topbar.component.ts +29 -7
- package/theme/layout/service/app.layout.service.d.ts +6 -0
- 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
|