@sinequa/atomic-angular 0.0.146 → 0.1.3
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/README.md +145 -0
- package/components/no-result/i18n/en.json +5 -0
- package/components/no-result/i18n/fr.json +5 -0
- package/components/sort-selector/i18n/en.json +3 -0
- package/components/sort-selector/i18n/fr.json +3 -0
- package/components/source/i18n/en.json +3 -0
- package/components/source/i18n/fr.json +3 -0
- package/features/alerts/i18n/en.json +33 -0
- package/features/alerts/i18n/fr.json +33 -0
- package/features/bookmarks/i18n/en.json +11 -0
- package/features/bookmarks/i18n/fr.json +11 -0
- package/features/collections/i18n/en.json +17 -0
- package/features/collections/i18n/fr.json +16 -0
- package/features/dialogs/i18n/en.json +15 -0
- package/features/dialogs/i18n/fr.json +15 -0
- package/features/did-you-mean/i18n/en.json +5 -0
- package/features/did-you-mean/i18n/fr.json +5 -0
- package/features/drawer/i18n/en.json +22 -0
- package/features/drawer/i18n/fr.json +22 -0
- package/features/export/i18n/en.json +7 -0
- package/features/export/i18n/fr.json +7 -0
- package/features/feedback/i18n/en.json +26 -0
- package/features/feedback/i18n/fr.json +26 -0
- package/features/filters/i18n/en.json +14 -0
- package/features/filters/i18n/fr.json +14 -0
- package/features/labels/i18n/en.json +8 -0
- package/features/labels/i18n/fr.json +8 -0
- package/features/recent-searches/i18n/en.json +6 -0
- package/features/recent-searches/i18n/fr.json +6 -0
- package/features/saved-searches/i18n/en.json +8 -0
- package/features/saved-searches/i18n/fr.json +8 -0
- package/features/sign-in/i18n/en.json +12 -0
- package/features/sign-in/i18n/fr.json +14 -0
- package/fesm2022/sinequa-atomic-angular.mjs +8021 -2672
- package/fesm2022/sinequa-atomic-angular.mjs.map +1 -1
- package/index.d.ts +6036 -3
- package/package.json +68 -10
- package/assets/tailwind.css +0 -334
- package/esm2022/lib/assistant/index.mjs +0 -2
- package/esm2022/lib/assistant/signalR.web.service.mjs +0 -81
- package/esm2022/lib/components/dropdown-input.mjs +0 -97
- package/esm2022/lib/components/dropdown-list.mjs +0 -35
- package/esm2022/lib/components/dropdown.mjs +0 -127
- package/esm2022/lib/components/index.mjs +0 -7
- package/esm2022/lib/components/menu/index.mjs +0 -3
- package/esm2022/lib/components/menu/menu-item.mjs +0 -22
- package/esm2022/lib/components/menu/menu.mjs +0 -99
- package/esm2022/lib/components/metadata/index.mjs +0 -2
- package/esm2022/lib/components/metadata/metadata.component.mjs +0 -65
- package/esm2022/lib/components/theme/index.mjs +0 -3
- package/esm2022/lib/components/theme/theme-selector.component.mjs +0 -67
- package/esm2022/lib/components/theme/theme-toggle.component.mjs +0 -67
- package/esm2022/lib/directives/index.mjs +0 -5
- package/esm2022/lib/directives/infinite-scroll.directive.mjs +0 -47
- package/esm2022/lib/directives/select-article-on-click.directive.mjs +0 -39
- package/esm2022/lib/directives/show-bookmark.directive.mjs +0 -55
- package/esm2022/lib/directives/theme-provider.directive.mjs +0 -31
- package/esm2022/lib/guards/auth.guard.mjs +0 -27
- package/esm2022/lib/guards/index.mjs +0 -3
- package/esm2022/lib/guards/initialization.guard.mjs +0 -41
- package/esm2022/lib/interceptors/audit.interceptor.mjs +0 -23
- package/esm2022/lib/interceptors/auth.interceptor.mjs +0 -49
- package/esm2022/lib/interceptors/body.interceptor.mjs +0 -24
- package/esm2022/lib/interceptors/error.interceptor.mjs +0 -35
- package/esm2022/lib/interceptors/index.mjs +0 -7
- package/esm2022/lib/interceptors/toast.interceptor.mjs +0 -27
- package/esm2022/lib/models/aggregation.mjs +0 -2
- package/esm2022/lib/models/article-metadata.mjs +0 -2
- package/esm2022/lib/models/autocomplete.mjs +0 -2
- package/esm2022/lib/models/custom-json.mjs +0 -2
- package/esm2022/lib/models/filter-dropdown.mjs +0 -2
- package/esm2022/lib/models/index.mjs +0 -7
- package/esm2022/lib/models/user-settings.mjs +0 -2
- package/esm2022/lib/pipes/highlight-word.pipe.mjs +0 -33
- package/esm2022/lib/pipes/index.mjs +0 -3
- package/esm2022/lib/pipes/source-icon.pipe.mjs +0 -43
- package/esm2022/lib/public-api.mjs +0 -18
- package/esm2022/lib/resolvers/index.mjs +0 -2
- package/esm2022/lib/resolvers/query-name-resolver.mjs +0 -14
- package/esm2022/lib/resources/index.mjs +0 -2
- package/esm2022/lib/resources/themes.mjs +0 -53
- package/esm2022/lib/services/application.service.mjs +0 -245
- package/esm2022/lib/services/autocomplete.service.mjs +0 -85
- package/esm2022/lib/services/drawer/backdrop.service.mjs +0 -23
- package/esm2022/lib/services/drawer/drawer-stack.service.mjs +0 -152
- package/esm2022/lib/services/drawer/drawer.service.mjs +0 -38
- package/esm2022/lib/services/index.mjs +0 -12
- package/esm2022/lib/services/label.service.mjs +0 -161
- package/esm2022/lib/services/navigation.service.mjs +0 -59
- package/esm2022/lib/services/saved-searches.service.mjs +0 -75
- package/esm2022/lib/services/search.service.mjs +0 -89
- package/esm2022/lib/services/selection-history.service.mjs +0 -92
- package/esm2022/lib/services/selection.service.mjs +0 -87
- package/esm2022/lib/stores/aggregations.store.mjs +0 -59
- package/esm2022/lib/stores/app.store.mjs +0 -270
- package/esm2022/lib/stores/application.store.mjs +0 -87
- package/esm2022/lib/stores/index.mjs +0 -9
- package/esm2022/lib/stores/principal.store.mjs +0 -47
- package/esm2022/lib/stores/query-params.store.mjs +0 -207
- package/esm2022/lib/stores/selection.store.mjs +0 -45
- package/esm2022/lib/stores/theme.store.mjs +0 -116
- package/esm2022/lib/stores/user-settings.store.mjs +0 -391
- package/esm2022/lib/tokens/highlights.mjs +0 -32
- package/esm2022/lib/tokens/index.mjs +0 -2
- package/esm2022/lib/utils/debounced-signal.mjs +0 -38
- package/esm2022/lib/utils/index.mjs +0 -8
- package/esm2022/lib/utils/inline-worker.mjs +0 -40
- package/esm2022/lib/utils/query.mjs +0 -58
- package/esm2022/lib/utils/routes.mjs +0 -28
- package/esm2022/lib/utils/tailwind-utils.mjs +0 -6
- package/esm2022/lib/utils/theme-body-hook.mjs +0 -18
- package/esm2022/lib/utils/theme-registry.mjs +0 -6
- package/esm2022/lib/web-services/aggregations.service.mjs +0 -104
- package/esm2022/lib/web-services/app.service.mjs +0 -48
- package/esm2022/lib/web-services/audit.service.mjs +0 -122
- package/esm2022/lib/web-services/index.mjs +0 -10
- package/esm2022/lib/web-services/json-method-plugin.service.mjs +0 -54
- package/esm2022/lib/web-services/preview.service.mjs +0 -327
- package/esm2022/lib/web-services/principal.service.mjs +0 -46
- package/esm2022/lib/web-services/query.service.mjs +0 -123
- package/esm2022/lib/web-services/text-chunck.service.mjs +0 -46
- package/esm2022/public-api.mjs +0 -5
- package/esm2022/sinequa-atomic-angular.mjs +0 -5
- package/lib/assistant/index.d.ts +0 -1
- package/lib/assistant/signalR.web.service.d.ts +0 -46
- package/lib/components/dropdown-input.d.ts +0 -18
- package/lib/components/dropdown-list.d.ts +0 -8
- package/lib/components/dropdown.d.ts +0 -50
- package/lib/components/index.d.ts +0 -6
- package/lib/components/menu/index.d.ts +0 -2
- package/lib/components/menu/menu-item.d.ts +0 -8
- package/lib/components/menu/menu.d.ts +0 -24
- package/lib/components/metadata/index.d.ts +0 -1
- package/lib/components/metadata/metadata.component.d.ts +0 -24
- package/lib/components/theme/index.d.ts +0 -2
- package/lib/components/theme/theme-selector.component.d.ts +0 -70
- package/lib/components/theme/theme-toggle.component.d.ts +0 -10
- package/lib/directives/index.d.ts +0 -4
- package/lib/directives/infinite-scroll.directive.d.ts +0 -30
- package/lib/directives/select-article-on-click.directive.d.ts +0 -14
- package/lib/directives/show-bookmark.directive.d.ts +0 -60
- package/lib/directives/theme-provider.directive.d.ts +0 -20
- package/lib/guards/auth.guard.d.ts +0 -7
- package/lib/guards/index.d.ts +0 -2
- package/lib/guards/initialization.guard.d.ts +0 -20
- package/lib/interceptors/audit.interceptor.d.ts +0 -13
- package/lib/interceptors/auth.interceptor.d.ts +0 -14
- package/lib/interceptors/body.interceptor.d.ts +0 -11
- package/lib/interceptors/error.interceptor.d.ts +0 -9
- package/lib/interceptors/index.d.ts +0 -5
- package/lib/interceptors/toast.interceptor.d.ts +0 -13
- package/lib/models/aggregation.d.ts +0 -12
- package/lib/models/article-metadata.d.ts +0 -5
- package/lib/models/autocomplete.d.ts +0 -5
- package/lib/models/custom-json.d.ts +0 -69
- package/lib/models/filter-dropdown.d.ts +0 -10
- package/lib/models/index.d.ts +0 -6
- package/lib/models/user-settings.d.ts +0 -38
- package/lib/pipes/highlight-word.pipe.d.ts +0 -22
- package/lib/pipes/index.d.ts +0 -2
- package/lib/pipes/source-icon.pipe.d.ts +0 -51
- package/lib/public-api.d.ts +0 -14
- package/lib/resolvers/index.d.ts +0 -1
- package/lib/resolvers/query-name-resolver.d.ts +0 -9
- package/lib/resources/index.d.ts +0 -1
- package/lib/resources/themes.d.ts +0 -51
- package/lib/services/application.service.d.ts +0 -183
- package/lib/services/autocomplete.service.d.ts +0 -96
- package/lib/services/drawer/backdrop.service.d.ts +0 -9
- package/lib/services/drawer/drawer-stack.service.d.ts +0 -70
- package/lib/services/drawer/drawer.service.d.ts +0 -15
- package/lib/services/index.d.ts +0 -11
- package/lib/services/label.service.d.ts +0 -114
- package/lib/services/navigation.service.d.ts +0 -33
- package/lib/services/saved-searches.service.d.ts +0 -149
- package/lib/services/search.service.d.ts +0 -159
- package/lib/services/selection-history.service.d.ts +0 -50
- package/lib/services/selection.service.d.ts +0 -123
- package/lib/stores/aggregations.store.d.ts +0 -25
- package/lib/stores/app.store.d.ts +0 -110
- package/lib/stores/application.store.d.ts +0 -83
- package/lib/stores/index.d.ts +0 -8
- package/lib/stores/principal.store.d.ts +0 -47
- package/lib/stores/query-params.store.d.ts +0 -128
- package/lib/stores/selection.store.d.ts +0 -52
- package/lib/stores/theme.store.d.ts +0 -66
- package/lib/stores/user-settings.store.d.ts +0 -111
- package/lib/tokens/highlights.d.ts +0 -8
- package/lib/tokens/index.d.ts +0 -1
- package/lib/utils/debounced-signal.d.ts +0 -25
- package/lib/utils/index.d.ts +0 -7
- package/lib/utils/inline-worker.d.ts +0 -11
- package/lib/utils/query.d.ts +0 -26
- package/lib/utils/routes.d.ts +0 -16
- package/lib/utils/tailwind-utils.d.ts +0 -2
- package/lib/utils/theme-body-hook.d.ts +0 -6
- package/lib/utils/theme-registry.d.ts +0 -3
- package/lib/web-services/aggregations.service.d.ts +0 -57
- package/lib/web-services/app.service.d.ts +0 -30
- package/lib/web-services/audit.service.d.ts +0 -72
- package/lib/web-services/index.d.ts +0 -9
- package/lib/web-services/json-method-plugin.service.d.ts +0 -41
- package/lib/web-services/preview.service.d.ts +0 -283
- package/lib/web-services/principal.service.d.ts +0 -28
- package/lib/web-services/query.service.d.ts +0 -29
- package/lib/web-services/text-chunck.service.d.ts +0 -22
- package/public-api.d.ts +0 -1
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
import { EventEmitter, Injectable, inject } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject, Subscription } from 'rxjs';
|
|
3
|
-
import { getState } from '@ngrx/signals';
|
|
4
|
-
import { SelectionHistoryService } from '../selection-history.service';
|
|
5
|
-
import { SelectionService } from '../selection.service';
|
|
6
|
-
import { NavigationService } from '../navigation.service';
|
|
7
|
-
import { SelectionStore } from '../../stores/selection.store';
|
|
8
|
-
import { BackdropService } from './backdrop.service';
|
|
9
|
-
import * as i0 from "@angular/core";
|
|
10
|
-
export class DrawerStackService {
|
|
11
|
-
constructor() {
|
|
12
|
-
this.isOpened = new BehaviorSubject(false);
|
|
13
|
-
this.toggleTopDrawerExtension$ = new EventEmitter();
|
|
14
|
-
this.forceTopDrawerCollapse$ = new EventEmitter();
|
|
15
|
-
this.closeTopDrawer$ = new EventEmitter();
|
|
16
|
-
this.closeAllDrawers$ = new EventEmitter();
|
|
17
|
-
this.isChatOpened = new BehaviorSubject(false);
|
|
18
|
-
this.openChatDrawer$ = new EventEmitter();
|
|
19
|
-
this.closeChatDrawer$ = new EventEmitter();
|
|
20
|
-
this.askAI$ = new EventEmitter();
|
|
21
|
-
this.selection = inject(SelectionService);
|
|
22
|
-
this.selectionHistory = inject(SelectionHistoryService);
|
|
23
|
-
this.selectionStore = inject(SelectionStore);
|
|
24
|
-
this.navigationService = inject(NavigationService);
|
|
25
|
-
this.backdropService = inject(BackdropService);
|
|
26
|
-
this.subscriptions = new Subscription();
|
|
27
|
-
// on new search, close all drawers including chat drawer
|
|
28
|
-
this.subscriptions.add(this.navigationService.navigationEnd$.subscribe(() => {
|
|
29
|
-
this.closeAssistant();
|
|
30
|
-
this.closeAll();
|
|
31
|
-
}));
|
|
32
|
-
}
|
|
33
|
-
ngOnDestroy() {
|
|
34
|
-
this.subscriptions.unsubscribe();
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* Sets current drawer stack status to open
|
|
38
|
-
*/
|
|
39
|
-
open(componentType) {
|
|
40
|
-
this.componentType = componentType;
|
|
41
|
-
this.isOpened.next(true);
|
|
42
|
-
}
|
|
43
|
-
/**
|
|
44
|
-
* Emits event to extend the top drawer
|
|
45
|
-
*/
|
|
46
|
-
extend() {
|
|
47
|
-
this.toggleTopDrawerExtension$.next();
|
|
48
|
-
}
|
|
49
|
-
/**
|
|
50
|
-
* Emits event to close the top drawer, checks if history is empty, if so,
|
|
51
|
-
* sets current drawer stack status to closed and clears history and current
|
|
52
|
-
* selection
|
|
53
|
-
*/
|
|
54
|
-
close() {
|
|
55
|
-
this.closeTopDrawer$.next();
|
|
56
|
-
if (this.selectionHistory.getCurrentSelectionIndex() === -1) {
|
|
57
|
-
this.isOpened.next(false);
|
|
58
|
-
this.selectionHistory.clearHistory();
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
/**
|
|
62
|
-
* Emits event to close the top drawer
|
|
63
|
-
*/
|
|
64
|
-
closeTop() {
|
|
65
|
-
this.closeTopDrawer$.next();
|
|
66
|
-
}
|
|
67
|
-
/**
|
|
68
|
-
* Sets current drawer stack status to closed, clears history and emits event
|
|
69
|
-
* to close all drawers
|
|
70
|
-
*
|
|
71
|
-
* @param keepDrawerOpen if true, do not trigger layout animation
|
|
72
|
-
*/
|
|
73
|
-
closeAll(keepDrawerOpen = false) {
|
|
74
|
-
if (!keepDrawerOpen)
|
|
75
|
-
this.isOpened.next(false);
|
|
76
|
-
this.selectionHistory.clearHistory();
|
|
77
|
-
this.closeAllDrawers$.next();
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Replace the current selection with the given article by closing all
|
|
81
|
-
* drawers and opening the drawer with the new selection without triggering
|
|
82
|
-
* layout animation
|
|
83
|
-
*
|
|
84
|
-
* @param article the article to replace the current selection with
|
|
85
|
-
*/
|
|
86
|
-
replace(article) {
|
|
87
|
-
const { id } = getState(this.selectionStore);
|
|
88
|
-
if (id && (!article || article.id === id))
|
|
89
|
-
return;
|
|
90
|
-
// close everything without trigger layout animation
|
|
91
|
-
this.closeAll(true);
|
|
92
|
-
// set selection
|
|
93
|
-
this.selection.setCurrentArticle(article);
|
|
94
|
-
// open drawer
|
|
95
|
-
this.open();
|
|
96
|
-
}
|
|
97
|
-
/**
|
|
98
|
-
* Stack the given article by setting the current selection and opening the
|
|
99
|
-
* drawer
|
|
100
|
-
*
|
|
101
|
-
* @param article the article to stack
|
|
102
|
-
*/
|
|
103
|
-
stack(article, withQueryText) {
|
|
104
|
-
const { id } = getState(this.selectionStore);
|
|
105
|
-
if (id && (!article || article.id === id))
|
|
106
|
-
return;
|
|
107
|
-
// force top drawer to collapse
|
|
108
|
-
this.forceTopDrawerCollapse$.next();
|
|
109
|
-
// set selection
|
|
110
|
-
this.selection.setCurrentArticle(article, withQueryText);
|
|
111
|
-
// open drawer
|
|
112
|
-
this.open();
|
|
113
|
-
}
|
|
114
|
-
toggleAssistant() {
|
|
115
|
-
if (this.isChatOpened.getValue()) {
|
|
116
|
-
this.backdropService.hide();
|
|
117
|
-
this.closeAssistant();
|
|
118
|
-
}
|
|
119
|
-
else {
|
|
120
|
-
this.backdropService.show();
|
|
121
|
-
this.openAssistant();
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
openAssistant() {
|
|
125
|
-
this.isChatOpened.next(true);
|
|
126
|
-
this.isOpened.next(true);
|
|
127
|
-
this.openChatDrawer$.next();
|
|
128
|
-
this.backdropService.show();
|
|
129
|
-
}
|
|
130
|
-
closeAssistant(keepDrawerOpen = false) {
|
|
131
|
-
this.isChatOpened.next(false);
|
|
132
|
-
if (!keepDrawerOpen && this.selectionHistory.getCurrentSelectionIndex() === -1) {
|
|
133
|
-
this.isOpened.next(false);
|
|
134
|
-
this.closeAllDrawers$.next();
|
|
135
|
-
}
|
|
136
|
-
this.closeChatDrawer$.next();
|
|
137
|
-
this.backdropService.hide();
|
|
138
|
-
}
|
|
139
|
-
askAI(text) {
|
|
140
|
-
this.openAssistant();
|
|
141
|
-
this.askAI$.next(text);
|
|
142
|
-
}
|
|
143
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DrawerStackService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
144
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DrawerStackService, providedIn: 'root' }); }
|
|
145
|
-
}
|
|
146
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DrawerStackService, decorators: [{
|
|
147
|
-
type: Injectable,
|
|
148
|
-
args: [{
|
|
149
|
-
providedIn: 'root'
|
|
150
|
-
}]
|
|
151
|
-
}], ctorParameters: () => [] });
|
|
152
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLXN0YWNrLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3NlcnZpY2VzL2RyYXdlci9kcmF3ZXItc3RhY2suc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBbUIsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ2xGLE9BQU8sRUFBRSxlQUFlLEVBQUUsWUFBWSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3JELE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJekMsT0FBTyxFQUFFLHVCQUF1QixFQUFFLE1BQU0sOEJBQThCLENBQUM7QUFDdkUsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDeEQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sdUJBQXVCLENBQUM7QUFDMUQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDhCQUE4QixDQUFDO0FBQzlELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFNckQsTUFBTSxPQUFPLGtCQUFrQjtJQXNCN0I7UUFyQmdCLGFBQVEsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUMvQyw4QkFBeUIsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQ3JELDRCQUF1QixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDbkQsb0JBQWUsR0FBRyxJQUFJLFlBQVksRUFBUSxDQUFDO1FBQzNDLHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFFNUMsaUJBQVksR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUNuRCxvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFRLENBQUM7UUFDM0MscUJBQWdCLEdBQUcsSUFBSSxZ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QUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDL0IsQ0FBQztRQUVELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsQ0FBQztRQUM3QixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFTSxLQUFLLENBQUMsSUFBWTtRQUN2QixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7UUFDckIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDekIsQ0FBQzs4R0EvSlUsa0JBQWtCO2tIQUFsQixrQkFBa0IsY0FGakIsTUFBTTs7MkZBRVAsa0JBQWtCO2tCQUg5QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEV2ZW50RW1pdHRlciwgSW5qZWN0YWJsZSwgT25EZXN0cm95LCBUeXBlLCBpbmplY3QgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBnZXRTdGF0ZSB9IGZyb20gJ0BuZ3J4L3NpZ25hbHMnO1xuXG5pbXBvcnQgeyBBcnRpY2xlIH0gZnJvbSAnQHNpbmVxdWEvYXRvbWljJztcblxuaW1wb3J0IHsgU2VsZWN0aW9uSGlzdG9yeVNlcnZpY2UgfSBmcm9tICcuLi9zZWxlY3Rpb24taGlzdG9yeS5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGlvblNlcnZpY2UgfSBmcm9tICcuLi9zZWxlY3Rpb24uc2VydmljZSc7XG5pbXBvcnQgeyBOYXZpZ2F0aW9uU2VydmljZSB9IGZyb20gJy4uL25hdmlnYXRpb24uc2VydmljZSc7XG5pbXBvcnQgeyBTZWxlY3Rpb25TdG9yZSB9IGZyb20gJy4uLy4uL3N0b3Jlcy9zZWxlY3Rpb24uc3RvcmUnO1xuaW1wb3J0IHsgQmFja2Ryb3BTZXJ2aWNlIH0gZnJvbSAnLi9iYWNrZHJvcC5zZXJ2aWNlJztcblxuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBEcmF3ZXJTdGFja1NlcnZpY2UgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBwdWJsaWMgcmVhZG9ubHkgaXNPcGVuZWQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgcHVibGljIHJlYWRvbmx5IHRvZ2dsZVRvcERyYXdlckV4dGVuc2lvbiQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG4gIHB1YmxpYyByZWFkb25seSBmb3JjZVRvcERyYXdlckNvbGxhcHNlJCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGNsb3NlVG9wRHJhd2VyJCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGNsb3NlQWxsRHJhd2VycyQgPSBuZXcgRXZlbnRFbWl0dGVyPHZvaWQ+KCk7XG5cbiAgcHVibGljIHJlYWRvbmx5IGlzQ2hhdE9wZW5lZCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBwdWJsaWMgcmVhZG9ubHkgb3BlbkNoYXREcmF3ZXIkID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xuICBwdWJsaWMgcmVhZG9ubHkgY2xvc2VDaGF0RHJhd2VyJCA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcbiAgcHVibGljIHJlYWRvbmx5IGFza0FJJCA9IG5ldyBFdmVudEVtaXR0ZXI8c3RyaW5nPigpO1xuXG4gIHByaXZhdGUgcmVhZG9ubHkgc2VsZWN0aW9uID0gaW5qZWN0KFNlbGVjdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGlvbkhpc3RvcnkgPSBpbmplY3QoU2VsZWN0aW9uSGlzdG9yeVNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGlvblN0b3JlID0gaW5qZWN0KFNlbGVjdGlvblN0b3JlKTtcbiAgcHJpdmF0ZSByZWFkb25seSBuYXZpZ2F0aW9uU2VydmljZSA9IGluamVjdChOYXZpZ2F0aW9uU2VydmljZSk7XG4gIHByaXZhdGUgcmVhZG9ubHkgYmFja2Ryb3BTZXJ2aWNlID0gaW5qZWN0KEJhY2tkcm9wU2VydmljZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzdWJzY3JpcHRpb25zID0gbmV3IFN1YnNjcmlwdGlvbigpO1xuXG4gIHB1YmxpYyBjb21wb25lbnRUeXBlPzogVHlwZTxhbnk+O1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIC8vIG9uIG5ldyBzZWFyY2gsIGNsb3NlIGFsbCBkcmF3ZXJzIGluY2x1ZGluZyBjaGF0IGRyYXdlclxuICAgIHRoaXMuc3Vic2NyaXB0aW9ucy5hZGQoXG4gICAgICB0aGlzLm5hdmlnYXRpb25TZXJ2aWNlLm5hdmlnYXRpb25FbmQkLnN1YnNjcmliZSgoKSA9PiB7XG4gICAgICAgIHRoaXMuY2xvc2VBc3Npc3RhbnQoKTtcbiAgICAgICAgdGhpcy5jbG9zZUFsbCgpO1xuICAgICAgfSlcbiAgICApO1xuICB9XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5zdWJzY3JpcHRpb25zLnVuc3Vic2NyaWJlKCk7XG4gIH1cblxuICAvKipcbiAgICogU2V0cyBjdXJyZW50IGRyYXdlciBzdGFjayBzdGF0dXMgdG8gb3BlblxuICAgKi9cbiAgcHVibGljIG9wZW4oY29tcG9uZW50VHlwZT86IFR5cGU8YW55Pik6IHZvaWQge1xuICAgIHRoaXMuY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudFR5cGU7XG4gICAgdGhpcy5pc09wZW5lZC5uZXh0KHRydWUpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IHRvIGV4dGVuZCB0aGUgdG9wIGRyYXdlclxuICAgKi9cbiAgcHVibGljIGV4dGVuZCgpOiB2b2lkIHtcbiAgICB0aGlzLnRvZ2dsZVRvcERyYXdlckV4dGVuc2lvbiQubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IHRvIGNsb3NlIHRoZSB0b3AgZHJhd2VyLCBjaGVja3MgaWYgaGlzdG9yeSBpcyBlbXB0eSwgaWYgc28sXG4gICAqIHNldHMgY3VycmVudCBkcmF3ZXIgc3RhY2sgc3RhdHVzIHRvIGNsb3NlZCBhbmQgY2xlYXJzIGhpc3RvcnkgYW5kIGN1cnJlbnRcbiAgICogc2VsZWN0aW9uXG4gICAqL1xuICBwdWJsaWMgY2xvc2UoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZVRvcERyYXdlciQubmV4dCgpO1xuXG4gICAgaWYgKHRoaXMuc2VsZWN0aW9uSGlzdG9yeS5nZXRDdXJyZW50U2VsZWN0aW9uSW5kZXgoKSA9PT0gLTEpIHtcbiAgICAgIHRoaXMuaXNPcGVuZWQubmV4dChmYWxzZSk7XG4gICAgICB0aGlzLnNlbGVjdGlvbkhpc3RvcnkuY2xlYXJIaXN0b3J5KCk7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEVtaXRzIGV2ZW50IHRvIGNsb3NlIHRoZSB0b3AgZHJhd2VyXG4gICAqL1xuICBwdWJsaWMgY2xvc2VUb3AoKTogdm9pZCB7XG4gICAgdGhpcy5jbG9zZVRvcERyYXdlciQubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFNldHMgY3VycmVudCBkcmF3ZXIgc3RhY2sgc3RhdHVzIHRvIGNsb3NlZCwgY2xlYXJzIGhpc3RvcnkgYW5kIGVtaXRzIGV2ZW50XG4gICAqIHRvIGNsb3NlIGFsbCBkcmF3ZXJzXG4gICAqXG4gICAqIEBwYXJhbSBrZWVwRHJhd2VyT3BlbiBpZiB0cnVlLCBkbyBub3QgdHJpZ2dlciBsYXlvdXQgYW5pbWF0aW9uXG4gICAqL1xuICBwdWJsaWMgY2xvc2VBbGwoa2VlcERyYXdlck9wZW46IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIGlmICgha2VlcERyYXdlck9wZW4pIHRoaXMuaXNPcGVuZWQubmV4dChmYWxzZSk7XG5cbiAgICB0aGlzLnNlbGVjdGlvbkhpc3RvcnkuY2xlYXJIaXN0b3J5KCk7XG5cbiAgICB0aGlzLmNsb3NlQWxsRHJhd2VycyQubmV4dCgpO1xuICB9XG5cbiAgLyoqXG4gICAqIFJlcGxhY2UgdGhlIGN1cnJlbnQgc2VsZWN0aW9uIHdpdGggdGhlIGdpdmVuIGFydGljbGUgYnkgY2xvc2luZyBhbGxcbiAgICogZHJhd2VycyBhbmQgb3BlbmluZyB0aGUgZHJhd2VyIHdpdGggdGhlIG5ldyBzZWxlY3Rpb24gd2l0aG91dCB0cmlnZ2VyaW5nXG4gICAqIGxheW91dCBhbmltYXRpb25cbiAgICpcbiAgICogQHBhcmFtIGFydGljbGUgdGhlIGFydGljbGUgdG8gcmVwbGFjZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gd2l0aFxuICAgKi9cbiAgcHVibGljIHJlcGxhY2UoYXJ0aWNsZTogQXJ0aWNsZSB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGNvbnN0IHsgaWQgfSA9IGdldFN0YXRlKHRoaXMuc2VsZWN0aW9uU3RvcmUpO1xuXG4gICAgaWYgKGlkICYmICghYXJ0aWNsZSB8fCBhcnRpY2xlLmlkID09PSBpZCkpIHJldHVybjtcblxuICAgIC8vIGNsb3NlIGV2ZXJ5dGhpbmcgd2l0aG91dCB0cmlnZ2VyIGxheW91dCBhbmltYXRpb25cbiAgICB0aGlzLmNsb3NlQWxsKHRydWUpO1xuXG4gICAgLy8gc2V0IHNlbGVjdGlvblxuICAgIHRoaXMuc2VsZWN0aW9uLnNldEN1cnJlbnRBcnRpY2xlKGFydGljbGUpO1xuICAgIC8vIG9wZW4gZHJhd2VyXG4gICAgdGhpcy5vcGVuKCk7XG4gIH1cblxuICAvKipcbiAgICogU3RhY2sgdGhlIGdpdmVuIGFydGljbGUgYnkgc2V0dGluZyB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIG9wZW5pbmcgdGhlXG4gICAqIGRyYXdlclxuICAgKlxuICAgKiBAcGFyYW0gYXJ0aWNsZSB0aGUgYXJ0aWNsZSB0byBzdGFja1xuICAgKi9cbiAgcHVibGljIHN0YWNrKGFydGljbGU6IEFydGljbGUgfCB1bmRlZmluZWQsIHdpdGhRdWVyeVRleHQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgY29uc3QgeyBpZCB9ID0gZ2V0U3RhdGUodGhpcy5zZWxlY3Rpb25TdG9yZSk7XG5cbiAgICBpZiAoaWQgJiYgKCFhcnRpY2xlIHx8IGFydGljbGUuaWQgPT09IGlkKSkgcmV0dXJuO1xuXG4gICAgLy8gZm9yY2UgdG9wIGRyYXdlciB0byBjb2xsYXBzZVxuICAgIHRoaXMuZm9yY2VUb3BEcmF3ZXJDb2xsYXBzZSQubmV4dCgpO1xuICAgIC8vIHNldCBzZWxlY3Rpb25cbiAgICB0aGlzLnNlbGVjdGlvbi5zZXRDdXJyZW50QXJ0aWNsZShhcnRpY2xlLCB3aXRoUXVlcnlUZXh0KTtcbiAgICAvLyBvcGVuIGRyYXdlclxuICAgIHRoaXMub3BlbigpO1xuICB9XG5cbiAgcHVibGljIHRvZ2dsZUFzc2lzdGFudCgpOiB2b2lkIHtcbiAgICBpZiAodGhpcy5pc0NoYXRPcGVuZWQuZ2V0VmFsdWUoKSkge1xuICAgICAgdGhpcy5iYWNrZHJvcFNlcnZpY2UuaGlkZSgpO1xuICAgICAgdGhpcy5jbG9zZUFzc2lzdGFudCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmJhY2tkcm9wU2VydmljZS5zaG93KCk7XG4gICAgICB0aGlzLm9wZW5Bc3Npc3RhbnQoKTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgb3BlbkFzc2lzdGFudCgpOiB2b2lkIHtcbiAgICB0aGlzLmlzQ2hhdE9wZW5lZC5uZXh0KHRydWUpO1xuICAgIHRoaXMuaXNPcGVuZWQubmV4dCh0cnVlKTtcbiAgICB0aGlzLm9wZW5DaGF0RHJhd2VyJC5uZXh0KCk7XG5cbiAgICB0aGlzLmJhY2tkcm9wU2VydmljZS5zaG93KCk7XG4gIH1cblxuICBwdWJsaWMgY2xvc2VBc3Npc3RhbnQoa2VlcERyYXdlck9wZW46IGJvb2xlYW4gPSBmYWxzZSk6IHZvaWQge1xuICAgIHRoaXMuaXNDaGF0T3BlbmVkLm5leHQoZmFsc2UpO1xuXG4gICAgaWYgKCFrZWVwRHJhd2VyT3BlbiAmJiB0aGlzLnNlbGVjdGlvbkhpc3RvcnkuZ2V0Q3VycmVudFNlbGVjdGlvbkluZGV4KCkgPT09IC0xKSB7XG4gICAgICB0aGlzLmlzT3BlbmVkLm5leHQoZmFsc2UpO1xuICAgICAgdGhpcy5jbG9zZUFsbERyYXdlcnMkLm5leHQoKTtcbiAgICB9XG5cbiAgICB0aGlzLmNsb3NlQ2hhdERyYXdlciQubmV4dCgpO1xuICAgIHRoaXMuYmFja2Ryb3BTZXJ2aWNlLmhpZGUoKTtcbiAgfVxuXG4gIHB1YmxpYyBhc2tBSSh0ZXh0OiBzdHJpbmcpOiB2b2lkIHtcbiAgICB0aGlzLm9wZW5Bc3Npc3RhbnQoKTtcbiAgICB0aGlzLmFza0FJJC5uZXh0KHRleHQpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
import { Injectable, inject } from '@angular/core';
|
|
2
|
-
import { BehaviorSubject } from 'rxjs';
|
|
3
|
-
import { BackdropService } from './backdrop.service';
|
|
4
|
-
import * as i0 from "@angular/core";
|
|
5
|
-
export class DrawerService {
|
|
6
|
-
constructor() {
|
|
7
|
-
this.isOpened = new BehaviorSubject(false);
|
|
8
|
-
this.isExtended = new BehaviorSubject(false);
|
|
9
|
-
this.backdrop = inject(BackdropService);
|
|
10
|
-
}
|
|
11
|
-
open() {
|
|
12
|
-
this.isOpened.next(true);
|
|
13
|
-
}
|
|
14
|
-
close() {
|
|
15
|
-
this.collapse();
|
|
16
|
-
this.isOpened.next(false);
|
|
17
|
-
}
|
|
18
|
-
toggle() {
|
|
19
|
-
this.isOpened.getValue() ? this.close() : this.open();
|
|
20
|
-
}
|
|
21
|
-
extend() {
|
|
22
|
-
this.isExtended.next(true);
|
|
23
|
-
this.backdrop.show();
|
|
24
|
-
}
|
|
25
|
-
collapse() {
|
|
26
|
-
this.backdrop.hide();
|
|
27
|
-
this.isExtended.next(false);
|
|
28
|
-
}
|
|
29
|
-
toggleExtension() {
|
|
30
|
-
this.isExtended.getValue() ? this.collapse() : this.extend();
|
|
31
|
-
}
|
|
32
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DrawerService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
33
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DrawerService }); }
|
|
34
|
-
}
|
|
35
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: DrawerService, decorators: [{
|
|
36
|
-
type: Injectable
|
|
37
|
-
}] });
|
|
38
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJhd2VyLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3NlcnZpY2VzL2RyYXdlci9kcmF3ZXIuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUVuRCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQ3ZDLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7QUFHckQsTUFBTSxPQUFPLGFBQWE7SUFEMUI7UUFFa0IsYUFBUSxHQUFHLElBQUksZUFBZSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBQy9DLGVBQVUsR0FBRyxJQUFJLGVBQWUsQ0FBVSxLQUFLLENBQUMsQ0FBQztRQUVoRCxhQUFRLEdBQUcsTUFBTSxDQUFDLGVBQWUsQ0FBQyxDQUFDO0tBNEJyRDtJQTFCUSxJQUFJO1FBQ1QsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDM0IsQ0FBQztJQUVNLEtBQUs7UUFDVixJQUFJLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDaEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDNUIsQ0FBQztJQUVNLE1BQU07UUFDWCxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4RCxDQUFDO0lBRU0sTUFBTTtRQUNYLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQzNCLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVNLFFBQVE7UUFDYixJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFDO0lBQzlCLENBQUM7SUFFTSxlQUFlO1FBQ3BCLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQy9ELENBQUM7OEdBL0JVLGFBQWE7a0hBQWIsYUFBYTs7MkZBQWIsYUFBYTtrQkFEekIsVUFBVSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IEJhY2tkcm9wU2VydmljZSB9IGZyb20gJy4vYmFja2Ryb3Auc2VydmljZSc7XG5cbkBJbmplY3RhYmxlKClcbmV4cG9ydCBjbGFzcyBEcmF3ZXJTZXJ2aWNlIHtcbiAgcHVibGljIHJlYWRvbmx5IGlzT3BlbmVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG4gIHB1YmxpYyByZWFkb25seSBpc0V4dGVuZGVkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxib29sZWFuPihmYWxzZSk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBiYWNrZHJvcCA9IGluamVjdChCYWNrZHJvcFNlcnZpY2UpO1xuXG4gIHB1YmxpYyBvcGVuKCk6IHZvaWQge1xuICAgIHRoaXMuaXNPcGVuZWQubmV4dCh0cnVlKTtcbiAgfVxuXG4gIHB1YmxpYyBjbG9zZSgpOiB2b2lkIHtcbiAgICB0aGlzLmNvbGxhcHNlKCk7XG4gICAgdGhpcy5pc09wZW5lZC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGUoKTogdm9pZCB7XG4gICAgdGhpcy5pc09wZW5lZC5nZXRWYWx1ZSgpID8gdGhpcy5jbG9zZSgpIDogdGhpcy5vcGVuKCk7XG4gIH1cblxuICBwdWJsaWMgZXh0ZW5kKCk6IHZvaWQge1xuICAgIHRoaXMuaXNFeHRlbmRlZC5uZXh0KHRydWUpO1xuICAgIHRoaXMuYmFja2Ryb3Auc2hvdygpO1xuICB9XG5cbiAgcHVibGljIGNvbGxhcHNlKCk6IHZvaWQge1xuICAgIHRoaXMuYmFja2Ryb3AuaGlkZSgpO1xuICAgIHRoaXMuaXNFeHRlbmRlZC5uZXh0KGZhbHNlKTtcbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVFeHRlbnNpb24oKTogdm9pZCB7XG4gICAgdGhpcy5pc0V4dGVuZGVkLmdldFZhbHVlKCkgPyB0aGlzLmNvbGxhcHNlKCkgOiB0aGlzLmV4dGVuZCgpO1xuICB9XG59XG4iXX0=
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
export * from "./application.service";
|
|
2
|
-
export * from "./autocomplete.service";
|
|
3
|
-
export * from "./label.service";
|
|
4
|
-
export * from "./navigation.service";
|
|
5
|
-
export * from "./saved-searches.service";
|
|
6
|
-
export * from "./search.service";
|
|
7
|
-
export * from "./selection.service";
|
|
8
|
-
export * from "./selection-history.service";
|
|
9
|
-
export * from "./drawer/drawer-stack.service";
|
|
10
|
-
export * from "./drawer/backdrop.service";
|
|
11
|
-
export * from "./drawer/drawer.service";
|
|
12
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3NlcnZpY2VzL2luZGV4LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLGNBQWMsdUJBQXVCLENBQUM7QUFDdEMsY0FBYyx3QkFBd0IsQ0FBQztBQUN2QyxjQUFjLGlCQUFpQixDQUFDO0FBQ2hDLGNBQWMsc0JBQXNCLENBQUM7QUFDckMsY0FBYywwQkFBMEIsQ0FBQztBQUN6QyxjQUFjLGtCQUFrQixDQUFDO0FBQ2pDLGNBQWMscUJBQXFCLENBQUM7QUFDcEMsY0FBYyw2QkFBNkIsQ0FBQztBQUU1QyxjQUFjLCtCQUErQixDQUFDO0FBQzlDLGNBQWMsMkJBQTJCLENBQUM7QUFDMUMsY0FBYyx5QkFBeUIsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCAqIGZyb20gXCIuL2FwcGxpY2F0aW9uLnNlcnZpY2VcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vYXV0b2NvbXBsZXRlLnNlcnZpY2VcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vbGFiZWwuc2VydmljZVwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9uYXZpZ2F0aW9uLnNlcnZpY2VcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vc2F2ZWQtc2VhcmNoZXMuc2VydmljZVwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9zZWFyY2guc2VydmljZVwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9zZWxlY3Rpb24uc2VydmljZVwiO1xyXG5leHBvcnQgKiBmcm9tIFwiLi9zZWxlY3Rpb24taGlzdG9yeS5zZXJ2aWNlXCI7XHJcblxyXG5leHBvcnQgKiBmcm9tIFwiLi9kcmF3ZXIvZHJhd2VyLXN0YWNrLnNlcnZpY2VcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vZHJhd2VyL2JhY2tkcm9wLnNlcnZpY2VcIjtcclxuZXhwb3J0ICogZnJvbSBcIi4vZHJhd2VyL2RyYXdlci5zZXJ2aWNlXCI7XHJcbiJdfQ==
|
|
@@ -1,161 +0,0 @@
|
|
|
1
|
-
import { Injectable, inject, signal } from '@angular/core';
|
|
2
|
-
import { AppStore } from '../stores/app.store';
|
|
3
|
-
import { fetchLabels, labels } from '@sinequa/atomic';
|
|
4
|
-
import { from, map, of, switchMap } from 'rxjs';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
;
|
|
7
|
-
export class LabelService {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.appStore = inject(AppStore);
|
|
10
|
-
this.hasAccess = signal(undefined);
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Check user rights to verify if they can access labels handling
|
|
14
|
-
* @returns if has the rights
|
|
15
|
-
*/
|
|
16
|
-
async canHandleLabels() {
|
|
17
|
-
if (this.hasAccess() !== undefined)
|
|
18
|
-
return this.hasAccess();
|
|
19
|
-
const service = this.appStore.getWebServiceByType('labels');
|
|
20
|
-
if (!service)
|
|
21
|
-
return false;
|
|
22
|
-
try {
|
|
23
|
-
const rights = await labels.getUserRights();
|
|
24
|
-
this.hasAccess.set(rights.canEditPublicLabels || rights.canManagePublicLabels);
|
|
25
|
-
return this.hasAccess();
|
|
26
|
-
}
|
|
27
|
-
catch (error) {
|
|
28
|
-
console.log("labels.canHandleLabels failure - error: ", error);
|
|
29
|
-
return false;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
/**
|
|
33
|
-
* Get relevant config info from the labels web service
|
|
34
|
-
* @returns the LabelsConfig or undefined if no rights
|
|
35
|
-
*/
|
|
36
|
-
getLabelsConfig() {
|
|
37
|
-
return from(this.canHandleLabels())
|
|
38
|
-
.pipe(map((canHandle) => {
|
|
39
|
-
if (!canHandle)
|
|
40
|
-
return undefined;
|
|
41
|
-
const { allowPublicLabelsCreation, allowPublicLabelsModification, privateLabelsField, publicLabelsField, defaultPublicLabels, labelsAutoSuggestMaxCount, labelsAutoSuggestWildcard } = this.appStore.getWebServiceByType('labels');
|
|
42
|
-
return {
|
|
43
|
-
allowPublicLabelsCreation,
|
|
44
|
-
allowPublicLabelsModification,
|
|
45
|
-
privateLabelsField,
|
|
46
|
-
publicLabelsField,
|
|
47
|
-
defaultPublicLabels,
|
|
48
|
-
labelsAutoSuggestMaxCount,
|
|
49
|
-
labelsAutoSuggestWildcard
|
|
50
|
-
};
|
|
51
|
-
}));
|
|
52
|
-
}
|
|
53
|
-
/**
|
|
54
|
-
* Fetch labels from string
|
|
55
|
-
* @param prefix the string prefix to filter with
|
|
56
|
-
* @param publicOnly whether they should be public or not
|
|
57
|
-
* @param locale optional locale filtering
|
|
58
|
-
* @returns list of label strings
|
|
59
|
-
*/
|
|
60
|
-
fetch(prefix, publicOnly = true, locale) {
|
|
61
|
-
return from(fetchLabels(prefix, publicOnly, locale));
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Add some labels to many documents
|
|
65
|
-
* @param labelsToAdd list of labels to add
|
|
66
|
-
* @param ids list of document id to add the label
|
|
67
|
-
* @param publicOnly whether the operation should be public only
|
|
68
|
-
* @returns a promise that resolves when the operation is complete
|
|
69
|
-
*/
|
|
70
|
-
add(labelsToAdd, ids, publicOnly) {
|
|
71
|
-
return from(this.canHandleLabels())
|
|
72
|
-
.pipe(switchMap((canHandle) => {
|
|
73
|
-
if (!canHandle)
|
|
74
|
-
return of(undefined);
|
|
75
|
-
return from(labels.add(labelsToAdd, ids, publicOnly));
|
|
76
|
-
}));
|
|
77
|
-
}
|
|
78
|
-
/**
|
|
79
|
-
* Remove some labels from many documents
|
|
80
|
-
* @param labelsToRemove list of labels to remove
|
|
81
|
-
* @param ids list of document id to add the label
|
|
82
|
-
* @param publicOnly whether the operation should be public only
|
|
83
|
-
* @returns a promise that resolves when the operation is complete
|
|
84
|
-
*/
|
|
85
|
-
remove(labelsToRemove, ids, publicOnly) {
|
|
86
|
-
return from(this.canHandleLabels())
|
|
87
|
-
.pipe(switchMap((canHandle) => {
|
|
88
|
-
if (!canHandle)
|
|
89
|
-
return of(undefined);
|
|
90
|
-
return from(labels.remove(labelsToRemove, ids, publicOnly));
|
|
91
|
-
}));
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Name some labels to a new name
|
|
95
|
-
* @param labelsToRename list of labels to rename
|
|
96
|
-
* @param newLabel the new label name
|
|
97
|
-
* @param publicOnly whether the operation should be public only
|
|
98
|
-
* @returns a promise that resolves when the operation is complete
|
|
99
|
-
*/
|
|
100
|
-
rename(labelsToRename, newLabel, publicOnly) {
|
|
101
|
-
return from(this.canHandleLabels())
|
|
102
|
-
.pipe(switchMap((canHandle) => {
|
|
103
|
-
if (!canHandle)
|
|
104
|
-
return of(undefined);
|
|
105
|
-
return from(labels.rename(labelsToRename, newLabel, publicOnly));
|
|
106
|
-
}));
|
|
107
|
-
}
|
|
108
|
-
/**
|
|
109
|
-
* Delete some labels
|
|
110
|
-
* @param labelsToDelete the labels to delete
|
|
111
|
-
* @param publicOnly whether the operation should be public only
|
|
112
|
-
* @returns a promise that resolves when the operation is complete
|
|
113
|
-
*/
|
|
114
|
-
delete(labelsToDelete, publicOnly) {
|
|
115
|
-
return from(this.canHandleLabels())
|
|
116
|
-
.pipe(switchMap((canHandle) => {
|
|
117
|
-
if (!canHandle)
|
|
118
|
-
return of(undefined);
|
|
119
|
-
return from(labels.delete(labelsToDelete, publicOnly));
|
|
120
|
-
}));
|
|
121
|
-
}
|
|
122
|
-
/**
|
|
123
|
-
* Create some labels for a query
|
|
124
|
-
* @param labelstoAdd the labels to create
|
|
125
|
-
* @param query the query object to which the labels will be added
|
|
126
|
-
* @param publicOnly whether the operation should be public only
|
|
127
|
-
* @returns a promise that resolves when the operation is complete
|
|
128
|
-
*/
|
|
129
|
-
bulkAdd(labelstoAdd, query, publicOnly) {
|
|
130
|
-
return from(this.canHandleLabels())
|
|
131
|
-
.pipe(switchMap((canHandle) => {
|
|
132
|
-
if (!canHandle)
|
|
133
|
-
return of(undefined);
|
|
134
|
-
return from(labels.bulkAdd(labelstoAdd, query, publicOnly));
|
|
135
|
-
}));
|
|
136
|
-
}
|
|
137
|
-
/**
|
|
138
|
-
* Delete some labels from a query
|
|
139
|
-
* @param labelsToRemove the labels to remove
|
|
140
|
-
* @param query the query object to which the labels will be removed
|
|
141
|
-
* @param publicOnly whether the operation should be public only
|
|
142
|
-
* @returns a promise that resolves when the operation is complete
|
|
143
|
-
*/
|
|
144
|
-
bulkRemove(labelsToRemove, query, publicOnly) {
|
|
145
|
-
return from(this.canHandleLabels())
|
|
146
|
-
.pipe(switchMap((canHandle) => {
|
|
147
|
-
if (!canHandle)
|
|
148
|
-
return of(undefined);
|
|
149
|
-
return from(labels.bulkRemove(labelsToRemove, query, publicOnly));
|
|
150
|
-
}));
|
|
151
|
-
}
|
|
152
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: LabelService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
153
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: LabelService, providedIn: 'root' }); }
|
|
154
|
-
}
|
|
155
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: LabelService, decorators: [{
|
|
156
|
-
type: Injectable,
|
|
157
|
-
args: [{
|
|
158
|
-
providedIn: 'root'
|
|
159
|
-
}]
|
|
160
|
-
}] });
|
|
161
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibGFiZWwuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0b21pYy1hbmd1bGFyL3NyYy9saWIvc2VydmljZXMvbGFiZWwuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHFCQUFxQixDQUFDO0FBQy9DLE9BQU8sRUFBZ0IsV0FBVyxFQUFFLE1BQU0sRUFBdUIsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RixPQUFPLEVBQThCLElBQUksRUFBRSxHQUFHLEVBQWMsRUFBRSxFQUFFLFNBQVMsRUFBYyxNQUFNLE1BQU0sQ0FBQzs7QUFpQm5HLENBQUM7QUFLRixNQUFNLE9BQU8sWUFBWTtJQUh6QjtRQUlFLGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7UUFFNUIsY0FBUyxHQUFHLE1BQU0sQ0FBc0IsU0FBUyxDQUFDLENBQUM7S0FxS3BEO0lBbktDOzs7T0FHRztJQUNILEtBQUssQ0FBQyxlQUFlO1FBQ25CLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLFNBQVM7WUFBRSxPQUFPLElBQUksQ0FBQyxTQUFTLEVBQUcsQ0FBQztRQUU3RCxNQUFNLE9BQU8sR0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLG1CQUFtQixDQUFDLFFBQVEsQ0FBc0IsQ0FBQztRQUNsRixJQUFJLENBQUMsT0FBTztZQUFFLE9BQU8sS0FBSyxDQUFDO1FBRTNCLElBQUksQ0FBQztZQUNILE1BQU0sTUFBTSxHQUFHLE1BQU0sTUFBTSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzVDLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxtQkFBbUIsSUFBSSxNQUFNLENBQUMscUJBQXFCLENBQUMsQ0FBQztZQUMvRSxP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O2tIQUFaLFlBQVksY0FGWCxNQUFNOzsyRkFFUCxZQUFZO2tCQUh4QixVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCwgc2lnbmFsIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IEFwcFN0b3JlIH0gZnJvbSAnLi4vc3RvcmVzL2FwcC5zdG9yZSc7XG5pbXBvcnQgeyBDQ1dlYlNlcnZpY2UsIGZldGNoTGFiZWxzLCBsYWJlbHMsIExhYmVsc1JpZ2h0cywgUXVlcnkgfSBmcm9tICdAc2luZXF1YS9hdG9taWMnO1xuaW1wb3J0IHsgY2F0Y2hFcnJvciwgZmlyc3RWYWx1ZUZyb20sIGZyb20sIG1hcCwgT2JzZXJ2YWJsZSwgb2YsIHN3aXRjaE1hcCwgdGhyb3dFcnJvciB9IGZyb20gJ3J4anMnO1xuXG50eXBlIExhYmVsc1dlYlNlcnZpY2UgPSBDQ1dlYlNlcnZpY2UgJiBMYWJlbHNDb25maWcgJiB7XG4gIGFsbG93ZWRXaXRoQW55U0JBPzogYm9vbGVhbixcbiAgbGFiZWxzQnVsa0RvY0xpbWl0Pzogc3RyaW5nLFxuICByZXZpc2lvbj86IG51bWJlcixcbiAgdXNlRGlzdHJpYnV0aW9uUmVnZXg/OiBib29sZWFuLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIExhYmVsc0NvbmZpZyB7XG4gIGFsbG93UHVibGljTGFiZWxzQ3JlYXRpb24/OiBib29sZWFuO1xuICBhbGxvd1B1YmxpY0xhYmVsc01vZGlmaWNhdGlvbj86IGJvb2xlYW47XG4gIHByaXZhdGVMYWJlbHNGaWVsZD86IHN0cmluZztcbiAgcHVibGljTGFiZWxzRmllbGQ/OiBzdHJpbmc7XG4gIGRlZmF1bHRQdWJsaWNMYWJlbHM/OiBzdHJpbmc7XG4gIGxhYmVsc0F1dG9TdWdnZXN0TWF4Q291bnQ/OiBzdHJpbmc7XG4gIGxhYmVsc0F1dG9TdWdnZXN0V2lsZGNhcmQ/OiBzdHJpbmc7XG59O1xuXG5ASW5qZWN0YWJsZSh7XG4gIHByb3ZpZGVkSW46ICdyb290J1xufSlcbmV4cG9ydCBjbGFzcyBMYWJlbFNlcnZpY2Uge1xuICBhcHBTdG9yZSA9IGluamVjdChBcHBTdG9yZSk7XG5cbiAgaGFzQWNjZXNzID0gc2lnbmFsPGJvb2xlYW4gfCB1bmRlZmluZWQ+KHVuZGVmaW5lZCk7XG5cbiAgLyoqXG4gICAqIENoZWNrIHVzZXIgcmlnaHRzIHRvIHZlcmlmeSBpZiB0aGV5IGNhbiBhY2Nlc3MgbGFiZWxzIGhhbmRsaW5nXG4gICAqIEByZXR1cm5zIGlmIGhhcyB0aGUgcmlnaHRzXG4gICAqL1xuICBhc3luYyBjYW5IYW5kbGVMYWJlbHMoKTogUHJvbWlzZTxib29sZWFuPiB7XG4gICAgaWYgKHRoaXMuaGFzQWNjZXNzKCkgIT09IHVuZGVmaW5lZCkgcmV0dXJuIHRoaXMuaGFzQWNjZXNzKCkhO1xuXG4gICAgY29uc3Qgc2VydmljZSA9ICh0aGlzLmFwcFN0b3JlLmdldFdlYlNlcnZpY2VCeVR5cGUoJ2xhYmVscycpIGFzIExhYmVsc1dlYlNlcnZpY2UpO1xuICAgIGlmICghc2VydmljZSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdHJ5IHtcbiAgICAgIGNvbnN0IHJpZ2h0cyA9IGF3YWl0IGxhYmVscy5nZXRVc2VyUmlnaHRzKCk7XG4gICAgICB0aGlzLmhhc0FjY2Vzcy5zZXQocmlnaHRzLmNhbkVkaXRQdWJsaWNMYWJlbHMgfHwgcmlnaHRzLmNhbk1hbmFnZVB1YmxpY0xhYmVscyk7XG4gICAgICByZXR1cm4gdGhpcy5oYXNBY2Nlc3MoKSE7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIGNvbnNvbGUubG9nKFwibGFiZWxzLmNhbkhhbmRsZUxhYmVscyBmYWlsdXJlIC0gZXJyb3I6IFwiLCBlcnJvcik7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLyoqXG4gICAqIEdldCByZWxldmFudCBjb25maWcgaW5mbyBmcm9tIHRoZSBsYWJlbHMgd2ViIHNlcnZpY2VcbiAgICogQHJldHVybnMgdGhlIExhYmVsc0NvbmZpZyBvciB1bmRlZmluZWQgaWYgbm8gcmlnaHRzXG4gICAqL1xuICBnZXRMYWJlbHNDb25maWcoKTogT2JzZXJ2YWJsZTxMYWJlbHNDb25maWcgfCB1bmRlZmluZWQ+IHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLmNhbkhhbmRsZUxhYmVscygpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIG1hcCgoY2FuSGFuZGxlOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgaWYgKCFjYW5IYW5kbGUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgICBjb25zdCB7IGFsbG93UHVibGljTGFiZWxzQ3JlYXRpb24sIGFsbG93UHVibGljTGFiZWxzTW9kaWZpY2F0aW9uLCBwcml2YXRlTGFiZWxzRmllbGQsIHB1YmxpY0xhYmVsc0ZpZWxkLFxuICAgICAgICAgICAgZGVmYXVsdFB1YmxpY0xhYmVscywgbGFiZWxzQXV0b1N1Z2dlc3RNYXhDb3VudCwgbGFiZWxzQXV0b1N1Z2dlc3RXaWxkY2FyZCB9ID0gKHRoaXMuYXBwU3RvcmUuZ2V0V2ViU2VydmljZUJ5VHlwZSgnbGFiZWxzJykgYXMgTGFiZWxzV2ViU2VydmljZSk7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgYWxsb3dQdWJsaWNMYWJlbHNDcmVhdGlvbixcbiAgICAgICAgICAgIGFsbG93UHVibGljTGFiZWxzTW9kaWZpY2F0aW9uLFxuICAgICAgICAgICAgcHJpdmF0ZUxhYmVsc0ZpZWxkLFxuICAgICAgICAgICAgcHVibGljTGFiZWxzRmllbGQsXG4gICAgICAgICAgICBkZWZhdWx0UHVibGljTGFiZWxzLFxuICAgICAgICAgICAgbGFiZWxzQXV0b1N1Z2dlc3RNYXhDb3VudCxcbiAgICAgICAgICAgIGxhYmVsc0F1dG9TdWdnZXN0V2lsZGNhcmRcbiAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoIGxhYmVscyBmcm9tIHN0cmluZ1xuICAgKiBAcGFyYW0gcHJlZml4IHRoZSBzdHJpbmcgcHJlZml4IHRvIGZpbHRlciB3aXRoXG4gICAqIEBwYXJhbSBwdWJsaWNPbmx5IHdoZXRoZXIgdGhleSBzaG91bGQgYmUgcHVibGljIG9yIG5vdFxuICAgKiBAcGFyYW0gbG9jYWxlIG9wdGlvbmFsIGxvY2FsZSBmaWx0ZXJpbmdcbiAgICogQHJldHVybnMgbGlzdCBvZiBsYWJlbCBzdHJpbmdzXG4gICAqL1xuICBmZXRjaChwcmVmaXg6IHN0cmluZywgcHVibGljT25seTogYm9vbGVhbiA9IHRydWUsIGxvY2FsZT86IHN0cmluZyk6IE9ic2VydmFibGU8c3RyaW5nW10+IHtcbiAgICByZXR1cm4gZnJvbShmZXRjaExhYmVscyhwcmVmaXgsIHB1YmxpY09ubHksIGxvY2FsZSkpO1xuICB9XG5cbiAgLyoqXG4gICAqIEFkZCBzb21lIGxhYmVscyB0byBtYW55IGRvY3VtZW50c1xuICAgKiBAcGFyYW0gbGFiZWxzVG9BZGQgbGlzdCBvZiBsYWJlbHMgdG8gYWRkXG4gICAqIEBwYXJhbSBpZHMgbGlzdCBvZiBkb2N1bWVudCBpZCB0byBhZGQgdGhlIGxhYmVsXG4gICAqIEBwYXJhbSBwdWJsaWNPbmx5IHdoZXRoZXIgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcHVibGljIG9ubHlcbiAgICogQHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2hlbiB0aGUgb3BlcmF0aW9uIGlzIGNvbXBsZXRlXG4gICAqL1xuICBhZGQobGFiZWxzVG9BZGQ6IHN0cmluZ1tdLCBpZHM6IHN0cmluZ1tdLCBwdWJsaWNPbmx5PzogYm9vbGVhbik6IE9ic2VydmFibGU8dm9pZD4ge1xuICAgIHJldHVybiBmcm9tKHRoaXMuY2FuSGFuZGxlTGFiZWxzKCkpXG4gICAgICAucGlwZShcbiAgICAgICAgc3dpdGNoTWFwKChjYW5IYW5kbGU6IGJvb2xlYW4pID0+IHtcbiAgICAgICAgICBpZiAoIWNhbkhhbmRsZSkgcmV0dXJuIG9mKHVuZGVmaW5lZCk7XG5cbiAgICAgICAgICByZXR1cm4gZnJvbShsYWJlbHMuYWRkKGxhYmVsc1RvQWRkLCBpZHMsIHB1YmxpY09ubHkpKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogUmVtb3ZlIHNvbWUgbGFiZWxzIGZyb20gbWFueSBkb2N1bWVudHNcbiAgICogQHBhcmFtIGxhYmVsc1RvUmVtb3ZlIGxpc3Qgb2YgbGFiZWxzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gaWRzIGxpc3Qgb2YgZG9jdW1lbnQgaWQgdG8gYWRkIHRoZSBsYWJlbFxuICAgKiBAcGFyYW0gcHVibGljT25seSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHB1YmxpYyBvbmx5XG4gICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgcmVtb3ZlKGxhYmVsc1RvUmVtb3ZlOiBzdHJpbmdbXSwgaWRzOiBzdHJpbmdbXSwgcHVibGljT25seT86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLmNhbkhhbmRsZUxhYmVscygpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoY2FuSGFuZGxlOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgaWYgKCFjYW5IYW5kbGUpIHJldHVybiBvZih1bmRlZmluZWQpO1xuXG4gICAgICAgICAgcmV0dXJuIGZyb20obGFiZWxzLnJlbW92ZShsYWJlbHNUb1JlbW92ZSwgaWRzLCBwdWJsaWNPbmx5KSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hbWUgc29tZSBsYWJlbHMgdG8gYSBuZXcgbmFtZVxuICAgKiBAcGFyYW0gbGFiZWxzVG9SZW5hbWUgbGlzdCBvZiBsYWJlbHMgdG8gcmVuYW1lXG4gICAqIEBwYXJhbSBuZXdMYWJlbCB0aGUgbmV3IGxhYmVsIG5hbWVcbiAgICogQHBhcmFtIHB1YmxpY09ubHkgd2hldGhlciB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBwdWJsaWMgb25seVxuICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIHJlbmFtZShsYWJlbHNUb1JlbmFtZTogc3RyaW5nW10sIG5ld0xhYmVsOiBzdHJpbmcsIHB1YmxpY09ubHk/OiBib29sZWFuKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb20odGhpcy5jYW5IYW5kbGVMYWJlbHMoKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGNhbkhhbmRsZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmICghY2FuSGFuZGxlKSByZXR1cm4gb2YodW5kZWZpbmVkKTtcblxuICAgICAgICAgIHJldHVybiBmcm9tKGxhYmVscy5yZW5hbWUobGFiZWxzVG9SZW5hbWUsIG5ld0xhYmVsLCBwdWJsaWNPbmx5KSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIERlbGV0ZSBzb21lIGxhYmVsc1xuICAgKiBAcGFyYW0gbGFiZWxzVG9EZWxldGUgdGhlIGxhYmVscyB0byBkZWxldGVcbiAgICogQHBhcmFtIHB1YmxpY09ubHkgd2hldGhlciB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBwdWJsaWMgb25seVxuICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIGRlbGV0ZShsYWJlbHNUb0RlbGV0ZTogc3RyaW5nW10sIHB1YmxpY09ubHk/OiBib29sZWFuKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb20odGhpcy5jYW5IYW5kbGVMYWJlbHMoKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGNhbkhhbmRsZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmICghY2FuSGFuZGxlKSByZXR1cm4gb2YodW5kZWZpbmVkKTtcblxuICAgICAgICAgIHJldHVybiBmcm9tKGxhYmVscy5kZWxldGUobGFiZWxzVG9EZWxldGUsIHB1YmxpY09ubHkpKTtcbiAgICAgICAgfSlcbiAgICAgICk7XG4gIH1cblxuICAvKipcbiAgICogQ3JlYXRlIHNvbWUgbGFiZWxzIGZvciBhIHF1ZXJ5XG4gICAqIEBwYXJhbSBsYWJlbHN0b0FkZCB0aGUgbGFiZWxzIHRvIGNyZWF0ZVxuICAgKiBAcGFyYW0gcXVlcnkgdGhlIHF1ZXJ5IG9iamVjdCB0byB3aGljaCB0aGUgbGFiZWxzIHdpbGwgYmUgYWRkZWRcbiAgICogQHBhcmFtIHB1YmxpY09ubHkgd2hldGhlciB0aGUgb3BlcmF0aW9uIHNob3VsZCBiZSBwdWJsaWMgb25seVxuICAgKiBAcmV0dXJucyBhIHByb21pc2UgdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBvcGVyYXRpb24gaXMgY29tcGxldGVcbiAgICovXG4gIGJ1bGtBZGQobGFiZWxzdG9BZGQ6IHN0cmluZ1tdLCBxdWVyeTogUXVlcnksIHB1YmxpY09ubHk/OiBib29sZWFuKTogT2JzZXJ2YWJsZTx2b2lkPiB7XG4gICAgcmV0dXJuIGZyb20odGhpcy5jYW5IYW5kbGVMYWJlbHMoKSlcbiAgICAgIC5waXBlKFxuICAgICAgICBzd2l0Y2hNYXAoKGNhbkhhbmRsZTogYm9vbGVhbikgPT4ge1xuICAgICAgICAgIGlmICghY2FuSGFuZGxlKSByZXR1cm4gb2YodW5kZWZpbmVkKTtcblxuICAgICAgICAgIHJldHVybiBmcm9tKGxhYmVscy5idWxrQWRkKGxhYmVsc3RvQWRkLCBxdWVyeSwgcHVibGljT25seSkpO1xuICAgICAgICB9KVxuICAgICAgKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGUgc29tZSBsYWJlbHMgZnJvbSBhIHF1ZXJ5XG4gICAqIEBwYXJhbSBsYWJlbHNUb1JlbW92ZSB0aGUgbGFiZWxzIHRvIHJlbW92ZVxuICAgKiBAcGFyYW0gcXVlcnkgdGhlIHF1ZXJ5IG9iamVjdCB0byB3aGljaCB0aGUgbGFiZWxzIHdpbGwgYmUgcmVtb3ZlZFxuICAgKiBAcGFyYW0gcHVibGljT25seSB3aGV0aGVyIHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHB1YmxpYyBvbmx5XG4gICAqIEByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gdGhlIG9wZXJhdGlvbiBpcyBjb21wbGV0ZVxuICAgKi9cbiAgYnVsa1JlbW92ZShsYWJlbHNUb1JlbW92ZTogc3RyaW5nW10sIHF1ZXJ5OiBRdWVyeSwgcHVibGljT25seT86IGJvb2xlYW4pOiBPYnNlcnZhYmxlPHZvaWQ+IHtcbiAgICByZXR1cm4gZnJvbSh0aGlzLmNhbkhhbmRsZUxhYmVscygpKVxuICAgICAgLnBpcGUoXG4gICAgICAgIHN3aXRjaE1hcCgoY2FuSGFuZGxlOiBib29sZWFuKSA9PiB7XG4gICAgICAgICAgaWYgKCFjYW5IYW5kbGUpIHJldHVybiBvZih1bmRlZmluZWQpO1xuXG4gICAgICAgICAgcmV0dXJuIGZyb20obGFiZWxzLmJ1bGtSZW1vdmUobGFiZWxzVG9SZW1vdmUsIHF1ZXJ5LCBwdWJsaWNPbmx5KSk7XG4gICAgICAgIH0pXG4gICAgICApO1xuICB9XG59XG4iXX0=
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
import { Injectable, inject } from "@angular/core";
|
|
2
|
-
import { NavigationEnd, Router } from "@angular/router";
|
|
3
|
-
import { filter, map, shareReplay, tap } from "rxjs";
|
|
4
|
-
import { getQueryParamsFromUrl } from "@sinequa/atomic";
|
|
5
|
-
import { AuditService } from "../web-services/audit.service";
|
|
6
|
-
import * as i0 from "@angular/core";
|
|
7
|
-
export class NavigationService {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.router = inject(Router);
|
|
10
|
-
this.auditService = inject(AuditService);
|
|
11
|
-
// The URL after the last navigation event, used to redirect the user after login
|
|
12
|
-
this.urlAfterNavigation = null;
|
|
13
|
-
/**
|
|
14
|
-
* Observable that emits events of type `NavigationEnd` from the Angular Router.
|
|
15
|
-
*
|
|
16
|
-
* This observable performs the following operations:
|
|
17
|
-
* - Maps all router events to `RouterEvent`.
|
|
18
|
-
* - Filters the events to only include instances of `NavigationEnd`.
|
|
19
|
-
* - Taps into the event stream to extract the route name from the URL and notify the audit service of route changes,
|
|
20
|
-
* excluding the "loading" route and duplicate navigations.
|
|
21
|
-
* - Updates the `urlAfterNavigation` property with the current URL after navigation.
|
|
22
|
-
* - Shares the replayed value with a buffer size of 1 to ensure subscribers receive the latest emitted value.
|
|
23
|
-
*
|
|
24
|
-
* @type Observable<RouterEvent>
|
|
25
|
-
*/
|
|
26
|
-
this.navigationEnd$ = this.router.events.pipe(map(event => event), filter((event) => event instanceof NavigationEnd), tap(event => {
|
|
27
|
-
const url = event.url.slice(1).split('?')[0]; // Extract route name
|
|
28
|
-
if (url && (url !== "loading" && url !== this.urlAfterNavigation)) {
|
|
29
|
-
this.auditService.notifyRouteChange(url);
|
|
30
|
-
}
|
|
31
|
-
}), tap(event => this.urlAfterNavigation = event.url), shareReplay(1));
|
|
32
|
-
/**
|
|
33
|
-
* An observable that emits the tab extracted from the URL pathname or the last part of the URL.
|
|
34
|
-
*
|
|
35
|
-
* This observable listens to navigation end events and processes the URL to determine the current tab.
|
|
36
|
-
* It creates a fake URL object to extract the pathname and then uses the `getQueryParamsFromUrl` function
|
|
37
|
-
* to extract the tab from the URL pathname or defaults to the last part of the URL if no tab is found.
|
|
38
|
-
*
|
|
39
|
-
* @type Observable<string> - An observable that emits the current tab as a string.
|
|
40
|
-
*/
|
|
41
|
-
this.path$ = this.navigationEnd$.pipe(
|
|
42
|
-
// create a fake URL object to extract the pathname
|
|
43
|
-
map((event) => {
|
|
44
|
-
const url = new URL(`http://localhost${event.url}`);
|
|
45
|
-
// extract the tab from the URL pathname or use the last part of the URL
|
|
46
|
-
const { tab = url.pathname.split('/').pop() } = getQueryParamsFromUrl(event.url) || {};
|
|
47
|
-
return tab;
|
|
48
|
-
}));
|
|
49
|
-
}
|
|
50
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: NavigationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
51
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: NavigationService, providedIn: 'root' }); }
|
|
52
|
-
}
|
|
53
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: NavigationService, decorators: [{
|
|
54
|
-
type: Injectable,
|
|
55
|
-
args: [{
|
|
56
|
-
providedIn: 'root'
|
|
57
|
-
}]
|
|
58
|
-
}] });
|
|
59
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibmF2aWdhdGlvbi5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYXRvbWljLWFuZ3VsYXIvc3JjL2xpYi9zZXJ2aWNlcy9uYXZpZ2F0aW9uLnNlcnZpY2UudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDbkQsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLEVBQWUsTUFBTSxpQkFBaUIsQ0FBQztBQUNyRSxPQUFPLEVBQUUsTUFBTSxFQUFFLEdBQUcsRUFBRSxXQUFXLEVBQUUsR0FBRyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBRXJELE9BQU8sRUFBRSxxQkFBcUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBRXhELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQzs7QUFLN0QsTUFBTSxPQUFPLGlCQUFpQjtJQUg5QjtRQUltQixXQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ3hCLGlCQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXJELGlGQUFpRjtRQUNqRix1QkFBa0IsR0FBa0IsSUFBSSxDQUFDO1FBRXpDOzs7Ozs7Ozs7Ozs7V0FZRztRQUNJLG1CQUFjLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUM3QyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFvQixDQUFDLEVBQ2xDLE1BQU0sQ0FBQyxDQUFDLEtBQWtCLEVBQUUsRUFBRSxDQUFDLEtBQUssWUFBWSxhQUFhLENBQUMsRUFDOUQsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFO1lBQ1YsTUFBTSxHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMscUJBQXFCO1lBQ25FLElBQUksR0FBRyxJQUFJLENBQUMsR0FBRyxLQUFLLFNBQVMsSUFBSSxHQUFHLEtBQUssSUFBSSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQTtZQUMxQyxDQUFDO1FBQ0gsQ0FBQyxDQUFDLEVBQ0YsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDLGtCQUFrQixHQUFHLEtBQUssQ0FBQyxHQUFHLENBQUMsRUFDakQsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUNmLENBQUM7UUFFRjs7Ozs7Ozs7V0FRRztRQUNJLFVBQUssR0FBRyxJQUFJLENBQUMsY0FBYyxDQUFDLElBQUk7UUFDckMsbURBQW1EO1FBQ25ELEdBQUcsQ0FBQyxDQUFDLEtBQWtCLEVBQUUsRUFBRTtZQUN6QixNQUFNLEdBQUcsR0FBRyxJQUFJLEdBQUcsQ0FBQyxtQkFBbUIsS0FBSyxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUE7WUFDbkQsd0VBQXdFO1lBQ3hFLE1BQU0sRUFBRSxHQUFHLEdBQUcsR0FBRyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsR0FBRyxxQkFBcUIsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3ZGLE9BQU8sR0FBRyxDQUFDO1FBQ2IsQ0FBQyxDQUFDLENBQ0gsQ0FBQztLQUNIOzhHQW5EWSxpQkFBaUI7a0hBQWpCLGlCQUFpQixjQUZoQixNQUFNOzsyRkFFUCxpQkFBaUI7a0JBSDdCLFVBQVU7bUJBQUM7b0JBQ1YsVUFBVSxFQUFFLE1BQU07aUJBQ25CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgSW5qZWN0YWJsZSwgaW5qZWN0IH0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcbmltcG9ydCB7IE5hdmlnYXRpb25FbmQsIFJvdXRlciwgUm91dGVyRXZlbnQgfSBmcm9tIFwiQGFuZ3VsYXIvcm91dGVyXCI7XG5pbXBvcnQgeyBmaWx0ZXIsIG1hcCwgc2hhcmVSZXBsYXksIHRhcCB9IGZyb20gXCJyeGpzXCI7XG5cbmltcG9ydCB7IGdldFF1ZXJ5UGFyYW1zRnJvbVVybCB9IGZyb20gXCJAc2luZXF1YS9hdG9taWNcIjtcblxuaW1wb3J0IHsgQXVkaXRTZXJ2aWNlIH0gZnJvbSBcIi4uL3dlYi1zZXJ2aWNlcy9hdWRpdC5zZXJ2aWNlXCI7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIE5hdmlnYXRpb25TZXJ2aWNlIHtcbiAgcHJpdmF0ZSByZWFkb25seSByb3V0ZXIgPSBpbmplY3QoUm91dGVyKTtcbiAgcHJpdmF0ZSByZWFkb25seSBhdWRpdFNlcnZpY2UgPSBpbmplY3QoQXVkaXRTZXJ2aWNlKTtcblxuICAvLyBUaGUgVVJMIGFmdGVyIHRoZSBsYXN0IG5hdmlnYXRpb24gZXZlbnQsIHVzZWQgdG8gcmVkaXJlY3QgdGhlIHVzZXIgYWZ0ZXIgbG9naW5cbiAgdXJsQWZ0ZXJOYXZpZ2F0aW9uOiBzdHJpbmcgfCBudWxsID0gbnVsbDtcblxuICAvKipcbiAgICogT2JzZXJ2YWJsZSB0aGF0IGVtaXRzIGV2ZW50cyBvZiB0eXBlIGBOYXZpZ2F0aW9uRW5kYCBmcm9tIHRoZSBBbmd1bGFyIFJvdXRlci5cbiAgICpcbiAgICogVGhpcyBvYnNlcnZhYmxlIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9uczpcbiAgICogLSBNYXBzIGFsbCByb3V0ZXIgZXZlbnRzIHRvIGBSb3V0ZXJFdmVudGAuXG4gICAqIC0gRmlsdGVycyB0aGUgZXZlbnRzIHRvIG9ubHkgaW5jbHVkZSBpbnN0YW5jZXMgb2YgYE5hdmlnYXRpb25FbmRgLlxuICAgKiAtIFRhcHMgaW50byB0aGUgZXZlbnQgc3RyZWFtIHRvIGV4dHJhY3QgdGhlIHJvdXRlIG5hbWUgZnJvbSB0aGUgVVJMIGFuZCBub3RpZnkgdGhlIGF1ZGl0IHNlcnZpY2Ugb2Ygcm91dGUgY2hhbmdlcyxcbiAgICogICBleGNsdWRpbmcgdGhlIFwibG9hZGluZ1wiIHJvdXRlIGFuZCBkdXBsaWNhdGUgbmF2aWdhdGlvbnMuXG4gICAqIC0gVXBkYXRlcyB0aGUgYHVybEFmdGVyTmF2aWdhdGlvbmAgcHJvcGVydHkgd2l0aCB0aGUgY3VycmVudCBVUkwgYWZ0ZXIgbmF2aWdhdGlvbi5cbiAgICogLSBTaGFyZXMgdGhlIHJlcGxheWVkIHZhbHVlIHdpdGggYSBidWZmZXIgc2l6ZSBvZiAxIHRvIGVuc3VyZSBzdWJzY3JpYmVycyByZWNlaXZlIHRoZSBsYXRlc3QgZW1pdHRlZCB2YWx1ZS5cbiAgICpcbiAgICogQHR5cGUgT2JzZXJ2YWJsZTxSb3V0ZXJFdmVudD5cbiAgICovXG4gIHB1YmxpYyBuYXZpZ2F0aW9uRW5kJCA9IHRoaXMucm91dGVyLmV2ZW50cy5waXBlKFxuICAgIG1hcChldmVudCA9PiBldmVudCBhcyBSb3V0ZXJFdmVudCksXG4gICAgZmlsdGVyKChldmVudDogUm91dGVyRXZlbnQpID0+IGV2ZW50IGluc3RhbmNlb2YgTmF2aWdhdGlvbkVuZCksXG4gICAgdGFwKGV2ZW50ID0+IHtcbiAgICAgIGNvbnN0IHVybCA9IGV2ZW50LnVybC5zbGljZSgxKS5zcGxpdCgnPycpWzBdOyAvLyBFeHRyYWN0IHJvdXRlIG5hbWVcbiAgICAgIGlmICh1cmwgJiYgKHVybCAhPT0gXCJsb2FkaW5nXCIgJiYgdXJsICE9PSB0aGlzLnVybEFmdGVyTmF2aWdhdGlvbikpIHtcbiAgICAgICAgdGhpcy5hdWRpdFNlcnZpY2Uubm90aWZ5Um91dGVDaGFuZ2UodXJsKVxuICAgICAgfVxuICAgIH0pLFxuICAgIHRhcChldmVudCA9PiB0aGlzLnVybEFmdGVyTmF2aWdhdGlvbiA9IGV2ZW50LnVybCksXG4gICAgc2hhcmVSZXBsYXkoMSlcbiAgKTtcblxuICAvKipcbiAgICogQW4gb2JzZXJ2YWJsZSB0aGF0IGVtaXRzIHRoZSB0YWIgZXh0cmFjdGVkIGZyb20gdGhlIFVSTCBwYXRobmFtZSBvciB0aGUgbGFzdCBwYXJ0IG9mIHRoZSBVUkwuXG4gICAqXG4gICAqIFRoaXMgb2JzZXJ2YWJsZSBsaXN0ZW5zIHRvIG5hdmlnYXRpb24gZW5kIGV2ZW50cyBhbmQgcHJvY2Vzc2VzIHRoZSBVUkwgdG8gZGV0ZXJtaW5lIHRoZSBjdXJyZW50IHRhYi5cbiAgICogSXQgY3JlYXRlcyBhIGZha2UgVVJMIG9iamVjdCB0byBleHRyYWN0IHRoZSBwYXRobmFtZSBhbmQgdGhlbiB1c2VzIHRoZSBgZ2V0UXVlcnlQYXJhbXNGcm9tVXJsYCBmdW5jdGlvblxuICAgKiB0byBleHRyYWN0IHRoZSB0YWIgZnJvbSB0aGUgVVJMIHBhdGhuYW1lIG9yIGRlZmF1bHRzIHRvIHRoZSBsYXN0IHBhcnQgb2YgdGhlIFVSTCBpZiBubyB0YWIgaXMgZm91bmQuXG4gICAqXG4gICAqIEB0eXBlIE9ic2VydmFibGU8c3RyaW5nPiAtIEFuIG9ic2VydmFibGUgdGhhdCBlbWl0cyB0aGUgY3VycmVudCB0YWIgYXMgYSBzdHJpbmcuXG4gICAqL1xuICBwdWJsaWMgcGF0aCQgPSB0aGlzLm5hdmlnYXRpb25FbmQkLnBpcGUoXG4gICAgLy8gY3JlYXRlIGEgZmFrZSBVUkwgb2JqZWN0IHRvIGV4dHJhY3QgdGhlIHBhdGhuYW1lXG4gICAgbWFwKChldmVudDogUm91dGVyRXZlbnQpID0+IHtcbiAgICAgIGNvbnN0IHVybCA9IG5ldyBVUkwoYGh0dHA6Ly9sb2NhbGhvc3Qke2V2ZW50LnVybH1gKVxuICAgICAgLy8gZXh0cmFjdCB0aGUgdGFiIGZyb20gdGhlIFVSTCBwYXRobmFtZSBvciB1c2UgdGhlIGxhc3QgcGFydCBvZiB0aGUgVVJMXG4gICAgICBjb25zdCB7IHRhYiA9IHVybC5wYXRobmFtZS5zcGxpdCgnLycpLnBvcCgpIH0gPSBnZXRRdWVyeVBhcmFtc0Zyb21VcmwoZXZlbnQudXJsKSB8fCB7fTtcbiAgICAgIHJldHVybiB0YWI7XG4gICAgfSlcbiAgKTtcbn1cbiJdfQ==
|
|
@@ -1,75 +0,0 @@
|
|
|
1
|
-
import { Injectable, inject } from '@angular/core';
|
|
2
|
-
import { toast } from 'ngx-sonner';
|
|
3
|
-
import { getState } from '@ngrx/signals';
|
|
4
|
-
import { QueryParamsStore, UserSettingsStore } from '../stores';
|
|
5
|
-
import * as i0 from "@angular/core";
|
|
6
|
-
const SAVED_SEARCHES_MAX_STORAGE = 100;
|
|
7
|
-
export class SavedSearchesService {
|
|
8
|
-
constructor() {
|
|
9
|
-
this.userSettingsStore = inject(UserSettingsStore);
|
|
10
|
-
this.queryParamsStore = inject(QueryParamsStore);
|
|
11
|
-
}
|
|
12
|
-
/**
|
|
13
|
-
* Retrieves the list of saved searches from the user settings store.
|
|
14
|
-
*
|
|
15
|
-
* @returns {SavedSearch[]} An array of saved searches.
|
|
16
|
-
*/
|
|
17
|
-
getSavedSearches() {
|
|
18
|
-
return this.userSettingsStore.savedSearches();
|
|
19
|
-
}
|
|
20
|
-
/**
|
|
21
|
-
* Saves the current search query to the user's saved searches.
|
|
22
|
-
*
|
|
23
|
-
* This method retrieves the current search text from the query parameters store.
|
|
24
|
-
* If the search text is empty, it logs an error and exits.
|
|
25
|
-
* Otherwise, it creates a new saved search object with the current URL, date, and search text.
|
|
26
|
-
*
|
|
27
|
-
* The new saved search is added to the beginning of the saved searches array.
|
|
28
|
-
* If the array exceeds the maximum allowed storage, the oldest search is removed.
|
|
29
|
-
*
|
|
30
|
-
* Finally, the updated saved searches array is saved back to the user settings store,
|
|
31
|
-
* and a success message is displayed to the user.
|
|
32
|
-
*
|
|
33
|
-
* @throws {Error} If saving an empty search is attempted.
|
|
34
|
-
*/
|
|
35
|
-
saveSearch() {
|
|
36
|
-
const { text } = getState(this.queryParamsStore);
|
|
37
|
-
if (!text) {
|
|
38
|
-
console.error('Saving empty search is not allowed');
|
|
39
|
-
return;
|
|
40
|
-
}
|
|
41
|
-
const savedSearch = { url: window.location.hash.substring(1), date: new Date().toISOString(), display: text };
|
|
42
|
-
const savedSearches = this.userSettingsStore.savedSearches();
|
|
43
|
-
if (savedSearches.length >= SAVED_SEARCHES_MAX_STORAGE) {
|
|
44
|
-
savedSearches.pop();
|
|
45
|
-
}
|
|
46
|
-
savedSearches.unshift(savedSearch);
|
|
47
|
-
this.userSettingsStore.updateSavedSearches(savedSearches);
|
|
48
|
-
toast.success('Search successfully saved');
|
|
49
|
-
}
|
|
50
|
-
/**
|
|
51
|
-
* Updates the saved searches in the user settings store.
|
|
52
|
-
*
|
|
53
|
-
* @param savedSearches - An array of SavedSearch objects to update.
|
|
54
|
-
*/
|
|
55
|
-
updateSavedSearches(savedSearches) {
|
|
56
|
-
this.userSettingsStore.updateSavedSearches(savedSearches);
|
|
57
|
-
}
|
|
58
|
-
/**
|
|
59
|
-
* Deletes a saved search from the user settings store.
|
|
60
|
-
*
|
|
61
|
-
* @param index - The index of the saved search to delete.
|
|
62
|
-
*/
|
|
63
|
-
deleteSavedSearch(index) {
|
|
64
|
-
this.userSettingsStore.deleteSavedSearch(index);
|
|
65
|
-
}
|
|
66
|
-
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: SavedSearchesService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
67
|
-
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: SavedSearchesService, providedIn: 'root' }); }
|
|
68
|
-
}
|
|
69
|
-
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: SavedSearchesService, decorators: [{
|
|
70
|
-
type: Injectable,
|
|
71
|
-
args: [{
|
|
72
|
-
providedIn: 'root'
|
|
73
|
-
}]
|
|
74
|
-
}] });
|
|
75
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2F2ZWQtc2VhcmNoZXMuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0b21pYy1hbmd1bGFyL3NyYy9saWIvc2VydmljZXMvc2F2ZWQtc2VhcmNoZXMuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sRUFBRSxNQUFNLGVBQWUsQ0FBQztBQUNuRCxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ25DLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLGlCQUFpQixFQUFFLE1BQU0sV0FBVyxDQUFDOztBQUdoRSxNQUFNLDBCQUEwQixHQUFHLEdBQUcsQ0FBQztBQUt2QyxNQUFNLE9BQU8sb0JBQW9CO0lBSGpDO1FBSXFCLHNCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlDLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO0tBZ0VoRTtJQTlEQzs7OztPQUlHO0lBQ0ksZ0JBQWdCO1FBQ3JCLE9BQU8sSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFBO0lBQy9DLENBQUM7SUFFRDs7Ozs7Ozs7Ozs7Ozs7T0FjRztJQUNJLFVBQVU7UUFDZixNQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ2xELElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU8sQ0FBQyxLQUFLLENBQUMsb0NBQW9DLENBQUMsQ0FBQztZQUNwRCxPQUFPO1FBQ1QsQ0FBQztRQUVELE1BQU0sV0FBVyxHQUFHLEVBQUUsR0FBRyxFQUFFLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsRUFBRSxJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLENBQUM7UUFDOUcsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDLGFBQWEsRUFBRSxDQUFDO1FBRTdELElBQUksYUFBYSxDQUFDLE1BQU0sSUFBSSwwQkFBMEIsRUFBQyxDQUFDO1lBQ3RELGFBQWEsQ0FBQyxHQUFHLEVBQUUsQ0FBQztRQUN0QixDQUFDO1FBRUQsYUFBYSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUVuQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7UUFFMUQsS0FBSyxDQUFDLE9BQU8sQ0FBQywyQkFBMkIsQ0FBQyxDQUFDO0lBQzdDLENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksbUJBQW1CLENBQUMsYUFBNEI7UUFDckQsSUFBSSxDQUFDLGlCQUFpQixDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxDQUFDO0lBQzVELENBQUM7SUFFRDs7OztPQUlHO0lBQ0ksaUJBQWlCLENBQUMsS0FBYTtRQUNwQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsaUJBQWlCLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDbEQsQ0FBQzs4R0FqRVUsb0JBQW9CO2tIQUFwQixvQkFBb0IsY0FGbkIsTUFBTTs7MkZBRVAsb0JBQW9CO2tCQUhoQyxVQUFVO21CQUFDO29CQUNWLFVBQVUsRUFBRSxNQUFNO2lCQUNuQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIGluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgdG9hc3QgfSBmcm9tICduZ3gtc29ubmVyJztcbmltcG9ydCB7IGdldFN0YXRlIH0gZnJvbSAnQG5ncngvc2lnbmFscyc7XG5cbmltcG9ydCB7IFF1ZXJ5UGFyYW1zU3RvcmUsIFVzZXJTZXR0aW5nc1N0b3JlIH0gZnJvbSAnLi4vc3RvcmVzJztcbmltcG9ydCB7IFNhdmVkU2VhcmNoIH0gZnJvbSAnLi4vbW9kZWxzJztcblxuY29uc3QgU0FWRURfU0VBUkNIRVNfTUFYX1NUT1JBR0UgPSAxMDA7XG5cbkBJbmplY3RhYmxlKHtcbiAgcHJvdmlkZWRJbjogJ3Jvb3QnXG59KVxuZXhwb3J0IGNsYXNzIFNhdmVkU2VhcmNoZXNTZXJ2aWNlIHtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHVzZXJTZXR0aW5nc1N0b3JlID0gaW5qZWN0KFVzZXJTZXR0aW5nc1N0b3JlKTtcbiAgcHJvdGVjdGVkIHJlYWRvbmx5IHF1ZXJ5UGFyYW1zU3RvcmUgPSBpbmplY3QoUXVlcnlQYXJhbXNTdG9yZSk7XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyB0aGUgbGlzdCBvZiBzYXZlZCBzZWFyY2hlcyBmcm9tIHRoZSB1c2VyIHNldHRpbmdzIHN0b3JlLlxuICAgKlxuICAgKiBAcmV0dXJucyB7U2F2ZWRTZWFyY2hbXX0gQW4gYXJyYXkgb2Ygc2F2ZWQgc2VhcmNoZXMuXG4gICAqL1xuICBwdWJsaWMgZ2V0U2F2ZWRTZWFyY2hlcygpOiBTYXZlZFNlYXJjaFtdIHtcbiAgICByZXR1cm4gdGhpcy51c2VyU2V0dGluZ3NTdG9yZS5zYXZlZFNlYXJjaGVzKClcbiAgfVxuXG4gIC8qKlxuICAgKiBTYXZlcyB0aGUgY3VycmVudCBzZWFyY2ggcXVlcnkgdG8gdGhlIHVzZXIncyBzYXZlZCBzZWFyY2hlcy5cbiAgICpcbiAgICogVGhpcyBtZXRob2QgcmV0cmlldmVzIHRoZSBjdXJyZW50IHNlYXJjaCB0ZXh0IGZyb20gdGhlIHF1ZXJ5IHBhcmFtZXRlcnMgc3RvcmUuXG4gICAqIElmIHRoZSBzZWFyY2ggdGV4dCBpcyBlbXB0eSwgaXQgbG9ncyBhbiBlcnJvciBhbmQgZXhpdHMuXG4gICAqIE90aGVyd2lzZSwgaXQgY3JlYXRlcyBhIG5ldyBzYXZlZCBzZWFyY2ggb2JqZWN0IHdpdGggdGhlIGN1cnJlbnQgVVJMLCBkYXRlLCBhbmQgc2VhcmNoIHRleHQuXG4gICAqXG4gICAqIFRoZSBuZXcgc2F2ZWQgc2VhcmNoIGlzIGFkZGVkIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNhdmVkIHNlYXJjaGVzIGFycmF5LlxuICAgKiBJZiB0aGUgYXJyYXkgZXhjZWVkcyB0aGUgbWF4aW11bSBhbGxvd2VkIHN0b3JhZ2UsIHRoZSBvbGRlc3Qgc2VhcmNoIGlzIHJlbW92ZWQuXG4gICAqXG4gICAqIEZpbmFsbHksIHRoZSB1cGRhdGVkIHNhdmVkIHNlYXJjaGVzIGFycmF5IGlzIHNhdmVkIGJhY2sgdG8gdGhlIHVzZXIgc2V0dGluZ3Mgc3RvcmUsXG4gICAqIGFuZCBhIHN1Y2Nlc3MgbWVzc2FnZSBpcyBkaXNwbGF5ZWQgdG8gdGhlIHVzZXIuXG4gICAqXG4gICAqIEB0aHJvd3Mge0Vycm9yfSBJZiBzYXZpbmcgYW4gZW1wdHkgc2VhcmNoIGlzIGF0dGVtcHRlZC5cbiAgICovXG4gIHB1YmxpYyBzYXZlU2VhcmNoKCkge1xuICAgIGNvbnN0ICB7IHRleHQgfSA9IGdldFN0YXRlKHRoaXMucXVlcnlQYXJhbXNTdG9yZSk7XG4gICAgaWYgKCF0ZXh0KSB7XG4gICAgICBjb25zb2xlLmVycm9yKCdTYXZpbmcgZW1wdHkgc2VhcmNoIGlzIG5vdCBhbGxvd2VkJyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgY29uc3Qgc2F2ZWRTZWFyY2ggPSB7IHVybDogd2luZG93LmxvY2F0aW9uLmhhc2guc3Vic3RyaW5nKDEpLCBkYXRlOiBuZXcgRGF0ZSgpLnRvSVNPU3RyaW5nKCksIGRpc3BsYXk6IHRleHQgfTtcbiAgICBjb25zdCBzYXZlZFNlYXJjaGVzID0gdGhpcy51c2VyU2V0dGluZ3NTdG9yZS5zYXZlZFNlYXJjaGVzKCk7XG5cbiAgICBpZiAoc2F2ZWRTZWFyY2hlcy5sZW5ndGggPj0gU0FWRURfU0VBUkNIRVNfTUFYX1NUT1JBR0Upe1xuICAgICAgc2F2ZWRTZWFyY2hlcy5wb3AoKTtcbiAgICB9XG5cbiAgICBzYXZlZFNlYXJjaGVzLnVuc2hpZnQoc2F2ZWRTZWFyY2gpO1xuXG4gICAgdGhpcy51c2VyU2V0dGluZ3NTdG9yZS51cGRhdGVTYXZlZFNlYXJjaGVzKHNhdmVkU2VhcmNoZXMpO1xuXG4gICAgdG9hc3Quc3VjY2VzcygnU2VhcmNoIHN1Y2Nlc3NmdWxseSBzYXZlZCcpO1xuICB9XG5cbiAgLyoqXG4gICAqIFVwZGF0ZXMgdGhlIHNhdmVkIHNlYXJjaGVzIGluIHRoZSB1c2VyIHNldHRpbmdzIHN0b3JlLlxuICAgKlxuICAgKiBAcGFyYW0gc2F2ZWRTZWFyY2hlcyAtIEFuIGFycmF5IG9mIFNhdmVkU2VhcmNoIG9iamVjdHMgdG8gdXBkYXRlLlxuICAgKi9cbiAgcHVibGljIHVwZGF0ZVNhdmVkU2VhcmNoZXMoc2F2ZWRTZWFyY2hlczogU2F2ZWRTZWFyY2hbXSkge1xuICAgIHRoaXMudXNlclNldHRpbmdzU3RvcmUudXBkYXRlU2F2ZWRTZWFyY2hlcyhzYXZlZFNlYXJjaGVzKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEZWxldGVzIGEgc2F2ZWQgc2VhcmNoIGZyb20gdGhlIHVzZXIgc2V0dGluZ3Mgc3RvcmUuXG4gICAqXG4gICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgc2F2ZWQgc2VhcmNoIHRvIGRlbGV0ZS5cbiAgICovXG4gIHB1YmxpYyBkZWxldGVTYXZlZFNlYXJjaChpbmRleDogbnVtYmVyKSB7XG4gICAgdGhpcy51c2VyU2V0dGluZ3NTdG9yZS5kZWxldGVTYXZlZFNlYXJjaChpbmRleCk7XG4gIH1cbn0iXX0=
|