@sinequa/atomic-angular 0.0.146
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 +334 -0
- package/esm2022/lib/assistant/index.mjs +2 -0
- package/esm2022/lib/assistant/signalR.web.service.mjs +81 -0
- package/esm2022/lib/components/dropdown-input.mjs +97 -0
- package/esm2022/lib/components/dropdown-list.mjs +35 -0
- package/esm2022/lib/components/dropdown.mjs +127 -0
- package/esm2022/lib/components/index.mjs +7 -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/public-api.mjs +18 -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 +59 -0
- package/esm2022/lib/stores/app.store.mjs +270 -0
- package/esm2022/lib/stores/application.store.mjs +87 -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 +207 -0
- package/esm2022/lib/stores/selection.store.mjs +45 -0
- package/esm2022/lib/stores/theme.store.mjs +116 -0
- package/esm2022/lib/stores/user-settings.store.mjs +391 -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 +4420 -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-input.d.ts +18 -0
- package/lib/components/dropdown-list.d.ts +8 -0
- package/lib/components/dropdown.d.ts +50 -0
- package/lib/components/index.d.ts +6 -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 +60 -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 +69 -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 +38 -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 +51 -0
- package/lib/public-api.d.ts +14 -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 +183 -0
- package/lib/services/autocomplete.service.d.ts +96 -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 +114 -0
- package/lib/services/navigation.service.d.ts +33 -0
- package/lib/services/saved-searches.service.d.ts +149 -0
- package/lib/services/search.service.d.ts +159 -0
- package/lib/services/selection-history.service.d.ts +50 -0
- package/lib/services/selection.service.d.ts +123 -0
- package/lib/stores/aggregations.store.d.ts +25 -0
- package/lib/stores/app.store.d.ts +110 -0
- package/lib/stores/application.store.d.ts +83 -0
- package/lib/stores/index.d.ts +8 -0
- package/lib/stores/principal.store.d.ts +47 -0
- package/lib/stores/query-params.store.d.ts +128 -0
- package/lib/stores/selection.store.d.ts +52 -0
- package/lib/stores/theme.store.d.ts +66 -0
- package/lib/stores/user-settings.store.d.ts +111 -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 +57 -0
- package/lib/web-services/app.service.d.ts +30 -0
- package/lib/web-services/audit.service.d.ts +72 -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 +283 -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 @@
|
|
|
1
|
+
{"version":3,"file":"sinequa-atomic-angular.mjs","sources":["../../../projects/atomic-angular/src/lib/assistant/signalR.web.service.ts","../../../projects/atomic-angular/src/lib/components/dropdown.ts","../../../projects/atomic-angular/src/lib/components/dropdown-list.ts","../../../projects/atomic-angular/src/lib/components/dropdown-input.ts","../../../projects/atomic-angular/src/lib/utils/tailwind-utils.ts","../../../projects/atomic-angular/src/lib/components/menu/menu.ts","../../../projects/atomic-angular/src/lib/components/menu/menu-item.ts","../../../projects/atomic-angular/src/lib/components/metadata/metadata.component.ts","../../../projects/atomic-angular/src/lib/resources/themes.ts","../../../projects/atomic-angular/src/lib/stores/aggregations.store.ts","../../../projects/atomic-angular/src/lib/web-services/app.service.ts","../../../projects/atomic-angular/src/lib/stores/app.store.ts","../../../projects/atomic-angular/src/lib/stores/application.store.ts","../../../projects/atomic-angular/src/lib/web-services/principal.service.ts","../../../projects/atomic-angular/src/lib/stores/principal.store.ts","../../../projects/atomic-angular/src/lib/utils/inline-worker.ts","../../../projects/atomic-angular/src/lib/utils/query.ts","../../../projects/atomic-angular/src/lib/utils/routes.ts","../../../projects/atomic-angular/src/lib/utils/theme-body-hook.ts","../../../projects/atomic-angular/src/lib/utils/theme-registry.ts","../../../projects/atomic-angular/src/lib/utils/debounced-signal.ts","../../../projects/atomic-angular/src/lib/stores/query-params.store.ts","../../../projects/atomic-angular/src/lib/stores/selection.store.ts","../../../projects/atomic-angular/src/lib/stores/theme.store.ts","../../../projects/atomic-angular/src/lib/stores/user-settings.store.ts","../../../projects/atomic-angular/src/lib/components/theme/theme-selector.component.ts","../../../projects/atomic-angular/src/lib/components/theme/theme-toggle.component.ts","../../../projects/atomic-angular/src/lib/directives/infinite-scroll.directive.ts","../../../projects/atomic-angular/src/lib/services/selection.service.ts","../../../projects/atomic-angular/src/lib/services/selection-history.service.ts","../../../projects/atomic-angular/src/lib/web-services/audit.service.ts","../../../projects/atomic-angular/src/lib/services/navigation.service.ts","../../../projects/atomic-angular/src/lib/services/drawer/backdrop.service.ts","../../../projects/atomic-angular/src/lib/services/drawer/drawer-stack.service.ts","../../../projects/atomic-angular/src/lib/directives/select-article-on-click.directive.ts","../../../projects/atomic-angular/src/lib/directives/show-bookmark.directive.ts","../../../projects/atomic-angular/src/lib/directives/theme-provider.directive.ts","../../../projects/atomic-angular/src/lib/guards/auth.guard.ts","../../../projects/atomic-angular/src/lib/guards/initialization.guard.ts","../../../projects/atomic-angular/src/lib/interceptors/audit.interceptor.ts","../../../projects/atomic-angular/src/lib/interceptors/auth.interceptor.ts","../../../projects/atomic-angular/src/lib/interceptors/body.interceptor.ts","../../../projects/atomic-angular/src/lib/services/application.service.ts","../../../projects/atomic-angular/src/lib/services/autocomplete.service.ts","../../../projects/atomic-angular/src/lib/services/label.service.ts","../../../projects/atomic-angular/src/lib/services/saved-searches.service.ts","../../../projects/atomic-angular/src/lib/web-services/query.service.ts","../../../projects/atomic-angular/src/lib/services/search.service.ts","../../../projects/atomic-angular/src/lib/services/drawer/drawer.service.ts","../../../projects/atomic-angular/src/lib/interceptors/error.interceptor.ts","../../../projects/atomic-angular/src/lib/interceptors/toast.interceptor.ts","../../../projects/atomic-angular/src/lib/interceptors/index.ts","../../../projects/atomic-angular/src/lib/pipes/highlight-word.pipe.ts","../../../projects/atomic-angular/src/lib/pipes/source-icon.pipe.ts","../../../projects/atomic-angular/src/lib/resolvers/query-name-resolver.ts","../../../projects/atomic-angular/src/lib/tokens/highlights.ts","../../../projects/atomic-angular/src/lib/web-services/aggregations.service.ts","../../../projects/atomic-angular/src/lib/web-services/json-method-plugin.service.ts","../../../projects/atomic-angular/src/lib/web-services/preview.service.ts","../../../projects/atomic-angular/src/lib/web-services/text-chunck.service.ts","../../../projects/atomic-angular/src/lib/public-api.ts","../../../projects/atomic-angular/src/public-api.ts","../../../projects/atomic-angular/src/sinequa-atomic-angular.ts"],"sourcesContent":["import { Injectable, InjectionToken } from \"@angular/core\";\nimport { HubConnectionBuilder, LogLevel, HubConnection, MessageHeaders, HttpTransportType, ITransport } from '@microsoft/signalr';\nimport { globalConfig } from \"@sinequa/atomic\";\n\nexport interface ConnectionOptions {\n withCredentials?: boolean; // if true, the browser automatically includes the authentication cookie in the request headers when establishing the SignalR connection\n headers?: MessageHeaders;\n transport?: HttpTransportType | ITransport; // If transports are provided, use them; otherwise, let SignalR negotiate\n accessTokenFactory?: () => string | Promise<string>;\n}\n\n/** A token that is used to inject the transports allowed to use by hub connection.\n *\n * Expects a {@link HttpTransportType} value.\n*/\nexport const SIGNAL_R_TRANSPORTS = new InjectionToken<HttpTransportType>('SIGNAL_R_TRANSPORTS');\n\n/** A token that is used to inject the log level for the hub connection.\n *\n * Expects a {@link LogLevel} value.\n*/\nexport const SIGNAL_R_LOG_LEVEL = new InjectionToken<LogLevel>('SIGNAL_R_LOG_LEVEL');\n\n/**\n * A service to connect the Sinequa server to the client via SignalR\n */\n@Injectable({\n providedIn: \"root\"\n})\nexport class SignalRWebService {\n protected readonly endpoints = `${globalConfig.backendUrl}/endpoints/v1`;\n\n\n /**\n * Builds a SignalR connection to the given endpoint\n * @param endpointName Name of the endpoint to connect to\n * @param options Options for the connection. It must overrides the default options\n * @param logLevel The log level for the connection\n * @param automaticReconnect Whether the connection should automatically attempt to reconnect\n * @returns A SignalR connection\n */\n buildConnection(endpointName: string, options: ConnectionOptions, logLevel = LogLevel.Information, automaticReconnect = false): HubConnection {\n const url = `${this.endpoints}/${endpointName}`;\n\n const connectionBuilder = new HubConnectionBuilder()\n .withUrl(url, options)\n .configureLogging(logLevel);\n\n if (automaticReconnect) {\n connectionBuilder.withAutomaticReconnect();\n }\n\n return connectionBuilder.build();\n }\n\n /**\n * Starts a SignalR connection.\n * @param connection A SignalR connection\n */\n async startConnection(connection: HubConnection | undefined): Promise<void> {\n if (!connection) {\n throw new Error(\"Please provide a valid connection to start\");\n }\n try {\n await connection.start();\n console.log(`The SignalR connection has been successfully established! \\n url: ${connection.baseUrl} \\n connectionId: ${connection.connectionId}`);\n } catch (error) {\n throw error;\n }\n }\n\n /**\n * Stops a SignalR connection.\n * @param connection A SignalR connection\n */\n async stopConnection(connection: HubConnection | undefined): Promise<void> {\n if (!connection) {\n throw new Error(\"Please provide a valid connection to stop\");\n }\n try {\n await connection.stop();\n console.log(`The SignalR connection has been successfully stopped! \\n url: ${connection.baseUrl} \\n connectionId: ${connection.connectionId}`);\n } catch (error) {\n throw error;\n }\n }\n}\n","import { Component, ElementRef, HostListener, afterNextRender, input, signal, viewChild } from '@angular/core';\nimport { Placement, autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\n\n@Component({\n selector: 'sq-dropdown, Dropdown',\n standalone: true,\n template: `\n <div #trigger class=\"select-none dropdown\" (click)=\"toggle()\">\n <ng-content></ng-content>\n </div>\n\n <div #dropdownWrapper\n class=\"dropdown-wrapper absolute text-sm min-w-fit\"\n [style.display]=\"isOpen() ? 'block' : 'none'\"\n [style.width]=\"width() + 'px'\"\n (click)=\"contentClicked()\"\n (mouseleave)=\"mouseleave($event)\"\n >\n <ng-content select=\"[dropdown-content]\"></ng-content>\n </div>\n `,\n styles: `\n .dropdown-wrapper {\n z-index: var(--z-dropdown, 100);\n }\n `\n})\nexport class DropdownComponent {\n isOpen = signal(false);\n position = input<Placement>('bottom-start');\n autoClose = input<boolean>(false);\n disabled = input<boolean>();\n\n dropdown = viewChild<ElementRef>('dropdownWrapper');\n trigger = viewChild<ElementRef>('trigger');\n\n width = signal<number>(0);\n\n mouseleave(event: Event) {\n this.close();\n }\n\n /**\n * Initializes the dropdown component and sets up automatic updates for its position.\n *\n * The constructor uses `afterNextRender` to ensure that the DOM elements are available\n * before calling `autoUpdate`. The `autoUpdate` function monitors the trigger and dropdown\n * elements, and if the dropdown is open, it recalculates its position.\n *\n * @constructor\n */\n constructor() {\n afterNextRender(() => {\n autoUpdate(this.trigger()?.nativeElement, this.dropdown()?.nativeElement, () => {\n if (!this.isOpen()) return;\n this.calculatePosition();\n });\n });\n }\n\n\n /**\n * Toggles the dropdown's open state.\n * If the dropdown is disabled, the method returns immediately without making any changes.\n * Otherwise, it updates the `isOpen` state to its opposite value and recalculates the dropdown's position.\n */\n toggle() {\n if (this.disabled()) return;\n this.isOpen.update(() => !this.isOpen());\n this.calculatePosition();\n }\n\n /**\n * Closes the dropdown by setting the `isOpen` state to `false`.\n */\n close() {\n this.isOpen.set(false);\n }\n\n /**\n * Calculates and sets the position of the dropdown element relative to the trigger element.\n * Utilizes the `computePosition` function with specified middleware for offset, flip, and shift.\n * Updates the dropdown's `left` and `top` styles based on the computed position.\n * Also sets the width of the dropdown to match the trigger element's width.\n *\n * @returns {void}\n */\n calculatePosition() {\n computePosition(this.trigger()?.nativeElement, this.dropdown()?.nativeElement, {\n placement: this.position(),\n middleware: [offset(8), flip(), shift()],\n }).then(({ x, y }: { x: number; y: number }) => {\n this.dropdown()!.nativeElement.style.left = x + 'px';\n this.dropdown()!.nativeElement.style.top = y + 'px';\n this.width.set(this.trigger()?.nativeElement.offsetWidth);\n });\n }\n\n // Onclick outside the dropdown, close it\n @HostListener('document:click', ['$event'])\n clickout(event: Event) {\n if (\n // Check if the click was outside the dropdown\n // and the dropdown is open\n // and the click was not on the button\n // then close the dropdown\n !this.dropdown()?.nativeElement.contains(event.target)\n && this.isOpen\n && !this.trigger()?.nativeElement.contains(event.target)\n ) {\n this.isOpen.set(false);\n }\n }\n\n /**\n * Handles the click event on the dropdown content.\n * If the `autoClose` method returns true, it triggers the `close` method to close the dropdown.\n */\n contentClicked() {\n if (this.autoClose()) this.close();\n }\n}\n","import { Component, input, output } from '@angular/core';\nimport { DropdownItem } from './dropdown-input';\n\n@Component({\n selector: 'sq-dropdown-list, DropdownList',\n standalone: true,\n template: `\n@for (item of items(); track $index) {\n <span class=\"pill pill-sm pill-ghost bg-primary flex place-content-center items-center font-semibold text-white float-left m-1 select-none\"\n role=\"button\">\n {{ item.display || item.value }}\n <i class=\"ms-1 fa-fw far fa-circle-xmark cursor-pointer\" (click)=\"onClick.emit(item)\"></i>\n </span>\n}\n `\n})\nexport class DropdownListComponent {\n items = input.required<DropdownItem[]>();\n\n onClick = output<DropdownItem>();\n}\n","import { Component, input, output } from '@angular/core';\nimport { DropdownComponent } from './dropdown';\nimport { DropdownListComponent } from './dropdown-list';\n\nexport interface DropdownItem {\n display?: string;\n value: string;\n}\n\n@Component({\n selector: 'sq-dropdown-input, DropdownInput',\n standalone: true,\n imports: [DropdownComponent, DropdownListComponent],\n template: `\n @if (label()) {\n <p class=\"font-semibold\">{{ label() }}</p>\n }\n <Dropdown class=\"w-full block\">\n <input\n #searchInput\n class=\"w-1/2 grow focus:outline-none rounded border border-neutral-200 group-hover:bg-white p-2\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.aria-label]=\"placeholder()\"\n [attr.placeholder]=\"placeholder()\"\n (focus)=\"onFocus.emit(searchInput.value)\"\n (keyup)=\"onKeyUp.emit(searchInput.value)\"\n />\n\n <DropdownList class=\"mb-4\" [items]=\"selected()\" (onClick)=\"removeItem.emit($event)\" />\n \n <div dropdown-content class=\"dropdown-content w-max mt-[-1.5rem]\">\n @if (!suggestions().length) {\n {{ noResultLabel() }}\n } @else {\n <ul class=\"data-list-xs flex-grow overflow-auto max-h-44 my-2\">\n @for (suggestion of suggestions(); track $index) {\n <li class=\"p-2 flex data-list-item items-baseline gap-2 cursor-pointer\"\n (click)=\"addItem.emit(suggestion)\">\n {{ suggestion.display || suggestion.value }}\n </li>\n }\n </ul>\n }\n </div>\n </Dropdown>\n `\n})\nexport class DropdownInputComponent {\n label = input<string>();\n placeholder = input<string>('Start typing to search...');\n noResultLabel = input<string>('No results to be displayed...');\n suggestions = input<DropdownItem[]>([]);\n selected = input.required<DropdownItem[]>();\n\n onFocus = output<string | null>(); // emits the input value\n onKeyUp = output<string | null>(); // emits the input value\n removeItem = output<DropdownItem>();\n addItem = output<DropdownItem>();\n}\n","import { type ClassValue, clsx } from 'clsx';\r\nimport { twMerge } from 'tailwind-merge';\r\n\r\nexport function cn(...inputs: ClassValue[]) {\r\n return twMerge(clsx(inputs));\r\n}\r\n","import { NgClass } from '@angular/common';\nimport { AfterViewInit, Component, ElementRef, HostListener, ViewEncapsulation, input, signal, viewChild } from '@angular/core';\nimport { Placement, autoUpdate, computePosition, flip, offset, shift } from '@floating-ui/dom';\n\nimport { cn } from '../../utils/tailwind-utils';\n\n@Component({\n selector: 'sq-menu, Menu',\n standalone: true,\n imports: [NgClass],\n encapsulation: ViewEncapsulation.None,\n template: `\n <div #trigger class=\"select-none\" (click)=\"toggle($event)\">\n <ng-content></ng-content>\n </div>\n <div #dropdown\n [ngClass]= \"cn(default, className(), disabled() && 'disabled cursor-default opacity-50 hover:bg-transparent')\"\n [style.display]=\"isOpen() ? 'block' : 'none'\"\n [style.width]=\"width() + 'px'\"\n (click)=\"contentClicked($event)\"\n >\n <ng-content select=\"[menu-content]\"></ng-content>\n </div>\n `\n})\nexport class MenuComponent implements AfterViewInit {\n cn = cn;\n\n default = \"z-10 bg-white rounded-md border border-gray-300 shadow absolute text-sm\"\n\n isOpen = signal(false);\n position = input<Placement>('bottom-start');\n className = input<string>();\n disabled = input<boolean>();\n autoClose = input<boolean>(false);\n\n dropdown = viewChild<ElementRef>('dropdown');\n trigger = viewChild<ElementRef>('trigger');\n\n width = signal<number>(0);\n\n ngAfterViewInit() {\n autoUpdate(this.trigger()?.nativeElement, this.dropdown()?.nativeElement, () => {\n if (!this.isOpen()) return;\n this.calculatePosition();\n });\n }\n\n toggle(e: Event) {\n e.stopPropagation();\n if (this.disabled()) return;\n this.isOpen.update(() => !this.isOpen());\n this.calculatePosition();\n }\n\n close() {\n this.isOpen.set(false);\n }\n\n calculatePosition() {\n computePosition(this.trigger()?.nativeElement, this.dropdown()?.nativeElement, {\n placement: this.position(),\n middleware: [offset(8), flip(), shift()],\n }).then(({ x, y }: { x: number; y: number }) => {\n this.dropdown()!.nativeElement.style.left = x + 'px';\n this.dropdown()!.nativeElement.style.top = y + 'px';\n this.width.set(this.trigger()?.nativeElement.offsetWidth);\n });\n }\n\n contentClicked(e: Event) {\n e.stopPropagation();\n if (this.autoClose()) this.close();\n }\n\n // Onclick outside the dropdown, close it\n @HostListener('document:click', ['$event'])\n clickout(event: Event) {\n if (\n !this.dropdown()?.nativeElement.contains(event.target) &&\n this.isOpen &&\n !this.trigger()?.nativeElement.contains(event.target)\n ) {\n this.isOpen.set(false);\n }\n }\n}\n","import { NgClass } from \"@angular/common\";\r\nimport { Component, computed, HostBinding, input } from \"@angular/core\";\r\nimport { MenuComponent } from \"./menu\";\r\n\r\n@Component({\r\n selector: \"sq-menu-item, menu-item, MenuItem\",\r\n standalone: true,\r\n imports: [NgClass],\r\n template: `\r\n <ng-content></ng-content>\r\n`,\r\n host: {\r\n class: 'data-list-item flex gap-2 items-center justify-start py-2 px-4 text-sm cursor-pointer'\r\n },\r\n styles: [`\r\n :host[disabled] {\r\n cursor: default;\r\n }\r\n `]\r\n})\r\nexport class MenuItemComponent {\r\n constructor(public readonly menu: MenuComponent) {}\r\n}","import { NgClass } from \"@angular/common\";\r\nimport { Component, computed, input, output } from \"@angular/core\";\r\nimport { Article, KeyOf, getMetadata } from \"@sinequa/atomic\";\r\nimport { cn } from \"../../utils/tailwind-utils\";\r\n\r\n@Component({\r\n selector: 'sq-metadata, Metadata',\r\n exportAs: 'metadata',\r\n standalone: true,\r\n imports: [NgClass],\r\n template: `\r\n\r\n @if(override()) {\r\n <ng-content></ng-content>\r\n }\r\n @else {\r\n <ng-content select=\"[before]\"></ng-content>\r\n @for(item of items(); track $index) {\r\n @if(item.display) {\r\n <span [ngClass]=\"cn(default, className())\" (click)=\"onClick($event, {field: this.metadata() ,value: item.display })\">{{ item.display }}</span>\r\n }\r\n }\r\n <ng-content select=\"[after]\"></ng-content>\r\n }\r\n `,\r\n host: {\r\n '[class.hidden]': 'items().length === 0'\r\n }\r\n})\r\nexport class MetadataComponent {\r\n cn = cn;\r\n default = \"text-ellipsis\";\r\n\r\n override = input(false);\r\n className = input<string>();\r\n article = input.required<Partial<Article> | (string & Record<never, never>)>();\r\n metadata = input.required<KeyOf<Article> | (string & Record<never, never>)>();\r\n\r\n onMetadataClick = output<{ field: string, value: string }>();\r\n\r\n items = computed(() => getMetadata(this.article(), this.metadata()));\r\n\r\n onClick(event: MouseEvent, item: { field: string, value: string }) {\r\n event.stopPropagation();\r\n this.onMetadataClick.emit(item);\r\n }\r\n}","export const THEMES = [\n {\n name: \"Default\",\n id: \"default\",\n private: false,\n colors: {\n \"button-primary-background\": \"none\",\n background: \"0 0% 100%\",\n foreground: \"225 11% 7%\",\n card: \"0 0% 100%\",\n \"card-foreground\": \"225 11% 7%\",\n active: \"219 97% 54%\",\n \"active-foreground\": \"0 0% 98%\",\n \"active-background\": \"219 97% 54% / 10%\",\n primary: \"219 97% 54%\",\n \"primary-foreground\": \"0 0% 98%\",\n secondary: \"240 4.8% 95.9%\",\n \"secondary-foreground\": \"240 5.9% 10%\",\n muted: \"240 4.8% 95.9%\",\n \"muted-foreground\": \"240 3.8% 46.1%\",\n accent: \"240 4.8% 95.9%\",\n \"accent-foreground\": \"240 5.9% 10%\",\n destructive: \"0 84.2% 60.2%\",\n \"destructive-foreground\": \"0 0% 98%\",\n border: \"240 5.9% 90%\",\n input: \"240 5.9% 90%\",\n ring: \"225 11% 7%\",\n },\n colorsDark: {\n background: \"240 10% 3.9%\",\n foreground: \"0 0% 98%\",\n card: \"240 10% 3.9%\",\n \"card-foreground\": \"0 0% 98%\",\n active: \"0 0% 98%\",\n \"active-foreground\": \"240 5.9% 10%\",\n \"active-background\": \"0 0% 98% / 10%\",\n primary: \"0 0% 98%\",\n \"primary-foreground\": \"240 5.9% 10%\",\n secondary: \"240 3.7% 15.9%\",\n \"secondary-foreground\": \"0 0% 98%\",\n muted: \"240 3.7% 15.9%\",\n \"muted-foreground\": \"240 5% 64.9%\",\n accent: \"240 3.7% 15.9%\",\n \"accent-foreground\": \"0 0% 98%\",\n destructive: \"0 62.8% 30.6%\",\n \"destructive-foreground\": \"0 0% 98%\",\n border: \"240 3.7% 15.9%\",\n input: \"240 3.7% 15.9%\",\n ring: \"240 4.9% 83.9%\",\n },\n }\n];\n\nexport type Theme = (typeof THEMES)[number];","import { withDevtools } from \"@angular-architects/ngrx-toolkit\";\r\nimport { getState, patchState, signalStore, signalStoreFeature, withMethods, withState } from \"@ngrx/signals\";\r\n\r\nimport { Aggregation } from \"@sinequa/atomic\";\r\n\r\nexport type AggregationsState = {\r\n aggregations: Aggregation[]\r\n}\r\n\r\nexport const AggregationsStore = signalStore(\r\n // providing store at the root level\r\n { providedIn: 'root' },\r\n withDevtools('Aggregations'),\r\n\r\n withAggregationsFeatures()\r\n);\r\n\r\nexport function withAggregationsFeatures() {\r\n return signalStoreFeature(\r\n withState({ aggregations: [] as Aggregation[] } as AggregationsState),\r\n withMethods((store) => ({\r\n /**\r\n * Updates the state with the provided aggregations.\r\n *\r\n * @param {Aggregation[]} aggregations - The new aggregations to update the state with.\r\n */\r\n update(aggregations: Aggregation[]) {\r\n patchState(store, (state) => {\r\n return { ...state, aggregations }\r\n })\r\n },\r\n /**\r\n * Updates an existing aggregation in the store.\r\n *\r\n * @param aggregation - The aggregation object to update.\r\n * @returns void\r\n */\r\n updateAggregation(aggregation: Aggregation) {\r\n patchState(store, (state) => {\r\n const index = state.aggregations.findIndex((a) => a.name === aggregation.name);\r\n if (index !== -1) {\r\n state.aggregations[index] = aggregation;\r\n }\r\n return { ...state }\r\n })\r\n },\r\n /**\r\n * Clears the aggregations in the store by setting the `aggregations` property to an empty array.\r\n *\r\n * @remarks\r\n * This method uses the `patchState` function to update the state of the store.\r\n */\r\n clear() {\r\n patchState(store, (state) => {\r\n return { ...state, aggregations: [] }\r\n })\r\n },\r\n /**\r\n * Retrieves an aggregation by name or column.\r\n * \r\n * @param name - The name or column of the aggregation to retrieve.\r\n * @param kind - The kind of aggregation to retrieve. Defaults to \"name\".\r\n * @returns The matching aggregation, or undefined if not found.\r\n */\r\n getAggregation(name: string, kind: \"column\" | \"name\" = \"name\") {\r\n if (kind === \"column\") {\r\n return getState(store).aggregations.find((aggregation) => aggregation.column === name);\r\n }\r\n return getState(store).aggregations.find((aggregation) => aggregation.name === name);\r\n }\r\n }))\r\n )\r\n}","import { HttpClient, HttpParams } from '@angular/common/http';\r\nimport { inject, Injectable } from '@angular/core';\r\nimport { catchError, EMPTY, Observable } from 'rxjs';\r\n\r\nimport { CCApp, globalConfig } from '@sinequa/atomic';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AppService {\r\n protected readonly http = inject(HttpClient);\r\n\r\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\r\n\r\n /**\r\n * Retrieves the application configuration from the server.\r\n * \r\n * @param appName - The name of the application to fetch the configuration for.\r\n *\r\n * @returns {Observable<CCApp>} An observable that emits the application configuration.\r\n *\r\n * @remarks\r\n * This method constructs an HTTP GET request to fetch the application configuration\r\n * using the `app` parameter from the global configuration. If the request fails,\r\n * it logs the error to the console and returns an empty observable.\r\n *\r\n * @example\r\n * ```typescript\r\n * appService.getApp().subscribe(appConfig => {\r\n * console.log(appConfig);\r\n * });\r\n * ```\r\n */\r\n getApp(appName?: string): Observable<CCApp> {\r\n const app = appName || globalConfig.app;\r\n\r\n const params = new HttpParams().set('app', app || '');\r\n\r\n return this.http.get<CCApp>(this.API_URL + \"/app\", { params })\r\n .pipe(\r\n catchError(error => {\r\n console.error(\"AppService.getApp failure - error: \", error);\r\n return EMPTY;\r\n })\r\n );\r\n }\r\n}\r\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { computed, inject, InjectionToken } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { getState, patchState, signalStore, signalStoreFeature, withComputed, withMethods, withState } from '@ngrx/signals';\nimport { firstValueFrom, map } from 'rxjs';\n\nimport { Aggregation, CCApp, CCColumn, CCQuery, CCWebService } from '@sinequa/atomic';\n\nimport { CFilter, CFilterItem, CJsonMint, SideCJson } from '../models/custom-json';\nimport { AppService } from '../web-services/app.service';\nimport { AggregationsStore } from './aggregations.store';\n\n\n/**\n * Injection token for a list of facet names to display in the application.\n *\n * This token provides a default list of facet names including:\n * - Geo\n * - Company\n * - Person\n * - DocFormat\n * - Modified\n * - Size\n * - DocumentLanguages\n * - Concepts\n *\n * @constant\n * @type {InjectionToken<string[]>}\n */\nexport const AGGREGATIONS_NAMES_PRESET_DEFAULT = [\n \"Places\", \"Sources\", \"Company\", \"People\", \"Formats\", \"Modified\", \"Sizes\", \"Languages\", \"Concepts\",\n \"DocFormat\", \"Geo\", \"Person\", \"Treepath\", \"DocumentLanguages\", \"Size\"\n];\n\nexport const AGGREGATIONS_NAMES = new InjectionToken('Facets list to display', { factory: () => AGGREGATIONS_NAMES_PRESET_DEFAULT });\n\nexport type CCWebServiceLabels = CCWebService & {\n privateLabelsField: string;\n publicLabelsField: string;\n}\n\nexport type CCAppState = {\n data: CJsonMint;\n customJSONs: SideCJson[];\n webServices: Record<string, CCWebService>;\n queries: Record<string, CCQuery>;\n}\n\nexport const AppStore = signalStore(\n { providedIn: 'root' },\n withDevtools('App'),\n\n withAppFeatures(),\n withAppCustomizationFeatures()\n);\n\n/**\n * Basic app management features\n */\nexport function withAppFeatures() {\n return signalStoreFeature(\n withState({ webServices: {}, queries: {} }),\n /**\n * Enhances the application store with various features and methods.\n *\n * This function integrates state management, computed properties, and methods\n * to interact with the CCApp state, including initialization, updates,\n * and retrieval of specific data such as web services, queries, and customization JSONs.\n *\n * Features:\n * - State management with initial data.\n * - Computed properties for customization JSON, sources, and filters.\n * - Methods for initializing and updating the application state.\n * - Methods for retrieving web services, labels, queries, and customization JSONs.\n * - Methods for retrieving aggregation icons and customization items.\n *\n * @returns The enhanced application store with additional features and methods.\n */\n withMethods((store, appService = inject(AppService)) => ({\n /**\n * Initializes the application state by fetching the app data from the appService\n * and updating the store with the retrieved data.\n *\n * @returns A promise that resolves when the app data has been fetched and the store has been updated.\n */\n initialize() {\n return firstValueFrom(appService.getApp().pipe(map(app => patchState(store, app))));\n },\n /**\n * Initializes the application state with the provided app name.\n * \n * @param appName - The name of the application to fetch the configuration for.\n * \n * @returns A promise that resolves when the app data has been fetched and the store has been updated.\n */\n initializeWithAppName(appName: string) {\n return firstValueFrom(appService.getApp(appName).pipe(map(app => patchState(store, app))));\n },\n /**\n * Updates the application state with the provided CCApp object.\n *\n * @param {CCApp} app - The application object containing the new state values.\n */\n update(app: CCApp) {\n patchState(store, (state) => {\n return { ...state, ...app }\n })\n },\n /**\n * Returns the web service by type name\n *\n * @param type Web service type name\n * @returns A {@link CCWebService} object or undefined if not found\n */\n getWebServiceByType(type: CCWebService['webServiceType']): CCWebService | undefined {\n let webService = undefined;\n\n Object.keys(store.webServices())\n .forEach((key) => {\n const w = store.webServices() as Record<string, CCWebService>;\n const ws = w[key] as unknown as CCWebService;\n // Check if the web service type matches the specified type in lowercase\n if (ws.webServiceType.toLowerCase() === type.toLocaleLowerCase()) webService = ws;\n });\n\n return webService;\n },\n /**\n * Retrieves the labels from the web service of type 'Labels'.\n *\n * @returns An object containing the private and public labels.\n * If the labels are not found, returns an object with empty strings for both fields.\n */\n getLabels(): { private: string, public: string } {\n const labels = this.getWebServiceByType('labels') as CCWebServiceLabels;\n if (!labels) return { private: '', public: '' };\n const { publicLabelsField, privateLabelsField } = labels;\n return ({ private: privateLabelsField, public: publicLabelsField });\n },\n /**\n * Retrieves a query by its name from the store.\n *\n * @param name - The name of the query to retrieve.\n * @returns The query object if found, otherwise `undefined`.\n */\n getQueryByName(name: string): CCQuery | undefined {\n const queries = store.queries() as Record<string, CCQuery>;\n return queries[name.toLowerCase()] as CCQuery;\n },\n /**\n * Retrieves a query by its index from the store.\n *\n * @param index - The index of the query to retrieve.\n * @returns The query at the specified index, or `undefined` if the index is out of bounds.\n */\n getQueryByIndex(index: number): CCQuery | undefined {\n const queries = store.queries() as Record<string, CCQuery>;\n const keys = Object.keys(queries);\n return queries[keys[index]];\n },\n /**\n * Retrieves the default query.\n * The default query is always the first query in the list of queries.\n *\n * @returns {CCQuery | undefined} The default query if it exists, otherwise undefined.\n */\n getDefaultQuery(): CCQuery | undefined {\n return this.getQueryByIndex(0);\n },\n /**\n * Retrieves the allowEmptySearch property for a specific query.\n * @param queryName - The name of the query for which to retrieve allow empty serach property.\n * @returns The allowEmptySearch property for the specified query, or false if not found.\n */\n allowEmptySearch(queryName: string): boolean {\n const queries = store.queries() as Record<string, CCQuery>;\n const keys = Object.keys(queries);\n\n if (keys.length === 0) return false;\n\n const query = (queryName && queries[queryName.toLocaleLowerCase()]) || queries[keys[0]];\n return query?.allowEmptySearch || false;\n },\n /**\n * Retrieves the alias for a given column name from the application's state.\n * If the column has aliases defined, the first alias is returned. Otherwise,\n * the original column name is returned.\n *\n * @param column - The name of the column for which to retrieve the alias.\n * @returns The alias of the column if it exists, otherwise the original column name.\n */\n getColumnAlias(column: string): string {\n const state = getState(store) as CCApp;\n const schema = state.indexes?.['_']?.columns as Record<string, CCColumn>;\n const col = schema[column];\n if (col) {\n return col.aliases?.[0] || column;\n }\n return column;\n },\n })),\n withMethods((store, aggregationsStore = inject(AggregationsStore), aggregationsNames = inject(AGGREGATIONS_NAMES)) => ({\n /**\n * Retrieves the sorted aggregations based on the provided query name.\n * @param queryName - The name of the query.\n * @returns An array of sorted aggregations.\n */\n getAuthorizedFilters(route: ActivatedRoute) {\n const { queryName } = route.snapshot.data;\n const { aggregations = [] } = store.getQueryByName(queryName.toLowerCase()) || {} as CCQuery;\n const agg = [...aggregationsStore.aggregations().filter(aggregation => aggregationsNames.includes(aggregation.name.trim()))];\n // sort the aggregations based on the query order\n if (Array.isArray(aggregations)) {\n const queryAggregationsOrder = aggregations.map(aggregation => aggregation.name.trim()) || [];\n return agg.toSorted((a: Aggregation, b: Aggregation) => queryAggregationsOrder.indexOf(a.name) - queryAggregationsOrder.indexOf(b.name));\n }\n // return the default order\n return agg;\n }\n }))\n )\n}\n\n/**\n * Management of customization JSONs features for the app\n */\nexport function withAppCustomizationFeatures() {\n return signalStoreFeature(\n withState({ customJSONs: [] as SideCJson[], data: {} }),\n\n withComputed(({ customJSONs, data }) => ({\n customizationJson: computed(() => data() as CJsonMint),\n sources: computed(() => {\n if (customJSONs() === undefined || Array.isArray(customJSONs()) === false)\n return (data() as CJsonMint).sources || {};\n\n const sourcesJson = customJSONs()?.find(json => json.name === \"sources\");\n const sources = sourcesJson?.data['sources'] || {};\n\n return sources ?? (data() as CJsonMint).sources ?? {};\n }),\n filters: computed(() => {\n if (customJSONs() === undefined || Array.isArray(customJSONs()) === false)\n return (data() as CJsonMint).filters || [];\n\n const filtersJson = customJSONs()?.find(json => json.name === \"filters\");\n const filters = filtersJson?.data['filters'] || [];\n\n return filters ?? (data() as CJsonMint).filters ?? [];\n })\n })),\n\n withMethods((store) => ({\n /**\n * Retrieves the customization json by name\n * @param name - The name of the customization json\n * @returns The customization json object or undefined if not found\n */\n getNamedCustomizationJson(name: string): any | undefined {\n return store.customJSONs().find(data => data.name === name);\n },\n /**\n * Retrieves the icon associated with a given column's aggregation.\n *\n * This method searches through the store's filters to find an aggregation\n * that matches the specified column. If a matching aggregation is found,\n * its associated icon is returned. If no matching aggregation is found in\n * the store's filters, the method falls back to searching in the\n * customizationJson's filters.\n *\n * @param column - The name of the column for which to retrieve the aggregation icon.\n * @returns The icon associated with the specified column's aggregation, or undefined if no matching aggregation is found.\n */\n getAggregationIcon(column: string): string | undefined {\n const predicate = (aggregation: CFilter) => aggregation.column === column;\n if (store.filters().length > 0) {\n return store.filters().find(predicate)?.icon;\n }\n // fallback to customizationJson\n return store.customizationJson().filters?.find(predicate)?.icon;\n },\n /**\n * Retrieves the customization items for a given column from the store's filters.\n * If no items are found in the store's filters, it falls back to the customization JSON.\n *\n * @param column - The name of the column for which to retrieve customization items.\n * @returns An array of `CFilterItem` objects if found, otherwise `undefined`.\n */\n getAggregationItemsCustomization(column: string): CFilterItem[] | undefined {\n const predicate = (aggregation: CFilter) => aggregation.column === column;\n if (store.filters().length > 0) {\n return store.filters().find(predicate)?.items || [];\n }\n // fallback to customizationJson\n return store.customizationJson().filters?.find(predicate)?.items || [];\n },\n /**\n * Retrieves the customization for a specific aggregation column.\n * @param column - The column name for which to retrieve the customization.\n * @returns The customization object for the specified column, or undefined if not found.\n */\n getAggregationCustomization(column: string): CFilter | undefined {\n const predicate = (aggregation: CFilter) => aggregation.column === column;\n if (store.filters().length > 0) {\n return store.filters().find(predicate);\n }\n // fallback to customizationJson\n return store.customizationJson().filters?.find(predicate);\n },\n })),\n )\n}","import { withDevtools } from \"@angular-architects/ngrx-toolkit\";\nimport { computed } from \"@angular/core\";\nimport { SafeHtml } from '@angular/platform-browser';\nimport { patchState, signalStore, signalStoreFeature, withComputed, withMethods, withState } from \"@ngrx/signals\";\n\nexport type Extract = {\n id: string,\n text: SafeHtml, // Sanitized HTML text\n startIndex: number, // this is the start index of the extracts within the Document Text\n relevanceIndex: number, // 0 the most relevant to N the less relevant\n textIndex: number // index of the extract in the text. e.g 0 is the first extract displayed in the document\n}\n\nexport type ApplicationState = {\n assistantReady: boolean,\n ready: boolean,\n extracts: Map<string, Extract[]>,\n hasLabelsAccess: boolean\n}\n\nexport const ApplicationStore = signalStore(\n // providing store at the root level\n { providedIn: 'root', protectedState: false },\n withDevtools('Application'),\n\n withApplicationFeatures(),\n withExtractsFeatures()\n);\n\n/**\n * Enhances the application store with additional features.\n *\n * This function integrates several features into the application store, including state management,\n * computed properties, and various methods for updating and retrieving application state.\n *\n * Features included:\n * - State initialization with `intialState`.\n * - Methods for updating the application state:\n * - `updateAssistantReady`: Marks the assistant as ready.\n * - `updateReadyState`: Sets the application store's ready state to true.\n *\n * @returns A configured signal store feature with state, computed properties, and methods.\n */\nexport function withApplicationFeatures() {\n return signalStoreFeature(\n withState({ assistantReady: false, ready: false, hasLabelsAccess: false }),\n\n withMethods((store) => ({\n /**\n * Updates the application state to indicate that the assistant is ready.\n * This function patches the current state by setting the `assistantReady` property to `true`.\n */\n updateAssistantReady() {\n patchState(store, (state) => ({ ...state, assistantReady: true }));\n },\n /**\n * Updates the ready state of the application store to true.\n * This function patches the current state of the store by setting the `ready` property to `true`.\n */\n updateReadyState(value: boolean = true) {\n patchState(store, (state) => ({ ...state, ready: value }));\n },\n /**\n * Updates the `hasLabelsAccess` property in the application store state.\n *\n * @param value - A boolean value indicating whether the user has access to labels. Defaults to `true`.\n */\n updateHasLabelsAccess(value: boolean = true) {\n patchState(store, (state) => ({ ...state, hasLabelsAccess: value }));\n }\n }))\n );\n}\n\n/**\n * Provides features related to extracts within the application store.\n *\n * This function integrates state management, computed properties, and methods\n * for handling extracts in the application store.\n *\n * Features:\n * - State management for extracts.\n * - Computed property to get the count of extracts.\n * - Methods to update and retrieve extracts.\n *\n * @returns A configured signal store feature with state, computed properties, and methods for extracts.\n */\nexport function withExtractsFeatures() {\n return signalStoreFeature(\n withState({ extracts: new Map<string, Extract[]>() }),\n\n withComputed(({ extracts }) => ({\n extractsCount: computed(() => extracts().size),\n })),\n\n withMethods((store) => ({\n /**\n * Updates the extracts for a given ID in the application store.\n *\n * @param id - The unique identifier for the extracts to be updated.\n * @param extracts - An array of Extract objects to be associated with the given ID.\n */\n updateExtracts(id: string, extracts: Extract[]) {\n patchState(store, (state) => {\n state.extracts.set(id, extracts);\n return { ...state };\n })\n },\n /**\n * Retrieves extracts from the store based on the provided ID.\n *\n * @param id - The unique identifier for the extracts to retrieve.\n * @returns The extracts associated with the given ID.\n */\n getExtracts(id: string) {\n return store.extracts().get(id);\n }\n }))\n )\n}\n","import { HttpClient, HttpParams } from \"@angular/common/http\";\r\nimport { Injectable, inject } from \"@angular/core\";\r\nimport { EMPTY, Observable, catchError } from \"rxjs\";\r\n\r\nimport { Principal, globalConfig } from \"@sinequa/atomic\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PrincipalService {\r\n protected readonly http = inject(HttpClient);\r\n\r\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\r\n\r\n /**\r\n * Retrieves the principal information from the server.\r\n *\r\n * @returns Observable<Principal> An observable that emits the principal information.\r\n *\r\n * @remarks\r\n * This method sends a GET request to the API endpoint to fetch the principal data.\r\n * It includes query parameters to specify the action and to indicate that no authentication is required.\r\n * In case of an error, it logs the error to the console and returns an empty observable.\r\n *\r\n * @example\r\n * ```typescript\r\n * principalService.getPrincipal().subscribe(principal => {\r\n * console.log(principal);\r\n * });\r\n * ```\r\n */\r\n getPrincipal(): Observable<Principal> {\r\n const params = new HttpParams().set(\"action\", \"get\");\r\n params.append(\"noAuthentication\", \"true\");\r\n\r\n return this.http.get<Principal>(this.API_URL + \"/principal\", { params })\r\n .pipe(\r\n catchError(error => {\r\n console.error(\"PrincipalService.getPrincipal failure - error: \", error);\r\n return EMPTY;\r\n })\r\n );\r\n }\r\n}","import { withDevtools } from \"@angular-architects/ngrx-toolkit\";\r\nimport { computed, inject } from \"@angular/core\";\r\nimport { patchState, signalStore, signalStoreFeature, withComputed, withMethods, withState } from \"@ngrx/signals\";\r\nimport { firstValueFrom, map } from \"rxjs\";\r\n\r\nimport { Principal, globalConfig } from \"@sinequa/atomic\";\r\n\r\nimport { PrincipalService } from \"../web-services/principal.service\";\r\n\r\nexport type PrincipalState = {\r\n principal: Principal;\r\n userOverrideActive: boolean;\r\n}\r\n\r\nexport const PrincipalStore = signalStore(\r\n { providedIn: 'root' },\r\n withDevtools('Principal'),\r\n\r\n withState({ principal: {}, userOverrideActive: false } as PrincipalState),\r\n withComputed(({ principal, userOverrideActive }) => ({\r\n allowUserOverride: computed(() => principal().isAdministrator && userOverrideActive() === false),\r\n isOverridingUser: computed(() => userOverrideActive() === true)\r\n })),\r\n\r\n withPrincipalFeatures(),\r\n);\r\n\r\n/**\r\n * Enhances the store with principal-related features.\r\n *\r\n * This function integrates state, methods, and computed properties related to the principal.\r\n *\r\n * @returns A feature that can be added to a signal store.\r\n *\r\n * @feature\r\n * - State:\r\n * - `principal`: An object representing the principal.\r\n * - `userOverrideActive`: A boolean indicating if user override is active.\r\n *\r\n * - Methods:\r\n * - `initialize()`: Initializes the principal state by fetching the principal data from the `PrincipalService`.\r\n *\r\n * - Computed Properties:\r\n * - `allowUserOverride`: A computed boolean indicating if user override is allowed based on the principal's administrator status and the `userOverrideActive` state.\r\n * - `isOverridingUser`: A computed boolean indicating if the user override is currently active.\r\n */\r\nexport function withPrincipalFeatures() {\r\n return signalStoreFeature(\r\n withMethods((store, principalService = inject(PrincipalService)) => ({\r\n /**\r\n * Initializes the principal store by fetching the principal data from the principal service.\r\n * It patches the store with the fetched principal data and a user override active flag from the global configuration.\r\n *\r\n * @returns A promise that resolves when the principal data has been fetched and the store has been patched.\r\n */\r\n initialize() {\r\n return firstValueFrom(\r\n principalService.getPrincipal()\r\n .pipe(\r\n map(principal => {\r\n const { userOverrideActive = false } = globalConfig;\r\n patchState(store, { principal, userOverrideActive })\r\n })\r\n )\r\n );\r\n }\r\n })),\r\n );\r\n}","import { Observable, Subject } from 'rxjs';\n\nexport class InlineWorker {\n private readonly worker: Worker;\n\n private onMessage = new Subject<MessageEvent>();\n private onError = new Subject<ErrorEvent>();\n\n constructor(func: () => void) {\n const WORKER_ENABLED = !!(Worker);\n\n if (WORKER_ENABLED) {\n const functionBody = func.toString().replace(/^[^{]*{\\s*/, '').replace(/\\s*}[^}]*$/, '');\n\n try {\n\n this.worker = new Worker(URL.createObjectURL(\n new Blob([functionBody], { type: 'text/javascript' })\n ));\n\n this.worker.onmessage = (data) => {\n this.onMessage.next(data);\n };\n\n this.worker.onerror = (data) => {\n this.onError.next(data);\n };\n } catch(e){\n throw new Error('WebWorker is not enabled');\n }\n\n } else {\n throw new Error('WebWorker is not enabled');\n }\n }\n\n postMessage(data: unknown) {\n this.worker.postMessage(data);\n }\n\n onmessage(): Observable<MessageEvent> {\n return this.onMessage.asObservable();\n }\n\n onerror(): Observable<ErrorEvent> {\n return this.onError.asObservable();\n }\n\n terminate() {\n if (this.worker) this.worker.terminate();\n }\n}","import { assertInInjectionContext, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { getQueryParamsFromUrl, Query } from '@sinequa/atomic';\n\nimport { QueryParamsStore } from '../stores';\n\n\n/**\n * Retrieves the query name from the current route.\n *\n * @remarks\n * This function must be used within an injection context.\n *\n * This function traverses the route tree recursively to find the query name.\n * It first checks for a query parameter `t` in the route's snapshot. If the query name is not found\n * in the route data, it attempts to find it in the child routes of the \"search\" route.\n * If the query name is still not found, it falls back to the `queryName` defined in the route's data.\n *\n * @returns {string | undefined} The query name if found, otherwise `undefined`.\n */\nexport function getQueryNameFromRoute(): string | undefined {\n assertInInjectionContext(getQueryNameFromRoute);\n\n const route = inject(ActivatedRoute);\n const routes = inject(Router)\n\n const recursive = (route: ActivatedRoute): string | undefined => {\n if (route?.firstChild) return recursive(route.firstChild);\n\n // Get query name from route data\n const { t } = route.snapshot.queryParams;\n // ! This is a workaround for the case where the queryName is not defined in the route data\n // \"search\" is the parent route of the search results, and \"t\" is the query parameter for the tab\n const { queryName } = routes.config.filter(p => p.path === \"search\")[0].children?.find(route => route.path === t)?.data || {};\n if (queryName) return queryName;\n\n // fallback to queryName from route data\n if (route?.snapshot.data['queryName']) return route.snapshot.data['queryName'];\n\n return undefined;\n }\n\n return recursive(route);\n}\n\n/**\n * Builds a query object based on the provided partial query.\n * If any properties are missing in the partial query, default values are used.\n *\n * @remarks\n * This function must be used within an injection context.\n *\n * @param query - The partial query object.\n * @returns The complete query object.\n */\nexport function buildQuery(query?: Partial<Query>): Query {\n assertInInjectionContext(buildQuery);\n\n const name = query?.name || getQueryNameFromRoute();\n const params = getQueryParamsFromUrl(window.location.toString());\n return ({\n ...params, // default values retrieved from the URL\n ...query, // override with query\n name, // override with query name\n } as Query)\n\n}\n","import { assertInInjectionContext, inject } from \"@angular/core\";\r\nimport { ActivatedRoute, Router } from \"@angular/router\";\r\n\r\n\r\n/**\r\n * Retrieves the current path from the Angular `ActivatedRoute` service.\r\n *\r\n * @returns {string | undefined} The current path as a string, or `undefined` if the path cannot be determined.\r\n */\r\nexport function getCurrentPath(): string | undefined {\r\n assertInInjectionContext(getCurrentPath);\r\n\r\n const route = inject(ActivatedRoute);\r\n\r\n return route?.snapshot.url.toString();\r\n}\r\n\r\n\r\n\r\n/**\r\n * Retrieves the current query name based on the current path and router configuration.\r\n *\r\n * This function asserts that it is being called within an injection context and then\r\n * uses Angular's dependency injection to get the router configuration. It matches the\r\n * current path against the router's configuration to find the corresponding query name.\r\n *\r\n * @returns {string | undefined} The name of the current query if found, otherwise undefined.\r\n */\r\nexport function getCurrentQueryName(): string | undefined {\r\n assertInInjectionContext(getCurrentQueryName);\r\n\r\n const routes = inject(Router).config;\r\n\r\n const path = getCurrentPath();\r\n\r\n return routes.find(r => r.path === 'search')?.children?.find(r => r.path === path)?.data?.['queryName'];\r\n}","import { ApplicationRef, effect, inject, runInInjectionContext } from \"@angular/core\";\n\nimport { applyThemeToNativeElement, ThemeStore } from \"../stores\";\n\nexport type ThemeBodyHookParameters = {\n scope: string;\n theme: string;\n};\n\nexport function withThemeBodyHook(\n app: ApplicationRef,\n params: ThemeBodyHookParameters | undefined\n): ApplicationRef {\n runInInjectionContext(\n app.injector,\n () => {\n const themeStore = inject(ThemeStore);\n const { scope, theme } = params || { scope: 'application', theme: 'Default' };\n\n themeStore.setCurrentTheme(scope, theme);\n\n applyThemeToNativeElement(window.document.body, themeStore.scopes()?.[scope]?.cssVars?.light);\n\n effect(() => {\n const bodyScope = themeStore.scopes()?.[scope];\n const vars = bodyScope.darkMode ? bodyScope.cssVars.dark : bodyScope.cssVars.light;\n\n if (vars) applyThemeToNativeElement(window.document.body, vars);\n })\n }\n );\n\n return app;\n}\n","import { ApplicationRef } from \"@angular/core\";\n\nimport { Theme, THEMES } from \"../resources\";\n\nexport function withThemes(app: ApplicationRef, themes: Theme[]): ApplicationRef {\n themes.forEach(theme => THEMES.push(theme));\n\n return app;\n}\n","import { effect, signal, Signal } from \"@angular/core\";\r\n\r\n/**\r\n * Creates a debounced signal that updates its value after a specified timeout.\r\n *\r\n * @template T - The type of the signal value.\r\n * @param Signal<T> input - The input signal whose value will be debounced.\r\n * @param number [timeOutMs=0] - The debounce timeout in milliseconds. Defaults to 0.\r\n * @returns Signal<T> - A new signal that updates its value after the specified debounce timeout.\r\n *\r\n * @example\r\n * ```ts\r\n * const input = signal('');\r\n * const debounced = debouncedSignal(input, 1000);\r\n *\r\n * contructor() {\r\n * effect(() => {\r\n * console.log(debounced());\r\n * // will log the input value after 1 second of inactivity.\r\n * });\r\n * }\r\n * ...\r\n * <input [ngModel]=\"input()\" (ngModelChange)=\"input.set($event)\">\r\n * ```\r\n */\r\nexport function debouncedSignal<T>(input: Signal<T>, timeOutMs = 0): Signal<T> {\r\n const debounceSignal = signal(input());\r\n let timeout: any;\r\n effect((onCleanUp) => {\r\n const value = input();\r\n clearTimeout(timeout);\r\n timeout = setTimeout(() => {\r\n debounceSignal.set(value);\r\n }, timeOutMs);\r\n onCleanUp(() => clearTimeout(timeout))\r\n });\r\n return debounceSignal;\r\n}","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { inject, Injector, runInInjectionContext } from '@angular/core';\nimport { getState, patchState, signalStore, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\n\nimport { addConcepts, LegacyFilter, Query, queryParamsFromUrl, SpellingCorrectionMode } from '@sinequa/atomic';\n\nimport { buildQuery } from '../utils';\n\nexport type QueryParamsState = Partial<Omit<Query, \"filters\">> & {\n path?: string;\n filters?: LegacyFilter[];\n id?: string;\n};\n\nexport const QueryParamsStore = signalStore(\n { providedIn: 'root' },\n withDevtools('QueryParams'),\n\n withQueryParamsFeatures()\n)\n\nexport function withQueryParamsFeatures() {\n return signalStoreFeature(\n withState({} as QueryParamsState),\n\n withMethods((store, injector = inject(Injector)) => ({\n /**\n * Sets the state from the given URL by extracting query parameters and updating the store.\n *\n * @param url - The URL containing query parameters to set the state from.\n *\n * The function performs the following steps:\n * 1. Extracts the path from the URL.\n * 2. Parses the query parameters from the URL.\n * 3. Decodes and parses the filters from the query parameters.\n * 4. Converts the page parameter to a number if it exists.\n * 5. Updates the store state with the extracted and parsed values.\n */\n setFromUrl(url: string) {\n const path = url.split('?')[0];\n\n const { q: text, f, id, p, s: sort, c, t: tab } = queryParamsFromUrl(url);\n const filters = f ? JSON.parse(decodeURIComponent(f)) : [];\n const spellingCorrectionMode = c as SpellingCorrectionMode;\n\n let page: number | undefined;\n if (p) {\n page = parseInt(p, 10);\n }\n\n patchState(store, (state: QueryParamsState) => {\n return { ...state, path, text, filters, id, page, sort, spellingCorrectionMode, tab };\n })\n },\n /**\n * Adds a filter to the store's state.\n *\n * @param filter - The filter to be added to the state.\n *\n * The function calls the `updateFilter` method to add the filter to the state.\n */\n addFilter(filter: LegacyFilter) {\n this.updateFilter(filter);\n },\n /**\n * Updates the filter in the store's state.\n *\n * @param filter - The filter to be updated. If the filter is `undefined`, the state remains unchanged.\n *\n * The function performs the following operations:\n * - Adds the filter to the state if it doesn't already exist and has values.\n * - Removes the filter if the 'between' operator is selected but no values are provided.\n * - Removes the filter if no values are selected and the operator is not 'between'.\n * - Updates the filter values if the filter already exists.\n *\n * @remarks\n * - If the filter is `undefined`, the state remains unchanged.\n * - If the filter's operator is 'between' and both `start` and `end` are `undefined`, the filter is removed.\n * - If the filter's operator is not 'between' and `filters`, `value`, and `values` are all `undefined`, the filter is removed.\n * - If the filter already exists, its values are updated.\n */\n updateFilter(filter: LegacyFilter) {\n patchState(store, (state) => {\n if (filter === undefined) return state;\n\n const allFilters = state.filters || [];\n\n const existing = allFilters.findIndex((f) => f.field === filter.field);\n\n // Add filter if it doesn't exist and has values\n if (existing === -1) {\n return ({ ...state, filters: [...allFilters || [], filter] });\n }\n\n if (existing >= 0) {\n\n // remove filter if between operator is selected but no values are selected\n if (filter.operator === 'between' && filter.start === undefined && filter.end === undefined) {\n return ({ ...state, filters: allFilters.filter(f => f.field !== filter.field) });\n }\n\n // Remove filter if no values are selected\n if (filter.operator !== 'between' && filter.filters === undefined && filter.value === undefined && filter.values === undefined) {\n return ({ ...state, filters: (allFilters || []).filter(f => f?.field !== filter.field) });\n }\n\n // Update filter values\n if (existing >= 0) {\n const filters = allFilters.toSpliced(existing, 1, filter);\n return ({ ...state, filters });\n }\n\n }\n\n return state;\n });\n },\n /**\n * Removes a filter from the store based on the specified field.\n *\n * @param field - The field of the filter to be removed.\n */\n removeFilter(field?: string) {\n if (!field) return;\n patchState(store, (state) => {\n const filters = state.filters?.filter(f => f.field !== field);\n return { ...state, filters };\n });\n },\n /**\n * Removes a filter from the state by its name.\n *\n * @param name - The name of the filter to be removed.\n */\n removeFilterByName(name?: string) {\n if (!name) return;\n patchState(store, (state) => {\n const filters = state.filters?.filter(f => f.name !== name);\n return { ...state, filters };\n });\n },\n /**\n * Clears all filters from the state.\n *\n * This method updates the state by setting the `filters` property to an empty array.\n * It uses the `patchState` function to apply the state change.\n */\n clearFilters() {\n patchState(store, (state) => {\n return { ...state, filters: [] };\n });\n },\n /**\n * Updates the current state with the provided query parameters.\n *\n * @param params - A partial object containing the query parameters to be updated.\n */\n patch(params: Partial<QueryParamsState>) {\n patchState(store, (state) => {\n return { ...state, ...params };\n });\n },\n /**\n * Retrieves a filter object based on the provided field or name.\n *\n * @param {string} fieldOrName - The field or name to search for in the filters.\n * @returns {Partial<LegacyFilter & {count: number}> | null} - The filter object with an additional count property, or null if not found.\n *\n * The method performs the following steps:\n * 1. Checks if the `fieldOrName` parameter is provided. If not, returns null.\n * 2. Searches for a filter with a matching field in the store's filters.\n * 3. If no filter is found by field, searches for a filter with a matching name.\n * 4. If a filter is found and has a `value` property, returns the filter with a count of 1.\n * 5. If a filter is found and does not have an array of filters, returns the filter with a count of 1.\n * 6. If a filter is found and has a `values` property, returns the filter with the count set to the length of the `values` array.\n * 7. If a filter is found and has an array of filters, returns the filter with the count set to the length of the `filters` array.\n * 8. If none of the above conditions are met, returns the filter with a count of 0.\n */\n getFilter(fieldOrName?: string): Partial<LegacyFilter & { count: number }> | null {\n if (!fieldOrName) return null;\n\n let filter = getState(store).filters?.find(f => f?.field === fieldOrName);\n // if not found, return checks for the filter name\n if (!filter) filter = getState(store).filters?.find(f => f?.name === fieldOrName);\n\n // if filter is found, return null\n if (!filter) return null;\n\n if (filter.operator && filter.operator === 'or') {\n const count = Array.isArray(filter.filters) ? filter.filters.length : 1;\n return ({ ...filter, count });\n }\n if (filter.operator && filter.operator === 'and') {\n return ({ ...filter, count: 1 });\n }\n\n if (filter && filter.value) return ({ ...filter, count: 1 });\n if (filter && filter.values) return ({ ...filter, count: filter.values.length });\n if (filter && Array.isArray(filter.filters) === false) return ({ ...filter, count: 1 });\n if (filter && Array.isArray(filter.filters)) return ({ ...filter, count: filter.filters.length });\n\n return ({ ...filter, count: 0 });\n },\n /**\n * Constructs and returns a query object based on the current state of the store.\n *\n * This method retrieves various parameters from the store's state, such as filters, sort order, tab, query text, query name, and spelling correction mode.\n * It processes the filters to separate out \"concepts\" filters and incorporates them into the query text.\n * The remaining filters are combined appropriately.\n * Finally, it builds and returns the query object using the processed parameters.\n *\n * @returns Query The constructed query object.\n */\n getQuery() {\n const { filters: allFilters = [], sort, tab, text: queryText = '', name, spellingCorrectionMode } = getState(store);\n let text = queryText;\n\n // remove concepts filters from the query to add them in the query expression\n const [conceptsFilters] = allFilters.filter(f => f.field === \"concepts\");\n if (conceptsFilters) {\n const concepts = conceptsFilters.filters ? (conceptsFilters.filters as LegacyFilter[]).map(f => f.value) as string[] : [conceptsFilters.value] as string[];\n text = addConcepts(queryText, concepts);\n }\n\n const filters = allFilters.filter(f => f.field !== \"concepts\");\n const f = filters.length > 1\n ? { operator: \"and\", filters } as LegacyFilter\n : filters[0] as LegacyFilter;\n\n const query = runInInjectionContext(injector, () => buildQuery({ filters: f, name, sort, spellingCorrectionMode, tab, text }));\n return query;\n }\n }))\n );\n}","import { withDevtools } from \"@angular-architects/ngrx-toolkit\";\nimport { patchState, signalStore, signalStoreFeature, withMethods, withState } from \"@ngrx/signals\";\n\nimport { Article, CustomHighlights } from \"@sinequa/atomic\";\n\nexport type PreviewHighlights = {\n highlights: CustomHighlights[];\n snippetId?: number;\n};\n\nexport type SelectionState = {\n article: Article;\n id: string;\n queryText: string;\n previewHighlights: PreviewHighlights;\n};\n\n/**\n * @constant\n * @name SelectionStore\n * @description\n * A store that manages the selection state of articles. It is provided in the root of the application and includes\n * development tools for easier debugging. The store maintains the state with the following properties:\n * - `article`: The selected article.\n * - `id`: The ID of the selected article.\n * - `queryText`: The query text associated with the selection.\n *\n * @methods\n * - `update(article: Article, queryText?: string)`: Updates the store with a new article and optional query text.\n * - `updateQueryText(queryText: string)`: Updates the query text in the store.\n * - `clear()`: Clears the selection state, setting `article`, `id`, and `queryText` to `undefined`.\n */\nexport const SelectionStore = signalStore(\n { providedIn: 'root' },\n withDevtools('Selection'),\n\n withSelectionFeatures()\n);\n\nexport function withSelectionFeatures() {\n return signalStoreFeature(\n withState({} as SelectionState),\n\n withMethods((store) => ({\n /**\n * Updates the state with the provided article and optional query text.\n *\n * @param article - The article object to update the state with.\n * @param queryText - Optional query text to update the state with.\n */\n update(newState: Partial<SelectionState>) {\n patchState(store, (state) => {\n return { ...state, ...newState };\n });\n },\n /**\n * Clears the current selection state by setting the `article`, `id`, and `queryText` properties to `undefined`.\n *\n * @remarks\n * This method uses the `patchState` function to update the state of the store.\n */\n clear() {\n patchState(store, () => {\n return ({ article: undefined, id: undefined, queryText: undefined, previewHighlights: undefined });\n });\n }\n }))\n );\n}","import { withDevtools } from \"@angular-architects/ngrx-toolkit\";\nimport { patchState, signalStore, signalStoreFeature, withMethods, withState } from \"@ngrx/signals\";\n\nimport { THEMES } from \"../resources\";\n\nexport type CssVars = {\n light?: Record<string, string>;\n dark?: Record<string, string>;\n};\n\nexport type ThemeScope = {\n [key: string]: {\n cssVars: CssVars;\n darkMode?: boolean;\n themeName: string;\n };\n};\n\nexport type ThemeStoreState = {\n scopes: ThemeScope;\n};\n\nexport const ThemeStore = signalStore(\n { providedIn: 'root' },\n withDevtools('Theme'),\n\n withThemesFeatures()\n);\n\nexport function withThemesFeatures() {\n return signalStoreFeature(\n withState({ scopes: {} } as ThemeStoreState),\n\n withMethods((store) => ({\n loadDefaultTheme(scope: string, darkMode?: boolean): void {\n this.setCurrentTheme(scope, 'Default', darkMode);\n },\n\n /**\n * Sets the current theme for a given scope.\n *\n * @param {string} scope - The scope for which the theme is being set.\n * @param {string} themeName - The name of the theme to be applied.\n * @param {boolean} [darkMode] - Optional. Specifies whether dark mode should be enabled. If not provided, it defaults to the current scope's dark mode setting or false.\n * @returns {void}\n */\n setCurrentTheme(scope: string, themeName: string, darkMode?: boolean): void {\n const cssVars = processCssVars(themeName);\n const currentScope = store.scopes()[scope];\n\n patchState(store, (\n state => ({\n ...state,\n scopes: {\n ...store.scopes(),\n [scope]: {\n cssVars,\n darkMode: darkMode ?? currentScope?.darkMode ?? false,\n themeName: themeName\n }\n }\n })\n ));\n },\n\n /**\n * Sets the dark mode preference for a given scope.\n *\n * @param scope - The scope for which to set the dark mode preference.\n * @param darkMode - A boolean indicating whether dark mode should be enabled (true) or disabled (false).\n *\n * This function updates the state by patching it with the new dark mode setting for the specified scope.\n * It retains the existing CSS variables and theme name for the scope.\n */\n setDarkMode(scope: string, darkMode: boolean): void {\n const currentScope = store.scopes()[scope];\n\n patchState(store, (\n state => ({\n ...state,\n scopes: {\n ...store.scopes(),\n [scope]: {\n cssVars: currentScope?.cssVars ?? {},\n darkMode,\n themeName: currentScope?.themeName\n }\n }\n })\n ));\n },\n }))\n );\n}\n\n/**\n * Processes the CSS variables for a given theme name.\n *\n * @param themeName - The name of the theme to process.\n * @returns An object containing the CSS variables for both light and dark themes.\n * @throws Will throw an error if the theme with the specified name is not found.\n */\nexport function processCssVars(themeName: string): CssVars {\n const theme = THEMES.find(theme => theme.name === themeName);\n\n if (!theme) throw new Error(`Theme \"${themeName}\" not found`);\n\n const cssVars = {\n light: themeColorsToCssVariables(theme!.colors),\n dark: themeColorsToCssVariables(theme!.colorsDark)\n };\n\n return cssVars;\n}\n\n/**\n * Converts an object of theme colors to CSS variables.\n *\n * @param colors - An object where keys are theme color names and values are the corresponding color values.\n * @returns An object where keys are CSS variable names and values are the corresponding color values.\n */\nexport function themeColorsToCssVariables(colors: any): any {\n const cssVars = colors\n ? Object.fromEntries(\n Object.entries(colors).map(([name, value]) => {\n if (value === undefined) return []\n const cssName = themeColorNameToCssVariable(name)\n return [cssName, value]\n }))\n : {};\n\n return cssVars;\n}\n\n/**\n * Converts a camelCase theme color name to a CSS variable format.\n *\n * This function takes a camelCase string and transforms it into a CSS variable\n * name by inserting hyphens between lowercase and uppercase letters and converting\n * the entire string to lowercase.\n *\n * @param name - The camelCase theme color name to be converted.\n * @returns The corresponding CSS variable name in kebab-case.\n */\nexport function themeColorNameToCssVariable(name: string): string {\n return `--${name.replace(/([a-z])([A-Z])/g, \"$1-$2\").toLowerCase()}`;\n}\n\n/**\n * Applies a set of CSS variables to a given HTML element.\n *\n * @param element - The HTML element to which the CSS variables will be applied.\n * @param cssVars - An optional record of CSS variable names and their corresponding values.\n */\nexport function applyThemeToNativeElement(element: HTMLElement, cssVars?: Record<string, string>): void {\n if (!cssVars) return;\n\n Object.keys(cssVars).forEach((key) =>\n element.style.setProperty(key, cssVars[key])\n );\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { patchState, signalStore, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\n\nimport { Article, AuditEvents, deleteUserSettings, fetchUserSettings, patchUserSettings, QueryParams } from '@sinequa/atomic';\n\nimport { Basket, RecentSearch, UserSettings } from '../models/user-settings';\n\nexport type UserSettingsState = UserSettings;\n\nexport const UserSettingsStore = signalStore(\n { providedIn: 'root' },\n withDevtools('UserSettings'),\n\n withBookmarkFeatures(),\n withRecentSearchFeatures(),\n withSavedSearchFeatures(),\n withBasketsFeatures(),\n withAssistantFeatures(),\n withUserSettingsFeatures(),\n)\n\nexport function withUserSettingsFeatures() {\n return signalStoreFeature(\n withState({ language: undefined } as UserSettings),\n\n withMethods((store) => ({\n /**\n * Initializes the user settings store by fetching the user settings from the backend API\n * and patching the store with the retrieved settings.\n *\n * @returns {Promise<void>} A promise that resolves when the initialization is complete.\n */\n async initialize(): Promise<void> {\n // Fetch the user settings from the backend API and patch the store with the result\n const settings = await fetchUserSettings<UserSettings>();\n patchState(store, settings);\n },\n /**\n * Resets the user settings to the initial state.\n *\n * This method performs the following actions:\n * 1. Deletes the current user settings.\n * 2. Patches the state with the initial state.\n *\n * @returns {Promise<void>} A promise that resolves when the reset operation is complete.\n */\n async reset(): Promise<void> {\n // Reset the user settings to the initial state\n await deleteUserSettings();\n patchState(store, {\n bookmarks: [],\n recentSearches: [],\n savedSearches: [],\n baskets: [],\n assistants: {},\n language: undefined,\n } as UserSettings);\n },\n })),\n )\n}\n\nexport function withBookmarkFeatures() {\n return signalStoreFeature(\n withState({ bookmarks: [] as UserSettings['bookmarks'] }),\n\n withMethods((store) => ({\n /**\n * Updates the user's bookmarks in the store and optionally logs audit events.\n *\n * @param bookmarks - An array of bookmarks to update in the user settings.\n * @param auditEvents - Optional audit events to log during the update.\n * @returns A promise that resolves when the update is complete.\n */\n async updateBookmarks(bookmarks: UserSettings['bookmarks'], auditEvents?: AuditEvents) {\n await patchUserSettings({ bookmarks }, auditEvents);\n patchState(store, (state) => {\n return { ...state, bookmarks: [...bookmarks] };\n })\n },\n /**\n * Adds an article to the bookmarks if it is not already bookmarked.\n *\n * @param article - The article to be bookmarked.\n * @param queryName - Optional name of the query associated with the bookmark.\n * @returns A promise that resolves when the bookmark has been added.\n */\n async bookmark(article: Article, queryName?: string) {\n if (!article.id) return;\n\n if (this.isBookmarked(article)) return;\n\n const bookmark = {\n id: article.id,\n label: article.title,\n source: article.collection[0],\n author: article.authors?.[0],\n queryName,\n };\n await this.updateBookmarks([...store.bookmarks(), bookmark], {\n type: \"Basket_AddDoc\",\n detail: {\n docid: article.id\n }\n });\n },\n /**\n * Removes a bookmark by its ID.\n *\n * @param id - The ID of the bookmark to remove.\n * @returns A promise that resolves when the bookmark has been removed and the bookmarks have been updated.\n *\n * @remarks\n * - If the provided ID is falsy, the function will return immediately.\n * - If the bookmark with the given ID is not found, the function will return immediately.\n * - The function updates the bookmarks and logs the removal action with a type of \"Basket_RemoveDoc\".\n */\n async unbookmark(id: string) {\n if (!id) return;\n\n const bookmarks = store.bookmarks();\n const index = bookmarks?.findIndex((bookmark) => bookmark.id === id);\n\n if (index === -1) return;\n\n bookmarks.splice(index, 1);\n await this.updateBookmarks([...bookmarks], {\n type: \"Basket_RemoveDoc\",\n detail: {\n docid: id\n }\n });\n },\n /**\n * Checks if the given article is bookmarked.\n *\n * @param article - An optional partial article object to check.\n * @returns `true` if the article is bookmarked, `false` otherwise.\n */\n isBookmarked(article: Partial<Article>): boolean {\n if (!article || !article.id) return false;\n const bookmarks = store.bookmarks();\n\n return !!bookmarks?.find((bookmark) => bookmark.id === article.id);\n },\n /**\n * Toggles the bookmark status of a given article.\n *\n * This method checks if the article is currently bookmarked. If it is,\n * it removes the bookmark. If it is not, it adds a bookmark.\n *\n * @param article - The article to toggle the bookmark status for.\n * @returns A promise that resolves when the bookmark status has been toggled.\n */\n async toggleBookmark(article: Article) {\n const isBookmarked = await this.isBookmarked(article);\n\n if (isBookmarked)\n this.unbookmark(article.id);\n else\n this.bookmark(article);\n },\n }))\n )\n}\n\nexport function withRecentSearchFeatures() {\n return signalStoreFeature(\n withState({ recentSearches: [] as UserSettings['recentSearches'] }),\n\n withMethods((store) => ({\n /**\n * Deletes a recent search entry from the user's recent searches list.\n *\n * @param {number} index - The index of the recent search to delete.\n * @returns {Promise<void>} A promise that resolves when the recent search has been deleted and the state has been updated.\n */\n async deleteRecentSearch(index: number) {\n const recentSearches = store.recentSearches();\n if (recentSearches) {\n const recentSearchToDelete = recentSearches.splice(index, 1)[0];\n await patchUserSettings({ recentSearches }, {\n type: \"RecentQuery_Delete\",\n detail: {\n recentQuery: recentSearchToDelete.queryParams?.text\n }\n });\n\n patchState(store, (state) => {\n return { ...state, recentSearches: [...recentSearches] };\n })\n }\n },\n /**\n * Updates the recent searches in the user settings.\n *\n * @param recentSearches - An array of recent searches to be updated in the user settings.\n * @param auditEvents - Optional audit events to be logged during the update.\n * @returns A promise that resolves when the recent searches have been updated.\n */\n async updateRecentSearches(recentSearches: UserSettings['recentSearches'], auditEvents?: AuditEvents) {\n await patchUserSettings({ recentSearches }, auditEvents);\n patchState(store, (state) => {\n return { ...state, recentSearches: [...recentSearches] };\n })\n },\n /**\n * Adds the current search to the recent searches list.\n *\n * This method checks if a search with the same label already exists in the recent searches.\n * If it does, it updates the existing search with the new query parameters and date.\n * If it does not, it adds a new search to the recent searches list.\n *\n * @param queryParams - The parameters of the current search.\n * @returns A promise that resolves when the recent searches have been updated.\n */\n async addCurrentSearch(queryParams: QueryParams) {\n // fist search if the search is already in the recent searches with the same label\n const recentSearches = store.recentSearches();\n const existingSearch = recentSearches.find((search) => search.label === queryParams.text);\n\n const url = window.location.hash.substring(1);\n const path = url.split('?')[0];\n if (existingSearch) {\n await this.updateRecentSearches([\n {\n ...existingSearch,\n date: new Date().toISOString(),\n url,\n path,\n queryParams,\n filterCount: queryParams.filters?.length\n },\n ...recentSearches.filter((search) => search.label !== queryParams.text),\n ], {\n type: \"RecentQuery_Update\",\n detail: {\n recentQuery: queryParams.text\n }\n });\n }\n else {\n const recentSearch = {\n url,\n path,\n display: queryParams.text,\n label: queryParams.text,\n filterCount: queryParams.filters?.length,\n date: new Date().toISOString(),\n queryParams\n } as RecentSearch;\n\n await this.updateRecentSearches([recentSearch, ...store.recentSearches()], {\n type: \"RecentQuery_Add\",\n detail: {\n recentQuery: queryParams.text\n }\n });\n }\n },\n }))\n )\n}\n\nexport function withSavedSearchFeatures() {\n return signalStoreFeature(\n withState({ savedSearches: [] as UserSettings['savedSearches'] }),\n\n withMethods((store) => ({\n async deleteSavedSearch(index: number) {\n const savedSearches = store.savedSearches();\n if (savedSearches) {\n const savedSearchToDelete = savedSearches.splice(index, 1)[0];\n await patchUserSettings({ savedSearches }, {\n type: \"SavedQuery_Delete\",\n detail: {\n savedQuery: savedSearchToDelete.display\n }\n });\n\n patchState(store, (state) => {\n return { ...state, savedSearches: [...savedSearches] };\n })\n }\n },\n async updateSavedSearches(savedSearches: UserSettings['savedSearches']) {\n await patchUserSettings({ savedSearches }, {\n type: \"SavedQuery_Add\",\n detail: {\n savedQuery: savedSearches[0].display\n }\n });\n patchState(store, (state) => {\n return { ...state, savedSearches: [...savedSearches] };\n })\n },\n }))\n )\n}\n\nfunction basketIndex(name: string, baskets?: Basket[]): number {\n if (baskets?.length) {\n for (let i = 0, ic = baskets.length; i < ic; i++) {\n const basket = baskets[i];\n if (basket && basket.name === name) {\n return i;\n }\n }\n }\n return -1;\n}\n\nexport function withBasketsFeatures() {\n return signalStoreFeature(\n withState({ baskets: [] as UserSettings['baskets'] }),\n withMethods((store) => ({\n async deleteBasket(index: number) {\n const baskets = store.baskets();\n if (baskets) {\n const basketToDelete = baskets.splice(index, 1)[0];\n await patchUserSettings({ baskets }, {\n type: \"Basket_Delete\",\n detail: {\n savedQuery: basketToDelete.name\n }\n });\n patchState(store, (state) => {\n return { ...state, baskets: [...baskets] };\n })\n }\n },\n async createBasket(basket: Basket) {\n const baskets = store.baskets();\n if (basketIndex(basket.name) >= 0) return;\n baskets.unshift(basket);\n await patchUserSettings({ baskets }, {\n type: \"Basket_Add\",\n detail: {\n basket: basket.name\n }\n });\n patchState(store, (state) => {\n return { ...state, baskets: [...baskets] };\n })\n },\n async updateBaskets(baskets: UserSettings['baskets']) {\n await patchUserSettings({ baskets }, {\n type: \"Basket_Update\"\n });\n patchState(store, (state) => {\n return { ...state, baskets: [...baskets] };\n })\n },\n async updateBasket(basket: Basket, index: number) {\n const baskets = store.baskets();\n const prevIndex = basketIndex(basket.name, baskets);\n if ((prevIndex !== -1 && index !== prevIndex) // A basket with the same name exists at a different index\n || index < 0 || index >= baskets.length) // index out of bounds\n return;\n\n baskets.splice(index, 1, basket);\n\n await patchUserSettings({ baskets }, {\n type: \"Basket_Update\",\n detail: {\n basket: basket.name\n }\n });\n patchState(store, (state) => {\n return { ...state, baskets: [...baskets] };\n })\n },\n async addToBasket(name: string, ids: string | string[]) {\n const baskets = store.baskets();\n const basket = baskets.find(b => b.name === name);\n if (!ids || !basket) return;\n\n if (!basket.ids) basket.ids = [];\n\n ids = Array.isArray(ids)? ids : [ids];\n for (let id of ids) {\n if (!basket.ids.some(i => i === id)) {\n basket.ids.push(id);\n }\n }\n\n await patchUserSettings({ baskets }, {\n type: \"Basket_AddDoc\",\n detail: {\n basket: basket.name,\n docid: ids[0]\n }\n });\n patchState(store, (state) => {\n return { ...state, baskets: [...baskets] };\n })\n },\n async removeFromBasket(name: string, ids: string | string[]) {\n const baskets = store.baskets();\n const basket = baskets.find(b => b.name === name);\n if (!ids || !basket) return;\n\n if (!basket.ids) basket.ids = [];\n\n ids = Array.isArray(ids)? ids : [ids];\n for (let id of ids) {\n if (!basket.ids.some(i => i === id)) {\n basket.ids.push(id);\n }\n }\n\n await patchUserSettings({ baskets }, {\n type: \"Basket_AddDoc\",\n detail: {\n basket: basket.name,\n docid: ids[0]\n }\n });\n patchState(store, (state) => {\n return { ...state, baskets: [...baskets] };\n })\n },\n }))\n )\n}\n\nexport function withAssistantFeatures() {\n return signalStoreFeature(\n withState({ assistants: {} as UserSettings['assistants'] }),\n withMethods((store) => ({\n async updateAssistantSettings(assistantSettings: UserSettings['assistants']) {\n patchState(store, (state) => {\n return { ...state, assistants: assistantSettings };\n })\n },\n\n async updateLanguage(language: UserSettings['language'], auditEvents?: AuditEvents) {\n await patchUserSettings({ language }, auditEvents);\n patchState(store, (state) => {\n return { ...state, language };\n })\n },\n }))\n )\n}","import { Component, computed, effect, inject, input, model } from '@angular/core';\n\nimport { NgStyle } from '@angular/common';\nimport { Theme, THEMES } from '../../resources';\nimport { ThemeStore } from '../../stores';\nimport { MenuComponent } from '../menu';\n\n@Component({\n selector: 'theme-selector',\n standalone: true,\n imports: [MenuComponent, NgStyle],\n template: `\n <sq-menu>\n <ng-content></ng-content>\n \n <div menu-content>\n <ul class=\"p-2 flex flex-col gap-1 divide-y\">\n @for (theme of themes(); track $index) {\n <li class=\"p-2\" (click)=\"selectTheme(theme)\">\n <div class=\"flex gap-2 items-baseline\">\n <span class=\"size-3 rounded-full\" [ngStyle]=\"{ 'background-color': 'hsl(' + theme.colors.primary + ')' }\" aria-hidden=\"true\"></span>\n <span>{{ theme.name }}</span>\n </div>\n </li>\n }\n </ul>\n </div>\n </sq-menu>\n `,\n styles: ``\n})\nexport class ThemeSelectorComponent {\n readonly scope = input.required<string>();\n readonly showPrivate = input<boolean>(false);\n\n readonly themes = computed(() => THEMES.filter(theme => this.showPrivate() ? true : !theme.private));\n readonly selectedTheme = model<string | undefined>();\n readonly themeStore = inject(ThemeStore);\n\n constructor() {\n effect(() => {\n const currentTheme = this.themeStore.scopes()[this.scope()];\n\n if (!currentTheme) return;\n\n this.selectedTheme.set(this.themeStore.scopes()[this.scope()].themeName);\n }, { allowSignalWrites: true });\n }\n\n public selectTheme(theme: string): void;\n public selectTheme(theme: Theme): void;\n public selectTheme(theme: Theme | string): void {\n if (typeof theme !== 'string')\n theme = theme.name;\n\n this.themeStore.setCurrentTheme(this.scope(), theme);\n }\n}\n","import { Component, effect, inject, input, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { ThemeStore } from '../../stores';\n\n@Component({\n selector: 'theme-toggle',\n standalone: true,\n imports: [FormsModule],\n template: `\n <label class=\"flex gap-2 items-center select-none cursor-pointer\">\n @if (darkMode()) {\n <i class=\"fa-fw far fa-toggle-large-on text-primary\"></i>\n } \n @else {\n <i class=\"fa-fw far fa-toggle-large-on fa-flip-horizontal\"></i>\n }\n \n <span>Dark mode</span>\n\n <input\n type=\"checkbox\"\n class=\"hidden\"\n [(ngModel)]=\"darkMode\"\n (ngModelChange)=\"toggleDarkMode($event)\"\n />\n </label>\n `,\n styles: ``\n})\nexport class ThemeToggleComponent {\n readonly scope = input.required<string>();\n\n readonly darkMode = model<boolean>();\n\n private readonly themeStore = inject(ThemeStore);\n\n constructor() {\n effect(() => {\n const currentTheme = this.themeStore.scopes()[this.scope()];\n\n if (!currentTheme) return;\n\n this.darkMode.set(currentTheme.darkMode ?? false);\n }, { allowSignalWrites: true });\n }\n\n public toggleDarkMode(status: boolean): void {\n const scope = this.themeStore.scopes()?.[this.scope()];\n\n if (!scope || !scope.cssVars) return;\n\n this.themeStore.setDarkMode(this.scope(), status);\n }\n}\n","import { afterNextRender, Directive, ElementRef, input, OnDestroy, output } from '@angular/core';\r\n\r\n/**\r\n * Represents a directive that enables infinite scrolling behavior.\r\n * This directive listens for the intersection of the element with the viewport\r\n * and emits a `loadMore` event when the element becomes visible.\r\n *\r\n * @remarks\r\n * This directive requires the `IntersectionObserver` API to be available in the browser.\r\n *\r\n * @example\r\n * ```html\r\n * <div infinityScroll (onScroll)=\"loadMore()\">\r\n * <!-- Content to be scrolled -->\r\n * </div>\r\n * ```\r\n *\r\n */\r\n@Directive({\r\n // eslint-disable-next-line @angular-eslint/directive-selector\r\n selector: '[infinity-scroll]',\r\n standalone: true\r\n})\r\nexport class InfinityScrollDirective implements OnDestroy {\r\n options = input({ root: null });\r\n onScroll = output();\r\n\r\n private observer= new IntersectionObserver(([entry]) => {\r\n if (entry.isIntersecting) {\r\n this.onScroll.emit();\r\n }\r\n }, this.options());\r\n\r\n constructor(private el: ElementRef) {\r\n afterNextRender(() => {\r\n this.observer.observe(this.el.nativeElement);\r\n })\r\n }\r\n\r\n ngOnDestroy() {\r\n this.observer.disconnect();\r\n }\r\n\r\n}","import { Location } from '@angular/common';\nimport { Injectable, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\n\nimport { Article } from '@sinequa/atomic';\n\nimport { SelectionStore } from '../stores/selection.store';\nimport { QueryParamsStore } from '../stores/query-params.store';\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SelectionService {\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n private readonly location = inject(Location);\n private readonly selectionStore = inject(SelectionStore);\n queryParamsStore = inject(QueryParamsStore);\n\n /**\n * Sets the current article in the selection store and optionally updates the query text.\n * If the provided article is undefined, it clears the current article.\n *\n * @param article - The article to set as the current article. If undefined, the current article is cleared.\n * @param withQueryText - A boolean indicating whether to update the query text in the selection store. Defaults to true.\n *\n * @returns void\n */\n public setCurrentArticle(article?: Article, withQueryText: boolean = true): void {\n if (!article) {\n this.clearCurrentArticle();\n return;\n }\n\n // update selection store with article and query text\n const { text } = getState(this.queryParamsStore);\n this.selectionStore.update({article, id: article.id, queryText: withQueryText ? text : undefined });\n\n if (article?.id)\n this.updateArticleIdInQueryParams(article.id);\n }\n\n /**\n * Clears the current article selection from the selection store and\n * removes the article ID from the query parameters.\n *\n * @remarks\n * This method performs two main actions:\n * 1. Clears the current selection from the `selectionStore`.\n * 2. Removes the article ID from the query parameters to ensure\n * the URL does not reference the cleared article.\n *\n * @public\n */\n public clearCurrentArticle(): void {\n this.selectionStore.clear();\n\n this.clearArticleIdFromQueryParams();\n }\n\n /**\n * Updates the article ID in the query parameters of the current route.\n * If the provided ID is undefined, it will remove the ID from the query parameters.\n *\n * @param id - The article ID to be set in the query parameters. If undefined, the ID will be removed.\n */\n private updateArticleIdInQueryParams(id?: string): void {\n const url = this.router\n .createUrlTree([], { relativeTo: this.route, queryParams: { id }, queryParamsHandling: 'merge' })\n .toString();\n this.location.replaceState(url);\n }\n\n /**\n * Clears the 'id' parameter from the current route's query parameters.\n *\n * This method creates a copy of the current query parameters, removes the 'id' parameter,\n * and then updates the browser's URL to reflect the change without reloading the page.\n *\n * @private\n */\n private clearArticleIdFromQueryParams(): void {\n const queryParams = Object.assign({}, this.route.snapshot.queryParams);\n\n delete queryParams['id'];\n\n const url = this.router.createUrlTree([], { relativeTo: this.route, queryParams }).toString();\n\n this.location.replaceState(url);\n }\n}\n","import { EventEmitter, Injectable, effect, inject } from '@angular/core';\nimport { getState } from '@ngrx/signals';\n\nimport { Article } from '@sinequa/atomic';\n\nimport { SelectionStore } from '../stores';\nimport { SelectionService } from './selection.service';\n\n// back is used when the user close the current selection and want to go back to the previous one\n// new is used when the user select a new article\nexport type SelectionHistoryEvent = 'back' | 'new';\n\n/*\n * The `SelectionHistoryService` class is responsible for managing the selection history.\n *\n * It keeps track of the history of selected articles and provides methods to navigate through the history.\n * The service also emits events when the selection history changes.\n * This service is used by the Drawer\n */\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SelectionHistoryService {\n public readonly selectionHistoryEvent = new EventEmitter<SelectionHistoryEvent>();\n\n private readonly selectionService = inject(SelectionService);\n private readonly selectionStore = inject(SelectionStore);\n\n private readonly history: Article[] = [];\n\n constructor() {\n effect(() => {\n const { article } = getState(this.selectionStore);\n\n if (!!article && article !== this.history[this.history.length - 1]) {\n this.history.push(article);\n this.selectionHistoryEvent.next('new');\n }\n })\n }\n\n /**\n * Retrieves the index of the current selection.\n *\n * @returns {number} The index of the current selection, which is the last element in the history array.\n */\n public getCurrentSelectionIndex(): number {\n return this.history.length - 1;\n }\n\n /**\n * Retrieves an article from the selection history at the specified index.\n *\n * @param index - The index of the article to retrieve.\n * @returns The article at the specified index, or `undefined` if the index is out of bounds.\n */\n public getSelection(index: number): Article | undefined {\n if (index < 0 || index >= this.history.length) return undefined;\n\n return this.history[index];\n }\n\n /**\n * Retrieves the length of the history array.\n *\n * @returns {number} The number of entries in the history.\n */\n public getHistoryLength(): number {\n return this.history.length;\n }\n\n /**\n * Clears the selection history and resets the current article selection.\n *\n * This method performs the following actions:\n * - Empties the history array.\n * - Calls the `clearCurrentArticle` method on the `selectionService` to reset the current article selection.\n */\n public clearHistory(): void {\n this.history.length = 0;\n this.selectionService.clearCurrentArticle();\n }\n\n /**\n * Navigates back in the selection history.\n *\n * Removes the most recent entry from the history. If the history is empty after this operation,\n * it returns `undefined`. Otherwise, it sets the current article to the last entry in the history,\n * triggers a 'back' event, and returns the last entry.\n *\n * @returns {Article | undefined} The last article in the history, or `undefined` if the history is empty.\n */\n public back(): Article | undefined {\n this.history.pop();\n\n if (this.history.length === 0) return undefined;\n\n const last = this.history[this.history.length - 1];\n\n this.selectionService.setCurrentArticle(last);\n this.selectionHistoryEvent.next('back');\n\n return last;\n }\n}\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable, computed, inject } from \"@angular/core\";\r\nimport { Router } from \"@angular/router\";\r\nimport { getState } from \"@ngrx/signals\";\r\nimport { Article, AuditEvent, AuditEvents, AuditEventType, AuditEventTypeValues, CCApp, globalConfig, Result } from \"@sinequa/atomic\";\r\nimport { AppStore } from '../stores/app.store';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AuditService {\r\n appStore = inject(AppStore);\r\n app = computed(() => getState(this.appStore) as CCApp);\r\n\r\n protected readonly http = inject(HttpClient);\r\n protected readonly router = inject(Router);\r\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\r\n\r\n protected lastClickTime = 0;\r\n\r\n /**\r\n * Notify the Sinequa server of a set of audit events\r\n *\r\n * @param auditEvents The audit events\r\n */\r\n notify(auditEvents: AuditEvents) {\r\n this.http.post<void>(this.API_URL + \"/audit.notify\", {\r\n event: \"None\", // AuditEventType.None,\r\n app: this.app().name,\r\n $auditRecord: {auditEvents: [auditEvents]}\r\n }).subscribe();\r\n }\r\n\r\n /**\r\n * It sends an audit event to the Audit Service.\r\n */\r\n notifyLogin() {\r\n this.notify({\r\n type: \"Login_Success_Form\" // AuditEventType.Search_Login_Success\r\n })\r\n }\r\n\r\n /**\r\n * Notify logout\r\n */\r\n notifyLogout() {\r\n this.notify({\r\n type: \"Search_Exit_Logout\" // AuditEventType.Search_Exit_Logout\r\n });\r\n }\r\n\r\n /**\r\n * Notify the Sinequa server of a document event\r\n *\r\n * @param evt The audit event type\r\n * @param doc The document (article) in question\r\n * @param resultId The resultid that contain the document\r\n * @param parameters Additional parameters\r\n */\r\n notifyDocument(\r\n auditEventType: AuditEventType | AuditEventTypeValues | {} & Record<never, never>,\r\n doc: Article,\r\n resultsOrId: Result | string,\r\n parameters?: Record<string, string | number | boolean | undefined>,\r\n rfmParameters?: Record<string, string | number | boolean | undefined>) {\r\n let resultId: string | null;\r\n let result: Result | undefined;\r\n if (typeof resultsOrId == \"string\") {\r\n resultId = resultsOrId;\r\n }\r\n else {\r\n result = resultsOrId;\r\n resultId = result ? result.id : null;\r\n }\r\n\r\n const detail: any = {\r\n docid: doc.id,\r\n rank: doc.rank,\r\n title: doc.title,\r\n source: doc.collection[0].split(\"/\")[0],\r\n collection: doc.collection[0],\r\n resultId,\r\n filename: doc.filename,\r\n fileext: doc.fileext,\r\n index: doc.databasealias,\r\n resultcount: result?.totalRowCount\r\n };\r\n\r\n if (parameters) {\r\n Object.keys(parameters).forEach(key => detail[key] = parameters[key]);\r\n }\r\n const data: AuditEvent = {\r\n type: auditEventType,\r\n detail\r\n };\r\n\r\n if (rfmParameters) {\r\n const rfmDetail: Record<string, string | number | boolean | undefined> = {}; // Add index signature\r\n Object.keys(rfmParameters).forEach(key => rfmDetail[key] = rfmParameters[key]);\r\n data.rfmDetail = rfmDetail;\r\n }\r\n\r\n this.lastClickTime = Date.now();\r\n\r\n // Listen to the navigation event outside the app\r\n document.addEventListener('visibilitychange', () => {\r\n // Capture the navigation even triggered just after the click\r\n if (document.visibilityState === 'hidden' && (Date.now() - this.lastClickTime) < 1000) {\r\n // Second event triggered when we come back\r\n document.addEventListener('visibilitychange', () => {\r\n if (document.visibilityState === 'visible') {\r\n this.notify({ type: AuditEventType.Navigation_Return });\r\n }\r\n }, { once: true });\r\n }\r\n }, { once: true });\r\n\r\n this.notify(data);\r\n }\r\n\r\n /**\r\n * Notify route change\r\n */\r\n notifyRouteChange(url: string,) {\r\n this.notify({\r\n type: \"Navigation_Route\", // AuditEventType.Navigation_Route,\r\n detail: {\r\n detail: url\r\n }\r\n });\r\n\r\n }\r\n}","import { Injectable, inject } from \"@angular/core\";\nimport { NavigationEnd, Router, RouterEvent } from \"@angular/router\";\nimport { filter, map, shareReplay, tap } from \"rxjs\";\n\nimport { getQueryParamsFromUrl } from \"@sinequa/atomic\";\n\nimport { AuditService } from \"../web-services/audit.service\";\n\n@Injectable({\n providedIn: 'root'\n})\nexport class NavigationService {\n private readonly router = inject(Router);\n private readonly auditService = inject(AuditService);\n\n // The URL after the last navigation event, used to redirect the user after login\n urlAfterNavigation: string | null = null;\n\n /**\n * Observable that emits events of type `NavigationEnd` from the Angular Router.\n *\n * This observable performs the following operations:\n * - Maps all router events to `RouterEvent`.\n * - Filters the events to only include instances of `NavigationEnd`.\n * - Taps into the event stream to extract the route name from the URL and notify the audit service of route changes,\n * excluding the \"loading\" route and duplicate navigations.\n * - Updates the `urlAfterNavigation` property with the current URL after navigation.\n * - Shares the replayed value with a buffer size of 1 to ensure subscribers receive the latest emitted value.\n *\n * @type Observable<RouterEvent>\n */\n public navigationEnd$ = this.router.events.pipe(\n map(event => event as RouterEvent),\n filter((event: RouterEvent) => event instanceof NavigationEnd),\n tap(event => {\n const url = event.url.slice(1).split('?')[0]; // Extract route name\n if (url && (url !== \"loading\" && url !== this.urlAfterNavigation)) {\n this.auditService.notifyRouteChange(url)\n }\n }),\n tap(event => this.urlAfterNavigation = event.url),\n shareReplay(1)\n );\n\n /**\n * An observable that emits the tab extracted from the URL pathname or the last part of the URL.\n *\n * This observable listens to navigation end events and processes the URL to determine the current tab.\n * It creates a fake URL object to extract the pathname and then uses the `getQueryParamsFromUrl` function\n * to extract the tab from the URL pathname or defaults to the last part of the URL if no tab is found.\n *\n * @type Observable<string> - An observable that emits the current tab as a string.\n */\n public path$ = this.navigationEnd$.pipe(\n // create a fake URL object to extract the pathname\n map((event: RouterEvent) => {\n const url = new URL(`http://localhost${event.url}`)\n // extract the tab from the URL pathname or use the last part of the URL\n const { tab = url.pathname.split('/').pop() } = getQueryParamsFromUrl(event.url) || {};\n return tab;\n })\n );\n}\n","import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class BackdropService {\n public isVisible = new BehaviorSubject<boolean>(false);\n\n public show(): void {\n this.isVisible.next(true);\n }\n\n public hide(): void {\n this.isVisible.next(false);\n }\n}\n","import { EventEmitter, Injectable, OnDestroy, Type, inject } from '@angular/core';\nimport { BehaviorSubject, Subscription } from 'rxjs';\nimport { getState } from '@ngrx/signals';\n\nimport { Article } from '@sinequa/atomic';\n\nimport { SelectionHistoryService } from '../selection-history.service';\nimport { SelectionService } from '../selection.service';\nimport { NavigationService } from '../navigation.service';\nimport { SelectionStore } from '../../stores/selection.store';\nimport { BackdropService } from './backdrop.service';\n\n\n@Injectable({\n providedIn: 'root'\n})\nexport class DrawerStackService implements OnDestroy {\n public readonly isOpened = new BehaviorSubject<boolean>(false);\n public readonly toggleTopDrawerExtension$ = new EventEmitter<void>();\n public readonly forceTopDrawerCollapse$ = new EventEmitter<void>();\n public readonly closeTopDrawer$ = new EventEmitter<void>();\n public readonly closeAllDrawers$ = new EventEmitter<void>();\n\n public readonly isChatOpened = new BehaviorSubject<boolean>(false);\n public readonly openChatDrawer$ = new EventEmitter<void>();\n public readonly closeChatDrawer$ = new EventEmitter<void>();\n public readonly askAI$ = new EventEmitter<string>();\n\n private readonly selection = inject(SelectionService);\n private readonly selectionHistory = inject(SelectionHistoryService);\n private readonly selectionStore = inject(SelectionStore);\n private readonly navigationService = inject(NavigationService);\n private readonly backdropService = inject(BackdropService);\n\n private readonly subscriptions = new Subscription();\n\n public componentType?: Type<any>;\n\n constructor() {\n // on new search, close all drawers including chat drawer\n this.subscriptions.add(\n this.navigationService.navigationEnd$.subscribe(() => {\n this.closeAssistant();\n this.closeAll();\n })\n );\n }\n\n ngOnDestroy(): void {\n this.subscriptions.unsubscribe();\n }\n\n /**\n * Sets current drawer stack status to open\n */\n public open(componentType?: Type<any>): void {\n this.componentType = componentType;\n this.isOpened.next(true);\n }\n\n /**\n * Emits event to extend the top drawer\n */\n public extend(): void {\n this.toggleTopDrawerExtension$.next();\n }\n\n /**\n * Emits event to close the top drawer, checks if history is empty, if so,\n * sets current drawer stack status to closed and clears history and current\n * selection\n */\n public close(): void {\n this.closeTopDrawer$.next();\n\n if (this.selectionHistory.getCurrentSelectionIndex() === -1) {\n this.isOpened.next(false);\n this.selectionHistory.clearHistory();\n }\n }\n\n /**\n * Emits event to close the top drawer\n */\n public closeTop(): void {\n this.closeTopDrawer$.next();\n }\n\n /**\n * Sets current drawer stack status to closed, clears history and emits event\n * to close all drawers\n *\n * @param keepDrawerOpen if true, do not trigger layout animation\n */\n public closeAll(keepDrawerOpen: boolean = false): void {\n if (!keepDrawerOpen) this.isOpened.next(false);\n\n this.selectionHistory.clearHistory();\n\n this.closeAllDrawers$.next();\n }\n\n /**\n * Replace the current selection with the given article by closing all\n * drawers and opening the drawer with the new selection without triggering\n * layout animation\n *\n * @param article the article to replace the current selection with\n */\n public replace(article: Article | undefined): void {\n const { id } = getState(this.selectionStore);\n\n if (id && (!article || article.id === id)) return;\n\n // close everything without trigger layout animation\n this.closeAll(true);\n\n // set selection\n this.selection.setCurrentArticle(article);\n // open drawer\n this.open();\n }\n\n /**\n * Stack the given article by setting the current selection and opening the\n * drawer\n *\n * @param article the article to stack\n */\n public stack(article: Article | undefined, withQueryText?: boolean): void {\n const { id } = getState(this.selectionStore);\n\n if (id && (!article || article.id === id)) return;\n\n // force top drawer to collapse\n this.forceTopDrawerCollapse$.next();\n // set selection\n this.selection.setCurrentArticle(article, withQueryText);\n // open drawer\n this.open();\n }\n\n public toggleAssistant(): void {\n if (this.isChatOpened.getValue()) {\n this.backdropService.hide();\n this.closeAssistant();\n } else {\n this.backdropService.show();\n this.openAssistant();\n }\n }\n\n public openAssistant(): void {\n this.isChatOpened.next(true);\n this.isOpened.next(true);\n this.openChatDrawer$.next();\n\n this.backdropService.show();\n }\n\n public closeAssistant(keepDrawerOpen: boolean = false): void {\n this.isChatOpened.next(false);\n\n if (!keepDrawerOpen && this.selectionHistory.getCurrentSelectionIndex() === -1) {\n this.isOpened.next(false);\n this.closeAllDrawers$.next();\n }\n\n this.closeChatDrawer$.next();\n this.backdropService.hide();\n }\n\n public askAI(text: string): void {\n this.openAssistant();\n this.askAI$.next(text);\n }\n}\n","import { Directive, HostListener, inject, input } from '@angular/core';\n\nimport { Article } from '@sinequa/atomic';\nimport { DrawerStackService } from '../services/drawer/drawer-stack.service';\n\n\nexport type SelectionStrategy = 'replace' | 'stack';\n\n/**\n * Directive that selects an article on click.\n */\n@Directive({\n selector: '[appSelectArticleOnClick],[selectArticleOnClick]',\n standalone: true,\n})\nexport class SelectArticleOnClickDirective {\n private readonly drawerStack = inject(DrawerStackService);\n\n public readonly article = input.required<Partial<Article> | undefined>();\n public readonly strategy = input<SelectionStrategy>('stack');\n\n @HostListener('click')\n public onClick(): void {\n if (!this.article()) return;\n\n switch (this.strategy()) {\n case 'replace':\n this.drawerStack.replace(this.article() as Article);\n break;\n case 'stack':\n default:\n this.drawerStack.stack(this.article() as Article);\n break;\n }\n }\n}\n","import { Directive, HostListener, computed, effect, inject, input, output, signal } from '@angular/core';\nimport { Article } from '@sinequa/atomic';\n\nimport { UserSettingsStore } from '../stores/user-settings.store';\n\n\n/**\n * Directive that handles the behavior of showing a bookmark for an article.\n *\n * @remarks\n * This directive listens to mouse enter and mouse leave events to determine when to show the bookmark.\n * It also checks the user's settings to determine if the article is bookmarked.\n *\n * @example\n * ```html\n * <div showBookmark [article]=\"currentArticle\" (showBookmark)=\"onShowBookmark($event)\"></div>\n * ```\n */\n@Directive({\n selector: '[appShowBookmark],[showBookmark]',\n standalone: true\n})\nexport class ShowBookmarkDirective {\n @HostListener('mouseenter')\n public mouseEnter(): void {\n this.bookmarkHovered.set(true);\n }\n\n @HostListener('mouseleave')\n public mouseLeave(): void {\n this.bookmarkHovered.set(false);\n }\n\n protected bookmarkHovered = signal(false);\n userSettingsStore = inject(UserSettingsStore);\n\n protected isBookmarked = computed(() => {\n if(!this.article()) return false;\n return this.userSettingsStore.isBookmarked(this.article()!);\n });\n\n public readonly article = input.required<Article | Partial<Article> | undefined>();\n public readonly showBookmark = output<boolean>();\n\n constructor() {\n effect(() => {\n const bookmarkHovered = this.bookmarkHovered();\n const isBookmarked = this.isBookmarked();\n this.showBookmark.emit(bookmarkHovered || isBookmarked);\n });\n }\n\n}\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\n\nimport { applyThemeToNativeElement, ThemeStore } from '../stores';\n\n/**\n * This directive is used to apply a theme to a native element based on the theme scope.\n */\n@Directive({\n selector: '[themeProvider]',\n standalone: true\n})\nexport class ThemeProviderDirective {\n readonly themeProvider = input.required<string>();\n\n readonly host = inject(ElementRef);\n readonly themeStore = inject(ThemeStore);\n\n constructor() {\n effect(() => {\n const scope = this.themeStore.scopes()?.[this.themeProvider()];\n\n if (!scope) return;\n\n const vars = scope.darkMode ? scope.cssVars.dark : scope.cssVars.light;\n\n if (vars) applyThemeToNativeElement(this.host.nativeElement, vars);\n });\n }\n}\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn, Router } from '@angular/router';\r\nimport { globalConfig, isAuthenticated } from '@sinequa/atomic';\r\n\r\n/**\r\n * Returns a guard function that checks if the user is authenticated.\r\n * If the user is not authenticated, it navigates to the login page.\r\n * @returns The guard function.\r\n */\r\nexport function AuthGuard(): CanActivateFn {\r\n return (_, state) => {\r\n const router = inject(Router);\r\n\r\n const { loginPath, useCredentials, useSSO } = globalConfig;\r\n if (isAuthenticated()) return true;\r\n // when using SSO authentication, the application is already authenticated\r\n if(useSSO) return true;\r\n\r\n if(useCredentials) {\r\n router.navigate([loginPath], { queryParams: { returnUrl: state.url } })\r\n } else {\r\n router.navigate(['loading'], { queryParams: { returnUrl: state.url } })\r\n }\r\n return false;\r\n };\r\n}\r\n","import { inject } from '@angular/core';\r\nimport { CanActivateFn, Router } from '@angular/router';\r\nimport { ApplicationStore } from '../stores/application.store';\r\n\r\n\r\n/**\r\n * InitializationGuard is a route guard that ensures the application is ready before allowing navigation to a requested page.\r\n *\r\n * This guard checks if the application is fully initialized by verifying the readiness of the ApplicationStore.\r\n * If the application is not ready, it redirects the user to a loading page and prevents navigation to the requested page.\r\n *\r\n * @returns {CanActivateFn} A function that returns true if the application is ready, false otherwise.\r\n *\r\n * @example\r\n * // Usage in a routing module\r\n * const routes: Routes = [\r\n * {\r\n * path: 'some-path',\r\n * component: SomeComponent,\r\n * canActivate: [InitializationGuard]\r\n * }\r\n * ];\r\n */\r\nexport function InitializationGuard(): CanActivateFn {\r\n\r\n return (_, state) => {\r\n const route = inject(Router);\r\n const app = inject(ApplicationStore);\r\n\r\n /**\r\n * If the app is not ready, navigate to the loading page.\r\n * This is useful when the app is loading and the user tries to access a page that requires the app to be ready.\r\n *\r\n * We need to wait appStore, PrincipalStore and UserSettingsStore to be initialized before we can navigate to the requested page.\r\n *\r\n * @returns True if the app is ready, false otherwise.\r\n */\r\n if (!app.ready()) {\r\n route.navigate(['/loading'], { queryParams: { returnUrl: state.url }});\r\n return false;\r\n }\r\n return true;\r\n };\r\n}\r\n","import { HttpHandlerFn, HttpInterceptorFn, HttpParams, HttpRequest } from \"@angular/common/http\";\r\nimport { addAuditAdditionalInfo, globalConfig, isJsonable } from \"@sinequa/atomic\";\r\n\r\n\r\n/**\r\n * Intercepts HTTP requests to add audit information if the request URL includes the API path.\r\n *\r\n * This interceptor checks if the request URL contains the specified API path from the global configuration.\r\n * If the request body is JSON serializable and not an instance of `HttpParams`, it adds additional audit information\r\n * to the request body using the `addAuditAdditionalInfo` function.\r\n *\r\n * @param request - The HTTP request to be intercepted.\r\n * @param next - The next handler in the HTTP request chain.\r\n * @returns The next handler in the HTTP request chain, potentially with modified request body.\r\n */\r\nexport const auditInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\r\n if (!request.url.includes(globalConfig.apiPath!)) return next(request);\r\n\r\n if (isJsonable(request.body) && !(request.body instanceof HttpParams)) {\r\n // beware addAuditAdditionalInfo use a reference to the original object\r\n addAuditAdditionalInfo(request.body);\r\n }\r\n return next(request);\r\n}","import { HttpHandlerFn, HttpInterceptorFn, HttpRequest, HttpResponse } from '@angular/common/http';\r\nimport { map } from 'rxjs';\r\nimport { getToken, globalConfig, isAuthenticated, setToken } from '@sinequa/atomic';\r\n\r\n// TODO: Replace with your locale name\r\n// const LOCALE_NAME = \"fr\";\r\n\r\n/**\r\n * Intercepts HTTP requests to add authentication headers and handle CSRF tokens.\r\n *\r\n * This interceptor checks if the user is logged in and adds necessary headers\r\n * to the request, including a CSRF token. If user override is active, it sets\r\n * the override user and domain headers instead. It also updates the CSRF token\r\n * from the response headers if present.\r\n *\r\n * @param request - The outgoing HTTP request.\r\n * @param next - The next handler in the HTTP request pipeline.\r\n * @returns An observable of the HTTP event stream.\r\n */\r\nexport const authInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\r\n const { userOverride, userOverrideActive, useSSO } = globalConfig;\r\n\r\n // add auth header with jwt if user is logged in and request is to the api url\r\n const isLoggedIn = isAuthenticated() || useSSO;\r\n const csrfToken = getToken();\r\n\r\n let headers: Record<string, string> = {\r\n 'Sinequa-Force-Camel-Case': 'true',\r\n 'accept': 'application/json',\r\n 'Sinequa-csrf-token': `${csrfToken}`,\r\n // \"x-language\": LOCALE_NAME\r\n }\r\n\r\n if (userOverride && userOverrideActive) {\r\n headers = {\r\n ...headers,\r\n 'sinequa-override-user': userOverride.username,\r\n 'sinequa-override-domain': userOverride.domain,\r\n }\r\n }\r\n\r\n request = request.clone({\r\n setHeaders: headers\r\n });\r\n\r\n return next(request).pipe(\r\n map(event => {\r\n if (event instanceof HttpResponse) {\r\n const csrfToken = event.headers.get('sinequa-csrf-token');\r\n if (csrfToken) {\r\n setToken(csrfToken);\r\n }\r\n }\r\n return event; // Add this line to fix the return type\r\n })\r\n );\r\n}","import { HttpHandlerFn, HttpRequest } from \"@angular/common/http\";\r\n\r\n/**\r\n * Interceptor function that modifies the request body by appending a \"locale\" parameter with the value \"fr\".\r\n * If the request body is of type FormData, the \"locale\" parameter is appended directly.\r\n * If the request body is an object, a new object is created with the \"locale\" parameter added.\r\n *\r\n * @param request - The HTTP request object.\r\n * @param next - The HTTP handler function.\r\n * @returns The modified request object.\r\n */\r\nexport const bodyInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\r\n\r\n const LOCALE_NAME = \"fr\";\r\n\r\n if (request.body instanceof FormData) {\r\n request.body.append(\"ui-language\", LOCALE_NAME);\r\n request = request.clone();\r\n } else {\r\n const body = {...request.body as object, \"ui-language\": LOCALE_NAME };\r\n request = request.clone({\r\n body\r\n });\r\n }\r\n return next(request);\r\n\r\n};","import { computed, inject, Injectable, InjectionToken, signal, Type } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\nimport { toast } from 'ngx-sonner';\n\nimport { CCApp, Credentials, globalConfig, labels, login, setGlobalConfig } from '@sinequa/atomic';\n\nimport { AuthGuard, InitializationGuard } from '../guards';\nimport { AppStore } from '../stores/app.store';\nimport { PrincipalStore } from '../stores/principal.store';\nimport { UserSettingsStore } from '../stores/user-settings.store';\nimport { AppService } from '../web-services/app.service';\nimport { AuditService } from '../web-services/audit.service';\nimport { ApplicationStore } from '../stores/application.store';\n\nexport const ROUTE_COMPONENTS = new InjectionToken<ComponentMapping[]>('ROUTE_COMPONENTS', { factory: () => [] });\n\nexport type ComponentMapping = {\n path: string,\n component: Type<unknown>\n isRoot?: boolean\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ApplicationService {\n\n userSettingsStore = inject(UserSettingsStore);\n principalStore = inject(PrincipalStore);\n\n appService = inject(AppService);\n appStore = inject(AppStore);\n applicationStore = inject(ApplicationStore);\n\n route = inject(ActivatedRoute);\n router = inject(Router);\n\n auditService = inject(AuditService);\n\n components = inject(ROUTE_COMPONENTS);\n defaultComponent = computed(() => this.components.find(c => c.path === 'all')?.component);\n defaultLayoutComponent = computed(() => this.components.find(c => c.isRoot)?.component);\n\n /**\n * Registers a list of components.\n *\n * * For each path, the corresponding component is registered.\n * * The default component is the component registered with the path 'all'.\n * * The default layout component is the component registered with the isLayout flag set to true.\n * * If no layout component is registered, the default layout component is the default component.\n * * If no default component is registered, the default component is the first component in the list.\n *\n * Those components will be used to create the routes.\n *\n * @deprecated use the ROUTE_COMPONENTS injection token instead\n *\n * @param components - An array of ComponentMapping objects to be registered.\n */\n register(components: ComponentMapping[]) {\n this.components = [...components];\n }\n\n /**\n * Authenticates the user with the provided credentials, initializes and creates routes. \n * * in case of failure, it rejects with an error message.\n * * in case of success, it resolves with `true`, shows a toast notification to welcome the user,\n * and updates the application state to ready.\n *\n * @param {Credentials} [credentials] - The user's login credentials.\n * @returns {Promise<boolean>} - A promise that resolves to `true` if login is successful,\n * or rejects with an error message if login fails.\n * @throws {Error} - Throws an error if the login process fails.\n */\n async autoLogin({ credentials, withCreateRoutes = true }: { credentials?: Credentials; withCreateRoutes?: boolean; } = {}): Promise<boolean> {\n const { useCredentialsOrSSO } = globalConfig;\n try {\n const authenticated = await login(credentials);\n if (authenticated) {\n await this.initAndCreateRoutes(withCreateRoutes).catch((error) => {\n console.warn('Error initializing the application (authenticated)', error);\n return Promise.reject(error);\n });\n\n // Show a toast notification to welcome the user\n // and the application is ready to use\n const { fullName, name } = getState(this.principalStore).principal;\n toast(`Welcome back ${fullName || name}!`, { duration: 2000 })\n this.applicationStore.updateReadyState();\n\n return Promise.resolve(true);\n }\n else {\n return Promise.reject('Login failed');\n }\n }\n catch (error) {\n console.error('Error logging in', error);\n if (useCredentialsOrSSO) {\n await this.initAndCreateRoutes(withCreateRoutes).catch((error) => {\n console.warn('Error initializing the application (useCredentialsOrSSO)', error);\n setGlobalConfig({ useCredentials: true });\n return Promise.reject(error);\n })\n\n setGlobalConfig({ useSSO: true });\n // Show a toast notification to welcome the user\n // and the application is ready to use\n const { fullName, name } = getState(this.principalStore).principal;\n toast(`Welcome back ${fullName || name}!`, { duration: 2000 })\n this.applicationStore.updateReadyState();\n\n return Promise.resolve(true);\n }\n else {\n return Promise.reject(error);\n }\n }\n }\n\n /**\n * Initializes the application.\n * - Fetches the application configuration.\n * - Sets the fetched application configuration in the app store.\n * - Loads the user settings and logs the state of the user settings store.\n */\n async init() {\n // Fetch the application configuration\n await this.appStore.initialize();\n console.log(\"appStore\", getState(this.appStore));\n\n // Load the principal (user information)\n await this.principalStore.initialize()\n console.log(\"principalStore\", getState(this.principalStore))\n\n // Load the user settings\n await this.userSettingsStore.initialize();\n console.log(\"userSettingsStore\", getState(this.userSettingsStore))\n\n // Labels access\n const service = (this.appStore.getWebServiceByType('labels'));\n if (!service) {\n this.applicationStore.updateHasLabelsAccess(false);\n return;\n }\n try {\n const rights = await labels.getUserRights();\n this.applicationStore.updateHasLabelsAccess(rights.canEditPublicLabels || rights.canManagePublicLabels);\n } catch (error) {\n console.log(\"labels.canHandleLabels failure - error: \", error);\n this.applicationStore.updateHasLabelsAccess(false);\n }\n }\n\n\n /**\n * Initializes the application and creates routes.\n *\n * This method performs the following actions:\n * 1. Calls the `init` method to initialize the application.\n * 2. Calls the `createRoutes` method to set up the application routes.\n * 3. Notifies the audit service of a login event.\n *\n * @returns {Promise<void>} A promise that resolves when the initialization and route creation are complete.\n */\n async initAndCreateRoutes(withCreateRoutes = true) {\n // throw an error if no components are registered and withCreateRoutes is true\n // components are required to create the routes\n if (withCreateRoutes && !this.components.length) throw new Error('No components registered');\n\n await this.init();\n if (withCreateRoutes) {\n this.createRoutes();\n }\n }\n\n /**\n * Creates dynamic routes based on the application's queries and custom JSON configurations.\n *\n * This method performs the following steps:\n * 1. Retrieves the queries and custom JSON data from the application state.\n * 2. Maps the queries to an array of objects containing query names and tabs.\n * 3. Throws an error if no queries are found.\n * 4. Retrieves route data from custom JSONs or falls back to default data.\n * 5. Creates routes for each tab in each query, or uses the query name if no tabs are found.\n * 6. Removes the current search route from the router configuration.\n * 7. Creates child routes based on the provided routes data or the first query's tabs.\n * 8. Updates the search route with the new child routes.\n * 9. Resets the router configuration with the new routes.\n *\n * @throws {Error} If no queries are found.\n */\n private createRoutes() {\n // Now we can create the dynamic routes based on the queries's tabs\n const { queries, data: custom, customJSONs = [] } = getState(this.appStore) as CCApp;\n\n // contains an array of objects with the query name and the tabs\n const queriesMap = Object.entries(queries).map(([key, value]) => ({ key, ...value }));\n\n // ! if no queries are found, throw an error\n if (!queriesMap.length) {\n throw new Error('No queries found');\n }\n\n // Retrieves the routes data from the custom JSONs array or fall back to the default data (custom json).\n let { data: cjRoutes } = Array.isArray(customJSONs) ? customJSONs?.find((c => c.name === 'routes')) || {} : { data: custom?.['routes'] };\n // check if cjRoutes is an array and not an object to avoid errors\n if (cjRoutes && !Array.isArray(cjRoutes)) {\n cjRoutes = undefined;\n }\n const routes = (cjRoutes || custom?.['routes']) as { path: string, wsName: string, wsQueryTab: string, pathDisplayName: string, icon: string }[];\n\n // take only first query\n const firstQuery = queriesMap[0];\n\n // We need to create a route for each tab in each query\n // if a query has no tabs, we create a route with the query name as the tab name\n const firstQueryConfig = { tabs: firstQuery.tabSearch.tabs || [{ name: firstQuery.name }] };\n\n // We need to remove the current search route from the router config\n // the route exists in the router config because it was created in the app-routing.module.ts and we need it\n // to be able to navigate to the search page. We will recreate it with the new tabs\n const currentConfig = this.router.config.filter(route => route.path !== 'search');\n\n let children = [];\n\n // if the routes data is provided, we create the children routes based on the routes data\n if (routes) {\n // update routes pathDisplayName with the query display name when not provided\n // for each path we need to find the corresponding query and tab in the firstQuery object\n // and create a child route with the query name and tab name\n const displayNamesMap = firstQuery.tabSearch.tabs.reduce((acc, tab) => {\n acc[tab.name] = { display: tab.display };\n return acc;\n }, {} as Record<string, { display: string }>);\n\n children = routes.map((route) => {\n return ({\n path: route.path,\n component: this.components.find(c => c.path === route.path)?.component || this.defaultComponent(),\n data: {\n queryName: route.wsName || firstQuery.name,\n display: route.pathDisplayName || displayNamesMap[route.wsQueryTab]?.display || route.path,\n wsQueryTab: route.wsQueryTab,\n iconClass: route.icon\n }\n })\n });\n }\n else {\n // if the routes data is not provided, we create the children routes based on the first query's tabs\n // create the children routes for the search route\n children = firstQueryConfig.tabs.map(tab => ({\n path: tab.name,\n component: this.components.find(c => c.path === tab.name)?.component || this.defaultComponent(),\n data: { queryName: firstQuery.name, display: tab.display || tab.name }\n }));\n }\n\n const searchPath = this.router.config.find(route => route.path === 'search')\n || {\n path: 'search',\n component: this.components.find(c => c.path === 'search')?.component || this.defaultLayoutComponent(),\n canActivate: [AuthGuard(), InitializationGuard()],\n children: []\n };\n\n searchPath.component = this.components.find(c => c.path === 'search')?.component || this.defaultLayoutComponent();\n searchPath.children = [...children, { path: '**', redirectTo: 'all', pathMatch: 'full' }];\n\n const newConfig = [searchPath, ...currentConfig];\n // finally we reset the router config with the new routes\n this.router.resetConfig(newConfig);\n }\n}","import { Injectable, Injector, inject, signal } from '@angular/core';\nimport { Observable, forkJoin, from, of } from 'rxjs';\nimport { getState } from '@ngrx/signals';\n\nimport { CCWebService, Suggestion, fetchSuggest } from '@sinequa/atomic';\n\nimport { UserSettingsStore } from '../stores/user-settings.store';\nimport { AppStore } from '../stores/app.store';\nimport { Autocomplete } from '../models/autocomplete';\n\n\ntype AutocompleteWebService = CCWebService & {\n allowedWithAnySBA?: boolean,\n revision?: number,\n suggestQueries?: string,\n useDistributionRegex?: boolean,\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AutocompleteService {\n readonly opened = signal(false);\n\n readonly injector = inject(Injector)\n\n userSettingsStore = inject(UserSettingsStore);\n appStore = inject(AppStore);\n\n /**\n * Retrieves autocomplete items for the given text, max count for each\n * category handled by the service can be specified in the admin\n *\n * @param text Text to retrieve autocomplete items for\n * @returns An observable of an array of {@link Suggestion} arrays grouped by\n * suggestion queries configured in the admin\n */\n getFromSuggestQueriesForText(text: string): Observable<Suggestion[][]> {\n // Do not ask for autocomplete items if the text is empty\n if (!text) return of([]);\n\n const queries = (this.appStore.getWebServiceByType('autocomplete') as AutocompleteWebService)?.suggestQueries?.split(',') ?? [];\n const obss = queries.reduce((acc: Observable<Suggestion[]>[], curr: string) => {\n acc.push(from(fetchSuggest(curr, text)));\n return acc;\n }, [] as Observable<Suggestion[]>[]);\n\n return forkJoin<Suggestion[][]>(obss);\n }\n\n /**\n * Retrieves autocomplete items for the given text from the user settings\n *\n * @param text Text to retrieve autocomplete items for\n * @param maxCount Maximum number of items to retrieve\n * @returns An observable of an array of {@link Suggestion} arrays grouped by\n * `recent-searches`, `saved-searches`, `bookmarks` from the user settings\n */\n getFromUserSettingsForText(text: string, maxCount?: number | Autocomplete): Suggestion[] {\n const { bookmarks, recentSearches, savedSearches } = getState(this.userSettingsStore);\n const items: Suggestion[] = [];\n\n if (typeof maxCount === 'number')\n maxCount = { recentSearches: maxCount, savedSearches: maxCount, bookmarks: maxCount };\n\n if (recentSearches) {\n\n // don't filter if the text is empty\n const matchingRecentSearches = text\n ? recentSearches.filter(recentSearch => recentSearch.display?.toLocaleLowerCase().includes(text.toLocaleLowerCase()))\n : recentSearches;\n\n const searches = matchingRecentSearches.slice(0, maxCount?.recentSearches);\n\n if (searches.length > 0)\n items.push(...searches.map(search => ({ category: 'recent-search', ...search })));\n }\n\n if (savedSearches) {\n\n // don't filter if the text is empty\n const matchingSavedSearches = text\n ? savedSearches.filter(savedSearch => savedSearch.display?.toLocaleLowerCase().includes(text.toLocaleLowerCase()))\n : savedSearches;\n\n const searches = matchingSavedSearches.slice(0, maxCount?.savedSearches);\n\n if (searches.length > 0)\n items.push(...searches.map(search => ({ category: 'saved-search', ...search })));\n }\n\n if (bookmarks) {\n\n // don't filter if the text is empty\n const matchingBookmarks = text\n ? bookmarks.filter(bookmark => bookmark.label?.toLowerCase().includes(text.toLowerCase()))\n : bookmarks;\n\n const searches = matchingBookmarks.slice(0, maxCount?.bookmarks);\n\n if (searches.length > 0)\n items.push(...searches.map(search => ({ category: 'bookmark', display: search.label ?? '', ...search })));\n }\n\n return items;\n }\n}\n","import { Injectable, inject, signal } from '@angular/core';\n\nimport { AppStore } from '../stores/app.store';\nimport { CCWebService, fetchLabels, labels, LabelsRights, Query } from '@sinequa/atomic';\nimport { catchError, firstValueFrom, from, map, Observable, of, switchMap, throwError } from 'rxjs';\n\ntype LabelsWebService = CCWebService & LabelsConfig & {\n allowedWithAnySBA?: boolean,\n labelsBulkDocLimit?: string,\n revision?: number,\n useDistributionRegex?: boolean,\n}\n\nexport interface LabelsConfig {\n allowPublicLabelsCreation?: boolean;\n allowPublicLabelsModification?: boolean;\n privateLabelsField?: string;\n publicLabelsField?: string;\n defaultPublicLabels?: string;\n labelsAutoSuggestMaxCount?: string;\n labelsAutoSuggestWildcard?: string;\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class LabelService {\n appStore = inject(AppStore);\n\n hasAccess = signal<boolean | undefined>(undefined);\n\n /**\n * Check user rights to verify if they can access labels handling\n * @returns if has the rights\n */\n async canHandleLabels(): Promise<boolean> {\n if (this.hasAccess() !== undefined) return this.hasAccess()!;\n\n const service = (this.appStore.getWebServiceByType('labels') as LabelsWebService);\n if (!service) return false;\n\n try {\n const rights = await labels.getUserRights();\n this.hasAccess.set(rights.canEditPublicLabels || rights.canManagePublicLabels);\n return this.hasAccess()!;\n } catch (error) {\n console.log(\"labels.canHandleLabels failure - error: \", error);\n return false;\n }\n }\n\n /**\n * Get relevant config info from the labels web service\n * @returns the LabelsConfig or undefined if no rights\n */\n getLabelsConfig(): Observable<LabelsConfig | undefined> {\n return from(this.canHandleLabels())\n .pipe(\n map((canHandle: boolean) => {\n if (!canHandle) return undefined;\n\n const { allowPublicLabelsCreation, allowPublicLabelsModification, privateLabelsField, publicLabelsField,\n defaultPublicLabels, labelsAutoSuggestMaxCount, labelsAutoSuggestWildcard } = (this.appStore.getWebServiceByType('labels') as LabelsWebService);\n\n return {\n allowPublicLabelsCreation,\n allowPublicLabelsModification,\n privateLabelsField,\n publicLabelsField,\n defaultPublicLabels,\n labelsAutoSuggestMaxCount,\n labelsAutoSuggestWildcard\n }\n })\n );\n }\n\n /**\n * Fetch labels from string\n * @param prefix the string prefix to filter with\n * @param publicOnly whether they should be public or not\n * @param locale optional locale filtering\n * @returns list of label strings\n */\n fetch(prefix: string, publicOnly: boolean = true, locale?: string): Observable<string[]> {\n return from(fetchLabels(prefix, publicOnly, locale));\n }\n\n /**\n * Add some labels to many documents\n * @param labelsToAdd list of labels to add\n * @param ids list of document id to add the label\n * @param publicOnly whether the operation should be public only\n * @returns a promise that resolves when the operation is complete\n */\n add(labelsToAdd: string[], ids: string[], publicOnly?: boolean): Observable<void> {\n return from(this.canHandleLabels())\n .pipe(\n switchMap((canHandle: boolean) => {\n if (!canHandle) return of(undefined);\n\n return from(labels.add(labelsToAdd, ids, publicOnly));\n })\n );\n }\n\n /**\n * Remove some labels from many documents\n * @param labelsToRemove list of labels to remove\n * @param ids list of document id to add the label\n * @param publicOnly whether the operation should be public only\n * @returns a promise that resolves when the operation is complete\n */\n remove(labelsToRemove: string[], ids: string[], publicOnly?: boolean): Observable<void> {\n return from(this.canHandleLabels())\n .pipe(\n switchMap((canHandle: boolean) => {\n if (!canHandle) return of(undefined);\n\n return from(labels.remove(labelsToRemove, ids, publicOnly));\n })\n );\n }\n\n /**\n * Name some labels to a new name\n * @param labelsToRename list of labels to rename\n * @param newLabel the new label name\n * @param publicOnly whether the operation should be public only\n * @returns a promise that resolves when the operation is complete\n */\n rename(labelsToRename: string[], newLabel: string, publicOnly?: boolean): Observable<void> {\n return from(this.canHandleLabels())\n .pipe(\n switchMap((canHandle: boolean) => {\n if (!canHandle) return of(undefined);\n\n return from(labels.rename(labelsToRename, newLabel, publicOnly));\n })\n );\n }\n\n /**\n * Delete some labels\n * @param labelsToDelete the labels to delete\n * @param publicOnly whether the operation should be public only\n * @returns a promise that resolves when the operation is complete\n */\n delete(labelsToDelete: string[], publicOnly?: boolean): Observable<void> {\n return from(this.canHandleLabels())\n .pipe(\n switchMap((canHandle: boolean) => {\n if (!canHandle) return of(undefined);\n\n return from(labels.delete(labelsToDelete, publicOnly));\n })\n );\n }\n\n /**\n * Create some labels for a query\n * @param labelstoAdd the labels to create\n * @param query the query object to which the labels will be added\n * @param publicOnly whether the operation should be public only\n * @returns a promise that resolves when the operation is complete\n */\n bulkAdd(labelstoAdd: string[], query: Query, publicOnly?: boolean): Observable<void> {\n return from(this.canHandleLabels())\n .pipe(\n switchMap((canHandle: boolean) => {\n if (!canHandle) return of(undefined);\n\n return from(labels.bulkAdd(labelstoAdd, query, publicOnly));\n })\n );\n }\n\n /**\n * Delete some labels from a query\n * @param labelsToRemove the labels to remove\n * @param query the query object to which the labels will be removed\n * @param publicOnly whether the operation should be public only\n * @returns a promise that resolves when the operation is complete\n */\n bulkRemove(labelsToRemove: string[], query: Query, publicOnly?: boolean): Observable<void> {\n return from(this.canHandleLabels())\n .pipe(\n switchMap((canHandle: boolean) => {\n if (!canHandle) return of(undefined);\n\n return from(labels.bulkRemove(labelsToRemove, query, publicOnly));\n })\n );\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { toast } from 'ngx-sonner';\nimport { getState } from '@ngrx/signals';\n\nimport { QueryParamsStore, UserSettingsStore } from '../stores';\nimport { SavedSearch } from '../models';\n\nconst SAVED_SEARCHES_MAX_STORAGE = 100;\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SavedSearchesService {\n protected readonly userSettingsStore = inject(UserSettingsStore);\n protected readonly queryParamsStore = inject(QueryParamsStore);\n\n /**\n * Retrieves the list of saved searches from the user settings store.\n *\n * @returns {SavedSearch[]} An array of saved searches.\n */\n public getSavedSearches(): SavedSearch[] {\n return this.userSettingsStore.savedSearches()\n }\n\n /**\n * Saves the current search query to the user's saved searches.\n *\n * This method retrieves the current search text from the query parameters store.\n * If the search text is empty, it logs an error and exits.\n * Otherwise, it creates a new saved search object with the current URL, date, and search text.\n *\n * The new saved search is added to the beginning of the saved searches array.\n * If the array exceeds the maximum allowed storage, the oldest search is removed.\n *\n * Finally, the updated saved searches array is saved back to the user settings store,\n * and a success message is displayed to the user.\n *\n * @throws {Error} If saving an empty search is attempted.\n */\n public saveSearch() {\n const { text } = getState(this.queryParamsStore);\n if (!text) {\n console.error('Saving empty search is not allowed');\n return;\n }\n\n const savedSearch = { url: window.location.hash.substring(1), date: new Date().toISOString(), display: text };\n const savedSearches = this.userSettingsStore.savedSearches();\n\n if (savedSearches.length >= SAVED_SEARCHES_MAX_STORAGE){\n savedSearches.pop();\n }\n\n savedSearches.unshift(savedSearch);\n\n this.userSettingsStore.updateSavedSearches(savedSearches);\n\n toast.success('Search successfully saved');\n }\n\n /**\n * Updates the saved searches in the user settings store.\n *\n * @param savedSearches - An array of SavedSearch objects to update.\n */\n public updateSavedSearches(savedSearches: SavedSearch[]) {\n this.userSettingsStore.updateSavedSearches(savedSearches);\n }\n\n /**\n * Deletes a saved search from the user settings store.\n *\n * @param index - The index of the saved search to delete.\n */\n public deleteSavedSearch(index: number) {\n this.userSettingsStore.deleteSavedSearch(index);\n }\n}","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { EMPTY, Observable, catchError, map, of, tap } from 'rxjs';\r\n\r\nimport { Aggregation, Article, AuditEvents, CustomHighlights, PreviewData, Query, Result, TreeAggregation, TreeAggregationNode, buildPathsAndLevels, globalConfig } from '@sinequa/atomic';\r\n\r\nimport { AppStore, QueryParamsStore } from '../stores';\r\n\r\nconst AGGREGATION_MAX_COUNT = 11;\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class QueryService {\r\n protected readonly http = inject(HttpClient);\r\n\r\n private readonly appStore = inject(AppStore);\r\n private readonly queryParamsStore = inject(QueryParamsStore)\r\n\r\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\r\n\r\n /**\r\n * Performs a search query.\r\n *\r\n * @param q - The partial query object.\r\n * @param includeQueryParams - Indicates whether to include query parameters automatically in the request.\r\n * @param audit - The audit events object.\r\n * @returns An observable that emits the search results.\r\n */\r\n search(q?: Partial<Query>, includeQueryParams = true, audit?: AuditEvents): Observable<Result> {\r\n const $auditRecord = audit ? { auditEvents: [audit] } : undefined;\r\n\r\n const { app } = globalConfig;\r\n const currentQuery = q ?? this.queryParamsStore.getQuery();\r\n const query = includeQueryParams ? { ...this.queryParamsStore.getQuery(), ...currentQuery } : currentQuery;\r\n\r\n // Check if the search query is empty and if empty searches are allowed\r\n // If not allowed, return an empty result\r\n const allowEmptySearch = this.appStore.allowEmptySearch(query?.name || '');\r\n if (allowEmptySearch === false && query?.text === '') {\r\n return of({ records: [] as Article[] } as Result);\r\n }\r\n\r\n const body = {\r\n app,\r\n query,\r\n $auditRecord\r\n };\r\n\r\n return this.http.post<Result>(this.API_URL + \"/query\", body)\r\n .pipe(\r\n catchError(error => {\r\n console.error(\"queryService.getResults failure - error: \", error);\r\n return of({} as Result);\r\n }),\r\n map((result: Result) => {\r\n // update $hasMore flag\r\n result.aggregations.forEach((agg: Aggregation) => {\r\n agg.$hasMore = false;\r\n if (!agg.isDistribution && !agg.isTree && agg.items) {\r\n agg.$hasMore = agg.items.length === AGGREGATION_MAX_COUNT;\r\n }\r\n if (agg.isTree) {\r\n buildPathsAndLevels(agg as TreeAggregation);\r\n }\r\n });\r\n return result;\r\n }),\r\n map(result => {\r\n result.records?.map((article: Article) => (Object.assign(article, { value: article.title, type: 'default' })));\r\n return result;\r\n }),\r\n map(result => {\r\n const r = ({ ...result, nextPage: result.page < Math.ceil(result.rowCount / result.pageSize) ? result.page + 1 : undefined, previousPage: result.page > 1 ? result.page - 1 : undefined })\r\n return r;\r\n }),\r\n tap(response => console.log(\"queryService.getResults success - data: \", response)),\r\n );\r\n }\r\n\r\n /**\r\n * Performs a bulk search operation.\r\n *\r\n * @param q An array of Query objects representing the search queries.\r\n * @param audit An optional AuditEvents object for auditing purposes.\r\n * @returns An Observable that emits an array of Result objects.\r\n */\r\n bulkSearch(q: Query[], audit?: AuditEvents): Observable<Result[]> {\r\n\r\n const { app = '' } = globalConfig;\r\n\r\n const body: {\r\n methods: {\r\n method: string,\r\n app: string,\r\n query: Query\r\n }[],\r\n propagateErrors: true,\r\n $auditRecord?: { auditEvents: [AuditEvents] }\r\n } = {\r\n methods: [],\r\n propagateErrors: true,\r\n $auditRecord: { auditEvents: [audit!] }\r\n };\r\n\r\n for (const query of q) {\r\n body.methods.push({\r\n method: \"query\",\r\n app,\r\n query\r\n });\r\n }\r\n\r\n return this.http.post<{ results: Result[] }>(this.API_URL + \"/multi\", body)\r\n .pipe(\r\n catchError(error => {\r\n console.error(\"queryService.bulkSearch failure - error: \", error);\r\n return EMPTY;\r\n }),\r\n map(response => {\r\n // update $hasMore flag\r\n response.results.forEach((result: Result) => {\r\n result.aggregations.forEach((agg: Aggregation) => {\r\n agg.$hasMore = false;\r\n if (!agg.isDistribution && !agg.isTree && agg.items) {\r\n agg.$hasMore = agg.items.length === AGGREGATION_MAX_COUNT;\r\n }\r\n if (agg.isTree) {\r\n buildPathsAndLevels(agg as TreeAggregation);\r\n }\r\n });\r\n })\r\n\r\n return response.results;\r\n }),\r\n map(results => {\r\n results.forEach(result => result.records?.map((article: Article) => (Object.assign(article, { value: article.title, type: 'default' }))));\r\n return results;\r\n }),\r\n map(results => {\r\n return results.map(result => {\r\n const r = ({ ...result, nextPage: result.page < Math.ceil(result.rowCount / result.pageSize) ? result.page + 1 : undefined, previousPage: result.page > 1 ? result.page - 1 : undefined })\r\n return r;\r\n });\r\n }),\r\n // map(response => ResultsSchema.parse(response) as T),\r\n tap(response => console.log(\"queryService.bulkSearch success - data: \", response)),\r\n );\r\n\r\n }\r\n}\r\n","import { Injectable, Injector, inject, runInInjectionContext } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\nimport { Observable, catchError, map, of, tap } from 'rxjs';\n\nimport { Article, AuditEvents, Query, Result } from '@sinequa/atomic';\n\nimport { QueryParamsStore, UserSettingsStore } from '../stores';\nimport { QueryService } from '../web-services/query.service';\n\n\nexport type SearchOptions = {\n appendFilters?: boolean;\n audit?: AuditEvents\n}\n\ntype QueryParams = {\n f?: string; // filters list\n p?: number; // page number\n s?: string; // sort name\n t?: string; // tab name\n q?: string; // query text\n}\n\n@Injectable({\n providedIn: 'root'\n})\nexport class SearchService {\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly queryService = inject(QueryService);\n\n // Represents the last result of a search operation with getResult().\n public result: Result = {} as Result;\n public audit?: AuditEvents;\n\n protected readonly queryParamsStore = inject(QueryParamsStore);\n protected readonly userSettingsStore = inject(UserSettingsStore);\n protected readonly injector = inject(Injector);\n\n\n /**\n * Executes a search operation with the given commands and options.\n *\n * @param commands - An array of strings representing the search commands.\n * @param options - An optional object containing search options.\n * @param options.appendFilters - A boolean indicating whether to append existing filters to the search query. Defaults to true.\n * @param options.audit - An optional audit trail object to be stored in the navigation state.\n *\n * The method constructs query parameters based on the current state and the provided options,\n * then navigates to the specified commands with the constructed query parameters and audit trail.\n */\n public search(commands: string[], options: SearchOptions = { appendFilters: true }): void {\n const queryParams: QueryParams = {};\n const { text, filters = [], page, sort, tab } = getState(this.queryParamsStore);\n const { audit, appendFilters } = options;\n\n this.audit = audit;\n\n if (appendFilters) {\n queryParams.f = filters.length > 0 ? JSON.stringify(filters) : undefined;\n queryParams.p = page;\n queryParams.s = sort;\n queryParams.t = tab;\n queryParams.q = text;\n }\n\n // navigation state store the audit trail\n this.router.navigate(commands, { relativeTo: this.route, queryParamsHandling: 'merge', queryParams, state: { audit } });\n }\n\n\n\n /**\n * Retrieves the search result based on the provided query.\n *\n * @param q - A partial query object containing search parameters.\n * @returns An Observable of the search result.\n *\n * This method performs the following actions:\n * - Creates an audit event with the type \"Search_Text\" and the query text.\n * - Resets the audit property to undefined.\n * - Calls the search method of the queryService with the query, a flag to include the query name in records, and the audit event.\n * - Handles any errors by returning an empty Result object.\n * - Maps the search result to the service's result property.\n */\n public getResult(q: Partial<Query>): Observable<Result> {\n const audit: AuditEvents = { type: \"Search_Text\", detail: { querytext: q?.text }, ...this.audit};\n this.audit = undefined;\n // add the query name to records, to have it available if we bookmark one\n return this.queryService.search(q, true, audit)\n .pipe(\n catchError(() => of({} as Result)),\n map((result: Result) => this.result = result)\n );\n }\n\n /**\n * Navigates to the specified page and returns the search result.\n * @param page - The page number to navigate to.\n * @returns A promise that resolves to the search result.\n */\n public gotoPage(page: number) {\n this.queryParamsStore.patch({ page });\n this.search([], { audit: {\n type: \"Search_GotoPage\",\n detail: {\n page: page,\n fromresultid: this.result ? this.result.id : null\n }\n }});\n }\n}\n","import { Injectable, inject } from '@angular/core';\n\nimport { BehaviorSubject } from 'rxjs';\nimport { BackdropService } from './backdrop.service';\n\n@Injectable()\nexport class DrawerService {\n public readonly isOpened = new BehaviorSubject<boolean>(false);\n public readonly isExtended = new BehaviorSubject<boolean>(false);\n\n private readonly backdrop = inject(BackdropService);\n\n public open(): void {\n this.isOpened.next(true);\n }\n\n public close(): void {\n this.collapse();\n this.isOpened.next(false);\n }\n\n public toggle(): void {\n this.isOpened.getValue() ? this.close() : this.open();\n }\n\n public extend(): void {\n this.isExtended.next(true);\n this.backdrop.show();\n }\n\n public collapse(): void {\n this.backdrop.hide();\n this.isExtended.next(false);\n }\n\n public toggleExtension(): void {\n this.isExtended.getValue() ? this.collapse() : this.extend();\n }\n}\n","import { HttpHandlerFn, HttpInterceptorFn, HttpRequest } from '@angular/common/http';\r\nimport { inject } from '@angular/core';\r\nimport { Router } from '@angular/router';\r\nimport { globalConfig, login, logout } from '@sinequa/atomic';\r\nimport { catchError } from 'rxjs/operators';\r\nimport { NavigationService } from '../services';\r\n\r\n/**\r\n * Interceptor function that handles HTTP errors by logging out the user and redirecting to the login page.\r\n *\r\n * @param request - The HTTP request object.\r\n * @param next - The HTTP handler function.\r\n * @returns The modified request object.\r\n */\r\nexport const errorInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\r\n const { useCredentials, loginPath, userOverrideActive } = globalConfig\r\n const router = inject(Router)\r\n const lastUrlAfterNavigation = inject(NavigationService).urlAfterNavigation\r\n\r\n if (request.url.includes('api/v1/audit.notify')) {\r\n return next(request);\r\n }\r\n\r\n return next(request).pipe(catchError((err) => {\r\n if ([401, 403].includes(err.status)) {\r\n // auto logout if 401 or 403 response returned from api\r\n if (useCredentials && !userOverrideActive) {\r\n logout();\r\n router.navigate([loginPath], { queryParams: { returnUrl: lastUrlAfterNavigation } });\r\n } else if (!userOverrideActive) {\r\n // logout the user and navigate to login page\r\n logout().then(() => login());\r\n }\r\n }\r\n\r\n return Promise.reject(err);\r\n }))\r\n};","import { HttpHandlerFn, HttpInterceptorFn, HttpRequest } from '@angular/common/http';\r\nimport { toast } from 'ngx-sonner';\r\nimport { catchError } from 'rxjs/operators';\r\n\r\n\r\n/**\r\n * Intercepts HTTP requests and handles errors by displaying toast notifications.\r\n *\r\n * This interceptor checks if the request URL includes 'api/v1/audit.notify'. If it does,\r\n * the request is passed through without any modifications. For other requests, it catches\r\n * errors and displays a toast notification for specific HTTP status codes (400, 403, 500, 503).\r\n *\r\n * @param request - The outgoing HTTP request.\r\n * @param next - The next handler in the HTTP request pipeline.\r\n * @returns An observable that either passes the request through or handles errors with toast notifications.\r\n */\r\nexport const toastInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\r\n if(request.url.includes('api/v1/audit.notify')) {\r\n return next(request);\r\n }\r\n\r\n return next(request).pipe(catchError((err) => {\r\n const { status, statusText, error } = err;\r\n if ([400, 403, 500, 503].includes(status)) {\r\n const { errorMessage = err.statusText, errorCodeText = `Error ${status}` } = error;\r\n toast.error(statusText, { description: `${errorCodeText}: ${errorMessage}`, closeButton: true, duration: 5000 });\r\n }\r\n\r\n return Promise.reject(err);\r\n }))\r\n};","// export * from \"./audit.interceptor\";\r\nexport * from \"./audit.interceptor\";\r\nexport * from \"./auth.interceptor\";\r\nexport * from \"./body.interceptor\";\r\nexport * from \"./error.interceptor\";\r\nexport * from './toast.interceptor';\r\n","import { Pipe, PipeTransform } from \"@angular/core\";\r\nimport highlightWords, { HighlightWords } from \"highlight-words\";\r\n\r\n/**\r\n * The HighlightWordPipe class is a custom pipe in the Atomic Angular library.\r\n * It is used to highlight a specific word within a given text.\r\n *\r\n * @remarks\r\n * This pipe takes in a `value` string, a `word` string to highlight, and an optional `clipBy` number to limit the length of the highlighted text.\r\n * It returns an array of `HighlightWords.Chunk` objects representing the highlighted portions of the text.\r\n *\r\n * @example\r\n * ```html\r\n * <div [innerHTML]=\"text | highlightWord:'search':10\"></div>\r\n * ```\r\n *\r\n */\r\n@Pipe({\r\n name: 'highlightWord',\r\n standalone: true,\r\n pure: true\r\n})\r\nexport class HighlightWordPipe implements PipeTransform {\r\n transform(value: string, word: string, clipBy?: number): HighlightWords.Chunk[] {\r\n return highlightWords({ text: value, query: word, clipBy }, );\r\n }\r\n}","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { AppStore } from '../stores/app.store';\n\n/**\n * Pipe that transforms a collection of strings into a corresponding icon class.\n *\n * This pipe uses the first element of the collection to determine the icon class\n * based on the source name. If the collection is empty or undefined, it returns\n * a default icon class.\n *\n * @deprecated This pipe is deprecated and will be removed in the future.\n *\n * @param collection - An array of strings representing the collection.\n * @returns A string representing the icon class.\n */\n@Pipe({\n name: 'sourceIcon',\n standalone: true,\n pure: true\n})\nexport class SourceIconPipe implements PipeTransform {\n appStore = inject(AppStore);\n\n transform(collection: string[]): string {\n if (collection === undefined || collection.length === 0) {\n return 'far fa-file';\n }\n const name = collection[0].split(\"/\")[1];\n const sources = this.appStore.sources();\n\n // workplace search uses a different format for sources\n if(Array.isArray(sources)){\n return sources.find((source: { name: string }) => source.name === name)?.icon || 'far fa-file';\n }\n\n return 'far fa-file';\n }\n}\n","import { inject } from '@angular/core';\r\nimport { ResolveFn } from '@angular/router';\r\n\r\nimport { AppStore } from '../stores/app.store';\r\n\r\n\r\n/**\r\n * Resolves the name of the default query from the application store.\r\n *\r\n * @param route - The current route snapshot.\r\n * @param state - The current router state snapshot.\r\n * @returns The name of the default query or an empty string if not available.\r\n */\r\nexport const queryNameResolver: ResolveFn<string> = (\r\n route,\r\n state\r\n) => {\r\n const appStore = inject(AppStore);\r\n return appStore.getDefaultQuery()?.name || '';\r\n};","import { InjectionToken } from \"@angular/core\";\n\nexport type PreviewHighlightName = 'company' | 'geo' | 'person' | 'extractslocations' | 'matchlocations';\nexport type PreviewHighlight = {\n name: PreviewHighlightName,\n color: string,\n bgColor: string\n};\n\n// pre-configured highlights's colors\nexport const HIGHLIGHTS = new InjectionToken<PreviewHighlight[]>('highlights', {\n factory: () => [\n {\n name: 'company',\n color: 'white',\n bgColor: '#FF7675'\n },\n {\n name: 'geo',\n color: 'white',\n bgColor: '#74B9FF'\n },\n {\n name: 'person',\n color: 'white',\n bgColor: '#00ABB5'\n },\n {\n name: 'extractslocations',\n color: 'black',\n bgColor: '#fffacd'\n },\n {\n name: 'matchlocations',\n color: 'black',\n bgColor: '#ff0'\n }\n ],\n});\n","import { HttpClient } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\nimport { Observable, catchError, map, tap, throwError } from 'rxjs';\r\n\r\nimport { Aggregation, AuditEvents, Query, Result, TreeAggregation, TreeAggregationNode, escapeExpr, globalConfig } from '@sinequa/atomic';\r\n\r\nimport { AggregationsStore, AppStore } from '../stores';\r\nimport { QueryService } from './query.service';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class AggregationsService {\r\n protected readonly http = inject(HttpClient);\r\n protected readonly queryService = inject(QueryService);\r\n\r\n appStore = inject(AppStore);\r\n aggregationsStore = inject(AggregationsStore);\r\n\r\n protected API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\r\n\r\n loadMore(query: Partial<Query>, aggregation: Aggregation, audit?: AuditEvents): Observable<Aggregation> {\r\n const { app } = globalConfig;\r\n\r\n // skip cached items for computation\r\n const skip = aggregation.items?.filter(i => !(i.$cached))?.length || 0;\r\n const count = 10;\r\n\r\n const aggregations = { [aggregation.name]: { skip, count } };\r\n\r\n const q: Partial<Query> = { ...query, action: \"aggregate\", aggregations }\r\n\r\n // add audit record if available\r\n const $auditRecord = audit ? { auditEvents: [audit] } : undefined;\r\n\r\n const body = {\r\n app,\r\n query: q,\r\n $auditRecord\r\n };\r\n\r\n return this.http.post(this.API_URL + \"/query\", body).pipe(\r\n map(result => {\r\n const { aggregations } = result as Result;\r\n const agg = aggregations[0];\r\n\r\n if (agg.items) {\r\n agg.$hasMore = agg.items.length > count;\r\n agg.items = [...aggregation.items, ...agg.items];\r\n } else {\r\n aggregation.$hasMore = false;\r\n return aggregation;\r\n }\r\n\r\n return agg;\r\n }),\r\n catchError(error => {\r\n console.log(\"aggregation.loadMore failure - error: \", error);\r\n return throwError(() => new Error(error));\r\n }),\r\n tap(response => console.log(\"aggregation.loadMore success - data: \", response)),\r\n );\r\n }\r\n\r\n open(query: Partial<Query>, aggregation: TreeAggregation, item: TreeAggregationNode): Observable<TreeAggregation> {\r\n const value = `/${item.$path}/*`;\r\n const expression = `${aggregation.column}: ${escapeExpr(value)}`;\r\n\r\n const q: Partial<Query> = {\r\n ...query,\r\n action: \"open\",\r\n open: [{ expression, aggregation: aggregation.name }]\r\n };\r\n\r\n return this.queryService.search(q).pipe(\r\n map(results => {\r\n // find the node in the tree and replace it with the new one\r\n const items = results.aggregations[0].items as TreeAggregationNode[];\r\n const newNode = this.findNode(items, item.$path);\r\n\r\n if (!newNode) {\r\n return aggregation;\r\n }\r\n // mark the node as opened\r\n newNode.$opened = true;\r\n return this.replaceInTree(aggregation, item.$path, newNode) as TreeAggregation;\r\n })\r\n )\r\n }\r\n private findNode(items: TreeAggregationNode[], path: string = \"\"): TreeAggregationNode | undefined {\r\n if (!items || items.length === 0) {\r\n return undefined;\r\n }\r\n\r\n for (const item of items) {\r\n if (item.$path === path) {\r\n return item;\r\n }\r\n if(item.items) {\r\n const found = this.findNode(item.items, path);\r\n if (found) {\r\n return found;\r\n }\r\n }\r\n }\r\n\r\n return undefined;\r\n }\r\n\r\n private replaceInTree(tree: any, valueToFind: string = \"\", newValue: TreeAggregationNode) {\r\n if (tree.$path === valueToFind) {\r\n return newValue;\r\n }\r\n\r\n if (tree.hasChildren && tree.items) {\r\n for (let i = 0; i < tree.items.length; i++) {\r\n tree.items[i] = this.replaceInTree(tree.items[i], valueToFind, newValue);\r\n }\r\n }\r\n\r\n return tree;\r\n }\r\n}\r\n","import { HttpClient, HttpContext, HttpHeaders, HttpParams } from '@angular/common/http';\r\nimport { Injectable, inject } from '@angular/core';\r\n\r\nimport { globalConfig, isObject } from '@sinequa/atomic';\r\nimport { Observable, throwError } from 'rxjs';\r\n\r\ntype Options = {\r\n headers?: HttpHeaders | {\r\n [header: string]: string | string[]\r\n },\r\n context?: HttpContext,\r\n observe?: 'body' | 'events' | 'response',\r\n params?: HttpParams | {\r\n [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>\r\n },\r\n reportProgress?: boolean,\r\n responseType: 'arraybuffer' | 'blob' | 'text' | 'json',\r\n withCredentials?: boolean\r\n}\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class JsonMethodPluginService {\r\n protected readonly http = inject(HttpClient);\r\n\r\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\r\n\r\n /**\r\n * Call a JsonMethod plugin using an HTTP POST\r\n *\r\n * @param method The name of the JsonMethod plugin\r\n * @param query Parameters to pass to the plugin\r\n * @param options HTTP options for the request\r\n * @returns An observable of the plugin's return value\r\n */\r\n post<U>(method: string, query: U, options?: Options) : Observable<any> {\r\n if (!isObject(query)) {\r\n return throwError(() => ({error: \"invalid query object\"}));\r\n }\r\n return this.http.post(`${this.API_URL}/plugin/${method}`, query, options as any);\r\n }\r\n\r\n /**\r\n * Call a JsonMethod plugin using an HTTP GET\r\n *\r\n * @param method The name of the JsonMethod plugin\r\n * @param query Parameters to pass to the plugin\r\n * @param options HTTP options for the request\r\n * @returns An observable of the plugin's return value\r\n */\r\n get<U extends Record<string, string | boolean | number | Date | object | undefined>>(method: string, query: U, options?: Options): Observable<any> {\r\n const params = new HttpParams();\r\n for (const key in query) {\r\n if (query[key] !== undefined) {\r\n params.set(key, query[key] as any);\r\n }\r\n }\r\n\r\n return this.http.get(`${this.API_URL}/plugin/${method}`, {\r\n params: params,\r\n ...options as any\r\n });\r\n }\r\n}\r\n","import { HttpClient } from \"@angular/common/http\";\r\nimport { EventEmitter, Inject, Injectable, InjectionToken, Injector, OnDestroy, inject } from \"@angular/core\";\r\nimport { DomSanitizer } from \"@angular/platform-browser\";\r\nimport { getState } from \"@ngrx/signals\";\r\nimport { EMPTY, Observable, Subject, catchError, tap } from \"rxjs\";\r\n\r\nimport { Article, Audit, AuditEventType, AuditEvents, CustomHighlights, PreviewData, Query, globalConfig } from \"@sinequa/atomic\";\r\n\r\nimport { SearchService } from \"../services/search.service\";\r\nimport { AppStore, ApplicationStore, Extract, QueryParamsStore, SelectionStore } from \"../stores\";\r\nimport { HIGHLIGHTS, PreviewHighlight } from \"../tokens\";\r\nimport { InlineWorker } from \"../utils\";\r\nimport { AuditService } from \"./audit.service\";\r\nimport { QueryService } from \"./query.service\";\r\n\r\n\r\nconst PREVIEW_CONFIG = new InjectionToken(\"Preview configuration\", {\r\n factory: () => ({\r\n allowWorker: false\r\n })\r\n});\r\n\r\ntype ExtractsLocations = Extract & {\r\n text: string // HTML text\r\n}\r\n\r\nexport type ExtractsEvents = 'fetching' | 'fetched' | 'error';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class PreviewService implements OnDestroy {\r\n protected readonly http = inject(HttpClient);\r\n protected readonly injector = inject(Injector);\r\n\r\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\r\n\r\n protected readonly applicationStore = inject(ApplicationStore);\r\n protected readonly selectionStore = inject(SelectionStore);\r\n protected readonly queryParamsStore = inject(QueryParamsStore);\r\n protected readonly appStore = inject(AppStore);\r\n\r\n protected readonly sanitizer = inject(DomSanitizer);\r\n\r\n protected readonly queryService = inject(QueryService);\r\n protected readonly searchService = inject(SearchService);\r\n protected readonly auditService = inject(AuditService);\r\n\r\n events = new EventEmitter<ExtractsEvents>();\r\n\r\n // ! worker\r\n onMessage = new Subject<unknown>();\r\n worker: InlineWorker | undefined;\r\n\r\n allowWoker = inject(PREVIEW_CONFIG).allowWorker;\r\n\r\n protected previewData: PreviewData | undefined;\r\n protected iframe: Window | null | undefined;\r\n\r\n protected highlightCategory = \"extractslocations\";\r\n\r\n extracts = [\"matchlocations\", \"extractslocations\", \"matchingpassages\"];\r\n entities = [\"company\", \"geo\", \"person\"];\r\n\r\n constructor(\r\n @Inject(HIGHLIGHTS) public highlights: PreviewHighlight[]) {\r\n window.addEventListener('message', this.receiveMessage.bind(this), false);\r\n }\r\n\r\n ngOnDestroy(): void {\r\n window.removeEventListener('message', this.receiveMessage.bind(this), false);\r\n }\r\n\r\n /**\r\n * Handles incoming messages from a MessageEvent.\r\n *\r\n * @param event - The MessageEvent containing the message data.\r\n *\r\n * The function processes messages of type 'ready' and 'get-html-results'.\r\n *\r\n * - For 'ready' messages:\r\n * - Initializes the preview iframe with the app name and highlights.\r\n * - If preview data is available, retrieves HTML content based on the current selection.\r\n *\r\n * - For 'get-html-results' messages:\r\n * - Updates the application store with the extracted HTML results.\r\n * - If no extracts are found, updates the application store with an empty array.\r\n */\r\n receiveMessage(event: MessageEvent) {\r\n const message = event.data;\r\n // the webworker needs to be initialized with the app name to be able to load the correct webworker file (worker.js)\r\n const { app } = globalConfig;\r\n\r\n // when the iframe is ready, we can send the init message\r\n if (message.type === 'ready') {\r\n // Initialize the preview iframe with the app name and highlights\r\n // app name is used to intialize the webworker\r\n this.sendMessage({ action: \"init\", highlights: this.highlights, appname: app });\r\n\r\n if (this.previewData) {\r\n const { id } = getState(this.selectionStore);\r\n this.events.emit('fetching');\r\n this.retrieveHtmlContent(id, this.highlightCategory, this.previewData);\r\n }\r\n }\r\n\r\n // when the iframe sends back the html content of the extracts (no worker)\r\n if (message.type === 'get-html-results') {\r\n const { id } = getState(this.selectionStore)\r\n\r\n if (id) {\r\n console.info(\"no worker\");\r\n const extracts = this.fetchExtracts(id, message.data, this.previewData!);\r\n this.applicationStore.updateExtracts(this.previewData?.record.id || '', extracts);\r\n this.events.emit('fetched');\r\n }\r\n }\r\n\r\n // when the iframe sends back the html content of the extracts (with worker)\r\n // we update the extracts in the application store\r\n if (message.type === 'get-html-results-webworker') {\r\n console.info(\"with worker\");\r\n\r\n if (message.data.extracts.length === 0) {\r\n this.events.emit('fetched');\r\n this.applicationStore.updateExtracts(this.previewData?.record.id || '', []);\r\n return;\r\n }\r\n\r\n const extracts: Extract[] = message.data.extracts.map((item: ExtractsLocations) => ({\r\n ...item,\r\n text: this.sanitizer.bypassSecurityTrustHtml(item.text)\r\n }));\r\n\r\n this.applicationStore.updateExtracts(this.previewData?.record.id || '', extracts);\r\n this.events.emit('fetched');\r\n }\r\n }\r\n\r\n /**\r\n * Generates a preview of the document with the given ID, applying the specified query parameters,\r\n * custom highlights, and audit events.\r\n *\r\n * @param id - The unique identifier of the document to preview.\r\n * @param q - Partial query parameters to customize the preview request.\r\n * @param customHighlights - Optional array of custom highlights to apply to the preview.\r\n * @param audit - Optional audit events to merge with the default audit record.\r\n * @returns An Observable that emits the preview data.\r\n */\r\n preview(id: string, q: Partial<Query>, customHighlights?: CustomHighlights[], audit?: AuditEvents): Observable<PreviewData> {\r\n const detail = this.getAuditPreviewDetail(id, q);\r\n\r\n const defaultAudit: AuditEvents = {\r\n type: \"Doc_Preview\",\r\n detail\r\n };\r\n\r\n // merge the default audit record with the provided audit record\r\n const $auditRecord = audit ? { auditEvents: [{ ...defaultAudit, ...audit }] } : { auditEvents: [defaultAudit] };\r\n\r\n const { app } = globalConfig;\r\n const query = { ...this.queryParamsStore.getQuery(), ...q };\r\n\r\n const browserUrl = `${window.location.origin}${window.location.pathname}`;\r\n\r\n const body = {\r\n app,\r\n action: \"get\",\r\n id,\r\n query: { name: query.name, text: query.text },\r\n browserUrl,\r\n customHighlights,\r\n $auditRecord\r\n };\r\n\r\n return this.http.post<PreviewData>(this.API_URL + \"/preview\", body)\r\n .pipe(\r\n tap((data: PreviewData) => this.setPreviewData(data)),\r\n catchError(error => {\r\n console.error(\"queryService.preview failure - error: \", error);\r\n return EMPTY;\r\n })\r\n );\r\n }\r\n\r\n /**\r\n * Closes the preview with the specified ID and updates the audit log.\r\n *\r\n * @param id - The ID of the preview to close.\r\n * @param query - The partial query object used to retrieve the preview detail.\r\n */\r\n close(id: string, query: Partial<Query>) {\r\n const detail = this.getAuditPreviewDetail(id, query);\r\n const auditEvent = {\r\n type: AuditEventType.Preview_Close,\r\n detail\r\n }\r\n Audit.notify(auditEvent);\r\n }\r\n\r\n /**\r\n * Previews an article in a new browser's tab.\r\n *\r\n * @param article - The article to preview.\r\n */\r\n openExternal(article: Article) {\r\n const query = this.queryParamsStore.getQuery();\r\n const detail = this.getAuditPreviewDetail(article.id, query);\r\n const result = this.searchService.result;\r\n this.auditService.notifyDocument(\r\n \"Click_ResultLink\",\r\n article,\r\n result || detail.resultid || \"\",\r\n {\r\n querytext: detail.querytext,\r\n querylang: detail.querylang,\r\n score: detail.score\r\n },\r\n {\r\n queryhash: result ? result.rfmQueryHash : undefined,\r\n querytext: detail.querytext,\r\n querylang: detail.querylang\r\n }\r\n )\r\n window.open(article.url1, '_blank', 'noopener noreferrer');\r\n }\r\n\r\n\r\n /**\r\n * Sets the iframe window object.\r\n *\r\n * @param iframe - The window object of the iframe or null to unset.\r\n */\r\n setIframe(iframe: Window | null) {\r\n this.iframe = iframe;\r\n }\r\n\r\n /**\r\n * Sets the preview data and updates the highlight category based on the provided data.\r\n *\r\n * @param data - The preview data to be set.\r\n *\r\n * If the provided data contains highlights per category with 'matchingpassages' having values,\r\n * the highlight category is set to \"matchingpassages\". Otherwise, it is set to \"extractslocations\".\r\n */\r\n setPreviewData(data: PreviewData) {\r\n this.previewData = data;\r\n\r\n if (data) {\r\n this.highlightCategory = data.highlightsPerCategory?.['matchingpassages']?.values.length ? \"matchingpassages\" : \"extractslocations\";\r\n }\r\n }\r\n\r\n /**\r\n * Sends a message to the iframe if it exists.\r\n *\r\n * @param message - The message to be sent. It can be of any type.\r\n */\r\n sendMessage(message: unknown) {\r\n if (this.iframe) {\r\n this.iframe!.postMessage(message, '*');\r\n }\r\n }\r\n\r\n /**\r\n * Get preview id for an entity value for an index\r\n * @param entity the entity type (i.e. \"geo\")\r\n * @param value the entity value (i.e. \"AUSTRALIA\")\r\n * @param index the entity index from its list\r\n * @returns the html id\r\n */\r\n getEntityId(entity: string, value: string, index: number): number | undefined {\r\n if (!this.previewData) return undefined;\r\n\r\n return this.previewData.highlightsPerLocation\r\n .filter(h => h.values.find(v => v === value))[index].positionInCategories[entity];\r\n }\r\n\r\n /**\r\n * Send a message to the prewiew iFrame with the required data to retrieve HTML content for a specific highlight category\r\n *\r\n * @param id - The unique identifier for the request.\r\n * @param highlightCategory - The category of highlights to retrieve.\r\n * @param previewData - The data containing highlights and their locations.\r\n */\r\n retrieveHtmlContent(id: string, highlightCategory: string, previewData: PreviewData) {\r\n // Generate the list of items we want to retrieve\r\n const ids = previewData.highlightsPerCategory[highlightCategory]?.values[0]?.locations.map(\r\n (_, i) => `${highlightCategory}_${i}`\r\n );\r\n\r\n if (this.allowWoker) {\r\n // if the worker is allowed, we send the message to the worker\r\n this.sendMessage({ action: 'get-html-webworker', id, ids, previewData });\r\n } else {\r\n this.sendMessage({ action: 'get-html', id, ids, previewData });\r\n }\r\n }\r\n\r\n /**\r\n * Sends a message to zoom in.\r\n *\r\n * This method triggers a \"zoom-in\" action by sending a message\r\n * with the specified action type.\r\n */\r\n zoomIn() {\r\n this.sendMessage({ action: \"zoom-in\" });\r\n }\r\n\r\n /**\r\n * Sends a message to zoom out the preview.\r\n *\r\n * This method triggers a \"zoom-out\" action by sending a message\r\n * to the relevant service or component.\r\n */\r\n zoomOut() {\r\n this.sendMessage({ action: \"zoom-out\" });\r\n }\r\n\r\n /**\r\n * Toggles the highlights based on the provided flags for extracts and entities.\r\n *\r\n * @param extracts - A boolean flag indicating whether to include extracts highlights.\r\n * @param entities - A boolean flag indicating whether to include entities highlights.\r\n */\r\n toggle(extracts: boolean, entities: boolean) {\r\n const extractsHighlights = extracts ? this.highlights.filter(h => this.extracts.includes(h.name)) : [];\r\n const entitiesHighlights = entities ? this.highlights.filter(h => this.entities.includes(h.name)) : [];\r\n const highlights = [...extractsHighlights, ...entitiesHighlights];\r\n\r\n this.sendMessage({ action: \"highlight\", highlights });\r\n }\r\n\r\n getAuditPreviewDetail(id: string, q: Partial<Query>) {\r\n const results = this.searchService.result;\r\n const queryLanguage = results?.queryAnalysis?.queryLanguage\r\n || q?.questionLanguage\r\n || this.appStore.getQueryByName(q.name!)?.questionLanguage;\r\n\r\n const record = this.previewData?.record;\r\n const collectionColumn = record?.collection;\r\n const collection = !!collectionColumn ? collectionColumn[0] : id.split(\"|\")[0];\r\n const rank = !!record ? record.rank : 0;\r\n const passages = record?.matchingpassages?.passages;\r\n const score = passages && passages.length ? passages[0].score : undefined;\r\n return {\r\n docid: id,\r\n rank,\r\n collection,\r\n source: collection.split(\"|\")[0],\r\n resultid: results.id,\r\n querylang: queryLanguage,\r\n querytext: q?.text,\r\n filename: record?.filename,\r\n fileext: record?.fileext,\r\n score\r\n }\r\n }\r\n\r\n private fetchExtracts(id: string, extracts: string[], data: PreviewData): Extract[] {\r\n // extracts contains the html of extracts in chronological order\r\n // locations contains the list of start positions sorted by score\r\n const locations = data.highlightsPerCategory[this.highlightCategory]?.values[0]?.locations || [];\r\n\r\n // first extract all the extracts locations\r\n let extractslocations = locations.map((l, relevanceIndex) => ({\r\n startIndex: l.start,\r\n relevanceIndex\r\n })) as ExtractsLocations[];\r\n\r\n // sort them by start index\r\n extractslocations.sort((a, b) => a.startIndex - b.startIndex);\r\n\r\n // then extract the text of each extract\r\n extractslocations = extractslocations.map((ex, textIndex) => ({\r\n ...ex,\r\n textIndex: textIndex,\r\n text: extracts[textIndex] || \"\",\r\n id: `${this.highlightCategory}_${textIndex}`,\r\n }));\r\n\r\n // then sanitize the text and remove empty extracts\r\n const _extracts = extractslocations.filter(item => item.text.trim().length > 0).map(item => ({\r\n ...item,\r\n text: this.sanitizer.bypassSecurityTrustHtml(item.text)\r\n }));\r\n\r\n // finally sort them by relevance index\r\n _extracts.sort((a, b) => a.relevanceIndex - b.relevanceIndex);\r\n\r\n return _extracts;\r\n }\r\n}","import { HttpClient } from \"@angular/common/http\";\r\nimport { Injectable, inject } from \"@angular/core\";\r\nimport { Query, TextChunk, TextLocation, globalConfig } from \"@sinequa/atomic\";\r\nimport { Observable, catchError, map } from \"rxjs\";\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class TextChunkService {\r\n protected readonly http = inject(HttpClient);\r\n\r\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\r\n\r\n\r\n /**\r\n * Retrieves text chunks based on the provided parameters.\r\n *\r\n * @param id - The ID of the record.\r\n * @param textChunks - An array of TextLocation objects representing the location of the text chunks.\r\n * @param highlights - An array of strings representing the highlights to be applied to the text chunks.\r\n * @param query - The query used to retrieve the text chunks.\r\n * @param leftSentencesCount - The number of sentences to include before the text chunks.\r\n * @param rightSentencesCount - The number of sentences to include after the text chunks.\r\n * @returns An Observable that emits an array of TextChunk objects.\r\n */\r\n getTextChunks(\r\n id: string,\r\n textChunks: TextLocation[],\r\n highlights: string[],\r\n query: Query,\r\n leftSentencesCount: number,\r\n rightSentencesCount: number\r\n ): Observable<TextChunk[]> {\r\n\r\n const body = {\r\n id,\r\n textChunks,\r\n highlights,\r\n query,\r\n leftSentencesCount,\r\n rightSentencesCount\r\n };\r\n\r\n return this.http.post<any>(this.API_URL + \"/doc.textchunks\", body)\r\n .pipe(\r\n map((response: {chunks: TextChunk[]}) => response.chunks),\r\n catchError(error => {\r\n console.error(\"TextChunkService.getTextChunks failure - error: \", error);\r\n return [];\r\n })\r\n );\r\n }\r\n}","/*\r\n * Public API Surface of atomic\r\n */\r\nexport * from \"./assistant\";\r\nexport * from \"./components\";\r\nexport * from \"./directives\";\r\nexport * from \"./guards\";\r\nexport * from \"./interceptors\";\r\nexport * from \"./models\";\r\nexport * from \"./pipes\";\r\nexport * from \"./resolvers\";\r\nexport * from \"./resources\";\r\nexport * from \"./services\";\r\nexport * from \"./stores\";\r\nexport * from \"./tokens\";\r\nexport * from \"./utils\";\r\nexport * from \"./web-services\";\r\n\r\n","/*\r\n * Public API Surface of atomic\r\n */\r\n\r\nexport * from \"./lib/public-api\";\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1.MenuComponent","catchError"],"mappings":"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"}
|