{"version":3,"file":"sinequa-components-search.mjs","sources":["../../../projects/components/search/search.service.ts","../../../projects/components/search/first-page.service.ts","../../../projects/components/search/bootstrap/did-you-mean/did-you-mean.ts","../../../projects/components/search/bootstrap/did-you-mean/did-you-mean.html","../../../projects/components/search/bootstrap/page-size-selector/page-size-selector.ts","../../../projects/components/search/bootstrap/page-size-selector/page-size-selector.html","../../../projects/components/search/bootstrap/pager/pager.ts","../../../projects/components/search/bootstrap/pager/pager.html","../../../projects/components/search/bootstrap/sort-selector/sort-selector.ts","../../../projects/components/search/bootstrap/sort-selector/sort-selector.html","../../../projects/components/search/bootstrap/tabs/tabs.ts","../../../projects/components/search/bootstrap/tabs/tabs.html","../../../projects/components/search/bootstrap/loading-bar/loading-bar.ts","../../../projects/components/search/bootstrap/scroller/scroller.ts","../../../projects/components/search/bootstrap/load-more/load-more.ts","../../../projects/components/search/bootstrap/load-more/load-more.html","../../../projects/components/search/bootstrap/scope/scope.component.ts","../../../projects/components/search/bootstrap/search.module.ts","../../../projects/components/search/messages/en.ts","../../../projects/components/search/messages/fr.ts","../../../projects/components/search/messages/de.ts","../../../projects/components/search/sinequa-components-search.ts"],"sourcesContent":["import {Injectable, InjectionToken, Inject, Optional, OnDestroy, inject} from \"@angular/core\";\nimport {Router, NavigationEnd, Params, NavigationExtras} from \"@angular/router\";\nimport {Subject, BehaviorSubject, Observable, Subscription, of, throwError, map, switchMap, tap, catchError} from \"rxjs\";\nimport {QueryWebService, AuditWebService, CCQuery, QueryIntentData, Results, Record, Tab, DidYouMeanKind,\n    QueryIntentAction, QueryIntent, QueryAnalysis, IMulti, CCTab,\n    AuditEvents, AuditEventType, AuditEvent, QueryIntentWebService, QueryIntentMatch, Filter, TreeAggregationNode, TreeAggregation, ListAggregation, IQuery, Aggregation,\n    AuditEventTypeValues} from \"@sinequa/core/web-services\";\nimport {AppService, FormatService, ValueItem, Query} from \"@sinequa/core/app-utils\";\nimport {NotificationsService} from \"@sinequa/core/notification\";\nimport {LoginService} from \"@sinequa/core/login\";\nimport {IntlService} from \"@sinequa/core/intl\";\nimport {Utils} from \"@sinequa/core/base\";\n\nimport {UserPreferences} from \"@sinequa/components/user-settings\";\n\nexport interface SearchOptions {\n    /** Name of routes for which we want the search service to work (incl. storing the query in the URL) */\n    routes?: string[];\n    /** Name of routes for which we want the search service to work, but no actual search query to be performed. This can be used to perform custom actions on certain routes */\n    skipSearchRoutes?: string[];\n    /** Name of the home route, if any */\n    homeRoute?: string;\n    /** Deactivate the storing of the query in the URL (calling search() then directly triggers a search and causes no URL modification or routing event) */\n    deactivateRouting?: boolean;\n    /** Force the global query to always be appService.ccquery */\n    preventQueryNameChanges?: boolean;\n    /** Whether to detect query intents synchronously (blocking the execution of the query until we know the intent). By default, query intents are detected asynchronously. */\n    queryIntentsSync?: boolean;\n    /** A function that test whether 2 records should be considered duplicates */\n    testDuplicates?: (a: Record, b: Record) => boolean;\n    /** A function called when results are received from the server; can be used to post-process results before they are displayed */\n    initializeResults?: (query: Query, results: Results) => void;\n    /** A function called when a record is received from the server; can be used to post-process a record before it is displayed */\n    initializeRecord?: (query: Query, record: Record) => void;\n    /** A function called when an aggregation is received from the server; can be used to post-process an aggregation before it is displayed */\n    initializeAggregation?: (query: Query, aggregation: Aggregation) => void;\n}\n\nexport const SEARCH_OPTIONS = new InjectionToken<SearchOptions>(\"SEARCH_OPTIONS\");\n\n@Injectable({\n    providedIn: \"root\"\n})\nexport class SearchService<T extends Results = Results> implements OnDestroy {\n    protected _query: Query | undefined;\n    queryStringParams: Params = {};\n    results: T | undefined;\n    searchActive: boolean;\n\n    protected loginSubscription: Subscription;\n    protected routerSubscription: Subscription;\n    protected appSubscription: Subscription;\n    protected fetchingLoadMore = false;\n    protected _events = new Subject<SearchService.Events<T>>();\n    protected _queryStream = new BehaviorSubject<Query | undefined>(undefined);\n    protected _resultsStream = new BehaviorSubject<T | undefined>(undefined);\n\n    protected userPreferences = inject(UserPreferences);\n\n    constructor(\n        @Optional() @Inject(SEARCH_OPTIONS) protected options: SearchOptions,\n        protected router: Router,\n        protected appService: AppService,\n        protected queryService: QueryWebService<T>,\n        protected loginService: LoginService,\n        protected intlService: IntlService,\n        protected formatService: FormatService,\n        protected auditService: AuditWebService,\n        protected notificationsService: NotificationsService,\n        protected queryIntentWebService: QueryIntentWebService) {\n\n        if (!this.options) {\n            this.options = {\n                routes: [\"search\"]\n            };\n        }\n\n        this.results = undefined;\n\n        this.loginSubscription = this.loginService.events.subscribe(\n            (value) => {\n                if (value.type === \"session-changed\") {\n                    this.handleLogin();\n                }\n            });\n        this.routerSubscription = this.router.events.subscribe(\n            (event) => {\n                if (event instanceof NavigationEnd) {\n                    this.handleNavigation();\n                }\n            });\n        this.appSubscription = this.appService.events.subscribe(\n            (event) => {\n                if (event.type === \"query-changed\") {\n                    if (this._query && (!this.appService.ccquery || (this._query.name !== this.appService.ccquery.name))) {\n                        this.clearQuery();\n                    }\n                }\n            });\n    }\n\n    ngOnDestroy() {\n        this.loginSubscription?.unsubscribe();\n        this.routerSubscription?.unsubscribe();\n        this.appSubscription?.unsubscribe();\n        this._events.complete();\n        this._queryStream.complete();\n        this._resultsStream.complete();\n    }\n\n    get events(): Observable<SearchService.Events<T>> {\n        return this._events;\n    }\n\n    get queryStream(): Observable<Query | undefined> {\n        return this._queryStream;\n    }\n\n    get resultsStream(): Observable<T | undefined> {\n        return this._resultsStream.asObservable();\n    }\n\n    getTabConfig(name: string): CCTab | undefined {\n        if (this.appService.ccquery && this.appService.ccquery.tabSearch && this.appService.ccquery.tabSearch.tabs) {\n            return this.appService.ccquery.tabSearch.tabs.find(t => Utils.eqNC(t.name, name));\n        }\n        return undefined;\n    }\n\n    get query(): Query {\n        if (!this._query) {\n            this._query = this.makeQuery();\n            this._events.next({type: \"new-query\", query: this._query});\n        }\n        return this._query;\n    }\n\n    public setQuery(query: Query | undefined, newQuery = true) {\n        if (query === this._query) {\n            return;\n        }\n        this._query = query;\n        if (this._query) {\n            let ccquery: CCQuery | undefined;\n            if (this.options.preventQueryNameChanges) {\n                ccquery = this.appService.ccquery || this.appService.defaultCCQuery;\n            }\n            else {\n                ccquery = this.appService.getCCQuery(this._query.name);\n                if (!ccquery) {\n                    console.warn(`Query '${this._query.name}' not found`);\n                    ccquery = this.appService.defaultCCQuery;\n                }\n            }\n            if (ccquery) {\n                this._query.name = ccquery.name;\n                if (this.appService.ccquery !== ccquery) {\n                    this.appService.ccquery = ccquery;\n                }\n            }\n        }\n        if (newQuery) {\n            this._events.next({type: \"new-query\", query: this._query});\n        }\n    }\n\n    public clearQuery() {\n        this.setQuery(undefined);\n    }\n\n    private _setResults(results: T | undefined) {\n        if (results === this.results) {\n            return;\n        }\n        this._events.next({type: \"before-new-results\", results});\n        this.results = results;\n        this.treatQueryIntents(results);\n        if (this.results) {\n            if (this.results.tab) {\n                this.query.tab = this.results.tab;\n            }\n            if (this.results.attributes && this.results.attributes.queryid) {\n                this.query.queryId = this.results.attributes.queryid;\n            }\n        }\n        this._events.next({type: \"new-results\", results: this.results});\n        this._resultsStream.next(results);\n    }\n\n    public setResults(results: T) {\n        return this._setResults(results);\n    }\n\n    // TODO: queryintents in their own service ?\n\n    private treatQueryIntents (results: T | undefined) {\n        if (results && results.queryAnalysis && results.queryIntents) {\n            const queryIntents = results.queryIntents;\n            for (const intent of queryIntents) {\n                if (intent.actions) {\n                    for (const action of intent.actions) {\n                        const event: SearchService.ProcessQueryIntentActionEvent = {type: \"process-query-intent-action\", action: action, intent: intent, analysis: results.queryAnalysis};\n                        this._events.next(event);\n                        if (!event.actionProcessed) {\n                            if (action.data) {\n                                switch (action.type) {\n                                    case \"tab\":\n                                        if (results.queryAnalysis.initial && this.query &&\n                                            !Utils.eqNC(this.query.tab || \"\", action.data)) {\n                                            this.selectTab(action.data, {skipLocationChange: true});\n                                        }\n                                        break;\n                                }\n                            }\n                        }\n                    }\n                }\n            }\n        }\n    }\n\n    get haveRecords(): boolean {\n        return !!this.results && !!this.results.records && this.results.records.length > 0;\n    }\n\n    get rowCount(): number {\n        return (!!this.results && this.results.rowCount) ? this.results.rowCount : 0;\n    }\n\n    get totalRowCount(): number {\n        return (!!this.results && this.results.totalRowCount) ? this.results.totalRowCount : 0;\n    }\n\n    get pageSize(): number {\n        if (this.query && this.query.pageSize) {\n            return this.query.pageSize;\n        }\n        if (this.appService.ccquery && this.appService.ccquery.pageSize) {\n            return this.appService.ccquery.pageSize;\n        }\n        return SearchService.DefaultPageSize;\n    }\n\n    get page(): number {\n        if (!this.results) {\n            return 1;\n        }\n        return this.results.page;\n    }\n\n    get pageCount(): number {\n        if (!this.results || !this.results.rowCount) {\n            return 0;\n        }\n        return Math.ceil(this.results.rowCount / this.results.pageSize);\n    }\n\n    makeQuery(recentQuery?: Partial<IQuery> | Query) {\n        const ccquery = this.appService.ccquery;\n        const query = new Query(ccquery ? ccquery.name : \"_unknown\");\n        if(recentQuery){\n            Object.assign(query, recentQuery);\n        }\n        this._events.next({type: \"make-query\", query: query});\n        return query;\n    }\n\n    protected makeAuditEvent(event: AuditEvent): AuditEvent {\n        this._events.next({type: \"make-audit-event\", event: event});\n        return event;\n    }\n\n    clear(navigate = true, path?: string) {\n        this.clearQuery();\n        path = path || this.options.homeRoute;\n        this._setResults(undefined);\n        this._events.next({type: \"clear\", path});\n        if (navigate) {\n            this.navigate({path: path || this.options.homeRoute});\n        }\n    }\n\n    home(path = this.options.homeRoute) {\n        this.clear(true, path);\n    }\n\n    protected makeQueryIntentData(queryIntentData: QueryIntentData): QueryIntentData {\n        this._events.next({type: \"make-query-intent-data\", intentData: queryIntentData});\n        return queryIntentData;\n    }\n\n    isEmptySearchIgnoreSelects(query: Query | undefined): boolean {\n        if (!query) {\n            return true;\n        }\n        if (!query.action || query.action === \"search\") {\n            // Test isFirstPage\n            if (query.isFirstPage) {\n                return false;\n            }\n            // Test empty text\n            if (query.text && Utils.trim(query.text)) {\n                return false;\n            }\n            // Test basket\n            if (query.basket) {\n                return false;\n            }\n            return true;\n        }\n        return false;\n    }\n\n    isEmptySearch(query: Query | undefined): boolean {\n        if (!query) {\n            return true;\n        }\n        if (!query.action || query.action === \"search\") {\n            if (!this.isEmptySearchIgnoreSelects(query)) {\n                return false;\n            }\n            // Test no facet selection\n            if (query.select && query.select.length > 0) {\n                return false;\n            }\n            if (query.filters) {\n                return false;\n            }\n            return true;\n        }\n        return false;\n    }\n\n    checkEmptySearch(queries: Query | Query[]): boolean {\n        if (this.appService.ccquery && !this.appService.ccquery.allowEmptySearch) {\n            for (const query of Utils.asArray(queries)) {\n                if (this.isEmptySearch(query)) {\n                    this.notificationsService.info(\"msg#search.emptySearchNotification\");\n                    return false;\n                }\n            }\n        }\n        return true;\n    }\n\n    getResults(\n        query: Query, auditEvents?: AuditEvents,\n        options: SearchService.GetResultsOptions = {}): Observable<T> {\n        if (!this.checkEmptySearch(query)) {\n            return throwError(() => new Error(\"empty search\"));\n        }\n        if (!options.searchInactive) {\n            this.searchActive = true;\n        }\n        const tab = this.getCurrentTab();\n\n        // check if neural-search is disabled in the user preferences\n        if (this.userPreferences.get(\"neural-search\") === false) {\n            query.neuralSearch = false;\n        }\n\n        return this.queryService.getResults(query, auditEvents,\n            this.makeQueryIntentData({\n                tab: tab ? tab.name : undefined,\n                queryIntentsV2: options.queryIntentsV2,\n                queryIntents: (query.spellingCorrectionMode !== \"dymonly\") ? options.queryIntents : undefined,\n                queryAnalysis: (query.spellingCorrectionMode !== \"dymonly\") ? options.queryAnalysis : undefined\n            })\n        ).pipe(\n            tap((results) => {\n                this.initializeResults(query, results);\n                this.searchActive = false;\n            }),\n            catchError((error) => {\n                // when an exception occurs, set the search active flag to false\n                // this will stop the loading bar\n                this.searchActive = false;\n                this.notificationsService.error(\"msg#error.queryError\");\n                return throwError(error);\n            })\n        );\n    }\n\n    getMultipleResults(queries: Query[], auditEvents?: AuditEvents): Observable<IMulti<T>> {\n        if (!this.checkEmptySearch(queries)) {\n            return of({results: []});\n        }\n        return this.queryService.getMultipleResults(queries, auditEvents)\n          .pipe(\n            tap(results => results.results.forEach(\n              (r,i) => this.initializeResults(queries[i], r))\n            )\n          );\n    }\n\n    /**\n     * Initializes the client-side fields of the Results object\n     * @param results\n     */\n    initializeResults(query: Query, results: Results) {\n      // Initialize records\n      this.initializeRecords(query, results);\n\n      // Initialize aggregations\n      this.initializeAggregations(query, results);\n\n      // Custom initialization\n      this.options.initializeResults?.(query, results);\n    }\n\n    initializeRecords(query: Query, results: Results) {\n      if(results.records) {\n        let duplicate: Record|undefined;\n        for(let i=0; i<results.records.length; i++) {\n          const record = results.records[i];\n          record.$hasPassages = !!record.matchingpassages?.passages?.length;\n          if(this.options.testDuplicates) {\n            duplicate ||= results.records[i-1];\n            record.$isDuplicate = i>0 && this.options.testDuplicates(record, duplicate);\n            record.$duplicateCount = 0;\n            if(record.$isDuplicate) {\n              duplicate.$duplicateCount!++;\n            }\n            else {\n              duplicate = undefined;\n            }\n          }\n          this.options.initializeRecord?.(query, record);\n        }\n      }\n    }\n\n    initializeAggregations(query: Query, results: Results) {\n      // Get the query web service configuration\n      const ccquery = this.appService.getCCQuery(query.name);\n\n      // Initialize aggregation map\n      results.$aggregationMap = {};\n\n      const filtered = query.getFiltersAsAggregationItems();\n\n      for(const aggregation of results.aggregations) {\n        // Populate aggregation map\n        results.$aggregationMap[aggregation.name.toLowerCase()] = aggregation as ListAggregation | TreeAggregation;\n\n        // Columns and aggregation configuration\n        aggregation.$cccolumn = this.appService.getColumn(aggregation.column, ccquery);\n        aggregation.column = this.appService.getColumnAlias(aggregation.$cccolumn, aggregation.column);\n        aggregation.$ccaggregation = this.appService.getCCAggregation(aggregation.name, ccquery)!;\n        aggregation.$cccount = aggregation.$ccaggregation?.count || 10;\n\n        aggregation.$filtered = filtered[aggregation.column.toLowerCase()] || [];\n        aggregation.$remainingFiltered = aggregation.$filtered;\n\n        // List aggregations\n        if(!aggregation.isTree) {\n          this.initializeAggregation(aggregation as ListAggregation);\n        }\n        // Tree aggregations\n        else {\n          this.initializeTreeAggregation(aggregation as TreeAggregation);\n        }\n\n        // Custom initialization\n        this.options.initializeAggregation?.(query, aggregation as Aggregation);\n      }\n    }\n\n    initializeAggregation(aggregation: ListAggregation) {\n      // Aggregation items enrichment\n      if(aggregation.items && aggregation.$cccount > 0) { // exclude unlimited aggregation (eg. timelines)\n\n        for(const item of aggregation.items) {\n          // Include the column configuration (for formatting & labels)\n          item.$column = aggregation.$cccolumn;\n          // convert null value without display property to string\n          if (item.value === null && !aggregation.valuesAreExpressions && !item.display) {\n            item.value = String(item.value);\n          }\n          // Check whether the item is currently filtered\n          item.$filtered = aggregation.$remainingFiltered.some(i => i.value === item.value); // TODO: this properly needs refinement for Dates or other special types\n          if(item.$filtered) {\n            aggregation.$remainingFiltered = aggregation.$remainingFiltered.filter(i => i.value !== item.value); // Rather than a splice, we filter the array, in case there are duplicate filters\n          }\n        }\n\n        // Adjust aggregation's items length only if an aggregation configuration is available in the query web service\n        // Otherwise, do not truncate the list of items (example in case of dataset web service)\n        if(aggregation.$ccaggregation && aggregation.items.length > aggregation.$cccount && !aggregation.isDistribution) {\n          aggregation.items = aggregation.items?.slice(0, aggregation.$cccount);\n          aggregation.$hasMore = true;\n        }\n      }\n    }\n\n    initializeTreeAggregation(aggregation: TreeAggregation) {\n      // Process the filtered items\n      for(const item of aggregation.$filtered) {\n        item.$path = item.value.slice(0, -1); // Remove the '*' at the end of the value\n      }\n\n      if(aggregation.items) {\n        // Traverse the aggregation items to add metadata\n        Utils.traverse(aggregation.items, (lineage, node, depth) => {\n          node.$path = '/' + lineage.map(n => n.value).join('/') + '/';\n          node.$column = aggregation.$cccolumn;\n          node.$level = depth;\n          node.$opened = false;\n          // Check whether the item is currently filtered\n          const idx = aggregation.$remainingFiltered.findIndex(\n            i => (i as TreeAggregationNode).$path === node.$path // TODO: this properly needs refinement for Dates or other special types\n          );\n          if(idx !== -1) {\n            node.$filtered = true;\n            aggregation.$remainingFiltered = aggregation.$remainingFiltered.filter(i => i.value !== node.value); // Rather than a splice, we filter the array, in case there are duplicate filters\n            lineage.filter(n => n.items?.length).forEach(n => n.$opened = true);\n          }\n          return false; // don't stop the traversal\n        });\n      }\n    }\n\n    navigate(options?: SearchService.NavigationOptions, audit?: AuditEvents): Promise<boolean> {\n        if (!options) {\n            options = {};\n        }\n        // We reuse the query intent analysis from previous results\n        if (!options.analyzeQueryText && this.results) {\n            options.queryIntents = this.results.queryIntents;\n            options.queryAnalysis = this.results.queryAnalysis;\n        }\n        if (!this.routingActive) {\n            this.handleNavigation(options, audit);\n            return Promise.resolve(true);\n        }\n        else {\n            // Save currentPath and currentSearch\n            let url = Utils.makeURL(this.router.url);\n            const currentPath = url.pathname;\n            url.searchParams.delete(\"$refresh\");\n            const currentSearch = decodeURIComponent(url.search);\n            // Set up queryParams and add current query\n            const queryParams = Utils.copy(this.queryStringParams);\n            if (this._query) {\n                queryParams.query = this._query.toJsonForQueryString();\n            }\n            // Set up history state\n            const state: SearchService.HistoryState = {\n                audit,\n                navigationOptions: options\n            };\n            const extras: NavigationExtras = {\n                queryParams,\n                state,\n                skipLocationChange: options.skipLocationChange\n            };\n            // Calculate new search\n            let path = options.path;\n            if (!path) {\n                path = currentPath;\n            }\n            url = Utils.makeURL(path);\n            path = url.pathname; // normalized\n            for (const key of Object.keys(queryParams)) {\n                url.searchParams.set(key, queryParams[key]);\n            }\n            const search = decodeURIComponent(url.search);\n            // If path and search are both the same as current then force navigation (without adding to history)\n            if (Utils.eq(currentPath, path) && Utils.eq(currentSearch, search)) {\n                // We want to force the navigation so that the query will be processed\n                extras.queryParams!.$refresh = Utils.now.getTime();\n                // But don't update the browser url\n                extras.skipLocationChange = true;\n            }\n            return this.router.navigate([path], extras);\n        }\n    }\n\n    protected getHistoryState(): SearchService.HistoryState {\n        const navigation = this.router.getCurrentNavigation();\n        if (navigation) {\n            return navigation.extras && navigation.extras.state || {};\n        }\n        return window.history.state || {};\n    }\n\n    public isSearchRouteActive(): boolean {\n        const url = Utils.makeURL(this.router.url);\n        return this.isSearchRoute(url.pathname);\n    }\n\n    protected isSearchRoute(pathname: string): boolean {\n        return this.checkSearchRoute(pathname, this.options.routes);\n    }\n\n    protected isSkipSearchRoute(pathname: string): boolean {\n        return this.checkSearchRoute(pathname, this.options.skipSearchRoutes);\n    }\n\n    private checkSearchRoute(pathname: string, routes: string[] | undefined): boolean {\n        if (routes) {\n            for (const route of routes) {\n                if (Utils.endsWith(pathname, Utils.addUrl(\"/\", route))) {\n                    return true;\n                }\n            }\n        }\n        return false;\n    }\n\n    public getQueryFromUrl(): Query | undefined {\n        let query: Query | undefined;\n        const url = Utils.makeURL(this.router.url);\n        if (this.isSearchRoute(url.pathname)) {\n            const jquery = url.searchParams.get(\"query\");\n            if (jquery) {\n                try {\n                    query = this.makeQuery().fromJson(jquery);\n                }\n                catch {}\n            }\n        }\n        return query;\n    }\n\n    protected ensureQueryFromUrl(): Query | undefined {\n        const query = this.getQueryFromUrl();\n        if (!query) {\n            this.clear(false);\n            return undefined;\n        }\n        else {\n            // The url query should be the same as the current query on SearchService unless\n            // it's the initial navigation or if the url is changed manually.\n            // In any case, we always set the query from the url. We only send a new-query\n            // event if the current query is empty so that we don't systematically create a\n            // new query \"session\" (ml-audit)\n            this.setQuery(query, !this._query);\n            return query;\n        }\n    }\n\n    protected handleLogin() {\n        if (this.loginService.complete && this.ensureQueryFromUrl()) {\n            this.handleNavigation();\n        }\n    }\n\n    get routingActive(): boolean {\n        return !this.options.deactivateRouting;\n    }\n\n    set routingActive(value: boolean) {\n        this.options.deactivateRouting = !value;\n    }\n\n    protected handleNavigation(navigationOptions?: SearchService.NavigationOptions, audit?: AuditEvents) {\n        if (!this.loginService.complete) {\n            return\n        }\n        if (!this.appService.ccquery) {\n            return\n        }\n        let query = this._query;\n        if (this.routingActive) {\n            query = this.ensureQueryFromUrl();\n        }\n        this._events.next({type: \"update-query\", query});\n        this._queryStream.next(query);\n        if (!query) {\n            return\n        }\n        if (this.routingActive) {\n            const state = this.getHistoryState();\n            // console.log(\"history.state:\", state);\n            audit = state.audit;\n            navigationOptions = state.navigationOptions;\n        }\n        navigationOptions = navigationOptions || {};\n        const pathName = navigationOptions.path ? navigationOptions.path : Utils.makeURL(this.router.url).pathname;\n        if(navigationOptions.skipSearch || this.isSkipSearchRoute(pathName)) {\n            return\n        }\n\n        let obs = of({cancelSearch: false}) as Observable<SearchService.NewQueryIntentsEvent>;\n\n        // Insert a call to the query intent web service (if any)\n        if(this.appService.ccquery?.queryIntentSet) {\n            // In synchronous mode, the query intents are executed before search\n            if(this.options.queryIntentsSync) {\n                obs = this.pipeQueryIntent(of(false));\n            }\n            // In asynchronous mode, the query intents are executed in parallel\n            else {\n                this.pipeQueryIntent(of(false)).subscribe();\n            }\n        }\n\n        // Get results (except if the search query is cancelled)\n        let observable = obs.pipe(\n            switchMap((event: SearchService.NewQueryIntentsEvent) => {\n                if(event.cancelSearch) return of(undefined);\n                return this.getResults(this.query, audit, {\n                    queryIntents: navigationOptions?.queryIntents,\n                    queryIntentsV2: event.intents,\n                    queryAnalysis: navigationOptions?.queryAnalysis\n                });\n            })\n        );\n\n        // This event allows customization of behavior when switching tabs (the observable property can be modified to get other results)\n        if (navigationOptions.selectTab) {\n            const afterSelectTabEvent: SearchService.AfterSelectTabEvent<T> = {\n                type: \"after-select-tab\",\n                observable\n            };\n            this._events.next(afterSelectTabEvent);\n            observable = afterSelectTabEvent.observable;\n        }\n\n        // Set results if any\n        observable.subscribe(results => {\n            if(results) {\n                navigationOptions = navigationOptions || {};\n                this._setResults(results);\n            }\n        });\n    }\n\n    pipeQueryIntent(obs: Observable<boolean>): Observable<SearchService.NewQueryIntentsEvent> {\n        return obs.pipe(\n            switchMap(() => this.queryIntentWebService.getQueryIntent(this.query)),\n            map(intents => {\n                const event: SearchService.NewQueryIntentsEvent = {\n                    type: \"new-query-intents\",\n                    query: this.query,\n                    intents,\n                    cancelSearch: false\n                };\n                this._events.next(event);\n                if(intents.length > 0) {\n                    const events = intents.map(intent => ({\n                        type: AuditEventType.Search_QueryIntent_Detected,\n                        detail: {\n                            querytext: this.query.text,\n                            item: intent.name,\n                            detail: intent.globalEntities?.map(e => e.value).join(\";\")\n                        }\n                    }));\n                    this.auditService.notify(events);\n                }\n                return event;\n            })\n        );\n    }\n\n    search(navigationOptions?: SearchService.NavigationOptions, audit?: AuditEvents): Promise<boolean> {\n        delete this.query.page;\n        delete this.query.spellingCorrectionMode;\n        if(this.query.filters === undefined) {\n            delete this.query.queryId;\n        }\n        return this.navigate(navigationOptions, audit);\n    }\n\n    searchText(path?: string): Promise<boolean> {\n        // Check for empty search preemptively to avoid clearing the current results in the most\n        // common case of the user entering empty search text in the search box\n        // The lower level check in getResults will handle less obvious cases (url editing etc)\n        if (!this.checkEmptySearch(this.query)) {\n            return Promise.resolve(false);\n        }\n        return this.search(\n            {\n                path,\n                analyzeQueryText: true\n            },\n            this.makeAuditEvent({\n                type: AuditEventType.Search_Text,\n                detail: {\n                    querytext: this.query.text,\n                    scope: this.query.scope,\n                    language: this.intlService.currentLocale.name,\n                    neuralsearch: this.appService.isNeural() && this.query.neuralSearch !== false\n                }\n            }));\n    }\n\n    gotoPage(page: number): Promise<boolean> {\n        this.query.page = page;\n        return this.navigate(undefined, this.makeAuditEvent({\n            type: AuditEventType.Search_GotoPage,\n            detail: {\n                page: page,\n                fromresultid: this.results ? this.results.id : null\n            }\n        }));\n    }\n\n    /**\n     * Load more results and append them to previous results\n     */\n    loadMore() {\n        if(!this.fetchingLoadMore) {\n            let page = this.query.page || this.page;\n            page += (page <= this.pageCount) ? 1 : 0;\n            if (page <= this.pageCount) {\n                this.fetchingLoadMore = true;\n                this.query.page = page;\n\n                const auditEvents = this.makeAuditEvent({\n                    type: AuditEventType.Search_GotoPage,\n                    detail: {\n                        page: page,\n                        fromresultid: this.results ? this.results.id : null\n                    }\n                })\n\n                this.getResults(this.query, auditEvents)\n                    .subscribe(results => {\n                        if(this.results && results) {\n                            this.results.records = [...(this.results?.records ?? []), ...results.records];\n                            this._resultsStream.next(this.results);\n                        }\n                        this.fetchingLoadMore = false;\n                    });\n            }\n        }\n    }\n\n    /**\n     * @returns true if more are available otherwise false\n     */\n    hasMore(): boolean {\n        const page = this.query.page || this.page;\n        return (page < this.pageCount);\n    }\n\n    didYouMean(text: string, kind: DidYouMeanKind): Promise<boolean> {\n        this.query.text = text;\n        this.query.spellingCorrectionMode = \"dymonly\";\n        return this.navigate(undefined, this.makeAuditEvent({\n            type: kind === DidYouMeanKind.Original ? AuditEventType.Search_DidYouMean_Original : AuditEventType.Search_DidYouMean_Correction,\n            detail: {\n                querytext: text\n            }\n        }));\n    }\n\n    getCurrentRecordIds(): string[]{\n        if (this.results && this.results.records) {\n            return this.results.records.map(record => record.id);\n        }\n        return [];\n    }\n\n    getRecordFromId(id: string): Record | undefined {\n        if (this.results && this.results.records) {\n            return this.results.records.find(record => Utils.eq(record.id, id));\n        }\n        return undefined;\n    }\n\n    addFieldSelect(field: string, items: ValueItem | ValueItem[], options?: SearchService.AddSelectOptions): boolean {\n        if(Array.isArray(items) && items.length === 1) {\n            items = items[0];\n        }\n        if (items && (!Array.isArray(items) || items.length > 0)) {\n            let filter: Filter;\n            if(!Array.isArray(items)) {\n              filter = {field, value: items.value as string|number|boolean, display: items.display};\n              if(options?.not) filter.operator = 'neq';\n            }\n            else {\n              const operator = options?.not? 'not' : options?.and? 'and' : 'or';\n              filter = {operator, filters: items.map(item => ({field, value: item.value as string|number|boolean, display: item.display}))}\n            }\n            this.query.addFilter(filter);\n            return true;\n        }\n        return false;\n    }\n\n    selectTab(arg: string | Tab, options: SearchService.NavigationOptions = {}): Promise<boolean> {\n        options.selectTab = true;\n        const tabName = typeof arg === 'string' ? arg : arg.name;\n        this.query.tab = tabName;\n        delete this.query.queryId; // SBA-154\n        this._events.next({type: \"before-select-tab\", query: this.query});\n        return this.search(options,\n            this.makeAuditEvent({\n                type: AuditEventType.Search_GotoTab,\n                detail: {\n                    tab: tabName,\n                    fromresultid: this.results ? this.results.id : null\n                }\n            }));\n    }\n\n    selectScope(scope: string) {\n        this.query.scope = scope;\n    }\n\n    getTab(tabName: string): Tab | undefined {\n        if (this.results && this.results.tabs) {\n            for (const tab of this.results.tabs) {\n                if (Utils.equals(tab.name, tabName)) {\n                    return tab;\n                }\n            }\n        }\n        return undefined;\n    }\n\n    getCurrentTab(): Tab | undefined {\n        if (this.results && this.results.tab) {\n            return this.getTab(this.results.tab);\n        }\n        return undefined;\n    }\n\n    notifyOpenOriginalDocument(record: Record, resultId?: string, type: AuditEventType | AuditEventTypeValues = AuditEventType.Click_ResultLink): void {\n        const results = this.results && this.results.records && this.results.records.includes(record) ? this.results : undefined;\n        this._events.next({ type: \"open-original-document\", record });\n        const querylang = this.results?.queryAnalysis?.queryLanguage\n            || this.query?.questionLanguage\n            || this.appService?.ccquery?.questionLanguage;\n        let score: number | undefined;\n        if (type === AuditEventType.Click_ResultLink) {\n            const passages = record?.matchingpassages?.passages;\n            score = passages && passages.length ? passages[0].score : undefined;\n        }\n        this.auditService.notifyDocument(\n            type,\n            record,\n            results || resultId || \"\",\n            {\n                querytext: this.query.text,\n                querylang,\n                score\n            },\n            {\n                queryhash: results ? results.rfmQueryHash : undefined,\n                querytext: this.query.text,\n                querylang: querylang\n            }\n        );\n    }\n\n    checkBeforeSearch(cancelReasons?: string[]): boolean {\n        const beforeSearch: SearchService.BeforeSearchEvent = {type: \"before-search\"};\n        this._events.next(beforeSearch);\n        if (cancelReasons && beforeSearch.cancelReasons) {\n            cancelReasons.splice(0, 0, ...beforeSearch.cancelReasons);\n        }\n        return !beforeSearch.cancel;\n    }\n\n    /**\n     * Get the records according to a list of ID\n     *\n     * They are first searched on the result records, and we make a query for those we cannot find\n     */\n    getRecords(ids: string[]): Observable<(Record | undefined)[]> {\n        const records = ids.map(id => ({\n                id,\n                record: this.results?.records.find(r => Utils.eq(r.id, id))\n            }));\n\n        // if all records found, return them\n        if (records.every(r => r.record))\n            return of(records.map(r => r.record as Record));\n\n        // building query to get missing records\n        const query = this.query.copy();\n        delete query.page;\n        query.groupBy = 'id'; // Override the default group by if any\n        const recordIds = [...new Set(records.filter(r => !r.record).map(r => r.id))]; // Unique ids\n        query.pageSize = recordIds.length;\n        query.globalRelevance = 0; // Override the default globalRelevance >= 40\n        query.addFilter({\n            field: 'id',\n            operator: 'in',\n            values: recordIds\n        });\n\n        return this.getResults(query, undefined, {searchInactive: true})\n            .pipe(map(res => records.map(r => r.record || res.records.find(rec => rec.id === r.id))));\n    }\n}\n\nexport module SearchService {\n    export interface GetResultsOptions {\n        queryIntents?: QueryIntent[];\n        queryIntentsV2?: QueryIntentMatch[];\n        queryAnalysis?: QueryAnalysis;\n        searchInactive?: boolean;   // default \"false\"\n    }\n\n    export interface AddSelectOptions {\n        not?: boolean;      // default \"false\"\n        and?: boolean;      // default \"false\"\n    }\n\n    export interface NavigationOptions {\n        path?: string; // absolute path, current path used if not specified\n        selectTab?: boolean;\n        analyzeQueryText?: boolean;\n        queryIntents?: QueryIntent[];\n        queryAnalysis?: QueryAnalysis;\n        skipLocationChange?: boolean;\n        skipSearch?: boolean;\n    }\n\n    export interface HistoryState {\n        audit?: AuditEvents;\n        navigationOptions?: NavigationOptions;\n    }\n\n    export interface Event {\n        type: \"new-query\" | \"update-query\" | \"make-query\" | \"before-new-results\" | \"new-results\" | \"make-query-intent-data\" |\n            \"process-query-intent-action\" | \"make-audit-event\" | \"new-query-intents\" |\n            \"before-select-tab\" | \"after-select-tab\" | \"clear\" | \"open-original-document\" | \"before-search\";\n    }\n\n    export interface NewQueryEvent extends Event {\n        type: \"new-query\";\n        query: Query | undefined;\n    }\n\n    export interface UpdateQueryEvent extends Event {\n        type: \"update-query\";\n        query: Query | undefined;\n    }\n\n    export interface MakeQueryEvent extends Event {\n        type: \"make-query\";\n        query: Query;\n    }\n\n    export interface BeforeNewResultsEvent<T> extends Event {\n        type: \"before-new-results\";\n        results: T | undefined;\n    }\n\n    export interface NewResultsEvent<T> extends Event {\n        type: \"new-results\";\n        results: T | undefined;\n    }\n\n    export interface MakeQueryIntentDataEvent extends Event {\n        type: \"make-query-intent-data\";\n        intentData: QueryIntentData;\n    }\n\n    export interface ProcessQueryIntentActionEvent extends Event {\n        type: \"process-query-intent-action\";\n        action: QueryIntentAction;\n        intent: QueryIntent;\n        analysis: QueryAnalysis;\n        actionProcessed?: boolean;\n    }\n\n    export interface MakeAuditEventEvent extends Event {\n        type: \"make-audit-event\";\n        event: AuditEvent;\n    }\n\n    export interface BeforeSelectTabEvent extends Event {\n        type: \"before-select-tab\";\n        query: Query;\n    }\n\n    export interface AfterSelectTabEvent<T> extends Event {\n        type: \"after-select-tab\";\n        observable: Observable<T|undefined>;\n    }\n\n    export interface ClearEvent extends Event {\n        type: \"clear\";\n        path?: string;\n    }\n\n    export interface OpenOriginalDocument extends Event {\n        type: \"open-original-document\";\n        record: Record;\n    }\n\n    export interface BeforeSearchEvent extends Event {\n        type: \"before-search\";\n        cancel?: boolean;\n        cancelReasons?: string[];\n    }\n\n    export interface NewQueryIntentsEvent extends Event {\n        type: \"new-query-intents\";\n        query: Query;\n        intents: QueryIntentMatch[];\n        cancelSearch: boolean;\n    }\n\n    export type Events<T> =\n        NewQueryEvent |\n        UpdateQueryEvent |\n        MakeQueryEvent |\n        BeforeNewResultsEvent<T> |\n        NewResultsEvent<T> |\n        MakeQueryIntentDataEvent |\n        ProcessQueryIntentActionEvent |\n        MakeAuditEventEvent |\n        BeforeSelectTabEvent |\n        AfterSelectTabEvent<T> |\n        ClearEvent |\n        OpenOriginalDocument |\n        BeforeSearchEvent |\n        NewQueryIntentsEvent;\n\n    export const DefaultPageSize = 20;\n}\n","import { Inject, Injectable, InjectionToken, OnDestroy, Optional } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { Observable, of, Subscription, filter, switchMap, tap } from 'rxjs';\n\nimport { Utils } from \"@sinequa/core/base\";\nimport { LoginService } from \"@sinequa/core/login\";\nimport { AuditEventType, Results } from \"@sinequa/core/web-services\";\n\nimport { SearchService } from \"./search.service\";\n\nexport interface FirstPageOptions {\n    displayOnHomePage?: boolean;\n    aggregations?: string[];\n}\n\nexport const FIRST_PAGE_OPTIONS = new InjectionToken<FirstPageOptions>(\"FIRST_PAGE_OPTIONS\");\n\n@Injectable({\n    providedIn: \"root\"\n})\nexport class FirstPageService implements OnDestroy {\n    private subscriptions: Subscription = new Subscription();\n    firstPage?: Results;\n\n    constructor(\n        @Optional() @Inject(FIRST_PAGE_OPTIONS) protected options: FirstPageOptions,\n        protected searchService: SearchService,\n        protected loginService: LoginService,\n        protected router: Router\n    ) {\n        if (!this.options) {\n            this.options = {};\n        }\n        this.subscriptions.add(\n            this.searchService.events\n                .pipe(\n                    filter(event => event.type === \"clear\"),\n                    filter(event => this.displayOnHomePage((event as SearchService.ClearEvent).path)),\n                    switchMap(_ => this.getFirstPage(this.options.aggregations))\n                ).subscribe()\n        );\n\n        // when session changed, on login complete, cache results must be cleared before to get the first page query\n        this.subscriptions.add(\n            this.loginService.events\n                .pipe(\n                    filter(event => event.type === \"login-complete\"),\n                    switchMap(_ => {\n                        if(this.firstPage) {\n                            this.firstPage = undefined;\n                            return this.getFirstPage(this.options.aggregations);\n                        }\n                        else return of();\n                    })\n                ).subscribe()\n        );\n    }\n\n    ngOnDestroy() {\n        this.subscriptions.unsubscribe();\n    }\n\n    /**\n     * @ignore\n     * legacy\n     */\n    get isFirstPage(): boolean {\n        return this.isCurrentSearchResults;\n    }\n\n    get isCurrentSearchResults(): boolean {\n        return !!this.searchService.results && this.searchService.results === this.firstPage;\n    }\n\n    displayOnHomePage(path?: string): boolean {\n        if (Array.isArray(this.options.displayOnHomePage)) {\n            if (!path) {\n                const url = Utils.makeURL(this.router.url);\n                path = url.pathname;\n            }\n            for (const path1 of this.options.displayOnHomePage) {\n                if (Utils.endsWith(path, Utils.addUrl(\"/\", path1))) {\n                    return true;\n                }\n            }\n            return false;\n        }\n        else {\n            return !!this.options.displayOnHomePage;\n        }\n    }\n\n    /**\n     * \"If the first page is already cached, return it as an observable, otherwise,\n     * make a query, set the isFirstPage flag to true, and then return the results\n     * as an observable.\"\n     *\n     * @returns Observable<Results>\n     */\n    getFirstPage(aggregations?: string[]): Observable<Results> {\n        if(!aggregations && this.options.aggregations) {\n            aggregations = this.options.aggregations;\n        }\n\n        if (this.firstPage) {\n            return of(this.firstPage);\n        }\n\n        const query = this.searchService.makeQuery({ isFirstPage: true, aggregations });\n\n        // side effect, set cache results, then return \"results\" as observable\n        return this.searchService.getResults(query, { type: AuditEventType.Search_FirstPage }, { searchInactive: true })\n            .pipe(tap(results => this.firstPage = results))\n    }\n}\n","import {Component, Input, OnChanges, SimpleChanges} from \"@angular/core\";\nimport {Results, DidYouMeanItem, DidYouMeanAction, DidYouMeanKind} from \"@sinequa/core/web-services\";\nimport {SearchService} from \"../../search.service\";\n\n@Component({\n    selector: \"sq-did-you-mean\",\n    templateUrl: \"./did-you-mean.html\",\n    styleUrls: [\"./did-you-mean.css\"],\n    standalone: false\n})\nexport class BsDidYouMean implements OnChanges {\n    @Input() results: Results;\n    item: DidYouMeanItem | undefined;\n    action: DidYouMeanAction | undefined;\n\n    constructor(\n        public searchService: SearchService) {\n    }\n\n    private handleResults() {\n        this.item = undefined;\n        this.action = undefined;\n        if (this.results.didYouMean) {\n            const item = this.results.didYouMean.text;\n            if (item.corrected) {\n                this.item = item;\n                this.action = this.resolveAction(item, this.results.didYouMean.spellingCorrectionMode);\n            }\n        }\n    }\n\n    /**\n     * Resolves the action to display from the per-term `appliedChanges` reported by the engine (ES-28698).\n     * Falls back to `spellingCorrectionMode`-based inference for engine versions prior to 11.14 that\n     * do not report `appliedChanges`, or when the applied changes disagree on the action to take\n     * (defaults to `suggestion`, the only case that does not assert a search behavior that may not\n     * actually have happened — the root cause of ES-27719).\n     */\n    private resolveAction(item: DidYouMeanItem, spellingCorrectionMode: string): DidYouMeanAction {\n        const appliedChanges = item.appliedChanges;\n        if (!appliedChanges?.length) {\n            return this.legacyAction(spellingCorrectionMode);\n        }\n        const [first, ...rest] = appliedChanges;\n        if (first.action && rest.every(change => change.action === first.action)) {\n            return first.action;\n        }\n        return \"suggestion\";\n    }\n\n    /**\n     * Fallback for engine versions prior to 11.14 that do not report the per-term `action` (ES-28698).\n     * Defaults to `suggestion` for unknown modes, since it is the only case that does not assert\n     * a search behavior that may not actually have happened (the root cause of ES-27719).\n     */\n    private legacyAction(spellingCorrectionMode: string): DidYouMeanAction {\n        switch (spellingCorrectionMode) {\n            case \"Correct\": return \"correction\";\n            case \"Smart\": return \"expansion\";\n            default: return \"suggestion\";\n        }\n    }\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (changes.results) {\n            this.handleResults();\n        }\n    }\n\n    selectOriginal() {\n        if (this.item) {\n            this.searchService.didYouMean(this.item.original, DidYouMeanKind.Original);\n        }\n        return false;\n    }\n\n    selectCorrected() {\n        if (this.item) {\n            this.searchService.didYouMean(this.item.corrected, DidYouMeanKind.Corrected);\n        }\n        return false;\n    }\n}\n","<div *ngIf=\"item\" class=\"sq-did-you-mean sq-text\" [ngSwitch]=\"action\">\n    <!-- en: \"Showing results for: {original}. Search instead for: {corrected}\" -->\n    <ng-container *ngSwitchCase=\"'suggestion'\">\n        {{'msg#didYouMean.suggestionBeforeOriginal' | sqMessage}}<span class=\"sq-did-you-mean-original\">{{item.original}}</span>{{'msg#didYouMean.suggestionBeforeCorrected' | sqMessage}}<a class=\"sq-did-you-mean-corrected\" href=\"#\" (click)=\"selectCorrected()\">{{item.corrected}}</a>{{'msg#didYouMean.suggestionAfterCorrected' | sqMessage}}\n    </ng-container>\n    <!-- en: \"Showing results for: {corrected}. Search instead for: {original}\" -->\n    <ng-container *ngSwitchCase=\"'correction'\">\n        {{'msg#didYouMean.correctionBeforeCorrected' | sqMessage}}<span class=\"sq-did-you-mean-corrected\">{{item.corrected}}</span>{{'msg#didYouMean.correctionBeforeOriginal' | sqMessage}}<a class=\"sq-did-you-mean-original\" href=\"#\" (click)=\"selectOriginal()\">{{item.original}}</a>{{'msg#didYouMean.correctionAfterOriginal' | sqMessage}}\n    </ng-container>\n    <!-- en: \"Showing results for: {original} and {corrected}\" (both terms remain clickable: each narrows the search down to that term only) -->\n    <ng-container *ngSwitchCase=\"'expansion'\">\n        {{'msg#didYouMean.expansionBeforeOriginal' | sqMessage}}<a class=\"sq-did-you-mean-original\" href=\"#\" (click)=\"selectOriginal()\">{{item.original}}</a>{{'msg#didYouMean.expansionBeforeCorrected' | sqMessage}}<a class=\"sq-did-you-mean-corrected\" href=\"#\" (click)=\"selectCorrected()\">{{item.corrected}}</a>{{'msg#didYouMean.expansionAfterCorrected' | sqMessage}}\n    </ng-container>\n</div>\n","import {Component, OnChanges, SimpleChanges, Input} from '@angular/core';\nimport {Results} from \"@sinequa/core/web-services\";\nimport {AppService} from \"@sinequa/core/app-utils\";\nimport {Action} from \"@sinequa/components/action\";\nimport {SearchService} from \"../../search.service\";\n//import {ResultsView} from '@sinequa/components/results-view';\n\n// TODO restore functionality of storing page size in user settings ?\n\n/**\n * Component for choosing the page size of the results view\n *\n */\n@Component({\n    selector: 'sq-page-size-selector',\n    templateUrl: './page-size-selector.html',\n    standalone: false\n})\nexport class BsPageSizeSelector implements OnChanges {\n    @Input() results: Results;\n    //@Input() resultsView: ResultsView;\n    @Input() showInRegularView: boolean = true;\n    @Input() showInCustomization: boolean;\n    @Input() pageSizes: number[];\n    @Input() rightAligned: boolean;\n    @Input('defaultPageSize') _defaultPageSize: number;\n\n    public pageSizingAction: Action;\n\n    protected availableSizes: number[];\n    protected currentPageSize: number;\n\n    constructor(\n        private appService: AppService,\n        private searchService: SearchService\n    ) { }\n\n    ngOnChanges(changes: SimpleChanges): void {\n        this.refreshVisualisation();\n    }\n\n    /*\n    protected get globalPageSize(): number {\n        const globalQueryParams = this.userSettingsService.getUserSettings().queryParams;\n        return globalQueryParams ? globalQueryParams.pageSize : undefined;\n    }\n    */\n\n    protected get configPageSize(): number {\n        return this.appService.ccquery ? this.appService.ccquery.pageSize : 0;\n    }\n\n    protected get defaultPageSize(): number {\n        if (this._defaultPageSize) return this._defaultPageSize;\n        //let res = this.globalPageSize;\n        //if (!res) {\n        let res = this.configPageSize;\n        if (!res) {\n            res = SearchService.DefaultPageSize;\n        }\n        //}\n\n        return res;\n    }\n\n    protected buildPageSizingAction(): Action {\n        this.availableSizes = this.pageSizes ? this.pageSizes.slice(0) : [];\n        this.availableSizes.sort((a, b) => a - b);\n        const children: Action[] = [];\n\n        children.push(new Action({\n            text: 'msg#pageSizeSelector.defaultPageSize',\n            messageParams: { values: { size: this.defaultPageSize } },\n            data: undefined, // To make sure that setCurrentSize() always chooses the default choice text.\n            action: (item: Action, event: Event) => {\n                this.updatePageSize(item.data);\n            }\n        }));\n\n        for (const size of this.availableSizes) {\n            children.push(new Action({\n                text: size.toString(),\n                data: size,\n                action: (item: Action, event: Event) => {\n                    this.updatePageSize(item.data);\n                }\n            }));\n        }\n\n        return new Action({\n            icon: 'fas fa-arrows-alt-v',\n            text: 'msg#pageSizeSelector.pageSizeChoice',\n            children: children\n        });\n    }\n\n    protected refreshVisualisation(): void {\n        this.pageSizingAction = this.buildPageSizingAction();\n        if (this.results) {\n            //const queryParams = this.userSettingsService.getViewQueryParams(this.resultsView.name);\n            //this.currentPageSize = queryParams.pageSize;\n            this.setCurrentSize(this.currentPageSize);\n        }\n    }\n\n    protected setCurrentSize(size: number): void {\n        if (!size) {\n            this.pageSizingAction.text = 'msg#pageSizeSelector.defaultPageSizeChoice';\n            this.pageSizingAction.messageParams = { values: { size: this.defaultPageSize } };\n        }\n        else {\n            const selectedAction = this.pageSizingAction.children?.find(action => action.data === size);\n            this.pageSizingAction.text = 'msg#pageSizeSelector.pageSizeChoice';\n            this.pageSizingAction.messageParams = { values: { size: selectedAction?.data } };\n        }\n    }\n\n    protected updatePageSize(size: number): void {\n        if (this.currentPageSize !== size) {\n            //this.userSettingsService.saveResultsViewPageSize(this.resultsView.name, size);\n            this.currentPageSize = size;\n\n            this.searchService.query.pageSize = size;\n            this.searchService.search();\n        }\n\n        this.setCurrentSize(size);\n    }\n}\n","<div class=\"btn-toolbar\" *ngIf=\"!!results\">\n    <div class=\"btn-group\"\n        [sq-action-buttons]=\"{\n            items: [pageSizingAction],\n            autoAdjust: true,\n            rightAligned: rightAligned\n        }\"></div>\n</div>\n","import {Component, Input, OnChanges, SimpleChanges} from \"@angular/core\";\nimport {Utils} from \"@sinequa/core/base\";\nimport {Results} from \"@sinequa/core/web-services\";\nimport {SearchService} from \"../../search.service\";\n\n@Component({\n    selector: \"sq-pager\",\n    templateUrl: \"./pager.html\",\n    standalone: false\n})\nexport class BsPager implements OnChanges {\n    @Input() results: Results;\n    @Input() showNavigation: boolean = true;\n    @Input() showFirstLast: boolean = true;\n    @Input() showPages: boolean = true;\n    @Input() endPages: number = 1;\n    @Input() pages: number = 5;\n\n    items: BsPager.Item[] | undefined;\n\n    private currentPage: number;\n    pageCount: number = 0;\n\n    static FIRST_PAGE = \"«\";\n    static PREVIOUS_PAGE = \"‹\";\n    static NEXT_PAGE = \"›\";\n    static LAST_PAGE = \"»\";\n    static ELLIPSIS = \"…\";\n\n    constructor(\n        private searchService: SearchService) {\n    }\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (changes[\"results\"]) {\n            this.makeItems();\n        }\n    }\n\n    makeItems() {\n        this.pageCount = this.searchService.pageCount;\n        this.currentPage = this.searchService.page;\n        if (this.pageCount === 0) {\n            this.items = undefined;\n            return;\n        }\n        let endPages = this.endPages;\n        if (!endPages || endPages <= 0) {\n            endPages = 1;\n        }\n\n        const endWidth = endPages + 1; // +1 for the …\n\n        let pages = this.pages;\n        if (!pages) {\n            pages = 3 + endWidth * 2;\n        }\n        if (pages < 3 + endWidth * 2) {\n            pages = 3 + endWidth * 2; // 3 is the minimum number of pages to show between the … separators\n        }\n        let split1 = -1, split2 = -1;\n        if (this.pageCount <= pages) {\n            pages = this.pageCount;\n        }\n        else {\n            // pages must be an odd number to accommodate:  (First page) … (Current page - 1) (Current page) (Current page + 1) … (Last page)\n            pages = Math.floor(pages / 2) * 2 + 1;\n            const mid = pages - endWidth * 2;\n            const delta = Math.floor(mid / 2);\n            if ((this.currentPage - delta) > endPages + 1 + 1) {\n                split1 = this.currentPage - delta;\n            }\n            if ((this.currentPage + delta) < (this.pageCount - endWidth)) {\n                split2 = this.currentPage + delta;\n            }\n            if (split1 === -1 && split2 !== -1) {\n                split2 += endPages + 1 + 1 - (this.currentPage - delta);\n            }\n            else if (split2 === -1 && split1 !== -1)  {\n                split1 -= (this.currentPage + delta) - (this.pageCount - endWidth);\n            }\n        }\n        this.items = [];\n        if (this.showNavigation) {\n            if (this.showFirstLast) {\n                this.items.push(new BsPager.Item(1, this.currentPage, BsPager.FIRST_PAGE, \"msg#pager.firstPage\"));\n            }\n            this.items.push(new BsPager.Item(this.currentPage > 1 ? this.currentPage - 1 : 1, this.currentPage, BsPager.PREVIOUS_PAGE, \"msg#pager.previousPage\"));\n        }\n        if (this.showPages) {\n            for (let i = 1, ic = split1 !== -1 ? endPages : split2 !== -1 ? split2 : this.pageCount; i <= ic; i++) {\n                this.items.push(new BsPager.Item(i, this.currentPage));\n            }\n            if (split1 !== -1) {\n                this.items.push(new BsPager.Item(0, this.currentPage, BsPager.ELLIPSIS));\n                for (let i = split1, ic = split2 !== -1 ? split2 : this.pageCount; i <= ic; i++) {\n                    this.items.push(new BsPager.Item(i, this.currentPage));\n                }\n            }\n            if (split2 !== -1) {\n                this.items.push(new BsPager.Item(0, this.currentPage, BsPager.ELLIPSIS));\n                for (let i = this.pageCount - endPages + 1, ic = this.pageCount; i <= ic; i++) {\n                    this.items.push(new BsPager.Item(i, this.currentPage));\n                }\n            }\n        }\n        if (this.showNavigation) {\n            this.items.push(new BsPager.Item(this.currentPage < this.pageCount ? this.currentPage + 1 : this.pageCount, this.currentPage, BsPager.NEXT_PAGE, \"msg#pager.nextPage\"));\n            if (this.showFirstLast) {\n                this.items.push(new BsPager.Item(this.pageCount, this.currentPage, BsPager.LAST_PAGE, \"msg#pager.lastPage\"));\n            }\n        }\n    }\n\n    gotoPage(page: number) {\n        if (page !== this.currentPage && page > 0) {\n            this.searchService.gotoPage(page);\n        }\n    }\n}\n\nexport namespace BsPager {\n    export class Item {\n        constructor(\n            public page: number,\n            public currentPage: number,\n            public display?: string | number,\n            public title?: string) {\n            if (display) {\n                this.display = display;\n            }\n            else {\n                this.display = page;\n            }\n            if (Utils.isUndefined(title) && page) {\n                this.title = \"msg#pager.pageNumberTitle\";\n            }\n        }\n\n        get active(): boolean {\n            return this.isPage && (this.currentPage === this.page);\n        }\n\n        get disabled(): boolean {\n            return this.isEllipsis || ((this.currentPage === this.page) && this.isNavigation);\n        }\n\n        get isNavigation(): boolean {\n            return this.display === BsPager.FIRST_PAGE ||\n                this.display === BsPager.PREVIOUS_PAGE ||\n                this.display === BsPager.NEXT_PAGE ||\n                this.display === BsPager.LAST_PAGE;\n        }\n\n        get isPage(): boolean {\n            return !!this.page && !this.isNavigation;\n        }\n\n        get isEllipsis(): boolean {\n            return this.display === BsPager.ELLIPSIS;\n        }\n    }\n}","<ul class=\"pagination my-0\" *ngIf=\"pageCount > 1\">\n    <li *ngFor=\"let item of items\" \n        title=\"{{item.title | sqMessage:{values: {page: item.page} } }}\" \n        class=\"page-item\" \n        [ngClass]=\"{'active': item.active, 'disabled': item.disabled, 'sq-navigation': item.isNavigation, 'sq-page': item.isPage, 'sq-ellipsis': item.isEllipsis}\" \n        (click)=\"gotoPage(item.page)\">\n        <a href=\"javascript:void(0)\" class=\"page-link\"> \n            <span>{{item.display | sqNumber}}</span>\n        </a>            \n    </li>\n</ul>","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\n\nimport { Action } from \"@sinequa/components/action\";\nimport { AppService } from \"@sinequa/core/app-utils\";\nimport { Utils } from \"@sinequa/core/base\";\nimport { AuditEvent, AuditEventType, CCSortingChoice, Results } from \"@sinequa/core/web-services\";\n\nimport { SearchService } from \"../../search.service\";\n\n@Component({\n    selector: \"sq-sort-selector\",\n    templateUrl: \"./sort-selector.html\",\n    standalone: false\n})\nexport class BsSortSelector implements OnChanges {\n    @Input() results: Results;  // Needed to detect Changes\n    @Input() rightAligned: boolean;\n    @Input() style: string = '';\n    @Input() size: string;\n    sortAction: Action | undefined;\n\n    constructor(\n        public appService: AppService,\n        public searchService: SearchService) {\n    }\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (changes[\"results\"]) {\n            this.buildSortAction();\n        }\n    }\n\n    private setCurrentSort(name: string) {\n        if (this.sortAction) {\n            const sortingChoices = this.getSortingChoices();\n            const current = sortingChoices?.find(value => Utils.eqNC(value.name, name));\n            if (current) {\n                const queryOrderBy = this.searchService.query.orderBy;\n                this.sortAction.text = !!queryOrderBy ? \"msg#sortSelector.sortOther\" : current.display || current.name;\n                this.sortAction.icon = !!queryOrderBy ? 'fas fa-sort'\n                    : this.isAscendingSort(current.orderByClause) ? 'fas fa-sort-amount-up'\n                    : this.isDescendingSort(current.orderByClause) ? 'fas fa-sort-amount-down' : 'fas fa-sort';\n            }\n            else {\n                this.sortAction.text = \"msg#sortSelector.sortOther\";\n                this.sortAction.icon = \"fas fa-sort\";\n            }\n            this.sortAction.messageParams = {values: {text: this.sortAction.text}}; // for title\n        }\n    }\n\n    private selectSort(sortingChoice: CCSortingChoice) {\n        this.setCurrentSort(sortingChoice.name);\n        this.searchService.query.sort = sortingChoice.name;\n        const audit: AuditEvent = {\n            type: AuditEventType.Search_Sort,\n            detail: {\n                sort: sortingChoice.name,\n                orderByClause: sortingChoice.orderByClause,\n            }\n        };\n        this.searchService.search(undefined, audit);\n    }\n\n    private buildSortAction() {\n        const sortingChoices = this.getSortingChoices();\n        if (!sortingChoices || sortingChoices.length === 0) {\n            this.sortAction = undefined;\n            return;\n        }\n        this.sortAction = new Action({\n            title: \"msg#sortSelector.sortByTitle\",\n            children: sortingChoices\n                .filter(sortingChoice => this.results.hasRelevance || !Utils.includes(sortingChoice.orderByClause, \"globalrelevance\"))\n                .map(sortingChoice => new Action({\n                    icon: this.isAscendingSort(sortingChoice.orderByClause) ? 'fas fa-sort-amount-up'\n                            : this.isDescendingSort(sortingChoice.orderByClause) ? 'fas fa-sort-amount-down' : '',\n                    text: sortingChoice.display || sortingChoice.name,\n                    data: sortingChoice,\n                    action: (item: Action) => {\n                        this.selectSort(item.data);\n                    }\n                }))\n        });\n        this.setCurrentSort(this.results.sort);\n    }\n\n    private isAscendingSort(orderByClause: string): boolean {\n        if (!orderByClause) {\n            return false;\n        }\n\n        const lastElement: string = orderByClause.substring(orderByClause.lastIndexOf(' ') + 1);\n        return Utils.eqNC('asc', lastElement);\n    }\n\n    private isDescendingSort(orderByClause: string): boolean {\n        if (!orderByClause) {\n            return false;\n        }\n\n        const lastElement: string = orderByClause.substring(orderByClause.lastIndexOf(' ') + 1);\n        return Utils.eqNC('desc', lastElement);\n    }\n\n    private isTabSearch(): boolean {\n        const query = this.appService.ccquery;\n        if (!query)\n            return false;\n        const tabSearch = query.tabSearch;\n        return !(!tabSearch || !tabSearch.column || !tabSearch.isActive ||\n            !tabSearch.tabs || tabSearch.tabs.length === 0);\n    }\n\n    private getSortingChoices(): CCSortingChoice[] | null | undefined {\n        if (this.isTabSearch()) {\n            const tabName = this.results.tab;\n            if (tabName && this.appService.ccquery) {\n                for (const t of this.appService.ccquery.tabSearch.tabs) {\n                    if (t.name === tabName) {\n                        const s = t.sortingChoices;\n                        if (s && s.length > 0)\n                            return s;\n                        else\n                            break;\n                    }\n                }\n            }\n        }\n        const q = this.appService.ccquery;\n        return q && q.sortingChoices;\n    }\n}\n","<div class=\"btn-toolbar\" role=\"toolbar\" aria-label=\"Toolbar\">\n    <div class=\"btn-group\" [hidden]=\"!searchService.haveRecords || !sortAction\" [sq-action-buttons]=\"{items: sortAction? [sortAction] : [], style: style + ' no-shadow', autoAdjust: true, rightAligned: rightAligned, size: size}\"></div>\n</div>","import { Component, Input, Output, OnChanges, SimpleChanges, EventEmitter } from \"@angular/core\";\nimport { Results, Tab } from \"@sinequa/core/web-services\";\nimport { SearchService } from \"../../search.service\";\n\n@Component({\n    selector: \"sq-tabs\",\n    templateUrl: \"./tabs.html\",\n    standalone: false\n})\nexport class BsTabs implements OnChanges {\n\n    @Input() results: Results;\n\n    /**\n     * List of custom tabs (complementing the search query tabs)\n     * Actions can be performed on click via the events Output.\n     *\n     * When the results are updated (new search text, facet\n     * selection...), the custom tab selection is discarded.\n     * If the custom action updates the results, the tab selection\n     * will revert to previous state unless the query is updated.\n     */\n    @Input() customtabs: Tab[];\n\n    /**\n     * Tab name to select by default\n     */\n    @Input() selectedTab: string;\n\n    /**\n     * Associate icon to a tab name ({tab1 : 'icon class 1', tab2 : ...})\n     */\n    @Input() iconMap: { [key: string]: string } = {};\n\n    @Input() showCounts = true;\n\n    /**\n     * Custom classes for the tab items\n     */\n    @Input() tabsClass: string = '';\n\n    /**\n     * Emits an event when a tab is selected\n     */\n    @Output() events = new EventEmitter<Tab>();\n\n    currentTab: Tab | undefined;\n    searchtabs: Tab[] | undefined;\n\n    constructor(\n        private searchService: SearchService) {\n    }\n\n    update() {\n        if (this.results && this.results.tabs) {\n            this.searchtabs = this.results.tabs;\n            if (!!this.selectedTab) {\n                this.currentTab = this.searchtabs.find(tab => tab.name === this.selectedTab);\n            } else {\n                this.currentTab = this.searchService.getCurrentTab();\n            }\n        }\n        else if (this.customtabs && this.customtabs.length && !!this.selectedTab) {\n            this.currentTab = this.customtabs.find(tab => tab.name === this.selectedTab);\n            this.searchtabs = undefined;\n        }\n        else {\n            this.currentTab = undefined;\n            this.searchtabs = undefined;\n        }\n    }\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (!!changes[\"results\"] || !!changes[\"customtabs\"] || !!changes[\"selectedTab\"]) {\n            this.update();\n        }\n    }\n\n    selectTab(tab: Tab, search = true) {\n        if (tab !== this.currentTab) {\n            if (search) {\n                this.searchService.selectTab(tab); // the currentTab will be updated in update()\n            } else {\n                this.currentTab = tab;\n            }\n            this.events.next(tab);\n        }\n        return false;   // Stop following href\n    }\n}\n","<ul *ngIf=\"!!searchtabs || !!customtabs\" class=\"nav nav-tabs\">\n    <ng-container *ngIf=\"!!searchtabs\">\n        <li *ngFor=\"let tab of searchtabs\" class=\"nav-item\">\n            <a href=\"#\" class=\"nav-link {{tabsClass}}\" [ngClass]=\"{'active' : tab === currentTab, 'disabled': tab.count == 0}\" (click)=\"selectTab(tab)\">\n                <i [ngClass]=\"iconMap[tab.name]\"></i>\n                {{(tab.display || tab.name) | sqMessage}}\n                <span class=\"count\" *ngIf=\"showCounts\">({{tab.count | sqNumber}})</span>\n            </a>\n        </li>\n    </ng-container>\n    <ng-container *ngIf=\"!!customtabs\">\n        <li *ngFor=\"let tab of customtabs\" class=\"nav-item\">\n            <a href=\"#\" class=\"nav-link {{tabsClass}}\" [ngClass]=\"{'active' : tab === currentTab, 'disabled': tab.count == 0}\" (click)=\"selectTab(tab, false)\">\n                <i [ngClass]=\"iconMap[tab.name]\"></i>\n                {{(tab.display || tab.name) | sqMessage}}\n                <span class=\"count\" *ngIf=\"showCounts && tab.count >= 0\">({{tab.count | sqNumber}})</span>\n            </a>\n        </li>\n    </ng-container>\n</ul>\n","import {Component, Input} from '@angular/core';\nimport {SearchService} from \"../../search.service\";\n\n// From https://stackoverflow.com/questions/34773266/how-to-write-css-keyframes-to-indeterminate-material-design-progress-bar\n\n@Component({\n    selector: 'sq-loading-bar',\n    template: `\n<div class=\"slider\" *ngIf=\"isActive()\">\n\t<div class=\"line\"></div>\n  <div class=\"subline inc\"></div>\n  <div class=\"subline dec\"></div>\n</div>\n    `,\n    styles: [`\n\n.slider{\n  position:absolute;\n  width:100%;\n  height:3px;\n  overflow: hidden;\n  z-index: 3;\n}\n\n.line{\n  position:absolute;\n  opacity: 0.4;\n  background:#4a8df8;\n  width:150%;\n  height:5px;\n}\n\n.subline{\n  position:absolute;\n  background:#4a8df8;\n  height:5px;\n}\n.inc{\nanimation: increase 1s infinite;\n}\n.dec{\nanimation: decrease 1s 0.25s infinite;\n}\n\n@keyframes increase {\n from { left: -5%; width: 5%; }\n to { left: 130%; width: 100%;}\n}\n@keyframes decrease {\n from { left: -80%; width: 80%; }\n to { left: 110%; width: 10%;}\n}\n    `],\n    standalone: false\n})\nexport class BsLoadingBar {\n  /**\n   * active can provided as a boolean to activate the loading bar.\n   * If it is not provided, the SearchService searchActive property is used.\n   */\n  @Input() active?: boolean;\n\n  constructor(\n    public searchService: SearchService\n  ) { }\n\n  isActive() {\n    return this.active === undefined ? this.searchService.searchActive : this.active;\n  }\n}\n","import {animate, style, transition, trigger} from '@angular/animations';\r\nimport {Component, ElementRef, ViewChild, Input, OnDestroy, AfterViewInit, OnInit} from '@angular/core';\r\nimport {SearchService} from '../../search.service';\r\n\r\nexport type FloatStyle = \"float-right\" | \"float-left-15\" | \"float-left-35\";\r\n\r\n@Component({\n    selector: 'sq-scroller',\n    styleUrls: ['./scroller.scss'],\n    animations: [\n        trigger(\"fadeInOut\", [\n            transition(\":enter\", [\n                style({ opacity: 0 }),\n                animate('1s', style({ opacity: 1 }))\n            ]),\n            transition(\":leave\", [\n                animate('0.5s', style({ opacity: 0 }))\n            ])\n        ])\n    ],\n    template: `\r\n<div @fadeInOut *ngIf=\"hasMore\" class=\"load-more-indicator\" [ngClass]=\"position\">\r\n  <div class=\"arrow arrow-color bounce\">\r\n    <i class=\"fas fa-chevron-down fa-2x\"></i>\r\n  </div>\r\n</div>\r\n<div #anchor style=\"height:5px\"></div>\r\n    `,\n    standalone: false\n})\r\nexport class BsScroller implements AfterViewInit, OnDestroy, OnInit {\r\n\r\n  @Input() options = {};\r\n  @Input() position: FloatStyle = 'float-left-35';\r\n\r\n  @ViewChild('anchor') anchor: ElementRef<HTMLElement>;\r\n\r\n  hasMore = true;\r\n\r\n  private observer: IntersectionObserver;\r\n\r\n  constructor(private searchService: SearchService) {}\r\n\r\n  ngOnInit() {\r\n    // when a search occurs, check if has mare results\r\n    this.searchService.resultsStream\r\n      .subscribe(results => {\r\n        this.hasMore = this.searchService.hasMore();\r\n      });\r\n  }\r\n\r\n  ngAfterViewInit() {\r\n    const options = {\r\n      root: null,\r\n      ...this.options\r\n    };\r\n\r\n    this.observer = new IntersectionObserver(([entry]) => {\r\n      if (entry.isIntersecting) {\r\n        this.searchService.loadMore();\r\n      }\r\n    }, options);\r\n\r\n    this.observer.observe(this.anchor.nativeElement);\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    this.observer.disconnect();\r\n  }\r\n\r\n}","import {Component, Input, OnDestroy, OnInit} from '@angular/core';\r\nimport {Action, IAction} from '@sinequa/components/action';\r\nimport {Subscription} from 'rxjs';\r\n\r\nimport {SearchService} from '../../search.service';\r\n\r\n@Component({\n    selector: \"sq-load-more\",\n    templateUrl: \"./load-more.html\",\n    standalone: false\n})\r\nexport class BsLoadMore implements OnInit, OnDestroy {\r\n  @Input() buttonsStyle = \"outline-primary\";\r\n  @Input() actionsSize = \"sm\"\r\n\r\n  private subscription: Subscription = new Subscription();\r\n  loadMoreAction: IAction;\r\n  hasMore = false;\r\n\r\n  constructor(private searchService: SearchService) {\r\n    this.loadMoreAction = new Action({\r\n      text: \"msg#facet.loadMore\",\r\n      title: \"msg#facet.loadMore\",\r\n      action: (action) => {\r\n        this.searchService.loadMore();\r\n        action.update();\r\n      },\r\n      updater:() => {\r\n        // hide button while fetching new data\r\n        this.hasMore = false;\r\n      }\r\n    });\r\n  }\r\n\r\n  ngOnInit() {\r\n    this.subscription = this.searchService.resultsStream\r\n      .subscribe(results => {\r\n        this.hasMore = this.searchService.hasMore();\r\n      });\r\n  }\r\n\r\n  ngOnDestroy() {\r\n    this.subscription.unsubscribe();\r\n  }\r\n}","<div *ngIf=\"hasMore\" class=\"btn-group\" [sq-action-buttons]=\"{items: [loadMoreAction], style: buttonsStyle, size: actionsSize, rightAligned: false}\"></div>\r\n","import { Component, EventEmitter, Input, OnChanges, Output, SimpleChanges } from \"@angular/core\";\nimport { Action } from \"@sinequa/components/action\";\nimport { AppService, Query } from \"@sinequa/core/app-utils\";\nimport { CCScope } from \"@sinequa/core/web-services\";\n\n@Component({\n    selector: 'sq-scope',\n    template: `<li *ngIf=\"scopeAction\" [sq-action-item]=\"{item: scopeAction, autoAdjust: true}\" class=\"list-inline-item me-2\"></li>`,\n    standalone: false\n})\nexport class BsScopeComponent implements OnChanges {\n  @Input() query: Query;\n  @Output() queryChange = new EventEmitter<Query>();\n\n  scopeAction: Action;\n\n  allScopes: CCScope = {\n    name: \"\",\n    display: \"msg#scopes.allScopes\"\n  };\n\n  constructor(\n    public appService: AppService\n  ){}\n\n  ngOnChanges(changes: SimpleChanges): void {\n    this.updateAction();\n  }\n\n  updateAction() {\n    if(this.appService.ccquery?.scopesActive) {\n      const scopes = [...this.appService.ccquery.scopes];\n      const defaultScope = scopes.find(s => s.isDefault);\n      // If a default scope is not set by default, we add \"all scopes\"\n      // which corresponds to the default behavior\n      if(!defaultScope) {\n        scopes.unshift(this.allScopes);\n      }\n      // Current scope can be explicitly defined in the query, or it is default scope\n      const currentScopeName = this.query.scope ?? defaultScope?.name ?? \"\";\n      const currentScope = scopes.find(s => s.name === currentScopeName);\n\n      if(currentScope) {\n        this.scopeAction = new Action({\n          text: currentScope.display || currentScope.name,\n          children: scopes\n            .filter(s => s !== currentScope)\n            .map(s => this.getScopeAction(s))\n        });\n      }\n    }\n  }\n\n  getScopeAction(scope: CCScope): Action {\n    return new Action({\n      text: scope.display || scope.name,\n      title: scope.description,\n      action: () => this.selectScope(scope.name)\n    });\n  }\n\n  selectScope(scope: string) {\n    this.query.scope = scope;\n    this.queryChange.next(this.query);\n    this.updateAction();\n  }\n\n}\n","import {NgModule, ModuleWithProviders} from \"@angular/core\";\nimport {CommonModule} from \"@angular/common\";\nimport {FormsModule, ReactiveFormsModule} from \"@angular/forms\";\n\nimport {WebServicesModule} from \"@sinequa/core/web-services\";\nimport {IntlModule} from \"@sinequa/core/intl\";\nimport {LoginModule} from \"@sinequa/core/login\";\nimport {UtilsModule} from \"@sinequa/components/utils\";\nimport {BsActionModule} from \"@sinequa/components/action\";\nimport {SearchOptions, SEARCH_OPTIONS} from \"../search.service\";\n\nimport {BsDidYouMean} from \"./did-you-mean/did-you-mean\";\nimport {BsPager} from \"./pager/pager\";\nimport {BsPageSizeSelector} from \"./page-size-selector/page-size-selector\";\nimport {BsSortSelector} from \"./sort-selector/sort-selector\";\nimport {BsTabs} from \"./tabs/tabs\";\nimport {BsLoadingBar} from \"./loading-bar/loading-bar\";\nimport {BsScroller} from \"./scroller/scroller\"\nimport {BsLoadMore} from './load-more/load-more';\nimport {BsScopeComponent} from \"./scope/scope.component\";\n\n@NgModule({\n    imports: [\n        CommonModule,\n        FormsModule, ReactiveFormsModule,\n\n        WebServicesModule,\n        IntlModule,\n        LoginModule,\n\n        UtilsModule,\n        BsActionModule\n    ],\n    declarations: [\n        BsDidYouMean,\n        BsPager, BsPageSizeSelector, BsSortSelector,\n        BsTabs, BsLoadingBar,\n        BsScroller, BsLoadMore,\n        BsScopeComponent\n    ],\n    exports: [\n        BsDidYouMean,\n        BsPager, BsPageSizeSelector, BsSortSelector,\n        BsTabs, BsLoadingBar,\n        BsScroller, BsLoadMore,\n        BsScopeComponent\n    ],\n})\nexport class BsSearchModule {\n    static forRoot(searchOptions: SearchOptions) : ModuleWithProviders<BsSearchModule> {\n        return {\n            ngModule: BsSearchModule,\n            providers: [\n                // Provide SEARCH_OPTIONS\n                {provide: SEARCH_OPTIONS, useValue: searchOptions},\n            ]\n        };\n    }\n}\n","export default {\n    \"search\": {\n        \"emptySearchNotification\": \"Please enter some search terms to perform a search\",\n        \"alreadyFiltered\": \"Already selected\"\n    },\n\n    \"didYouMean\": {\n        \"suggestionBeforeOriginal\": \"Showing results for: \",\n        \"suggestionBeforeCorrected\": \". Search instead for: \",\n        \"suggestionAfterCorrected\": \"\",\n        \"correctionBeforeCorrected\": \"Showing results for: \",\n        \"correctionBeforeOriginal\": \". Search instead for: \",\n        \"correctionAfterOriginal\": \"\",\n        \"expansionBeforeOriginal\": \"Showing results for: \",\n        \"expansionBeforeCorrected\": \" and \",\n        \"expansionAfterCorrected\": \"\"\n    },\n\n    \"pageSizeSelector\": {\n        \"pageSizeChoice\": \"{size, number} per page\",\n        \"defaultPageSize\": \"Default ({size, number})\",\n        \"defaultPageSizeChoice\": \"{size, number} per page (default)\"\n    },\n\n    \"pager\": {\n        \"pageNumberTitle\": \"Page {page, number}\",\n        \"firstPage\": \"First page\",\n        \"nextPage\": \"Next page\",\n        \"previousPage\": \"Previous page\",\n        \"lastPage\": \"Last page\"\n    },\n\n    \"sortSelector\": {\n        \"sortByTitle\": \"Sort by: {text}\",\n        \"sortOther\": \"<Other>\"\n    },\n\n    \"sort\": {\n        \"relevance\": \"Relevance\",\n        \"date\": \"Date\",\n        \"filename\": \"File name\",\n        \"title\": \"Title\"\n    },\n\n    \"queryIntent\": {\n        \"externalServiceTimeoutError\": \"This result page is incomplete due to an internal timeout. Please retry later.\"\n    },\n\n    \"scopes\": {\n        \"allScopes\": \"All scopes\"\n    }\n};\n","export default {\n    \"search\": {\n        \"emptySearchNotification\": \"Veuillez saisir des termes de recherche pour effectuer une recherche\",\n        \"alreadySelected\": \"Déjà sélectionné\"\n    },\n\n    \"didYouMean\": {\n        \"suggestionBeforeOriginal\": \"Résultats pour : \",\n        \"suggestionBeforeCorrected\": \". Essayez avec l'orthographe : \",\n        \"suggestionAfterCorrected\": \"\",\n        \"correctionBeforeCorrected\": \"Résultats pour : \",\n        \"correctionBeforeOriginal\": \". Essayez avec l'orthographe : \",\n        \"correctionAfterOriginal\": \"\",\n        \"expansionBeforeOriginal\": \"Résultats pour : \",\n        \"expansionBeforeCorrected\": \" et \",\n        \"expansionAfterCorrected\": \"\"\n    },\n\n    \"pageSizeSelector\": {\n        \"pageSizeChoice\": \"{size, number} par page\",\n        \"defaultPageSize\": \"Défaut ({size, number})\",\n        \"defaultPageSizeChoice\": \"{size, number} par page (défaut)\"\n    },\n\n    \"pager\": {\n        \"pageNumberTitle\": \"Page {page, number}\",\n        \"firstPage\": \"Première page\",\n        \"nextPage\": \"Page suivante\",\n        \"previousPage\": \"Page précédente\",\n        \"lastPage\": \"Dernière page\"\n    },\n\n    \"sortSelector\": {\n        \"sortByTitle\": \"Trier par: {text}\",\n        \"sortOther\": \"<Autre>\"\n    },\n\n    \"sort\": {\n        \"relevance\": \"Pertinence\",\n        \"date\": \"Date\",\n        \"filename\": \"Nom de fichier\",\n        \"title\": \"Titre\"\n    },\n\n    \"queryIntent\": {\n        \"externalServiceTimeoutError\": \"Cette page de résultat est incomplète due à un délai d'attente interne dépassé. S'il vous plaît, réessayez plus tard.\"\n    },\n\n    \"scopes\": {\n        \"allScopes\": \"Toutes les sources\"\n    }\n};\n","export default {\n    \"search\": {\n        \"emptySearchNotification\": \"Bitte geben Sie einige Suchbegriffe ein, um eine Suche durchzuführen\",\n        \"alreadyFiltered\": \"bereits ausgewählt\"\n    },\n\n    \"didYouMean\": {\n        \"suggestionBeforeOriginal\": \"Zeige Ergebnisse für [\",\n        \"suggestionBeforeCorrected\": \"]. Zeige stattdessen Ergebnisse für [\",\n        \"suggestionAfterCorrected\": \"]\",\n        \"correctionBeforeCorrected\": \"Zeige Ergebnisse für [\",\n        \"correctionBeforeOriginal\": \"]. Zeige stattdessen Ergebnisse für [\",\n        \"correctionAfterOriginal\": \"]\",\n        \"expansionBeforeOriginal\": \"Zeige Ergebnisse für [\",\n        \"expansionBeforeCorrected\": \"] und [\",\n        \"expansionAfterCorrected\": \"]\"\n    },\n\n    \"pageSizeSelector\": {\n        \"pageSizeChoice\": \"{size, number} pro Seite\",\n        \"defaultPageSize\": \"Standard ({size, number})\",\n        \"defaultPageSizeChoice\": \"{size, number} pro Seite (standard)\"\n    },\n\n    \"pager\": {\n        \"pageNumberTitle\": \"Seite {page, number}\",\n        \"firstPage\": \"Erste Seite\",\n        \"nextPage\": \"Nächste Seite\",\n        \"previousPage\": \"Vorherige Seite\",\n        \"lastPage\": \"Letzte Seite\"\n    },\n\n    \"sortSelector\": {\n        \"sortByTitle\": \"Sortieren nach: {text}\",\n        \"sortOther\": \"<Andere>\"\n    },\n\n    \"sort\": {\n        \"relevance\": \"Relevanz\",\n        \"date\": \"Datum\",\n        \"filename\": \"Dateiname\",\n        \"title\": \"Titel\"\n    },\n\n    \"queryIntent\": {\n        \"externalServiceTimeoutError\": \"Diese Ergebnisseite ist aufgrund eines internen Zeitlimits unvollständig. Bitte versuchen Sie es später noch einmal.\"\n    },\n\n    \"scopes\": {\n        \"allScopes\": \"Alle Quellen\"\n    }\n};\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i5","i1.SearchService","i3","i1","i2.SearchService","i4"],"mappings":"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"}