@sinequa/atomic-angular 0.0.140
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/assets/tailwind.css +248 -0
- package/esm2022/lib/assistant/index.mjs +2 -0
- package/esm2022/lib/assistant/signalR.web.service.mjs +81 -0
- package/esm2022/lib/components/dropdown.mjs +127 -0
- package/esm2022/lib/components/index.mjs +5 -0
- package/esm2022/lib/components/menu/index.mjs +3 -0
- package/esm2022/lib/components/menu/menu-item.mjs +22 -0
- package/esm2022/lib/components/menu/menu.mjs +99 -0
- package/esm2022/lib/components/metadata/index.mjs +2 -0
- package/esm2022/lib/components/metadata/metadata.component.mjs +65 -0
- package/esm2022/lib/components/theme/index.mjs +3 -0
- package/esm2022/lib/components/theme/theme-selector.component.mjs +67 -0
- package/esm2022/lib/components/theme/theme-toggle.component.mjs +67 -0
- package/esm2022/lib/directives/index.mjs +5 -0
- package/esm2022/lib/directives/infinite-scroll.directive.mjs +47 -0
- package/esm2022/lib/directives/select-article-on-click.directive.mjs +39 -0
- package/esm2022/lib/directives/show-bookmark.directive.mjs +55 -0
- package/esm2022/lib/directives/theme-provider.directive.mjs +31 -0
- package/esm2022/lib/guards/auth.guard.mjs +27 -0
- package/esm2022/lib/guards/index.mjs +3 -0
- package/esm2022/lib/guards/initialization.guard.mjs +41 -0
- package/esm2022/lib/interceptors/audit.interceptor.mjs +23 -0
- package/esm2022/lib/interceptors/auth.interceptor.mjs +49 -0
- package/esm2022/lib/interceptors/body.interceptor.mjs +24 -0
- package/esm2022/lib/interceptors/error.interceptor.mjs +35 -0
- package/esm2022/lib/interceptors/index.mjs +7 -0
- package/esm2022/lib/interceptors/toast.interceptor.mjs +27 -0
- package/esm2022/lib/models/aggregation.mjs +2 -0
- package/esm2022/lib/models/article-metadata.mjs +2 -0
- package/esm2022/lib/models/autocomplete.mjs +2 -0
- package/esm2022/lib/models/custom-json.mjs +2 -0
- package/esm2022/lib/models/filter-dropdown.mjs +2 -0
- package/esm2022/lib/models/index.mjs +7 -0
- package/esm2022/lib/models/user-settings.mjs +2 -0
- package/esm2022/lib/pipes/highlight-word.pipe.mjs +33 -0
- package/esm2022/lib/pipes/index.mjs +3 -0
- package/esm2022/lib/pipes/source-icon.pipe.mjs +43 -0
- package/esm2022/lib/providers/eager-provider.mjs +24 -0
- package/esm2022/lib/providers/index.mjs +2 -0
- package/esm2022/lib/public-api.mjs +19 -0
- package/esm2022/lib/resolvers/index.mjs +2 -0
- package/esm2022/lib/resolvers/query-name-resolver.mjs +14 -0
- package/esm2022/lib/resources/index.mjs +2 -0
- package/esm2022/lib/resources/themes.mjs +53 -0
- package/esm2022/lib/services/application.service.mjs +245 -0
- package/esm2022/lib/services/autocomplete.service.mjs +85 -0
- package/esm2022/lib/services/drawer/backdrop.service.mjs +23 -0
- package/esm2022/lib/services/drawer/drawer-stack.service.mjs +152 -0
- package/esm2022/lib/services/drawer/drawer.service.mjs +38 -0
- package/esm2022/lib/services/index.mjs +12 -0
- package/esm2022/lib/services/label.service.mjs +161 -0
- package/esm2022/lib/services/navigation.service.mjs +59 -0
- package/esm2022/lib/services/saved-searches.service.mjs +75 -0
- package/esm2022/lib/services/search.service.mjs +89 -0
- package/esm2022/lib/services/selection-history.service.mjs +92 -0
- package/esm2022/lib/services/selection.service.mjs +87 -0
- package/esm2022/lib/stores/aggregations.store.mjs +62 -0
- package/esm2022/lib/stores/app.store.mjs +265 -0
- package/esm2022/lib/stores/application.store.mjs +93 -0
- package/esm2022/lib/stores/index.mjs +9 -0
- package/esm2022/lib/stores/principal.store.mjs +47 -0
- package/esm2022/lib/stores/query-params.store.mjs +208 -0
- package/esm2022/lib/stores/selection.store.mjs +46 -0
- package/esm2022/lib/stores/theme.store.mjs +116 -0
- package/esm2022/lib/stores/user-settings.store.mjs +272 -0
- package/esm2022/lib/tokens/highlights.mjs +32 -0
- package/esm2022/lib/tokens/index.mjs +2 -0
- package/esm2022/lib/utils/debounced-signal.mjs +38 -0
- package/esm2022/lib/utils/index.mjs +8 -0
- package/esm2022/lib/utils/inline-worker.mjs +40 -0
- package/esm2022/lib/utils/query.mjs +58 -0
- package/esm2022/lib/utils/routes.mjs +28 -0
- package/esm2022/lib/utils/tailwind-utils.mjs +6 -0
- package/esm2022/lib/utils/theme-body-hook.mjs +18 -0
- package/esm2022/lib/utils/theme-registry.mjs +6 -0
- package/esm2022/lib/web-services/aggregations.service.mjs +104 -0
- package/esm2022/lib/web-services/app.service.mjs +48 -0
- package/esm2022/lib/web-services/audit.service.mjs +122 -0
- package/esm2022/lib/web-services/index.mjs +10 -0
- package/esm2022/lib/web-services/json-method-plugin.service.mjs +54 -0
- package/esm2022/lib/web-services/preview.service.mjs +327 -0
- package/esm2022/lib/web-services/principal.service.mjs +46 -0
- package/esm2022/lib/web-services/query.service.mjs +123 -0
- package/esm2022/lib/web-services/text-chunck.service.mjs +46 -0
- package/esm2022/public-api.mjs +5 -0
- package/esm2022/sinequa-atomic-angular.mjs +5 -0
- package/fesm2022/sinequa-atomic-angular.mjs +4204 -0
- package/fesm2022/sinequa-atomic-angular.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/assistant/index.d.ts +1 -0
- package/lib/assistant/signalR.web.service.d.ts +46 -0
- package/lib/components/dropdown.d.ts +50 -0
- package/lib/components/index.d.ts +4 -0
- package/lib/components/menu/index.d.ts +2 -0
- package/lib/components/menu/menu-item.d.ts +8 -0
- package/lib/components/menu/menu.d.ts +24 -0
- package/lib/components/metadata/index.d.ts +1 -0
- package/lib/components/metadata/metadata.component.d.ts +24 -0
- package/lib/components/theme/index.d.ts +2 -0
- package/lib/components/theme/theme-selector.component.d.ts +70 -0
- package/lib/components/theme/theme-toggle.component.d.ts +10 -0
- package/lib/directives/index.d.ts +4 -0
- package/lib/directives/infinite-scroll.directive.d.ts +30 -0
- package/lib/directives/select-article-on-click.directive.d.ts +14 -0
- package/lib/directives/show-bookmark.directive.d.ts +52 -0
- package/lib/directives/theme-provider.directive.d.ts +20 -0
- package/lib/guards/auth.guard.d.ts +7 -0
- package/lib/guards/index.d.ts +2 -0
- package/lib/guards/initialization.guard.d.ts +20 -0
- package/lib/interceptors/audit.interceptor.d.ts +13 -0
- package/lib/interceptors/auth.interceptor.d.ts +14 -0
- package/lib/interceptors/body.interceptor.d.ts +11 -0
- package/lib/interceptors/error.interceptor.d.ts +9 -0
- package/lib/interceptors/index.d.ts +5 -0
- package/lib/interceptors/toast.interceptor.d.ts +13 -0
- package/lib/models/aggregation.d.ts +12 -0
- package/lib/models/article-metadata.d.ts +5 -0
- package/lib/models/autocomplete.d.ts +5 -0
- package/lib/models/custom-json.d.ts +58 -0
- package/lib/models/filter-dropdown.d.ts +10 -0
- package/lib/models/index.d.ts +6 -0
- package/lib/models/user-settings.d.ts +32 -0
- package/lib/pipes/highlight-word.pipe.d.ts +22 -0
- package/lib/pipes/index.d.ts +2 -0
- package/lib/pipes/source-icon.pipe.d.ts +54 -0
- package/lib/providers/eager-provider.d.ts +11 -0
- package/lib/providers/index.d.ts +1 -0
- package/lib/public-api.d.ts +15 -0
- package/lib/resolvers/index.d.ts +1 -0
- package/lib/resolvers/query-name-resolver.d.ts +9 -0
- package/lib/resources/index.d.ts +1 -0
- package/lib/resources/themes.d.ts +51 -0
- package/lib/services/application.service.d.ts +178 -0
- package/lib/services/autocomplete.service.d.ts +91 -0
- package/lib/services/drawer/backdrop.service.d.ts +9 -0
- package/lib/services/drawer/drawer-stack.service.d.ts +70 -0
- package/lib/services/drawer/drawer.service.d.ts +15 -0
- package/lib/services/index.d.ts +11 -0
- package/lib/services/label.service.d.ts +117 -0
- package/lib/services/navigation.service.d.ts +33 -0
- package/lib/services/saved-searches.service.d.ts +145 -0
- package/lib/services/search.service.d.ts +155 -0
- package/lib/services/selection-history.service.d.ts +50 -0
- package/lib/services/selection.service.d.ts +127 -0
- package/lib/stores/aggregations.store.d.ts +50 -0
- package/lib/stores/app.store.d.ts +208 -0
- package/lib/stores/application.store.d.ts +106 -0
- package/lib/stores/index.d.ts +8 -0
- package/lib/stores/principal.store.d.ts +53 -0
- package/lib/stores/query-params.store.d.ts +187 -0
- package/lib/stores/selection.store.d.ts +62 -0
- package/lib/stores/theme.store.d.ts +55 -0
- package/lib/stores/user-settings.store.d.ts +161 -0
- package/lib/tokens/highlights.d.ts +8 -0
- package/lib/tokens/index.d.ts +1 -0
- package/lib/utils/debounced-signal.d.ts +25 -0
- package/lib/utils/index.d.ts +7 -0
- package/lib/utils/inline-worker.d.ts +11 -0
- package/lib/utils/query.d.ts +26 -0
- package/lib/utils/routes.d.ts +16 -0
- package/lib/utils/tailwind-utils.d.ts +2 -0
- package/lib/utils/theme-body-hook.d.ts +6 -0
- package/lib/utils/theme-registry.d.ts +3 -0
- package/lib/web-services/aggregations.service.d.ts +60 -0
- package/lib/web-services/app.service.d.ts +30 -0
- package/lib/web-services/audit.service.d.ts +75 -0
- package/lib/web-services/index.d.ts +9 -0
- package/lib/web-services/json-method-plugin.service.d.ts +41 -0
- package/lib/web-services/preview.service.d.ts +295 -0
- package/lib/web-services/principal.service.d.ts +28 -0
- package/lib/web-services/query.service.d.ts +29 -0
- package/lib/web-services/text-chunck.service.d.ts +22 -0
- package/package.json +28 -0
- package/public-api.d.ts +1 -0
|
@@ -0,0 +1,38 @@
|
|
|
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=
|
|
@@ -0,0 +1,12 @@
|
|
|
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==
|
|
@@ -0,0 +1,161 @@
|
|
|
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=
|
|
@@ -0,0 +1,59 @@
|
|
|
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==
|
|
@@ -0,0 +1,75 @@
|
|
|
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=
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Injectable, Injector, inject } from '@angular/core';
|
|
2
|
+
import { ActivatedRoute, Router } from '@angular/router';
|
|
3
|
+
import { getState } from '@ngrx/signals';
|
|
4
|
+
import { catchError, map, of } from 'rxjs';
|
|
5
|
+
import { QueryParamsStore, UserSettingsStore } from '../stores';
|
|
6
|
+
import { QueryService } from '../web-services/query.service';
|
|
7
|
+
import * as i0 from "@angular/core";
|
|
8
|
+
export class SearchService {
|
|
9
|
+
constructor() {
|
|
10
|
+
this.router = inject(Router);
|
|
11
|
+
this.route = inject(ActivatedRoute);
|
|
12
|
+
this.queryService = inject(QueryService);
|
|
13
|
+
// Represents the last result of a search operation with getResult().
|
|
14
|
+
this.result = {};
|
|
15
|
+
this.queryParamsStore = inject(QueryParamsStore);
|
|
16
|
+
this.userSettingsStore = inject(UserSettingsStore);
|
|
17
|
+
this.injector = inject(Injector);
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Executes a search operation with the given commands and options.
|
|
21
|
+
*
|
|
22
|
+
* @param commands - An array of strings representing the search commands.
|
|
23
|
+
* @param options - An optional object containing search options.
|
|
24
|
+
* @param options.appendFilters - A boolean indicating whether to append existing filters to the search query. Defaults to true.
|
|
25
|
+
* @param options.audit - An optional audit trail object to be stored in the navigation state.
|
|
26
|
+
*
|
|
27
|
+
* The method constructs query parameters based on the current state and the provided options,
|
|
28
|
+
* then navigates to the specified commands with the constructed query parameters and audit trail.
|
|
29
|
+
*/
|
|
30
|
+
search(commands, options = { appendFilters: true }) {
|
|
31
|
+
const queryParams = {};
|
|
32
|
+
const { text, filters = [], page, sort, tab } = getState(this.queryParamsStore);
|
|
33
|
+
const { audit, appendFilters } = options;
|
|
34
|
+
this.audit = audit;
|
|
35
|
+
if (appendFilters) {
|
|
36
|
+
queryParams.f = filters.length > 0 ? JSON.stringify(filters) : undefined;
|
|
37
|
+
queryParams.p = page;
|
|
38
|
+
queryParams.s = sort;
|
|
39
|
+
queryParams.t = tab;
|
|
40
|
+
queryParams.q = text;
|
|
41
|
+
}
|
|
42
|
+
// navigation state store the audit trail
|
|
43
|
+
this.router.navigate(commands, { relativeTo: this.route, queryParamsHandling: 'merge', queryParams, state: { audit } });
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Retrieves the search result based on the provided query.
|
|
47
|
+
*
|
|
48
|
+
* @param q - A partial query object containing search parameters.
|
|
49
|
+
* @returns An Observable of the search result.
|
|
50
|
+
*
|
|
51
|
+
* This method performs the following actions:
|
|
52
|
+
* - Creates an audit event with the type "Search_Text" and the query text.
|
|
53
|
+
* - Resets the audit property to undefined.
|
|
54
|
+
* - Calls the search method of the queryService with the query, a flag to include the query name in records, and the audit event.
|
|
55
|
+
* - Handles any errors by returning an empty Result object.
|
|
56
|
+
* - Maps the search result to the service's result property.
|
|
57
|
+
*/
|
|
58
|
+
getResult(q) {
|
|
59
|
+
const audit = { type: "Search_Text", detail: { querytext: q?.text }, ...this.audit };
|
|
60
|
+
this.audit = undefined;
|
|
61
|
+
// add the query name to records, to have it available if we bookmark one
|
|
62
|
+
return this.queryService.search(q, true, audit)
|
|
63
|
+
.pipe(catchError(() => of({})), map((result) => this.result = result));
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Navigates to the specified page and returns the search result.
|
|
67
|
+
* @param page - The page number to navigate to.
|
|
68
|
+
* @returns A promise that resolves to the search result.
|
|
69
|
+
*/
|
|
70
|
+
gotoPage(page) {
|
|
71
|
+
this.queryParamsStore.patch({ page });
|
|
72
|
+
this.search([], { audit: {
|
|
73
|
+
type: "Search_GotoPage",
|
|
74
|
+
detail: {
|
|
75
|
+
page: page,
|
|
76
|
+
fromresultid: this.result ? this.result.id : null
|
|
77
|
+
}
|
|
78
|
+
} });
|
|
79
|
+
}
|
|
80
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: SearchService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
81
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: SearchService, providedIn: 'root' }); }
|
|
82
|
+
}
|
|
83
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: SearchService, decorators: [{
|
|
84
|
+
type: Injectable,
|
|
85
|
+
args: [{
|
|
86
|
+
providedIn: 'root'
|
|
87
|
+
}]
|
|
88
|
+
}] });
|
|
89
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VhcmNoLnNlcnZpY2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9hdG9taWMtYW5ndWxhci9zcmMvbGliL3NlcnZpY2VzL3NlYXJjaC5zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBeUIsTUFBTSxlQUFlLENBQUM7QUFDcEYsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUN6RCxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBYyxVQUFVLEVBQUUsR0FBRyxFQUFFLEVBQUUsRUFBTyxNQUFNLE1BQU0sQ0FBQztBQUk1RCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxXQUFXLENBQUM7QUFDaEUsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLCtCQUErQixDQUFDOztBQW1CN0QsTUFBTSxPQUFPLGFBQWE7SUFIMUI7UUFJbUIsV0FBTSxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUN4QixVQUFLLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1FBQy9CLGlCQUFZLEdBQUcsTUFBTSxDQUFDLFlBQVksQ0FBQyxDQUFDO1FBRXJELHFFQUFxRTtRQUM5RCxXQUFNLEdBQVcsRUFBWSxDQUFDO1FBR2xCLHFCQUFnQixHQUFHLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1FBQzVDLHNCQUFpQixHQUFHLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDO1FBQzlDLGFBQVEsR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDLENBQUM7S0EwRWhEO0lBdkVDOzs7Ozs7Ozs7O09BVUc7SUFDSSxNQUFNLENBQUMsUUFBa0IsRUFBRSxVQUF5QixFQUFFLGFBQWEsRUFBRSxJQUFJLEVBQUU7UUFDaEYsTUFBTSxXQUFXLEdBQWdCLEVBQUUsQ0FBQztRQUNwQyxNQUFNLEVBQUUsSUFBSSxFQUFFLE9BQU8sR0FBRyxFQUFFLEVBQUUsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsR0FBRyxRQUFRLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7UUFDaEYsTUFBTSxFQUFFLEtBQUssRUFBRSxhQUFhLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFekMsSUFBSSxDQUFDLEtBQUssR0FBRyxLQUFLLENBQUM7UUFFbkIsSUFBSSxhQUFhLEVBQUUsQ0FBQztZQUNsQixXQUFXLENBQUMsQ0FBQyxHQUFHLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUM7WUFDekUsV0FBVyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDckIsV0FBVyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7WUFDckIsV0FBVyxDQUFDLENBQUMsR0FBRyxHQUFHLENBQUM7WUFDcEIsV0FBVyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUM7UUFDdkIsQ0FBQztRQUVELHlDQUF5QztRQUN6QyxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxRQUFRLEVBQUUsRUFBRSxVQUFVLEVBQUUsSUFBSSxDQUFDLEtBQUssRUFBRSxtQkFBbUIsRUFBRSxPQUFPLEVBQUUsV0FBVyxFQUFFLEtBQUssRUFBRSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQztJQUMxSCxDQUFDO0lBSUQ7Ozs7Ozs7Ozs7OztPQVlHO0lBQ0ksU0FBUyxDQUFDLENBQWlCO1FBQ2hDLE1BQU0sS0FBSyxHQUFnQixFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsTUFBTSxFQUFFLEVBQUUsU0FBUyxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsRUFBRyxHQUFHLElBQUksQ0FBQyxLQUFLLEVBQUMsQ0FBQztRQUNsRyxJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUN2Qix5RUFBeUU7UUFDekUsT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQzthQUM1QyxJQUFJLENBQ0gsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLEVBQUUsQ0FBQyxFQUFZLENBQUMsQ0FBQyxFQUNsQyxHQUFHLENBQUMsQ0FBQyxNQUFjLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxNQUFNLEdBQUcsTUFBTSxDQUFDLENBQzlDLENBQUM7SUFDTixDQUFDO0lBRUQ7Ozs7T0FJRztJQUNJLFFBQVEsQ0FBQyxJQUFZO1FBQzFCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLEVBQUUsS0FBSyxFQUFFO2dCQUN2QixJQUFJLEVBQUUsaUJBQWlCO2dCQUN2QixNQUFNLEVBQUU7b0JBQ04sSUFBSSxFQUFFLElBQUk7b0JBQ1YsWUFBWSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJO2lCQUNwRDthQUNBLEVBQUMsQ0FBQyxDQUFDO0lBQ04sQ0FBQzs4R0FwRlUsYUFBYTtrSEFBYixhQUFhLGNBRlosTUFBTTs7MkZBRVAsYUFBYTtrQkFIekIsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmplY3RhYmxlLCBJbmplY3RvciwgaW5qZWN0LCBydW5JbkluamVjdGlvbkNvbnRleHQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEFjdGl2YXRlZFJvdXRlLCBSb3V0ZXIgfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHsgZ2V0U3RhdGUgfSBmcm9tICdAbmdyeC9zaWduYWxzJztcbmltcG9ydCB7IE9ic2VydmFibGUsIGNhdGNoRXJyb3IsIG1hcCwgb2YsIHRhcCB9IGZyb20gJ3J4anMnO1xuXG5pbXBvcnQgeyBBcnRpY2xlLCBBdWRpdEV2ZW50cywgUXVlcnksIFJlc3VsdCB9IGZyb20gJ0BzaW5lcXVhL2F0b21pYyc7XG5cbmltcG9ydCB7IFF1ZXJ5UGFyYW1zU3RvcmUsIFVzZXJTZXR0aW5nc1N0b3JlIH0gZnJvbSAnLi4vc3RvcmVzJztcbmltcG9ydCB7IFF1ZXJ5U2VydmljZSB9IGZyb20gJy4uL3dlYi1zZXJ2aWNlcy9xdWVyeS5zZXJ2aWNlJztcblxuXG5leHBvcnQgdHlwZSBTZWFyY2hPcHRpb25zID0ge1xuICBhcHBlbmRGaWx0ZXJzPzogYm9vbGVhbjtcbiAgYXVkaXQ/OiBBdWRpdEV2ZW50c1xufVxuXG50eXBlIFF1ZXJ5UGFyYW1zID0ge1xuICBmPzogc3RyaW5nOyAvLyBmaWx0ZXJzIGxpc3RcbiAgcD86IG51bWJlcjsgLy8gcGFnZSBudW1iZXJcbiAgcz86IHN0cmluZzsgLy8gc29ydCBuYW1lXG4gIHQ/OiBzdHJpbmc7IC8vIHRhYiBuYW1lXG4gIHE/OiBzdHJpbmc7IC8vIHF1ZXJ5IHRleHRcbn1cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU2VhcmNoU2VydmljZSB7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm91dGVyID0gaW5qZWN0KFJvdXRlcik7XG4gIHByaXZhdGUgcmVhZG9ubHkgcm91dGUgPSBpbmplY3QoQWN0aXZhdGVkUm91dGUpO1xuICBwcml2YXRlIHJlYWRvbmx5IHF1ZXJ5U2VydmljZSA9IGluamVjdChRdWVyeVNlcnZpY2UpO1xuXG4gIC8vIFJlcHJlc2VudHMgdGhlIGxhc3QgcmVzdWx0IG9mIGEgc2VhcmNoIG9wZXJhdGlvbiB3aXRoIGdldFJlc3VsdCgpLlxuICBwdWJsaWMgcmVzdWx0OiBSZXN1bHQgPSB7fSBhcyBSZXN1bHQ7XG4gIHB1YmxpYyBhdWRpdD86IEF1ZGl0RXZlbnRzO1xuXG4gIHByb3RlY3RlZCByZWFkb25seSBxdWVyeVBhcmFtc1N0b3JlID0gaW5qZWN0KFF1ZXJ5UGFyYW1zU3RvcmUpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgdXNlclNldHRpbmdzU3RvcmUgPSBpbmplY3QoVXNlclNldHRpbmdzU3RvcmUpO1xuICBwcm90ZWN0ZWQgcmVhZG9ubHkgaW5qZWN0b3IgPSBpbmplY3QoSW5qZWN0b3IpO1xuXG5cbiAgLyoqXG4gICAqIEV4ZWN1dGVzIGEgc2VhcmNoIG9wZXJhdGlvbiB3aXRoIHRoZSBnaXZlbiBjb21tYW5kcyBhbmQgb3B0aW9ucy5cbiAgICpcbiAgICogQHBhcmFtIGNvbW1hbmRzIC0gQW4gYXJyYXkgb2Ygc3RyaW5ncyByZXByZXNlbnRpbmcgdGhlIHNlYXJjaCBjb21tYW5kcy5cbiAgICogQHBhcmFtIG9wdGlvbnMgLSBBbiBvcHRpb25hbCBvYmplY3QgY29udGFpbmluZyBzZWFyY2ggb3B0aW9ucy5cbiAgICogQHBhcmFtIG9wdGlvbnMuYXBwZW5kRmlsdGVycyAtIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gYXBwZW5kIGV4aXN0aW5nIGZpbHRlcnMgdG8gdGhlIHNlYXJjaCBxdWVyeS4gRGVmYXVsdHMgdG8gdHJ1ZS5cbiAgICogQHBhcmFtIG9wdGlvbnMuYXVkaXQgLSBBbiBvcHRpb25hbCBhdWRpdCB0cmFpbCBvYmplY3QgdG8gYmUgc3RvcmVkIGluIHRoZSBuYXZpZ2F0aW9uIHN0YXRlLlxuICAgKlxuICAgKiBUaGUgbWV0aG9kIGNvbnN0cnVjdHMgcXVlcnkgcGFyYW1ldGVycyBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBhbmQgdGhlIHByb3ZpZGVkIG9wdGlvbnMsXG4gICAqIHRoZW4gbmF2aWdhdGVzIHRvIHRoZSBzcGVjaWZpZWQgY29tbWFuZHMgd2l0aCB0aGUgY29uc3RydWN0ZWQgcXVlcnkgcGFyYW1ldGVycyBhbmQgYXVkaXQgdHJhaWwuXG4gICAqL1xuICBwdWJsaWMgc2VhcmNoKGNvbW1hbmRzOiBzdHJpbmdbXSwgb3B0aW9uczogU2VhcmNoT3B0aW9ucyA9IHsgYXBwZW5kRmlsdGVyczogdHJ1ZSB9KTogdm9pZCB7XG4gICAgY29uc3QgcXVlcnlQYXJhbXM6IFF1ZXJ5UGFyYW1zID0ge307XG4gICAgY29uc3QgeyB0ZXh0LCBmaWx0ZXJzID0gW10sIHBhZ2UsIHNvcnQsIHRhYiB9ID0gZ2V0U3RhdGUodGhpcy5xdWVyeVBhcmFtc1N0b3JlKTtcbiAgICBjb25zdCB7IGF1ZGl0LCBhcHBlbmRGaWx0ZXJzIH0gPSBvcHRpb25zO1xuXG4gICAgdGhpcy5hdWRpdCA9IGF1ZGl0O1xuXG4gICAgaWYgKGFwcGVuZEZpbHRlcnMpIHtcbiAgICAgIHF1ZXJ5UGFyYW1zLmYgPSBmaWx0ZXJzLmxlbmd0aCA+IDAgPyBKU09OLnN0cmluZ2lmeShmaWx0ZXJzKSA6IHVuZGVmaW5lZDtcbiAgICAgIHF1ZXJ5UGFyYW1zLnAgPSBwYWdlO1xuICAgICAgcXVlcnlQYXJhbXMucyA9IHNvcnQ7XG4gICAgICBxdWVyeVBhcmFtcy50ID0gdGFiO1xuICAgICAgcXVlcnlQYXJhbXMucSA9IHRleHQ7XG4gICAgfVxuXG4gICAgLy8gbmF2aWdhdGlvbiBzdGF0ZSBzdG9yZSB0aGUgYXVkaXQgdHJhaWxcbiAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShjb21tYW5kcywgeyByZWxhdGl2ZVRvOiB0aGlzLnJvdXRlLCBxdWVyeVBhcmFtc0hhbmRsaW5nOiAnbWVyZ2UnLCBxdWVyeVBhcmFtcywgc3RhdGU6IHsgYXVkaXQgfSB9KTtcbiAgfVxuXG5cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBzZWFyY2ggcmVzdWx0IGJhc2VkIG9uIHRoZSBwcm92aWRlZCBxdWVyeS5cbiAgICpcbiAgICogQHBhcmFtIHEgLSBBIHBhcnRpYWwgcXVlcnkgb2JqZWN0IGNvbnRhaW5pbmcgc2VhcmNoIHBhcmFtZXRlcnMuXG4gICAqIEByZXR1cm5zIEFuIE9ic2VydmFibGUgb2YgdGhlIHNlYXJjaCByZXN1bHQuXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczpcbiAgICogLSBDcmVhdGVzIGFuIGF1ZGl0IGV2ZW50IHdpdGggdGhlIHR5cGUgXCJTZWFyY2hfVGV4dFwiIGFuZCB0aGUgcXVlcnkgdGV4dC5cbiAgICogLSBSZXNldHMgdGhlIGF1ZGl0IHByb3BlcnR5IHRvIHVuZGVmaW5lZC5cbiAgICogLSBDYWxscyB0aGUgc2VhcmNoIG1ldGhvZCBvZiB0aGUgcXVlcnlTZXJ2aWNlIHdpdGggdGhlIHF1ZXJ5LCBhIGZsYWcgdG8gaW5jbHVkZSB0aGUgcXVlcnkgbmFtZSBpbiByZWNvcmRzLCBhbmQgdGhlIGF1ZGl0IGV2ZW50LlxuICAgKiAtIEhhbmRsZXMgYW55IGVycm9ycyBieSByZXR1cm5pbmcgYW4gZW1wdHkgUmVzdWx0IG9iamVjdC5cbiAgICogLSBNYXBzIHRoZSBzZWFyY2ggcmVzdWx0IHRvIHRoZSBzZXJ2aWNlJ3MgcmVzdWx0IHByb3BlcnR5LlxuICAgKi9cbiAgcHVibGljIGdldFJlc3VsdChxOiBQYXJ0aWFsPFF1ZXJ5Pik6IE9ic2VydmFibGU8UmVzdWx0PiB7XG4gICAgY29uc3QgYXVkaXQ6IEF1ZGl0RXZlbnRzID0geyB0eXBlOiBcIlNlYXJjaF9UZXh0XCIsIGRldGFpbDogeyBxdWVyeXRleHQ6IHE/LnRleHQgfSwgIC4uLnRoaXMuYXVkaXR9O1xuICAgIHRoaXMuYXVkaXQgPSB1bmRlZmluZWQ7XG4gICAgLy8gYWRkIHRoZSBxdWVyeSBuYW1lIHRvIHJlY29yZHMsIHRvIGhhdmUgaXQgYXZhaWxhYmxlIGlmIHdlIGJvb2ttYXJrIG9uZVxuICAgIHJldHVybiB0aGlzLnF1ZXJ5U2VydmljZS5zZWFyY2gocSwgdHJ1ZSwgYXVkaXQpXG4gICAgICAucGlwZShcbiAgICAgICAgY2F0Y2hFcnJvcigoKSA9PiBvZih7fSBhcyBSZXN1bHQpKSxcbiAgICAgICAgbWFwKChyZXN1bHQ6IFJlc3VsdCkgPT4gdGhpcy5yZXN1bHQgPSByZXN1bHQpXG4gICAgICApO1xuICB9XG5cbiAgLyoqXG4gICAqIE5hdmlnYXRlcyB0byB0aGUgc3BlY2lmaWVkIHBhZ2UgYW5kIHJldHVybnMgdGhlIHNlYXJjaCByZXN1bHQuXG4gICAqIEBwYXJhbSBwYWdlIC0gVGhlIHBhZ2UgbnVtYmVyIHRvIG5hdmlnYXRlIHRvLlxuICAgKiBAcmV0dXJucyBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgc2VhcmNoIHJlc3VsdC5cbiAgICovXG4gIHB1YmxpYyBnb3RvUGFnZShwYWdlOiBudW1iZXIpIHtcbiAgICB0aGlzLnF1ZXJ5UGFyYW1zU3RvcmUucGF0Y2goeyBwYWdlIH0pO1xuICAgIHRoaXMuc2VhcmNoKFtdLCB7IGF1ZGl0OiB7XG4gICAgICB0eXBlOiBcIlNlYXJjaF9Hb3RvUGFnZVwiLFxuICAgICAgZGV0YWlsOiB7XG4gICAgICAgIHBhZ2U6IHBhZ2UsXG4gICAgICAgIGZyb21yZXN1bHRpZDogdGhpcy5yZXN1bHQgPyB0aGlzLnJlc3VsdC5pZCA6IG51bGxcbiAgICB9XG4gICAgfX0pO1xuICB9XG59XG4iXX0=
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { EventEmitter, Injectable, effect, inject } from '@angular/core';
|
|
2
|
+
import { getState } from '@ngrx/signals';
|
|
3
|
+
import { SelectionStore } from '../stores';
|
|
4
|
+
import { SelectionService } from './selection.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
/*
|
|
7
|
+
* The `SelectionHistoryService` class is responsible for managing the selection history.
|
|
8
|
+
*
|
|
9
|
+
* It keeps track of the history of selected articles and provides methods to navigate through the history.
|
|
10
|
+
* The service also emits events when the selection history changes.
|
|
11
|
+
* This service is used by the Drawer
|
|
12
|
+
*/
|
|
13
|
+
export class SelectionHistoryService {
|
|
14
|
+
constructor() {
|
|
15
|
+
this.selectionHistoryEvent = new EventEmitter();
|
|
16
|
+
this.selectionService = inject(SelectionService);
|
|
17
|
+
this.selectionStore = inject(SelectionStore);
|
|
18
|
+
this.history = [];
|
|
19
|
+
effect(() => {
|
|
20
|
+
const { article } = getState(this.selectionStore);
|
|
21
|
+
if (!!article && article !== this.history[this.history.length - 1]) {
|
|
22
|
+
this.history.push(article);
|
|
23
|
+
this.selectionHistoryEvent.next('new');
|
|
24
|
+
}
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Retrieves the index of the current selection.
|
|
29
|
+
*
|
|
30
|
+
* @returns {number} The index of the current selection, which is the last element in the history array.
|
|
31
|
+
*/
|
|
32
|
+
getCurrentSelectionIndex() {
|
|
33
|
+
return this.history.length - 1;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Retrieves an article from the selection history at the specified index.
|
|
37
|
+
*
|
|
38
|
+
* @param index - The index of the article to retrieve.
|
|
39
|
+
* @returns The article at the specified index, or `undefined` if the index is out of bounds.
|
|
40
|
+
*/
|
|
41
|
+
getSelection(index) {
|
|
42
|
+
if (index < 0 || index >= this.history.length)
|
|
43
|
+
return undefined;
|
|
44
|
+
return this.history[index];
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Retrieves the length of the history array.
|
|
48
|
+
*
|
|
49
|
+
* @returns {number} The number of entries in the history.
|
|
50
|
+
*/
|
|
51
|
+
getHistoryLength() {
|
|
52
|
+
return this.history.length;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Clears the selection history and resets the current article selection.
|
|
56
|
+
*
|
|
57
|
+
* This method performs the following actions:
|
|
58
|
+
* - Empties the history array.
|
|
59
|
+
* - Calls the `clearCurrentArticle` method on the `selectionService` to reset the current article selection.
|
|
60
|
+
*/
|
|
61
|
+
clearHistory() {
|
|
62
|
+
this.history.length = 0;
|
|
63
|
+
this.selectionService.clearCurrentArticle();
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Navigates back in the selection history.
|
|
67
|
+
*
|
|
68
|
+
* Removes the most recent entry from the history. If the history is empty after this operation,
|
|
69
|
+
* it returns `undefined`. Otherwise, it sets the current article to the last entry in the history,
|
|
70
|
+
* triggers a 'back' event, and returns the last entry.
|
|
71
|
+
*
|
|
72
|
+
* @returns {Article | undefined} The last article in the history, or `undefined` if the history is empty.
|
|
73
|
+
*/
|
|
74
|
+
back() {
|
|
75
|
+
this.history.pop();
|
|
76
|
+
if (this.history.length === 0)
|
|
77
|
+
return undefined;
|
|
78
|
+
const last = this.history[this.history.length - 1];
|
|
79
|
+
this.selectionService.setCurrentArticle(last);
|
|
80
|
+
this.selectionHistoryEvent.next('back');
|
|
81
|
+
return last;
|
|
82
|
+
}
|
|
83
|
+
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: SelectionHistoryService, deps: [], target: i0.ɵɵFactoryTarget.Injectable }); }
|
|
84
|
+
static { this.ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: SelectionHistoryService, providedIn: 'root' }); }
|
|
85
|
+
}
|
|
86
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.5", ngImport: i0, type: SelectionHistoryService, decorators: [{
|
|
87
|
+
type: Injectable,
|
|
88
|
+
args: [{
|
|
89
|
+
providedIn: 'root'
|
|
90
|
+
}]
|
|
91
|
+
}], ctorParameters: () => [] });
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0aW9uLWhpc3Rvcnkuc2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2F0b21pYy1hbmd1bGFyL3NyYy9saWIvc2VydmljZXMvc2VsZWN0aW9uLWhpc3Rvcnkuc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsWUFBWSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pFLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFJekMsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUMzQyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQzs7QUFNdkQ7Ozs7OztHQU1HO0FBS0gsTUFBTSxPQUFPLHVCQUF1QjtJQVFsQztRQVBnQiwwQkFBcUIsR0FBRyxJQUFJLFlBQVksRUFBeUIsQ0FBQztRQUVqRSxxQkFBZ0IsR0FBRyxNQUFNLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztRQUM1QyxtQkFBYyxHQUFHLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQztRQUV4QyxZQUFPLEdBQWMsRUFBRSxDQUFDO1FBR3ZDLE1BQU0sQ0FBQyxHQUFHLEVBQUU7WUFDVixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsUUFBUSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUVsRCxJQUFJLENBQUMsQ0FBQyxPQUFPLElBQUksT0FBTyxLQUFLLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLEVBQUUsQ0FBQztnQkFDbkUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUM7Z0JBQzNCLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7WUFDekMsQ0FBQztRQUNILENBQUMsQ0FBQyxDQUFBO0lBQ0osQ0FBQztJQUVEOzs7O09BSUc7SUFDSSx3QkFBd0I7UUFDN0IsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7SUFDakMsQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksWUFBWSxDQUFDLEtBQWE7UUFDL0IsSUFBSSxLQUFLLEdBQUcsQ0FBQyxJQUFJLEtBQUssSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07WUFBRSxPQUFPLFNBQVMsQ0FBQztRQUVoRSxPQUFPLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDN0IsQ0FBQztJQUVEOzs7O09BSUc7SUFDSSxnQkFBZ0I7UUFDckIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sQ0FBQztJQUM3QixDQUFDO0lBRUQ7Ozs7OztPQU1HO0lBQ0ksWUFBWTtRQUNqQixJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDeEIsSUFBSSxDQUFDLGdCQUFnQixDQUFDLG1CQUFtQixFQUFFLENBQUM7SUFDOUMsQ0FBQztJQUVEOzs7Ozs7OztPQVFHO0lBQ0ksSUFBSTtRQUNULElBQUksQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLENBQUM7UUFFbkIsSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sS0FBSyxDQUFDO1lBQUUsT0FBTyxTQUFTLENBQUM7UUFFaEQsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQztRQUVuRCxJQUFJLENBQUMsZ0JBQWdCLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLENBQUM7UUFDOUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUV4QyxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7OEdBakZVLHVCQUF1QjtrSEFBdkIsdUJBQXVCLGNBRnRCLE1BQU07OzJGQUVQLHVCQUF1QjtrQkFIbkMsVUFBVTttQkFBQztvQkFDVixVQUFVLEVBQUUsTUFBTTtpQkFDbkIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBFdmVudEVtaXR0ZXIsIEluamVjdGFibGUsIGVmZmVjdCwgaW5qZWN0IH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBnZXRTdGF0ZSB9IGZyb20gJ0BuZ3J4L3NpZ25hbHMnO1xuXG5pbXBvcnQgeyBBcnRpY2xlIH0gZnJvbSAnQHNpbmVxdWEvYXRvbWljJztcblxuaW1wb3J0IHsgU2VsZWN0aW9uU3RvcmUgfSBmcm9tICcuLi9zdG9yZXMnO1xuaW1wb3J0IHsgU2VsZWN0aW9uU2VydmljZSB9IGZyb20gJy4vc2VsZWN0aW9uLnNlcnZpY2UnO1xuXG4vLyBiYWNrIGlzIHVzZWQgd2hlbiB0aGUgdXNlciBjbG9zZSB0aGUgY3VycmVudCBzZWxlY3Rpb24gYW5kIHdhbnQgdG8gZ28gYmFjayB0byB0aGUgcHJldmlvdXMgb25lXG4vLyBuZXcgaXMgdXNlZCB3aGVuIHRoZSB1c2VyIHNlbGVjdCBhIG5ldyBhcnRpY2xlXG5leHBvcnQgdHlwZSBTZWxlY3Rpb25IaXN0b3J5RXZlbnQgPSAnYmFjaycgfCAnbmV3JztcblxuLypcbiAqIFRoZSBgU2VsZWN0aW9uSGlzdG9yeVNlcnZpY2VgIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgc2VsZWN0aW9uIGhpc3RvcnkuXG4gKlxuICogSXQga2VlcHMgdHJhY2sgb2YgdGhlIGhpc3Rvcnkgb2Ygc2VsZWN0ZWQgYXJ0aWNsZXMgYW5kIHByb3ZpZGVzIG1ldGhvZHMgdG8gbmF2aWdhdGUgdGhyb3VnaCB0aGUgaGlzdG9yeS5cbiAqIFRoZSBzZXJ2aWNlIGFsc28gZW1pdHMgZXZlbnRzIHdoZW4gdGhlIHNlbGVjdGlvbiBoaXN0b3J5IGNoYW5nZXMuXG4gKiBUaGlzIHNlcnZpY2UgaXMgdXNlZCBieSB0aGUgRHJhd2VyXG4gKi9cblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgU2VsZWN0aW9uSGlzdG9yeVNlcnZpY2Uge1xuICBwdWJsaWMgcmVhZG9ubHkgc2VsZWN0aW9uSGlzdG9yeUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxTZWxlY3Rpb25IaXN0b3J5RXZlbnQ+KCk7XG5cbiAgcHJpdmF0ZSByZWFkb25seSBzZWxlY3Rpb25TZXJ2aWNlID0gaW5qZWN0KFNlbGVjdGlvblNlcnZpY2UpO1xuICBwcml2YXRlIHJlYWRvbmx5IHNlbGVjdGlvblN0b3JlID0gaW5qZWN0KFNlbGVjdGlvblN0b3JlKTtcblxuICBwcml2YXRlIHJlYWRvbmx5IGhpc3Rvcnk6IEFydGljbGVbXSA9IFtdO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIGVmZmVjdCgoKSA9PiB7XG4gICAgICBjb25zdCB7IGFydGljbGUgfSA9IGdldFN0YXRlKHRoaXMuc2VsZWN0aW9uU3RvcmUpO1xuXG4gICAgICBpZiAoISFhcnRpY2xlICYmIGFydGljbGUgIT09IHRoaXMuaGlzdG9yeVt0aGlzLmhpc3RvcnkubGVuZ3RoIC0gMV0pIHtcbiAgICAgICAgdGhpcy5oaXN0b3J5LnB1c2goYXJ0aWNsZSk7XG4gICAgICAgIHRoaXMuc2VsZWN0aW9uSGlzdG9yeUV2ZW50Lm5leHQoJ25ldycpO1xuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICAvKipcbiAgICogUmV0cmlldmVzIHRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24uXG4gICAqXG4gICAqIEByZXR1cm5zIHtudW1iZXJ9IFRoZSBpbmRleCBvZiB0aGUgY3VycmVudCBzZWxlY3Rpb24sIHdoaWNoIGlzIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGhpc3RvcnkgYXJyYXkuXG4gICAqL1xuICBwdWJsaWMgZ2V0Q3VycmVudFNlbGVjdGlvbkluZGV4KCk6IG51bWJlciB7XG4gICAgcmV0dXJuIHRoaXMuaGlzdG9yeS5sZW5ndGggLSAxO1xuICB9XG5cbiAgLyoqXG4gICAqIFJldHJpZXZlcyBhbiBhcnRpY2xlIGZyb20gdGhlIHNlbGVjdGlvbiBoaXN0b3J5IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAqXG4gICAqIEBwYXJhbSBpbmRleCAtIFRoZSBpbmRleCBvZiB0aGUgYXJ0aWNsZSB0byByZXRyaWV2ZS5cbiAgICogQHJldHVybnMgVGhlIGFydGljbGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IgYHVuZGVmaW5lZGAgaWYgdGhlIGluZGV4IGlzIG91dCBvZiBib3VuZHMuXG4gICAqL1xuICBwdWJsaWMgZ2V0U2VsZWN0aW9uKGluZGV4OiBudW1iZXIpOiBBcnRpY2xlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHRoaXMuaGlzdG9yeS5sZW5ndGgpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICByZXR1cm4gdGhpcy5oaXN0b3J5W2luZGV4XTtcbiAgfVxuXG4gIC8qKlxuICAgKiBSZXRyaWV2ZXMgdGhlIGxlbmd0aCBvZiB0aGUgaGlzdG9yeSBhcnJheS5cbiAgICpcbiAgICogQHJldHVybnMge251bWJlcn0gVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBoaXN0b3J5LlxuICAgKi9cbiAgcHVibGljIGdldEhpc3RvcnlMZW5ndGgoKTogbnVtYmVyIHtcbiAgICByZXR1cm4gdGhpcy5oaXN0b3J5Lmxlbmd0aDtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbGVhcnMgdGhlIHNlbGVjdGlvbiBoaXN0b3J5IGFuZCByZXNldHMgdGhlIGN1cnJlbnQgYXJ0aWNsZSBzZWxlY3Rpb24uXG4gICAqXG4gICAqIFRoaXMgbWV0aG9kIHBlcmZvcm1zIHRoZSBmb2xsb3dpbmcgYWN0aW9uczpcbiAgICogLSBFbXB0aWVzIHRoZSBoaXN0b3J5IGFycmF5LlxuICAgKiAtIENhbGxzIHRoZSBgY2xlYXJDdXJyZW50QXJ0aWNsZWAgbWV0aG9kIG9uIHRoZSBgc2VsZWN0aW9uU2VydmljZWAgdG8gcmVzZXQgdGhlIGN1cnJlbnQgYXJ0aWNsZSBzZWxlY3Rpb24uXG4gICAqL1xuICBwdWJsaWMgY2xlYXJIaXN0b3J5KCk6IHZvaWQge1xuICAgIHRoaXMuaGlzdG9yeS5sZW5ndGggPSAwO1xuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5jbGVhckN1cnJlbnRBcnRpY2xlKCk7XG4gIH1cblxuICAvKipcbiAgICogTmF2aWdhdGVzIGJhY2sgaW4gdGhlIHNlbGVjdGlvbiBoaXN0b3J5LlxuICAgKlxuICAgKiBSZW1vdmVzIHRoZSBtb3N0IHJlY2VudCBlbnRyeSBmcm9tIHRoZSBoaXN0b3J5LiBJZiB0aGUgaGlzdG9yeSBpcyBlbXB0eSBhZnRlciB0aGlzIG9wZXJhdGlvbixcbiAgICogaXQgcmV0dXJucyBgdW5kZWZpbmVkYC4gT3RoZXJ3aXNlLCBpdCBzZXRzIHRoZSBjdXJyZW50IGFydGljbGUgdG8gdGhlIGxhc3QgZW50cnkgaW4gdGhlIGhpc3RvcnksXG4gICAqIHRyaWdnZXJzIGEgJ2JhY2snIGV2ZW50LCBhbmQgcmV0dXJucyB0aGUgbGFzdCBlbnRyeS5cbiAgICpcbiAgICogQHJldHVybnMge0FydGljbGUgfCB1bmRlZmluZWR9IFRoZSBsYXN0IGFydGljbGUgaW4gdGhlIGhpc3RvcnksIG9yIGB1bmRlZmluZWRgIGlmIHRoZSBoaXN0b3J5IGlzIGVtcHR5LlxuICAgKi9cbiAgcHVibGljIGJhY2soKTogQXJ0aWNsZSB8IHVuZGVmaW5lZCB7XG4gICAgdGhpcy5oaXN0b3J5LnBvcCgpO1xuXG4gICAgaWYgKHRoaXMuaGlzdG9yeS5sZW5ndGggPT09IDApIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICBjb25zdCBsYXN0ID0gdGhpcy5oaXN0b3J5W3RoaXMuaGlzdG9yeS5sZW5ndGggLSAxXTtcblxuICAgIHRoaXMuc2VsZWN0aW9uU2VydmljZS5zZXRDdXJyZW50QXJ0aWNsZShsYXN0KTtcbiAgICB0aGlzLnNlbGVjdGlvbkhpc3RvcnlFdmVudC5uZXh0KCdiYWNrJyk7XG5cbiAgICByZXR1cm4gbGFzdDtcbiAgfVxufVxuIl19
|