{"version":3,"file":"sinequa-components-facet.mjs","sources":["../../../projects/components/facet/facet.service.ts","../../../projects/components/facet/abstract-facet.ts","../../../projects/components/facet/bootstrap/facet-list/facet-list.ts","../../../projects/components/facet/bootstrap/facet-list/facet-list.html","../../../projects/components/facet/bootstrap/facet-range/facet-range.ts","../../../projects/components/facet/bootstrap/facet-range/facet-range.html","../../../projects/components/facet/bootstrap/facet-refine/facet-refine.ts","../../../projects/components/facet/bootstrap/facet-refine/facet-refine.html","../../../projects/components/facet/bootstrap/facet-tag-cloud/facet-tag-cloud.ts","../../../projects/components/facet/bootstrap/facet-tag-cloud/facet-tag-cloud.html","../../../projects/components/facet/facet-config.ts","../../../projects/components/facet/bootstrap/facet-view.directive.ts","../../../projects/components/facet/bootstrap/facet-card/facet-card.ts","../../../projects/components/facet/bootstrap/facet-card/facet-card.html","../../../projects/components/facet/bootstrap/facet-bar/facet-bar.ts","../../../projects/components/facet/bootstrap/facet-bar/facet-bar.html","../../../projects/components/facet/bootstrap/facet-filters/facet-filters.ts","../../../projects/components/facet/bootstrap/facet-filters/facet-filters.html","../../../projects/components/facet/bootstrap/facet-container/facet-container.component.ts","../../../projects/components/facet/bootstrap/facet-container/facet-container.component.html","../../../projects/components/facet/bootstrap/facet-multi/facet-multi.component.ts","../../../projects/components/facet/bootstrap/facet-multi/facet-multi.component.html","../../../projects/components/facet/bootstrap/facet-mysearch/facet-mysearch.ts","../../../projects/components/facet/bootstrap/facet-mysearch/facet-mysearch.html","../../../projects/components/facet/bootstrap/facet.module.ts","../../../projects/components/facet/messages/en.ts","../../../projects/components/facet/messages/fr.ts","../../../projects/components/facet/messages/de.ts","../../../projects/components/facet/messages/index.ts","../../../projects/components/facet/sinequa-components-facet.ts"],"sourcesContent":["import { Inject, Injectable, InjectionToken, Optional } from \"@angular/core\";\nimport { addDays } from \"date-fns\";\n\nimport { Action, ActionSeparator } from \"@sinequa/components/action\";\nimport { SuggestService } from \"@sinequa/components/autocomplete\";\nimport { FirstPageService, SearchService } from \"@sinequa/components/search\";\nimport { AppService, FormatService, Query } from \"@sinequa/core/app-utils\";\nimport { diacriticsInsensitiveRegexp, FieldValue, Utils } from \"@sinequa/core/base\";\nimport { IntlService } from \"@sinequa/core/intl\";\nimport {\n  Aggregation, AggregationItem,\n  AuditEvents,\n  CCColumn,\n  EngineType,\n  ExprFilter,\n  Filter,\n  getFieldPredicate,\n  isExprFilter,\n  ListAggregation,\n  NumericalFilter,\n  Results,\n  Suggestion,\n  TreeAggregation, TreeAggregationNode,\n  UserSettings,\n  UserSettingsWebService,\n  ValueFilter\n} from \"@sinequa/core/web-services\";\nimport { map, Observable, Subject, tap } from \"rxjs\";\nimport { FacetConfig } from \"./facet-config\";\n\n// Facet interface (from models/UserSettings)\nexport interface FacetState {\n    name: string;\n    position: number; // eg 0 = left, 1 = right\n}\n\nexport interface NamedFacetConfig extends FacetConfig<{}> {\n    name: string;\n}\n\n/**\n * Options for the [[FacetService.AddFilter]] and [[FacetService.AddFilterSearch]] methods\n *\n * and: If multiple items are filtered, determines whether they are filtered as AND or OR\n * not: Whether this is an exclusion of the filtered item\n * replaceCurrent: if true, the current filter is replaced\n */\nexport interface AddFilterOptions {\n    and?: boolean;\n    not?: boolean;\n    replaceCurrent?: boolean;\n    forceAdd?: boolean; // force a new select creation instead of append it into the current one\n}\n\n// Audit Events (from models/Audit)\nexport const enum FacetEventType {\n    Loaded = \"Facet_Loaded\",\n    Add = \"Facet_Added\",\n    AddAll = \"Facets_Added\",\n    Remove = \"Facet_Removed\",\n    RemoveAll = \"Facets_Removed\",\n    SetDefaults = \"Facets_SetDefaults\",\n\n    Patched = \"Facet_Patched\",\n    ClearFilters = \"Facet_ClearFilters\",\n    AddFilter = \"Facet_AddFilter\",\n    RemoveFilter = \"Facet_RemoveFilter\",\n    Open = \"Facet_TreeOpen\"\n}\n\n// Types of events triggering a change event\nexport const FACET_CHANGE_EVENTS = [\n    FacetEventType.Loaded,\n    FacetEventType.Add,\n    FacetEventType.AddAll,\n    FacetEventType.Remove,\n    FacetEventType.RemoveAll,\n    FacetEventType.SetDefaults\n];\n\n\n// CRUD Events\nexport interface FacetChangeEvent {\n    type: FacetEventType;\n    query?: Query;\n    facet?: FacetState;\n}\n\nexport const ALL_FACETS = new InjectionToken<NamedFacetConfig[]>('ALL_FACETS');\nexport const DEFAULT_FACETS = new InjectionToken<FacetState[]>('DEFAULT_FACETS');\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class FacetService {\n\n    protected readonly _events = new Subject<FacetChangeEvent>();\n    protected readonly _changes = new Subject<FacetChangeEvent>();\n\n    constructor(\n        protected userSettingsService: UserSettingsWebService,\n        protected searchService: SearchService,\n        protected suggestService: SuggestService,\n        protected appService: AppService,\n        protected intlService: IntlService,\n        protected formatService: FormatService,\n        protected firstPageService: FirstPageService,\n        @Optional() @Inject(ALL_FACETS) public allFacets: NamedFacetConfig[],\n        @Optional() @Inject(DEFAULT_FACETS) public defaultFacets: FacetState[]){\n\n        // Listen to the user settings\n        this.userSettingsService.events.subscribe(event => {\n            // E.g. new login occurs\n            // ==> Menus need to be rebuilt\n            this.events.next({type: FacetEventType.Loaded});\n        });\n        // Listen to own events, to trigger change events\n        this._events.subscribe(event => {\n            if(FACET_CHANGE_EVENTS.indexOf(event.type) !== -1){\n                this.changes.next(event);\n            }\n        });\n    }\n\n    // GETTERS\n\n    /**\n     * Returns the list of this user's facets.\n     * The list is stored in the user settings (this is a redirection).\n     * Using this service creates the list of facets if it does not already exist.\n     */\n    public get facets() : FacetState[] {\n      if(!this.userSettingsService.userSettings)\n      this.userSettingsService.userSettings = {};\n      if(!this.userSettingsService.userSettings[\"facets\"]) {\n          this.userSettingsService.userSettings[\"facets\"] = [];\n          if(!!this.defaultFacets){\n              this.userSettingsService.userSettings[\"facets\"].push(...this.defaultFacets);\n              this.patchFacets();\n          }\n      }\n      return this.userSettingsService.userSettings[\"facets\"];\n    }\n\n    /**\n     * @returns a facet with the given name or undefined if it does not exist\n     * @param name\n     */\n    public facet(name: string|undefined): FacetState | undefined {\n        const i = this.facetIndex(name);\n        return this.facets[i];\n    }\n\n    /**\n     * Returns the list of facet config in the given container (position)\n     * @param position (default to 0 if there is a single container)\n     */\n    public getFacets(position: number = 0, results: Results) : FacetConfig<{}>[] {\n        if (!this.allFacets) {\n            return [];\n        }\n        return this.facets.filter(f => f.position === position)\n            .map(f => this.allFacets.find(_f => _f.name === f.name)!)\n            .filter(f => f && this.isFacetIncluded(f, results));\n    }\n\n    public isFacetIncluded(facet: FacetConfig<{}>, results: Results): boolean {\n      return !(facet.includedTabs && !facet.includedTabs.includes(results.tab)) && !facet.excludedTabs?.includes(results.tab)\n    }\n\n    /**\n     * Returns true if this facet is opened (in any container)\n     * @param facetName\n     */\n    public isFacetOpened(name): boolean {\n        return this.facetIndex(name) !== -1;\n    }\n\n    protected facetIndex(name: string|undefined): number {\n        return this.facets.findIndex(f => f.name === name);\n    }\n\n    /**\n     * Triggers any events regarding the facets\n     */\n    public get events(): Subject<FacetChangeEvent> {\n        return this._events;\n    }\n\n    /**\n     * Triggers when events affect the list of facets\n     * Cf. CHANGE_EVENTS list\n     */\n    public get changes() : Subject<FacetChangeEvent> {\n        return this._changes;\n    }\n\n\n    public addFacet(facet: FacetState){\n        this.facets.push(facet);\n        this.updateFacets(FacetEventType.Add, facet);\n    }\n\n    public removeFacet(facet: FacetState){\n        const i = this.facetIndex(facet.name);\n        if(i !== -1){\n            this.facets.splice(i,1);\n            this.updateFacets(FacetEventType.Remove, facet);\n        }\n    }\n\n    public setDefaultFacets() {\n        this.facets.splice(0);\n        if(this.defaultFacets) this.facets.push(...this.defaultFacets);\n        this.updateFacets(FacetEventType.SetDefaults);\n    }\n\n    public addAllFacets() {\n        this.facets.splice(0);\n        if(this.allFacets) this.allFacets.forEach(f => this.facets.push({name: f.name, position: 0}));\n        this.updateFacets(FacetEventType.AddAll);\n    }\n\n    public removeAllFacets() {\n        this.facets.splice(0);\n        this.updateFacets(FacetEventType.RemoveAll);\n    }\n\n    public updateFacets(type: FacetEventType, facet?: FacetState) {\n        this.events.next({type, facet});\n        const detail = facet? { facet: facet?.name } : undefined\n        this.patchFacets([{type, detail}]);\n    }\n\n    public createFacetMenu(): Action {\n\n        const outFacets: Action[] = [];\n\n        outFacets.push(new Action({\n            name: `set_defaults`,\n            text: \"msg#facet.filters.setDefaults\",\n            title: \"msg#facet.filters.setDefaults\",\n            action: () => {\n                this.setDefaultFacets();\n            }\n        }));\n\n        outFacets.push(new Action({\n            name: `add_all`,\n            text: \"msg#facet.filters.addAll\",\n            title: \"msg#facet.filters.addAll\",\n            action: () => {\n                this.addAllFacets();\n            }\n        }));\n\n        outFacets.push(new Action({\n            name: `remove_all`,\n            text: \"msg#facet.filters.removeAll\",\n            title: \"msg#facet.filters.removeAll\",\n            action: () => {\n                this.removeAllFacets();\n            }\n        }));\n\n        outFacets.push(ActionSeparator);\n\n        for (const facet of this.allFacets) {\n            outFacets.push(new Action({\n                name: `add_remove_${facet.name}`,\n                text: facet.title,\n                icon: facet.icon,\n                selected: !!this.facets?.find(userFacet => userFacet.name === facet.name),\n                title: this.facets?.find(userFacet => userFacet.name === facet.name) ? \"msg#facet.filters.add\" : \"msg#facet.filters.remove\",\n                action: () => {\n                    const fs = this.facets?.find(userFacet => userFacet.name === facet.name);\n                    if (fs) {\n                      this.removeFacet(fs);\n                    }\n                    else {\n                      this.addFacet({name: facet.name, position: 0});\n                    }\n                }\n            }));\n        }\n\n        return new Action({\n            name: \"facets_config\",\n            icon: \"fas fa-cog\",\n            title: \"msg#facet.filters.customizeFacets\",\n            scrollable: true,\n            children: outFacets\n        });\n    }\n\n    /**\n     * Updates facets in User settings.\n     * @param auditEvents : Audit Events to be triggered\n     * @returns an Observable which can be used to trigger further events\n     */\n    protected patchFacets(auditEvents?: AuditEvents) {\n      return this.userSettingsService.patch({facets: this.facets} as UserSettings, auditEvents)\n        .subscribe(() => this.events.next({type: FacetEventType.Patched}));\n    }\n\n    /**\n     * Verify that the search service can search the given query on the current route.\n     * - check that the query is the search service query\n     * - check that the route is a search route\n     * - check that the query is not an empty search\n     */\n    public canSearch(query: Query) {\n      return this.searchService.isSearchRouteActive() &&\n            (!this.searchService.isEmptySearch(query) || this.appService.getCCQuery(query.name)?.allowEmptySearch) &&\n            query === this.searchService.query;\n    }\n\n    /**\n     * Filter/Exclude an item in a facet and launch a search.\n     * Triggers an internal event and an Audit Event\n     * @param facetName\n     * @param aggregation\n     * @param items\n     * @param options\n     */\n    public addFilterSearch(\n      aggregation: Aggregation,\n      items: AggregationItem | AggregationItem[],\n      options: AddFilterOptions = {},\n      query = this.searchService.query,\n      facetName?: string): Promise<boolean> {\n\n      const success = this.addFilter(aggregation, items, options, query);\n      if(success) {\n        this.events.next({ type: FacetEventType.AddFilter, facet: this.facet(facetName), query });\n\n        if(this.canSearch(query)) {\n          return this.searchService.search(undefined, {\n            type: FacetEventType.AddFilter,\n            detail: {\n              item: (Array.isArray(items)? items[0] : items).value,\n              itembox: facetName,\n              itemcolumn: aggregation.column,\n              isitemexclude: options.not,\n              fromresultid: this.searchService.results?.id\n            }\n          });\n        }\n      }\n      return Promise.resolve(false);\n    }\n\n\n    /**\n     * Filter/Exclude one or more item(s) in a facet (without launching a search)\n     * @param facetName\n     * @param aggregation\n     * @param items\n     * @param options\n     * @param query the query on which to add the filter (defaults to search service query)\n     */\n    public addFilter(\n      aggregation: Aggregation,\n      items: AggregationItem | AggregationItem[],\n      options: AddFilterOptions = {},\n      query = this.searchService.query): boolean {\n\n      if (!items) {\n        return false;\n      }\n\n      items = Utils.asArray(items);\n\n      if(Utils.eqNC(aggregation.column, 'concepts')) {\n        query.addConcepts(items.map(i => i.value as string), options.not? '-' : '+');\n        return true;\n      }\n\n      let filter: Filter;\n      // Multiple value filter\n      if(items.length > 1 || options.not) {\n        const filters = items.map(i => this.toFilter(i, aggregation));\n        const operator = options.not? 'not' : options.and? 'and' : 'or';\n        filter = {operator, filters};\n      }\n      // Single value filter\n      else {\n        filter = this.toFilter(items[0], aggregation);\n      }\n\n      this.applyFilter(filter, query, options.replaceCurrent);\n      return true;\n    }\n\n\n    public applyFilterSearch(filter: Filter, query = this.searchService.query, replaceCurrent = true, facetName?: string) {\n      this.applyFilter(filter, query, replaceCurrent);\n      this.events.next({ type: FacetEventType.AddFilter, facet: this.facet(facetName), query });\n\n      if(this.canSearch(query)) {\n        this.searchService.search(undefined, {\n          type: FacetEventType.AddFilter,\n          detail: {\n            item: filter.display || (filter as ValueFilter).value?.toString() || JSON.stringify(filter),\n            itembox: facetName,\n            itemcolumn: (filter as ValueFilter).field,\n            \"from-result-id\": this.searchService.results?.id\n          }\n        });\n      }\n    }\n\n    public applyFilter(filter: Filter, query = this.searchService.query, replaceCurrent = true) {\n      if(replaceCurrent) {\n        const fields = this.getFields(filter);\n        query.removeFieldFilters(fields);\n      }\n      query.addFilter(filter);\n    }\n\n    protected getFields(filter: Filter): string[] {\n      if(isExprFilter(filter)) {\n        return filter.filters.map(f => this.getFields(f)).flat();\n      }\n      return [filter.field];\n    }\n\n    protected toFilter(item: AggregationItem, aggregation: Aggregation): Filter {\n      const field = aggregation.column;\n      const display = item.display;\n\n      if(aggregation.isTree) {\n        const _item = item as TreeAggregationNode;\n        return {field, value: _item.$path! + '*', display: _item.value}\n      }\n\n      else if(aggregation.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            if(this.appService.isNumber(aggregation.column)) {\n              value = +value;\n            }\n            return {field, operator, value};\n          });\n\n          if(filters.length === 2) {\n            return {operator: 'and', filters, display};\n          }\n          else if(filters.length === 1) {\n            return {...filters[0], display};\n          }\n          throw new Error(\"Failed to parse distribution expression\");\n        }\n      }\n\n      if(typeof item.value === \"string\" ) {\n        return { field, display: item.display, value: item.value, operator: \"contains\" };\n      }\n      return {field, value: item.value as boolean | number, display: item.display };\n    }\n\n    /**\n     * Clears the query from the current filters on the given facet\n     * @param field\n     * @param query the query to clear from the facet filters (defaults to search service query)\n     */\n    public clearFilters(field: string, query = this.searchService.query) {\n      if(Utils.eqNC(field, \"concepts\")) {\n        query.removeConcepts();\n      }\n      else {\n        query.removeFieldFilters(field);\n      }\n    }\n\n    /**\n     * Clears the query from the current selection on the given facet and perform a search\n     * @param facetName\n     */\n    public clearFiltersSearch(fields: string | string[], all: boolean, query = this.searchService.query, facetName?: string): Promise<boolean> {\n      fields = Utils.asArray(fields);\n\n      for(const field of fields) {\n        this.clearFilters(field, query);\n        this._events.next({type: FacetEventType.ClearFilters, facet: this.facet(facetName), query});\n      }\n\n      if(this.canSearch(query)) {\n        return this.searchService.search(undefined, {\n          type: FacetEventType.ClearFilters,\n          detail: {\n            itembox: facetName,\n            fromresultid: this.searchService.results?.id\n          }\n        });\n      }\n      return Promise.resolve(false);\n    }\n\n    /**\n     * Remove a filter and update the appropriate Select if it was previously included in a selection\n     * @param aggregation the aggregation that contains the item to remove\n     * @param item the aggregation item to remove from the query\n     * @param query the query on which to remove the filter (defaults to search service query)\n     */\n    public removeFilter(\n      aggregation: Aggregation,\n      item: AggregationItem,\n      query = this.searchService.query): Filter | undefined {\n\n      if(Utils.eqNC(aggregation.column, 'concepts')) {\n        const res = query.removeConcept(item.value as string);\n        return res? {field: 'concepts', value: item.value as string} : undefined;\n      }\n\n      const filter = this.toFilter(item, aggregation);\n      const removed = query.removeSameFilters(filter);\n\n      return removed[0];\n    }\n\n    /**\n     * Removes the aggregation from the search service query and refresh the search\n     * @param aggregation\n     * @param item\n     */\n    public removeFilterSearch(aggregation: Aggregation, item: AggregationItem, query = this.searchService.query, facetName?: string): Promise<boolean>{\n        const filter = this.removeFilter(aggregation, item, query);\n        if(filter) {\n            this._events.next({type: FacetEventType.RemoveFilter, facet: this.facet(facetName), query});\n            delete query.queryId; // SBA-154\n            if(this.canSearch(query)) {\n                return this.searchService.search(undefined, {\n                    type: FacetEventType.RemoveFilter,\n                    detail: {\n                        item: item.value,\n                        itembox: facetName,\n                        itemcolumn: aggregation.column,\n                        fromresultid: this.searchService.results ? this.searchService.results.id : null\n                    }\n                });\n            }\n        }\n        return Promise.resolve(false);\n    }\n\n    public makeRangeFilter(field: string, start: Date|number|string|undefined, end: Date|number|string|undefined, fromOperator: 'gte' | 'eq' = 'gte'): ExprFilter|NumericalFilter|undefined {\n      let from,to;\n      if(end instanceof Date) {\n        to = Utils.toSysDateStr(end);\n      } else {\n        to = end;\n      }\n      if(start instanceof Date) {\n        from = Utils.toSysDateStr(start);\n      } else {\n        from = start;\n      }\n\n      if(typeof start === 'undefined' && typeof end === 'undefined') {\n        return undefined;\n      }\n      if(typeof start === 'undefined') {\n          return {field, operator: 'lte', value: to!};\n      }\n      else if(typeof end === 'undefined') {\n        if(fromOperator === 'eq') {\n          const date = start as Date;\n          to = Utils.toSysDateStr(addDays(date, 1));\n\n          return { operator: 'and', filters: [\n            {field, operator: 'gte', value: from},\n            {field, operator: 'lt', value: to }\n          ]};\n        }\n\n        return {field, operator: 'gte', value: from!};\n      }\n      else {\n        return { operator: 'and', filters: [\n          {field, operator: 'gte', value: from},\n          {field, operator: 'lte', value: to}\n        ]}\n      }\n    }\n\n    /**\n     * Queries the server for data for this aggregation\n     * @param aggregation\n     * @param skip\n     * @param count\n     * @param query the query to use to fetch the data (default to search service query)\n     */\n    public loadData(\n        aggregation: Aggregation,\n        query = this.searchService.query,\n        searchInactive = true): Observable<AggregationItem[]> {\n\n        const skip = aggregation.items?.length || 0;\n        const count = aggregation.$cccount;\n\n        query = Utils.copy(query);\n        query.action = \"aggregate\";\n        query.aggregations = {};\n        query.aggregations[aggregation.name] = {skip, count};\n        return this.searchService.getResults(query, undefined, {searchInactive}).pipe(\n            map(results => {\n                const data = results.aggregations[0];\n                const items = aggregation.items || [];\n                if(data?.items) {\n                    items.push(...data.items);\n                }\n                aggregation.$hasMore = !!data?.$hasMore;\n                return items;\n            })\n        );\n    }\n\n    /**\n     * Get suggestions given a text and a field name, using the Suggest service\n     * @param text\n     * @param field\n     * @param suggestQuery\n     */\n    public suggest(text: string, field: string, query = this.searchService.query): Observable<Suggestion[]> {\n      return this.suggestService.get(this.appService.suggestQueries[0], text, [field], query);\n    }\n\n    /**\n     * Returns true if this facet has at least one active selection\n     * filtering the search\n     * @param field\n     */\n    public hasFiltered(field: string | string[], query = this.searchService.query) : boolean {\n      return !!this.findFilter(field, query);\n    }\n\n    /**\n     * Returns an active selection of this facet filtering the search\n     * Returns it as a filter\n     * @param field\n     */\n    public findFilter(field: string | string[], query = this.searchService.query) : Filter | undefined {\n      field = Utils.asArray(field);\n\n      if(field.find(f => Utils.eqNC(f, \"concepts\"))) {\n        const concepts = query.getConcepts();\n        return concepts.length? {field: \"concepts\", value: concepts[0]} : undefined;\n      }\n\n      return query?.findFilter(getFieldPredicate(field));\n    }\n\n    /**\n     * Look for an aggregation with the given name in the search results and returns it.\n     * If this.searchService.results is used, then it takes care of initializing the aggregation items to insert their $column property.\n     * If not, fallback to results?.aggregations since $aggregationMap will never exists\n     * @param aggregationName\n     * @param results The search results can be provided explicitly or taken from the SearchService implicitly.\n     */\n    getAggregation(\n        aggregationName: string,\n        results = this.searchService.results,\n    ): ListAggregation | TreeAggregation | undefined {\n        return results?.$aggregationMap?.[aggregationName.toLowerCase()] || results?.aggregations.find((agg) => agg.name === aggregationName);\n    }\n\n    /**\n     * Opens a Tree node of the given tree facet by querying data from the server\n     * Takes care of initializing the Node aggregation items to insert their properties ($column, $path, $opened, $level)\n     * @param facetName\n     * @param aggregation\n     * @param item\n     * @param levelCallback A callback method called at every level of the tree.\n     * Can be used to read or alter the properties of the nodes (opening, closing), or node list (sorting)\n     */\n    open(\n        aggregation: TreeAggregation,\n        item: TreeAggregationNode,\n        query = this.searchService.query,\n        searchInactive = true,\n        facetName?: string,\n    ): Observable<Results> {\n\n        const value = item.$path + \"*\";\n        query = Query.copy(query);\n        query.action = \"open\";\n        const expr = `${aggregation.column}:${Utils.escapeExpr(value)}`;\n        query.addOpen(expr, aggregation.name);\n\n        this.events.next({type: FacetEventType.Open, facet: this.facet(facetName), query});\n        return this.searchService.getResults(query, undefined, {searchInactive}).pipe(\n            tap(results => {\n                const subAggregation = results.aggregations[0] as TreeAggregation;\n                if (item.$path && aggregation.items && subAggregation.items) {\n                    const source = this.getAggregationNode(subAggregation.items, item.$path);\n                    const target = this.getAggregationNode(aggregation.items, item.$path);\n                    if (source && target) {\n                        target.items = source.items;    // Insert the new data (source) into the original (target)\n                    }\n                }\n            })\n        );\n    }\n\n    protected getAggregationNode(nodes: TreeAggregationNode[], path: string): TreeAggregationNode | undefined {\n        if (!nodes || nodes.length === 0) {\n            return undefined;\n        }\n        const names = Utils.splitTreepath(path);\n        let node: TreeAggregationNode | undefined;\n        for (let _i = 0, _a = names; _i < _a.length; _i++) {\n            if (!nodes || nodes.length === 0) {\n                return undefined;\n            }\n            const name = _a[_i].toLocaleLowerCase();\n            node = undefined;\n            for (let _j = 0, _b = nodes; _j < _b.length; _j++) {\n                const _node = _b[_j];\n                if ((<string>_node.value).toLocaleLowerCase() === name) {\n                    node = _node;\n                    break;\n                }\n            }\n            if (!node) {\n                return undefined;\n            }\n            nodes = node.items;\n        }\n        return node;\n    }\n\n    /**\n     * Convert Suggestion to AggregationItem\n     * @param suggest a Suggestion object\n     *\n     * @returns AggregationItem object with is `$column` property defined.\n     * On boolean type, convert `value` property to boolean\n     */\n    suggestionToAggregationItem(suggest: Suggestion): AggregationItem {\n        const item: AggregationItem = {\n            value: suggest.normalized || suggest.display,\n            display: suggest.display,\n            count: +(suggest.frequency || 0),\n            $column: this.appService.getColumn(suggest.category)\n        };\n        if (item.$column?.eType === EngineType.bool) {\n            item.value = Utils.isTrue(item.value);\n        }\n        return item;\n    }\n\n    /**\n     * Converts a list of suggestions into a structure of TreeAggregationNodes\n     * @param suggests Suggestions to convert\n     * @param searchTerm The searched term in the suggestions\n     * @param aggregation The tree aggregations\n     */\n    suggestionsToTreeAggregationNodes(suggests: Suggestion[], searchTerm: string, aggregation: Aggregation | undefined): TreeAggregationNode[] {\n        const suggestions: TreeAggregationNode[] = [];\n        if(suggests.length > 0) {\n            const path2node = new Map<string, TreeAggregationNode>();\n\n            // searchTerm should be escaped\n            const term = searchTerm.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n            const searchPattern = diacriticsInsensitiveRegexp(term, '\\\\b', '', 'i');\n            const column = this.appService.getColumn(aggregation?.column);\n            suggests.forEach(suggest => {\n                if(suggest.display.length > 1) {\n                    const match = searchPattern.exec(suggest.display);\n                    this.addNode(suggestions, path2node, \"/\", suggest.display, +(suggest.frequency || 0), 0, (match?.index || 0)+searchTerm.length, column);\n                }\n            });\n        }\n        return suggestions;\n    }\n\n    /**\n     * Utility recursive function to generate a tree aggregation structure from\n     * a list of suggestions\n     */\n    protected addNode(items: TreeAggregationNode[],\n            path2node: Map<string,TreeAggregationNode>,\n            parentPath: string,\n            path: string,\n            count: number,\n            level: number,\n            matchend: number,\n            column: CCColumn | undefined) {\n\n        const nextChild = path.indexOf(\"/\", parentPath.length); // path = /Cities/Paris/17e/   parentPath = /Cities/\n        const currentPath = path.substring(0, nextChild+1); // => currentPath = /Cities/Paris/\n        let node = path2node.get(currentPath);\n\n        if(!node) {\n            const value = path.substring(parentPath.length, nextChild);\n            node = {\n                value,\n                count,\n                items: [],\n                hasChildren: false,\n                $column: column,\n                $level: level,\n                $opened: matchend >= currentPath.length,\n                $path: currentPath\n            };\n            path2node.set(currentPath, node);\n            items.push(node);\n        }\n\n        if(currentPath.length < path.length) {\n            node.hasChildren = true;\n            this.addNode(node.items, path2node, currentPath, path, count, level+1, matchend, column);\n        }\n    }\n\n    /**\n     * This function returns the query that was used to generate the given data.\n     * If the results object is the \"first page\", then it was obtained from a blank search\n     * If the results object is the searchService.results, then it was obtained from the searchService.query\n     * It could also be an unrelated query so we return sensible defaults\n     */\n    getDataQuery(results: Results, query?: Query): Query {\n        // If this facet displays the \"first page\" (blank search), we want to actually get suggestiong corresponding to a blank search\n        const isFirstPage = results.aggregations === this.firstPageService.firstPage?.aggregations;\n        // If this facet displays the SearchService results, we want to use the corresponding query for suggestion, which may be different from the \"edited\" query (this.query)\n        const isMainResults = results.aggregations === this.searchService.results?.aggregations;\n        return isFirstPage ? this.searchService.makeQuery() :\n            isMainResults? this.searchService.query :\n            query || this.searchService.query;\n    }\n\n\n}\n","import {Component, Output, TemplateRef, EventEmitter, ViewChild} from \"@angular/core\";\nimport {Action} from \"@sinequa/components/action\";\n\n/**\n * This interface should be implemented by facet components, which expose\n * a list of actions and event listeners\n */\n@Component({\n    template: \"\",\n    standalone: false\n})\nexport abstract class AbstractFacet {\n\n    /**\n     * List of custom actions of this facet\n     */\n    public get actions(): Action[] { return []; }\n\n    /**\n     * Event emitter triggered when the list of action changes\n     */\n    @Output() public actionsChanged = new EventEmitter<Action[]>();\n\n    /**\n     * Template for the settings editor of this facet, if any\n     */\n    @ViewChild(\"settingsTpl\", {static: true, read: TemplateRef}) public settingsTpl?: TemplateRef<any>;\n\n    /**\n     * Template for header of this facet, if any\n     */\n    @ViewChild(\"headerTpl\", {static: true, read: TemplateRef}) public headerTpl?: TemplateRef<any>;\n\n    /**\n     * Template for a sub-header of this facet, if any. This appears below the header\n     */\n    @ViewChild(\"subHeaderTpl\", {static: true, read: TemplateRef}) public subHeaderTpl?: TemplateRef<any>;\n\n    /**\n     * Template for footer of this facet, if any\n     */\n    @ViewChild(\"footerTpl\", {static: true, read: TemplateRef}) public footerTpl?: TemplateRef<any>;\n\n    /**\n     * Method called when a facet is collapsed\n     */\n    public onCollapse(collapsed: boolean){}\n\n    /**\n     * Method called when a facet is resized via an action (not accounting for window resizing)\n     */\n    public onExpand(expanded: boolean){}\n\n    /**\n     * Method called when the settings of this facet are opened\n     */\n    public onOpenSettings(settingsOpened: boolean){}\n\n    /**\n     * Method enabling the facet component to be hidden (if, for example there is no data to display)\n     */\n    public isHidden(): boolean {\n        return false;\n    }\n\n}","import { Observable, Subject, Subscription, debounceTime, distinctUntilChanged, finalize, of, switchMap } from 'rxjs';\n\nimport { AfterViewInit, ChangeDetectionStrategy, ChangeDetectorRef, Component, ContentChild, ElementRef, Input, OnChanges, OnDestroy, SimpleChanges, TemplateRef, ViewChild } from \"@angular/core\";\nimport { FormControl, FormGroup } from '@angular/forms';\n\n\nimport { SearchService } from \"@sinequa/components/search\";\nimport { Query } from \"@sinequa/core/app-utils\";\nimport { Utils } from \"@sinequa/core/base\";\nimport { Aggregation, AggregationItem, ListAggregation, Results, Suggestion, TreeAggregation, TreeAggregationNode } from \"@sinequa/core/web-services\";\n\nimport { AbstractFacet } from \"../../abstract-facet\";\nimport { FacetConfig } from \"../../facet-config\";\nimport { AddFilterOptions, FacetService } from \"../../facet.service\";\n\nexport interface FacetListParams {\n    showCount?: boolean;\n    searchable?: boolean;\n    focusSearch?: boolean;\n    allowExclude?: boolean;\n    allowOr?: boolean;\n    allowAnd?: boolean;\n    displayEmptyDistributionIntervals?: boolean;\n    acceptNonAggregationItemFilter?: boolean;\n    replaceCurrent?: boolean;\n    suggestQuery?: string;\n}\n\nexport interface FacetListConfig extends FacetConfig<FacetListParams> {\n    type: 'list';\n}\n\n@Component({\n    selector: \"sq-facet-list\",\n    templateUrl: \"./facet-list.html\",\n    styleUrls: [\"./facet-list.scss\"],\n    changeDetection: ChangeDetectionStrategy.OnPush,\n    standalone: false\n})\nexport class BsFacetList extends AbstractFacet implements FacetListParams, OnChanges, OnDestroy, AfterViewInit {\n    @Input() name: string; // If omitted, the aggregation name is used\n    @Input() results: Results;\n    @Input() query?: Query;\n    @Input() aggregation: string;\n    @Input() showCount: boolean = true; // Show the number of occurrences\n    @Input() searchable: boolean = true; // Allow to search for items in the facet\n    @Input() focusSearch: boolean = false;\n    @Input() allowExclude: boolean = true; // Allow to exclude selected items\n    @Input() allowOr: boolean = true; // Allow to search various items in OR mode\n    @Input() allowAnd: boolean = false; // Allow to search various items in AND mode\n    @Input() displayEmptyDistributionIntervals: boolean = false; // If the aggregation is a distribution, then this property controls whether empty distribution intervals will be displayed\n    @Input() acceptNonAggregationItemFilter = true; // when false, filtered items which don't match an existing aggregation item, should not be added to filtered list\n    @Input() replaceCurrent = false; // if true, the previous \"select\" is removed first\n    // Specific to tree facets\n    @Input() expandedLevel: number = 2;\n\n    @ViewChild(\"searchInput\") searchInput: ElementRef<HTMLInputElement>;\n\n    /**\n     * Template used with content projection strategy, allowing user to customize each list item\n     * When not set, the default list item renderer is used.\n     *\n     * @example\n     * ```typescript\n     * <sq-facet-list [results]=\"results\" aggregation=\"Person\">\n     *   <ng-template #itemTpl let-item>\n     *      <li>{{ item.value }}</li>\n     *   <ng-template>\n     * </sq-facet-list>\n     * ```\n     */\n    @ContentChild(\"itemTpl\", { static: true, read: TemplateRef}) public itemTpl?: TemplateRef<any>;\n\n    items: (AggregationItem | TreeAggregationNode)[] = [];\n\n    data: ListAggregation | TreeAggregation | undefined;\n    suggests: Suggestion[] | undefined;\n    selected: AggregationItem[] = [];\n\n    // Search\n    searchGroup: FormGroup<{searchQuery: FormControl<string>}>;\n    suggestDelay = 200;\n    searchActive = new Subject<boolean>();\n\n    showCheckbox = false;\n\n    constructor(\n        protected searchService: SearchService,\n        protected facetService: FacetService,\n        protected changeDetectorRef: ChangeDetectorRef\n    ) {\n        super();\n\n        const searchQuery = new FormControl(\"\", {nonNullable: true});\n        this.searchGroup = new FormGroup({searchQuery});\n\n        this.sub.add(\n            searchQuery.valueChanges.pipe(\n                debounceTime(this.suggestDelay),\n                distinctUntilChanged(),\n                switchMap(text => this.onSearch(text))\n            ).subscribe(suggests => {\n                this.suggests = suggests;\n                this.updateItems()\n            })\n        );\n\n    }\n\n    /**\n     * OnChanges listener awaits new results from the search service\n     * This completely resets the display\n     * @param changes\n     */\n    ngOnChanges(changes: SimpleChanges) {\n        if (this.showCount === undefined) this.showCount = true;\n        if (this.searchable === undefined) this.searchable = true;\n        if (this.allowExclude === undefined) this.allowExclude = true;\n        if (this.allowOr === undefined) this.allowOr = true;\n        if (this.allowAnd === undefined) this.allowAnd = false;\n        this.showCheckbox = this.allowOr || this.allowAnd || this.allowExclude;\n\n        if (changes.results || changes.aggregation) {     // New data from the search service\n            this.data = this.facetService.getAggregation(this.aggregation, this.results);\n            if(this.data?.isTree && this.data.items) {\n                this.expandItems(this.data.items as TreeAggregationNode[]);\n            }\n            this.data?.items?.forEach(item => item.$selected = false); // Reinitialize the source aggregation's selected items\n            this.selected = [];\n            this.clearSearch();\n            this.updateItems();\n        }\n    }\n\n    sub: Subscription = new Subscription();\n    ngOnDestroy(): void {\n        this.sub.unsubscribe();\n    }\n\n    ngAfterViewInit(): void {\n        if(this.focusSearch) {\n            this.searchInput?.nativeElement.focus();\n        }\n    }\n\n    updateItems() {\n        if(!this.data) {\n            this.items = [];\n            return;\n        }\n\n        if (this.searchable && this.suggests) {\n            if(this.data.isTree) {\n                this.items = this.facetService.suggestionsToTreeAggregationNodes(this.suggests, this.searchControl.value, this.data);\n            }\n            else {\n                this.items = this.suggests.slice(0, this.data.$cccount)\n                    .map(item => this.facetService.suggestionToAggregationItem(item));\n            }\n        }\n        else {\n            this.items = this.data.items || [];\n        }\n\n        const selected = this.selected.slice();\n        const filtered = this.data.$filtered.slice();\n\n        if(this.data.isTree) {\n            this.updateTreeItems(filtered, selected);\n        }\n        else {\n            this.updateListItems(filtered, selected);\n        }\n\n        this.changeDetectorRef.detectChanges();\n    }\n\n    protected updateTreeItems(filtered: AggregationItem[], selected: AggregationItem[]) {\n        // Set the $selected and $filtered flags\n        Utils.traverse(this.items as TreeAggregationNode[], (lineage, node) => {\n            node.$selected = this.findAndSplice(selected, node);\n            node.$filtered = this.findAndSplice(filtered, node);\n            if(node.$selected || node.$filtered) {\n                lineage.filter(n => n.items?.length && n !== node).forEach(n => n.$opened = true);\n            }\n            return false;\n        });\n    }\n\n    protected updateListItems(filtered: AggregationItem[], selected: AggregationItem[]) {\n\n        if(this.data?.isDistribution && !this.displayEmptyDistributionIntervals) {\n            this.items = this.items.filter(item => item.count > 0);\n        }\n\n        // Set the $selected and $filtered flags\n        for(const item of this.items) {\n            item.$selected = this.findAndSplice(selected, item);\n            item.$filtered = this.findAndSplice(filtered, item);\n        }\n\n        this.items = [\n            ...filtered, // Remaining filtered items not found in this.items\n            ...selected, // Remaining selected items not found in this.items\n            ...this.items\n        ];\n    }\n\n\n    // Filtered items\n\n    /**\n     * Called when clicking on a facet item text\n     * @param item\n     * @param event\n     */\n    filterItem(item: AggregationItem, event?: Event) {\n        if (!item.$filtered) {\n            const currentFiltered = this.data?.$filtered ?? [];\n            if (currentFiltered.length > 0) {\n                this.addFilter([...currentFiltered, item], {replaceCurrent: true});\n            } else {\n                this.addFilter(item);\n            }\n        }\n        else {\n            this.removeFilter(item);\n        }\n        event?.stopPropagation();\n        return false;\n    }\n\n    addFilter(item: AggregationItem|AggregationItem[], options: AddFilterOptions = {}) {\n        if(this.data) {\n            options.replaceCurrent ??= this.replaceCurrent;\n            if(!this.allowOr && this.allowAnd) {\n              options.and = true; // The default mode is OR, unless explicitly forbidden\n            }\n            this.facetService.addFilterSearch(this.data, item, options, this.query, this.name);\n        }\n    }\n\n    removeFilter(item: AggregationItem) {\n        if(this.data) {\n            this.facetService.removeFilterSearch(this.data, item, this.query, this.name);\n        }\n    }\n\n    clearAllFilters() {\n        if(this.data) {\n            this.facetService.clearFiltersSearch(this.data.column, true, this.query, this.name);\n        }\n    }\n\n    /**\n     * Called when selecting/unselecting an item in the facet\n     * @param item\n     */\n    selectItem(item: AggregationItem) {\n        if (!item.$filtered) {\n            const index = this.selected.findIndex(i => this.compareItems(item, i));\n            if (index === -1) {\n                this.selected.push(item);\n                item.$selected = true;\n            } else {\n                this.selected.splice(index, 1);\n                delete item.$selected;\n            }\n            this.updateItems();\n        }\n        // Filtered items cannot be selected.\n        // So, the behavior becomes equivalent to a click on the item.\n        else {\n            this.filterItem(item);\n        }\n    }\n\n    /**\n     * Called on loadMore button click\n     */\n    loadMore() {\n        if (this.data) {\n            const query = this.facetService.getDataQuery(this.results, this.query);\n            const data$ = this.facetService.loadData(this.data, query)\n            this.whileSearchActive(data$)\n                .subscribe(() => this.updateItems());\n        }\n        return false; // Avoids following href\n    }\n\n\n    /**\n     * Expand/Collapse a Tree node (the data may need to downloaded from the server)\n     * @param item\n     */\n     open(item: TreeAggregationNode, event: Event){\n        if (this.data && item.hasChildren) {\n            item.$opened = !item.$opened;\n            if (!item.items || item.items.length === 0) {\n                item.$opening = true;\n                const query = this.facetService.getDataQuery(this.results, this.query);\n                this.facetService.open(this.data as TreeAggregation, item, query, true, this.name)\n                    .subscribe(() => {\n                        item.$opening= false;\n                        this.updateItems();\n                    });\n            }\n        }\n        event.stopPropagation();\n        return false; // Prevent default action\n    }\n\n    expandItems(items: TreeAggregationNode[]) {\n        Utils.traverse(items, (lineage, node, level) => {\n            node.$selected = false;\n            if(!node.$opened && node.items?.length >= 0 && level < this.expandedLevel){\n                node.$opened = true;\n            }\n            return false;\n        });\n    }\n\n    // Suggest / Search\n\n    get searchControl(): FormControl {\n        return this.searchGroup.get(\"searchQuery\") as FormControl;\n    }\n\n    onSearch(text: string): Observable<Suggestion[] | undefined> {\n        if(text.trim() === '' || !this.data) {\n            return of(undefined);\n        }\n        return this.getSuggests(text, this.data);\n    }\n\n    clearSearch() {\n        if(this.searchControl?.value) {\n            this.searchControl.setValue(\"\"); // Remove suggestions if some remain\n        }\n    }\n\n    /**\n     * Uses the `suggestfield` API to retrieve suggestions from the server\n     * The suggestions **override** the data from the distribution (until search results are cleared)\n     */\n    getSuggests(text: string, data: Aggregation): Observable<Suggestion[]> {\n        const query = this.facetService.getDataQuery(this.results, this.query);\n        const suggests$ = this.facetService.suggest(text, data.column, query);\n        return this.whileSearchActive(suggests$);\n    }\n\n\n    protected whileSearchActive<T>(observable: Observable<T>) {\n        this.searchActive.next(true);\n        return observable.pipe(\n            finalize(() => this.searchActive.next(false))\n        );\n    }\n\n    protected compareItems(a: AggregationItem, b: AggregationItem) {\n        // If the aggregation is a tree, we must compare paths, as \"value\" has a the value for a single node\n        if (this.data?.isTree) {\n            return (\n                (a as TreeAggregationNode).$path === (b as TreeAggregationNode).$path\n            );\n        }\n        if (a.value === b.value) {\n            return true;\n        }\n        // Fallback comparison on display value only if values are different and \"display\" exists\n        if (a.display && b.display) {\n            return a.display === b.display;\n        }\n        return false;\n    }\n\n    /**\n     * Finds and removes an item from the given array of aggregation items.\n     *\n     * @param items - The array of aggregation items to search through\n     * @param item - The aggregation item to find and remove\n     * @returns `true` if the item was found and removed, `false` otherwise\n     *\n     * @remarks\n     * This method uses `compareItems()` to determine item equality and modifies\n     * the input array by removing the first matching item if found.\n     */\n    protected findAndSplice(items: AggregationItem[], item: AggregationItem) {\n        const index = items.findIndex(i => this.compareItems(i, item));\n        if(index !== -1) {\n            items.splice(index, 1);\n        }\n        return index !== -1;\n    }\n\n    /* AbstractFacet abstract methods */\n    override isHidden(): boolean {\n        return !this.data?.items?.length;\n    }\n\n}\n","<div [hidden]=\"isHidden()\">\n\n    <div *ngIf=\"searchable\" class=\"p-1\" [formGroup]=\"searchGroup\">\n      <input class=\"form-control form-control-sm\" #searchInput\n          type=\"search\" spellcheck=\"false\" autocomplete=\"off\"\n          formControlName=\"searchQuery\"\n          [placeholder]=\"'msg#facet.searchPlaceholder' | sqMessage\">\n    </div>\n\n    <div class=\"position-relative\">\n      <sq-loading-bar [active]=\"searchActive | async\"></sq-loading-bar>\n    </div>\n\n    <ul class=\"list-group list-group-flush\">\n      <ng-container *ngFor=\"let item of items\"\n          [ngTemplateOutlet]=\"itemTpl || defaultItemTpl\"\n          [ngTemplateOutletContext]=\"{$implicit: item, instance: this}\">\n      </ng-container>\n\n      <li *ngIf=\"!suggests && data?.$hasMore\"\n          class=\"list-group-item list-group-item-action text-center\"\n          role=\"button\" (click)=\"loadMore()\">\n          <span>{{'msg#facet.loadMore' | sqMessage}}</span>\n      </li>\n\n      <li class=\"list-group-item text-center py-3\" *ngIf=\"suggests?.length === 0\">\n          <span>{{'msg#facet.searchNoResult' | sqMessage}}</span>\n      </li>\n    </ul>\n\n</div>\n\n<!-- Template for displaying an aggregation item-->\n<ng-template #defaultItemTpl let-item>\n    <li class=\"list-group-item list-group-item-action d-flex\"\n        [ngClass]=\"{'sq-selected': item.$selected, 'sq-filtered': item.$filtered}\"\n        role=\"button\" (click)=\"filterItem(item, $event)\">\n\n        <!-- Tree aggregation opener -->\n        <span *ngIf=\"data?.isTree\" class=\"item-opener\" [ngStyle]=\"{'--depth' : item.$level ?? 0}\">\n            <a *ngIf=\"item.hasChildren\" href=\"#\" (click)=\"open(item, $event)\" [title]=\"(item.$opened ? 'msg#facet.closeItem' : 'msg#facet.openItem') | sqMessage\">\n                <span *ngIf=\"item.$opening\" class=\"fas fa-sync fa-fw fa-spin\"></span>\n                <span *ngIf=\"!item.$opening && item.$opened\" class=\"fas fa-caret-down fa-fw\"></span>\n                <span *ngIf=\"!item.$opening && !item.$opened\" class=\"fas fa-caret-right fa-fw\"></span>\n            </a>\n            <span *ngIf=\"!item.hasChildren\" class=\"fas fa-fw\"></span>\n        </span>\n\n        <!-- Checkbox for multi-selection -->\n        <div>\n            <input type=\"checkbox\" class=\"form-check-input me-2\" tabindex=\"-1\"\n                [checked]=\"item.$selected || item.$filtered\"\n                [disabled]=\"item.$filtered\"\n                (change)=\"selectItem(item)\"\n                (click)=\"$event.stopPropagation()\"\n                *ngIf=\"showCheckbox\">\n        </div>\n\n        <!-- item display / value -->\n        <span class=\"text-truncate me-auto\" [title]=\"item | sqValue:item.$column\">\n            {{item | sqValue:item.$column}}\n        </span>\n\n        <!-- Item counter -->\n        <span *ngIf=\"showCount && item.count\" class=\"ms-2 text-muted small\" style=\"z-index: 1;\">{{item.count | sqNumber}}</span>\n    </li>\n\n    <!-- Tree aggregation sub-elements -->\n    <ng-container *ngIf=\"item.$opened\">\n        <ng-container *ngFor=\"let i of item.items\"\n            [ngTemplateOutlet]=\"itemTpl || defaultItemTpl\"\n            [ngTemplateOutletContext]=\"{$implicit: i, instance: this}\">\n        </ng-container>\n    </ng-container>\n</ng-template>\n\n<ng-template #headerTpl>\n  <div class=\"flex-grow-1 text-nowrap text-end\">\n    <div class=\"btn-group btn-group-sm\" role=\"group\" *ngIf=\"showCheckbox && selected.length > 0\">\n      <button type=\"button\" class=\"btn btn-primary\" (click)=\"addFilter(selected)\">\n        <b>{{'msg#facet.apply' | sqMessage}}</b>\n      </button>\n      <button *ngIf=\"allowExclude || ((allowAnd || allowOr) && selected.length > 1)\"\n        type=\"button\" class=\"btn btn-primary dropdown-toggle dropdown-toggle-split\"\n        data-bs-toggle=\"dropdown\" aria-expanded=\"false\">\n        <span class=\"visually-hidden\">Toggle Dropdown</span>\n      </button>\n      <ul class=\"dropdown-menu\">\n        <li *ngIf=\"allowOr && selected.length > 1\">\n          <a class=\"dropdown-item\" role=\"button\" (click)=\"addFilter(selected)\">{{'msg#facet.applyOr' | sqMessage}}</a>\n        </li>\n        <li *ngIf=\"allowAnd && selected.length > 1\">\n          <a class=\"dropdown-item\" role=\"button\" (click)=\"addFilter(selected, {and: true})\">{{'msg#facet.applyAnd' | sqMessage}}</a>\n        </li>\n        <li *ngIf=\"allowExclude\">\n          <a class=\"dropdown-item\" role=\"button\" (click)=\"addFilter(selected, {not: true})\">{{'msg#facet.applyNot' | sqMessage}}</a>\n        </li>\n      </ul>\n    </div>\n\n    <button class=\"btn btn-sm btn-light ms-1\" *ngIf=\"data?.$filtered.length\" [sqTooltip]=\"'msg#facet.clearSelects' | sqMessage\" (click)=\"clearAllFilters()\">\n      <i class=\"sq-filter-clear\"></i>\n    </button>\n  </div>\n</ng-template>\n","import {Component, Input, OnChanges, SimpleChanges, AfterViewInit, OnDestroy, ViewChild, ElementRef, EventEmitter} from \"@angular/core\";\nimport {Subscription} from \"rxjs\";\nimport {Utils} from \"@sinequa/core/base\";\nimport {AppService, FormatService, Query} from \"@sinequa/core/app-utils\";\nimport {IntlService} from \"@sinequa/core/intl\";\nimport {CCColumn, Results, Aggregation} from \"@sinequa/core/web-services\";\nimport {Options, LabelType, ChangeContext} from \"@angular-slider/ngx-slider\";\nimport { getDay, getTime, getWeek, getWeekYear, isValid, parseISO } from \"date-fns\";\nimport {FacetService} from \"../../facet.service\";\nimport {UIService} from \"@sinequa/components/utils\";\nimport {AbstractFacet} from \"../../abstract-facet\";\nimport { Action } from '@sinequa/components/action';\nimport { FacetConfig } from \"../../facet-config\";\n\n\nexport enum RoundTarget {\n    number,\n    year,\n    month,\n    week, // ISO\n    day\n}\n\nexport enum RoundType {\n    up,\n    down,\n    nearest\n}\n\nexport interface StepDef {\n    step: string;\n    format: string;\n    minRange: string;\n    active: boolean;\n}\n\nexport interface FacetRangeParams {\n    min?: string | number | Date;\n    max?: string | number | Date;\n    stepDefs?: StepDef[];\n}\n\nexport interface FacetRangeConfig extends FacetConfig<FacetRangeParams> {\n    type: 'range';\n}\n\n@Component({\n    selector: \"sq-facet-range\",\n    templateUrl: \"./facet-range.html\",\n    standalone: false\n})\nexport class BsFacetRange extends AbstractFacet implements FacetRangeParams, OnChanges, AfterViewInit, OnDestroy {\n    @Input() name?: string;\n    @Input() results: Results;\n    @Input() query?: Query;\n    @Input() aggregation: string;\n    @Input() min : string | number | Date;\n    @Input() max : string | number | Date;\n    @Input() stepDefs: StepDef[];\n    @ViewChild(\"slider\", {static: false}) slider: ElementRef;\n\n    // Aggregation from the Results object\n    data: Aggregation | undefined;\n\n    options: Options;\n    value: number;\n    highValue: number;\n    startValue: number;\n    startHighValue: number;\n    sliderActive: boolean;\n    rangeActive: boolean;\n    rangeSelected: boolean;\n    manualRefresh = new EventEmitter<void>();\n    initDone: boolean;\n    protected column: CCColumn | undefined;\n    protected roundTarget: RoundTarget;\n    protected roundMultiple: number;\n    protected localeChange: Subscription;\n    protected format: string;\n\n    clearFiltersAction: Action;\n    applyFiltersAction: Action;\n    constructor(\n        private facetService: FacetService,\n        protected appService: AppService,\n        protected formatService: FormatService,\n        protected intlService: IntlService,\n        protected uiService: UIService) {\n\n        super();\n\n        this.clearFiltersAction = new Action({\n            icon: \"sq-filter-clear\",\n            title: \"msg#facet.range.clear\",\n            action: () => this.clearRange()\n        });\n\n        this.applyFiltersAction = new Action({\n            icon: \"fas fa-filter\",\n            title: \"msg#facet.range.apply\",\n            action: () => this.applyRange()\n        });\n    }\n\n    protected translate = (value: number, label: LabelType): string => {\n        const value1 = this.roundNearest(value); // to accommodate fractional steps generated for years/months\n\n        if (this.format) {\n            if (this.column && AppService.isDate(this.column)) {\n                const date = new Date(value1);\n                return this.intlService.formatMessage(this.format, {date: date, time: Utils.getTime(date), weekDay: getDay(date), week: getWeek(date), weekYear: getWeekYear(date)});\n            }\n            else {\n                return this.intlService.formatMessage(this.format, {value: value1});\n            }\n        }\n        return this.formatService.formatFieldValue(this.column && AppService.isDate(this.column) ? new Date(value1) : value1, this.column);\n    }\n\n    protected roundAdjustment(value: number, multiple: number, roundType: RoundType): number {\n        switch (roundType) {\n            case RoundType.up:\n                return multiple - value % multiple;\n            default:\n            case RoundType.down:\n                return -(value % multiple);\n            case RoundType.nearest: {\n                const adjustUp = multiple - value % multiple;\n                const adjustDown = -(value % multiple);\n                return Math.abs(adjustUp) <= Math.abs(adjustDown) ? adjustUp : adjustDown;\n            }\n        }\n    }\n\n    protected _roundNumberUp(value: number, step: number): number {\n        return (value >= 0 ? Math.ceil(value / step) : Math.floor(value / step)) * step;\n    }\n\n    protected _roundNumberDown(value: number, step: number): number {\n        return (value >= 0 ? Math.floor(value / step) : Math.ceil(value / step)) * step;\n    }\n\n    protected _roundNumber(value: number, step: number, roundType: RoundType): number {\n        switch (roundType) {\n            case RoundType.up:\n                return this._roundNumberUp(value, step);\n            default:\n            case RoundType.down:\n                return this._roundNumberDown(value, step);\n            case RoundType.nearest: {\n                const up = this._roundNumberUp(value, step);\n                const down = this._roundNumberDown(value, step);\n                return Math.abs(up - value) <= Math.abs(down - value) ? up : down;\n            }\n        }\n    }\n\n    protected _getNearestDate(date: Date, upper: Date, lower: Date): Date {\n        return Math.abs(upper.getTime() - date.getTime()) <= Math.abs(lower.getTime() - date.getTime()) ? upper : lower;\n    }\n\n    protected _getNearestTargetDate(date: Date, target: RoundTarget): Date {\n        switch (target) {\n            case RoundTarget.year: {\n                return this._getNearestDate(date, new Date(date.getFullYear() + 1, 0), new Date(date.getFullYear(), 0));\n            }\n            case RoundTarget.month: {\n                return this._getNearestDate(date, new Date(date.getFullYear(), date.getMonth() + 1), new Date(date.getFullYear(), date.getMonth()));\n            }\n            default:\n            case RoundTarget.week:\n            case RoundTarget.day: {\n                return this._getNearestDate(date, new Date(date.getFullYear(), date.getMonth(), date.getDate() + 1), new Date(date.getFullYear(), date.getMonth(), date.getDate()));\n            }\n        }\n    }\n\n    protected _round(value: number, step: number, target: RoundTarget, multiple: number,  roundType = RoundType.down): number {\n        if (this.column && AppService.isDate(this.column)) {\n            let date = new Date(value);\n            if (roundType === RoundType.nearest) {\n                // round to the nearest target year, month or day to adjust for the linear step size and leap years\n                date = this._getNearestTargetDate(date, target);\n            }\n            switch (target) {\n                case RoundTarget.year: {\n                    const year = date.getFullYear();\n                    if (year % multiple !== 0 || date.getMonth() !== 0 || date.getDate() !== 1 ||\n                        date.getHours() !== 0 || date.getMinutes() !== 0 || date.getSeconds() !== 0 || date.getMilliseconds() !== 0) {\n                        date = new Date(year + this.roundAdjustment(year, multiple, roundType), 0);\n                    }\n                    break;\n                }\n                case RoundTarget.month: {\n                    const month = date.getMonth();\n                    if (month % multiple !== 0 || date.getDate() !== 1 ||\n                        date.getHours() !== 0 || date.getMinutes() !== 0 || date.getSeconds() !== 0 || date.getMilliseconds() !== 0) {\n                        date = new Date(date.getFullYear(), month + this.roundAdjustment(month, multiple, roundType));\n                    }\n                    break;\n                }\n                case RoundTarget.week: {\n                    const day = date.getDay();\n                    // First, round to Monday\n                    if (day !== 1/*Monday*/ ||\n                        date.getHours() !== 0 || date.getMinutes() !== 0 || date.getSeconds() !== 0 || date.getMilliseconds() !== 0) {\n                        let adjust: number;\n                        const up = 7 - (day - 1);\n                        const down = -(day - 1);\n                        switch (roundType) {\n                            case RoundType.up:\n                                adjust = up;\n                                break;\n                            default:\n                            case RoundType.down:\n                                adjust = down;\n                                break;\n                            case RoundType.nearest:\n                                adjust = Math.abs(up) >= Math.abs(down) ? up : down;\n                                break;\n                        }\n                        date = new Date(date.getFullYear(), date.getMonth(), date.getDate() + adjust);\n                    }\n                    // Then, round to week number\n                    const week = getWeek(date);\n                    if (week % multiple !== 0) {\n                        date = new Date(date.getFullYear(), date.getMonth(), date.getDate() + (this.roundAdjustment(week, multiple, roundType) * 7));\n                    }\n                    break;\n                }\n                case RoundTarget.day: {\n                    const _date = date.getDate();\n                    if (date.getHours() !== 0 || date.getMinutes() !== 0 || date.getSeconds() !== 0 || date.getMilliseconds() !== 0) {\n                        date = new Date(date.getFullYear(), date.getMonth(), _date + this.roundAdjustment(_date, multiple, roundType));\n                    }\n                    break;\n                }\n            }\n            return date.getTime();\n        }\n        else {\n            return this._roundNumber(value, step, roundType);\n        }\n    }\n\n    protected round(value: number, roundType = RoundType.down): number {\n        return this._round(value, this.options.step || 1, this.roundTarget, this.roundMultiple, roundType);\n    }\n\n    protected roundDown(value: number): number {\n        return this.round(value, RoundType.down);\n    }\n\n    protected roundUp(value: number): number {\n        return this.round(value, RoundType.up);\n    }\n\n    protected roundNearest(value: number): number {\n        return this.round(value, RoundType.nearest);\n    }\n\n    //TODO - remove fix engine hack\n    private fixDate(dateStr: string): string {\n        if (dateStr) {\n            const secondsSep = dateStr.lastIndexOf(\":\");\n            if (secondsSep > 0) {\n                let seconds = Utils.toInt(dateStr.substr(secondsSep + 1));\n                if (seconds < 0) {\n                    seconds = 0;\n                }\n                else if (seconds > 59) {\n                    seconds = 59;\n                }\n                // seconds must contains 2 digits\n                dateStr = dateStr.substring(0, secondsSep + 1) + String(seconds).padStart(2, \"0\");\n            }\n        }\n        return dateStr;\n    }\n\n    protected initMinMax() {\n        let min = 0;\n        let max = 0;\n        if (!Utils.isEmpty(this.min) && (!Utils.isEmpty(this.max))) {\n            min = this.parseValue(this.min);\n            max = this.parseValue(this.max);\n        }\n        else {\n            if (this.data?.items) {\n                const item = this.data.items[0];\n                if (item && item.operatorResults) {\n                    if (this.column && AppService.isDate(this.column)) {\n                        //TODO - remove fix engine hack\n                        if (Utils.isString(item.operatorResults.min)) {\n                            const date = Utils.fromSysDateStr(this.fixDate(item.operatorResults.min));\n                            if (Utils.isDate(date)) {\n                                item.operatorResults.min = date;\n                            }\n                        }\n                        if (Utils.isString(item.operatorResults.max)) {\n                            const date = Utils.fromSysDateStr(this.fixDate(item.operatorResults.max));\n                            if (Utils.isDate(date)) {\n                                item.operatorResults.max = date;\n                            }\n                        }\n                        min = Utils.isDate(item.operatorResults.min) ? item.operatorResults.min.getTime() : 0;\n                        max = Utils.isDate(item.operatorResults.max) ? item.operatorResults.max.getTime() : 0;\n                    }\n                    else {\n                        min = Utils.isNumber(item.operatorResults.min) ? item.operatorResults.min : 0;\n                        max = Utils.isNumber(item.operatorResults.max) ? item.operatorResults.max : 0;\n                    }\n                }\n            }\n        }\n        this.options.floor = min;\n        this.options.ceil = max;\n    }\n\n    protected parseValue(value: string | number | Date): number {\n        if (Utils.isNumber(value)) { // number => number\n            return value;\n        }\n        if (Utils.isDate(value)) { // Date => number\n            return value.getTime();\n        }\n        if (!Utils.isString(value)) { // Ensure string\n            return 0;\n        }\n        if (this.column?.parser) { // Parse string if needed (only parser implemented is memorysize)\n            value = this.formatService.parseValue(value, this.column.parser);\n        }\n        if (Utils.testFloat(value)) { // Return as a plain number if it is one\n          return Utils.toNumber(value, 0);\n        }\n        const date = parseISO(value); // Try parsing as a date\n        if (isValid(date)) {\n          return getTime(date);\n        }\n        // Finally, manage durations and sizes special formats\n        if(this.column && AppService.isDate(this.column)) {\n          return Utils.toDuration(value);\n        }\n        return Utils.toSize(value, 0);\n    }\n\n    protected initStep() {\n        // Select the first step definition where the range >= stepDef.minRange\n        let format: string | undefined;\n        let step: number | undefined;\n        if (this.stepDefs) {\n            for (const stepDef of this.stepDefs) {\n                if (stepDef.step) {\n                    const thisStep = this.parseValue(stepDef.step);\n                    if (thisStep && stepDef.active) {\n                        if (!stepDef.minRange) {\n                            step = thisStep;\n                            format = stepDef.format;\n                            break;\n                        }\n                        else {\n                            // Round min/max for thisStep\n                            const {roundTarget, roundMultiple} = this.getRoundTarget(thisStep);\n                            const min = this._round(this.options.floor || 0, thisStep, roundTarget, roundMultiple, RoundType.down);\n                            const max = this._round(this.options.ceil || 0, thisStep, roundTarget, roundMultiple, RoundType.up);\n                            const range = max - min;\n                            const minRange = this.parseValue(stepDef.minRange);\n                            if (range >= minRange) {\n                                step = thisStep;\n                                format = stepDef.format;\n                                break;\n                            }\n                        }\n                    }\n                }\n            }\n        }\n        if (!step) {\n            // Default step, default formatting\n            step = this.column && AppService.isDate(this.column) ? Utils.oneDay : 1;\n        }\n        // Adjust step for year/month rounding (we assume daylight savings will balance out over the year)\n        const {roundTarget, roundMultiple} = this.getRoundTarget(step);\n        switch (roundTarget) {\n            case RoundTarget.year:\n                step = roundMultiple * 365.25 * Utils.oneDay;\n                break;\n            case RoundTarget.month:\n                step = roundMultiple * 365.25 * Utils.oneDay / 12;\n                break;\n        }\n        this.roundTarget = roundTarget;\n        this.roundMultiple = roundMultiple;\n        // Set default format based on roundTarget\n        if (!format) {\n            switch (this.roundTarget) {\n                case RoundTarget.year:\n                    format = \"msg#facet.range.year\";\n                    break;\n                case RoundTarget.month:\n                    format = \"msg#facet.range.monthYear\";\n                    break;\n                case RoundTarget.week:\n                    format = \"msg#facet.range.weekYear\";\n                    break;\n                default:\n                    format = \"\";\n                    break;\n            }\n        }\n        this.options.step = step;\n        this.format = format;\n    }\n\n    protected getRoundTarget(step: number): { roundTarget: RoundTarget, roundMultiple: number } {\n        const ret = {\n            roundTarget: RoundTarget.number,\n            roundMultiple: 1\n        };\n        if (this.column && AppService.isDate(this.column)) {\n            if (step % (365 * Utils.oneDay) === 0) {\n                ret.roundTarget = RoundTarget.year;\n                ret.roundMultiple = step / (365 * Utils.oneDay);\n            }\n            else if (step % (30 * Utils.oneDay) === 0) {\n                ret.roundTarget = RoundTarget.month;\n                ret.roundMultiple = step / (30 * Utils.oneDay);\n            }\n            else if (step % (7 * Utils.oneDay) === 0) {\n                ret.roundTarget = RoundTarget.week;\n                ret.roundMultiple = step / (7 * Utils.oneDay);\n            }\n            else if (step % Utils.oneDay === 0) {\n                ret.roundTarget = RoundTarget.day;\n                ret.roundMultiple = step / Utils.oneDay;\n            }\n        }\n        return ret;\n    }\n\n    protected init() {\n        this.options = {\n            draggableRange: true,\n            enforceStep: false,\n            translate: this.translate\n        };\n        this.initMinMax();\n        this.initStep();\n        let ceil = this.options.ceil || 0;\n        let floor = this.options.floor || 0;\n        this.sliderActive = ceil > floor;\n        if (ceil > floor) {\n            floor = this.options.floor = this.roundDown(floor);\n            ceil = this.options.ceil = this.roundUp(ceil);\n        }\n        const [from, to] = this.getRange();\n        this.rangeActive = !Utils.isUndefined(from) || !Utils.isUndefined(to);\n        this.rangeSelected = false;\n        this.value = this.startValue = Math.max(from || floor, floor);\n        this.highValue = this.startHighValue = Math.min(to || ceil, ceil);\n    }\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (!this.initDone) {\n            this.initDone = true;\n            this.localeChange = Utils.subscribe(this.intlService.events, () => this.manualRefresh.emit());\n        }\n        if (changes.results) {\n            this.data = this.facetService.getAggregation(this.aggregation, this.results);\n            this.column = this.data && this.appService.getColumn(this.data.column);\n            this.init();\n        }\n    }\n\n    protected onResize = () => {\n        this.manualRefresh.emit();\n    }\n\n    ngAfterViewInit() {\n        this.uiService.addElementResizeListener(this.slider.nativeElement, this.onResize);\n    }\n\n    ngOnDestroy() {\n        if(this.localeChange) {\n            this.localeChange.unsubscribe();\n        }\n        if(this.uiService && this.slider) {\n            this.uiService.removeElementResizeListener(this.slider.nativeElement, this.onResize);\n        }\n    }\n\n    onUserChangeEnd(changeContext: ChangeContext) {\n        this.rangeSelected = this.value !== this.startValue || this.highValue !== this.startHighValue;\n    }\n\n    getRange(): (number|undefined)[] {\n        if (this.data) {\n            const filter = this.facetService.findFilter(this.data.column, this.query);\n            if (filter) {\n                switch(filter.operator) {\n                    case 'between': return [this.parseValue(filter.start), this.parseValue(filter.end)];\n                    case 'gte': return [this.parseValue(filter.value), undefined];\n                    case 'lte': return [undefined, this.parseValue(filter.value)];\n                }\n            }\n        }\n        return [undefined, undefined]\n    }\n\n    setRange(from: number | undefined, to: number | undefined) {\n        if (this.column && this.data) {\n            const valFrom = AppService.isDate(this.column) && Utils.isNumber(from) ? new Date(from) : from;\n            const valTo = AppService.isDate(this.column) && Utils.isNumber(to) ? new Date(to) : to;\n            const filter = this.facetService.makeRangeFilter(this.data.column, valFrom, valTo);\n            if(filter) {\n                this.facetService.applyFilterSearch(filter, this.query, true);\n            }\n        }\n    }\n\n    applyRange() {\n        this.setRange(this.roundNearest(this.value), this.roundNearest(this.highValue));\n    }\n\n    clearRange() {\n        if(this.data) {\n            this.facetService.clearFiltersSearch(this.data.column, true, this.query, this.name);\n        }\n    }\n\n    override get actions(): Action[] {\n        const actions: Action[] = [];\n        if(this.rangeSelected){\n            actions.push(this.applyFiltersAction);\n        }\n        if(this.rangeActive){\n          actions.push(this.clearFiltersAction);\n        }\n        return actions;\n    }\n\n}\n","<ng-container *ngIf=\"data\">\n    <div #slider class=\"card-body\">\n        <ngx-slider\n            *ngIf=\"sliderActive\"\n            [(value)]=\"value\"\n            [(highValue)]=\"highValue\"\n            [options]=\"options\"\n            [manualRefresh]=\"manualRefresh\"\n            (userChangeEnd)=\"onUserChangeEnd($event)\">\n        </ngx-slider>\n        <span *ngIf=\"!sliderActive\">{{'msg#facet.range.unavailable' | sqMessage}}</span>\n    </div>\n</ng-container>\n","import { Component, Input, OnChanges, SimpleChanges } from \"@angular/core\";\nimport { AbstractControl, UntypedFormBuilder, UntypedFormGroup } from \"@angular/forms\";\n\nimport { SearchService } from \"@sinequa/components/search\";\nimport { AppService, Query } from \"@sinequa/core/app-utils\";\nimport { Utils } from \"@sinequa/core/base\";\nimport { AuditEventType, Results } from \"@sinequa/core/web-services\";\n\nimport { AbstractFacet } from \"../../abstract-facet\";\nimport { FacetConfig } from \"../../facet-config\";\nimport { FacetService } from \"../../facet.service\";\n\nexport interface FacetRefineParams {\n    suggestQuery?: string;\n    autocompleteEnabled?: boolean;\n    suggestDelay?: number;\n}\n\nexport interface FacetRefineConfig extends FacetConfig<FacetRefineParams> {\n    type: 'refine';\n}\n\n@Component({\n    selector: \"sq-refine\",\n    templateUrl: \"./facet-refine.html\",\n    standalone: false\n})\nexport class BsRefine extends AbstractFacet implements FacetRefineParams, OnChanges {\n\n    /**\n     * Results of the search page associated to this refine\n     */\n    @Input() results: Results;\n\n    @Input(\"query\") _query?: Query;\n\n    /**\n     * Whether or not to enable autocompletion\n     */\n    @Input() autocompleteEnabled = true;\n\n    /**\n     * Suggest query with which to perform autocompletion\n     */\n    @Input(\"suggestQuery\") _suggestQuery: string;\n\n    /**\n     * Minimum delay (in ms) between suggest queries\n     */\n    @Input() suggestDelay: number = 200;\n\n    form: UntypedFormGroup;\n    searchControl: AbstractControl;\n\n    inputErrorMessage: string;\n\n    get query(): Query {\n        return this._query || this.searchService.query;\n    }\n\n    get suggestQuery() {\n        return this._suggestQuery || this.appService.suggestQueries[0];\n    }\n\n    constructor(\n        public formBuilder: UntypedFormBuilder,\n        public appService: AppService,\n        public searchService: SearchService,\n        public facetService: FacetService) {\n        super();\n    }\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (!this.form) {\n            this.form = this.formBuilder.group({\n                search: \"\"\n            });\n            this.searchControl = this.form.get(\"search\")!;\n        }\n        if (changes.results) {\n            const refines = this.query.getRefines();\n            this.searchControl.setValue(refines[refines.length-1] || '');\n        }\n    }\n\n    doRefine = () => {\n        const text = Utils.trim(this.searchControl.value);\n        if (text) {\n            this.query.addRefine(text);\n            if(this.facetService.canSearch(this.query)) {\n                this.searchService.search(undefined, {\n                    type: AuditEventType.Search_Refine,\n                    detail: {\n                        text: text,\n                        itembox: \"refine\",\n                        fromresultid: this.results?.id || null\n                    }\n                });\n            }\n        }\n    }\n\n}\n","<div class=\"card-body\">\n    <form role=\"search\" novalidate [formGroup]=\"form\">\n\n        <div class=\"d-flex flex-column flex-grow-1 position-relative\">\n            <div class=\"input-group\">\n                <label class=\"visually-hidden\">{{'msg#facet.refine.input.label' | sqMessage}}</label>\n\n                <input type=\"text\"\n                    formControlName=\"search\"\n                    class=\"form-control\"\n                    spellcheck=\"false\"\n                    autocomplete=\"off\"\n\n                    sqAutocomplete\n                    [placeholder]=\"'msg#facet.refine.input.placeholder' | sqMessage\"\n                    [dropdown]=\"dropdown\"\n                    [suggestQuery]=\"suggestQuery\"\n                    [off]=\"!autocompleteEnabled\"\n                    [suggestDelay]=\"suggestDelay\"\n\n                    (submit)=\"doRefine()\">\n\n                <button class=\"btn btn-outline-secondary\" type=\"button\" (click)=\"doRefine()\" title=\"{{'msg#facet.refine.input.buttonTitle' | sqMessage}}\">\n                    <i class=\"fas fa-search\"></i>\n                </button>\n            </div>\n\n            <sq-autocomplete-list #dropdown>\n                <ng-template #itemTpl let-item>\n                    <div class=\"py-2\" style=\"padding-left:0.75rem;\">{{item.display}}\n                        <small *ngIf=\"item.category\" class=\"ms-2 text-muted\">{{(item.label || item.category) | sqMessage}}</small>\n                    </div>\n                </ng-template>\n            </sq-autocomplete-list>\n        </div>\n    </form>\n</div>\n","import { Component, Input, OnChanges } from \"@angular/core\";\nimport { AbstractFacet } from \"../../abstract-facet\";\nimport {\n    Results,\n    AggregationItem,\n    Aggregation,\n} from \"@sinequa/core/web-services\";\nimport { Action } from \"@sinequa/components/action\";\nimport { FacetService } from \"../../facet.service\";\nimport { Query } from \"@sinequa/core/app-utils\";\nimport { FacetConfig } from \"../../facet-config\";\n\nexport interface FacetTagCloudParams {\n    limit?: number;\n    uniformRepartition?: boolean;\n    showCount?: boolean;\n    proportionalWeight?: boolean;\n    countThreshold?: number;\n    shuffleData?: boolean;\n    isolateFacetFilters?: boolean;\n}\n\nexport interface FacetTagCloudConfig extends FacetConfig<FacetTagCloudParams> {\n    type: 'tag-cloud';\n}\n\nexport interface TagCloudItem {\n    aggregation: Aggregation;\n    item: AggregationItem;\n    weight: number;\n}\n\n@Component({\n    selector: \"sq-facet-tag-cloud\",\n    templateUrl: \"./facet-tag-cloud.html\",\n    styleUrls: [\"./facet-tag-cloud.scss\"],\n    standalone: false\n})\nexport class BsFacetTagCloud extends AbstractFacet implements FacetTagCloudParams, OnChanges {\n    /** search results */\n    @Input() results: Results;\n    /** Search query modified by this facet */\n    @Input() query?: Query;\n    /** list of aggregations to be considered in collecting tag-cloud data */\n    @Input() aggregation: string | string[];\n    /** maximum number of data to be displayed in tag-cloud */\n    @Input() limit = 50;\n    /** the way data are collected from given aggregations: equal repartition between them or most relevant among all of them */\n    @Input() uniformRepartition = false;\n    /** show/hide number of occurrences of each item*/\n    @Input() showCount = false;\n    /** define the size of each displayed item: common size for all or proportional size based on their count */\n    @Input() proportionalWeight = true;\n    /** lowest count under which items will not be taken into account in tag-cloud data */\n    @Input() countThreshold = 0;\n    /** wether data are rendered following their count sorting or randomly */\n    @Input() shuffleData = false;\n    /** Optional facet name, for audit and facet customization */\n    @Input() name = \"tag-cloud\";\n\n    aggregationsData: Aggregation[] = [];\n    tagCloudData: TagCloudItem[] = [];\n    hasFiltered = false;\n\n    // Actions enabled within the facet\n    private readonly clearFilters: Action;\n    // Default weight to be applied if proportionalWeight = false\n    private readonly defaultWeight = 2;\n\n    constructor(\n        private facetService: FacetService\n    ) {\n        super();\n\n        // Clear the current filters\n        this.clearFilters = new Action({\n            icon: \"sq-filter-clear\",\n            title: \"msg#facet.clearSelects\",\n            action: () => {\n                const fields = this.aggregationsData.map(a => a.column);\n                this.facetService.clearFiltersSearch(fields, true, this.query, this.name);\n            },\n        });\n    }\n\n    ngOnChanges() {\n        this.tagCloudData = this.getTagCloudData();\n    }\n\n    /**\n     * Defines the tag-cloud data according to given inputs\n     */\n    getTagCloudData(): TagCloudItem[] {\n        this.aggregationsData = this.getAggregationsData();\n        this.hasFiltered = this.aggregationsData.some(agg => agg.$filtered.length);\n\n        const aggregationsData = this.aggregationsData.filter(agg => agg.items?.length);\n        if (aggregationsData.length === 0) {\n            return [];\n        } else {\n            let tmp: TagCloudItem[] = [];\n\n            if (this.uniformRepartition) {\n                aggregationsData.forEach((data: Aggregation) => {\n                    const end = Math.floor(this.limit / aggregationsData.length);\n                    // Firstly, take filtered items\n                    tmp.push(\n                        ...data\n                            .items!.filter((item) => item.$filtered)\n                            .sort((a, b) => b.count - a.count)\n                            .slice(0, end)\n                            .map(\n                                (item: AggregationItem) =>\n                                    ({\n                                        aggregation: data,\n                                        item: item,\n                                        weight: this.proportionalWeight\n                                            ? item.count\n                                            : this.defaultWeight,\n                                    } as TagCloudItem)\n                            )\n                    );\n                    // add most relevant items if threshold not attenuated\n                    if (tmp.length < end) {\n                        tmp.push(\n                            ...data\n                                .items!.filter(\n                                    (item) => item.count > this.countThreshold && !item.$filtered\n                                )\n                                .sort((a, b) => b.count - a.count)\n                                .slice(0, end - tmp.length)\n                                .map(\n                                    (item: AggregationItem) =>\n                                        ({\n                                            aggregation: data,\n                                            item: item,\n                                            weight: this.proportionalWeight\n                                                ? item.count\n                                                : this.defaultWeight,\n                                        } as TagCloudItem)\n                                )\n                        );\n                    }\n                });\n                tmp = tmp.sort((a, b) => b.item.count - a.item.count);\n            } else {\n                aggregationsData.forEach((data: Aggregation) => {\n                    tmp.push(\n                        ...data\n                            .items!.filter(\n                                (item) =>\n                                    item.count > this.countThreshold || item.$filtered\n                            )\n                            .map(\n                                (item: AggregationItem) =>\n                                    ({\n                                        aggregation: data,\n                                        item: item,\n                                        weight: this.proportionalWeight\n                                            ? item.count\n                                            : this.defaultWeight,\n                                    } as TagCloudItem)\n                            )\n                    );\n                });\n                const filtered = tmp.filter((elem) => elem.item.$filtered);\n                if (filtered.length < this.limit) {\n                    const notFiltered = tmp\n                        .filter((elem) => !elem.item.$filtered)\n                        .sort((a, b) => b.item.count - a.item.count);\n                    tmp = [...filtered];\n                    tmp.push(\n                        ...notFiltered.slice(0, this.limit - filtered.length)\n                    );\n                } else {\n                    tmp = filtered.slice(0, this.limit);\n                }\n            }\n\n            // By default, sort the whole array with respect to its counts and update its elements weight value\n            tmp = tmp\n                .sort((a, b) => b.item.count - a.item.count)\n                .map(\n                    (elem: TagCloudItem) =>\n                        ({\n                            ...elem,\n                            weight: this.proportionalWeight\n                                ? this.scaleItemWeight(tmp, elem.item.count)\n                                : this.defaultWeight,\n                        } as TagCloudItem)\n                );\n\n            // Shuffle the array\n            if (this.shuffleData) {\n                tmp = this.shuffle(tmp);\n            }\n\n            return tmp;\n        }\n    }\n\n    /**\n     * Invoked on click on an item in order to update the query\n     * @param tagCloudItem\n     * @param event\n     */\n    filterItem(tagCloudItem: TagCloudItem, event: Event) {\n        const aggregation = tagCloudItem.aggregation;\n        const item = tagCloudItem.item;\n        if (!item.$filtered) {\n            this.facetService.addFilterSearch(aggregation, item, undefined, this.query, this.name);\n        } else {\n            this.facetService.removeFilterSearch(aggregation, item, this.query, this.name);\n        }\n        event.preventDefault();\n    }\n\n    /**\n     * Define the possible actions according to the actual context\n     */\n    override get actions(): Action[] {\n        const actions: Action[] = [];\n        if(this.hasFiltered) {\n            actions.push(this.clearFilters);\n        }\n        return actions;\n    }\n\n    /**\n     * Map the initial aggregations names to a list of Aggregation\n     */\n    protected getAggregationsData(): Aggregation[] {\n        return ([] as string[])\n            .concat(this.aggregation)\n            .map(a => this.facetService.getAggregation(a, this.results)!)\n            .filter(a => a);\n    }\n\n    /**\n     * Linearly map the original weight to a discrete scale from 1 to 10\n     * @param weight original weight\n     */\n    private scaleItemWeight(tagCloudData: TagCloudItem[], weight: number): number {\n        return (\n            Math.round(\n                ((weight - tagCloudData[tagCloudData.length - 1].weight) /\n                    (tagCloudData[0].weight -\n                        tagCloudData[tagCloudData.length - 1].weight)) *\n                    9.0\n            ) + 1\n        );\n    }\n\n    /**\n     * Shuffle items of the supplied array\n     * @param arr\n     */\n    private shuffle(arr: TagCloudItem[]): TagCloudItem[] {\n        for (let i = arr.length - 1; i > 0; i--) {\n            const j = Math.floor(Math.random() * i);\n            const aux = arr[i];\n            arr[i] = arr[j];\n            arr[j] = aux;\n        }\n        return arr;\n    }\n\n}\n","<ul class=\"cloud\" [attr.data-show-count]=\"showCount ? '' : null\">\n    <li *ngFor=\"let data of tagCloudData\">\n        <a\n            href=\"#\"\n            [attr.data-count]=\"data.item.count\"\n            [attr.data-weight]=\"proportionalWeight ? data.weight : null\"\n            [ngClass]=\"data.aggregation.column\"\n            (click)=\"filterItem(data, $event)\">\n            <i class=\"far fa-check-circle filtered\" *ngIf=\"data.item.$filtered\"></i>\n            {{data.item | sqValue:data.item.$column}}\n        </a>\n    </li>\n</ul>\n","import { Type } from \"@angular/core\";\nimport { MapOf, StrictUnion } from \"@sinequa/core/base\";\nimport { BsFacetList } from \"./bootstrap/facet-list/facet-list\";\nimport { BsFacetRange } from \"./bootstrap/facet-range/facet-range\";\nimport { BsRefine } from \"./bootstrap/facet-refine/facet-refine\";\nimport { BsFacetTagCloud } from \"./bootstrap/facet-tag-cloud/facet-tag-cloud\";\n\nexport interface FacetConfig<T extends {}> {\n  /** type of component that should be displayed */\n  type: string;\n  /** aggregation(s) used by this facet */\n  aggregation: string | string[];\n  /** technical name for this facet */\n  name?: string;\n  /** display title */\n  title?: string;\n  /** icon class */\n  icon?: string;\n  /** tabs in which this facet should be displayed */\n  includedTabs?: string[];\n  /** tabs in which this facet should not be displayed */\n  excludedTabs?: string[];\n  className?: string;\n  /** List of parameters specific to this facet configuration */\n  parameters?: StrictUnion<T>;\n}\n\nexport const DEFAULT_FACET_COMPONENTS: MapOf<Type<any>> = {\n  \"list\": BsFacetList,\n  \"range\": BsFacetRange,\n  \"refine\": BsRefine,\n  \"tag-cloud\": BsFacetTagCloud\n}\n","import { Directive, Input, TemplateRef } from \"@angular/core\";\nimport { IAction } from \"@sinequa/components/action\";\n\n@Directive({\n    selector: 'ng-template [sqFacetView]',\n    standalone: false\n})\nexport class FacetViewDirective {\n  @Input(\"sqFacetView\") viewOptions?: IAction;\n  @Input() default?: boolean;\n\n  constructor(\n    public readonly template: TemplateRef<any>\n  ) {}\n}\n","import { Component, Input, Output, OnInit, OnDestroy, EventEmitter, ContentChild, HostBinding, AfterContentInit, ContentChildren, QueryList, TemplateRef, DoCheck, OnChanges } from \"@angular/core\";\nimport { delay, Subscription } from \"rxjs\";\nimport { Action } from \"@sinequa/components/action\";\nimport { AbstractFacet } from \"../../abstract-facet\";\nimport { FacetViewDirective } from \"../facet-view.directive\";\nimport { Placement } from \"@sinequa/components/utils\";\nimport { UserPreferences } from \"@sinequa/components/user-settings\";\n\n@Component({\n    selector: \"sq-facet-card\",\n    templateUrl: \"./facet-card.html\",\n    styleUrls: ['./facet-card.scss'],\n    standalone: false\n})\nexport class BsFacetCard implements OnInit, OnChanges, OnDestroy, DoCheck, AfterContentInit {\n\n    /**\n     * Title of this facet (optional)\n     */\n    @Input() title: string;\n\n    /**\n     * Tooltip of this facet (defaults to title)\n     */\n    @Input() tooltip: string;\n\n    /**\n     * Icon of this facet, in a form of a span class name (optional)\n     */\n    @Input() icon: string;\n\n    /**\n     * List of custom actions for this facet (optional)\n     */\n    @Input() actions: Action[] = [];\n\n    /**\n     * List of secondary actions\n     */\n    @Input() secondaryActions: Action[] = [];\n\n    /**\n     * Whether the [actions]=\"...\" passed by binding should be displayed before or after\n     * the actions from the inner facet component\n     */\n    @Input() actionsFirst = true;\n\n    /**\n     * Whether the actions from the inner facet components are to be treated as secondary\n     */\n    @Input() facetActionsAreSecondary = false;\n\n    /**\n     * Whether the actions for switching between views are to be treated as secondary\n     */\n    @Input() viewActionsAreSecondary = false;\n\n    /**\n     * Bootstrap theme name (light, dark...)\n     */\n    @Input() buttonsStyle?: string;\n    @Input() viewButtonsStyle?: string;\n    @Input() secondaryButtonsStyle?: string;\n\n    /**\n     * Size of the custom actions\n     */\n    @Input() actionsSize = \"sm\";\n    @Input() viewActionsSize?: string;\n    @Input() secondaryActionsSize: string;\n\n    /**\n     * Class applied to the button groups\n     */\n    @Input() actionsClass?: string = \"btn-group\";\n    @Input() viewActionsClass?: string = \"btn-group\";\n    @Input() secondaryActionsClass?: string = \"btn-group float-end\";\n\n    /**\n     * Whether the facet can be collapsed (default: true)\n     */\n    @Input() collapsible: boolean = true;\n\n    /**\n     * Whether the facet starts collapsed (if collapsible / default: false)\n     */\n    @Input() startCollapsed: boolean = false;\n\n    /**\n     * Whether other actions should be hidden when the facet is collapsed (default: true)\n     */\n    @Input() hideActionsCollapsed: boolean = true;\n\n    /**\n     * A name to save the collapse status in the preferences to save it for next sessions\n     */\n    @Input() preference?: string;\n\n    /**\n     * Whether the facet can be expanded (default: false)\n     */\n    @Input() expandable: boolean = false;\n\n    /**\n     * Whether the facet starts expanded (if expandable / default: false)\n     */\n    @Input() startExpanded: boolean = false;\n\n    /**\n     * Facet will collapse automatically once clicking outside of it\n     */\n    @Input() collapseOnClickOutside: boolean = false;\n\n    /**\n     * Whether the facet starts with opened settings (default: false)\n     */\n    @Input() startSettingsOpened: boolean = false;\n\n    /**\n     * Default placement of the title of All actions, if not specified in the action itself\n     */\n    @Input() defaultTooltipPlacement: Placement = \"top\";\n\n    /**\n     * Default fallback placements of the title of All actions, if not specified in the action itself\n     */\n    @Input() defaultTooltipFallbackPlacements: Placement[] = [\"top\", \"bottom\"];\n\n    /**\n     * Event triggered when the facet gets expanded or reduced\n     */\n    @Output() facetExpanded = new EventEmitter<\"expanded\" | \"reduced\">();\n\n    /**\n     * Event triggered when the facet gets expanded or reduced\n     */\n    @Output() facetCollapsed = new EventEmitter<\"collapsed\" | \"expanded\">();\n\n    /**\n     * Event triggered when the facet gets expanded or reduced\n     */\n    @Output() settingsOpened = new EventEmitter<\"opened\" | \"saved\" | \"canceled\">();\n\n    /**\n     * Reference to the child facet inserted by transclusion (ng-content)\n     */\n    @ContentChildren(\"facet\")\n    facetQuery: QueryList<AbstractFacet>;\n\n    @ContentChildren(FacetViewDirective)\n    views: QueryList<FacetViewDirective>;\n\n    view: FacetViewDirective;\n    viewActions: Action[];\n\n    @ContentChild(\"headerTpl\") headerTpl?: TemplateRef<any>;\n    @ContentChild(\"subHeaderTpl\") subHeaderTpl?: TemplateRef<any>;\n    @ContentChild(\"footerTpl\") footerTpl: TemplateRef<any>;\n    @ContentChild(\"settingsTpl\") settingsTpl: TemplateRef<any>;\n\n    /**\n     * Concluded reference to child facet inserted by transclusion AND which its content is also loaded by transclusion\n     */\n    public _facetComponent: AbstractFacet | undefined;\n\n    @HostBinding('class.collapsed') _collapsed: boolean;\n    @HostBinding('class.expanded') _expanded: boolean;\n    @HostBinding('class.settings-opened') _settingsOpened: boolean;\n\n    @HostBinding('hidden') get hidden(): boolean {\n        return !!this.facetComponent?.isHidden?.()\n    }\n\n    allActions: Action[] = [];\n    allSecondaryActions: Action[] = [];\n\n    public readonly collapseAction;\n    public readonly expandAction;\n    public readonly settingsAction;\n\n    private subs = new Subscription();\n\n    constructor(public prefs: UserPreferences) {\n\n        this.collapseAction = new Action({\n            titlePlacement: this.defaultTooltipPlacement,\n            fallbackPlacements: this.defaultTooltipFallbackPlacements,\n            action: (action, event) => {\n                // stop propagation to avoid the click outside event to be triggered\n                event.stopPropagation();\n                this._collapsed = !this._collapsed;\n                if (this.preference) {\n                    this.prefs.set(this.preference, this._collapsed);\n                }\n                this.facetCollapsed.next(this._collapsed ? \"collapsed\" : \"expanded\");\n                if (!!this.facetComponent) {\n                    this.facetComponent.onCollapse(this._collapsed);\n                }\n                action.update();\n            },\n            updater: (action) => {\n                action.icon = this._collapsed ? \"fas fa-chevron-down\" : \"fas fa-chevron-up\";\n                action.title = this._collapsed ? 'msg#facetCard.expand' : 'msg#facetCard.collapse';\n                this.updateActions();\n            }\n        });\n\n        this.expandAction = new Action({\n            titlePlacement: this.defaultTooltipPlacement,\n            fallbackPlacements: this.defaultTooltipFallbackPlacements,\n            action: (action) => {\n                this._expanded = !this._expanded;\n                this.facetExpanded.next(this._expanded ? \"expanded\" : \"reduced\");\n                if (!!this.facetComponent) {\n                    this.facetComponent.onExpand(this._expanded);\n                }\n                action.update();\n            },\n            updater: (action) => {\n                action.icon = this._expanded ? \"fas fa-compress\" : \"fas fa-expand\";\n                action.title = this._expanded ? \"msg#facetCard.reduce\" : \"msg#facetCard.enlarge\";\n            }\n        });\n\n        this.settingsAction = new Action({\n            titlePlacement: this.defaultTooltipPlacement,\n            fallbackPlacements: this.defaultTooltipFallbackPlacements,\n            action: (action) => {\n                this._settingsOpened = !this._settingsOpened;\n                this.settingsOpened.next(this._settingsOpened ? \"opened\" : \"saved\");\n                this.facetComponent?.onOpenSettings(this._settingsOpened);\n                action.update();\n            },\n            updater: (action) => {\n                action.icon = this._settingsOpened ? \"fas fa-save\" : \"fas fa-cog\";\n                action.title = this._settingsOpened ? \"msg#facetCard.saveSettings\" : \"msg#facetCard.openSettings\";\n            }\n        });\n\n    }\n\n    ngOnInit() {\n        // Initialize actions\n        const collapsed = this.preference ? this.prefs.get(this.preference) : undefined;\n        this._collapsed = collapsed ?? this.startCollapsed;\n        this._expanded = this.startExpanded;\n        this._settingsOpened = this.startSettingsOpened;\n\n        this.collapseAction.update();\n        this.expandAction.update();\n        this.settingsAction.update();\n\n        this.updateActions(); // Note that OnInit is called AFTER the 1st OnChanges\n    }\n\n    ngOnChanges(): void {\n        // Most Input() of this component potentially have an effect on the actions\n        this.updateActions();\n\n        this.updateClickOutside();\n    }\n\n    // In ngAfterContentInit we have access to the facet content (facet component or views, depending on how the facet-card is used)\n    ngAfterContentInit() {\n        this.updateFacetComponent();\n        if (this.facetComponent) { // A facet component is directly passed to the facet\n            this.subs.add(\n                this.facetComponent.actionsChanged.subscribe((actions) => {\n                    this.updateActions();\n                    this.allActions.forEach(action => action.update());\n                })\n            );\n        }\n        else if (this.views.length) { // A list of views (containing facet components) is passed to the facet\n            this.updateViews();\n        }\n        else {\n            console.info(\"No #facet component (or no view) is defined in this facet card: \", this.title);\n        }\n\n        // Catch the #facet component changes (which happens when we switch views)\n        this.subs.add(\n            this.facetQuery.changes.pipe(delay(0))\n                .subscribe(() => this.updateFacetComponent())\n        );\n\n        // Catch a change in the list of views\n        this.subs.add(\n            this.views.changes\n                .subscribe(() => this.updateViews())\n        );\n    }\n\n    ngDoCheck(): void {\n        if (this.actionsChanged()) {\n            this.updateActions();\n        }\n    }\n\n    ngOnDestroy() {\n        this.subs.unsubscribe();\n\n        if(this.onClickOutside) {\n            document.removeEventListener('click', this.onClickOutside);\n        }\n    }\n\n    updateFacetComponent() {\n        this.facetComponent = this.facetQuery.first;\n        this.updateActions();\n    }\n\n    public get facetComponent(): AbstractFacet | undefined {\n        return this._facetComponent;\n    }\n\n    public set facetComponent(facet: AbstractFacet | undefined) {\n        this._facetComponent = facet || this._facetComponent; // Allows overriding ContentChild (to avoid undefined facet)\n    }\n\n    updateViews() {\n        this.viewActions = this.views.map(view => new Action({\n            titlePlacement: this.defaultTooltipPlacement,\n            fallbackPlacements: this.defaultTooltipFallbackPlacements,\n            ...view.viewOptions,\n            action: (action, event) => {\n                view.viewOptions?.action?.(action, event); // If any, execute the view's action function\n                this.setView(view)\n            },\n            selected: view === this.view,\n            data: view\n        }));\n        // If the view is unset, or if the previously selected view is not found in the new list, set the default view\n        if (!this.view || !this.views.find(v => v === this.view)) {\n            const defaultView = this.views.find(v => !!v.default) || this.views.first;\n            this.setView(defaultView); // Select the first view by default\n        }\n        if(!this.viewActionsAreSecondary) {\n            this.updateActions(); // Refresh the actions if they include the view actions\n        }\n    }\n\n    setView(view: FacetViewDirective) {\n        this.view = view;\n        this._facetComponent = undefined; // The _facetComponent must be set by the view, triggering a facetQuery change\n        this.viewActions.forEach(a => a.selected = a.data === view);\n    }\n\n    updateActions() {\n        this.allActions = this.getActions();\n        this.allSecondaryActions = this.getSecondaryActions();\n    }\n\n    public getActions(): Action[] {\n        if (this.hideActions) return [this.collapseAction]; // Hide other actions if collapsed\n        const actions = [] as Action[];\n        if (this.actionsFirst) {\n            actions.push(...this.actions);\n        }\n        if (!this.viewActionsAreSecondary && this.viewActions?.length > 1) {\n            actions.push(...this.viewActions);\n        }\n        if (this.facetComponent && !this.facetActionsAreSecondary) actions.push(...this.facetComponent.actions);\n        if (this.settingsTpl || (this.facetComponent?.settingsTpl && !this.facetActionsAreSecondary)) actions.push(this.settingsAction);\n        if (this.expandable) actions.push(this.expandAction);\n        if (this.collapsible) actions.push(this.collapseAction);\n        if (!this.actionsFirst) {\n            actions.push(...this.actions);\n        }\n        return actions.map((action) => {\n          action.titlePlacement = action.titlePlacement || this.defaultTooltipPlacement;\n          action.fallbackPlacements = action.fallbackPlacements || this.defaultTooltipFallbackPlacements;\n          return action;\n        });\n    }\n\n    public getSecondaryActions(): Action[] {\n        if (this.hideActions) return [];\n        const actions = [] as Action[];\n        if (this.actionsFirst) {\n            actions.push(...this.secondaryActions);\n        }\n        if (this.facetComponent && this.facetActionsAreSecondary) {\n            actions.push(...this.facetComponent.actions);\n            if(this.facetComponent.settingsTpl) actions.push(this.settingsAction);\n        }\n        if (!this.actionsFirst) {\n            actions.push(...this.secondaryActions);\n        }\n        return actions.map((action) => {\n          action.titlePlacement = action.titlePlacement || this.defaultTooltipPlacement;\n          action.fallbackPlacements = action.fallbackPlacements || this.defaultTooltipFallbackPlacements;\n          return action;\n        });\n    }\n\n    // Manual change detection, to avoid constantly triggering refreshes of the actions\n    _oldActions: Action[] | undefined;\n    protected actionsChanged(): boolean {\n        const actions = this.facetComponent?.actions;\n        if (actions?.length !== this._oldActions?.length) {\n            return true;\n        }\n        else if (actions && this._oldActions) {\n            for (let i = 0; i < actions.length; i++) {\n                if (actions[i] !== this._oldActions[i]) {\n                    return true;\n                }\n            }\n        }\n        this._oldActions = actions;\n        return false;\n    }\n\n    public get hideActions() {\n        return this.hideActionsCollapsed && this._collapsed;\n    }\n\n    updateClickOutside() {\n        if(this.collapseOnClickOutside && !this.onClickOutside) {\n            this.onClickOutside = () => {\n                if(!this._collapsed) {\n                    this._collapsed = true;\n                    this.collapseAction.update();\n                    this.expandAction.update();\n                    this.settingsAction.update();\n                }\n            }\n            document.addEventListener('click', this.onClickOutside);\n        }\n        if(!this.collapseOnClickOutside && this.onClickOutside) {\n            document.removeEventListener('click', this.onClickOutside);\n        }\n    }\n\n    onClickOutside?: () => void;\n\n}\n","<div class=\"card\">\n    <!-- Facet card header -->\n    <div class=\"card-header cursor-default ps-3 pe-2 py-1\">\n        <div class=\"d-flex align-items-center\">\n            <!-- Facet card icon and title -->\n            <div *ngIf=\"icon || title\" class=\"d-flex align-items-center text-truncate me-auto\" [title]=\"(tooltip || title) | sqMessage\">\n                <div *ngIf=\"icon\" class=\"card-icon {{icon}} me-2\" aria-hidden=\"true\"></div>\n                <div *ngIf=\"title\" class=\"card-title text-truncate mb-0 py-1 me-auto\">{{title | sqMessage }}</div>\n            </div>\n\n            <!-- Header custom template -->\n            <ng-container [ngTemplateOutlet]=\"facetComponent?.headerTpl || headerTpl\">\n            </ng-container>\n\n            <!-- Primary actions -->\n            <div class=\"sq-primary-actions ms-auto\"\n                [ngClass]=\"actionsClass\"\n                [sq-action-buttons]=\"{items: allActions, style: buttonsStyle, size: actionsSize, rightAligned: true}\">\n            </div>\n        </div>\n\n        <!-- Sub Header custom template -->\n        <ng-container [ngTemplateOutlet]=\"facetComponent?.subHeaderTpl || subHeaderTpl\"></ng-container>\n\n        <!-- View switching actions -->\n        <div class=\"sq-view-actions\"\n            [ngClass]=\"viewActionsClass\"\n            [sq-action-buttons]=\"{items: viewActions, style: viewButtonsStyle || buttonsStyle, size: viewActionsSize || actionsSize, rightAligned: true}\"\n            *ngIf=\"!_collapsed && viewActionsAreSecondary && viewActions?.length > 1\">\n        </div>\n\n        <!-- Secondary actions -->\n        <div class=\"sq-secondary-actions\"\n            [ngClass]=\"secondaryActionsClass\"\n            [sq-action-buttons]=\"{items: allSecondaryActions, style: secondaryButtonsStyle || buttonsStyle, size: secondaryActionsSize || actionsSize, rightAligned: true}\"\n            *ngIf=\"!_collapsed && allSecondaryActions.length\">\n        </div>\n    </div>\n\n    <!-- Facet card content -->\n    <sq-collapse [collapsed]=\"_collapsed\">\n        <ng-template>\n            <ng-container *ngIf=\"!_settingsOpened && view\" [ngTemplateOutlet]=\"view.template\"></ng-container>\n            <ng-content *ngIf=\"!_settingsOpened && !view\"></ng-content>\n            <ng-container *ngIf=\"_settingsOpened\" [ngTemplateOutlet]=\"facetComponent?.settingsTpl || settingsTpl\"></ng-container>\n        </ng-template>\n    </sq-collapse>\n\n    <!-- Facet card footer -->\n    <div class=\"card-footer\" *ngIf=\"!_collapsed && (facetComponent?.footerTpl || footerTpl)\">\n        <ng-container [ngTemplateOutlet]=\"facetComponent?.footerTpl || footerTpl\"></ng-container>\n    </div>\n</div>\n","import { Component, ComponentRef, Input, Type } from \"@angular/core\";\nimport { MapOf } from \"@sinequa/core/base\";\nimport { Results } from \"@sinequa/core/web-services\";\nimport { FacetConfig, DEFAULT_FACET_COMPONENTS } from \"../../facet-config\";\nimport { BsFacetCard } from \"../facet-card/facet-card\";\nimport { AbstractFacet } from '../../abstract-facet';\nimport { FacetService } from \"../../facet.service\";\n\n@Component({\n    selector: \"sq-facet-bar\",\n    templateUrl: \"./facet-bar.html\",\n    standalone: false\n})\nexport class BsFacetBar {\n    @Input() results: Results;\n    @Input() containerIndex: number = 0; // There could be various facet bars (but only one service and storage array)\n    @Input() facetComponents: MapOf<Type<any>> = DEFAULT_FACET_COMPONENTS;\n\n    constructor(public facetService: FacetService) {}\n\n    get facets(): FacetConfig<{}>[] {\n        // Which facets are actually displayed in this facet bar\n        return this.facetService.getFacets(this.containerIndex, this.results);\n    }\n\n    onFacetLoad(facetCard: BsFacetCard, componentRef: {componentRef: ComponentRef<AbstractFacet> | undefined;}) {\n        facetCard._facetComponent = componentRef?.componentRef?.instance!;\n    }\n\n    getFacetInputs(facet: FacetConfig<{}>): MapOf<any> {\n        return {\n            ...facet.parameters,\n            name: facet.name,\n            aggregation: facet.aggregation,\n            results: this.results\n        };\n    }\n\n    getComponent(type: string) {\n        return this.facetComponents ? this.facetComponents[type] : undefined\n    }\n}\n","<ng-content></ng-content>\n<sq-facet-card *ngFor=\"let f of facets\"\n  #facetCard\n  [ngClass]=\"f.className\" class=\"mb-2\"\n  [title]=\"f.title\"\n  [icon]=\"f.icon\">\n    <ng-container\n        [sqLoadComponent]=\"{component: getComponent(f.type), inputs: getFacetInputs(f)}\"\n        (sqLoadComponent)=\"onFacetLoad(facetCard, $event)\">\n    </ng-container>\n</sq-facet-card>\n<ng-content select=\"[bottom]\"></ng-content>\n","import {ChangeDetectorRef, Component, ComponentRef, Input, OnChanges, OnDestroy, Type} from \"@angular/core\";\nimport {Results} from \"@sinequa/core/web-services\";\nimport {FacetService, NamedFacetConfig} from \"../../facet.service\";\nimport {Action} from \"@sinequa/components/action\";\nimport { FacetConfig, DEFAULT_FACET_COMPONENTS } from \"../../facet-config\";\nimport { MapOf, Utils } from \"@sinequa/core/base\";\nimport { Subscription } from \"rxjs\";\nimport { AbstractFacet } from \"../../abstract-facet\";\n\n@Component({\n    selector: \"sq-facet-filters\",\n    templateUrl: \"./facet-filters.html\",\n    styleUrls: [\"./facet-filters.scss\"],\n    standalone: false\n})\nexport class BsFacetFilters implements OnChanges, OnDestroy {\n    @Input() results: Results;\n    @Input() facets: FacetConfig<{}>[];\n    @Input() facetComponents: MapOf<Type<any>> = DEFAULT_FACET_COMPONENTS;\n    @Input() enableCustomization = false;\n\n    @Input() autoAdjust: boolean = true;\n    @Input() autoAdjustBreakpoint: string = 'xl';\n    @Input() collapseBreakpoint: string = 'sm';\n    @Input() rightAligned: boolean = false;\n    @Input() size: string;\n\n    filters: Action[] = [];\n    facetMenu: Action | undefined;\n\n    // When a facet is opened\n    openedFacet: FacetConfig<{}> | undefined;\n    facetInstance: AbstractFacet | undefined;\n\n    sub: Subscription;\n\n    constructor(\n        private facetService: FacetService,\n        private cdRef: ChangeDetectorRef\n    ) {\n        this.filters = [];\n    }\n\n    ngOnChanges() {\n        if (this.enableCustomization) {\n            const facets = this.facets.filter(f => f.name) as NamedFacetConfig[];\n\n            if (!this.facetService.defaultFacets) {\n                this.facetService.defaultFacets = facets\n                    .map(f => ({name: f.name!, position: 0}));\n            }\n\n            if (!this.facetService.allFacets) {\n                this.facetService.allFacets = facets;\n            }\n        }\n\n        if(this.results) {\n            this.buildFilters();\n        }\n\n        if(!this.sub) {\n            this.sub = this.facetService.changes.subscribe(() => this.buildFilters());\n        }\n    }\n\n    ngOnDestroy(): void {\n        this.sub.unsubscribe();\n    }\n\n    /**\n     * Build filters bar actions\n     */\n    protected buildFilters() {\n\n        // For each facet\n        this.filters = this.filteredFacets.map(facet => {\n\n            const component = this.facetComponents[facet.type];\n            const componentInputs = {\n                ...facet.parameters,\n                name: facet.name,\n                aggregation: facet.aggregation,\n                results: this.results\n            };\n\n            let disabled = true;\n            let filtered = false;\n            const aggregations = Utils.asArray(facet.aggregation);\n            for(let aggregation of aggregations) {\n                const agg = this.facetService.getAggregation(aggregation, this.results);\n                if(agg?.items?.length) {\n                    disabled = false;\n                    filtered = filtered || agg.$filtered.length > 0;\n                }\n            }\n\n            return new Action({\n                name: facet.name,\n                text: facet.title,\n                title: facet.title,\n                icon: facet.icon,\n                disabled,\n                styles: `${facet.className || ''} ${filtered? \"filtered\" : disabled? \"disabled\" : ''}`,\n                action: () => this.openFacet(facet),\n                data: facet,\n                component,\n                componentInputs\n            });\n        });\n\n        if (this.enableCustomization) {\n            this.facetMenu = this.facetService.createFacetMenu();\n        }\n\n        this.cdRef.detectChanges(); // needed to detect changes in the facet actions when results change\n    }\n\n    openFacet(facet: FacetConfig<{}>) {\n        if(this.openedFacet === facet) {\n            // Same facet re-opened: force sqLoadComponent to re-emit by resetting first\n            this.openedFacet = undefined;\n            this.cdRef.detectChanges();\n        }\n        this.openedFacet = facet;\n    }\n\n    onLoadFacet(event: { componentRef: ComponentRef<AbstractFacet> | undefined }) {\n        if(!event.componentRef) return;\n        this.facetInstance = event.componentRef.instance;\n        this.cdRef.detectChanges(); // Detect changes manually, because the facet actions need to be displayed\n    }\n\n    get isFacetEmpty(): boolean {\n        return !!this.facetInstance?.isHidden();\n    }\n\n    get filteredFacets() {\n        const filtered = this.facets.filter(facet => this.facetService.isFacetIncluded(facet, this.results))\n\n        if (!this.enableCustomization) return filtered;\n\n        const new_facets: FacetConfig<{}>[] = [];\n\n        if (this.userFacets) {\n            for (const facet of filtered) {\n                const pos = this.userFacets.findIndex((userFacet) => userFacet.name === facet.name);\n                if (pos >= 0) new_facets.push(facet);\n            }\n        }\n        return new_facets;\n    }\n\n    get userFacets() {\n        return this.facetService.facets;\n    }\n\n    get hasFacetSelected() {\n        if (this.userFacets.length === 0) return false;\n        for (const facet of this.facets) {\n            if (this.userFacets.find(userFacet => userFacet.name === facet.name)) return true;\n        }\n        return false;\n    }\n\n    trackByData = (action: Action) => {\n        return action.data; // Necessary to maintain the same DOM elements when filters are rebuilt\n    }\n}\n","<ul class=\"navbar-nav\">\n\n  <!-- List of filters-->\n  <li class=\"nav-item\" *ngFor=\"let item of filters; trackBy:trackByData\">\n    <!-- Button that opens the facet -->\n    <a href=\"#\" role=\"button\" class=\"nav-link dropdown-toggle\" [ngClass]=\"{'disabled': item.disabled}\" data-bs-toggle=\"dropdown\" (click)=\"item.action(item)\" [title]=\"item.title | sqMessage:item.messageParams\">\n      <span [ngClass]=\"item.styles\">\n        <i  *ngIf=\"item.icon\" [ngClass]=\"item.icon\" aria-hidden=\"true\"></i>\n        <span class=\"ms-1 d-inline-block d-{{collapseBreakpoint}}-none d-{{autoAdjustBreakpoint}}-inline-block\">{{item.text | sqMessage:item.messageParams}}</span>\n      </span>\n    </a>\n\n    <!-- Facet displayed dynamically within dropdown -->\n    <div class=\"dropdown-menu\" (click)=\"$event.stopPropagation()\" [ngClass]=\"{'d-none': isFacetEmpty}\">\n      <ng-container *ngIf=\"item.data === openedFacet\">\n\n        <!-- Actions and header of this facet -->\n        <div class=\"d-flex justify-content-end p-1\" *ngIf=\"facetInstance\">\n          <ng-container *ngTemplateOutlet=\"facetInstance.headerTpl\"></ng-container>\n          <div class=\"ms-1 btn-group\" [sq-action-buttons]=\"{items: facetInstance.actions, rightAligned: true, size: 'sm'}\"></div>\n        </div>\n\n        <div class=\"facet-wrapper\">\n          <ng-container\n            [sqLoadComponent]=\"{\n              component: item.component,\n              inputs: item.componentInputs\n            }\"\n            (sqLoadComponent)=\"onLoadFacet($event)\">\n          </ng-container>\n        </div>\n      </ng-container>\n    </div>\n  </li>\n\n  <!-- Optional facet customization menu -->\n  <li class=\"nav-item\" *ngIf=\"facetMenu\"\n    [sq-action-item]=\"{item: facetMenu, size: size, autoAdjust: autoAdjust, autoAdjustBreakpoint: autoAdjustBreakpoint, inMenu: true}\"\n    [collapseBreakpoint]=\"collapseBreakpoint\">\n  </li>\n</ul>\n","import { ChangeDetectorRef, Component, ComponentRef, ElementRef, EventEmitter, Input, OnChanges, OnDestroy, Output, SimpleChanges, Type, ViewChild } from \"@angular/core\";\nimport { AbstractFacet } from \"../../abstract-facet\";\nimport { FacetConfig } from \"../../facet-config\";\nimport { FirstPageService, SearchService } from \"@sinequa/components/search\";\nimport { AppService, Query } from \"@sinequa/core/app-utils\";\nimport { MapOf, Utils } from \"@sinequa/core/base\";\nimport { Results } from \"@sinequa/core/web-services\";\nimport { FacetEventType, FacetService } from \"../../facet.service\";\nimport { Subscription } from \"rxjs\";\n\n@Component({\n    selector: 'sq-facet-container',\n    templateUrl: './facet-container.component.html',\n    standalone: false\n})\nexport class FacetContainerComponent<T extends {}> implements OnChanges, OnDestroy {\n\n  @Input() results?: Results;\n  @Input() query?: Query;\n  @Input() facetComponents: Record<string, Type<any>>;\n  @Input() facetConfigs: FacetConfig<T>[];\n  @Input() buttonClass = 'primary';\n\n  @Output() facetOpen = new EventEmitter<boolean>();\n\n  @ViewChild(\"buttonList\", {read: ElementRef}) buttonList: ElementRef<HTMLDivElement>;\n\n  openedFacet: FacetConfig<T> | undefined;\n  facetInputs: MapOf<any> | undefined;\n  facetInstance: AbstractFacet | undefined;\n\n  facetList: {config: FacetConfig<T>, filters: number, classes: {}, disabled: boolean}[];\n\n  _resultsMode: 'current' | 'all' = 'current';\n\n  get resultsMode() {\n    if(!this.results) {\n      return 'all';\n    }\n    return this._resultsMode;\n  }\n\n  set resultsMode(mode: 'current' | 'all') {\n    this._resultsMode = mode;\n    this.setFacetInputs();\n  }\n\n  subscription: Subscription;\n\n\n  constructor(\n    public appService: AppService,\n    public facetService: FacetService,\n    public searchService: SearchService,\n    public firstPageService: FirstPageService,\n    public cdRef: ChangeDetectorRef\n  ){\n    this.subscription = this.facetService.events.subscribe(event => {\n      if(event.type === FacetEventType.AddFilter) {\n        this.close();\n      }\n    })\n  }\n\n  ngOnChanges(changes: SimpleChanges): void {\n    this.updateFacetList();\n    if(this.openedFacet) {\n      // When the query was changed (eg. a filter was applied), but there are no new results (yet)\n      if(changes.query && !changes.results) {\n        // If we are on a search route, results are incoming\n        const query = this.query || this.searchService.query;\n        if(this.facetService.canSearch(query)) {\n          // We want to avoid refreshing facets twice on the search page\n          // When the query changes and then the results change\n          return;\n        }\n        // If we are on the home page, results are not incoming so facets\n        // will be refreshed with the same data\n        const results = this.results || this.firstPageService.firstPage;\n        if(results) {\n          // Reinitialize aggregations (in particular the $filtered flags)\n          this.searchService.initializeAggregations(query, results);\n        }\n      }\n      this.setFacetInputs();\n    }\n  }\n\n  ngOnDestroy(): void {\n    this.subscription.unsubscribe();\n  }\n\n  // Facet management\n\n  updateFacetList() {\n    const query = this.query || this.searchService.query;\n    const ccquery = this.appService.getCCQuery(query.name);\n    const results = this.results || this.firstPageService.firstPage;\n    this.facetList = this.facetConfigs.map(config => {\n      const aggregations = Utils.asArray(config.aggregation);\n      let filters = 0;\n      let count = 0;\n      for(let aggregation of aggregations) {\n        const ccagg = this.appService.getCCAggregation(aggregation, ccquery);\n        if(ccagg) {\n          if(ccagg.column.toLowerCase() === \"concepts\") {\n            filters += query.getConcepts().length || 0;\n          }\n          else {\n            filters += query.getFilterCount([ccagg.column]) || 0;\n          }\n        }\n        if(results) {\n          const agg = this.facetService.getAggregation(aggregation, results);\n          count += agg?.items?.length || 0;\n        }\n      }\n      const classes = {\n        ['btn-outline-'+this.buttonClass]: !filters,\n        ['btn-'+this.buttonClass]: filters,\n      };\n      const disabled = !!results && count === 0;\n      return {config, filters, classes, disabled};\n    });\n  }\n\n  open(facet: FacetConfig<T>) {\n    this.facetInputs = undefined;\n    if(this.openedFacet === facet) {\n      this.openedFacet = undefined;\n    }\n    else {\n      this.openedFacet = facet;\n      this.setFacetInputs();\n      // The following makes sure the facet is visible after it is open\n      setTimeout(() => this.buttonList.nativeElement.scrollIntoView(false));\n    }\n    this.facetOpen.emit(!!this.openedFacet);\n  }\n\n  close() {\n    this.openedFacet = undefined;\n    this.facetOpen.emit(false);\n  }\n\n  setFacetInputs() {\n    if(this.resultsMode === 'all' && !this.firstPageService.firstPage) {\n      this.facetInputs = undefined;\n      this.firstPageService.getFirstPage()\n        .subscribe(() => {\n          this.setFacetInputs();\n        });\n    }\n    else {\n      this.facetInputs = {\n        ...this.openedFacet?.parameters,\n        name: this.openedFacet?.name,\n        aggregation: this.openedFacet?.aggregation,\n        results: this.resultsMode === 'current'? {...this.results} : {...this.firstPageService.firstPage}, // Force change detection on the child facet\n        query: this.query\n      };\n      this.cdRef.detectChanges(); // Setting the facetInputs can results in new facetActions (without necessarily triggering onLoadComponent())\n    }\n  }\n\n  onLoadComponent(event: {componentRef: ComponentRef<AbstractFacet> | undefined}) {\n    this.facetInstance = event.componentRef?.instance;\n    this.cdRef.detectChanges(); // Detect changes manually, because the facet actions need to be displayed\n  }\n\n  get isFacetEmpty(): boolean {\n    return !!this.facetInstance?.isHidden();\n  }\n}\n","<!-- List of buttons that activate a facet -->\n<sq-collapse #buttonList [collapsed]=\"!!openedFacet\">\n  <ng-template>\n    <div class=\"small fw-bold mb-2\">{{ 'msg#facet.container.help' | sqMessage }}</div>\n    <button *ngFor=\"let facet of facetList\"\n      class=\"me-2 mb-1 btn btn-sm position-relative\"\n      [ngClass]=\"facet.classes\"\n      type=\"button\"\n      (click)=\"open(facet.config)\"\n      [title]=\"(facet.config.title || '') | sqMessage\"\n      [disabled]=\"facet.disabled\">\n      <span *ngIf=\"facet.config.icon\" [ngClass]=\"facet.config.icon\"></span>\n      <span class=\"ms-1\">{{facet.config.title | sqMessage}}</span>\n      <span class=\"position-absolute top-0 start-100 translate-middle badge rounded-pill bg-danger\" *ngIf=\"facet.filters\">\n        {{facet.filters}}\n      </span>\n    </button>\n  </ng-template>\n</sq-collapse>\n\n<!-- Facet component -->\n<sq-collapse [collapsed]=\"!openedFacet\">\n  <ng-template>\n    <!-- Selector of results: either \"first page\" (empty search) or current results -->\n    <div class=\"d-flex align-items-center\">\n      <div class=\"me-auto\">\n        <span class=\"small fw-bold me-2\">{{ 'msg#facet.container.filterFor' | sqMessage:openedFacet }}</span>\n        <div class=\"form-check form-check-inline py-2 my-0\" [sqTooltip]=\"'msg#facet.container.currentTitle' | sqMessage\" *ngIf=\"results\">\n          <input class=\"form-check-input\" type=\"radio\" id=\"currentResultsMode\" value=\"current\" [(ngModel)]=\"resultsMode\">\n          <label class=\"form-check-label small fw-bold\" for=\"currentResultsMode\">{{ 'msg#facet.container.current' | sqMessage }}</label>\n        </div>\n        <div class=\"form-check form-check-inline py-2 my-0\" [sqTooltip]=\"'msg#facet.container.allTitle' | sqMessage\">\n          <input class=\"form-check-input\" type=\"radio\" id=\"allDataMode\" value=\"all\" [(ngModel)]=\"resultsMode\">\n          <label class=\"form-check-label small fw-bold\" for=\"allDataMode\">{{ 'msg#facet.container.all' | sqMessage }}</label>\n        </div>\n      </div>\n\n      <!-- Header of the currently open facet -->\n      <ng-container *ngTemplateOutlet=\"facetInstance?.headerTpl\"></ng-container>\n\n      <!-- Actions of the currently open facet -->\n      <div class=\"ms-1 btn-group btn-group-sm\" [sq-action-buttons]=\"{items: facetInstance?.actions, rightAligned: true, size: 'sm'}\"></div>\n\n      <!-- Button to close the open facet-->\n      <button class=\"ms-1 btn btn-sm btn-primary\" [sqTooltip]=\"'msg#facet.container.close' | sqMessage\" (click)=\"close()\">\n        <i class=\"fas fa-fw fa-times\"></i>\n      </button>\n    </div>\n\n    <!-- Actual display of the facet -->\n    <div class=\"facet-container\">\n      <ng-container *ngIf=\"openedFacet && facetInputs\"\n        [sqLoadComponent]=\"{component: facetComponents[openedFacet.type], inputs: facetInputs}\"\n        (sqLoadComponent)=\"onLoadComponent($event)\">\n      </ng-container>\n    </div>\n\n    <!-- Spinner displayed when \"first page\" is loading -->\n    <div *ngIf=\"!facetInputs\" class=\"d-flex flex-column align-items-center\">\n      <div class=\"spinner-border my-5\" role=\"status\">\n        <span class=\"visually-hidden\">Loading...</span>\n      </div>\n    </div>\n\n    <!-- Displayed when the when auto-hides (no data to display) -->\n    <div *ngIf=\"isFacetEmpty\" class=\"d-flex flex-column align-items-center\">\n      <div class=\"my-5 text-muted small\">\n        <i>{{ 'msg#facet.container.noData' | sqMessage }}</i>\n      </div>\n    </div>\n  </ng-template>\n</sq-collapse>\n\n","import { Component, OnChanges, Input, Output, EventEmitter, ChangeDetectorRef, ComponentRef, SimpleChanges, Type, OnDestroy } from '@angular/core';\r\nimport { Results } from '@sinequa/core/web-services';\r\nimport { AbstractFacet } from '../../abstract-facet';\r\nimport { FacetConfig, DEFAULT_FACET_COMPONENTS } from \"../../facet-config\";\r\nimport { Action } from '@sinequa/components/action';\r\nimport { FacetEventType, FacetService } from '../../facet.service';\r\nimport { MapOf, Utils } from '@sinequa/core/base';\r\nimport { Query } from '@sinequa/core/app-utils';\r\nimport { Subscription } from 'rxjs';\r\n\r\ndeclare interface FacetMultiConfig extends FacetConfig<{displayEmptyDistributionIntervals?: boolean}> {\r\n  // Properties internally setup by this component\r\n  $count: number;\r\n  $hasMore: boolean;\r\n  $hasFiltered: boolean;\r\n  $hidden: boolean;\r\n  $fields: string[];\r\n  $disabled?: boolean;\r\n}\r\n\r\n@Component({\n    selector: 'sq-facet-multi',\n    templateUrl: './facet-multi.component.html',\n    styleUrls: ['./facet-multi.component.scss'],\n    standalone: false\n})\r\nexport class BsFacetMultiComponent extends AbstractFacet implements OnChanges, OnDestroy {\r\n\r\n  @Input() results: Results;\r\n  @Input() query?: Query;\r\n  @Input() facets: FacetMultiConfig[];\r\n  @Input() facetComponents: MapOf<Type<any>> = DEFAULT_FACET_COMPONENTS;\r\n  @Input() showCount: boolean = true;\r\n  @Input() name = \"facet-multi\";\r\n  @Input() icon = \"fas fa-filter\";\r\n  @Input() title = \"msg#facet.filters.title\";\r\n\r\n  @Output() events = new EventEmitter<FacetMultiConfig|undefined>();\r\n\r\n  /**\r\n   * A reference to the facet child component\r\n   */\r\n  facetComponent?: AbstractFacet;\r\n\r\n  /**\r\n   * The facet configuration to open\r\n   */\r\n  openedFacet?: FacetMultiConfig;\r\n\r\n  /**\r\n   * Action to switch back from an opened facet to the facet multi view\r\n   */\r\n  backAction: Action;\r\n  clearAllFiltersAction: Action;\r\n\r\n  facetComponentInputs: MapOf<any>;\r\n\r\n  subscription: Subscription;\r\n\r\n  constructor(\r\n    public facetService: FacetService,\r\n    private changeDetectorRef: ChangeDetectorRef\r\n  ) {\r\n\r\n    super();\r\n\r\n    this.clearAllFiltersAction = new Action({\r\n      icon: \"sq-filter-clear\",\r\n      title: \"msg#facet.clearSelects\",\r\n      action: () => {\r\n        const fields = this.facets\r\n          .filter((facet) => facet.$hasFiltered)\r\n          .map(facet => facet.$fields)\r\n          .flat();\r\n        this.facetService.clearFiltersSearch(fields, true, this.query, this.name);\r\n      }\r\n    });\r\n\r\n    this.subscription = this.facetService.events.subscribe(event => {\r\n      if(event.type === FacetEventType.AddFilter && this.openedFacet) {\r\n        this.close();\r\n      }\r\n    });\r\n\r\n  }\r\n\r\n  /**\r\n   * If a sub-facet is opened, add a Back button and forward\r\n   * the actions of the facet.\r\n   */\r\n  override get actions(): Action[] {\r\n    const actions: Action[] = [];\r\n    if (!this.openedFacet && this.facets.some(facet => facet.$hasFiltered)) {\r\n      actions.push(this.clearAllFiltersAction);\r\n    }\r\n    if(this.facetComponent){\r\n      actions.push(...this.facetActions);\r\n    }\r\n    return actions;\r\n  }\r\n\r\n  /**\r\n   * Return the actions of the child facet\r\n   */\r\n  get facetActions(): Action[] {\r\n    if(this.facetComponent){\r\n      return this.facetComponent.actions;\r\n    }\r\n    return [];\r\n  }\r\n\r\n  /**\r\n   * Open this sub facet\r\n   * @param facet\r\n   */\r\n  openFacet(facet: FacetMultiConfig){\r\n    this.openedFacet = facet;\r\n    this.facetComponentInputs = this.getFacetInputs();\r\n    this.events.next(facet);\r\n    this.changeDetectorRef.detectChanges();\r\n  }\r\n\r\n  close() {\r\n    this.openedFacet = undefined;\r\n    this.events.next(undefined);\r\n    this.changeDetectorRef.detectChanges();\r\n  }\r\n\r\n  clearFacetFilters(facet: FacetMultiConfig, e:Event) {\r\n    e.stopPropagation();\r\n    this.facetService.clearFiltersSearch(facet.$fields, true, this.query, facet.name);\r\n    return false;\r\n  }\r\n\r\n  initFacet(facet: FacetMultiConfig) {\r\n    facet.$fields = [];\r\n    facet.$count = 0;\r\n    facet.$hasMore = false;\r\n    facet.$hasFiltered = false;\r\n\r\n    for(const aggregation of Utils.asArray(facet.aggregation)) {\r\n      const agg = this.facetService.getAggregation(aggregation, this.results);\r\n      if(agg) {\r\n        facet.$fields.push(agg.column);\r\n        if(agg.items) {\r\n          const aggCount = agg.$cccount < 0 ? agg.items.length : agg.$cccount; // configured count (default: 10)\r\n          const aggItemCounter = (!agg.isDistribution || facet?.parameters?.displayEmptyDistributionIntervals)\r\n            ? agg.items.length\r\n            : agg.items.filter(item => item.count > 0).length;\r\n          if(aggItemCounter >= aggCount) {\r\n            facet.$count += aggCount;\r\n            facet.$hasMore = true; // The number of items is superior or equal to the configured number\r\n          }\r\n          else {\r\n            facet.$count += aggItemCounter;\r\n          }\r\n        }\r\n        if(agg.$filtered.length > 0) {\r\n          facet.$hasFiltered = true;\r\n        }\r\n\r\n        if(facet.$count === 0) {\r\n          facet.$disabled = true;\r\n        }\r\n        // if facet is of type = \"datetime\" the facet should be enabled\r\n        if(agg.$cccolumn?.type === \"datetime\" || facet.$count > 0) {\r\n          facet.$disabled = false;\r\n        }\r\n      }\r\n    }\r\n\r\n    // The facet is hidden if there are included tabs and the current tab is not in it\r\n    // OR if there are excluded tabs and the current tab is in it.\r\n    facet.$hidden = !this.facetService.isFacetIncluded(facet, this.results);\r\n  }\r\n  /**\r\n   * When the results change, actualize count, hasData and hasFiltered\r\n   * which are displayed in the template.\r\n   * Also, update list of inputs passed to child facets\r\n   */\r\n  ngOnChanges(changes: SimpleChanges) {\r\n    for(const facet of this.facets) {\r\n      this.initFacet(facet);\r\n    }\r\n    // Update list of inputs used by child facet\r\n    // PS: attributes of openedFacet MUST have the same name as component's inputs name\r\n    if (changes.results) {\r\n      this.facetComponentInputs = {results: this.results}\r\n    }\r\n    if (changes.facets) {\r\n      this.facetComponentInputs = this.getFacetInputs();\r\n    }\r\n\r\n    this.changeDetectorRef.detectChanges();\r\n  }\r\n\r\n  ngOnDestroy(): void {\r\n    this.subscription.unsubscribe();\r\n  }\r\n\r\n  onFacetLoad(componentRef: {componentRef: ComponentRef<AbstractFacet> | undefined}) {\r\n    this.facetComponent = componentRef?.componentRef?.instance;\r\n  }\r\n\r\n  getFacetInputs(): MapOf<any> {\r\n    return {\r\n      ...this.openedFacet?.parameters,\r\n      name: this.openedFacet?.name,\r\n      aggregation: this.openedFacet?.aggregation,\r\n      results: this.results\r\n    };\r\n  }\r\n\r\n  get component() {\r\n    if (this.facetComponents && this.openedFacet) {\r\n      return this.facetComponents[this.openedFacet.type];\r\n    }\r\n    return undefined\r\n  }\r\n\r\n}\r\n","<div *ngIf=\"!openedFacet\" class=\"list-group list-group-flush\">\n    <ng-container *ngFor=\"let facet of facets\">\n        <div *ngIf=\"!facet.$hidden\"\n            class=\"list-group-item list-group-item-action d-flex flex-row align-items-center\"\n            [ngClass]=\"facet.className\"\n            [ngClass]=\"{'sq-filtered':facet.$hasFiltered, 'disabled':facet.$disabled }\"\n            role=\"button\"\n            (click)=\"openFacet(facet)\">\n            <span class=\"flex-grow-1\">{{ facet.title | sqMessage }}</span>\n            <a *ngIf=\"facet.$hasFiltered\"\n                sqTooltip=\"{{ 'msg#facet.clearSelects' | sqMessage }}\"\n                role=\"button\" (click)=\"clearFacetFilters(facet, $event)\">\n                <i class=\"sq-filter-clear text-muted ms-2\"></i>\n            </a>\n            <span\n              *ngIf=\"showCount && facet?.parameters?.showCount\"\n                class=\"mx-2 text-muted small\"\n                title=\"{{ 'msg#facet.filterItemCountTooltip' | sqMessage:{ values: { count: facet.$count + (facet.$hasMore? '+' : '') } } }}\"\n            >\n                {{ facet.$count }}{{ facet.$hasMore? '+' : '' }}\n            </span>\n            <i class=\"fas fa-caret-right\"></i>\n        </div>\n    </ng-container>\n</div>\n\n<ng-container\n    *ngIf=\"openedFacet\"\n    [sqLoadComponent]=\"{component: component, inputs: facetComponentInputs}\"\n    (sqLoadComponent)=\"onFacetLoad($event)\">\n</ng-container>\n\n<ng-template #headerTpl>\n  <ng-container *ngIf=\"openedFacet\">\n    <button class=\"btn btn-light btn-sm sq-back-button\" type=\"button\" [sqTooltip]=\"'msg#facet.filters.back' | sqMessage\" (click)=\"close()\">\n      <i class=\"fas fa-arrow-left\"></i>\n    </button>\n    <span class=\"text-truncate flex-grow-1 my-1\">{{openedFacet.title | sqMessage}}</span>\n    <ng-container *ngTemplateOutlet=\"facetComponent?.headerTpl\"></ng-container>\n  </ng-container>\n\n  <ng-container *ngIf=\"!openedFacet\">\n    <div class=\"py-1\">\n      <i class=\"{{icon}} me-2\"></i>\n      <span class=\"text-truncate\">{{title | sqMessage}}</span>\n    </div>\n  </ng-container>\n</ng-template>\n","import { CommonModule } from \"@angular/common\";\nimport { Component, inject, Input, OnChanges, SimpleChanges } from \"@angular/core\";\n\nimport { Action } from \"@sinequa/components/action\";\nimport { SearchService } from \"@sinequa/components/search\";\nimport { AppService, FormatService } from \"@sinequa/core/app-utils\";\nimport { IntlModule, IntlService } from \"@sinequa/core/intl\";\nimport { EngineType, Results, Select } from \"@sinequa/core/web-services\";\n\nimport { Expr, ExprParser, ExprPipe } from \"@sinequa/components/utils\";\n\nimport { AbstractFacet } from \"../../abstract-facet\";\nimport { FacetConfig } from \"../../facet-config\";\nimport { FacetService } from \"../../facet.service\";\nexport interface FacetMySearchParams {\n    allowDeletion?: boolean;\n    displayFieldNames?: boolean;\n    collapsible?: boolean;\n    useBadges?: boolean;\n    ignoreText?: boolean;\n    excludedFacets?: (string | undefined)[];\n}\n\nexport interface FacetMySearchConfig extends FacetConfig<FacetMySearchParams> {\n    type: 'my-search';\n}\n\ntype FilterScalarOperator =\n    | 'eq'\n    | 'neq'\n    | 'gt'\n    | 'gte'\n    | 'lt'\n    | 'lte'\n    | 'like'\n    | 'contains'\n    | 'regex'\n    | 'null'\n    | 'notnull';\ntype FilterRangeOperator = 'in' | 'between';\ntype FilterExprOperator = 'and' | 'or' | 'not';\ntype FilterOperator = FilterScalarOperator | FilterRangeOperator | FilterExprOperator;\n\n\ntype LegacyFilter = {\n    display: string,\n    field: string,\n    filters?: LegacyFilter | LegacyFilter[],\n    operator?: FilterOperator,\n    values?: string[],\n    value?: string,\n    start?: string | number,\n    end?: string | number\n}\n\ntype MySearchExpr = {\n    expr?: Expr,\n    display: Expr | string,\n    filter?: LegacyFilter,\n    select?: Select\n};\n\n@Component({\n    selector: \"sq-facet-mysearch\",\n    imports: [CommonModule, IntlModule, ExprPipe],\n    templateUrl: \"./facet-mysearch.html\",\n    styleUrls: [\"./facet-mysearch.scss\"]\n})\nexport class BsMySearch extends AbstractFacet implements FacetMySearchParams, OnChanges {\n    @Input() results: Results;\n    /** Display icon to delete items */\n    @Input() allowDeletion: boolean = true;\n    /** Display each item's field */\n    @Input() displayFieldNames: boolean = false;\n    /** Make the div collapsible */\n    @Input() collapsible: boolean = false;\n    /** Add a badge likely style to items */\n    @Input() useBadges: boolean = false;\n    /** Wether we Ignore text and fielded search */\n    @Input() ignoreText: boolean = true;\n    /**\n     * Items of those facets will be excluded\n     * @deprecated Facet are not used anymore\n     * */\n    @Input() excludedFacets: (string | undefined)[] = [\"search-form\"];\n\n    collapsed = false;\n    items: MySearchExpr[] = [];\n    fields: string[] = [];\n\n    clearAction = new Action({\n        icon: \"far fa-minus-square\",\n        title: \"msg#facet.filters.clear\",\n        action: () => this.clear(),\n    });\n\n    searchService = inject(SearchService);\n    appService = inject(AppService);\n    formatService = inject(FormatService);\n    intlService = inject(IntlService);\n    facetService = inject(FacetService);\n\n    ngOnChanges(changes: SimpleChanges) {\n        if (!!changes[\"results\"]) {\n            this.items = [];\n            this.initFilters();\n\n            /** Retrieve the field name of each item */\n            this.fields = [];\n            for (const item of this.items) {\n                this.fields.push(this.getField(item))\n            }\n        }\n    }\n\n    // function to set filters as expression (old way)\n    protected initFilters() {\n        const query = this.searchService.query;\n        // Text\n        if (this.ignoreText === false) {\n            if (query && query.text) {\n                const expr = this.makeBreadcrumbsItemFromExpr(query.text);\n                this.items.push(expr);\n            } else {\n                this.items.push({ display: \"msg#emptySearch\" });\n            }\n        }\n\n        // selects\n        if (query && query.select) {\n            for (const select of query.select) {\n                const item = this.makeBreadcrumbsItemFromExpr(select.expression);\n                item.select = select;\n                this.items.push(item);\n            }\n        }\n        // Filters\n        if (query && query.filters) {\n            const filters = query.filters as LegacyFilter;\n            this.traverseFilters(filters);\n        }\n    }\n\n    private traverseFilters(filters: LegacyFilter | LegacyFilter[]) {\n        if (Array.isArray(filters)) {\n            for (const filter of filters) {\n                this.processFilter(filter);\n            }\n        } else {\n            this.processFilter(filters);\n        }\n    }\n\n    private makeBreadcrumbsItemFromDistributionFilter(filter: LegacyFilter, text: string, not: boolean = false) {\n        const e = this.makeBreadcrumbsItemFromExpr(text);\n        if (e.expr)  {\n            e.expr.field = filter.field;\n            e.expr.not = not;\n        }\n        if (e.display instanceof Expr) e.display.field = filter.field;\n        e.filter = filter;\n        this.items.push(e);\n    }\n\n    private processFilter(filter: LegacyFilter, not: boolean = false) {\n        if (filter.field) {\n            const agg = this.facetService.getAggregation(filter.field);\n            if (agg && (agg.isDistribution || agg.$cccolumn?.eType === EngineType.csv)) {\n                if (filter.display) {\n                    this.makeBreadcrumbsItemFromDistributionFilter(filter, filter.display, not);\n                    return;\n                }\n                else {\n                    if (filter.operator !== 'between') {\n                        this.makeBreadcrumbsItemFromDistributionFilter(filter, `${filter.operator} ${filter.value}`);\n                        return;\n                    }\n                    else {\n                        this.makeBreadcrumbsItemFromDistributionFilter(filter, `${filter.operator} ${filter.start} and ${filter.end}`);\n                        return;\n                    }\n                }\n            }\n        }\n\n        if (filter.operator === 'or' || filter.operator === 'and' || filter.operator === 'not') {\n            for (const subFilter of filter.filters as LegacyFilter[]) {\n                if (subFilter.field) {\n                    const a = this.facetService.getAggregation(subFilter.field);\n                    if (a && a.isDistribution) {\n                        if(subFilter.operator !== 'between') {\n                            const e = this.makeBreadcrumbsItemFromExpr(filter.display || subFilter.display || (`${subFilter.operator} ${subFilter.value}`) || \"\");\n                            if (e.expr) e.expr.field = subFilter.field;\n                            if (e.display instanceof Expr) e.display.field = subFilter.field;\n                            if(filter.display) {\n                                e.filter = filter;\n                                this.items.push(e);\n                                return;\n                            }\n                            e.filter = subFilter;\n                            this.items.push(e);\n                        }\n                        else {\n                            this.processFilter(subFilter);\n                        }\n                        continue;\n                    }\n                }\n                this.processFilter(subFilter, filter.operator === 'not');\n            }\n        } else {\n            const expr = this.makeBreadcrumbsItemFromExpr(filter.value || filter.display);\n            expr.filter = filter;\n            if (expr.expr) {\n                expr.expr.field = filter.field;\n            }\n            if (expr.display instanceof Expr) {\n                expr.display.field = filter.field;\n            }\n            this.items.push(expr);\n        }\n    }\n\n    private makeBreadcrumbsItemFromExpr(text: string, not: boolean = false): MySearchExpr {\n        const context = { appService: this.appService, formatService: this.formatService, intlService: this.intlService }\n\n        let expr = ExprParser.parse(text, context);\n        if (!(expr instanceof Expr)) {\n            expr = ExprParser.parse(ExprParser.escape(text), context);\n        }\n        if (expr instanceof Expr) {\n            expr.not = not;\n            return { expr, display: expr };\n        }\n        else {\n            return { expr: undefined, display: expr };\n        }\n    }\n\n\n    protected getField(item): string {\n        if (item.expr) {\n            if (item.expr.field) {\n                return item.expr.field;\n            } else {\n                if (!item.expr.isStructured) {\n                    return \"text\";\n                } else {\n                    const fields = item.expr.getFields();\n                    return fields.join(\"-\");\n                }\n            }\n        }\n        return \"unknown\";\n    }\n\n    removeItem(item) {\n        const index = this.items.indexOf(item);\n        if (index === -1) return;\n        if (index === 0 && !this.ignoreText) {\n            // query text\n            this.searchService.query.text = \"\";\n        } else {\n            if (item.select) {\n                const selectIndex = this.searchService.query.select?.findIndex(s => s.expression === item.select?.expression) ?? -1;\n                if (selectIndex !== -1) {\n                    this.searchService.query.select?.splice(selectIndex, 1);\n                }\n            }\n            if (item.filter) {\n                this.searchService.query.removeFilters(f => f === item.filter);\n            }\n        }\n        this.searchService.search();\n    }\n\n    get isEmpty() {\n        return this.items.length === 0;\n    }\n\n    override get actions(): Action[] {\n        const actions: Action[] = [];\n        if (!this.isEmpty && this.allowDeletion) {\n            actions.push(this.clearAction);\n        }\n        return actions;\n    }\n\n    protected clear() {\n        this.items = [];\n        this.searchService.query.clear();\n        this.searchService.search();\n    }\n}\n","<div class=\"my-search\" [ngClass]=\"collapsed ? 'collapsed-view' : 'expanded-view'\">\n    <ng-container *ngFor=\"let item of items; index as i\">\n        <div *ngIf=\"!item.hidden\"\n            class=\"my-search-content sq-metadata-item sq-metadata-color-{{fields[i]}}\"\n            [ngClass]=\"{'sq-metadata-border': useBadges}\">\n            <span\n                [innerHTML]=\"item.display | sqExpr:{withFields: displayFieldNames, asHTML: true}\"\n                title=\"{{fields[i]}}\">\n            </span>\n            <span\n                *ngIf=\"allowDeletion\"\n                class=\"far fa-times-circle ps-1\"\n                role=\"button\"\n                (click)=\"removeItem(item)\"\n                title=\"{{'msg#facet.mySearch.itemRemove' | sqMessage}}\">\n            </span>\n        </div>\n    </ng-container>\n</div>\n<div *ngIf=\"collapsible && !isEmpty\">\n    <hr>\n    <i class=\"fas fa-chevron-circle-{{collapsed ? 'down' : 'up'}}\" (click)=\"collapsed = !collapsed;\"></i>\n</div>\n","import { CommonModule } from \"@angular/common\";\nimport { ModuleWithProviders, NgModule } from \"@angular/core\";\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\n\nimport { NgxSliderModule } from \"@angular-slider/ngx-slider\";\n\nimport { IntlModule } from \"@sinequa/core/intl\";\n\nimport { BsActionModule } from \"@sinequa/components/action\"; // needed for sq-action-button\nimport { BsAutocompleteModule } from \"@sinequa/components/autocomplete\"; // needed for refine facet\nimport { CollapseModule } from \"@sinequa/components/collapse\";\nimport { BsSearchModule } from \"@sinequa/components/search\"; // needed for refine facet / didyoumean\nimport { UtilsModule } from \"@sinequa/components/utils\";\n\nimport { LoadComponentModule } from \"@sinequa/core/load-component\";\nimport { ALL_FACETS, DEFAULT_FACETS, FacetState, NamedFacetConfig } from \"../facet.service\";\nimport { BsFacetBar } from \"./facet-bar/facet-bar\";\nimport { BsFacetCard } from \"./facet-card/facet-card\";\nimport { FacetContainerComponent } from \"./facet-container/facet-container.component\";\nimport { BsFacetFilters } from \"./facet-filters/facet-filters\";\nimport { BsFacetList } from \"./facet-list/facet-list\";\nimport { BsFacetMultiComponent } from \"./facet-multi/facet-multi.component\";\nimport { BsFacetRange } from \"./facet-range/facet-range\";\nimport { BsRefine } from \"./facet-refine/facet-refine\";\nimport { BsFacetTagCloud } from './facet-tag-cloud/facet-tag-cloud';\nimport { FacetViewDirective } from \"./facet-view.directive\";\nimport { BsMySearch } from \"./facet-mysearch/facet-mysearch\";\n\n@NgModule({\n    imports: [\n        CommonModule,\n        FormsModule,\n        ReactiveFormsModule,\n\n        IntlModule,\n\n        UtilsModule,\n        CollapseModule,\n        BsActionModule,\n        BsSearchModule,\n        BsAutocompleteModule,\n\n        NgxSliderModule,\n        LoadComponentModule,\n        BsMySearch\n    ],\n    declarations: [\n        BsFacetCard, FacetViewDirective, BsFacetList,\n        BsFacetFilters,\n        BsRefine,\n        BsFacetRange, BsFacetBar,\n        BsFacetMultiComponent,\n        BsFacetTagCloud,\n        FacetContainerComponent\n    ],\n    exports: [\n        BsFacetCard, FacetViewDirective, BsFacetList,\n        BsFacetFilters,\n        BsRefine,\n        BsFacetRange, BsFacetBar,\n        BsFacetMultiComponent,\n        BsFacetTagCloud,\n        FacetContainerComponent,\n        BsMySearch\n    ],\n})\nexport class BsFacetModule {\n    public static forRoot(allFacets?: NamedFacetConfig[], defaultFacets?: FacetState[]): ModuleWithProviders<BsFacetModule> {\n        return {\n            ngModule: BsFacetModule,\n            providers: [\n                {\n                    provide: ALL_FACETS,\n                    useValue: allFacets\n                },\n                {\n                    provide: DEFAULT_FACETS,\n                    useValue: defaultFacets\n                },\n            ]\n        };\n    }\n}\n","export default {\n    \"facet\": {\n        \"apply\": \"Apply\",\n        \"applyOr\": \"Apply with OR (default)\",\n        \"applyAnd\": \"Apply with AND\",\n        \"applyNot\": \"Apply with NOT\",\n        \"loadMore\": \"Load more\",\n        \"searchPlaceholder\": \"Search...\",\n        \"clearSelects\" : \"Clear the current filters\",\n        \"searchNoResult\": \"No results\",\n        \"openItem\": \"Open\",\n        \"closeItem\": \"Close\",\n        \"authors\": {\n            \"title\": \"Authors\"\n        },\n        \"concepts\": {\n            \"title\": \"Concepts\"\n        },\n        \"company\": {\n            \"title\": \"Companies\"\n        },\n        \"docformat\": {\n            \"title\": \"Formats\"\n        },\n        \"doctype\": {\n            \"title\": \"Document Types\"\n        },\n        \"documentlanguages\": {\n            \"title\": \"Languages\"\n        },\n        \"fileext\": {\n            \"title\": \"File Extensions\"\n        },\n        \"filename\": {\n            \"title\": \"Filenames\"\n        },\n        \"geo\": {\n            \"title\": \"Places\"\n        },\n        \"matchingpartnames\": {\n            \"title\": \"Matching Partnames\"\n        },\n        \"modified\": {\n            \"title\": \"Dates\"\n        },\n        \"person\": {\n            \"title\": \"People\"\n        },\n        \"refine\": {\n            \"title\": \"Refine Search\",\n            \"input\": {\n                \"label\": \"Refine\",\n                \"buttonTitle\": \"Refine\",\n                \"placeholder\": \"Refine by...\"\n            }\n        },\n        \"size\": {\n            \"title\": \"Sizes\"\n        },\n        \"tagcloud\": {\n            \"title\": \"Tag Cloud\"\n        },\n        \"title\": {\n            \"title\": \"Titles\"\n        },\n        \"treepath\": {\n            \"title\": \"Sources\"\n        },\n        \"recentQueries\": {\n            \"title\": \"Recent queries\"\n        },\n        \"recentQueriesPublic\": {\n            \"title\": \"Public recent queries\"\n        },\n        \"mySearch\": {\n            \"title\": \"My Search\",\n            \"itemRemove\": \"Remove\"\n        },\n        \"search\": {\n            \"label\": \"Search\",\n            \"buttonTitle\": \"Search\",\n            \"placeholder\": \"Search...\",\n            \"showSearchForm\": \"Show search form\",\n            \"hideSearchForm\": \"Hide search form\"\n        },\n        \"range\": {\n            \"year\": \"{date, date, sqYear}\",\n            \"monthYear\": \"{date, date, sqMonthYear}\",\n            \"weekYear\": \"W{week, number, sqWeek} {weekYear, number, sqYear}\",\n            \"apply\": \"Apply\",\n            \"clear\": \"Clear\",\n            \"unavailable\": \"No available range\"\n        },\n\n        \"filters\":{\n            \"title\": \"Filters\",\n            \"add\":\"Add facet\",\n            \"addAll\": \"Add all facets\",\n            \"remove\":\"Remove facet\",\n            \"removeAll\": \"Remove all facets\",\n            \"setDefaults\": \"Set Default facets\",\n            \"clear\":\"Clear filter\",\n            \"moreFilters\":\"\",\n            \"showFilters\":\"Show filters\",\n            \"hideFilters\":\"Hide filters\",\n\n            \"back\": \"Back to filters\",\n            \"selectedFilters\": \"This filter is active in the current query\",\n\n            \"customizeFacets\": \"Select facets to display or hide\"\n        },\n\n        \"selectedValue\": \"This value is selected in the current query\",\n        \"previous\": \"Previous\",\n        \"next\": \"Next\",\n        \"filterItemCountTooltip\": \"{count} possible values for this filter\",\n\n        \"container\": {\n            \"close\": \"Close this filter\",\n            \"help\": \"Narrow your search down with filters:\",\n            \"filterFor\": \"{title} in:\",\n            \"current\": \"Current results\",\n            \"currentTitle\": \"Filters are computed for the list of results currently displayed\",\n            \"all\": \"All data\",\n            \"allTitle\": \"Filters are computed for all possible results (applying filters may yield no result)\",\n            \"noData\": \"No data for this filter\"\n        },\n    },\n\n    \"facetCard\": {\n        \"expand\": \"Expand\",\n        \"collapse\": \"Collapse\",\n        \"enlarge\": \"Enlarge\",\n        \"reduce\": \"Reduce\",\n        \"openSettings\": \"Open settings\",\n        \"saveSettings\": \"Save settings\"\n    },\n\n    \"emptySearch\": \"Empty search\"\n};\n","export default {\n    \"facet\": {\n        \"apply\": \"Appliquer\",\n        \"applyOr\": \"Appliquer avec un OU (par défaut)\",\n        \"applyAnd\": \"Appliquer avec un ET\",\n        \"applyNot\": \"Appliquer en excluant\",\n        \"loadMore\": \"Charger plus\",\n        \"searchPlaceholder\": \"Rechercher...\",\n        \"clearSelects\" : \"Enlever les filtres\",\n        \"searchNoResult\": \"Pas de résultat\",\n        \"openItem\": \"Ouvrir\",\n        \"closeItem\": \"Refermer\",\n        \"authors\": {\n            \"title\": \"Auteurs\"\n        },\n        \"concepts\": {\n            \"title\": \"Concepts\"\n        },\n        \"company\": {\n            \"title\": \"Sociétés\"\n        },\n        \"docformat\": {\n            \"title\": \"Formats\"\n        },\n        \"doctype\": {\n            \"title\": \"Types de document\"\n        },\n        \"documentlanguages\": {\n            \"title\": \"Langues\"\n        },\n        \"fileext\": {\n            \"title\": \"Extensions de fichiers\"\n        },\n        \"filename\": {\n            \"title\": \"Noms de fichiers\"\n        },\n        \"geo\": {\n            \"title\": \"Lieux\"\n        },\n        \"matchingpartnames\": {\n            \"title\": \"Partnames\"\n        },\n        \"modified\": {\n            \"title\": \"Dates\"\n        },\n        \"person\": {\n            \"title\": \"Personnes\"\n        },\n        \"refine\": {\n            \"title\": \"Affiner la recherche\",\n            \"input\": {\n                \"label\": \"Affiner\",\n                \"buttonTitle\": \"Affiner\",\n                \"placeholder\": \"Affiner par ...\"\n            }\n        },\n        \"size\": {\n            \"title\": \"Tailles\"\n        },\n        \"tagcloud\": {\n            \"title\": \"Nuage de mots\"\n        },\n        \"title\": {\n            \"title\": \"Titres\"\n        },\n        \"treepath\": {\n            \"title\": \"Sources\"\n        },\n        \"recentQueries\": {\n            \"title\": \"Requêtes récentes\"\n        },\n        \"recentQueriesPublic\": {\n            \"title\": \"Requêtes publiques récentes\"\n        },\n        \"mySearch\": {\n            \"title\": \"Ma recherche\",\n            \"itemRemove\": \"Supprimer\"\n        },\n        \"search\": {\n            \"label\": \"Rechercher\",\n            \"buttonTitle\": \"Rechercher\",\n            \"placeholder\": \"Rechercher ...\",\n            \"showSearchForm\": \"Afficher le formulaire de recherche\",\n            \"hideSearchForm\": \"Masquer le formulaire de recherche\"\n        },\n        \"range\": {\n            \"year\": \"{date, date, sqYear}\",\n            \"monthYear\": \"{date, date, sqMonthYear}\",\n            \"weekYear\": \"s{week, number, sqWeek} {weekYear, number, sqYear}\",\n            \"apply\": \"Appliquer\",\n            \"clear\": \"Effacer\",\n            \"unavailable\": \"Aucune plage disponible\"\n        },\n\n        \"filters\":{\n            \"title\": \"Filtres\",\n            \"add\":\"Ajouter la facette\",\n            \"addAll\": \"Ajouter toutes les facettes\",\n            \"remove\":\"Retirer la facette\",\n            \"removeAll\": \"Retirer toutes les facettes\",\n            \"setDefaults\": \"Facettes par défaut\",\n            \"clear\":\"Réinitialiser\",\n            \"moreFilters\":\"\",\n            \"showFilters\":\"Montrer les filtres\",\n            \"hideFilters\":\"Cacher les filtres\",\n\n            \"back\": \"Retour aux filtres\",\n            \"selectedFilters\": \"Ce filtre est utilisé dans la recherche actuelle\",\n\n            \"customizeFacets\": \"Sélectionnez les facettes à montrer ou cacher\"\n        },\n\n        \"selectedValue\": \"Cette valeur est sélectionnée dans la recherche actuelle\",\n        \"previous\": \"Précédent\",\n        \"next\": \"Suivant\",\n        \"filterItemCountTooltip\": \"{count} valeurs possibles pour ce filtre\",\n\n        \"container\": {\n            \"close\": \"Fermer ce filtre\",\n            \"help\": \"Affiner la recherche avec des filtres:\",\n            \"filterFor\": \"{title} dans:\",\n            \"current\": \"Résultats actuels\",\n            \"currentTitle\": \"Les filtres sont calculés pour la liste de résultats actuellement affichée\",\n            \"all\": \"Toutes les données\",\n            \"allTitle\": \"Les filtres sont calculés pour toutes les données disponibles (appliquer des filtres peut ne renvoyer aucun résultat)\",\n            \"noData\": \"Pas de données à afficher\"\n        },\n    },\n\n    \"facetCard\": {\n        \"expand\": \"Déplier\",\n        \"collapse\": \"Replier\",\n        \"enlarge\": \"Agrandir\",\n        \"reduce\": \"Réduire\",\n        \"openSettings\": \"Ouvrir les paramètres\",\n        \"saveSettings\": \"Enregistrer les paramètres\"\n    },\n\n    \"emptySearch\": \"Recherche vide\"\n};\n","export default {\n    \"facet\": {\n        \"apply\": \"Anwenden\",\n        \"applyOr\": \"Anwenden mit ODER (Standard)\",\n        \"applyAnd\": \"Anwenden mit UND\",\n        \"applyNot\": \"Anwenden mit NICHT\",\n        \"loadMore\": \"Mehr laden\",\n        \"searchPlaceholder\": \"Suche...\",\n        \"clearSelects\" : \"Entferne die aktuellen Filter\",\n        \"searchNoResult\": \"Keine Ergebnisse\",\n        \"openItem\": \"Öffnen\",\n        \"closeItem\": \"Schließen\",\n        \"authors\": {\n            \"title\": \"Autoren\"\n        },\n        \"concepts\": {\n            \"title\": \"Konzepte\"\n        },\n        \"company\": {\n            \"title\": \"Firmen\"\n        },\n        \"docformat\": {\n            \"title\": \"Formate\"\n        },\n        \"doctype\": {\n            \"title\": \"Dokumenttypen\"\n        },\n        \"documentlanguages\": {\n            \"title\": \"Sprachen\"\n        },\n        \"fileext\": {\n            \"title\": \"Dateierweiterungen\"\n        },\n        \"filename\": {\n            \"title\": \"Dateinamen\"\n        },\n        \"geo\": {\n            \"title\": \"Orte\"\n        },\n        \"matchingpartnames\": {\n            \"title\": \"Übereinstimmende Partnames\"\n        },\n        \"modified\": {\n            \"title\": \"Datumsangaben\"\n        },\n        \"person\": {\n            \"title\": \"Personen\"\n        },\n        \"refine\": {\n            \"title\": \"Suche verfeinern\",\n            \"input\": {\n                \"label\": \"Verfeinern\",\n                \"buttonTitle\": \"Verfeinern\",\n                \"placeholder\": \"Verfeinern nach...\"\n            }\n        },\n        \"size\": {\n            \"title\": \"Größen\"\n        },\n        \"tagcloud\": {\n            \"title\": \"Wortwolke\"\n        },\n        \"title\": {\n            \"title\": \"Titel\"\n        },\n        \"treepath\": {\n            \"title\": \"Quellen\"\n        },\n        \"recentQueries\": {\n            \"title\": \"Kürzliche Suchanfragen\"\n        },\n        \"recentQueriesPublic\": {\n            \"title\": \"Kürzliche öffentliche Suchanfragen\"\n        },\n        \"mySearch\": {\n            \"title\": \"Meine Suche\",\n            \"itemRemove\": \"Entfernen\"\n        },\n        \"search\": {\n            \"label\": \"Suche\",\n            \"buttonTitle\": \"Suche\",\n            \"placeholder\": \"Suche...\",\n            \"showSearchForm\": \"Suchmaske einblenden\",\n            \"hideSearchForm\": \"Suchmaske ausblenden\"\n        },\n        \"range\": {\n            \"year\": \"{date, date, sqYear}\",\n            \"monthYear\": \"{date, date, sqMonthYear}\",\n            \"weekYear\": \"W{week, number, sqWeek} {weekYear, number, sqYear}\",\n            \"apply\": \"Anwenden\",\n            \"clear\": \"Löschen\",\n            \"unavailable\": \"Kein Bereich verfügbar\"\n        },\n\n        \"filters\":{\n            \"title\": \"Filter\",\n            \"add\":\"Filter hinzufügen\",\n            \"addAll\": \"Alle Facetten hinzufügen\",\n            \"remove\":\"Filter entfernen\",\n            \"removeAll\": \"Alle Facetten entfernen\",\n            \"setDefaults\": \"Standardfacetten\",\n            \"clear\":\"Filter löschen\",\n            \"moreFilters\":\"\",\n            \"showFilters\":\"Filter einblenden\",\n            \"hideFilters\":\"Filter ausblenden\",\n\n            \"back\": \"Zurück zu den Filtern\",\n            \"selectedFilters\": \"Dieser Filter ist in der aktuellen Suchanfrage aktiv\",\n\n            \"customizeFacets\": \"Facetten zum Anzeigen oder Ausblenden auswählen\"\n        },\n\n        \"selectedValue\": \"Dieser Wert ist in der aktuellen Anfrage ausgewählt.\",\n        \"previous\": \"Zurück\",\n        \"next\": \"Weiter\",\n        \"filterItemCountTooltip\": \"{count} mögliche Werte für diesen Filter\",\n\n        \"container\": {\n            \"close\": \"Schließen Sie diesen Filter\",\n            \"help\": \"Grenzen Sie Ihre Suche mit Filtern ein:\",\n            \"filterFor\": \"{title} für:\",\n            \"current\": \"Aktuelle Ergebnisse\",\n            \"currentTitle\": \"Filter werden für die aktuell angezeigte Ergebnisliste berechnet\",\n            \"all\": \"Alle Daten\",\n            \"allTitle\": \"Filter werden für alle möglichen Ergebnisse berechnet (das Anwenden von Filtern führt möglicherweise zu keinem Ergebnis)\",\n            \"noData\": \"Keine Daten für diesen Filter\"\n        },\n    },\n\n    \"facetCard\": {\n        \"expand\": \"Erweitern\",\n        \"collapse\": \"Reduzieren\",\n        \"enlarge\": \"Vergrößern\",\n        \"reduce\": \"Reduzieren\",\n        \"openSettings\": \"Einstellungen öffnen\",\n        \"saveSettings\": \"Einstellungen speichern\"\n    },\n\n    \"emptySearch\": \"Leere Suche\"\n};\n","import {Utils} from \"@sinequa/core/base\";\nimport {enSearch, frSearch, deSearch} from \"@sinequa/components/search\";\nimport {enSelection, frSelection, deSelection} from \"@sinequa/components/selection\";\nimport {enCollapse, frCollapse, deCollapse} from \"@sinequa/components/collapse\";\nimport _enFacet from \"./en\";\nimport _frFacet from \"./fr\";\nimport _deFacet from \"./de\";\n\nconst enFacet = Utils.merge({}, _enFacet, enSearch, enSelection, enCollapse);\nconst frFacet = Utils.merge({}, _frFacet, frSearch, frSelection, frCollapse);\nconst deFacet = Utils.merge({}, _deFacet, deSearch, deSelection, deCollapse);\n\nexport {enFacet, frFacet, deFacet};\n\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i2","i3","i4","i1","i2.FacetService","i5","i6","i7","i1.FacetService","i4.FacetService","i4.BsFacetCard","i8","i9","i10"],"mappings":"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"}