@sinequa/atomic-angular 0.1.36 → 0.1.37
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/fesm2022/sinequa-atomic-angular.mjs +561 -549
- package/fesm2022/sinequa-atomic-angular.mjs.map +1 -1
- package/index.d.ts +2687 -2687
- package/package.json +2 -5
- package/components/no-result/i18n/de.json +0 -5
- package/components/no-result/i18n/en.json +0 -5
- package/components/no-result/i18n/fr.json +0 -5
- package/components/sort-selector/i18n/de.json +0 -3
- package/components/sort-selector/i18n/en.json +0 -3
- package/components/sort-selector/i18n/fr.json +0 -3
- package/components/source/i18n/de.json +0 -3
- package/components/source/i18n/en.json +0 -3
- package/components/source/i18n/fr.json +0 -3
- package/features/alerts/i18n/de.json +0 -33
- package/features/alerts/i18n/en.json +0 -33
- package/features/alerts/i18n/fr.json +0 -33
- package/features/bookmarks/i18n/de.json +0 -11
- package/features/bookmarks/i18n/en.json +0 -11
- package/features/bookmarks/i18n/fr.json +0 -11
- package/features/collections/i18n/de.json +0 -17
- package/features/collections/i18n/en.json +0 -17
- package/features/collections/i18n/fr.json +0 -16
- package/features/dialogs/i18n/de.json +0 -15
- package/features/dialogs/i18n/en.json +0 -15
- package/features/dialogs/i18n/fr.json +0 -15
- package/features/did-you-mean/i18n/de.json +0 -5
- package/features/did-you-mean/i18n/en.json +0 -5
- package/features/did-you-mean/i18n/fr.json +0 -5
- package/features/drawer/i18n/de.json +0 -22
- package/features/drawer/i18n/en.json +0 -22
- package/features/drawer/i18n/fr.json +0 -22
- package/features/export/i18n/de.json +0 -10
- package/features/export/i18n/en.json +0 -10
- package/features/export/i18n/fr.json +0 -10
- package/features/feedback/i18n/de.json +0 -26
- package/features/feedback/i18n/en.json +0 -26
- package/features/feedback/i18n/fr.json +0 -26
- package/features/filters/i18n/de.json +0 -14
- package/features/filters/i18n/en.json +0 -14
- package/features/filters/i18n/fr.json +0 -14
- package/features/labels/i18n/de.json +0 -8
- package/features/labels/i18n/en.json +0 -8
- package/features/labels/i18n/fr.json +0 -8
- package/features/searches/i18n/de.json +0 -15
- package/features/searches/i18n/en.json +0 -15
- package/features/searches/i18n/fr.json +0 -15
- package/features/sign-in/i18n/de.json +0 -12
- package/features/sign-in/i18n/en.json +0 -12
- package/features/sign-in/i18n/fr.json +0 -14
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sinequa-atomic-angular.mjs","sources":["../../../src/components/deprecated/dropdown-list.ts","../../../src/components/deprecated/dropdown-input.ts","../../../src/components/backdrop/backdrop.service.ts","../../../src/components/backdrop/backdrop.component.ts","../../../src/stores/aggregations.store.ts","../../../src/services/app.service.ts","../../../src/stores/app.store.ts","../../../src/stores/application.store.ts","../../../src/services/principal.service.ts","../../../src/stores/principal.store.ts","../../../src/utils/debounced-signal.ts","../../../src/utils/inline-worker.ts","../../../src/utils/query.ts","../../../src/utils/routes.ts","../../../src/utils/theme-body-hook.ts","../../../src/resources/themes.ts","../../../src/utils/theme-registry.ts","../../../src/services/query.service.ts","../../../src/services/aggregations.service.ts","../../../src/guards/auth.guard.ts","../../../src/stores/user-settings/helpers.ts","../../../src/stores/user-settings/with-alerts.ts","../../../src/stores/user-settings/with-assistant.ts","../../../src/stores/user-settings/with-baskets.ts","../../../src/stores/user-settings/with-bookmarks.ts","../../../src/stores/user-settings/with-recent-searches.ts","../../../src/stores/user-settings/with-saved-searches.ts","../../../src/stores/user-settings/with-user-settings.ts","../../../src/stores/user-settings/user-settings.store.ts","../../../src/services/application.service.ts","../../../src/services/audit.service.ts","../../../src/services/autocomplete.service.ts","../../../src/services/json-method-plugin.service.ts","../../../src/services/navigation.service.ts","../../../src/tokens/app-features.ts","../../../src/tokens/highlights.ts","../../../src/services/preview.service.ts","../../../src/services/saved-searches.service.ts","../../../src/services/search.service.ts","../../../src/stores/selection.store.ts","../../../src/services/selection.service.ts","../../../src/services/selection-history.service.ts","../../../src/services/text-chunk.service.ts","../../../src/utils/sign-in.ts","../../../src/utils/bootstrap-app.ts","../../../src/stores/query-params.store.ts","../../../src/stores/theme.store.ts","../../../src/components/source/source.component.ts","../../../src/components/source/source.component.html","../../../src/components/document-locator/document-locator.component.ts","../../../src/components/error/error.component.ts","../../../src/components/loading/loading.component.ts","../../../src/components/metadata/metadata.ts","../../../src/components/missing-terms/missing-terms.component.ts","../../../src/components/missing-terms/missing-terms.component.html","../../../src/features/collections/dialogs/add.dialog.ts","../../../src/features/export/export.service.ts","../../../src/features/export/dialogs/export.dialog.ts","../../../src/components/multi-selection-toolbar/multi-selection-toolbar.ts","../../../src/directives/infinite-scroll.directive.ts","../../../src/directives/keyboard-navigator.directive.ts","../../../src/directives/open-article-on-ctrl-enter.directive.ts","../../../src/directives/overflow-manager.directive.ts","../../../src/features/drawer-stack/drawer-stack.service.ts","../../../src/directives/select-article-on-click.directive.ts","../../../src/directives/show-bookmark.directive.ts","../../../src/directives/theme-provider.directive.ts","../../../src/directives/child-marker.directive.ts","../../../src/pipes/highlight-word.pipe.ts","../../../src/pipes/source-icon.pipe.ts","../../../src/pipes/operator.ts","../../../src/pipes/syslang.ts","../../../src/pipes/transloco-date.pipe.ts","../../../src/components/navbar-tabs/navbar-tabs.components.ts","../../../src/components/no-result/no-result.ts","../../../src/components/pagination/pager.component.ts","../../../src/components/search/search-input.ts","../../../src/components/sort-selector/sort-selector.ts","../../../src/components/sort-selector/sort-selector.html","../../../src/components/sponsored-results/sponsored-results.component.ts","../../../src/components/theme/theme-selector.component.ts","../../../src/components/theme/theme-toggle.component.ts","../../../src/interceptors/audit.interceptor.ts","../../../src/interceptors/auth.interceptor.ts","../../../src/interceptors/body.interceptor.ts","../../../src/interceptors/error.interceptor.ts","../../../src/interceptors/toast.interceptor.ts","../../../src/interceptors/index.ts","../../../src/models/user-settings.ts","../../../src/resolvers/query-name-resolver.ts","../../../src/features/searches/search-footer.ts","../../../src/features/searches/search-header.ts","../../../src/features/searches/search-list.ts","../../../src/features/recent-searches/recent-searches.ts","../../../src/features/saved-searches/saved-searches.ts","../../../src/features/saved-searches/saved-search.dialog.ts","../../../src/features/bookmarks/bookmark-button.ts","../../../src/features/bookmarks/bookmarks.ts","../../../src/features/bookmarks/bookmarks.html","../../../src/features/collections/dialogs/delete.dialog.ts","../../../src/features/collections/collections.ts","../../../src/features/collections/collections.html","../../../src/features/alerts/dialogs/alert.dialog.ts","../../../src/features/alerts/alerts.ts","../../../src/features/alerts/alerts.html","../../../src/features/dialogs/override-user.dialog.ts","../../../src/features/dialogs/reset-user-settings.dialog.ts","../../../src/features/did-you-mean/did-you-mean.ts","../../../src/features/did-you-mean/did-you-mean.html","../../../src/features/sign-in/sign-in.ts","../../../src/features/sign-in/sign-in.html","../../../src/features/labels/label.service.ts","../../../src/features/labels/multiselect-labels.ts","../../../src/features/labels/dialogs/edit.dialog.ts","../../../src/features/feedback/dialogs/feedback.dialog.ts","../../../src/features/feedback/feedback.ts","../../../src/features/feedback/feedback.html","../../../src/features/filters/aggregation/aggregation-item.component.ts","../../../src/features/filters/aggregation/aggregation-item.component.html","../../../src/features/filters/aggregation/aggregation.component.ts","../../../src/features/filters/aggregation/aggregation.component.html","../../../src/features/filters/aggregation/date/date.component.ts","../../../src/features/filters/aggregation/date/date.component.html","../../../src/features/filters/buttons/filter-button.component.ts","../../../src/features/filters/filters.models.ts","../../../src/features/filters/more/more.component.ts","../../../src/features/filters/more/more-button.component.ts","../../../src/features/filters/filters-bar.component.ts","../../../src/features/drawer-stack/drawer-stack.component.ts","../../../src/features/drawer/drawer.service.ts","../../../src/features/drawer/drawer.component.ts","../../../src/features/drawer/navbar/drawer-navbar.component.ts","../../../src/features/drawer/navbar/drawer-navbar.component.html","../../../src/features/drawer/advanced-filters/advanced-filters.component.ts","../../../src/features/drawer/advanced-filters/advanced-filters.component.html","../../../src/features/drawer/advanced-search/advanced-search.component.ts","../../../src/features/drawer/advanced-search/advanced-search.component.html","../../../src/features/drawer/preview/drawer-preview.component.ts","../../../src/features/drawer/preview/drawer-preview.component.html","../../../src/public-api.ts","../../../src/sinequa-atomic-angular.ts"],"sourcesContent":["import { Component, input, output } from '@angular/core';\nimport { DropdownItem } from './dropdown-input';\n\n@Component({\n selector: 'dropdown-list, DropdownList',\n standalone: true,\n template: `\n @for (item of items(); track $index) {\n <span class=\"bg-primary text-primary-foreground m-1 inline-flex cursor-default select-none items-center rounded-full px-2 py-1 text-sm font-semibold\">\n {{ item.display || item.value }}\n <svg\n (click)=\"onClick.emit(item)\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"ml-2 cursor-pointer\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" />\n <line x1=\"5\" y1=\"5\" x2=\"11\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n <line x1=\"11\" y1=\"5\" x2=\"5\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </svg>\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, DropdownContentComponent } from '@sinequa/ui';\n\nimport { DropdownListComponent } from './dropdown-list';\n\nexport interface DropdownItem {\n display?: string;\n value: string;\n}\n\n@Component({\n selector: 'dropdown-input, DropdownInput',\n standalone: true,\n imports: [DropdownComponent, DropdownListComponent, DropdownContentComponent],\n template: `\n @if (label()) {\n <p class=\"font-semibold\">{{ label() }}</p>\n }\n <Dropdown class=\"block w-full\">\n <input\n #searchInput\n class=\"w-1/2 grow rounded border border-neutral-200 p-2 focus:outline-none group-hover:bg-white\"\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 <DropdownList class=\"mb-4\" [items]=\"selected()\" (onClick)=\"removeItem.emit($event)\" />\n\n <DropdownContent class=\"mt-[-1.5rem] w-max\">\n @if (!suggestions().length) {\n {{ noResultLabel() }}\n } @else {\n <ul class=\"data-list-xs my-2 max-h-44 flex-grow overflow-auto\">\n @for (suggestion of suggestions(); track $index) {\n <li class=\"data-list-item flex cursor-pointer items-baseline gap-2 p-2\" (click)=\"addItem.emit(suggestion)\">\n {{ suggestion.display || suggestion.value }}\n </li>\n }\n </ul>\n }\n </DropdownContent>\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 { 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 { Component, HostBinding, OnDestroy, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { BackdropService } from './backdrop.service';\n\n@Component({\n selector: 'app-backdrop',\n standalone: true,\n imports: [],\n template: ``,\n host: {\n class: 'z-[var(--z-backdrop)] bg-backdrop absolute bottom-0 left-0 right-0 top-0 hidden select-none'\n },\n styles: [\n `\n :host {\n --backdrop-animation-duration: 250ms;\n\n animation: hide-backdrop var(--backdrop-animation-duration, 250ms) ease-out;\n\n &[backdrop-visible='true'] {\n display: block;\n animation: show-backdrop var(--backdrop-animation-duration, 250ms) ease-out;\n }\n\n @keyframes show-backdrop {\n 0% {\n display: none;\n opacity: 0;\n }\n 1% {\n display: block;\n }\n 100% {\n opacity: 1;\n }\n }\n\n @keyframes hide-backdrop {\n 0% {\n display: block;\n opacity: 1;\n }\n 99% {\n opacity: 0;\n }\n 100% {\n display: none;\n }\n }\n }\n `\n ]\n})\nexport class BackdropComponent implements OnDestroy {\n @HostBinding('attr.backdrop-visible')\n public backdropVisible: boolean = false;\n\n private readonly backdrop = inject(BackdropService);\n private readonly sub = new Subscription();\n\n constructor() {\n this.sub.add(this.backdrop.isVisible.subscribe(state => (this.backdropVisible = state)));\n }\n\n ngOnDestroy(): void {\n this.sub.unsubscribe();\n }\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { getState, patchState, signalStore, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\n\nimport { Aggregation } from '@sinequa/atomic';\n\nexport type AggregationsState = {\n aggregations: Aggregation[];\n};\n\nexport const AggregationsStore = signalStore(\n // providing store at the root level\n { providedIn: 'root' },\n withDevtools('Aggregations'),\n\n withAggregationsFeatures()\n);\n\nexport function withAggregationsFeatures() {\n return signalStoreFeature(\n withState({ aggregations: [] as Aggregation[] } as AggregationsState),\n withMethods(store => ({\n /**\n * Updates the state with the provided aggregations.\n *\n * @param {Aggregation[]} aggregations - The new aggregations to update the state with.\n */\n update(aggregations: Aggregation[]) {\n patchState(store, state => {\n return { ...state, aggregations };\n });\n },\n /**\n * Updates an existing aggregation in the store.\n *\n * @param aggregation - The aggregation object to update.\n * @returns void\n */\n updateAggregation(aggregation: Aggregation) {\n patchState(store, state => {\n // aggregation name/column lookup must be case insensitive\n const index = state.aggregations.findIndex(a => a.name.toLocaleLowerCase() === aggregation.name.toLocaleLowerCase());\n if (index !== -1) {\n state.aggregations[index] = aggregation;\n }\n return { ...state };\n });\n },\n /**\n * Clears the aggregations in the store by setting the `aggregations` property to an empty array.\n *\n * @remarks\n * This method uses the `patchState` function to update the state of the store.\n */\n clear() {\n patchState(store, state => {\n return { ...state, aggregations: [] };\n });\n },\n\n /**\n * Retrieves an aggregation object from the store based on the specified name and kind.\n * The lookup is case-insensitive and can be performed either by the aggregation's column or name.\n *\n * @param name - The name of the aggregation to search for.\n * @param kind - The type of lookup to perform.\n * Use 'column' to search by the aggregation's column, or 'name' to search by its name.\n * Defaults to 'name'.\n * @returns The matching aggregation object if found, otherwise `undefined`.\n */\n getAggregation(name: string, kind: 'column' | 'name' = 'name') {\n // aggregation name/column lookup must be case insensitive\n const aggregations = store.aggregations();\n if (!aggregations) return undefined;\n\n return aggregations.find(aggregation =>\n kind === 'column'\n ? aggregation.column?.toLocaleLowerCase() === name.toLocaleLowerCase()\n : aggregation.name.toLocaleLowerCase() === name.toLocaleLowerCase()\n );\n }\n }))\n );\n}\n","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { catchError, EMPTY, Observable } from 'rxjs';\n\nimport { CCApp, globalConfig } from '@sinequa/atomic';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AppService {\n protected readonly http = inject(HttpClient);\n\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n /**\n * Retrieves the application configuration from the server.\n *\n * @param appName - The name of the application to fetch the configuration for.\n *\n * @returns {Observable<CCApp>} An observable that emits the application configuration.\n *\n * @remarks\n * This method constructs an HTTP GET request to fetch the application configuration\n * using the `app` parameter from the global configuration. If the request fails,\n * it logs the error to the console and returns an empty observable.\n *\n * @example\n * ```typescript\n * appService.getApp().subscribe(appConfig => {\n * console.log(appConfig);\n * });\n * ```\n */\n getApp(appName?: string): Observable<CCApp> {\n const app = appName || globalConfig.app;\n\n const params = new HttpParams().set('app', app || '');\n\n return this.http.get<CCApp>(this.API_URL + '/app', { params }).pipe(\n catchError(error => {\n console.error('AppService.getApp failure - error: ', error);\n return EMPTY;\n })\n );\n }\n}\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 { catchError, firstValueFrom, map } from 'rxjs';\n\nimport { Aggregation, CCApp, CCColumn, CCQuery, CCWebService, EngineType } from '@sinequa/atomic';\n\nimport { CFilter, CFilterItem, CJsonMint, CSources, SideCJson } from '../models/custom-json';\nimport { AppService } from '../services/app.service';\nimport { AggregationsStore } from './aggregations.store';\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',\n 'Sources',\n 'Company',\n 'People',\n 'Formats',\n 'Modified',\n 'Dates',\n 'Sizes',\n 'Languages',\n 'Concepts',\n 'DocFormat',\n 'Geo',\n 'Person',\n 'Treepath',\n 'DocumentLanguages',\n '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(\n appService.getApp().pipe(\n catchError(error => {\n console.error('Error fetching app data:', error);\n throw error;\n }),\n map(app => patchState(store, app))\n )\n );\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()).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 * Determines whether labels are allowed by checking the presence of\n * both private and public label fields in the 'labels' web service.\n *\n * @returns {boolean} `true` if both `privateLabelsField` and `publicLabelsField`\n * are defined in the 'labels' web service; otherwise, `false`.\n */\n allowLabels(): boolean {\n const labels = this.getWebServiceByType('labels') as CCWebServiceLabels;\n return labels?.privateLabelsField !== undefined && labels?.publicLabelsField !== undefined;\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 * Retrieves a column definition from the application's state schema by its name.\n *\n * @param column - The name of the column to retrieve.\n * @returns The column definition as a `CCColumn` object if found, or `undefined` if the column does not exist.\n */\n getColumn(column: string): CCColumn | undefined {\n const state = getState(store) as CCApp;\n const schema = state.indexes?.['_']?.columns as Record<string, CCColumn>;\n return schema[column];\n },\n /**\n * Determines if the specified column is of a date-related type.\n *\n * This method checks if the column's type matches one of the following:\n * - `EngineType.date`\n * - `EngineType.dateTime`\n * - `EngineType.time`\n *\n * @param column - The name of the column to check.\n * @returns `true` if the column is of a date-related type; otherwise, `false`.\n */\n isDateColumn(column: string): boolean {\n const col = this.getColumn(column);\n if (col) {\n return col.eType === EngineType.date || col.eType === EngineType.dateTime || col.eType === EngineType.time;\n }\n return false;\n },\n /**\n * Checks if the specified query name corresponds to a tab search.\n * A tab search is defined by the presence of an active tab search configuration\n * with at least one tab defined in the query.\n *\n * @param queryName - The name of the query to check.\n * @returns `true` if the query is a tab search; otherwise, `false`.\n */\n isTabSearch(queryName: string): boolean {\n const query = this.getQueryByName(queryName);\n if (!query) return false;\n const tabSearch = query.tabSearch;\n return !(!tabSearch || !tabSearch.column || !tabSearch.isActive || !tabSearch.tabs || tabSearch.tabs.length === 0);\n },\n /**\n * Retrieves the aggregation count for a specific query and aggregation name.\n * If the count is not defined, it defaults to 10.\n *\n * @param queryName - The name of the query to retrieve the aggregation from.\n * @param aggregationName - The name of the aggregation to retrieve the count for.\n * @returns The count of the specified aggregation, or 10 if not defined.\n */\n getAggregationCount(queryName: string | undefined, aggregationName: string): number {\n if (!queryName) {\n // If queryName is not provided, return the default count\n return 10; // Default to 10 if queryName is not defined\n }\n // If queryName is provided, retrieve the query and its aggregation count\n const query = this.getQueryByName(queryName);\n const agg = query?.aggregations.find(aggregation => aggregation.name === aggregationName);\n return agg ? agg.count : 10; // Default to 10 if count is not defined\n }\n })),\n withMethods((store, aggregationsStore = inject(AggregationsStore), aggregationsNames = inject(AGGREGATIONS_NAMES)) => ({\n /**\n * Retrieves the sorted aggregations based on the query name included in the route data.\n * @param route - The route including the query name to fetch the aggregations for.\n * @returns An array of sorted aggregations.\n */\n getAuthorizedFilters(route: ActivatedRoute) {\n // Get the query name from the route data or use the default query name\n const { queryName = store.getDefaultQuery()?.name } = route.snapshot.data;\n const { aggregations = [] } = store.getQueryByName(queryName) || ({} as CCQuery);\n\n // when no results are returned, the aggregations may be not available\n const currentAggregations = aggregationsStore.aggregations()?.filter(aggregation => aggregationsNames.includes(aggregation.name.trim())) || [];\n\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 currentAggregations.toSorted(\n (a: Aggregation, b: Aggregation) => queryAggregationsOrder.indexOf(a.name) - queryAggregationsOrder.indexOf(b.name)\n );\n }\n // return the default order\n return currentAggregations;\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 // Helper function to parse JSON data with common error handling and fallback to default customJSONs\n const parseCustomJson = <T>(jsonName: string, defaultValue: T): T => {\n // Check if customJSONs is defined and is an array\n // If not, return the default value or the value from the main data object\n if (customJSONs() === undefined || Array.isArray(customJSONs()) === false) {\n return (data() as CJsonMint)[jsonName] || defaultValue;\n }\n\n // Find the custom JSON by name, ignoring case\n // If not found, return the default value or the value from the main data object\n const json = customJSONs()?.find(json => json.name.toLocaleLowerCase() === jsonName);\n if (json === undefined) {\n return (data() as CJsonMint)[jsonName] || defaultValue;\n }\n\n try {\n // Parse the JSON data\n const parsedData = typeof json?.data === 'string' ? JSON.parse(json.data) : json?.data || defaultValue;\n // If parsedData is a plain empty object ({}), treat it as null/undefined\n if (\n parsedData &&\n typeof parsedData === 'object' &&\n !Array.isArray(parsedData) &&\n Object.getPrototypeOf(parsedData) === Object.prototype &&\n Object.entries(parsedData).length === 0\n ) {\n return (data() as CJsonMint)[jsonName] ?? defaultValue;\n }\n return parsedData ?? (data() as CJsonMint)[jsonName] ?? defaultValue;\n } catch (error) {\n console.error(`Error parsing ${jsonName} JSON:`, error);\n return (data() as CJsonMint)[jsonName] ?? defaultValue;\n }\n };\n\n return {\n customizationJson: computed(() => data() as CJsonMint),\n sources: computed(() => parseCustomJson<CSources>('sources', {})),\n filters: computed(() => parseCustomJson<CFilter[]>('filters', [])),\n general: computed(() => parseCustomJson<CJsonMint['general']>('general', {})),\n assistants: computed(() => parseCustomJson<Record<string, any>>('assistants', {}))\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.toLocaleLowerCase() === name.toLocaleLowerCase());\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.toLocaleLowerCase() === column.toLocaleLowerCase();\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.toLocaleLowerCase() === column.toLocaleLowerCase();\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.toLocaleLowerCase() === column.toLocaleLowerCase();\n\n // Check if the filters custom JSON file is available in the store\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 * Determines whether a specific assistant is allowed based on its presence and configuration in the store.\n *\n * @param assistantName - The name of the assistant to check.\n * @returns `true` if the assistant exists in the store and has a defined `service_id` in its `defaultValues`; otherwise, `false`.\n */\n isAssistantAllowed(assistantName: string): boolean {\n const assistants = store.assistants();\n if (assistants === undefined || Object.keys(assistants).length === 0) return false;\n return assistants[assistantName]?.['defaultValues']?.['service_id'];\n }\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 interface ApplicationState {\n ready: 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({ ready: false }),\n\n withMethods(store => ({\n update(state: Partial<ApplicationState>) {\n patchState(store, currentState => ({ ...currentState, ...state }));\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 );\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';\nimport { Injectable, inject } from '@angular/core';\nimport { EMPTY, Observable, catchError } from 'rxjs';\n\nimport { Principal, globalConfig } from '@sinequa/atomic';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PrincipalService {\n protected readonly http = inject(HttpClient);\n\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n /**\n * Retrieves the principal information from the server.\n *\n * @returns Observable<Principal> An observable that emits the principal information.\n *\n * @remarks\n * This method sends a GET request to the API endpoint to fetch the principal data.\n * It includes query parameters to specify the action and to indicate that no authentication is required.\n * In case of an error, it logs the error to the console and returns an empty observable.\n *\n * @example\n * ```typescript\n * principalService.getPrincipal().subscribe(principal => {\n * console.log(principal);\n * });\n * ```\n */\n getPrincipal(): Observable<Principal> {\n const params = new HttpParams().set('action', 'get');\n params.append('noAuthentication', 'true');\n\n return this.http.get<Principal>(this.API_URL + '/principal', { params }).pipe(\n catchError(error => {\n console.error('PrincipalService.getPrincipal failure - error: ', error);\n return EMPTY;\n })\n );\n }\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { computed, inject } from '@angular/core';\nimport { patchState, signalStore, signalStoreFeature, withComputed, withMethods, withState } from '@ngrx/signals';\nimport { firstValueFrom, map } from 'rxjs';\n\nimport { Principal, globalConfig } from '@sinequa/atomic';\n\nimport { PrincipalService } from '../services/principal.service';\n\nexport type PrincipalState = {\n principal: Principal;\n userOverrideActive: boolean;\n};\n\nexport const PrincipalStore = signalStore(\n { providedIn: 'root' },\n withDevtools('Principal'),\n\n withState({ principal: {}, userOverrideActive: false } as PrincipalState),\n withComputed(({ principal, userOverrideActive }) => ({\n allowUserOverride: computed(() => principal().isAdministrator && userOverrideActive() === false),\n isOverridingUser: computed(() => userOverrideActive() === true)\n })),\n\n withPrincipalFeatures()\n);\n\n/**\n * Enhances the store with principal-related features.\n *\n * This function integrates state, methods, and computed properties related to the principal.\n *\n * @returns A feature that can be added to a signal store.\n *\n * @feature\n * - State:\n * - `principal`: An object representing the principal.\n * - `userOverrideActive`: A boolean indicating if user override is active.\n *\n * - Methods:\n * - `initialize()`: Initializes the principal state by fetching the principal data from the `PrincipalService`.\n *\n * - Computed Properties:\n * - `allowUserOverride`: A computed boolean indicating if user override is allowed based on the principal's administrator status and the `userOverrideActive` state.\n * - `isOverridingUser`: A computed boolean indicating if the user override is currently active.\n */\nexport function withPrincipalFeatures() {\n return signalStoreFeature(\n withMethods((store, principalService = inject(PrincipalService)) => ({\n /**\n * Initializes the principal store by fetching the principal data from the principal service.\n * It patches the store with the fetched principal data and a user override active flag from the global configuration.\n *\n * @returns A promise that resolves when the principal data has been fetched and the store has been patched.\n */\n initialize() {\n return firstValueFrom(\n principalService.getPrincipal().pipe(\n map(principal => {\n const { userOverrideActive = false } = globalConfig;\n patchState(store, { principal, userOverrideActive });\n })\n )\n );\n }\n }))\n );\n}\n","import { effect, signal, Signal } from '@angular/core';\n\n/**\n * Creates a debounced signal that updates its value after a specified timeout.\n *\n * @template T - The type of the signal value.\n * @param Signal<T> input - The input signal whose value will be debounced.\n * @param number [timeOutMs=0] - The debounce timeout in milliseconds. Defaults to 0.\n * @returns Signal<T> - A new signal that updates its value after the specified debounce timeout.\n *\n * @example\n * ```ts\n * const input = signal('');\n * const debounced = debouncedSignal(input, 1000);\n *\n * contructor() {\n * effect(() => {\n * console.log(debounced());\n * // will log the input value after 1 second of inactivity.\n * });\n * }\n * ...\n * <input [ngModel]=\"input()\" (ngModelChange)=\"input.set($event)\">\n * ```\n */\nexport function debouncedSignal<T>(input: Signal<T>, timeOutMs = 0): Signal<T> {\n const debounceSignal = signal(input());\n let timeout: any;\n effect(onCleanUp => {\n const value = input();\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n debounceSignal.set(value);\n }, timeOutMs);\n onCleanUp(() => clearTimeout(timeout));\n });\n return debounceSignal;\n}\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\n .toString()\n .replace(/^[^{]*{\\s*/, '')\n .replace(/\\s*}[^}]*$/, '');\n\n try {\n this.worker = new Worker(URL.createObjectURL(new Blob([functionBody], { type: 'text/javascript' })));\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 } 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}\n","import { assertInInjectionContext, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { getQueryParamsFromUrl, Query } from '@sinequa/atomic';\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, n } = 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 || {};\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 params = getQueryParamsFromUrl(window.location.toString());\n const name = query?.name || getQueryNameFromRoute() || params?.name;\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","import { assertInInjectionContext, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\n/**\n * Retrieves the current path from the Angular `ActivatedRoute` service.\n *\n * @returns {string | undefined} The current path as a string, or `undefined` if the path cannot be determined.\n */\nexport function getCurrentPath(): string | undefined {\n assertInInjectionContext(getCurrentPath);\n\n const route = inject(ActivatedRoute);\n\n return route?.snapshot.url.toString();\n}\n\n/**\n * Retrieves the current query name based on the current path and router configuration.\n *\n * This function asserts that it is being called within an injection context and then\n * uses Angular's dependency injection to get the router configuration. It matches the\n * current path against the router's configuration to find the corresponding query name.\n *\n * @returns {string | undefined} The name of the current query if found, otherwise undefined.\n */\nexport function getCurrentQueryName(): string | undefined {\n assertInInjectionContext(getCurrentQueryName);\n\n const routes = inject(Router).config;\n\n const path = getCurrentPath();\n\n return routes.find(r => r.path === 'search')?.children?.find(r => r.path === path)?.data?.['queryName'];\n}\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(app: ApplicationRef, params: ThemeBodyHookParameters | undefined): ApplicationRef {\n runInInjectionContext(app.injector, () => {\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 return app;\n}\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];\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 { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { EMPTY, Observable, catchError, map, of, tap } from 'rxjs';\n\nimport { Aggregation, Article, AuditEvents, Query, Result, TreeAggregation, buildPathsAndLevels, error, globalConfig, info, warn } from '@sinequa/atomic';\n\nimport { AppStore, QueryParamsStore } from '../stores';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class QueryService {\n protected readonly http = inject(HttpClient);\n\n private readonly appStore = inject(AppStore);\n private readonly queryParamsStore = inject(QueryParamsStore);\n\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n // Represents the last result of a search operation with getResult().\n public result: Result = {} as Result;\n public audit?: AuditEvents;\n\n /**\n * Performs a search query.\n *\n * @param q - The partial query object.\n * @param includeQueryParams - Indicates whether to include query parameters automatically in the request.\n * @param audit - The audit events object.\n * @returns An observable that emits the search results.\n */\n search(q?: Partial<Query>, includeQueryParams = true, audit?: AuditEvents): Observable<Result> {\n // if audit is set, always use it\n // if this.audit is set and audit is not set use this.audit\n // if this.audit is not set and audit is not set use default audit\n const newAudit = audit ?? this.audit ?? { type: 'Search_Text', detail: { querytext: q?.text } };\n const $auditRecord = { auditEvents: [newAudit] };\n\n this.audit = undefined; // reset this.audit after using it\n\n const { app } = globalConfig;\n const currentQuery = q ?? this.queryParamsStore.getQuery();\n const query = includeQueryParams ? { ...this.queryParamsStore.getQuery(), ...currentQuery } : currentQuery;\n\n // Check if the search query is empty and if empty searches are allowed\n // If not allowed, return an empty result\n const allowEmptySearch = this.appStore.allowEmptySearch(query?.name || '');\n if (allowEmptySearch === false && query?.text === '') {\n warn('QueryService.search: Empty search query is not allowed. Returning empty result.');\n return of({ records: [] as Article[] } as Result);\n }\n\n const body = {\n app,\n query,\n $auditRecord\n };\n\n return this.http.post<Result>(this.API_URL + '/query', body).pipe(\n catchError(err => {\n error('queryService.getResults failure - error: ', err);\n return of({} as Result);\n }),\n map((result: Result) => {\n // update $hasMore flag\n result.aggregations?.forEach((agg: Aggregation) => {\n const count = this.appStore.getAggregationCount(result.queryName, agg.name) || 10;\n agg.$hasMore = false;\n if (!agg.isDistribution && !agg.isTree && agg.items) {\n if (agg.items.length > count) {\n agg.items = agg.items.slice(0, count);\n agg.$hasMore = true;\n }\n }\n if (agg.isTree) {\n buildPathsAndLevels(agg as TreeAggregation);\n }\n });\n return result;\n }),\n map(result => {\n result.records?.map((article: Article) => Object.assign(article, { value: article.title, type: 'default' }));\n return result;\n }),\n map(result => {\n const r = {\n ...result,\n nextPage: result.page !== undefined && result.page < Math.ceil(result.rowCount / result.pageSize) ? result.page + 1 : undefined,\n previousPage: result.page !== undefined && result.page > 1 ? result.page - 1 : undefined\n };\n return r;\n }),\n tap(response => {\n this.result = response;\n info('queryService.getResults success - data: ', response);\n })\n );\n }\n\n /**\n * Performs a bulk search operation.\n *\n * @param q An array of Query objects representing the search queries.\n * @param audit An optional AuditEvents object for auditing purposes.\n * @returns An Observable that emits an array of Result objects.\n */\n bulkSearch(q: Query[], audit?: AuditEvents): Observable<Result[]> {\n const { app = '' } = globalConfig;\n\n const body: {\n methods: {\n method: string;\n app: string;\n query: Query;\n }[];\n propagateErrors: true;\n $auditRecord?: { auditEvents: [AuditEvents] };\n } = {\n methods: [],\n propagateErrors: true,\n $auditRecord: { auditEvents: [audit!] }\n };\n\n for (const query of q) {\n body.methods.push({\n method: 'query',\n app,\n query\n });\n }\n\n return this.http.post<{ results: Result[] }>(this.API_URL + '/multi', body).pipe(\n catchError(err => {\n error('queryService.bulkSearch failure - error: ', err);\n return EMPTY;\n }),\n map(response => {\n // update $hasMore flag\n response.results.forEach((result: Result) => {\n result.aggregations.forEach((agg: Aggregation) => {\n agg.$hasMore = false;\n if (!agg.isDistribution && !agg.isTree && agg.items) {\n const count = this.appStore.getAggregationCount(result.queryName, agg.name) || 10;\n if (agg.items.length > count) {\n agg.items = agg.items.slice(0, count);\n agg.$hasMore = true;\n }\n }\n if (agg.isTree) {\n buildPathsAndLevels(agg as TreeAggregation);\n }\n });\n });\n\n return response.results;\n }),\n map(results => {\n results.forEach(result => result.records?.map((article: Article) => Object.assign(article, { value: article.title, type: 'default' })));\n return results;\n }),\n map(results => {\n return results.map(result => {\n const r = {\n ...result,\n nextPage: result.page < Math.ceil(result.rowCount / result.pageSize) ? result.page + 1 : undefined,\n previousPage: result.page > 1 ? result.page - 1 : undefined\n };\n return r;\n });\n }),\n // map(response => ResultsSchema.parse(response) as T),\n tap(response => {\n info('queryService.bulkSearch success - data: ', response);\n })\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 const audit = {\n type: 'Search_GotoPage',\n detail: {\n page: page,\n fromresultid: this.result ? this.result.id : null\n }\n };\n\n this.queryParamsStore.patch({ page }, audit);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\nimport { Observable, catchError, map, tap, throwError } from 'rxjs';\n\nimport {\n Aggregation,\n AggregationItem,\n AuditEvents,\n FieldValue,\n LegacyFilter,\n Query,\n Result,\n TreeAggregation,\n TreeAggregationNode,\n escapeExpr,\n globalConfig,\n notify\n} from '@sinequa/atomic';\n\nimport { AggregationListItem, CFilter, CFilterItem } from '../models';\nimport { AggregationsStore, AppStore, QueryParamsStore } from '../stores';\nimport { QueryService } from './query.service';\n\nexport type AggEx = Aggregation & {\n display?: string;\n icon?: string;\n hidden?: boolean;\n searchable?: boolean;\n};\n\nexport const NON_SEARCHABLE_DEFAULTS: string[] = ['concepts', 'size'];\n\nexport const NON_SEARCHABLE_COLUMNS = new InjectionToken<string[]>('Non searchable columns', {\n factory: () => NON_SEARCHABLE_DEFAULTS\n});\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AggregationsService {\n protected readonly http = inject(HttpClient);\n protected readonly queryService = inject(QueryService);\n\n appStore = inject(AppStore);\n aggregationsStore = inject(AggregationsStore);\n queryParamsStore = inject(QueryParamsStore);\n\n nonSearchableColumns = inject(NON_SEARCHABLE_COLUMNS);\n\n protected API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n loadMore(query: Partial<Query>, aggregation: Aggregation, audit?: AuditEvents): Observable<Aggregation> {\n const { app } = globalConfig;\n\n // skip cached items for computation\n const skip = aggregation.items?.filter(i => !i.$cached)?.length || 0;\n const count = this.appStore.getAggregationCount(query.name, aggregation.name) || 10;\n\n const aggregations = { [aggregation.name]: { skip, count } };\n\n const q: Partial<Query> = { ...query, action: 'aggregate', aggregations };\n\n // add audit record if available\n const $auditRecord = audit ? { auditEvents: [audit] } : undefined;\n\n const body = {\n app,\n query: q,\n $auditRecord\n };\n\n return this.http.post(this.API_URL + '/query', body).pipe(\n map(result => {\n const { aggregations } = result as Result;\n const agg = aggregations[0];\n\n if (agg.items) {\n agg.$hasMore = agg.items.length > count;\n agg.items = [...aggregation.items, ...agg.items.slice(0, count)];\n } else {\n aggregation.$hasMore = false;\n return aggregation;\n }\n\n return agg;\n }),\n catchError(error => {\n console.error('aggregation.loadMore failure - error: ', error);\n return throwError(() => new Error(error));\n }),\n tap(response => {\n console.info('aggregation.loadMore success - data: ', response);\n })\n );\n }\n\n open(query: Partial<Query>, aggregation: TreeAggregation, item: TreeAggregationNode): Observable<TreeAggregation> {\n const value = `/${item.$path}/*`;\n const expression = `${aggregation.column}:${escapeExpr(value)}`;\n\n const q: Partial<Query> = {\n ...query,\n action: 'open',\n open: [{ expression, aggregation: aggregation.name }]\n };\n\n return this.queryService.search(q).pipe(\n map(results => {\n // find the node in the tree and replace it with the new one\n const items = results.aggregations[0].items as TreeAggregationNode[];\n\n // if the open call returns no items, we need to update the node to indicate it has no children\n if (!items) {\n notify.info('No children found');\n return aggregation;\n }\n\n const newNode = this.findNode(items, item.$path);\n if (!newNode) {\n return aggregation;\n }\n\n // mark the node as opened\n newNode.$opened = true;\n newNode.hasChildren = newNode.items && newNode.items.length > 0;\n return this.replaceInTree(aggregation, item.$path, newNode) as TreeAggregation;\n })\n );\n }\n\n getAggregation(name: string, column: string | null): AggEx | null | undefined {\n const agg: AggEx = this.aggregationsStore.getAggregation(name || '') as AggEx;\n if (!agg) {\n // try to get the aggregation by column name\n const aggByColumn = this.aggregationsStore.getAggregation(column || '', 'column') as AggEx;\n if (aggByColumn) {\n return aggByColumn;\n }\n }\n return agg;\n }\n\n processAggregation(name: string, column: string | null): AggEx | null | undefined {\n let agg = this.getAggregation(name, column);\n\n if (!agg) return null;\n\n const { items = [], display = agg.name, icon, hidden, searchable = true } = (this.appStore.getAggregationCustomization(agg.column) as CFilter) || {};\n agg.display = display;\n agg.icon = icon;\n agg.hidden = hidden;\n agg.searchable = searchable;\n\n // if the aggregation's column is a \"concepts\", disable the search\n if (this.nonSearchableColumns.some(column => column === agg.column)) {\n agg.searchable = false;\n }\n\n if (agg.items) {\n // get current filters for the aggregation\n const filters = this.queryParamsStore.getFilter({ field: agg.column, name: agg.name });\n const flattenedValues = filters ? this.flattenFilters([filters]) : [];\n\n if (agg.isTree) {\n const selectedAgg = agg.items.map(item => this.selectNode(item as TreeAggregationNode, flattenedValues));\n const openedAgg = selectedAgg.map(item => this.openParentNodes(item as TreeAggregationNode, flattenedValues));\n agg.items = openedAgg;\n }\n\n (agg.items as AggregationListItem[]).forEach((item: AggregationListItem) => {\n if (!agg.isTree && item.$selected === undefined) {\n const valueToSearch = agg.valuesAreExpressions ? item.display : item.value;\n item.$selected = flattenedValues.includes(valueToSearch ?? '') || false;\n }\n\n item.icon = items?.find((it: CFilterItem) => it.value === item.value)?.icon;\n });\n }\n\n return agg;\n }\n\n /**\n * Converts an `AggregationItem` to a `LegacyFilter`.\n *\n * @param item - The `AggregationItem` to be converted.\n * @returns A `LegacyFilter` object based on the provided `AggregationItem`.\n *\n * The function performs the following steps:\n * 1. Retrieves the field from the aggregation column.\n * 2. If the aggregation is a distribution, it parses the item value to extract filter expressions.\n * - The expressions are split by \" AND \" and mapped to filter objects.\n * - If two filters are found, they are combined with an \"and\" operator.\n * - If one filter is found, it is returned as is.\n * - Throws an error if the distribution expression cannot be parsed.\n * 3. If the item value is a string, it creates a filter with the \"contains\" operator.\n * 4. Otherwise, it creates a filter with the item value as a string, number, or boolean.\n *\n * @throws Will throw an error if the distribution expression cannot be parsed.\n */\n toFilter(item: AggregationItem, field: string, name: string, isDistribution: boolean): LegacyFilter {\n if (isDistribution) {\n const res = (item.value as string).match(/.*\\:\\(?([><=\\d\\-\\.AND ]+)\\)?/);\n if (res?.[1]) {\n const expr = res?.[1].split(' AND ');\n const filters = expr.map(e => {\n const operator: 'gte' | 'lt' = e.indexOf('>=') !== -1 ? 'gte' : 'lt';\n let value: FieldValue = e.substring(e.indexOf(' ') + 1);\n return { name, field, operator, value, display: item.display || item.value };\n });\n\n if (filters.length === 2) {\n return { operator: 'and', filters, display: filters[0].display || filters[0].value, field, name } as LegacyFilter;\n } else if (filters.length === 1) {\n return { ...filters[0], field, name } as LegacyFilter;\n }\n throw new Error('Failed to parse distribution expression');\n }\n }\n\n if (typeof item.value === 'string') {\n return { name, field, value: item.value, operator: 'contains', display: item.display } as LegacyFilter;\n }\n return { name, field, value: item.value as string | number | boolean, display: item.display } as LegacyFilter;\n }\n\n private findNode(items: TreeAggregationNode[], path: string = ''): TreeAggregationNode | undefined {\n if (!items || items.length === 0) {\n return undefined;\n }\n\n for (const item of items) {\n if (item.$path === path) {\n return item;\n }\n if (item.items) {\n const found = this.findNode(item.items, path);\n if (found) {\n return found;\n }\n }\n }\n\n return undefined;\n }\n\n private replaceInTree(tree: any, valueToFind: string = '', newValue: TreeAggregationNode) {\n if (tree.$path === valueToFind) {\n return newValue;\n }\n\n if (tree.hasChildren && tree.items) {\n for (let i = 0; i < tree.items.length; i++) {\n tree.items[i] = this.replaceInTree(tree.items[i], valueToFind, newValue);\n }\n }\n\n return tree;\n }\n\n /**\n * Selects a node in a tree structure based on a given path.\n *\n * @param {TreeAggregationNode} node - The current node in the tree.\n * @param {string[]} path - An array of path strings used to determine which nodes to select.\n * @returns {TreeAggregationNode} - The updated node with the selection state applied.\n */\n private selectNode(node: TreeAggregationNode, path: string[]): TreeAggregationNode {\n if (node.$path && path.includes(`/${node.$path}/*`)) {\n node.$selected = true;\n } else {\n node.$selected = false;\n }\n\n if (node.items) {\n node.items = node.items.map(item => this.selectNode(item, path));\n }\n return node;\n }\n\n private flattenFilters(filters: LegacyFilter[]) {\n let flattenedValues: string[] = [];\n\n function extractValues(filters: LegacyFilter[]) {\n for (const filter of filters) {\n if (filter.value) {\n flattenedValues.push(filter.value);\n\n if (filter.display) flattenedValues.push(filter.display);\n // we handle \"values\" field for trees\n } else if (filter.values) {\n flattenedValues.push(...filter.values);\n }\n if (filter.filters) {\n extractValues(filter.filters as LegacyFilter[]);\n }\n }\n }\n\n extractValues(filters);\n return flattenedValues;\n }\n\n /**\n * Recursively opens parent nodes in a tree structure if any of their child nodes are selected or opened.\n *\n * @param node - The current tree node being processed.\n * @param path - An array representing the path to the current node.\n * @returns The updated tree node with parent nodes opened if necessary.\n */\n private openParentNodes(node: TreeAggregationNode, path: string[]): TreeAggregationNode {\n if (node.items) {\n node.items = node.items.map(item => this.openParentNodes(item, path));\n }\n if (node.items && node.items.some(item => item.$selected || item.$opened)) {\n node.$opened = true;\n }\n return node;\n }\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { globalConfig, isAuthenticated } from '@sinequa/atomic';\n\n/**\n * Returns a guard function that checks if the user is authenticated.\n * If the user is not authenticated, it navigates to the login page.\n * @returns The guard function.\n */\nexport function AuthGuard(): CanActivateFn {\n return (_, state) => {\n const router = inject(Router);\n\n const { loginPath, useCredentials, useSSO } = globalConfig;\n if (isAuthenticated()) return true;\n // when using SSO authentication, the application is already authenticated\n if (useSSO) return true;\n\n if (useCredentials) {\n router.navigate([loginPath], { queryParams: { returnUrl: state.url } });\n } else {\n // TODO: add a loading page configuration\n router.navigate(['loading'], { queryParams: { returnUrl: state.url } });\n }\n return false;\n };\n}\n","export function itemIndex(name: string, items?: any[]): number {\n if (items?.length) {\n for (let i = 0, ic = items.length; i < ic; i++) {\n const item = items[i];\n if (item && item.name === name) {\n return i;\n }\n }\n }\n return -1;\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { patchUserSettings } from '@sinequa/atomic';\nimport { Alert, UserSettingsState } from '../../models';\nimport { itemIndex } from './helpers';\n\nexport function withAlertsFeatures() {\n return signalStoreFeature(\n withState({ alerts: [] as UserSettingsState['alerts'] }),\n withMethods(store => ({\n /**\n * Deletes an alert from the user's alerts list.\n *\n * @param index - The index of the alert.\n */\n async deleteAlert(index: number) {\n const alerts = store.alerts();\n if (alerts) {\n const alertToDelete = alerts.splice(index, 1)[0];\n await patchUserSettings(\n { alerts },\n {\n type: 'Alert_Delete',\n detail: {\n savedQuery: alertToDelete.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, alerts: [...alerts] };\n });\n }\n },\n\n /**\n * Adds an alert to the user's alerts list\n *\n * @param alert - The alert to add in the user's alerts list\n */\n async createAlert(alert: Alert) {\n const alerts = store.alerts();\n if (itemIndex(alert.name) >= 0) return;\n alerts.unshift(alert);\n await patchUserSettings(\n { alerts },\n {\n type: 'Alert_Add',\n detail: {\n alert: alert.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, alerts: [...alerts] };\n });\n },\n\n /**\n * Updates the alert at a specific index.\n *\n * @param alert - The updated alert data.\n * @param index - The index of the alert to update.\n */\n async updateAlert(alert: Alert, index: number) {\n const alerts = store.alerts();\n if (index < 0 || index >= alerts.length)\n // index out of bounds\n return;\n\n alerts.splice(index, 1, alert);\n\n await patchUserSettings(\n { alerts },\n {\n type: 'Alert_Update',\n detail: {\n alert: alert.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, alerts: [...alerts] };\n });\n },\n\n /**\n * Updates the user's alerts in the store.\n *\n * @param alerts - The new alerts to be updated in the store.\n */\n async updateAlerts(alerts: Alert[]) {\n await patchUserSettings(\n { alerts },\n {\n type: 'Alert_Update',\n detail: {\n alert: alert.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, alerts: [...alerts] };\n });\n }\n }))\n );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { AuditEvents, patchUserSettings } from '@sinequa/atomic';\nimport { UserSettingsState } from '../../models';\n\nexport function withAssistantFeatures() {\n return signalStoreFeature(\n withState({ assistants: {} as UserSettingsState['assistants'] }),\n withMethods(store => ({\n /**\n * Updates the user's assistant settings in the store.\n *\n * @param assistantSettings - The new assistant settings to be updated in the store.\n */\n async updateAssistantSettings(assistantSettings: UserSettingsState['assistants']) {\n patchState(store, state => {\n return { ...state, assistants: assistantSettings };\n });\n },\n\n /**\n * Update the user's language and optionally logs audit events.\n *\n * @param language - The language to update with.\n * @param auditEvents - Optional audit events to log during the update.\n */\n async updateLanguage(language: UserSettingsState['language'], auditEvents?: AuditEvents) {\n await patchUserSettings({ language }, auditEvents);\n patchState(store, state => {\n return { ...state, language };\n });\n },\n\n /**\n * Update the user's assistant collapsed status and optionally logs audit events.\n *\n * @param collapseAssistant - The collapse status.\n * @param auditEvents - Optional audit events to log during the update.\n */\n async updateAssistantCollapsed(collapseAssistant: UserSettingsState['collapseAssistant'], auditEvents?: AuditEvents) {\n await patchUserSettings({ collapseAssistant }, auditEvents);\n patchState(store, state => {\n return { ...state, collapseAssistant };\n });\n }\n }))\n );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { patchUserSettings } from '@sinequa/atomic';\nimport { Basket, UserSettingsState } from '../../models';\nimport { itemIndex } from './helpers';\n\nexport function withBasketsFeatures() {\n return signalStoreFeature(\n withState({ baskets: [] as UserSettingsState['baskets'] }),\n withMethods(store => ({\n /**\n * Deletes a basket from the user's baskets list.\n *\n * @param index - The index of the basket to delete.\n */\n async deleteBasket(index: number) {\n const baskets = store.baskets();\n if (baskets) {\n const basketToDelete = baskets.splice(index, 1)[0];\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_Delete',\n detail: {\n savedQuery: basketToDelete.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n }\n },\n\n /**\n * Adds a basket to the user's baskets list.\n *\n * @param basket - The basket to add in the user's baskets list.\n */\n async createBasket(basket: Basket) {\n const baskets = store.baskets();\n if (itemIndex(basket.name) >= 0) return;\n baskets.unshift(basket);\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_Add',\n detail: {\n basket: basket.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n },\n\n /**\n * Updates the user's baskets in the store.\n *\n * @param baskets - The new baskets to be updated in the store.\n */\n async updateBaskets(baskets: UserSettingsState['baskets']) {\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_Update'\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n },\n\n /**\n * Updates the basket at a specific index.\n *\n * @param basket - The updated basket data.\n * @param index - The index of the basket to update.\n */\n async updateBasket(basket: Basket, index: number) {\n const baskets = store.baskets();\n const prevIndex = itemIndex(basket.name, baskets);\n if (\n (prevIndex !== -1 && index !== prevIndex) || // A basket with the same name exists at a different index\n index < 0 ||\n index >= baskets.length\n )\n // index out of bounds\n return;\n\n baskets.splice(index, 1, basket);\n\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_Update',\n detail: {\n basket: basket.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n },\n\n /**\n * Adds one or multiple records' id into a basket.\n *\n * @param name - The basket name.\n * @param ids - The id(s) to add to it.\n */\n async addToBasket(name: string, ids: string | string[]) {\n const baskets = store.baskets();\n const basket = baskets.find((b: { name: string }) => 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: string) => i === id)) {\n basket.ids.push(id);\n }\n }\n\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_AddDoc',\n detail: {\n basket: basket.name,\n docid: ids[0]\n }\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n },\n\n /**\n * Adds one or multiple records' id from a basket.\n *\n * @param name - The basket name.\n * @param ids - The id(s) to remove from it.\n */\n async removeFromBasket(name: string, ids: string | string[]) {\n const baskets = store.baskets();\n const basket = baskets.find((b: { name: string }) => 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: string) => i === id)) {\n basket.ids.push(id);\n }\n }\n\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_AddDoc',\n detail: {\n basket: basket.name,\n docid: ids[0]\n }\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n }\n }))\n );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { Article, AuditEvents, patchUserSettings } from '@sinequa/atomic';\nimport { UserSettingsState } from '../../models';\n\nexport function withBookmarkFeatures() {\n return signalStoreFeature(\n withState({ bookmarks: [] as UserSettingsState['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: UserSettingsState['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([bookmark, ...store.bookmarks()], {\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: { id: string }) => 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: { id: string | undefined }) => 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) this.unbookmark(article.id);\n else this.bookmark(article);\n }\n }))\n );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { AuditEvents, patchUserSettings, QueryParams } from '@sinequa/atomic';\nimport { SearchItem, UserSettingsState } from '../../models';\n\nexport function withRecentSearchesFeatures() {\n return signalStoreFeature(\n withState({ recentSearches: [] as UserSettingsState['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(\n { recentSearches },\n {\n type: 'RecentQuery_Delete',\n detail: {\n recentQuery: recentSearchToDelete.queryParams?.text\n }\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: UserSettingsState['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 {\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 {\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 SearchItem;\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","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { patchUserSettings } from '@sinequa/atomic';\nimport { SearchItem, UserSettingsState } from '../../models';\n\nexport function withSavedSearchesFeatures() {\n return signalStoreFeature(\n withState({ savedSearches: [] as UserSettingsState['savedSearches'] }),\n\n withMethods(store => ({\n /**\n * Deletes a saved search entry from the user's saved searches list.\n *\n * @param index - The index of the saved search to delete.\n */\n async deleteSavedSearch(index: number) {\n const savedSearches = store.savedSearches();\n if (savedSearches) {\n const savedSearchToDelete = savedSearches.splice(index, 1)[0];\n await patchUserSettings(\n { savedSearches },\n {\n type: 'SavedQuery_Delete',\n detail: {\n savedQuery: savedSearchToDelete.display\n }\n }\n );\n\n patchState(store, state => {\n return { ...state, savedSearches: [...savedSearches] };\n });\n }\n },\n\n /**\n * Updates the user's saved searches in the store.\n *\n * @param savedSearches - The new saved searches to be updated in the store.\n */\n async updateSavedSearches(savedSearches: UserSettingsState['savedSearches']) {\n await patchUserSettings(\n { savedSearches },\n {\n type: 'SavedQuery_Add',\n detail: {\n savedQuery: savedSearches[0].display\n }\n }\n );\n patchState(store, state => {\n return { ...state, savedSearches: [...savedSearches] };\n });\n },\n\n getSavedSearch(search: string): SearchItem | undefined {\n if (!search) return undefined;\n const savedSearches = store.savedSearches();\n return savedSearches?.find(savedSearch => savedSearch.display === search);\n }\n }))\n );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { deleteUserSettings, error, fetchUserSettings } from '@sinequa/atomic';\nimport { UserSettingsState } from '../../models';\n\nexport function withUserSettingsFeatures() {\n return signalStoreFeature(\n withState({ language: undefined, collapseAssistant: undefined } as UserSettingsState),\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 try {\n const settings = await fetchUserSettings<UserSettingsState>();\n patchState(store, settings);\n } catch (err) {\n error('Error fetching user settings:', err);\n }\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 alerts: [],\n assistants: {},\n language: undefined,\n collapseAssistant: undefined\n } as UserSettingsState);\n }\n }))\n );\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { signalStore } from '@ngrx/signals';\n\nimport { withAlertsFeatures } from './with-alerts';\nimport { withAssistantFeatures } from './with-assistant';\nimport { withBasketsFeatures } from './with-baskets';\nimport { withBookmarkFeatures } from './with-bookmarks';\nimport { withRecentSearchesFeatures } from './with-recent-searches';\nimport { withSavedSearchesFeatures } from './with-saved-searches';\nimport { withUserSettingsFeatures } from './with-user-settings';\n\nexport const UserSettingsStore = signalStore(\n { providedIn: 'root' },\n withDevtools('UserSettings'),\n\n withBookmarkFeatures(),\n withRecentSearchesFeatures(),\n withSavedSearchesFeatures(),\n withBasketsFeatures(),\n withAssistantFeatures(),\n withUserSettingsFeatures(),\n withAlertsFeatures()\n);\n","import { computed, inject, Injectable, InjectionToken, Type } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\n\nimport { CCApp, CCQuery, CCTab, error, info } from '@sinequa/atomic';\n\nimport { AuthGuard } from '../guards';\nimport { AppStore } from '../stores/app.store';\nimport { PrincipalStore } from '../stores/principal.store';\nimport { UserSettingsStore } from '../stores/user-settings/user-settings.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 userSettingsStore = inject(UserSettingsStore);\n principalStore = inject(PrincipalStore);\n appStore = inject(AppStore);\n\n router = inject(Router);\n title = inject(Title);\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 * 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 info('Application initialized');\n\n // this will set the title and logo of the application\n // it will also set the logo in the css variables\n this.setGeneralApp();\n\n // withCreateRoutes is true by default, but it must be set to false if tabSearch is not active and/or no tabs are defined\n const query = this.appStore.getDefaultQuery() as CCQuery;\n if (withCreateRoutes && query && query.tabSearch && query.tabSearch.isActive && query.tabSearch.tabs && query.tabSearch.tabs.length) {\n // check if the query \"tabs\" and the custom json \"routes\" match\n // in the json keep only the routes that are in the query\n this.createRoutes();\n info('Application routes created');\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 try {\n // Fetch the application configuration\n await this.appStore.initialize();\n info('appStore', getState(this.appStore));\n\n // Load the principal (user information)\n await this.principalStore.initialize();\n info('principalStore', getState(this.principalStore));\n\n // Load the user settings\n await this.userSettingsStore.initialize();\n info('userSettingsStore', getState(this.userSettingsStore));\n } catch (err) {\n error('Error during application initialization', err);\n throw err;\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 // get the queries and custom jsons from the app store\n const { queries, data: custom, customJSONs = [] } = getState(this.appStore) as CCApp;\n\n // for each query we need to create a route with the query name and the tab name\n // contains an array of objects CCQuery for each existing query\n // we keep only the name and the tabSearch properties\n const queriesMap = Object.entries(queries).map(([key, value]) => ({ key, name: value.name, tabSearch: value.tabSearch }));\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\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\n // retrieve the routes data from the custom JSONs or fall back to the default custom json\n const routes = (cjRoutes || custom?.['routes']) as { path: string; wsName: string; wsQueryTab: string; pathDisplayName: string; icon: string }[];\n\n // take only first query to create the routes\n const firstQuery = queriesMap[0];\n\n // We need to create a route path object for each tab in the first query\n // if the query has no tabs, we create a route with the query name as the tab name\n const firstQueryConfig = { name: firstQuery.name, 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 // check if the routes provided are valid\n const validRoutes = this.checkRoutesValidity(routes, firstQueryConfig);\n // if no valid routes are found, throw an error\n if (!validRoutes.length) {\n error('No valid routes found', routes);\n return;\n }\n\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(\n (acc, tab) => {\n acc[tab.name] = { display: tab.display };\n return acc;\n },\n {} as Record<string, { display: string }>\n );\n\n // respect the order of the tabs in the first query\n // we need to separate the routes that are not in the first query from the ones that are\n const notFirstQueryTabs = validRoutes.filter(route => route.wsQueryTab !== firstQueryConfig.name && route.wsName !== undefined);\n\n // route path without wsName are considered as first query tabs\n const firstQueryTabs = validRoutes.filter(route => route.wsQueryTab === firstQueryConfig.name || route.wsName === undefined);\n\n // sort the validRoutes according to the order of the tabs in the first query\n firstQueryTabs.sort((a, b) => {\n const aIndex = firstQueryConfig.tabs.findIndex(tab => tab.name === a.wsQueryTab && (a.wsName === firstQueryConfig.name || a.wsName === undefined));\n const bIndex = firstQueryConfig.tabs.findIndex(tab => tab.name === b.wsQueryTab && (b.wsName === firstQueryConfig.name || b.wsName === undefined));\n return aIndex - bIndex;\n });\n\n const sortedValidRoutes = [...firstQueryTabs, ...notFirstQueryTabs];\n\n children = sortedValidRoutes.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 icon: route.icon\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 path: 'search',\n component: this.components.find(c => c.path === 'search')?.component || this.defaultLayoutComponent(),\n canActivate: [AuthGuard()],\n children: []\n };\n\n const wildcardPath = searchPath.children?.find(route => route.path === '**') || { path: '**', redirectTo: 'all', pathMatch: 'full' };\n\n // remove the wildcard path from the searchPath children if it exists\n const existingChildren = (searchPath.children ?? []).filter(child => child.path !== '**');\n\n searchPath.component = this.components.find(c => c.path === 'search')?.component || this.defaultLayoutComponent();\n searchPath.children = [...children, ...existingChildren, wildcardPath];\n\n const newConfig = [searchPath, ...currentConfig];\n info('ApplicationService: createRoutes -> newConfig', newConfig);\n // finally we reset the router config with the new routes\n this.router.resetConfig(newConfig);\n }\n\n private checkRoutesValidity(routes: any[], firstQueryConfig: { name: string; tabs: CCTab[] }) {\n // if no \"wsName\" check if the wqQueryTab is provided and if not, remove the route from the array\n const validRoutes = routes.filter(route => {\n if (!route.wsName) {\n if (!route.wsQueryTab) {\n error('Invalid route provided', route);\n return false;\n }\n // if the wsQueryTab is provided, we need to check if it exists in the first query\n const tabExists = firstQueryConfig.tabs.find(tab => tab.name === route.wsQueryTab);\n if (!tabExists) {\n error('Invalid route provided', route);\n return false;\n }\n }\n return true;\n });\n\n // add to validRoutes the routes that are in the first query and not in the validRoutes\n // we need to check if the route is already in the validRoutes array\n const additionalRoutes = firstQueryConfig.tabs\n .filter(tab => {\n // Check if the tab is already in the validRoutes array\n const routeExists = validRoutes.some(route => route.wsQueryTab === tab.name && (route.wsName === firstQueryConfig.name || route.wsName === undefined));\n return !routeExists;\n })\n .map(tab => {\n // Create a new route object for the tab\n return {\n path: tab.name,\n queryName: firstQueryConfig.name,\n wsQueryTab: tab.name,\n pathDisplayName: tab.display || tab.name,\n icon: ''\n };\n });\n\n // Add the additional routes to the validRoutes array\n validRoutes.push(...additionalRoutes);\n return validRoutes;\n }\n\n /**\n * Sets general application properties such as the document title and logo styles\n * based on the current general configuration from the application store.\n *\n * - Updates the document title if a general name is provided.\n * - Sets CSS custom properties for small and large logos if available in the configuration.\n *\n * @private\n */\n private setGeneralApp() {\n const general = this.appStore.general();\n // If general is not defined or is an empty object, do nothing\n if (!general || (typeof general === 'object' && Object.keys(general).length === 0)) return;\n\n info('Setting general application properties');\n\n if (general.name) {\n this.title.setTitle(general.name);\n }\n\n const { light, alt } = general.logo || {};\n document.documentElement.style.setProperty('--logo-alt-text', `'${alt || general.name}'`);\n\n if (light?.small) {\n document.documentElement.style.setProperty('--logo-small', `url('${light.small}')`);\n }\n if (light?.large) {\n document.documentElement.style.setProperty('--logo-large', `url('${light.large}')`);\n }\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, computed, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\nimport { Article, AuditEvent, AuditEvents, AuditEventType, AuditEventTypeValues, CCApp, globalConfig, Result } from '@sinequa/atomic';\nimport { AppStore } from '../stores/app.store';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuditService {\n appStore = inject(AppStore);\n app = computed(() => getState(this.appStore) as CCApp);\n\n protected readonly http = inject(HttpClient);\n protected readonly router = inject(Router);\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n protected lastClickTime = 0;\n\n /**\n * Notify the Sinequa server of a set of audit events\n *\n * @param auditEvents The audit events\n */\n notify(auditEvents: AuditEvents) {\n this.http\n .post<void>(this.API_URL + '/audit.notify', {\n event: 'None', // AuditEventType.None,\n app: this.app().name,\n $auditRecord: { auditEvents: [auditEvents] }\n })\n .subscribe();\n }\n\n /**\n * It sends an audit event to the Audit Service.\n */\n notifyLogin() {\n this.notify({\n type: 'Login_Success_Form' // AuditEventType.Search_Login_Success\n });\n }\n\n /**\n * Notify logout\n */\n notifyLogout() {\n this.notify({\n type: 'Search_Exit_Logout' // AuditEventType.Search_Exit_Logout\n });\n }\n\n /**\n * Notify the Sinequa server of a document event\n *\n * @param evt The audit event type\n * @param doc The document (article) in question\n * @param resultId The resultid that contain the document\n * @param parameters Additional parameters\n */\n notifyDocument(\n auditEventType: AuditEventType | AuditEventTypeValues | ({} & Record<never, never>),\n doc: Article,\n resultsOrId: Result | string,\n parameters?: Record<string, string | number | boolean | undefined>,\n rfmParameters?: Record<string, string | number | boolean | undefined>\n ) {\n let resultId: string | null;\n let result: Result | undefined;\n if (typeof resultsOrId == 'string') {\n resultId = resultsOrId;\n } else {\n result = resultsOrId;\n resultId = result ? result.id : null;\n }\n\n const detail: any = {\n docid: doc.id,\n rank: doc.rank,\n title: doc.title,\n source: doc.collection[0].split('/')[0],\n collection: doc.collection[0],\n resultId,\n filename: doc.filename,\n fileext: doc.fileext,\n index: doc.databasealias,\n resultcount: result?.totalRowCount\n };\n\n if (parameters) {\n Object.keys(parameters).forEach(key => (detail[key] = parameters[key]));\n }\n const data: AuditEvent = {\n type: auditEventType,\n detail\n };\n\n if (rfmParameters) {\n const rfmDetail: Record<string, string | number | boolean | undefined> = {}; // Add index signature\n Object.keys(rfmParameters).forEach(key => (rfmDetail[key] = rfmParameters[key]));\n data.rfmDetail = rfmDetail;\n }\n\n this.lastClickTime = Date.now();\n\n // Listen to the navigation event outside the app\n document.addEventListener(\n 'visibilitychange',\n () => {\n // Capture the navigation even triggered just after the click\n if (document.visibilityState === 'hidden' && Date.now() - this.lastClickTime < 1000) {\n // Second event triggered when we come back\n document.addEventListener(\n 'visibilitychange',\n () => {\n if (document.visibilityState === 'visible') {\n this.notify({ type: AuditEventType.Navigation_Return });\n }\n },\n { once: true }\n );\n }\n },\n { once: true }\n );\n\n this.notify(data);\n }\n\n /**\n * Notify route change\n */\n notifyRouteChange(url: string) {\n this.notify({\n type: 'Navigation_Route', // AuditEventType.Navigation_Route,\n detail: {\n detail: url\n }\n });\n }\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/user-settings.store';\nimport { AppStore } from '../stores/app.store';\nimport { Autocomplete } from '../models/autocomplete';\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(\n (acc: Observable<Suggestion[]>[], curr: string) => {\n acc.push(from(fetchSuggest(curr, text)));\n return acc;\n },\n [] as Observable<Suggestion[]>[]\n );\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') maxCount = { recentSearches: maxCount, savedSearches: maxCount, bookmarks: maxCount };\n\n if (recentSearches) {\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) items.push(...searches.map(search => ({ category: 'recent-search', ...search })));\n }\n\n if (savedSearches) {\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) items.push(...searches.map(search => ({ category: 'saved-search', ...search })));\n }\n\n if (bookmarks) {\n // don't filter if the text is empty\n const matchingBookmarks = text ? bookmarks.filter(bookmark => bookmark.label?.toLowerCase().includes(text.toLowerCase())) : bookmarks;\n\n const searches = matchingBookmarks.slice(0, maxCount?.bookmarks);\n\n if (searches.length > 0) items.push(...searches.map(search => ({ category: 'bookmark', display: search.label ?? '', ...search })));\n }\n\n return items;\n }\n}\n","import { HttpClient, HttpContext, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\n\nimport { globalConfig, isObject } from '@sinequa/atomic';\nimport { Observable, throwError } from 'rxjs';\n\ntype Options = {\n headers?:\n | HttpHeaders\n | {\n [header: string]: string | string[];\n };\n context?: HttpContext;\n observe?: 'body' | 'events' | 'response';\n params?:\n | HttpParams\n | {\n [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;\n };\n reportProgress?: boolean;\n responseType: 'arraybuffer' | 'blob' | 'text' | 'json';\n withCredentials?: boolean;\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class JsonMethodPluginService {\n protected readonly http = inject(HttpClient);\n\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n /**\n * Call a JsonMethod plugin using an HTTP POST\n *\n * @param method The name of the JsonMethod plugin\n * @param query Parameters to pass to the plugin\n * @param options HTTP options for the request\n * @returns An observable of the plugin's return value\n */\n post<U>(method: string, query: U, options?: Options): Observable<any> {\n if (!isObject(query)) {\n return throwError(() => ({ error: 'invalid query object' }));\n }\n return this.http.post(`${this.API_URL}/plugin/${method}`, query, options as any);\n }\n\n /**\n * Call a JsonMethod plugin using an HTTP GET\n *\n * @param method The name of the JsonMethod plugin\n * @param query Parameters to pass to the plugin\n * @param options HTTP options for the request\n * @returns An observable of the plugin's return value\n */\n get<U extends Record<string, string | boolean | number | Date | object | undefined>>(method: string, query: U, options?: Options): Observable<any> {\n return this.http.get(`${this.API_URL}/plugin/${method}`, {\n params: query,\n ...(options as any)\n });\n }\n}\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 './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 // TODO: use a \"loading\" configuration from globalConfig\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","import { InjectionToken } from '@angular/core';\n\nexport type AppFeatures = {\n assistant: {\n // Whether the assistant configuration should be prefiexed with the app name\n usePrefixName: boolean;\n };\n};\n\nexport const APP_FEATURES = new InjectionToken<AppFeatures>('app.features');\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';\nimport { DestroyRef, EventEmitter, Inject, Injectable, InjectionToken, Injector, inject } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { getState } from '@ngrx/signals';\nimport { Observable, Subject, tap } from 'rxjs';\n\nimport { Article, Audit, AuditEventType, AuditEvents, CCWebService, CustomHighlights, PreviewData, Query, error, globalConfig, info } from '@sinequa/atomic';\n\nimport { AppStore, ApplicationStore, Extract, QueryParamsStore, SelectionStore } from '../stores';\nimport { HIGHLIGHTS, PreviewHighlight } from '../tokens';\nimport { InlineWorker } from '../utils';\nimport { AuditService } from './audit.service';\nimport { QueryService } from './query.service';\n\nexport const PREVIEW_CONFIG = new InjectionToken('Preview configuration', {\n factory: () => ({\n allowWorker: false\n })\n});\n\ntype ExtractsLocations = Extract & {\n text: string; // HTML text\n};\n\ntype CCWebServicePreview = CCWebService & {\n allowCustomHighlights: boolean;\n allowedWithAnySBA: boolean;\n defaultHighlights: boolean;\n forceTextPreview: string;\n highlights: string;\n maxNumberOfHighlights: string | number;\n maximumHtmlSize: string | number;\n};\nexport type PreviewEvents = 'idle' | 'fetching' | 'fetched' | 'error' | 'scrollTo';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PreviewService {\n protected readonly http = inject(HttpClient);\n protected readonly injector = inject(Injector);\n\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n protected readonly applicationStore = inject(ApplicationStore);\n protected readonly selectionStore = inject(SelectionStore);\n protected readonly queryParamsStore = inject(QueryParamsStore);\n protected readonly appStore = inject(AppStore);\n\n protected readonly sanitizer = inject(DomSanitizer);\n\n protected readonly queryService = inject(QueryService);\n protected readonly auditService = inject(AuditService);\n\n events = new EventEmitter<PreviewEvents>();\n\n // ! worker\n onMessage = new Subject<unknown>();\n worker: InlineWorker | undefined;\n\n allowWoker = inject(PREVIEW_CONFIG).allowWorker;\n\n protected previewData: PreviewData | undefined;\n protected iframe: Window | null | undefined;\n\n highlightCategory = 'extractslocations';\n\n extracts = ['matchlocations', 'extractslocations', 'matchingpassages'];\n entities = ['company', 'geo', 'person'];\n\n abortController = new AbortController();\n\n constructor(\n protected destroyRef: DestroyRef,\n @Inject(HIGHLIGHTS) public highlights: PreviewHighlight[]\n ) {\n window.addEventListener('message', this.receiveMessage.bind(this), { signal: this.abortController.signal });\n\n // update the highlights according to the web service \"preview\" configuration\n this.updateHighlightsFromWebServiceConfiguration();\n\n destroyRef.onDestroy(() => {\n this.abortController.abort();\n });\n }\n\n /**\n * Handles incoming messages from a MessageEvent.\n *\n * @param event - The MessageEvent containing the message data.\n *\n * The function processes messages of type 'ready' and 'get-html-results'.\n *\n * - For 'ready' messages:\n * - Initializes the preview iframe with the app name and highlights.\n * - If preview data is available, retrieves HTML content based on the current selection.\n *\n * - For 'get-html-results' messages:\n * - Updates the application store with the extracted HTML results.\n * - If no extracts are found, updates the application store with an empty array.\n */\n receiveMessage(event: MessageEvent) {\n const message = event.data;\n // the webworker needs to be initialized with the app name to be able to load the correct webworker file (worker.js)\n const { app } = globalConfig;\n\n // when the iframe is ready, we can send the init message\n if (message.type === 'ready') {\n // Initialize the preview iframe with the app name and highlights\n // app name is used to intialize the webworker\n this.sendMessage({ action: 'init', highlights: this.highlights, appname: app });\n\n if (this.previewData) {\n const { id } = getState(this.selectionStore);\n this.events.emit('fetching');\n this.retrieveHtmlContent(id, this.highlightCategory, this.previewData);\n }\n }\n\n // when the iframe sends back the html content of the extracts (no worker)\n if (message.type === 'get-html-results') {\n const { id } = getState(this.selectionStore);\n\n if (id) {\n info('get html results without worker');\n // prevents the error when the \"previewData\" is not ready\n if (this.previewData) {\n const extracts = this.fetchExtracts(id, message.data, this.previewData);\n this.applicationStore.updateExtracts(this.previewData?.record.id || '', extracts);\n this.events.emit('fetched');\n }\n }\n }\n\n // when the iframe sends back the html content of the extracts (with worker)\n // we update the extracts in the application store\n if (message.type === 'get-html-results-webworker') {\n info('get html results with worker');\n\n if (message.data.extracts.length === 0) {\n this.events.emit('fetched');\n this.applicationStore.updateExtracts(this.previewData?.record.id || '', []);\n return;\n }\n\n const extracts: Extract[] = message.data.extracts.map((item: ExtractsLocations) => ({\n ...item,\n text: this.sanitizer.bypassSecurityTrustHtml(item.text)\n }));\n\n this.applicationStore.updateExtracts(this.previewData?.record.id || '', extracts);\n this.events.emit('fetched');\n }\n }\n\n /**\n * Generates a preview of the document with the given ID, applying the specified query parameters,\n * custom highlights, and audit events.\n *\n * @param id - The unique identifier of the document to preview.\n * @param q - Partial query parameters to customize the preview request.\n * @param customHighlights - Optional array of custom highlights to apply to the preview.\n * @param audit - Optional audit events to merge with the default audit record.\n * @returns An Observable that emits the preview data.\n */\n preview(id: string, q: Partial<Query>, customHighlights?: CustomHighlights[], audit?: AuditEvents): Observable<PreviewData> {\n const detail = this.getAuditPreviewDetail(id, q);\n\n const defaultAudit: AuditEvents = {\n type: 'Doc_Preview',\n detail\n };\n\n // merge the default audit record with the provided audit record\n const $auditRecord = audit ? { auditEvents: [{ ...defaultAudit, ...audit }] } : { auditEvents: [defaultAudit] };\n\n const { app } = globalConfig;\n const query = { ...this.queryParamsStore.getQuery(), ...q };\n\n const browserUrl = `${window.location.origin}${window.location.pathname}`;\n\n const body = {\n app,\n action: 'get',\n id,\n query: { name: query.name, text: query.text },\n browserUrl,\n customHighlights,\n $auditRecord\n };\n\n return this.http.post<PreviewData>(this.API_URL + '/preview', body).pipe(tap((data: PreviewData) => this.setPreviewData(data)));\n }\n\n /**\n * Closes the preview with the specified ID and updates the audit log.\n *\n * @param id - The ID of the preview to close.\n * @param query - The partial query object used to retrieve the preview detail.\n */\n close(id: string, query: Partial<Query>) {\n const detail = this.getAuditPreviewDetail(id, query);\n const auditEvent = {\n type: AuditEventType.Preview_Close,\n detail\n };\n Audit.notify(auditEvent);\n }\n\n /**\n * Previews an article in a new browser's tab.\n *\n * @param article - The article to preview.\n */\n openExternal(article: Article) {\n const query = this.queryParamsStore.getQuery();\n try {\n const detail = this.getAuditPreviewDetail(article.id, query);\n const result = this.queryService.result;\n this.auditService.notifyDocument(\n 'Click_ResultLink',\n article,\n result || detail.resultid || '',\n {\n querytext: detail.querytext,\n querylang: detail.querylang,\n score: detail.score\n },\n {\n queryhash: result ? result.rfmQueryHash : undefined,\n querytext: detail.querytext,\n querylang: detail.querylang\n }\n );\n } catch (e: any) {\n error('preview.openExternal failure - error: ', e);\n }\n window.open(article.url1, '_blank', 'noopener noreferrer');\n }\n\n /**\n * Sets the iframe window object.\n *\n * @param iframe - The window object of the iframe or null to unset.\n */\n setIframe(iframe: Window | null) {\n this.iframe = iframe;\n }\n\n /**\n * Sets the preview data and updates the highlight category based on the provided data.\n *\n * @param data - The preview data to be set.\n *\n * If the provided data contains highlights per category with 'matchingpassages' having values,\n * the highlight category is set to \"matchingpassages\". Otherwise, it is set to \"extractslocations\".\n */\n setPreviewData(data: PreviewData) {\n this.previewData = data;\n\n if (data) {\n this.highlightCategory = data.highlightsPerCategory?.['matchingpassages']?.values.length ? 'matchingpassages' : 'extractslocations';\n }\n }\n\n /**\n * Sends a message to the iframe if it exists.\n *\n * @param message - The message to be sent. It can be of any type.\n */\n sendMessage(message: unknown) {\n if (this.iframe) {\n this.iframe!.postMessage(message, '*');\n }\n }\n\n /**\n * Get preview id for an entity value for an index\n * @param entity the entity type (i.e. \"geo\")\n * @param value the entity value (i.e. \"AUSTRALIA\")\n * @param index the entity index from its list\n * @returns the html id\n */\n getEntityId(entity: string, value: string, index: number): number | undefined {\n if (!this.previewData) return undefined;\n\n return this.previewData.highlightsPerLocation.filter(h => h.values.find(v => v === value))[index].positionInCategories[entity];\n }\n\n /**\n * Send a message to the prewiew iFrame with the required data to retrieve HTML content for a specific highlight category\n *\n * @param id - The unique identifier for the request.\n * @param highlightCategory - The category of highlights to retrieve.\n * @param previewData - The data containing highlights and their locations.\n */\n retrieveHtmlContent(id: string, highlightCategory: string, previewData: PreviewData) {\n // Generate the list of items we want to retrieve\n const ids = previewData.highlightsPerCategory[highlightCategory]?.values[0]?.locations.map((_, i) => `${highlightCategory}_${i}`);\n\n if (this.allowWoker) {\n // if the worker is allowed, we send the message to the worker\n this.sendMessage({ action: 'get-html-webworker', id, ids, previewData });\n } else {\n this.sendMessage({ action: 'get-html', id, ids, previewData });\n }\n }\n\n /**\n * Sends a message to zoom in.\n *\n * This method triggers a \"zoom-in\" action by sending a message\n * with the specified action type.\n */\n zoomIn() {\n this.sendMessage({ action: 'zoom-in' });\n }\n\n /**\n * Sends a message to zoom out the preview.\n *\n * This method triggers a \"zoom-out\" action by sending a message\n * to the relevant service or component.\n */\n zoomOut() {\n this.sendMessage({ action: 'zoom-out' });\n }\n\n toggleAIDescription(value: boolean) {\n // Toggle the AI description in the preview\n this.sendMessage({ action: 'toggle-description', show: value });\n }\n\n /**\n * Toggles the highlights based on the provided flags for extracts and entities.\n *\n * @param extracts - A boolean flag indicating whether to include extracts highlights.\n * @param entities - A boolean flag indicating whether to include entities highlights.\n */\n toggle(extracts: boolean, entities: boolean) {\n const extractsHighlights = extracts ? this.highlights.filter(h => this.extracts.includes(h.name)) : [];\n const entitiesHighlights = entities ? this.highlights.filter(h => this.entities.includes(h.name)) : [];\n const highlights = [...extractsHighlights, ...entitiesHighlights];\n\n this.sendMessage({ action: 'highlight', highlights });\n }\n\n getAuditPreviewDetail(id: string, q: Partial<Query>) {\n const results = this.queryService.result;\n const queryLanguage = results?.queryAnalysis?.queryLanguage || q?.questionLanguage || this.appStore.getQueryByName(q.name!)?.questionLanguage;\n\n // if selection store contains the same id, use the record\n // otherwise use the preview data record\n // this will be helpful when reading the ranking of the document\n const article = getState(this.selectionStore).article;\n const record = article && article.id === id ? article : this.previewData?.record;\n\n const collectionColumn = record?.collection;\n const collection = !!collectionColumn ? collectionColumn[0] : id.split('|')[0];\n const rank = !!record ? record.rank : 0;\n const passages = record?.matchingpassages?.passages;\n const score = passages && passages.length ? passages[0].score : undefined;\n return {\n docid: id,\n rank,\n collection,\n source: collection.split('|')[0],\n resultid: results.id,\n querylang: queryLanguage,\n querytext: q?.text,\n filename: record?.filename,\n fileext: record?.fileext,\n score\n };\n }\n\n private fetchExtracts(id: string, extracts: string[], data: PreviewData): Extract[] {\n if (!data) return [];\n\n // extracts contains the html of extracts in chronological order\n // locations contains the list of start positions sorted by score\n const locations = data.highlightsPerCategory[this.highlightCategory]?.values[0]?.locations || [];\n\n // first extract all the extracts locations\n let extractslocations = locations.map((l, relevanceIndex) => ({\n startIndex: l.start,\n relevanceIndex\n })) as ExtractsLocations[];\n\n // sort them by start index\n extractslocations.sort((a, b) => a.startIndex - b.startIndex);\n\n // then extract the text of each extract\n extractslocations = extractslocations.map((ex, textIndex) => ({\n ...ex,\n textIndex: textIndex,\n text: extracts[textIndex] || '',\n id: `${this.highlightCategory}_${textIndex}`\n }));\n\n // then sanitize the text and remove empty extracts\n const _extracts = extractslocations\n .filter(item => item.text.trim().length > 0)\n .map(item => ({\n ...item,\n text: this.sanitizer.bypassSecurityTrustHtml(item.text)\n }));\n\n // finally sort them by relevance index\n _extracts.sort((a, b) => a.relevanceIndex - b.relevanceIndex);\n\n return _extracts;\n }\n\n /*\n * Get the preview configuration from the web service\n * and update the highlights accordingly\n */\n private updateHighlightsFromWebServiceConfiguration() {\n const previewConfig = this.appStore.getWebServiceByType('preview') as CCWebServicePreview;\n // remove \"extracts\" values from the highlights configuration\n const entities = previewConfig.highlights.split(',').filter(h => !this.extracts.includes(h));\n // merge the entities with the default highlights without duplicates\n this.entities = [...new Set([...this.entities, ...entities])];\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { getState } from '@ngrx/signals';\n\nimport { notify } from '@sinequa/atomic';\n\nimport { QueryParamsStore, UserSettingsStore } from '../stores';\nimport { SearchItem } 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 {SearchItem[]} An array of saved searches.\n */\n public getSavedSearches(): SearchItem[] {\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(saveName?: string) {\n const { text } = getState(this.queryParamsStore);\n const display = saveName || text;\n\n if (!display) {\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 } as SearchItem;\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 notify.success('Search successfully saved');\n }\n\n /**\n * Updates the saved searches in the user settings store.\n *\n * @param savedSearches - An array of SearchItem objects to update.\n */\n public updateSavedSearches(savedSearches: SearchItem[]) {\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}\n","import { inject, Injectable, Injector } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\nimport { catchError, map, Observable, of } from 'rxjs';\n\nimport { AuditEvents, globalConfig, Query, Result } from '@sinequa/atomic';\n\nimport { HttpClient } from '@angular/common/http';\nimport { QueryParamsStore, UserSettingsStore } from '../stores';\nimport { QueryService } from './query.service';\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/**\n * Service for performing search operations.\n *\n * @deprecated Use `QueryService` and `QueryParamsStore` instead.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class SearchService {\n protected readonly http = inject(HttpClient);\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 protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n /**\n * Executes a search operation with the given commands and options.\n *\n * @deprecated use `queryParamsStore` to update the query parameters and `queryService.search()` to perform the search.\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 * Retrieves the search result based on the provided query.\n *\n * @deprecated use `queryService.search()` instead.\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).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 *\n * @deprecated use queryService.gotoPage() instead.\n *\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([], {\n audit: {\n type: 'Search_GotoPage',\n detail: {\n page: page,\n fromresultid: this.result ? this.result.id : null\n }\n }\n });\n }\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { computed } from '@angular/core';\nimport { patchState, signalStore, signalStoreFeature, withComputed, 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 assistantIdsToAttach: string[];\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 withMultiSelectionFeatures()\n);\n\nexport function withSelectionFeatures() {\n return signalStoreFeature(\n withState({} as SelectionState),\n\n withMethods(store => ({\n /**\n * Updates the state with the provided new state's properties.\n *\n * @param newState - New state object containing only the properties to update.\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 state 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, assistantIdsToAttach: undefined };\n });\n }\n }))\n );\n}\n\nexport type MultiSelectionState = SelectionState & {\n multiSelection: Article[];\n};\n\nexport function withMultiSelectionFeatures() {\n return signalStoreFeature(\n withState({ multiSelection: [] as Article[] } as MultiSelectionState),\n\n withComputed(({ multiSelection }) => ({\n multiSelectCount: computed(() => multiSelection().length)\n })),\n\n withMethods(store => ({\n /**\n * Add an article to the multi-selection state.\n * @param article - The article to add to the multi-selection.\n */\n addArticleToMultiSelection(article: Article) {\n patchState(store, state => {\n const multiSelection = state.multiSelection || [];\n\n if (!multiSelection.some(a => a.id === article.id)) return { ...state, multiSelection: [...multiSelection, article] };\n\n return state;\n });\n },\n /**\n * Removes an article from the multi-selection state.\n * @param article - The article to remove from the multi-selection.\n */\n removeArticleFromMultiSelection(article: Article) {\n patchState(store, state => {\n const multiSelection = state.multiSelection || [];\n return { ...state, multiSelection: multiSelection.filter(a => a.id !== article.id) };\n });\n },\n /**\n * Clears the multi-selection state by resetting it to an empty array.\n */\n clearMultiSelection() {\n patchState(store, state => ({ ...state, multiSelection: [] }));\n }\n }))\n );\n}\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@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) 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.createUrlTree([], { relativeTo: this.route, queryParams: { id }, queryParamsHandling: 'merge' }).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, 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 * 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 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).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","import { assertInInjectionContext, inject } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { error, globalConfig, info, login, warn } from '@sinequa/atomic';\nimport { NavigationService } from '../services';\n\nexport async function signIn() {\n assertInInjectionContext(signIn);\n\n const router = inject(Router);\n const lastUrlAfterNavigation = inject(NavigationService).urlAfterNavigation;\n\n const { useCredentials, loginPath, userOverrideActive } = globalConfig;\n\n if (useCredentials && !userOverrideActive) {\n router.navigate([loginPath], { queryParams: { returnUrl: lastUrlAfterNavigation } });\n } else if (!userOverrideActive) {\n try {\n const response = await login();\n info('Response from login', response);\n if (!response) {\n warn('No response from login, redirecting to login page', response);\n }\n } catch (err: any) {\n error('Error during login', err);\n if (err.status === 401) {\n error('Unauthorized access - please check your credentials:', err?.errorMessage);\n router.navigate([loginPath]);\n }\n throw err;\n }\n }\n}\n","import { setGlobalConfig } from '@sinequa/atomic';\nimport { ApplicationService } from '../services';\nimport { signIn } from './sign-in';\n\n/**\n * Bootstraps the application by ensuring the user is authenticated and initializing the application.\n *\n * This function first attempts to sign in the user using the provided `Router`. If authentication is successful,\n * it proceeds to initialize the application and create routes using the `applicationService`. Any errors during\n * authentication or initialization are logged to the console, but the returned promise always resolves.\n *\n * @param Router - The application's router instance used for navigation and authentication.\n * @param applicationService - The service responsible for initializing the application and creating routes.\n * @returns A promise that resolves when the application is ready to be initialized, regardless of success or failure.\n */\nexport async function bootstrapApp(applicationService: ApplicationService, { createRoutes = true }): Promise<void> {\n // This function is used to test if the application is ready to be initialized\n // set the createRoutes flag in the global config\n setGlobalConfig({ createRoutes });\n\n return new Promise<void>(resolve => {\n // Check if the user is authenticated\n signIn()\n .then(() => {\n console.log('User authenticated, initializing application...');\n\n // Initialize the application\n if (!createRoutes) {\n // If createRoutes is false, we skip route creation\n applicationService\n .init()\n .then(() => {\n console.log('Application initialized without creating routes');\n resolve();\n })\n .catch(error => {\n console.error('Error initializing application without routes:', error);\n resolve();\n });\n } else {\n applicationService\n .initAndCreateRoutes()\n .then(() => {\n console.log('Application initialized');\n resolve();\n })\n .catch(error => {\n console.error('Error initializing application:', error);\n resolve();\n });\n }\n })\n .catch(error => {\n console.error('Error signing in:', error);\n resolve();\n });\n });\n}\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, AuditEvents, LegacyFilter, QueryParams as QueryParamsState, queryParamsFromUrl, SpellingCorrectionMode } from '@sinequa/atomic';\n\nimport { buildQuery } from '../utils';\nimport { ActivatedRoute, Router } from '@angular/router';\n\n/* shortened query params interface for brevity */\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 b?: string; // basket id\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), router = inject(Router), route = inject(ActivatedRoute)) => ({\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 if (!url) return;\n\n const path = url.split('?')[0];\n\n const { q: text, f, id, p, s: sort, c, t: tab, basket } = 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, basket };\n });\n },\n _updateUrlQueryParams(state: QueryParamsState, audit?: AuditEvents) {\n const { filters, page, sort, tab, text, basket } = state;\n const queryParams: QueryParams = {\n f: filters && filters.length > 0 ? JSON.stringify(filters) : undefined,\n p: page,\n s: sort,\n t: tab,\n q: text,\n b: basket\n };\n router.navigate([], { relativeTo: route, queryParamsHandling: 'merge', queryParams, state: { audit } });\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, audit?: AuditEvents) {\n this.updateFilter(filter, audit);\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, audit?: AuditEvents) {\n patchState(store, state => {\n if (filter === undefined) return state;\n\n const allFilters = state.filters || [];\n let newState;\n\n // search filter by name not by field because many filters can have the same field but different names\n const existing = allFilters.findIndex(f => f.name === filter.name);\n\n // Add filter if it doesn't exist and has values\n if (existing === -1) {\n newState = { ...state, filters: [...(allFilters || []), filter] };\n }\n\n if (existing >= 0) {\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 newState = { ...state, filters: allFilters.filter(f => f.name !== filter.name) };\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 newState = { ...state, filters: (allFilters || []).filter(f => f?.name !== filter.name) };\n }\n\n // Update filter values\n if (existing >= 0) {\n const filters = allFilters.toSpliced(existing, 1, filter);\n newState = { ...state, filters };\n }\n }\n\n this._updateUrlQueryParams(newState || state, audit);\n return newState || 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 const newState = { ...state, filters };\n this._updateUrlQueryParams(newState);\n return newState;\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, column?: string) {\n if (!name) return;\n const filters = getState(store).filters || [];\n // if the filter is not found by name, check if it is found by field\n if (filters.some(f => f.name === name) === false) {\n return this.removeFilter(column);\n }\n\n patchState(store, state => {\n const filters = state.filters?.filter(f => f.name !== name);\n const newState = { ...state, filters };\n this._updateUrlQueryParams(newState);\n return newState;\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 * along with the basket going undefined\n * It uses the `patchState` function to apply the state change.\n */\n clearFilters() {\n patchState(store, state => {\n const newState = { ...state, filters: [], basket: undefined };\n this._updateUrlQueryParams(newState);\n return newState;\n });\n },\n /**\n * Clears the basket from the state.\n *\n * This method updates the state by setting the `basket` property to undefined.\n * It uses the `patchState` function to apply the state change.\n */\n clearBasket() {\n patchState(store, state => {\n const newState = { ...state, basket: undefined };\n this._updateUrlQueryParams(newState);\n return newState;\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>, audit?: AuditEvents) {\n patchState(store, state => {\n const newState = { ...state, ...params };\n this._updateUrlQueryParams(newState, audit);\n return newState;\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 `field` or `name` parameters are provided. If not, returns null.\n * 2. Searches for a filter with a matching name in the store's filters.\n * 3. If no filter is found by name, searches for a filter with a matching field.\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({ field, name }: { field: string | undefined; name: string | undefined }): Partial<LegacyFilter & { count: number }> | null {\n if (!field && !name) return null;\n\n // first try to find the filter by name if name is provided\n let filter: LegacyFilter | undefined = undefined;\n if (name) {\n filter = getState(store).filters?.find(f => f?.name === name);\n }\n if (!filter && field) {\n // if not found by name, try to find it by field if field is provided\n filter = getState(store).filters?.find(f => f?.field === field);\n }\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, basket, 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\n ? ((conceptsFilters.filters as LegacyFilter[]).map(f => f.value) as string[])\n : ([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 ? ({ operator: 'and', filters } as LegacyFilter) : (filters[0] as LegacyFilter);\n\n const query = runInInjectionContext(injector, () => buildQuery({ filters: f, name, sort, spellingCorrectionMode, tab, text, basket }));\n return query;\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 /**\n * Loads the default theme for a given scope.\n *\n * @param {string} scope - The scope for the theme.\n * @param {boolean} [darkMode] - Optional. Enables dark mode.\n */\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, 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 * 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, 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 * 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\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 => element.style.setProperty(key, cssVars[key]));\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco';\n\nimport { AppStore } from '../../stores';\nimport { CSources } from '../../models';\n\n@Component({\n selector: 'source, Source',\n standalone: true,\n imports: [TranslocoPipe],\n templateUrl: './source.component.html',\n providers: [provideTranslocoScope('sources')]\n})\nexport class SourceComponent {\n readonly collection = input<string[]>();\n readonly connector = input<string>('');\n\n private readonly appStore = inject(AppStore);\n\n readonly iconDetails = computed((): { iconClass: string; iconPath?: string } | undefined => {\n const [collection] = this.collection() || [];\n const connector = (this.connector() ?? '').toLocaleLowerCase();\n\n if (!collection) return undefined;\n\n const src = this.appStore.sources() as CSources;\n const name = collection.split('/')[1].toLocaleLowerCase();\n\n const defaultIconClass = 'far fa-file';\n\n if (Array.isArray(src)) {\n const { icon: iconClass = defaultIconClass } = src.find((source: { name: string }) => source.name.toLocaleLowerCase() === name) || {};\n return { iconClass };\n }\n\n if (src.collection && Object.keys(src.collection as {}).includes(collection.toLocaleLowerCase())) {\n const { iconClass = defaultIconClass, iconPath } = src?.collection?.[collection.toLocaleLowerCase()];\n return { iconClass, iconPath };\n }\n if (src.source && Object.keys(src.source as {}).includes(name)) {\n const { iconClass = defaultIconClass, iconPath } = src?.source?.[name.toLocaleLowerCase()];\n return { iconClass, iconPath };\n }\n if (src.connector && Object.keys(src.connector as {}).includes(connector)) {\n const { iconClass = defaultIconClass, iconPath } = src?.connector?.[connector.toLocaleLowerCase()];\n return { iconClass, iconPath };\n }\n\n return { iconClass: defaultIconClass };\n });\n}\n","@if (iconDetails()?.iconPath) {\n <img [src]=\"iconDetails()?.iconPath\" [alt]=\"collection()?.[0] || ('sources.sourceIcon' | transloco)\" />\n} @else {\n <i class=\"{{ iconDetails()?.iconClass }}\" [attr.aria-label]=\"'sources.sourceIcon' | transloco\"></i>\n}\n","import { afterNextRender, Component, effect, ElementRef, inject, input, OnDestroy, signal, untracked, viewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\n\nimport { Article, LegacyFilter } from '@sinequa/atomic';\nimport { ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent } from '@sinequa/ui';\n\nimport { AggregationsStore, QueryParamsStore } from '../../stores';\nimport { SourceComponent } from '../source/source.component';\n\n@Component({\n selector: 'document-locator, DocumentLocator',\n standalone: true,\n imports: [SourceComponent, ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent],\n template: `\n <!-- Renders all segment hidden to user to compute width -->\n <div #shadowRender class=\"pointer-events-none invisible absolute left-0 top-0 -z-10 flex gap-2\">\n @for (segment of locationSegments(); track $index) {\n <span class=\"whitespace-nowrap\">{{ segment }}</span>\n\n @if (!$last) {\n <i class=\"fal fa-chevron-right\"></i>\n }\n }\n </div>\n\n <Source class=\"flex\" [collection]=\"article().collection\" />\n\n <i class=\"fal fa-chevron-right\"></i>\n\n <div #documentLocator class=\"flex grow items-center gap-2 overflow-auto\">\n @for (segment of visibleSegments(); track $index) {\n <span class=\"cursor-pointer whitespace-nowrap\" role=\"button\" (click)=\"navigateToSegment($index)\">{{ segment }}</span>\n\n @if (!$last) {\n <i class=\"fa fal fa-chevron-right\"></i>\n }\n }\n\n @if (visibleSegments().length > 0 && invisibleSegments().length > 0) {\n <i class=\"fa fal fa-chevron-right\"></i>\n }\n\n @if (invisibleSegments().length > 0) {\n <menu>\n <button variant=\"outline\" class=\"h-0 w-full p-2\">...</button>\n\n <MenuContent position=\"bottom\">\n @for (segment of invisibleSegments(); track $index) {\n <MenuItem (click)=\"navigateToSegment($index, true)\">\n {{ segment }}\n </MenuItem>\n }\n </MenuContent>\n </menu>\n }\n </div>\n `,\n host: {\n class: 'flex items-center grow gap-2 overflow-hidden'\n }\n})\nexport class DocumentLocatorComponent implements OnDestroy {\n /**\n * A readonly property that holds the required `Article` input.\n * This property is used to ensure that an `Article` object is provided\n * as an input to the component.\n */\n readonly article = input.required<Article>();\n /**\n * The name of the aggregation to use for the document locator.\n */\n readonly aggregation = input.required<string>();\n\n readonly shadow = viewChild('shadowRender', { read: ElementRef });\n readonly client = viewChild('documentLocator', { read: ElementRef });\n\n readonly el = inject(ElementRef);\n readonly router = inject(Router);\n readonly queryParamStore = inject(QueryParamsStore);\n readonly aggregationStore = inject(AggregationsStore);\n\n readonly locationSegments = signal<string[]>([]);\n readonly visibleSegments = signal<string[]>([]);\n readonly invisibleSegments = signal<string[]>([]);\n\n // margin for dropdown segment with separator\n readonly margin = 70;\n\n previousCount?: number;\n resizeObserver?: ResizeObserver = new ResizeObserver(() => this.onResize());\n\n constructor() {\n this.resizeObserver!.observe(this.el.nativeElement);\n\n afterNextRender({ write: () => this.onResize() });\n\n effect(() => {\n const article = this.article();\n untracked(() => this.locationSegments.set(article.treepath[0]?.split('/').slice(1, -1) ?? []));\n });\n }\n\n ngOnDestroy(): void {\n this.resizeObserver!.disconnect();\n this.resizeObserver = undefined;\n }\n\n onResize(): void {\n const shadowElement = this.shadow()?.nativeElement as HTMLElement;\n const startPos = shadowElement.getBoundingClientRect().left;\n const clientWidth = (this.client()?.nativeElement as HTMLElement).clientWidth;\n\n if (!shadowElement.children || shadowElement.children.length === 0) return;\n\n let i = 0;\n\n for (; i < shadowElement.children.length; ++i) {\n // process if not a separator\n if (i % 2 === 0) {\n const width = shadowElement.children[i].getBoundingClientRect().right - startPos;\n\n if (width + this.margin >= clientWidth) break;\n }\n }\n\n if (!this.previousCount || i !== this.previousCount) {\n this.previousCount = i;\n\n this.visibleSegments.set(this.locationSegments().slice(0, Math.ceil(i / 2)));\n this.invisibleSegments.set(this.locationSegments().slice(Math.ceil(i / 2)));\n }\n }\n\n navigateToSegment(index: number, fromPopover = false): void {\n const aggregation = this.aggregationStore.getAggregation(this.aggregation());\n if (!aggregation) {\n console.error(`Aggregation ${this.aggregation()} not found`);\n return;\n }\n\n let currentFilter = this.queryParamStore.getFilter({ name: aggregation?.name, field: aggregation?.column });\n\n currentFilter ??= { name: aggregation.name, field: aggregation?.column, operator: 'in' } as LegacyFilter;\n currentFilter.values ??= [];\n\n if (fromPopover) {\n currentFilter.values.push(\n `/${this.locationSegments()\n .slice(0, this.locationSegments().length - (this.invisibleSegments().length - index) + 1)\n .join('/')}/*`\n );\n } else {\n currentFilter.values.push(\n `/${this.locationSegments()\n .slice(0, index + 1)\n .join('/')}/*`\n );\n }\n\n this.queryParamStore.updateFilter(currentFilter);\n\n const { filters } = getState(this.queryParamStore);\n\n this.router.navigate([], { queryParams: { f: JSON.stringify(filters) }, queryParamsHandling: 'merge' });\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'error-component, ErrorComponent',\n standalone: true,\n imports: [],\n template: `\n <div class=\"bg-background text-foreground flex min-h-screen flex-col items-center justify-center\">\n <svg\n class=\"mb-8 h-20 w-20 text-red-600\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n <h1 class=\"mb-4 text-4xl font-bold\">Oops! Something went wrong</h1>\n <p class=\"text-muted-foreground mb-8 text-xl\">We apologize for the inconvenience.</p>\n <div class=\"flex space-x-4\">\n <button\n (click)=\"reload()\"\n class=\"btn btn-outline rounded-lg border-neutral-300 text-neutral-700 transition hover:bg-neutral-200 hover:text-neutral-700\">\n <svg\n class=\"mr-2 h-4 w-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <path d=\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\" />\n <path d=\"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n </svg>\n Go to Homepage\n </button>\n </div>\n </div>\n `\n})\nexport class ErrorComponent {\n router = inject(Router);\n\n reload() {\n this.router.navigate(['/']).then(() => window.location.reload());\n }\n}\n","import { Component, computed, DestroyRef, effect, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\n\nimport { isAuthenticated, login } from '@sinequa/atomic';\n\nimport { ApplicationStore, QueryParamsStore } from '../../stores';\n\n@Component({\n selector: 'app-wait',\n standalone: true,\n imports: [],\n template: `\n <div class=\"flex h-[100dvh] w-full items-center justify-center\">\n <div class=\"flex flex-col items-center space-y-4\">\n <span class=\"loader\"></span>\n </div>\n </div>\n `,\n styles: [\n `\n .loader {\n --w: 96px;\n --h: 96px;\n\n transform: rotateZ(45deg);\n perspective: 1000px;\n border-radius: 50%;\n width: var(--w);\n height: var(--h);\n color: #0040bf; /* Sinequa blue */\n }\n .loader:before,\n .loader:after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: inherit;\n height: inherit;\n border-radius: 50%;\n transform: rotateX(70deg);\n animation: 1s spin linear infinite;\n }\n .loader:after {\n color: #ff854a; /* Sinequa orange */\n transform: rotateY(70deg);\n animation-delay: 0.4s;\n }\n\n @keyframes rotate {\n 0% {\n transform: translate(-50%, -50%) rotateZ(0deg);\n }\n 100% {\n transform: translate(-50%, -50%) rotateZ(360deg);\n }\n }\n\n @keyframes rotateccw {\n 0% {\n transform: translate(-50%, -50%) rotate(0deg);\n }\n 100% {\n transform: translate(-50%, -50%) rotate(-360deg);\n }\n }\n\n @keyframes spin {\n 0%,\n 100% {\n box-shadow: 0.4em 0px 0 0px currentcolor;\n }\n 12% {\n box-shadow: 0.4em 0.4em 0 0 currentcolor;\n }\n 25% {\n box-shadow: 0 0.4em 0 0px currentcolor;\n }\n 37% {\n box-shadow: -0.4em 0.4em 0 0 currentcolor;\n }\n 50% {\n box-shadow: -0.4em 0 0 0 currentcolor;\n }\n 62% {\n box-shadow: -0.4em -0.4em 0 0 currentcolor;\n }\n 75% {\n box-shadow: 0px -0.4em 0 0 currentcolor;\n }\n 87% {\n box-shadow: 0.4em -0.4em 0 0 currentcolor;\n }\n }\n `\n ]\n})\nexport class LoadingComponent {\n protected readonly state = computed(() => getState(this.application));\n\n private readonly application = inject(ApplicationStore);\n private readonly queryParamsStore = inject(QueryParamsStore);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n constructor(destroyRef: DestroyRef) {\n const timeout = setTimeout(() => {\n this.router.navigate(['/error'], {\n queryParams: { returnUrl: this.route.snapshot.queryParams['returnUrl'] }\n });\n }, 5000);\n\n destroyRef.onDestroy(() => {\n // clear the timeout if the component is destroyed\n clearTimeout(timeout);\n });\n\n effect(() => {\n const { ready } = this.state();\n\n if (ready) {\n // clear the timeout if the application is ready\n clearTimeout(timeout);\n\n setTimeout(() => {\n const url = this.route.snapshot.queryParams['returnUrl'] || null;\n if (!url) {\n this.router.navigateByUrl(url);\n // ! we need to set the query params from the url once only\n this.queryParamsStore.setFromUrl(url);\n } else {\n this.router.navigate(['/']);\n }\n }, 700);\n }\n });\n\n if (!isAuthenticated()) {\n this.application.updateReadyState(false);\n login()\n .then(() => {\n this.application.updateReadyState(true);\n })\n .catch(err => {\n console.error('Error during login:', err);\n this.router.navigate(['/error']);\n });\n }\n }\n}\n","import { Component, computed, input, numberAttribute, output } from '@angular/core';\n\nimport { Article, KeyOf, LegacyFilter, getMetadata } from '@sinequa/atomic';\nimport { BadgeComponent, BadgeVariants } from '@sinequa/ui';\n\n@Component({\n selector: 'Metadata, metadata',\n exportAs: 'metadata',\n standalone: true,\n imports: [BadgeComponent],\n template: `\n @for (item of items().slice(0, limit()); track $index) {\n @if (item) {\n <badge [variant]=\"variant()\" [class]=\"class()\" (click)=\"handleClick($event, { field: this.metadata(), value: item })\">{{ item }}</badge>\n }\n }\n `,\n host: {\n '[class.hidden]': 'items().length === 0'\n },\n styles: [\n `\n :host {\n display: contents;\n\n &,\n &:hover {\n background-color: transparent;\n }\n }\n `\n ]\n})\nexport class MetadataComponent {\n click = output<{ filter: LegacyFilter; event: Event }>();\n\n class = input<string>();\n variant = input<BadgeVariants['variant']>('default');\n\n metadata = input.required<KeyOf<Article> | (string & Record<never, never>)>();\n article = input.required<Partial<Article> | (string & Record<never, never>)>();\n limit = input(undefined, { transform: (value: string | number | undefined) => (value ? Math.max(0, Number(value)) : undefined) });\n\n items = computed(() => getMetadata(this.article(), this.metadata()));\n\n handleClick(event: Event, item: LegacyFilter) {\n this.click.emit({ filter: item, event });\n }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\nimport { Article } from '@sinequa/atomic';\nimport { QueryParamsStore } from '../../stores';\n\n@Component({\n selector: 'missing-terms, MissingTerms, missingterms',\n standalone: true,\n imports: [TranslocoPipe, RouterLink],\n templateUrl: './missing-terms.component.html',\n providers: [provideTranslocoScope('article')],\n styles: `\n .term {\n text-decoration-line: line-through;\n }\n `\n})\nexport class MissingTermsComponent {\n public readonly article = input.required<Article>();\n\n queryParamsStore = inject(QueryParamsStore);\n router = inject(Router);\n\n public missingTerms = computed(() => {\n const query = this.queryParamsStore.getQuery();\n return this.article()\n .termspresence?.filter(tp => tp.presence === 'missing')\n .map(tp => {\n const text = (query.text || '').replace(new RegExp(`\\\\b${tp.term}\\\\b`, 'gi'), '');\n return {\n value: tp.term,\n queryParams: { q: `${text} +[${tp.term}]` }\n };\n });\n });\n}\n","@if ((missingTerms() || []).length > 0) {\n <span class=\"terms-label\">{{ 'article.missingTerms' | transloco }}</span>\n <span class=\"terms\">\n @for (term of missingTerms(); track $index) {\n <span class=\"term ms-1\">{{ term.value }}</span>\n }\n </span>\n <span class=\"mx-1\">|</span>\n <span class=\"terms-label ms-1\">{{ 'article.mustInclude' | transloco }}</span>\n <span class=\"terms\">\n @for (term of missingTerms(); track $index) {\n <a role=\"button\" class=\"ms-1\" routerLink=\"search\" [queryParams]=\"term.queryParams\" (click)=\"$event.stopPropagation()\">{{ term.value }}</a>\n }\n </span>\n}\n","import { Component, computed, ElementRef, inject, linkedSignal, output, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { Article, bisect } from '@sinequa/atomic';\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogResult,\n DialogTitleComponent,\n InputComponent,\n ListItemComponent\n} from '@sinequa/ui';\n\nimport { Basket } from '../../../models';\nimport { QueryParamsStore, UserSettingsStore } from '../../../stores';\n\n@Component({\n selector: 'add-to-collection-dialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogContentComponent,\n DialogFooterComponent,\n ListItemComponent,\n InputComponent\n ],\n providers: [provideTranslocoScope('collections')],\n template: `\n <dialog #dialog (closed)=\"closeBtn.click()\">\n <DialogHeader>\n <DialogTitle>{{ 'collections.addToCollection' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent>\n <ul class=\"flex flex-col\" role=\"list\">\n @for (collection of collections(); track $index) {\n <li role=\"listitem\" (click)=\"addToCollection(collection, $index)\">\n @if (collectionsMap()[collection.name] === 'all') {\n <i class=\"fa-fw fa-regular fa-square-check\"></i>\n } @else if (collectionsMap()[collection.name] === 'some') {\n <i class=\"fa-fw fa-regular fa-square-minus\"></i>\n } @else {\n <i class=\"fa-fw fa-regular fa-square\"></i>\n }\n {{ collection.name }}\n </li>\n } @empty {\n <li class=\"py-4 text-center text-neutral-500\">\n {{ 'collections.noCollections' | transloco }}\n </li>\n }\n </ul>\n\n @if (creating()) {\n <input\n #createInput\n class=\"mt-2\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.aria-label]=\"'collections.collectionName' | transloco\"\n [attr.placeholder]=\"'collections.collectionName' | transloco\"\n [ngModel]=\"newCollectionName()\"\n (ngModelChange)=\"newCollectionName.set($event)\"\n (keydown.escape)=\"$event.preventDefault(); creating.set(false)\"\n (keydown.enter)=\"createCollection()\" />\n }\n </DialogContent>\n\n <DialogFooter class=\"flex flex-col\">\n <div class=\"flex w-full gap-1\">\n <button\n variant=\"outline\"\n class=\"grow\"\n tabindex=\"0\"\n [attr.title]=\"(creating() ? 'collections.cancelCreation' : 'collections.createCollection') | transloco\"\n (click)=\"onCreate()\">\n {{ (creating() ? 'collections.cancelCreation' : 'collections.createCollection') | transloco }}\n </button>\n @if (creating()) {\n <button class=\"grow\" tabindex=\"0\" [attr.title]=\"'collections.create' | transloco\" [disabled]=\"!newCollectionName()\" (click)=\"createCollection()\">\n {{ 'collections.create' | transloco }}\n </button>\n }\n </div>\n <button #closeBtn (click)=\"onClose($event)\" class=\"self-end\">\n {{ 'collections.close' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class CollectionsDialog implements DialogInterface {\n readonly closed = output<DialogResult>();\n\n readonly createInputElement = viewChild<ElementRef<HTMLInputElement>>('createInput');\n readonly dialogElement = viewChild<DialogComponent>(DialogComponent);\n\n private readonly queryParamStore = inject(QueryParamsStore);\n private readonly userSettingsStore = inject(UserSettingsStore);\n\n readonly collection = signal<string | undefined>(undefined);\n\n readonly article = signal<Article[]>([]);\n readonly newCollectionName = signal<string>('');\n readonly creating = signal<boolean>(false);\n readonly removedFromCollection = signal<boolean>(false);\n readonly collections = computed<Basket[]>(() => this.userSettingsStore.baskets());\n // Compute map of collection names to their article inclusion status\n readonly collectionsMap = linkedSignal(() =>\n this.collections().reduce<Record<string, 'all' | 'some' | 'none'>>((acc, collection) => {\n acc[collection.name] = this.containsArticle(collection);\n return acc;\n }, {})\n );\n\n open(article: Article | Article[]): void {\n if (!Array.isArray(article)) this.article.set([article]);\n else this.article.set(article);\n\n const { basket } = getState(this.queryParamStore);\n this.collection.set(basket);\n\n this.dialogElement()!.showModal();\n }\n\n containsArticleByName(collectionName: string): boolean {\n const collection = this.collections().find(c => c.name === collectionName);\n return !!collection && this.containsArticle(collection) !== 'none';\n }\n\n containsArticle(collection: Basket): 'all' | 'some' | 'none' {\n let b = bisect(this.article(), a => !!collection.ids?.includes(a.id));\n\n if (b.false.length === 0) return 'all';\n else if (b.true.length === 0) return 'none';\n\n return 'some';\n }\n\n onCreate(): void {\n if (this.creating()) return this.creating.set(false);\n\n this.creating.set(true);\n\n // Focus the input element with a delay because the input element is not yet rendered\n setTimeout(() => {\n this.createInputElement()?.nativeElement.focus();\n }, 1);\n }\n\n async onClose(e: Event) {\n this.dialogElement()!.close(e);\n\n // if we removed the article from the current collection,\n // we notify it using the \"dialog-confirm\" event which can\n // be caught by the app to trigger a refresh\n if (this.removedFromCollection()) {\n this.closed.emit('dialog-confirm');\n }\n }\n\n async addToCollection(collection: Basket, collectionIndex: number): Promise<void> {\n const ids = this.article()\n .map(article => article.id)\n .filter(id => !!id);\n\n if (!ids || ids.length === 0) return;\n\n if (this.containsArticle(collection) !== 'none') {\n // remove it\n const articleIds = this.article().map(a => a.id);\n collection.ids = collection.ids?.filter(id => !articleIds.includes(id)) ?? [];\n } else {\n // add it\n if (!collection.ids) collection.ids = [];\n\n const uniqueIds = new Set([...(collection.ids ?? []), ...this.article().map(x => x.id)]);\n collection.ids.push(...Array.from(uniqueIds));\n }\n\n try {\n await this.userSettingsStore.updateBasket(collection, collectionIndex);\n this.removedFromCollection.set(!!this.collection() && !this.containsArticleByName(this.collection()!));\n } catch (e) {\n console.error('Error updating collection:', e);\n }\n }\n\n createCollection(): void {\n if (!this.newCollectionName()) return;\n\n const collection: Basket = { name: this.newCollectionName() };\n this.userSettingsStore.createBasket(collection);\n this.newCollectionName.set('');\n this.creating.set(false);\n }\n}\n","import { HttpClient, HttpResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { map, Observable } from 'rxjs';\n\nimport { Article, AuditEventType, ExportOutputFormat, ExportQueryModel, ExportSourceType, globalConfig, Query } from '@sinequa/atomic';\n\nexport type ExportQueryOptions = {\n model: ExportQueryModel;\n appName: string;\n query: Query;\n article?: Article;\n name?: string;\n selection?: string[];\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ExportService {\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n protected readonly http = inject(HttpClient);\n\n /**\n * Downloads a file based on the provided options and triggers a browser download.\n *\n * @param options - The options for the download operation.\n * @param options.model - The export query model containing web service, format, max count, and exported columns.\n * @param options.appName - The name of the application initiating the download.\n * @param options.query - The query object used for the export operation.\n * @param options.article - (Optional) The article associated with the export.\n * @param options.name - (Optional) The custom name for the downloaded file. If not provided, the name is extracted from the response headers.\n * @param options.selection - (Optional) An array of id of selected items to export.\n * @returns An observable that emits the HTTP response containing the file blob.\n *\n * @remarks\n * This method handles file downloads for both modern browsers and Internet Explorer.\n * For modern browsers, it creates a temporary anchor element to trigger the download.\n * For Internet Explorer, it uses `msSaveOrOpenBlob` to handle the download.\n *\n * @example\n * ```typescript\n * const options = {\n * model: { webService: 'service', format: 'csv', maxCount: 100, exportedColumns: [] },\n * appName: 'MyApp',\n * query: myQuery,\n * name: 'exported-file.csv'\n * };\n * exportService.download(options).subscribe(response => {\n * console.log('File downloaded successfully');\n * });\n * ```\n */\n public download(options: ExportQueryOptions): Observable<HttpResponse<Blob>> {\n const { model, appName, query, article, name, selection } = options;\n return this.exportResult(appName, model.webservice, query, model.format, article, model.maxcount, model.exportedColumns, selection).pipe(\n map((response: HttpResponse<Blob>) => {\n const header = response.headers.get('content-disposition');\n const fileName = name || (header !== null ? header!.split('filename=')[1].replace('\"', '').replace('\"', '') : '');\n\n if (response.body === null) return response;\n const navigator: any = window.navigator;\n if (navigator && navigator.msSaveOrOpenBlob) {\n // For IE\n navigator.msSaveOrOpenBlob(response.body, fileName);\n } else {\n const link = document.createElement('a');\n document.body.appendChild(link);\n const blobUrl = window.URL.createObjectURL(response.body);\n link.href = blobUrl;\n link.download = fileName || `export.csv`;\n link.click();\n link.remove();\n window.URL.revokeObjectURL(blobUrl);\n }\n\n return response;\n })\n );\n }\n\n /**\n * Exports the current result.\n *\n * @param webService The configuration for the export web service.\n * @param query The query to export.\n * @param format The export format.\n * @param maxCount (Optional) The maximum number of exported rows.\n * @param exportedColumns (Optional) The columns to export, empty means all columns.\n * @param selection - (Optional) The list of id of selected items to export.\n *\n * @remarks If `selection` is provided, the type of export will be set to 'Selection'.\n */\n public exportResult(\n appName: string,\n webService: string,\n query: Query,\n format: ExportOutputFormat,\n results?: Article,\n maxCount?: number,\n exportedColumns?: string[],\n selection?: string[]\n ): Observable<HttpResponse<Blob>> {\n const type: ExportSourceType = selection && selection.length > 0 ? 'Selection' : 'Result';\n\n const postData = {\n app: appName,\n webService,\n query,\n type,\n format: format,\n maxCount: maxCount ? maxCount.toString() : undefined,\n exportedColumns: exportedColumns,\n selection: (selection ?? []).length > 0 ? selection : undefined,\n $auditRecord: {\n type: AuditEventType.Search_ExportCSV,\n detail: {\n resultid: results ? results.id : undefined\n }\n }\n };\n\n return this.http.post(this.API_URL + '/query.export', postData, {\n observe: 'response',\n responseType: 'blob'\n });\n }\n}\n","import { Component, DestroyRef, inject, linkedSignal, model, output, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { CCApp, CCWebService, ExportOutputFormat, ExportQueryModel } from '@sinequa/atomic';\nimport {\n ButtonComponent,\n cn,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent,\n SwitchComponent\n} from '@sinequa/ui';\nimport { AppStore, QueryParamsStore } from '../../../stores';\nimport { ExportQueryOptions, ExportService } from '../export.service';\n\ninterface CCQueryExport extends CCWebService {\n webServiceType: 'queryexport';\n columns?: { column$: CCQueryExportColumnDef[] };\n linksFilterDuplicateUrls?: boolean;\n linksGlobalRelevance?: string;\n linksMaxCount?: number;\n linksSortByOrder?: boolean;\n maxCount?: number;\n separator?: string;\n}\n\ninterface CCQueryExportColumnDef {\n title: string;\n pattern: string;\n selectionQuery?: string;\n}\n\n@Component({\n selector: 'export-dialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogContentComponent,\n DialogFooterComponent,\n SwitchComponent\n ],\n providers: [provideTranslocoScope('export')],\n template: `\n <dialog #dialog>\n <DialogHeader>\n <DialogTitle>{{ 'export.title' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent\n class=\"flex flex-col gap-4 [&_section>h1]:text-sm [&_section>h1]:font-semibold [&_section>h1]:text-gray-500 [&_section]:flex [&_section]:flex-col [&_section]:gap-2\">\n <section>\n <h1>{{ 'export.from' | transloco }}</h1>\n <div class=\"flex items-center gap-2\">\n <a role=\"button\" [class]=\"cn('cursor-pointer', !fromSelection() ? 'text-primary font-semibold' : '')\" (click)=\"fromSelection.set(false)\">\n {{ 'export.fromQuery' | transloco }}\n </a>\n <Switch size=\"xs\" [(toggled)]=\"fromSelection\" />\n <a role=\"button\" [class]=\"cn('cursor-pointer', fromSelection() ? 'text-primary font-semibold' : '')\" (click)=\"fromSelection.set(true)\">\n {{ 'export.fromSelection' | transloco }}\n </a>\n </div>\n </section>\n\n <section>\n <h1>{{ 'export.outputFormat' | transloco }}</h1>\n <select\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n id=\"format\"\n [(ngModel)]=\"format\">\n @for (format of supportedFormats; track $index) {\n <option [value]=\"format\">{{ format.toUpperCase() }}</option>\n }\n </select>\n </section>\n\n <section>\n <h1>{{ 'export.exportColumns' | transloco }}</h1>\n <select\n id=\"exportedColumns\"\n class=\"hover:outline-primary focus:outline-primary w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n multiple\n [(ngModel)]=\"columnsToExport\">\n @for (column of exportableColumns(); track $index) {\n <option [value]=\"column\">{{ column }}</option>\n }\n </select>\n </section>\n\n <section>\n <h1>{{ 'export.maxLines' | transloco }}</h1>\n <input\n type=\"number\"\n id=\"maxCount\"\n min=\"1\"\n autocomplete=\"off\"\n spellcheck=\"off\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n [(ngModel)]=\"maxCount\"\n (input)=\"onMaxCountInput($event)\" />\n </section>\n </DialogContent>\n\n <DialogFooter>\n <button variant=\"outline\" (click)=\"dialog.close($event)\">\n {{ 'cancel' | transloco }}\n </button>\n <button tabindex=\"0\" [attr.title]=\"'export.download' | transloco\" (click)=\"onDownload($event)\">\n {{ 'export.download' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class ExportDialog implements DialogInterface {\n cn = cn;\n\n onExport = output<ExportQueryModel>();\n\n private appStore = inject(AppStore);\n readonly exportService = inject(ExportService);\n readonly queryParamsStore = inject(QueryParamsStore);\n\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n private selection = signal<string[]>([]);\n readonly fromSelection = linkedSignal(() => this.selection()?.length > 0);\n public exportableColumns = signal<string[]>([]);\n public readonly supportedFormats: ExportOutputFormat[] = ['Csv', 'Xlsx', 'Json'];\n\n public format = model<ExportOutputFormat>('Csv');\n public maxCount = model<number | undefined>(undefined);\n public columnsToExport = model<string[]>([]);\n\n private destroyRef = inject(DestroyRef);\n\n open(selection?: string[]): void {\n const app = getState(this.appStore) as CCApp;\n const webservice = app.queryExport;\n\n let queryExport: CCQueryExport;\n\n if (selection && selection.length > 0) this.selection.set(selection!);\n\n if (webservice) {\n queryExport = app.webServices[webservice] as CCQueryExport;\n\n if (queryExport) {\n const columns = queryExport.columns?.column$ || [];\n this.exportableColumns.set(columns.map(column => column.title));\n\n if (queryExport.maxCount && typeof queryExport.maxCount === 'number') {\n this.maxCount.set(queryExport.maxCount);\n }\n }\n }\n\n setTimeout(() => {\n this.dialog()!.showModal();\n });\n }\n\n onDownload(e: Event) {\n const app = getState(this.appStore) as CCApp;\n const webservice = app.queryExport;\n\n const model: ExportQueryModel = {\n format: this.format(),\n export: 'Result',\n maxcount: this.maxCount() && this.maxCount()! > 0 ? this.maxCount() : undefined,\n exportedColumns: this.columnsToExport().length ? this.columnsToExport() : undefined,\n webservice: webservice\n };\n\n const { name } = getState(this.appStore) as CCApp;\n const query = this.queryParamsStore.getQuery();\n const selection = this.selection();\n const payload = { model, appName: name, query } as ExportQueryOptions;\n\n if (this.fromSelection()) payload.selection = selection;\n\n this.exportService.download(payload).pipe(takeUntilDestroyed(this.destroyRef)).subscribe();\n\n this.dialog()!.close(e);\n }\n\n onMaxCountInput(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.valueAsNumber < 1) {\n input.value = '1';\n this.maxCount.set(1);\n }\n }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { getState } from '@ngrx/signals';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { CCApp } from '@sinequa/atomic';\nimport { cn, DialogService } from '@sinequa/ui';\n\nimport { CollectionsDialog } from '../../features/collections/dialogs/add.dialog';\nimport { ExportDialog } from '../../features/export/dialogs/export.dialog';\nimport { AppStore, SelectionStore } from '../../stores';\nimport { APP_FEATURES } from '../../tokens/app-features';\n\nconst multiSelectionToolbarVariants = cva(\n 'flex divide-x rounded-xl bg-gradient-to-b px-3 py-2 text-sm shadow [&>li]:px-2 [&_ul]:flex [&_ul]:flex-col [&_ul]:p-1',\n {\n variants: {\n variant: {\n dark: 'from-gray-500 to-gray-900 divide-gray-800 text-white',\n light: 'from-white to-purple-50 divide-gray-400 text-gray-800',\n glassy: 'from-transparent to-white divide-gray-300 text-gray-800 backdrop-blur-[15px]'\n }\n },\n defaultVariants: {\n variant: 'dark'\n }\n }\n);\nexport type MultiSelectionToolbarVariants = VariantProps<typeof multiSelectionToolbarVariants>;\n\n@Component({\n selector: 'MultiSelectionToolbar, multi-selection-toolbar',\n template: `\n <menu id=\"multi-select-toolbar\" [class]=\"cn(variants(), className())\">\n <li class=\"!ps-0\">\n {{ count() }} items selected\n <button class=\"cursor-pointer\" (click)=\"clearSelection()\">\n <i class=\"fa-fw far fa-xmark\"></i>\n </button>\n </li>\n\n <li>\n <button class=\"cursor-pointer\" title=\"menu\" [attr.aria-label]=\"'menu'\" (click)=\"openCollectionDialog()\">\n <i class=\"fa-fw far fa-inbox\"></i>\n Collections\n </button>\n </li>\n\n <li>\n <button class=\"cursor-pointer\" (click)=\"openExportDialog()\">\n <i class=\"fa-fw far fa-file-export\"></i>\n Export\n </button>\n </li>\n\n @if (enabledUserInput()) {\n <li class=\"!pe-0\">\n <button class=\"cursor-pointer\" (click)=\"attachToAssistant()\">\n <i class=\"fa-fw far fa-sparkles\"></i>\n Send to AI\n </button>\n </li>\n }\n </menu>\n `,\n host: {\n class: 'fixed bottom-[-40px] left-[50%] translate-x-[-50%] z-50 transition-[translate,opacity,discrete] duration-300 opacity-0',\n '[class.opacity-100]': 'count() > 0',\n '[class.-translate-y-14]': 'count() > 0'\n }\n})\nexport class MultiSelectionToolbarComponent {\n cn = cn;\n\n readonly appStore = inject(AppStore);\n readonly selection = inject(SelectionStore);\n readonly dialog = inject(DialogService);\n readonly appFeatures = inject(APP_FEATURES);\n\n readonly className = input<string>('');\n readonly variant = input<MultiSelectionToolbarVariants['variant']>('dark');\n\n readonly count = this.selection.multiSelectCount;\n readonly variants = computed(() => cn(multiSelectionToolbarVariants({ variant: this.variant(), class: this.className() })));\n readonly ids = computed(() => getState(this.selection).multiSelection.map(x => x.id));\n readonly instanceId = computed(() => {\n const {\n assistant: { usePrefixName = true }\n } = this.appFeatures;\n if (usePrefixName) {\n const { name } = getState(this.appStore) as CCApp;\n return `${name}-search-results-assistant`;\n }\n return `search-results-assistant`;\n });\n readonly enabledUserInput = computed(() => this.appStore.assistants()[this.instanceId()]?.['modeSettings']?.['enabledUserInput'] === true);\n\n clearSelection = () => this.selection.clearMultiSelection();\n openCollectionDialog = () => this.dialog.open(CollectionsDialog, getState(this.selection).multiSelection);\n openExportDialog = () => this.dialog.open(ExportDialog, this.ids());\n attachToAssistant = () => this.selection.update({ assistantIdsToAttach: this.ids() });\n}\n","import { afterNextRender, Directive, ElementRef, input, OnDestroy, output } from '@angular/core';\n\n/**\n * Represents a directive that enables infinite scrolling behavior.\n * This directive listens for the intersection of the element with the viewport\n * and emits a `loadMore` event when the element becomes visible.\n *\n * @remarks\n * This directive requires the `IntersectionObserver` API to be available in the browser.\n *\n * @example\n * ```html\n * <div infinityScroll (onScroll)=\"loadMore()\">\n * <!-- Content to be scrolled -->\n * </div>\n * ```\n *\n */\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[infinity-scroll]',\n standalone: true\n})\nexport class InfinityScrollDirective implements OnDestroy {\n options = input({ root: null });\n onScroll = output();\n\n private observer = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) {\n this.onScroll.emit();\n }\n }, this.options());\n\n constructor(private el: ElementRef) {\n afterNextRender(() => {\n this.observer.observe(this.el.nativeElement);\n });\n }\n\n ngOnDestroy() {\n this.observer.disconnect();\n }\n}\n","import { afterNextRender, computed, Directive, effect, inject, input, OnDestroy, output, Renderer2, signal, untracked } from '@angular/core';\n\nexport type KeyboardNavigationOnSelectionHandlers = {\n hideListbox?: boolean;\n resetSelection?: boolean;\n};\n\nexport type KeyboardNavigatorOptions = {\n name?: string; // Used for debugging or identification\n optionSelector: string;\n direction?: 'horizontal' | 'vertical' | 'both';\n selectOnFocus?: boolean;\n resetSelectionOnBlur?: boolean;\n onSelectionHandlers?: KeyboardNavigationOnSelectionHandlers;\n};\n\nconst defaultNavigatorOptions: KeyboardNavigatorOptions = {\n name: 'defaultNavigator',\n optionSelector: '[role=\"option\"]:not([aria-disabled=\"true\"])',\n direction: 'vertical',\n selectOnFocus: false,\n resetSelectionOnBlur: false,\n onSelectionHandlers: {\n hideListbox: true,\n resetSelection: true\n }\n};\n\n@Directive({\n selector: 'input[role=\"combobox\"]',\n standalone: true,\n host: {\n '(focus)': 'focus()',\n '(blur)': 'blur()',\n '(keydown.arrowup)': 'up()',\n '(keydown.arrowdown)': 'down()',\n '(keydown.arrowleft)': 'left()',\n '(keydown.arrowright)': 'right()',\n '(keydown.home)': 'home()',\n '(keydown.end)': 'end()',\n '(keydown.pageup)': 'pageUp()',\n '(keydown.pagedown)': 'pageDown()',\n '(keydown.enter)': 'enter()',\n '(keydown.escape)': 'escape()',\n '[attr.aria-expanded]': 'ariaExpanded()',\n '[attr.aria-activedescendant]': 'activeDescendant()'\n }\n})\nexport class KeyboardNavigatorDirective implements OnDestroy {\n readonly keyboardNavigator = input(defaultNavigatorOptions, { transform: this.normalizeOptions });\n readonly listboxId = input<string>('', { alias: 'aria-controls' });\n\n readonly onFocus = output<void>();\n readonly onBlur = output<void>();\n readonly onSelected = output<HTMLElement | null>();\n\n readonly ariaExpanded = signal<boolean>(false);\n readonly activeDescendant = signal<string | undefined>(undefined);\n\n private readonly renderer = inject(Renderer2);\n\n private readonly listboxElement = signal<HTMLElement | null>(null);\n private readonly items = signal<HTMLElement[] | null>(null);\n private readonly hasItems = computed(() => this.items() && this.items()!.length > 0);\n private readonly currentIndex = signal<number>(-1);\n private readonly previousIndex = signal<number>(-1);\n\n private readonly unlisteners: (() => void)[] = [];\n private readonly mutationObserver = new MutationObserver(() => this.setItems());\n\n constructor() {\n // Try to attach the listbox element after the first render\n afterNextRender(() => this.attachListboxElement());\n\n // Re-attach the listbox element whenever the listboxId changes\n effect(() => {\n this.listboxId();\n untracked(() => this.attachListboxElement());\n });\n }\n\n ngOnDestroy(): void {\n this.mutationObserver.disconnect();\n this.cleanupListeners();\n }\n\n /** Attaches the listbox element based on the `listboxId`. */\n private attachListboxElement(): void {\n if (!this.listboxId()) return;\n\n this.setListboxElement();\n\n if (!this.listboxElement()) return;\n\n this.setItems();\n\n this.mutationObserver.observe(this.listboxElement()!, { childList: true });\n }\n\n /**\n * Merges given option with default options.\n * @param {KeyboardNavigatorOptions} options - Options to merge with defaults.\n * @returns {KeyboardNavigatorOptions} Merged options.\n */\n normalizeOptions(options: KeyboardNavigatorOptions): KeyboardNavigatorOptions {\n return Object.assign({}, defaultNavigatorOptions, options);\n }\n\n //#region DOM Events\n\n /** Focuses the listbox and selects the first item if configured to do so. */\n focus(): void {\n this.showListbox();\n\n if (this.keyboardNavigator()?.selectOnFocus && this.hasItems() && this.currentIndex() === -1) {\n this.currentIndex.set(0);\n this.updateActiveItem();\n }\n\n this.onFocus.emit();\n }\n\n /** Blurs the listbox, hiding it and resetting selection if configured to do so. */\n blur(): void {\n this.hideListbox();\n\n if (this.keyboardNavigator()?.resetSelectionOnBlur) this.resetSelection();\n\n this.onBlur.emit();\n }\n\n /**\n * Moves selection to previous element in vertical and both navigation directions.\n * Does nothing if navigation direction is set to horizontal.\n */\n up(): void {\n if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n this.moveSelection(-1);\n }\n\n /**\n * Moves selection to next element in vertical and both navigation directions.\n * Does nothing if navigation direction is set to horizontal.\n */\n down(): void {\n if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n this.moveSelection(1);\n }\n\n /**\n * Moves selection to first element in vertical and both navigation directions.\n * Does nothing if navigation direction is set to horizontal.\n */\n pageUp(): void {\n if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n this.moveSelection(-1, true);\n }\n\n /**\n * Moves selection to last element in vertical and both navigation directions.\n * Does nothing if navigation direction is set to horizontal.\n */\n pageDown(): void {\n if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n this.moveSelection(1, true);\n }\n\n /**\n * Moves selection to previous element in horizontal and both navigation directions.\n * Does nothing if navigation direction is set to vertical.\n */\n left(): void {\n if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n this.moveSelection(-1);\n }\n\n /**\n * Moves selection to next element in horizontal and both navigation directions.\n * Does nothing if navigation direction is set to vertical.\n */\n right(): void {\n if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n this.moveSelection(1);\n }\n\n /**\n * Moves selection to first element in horizontal and both navigation directions.\n * Does nothing if navigation direction is set to vertical.\n */\n home(): void {\n if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n this.moveSelection(-1, true);\n }\n\n /**\n * Moves selection to last element in horizontal and both navigation directions.\n * Does nothing if navigation direction is set to vertical.\n */\n end(): void {\n if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n this.moveSelection(1, true);\n }\n\n /**\n * Selects the currently focused item and emits it.\n * Hides the listbox and resets selection if configured to do so.\n */\n enter(): void {\n const element = this.items()?.[this.currentIndex()];\n\n this.onSelected.emit(element ?? null);\n\n if (this.keyboardNavigator()?.onSelectionHandlers?.hideListbox) this.hideListbox();\n if (this.keyboardNavigator()?.onSelectionHandlers?.resetSelection) this.resetSelection();\n }\n\n /** Does nothing. */\n escape(): void {}\n\n //#endregion DOM Events\n\n /**\n * Sets the listbox element based on the provided `listboxId`, expected to\n * be set via the `aria-controls` attribute. If the element is not found,\n * logs an error.\n */\n private setListboxElement(): void {\n const target = document.getElementById(this.listboxId());\n\n if (!target) {\n console.error(`NavigatorDirective: target element with id ${this.listboxId()} not found`);\n return;\n }\n\n this.listboxElement.set(target);\n }\n\n /**\n * Sets the items in the listbox by querying for elements matching the `optionSelector`.\n * Cleans up previous listeners and hooks new ones to handle item clicks.\n * Resets the selection state.\n */\n private setItems(): void {\n if (!this.listboxElement()) {\n console.error('NavigatorDirective: listbox element is not set');\n return;\n }\n\n this.cleanupListeners();\n\n const items = Array.from(this.listboxElement()!.querySelectorAll(this.keyboardNavigator()!.optionSelector)) as HTMLElement[];\n this.items.set(items);\n\n this.hookItemsClicks();\n this.resetSelection();\n }\n\n /** Cleans up all event listeners that were added to the items. */\n private cleanupListeners(): void {\n this.unlisteners.forEach(unlisten => unlisten());\n this.unlisteners.length = 0;\n }\n\n //#region Selection\n\n /** Resets the selection state. */\n public resetSelection(): void {\n this.currentIndex.set(-1);\n this.previousIndex.set(-1);\n this.activeDescendant.set(undefined);\n this.items()?.forEach(item => this.renderer.setAttribute(item, 'aria-selected', 'false'));\n }\n\n /**\n * Hooks click events on each item in the listbox, and registers a entry into\n * `unlisteners` for future cleanup.\n * `mousedown` event is used to ensure the click is registered before any blur events.\n */\n private hookItemsClicks(): void {\n if (!this.hasItems()) return;\n\n this.items()!.forEach((item, index) => this.unlisteners.push(this.renderer.listen(item, 'mousedown', () => this.itemClicked(item, index))));\n }\n\n /**\n * Handles item click events, updates the current index, emits the selected item,\n * and hides the listbox if configured to do so.\n * @param {HTMLElement} element - The clicked item element.\n * @param {number} index - The index of the clicked item.\n */\n private itemClicked(element: HTMLElement, index: number): void {\n this.previousIndex.set(this.currentIndex());\n this.currentIndex.set(index);\n\n this.updateActiveItem();\n\n this.onSelected.emit(element);\n\n if (this.keyboardNavigator()?.onSelectionHandlers?.hideListbox) this.hideListbox();\n if (this.keyboardNavigator()?.onSelectionHandlers?.resetSelection) this.resetSelection();\n }\n\n /**\n * Moves the selection in the specified direction.\n * If `extreme` is true, it moves to the first or last item based on the direction.\n * If `extreme` is false, it wraps around the list.\n * @param {number} direction - The direction to move the selection: -1 for previous, 1 for next.\n * @param {boolean} extreme - Whether to move to the first or last item instead of wrapping around.\n * Defaults to false.\n */\n private moveSelection(direction: number, extreme: boolean = false): void {\n if (!this.hasItems()) return;\n\n let index = this.currentIndex() + direction;\n\n // if extreme is true, we seek the first or last item\n if (extreme) {\n if (direction < 0) index = 0;\n else index = this.items()!.length - 1;\n } else {\n if (index < 0) index = this.items()!.length - 1;\n else if (index >= this.items()!.length) index = 0;\n }\n\n this.previousIndex.set(this.currentIndex());\n this.currentIndex.set(index);\n\n this.updateActiveItem();\n }\n\n /**\n * Updates the active item in the listbox.\n * If there was a previously active item, it sets its `aria-selected`\n * attribute to `false`. Sets the `aria-selected` attribute on the currently\n * active item, and scrolls it into view.\n */\n private updateActiveItem(): void {\n if (!this.hasItems()) return;\n\n const previousItem = this.items()?.[this.previousIndex()];\n\n if (previousItem) this.renderer.setAttribute(previousItem, 'aria-selected', 'false');\n\n const currentItem = this.items()?.[this.currentIndex()];\n\n if (currentItem) {\n this.renderer.setAttribute(currentItem, 'aria-selected', 'true');\n\n currentItem.scrollIntoView({ block: 'nearest' });\n }\n }\n\n //#endregion Selection\n\n //#region Visibility\n\n /**\n * Shows the listbox by setting `aria-hidden` to `false` and updating the\n * `aria-expanded` state.\n */\n private showListbox(): void {\n this.renderer.setAttribute(this.listboxElement()!, 'aria-hidden', 'false');\n\n this.ariaExpanded.set(true);\n }\n\n /**\n * Hides the listbox by setting `aria-hidden` to `true` and updating the\n * `aria-expanded` state.\n */\n private hideListbox(): void {\n this.renderer.setAttribute(this.listboxElement()!, 'aria-hidden', 'true');\n\n this.ariaExpanded.set(false);\n }\n\n //#endregion Visibility\n}\n","import { Directive, HostListener, inject, input } from '@angular/core';\n\nimport { Article } from '@sinequa/atomic';\nimport { PreviewService } from '../services/preview.service';\n\n/**\n * Directive that opens an article on ctrl + enter.\n */\n@Directive({\n selector: '[appOpenArticleOnCtrlEnter],[openArticleOnCtrlEnter]',\n standalone: true\n})\nexport class OpenArticleOnCtrlEnterDirective {\n private readonly previewService = inject(PreviewService);\n\n public readonly article = input.required<Article | undefined>();\n\n @HostListener('keydown.control.Enter')\n public onCtrlEnter(): void {\n if (!this.article()) return;\n this.previewService.openExternal(this.article()!);\n }\n}\n","import { afterNextRender, contentChild, contentChildren, Directive, ElementRef, inject, input, OnDestroy, output, OutputRefSubscription } from '@angular/core';\n\n/**\n * Directive to be used on elements that should be counted as items in the\n * overflow manager.\n */\n@Directive({\n selector: '[overflowItem]',\n standalone: true\n})\nexport class OverflowItemDirective {}\n\n/**\n * Directive to be used on the element that should be considered as the limit\n * for the overflow manager.\n */\n@Directive({\n selector: '[overflowStop]',\n standalone: true\n})\nexport class OverflowStopDirective {}\n\n/**\n * Directive that takes items and a stop element to count the number of items\n * that can fit before the stop element.\n * The directive will apply a `visibility: hidden` on the items that are not\n * visible.\n *\n * You can specify a target element to observe for resize events, otherwise the\n * directive will observe the element itself.\n *\n * This directive cannot be used on `hostDirectives` as it needs access to the\n * DOM elements. To use is as a host directive, wrap it in a `ng-container` and\n * define a target.\n *\n * @input target - The target element to observe for resize events.\n * @input margin - Margin to add for calculating the overflow.\n *\n * @output count - The number of items that can fit before the stop element,\n * count is debounced to avoid multiple updates.\n *\n * @example\n * ```typescript\n * <ng-container\n * overflowManager\n * class=\"flex gap-2 overflow-hidden\"\n * [target]=\"el.nativeElement\"\n * (count)=\"updateCount($event)\"\n * >\n * <ul>\n * \\@for (let item of [1, 2, 3, 4, 5]) {\n * <li overflowItem>{{ item }}</li>\n * }\n * </ul>\n *\n * <div overflowStop class=\"absolute right-0\"></div>\n * </ng-container>\n * ```\n */\n@Directive({\n selector: '[overflowManager]',\n standalone: true\n})\nexport class OverflowManagerDirective implements OnDestroy {\n readonly items = contentChildren(OverflowItemDirective, { descendants: true, read: ElementRef });\n readonly stop = contentChild(OverflowStopDirective, { descendants: true, read: ElementRef });\n\n readonly target = input<HTMLElement | undefined>();\n readonly margin = input(4);\n readonly direction = input<'horizontal' | 'vertical'>('horizontal');\n readonly count = output<number>();\n\n private readonly el = inject(ElementRef).nativeElement;\n\n private readonly resizeObserver = new ResizeObserver(() => this.countItems());\n\n private countSub: OutputRefSubscription | undefined;\n private _lastCount: number | undefined;\n\n constructor() {\n afterNextRender({\n read: () => {\n // subscribe to resize events on the target element or the directive element\n this.resizeObserver.observe(this.target() ?? this.el);\n // count at least once without resize event\n this.countItems();\n }\n });\n\n // listens to the count output and toggles the visibility of the items\n this.countSub = this.count.subscribe(count => this.toggleToCount(count));\n }\n\n ngOnDestroy(): void {\n this.countSub?.unsubscribe();\n this.countSub = undefined;\n }\n\n /**\n * Counts the number of items that can fit before the stop element.\n * Emits the count if it has changed.\n * Debounces the count to avoid multiple updates.\n */\n countItems(): void {\n if (!this.items() || this.items().length === 0 || !this.stop()) return;\n\n const stopRect = this.stop()!.nativeElement.getBoundingClientRect();\n const itemsRects = this.items().map(item => item.nativeElement.getBoundingClientRect());\n\n let count = 0;\n\n for (let rect of itemsRects) {\n // if the direction is horizontal, we check the right side of the item\n if (this.direction() === 'horizontal' && rect.right + this.margin() <= stopRect.left) count++;\n // if the direction is vertical, we check the bottom side of the item\n else if (this.direction() === 'vertical' && rect.bottom + this.margin() <= stopRect.top) count++;\n else break;\n }\n\n if (this._lastCount === count) return;\n\n this._lastCount = count;\n this.count.emit(count);\n }\n\n /**\n * Toggles the visibility of the items based on the count.\n * @param count - The number of items to keep visible.\n */\n toggleToCount(count: number): void {\n this.items().forEach((item, index) => {\n const state = index < count ? 'visible' : 'hidden';\n\n // apply equivalent of tailwind invisible class\n item.nativeElement.style.visibility = state;\n });\n }\n}\n","import { EventEmitter, Injectable, OnDestroy, Type, inject } from '@angular/core';\r\nimport { BehaviorSubject, Subscription } from 'rxjs';\r\nimport { getState } from '@ngrx/signals';\r\n\r\nimport { Article } from '@sinequa/atomic';\r\nimport { NavigationService, SelectionHistoryService, SelectionService } from '../../services';\r\nimport { SelectionStore } from '../../stores';\r\nimport { BackdropService } from '../../components';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DrawerStackService implements OnDestroy {\r\n public readonly isOpened = new BehaviorSubject<boolean>(false);\r\n public readonly toggleTopDrawerExtension$ = new EventEmitter<void>();\r\n public readonly forceTopDrawerCollapse$ = new EventEmitter<void>();\r\n public readonly closeTopDrawer$ = new EventEmitter<void>();\r\n public readonly closeAllDrawers$ = new EventEmitter<void>();\r\n\r\n public readonly isChatOpened = new BehaviorSubject<boolean>(false);\r\n public readonly openChatDrawer$ = new EventEmitter<void>();\r\n public readonly closeChatDrawer$ = new EventEmitter<void>();\r\n public readonly askAI$ = new EventEmitter<string>();\r\n\r\n private readonly selection = inject(SelectionService);\r\n private readonly selectionHistory = inject(SelectionHistoryService);\r\n private readonly selectionStore = inject(SelectionStore);\r\n private readonly navigationService = inject(NavigationService);\r\n private readonly backdropService = inject(BackdropService);\r\n\r\n private readonly subscriptions = new Subscription();\r\n\r\n public componentType?: Type<any>;\r\n\r\n constructor() {\r\n // on new search, close all drawers including chat drawer\r\n this.subscriptions.add(\r\n this.navigationService.navigationEnd$.subscribe(() => {\r\n this.closeAssistant();\r\n this.closeAll();\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n\r\n /**\r\n * Sets current drawer stack status to open\r\n */\r\n public open(componentType?: Type<any>): void {\r\n this.componentType = componentType;\r\n this.isOpened.next(true);\r\n }\r\n\r\n /**\r\n * Emits event to extend the top drawer\r\n */\r\n public extend(): void {\r\n this.toggleTopDrawerExtension$.next();\r\n }\r\n\r\n /**\r\n * Emits event to close the top drawer, checks if history is empty, if so,\r\n * sets current drawer stack status to closed and clears history and current\r\n * selection\r\n */\r\n public close(): void {\r\n this.closeTopDrawer$.next();\r\n\r\n if (this.selectionHistory.getCurrentSelectionIndex() === -1) {\r\n this.isOpened.next(false);\r\n this.selectionHistory.clearHistory();\r\n }\r\n }\r\n\r\n /**\r\n * Emits event to close the top drawer\r\n */\r\n public closeTop(): void {\r\n this.closeTopDrawer$.next();\r\n }\r\n\r\n /**\r\n * Sets current drawer stack status to closed, clears history and emits event\r\n * to close all drawers\r\n *\r\n * @param keepDrawerOpen if true, do not trigger layout animation\r\n */\r\n public closeAll(keepDrawerOpen: boolean = false): void {\r\n if (!keepDrawerOpen) this.isOpened.next(false);\r\n\r\n this.selectionHistory.clearHistory();\r\n\r\n this.closeAllDrawers$.next();\r\n }\r\n\r\n /**\r\n * Replace the current selection with the given article by closing all\r\n * drawers and opening the drawer with the new selection without triggering\r\n * layout animation\r\n *\r\n * @param article the article to replace the current selection with\r\n */\r\n public replace(article: Article | undefined, withQueryText?: boolean): void {\r\n const { id } = getState(this.selectionStore);\r\n\r\n if (id && (!article || article.id === id)) return;\r\n\r\n // close everything without trigger layout animation\r\n this.closeAll(true);\r\n\r\n // set selection\r\n this.selection.setCurrentArticle(article, withQueryText);\r\n // open drawer\r\n this.open();\r\n }\r\n\r\n /**\r\n * Stack the given article by setting the current selection and opening the\r\n * drawer\r\n *\r\n * @param article the article to stack\r\n */\r\n public stack(article: Article | undefined, withQueryText?: boolean): void {\r\n const { id } = getState(this.selectionStore);\r\n\r\n if (id && (!article || article.id === id)) return;\r\n\r\n // force top drawer to collapse\r\n this.forceTopDrawerCollapse$.next();\r\n // set selection\r\n this.selection.setCurrentArticle(article, withQueryText);\r\n // open drawer\r\n this.open();\r\n }\r\n\r\n public toggleAssistant(): void {\r\n if (this.isChatOpened.getValue()) {\r\n this.backdropService.hide();\r\n this.closeAssistant();\r\n } else {\r\n this.backdropService.show();\r\n this.openAssistant();\r\n }\r\n }\r\n\r\n public openAssistant(): void {\r\n this.isChatOpened.next(true);\r\n this.isOpened.next(true);\r\n this.openChatDrawer$.next();\r\n\r\n this.backdropService.show();\r\n }\r\n\r\n public closeAssistant(keepDrawerOpen: boolean = false): void {\r\n this.isChatOpened.next(false);\r\n\r\n if (!keepDrawerOpen && this.selectionHistory.getCurrentSelectionIndex() === -1) {\r\n this.isOpened.next(false);\r\n this.closeAllDrawers$.next();\r\n }\r\n\r\n this.closeChatDrawer$.next();\r\n this.backdropService.hide();\r\n }\r\n\r\n public askAI(text: string): void {\r\n this.openAssistant();\r\n this.askAI$.next(text);\r\n }\r\n}\r\n","import { Directive, HostListener, inject, input } from '@angular/core';\n\nimport { Article, isNotInputEvent } from '@sinequa/atomic';\n\nimport { DrawerStackService } from '../features/drawer-stack/drawer-stack.service';\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 host: {\n '(keydown.enter)': 'onEnter($event)'\n }\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 public onEnter(e: Event): void {\n if (e && isNotInputEvent(e as KeyboardEvent)) {\n this.onClick();\n }\n }\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/user-settings.store';\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: '[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","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 { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Directive to mark a child element for special processing.\n * This can be used to apply specific styles or behaviors to child elements.\n * Specifically, it can be used to mark elements that should be treated as children in a parent component.\n * Very useful for components that need to render child templates dynamically with `@for loop`.\n *\n * Example usage:\n * ```html\n * <sponsored-links>\n * <span *childMarker>Child Element</span>\n * </sponsored-links>\n * ```\n * This will allow the parent component to recognize the `<span>` as a child element and apply any specific logic or styles defined in the parent component.\n */\n@Directive({\n selector: '[childMarker]'\n})\nexport class ChildMarkerDirective {\n public template = inject(TemplateRef<unknown>);\n}\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 const valueNormalized = value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\r\n const wordNormalized = word.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\r\n return highlightWords({ text: valueNormalized, query: wordNormalized, clipBy });\r\n }\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 { Pipe, PipeTransform } from '@angular/core';\nimport { FilterOperator, LegacyFilter } from '@sinequa/atomic';\n\n@Pipe({\n name: 'operator',\n standalone: true,\n pure: true\n})\nexport class OperatorPipe implements PipeTransform {\n transform(filter?: LegacyFilter): string {\n let op = this.transformOperator(filter?.operator);\n if (filter?.operator === 'between') {\n return `> ${filter.start} ≤ ${filter.end}`;\n }\n if (filter?.operator === 'and') {\n return filter.display ?? filter.value ?? '';\n }\n return `${op} ${filter?.value || ''}`;\n }\n\n transformOperator(operator?: FilterOperator): string {\n switch (operator) {\n case 'lt':\n return '<';\n case 'lte':\n return '≤';\n case 'eq':\n return '=';\n case 'neq':\n return '≠';\n case 'gte':\n return '≥';\n case 'gt':\n return '>';\n default:\n return '';\n }\n }\n}\n","import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform, inject } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { sysLang } from '@sinequa/atomic';\nimport { Subscription } from 'rxjs';\n\n/**\n * The `SyslangPipe` class is a custom pipe that transforms a string value using the current language.\n * This pipe is used to translate strings that are not part of the Angular i18n system.\n * This pipe exists to keep the compatibility with a legacy system that uses a custom language syntax.\n *\n * This pipe can be used in the following way:\n *\n * @example\n * <div>{{ 'Hello[fr]Bonjour' | syslang }}</div>\n * // output: `Bonjour` if your current language is 'fr'\n * // output: `Hello` if your current language is not 'fr'\n *\n * <div>{{ 'Hello[fr]Bonjour' | syslang: 'fr' }}</div>\n * // output: `Bonjour` even if your current language is not 'fr'\n */\n@Pipe({\n name: 'syslang',\n standalone: true,\n pure: false\n})\nexport class SyslangPipe implements PipeTransform, OnDestroy {\n private readonly transloco = inject(TranslocoService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n private lastValue: string | null = null;\n private currentLang: string;\n private subscription: Subscription | null = null;\n\n ngOnDestroy(): void {\n this.subscription?.unsubscribe();\n this.subscription = null;\n }\n\n constructor() {\n this.currentLang = this.transloco.getActiveLang();\n this.subscription = this.transloco.langChanges$.subscribe(locale => (this.currentLang = locale));\n }\n\n /**\n * Transforms the input value using the current language.\n * @param value The input string value to be transformed.\n * @returns The transformed string value.\n */\n transform(value?: string, lang?: string): string | null {\n const transformedValue = sysLang(value || '', lang || this.currentLang);\n\n if (transformedValue !== this.lastValue) {\n this.lastValue = transformedValue;\n this.cdr.markForCheck();\n }\n\n return this.lastValue;\n }\n}\n","import { DATE_PIPE_DEFAULT_OPTIONS, DATE_PIPE_DEFAULT_TIMEZONE, DatePipe, DatePipeConfig } from '@angular/common';\nimport { ChangeDetectorRef, Inject, inject, LOCALE_ID, OnDestroy, Optional, Pipe } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Subscription } from 'rxjs';\n\n@Pipe({\n name: 'translocoDate',\n pure: false,\n standalone: true\n})\nexport class TranslocoDateImpurePipe extends DatePipe implements OnDestroy {\n private readonly transloco = inject(TranslocoService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n private lastTransformedValue: string | null = null;\n private subscription: Subscription | null = null;\n\n constructor(\n @Inject(LOCALE_ID) locale: string,\n @Inject(DATE_PIPE_DEFAULT_TIMEZONE) @Optional() defaultTimezone?: string | null,\n @Inject(DATE_PIPE_DEFAULT_OPTIONS) @Optional() defaultOptions?: DatePipeConfig | null\n ) {\n super(locale, defaultTimezone, defaultOptions);\n }\n\n ngOnDestroy(): void {\n this.subscription?.unsubscribe();\n this.subscription = null;\n }\n\n override transform(value: Date | string | number, format?: string, timezone?: string): string | null;\n override transform(value: null | undefined, format?: string, timezone?: string): null;\n override transform(value: Date | string | number | null | undefined, format?: string, timezone?: string): string | null {\n this.subscription?.unsubscribe();\n\n this.subscription = this.transloco.langChanges$.subscribe(locale => {\n const transformedValue = super.transform(value, format, timezone, locale);\n\n if (transformedValue !== this.lastTransformedValue) {\n this.lastTransformedValue = transformedValue;\n this.cdr.markForCheck();\n }\n });\n\n return this.lastTransformedValue;\n }\n}\n","import { Component, computed, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { debug } from '@sinequa/atomic';\nimport { ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, TabComponent, TabsComponent } from '@sinequa/ui';\n\nimport { OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective } from '../../directives';\nimport { DrawerStackService } from '../../features/drawer-stack/drawer-stack.service';\nimport { SyslangPipe } from '../../pipes';\nimport { QueryParamsStore } from '../../stores';\n\ntype NavbarTab = {\n display: string;\n wsQueryTab: string;\n path: string;\n icon: string;\n routerLink: string;\n queryName?: string;\n};\n\n@Component({\n selector: 'navbar-tabs',\n standalone: true,\n template: `\n <!-- do not display the tabs if there are no tabs -->\n @if (tabs().length > 0) {\n <div overflowManager class=\"relative col-span-2 col-start-2 row-start-2 flex\" (count)=\"visibleTabCount.set($event)\">\n <tabs class=\"w-full\">\n @for (tab of tabs(); track $index) {\n <tab\n class=\"w-fit\"\n value=\"{{ tab.display | syslang | transloco }}\"\n overflowItem\n [attr.aria-selected]=\"this.currentPath() === tab.path\"\n [active]=\"this.currentPath() === tab.path\"\n [routerLink]=\"[tab.routerLink]\"\n [queryParams]=\"{ n: tab.queryName, q: searchText(), t: tab.wsQueryTab, f: undefined, sort: undefined, id: undefined, page: undefined }\"\n (click)=\"changeTab(tab)\">\n @if (tab.icon) {\n <i class=\"fa-fw {{ tab.icon }} \" aria-hidden=\"true\"></i>\n }\n <span>{{ tab.display | syslang | transloco }}</span>\n </tab>\n }\n </tabs>\n\n @if (moreTabs().length > 0) {\n <Menu class=\"absolute right-0 top-1\" overflowStop>\n <button variant=\"ghost\" class=\"mb-1 truncate\" aria-label=\"more tabs\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n\n <MenuContent class=\"z-500 w-fit\" position=\"bottom-end\">\n @for (tab of moreTabs(); track $index) {\n <MenuItem>\n <a\n class=\"inline-block whitespace-nowrap first-letter:capitalize\"\n [routerLink]=\"[tab.routerLink]\"\n [queryParams]=\"{ n: tab.queryName, q: searchText(), t: tab.wsQueryTab, f: undefined, sort: undefined, id: undefined, page: undefined }\"\n [attr.aria-selected]=\"this.currentPath() === tab.path\"\n [attr.aria-label]=\"tab.display | syslang | transloco\"\n (click)=\"changeTab(tab)\">\n @if (tab.icon) {\n <i class=\"fa-fw {{ tab.icon }} \" aria-hidden=\"true\"></i>\n }\n {{ tab.display | syslang | transloco }}\n </a>\n </MenuItem>\n }\n </MenuContent>\n </Menu>\n } @else {\n <div class=\"absolute right-0\" overflowStop></div>\n }\n </div>\n }\n `,\n imports: [\n RouterLink,\n TranslocoPipe,\n SyslangPipe,\n ButtonComponent,\n MenuComponent,\n MenuItemComponent,\n MenuContentComponent,\n TabsComponent,\n TabComponent,\n OverflowManagerDirective,\n OverflowItemDirective,\n OverflowStopDirective\n ]\n})\nexport class NavbarTabsComponent {\n readonly router = inject(Router);\n readonly route = inject(ActivatedRoute);\n\n readonly drawerStack = inject(DrawerStackService);\n readonly drawerOpened = signal(false);\n readonly queryParamsStore = inject(QueryParamsStore);\n\n searchText = computed(() => {\n const state = getState(this.queryParamsStore);\n return state.text || '';\n });\n\n readonly visibleTabCount = signal<number | undefined>(undefined);\n readonly currentPath = computed(() => {\n let current = this.route.snapshot;\n while (current.firstChild) {\n current = current.firstChild;\n }\n const childPath = current.url.map(segment => segment.path).join('/');\n return childPath || 'all';\n });\n\n // create tabs from the search routes\n readonly tabs = computed(\n () =>\n this.router.config\n .find(item => item.path === 'search')\n ?.children?.filter(c => c.path !== '**')\n .map(\n child =>\n ({\n display: child.data?.['display'] || child.path,\n wsQueryTab: child.data?.['wsQueryTab'] || child.path,\n path: child.path,\n routerLink: `/search/${child.path}`,\n icon: child.data?.['icon'],\n queryName: child.data?.['queryName']\n }) as NavbarTab\n ) ?? []\n );\n readonly moreTabs = computed(() => this.tabs().slice(this.visibleTabCount()));\n\n protected changeTab(tab: NavbarTab): void {\n // we use the routerlink to navigate, so just close the drawer and remove the id parameter from the query params\n this.drawerStack.closeAll();\n }\n\n constructor() {\n this.drawerStack.isOpened.pipe(takeUntilDestroyed()).subscribe(state => this.drawerOpened.set(state));\n }\n}\n","import { Component } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\n@Component({\n selector: 'NoResult',\n standalone: true,\n imports: [TranslocoPipe],\n providers: [provideTranslocoScope('no-result')],\n template: `\n <header class=\"flex items-center gap-2 text-xl font-semibold\">\n <i class=\"fa-fw far fa-face-sad-sweat text-3xl\"></i>\n <p>{{ 'noResult.noResult' | transloco }}</p>\n </header>\n\n <p>{{ 'noResult.noResultSuggestion' | transloco }}</p>\n\n <hr />\n\n <p>{{ 'noResult.noResultAssistance' | transloco }}</p>\n `,\n host: {\n class: 'p-4 flex flex-col gap-2 bg-gray-100 rounded-md'\n }\n})\nexport class NoResultComponent {}\n","import { Component, computed, effect, inject, input, signal } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ButtonComponent } from '@sinequa/ui';\n\nimport { QueryService } from '../../services';\n\nexport type PageConfiguration = {\n page: number;\n rowCount: number;\n pageSize: number;\n};\n\n@Component({\n selector: 'pager',\n standalone: true,\n imports: [TranslocoPipe, ButtonComponent],\n template: `\n <div class=\"flex gap-2\">\n @if ((hasPages() && page() > 1) || (!hasPages() && page() > 1)) {\n <button variant=\"ghost\" [attr.title]=\"'previousPage' | transloco\" (click)=\"previousPage()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"me-2 h-3.5 w-3.5 rotate-180\" aria-hidden=\"true\" fill=\"none\" viewBox=\"0 0 14 10\">\n <path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M1 5h12m0 0L9 1m4 4L9 9\" />\n </svg>\n\n {{ 'previousPage' | transloco }}\n </button>\n }\n\n @if (hasPages()) {\n <button variant=\"ghost\" [attr.title]=\"'nextPage' | transloco\" (click)=\"nextPage()\">\n {{ 'nextPage' | transloco }}\n\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"ms-2 h-3.5 w-3.5\" aria-hidden=\"true\" fill=\"none\" viewBox=\"0 0 14 10\">\n <path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M1 5h12m0 0L9 1m4 4L9 9\" />\n </svg>\n </button>\n }\n </div>\n `\n})\nexport class PagerComponent {\n public readonly configuration = input.required<PageConfiguration>();\n\n protected readonly page = signal(0);\n protected readonly hasPages = computed(() => {\n const { page, pageSize, rowCount } = this.configuration();\n return page * pageSize < rowCount;\n });\n\n private readonly queryService = inject(QueryService);\n\n constructor() {\n effect(() => {\n this.page.set(this.configuration().page);\n });\n }\n\n public nextPage(): void {\n this.page.set(this.page() + 1);\n this.queryService.gotoPage(this.page());\n }\n\n public previousPage(): void {\n this.page.set(this.page() - 1);\n this.queryService.gotoPage(this.page());\n }\n}\n","import { Component, computed, ElementRef, forwardRef, input, output, viewChild } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { cn, SearchIconComponent, searchVariants, SearchVariants, XMarkIConComponent } from '@sinequa/ui';\nimport { KeyboardNavigatorDirective, KeyboardNavigatorOptions } from '../../directives';\n\n@Component({\n selector: 'SearchInput',\n standalone: true,\n imports: [SearchIconComponent, XMarkIConComponent, KeyboardNavigatorDirective],\n template: `\n <SearchIcon class=\"text-foreground size-4 rotate-0 transition-[rotate] duration-500 group-focus-within:rotate-90\" />\n <input\n #search\n class=\"placeholder:text-muted-foreground focus:text-foreground peer grow outline-none\"\n role=\"combobox\"\n type=\"search\"\n spellcheck=\"false\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n aria-controls=\"{{ controls() }}\"\n [keyboardNavigator]=\"keyboardNavigatorOptions()\"\n [placeholder]=\"placeholder()\"\n [attr.aria-keyshortcuts]=\"hotkey()\"\n (onFocus)=\"onFocus.emit()\"\n (onBlur)=\"onBlur.emit()\"\n (onSelected)=\"onSelected.emit($event)\"\n (input)=\"onChange(search.value)\" />\n\n <button\n variant=\"icon\"\n class=\"text-foreground peer-not-placeholder-shown:rotate-90 peer-not-placeholder-shown:cursor-pointer peer-not-placeholder-shown:opacity-100 mr-1 rotate-0 transform opacity-0 transition-[rotate,opacity] duration-500 peer-placeholder-shown:pointer-events-none\"\n (click)=\"clearSearch($event)\">\n <XMark class=\"size-4\" />\n </button>\n\n <ng-content />\n `,\n host: {\n '[class]': \"cn(variants(), disabled() && 'pointer-events-none opacity-50')\"\n },\n styles: `\n :host {\n /* clears the 'x' from Internet Explorer */\n input[type='search']::-ms-clear,\n input[type='search']::-ms-reveal {\n appearance: none;\n width: 0;\n height: 0;\n }\n /* clears the 'x' from Chrome */\n input[type='search']::-webkit-search-decoration,\n input[type='search']::-webkit-search-cancel-button,\n input[type='search']::-webkit-search-results-button,\n input[type='search']::-webkit-search-results-decoration {\n appearance: none;\n }\n }\n `,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SearchInputComponent),\n multi: true\n }\n ]\n})\nexport class SearchInputComponent implements ControlValueAccessor {\n cn = cn;\n searchElement = viewChild<ElementRef<HTMLInputElement>>('search');\n\n onFocus = output<void>();\n onBlur = output<void>();\n onSelected = output<HTMLElement | null>();\n\n controls = input.required<string>();\n keyboardNavigatorOptions = input<KeyboardNavigatorOptions>({\n name: 'searchInputKeyboardNavigator',\n optionSelector: '[role=\"option\"]:not([aria-disabled=\"true\"])',\n direction: 'vertical',\n selectOnFocus: false,\n resetSelectionOnBlur: false,\n onSelectionHandlers: {\n hideListbox: true,\n resetSelection: true\n }\n });\n\n placeholder = input<string>('Search...');\n disabled = input<boolean>(false);\n hotkey = input<string>('shift+/');\n\n class = input<string>();\n variant = input<SearchVariants['variant']>('default');\n\n variants = computed(() => {\n return searchVariants({ variant: this.variant(), class: this.class() });\n });\n\n clearSearch(e: Event) {\n const searchEl = this.searchElement()?.nativeElement;\n if (searchEl) {\n searchEl.value = '';\n searchEl.focus();\n }\n this.onChange('');\n }\n\n /* ControlValueAccessor */\n onChange: (value: string) => void = () => {};\n onTouched: () => void = () => {};\n\n writeValue(value: string): void {\n const searchEl = this.searchElement()?.nativeElement;\n if (searchEl) {\n searchEl.value = value;\n }\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n}\n","import { Component, computed, inject, input, output, viewChild } from '@angular/core';\nimport { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco';\n\nimport { Placement } from '@floating-ui/dom';\nimport { CCSortingChoice, Result } from '@sinequa/atomic';\nimport { ButtonComponent, DropdownComponent, MenuComponent, MenuContentComponent, MenuItemComponent } from '@sinequa/ui';\n\nimport { AppStore } from '../../stores';\n\nexport type SortingChoice = CCSortingChoice & {\n $isDesc?: boolean;\n};\n\n@Component({\n selector: 'sort-selector, sortselector, SortSelector',\n standalone: true,\n templateUrl: './sort-selector.html',\n imports: [TranslocoPipe, ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent],\n providers: [provideTranslocoScope('sort-selector')]\n})\nexport class SortSelectorComponent {\n dropdown = viewChild(DropdownComponent);\n\n readonly result = input.required<Result>();\n readonly position = input<Placement>('bottom-start');\n readonly onSort = output<SortingChoice>();\n\n appStore = inject(AppStore);\n\n readonly queryName = computed(() => this.result()?.queryName);\n\n // fetch the sorting choices from the queries and process if choice is desc or asc\n readonly sortOptions = computed(() => {\n const query = this.appStore.getQueryByName(this.queryName());\n if (!query) return [];\n\n if (this.appStore.isTabSearch(query.name)) {\n const tabName = this.result().tab;\n if (tabName && query) {\n const tab = query.tabSearch?.tabs?.find(t => t.name === tabName);\n if (tab && tab.sortingChoices && tab.sortingChoices.length > 0) {\n return tab.sortingChoices\n .reduce((acc, sort) => {\n acc.push({ ...sort, $isDesc: sort.orderByClause.includes('desc') });\n return acc;\n }, [] as SortingChoice[])\n .filter(s => this.result().hasRelevance || !s.orderByClause.includes('globalrelevance'));\n }\n }\n }\n\n const choices = query.sortingChoices;\n // choices can be an empty string when nothing is defined in the configuration\n if (choices === undefined || (choices as unknown as string) === '') return [];\n\n return choices\n ?.reduce((acc, sort) => {\n acc.push({ ...sort, $isDesc: sort.orderByClause.includes('desc') });\n return acc;\n }, [] as SortingChoice[])\n .filter(s => this.result().hasRelevance || !s.orderByClause.includes('globalrelevance'));\n });\n\n readonly sort = computed(() => this.sortOptions()?.find(x => x.name === this.result()?.sort));\n readonly isSortingDesc = computed(() => this.sort()?.orderByClause?.includes('desc'));\n\n onSortOptionClicked(sort: SortingChoice) {\n if (sort.name !== this.sort()?.name) {\n this.dropdown()?.close();\n this.onSort.emit(sort);\n }\n }\n}\n","<menu>\n <button tabindex=\"0\" variant=\"ghost\" [attr.title]=\"'sortSelector.selectSort' | transloco\">\n <i class=\"fa-fw fa-regular fa-arrow-{{ sort()?.$isDesc ? 'down' : 'up' }}-big-small me-1\"></i>\n <span>{{ sort()?.display | transloco }}</span>\n </button>\n\n <MenuContent [position]=\"position()\" class=\"min-w-max\">\n @if (sortOptions().length > 0) {\n @for (option of sortOptions(); track $index) {\n <menuitem (click)=\"onSortOptionClicked(option)\" class=\"justify-between\">\n <span>{{ option.display | transloco }}</span>\n <i class=\"fa-fw fa-regular fa-arrow-{{ option.$isDesc ? 'down' : 'up' }}-big-small\"></i>\n </menuitem>\n }\n }\n </MenuContent>\n</menu>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { afterNextRender, Component, computed, contentChild, inject, Injector, input, runInInjectionContext, signal } from '@angular/core';\nimport { getState } from '@ngrx/signals';\n\nimport { CCApp, error, fetchSponsoredLinks, LinkResult } from '@sinequa/atomic';\n\nimport { ChildMarkerDirective } from '../../directives';\nimport { AppStore, QueryParamsStore } from '../../stores';\nimport { signIn } from '../../utils';\n\n@Component({\n selector: 'sponsored-results, SponsoredResults, sponsoredresults',\n imports: [NgTemplateOutlet],\n standalone: true,\n template: ` @if (sponsoredResults()?.length) {\n @for (link of sponsoredResults(); track $index) {\n <li role=\"listitem\" class=\"text-primary flex items-center gap-2 rounded px-3 py-2 font-bold\">\n <a href=\"{{ link.url }}\" target=\"_blank\" rel=\"noopener\" title=\"{{ link.tooltip }}\" class=\"result-link peer flex items-center gap-2 hover:underline\">\n <i class=\"fa-fw far fa-arrow-up-right-from-square\"></i>\n <span>{{ link.title }}</span>\n </a>\n @if (displayPromoted()) {\n @if (childElement()?.template) {\n <ng-container [ngTemplateOutlet]=\"childElement()?.template\" />\n } @else {\n <span class=\"promoted-badge bg-primary invisible flex items-center rounded-xl px-2 text-xs text-white peer-hover:visible\">PROMOTED</span>\n }\n }\n </li>\n }\n }`,\n host: {\n role: 'list'\n }\n})\nexport class SponsoredResultsComponent {\n /**\n * The directive used to mark the child template for the \"Promoted\" badge.\n * This allows users to customize the appearance of the badge.\n */\n childElement = contentChild(ChildMarkerDirective);\n\n injector = inject(Injector);\n appStore = inject(AppStore);\n queryParamStore = inject(QueryParamsStore);\n\n /**\n * The maximum number of sponsored results to display.\n * This is set to 3 by default, but can be overridden by the `maxSponsoredResults` query parameter.\n */\n slice = input(3);\n /**\n * Whether to display the \"Promoted\" badge next to sponsored results.\n * This is set to true by default, but can be overridden by the `displayPromoted` query parameter.\n */\n displayPromoted = input(true);\n\n sponsoredLinks = computed(() => {\n const { sponsoredLinks } = getState(this.appStore) as CCApp;\n return sponsoredLinks;\n });\n readonly sponsoredResults = signal<LinkResult[] | undefined>(undefined);\n\n constructor() {\n afterNextRender(async () => {\n if (this.sponsoredLinks()) {\n const query = this.queryParamStore.getQuery();\n try {\n const links = (await fetchSponsoredLinks(this.sponsoredLinks(), query)) || [];\n this.sponsoredResults.set(links.slice(0, this.slice()));\n } catch (err: any) {\n error('Error fetching sponsored links:', err);\n this.sponsoredResults.set([]);\n if (err.status === 401) {\n error('Unauthorized access - please check your credentials:', err?.errorMessage);\n runInInjectionContext(this.injector, () => signIn());\n } else {\n throw err;\n }\n }\n }\n });\n }\n}\n","import { Component, computed, effect, inject, input, model } from '@angular/core';\nimport { NgStyle } from '@angular/common';\n\nimport { MenuComponent, MenuContentComponent } from '@sinequa/ui';\n\nimport { Theme, THEMES } from '../../resources';\nimport { ThemeStore } from '../../stores';\n\n@Component({\n selector: 'theme-selector',\n standalone: true,\n imports: [MenuComponent, NgStyle, MenuContentComponent],\n template: `\n <Menu>\n <ng-content></ng-content>\n\n <MenuContent>\n <ul class=\"flex flex-col gap-1 divide-y p-2\">\n @for (theme of themes(); track $index) {\n <li class=\"p-2\" (click)=\"selectTheme(theme)\">\n <div class=\"flex items-baseline gap-2\">\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 </MenuContent>\n </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 });\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') 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 cursor-pointer select-none items-center gap-2\">\n @if (darkMode()) {\n <i class=\"fa-fw far fa-toggle-large-on text-primary\"></i>\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 type=\"checkbox\" class=\"hidden\" [(ngModel)]=\"darkMode\" (ngModelChange)=\"toggleDarkMode($event)\" />\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 });\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 { HttpHandlerFn, HttpInterceptorFn, HttpParams, HttpRequest } from '@angular/common/http';\nimport { addAuditAdditionalInfo, globalConfig, isJsonable } from '@sinequa/atomic';\n\n/**\n * Intercepts HTTP requests to add audit information if the request URL includes the API path.\n *\n * This interceptor checks if the request URL contains the specified API path from the global configuration.\n * If the request body is JSON serializable and not an instance of `HttpParams`, it adds additional audit information\n * to the request body using the `addAuditAdditionalInfo` function.\n *\n * @param request - The HTTP request to be intercepted.\n * @param next - The next handler in the HTTP request chain.\n * @returns The next handler in the HTTP request chain, potentially with modified request body.\n */\nexport const auditInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n if (!request.url.includes(globalConfig.apiPath!)) return next(request);\n\n if (isJsonable(request.body) && !(request.body instanceof HttpParams)) {\n // beware addAuditAdditionalInfo use a reference to the original object\n addAuditAdditionalInfo(request.body);\n }\n return next(request);\n};\n","import { HttpHandlerFn, HttpInterceptorFn, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { map } from 'rxjs';\nimport { getToken, globalConfig, isAuthenticated, setToken } from '@sinequa/atomic';\n\n// TODO: Replace with your locale name\n// const LOCALE_NAME = \"fr\";\n\n/**\n * Intercepts HTTP requests to add authentication headers and handle CSRF tokens.\n *\n * This interceptor checks if the user is logged in and adds necessary headers\n * to the request, including a CSRF token. If user override is active, it sets\n * the override user and domain headers instead. It also updates the CSRF token\n * from the response headers if present.\n *\n * @param request - The outgoing HTTP request.\n * @param next - The next handler in the HTTP request pipeline.\n * @returns An observable of the HTTP event stream.\n */\nexport const authInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n const { userOverride, userOverrideActive, bearerToken } = globalConfig;\n\n // add auth header with jwt if user is logged in and request is to the api url\n const csrfToken = getToken();\n\n let headers: Record<string, string> = {\n 'Sinequa-Force-Camel-Case': 'true',\n accept: 'application/json',\n 'Sinequa-csrf-token': `${csrfToken}`\n // \"x-language\": LOCALE_NAME\n };\n\n if (bearerToken) {\n headers = { ...headers, Authorization: `Bearer ${bearerToken}` };\n }\n\n if (userOverride && userOverrideActive) {\n headers = {\n ...headers,\n 'sinequa-override-user': userOverride.username,\n 'sinequa-override-domain': userOverride.domain\n };\n }\n\n request = request.clone({\n setHeaders: headers\n });\n\n return next(request).pipe(\n map(event => {\n if (event instanceof HttpResponse) {\n const csrfToken = event.headers.get('sinequa-csrf-token');\n if (csrfToken) {\n setToken(csrfToken);\n }\n }\n return event; // Add this line to fix the return type\n })\n );\n};\n","import { HttpHandlerFn, HttpRequest } from '@angular/common/http';\n\n/**\n * Interceptor function that modifies the request body by appending a \"locale\" parameter with the value \"fr\".\n * If the request body is of type FormData, the \"locale\" parameter is appended directly.\n * If the request body is an object, a new object is created with the \"locale\" parameter added.\n *\n * @param request - The HTTP request object.\n * @param next - The HTTP handler function.\n * @returns The modified request object.\n */\nexport const bodyInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n const LOCALE_NAME = 'fr';\n\n if (request.body instanceof FormData) {\n request.body.append('ui-language', LOCALE_NAME);\n request = request.clone();\n } else {\n const body = { ...(request.body as object), 'ui-language': LOCALE_NAME };\n request = request.clone({\n body\n });\n }\n return next(request);\n};\n","import { HttpHandlerFn, HttpInterceptorFn, HttpRequest } from '@angular/common/http';\nimport { inject, Injector, runInInjectionContext } from '@angular/core';\nimport { logout } from '@sinequa/atomic';\nimport { catchError } from 'rxjs/operators';\nimport { signIn } from '../utils';\n\n/**\n * Interceptor function that handles HTTP errors by logging out the user and redirecting to the login page.\n *\n * @param request - The HTTP request object.\n * @param next - The HTTP handler function.\n * @returns The modified request object.\n */\nexport const errorInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n const injector = inject(Injector);\n\n if (request.url.includes('api/v1/audit.notify')) {\n return next(request);\n }\n\n return next(request).pipe(\n catchError(err => {\n if ([401, 403].includes(err.status)) {\n // auto logout if 401 or 403 response returned from api\n logout();\n runInInjectionContext(injector, () => signIn());\n }\n\n return Promise.reject(err);\n })\n );\n};\n","import { HttpHandlerFn, HttpInterceptorFn, HttpRequest } from '@angular/common/http';\nimport { notify } from '@sinequa/atomic';\nimport { catchError } from 'rxjs/operators';\n\n/**\n * Intercepts HTTP requests and handles errors by displaying toast notifications.\n *\n * This interceptor checks if the request URL includes 'api/v1/audit.notify'. If it does,\n * the request is passed through without any modifications. For other requests, it catches\n * errors and displays a toast notification for specific HTTP status codes (400, 403, 500, 503).\n *\n * @param request - The outgoing HTTP request.\n * @param next - The next handler in the HTTP request pipeline.\n * @returns An observable that either passes the request through or handles errors with toast notifications.\n */\nexport const toastInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n if (request.url.includes('api/v1/audit.notify')) {\n return next(request);\n }\n\n return next(request).pipe(\n catchError(err => {\n const { status, statusText, error } = err;\n if ([400, 403, 500, 503].includes(status)) {\n const { errorMessage = err.statusText, errorCodeText = `Error ${status}` } = error;\n notify.error(statusText, { description: `${errorCodeText}: ${errorMessage}`, closeButton: true, duration: 5000 });\n }\n\n return Promise.reject(err);\n })\n );\n};\n","// export * from \"./audit.interceptor\";\nexport * from './audit.interceptor';\nexport * from './auth.interceptor';\nexport * from './body.interceptor';\nexport * from './error.interceptor';\nexport * from './toast.interceptor';\n","import { Query, QueryParams } from '@sinequa/atomic';\n\nexport namespace Alert {\n export enum Frequency {\n Daily,\n Hourly,\n Immediate,\n Weekly,\n Monthly\n }\n\n export enum Days {\n None = 0x00,\n Monday = 0x01,\n Tuesday = 0x02,\n Wednesday = 0x04,\n Thursday = 0x08,\n Friday = 0x10,\n Saturday = 0x20,\n Sunday = 0x40,\n AllDays = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday,\n WeekDays = Monday | Tuesday | Wednesday | Thursday | Friday\n }\n}\n\nexport type Alert = {\n name: string;\n description?: string;\n query: Query;\n timezone: string;\n timezoneOffset?: string;\n frequency: Alert.Frequency;\n days: Alert.Days;\n interval: number; // every \"n\"...\n index: number; // day of month\n times: string; //times: number[]; // offsets from 00:00 in milliseconds\n active: boolean;\n combine: boolean;\n respectTabSelection: boolean;\n appQueryUrl?: string; // the URL reference the query of the Alert in the SBA.\n};\n\nexport type Bookmark = {\n id: string;\n queryName?: string;\n label?: string;\n source?: string;\n sourceIconClass?: string;\n author?: string;\n parentFolder?: string;\n parentFolderIconClass?: string;\n};\nexport type SearchItem = {\n url: string; // URL of the search (complete with query parameters) can be used to be shared\n path: string; // Path of the search (used by the router link)\n display: string; // Display name of the search\n label?: string; // Label of the search\n filterCount?: number; // Number of filters applied to the search\n date: string; // Date of the search\n queryParams?: QueryParams; // Query parameters of the search\n};\nexport type Basket = { name: string; description?: string; ids?: string[] };\n\nexport type UserSettingsState = {\n bookmarks: Bookmark[];\n recentSearches: SearchItem[];\n savedSearches: SearchItem[];\n baskets: Basket[];\n alerts: Alert[];\n assistants: Record<string, unknown>;\n collapseAssistant?: boolean;\n language?: string;\n};\n\nexport type SearchesConfig = {\n itemsPerPage?: number;\n showLoadMore?: boolean;\n routerLink?: string;\n};\n","import { inject } from '@angular/core';\nimport { ResolveFn } from '@angular/router';\n\nimport { AppStore } from '../stores/app.store';\n\n/**\n * Resolves the name of the default query from the application store.\n *\n * @returns The name of the default query or an empty string if not available.\n */\nexport const queryNameResolver: ResolveFn<string> = () => {\n const appStore = inject(AppStore);\n return appStore.getDefaultQuery()?.name || '';\n};\n","import { Component, input, output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ButtonComponent } from '@sinequa/ui';\n\nimport { SearchesConfig } from '../../models';\n\n@Component({\n selector: 'search-footer, searchfooter, SearchFooter',\n imports: [TranslocoPipe, RouterLink, ButtonComponent],\n template: ` <div class=\"flex flex-col px-2\">\n @if (hasMore() && config().showLoadMore) {\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"onLoadMore($event)\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n <button variant=\"link\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config().routerLink]\">{{ 'seeMore' | transloco }}</button>\n </div>`\n})\nexport class SearchFooterComponent {\n hasMore = input.required<boolean>();\n config = input.required<SearchesConfig>();\n loadMore = output();\n\n onLoadMore(event: Event): void {\n event.stopPropagation();\n this.loadMore.emit();\n }\n}\n","import { Component, inject, input } from '@angular/core';\n\nimport { HorizontalDividerComponent, PopoverContentComponent } from '@sinequa/ui';\n\n@Component({\n selector: 'search-header, searchheader, SearchHeader',\n imports: [HorizontalDividerComponent],\n template: `\n @if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ label() }}</label>\n <MenuSeparator />\n </div>\n }\n `\n})\nexport class SearchHeaderComponent {\n protected floating = inject(PopoverContentComponent, { skipSelf: true, optional: true });\n\n label = input('');\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, contentChild, inject, input, output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\n\nimport { getRelativeDate } from '@sinequa/atomic';\nimport { cn, ListItemComponent } from '@sinequa/ui';\n\nimport { ChildMarkerDirective } from '../../directives';\nimport { SearchItem } from '../../models';\nimport { UserSettingsStore } from '../../stores';\n\n@Component({\n selector: 'search-list, searchlist, SearchList',\n imports: [TranslocoPipe, ListItemComponent, NgTemplateOutlet],\n providers: [provideTranslocoScope('searches')],\n template: `\n @for (search of paginatedSearches(); track $index) {\n <li\n role=\"listitem\"\n class=\"group h-10 *:whitespace-nowrap\"\n tabindex=\"0\"\n (click)=\"onClick(search)\"\n (keydown.enter)=\"onClick(search)\"\n [attr.aria-label]=\"search.display || search.label\">\n @if (iconTemplate()) {\n <ng-container *ngTemplateOutlet=\"iconTemplate()?.template\" />\n }\n\n <p class=\"truncate\">{{ search.display || search.label }}</p>\n\n @let filterCount = search.filterCount || 0;\n @if (filterCount > 0) {\n <p class=\"text-neutral-500\" aria-hidden=\"true\">\n <i class=\"fa-fw far fa-filter\"></i>\n\n {{ 'searches.filterCount' | transloco: { count: filterCount } }}\n </p>\n }\n\n @let date = search.date;\n @if (date) {\n <p class=\"ms-auto text-neutral-500 first-letter:capitalize\">{{ getRelativeDate(transloco.getActiveLang(), date) }}</p>\n }\n\n <button\n class=\"text-destructive invisible hover:scale-125 group-hover:visible group-hover:block\"\n [title]=\"deleteButtonTitle() | transloco\"\n [attr.aria-label]=\"deleteButtonTitle() | transloco\"\n (click)=\"onDelete($index, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"list-none py-4 text-center text-neutral-500\">\n <ng-content />\n </li>\n }\n `,\n host: {\n class: 'flex max-h-[460px] flex-col overflow-auto',\n role: 'list'\n }\n})\nexport class SearchListComponent {\n cn = cn;\n getRelativeDate = getRelativeDate;\n\n iconTemplate = contentChild(ChildMarkerDirective);\n\n paginatedSearches = input.required<SearchItem[]>();\n deleteButtonTitle = input<string>('remove');\n delete = output<number>();\n\n protected readonly router = inject(Router);\n protected readonly userSettingsStore = inject(UserSettingsStore);\n protected readonly transloco = inject(TranslocoService);\n\n public onClick(search: SearchItem): void {\n const queryParams = {\n q: search.queryParams?.text\n } as { q: string; f?: string };\n\n if (search.queryParams?.filters && search.queryParams?.filters?.length > 0) queryParams.f = JSON.stringify(search.queryParams?.filters);\n\n this.router.navigate([search.queryParams?.path], { queryParams });\n }\n\n onDelete(index: number, e: Event): void {\n e.stopPropagation();\n this.delete.emit(index);\n }\n}\n","import { Component, computed, effect, inject, InjectionToken, input, signal } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { getQueryParamsFromUrl, notify } from '@sinequa/atomic';\n\nimport { SearchesConfig, SearchItem } from '../../models';\nimport { UserSettingsStore } from '../../stores';\nimport { SearchFooterComponent } from '../searches/search-footer';\nimport { SearchHeaderComponent } from '../searches/search-header';\nimport { SearchListComponent } from '../searches/search-list';\nimport { ChildMarkerDirective } from '../../directives';\n\nexport const RECENT_SEARCHES_OPTIONS = {\n itemsPerPage: 10,\n showLoadMore: true,\n routerLink: '/recent-searches'\n};\n\nexport const RECENT_SEARCHES_CONFIG = new InjectionToken<SearchesConfig>('recent searches options', {\n factory: () => RECENT_SEARCHES_OPTIONS\n});\n\n@Component({\n selector: 'RecentSearches, recent-searches',\n standalone: true,\n providers: [provideTranslocoScope('searches')],\n imports: [TranslocoPipe, ChildMarkerDirective, SearchHeaderComponent, SearchListComponent, SearchFooterComponent],\n template: `\n <SearchHeader [label]=\"'searches.recent.label' | transloco\" />\n\n <SearchList\n [paginatedSearches]=\"paginatedRecentSearches()\"\n deleteButtonTitle=\"searches.recent.remove\"\n (delete)=\"onDelete($event)\"\n aria-label=\"recents searches\">\n <i *childMarker class=\"fa-fw far fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n <!-- empty content -->\n {{ 'searches.recent.noRecentSearches' | transloco }}\n </SearchList>\n\n <SearchFooter [hasMore]=\"hasMore()\" [config]=\"config\" (loadMore)=\"loadMore()\" />\n `,\n styles: [\n `\n :host {\n ul {\n scrollbar-width: thin;\n }\n }\n `\n ]\n})\nexport class RecentSearchesComponent {\n /**\n * Represents the configuration options for recent searches.\n * This property is initialized using the `input` function with a `RecentSearchesConfig` type.\n */\n options = input<SearchesConfig>();\n\n protected config = inject(RECENT_SEARCHES_CONFIG);\n protected readonly userSettingsStore = inject(UserSettingsStore);\n\n protected readonly range = signal<number>(10);\n protected readonly recentSearches = computed<SearchItem[]>(() =>\n (this.userSettingsStore.recentSearches() || []).reduce((acc, item) => {\n const queryParams = getQueryParamsFromUrl(item.url);\n\n acc.push(\n Object.assign(item, {\n label: queryParams?.text || '',\n filterCount: queryParams?.filters?.length || 0,\n queryParams\n })\n );\n\n return acc;\n }, [] as SearchItem[])\n );\n protected readonly paginatedRecentSearches = computed<SearchItem[]>(() => this.recentSearches().slice(0, this.range()));\n protected readonly hasMore = computed<boolean>(() => this.recentSearches().length > 0 && this.range() < this.recentSearches().length);\n\n constructor() {\n effect(() => {\n if (this.options()) {\n this.config = { ...this.config, ...this.options() };\n this.range.set(this.config.itemsPerPage ?? 10);\n }\n });\n }\n\n /**\n * Deletes a recent search item at the specified index.\n * @param index - The index of the item to delete.\n * @param e - The event object.\n */\n async onDelete(index: number) {\n await this.userSettingsStore.deleteRecentSearch(index);\n notify.success('Recent search deleted');\n }\n\n loadMore() {\n this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n }\n}\n","import { Component, computed, effect, inject, InjectionToken, input, signal } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { getQueryParamsFromUrl, notify } from '@sinequa/atomic';\n\nimport { SearchesConfig, SearchItem } from '../../models';\nimport { UserSettingsStore } from '../../stores';\nimport { SearchFooterComponent } from '../searches/search-footer';\nimport { SearchHeaderComponent } from '../searches/search-header';\nimport { SearchListComponent } from '../searches/search-list';\nimport { ChildMarkerDirective } from '../../directives';\n\nexport const SAVED_SEARCHES_OPTIONS: SearchesConfig = {\n itemsPerPage: 10,\n showLoadMore: true,\n routerLink: '/saved-searches'\n};\n\nexport const SAVED_SEARCHES_CONFIG = new InjectionToken<SearchesConfig>('saved searches options', { factory: () => SAVED_SEARCHES_OPTIONS });\n\n@Component({\n selector: 'saved-searches, SavedSearches',\n standalone: true,\n imports: [TranslocoPipe, ChildMarkerDirective, SearchHeaderComponent, SearchListComponent, SearchFooterComponent],\n providers: [provideTranslocoScope('searches')],\n template: `\n <SearchHeader [label]=\"'searches.saved.label' | transloco\" />\n\n <SearchList [paginatedSearches]=\"paginatedSearches()\" deleteButtonTitle=\"searches.saved.remove\" (delete)=\"onDelete($event)\">\n <i *childMarker class=\"fa-fw fas fa-star\" aria-hidden=\"true\"></i>\n <!-- empty content -->\n {{ 'searches.saved.noSavedSearches' | transloco }}\n </SearchList>\n\n <SearchFooter [hasMore]=\"hasMore()\" [config]=\"config\" (loadMore)=\"loadMore()\" />\n `,\n styles: [\n `\n :host {\n ul {\n scrollbar-width: thin;\n }\n }\n `\n ]\n})\nexport class SavedSearchesComponent {\n options = input<SearchesConfig>();\n\n protected config = inject(SAVED_SEARCHES_CONFIG);\n protected readonly userSettingsStore = inject(UserSettingsStore);\n\n protected readonly range = signal<number>(10);\n protected readonly savedSearches = computed<SearchItem[]>(() =>\n (this.userSettingsStore.savedSearches() || []).reduce((acc, item) => {\n const queryParams = getQueryParamsFromUrl(item.url);\n\n acc.push(\n Object.assign(item, {\n label: queryParams?.text || '',\n filterCount: queryParams?.filters?.length || 0,\n queryParams\n })\n );\n\n return acc;\n }, [] as SearchItem[])\n );\n protected readonly paginatedSearches = computed<SearchItem[]>(() => this.savedSearches().slice(0, this.range()));\n protected readonly hasMore = computed<boolean>(() => this.savedSearches().length > 0 && this.range() < this.savedSearches().length);\n\n constructor() {\n effect(() => {\n if (this.options()) {\n this.config = { ...this.config, ...this.options() };\n this.range.set(this.config.itemsPerPage ?? 10);\n }\n });\n }\n\n public async onDelete(index: number) {\n await this.userSettingsStore.deleteSavedSearch(index);\n notify.success('Saved search deleted');\n }\n\n public loadMore(): void {\n this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n }\n}\n","import { Component, inject, output, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogResult,\n DialogTitleComponent,\n InputComponent\n} from '@sinequa/ui';\n\nimport { SavedSearchesService } from '../../services';\nimport { QueryParamsStore } from '../../stores';\n\n@Component({\n selector: 'saved-search-dialog, savedsearchdialog, SavedSearchDialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogContentComponent,\n DialogFooterComponent,\n InputComponent\n ],\n providers: [provideTranslocoScope('searches')],\n template: `\n <dialog #dialog>\n <DialogHeader>\n <DialogTitle>{{ 'searches.saved.save' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent class=\"flex flex-col gap-2\">\n <input\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.aria-label]=\"'searches.saved.saveName' | transloco\"\n [attr.placeholder]=\"'searches.saved.saveName' | transloco\"\n [ngModel]=\"saveName()\"\n (ngModelChange)=\"saveName.set($event)\" />\n </DialogContent>\n\n <DialogFooter class=\"flex-col\">\n <div class=\"ml-auto flex justify-end gap-2\">\n <button variant=\"outline\" (click)=\"dialog.close($event)\">\n {{ 'cancel' | transloco }}\n </button>\n <button (click)=\"confirm($event)\" [disabled]=\"!saveName()\">\n {{ 'confirm' | transloco }}\n </button>\n </div>\n </DialogFooter>\n </dialog>\n `\n})\nexport class SavedSearchDialog implements DialogInterface {\n private readonly savedSearchesService = inject(SavedSearchesService);\n protected readonly queryParamsStore = inject(QueryParamsStore);\n dialog = viewChild<DialogComponent>(DialogComponent);\n\n saveName = signal<string>('');\n readonly closed = output<DialogResult>();\n\n open(text: string): void {\n this.saveName.set(text || '');\n this.dialog()!.showModal();\n }\n\n async confirm(e: Event): Promise<void> {\n this.savedSearchesService.saveSearch(this.saveName());\n // emit close output of the component\n this.dialog()!.close(e, 'dialog-confirm');\n // emit closed event for the diaglog service\n this.closed.emit('dialog-confirm');\n }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { provideTranslocoScope, TranslocoService } from '@jsverse/transloco';\n\nimport { ActivatedRoute } from '@angular/router';\nimport { Article, notify } from '@sinequa/atomic';\nimport { UserSettingsStore } from '../../stores';\n\n@Component({\n selector: 'bookmark-button, bookmarkbutton, BookmarkButton',\n providers: [provideTranslocoScope('bookmark')],\n template: ` @if (isBookmarked()) {\n <i class=\"fa-fw fa-bookmark fa-solid\"></i>\n } @else {\n <i class=\"fa-fw fa-bookmark fa-regular\"></i>\n }`,\n host: {\n class: 'cursor-pointer',\n '[title]': 'title()',\n '(click)': 'bookmark($event)'\n }\n})\nexport class BookmarkButtonComponent {\n public readonly article = input.required<Partial<Article>>();\n\n private readonly userSettingsStore = inject(UserSettingsStore);\n private readonly route = inject(ActivatedRoute);\n private readonly transloco = inject(TranslocoService);\n\n protected isBookmarked = computed(() => {\n return this.userSettingsStore.isBookmarked(this.article());\n });\n\n protected title = computed(() => this.transloco.translate('bookmarks.bookmarkDocument'));\n\n public async bookmark(e: Event) {\n e.stopPropagation();\n const isBookmarked = await this.userSettingsStore.isBookmarked(this.article());\n\n if (isBookmarked) {\n await this.userSettingsStore.unbookmark(this.article()!.id!);\n notify.success(this.transloco.translate('bookmarks.bookmarkRemoved'), { duration: 2000 });\n } else {\n let current = this.route.snapshot;\n while (current.firstChild) {\n current = current.firstChild;\n }\n const { queryName } = current.data;\n await this.userSettingsStore.bookmark(this.article()! as Article, queryName);\n notify.success(this.transloco.translate('bookmarks.bookmarkAdded'), { duration: 2000 });\n }\n }\n}\n","import { Component, computed, DestroyRef, effect, inject, InjectionToken, input, signal } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { RouterLink } from '@angular/router';\nimport { LegacyFilter, notify, Query } from '@sinequa/atomic';\nimport { ButtonComponent, HorizontalDividerComponent, ListItemComponent, PopoverContentComponent } from '@sinequa/ui';\n\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Bookmark } from '../../models';\nimport { QueryService } from '../../services';\nimport { AppStore, UserSettingsStore } from '../../stores';\nimport { DrawerStackService } from '../drawer-stack/drawer-stack.service';\n\nexport type BookmarksConfig = {\n itemsPerPage?: number;\n showLoadMore?: boolean;\n routerLink?: string;\n};\n\nexport const BOOKMARKS_OPTIONS: BookmarksConfig = {\n itemsPerPage: 10,\n showLoadMore: true,\n routerLink: '/bookmarks'\n};\n\nexport const BOOKMARKS_CONFIG = new InjectionToken<BookmarksConfig>('Bookmarks options', {\n factory: () => BOOKMARKS_OPTIONS\n});\n\n@Component({\n selector: 'bookmarks, Bookmarks',\n standalone: true,\n imports: [TranslocoPipe, RouterLink, ButtonComponent, HorizontalDividerComponent, ListItemComponent],\n providers: [provideTranslocoScope('bookmarks')],\n templateUrl: './bookmarks.html',\n styles: [\n `\n :host {\n ul {\n scrollbar-width: thin;\n }\n }\n `\n ]\n})\nexport class BookmarksComponent {\n floating = inject(PopoverContentComponent, { skipSelf: true, optional: true });\n\n private readonly drawerStack = inject(DrawerStackService);\n private readonly queryService = inject(QueryService);\n private readonly userSettingsStore = inject(UserSettingsStore);\n private readonly appStore = inject(AppStore);\n\n private destroyRef = inject(DestroyRef);\n\n options = input<BookmarksConfig>();\n config = inject(BOOKMARKS_CONFIG);\n\n public range = signal<number>(10);\n protected bookmarks = computed<Bookmark[]>(() => this.userSettingsStore.bookmarks());\n public paginatedBookmarks = computed<Bookmark[]>(() => this.bookmarks().slice(0, this.range()));\n public hasMore = computed<boolean>(() => this.bookmarks().length > 0 && this.range() < this.bookmarks().length);\n\n constructor() {\n effect(() => {\n if (this.options()) {\n this.config = { ...this.config, ...this.options() };\n this.range.set(this.config.itemsPerPage ?? 10);\n }\n });\n }\n\n public onClick(bookmark: Bookmark): void {\n const query: Partial<Query> = {\n name: bookmark.queryName,\n filters: {\n field: 'id',\n value: bookmark.id\n } as LegacyFilter\n };\n\n if (!bookmark.queryName) {\n this.performSecondSearch(query);\n return;\n }\n\n this.queryService\n .search(query, false)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(result => {\n if (!result.records || result.records.length === 0) {\n this.performSecondSearch(query);\n return;\n }\n\n this.drawerStack.replace(result.records[0]);\n });\n }\n\n private performSecondSearch(query: Partial<Query>): void {\n query.name = this.appStore.getDefaultQuery()?.name;\n this.queryService\n .search(query, false)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(result => {\n if (!result.records || result.records.length === 0) {\n notify.warning('This bookmark is outdated and cannot be opened', { description: 'no record found!', duration: 2000 });\n return;\n }\n\n this.drawerStack.replace(result.records[0]);\n });\n }\n\n public onDelete(bookmark: Bookmark, e: Event) {\n e.stopPropagation();\n this.userSettingsStore.unbookmark(bookmark.id);\n notify.success('Bookmark removed', { duration: 2000 });\n }\n\n loadMore(e: Event) {\n e.stopPropagation();\n this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n }\n}\n","@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'bookmarks.label' | transloco }}</label>\n <MenuSeparator />\n </div>\n}\n\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\" role=\"list\">\n @for (bookmark of paginatedBookmarks(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(bookmark)\" (keydown.enter)=\"onClick(bookmark)\">\n <i class=\"fa-fw fas fa-bookmark shrink-0\" aria-hidden=\"true\"></i>\n\n <p class=\"line-clamp-1\">{{ bookmark.label }}</p>\n\n @if (bookmark.author) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-user\" aria-hidden=\"true\"></i>\n {{ bookmark.author }}\n </p>\n }\n @if (bookmark.parentFolder) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-folder\" aria-hidden=\"true\"></i>\n {{ bookmark.parentFolder }}\n </p>\n }\n\n <button\n variant=\"icon\"\n title=\"{{ 'bookmarks.openBookmark' | transloco }}\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n [attr.title]=\"'bookmarks.removeBookmark' | transloco\"\n [attr.aria-label]=\"'bookmarks.removeBookmark' | transloco\"\n (click)=\"onDelete(bookmark, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"py-4 text-center text-neutral-500\">{{ 'bookmarks.noBookmarks' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">{{ 'loadMore' | transloco }}</button>\n }\n <button variant=\"link\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n","import { Component, inject, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\n\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent\n} from '@sinequa/ui';\n\nimport { Basket } from '../../../models';\nimport { UserSettingsStore } from '../../../stores';\nimport { notify } from '@sinequa/atomic';\n\n@Component({\n selector: 'delete-collection-dialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogContentComponent,\n DialogFooterComponent\n ],\n providers: [provideTranslocoScope('collections')],\n template: `\n <dialog #dialog>\n <DialogHeader>\n <DialogTitle>{{ 'collections.deleteCollection' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent>\n <p>{{ 'collections.confirmDelete' | transloco }} {{ collection()?.name }}?</p>\n </DialogContent>\n\n <DialogFooter>\n <button variant=\"outline\" (click)=\"dialog.cancel($event)\">\n {{ 'cancel' | transloco }}\n </button>\n\n <button variant=\"destructive\" (click)=\"deleteCollection($event)\">\n {{ 'delete' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class DeleteCollectionDialog implements DialogInterface {\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n private readonly userSettingsStore = inject(UserSettingsStore);\n private readonly translocoService = inject(TranslocoService);\n\n collection = signal<Basket | undefined>(undefined);\n index = signal<number | undefined>(undefined);\n\n open(collection: Basket, index: number) {\n this.collection.set(collection);\n this.index.set(index);\n this.dialog()!.showModal();\n }\n\n async deleteCollection(e: Event): Promise<void> {\n this.dialog()!.close(e);\n await this.userSettingsStore.deleteBasket(this.index()!);\n const message = this.translocoService.translate('collections.deleted');\n notify.success(message, { duration: 2000 });\n }\n}\n","import { Component, computed, effect, inject, InjectionToken, input, signal, viewChild } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { ButtonComponent, HorizontalDividerComponent, ListItemComponent, PopoverComponent } from '@sinequa/ui';\n\nimport { Basket } from '../../models';\nimport { UserSettingsStore } from '../../stores';\nimport { DrawerStackService } from '../drawer-stack/drawer-stack.service';\nimport { DeleteCollectionDialog } from './dialogs/delete.dialog';\n\nexport type CollectionsConfig = {\n itemsPerPage?: number;\n showLoadMore?: boolean;\n routerLink?: string;\n};\n\nexport const COLLECTIONS_OPTIONS: CollectionsConfig = {\n itemsPerPage: 10,\n showLoadMore: false,\n routerLink: '/collections'\n};\n\nexport const COLLECTIONS_CONFIG = new InjectionToken<CollectionsConfig>('Collections options', {\n factory: () => COLLECTIONS_OPTIONS\n});\n\n@Component({\n selector: 'app-collections',\n standalone: true,\n imports: [TranslocoPipe, RouterLink, HorizontalDividerComponent, DeleteCollectionDialog, ButtonComponent, ListItemComponent],\n templateUrl: './collections.html',\n providers: [provideTranslocoScope('collections')]\n})\nexport class CollectionsComponent {\n floating = inject(PopoverComponent, { skipSelf: true, optional: true });\n\n private readonly userSettingsStore = inject(UserSettingsStore);\n private readonly drawerStack = inject(DrawerStackService);\n private readonly router = inject(Router);\n\n options = input<CollectionsConfig>();\n config = inject(COLLECTIONS_CONFIG);\n\n public range = signal<number>(10);\n protected collections = computed<Basket[]>(() => this.userSettingsStore.baskets());\n public paginatedCollections = computed<Basket[]>(() => this.collections().slice(0, this.range()));\n public hasMore = computed<boolean>(() => this.collections().length > 0 && this.range() < this.collections().length);\n\n readonly deleteCollectionDialog = viewChild(DeleteCollectionDialog);\n\n constructor() {\n effect(() => {\n if (this.options()) {\n this.config = { ...this.config, ...this.options() };\n this.range.set(this.config.itemsPerPage ?? 10);\n }\n });\n }\n\n onClick(collection: Basket): void {\n this.drawerStack.closeAll();\n this.router.navigate(['/search'], { queryParams: { b: collection.name } });\n }\n\n public onDelete(collection: Basket, index: number, e: Event) {\n e.stopPropagation();\n this.deleteCollectionDialog()?.open(collection, index);\n }\n\n loadMore(e: Event) {\n e.stopPropagation();\n this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n }\n}\n","@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'collections.label' | transloco }}</label>\n <MenuSeparator />\n </div>\n}\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\">\n @for (collection of paginatedCollections(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(collection)\" (keydown.enter)=\"onClick(collection)\">\n <i class=\"fas fa-inbox\"></i>\n\n <p class=\"line-clamp-1\">{{ collection.name }}</p>\n\n <button\n variant=\"icon\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'collections.deleteCollection' | transloco }}\"\n [attr.aria-label]=\"'collections.deleteCollection' | transloco\"\n (click)=\"onDelete(collection, $index, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"list-none py-4 text-center text-neutral-500\">{{ 'collections.noCollections' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">{{ 'loadMore' | transloco }}</button>\n }\n <button variant=\"link\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n\n<delete-collection-dialog />\n","import { Component, computed, inject, output, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\nimport { firstValueFrom } from 'rxjs';\n\nimport {\n ButtonComponent,\n ChevronRightIconComponent,\n CircleCheckIconComponent,\n DialogComponent,\n DialogContentComponent,\n DialogEvent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent,\n InputComponent,\n LoadingCircleIconComponent\n} from '@sinequa/ui';\n\nimport { Alert } from '../../../models';\nimport { QueryService } from '../../../services';\nimport { QueryParamsStore, UserSettingsStore } from '../../../stores';\n\n@Component({\n selector: 'alert-dialog, alertdialog, AlertDialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogContentComponent,\n DialogFooterComponent,\n InputComponent,\n ChevronRightIconComponent,\n LoadingCircleIconComponent,\n CircleCheckIconComponent\n ],\n providers: [provideTranslocoScope('alerts')],\n template: `\n <dialog #dialog>\n <DialogHeader class=\"px-1\">\n <DialogTitle>{{ 'alerts.createAlert' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent class=\"flex flex-col gap-2 overflow-auto px-1\">\n <div class=\"mb-2\">\n <label for=\"alertName\" class=\"mb-1 block text-sm font-medium text-gray-700\">{{ 'alerts.alertName' | transloco }}</label>\n <input\n id=\"alertName\"\n name=\"alertName\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.aria-label]=\"'alerts.alertName' | transloco\"\n [attr.placeholder]=\"'alerts.placeholder' | transloco\"\n [ngModel]=\"alertName()\"\n (ngModelChange)=\"alertName.set($event)\" />\n </div>\n\n <div class=\"mb-2\">\n <label class=\"mb-1 block text-sm font-medium text-gray-700\" for=\"frequency\">{{ 'alerts.alertFrequency' | transloco }}</label>\n <div class=\"relative\">\n <select\n id=\"frequency\"\n name=\"frequency\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full appearance-none rounded-md border border-gray-200 bg-neutral-50 px-2 pr-8 hover:bg-white hover:outline focus:bg-white focus:outline\"\n id=\"alertFrequency\"\n [ngModel]=\"alertFrequency()\"\n (ngModelChange)=\"alertFrequency.set($event)\">\n @for (frequencyValue of frequencies; track $index) {\n <option [value]=\"frequencyValue\">{{ 'alerts.frequency.' + frequency[frequencyValue] | transloco }}</option>\n }\n </select>\n <ChevronRight width=\"16\" height=\"16\" class=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 rotate-90 transform text-gray-400\" />\n </div>\n </div>\n\n <div class=\"mb-2\">\n <p class=\"mb-2 block text-sm font-medium text-gray-700\">{{ 'alerts.repeatOn' | transloco }}</p>\n <div class=\"weekdays-grid gap-1.5 px-2.5 py-0\">\n @for (day of weekdays; track $index) {\n <div>\n <input class=\"me-1\" type=\"checkbox\" id=\"day_{{ day.value }}\" [checked]=\"dayChecked(day.value)\" (change)=\"dayChange($event, day.value)\" />\n <label role=\"button\" for=\"day_{{ day.value }}\" class=\"form-check-label user-select-none cursor-pointer\">{{\n 'alerts.weekdays.' + day.key | transloco\n }}</label>\n </div>\n }\n </div>\n </div>\n\n <div class=\"mb-6\">\n <label class=\"mb-1 block text-sm font-medium text-gray-700\" for=\"alertTimes\">Time</label>\n <input\n type=\"time\"\n id=\"alertTimes\"\n name=\"alertTimes\"\n class=\"inline-block w-full\"\n autocomplete=\"off\"\n spellcheck=\"off\"\n [value]=\"alertTimes()\"\n [ngModel]=\"alertTimes()\"\n (ngModelChange)=\"alertTimes.set($event)\" />\n </div>\n\n <div class=\"mb-6\">\n <input class=\"me-1\" type=\"checkbox\" id=\"alertActive\" [checked]=\"alertActive()\" (change)=\"alertActive.set(!alertActive())\" />\n <label role=\"button\" for=\"alertActive\" class=\"form-check-label user-select-none cursor-pointer\">{{ 'alerts.alertActive' | transloco }}</label>\n </div>\n </DialogContent>\n\n <DialogFooter class=\"flex-col\">\n @if (alert || canUpdateQuery()) {\n <div class=\"flex w-full flex-col gap-2\">\n @if (alert) {\n <button variant=\"outline\" (click)=\"execute($event)\" [disabled]=\"!canUpdateQuery()\">\n {{ 'alerts.execute' | transloco }}\n </button>\n }\n @if (canUpdateQuery()) {\n <button [disabled]=\"updateStatus() !== 'idle'\" variant=\"outline\" (click)=\"updateQuery()\">\n @switch (updateStatus()) {\n @case ('updating') {\n <LoadingCircle class=\"size-4 animate-spin\" width=\"16\" height=\"16\" />\n {{ 'alerts.updateQuery' | transloco }}\n }\n @case ('updated') {\n <CircleCheck width=\"16\" height=\"16\" />\n {{ 'alerts.queryUpdated' | transloco }}\n }\n @default {\n {{ 'alerts.updateQuery' | transloco }}\n }\n }\n </button>\n }\n </div>\n }\n <div class=\"ml-auto flex justify-end gap-2\">\n <button variant=\"outline\" (click)=\"dialog.cancel($event)\">\n {{ 'cancel' | transloco }}\n </button>\n <button (click)=\"confirm($event)\" [disabled]=\"invalidForm()\">\n {{ 'confirm' | transloco }}\n </button>\n </div>\n </DialogFooter>\n </dialog>\n `,\n styles: `\n .weekdays-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n }\n `\n})\nexport class AlertDialog implements DialogInterface {\n private readonly queryService = inject(QueryService);\n private readonly queryParamsStore = inject(QueryParamsStore);\n private readonly userSettingsStore = inject(UserSettingsStore);\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n frequencies = [Alert.Frequency.Daily, Alert.Frequency.Hourly, Alert.Frequency.Immediate];\n frequency = Alert.Frequency;\n weekdays = [\n { key: 'monday', value: Alert.Days.Monday },\n { key: 'tuesday', value: Alert.Days.Tuesday },\n { key: 'wednesday', value: Alert.Days.Wednesday },\n { key: 'thursday', value: Alert.Days.Thursday },\n { key: 'friday', value: Alert.Days.Friday },\n { key: 'saturday', value: Alert.Days.Saturday },\n { key: 'sunday', value: Alert.Days.Sunday }\n ];\n\n index?: number;\n alert?: Alert;\n\n alertName = signal<string>('');\n alertFrequency = signal<Alert.Frequency>(Alert.Frequency.Daily);\n alertDays = signal<Alert.Days>(Alert.Days.None);\n alertTimes = signal<string>('09:00');\n alertActive = signal<boolean>(true);\n canUpdateQuery = signal<boolean>(false);\n\n updateStatus = signal<'updating' | 'updated' | 'idle'>('idle');\n\n invalidForm = computed(() => !this.alertName() || !this.alertTimes());\n\n closed = output<DialogEvent>();\n\n open(index: number): void {\n this.showModal(index);\n }\n\n async showModal(index?: number) {\n this.index = index;\n\n if (index !== undefined) {\n this.alert = this.userSettingsStore.alerts()[index];\n if (this.alert) {\n this.alertName.set(this.alert.name);\n this.alertFrequency.set(this.alert.frequency);\n this.alertDays.set(this.alert.days);\n this.alertTimes.set(this.alert.times);\n this.alertActive.set(this.alert.active);\n\n const q = this.queryParamsStore.getQuery();\n const response = await firstValueFrom(this.queryService.search(q, false));\n this.canUpdateQuery.set(response.records?.length > 0);\n }\n } else {\n this.alertName.set('');\n this.alertFrequency.set(Alert.Frequency.Daily);\n this.alertDays.set(Alert.Days.None);\n this.alertTimes.set('09:00');\n this.alertActive.set(true);\n }\n\n this.dialog()!.open();\n }\n\n async confirm(e: Event): Promise<void> {\n if (this.alert) {\n this.update();\n } else {\n this.create();\n }\n this.dialog()!.close(e);\n }\n\n private async create(): Promise<void> {\n const alert: Alert = {\n name: this.alertName(),\n description: '',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n query: this.queryParamsStore.getQuery(),\n frequency: this.alertFrequency(),\n days: this.alertDays(),\n interval: 1,\n index: 1,\n times: this.alertTimes(),\n active: this.alertActive(),\n combine: true,\n respectTabSelection: false\n };\n\n this.userSettingsStore.createAlert(alert);\n }\n\n private async update(): Promise<void> {\n this.alert!.name = this.alertName();\n this.alert!.frequency = this.alertFrequency();\n this.alert!.days = this.alertDays();\n this.alert!.times = this.alertTimes();\n this.alert!.active = this.alertActive();\n\n this.userSettingsStore.updateAlert(this.alert!, this.index!);\n }\n\n dayChecked(day: Alert.Days): boolean {\n return (this.alertDays() & day) !== 0;\n }\n\n dayChange(event: Event, day: Alert.Days) {\n const input = event.target as HTMLInputElement;\n if (input.checked) {\n this.alertDays.set(this.alertDays() | day);\n } else {\n this.alertDays.set(this.alertDays() & ~day);\n }\n }\n\n updateQuery() {\n this.updateStatus.set('updating');\n this.alert!.query = this.queryParamsStore.getQuery();\n this.userSettingsStore\n .updateAlert(this.alert!, this.index!)\n .then(() => {\n setTimeout(() => {\n this.updateStatus.set('updated');\n }, 500); // 500ms delay before setting to 'updated'\n })\n .then(() => {\n setTimeout(() => {\n this.updateStatus.set('idle');\n }, 2000);\n });\n }\n\n execute(e: Event) {\n const q = this.alert!.query;\n const filters = Array.isArray(q.filters) ? q.filters : undefined;\n this.queryParamsStore.patch({ text: q.text, tab: q.tab, basket: q.basket, sort: q.sort, filters, name: q.name });\n this.dialog()!.close(e);\n }\n}\n","import { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\nimport { Component, computed, effect, inject, signal, viewChild } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { Query } from '@sinequa/atomic';\nimport { ButtonComponent, DialogService, HorizontalDividerComponent, ListItemComponent, PopoverComponent } from '@sinequa/ui';\n\nimport { Alert } from '../../models';\nimport { UserSettingsStore } from '../../stores';\nimport { buildQuery } from '../../utils';\nimport { AlertDialog } from './dialogs/alert.dialog';\n\n@Component({\n selector: 'Alerts',\n standalone: true,\n imports: [TranslocoPipe, ButtonComponent, HorizontalDividerComponent, ListItemComponent, DragDropModule],\n templateUrl: './alerts.html',\n providers: [provideTranslocoScope('alerts')]\n})\nexport class AlertsComponent {\n floating = inject(PopoverComponent, { skipSelf: true, optional: true });\n private readonly userSettingsStore = inject(UserSettingsStore);\n modal = inject(DialogService);\n\n readonly alertFormDialog = viewChild(AlertDialog);\n\n reordering = signal<boolean>(false);\n protected alerts = computed<Alert[]>(() => this.userSettingsStore.alerts());\n\n tmpAlerts: Alert[] = [];\n query: Query;\n\n constructor() {\n this.query = buildQuery();\n\n effect(() => {\n this.tmpAlerts = this.alerts()?.map(a => Object.assign({}, a));\n });\n }\n\n onClick(index: number): void {\n this.floating?.close();\n this.modal.open(AlertDialog, index).then(v => console.log('result', v));\n }\n\n createAlert(): void {\n this.floating?.close();\n this.modal.open(AlertDialog).then(v => console.log('result', v));\n }\n\n deleteAlert(event: Event, index: number) {\n event.stopPropagation();\n this.userSettingsStore.deleteAlert(index);\n }\n\n async reorder() {\n if (this.reordering()) {\n await this.userSettingsStore.updateAlerts(this.tmpAlerts);\n this.reordering.set(false);\n } else {\n this.reordering.set(true);\n }\n }\n\n dropped(drop: CdkDragDrop<Alert[]>) {\n if (drop.currentIndex === drop.previousIndex) {\n return;\n }\n this.tmpAlerts.splice(drop.currentIndex, 0, this.tmpAlerts.splice(drop.previousIndex, 1)[0]);\n }\n}\n","<ul\n role=\"list\"\n class=\"flex min-w-80 flex-col p-2\"\n cdkDropList\n [cdkDropListData]=\"tmpAlerts\"\n [cdkDropListDisabled]=\"!reordering()\"\n (cdkDropListDropped)=\"dropped($event)\">\n @if (floating) {\n <label class=\"text-xl font-bold\">{{ 'alerts.label' | transloco }}</label>\n <MenuSeparator />\n }\n @for (alert of tmpAlerts; track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" cdkDrag (click)=\"onClick($index)\" (keydown.enter)=\"onClick($index)\">\n <i class=\"fa-fw fas fa-bell shrink-0\" aria-hidden=\"true\"></i>\n <p class=\"line-clamp-1\">{{ alert.name }}</p>\n @if (!reordering()) {\n <button\n variant=\"icon\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'alerts.deleteAlert' | transloco }}\"\n [attr.aria-label]=\"'alerts.deleteAlert' | transloco\"\n (click)=\"deleteAlert($event, $index)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <i class=\"fa-fw fa-regular fa-bars\"></i>\n }\n </li>\n } @empty {\n <li role=\"listitem\" class=\"py-4 text-center text-neutral-500\">{{ 'alerts.noAlerts' | transloco }}</li>\n }\n</ul>\n<div class=\"flex flex-col gap-2 p-2\">\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'alerts.manageAlerts' | transloco\" [disabled]=\"!alerts().length\" (click)=\"reorder()\">\n {{ (reordering() ? 'save' : 'alerts.manageAlerts') | transloco }}\n </button>\n <button class=\"w-full\" [attr.title]=\"'alerts.createAlert' | transloco\" (click)=\"createAlert()\">{{ 'alerts.createAlert' | transloco }}</button>\n</div>\n","import { Component, inject, model, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { globalConfig, login, notify, setGlobalConfig } from '@sinequa/atomic';\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent,\n InputComponent\n} from '@sinequa/ui';\nimport { ApplicationService } from '../../services';\nimport { PrincipalStore } from '../../stores';\n\n@Component({\n selector: 'override-user-dialog',\n standalone: true,\n imports: [\n FormsModule,\n ButtonComponent,\n InputComponent,\n DialogComponent,\n DialogContentComponent,\n DialogTitleComponent,\n DialogHeaderComponent,\n DialogFooterComponent,\n TranslocoPipe\n ],\n providers: [provideTranslocoScope('dialogs')],\n template: `\n <dialog #dialog class=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>{{ 'dialogs.overrideUser.title' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent class=\"flex flex-col gap-4 overflow-auto\">\n <div>\n <label for=\"username\" class=\"mb-1 block text-sm font-medium text-gray-700\">{{ 'dialogs.overrideUser.usernameToOverride' | transloco }}</label>\n <input\n id=\"username\"\n name=\"username\"\n required\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.placeholder]=\"'dialogs.overrideUser.usernamePlaceholder' | transloco\"\n [(ngModel)]=\"overrideUser().username\"\n (keydown.enter)=\"override($event)\" />\n </div>\n\n <div>\n <label for=\"domain\" class=\"mb-1 block text-sm font-medium text-gray-700\">{{ 'dialogs.overrideUser.domainToOverride' | transloco }}</label>\n <input\n id=\"domain\"\n name=\"domain\"\n required\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.placeholder]=\"'dialogs.overrideUser.domainPlaceholder' | transloco\"\n [(ngModel)]=\"overrideUser().domain\"\n (keydown.enter)=\"override($event)\" />\n </div>\n </DialogContent>\n\n <DialogFooter>\n <button variant=\"outline\" (click)=\"dialog.close($event)\">\n {{ 'cancel' | transloco }}\n </button>\n\n <button (click)=\"override($event)\" [disabled]=\"!overrideUser().username || !overrideUser().domain\">\n {{ 'dialogs.overrideUser.override' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class OverrideUserDialogComponent implements DialogInterface {\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n private readonly appService = inject(ApplicationService);\n private readonly principalStore = inject(PrincipalStore);\n\n readonly overrideUser = model<{ username: string; domain: string }>({ username: '', domain: '' });\n\n open() {\n this.dialog()!.showModal();\n }\n\n override(e: Event) {\n if (!!this.overrideUser().domain && !!this.overrideUser().username) {\n this.handleOverrideUser(this.overrideUser().username, this.overrideUser().domain);\n this.dialog()!.close(e);\n }\n }\n\n handleOverrideUser(username?: string, domain?: string) {\n const { useSSO } = globalConfig;\n\n if (username === undefined || domain === undefined) {\n setGlobalConfig({ userOverrideActive: false, userOverride: undefined });\n } else {\n setGlobalConfig({ userOverrideActive: true, userOverride: { username, domain } });\n }\n\n // Login with the new user\n if (useSSO) {\n this.appService\n .init()\n .then(() => {\n const { fullName } = getState(this.principalStore).principal;\n notify.success(`Welcome back ${fullName}!`, { duration: 2000 });\n })\n .catch(error => {\n notify.error('An error occured while overriding (SSO - intialize)', { duration: 2000 });\n setGlobalConfig({ userOverrideActive: false, userOverride: undefined });\n });\n } else {\n login()\n .then(value => {\n if (value) {\n this.appService\n .init()\n .then(() => {\n const { fullName } = getState(this.principalStore).principal;\n notify.success(`Welcome back ${fullName}!`, { duration: 2000 });\n })\n .catch(error => {\n notify.error('An error occured while overriding (initialize)', { duration: 2000 });\n setGlobalConfig({ userOverrideActive: false, userOverride: undefined });\n });\n }\n })\n .catch(error => {\n notify.error('An error occured while overriding (login)', { duration: 2000 });\n setGlobalConfig({ userOverrideActive: false, userOverride: undefined });\n });\n }\n }\n}\n","import { Component, inject, viewChild } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\n\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent\n} from '@sinequa/ui';\nimport { UserSettingsStore } from '../../stores';\nimport { notify } from '@sinequa/atomic';\n\n@Component({\n selector: 'reset-user-settings-dialog',\n standalone: true,\n imports: [ButtonComponent, DialogComponent, DialogTitleComponent, DialogContentComponent, DialogFooterComponent, DialogHeaderComponent, TranslocoPipe],\n providers: [provideTranslocoScope('dialogs')],\n template: `\n <dialog #dialog>\n <DialogHeader>\n <DialogTitle>{{ 'dialogs.resetUserSettings.title' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent>\n <p>{{ 'dialogs.resetUserSettings.message' | transloco }}</p>\n </DialogContent>\n\n <DialogFooter>\n <button variant=\"outline\" (click)=\"dialog.close($event)\">\n {{ 'cancel' | transloco }}\n </button>\n\n <button variant=\"destructive\" (click)=\"handleResetUserSettings($event)\">\n {{ 'delete' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class ResetUserSettingsDialogComponent implements DialogInterface {\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n private readonly userSettingsStore = inject(UserSettingsStore);\n private readonly translocoService = inject(TranslocoService);\n\n open() {\n this.dialog()!.showModal();\n }\n\n handleResetUserSettings(e: Event) {\n this.dialog()!.close(e);\n this.userSettingsStore.reset().then(() => {\n const message = this.translocoService.translate('dialogs.resetUserSettings.success');\n notify.success(message, { duration: 2000 });\n });\n }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { Router, RouterModule } from '@angular/router';\nimport { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco';\n\nimport { Result } from '@sinequa/atomic';\nimport { QueryParamsStore } from '../../stores';\n\n@Component({\n selector: 'app-did-you-mean',\n standalone: true,\n imports: [RouterModule, TranslocoPipe],\n templateUrl: './did-you-mean.html',\n styles: [\n `\n :host {\n display: block;\n }\n `\n ],\n providers: [provideTranslocoScope('did-you-mean')]\n})\nexport class DidYouMeanComponent {\n result = input<Result>();\n\n protected spellingCorrectionMode = computed(() => this.result()?.didYouMean?.spellingCorrectionMode);\n protected correction = computed(() => this.result()?.didYouMean?.text.corrected);\n protected original = computed(() => this.result()?.didYouMean?.text.original);\n\n readonly router = inject(Router);\n private readonly queryParamsStore = inject(QueryParamsStore);\n\n selectCorrected(): void {\n this.queryParamsStore.patch({ spellingCorrectionMode: 'dymonly', text: this.correction()! });\n this.router.navigate([], { queryParamsHandling: 'merge', queryParams: { c: 'dymonly', q: this.correction() } });\n }\n\n selectOriginal(): void {\n this.queryParamsStore.patch({ spellingCorrectionMode: 'dymonly' });\n this.router.navigate([], { queryParamsHandling: 'merge', queryParams: { c: 'dymonly', q: this.original() } });\n }\n}\n","@switch (spellingCorrectionMode()?.toLowerCase()) { @case ('dymonly') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.didYouMean' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n <span>?</span>\n</p>\n} @case ('correct') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n\n <span class=\"me-1\">. {{ 'didYouMean.searchInsteadFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n</p>\n} @case ('smart') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n\n <span class=\"mx-1\">and</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n</p>\n} }\n","import { Component, DestroyRef, computed, effect, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco';\nimport { fromEvent } from 'rxjs';\n\nimport { Credentials, Principal, error, globalConfig, info, isAuthenticated, login, logout, notify, warn } from '@sinequa/atomic';\nimport { ButtonComponent, CardComponent, CardContentComponent, CardFooterComponent, CardHeaderComponent, InputComponent } from '@sinequa/ui';\n\nimport { ApplicationService, PrincipalService } from '../../services';\n\n/**\n * Represents the LoginComponent class, which is responsible for handling the login functionality.\n * This component is used to authenticate users and manage the user's authentication status.\n */\n@Component({\n selector: 'signIn, signin, sign-in',\n standalone: true,\n providers: [provideTranslocoScope('login')],\n imports: [\n RouterModule,\n FormsModule,\n TranslocoPipe,\n InputComponent,\n ButtonComponent,\n CardComponent,\n CardHeaderComponent,\n CardContentComponent,\n CardFooterComponent\n ],\n templateUrl: './sign-in.html',\n styles: [\n `\n :host {\n min-height: 100vh;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 2rem;\n }\n .btn-primary {\n background-color: black;\n color: white;\n }\n `\n ]\n})\nexport class SignInComponent {\n config = globalConfig;\n\n /**\n * Represents the user credentials for login.\n */\n credentials = signal<Credentials>({ username: '', password: '' });\n\n readonly authenticated = signal<boolean>(isAuthenticated());\n readonly user = signal<Principal | null>(null);\n readonly returnUrl = signal<string[] | null>(null);\n\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly principalService = inject(PrincipalService);\n private readonly applicationService = inject(ApplicationService);\n\n /**\n * Indicates whether the login credentials are valid.\n * Returns true if both the username and password are non-empty, otherwise false.\n */\n valid = computed(() => this.credentials().username.length > 0 && this.credentials().password.length > 0);\n\n constructor(private destroyRef: DestroyRef) {\n effect(() => {\n if (this.authenticated()) {\n this.principalService\n .getPrincipal()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(principal => this.user.set(principal));\n }\n });\n\n effect(() => {\n if (this.returnUrl() !== null) {\n const [url] = this.returnUrl() || ['/'];\n this.router.navigateByUrl(url);\n }\n });\n\n fromEvent(window, 'authenticated')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n const response = event as CustomEvent;\n this.authenticated.set(response.detail.authenticated);\n const url = this.route.snapshot.queryParams['returnUrl'] || null;\n\n if (url !== null) {\n this.returnUrl.set([url]);\n }\n\n if (isAuthenticated()) {\n if (url !== null) {\n this.router.navigateByUrl(url);\n } else {\n this.router.navigateByUrl('/');\n }\n }\n });\n }\n\n /**\n * Updates the credentials with the provided values.\n * @param credentials - An object containing the username and password.\n */\n updateCredentials(credentials: { username?: string; password?: string }) {\n this.credentials.update(v => ({ ...v, ...credentials }));\n }\n\n async handleLogout() {\n await logout();\n this.authenticated.set(false);\n }\n\n /**\n * Handles the login process without credentials.\n * This method calls the login function asynchronously.\n */\n async handleLogin() {\n login().catch(error => {\n {\n console.warn('An error occurred while logging in', error);\n this.router.navigate(['error']);\n }\n });\n }\n\n /**\n * Handles the login process with credentials.\n * Calls the login function with the provided credentials and handles any errors that occur.\n */\n async handleLoginWithCredentials() {\n if (!this.valid()) return;\n\n try {\n const response = await login(this.credentials());\n info('SignIn Login response:', response);\n if (response) {\n const { createRoutes = false } = globalConfig;\n this.applicationService.initAndCreateRoutes(createRoutes);\n }\n } catch (error) {\n warn('An error occurred while logging in', error);\n if (typeof error === 'string') {\n notify.error('Login', { description: error });\n } else {\n const { status, errorMessage } = error as { status: number; errorMessage: string };\n notify.error('Login', { description: errorMessage });\n }\n }\n }\n\n handleBack() {\n try {\n window.history.back();\n } catch (err) {\n error('Error navigating back:', err);\n this.router.navigate(['/']);\n }\n }\n}\n","<Card>\n <CardHeader>\n <a href=\"#\" title=\"Logo\">\n <ng-content select=\"[logo]\">\n <svg\n version=\"1.1\"\n id=\"Calque_1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 858 228\"\n style=\"enable-background: new 0 0 858 228\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0 {\n fill: #0040bf;\n }\n .st1 {\n fill: url(#SVGID_1_);\n }\n .st2 {\n fill: url(#SVGID_00000085217246274894832600000009342302383523206054_);\n }\n </style>\n <path\n class=\"st0\"\n d=\"M44.7,168.7c-10.1-4.1-17.6-9.9-22.5-17.1c-5-7.3-7.6-15.7-8.1-25.2h25.7c0.5,10.2,4.6,17.9,12.2,23.1\n c7.6,5.2,18.4,7.8,32.4,7.8c13.5,0,23.5-2.2,30.2-6.5c6.7-4.3,10-10.4,10-18.1c0-6.5-1.7-11.4-5.2-14.6c-3.5-3.2-8.5-5.5-15.1-7\n c-6.6-1.5-14.6-2.9-24.2-4.1c-12.5-1.6-23.4-3.8-32.7-6.4C38.1,98,31,93.9,25.9,88.4c-5-5.5-7.5-13.1-7.5-22.9\n c0-9.1,2.6-16.8,7.7-23.1c5.2-6.3,12.5-11.1,22-14.5c9.5-3.3,20.7-5,33.4-5c19.3,0,34.3,3.8,45.1,11.5c10.8,7.7,16.6,18.4,17.4,32.1\n h-24.9c-0.5-9-4.2-15.6-11.1-19.9c-6.9-4.3-16.1-6.4-27.6-6.4c-11.8,0-21,2-27.4,6.1c-6.5,4.1-9.7,9.6-9.7,16.5\n c0,5.8,1.6,10.2,4.7,13.1c3.1,2.9,7.9,5.1,14.3,6.5c6.4,1.4,14.5,2.8,24.3,4c9.6,1.2,18.3,2.7,26.1,4.4c7.7,1.7,14.4,4.1,20,7.2\n c5.6,3.1,9.8,7.3,12.7,12.5c2.9,5.2,4.4,12,4.4,20.3c0,13.6-5.6,24.3-16.9,32.2c-11.3,7.9-27.7,11.8-49.3,11.8\n C67.7,174.9,54.7,172.9,44.7,168.7z\" />\n <path\n class=\"st0\"\n d=\"M346.6,168.2c-9.4-4.5-16.6-10.9-21.7-19.2c-5.1-8.3-7.6-18.1-7.6-29.4c0-11.5,2.5-21.5,7.6-29.9\n c5.1-8.4,12.3-14.8,21.5-19.4c9.2-4.6,20.1-6.8,32.6-6.8c13,0,24.2,2.4,33.3,7.1c9.2,4.8,16.1,11.6,20.7,20.6\n c4.6,9,6.5,19.8,5.7,32.4h-97.8c0.3,10.9,3.9,19.3,10.9,25.3c7,6,16.5,9,28.4,9c9.2,0,17-1.7,23.2-5c6.2-3.3,10.3-7.8,12-13.4h22.6\n c-1.1,7.1-4.3,13.2-9.7,18.5c-5.4,5.3-12.3,9.4-20.7,12.3c-8.4,2.9-17.8,4.4-28.1,4.4C367,174.9,356,172.7,346.6,168.2z M352.5,88.4\n c-6.7,5.2-10.6,12.4-11.8,21.5h74.4c-0.4-9.4-3.8-16.6-10.3-21.7c-6.5-5.1-15.1-7.6-26-7.6C367.9,80.6,359.2,83.2,352.5,88.4z\" />\n <path\n class=\"st0\"\n d=\"M546,151.9h-1c-3.4,7.1-9,12.7-16.9,16.8c-7.9,4.1-16.7,6.2-26.5,6.2c-10.7,0-20.1-2.3-28.1-6.8\n c-8-4.6-14.3-11-18.8-19.5c-4.5-8.4-6.7-18.3-6.7-29.6c0-11.4,2.2-21.3,6.7-29.6c4.5-8.3,10.8-14.7,18.9-19.2\n c8.1-4.5,17.4-6.7,28-6.7c11,0,20.3,2,27.8,6c7.5,4,12.9,9.3,16,15.8h1l0.8-20.2h22.4v141.9H546V151.9z M528.6,151.9\n c5.6-3.1,10-7.3,12.9-12.4c3-5.2,4.5-10.7,4.5-16.7v-7.9c0-6-1.5-11.4-4.5-16.4c-3-5-7.3-8.9-12.9-11.9c-5.6-3-12.5-4.5-20.5-4.5\n c-10.7,0-19.5,3.2-26.2,9.7c-6.7,6.5-10.1,15.6-10.1,27.4c0,11.6,3.3,20.7,10,27.4c6.7,6.7,15.4,10.1,26.3,10.1\n C516.1,156.6,522.9,155,528.6,151.9z\" />\n <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"780.8157\" y1=\"119.2805\" x2=\"690.0867\" y2=\"119.2805\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n class=\"st1\"\n d=\"M803.4,65.3l-0.8,20.2h-1c-3.3-6.5-8.6-11.8-16.1-15.8c-7.5-4-16.7-6-27.7-6c-10.6,0-19.9,2.2-28,6.7\n c-8.1,4.5-14.4,10.9-18.9,19.2c-4.5,8.3-6.7,18.2-6.7,29.8c0,11.3,2.2,21.1,6.7,29.5s10.7,14.8,18.8,19.4c8,4.6,17.4,6.8,28.1,6.8\n c9.9,0,18.8-2.1,26.6-6.2c7.8-4.1,14.4-12.2,17.8-19.3h23.6V65.3H803.4z M802.2,122.7c0,6-1.5,11.6-4.5,16.7\n c-3,5.2-7.3,9.3-12.9,12.4c-5.6,3.1-12.5,4.7-20.5,4.7c-10.9,0-19.6-3.3-26.3-10c-6.7-6.7-10-15.8-10-27.3c0-12,3.4-21.2,10.1-27.6\n c6.7-6.5,15.5-9.7,26.2-9.7c8,0,14.8,1.5,20.5,4.5c5.6,3,10,7,12.9,11.9c3,5,4.5,10.4,4.5,16.2V122.7z\" />\n <linearGradient\n id=\"SVGID_00000152963432808947599350000011020247854886079881_\"\n gradientUnits=\"userSpaceOnUse\"\n x1=\"780.8157\"\n y1=\"161.271\"\n x2=\"690.0867\"\n y2=\"161.271\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n style=\"fill: url(#SVGID_00000152963432808947599350000011020247854886079881_)\"\n d=\"M843.9,161.3c0,6.5-5.3,11.8-11.8,11.8l0,0\n c-6.5,0-11.8-5.3-11.8-11.8v0c0-6.5,5.3-11.8,11.8-11.8l0,0C838.6,149.4,843.9,154.7,843.9,161.3\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n <g>\n <polygon class=\"st0\" points=\"159.2,149.4 159.2,173.1 182.8,173.1 182.8,149.4 182.8,65.3 159.2,65.3 \t\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n </g>\n <path\n class=\"st0\"\n d=\"M302.7,84.2c-4-7.3-9.5-12.6-16.5-15.8c-7-3.2-15.1-4.8-24.4-4.8c-9.2,0-17.8,2.1-25.8,6.2\n c-7.9,4.1-13.9,10-17.8,17.6h-1.4l-0.6-22.2h-23v107.8h23.6v-53.4c0-7.5,1.6-14,4.7-19.7c3.1-5.6,7.5-10.1,13.1-13.2\n c5.6-3.2,12.2-4.8,19.7-4.8c10.6,0,18.4,3,23.3,8.9c5,5.9,7.4,15,7.4,27.2v55h23.6V114C308.7,101.5,306.7,91.6,302.7,84.2z\" />\n <path\n class=\"st0\"\n d=\"M671.7,65.3v53.4c0,7.5-1.6,14.1-4.7,19.8c-3.1,5.7-7.5,10.2-13.1,13.4c-5.6,3.2-12.2,4.8-19.7,4.8\n c-10.7,0-18.6-3-23.5-9.1c-5-6-7.4-15-7.4-27V65.3h-23.4v59.5c0,12.2,2,22,5.9,29.4c3.9,7.3,9.4,12.6,16.5,15.9\n c7.1,3.3,15.2,4.9,24.5,4.9c9.6,0,18.4-2.1,26.2-6.3c7.6-4.1,15-11.3,18.9-18.6v23.1h23.4v-23.6v-5.2v-79H671.7z\" />\n </svg>\n </ng-content>\n </a>\n @if (authenticated()) {\n <h3 class=\"whitespace-nowrap text-2xl font-semibold tracking-tight\">{{ 'login.welcomeBack' | transloco : { name: user()?.fullName ?? '' } }}</h3>\n <p class=\"text-muted-foreground text-sm\">{{ 'login.youAreLoggedIn' | transloco }}</p>\n }\n </CardHeader>\n\n @if (!authenticated()) {\n <CardContent>\n <div class=\"grid gap-4\">\n @if (!config.autoOAuthProvider && !config.autoSAMLProvider) {\n <div class=\"grid gap-2\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"username\"\n >{{ 'login.username' | transloco }}</label\n >\n\n <input\n type=\"text\"\n id=\"username\"\n required\n [ngModel]=\"credentials().username\"\n (ngModelChange)=\"updateCredentials({ username: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <div class=\"grid gap-2\">\n <div class=\"flex items-center\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"password\"\n >{{ 'login.password' | transloco }}</label\n >\n </div>\n <input\n type=\"password\"\n id=\"password\"\n required\n [ngModel]=\"credentials().password\"\n (ngModelChange)=\"updateCredentials({ password: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <button [disabled]=\"!valid()\" (click)=\"handleLoginWithCredentials()\">{{ 'login.connect' | transloco }}</button>\n } @else {\n <button (click)=\"handleLogin()\">{{ 'login.SignInWith' | transloco: { provider: config.autoOAuthProvider ? 'OAuth' : 'SAML' } }}</button>\n }\n </div>\n </CardContent>\n } @else {\n <CardFooter class=\"justify-between gap-2\">\n <button class=\"w-full\" (click)=\"handleLogout()\" type=\"submit\">{{ 'login.disconnect' | transloco }}</button>\n <button class=\"w-full\" variant=\"ghost\" (click)=\"handleBack()\">{{ 'login.back' | transloco }}</button>\n </CardFooter>\n }\n</Card>\n","import { inject, Injectable, signal } from '@angular/core';\n\nimport { CCWebService, fetchLabels, labels, Query } from '@sinequa/atomic';\nimport { from, map, Observable, of, switchMap } from 'rxjs';\nimport { AppStore } from '../../stores/app.store';\n\ntype LabelsWebService = CCWebService &\n 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.error('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()).pipe(\n map((canHandle: boolean) => {\n if (!canHandle) return undefined;\n\n const {\n allowPublicLabelsCreation,\n allowPublicLabelsModification,\n privateLabelsField,\n publicLabelsField,\n defaultPublicLabels,\n labelsAutoSuggestMaxCount,\n labelsAutoSuggestWildcard\n } = 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()).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()).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()).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()).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()).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()).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 { NgStyle } from '@angular/common';\nimport { afterEveryRender, Component, computed, effect, ElementRef, input, model, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { Article as A, fetchLabels, guid, labels } from '@sinequa/atomic';\nimport { BadgeComponent, InputComponent, ListItemComponent } from '@sinequa/ui';\n\nimport { debouncedSignal } from '../../utils';\n\nconst DEBOUNCE_DELAY = 300;\ntype Article = A & {\n [key: string]: any;\n};\n\n@Component({\n selector: 'multiselect-labels, multiselectlabels, MultiSelectLabels',\n standalone: true,\n imports: [FormsModule, NgStyle, TranslocoPipe, InputComponent, BadgeComponent, ListItemComponent],\n template: `\n <div class=\"anchor\" [ngStyle]=\"{ 'anchor-name': anchor() }\">\n <label [htmlFor]=\"id()\" class=\"font-semibold\">{{ (isPublic() ? 'labels.publicLabels' : 'labels.privateLabels') | transloco }}</label>\n <input\n [id]=\"id()\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.aria-label]=\"'labels.startTyping' | transloco\"\n [attr.placeholder]=\"'labels.startTyping' | transloco\"\n [(ngModel)]=\"labelInput\"\n (keyup)=\"onKeyDown($event)\"\n (click)=\"onInputClick()\" />\n\n <ul\n popover\n class=\"popover mt-2 max-h-40 overflow-auto rounded-md border border-gray-300 bg-white p-1 shadow\"\n aria-labelledby=\"dropdownDefaultButton\"\n role=\"listbox\"\n #LabelsPopover>\n @for (label of suggestedLabels(); track $index) {\n <li role=\"option\" tabindex=\"0\" aria-keyshortcuts=\"enter\" [attr.aria-label]=\"label\" (keypress.enter)=\"itemClicked(label)\" (click)=\"itemClicked(label)\">\n <span>{{ label }}</span>\n </li>\n }\n </ul>\n </div>\n <div class=\"my-2 flex flex-wrap gap-1\">\n @for (label of labels(); track $index) {\n <Badge>\n {{ label }}\n @if (allowModification()) {\n <i class=\"fa-fw far fa-circle-xmark ms-1 cursor-pointer\" (click)=\"removeLabel(label, isPublic())\"></i>\n }\n </Badge>\n }\n </div>\n `,\n styles: `\n .anchor {\n &:has(.popover:popover-open) {\n z-index: var(--z-menu, 1000);\n border-radius: var(--radius) var(--radius) 0 0;\n }\n\n .popover::backdrop {\n background-color: transparent;\n backdrop-filter: none;\n }\n }\n\n .popover {\n /* Select Firefox */\n @supports (-moz-appearance: none) {\n margin: calc(33.3333333333vh + 30px) 25vw;\n width: 50vw;\n }\n\n /* Select Safari */\n @supports (background: -webkit-named-image(i)) {\n margin: calc(33.3333333333vh + 30px) 25vw;\n width: 50vw;\n }\n\n width: anchor-size(width);\n top: anchor(bottom);\n left: anchor(left);\n }\n `\n})\nexport class MultiSelectLabelsComponent {\n article = model<Article>();\n isPublic = input(false);\n allowModification = input(false);\n labelsField = input<string | undefined>();\n\n protected anchor = signal<string>(`--${guid()}`);\n protected suggestedLabels = signal<string[]>([]);\n\n protected labelInput = model<string>('');\n protected debouncedLabelInput = debouncedSignal(this.labelInput, DEBOUNCE_DELAY);\n\n protected popover = viewChild<ElementRef>('LabelsPopover');\n protected popoverElement = computed(() => this.popover()?.nativeElement);\n\n protected labels = signal<string[]>([]);\n\n protected id = signal(`labels-form-${guid()}`);\n\n constructor() {\n afterEveryRender(() => {\n this.popoverElement().style.positionAnchor = this.anchor();\n });\n\n effect(() => {\n if (!this.article()) return;\n if (!this.labelsField()) return;\n this.labels.set(this.article()![this.labelsField()!] || []);\n });\n\n effect(() => {\n this.fetchLabels(this.debouncedLabelInput(), this.isPublic());\n });\n }\n\n itemClicked(label: string) {\n this.addLabel(label, this.isPublic());\n }\n\n onInputClick() {\n if (this.suggestedLabels().length === 0) return;\n this.popoverElement().showPopover();\n }\n\n onKeyDown(event: KeyboardEvent) {\n event.stopImmediatePropagation();\n\n if (this.labelInput().length === 0) return;\n\n if (event.key === 'Enter') {\n this.addLabel(this.labelInput(), this.isPublic());\n this.labelInput.set('');\n }\n }\n\n async fetchLabels(text: string, isPublic: boolean) {\n const labels = await fetchLabels(text, isPublic);\n const unappliedLabels = labels.filter(label => !this.labels().some(l => l === label));\n this.suggestedLabels.set(unappliedLabels);\n unappliedLabels.length ? this.popoverElement().showPopover() : this.popoverElement().hidePopover();\n }\n\n /**\n * Adds a new label to the current list of labels and updates the associated article.\n *\n * This method performs the following steps:\n * 1. Updates the local labels state by appending the new label.\n * 2. Persists the new label to the backend, associating it with the current article.\n * 3. Refreshes the article's label data.\n * 4. Clears the label input field and resets the suggested labels.\n *\n * @param label - The label to be added.\n * @param isPublic - A boolean indicating whether the label is public or private.\n * @returns A promise that resolves once the label has been added and the article updated.\n */\n async addLabel(label: string, isPublic: boolean) {\n const currentLabels = this.labels();\n this.labels.set([...currentLabels, label]);\n\n await labels.add([label], [this.article()!.id], isPublic);\n this.updateArticleWithLabels();\n\n this.labelInput.set('');\n this.suggestedLabels.set([]);\n }\n\n /**\n * Removes a label from the current list of labels and updates the associated article.\n *\n * @param label - The label to be removed.\n * @param isPublic - A boolean indicating whether the label is public.\n * @returns A promise that resolves once the label is removed and the article is updated.\n */\n async removeLabel(label: string, isPublic: boolean) {\n this.labels.set(this.labels().filter(l => l !== label));\n await labels.remove([label], [this.article()!.id], isPublic);\n this.updateArticleWithLabels();\n }\n\n /**\n * Updates the article object by assigning the current labels to the specified labels field.\n *\n * This method retrieves the article object and the labels field dynamically,\n * then assigns the current labels to the corresponding field in the article.\n *\n * @remarks\n * Ensure that `this.article`, `this.labelsField`, and `this.labels` return valid values\n * before invoking this method to avoid runtime errors.\n *\n * @throws {TypeError} If `this.article` or `this.labelsField` returns `undefined`.\n */\n updateArticleWithLabels() {\n this.article()![this.labelsField()!] = this.labels();\n }\n}\n","import { Component, DestroyRef, inject, model, output, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { Article } from '@sinequa/atomic';\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogEvent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent\n} from '@sinequa/ui';\n\nimport { LabelsConfig, LabelService } from '../label.service';\nimport { MultiSelectLabelsComponent } from '../multiselect-labels';\n\n@Component({\n selector: 'labels-edit-dialog, labelseditdialog, LabelsEditDialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogFooterComponent,\n DialogTitleComponent,\n DialogContentComponent,\n MultiSelectLabelsComponent\n ],\n providers: [provideTranslocoScope('labels')],\n template: `\n <dialog #dialog (closed)=\"close($event)\">\n <DialogHeader>\n <DialogTitle>{{ 'labels.title' | transloco }}</DialogTitle>\n <p class=\"text-muted-foreground\">\n <i class=\"fa-fw fas fa-circle-info\"></i><span class=\"ps-1\">{{ 'labels.info' | transloco }}</span>\n </p>\n </DialogHeader>\n\n <DialogContent>\n @if (!!labelsConfig()?.publicLabelsField && labelsConfig()!.allowPublicLabelsCreation) {\n <multiselect-labels\n [(article)]=\"article\"\n [labelsField]=\"labelsConfig()?.publicLabelsField\"\n [allowModification]=\"labelsConfig()?.allowPublicLabelsModification || false\"\n [isPublic]=\"true\" />\n }\n @if (!!labelsConfig()?.privateLabelsField) {\n <multiselect-labels [(article)]=\"article\" [labelsField]=\"labelsConfig()?.privateLabelsField\" [allowModification]=\"true\" [isPublic]=\"false\" />\n }\n </DialogContent>\n\n <DialogFooter>\n <button (click)=\"dialog.close($event)\">\n {{ 'labels.close' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class LabelsEditDialog implements DialogInterface {\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n labelService = inject(LabelService);\n\n closed = output<{ type: DialogEvent; article: Article }>();\n\n public readonly article = model<Article>({} as Article);\n public readonly labelsConfig = signal<LabelsConfig | undefined>(undefined);\n\n constructor(private destroyRef: DestroyRef) {\n this.labelService\n .getLabelsConfig()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(config => this.labelsConfig.set(config));\n }\n\n open(article: Article): void {\n this.article.set(article);\n this.dialog()!.showModal();\n }\n\n close(event: DialogEvent): void {\n this.closed.emit({ type: event, article: this.article() });\n }\n}\n","import { Component, inject, model, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { CCApp, notify } from '@sinequa/atomic';\n\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogInterface\n} from '@sinequa/ui';\nimport { AuditService } from '../../../services';\nimport { AppStore } from '../../../stores';\n\nexport const AuditFeedbackType = 'UserFeedback_UserFeedback';\n\n@Component({\n selector: 'feedback-dialog, feedbackdialog, FeedbackDialog',\n standalone: true,\n imports: [\n TranslocoPipe,\n FormsModule,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogFooterComponent,\n DialogTitleComponent,\n DialogContentComponent\n ],\n providers: [provideTranslocoScope('feedback')],\n template: `\n <dialog #dialog>\n <DialogHeader>\n <DialogTitle>{{ 'feedback.dialogTitle' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent>\n @if (type()) {\n <p>{{ 'feedback.' + type() + '.description' | transloco }}</p>\n <textarea\n class=\"hover:outline-primary focus:outline-primary mt-2 w-full rounded-md border bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [(ngModel)]=\"comment\"></textarea>\n }\n </DialogContent>\n\n <DialogFooter>\n <button variant=\"outline\" (click)=\"dialog.close($event)\">\n {{ 'cancel' | transloco }}\n </button>\n <button [disabled]=\"!comment()\" (click)=\"submit($event)\">\n {{ 'confirm' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class FeedbackDialogComponent implements DialogInterface {\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n readonly auditService = inject(AuditService);\n readonly appStore = inject(AppStore);\n private readonly transloco = inject(TranslocoService);\n\n comment = model<string>('');\n type = signal<string | undefined>(undefined);\n\n open(type: string) {\n this.type.set(type);\n this.dialog()!.showModal();\n }\n\n submit(e: Event): void {\n const { name } = getState(this.appStore) as CCApp;\n\n this.auditService.notify({\n type: AuditFeedbackType,\n detail: {\n app: name,\n message: this.type(),\n detail: this.comment()\n }\n });\n\n this.comment.set('');\n this.dialog()!.close(e);\n notify.success(this.transloco.translate('feedback.feedbackSuccess'), { duration: 2000 });\n }\n}\n","import { Component, inject, input, output, signal, viewChild } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { notify, Result } from '@sinequa/atomic';\n\nimport { ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent } from '@sinequa/ui';\n\nimport { AuditService } from '../../services';\nimport { QueryParamsStore } from '../../stores';\nimport { FeedbackDialogComponent } from './dialogs/feedback.dialog';\n\ninterface FeedbackMenu {\n type: string;\n icon: string;\n}\n\n@Component({\n selector: 'feedback, Feedback',\n standalone: true,\n imports: [ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, TranslocoPipe, FeedbackDialogComponent],\n providers: [provideTranslocoScope('feedback')],\n templateUrl: './feedback.html'\n})\nexport class SearchFeedbackComponent {\n onClose = output<void>();\n\n readonly feedbackDialog = viewChild(FeedbackDialogComponent);\n\n pages = input.required<any>();\n\n readonly auditService = inject(AuditService);\n protected readonly queryParamsStore = inject(QueryParamsStore);\n private readonly transloco = inject(TranslocoService);\n\n liked = signal<boolean>(false);\n disliked = signal<boolean>(false);\n\n menus: FeedbackMenu[] = [\n { type: 'content', icon: 'far fa-file-alt' },\n { type: 'ui', icon: 'fas fa-desktop' },\n { type: 'lang', icon: 'far fa-comments' },\n { type: 'other', icon: 'far fa-lightbulb' }\n ];\n\n close(event: Event): void {\n event.stopPropagation();\n this.onClose.emit();\n }\n\n like(): void {\n if (this.liked()) return;\n\n const state = getState(this.queryParamsStore);\n const articles: string[] = [];\n if (this.pages() && this.pages().length) {\n this.pages().forEach((page: Result) => {\n articles.push(...page.records.map(r => r.id));\n });\n }\n const detail = { query: state, records: articles };\n this.auditService.notify({\n type: 'Search_Like',\n detail\n });\n this.liked.set(true);\n notify.success(this.transloco.translate('feedback.feedbackSuccess'), { duration: 2000 });\n }\n\n dislike(): void {\n if (this.disliked()) return;\n\n const state = getState(this.queryParamsStore);\n const articles: string[] = [];\n if (this.pages() && this.pages().length) {\n this.pages().forEach((page: Result) => {\n articles.push(...page.records.map(r => r.id));\n });\n }\n const detail = { query: state, records: articles };\n this.auditService.notify({\n type: 'Search_Disike',\n detail\n });\n this.disliked.set(true);\n notify.success(this.transloco.translate('feedback.feedbackSuccess'), { duration: 2000 });\n }\n\n openFeedbackDialog(type: string): void {\n this.feedbackDialog()?.open(type);\n }\n}\n","<menu>\n <button class=\"border border-gray-200 p-5\" variant=\"ghost\" title=\"{{'feedback.button' | transloco }}\">\n <i class=\"fa-fw far fa-commenting\" aria-hidden=\"true\"></i>\n {{ 'feedback.label' | transloco }}\n <i class=\"fa-fw fas fa-xmark ms-2\" (click)=\"close($event);\" aria-hidden=\"true\"></i>\n </button>\n\n <MenuContent>\n @if (!disliked()) {\n <menuitem (click)=\"like()\" [attr.aria-label]=\"'feedback.like' | transloco\">\n @if (liked()) {\n <i class=\"fa-fw fas fa-thumbs-up\"></i> {{ 'feedback.liked' | transloco }} } @else { <i class=\"fa-fw far fa-thumbs-up\"></i> {{ 'feedback.like' | transloco\n }} }\n </menuitem>\n } @if (!liked()) {\n <menuitem (click)=\"dislike()\" [attr.aria-label]=\"'feedback.dislike' | transloco\">\n @if (disliked()) {\n <i class=\"fa-fw fas fa-thumbs-down\"></i> {{ 'feedback.disliked' | transloco }} } @else { <i class=\"fa-fw far fa-thumbs-down\"></i> {{ 'feedback.dislike' |\n transloco }} }\n </menuitem>\n } @for (menu of menus; track $index) {\n <menuitem (click)=\"openFeedbackDialog(menu.type)\" [attr.aria-label]=\"'feedback.' + menu.type + '.title' | transloco\">\n <i class=\"fa-fw {{menu.icon}}\"></i> {{ 'feedback.' + menu.type + '.title' | transloco }}\n </menuitem>\n }\n </MenuContent>\n</menu>\n\n<feedback-dialog />\n","import { Component, computed, EventEmitter, HostBinding, inject, input, Output } from '@angular/core';\n\nimport { ChevronRightIconComponent, cn, ListItemComponent } from '@sinequa/ui';\n\nimport { AggregationComponent } from './aggregation.component';\nimport { HighlightWordPipe, SyslangPipe } from '../../../pipes';\nimport { AggregationListItem } from '../../../models';\n\n@Component({\n selector: 'aggregation-item, AggregationItem, aggregationitem',\n standalone: true,\n imports: [HighlightWordPipe, ListItemComponent, SyslangPipe, ChevronRightIconComponent],\n templateUrl: './aggregation-item.component.html',\n styles: `\n :host {\n display: block;\n user-select: none;\n }\n :host a {\n padding-left: calc((var(--agg-tree-indent, 0.5rem) * var(--level)));\n }\n a {\n line-height: var(--agg-item-height, inherit);\n }\n `\n})\nexport class AggregationItemComponent {\n cn = cn;\n @HostBinding('attr.disabled') get disabled() {\n return this.node().count === 0 ? 'disabled' : null;\n }\n\n @Output() onSelect = new EventEmitter<AggregationListItem>();\n @Output() onOpen = new EventEmitter<AggregationListItem>();\n\n node = input.required<AggregationListItem>();\n\n searchText = inject(AggregationComponent).searchText;\n\n name = computed(() => {\n const value = this.node().display || this.node().value;\n return typeof value === 'string' ? value : `${value}`;\n });\n\n level = computed(() => {\n const level = (this.node().$level ?? 0) - 1 + (!this.node().hasChildren ? 1 : 0);\n if (this.node().hasChildren === false) {\n return level + 1;\n }\n return level;\n });\n\n select(e: Event, item: AggregationListItem) {\n e.stopImmediatePropagation();\n item.$selected = !item.$selected;\n\n this.onSelect.emit(item);\n }\n\n open(e: Event, node: AggregationListItem) {\n // fetch aggregation items\n e.preventDefault();\n e.stopImmediatePropagation();\n\n if (node.items && node.$opened === true) {\n node.$opened = false;\n return;\n }\n if (node.items && !node.$opened) {\n node.$opened = true;\n return;\n }\n\n this.onOpen.emit(node);\n }\n}\n","<a\n role=\"listitem\"\n [attr.aria-selected]=\"node().$selected\"\n [attr.aria-label]=\"name() | syslang\"\n [style.--level]=\"level()\"\n [class]=\"\n cn(\n 'flex grow items-center gap-2 p-1 leading-7',\n node().count === 0 && 'disabled pointer-events-none text-neutral-300',\n node().$selected && 'bg-primary-100 text-primary'\n )\n \"\n (click)=\"select($event, node())\">\n <!-- chrevron is visible only if the node has children -->\n <button (click)=\"open($event, node())\" class=\"transition-transform ease-in hover:scale-125\" aria-label=\"Open\">\n <ChevronRight [class]=\"cn('size-4 translate-x-1', node().$opened && 'rotate-90', !node().hasChildren && 'hidden')\" width=\"16\" height=\"16\" />\n </button>\n\n <input\n type=\"checkbox\"\n role=\"checkbox\"\n value=\"{{ node().value }}\"\n [attr.disabled]=\"node().count === 0 ? true : null\"\n [attr.aria-disabled]=\"node().count === 0\"\n (keydown.enter)=\"select($event, node())\"\n [checked]=\"node().$selected\" />\n\n @if (node().icon) {\n <i class=\"fa-fw {{ node().icon }} self-center justify-self-center\" aria-hidden=\"true\"></i>\n }\n <p class=\"line-clamp-1 text-ellipsis break-all\" [title]=\"name() | syslang\">\n @for (chunk of (name() | syslang) ?? '' | highlightWord: searchText() : 10; track $index) {\n <span [class]=\"{ 'font-bold': chunk.match }\" aria-hidden=\"true\">{{ chunk.text }}</span>\n }\n </p>\n</a>\n\n@if (node().hasChildren && node().$opened) {\n @for (item of node().items; track $index) {\n <AggregationItem [node]=\"item\" (onOpen)=\"onOpen.emit($event)\" (onSelect)=\"onSelect.emit($event)\" />\n }\n}\n","import { Component, computed, effect, ElementRef, inject, input, model, output, signal } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\nimport { firstValueFrom } from 'rxjs';\n\nimport {\n Aggregation,\n fetchSuggestField,\n LegacyFilter,\n Query,\n Suggestion,\n suggestionsToTreeAggregationNodes,\n TreeAggregation,\n TreeAggregationNode\n} from '@sinequa/atomic';\nimport { BadgeComponent, ButtonComponent, InputComponent } from '@sinequa/ui';\n\nimport { AggregationListItem } from '../../../models';\nimport { SyslangPipe } from '../../../pipes';\nimport { AggregationsService } from '../../../services';\nimport { AggregationsStore, QueryParamsStore } from '../../../stores';\nimport { buildQuery, debouncedSignal } from '../../../utils';\nimport { AggregationItemComponent } from './aggregation-item.component';\n\nexport type AggregationTitle = {\n label: string;\n icon?: string;\n};\n\n@Component({\n selector: 'Aggregation, aggregation',\n imports: [FormsModule, ReactiveFormsModule, ButtonComponent, InputComponent, AggregationItemComponent, SyslangPipe, TranslocoPipe, BadgeComponent],\n standalone: true,\n templateUrl: './aggregation.component.html',\n styles: [\n `\n :host {\n display: block;\n }\n\n fieldset {\n height: 100%;\n max-height: inherit;\n scrollbar-width: thin;\n }\n\n ul[role='list'] {\n scrollbar-width: inherit;\n max-height: calc(100vh - var(--header-height, 0px) - var(--agg-header-height, 0px));\n }\n\n AggregationItem:has(+ AggregationItem) {\n margin-bottom: var(--agg-item-gap, inherit);\n }\n `\n ],\n host: {\n class: 'd-flex flex-column h-100',\n '[style.--header-height]': '`${this.computeHeight()}rem`'\n }\n})\nexport class AggregationComponent {\n /* stores */\n aggregationsStore = inject(AggregationsStore);\n queryParamsStore = inject(QueryParamsStore);\n\n /* services */\n aggregationsService = inject(AggregationsService);\n\n el = inject(ElementRef);\n\n name = input.required<string | null>();\n column = input.required<string | null>();\n\n onSelect = output<boolean>();\n\n /**\n * A boolean flag indicating whether the component should operate in headless mode.\n * When set to `true`, the component will function without rendering any UI elements.\n *\n * @default false\n */\n headless = input(false);\n\n /**\n * A boolean flag indicating whether the component is searchable.\n * This property is initialized to `undefined` by default.\n * \"Undefined\" and not \"false\" because this input overrides the custom json settings\n */\n searchable = input<boolean | undefined>(undefined);\n selection = signal(false);\n\n /**\n * A boolean flag indicating whether we want to see the filters count when some is applied\n * This property is initialized to `false` by default.\n */\n showCount = input(false);\n\n /* aggregation */\n aggregation = computed(() => {\n // when the aggegation store updates, we need to check if the aggregation is still valid\n getState(this.aggregationsStore);\n const name = this.name();\n const column = this.column();\n\n if (name !== null) {\n const agg = this.aggregationsService.processAggregation(name, column);\n if (agg) {\n // overrides \"searchable\" properties with the input if any\n agg.searchable = this.searchable() ?? agg.searchable;\n return agg;\n }\n }\n return null;\n });\n\n /* items of the aggretions */\n items = computed(() => {\n // when the aggegation store updates, we need to check if the aggregation is still valid\n getState(this.aggregationsStore);\n const agg = this.aggregation();\n const searchedItems = this.searchedItems();\n\n if (searchedItems.length > 0) {\n return searchedItems as AggregationListItem[];\n }\n if (agg !== null && agg?.items) {\n const currentFilters = this.addCurrentFiltersToItems() as AggregationListItem[];\n return currentFilters;\n }\n return [];\n });\n\n /**\n * A computed property that determines whether there are active filters\n * for the current aggregation column.\n *\n * if True, the clear button is shown.\n *\n * @returns {boolean} `true` if the filter count for the aggregation column is greater than 0, otherwise `false`.\n */\n hasFilters = computed(() => {\n const { count = 0 } = this.queryParamsStore.getFilter({ field: this.aggregation()?.column, name: this.aggregation()?.name }) || {};\n return count > 0;\n });\n\n /**\n * A computed property that returns the number of items of this aggregation applied in the active filters\n *\n * if more than 0 and the showCount input is set as True, the count number is shown.\n *\n * @returns {number} the filters count.\n */\n filtersCount = computed(() => {\n const { count = 0 } = this.queryParamsStore.getFilter({ field: this.aggregation()?.column, name: this.aggregation()?.name }) || {};\n return count;\n });\n\n /*\n * A computed property that returns the height of the component based on its state.\n *\n * @returns {number} the height of the component in rem.\n */\n computeHeight = computed(() => (this.headless() ? 0 : 2) + (this.aggregation()?.searchable ? 2 : 0));\n\n /* search feature */\n searchText = model<string>('');\n debouncedSearchText = debouncedSignal(this.searchText, 300);\n normalizedSearchText = computed(() =>\n this.debouncedSearchText()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n );\n\n /* suggestions */\n readonly suggests = signal<Suggestion[]>([]);\n /* searched items */\n readonly searchedItems = computed(() => {\n if (!this.suggests()) return [];\n\n // if the aggregation is a tree, we transform the suggestions into tree nodes\n if (this.aggregation()?.isTree) {\n return suggestionsToTreeAggregationNodes(this.suggests()!, this.normalizedSearchText());\n }\n\n // if the aggregation is not a tree, we return the suggestions as is\n return this.suggests()!.map(suggest => ({\n name: suggest.category,\n value: suggest.normalized || suggest.display || '',\n display: suggest.display,\n column: suggest.id,\n count: 1,\n $selected: false,\n items: []\n }));\n });\n\n query: Query;\n\n constructor() {\n this.query = buildQuery();\n\n effect(async () => {\n if (this.debouncedSearchText() === '' || this.aggregation() === null) {\n this.suggests.set([]);\n return;\n }\n\n try {\n const suggests = await fetchSuggestField(this.normalizedSearchText(), [this.aggregation()!.column]);\n this.suggests.set(suggests);\n } catch (e: any) {\n console.error('fetch suggest field', e);\n }\n });\n }\n\n /**\n * Clears the current filter for the aggregation column.\n *\n * This method updates the filter in the `queryParamsStore` by setting the display value\n * of the current aggregation column to an empty string.\n */\n clear() {\n const agg = this.aggregation();\n if (agg) {\n this.queryParamsStore.removeFilterByName(agg.name, agg.column);\n\n this.items().forEach(item => {\n item.$selected = false;\n });\n }\n }\n\n /**\n * Applies the current filters to the query parameters store.\n *\n * - If there are multiple filters, they are wrapped in an \"or\" filter.\n * - If the aggregation is not a distribution, the filters are merged into a single filter with an \"in\" operator.\n * - If there is only one filter, it is directly applied.\n * - If there are no filters, the current filters are cleared.\n *\n * After applying the filters, the search text is reset.\n */\n apply() {\n const filters = this.getFilters();\n\n const { name, column: field } = this.aggregation() as Aggregation;\n\n // if filters length > 1, we need to wrap them in an \"or\" filter\n if (filters.length > 1) {\n const display = filters[0].display;\n // if aggregation not a distribution, we need to merge the filters into a single filter with an in operator\n // with the values of the filters\n if (this.aggregation()?.isDistribution) {\n this.queryParamsStore.updateFilter({\n operator: 'or',\n filters,\n name,\n field,\n display\n } as LegacyFilter);\n } else {\n const values = filters.map(filter => filter.value);\n this.queryParamsStore.updateFilter({\n operator: 'in',\n name,\n field,\n values,\n display,\n filters\n } as LegacyFilter);\n }\n } else if (filters.length === 1) {\n this.queryParamsStore.updateFilter(filters[0]);\n } else {\n this.clear();\n }\n\n this.searchText.set('');\n this.selection.set(false);\n }\n\n loadMore(): void {\n const q = this.queryParamsStore.getQuery();\n this.aggregationsService.loadMore(q, this.aggregation() as Aggregation).subscribe(aggregation => {\n this.aggregationsStore.updateAggregation(aggregation);\n });\n }\n\n async open(node: AggregationListItem) {\n const q = this.queryParamsStore.getQuery();\n const agg = await firstValueFrom(this.aggregationsService.open(q, this.aggregation() as TreeAggregation, node as TreeAggregationNode));\n\n node.$opened = true;\n this.aggregationsStore.updateAggregation(agg);\n }\n\n /**\n * Updates the selected state of the given item in the aggregation list.\n *\n * @param item - The item to be selected or deselected.\n *\n * This method iterates through the items in the aggregation list and updates\n * the `$selected` property of the item that matches the value of the given item.\n *\n * If the item is selected, the selection count is incremented by 1.\n * If the item is deselected, the selection count is decremented by 1.\n */\n select() {\n this.onSelect.emit(true);\n this.selection.set(true);\n }\n\n /**\n * Retrieves the appropriate filters based on the aggregation type.\n *\n * If the aggregation is a tree structure, it returns filters specific to trees.\n * Otherwise, it returns filters for a list structure.\n *\n * @returns Filters for either a tree or list aggregation.\n */\n protected getFilters() {\n if (this.aggregation()?.isTree) {\n return this.getFiltersForTree();\n }\n return this.getFiltersForList();\n }\n\n /**\n * Retrieves the filters for the tree structure.\n *\n * This method collects the selected items from the tree, constructs their paths,\n * and creates a filter object based on these paths. If no items are selected,\n * it returns an empty array.\n *\n * @returns {LegacyFilter[]} An array of filters for the tree structure.\n */\n protected getFiltersForTree(): LegacyFilter[] {\n const { name, column: field } = this.aggregation() || {};\n\n if (!name || !field) {\n return [];\n }\n\n const items = this.getFlattenTreeItems()\n .filter(item => item.$selected)\n .map(item => `/${item.$path}/*` || '');\n\n const notSelectedItems = this.getFlattenTreeItems()\n .filter(item => !item.$selected)\n .map(item => `/${item.$path}/*` || '');\n\n // add the current filters to the current items\n const currentFilters = this.queryParamsStore.getFilter({ field, name })?.values || [];\n // if there are current filters, we need to add them to the current items\n if (currentFilters) {\n // remove filters that are not selected\n const filteredCurrentFilters = currentFilters.filter(filter => !notSelectedItems.includes(filter));\n // if the current filters are not selected, we need to add them to the items\n if (filteredCurrentFilters.length > 0) {\n // if the current filters are not selected, we need to add them to the items\n items.push(...filteredCurrentFilters);\n }\n }\n // remove duplicates\n const uniqueItems = Array.from(new Set(items));\n // if no items are selected, return an empty array\n if (uniqueItems.length === 0) return [];\n\n const filter = { operator: 'in', name, field, values: uniqueItems, display: uniqueItems[0] };\n return [filter] as LegacyFilter[];\n }\n\n /**\n * Retrieves a list of filters based on the selected items.\n *\n * This method filters the items to include only those that are selected,\n * and then maps each selected item to a filter using the `toFilter` method.\n *\n * @returns {LegacyFilter[]} An array of filters corresponding to the selected items.\n */\n protected getFiltersForList(): LegacyFilter[] {\n const items = this.addCurrentFiltersToItems().filter(item => item.$selected); // this.items().filter(item => item.$selected) || [];\n const searchedItems = this.searchedItems().filter(item => item.$selected);\n const currentItems = [...items, ...searchedItems];\n\n const { column, name, isDistribution = false } = this.aggregation() as Aggregation;\n const selectedItems = currentItems.map(item => this.aggregationsService.toFilter(item, column, name, isDistribution));\n return selectedItems;\n }\n\n /**\n * Recursively flattens a tree structure of `TreeAggregationNode` items into a single array.\n *\n * @returns {TreeAggregationNode[]} An array containing all nodes from the tree structure, flattened.\n */\n private getFlattenTreeItems(): TreeAggregationNode[] {\n const flattenItems = (items: TreeAggregationNode[]): TreeAggregationNode[] => {\n return items.reduce((flat, item) => {\n return flat.concat(item, item.items ? flattenItems(item.items) : []);\n }, [] as TreeAggregationNode[]);\n };\n\n const searchItems = flattenItems(this.searchedItems() || []);\n const items = flattenItems((this.aggregation()?.items as TreeAggregationNode[]) || []);\n const flattenedTreeItems = [...searchItems, ...items];\n return flattenedTreeItems;\n }\n\n private addCurrentFiltersToItems() {\n const currentItems = (this.aggregation()?.items as AggregationListItem[]) || [];\n\n // add the current filters to the current items only if they are not already present\n if (!this.aggregation()?.isTree && (!this.aggregation()?.isDistribution || this.aggregation()?.isDistribution === false)) {\n // get the current filters for the current aggregation\n const currentFilters = this.queryParamsStore.getFilter({ field: this.aggregation()?.column, name: this.aggregation()?.name });\n // if there are current filters, we need to add them to the current items\n if (currentFilters) {\n // multiples filters\n if (currentFilters.filters as LegacyFilter[]) {\n (currentFilters.filters as LegacyFilter[]).forEach((filter: LegacyFilter) => {\n // check if the filter is already present in the current items\n // if not, add it to the current items\n const found = currentItems.find(item => item.value === filter.value);\n if (!found) {\n currentItems.unshift({\n value: filter.value,\n display: filter.display,\n $selected: true\n } as AggregationListItem);\n }\n });\n } else {\n // single filter\n const found = currentItems.find(item => item.value === currentFilters.value);\n if (!found) {\n currentItems.push({\n value: currentFilters.value,\n display: currentFilters.display,\n $selected: true\n } as AggregationListItem);\n }\n }\n }\n }\n\n return currentItems;\n }\n}\n","<fieldset class=\"flex flex-col gap-2\">\n @if (!headless()) {\n <legend class=\"mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold text-gray-600\">\n <ng-content select=\"label\">\n @if (aggregation()?.icon) {\n <i class=\"fa-fw {{ aggregation()?.icon }} mr-1\" aria-hidden=\"true\"></i>\n }\n <span class=\"grow\">{{ aggregation()?.display | syslang | transloco }}</span>\n </ng-content>\n\n @if (showCount() && filtersCount() > 0) {\n <!-- count -->\n <Badge>\n {{ filtersCount() }}\n </Badge>\n }\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\"></i>\n </button>\n }\n @if (selection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\">\n <i class=\"fa-fw far fa-filter\"></i>\n </button>\n }\n </legend>\n }\n\n @if (aggregation()?.searchable && items().length) {\n <input type=\"text\" [placeholder]=\"'search' | transloco\" [(ngModel)]=\"searchText\" />\n }\n\n <ul class=\"snap-y snap-start overflow-auto\" role=\"list\" [attr.aria-label]=\"aggregation()?.display | syslang | transloco\">\n @for (item of items(); track $index) {\n <AggregationItem [node]=\"item\" (onSelect)=\"select()\" (onOpen)=\"open($event)\" />\n }\n </ul>\n @if (aggregation()?.$hasMore && this.searchedItems().length === 0) {\n <button variant=\"link\" class=\"mt-1 flex w-full justify-center\" [attr.aria-label]=\"'loadMore' | transloco\" (click)=\"loadMore()\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n</fieldset>\n","import { NgClass } from '@angular/common';\nimport { Component, computed, DestroyRef, effect, inject, InjectionToken, input, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\n\nimport { Aggregation, AggregationItem, FilterOperator, LegacyFilter, notify, translateAggregationToDateOptions, warn } from '@sinequa/atomic';\nimport { ButtonComponent, cn, ListItemComponent } from '@sinequa/ui';\n\nimport { SyslangPipe } from '../../../../pipes';\nimport { AggEx } from '../../../../services';\nimport { AggregationComponent, AggregationTitle } from '../aggregation.component';\n\n/**\n * Injection token that indicates whether custom date ranges are allowed.\n *\n * @remarks\n * This token is used to configure the date component to allow users to select custom date ranges.\n *\n * @example\n * ```typescript\n * providers: [\n * { provide: ALLOW_CUSTOM_RANGE, useValue: false }\n * ]\n * ```\n *\n * @public\n */\nexport const FILTER_DATE_ALLOW_CUSTOM_RANGE = new InjectionToken<boolean>('date allow custom range', { factory: () => true });\n\ntype DateFilter = {\n label?: string;\n operator?: FilterOperator;\n value?: string;\n range?: [string, string];\n display?: string;\n disabled?: boolean;\n hidden?: boolean;\n};\n\n@Component({\n selector: 'date-filter,DateFilter',\n standalone: true,\n providers: [provideTranslocoScope('filters')],\n imports: [NgClass, ButtonComponent, ListItemComponent, ReactiveFormsModule, TranslocoPipe, SyslangPipe],\n templateUrl: './date.component.html',\n styles: `\n :host {\n display: block;\n }\n\n ul[role='list'] {\n scrollbar-width: thin;\n }\n `\n})\nexport class DateComponent extends AggregationComponent {\n cn = cn;\n readonly title = input<AggregationTitle>({ label: 'Date', icon: 'far fa-calendar-day' });\n readonly displayEmptyDistributionIntervals = input<boolean>(false);\n readonly allowCustomRange = inject(FILTER_DATE_ALLOW_CUSTOM_RANGE);\n readonly transloco = inject(TranslocoService);\n\n protected readonly dateOptions = computed(() =>\n translateAggregationToDateOptions(this.aggregation() as Aggregation, this.displayEmptyDistributionIntervals())\n );\n\n protected readonly form = new FormGroup({\n option: new FormControl<string | null>(null),\n customRange: new FormGroup({\n from: new FormControl<string | null>(null),\n to: new FormControl<string | null>(null)\n })\n });\n protected today = new Date().toISOString().split('T')[0];\n\n protected readonly validSelection = signal<boolean>(false);\n\n constructor(private destroyRef: DestroyRef) {\n super();\n\n // apply current date filter from queryParamsStore\n effect(() => {\n this.updateForm(this.queryParamsStore.getFilter({ field: this.aggregation()?.column, name: this.aggregation()?.name }) as LegacyFilter);\n });\n\n this.form.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(changes => {\n this.validSelection.set(\n !!changes.option && (changes.option !== 'custom-range' || (changes.customRange?.from !== null && changes.customRange?.to !== null))\n );\n });\n }\n\n override aggregation = computed(() => {\n const name = this.name();\n if (name !== null) {\n const agg = this.aggregationsService.processAggregation(name, this.column());\n return { ...agg, items: agg?.items?.filter((item: AggregationItem) => item.display !== 'custom-range') ?? [] } as AggEx;\n }\n return null;\n });\n\n public override apply(): void {\n try {\n const filter = this.getFormValueFilter();\n this.queryParamsStore.updateFilter(filter);\n } catch (err: unknown) {\n warn('Error applying date filter:', err);\n if (err instanceof Error) {\n notify.error(this.transloco.translate(err.message));\n }\n }\n }\n\n public override clear(notify: boolean = true): void {\n this.form.setValue({\n option: null,\n customRange: {\n from: null,\n to: null\n }\n });\n\n const agg = this.aggregation();\n if (agg && notify) {\n this.queryParamsStore.removeFilterByName(agg.name);\n }\n }\n\n private updateForm(filter: LegacyFilter | undefined): void {\n if (!filter) {\n this.clear(false);\n return;\n }\n\n const { operator, value } = filter;\n const code = this.dateOptions().find((option: DateFilter) => option.operator === operator && option.value === value)?.display ?? 'custom-range';\n\n let from, to;\n\n if (code === 'custom-range') {\n switch (operator) {\n case 'lte':\n to = filter.value;\n break;\n case 'gte':\n from = filter.value;\n break;\n case 'between':\n from = filter.start;\n to = filter.end;\n break;\n }\n }\n\n const formValue = {\n option: code,\n customRange: {\n from: code === 'custom-range' ? (from ?? null) : null,\n to: code === 'custom-range' ? (to ?? null) : null\n }\n };\n\n this.form.setValue(formValue as any);\n }\n\n private getFormValueFilter(): LegacyFilter {\n const value = this.form.value;\n\n // value.option is null\n if (!value.option) {\n throw new Error('filters.selectionInvalid');\n }\n\n if (value.option !== 'custom-range') {\n const dateOption = this.dateOptions().find((option: DateFilter) => option.display === value.option);\n const aggregation = this.aggregation();\n if (!aggregation) {\n throw new Error('filters.aggregationNotFound');\n }\n\n return {\n name: aggregation.name,\n operator: dateOption?.operator || 'eq',\n field: aggregation.column,\n display: dateOption?.display ?? '',\n filters: dateOption?.filters,\n value: dateOption?.value\n };\n } else if (value.customRange) {\n // if to is null, operator is gte\n // if from is null, operator is lte\n // if both are not null, operator is between\n const aggregation = this.aggregation();\n if (!aggregation) {\n throw new Error('filters.aggregationNotFound');\n }\n\n const filter: LegacyFilter = {\n name: aggregation.name,\n field: aggregation.column,\n display: value.option as string\n };\n\n if (value.customRange.from && value.customRange.to) {\n filter.operator = 'between';\n filter.start = value.customRange.from;\n filter.end = value.customRange.to;\n } else if (value.customRange.from) {\n filter.operator = 'gte';\n filter.value = value.customRange.from;\n } else if (value.customRange.to) {\n filter.operator = 'lte';\n filter.value = value.customRange.to;\n } else {\n throw new Error('filters.customRangeInvalid');\n }\n\n return filter;\n }\n\n throw new Error('filters.filterInvalid');\n }\n}\n","<form [formGroup]=\"form\">\n <fieldset class=\"overflow-auto\">\n @if (!headless()) {\n <legend class=\"mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold text-gray-600\">\n <p class=\"me-4 grow\">\n <i class=\"fa-fw {{ title().icon }}\" aria-hidden=\"true\"></i>\n {{ title().label | syslang | transloco }}\n </p>\n <div class=\"ms-4\">\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\"\n (keydown.enter)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (selection() && validSelection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\"\n (keydown.enter)=\"apply()\">\n <i class=\"fa-fw far fa-filter\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </legend>\n }\n\n <ul class=\"flex flex-col gap-1 pt-2\" role=\"list\">\n @for (option of dateOptions(); track $index) {\n <li\n role=\"listitem\"\n tabindex=\"0\"\n (click)=\"radio.click()\"\n [attr.aria-label]=\"option.display | syslang | transloco\"\n [class]=\"\n cn(\n 'flex p-0 px-2 leading-7',\n form.get('option')?.value === option.display && 'bg-accent',\n option.hidden && 'hidden',\n option.disabled && 'disabled pointer-events-none text-neutral-300'\n )\n \"\n [attr.aria-hidden]=\"option.disabled\">\n <input\n #radio\n type=\"radio\"\n formControlName=\"option\"\n id=\"date-filter-{{ option.display }}\"\n [attr.disabled]=\"option.disabled ? true : null\"\n [attr.aria-disabled]=\"option.disabled\"\n (click)=\"select()\"\n value=\"{{ option.display }}\" />\n\n <label for=\"date-filter-{{ option.display }}\" class=\"grow cursor-pointer p-1\">\n {{ option.display | syslang | transloco }}\n </label>\n </li>\n }\n\n @if (allowCustomRange) {\n <li role=\"listitem\" aria-label=\"custom range\" class=\"flex px-2 leading-7\" [ngClass]=\"{ selected: form.get('option')?.value === 'custom-range' }\">\n <input #radiorange type=\"radio\" formControlName=\"option\" id=\"date-filter-custom-range\" value=\"custom-range\" (click)=\"select()\" />\n\n <div class=\"grid grow grid-cols-[4rem_auto] p-1 *:cursor-pointer\" formGroupName=\"customRange\" (click)=\"radiorange.click()\">\n <label for=\"date-filter-custom-from\">{{ 'from' | transloco }}</label>\n\n <input\n class=\"grow border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-from\"\n #dateFilterCustomFrom\n formControlName=\"from\"\n [max]=\"form.get('customRange.to')?.value ?? today\" />\n\n <label for=\"date-filter-custom-to\">{{ 'to' | transloco }}</label>\n\n <input\n class=\"border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-to\"\n formControlName=\"to\"\n [min]=\"form.get('customRange.from')?.value\"\n [max]=\"today\" />\n </div>\n </li>\n }\n </ul>\n </fieldset>\n</form>\n","import { Component, effect, ElementRef, inject, input, signal } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { Placement } from '@floating-ui/dom';\n\nimport { LegacyFilter } from '@sinequa/atomic';\nimport { BadgeComponent, ButtonComponent, ButtonVariants, PopoverComponent, PopoverContentComponent } from '@sinequa/ui';\n\nimport { OperatorPipe, SyslangPipe } from '../../../pipes';\nimport { AggregationsStore, AppStore, QueryParamsStore } from '../../../stores';\nimport { AggregationComponent } from '../aggregation/aggregation.component';\nimport { DateComponent } from '../aggregation/date/date.component';\nimport { CFilterEx } from '../filters.models';\n\n@Component({\n selector: 'filter-button, FilterButton',\n standalone: true,\n imports: [\n ButtonComponent,\n PopoverComponent,\n PopoverContentComponent,\n OperatorPipe,\n TranslocoPipe,\n AggregationComponent,\n SyslangPipe,\n DateComponent,\n BadgeComponent\n ],\n template: `\n <Popover [disabled]=\"filter().disabled\" class=\"group\">\n <button\n [variant]=\"variant()\"\n class=\"group-data-[open=true]:border group-data-[open=true]:border-gray-200\"\n [attr.data-disabled]=\"filter().disabled\"\n [disabled]=\"filter().disabled || null\">\n <!-- display the filter icon if set -->\n @if (filter().icon) {\n <i class=\"fa-fw {{ filter().icon }} \" aria-hidden=\"true\"></i>\n }\n\n @if (filter().legacyFilter && filter().display === 'custom-range') {\n <!-- display the date range if the filter is a date filter -->\n <span [innerHTML]=\"filter().legacyFilter | operator | syslang | transloco\"></span>\n } @else {\n <!-- display the first filter value or the aggregation name if no value is set -->\n {{ filter().display || filter().name | syslang | transloco }}\n }\n\n <!-- show the count of selected items -->\n @if (filter().isTree && filter().count > 0) {\n <Badge class=\"text-primary bg-primary-foreground min-w-5 px-1\">\n {{ filter().count }}\n </Badge>\n } @else if (filter().count > 1) {\n <Badge class=\"text-primary bg-primary-foreground hover:bg-primary-foreground size-5 min-w-5 px-1\"> +{{ filter().count - 1 }} </Badge>\n }\n </button>\n <PopoverContent class=\"w-max\" [position]=\"position()\">\n @if (isDate(filter().column)) {\n <DateFilter\n class=\"w-max min-w-[300px]\"\n [name]=\"filter().name\"\n [column]=\"filter().column\"\n id=\"filter-{{ filter().column }}\"\n [title]=\"{ label: 'Date', icon: 'far fa-calendar-day' }\" />\n } @else {\n <Aggregation class=\"max-h-(--agg-max-height,25rem)\" [name]=\"filter().name\" [column]=\"filter().column\" id=\"filter-{{ filter().column }}\" />\n }\n </PopoverContent>\n </Popover>\n `,\n host: {\n '[class.hidden]': 'filter().hidden'\n }\n})\nexport class FilterButtonComponent {\n name = input.required<string>();\n column = input.required<string>();\n position = input<Placement>('bottom-start');\n\n protected variant = signal<ButtonVariants['variant']>('ghost');\n\n protected filter = signal<CFilterEx>({\n name: '',\n icon: '',\n column: '',\n display: '',\n isTree: false,\n count: 0,\n hidden: false,\n disabled: false\n });\n\n protected nativeElement = inject(ElementRef).nativeElement;\n protected aggregationsStore = inject(AggregationsStore);\n protected queryParamsStore = inject(QueryParamsStore);\n protected appStore = inject(AppStore);\n\n constructor() {\n effect(() => {\n const agg = this.aggregationsStore.getAggregation(this.name());\n const f = this.queryParamsStore.getFilter({ name: agg?.name, field: agg?.column });\n const count = f?.count || 0;\n\n if (!agg) return;\n\n // retrieve customization fron the custom JSON provided by the server\n const { icon, hidden = false, display } = this.appStore.getAggregationCustomization(this.column()) || {};\n\n const r = {\n name: agg?.name,\n column: this.column(),\n icon,\n hidden,\n display: agg?.isTree ? display : (f?.display ?? f?.value ?? display),\n isTree: agg?.isTree || false,\n count,\n disabled: !agg?.items || agg.items?.length === 0 ? true : false,\n // if the filter is a date filter, we need to set the legacyFilter\n // to be able to display the date range\n legacyFilter: this.isDate(this.column()) ? (f as LegacyFilter) : undefined\n };\n\n this.filter.set(r);\n });\n\n effect(() => {\n const f = this.filter();\n this.variant.update(v => (f.count ? 'default' : 'ghost'));\n });\n }\n\n /**\n * Checks if the specified column is a date filter.\n *\n * @param column The column name to check.\n * @returns True if the column is a date filter, false otherwise.\n */\n protected isDate(column: string): boolean {\n return this.appStore.isDateColumn(column);\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { LegacyFilter } from '@sinequa/atomic';\nimport { CFilter } from '../../models';\n\nexport type CFilterEx = CFilter & {\n name: string;\n count: number;\n isTree: boolean;\n disabled: boolean;\n hidden: boolean;\n legacyFilter?: LegacyFilter;\n};\n\nexport const FILTERS_BREAKPOINT = new InjectionToken<number>('FILTERS_BREAKPOINT', { factory: () => 5 });\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, effect, inject, input, signal } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BadgeComponent, ButtonComponent, cn } from '@sinequa/ui';\n\nimport { CFilter } from '../../../models';\nimport { AggregationsStore, AppStore, QueryParamsStore } from '../../../stores';\nimport { AggregationComponent } from '../aggregation/aggregation.component';\nimport { DateComponent } from '../aggregation/date/date.component';\nimport { CFilterEx } from '../filters.models';\nimport { Aggregation } from '@sinequa/atomic';\n\n@Component({\n selector: 'more, More',\n standalone: true,\n imports: [NgTemplateOutlet, ButtonComponent, AggregationComponent, TranslocoPipe, DateComponent, BadgeComponent],\n template: `\n @for (filter of filters(); track $index) {\n <li [class]=\"cn('collapse pb-1', filter.hidden && 'hidden')\">\n <!-- header -->\n <input\n role=\"button\"\n type=\"checkbox\"\n name=\"more-filters\"\n [class]=\"cn('min-h-8 w-full', filter.disabled && 'pointer-events-none cursor-default select-none')\"\n [attr.title]=\"'filters.openFilter' | transloco: { filter: filter.display || filter.name }\" />\n\n @if (isDate(filter.column)) {\n <ng-container [ngTemplateOutlet]=\"actions\" [ngTemplateOutletContext]=\"{ filter, agg }\" />\n <DateFilter #agg class=\"collapse-content ml-2 mr-2\" [name]=\"filter.name\" [column]=\"filter.column\" id=\"filter-{{ filter.column }}\" [headless]=\"true\" />\n } @else {\n <ng-container [ngTemplateOutlet]=\"actions\" [ngTemplateOutletContext]=\"{ filter, agg }\" />\n <Aggregation\n #agg\n class=\"collapse-content ml-2 mr-2\"\n [name]=\"filter.name\"\n [column]=\"filter.column\"\n id=\"filter-{{ filter.column }}\"\n [headless]=\"true\" />\n }\n </li>\n\n <!-- actions fragment -->\n <ng-template #actions let-filter=\"filter\" let-agg=\"agg\">\n <div [class]=\"cn('collapse-title flex items-center gap-1 px-2 py-1 text-gray-600', filter.disabled && 'text-slate-300')\">\n <!-- aggregation's icon -->\n <i class=\"me-1 fa-fw {{ filter.icon }}\" aria-hidden=\"true\"></i>\n\n <!-- aggregation label -->\n <span class=\"me-4 grow text-sm font-semibold\">{{ filter.display || filter.name | transloco }}</span>\n @if (filter.count > 0) {\n <!-- count -->\n <Badge class=\"min-w-5 px-1\">\n {{ filter.count }}\n </Badge>\n }\n <!-- \"clear filters\" button. The \"z-10\" rule is here to keep the button above the collapse content -->\n @if (hasFilters(filter)) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n class=\"z-10 text-gray-600\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n (click)=\"clearFilter(filter.column)\"\n (keydown.enter)=\"clearFilter(filter.column)\">\n <i class=\"fa-fw far fa-filter-circle-xmark\"></i>\n </button>\n }\n @if (agg.selection()) {\n <button variant=\"ghost\" size=\"icon\" class=\"z-10\" [attr.title]=\"'filters.applyFilters' | transloco\" (click)=\"agg.apply()\">\n <i class=\"fa-fw far fa-filter\"></i>\n </button>\n }\n </div>\n </ng-template>\n }\n `,\n host: {\n class: 'divide-y divide-gray-200'\n },\n styles: [\n `\n :host {\n scrollbar-width: none;\n }\n `\n ]\n})\nexport class MoreComponent {\n cn = cn;\n count = input<number>(2);\n excludedFilters = input<string[]>([]);\n\n route = inject(ActivatedRoute);\n appStore = inject(AppStore);\n aggregationsStore = inject(AggregationsStore);\n queryParamsStore = inject(QueryParamsStore);\n\n filters = signal<CFilterEx[]>([]);\n\n constructor() {\n effect(() => {\n const count = this.count();\n\n const authorizedFilters = this.appStore\n .getAuthorizedFilters(this.route)\n .filter(f => !this.excludedFilters().includes(f.name))\n .toSpliced(0, count);\n\n const f = authorizedFilters.map(agg => {\n const { icon = 'far fa-list', hidden = false } = (this.appStore.getAggregationCustomization(agg.column) as CFilter) || {};\n return {\n name: agg.name,\n column: agg.column,\n icon,\n count: 0,\n isTree: false,\n disabled: false,\n hidden\n };\n });\n\n this.filters.set(f);\n this.updateFilters();\n });\n }\n\n clearFilter(field: string) {\n this.queryParamsStore.removeFilter(field);\n }\n\n updateFilters() {\n this.filters.update(filters => {\n return filters.map(filter => {\n const agg = this.aggregationsStore.getAggregation(filter.name);\n const f = this.queryParamsStore.getFilter({ name: agg?.name, field: agg?.column });\n const count = f?.count || 0;\n\n const { display = agg?.isTree ? undefined : filter.display } = (this.appStore.getAggregationCustomization(filter.column) as CFilter) || {};\n\n return {\n ...filter,\n name: agg?.name || filter.name,\n display,\n isTree: agg?.isTree || false,\n count,\n disabled: !agg?.items || agg.items?.length === 0 ? true : false\n };\n });\n });\n }\n\n /**\n * Checks if the specified column is a date filter.\n *\n * @param column The column name to check.\n * @returns True if the column is a date filter, false otherwise.\n */\n isDate(column: string | null): boolean {\n if (!column) return false;\n return this.appStore.isDateColumn(column);\n }\n\n /**\n * Checks whether there are active filters for the current aggregation column.\n *\n * if True, the clear button is shown.\n *\n * @returns {boolean} `true` if the filter count for the aggregation column is greater than 0, otherwise `false`.\n */\n hasFilters(aggregation: Aggregation): boolean {\n const { count = 0 } = this.queryParamsStore.getFilter({ field: aggregation.column, name: aggregation.name }) || {};\n return count > 0;\n }\n}\n","import { Component, computed, ElementRef, inject, input } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { Placement } from '@floating-ui/dom';\n\nimport { BadgeComponent, ButtonComponent, PopoverComponent, PopoverContentComponent } from '@sinequa/ui';\n\nimport { MoreComponent } from './more.component';\nimport { AppStore, QueryParamsStore } from '../../../stores';\n\n@Component({\n selector: 'more-button, MoreButton',\n standalone: true,\n imports: [ButtonComponent, PopoverComponent, PopoverContentComponent, TranslocoPipe, MoreComponent, BadgeComponent],\n template: `\n <Popover class=\"group\">\n <button\n variant=\"ghost\"\n class=\"gap-1 truncate font-semibold group-data-[open=true]:border group-data-[open=true]:border-gray-200\"\n aria-label=\"more filters\">\n <i class=\"far fa-filters\" aria-hidden=\"true\"></i>\n <span>{{ 'filters.moreFilters' | transloco }}</span>\n\n @if (totalFiltersCount() > 0) {\n <Badge class=\"min-w-5 px-1\">\n {{ totalFiltersCount() }}\n </Badge>\n }\n </button>\n\n <PopoverContent [position]=\"position()\" class=\"more-filters max-h-[55vh]: lg:max-h-[65vh]\">\n <More [count]=\"count()\" [excludedFilters]=\"excludedFilters()\" class=\"h-full max-w-80 overflow-y-scroll\" />\n </PopoverContent>\n </Popover>\n `,\n styles: [\n `\n .more-filters {\n overflow: var(--scrollbar-overflow, hidden);\n padding-right: 0;\n scrollbar-width: thin;\n scrollbar-gutter: stable;\n }\n .more-filters:hover {\n --scrollbar-overflow: overlay;\n }\n `\n ]\n})\nexport class MoreButtonComponent {\n route = inject(ActivatedRoute);\n appStore = inject(AppStore);\n queryParamsStore = inject(QueryParamsStore);\n nativeElement = inject(ElementRef).nativeElement;\n\n count = input<number>(2);\n position = input<Placement>('bottom-end');\n excludedFilters = input<string[]>([]);\n\n totalFiltersCount = computed(() => {\n const count = this.count();\n\n const authorizedFilters = this.appStore\n .getAuthorizedFilters(this.route)\n .filter(f => !this.excludedFilters().includes(f.name))\n .map(f => ({ field: f.column, name: f.name }))\n .toSpliced(0, count);\n\n const total = authorizedFilters.reduce((acc, filter) => {\n const f = this.queryParamsStore.getFilter(filter);\n acc += f?.count || 0;\n return acc;\n }, 0);\n return total;\n });\n}\n","import { ChangeDetectorRef, Component, computed, DestroyRef, effect, ElementRef, inject, input, output, signal, viewChild, viewChildren } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\nimport { debounceTime } from 'rxjs';\nimport { Placement } from '@floating-ui/dom';\n\nimport { ButtonComponent, cn } from '@sinequa/ui';\n\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective } from '../../directives';\nimport { AggregationsStore, AppStore, QueryParamsStore } from '../../stores';\nimport { FilterButtonComponent } from './buttons/filter-button.component';\nimport { FILTERS_BREAKPOINT } from './filters.models';\nimport { MoreButtonComponent } from './more/more-button.component';\n\n@Component({\n selector: 'filters-bar, FiltersBar, filtersbar',\n standalone: true,\n imports: [ButtonComponent, MoreButtonComponent, FilterButtonComponent, OverflowManagerDirective, OverflowItemDirective, OverflowStopDirective, TranslocoPipe],\n providers: [provideTranslocoScope('filters')],\n template: `\n <ng-container overflowManager [direction]=\"direction()\" [target]=\"el.nativeElement\" (count)=\"adjustFiltersCount($event)\">\n @if (hasFilters()) {\n <button\n variant=\"destructive\"\n size=\"icon\"\n class=\"shrink-0\"\n [title]=\"'filters.clearAllFilters' | transloco\"\n (click)=\"clearFilters()\"\n (keydown.enter)=\"clearFilters()\">\n <i class=\"fa-fw far fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (currentBasket()) {\n <button variant=\"destructive\" class=\"max-w-40\" [title]=\"'filters.clearBasket' | transloco\" (click)=\"clearBasket()\" (keydown.enter)=\"clearBasket()\">\n <i class=\"fa-fw far fa-inbox\" aria-hidden=\"true\"></i>\n <p class=\"truncate\">{{ currentBasket() }}</p>\n </button>\n }\n\n @if (hasAggregations()) {\n @for (filter of filters(); track $index) {\n <FilterButton overflowItem [name]=\"filter.name\" [column]=\"filter.column\" [position]=\"position()\" />\n }\n\n <!-- More button to show more filters if there are any, it's hidden by default -->\n <MoreButton\n overflowStop\n [class]=\"cn('invisible absolute', direction() === 'horizontal' ? 'right-0' : 'bottom-0', hasMoreFilters().length > 0 && 'visible')\"\n [count]=\"moreFilterCount()\"\n [position]=\"position()\"\n [excludedFilters]=\"excludeFilters()\" />\n }\n </ng-container>\n `,\n host: {\n '[class]': 'cn(\"flex relative z-filter gap-2\", direction() === \"vertical\" ? \"flex-col items-start\" : \"flex-row\", class())',\n role: 'list',\n 'aria-label': 'Filters list'\n }\n})\nexport class FiltersBarComponent {\n class = input<string>();\n\n position = input<Placement>('bottom-start');\n\n /**\n * Filters that should be excluded from the filters bar.\n * This can be used to hide specific filters from the UI.\n *\n * Use the filter column names to specify which filters to exclude.\n * For example, to exclude the \"geo\" filter, set `excludeFilters = ['Geo']`.\n */\n excludeFilters = input<string[]>([]);\n\n /**\n * The number of filters to display before showing the \"more filters\" button.\n * This is used to limit the number of visible filters in the UI.\n * The default value is set by the FILTERS_BREAKPOINT injection token.\n */\n filtersCount = input<number>(inject(FILTERS_BREAKPOINT));\n direction = input<'horizontal' | 'vertical'>('horizontal');\n\n /**\n * Event emitted when the clear filters button is clicked.\n * This event can be used to perform additional actions when filters are cleared.\n */\n onClearFilters = output<void>();\n\n /**\n * Event emitted when the clear basket button is clicked.\n * This event can be used to perform additional actions when the basket is cleared.\n */\n onClearBasket = output<void>();\n\n protected cn = cn;\n protected moreFilterElement = viewChild<MoreButtonComponent>(MoreButtonComponent);\n protected dropdownElements = viewChildren<FilterButtonComponent>(FilterButtonComponent);\n protected readonly overflowManager = viewChild<OverflowManagerDirective>(OverflowManagerDirective);\n\n protected cdr = inject(ChangeDetectorRef);\n\n protected route = inject(ActivatedRoute);\n protected appStore = inject(AppStore);\n protected aggregationsStore = inject(AggregationsStore);\n protected queryParamsStore = inject(QueryParamsStore);\n protected el = inject(ElementRef);\n protected readonly transloco = inject(TranslocoService);\n protected readonly router = inject(Router);\n protected destroyRef = inject(DestroyRef);\n\n protected filters = signal<{ name: string; column: string }[]>([]);\n protected moreFilterCount = signal(this.filtersCount());\n\n protected hasFilters = computed(() => {\n // when the query parameters store updates, update the hasFilters signal\n // to show or hide the clear filters button\n const state = getState(this.queryParamsStore);\n return state.basket || (Array.isArray(state.filters) && state.filters.length > 0);\n });\n\n protected currentBasket = computed(() => {\n const { basket } = getState(this.queryParamsStore);\n return basket;\n });\n\n protected hasAggregations = computed(() => {\n if (this.aggregationsStore.aggregations()) return this.aggregationsStore.aggregations().length > 0;\n return false;\n });\n\n protected hasMoreFilters = computed(() => {\n const moreFiltersAggregations = this.appStore\n .getAuthorizedFilters(this.route)\n .filter(f => !this.excludeFilters().includes(f.name)) // filter out the excluded filters\n .map(f => ({ column: f.column, name: f.name }))\n .toSpliced(0, this.moreFilterCount())\n .map(f => this.aggregationsStore.getAggregation(f.column, 'column'));\n\n return moreFiltersAggregations;\n });\n\n constructor() {\n effect(() => {\n // set filters according to the route and the authorized filters with default values\n const authorizedFilters = this.appStore\n .getAuthorizedFilters(this.route)\n .filter(f => !this.excludeFilters().includes(f.name)) // filter out the excluded filters\n .map(f => ({ name: f.name, column: f.column }))\n .toSpliced(this.filtersCount());\n\n this.filters.set(authorizedFilters);\n });\n\n this.transloco.events$.pipe(takeUntilDestroyed(this.destroyRef), debounceTime(100)).subscribe(() => this.overflowManager()?.countItems());\n }\n\n /**\n * Clears all filters (included baskets) by invoking the clearFilters method on the queryParamsStore.\n * This method is typically used to reset the filter state to its default values.\n */\n clearFilters(): void {\n this.queryParamsStore.clearFilters();\n this.onClearFilters.emit();\n }\n\n /**\n * Clears the basket by invoking the clearBasket method on the queryParamsStore.\n * This method is typically used to reset the basket state to its default value.\n */\n clearBasket(): void {\n this.queryParamsStore.clearBasket();\n this.onClearBasket.emit();\n }\n\n /**\n * Adjusts the count of filters that can be displayed before the \"more filters\" option is shown.\n *\n * This method calculates the number of filter dropdowns that can fit in the available space\n * before the \"more filters\" button. It updates the `moreFilterCount` property with the number\n * of filters that can be displayed. If no filters are present, it sets the `moreFilterCount`\n * to the total number of filters.\n *\n */\n protected adjustFiltersCount(count: number): void {\n // count is the number of filter dropdowns that can fit in the available space\n // filtersCount is the number of filters that can be displayed before the \"more filters\" option is shown\n this.moreFilterCount.set(count > this.filtersCount() ? this.filtersCount() : count);\n }\n}\n","import { Component, ComponentRef, DestroyRef, HostBinding, InjectionToken, Type, ViewContainerRef, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { DrawerComponent } from '../drawer/drawer.component';\nimport { DrawerStackService } from './drawer-stack.service';\nimport { SelectionHistoryService } from '../../services';\n\nexport const DRAWER_COMPONENT = new InjectionToken<Type<DrawerComponent>>('DRAWER_COMPONENT');\nexport const DRAWER_STACK_MAX_COUNT = new InjectionToken<number>('Drawer stack maximum count', {\n factory: () => 3\n});\n\n@Component({\n selector: 'app-drawer-stack',\n template: ``,\n styles: [\n `\n :host {\n position: absolute;\n top: 50%;\n right: 0;\n\n --drawer-width: 46;\n --drawer-subdrawer-width: 400px;\n\n z-index: var(--z-drawer);\n\n transition: right 300ms linear;\n\n &[drawer-opened='true'] {\n right: calc(1% * var(--drawer-width));\n }\n }\n `\n ]\n})\nexport class DrawerStackComponent {\n @HostBinding('attr.drawer-opened')\n public drawerOpened: boolean = false;\n\n readonly drawerStackService = inject(DrawerStackService);\n protected readonly selectionHistory = inject(SelectionHistoryService);\n protected readonly viewContainer = inject(ViewContainerRef);\n\n // Inject the token for the drawer component\n protected readonly drawerComponent = inject(DRAWER_COMPONENT);\n // Inject the token for the maximum number of drawers\n protected readonly drawerStackMaxCount = inject(DRAWER_STACK_MAX_COUNT);\n\n protected readonly selectionHistory$ = this.selectionHistory.selectionHistoryEvent;\n\n protected readonly drawers: ComponentRef<DrawerComponent>[] = [];\n get drawersLength() {\n return this.drawers.length;\n }\n\n constructor(destroyRef: DestroyRef) {\n this.drawerStackService.isOpened.pipe(takeUntilDestroyed(destroyRef)).subscribe(state => {\n this.drawerOpened = state;\n\n if (state && !!this.drawerStackService.componentType) {\n this.openTopDrawer(undefined, this.drawerStackService.componentType);\n }\n });\n\n this.selectionHistory$.pipe(takeUntilDestroyed(destroyRef)).subscribe(event => {\n if (event !== 'new') return;\n\n this.openTopDrawer(this.selectionHistory.getCurrentSelectionIndex());\n });\n\n this.drawerStackService.toggleTopDrawerExtension$.pipe(takeUntilDestroyed(destroyRef)).subscribe(() => this.toggleTopDrawerExtension());\n this.drawerStackService.forceTopDrawerCollapse$.pipe(takeUntilDestroyed(destroyRef)).subscribe(() => this.collapseTopDrawer());\n this.drawerStackService.closeTopDrawer$.pipe(takeUntilDestroyed(destroyRef)).subscribe(() => this.closeTopDrawer());\n this.drawerStackService.closeAllDrawers$.pipe(takeUntilDestroyed(destroyRef)).subscribe(() => this.closeAllDrawers());\n }\n\n protected toggleAssistant(): void {\n this.drawerStackService.toggleAssistant();\n }\n\n private openTopDrawer(index?: number, componentType?: Type<DrawerComponent>): void {\n if (this.drawers.length >= this.drawerStackMaxCount) {\n console.warn('Drawer stack is full');\n this.shiftDrawer();\n }\n\n this.pushDrawer(index, componentType || this.drawerComponent);\n }\n\n private closeTopDrawer(): void {\n const top = this.drawers.pop();\n\n this.selectionHistory.back();\n\n this.closeAndDestroyDrawer(top);\n\n if (this.drawers.length < this.drawerStackMaxCount && this.selectionHistory.getHistoryLength() > this.drawers.length)\n this.unshiftDrawer(this.selectionHistory.getHistoryLength() - this.drawers.length - 1);\n }\n\n private closeAllDrawers(): void {\n this.closeAndDestroyDrawer(this.drawers.pop());\n this.drawers.forEach(drawer => drawer.destroy());\n this.drawers.length = 0;\n }\n\n private collapseTopDrawer(): void {\n const top = this.drawers[this.drawers.length - 1];\n\n top?.instance.drawer.collapse();\n }\n\n private toggleTopDrawerExtension(): void {\n const top = this.drawers[this.drawers.length - 1];\n\n top?.instance.drawer.toggleExtension();\n }\n\n private pushDrawer(index?: number, componentType?: Type<DrawerComponent>): void {\n if (!componentType) {\n throw new Error('Component type is undefined');\n }\n const drawer = this.viewContainer.createComponent(componentType);\n\n if (index !== undefined) {\n drawer.setInput('articleId', this.selectionHistory.getSelection(index)?.id);\n }\n\n this.drawers.push(drawer);\n\n // setTimeout is needed to ensure that the drawer is fully initialized\n // and the animation will be played\n setTimeout(() => {\n drawer.instance.drawer.open();\n });\n }\n\n private shiftDrawer(): void {\n const drawer = this.drawers.shift();\n\n this.closeAndDestroyDrawer(drawer);\n }\n\n private unshiftDrawer(index: number): void {\n const drawer = this.viewContainer.createComponent(this.drawerComponent);\n\n drawer.setInput('articleId', this.selectionHistory.getSelection(index)?.id);\n\n this.viewContainer.insert(drawer.hostView, 0);\n\n this.drawers.unshift(drawer);\n\n drawer.instance.drawer.open();\n }\n\n private closeAndDestroyDrawer(drawer?: ComponentRef<DrawerComponent>) {\n drawer?.instance.drawer.close();\n\n setTimeout(() => {\n drawer?.destroy();\n }, 250);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\nimport { BackdropService } from '../../components/backdrop/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 { Component, ElementRef, HostBinding, HostListener, afterNextRender, inject, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { SelectionHistoryService } from '../../services/selection-history.service';\nimport { DrawerService } from './drawer.service';\nimport { DrawerStackService } from '../drawer-stack/drawer-stack.service';\n\n/**\n * Each Drawer component has it's own drawer service to handle its state and link it to the drawer stack.\n */\n\n@Component({\n selector: 'app-drawer',\n standalone: true,\n providers: [DrawerService],\n template: ``,\n styleUrl: './drawer.component.css',\n host: {\n '[attr.drawer-opened]': 'drawerOpened()',\n '[attr.drawer-extended]': 'drawerExtended()'\n }\n})\nexport class DrawerComponent {\n public drawerOpened = signal(false);\n public drawerExtended = signal(false);\n\n @HostBinding('style.grid-template-columns')\n public drawerGridTemplateColumns: string = '';\n\n @HostListener('mousemove', ['$event'])\n public mouseMove(event: MouseEvent): void {\n if (!this.isSliding) return;\n\n const min = (window.innerWidth * 3) / 100;\n const max = (window.innerWidth * 46) / 100;\n const width = Math.min(Math.max(event.clientX, min), max);\n\n this.drawerGridTemplateColumns = `${width}px minmax(min-content, 1fr) var(--drawer-subdrawer-width)`;\n }\n\n @HostListener('mousedown', ['$event'])\n public mouseDown(event: MouseEvent): void {\n if (event.target !== this.drawerHandle()?.nativeElement) return;\n\n this.disableAnimation();\n this.isSliding = true;\n }\n\n @HostListener('mouseup')\n public mouseUp(): void {\n if (this.isSliding) this.enableAnimation();\n\n this.isSliding = false;\n }\n\n drawerHandle = viewChild<ElementRef>('drawerHandle');\n\n public readonly drawer = inject(DrawerService);\n protected readonly drawerStack = inject(DrawerStackService);\n\n protected readonly element = inject(ElementRef).nativeElement;\n protected readonly selectionHistory = inject(SelectionHistoryService);\n\n private isSliding = false;\n private defaultDrawerGridTemplate = '';\n\n constructor() {\n afterNextRender(() => {\n this.drawerGridTemplateColumns = this.element.style.gridTemplateColumns;\n });\n\n this.drawer.isOpened.pipe(takeUntilDestroyed()).subscribe(state => {\n this.drawerOpened.set(state);\n if (!state) this.resetGridTemplateColumns();\n });\n\n this.drawer.isExtended.pipe(takeUntilDestroyed()).subscribe(state => {\n this.drawerExtended.set(state);\n if (!state) this.resetGridTemplateColumns();\n });\n }\n\n private disableAnimation(): void {\n this.element.classList.add('no-transition-important');\n }\n\n private enableAnimation(): void {\n this.element.classList.remove('no-transition-important');\n }\n\n private resetGridTemplateColumns(): void {\n this.element.style.gridTemplateColumns = this.defaultDrawerGridTemplate;\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ButtonComponent, VerticalDividerComponent } from '@sinequa/ui';\n\nimport { DrawerStackService } from '../../drawer-stack/drawer-stack.service';\nimport { DrawerService } from '../drawer.service';\n\n@Component({\n selector: 'app-drawer-navbar',\n standalone: true,\n imports: [TranslocoPipe, ButtonComponent, VerticalDividerComponent],\n templateUrl: './drawer-navbar.component.html'\n})\nexport class DrawerNavbarComponent {\n protected readonly drawerStack = inject(DrawerStackService);\n protected readonly drawerService = inject(DrawerService);\n\n readonly isExtended = toSignal(this.drawerService.isExtended);\n}\n","<menu class=\"flex items-center gap-2 p-4 font-semibold\">\n <button variant=\"ghost\" class=\"group\" [attr.title]=\"'back' | transloco\" (click)=\"drawerStack.close()\">\n <i class=\"fa-fw far fa-arrow-left [&_svg]-ms-1 [&_svg]transition-transform opacity-60 group-hover:-translate-x-0.5\"></i>\n {{ 'back' | transloco }}\n </button>\n\n <VerticalDivider />\n\n <ng-content></ng-content>\n</menu>\n","import { Overlay } from '@angular/cdk/overlay';\nimport { Component, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { NonNullableFormBuilder, ReactiveFormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { Aggregation, AggregationItem, FilterOperator, LegacyFilter, TreeAggregation, TreeAggregationNode } from '@sinequa/atomic';\nimport { ButtonComponent, InputComponent } from '@sinequa/ui';\n\nimport { DropdownInputComponent, DropdownItem } from '../../../components';\nimport { QueryService } from '../../../services';\nimport { AppStore, QueryParamsStore } from '../../../stores';\nimport { buildQuery } from '../../../utils';\nimport { DrawerStackService } from '../../drawer-stack/drawer-stack.service';\nimport { DrawerComponent } from '../drawer.component';\nimport { DrawerService } from '../drawer.service';\nimport { DrawerNavbarComponent } from '../navbar/drawer-navbar.component';\n\ntype Operator = 'all' | 'exact' | 'any' | 'none' | 'matches';\n\ninterface Filter {\n column: string;\n alias: string;\n items?: (AggregationItem | TreeAggregationNode)[];\n}\n\nconst searchRoute = 'search';\n\n@Component({\n selector: 'advanced-filters',\n standalone: true,\n imports: [ReactiveFormsModule, TranslocoPipe, DrawerNavbarComponent, DropdownInputComponent, ButtonComponent, InputComponent],\n providers: [DrawerService, provideTranslocoScope('drawers')],\n templateUrl: './advanced-filters.component.html',\n styleUrls: ['./advanced-filters.component.css']\n})\nexport class DrawerAdvancedFiltersComponent extends DrawerComponent {\n private readonly queryParamsStore = inject(QueryParamsStore);\n private readonly appStore = inject(AppStore);\n private readonly router = inject(Router);\n private readonly formBuilder = inject(NonNullableFormBuilder);\n private readonly overlay = inject(Overlay);\n private readonly transloco = inject(TranslocoService);\n private readonly queryService = inject(QueryService);\n\n protected scrollStrategy = this.overlay.scrollStrategies.reposition();\n protected noop = this.overlay.scrollStrategies.noop();\n\n selectData: { operator: string; display: string; placeholder?: string }[] = [\n { operator: 'all', display: 'filterContainsAll' },\n { operator: 'exact', display: 'filterContainsExact' },\n { operator: 'any', display: 'filterContainsAny' },\n { operator: 'none', display: 'filterContainsNone' },\n { operator: 'matches', display: 'filterMatches', placeholder: 'you can use AND/OR criteria' }\n ];\n\n protected readonly form = this.formBuilder.group({\n content: this.formBuilder.group({\n operator: this.formBuilder.control<Operator>('all'),\n value: this.formBuilder.control(undefined)\n }),\n title: this.formBuilder.group({\n operator: this.formBuilder.control<Operator>('all'),\n value: this.formBuilder.control(undefined)\n }),\n location: this.formBuilder.group({\n operator: this.formBuilder.control<Operator>('all'),\n value: this.formBuilder.control(undefined)\n })\n });\n\n currentTab = signal<string>('all');\n currentFilter = signal<string | undefined>(undefined);\n appliedFilters = signal<{ column: string; values: DropdownItem[] }[]>([]);\n suggestions = signal<DropdownItem[]>([]);\n aggregations = signal<(Aggregation | TreeAggregation)[] | undefined>(undefined);\n\n tabs = computed<string[]>(() => {\n const routeData = this.router.config.find(c => c.path === searchRoute);\n return !routeData ? [] : ['all'].concat(routeData.children!.filter(c => !!c.path && c.path !== 'all' && c.path !== '**').map(c => c.path!));\n });\n\n filters = computed<Filter[]>(() => {\n return (\n this.appStore\n .customizationJson()\n .filters?.filter(f => f.column !== '#date')\n .map(f => ({\n column: f.column,\n alias: this.appStore.getColumnAlias(f.column),\n items: this.aggregations()?.find(a => a.column === f.column)?.items\n })) || []\n );\n });\n\n text: string = '';\n\n constructor() {\n super();\n\n this.getAggregations();\n }\n\n getAggregations(): void {\n const query: any = buildQuery();\n query.action = 'aggregate';\n query.name = this.appStore.getDefaultQuery()?.name;\n this.queryService.search(query).subscribe(res => {\n this.aggregations.set(res.aggregations);\n });\n }\n\n onTabChange(tab: string): void {\n this.currentTab.set(tab);\n }\n\n onSearch(): void {\n // this params alters the query text\n const { content, title, location } = this.form.value;\n let fieldedText = [];\n if (content && content.value) {\n const { operator = 'any', value = '' } = content;\n const text = this.formatFilter(operator, value);\n fieldedText.push(text);\n }\n if (title && title.value) {\n const { operator = 'any', value = '' } = title;\n const text = this.formatFilter(operator, value, 'title');\n fieldedText.push(text);\n }\n if (location && location.value) {\n const { operator = 'any', value = '' } = location;\n const text = this.formatFilter(operator, value, 'location');\n fieldedText.push(text);\n }\n\n let text = this.text;\n\n // now we have to join the fieldedText with the text\n // if text is empty, we must remove the leading space\n // if text is not empty, we must add a AND before the fieldedText\n if (text && fieldedText.length) {\n text = text + ' AND ' + fieldedText.join(' AND ');\n } else {\n text = fieldedText.join(' AND ');\n }\n this.queryParamsStore.patch({ text });\n\n const filters: LegacyFilter[] = [];\n this.appliedFilters().forEach(filter => {\n if (filter.values.length) {\n // todo should handle dates? how?\n /* if (filter.column.startsWith('modified') || filter.column.startsWith('date')) {\n const valueFrom = this.customFilters.value[`${filter}From`]?.trim();\n const valueTo = this.customFilters.value[`${filter}To`]?.trim();\n if (valueFrom) {\n filters.push(...this.getFilter('like', valueFrom, filter.column));\n }\n if (valueTo) {\n filters.push(...this.getFilter('like', valueTo, filter.column));\n }\n } else { */\n filters.push(\n ...this.getFilter(\n 'in',\n filter.values.map(v => v.value),\n filter.column\n )\n );\n }\n });\n\n this.queryParamsStore.clearFilters();\n if (filters.length) {\n filters.forEach(filter => this.queryParamsStore.updateFilter(filter));\n }\n\n this.drawerStack.close();\n\n // ! we need to remove the page parameter from the query params when new search is performed\n const { name } = this.queryParamsStore.getQuery();\n this.router.navigate([`/${searchRoute}/${this.currentTab()}`], {\n queryParams: { q: text, p: undefined, t: this.currentTab(), n: name },\n queryParamsHandling: 'merge'\n });\n }\n\n /** Generate the LegacyFilter to add to the query */\n private getFilter(operator: FilterOperator, values: string[], field: string): LegacyFilter[] {\n if (field.startsWith('modified') || field.startsWith('date')) {\n // dates\n const op = field.endsWith('From') ? 'gte' : 'lte';\n const f = field.split(field.endsWith('From') ? 'From' : 'To')[0];\n return [{ operator: op, value: values[0], field: f }];\n } else {\n switch (operator) {\n case 'contains':\n case 'in':\n return [{ operator, values: values, field, display: values[0] }];\n case 'eq':\n case 'like':\n return [{ operator, value: values[0], field, display: values[0] }];\n default:\n return [];\n }\n }\n }\n\n /** Format content/title/location filters */\n private formatFilter(operator: Operator, value: string, field: 'title' | 'location' | '' = ''): string {\n const fieldStr = field ? `${field}::` : '';\n switch (operator) {\n case 'all':\n return `${fieldStr}[${value}]`;\n case 'exact':\n return `${fieldStr}\"${value}\"`;\n case 'matches':\n // value can be separated by AND or OR keywords, if it's the case each words must be written field:word1 AND field:word2 etc...\n const words = value.split(/\\s+(AND|OR)\\s+/);\n return words\n .map(w => {\n if (w === 'AND' || w === 'OR') return w;\n return `(${fieldStr}${w})`;\n })\n .join(' ');\n case 'any':\n const splitWords = value.split(' ');\n return `(${splitWords.map(w => `${fieldStr}[${w}]`).join(' OR ')})`;\n case 'none':\n return `${fieldStr}NOT [${value}]`;\n default:\n return value;\n }\n }\n\n getPlaceholder(key: string): string {\n return this.selectData.find(d => d.operator === this.form.get(key)!.value)?.placeholder || this.transloco.translate('drawers.searchWords');\n }\n\n /** Get applied filters for a column */\n getItems(column: string): DropdownItem[] {\n return this.appliedFilters().find(f => f.column === column)?.values || [];\n }\n\n /** add item to current selection */\n addItem(item: DropdownItem, filter: Filter): void {\n const appliedFilter = this.appliedFilters().find(af => af.column === filter.column)!;\n if (!appliedFilter.values.some(v => v.value === item.value)) {\n appliedFilter.values.push(item);\n }\n }\n\n /** remove item from current selection */\n removeItem(item: DropdownItem, filter: Filter): void {\n const appliedFilter = this.appliedFilters().find(af => af.column === filter.column)!;\n appliedFilter.values = appliedFilter.values.filter(v => v.value !== item.value);\n }\n\n /** Update suggestions on input focus */\n setFilterFocus(value: string | null, filter: Filter): void {\n this.currentFilter.set(filter.column);\n this.setSuggestions(value);\n }\n\n /** Update suggestions when typing */\n onInputTyping(value: string | null): void {\n this.setSuggestions(value);\n }\n\n private setSuggestions(value: string | null): void {\n this.suggestions.set([]);\n const filter = this.filters().find(f => f.column === this.currentFilter());\n if (!!value && !!filter && filter.items?.length) {\n this.suggestions.set(this.getSuggestionItems(value.toLowerCase(), filter.items!).map(i => ({ display: i.display, value: String(i.value) })));\n }\n }\n\n private getSuggestionItems(value: string, items: (AggregationItem | TreeAggregationNode)[]): (AggregationItem | TreeAggregationNode)[] {\n const res = items.filter(i => (!!i.display && i.display!.toLowerCase().indexOf(value) !== -1) || String(i.value)?.toLowerCase().indexOf(value) !== -1);\n // todo handle tree items\n return res;\n }\n}\n","<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex h-full flex-col overflow-auto bg-white\">\n <app-drawer-navbar class=\"block border-b border-neutral-300 bg-white\">\n <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n {{ 'drawers.search' | transloco }}\n </button>\n </app-drawer-navbar>\n\n <div class=\"flex h-full flex-grow flex-col overflow-auto\">\n <section class=\"flex flex-col gap-4 p-6\" [formGroup]=\"form\">\n <!-- FIND IN -->\n <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n <select\n id=\"content-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"content-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('content.operator')\"\n formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n <select\n id=\"title-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"location\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInLocation' | transloco }}</span>\n <select\n id=\"location-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"location-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('location.operator')\"\n formControlName=\"value\" />\n </div>\n\n <!-- TABS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }} "{{ currentTab() }}"</h1>\n <div class=\"inline-flex -space-x-px rtl:space-x-reverse\">\n @for (tab of tabs(); track $index) {\n <button\n [variant]=\"tab !== currentTab() ? 'outline' : 'default'\"\n class=\"rounded-none shadow-none first:rounded-s-md last:rounded-e-md\"\n (click)=\"onTabChange(tab)\">\n {{ tab }}\n </button>\n }\n </div>\n\n <!-- FILTERS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n @for (filter of filters(); track $index) {\n <DropdownInput\n [suggestions]=\"suggestions()\"\n [selected]=\"getItems(filter.column)\"\n [label]=\"filter.alias\"\n [placeholder]=\"'drawers.startTyping' | transloco\"\n [noResultLabel]=\"'drawers.noResult' | transloco\"\n (onFocus)=\"setFilterFocus($event, filter)\"\n (onKeyUp)=\"onInputTyping($event)\"\n (removeItem)=\"removeItem($event, filter)\"\n (addItem)=\"addItem($event, filter)\" />\n } @empty {\n {{ 'drawers.noFilters' | transloco }}\n }\n </section>\n </div>\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { Article, CCWebService, fetchSimilarDocuments } from '@sinequa/atomic';\nimport { ButtonComponent, ListItemComponent } from '@sinequa/ui';\n\nimport { MetadataComponent, SourceComponent } from '../../../components';\nimport { SelectArticleOnClickDirective } from '../../../directives';\nimport { ArticleMetadata } from '../../../models';\nimport { PreviewService } from '../../../services';\nimport { AppStore, ApplicationStore, QueryParamsStore, SelectionStore } from '../../../stores';\n\ninterface MetadataNavigation {\n index: number;\n value: string;\n}\n\ntype PreviewWebService = CCWebService & {\n highlights?: string;\n};\n\n@Component({\n selector: 'advanced-search',\n standalone: true,\n providers: [provideTranslocoScope('drawers')],\n templateUrl: './advanced-search.component.html',\n styles: [\n `\n :host {\n /* disable default max-height for panel */\n --panel-max-height: none;\n }\n /* Hides cancel button from input that as type='search' */\n input[type='search']::-webkit-search-cancel-button {\n -webkit-appearance: none;\n }\n `\n ],\n imports: [NgTemplateOutlet, FormsModule, ButtonComponent, MetadataComponent, ListItemComponent, TranslocoPipe, SourceComponent, SelectArticleOnClickDirective]\n})\nexport class AdvancedSearchComponent {\n public readonly article = input.required<Article>();\n\n protected readonly destroyRef = inject(DestroyRef);\n protected readonly labels = inject(AppStore).getLabels();\n protected readonly applicationStore = inject(ApplicationStore);\n protected readonly appStore = inject(AppStore);\n protected readonly selectionStore = inject(SelectionStore);\n protected readonly previewService = inject(PreviewService);\n protected readonly queryParamsStore = inject(QueryParamsStore);\n\n protected readonly input = signal(getState(this.selectionStore).queryText || '');\n protected readonly extracts = computed(() => {\n getState(this.applicationStore);\n\n if (!this.article()) return [];\n\n return this.applicationStore.getExtracts(this.article()!.id);\n });\n readonly similarDocuments = signal<Article[]>([]);\n\n protected readonly previewHighlights = computed(() => {\n const highlights = (this.appStore.getWebServiceByType('preview') as PreviewWebService)?.highlights\n ?.split(',')\n .filter(h => h !== 'extractslocations' && h !== 'matchlocations' && h !== 'matchingpassages');\n\n return highlights?.map(highlight => ({\n name: highlight,\n entity: highlight,\n metadata: (this.article() as any)[highlight]\n }));\n });\n\n public navigation = signal<MetadataNavigation | undefined>(undefined);\n public hovering = signal<string | undefined>(undefined);\n public hoverIndex = computed(() => (this.navigation()?.value === this.hovering() ? this.navigation()!.index : 0));\n\n public readonly hasLabels = computed(() => {\n const article: any = this.article(); // required as any otherwise the lines below won't compile\n const publicLabels: string[] | undefined = article[this.labels.public];\n const privateLabels: string[] | undefined = article[this.labels.private];\n return (publicLabels && publicLabels.length > 0) || (privateLabels && privateLabels.length > 0);\n });\n\n loading = signal(true);\n\n constructor() {\n this.previewService.events.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(event => {\n switch (event) {\n case 'fetching':\n this.loading.set(true);\n break;\n default:\n this.loading.set(false);\n break;\n }\n });\n\n effect(() => {\n const id = this.article().id;\n\n untracked(() => {\n const queryName = this.queryParamsStore.getQuery().name;\n fetchSimilarDocuments(id, queryName).then(res => this.similarDocuments.set(res.data));\n });\n });\n }\n\n protected executeSearch(): void {\n this.selectionStore.update({ queryText: this.input() });\n }\n\n protected clearInput(): void {\n this.input.set('');\n }\n\n scrollTo(type: string | undefined, index: number, usePassageHighlighter: boolean = false) {\n // if previewData contains \"matchingpassages\" then we use the passage highlighter otherwise we use \"extractslocations\"\n const category = type || this.previewService.highlightCategory;\n this.previewService.events.emit('scrollTo');\n this.previewService.sendMessage({ action: 'select', id: `${category}_${index}`, usePassageHighlighter });\n }\n\n navigateNext(entity: string, data: ArticleMetadata) {\n const index = this.navigation()?.value === data.value ? (this.navigation()!.index < data.count! ? this.navigation()!.index + 1 : 1) : 1;\n\n this.navigation.set({\n value: data.value,\n index\n });\n\n const id = this.previewService.getEntityId(entity, data.value, index - 1);\n if (id !== undefined) {\n this.scrollTo(entity, id);\n }\n }\n\n navigatePrev(entity: string, data: ArticleMetadata) {\n const index = this.navigation()?.value === data.value ? (this.navigation()!.index <= 1 ? data.count! : this.navigation()!.index - 1) : data.count!;\n\n this.navigation.set({\n value: data.value,\n index\n });\n\n const id = this.previewService.getEntityId(entity, data.value, index - 1);\n if (id !== undefined) {\n this.scrollTo(entity, id);\n }\n }\n}\n","@if (article()) {\n <div class=\"scroll-stable flex h-screen flex-col overflow-y-auto pb-6 pl-6 pr-3\">\n <section class=\"mb-4 mt-6 flex w-full flex-col gap-6\">\n <header\n id=\"panel-control\"\n class=\"focus-within:outline-primary group flex rounded focus-within:outline hover:outline [&:not(:focus-within)]:hover:outline-neutral-300\">\n <div class=\"flex grow items-center gap-2 rounded-e-none rounded-s bg-neutral-50 pl-2 group-hover:bg-white\">\n <input\n id=\"advanced-search-input\"\n type=\"search\"\n class=\"grow bg-neutral-50 focus:outline-none group-hover:bg-white\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.placeholder]=\"'drawers.inputPlaceholder' | transloco\"\n [attr.aria-label]=\"'drawers.inputPlaceholder' | transloco\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown.enter)=\"executeSearch()\" />\n\n @if (input() !== '') {\n <button\n variant=\"icon\"\n size=\"icon\"\n [attr.title]=\"'clear' | transloco\"\n [attr.aria-label]=\"'clear' | transloco\"\n (click)=\"clearInput()\"\n (keydown.enter)=\"clearInput()\">\n <i class=\"fa-fw far fa-circle-xmark\"></i>\n </button>\n }\n </div>\n\n <button\n size=\"icon\"\n class=\"rounded-e rounded-s-none group-focus-within:rounded-br-none\"\n [disabled]=\"input() === '' || null\"\n [attr.title]=\"'search' | transloco\"\n [attr.aria-label]=\"'search' | transloco\"\n (click)=\"executeSearch()\">\n <i class=\"fa-fw far fa-magnifying-glass\"></i>\n </button>\n </header>\n </section>\n\n <!-- the same name is used everywhere to simulate an accordion -->\n <!-- extracts -->\n <details name=\"advanced-search-panels\" class=\"group border-b border-neutral-300\" open>\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-magnifying-glass\"></i>\n {{ 'extracts' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n @if (loading()) {\n <div class=\"flex h-32 items-center justify-center\">\n <i class=\"fa-fw far fa-spinner-third fa-spin text-primary\"></i>\n </div>\n } @else {\n <ul>\n @for (extract of extracts(); track $index) {\n <li class=\"hover:bg-highlight mr-2 rounded px-2 py-1\" [id]=\"extract.id\" [attr.data-id]=\"extract.textIndex\">\n <p class=\"cursor-pointer\" role=\"button\" [innerHTML]=\"extract.text\" (click)=\"scrollTo(undefined, extract.textIndex, true)\"></p>\n </li>\n\n <li class=\"mr-2 h-[1px] bg-neutral-200 px-2\"></li>\n } @empty {\n <li class=\"text-slate-300\">{{ 'drawers.noRelevantExtracts' | transloco }}</li>\n }\n </ul>\n }\n </details>\n\n <!-- labels -->\n @if (hasLabels()) {\n <details class=\"group border-b border-neutral-300\" name=\"advanced-search-panels\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-tags\"></i>\n {{ 'labels' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n <div>\n <ul class=\"mt-4 flex flex-col flex-wrap gap-2\">\n <li>\n <Metadata variant=\"outline\" [article]=\"article()!\" [metadata]=\"labels.public\" />\n </li>\n\n <li>\n <Metadata variant=\"outline\" [article]=\"article()!\" [metadata]=\"labels.private\" />\n </li>\n </ul>\n </div>\n </details>\n }\n\n <!-- entities -->\n <details name=\"advanced-search-panels\" class=\"group border-b border-neutral-300\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n <i class=\"fa-fw far fa-highlighter\"></i>\n {{ 'entities' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n @for (highlight of previewHighlights(); track $index) {\n @if (highlight.metadata) {\n <ng-container *ngTemplateOutlet=\"metadataPanel; context: highlight\" />\n }\n }\n </details>\n\n <!-- similar documents -->\n @if (similarDocuments().length > 0) {\n <details class=\"group border-b border-neutral-300\" name=\"advanced-search-panels\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-tags\"></i>\n {{ 'drawers.similarDocuments' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n <div>\n <ul class=\"mb-2 mt-4 flex flex-col flex-wrap px-2\" role=\"list\">\n @for (document of similarDocuments(); track $index) {\n <li role=\"listitem\" selectArticleOnClick [article]=\"document\" strategy=\"stack\">\n <div class=\"text-primary flex size-[20px] items-center justify-center rounded-full bg-neutral-50\">\n <source [collection]=\"article().collection\" [connector]=\"article().connector\" class=\"text-xs\" />\n </div>\n\n <span>{{ document.displayTitle ?? document.title }}</span>\n </li>\n }\n </ul>\n </div>\n </details>\n }\n </div>\n}\n\n<!-- entities's template -->\n<ng-template #metadataPanel let-metadata=\"metadata\" let-name=\"name\" let-iconClass=\"iconClass\" let-entity=\"entity\">\n <details name=\"advanced-search-entities\" class=\"group/entities px-3 pb-3\">\n <summary class=\"sticky top-8 flex cursor-pointer select-none items-baseline justify-between bg-white\">\n <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n <i class=\"fa-fw {{ iconClass || 'far fa-list' }}\"></i>\n {{ name | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open/entities:rotate-180\"></i>\n </summary>\n\n <ul role=\"list\">\n @for (data of metadata; track $index) {\n <li role=\"listitem\" class=\"flex justify-between py-1 pl-2\" (mouseenter)=\"hovering.set(data.value)\" (mouseleave)=\"hovering.set(undefined)\">\n <!-- shrink w-1/2 grow truncate ovoid the overlap when hovering the row -->\n <p class=\"w-1/2 shrink grow truncate\">{{ data.display }}</p>\n\n <p class=\"flex items-center gap-2\">\n @if (hovering() === data.value) {\n <i class=\"fa-light fa-chevron-left\" aria-label=\"previous entity\" role=\"button\" (click)=\"navigatePrev(entity, data)\"></i>\n\n <span>{{ hoverIndex() }} / {{ data.count }}</span>\n\n <i class=\"fa-light fa-chevron-right\" aria-label=\"next entity\" role=\"button\" (click)=\"navigateNext(entity, data)\"></i>\n } @else {\n {{ data.count }}\n }\n </p>\n </li>\n }\n </ul>\n </details>\n</ng-template>\n","import { AsyncPipe, NgClass, NgComponentOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n Inject,\n inject,\n InjectionToken,\n Injector,\n input,\n runInInjectionContext,\n signal,\n Type,\n untracked\n} from '@angular/core';\nimport { getState } from '@ngrx/signals';\nimport { firstValueFrom } from 'rxjs';\n\nimport { Article, CCApp, error, globalConfig, notify, PreviewData } from '@sinequa/atomic';\nimport { PreviewService } from '../../../services';\nimport { AppStore, QueryParamsStore, SelectionStore } from '../../../stores';\nimport { signIn } from '../../../utils';\nimport { AdvancedSearchComponent } from '../advanced-search/advanced-search.component';\nimport { DrawerComponent } from '../drawer.component';\nimport { DrawerService } from '../drawer.service';\n\nexport type DocumentTypeMap = {\n documentType: string;\n articleComponent: Type<unknown>;\n previewComponent: Type<unknown>;\n};\n\nexport const COMPONENTS_FOR_DOCUMENT_TYPE = new InjectionToken<(documentType?: string) => DocumentTypeMap>('COMPONENTS_FOR_DOCUMENT_TYPE');\n\nconst GLOBAL_QUERY_NAME = new InjectionToken<string>('GLOBAL_QUERY_NAME', {\n factory() {\n const appStore = inject(AppStore);\n const { queries } = getState(appStore) as CCApp;\n\n if (!queries) return '';\n\n const array = Object.entries(queries).map(([key, value]) => ({ key, ...value }));\n\n return array[0].name;\n }\n});\n\n@Component({\n selector: 'app-drawer-preview',\n standalone: true,\n imports: [NgClass, NgComponentOutlet, AsyncPipe, AdvancedSearchComponent],\n providers: [DrawerService, PreviewService],\n templateUrl: './drawer-preview.component.html',\n styleUrl: './drawer-preview.component.css'\n})\nexport class DrawerPreviewComponent extends DrawerComponent {\n injector = inject(Injector);\n appStore = inject(AppStore);\n selectionStore = inject(SelectionStore);\n queryParamsStore = inject(QueryParamsStore);\n previewService = inject(PreviewService);\n\n getComponentsForDocumentType = inject(COMPONENTS_FOR_DOCUMENT_TYPE);\n\n queryText = computed(() => {\n const { queryText } = getState(this.selectionStore);\n const { text } = getState(this.queryParamsStore);\n return queryText ?? text;\n });\n\n public readonly articleId = input.required<string>();\n\n public readonly previewData = signal<PreviewData | undefined>(undefined);\n public readonly article = computed(() => this.previewData()?.record as Article);\n\n public readonly inputs = computed(() => ({ previewData: this.previewData() }));\n public readonly previewType = computed(() => {\n return this.getComponentsForDocumentType(this.article()?.docformat || '').previewComponent;\n });\n\n constructor(\n @Inject(GLOBAL_QUERY_NAME) private readonly globalQueryName: string,\n private destroyRef: DestroyRef\n ) {\n super();\n\n this.destroyRef.onDestroy(() => {\n this.previewService.close(this.articleId(), { name: this.globalQueryName });\n });\n\n effect(() => {\n const articleId = this.articleId();\n const text = this.queryText();\n\n untracked(async () => {\n const state = getState(this.selectionStore);\n try {\n const previewData = await firstValueFrom(\n this.previewService.preview(\n articleId,\n {\n name: this.globalQueryName,\n text\n },\n state.previewHighlights?.highlights\n )\n );\n this.previewData.set(previewData);\n } catch (err: any) {\n this.previewData.set(undefined);\n if (err.status === 401) {\n error('preview service 401: ', err);\n this.drawerStack.close();\n runInInjectionContext(this.injector, () =>\n signIn().then(() => {\n const { useCredentials } = globalConfig;\n if (!useCredentials) {\n notify.success('You have been signed in.');\n }\n })\n );\n } else {\n error('Error fetching preview data:', err);\n throw err;\n }\n }\n });\n });\n }\n}\n","<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex overflow-auto bg-white\">\n <div\n #drawerHandle\n class=\"fixed h-full w-[5px] select-none hover:cursor-ew-resize hover:bg-orange-300\"\n [ngClass]=\"{ hidden: (drawer.isExtended | async) === false }\"></div>\n\n @if (previewType()) {\n <ng-container *ngComponentOutlet=\"previewType()!; inputs: inputs()\" />\n }\n</div>\n\n@if (article()) {\n <div class=\"flex flex-col border-l border-gray-200 bg-white\">\n <div class=\"relative flex grow flex-col\">\n <advanced-search class=\"absolute h-full w-full overflow-y-auto\" [article]=\"article()!\" (close)=\"drawer.collapse()\" />\n </div>\n </div>\n}\n","/*\n * Public API Surface of atomic\n */\nexport * from './components';\nexport * from './directives';\nexport * from './guards';\nexport * from './interceptors';\nexport * from './models';\nexport * from './pipes';\nexport * from './resolvers';\nexport * from './resources';\nexport * from './services';\nexport * from './stores';\nexport * from './tokens';\nexport * from './utils';\n\n/* features */\nexport * from './features/recent-searches/recent-searches';\n\nexport * from './features/saved-searches/saved-searches';\nexport * from './features/saved-searches/saved-search.dialog';\n\nexport * from './features/bookmarks/bookmark-button';\nexport * from './features/bookmarks/bookmarks';\n\nexport * from './features/collections/collections';\nexport * from './features/collections/dialogs/add.dialog';\nexport * from './features/collections/dialogs/delete.dialog';\n\nexport * from './features/alerts/alerts';\nexport * from './features/alerts/dialogs/alert.dialog';\n\nexport * from './features/dialogs/override-user.dialog';\nexport * from './features/dialogs/reset-user-settings.dialog';\n\nexport * from './features/did-you-mean/did-you-mean';\nexport * from './features/sign-in/sign-in';\n\nexport * from './features/export/export.service';\nexport * from './features/export/dialogs/export.dialog';\n\nexport * from './features/labels/label.service';\nexport * from './features/labels/multiselect-labels';\nexport * from './features/labels/dialogs/edit.dialog';\n\nexport * from './features/feedback/feedback';\nexport * from './features/feedback/dialogs/feedback.dialog';\n\nexport * from './features/filters/filters-bar.component';\nexport * from './features/filters/aggregation/aggregation.component';\nexport * from './features/filters/aggregation/date/date.component';\nexport * from './features/filters/buttons/filter-button.component';\nexport * from './features/filters/more/more-button.component';\nexport * from './features/filters/more/more.component';\nexport * from './features/filters/filters.models';\n\nexport * from './features/drawer-stack/drawer-stack.component';\nexport * from './features/drawer-stack/drawer-stack.service';\n\nexport * from './features/drawer/drawer.service';\nexport * from './features/drawer/drawer.component';\nexport * from './features/drawer/advanced-filters/advanced-filters.component';\nexport * from './features/drawer/advanced-search/advanced-search.component';\nexport * from './features/drawer/navbar/drawer-navbar.component';\nexport * from './features/drawer/preview/drawer-preview.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["catchError","i1"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sinequa-atomic-angular.mjs","sources":["../../../projects/atomic-angular/src/components/deprecated/dropdown-list.ts","../../../projects/atomic-angular/src/components/deprecated/dropdown-input.ts","../../../projects/atomic-angular/src/components/backdrop/backdrop.service.ts","../../../projects/atomic-angular/src/components/backdrop/backdrop.component.ts","../../../projects/atomic-angular/src/stores/aggregations.store.ts","../../../projects/atomic-angular/src/services/app.service.ts","../../../projects/atomic-angular/src/stores/app.store.ts","../../../projects/atomic-angular/src/stores/application.store.ts","../../../projects/atomic-angular/src/services/principal.service.ts","../../../projects/atomic-angular/src/stores/principal.store.ts","../../../projects/atomic-angular/src/utils/debounced-signal.ts","../../../projects/atomic-angular/src/utils/inline-worker.ts","../../../projects/atomic-angular/src/utils/query.ts","../../../projects/atomic-angular/src/utils/routes.ts","../../../projects/atomic-angular/src/utils/theme-body-hook.ts","../../../projects/atomic-angular/src/resources/themes.ts","../../../projects/atomic-angular/src/utils/theme-registry.ts","../../../projects/atomic-angular/src/services/query.service.ts","../../../projects/atomic-angular/src/services/aggregations.service.ts","../../../projects/atomic-angular/src/guards/auth.guard.ts","../../../projects/atomic-angular/src/stores/user-settings/helpers.ts","../../../projects/atomic-angular/src/stores/user-settings/with-alerts.ts","../../../projects/atomic-angular/src/stores/user-settings/with-assistant.ts","../../../projects/atomic-angular/src/stores/user-settings/with-baskets.ts","../../../projects/atomic-angular/src/stores/user-settings/with-bookmarks.ts","../../../projects/atomic-angular/src/stores/user-settings/with-recent-searches.ts","../../../projects/atomic-angular/src/stores/user-settings/with-saved-searches.ts","../../../projects/atomic-angular/src/stores/user-settings/with-user-settings.ts","../../../projects/atomic-angular/src/stores/user-settings/user-settings.store.ts","../../../projects/atomic-angular/src/services/application.service.ts","../../../projects/atomic-angular/src/services/audit.service.ts","../../../projects/atomic-angular/src/services/autocomplete.service.ts","../../../projects/atomic-angular/src/services/json-method-plugin.service.ts","../../../projects/atomic-angular/src/services/navigation.service.ts","../../../projects/atomic-angular/src/tokens/app-features.ts","../../../projects/atomic-angular/src/tokens/highlights.ts","../../../projects/atomic-angular/src/services/preview.service.ts","../../../projects/atomic-angular/src/services/saved-searches.service.ts","../../../projects/atomic-angular/src/services/search.service.ts","../../../projects/atomic-angular/src/stores/selection.store.ts","../../../projects/atomic-angular/src/services/selection.service.ts","../../../projects/atomic-angular/src/services/selection-history.service.ts","../../../projects/atomic-angular/src/services/text-chunk.service.ts","../../../projects/atomic-angular/src/utils/sign-in.ts","../../../projects/atomic-angular/src/utils/bootstrap-app.ts","../../../projects/atomic-angular/src/stores/query-params.store.ts","../../../projects/atomic-angular/src/stores/theme.store.ts","../../../projects/atomic-angular/src/components/source/source.component.ts","../../../projects/atomic-angular/src/components/source/source.component.html","../../../projects/atomic-angular/src/components/document-locator/document-locator.component.ts","../../../projects/atomic-angular/src/components/error/error.component.ts","../../../projects/atomic-angular/src/components/loading/loading.component.ts","../../../projects/atomic-angular/src/components/metadata/metadata.ts","../../../projects/atomic-angular/src/components/missing-terms/missing-terms.component.ts","../../../projects/atomic-angular/src/components/missing-terms/missing-terms.component.html","../../../projects/atomic-angular/src/features/collections/dialogs/add.dialog.ts","../../../projects/atomic-angular/src/features/export/export.service.ts","../../../projects/atomic-angular/src/features/export/dialogs/export.dialog.ts","../../../projects/atomic-angular/src/components/multi-selection-toolbar/multi-selection-toolbar.ts","../../../projects/atomic-angular/src/directives/infinite-scroll.directive.ts","../../../projects/atomic-angular/src/directives/keyboard-navigator.directive.ts","../../../projects/atomic-angular/src/directives/open-article-on-ctrl-enter.directive.ts","../../../projects/atomic-angular/src/directives/overflow-manager.directive.ts","../../../projects/atomic-angular/src/features/drawer-stack/drawer-stack.service.ts","../../../projects/atomic-angular/src/directives/select-article-on-click.directive.ts","../../../projects/atomic-angular/src/directives/show-bookmark.directive.ts","../../../projects/atomic-angular/src/directives/theme-provider.directive.ts","../../../projects/atomic-angular/src/directives/child-marker.directive.ts","../../../projects/atomic-angular/src/pipes/highlight-word.pipe.ts","../../../projects/atomic-angular/src/pipes/source-icon.pipe.ts","../../../projects/atomic-angular/src/pipes/operator.ts","../../../projects/atomic-angular/src/pipes/syslang.ts","../../../projects/atomic-angular/src/pipes/transloco-date.pipe.ts","../../../projects/atomic-angular/src/components/navbar-tabs/navbar-tabs.components.ts","../../../projects/atomic-angular/src/components/no-result/no-result.ts","../../../projects/atomic-angular/src/components/pagination/pager.component.ts","../../../projects/atomic-angular/src/components/search/search-input.ts","../../../projects/atomic-angular/src/components/sort-selector/sort-selector.ts","../../../projects/atomic-angular/src/components/sort-selector/sort-selector.html","../../../projects/atomic-angular/src/components/sponsored-results/sponsored-results.component.ts","../../../projects/atomic-angular/src/components/theme/theme-selector.component.ts","../../../projects/atomic-angular/src/components/theme/theme-toggle.component.ts","../../../projects/atomic-angular/src/interceptors/audit.interceptor.ts","../../../projects/atomic-angular/src/interceptors/auth.interceptor.ts","../../../projects/atomic-angular/src/interceptors/body.interceptor.ts","../../../projects/atomic-angular/src/interceptors/error.interceptor.ts","../../../projects/atomic-angular/src/interceptors/toast.interceptor.ts","../../../projects/atomic-angular/src/interceptors/index.ts","../../../projects/atomic-angular/src/models/user-settings.ts","../../../projects/atomic-angular/src/resolvers/query-name-resolver.ts","../../../projects/atomic-angular/src/features/searches/search-footer.ts","../../../projects/atomic-angular/src/features/searches/search-header.ts","../../../projects/atomic-angular/src/features/searches/search-list.ts","../../../projects/atomic-angular/src/features/recent-searches/recent-searches.ts","../../../projects/atomic-angular/src/features/saved-searches/saved-searches.ts","../../../projects/atomic-angular/src/features/saved-searches/saved-search.dialog.ts","../../../projects/atomic-angular/src/features/bookmarks/bookmark-button.ts","../../../projects/atomic-angular/src/features/bookmarks/bookmarks.ts","../../../projects/atomic-angular/src/features/bookmarks/bookmarks.html","../../../projects/atomic-angular/src/features/collections/dialogs/delete.dialog.ts","../../../projects/atomic-angular/src/features/collections/collections.ts","../../../projects/atomic-angular/src/features/collections/collections.html","../../../projects/atomic-angular/src/features/alerts/dialogs/alert.dialog.ts","../../../projects/atomic-angular/src/features/alerts/alerts.ts","../../../projects/atomic-angular/src/features/alerts/alerts.html","../../../projects/atomic-angular/src/features/dialogs/override-user.dialog.ts","../../../projects/atomic-angular/src/features/dialogs/reset-user-settings.dialog.ts","../../../projects/atomic-angular/src/features/did-you-mean/did-you-mean.ts","../../../projects/atomic-angular/src/features/did-you-mean/did-you-mean.html","../../../projects/atomic-angular/src/features/sign-in/sign-in.ts","../../../projects/atomic-angular/src/features/sign-in/sign-in.html","../../../projects/atomic-angular/src/features/labels/label.service.ts","../../../projects/atomic-angular/src/features/labels/multiselect-labels.ts","../../../projects/atomic-angular/src/features/labels/dialogs/edit.dialog.ts","../../../projects/atomic-angular/src/features/feedback/dialogs/feedback.dialog.ts","../../../projects/atomic-angular/src/features/feedback/feedback.ts","../../../projects/atomic-angular/src/features/feedback/feedback.html","../../../projects/atomic-angular/src/features/filters/aggregation/aggregation-item.component.ts","../../../projects/atomic-angular/src/features/filters/aggregation/aggregation-item.component.html","../../../projects/atomic-angular/src/features/filters/aggregation/aggregation.component.ts","../../../projects/atomic-angular/src/features/filters/aggregation/aggregation.component.html","../../../projects/atomic-angular/src/features/filters/aggregation/date/date.component.ts","../../../projects/atomic-angular/src/features/filters/aggregation/date/date.component.html","../../../projects/atomic-angular/src/features/filters/buttons/filter-button.component.ts","../../../projects/atomic-angular/src/features/filters/filters.models.ts","../../../projects/atomic-angular/src/features/filters/more/more.component.ts","../../../projects/atomic-angular/src/features/filters/more/more-button.component.ts","../../../projects/atomic-angular/src/features/filters/filters-bar.component.ts","../../../projects/atomic-angular/src/features/drawer-stack/drawer-stack.component.ts","../../../projects/atomic-angular/src/features/drawer/drawer.service.ts","../../../projects/atomic-angular/src/features/drawer/drawer.component.ts","../../../projects/atomic-angular/src/features/drawer/navbar/drawer-navbar.component.ts","../../../projects/atomic-angular/src/features/drawer/navbar/drawer-navbar.component.html","../../../projects/atomic-angular/src/features/drawer/advanced-filters/advanced-filters.component.ts","../../../projects/atomic-angular/src/features/drawer/advanced-filters/advanced-filters.component.html","../../../projects/atomic-angular/src/features/drawer/advanced-search/advanced-search.component.ts","../../../projects/atomic-angular/src/features/drawer/advanced-search/advanced-search.component.html","../../../projects/atomic-angular/src/features/drawer/preview/drawer-preview.component.ts","../../../projects/atomic-angular/src/features/drawer/preview/drawer-preview.component.html","../../../projects/atomic-angular/src/public-api.ts","../../../projects/atomic-angular/src/sinequa-atomic-angular.ts"],"sourcesContent":["import { Component, input, output } from '@angular/core';\nimport { DropdownItem } from './dropdown-input';\n\n@Component({\n selector: 'dropdown-list, DropdownList',\n standalone: true,\n template: `\n @for (item of items(); track $index) {\n <span class=\"bg-primary text-primary-foreground m-1 inline-flex cursor-default select-none items-center rounded-full px-2 py-1 text-sm font-semibold\">\n {{ item.display || item.value }}\n <svg\n (click)=\"onClick.emit(item)\"\n xmlns=\"http://www.w3.org/2000/svg\"\n class=\"ml-2 cursor-pointer\"\n width=\"16\"\n height=\"16\"\n fill=\"none\"\n viewBox=\"0 0 16 16\"\n aria-hidden=\"true\">\n <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" />\n <line x1=\"5\" y1=\"5\" x2=\"11\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n <line x1=\"11\" y1=\"5\" x2=\"5\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </svg>\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, DropdownContentComponent } from '@sinequa/ui';\n\nimport { DropdownListComponent } from './dropdown-list';\n\nexport interface DropdownItem {\n display?: string;\n value: string;\n}\n\n@Component({\n selector: 'dropdown-input, DropdownInput',\n standalone: true,\n imports: [DropdownComponent, DropdownListComponent, DropdownContentComponent],\n template: `\n @if (label()) {\n <p class=\"font-semibold\">{{ label() }}</p>\n }\n <Dropdown class=\"block w-full\">\n <input\n #searchInput\n class=\"w-1/2 grow rounded border border-neutral-200 p-2 focus:outline-none group-hover:bg-white\"\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 <DropdownList class=\"mb-4\" [items]=\"selected()\" (onClick)=\"removeItem.emit($event)\" />\n\n <DropdownContent class=\"mt-[-1.5rem] w-max\">\n @if (!suggestions().length) {\n {{ noResultLabel() }}\n } @else {\n <ul class=\"data-list-xs my-2 max-h-44 flex-grow overflow-auto\">\n @for (suggestion of suggestions(); track $index) {\n <li class=\"data-list-item flex cursor-pointer items-baseline gap-2 p-2\" (click)=\"addItem.emit(suggestion)\">\n {{ suggestion.display || suggestion.value }}\n </li>\n }\n </ul>\n }\n </DropdownContent>\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 { 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 { Component, HostBinding, OnDestroy, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { BackdropService } from './backdrop.service';\n\n@Component({\n selector: 'app-backdrop',\n standalone: true,\n imports: [],\n template: ``,\n host: {\n class: 'z-[var(--z-backdrop)] bg-backdrop absolute bottom-0 left-0 right-0 top-0 hidden select-none'\n },\n styles: [\n `\n :host {\n --backdrop-animation-duration: 250ms;\n\n animation: hide-backdrop var(--backdrop-animation-duration, 250ms) ease-out;\n\n &[backdrop-visible='true'] {\n display: block;\n animation: show-backdrop var(--backdrop-animation-duration, 250ms) ease-out;\n }\n\n @keyframes show-backdrop {\n 0% {\n display: none;\n opacity: 0;\n }\n 1% {\n display: block;\n }\n 100% {\n opacity: 1;\n }\n }\n\n @keyframes hide-backdrop {\n 0% {\n display: block;\n opacity: 1;\n }\n 99% {\n opacity: 0;\n }\n 100% {\n display: none;\n }\n }\n }\n `\n ]\n})\nexport class BackdropComponent implements OnDestroy {\n @HostBinding('attr.backdrop-visible')\n public backdropVisible: boolean = false;\n\n private readonly backdrop = inject(BackdropService);\n private readonly sub = new Subscription();\n\n constructor() {\n this.sub.add(this.backdrop.isVisible.subscribe(state => (this.backdropVisible = state)));\n }\n\n ngOnDestroy(): void {\n this.sub.unsubscribe();\n }\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { getState, patchState, signalStore, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\n\nimport { Aggregation } from '@sinequa/atomic';\n\nexport type AggregationsState = {\n aggregations: Aggregation[];\n};\n\nexport const AggregationsStore = signalStore(\n // providing store at the root level\n { providedIn: 'root' },\n withDevtools('Aggregations'),\n\n withAggregationsFeatures()\n);\n\nexport function withAggregationsFeatures() {\n return signalStoreFeature(\n withState({ aggregations: [] as Aggregation[] } as AggregationsState),\n withMethods(store => ({\n /**\n * Updates the state with the provided aggregations.\n *\n * @param {Aggregation[]} aggregations - The new aggregations to update the state with.\n */\n update(aggregations: Aggregation[]) {\n patchState(store, state => {\n return { ...state, aggregations };\n });\n },\n /**\n * Updates an existing aggregation in the store.\n *\n * @param aggregation - The aggregation object to update.\n * @returns void\n */\n updateAggregation(aggregation: Aggregation) {\n patchState(store, state => {\n // aggregation name/column lookup must be case insensitive\n const index = state.aggregations.findIndex(a => a.name.toLocaleLowerCase() === aggregation.name.toLocaleLowerCase());\n if (index !== -1) {\n state.aggregations[index] = aggregation;\n }\n return { ...state };\n });\n },\n /**\n * Clears the aggregations in the store by setting the `aggregations` property to an empty array.\n *\n * @remarks\n * This method uses the `patchState` function to update the state of the store.\n */\n clear() {\n patchState(store, state => {\n return { ...state, aggregations: [] };\n });\n },\n\n /**\n * Retrieves an aggregation object from the store based on the specified name and kind.\n * The lookup is case-insensitive and can be performed either by the aggregation's column or name.\n *\n * @param name - The name of the aggregation to search for.\n * @param kind - The type of lookup to perform.\n * Use 'column' to search by the aggregation's column, or 'name' to search by its name.\n * Defaults to 'name'.\n * @returns The matching aggregation object if found, otherwise `undefined`.\n */\n getAggregation(name: string, kind: 'column' | 'name' = 'name') {\n // aggregation name/column lookup must be case insensitive\n const aggregations = store.aggregations();\n if (!aggregations) return undefined;\n\n return aggregations.find(aggregation =>\n kind === 'column'\n ? aggregation.column?.toLocaleLowerCase() === name.toLocaleLowerCase()\n : aggregation.name.toLocaleLowerCase() === name.toLocaleLowerCase()\n );\n }\n }))\n );\n}\n","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { catchError, EMPTY, Observable } from 'rxjs';\n\nimport { CCApp, globalConfig } from '@sinequa/atomic';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AppService {\n protected readonly http = inject(HttpClient);\n\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n /**\n * Retrieves the application configuration from the server.\n *\n * @param appName - The name of the application to fetch the configuration for.\n *\n * @returns {Observable<CCApp>} An observable that emits the application configuration.\n *\n * @remarks\n * This method constructs an HTTP GET request to fetch the application configuration\n * using the `app` parameter from the global configuration. If the request fails,\n * it logs the error to the console and returns an empty observable.\n *\n * @example\n * ```typescript\n * appService.getApp().subscribe(appConfig => {\n * console.log(appConfig);\n * });\n * ```\n */\n getApp(appName?: string): Observable<CCApp> {\n const app = appName || globalConfig.app;\n\n const params = new HttpParams().set('app', app || '');\n\n return this.http.get<CCApp>(this.API_URL + '/app', { params }).pipe(\n catchError(error => {\n console.error('AppService.getApp failure - error: ', error);\n return EMPTY;\n })\n );\n }\n}\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 { catchError, firstValueFrom, map } from 'rxjs';\n\nimport { Aggregation, CCApp, CCColumn, CCQuery, CCWebService, EngineType } from '@sinequa/atomic';\n\nimport { CFilter, CFilterItem, CJsonMint, CSources, SideCJson } from '../models/custom-json';\nimport { AppService } from '../services/app.service';\nimport { AggregationsStore } from './aggregations.store';\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',\n 'Sources',\n 'Company',\n 'People',\n 'Formats',\n 'Modified',\n 'Dates',\n 'Sizes',\n 'Languages',\n 'Concepts',\n 'DocFormat',\n 'Geo',\n 'Person',\n 'Treepath',\n 'DocumentLanguages',\n '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(\n appService.getApp().pipe(\n catchError(error => {\n console.error('Error fetching app data:', error);\n throw error;\n }),\n map(app => patchState(store, app))\n )\n );\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()).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 * Determines whether labels are allowed by checking the presence of\n * both private and public label fields in the 'labels' web service.\n *\n * @returns {boolean} `true` if both `privateLabelsField` and `publicLabelsField`\n * are defined in the 'labels' web service; otherwise, `false`.\n */\n allowLabels(): boolean {\n const labels = this.getWebServiceByType('labels') as CCWebServiceLabels;\n return labels?.privateLabelsField !== undefined && labels?.publicLabelsField !== undefined;\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 * Retrieves a column definition from the application's state schema by its name.\n *\n * @param column - The name of the column to retrieve.\n * @returns The column definition as a `CCColumn` object if found, or `undefined` if the column does not exist.\n */\n getColumn(column: string): CCColumn | undefined {\n const state = getState(store) as CCApp;\n const schema = state.indexes?.['_']?.columns as Record<string, CCColumn>;\n return schema[column];\n },\n /**\n * Determines if the specified column is of a date-related type.\n *\n * This method checks if the column's type matches one of the following:\n * - `EngineType.date`\n * - `EngineType.dateTime`\n * - `EngineType.time`\n *\n * @param column - The name of the column to check.\n * @returns `true` if the column is of a date-related type; otherwise, `false`.\n */\n isDateColumn(column: string): boolean {\n const col = this.getColumn(column);\n if (col) {\n return col.eType === EngineType.date || col.eType === EngineType.dateTime || col.eType === EngineType.time;\n }\n return false;\n },\n /**\n * Checks if the specified query name corresponds to a tab search.\n * A tab search is defined by the presence of an active tab search configuration\n * with at least one tab defined in the query.\n *\n * @param queryName - The name of the query to check.\n * @returns `true` if the query is a tab search; otherwise, `false`.\n */\n isTabSearch(queryName: string): boolean {\n const query = this.getQueryByName(queryName);\n if (!query) return false;\n const tabSearch = query.tabSearch;\n return !(!tabSearch || !tabSearch.column || !tabSearch.isActive || !tabSearch.tabs || tabSearch.tabs.length === 0);\n },\n /**\n * Retrieves the aggregation count for a specific query and aggregation name.\n * If the count is not defined, it defaults to 10.\n *\n * @param queryName - The name of the query to retrieve the aggregation from.\n * @param aggregationName - The name of the aggregation to retrieve the count for.\n * @returns The count of the specified aggregation, or 10 if not defined.\n */\n getAggregationCount(queryName: string | undefined, aggregationName: string): number {\n if (!queryName) {\n // If queryName is not provided, return the default count\n return 10; // Default to 10 if queryName is not defined\n }\n // If queryName is provided, retrieve the query and its aggregation count\n const query = this.getQueryByName(queryName);\n const agg = query?.aggregations.find(aggregation => aggregation.name === aggregationName);\n return agg ? agg.count : 10; // Default to 10 if count is not defined\n }\n })),\n withMethods((store, aggregationsStore = inject(AggregationsStore), aggregationsNames = inject(AGGREGATIONS_NAMES)) => ({\n /**\n * Retrieves the sorted aggregations based on the query name included in the route data.\n * @param route - The route including the query name to fetch the aggregations for.\n * @returns An array of sorted aggregations.\n */\n getAuthorizedFilters(route: ActivatedRoute) {\n // Get the query name from the route data or use the default query name\n const { queryName = store.getDefaultQuery()?.name } = route.snapshot.data;\n const { aggregations = [] } = store.getQueryByName(queryName) || ({} as CCQuery);\n\n // when no results are returned, the aggregations may be not available\n const currentAggregations = aggregationsStore.aggregations()?.filter(aggregation => aggregationsNames.includes(aggregation.name.trim())) || [];\n\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 currentAggregations.toSorted(\n (a: Aggregation, b: Aggregation) => queryAggregationsOrder.indexOf(a.name) - queryAggregationsOrder.indexOf(b.name)\n );\n }\n // return the default order\n return currentAggregations;\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 // Helper function to parse JSON data with common error handling and fallback to default customJSONs\n const parseCustomJson = <T>(jsonName: string, defaultValue: T): T => {\n // Check if customJSONs is defined and is an array\n // If not, return the default value or the value from the main data object\n if (customJSONs() === undefined || Array.isArray(customJSONs()) === false) {\n return (data() as CJsonMint)[jsonName] || defaultValue;\n }\n\n // Find the custom JSON by name, ignoring case\n // If not found, return the default value or the value from the main data object\n const json = customJSONs()?.find(json => json.name.toLocaleLowerCase() === jsonName);\n if (json === undefined) {\n return (data() as CJsonMint)[jsonName] || defaultValue;\n }\n\n try {\n // Parse the JSON data\n const parsedData = typeof json?.data === 'string' ? JSON.parse(json.data) : json?.data || defaultValue;\n // If parsedData is a plain empty object ({}), treat it as null/undefined\n if (\n parsedData &&\n typeof parsedData === 'object' &&\n !Array.isArray(parsedData) &&\n Object.getPrototypeOf(parsedData) === Object.prototype &&\n Object.entries(parsedData).length === 0\n ) {\n return (data() as CJsonMint)[jsonName] ?? defaultValue;\n }\n return parsedData ?? (data() as CJsonMint)[jsonName] ?? defaultValue;\n } catch (error) {\n console.error(`Error parsing ${jsonName} JSON:`, error);\n return (data() as CJsonMint)[jsonName] ?? defaultValue;\n }\n };\n\n return {\n customizationJson: computed(() => data() as CJsonMint),\n sources: computed(() => parseCustomJson<CSources>('sources', {})),\n filters: computed(() => parseCustomJson<CFilter[]>('filters', [])),\n general: computed(() => parseCustomJson<CJsonMint['general']>('general', {})),\n assistants: computed(() => parseCustomJson<Record<string, any>>('assistants', {}))\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.toLocaleLowerCase() === name.toLocaleLowerCase());\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.toLocaleLowerCase() === column.toLocaleLowerCase();\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.toLocaleLowerCase() === column.toLocaleLowerCase();\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.toLocaleLowerCase() === column.toLocaleLowerCase();\n\n // Check if the filters custom JSON file is available in the store\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 * Determines whether a specific assistant is allowed based on its presence and configuration in the store.\n *\n * @param assistantName - The name of the assistant to check.\n * @returns `true` if the assistant exists in the store and has a defined `service_id` in its `defaultValues`; otherwise, `false`.\n */\n isAssistantAllowed(assistantName: string): boolean {\n const assistants = store.assistants();\n if (assistants === undefined || Object.keys(assistants).length === 0) return false;\n return assistants[assistantName]?.['defaultValues']?.['service_id'];\n }\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 interface ApplicationState {\n ready: 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({ ready: false }),\n\n withMethods(store => ({\n update(state: Partial<ApplicationState>) {\n patchState(store, currentState => ({ ...currentState, ...state }));\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 );\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';\nimport { Injectable, inject } from '@angular/core';\nimport { EMPTY, Observable, catchError } from 'rxjs';\n\nimport { Principal, globalConfig } from '@sinequa/atomic';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PrincipalService {\n protected readonly http = inject(HttpClient);\n\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n /**\n * Retrieves the principal information from the server.\n *\n * @returns Observable<Principal> An observable that emits the principal information.\n *\n * @remarks\n * This method sends a GET request to the API endpoint to fetch the principal data.\n * It includes query parameters to specify the action and to indicate that no authentication is required.\n * In case of an error, it logs the error to the console and returns an empty observable.\n *\n * @example\n * ```typescript\n * principalService.getPrincipal().subscribe(principal => {\n * console.log(principal);\n * });\n * ```\n */\n getPrincipal(): Observable<Principal> {\n const params = new HttpParams().set('action', 'get');\n params.append('noAuthentication', 'true');\n\n return this.http.get<Principal>(this.API_URL + '/principal', { params }).pipe(\n catchError(error => {\n console.error('PrincipalService.getPrincipal failure - error: ', error);\n return EMPTY;\n })\n );\n }\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { computed, inject } from '@angular/core';\nimport { patchState, signalStore, signalStoreFeature, withComputed, withMethods, withState } from '@ngrx/signals';\nimport { firstValueFrom, map } from 'rxjs';\n\nimport { Principal, globalConfig } from '@sinequa/atomic';\n\nimport { PrincipalService } from '../services/principal.service';\n\nexport type PrincipalState = {\n principal: Principal;\n userOverrideActive: boolean;\n};\n\nexport const PrincipalStore = signalStore(\n { providedIn: 'root' },\n withDevtools('Principal'),\n\n withState({ principal: {}, userOverrideActive: false } as PrincipalState),\n withComputed(({ principal, userOverrideActive }) => ({\n allowUserOverride: computed(() => principal().isAdministrator && userOverrideActive() === false),\n isOverridingUser: computed(() => userOverrideActive() === true)\n })),\n\n withPrincipalFeatures()\n);\n\n/**\n * Enhances the store with principal-related features.\n *\n * This function integrates state, methods, and computed properties related to the principal.\n *\n * @returns A feature that can be added to a signal store.\n *\n * @feature\n * - State:\n * - `principal`: An object representing the principal.\n * - `userOverrideActive`: A boolean indicating if user override is active.\n *\n * - Methods:\n * - `initialize()`: Initializes the principal state by fetching the principal data from the `PrincipalService`.\n *\n * - Computed Properties:\n * - `allowUserOverride`: A computed boolean indicating if user override is allowed based on the principal's administrator status and the `userOverrideActive` state.\n * - `isOverridingUser`: A computed boolean indicating if the user override is currently active.\n */\nexport function withPrincipalFeatures() {\n return signalStoreFeature(\n withMethods((store, principalService = inject(PrincipalService)) => ({\n /**\n * Initializes the principal store by fetching the principal data from the principal service.\n * It patches the store with the fetched principal data and a user override active flag from the global configuration.\n *\n * @returns A promise that resolves when the principal data has been fetched and the store has been patched.\n */\n initialize() {\n return firstValueFrom(\n principalService.getPrincipal().pipe(\n map(principal => {\n const { userOverrideActive = false } = globalConfig;\n patchState(store, { principal, userOverrideActive });\n })\n )\n );\n }\n }))\n );\n}\n","import { effect, signal, Signal } from '@angular/core';\n\n/**\n * Creates a debounced signal that updates its value after a specified timeout.\n *\n * @template T - The type of the signal value.\n * @param Signal<T> input - The input signal whose value will be debounced.\n * @param number [timeOutMs=0] - The debounce timeout in milliseconds. Defaults to 0.\n * @returns Signal<T> - A new signal that updates its value after the specified debounce timeout.\n *\n * @example\n * ```ts\n * const input = signal('');\n * const debounced = debouncedSignal(input, 1000);\n *\n * contructor() {\n * effect(() => {\n * console.log(debounced());\n * // will log the input value after 1 second of inactivity.\n * });\n * }\n * ...\n * <input [ngModel]=\"input()\" (ngModelChange)=\"input.set($event)\">\n * ```\n */\nexport function debouncedSignal<T>(input: Signal<T>, timeOutMs = 0): Signal<T> {\n const debounceSignal = signal(input());\n let timeout: any;\n effect(onCleanUp => {\n const value = input();\n clearTimeout(timeout);\n timeout = setTimeout(() => {\n debounceSignal.set(value);\n }, timeOutMs);\n onCleanUp(() => clearTimeout(timeout));\n });\n return debounceSignal;\n}\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\n .toString()\n .replace(/^[^{]*{\\s*/, '')\n .replace(/\\s*}[^}]*$/, '');\n\n try {\n this.worker = new Worker(URL.createObjectURL(new Blob([functionBody], { type: 'text/javascript' })));\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 } 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}\n","import { assertInInjectionContext, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { getQueryParamsFromUrl, Query } from '@sinequa/atomic';\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, n } = 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 || {};\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 params = getQueryParamsFromUrl(window.location.toString());\n const name = query?.name || getQueryNameFromRoute() || params?.name;\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","import { assertInInjectionContext, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\n/**\n * Retrieves the current path from the Angular `ActivatedRoute` service.\n *\n * @returns {string | undefined} The current path as a string, or `undefined` if the path cannot be determined.\n */\nexport function getCurrentPath(): string | undefined {\n assertInInjectionContext(getCurrentPath);\n\n const route = inject(ActivatedRoute);\n\n return route?.snapshot.url.toString();\n}\n\n/**\n * Retrieves the current query name based on the current path and router configuration.\n *\n * This function asserts that it is being called within an injection context and then\n * uses Angular's dependency injection to get the router configuration. It matches the\n * current path against the router's configuration to find the corresponding query name.\n *\n * @returns {string | undefined} The name of the current query if found, otherwise undefined.\n */\nexport function getCurrentQueryName(): string | undefined {\n assertInInjectionContext(getCurrentQueryName);\n\n const routes = inject(Router).config;\n\n const path = getCurrentPath();\n\n return routes.find(r => r.path === 'search')?.children?.find(r => r.path === path)?.data?.['queryName'];\n}\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(app: ApplicationRef, params: ThemeBodyHookParameters | undefined): ApplicationRef {\n runInInjectionContext(app.injector, () => {\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 return app;\n}\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];\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 { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { EMPTY, Observable, catchError, map, of, tap } from 'rxjs';\n\nimport { Aggregation, Article, AuditEvents, Query, Result, TreeAggregation, buildPathsAndLevels, error, globalConfig, info, warn } from '@sinequa/atomic';\n\nimport { AppStore, QueryParamsStore } from '../stores';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class QueryService {\n protected readonly http = inject(HttpClient);\n\n private readonly appStore = inject(AppStore);\n private readonly queryParamsStore = inject(QueryParamsStore);\n\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n // Represents the last result of a search operation with getResult().\n public result: Result = {} as Result;\n public audit?: AuditEvents;\n\n /**\n * Performs a search query.\n *\n * @param q - The partial query object.\n * @param includeQueryParams - Indicates whether to include query parameters automatically in the request.\n * @param audit - The audit events object.\n * @returns An observable that emits the search results.\n */\n search(q?: Partial<Query>, includeQueryParams = true, audit?: AuditEvents): Observable<Result> {\n // if audit is set, always use it\n // if this.audit is set and audit is not set use this.audit\n // if this.audit is not set and audit is not set use default audit\n const newAudit = audit ?? this.audit ?? { type: 'Search_Text', detail: { querytext: q?.text } };\n const $auditRecord = { auditEvents: [newAudit] };\n\n this.audit = undefined; // reset this.audit after using it\n\n const { app } = globalConfig;\n const currentQuery = q ?? this.queryParamsStore.getQuery();\n const query = includeQueryParams ? { ...this.queryParamsStore.getQuery(), ...currentQuery } : currentQuery;\n\n // Check if the search query is empty and if empty searches are allowed\n // If not allowed, return an empty result\n const allowEmptySearch = this.appStore.allowEmptySearch(query?.name || '');\n if (allowEmptySearch === false && query?.text === '') {\n warn('QueryService.search: Empty search query is not allowed. Returning empty result.');\n return of({ records: [] as Article[] } as Result);\n }\n\n const body = {\n app,\n query,\n $auditRecord\n };\n\n return this.http.post<Result>(this.API_URL + '/query', body).pipe(\n catchError(err => {\n error('queryService.getResults failure - error: ', err);\n return of({} as Result);\n }),\n map((result: Result) => {\n // update $hasMore flag\n result.aggregations?.forEach((agg: Aggregation) => {\n const count = this.appStore.getAggregationCount(result.queryName, agg.name) || 10;\n agg.$hasMore = false;\n if (!agg.isDistribution && !agg.isTree && agg.items) {\n if (agg.items.length > count) {\n agg.items = agg.items.slice(0, count);\n agg.$hasMore = true;\n }\n }\n if (agg.isTree) {\n buildPathsAndLevels(agg as TreeAggregation);\n }\n });\n return result;\n }),\n map(result => {\n result.records?.map((article: Article) => Object.assign(article, { value: article.title, type: 'default' }));\n return result;\n }),\n map(result => {\n const r = {\n ...result,\n nextPage: result.page !== undefined && result.page < Math.ceil(result.rowCount / result.pageSize) ? result.page + 1 : undefined,\n previousPage: result.page !== undefined && result.page > 1 ? result.page - 1 : undefined\n };\n return r;\n }),\n tap(response => {\n this.result = response;\n info('queryService.getResults success - data: ', response);\n })\n );\n }\n\n /**\n * Performs a bulk search operation.\n *\n * @param q An array of Query objects representing the search queries.\n * @param audit An optional AuditEvents object for auditing purposes.\n * @returns An Observable that emits an array of Result objects.\n */\n bulkSearch(q: Query[], audit?: AuditEvents): Observable<Result[]> {\n const { app = '' } = globalConfig;\n\n const body: {\n methods: {\n method: string;\n app: string;\n query: Query;\n }[];\n propagateErrors: true;\n $auditRecord?: { auditEvents: [AuditEvents] };\n } = {\n methods: [],\n propagateErrors: true,\n $auditRecord: { auditEvents: [audit!] }\n };\n\n for (const query of q) {\n body.methods.push({\n method: 'query',\n app,\n query\n });\n }\n\n return this.http.post<{ results: Result[] }>(this.API_URL + '/multi', body).pipe(\n catchError(err => {\n error('queryService.bulkSearch failure - error: ', err);\n return EMPTY;\n }),\n map(response => {\n // update $hasMore flag\n response.results.forEach((result: Result) => {\n result.aggregations.forEach((agg: Aggregation) => {\n agg.$hasMore = false;\n if (!agg.isDistribution && !agg.isTree && agg.items) {\n const count = this.appStore.getAggregationCount(result.queryName, agg.name) || 10;\n if (agg.items.length > count) {\n agg.items = agg.items.slice(0, count);\n agg.$hasMore = true;\n }\n }\n if (agg.isTree) {\n buildPathsAndLevels(agg as TreeAggregation);\n }\n });\n });\n\n return response.results;\n }),\n map(results => {\n results.forEach(result => result.records?.map((article: Article) => Object.assign(article, { value: article.title, type: 'default' })));\n return results;\n }),\n map(results => {\n return results.map(result => {\n const r = {\n ...result,\n nextPage: result.page < Math.ceil(result.rowCount / result.pageSize) ? result.page + 1 : undefined,\n previousPage: result.page > 1 ? result.page - 1 : undefined\n };\n return r;\n });\n }),\n // map(response => ResultsSchema.parse(response) as T),\n tap(response => {\n info('queryService.bulkSearch success - data: ', response);\n })\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 const audit = {\n type: 'Search_GotoPage',\n detail: {\n page: page,\n fromresultid: this.result ? this.result.id : null\n }\n };\n\n this.queryParamsStore.patch({ page }, audit);\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, InjectionToken, inject } from '@angular/core';\nimport { Observable, catchError, map, tap, throwError } from 'rxjs';\n\nimport {\n Aggregation,\n AggregationItem,\n AuditEvents,\n FieldValue,\n LegacyFilter,\n Query,\n Result,\n TreeAggregation,\n TreeAggregationNode,\n escapeExpr,\n globalConfig,\n notify\n} from '@sinequa/atomic';\n\nimport { AggregationListItem, CFilter, CFilterItem } from '../models';\nimport { AggregationsStore, AppStore, QueryParamsStore } from '../stores';\nimport { QueryService } from './query.service';\n\nexport type AggEx = Aggregation & {\n display?: string;\n icon?: string;\n hidden?: boolean;\n searchable?: boolean;\n};\n\nexport const NON_SEARCHABLE_DEFAULTS: string[] = ['concepts', 'size'];\n\nexport const NON_SEARCHABLE_COLUMNS = new InjectionToken<string[]>('Non searchable columns', {\n factory: () => NON_SEARCHABLE_DEFAULTS\n});\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AggregationsService {\n protected readonly http = inject(HttpClient);\n protected readonly queryService = inject(QueryService);\n\n appStore = inject(AppStore);\n aggregationsStore = inject(AggregationsStore);\n queryParamsStore = inject(QueryParamsStore);\n\n nonSearchableColumns = inject(NON_SEARCHABLE_COLUMNS);\n\n protected API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n loadMore(query: Partial<Query>, aggregation: Aggregation, audit?: AuditEvents): Observable<Aggregation> {\n const { app } = globalConfig;\n\n // skip cached items for computation\n const skip = aggregation.items?.filter(i => !i.$cached)?.length || 0;\n const count = this.appStore.getAggregationCount(query.name, aggregation.name) || 10;\n\n const aggregations = { [aggregation.name]: { skip, count } };\n\n const q: Partial<Query> = { ...query, action: 'aggregate', aggregations };\n\n // add audit record if available\n const $auditRecord = audit ? { auditEvents: [audit] } : undefined;\n\n const body = {\n app,\n query: q,\n $auditRecord\n };\n\n return this.http.post(this.API_URL + '/query', body).pipe(\n map(result => {\n const { aggregations } = result as Result;\n const agg = aggregations[0];\n\n if (agg.items) {\n agg.$hasMore = agg.items.length > count;\n agg.items = [...aggregation.items, ...agg.items.slice(0, count)];\n } else {\n aggregation.$hasMore = false;\n return aggregation;\n }\n\n return agg;\n }),\n catchError(error => {\n console.error('aggregation.loadMore failure - error: ', error);\n return throwError(() => new Error(error));\n }),\n tap(response => {\n console.info('aggregation.loadMore success - data: ', response);\n })\n );\n }\n\n open(query: Partial<Query>, aggregation: TreeAggregation, item: TreeAggregationNode): Observable<TreeAggregation> {\n const value = `/${item.$path}/*`;\n const expression = `${aggregation.column}:${escapeExpr(value)}`;\n\n const q: Partial<Query> = {\n ...query,\n action: 'open',\n open: [{ expression, aggregation: aggregation.name }]\n };\n\n return this.queryService.search(q).pipe(\n map(results => {\n // find the node in the tree and replace it with the new one\n const items = results.aggregations[0].items as TreeAggregationNode[];\n\n // if the open call returns no items, we need to update the node to indicate it has no children\n if (!items) {\n notify.info('No children found');\n return aggregation;\n }\n\n const newNode = this.findNode(items, item.$path);\n if (!newNode) {\n return aggregation;\n }\n\n // mark the node as opened\n newNode.$opened = true;\n newNode.hasChildren = newNode.items && newNode.items.length > 0;\n return this.replaceInTree(aggregation, item.$path, newNode) as TreeAggregation;\n })\n );\n }\n\n getAggregation(name: string, column: string | null): AggEx | null | undefined {\n const agg: AggEx = this.aggregationsStore.getAggregation(name || '') as AggEx;\n if (!agg) {\n // try to get the aggregation by column name\n const aggByColumn = this.aggregationsStore.getAggregation(column || '', 'column') as AggEx;\n if (aggByColumn) {\n return aggByColumn;\n }\n }\n return agg;\n }\n\n processAggregation(name: string, column: string | null): AggEx | null | undefined {\n let agg = this.getAggregation(name, column);\n\n if (!agg) return null;\n\n const { items = [], display = agg.name, icon, hidden, searchable = true } = (this.appStore.getAggregationCustomization(agg.column) as CFilter) || {};\n agg.display = display;\n agg.icon = icon;\n agg.hidden = hidden;\n agg.searchable = searchable;\n\n // if the aggregation's column is a \"concepts\", disable the search\n if (this.nonSearchableColumns.some(column => column === agg.column)) {\n agg.searchable = false;\n }\n\n if (agg.items) {\n // get current filters for the aggregation\n const filters = this.queryParamsStore.getFilter({ field: agg.column, name: agg.name });\n const flattenedValues = filters ? this.flattenFilters([filters]) : [];\n\n if (agg.isTree) {\n const selectedAgg = agg.items.map(item => this.selectNode(item as TreeAggregationNode, flattenedValues));\n const openedAgg = selectedAgg.map(item => this.openParentNodes(item as TreeAggregationNode, flattenedValues));\n agg.items = openedAgg;\n }\n\n (agg.items as AggregationListItem[]).forEach((item: AggregationListItem) => {\n if (!agg.isTree && item.$selected === undefined) {\n const valueToSearch = agg.valuesAreExpressions ? item.display : item.value;\n item.$selected = flattenedValues.includes(valueToSearch ?? '') || false;\n }\n\n item.icon = items?.find((it: CFilterItem) => it.value === item.value)?.icon;\n });\n }\n\n return agg;\n }\n\n /**\n * Converts an `AggregationItem` to a `LegacyFilter`.\n *\n * @param item - The `AggregationItem` to be converted.\n * @returns A `LegacyFilter` object based on the provided `AggregationItem`.\n *\n * The function performs the following steps:\n * 1. Retrieves the field from the aggregation column.\n * 2. If the aggregation is a distribution, it parses the item value to extract filter expressions.\n * - The expressions are split by \" AND \" and mapped to filter objects.\n * - If two filters are found, they are combined with an \"and\" operator.\n * - If one filter is found, it is returned as is.\n * - Throws an error if the distribution expression cannot be parsed.\n * 3. If the item value is a string, it creates a filter with the \"contains\" operator.\n * 4. Otherwise, it creates a filter with the item value as a string, number, or boolean.\n *\n * @throws Will throw an error if the distribution expression cannot be parsed.\n */\n toFilter(item: AggregationItem, field: string, name: string, isDistribution: boolean): LegacyFilter {\n if (isDistribution) {\n const res = (item.value as string).match(/.*\\:\\(?([><=\\d\\-\\.AND ]+)\\)?/);\n if (res?.[1]) {\n const expr = res?.[1].split(' AND ');\n const filters = expr.map(e => {\n const operator: 'gte' | 'lt' = e.indexOf('>=') !== -1 ? 'gte' : 'lt';\n let value: FieldValue = e.substring(e.indexOf(' ') + 1);\n return { name, field, operator, value, display: item.display || item.value };\n });\n\n if (filters.length === 2) {\n return { operator: 'and', filters, display: filters[0].display || filters[0].value, field, name } as LegacyFilter;\n } else if (filters.length === 1) {\n return { ...filters[0], field, name } as LegacyFilter;\n }\n throw new Error('Failed to parse distribution expression');\n }\n }\n\n if (typeof item.value === 'string') {\n return { name, field, value: item.value, operator: 'contains', display: item.display } as LegacyFilter;\n }\n return { name, field, value: item.value as string | number | boolean, display: item.display } as LegacyFilter;\n }\n\n private findNode(items: TreeAggregationNode[], path: string = ''): TreeAggregationNode | undefined {\n if (!items || items.length === 0) {\n return undefined;\n }\n\n for (const item of items) {\n if (item.$path === path) {\n return item;\n }\n if (item.items) {\n const found = this.findNode(item.items, path);\n if (found) {\n return found;\n }\n }\n }\n\n return undefined;\n }\n\n private replaceInTree(tree: any, valueToFind: string = '', newValue: TreeAggregationNode) {\n if (tree.$path === valueToFind) {\n return newValue;\n }\n\n if (tree.hasChildren && tree.items) {\n for (let i = 0; i < tree.items.length; i++) {\n tree.items[i] = this.replaceInTree(tree.items[i], valueToFind, newValue);\n }\n }\n\n return tree;\n }\n\n /**\n * Selects a node in a tree structure based on a given path.\n *\n * @param {TreeAggregationNode} node - The current node in the tree.\n * @param {string[]} path - An array of path strings used to determine which nodes to select.\n * @returns {TreeAggregationNode} - The updated node with the selection state applied.\n */\n private selectNode(node: TreeAggregationNode, path: string[]): TreeAggregationNode {\n if (node.$path && path.includes(`/${node.$path}/*`)) {\n node.$selected = true;\n } else {\n node.$selected = false;\n }\n\n if (node.items) {\n node.items = node.items.map(item => this.selectNode(item, path));\n }\n return node;\n }\n\n private flattenFilters(filters: LegacyFilter[]) {\n let flattenedValues: string[] = [];\n\n function extractValues(filters: LegacyFilter[]) {\n for (const filter of filters) {\n if (filter.value) {\n flattenedValues.push(filter.value);\n\n if (filter.display) flattenedValues.push(filter.display);\n // we handle \"values\" field for trees\n } else if (filter.values) {\n flattenedValues.push(...filter.values);\n }\n if (filter.filters) {\n extractValues(filter.filters as LegacyFilter[]);\n }\n }\n }\n\n extractValues(filters);\n return flattenedValues;\n }\n\n /**\n * Recursively opens parent nodes in a tree structure if any of their child nodes are selected or opened.\n *\n * @param node - The current tree node being processed.\n * @param path - An array representing the path to the current node.\n * @returns The updated tree node with parent nodes opened if necessary.\n */\n private openParentNodes(node: TreeAggregationNode, path: string[]): TreeAggregationNode {\n if (node.items) {\n node.items = node.items.map(item => this.openParentNodes(item, path));\n }\n if (node.items && node.items.some(item => item.$selected || item.$opened)) {\n node.$opened = true;\n }\n return node;\n }\n}\n","import { inject } from '@angular/core';\nimport { CanActivateFn, Router } from '@angular/router';\nimport { globalConfig, isAuthenticated } from '@sinequa/atomic';\n\n/**\n * Returns a guard function that checks if the user is authenticated.\n * If the user is not authenticated, it navigates to the login page.\n * @returns The guard function.\n */\nexport function AuthGuard(): CanActivateFn {\n return (_, state) => {\n const router = inject(Router);\n\n const { loginPath, useCredentials, useSSO } = globalConfig;\n if (isAuthenticated()) return true;\n // when using SSO authentication, the application is already authenticated\n if (useSSO) return true;\n\n if (useCredentials) {\n router.navigate([loginPath], { queryParams: { returnUrl: state.url } });\n } else {\n // TODO: add a loading page configuration\n router.navigate(['loading'], { queryParams: { returnUrl: state.url } });\n }\n return false;\n };\n}\n","export function itemIndex(name: string, items?: any[]): number {\n if (items?.length) {\n for (let i = 0, ic = items.length; i < ic; i++) {\n const item = items[i];\n if (item && item.name === name) {\n return i;\n }\n }\n }\n return -1;\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { patchUserSettings } from '@sinequa/atomic';\nimport { Alert, UserSettingsState } from '../../models';\nimport { itemIndex } from './helpers';\n\nexport function withAlertsFeatures() {\n return signalStoreFeature(\n withState({ alerts: [] as UserSettingsState['alerts'] }),\n withMethods(store => ({\n /**\n * Deletes an alert from the user's alerts list.\n *\n * @param index - The index of the alert.\n */\n async deleteAlert(index: number) {\n const alerts = store.alerts();\n if (alerts) {\n const alertToDelete = alerts.splice(index, 1)[0];\n await patchUserSettings(\n { alerts },\n {\n type: 'Alert_Delete',\n detail: {\n savedQuery: alertToDelete.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, alerts: [...alerts] };\n });\n }\n },\n\n /**\n * Adds an alert to the user's alerts list\n *\n * @param alert - The alert to add in the user's alerts list\n */\n async createAlert(alert: Alert) {\n const alerts = store.alerts();\n if (itemIndex(alert.name) >= 0) return;\n alerts.unshift(alert);\n await patchUserSettings(\n { alerts },\n {\n type: 'Alert_Add',\n detail: {\n alert: alert.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, alerts: [...alerts] };\n });\n },\n\n /**\n * Updates the alert at a specific index.\n *\n * @param alert - The updated alert data.\n * @param index - The index of the alert to update.\n */\n async updateAlert(alert: Alert, index: number) {\n const alerts = store.alerts();\n if (index < 0 || index >= alerts.length)\n // index out of bounds\n return;\n\n alerts.splice(index, 1, alert);\n\n await patchUserSettings(\n { alerts },\n {\n type: 'Alert_Update',\n detail: {\n alert: alert.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, alerts: [...alerts] };\n });\n },\n\n /**\n * Updates the user's alerts in the store.\n *\n * @param alerts - The new alerts to be updated in the store.\n */\n async updateAlerts(alerts: Alert[]) {\n await patchUserSettings(\n { alerts },\n {\n type: 'Alert_Update',\n detail: {\n alert: alert.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, alerts: [...alerts] };\n });\n }\n }))\n );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { AuditEvents, patchUserSettings } from '@sinequa/atomic';\nimport { UserSettingsState } from '../../models';\n\nexport function withAssistantFeatures() {\n return signalStoreFeature(\n withState({ assistants: {} as UserSettingsState['assistants'] }),\n withMethods(store => ({\n /**\n * Updates the user's assistant settings in the store.\n *\n * @param assistantSettings - The new assistant settings to be updated in the store.\n */\n async updateAssistantSettings(assistantSettings: UserSettingsState['assistants']) {\n patchState(store, state => {\n return { ...state, assistants: assistantSettings };\n });\n },\n\n /**\n * Update the user's language and optionally logs audit events.\n *\n * @param language - The language to update with.\n * @param auditEvents - Optional audit events to log during the update.\n */\n async updateLanguage(language: UserSettingsState['language'], auditEvents?: AuditEvents) {\n await patchUserSettings({ language }, auditEvents);\n patchState(store, state => {\n return { ...state, language };\n });\n },\n\n /**\n * Update the user's assistant collapsed status and optionally logs audit events.\n *\n * @param collapseAssistant - The collapse status.\n * @param auditEvents - Optional audit events to log during the update.\n */\n async updateAssistantCollapsed(collapseAssistant: UserSettingsState['collapseAssistant'], auditEvents?: AuditEvents) {\n await patchUserSettings({ collapseAssistant }, auditEvents);\n patchState(store, state => {\n return { ...state, collapseAssistant };\n });\n }\n }))\n );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { patchUserSettings } from '@sinequa/atomic';\nimport { Basket, UserSettingsState } from '../../models';\nimport { itemIndex } from './helpers';\n\nexport function withBasketsFeatures() {\n return signalStoreFeature(\n withState({ baskets: [] as UserSettingsState['baskets'] }),\n withMethods(store => ({\n /**\n * Deletes a basket from the user's baskets list.\n *\n * @param index - The index of the basket to delete.\n */\n async deleteBasket(index: number) {\n const baskets = store.baskets();\n if (baskets) {\n const basketToDelete = baskets.splice(index, 1)[0];\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_Delete',\n detail: {\n savedQuery: basketToDelete.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n }\n },\n\n /**\n * Adds a basket to the user's baskets list.\n *\n * @param basket - The basket to add in the user's baskets list.\n */\n async createBasket(basket: Basket) {\n const baskets = store.baskets();\n if (itemIndex(basket.name) >= 0) return;\n baskets.unshift(basket);\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_Add',\n detail: {\n basket: basket.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n },\n\n /**\n * Updates the user's baskets in the store.\n *\n * @param baskets - The new baskets to be updated in the store.\n */\n async updateBaskets(baskets: UserSettingsState['baskets']) {\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_Update'\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n },\n\n /**\n * Updates the basket at a specific index.\n *\n * @param basket - The updated basket data.\n * @param index - The index of the basket to update.\n */\n async updateBasket(basket: Basket, index: number) {\n const baskets = store.baskets();\n const prevIndex = itemIndex(basket.name, baskets);\n if (\n (prevIndex !== -1 && index !== prevIndex) || // A basket with the same name exists at a different index\n index < 0 ||\n index >= baskets.length\n )\n // index out of bounds\n return;\n\n baskets.splice(index, 1, basket);\n\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_Update',\n detail: {\n basket: basket.name\n }\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n },\n\n /**\n * Adds one or multiple records' id into a basket.\n *\n * @param name - The basket name.\n * @param ids - The id(s) to add to it.\n */\n async addToBasket(name: string, ids: string | string[]) {\n const baskets = store.baskets();\n const basket = baskets.find((b: { name: string }) => 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: string) => i === id)) {\n basket.ids.push(id);\n }\n }\n\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_AddDoc',\n detail: {\n basket: basket.name,\n docid: ids[0]\n }\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n },\n\n /**\n * Adds one or multiple records' id from a basket.\n *\n * @param name - The basket name.\n * @param ids - The id(s) to remove from it.\n */\n async removeFromBasket(name: string, ids: string | string[]) {\n const baskets = store.baskets();\n const basket = baskets.find((b: { name: string }) => 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: string) => i === id)) {\n basket.ids.push(id);\n }\n }\n\n await patchUserSettings(\n { baskets },\n {\n type: 'Basket_AddDoc',\n detail: {\n basket: basket.name,\n docid: ids[0]\n }\n }\n );\n patchState(store, state => {\n return { ...state, baskets: [...baskets] };\n });\n }\n }))\n );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { Article, AuditEvents, patchUserSettings } from '@sinequa/atomic';\nimport { UserSettingsState } from '../../models';\n\nexport function withBookmarkFeatures() {\n return signalStoreFeature(\n withState({ bookmarks: [] as UserSettingsState['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: UserSettingsState['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([bookmark, ...store.bookmarks()], {\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: { id: string }) => 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: { id: string | undefined }) => 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) this.unbookmark(article.id);\n else this.bookmark(article);\n }\n }))\n );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { AuditEvents, patchUserSettings, QueryParams } from '@sinequa/atomic';\nimport { SearchItem, UserSettingsState } from '../../models';\n\nexport function withRecentSearchesFeatures() {\n return signalStoreFeature(\n withState({ recentSearches: [] as UserSettingsState['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(\n { recentSearches },\n {\n type: 'RecentQuery_Delete',\n detail: {\n recentQuery: recentSearchToDelete.queryParams?.text\n }\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: UserSettingsState['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 {\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 {\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 SearchItem;\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","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { patchUserSettings } from '@sinequa/atomic';\nimport { SearchItem, UserSettingsState } from '../../models';\n\nexport function withSavedSearchesFeatures() {\n return signalStoreFeature(\n withState({ savedSearches: [] as UserSettingsState['savedSearches'] }),\n\n withMethods(store => ({\n /**\n * Deletes a saved search entry from the user's saved searches list.\n *\n * @param index - The index of the saved search to delete.\n */\n async deleteSavedSearch(index: number) {\n const savedSearches = store.savedSearches();\n if (savedSearches) {\n const savedSearchToDelete = savedSearches.splice(index, 1)[0];\n await patchUserSettings(\n { savedSearches },\n {\n type: 'SavedQuery_Delete',\n detail: {\n savedQuery: savedSearchToDelete.display\n }\n }\n );\n\n patchState(store, state => {\n return { ...state, savedSearches: [...savedSearches] };\n });\n }\n },\n\n /**\n * Updates the user's saved searches in the store.\n *\n * @param savedSearches - The new saved searches to be updated in the store.\n */\n async updateSavedSearches(savedSearches: UserSettingsState['savedSearches']) {\n await patchUserSettings(\n { savedSearches },\n {\n type: 'SavedQuery_Add',\n detail: {\n savedQuery: savedSearches[0].display\n }\n }\n );\n patchState(store, state => {\n return { ...state, savedSearches: [...savedSearches] };\n });\n },\n\n getSavedSearch(search: string): SearchItem | undefined {\n if (!search) return undefined;\n const savedSearches = store.savedSearches();\n return savedSearches?.find(savedSearch => savedSearch.display === search);\n }\n }))\n );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { deleteUserSettings, error, fetchUserSettings } from '@sinequa/atomic';\nimport { UserSettingsState } from '../../models';\n\nexport function withUserSettingsFeatures() {\n return signalStoreFeature(\n withState({ language: undefined, collapseAssistant: undefined } as UserSettingsState),\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 try {\n const settings = await fetchUserSettings<UserSettingsState>();\n patchState(store, settings);\n } catch (err) {\n error('Error fetching user settings:', err);\n }\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 alerts: [],\n assistants: {},\n language: undefined,\n collapseAssistant: undefined\n } as UserSettingsState);\n }\n }))\n );\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { signalStore } from '@ngrx/signals';\n\nimport { withAlertsFeatures } from './with-alerts';\nimport { withAssistantFeatures } from './with-assistant';\nimport { withBasketsFeatures } from './with-baskets';\nimport { withBookmarkFeatures } from './with-bookmarks';\nimport { withRecentSearchesFeatures } from './with-recent-searches';\nimport { withSavedSearchesFeatures } from './with-saved-searches';\nimport { withUserSettingsFeatures } from './with-user-settings';\n\nexport const UserSettingsStore = signalStore(\n { providedIn: 'root' },\n withDevtools('UserSettings'),\n\n withBookmarkFeatures(),\n withRecentSearchesFeatures(),\n withSavedSearchesFeatures(),\n withBasketsFeatures(),\n withAssistantFeatures(),\n withUserSettingsFeatures(),\n withAlertsFeatures()\n);\n","import { computed, inject, Injectable, InjectionToken, Type } from '@angular/core';\nimport { Title } from '@angular/platform-browser';\nimport { Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\n\nimport { CCApp, CCQuery, CCTab, error, info } from '@sinequa/atomic';\n\nimport { AuthGuard } from '../guards';\nimport { AppStore } from '../stores/app.store';\nimport { PrincipalStore } from '../stores/principal.store';\nimport { UserSettingsStore } from '../stores/user-settings/user-settings.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 userSettingsStore = inject(UserSettingsStore);\n principalStore = inject(PrincipalStore);\n appStore = inject(AppStore);\n\n router = inject(Router);\n title = inject(Title);\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 * 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 info('Application initialized');\n\n // this will set the title and logo of the application\n // it will also set the logo in the css variables\n this.setGeneralApp();\n\n // withCreateRoutes is true by default, but it must be set to false if tabSearch is not active and/or no tabs are defined\n const query = this.appStore.getDefaultQuery() as CCQuery;\n if (withCreateRoutes && query && query.tabSearch && query.tabSearch.isActive && query.tabSearch.tabs && query.tabSearch.tabs.length) {\n // check if the query \"tabs\" and the custom json \"routes\" match\n // in the json keep only the routes that are in the query\n this.createRoutes();\n info('Application routes created');\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 try {\n // Fetch the application configuration\n await this.appStore.initialize();\n info('appStore', getState(this.appStore));\n\n // Load the principal (user information)\n await this.principalStore.initialize();\n info('principalStore', getState(this.principalStore));\n\n // Load the user settings\n await this.userSettingsStore.initialize();\n info('userSettingsStore', getState(this.userSettingsStore));\n } catch (err) {\n error('Error during application initialization', err);\n throw err;\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 // get the queries and custom jsons from the app store\n const { queries, data: custom, customJSONs = [] } = getState(this.appStore) as CCApp;\n\n // for each query we need to create a route with the query name and the tab name\n // contains an array of objects CCQuery for each existing query\n // we keep only the name and the tabSearch properties\n const queriesMap = Object.entries(queries).map(([key, value]) => ({ key, name: value.name, tabSearch: value.tabSearch }));\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\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\n // retrieve the routes data from the custom JSONs or fall back to the default custom json\n const routes = (cjRoutes || custom?.['routes']) as { path: string; wsName: string; wsQueryTab: string; pathDisplayName: string; icon: string }[];\n\n // take only first query to create the routes\n const firstQuery = queriesMap[0];\n\n // We need to create a route path object for each tab in the first query\n // if the query has no tabs, we create a route with the query name as the tab name\n const firstQueryConfig = {\n name: firstQuery.name,\n tabs: (firstQuery.tabSearch.tabs && firstQuery.tabSearch.tabs.length\n ? firstQuery.tabSearch.tabs\n : [{\n name: firstQuery.name,\n display: firstQuery.name,\n value: firstQuery.name,\n isDefault: false,\n excludedIndices: [],\n icon: ''\n }]\n ) as CCTab[]\n };\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 // check if the routes provided are valid\n const validRoutes = this.checkRoutesValidity(routes, firstQueryConfig);\n // if no valid routes are found, throw an error\n if (!validRoutes.length) {\n error('No valid routes found', routes);\n return;\n }\n\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(\n (acc, tab) => {\n acc[tab.name] = { display: tab.display };\n return acc;\n },\n {} as Record<string, { display: string }>\n );\n\n // respect the order of the tabs in the first query\n // we need to separate the routes that are not in the first query from the ones that are\n const notFirstQueryTabs = validRoutes.filter(route => route.wsQueryTab !== firstQueryConfig.name && route.wsName !== undefined);\n\n // route path without wsName are considered as first query tabs\n const firstQueryTabs = validRoutes.filter(route => route.wsQueryTab === firstQueryConfig.name || route.wsName === undefined);\n\n // sort the validRoutes according to the order of the tabs in the first query\n firstQueryTabs.sort((a, b) => {\n const aIndex = firstQueryConfig.tabs.findIndex(tab => tab.name === a.wsQueryTab && (a.wsName === firstQueryConfig.name || a.wsName === undefined));\n const bIndex = firstQueryConfig.tabs.findIndex(tab => tab.name === b.wsQueryTab && (b.wsName === firstQueryConfig.name || b.wsName === undefined));\n return aIndex - bIndex;\n });\n\n const sortedValidRoutes = [...firstQueryTabs, ...notFirstQueryTabs];\n\n children = sortedValidRoutes.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 icon: route.icon\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 path: 'search',\n component: this.components.find(c => c.path === 'search')?.component || this.defaultLayoutComponent(),\n canActivate: [AuthGuard()],\n children: []\n };\n\n const wildcardPath = searchPath.children?.find(route => route.path === '**') || { path: '**', redirectTo: 'all', pathMatch: 'full' };\n\n // remove the wildcard path from the searchPath children if it exists\n const existingChildren = (searchPath.children ?? []).filter(child => child.path !== '**');\n\n searchPath.component = this.components.find(c => c.path === 'search')?.component || this.defaultLayoutComponent();\n searchPath.children = [...children, ...existingChildren, wildcardPath];\n\n const newConfig = [searchPath, ...currentConfig];\n info('ApplicationService: createRoutes -> newConfig', newConfig);\n // finally we reset the router config with the new routes\n this.router.resetConfig(newConfig);\n }\n\n private checkRoutesValidity(routes: any[], firstQueryConfig: { name: string; tabs: CCTab[] }) {\n // if no \"wsName\" check if the wqQueryTab is provided and if not, remove the route from the array\n const validRoutes = routes.filter(route => {\n if (!route.wsName) {\n if (!route.wsQueryTab) {\n error('Invalid route provided', route);\n return false;\n }\n // if the wsQueryTab is provided, we need to check if it exists in the first query\n const tabExists = firstQueryConfig.tabs.find(tab => tab.name === route.wsQueryTab);\n if (!tabExists) {\n error('Invalid route provided', route);\n return false;\n }\n }\n return true;\n });\n\n // add to validRoutes the routes that are in the first query and not in the validRoutes\n // we need to check if the route is already in the validRoutes array\n const additionalRoutes = firstQueryConfig.tabs\n .filter(tab => {\n // Check if the tab is already in the validRoutes array\n const routeExists = validRoutes.some(route => route.wsQueryTab === tab.name && (route.wsName === firstQueryConfig.name || route.wsName === undefined));\n return !routeExists;\n })\n .map(tab => {\n // Create a new route object for the tab\n return {\n path: tab.name,\n queryName: firstQueryConfig.name,\n wsQueryTab: tab.name,\n pathDisplayName: tab.display || tab.name,\n icon: ''\n };\n });\n\n // Add the additional routes to the validRoutes array\n validRoutes.push(...additionalRoutes);\n return validRoutes;\n }\n\n /**\n * Sets general application properties such as the document title and logo styles\n * based on the current general configuration from the application store.\n *\n * - Updates the document title if a general name is provided.\n * - Sets CSS custom properties for small and large logos if available in the configuration.\n *\n * @private\n */\n private setGeneralApp() {\n const general = this.appStore.general();\n // If general is not defined or is an empty object, do nothing\n if (!general || (typeof general === 'object' && Object.keys(general).length === 0)) return;\n\n info('Setting general application properties');\n\n if (general.name) {\n this.title.setTitle(general.name);\n }\n\n const { light, alt } = general.logo || {};\n document.documentElement.style.setProperty('--logo-alt-text', `'${alt || general.name}'`);\n\n if (light?.small) {\n document.documentElement.style.setProperty('--logo-small', `url('${light.small}')`);\n }\n if (light?.large) {\n document.documentElement.style.setProperty('--logo-large', `url('${light.large}')`);\n }\n }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, computed, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\nimport { Article, AuditEvent, AuditEvents, AuditEventType, AuditEventTypeValues, CCApp, globalConfig, Result } from '@sinequa/atomic';\nimport { AppStore } from '../stores/app.store';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class AuditService {\n appStore = inject(AppStore);\n app = computed(() => getState(this.appStore) as CCApp);\n\n protected readonly http = inject(HttpClient);\n protected readonly router = inject(Router);\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n protected lastClickTime = 0;\n\n /**\n * Notify the Sinequa server of a set of audit events\n *\n * @param auditEvents The audit events\n */\n notify(auditEvents: AuditEvents) {\n this.http\n .post<void>(this.API_URL + '/audit.notify', {\n event: 'None', // AuditEventType.None,\n app: this.app().name,\n $auditRecord: { auditEvents: [auditEvents] }\n })\n .subscribe();\n }\n\n /**\n * It sends an audit event to the Audit Service.\n */\n notifyLogin() {\n this.notify({\n type: 'Login_Success_Form' // AuditEventType.Search_Login_Success\n });\n }\n\n /**\n * Notify logout\n */\n notifyLogout() {\n this.notify({\n type: 'Search_Exit_Logout' // AuditEventType.Search_Exit_Logout\n });\n }\n\n /**\n * Notify the Sinequa server of a document event\n *\n * @param evt The audit event type\n * @param doc The document (article) in question\n * @param resultId The resultid that contain the document\n * @param parameters Additional parameters\n */\n notifyDocument(\n auditEventType: AuditEventType | AuditEventTypeValues | ({} & Record<never, never>),\n doc: Article,\n resultsOrId: Result | string,\n parameters?: Record<string, string | number | boolean | undefined>,\n rfmParameters?: Record<string, string | number | boolean | undefined>\n ) {\n let resultId: string | null;\n let result: Result | undefined;\n if (typeof resultsOrId == 'string') {\n resultId = resultsOrId;\n } else {\n result = resultsOrId;\n resultId = result ? result.id : null;\n }\n\n const detail: any = {\n docid: doc.id,\n rank: doc.rank,\n title: doc.title,\n source: doc.collection[0].split('/')[0],\n collection: doc.collection[0],\n resultId,\n filename: doc.filename,\n fileext: doc.fileext,\n index: doc.databasealias,\n resultcount: result?.totalRowCount\n };\n\n if (parameters) {\n Object.keys(parameters).forEach(key => (detail[key] = parameters[key]));\n }\n const data: AuditEvent = {\n type: auditEventType,\n detail\n };\n\n if (rfmParameters) {\n const rfmDetail: Record<string, string | number | boolean | undefined> = {}; // Add index signature\n Object.keys(rfmParameters).forEach(key => (rfmDetail[key] = rfmParameters[key]));\n data.rfmDetail = rfmDetail;\n }\n\n this.lastClickTime = Date.now();\n\n // Listen to the navigation event outside the app\n document.addEventListener(\n 'visibilitychange',\n () => {\n // Capture the navigation even triggered just after the click\n if (document.visibilityState === 'hidden' && Date.now() - this.lastClickTime < 1000) {\n // Second event triggered when we come back\n document.addEventListener(\n 'visibilitychange',\n () => {\n if (document.visibilityState === 'visible') {\n this.notify({ type: 'Navigation_Return' });\n }\n },\n { once: true }\n );\n }\n },\n { once: true }\n );\n\n this.notify(data);\n }\n\n /**\n * Notify route change\n */\n notifyRouteChange(url: string) {\n this.notify({\n type: 'Navigation_Route', // AuditEventType.Navigation_Route,\n detail: {\n detail: url\n }\n });\n }\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/user-settings.store';\nimport { AppStore } from '../stores/app.store';\nimport { Autocomplete } from '../models/autocomplete';\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(\n (acc: Observable<Suggestion[]>[], curr: string) => {\n acc.push(from(fetchSuggest(curr, text)));\n return acc;\n },\n [] as Observable<Suggestion[]>[]\n );\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') maxCount = { recentSearches: maxCount, savedSearches: maxCount, bookmarks: maxCount };\n\n if (recentSearches) {\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) items.push(...searches.map(search => ({ category: 'recent-search', ...search })));\n }\n\n if (savedSearches) {\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) items.push(...searches.map(search => ({ category: 'saved-search', ...search })));\n }\n\n if (bookmarks) {\n // don't filter if the text is empty\n const matchingBookmarks = text ? bookmarks.filter(bookmark => bookmark.label?.toLowerCase().includes(text.toLowerCase())) : bookmarks;\n\n const searches = matchingBookmarks.slice(0, maxCount?.bookmarks);\n\n if (searches.length > 0) items.push(...searches.map(search => ({ category: 'bookmark', display: search.label ?? '', ...search })));\n }\n\n return items;\n }\n}\n","import { HttpClient, HttpContext, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\n\nimport { globalConfig, isObject } from '@sinequa/atomic';\nimport { Observable, throwError } from 'rxjs';\n\ntype Options = {\n headers?:\n | HttpHeaders\n | {\n [header: string]: string | string[];\n };\n context?: HttpContext;\n observe?: 'body' | 'events' | 'response';\n params?:\n | HttpParams\n | {\n [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;\n };\n reportProgress?: boolean;\n responseType: 'arraybuffer' | 'blob' | 'text' | 'json';\n withCredentials?: boolean;\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class JsonMethodPluginService {\n protected readonly http = inject(HttpClient);\n\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n /**\n * Call a JsonMethod plugin using an HTTP POST\n *\n * @param method The name of the JsonMethod plugin\n * @param query Parameters to pass to the plugin\n * @param options HTTP options for the request\n * @returns An observable of the plugin's return value\n */\n post<U>(method: string, query: U, options?: Options): Observable<any> {\n if (!isObject(query)) {\n return throwError(() => ({ error: 'invalid query object' }));\n }\n return this.http.post(`${this.API_URL}/plugin/${method}`, query, options as any);\n }\n\n /**\n * Call a JsonMethod plugin using an HTTP GET\n *\n * @param method The name of the JsonMethod plugin\n * @param query Parameters to pass to the plugin\n * @param options HTTP options for the request\n * @returns An observable of the plugin's return value\n */\n get<U extends Record<string, string | boolean | number | Date | object | undefined>>(method: string, query: U, options?: Options): Observable<any> {\n return this.http.get(`${this.API_URL}/plugin/${method}`, {\n params: query,\n ...(options as any)\n });\n }\n}\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 './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 // TODO: use a \"loading\" configuration from globalConfig\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","import { InjectionToken } from '@angular/core';\n\nexport type AppFeatures = {\n assistant: {\n // Whether the assistant configuration should be prefiexed with the app name\n usePrefixName: boolean;\n };\n};\n\nexport const APP_FEATURES = new InjectionToken<AppFeatures>('app.features');\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';\nimport { DestroyRef, EventEmitter, Inject, Injectable, InjectionToken, Injector, inject } from '@angular/core';\nimport { DomSanitizer } from '@angular/platform-browser';\nimport { getState } from '@ngrx/signals';\nimport { Observable, Subject, tap } from 'rxjs';\n\nimport { Article, Audit, AuditEventType, AuditEvents, CCWebService, CustomHighlights, PreviewData, Query, error, globalConfig, info } from '@sinequa/atomic';\n\nimport { AppStore, ApplicationStore, Extract, QueryParamsStore, SelectionStore } from '../stores';\nimport { HIGHLIGHTS, PreviewHighlight } from '../tokens';\nimport { InlineWorker } from '../utils';\nimport { AuditService } from './audit.service';\nimport { QueryService } from './query.service';\n\nexport const PREVIEW_CONFIG = new InjectionToken('Preview configuration', {\n factory: () => ({\n allowWorker: false\n })\n});\n\ntype ExtractsLocations = Extract & {\n text: string; // HTML text\n};\n\ntype CCWebServicePreview = CCWebService & {\n allowCustomHighlights: boolean;\n allowedWithAnySBA: boolean;\n defaultHighlights: boolean;\n forceTextPreview: string;\n highlights: string;\n maxNumberOfHighlights: string | number;\n maximumHtmlSize: string | number;\n};\nexport type PreviewEvents = 'idle' | 'fetching' | 'fetched' | 'error' | 'scrollTo';\n\n@Injectable({\n providedIn: 'root'\n})\nexport class PreviewService {\n protected readonly http = inject(HttpClient);\n protected readonly injector = inject(Injector);\n\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n protected readonly applicationStore = inject(ApplicationStore);\n protected readonly selectionStore = inject(SelectionStore);\n protected readonly queryParamsStore = inject(QueryParamsStore);\n protected readonly appStore = inject(AppStore);\n\n protected readonly sanitizer = inject(DomSanitizer);\n\n protected readonly queryService = inject(QueryService);\n protected readonly auditService = inject(AuditService);\n\n events = new EventEmitter<PreviewEvents>();\n\n // ! worker\n onMessage = new Subject<unknown>();\n worker: InlineWorker | undefined;\n\n allowWoker = inject(PREVIEW_CONFIG).allowWorker;\n\n protected previewData: PreviewData | undefined;\n protected iframe: Window | null | undefined;\n\n highlightCategory = 'extractslocations';\n\n extracts = ['matchlocations', 'extractslocations', 'matchingpassages'];\n entities = ['company', 'geo', 'person'];\n\n abortController = new AbortController();\n\n constructor(\n protected destroyRef: DestroyRef,\n @Inject(HIGHLIGHTS) public highlights: PreviewHighlight[]\n ) {\n window.addEventListener('message', this.receiveMessage.bind(this), { signal: this.abortController.signal });\n\n // update the highlights according to the web service \"preview\" configuration\n this.updateHighlightsFromWebServiceConfiguration();\n\n destroyRef.onDestroy(() => {\n this.abortController.abort();\n });\n }\n\n /**\n * Handles incoming messages from a MessageEvent.\n *\n * @param event - The MessageEvent containing the message data.\n *\n * The function processes messages of type 'ready' and 'get-html-results'.\n *\n * - For 'ready' messages:\n * - Initializes the preview iframe with the app name and highlights.\n * - If preview data is available, retrieves HTML content based on the current selection.\n *\n * - For 'get-html-results' messages:\n * - Updates the application store with the extracted HTML results.\n * - If no extracts are found, updates the application store with an empty array.\n */\n receiveMessage(event: MessageEvent) {\n const message = event.data;\n // the webworker needs to be initialized with the app name to be able to load the correct webworker file (worker.js)\n const { app } = globalConfig;\n\n // when the iframe is ready, we can send the init message\n if (message.type === 'ready') {\n // Initialize the preview iframe with the app name and highlights\n // app name is used to intialize the webworker\n this.sendMessage({ action: 'init', highlights: this.highlights, appname: app });\n\n if (this.previewData) {\n const { id } = getState(this.selectionStore);\n this.events.emit('fetching');\n this.retrieveHtmlContent(id, this.highlightCategory, this.previewData);\n }\n }\n\n // when the iframe sends back the html content of the extracts (no worker)\n if (message.type === 'get-html-results') {\n const { id } = getState(this.selectionStore);\n\n if (id) {\n info('get html results without worker');\n // prevents the error when the \"previewData\" is not ready\n if (this.previewData) {\n const extracts = this.fetchExtracts(id, message.data, this.previewData);\n this.applicationStore.updateExtracts(this.previewData?.record.id || '', extracts);\n this.events.emit('fetched');\n }\n }\n }\n\n // when the iframe sends back the html content of the extracts (with worker)\n // we update the extracts in the application store\n if (message.type === 'get-html-results-webworker') {\n info('get html results with worker');\n\n if (message.data.extracts.length === 0) {\n this.events.emit('fetched');\n this.applicationStore.updateExtracts(this.previewData?.record.id || '', []);\n return;\n }\n\n const extracts: Extract[] = message.data.extracts.map((item: ExtractsLocations) => ({\n ...item,\n text: this.sanitizer.bypassSecurityTrustHtml(item.text)\n }));\n\n this.applicationStore.updateExtracts(this.previewData?.record.id || '', extracts);\n this.events.emit('fetched');\n }\n }\n\n /**\n * Generates a preview of the document with the given ID, applying the specified query parameters,\n * custom highlights, and audit events.\n *\n * @param id - The unique identifier of the document to preview.\n * @param q - Partial query parameters to customize the preview request.\n * @param customHighlights - Optional array of custom highlights to apply to the preview.\n * @param audit - Optional audit events to merge with the default audit record.\n * @returns An Observable that emits the preview data.\n */\n preview(id: string, q: Partial<Query>, customHighlights?: CustomHighlights[], audit?: AuditEvents): Observable<PreviewData> {\n const detail = this.getAuditPreviewDetail(id, q);\n\n const defaultAudit: AuditEvents = {\n type: 'Doc_Preview',\n detail\n };\n\n // merge the default audit record with the provided audit record\n const $auditRecord = audit ? { auditEvents: [{ ...defaultAudit, ...audit }] } : { auditEvents: [defaultAudit] };\n\n const { app } = globalConfig;\n const query = { ...this.queryParamsStore.getQuery(), ...q };\n\n const browserUrl = `${window.location.origin}${window.location.pathname}`;\n\n const body = {\n app,\n action: 'get',\n id,\n query: { name: query.name, text: query.text },\n browserUrl,\n customHighlights,\n $auditRecord\n };\n\n return this.http.post<PreviewData>(this.API_URL + '/preview', body).pipe(tap((data: PreviewData) => this.setPreviewData(data)));\n }\n\n /**\n * Closes the preview with the specified ID and updates the audit log.\n *\n * @param id - The ID of the preview to close.\n * @param query - The partial query object used to retrieve the preview detail.\n */\n close(id: string, query: Partial<Query>) {\n const detail = this.getAuditPreviewDetail(id, query);\n const auditEvent = {\n type: \"Preview_Close\",\n detail\n };\n Audit.notify(auditEvent);\n }\n\n /**\n * Previews an article in a new browser's tab.\n *\n * @param article - The article to preview.\n */\n openExternal(article: Article) {\n const query = this.queryParamsStore.getQuery();\n try {\n const detail = this.getAuditPreviewDetail(article.id, query);\n const result = this.queryService.result;\n this.auditService.notifyDocument(\n 'Click_ResultLink',\n article,\n result || detail.resultid || '',\n {\n querytext: detail.querytext,\n querylang: detail.querylang,\n score: detail.score\n },\n {\n queryhash: result ? result.rfmQueryHash : undefined,\n querytext: detail.querytext,\n querylang: detail.querylang\n }\n );\n } catch (e: any) {\n error('preview.openExternal failure - error: ', e);\n }\n window.open(article.url1, '_blank', 'noopener noreferrer');\n }\n\n /**\n * Sets the iframe window object.\n *\n * @param iframe - The window object of the iframe or null to unset.\n */\n setIframe(iframe: Window | null) {\n this.iframe = iframe;\n }\n\n /**\n * Sets the preview data and updates the highlight category based on the provided data.\n *\n * @param data - The preview data to be set.\n *\n * If the provided data contains highlights per category with 'matchingpassages' having values,\n * the highlight category is set to \"matchingpassages\". Otherwise, it is set to \"extractslocations\".\n */\n setPreviewData(data: PreviewData) {\n this.previewData = data;\n\n if (data) {\n this.highlightCategory = data.highlightsPerCategory?.['matchingpassages']?.values.length ? 'matchingpassages' : 'extractslocations';\n }\n }\n\n /**\n * Sends a message to the iframe if it exists.\n *\n * @param message - The message to be sent. It can be of any type.\n */\n sendMessage(message: unknown) {\n if (this.iframe) {\n this.iframe!.postMessage(message, '*');\n }\n }\n\n /**\n * Get preview id for an entity value for an index\n * @param entity the entity type (i.e. \"geo\")\n * @param value the entity value (i.e. \"AUSTRALIA\")\n * @param index the entity index from its list\n * @returns the html id\n */\n getEntityId(entity: string, value: string, index: number): number | undefined {\n if (!this.previewData) return undefined;\n\n return this.previewData.highlightsPerLocation.filter(h => h.values.find(v => v === value))[index].positionInCategories[entity];\n }\n\n /**\n * Send a message to the prewiew iFrame with the required data to retrieve HTML content for a specific highlight category\n *\n * @param id - The unique identifier for the request.\n * @param highlightCategory - The category of highlights to retrieve.\n * @param previewData - The data containing highlights and their locations.\n */\n retrieveHtmlContent(id: string, highlightCategory: string, previewData: PreviewData) {\n // Generate the list of items we want to retrieve\n const ids = previewData.highlightsPerCategory[highlightCategory]?.values[0]?.locations.map((_, i) => `${highlightCategory}_${i}`);\n\n if (this.allowWoker) {\n // if the worker is allowed, we send the message to the worker\n this.sendMessage({ action: 'get-html-webworker', id, ids, previewData });\n } else {\n this.sendMessage({ action: 'get-html', id, ids, previewData });\n }\n }\n\n /**\n * Sends a message to zoom in.\n *\n * This method triggers a \"zoom-in\" action by sending a message\n * with the specified action type.\n */\n zoomIn() {\n this.sendMessage({ action: 'zoom-in' });\n }\n\n /**\n * Sends a message to zoom out the preview.\n *\n * This method triggers a \"zoom-out\" action by sending a message\n * to the relevant service or component.\n */\n zoomOut() {\n this.sendMessage({ action: 'zoom-out' });\n }\n\n toggleAIDescription(value: boolean) {\n // Toggle the AI description in the preview\n this.sendMessage({ action: 'toggle-description', show: value });\n }\n\n /**\n * Toggles the highlights based on the provided flags for extracts and entities.\n *\n * @param extracts - A boolean flag indicating whether to include extracts highlights.\n * @param entities - A boolean flag indicating whether to include entities highlights.\n */\n toggle(extracts: boolean, entities: boolean) {\n const extractsHighlights = extracts ? this.highlights.filter(h => this.extracts.includes(h.name)) : [];\n const entitiesHighlights = entities ? this.highlights.filter(h => this.entities.includes(h.name)) : [];\n const highlights = [...extractsHighlights, ...entitiesHighlights];\n\n this.sendMessage({ action: 'highlight', highlights });\n }\n\n getAuditPreviewDetail(id: string, q: Partial<Query>) {\n const results = this.queryService.result;\n const queryLanguage = results?.queryAnalysis?.queryLanguage || q?.questionLanguage || this.appStore.getQueryByName(q.name!)?.questionLanguage;\n\n // if selection store contains the same id, use the record\n // otherwise use the preview data record\n // this will be helpful when reading the ranking of the document\n const article = getState(this.selectionStore).article;\n const record = article && article.id === id ? article : this.previewData?.record;\n\n const collectionColumn = record?.collection;\n const collection = !!collectionColumn ? collectionColumn[0] : id.split('|')[0];\n const rank = !!record ? record.rank : 0;\n const passages = record?.matchingpassages?.passages;\n const score = passages && passages.length ? passages[0].score : undefined;\n return {\n docid: id,\n rank,\n collection,\n source: collection.split('|')[0],\n resultid: results.id,\n querylang: queryLanguage,\n querytext: q?.text,\n filename: record?.filename,\n fileext: record?.fileext,\n score\n };\n }\n\n private fetchExtracts(id: string, extracts: string[], data: PreviewData): Extract[] {\n if (!data) return [];\n\n // extracts contains the html of extracts in chronological order\n // locations contains the list of start positions sorted by score\n const locations = data.highlightsPerCategory[this.highlightCategory]?.values[0]?.locations || [];\n\n // first extract all the extracts locations\n let extractslocations = locations.map((l, relevanceIndex) => ({\n startIndex: l.start,\n relevanceIndex\n })) as ExtractsLocations[];\n\n // sort them by start index\n extractslocations.sort((a, b) => a.startIndex - b.startIndex);\n\n // then extract the text of each extract\n extractslocations = extractslocations.map((ex, textIndex) => ({\n ...ex,\n textIndex: textIndex,\n text: extracts[textIndex] || '',\n id: `${this.highlightCategory}_${textIndex}`\n }));\n\n // then sanitize the text and remove empty extracts\n const _extracts = extractslocations\n .filter(item => item.text.trim().length > 0)\n .map(item => ({\n ...item,\n text: this.sanitizer.bypassSecurityTrustHtml(item.text)\n }));\n\n // finally sort them by relevance index\n _extracts.sort((a, b) => a.relevanceIndex - b.relevanceIndex);\n\n return _extracts;\n }\n\n /*\n * Get the preview configuration from the web service\n * and update the highlights accordingly\n */\n private updateHighlightsFromWebServiceConfiguration() {\n const previewConfig = this.appStore.getWebServiceByType('preview') as CCWebServicePreview;\n // remove \"extracts\" values from the highlights configuration\n const entities = previewConfig.highlights.split(',').filter(h => !this.extracts.includes(h));\n // merge the entities with the default highlights without duplicates\n this.entities = [...new Set([...this.entities, ...entities])];\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { getState } from '@ngrx/signals';\n\nimport { notify } from '@sinequa/atomic';\n\nimport { QueryParamsStore, UserSettingsStore } from '../stores';\nimport { SearchItem } 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 {SearchItem[]} An array of saved searches.\n */\n public getSavedSearches(): SearchItem[] {\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(saveName?: string) {\n const { text } = getState(this.queryParamsStore);\n const display = saveName || text;\n\n if (!display) {\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 } as SearchItem;\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 notify.success('Search successfully saved');\n }\n\n /**\n * Updates the saved searches in the user settings store.\n *\n * @param savedSearches - An array of SearchItem objects to update.\n */\n public updateSavedSearches(savedSearches: SearchItem[]) {\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}\n","import { inject, Injectable, Injector } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\nimport { catchError, map, Observable, of } from 'rxjs';\n\nimport { AuditEvents, globalConfig, Query, Result } from '@sinequa/atomic';\n\nimport { HttpClient } from '@angular/common/http';\nimport { QueryParamsStore, UserSettingsStore } from '../stores';\nimport { QueryService } from './query.service';\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/**\n * Service for performing search operations.\n *\n * @deprecated Use `QueryService` and `QueryParamsStore` instead.\n */\n@Injectable({\n providedIn: 'root'\n})\nexport class SearchService {\n protected readonly http = inject(HttpClient);\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 protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n /**\n * Executes a search operation with the given commands and options.\n *\n * @deprecated use `queryParamsStore` to update the query parameters and `queryService.search()` to perform the search.\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 * Retrieves the search result based on the provided query.\n *\n * @deprecated use `queryService.search()` instead.\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).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 *\n * @deprecated use queryService.gotoPage() instead.\n *\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([], {\n audit: {\n type: 'Search_GotoPage',\n detail: {\n page: page,\n fromresultid: this.result ? this.result.id : null\n }\n }\n });\n }\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { computed } from '@angular/core';\nimport { patchState, signalStore, signalStoreFeature, withComputed, 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 assistantIdsToAttach: string[];\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 withMultiSelectionFeatures()\n);\n\nexport function withSelectionFeatures() {\n return signalStoreFeature(\n withState({} as SelectionState),\n\n withMethods(store => ({\n /**\n * Updates the state with the provided new state's properties.\n *\n * @param newState - New state object containing only the properties to update.\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 state 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, assistantIdsToAttach: undefined };\n });\n }\n }))\n );\n}\n\nexport type MultiSelectionState = SelectionState & {\n multiSelection: Article[];\n};\n\nexport function withMultiSelectionFeatures() {\n return signalStoreFeature(\n withState({ multiSelection: [] as Article[] } as MultiSelectionState),\n\n withComputed(({ multiSelection }) => ({\n multiSelectCount: computed(() => multiSelection().length)\n })),\n\n withMethods(store => ({\n /**\n * Add an article to the multi-selection state.\n * @param article - The article to add to the multi-selection.\n */\n addArticleToMultiSelection(article: Article) {\n patchState(store, state => {\n const multiSelection = state.multiSelection || [];\n\n if (!multiSelection.some(a => a.id === article.id)) return { ...state, multiSelection: [...multiSelection, article] };\n\n return state;\n });\n },\n /**\n * Removes an article from the multi-selection state.\n * @param article - The article to remove from the multi-selection.\n */\n removeArticleFromMultiSelection(article: Article) {\n patchState(store, state => {\n const multiSelection = state.multiSelection || [];\n return { ...state, multiSelection: multiSelection.filter(a => a.id !== article.id) };\n });\n },\n /**\n * Clears the multi-selection state by resetting it to an empty array.\n */\n clearMultiSelection() {\n patchState(store, state => ({ ...state, multiSelection: [] }));\n }\n }))\n );\n}\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@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) 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.createUrlTree([], { relativeTo: this.route, queryParams: { id }, queryParamsHandling: 'merge' }).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, 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 * 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 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).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","import { assertInInjectionContext, inject } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { error, globalConfig, info, login, warn } from '@sinequa/atomic';\nimport { NavigationService } from '../services';\n\nexport async function signIn() {\n assertInInjectionContext(signIn);\n\n const router = inject(Router);\n const lastUrlAfterNavigation = inject(NavigationService).urlAfterNavigation;\n\n const { useCredentials, loginPath, userOverrideActive } = globalConfig;\n\n if (useCredentials && !userOverrideActive) {\n router.navigate([loginPath], { queryParams: { returnUrl: lastUrlAfterNavigation } });\n } else if (!userOverrideActive) {\n try {\n const response = await login();\n info('Response from login', response);\n if (!response) {\n warn('No response from login, redirecting to login page', response);\n }\n } catch (err: any) {\n error('Error during login', err);\n if (err.status === 401) {\n error('Unauthorized access - please check your credentials:', err?.errorMessage);\n router.navigate([loginPath]);\n }\n throw err;\n }\n }\n}\n","import { setGlobalConfig } from '@sinequa/atomic';\nimport { ApplicationService } from '../services';\nimport { signIn } from './sign-in';\n\n/**\n * Bootstraps the application by ensuring the user is authenticated and initializing the application.\n *\n * This function first attempts to sign in the user using the provided `Router`. If authentication is successful,\n * it proceeds to initialize the application and create routes using the `applicationService`. Any errors during\n * authentication or initialization are logged to the console, but the returned promise always resolves.\n *\n * @param Router - The application's router instance used for navigation and authentication.\n * @param applicationService - The service responsible for initializing the application and creating routes.\n * @returns A promise that resolves when the application is ready to be initialized, regardless of success or failure.\n */\nexport async function bootstrapApp(applicationService: ApplicationService, { createRoutes = true }): Promise<void> {\n // This function is used to test if the application is ready to be initialized\n // set the createRoutes flag in the global config\n setGlobalConfig({ createRoutes });\n\n return new Promise<void>(resolve => {\n // Check if the user is authenticated\n signIn()\n .then(() => {\n console.log('User authenticated, initializing application...');\n\n // Initialize the application\n if (!createRoutes) {\n // If createRoutes is false, we skip route creation\n applicationService\n .init()\n .then(() => {\n console.log('Application initialized without creating routes');\n resolve();\n })\n .catch(error => {\n console.error('Error initializing application without routes:', error);\n resolve();\n });\n } else {\n applicationService\n .initAndCreateRoutes()\n .then(() => {\n console.log('Application initialized');\n resolve();\n })\n .catch(error => {\n console.error('Error initializing application:', error);\n resolve();\n });\n }\n })\n .catch(error => {\n console.error('Error signing in:', error);\n resolve();\n });\n });\n}\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, AuditEvents, LegacyFilter, QueryParams as QueryParamsState, queryParamsFromUrl, SpellingCorrectionMode } from '@sinequa/atomic';\n\nimport { buildQuery } from '../utils';\nimport { ActivatedRoute, Router } from '@angular/router';\n\n/* shortened query params interface for brevity */\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 b?: string; // basket id\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), router = inject(Router), route = inject(ActivatedRoute)) => ({\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 if (!url) return;\n\n const path = url.split('?')[0];\n\n const { q: text, f, id, p, s: sort, c, t: tab, basket } = 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, basket };\n });\n },\n _updateUrlQueryParams(state: QueryParamsState, audit?: AuditEvents) {\n const { filters, page, sort, tab, text, basket } = state;\n const queryParams: QueryParams = {\n f: filters && filters.length > 0 ? JSON.stringify(filters) : undefined,\n p: page,\n s: sort,\n t: tab,\n q: text,\n b: basket\n };\n router.navigate([], { relativeTo: route, queryParamsHandling: 'merge', queryParams, state: { audit } });\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, audit?: AuditEvents) {\n this.updateFilter(filter, audit);\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, audit?: AuditEvents) {\n patchState(store, state => {\n if (filter === undefined) return state;\n\n const allFilters = state.filters || [];\n let newState;\n\n // search filter by name not by field because many filters can have the same field but different names\n const existing = allFilters.findIndex(f => f.name === filter.name);\n\n // Add filter if it doesn't exist and has values\n if (existing === -1) {\n newState = { ...state, filters: [...(allFilters || []), filter] };\n }\n\n if (existing >= 0) {\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 newState = { ...state, filters: allFilters.filter(f => f.name !== filter.name) };\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 newState = { ...state, filters: (allFilters || []).filter(f => f?.name !== filter.name) };\n }\n\n // Update filter values\n if (existing >= 0) {\n const filters = allFilters.toSpliced(existing, 1, filter);\n newState = { ...state, filters };\n }\n }\n\n this._updateUrlQueryParams(newState || state, audit);\n return newState || 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 const newState = { ...state, filters };\n this._updateUrlQueryParams(newState);\n return newState;\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, column?: string) {\n if (!name) return;\n const filters = getState(store).filters || [];\n // if the filter is not found by name, check if it is found by field\n if (filters.some(f => f.name === name) === false) {\n return this.removeFilter(column);\n }\n\n patchState(store, state => {\n const filters = state.filters?.filter(f => f.name !== name);\n const newState = { ...state, filters };\n this._updateUrlQueryParams(newState);\n return newState;\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 * along with the basket going undefined\n * It uses the `patchState` function to apply the state change.\n */\n clearFilters() {\n patchState(store, state => {\n const newState = { ...state, filters: [], basket: undefined };\n this._updateUrlQueryParams(newState);\n return newState;\n });\n },\n /**\n * Clears the basket from the state.\n *\n * This method updates the state by setting the `basket` property to undefined.\n * It uses the `patchState` function to apply the state change.\n */\n clearBasket() {\n patchState(store, state => {\n const newState = { ...state, basket: undefined };\n this._updateUrlQueryParams(newState);\n return newState;\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>, audit?: AuditEvents) {\n patchState(store, state => {\n const newState = { ...state, ...params };\n this._updateUrlQueryParams(newState, audit);\n return newState;\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 `field` or `name` parameters are provided. If not, returns null.\n * 2. Searches for a filter with a matching name in the store's filters.\n * 3. If no filter is found by name, searches for a filter with a matching field.\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({ field, name }: { field: string | undefined; name: string | undefined }): Partial<LegacyFilter & { count: number }> | null {\n if (!field && !name) return null;\n\n // first try to find the filter by name if name is provided\n let filter: LegacyFilter | undefined = undefined;\n if (name) {\n filter = getState(store).filters?.find(f => f?.name === name);\n }\n if (!filter && field) {\n // if not found by name, try to find it by field if field is provided\n filter = getState(store).filters?.find(f => f?.field === field);\n }\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, basket, 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\n ? ((conceptsFilters.filters as LegacyFilter[]).map(f => f.value) as string[])\n : ([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 ? ({ operator: 'and', filters } as LegacyFilter) : (filters[0] as LegacyFilter);\n\n const query = runInInjectionContext(injector, () => buildQuery({ filters: f, name, sort, spellingCorrectionMode, tab, text, basket }));\n return query;\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 /**\n * Loads the default theme for a given scope.\n *\n * @param {string} scope - The scope for the theme.\n * @param {boolean} [darkMode] - Optional. Enables dark mode.\n */\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, 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 * 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, 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 * 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\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 => element.style.setProperty(key, cssVars[key]));\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco';\n\nimport { AppStore } from '../../stores';\nimport { CSources } from '../../models';\n\n@Component({\n selector: 'source, Source',\n standalone: true,\n imports: [TranslocoPipe],\n templateUrl: './source.component.html',\n providers: [provideTranslocoScope('sources')]\n})\nexport class SourceComponent {\n readonly collection = input<string[]>();\n readonly connector = input<string>('');\n\n private readonly appStore = inject(AppStore);\n\n readonly iconDetails = computed((): { iconClass: string; iconPath?: string } | undefined => {\n const [collection] = this.collection() || [];\n const connector = (this.connector() ?? '').toLocaleLowerCase();\n\n if (!collection) return undefined;\n\n const src = this.appStore.sources() as CSources;\n const name = collection.split('/')[1].toLocaleLowerCase();\n\n const defaultIconClass = 'far fa-file';\n\n if (Array.isArray(src)) {\n const { icon: iconClass = defaultIconClass } = src.find((source: { name: string }) => source.name.toLocaleLowerCase() === name) || {};\n return { iconClass };\n }\n\n if (src.collection && Object.keys(src.collection as {}).includes(collection.toLocaleLowerCase())) {\n const { iconClass = defaultIconClass, iconPath } = src?.collection?.[collection.toLocaleLowerCase()];\n return { iconClass, iconPath };\n }\n if (src.source && Object.keys(src.source as {}).includes(name)) {\n const { iconClass = defaultIconClass, iconPath } = src?.source?.[name.toLocaleLowerCase()];\n return { iconClass, iconPath };\n }\n if (src.connector && Object.keys(src.connector as {}).includes(connector)) {\n const { iconClass = defaultIconClass, iconPath } = src?.connector?.[connector.toLocaleLowerCase()];\n return { iconClass, iconPath };\n }\n\n return { iconClass: defaultIconClass };\n });\n}\n","@if (iconDetails()?.iconPath) {\n <img [src]=\"iconDetails()?.iconPath\" [alt]=\"collection()?.[0] || ('sources.sourceIcon' | transloco)\" />\n} @else {\n <i class=\"{{ iconDetails()?.iconClass }}\" [attr.aria-label]=\"'sources.sourceIcon' | transloco\"></i>\n}\n","import { afterNextRender, Component, effect, ElementRef, inject, input, OnDestroy, signal, untracked, viewChild } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\n\nimport { Article, LegacyFilter } from '@sinequa/atomic';\nimport { ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent } from '@sinequa/ui';\n\nimport { AggregationsStore, QueryParamsStore } from '../../stores';\nimport { SourceComponent } from '../source/source.component';\n\n@Component({\n selector: 'document-locator, DocumentLocator',\n standalone: true,\n imports: [SourceComponent, ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent],\n template: `\n <!-- Renders all segment hidden to user to compute width -->\n <div #shadowRender class=\"pointer-events-none invisible absolute left-0 top-0 -z-10 flex gap-2\">\n @for (segment of locationSegments(); track $index) {\n <span class=\"whitespace-nowrap\">{{ segment }}</span>\n\n @if (!$last) {\n <i class=\"fal fa-chevron-right\"></i>\n }\n }\n </div>\n\n <Source class=\"flex\" [collection]=\"article().collection\" />\n\n <i class=\"fal fa-chevron-right\"></i>\n\n <div #documentLocator class=\"flex grow items-center gap-2 overflow-auto\">\n @for (segment of visibleSegments(); track $index) {\n <span class=\"cursor-pointer whitespace-nowrap\" role=\"button\" (click)=\"navigateToSegment($index)\">{{ segment }}</span>\n\n @if (!$last) {\n <i class=\"fa fal fa-chevron-right\"></i>\n }\n }\n\n @if (visibleSegments().length > 0 && invisibleSegments().length > 0) {\n <i class=\"fa fal fa-chevron-right\"></i>\n }\n\n @if (invisibleSegments().length > 0) {\n <menu>\n <button variant=\"outline\" class=\"h-0 w-full p-2\">...</button>\n\n <MenuContent position=\"bottom\">\n @for (segment of invisibleSegments(); track $index) {\n <MenuItem (click)=\"navigateToSegment($index, true)\">\n {{ segment }}\n </MenuItem>\n }\n </MenuContent>\n </menu>\n }\n </div>\n `,\n host: {\n class: 'flex items-center grow gap-2 overflow-hidden'\n }\n})\nexport class DocumentLocatorComponent implements OnDestroy {\n /**\n * A readonly property that holds the required `Article` input.\n * This property is used to ensure that an `Article` object is provided\n * as an input to the component.\n */\n readonly article = input.required<Article>();\n /**\n * The name of the aggregation to use for the document locator.\n */\n readonly aggregation = input.required<string>();\n\n readonly shadow = viewChild('shadowRender', { read: ElementRef });\n readonly client = viewChild('documentLocator', { read: ElementRef });\n\n readonly el = inject(ElementRef);\n readonly router = inject(Router);\n readonly queryParamStore = inject(QueryParamsStore);\n readonly aggregationStore = inject(AggregationsStore);\n\n readonly locationSegments = signal<string[]>([]);\n readonly visibleSegments = signal<string[]>([]);\n readonly invisibleSegments = signal<string[]>([]);\n\n // margin for dropdown segment with separator\n readonly margin = 70;\n\n previousCount?: number;\n resizeObserver?: ResizeObserver = new ResizeObserver(() => this.onResize());\n\n constructor() {\n this.resizeObserver!.observe(this.el.nativeElement);\n\n afterNextRender({ write: () => this.onResize() });\n\n effect(() => {\n const article = this.article();\n untracked(() => this.locationSegments.set(article.treepath[0]?.split('/').slice(1, -1) ?? []));\n });\n }\n\n ngOnDestroy(): void {\n this.resizeObserver!.disconnect();\n this.resizeObserver = undefined;\n }\n\n onResize(): void {\n const shadowElement = this.shadow()?.nativeElement as HTMLElement;\n const startPos = shadowElement.getBoundingClientRect().left;\n const clientWidth = (this.client()?.nativeElement as HTMLElement).clientWidth;\n\n if (!shadowElement.children || shadowElement.children.length === 0) return;\n\n let i = 0;\n\n for (; i < shadowElement.children.length; ++i) {\n // process if not a separator\n if (i % 2 === 0) {\n const width = shadowElement.children[i].getBoundingClientRect().right - startPos;\n\n if (width + this.margin >= clientWidth) break;\n }\n }\n\n if (!this.previousCount || i !== this.previousCount) {\n this.previousCount = i;\n\n this.visibleSegments.set(this.locationSegments().slice(0, Math.ceil(i / 2)));\n this.invisibleSegments.set(this.locationSegments().slice(Math.ceil(i / 2)));\n }\n }\n\n navigateToSegment(index: number, fromPopover = false): void {\n const aggregation = this.aggregationStore.getAggregation(this.aggregation());\n if (!aggregation) {\n console.error(`Aggregation ${this.aggregation()} not found`);\n return;\n }\n\n let currentFilter = this.queryParamStore.getFilter({ name: aggregation?.name, field: aggregation?.column });\n\n currentFilter ??= { name: aggregation.name, field: aggregation?.column, operator: 'in' } as LegacyFilter;\n currentFilter.values ??= [];\n\n if (fromPopover) {\n currentFilter.values.push(\n `/${this.locationSegments()\n .slice(0, this.locationSegments().length - (this.invisibleSegments().length - index) + 1)\n .join('/')}/*`\n );\n } else {\n currentFilter.values.push(\n `/${this.locationSegments()\n .slice(0, index + 1)\n .join('/')}/*`\n );\n }\n\n this.queryParamStore.updateFilter(currentFilter);\n\n const { filters } = getState(this.queryParamStore);\n\n this.router.navigate([], { queryParams: { f: JSON.stringify(filters) }, queryParamsHandling: 'merge' });\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { Router } from '@angular/router';\n\n@Component({\n selector: 'error-component, ErrorComponent',\n standalone: true,\n imports: [],\n template: `\n <div class=\"bg-background text-foreground flex min-h-screen flex-col items-center justify-center\">\n <svg\n class=\"mb-8 h-20 w-20 text-red-600\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n <path d=\"M12 9v4\" />\n <path d=\"M12 17h.01\" />\n </svg>\n <h1 class=\"mb-4 text-4xl font-bold\">Oops! Something went wrong</h1>\n <p class=\"text-muted-foreground mb-8 text-xl\">We apologize for the inconvenience.</p>\n <div class=\"flex space-x-4\">\n <button\n (click)=\"reload()\"\n class=\"btn btn-outline rounded-lg border-neutral-300 text-neutral-700 transition hover:bg-neutral-200 hover:text-neutral-700\">\n <svg\n class=\"mr-2 h-4 w-4\"\n xmlns=\"http://www.w3.org/2000/svg\"\n width=\"24\"\n height=\"24\"\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n stroke-width=\"2\"\n stroke-linecap=\"round\"\n stroke-linejoin=\"round\">\n <path d=\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\" />\n <path d=\"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n </svg>\n Go to Homepage\n </button>\n </div>\n </div>\n `\n})\nexport class ErrorComponent {\n router = inject(Router);\n\n reload() {\n this.router.navigate(['/']).then(() => window.location.reload());\n }\n}\n","import { Component, computed, DestroyRef, effect, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\n\nimport { isAuthenticated, login } from '@sinequa/atomic';\n\nimport { ApplicationStore, QueryParamsStore } from '../../stores';\n\n@Component({\n selector: 'app-wait',\n standalone: true,\n imports: [],\n template: `\n <div class=\"flex h-[100dvh] w-full items-center justify-center\">\n <div class=\"flex flex-col items-center space-y-4\">\n <span class=\"loader\"></span>\n </div>\n </div>\n `,\n styles: [\n `\n .loader {\n --w: 96px;\n --h: 96px;\n\n transform: rotateZ(45deg);\n perspective: 1000px;\n border-radius: 50%;\n width: var(--w);\n height: var(--h);\n color: #0040bf; /* Sinequa blue */\n }\n .loader:before,\n .loader:after {\n content: '';\n display: block;\n position: absolute;\n top: 0;\n left: 0;\n width: inherit;\n height: inherit;\n border-radius: 50%;\n transform: rotateX(70deg);\n animation: 1s spin linear infinite;\n }\n .loader:after {\n color: #ff854a; /* Sinequa orange */\n transform: rotateY(70deg);\n animation-delay: 0.4s;\n }\n\n @keyframes rotate {\n 0% {\n transform: translate(-50%, -50%) rotateZ(0deg);\n }\n 100% {\n transform: translate(-50%, -50%) rotateZ(360deg);\n }\n }\n\n @keyframes rotateccw {\n 0% {\n transform: translate(-50%, -50%) rotate(0deg);\n }\n 100% {\n transform: translate(-50%, -50%) rotate(-360deg);\n }\n }\n\n @keyframes spin {\n 0%,\n 100% {\n box-shadow: 0.4em 0px 0 0px currentcolor;\n }\n 12% {\n box-shadow: 0.4em 0.4em 0 0 currentcolor;\n }\n 25% {\n box-shadow: 0 0.4em 0 0px currentcolor;\n }\n 37% {\n box-shadow: -0.4em 0.4em 0 0 currentcolor;\n }\n 50% {\n box-shadow: -0.4em 0 0 0 currentcolor;\n }\n 62% {\n box-shadow: -0.4em -0.4em 0 0 currentcolor;\n }\n 75% {\n box-shadow: 0px -0.4em 0 0 currentcolor;\n }\n 87% {\n box-shadow: 0.4em -0.4em 0 0 currentcolor;\n }\n }\n `\n ]\n})\nexport class LoadingComponent {\n protected readonly state = computed(() => getState(this.application));\n\n private readonly application = inject(ApplicationStore);\n private readonly queryParamsStore = inject(QueryParamsStore);\n private readonly route = inject(ActivatedRoute);\n private readonly router = inject(Router);\n\n constructor(destroyRef: DestroyRef) {\n const timeout = setTimeout(() => {\n this.router.navigate(['/error'], {\n queryParams: { returnUrl: this.route.snapshot.queryParams['returnUrl'] }\n });\n }, 5000);\n\n destroyRef.onDestroy(() => {\n // clear the timeout if the component is destroyed\n clearTimeout(timeout);\n });\n\n effect(() => {\n const { ready } = this.state();\n\n if (ready) {\n // clear the timeout if the application is ready\n clearTimeout(timeout);\n\n setTimeout(() => {\n const url = this.route.snapshot.queryParams['returnUrl'] || null;\n if (!url) {\n this.router.navigateByUrl(url);\n // ! we need to set the query params from the url once only\n this.queryParamsStore.setFromUrl(url);\n } else {\n this.router.navigate(['/']);\n }\n }, 700);\n }\n });\n\n if (!isAuthenticated()) {\n this.application.updateReadyState(false);\n login()\n .then(() => {\n this.application.updateReadyState(true);\n })\n .catch(err => {\n console.error('Error during login:', err);\n this.router.navigate(['/error']);\n });\n }\n }\n}\n","import { Component, computed, input, numberAttribute, output } from '@angular/core';\n\nimport { Article, KeyOf, LegacyFilter, getMetadata } from '@sinequa/atomic';\nimport { BadgeComponent, BadgeVariants } from '@sinequa/ui';\n\n@Component({\n selector: 'Metadata, metadata',\n exportAs: 'metadata',\n standalone: true,\n imports: [BadgeComponent],\n template: `\n @for (item of items().slice(0, limit()); track $index) {\n @if (item) {\n <badge [variant]=\"variant()\" [class]=\"class()\" (click)=\"handleClick($event, { field: this.metadata(), value: item })\">{{ item }}</badge>\n }\n }\n `,\n host: {\n '[class.hidden]': 'items().length === 0'\n },\n styles: [\n `\n :host {\n display: contents;\n\n &,\n &:hover {\n background-color: transparent;\n }\n }\n `\n ]\n})\nexport class MetadataComponent {\n click = output<{ filter: LegacyFilter; event: Event }>();\n\n class = input<string>();\n variant = input<BadgeVariants['variant']>('default');\n\n metadata = input.required<KeyOf<Article> | (string & Record<never, never>)>();\n article = input.required<Partial<Article> | (string & Record<never, never>)>();\n limit = input(undefined, { transform: (value: string | number | undefined) => (value ? Math.max(0, Number(value)) : undefined) });\n\n items = computed(() => getMetadata(this.article(), this.metadata()));\n\n handleClick(event: Event, item: LegacyFilter) {\n this.click.emit({ filter: item, event });\n }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\nimport { Article } from '@sinequa/atomic';\nimport { QueryParamsStore } from '../../stores';\n\n@Component({\n selector: 'missing-terms, MissingTerms, missingterms',\n standalone: true,\n imports: [TranslocoPipe, RouterLink],\n templateUrl: './missing-terms.component.html',\n providers: [provideTranslocoScope('article')],\n styles: `\n .term {\n text-decoration-line: line-through;\n }\n `\n})\nexport class MissingTermsComponent {\n public readonly article = input.required<Article>();\n\n queryParamsStore = inject(QueryParamsStore);\n router = inject(Router);\n\n public missingTerms = computed(() => {\n const query = this.queryParamsStore.getQuery();\n return this.article()\n .termspresence?.filter(tp => tp.presence === 'missing')\n .map(tp => {\n const text = (query.text || '').replace(new RegExp(`\\\\b${tp.term}\\\\b`, 'gi'), '');\n return {\n value: tp.term,\n queryParams: { q: `${text} +[${tp.term}]` }\n };\n });\n });\n}\n","@if ((missingTerms() || []).length > 0) {\n <span class=\"terms-label\">{{ 'article.missingTerms' | transloco }}</span>\n <span class=\"terms\">\n @for (term of missingTerms(); track $index) {\n <span class=\"term ms-1\">{{ term.value }}</span>\n }\n </span>\n <span class=\"mx-1\">|</span>\n <span class=\"terms-label ms-1\">{{ 'article.mustInclude' | transloco }}</span>\n <span class=\"terms\">\n @for (term of missingTerms(); track $index) {\n <a role=\"button\" class=\"ms-1\" routerLink=\"search\" [queryParams]=\"term.queryParams\" (click)=\"$event.stopPropagation()\">{{ term.value }}</a>\n }\n </span>\n}\n","import { Component, computed, ElementRef, inject, linkedSignal, output, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { Article, bisect } from '@sinequa/atomic';\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogResult,\n DialogTitleComponent,\n InputComponent,\n ListItemComponent\n} from '@sinequa/ui';\n\nimport { Basket } from '../../../models';\nimport { QueryParamsStore, UserSettingsStore } from '../../../stores';\n\n@Component({\n selector: 'add-to-collection-dialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogContentComponent,\n DialogFooterComponent,\n ListItemComponent,\n InputComponent\n ],\n providers: [provideTranslocoScope('collections')],\n template: `\n <dialog #dialog (closed)=\"closeBtn.click()\">\n <DialogHeader>\n <DialogTitle>{{ 'collections.addToCollection' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent>\n <ul class=\"flex flex-col\" role=\"list\">\n @for (collection of collections(); track $index) {\n <li role=\"listitem\" (click)=\"addToCollection(collection, $index)\">\n @if (collectionsMap()[collection.name] === 'all') {\n <i class=\"fa-fw fa-regular fa-square-check\"></i>\n } @else if (collectionsMap()[collection.name] === 'some') {\n <i class=\"fa-fw fa-regular fa-square-minus\"></i>\n } @else {\n <i class=\"fa-fw fa-regular fa-square\"></i>\n }\n {{ collection.name }}\n </li>\n } @empty {\n <li class=\"py-4 text-center text-neutral-500\">\n {{ 'collections.noCollections' | transloco }}\n </li>\n }\n </ul>\n\n @if (creating()) {\n <input\n #createInput\n class=\"mt-2\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.aria-label]=\"'collections.collectionName' | transloco\"\n [attr.placeholder]=\"'collections.collectionName' | transloco\"\n [ngModel]=\"newCollectionName()\"\n (ngModelChange)=\"newCollectionName.set($event)\"\n (keydown.escape)=\"$event.preventDefault(); creating.set(false)\"\n (keydown.enter)=\"createCollection()\" />\n }\n </DialogContent>\n\n <DialogFooter class=\"flex flex-col\">\n <div class=\"flex w-full gap-1\">\n <button\n variant=\"outline\"\n class=\"grow\"\n tabindex=\"0\"\n [attr.title]=\"(creating() ? 'collections.cancelCreation' : 'collections.createCollection') | transloco\"\n (click)=\"onCreate()\">\n {{ (creating() ? 'collections.cancelCreation' : 'collections.createCollection') | transloco }}\n </button>\n @if (creating()) {\n <button class=\"grow\" tabindex=\"0\" [attr.title]=\"'collections.create' | transloco\" [disabled]=\"!newCollectionName()\" (click)=\"createCollection()\">\n {{ 'collections.create' | transloco }}\n </button>\n }\n </div>\n <button #closeBtn (click)=\"onClose($event)\" class=\"self-end\">\n {{ 'collections.close' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class CollectionsDialog implements DialogInterface {\n readonly closed = output<DialogResult>();\n\n readonly createInputElement = viewChild<ElementRef<HTMLInputElement>>('createInput');\n readonly dialogElement = viewChild<DialogComponent>(DialogComponent);\n\n private readonly queryParamStore = inject(QueryParamsStore);\n private readonly userSettingsStore = inject(UserSettingsStore);\n\n readonly collection = signal<string | undefined>(undefined);\n\n readonly article = signal<Article[]>([]);\n readonly newCollectionName = signal<string>('');\n readonly creating = signal<boolean>(false);\n readonly removedFromCollection = signal<boolean>(false);\n readonly collections = computed<Basket[]>(() => this.userSettingsStore.baskets());\n // Compute map of collection names to their article inclusion status\n readonly collectionsMap = linkedSignal(() =>\n this.collections().reduce<Record<string, 'all' | 'some' | 'none'>>((acc, collection) => {\n acc[collection.name] = this.containsArticle(collection);\n return acc;\n }, {})\n );\n\n open(article: Article | Article[]): void {\n if (!Array.isArray(article)) this.article.set([article]);\n else this.article.set(article);\n\n const { basket } = getState(this.queryParamStore);\n this.collection.set(basket);\n\n this.dialogElement()!.showModal();\n }\n\n containsArticleByName(collectionName: string): boolean {\n const collection = this.collections().find(c => c.name === collectionName);\n return !!collection && this.containsArticle(collection) !== 'none';\n }\n\n containsArticle(collection: Basket): 'all' | 'some' | 'none' {\n let b = bisect(this.article(), a => !!collection.ids?.includes(a.id));\n\n if (b.false.length === 0) return 'all';\n else if (b.true.length === 0) return 'none';\n\n return 'some';\n }\n\n onCreate(): void {\n if (this.creating()) return this.creating.set(false);\n\n this.creating.set(true);\n\n // Focus the input element with a delay because the input element is not yet rendered\n setTimeout(() => {\n this.createInputElement()?.nativeElement.focus();\n }, 1);\n }\n\n async onClose(e: Event) {\n this.dialogElement()!.close(e);\n\n // if we removed the article from the current collection,\n // we notify it using the \"dialog-confirm\" event which can\n // be caught by the app to trigger a refresh\n if (this.removedFromCollection()) {\n this.closed.emit('dialog-confirm');\n }\n }\n\n async addToCollection(collection: Basket, collectionIndex: number): Promise<void> {\n const ids = this.article()\n .map(article => article.id)\n .filter(id => !!id);\n\n if (!ids || ids.length === 0) return;\n\n if (this.containsArticle(collection) !== 'none') {\n // remove it\n const articleIds = this.article().map(a => a.id);\n collection.ids = collection.ids?.filter(id => !articleIds.includes(id)) ?? [];\n } else {\n // add it\n if (!collection.ids) collection.ids = [];\n\n const uniqueIds = new Set([...(collection.ids ?? []), ...this.article().map(x => x.id)]);\n collection.ids.push(...Array.from(uniqueIds));\n }\n\n try {\n await this.userSettingsStore.updateBasket(collection, collectionIndex);\n this.removedFromCollection.set(!!this.collection() && !this.containsArticleByName(this.collection()!));\n } catch (e) {\n console.error('Error updating collection:', e);\n }\n }\n\n createCollection(): void {\n if (!this.newCollectionName()) return;\n\n const collection: Basket = { name: this.newCollectionName() };\n this.userSettingsStore.createBasket(collection);\n this.newCollectionName.set('');\n this.creating.set(false);\n }\n}\n","import { HttpClient, HttpResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { map, Observable } from 'rxjs';\n\nimport { Article, AuditEventType, ExportOutputFormat, ExportQueryModel, ExportSourceType, globalConfig, Query } from '@sinequa/atomic';\n\nexport type ExportQueryOptions = {\n model: ExportQueryModel;\n appName: string;\n query: Query;\n article?: Article;\n name?: string;\n selection?: string[];\n};\n\n@Injectable({\n providedIn: 'root'\n})\nexport class ExportService {\n protected readonly API_URL = `${globalConfig.backendUrl}/${globalConfig.apiPath}`;\n\n protected readonly http = inject(HttpClient);\n\n /**\n * Downloads a file based on the provided options and triggers a browser download.\n *\n * @param options - The options for the download operation.\n * @param options.model - The export query model containing web service, format, max count, and exported columns.\n * @param options.appName - The name of the application initiating the download.\n * @param options.query - The query object used for the export operation.\n * @param options.article - (Optional) The article associated with the export.\n * @param options.name - (Optional) The custom name for the downloaded file. If not provided, the name is extracted from the response headers.\n * @param options.selection - (Optional) An array of id of selected items to export.\n * @returns An observable that emits the HTTP response containing the file blob.\n *\n * @remarks\n * This method handles file downloads for both modern browsers and Internet Explorer.\n * For modern browsers, it creates a temporary anchor element to trigger the download.\n * For Internet Explorer, it uses `msSaveOrOpenBlob` to handle the download.\n *\n * @example\n * ```typescript\n * const options = {\n * model: { webService: 'service', format: 'csv', maxCount: 100, exportedColumns: [] },\n * appName: 'MyApp',\n * query: myQuery,\n * name: 'exported-file.csv'\n * };\n * exportService.download(options).subscribe(response => {\n * console.log('File downloaded successfully');\n * });\n * ```\n */\n public download(options: ExportQueryOptions): Observable<HttpResponse<Blob>> {\n const { model, appName, query, article, name, selection } = options;\n return this.exportResult(appName, model.webservice, query, model.format, article, model.maxcount, model.exportedColumns, selection).pipe(\n map((response: HttpResponse<Blob>) => {\n const header = response.headers.get('content-disposition');\n const fileName = name || (header !== null ? header!.split('filename=')[1].replace('\"', '').replace('\"', '') : '');\n\n if (response.body === null) return response;\n const navigator: any = window.navigator;\n if (navigator && navigator.msSaveOrOpenBlob) {\n // For IE\n navigator.msSaveOrOpenBlob(response.body, fileName);\n } else {\n const link = document.createElement('a');\n document.body.appendChild(link);\n const blobUrl = window.URL.createObjectURL(response.body);\n link.href = blobUrl;\n link.download = fileName || `export.csv`;\n link.click();\n link.remove();\n window.URL.revokeObjectURL(blobUrl);\n }\n\n return response;\n })\n );\n }\n\n /**\n * Exports the current result.\n *\n * @param webService The configuration for the export web service.\n * @param query The query to export.\n * @param format The export format.\n * @param maxCount (Optional) The maximum number of exported rows.\n * @param exportedColumns (Optional) The columns to export, empty means all columns.\n * @param selection - (Optional) The list of id of selected items to export.\n *\n * @remarks If `selection` is provided, the type of export will be set to 'Selection'.\n */\n public exportResult(\n appName: string,\n webService: string,\n query: Query,\n format: ExportOutputFormat,\n results?: Article,\n maxCount?: number,\n exportedColumns?: string[],\n selection?: string[]\n ): Observable<HttpResponse<Blob>> {\n const type: ExportSourceType = selection && selection.length > 0 ? 'Selection' : 'Result';\n\n const postData = {\n app: appName,\n webService,\n query,\n type,\n format: format,\n maxCount: maxCount ? maxCount.toString() : undefined,\n exportedColumns: exportedColumns,\n selection: (selection ?? []).length > 0 ? selection : undefined,\n $auditRecord: {\n type: \"Search_ExportCSV\",\n detail: {\n resultid: results ? results.id : undefined\n }\n }\n };\n\n return this.http.post(this.API_URL + '/query.export', postData, {\n observe: 'response',\n responseType: 'blob'\n });\n }\n}\n","import { Component, DestroyRef, inject, linkedSignal, model, output, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { CCApp, CCWebService, ExportOutputFormat, ExportQueryModel } from '@sinequa/atomic';\nimport {\n ButtonComponent,\n cn,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent,\n SwitchComponent\n} from '@sinequa/ui';\nimport { AppStore, QueryParamsStore } from '../../../stores';\nimport { ExportQueryOptions, ExportService } from '../export.service';\n\ninterface CCQueryExport extends CCWebService {\n webServiceType: 'queryexport';\n columns?: { column$: CCQueryExportColumnDef[] };\n linksFilterDuplicateUrls?: boolean;\n linksGlobalRelevance?: string;\n linksMaxCount?: number;\n linksSortByOrder?: boolean;\n maxCount?: number;\n separator?: string;\n}\n\ninterface CCQueryExportColumnDef {\n title: string;\n pattern: string;\n selectionQuery?: string;\n}\n\n@Component({\n selector: 'export-dialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogContentComponent,\n DialogFooterComponent,\n SwitchComponent\n ],\n providers: [provideTranslocoScope('export')],\n template: `\n <dialog #dialog>\n <DialogHeader>\n <DialogTitle>{{ 'export.title' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent\n class=\"flex flex-col gap-4 [&_section>h1]:text-sm [&_section>h1]:font-semibold [&_section>h1]:text-gray-500 [&_section]:flex [&_section]:flex-col [&_section]:gap-2\">\n <section>\n <h1>{{ 'export.from' | transloco }}</h1>\n <div class=\"flex items-center gap-2\">\n <a role=\"button\" [class]=\"cn('cursor-pointer', !fromSelection() ? 'text-primary font-semibold' : '')\" (click)=\"fromSelection.set(false)\">\n {{ 'export.fromQuery' | transloco }}\n </a>\n <Switch size=\"xs\" [(toggled)]=\"fromSelection\" />\n <a role=\"button\" [class]=\"cn('cursor-pointer', fromSelection() ? 'text-primary font-semibold' : '')\" (click)=\"fromSelection.set(true)\">\n {{ 'export.fromSelection' | transloco }}\n </a>\n </div>\n </section>\n\n <section>\n <h1>{{ 'export.outputFormat' | transloco }}</h1>\n <select\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n id=\"format\"\n [(ngModel)]=\"format\">\n @for (format of supportedFormats; track $index) {\n <option [value]=\"format\">{{ format.toUpperCase() }}</option>\n }\n </select>\n </section>\n\n <section>\n <h1>{{ 'export.exportColumns' | transloco }}</h1>\n <select\n id=\"exportedColumns\"\n class=\"hover:outline-primary focus:outline-primary w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n multiple\n [(ngModel)]=\"columnsToExport\">\n @for (column of exportableColumns(); track $index) {\n <option [value]=\"column\">{{ column }}</option>\n }\n </select>\n </section>\n\n <section>\n <h1>{{ 'export.maxLines' | transloco }}</h1>\n <input\n type=\"number\"\n id=\"maxCount\"\n min=\"1\"\n autocomplete=\"off\"\n spellcheck=\"off\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n [(ngModel)]=\"maxCount\"\n (input)=\"onMaxCountInput($event)\" />\n </section>\n </DialogContent>\n\n <DialogFooter>\n <button variant=\"outline\" (click)=\"dialog.close($event)\">\n {{ 'cancel' | transloco }}\n </button>\n <button tabindex=\"0\" [attr.title]=\"'export.download' | transloco\" (click)=\"onDownload($event)\">\n {{ 'export.download' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class ExportDialog implements DialogInterface {\n cn = cn;\n\n onExport = output<ExportQueryModel>();\n\n private appStore = inject(AppStore);\n readonly exportService = inject(ExportService);\n readonly queryParamsStore = inject(QueryParamsStore);\n\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n private selection = signal<string[]>([]);\n readonly fromSelection = linkedSignal(() => this.selection()?.length > 0);\n public exportableColumns = signal<string[]>([]);\n public readonly supportedFormats: ExportOutputFormat[] = ['Csv', 'Xlsx', 'Json'];\n\n public format = model<ExportOutputFormat>('Csv');\n public maxCount = model<number | undefined>(undefined);\n public columnsToExport = model<string[]>([]);\n\n private destroyRef = inject(DestroyRef);\n\n open(selection?: string[]): void {\n const app = getState(this.appStore) as CCApp;\n const webservice = app.queryExport;\n\n let queryExport: CCQueryExport;\n\n if (selection && selection.length > 0) this.selection.set(selection!);\n\n if (webservice) {\n queryExport = app.webServices[webservice] as CCQueryExport;\n\n if (queryExport) {\n const columns = queryExport.columns?.column$ || [];\n this.exportableColumns.set(columns.map(column => column.title));\n\n if (queryExport.maxCount && typeof queryExport.maxCount === 'number') {\n this.maxCount.set(queryExport.maxCount);\n }\n }\n }\n\n setTimeout(() => {\n this.dialog()!.showModal();\n });\n }\n\n onDownload(e: Event) {\n const app = getState(this.appStore) as CCApp;\n const webservice = app.queryExport;\n\n const model: ExportQueryModel = {\n format: this.format(),\n export: 'Result',\n maxcount: this.maxCount() && this.maxCount()! > 0 ? this.maxCount() : undefined,\n exportedColumns: this.columnsToExport().length ? this.columnsToExport() : undefined,\n webservice: webservice\n };\n\n const { name } = getState(this.appStore) as CCApp;\n const query = this.queryParamsStore.getQuery();\n const selection = this.selection();\n const payload = { model, appName: name, query } as ExportQueryOptions;\n\n if (this.fromSelection()) payload.selection = selection;\n\n this.exportService.download(payload).pipe(takeUntilDestroyed(this.destroyRef)).subscribe();\n\n this.dialog()!.close(e);\n }\n\n onMaxCountInput(event: Event) {\n const input = event.target as HTMLInputElement;\n if (input.valueAsNumber < 1) {\n input.value = '1';\n this.maxCount.set(1);\n }\n }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { getState } from '@ngrx/signals';\nimport { cva, type VariantProps } from 'class-variance-authority';\n\nimport { CCApp } from '@sinequa/atomic';\nimport { cn, DialogService } from '@sinequa/ui';\n\nimport { CollectionsDialog } from '../../features/collections/dialogs/add.dialog';\nimport { ExportDialog } from '../../features/export/dialogs/export.dialog';\nimport { AppStore, SelectionStore } from '../../stores';\nimport { APP_FEATURES } from '../../tokens/app-features';\n\nconst multiSelectionToolbarVariants = cva(\n 'flex divide-x rounded-xl bg-gradient-to-b px-3 py-2 text-sm shadow [&>li]:px-2 [&_ul]:flex [&_ul]:flex-col [&_ul]:p-1',\n {\n variants: {\n variant: {\n dark: 'from-gray-500 to-gray-900 divide-gray-800 text-white',\n light: 'from-white to-purple-50 divide-gray-400 text-gray-800',\n glassy: 'from-transparent to-white divide-gray-300 text-gray-800 backdrop-blur-[15px]'\n }\n },\n defaultVariants: {\n variant: 'dark'\n }\n }\n);\nexport type MultiSelectionToolbarVariants = VariantProps<typeof multiSelectionToolbarVariants>;\n\n@Component({\n selector: 'MultiSelectionToolbar, multi-selection-toolbar',\n template: `\n <menu id=\"multi-select-toolbar\" [class]=\"cn(variants(), className())\">\n <li class=\"!ps-0\">\n {{ count() }} items selected\n <button class=\"cursor-pointer\" (click)=\"clearSelection()\">\n <i class=\"fa-fw far fa-xmark\"></i>\n </button>\n </li>\n\n <li>\n <button class=\"cursor-pointer\" title=\"menu\" [attr.aria-label]=\"'menu'\" (click)=\"openCollectionDialog()\">\n <i class=\"fa-fw far fa-inbox\"></i>\n Collections\n </button>\n </li>\n\n <li>\n <button class=\"cursor-pointer\" (click)=\"openExportDialog()\">\n <i class=\"fa-fw far fa-file-export\"></i>\n Export\n </button>\n </li>\n\n @if (enabledUserInput()) {\n <li class=\"!pe-0\">\n <button class=\"cursor-pointer\" (click)=\"attachToAssistant()\">\n <i class=\"fa-fw far fa-sparkles\"></i>\n Send to AI\n </button>\n </li>\n }\n </menu>\n `,\n host: {\n class: 'fixed bottom-[-40px] left-[50%] translate-x-[-50%] z-50 transition-[translate,opacity,discrete] duration-300 opacity-0',\n '[class.opacity-100]': 'count() > 0',\n '[class.-translate-y-14]': 'count() > 0'\n }\n})\nexport class MultiSelectionToolbarComponent {\n cn = cn;\n\n readonly appStore = inject(AppStore);\n readonly selection = inject(SelectionStore);\n readonly dialog = inject(DialogService);\n readonly appFeatures = inject(APP_FEATURES);\n\n readonly className = input<string>('');\n readonly variant = input<MultiSelectionToolbarVariants['variant']>('dark');\n\n readonly count = this.selection.multiSelectCount;\n readonly variants = computed(() => cn(multiSelectionToolbarVariants({ variant: this.variant(), class: this.className() })));\n readonly ids = computed(() => getState(this.selection).multiSelection.map(x => x.id));\n readonly instanceId = computed(() => {\n const {\n assistant: { usePrefixName = true }\n } = this.appFeatures;\n if (usePrefixName) {\n const { name } = getState(this.appStore) as CCApp;\n return `${name}-search-results-assistant`;\n }\n return `search-results-assistant`;\n });\n readonly enabledUserInput = computed(() => this.appStore.assistants()[this.instanceId()]?.['modeSettings']?.['enabledUserInput'] === true);\n\n clearSelection = () => this.selection.clearMultiSelection();\n openCollectionDialog = () => this.dialog.open(CollectionsDialog, getState(this.selection).multiSelection);\n openExportDialog = () => this.dialog.open(ExportDialog, this.ids());\n attachToAssistant = () => this.selection.update({ assistantIdsToAttach: this.ids() });\n}\n","import { afterNextRender, Directive, ElementRef, input, OnDestroy, output } from '@angular/core';\n\n/**\n * Represents a directive that enables infinite scrolling behavior.\n * This directive listens for the intersection of the element with the viewport\n * and emits a `loadMore` event when the element becomes visible.\n *\n * @remarks\n * This directive requires the `IntersectionObserver` API to be available in the browser.\n *\n * @example\n * ```html\n * <div infinityScroll (onScroll)=\"loadMore()\">\n * <!-- Content to be scrolled -->\n * </div>\n * ```\n *\n */\n@Directive({\n // eslint-disable-next-line @angular-eslint/directive-selector\n selector: '[infinity-scroll]',\n standalone: true\n})\nexport class InfinityScrollDirective implements OnDestroy {\n options = input({ root: null });\n onScroll = output();\n\n private observer = new IntersectionObserver(([entry]) => {\n if (entry.isIntersecting) {\n this.onScroll.emit();\n }\n }, this.options());\n\n constructor(private el: ElementRef) {\n afterNextRender(() => {\n this.observer.observe(this.el.nativeElement);\n });\n }\n\n ngOnDestroy() {\n this.observer.disconnect();\n }\n}\n","import { afterNextRender, computed, Directive, effect, inject, input, OnDestroy, output, Renderer2, signal, untracked } from '@angular/core';\n\nexport type KeyboardNavigationOnSelectionHandlers = {\n hideListbox?: boolean;\n resetSelection?: boolean;\n};\n\nexport type KeyboardNavigatorOptions = {\n name?: string; // Used for debugging or identification\n optionSelector: string;\n direction?: 'horizontal' | 'vertical' | 'both';\n selectOnFocus?: boolean;\n resetSelectionOnBlur?: boolean;\n onSelectionHandlers?: KeyboardNavigationOnSelectionHandlers;\n};\n\nconst defaultNavigatorOptions: KeyboardNavigatorOptions = {\n name: 'defaultNavigator',\n optionSelector: '[role=\"option\"]:not([aria-disabled=\"true\"])',\n direction: 'vertical',\n selectOnFocus: false,\n resetSelectionOnBlur: false,\n onSelectionHandlers: {\n hideListbox: true,\n resetSelection: true\n }\n};\n\n@Directive({\n selector: 'input[role=\"combobox\"]',\n standalone: true,\n host: {\n '(focus)': 'focus()',\n '(blur)': 'blur()',\n '(keydown.arrowup)': 'up()',\n '(keydown.arrowdown)': 'down()',\n '(keydown.arrowleft)': 'left()',\n '(keydown.arrowright)': 'right()',\n '(keydown.home)': 'home()',\n '(keydown.end)': 'end()',\n '(keydown.pageup)': 'pageUp()',\n '(keydown.pagedown)': 'pageDown()',\n '(keydown.enter)': 'enter()',\n '(keydown.escape)': 'escape()',\n '[attr.aria-expanded]': 'ariaExpanded()',\n '[attr.aria-activedescendant]': 'activeDescendant()'\n }\n})\nexport class KeyboardNavigatorDirective implements OnDestroy {\n readonly keyboardNavigator = input(defaultNavigatorOptions, { transform: this.normalizeOptions });\n readonly listboxId = input<string>('', { alias: 'aria-controls' });\n\n readonly onFocus = output<void>();\n readonly onBlur = output<void>();\n readonly onSelected = output<HTMLElement | null>();\n\n readonly ariaExpanded = signal<boolean>(false);\n readonly activeDescendant = signal<string | undefined>(undefined);\n\n private readonly renderer = inject(Renderer2);\n\n private readonly listboxElement = signal<HTMLElement | null>(null);\n private readonly items = signal<HTMLElement[] | null>(null);\n private readonly hasItems = computed(() => this.items() && this.items()!.length > 0);\n private readonly currentIndex = signal<number>(-1);\n private readonly previousIndex = signal<number>(-1);\n\n private readonly unlisteners: (() => void)[] = [];\n private readonly mutationObserver = new MutationObserver(() => this.setItems());\n\n constructor() {\n // Try to attach the listbox element after the first render\n afterNextRender(() => this.attachListboxElement());\n\n // Re-attach the listbox element whenever the listboxId changes\n effect(() => {\n this.listboxId();\n untracked(() => this.attachListboxElement());\n });\n }\n\n ngOnDestroy(): void {\n this.mutationObserver.disconnect();\n this.cleanupListeners();\n }\n\n /** Attaches the listbox element based on the `listboxId`. */\n private attachListboxElement(): void {\n if (!this.listboxId()) return;\n\n this.setListboxElement();\n\n if (!this.listboxElement()) return;\n\n this.setItems();\n\n this.mutationObserver.observe(this.listboxElement()!, { childList: true });\n }\n\n /**\n * Merges given option with default options.\n * @param {KeyboardNavigatorOptions} options - Options to merge with defaults.\n * @returns {KeyboardNavigatorOptions} Merged options.\n */\n normalizeOptions(options: KeyboardNavigatorOptions): KeyboardNavigatorOptions {\n return Object.assign({}, defaultNavigatorOptions, options);\n }\n\n //#region DOM Events\n\n /** Focuses the listbox and selects the first item if configured to do so. */\n focus(): void {\n this.showListbox();\n\n if (this.keyboardNavigator()?.selectOnFocus && this.hasItems() && this.currentIndex() === -1) {\n this.currentIndex.set(0);\n this.updateActiveItem();\n }\n\n this.onFocus.emit();\n }\n\n /** Blurs the listbox, hiding it and resetting selection if configured to do so. */\n blur(): void {\n this.hideListbox();\n\n if (this.keyboardNavigator()?.resetSelectionOnBlur) this.resetSelection();\n\n this.onBlur.emit();\n }\n\n /**\n * Moves selection to previous element in vertical and both navigation directions.\n * Does nothing if navigation direction is set to horizontal.\n */\n up(): void {\n if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n this.moveSelection(-1);\n }\n\n /**\n * Moves selection to next element in vertical and both navigation directions.\n * Does nothing if navigation direction is set to horizontal.\n */\n down(): void {\n if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n this.moveSelection(1);\n }\n\n /**\n * Moves selection to first element in vertical and both navigation directions.\n * Does nothing if navigation direction is set to horizontal.\n */\n pageUp(): void {\n if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n this.moveSelection(-1, true);\n }\n\n /**\n * Moves selection to last element in vertical and both navigation directions.\n * Does nothing if navigation direction is set to horizontal.\n */\n pageDown(): void {\n if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n this.moveSelection(1, true);\n }\n\n /**\n * Moves selection to previous element in horizontal and both navigation directions.\n * Does nothing if navigation direction is set to vertical.\n */\n left(): void {\n if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n this.moveSelection(-1);\n }\n\n /**\n * Moves selection to next element in horizontal and both navigation directions.\n * Does nothing if navigation direction is set to vertical.\n */\n right(): void {\n if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n this.moveSelection(1);\n }\n\n /**\n * Moves selection to first element in horizontal and both navigation directions.\n * Does nothing if navigation direction is set to vertical.\n */\n home(): void {\n if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n this.moveSelection(-1, true);\n }\n\n /**\n * Moves selection to last element in horizontal and both navigation directions.\n * Does nothing if navigation direction is set to vertical.\n */\n end(): void {\n if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n this.moveSelection(1, true);\n }\n\n /**\n * Selects the currently focused item and emits it.\n * Hides the listbox and resets selection if configured to do so.\n */\n enter(): void {\n const element = this.items()?.[this.currentIndex()];\n\n this.onSelected.emit(element ?? null);\n\n if (this.keyboardNavigator()?.onSelectionHandlers?.hideListbox) this.hideListbox();\n if (this.keyboardNavigator()?.onSelectionHandlers?.resetSelection) this.resetSelection();\n }\n\n /** Does nothing. */\n escape(): void {}\n\n //#endregion DOM Events\n\n /**\n * Sets the listbox element based on the provided `listboxId`, expected to\n * be set via the `aria-controls` attribute. If the element is not found,\n * logs an error.\n */\n private setListboxElement(): void {\n const target = document.getElementById(this.listboxId());\n\n if (!target) {\n console.error(`NavigatorDirective: target element with id ${this.listboxId()} not found`);\n return;\n }\n\n this.listboxElement.set(target);\n }\n\n /**\n * Sets the items in the listbox by querying for elements matching the `optionSelector`.\n * Cleans up previous listeners and hooks new ones to handle item clicks.\n * Resets the selection state.\n */\n private setItems(): void {\n if (!this.listboxElement()) {\n console.error('NavigatorDirective: listbox element is not set');\n return;\n }\n\n this.cleanupListeners();\n\n const items = Array.from(this.listboxElement()!.querySelectorAll(this.keyboardNavigator()!.optionSelector)) as HTMLElement[];\n this.items.set(items);\n\n this.hookItemsClicks();\n this.resetSelection();\n }\n\n /** Cleans up all event listeners that were added to the items. */\n private cleanupListeners(): void {\n this.unlisteners.forEach(unlisten => unlisten());\n this.unlisteners.length = 0;\n }\n\n //#region Selection\n\n /** Resets the selection state. */\n public resetSelection(): void {\n this.currentIndex.set(-1);\n this.previousIndex.set(-1);\n this.activeDescendant.set(undefined);\n this.items()?.forEach(item => this.renderer.setAttribute(item, 'aria-selected', 'false'));\n }\n\n /**\n * Hooks click events on each item in the listbox, and registers a entry into\n * `unlisteners` for future cleanup.\n * `mousedown` event is used to ensure the click is registered before any blur events.\n */\n private hookItemsClicks(): void {\n if (!this.hasItems()) return;\n\n this.items()!.forEach((item, index) => this.unlisteners.push(this.renderer.listen(item, 'mousedown', () => this.itemClicked(item, index))));\n }\n\n /**\n * Handles item click events, updates the current index, emits the selected item,\n * and hides the listbox if configured to do so.\n * @param {HTMLElement} element - The clicked item element.\n * @param {number} index - The index of the clicked item.\n */\n private itemClicked(element: HTMLElement, index: number): void {\n this.previousIndex.set(this.currentIndex());\n this.currentIndex.set(index);\n\n this.updateActiveItem();\n\n this.onSelected.emit(element);\n\n if (this.keyboardNavigator()?.onSelectionHandlers?.hideListbox) this.hideListbox();\n if (this.keyboardNavigator()?.onSelectionHandlers?.resetSelection) this.resetSelection();\n }\n\n /**\n * Moves the selection in the specified direction.\n * If `extreme` is true, it moves to the first or last item based on the direction.\n * If `extreme` is false, it wraps around the list.\n * @param {number} direction - The direction to move the selection: -1 for previous, 1 for next.\n * @param {boolean} extreme - Whether to move to the first or last item instead of wrapping around.\n * Defaults to false.\n */\n private moveSelection(direction: number, extreme: boolean = false): void {\n if (!this.hasItems()) return;\n\n let index = this.currentIndex() + direction;\n\n // if extreme is true, we seek the first or last item\n if (extreme) {\n if (direction < 0) index = 0;\n else index = this.items()!.length - 1;\n } else {\n if (index < 0) index = this.items()!.length - 1;\n else if (index >= this.items()!.length) index = 0;\n }\n\n this.previousIndex.set(this.currentIndex());\n this.currentIndex.set(index);\n\n this.updateActiveItem();\n }\n\n /**\n * Updates the active item in the listbox.\n * If there was a previously active item, it sets its `aria-selected`\n * attribute to `false`. Sets the `aria-selected` attribute on the currently\n * active item, and scrolls it into view.\n */\n private updateActiveItem(): void {\n if (!this.hasItems()) return;\n\n const previousItem = this.items()?.[this.previousIndex()];\n\n if (previousItem) this.renderer.setAttribute(previousItem, 'aria-selected', 'false');\n\n const currentItem = this.items()?.[this.currentIndex()];\n\n if (currentItem) {\n this.renderer.setAttribute(currentItem, 'aria-selected', 'true');\n\n currentItem.scrollIntoView({ block: 'nearest' });\n }\n }\n\n //#endregion Selection\n\n //#region Visibility\n\n /**\n * Shows the listbox by setting `aria-hidden` to `false` and updating the\n * `aria-expanded` state.\n */\n private showListbox(): void {\n this.renderer.setAttribute(this.listboxElement()!, 'aria-hidden', 'false');\n\n this.ariaExpanded.set(true);\n }\n\n /**\n * Hides the listbox by setting `aria-hidden` to `true` and updating the\n * `aria-expanded` state.\n */\n private hideListbox(): void {\n this.renderer.setAttribute(this.listboxElement()!, 'aria-hidden', 'true');\n\n this.ariaExpanded.set(false);\n }\n\n //#endregion Visibility\n}\n","import { Directive, HostListener, inject, input } from '@angular/core';\n\nimport { Article } from '@sinequa/atomic';\nimport { PreviewService } from '../services/preview.service';\n\n/**\n * Directive that opens an article on ctrl + enter.\n */\n@Directive({\n selector: '[appOpenArticleOnCtrlEnter],[openArticleOnCtrlEnter]',\n standalone: true\n})\nexport class OpenArticleOnCtrlEnterDirective {\n private readonly previewService = inject(PreviewService);\n\n public readonly article = input.required<Article | undefined>();\n\n @HostListener('keydown.control.Enter')\n public onCtrlEnter(): void {\n if (!this.article()) return;\n this.previewService.openExternal(this.article()!);\n }\n}\n","import { afterNextRender, contentChild, contentChildren, Directive, ElementRef, inject, input, OnDestroy, output, OutputRefSubscription } from '@angular/core';\n\n/**\n * Directive to be used on elements that should be counted as items in the\n * overflow manager.\n */\n@Directive({\n selector: '[overflowItem]',\n standalone: true\n})\nexport class OverflowItemDirective {}\n\n/**\n * Directive to be used on the element that should be considered as the limit\n * for the overflow manager.\n */\n@Directive({\n selector: '[overflowStop]',\n standalone: true\n})\nexport class OverflowStopDirective {}\n\n/**\n * Directive that takes items and a stop element to count the number of items\n * that can fit before the stop element.\n * The directive will apply a `visibility: hidden` on the items that are not\n * visible.\n *\n * You can specify a target element to observe for resize events, otherwise the\n * directive will observe the element itself.\n *\n * This directive cannot be used on `hostDirectives` as it needs access to the\n * DOM elements. To use is as a host directive, wrap it in a `ng-container` and\n * define a target.\n *\n * @input target - The target element to observe for resize events.\n * @input margin - Margin to add for calculating the overflow.\n *\n * @output count - The number of items that can fit before the stop element,\n * count is debounced to avoid multiple updates.\n *\n * @example\n * ```typescript\n * <ng-container\n * overflowManager\n * class=\"flex gap-2 overflow-hidden\"\n * [target]=\"el.nativeElement\"\n * (count)=\"updateCount($event)\"\n * >\n * <ul>\n * \\@for (let item of [1, 2, 3, 4, 5]) {\n * <li overflowItem>{{ item }}</li>\n * }\n * </ul>\n *\n * <div overflowStop class=\"absolute right-0\"></div>\n * </ng-container>\n * ```\n */\n@Directive({\n selector: '[overflowManager]',\n standalone: true\n})\nexport class OverflowManagerDirective implements OnDestroy {\n readonly items = contentChildren(OverflowItemDirective, { descendants: true, read: ElementRef });\n readonly stop = contentChild(OverflowStopDirective, { descendants: true, read: ElementRef });\n\n readonly target = input<HTMLElement | undefined>();\n readonly margin = input(4);\n readonly direction = input<'horizontal' | 'vertical'>('horizontal');\n readonly count = output<number>();\n\n private readonly el = inject(ElementRef).nativeElement;\n\n private readonly resizeObserver = new ResizeObserver(() => this.countItems());\n\n private countSub: OutputRefSubscription | undefined;\n private _lastCount: number | undefined;\n\n constructor() {\n afterNextRender({\n read: () => {\n // subscribe to resize events on the target element or the directive element\n this.resizeObserver.observe(this.target() ?? this.el);\n // count at least once without resize event\n this.countItems();\n }\n });\n\n // listens to the count output and toggles the visibility of the items\n this.countSub = this.count.subscribe(count => this.toggleToCount(count));\n }\n\n ngOnDestroy(): void {\n this.countSub?.unsubscribe();\n this.countSub = undefined;\n }\n\n /**\n * Counts the number of items that can fit before the stop element.\n * Emits the count if it has changed.\n * Debounces the count to avoid multiple updates.\n */\n countItems(): void {\n if (!this.items() || this.items().length === 0 || !this.stop()) return;\n\n const stopRect = this.stop()!.nativeElement.getBoundingClientRect();\n const itemsRects = this.items().map(item => item.nativeElement.getBoundingClientRect());\n\n let count = 0;\n\n for (let rect of itemsRects) {\n // if the direction is horizontal, we check the right side of the item\n if (this.direction() === 'horizontal' && rect.right + this.margin() <= stopRect.left) count++;\n // if the direction is vertical, we check the bottom side of the item\n else if (this.direction() === 'vertical' && rect.bottom + this.margin() <= stopRect.top) count++;\n else break;\n }\n\n if (this._lastCount === count) return;\n\n this._lastCount = count;\n this.count.emit(count);\n }\n\n /**\n * Toggles the visibility of the items based on the count.\n * @param count - The number of items to keep visible.\n */\n toggleToCount(count: number): void {\n this.items().forEach((item, index) => {\n const state = index < count ? 'visible' : 'hidden';\n\n // apply equivalent of tailwind invisible class\n item.nativeElement.style.visibility = state;\n });\n }\n}\n","import { EventEmitter, Injectable, OnDestroy, Type, inject } from '@angular/core';\r\nimport { BehaviorSubject, Subscription } from 'rxjs';\r\nimport { getState } from '@ngrx/signals';\r\n\r\nimport { Article } from '@sinequa/atomic';\r\nimport { NavigationService, SelectionHistoryService, SelectionService } from '../../services';\r\nimport { SelectionStore } from '../../stores';\r\nimport { BackdropService } from '../../components';\r\n\r\n@Injectable({\r\n providedIn: 'root'\r\n})\r\nexport class DrawerStackService implements OnDestroy {\r\n public readonly isOpened = new BehaviorSubject<boolean>(false);\r\n public readonly toggleTopDrawerExtension$ = new EventEmitter<void>();\r\n public readonly forceTopDrawerCollapse$ = new EventEmitter<void>();\r\n public readonly closeTopDrawer$ = new EventEmitter<void>();\r\n public readonly closeAllDrawers$ = new EventEmitter<void>();\r\n\r\n public readonly isChatOpened = new BehaviorSubject<boolean>(false);\r\n public readonly openChatDrawer$ = new EventEmitter<void>();\r\n public readonly closeChatDrawer$ = new EventEmitter<void>();\r\n public readonly askAI$ = new EventEmitter<string>();\r\n\r\n private readonly selection = inject(SelectionService);\r\n private readonly selectionHistory = inject(SelectionHistoryService);\r\n private readonly selectionStore = inject(SelectionStore);\r\n private readonly navigationService = inject(NavigationService);\r\n private readonly backdropService = inject(BackdropService);\r\n\r\n private readonly subscriptions = new Subscription();\r\n\r\n public componentType?: Type<any>;\r\n\r\n constructor() {\r\n // on new search, close all drawers including chat drawer\r\n this.subscriptions.add(\r\n this.navigationService.navigationEnd$.subscribe(() => {\r\n this.closeAssistant();\r\n this.closeAll();\r\n })\r\n );\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.subscriptions.unsubscribe();\r\n }\r\n\r\n /**\r\n * Sets current drawer stack status to open\r\n */\r\n public open(componentType?: Type<any>): void {\r\n this.componentType = componentType;\r\n this.isOpened.next(true);\r\n }\r\n\r\n /**\r\n * Emits event to extend the top drawer\r\n */\r\n public extend(): void {\r\n this.toggleTopDrawerExtension$.next();\r\n }\r\n\r\n /**\r\n * Emits event to close the top drawer, checks if history is empty, if so,\r\n * sets current drawer stack status to closed and clears history and current\r\n * selection\r\n */\r\n public close(): void {\r\n this.closeTopDrawer$.next();\r\n\r\n if (this.selectionHistory.getCurrentSelectionIndex() === -1) {\r\n this.isOpened.next(false);\r\n this.selectionHistory.clearHistory();\r\n }\r\n }\r\n\r\n /**\r\n * Emits event to close the top drawer\r\n */\r\n public closeTop(): void {\r\n this.closeTopDrawer$.next();\r\n }\r\n\r\n /**\r\n * Sets current drawer stack status to closed, clears history and emits event\r\n * to close all drawers\r\n *\r\n * @param keepDrawerOpen if true, do not trigger layout animation\r\n */\r\n public closeAll(keepDrawerOpen: boolean = false): void {\r\n if (!keepDrawerOpen) this.isOpened.next(false);\r\n\r\n this.selectionHistory.clearHistory();\r\n\r\n this.closeAllDrawers$.next();\r\n }\r\n\r\n /**\r\n * Replace the current selection with the given article by closing all\r\n * drawers and opening the drawer with the new selection without triggering\r\n * layout animation\r\n *\r\n * @param article the article to replace the current selection with\r\n */\r\n public replace(article: Article | undefined, withQueryText?: boolean): void {\r\n const { id } = getState(this.selectionStore);\r\n\r\n if (id && (!article || article.id === id)) return;\r\n\r\n // close everything without trigger layout animation\r\n this.closeAll(true);\r\n\r\n // set selection\r\n this.selection.setCurrentArticle(article, withQueryText);\r\n // open drawer\r\n this.open();\r\n }\r\n\r\n /**\r\n * Stack the given article by setting the current selection and opening the\r\n * drawer\r\n *\r\n * @param article the article to stack\r\n */\r\n public stack(article: Article | undefined, withQueryText?: boolean): void {\r\n const { id } = getState(this.selectionStore);\r\n\r\n if (id && (!article || article.id === id)) return;\r\n\r\n // force top drawer to collapse\r\n this.forceTopDrawerCollapse$.next();\r\n // set selection\r\n this.selection.setCurrentArticle(article, withQueryText);\r\n // open drawer\r\n this.open();\r\n }\r\n\r\n public toggleAssistant(): void {\r\n if (this.isChatOpened.getValue()) {\r\n this.backdropService.hide();\r\n this.closeAssistant();\r\n } else {\r\n this.backdropService.show();\r\n this.openAssistant();\r\n }\r\n }\r\n\r\n public openAssistant(): void {\r\n this.isChatOpened.next(true);\r\n this.isOpened.next(true);\r\n this.openChatDrawer$.next();\r\n\r\n this.backdropService.show();\r\n }\r\n\r\n public closeAssistant(keepDrawerOpen: boolean = false): void {\r\n this.isChatOpened.next(false);\r\n\r\n if (!keepDrawerOpen && this.selectionHistory.getCurrentSelectionIndex() === -1) {\r\n this.isOpened.next(false);\r\n this.closeAllDrawers$.next();\r\n }\r\n\r\n this.closeChatDrawer$.next();\r\n this.backdropService.hide();\r\n }\r\n\r\n public askAI(text: string): void {\r\n this.openAssistant();\r\n this.askAI$.next(text);\r\n }\r\n}\r\n","import { Directive, HostListener, inject, input } from '@angular/core';\n\nimport { Article, isNotInputEvent } from '@sinequa/atomic';\n\nimport { DrawerStackService } from '../features/drawer-stack/drawer-stack.service';\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 host: {\n '(keydown.enter)': 'onEnter($event)'\n }\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 public onEnter(e: Event): void {\n if (e && isNotInputEvent(e as KeyboardEvent)) {\n this.onClick();\n }\n }\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/user-settings.store';\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: '[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","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 { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Directive to mark a child element for special processing.\n * This can be used to apply specific styles or behaviors to child elements.\n * Specifically, it can be used to mark elements that should be treated as children in a parent component.\n * Very useful for components that need to render child templates dynamically with `@for loop`.\n *\n * Example usage:\n * ```html\n * <sponsored-links>\n * <span *childMarker>Child Element</span>\n * </sponsored-links>\n * ```\n * This will allow the parent component to recognize the `<span>` as a child element and apply any specific logic or styles defined in the parent component.\n */\n@Directive({\n selector: '[childMarker]'\n})\nexport class ChildMarkerDirective {\n public template = inject(TemplateRef<unknown>);\n}\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 const valueNormalized = value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\r\n const wordNormalized = word.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\r\n return highlightWords({ text: valueNormalized, query: wordNormalized, clipBy });\r\n }\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 { Pipe, PipeTransform } from '@angular/core';\nimport { FilterOperator, LegacyFilter } from '@sinequa/atomic';\n\n@Pipe({\n name: 'operator',\n standalone: true,\n pure: true\n})\nexport class OperatorPipe implements PipeTransform {\n transform(filter?: LegacyFilter): string {\n let op = this.transformOperator(filter?.operator);\n if (filter?.operator === 'between') {\n return `> ${filter.start} ≤ ${filter.end}`;\n }\n if (filter?.operator === 'and') {\n return filter.display ?? filter.value ?? '';\n }\n return `${op} ${filter?.value || ''}`;\n }\n\n transformOperator(operator?: FilterOperator): string {\n switch (operator) {\n case 'lt':\n return '<';\n case 'lte':\n return '≤';\n case 'eq':\n return '=';\n case 'neq':\n return '≠';\n case 'gte':\n return '≥';\n case 'gt':\n return '>';\n default:\n return '';\n }\n }\n}\n","import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform, inject } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { sysLang } from '@sinequa/atomic';\nimport { Subscription } from 'rxjs';\n\n/**\n * The `SyslangPipe` class is a custom pipe that transforms a string value using the current language.\n * This pipe is used to translate strings that are not part of the Angular i18n system.\n * This pipe exists to keep the compatibility with a legacy system that uses a custom language syntax.\n *\n * This pipe can be used in the following way:\n *\n * @example\n * <div>{{ 'Hello[fr]Bonjour' | syslang }}</div>\n * // output: `Bonjour` if your current language is 'fr'\n * // output: `Hello` if your current language is not 'fr'\n *\n * <div>{{ 'Hello[fr]Bonjour' | syslang: 'fr' }}</div>\n * // output: `Bonjour` even if your current language is not 'fr'\n */\n@Pipe({\n name: 'syslang',\n standalone: true,\n pure: false\n})\nexport class SyslangPipe implements PipeTransform, OnDestroy {\n private readonly transloco = inject(TranslocoService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n private lastValue: string | null = null;\n private currentLang: string;\n private subscription: Subscription | null = null;\n\n ngOnDestroy(): void {\n this.subscription?.unsubscribe();\n this.subscription = null;\n }\n\n constructor() {\n this.currentLang = this.transloco.getActiveLang();\n this.subscription = this.transloco.langChanges$.subscribe(locale => (this.currentLang = locale));\n }\n\n /**\n * Transforms the input value using the current language.\n * @param value The input string value to be transformed.\n * @returns The transformed string value.\n */\n transform(value?: string, lang?: string): string | null {\n const transformedValue = sysLang(value || '', lang || this.currentLang);\n\n if (transformedValue !== this.lastValue) {\n this.lastValue = transformedValue;\n this.cdr.markForCheck();\n }\n\n return this.lastValue;\n }\n}\n","import { DATE_PIPE_DEFAULT_OPTIONS, DATE_PIPE_DEFAULT_TIMEZONE, DatePipe, DatePipeConfig } from '@angular/common';\nimport { ChangeDetectorRef, Inject, inject, LOCALE_ID, OnDestroy, Optional, Pipe } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Subscription } from 'rxjs';\n\n@Pipe({\n name: 'translocoDate',\n pure: false,\n standalone: true\n})\nexport class TranslocoDateImpurePipe extends DatePipe implements OnDestroy {\n private readonly transloco = inject(TranslocoService);\n private readonly cdr = inject(ChangeDetectorRef);\n\n private lastTransformedValue: string | null = null;\n private subscription: Subscription | null = null;\n\n constructor(\n @Inject(LOCALE_ID) locale: string,\n @Inject(DATE_PIPE_DEFAULT_TIMEZONE) @Optional() defaultTimezone?: string | null,\n @Inject(DATE_PIPE_DEFAULT_OPTIONS) @Optional() defaultOptions?: DatePipeConfig | null\n ) {\n super(locale, defaultTimezone, defaultOptions);\n }\n\n ngOnDestroy(): void {\n this.subscription?.unsubscribe();\n this.subscription = null;\n }\n\n override transform(value: Date | string | number, format?: string, timezone?: string): string | null;\n override transform(value: null | undefined, format?: string, timezone?: string): null;\n override transform(value: Date | string | number | null | undefined, format?: string, timezone?: string): string | null {\n this.subscription?.unsubscribe();\n\n this.subscription = this.transloco.langChanges$.subscribe(locale => {\n const transformedValue = super.transform(value, format, timezone, locale);\n\n if (transformedValue !== this.lastTransformedValue) {\n this.lastTransformedValue = transformedValue;\n this.cdr.markForCheck();\n }\n });\n\n return this.lastTransformedValue;\n }\n}\n","import { Component, computed, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { ActivatedRoute, Router, RouterLink } from '@angular/router';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { debug } from '@sinequa/atomic';\nimport { ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, TabComponent, TabsComponent } from '@sinequa/ui';\n\nimport { OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective } from '../../directives';\nimport { DrawerStackService } from '../../features/drawer-stack/drawer-stack.service';\nimport { SyslangPipe } from '../../pipes';\nimport { QueryParamsStore } from '../../stores';\n\ntype NavbarTab = {\n display: string;\n wsQueryTab: string;\n path: string;\n icon: string;\n routerLink: string;\n queryName?: string;\n};\n\n@Component({\n selector: 'navbar-tabs',\n standalone: true,\n template: `\n <!-- do not display the tabs if there are no tabs -->\n @if (tabs().length > 0) {\n <div overflowManager class=\"relative col-span-2 col-start-2 row-start-2 flex\" (count)=\"visibleTabCount.set($event)\">\n <tabs class=\"w-full\">\n @for (tab of tabs(); track $index) {\n <tab\n class=\"w-fit\"\n value=\"{{ tab.display | syslang | transloco }}\"\n overflowItem\n [attr.aria-selected]=\"this.currentPath() === tab.path\"\n [active]=\"this.currentPath() === tab.path\"\n [routerLink]=\"[tab.routerLink]\"\n [queryParams]=\"{ n: tab.queryName, q: searchText(), t: tab.wsQueryTab, f: undefined, sort: undefined, id: undefined, page: undefined }\"\n (click)=\"changeTab(tab)\">\n @if (tab.icon) {\n <i class=\"fa-fw {{ tab.icon }} \" aria-hidden=\"true\"></i>\n }\n <span>{{ tab.display | syslang | transloco }}</span>\n </tab>\n }\n </tabs>\n\n @if (moreTabs().length > 0) {\n <Menu class=\"absolute right-0 top-1\" overflowStop>\n <button variant=\"ghost\" class=\"mb-1 truncate\" aria-label=\"more tabs\">\n <i class=\"fa-solid fa-ellipsis-vertical\"></i>\n </button>\n\n <MenuContent class=\"z-500 w-fit\" position=\"bottom-end\">\n @for (tab of moreTabs(); track $index) {\n <MenuItem>\n <a\n class=\"inline-block whitespace-nowrap first-letter:capitalize\"\n [routerLink]=\"[tab.routerLink]\"\n [queryParams]=\"{ n: tab.queryName, q: searchText(), t: tab.wsQueryTab, f: undefined, sort: undefined, id: undefined, page: undefined }\"\n [attr.aria-selected]=\"this.currentPath() === tab.path\"\n [attr.aria-label]=\"tab.display | syslang | transloco\"\n (click)=\"changeTab(tab)\">\n @if (tab.icon) {\n <i class=\"fa-fw {{ tab.icon }} \" aria-hidden=\"true\"></i>\n }\n {{ tab.display | syslang | transloco }}\n </a>\n </MenuItem>\n }\n </MenuContent>\n </Menu>\n } @else {\n <div class=\"absolute right-0\" overflowStop></div>\n }\n </div>\n }\n `,\n imports: [\n RouterLink,\n TranslocoPipe,\n SyslangPipe,\n ButtonComponent,\n MenuComponent,\n MenuItemComponent,\n MenuContentComponent,\n TabsComponent,\n TabComponent,\n OverflowManagerDirective,\n OverflowItemDirective,\n OverflowStopDirective\n ]\n})\nexport class NavbarTabsComponent {\n readonly router = inject(Router);\n readonly route = inject(ActivatedRoute);\n\n readonly drawerStack = inject(DrawerStackService);\n readonly drawerOpened = signal(false);\n readonly queryParamsStore = inject(QueryParamsStore);\n\n searchText = computed(() => {\n const state = getState(this.queryParamsStore);\n return state.text || '';\n });\n\n readonly visibleTabCount = signal<number | undefined>(undefined);\n readonly currentPath = computed(() => {\n let current = this.route.snapshot;\n while (current.firstChild) {\n current = current.firstChild;\n }\n const childPath = current.url.map(segment => segment.path).join('/');\n return childPath || 'all';\n });\n\n // create tabs from the search routes\n readonly tabs = computed(\n () =>\n this.router.config\n .find(item => item.path === 'search')\n ?.children?.filter(c => c.path !== '**')\n .map(\n child =>\n ({\n display: child.data?.['display'] || child.path,\n wsQueryTab: child.data?.['wsQueryTab'] || child.path,\n path: child.path,\n routerLink: `/search/${child.path}`,\n icon: child.data?.['icon'],\n queryName: child.data?.['queryName']\n }) as NavbarTab\n ) ?? []\n );\n readonly moreTabs = computed(() => this.tabs().slice(this.visibleTabCount()));\n\n protected changeTab(tab: NavbarTab): void {\n // we use the routerlink to navigate, so just close the drawer and remove the id parameter from the query params\n this.drawerStack.closeAll();\n }\n\n constructor() {\n this.drawerStack.isOpened.pipe(takeUntilDestroyed()).subscribe(state => this.drawerOpened.set(state));\n }\n}\n","import { Component } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\n@Component({\n selector: 'NoResult',\n standalone: true,\n imports: [TranslocoPipe],\n providers: [provideTranslocoScope('no-result')],\n template: `\n <header class=\"flex items-center gap-2 text-xl font-semibold\">\n <i class=\"fa-fw far fa-face-sad-sweat text-3xl\"></i>\n <p>{{ 'noResult.noResult' | transloco }}</p>\n </header>\n\n <p>{{ 'noResult.noResultSuggestion' | transloco }}</p>\n\n <hr />\n\n <p>{{ 'noResult.noResultAssistance' | transloco }}</p>\n `,\n host: {\n class: 'p-4 flex flex-col gap-2 bg-gray-100 rounded-md'\n }\n})\nexport class NoResultComponent {}\n","import { Component, computed, effect, inject, input, signal } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ButtonComponent } from '@sinequa/ui';\n\nimport { QueryService } from '../../services';\n\nexport type PageConfiguration = {\n page: number;\n rowCount: number;\n pageSize: number;\n};\n\n@Component({\n selector: 'pager',\n standalone: true,\n imports: [TranslocoPipe, ButtonComponent],\n template: `\n <div class=\"flex gap-2\">\n @if ((hasPages() && page() > 1) || (!hasPages() && page() > 1)) {\n <button variant=\"ghost\" [attr.title]=\"'previousPage' | transloco\" (click)=\"previousPage()\">\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"me-2 h-3.5 w-3.5 rotate-180\" aria-hidden=\"true\" fill=\"none\" viewBox=\"0 0 14 10\">\n <path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M1 5h12m0 0L9 1m4 4L9 9\" />\n </svg>\n\n {{ 'previousPage' | transloco }}\n </button>\n }\n\n @if (hasPages()) {\n <button variant=\"ghost\" [attr.title]=\"'nextPage' | transloco\" (click)=\"nextPage()\">\n {{ 'nextPage' | transloco }}\n\n <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"ms-2 h-3.5 w-3.5\" aria-hidden=\"true\" fill=\"none\" viewBox=\"0 0 14 10\">\n <path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M1 5h12m0 0L9 1m4 4L9 9\" />\n </svg>\n </button>\n }\n </div>\n `\n})\nexport class PagerComponent {\n public readonly configuration = input.required<PageConfiguration>();\n\n protected readonly page = signal(0);\n protected readonly hasPages = computed(() => {\n const { page, pageSize, rowCount } = this.configuration();\n return page * pageSize < rowCount;\n });\n\n private readonly queryService = inject(QueryService);\n\n constructor() {\n effect(() => {\n this.page.set(this.configuration().page);\n });\n }\n\n public nextPage(): void {\n this.page.set(this.page() + 1);\n this.queryService.gotoPage(this.page());\n }\n\n public previousPage(): void {\n this.page.set(this.page() - 1);\n this.queryService.gotoPage(this.page());\n }\n}\n","import { Component, computed, ElementRef, forwardRef, input, output, viewChild } from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\n\nimport { cn, SearchIconComponent, searchVariants, SearchVariants, XMarkIConComponent } from '@sinequa/ui';\nimport { KeyboardNavigatorDirective, KeyboardNavigatorOptions } from '../../directives';\n\n@Component({\n selector: 'SearchInput',\n standalone: true,\n imports: [SearchIconComponent, XMarkIConComponent, KeyboardNavigatorDirective],\n template: `\n <SearchIcon class=\"text-foreground size-4 rotate-0 transition-[rotate] duration-500 group-focus-within:rotate-90\" />\n <input\n #search\n class=\"placeholder:text-muted-foreground focus:text-foreground peer grow outline-none\"\n role=\"combobox\"\n type=\"search\"\n spellcheck=\"false\"\n autocapitalize=\"off\"\n autocomplete=\"off\"\n autocorrect=\"off\"\n aria-controls=\"{{ controls() }}\"\n [keyboardNavigator]=\"keyboardNavigatorOptions()\"\n [placeholder]=\"placeholder()\"\n [attr.aria-keyshortcuts]=\"hotkey()\"\n (onFocus)=\"onFocus.emit()\"\n (onBlur)=\"onBlur.emit()\"\n (onSelected)=\"onSelected.emit($event)\"\n (input)=\"onChange(search.value)\" />\n\n <button\n variant=\"icon\"\n class=\"text-foreground peer-not-placeholder-shown:rotate-90 peer-not-placeholder-shown:cursor-pointer peer-not-placeholder-shown:opacity-100 mr-1 rotate-0 transform opacity-0 transition-[rotate,opacity] duration-500 peer-placeholder-shown:pointer-events-none\"\n (click)=\"clearSearch($event)\">\n <XMark class=\"size-4\" />\n </button>\n\n <ng-content />\n `,\n host: {\n '[class]': \"cn(variants(), disabled() && 'pointer-events-none opacity-50')\"\n },\n styles: `\n :host {\n /* clears the 'x' from Internet Explorer */\n input[type='search']::-ms-clear,\n input[type='search']::-ms-reveal {\n appearance: none;\n width: 0;\n height: 0;\n }\n /* clears the 'x' from Chrome */\n input[type='search']::-webkit-search-decoration,\n input[type='search']::-webkit-search-cancel-button,\n input[type='search']::-webkit-search-results-button,\n input[type='search']::-webkit-search-results-decoration {\n appearance: none;\n }\n }\n `,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => SearchInputComponent),\n multi: true\n }\n ]\n})\nexport class SearchInputComponent implements ControlValueAccessor {\n cn = cn;\n searchElement = viewChild<ElementRef<HTMLInputElement>>('search');\n\n onFocus = output<void>();\n onBlur = output<void>();\n onSelected = output<HTMLElement | null>();\n\n controls = input.required<string>();\n keyboardNavigatorOptions = input<KeyboardNavigatorOptions>({\n name: 'searchInputKeyboardNavigator',\n optionSelector: '[role=\"option\"]:not([aria-disabled=\"true\"])',\n direction: 'vertical',\n selectOnFocus: false,\n resetSelectionOnBlur: false,\n onSelectionHandlers: {\n hideListbox: true,\n resetSelection: true\n }\n });\n\n placeholder = input<string>('Search...');\n disabled = input<boolean>(false);\n hotkey = input<string>('shift+/');\n\n class = input<string>();\n variant = input<SearchVariants['variant']>('default');\n\n variants = computed(() => {\n return searchVariants({ variant: this.variant(), class: this.class() });\n });\n\n clearSearch(e: Event) {\n const searchEl = this.searchElement()?.nativeElement;\n if (searchEl) {\n searchEl.value = '';\n searchEl.focus();\n }\n this.onChange('');\n }\n\n /* ControlValueAccessor */\n onChange: (value: string) => void = () => {};\n onTouched: () => void = () => {};\n\n writeValue(value: string): void {\n const searchEl = this.searchElement()?.nativeElement;\n if (searchEl) {\n searchEl.value = value;\n }\n }\n\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n}\n","import { Component, computed, inject, input, output, viewChild } from '@angular/core';\nimport { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco';\n\nimport { Placement } from '@floating-ui/dom';\nimport { CCSortingChoice, Result } from '@sinequa/atomic';\nimport { ButtonComponent, DropdownComponent, MenuComponent, MenuContentComponent, MenuItemComponent } from '@sinequa/ui';\n\nimport { AppStore } from '../../stores';\n\nexport type SortingChoice = CCSortingChoice & {\n $isDesc?: boolean;\n};\n\n@Component({\n selector: 'sort-selector, sortselector, SortSelector',\n standalone: true,\n templateUrl: './sort-selector.html',\n imports: [TranslocoPipe, ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent],\n providers: [provideTranslocoScope('sort-selector')]\n})\nexport class SortSelectorComponent {\n dropdown = viewChild(DropdownComponent);\n\n readonly result = input.required<Result>();\n readonly position = input<Placement>('bottom-start');\n readonly onSort = output<SortingChoice>();\n\n appStore = inject(AppStore);\n\n readonly queryName = computed(() => this.result()?.queryName);\n\n // fetch the sorting choices from the queries and process if choice is desc or asc\n readonly sortOptions = computed(() => {\n const query = this.appStore.getQueryByName(this.queryName());\n if (!query) return [];\n\n if (this.appStore.isTabSearch(query.name)) {\n const tabName = this.result().tab;\n if (tabName && query) {\n const tab = query.tabSearch?.tabs?.find(t => t.name === tabName);\n if (tab && tab.sortingChoices && tab.sortingChoices.length > 0) {\n return tab.sortingChoices\n .reduce((acc, sort) => {\n acc.push({ ...sort, $isDesc: sort.orderByClause.includes('desc') });\n return acc;\n }, [] as SortingChoice[])\n .filter(s => this.result().hasRelevance || !s.orderByClause.includes('globalrelevance'));\n }\n }\n }\n\n const choices = query.sortingChoices;\n // choices can be an empty string when nothing is defined in the configuration\n if (choices === undefined || (choices as unknown as string) === '') return [];\n\n return choices\n ?.reduce((acc, sort) => {\n acc.push({ ...sort, $isDesc: sort.orderByClause.includes('desc') });\n return acc;\n }, [] as SortingChoice[])\n .filter(s => this.result().hasRelevance || !s.orderByClause.includes('globalrelevance'));\n });\n\n readonly sort = computed(() => this.sortOptions()?.find(x => x.name === this.result()?.sort));\n readonly isSortingDesc = computed(() => this.sort()?.orderByClause?.includes('desc'));\n\n onSortOptionClicked(sort: SortingChoice) {\n if (sort.name !== this.sort()?.name) {\n this.dropdown()?.close();\n this.onSort.emit(sort);\n }\n }\n}\n","<menu>\n <button tabindex=\"0\" variant=\"ghost\" [attr.title]=\"'sortSelector.selectSort' | transloco\">\n <i class=\"fa-fw fa-regular fa-arrow-{{ sort()?.$isDesc ? 'down' : 'up' }}-big-small me-1\"></i>\n <span>{{ sort()?.display | transloco }}</span>\n </button>\n\n <MenuContent [position]=\"position()\" class=\"min-w-max\">\n @if (sortOptions().length > 0) {\n @for (option of sortOptions(); track $index) {\n <menuitem (click)=\"onSortOptionClicked(option)\" class=\"justify-between\">\n <span>{{ option.display | transloco }}</span>\n <i class=\"fa-fw fa-regular fa-arrow-{{ option.$isDesc ? 'down' : 'up' }}-big-small\"></i>\n </menuitem>\n }\n }\n </MenuContent>\n</menu>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { afterNextRender, Component, computed, contentChild, inject, Injector, input, runInInjectionContext, signal } from '@angular/core';\nimport { getState } from '@ngrx/signals';\n\nimport { CCApp, error, fetchSponsoredLinks, LinkResult } from '@sinequa/atomic';\n\nimport { ChildMarkerDirective } from '../../directives';\nimport { AppStore, QueryParamsStore } from '../../stores';\nimport { signIn } from '../../utils';\n\n@Component({\n selector: 'sponsored-results, SponsoredResults, sponsoredresults',\n imports: [NgTemplateOutlet],\n standalone: true,\n template: ` @if (sponsoredResults()?.length) {\n @for (link of sponsoredResults(); track $index) {\n <li role=\"listitem\" class=\"text-primary flex items-center gap-2 rounded px-3 py-2 font-bold\">\n <a href=\"{{ link.url }}\" target=\"_blank\" rel=\"noopener\" title=\"{{ link.tooltip }}\" class=\"result-link peer flex items-center gap-2 hover:underline\">\n <i class=\"fa-fw far fa-arrow-up-right-from-square\"></i>\n <span>{{ link.title }}</span>\n </a>\n @if (displayPromoted()) {\n @if (childElement()?.template) {\n <ng-container [ngTemplateOutlet]=\"childElement()?.template\" />\n } @else {\n <span class=\"promoted-badge bg-primary invisible flex items-center rounded-xl px-2 text-xs text-white peer-hover:visible\">PROMOTED</span>\n }\n }\n </li>\n }\n }`,\n host: {\n role: 'list'\n }\n})\nexport class SponsoredResultsComponent {\n /**\n * The directive used to mark the child template for the \"Promoted\" badge.\n * This allows users to customize the appearance of the badge.\n */\n childElement = contentChild(ChildMarkerDirective);\n\n injector = inject(Injector);\n appStore = inject(AppStore);\n queryParamStore = inject(QueryParamsStore);\n\n /**\n * The maximum number of sponsored results to display.\n * This is set to 3 by default, but can be overridden by the `maxSponsoredResults` query parameter.\n */\n slice = input(3);\n /**\n * Whether to display the \"Promoted\" badge next to sponsored results.\n * This is set to true by default, but can be overridden by the `displayPromoted` query parameter.\n */\n displayPromoted = input(true);\n\n sponsoredLinks = computed(() => {\n const { sponsoredLinks } = getState(this.appStore) as CCApp;\n return sponsoredLinks;\n });\n readonly sponsoredResults = signal<LinkResult[] | undefined>(undefined);\n\n constructor() {\n afterNextRender(async () => {\n if (this.sponsoredLinks()) {\n const query = this.queryParamStore.getQuery();\n try {\n const links = (await fetchSponsoredLinks(this.sponsoredLinks(), query)) || [];\n this.sponsoredResults.set(links.slice(0, this.slice()));\n } catch (err: any) {\n error('Error fetching sponsored links:', err);\n this.sponsoredResults.set([]);\n if (err.status === 401) {\n error('Unauthorized access - please check your credentials:', err?.errorMessage);\n runInInjectionContext(this.injector, () => signIn());\n } else {\n throw err;\n }\n }\n }\n });\n }\n}\n","import { Component, computed, effect, inject, input, model } from '@angular/core';\nimport { NgStyle } from '@angular/common';\n\nimport { MenuComponent, MenuContentComponent } from '@sinequa/ui';\n\nimport { Theme, THEMES } from '../../resources';\nimport { ThemeStore } from '../../stores';\n\n@Component({\n selector: 'theme-selector',\n standalone: true,\n imports: [MenuComponent, NgStyle, MenuContentComponent],\n template: `\n <Menu>\n <ng-content></ng-content>\n\n <MenuContent>\n <ul class=\"flex flex-col gap-1 divide-y p-2\">\n @for (theme of themes(); track $index) {\n <li class=\"p-2\" (click)=\"selectTheme(theme)\">\n <div class=\"flex items-baseline gap-2\">\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 </MenuContent>\n </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 });\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') 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 cursor-pointer select-none items-center gap-2\">\n @if (darkMode()) {\n <i class=\"fa-fw far fa-toggle-large-on text-primary\"></i>\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 type=\"checkbox\" class=\"hidden\" [(ngModel)]=\"darkMode\" (ngModelChange)=\"toggleDarkMode($event)\" />\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 });\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 { HttpHandlerFn, HttpInterceptorFn, HttpParams, HttpRequest } from '@angular/common/http';\nimport { addAuditAdditionalInfo, globalConfig, isJsonable } from '@sinequa/atomic';\n\n/**\n * Intercepts HTTP requests to add audit information if the request URL includes the API path.\n *\n * This interceptor checks if the request URL contains the specified API path from the global configuration.\n * If the request body is JSON serializable and not an instance of `HttpParams`, it adds additional audit information\n * to the request body using the `addAuditAdditionalInfo` function.\n *\n * @param request - The HTTP request to be intercepted.\n * @param next - The next handler in the HTTP request chain.\n * @returns The next handler in the HTTP request chain, potentially with modified request body.\n */\nexport const auditInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n if (!request.url.includes(globalConfig.apiPath!)) return next(request);\n\n if (isJsonable(request.body) && !(request.body instanceof HttpParams)) {\n // beware addAuditAdditionalInfo use a reference to the original object\n addAuditAdditionalInfo(request.body);\n }\n return next(request);\n};\n","import { HttpHandlerFn, HttpInterceptorFn, HttpRequest, HttpResponse } from '@angular/common/http';\nimport { map } from 'rxjs';\nimport { getToken, globalConfig, isAuthenticated, setToken } from '@sinequa/atomic';\n\n// TODO: Replace with your locale name\n// const LOCALE_NAME = \"fr\";\n\n/**\n * Intercepts HTTP requests to add authentication headers and handle CSRF tokens.\n *\n * This interceptor checks if the user is logged in and adds necessary headers\n * to the request, including a CSRF token. If user override is active, it sets\n * the override user and domain headers instead. It also updates the CSRF token\n * from the response headers if present.\n *\n * @param request - The outgoing HTTP request.\n * @param next - The next handler in the HTTP request pipeline.\n * @returns An observable of the HTTP event stream.\n */\nexport const authInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n const { userOverride, userOverrideActive, bearerToken } = globalConfig;\n\n // add auth header with jwt if user is logged in and request is to the api url\n const csrfToken = getToken();\n\n let headers: Record<string, string> = {\n 'Sinequa-Force-Camel-Case': 'true',\n accept: 'application/json',\n 'Sinequa-csrf-token': `${csrfToken}`\n // \"x-language\": LOCALE_NAME\n };\n\n if (bearerToken) {\n headers = { ...headers, Authorization: `Bearer ${bearerToken}` };\n }\n\n if (userOverride && userOverrideActive) {\n headers = {\n ...headers,\n 'sinequa-override-user': userOverride.username,\n 'sinequa-override-domain': userOverride.domain\n };\n }\n\n request = request.clone({\n setHeaders: headers\n });\n\n return next(request).pipe(\n map(event => {\n if (event instanceof HttpResponse) {\n const csrfToken = event.headers.get('sinequa-csrf-token');\n if (csrfToken) {\n setToken(csrfToken);\n }\n }\n return event; // Add this line to fix the return type\n })\n );\n};\n","import { HttpHandlerFn, HttpRequest } from '@angular/common/http';\n\n/**\n * Interceptor function that modifies the request body by appending a \"locale\" parameter with the value \"fr\".\n * If the request body is of type FormData, the \"locale\" parameter is appended directly.\n * If the request body is an object, a new object is created with the \"locale\" parameter added.\n *\n * @param request - The HTTP request object.\n * @param next - The HTTP handler function.\n * @returns The modified request object.\n */\nexport const bodyInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n const LOCALE_NAME = 'fr';\n\n if (request.body instanceof FormData) {\n request.body.append('ui-language', LOCALE_NAME);\n request = request.clone();\n } else {\n const body = { ...(request.body as object), 'ui-language': LOCALE_NAME };\n request = request.clone({\n body\n });\n }\n return next(request);\n};\n","import { HttpHandlerFn, HttpInterceptorFn, HttpRequest } from '@angular/common/http';\nimport { inject, Injector, runInInjectionContext } from '@angular/core';\nimport { logout } from '@sinequa/atomic';\nimport { catchError } from 'rxjs/operators';\nimport { signIn } from '../utils';\n\n/**\n * Interceptor function that handles HTTP errors by logging out the user and redirecting to the login page.\n *\n * @param request - The HTTP request object.\n * @param next - The HTTP handler function.\n * @returns The modified request object.\n */\nexport const errorInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n const injector = inject(Injector);\n\n if (request.url.includes('api/v1/audit.notify')) {\n return next(request);\n }\n\n return next(request).pipe(\n catchError(err => {\n if ([401, 403].includes(err.status)) {\n // auto logout if 401 or 403 response returned from api\n logout();\n runInInjectionContext(injector, () => signIn());\n }\n\n return Promise.reject(err);\n })\n );\n};\n","import { HttpHandlerFn, HttpInterceptorFn, HttpRequest } from '@angular/common/http';\nimport { notify } from '@sinequa/atomic';\nimport { catchError } from 'rxjs/operators';\n\n/**\n * Intercepts HTTP requests and handles errors by displaying toast notifications.\n *\n * This interceptor checks if the request URL includes 'api/v1/audit.notify'. If it does,\n * the request is passed through without any modifications. For other requests, it catches\n * errors and displays a toast notification for specific HTTP status codes (400, 403, 500, 503).\n *\n * @param request - The outgoing HTTP request.\n * @param next - The next handler in the HTTP request pipeline.\n * @returns An observable that either passes the request through or handles errors with toast notifications.\n */\nexport const toastInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n if (request.url.includes('api/v1/audit.notify')) {\n return next(request);\n }\n\n return next(request).pipe(\n catchError(err => {\n const { status, statusText, error } = err;\n if ([400, 403, 500, 503].includes(status)) {\n const { errorMessage = err.statusText, errorCodeText = `Error ${status}` } = error;\n notify.error(statusText, { description: `${errorCodeText}: ${errorMessage}`, closeButton: true, duration: 5000 });\n }\n\n return Promise.reject(err);\n })\n );\n};\n","// export * from \"./audit.interceptor\";\nexport * from './audit.interceptor';\nexport * from './auth.interceptor';\nexport * from './body.interceptor';\nexport * from './error.interceptor';\nexport * from './toast.interceptor';\n","import { Query, QueryParams } from '@sinequa/atomic';\n\nexport namespace Alert {\n export enum Frequency {\n Daily,\n Hourly,\n Immediate,\n Weekly,\n Monthly\n }\n\n export enum Days {\n None = 0x00,\n Monday = 0x01,\n Tuesday = 0x02,\n Wednesday = 0x04,\n Thursday = 0x08,\n Friday = 0x10,\n Saturday = 0x20,\n Sunday = 0x40,\n AllDays = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday,\n WeekDays = Monday | Tuesday | Wednesday | Thursday | Friday\n }\n}\n\nexport type Alert = {\n name: string;\n description?: string;\n query: Query;\n timezone: string;\n timezoneOffset?: string;\n frequency: Alert.Frequency;\n days: Alert.Days;\n interval: number; // every \"n\"...\n index: number; // day of month\n times: string; //times: number[]; // offsets from 00:00 in milliseconds\n active: boolean;\n combine: boolean;\n respectTabSelection: boolean;\n appQueryUrl?: string; // the URL reference the query of the Alert in the SBA.\n};\n\nexport type Bookmark = {\n id: string;\n queryName?: string;\n label?: string;\n source?: string;\n sourceIconClass?: string;\n author?: string;\n parentFolder?: string;\n parentFolderIconClass?: string;\n};\nexport type SearchItem = {\n url: string; // URL of the search (complete with query parameters) can be used to be shared\n path: string; // Path of the search (used by the router link)\n display: string; // Display name of the search\n label?: string; // Label of the search\n filterCount?: number; // Number of filters applied to the search\n date: string; // Date of the search\n queryParams?: QueryParams; // Query parameters of the search\n};\nexport type Basket = { name: string; description?: string; ids?: string[] };\n\nexport type UserSettingsState = {\n bookmarks: Bookmark[];\n recentSearches: SearchItem[];\n savedSearches: SearchItem[];\n baskets: Basket[];\n alerts: Alert[];\n assistants: Record<string, unknown>;\n collapseAssistant?: boolean;\n language?: string;\n};\n\nexport type SearchesConfig = {\n itemsPerPage?: number;\n showLoadMore?: boolean;\n routerLink?: string;\n};\n","import { inject } from '@angular/core';\nimport { ResolveFn } from '@angular/router';\n\nimport { AppStore } from '../stores/app.store';\n\n/**\n * Resolves the name of the default query from the application store.\n *\n * @returns The name of the default query or an empty string if not available.\n */\nexport const queryNameResolver: ResolveFn<string> = () => {\n const appStore = inject(AppStore);\n return appStore.getDefaultQuery()?.name || '';\n};\n","import { Component, input, output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ButtonComponent } from '@sinequa/ui';\n\nimport { SearchesConfig } from '../../models';\n\n@Component({\n selector: 'search-footer, searchfooter, SearchFooter',\n imports: [TranslocoPipe, RouterLink, ButtonComponent],\n template: ` <div class=\"flex flex-col px-2\">\n @if (hasMore() && config().showLoadMore) {\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"onLoadMore($event)\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n <button variant=\"link\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config().routerLink]\">{{ 'seeMore' | transloco }}</button>\n </div>`\n})\nexport class SearchFooterComponent {\n hasMore = input.required<boolean>();\n config = input.required<SearchesConfig>();\n loadMore = output();\n\n onLoadMore(event: Event): void {\n event.stopPropagation();\n this.loadMore.emit();\n }\n}\n","import { Component, inject, input } from '@angular/core';\n\nimport { HorizontalDividerComponent, PopoverContentComponent } from '@sinequa/ui';\n\n@Component({\n selector: 'search-header, searchheader, SearchHeader',\n imports: [HorizontalDividerComponent],\n template: `\n @if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ label() }}</label>\n <MenuSeparator />\n </div>\n }\n `\n})\nexport class SearchHeaderComponent {\n protected floating = inject(PopoverContentComponent, { skipSelf: true, optional: true });\n\n label = input('');\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, contentChild, inject, input, output } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\n\nimport { getRelativeDate } from '@sinequa/atomic';\nimport { cn, ListItemComponent } from '@sinequa/ui';\n\nimport { ChildMarkerDirective } from '../../directives';\nimport { SearchItem } from '../../models';\nimport { UserSettingsStore } from '../../stores';\n\n@Component({\n selector: 'search-list, searchlist, SearchList',\n imports: [TranslocoPipe, ListItemComponent, NgTemplateOutlet],\n providers: [provideTranslocoScope('searches')],\n template: `\n @for (search of paginatedSearches(); track $index) {\n <li\n role=\"listitem\"\n class=\"group h-10 *:whitespace-nowrap\"\n tabindex=\"0\"\n (click)=\"onClick(search)\"\n (keydown.enter)=\"onClick(search)\"\n [attr.aria-label]=\"search.display || search.label\">\n @if (iconTemplate()) {\n <ng-container *ngTemplateOutlet=\"iconTemplate()?.template\" />\n }\n\n <p class=\"truncate\">{{ search.display || search.label }}</p>\n\n @let filterCount = search.filterCount || 0;\n @if (filterCount > 0) {\n <p class=\"text-neutral-500\" aria-hidden=\"true\">\n <i class=\"fa-fw far fa-filter\"></i>\n\n {{ 'searches.filterCount' | transloco: { count: filterCount } }}\n </p>\n }\n\n @let date = search.date;\n @if (date) {\n <p class=\"ms-auto text-neutral-500 first-letter:capitalize\">{{ getRelativeDate(transloco.getActiveLang(), date) }}</p>\n }\n\n <button\n class=\"text-destructive invisible hover:scale-125 group-hover:visible group-hover:block\"\n [title]=\"deleteButtonTitle() | transloco\"\n [attr.aria-label]=\"deleteButtonTitle() | transloco\"\n (click)=\"onDelete($index, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"list-none py-4 text-center text-neutral-500\">\n <ng-content />\n </li>\n }\n `,\n host: {\n class: 'flex max-h-[460px] flex-col overflow-auto',\n role: 'list'\n }\n})\nexport class SearchListComponent {\n cn = cn;\n getRelativeDate = getRelativeDate;\n\n iconTemplate = contentChild(ChildMarkerDirective);\n\n paginatedSearches = input.required<SearchItem[]>();\n deleteButtonTitle = input<string>('remove');\n delete = output<number>();\n\n protected readonly router = inject(Router);\n protected readonly userSettingsStore = inject(UserSettingsStore);\n protected readonly transloco = inject(TranslocoService);\n\n public onClick(search: SearchItem): void {\n const queryParams = {\n q: search.queryParams?.text\n } as { q: string; f?: string };\n\n if (search.queryParams?.filters && search.queryParams?.filters?.length > 0) queryParams.f = JSON.stringify(search.queryParams?.filters);\n\n this.router.navigate([search.queryParams?.path], { queryParams });\n }\n\n onDelete(index: number, e: Event): void {\n e.stopPropagation();\n this.delete.emit(index);\n }\n}\n","import { Component, computed, effect, inject, InjectionToken, input, signal } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { getQueryParamsFromUrl, notify } from '@sinequa/atomic';\n\nimport { SearchesConfig, SearchItem } from '../../models';\nimport { UserSettingsStore } from '../../stores';\nimport { SearchFooterComponent } from '../searches/search-footer';\nimport { SearchHeaderComponent } from '../searches/search-header';\nimport { SearchListComponent } from '../searches/search-list';\nimport { ChildMarkerDirective } from '../../directives';\n\nexport const RECENT_SEARCHES_OPTIONS = {\n itemsPerPage: 10,\n showLoadMore: true,\n routerLink: '/recent-searches'\n};\n\nexport const RECENT_SEARCHES_CONFIG = new InjectionToken<SearchesConfig>('recent searches options', {\n factory: () => RECENT_SEARCHES_OPTIONS\n});\n\n@Component({\n selector: 'RecentSearches, recent-searches',\n standalone: true,\n providers: [provideTranslocoScope('searches')],\n imports: [TranslocoPipe, ChildMarkerDirective, SearchHeaderComponent, SearchListComponent, SearchFooterComponent],\n template: `\n <SearchHeader [label]=\"'searches.recent.label' | transloco\" />\n\n <SearchList\n [paginatedSearches]=\"paginatedRecentSearches()\"\n deleteButtonTitle=\"searches.recent.remove\"\n (delete)=\"onDelete($event)\"\n aria-label=\"recents searches\">\n <i *childMarker class=\"fa-fw far fa-clock-rotate-left\" aria-hidden=\"true\"></i>\n <!-- empty content -->\n {{ 'searches.recent.noRecentSearches' | transloco }}\n </SearchList>\n\n <SearchFooter [hasMore]=\"hasMore()\" [config]=\"config\" (loadMore)=\"loadMore()\" />\n `,\n styles: [\n `\n :host {\n ul {\n scrollbar-width: thin;\n }\n }\n `\n ]\n})\nexport class RecentSearchesComponent {\n /**\n * Represents the configuration options for recent searches.\n * This property is initialized using the `input` function with a `RecentSearchesConfig` type.\n */\n options = input<SearchesConfig>();\n\n protected config = inject(RECENT_SEARCHES_CONFIG);\n protected readonly userSettingsStore = inject(UserSettingsStore);\n\n protected readonly range = signal<number>(10);\n protected readonly recentSearches = computed<SearchItem[]>(() =>\n (this.userSettingsStore.recentSearches() || []).reduce((acc, item) => {\n const queryParams = getQueryParamsFromUrl(item.url);\n\n acc.push(\n Object.assign(item, {\n label: queryParams?.text || '',\n filterCount: queryParams?.filters?.length || 0,\n queryParams\n })\n );\n\n return acc;\n }, [] as SearchItem[])\n );\n protected readonly paginatedRecentSearches = computed<SearchItem[]>(() => this.recentSearches().slice(0, this.range()));\n protected readonly hasMore = computed<boolean>(() => this.recentSearches().length > 0 && this.range() < this.recentSearches().length);\n\n constructor() {\n effect(() => {\n if (this.options()) {\n this.config = { ...this.config, ...this.options() };\n this.range.set(this.config.itemsPerPage ?? 10);\n }\n });\n }\n\n /**\n * Deletes a recent search item at the specified index.\n * @param index - The index of the item to delete.\n * @param e - The event object.\n */\n async onDelete(index: number) {\n await this.userSettingsStore.deleteRecentSearch(index);\n notify.success('Recent search deleted');\n }\n\n loadMore() {\n this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n }\n}\n","import { Component, computed, effect, inject, InjectionToken, input, signal } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { getQueryParamsFromUrl, notify } from '@sinequa/atomic';\n\nimport { SearchesConfig, SearchItem } from '../../models';\nimport { UserSettingsStore } from '../../stores';\nimport { SearchFooterComponent } from '../searches/search-footer';\nimport { SearchHeaderComponent } from '../searches/search-header';\nimport { SearchListComponent } from '../searches/search-list';\nimport { ChildMarkerDirective } from '../../directives';\n\nexport const SAVED_SEARCHES_OPTIONS: SearchesConfig = {\n itemsPerPage: 10,\n showLoadMore: true,\n routerLink: '/saved-searches'\n};\n\nexport const SAVED_SEARCHES_CONFIG = new InjectionToken<SearchesConfig>('saved searches options', { factory: () => SAVED_SEARCHES_OPTIONS });\n\n@Component({\n selector: 'saved-searches, SavedSearches',\n standalone: true,\n imports: [TranslocoPipe, ChildMarkerDirective, SearchHeaderComponent, SearchListComponent, SearchFooterComponent],\n providers: [provideTranslocoScope('searches')],\n template: `\n <SearchHeader [label]=\"'searches.saved.label' | transloco\" />\n\n <SearchList [paginatedSearches]=\"paginatedSearches()\" deleteButtonTitle=\"searches.saved.remove\" (delete)=\"onDelete($event)\">\n <i *childMarker class=\"fa-fw fas fa-star\" aria-hidden=\"true\"></i>\n <!-- empty content -->\n {{ 'searches.saved.noSavedSearches' | transloco }}\n </SearchList>\n\n <SearchFooter [hasMore]=\"hasMore()\" [config]=\"config\" (loadMore)=\"loadMore()\" />\n `,\n styles: [\n `\n :host {\n ul {\n scrollbar-width: thin;\n }\n }\n `\n ]\n})\nexport class SavedSearchesComponent {\n options = input<SearchesConfig>();\n\n protected config = inject(SAVED_SEARCHES_CONFIG);\n protected readonly userSettingsStore = inject(UserSettingsStore);\n\n protected readonly range = signal<number>(10);\n protected readonly savedSearches = computed<SearchItem[]>(() =>\n (this.userSettingsStore.savedSearches() || []).reduce((acc, item) => {\n const queryParams = getQueryParamsFromUrl(item.url);\n\n acc.push(\n Object.assign(item, {\n label: queryParams?.text || '',\n filterCount: queryParams?.filters?.length || 0,\n queryParams\n })\n );\n\n return acc;\n }, [] as SearchItem[])\n );\n protected readonly paginatedSearches = computed<SearchItem[]>(() => this.savedSearches().slice(0, this.range()));\n protected readonly hasMore = computed<boolean>(() => this.savedSearches().length > 0 && this.range() < this.savedSearches().length);\n\n constructor() {\n effect(() => {\n if (this.options()) {\n this.config = { ...this.config, ...this.options() };\n this.range.set(this.config.itemsPerPage ?? 10);\n }\n });\n }\n\n public async onDelete(index: number) {\n await this.userSettingsStore.deleteSavedSearch(index);\n notify.success('Saved search deleted');\n }\n\n public loadMore(): void {\n this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n }\n}\n","import { Component, inject, output, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogResult,\n DialogTitleComponent,\n InputComponent\n} from '@sinequa/ui';\n\nimport { SavedSearchesService } from '../../services';\nimport { QueryParamsStore } from '../../stores';\n\n@Component({\n selector: 'saved-search-dialog, savedsearchdialog, SavedSearchDialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogContentComponent,\n DialogFooterComponent,\n InputComponent\n ],\n providers: [provideTranslocoScope('searches')],\n template: `\n <dialog #dialog>\n <DialogHeader>\n <DialogTitle>{{ 'searches.saved.save' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent class=\"flex flex-col gap-2\">\n <input\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.aria-label]=\"'searches.saved.saveName' | transloco\"\n [attr.placeholder]=\"'searches.saved.saveName' | transloco\"\n [ngModel]=\"saveName()\"\n (ngModelChange)=\"saveName.set($event)\" />\n </DialogContent>\n\n <DialogFooter class=\"flex-col\">\n <div class=\"ml-auto flex justify-end gap-2\">\n <button variant=\"outline\" (click)=\"dialog.close($event)\">\n {{ 'cancel' | transloco }}\n </button>\n <button (click)=\"confirm($event)\" [disabled]=\"!saveName()\">\n {{ 'confirm' | transloco }}\n </button>\n </div>\n </DialogFooter>\n </dialog>\n `\n})\nexport class SavedSearchDialog implements DialogInterface {\n private readonly savedSearchesService = inject(SavedSearchesService);\n protected readonly queryParamsStore = inject(QueryParamsStore);\n dialog = viewChild<DialogComponent>(DialogComponent);\n\n saveName = signal<string>('');\n readonly closed = output<DialogResult>();\n\n open(text: string): void {\n this.saveName.set(text || '');\n this.dialog()!.showModal();\n }\n\n async confirm(e: Event): Promise<void> {\n this.savedSearchesService.saveSearch(this.saveName());\n // emit close output of the component\n this.dialog()!.close(e, 'dialog-confirm');\n // emit closed event for the diaglog service\n this.closed.emit('dialog-confirm');\n }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { provideTranslocoScope, TranslocoService } from '@jsverse/transloco';\n\nimport { ActivatedRoute } from '@angular/router';\nimport { Article, notify } from '@sinequa/atomic';\nimport { UserSettingsStore } from '../../stores';\n\n@Component({\n selector: 'bookmark-button, bookmarkbutton, BookmarkButton',\n providers: [provideTranslocoScope('bookmark')],\n template: ` @if (isBookmarked()) {\n <i class=\"fa-fw fa-bookmark fa-solid\"></i>\n } @else {\n <i class=\"fa-fw fa-bookmark fa-regular\"></i>\n }`,\n host: {\n class: 'cursor-pointer',\n '[title]': 'title()',\n '(click)': 'bookmark($event)'\n }\n})\nexport class BookmarkButtonComponent {\n public readonly article = input.required<Partial<Article>>();\n\n private readonly userSettingsStore = inject(UserSettingsStore);\n private readonly route = inject(ActivatedRoute);\n private readonly transloco = inject(TranslocoService);\n\n protected isBookmarked = computed(() => {\n return this.userSettingsStore.isBookmarked(this.article());\n });\n\n protected title = computed(() => this.transloco.translate('bookmarks.bookmarkDocument'));\n\n public async bookmark(e: Event) {\n e.stopPropagation();\n const isBookmarked = await this.userSettingsStore.isBookmarked(this.article());\n\n if (isBookmarked) {\n await this.userSettingsStore.unbookmark(this.article()!.id!);\n notify.success(this.transloco.translate('bookmarks.bookmarkRemoved'), { duration: 2000 });\n } else {\n let current = this.route.snapshot;\n while (current.firstChild) {\n current = current.firstChild;\n }\n const { queryName } = current.data;\n await this.userSettingsStore.bookmark(this.article()! as Article, queryName);\n notify.success(this.transloco.translate('bookmarks.bookmarkAdded'), { duration: 2000 });\n }\n }\n}\n","import { Component, computed, DestroyRef, effect, inject, InjectionToken, input, signal } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { RouterLink } from '@angular/router';\nimport { LegacyFilter, notify, Query } from '@sinequa/atomic';\nimport { ButtonComponent, HorizontalDividerComponent, ListItemComponent, PopoverContentComponent } from '@sinequa/ui';\n\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { Bookmark } from '../../models';\nimport { QueryService } from '../../services';\nimport { AppStore, UserSettingsStore } from '../../stores';\nimport { DrawerStackService } from '../drawer-stack/drawer-stack.service';\n\nexport type BookmarksConfig = {\n itemsPerPage?: number;\n showLoadMore?: boolean;\n routerLink?: string;\n};\n\nexport const BOOKMARKS_OPTIONS: BookmarksConfig = {\n itemsPerPage: 10,\n showLoadMore: true,\n routerLink: '/bookmarks'\n};\n\nexport const BOOKMARKS_CONFIG = new InjectionToken<BookmarksConfig>('Bookmarks options', {\n factory: () => BOOKMARKS_OPTIONS\n});\n\n@Component({\n selector: 'bookmarks, Bookmarks',\n standalone: true,\n imports: [TranslocoPipe, RouterLink, ButtonComponent, HorizontalDividerComponent, ListItemComponent],\n providers: [provideTranslocoScope('bookmarks')],\n templateUrl: './bookmarks.html',\n styles: [\n `\n :host {\n ul {\n scrollbar-width: thin;\n }\n }\n `\n ]\n})\nexport class BookmarksComponent {\n floating = inject(PopoverContentComponent, { skipSelf: true, optional: true });\n\n private readonly drawerStack = inject(DrawerStackService);\n private readonly queryService = inject(QueryService);\n private readonly userSettingsStore = inject(UserSettingsStore);\n private readonly appStore = inject(AppStore);\n\n private destroyRef = inject(DestroyRef);\n\n options = input<BookmarksConfig>();\n config = inject(BOOKMARKS_CONFIG);\n\n public range = signal<number>(10);\n protected bookmarks = computed<Bookmark[]>(() => this.userSettingsStore.bookmarks());\n public paginatedBookmarks = computed<Bookmark[]>(() => this.bookmarks().slice(0, this.range()));\n public hasMore = computed<boolean>(() => this.bookmarks().length > 0 && this.range() < this.bookmarks().length);\n\n constructor() {\n effect(() => {\n if (this.options()) {\n this.config = { ...this.config, ...this.options() };\n this.range.set(this.config.itemsPerPage ?? 10);\n }\n });\n }\n\n public onClick(bookmark: Bookmark): void {\n const query: Partial<Query> = {\n name: bookmark.queryName,\n filters: {\n field: 'id',\n value: bookmark.id\n } as LegacyFilter\n };\n\n if (!bookmark.queryName) {\n this.performSecondSearch(query);\n return;\n }\n\n this.queryService\n .search(query, false)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(result => {\n if (!result.records || result.records.length === 0) {\n this.performSecondSearch(query);\n return;\n }\n\n this.drawerStack.replace(result.records[0]);\n });\n }\n\n private performSecondSearch(query: Partial<Query>): void {\n query.name = this.appStore.getDefaultQuery()?.name;\n this.queryService\n .search(query, false)\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(result => {\n if (!result.records || result.records.length === 0) {\n notify.warning('This bookmark is outdated and cannot be opened', { description: 'no record found!', duration: 2000 });\n return;\n }\n\n this.drawerStack.replace(result.records[0]);\n });\n }\n\n public onDelete(bookmark: Bookmark, e: Event) {\n e.stopPropagation();\n this.userSettingsStore.unbookmark(bookmark.id);\n notify.success('Bookmark removed', { duration: 2000 });\n }\n\n loadMore(e: Event) {\n e.stopPropagation();\n this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n }\n}\n","@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'bookmarks.label' | transloco }}</label>\n <MenuSeparator />\n </div>\n}\n\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\" role=\"list\">\n @for (bookmark of paginatedBookmarks(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(bookmark)\" (keydown.enter)=\"onClick(bookmark)\">\n <i class=\"fa-fw fas fa-bookmark shrink-0\" aria-hidden=\"true\"></i>\n\n <p class=\"line-clamp-1\">{{ bookmark.label }}</p>\n\n @if (bookmark.author) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-user\" aria-hidden=\"true\"></i>\n {{ bookmark.author }}\n </p>\n }\n @if (bookmark.parentFolder) {\n <p class=\"line-clamp-1 text-neutral-500\">\n <i class=\"fa-fw far fa-folder\" aria-hidden=\"true\"></i>\n {{ bookmark.parentFolder }}\n </p>\n }\n\n <button\n variant=\"icon\"\n title=\"{{ 'bookmarks.openBookmark' | transloco }}\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n [attr.title]=\"'bookmarks.removeBookmark' | transloco\"\n [attr.aria-label]=\"'bookmarks.removeBookmark' | transloco\"\n (click)=\"onDelete(bookmark, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"py-4 text-center text-neutral-500\">{{ 'bookmarks.noBookmarks' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">{{ 'loadMore' | transloco }}</button>\n }\n <button variant=\"link\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n","import { Component, inject, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\n\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent\n} from '@sinequa/ui';\n\nimport { Basket } from '../../../models';\nimport { UserSettingsStore } from '../../../stores';\nimport { notify } from '@sinequa/atomic';\n\n@Component({\n selector: 'delete-collection-dialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogContentComponent,\n DialogFooterComponent\n ],\n providers: [provideTranslocoScope('collections')],\n template: `\n <dialog #dialog>\n <DialogHeader>\n <DialogTitle>{{ 'collections.deleteCollection' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent>\n <p>{{ 'collections.confirmDelete' | transloco }} {{ collection()?.name }}?</p>\n </DialogContent>\n\n <DialogFooter>\n <button variant=\"outline\" (click)=\"dialog.cancel($event)\">\n {{ 'cancel' | transloco }}\n </button>\n\n <button variant=\"destructive\" (click)=\"deleteCollection($event)\">\n {{ 'delete' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class DeleteCollectionDialog implements DialogInterface {\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n private readonly userSettingsStore = inject(UserSettingsStore);\n private readonly translocoService = inject(TranslocoService);\n\n collection = signal<Basket | undefined>(undefined);\n index = signal<number | undefined>(undefined);\n\n open(collection: Basket, index: number) {\n this.collection.set(collection);\n this.index.set(index);\n this.dialog()!.showModal();\n }\n\n async deleteCollection(e: Event): Promise<void> {\n this.dialog()!.close(e);\n await this.userSettingsStore.deleteBasket(this.index()!);\n const message = this.translocoService.translate('collections.deleted');\n notify.success(message, { duration: 2000 });\n }\n}\n","import { Component, computed, effect, inject, InjectionToken, input, signal, viewChild } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { ButtonComponent, HorizontalDividerComponent, ListItemComponent, PopoverComponent } from '@sinequa/ui';\n\nimport { Basket } from '../../models';\nimport { UserSettingsStore } from '../../stores';\nimport { DrawerStackService } from '../drawer-stack/drawer-stack.service';\nimport { DeleteCollectionDialog } from './dialogs/delete.dialog';\n\nexport type CollectionsConfig = {\n itemsPerPage?: number;\n showLoadMore?: boolean;\n routerLink?: string;\n};\n\nexport const COLLECTIONS_OPTIONS: CollectionsConfig = {\n itemsPerPage: 10,\n showLoadMore: false,\n routerLink: '/collections'\n};\n\nexport const COLLECTIONS_CONFIG = new InjectionToken<CollectionsConfig>('Collections options', {\n factory: () => COLLECTIONS_OPTIONS\n});\n\n@Component({\n selector: 'app-collections',\n standalone: true,\n imports: [TranslocoPipe, RouterLink, HorizontalDividerComponent, DeleteCollectionDialog, ButtonComponent, ListItemComponent],\n templateUrl: './collections.html',\n providers: [provideTranslocoScope('collections')]\n})\nexport class CollectionsComponent {\n floating = inject(PopoverComponent, { skipSelf: true, optional: true });\n\n private readonly userSettingsStore = inject(UserSettingsStore);\n private readonly drawerStack = inject(DrawerStackService);\n private readonly router = inject(Router);\n\n options = input<CollectionsConfig>();\n config = inject(COLLECTIONS_CONFIG);\n\n public range = signal<number>(10);\n protected collections = computed<Basket[]>(() => this.userSettingsStore.baskets());\n public paginatedCollections = computed<Basket[]>(() => this.collections().slice(0, this.range()));\n public hasMore = computed<boolean>(() => this.collections().length > 0 && this.range() < this.collections().length);\n\n readonly deleteCollectionDialog = viewChild(DeleteCollectionDialog);\n\n constructor() {\n effect(() => {\n if (this.options()) {\n this.config = { ...this.config, ...this.options() };\n this.range.set(this.config.itemsPerPage ?? 10);\n }\n });\n }\n\n onClick(collection: Basket): void {\n this.drawerStack.closeAll();\n this.router.navigate(['/search'], { queryParams: { b: collection.name } });\n }\n\n public onDelete(collection: Basket, index: number, e: Event) {\n e.stopPropagation();\n this.deleteCollectionDialog()?.open(collection, index);\n }\n\n loadMore(e: Event) {\n e.stopPropagation();\n this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n }\n}\n","@if (floating) {\n <div class=\"p-2\">\n <label class=\"text-xl font-bold\">{{ 'collections.label' | transloco }}</label>\n <MenuSeparator />\n </div>\n}\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\">\n @for (collection of paginatedCollections(); track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" (click)=\"onClick(collection)\" (keydown.enter)=\"onClick(collection)\">\n <i class=\"fas fa-inbox\"></i>\n\n <p class=\"line-clamp-1\">{{ collection.name }}</p>\n\n <button\n variant=\"icon\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'collections.deleteCollection' | transloco }}\"\n [attr.aria-label]=\"'collections.deleteCollection' | transloco\"\n (click)=\"onDelete(collection, $index, $event)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n </li>\n } @empty {\n <li class=\"list-none py-4 text-center text-neutral-500\">{{ 'collections.noCollections' | transloco }}</li>\n }\n</ul>\n\n<div class=\"flex flex-col px-2\">\n @if (hasMore() && config.showLoadMore) {\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'loadMore' | transloco\" (click)=\"loadMore($event)\">{{ 'loadMore' | transloco }}</button>\n }\n <button variant=\"link\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config.routerLink]\">{{ 'seeMore' | transloco }}</button>\n</div>\n\n<delete-collection-dialog />\n","import { Component, computed, inject, output, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\nimport { firstValueFrom } from 'rxjs';\n\nimport {\n ButtonComponent,\n ChevronRightIconComponent,\n CircleCheckIconComponent,\n DialogComponent,\n DialogContentComponent,\n DialogEvent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent,\n InputComponent,\n LoadingCircleIconComponent\n} from '@sinequa/ui';\n\nimport { Alert } from '../../../models';\nimport { QueryService } from '../../../services';\nimport { QueryParamsStore, UserSettingsStore } from '../../../stores';\n\n@Component({\n selector: 'alert-dialog, alertdialog, AlertDialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogContentComponent,\n DialogFooterComponent,\n InputComponent,\n ChevronRightIconComponent,\n LoadingCircleIconComponent,\n CircleCheckIconComponent\n ],\n providers: [provideTranslocoScope('alerts')],\n template: `\n <dialog #dialog>\n <DialogHeader class=\"px-1\">\n <DialogTitle>{{ 'alerts.createAlert' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent class=\"flex flex-col gap-2 overflow-auto px-1\">\n <div class=\"mb-2\">\n <label for=\"alertName\" class=\"mb-1 block text-sm font-medium text-gray-700\">{{ 'alerts.alertName' | transloco }}</label>\n <input\n id=\"alertName\"\n name=\"alertName\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.aria-label]=\"'alerts.alertName' | transloco\"\n [attr.placeholder]=\"'alerts.placeholder' | transloco\"\n [ngModel]=\"alertName()\"\n (ngModelChange)=\"alertName.set($event)\" />\n </div>\n\n <div class=\"mb-2\">\n <label class=\"mb-1 block text-sm font-medium text-gray-700\" for=\"frequency\">{{ 'alerts.alertFrequency' | transloco }}</label>\n <div class=\"relative\">\n <select\n id=\"frequency\"\n name=\"frequency\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full appearance-none rounded-md border border-gray-200 bg-neutral-50 px-2 pr-8 hover:bg-white hover:outline focus:bg-white focus:outline\"\n id=\"alertFrequency\"\n [ngModel]=\"alertFrequency()\"\n (ngModelChange)=\"alertFrequency.set($event)\">\n @for (frequencyValue of frequencies; track $index) {\n <option [value]=\"frequencyValue\">{{ 'alerts.frequency.' + frequency[frequencyValue] | transloco }}</option>\n }\n </select>\n <ChevronRight width=\"16\" height=\"16\" class=\"pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 rotate-90 transform text-gray-400\" />\n </div>\n </div>\n\n <div class=\"mb-2\">\n <p class=\"mb-2 block text-sm font-medium text-gray-700\">{{ 'alerts.repeatOn' | transloco }}</p>\n <div class=\"weekdays-grid gap-1.5 px-2.5 py-0\">\n @for (day of weekdays; track $index) {\n <div>\n <input class=\"me-1\" type=\"checkbox\" id=\"day_{{ day.value }}\" [checked]=\"dayChecked(day.value)\" (change)=\"dayChange($event, day.value)\" />\n <label role=\"button\" for=\"day_{{ day.value }}\" class=\"form-check-label user-select-none cursor-pointer\">{{\n 'alerts.weekdays.' + day.key | transloco\n }}</label>\n </div>\n }\n </div>\n </div>\n\n <div class=\"mb-6\">\n <label class=\"mb-1 block text-sm font-medium text-gray-700\" for=\"alertTimes\">Time</label>\n <input\n type=\"time\"\n id=\"alertTimes\"\n name=\"alertTimes\"\n class=\"inline-block w-full\"\n autocomplete=\"off\"\n spellcheck=\"off\"\n [value]=\"alertTimes()\"\n [ngModel]=\"alertTimes()\"\n (ngModelChange)=\"alertTimes.set($event)\" />\n </div>\n\n <div class=\"mb-6\">\n <input class=\"me-1\" type=\"checkbox\" id=\"alertActive\" [checked]=\"alertActive()\" (change)=\"alertActive.set(!alertActive())\" />\n <label role=\"button\" for=\"alertActive\" class=\"form-check-label user-select-none cursor-pointer\">{{ 'alerts.alertActive' | transloco }}</label>\n </div>\n </DialogContent>\n\n <DialogFooter class=\"flex-col\">\n @if (alert || canUpdateQuery()) {\n <div class=\"flex w-full flex-col gap-2\">\n @if (alert) {\n <button variant=\"outline\" (click)=\"execute($event)\" [disabled]=\"!canUpdateQuery()\">\n {{ 'alerts.execute' | transloco }}\n </button>\n }\n @if (canUpdateQuery()) {\n <button [disabled]=\"updateStatus() !== 'idle'\" variant=\"outline\" (click)=\"updateQuery()\">\n @switch (updateStatus()) {\n @case ('updating') {\n <LoadingCircle class=\"size-4 animate-spin\" width=\"16\" height=\"16\" />\n {{ 'alerts.updateQuery' | transloco }}\n }\n @case ('updated') {\n <CircleCheck width=\"16\" height=\"16\" />\n {{ 'alerts.queryUpdated' | transloco }}\n }\n @default {\n {{ 'alerts.updateQuery' | transloco }}\n }\n }\n </button>\n }\n </div>\n }\n <div class=\"ml-auto flex justify-end gap-2\">\n <button variant=\"outline\" (click)=\"dialog.cancel($event)\">\n {{ 'cancel' | transloco }}\n </button>\n <button (click)=\"confirm($event)\" [disabled]=\"invalidForm()\">\n {{ 'confirm' | transloco }}\n </button>\n </div>\n </DialogFooter>\n </dialog>\n `,\n styles: `\n .weekdays-grid {\n display: grid;\n grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n }\n `\n})\nexport class AlertDialog implements DialogInterface {\n private readonly queryService = inject(QueryService);\n private readonly queryParamsStore = inject(QueryParamsStore);\n private readonly userSettingsStore = inject(UserSettingsStore);\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n frequencies = [Alert.Frequency.Daily, Alert.Frequency.Hourly, Alert.Frequency.Immediate];\n frequency = Alert.Frequency;\n weekdays = [\n { key: 'monday', value: Alert.Days.Monday },\n { key: 'tuesday', value: Alert.Days.Tuesday },\n { key: 'wednesday', value: Alert.Days.Wednesday },\n { key: 'thursday', value: Alert.Days.Thursday },\n { key: 'friday', value: Alert.Days.Friday },\n { key: 'saturday', value: Alert.Days.Saturday },\n { key: 'sunday', value: Alert.Days.Sunday }\n ];\n\n index?: number;\n alert?: Alert;\n\n alertName = signal<string>('');\n alertFrequency = signal<Alert.Frequency>(Alert.Frequency.Daily);\n alertDays = signal<Alert.Days>(Alert.Days.None);\n alertTimes = signal<string>('09:00');\n alertActive = signal<boolean>(true);\n canUpdateQuery = signal<boolean>(false);\n\n updateStatus = signal<'updating' | 'updated' | 'idle'>('idle');\n\n invalidForm = computed(() => !this.alertName() || !this.alertTimes());\n\n closed = output<DialogEvent>();\n\n open(index: number): void {\n this.showModal(index);\n }\n\n async showModal(index?: number) {\n this.index = index;\n\n if (index !== undefined) {\n this.alert = this.userSettingsStore.alerts()[index];\n if (this.alert) {\n this.alertName.set(this.alert.name);\n this.alertFrequency.set(this.alert.frequency);\n this.alertDays.set(this.alert.days);\n this.alertTimes.set(this.alert.times);\n this.alertActive.set(this.alert.active);\n\n const q = this.queryParamsStore.getQuery();\n const response = await firstValueFrom(this.queryService.search(q, false));\n this.canUpdateQuery.set(response.records?.length > 0);\n }\n } else {\n this.alertName.set('');\n this.alertFrequency.set(Alert.Frequency.Daily);\n this.alertDays.set(Alert.Days.None);\n this.alertTimes.set('09:00');\n this.alertActive.set(true);\n }\n\n this.dialog()!.open();\n }\n\n async confirm(e: Event): Promise<void> {\n if (this.alert) {\n this.update();\n } else {\n this.create();\n }\n this.dialog()!.close(e);\n }\n\n private async create(): Promise<void> {\n const alert: Alert = {\n name: this.alertName(),\n description: '',\n timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n query: this.queryParamsStore.getQuery(),\n frequency: this.alertFrequency(),\n days: this.alertDays(),\n interval: 1,\n index: 1,\n times: this.alertTimes(),\n active: this.alertActive(),\n combine: true,\n respectTabSelection: false\n };\n\n this.userSettingsStore.createAlert(alert);\n }\n\n private async update(): Promise<void> {\n this.alert!.name = this.alertName();\n this.alert!.frequency = this.alertFrequency();\n this.alert!.days = this.alertDays();\n this.alert!.times = this.alertTimes();\n this.alert!.active = this.alertActive();\n\n this.userSettingsStore.updateAlert(this.alert!, this.index!);\n }\n\n dayChecked(day: Alert.Days): boolean {\n return (this.alertDays() & day) !== 0;\n }\n\n dayChange(event: Event, day: Alert.Days) {\n const input = event.target as HTMLInputElement;\n if (input.checked) {\n this.alertDays.set(this.alertDays() | day);\n } else {\n this.alertDays.set(this.alertDays() & ~day);\n }\n }\n\n updateQuery() {\n this.updateStatus.set('updating');\n this.alert!.query = this.queryParamsStore.getQuery();\n this.userSettingsStore\n .updateAlert(this.alert!, this.index!)\n .then(() => {\n setTimeout(() => {\n this.updateStatus.set('updated');\n }, 500); // 500ms delay before setting to 'updated'\n })\n .then(() => {\n setTimeout(() => {\n this.updateStatus.set('idle');\n }, 2000);\n });\n }\n\n execute(e: Event) {\n const q = this.alert!.query;\n const filters = Array.isArray(q.filters) ? q.filters : undefined;\n this.queryParamsStore.patch({ text: q.text, tab: q.tab, basket: q.basket, sort: q.sort, filters, name: q.name });\n this.dialog()!.close(e);\n }\n}\n","import { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\nimport { Component, computed, effect, inject, signal, viewChild } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { Query } from '@sinequa/atomic';\nimport { ButtonComponent, DialogService, HorizontalDividerComponent, ListItemComponent, PopoverComponent } from '@sinequa/ui';\n\nimport { Alert } from '../../models';\nimport { UserSettingsStore } from '../../stores';\nimport { buildQuery } from '../../utils';\nimport { AlertDialog } from './dialogs/alert.dialog';\n\n@Component({\n selector: 'Alerts',\n standalone: true,\n imports: [TranslocoPipe, ButtonComponent, HorizontalDividerComponent, ListItemComponent, DragDropModule],\n templateUrl: './alerts.html',\n providers: [provideTranslocoScope('alerts')]\n})\nexport class AlertsComponent {\n floating = inject(PopoverComponent, { skipSelf: true, optional: true });\n private readonly userSettingsStore = inject(UserSettingsStore);\n modal = inject(DialogService);\n\n readonly alertFormDialog = viewChild(AlertDialog);\n\n reordering = signal<boolean>(false);\n protected alerts = computed<Alert[]>(() => this.userSettingsStore.alerts());\n\n tmpAlerts: Alert[] = [];\n query: Query;\n\n constructor() {\n this.query = buildQuery();\n\n effect(() => {\n this.tmpAlerts = this.alerts()?.map(a => Object.assign({}, a));\n });\n }\n\n onClick(index: number): void {\n this.floating?.close();\n this.modal.open(AlertDialog, index).then(v => console.log('result', v));\n }\n\n createAlert(): void {\n this.floating?.close();\n this.modal.open(AlertDialog).then(v => console.log('result', v));\n }\n\n deleteAlert(event: Event, index: number) {\n event.stopPropagation();\n this.userSettingsStore.deleteAlert(index);\n }\n\n async reorder() {\n if (this.reordering()) {\n await this.userSettingsStore.updateAlerts(this.tmpAlerts);\n this.reordering.set(false);\n } else {\n this.reordering.set(true);\n }\n }\n\n dropped(drop: CdkDragDrop<Alert[]>) {\n if (drop.currentIndex === drop.previousIndex) {\n return;\n }\n this.tmpAlerts.splice(drop.currentIndex, 0, this.tmpAlerts.splice(drop.previousIndex, 1)[0]);\n }\n}\n","<ul\n role=\"list\"\n class=\"flex min-w-80 flex-col p-2\"\n cdkDropList\n [cdkDropListData]=\"tmpAlerts\"\n [cdkDropListDisabled]=\"!reordering()\"\n (cdkDropListDropped)=\"dropped($event)\">\n @if (floating) {\n <label class=\"text-xl font-bold\">{{ 'alerts.label' | transloco }}</label>\n <MenuSeparator />\n }\n @for (alert of tmpAlerts; track $index) {\n <li role=\"listitem\" class=\"group h-10\" tabindex=\"0\" cdkDrag (click)=\"onClick($index)\" (keydown.enter)=\"onClick($index)\">\n <i class=\"fa-fw fas fa-bell shrink-0\" aria-hidden=\"true\"></i>\n <p class=\"line-clamp-1\">{{ alert.name }}</p>\n @if (!reordering()) {\n <button\n variant=\"icon\"\n class=\"text-destructive hover:text-destructive invisible ms-auto transition-transform hover:scale-125 group-hover:visible\"\n title=\"{{ 'alerts.deleteAlert' | transloco }}\"\n [attr.aria-label]=\"'alerts.deleteAlert' | transloco\"\n (click)=\"deleteAlert($event, $index)\">\n <i class=\"fa-fw fa-regular fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n } @else {\n <i class=\"fa-fw fa-regular fa-bars\"></i>\n }\n </li>\n } @empty {\n <li role=\"listitem\" class=\"py-4 text-center text-neutral-500\">{{ 'alerts.noAlerts' | transloco }}</li>\n }\n</ul>\n<div class=\"flex flex-col gap-2 p-2\">\n <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"'alerts.manageAlerts' | transloco\" [disabled]=\"!alerts().length\" (click)=\"reorder()\">\n {{ (reordering() ? 'save' : 'alerts.manageAlerts') | transloco }}\n </button>\n <button class=\"w-full\" [attr.title]=\"'alerts.createAlert' | transloco\" (click)=\"createAlert()\">{{ 'alerts.createAlert' | transloco }}</button>\n</div>\n","import { Component, inject, model, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { globalConfig, login, notify, setGlobalConfig } from '@sinequa/atomic';\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent,\n InputComponent\n} from '@sinequa/ui';\nimport { ApplicationService } from '../../services';\nimport { PrincipalStore } from '../../stores';\n\n@Component({\n selector: 'override-user-dialog',\n standalone: true,\n imports: [\n FormsModule,\n ButtonComponent,\n InputComponent,\n DialogComponent,\n DialogContentComponent,\n DialogTitleComponent,\n DialogHeaderComponent,\n DialogFooterComponent,\n TranslocoPipe\n ],\n providers: [provideTranslocoScope('dialogs')],\n template: `\n <dialog #dialog class=\"max-w-md\">\n <DialogHeader>\n <DialogTitle>{{ 'dialogs.overrideUser.title' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent class=\"flex flex-col gap-4 overflow-auto\">\n <div>\n <label for=\"username\" class=\"mb-1 block text-sm font-medium text-gray-700\">{{ 'dialogs.overrideUser.usernameToOverride' | transloco }}</label>\n <input\n id=\"username\"\n name=\"username\"\n required\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.placeholder]=\"'dialogs.overrideUser.usernamePlaceholder' | transloco\"\n [(ngModel)]=\"overrideUser().username\"\n (keydown.enter)=\"override($event)\" />\n </div>\n\n <div>\n <label for=\"domain\" class=\"mb-1 block text-sm font-medium text-gray-700\">{{ 'dialogs.overrideUser.domainToOverride' | transloco }}</label>\n <input\n id=\"domain\"\n name=\"domain\"\n required\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.placeholder]=\"'dialogs.overrideUser.domainPlaceholder' | transloco\"\n [(ngModel)]=\"overrideUser().domain\"\n (keydown.enter)=\"override($event)\" />\n </div>\n </DialogContent>\n\n <DialogFooter>\n <button variant=\"outline\" (click)=\"dialog.close($event)\">\n {{ 'cancel' | transloco }}\n </button>\n\n <button (click)=\"override($event)\" [disabled]=\"!overrideUser().username || !overrideUser().domain\">\n {{ 'dialogs.overrideUser.override' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class OverrideUserDialogComponent implements DialogInterface {\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n private readonly appService = inject(ApplicationService);\n private readonly principalStore = inject(PrincipalStore);\n\n readonly overrideUser = model<{ username: string; domain: string }>({ username: '', domain: '' });\n\n open() {\n this.dialog()!.showModal();\n }\n\n override(e: Event) {\n if (!!this.overrideUser().domain && !!this.overrideUser().username) {\n this.handleOverrideUser(this.overrideUser().username, this.overrideUser().domain);\n this.dialog()!.close(e);\n }\n }\n\n handleOverrideUser(username?: string, domain?: string) {\n const { useSSO } = globalConfig;\n\n if (username === undefined || domain === undefined) {\n setGlobalConfig({ userOverrideActive: false, userOverride: undefined });\n } else {\n setGlobalConfig({ userOverrideActive: true, userOverride: { username, domain } });\n }\n\n // Login with the new user\n if (useSSO) {\n this.appService\n .init()\n .then(() => {\n const { fullName } = getState(this.principalStore).principal;\n notify.success(`Welcome back ${fullName}!`, { duration: 2000 });\n })\n .catch(error => {\n notify.error('An error occured while overriding (SSO - intialize)', { duration: 2000 });\n setGlobalConfig({ userOverrideActive: false, userOverride: undefined });\n });\n } else {\n login()\n .then(value => {\n if (value) {\n this.appService\n .init()\n .then(() => {\n const { fullName } = getState(this.principalStore).principal;\n notify.success(`Welcome back ${fullName}!`, { duration: 2000 });\n })\n .catch(error => {\n notify.error('An error occured while overriding (initialize)', { duration: 2000 });\n setGlobalConfig({ userOverrideActive: false, userOverride: undefined });\n });\n }\n })\n .catch(error => {\n notify.error('An error occured while overriding (login)', { duration: 2000 });\n setGlobalConfig({ userOverrideActive: false, userOverride: undefined });\n });\n }\n }\n}\n","import { Component, inject, viewChild } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\n\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent\n} from '@sinequa/ui';\nimport { UserSettingsStore } from '../../stores';\nimport { notify } from '@sinequa/atomic';\n\n@Component({\n selector: 'reset-user-settings-dialog',\n standalone: true,\n imports: [ButtonComponent, DialogComponent, DialogTitleComponent, DialogContentComponent, DialogFooterComponent, DialogHeaderComponent, TranslocoPipe],\n providers: [provideTranslocoScope('dialogs')],\n template: `\n <dialog #dialog>\n <DialogHeader>\n <DialogTitle>{{ 'dialogs.resetUserSettings.title' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent>\n <p>{{ 'dialogs.resetUserSettings.message' | transloco }}</p>\n </DialogContent>\n\n <DialogFooter>\n <button variant=\"outline\" (click)=\"dialog.close($event)\">\n {{ 'cancel' | transloco }}\n </button>\n\n <button variant=\"destructive\" (click)=\"handleResetUserSettings($event)\">\n {{ 'delete' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class ResetUserSettingsDialogComponent implements DialogInterface {\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n private readonly userSettingsStore = inject(UserSettingsStore);\n private readonly translocoService = inject(TranslocoService);\n\n open() {\n this.dialog()!.showModal();\n }\n\n handleResetUserSettings(e: Event) {\n this.dialog()!.close(e);\n this.userSettingsStore.reset().then(() => {\n const message = this.translocoService.translate('dialogs.resetUserSettings.success');\n notify.success(message, { duration: 2000 });\n });\n }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { Router, RouterModule } from '@angular/router';\nimport { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco';\n\nimport { Result } from '@sinequa/atomic';\nimport { QueryParamsStore } from '../../stores';\n\n@Component({\n selector: 'app-did-you-mean',\n standalone: true,\n imports: [RouterModule, TranslocoPipe],\n templateUrl: './did-you-mean.html',\n styles: [\n `\n :host {\n display: block;\n }\n `\n ],\n providers: [provideTranslocoScope('did-you-mean')]\n})\nexport class DidYouMeanComponent {\n result = input<Result>();\n\n protected spellingCorrectionMode = computed(() => this.result()?.didYouMean?.spellingCorrectionMode);\n protected correction = computed(() => this.result()?.didYouMean?.text.corrected);\n protected original = computed(() => this.result()?.didYouMean?.text.original);\n\n readonly router = inject(Router);\n private readonly queryParamsStore = inject(QueryParamsStore);\n\n selectCorrected(): void {\n this.queryParamsStore.patch({ spellingCorrectionMode: 'dymonly', text: this.correction()! });\n this.router.navigate([], { queryParamsHandling: 'merge', queryParams: { c: 'dymonly', q: this.correction() } });\n }\n\n selectOriginal(): void {\n this.queryParamsStore.patch({ spellingCorrectionMode: 'dymonly' });\n this.router.navigate([], { queryParamsHandling: 'merge', queryParams: { c: 'dymonly', q: this.original() } });\n }\n}\n","@switch (spellingCorrectionMode()?.toLowerCase()) { @case ('dymonly') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.didYouMean' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n <span>?</span>\n</p>\n} @case ('correct') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n\n <span class=\"me-1\">. {{ 'didYouMean.searchInsteadFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n</p>\n} @case ('smart') {\n<p>\n <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n <a class=\"text-primary\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n\n <span class=\"mx-1\">and</span>\n <a class=\"text-primary font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n</p>\n} }\n","import { Component, DestroyRef, computed, effect, inject, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { ActivatedRoute, Router, RouterModule } from '@angular/router';\nimport { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco';\nimport { fromEvent } from 'rxjs';\n\nimport { Credentials, Principal, error, globalConfig, info, isAuthenticated, login, logout, notify, warn } from '@sinequa/atomic';\nimport { ButtonComponent, CardComponent, CardContentComponent, CardFooterComponent, CardHeaderComponent, InputComponent } from '@sinequa/ui';\n\nimport { ApplicationService, PrincipalService } from '../../services';\n\n/**\n * Represents the LoginComponent class, which is responsible for handling the login functionality.\n * This component is used to authenticate users and manage the user's authentication status.\n */\n@Component({\n selector: 'signIn, signin, sign-in',\n standalone: true,\n providers: [provideTranslocoScope('login')],\n imports: [\n RouterModule,\n FormsModule,\n TranslocoPipe,\n InputComponent,\n ButtonComponent,\n CardComponent,\n CardHeaderComponent,\n CardContentComponent,\n CardFooterComponent\n ],\n templateUrl: './sign-in.html',\n styles: [\n `\n :host {\n min-height: 100vh;\n display: flex;\n justify-content: center;\n align-items: center;\n padding: 2rem;\n }\n .btn-primary {\n background-color: black;\n color: white;\n }\n `\n ]\n})\nexport class SignInComponent {\n config = globalConfig;\n\n /**\n * Represents the user credentials for login.\n */\n credentials = signal<Credentials>({ username: '', password: '' });\n\n readonly authenticated = signal<boolean>(isAuthenticated());\n readonly user = signal<Principal | null>(null);\n readonly returnUrl = signal<string[] | null>(null);\n\n private readonly router = inject(Router);\n private readonly route = inject(ActivatedRoute);\n private readonly principalService = inject(PrincipalService);\n private readonly applicationService = inject(ApplicationService);\n\n /**\n * Indicates whether the login credentials are valid.\n * Returns true if both the username and password are non-empty, otherwise false.\n */\n valid = computed(() => this.credentials().username.length > 0 && this.credentials().password.length > 0);\n\n constructor(private destroyRef: DestroyRef) {\n effect(() => {\n if (this.authenticated()) {\n this.principalService\n .getPrincipal()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(principal => this.user.set(principal));\n }\n });\n\n effect(() => {\n if (this.returnUrl() !== null) {\n const [url] = this.returnUrl() || ['/'];\n this.router.navigateByUrl(url);\n }\n });\n\n fromEvent(window, 'authenticated')\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(event => {\n const response = event as CustomEvent;\n this.authenticated.set(response.detail.authenticated);\n const url = this.route.snapshot.queryParams['returnUrl'] || null;\n\n if (url !== null) {\n this.returnUrl.set([url]);\n }\n\n if (isAuthenticated()) {\n if (url !== null) {\n this.router.navigateByUrl(url);\n } else {\n this.router.navigateByUrl('/');\n }\n }\n });\n }\n\n /**\n * Updates the credentials with the provided values.\n * @param credentials - An object containing the username and password.\n */\n updateCredentials(credentials: { username?: string; password?: string }) {\n this.credentials.update(v => ({ ...v, ...credentials }));\n }\n\n async handleLogout() {\n await logout();\n this.authenticated.set(false);\n }\n\n /**\n * Handles the login process without credentials.\n * This method calls the login function asynchronously.\n */\n async handleLogin() {\n login().catch(error => {\n {\n console.warn('An error occurred while logging in', error);\n this.router.navigate(['error']);\n }\n });\n }\n\n /**\n * Handles the login process with credentials.\n * Calls the login function with the provided credentials and handles any errors that occur.\n */\n async handleLoginWithCredentials() {\n if (!this.valid()) return;\n\n try {\n const response = await login(this.credentials());\n info('SignIn Login response:', response);\n if (response) {\n const { createRoutes = false } = globalConfig;\n this.applicationService.initAndCreateRoutes(createRoutes);\n }\n } catch (error) {\n warn('An error occurred while logging in', error);\n if (typeof error === 'string') {\n notify.error('Login', { description: error });\n } else {\n const { status, errorMessage } = error as { status: number; errorMessage: string };\n notify.error('Login', { description: errorMessage });\n }\n }\n }\n\n handleBack() {\n try {\n window.history.back();\n } catch (err) {\n error('Error navigating back:', err);\n this.router.navigate(['/']);\n }\n }\n}\n","<Card>\n <CardHeader>\n <a href=\"#\" title=\"Logo\">\n <ng-content select=\"[logo]\">\n <svg\n version=\"1.1\"\n id=\"Calque_1\"\n xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\"\n x=\"0px\"\n y=\"0px\"\n viewBox=\"0 0 858 228\"\n style=\"enable-background: new 0 0 858 228\"\n xml:space=\"preserve\">\n <style type=\"text/css\">\n .st0 {\n fill: #0040bf;\n }\n .st1 {\n fill: url(#SVGID_1_);\n }\n .st2 {\n fill: url(#SVGID_00000085217246274894832600000009342302383523206054_);\n }\n </style>\n <path\n class=\"st0\"\n d=\"M44.7,168.7c-10.1-4.1-17.6-9.9-22.5-17.1c-5-7.3-7.6-15.7-8.1-25.2h25.7c0.5,10.2,4.6,17.9,12.2,23.1\n c7.6,5.2,18.4,7.8,32.4,7.8c13.5,0,23.5-2.2,30.2-6.5c6.7-4.3,10-10.4,10-18.1c0-6.5-1.7-11.4-5.2-14.6c-3.5-3.2-8.5-5.5-15.1-7\n c-6.6-1.5-14.6-2.9-24.2-4.1c-12.5-1.6-23.4-3.8-32.7-6.4C38.1,98,31,93.9,25.9,88.4c-5-5.5-7.5-13.1-7.5-22.9\n c0-9.1,2.6-16.8,7.7-23.1c5.2-6.3,12.5-11.1,22-14.5c9.5-3.3,20.7-5,33.4-5c19.3,0,34.3,3.8,45.1,11.5c10.8,7.7,16.6,18.4,17.4,32.1\n h-24.9c-0.5-9-4.2-15.6-11.1-19.9c-6.9-4.3-16.1-6.4-27.6-6.4c-11.8,0-21,2-27.4,6.1c-6.5,4.1-9.7,9.6-9.7,16.5\n c0,5.8,1.6,10.2,4.7,13.1c3.1,2.9,7.9,5.1,14.3,6.5c6.4,1.4,14.5,2.8,24.3,4c9.6,1.2,18.3,2.7,26.1,4.4c7.7,1.7,14.4,4.1,20,7.2\n c5.6,3.1,9.8,7.3,12.7,12.5c2.9,5.2,4.4,12,4.4,20.3c0,13.6-5.6,24.3-16.9,32.2c-11.3,7.9-27.7,11.8-49.3,11.8\n C67.7,174.9,54.7,172.9,44.7,168.7z\" />\n <path\n class=\"st0\"\n d=\"M346.6,168.2c-9.4-4.5-16.6-10.9-21.7-19.2c-5.1-8.3-7.6-18.1-7.6-29.4c0-11.5,2.5-21.5,7.6-29.9\n c5.1-8.4,12.3-14.8,21.5-19.4c9.2-4.6,20.1-6.8,32.6-6.8c13,0,24.2,2.4,33.3,7.1c9.2,4.8,16.1,11.6,20.7,20.6\n c4.6,9,6.5,19.8,5.7,32.4h-97.8c0.3,10.9,3.9,19.3,10.9,25.3c7,6,16.5,9,28.4,9c9.2,0,17-1.7,23.2-5c6.2-3.3,10.3-7.8,12-13.4h22.6\n c-1.1,7.1-4.3,13.2-9.7,18.5c-5.4,5.3-12.3,9.4-20.7,12.3c-8.4,2.9-17.8,4.4-28.1,4.4C367,174.9,356,172.7,346.6,168.2z M352.5,88.4\n c-6.7,5.2-10.6,12.4-11.8,21.5h74.4c-0.4-9.4-3.8-16.6-10.3-21.7c-6.5-5.1-15.1-7.6-26-7.6C367.9,80.6,359.2,83.2,352.5,88.4z\" />\n <path\n class=\"st0\"\n d=\"M546,151.9h-1c-3.4,7.1-9,12.7-16.9,16.8c-7.9,4.1-16.7,6.2-26.5,6.2c-10.7,0-20.1-2.3-28.1-6.8\n c-8-4.6-14.3-11-18.8-19.5c-4.5-8.4-6.7-18.3-6.7-29.6c0-11.4,2.2-21.3,6.7-29.6c4.5-8.3,10.8-14.7,18.9-19.2\n c8.1-4.5,17.4-6.7,28-6.7c11,0,20.3,2,27.8,6c7.5,4,12.9,9.3,16,15.8h1l0.8-20.2h22.4v141.9H546V151.9z M528.6,151.9\n c5.6-3.1,10-7.3,12.9-12.4c3-5.2,4.5-10.7,4.5-16.7v-7.9c0-6-1.5-11.4-4.5-16.4c-3-5-7.3-8.9-12.9-11.9c-5.6-3-12.5-4.5-20.5-4.5\n c-10.7,0-19.5,3.2-26.2,9.7c-6.7,6.5-10.1,15.6-10.1,27.4c0,11.6,3.3,20.7,10,27.4c6.7,6.7,15.4,10.1,26.3,10.1\n C516.1,156.6,522.9,155,528.6,151.9z\" />\n <linearGradient id=\"SVGID_1_\" gradientUnits=\"userSpaceOnUse\" x1=\"780.8157\" y1=\"119.2805\" x2=\"690.0867\" y2=\"119.2805\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n class=\"st1\"\n d=\"M803.4,65.3l-0.8,20.2h-1c-3.3-6.5-8.6-11.8-16.1-15.8c-7.5-4-16.7-6-27.7-6c-10.6,0-19.9,2.2-28,6.7\n c-8.1,4.5-14.4,10.9-18.9,19.2c-4.5,8.3-6.7,18.2-6.7,29.8c0,11.3,2.2,21.1,6.7,29.5s10.7,14.8,18.8,19.4c8,4.6,17.4,6.8,28.1,6.8\n c9.9,0,18.8-2.1,26.6-6.2c7.8-4.1,14.4-12.2,17.8-19.3h23.6V65.3H803.4z M802.2,122.7c0,6-1.5,11.6-4.5,16.7\n c-3,5.2-7.3,9.3-12.9,12.4c-5.6,3.1-12.5,4.7-20.5,4.7c-10.9,0-19.6-3.3-26.3-10c-6.7-6.7-10-15.8-10-27.3c0-12,3.4-21.2,10.1-27.6\n c6.7-6.5,15.5-9.7,26.2-9.7c8,0,14.8,1.5,20.5,4.5c5.6,3,10,7,12.9,11.9c3,5,4.5,10.4,4.5,16.2V122.7z\" />\n <linearGradient\n id=\"SVGID_00000152963432808947599350000011020247854886079881_\"\n gradientUnits=\"userSpaceOnUse\"\n x1=\"780.8157\"\n y1=\"161.271\"\n x2=\"690.0867\"\n y2=\"161.271\">\n <stop offset=\"0\" style=\"stop-color: #ff854a\" />\n <stop offset=\"0.8407\" style=\"stop-color: #0040bf\" />\n </linearGradient>\n <path\n style=\"fill: url(#SVGID_00000152963432808947599350000011020247854886079881_)\"\n d=\"M843.9,161.3c0,6.5-5.3,11.8-11.8,11.8l0,0\n c-6.5,0-11.8-5.3-11.8-11.8v0c0-6.5,5.3-11.8,11.8-11.8l0,0C838.6,149.4,843.9,154.7,843.9,161.3\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n <g>\n <polygon class=\"st0\" points=\"159.2,149.4 159.2,173.1 182.8,173.1 182.8,149.4 182.8,65.3 159.2,65.3 \t\" />\n <rect x=\"159.2\" y=\"25.3\" class=\"st0\" width=\"23.6\" height=\"23.6\" />\n </g>\n <path\n class=\"st0\"\n d=\"M302.7,84.2c-4-7.3-9.5-12.6-16.5-15.8c-7-3.2-15.1-4.8-24.4-4.8c-9.2,0-17.8,2.1-25.8,6.2\n c-7.9,4.1-13.9,10-17.8,17.6h-1.4l-0.6-22.2h-23v107.8h23.6v-53.4c0-7.5,1.6-14,4.7-19.7c3.1-5.6,7.5-10.1,13.1-13.2\n c5.6-3.2,12.2-4.8,19.7-4.8c10.6,0,18.4,3,23.3,8.9c5,5.9,7.4,15,7.4,27.2v55h23.6V114C308.7,101.5,306.7,91.6,302.7,84.2z\" />\n <path\n class=\"st0\"\n d=\"M671.7,65.3v53.4c0,7.5-1.6,14.1-4.7,19.8c-3.1,5.7-7.5,10.2-13.1,13.4c-5.6,3.2-12.2,4.8-19.7,4.8\n c-10.7,0-18.6-3-23.5-9.1c-5-6-7.4-15-7.4-27V65.3h-23.4v59.5c0,12.2,2,22,5.9,29.4c3.9,7.3,9.4,12.6,16.5,15.9\n c7.1,3.3,15.2,4.9,24.5,4.9c9.6,0,18.4-2.1,26.2-6.3c7.6-4.1,15-11.3,18.9-18.6v23.1h23.4v-23.6v-5.2v-79H671.7z\" />\n </svg>\n </ng-content>\n </a>\n @if (authenticated()) {\n <h3 class=\"whitespace-nowrap text-2xl font-semibold tracking-tight\">{{ 'login.welcomeBack' | transloco : { name: user()?.fullName ?? '' } }}</h3>\n <p class=\"text-muted-foreground text-sm\">{{ 'login.youAreLoggedIn' | transloco }}</p>\n }\n </CardHeader>\n\n @if (!authenticated()) {\n <CardContent>\n <div class=\"grid gap-4\">\n @if (!config.autoOAuthProvider && !config.autoSAMLProvider) {\n <div class=\"grid gap-2\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"username\"\n >{{ 'login.username' | transloco }}</label\n >\n\n <input\n type=\"text\"\n id=\"username\"\n required\n [ngModel]=\"credentials().username\"\n (ngModelChange)=\"updateCredentials({ username: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <div class=\"grid gap-2\">\n <div class=\"flex items-center\">\n <label class=\"text-sm font-medium leading-none peer-disabled:cursor-not-allowed peer-disabled:opacity-70\" for=\"password\"\n >{{ 'login.password' | transloco }}</label\n >\n </div>\n <input\n type=\"password\"\n id=\"password\"\n required\n [ngModel]=\"credentials().password\"\n (ngModelChange)=\"updateCredentials({ password: $event })\"\n (keydown.enter)=\"handleLoginWithCredentials()\" />\n </div>\n <button [disabled]=\"!valid()\" (click)=\"handleLoginWithCredentials()\">{{ 'login.connect' | transloco }}</button>\n } @else {\n <button (click)=\"handleLogin()\">{{ 'login.SignInWith' | transloco: { provider: config.autoOAuthProvider ? 'OAuth' : 'SAML' } }}</button>\n }\n </div>\n </CardContent>\n } @else {\n <CardFooter class=\"justify-between gap-2\">\n <button class=\"w-full\" (click)=\"handleLogout()\" type=\"submit\">{{ 'login.disconnect' | transloco }}</button>\n <button class=\"w-full\" variant=\"ghost\" (click)=\"handleBack()\">{{ 'login.back' | transloco }}</button>\n </CardFooter>\n }\n</Card>\n","import { inject, Injectable, signal } from '@angular/core';\n\nimport { CCWebService, fetchLabels, labels, Query } from '@sinequa/atomic';\nimport { from, map, Observable, of, switchMap } from 'rxjs';\nimport { AppStore } from '../../stores/app.store';\n\ntype LabelsWebService = CCWebService &\n 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.error('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()).pipe(\n map((canHandle: boolean) => {\n if (!canHandle) return undefined;\n\n const {\n allowPublicLabelsCreation,\n allowPublicLabelsModification,\n privateLabelsField,\n publicLabelsField,\n defaultPublicLabels,\n labelsAutoSuggestMaxCount,\n labelsAutoSuggestWildcard\n } = 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()).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()).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()).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()).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()).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()).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 { NgStyle } from '@angular/common';\nimport { afterEveryRender, Component, computed, effect, ElementRef, input, model, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { Article as A, fetchLabels, guid, labels } from '@sinequa/atomic';\nimport { BadgeComponent, InputComponent, ListItemComponent } from '@sinequa/ui';\n\nimport { debouncedSignal } from '../../utils';\n\nconst DEBOUNCE_DELAY = 300;\ntype Article = A & {\n [key: string]: any;\n};\n\n@Component({\n selector: 'multiselect-labels, multiselectlabels, MultiSelectLabels',\n standalone: true,\n imports: [FormsModule, NgStyle, TranslocoPipe, InputComponent, BadgeComponent, ListItemComponent],\n template: `\n <div class=\"anchor\" [ngStyle]=\"{ 'anchor-name': anchor() }\">\n <label [htmlFor]=\"id()\" class=\"font-semibold\">{{ (isPublic() ? 'labels.publicLabels' : 'labels.privateLabels') | transloco }}</label>\n <input\n [id]=\"id()\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.aria-label]=\"'labels.startTyping' | transloco\"\n [attr.placeholder]=\"'labels.startTyping' | transloco\"\n [(ngModel)]=\"labelInput\"\n (keyup)=\"onKeyDown($event)\"\n (click)=\"onInputClick()\" />\n\n <ul\n popover\n class=\"popover mt-2 max-h-40 overflow-auto rounded-md border border-gray-300 bg-white p-1 shadow\"\n aria-labelledby=\"dropdownDefaultButton\"\n role=\"listbox\"\n #LabelsPopover>\n @for (label of suggestedLabels(); track $index) {\n <li role=\"option\" tabindex=\"0\" aria-keyshortcuts=\"enter\" [attr.aria-label]=\"label\" (keypress.enter)=\"itemClicked(label)\" (click)=\"itemClicked(label)\">\n <span>{{ label }}</span>\n </li>\n }\n </ul>\n </div>\n <div class=\"my-2 flex flex-wrap gap-1\">\n @for (label of labels(); track $index) {\n <Badge>\n {{ label }}\n @if (allowModification()) {\n <i class=\"fa-fw far fa-circle-xmark ms-1 cursor-pointer\" (click)=\"removeLabel(label, isPublic())\"></i>\n }\n </Badge>\n }\n </div>\n `,\n styles: `\n .anchor {\n &:has(.popover:popover-open) {\n z-index: var(--z-menu, 1000);\n border-radius: var(--radius) var(--radius) 0 0;\n }\n\n .popover::backdrop {\n background-color: transparent;\n backdrop-filter: none;\n }\n }\n\n .popover {\n /* Select Firefox */\n @supports (-moz-appearance: none) {\n margin: calc(33.3333333333vh + 30px) 25vw;\n width: 50vw;\n }\n\n /* Select Safari */\n @supports (background: -webkit-named-image(i)) {\n margin: calc(33.3333333333vh + 30px) 25vw;\n width: 50vw;\n }\n\n width: anchor-size(width);\n top: anchor(bottom);\n left: anchor(left);\n }\n `\n})\nexport class MultiSelectLabelsComponent {\n article = model<Article>();\n isPublic = input(false);\n allowModification = input(false);\n labelsField = input<string | undefined>();\n\n protected anchor = signal<string>(`--${guid()}`);\n protected suggestedLabels = signal<string[]>([]);\n\n protected labelInput = model<string>('');\n protected debouncedLabelInput = debouncedSignal(this.labelInput, DEBOUNCE_DELAY);\n\n protected popover = viewChild<ElementRef>('LabelsPopover');\n protected popoverElement = computed(() => this.popover()?.nativeElement);\n\n protected labels = signal<string[]>([]);\n\n protected id = signal(`labels-form-${guid()}`);\n\n constructor() {\n afterEveryRender(() => {\n this.popoverElement().style.positionAnchor = this.anchor();\n });\n\n effect(() => {\n if (!this.article()) return;\n if (!this.labelsField()) return;\n this.labels.set(this.article()![this.labelsField()!] || []);\n });\n\n effect(() => {\n this.fetchLabels(this.debouncedLabelInput(), this.isPublic());\n });\n }\n\n itemClicked(label: string) {\n this.addLabel(label, this.isPublic());\n }\n\n onInputClick() {\n if (this.suggestedLabels().length === 0) return;\n this.popoverElement().showPopover();\n }\n\n onKeyDown(event: KeyboardEvent) {\n event.stopImmediatePropagation();\n\n if (this.labelInput().length === 0) return;\n\n if (event.key === 'Enter') {\n this.addLabel(this.labelInput(), this.isPublic());\n this.labelInput.set('');\n }\n }\n\n async fetchLabels(text: string, isPublic: boolean) {\n const labels = await fetchLabels(text, isPublic);\n const unappliedLabels = labels.filter(label => !this.labels().some(l => l === label));\n this.suggestedLabels.set(unappliedLabels);\n unappliedLabels.length ? this.popoverElement().showPopover() : this.popoverElement().hidePopover();\n }\n\n /**\n * Adds a new label to the current list of labels and updates the associated article.\n *\n * This method performs the following steps:\n * 1. Updates the local labels state by appending the new label.\n * 2. Persists the new label to the backend, associating it with the current article.\n * 3. Refreshes the article's label data.\n * 4. Clears the label input field and resets the suggested labels.\n *\n * @param label - The label to be added.\n * @param isPublic - A boolean indicating whether the label is public or private.\n * @returns A promise that resolves once the label has been added and the article updated.\n */\n async addLabel(label: string, isPublic: boolean) {\n const currentLabels = this.labels();\n this.labels.set([...currentLabels, label]);\n\n await labels.add([label], [this.article()!.id], isPublic);\n this.updateArticleWithLabels();\n\n this.labelInput.set('');\n this.suggestedLabels.set([]);\n }\n\n /**\n * Removes a label from the current list of labels and updates the associated article.\n *\n * @param label - The label to be removed.\n * @param isPublic - A boolean indicating whether the label is public.\n * @returns A promise that resolves once the label is removed and the article is updated.\n */\n async removeLabel(label: string, isPublic: boolean) {\n this.labels.set(this.labels().filter(l => l !== label));\n await labels.remove([label], [this.article()!.id], isPublic);\n this.updateArticleWithLabels();\n }\n\n /**\n * Updates the article object by assigning the current labels to the specified labels field.\n *\n * This method retrieves the article object and the labels field dynamically,\n * then assigns the current labels to the corresponding field in the article.\n *\n * @remarks\n * Ensure that `this.article`, `this.labelsField`, and `this.labels` return valid values\n * before invoking this method to avoid runtime errors.\n *\n * @throws {TypeError} If `this.article` or `this.labelsField` returns `undefined`.\n */\n updateArticleWithLabels() {\n this.article()![this.labelsField()!] = this.labels();\n }\n}\n","import { Component, DestroyRef, inject, model, output, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { Article } from '@sinequa/atomic';\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogEvent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogInterface,\n DialogTitleComponent\n} from '@sinequa/ui';\n\nimport { LabelsConfig, LabelService } from '../label.service';\nimport { MultiSelectLabelsComponent } from '../multiselect-labels';\n\n@Component({\n selector: 'labels-edit-dialog, labelseditdialog, LabelsEditDialog',\n standalone: true,\n imports: [\n FormsModule,\n TranslocoPipe,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogFooterComponent,\n DialogTitleComponent,\n DialogContentComponent,\n MultiSelectLabelsComponent\n ],\n providers: [provideTranslocoScope('labels')],\n template: `\n <dialog #dialog (closed)=\"close($event)\">\n <DialogHeader>\n <DialogTitle>{{ 'labels.title' | transloco }}</DialogTitle>\n <p class=\"text-muted-foreground\">\n <i class=\"fa-fw fas fa-circle-info\"></i><span class=\"ps-1\">{{ 'labels.info' | transloco }}</span>\n </p>\n </DialogHeader>\n\n <DialogContent>\n @if (!!labelsConfig()?.publicLabelsField && labelsConfig()!.allowPublicLabelsCreation) {\n <multiselect-labels\n [(article)]=\"article\"\n [labelsField]=\"labelsConfig()?.publicLabelsField\"\n [allowModification]=\"labelsConfig()?.allowPublicLabelsModification || false\"\n [isPublic]=\"true\" />\n }\n @if (!!labelsConfig()?.privateLabelsField) {\n <multiselect-labels [(article)]=\"article\" [labelsField]=\"labelsConfig()?.privateLabelsField\" [allowModification]=\"true\" [isPublic]=\"false\" />\n }\n </DialogContent>\n\n <DialogFooter>\n <button (click)=\"dialog.close($event)\">\n {{ 'labels.close' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class LabelsEditDialog implements DialogInterface {\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n labelService = inject(LabelService);\n\n closed = output<{ type: DialogEvent; article: Article }>();\n\n public readonly article = model<Article>({} as Article);\n public readonly labelsConfig = signal<LabelsConfig | undefined>(undefined);\n\n constructor(private destroyRef: DestroyRef) {\n this.labelService\n .getLabelsConfig()\n .pipe(takeUntilDestroyed(this.destroyRef))\n .subscribe(config => this.labelsConfig.set(config));\n }\n\n open(article: Article): void {\n this.article.set(article);\n this.dialog()!.showModal();\n }\n\n close(event: DialogEvent): void {\n this.closed.emit({ type: event, article: this.article() });\n }\n}\n","import { Component, inject, model, signal, viewChild } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { CCApp, notify } from '@sinequa/atomic';\n\nimport {\n ButtonComponent,\n DialogComponent,\n DialogContentComponent,\n DialogFooterComponent,\n DialogHeaderComponent,\n DialogTitleComponent,\n DialogInterface\n} from '@sinequa/ui';\nimport { AuditService } from '../../../services';\nimport { AppStore } from '../../../stores';\n\nexport const AuditFeedbackType = 'UserFeedback_UserFeedback';\n\n@Component({\n selector: 'feedback-dialog, feedbackdialog, FeedbackDialog',\n standalone: true,\n imports: [\n TranslocoPipe,\n FormsModule,\n ButtonComponent,\n DialogComponent,\n DialogHeaderComponent,\n DialogFooterComponent,\n DialogTitleComponent,\n DialogContentComponent\n ],\n providers: [provideTranslocoScope('feedback')],\n template: `\n <dialog #dialog>\n <DialogHeader>\n <DialogTitle>{{ 'feedback.dialogTitle' | transloco }}</DialogTitle>\n </DialogHeader>\n\n <DialogContent>\n @if (type()) {\n <p>{{ 'feedback.' + type() + '.description' | transloco }}</p>\n <textarea\n class=\"hover:outline-primary focus:outline-primary mt-2 w-full rounded-md border bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [(ngModel)]=\"comment\"></textarea>\n }\n </DialogContent>\n\n <DialogFooter>\n <button variant=\"outline\" (click)=\"dialog.close($event)\">\n {{ 'cancel' | transloco }}\n </button>\n <button [disabled]=\"!comment()\" (click)=\"submit($event)\">\n {{ 'confirm' | transloco }}\n </button>\n </DialogFooter>\n </dialog>\n `\n})\nexport class FeedbackDialogComponent implements DialogInterface {\n readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n readonly auditService = inject(AuditService);\n readonly appStore = inject(AppStore);\n private readonly transloco = inject(TranslocoService);\n\n comment = model<string>('');\n type = signal<string | undefined>(undefined);\n\n open(type: string) {\n this.type.set(type);\n this.dialog()!.showModal();\n }\n\n submit(e: Event): void {\n const { name } = getState(this.appStore) as CCApp;\n\n this.auditService.notify({\n type: AuditFeedbackType,\n detail: {\n app: name,\n message: this.type(),\n detail: this.comment()\n }\n });\n\n this.comment.set('');\n this.dialog()!.close(e);\n notify.success(this.transloco.translate('feedback.feedbackSuccess'), { duration: 2000 });\n }\n}\n","import { Component, inject, input, output, signal, viewChild } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { notify, Result } from '@sinequa/atomic';\n\nimport { ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent } from '@sinequa/ui';\n\nimport { AuditService } from '../../services';\nimport { QueryParamsStore } from '../../stores';\nimport { FeedbackDialogComponent } from './dialogs/feedback.dialog';\n\ninterface FeedbackMenu {\n type: string;\n icon: string;\n}\n\n@Component({\n selector: 'feedback, Feedback',\n standalone: true,\n imports: [ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, TranslocoPipe, FeedbackDialogComponent],\n providers: [provideTranslocoScope('feedback')],\n templateUrl: './feedback.html'\n})\nexport class SearchFeedbackComponent {\n onClose = output<void>();\n\n readonly feedbackDialog = viewChild(FeedbackDialogComponent);\n\n pages = input.required<any>();\n\n readonly auditService = inject(AuditService);\n protected readonly queryParamsStore = inject(QueryParamsStore);\n private readonly transloco = inject(TranslocoService);\n\n liked = signal<boolean>(false);\n disliked = signal<boolean>(false);\n\n menus: FeedbackMenu[] = [\n { type: 'content', icon: 'far fa-file-alt' },\n { type: 'ui', icon: 'fas fa-desktop' },\n { type: 'lang', icon: 'far fa-comments' },\n { type: 'other', icon: 'far fa-lightbulb' }\n ];\n\n close(event: Event): void {\n event.stopPropagation();\n this.onClose.emit();\n }\n\n like(): void {\n if (this.liked()) return;\n\n const state = getState(this.queryParamsStore);\n const articles: string[] = [];\n if (this.pages() && this.pages().length) {\n this.pages().forEach((page: Result) => {\n articles.push(...page.records.map(r => r.id));\n });\n }\n const detail = { query: state, records: articles };\n this.auditService.notify({\n type: 'Search_Like',\n detail\n });\n this.liked.set(true);\n notify.success(this.transloco.translate('feedback.feedbackSuccess'), { duration: 2000 });\n }\n\n dislike(): void {\n if (this.disliked()) return;\n\n const state = getState(this.queryParamsStore);\n const articles: string[] = [];\n if (this.pages() && this.pages().length) {\n this.pages().forEach((page: Result) => {\n articles.push(...page.records.map(r => r.id));\n });\n }\n const detail = { query: state, records: articles };\n this.auditService.notify({\n type: 'Search_Disike',\n detail\n });\n this.disliked.set(true);\n notify.success(this.transloco.translate('feedback.feedbackSuccess'), { duration: 2000 });\n }\n\n openFeedbackDialog(type: string): void {\n this.feedbackDialog()?.open(type);\n }\n}\n","<menu>\n <button class=\"border border-gray-200 p-5\" variant=\"ghost\" title=\"{{'feedback.button' | transloco }}\">\n <i class=\"fa-fw far fa-commenting\" aria-hidden=\"true\"></i>\n {{ 'feedback.label' | transloco }}\n <i class=\"fa-fw fas fa-xmark ms-2\" (click)=\"close($event);\" aria-hidden=\"true\"></i>\n </button>\n\n <MenuContent>\n @if (!disliked()) {\n <menuitem (click)=\"like()\" [attr.aria-label]=\"'feedback.like' | transloco\">\n @if (liked()) {\n <i class=\"fa-fw fas fa-thumbs-up\"></i> {{ 'feedback.liked' | transloco }} } @else { <i class=\"fa-fw far fa-thumbs-up\"></i> {{ 'feedback.like' | transloco\n }} }\n </menuitem>\n } @if (!liked()) {\n <menuitem (click)=\"dislike()\" [attr.aria-label]=\"'feedback.dislike' | transloco\">\n @if (disliked()) {\n <i class=\"fa-fw fas fa-thumbs-down\"></i> {{ 'feedback.disliked' | transloco }} } @else { <i class=\"fa-fw far fa-thumbs-down\"></i> {{ 'feedback.dislike' |\n transloco }} }\n </menuitem>\n } @for (menu of menus; track $index) {\n <menuitem (click)=\"openFeedbackDialog(menu.type)\" [attr.aria-label]=\"'feedback.' + menu.type + '.title' | transloco\">\n <i class=\"fa-fw {{menu.icon}}\"></i> {{ 'feedback.' + menu.type + '.title' | transloco }}\n </menuitem>\n }\n </MenuContent>\n</menu>\n\n<feedback-dialog />\n","import { Component, computed, EventEmitter, HostBinding, inject, input, Output } from '@angular/core';\n\nimport { ChevronRightIconComponent, cn, ListItemComponent } from '@sinequa/ui';\n\nimport { AggregationComponent } from './aggregation.component';\nimport { HighlightWordPipe, SyslangPipe } from '../../../pipes';\nimport { AggregationListItem } from '../../../models';\n\n@Component({\n selector: 'aggregation-item, AggregationItem, aggregationitem',\n standalone: true,\n imports: [HighlightWordPipe, ListItemComponent, SyslangPipe, ChevronRightIconComponent],\n templateUrl: './aggregation-item.component.html',\n styles: `\n :host {\n display: block;\n user-select: none;\n }\n :host a {\n padding-left: calc((var(--agg-tree-indent, 0.5rem) * var(--level)));\n }\n a {\n line-height: var(--agg-item-height, inherit);\n }\n `\n})\nexport class AggregationItemComponent {\n cn = cn;\n @HostBinding('attr.disabled') get disabled() {\n return this.node().count === 0 ? 'disabled' : null;\n }\n\n @Output() onSelect = new EventEmitter<AggregationListItem>();\n @Output() onOpen = new EventEmitter<AggregationListItem>();\n\n node = input.required<AggregationListItem>();\n\n searchText = inject(AggregationComponent).searchText;\n\n name = computed(() => {\n const value = this.node().display || this.node().value;\n return typeof value === 'string' ? value : `${value}`;\n });\n\n level = computed(() => {\n const level = (this.node().$level ?? 0) - 1 + (!this.node().hasChildren ? 1 : 0);\n if (this.node().hasChildren === false) {\n return level + 1;\n }\n return level;\n });\n\n select(e: Event, item: AggregationListItem) {\n e.stopImmediatePropagation();\n item.$selected = !item.$selected;\n\n this.onSelect.emit(item);\n }\n\n open(e: Event, node: AggregationListItem) {\n // fetch aggregation items\n e.preventDefault();\n e.stopImmediatePropagation();\n\n if (node.items && node.$opened === true) {\n node.$opened = false;\n return;\n }\n if (node.items && !node.$opened) {\n node.$opened = true;\n return;\n }\n\n this.onOpen.emit(node);\n }\n}\n","<a\n role=\"listitem\"\n [attr.aria-selected]=\"node().$selected\"\n [attr.aria-label]=\"name() | syslang\"\n [style.--level]=\"level()\"\n [class]=\"\n cn(\n 'flex grow items-center gap-2 p-1 leading-7',\n node().count === 0 && 'disabled pointer-events-none text-neutral-300',\n node().$selected && 'bg-primary-100 text-primary'\n )\n \"\n (click)=\"select($event, node())\">\n <!-- chrevron is visible only if the node has children -->\n <button (click)=\"open($event, node())\" class=\"transition-transform ease-in hover:scale-125\" aria-label=\"Open\">\n <ChevronRight [class]=\"cn('size-4 translate-x-1', node().$opened && 'rotate-90', !node().hasChildren && 'hidden')\" width=\"16\" height=\"16\" />\n </button>\n\n <input\n type=\"checkbox\"\n role=\"checkbox\"\n value=\"{{ node().value }}\"\n [attr.disabled]=\"node().count === 0 ? true : null\"\n [attr.aria-disabled]=\"node().count === 0\"\n (keydown.enter)=\"select($event, node())\"\n [checked]=\"node().$selected\" />\n\n @if (node().icon) {\n <i class=\"fa-fw {{ node().icon }} self-center justify-self-center\" aria-hidden=\"true\"></i>\n }\n <p class=\"line-clamp-1 text-ellipsis break-all\" [title]=\"name() | syslang\">\n @for (chunk of (name() | syslang) ?? '' | highlightWord: searchText() : 10; track $index) {\n <span [class]=\"{ 'font-bold': chunk.match }\" aria-hidden=\"true\">{{ chunk.text }}</span>\n }\n </p>\n</a>\n\n@if (node().hasChildren && node().$opened) {\n @for (item of node().items; track $index) {\n <AggregationItem [node]=\"item\" (onOpen)=\"onOpen.emit($event)\" (onSelect)=\"onSelect.emit($event)\" />\n }\n}\n","import { Component, computed, effect, ElementRef, inject, input, model, output, signal } from '@angular/core';\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\nimport { firstValueFrom } from 'rxjs';\n\nimport {\n Aggregation,\n fetchSuggestField,\n LegacyFilter,\n Query,\n Suggestion,\n suggestionsToTreeAggregationNodes,\n TreeAggregation,\n TreeAggregationNode\n} from '@sinequa/atomic';\nimport { BadgeComponent, ButtonComponent, InputComponent } from '@sinequa/ui';\n\nimport { AggregationListItem } from '../../../models';\nimport { SyslangPipe } from '../../../pipes';\nimport { AggregationsService } from '../../../services';\nimport { AggregationsStore, QueryParamsStore } from '../../../stores';\nimport { buildQuery, debouncedSignal } from '../../../utils';\nimport { AggregationItemComponent } from './aggregation-item.component';\n\nexport type AggregationTitle = {\n label: string;\n icon?: string;\n};\n\n@Component({\n selector: 'Aggregation, aggregation',\n imports: [FormsModule, ReactiveFormsModule, ButtonComponent, InputComponent, AggregationItemComponent, SyslangPipe, TranslocoPipe, BadgeComponent],\n standalone: true,\n templateUrl: './aggregation.component.html',\n styles: [\n `\n :host {\n display: block;\n }\n\n fieldset {\n height: 100%;\n max-height: inherit;\n scrollbar-width: thin;\n }\n\n ul[role='list'] {\n scrollbar-width: inherit;\n max-height: calc(100vh - var(--header-height, 0px) - var(--agg-header-height, 0px));\n }\n\n AggregationItem:has(+ AggregationItem) {\n margin-bottom: var(--agg-item-gap, inherit);\n }\n `\n ],\n host: {\n class: 'd-flex flex-column h-100',\n '[style.--header-height]': '`${this.computeHeight()}rem`'\n }\n})\nexport class AggregationComponent {\n /* stores */\n aggregationsStore = inject(AggregationsStore);\n queryParamsStore = inject(QueryParamsStore);\n\n /* services */\n aggregationsService = inject(AggregationsService);\n\n el = inject(ElementRef);\n\n name = input.required<string | null>();\n column = input.required<string | null>();\n\n onSelect = output<boolean>();\n\n /**\n * A boolean flag indicating whether the component should operate in headless mode.\n * When set to `true`, the component will function without rendering any UI elements.\n *\n * @default false\n */\n headless = input(false);\n\n /**\n * A boolean flag indicating whether the component is searchable.\n * This property is initialized to `undefined` by default.\n * \"Undefined\" and not \"false\" because this input overrides the custom json settings\n */\n searchable = input<boolean | undefined>(undefined);\n selection = signal(false);\n\n /**\n * A boolean flag indicating whether we want to see the filters count when some is applied\n * This property is initialized to `false` by default.\n */\n showCount = input(false);\n\n /* aggregation */\n aggregation = computed(() => {\n // when the aggegation store updates, we need to check if the aggregation is still valid\n getState(this.aggregationsStore);\n const name = this.name();\n const column = this.column();\n\n if (name !== null) {\n const agg = this.aggregationsService.processAggregation(name, column);\n if (agg) {\n // overrides \"searchable\" properties with the input if any\n agg.searchable = this.searchable() ?? agg.searchable;\n return agg;\n }\n }\n return null;\n });\n\n /* items of the aggretions */\n items = computed(() => {\n // when the aggegation store updates, we need to check if the aggregation is still valid\n getState(this.aggregationsStore);\n const agg = this.aggregation();\n const searchedItems = this.searchedItems();\n\n if (searchedItems.length > 0) {\n return searchedItems as AggregationListItem[];\n }\n if (agg !== null && agg?.items) {\n const currentFilters = this.addCurrentFiltersToItems() as AggregationListItem[];\n return currentFilters;\n }\n return [];\n });\n\n /**\n * A computed property that determines whether there are active filters\n * for the current aggregation column.\n *\n * if True, the clear button is shown.\n *\n * @returns {boolean} `true` if the filter count for the aggregation column is greater than 0, otherwise `false`.\n */\n hasFilters = computed(() => {\n const { count = 0 } = this.queryParamsStore.getFilter({ field: this.aggregation()?.column, name: this.aggregation()?.name }) || {};\n return count > 0;\n });\n\n /**\n * A computed property that returns the number of items of this aggregation applied in the active filters\n *\n * if more than 0 and the showCount input is set as True, the count number is shown.\n *\n * @returns {number} the filters count.\n */\n filtersCount = computed(() => {\n const { count = 0 } = this.queryParamsStore.getFilter({ field: this.aggregation()?.column, name: this.aggregation()?.name }) || {};\n return count;\n });\n\n /*\n * A computed property that returns the height of the component based on its state.\n *\n * @returns {number} the height of the component in rem.\n */\n computeHeight = computed(() => (this.headless() ? 0 : 2) + (this.aggregation()?.searchable ? 2 : 0));\n\n /* search feature */\n searchText = model<string>('');\n debouncedSearchText = debouncedSignal(this.searchText, 300);\n normalizedSearchText = computed(() =>\n this.debouncedSearchText()\n .normalize('NFD')\n .replace(/[\\u0300-\\u036f]/g, '')\n );\n\n /* suggestions */\n readonly suggests = signal<Suggestion[]>([]);\n /* searched items */\n readonly searchedItems = computed(() => {\n if (!this.suggests()) return [];\n\n // if the aggregation is a tree, we transform the suggestions into tree nodes\n if (this.aggregation()?.isTree) {\n return suggestionsToTreeAggregationNodes(this.suggests()!, this.normalizedSearchText());\n }\n\n // if the aggregation is not a tree, we return the suggestions as is\n return this.suggests()!.map(suggest => ({\n name: suggest.category,\n value: suggest.normalized || suggest.display || '',\n display: suggest.display,\n column: suggest.id,\n count: 1,\n $selected: false,\n items: []\n }));\n });\n\n query: Query;\n\n constructor() {\n this.query = buildQuery();\n\n effect(async () => {\n if (this.debouncedSearchText() === '' || this.aggregation() === null) {\n this.suggests.set([]);\n return;\n }\n\n try {\n const suggests = await fetchSuggestField(this.normalizedSearchText(), [this.aggregation()!.column]);\n this.suggests.set(suggests);\n } catch (e: any) {\n console.error('fetch suggest field', e);\n }\n });\n }\n\n /**\n * Clears the current filter for the aggregation column.\n *\n * This method updates the filter in the `queryParamsStore` by setting the display value\n * of the current aggregation column to an empty string.\n */\n clear() {\n const agg = this.aggregation();\n if (agg) {\n this.queryParamsStore.removeFilterByName(agg.name, agg.column);\n\n this.items().forEach(item => {\n item.$selected = false;\n });\n }\n }\n\n /**\n * Applies the current filters to the query parameters store.\n *\n * - If there are multiple filters, they are wrapped in an \"or\" filter.\n * - If the aggregation is not a distribution, the filters are merged into a single filter with an \"in\" operator.\n * - If there is only one filter, it is directly applied.\n * - If there are no filters, the current filters are cleared.\n *\n * After applying the filters, the search text is reset.\n */\n apply() {\n const filters = this.getFilters();\n\n const { name, column: field } = this.aggregation() as Aggregation;\n\n // if filters length > 1, we need to wrap them in an \"or\" filter\n if (filters.length > 1) {\n const display = filters[0].display;\n // if aggregation not a distribution, we need to merge the filters into a single filter with an in operator\n // with the values of the filters\n if (this.aggregation()?.isDistribution) {\n this.queryParamsStore.updateFilter({\n operator: 'or',\n filters,\n name,\n field,\n display\n } as LegacyFilter);\n } else {\n const values = filters.map(filter => filter.value);\n this.queryParamsStore.updateFilter({\n operator: 'in',\n name,\n field,\n values,\n display,\n filters\n } as LegacyFilter);\n }\n } else if (filters.length === 1) {\n this.queryParamsStore.updateFilter(filters[0]);\n } else {\n this.clear();\n }\n\n this.searchText.set('');\n this.selection.set(false);\n }\n\n loadMore(): void {\n const q = this.queryParamsStore.getQuery();\n this.aggregationsService.loadMore(q, this.aggregation() as Aggregation).subscribe(aggregation => {\n this.aggregationsStore.updateAggregation(aggregation);\n });\n }\n\n async open(node: AggregationListItem) {\n const q = this.queryParamsStore.getQuery();\n const agg = await firstValueFrom(this.aggregationsService.open(q, this.aggregation() as TreeAggregation, node as TreeAggregationNode));\n\n node.$opened = true;\n this.aggregationsStore.updateAggregation(agg);\n }\n\n /**\n * Updates the selected state of the given item in the aggregation list.\n *\n * @param item - The item to be selected or deselected.\n *\n * This method iterates through the items in the aggregation list and updates\n * the `$selected` property of the item that matches the value of the given item.\n *\n * If the item is selected, the selection count is incremented by 1.\n * If the item is deselected, the selection count is decremented by 1.\n */\n select() {\n this.onSelect.emit(true);\n this.selection.set(true);\n }\n\n /**\n * Retrieves the appropriate filters based on the aggregation type.\n *\n * If the aggregation is a tree structure, it returns filters specific to trees.\n * Otherwise, it returns filters for a list structure.\n *\n * @returns Filters for either a tree or list aggregation.\n */\n protected getFilters() {\n if (this.aggregation()?.isTree) {\n return this.getFiltersForTree();\n }\n return this.getFiltersForList();\n }\n\n /**\n * Retrieves the filters for the tree structure.\n *\n * This method collects the selected items from the tree, constructs their paths,\n * and creates a filter object based on these paths. If no items are selected,\n * it returns an empty array.\n *\n * @returns {LegacyFilter[]} An array of filters for the tree structure.\n */\n protected getFiltersForTree(): LegacyFilter[] {\n const { name, column: field } = this.aggregation() || {};\n\n if (!name || !field) {\n return [];\n }\n\n const items = this.getFlattenTreeItems()\n .filter(item => item.$selected)\n .map(item => `/${item.$path}/*` || '');\n\n const notSelectedItems = this.getFlattenTreeItems()\n .filter(item => !item.$selected)\n .map(item => `/${item.$path}/*` || '');\n\n // add the current filters to the current items\n const currentFilters = this.queryParamsStore.getFilter({ field, name })?.values || [];\n // if there are current filters, we need to add them to the current items\n if (currentFilters) {\n // remove filters that are not selected\n const filteredCurrentFilters = currentFilters.filter(filter => !notSelectedItems.includes(filter));\n // if the current filters are not selected, we need to add them to the items\n if (filteredCurrentFilters.length > 0) {\n // if the current filters are not selected, we need to add them to the items\n items.push(...filteredCurrentFilters);\n }\n }\n // remove duplicates\n const uniqueItems = Array.from(new Set(items));\n // if no items are selected, return an empty array\n if (uniqueItems.length === 0) return [];\n\n const filter = { operator: 'in', name, field, values: uniqueItems, display: uniqueItems[0] };\n return [filter] as LegacyFilter[];\n }\n\n /**\n * Retrieves a list of filters based on the selected items.\n *\n * This method filters the items to include only those that are selected,\n * and then maps each selected item to a filter using the `toFilter` method.\n *\n * @returns {LegacyFilter[]} An array of filters corresponding to the selected items.\n */\n protected getFiltersForList(): LegacyFilter[] {\n const items = this.addCurrentFiltersToItems().filter(item => item.$selected); // this.items().filter(item => item.$selected) || [];\n const searchedItems = this.searchedItems().filter(item => item.$selected);\n const currentItems = [...items, ...searchedItems];\n\n const { column, name, isDistribution = false } = this.aggregation() as Aggregation;\n const selectedItems = currentItems.map(item => this.aggregationsService.toFilter(item, column, name, isDistribution));\n return selectedItems;\n }\n\n /**\n * Recursively flattens a tree structure of `TreeAggregationNode` items into a single array.\n *\n * @returns {TreeAggregationNode[]} An array containing all nodes from the tree structure, flattened.\n */\n private getFlattenTreeItems(): TreeAggregationNode[] {\n const flattenItems = (items: TreeAggregationNode[]): TreeAggregationNode[] => {\n return items.reduce((flat, item) => {\n return flat.concat(item, item.items ? flattenItems(item.items) : []);\n }, [] as TreeAggregationNode[]);\n };\n\n const searchItems = flattenItems(this.searchedItems() || []);\n const items = flattenItems((this.aggregation()?.items as TreeAggregationNode[]) || []);\n const flattenedTreeItems = [...searchItems, ...items];\n return flattenedTreeItems;\n }\n\n private addCurrentFiltersToItems() {\n const currentItems = (this.aggregation()?.items as AggregationListItem[]) || [];\n\n // add the current filters to the current items only if they are not already present\n if (!this.aggregation()?.isTree && (!this.aggregation()?.isDistribution || this.aggregation()?.isDistribution === false)) {\n // get the current filters for the current aggregation\n const currentFilters = this.queryParamsStore.getFilter({ field: this.aggregation()?.column, name: this.aggregation()?.name });\n // if there are current filters, we need to add them to the current items\n if (currentFilters) {\n // multiples filters\n if (currentFilters.filters as LegacyFilter[]) {\n (currentFilters.filters as LegacyFilter[]).forEach((filter: LegacyFilter) => {\n // check if the filter is already present in the current items\n // if not, add it to the current items\n const found = currentItems.find(item => item.value === filter.value);\n if (!found) {\n currentItems.unshift({\n value: filter.value,\n display: filter.display,\n $selected: true\n } as AggregationListItem);\n }\n });\n } else {\n // single filter\n const found = currentItems.find(item => item.value === currentFilters.value);\n if (!found) {\n currentItems.push({\n value: currentFilters.value,\n display: currentFilters.display,\n $selected: true\n } as AggregationListItem);\n }\n }\n }\n }\n\n return currentItems;\n }\n}\n","<fieldset class=\"flex flex-col gap-2\">\n @if (!headless()) {\n <legend class=\"mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold text-gray-600\">\n <ng-content select=\"label\">\n @if (aggregation()?.icon) {\n <i class=\"fa-fw {{ aggregation()?.icon }} mr-1\" aria-hidden=\"true\"></i>\n }\n <span class=\"grow\">{{ aggregation()?.display | syslang | transloco }}</span>\n </ng-content>\n\n @if (showCount() && filtersCount() > 0) {\n <!-- count -->\n <Badge>\n {{ filtersCount() }}\n </Badge>\n }\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\"></i>\n </button>\n }\n @if (selection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\">\n <i class=\"fa-fw far fa-filter\"></i>\n </button>\n }\n </legend>\n }\n\n @if (aggregation()?.searchable && items().length) {\n <input type=\"text\" [placeholder]=\"'search' | transloco\" [(ngModel)]=\"searchText\" />\n }\n\n <ul class=\"snap-y snap-start overflow-auto\" role=\"list\" [attr.aria-label]=\"aggregation()?.display | syslang | transloco\">\n @for (item of items(); track $index) {\n <AggregationItem [node]=\"item\" (onSelect)=\"select()\" (onOpen)=\"open($event)\" />\n }\n </ul>\n @if (aggregation()?.$hasMore && this.searchedItems().length === 0) {\n <button variant=\"link\" class=\"mt-1 flex w-full justify-center\" [attr.aria-label]=\"'loadMore' | transloco\" (click)=\"loadMore()\">\n {{ 'loadMore' | transloco }}\n </button>\n }\n</fieldset>\n","import { NgClass } from '@angular/common';\nimport { Component, computed, DestroyRef, effect, inject, InjectionToken, input, signal } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormControl, FormGroup, ReactiveFormsModule } from '@angular/forms';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\n\nimport { Aggregation, AggregationItem, FilterOperator, LegacyFilter, notify, translateAggregationToDateOptions, warn } from '@sinequa/atomic';\nimport { ButtonComponent, cn, ListItemComponent } from '@sinequa/ui';\n\nimport { SyslangPipe } from '../../../../pipes';\nimport { AggEx } from '../../../../services';\nimport { AggregationComponent, AggregationTitle } from '../aggregation.component';\n\n/**\n * Injection token that indicates whether custom date ranges are allowed.\n *\n * @remarks\n * This token is used to configure the date component to allow users to select custom date ranges.\n *\n * @example\n * ```typescript\n * providers: [\n * { provide: ALLOW_CUSTOM_RANGE, useValue: false }\n * ]\n * ```\n *\n * @public\n */\nexport const FILTER_DATE_ALLOW_CUSTOM_RANGE = new InjectionToken<boolean>('date allow custom range', { factory: () => true });\n\ntype DateFilter = {\n label?: string;\n operator?: FilterOperator;\n value?: string;\n range?: [string, string];\n display?: string;\n disabled?: boolean;\n hidden?: boolean;\n};\n\n@Component({\n selector: 'date-filter,DateFilter',\n standalone: true,\n providers: [provideTranslocoScope('filters')],\n imports: [NgClass, ButtonComponent, ListItemComponent, ReactiveFormsModule, TranslocoPipe, SyslangPipe],\n templateUrl: './date.component.html',\n styles: `\n :host {\n display: block;\n }\n\n ul[role='list'] {\n scrollbar-width: thin;\n }\n `\n})\nexport class DateComponent extends AggregationComponent {\n cn = cn;\n readonly title = input<AggregationTitle>({ label: 'Date', icon: 'far fa-calendar-day' });\n readonly displayEmptyDistributionIntervals = input<boolean>(false);\n readonly allowCustomRange = inject(FILTER_DATE_ALLOW_CUSTOM_RANGE);\n readonly transloco = inject(TranslocoService);\n\n protected readonly dateOptions = computed(() =>\n translateAggregationToDateOptions(this.aggregation() as Aggregation, this.displayEmptyDistributionIntervals())\n );\n\n protected readonly form = new FormGroup({\n option: new FormControl<string | null>(null),\n customRange: new FormGroup({\n from: new FormControl<string | null>(null),\n to: new FormControl<string | null>(null)\n })\n });\n protected today = new Date().toISOString().split('T')[0];\n\n protected readonly validSelection = signal<boolean>(false);\n\n constructor(private destroyRef: DestroyRef) {\n super();\n\n // apply current date filter from queryParamsStore\n effect(() => {\n this.updateForm(this.queryParamsStore.getFilter({ field: this.aggregation()?.column, name: this.aggregation()?.name }) as LegacyFilter);\n });\n\n this.form.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(changes => {\n this.validSelection.set(\n !!changes.option && (changes.option !== 'custom-range' || (changes.customRange?.from !== null && changes.customRange?.to !== null))\n );\n });\n }\n\n override aggregation = computed(() => {\n const name = this.name();\n if (name !== null) {\n const agg = this.aggregationsService.processAggregation(name, this.column());\n return { ...agg, items: agg?.items?.filter((item: AggregationItem) => item.display !== 'custom-range') ?? [] } as AggEx;\n }\n return null;\n });\n\n public override apply(): void {\n try {\n const filter = this.getFormValueFilter();\n this.queryParamsStore.updateFilter(filter);\n } catch (err: unknown) {\n warn('Error applying date filter:', err);\n if (err instanceof Error) {\n notify.error(this.transloco.translate(err.message));\n }\n }\n }\n\n public override clear(notify: boolean = true): void {\n this.form.setValue({\n option: null,\n customRange: {\n from: null,\n to: null\n }\n });\n\n const agg = this.aggregation();\n if (agg && notify) {\n this.queryParamsStore.removeFilterByName(agg.name);\n }\n }\n\n private updateForm(filter: LegacyFilter | undefined): void {\n if (!filter) {\n this.clear(false);\n return;\n }\n\n const { operator, value } = filter;\n const code = this.dateOptions().find((option: DateFilter) => option.operator === operator && option.value === value)?.display ?? 'custom-range';\n\n let from, to;\n\n if (code === 'custom-range') {\n switch (operator) {\n case 'lte':\n to = filter.value;\n break;\n case 'gte':\n from = filter.value;\n break;\n case 'between':\n from = filter.start;\n to = filter.end;\n break;\n }\n }\n\n const formValue = {\n option: code,\n customRange: {\n from: code === 'custom-range' ? (from ?? null) : null,\n to: code === 'custom-range' ? (to ?? null) : null\n }\n };\n\n this.form.setValue(formValue as any);\n }\n\n private getFormValueFilter(): LegacyFilter {\n const value = this.form.value;\n\n // value.option is null\n if (!value.option) {\n throw new Error('filters.selectionInvalid');\n }\n\n if (value.option !== 'custom-range') {\n const dateOption = this.dateOptions().find((option: DateFilter) => option.display === value.option);\n const aggregation = this.aggregation();\n if (!aggregation) {\n throw new Error('filters.aggregationNotFound');\n }\n\n return {\n name: aggregation.name,\n operator: dateOption?.operator || 'eq',\n field: aggregation.column,\n display: dateOption?.display ?? '',\n filters: dateOption?.filters,\n value: dateOption?.value\n };\n } else if (value.customRange) {\n // if to is null, operator is gte\n // if from is null, operator is lte\n // if both are not null, operator is between\n const aggregation = this.aggregation();\n if (!aggregation) {\n throw new Error('filters.aggregationNotFound');\n }\n\n const filter: LegacyFilter = {\n name: aggregation.name,\n field: aggregation.column,\n display: value.option as string\n };\n\n if (value.customRange.from && value.customRange.to) {\n filter.operator = 'between';\n filter.start = value.customRange.from;\n filter.end = value.customRange.to;\n } else if (value.customRange.from) {\n filter.operator = 'gte';\n filter.value = value.customRange.from;\n } else if (value.customRange.to) {\n filter.operator = 'lte';\n filter.value = value.customRange.to;\n } else {\n throw new Error('filters.customRangeInvalid');\n }\n\n return filter;\n }\n\n throw new Error('filters.filterInvalid');\n }\n}\n","<form [formGroup]=\"form\">\n <fieldset class=\"overflow-auto\">\n @if (!headless()) {\n <legend class=\"mb-1 flex h-8 w-full select-none items-center pl-1 text-sm font-semibold text-gray-600\">\n <p class=\"me-4 grow\">\n <i class=\"fa-fw {{ title().icon }}\" aria-hidden=\"true\"></i>\n {{ title().label | syslang | transloco }}\n </p>\n <div class=\"ms-4\">\n @if (hasFilters()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n [attr.aria-label]=\"'filters.clearFilters' | transloco\"\n (click)=\"clear()\"\n (keydown.enter)=\"clear()\">\n <i class=\"fa-fw far fa-filter-circle-xmark\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (selection() && validSelection()) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n [attr.title]=\"'filters.applyFilters' | transloco\"\n [attr.aria-label]=\"'filters.applyFilters' | transloco\"\n (click)=\"apply()\"\n (keydown.enter)=\"apply()\">\n <i class=\"fa-fw far fa-filter\" aria-hidden=\"true\"></i>\n </button>\n }\n </div>\n </legend>\n }\n\n <ul class=\"flex flex-col gap-1 pt-2\" role=\"list\">\n @for (option of dateOptions(); track $index) {\n <li\n role=\"listitem\"\n tabindex=\"0\"\n (click)=\"radio.click()\"\n [attr.aria-label]=\"option.display | syslang | transloco\"\n [class]=\"\n cn(\n 'flex p-0 px-2 leading-7',\n form.get('option')?.value === option.display && 'bg-accent',\n option.hidden && 'hidden',\n option.disabled && 'disabled pointer-events-none text-neutral-300'\n )\n \"\n [attr.aria-hidden]=\"option.disabled\">\n <input\n #radio\n type=\"radio\"\n formControlName=\"option\"\n id=\"date-filter-{{ option.display }}\"\n [attr.disabled]=\"option.disabled ? true : null\"\n [attr.aria-disabled]=\"option.disabled\"\n (click)=\"select()\"\n value=\"{{ option.display }}\" />\n\n <label for=\"date-filter-{{ option.display }}\" class=\"grow cursor-pointer p-1\">\n {{ option.display | syslang | transloco }}\n </label>\n </li>\n }\n\n @if (allowCustomRange) {\n <li role=\"listitem\" aria-label=\"custom range\" class=\"flex px-2 leading-7\" [ngClass]=\"{ selected: form.get('option')?.value === 'custom-range' }\">\n <input #radiorange type=\"radio\" formControlName=\"option\" id=\"date-filter-custom-range\" value=\"custom-range\" (click)=\"select()\" />\n\n <div class=\"grid grow grid-cols-[4rem_auto] p-1 *:cursor-pointer\" formGroupName=\"customRange\" (click)=\"radiorange.click()\">\n <label for=\"date-filter-custom-from\">{{ 'from' | transloco }}</label>\n\n <input\n class=\"grow border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-from\"\n #dateFilterCustomFrom\n formControlName=\"from\"\n [max]=\"form.get('customRange.to')?.value ?? today\" />\n\n <label for=\"date-filter-custom-to\">{{ 'to' | transloco }}</label>\n\n <input\n class=\"border-b border-neutral-400 bg-transparent text-neutral-600\"\n type=\"date\"\n id=\"date-filter-custom-to\"\n formControlName=\"to\"\n [min]=\"form.get('customRange.from')?.value\"\n [max]=\"today\" />\n </div>\n </li>\n }\n </ul>\n </fieldset>\n</form>\n","import { Component, effect, ElementRef, inject, input, signal } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { Placement } from '@floating-ui/dom';\n\nimport { LegacyFilter } from '@sinequa/atomic';\nimport { BadgeComponent, ButtonComponent, ButtonVariants, PopoverComponent, PopoverContentComponent } from '@sinequa/ui';\n\nimport { OperatorPipe, SyslangPipe } from '../../../pipes';\nimport { AggregationsStore, AppStore, QueryParamsStore } from '../../../stores';\nimport { AggregationComponent } from '../aggregation/aggregation.component';\nimport { DateComponent } from '../aggregation/date/date.component';\nimport { CFilterEx } from '../filters.models';\n\n@Component({\n selector: 'filter-button, FilterButton',\n standalone: true,\n imports: [\n ButtonComponent,\n PopoverComponent,\n PopoverContentComponent,\n OperatorPipe,\n TranslocoPipe,\n AggregationComponent,\n SyslangPipe,\n DateComponent,\n BadgeComponent\n ],\n template: `\n <Popover [disabled]=\"filter().disabled\" class=\"group\">\n <button\n [variant]=\"variant()\"\n class=\"group-data-[open=true]:border group-data-[open=true]:border-gray-200\"\n [attr.data-disabled]=\"filter().disabled\"\n [disabled]=\"filter().disabled || null\">\n <!-- display the filter icon if set -->\n @if (filter().icon) {\n <i class=\"fa-fw {{ filter().icon }} \" aria-hidden=\"true\"></i>\n }\n\n @if (filter().legacyFilter && filter().display === 'custom-range') {\n <!-- display the date range if the filter is a date filter -->\n <span [innerHTML]=\"filter().legacyFilter | operator | syslang | transloco\"></span>\n } @else {\n <!-- display the first filter value or the aggregation name if no value is set -->\n {{ filter().display || filter().name | syslang | transloco }}\n }\n\n <!-- show the count of selected items -->\n @if (filter().isTree && filter().count > 0) {\n <Badge class=\"text-primary bg-primary-foreground min-w-5 px-1\">\n {{ filter().count }}\n </Badge>\n } @else if (filter().count > 1) {\n <Badge class=\"text-primary bg-primary-foreground hover:bg-primary-foreground size-5 min-w-5 px-1\"> +{{ filter().count - 1 }} </Badge>\n }\n </button>\n <PopoverContent class=\"w-max\" [position]=\"position()\">\n @if (isDate(filter().column)) {\n <DateFilter\n class=\"w-max min-w-[300px]\"\n [name]=\"filter().name\"\n [column]=\"filter().column\"\n id=\"filter-{{ filter().column }}\"\n [title]=\"{ label: 'Date', icon: 'far fa-calendar-day' }\" />\n } @else {\n <Aggregation class=\"max-h-(--agg-max-height,25rem)\" [name]=\"filter().name\" [column]=\"filter().column\" id=\"filter-{{ filter().column }}\" />\n }\n </PopoverContent>\n </Popover>\n `,\n host: {\n '[class.hidden]': 'filter().hidden'\n }\n})\nexport class FilterButtonComponent {\n name = input.required<string>();\n column = input.required<string>();\n position = input<Placement>('bottom-start');\n\n protected variant = signal<ButtonVariants['variant']>('ghost');\n\n protected filter = signal<CFilterEx>({\n name: '',\n icon: '',\n column: '',\n display: '',\n isTree: false,\n count: 0,\n hidden: false,\n disabled: false\n });\n\n protected nativeElement = inject(ElementRef).nativeElement;\n protected aggregationsStore = inject(AggregationsStore);\n protected queryParamsStore = inject(QueryParamsStore);\n protected appStore = inject(AppStore);\n\n constructor() {\n effect(() => {\n const agg = this.aggregationsStore.getAggregation(this.name());\n const f = this.queryParamsStore.getFilter({ name: agg?.name, field: agg?.column });\n const count = f?.count || 0;\n\n if (!agg) return;\n\n // retrieve customization fron the custom JSON provided by the server\n const { icon, hidden = false, display } = this.appStore.getAggregationCustomization(this.column()) || {};\n\n const r = {\n name: agg?.name,\n column: this.column(),\n icon,\n hidden,\n display: agg?.isTree ? display : (f?.display ?? f?.value ?? display),\n isTree: agg?.isTree || false,\n count,\n disabled: !agg?.items || agg.items?.length === 0 ? true : false,\n // if the filter is a date filter, we need to set the legacyFilter\n // to be able to display the date range\n legacyFilter: this.isDate(this.column()) ? (f as LegacyFilter) : undefined\n };\n\n this.filter.set(r);\n });\n\n effect(() => {\n const f = this.filter();\n this.variant.update(v => (f.count ? 'default' : 'ghost'));\n });\n }\n\n /**\n * Checks if the specified column is a date filter.\n *\n * @param column The column name to check.\n * @returns True if the column is a date filter, false otherwise.\n */\n protected isDate(column: string): boolean {\n return this.appStore.isDateColumn(column);\n }\n}\n","import { InjectionToken } from '@angular/core';\nimport { LegacyFilter } from '@sinequa/atomic';\nimport { CFilter } from '../../models';\n\nexport type CFilterEx = CFilter & {\n name: string;\n count: number;\n isTree: boolean;\n disabled: boolean;\n hidden: boolean;\n legacyFilter?: LegacyFilter;\n};\n\nexport const FILTERS_BREAKPOINT = new InjectionToken<number>('FILTERS_BREAKPOINT', { factory: () => 5 });\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, effect, inject, input, signal } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { BadgeComponent, ButtonComponent, cn } from '@sinequa/ui';\n\nimport { CFilter } from '../../../models';\nimport { AggregationsStore, AppStore, QueryParamsStore } from '../../../stores';\nimport { AggregationComponent } from '../aggregation/aggregation.component';\nimport { DateComponent } from '../aggregation/date/date.component';\nimport { CFilterEx } from '../filters.models';\nimport { Aggregation } from '@sinequa/atomic';\n\n@Component({\n selector: 'more, More',\n standalone: true,\n imports: [NgTemplateOutlet, ButtonComponent, AggregationComponent, TranslocoPipe, DateComponent, BadgeComponent],\n template: `\n @for (filter of filters(); track $index) {\n <li [class]=\"cn('collapse pb-1', filter.hidden && 'hidden')\">\n <!-- header -->\n <input\n role=\"button\"\n type=\"checkbox\"\n name=\"more-filters\"\n [class]=\"cn('min-h-8 w-full', filter.disabled && 'pointer-events-none cursor-default select-none')\"\n [attr.title]=\"'filters.openFilter' | transloco: { filter: filter.display || filter.name }\" />\n\n @if (isDate(filter.column)) {\n <ng-container [ngTemplateOutlet]=\"actions\" [ngTemplateOutletContext]=\"{ filter, agg }\" />\n <DateFilter #agg class=\"collapse-content ml-2 mr-2\" [name]=\"filter.name\" [column]=\"filter.column\" id=\"filter-{{ filter.column }}\" [headless]=\"true\" />\n } @else {\n <ng-container [ngTemplateOutlet]=\"actions\" [ngTemplateOutletContext]=\"{ filter, agg }\" />\n <Aggregation\n #agg\n class=\"collapse-content ml-2 mr-2\"\n [name]=\"filter.name\"\n [column]=\"filter.column\"\n id=\"filter-{{ filter.column }}\"\n [headless]=\"true\" />\n }\n </li>\n\n <!-- actions fragment -->\n <ng-template #actions let-filter=\"filter\" let-agg=\"agg\">\n <div [class]=\"cn('collapse-title flex items-center gap-1 px-2 py-1 text-gray-600', filter.disabled && 'text-slate-300')\">\n <!-- aggregation's icon -->\n <i class=\"me-1 fa-fw {{ filter.icon }}\" aria-hidden=\"true\"></i>\n\n <!-- aggregation label -->\n <span class=\"me-4 grow text-sm font-semibold\">{{ filter.display || filter.name | transloco }}</span>\n @if (filter.count > 0) {\n <!-- count -->\n <Badge class=\"min-w-5 px-1\">\n {{ filter.count }}\n </Badge>\n }\n <!-- \"clear filters\" button. The \"z-10\" rule is here to keep the button above the collapse content -->\n @if (hasFilters(filter)) {\n <button\n variant=\"ghost\"\n size=\"icon\"\n class=\"z-10 text-gray-600\"\n [attr.title]=\"'filters.clearFilters' | transloco\"\n (click)=\"clearFilter(filter.column)\"\n (keydown.enter)=\"clearFilter(filter.column)\">\n <i class=\"fa-fw far fa-filter-circle-xmark\"></i>\n </button>\n }\n @if (agg.selection()) {\n <button variant=\"ghost\" size=\"icon\" class=\"z-10\" [attr.title]=\"'filters.applyFilters' | transloco\" (click)=\"agg.apply()\">\n <i class=\"fa-fw far fa-filter\"></i>\n </button>\n }\n </div>\n </ng-template>\n }\n `,\n host: {\n class: 'divide-y divide-gray-200'\n },\n styles: [\n `\n :host {\n scrollbar-width: none;\n }\n `\n ]\n})\nexport class MoreComponent {\n cn = cn;\n count = input<number>(2);\n excludedFilters = input<string[]>([]);\n\n route = inject(ActivatedRoute);\n appStore = inject(AppStore);\n aggregationsStore = inject(AggregationsStore);\n queryParamsStore = inject(QueryParamsStore);\n\n filters = signal<CFilterEx[]>([]);\n\n constructor() {\n effect(() => {\n const count = this.count();\n\n const authorizedFilters = this.appStore\n .getAuthorizedFilters(this.route)\n .filter(f => !this.excludedFilters().includes(f.name))\n .toSpliced(0, count);\n\n const f = authorizedFilters.map(agg => {\n const { icon = 'far fa-list', hidden = false } = (this.appStore.getAggregationCustomization(agg.column) as CFilter) || {};\n return {\n name: agg.name,\n column: agg.column,\n icon,\n count: 0,\n isTree: false,\n disabled: false,\n hidden\n };\n });\n\n this.filters.set(f);\n this.updateFilters();\n });\n }\n\n clearFilter(field: string) {\n this.queryParamsStore.removeFilter(field);\n }\n\n updateFilters() {\n this.filters.update(filters => {\n return filters.map(filter => {\n const agg = this.aggregationsStore.getAggregation(filter.name);\n const f = this.queryParamsStore.getFilter({ name: agg?.name, field: agg?.column });\n const count = f?.count || 0;\n\n const { display = agg?.isTree ? undefined : filter.display } = (this.appStore.getAggregationCustomization(filter.column) as CFilter) || {};\n\n return {\n ...filter,\n name: agg?.name || filter.name,\n display,\n isTree: agg?.isTree || false,\n count,\n disabled: !agg?.items || agg.items?.length === 0 ? true : false\n };\n });\n });\n }\n\n /**\n * Checks if the specified column is a date filter.\n *\n * @param column The column name to check.\n * @returns True if the column is a date filter, false otherwise.\n */\n isDate(column: string | null): boolean {\n if (!column) return false;\n return this.appStore.isDateColumn(column);\n }\n\n /**\n * Checks whether there are active filters for the current aggregation column.\n *\n * if True, the clear button is shown.\n *\n * @returns {boolean} `true` if the filter count for the aggregation column is greater than 0, otherwise `false`.\n */\n hasFilters(aggregation: Aggregation): boolean {\n const { count = 0 } = this.queryParamsStore.getFilter({ field: aggregation.column, name: aggregation.name }) || {};\n return count > 0;\n }\n}\n","import { Component, computed, ElementRef, inject, input } from '@angular/core';\nimport { ActivatedRoute } from '@angular/router';\nimport { TranslocoPipe } from '@jsverse/transloco';\nimport { Placement } from '@floating-ui/dom';\n\nimport { BadgeComponent, ButtonComponent, PopoverComponent, PopoverContentComponent } from '@sinequa/ui';\n\nimport { MoreComponent } from './more.component';\nimport { AppStore, QueryParamsStore } from '../../../stores';\n\n@Component({\n selector: 'more-button, MoreButton',\n standalone: true,\n imports: [ButtonComponent, PopoverComponent, PopoverContentComponent, TranslocoPipe, MoreComponent, BadgeComponent],\n template: `\n <Popover class=\"group\">\n <button\n variant=\"ghost\"\n class=\"gap-1 truncate font-semibold group-data-[open=true]:border group-data-[open=true]:border-gray-200\"\n aria-label=\"more filters\">\n <i class=\"far fa-filters\" aria-hidden=\"true\"></i>\n <span>{{ 'filters.moreFilters' | transloco }}</span>\n\n @if (totalFiltersCount() > 0) {\n <Badge class=\"min-w-5 px-1\">\n {{ totalFiltersCount() }}\n </Badge>\n }\n </button>\n\n <PopoverContent [position]=\"position()\" class=\"more-filters max-h-[55vh]: lg:max-h-[65vh]\">\n <More [count]=\"count()\" [excludedFilters]=\"excludedFilters()\" class=\"h-full max-w-80 overflow-y-scroll\" />\n </PopoverContent>\n </Popover>\n `,\n styles: [\n `\n .more-filters {\n overflow: var(--scrollbar-overflow, hidden);\n padding-right: 0;\n scrollbar-width: thin;\n scrollbar-gutter: stable;\n }\n .more-filters:hover {\n --scrollbar-overflow: overlay;\n }\n `\n ]\n})\nexport class MoreButtonComponent {\n route = inject(ActivatedRoute);\n appStore = inject(AppStore);\n queryParamsStore = inject(QueryParamsStore);\n nativeElement = inject(ElementRef).nativeElement;\n\n count = input<number>(2);\n position = input<Placement>('bottom-end');\n excludedFilters = input<string[]>([]);\n\n totalFiltersCount = computed(() => {\n const count = this.count();\n\n const authorizedFilters = this.appStore\n .getAuthorizedFilters(this.route)\n .filter(f => !this.excludedFilters().includes(f.name))\n .map(f => ({ field: f.column, name: f.name }))\n .toSpliced(0, count);\n\n const total = authorizedFilters.reduce((acc, filter) => {\n const f = this.queryParamsStore.getFilter(filter);\n acc += f?.count || 0;\n return acc;\n }, 0);\n return total;\n });\n}\n","import { ChangeDetectorRef, Component, computed, DestroyRef, effect, ElementRef, inject, input, output, signal, viewChild, viewChildren } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\nimport { debounceTime } from 'rxjs';\nimport { Placement } from '@floating-ui/dom';\n\nimport { ButtonComponent, cn } from '@sinequa/ui';\n\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective } from '../../directives';\nimport { AggregationsStore, AppStore, QueryParamsStore } from '../../stores';\nimport { FilterButtonComponent } from './buttons/filter-button.component';\nimport { FILTERS_BREAKPOINT } from './filters.models';\nimport { MoreButtonComponent } from './more/more-button.component';\n\n@Component({\n selector: 'filters-bar, FiltersBar, filtersbar',\n standalone: true,\n imports: [ButtonComponent, MoreButtonComponent, FilterButtonComponent, OverflowManagerDirective, OverflowItemDirective, OverflowStopDirective, TranslocoPipe],\n providers: [provideTranslocoScope('filters')],\n template: `\n <ng-container overflowManager [direction]=\"direction()\" [target]=\"el.nativeElement\" (count)=\"adjustFiltersCount($event)\">\n @if (hasFilters()) {\n <button\n variant=\"destructive\"\n size=\"icon\"\n class=\"shrink-0\"\n [title]=\"'filters.clearAllFilters' | transloco\"\n (click)=\"clearFilters()\"\n (keydown.enter)=\"clearFilters()\">\n <i class=\"fa-fw far fa-trash-can\" aria-hidden=\"true\"></i>\n </button>\n }\n\n @if (currentBasket()) {\n <button variant=\"destructive\" class=\"max-w-40\" [title]=\"'filters.clearBasket' | transloco\" (click)=\"clearBasket()\" (keydown.enter)=\"clearBasket()\">\n <i class=\"fa-fw far fa-inbox\" aria-hidden=\"true\"></i>\n <p class=\"truncate\">{{ currentBasket() }}</p>\n </button>\n }\n\n @if (hasAggregations()) {\n @for (filter of filters(); track $index) {\n <FilterButton overflowItem [name]=\"filter.name\" [column]=\"filter.column\" [position]=\"position()\" />\n }\n\n <!-- More button to show more filters if there are any, it's hidden by default -->\n <MoreButton\n overflowStop\n [class]=\"cn('invisible absolute', direction() === 'horizontal' ? 'right-0' : 'bottom-0', hasMoreFilters().length > 0 && 'visible')\"\n [count]=\"moreFilterCount()\"\n [position]=\"position()\"\n [excludedFilters]=\"excludeFilters()\" />\n }\n </ng-container>\n `,\n host: {\n '[class]': 'cn(\"flex relative z-filter gap-2\", direction() === \"vertical\" ? \"flex-col items-start\" : \"flex-row\", class())',\n role: 'list',\n 'aria-label': 'Filters list'\n }\n})\nexport class FiltersBarComponent {\n class = input<string>();\n\n position = input<Placement>('bottom-start');\n\n /**\n * Filters that should be excluded from the filters bar.\n * This can be used to hide specific filters from the UI.\n *\n * Use the filter column names to specify which filters to exclude.\n * For example, to exclude the \"geo\" filter, set `excludeFilters = ['Geo']`.\n */\n excludeFilters = input<string[]>([]);\n\n /**\n * The number of filters to display before showing the \"more filters\" button.\n * This is used to limit the number of visible filters in the UI.\n * The default value is set by the FILTERS_BREAKPOINT injection token.\n */\n filtersCount = input<number>(inject(FILTERS_BREAKPOINT));\n direction = input<'horizontal' | 'vertical'>('horizontal');\n\n /**\n * Event emitted when the clear filters button is clicked.\n * This event can be used to perform additional actions when filters are cleared.\n */\n onClearFilters = output<void>();\n\n /**\n * Event emitted when the clear basket button is clicked.\n * This event can be used to perform additional actions when the basket is cleared.\n */\n onClearBasket = output<void>();\n\n protected cn = cn;\n protected moreFilterElement = viewChild<MoreButtonComponent>(MoreButtonComponent);\n protected dropdownElements = viewChildren<FilterButtonComponent>(FilterButtonComponent);\n protected readonly overflowManager = viewChild<OverflowManagerDirective>(OverflowManagerDirective);\n\n protected cdr = inject(ChangeDetectorRef);\n\n protected route = inject(ActivatedRoute);\n protected appStore = inject(AppStore);\n protected aggregationsStore = inject(AggregationsStore);\n protected queryParamsStore = inject(QueryParamsStore);\n protected el = inject(ElementRef);\n protected readonly transloco = inject(TranslocoService);\n protected readonly router = inject(Router);\n protected destroyRef = inject(DestroyRef);\n\n protected filters = signal<{ name: string; column: string }[]>([]);\n protected moreFilterCount = signal(this.filtersCount());\n\n protected hasFilters = computed(() => {\n // when the query parameters store updates, update the hasFilters signal\n // to show or hide the clear filters button\n const state = getState(this.queryParamsStore);\n return state.basket || (Array.isArray(state.filters) && state.filters.length > 0);\n });\n\n protected currentBasket = computed(() => {\n const { basket } = getState(this.queryParamsStore);\n return basket;\n });\n\n protected hasAggregations = computed(() => {\n if (this.aggregationsStore.aggregations()) return this.aggregationsStore.aggregations().length > 0;\n return false;\n });\n\n protected hasMoreFilters = computed(() => {\n const moreFiltersAggregations = this.appStore\n .getAuthorizedFilters(this.route)\n .filter(f => !this.excludeFilters().includes(f.name)) // filter out the excluded filters\n .map(f => ({ column: f.column, name: f.name }))\n .toSpliced(0, this.moreFilterCount())\n .map(f => this.aggregationsStore.getAggregation(f.column, 'column'));\n\n return moreFiltersAggregations;\n });\n\n constructor() {\n effect(() => {\n // set filters according to the route and the authorized filters with default values\n const authorizedFilters = this.appStore\n .getAuthorizedFilters(this.route)\n .filter(f => !this.excludeFilters().includes(f.name)) // filter out the excluded filters\n .map(f => ({ name: f.name, column: f.column }))\n .toSpliced(this.filtersCount());\n\n this.filters.set(authorizedFilters);\n });\n\n this.transloco.events$.pipe(takeUntilDestroyed(this.destroyRef), debounceTime(100)).subscribe(() => this.overflowManager()?.countItems());\n }\n\n /**\n * Clears all filters (included baskets) by invoking the clearFilters method on the queryParamsStore.\n * This method is typically used to reset the filter state to its default values.\n */\n clearFilters(): void {\n this.queryParamsStore.clearFilters();\n this.onClearFilters.emit();\n }\n\n /**\n * Clears the basket by invoking the clearBasket method on the queryParamsStore.\n * This method is typically used to reset the basket state to its default value.\n */\n clearBasket(): void {\n this.queryParamsStore.clearBasket();\n this.onClearBasket.emit();\n }\n\n /**\n * Adjusts the count of filters that can be displayed before the \"more filters\" option is shown.\n *\n * This method calculates the number of filter dropdowns that can fit in the available space\n * before the \"more filters\" button. It updates the `moreFilterCount` property with the number\n * of filters that can be displayed. If no filters are present, it sets the `moreFilterCount`\n * to the total number of filters.\n *\n */\n protected adjustFiltersCount(count: number): void {\n // count is the number of filter dropdowns that can fit in the available space\n // filtersCount is the number of filters that can be displayed before the \"more filters\" option is shown\n this.moreFilterCount.set(count > this.filtersCount() ? this.filtersCount() : count);\n }\n}\n","import { Component, ComponentRef, DestroyRef, HostBinding, InjectionToken, Type, ViewContainerRef, inject } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { DrawerComponent } from '../drawer/drawer.component';\nimport { DrawerStackService } from './drawer-stack.service';\nimport { SelectionHistoryService } from '../../services';\n\nexport const DRAWER_COMPONENT = new InjectionToken<Type<DrawerComponent>>('DRAWER_COMPONENT');\nexport const DRAWER_STACK_MAX_COUNT = new InjectionToken<number>('Drawer stack maximum count', {\n factory: () => 3\n});\n\n@Component({\n selector: 'app-drawer-stack',\n template: ``,\n styles: [\n `\n :host {\n position: absolute;\n top: 50%;\n right: 0;\n\n --drawer-width: 46;\n --drawer-subdrawer-width: 400px;\n\n z-index: var(--z-drawer);\n\n transition: right 300ms linear;\n\n &[drawer-opened='true'] {\n right: calc(1% * var(--drawer-width));\n }\n }\n `\n ]\n})\nexport class DrawerStackComponent {\n @HostBinding('attr.drawer-opened')\n public drawerOpened: boolean = false;\n\n readonly drawerStackService = inject(DrawerStackService);\n protected readonly selectionHistory = inject(SelectionHistoryService);\n protected readonly viewContainer = inject(ViewContainerRef);\n\n // Inject the token for the drawer component\n protected readonly drawerComponent = inject(DRAWER_COMPONENT);\n // Inject the token for the maximum number of drawers\n protected readonly drawerStackMaxCount = inject(DRAWER_STACK_MAX_COUNT);\n\n protected readonly selectionHistory$ = this.selectionHistory.selectionHistoryEvent;\n\n protected readonly drawers: ComponentRef<DrawerComponent>[] = [];\n get drawersLength() {\n return this.drawers.length;\n }\n\n constructor(destroyRef: DestroyRef) {\n this.drawerStackService.isOpened.pipe(takeUntilDestroyed(destroyRef)).subscribe(state => {\n this.drawerOpened = state;\n\n if (state && !!this.drawerStackService.componentType) {\n this.openTopDrawer(undefined, this.drawerStackService.componentType);\n }\n });\n\n this.selectionHistory$.pipe(takeUntilDestroyed(destroyRef)).subscribe(event => {\n if (event !== 'new') return;\n\n this.openTopDrawer(this.selectionHistory.getCurrentSelectionIndex());\n });\n\n this.drawerStackService.toggleTopDrawerExtension$.pipe(takeUntilDestroyed(destroyRef)).subscribe(() => this.toggleTopDrawerExtension());\n this.drawerStackService.forceTopDrawerCollapse$.pipe(takeUntilDestroyed(destroyRef)).subscribe(() => this.collapseTopDrawer());\n this.drawerStackService.closeTopDrawer$.pipe(takeUntilDestroyed(destroyRef)).subscribe(() => this.closeTopDrawer());\n this.drawerStackService.closeAllDrawers$.pipe(takeUntilDestroyed(destroyRef)).subscribe(() => this.closeAllDrawers());\n }\n\n protected toggleAssistant(): void {\n this.drawerStackService.toggleAssistant();\n }\n\n private openTopDrawer(index?: number, componentType?: Type<DrawerComponent>): void {\n if (this.drawers.length >= this.drawerStackMaxCount) {\n console.warn('Drawer stack is full');\n this.shiftDrawer();\n }\n\n this.pushDrawer(index, componentType || this.drawerComponent);\n }\n\n private closeTopDrawer(): void {\n const top = this.drawers.pop();\n\n this.selectionHistory.back();\n\n this.closeAndDestroyDrawer(top);\n\n if (this.drawers.length < this.drawerStackMaxCount && this.selectionHistory.getHistoryLength() > this.drawers.length)\n this.unshiftDrawer(this.selectionHistory.getHistoryLength() - this.drawers.length - 1);\n }\n\n private closeAllDrawers(): void {\n this.closeAndDestroyDrawer(this.drawers.pop());\n this.drawers.forEach(drawer => drawer.destroy());\n this.drawers.length = 0;\n }\n\n private collapseTopDrawer(): void {\n const top = this.drawers[this.drawers.length - 1];\n\n top?.instance.drawer.collapse();\n }\n\n private toggleTopDrawerExtension(): void {\n const top = this.drawers[this.drawers.length - 1];\n\n top?.instance.drawer.toggleExtension();\n }\n\n private pushDrawer(index?: number, componentType?: Type<DrawerComponent>): void {\n if (!componentType) {\n throw new Error('Component type is undefined');\n }\n const drawer = this.viewContainer.createComponent(componentType);\n\n if (index !== undefined) {\n drawer.setInput('articleId', this.selectionHistory.getSelection(index)?.id);\n }\n\n this.drawers.push(drawer);\n\n // setTimeout is needed to ensure that the drawer is fully initialized\n // and the animation will be played\n setTimeout(() => {\n drawer.instance.drawer.open();\n });\n }\n\n private shiftDrawer(): void {\n const drawer = this.drawers.shift();\n\n this.closeAndDestroyDrawer(drawer);\n }\n\n private unshiftDrawer(index: number): void {\n const drawer = this.viewContainer.createComponent(this.drawerComponent);\n\n drawer.setInput('articleId', this.selectionHistory.getSelection(index)?.id);\n\n this.viewContainer.insert(drawer.hostView, 0);\n\n this.drawers.unshift(drawer);\n\n drawer.instance.drawer.open();\n }\n\n private closeAndDestroyDrawer(drawer?: ComponentRef<DrawerComponent>) {\n drawer?.instance.drawer.close();\n\n setTimeout(() => {\n drawer?.destroy();\n }, 250);\n }\n}\n","import { Injectable, inject } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\nimport { BackdropService } from '../../components/backdrop/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 { Component, ElementRef, HostBinding, HostListener, afterNextRender, inject, signal, viewChild } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\n\nimport { SelectionHistoryService } from '../../services/selection-history.service';\nimport { DrawerService } from './drawer.service';\nimport { DrawerStackService } from '../drawer-stack/drawer-stack.service';\n\n/**\n * Each Drawer component has it's own drawer service to handle its state and link it to the drawer stack.\n */\n\n@Component({\n selector: 'app-drawer',\n standalone: true,\n providers: [DrawerService],\n template: ``,\n styleUrl: './drawer.component.css',\n host: {\n '[attr.drawer-opened]': 'drawerOpened()',\n '[attr.drawer-extended]': 'drawerExtended()'\n }\n})\nexport class DrawerComponent {\n public drawerOpened = signal(false);\n public drawerExtended = signal(false);\n\n @HostBinding('style.grid-template-columns')\n public drawerGridTemplateColumns: string = '';\n\n @HostListener('mousemove', ['$event'])\n public mouseMove(event: MouseEvent): void {\n if (!this.isSliding) return;\n\n const min = (window.innerWidth * 3) / 100;\n const max = (window.innerWidth * 46) / 100;\n const width = Math.min(Math.max(event.clientX, min), max);\n\n this.drawerGridTemplateColumns = `${width}px minmax(min-content, 1fr) var(--drawer-subdrawer-width)`;\n }\n\n @HostListener('mousedown', ['$event'])\n public mouseDown(event: MouseEvent): void {\n if (event.target !== this.drawerHandle()?.nativeElement) return;\n\n this.disableAnimation();\n this.isSliding = true;\n }\n\n @HostListener('mouseup')\n public mouseUp(): void {\n if (this.isSliding) this.enableAnimation();\n\n this.isSliding = false;\n }\n\n drawerHandle = viewChild<ElementRef>('drawerHandle');\n\n public readonly drawer = inject(DrawerService);\n protected readonly drawerStack = inject(DrawerStackService);\n\n protected readonly element = inject(ElementRef).nativeElement;\n protected readonly selectionHistory = inject(SelectionHistoryService);\n\n private isSliding = false;\n private defaultDrawerGridTemplate = '';\n\n constructor() {\n afterNextRender(() => {\n this.drawerGridTemplateColumns = this.element.style.gridTemplateColumns;\n });\n\n this.drawer.isOpened.pipe(takeUntilDestroyed()).subscribe(state => {\n this.drawerOpened.set(state);\n if (!state) this.resetGridTemplateColumns();\n });\n\n this.drawer.isExtended.pipe(takeUntilDestroyed()).subscribe(state => {\n this.drawerExtended.set(state);\n if (!state) this.resetGridTemplateColumns();\n });\n }\n\n private disableAnimation(): void {\n this.element.classList.add('no-transition-important');\n }\n\n private enableAnimation(): void {\n this.element.classList.remove('no-transition-important');\n }\n\n private resetGridTemplateColumns(): void {\n this.element.style.gridTemplateColumns = this.defaultDrawerGridTemplate;\n }\n}\n","import { Component, inject } from '@angular/core';\nimport { toSignal } from '@angular/core/rxjs-interop';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ButtonComponent, VerticalDividerComponent } from '@sinequa/ui';\n\nimport { DrawerStackService } from '../../drawer-stack/drawer-stack.service';\nimport { DrawerService } from '../drawer.service';\n\n@Component({\n selector: 'app-drawer-navbar',\n standalone: true,\n imports: [TranslocoPipe, ButtonComponent, VerticalDividerComponent],\n templateUrl: './drawer-navbar.component.html'\n})\nexport class DrawerNavbarComponent {\n protected readonly drawerStack = inject(DrawerStackService);\n protected readonly drawerService = inject(DrawerService);\n\n readonly isExtended = toSignal(this.drawerService.isExtended);\n}\n","<menu class=\"flex items-center gap-2 p-4 font-semibold\">\n <button variant=\"ghost\" class=\"group\" [attr.title]=\"'back' | transloco\" (click)=\"drawerStack.close()\">\n <i class=\"fa-fw far fa-arrow-left [&_svg]-ms-1 [&_svg]transition-transform opacity-60 group-hover:-translate-x-0.5\"></i>\n {{ 'back' | transloco }}\n </button>\n\n <VerticalDivider />\n\n <ng-content></ng-content>\n</menu>\n","import { Overlay } from '@angular/cdk/overlay';\nimport { Component, computed, effect, inject, signal, untracked } from '@angular/core';\nimport { NonNullableFormBuilder, ReactiveFormsModule } from '@angular/forms';\nimport { Router } from '@angular/router';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { Aggregation, AggregationItem, FilterOperator, LegacyFilter, TreeAggregation, TreeAggregationNode } from '@sinequa/atomic';\nimport { ButtonComponent, InputComponent } from '@sinequa/ui';\n\nimport { DropdownInputComponent, DropdownItem } from '../../../components';\nimport { QueryService } from '../../../services';\nimport { AppStore, QueryParamsStore } from '../../../stores';\nimport { buildQuery } from '../../../utils';\nimport { DrawerStackService } from '../../drawer-stack/drawer-stack.service';\nimport { DrawerComponent } from '../drawer.component';\nimport { DrawerService } from '../drawer.service';\nimport { DrawerNavbarComponent } from '../navbar/drawer-navbar.component';\n\ntype Operator = 'all' | 'exact' | 'any' | 'none' | 'matches';\n\ninterface Filter {\n column: string;\n alias: string;\n items?: (AggregationItem | TreeAggregationNode)[];\n}\n\nconst searchRoute = 'search';\n\n@Component({\n selector: 'advanced-filters',\n standalone: true,\n imports: [ReactiveFormsModule, TranslocoPipe, DrawerNavbarComponent, DropdownInputComponent, ButtonComponent, InputComponent],\n providers: [DrawerService, provideTranslocoScope('drawers')],\n templateUrl: './advanced-filters.component.html',\n styleUrls: ['./advanced-filters.component.css']\n})\nexport class DrawerAdvancedFiltersComponent extends DrawerComponent {\n private readonly queryParamsStore = inject(QueryParamsStore);\n private readonly appStore = inject(AppStore);\n private readonly router = inject(Router);\n private readonly formBuilder = inject(NonNullableFormBuilder);\n private readonly overlay: Overlay = inject(Overlay);\n private readonly transloco = inject(TranslocoService);\n private readonly queryService = inject(QueryService);\n\n protected scrollStrategy = this.overlay.scrollStrategies.reposition();\n protected noop = this.overlay.scrollStrategies.noop();\n\n selectData: { operator: string; display: string; placeholder?: string }[] = [\n { operator: 'all', display: 'filterContainsAll' },\n { operator: 'exact', display: 'filterContainsExact' },\n { operator: 'any', display: 'filterContainsAny' },\n { operator: 'none', display: 'filterContainsNone' },\n { operator: 'matches', display: 'filterMatches', placeholder: 'you can use AND/OR criteria' }\n ];\n\n protected readonly form = this.formBuilder.group({\n content: this.formBuilder.group({\n operator: this.formBuilder.control<Operator>('all'),\n value: this.formBuilder.control(undefined)\n }),\n title: this.formBuilder.group({\n operator: this.formBuilder.control<Operator>('all'),\n value: this.formBuilder.control(undefined)\n }),\n location: this.formBuilder.group({\n operator: this.formBuilder.control<Operator>('all'),\n value: this.formBuilder.control(undefined)\n })\n });\n\n currentTab = signal<string>('all');\n currentFilter = signal<string | undefined>(undefined);\n appliedFilters = signal<{ column: string; values: DropdownItem[] }[]>([]);\n suggestions = signal<DropdownItem[]>([]);\n aggregations = signal<(Aggregation | TreeAggregation)[] | undefined>(undefined);\n\n tabs = computed<string[]>(() => {\n const routeData = this.router.config.find(c => c.path === searchRoute);\n return !routeData ? [] : ['all'].concat(routeData.children!.filter(c => !!c.path && c.path !== 'all' && c.path !== '**').map(c => c.path!));\n });\n\n filters = computed<Filter[]>(() => {\n return (\n this.appStore\n .customizationJson()\n .filters?.filter(f => f.column !== '#date')\n .map(f => ({\n column: f.column,\n alias: this.appStore.getColumnAlias(f.column),\n items: this.aggregations()?.find(a => a.column === f.column)?.items\n })) || []\n );\n });\n\n text: string = '';\n\n constructor() {\n super();\n\n this.getAggregations();\n }\n\n getAggregations(): void {\n const query: any = buildQuery();\n query.action = 'aggregate';\n query.name = this.appStore.getDefaultQuery()?.name;\n this.queryService.search(query).subscribe(res => {\n this.aggregations.set(res.aggregations);\n });\n }\n\n onTabChange(tab: string): void {\n this.currentTab.set(tab);\n }\n\n onSearch(): void {\n // this params alters the query text\n const { content, title, location } = this.form.value;\n let fieldedText = [];\n if (content && content.value) {\n const { operator = 'any', value = '' } = content;\n const text = this.formatFilter(operator, value);\n fieldedText.push(text);\n }\n if (title && title.value) {\n const { operator = 'any', value = '' } = title;\n const text = this.formatFilter(operator, value, 'title');\n fieldedText.push(text);\n }\n if (location && location.value) {\n const { operator = 'any', value = '' } = location;\n const text = this.formatFilter(operator, value, 'location');\n fieldedText.push(text);\n }\n\n let text = this.text;\n\n // now we have to join the fieldedText with the text\n // if text is empty, we must remove the leading space\n // if text is not empty, we must add a AND before the fieldedText\n if (text && fieldedText.length) {\n text = text + ' AND ' + fieldedText.join(' AND ');\n } else {\n text = fieldedText.join(' AND ');\n }\n this.queryParamsStore.patch({ text });\n\n const filters: LegacyFilter[] = [];\n this.appliedFilters().forEach(filter => {\n if (filter.values.length) {\n // todo should handle dates? how?\n /* if (filter.column.startsWith('modified') || filter.column.startsWith('date')) {\n const valueFrom = this.customFilters.value[`${filter}From`]?.trim();\n const valueTo = this.customFilters.value[`${filter}To`]?.trim();\n if (valueFrom) {\n filters.push(...this.getFilter('like', valueFrom, filter.column));\n }\n if (valueTo) {\n filters.push(...this.getFilter('like', valueTo, filter.column));\n }\n } else { */\n filters.push(\n ...this.getFilter(\n 'in',\n filter.values.map(v => v.value),\n filter.column\n )\n );\n }\n });\n\n this.queryParamsStore.clearFilters();\n if (filters.length) {\n filters.forEach(filter => this.queryParamsStore.updateFilter(filter));\n }\n\n this.drawerStack.close();\n\n // ! we need to remove the page parameter from the query params when new search is performed\n const { name } = this.queryParamsStore.getQuery();\n this.router.navigate([`/${searchRoute}/${this.currentTab()}`], {\n queryParams: { q: text, p: undefined, t: this.currentTab(), n: name },\n queryParamsHandling: 'merge'\n });\n }\n\n /** Generate the LegacyFilter to add to the query */\n private getFilter(operator: FilterOperator, values: string[], field: string): LegacyFilter[] {\n if (field.startsWith('modified') || field.startsWith('date')) {\n // dates\n const op = field.endsWith('From') ? 'gte' : 'lte';\n const f = field.split(field.endsWith('From') ? 'From' : 'To')[0];\n return [{ operator: op, value: values[0], field: f }];\n } else {\n switch (operator) {\n case 'contains':\n case 'in':\n return [{ operator, values: values, field, display: values[0] }];\n case 'eq':\n case 'like':\n return [{ operator, value: values[0], field, display: values[0] }];\n default:\n return [];\n }\n }\n }\n\n /** Format content/title/location filters */\n private formatFilter(operator: Operator, value: string, field: 'title' | 'location' | '' = ''): string {\n const fieldStr = field ? `${field}::` : '';\n switch (operator) {\n case 'all':\n return `${fieldStr}[${value}]`;\n case 'exact':\n return `${fieldStr}\"${value}\"`;\n case 'matches':\n // value can be separated by AND or OR keywords, if it's the case each words must be written field:word1 AND field:word2 etc...\n const words = value.split(/\\s+(AND|OR)\\s+/);\n return words\n .map(w => {\n if (w === 'AND' || w === 'OR') return w;\n return `(${fieldStr}${w})`;\n })\n .join(' ');\n case 'any':\n const splitWords = value.split(' ');\n return `(${splitWords.map(w => `${fieldStr}[${w}]`).join(' OR ')})`;\n case 'none':\n return `${fieldStr}NOT [${value}]`;\n default:\n return value;\n }\n }\n\n getPlaceholder(key: string): string {\n return this.selectData.find(d => d.operator === this.form.get(key)!.value)?.placeholder || this.transloco.translate('drawers.searchWords');\n }\n\n /** Get applied filters for a column */\n getItems(column: string): DropdownItem[] {\n return this.appliedFilters().find(f => f.column === column)?.values || [];\n }\n\n /** add item to current selection */\n addItem(item: DropdownItem, filter: Filter): void {\n const appliedFilter = this.appliedFilters().find(af => af.column === filter.column)!;\n if (!appliedFilter.values.some(v => v.value === item.value)) {\n appliedFilter.values.push(item);\n }\n }\n\n /** remove item from current selection */\n removeItem(item: DropdownItem, filter: Filter): void {\n const appliedFilter = this.appliedFilters().find(af => af.column === filter.column)!;\n appliedFilter.values = appliedFilter.values.filter(v => v.value !== item.value);\n }\n\n /** Update suggestions on input focus */\n setFilterFocus(value: string | null, filter: Filter): void {\n this.currentFilter.set(filter.column);\n this.setSuggestions(value);\n }\n\n /** Update suggestions when typing */\n onInputTyping(value: string | null): void {\n this.setSuggestions(value);\n }\n\n private setSuggestions(value: string | null): void {\n this.suggestions.set([]);\n const filter = this.filters().find(f => f.column === this.currentFilter());\n if (!!value && !!filter && filter.items?.length) {\n this.suggestions.set(this.getSuggestionItems(value.toLowerCase(), filter.items!).map(i => ({ display: i.display, value: String(i.value) })));\n }\n }\n\n private getSuggestionItems(value: string, items: (AggregationItem | TreeAggregationNode)[]): (AggregationItem | TreeAggregationNode)[] {\n const res = items.filter(i => (!!i.display && i.display!.toLowerCase().indexOf(value) !== -1) || String(i.value)?.toLowerCase().indexOf(value) !== -1);\n // todo handle tree items\n return res;\n }\n}\n","<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex h-full flex-col overflow-auto bg-white\">\n <app-drawer-navbar class=\"block border-b border-neutral-300 bg-white\">\n <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n {{ 'drawers.search' | transloco }}\n </button>\n </app-drawer-navbar>\n\n <div class=\"flex h-full flex-grow flex-col overflow-auto\">\n <section class=\"flex flex-col gap-4 p-6\" [formGroup]=\"form\">\n <!-- FIND IN -->\n <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n <select\n id=\"content-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"content-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('content.operator')\"\n formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n <select\n id=\"title-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n </div>\n <div class=\"flex items-center gap-4\" formGroupName=\"location\">\n <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInLocation' | transloco }}</span>\n <select\n id=\"location-operator\"\n class=\"hover:outline-primary focus:outline-primary h-8 w-full rounded-md border border-gray-200 bg-neutral-50 px-2 hover:bg-white hover:outline focus:bg-white focus:outline\"\n formControlName=\"operator\">\n @for (data of selectData; track $index) {\n <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n }\n </select>\n <input\n id=\"location-value\"\n type=\"text\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [placeholder]=\"getPlaceholder('location.operator')\"\n formControlName=\"value\" />\n </div>\n\n <!-- TABS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }} "{{ currentTab() }}"</h1>\n <div class=\"inline-flex -space-x-px rtl:space-x-reverse\">\n @for (tab of tabs(); track $index) {\n <button\n [variant]=\"tab !== currentTab() ? 'outline' : 'default'\"\n class=\"rounded-none shadow-none first:rounded-s-md last:rounded-e-md\"\n (click)=\"onTabChange(tab)\">\n {{ tab }}\n </button>\n }\n </div>\n\n <!-- FILTERS -->\n <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n @for (filter of filters(); track $index) {\n <DropdownInput\n [suggestions]=\"suggestions()\"\n [selected]=\"getItems(filter.column)\"\n [label]=\"filter.alias\"\n [placeholder]=\"'drawers.startTyping' | transloco\"\n [noResultLabel]=\"'drawers.noResult' | transloco\"\n (onFocus)=\"setFilterFocus($event, filter)\"\n (onKeyUp)=\"onInputTyping($event)\"\n (removeItem)=\"removeItem($event, filter)\"\n (addItem)=\"addItem($event, filter)\" />\n } @empty {\n {{ 'drawers.noFilters' | transloco }}\n }\n </section>\n </div>\n</div>\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, DestroyRef, computed, effect, inject, input, signal, untracked } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { FormsModule } from '@angular/forms';\nimport { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { Article, CCWebService, fetchSimilarDocuments } from '@sinequa/atomic';\nimport { ButtonComponent, ListItemComponent } from '@sinequa/ui';\n\nimport { MetadataComponent, SourceComponent } from '../../../components';\nimport { SelectArticleOnClickDirective } from '../../../directives';\nimport { ArticleMetadata } from '../../../models';\nimport { PreviewService } from '../../../services';\nimport { AppStore, ApplicationStore, QueryParamsStore, SelectionStore } from '../../../stores';\n\ninterface MetadataNavigation {\n index: number;\n value: string;\n}\n\ntype PreviewWebService = CCWebService & {\n highlights?: string;\n};\n\n@Component({\n selector: 'advanced-search',\n standalone: true,\n providers: [provideTranslocoScope('drawers')],\n templateUrl: './advanced-search.component.html',\n styles: [\n `\n :host {\n /* disable default max-height for panel */\n --panel-max-height: none;\n }\n /* Hides cancel button from input that as type='search' */\n input[type='search']::-webkit-search-cancel-button {\n -webkit-appearance: none;\n }\n `\n ],\n imports: [NgTemplateOutlet, FormsModule, ButtonComponent, MetadataComponent, ListItemComponent, TranslocoPipe, SourceComponent, SelectArticleOnClickDirective]\n})\nexport class AdvancedSearchComponent {\n public readonly article = input.required<Article>();\n\n protected readonly destroyRef = inject(DestroyRef);\n protected readonly labels = inject(AppStore).getLabels();\n protected readonly applicationStore = inject(ApplicationStore);\n protected readonly appStore = inject(AppStore);\n protected readonly selectionStore = inject(SelectionStore);\n protected readonly previewService = inject(PreviewService);\n protected readonly queryParamsStore = inject(QueryParamsStore);\n\n protected readonly input = signal(getState(this.selectionStore).queryText || '');\n protected readonly extracts = computed(() => {\n getState(this.applicationStore);\n\n if (!this.article()) return [];\n\n return this.applicationStore.getExtracts(this.article()!.id);\n });\n readonly similarDocuments = signal<Article[]>([]);\n\n protected readonly previewHighlights = computed(() => {\n const highlights = (this.appStore.getWebServiceByType('preview') as PreviewWebService)?.highlights\n ?.split(',')\n .filter(h => h !== 'extractslocations' && h !== 'matchlocations' && h !== 'matchingpassages');\n\n return highlights?.map(highlight => ({\n name: highlight,\n entity: highlight,\n metadata: (this.article() as any)[highlight]\n }));\n });\n\n public navigation = signal<MetadataNavigation | undefined>(undefined);\n public hovering = signal<string | undefined>(undefined);\n public hoverIndex = computed(() => (this.navigation()?.value === this.hovering() ? this.navigation()!.index : 0));\n\n public readonly hasLabels = computed(() => {\n const article: any = this.article(); // required as any otherwise the lines below won't compile\n const publicLabels: string[] | undefined = article[this.labels.public];\n const privateLabels: string[] | undefined = article[this.labels.private];\n return (publicLabels && publicLabels.length > 0) || (privateLabels && privateLabels.length > 0);\n });\n\n loading = signal(true);\n\n constructor() {\n this.previewService.events.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(event => {\n switch (event) {\n case 'fetching':\n this.loading.set(true);\n break;\n default:\n this.loading.set(false);\n break;\n }\n });\n\n effect(() => {\n const id = this.article().id;\n\n untracked(() => {\n const queryName = this.queryParamsStore.getQuery().name;\n fetchSimilarDocuments(id, queryName).then(res => this.similarDocuments.set(res.data));\n });\n });\n }\n\n protected executeSearch(): void {\n this.selectionStore.update({ queryText: this.input() });\n }\n\n protected clearInput(): void {\n this.input.set('');\n }\n\n scrollTo(type: string | undefined, index: number, usePassageHighlighter: boolean = false) {\n // if previewData contains \"matchingpassages\" then we use the passage highlighter otherwise we use \"extractslocations\"\n const category = type || this.previewService.highlightCategory;\n this.previewService.events.emit('scrollTo');\n this.previewService.sendMessage({ action: 'select', id: `${category}_${index}`, usePassageHighlighter });\n }\n\n navigateNext(entity: string, data: ArticleMetadata) {\n const index = this.navigation()?.value === data.value ? (this.navigation()!.index < data.count! ? this.navigation()!.index + 1 : 1) : 1;\n\n this.navigation.set({\n value: data.value,\n index\n });\n\n const id = this.previewService.getEntityId(entity, data.value, index - 1);\n if (id !== undefined) {\n this.scrollTo(entity, id);\n }\n }\n\n navigatePrev(entity: string, data: ArticleMetadata) {\n const index = this.navigation()?.value === data.value ? (this.navigation()!.index <= 1 ? data.count! : this.navigation()!.index - 1) : data.count!;\n\n this.navigation.set({\n value: data.value,\n index\n });\n\n const id = this.previewService.getEntityId(entity, data.value, index - 1);\n if (id !== undefined) {\n this.scrollTo(entity, id);\n }\n }\n}\n","@if (article()) {\n <div class=\"scroll-stable flex h-screen flex-col overflow-y-auto pb-6 pl-6 pr-3\">\n <section class=\"mb-4 mt-6 flex w-full flex-col gap-6\">\n <header\n id=\"panel-control\"\n class=\"focus-within:outline-primary group flex rounded focus-within:outline hover:outline [&:not(:focus-within)]:hover:outline-neutral-300\">\n <div class=\"flex grow items-center gap-2 rounded-e-none rounded-s bg-neutral-50 pl-2 group-hover:bg-white\">\n <input\n id=\"advanced-search-input\"\n type=\"search\"\n class=\"grow bg-neutral-50 focus:outline-none group-hover:bg-white\"\n autocomplete=\"off\"\n spellcheck=\"false\"\n [attr.placeholder]=\"'drawers.inputPlaceholder' | transloco\"\n [attr.aria-label]=\"'drawers.inputPlaceholder' | transloco\"\n [ngModel]=\"input()\"\n (ngModelChange)=\"input.set($event)\"\n (keydown.enter)=\"executeSearch()\" />\n\n @if (input() !== '') {\n <button\n variant=\"icon\"\n size=\"icon\"\n [attr.title]=\"'clear' | transloco\"\n [attr.aria-label]=\"'clear' | transloco\"\n (click)=\"clearInput()\"\n (keydown.enter)=\"clearInput()\">\n <i class=\"fa-fw far fa-circle-xmark\"></i>\n </button>\n }\n </div>\n\n <button\n size=\"icon\"\n class=\"rounded-e rounded-s-none group-focus-within:rounded-br-none\"\n [disabled]=\"input() === '' || null\"\n [attr.title]=\"'search' | transloco\"\n [attr.aria-label]=\"'search' | transloco\"\n (click)=\"executeSearch()\">\n <i class=\"fa-fw far fa-magnifying-glass\"></i>\n </button>\n </header>\n </section>\n\n <!-- the same name is used everywhere to simulate an accordion -->\n <!-- extracts -->\n <details name=\"advanced-search-panels\" class=\"group border-b border-neutral-300\" open>\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-magnifying-glass\"></i>\n {{ 'extracts' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n @if (loading()) {\n <div class=\"flex h-32 items-center justify-center\">\n <i class=\"fa-fw far fa-spinner-third fa-spin text-primary\"></i>\n </div>\n } @else {\n <ul>\n @for (extract of extracts(); track $index) {\n <li class=\"hover:bg-highlight mr-2 rounded px-2 py-1\" [id]=\"extract.id\" [attr.data-id]=\"extract.textIndex\">\n <p class=\"cursor-pointer\" role=\"button\" [innerHTML]=\"extract.text\" (click)=\"scrollTo(undefined, extract.textIndex, true)\"></p>\n </li>\n\n <li class=\"mr-2 h-[1px] bg-neutral-200 px-2\"></li>\n } @empty {\n <li class=\"text-slate-300\">{{ 'drawers.noRelevantExtracts' | transloco }}</li>\n }\n </ul>\n }\n </details>\n\n <!-- labels -->\n @if (hasLabels()) {\n <details class=\"group border-b border-neutral-300\" name=\"advanced-search-panels\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-tags\"></i>\n {{ 'labels' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n <div>\n <ul class=\"mt-4 flex flex-col flex-wrap gap-2\">\n <li>\n <Metadata variant=\"outline\" [article]=\"article()!\" [metadata]=\"labels.public\" />\n </li>\n\n <li>\n <Metadata variant=\"outline\" [article]=\"article()!\" [metadata]=\"labels.private\" />\n </li>\n </ul>\n </div>\n </details>\n }\n\n <!-- entities -->\n <details name=\"advanced-search-panels\" class=\"group border-b border-neutral-300\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n <i class=\"fa-fw far fa-highlighter\"></i>\n {{ 'entities' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n @for (highlight of previewHighlights(); track $index) {\n @if (highlight.metadata) {\n <ng-container *ngTemplateOutlet=\"metadataPanel; context: highlight\" />\n }\n }\n </details>\n\n <!-- similar documents -->\n @if (similarDocuments().length > 0) {\n <details class=\"group border-b border-neutral-300\" name=\"advanced-search-panels\">\n <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between bg-white p-3\">\n <p class=\"flex items-baseline gap-2 font-semibold\">\n <i class=\"fa-fw far fa-tags\"></i>\n {{ 'drawers.similarDocuments' | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open:rotate-180\"></i>\n </summary>\n\n <div>\n <ul class=\"mb-2 mt-4 flex flex-col flex-wrap px-2\" role=\"list\">\n @for (document of similarDocuments(); track $index) {\n <li role=\"listitem\" selectArticleOnClick [article]=\"document\" strategy=\"stack\">\n <div class=\"text-primary flex size-[20px] items-center justify-center rounded-full bg-neutral-50\">\n <source [collection]=\"article().collection\" [connector]=\"article().connector\" class=\"text-xs\" />\n </div>\n\n <span>{{ document.displayTitle ?? document.title }}</span>\n </li>\n }\n </ul>\n </div>\n </details>\n }\n </div>\n}\n\n<!-- entities's template -->\n<ng-template #metadataPanel let-metadata=\"metadata\" let-name=\"name\" let-iconClass=\"iconClass\" let-entity=\"entity\">\n <details name=\"advanced-search-entities\" class=\"group/entities px-3 pb-3\">\n <summary class=\"sticky top-8 flex cursor-pointer select-none items-baseline justify-between bg-white\">\n <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n <i class=\"fa-fw {{ iconClass || 'far fa-list' }}\"></i>\n {{ name | transloco }}\n </p>\n\n <i class=\"fa-fw far fa-chevron-down group-open/entities:rotate-180\"></i>\n </summary>\n\n <ul role=\"list\">\n @for (data of metadata; track $index) {\n <li role=\"listitem\" class=\"flex justify-between py-1 pl-2\" (mouseenter)=\"hovering.set(data.value)\" (mouseleave)=\"hovering.set(undefined)\">\n <!-- shrink w-1/2 grow truncate ovoid the overlap when hovering the row -->\n <p class=\"w-1/2 shrink grow truncate\">{{ data.display }}</p>\n\n <p class=\"flex items-center gap-2\">\n @if (hovering() === data.value) {\n <i class=\"fa-light fa-chevron-left\" aria-label=\"previous entity\" role=\"button\" (click)=\"navigatePrev(entity, data)\"></i>\n\n <span>{{ hoverIndex() }} / {{ data.count }}</span>\n\n <i class=\"fa-light fa-chevron-right\" aria-label=\"next entity\" role=\"button\" (click)=\"navigateNext(entity, data)\"></i>\n } @else {\n {{ data.count }}\n }\n </p>\n </li>\n }\n </ul>\n </details>\n</ng-template>\n","import { AsyncPipe, NgClass, NgComponentOutlet } from '@angular/common';\nimport {\n Component,\n computed,\n DestroyRef,\n effect,\n Inject,\n inject,\n InjectionToken,\n Injector,\n input,\n runInInjectionContext,\n signal,\n Type,\n untracked\n} from '@angular/core';\nimport { getState } from '@ngrx/signals';\nimport { firstValueFrom } from 'rxjs';\n\nimport { Article, CCApp, error, globalConfig, notify, PreviewData } from '@sinequa/atomic';\nimport { PreviewService } from '../../../services';\nimport { AppStore, QueryParamsStore, SelectionStore } from '../../../stores';\nimport { signIn } from '../../../utils';\nimport { AdvancedSearchComponent } from '../advanced-search/advanced-search.component';\nimport { DrawerComponent } from '../drawer.component';\nimport { DrawerService } from '../drawer.service';\n\nexport type DocumentTypeMap = {\n documentType: string;\n articleComponent: Type<unknown>;\n previewComponent: Type<unknown>;\n};\n\nexport const COMPONENTS_FOR_DOCUMENT_TYPE = new InjectionToken<(documentType?: string) => DocumentTypeMap>('COMPONENTS_FOR_DOCUMENT_TYPE');\n\nconst GLOBAL_QUERY_NAME = new InjectionToken<string>('GLOBAL_QUERY_NAME', {\n factory() {\n const appStore = inject(AppStore);\n const { queries } = getState(appStore) as CCApp;\n\n if (!queries) return '';\n\n const array = Object.entries(queries).map(([key, value]) => ({ key, ...value }));\n\n return array[0].name;\n }\n});\n\n@Component({\n selector: 'app-drawer-preview',\n standalone: true,\n imports: [NgClass, NgComponentOutlet, AsyncPipe, AdvancedSearchComponent],\n providers: [DrawerService, PreviewService],\n templateUrl: './drawer-preview.component.html',\n styleUrl: './drawer-preview.component.css'\n})\nexport class DrawerPreviewComponent extends DrawerComponent {\n injector = inject(Injector);\n appStore = inject(AppStore);\n selectionStore = inject(SelectionStore);\n queryParamsStore = inject(QueryParamsStore);\n previewService = inject(PreviewService);\n\n getComponentsForDocumentType = inject(COMPONENTS_FOR_DOCUMENT_TYPE);\n\n queryText = computed(() => {\n const { queryText } = getState(this.selectionStore);\n const { text } = getState(this.queryParamsStore);\n return queryText ?? text;\n });\n\n public readonly articleId = input.required<string>();\n\n public readonly previewData = signal<PreviewData | undefined>(undefined);\n public readonly article = computed(() => this.previewData()?.record as Article);\n\n public readonly inputs = computed(() => ({ previewData: this.previewData() }));\n public readonly previewType = computed(() => {\n return this.getComponentsForDocumentType(this.article()?.docformat || '').previewComponent;\n });\n\n constructor(\n @Inject(GLOBAL_QUERY_NAME) private readonly globalQueryName: string,\n private destroyRef: DestroyRef\n ) {\n super();\n\n this.destroyRef.onDestroy(() => {\n this.previewService.close(this.articleId(), { name: this.globalQueryName });\n });\n\n effect(() => {\n const articleId = this.articleId();\n const text = this.queryText();\n\n untracked(async () => {\n const state = getState(this.selectionStore);\n try {\n const previewData = await firstValueFrom(\n this.previewService.preview(\n articleId,\n {\n name: this.globalQueryName,\n text\n },\n state.previewHighlights?.highlights\n )\n );\n this.previewData.set(previewData);\n } catch (err: any) {\n this.previewData.set(undefined);\n if (err.status === 401) {\n error('preview service 401: ', err);\n this.drawerStack.close();\n runInInjectionContext(this.injector, () =>\n signIn().then(() => {\n const { useCredentials } = globalConfig;\n if (!useCredentials) {\n notify.success('You have been signed in.');\n }\n })\n );\n } else {\n error('Error fetching preview data:', err);\n throw err;\n }\n }\n });\n });\n }\n}\n","<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex overflow-auto bg-white\">\n <div\n #drawerHandle\n class=\"fixed h-full w-[5px] select-none hover:cursor-ew-resize hover:bg-orange-300\"\n [ngClass]=\"{ hidden: (drawer.isExtended | async) === false }\"></div>\n\n @if (previewType()) {\n <ng-container *ngComponentOutlet=\"previewType()!; inputs: inputs()\" />\n }\n</div>\n\n@if (article()) {\n <div class=\"flex flex-col border-l border-gray-200 bg-white\">\n <div class=\"relative flex grow flex-col\">\n <advanced-search class=\"absolute h-full w-full overflow-y-auto\" [article]=\"article()!\" (close)=\"drawer.collapse()\" />\n </div>\n </div>\n}\n","/*\n * Public API Surface of atomic\n */\nexport * from './components';\nexport * from './directives';\nexport * from './guards';\nexport * from './interceptors';\nexport * from './models';\nexport * from './pipes';\nexport * from './resolvers';\nexport * from './resources';\nexport * from './services';\nexport * from './stores';\nexport * from './tokens';\nexport * from './utils';\n\n/* features */\nexport * from './features/recent-searches/recent-searches';\n\nexport * from './features/saved-searches/saved-searches';\nexport * from './features/saved-searches/saved-search.dialog';\n\nexport * from './features/bookmarks/bookmark-button';\nexport * from './features/bookmarks/bookmarks';\n\nexport * from './features/collections/collections';\nexport * from './features/collections/dialogs/add.dialog';\nexport * from './features/collections/dialogs/delete.dialog';\n\nexport * from './features/alerts/alerts';\nexport * from './features/alerts/dialogs/alert.dialog';\n\nexport * from './features/dialogs/override-user.dialog';\nexport * from './features/dialogs/reset-user-settings.dialog';\n\nexport * from './features/did-you-mean/did-you-mean';\nexport * from './features/sign-in/sign-in';\n\nexport * from './features/export/export.service';\nexport * from './features/export/dialogs/export.dialog';\n\nexport * from './features/labels/label.service';\nexport * from './features/labels/multiselect-labels';\nexport * from './features/labels/dialogs/edit.dialog';\n\nexport * from './features/feedback/feedback';\nexport * from './features/feedback/dialogs/feedback.dialog';\n\nexport * from './features/filters/filters-bar.component';\nexport * from './features/filters/aggregation/aggregation.component';\nexport * from './features/filters/aggregation/date/date.component';\nexport * from './features/filters/buttons/filter-button.component';\nexport * from './features/filters/more/more-button.component';\nexport * from './features/filters/more/more.component';\nexport * from './features/filters/filters.models';\n\nexport * from './features/drawer-stack/drawer-stack.component';\nexport * from './features/drawer-stack/drawer-stack.service';\n\nexport * from './features/drawer/drawer.service';\nexport * from './features/drawer/drawer.component';\nexport * from './features/drawer/advanced-filters/advanced-filters.component';\nexport * from './features/drawer/advanced-search/advanced-search.component';\nexport * from './features/drawer/navbar/drawer-navbar.component';\nexport * from './features/drawer/preview/drawer-preview.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["catchError"],"mappings":"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"}
|