@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.
Files changed (174) hide show
  1. package/assets/tailwind.css +248 -0
  2. package/esm2022/lib/assistant/index.mjs +2 -0
  3. package/esm2022/lib/assistant/signalR.web.service.mjs +81 -0
  4. package/esm2022/lib/components/dropdown.mjs +127 -0
  5. package/esm2022/lib/components/index.mjs +5 -0
  6. package/esm2022/lib/components/menu/index.mjs +3 -0
  7. package/esm2022/lib/components/menu/menu-item.mjs +22 -0
  8. package/esm2022/lib/components/menu/menu.mjs +99 -0
  9. package/esm2022/lib/components/metadata/index.mjs +2 -0
  10. package/esm2022/lib/components/metadata/metadata.component.mjs +65 -0
  11. package/esm2022/lib/components/theme/index.mjs +3 -0
  12. package/esm2022/lib/components/theme/theme-selector.component.mjs +67 -0
  13. package/esm2022/lib/components/theme/theme-toggle.component.mjs +67 -0
  14. package/esm2022/lib/directives/index.mjs +5 -0
  15. package/esm2022/lib/directives/infinite-scroll.directive.mjs +47 -0
  16. package/esm2022/lib/directives/select-article-on-click.directive.mjs +39 -0
  17. package/esm2022/lib/directives/show-bookmark.directive.mjs +55 -0
  18. package/esm2022/lib/directives/theme-provider.directive.mjs +31 -0
  19. package/esm2022/lib/guards/auth.guard.mjs +27 -0
  20. package/esm2022/lib/guards/index.mjs +3 -0
  21. package/esm2022/lib/guards/initialization.guard.mjs +41 -0
  22. package/esm2022/lib/interceptors/audit.interceptor.mjs +23 -0
  23. package/esm2022/lib/interceptors/auth.interceptor.mjs +49 -0
  24. package/esm2022/lib/interceptors/body.interceptor.mjs +24 -0
  25. package/esm2022/lib/interceptors/error.interceptor.mjs +35 -0
  26. package/esm2022/lib/interceptors/index.mjs +7 -0
  27. package/esm2022/lib/interceptors/toast.interceptor.mjs +27 -0
  28. package/esm2022/lib/models/aggregation.mjs +2 -0
  29. package/esm2022/lib/models/article-metadata.mjs +2 -0
  30. package/esm2022/lib/models/autocomplete.mjs +2 -0
  31. package/esm2022/lib/models/custom-json.mjs +2 -0
  32. package/esm2022/lib/models/filter-dropdown.mjs +2 -0
  33. package/esm2022/lib/models/index.mjs +7 -0
  34. package/esm2022/lib/models/user-settings.mjs +2 -0
  35. package/esm2022/lib/pipes/highlight-word.pipe.mjs +33 -0
  36. package/esm2022/lib/pipes/index.mjs +3 -0
  37. package/esm2022/lib/pipes/source-icon.pipe.mjs +43 -0
  38. package/esm2022/lib/providers/eager-provider.mjs +24 -0
  39. package/esm2022/lib/providers/index.mjs +2 -0
  40. package/esm2022/lib/public-api.mjs +19 -0
  41. package/esm2022/lib/resolvers/index.mjs +2 -0
  42. package/esm2022/lib/resolvers/query-name-resolver.mjs +14 -0
  43. package/esm2022/lib/resources/index.mjs +2 -0
  44. package/esm2022/lib/resources/themes.mjs +53 -0
  45. package/esm2022/lib/services/application.service.mjs +245 -0
  46. package/esm2022/lib/services/autocomplete.service.mjs +85 -0
  47. package/esm2022/lib/services/drawer/backdrop.service.mjs +23 -0
  48. package/esm2022/lib/services/drawer/drawer-stack.service.mjs +152 -0
  49. package/esm2022/lib/services/drawer/drawer.service.mjs +38 -0
  50. package/esm2022/lib/services/index.mjs +12 -0
  51. package/esm2022/lib/services/label.service.mjs +161 -0
  52. package/esm2022/lib/services/navigation.service.mjs +59 -0
  53. package/esm2022/lib/services/saved-searches.service.mjs +75 -0
  54. package/esm2022/lib/services/search.service.mjs +89 -0
  55. package/esm2022/lib/services/selection-history.service.mjs +92 -0
  56. package/esm2022/lib/services/selection.service.mjs +87 -0
  57. package/esm2022/lib/stores/aggregations.store.mjs +62 -0
  58. package/esm2022/lib/stores/app.store.mjs +265 -0
  59. package/esm2022/lib/stores/application.store.mjs +93 -0
  60. package/esm2022/lib/stores/index.mjs +9 -0
  61. package/esm2022/lib/stores/principal.store.mjs +47 -0
  62. package/esm2022/lib/stores/query-params.store.mjs +208 -0
  63. package/esm2022/lib/stores/selection.store.mjs +46 -0
  64. package/esm2022/lib/stores/theme.store.mjs +116 -0
  65. package/esm2022/lib/stores/user-settings.store.mjs +272 -0
  66. package/esm2022/lib/tokens/highlights.mjs +32 -0
  67. package/esm2022/lib/tokens/index.mjs +2 -0
  68. package/esm2022/lib/utils/debounced-signal.mjs +38 -0
  69. package/esm2022/lib/utils/index.mjs +8 -0
  70. package/esm2022/lib/utils/inline-worker.mjs +40 -0
  71. package/esm2022/lib/utils/query.mjs +58 -0
  72. package/esm2022/lib/utils/routes.mjs +28 -0
  73. package/esm2022/lib/utils/tailwind-utils.mjs +6 -0
  74. package/esm2022/lib/utils/theme-body-hook.mjs +18 -0
  75. package/esm2022/lib/utils/theme-registry.mjs +6 -0
  76. package/esm2022/lib/web-services/aggregations.service.mjs +104 -0
  77. package/esm2022/lib/web-services/app.service.mjs +48 -0
  78. package/esm2022/lib/web-services/audit.service.mjs +122 -0
  79. package/esm2022/lib/web-services/index.mjs +10 -0
  80. package/esm2022/lib/web-services/json-method-plugin.service.mjs +54 -0
  81. package/esm2022/lib/web-services/preview.service.mjs +327 -0
  82. package/esm2022/lib/web-services/principal.service.mjs +46 -0
  83. package/esm2022/lib/web-services/query.service.mjs +123 -0
  84. package/esm2022/lib/web-services/text-chunck.service.mjs +46 -0
  85. package/esm2022/public-api.mjs +5 -0
  86. package/esm2022/sinequa-atomic-angular.mjs +5 -0
  87. package/fesm2022/sinequa-atomic-angular.mjs +4204 -0
  88. package/fesm2022/sinequa-atomic-angular.mjs.map +1 -0
  89. package/index.d.ts +5 -0
  90. package/lib/assistant/index.d.ts +1 -0
  91. package/lib/assistant/signalR.web.service.d.ts +46 -0
  92. package/lib/components/dropdown.d.ts +50 -0
  93. package/lib/components/index.d.ts +4 -0
  94. package/lib/components/menu/index.d.ts +2 -0
  95. package/lib/components/menu/menu-item.d.ts +8 -0
  96. package/lib/components/menu/menu.d.ts +24 -0
  97. package/lib/components/metadata/index.d.ts +1 -0
  98. package/lib/components/metadata/metadata.component.d.ts +24 -0
  99. package/lib/components/theme/index.d.ts +2 -0
  100. package/lib/components/theme/theme-selector.component.d.ts +70 -0
  101. package/lib/components/theme/theme-toggle.component.d.ts +10 -0
  102. package/lib/directives/index.d.ts +4 -0
  103. package/lib/directives/infinite-scroll.directive.d.ts +30 -0
  104. package/lib/directives/select-article-on-click.directive.d.ts +14 -0
  105. package/lib/directives/show-bookmark.directive.d.ts +52 -0
  106. package/lib/directives/theme-provider.directive.d.ts +20 -0
  107. package/lib/guards/auth.guard.d.ts +7 -0
  108. package/lib/guards/index.d.ts +2 -0
  109. package/lib/guards/initialization.guard.d.ts +20 -0
  110. package/lib/interceptors/audit.interceptor.d.ts +13 -0
  111. package/lib/interceptors/auth.interceptor.d.ts +14 -0
  112. package/lib/interceptors/body.interceptor.d.ts +11 -0
  113. package/lib/interceptors/error.interceptor.d.ts +9 -0
  114. package/lib/interceptors/index.d.ts +5 -0
  115. package/lib/interceptors/toast.interceptor.d.ts +13 -0
  116. package/lib/models/aggregation.d.ts +12 -0
  117. package/lib/models/article-metadata.d.ts +5 -0
  118. package/lib/models/autocomplete.d.ts +5 -0
  119. package/lib/models/custom-json.d.ts +58 -0
  120. package/lib/models/filter-dropdown.d.ts +10 -0
  121. package/lib/models/index.d.ts +6 -0
  122. package/lib/models/user-settings.d.ts +32 -0
  123. package/lib/pipes/highlight-word.pipe.d.ts +22 -0
  124. package/lib/pipes/index.d.ts +2 -0
  125. package/lib/pipes/source-icon.pipe.d.ts +54 -0
  126. package/lib/providers/eager-provider.d.ts +11 -0
  127. package/lib/providers/index.d.ts +1 -0
  128. package/lib/public-api.d.ts +15 -0
  129. package/lib/resolvers/index.d.ts +1 -0
  130. package/lib/resolvers/query-name-resolver.d.ts +9 -0
  131. package/lib/resources/index.d.ts +1 -0
  132. package/lib/resources/themes.d.ts +51 -0
  133. package/lib/services/application.service.d.ts +178 -0
  134. package/lib/services/autocomplete.service.d.ts +91 -0
  135. package/lib/services/drawer/backdrop.service.d.ts +9 -0
  136. package/lib/services/drawer/drawer-stack.service.d.ts +70 -0
  137. package/lib/services/drawer/drawer.service.d.ts +15 -0
  138. package/lib/services/index.d.ts +11 -0
  139. package/lib/services/label.service.d.ts +117 -0
  140. package/lib/services/navigation.service.d.ts +33 -0
  141. package/lib/services/saved-searches.service.d.ts +145 -0
  142. package/lib/services/search.service.d.ts +155 -0
  143. package/lib/services/selection-history.service.d.ts +50 -0
  144. package/lib/services/selection.service.d.ts +127 -0
  145. package/lib/stores/aggregations.store.d.ts +50 -0
  146. package/lib/stores/app.store.d.ts +208 -0
  147. package/lib/stores/application.store.d.ts +106 -0
  148. package/lib/stores/index.d.ts +8 -0
  149. package/lib/stores/principal.store.d.ts +53 -0
  150. package/lib/stores/query-params.store.d.ts +187 -0
  151. package/lib/stores/selection.store.d.ts +62 -0
  152. package/lib/stores/theme.store.d.ts +55 -0
  153. package/lib/stores/user-settings.store.d.ts +161 -0
  154. package/lib/tokens/highlights.d.ts +8 -0
  155. package/lib/tokens/index.d.ts +1 -0
  156. package/lib/utils/debounced-signal.d.ts +25 -0
  157. package/lib/utils/index.d.ts +7 -0
  158. package/lib/utils/inline-worker.d.ts +11 -0
  159. package/lib/utils/query.d.ts +26 -0
  160. package/lib/utils/routes.d.ts +16 -0
  161. package/lib/utils/tailwind-utils.d.ts +2 -0
  162. package/lib/utils/theme-body-hook.d.ts +6 -0
  163. package/lib/utils/theme-registry.d.ts +3 -0
  164. package/lib/web-services/aggregations.service.d.ts +60 -0
  165. package/lib/web-services/app.service.d.ts +30 -0
  166. package/lib/web-services/audit.service.d.ts +75 -0
  167. package/lib/web-services/index.d.ts +9 -0
  168. package/lib/web-services/json-method-plugin.service.d.ts +41 -0
  169. package/lib/web-services/preview.service.d.ts +295 -0
  170. package/lib/web-services/principal.service.d.ts +28 -0
  171. package/lib/web-services/query.service.d.ts +29 -0
  172. package/lib/web-services/text-chunck.service.d.ts +22 -0
  173. package/package.json +28 -0
  174. 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