{"version":3,"file":"sinequa-atomic-angular.mjs","sources":["../../../projects/atomic-angular/components/backdrop/backdrop.service.ts","../../../projects/atomic-angular/components/backdrop/backdrop.component.ts","../../../projects/atomic-angular/pipes/highlight-word.pipe.ts","../../../projects/atomic-angular/stores/aggregations.store.ts","../../../projects/atomic-angular/stores/app.store.ts","../../../projects/atomic-angular/pipes/source-icon.pipe.ts","../../../projects/atomic-angular/pipes/operator.ts","../../../projects/atomic-angular/pipes/syslang.ts","../../../projects/atomic-angular/pipes/transloco-date.pipe.ts","../../../projects/atomic-angular/pipes/file-size.pipe.ts","../../../projects/atomic-angular/components/deprecated/dropdown-list.ts","../../../projects/atomic-angular/components/deprecated/dropdown-input.ts","../../../projects/atomic-angular/stores/application.store.ts","../../../projects/atomic-angular/stores/principal.store.ts","../../../projects/atomic-angular/utils/debounced-signal.ts","../../../projects/atomic-angular/utils/inline-worker.ts","../../../projects/atomic-angular/utils/query.ts","../../../projects/atomic-angular/utils/routes.ts","../../../projects/atomic-angular/utils/theme-body-hook.ts","../../../projects/atomic-angular/resources/themes.ts","../../../projects/atomic-angular/utils/theme-registry.ts","../../../projects/atomic-angular/utils/sign-in.ts","../../../projects/atomic-angular/providers/bootstrap-app.ts","../../../projects/atomic-angular/utils/with-fetch.ts","../../../projects/atomic-angular/stores/query-params.store.ts","../../../projects/atomic-angular/stores/selection.store.ts","../../../projects/atomic-angular/stores/theme.store.ts","../../../projects/atomic-angular/stores/user-settings/helpers.ts","../../../projects/atomic-angular/stores/user-settings/with-alerts.ts","../../../projects/atomic-angular/stores/user-settings/with-assistant.ts","../../../projects/atomic-angular/stores/user-settings/with-baskets.ts","../../../projects/atomic-angular/stores/user-settings/with-bookmarks.ts","../../../projects/atomic-angular/stores/user-settings/with-dark-mode.ts","../../../projects/atomic-angular/stores/user-settings/with-recent-searches.ts","../../../projects/atomic-angular/stores/user-settings/with-saved-searches.ts","../../../projects/atomic-angular/stores/user-settings/with-user-settings.ts","../../../projects/atomic-angular/stores/user-settings/with-agents.ts","../../../projects/atomic-angular/stores/user-settings/user-settings.store.ts","../../../projects/atomic-angular/services/query.service.ts","../../../projects/atomic-angular/services/aggregations.service.ts","../../../projects/atomic-angular/services/deprecated/app.service.ts","../../../projects/atomic-angular/guards/auth.guard.ts","../../../projects/atomic-angular/services/application.service.ts","../../../projects/atomic-angular/services/audit.service.ts","../../../projects/atomic-angular/services/autocomplete.service.ts","../../../projects/atomic-angular/services/json-method-plugin.service.ts","../../../projects/atomic-angular/services/navigation.service.ts","../../../projects/atomic-angular/tokens/highlights.ts","../../../projects/atomic-angular/tokens/features.ts","../../../projects/atomic-angular/services/preview.service.ts","../../../projects/atomic-angular/services/deprecated/principal.service.ts","../../../projects/atomic-angular/services/saved-searches.service.ts","../../../projects/atomic-angular/services/search.service.ts","../../../projects/atomic-angular/services/selection.service.ts","../../../projects/atomic-angular/services/selection-history.service.ts","../../../projects/atomic-angular/services/text-chunk.service.ts","../../../projects/atomic-angular/services/user-profile.service.ts","../../../projects/atomic-angular/components/deprecated/pagination/pager.component.ts","../../../projects/atomic-angular/components/deprecated/search-input-footer.ts","../../../projects/atomic-angular/components/source/source.component.ts","../../../projects/atomic-angular/components/source/source.component.html","../../../projects/atomic-angular/components/document-locator/document-locator.component.ts","../../../projects/atomic-angular/components/error/error.component.ts","../../../projects/atomic-angular/components/loading/loading.component.ts","../../../projects/atomic-angular/components/metadata/metadata.ts","../../../projects/atomic-angular/components/missing-terms/missing-terms.component.ts","../../../projects/atomic-angular/components/missing-terms/missing-terms.component.html","../../../projects/atomic-angular/features/collections/dialogs/add.dialog.ts","../../../projects/atomic-angular/features/export/export.service.ts","../../../projects/atomic-angular/features/export/dialogs/export.dialog.ts","../../../projects/atomic-angular/components/multi-selection-toolbar/multi-selection-toolbar.ts","../../../projects/atomic-angular/components/navbar-tabs/inject-route-navigation.ts","../../../projects/atomic-angular/directives/child-marker.directive.ts","../../../projects/atomic-angular/features/drawer-stack/drawer-stack.service.ts","../../../projects/atomic-angular/directives/deprecated/select-article-on-click.directive.ts","../../../projects/atomic-angular/directives/deprecated/show-bookmark.directive.ts","../../../projects/atomic-angular/directives/infinite-scroll.directive.ts","../../../projects/atomic-angular/directives/keyboard-navigator.directive.ts","../../../projects/atomic-angular/directives/open-article-on-ctrl-enter.directive.ts","../../../projects/atomic-angular/directives/overflow-manager.directive.ts","../../../projects/atomic-angular/directives/select-article.directive.ts","../../../projects/atomic-angular/directives/theme-provider.directive.ts","../../../projects/atomic-angular/components/navbar-tabs/navbar-tabs.components.ts","../../../projects/atomic-angular/components/sidebar-nav/sidebar-nav.component.ts","../../../projects/atomic-angular/components/no-result/no-result.ts","../../../projects/atomic-angular/components/preview/preview-navigator.ts","../../../projects/atomic-angular/components/sort-selector/sort-selector.ts","../../../projects/atomic-angular/components/sort-selector/sort-selector.html","../../../projects/atomic-angular/components/sponsored-results/sponsored-results.component.ts","../../../projects/atomic-angular/components/theme/theme-selector.component.ts","../../../projects/atomic-angular/components/theme/theme-toggle.component.ts","../../../projects/atomic-angular/features/sheet/sheet-navbar.ts","../../../projects/atomic-angular/features/advanced-filters/advanced-filters.ts","../../../projects/atomic-angular/features/advanced-filters/advanced-filters.html","../../../projects/atomic-angular/features/filters/aggregation/date/aggregation-date-custom-range.ts","../../../projects/atomic-angular/features/filters/aggregation/date/aggregation-date-dual-pickers.ts","../../../projects/atomic-angular/features/filters/aggregation/date/aggregation-date-range-dialog.ts","../../../projects/atomic-angular/features/filters/aggregation/inject-aggregation-base.ts","../../../projects/atomic-angular/features/filters/tokens/filter-date-allow-custom-range.token.ts","../../../projects/atomic-angular/features/filters/aggregation/date/aggregation-date.ts","../../../projects/atomic-angular/features/filters/aggregation/date/aggregation-date.html","../../../projects/atomic-angular/features/filters/aggregation/date/date.component.ts","../../../projects/atomic-angular/features/advanced-search/panels/article-entities.ts","../../../projects/atomic-angular/features/advanced-search/panels/article-extracts.ts","../../../projects/atomic-angular/features/advanced-search/panels/article-labels.ts","../../../projects/atomic-angular/features/advanced-search/panels/article-similar-documents.ts","../../../projects/atomic-angular/features/advanced-search/advanced-search.ts","../../../projects/atomic-angular/features/advanced-search/advanced-search.html","../../../projects/atomic-angular/models/user-settings.ts","../../../projects/atomic-angular/features/alerts/dialogs/alert.dialog.ts","../../../projects/atomic-angular/features/alerts/alerts.ts","../../../projects/atomic-angular/features/alerts/alerts.html","../../../projects/atomic-angular/features/auth/views/change-password-form.ts","../../../projects/atomic-angular/features/auth/views/forgot-password-form.ts","../../../projects/atomic-angular/features/auth/views/signed-out.ts","../../../projects/atomic-angular/features/auth/views/sign-in-form.ts","../../../projects/atomic-angular/features/auth/auth-page.ts","../../../projects/atomic-angular/features/bookmarks/bookmark-button.ts","../../../projects/atomic-angular/features/bookmarks/bookmarks.ts","../../../projects/atomic-angular/features/bookmarks/bookmarks.html","../../../projects/atomic-angular/features/collections/dialogs/delete.dialog.ts","../../../projects/atomic-angular/features/collections/collections.ts","../../../projects/atomic-angular/features/collections/collections.html","../../../projects/atomic-angular/features/dialogs/feature-flags.dialog.ts","../../../projects/atomic-angular/features/dialogs/override-user.dialog.ts","../../../projects/atomic-angular/features/dialogs/reset-user-settings.dialog.ts","../../../projects/atomic-angular/features/did-you-mean/did-you-mean.ts","../../../projects/atomic-angular/features/drawer/drawer.service.ts","../../../projects/atomic-angular/features/drawer/drawer.component.ts","../../../projects/atomic-angular/features/drawer/navbar/drawer-navbar.component.ts","../../../projects/atomic-angular/features/drawer/advanced-filters/advanced-filters.component.ts","../../../projects/atomic-angular/features/drawer/advanced-filters/advanced-filters.component.html","../../../projects/atomic-angular/features/drawer/advanced-search/panels/entities-panel.ts","../../../projects/atomic-angular/features/drawer/advanced-search/panels/extracts-panel.ts","../../../projects/atomic-angular/features/drawer/advanced-search/panels/labels-panel.ts","../../../projects/atomic-angular/features/drawer/advanced-search/panels/similar-documents-panel.ts","../../../projects/atomic-angular/features/drawer/advanced-search/advanced-search.component.ts","../../../projects/atomic-angular/features/drawer/advanced-search/advanced-search.component.html","../../../projects/atomic-angular/features/drawer/preview/drawer-preview.component.ts","../../../projects/atomic-angular/features/drawer/preview/drawer-preview.component.html","../../../projects/atomic-angular/features/drawer-stack/drawer-stack.component.ts","../../../projects/atomic-angular/features/feedback/dialogs/feedback.dialog.ts","../../../projects/atomic-angular/features/feedback/feedback.ts","../../../projects/atomic-angular/features/feedback/feedback.html","../../../projects/atomic-angular/features/filters/aggregation/panel/aggregation-panel.ts","../../../projects/atomic-angular/features/filters/aggregation/panel/aggregation-panel.html","../../../projects/atomic-angular/features/filters/aggregation/tree/aggregation-tree.ts","../../../projects/atomic-angular/features/filters/aggregation/tree/aggregation-tree.html","../../../projects/atomic-angular/features/filters/aggregation/list/aggregation-list.ts","../../../projects/atomic-angular/features/filters/aggregation/list/aggregation-list.html","../../../projects/atomic-angular/features/filters/aggregation/aggregation.ts","../../../projects/atomic-angular/features/filters/aside-filters.component.ts","../../../projects/atomic-angular/features/filters/buttons/filter-button.component.ts","../../../projects/atomic-angular/features/filters/tokens/filters-breakpoint.token.ts","../../../projects/atomic-angular/features/filters/more/more.component.ts","../../../projects/atomic-angular/features/filters/more/more-button.component.ts","../../../projects/atomic-angular/features/filters/filters-bar.component.ts","../../../projects/atomic-angular/features/labels/label.service.ts","../../../projects/atomic-angular/features/labels/multiselect-labels.ts","../../../projects/atomic-angular/features/labels/dialogs/edit.dialog.ts","../../../projects/atomic-angular/features/searches/search-footer.ts","../../../projects/atomic-angular/features/searches/search-header.ts","../../../projects/atomic-angular/features/searches/search-list.ts","../../../projects/atomic-angular/features/recent-searches/recent-searches.ts","../../../projects/atomic-angular/features/saved-searches/saved-search.dialog.ts","../../../projects/atomic-angular/features/saved-searches/saved-searches.ts","../../../projects/atomic-angular/features/user-profile/user-profile-form.ts","../../../projects/atomic-angular/features/user-profile/user-profile-form.html","../../../projects/atomic-angular/features/user-profile/user-profile.dialog.ts","../../../projects/atomic-angular/interceptors/audit.interceptor.ts","../../../projects/atomic-angular/interceptors/auth.interceptor.ts","../../../projects/atomic-angular/interceptors/body.interceptor.ts","../../../projects/atomic-angular/interceptors/error.interceptor.ts","../../../projects/atomic-angular/interceptors/toast.interceptor.ts","../../../projects/atomic-angular/interceptors/index.ts","../../../projects/atomic-angular/resolvers/query-name-resolver.ts","../../../projects/atomic-angular/public-api.ts","../../../projects/atomic-angular/sinequa-atomic-angular.ts"],"sourcesContent":["import { Injectable } from '@angular/core';\nimport { BehaviorSubject } from 'rxjs';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class BackdropService {\n  public isVisible = new BehaviorSubject<boolean>(false);\n\n  public show(): void {\n    this.isVisible.next(true);\n  }\n\n  public hide(): void {\n    this.isVisible.next(false);\n  }\n}\n","import { Component, HostBinding, OnDestroy, inject } from '@angular/core';\nimport { Subscription } from 'rxjs';\n\nimport { BackdropService } from './backdrop.service';\n\n@Component({\n  selector: 'Backdrop, backdrop',\n  standalone: true,\n  imports: [],\n  template: ``,\n  host: {\n    class: 'z-[var(--z-backdrop)] bg-backdrop fixed bottom-0 left-0 right-0 top-0 hidden select-none'\n  },\n  styles: [\n    `\n      :host {\n        --backdrop-animation-duration: 250ms;\n\n        animation: hide-backdrop var(--backdrop-animation-duration, 250ms) ease-out;\n\n        &[backdrop-visible='true'] {\n          display: block;\n          animation: show-backdrop var(--backdrop-animation-duration, 250ms) ease-out;\n        }\n\n        @keyframes show-backdrop {\n          0% {\n            display: none;\n            opacity: 0;\n          }\n          1% {\n            display: block;\n          }\n          100% {\n            opacity: 1;\n          }\n        }\n\n        @keyframes hide-backdrop {\n          0% {\n            display: block;\n            opacity: 1;\n          }\n          99% {\n            opacity: 0;\n          }\n          100% {\n            display: none;\n          }\n        }\n      }\n    `\n  ]\n})\nexport class BackdropComponent implements OnDestroy {\n  @HostBinding('attr.backdrop-visible')\n  public backdropVisible: boolean = false;\n\n  private readonly backdrop = inject(BackdropService);\n  private readonly sub = new Subscription();\n\n  constructor() {\n    this.sub.add(this.backdrop.isVisible.subscribe(state => (this.backdropVisible = state)));\n  }\n\n  ngOnDestroy(): void {\n    this.sub.unsubscribe();\n  }\n}\n","import { Pipe, PipeTransform } from '@angular/core';\nimport highlightWords, { HighlightWords } from 'highlight-words';\n\n/**\n * The HighlightWordPipe class is a custom pipe in the Atomic Angular library.\n * It is used to highlight a specific word within a given text.\n *\n * @remarks\n * This pipe takes in a `value` string, a `word` string to highlight, and an optional `clipBy` number to limit the length of the highlighted text.\n * It returns an array of `HighlightWords.Chunk` objects representing the highlighted portions of the text.\n *\n * @example\n * ```html\n * <div [innerHTML]=\"text | highlightWord:'search':10\"></div>\n * ```\n *\n */\n@Pipe({\n  name: 'highlightWord',\n  standalone: true,\n  pure: true\n})\nexport class HighlightWordPipe implements PipeTransform {\n  transform(value: string, word: string, clipBy?: number): HighlightWords.Chunk[] {\n    const valueNormalized = value.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n    const wordNormalized = word.normalize('NFD').replace(/[\\u0300-\\u036f]/g, '');\n    return highlightWords({ text: valueNormalized, query: wordNormalized, clipBy });\n  }\n}\n","import { withDevtools } from \"@angular-architects/ngrx-toolkit\";\nimport { patchState, signalStore, signalStoreFeature, withMethods, withState } from \"@ngrx/signals\";\n\nimport { Aggregation } from \"@sinequa/atomic\";\n\nexport type AggregationsState = {\n  aggregations: Aggregation[];\n};\n\nexport const AggregationsStore = signalStore(\n  // providing store at the root level\n  { providedIn: \"root\" },\n  withDevtools(\"Aggregations\"),\n\n  withAggregationsFeatures()\n);\n\nexport function withAggregationsFeatures() {\n  return signalStoreFeature(\n    withState({ aggregations: [] as Aggregation[] } as AggregationsState),\n    withMethods((store) => ({\n      /**\n       * Updates the state with the provided aggregations.\n       *\n       * @param {Aggregation[]} aggregations - The new aggregations to update the state with.\n       */\n      update(aggregations: Aggregation[]) {\n        patchState(store, (state) => {\n          return { ...state, aggregations };\n        });\n      },\n      /**\n       * Updates an existing aggregation in the store.\n       *\n       * @param aggregation - The aggregation object to update.\n       * @returns void\n       */\n      updateAggregation(aggregation: Aggregation) {\n        patchState(store, (state) => {\n          // aggregation name/column lookup must be case insensitive\n          const index = state.aggregations.findIndex(\n            (a) => a.name.toLocaleLowerCase() === aggregation.name.toLocaleLowerCase()\n          );\n          if (index !== -1) {\n            state.aggregations[index] = aggregation;\n          }\n          return { ...state, aggregations: [...state.aggregations] };\n        });\n      },\n      /**\n       * Clears the aggregations in the store by setting the `aggregations` property to an empty array.\n       *\n       * @remarks\n       * This method uses the `patchState` function to update the state of the store.\n       */\n      clear() {\n        patchState(store, (state) => {\n          return { ...state, aggregations: [] };\n        });\n      },\n\n      /**\n       * Retrieves an aggregation object from the store based on the specified name and kind.\n       * The lookup is case-insensitive and can be performed either by the aggregation's column or name.\n       *\n       * @param name - The name of the aggregation to search for.\n       * @param kind - The type of lookup to perform.\n       *               Use 'column' to search by the aggregation's column, or 'name' to search by its name.\n       *               Defaults to 'name'.\n       * @returns The matching aggregation object if found, otherwise `undefined`.\n       */\n      getAggregation(name: string, kind: \"column\" | \"name\" = \"name\") {\n        // aggregation name/column lookup must be case insensitive\n        const aggregations = store.aggregations();\n        if (!aggregations) return undefined;\n\n        return aggregations.find((aggregation) =>\n          kind === \"column\"\n            ? aggregation.column?.toLocaleLowerCase() === name.toLocaleLowerCase()\n            : aggregation.name.toLocaleLowerCase() === name.toLocaleLowerCase()\n        );\n      }\n    }))\n  );\n}\n","import { computed, InjectionToken, inject } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { withDevtools } from \"@angular-architects/ngrx-toolkit\";\nimport {\n  getState,\n  patchState,\n  signalStore,\n  signalStoreFeature,\n  withComputed,\n  withMethods,\n  withState\n} from \"@ngrx/signals\";\nimport { Aggregation, CCApp, CCColumn, CCQuery, CCWebService, EngineType, extraColumns, fetchApp } from \"@sinequa/atomic\";\n\nimport { CFilter, CFilterItem, CJsonMint, CSources, SideCJson } from \"../models/custom-json\";\nimport { AggregationsStore } from \"./aggregations.store\";\n\n/**\n * Injection token for a list of facet names to display in the application.\n *\n * This token provides a default list of facet names including:\n * - Geo\n * - Company\n * - Person\n * - DocFormat\n * - Modified\n * - Size\n * - DocumentLanguages\n * - Concepts\n *\n * @constant\n * @type {InjectionToken<string[]>}\n *\n * @deprecated use the filters JSON customization instead (admin)\n */\nexport const AGGREGATIONS_NAMES_PRESET_DEFAULT = [\n  \"Places\",\n  \"Sources\",\n  \"Company\",\n  \"People\",\n  \"Formats\",\n  \"Modified\",\n  \"Dates\",\n  \"Sizes\",\n  \"Languages\",\n  \"Concepts\",\n  \"DocFormat\",\n  \"Geo\",\n  \"Person\",\n  \"Treepath\",\n  \"DocumentLanguages\",\n  \"Size\"\n];\n\n/**\n * Injection token for a list of facet names to display in the application.\n * This token uses the default preset list of facet names.\n *\n * @deprecated use the filters JSON customization instead (admin)\n */\nexport const AGGREGATIONS_NAMES = new InjectionToken(\"Facets list to display\", {\n  factory: () => AGGREGATIONS_NAMES_PRESET_DEFAULT\n});\n\nexport type CCWebServiceLabels = CCWebService & {\n  privateLabelsField: string;\n  publicLabelsField: string;\n};\n\nexport type CCAppState = CCApp & {\n  data: CJsonMint;\n  customJSONs: SideCJson[];\n  // properties below should be moved into CCApp\n  auditEnabled?: boolean;\n  dataSets?: string;\n  revision?: number;\n  runnableModels?: string;\n  authorizationLevel?: string;\n  columnMap?: Record<string, CCColumn>;\n};\n\ntype AssistantConfiguration = Record<string, AssistantDetails>;\ntype AgentConfiguration = Record<string, { defaultAgent: string }>;\n\nexport interface AssistantDetails {\n  modeSettings: {\n    enabledUserInput: boolean;\n  };\n  defaultValues: {\n    service_id: string;\n    systemPrompt: string;\n  };\n  additionalWorkflowProperties: unknown;\n  savedChatSettings: {\n    display: boolean;\n  };\n}\n\nexport const AppStore = signalStore(\n  { providedIn: \"root\" },\n  withDevtools(\"App\"),\n\n  withAppFeatures()\n);\n\n/**\n * Basic app management features\n */\nexport function withAppFeatures() {\n  return signalStoreFeature(\n    withState({\n      name: \"\",\n      description: \"\",\n      versionId: \"\",\n      queries: {},\n      rfms: {},\n      indexes: {},\n      lists: {},\n      webServices: {},\n      queryNames: \"\",\n      labels: \"\",\n      preview: \"\",\n      autocomplete: \"\",\n      sponsoredLinks: \"\",\n      queryExport: \"\",\n      queryRssEnabled: false,\n      apiVersion: \"\",\n      workspaceApp: \"\",\n      defaultQueryName: \"\",\n      auditEnabled: false,\n      dataSets: \"\",\n      revision: 0,\n      runnableModels: \"\",\n      authorizationLevel: \"\",\n      columnMap: {},\n      customJSONs: [] as SideCJson[],\n      data: {}\n    } as CCAppState),\n    /**\n     * Enhances the application store with various features and methods.\n     *\n     * This function integrates state management, computed properties, and methods\n     * to interact with the CCApp state, including initialization, updates,\n     * and retrieval of specific data such as web services, queries, and customization JSONs.\n     *\n     * Features:\n     * - State management with initial data.\n     * - Computed properties for customization JSON, sources, and filters.\n     * - Methods for initializing and updating the application state.\n     * - Methods for retrieving web services, labels, queries, and customization JSONs.\n     * - Methods for retrieving aggregation icons and customization items.\n     *\n     * @returns The enhanced application store with additional features and methods.\n     */\n    withMethods((store) => ({\n      /**\n       * Initializes the application state by fetching the app data from the \"App\" API\n       * and updating the store with the retrieved data.\n       *\n       * @returns A promise that resolves when the app data has been fetched and the store has been updated.\n       */\n      async initialize() {\n        let app: CCApp;\n        try {\n          app = await fetchApp();\n        } catch (error) {\n          console.error(\"Error fetching app data:\", error);\n          throw error;\n        }\n\n        patchState(store, app);\n\n        // Build column map for easy access using column name or alias\n        const columnMap: Record<string, CCColumn> = {};\n\n        // set the extra columns\n        Object.values(extraColumns).forEach((col) => {\n          columnMap[col.name.toLocaleLowerCase()] = col;\n          // Add aliases to the map\n          if (col.aliases) {\n            col.aliases.forEach((alias) => {\n              columnMap[alias.toLocaleLowerCase()] = col;\n            });\n          }\n        });\n\n        // Also include columns from the default index \"_\"\n        const schema = app.indexes._?.columns as Record<string, CCColumn> | undefined;\n        if (schema) {\n          Object.keys(schema).forEach((schemaKey) => {\n            const col = schema[schemaKey.toLocaleLowerCase()];\n            if (!col) return;\n\n            columnMap[schemaKey.toLocaleLowerCase()] = col;\n            // Add aliases to the map\n            if (col.aliases) {\n              col.aliases.forEach((alias) => {\n                columnMap[alias.toLocaleLowerCase()] = col;\n              });\n            }\n          });\n\n          // Include columns from all queries\n          Object.keys(app.queries).forEach((queryKey) => {\n            const query = app.queries[queryKey];\n            if (query.columnsInfo?.columns) {\n              Object.values(query.columnsInfo.columns).forEach((c) => {\n                const col = schema[c.name.toLocaleLowerCase()];\n                if (!col) return;\n\n                columnMap[c.name.toLocaleLowerCase()] = col;\n                // Add aliases to the map\n                if (c.aliases) {\n                  c.aliases\n                    .split(/[,;|]/)\n                    .map((a) => a.trim())\n                    .forEach((alias) => {\n                      columnMap[alias.toLocaleLowerCase()] = col;\n                    });\n                }\n              });\n            }\n          });\n          patchState(store, { columnMap });\n        }\n      },\n      /**\n       * Initializes the application state with the provided app name.\n       *\n       * @param appName - The name of the application to fetch the configuration for.\n       *\n       * @returns A promise that resolves when the app data has been fetched and the store has been updated.\n       */\n      async initializeWithAppName(appName: string) {\n        const app = await fetchApp(appName);\n        patchState(store, app);\n      },\n      /**\n       * Updates the application state with the provided CCApp object.\n       *\n       * @param {Partial<CCAppState>} app - The application object containing the new state values.\n       */\n      update(app: Partial<CCAppState>) {\n        patchState(store, (state) => {\n          return { ...state, ...app };\n        });\n      },\n      /**\n       * Returns the web service by type name\n       *\n       * @param type Web service type name\n       * @returns A {@link CCWebService} object or undefined if not found\n       */\n      getWebServiceByType(type: CCWebService[\"webServiceType\"]): CCWebService | undefined {\n        let webService: CCWebService | undefined;\n\n        Object.keys(store.webServices()).forEach((key) => {\n          const w = store.webServices() as Record<string, CCWebService>;\n          const ws = w[key] as unknown as CCWebService;\n          // Check if the web service type matches the specified type in lowercase\n          if (ws.webServiceType.toLowerCase() === type.toLocaleLowerCase()) webService = ws;\n        });\n\n        return webService;\n      },\n      /**\n       * Retrieves the labels from the web service of type 'Labels'.\n       *\n       * @returns An object containing the private and public labels.\n       *          If the labels are not found, returns an object with empty strings for both fields.\n       */\n      getLabels(): { private: string; public: string } {\n        const labels = this.getWebServiceByType(\"labels\") as CCWebServiceLabels;\n        if (!labels) return { private: \"\", public: \"\" };\n        const { publicLabelsField, privateLabelsField } = labels;\n        return { private: privateLabelsField, public: publicLabelsField };\n      },\n      /**\n       * Retrieves a query by its name from the store.\n       *\n       * @param name - The name of the query to retrieve.\n       * @returns The query object if found, otherwise `undefined`.\n       */\n      getQueryByName(name: string): CCQuery | undefined {\n        const queries = store.queries() as Record<string, CCQuery>;\n        // Find the query with the matching name (case-insensitive)\n        return Object.values(queries).find((query) => query.name.toLowerCase() === name.toLowerCase());\n      },\n      /**\n       * Retrieves a query by its index from the store.\n       *\n       * @param index - The index of the query to retrieve.\n       * @returns The query at the specified index, or `undefined` if the index is out of bounds.\n       */\n      getQueryByIndex(index: number): CCQuery | undefined {\n        const queries = store.queries() as Record<string, CCQuery>;\n        const keys = Object.keys(queries);\n        return queries[keys[index]];\n      },\n      /**\n       * Retrieves the default query.\n       * The default query is always the first query in the list of queries.\n       *\n       * @returns {CCQuery | undefined} The default query if it exists, otherwise undefined.\n       */\n      getDefaultQuery(): CCQuery | undefined {\n        return this.getQueryByIndex(0);\n      },\n      /**\n       * Retrieves the allowEmptySearch property for a specific query.\n       * @param queryName - The name of the query for which to retrieve allow empty serach property.\n       * @returns The allowEmptySearch property for the specified query, or false if not found.\n       */\n      allowEmptySearch(queryName: string): boolean {\n        const queries = store.queries() as Record<string, CCQuery>;\n        const keys = Object.keys(queries);\n\n        if (keys.length === 0) return false;\n\n        const query = (queryName && queries[queryName.toLocaleLowerCase()]) || queries[keys[0]];\n        return query?.allowEmptySearch || false;\n      },\n      /**\n       * Retrieves the enableFieldedSearch property for a specific query.\n       * @param queryName - The name of the query for which to retrieve enable fielded search property.\n       * @returns The enableFieldedSearch property for the specified query, or false if not found.\n       */\n      enableFieldedSearch(queryName: string): boolean {\n        const queries = store.queries() as Record<string, CCQuery>;\n        const keys = Object.keys(queries);\n\n        if (keys.length === 0) return false;\n\n        const query = (queryName && queries[queryName.toLocaleLowerCase()]) || queries[keys[0]];\n        return query?.enableFieldedSearch || false;\n      },\n      /**\n       * Determines whether labels are allowed by checking the presence of\n       * both private and public label fields in the 'labels' web service.\n       *\n       * @returns {boolean} `true` if both `privateLabelsField` and `publicLabelsField`\n       * are defined in the 'labels' web service; otherwise, `false`.\n       */\n      allowLabels(): boolean {\n        const labels = this.getWebServiceByType(\"labels\") as CCWebServiceLabels;\n        return labels?.privateLabelsField !== undefined && labels?.publicLabelsField !== undefined;\n      },\n      /**\n       * Retrieves the alias for a given column name from the application's state.\n       * If the column has aliases defined, the first alias is returned. Otherwise,\n       * the original column name is returned.\n       *\n       * @param column - The name of the column for which to retrieve the alias.\n       * @returns The alias of the column if it exists, otherwise the original column name.\n       */\n      getColumnAlias(column: string): string {\n        if (typeof column !== \"string\" || column.length === 0) {\n          return column;\n        }\n        const state = getState(store) as CCApp;\n        const schema = state.indexes._.columns as Record<string, CCColumn>;\n        const key = column.toLocaleLowerCase();\n        const col = Object.hasOwn(schema, key) ? schema[key] : undefined;\n        if (col) {\n          return col.aliases?.[0] ? `${col.aliases[0].charAt(0).toLowerCase()}${col.aliases[0].slice(1)}` : column;\n        }\n        return column;\n      },\n      /**\n       * Retrieves a column definition from the application's state schema by its name.\n       *\n       * @param columnOrAlias - The name or alias of the column to retrieve.\n       * @returns The column definition as a `CCColumn` object if found, or `undefined` if the column does not exist.\n       */\n      getColumn(columnOrAlias: string): CCColumn | undefined {\n        if (typeof columnOrAlias !== \"string\" || columnOrAlias.length === 0) {\n          return undefined;\n        }\n        const state = getState(store) as CCAppState;\n        const columnMap = state.columnMap;\n        if (!columnMap) return undefined;\n\n        const key = columnOrAlias.toLocaleLowerCase();\n        return Object.hasOwn(columnMap, key) ? columnMap[key] : undefined;\n      },\n      /**\n       * Determines if the specified column is of a date-related type.\n       *\n       * This method checks if the column's type matches one of the following:\n       * - `EngineType.date`\n       * - `EngineType.dateTime`\n       * - `EngineType.time`\n       *\n       * @param column - The name of the column to check.\n       * @returns `true` if the column is of a date-related type; otherwise, `false`.\n       */\n      isDateColumn(column: string): boolean {\n        const col = this.getColumn(column);\n        if (col) {\n          return col.eType === EngineType.date || col.eType === EngineType.dateTime || col.eType === EngineType.time;\n        }\n        return false;\n      },\n      /**\n       * Checks if the specified query name corresponds to a tab search.\n       * A tab search is defined by the presence of an active tab search configuration\n       * with at least one tab defined in the query.\n       *\n       * @param queryName - The name of the query to check.\n       * @returns `true` if the query is a tab search; otherwise, `false`.\n       */\n      isTabSearch(queryName: string): boolean {\n        const query = this.getQueryByName(queryName);\n        if (!query) return false;\n        const tabSearch = query.tabSearch;\n        return !(\n          !tabSearch ||\n          !tabSearch.column ||\n          !tabSearch.isActive ||\n          !tabSearch.tabs ||\n          tabSearch.tabs.length === 0\n        );\n      },\n      /**\n       * Retrieves the aggregation count for a specific query and aggregation name.\n       * If the count is not defined, it defaults to 10.\n       *\n       * @param queryName - The name of the query to retrieve the aggregation from.\n       * @param aggregationName - The name of the aggregation to retrieve the count for.\n       * @returns The count of the specified aggregation, or 10 if not defined.\n       */\n      getAggregationCount(queryName: string | undefined, aggregationName: string): number {\n        if (!queryName) {\n          // If queryName is not provided, return the default count\n          return 10; // Default to 10 if queryName is not defined\n        }\n        // If queryName is provided, retrieve the query and its aggregation count\n        const query = this.getQueryByName(queryName);\n        const agg = query?.aggregations.find((aggregation) => aggregation.name === aggregationName);\n        return agg ? agg.count : 10; // Default to 10 if count is not defined\n      }\n    })),\n    withMethods((store, aggregationsStore = inject(AggregationsStore), route = inject(ActivatedRoute)) => ({\n      /**\n       * Retrieves the sorted aggregations based on the query name included in the route data.\n       * @param route - The route including the query name to fetch the aggregations for.\n       * @returns An array of sorted aggregations.\n       */\n      getAuthorizedFilters() {\n        // Get the query name from the route data or use the default query name\n        const { queryName = store.getDefaultQuery()?.name } = route.snapshot.data;\n        const { aggregations = [] } = store.getQueryByName(queryName) || ({} as CCQuery);\n\n        // when no results are returned, the aggregations may be not available\n        const currentAggregations = aggregationsStore.aggregations() || [];\n\n        // sort the aggregations based on the query order\n        if (Array.isArray(aggregations)) {\n          const queryAggregationsOrder = aggregations.map((aggregation) => aggregation.name.trim()) || [];\n          return currentAggregations.toSorted(\n            (a: Aggregation, b: Aggregation) =>\n              queryAggregationsOrder.indexOf(a.name) - queryAggregationsOrder.indexOf(b.name)\n          );\n        }\n        // return the default order\n        return currentAggregations;\n      },\n      /**\n       * Returns the subset of authorized filters that match the provided filters by `name` or `column`.\n       *\n       * @param filters - An array of filter objects, each containing a `column` and `name` property, to check against authorized filters.\n       * @returns An array of authorized filters that match any of the provided filters. Returns an empty array if no matches are found or if either input array is empty.\n       */\n      getAuthorized(filters: Pick<CFilter, \"column\" | \"name\">[]) {\n        const authorizedFilters = this.getAuthorizedFilters();\n        if (filters.length > 0 && authorizedFilters.length > 0) {\n          const filteredAggregations = authorizedFilters.filter((agg) =>\n            filters.some((f) => f.name === agg.name || f.column === agg.column)\n          );\n          return filteredAggregations;\n        }\n        return [];\n      }\n    })),\n    withComputed(({ customJSONs, data }) => {\n      // Helper function to parse JSON data with common error handling and fallback to default customJSONs\n      const parseCustomJson = <T>(jsonName: string, defaultValue: T): T => {\n        // Check if customJSONs is defined and is an array\n        // If not, return the default value or the value from the main data object\n        if (customJSONs() === undefined || Array.isArray(customJSONs()) === false) {\n          return (data() as CJsonMint)[jsonName] || defaultValue;\n        }\n\n        // Find the custom JSON by name, ignoring case\n        // If not found, return the default value or the value from the main data object\n        const json = customJSONs()?.find((json) => json.name.toLocaleLowerCase() === jsonName);\n        if (json === undefined) {\n          return (data() as CJsonMint)[jsonName] || defaultValue;\n        }\n\n        try {\n          // Parse the JSON data\n          const parsedData = typeof json?.data === \"string\" ? JSON.parse(json.data) : json?.data || defaultValue;\n          // If parsedData is a plain empty object ({}), treat it as null/undefined\n          if (\n            parsedData &&\n            typeof parsedData === \"object\" &&\n            !Array.isArray(parsedData) &&\n            Object.getPrototypeOf(parsedData) === Object.prototype &&\n            Object.entries(parsedData).length === 0\n          ) {\n            return (data() as CJsonMint)[jsonName] ?? defaultValue;\n          }\n          return parsedData ?? (data() as CJsonMint)[jsonName] ?? defaultValue;\n        } catch (error) {\n          console.error(`Error parsing ${jsonName} JSON:`, error);\n          return (data() as CJsonMint)[jsonName] ?? defaultValue;\n        }\n      };\n\n      return {\n        customizationJson: computed(() => data() as CJsonMint),\n        sources: computed(() => parseCustomJson<CSources>(\"sources\", {})),\n        filters: computed(() => parseCustomJson<CFilter[]>(\"filters\", [])),\n        general: computed(() => parseCustomJson<CJsonMint[\"general\"]>(\"general\", {})),\n        assistants: computed(() => parseCustomJson<AssistantConfiguration>(\"assistants\", {})),\n        agents: computed(() => parseCustomJson<AgentConfiguration>(\"agents\", {}))\n      };\n    }),\n    withMethods((store) => ({\n      /**\n       * Retrieves the customization json by name\n       * @param name - The name of the customization json\n       * @returns The customization json object or undefined if not found\n       */\n      getNamedCustomizationJson(name: string): unknown | undefined {\n        return store.customJSONs().find((data) => data.name.toLocaleLowerCase() === name.toLocaleLowerCase());\n      },\n      /**\n       * Retrieves the icon associated with a given column's aggregation.\n       *\n       * This method searches through the store's filters to find an aggregation\n       * that matches the specified column. If a matching aggregation is found,\n       * its associated icon is returned. If no matching aggregation is found in\n       * the store's filters, the method falls back to searching in the\n       * customizationJson's filters.\n       *\n       * @param column - The name of the column for which to retrieve the aggregation icon.\n       * @returns The icon associated with the specified column's aggregation, or undefined if no matching aggregation is found.\n       */\n      getAggregationIcon(column: string): string | undefined {\n        const predicate = (aggregation: CFilter) =>\n          aggregation.column.toLocaleLowerCase() === column.toLocaleLowerCase();\n        if (store.filters().length > 0) {\n          return store.filters().find(predicate)?.icon;\n        }\n        // fallback to customizationJson\n        return store.customizationJson().filters?.find(predicate)?.icon;\n      },\n      /**\n       * Retrieves the customization items for a given column from the store's filters.\n       * If no items are found in the store's filters, it falls back to the customization JSON.\n       *\n       * @param column - The name of the column for which to retrieve customization items.\n       * @returns An array of `CFilterItem` objects if found, otherwise `undefined`.\n       */\n      getAggregationItemsCustomization(column: string): CFilterItem[] | undefined {\n        const predicate = (aggregation: CFilter) =>\n          aggregation.column.toLocaleLowerCase() === column.toLocaleLowerCase();\n        if (store.filters().length > 0) {\n          return store.filters().find(predicate)?.items || [];\n        }\n        // fallback to customizationJson\n        return store.customizationJson().filters?.find(predicate)?.items || [];\n      },\n      /**\n       * Retrieves the customization for a specific aggregation column.\n       * @param aggColumn - The column name for which to retrieve the customization.\n       * @returns The customization object for the specified column, or undefined if not found.\n       */\n      getAggregationCustomization(aggColumn: string, aggName?: string): CFilter | undefined {\n        // Be careful, because the column might not be defined in the filters JSON configuration file.\n        // aggColumn can be an alias and in the custom json filters, the column can also be an alias\n        const predicateByColumn = (filter: CFilter) =>\n          filter?.column?.toLocaleLowerCase() === aggColumn.toLocaleLowerCase();\n        const predicateByName = (filter: CFilter) => filter?.name?.toLocaleLowerCase() === aggName?.toLocaleLowerCase();\n\n        // Check if the custom JSON configuration for the filters is available in the store\n        if (store.filters().length === 0) return undefined;\n\n        // try to return the customization\n        //\n        // The name takes priority in the custom JSON file.\n        // is the name exists in the json filters file?\n        if (aggName) {\n          const filter = store.filters().find(predicateByName);\n          // both name matches\n          if (filter) {\n            return filter;\n          }\n        }\n\n        // otherwise search by column's name\n        // both columns's values can be aliases\n\n        // is the column exists in the custom json filters file?\n        const filter = store.filters().find(predicateByColumn);\n        // if the aggName and the filter column's name matches\n        if (filter) {\n          return filter;\n        }\n\n        // check for aliases use cases\n        // is aggregation column name an alias, so we need to find the real name of the column\n        const aggCColumn = store.getColumn(aggColumn);\n        // case of an alias (we use the real name of the column)\n        if (aggCColumn?.name !== aggColumn) {\n          return store.filters().find((filter: CFilter) => {\n            // filter column can also be an alias, so we need to get the real name\n            const filterCColumn = store.getColumn(filter?.column);\n            if (!filterCColumn) return false;\n\n            // compare the real names\n            return filterCColumn?.name.toLocaleLowerCase() === aggCColumn?.name.toLocaleLowerCase();\n          });\n        }\n\n        // no customization found for the aggregation's column\n        return undefined;\n      },\n\n      /**\n       * Determines whether a specific assistant is allowed based on its presence and configuration in the store.\n       *\n       * @param assistantName - The name of the assistant to check.\n       * @returns `true` if the assistant exists in the store and has a defined `service_id` in its `defaultValues`; otherwise, `false`.\n       */\n      isAssistantAllowed(assistantName: string): boolean {\n        const assistants = store.assistants();\n        if (assistants === undefined || Object.keys(assistants).length === 0) return false;\n        return !!assistants[assistantName]?.defaultValues?.service_id;\n      },\n      isAgentAllowed(agentName: string): boolean {\n        const agents = store.agents();\n        if (agents === undefined || Object.keys(agents).length === 0) return false;\n        return !!agents[agentName]?.defaultAgent;\n      }\n    }))\n  );\n}\n","import { Pipe, PipeTransform, inject } from '@angular/core';\nimport { AppStore } from '../stores/app.store';\n\n/**\n * Pipe that transforms a collection of strings into a corresponding Font Awesome icon class.\n *\n * This pipe uses the first element of the collection to determine the icon class\n * based on the source name. If the collection is empty or undefined, it returns\n * a default icon class.\n *\n * @deprecated This pipe is deprecated and will be removed in the future.\n *\n * @param collection - An array of strings representing the collection.\n * @returns A string representing the icon class.\n */\n@Pipe({\n  name: 'sourceIcon',\n  standalone: true,\n  pure: true\n})\nexport class SourceIconPipe implements PipeTransform {\n  appStore = inject(AppStore);\n\n  transform(collection: string[]): string {\n    if (collection === undefined || collection.length === 0) {\n      return 'far fa-file';\n    }\n    const name = collection[0].split('/')[1];\n    const sources = this.appStore.sources();\n\n    // workplace search uses a different format for sources\n    if (Array.isArray(sources)) {\n      return sources.find((source: { name: string }) => source.name === name)?.icon || 'far fa-file';\n    }\n\n    return 'far fa-file';\n  }\n}\n","import { ChangeDetectorRef, DestroyRef, inject, Pipe, PipeTransform } from '@angular/core';\nimport { takeUntilDestroyed } from '@angular/core/rxjs-interop';\nimport { TranslocoService } from '@jsverse/transloco';\n\nimport { FilterOperator, LegacyFilter } from '@sinequa/atomic';\n\n@Pipe({\n  name: 'operator',\n  standalone: true,\n  pure: false\n})\nexport class OperatorPipe implements PipeTransform {\n  private readonly transloco = inject(TranslocoService);\n  private lastTransformedValue: string | null = null;\n  private readonly cdr = inject(ChangeDetectorRef);\n  private readonly destroyRef = inject(DestroyRef);\n\n  transform(filter?: LegacyFilter): string {\n    this.transloco.langChanges$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(locale => {\n      const transformedValue = this.transformFilter(filter, locale);\n\n      if (transformedValue !== this.lastTransformedValue) {\n        this.lastTransformedValue = transformedValue;\n        this.cdr.markForCheck();\n      }\n    });\n\n    return this.lastTransformedValue || this.transformFilter(filter);\n  }\n\n  private transformFilter(filter?: LegacyFilter, locale?: string): string {\n    let op = this.transformOperator(filter?.operator);\n    if (filter?.operator === 'between') {\n      const { start, end } = filter;\n      if (!start || !end) {\n        return 'bad date range';\n      }\n      return `&gt; ${new Intl.DateTimeFormat(locale).format(new Date(start))} &le; ${new Intl.DateTimeFormat(locale).format(new Date(end))}`;\n    }\n\n    if (filter?.operator === 'and') {\n      const filters = filter.filters as LegacyFilter[];\n      const from = filters?.find((f: LegacyFilter) => f.operator === 'gte')?.value as string;\n      const to = filters?.find((f: LegacyFilter) => f.operator === 'lte')?.value as string;\n      if (from && to) {\n        return `&ge; ${new Intl.DateTimeFormat(locale).format(new Date(from))} &le; ${new Intl.DateTimeFormat(locale).format(new Date(to))}`;\n      }\n      if (from) {\n        return `&ge; ${new Intl.DateTimeFormat(locale).format(new Date(from))}`;\n      }\n      if (to) {\n        return `&le; ${new Intl.DateTimeFormat(locale).format(new Date(to))}`;\n      }\n      return filter?.display ?? filter?.value ?? '';\n    }\n\n    const date = new Date(filter?.value || '');\n    if (isNaN(date.getTime())) {\n      return `${op} ${filter?.value || ''}`;\n    } else {\n      return `${op} ${new Intl.DateTimeFormat(locale).format(date)}`;\n    }\n  }\n\n  transformOperator(operator?: FilterOperator): string {\n    switch (operator) {\n      case 'lt':\n        return '&lt;';\n      case 'lte':\n        return '&le;';\n      case 'eq':\n        return '=';\n      case 'neq':\n        return '&ne;';\n      case 'gte':\n        return '&ge;';\n      case 'gt':\n        return '&gt;';\n      default:\n        return '';\n    }\n  }\n}\n","import { ChangeDetectorRef, OnDestroy, Pipe, PipeTransform, inject } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { sysLang } from '@sinequa/atomic';\nimport { Subscription } from 'rxjs';\n\n/**\n * The `SyslangPipe` class is a custom pipe that transforms a string value using the current language.\n * This pipe is used to translate strings that are not part of the Angular i18n system.\n * This pipe exists to keep the compatibility with a legacy system that uses a custom language syntax.\n *\n * This pipe can be used in the following way:\n *\n * @example\n * <div>{{ 'Hello[fr]Bonjour' | syslang }}</div>\n * // output: `Bonjour` if your current language is 'fr'\n * // output: `Hello` if your current language is not 'fr'\n *\n * <div>{{ 'Hello[fr]Bonjour' | syslang: 'fr' }}</div>\n * // output: `Bonjour` even if your current language is not 'fr'\n */\n@Pipe({\n  name: 'syslang',\n  standalone: true,\n  pure: false\n})\nexport class SyslangPipe implements PipeTransform, OnDestroy {\n  private readonly transloco = inject(TranslocoService);\n  private readonly cdr = inject(ChangeDetectorRef);\n\n  private lastValue: string | null = null;\n  private currentLang: string;\n  private subscription: Subscription | null = null;\n\n  ngOnDestroy(): void {\n    this.subscription?.unsubscribe();\n    this.subscription = null;\n  }\n\n  constructor() {\n    this.currentLang = this.transloco.getActiveLang();\n    this.subscription = this.transloco.langChanges$.subscribe(locale => (this.currentLang = locale));\n  }\n\n  /**\n   * Transforms the input value using the current language.\n   * @param value The input string value to be transformed.\n   * @returns The transformed string value.\n   */\n  transform(value?: string, lang?: string): string | null {\n    const transformedValue = sysLang(value || '', lang || this.currentLang);\n\n    if (transformedValue !== this.lastValue) {\n      this.lastValue = transformedValue;\n      this.cdr.markForCheck();\n    }\n\n    return this.lastValue;\n  }\n}\n","import { DATE_PIPE_DEFAULT_OPTIONS, DATE_PIPE_DEFAULT_TIMEZONE, DatePipe, DatePipeConfig } from '@angular/common';\nimport { ChangeDetectorRef, Inject, inject, LOCALE_ID, OnDestroy, Optional, Pipe } from '@angular/core';\nimport { TranslocoService } from '@jsverse/transloco';\nimport { Subscription } from 'rxjs';\n\n@Pipe({\n  name: 'translocoDate',\n  pure: false,\n  standalone: true\n})\nexport class TranslocoDateImpurePipe extends DatePipe implements OnDestroy {\n  private readonly transloco = inject(TranslocoService);\n  private readonly cdr = inject(ChangeDetectorRef);\n\n  private lastTransformedValue: string | null = null;\n  private subscription: Subscription | null = null;\n\n  constructor(\n    @Inject(LOCALE_ID) locale: string,\n    @Inject(DATE_PIPE_DEFAULT_TIMEZONE) @Optional() defaultTimezone?: string | null,\n    @Inject(DATE_PIPE_DEFAULT_OPTIONS) @Optional() defaultOptions?: DatePipeConfig | null\n  ) {\n    super(locale, defaultTimezone, defaultOptions);\n  }\n\n  ngOnDestroy(): void {\n    this.subscription?.unsubscribe();\n    this.subscription = null;\n  }\n\n  override transform(value: Date | string | number, format?: string, timezone?: string): string | null;\n  override transform(value: null | undefined, format?: string, timezone?: string): null;\n  override transform(value: Date | string | number | null | undefined, format?: string, timezone?: string): string | null {\n    this.subscription?.unsubscribe();\n\n    this.subscription = this.transloco.langChanges$.subscribe(locale => {\n      const transformedValue = super.transform(value, format, timezone, locale);\n\n      if (transformedValue !== this.lastTransformedValue) {\n        this.lastTransformedValue = transformedValue;\n        this.cdr.markForCheck();\n      }\n    });\n\n    return this.lastTransformedValue;\n  }\n}\n","import { Pipe, type PipeTransform } from '@angular/core';\n\n@Pipe({\n  name: 'fileSize'\n})\nexport class FileSizePipe implements PipeTransform {\n  transform(value: number): { key: string; value: number } {\n    return this.formatMemorySize(value);\n  }\n  /**\n   * Formats a given size in bytes into a more readable format.\n   * It converts the size into kilobytes, megabytes, gigabytes, terabytes, or petabytes as appropriate.\n   *\n   * @param size - The size in bytes to be formatted.\n   * @returns An object containing the key representing the unit and the value in that unit.\n   *\n   * @example\n   * In a component template:\n   * {{ 1048576 | fileSize | json }}\n   * Output: { \"key\": \"memorySize.mb\", \"value\": 1 }\n   */\n  formatMemorySize(size: number): { key: string; value: number } {\n    const kiloBytes: number = size / 1024;\n    const megaBytes: number = kiloBytes / 1024;\n    const gigaBytes: number = megaBytes / 1024;\n    const teraBytes: number = gigaBytes / 1024;\n    const petaBytes: number = teraBytes / 1024;\n\n    const obj: any = { key: 'memorySize.bytes', value: size };\n    if (Math.abs(petaBytes) >= 1) {\n      obj.key = 'memorySize.pb';\n      obj.value = petaBytes;\n    } else if (Math.abs(teraBytes) >= 1) {\n      obj.key = 'memorySize.tb';\n      obj.value = teraBytes;\n    } else if (Math.abs(gigaBytes) >= 1) {\n      obj.key = 'memorySize.gb';\n      obj.value = gigaBytes;\n    } else if (Math.abs(megaBytes) >= 1) {\n      obj.key = 'memorySize.mb';\n      obj.value = megaBytes;\n    } else if (Math.abs(kiloBytes) >= 1) {\n      obj.key = 'memorySize.kb';\n      obj.value = kiloBytes;\n    }\n    return obj;\n  }\n}\n","import { Component, input, output } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { SyslangPipe } from \"../../pipes\";\nimport { DropdownItem } from \"./dropdown-input\";\n\n@Component({\n  selector: \"dropdown-list, DropdownList\",\n  imports: [SyslangPipe, TranslocoPipe],\n  standalone: true,\n  template: `\n    @for (item of items(); track $index) {\n      <span class=\"bg-primary text-primary-foreground m-1 inline-flex cursor-default select-none items-center rounded-full px-2 py-1 font-semibold\">\n        {{ item.display || item.value | syslang | transloco }}\n        <svg\n          (click)=\"onClick.emit(item)\"\n          xmlns=\"http://www.w3.org/2000/svg\"\n          class=\"ml-2 cursor-pointer\"\n          width=\"16\"\n          height=\"16\"\n          fill=\"none\"\n          viewBox=\"0 0 16 16\"\n          aria-hidden=\"true\">\n          <circle cx=\"8\" cy=\"8\" r=\"7\" stroke=\"currentColor\" stroke-width=\"2\" fill=\"none\" />\n          <line x1=\"5\" y1=\"5\" x2=\"11\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n          <line x1=\"11\" y1=\"5\" x2=\"5\" y2=\"11\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n        </svg>\n      </span>\n    }\n  `\n})\nexport class DropdownListComponent {\n  items = input.required<DropdownItem[]>();\n\n  onClick = output<DropdownItem>();\n}\n","import { Component, input, output } from '@angular/core';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { DropdownComponent, DropdownContentComponent, InputComponent } from '@sinequa/ui';\n\nimport { SyslangPipe } from '../../pipes';\nimport { DropdownListComponent } from './dropdown-list';\n\nexport interface DropdownItem {\n  display?: string;\n  value: string;\n}\n\n@Component({\n  selector: 'dropdown-input, DropdownInput',\n  standalone: true,\n  imports: [DropdownComponent, DropdownListComponent, DropdownContentComponent, InputComponent, SyslangPipe, TranslocoPipe],\n  template: `\n    @if (label()) {\n      <p class=\"font-semibold\">{{ label() }}</p>\n    }\n    <Dropdown class=\"block w-full\">\n      <input\n        #searchInput\n        class=\"w-1/2 grow\"\n        type=\"text\"\n        autocomplete=\"off\"\n        spellcheck=\"false\"\n        [attr.aria-label]=\"placeholder()\"\n        [attr.placeholder]=\"placeholder()\"\n        (focus)=\"onFocus.emit(searchInput.value)\"\n        (keyup)=\"onKeyUp.emit(searchInput.value)\" />\n\n      <DropdownList class=\"mb-4\" [items]=\"selected()\" (onClick)=\"removeItem.emit($event)\" />\n\n      <DropdownContent class=\"w-max p-2\">\n        @if (!suggestions().length) {\n          {{ noResultLabel() }}\n        } @else {\n          <ul class=\"data-list-xs my-2 max-h-44 flex-grow overflow-auto\">\n            @for (suggestion of suggestions(); track $index) {\n              <li class=\"data-list-item flex cursor-pointer items-baseline gap-2 p-2\" (click)=\"addItem.emit(suggestion)\">\n                {{ suggestion.display || suggestion.value | syslang | transloco }}\n              </li>\n            }\n          </ul>\n        }\n      </DropdownContent>\n    </Dropdown>\n  `\n})\nexport class DropdownInputComponent {\n  label = input<string>();\n  placeholder = input<string>('Start typing to search...');\n  noResultLabel = input<string>('No results to be displayed...');\n  suggestions = input<DropdownItem[]>([]);\n  selected = input.required<DropdownItem[]>();\n\n  onFocus = output<string | null>(); // emits the input value\n  onKeyUp = output<string | null>(); // emits the input value\n  removeItem = output<DropdownItem>();\n  addItem = output<DropdownItem>();\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { computed } from '@angular/core';\nimport { SafeHtml } from '@angular/platform-browser';\nimport { patchState, signalStore, signalStoreFeature, withComputed, withMethods, withState } from '@ngrx/signals';\n\nexport type Extract = {\n  id: string;\n  text: SafeHtml; // Sanitized HTML text\n  startIndex: number; // this is the start index of the extracts within the Document Text\n  relevanceIndex: number; // 0 the most relevant to N the less relevant\n  textIndex: number; // index of the extract in the text. e.g 0 is the first extract displayed in the document\n};\n\nexport interface ApplicationState {\n  ready: boolean;\n}\n\nexport const ApplicationStore = signalStore(\n  // providing store at the root level\n  { providedIn: 'root', protectedState: false },\n  withDevtools('Application'),\n\n  withApplicationFeatures(),\n  withExtractsFeatures()\n);\n\n/**\n * Enhances the application store with additional features.\n *\n * This function integrates several features into the application store, including state management,\n * computed properties, and various methods for updating and retrieving application state.\n *\n * Features included:\n * - State initialization with `intialState`.\n * - Methods for updating the application state:\n *   - `updateAssistantReady`: Marks the assistant as ready.\n *   - `updateReadyState`: Sets the application store's ready state to true.\n *\n * @returns A configured signal store feature with state, computed properties, and methods.\n */\nexport function withApplicationFeatures() {\n  return signalStoreFeature(\n    withState({ ready: false }),\n\n    withMethods(store => ({\n      update(state: Partial<ApplicationState>) {\n        patchState(store, currentState => ({ ...currentState, ...state }));\n      },\n      /**\n       * Updates the ready state of the application store to true.\n       * This function patches the current state of the store by setting the `ready` property to `true`.\n       */\n      updateReadyState(value: boolean = true) {\n        patchState(store, state => ({ ...state, ready: value }));\n      }\n    }))\n  );\n}\n\n/**\n * Provides features related to extracts within the application store.\n *\n * This function integrates state management, computed properties, and methods\n * for handling extracts in the application store.\n *\n * Features:\n * - State management for extracts.\n * - Computed property to get the count of extracts.\n * - Methods to update and retrieve extracts.\n *\n * @returns A configured signal store feature with state, computed properties, and methods for extracts.\n */\nexport function withExtractsFeatures() {\n  return signalStoreFeature(\n    withState({ extracts: new Map<string, Extract[]>() }),\n\n    withComputed(({ extracts }) => ({\n      extractsCount: computed(() => extracts().size)\n    })),\n\n    withMethods(store => ({\n      /**\n       * Updates the extracts for a given ID in the application store.\n       *\n       * @param id - The unique identifier for the extracts to be updated.\n       * @param extracts - An array of Extract objects to be associated with the given ID.\n       */\n      updateExtracts(id: string, extracts: Extract[]) {\n        patchState(store, state => {\n          state.extracts.set(id, extracts);\n          return { ...state };\n        });\n      },\n      /**\n       * Retrieves extracts from the store based on the provided ID.\n       *\n       * @param id - The unique identifier for the extracts to retrieve.\n       * @returns The extracts associated with the given ID.\n       */\n      getExtracts(id: string) {\n        return store.extracts().get(id) || [];\n      }\n    }))\n  );\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { computed } from '@angular/core';\nimport { getState, patchState, signalStore, signalStoreFeature, withComputed, withMethods, withState } from '@ngrx/signals';\n\nimport { fetchPrincipal, globalConfig, Principal } from '@sinequa/atomic';\n\nexport type PrincipalState = Principal & {\n  userOverrideActive: boolean;\n  state: 'initial' | 'loading' | 'loaded' | 'error';\n};\n\nconst initialPrincipal: PrincipalState = {\n  id: \"\",\n  id2: \"\",\n  id3: \"\",\n  id4: \"\",\n  id5: \"\",\n  email: \"\",\n  name: \"\",\n  longName: \"\",\n  userId: \"\",\n  fullName: \"\",\n  isAdministrator: false,\n  isDelegatedAdmin: false,\n  editablePartition: undefined,\n  passwordExpirationDate: null,\n  description: \"\",\n  param1: \"\",\n  param2: \"\",\n  param3: \"\",\n  param4: \"\",\n  param5: \"\",\n  param6: \"\",\n  param7: \"\",\n  param8: \"\",\n  param9: \"\",\n  param10: \"\",\n  userOverrideActive: false,\n  state: 'initial'\n};\n\nexport const PrincipalStore = signalStore(\n  { providedIn: 'root' },\n  withDevtools('Principal'),\n\n  withState(initialPrincipal),\n\n  withComputed((store) => ({\n\n    allowUserOverride: computed(() => store.isAdministrator() && !store.userOverrideActive()),\n    isOverridingUser: computed(() => store.userOverrideActive()),\n\n    initials: computed(() => {\n      const fullName = store.fullName?.();\n      if (!fullName) return '';\n      return fullName\n        .trim()\n        .split(' ')\n        .map(word => word[0]?.toUpperCase())\n        .join('');\n    }),\n  })),\n  withMethods((store) => ({\n    /**\n    * @deprecated use getState(PrincipalStore))\n    */\n    principal() {\n      const { userOverrideActive: _, ...rest } = getState(store);\n      // this block cannot be put in a computed due to dynamic construction object with signals, which is not supported in computed.\n      // using a method allows us to construct the principal object on each call, ensuring that the signals are properly evaluated and returned as values.\n      const principal = Object.entries(rest).reduce((acc, [k, v]) => {\n        (acc as Record<string, any>)[k] = v;\n        return acc;\n      }, {} as Principal);\n      return principal;\n    }\n  })),\n\n  withPrincipalFeatures()\n);\n\n\nexport function withPrincipalFeatures() {\n  return signalStoreFeature(\n    withMethods((store) => ({\n      async initialize() {\n        patchState(store, { state: 'loading' });\n\n        try {\n          // Use the SDK's fetchPrincipal so the principal load goes through the same auth handling\n          // as the rest of atomic (credentials: \"include\" + the authMode-aware noAutoAuthentication\n          // flag). In SSO mode it sends noAutoAuthentication=false, letting IIS/Windows authenticate.\n          const principal = await fetchPrincipal();\n          const { userOverrideActive = false } = globalConfig;\n          patchState(store, { ...initialPrincipal, ...principal, userOverrideActive, state: 'loaded' });\n        } catch (error) {\n          console.error('Principal fetch failed', error);\n          patchState(store, { state: 'error' });\n          throw error;\n        }\n      }\n    }))\n  );\n}\n","import { effect, signal, Signal } from '@angular/core';\n\n/**\n * Creates a debounced signal that updates its value after a specified timeout.\n *\n * @template T - The type of the signal value.\n * @param Signal<T> input - The input signal whose value will be debounced.\n * @param number [timeOutMs=0] - The debounce timeout in milliseconds. Defaults to 0.\n * @returns Signal<T> - A new signal that updates its value after the specified debounce timeout.\n *\n * @example\n * ```ts\n * const input = signal('');\n * const debounced = debouncedSignal(input, 1000);\n *\n * contructor() {\n *  effect(() => {\n *   console.log(debounced());\n *   // will log the input value after 1 second of inactivity.\n *  });\n * }\n * ...\n * <input [ngModel]=\"input()\" (ngModelChange)=\"input.set($event)\">\n * ```\n */\nexport function debouncedSignal<T>(input: Signal<T>, timeOutMs = 0): Signal<T> {\n  const debounceSignal = signal(input());\n  let timeout: any;\n  effect(onCleanUp => {\n    const value = input();\n    clearTimeout(timeout);\n    timeout = setTimeout(() => {\n      debounceSignal.set(value);\n    }, timeOutMs);\n    onCleanUp(() => clearTimeout(timeout));\n  });\n  return debounceSignal;\n}\n","import { Observable, Subject } from \"rxjs\";\n\nexport class InlineWorker {\n  private readonly worker: Worker;\n\n  private onMessage = new Subject<MessageEvent>();\n  private onError = new Subject<ErrorEvent>();\n\n  constructor(func: () => void) {\n    const WORKER_ENABLED = !!Worker;\n\n    if (WORKER_ENABLED) {\n      const functionBody = func\n        .toString()\n        .replace(/^[^{]*{\\s*/, \"\")\n        .replace(/\\s*}[^}]*$/, \"\");\n\n      try {\n        this.worker = new Worker(URL.createObjectURL(new Blob([functionBody], { type: \"text/javascript\" })));\n\n        this.worker.onmessage = (data) => {\n          this.onMessage.next(data);\n        };\n\n        this.worker.onerror = (data) => {\n          this.onError.next(data);\n        };\n      } catch {\n        throw new Error(\"WebWorker is not enabled\");\n      }\n    } else {\n      throw new Error(\"WebWorker is not enabled\");\n    }\n  }\n\n  postMessage(data: unknown) {\n    this.worker.postMessage(data);\n  }\n\n  onmessage(): Observable<MessageEvent> {\n    return this.onMessage.asObservable();\n  }\n\n  onerror(): Observable<ErrorEvent> {\n    return this.onError.asObservable();\n  }\n\n  terminate() {\n    if (this.worker) this.worker.terminate();\n  }\n}\n","import { assertInInjectionContext, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\nimport { getQueryParamsFromUrl, Query } from '@sinequa/atomic';\n\n/**\n * Retrieves the query name from the current route.\n *\n * @remarks\n * This function must be used within an injection context.\n *\n * This function traverses the route tree recursively to find the query name.\n * It first checks for a query parameter `t` in the route's snapshot. If the query name is not found\n * in the route data, it attempts to find it in the child routes of the \"search\" route.\n * If the query name is still not found, it falls back to the `queryName` defined in the route's data.\n *\n * @returns {string | undefined} The query name if found, otherwise `undefined`.\n */\nexport function getQueryNameFromRoute(): string | undefined {\n  assertInInjectionContext(getQueryNameFromRoute);\n\n  const route = inject(ActivatedRoute);\n  const routes = inject(Router);\n\n  const recursive = (route: ActivatedRoute): string | undefined => {\n    if (route?.firstChild) return recursive(route.firstChild);\n\n    // Get query name from route data\n    const { t, n } = route.snapshot.queryParams;\n    // ! This is a workaround for the case where the queryName is not defined in the route data\n    // \"search\" is the parent route of the search results, and \"t\" is the query parameter for the tab\n    const { queryName } = routes.config.filter(p => p.path === 'search')[0]?.children?.find(route => route.path === t)?.data || n || {};\n    if (queryName) return queryName;\n\n    // fallback to queryName from route data\n    if (route?.snapshot.data['queryName']) return route.snapshot.data['queryName'];\n\n    return undefined;\n  };\n\n  return recursive(route);\n}\n\n/**\n * Builds a query object based on the provided partial query.\n * If any properties are missing in the partial query, default values are used.\n *\n * @remarks\n * This function must be used within an injection context.\n *\n * @param query - The partial query object.\n * @returns The complete query object.\n */\nexport function buildQuery(query?: Partial<Query>): Query {\n  assertInInjectionContext(buildQuery);\n\n  const params = getQueryParamsFromUrl(window.location.toString());\n  const name = query?.name || getQueryNameFromRoute() || params?.name;\n  return {\n    ...params, // default values retrieved from the URL\n    ...query, // override with query\n    name // override with query name\n  } as Query;\n}\n","import { assertInInjectionContext, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\n\n/**\n * Retrieves the current path from the Angular `ActivatedRoute` service.\n *\n * @returns {string | undefined} The current path as a string, or `undefined` if the path cannot be determined.\n */\nexport function getCurrentPath(): string | undefined {\n  assertInInjectionContext(getCurrentPath);\n\n  const route = inject(ActivatedRoute);\n\n  return route?.snapshot.url.toString();\n}\n\n/**\n * Retrieves the current query name based on the current path and router configuration.\n *\n * This function asserts that it is being called within an injection context and then\n * uses Angular's dependency injection to get the router configuration. It matches the\n * current path against the router's configuration to find the corresponding query name.\n *\n * @returns {string | undefined} The name of the current query if found, otherwise undefined.\n */\nexport function getCurrentQueryName(): string | undefined {\n  assertInInjectionContext(getCurrentQueryName);\n\n  const routes = inject(Router).config;\n\n  const path = getCurrentPath();\n\n  return routes.find(r => r.path === 'search')?.children?.find(r => r.path === path)?.data?.['queryName'];\n}\n","import { ApplicationRef, effect, inject, runInInjectionContext } from '@angular/core';\n\nimport { applyThemeToNativeElement, ThemeStore } from '../stores';\n\nexport type ThemeBodyHookParameters = {\n  scope: string;\n  theme: string;\n};\n\nexport function withThemeBodyHook(app: ApplicationRef, params: ThemeBodyHookParameters | undefined): ApplicationRef {\n  runInInjectionContext(app.injector, () => {\n    const themeStore = inject(ThemeStore);\n    const { scope, theme } = params || { scope: 'application', theme: 'Default' };\n\n    themeStore.setCurrentTheme(scope, theme);\n\n    applyThemeToNativeElement(window.document.body, themeStore.scopes()?.[scope]?.cssVars?.light);\n\n    effect(() => {\n      const bodyScope = themeStore.scopes()?.[scope];\n      const vars = bodyScope.darkMode ? bodyScope.cssVars.dark : bodyScope.cssVars.light;\n\n      if (vars) applyThemeToNativeElement(window.document.body, vars);\n    });\n  });\n\n  return app;\n}\n","export const THEMES = [\n  {\n    name: 'Default',\n    id: 'default',\n    private: false,\n    colors: {\n      'button-primary-background': 'none',\n      background: '0 0% 100%',\n      foreground: '225 11% 7%',\n      card: '0 0% 100%',\n      'card-foreground': '225 11% 7%',\n      active: '219 97% 54%',\n      'active-foreground': '0 0% 98%',\n      'active-background': '219 97% 54% / 10%',\n      primary: '219 97% 54%',\n      'primary-foreground': '0 0% 98%',\n      secondary: '240 4.8% 95.9%',\n      'secondary-foreground': '240 5.9% 10%',\n      muted: '240 4.8% 95.9%',\n      'muted-foreground': '240 3.8% 46.1%',\n      accent: '240 4.8% 95.9%',\n      'accent-foreground': '240 5.9% 10%',\n      destructive: '0 84.2% 60.2%',\n      'destructive-foreground': '0 0% 98%',\n      border: '240 5.9% 90%',\n      input: '240 5.9% 90%',\n      ring: '225 11% 7%'\n    },\n    colorsDark: {\n      background: '240 10% 3.9%',\n      foreground: '0 0% 98%',\n      card: '240 10% 3.9%',\n      'card-foreground': '0 0% 98%',\n      active: '0 0% 98%',\n      'active-foreground': '240 5.9% 10%',\n      'active-background': '0 0% 98% / 10%',\n      primary: '0 0% 98%',\n      'primary-foreground': '240 5.9% 10%',\n      secondary: '240 3.7% 15.9%',\n      'secondary-foreground': '0 0% 98%',\n      muted: '240 3.7% 15.9%',\n      'muted-foreground': '240 5% 64.9%',\n      accent: '240 3.7% 15.9%',\n      'accent-foreground': '0 0% 98%',\n      destructive: '0 62.8% 30.6%',\n      'destructive-foreground': '0 0% 98%',\n      border: '240 3.7% 15.9%',\n      input: '240 3.7% 15.9%',\n      ring: '240 4.9% 83.9%'\n    }\n  }\n];\n\nexport type Theme = (typeof THEMES)[number];\n","import { ApplicationRef } from \"@angular/core\";\n\nimport { THEMES, Theme } from \"../resources\";\n\nexport function withThemes(app: ApplicationRef, themes: Theme[]): ApplicationRef {\n  themes.forEach((theme) => {\n    THEMES.push(theme);\n  });\n\n  return app;\n}\n","import { assertInInjectionContext, inject } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\n\nimport { clearSessionTokens, error, fetchPrincipal, globalConfig, info, login } from \"@sinequa/atomic\";\nimport { NavigationService } from \"../services\";\n\n/**\n * sessionStorage flag recording that an SSO re-authentication reload has already been attempted.\n *\n * Unlike the error interceptor's per-request HttpContext retry flag, this one survives a full-page\n * reload, so a 401 that is still unresolved AFTER the reload does not trigger an endless reload\n * loop. It is cleared as soon as a session is successfully (re)established.\n */\nconst SSO_RELOAD_ATTEMPT_KEY = \"sq-sso-reload-attempt\";\n\nfunction hasAttemptedSsoReload(): boolean {\n  return sessionStorage.getItem(SSO_RELOAD_ATTEMPT_KEY) !== null;\n}\n\nfunction markSsoReloadAttempted(): void {\n  sessionStorage.setItem(SSO_RELOAD_ATTEMPT_KEY, \"1\");\n}\n\nfunction clearSsoReloadAttempt(): void {\n  sessionStorage.removeItem(SSO_RELOAD_ATTEMPT_KEY);\n}\n\n/**\n * Signs the user in according to the resolved {@link globalConfig.authMode}.\n *\n * The mode is expected to be resolved beforehand (by `initializeAppConfig`, awaited in\n * `bootstrapApp`). This function clears any existing session, then:\n * - `credentials` → redirect to the login form;\n * - `sso` → re-probe the session and, only if it is genuinely gone, reload the page so the\n *   browser/proxy performs the handshake (see {@link reauthenticateSso});\n * - `oauth` / `saml` → delegate to `login()`, which redirects to the provider;\n * - `bearer` → delegate to `login()`;\n * - `unknown` → `login()` tries SSO silently then resolves to credentials; on failure the login\n *   form is shown.\n *\n * @returns A promise resolving to a boolean indicating whether the user is authenticated.\n */\nexport async function signIn() {\n  assertInInjectionContext(signIn);\n\n  const router = inject(Router);\n  const lastUrlAfterNavigation = inject(NavigationService).urlAfterNavigation;\n\n  const { loginPath, authMode } = globalConfig;\n\n  // Always clear authentication tokens first to clear any existing session\n  clearSessionTokens();\n\n  // Credentials: show the login form.\n  if (authMode?.kind === \"credentials\") {\n    router.navigate([loginPath], { queryParams: { returnUrl: lastUrlAfterNavigation } });\n    return false; // prevent further execution\n  }\n\n  // SSO: the browser/proxy owns authentication. A 401 landing here means the (cookie) session is\n  // being challenged; recovering it needs a top-level navigation so the proxy can run its OIDC\n  // redirect — which only a reload provides. But we re-probe BEFORE reloading to avoid both a\n  // needless reload and an infinite reload loop (see reauthenticateSso).\n  if (authMode?.kind === \"sso\") {\n    return reauthenticateSso(router);\n  }\n\n  // oauth / saml / bearer / unknown — let login() drive the handshake.\n  try {\n    const response = await login();\n    if (response) {\n      info(\"Response from login\", response);\n      // Session (re)established — let a future expiry reload again.\n      clearSsoReloadAttempt();\n      return true;\n    }\n\n    // Not authenticated. For provider redirects (oauth/saml) the page is already navigating away,\n    // so we don't touch the router. Otherwise (unknown resolved to credentials, or bearer failed)\n    // show the login form.\n    if (authMode?.kind !== \"oauth\" && authMode?.kind !== \"saml\") {\n      router.navigate([loginPath], { queryParams: { returnUrl: lastUrlAfterNavigation } });\n    }\n    return false;\n  } catch (err: any) {\n    error(\"Error during login\", err);\n\n    // A 401 is recoverable: the user just needs to authenticate → show the login form.\n    if (err?.status === 401) {\n      error(\"Unauthorized access - please check your credentials:\", err?.errorMessage);\n      router.navigate([loginPath], { queryParams: { returnUrl: lastUrlAfterNavigation } });\n      return false;\n    }\n\n    // Any other error (e.g. a misconfigured OAuth/SAML provider → 5xx) is fatal and not something\n    // the user can resolve from the login form. Stop here: navigate straight to the error page with\n    // the reason. We return false (instead of rethrowing) so the application does NOT initialize and\n    // fire further authenticated API calls (e.g. usersettings → 401).\n    const message = (err?.errorMessage ?? err?.message) || undefined;\n    router.navigate([\"/error\"], { queryParams: { message } });\n    return false;\n  }\n}\n\n/**\n * Recovers an SSO session after a 401, avoiding both a pointless reload and an infinite reload loop.\n *\n * 1. Re-probe the session with `fetchPrincipal`. A 200 means the session is in fact still valid — the\n *    401 was endpoint-specific (e.g. a missing CSRF token on a write), not a session loss. We do NOT\n *    reload and report `true`, so the caller retries the original request once (the error\n *    interceptor's own retry guard then stops any repeat).\n * 2. Otherwise the session is genuinely gone. If no reload has been attempted yet, flag the attempt\n *    and reload, so the proxy can re-authenticate via its top-level OIDC redirect.\n * 3. If a reload has already been attempted and the session is still gone, stop looping and route to\n *    the error page instead.\n *\n * @returns `true` when the session is still valid (retry the request), `false` otherwise.\n */\nasync function reauthenticateSso(router: Router): Promise<boolean> {\n  try {\n    await fetchPrincipal();\n    info(\"SSO session still valid on re-probe — skipping reload\");\n    clearSsoReloadAttempt();\n    return true;\n  } catch {\n    // Session genuinely lost — fall through to the reload / give-up logic below.\n  }\n\n  if (hasAttemptedSsoReload()) {\n    error(\"SSO re-authentication reload did not restore the session — routing to error\");\n    clearSsoReloadAttempt();\n    router.navigate([\"/error\"], { queryParams: { message: \"Session expired\" } });\n    return false;\n  }\n\n  markSsoReloadAttempted();\n  window.location.reload();\n  return false;\n}\n","import { assertInInjectionContext, EnvironmentInjector, inject, runInInjectionContext } from '@angular/core';\nimport { Router } from '@angular/router';\n\nimport { setGlobalConfig, info, error, initializeAppConfig } from '@sinequa/atomic';\n\nimport { ApplicationService } from '../services';\nimport { signIn } from '../utils/sign-in';\n\n/**\n * Bootstraps the application by ensuring the user is authenticated and initializing the application.\n *\n * This function first attempts to sign in the user via `signIn()`. If authentication is successful,\n * it initializes the application (stores and, optionally, dynamic routes) through `ApplicationService`\n * and waits for the initialization to complete before resolving. Any errors during authentication or\n * initialization are logged to the console, but the returned promise never rejects.\n *\n * Note: this function relies on Angular's injection context, so it must be called within one\n * (e.g. from `provideAppInitializer`).\n *\n * @param options - Configuration options for the bootstrap process.\n * @param options.createRoutes - Whether to create routes during initialization. Defaults to `true`.\n * @returns A promise that resolves to `true` when the application has been fully initialized,\n * or `false` when the user is not authenticated or an error occurred.\n */\nexport async function bootstrapApp({ createRoutes = true } = {}): Promise<boolean> {\n  assertInInjectionContext(bootstrapApp);\n\n  // Capture the injector synchronously: Angular's injection context does not survive across an\n  // `await`, so after awaiting `initializeAppConfig()` we must re-enter it to inject services and\n  // run `signIn()` (which use `inject()` internally).\n  const injector = inject(EnvironmentInjector);\n\n  // set the createRoutes flag early so it is defined even when sign-in fails\n  // (ApplicationService.initialize() sets it again when it runs)\n  setGlobalConfig({ createRoutes });\n\n  // Resolve the authentication mode (queries the server pre-login when needed) BEFORE signing in.\n  // Doing it here — rather than as a separate, concurrent APP_INITIALIZER — guarantees that\n  // signIn() reads a fully resolved `authMode` and removes the long-standing bootstrap race.\n  // Crucially, this also sets `backendUrl` BEFORE any service/store is constructed, so those that\n  // derive their API URL from `globalConfig.backendUrl` (e.g. PrincipalStore) don't capture\n  // `undefined` (which produced requests to `/undefined/api/v1/...`).\n  try {\n    await initializeAppConfig();\n  } catch (err) {\n    error('Error while initializing application config:', err);\n    // Pre-login failed (e.g. a 500 \"app not found: 'mint_rnd-yoyo'\" for a bad app name). This is\n    // fatal — backendUrl/authMode can't be resolved — so route to the error page with the reason\n    // instead of continuing to signIn() (which would otherwise fail with a less meaningful error).\n    const message = (err as { errorMessage?: string; message?: string })?.errorMessage\n      ?? (err as { errorMessage?: string; message?: string })?.message;\n    runInInjectionContext(injector, () =>\n      inject(Router).navigate(['/error'], { queryParams: { message } })\n    );\n    return false;\n  }\n\n  // Inject ApplicationService AFTER initializeAppConfig (re-entering the injection context lost\n  // across the await), so its dependent services/stores are constructed with `backendUrl` set.\n  const applicationService = runInInjectionContext(injector, () => inject(ApplicationService));\n\n  let authenticated = false;\n  try {\n    // Re-enter the injection context lost across the await above.\n    authenticated = await runInInjectionContext(injector, () => signIn());\n  } catch (err) {\n    error('Error while signing in:', err);\n    return false;\n  }\n\n  if (!authenticated) {\n    info('User not authenticated, skipping application initialization.');\n    return false;\n  }\n\n  info('User authenticated, initializing application...');\n  try {\n    await applicationService.initialize(createRoutes);\n    info(`Application initialized successfully (createRoutes: ${createRoutes}).`);\n    return true;\n  } catch (err) {\n    error(`Error initializing application (createRoutes: ${createRoutes}):`, err);\n    // Authenticated, but the application failed to initialize (e.g. fetchApp/usersettings failed).\n    // Route to the error page with the failure reason instead of leaving a half-initialized app.\n    const message = (err as { errorMessage?: string; message?: string })?.errorMessage\n      ?? (err as { errorMessage?: string; message?: string })?.message;\n    runInInjectionContext(injector, () =>\n      inject(Router).navigate(['/error'], { queryParams: { message } })\n    );\n    return false;\n  }\n}\n\n/**\n * Bootstraps the application by ensuring the user is authenticated and initializing the application.\n *\n * @deprecated Use {@link bootstrapApp} instead, and let it inject `ApplicationService` itself.\n *\n * Migration — in your `app.config.ts`, replace:\n * ```ts\n * // ❌ Deprecated: eagerly injecting ApplicationService in the factory constructs it (and its\n * //    dependent stores/services) BEFORE bootstrapApp resolves the config, so services that build\n * //    their API URL from `globalConfig.backendUrl` capture `undefined` (→ `/undefined/api/v1/...`).\n * provideAppInitializer(() => withBootstrapApp(inject(ApplicationService), { createRoutes: true })),\n * ```\n * with:\n * ```ts\n * // ✅ bootstrapApp injects ApplicationService internally, AFTER initializeAppConfig() has set\n * //    `backendUrl` and resolved the auth mode.\n * provideAppInitializer(() => bootstrapApp({ createRoutes: true })),\n * ```\n * (Remove the now-unused `inject` / `ApplicationService` imports.)\n *\n * @param applicationService - Ignored; kept for backward compatibility. `ApplicationService` is\n * provided in root and injected internally by {@link bootstrapApp}, so the instance is the same.\n * Passing `inject(ApplicationService)` here is discouraged — see the migration note above.\n * @param options - Configuration options for the bootstrap process.\n * @param options.createRoutes - Whether to create routes during initialization. Defaults to `true`.\n * @returns A promise that resolves when the bootstrap process is complete, regardless of success or failure.\n */\nexport async function withBootstrapApp(_applicationService: ApplicationService, { createRoutes = true } = {}): Promise<void> {\n  await bootstrapApp({ createRoutes });\n}\n","import { runInInjectionContext } from \"@angular/core\";\nimport { error, notify } from \"@sinequa/atomic\";\nimport { signIn } from \"./sign-in\";\n\n/**\n * Executes an asynchronous callback function with error handling for HTTP requests.\n *\n * This utility function wraps a promise-returning callback and handles common HTTP errors,\n * such as 401 (Unauthorized) and 404 (Not Found). If an injector is provided and a 401 error occurs,\n * it can trigger additional logic (e.g., sign-in flow) within the given injection context.\n *\n * @template T The type of the value returned by the callback.\n * @param callback - An asynchronous function that returns a promise of type `T`.\n * @param injector - (Optional) An injector used to run additional logic in case of a 401 error.\n * @returns A promise that resolves to the result of the callback, or `undefined` if an error occurs.\n *\n * @example\n * import { withFetch } from '@sinequa/atomic-angular';\n *\n * async function fetchData() {\n *   return await withFetch(() => fetch('/api/data').then(res => res.json()), injector);\n * }\n */\nexport async function withFetch<T>(callback: () => Promise<T>, injector?: any): Promise<T | undefined> {\n  try {\n    return await callback();\n  } catch (err: any) {\n    if (err.status === 401) {\n      // You may want to inject your error/signIn logic here or pass callbacks\n      notify.warning(\"Unauthorized access\");\n      setTimeout(() => {\n        error(\"Unauthorized access - please check your credentials:\", err);\n        if (injector) {\n          runInInjectionContext(injector, () => signIn());\n        }\n      }, 500);\n    } else if (err.status === 404) {\n      error(\"404 Not Found!\");\n    } else if (err.status) {\n      error(`HTTP error: ${err.status}`);\n    } else {\n      error(\"Unknown error:\", err);\n    }\n    return undefined;\n  }\n}\n","import { Injector, inject, runInInjectionContext } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { withDevtools } from \"@angular-architects/ngrx-toolkit\";\nimport { getState, patchState, signalStore, signalStoreFeature, withMethods, withState } from \"@ngrx/signals\";\nimport {\n  AuditEvents,\n  addConcepts,\n  LegacyFilter,\n  QueryParams as QueryParamsState,\n  queryParamsFromUrl,\n  SpellingCorrectionMode\n} from \"@sinequa/atomic\";\nimport { buildQuery } from \"../utils\";\nimport { AppStore } from \"./app.store\";\n\n/* shortened query params interface for brevity */\ntype QueryParams = {\n  f?: string; // filters list\n  p?: number; // page number\n  s?: string; // sort name\n  t?: string; // tab name\n  q?: string; // query text\n  b?: string; // basket id,\n  n?: string; // query name\n};\n\nexport const QueryParamsStore = signalStore(\n  { providedIn: \"root\" },\n  withDevtools(\"QueryParams\"),\n\n  withQueryParamsFeatures()\n);\n\nexport function withQueryParamsFeatures() {\n  return signalStoreFeature(\n    withState({\n      // QueryParams specific properties\n      path: \"\",\n      filters: [],\n      id: \"\",\n      // Query properties (all optional due to Partial<>)\n      name: \"\",\n      text: \"\",\n      action: \"\",\n      select: [],\n      open: [],\n      page: undefined,\n      pageSize: undefined,\n      tab: \"\",\n      scope: \"\",\n      sort: \"\",\n      basket: \"\",\n      isFirstPage: undefined,\n      strictRefine: undefined,\n      globalRelevance: undefined,\n      questionLanguage: \"\",\n      questionDefaultLanguage: \"\",\n      spellingCorrectionMode: undefined,\n      spellingCorrectionFilter: \"\",\n      documentWeight: \"\",\n      textPartWeights: \"\",\n      relevanceTransforms: \"\",\n      removeDuplicates: undefined,\n      queryId: \"\",\n      aggregations: undefined,\n      orderBy: \"\",\n      groupBy: \"\",\n      neuralSearch: undefined\n    } as QueryParamsState),\n\n    withMethods(\n      (\n        store,\n        injector = inject(Injector),\n        router = inject(Router),\n        route = inject(ActivatedRoute),\n        appStore = inject(AppStore)\n      ) => ({\n        /**\n         * Sets the state from the given URL by extracting query parameters and updating the store.\n         *\n         * @param href - The URL containing query parameters to set the state from.\n         *\n         * The function performs the following steps:\n         * 1. Extracts the path from the URL.\n         * 2. Parses the query parameters from the URL.\n         * 3. Decodes and parses the filters from the query parameters.\n         * 4. Converts the page parameter to a number if it exists.\n         * 5. Updates the store state with the extracted and parsed values.\n         */\n        setFromUrl(href: string) {\n          if (!href) return;\n          // get the hash path without the query params and without the leading '#'\n          const url = new URL(href, window.location.origin);\n          const path = url.hash.split(\"?\")[0].replace(/^#/, \"\");\n\n          const { q: text, f, id, p, s: sort, c, t: tab, basket, n: name } = queryParamsFromUrl(href);\n          const filters = f ? JSON.parse(decodeURIComponent(f)) : [];\n          const spellingCorrectionMode = c as SpellingCorrectionMode;\n\n          let page: number | undefined;\n          if (p) {\n            page = parseInt(p, 10);\n          }\n\n          patchState(store, (state: QueryParamsState) => {\n            return { ...state, path, text, filters, id, page, sort, spellingCorrectionMode, tab, basket, name };\n          });\n        },\n        _updateUrlQueryParams(state: QueryParamsState, audit?: AuditEvents) {\n          const { filters, page, sort, tab, text, basket, name } = state;\n          const queryParams: QueryParams = {\n            f: filters && filters.length > 0 ? JSON.stringify(filters) : undefined,\n            p: page,\n            s: sort,\n            t: tab,\n            q: text,\n            b: basket,\n            n: name\n          };\n          router.navigate([], { relativeTo: route, queryParamsHandling: \"merge\", queryParams, state: { audit } });\n        },\n        getQueryParams(): QueryParams {\n          const state = getState(store);\n          return {\n            f: state.filters && state.filters.length > 0 ? JSON.stringify(state.filters) : undefined,\n            p: state.page,\n            s: state.sort,\n            t: state.tab,\n            q: state.text,\n            b: state.basket,\n            n: state.name\n          };\n        },\n        /**\n         * Adds a filter to the store's state.\n         *\n         * @param filter - The filter to be added to the state.\n         *\n         * The function calls the `updateFilter` method to add the filter to the state.\n         */\n        addFilter(filter: LegacyFilter, audit?: AuditEvents) {\n          this.updateFilter(filter, audit);\n        },\n        /**\n         * Updates the filter in the store's state.\n         *\n         * @param newFilter - The filter to be updated. If the filter is `undefined`, the state remains unchanged.\n         *\n         * The function performs the following operations:\n         * - Adds the filter to the state if it doesn't already exist and has values.\n         * - Removes the filter if the 'between' operator is selected but no values are provided.\n         * - Removes the filter if no values are selected and the operator is not 'between'.\n         * - Updates the filter values if the filter already exists.\n         *\n         * @remarks\n         * - If the filter is `undefined`, the state remains unchanged.\n         * - If the filter's operator is 'between' and both `start` and `end` are `undefined`, the filter is removed.\n         * - If the filter's operator is not 'between' and `filters`, `value`, and `values` are all `undefined`, the filter is removed.\n         * - If the filter already exists, its values are updated.\n         */\n        updateFilter(newFilter: LegacyFilter, audit?: AuditEvents) {\n          patchState(store, (state) => {\n            if (newFilter === undefined) return state;\n\n            // is filter contains values, check if the operator is set, otherwise set operator to \"in\" by default\n            if (newFilter.values && !newFilter.operator) {\n              newFilter.operator = \"in\";\n            }\n\n            const currentActiveFilters = state.filters || [];\n            let newState: QueryParamsState | undefined;\n\n            const filterFound = currentActiveFilters.find((f) => f.field === newFilter.field);\n\n            // if the filter has no name (might be coming from a metadata appliance)\n            if (!newFilter.name || !filterFound?.name) {\n              // cancel if a filter is found for the current field which contains the value we want to add\n              if (\n                filterFound &&\n                newFilter.value &&\n                (filterFound.value?.toLowerCase() === newFilter.value?.toLowerCase() ||\n                  filterFound.values?.some((v) => v?.toLowerCase() === newFilter.value?.toLowerCase()))\n              ){\n                return state;\n              }\n\n              if (filterFound) {\n                // if filter found for the field without a value property we want to add, merge the filters and values\n                // but merge values without duplicates\n                const values = Array.from(new Set([...(filterFound.values || []), ...(newFilter.values || [])].filter(Boolean) as string[]));\n\n                // add the new value if it exists and is not already in the existing values\n                if (newFilter.value) values.push(newFilter.value);\n                if (filterFound.value) values.push(filterFound.value);\n\n                const filterToApply: LegacyFilter = {\n                  field: newFilter.field,\n                  values,\n                  name: filterFound.name || newFilter.name,\n                  operator: newFilter.operator || filterFound.operator || \"in\"\n                };\n\n                // find the index of the existing filter for the field and replace it with the merged filter\n                const existingIndex = currentActiveFilters.findIndex((f) => f.field === newFilter.field);\n\n                const filters = currentActiveFilters.toSpliced(existingIndex, 1, filterToApply);\n                newState = { ...state, filters };\n              } else {\n                // Add filter if it doesn't exist and has values\n                if (!filterFound) {\n                  newState = { ...state, filters: [...(currentActiveFilters || []), newFilter] };\n                }\n              }\n            } else {\n              // search filter by name not by field because many filters can have the same field but different names\n              const existing = currentActiveFilters.findIndex((f) => f.name === newFilter.name);\n\n              // Add filter if it doesn't exist and has values\n              if (existing === -1) {\n                newState = { ...state, filters: [...(currentActiveFilters || []), newFilter] };\n              }\n\n              if (existing >= 0) {\n                // remove filter if between operator is selected but no values are selected\n                if (newFilter.operator === \"between\" && newFilter.start === undefined && newFilter.end === undefined) {\n                  newState = { ...state, filters: currentActiveFilters.filter((f) => f.name !== newFilter.name) };\n                }\n\n                // Remove filter if no values are selected\n                if (\n                  newFilter.operator !== \"between\" &&\n                  newFilter.filters === undefined &&\n                  newFilter.value === undefined &&\n                  newFilter.values === undefined\n                ) {\n                  newState = { ...state, filters: (currentActiveFilters || []).filter((f) => f?.name !== newFilter.name) };\n                }\n\n                // Update filter values\n                if (existing >= 0) {\n                  const filters = currentActiveFilters.toSpliced(existing, 1, newFilter);\n                  newState = { ...state, filters };\n                }\n              }\n            }\n\n            this._updateUrlQueryParams(newState || state, audit);\n            return newState || state;\n          });\n        },\n        /**\n         * Removes a filter from the store based on the specified field.\n         *\n         * @param field - The field of the filter to be removed.\n         */\n        removeFilter(field?: string) {\n          if (!field) return;\n          patchState(store, (state) => {\n            const filters = state.filters?.filter((f) => f.field !== field);\n            const newState = { ...state, filters };\n            this._updateUrlQueryParams(newState);\n            return newState;\n          });\n        },\n        /**\n         * Removes a filter from the state by its name.\n         *\n         * @param name - The name of the filter to be removed.\n         */\n        removeFilterByName(name?: string, column?: string) {\n          if (!name) return;\n          const filters = getState(store).filters || [];\n          // if the filter is not found by name, check if it is found by field\n          if (filters.some((f) => f.name === name) === false) {\n            return this.removeFilter(column);\n          }\n\n          patchState(store, (state) => {\n            const filters = state.filters?.filter((f) => f.name !== name);\n            const newState = { ...state, filters };\n            this._updateUrlQueryParams(newState);\n            return newState;\n          });\n        },\n        /**\n         * Clears all filters from the state.\n         *\n         * This method updates the state by setting the `filters` property to an empty array\n         * along with the basket going undefined\n         * It uses the `patchState` function to apply the state change.\n         */\n        clearFilters() {\n          patchState(store, (state) => {\n            const newState = { ...state, filters: [], basket: undefined };\n            this._updateUrlQueryParams(newState);\n            return newState;\n          });\n        },\n        /**\n         * Clears the basket from the state.\n         *\n         * This method updates the state by setting the `basket` property to undefined.\n         * It uses the `patchState` function to apply the state change.\n         */\n        clearBasket() {\n          patchState(store, (state) => {\n            const newState = { ...state, basket: undefined };\n            this._updateUrlQueryParams(newState);\n            return newState;\n          });\n        },\n        /**\n         * Updates the current state with the provided query parameters.\n         *\n         * @param params - A partial object containing the query parameters to be updated.\n         */\n        patch(params: Partial<QueryParamsState>, audit?: AuditEvents) {\n          patchState(store, (state) => {\n            // get the hash path without the query params and without the leading '#'\n            const path = window.location.hash.split(\"?\")[0].replace(/^#/, \"\");\n            const newState = { ...state, ...params, path };\n            this._updateUrlQueryParams(newState, audit);\n            return newState;\n          });\n        },\n        /**\n         * Retrieves a filter object based on the provided field or name.\n         *\n         * @param {string} fieldOrName - The field or name to search for in the filters.\n         * @returns {Partial<LegacyFilter & {count: number}> | null} - The filter object with an additional count property, or null if not found.\n         *\n         * The method performs the following steps:\n         * 1. Checks if the `field` or `name` parameters are provided. If not, returns null.\n         * 2. Searches for a filter with a matching name in the store's filters.\n         * 3. If no filter is found by name, searches for a filter with a matching field.\n         * 4. If a filter is found and has a `value` property, returns the filter with a count of 1.\n         * 5. If a filter is found and does not have an array of filters, returns the filter with a count of 1.\n         * 6. If a filter is found and has a `values` property, returns the filter with the count set to the length of the `values` array.\n         * 7. If a filter is found and has an array of filters, returns the filter with the count set to the length of the `filters` array.\n         * 8. If none of the above conditions are met, returns the filter with a count of 0.\n         */\n        getFilter({\n          field,\n          name\n        }: {\n          field: string | undefined;\n          name: string | undefined;\n        }): Partial<LegacyFilter & { count: number }> | null {\n          if (!field && !name) return null;\n\n          // first try to find the filter by name if name is provided\n          let filter: LegacyFilter | undefined;\n          if (name) {\n            filter = getState(store).filters?.find((f) => f?.name === name);\n          }\n          if (!filter && field) {\n            // if not found by name, try to find it by field if field is provided\n            filter = getState(store).filters?.find((f) => f?.field === field);\n          }\n\n          // if filter is found, return null\n          if (!filter) return null;\n\n          if (filter.operator && filter.operator === \"or\") {\n            const count = Array.isArray(filter.filters) ? filter.filters.length : 1;\n            return { ...filter, count };\n          }\n          if (filter.operator && filter.operator === \"and\") {\n            return { ...filter, count: 1 };\n          }\n\n          if (filter?.value) return { ...filter, count: 1 };\n          if (filter?.values) {\n            // \"filter.values\" is an array of strings, Set() automatically deletes duplicates\n            const uniqueValues = new Set(filter.values);\n            return { ...filter, count: uniqueValues.size };\n          }\n          if (filter && Array.isArray(filter.filters) === false) return { ...filter, count: 1 };\n          if (filter && Array.isArray(filter.filters)) return { ...filter, count: filter.filters.length };\n\n          return { ...filter, count: 0 };\n        },\n        /**\n         * Constructs and returns a query object based on the current state of the store.\n         *\n         * This method retrieves various parameters from the store's state, such as filters, sort order, tab, query text, query name, and spelling correction mode.\n         * It processes the filters to separate out \"concepts\" filters and incorporates them into the query text.\n         * The remaining filters are combined appropriately.\n         * Finally, it builds and returns the query object using the processed parameters.\n         *\n         * @returns Query The constructed query object.\n         */\n        getQuery() {\n          const {\n            filters: allFilters = [],\n            sort,\n            tab,\n            basket,\n            text: queryText = \"\",\n            spellingCorrectionMode\n          } = getState(store);\n          // check if a query name is defined\n          // if not, try to get it from the route data or from the default query in the app store\n          let { name } = getState(store);\n          if (!name) {\n            const routeData = route.snapshot.firstChild?.children[0]?.data;\n            const queryName = routeData?.[\"queryName\"] as string;\n            name = queryName || appStore.getDefaultQuery()?.name || \"\";\n          }\n          let text = queryText;\n\n          // remove concepts filters from the query to add them in the query expression\n          const [conceptsFilters] = allFilters.filter((f) => f.field === \"concepts\");\n          if (conceptsFilters) {\n            const concepts = conceptsFilters.filters\n              ? ((conceptsFilters.filters as LegacyFilter[]).map((f) => f.value) as string[])\n              : ([conceptsFilters.value] as string[]);\n            text = addConcepts(queryText, concepts);\n          }\n\n          const filters = allFilters.filter((f) => f.field !== \"concepts\");\n          const f = filters.length > 1 ? ({ operator: \"and\", filters } as LegacyFilter) : (filters[0] as LegacyFilter);\n\n          const query = runInInjectionContext(injector, () =>\n            buildQuery({ filters: f, name, sort, spellingCorrectionMode, tab, text, basket })\n          );\n          return query;\n        }\n      })\n    )\n  );\n}\n","import { computed } from \"@angular/core\";\nimport { withDevtools } from \"@angular-architects/ngrx-toolkit\";\nimport { patchState, signalStore, signalStoreFeature, withComputed, withMethods, withState } from \"@ngrx/signals\";\n\nimport { Article, CustomHighlights } from \"@sinequa/atomic\";\n\nexport type PreviewHighlights = {\n  highlights: CustomHighlights[];\n  snippetId?: number;\n};\n\nexport type SelectionState = {\n  article?: Article;\n  id?: string;\n  queryText?: string;\n  queryName?: string;\n  previewHighlights?: PreviewHighlights;\n  assistantIdsToAttach: string[];\n};\n\n/**\n * @constant\n * @name SelectionStore\n * @description\n * A store that manages the selection state of articles. It is provided in the root of the application and includes\n * development tools for easier debugging. The store maintains the state with the following properties:\n * - `article`: The selected article.\n * - `id`: The ID of the selected article.\n * - `queryText`: The query text associated with the selection.\n * - `queryName`: The query name associated with the selection.\n * @methods\n * - `update(article: Article, queryText?: string)`: Updates the store with a new article and optional query text.\n * - `updateQueryText(queryText: string)`: Updates the query text in the store.\n * - `clear()`: Clears the selection state, setting `article`, `id`, and `queryText` to `undefined`.\n */\nexport const SelectionStore = signalStore(\n  { providedIn: \"root\" },\n  withDevtools(\"Selection\"),\n\n  withSelectionFeatures(),\n  withMultiSelectionFeatures()\n);\n\nexport function withSelectionFeatures() {\n  return signalStoreFeature(\n    withState({\n      article: undefined,\n      id: undefined,\n      queryText: undefined,\n      queryName: undefined,\n      previewHighlights: undefined,\n      assistantIdsToAttach: []\n    } as SelectionState),\n\n    withMethods((store) => ({\n      /**\n       * Updates the state with the provided new state's properties.\n       *\n       * @param newState - New state object containing only the properties to update.\n       */\n      update(newState: Partial<SelectionState>) {\n        patchState(store, (state) => {\n          return { ...state, ...newState };\n        });\n      },\n      /**\n       * Clears the current selection state by setting the state properties to `undefined`.\n       *\n       * @remarks\n       * This method uses the `patchState` function to update the state of the store.\n       */\n      clear() {\n        patchState(store, () => {\n          return {\n            article: undefined,\n            id: undefined,\n            queryText: undefined,\n            queryName: undefined,\n            previewHighlights: undefined,\n            assistantIdsToAttach: undefined\n          };\n        });\n      }\n    }))\n  );\n}\n\nexport type MultiSelectionState = SelectionState & {\n  multiSelection: Article[];\n};\n\nexport function withMultiSelectionFeatures() {\n  return signalStoreFeature(\n    withState({ multiSelection: [] as Article[] } as MultiSelectionState),\n\n    withComputed(({ multiSelection }) => ({\n      multiSelectCount: computed(() => multiSelection().length)\n    })),\n\n    withMethods((store) => ({\n      /**\n       * Add an article to the multi-selection state.\n       * @param article - The article to add to the multi-selection.\n       */\n      addArticleToMultiSelection(article: Article) {\n        patchState(store, (state) => {\n          const multiSelection = state.multiSelection || [];\n\n          if (!multiSelection.some((a) => a.id === article.id))\n            return { ...state, multiSelection: [...multiSelection, article] };\n\n          return state;\n        });\n      },\n      /**\n       * Removes an article from the multi-selection state.\n       * @param article - The article to remove from the multi-selection.\n       */\n      removeArticleFromMultiSelection(article: Article) {\n        patchState(store, (state) => {\n          const multiSelection = state.multiSelection || [];\n          return { ...state, multiSelection: multiSelection.filter((a) => a.id !== article.id) };\n        });\n      },\n      /**\n       * Clears the multi-selection state by resetting it to an empty array.\n       */\n      clearMultiSelection() {\n        patchState(store, (state) => ({ ...state, multiSelection: [] }));\n      }\n    }))\n  );\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { patchState, signalStore, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\n\nimport { THEMES } from '../resources';\n\nexport type CssVars = {\n  light?: Record<string, string>;\n  dark?: Record<string, string>;\n};\n\nexport type ThemeScope = {\n  [key: string]: {\n    cssVars: CssVars;\n    darkMode?: boolean;\n    themeName: string;\n  };\n};\n\nexport type ThemeStoreState = {\n  scopes: ThemeScope;\n};\n\nexport const ThemeStore = signalStore(\n  { providedIn: 'root' },\n  withDevtools('Theme'),\n\n  withThemesFeatures()\n);\n\nexport function withThemesFeatures() {\n  return signalStoreFeature(\n    withState({ scopes: {} } as ThemeStoreState),\n\n    withMethods(store => ({\n      /**\n       * Loads the default theme for a given scope.\n       *\n       * @param {string} scope - The scope for the theme.\n       * @param {boolean} [darkMode] - Optional. Enables dark mode.\n       */\n      loadDefaultTheme(scope: string, darkMode?: boolean): void {\n        this.setCurrentTheme(scope, 'Default', darkMode);\n      },\n\n      /**\n       * Sets the current theme for a given scope.\n       *\n       * @param {string} scope - The scope for which the theme is being set.\n       * @param {string} themeName - The name of the theme to be applied.\n       * @param {boolean} [darkMode] - Optional. Specifies whether dark mode should be enabled. If not provided, it defaults to the current scope's dark mode setting or false.\n       * @returns {void}\n       */\n      setCurrentTheme(scope: string, themeName: string, darkMode?: boolean): void {\n        const cssVars = processCssVars(themeName);\n        const currentScope = store.scopes()[scope];\n\n        patchState(store, state => ({\n          ...state,\n          scopes: {\n            ...store.scopes(),\n            [scope]: {\n              cssVars,\n              darkMode: darkMode ?? currentScope?.darkMode ?? false,\n              themeName: themeName\n            }\n          }\n        }));\n      },\n\n      /**\n       * Sets the dark mode preference for a given scope.\n       *\n       * @param scope - The scope for which to set the dark mode preference.\n       * @param darkMode - A boolean indicating whether dark mode should be enabled (true) or disabled (false).\n       *\n       * This function updates the state by patching it with the new dark mode setting for the specified scope.\n       * It retains the existing CSS variables and theme name for the scope.\n       */\n      setDarkMode(scope: string, darkMode: boolean): void {\n        const currentScope = store.scopes()[scope];\n\n        patchState(store, state => ({\n          ...state,\n          scopes: {\n            ...store.scopes(),\n            [scope]: {\n              cssVars: currentScope?.cssVars ?? {},\n              darkMode,\n              themeName: currentScope?.themeName\n            }\n          }\n        }));\n      }\n    }))\n  );\n}\n\n/**\n * Processes the CSS variables for a given theme name.\n *\n * @param themeName - The name of the theme to process.\n * @returns An object containing the CSS variables for both light and dark themes.\n * @throws Will throw an error if the theme with the specified name is not found.\n */\nexport function processCssVars(themeName: string): CssVars {\n  const theme = THEMES.find(theme => theme.name === themeName);\n\n  if (!theme) throw new Error(`Theme \"${themeName}\" not found`);\n\n  const cssVars = {\n    light: themeColorsToCssVariables(theme!.colors),\n    dark: themeColorsToCssVariables(theme!.colorsDark)\n  };\n\n  return cssVars;\n}\n\n/**\n * Converts an object of theme colors to CSS variables.\n *\n * @param colors - An object where keys are theme color names and values are the corresponding color values.\n * @returns An object where keys are CSS variable names and values are the corresponding color values.\n */\nexport function themeColorsToCssVariables(colors: any): any {\n  const cssVars = colors\n    ? Object.fromEntries(\n        Object.entries(colors).map(([name, value]) => {\n          if (value === undefined) return [];\n          const cssName = themeColorNameToCssVariable(name);\n          return [cssName, value];\n        })\n      )\n    : {};\n\n  return cssVars;\n}\n\n/**\n * Converts a camelCase theme color name to a CSS variable format.\n *\n * This function takes a camelCase string and transforms it into a CSS variable\n * name by inserting hyphens between lowercase and uppercase letters and converting\n * the entire string to lowercase.\n *\n * @param name - The camelCase theme color name to be converted.\n * @returns The corresponding CSS variable name in kebab-case.\n */\nexport function themeColorNameToCssVariable(name: string): string {\n  return `--${name.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase()}`;\n}\n\n/**\n * Applies a set of CSS variables to a given HTML element.\n *\n * @param element - The HTML element to which the CSS variables will be applied.\n * @param cssVars - An optional record of CSS variable names and their corresponding values.\n */\nexport function applyThemeToNativeElement(element: HTMLElement, cssVars?: Record<string, string>): void {\n  if (!cssVars) return;\n\n  Object.keys(cssVars).forEach(key => element.style.setProperty(key, cssVars[key]));\n}\n","export function itemIndex(name: string, items?: any[]): number {\n  if (items?.length) {\n    for (let i = 0, ic = items.length; i < ic; i++) {\n      const item = items[i];\n      if (item && item.name === name) {\n        return i;\n      }\n    }\n  }\n  return -1;\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { patchUserSettings } from '@sinequa/atomic';\nimport { Alert, UserSettingsState } from '../../models';\nimport { itemIndex } from './helpers';\n\nexport function withAlertsFeatures() {\n  return signalStoreFeature(\n    withState({ alerts: [] as UserSettingsState['alerts'] }),\n    withMethods(store => ({\n      /**\n       * Deletes an alert from the user's alerts list.\n       *\n       * @param index - The index of the alert.\n       */\n      async deleteAlert(index: number) {\n        const alerts = store.alerts();\n        if (alerts) {\n          const alertToDelete = alerts.splice(index, 1)[0];\n          await patchUserSettings(\n            { alerts },\n            {\n              type: 'Alert_Delete',\n              detail: {\n                savedQuery: alertToDelete.name\n              }\n            }\n          );\n          patchState(store, state => {\n            return { ...state, alerts: [...alerts] };\n          });\n        }\n      },\n\n      /**\n       * Adds an alert to the user's alerts list\n       *\n       * @param alert - The alert to add in the user's alerts list\n       */\n      async createAlert(alert: Alert) {\n        const alerts = store.alerts();\n        if (itemIndex(alert.name) >= 0) return;\n        alerts.unshift(alert);\n        await patchUserSettings(\n          { alerts },\n          {\n            type: 'Alert_Add',\n            detail: {\n              alert: alert.name\n            }\n          }\n        );\n        patchState(store, state => {\n          return { ...state, alerts: [...alerts] };\n        });\n      },\n\n      /**\n       * Updates the alert at a specific index.\n       *\n       * @param alert - The updated alert data.\n       * @param index - The index of the alert to update.\n       */\n      async updateAlert(alert: Alert, index: number) {\n        const alerts = store.alerts();\n        if (index < 0 || index >= alerts.length)\n          // index out of bounds\n          return;\n\n        alerts.splice(index, 1, alert);\n\n        await patchUserSettings(\n          { alerts },\n          {\n            type: 'Alert_Update',\n            detail: {\n              alert: alert.name\n            }\n          }\n        );\n        patchState(store, state => {\n          return { ...state, alerts: [...alerts] };\n        });\n      },\n\n      /**\n       * Updates the user's alerts in the store.\n       *\n       * @param alerts - The new alerts to be updated in the store.\n       */\n      async updateAlerts(alerts: Alert[]) {\n        await patchUserSettings(\n          { alerts },\n          {\n            type: 'Alert_Update',\n            detail: {\n              alert: alert.name\n            }\n          }\n        );\n        patchState(store, state => {\n          return { ...state, alerts: [...alerts] };\n        });\n      }\n    }))\n  );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { AuditEvents, patchUserSettings } from '@sinequa/atomic';\nimport { UserSettingsState } from '../../models';\n\nexport function withAssistantFeatures() {\n  return signalStoreFeature(\n    withState({ assistants: {} as UserSettingsState['assistants'] }),\n    withMethods(store => ({\n      /**\n       * Updates the user's assistant settings in the store.\n       *\n       * @param assistantSettings - The new assistant settings to be updated in the store.\n       */\n      async updateAssistantSettings(assistantSettings: UserSettingsState['assistants']) {\n        patchState(store, state => {\n          return { ...state, assistants: assistantSettings };\n        });\n      },\n\n      /**\n       * Update the user's language and optionally logs audit events.\n       *\n       * @param language - The language to update with.\n       * @param auditEvents - Optional audit events to log during the update.\n       */\n      async updateLanguage(language: UserSettingsState['language'], auditEvents?: AuditEvents) {\n        await patchUserSettings({ language }, auditEvents);\n        patchState(store, state => {\n          return { ...state, language };\n        });\n      },\n\n      /**\n       * Update the user's assistant collapsed status and optionally logs audit events.\n       *\n       * @param collapseAssistant - The collapse status.\n       * @param auditEvents - Optional audit events to log during the update.\n       */\n      async updateAssistantCollapsed(collapseAssistant: UserSettingsState['collapseAssistant'], auditEvents?: AuditEvents) {\n        await patchUserSettings({ collapseAssistant }, auditEvents);\n        patchState(store, state => {\n          return { ...state, collapseAssistant };\n        });\n      }\n    }))\n  );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { patchUserSettings } from '@sinequa/atomic';\nimport { Basket, UserSettingsState } from '../../models';\nimport { itemIndex } from './helpers';\n\nexport function withBasketsFeatures() {\n  return signalStoreFeature(\n    withState({ baskets: [] as UserSettingsState['baskets'] }),\n    withMethods(store => ({\n      /**\n       * Deletes a basket from the user's baskets list.\n       *\n       * @param index - The index of the basket to delete.\n       */\n      async deleteBasket(index: number) {\n        const baskets = store.baskets();\n        if (baskets) {\n          const basketToDelete = baskets.splice(index, 1)[0];\n          await patchUserSettings(\n            { baskets },\n            {\n              type: 'Basket_Delete',\n              detail: {\n                savedQuery: basketToDelete.name\n              }\n            }\n          );\n          patchState(store, state => {\n            return { ...state, baskets: [...baskets] };\n          });\n        }\n      },\n\n      /**\n       * Adds a basket to the user's baskets list.\n       *\n       * @param basket - The basket to add in the user's baskets list.\n       */\n      async createBasket(basket: Basket) {\n        const baskets = store.baskets();\n        if (itemIndex(basket.name) >= 0) return;\n        baskets.unshift(basket);\n        await patchUserSettings(\n          { baskets },\n          {\n            type: 'Basket_Add',\n            detail: {\n              basket: basket.name\n            }\n          }\n        );\n        patchState(store, state => {\n          return { ...state, baskets: [...baskets] };\n        });\n      },\n\n      /**\n       * Updates the user's baskets in the store.\n       *\n       * @param baskets - The new baskets to be updated in the store.\n       */\n      async updateBaskets(baskets: UserSettingsState['baskets']) {\n        await patchUserSettings(\n          { baskets },\n          {\n            type: 'Basket_Update'\n          }\n        );\n        patchState(store, state => {\n          return { ...state, baskets: [...baskets] };\n        });\n      },\n\n      /**\n       * Updates the basket at a specific index.\n       *\n       * @param basket - The updated basket data.\n       * @param index - The index of the basket to update.\n       */\n      async updateBasket(basket: Basket, index: number) {\n        const baskets = store.baskets();\n        const prevIndex = itemIndex(basket.name, baskets);\n        if (\n          (prevIndex !== -1 && index !== prevIndex) || // A basket with the same name exists at a different index\n          index < 0 ||\n          index >= baskets.length\n        )\n          // index out of bounds\n          return;\n\n        baskets.splice(index, 1, basket);\n\n        await patchUserSettings(\n          { baskets },\n          {\n            type: 'Basket_Update',\n            detail: {\n              basket: basket.name\n            }\n          }\n        );\n        patchState(store, state => {\n          return { ...state, baskets: [...baskets] };\n        });\n      },\n\n      /**\n       * Adds one or multiple records' id into a basket.\n       *\n       * @param name - The basket name.\n       * @param ids - The id(s) to add to it.\n       */\n      async addToBasket(name: string, ids: string | string[]) {\n        const baskets = store.baskets();\n        const basket = baskets.find((b: { name: string }) => b.name === name);\n        if (!ids || !basket) return;\n\n        if (!basket.ids) basket.ids = [];\n\n        ids = Array.isArray(ids) ? ids : [ids];\n        for (let id of ids) {\n          if (!basket.ids.some((i: string) => i === id)) {\n            basket.ids.push(id);\n          }\n        }\n\n        await patchUserSettings(\n          { baskets },\n          {\n            type: 'Basket_AddDoc',\n            detail: {\n              basket: basket.name,\n              docid: ids[0]\n            }\n          }\n        );\n        patchState(store, state => {\n          return { ...state, baskets: [...baskets] };\n        });\n      },\n\n      /**\n       * Adds one or multiple records' id from a basket.\n       *\n       * @param name - The basket name.\n       * @param ids - The id(s) to remove from it.\n       */\n      async removeFromBasket(name: string, ids: string | string[]) {\n        const baskets = store.baskets();\n        const basket = baskets.find((b: { name: string }) => b.name === name);\n        if (!ids || !basket) return;\n\n        if (!basket.ids) basket.ids = [];\n\n        ids = Array.isArray(ids) ? ids : [ids];\n        for (let id of ids) {\n          if (!basket.ids.some((i: string) => i === id)) {\n            basket.ids.push(id);\n          }\n        }\n\n        await patchUserSettings(\n          { baskets },\n          {\n            type: 'Basket_AddDoc',\n            detail: {\n              basket: basket.name,\n              docid: ids[0]\n            }\n          }\n        );\n        patchState(store, state => {\n          return { ...state, baskets: [...baskets] };\n        });\n      }\n    }))\n  );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { Article, AuditEvents, patchUserSettings } from '@sinequa/atomic';\nimport { UserSettingsState } from '../../models';\n\nexport function withBookmarkFeatures() {\n  return signalStoreFeature(\n    withState({ bookmarks: [] as UserSettingsState['bookmarks'] }),\n\n    withMethods(store => ({\n      /**\n       * Updates the user's bookmarks in the store and optionally logs audit events.\n       *\n       * @param bookmarks - An array of bookmarks to update in the user settings.\n       * @param auditEvents - Optional audit events to log during the update.\n       * @returns A promise that resolves when the update is complete.\n       */\n      async updateBookmarks(bookmarks: UserSettingsState['bookmarks'], auditEvents?: AuditEvents) {\n        await patchUserSettings({ bookmarks }, auditEvents);\n        patchState(store, state => {\n          return { ...state, bookmarks: [...bookmarks] };\n        });\n      },\n      /**\n       * Adds an article to the bookmarks if it is not already bookmarked.\n       *\n       * @param article - The article to be bookmarked.\n       * @param queryName - Optional name of the query associated with the bookmark.\n       * @returns A promise that resolves when the bookmark has been added.\n       */\n      async bookmark(article: Article, queryName?: string) {\n        if (!article.id) return;\n\n        if (this.isBookmarked(article)) return;\n\n        const bookmark = {\n          id: article.id,\n          label: article.title,\n          source: article.collection[0],\n          author: article.authors?.[0],\n          queryName\n        };\n        await this.updateBookmarks([bookmark, ...store.bookmarks()], {\n          type: 'Basket_AddDoc',\n          detail: {\n            docid: article.id\n          }\n        });\n      },\n      /**\n       * Removes a bookmark by its ID.\n       *\n       * @param id - The ID of the bookmark to remove.\n       * @returns A promise that resolves when the bookmark has been removed and the bookmarks have been updated.\n       *\n       * @remarks\n       * - If the provided ID is falsy, the function will return immediately.\n       * - If the bookmark with the given ID is not found, the function will return immediately.\n       * - The function updates the bookmarks and logs the removal action with a type of \"Basket_RemoveDoc\".\n       */\n      async unbookmark(id: string) {\n        if (!id) return;\n\n        const bookmarks = store.bookmarks();\n        const index = bookmarks?.findIndex((bookmark: { id: string }) => bookmark.id === id);\n\n        if (index === -1) return;\n\n        bookmarks.splice(index, 1);\n        await this.updateBookmarks([...bookmarks], {\n          type: 'Basket_RemoveDoc',\n          detail: {\n            docid: id\n          }\n        });\n      },\n      /**\n       * Checks if the given article is bookmarked.\n       *\n       * @param article - An optional partial article object to check.\n       * @returns `true` if the article is bookmarked, `false` otherwise.\n       */\n      isBookmarked(article: Partial<Article>): boolean {\n        if (!article || !article.id) return false;\n        const bookmarks = store.bookmarks();\n\n        return !!bookmarks?.find((bookmark: { id: string | undefined }) => bookmark.id === article.id);\n      },\n      /**\n       * Toggles the bookmark status of a given article.\n       *\n       * This method checks if the article is currently bookmarked. If it is,\n       * it removes the bookmark. If it is not, it adds a bookmark.\n       *\n       * @param article - The article to toggle the bookmark status for.\n       * @returns A promise that resolves when the bookmark status has been toggled.\n       */\n      async toggleBookmark(article: Article) {\n        const isBookmarked = await this.isBookmarked(article);\n\n        if (isBookmarked) this.unbookmark(article.id);\n        else this.bookmark(article);\n      }\n    }))\n  );\n}\n","import { patchState, signalStoreFeature, withComputed, withMethods, withState } from '@ngrx/signals';\nimport { computed } from '@angular/core';\n\nimport { patchUserSettings } from '@sinequa/atomic';\n\nimport { UserSettingsState } from '../../models';\n\nexport function withDarkModeFeatures() {\n  return signalStoreFeature(\n    withState({ userTheme: 'light' as UserSettingsState['userTheme'] }),\n    withComputed(({ userTheme }) => ({\n      isDarkMode: computed(\n        () => userTheme() === 'dark' || (userTheme() === 'system' && window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches)\n      )\n    })),\n    withMethods(store => ({\n      async setUserTheme(userTheme: 'dark' | 'light' | 'system') {\n        const currentDarkMode = store.userTheme();\n\n        if (currentDarkMode === userTheme) return;\n\n        await patchUserSettings({ userTheme });\n\n        patchState(store, state => {\n          return { ...state, userTheme };\n        });\n      },\n      async toggleDarkMode() {\n        const currentDarkMode = store.userTheme();\n        await this.setUserTheme(currentDarkMode === 'dark' ? 'light' : 'dark');\n      }\n    }))\n  );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { AuditEvents, patchUserSettings, QueryParams } from '@sinequa/atomic';\nimport { SearchItem, UserSettingsState } from '../../models';\n\nexport function withRecentSearchesFeatures() {\n  return signalStoreFeature(\n    withState({ recentSearches: [] as UserSettingsState['recentSearches'] }),\n\n    withMethods(store => ({\n      /**\n       * Deletes a recent search entry from the user's recent searches list.\n       *\n       * @param {number} index - The index of the recent search to delete.\n       * @returns {Promise<void>} A promise that resolves when the recent search has been deleted and the state has been updated.\n       */\n      async deleteRecentSearch(index: number) {\n        const recentSearches = store.recentSearches();\n        if (recentSearches) {\n          const recentSearchToDelete = recentSearches.splice(index, 1)[0];\n          await patchUserSettings(\n            { recentSearches },\n            {\n              type: 'RecentQuery_Delete',\n              detail: {\n                recentQuery: recentSearchToDelete.queryParams?.text\n              }\n            }\n          );\n\n          patchState(store, state => {\n            return { ...state, recentSearches: [...recentSearches] };\n          });\n        }\n      },\n      /**\n       * Updates the recent searches in the user settings.\n       *\n       * @param recentSearches - An array of recent searches to be updated in the user settings.\n       * @param auditEvents - Optional audit events to be logged during the update.\n       * @returns A promise that resolves when the recent searches have been updated.\n       */\n      async updateRecentSearches(recentSearches: UserSettingsState['recentSearches'], auditEvents?: AuditEvents) {\n        await patchUserSettings({ recentSearches }, auditEvents);\n        patchState(store, state => {\n          return { ...state, recentSearches: [...recentSearches] };\n        });\n      },\n      /**\n       * Adds the current search to the recent searches list.\n       *\n       * This method checks if a search with the same label already exists in the recent searches.\n       * If it does, it updates the existing search with the new query parameters and date.\n       * If it does not, it adds a new search to the recent searches list.\n       *\n       * @param queryParams - The parameters of the current search.\n       * @returns A promise that resolves when the recent searches have been updated.\n       */\n      async addCurrentSearch(queryParams: QueryParams) {\n        // fist search if the search is already in the recent searches with the same label\n        const recentSearches = store.recentSearches();\n        const existingSearch = recentSearches.find(search => search.label === queryParams.text);\n\n        const url = window.location.hash.substring(1);\n        const path = url.split('?')[0];\n        if (existingSearch) {\n          await this.updateRecentSearches(\n            [\n              {\n                ...existingSearch,\n                date: new Date().toISOString(),\n                url,\n                path,\n                queryParams,\n                filterCount: queryParams.filters?.length\n              },\n              ...recentSearches.filter(search => search.label !== queryParams.text)\n            ],\n            {\n              type: 'RecentQuery_Update',\n              detail: {\n                recentQuery: queryParams.text\n              }\n            }\n          );\n        } else {\n          const recentSearch = {\n            url,\n            path,\n            display: queryParams.text,\n            label: queryParams.text,\n            filterCount: queryParams.filters?.length,\n            date: new Date().toISOString(),\n            queryParams\n          } as SearchItem;\n\n          await this.updateRecentSearches([recentSearch, ...store.recentSearches()], {\n            type: 'RecentQuery_Add',\n            detail: {\n              recentQuery: queryParams.text\n            }\n          });\n        }\n      }\n    }))\n  );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { patchUserSettings } from '@sinequa/atomic';\nimport { SearchItem, UserSettingsState } from '../../models';\n\nexport function withSavedSearchesFeatures() {\n  return signalStoreFeature(\n    withState({ savedSearches: [] as UserSettingsState['savedSearches'] }),\n\n    withMethods(store => ({\n      /**\n       * Deletes a saved search entry from the user's saved searches list.\n       *\n       * @param index - The index of the saved search to delete.\n       */\n      async deleteSavedSearch(index: number) {\n        const savedSearches = store.savedSearches();\n        if (savedSearches) {\n          const savedSearchToDelete = savedSearches.splice(index, 1)[0];\n          await patchUserSettings(\n            { savedSearches },\n            {\n              type: 'SavedQuery_Delete',\n              detail: {\n                savedQuery: savedSearchToDelete.display\n              }\n            }\n          );\n\n          patchState(store, state => {\n            return { ...state, savedSearches: [...savedSearches] };\n          });\n        }\n      },\n\n      /**\n       * Updates the user's saved searches in the store.\n       *\n       * @param savedSearches - The new saved searches to be updated in the store.\n       */\n      async updateSavedSearches(savedSearches: UserSettingsState['savedSearches']) {\n        await patchUserSettings(\n          { savedSearches },\n          {\n            type: 'SavedQuery_Add',\n            detail: {\n              savedQuery: savedSearches[0].display\n            }\n          }\n        );\n        patchState(store, state => {\n          return { ...state, savedSearches: [...savedSearches] };\n        });\n      },\n\n      getSavedSearch(search: string): SearchItem | undefined {\n        if (!search) return undefined;\n        const savedSearches = store.savedSearches();\n        return savedSearches?.find(savedSearch => {\n          const queryParams = savedSearch.url.split('?')[1];\n          if (!queryParams) return false;\n\n          const q = queryParams.split('&').find(qp => qp.startsWith('q='));\n          return !!q && decodeURI(q.substring(2)) === search;\n        });\n      }\n    }))\n  );\n}\n","import { patchState, signalStoreFeature, withMethods, withState } from '@ngrx/signals';\nimport { deleteUserSettings, error, fetchUserSettings } from '@sinequa/atomic';\nimport { UserSettingsState } from '../../models';\n\n/**\n * Canonical default shape of the user settings state.\n *\n * Shared between `initialize()` (overlaid under the fetched settings) and `reset()`\n * (used as the replacement state) so the two cannot drift apart. Keep in sync with\n * the `UserSettingsState` type.\n */\nconst USER_SETTINGS_DEFAULTS: UserSettingsState = {\n  bookmarks: [],\n  recentSearches: [],\n  savedSearches: [],\n  baskets: [],\n  alerts: [],\n  assistants: {},\n  language: undefined,\n  collapseAssistant: undefined,\n  userTheme: undefined,\n  agents: { isDebugMode: false }\n};\n\nexport function withUserSettingsFeatures() {\n  return signalStoreFeature(\n    withState({ language: undefined, collapseAssistant: undefined } as UserSettingsState),\n\n    withMethods(store => ({\n      /**\n       * Initializes the user settings store by fetching the user settings from the backend API\n       * and patching the store with the retrieved settings.\n       *\n       * The fetched settings are overlaid on top of {@link USER_SETTINGS_DEFAULTS} so that any\n       * key absent from the new user's settings resets to its default instead of retaining the\n       * previous user's in-memory value. This is required because `initialize()` runs both on\n       * first login and on every user override (impersonation): a plain merge would leak the\n       * previous user's data (e.g. `recentSearches`) into the new user's session and backend.\n       *\n       * @returns {Promise<void>} A promise that resolves when the initialization is complete.\n       */\n      async initialize(): Promise<void> {\n        // Fetch the user settings from the backend API and overlay them on the defaults,\n        // so missing keys reset rather than keep the previous user's values.\n        try {\n          const settings = await fetchUserSettings<UserSettingsState>();\n          patchState(store, { ...USER_SETTINGS_DEFAULTS, ...settings });\n        } catch (err) {\n          error('Error fetching user settings:', err);\n        }\n      },\n      /**\n       * Resets the user settings to the initial state.\n       *\n       * This method performs the following actions:\n       * 1. Deletes the current user settings.\n       * 2. Patches the state with the initial state.\n       *\n       * @returns {Promise<void>} A promise that resolves when the reset operation is complete.\n       */\n      async reset(): Promise<void> {\n        // Reset the user settings to the initial state\n        await deleteUserSettings();\n        patchState(store, USER_SETTINGS_DEFAULTS);\n      }\n    }))\n  );\n}\n","import {\n  patchState,\n  signalStoreFeature,\n  withMethods,\n  withState,\n  withComputed\n} from '@ngrx/signals';\nimport { computed } from '@angular/core';\n\nimport { UserSettingsState } from '../../models';\nimport { error, patchUserSettings } from '@sinequa/atomic';\n\nexport function withAgentsFeatures() {\n  return signalStoreFeature(\n    withState({\n      agents: { isDebugMode: false } as UserSettingsState['agents']\n    }),\n\n    withComputed((store) => ({\n      isDebugMode: computed(() => store.agents()?.isDebugMode ?? false)\n    })),\n\n    withMethods((store) => ({\n      async setDebugMode(value: boolean) {\n        try {\n          await patchUserSettings(\n            { agents: { ...store.agents(), isDebugMode: value } },\n            { type: 'Agent_DebugMode_Toggle' }\n          );\n          patchState(store, (state) => ({\n            agents: { ...state.agents, isDebugMode: value }\n          }));\n        } catch (e) {\n          error('setDebugMode failed', e);\n        }\n      }\n    }))\n  );\n}\n","import { withDevtools } from '@angular-architects/ngrx-toolkit';\nimport { signalStore } from '@ngrx/signals';\n\nimport { withAlertsFeatures } from './with-alerts';\nimport { withAssistantFeatures } from './with-assistant';\nimport { withBasketsFeatures } from './with-baskets';\nimport { withBookmarkFeatures } from './with-bookmarks';\nimport { withDarkModeFeatures } from './with-dark-mode';\nimport { withRecentSearchesFeatures } from './with-recent-searches';\nimport { withSavedSearchesFeatures } from './with-saved-searches';\nimport { withUserSettingsFeatures } from './with-user-settings';\nimport { withAgentsFeatures } from './with-agents';\n\nexport const UserSettingsStore = signalStore(\n  { providedIn: 'root' },\n  withDevtools('UserSettings'),\n\n  withBookmarkFeatures(),\n  withRecentSearchesFeatures(),\n  withSavedSearchesFeatures(),\n  withBasketsFeatures(),\n  withAssistantFeatures(),\n  withUserSettingsFeatures(),\n  withAlertsFeatures(),\n  withAgentsFeatures(),\n  withDarkModeFeatures(),\n);\n","import { HttpClient } from \"@angular/common/http\";\nimport { Injectable, inject, signal } from \"@angular/core\";\nimport { TranslocoService } from \"@jsverse/transloco\";\nimport {\n  Aggregation,\n  Article,\n  AuditEvents,\n  buildPathsAndLevels,\n  error,\n  globalConfig,\n  info,\n  notify,\n  Query,\n  Result,\n  TreeAggregation,\n  warn\n} from \"@sinequa/atomic\";\nimport { catchError, EMPTY, map, Observable, of, tap } from \"rxjs\";\nimport { AppStore, QueryParamsStore } from \"../stores\";\n\nexport type DocumentOffsets = {\n  id: string;\n  textLocations: { offset: number, length: number }[];\n}\n\nexport type DocumentPages = {\n  id: string;\n  pages: { pageNumber: number }[];\n}\n\n@Injectable({\n  providedIn: \"root\"\n})\nexport class QueryService {\n  protected readonly http = inject(HttpClient);\n\n  private readonly appStore = inject(AppStore);\n  private readonly queryParamsStore = inject(QueryParamsStore);\n  private readonly transloco = inject(TranslocoService);\n\n  protected readonly API_URL = `${globalConfig.backendUrl}/api/v1`;\n  protected readonly API_V2_URL = `${globalConfig.backendUrl}/api/v2`;\n\n  // Represents the last result of a search operation with getResult().\n  public result = signal<Result>({} as Result);\n  public audit?: AuditEvents;\n\n  /**\n   * Performs a search query.\n   *\n   * @param q - The partial query object.\n   * @param includeQueryParams - Indicates whether to include query parameters automatically in the request.\n   * @param audit - The audit events object.\n   * @returns An observable that emits the search results.\n   */\n  search(q?: Partial<Query>, includeQueryParams = true, audit?: AuditEvents): Observable<Result> {\n    // if audit is set, always use it\n    // if this.audit is set and audit is not set use this.audit\n    // if this.audit is not set and audit is not set use default audit\n    const newAudit = audit ?? this.audit ?? { type: \"Search_Text\", detail: { querytext: q?.text } };\n    const $auditRecord = { auditEvents: [newAudit] };\n\n    this.audit = undefined; // reset this.audit after using it\n\n    const { app } = globalConfig;\n    const currentQuery = q ?? this.queryParamsStore.getQuery();\n    const query = includeQueryParams ? { ...this.queryParamsStore.getQuery(), ...currentQuery } : currentQuery;\n\n    // Check if the search query is empty and if empty searches are allowed\n    // If not allowed, return an empty result\n    //\n    // note:\n    // basket overrides this rule,\n    // open action (to open aggregations's children) also overrides this rule\n\n    // determine if there are any filters applied\n    const currentFilters = this.queryParamsStore.filters?.() || [];\n    const hasFilters = currentFilters.length > 0;\n\n    if (!hasFilters && !query.basket && query.action !== \"open\") {\n      const allowEmptySearch = this.appStore.allowEmptySearch(query?.name || \"\");\n      if (allowEmptySearch === false && query?.text === \"\") {\n        warn(\"QueryService.search: Empty search query is not allowed. Returning empty result.\");\n        notify.warning(this.transloco.translate(\"searches.emptySearch\"));\n        return of({ records: [] as Article[] } as Result);\n      }\n    }\n\n    const body = {\n      app,\n      query,\n      $auditRecord\n    };\n\n    return this.http.post<Result>(`${this.API_URL}/query`, body).pipe(\n      catchError((err) => {\n        error(\"queryService.getResults failure - error: \", err);\n        return of({} as Result);\n      }),\n      map((result: Result) => {\n        // update $hasMore flag\n        result.aggregations?.forEach((agg: Aggregation) => {\n          const count = this.appStore.getAggregationCount(result.queryName, agg.name) || 10;\n          agg.$hasMore = false;\n          if (!agg.isDistribution && !agg.isTree && agg.items) {\n            if (agg.items.length > count) {\n              agg.items = agg.items.slice(0, count);\n              agg.$hasMore = true;\n            }\n          }\n          if (agg.isTree) {\n            buildPathsAndLevels(agg as TreeAggregation);\n          }\n        });\n        return result;\n      }),\n      map((result) => {\n        result.records?.map((article: Article) => Object.assign(article, { value: article.title, type: \"default\" }));\n        return result;\n      }),\n      map((result) => {\n        const r = {\n          ...result,\n          nextPage:\n            result.page !== undefined && result.page < Math.ceil(result.rowCount / result.pageSize)\n              ? result.page + 1\n              : undefined,\n          previousPage: result.page !== undefined && result.page > 1 ? result.page - 1 : undefined\n        };\n        return r;\n      }),\n      tap((response) => {\n        this.result.set(response);\n        info(\"queryService.getResults success - data: \", response);\n      })\n    );\n  }\n\n  /**\n   * Performs a bulk search operation.\n   *\n   * @param q An array of Query objects representing the search queries.\n   * @param audit An optional AuditEvents object for auditing purposes.\n   * @returns An Observable that emits an array of Result objects.\n   */\n  bulkSearch(q: Query[], audit?: AuditEvents): Observable<Result[]> {\n    const { app = \"\" } = globalConfig;\n\n    const body: {\n      methods: {\n        method: string;\n        app: string;\n        query: Query;\n      }[];\n      propagateErrors: true;\n      $auditRecord?: { auditEvents: [AuditEvents] };\n    } = {\n      methods: [],\n      propagateErrors: true,\n      $auditRecord: { auditEvents: [audit!] }\n    };\n\n    for (const query of q) {\n      body.methods.push({\n        method: \"query\",\n        app,\n        query\n      });\n    }\n\n    return this.http.post<{ results: Result[] }>(`${this.API_URL}/multi`, body).pipe(\n      catchError((err) => {\n        error(\"queryService.bulkSearch failure - error: \", err);\n        return EMPTY;\n      }),\n      map((response) => {\n        // update $hasMore flag\n        response.results.forEach((result: Result) => {\n          result.aggregations.forEach((agg: Aggregation) => {\n            agg.$hasMore = false;\n            if (!agg.isDistribution && !agg.isTree && agg.items) {\n              const count = this.appStore.getAggregationCount(result.queryName, agg.name) || 10;\n              if (agg.items.length > count) {\n                agg.items = agg.items.slice(0, count);\n                agg.$hasMore = true;\n              }\n            }\n            if (agg.isTree) {\n              buildPathsAndLevels(agg as TreeAggregation);\n            }\n          });\n        });\n\n        return response.results;\n      }),\n      map((results) => {\n        results.forEach((result) => {\n          result.records?.map((article: Article) => Object.assign(article, { value: article.title, type: \"default\" }));\n        });\n        return results;\n      }),\n      map((results) => {\n        return results.map((result) => {\n          const r = {\n            ...result,\n            nextPage: result.page < Math.ceil(result.rowCount / result.pageSize) ? result.page + 1 : undefined,\n            previousPage: result.page > 1 ? result.page - 1 : undefined\n          };\n          return r;\n        });\n      }),\n      // map(response => ResultsSchema.parse(response) as T),\n      tap((response) => {\n        info(\"queryService.bulkSearch success - data: \", response);\n      })\n    );\n  }\n\n  /**\n   * Navigates to the specified page and returns the search result.\n   * @param page - The page number to navigate to.\n   * @returns A promise that resolves to the search result.\n   */\n  public gotoPage(page: number) {\n    const audit = {\n      type: \"Search_GotoPage\",\n      detail: {\n        page: page,\n        fromresultid: this.result()?.id ?? null\n      }\n    };\n\n    this.queryParamsStore.patch({ page }, audit);\n  }\n\n  /**\n     * Get the pages associated to some text locations.\n     *\n     * @param docs - all documents offsets we want to get the pages from.\n     * @returns An Observable that emits the found pages.\n     */\n  getDocPages(\n    docs: DocumentOffsets[]\n  ): Observable<DocumentPages[]> {\n    const queryName = this.appStore.getDefaultQuery()?.name || \"_default\";\n    const appName = globalConfig.app;\n\n    return this.http.post<{ items: DocumentPages[] }>(`${this.API_V2_URL}/app/${appName}/query/${queryName}/doc-pages`, { docs }).pipe(\n      map(({ items }: { items: DocumentPages[] }) => items),\n      catchError(err => {\n        error('queryService.getDocPages failure - error: ', err);\n        return [];\n      })\n    );\n  }\n\n  /**\n     * Get the page associated to a single text location.\n     *\n     * @param id - the document id.\n     * @param offset - offset from the passage location.\n     * @param length - length from the passage location.\n     * @returns An Observable that emits the found page.\n     */\n  getDocPage(\n    id: string,\n    offset: number,\n    length: number\n  ): Observable<number> {\n    return this.getDocPages([{ id, textLocations: [{ offset, length }] }]).pipe(\n      map((response: DocumentPages[]) => response[0].pages[0].pageNumber),\n      catchError(err => {\n        error('queryService.getDocPage failure - error: ', err);\n        return [];\n      })\n    );\n  }\n}\n","import { HttpClient } from \"@angular/common/http\";\nimport { Injectable, InjectionToken, inject } from \"@angular/core\";\nimport { getState } from \"@ngrx/signals\";\nimport {\n  Aggregation,\n  AggregationItem,\n  AuditEvents,\n  error,\n  escapeExpr,\n  FieldValue,\n  globalConfig,\n  info,\n  LegacyFilter,\n  notify,\n  Query,\n  Result,\n  TreeAggregation,\n  TreeAggregationNode\n} from \"@sinequa/atomic\";\nimport { catchError, map, Observable, tap, throwError } from \"rxjs\";\nimport { AggregationListItem, CFilter, CFilterItem } from \"../models\";\nimport { AggregationsStore, AppStore, CCAppState, QueryParamsStore } from \"../stores\";\nimport { QueryService } from \"./query.service\";\n\nexport type AggEx = Aggregation & CFilter;\n\nexport const NON_SEARCHABLE_DEFAULTS: string[] = [\"concepts\", \"size\"];\n\nexport const NON_SEARCHABLE_COLUMNS = new InjectionToken<string[]>(\"Non searchable columns\", {\n  factory: () => NON_SEARCHABLE_DEFAULTS\n});\n\n@Injectable({\n  providedIn: \"root\"\n})\nexport class AggregationsService {\n  protected readonly http = inject(HttpClient);\n  protected readonly queryService = inject(QueryService);\n\n  appStore = inject(AppStore);\n  aggregationsStore = inject(AggregationsStore);\n  queryParamsStore = inject(QueryParamsStore);\n\n  nonSearchableColumns = inject(NON_SEARCHABLE_COLUMNS);\n\n  protected API_URL = `${globalConfig.backendUrl}/api/v1`;\n\n  loadMore(query: Partial<Query>, aggregation: Aggregation, audit?: AuditEvents): Observable<Aggregation> {\n    const { app } = globalConfig;\n\n    // skip cached items for computation\n    const skip = aggregation.items?.filter((i) => !i.$cached)?.length || 0;\n    const count = this.appStore.getAggregationCount(query.name, aggregation.name) || 10;\n\n    const aggregations = { [aggregation.name]: { skip, count } };\n\n    const q: Partial<Query> = { ...query, action: \"aggregate\", aggregations };\n\n    // add audit record if available\n    const $auditRecord = audit ? { auditEvents: [audit] } : undefined;\n\n    const body = {\n      app,\n      query: q,\n      $auditRecord\n    };\n\n    return this.http.post(`${this.API_URL}/query`, body).pipe(\n      map((result) => {\n        const { aggregations } = result as Result;\n        const agg = aggregations[0];\n\n        if (agg.items) {\n          agg.$hasMore = agg.items.length > count;\n          agg.items = [...aggregation.items, ...agg.items.slice(0, count)];\n        } else {\n          aggregation.$hasMore = false;\n          return aggregation;\n        }\n\n        return agg;\n      }),\n      catchError((err) => {\n        error(\"aggregation.loadMore failure - error: \", err);\n        return throwError(() => new Error(err));\n      }),\n      tap((response) => {\n        info(\"aggregation.loadMore success - data: \", response);\n      })\n    );\n  }\n\n  open(query: Partial<Query>, aggregation: TreeAggregation, item: TreeAggregationNode): Observable<TreeAggregation> {\n    const value = `/${item.$path}/*`;\n    const expression = `${aggregation.column}:${escapeExpr(value)}`;\n\n    const q: Partial<Query> = {\n      ...query,\n      text: \"\",\n      action: \"open\",\n      open: [{ expression, aggregation: aggregation.name }]\n    };\n\n    // we dont' want to use the query params (filters) when opening nodes\n    return this.queryService.search(q, false).pipe(\n      map((results) => {\n        // find the node in the tree and replace it with the new one\n        const items = results.aggregations[0].items as TreeAggregationNode[];\n\n        // if the open call returns no items, we need to update the node to indicate it has no children\n        if (!items) {\n          notify.info(\"No children found\");\n          return aggregation;\n        }\n\n        const newNode = this.findNode(items, item.$path);\n        if (!newNode) {\n          return aggregation;\n        }\n\n        // mark the node as opened\n        newNode.$opened = true;\n        newNode.hasChildren = newNode.items && newNode.items.length > 0;\n        return this.replaceInTree(aggregation, item.$path, newNode) as TreeAggregation;\n      })\n    );\n  }\n\n  getAggregation(name: string, column: string | null): AggEx | null | undefined {\n    const agg: AggEx = this.aggregationsStore.getAggregation(name || \"\") as AggEx;\n    if (!agg) {\n      // try to get the aggregation by column name\n      const aggByColumn = this.aggregationsStore.getAggregation(column || \"\", \"column\") as AggEx;\n      if (aggByColumn) {\n        return aggByColumn;\n      }\n    }\n    return agg;\n  }\n\n  processAggregation(name: string, column: string | null): AggEx | null | undefined {\n    const agg = this.getAggregation(name, column);\n\n    if (!agg) return null;\n\n    const {\n      items = [],\n      display = agg.name,\n      icon,\n      hidden,\n      expandedLevel,\n      searchable = true\n    } = (this.appStore.getAggregationCustomization(agg.column, agg.name) as CFilter) || {};\n    agg.display = display;\n    agg.icon = icon;\n    agg.hidden = hidden;\n    agg.searchable = searchable;\n\n    if(agg.isTree && expandedLevel) {\n      agg.expandedLevel = expandedLevel\n    }\n\n    // if the aggregation's column is a \"concepts\", disable the search\n    if (this.nonSearchableColumns.some((column) => column === agg.column)) {\n      agg.searchable = false;\n    }\n\n    if (agg.items) {\n      // get current filters for the aggregation\n      const filters = this.queryParamsStore.getFilter({ field: agg.column, name: agg.name });\n      const flattenedValues = filters ? this.flattenFilters([filters]) : [];\n\n      if (agg.isTree) {\n        const selectedAgg = agg.items.map((item) => this.selectNode(item as TreeAggregationNode, flattenedValues));\n        const openedAgg = selectedAgg.map((item) => this.openParentNodes(item as TreeAggregationNode, flattenedValues));\n        agg.items = openedAgg;\n      }\n\n      (agg.items as AggregationListItem[]).forEach((item: AggregationListItem) => {\n        if (!agg.isTree && item.$selected === undefined) {\n          const valueToSearch = agg.valuesAreExpressions ? item.display : item.value;\n          item.$selected = flattenedValues.includes(valueToSearch ?? \"\") || false;\n        }\n\n        item.icon = items?.find((it: CFilterItem) => it.value === item.value)?.icon;\n      });\n    }\n\n    return agg;\n  }\n\n  /**\n   * Converts an `AggregationItem` to a `LegacyFilter`.\n   *\n   * @param item - The `AggregationItem` to be converted.\n   * @returns A `LegacyFilter` object based on the provided `AggregationItem`.\n   *\n   * The function performs the following steps:\n   * 1. Retrieves the field from the aggregation column.\n   * 2. If the aggregation is a distribution, it parses the item value to extract filter expressions.\n   *    - The expressions are split by \" AND \" and mapped to filter objects.\n   *    - If two filters are found, they are combined with an \"and\" operator.\n   *    - If one filter is found, it is returned as is.\n   *    - Throws an error if the distribution expression cannot be parsed.\n   * 3. If the item value is a string, it creates a filter with the \"contains\" operator.\n   * 4. Otherwise, it creates a filter with the item value as a string, number, or boolean.\n   *\n   * @throws Will throw an error if the distribution expression cannot be parsed.\n   */\n  toFilter(item: AggregationItem, field: string, name: string, isDistribution: boolean): LegacyFilter {\n    if (isDistribution) {\n      const res = (item.value as string).match(/.*:\\(?([><=\\d\\-.AND ]+)\\)?/);\n      if (res?.[1]) {\n        const expr = res?.[1].split(\" AND \");\n        const filters = expr.map((e) => {\n          const operator: \"gte\" | \"lt\" = e.indexOf(\">=\") !== -1 ? \"gte\" : \"lt\";\n          const value: FieldValue = e.substring(e.indexOf(\" \") + 1);\n          return { name, field, operator, value, display: item.display || item.value };\n        });\n\n        if (filters.length === 2) {\n          return {\n            operator: \"and\",\n            filters,\n            display: filters[0].display || filters[0].value,\n            field,\n            name\n          } as LegacyFilter;\n        } else if (filters.length === 1) {\n          return { ...filters[0], field, name } as LegacyFilter;\n        }\n        throw new Error(\"Failed to parse distribution expression\");\n      }\n    }\n\n    if (typeof item.value === \"string\") {\n      return { name, field, value: item.value, operator: \"contains\", display: item.display } as LegacyFilter;\n    }\n    return { name, field, value: item.value as string | number | boolean, display: item.display } as LegacyFilter;\n  }\n\n  private findNode(items: TreeAggregationNode[], path: string = \"\"): TreeAggregationNode | undefined {\n    if (!items || items.length === 0) {\n      return undefined;\n    }\n\n    for (const item of items) {\n      if (item.$path === path) {\n        return item;\n      }\n      if (item.items) {\n        const found = this.findNode(item.items, path);\n        if (found) {\n          return found;\n        }\n      }\n    }\n\n    return undefined;\n  }\n\n  private replaceInTree(tree: any, valueToFind: string = \"\", newValue: TreeAggregationNode) {\n    if (tree.$path === valueToFind) {\n      return newValue;\n    }\n\n    if (tree.hasChildren && tree.items) {\n      for (let i = 0; i < tree.items.length; i++) {\n        tree.items[i] = this.replaceInTree(tree.items[i], valueToFind, newValue);\n      }\n    }\n\n    return tree;\n  }\n\n  /**\n   * Selects a node in a tree structure based on a given path.\n   *\n   * @param {TreeAggregationNode} node - The current node in the tree.\n   * @param {string[]} path - An array of path strings used to determine which nodes to select.\n   * @returns {TreeAggregationNode} - The updated node with the selection state applied.\n   */\n  private selectNode(node: TreeAggregationNode, path: string[]): TreeAggregationNode {\n    if (node.$path && path.includes(`/${node.$path}/*`)) {\n      node.$selected = true;\n    } else {\n      node.$selected = false;\n    }\n\n    if (node.items) {\n      node.items = node.items.map((item) => this.selectNode(item, path));\n    }\n    return node;\n  }\n\n  private flattenFilters(filters: LegacyFilter[]) {\n    const flattenedValues: string[] = [];\n\n    function extractValues(filters: LegacyFilter[]) {\n      for (const filter of filters) {\n        if (filter.value) {\n          flattenedValues.push(filter.value);\n\n          if (filter.display) flattenedValues.push(filter.display);\n          // we handle \"values\" field for trees\n        } else if (filter.values) {\n          flattenedValues.push(...filter.values);\n        }\n        if (filter.filters) {\n          extractValues(filter.filters as LegacyFilter[]);\n        }\n      }\n    }\n\n    extractValues(filters);\n    return flattenedValues;\n  }\n\n  /**\n   * Recursively opens parent nodes in a tree structure if any of their child nodes are selected or opened.\n   *\n   * @param node - The current tree node being processed.\n   * @param path - An array representing the path to the current node.\n   * @returns The updated tree node with parent nodes opened if necessary.\n   */\n  private openParentNodes(node: TreeAggregationNode, path: string[]): TreeAggregationNode {\n    if (node.items) {\n      node.items = node.items.map((item) => this.openParentNodes(item, path));\n    }\n    if (node.items?.some((item) => item.$selected || item.$opened)) {\n      node.$opened = true;\n    }\n    return node;\n  }\n\n  /* aggregations helpers fot the filters components */\n  getAuthorizedFilters(\n    aggregations: Aggregation[] | undefined,\n    includedFilters: string[] = [],\n    excludedFilters: string[] = [],\n    homepageOnly = false\n  ) {\n    const agg = aggregations || this.appStore.getAuthorizedFilters();\n\n    const authorizedFilters = agg\n      .filter((f) => this.getFilterCriteria()(f)) // filter only the filters present\n      .filter((f) => !homepageOnly || this.getHomepageFilterCriteria()(f)) // when requested, keep only filters flagged `homepage: true`\n      .filter((f) => !excludedFilters.includes(f.name))\n      .filter((f) => !includedFilters.length || includedFilters.includes(f.name))\n      .map((f) => ({ field: f.column, column: f.column, name: f.name })); // field is needed for filters constructions\n\n    return authorizedFilters;\n  }\n\n  /**\n   * Determines whether a custom JSON filter refers to the given aggregation.\n   *\n   * Matches by `name` when it is defined, otherwise falls back to `column`,\n   * resolving column/alias ambiguity through the app store's column map.\n   *\n   * @param filter - The filter object coming from the custom JSON.\n   * @param agg - The aggregation returned by the backend.\n   * @returns `true` if the filter refers to the aggregation.\n   */\n  private matchesAggregation(filter: CFilter, agg: Aggregation): boolean {\n    // if filter.name is defined, use it to compare\n    if (filter.name) {\n      return filter.name.toLocaleLowerCase() === agg.name.toLocaleLowerCase();\n    }\n\n    // fallback to column comparison\n    // column can be a column's name or an alias\n\n    // resolve ambiguity between column and alias\n    const { columnMap } = getState(this.appStore) as CCAppState;\n    // get the actual column for both filter and f\n    const aggColumn = columnMap?.[agg.column.toLocaleLowerCase()];\n    const filterColumn = columnMap?.[filter?.column?.toLocaleLowerCase() || filter.name.toLocaleLowerCase()];\n\n    // if either column is not found, fallback to comparing the raw values\n    if (!aggColumn || !filterColumn) {\n      return filter?.column?.toLocaleLowerCase() === agg?.column?.toLocaleLowerCase();\n    }\n\n    // compare the actual column names coming from the column map\n    return aggColumn?.name === filterColumn?.name;\n  }\n\n  private getFilterCriteria = () => {\n    // filter: object filter from the custom JSON\n    // agg: object aggregation returned by the backend\n    return (agg: Aggregation) => this.appStore.filters().some((filter) => this.matchesAggregation(filter, agg));\n  };\n\n  private getHomepageFilterCriteria = () => {\n    // only consider filters explicitly flagged with `homepage: true` in the custom JSON\n    return (agg: Aggregation) =>\n      this.appStore.filters().some((filter) => filter.homepage && this.matchesAggregation(filter, agg));\n  };\n}\n","import { HttpClient, HttpParams } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { catchError, Observable, throwError } from 'rxjs';\n\nimport { CCApp, globalConfig } from '@sinequa/atomic';\n\n/**\n * @deprecated Use `fetchApp()` from `@sinequa/atomic` instead, which accepts an optional `appName` argument.\n * This service will be removed in a future version.\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class AppService {\n  protected readonly http = inject(HttpClient);\n\n  protected readonly API_URL = `${globalConfig.backendUrl}/api/v1`;\n\n  /**\n   * Retrieves the application configuration from the server.\n   *\n   * @param appName - The name of the application to fetch the configuration for.\n   *\n   * @returns {Observable<CCApp>} An observable that emits the application configuration.\n   *\n   * @remarks\n   * This method constructs an HTTP GET request to fetch the application configuration\n   * using the `app` parameter from the global configuration. If the request fails, it logs the\n   * error and re-throws a normalized `Error` carrying the server's `errorMessage` when available\n   * (e.g. \"app not found: '...'\"), so callers can surface the reason on the error page.\n   *\n   * @example\n   * ```typescript\n   * appService.getApp().subscribe(appConfig => {\n   *   console.log(appConfig);\n   * });\n   * ```\n   */\n  getApp(appName?: string): Observable<CCApp> {\n    const app = appName || globalConfig.app;\n\n    const params = new HttpParams().set('app', app || '');\n\n    return this.http.get<CCApp>(this.API_URL + '/app', { params }).pipe(\n      catchError((err: unknown) => {\n        console.error('AppService.getApp failure - error: ', err);\n        // Propagate the failure (previously swallowed with EMPTY, which hid the cause and surfaced a\n        // generic \"no elements in sequence\" downstream). Surface the Sinequa error-envelope message\n        // when present — e.g. a 500 with { errorMessage: \"app not found: 'mint_rnd-yoyo'\" } — so the\n        // bootstrap/login flow can route to the error page with the actual reason.\n        const e = err as {\n          error?: { errorMessage?: string; message?: string };\n          errorMessage?: string;\n          message?: string;\n        };\n        const message =\n          e?.error?.errorMessage ??\n          e?.error?.message ??\n          e?.errorMessage ??\n          e?.message ??\n          'Failed to fetch application configuration';\n        return throwError(() => new Error(message));\n      })\n    );\n  }\n}\n","import { inject } from \"@angular/core\";\nimport { CanActivateFn, Router } from \"@angular/router\";\nimport { debug, error, globalConfig, info, isAuthenticated, isExpired } from \"@sinequa/atomic\";\nimport { PrincipalStore } from \"../stores\";\nimport { getState } from \"@ngrx/signals\";\n\n/**\n * Returns a guard function that checks if the user is authenticated.\n * If the user is not authenticated, it navigates to the login page.\n * @returns The guard function.\n */\nexport function AuthGuard(): CanActivateFn {\n  return async (_, state) => {\n    const router = inject(Router);\n    const principalStore = inject(PrincipalStore);\n    const { loginPath, authMode } = globalConfig;\n\n    if (state.url.startsWith(\"/login\")) return true;\n\n    // If the user is not authenticated, navigate to the login page.\n    // The login page handles every authentication method (credentials, OAuth, SAML).\n    // In SSO mode the browser/proxy carries the auth, so we let it through.\n    if (!isAuthenticated() && authMode?.kind !== \"sso\") {\n      router.navigate([loginPath], { queryParams: { returnUrl: state.url } });\n      return false;\n    }\n\n    // If the user is authenticated, initialize the principal store if it's in the initial state\n    try {\n      if (principalStore.state() === \"initial\") {\n        await principalStore.initialize();\n      }\n    } catch {\n      error(\"Failed to initialize PrincipalStore. Redirecting to login.\");\n      // TODO: we might want to navigate to an error page instead of the login page in SSO mode, as the issue is not related to authentication but rather to fetching user details\n      router.navigate([loginPath], { queryParams: { returnUrl: state.url } });\n      return false;\n    }\n\n    // check if the \"princiapl\" infos are loaded, if not navigate to the login page\n    const { passwordExpirationDate, editablePartition, name, state: principalState } = getState(principalStore);\n    if (principalState !== \"loaded\") {\n      info(\"PrincipalStore state is still initial after initialization attempt. Redirecting to login.\");\n      router.navigate([loginPath], { queryParams: { returnUrl: state.url } });\n      return false;\n    }\n\n    // check if the password is expired and if the partition is editable\n    // changing password is only possible when user use credentials to auhtenticate\n    // only in credentials mode\n    if (authMode?.kind === \"credentials\") {\n      const exp = passwordExpirationDate;\n      const editable = !!editablePartition;\n      if (editable && exp && isExpired(exp)) {\n        sessionStorage.setItem(\"passwordExpiredFlow\", \"true\");\n        const username = (name || \"\").trim();\n        router.navigate([\"/login\"], {\n          queryParams: { mode: \"changepassword\", alert: \"passwordExpired\", username, returnUrl: state.url }\n        });\n        return false;\n      }\n    }\n\n    debug(\"User is authenticated and principal store is initialized. Access granted.\");\n    return true;\n  };\n}\n","import { computed, inject, Injectable, InjectionToken, signal, Type } from \"@angular/core\";\nimport { Title } from \"@angular/platform-browser\";\nimport { Route, Router } from \"@angular/router\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { CCApp, CCQuery, CCTab, error, info, setGlobalConfig } from \"@sinequa/atomic\";\n\nimport { AuthGuard } from \"../guards\";\nimport { AppStore } from \"../stores/app.store\";\nimport { PrincipalStore } from \"../stores/principal.store\";\nimport { UserSettingsStore } from \"../stores/user-settings/user-settings.store\";\n\nexport const ROUTE_COMPONENTS = new InjectionToken<ComponentMapping[]>(\"ROUTE_COMPONENTS\", { factory: () => [] });\n\nexport type ComponentMapping = {\n  path: string;\n  component: Type<unknown>;\n  isRoot?: boolean;\n};\n\ntype RouteConfigurationJSON = {\n  path: string;\n  wsName: string;\n  wsQueryTab: string;\n  /**\n   * The display name for the route.\n   * @deprecated Use `display` instead.\n   */\n  pathDisplayName?: string;\n  display: string;\n  icon: string;\n};\n\n@Injectable({\n  providedIn: \"root\"\n})\nexport class ApplicationService {\n  userSettingsStore = inject(UserSettingsStore);\n  principalStore = inject(PrincipalStore);\n  appStore = inject(AppStore);\n\n  router = inject(Router);\n  titleService = inject(Title);\n\n  components = inject(ROUTE_COMPONENTS);\n  defaultComponent = computed(() => this.components.find((c) => c.path === \"all\")?.component);\n  defaultLayoutComponent = computed(() => this.components.find((c) => c.isRoot)?.component);\n\n  routerConfig = signal<Route[] | undefined>(undefined);\n\n  /**\n   * Initializes the application and creates routes if needed.\n   *\n   * This method performs the following actions:\n   * 1. Calls the `initializeStores` function to initialize all the application's stores.\n   * 2. Calls the `createRoutes` function to set up the application routes.\n   *\n   * @returns {Promise<void>} A promise that resolves when the initialization and route creation are complete.\n   */\n  async initialize(withCreateRoutes = true) {\n    // throw an error if no components are registered and withCreateRoutes is true\n    // components are required to create the routes\n    if (withCreateRoutes && !this.components.length) throw new Error(\"No components registered\");\n\n    //set the createRoutes flag in the global config\n    // this will override the value set in your global config\n    setGlobalConfig({ createRoutes: withCreateRoutes });\n\n    info(\"Initializing application...\");\n    await this.initializeStores();\n    info(\"Application initialized\");\n\n    // this will set the title and logo of the application\n    // it will also set the logo in the css variables\n    info(\"Setting general application properties...\");\n    this.setGeneralApp();\n    info(\"General application properties set\");\n\n    // withCreateRoutes is true by default, but it must be set to false if tabSearch is not active and/or no tabs are defined\n    const query = this.appStore.getDefaultQuery() as CCQuery;\n    if (\n      withCreateRoutes &&\n      query &&\n      query.tabSearch &&\n      query.tabSearch.isActive &&\n      query.tabSearch.tabs &&\n      query.tabSearch.tabs.length\n    ) {\n      // check if the query \"tabs\" and the custom json \"routes\" match\n      // in the json keep only the routes that are in the query\n\n      info(\"Creating application routes...\");\n      this.createRoutes();\n      info(\"Application routes created\");\n    }\n  }\n\n  /**\n   * Initializes the application stores.\n   * - Fetches the application configuration.\n   * - Sets the fetched application configuration in the app store.\n   * - Loads the user settings and logs the state of the user settings store.\n   */\n  async initializeStores() {\n    try {\n      // Fetch the application configuration\n      await this.appStore.initialize();\n      info(\"appStore\", getState(this.appStore));\n\n      // Load the principal (user information)\n      await this.principalStore.initialize();\n      info(\"principalStore\", getState(this.principalStore));\n\n      // Load the user settings\n      await this.userSettingsStore.initialize();\n      info(\"userSettingsStore\", getState(this.userSettingsStore));\n    } catch (err) {\n      error(\"Error during application initialization\", err);\n      throw err;\n    }\n  }\n\n  /**\n   * Creates dynamic routes based on the application's queries and custom JSON configurations.\n   *\n   * This method performs the following steps:\n   * 1. Retrieves the queries and custom JSON data from the application state.\n   * 2. Maps the queries to an array of objects containing query names and tabs.\n   * 3. Throws an error if no queries are found.\n   * 4. Retrieves route data from custom JSONs or falls back to default data.\n   * 5. Creates routes for each tab in each query, or uses the query name if no tabs are found.\n   * 6. Removes the current search route from the router configuration.\n   * 7. Creates child routes based on the provided routes data or the first query's tabs.\n   * 8. Updates the search route with the new child routes.\n   * 9. Resets the router configuration with the new routes.\n   *\n   * @throws {Error} If no queries are found.\n   */\n  private createRoutes() {\n    // get the queries and custom jsons from the app store\n    const { queries, data: custom, customJSONs = [] } = getState(this.appStore) as CCApp;\n\n    // for each query we need to create a route with the query name and the tab name\n    // contains an array of objects CCQuery for each existing query\n    // we keep only the name and the tabSearch properties\n    const queriesMap = Object.entries(queries).map(([key, value]) => ({\n      key,\n      name: value.name,\n      tabSearch: value.tabSearch\n    }));\n\n    // ! if no queries are found, throw an error\n    if (!queriesMap.length) {\n      throw new Error(\"No queries found\");\n    }\n\n    // Retrieves the routes data from the custom JSONs array or fall back to the default data (custom json).\n    let { data: cjRoutes } = Array.isArray(customJSONs)\n      ? customJSONs?.find((c) => c.name === \"routes\") || {}\n      : { data: custom?.[\"routes\"] };\n\n    // check if cjRoutes is an array and not an object to avoid errors\n    if (cjRoutes && !Array.isArray(cjRoutes)) {\n      cjRoutes = undefined;\n    }\n\n    // retrieve the routes data from the custom JSONs or fall back to the default custom json\n    const routes = (cjRoutes || custom?.[\"routes\"]) as RouteConfigurationJSON[];\n\n    // take only first query to create the routes\n    const firstQuery = queriesMap[0];\n\n    // We need to create a route path object for each tab in the first query\n    // if the query has no tabs, we create a route with the query name as the tab name\n    const firstQueryConfig = { name: firstQuery.name, tabs: firstQuery.tabSearch.tabs || [{ name: firstQuery.name }] };\n\n    // We need to remove the current search route from the router config\n    // the route exists in the router config because it was created in the app-routing.module.ts and we need it\n    // to be able to navigate to the search page. We will recreate it with the new tabs\n    const currentConfig = this.router.config.filter((route) => route.path !== \"search\");\n\n    let children = [];\n\n    // if the routes data is provided, we create the children routes based on the routes data\n    if (routes) {\n      // check if the routes provided are valid\n      const validRoutes = this.checkRoutesValidity(routes, firstQueryConfig);\n      // if no valid routes are found, throw an error\n      if (!validRoutes.length) {\n        error(\"No valid routes found\", routes);\n        return;\n      }\n\n      // update routes display with the query display name when not provided\n      // for each path we need to find the corresponding query and tab in the firstQuery object\n      // and create a child route with the query name and tab name\n      const displayNamesMap = firstQuery.tabSearch.tabs.reduce(\n        (acc, tab) => {\n          acc[tab.name] = { display: tab.display };\n          return acc;\n        },\n        {} as Record<string, { display: string }>\n      );\n\n      // respect the order of the tabs in the first query\n      // we need to separate the routes that are not in the first query from the ones that are\n      const notFirstQueryTabs = validRoutes.filter(\n        (route) => route.wsQueryTab !== firstQueryConfig.name && route.wsName !== undefined\n      );\n\n      // route path without wsName are considered as first query tabs\n      const firstQueryTabs = validRoutes.filter(\n        (route) => route.wsQueryTab === firstQueryConfig.name || route.wsName === undefined\n      );\n\n      // sort the validRoutes according to the order of the tabs in the first query\n      firstQueryTabs.sort((a, b) => {\n        const aIndex = firstQueryConfig.tabs.findIndex(\n          (tab: CCTab) => tab.name === a.wsQueryTab && (a.wsName === firstQueryConfig.name || a.wsName === undefined)\n        );\n        const bIndex = firstQueryConfig.tabs.findIndex(\n          (tab: CCTab) => tab.name === b.wsQueryTab && (b.wsName === firstQueryConfig.name || b.wsName === undefined)\n        );\n        return aIndex - bIndex;\n      });\n\n      const sortedValidRoutes = [...firstQueryTabs, ...notFirstQueryTabs];\n\n      children = sortedValidRoutes.map((route) => {\n        return {\n          path: route.path,\n          component: this.components.find((c) => c.path === route.path)?.component || this.defaultComponent(),\n          data: {\n            queryName: route.wsName || firstQuery.name,\n            display: route.display || displayNamesMap[route.wsQueryTab]?.display || route.path,\n            wsQueryTab: route.wsQueryTab,\n            icon: route.icon\n          }\n        };\n      });\n    } else {\n      // if the routes data is not provided, we create the children routes based on the first query's tabs\n      // create the children routes for the search route\n      children = firstQueryConfig.tabs.map((tab) => ({\n        path: tab.name,\n        component: this.components.find((c) => c.path === tab.name)?.component || this.defaultComponent(),\n        data: { queryName: firstQuery.name, display: tab.display || tab.name }\n      }));\n    }\n\n    const searchPath = this.router.config.find((route) => route.path === \"search\") || {\n      path: \"search\",\n      component: this.components.find((c) => c.path === \"search\")?.component || this.defaultLayoutComponent(),\n      canActivate: [AuthGuard()],\n      children: []\n    };\n\n    const wildcardPath = searchPath.children?.find((route) => route.path === \"**\") || {\n      path: \"**\",\n      redirectTo: \"all\",\n      pathMatch: \"full\"\n    };\n\n    // remove the wildcard path from the searchPath children if it exists\n    const existingChildren = (searchPath.children ?? []).filter((child) => child.path !== \"**\");\n    // remove duplicates from children and existingChildren based on the path\n    // usefull when createRoutes is called multiple times (e.g. with override user)\n    const existingPaths = new Set(existingChildren.map((child) => child.path));\n    children = children.filter((child) => !existingPaths.has(child.path));\n\n    // update the searchPath with the new children\n\n    searchPath.component = this.components.find((c) => c.path === \"search\")?.component || this.defaultLayoutComponent();\n    searchPath.children = [...children, ...existingChildren, wildcardPath];\n\n    const newConfig = [searchPath, ...currentConfig];\n    info(\"ApplicationService: createRoutes -> newConfig\", newConfig);\n    this.routerConfig.set(newConfig);\n    // finally we reset the router config with the new routes\n    this.router.resetConfig(newConfig);\n  }\n\n  /**\n   * Checks the validity of the provided routes against the first query configuration.\n   * Filters out invalid routes and adds missing routes based on the first query's tabs.\n   *\n   * @param routes The array of route configurations to validate.\n   * @param firstQueryConfig The configuration of the first query, including its name and tabs.\n   * @returns An array of valid route configurations.\n   *\n   * @throws Will log an error for each invalid route found.\n   *\n   * @remarks\n   * A route is considered invalid if it lacks both a `wsName` and a corresponding `wsQueryTab`\n   * in the first query's tabs. Missing routes from the first query's tabs are added to ensure\n   * all tabs are represented in the valid routes.\n   */\n  private checkRoutesValidity(\n    routes: RouteConfigurationJSON[],\n    firstQueryConfig: { name: string; tabs: CCTab[] }\n  ): RouteConfigurationJSON[] {\n    // if no \"wsName\" check if the wqQueryTab is provided and if not, remove the route from the array\n    const validRoutes = routes.filter((route) => {\n      if (!route.wsName) {\n        if (!route.wsQueryTab) {\n          error(\"Invalid route provided\", route);\n          return false;\n        }\n        // if the wsQueryTab is provided, we need to check if it exists in the first query\n        const tabExists = firstQueryConfig.tabs.find((tab) => tab.name === route.wsQueryTab);\n        if (!tabExists) {\n          error(\"Invalid route provided\", route);\n          return false;\n        }\n      }\n      return true;\n    });\n\n    // add to validRoutes the routes that are in the first query and not in the validRoutes\n    // we need to check if the route is already in the validRoutes array\n    const additionalRoutes = firstQueryConfig.tabs\n      .filter((tab) => {\n        // Check if the tab is already in the validRoutes array\n        const routeExists = validRoutes.some(\n          (route) =>\n            route.wsQueryTab === tab.name && (route.wsName === firstQueryConfig.name || route.wsName === undefined)\n        );\n        return !routeExists;\n      })\n      .map((tab) => {\n        // Create a new route object for the tab\n        return {\n          path: tab.name,\n          wsName: firstQueryConfig.name,\n          queryName: firstQueryConfig.name,\n          wsQueryTab: tab.name,\n          display: tab.display || tab.name,\n          icon: \"\"\n        };\n      });\n\n    // Add the additional routes to the validRoutes array\n    validRoutes.push(...additionalRoutes);\n    return validRoutes;\n  }\n\n  /**\n   * Sets general application properties such as the document title and logo styles\n   * based on the current general configuration from the application store.\n   *\n   * - Updates the document title if a general name is provided.\n   * - Sets CSS custom properties for small and large logos if available in the configuration.\n   *\n   * @remarks\n   * This method retrieves the general configuration from the application store\n   * and applies the relevant properties to the document.\n   */\n  private setGeneralApp() {\n    const general = this.appStore.general();\n    // If general is not defined or is an empty object, do nothing\n    if (!general || (typeof general === \"object\" && Object.keys(general).length === 0)) return;\n\n    // NB: the document title is intentionally NOT set here. The page-specific title is\n    // owned by the routed components/layouts via `setTitle()`. Setting it here would\n    // overwrite the page title with the bare application name during bootstrap.\n    // The initial title falls back to the static <title> defined in index.html.\n\n    const { light, dark, alt } = general.logo || {};\n    document.documentElement.style.setProperty(\"--logo-alt-text\", `'${alt || general.name}'`);\n\n    // light mode logo configuration\n    if (light?.small) {\n      document.documentElement.style.setProperty(\"--logo-light-small\", `url('${light.small}')`);\n    }\n    if (light?.large) {\n      document.documentElement.style.setProperty(\"--logo-light-large\", `url('${light.large}')`);\n    }\n    if (light?.sidebar) {\n      document.documentElement.style.setProperty(\"--logo-light-sidebar\", `url('${light.sidebar}')`);\n    }\n\n    // dark mode logo configuration\n    if (dark?.small) {\n      document.documentElement.style.setProperty(\"--logo-dark-small\", `url('${dark.small}')`);\n    }\n    if (dark?.large) {\n      document.documentElement.style.setProperty(\"--logo-dark-large\", `url('${dark.large}')`);\n    }\n    if (dark?.sidebar) {\n      document.documentElement.style.setProperty(\"--logo-dark-sidebar\", `url('${dark.sidebar}')`);\n    }\n  }\n\n  /**\n   * Sets the document title with optional application name prefix.\n   *\n   * If the application general settings contain a name, the title will be formatted as\n   * \"{appName} - {title}\". Otherwise, only the provided title will be used.\n   *\n   * @param title - The title to set for the document\n   */\n  setTitle(title: string) {\n    const general = this.appStore.general();\n    // If general is not defined or is an empty object, do nothing\n\n    if (general?.name) {\n      info(\"Setting document title to:\", general.name);\n      this.titleService.setTitle(`${general.name} - ${title}`);\n    } else {\n      this.titleService.setTitle(title);\n    }\n  }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, computed, inject } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\nimport { Article, AuditEvent, AuditEvents, AuditEventType, AuditEventTypeValues, CCApp, globalConfig, isAuthenticated, Result } from '@sinequa/atomic';\nimport { AppStore } from '../stores/app.store';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AuditService {\n  appStore = inject(AppStore);\n  app = computed(() => getState(this.appStore) as CCApp);\n\n  protected readonly http = inject(HttpClient);\n  protected readonly router = inject(Router);\n  protected readonly API_URL = `${globalConfig.backendUrl}/api/v1`;\n\n  protected lastClickTime = 0;\n\n  /**\n   * Notify the Sinequa server of a set of audit events\n   *\n   * @param auditEvents The audit events\n   */\n  notify(auditEvents: AuditEvents) {\n    if(!isAuthenticated()) return; // Don't send audit events if the user is not authenticated\n    this.http\n      .post<void>(this.API_URL + '/audit.notify', {\n        event: 'None', // AuditEventType.None,\n        app: this.app().name,\n        $auditRecord: { auditEvents: [auditEvents] }\n      })\n      .subscribe();\n  }\n\n  /**\n   * It sends an audit event to the Audit Service.\n   */\n  notifyLogin() {\n    this.notify({\n      type: 'Login_Success_Form' // AuditEventType.Search_Login_Success\n    });\n  }\n\n  /**\n   * Notify logout\n   */\n  notifyLogout() {\n    this.notify({\n      type: 'Search_Exit_Logout' // AuditEventType.Search_Exit_Logout\n    });\n  }\n\n  /**\n   * Notify the Sinequa server of a document event\n   *\n   * @param evt The audit event type\n   * @param doc The document (article) in question\n   * @param resultId The resultid that contain the document\n   * @param parameters Additional parameters\n   */\n  notifyDocument(\n    auditEventType: AuditEventType | AuditEventTypeValues | ({} & Record<never, never>),\n    doc: Article,\n    resultsOrId: Result | string,\n    parameters?: Record<string, string | number | boolean | undefined>,\n    rfmParameters?: Record<string, string | number | boolean | undefined>\n  ) {\n    let resultId: string | null;\n    let result: Result | undefined;\n    if (typeof resultsOrId == 'string') {\n      resultId = resultsOrId;\n    } else {\n      result = resultsOrId;\n      resultId = result ? result.id : null;\n    }\n\n    const detail: any = {\n      docid: doc.id,\n      rank: doc.rank,\n      title: doc.title,\n      source: doc.collection[0].split('/')[0],\n      collection: doc.collection[0],\n      resultId,\n      filename: doc.filename,\n      fileext: doc.fileext,\n      index: doc.databasealias,\n      resultcount: result?.totalRowCount\n    };\n\n    if (parameters) {\n      Object.keys(parameters).forEach(key => (detail[key] = parameters[key]));\n    }\n    const data: AuditEvent = {\n      type: auditEventType,\n      detail\n    };\n\n    if (rfmParameters) {\n      const rfmDetail: Record<string, string | number | boolean | undefined> = {}; // Add index signature\n      Object.keys(rfmParameters).forEach(key => (rfmDetail[key] = rfmParameters[key]));\n      data.rfmDetail = rfmDetail;\n    }\n\n    this.lastClickTime = Date.now();\n\n    // Listen to the navigation event outside the app\n    document.addEventListener(\n      'visibilitychange',\n      () => {\n        // Capture the navigation even triggered just after the click\n        if (document.visibilityState === 'hidden' && Date.now() - this.lastClickTime < 1000) {\n          // Second event triggered when we come back\n          document.addEventListener(\n            'visibilitychange',\n            () => {\n              if (document.visibilityState === 'visible') {\n                this.notify({ type: AuditEventType.Navigation_Return });\n              }\n            },\n            { once: true }\n          );\n        }\n      },\n      { once: true }\n    );\n\n    this.notify(data);\n  }\n\n  /**\n   * Notify route change\n   */\n  notifyRouteChange(url: string) {\n    this.notify({\n      type: 'Navigation_Route', // AuditEventType.Navigation_Route,\n      detail: {\n        detail: url\n      }\n    });\n  }\n}\n","import { Injectable, Injector, inject, signal } from '@angular/core';\nimport { getState } from '@ngrx/signals';\n\nimport { CCWebService, Suggestion, fetchSuggest } from '@sinequa/atomic';\n\nimport { Autocomplete } from '../models/autocomplete';\nimport { AppStore } from '../stores/app.store';\nimport { UserSettingsStore } from '../stores/user-settings/user-settings.store';\n\ntype AutocompleteWebService = CCWebService & {\n  allowedWithAnySBA?: boolean;\n  revision?: number;\n  suggestQueries?: string;\n  useDistributionRegex?: boolean;\n};\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AutocompleteService {\n  readonly opened = signal(false);\n\n  readonly injector = inject(Injector);\n\n  userSettingsStore = inject(UserSettingsStore);\n  appStore = inject(AppStore);\n\n  /**\n   * Retrieves autocomplete items for the given text, max count for each\n   * category handled by the service can be specified in the admin\n   *\n   * @param text Text to retrieve autocomplete items for\n   * @returns An observable of an array of {@link Suggestion} arrays grouped by\n   * suggestion queries configured in the admin\n   */\n  getFromSuggestQueriesForText(text: string): Promise<Suggestion[][]> {\n    // Do not ask for autocomplete items if the text is empty\n    if (!text) return Promise.resolve([]);\n\n    const queries = (this.appStore.getWebServiceByType('autocomplete') as AutocompleteWebService)?.suggestQueries?.split(',') ?? [];\n    const promises = queries.map((query: string) => fetchSuggest(query, text));\n    return Promise.all(promises);\n  }\n\n  /**\n   * Retrieves autocomplete items for the given text from the user settings\n   *\n   * @param text Text to retrieve autocomplete items for\n   * @param maxCount Maximum number of items to retrieve\n   * @returns An observable of an array of {@link Suggestion} arrays grouped by\n   * `recent-searches`, `saved-searches`, `bookmarks` from the user settings\n   */\n  getFromUserSettingsForText(text: string, maxCount?: number | Autocomplete): Suggestion[] {\n    const { bookmarks, recentSearches, savedSearches } = getState(this.userSettingsStore);\n    const items: Suggestion[] = [];\n\n    if (typeof maxCount === 'number') maxCount = { recentSearches: maxCount, savedSearches: maxCount, bookmarks: maxCount };\n\n    if (recentSearches) {\n      // don't filter if the text is empty\n      const matchingRecentSearches = text\n        ? recentSearches.filter(recentSearch => recentSearch.display?.toLocaleLowerCase().includes(text.toLocaleLowerCase()))\n        : recentSearches;\n\n      const searches = matchingRecentSearches.slice(0, maxCount?.recentSearches);\n\n      if (searches.length > 0) items.push(...searches.map(search => ({ category: 'recent-search', ...search })));\n    }\n\n    if (savedSearches) {\n      // don't filter if the text is empty\n      const matchingSavedSearches = text\n        ? savedSearches.filter(savedSearch => savedSearch.display?.toLocaleLowerCase().includes(text.toLocaleLowerCase()))\n        : savedSearches;\n\n      const searches = matchingSavedSearches.slice(0, maxCount?.savedSearches);\n\n      if (searches.length > 0) items.push(...searches.map(search => ({ category: 'saved-search', ...search })));\n    }\n\n    if (bookmarks) {\n      // don't filter if the text is empty\n      const matchingBookmarks = text ? bookmarks.filter(bookmark => bookmark.label?.toLowerCase().includes(text.toLowerCase())) : bookmarks;\n\n      const searches = matchingBookmarks.slice(0, maxCount?.bookmarks);\n\n      if (searches.length > 0) items.push(...searches.map(search => ({ category: 'bookmark', display: search.label ?? '', ...search })));\n    }\n\n    return items;\n  }\n}\n","import { HttpClient, HttpContext, HttpHeaders, HttpParams } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\n\nimport { globalConfig, isObject } from '@sinequa/atomic';\nimport { Observable, throwError } from 'rxjs';\n\ntype Options = {\n  headers?:\n    | HttpHeaders\n    | {\n        [header: string]: string | string[];\n      };\n  context?: HttpContext;\n  observe?: 'body' | 'events' | 'response';\n  params?:\n    | HttpParams\n    | {\n        [param: string]: string | number | boolean | ReadonlyArray<string | number | boolean>;\n      };\n  reportProgress?: boolean;\n  responseType: 'arraybuffer' | 'blob' | 'text' | 'json';\n  withCredentials?: boolean;\n};\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class JsonMethodPluginService {\n  protected readonly http = inject(HttpClient);\n\n  protected readonly API_URL = `${globalConfig.backendUrl}/api/v1`;\n\n  /**\n   * Call a JsonMethod plugin using an HTTP POST\n   *\n   * @param method The name of the JsonMethod plugin\n   * @param query Parameters to pass to the plugin\n   * @param options HTTP options for the request\n   * @returns An observable of the plugin's return value\n   */\n  post<U>(method: string, query: U, options?: Options): Observable<any> {\n    if (!isObject(query)) {\n      return throwError(() => ({ error: 'invalid query object' }));\n    }\n    return this.http.post(`${this.API_URL}/plugin/${method}`, query, options as any);\n  }\n\n  /**\n   * Call a JsonMethod plugin using an HTTP GET\n   *\n   * @param method The name of the JsonMethod plugin\n   * @param query Parameters to pass to the plugin\n   * @param options HTTP options for the request\n   * @returns An observable of the plugin's return value\n   */\n  get<U extends Record<string, string | boolean | number | Date | object | undefined>>(method: string, query: U, options?: Options): Observable<any> {\n    return this.http.get(`${this.API_URL}/plugin/${method}`, {\n      params: query,\n      ...(options as any)\n    });\n  }\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { NavigationEnd, Router, RouterEvent } from \"@angular/router\";\nimport { filter, map, shareReplay, tap } from \"rxjs\";\n\nimport { AuditService } from \"./audit.service\";\n\n@Injectable({\n  providedIn: \"root\"\n})\nexport class NavigationService {\n  private readonly router = inject(Router);\n  private readonly auditService = inject(AuditService);\n\n  // The URL after the last navigation event, used to redirect the user after login\n  urlAfterNavigation: string | null = null;\n\n  /**\n   * Observable that emits events of type `NavigationEnd` from the Angular Router.\n   *\n   * This observable performs the following operations:\n   * - Maps all router events to `RouterEvent`.\n   * - Filters the events to only include instances of `NavigationEnd`.\n   * - Taps into the event stream to extract the route name from the URL and notify the audit service of route changes,\n   *   excluding duplicate navigations.\n   * - Updates the `urlAfterNavigation` property with the current URL after navigation.\n   * - Shares the replayed value with a buffer size of 1 to ensure subscribers receive the latest emitted value.\n   *\n   * @type Observable<RouterEvent>\n   */\n  public navigationEnd$ = this.router.events.pipe(\n    map((event) => event as RouterEvent),\n    filter((event: RouterEvent) => event instanceof NavigationEnd),\n    tap((event) => {\n      const url = event.url.slice(1).split(\"?\")[0]; // Extract route name\n      if (url && url !== this.urlAfterNavigation) {\n        this.auditService.notifyRouteChange(url);\n      }\n    }),\n    tap((event) => {\n      if (event.url !== \"/login\") {\n        this.urlAfterNavigation = event.url;\n      }\n    }),\n    shareReplay(1)\n  );\n}\n","import { InjectionToken } from '@angular/core';\n\nexport type PreviewHighlightName = 'company' | 'geo' | 'person' | 'extractslocations' | 'matchlocations';\nexport type PreviewHighlight = {\n  name: PreviewHighlightName;\n  color: string;\n  bgColor: string;\n};\n\n// pre-configured highlights's colors\nexport const HIGHLIGHTS = new InjectionToken<PreviewHighlight[]>('highlights', {\n  factory: () => [\n    {\n      name: 'company',\n      color: 'white',\n      bgColor: '#FF7675'\n    },\n    {\n      name: 'geo',\n      color: 'white',\n      bgColor: '#74B9FF'\n    },\n    {\n      name: 'person',\n      color: 'white',\n      bgColor: '#00ABB5'\n    },\n    {\n      name: 'extractslocations',\n      color: 'black',\n      bgColor: '#fffacd'\n    },\n    {\n      name: 'matchlocations',\n      color: 'black',\n      bgColor: '#ff0'\n    }\n  ]\n});\n","import { InjectionToken } from '@angular/core';\n\n/**\n * @deprecated use `general` configuration json instead from the app store\n */\nexport type AppFeatures = {\n  assistant: {\n    // Whether the assistant configuration should be prefiexed with the app name\n    usePrefixName: boolean;\n  };\n};\n\n/**\n * @deprecated use `general` configuration json instead from the app store\n */\nexport const APP_FEATURES = new InjectionToken<AppFeatures>('app.features');\n","import { HttpClient } from \"@angular/common/http\";\nimport { DestroyRef, Injectable, InjectionToken, Injector, inject, signal } from \"@angular/core\";\nimport { DomSanitizer } from \"@angular/platform-browser\";\nimport { getState } from \"@ngrx/signals\";\nimport {\n  Article,\n  Audit,\n  AuditEvents,\n  AuditEventType,\n  CCWebService,\n  CustomHighlights,\n  error,\n  globalConfig,\n  info,\n  PreviewData,\n  Query\n} from \"@sinequa/atomic\";\nimport { Observable, Subject, tap } from \"rxjs\";\n\nimport { ApplicationStore, AppStore, Extract, QueryParamsStore, SelectionStore } from \"../stores\";\nimport { HIGHLIGHTS } from \"../tokens\";\nimport { InlineWorker } from \"../utils\";\nimport { AuditService } from \"./audit.service\";\nimport { QueryService } from \"./query.service\";\n\nexport const PREVIEW_CONFIG = new InjectionToken(\"Preview configuration\", {\n  factory: () => ({\n    allowWorker: false\n  })\n});\n\ntype ExtractsLocations = Extract & {\n  text: string; // HTML text\n};\n\ntype CCWebServicePreview = CCWebService & {\n  allowCustomHighlights: boolean;\n  allowedWithAnySBA: boolean;\n  defaultHighlights: boolean;\n  forceTextPreview: string;\n  highlights: string;\n  maxNumberOfHighlights: string | number;\n  maximumHtmlSize: string | number;\n};\nexport type PreviewEvents = \"idle\" | \"loading\" | \"loaded\" | \"fetching\" | \"fetched\" | \"error\" | \"scrollTo\";\n\n@Injectable({\n  providedIn: \"root\"\n})\nexport class PreviewService {\n  protected readonly http = inject(HttpClient);\n  protected readonly injector = inject(Injector);\n\n  protected readonly API_URL = `${globalConfig.backendUrl}/api/v1`;\n\n  protected readonly applicationStore = inject(ApplicationStore);\n  protected readonly selectionStore = inject(SelectionStore);\n  protected readonly queryParamsStore = inject(QueryParamsStore);\n  protected readonly appStore = inject(AppStore);\n\n  protected readonly sanitizer = inject(DomSanitizer);\n\n  protected readonly queryService = inject(QueryService);\n  protected readonly auditService = inject(AuditService);\n\n  readonly totalPages = signal<number>(0);\n  readonly currentPage = signal<number>(1);\n\n  events = signal<PreviewEvents>(\"idle\");\n  DOMContentLoaded = signal<boolean>(false);\n\n  // ! worker\n  onMessage = new Subject<unknown>();\n  worker: InlineWorker | undefined;\n\n  allowWorker = inject(PREVIEW_CONFIG).allowWorker;\n  highlights = inject(HIGHLIGHTS);\n\n  previewData: PreviewData | undefined;\n  protected iframe: Window | null | undefined;\n\n  passageOffset = signal<{ id: string; offset: number; length: number; } | undefined>(undefined);\n\n  highlightCategory = \"extractslocations\";\n\n  extracts = [\"matchlocations\", \"extractslocations\", \"matchingpassages\"];\n  entities = [\"company\", \"geo\", \"person\"];\n\n  abortController = new AbortController();\n\n  constructor(protected destroyRef: DestroyRef) {\n    window.addEventListener(\"message\", this.receiveMessage.bind(this), { signal: this.abortController.signal });\n\n    // update the highlights according to the web service \"preview\" configuration\n    this.updateHighlightsFromWebServiceConfiguration();\n\n    destroyRef.onDestroy(() => {\n      this.abortController.abort();\n    });\n  }\n\n  /**\n   * Handles incoming messages from a MessageEvent.\n   *\n   * @param event - The MessageEvent containing the message data.\n   *\n   * The function processes messages of type 'ready' and 'get-html-results'.\n   *\n   * - For 'ready' messages:\n   *   - Initializes the preview iframe with the app name and highlights.\n   *   - If preview data is available, retrieves HTML content based on the current selection.\n   *\n   * - For 'get-html-results' messages:\n   *   - Updates the application store with the extracted HTML results.\n   *   - If no extracts are found, updates the application store with an empty array.\n   */\n  receiveMessage(event: MessageEvent) {\n    const message = event.data;\n    const { app } = globalConfig;\n\n    if (message.type === \"ready\") {\n      this.DOMContentLoaded.set(true);\n      this.sendMessage({ action: \"init\", highlights: this.highlights, appname: app });\n\n      if (this.previewData) {\n        const { id } = getState(this.selectionStore);\n        if (!id) return;\n        this.events.set(\"fetching\");\n        this.retrieveHtmlContent(id, this.highlightCategory, this.previewData);\n      }\n    }\n\n    if (message.type === \"page-info\") {\n      const { total, current } = message.data ?? {};\n      this.totalPages.set(Math.max(0, total ?? 0));\n      this.currentPage.set(Math.max(1, current ?? 1));\n      return;\n    }\n\n    if (message.type === \"page-changed\") {\n      const { current } = message.data ?? {};\n      this.currentPage.set(Math.max(1, current ?? 1));\n      return;\n    }\n\n    if (message.type === \"get-html-results\") {\n      const { id } = getState(this.selectionStore);\n      if (id && this.previewData) {\n        info(\"get html results without worker\");\n        const extracts = this.fetchExtracts(message.data, this.previewData);\n        this.applicationStore.updateExtracts(this.previewData?.record.id || \"\", extracts);\n        this.events.set(\"fetched\");\n      }\n      return;\n    }\n\n    if (message.type === \"get-html-results-webworker\") {\n      info(\"get html results with worker\");\n      if (message.data.extracts.length === 0) {\n        this.events.set(\"fetched\");\n        this.applicationStore.updateExtracts(this.previewData?.record.id || \"\", []);\n        return;\n      }\n      const extracts: Extract[] = message.data.extracts.map((item: unknown & { text: string }) => ({\n        ...item,\n        text: this.sanitizer.bypassSecurityTrustHtml(item.text)\n      }));\n      this.applicationStore.updateExtracts(this.previewData?.record.id || \"\", extracts);\n      this.events.set(\"fetched\");\n      return;\n    }\n  }\n\n  /**\n   * Generates a preview of the document with the given ID, applying the specified query parameters,\n   * custom highlights, and audit events.\n   *\n   * @param id - The unique identifier of the document to preview.\n   * @param q - Partial query parameters to customize the preview request.\n   * @param customHighlights - Optional array of custom highlights to apply to the preview.\n   * @param audit - Optional audit events to merge with the default audit record.\n   * @returns An Observable that emits the preview data.\n   */\n  preview(\n    id: string,\n    q: Partial<Query>,\n    customHighlights?: CustomHighlights[],\n    audit?: AuditEvents\n  ): Observable<PreviewData> {\n    const detail = this.getAuditPreviewDetail(id, q);\n\n    const defaultAudit: AuditEvents = {\n      type: \"Doc_Preview\",\n      detail\n    };\n\n    // merge the default audit record with the provided audit record\n    const $auditRecord = audit ? { auditEvents: [{ ...defaultAudit, ...audit }] } : { auditEvents: [defaultAudit] };\n\n    const { app } = globalConfig;\n    const query = { ...this.queryParamsStore.getQuery(), ...q };\n\n    const browserUrl = `${window.location.origin}${window.location.pathname}`;\n\n    const body = {\n      app,\n      action: \"get\",\n      id,\n      query: { name: query.name, text: query.text },\n      browserUrl,\n      customHighlights,\n      $auditRecord\n    };\n\n    // reset preview data\n    this.previewData = undefined;\n\n    this.events.set(\"loading\")\n\n    return this.http\n      .post<PreviewData>(`${this.API_URL}/preview`, body)\n      .pipe(\n        tap((data: PreviewData) => this.setPreviewData(data)),\n        tap(() => this.events.set(\"loaded\"))\n      );\n    }\n\n  /**\n   * Closes the preview with the specified ID and updates the audit log.\n  *\n  * @param id - The ID of the preview to close.\n  * @param query - The partial query object used to retrieve the preview detail.\n  */\n close(id: string, query: Partial<Query>) {\n    this.passageOffset.set(undefined);\n    const detail = this.getAuditPreviewDetail(id, query);\n    const auditEvent = {\n      type: AuditEventType.Preview_Close,\n      detail\n    };\n    Audit.notify(auditEvent);\n  }\n\n  /**\n   * Previews an article in a new browser's tab.\n   *\n   * @param article - The article to preview.\n   */\n  openExternal(article: Article) {\n    const query = this.queryParamsStore.getQuery();\n    try {\n      const detail = this.getAuditPreviewDetail(article.id, query);\n      const result = this.queryService.result();\n      this.auditService.notifyDocument(\n        \"Click_ResultLink\",\n        article,\n        result || detail.resultid || \"\",\n        {\n          querytext: detail.querytext,\n          querylang: detail.querylang,\n          score: detail.score\n        },\n        {\n          queryhash: result ? result.rfmQueryHash : undefined,\n          querytext: detail.querytext,\n          querylang: detail.querylang\n        }\n      );\n    } catch (e) {\n      error(\"preview.openExternal failure - error: \", e);\n    }\n    window.open(article.url1, \"_blank\", \"noopener noreferrer\");\n  }\n\n  /**\n   * Sets the iframe window object.\n   *\n   * @param iframe - The window object of the iframe or null to unset.\n   */\n  setIframe(iframe: Window | null) {\n    this.iframe = iframe;\n  }\n\n  /**\n   * Sets the preview data and updates the highlight category based on the provided data.\n   *\n   * @param data - The preview data to be set.\n   *\n   * If the provided data contains highlights per category with 'matchingpassages' having values,\n   * the highlight category is set to \"matchingpassages\". Otherwise, it is set to \"extractslocations\".\n   */\n  setPreviewData(data: PreviewData) {\n    this.previewData = data;\n\n    if (data) {\n      this.highlightCategory = data.highlightsPerCategory?.[\"matchingpassages\"]?.values.length\n        ? \"matchingpassages\"\n        : \"extractslocations\";\n    }\n  }\n\n  /**\n   * Sends a message to the iframe if it exists.\n   *\n   * @param message - The message to be sent. It can be of any type.\n   */\n  sendMessage(message: unknown) {\n    const iframe = this.iframe;\n    if (iframe) {\n      iframe.postMessage(message, \"*\");\n    }\n  }\n\n  /**\n   * Get preview id for an entity value for an index\n   * @param entity the entity type (i.e. \"geo\")\n   * @param value the entity value (i.e. \"AUSTRALIA\")\n   * @param index the entity index from its list\n   * @returns the html id\n   */\n  getEntityId(entity: string, value: string, index: number): number | undefined {\n    if (!this.previewData) return undefined;\n\n    // Combine filters for better performance\n    const entitySearched = this.previewData.highlightsPerLocation\n      .filter((item) => item.positionInCategories[entity] && item.values.some((v) => v === value))\n      .map((e) => ({ id: e.positionInCategories[entity] }));\n    const id = entitySearched[index]?.id;\n    return id;\n  }\n\n  /**\n   * Send a message to the prewiew iFrame with the required data to retrieve HTML content for a specific highlight category\n   *\n   * @param id - The unique identifier for the request.\n   * @param highlightCategory - The category of highlights to retrieve.\n   * @param previewData - The data containing highlights and their locations.\n   */\n  retrieveHtmlContent(id: string, highlightCategory: string, previewData: PreviewData) {\n    // Generate the list of items we want to retrieve\n    const ids = previewData.highlightsPerCategory[highlightCategory]?.values[0]?.locations.map(\n      (_, i) => `${highlightCategory}_${i}`\n    );\n\n    if (this.allowWorker) {\n      // if the worker is allowed, we send the message to the worker\n      this.sendMessage({ action: \"get-html-webworker\", id, ids, previewData });\n    } else {\n      this.sendMessage({ action: \"get-html\", id, ids, previewData });\n    }\n  }\n\n  /**\n   * Sends a message to zoom in.\n   *\n   * This method triggers a \"zoom-in\" action by sending a message\n   * with the specified action type.\n   */\n  zoomIn() {\n    this.sendMessage({ action: \"zoom-in\" });\n  }\n\n  /**\n   * Sends a message to fit content to container.\n   *\n   * This method triggers a \"zoom-fit\" action by sending a message\n   * with the specified action type.\n   */\n  zoomFit() {\n    this.sendMessage({ action: \"zoom-fit\" });\n  }\n\n  /**\n   * Sends a message to zoom out the preview.\n   *\n   * This method triggers a \"zoom-out\" action by sending a message\n   * to the relevant service or component.\n   */\n  zoomOut() {\n    this.sendMessage({ action: \"zoom-out\" });\n  }\n\n  toggleAIDescription(value: boolean) {\n    // Toggle the AI description in the preview\n    this.sendMessage({ action: \"toggle-description\", show: value });\n  }\n\n  /**\n   * Toggles the highlights based on the provided flags for extracts and entities.\n   *\n   * @param extracts - A boolean flag indicating whether to include extracts highlights.\n   * @param entities - A boolean flag indicating whether to include entities highlights.\n   */\n  toggle(extracts: boolean, entities: boolean) {\n    const extractsHighlights = extracts ? this.highlights.filter((h) => this.extracts.includes(h.name)) : [];\n    const entitiesHighlights = entities ? this.highlights.filter((h) => this.entities.includes(h.name)) : [];\n    const highlights = [...extractsHighlights, ...entitiesHighlights];\n\n    this.sendMessage({ action: \"highlight\", highlights });\n  }\n\n  getAuditPreviewDetail(id: string, q: Partial<Query>) {\n    const results = this.queryService.result();\n    const queryLanguage =\n      results?.queryAnalysis?.queryLanguage ||\n      q?.questionLanguage ||\n      (q.name && this.appStore.getQueryByName(q.name)?.questionLanguage) ||\n      undefined;\n\n    // if selection store contains the same id, use the record\n    // otherwise use the preview data record\n    // this will be helpful when reading the ranking of the document\n    const article = getState(this.selectionStore).article;\n    const record = article && article.id === id ? article : this.previewData?.record;\n\n    const collectionColumn = record?.collection;\n    const collection = collectionColumn ? collectionColumn[0] : id.split(\"|\")[0];\n    const rank = record ? record.rank : 0;\n    const passages = record?.matchingpassages?.passages;\n    const score = passages?.length ? passages[0].score : undefined;\n    return {\n      docid: id,\n      rank,\n      collection,\n      source: collection.split(\"|\")[0],\n      resultid: results.id,\n      querylang: queryLanguage,\n      querytext: q?.text,\n      filename: record?.filename,\n      fileext: record?.fileext,\n      score\n    };\n  }\n\n  private fetchExtracts(extracts: string[], data: PreviewData): Extract[] {\n    if (!data) return [];\n\n    // extracts contains the html of extracts in chronological order\n    // locations contains the list of start positions sorted by score\n    const locations = data.highlightsPerCategory[this.highlightCategory]?.values[0]?.locations || [];\n\n    // first extract all the extracts locations\n    let extractslocations = locations.map((l, relevanceIndex) => ({\n      startIndex: l.start,\n      relevanceIndex\n    })) as ExtractsLocations[];\n\n    // sort them by start index\n    extractslocations.sort((a, b) => a.startIndex - b.startIndex);\n\n    // then extract the text of each extract\n    extractslocations = extractslocations.map((ex, textIndex) => ({\n      ...ex,\n      textIndex: textIndex,\n      text: extracts[textIndex] || \"\",\n      id: `${this.highlightCategory}_${textIndex}`\n    }));\n\n    // then sanitize the text and remove empty extracts\n    const _extracts = extractslocations\n      .filter((item) => item.text.trim().length > 0)\n      .map((item) => ({\n        ...item,\n        text: this.sanitizer.bypassSecurityTrustHtml(item.text)\n      }));\n\n    // finally sort them by relevance index\n    _extracts.sort((a, b) => a.relevanceIndex - b.relevanceIndex);\n\n    return _extracts;\n  }\n\n  /*\n   * Get the preview configuration from the web service\n   * and update the highlights accordingly\n   */\n  private updateHighlightsFromWebServiceConfiguration() {\n    const previewConfig = this.appStore.getWebServiceByType(\"preview\") as CCWebServicePreview;\n    if (!previewConfig) return;\n\n    // update extracts\n    // remove \"extracts\" values from the highlights configuration\n    const entities = previewConfig.highlights.split(\",\").filter((h) => !this.extracts.includes(h));\n    // merge the entities with the default highlights without duplicates\n    this.entities = [...new Set([...this.entities, ...entities])];\n  }\n\n  // TODO: to be implemented\n  gotoPage(page: number) {\n    this.currentPage.set(page);\n    this.sendMessage({ action: \"goto-page\", page });\n  }\n\n  nextPage() {\n    this.currentPage.update((n) => n + 1);\n    this.sendMessage({ action: \"next-page\" });\n  }\n  prevPage() {\n    this.currentPage.update((n) => n - 1);\n    this.sendMessage({ action: \"prev-page\" });\n  }\n  firstPage() {\n    this.currentPage.set(1);\n    this.sendMessage({ action: \"first-page\" });\n  }\n  lastPage() {\n    this.currentPage.set(this.totalPages());\n    this.sendMessage({ action: \"last-page\" });\n  }\n}\n","import { Injectable } from '@angular/core';\nimport { EMPTY, Observable, catchError, from } from 'rxjs';\n\nimport { Principal, fetchPrincipal } from '@sinequa/atomic';\n\n/**\n * @deprecated This service is deprecated and should not be used directly. Please use the PrincipalStore instead.\n*/\n@Injectable({\n  providedIn: 'root'\n})\nexport class PrincipalService {\n  /**\n   * Retrieves the principal information from the server.\n   *\n   * @returns Observable<Principal> An observable that emits the principal information.\n   *\n   * @remarks\n   * Delegates to the SDK's fetchPrincipal so the request goes through atomic's auth handling\n   * (credentials + authMode-aware noAutoAuthentication). On error it logs and returns EMPTY.\n   *\n   * @example\n   * ```typescript\n   * principalService.getPrincipal().subscribe(principal => {\n   *   console.log(principal);\n   * });\n   * ```\n   */\n  getPrincipal(): Observable<Principal> {\n    return from(fetchPrincipal()).pipe(\n      catchError(error => {\n        console.error('PrincipalService.getPrincipal failure - error: ', error);\n        return EMPTY;\n      })\n    );\n  }\n}\n","import { Injectable, inject } from \"@angular/core\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { SearchItem } from \"../models\";\nimport { QueryParamsStore, UserSettingsStore } from \"../stores\";\n\nconst SAVED_SEARCHES_MAX_STORAGE = 100;\n\n@Injectable({\n  providedIn: \"root\"\n})\nexport class SavedSearchesService {\n  protected readonly userSettingsStore = inject(UserSettingsStore);\n  protected readonly queryParamsStore = inject(QueryParamsStore);\n\n  /**\n   * Retrieves the list of saved searches from the user settings store.\n   *\n   * @returns {SearchItem[]} An array of saved searches.\n   */\n  public getSavedSearches(): SearchItem[] {\n    return this.userSettingsStore.savedSearches();\n  }\n\n  /**\n   * Saves the current search query to the user's saved searches.\n   *\n   * This method retrieves the current search text from the query parameters store.\n   * If the search text is empty, it logs an error and exits.\n   * Otherwise, it creates a new saved search object with the current URL, date, and search text.\n   *\n   * The new saved search is added to the beginning of the saved searches array.\n   * If the array exceeds the maximum allowed storage, the oldest search is removed.\n   *\n   * Finally, the updated saved searches array is saved back to the user settings store,\n   * and a success message is displayed to the user.\n   *\n   * @throws {Error} If saving an empty search is attempted.\n   */\n  public saveSearch(saveName?: string) {\n    const { text } = getState(this.queryParamsStore);\n    const display = saveName || text;\n\n    if (!display) {\n      console.error(\"Saving empty search is not allowed\");\n      return;\n    }\n\n    const savedSearch = {\n      url: window.location.hash.substring(1),\n      date: new Date().toISOString(),\n      display\n    } as SearchItem;\n    const savedSearches = this.userSettingsStore.savedSearches();\n\n    if (savedSearches.length >= SAVED_SEARCHES_MAX_STORAGE) {\n      savedSearches.pop();\n    }\n\n    savedSearches.unshift(savedSearch);\n\n    this.userSettingsStore.updateSavedSearches(savedSearches);\n  }\n\n  /**\n   * Updates the saved searches in the user settings store.\n   *\n   * @param savedSearches - An array of SearchItem objects to update.\n   */\n  public updateSavedSearches(savedSearches: SearchItem[]) {\n    this.userSettingsStore.updateSavedSearches(savedSearches);\n  }\n\n  /**\n   * Deletes a saved search from the user settings store.\n   *\n   * @param index - The index of the saved search to delete.\n   */\n  public deleteSavedSearch(index: number) {\n    this.userSettingsStore.deleteSavedSearch(index);\n  }\n}\n","import { inject, Injectable, Injector } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\nimport { catchError, map, Observable, of } from 'rxjs';\n\nimport { AuditEvents, globalConfig, Query, Result } from '@sinequa/atomic';\n\nimport { HttpClient } from '@angular/common/http';\nimport { QueryParamsStore, UserSettingsStore } from '../stores';\nimport { QueryService } from './query.service';\n\nexport type SearchOptions = {\n  appendFilters?: boolean;\n  audit?: AuditEvents;\n};\n\ntype QueryParams = {\n  f?: string; // filters list\n  p?: number; // page number\n  s?: string; // sort name\n  t?: string; // tab name\n  q?: string; // query text\n};\n\n/**\n * Service for performing search operations.\n *\n * @deprecated Use `QueryService` and `QueryParamsStore` instead.\n */\n@Injectable({\n  providedIn: 'root'\n})\nexport class SearchService {\n  protected readonly http = inject(HttpClient);\n  private readonly router = inject(Router);\n  private readonly route = inject(ActivatedRoute);\n  private readonly queryService = inject(QueryService);\n\n  // Represents the last result of a search operation with getResult().\n  public result: Result = {} as Result;\n  public audit?: AuditEvents;\n\n  protected readonly queryParamsStore = inject(QueryParamsStore);\n  protected readonly userSettingsStore = inject(UserSettingsStore);\n  protected readonly injector = inject(Injector);\n\n  protected readonly API_URL = `${globalConfig.backendUrl}/api/v1`;\n\n  /**\n   * Executes a search operation with the given commands and options.\n   *\n   * @deprecated use `queryParamsStore` to update the query parameters and `queryService.search()` to perform the search.\n   *\n   * @param commands - An array of strings representing the search commands.\n   * @param options - An optional object containing search options.\n   * @param options.appendFilters - A boolean indicating whether to append existing filters to the search query. Defaults to true.\n   * @param options.audit - An optional audit trail object to be stored in the navigation state.\n   *\n   * The method constructs query parameters based on the current state and the provided options,\n   * then navigates to the specified commands with the constructed query parameters and audit trail.\n   */\n  public search(commands: string[], options: SearchOptions = { appendFilters: true }): void {\n    const queryParams: QueryParams = {};\n    const { text, filters = [], page, sort, tab } = getState(this.queryParamsStore);\n    const { audit, appendFilters } = options;\n\n    this.audit = audit;\n\n    if (appendFilters) {\n      queryParams.f = filters.length > 0 ? JSON.stringify(filters) : undefined;\n      queryParams.p = page;\n      queryParams.s = sort;\n      queryParams.t = tab;\n      queryParams.q = text;\n    }\n\n    // navigation state store the audit trail\n    this.router.navigate(commands, { relativeTo: this.route, queryParamsHandling: 'merge', queryParams, state: { audit } });\n  }\n\n  /**\n   * Retrieves the search result based on the provided query.\n   *\n   * @deprecated use `queryService.search()` instead.\n   *\n   * @param q - A partial query object containing search parameters.\n   * @returns An Observable of the search result.\n   *\n   * This method performs the following actions:\n   * - Creates an audit event with the type \"Search_Text\" and the query text.\n   * - Resets the audit property to undefined.\n   * - Calls the search method of the queryService with the query, a flag to include the query name in records, and the audit event.\n   * - Handles any errors by returning an empty Result object.\n   * - Maps the search result to the service's result property.\n   */\n  public getResult(q: Partial<Query>): Observable<Result> {\n    const audit: AuditEvents = { type: 'Search_Text', detail: { querytext: q?.text }, ...this.audit };\n    this.audit = undefined;\n    // add the query name to records, to have it available if we bookmark one\n    return this.queryService.search(q, true, audit).pipe(\n      catchError(() => of({} as Result)),\n      map((result: Result) => (this.result = result))\n    );\n  }\n\n  /**\n   * Navigates to the specified page and returns the search result.\n   *\n   * @deprecated use queryService.gotoPage() instead.\n   *\n   * @param page - The page number to navigate to.\n   * @returns A promise that resolves to the search result.\n   */\n  public gotoPage(page: number) {\n    this.queryParamsStore.patch({ page });\n    this.search([], {\n      audit: {\n        type: 'Search_GotoPage',\n        detail: {\n          page: page,\n          fromresultid: this.result ? this.result.id : null\n        }\n      }\n    });\n  }\n}\n","import { Location } from '@angular/common';\nimport { Injectable, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\n\nimport { Article } from '@sinequa/atomic';\n\nimport { SelectionStore } from '../stores/selection.store';\nimport { QueryParamsStore } from '../stores/query-params.store';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class SelectionService {\n  private readonly route = inject(ActivatedRoute);\n  private readonly router = inject(Router);\n  private readonly location = inject(Location);\n  private readonly selectionStore = inject(SelectionStore);\n  queryParamsStore = inject(QueryParamsStore);\n\n  /**\n   * Sets the current article in the selection store and optionally updates the query text.\n   * If the provided article is undefined, it clears the current article.\n   *\n   * @param article - The article to set as the current article. If undefined, the current article is cleared.\n   * @param withQueryText - A boolean indicating whether to update the query text in the selection store. Defaults to true.\n   *\n   * @returns void\n   */\n  public setCurrentArticle(article?: Article, withQueryText: boolean = true): void {\n    if (!article) {\n      this.clearCurrentArticle();\n      return;\n    }\n\n    // update selection store with article and query text\n    const { text } = getState(this.queryParamsStore);\n    this.selectionStore.update({ article, id: article.id, queryText: withQueryText ? text : undefined });\n\n    if (article?.id) this.updateArticleIdInQueryParams(article.id);\n  }\n\n  /**\n   * Clears the current article selection from the selection store and\n   * removes the article ID from the query parameters.\n   *\n   * @remarks\n   * This method performs two main actions:\n   * 1. Clears the current selection from the `selectionStore`.\n   * 2. Removes the article ID from the query parameters to ensure\n   *    the URL does not reference the cleared article.\n   *\n   * @public\n   */\n  public clearCurrentArticle(): void {\n    this.selectionStore.clear();\n\n    this.clearArticleIdFromQueryParams();\n  }\n\n  /**\n   * Updates the article ID in the query parameters of the current route.\n   * If the provided ID is undefined, it will remove the ID from the query parameters.\n   *\n   * @param id - The article ID to be set in the query parameters. If undefined, the ID will be removed.\n   */\n  private updateArticleIdInQueryParams(id?: string): void {\n    const url = this.router.createUrlTree([], { relativeTo: this.route, queryParams: { id }, queryParamsHandling: 'merge' }).toString();\n    this.location.replaceState(url);\n  }\n\n  /**\n   * Clears the 'id' parameter from the current route's query parameters.\n   *\n   * This method creates a copy of the current query parameters, removes the 'id' parameter,\n   * and then updates the browser's URL to reflect the change without reloading the page.\n   *\n   * @private\n   */\n  private clearArticleIdFromQueryParams(): void {\n    const queryParams = Object.assign({}, this.route.snapshot.queryParams);\n\n    delete queryParams['id'];\n\n    const url = this.router.createUrlTree([], { relativeTo: this.route, queryParams }).toString();\n\n    this.location.replaceState(url);\n  }\n}\n","import { EventEmitter, Injectable, effect, inject } from '@angular/core';\nimport { getState } from '@ngrx/signals';\n\nimport { Article } from '@sinequa/atomic';\n\nimport { SelectionStore } from '../stores';\nimport { SelectionService } from './selection.service';\n\n// back is used when the user close the current selection and want to go back to the previous one\n// new is used when the user select a new article\nexport type SelectionHistoryEvent = 'back' | 'new';\n\n/*\n * The `SelectionHistoryService` class is responsible for managing the selection history.\n *\n * It keeps track of the history of selected articles and provides methods to navigate through the history.\n * The service also emits events when the selection history changes.\n * This service is used by the Drawer\n */\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class SelectionHistoryService {\n  public readonly selectionHistoryEvent = new EventEmitter<SelectionHistoryEvent>();\n\n  private readonly selectionService = inject(SelectionService);\n  private readonly selectionStore = inject(SelectionStore);\n\n  private readonly history: Article[] = [];\n\n  constructor() {\n    effect(() => {\n      const { article } = getState(this.selectionStore);\n\n      if (!!article && article !== this.history[this.history.length - 1]) {\n        this.history.push(article);\n        this.selectionHistoryEvent.next('new');\n      }\n    });\n  }\n\n  /**\n   * Retrieves the index of the current selection.\n   *\n   * @returns {number} The index of the current selection, which is the last element in the history array.\n   */\n  public getCurrentSelectionIndex(): number {\n    return this.history.length - 1;\n  }\n\n  /**\n   * Retrieves an article from the selection history at the specified index.\n   *\n   * @param index - The index of the article to retrieve.\n   * @returns The article at the specified index, or `undefined` if the index is out of bounds.\n   */\n  public getSelection(index: number): Article | undefined {\n    if (index < 0 || index >= this.history.length) return undefined;\n\n    return this.history[index];\n  }\n\n  /**\n   * Retrieves the length of the history array.\n   *\n   * @returns {number} The number of entries in the history.\n   */\n  public getHistoryLength(): number {\n    return this.history.length;\n  }\n\n  /**\n   * Clears the selection history and resets the current article selection.\n   *\n   * This method performs the following actions:\n   * - Empties the history array.\n   * - Calls the `clearCurrentArticle` method on the `selectionService` to reset the current article selection.\n   */\n  public clearHistory(): void {\n    this.history.length = 0;\n    this.selectionService.clearCurrentArticle();\n  }\n\n  /**\n   * Navigates back in the selection history.\n   *\n   * Removes the most recent entry from the history. If the history is empty after this operation,\n   * it returns `undefined`. Otherwise, it sets the current article to the last entry in the history,\n   * triggers a 'back' event, and returns the last entry.\n   *\n   * @returns {Article | undefined} The last article in the history, or `undefined` if the history is empty.\n   */\n  public back(): Article | undefined {\n    this.history.pop();\n\n    if (this.history.length === 0) return undefined;\n\n    const last = this.history[this.history.length - 1];\n\n    this.selectionService.setCurrentArticle(last);\n    this.selectionHistoryEvent.next('back');\n\n    return last;\n  }\n}\n","import { HttpClient } from '@angular/common/http';\nimport { Injectable, inject } from '@angular/core';\nimport { Query, TextChunk, TextLocation, globalConfig } from '@sinequa/atomic';\nimport { Observable, catchError, map } from 'rxjs';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class TextChunkService {\n  protected readonly http = inject(HttpClient);\n\n  protected readonly API_URL = `${globalConfig.backendUrl}/api/v1`;\n\n  /**\n   * Retrieves text chunks based on the provided parameters.\n   *\n   * @param id - The ID of the record.\n   * @param textChunks - An array of TextLocation objects representing the location of the text chunks.\n   * @param highlights - An array of strings representing the highlights to be applied to the text chunks.\n   * @param query - The query used to retrieve the text chunks.\n   * @param leftSentencesCount - The number of sentences to include before the text chunks.\n   * @param rightSentencesCount - The number of sentences to include after the text chunks.\n   * @returns An Observable that emits an array of TextChunk objects.\n   */\n  getTextChunks(\n    id: string,\n    textChunks: TextLocation[],\n    highlights: string[],\n    query: Query,\n    leftSentencesCount: number,\n    rightSentencesCount: number\n  ): Observable<TextChunk[]> {\n    const body = {\n      id,\n      textChunks,\n      highlights,\n      query,\n      leftSentencesCount,\n      rightSentencesCount\n    };\n\n    return this.http.post<any>(this.API_URL + '/doc.textchunks', body).pipe(\n      map((response: { chunks: TextChunk[] }) => response.chunks),\n      catchError(error => {\n        console.error('TextChunkService.getTextChunks failure - error: ', error);\n        return [];\n      })\n    );\n  }\n}\n","import { httpResource } from \"@angular/common/http\";\nimport { Injectable, Signal } from \"@angular/core\";\nimport { globalConfig, UserProfile } from \"@sinequa/atomic\";\n\n@Injectable({\n  providedIn: \"root\"\n})\nexport class UserProfileService {\n  protected readonly API_URL = `${globalConfig.backendUrl}/api/v2/user-profile`;\n\n  /**\n   * Retrieves the user profile by user ID.\n   *\n   * @param id - The ID of the user.\n   * @returns An Observable that emits an the UserProfile object.\n   */\n  getUserProfile(userId: Signal<string | undefined>) {\n    return httpResource(() => (userId() ? `${this.API_URL}/${userId()}` : undefined), {\n      parse: (response) => {\n        return response as UserProfile;\n      }\n    });\n  }\n}\n","import { Component, computed, effect, inject, input, signal } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { ButtonComponent } from \"@sinequa/ui\";\n\nimport { QueryService } from \"../../../services\";\n\nexport type PageConfiguration = {\n  page: number;\n  rowCount: number;\n  pageSize: number;\n};\n/**\n * Pager Component\n * @deprecated Use TanstackQuery solutions instead.\n */\n@Component({\n  selector: \"pager\",\n  standalone: true,\n  imports: [TranslocoPipe, ButtonComponent],\n  template: `\n    <div class=\"flex gap-2\">\n      @if ((hasPages() && page() > 1) || (!hasPages() && page() > 1)) {\n        <button variant=\"ghost\" [attr.title]=\"'previousPage' | transloco\" (click)=\"previousPage()\">\n          <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"me-2 h-3.5 w-3.5 rotate-180\" aria-hidden=\"true\" fill=\"none\" viewBox=\"0 0 14 10\">\n            <path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M1 5h12m0 0L9 1m4 4L9 9\" />\n          </svg>\n\n          {{ 'previousPage' | transloco }}\n        </button>\n      }\n\n      @if (hasPages()) {\n        <button variant=\"ghost\" [attr.title]=\"'nextPage' | transloco\" (click)=\"nextPage()\">\n          {{ 'nextPage' | transloco }}\n\n          <svg xmlns=\"http://www.w3.org/2000/svg\" class=\"ms-2 h-3.5 w-3.5\" aria-hidden=\"true\" fill=\"none\" viewBox=\"0 0 14 10\">\n            <path stroke=\"currentColor\" stroke-linecap=\"round\" stroke-linejoin=\"round\" stroke-width=\"2\" d=\"M1 5h12m0 0L9 1m4 4L9 9\" />\n          </svg>\n        </button>\n      }\n    </div>\n  `\n})\nexport class PagerComponent {\n  public readonly configuration = input.required<PageConfiguration>();\n\n  protected readonly page = signal(0);\n  protected readonly hasPages = computed(() => {\n    const { page, pageSize, rowCount } = this.configuration();\n    return page * pageSize < rowCount;\n  });\n\n  private readonly queryService = inject(QueryService);\n\n  constructor() {\n    effect(() => {\n      this.page.set(this.configuration().page);\n    });\n  }\n\n  public nextPage(): void {\n    this.page.set(this.page() + 1);\n    this.queryService.gotoPage(this.page());\n  }\n\n  public previousPage(): void {\n    this.page.set(this.page() - 1);\n    this.queryService.gotoPage(this.page());\n  }\n}\n","import { computed, Directive, input } from \"@angular/core\";\nimport { cn } from \"@sinequa/ui\";\n\n/**\n * @deprecated Use the SearchInputFooter from @sinequa/ui instead.\n */\n@Directive({\n  selector: \".search-input-footer, search-input-footer, SearchInputFooter, searchinputfooter\",\n  standalone: true,\n  host: {\n    \"[class]\": \"variants()\"\n  }\n})\nexport class SearchInputFooter {\n  class = input<string>();\n  variants = computed(() => cn(\"pt-2\", this.class()));\n}\n","import { Component, computed, inject, input } from \"@angular/core\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\nimport { FaIconComponent } from \"@sinequa/ui\";\nimport { CSources } from \"../../models\";\nimport { AppStore } from \"../../stores\";\n\n@Component({\n  selector: \"source, Source\",\n  standalone: true,\n  imports: [TranslocoPipe, FaIconComponent],\n  templateUrl: \"./source.component.html\",\n  providers: [provideTranslocoScope(\"sources\")]\n})\nexport class SourceComponent {\n  readonly collection = input<string[]>();\n  readonly connector = input<string>(\"\");\n\n  private readonly appStore = inject(AppStore);\n\n  readonly iconDetails = computed((): { iconClass: string; iconPath?: string } => {\n    const [collection] = this.collection() || [];\n    const connector = (this.connector() ?? \"\").toLocaleLowerCase();\n\n    if (!collection) {\n      return { iconClass: \"\", iconPath: undefined };\n    }\n\n    const src = this.appStore.sources() as CSources;\n    const name = collection.split(\"/\")[1].toLocaleLowerCase();\n\n    const defaultIconClass = \"far fa-file\";\n\n    if (Array.isArray(src)) {\n      const { icon: iconClass = defaultIconClass } =\n        src.find((source: { name: string }) => source.name.toLocaleLowerCase() === name) || {};\n      return { iconClass };\n    }\n\n    if (src.collection && Object.keys(src.collection).includes(collection.toLocaleLowerCase())) {\n      const { iconClass = defaultIconClass, iconPath } = src.collection[collection.toLocaleLowerCase()];\n      return { iconClass, iconPath };\n    }\n    if (src.source && Object.keys(src.source).includes(name)) {\n      const { iconClass = defaultIconClass, iconPath } = src.source[name.toLocaleLowerCase()];\n      return { iconClass, iconPath };\n    }\n    if (src.connector && Object.keys(src.connector).includes(connector)) {\n      const { iconClass = defaultIconClass, iconPath } = src.connector[connector.toLocaleLowerCase()];\n      return { iconClass, iconPath };\n    }\n\n    return { iconClass: defaultIconClass };\n  });\n}\n","@if (iconDetails().iconPath) {\r\n  <img\r\n    [src]=\"iconDetails().iconPath\"\r\n    [alt]=\"collection()?.[0] || ('sources.sourceIcon' | transloco)\" />\r\n} @else {\r\n  <FaIcon\r\n    [faClass]=\"iconDetails().iconClass\"\r\n    [attr.aria-label]=\"'sources.sourceIcon' | transloco\" />\r\n}\r\n","import {\n  afterNextRender,\n  Component,\n  ElementRef,\n  effect,\n  inject,\n  input,\n  OnDestroy,\n  signal,\n  untracked,\n  viewChild\n} from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { Article, LegacyFilter } from \"@sinequa/atomic\";\nimport { ButtonComponent, ChevronRightIcon, EllipsisIcon, MenuComponent, MenuContentComponent, MenuItemComponent, BadgeComponent, LinkComponent } from \"@sinequa/ui\";\n\nimport { AggregationsStore, QueryParamsStore } from \"../../stores\";\nimport { SourceComponent } from \"../source/source.component\";\n\n@Component({\n  selector: \"document-locator, DocumentLocator\",\n  standalone: true,\n  imports: [\n    EllipsisIcon,\n    ChevronRightIcon,\n    SourceComponent,\n    ButtonComponent,\n    MenuComponent,\n    MenuContentComponent,\n    MenuItemComponent,\n    LinkComponent\n],\n  template: `\n    <!-- Renders all segment hidden to user to compute width -->\n    <div #shadowRender class=\"pointer-events-none invisible absolute left-0 top-0 -z-10 flex gap-1\">\n      @for (segment of locationSegments(); track $index) {\n        <span class=\"whitespace-nowrap\">{{ segment }}</span>\n\n        @if (!$last) {\n          <chevron-right-icon />\n        }\n      }\n    </div>\n\n    <Source class=\"flex\" [collection]=\"article().collection\" />\n\n    <chevron-right-icon />\n\n    <div #documentLocator class=\"flex grow items-center gap-1\">\n      @for (segment of visibleSegments(); track $index) {\n        <a link class=\"cursor-pointer\" (click)=\"navigateToSegment($index)\">{{segment }}</a>\n\n        @if (!$last) {\n          <chevron-right-icon />\n        }\n      }\n\n      @if (visibleSegments().length > 0 && invisibleSegments().length > 0) {\n        <ChevronRightIcon class=\"text-foreground\" />\n      }\n\n      @if (invisibleSegments().length > 0) {\n        <menu>\n          <button class=\"h-0 w-full p-2\" variant=\"ghost\" [iconOnly]=\"true\" aria-label=\"More segments\">\n            <EllipsisIcon class=\"text-foreground\" />\n          </button>\n\n          <MenuContent position=\"bottom\">\n            @for (segment of invisibleSegments(); track $index) {\n              <MenuItem (click)=\"navigateToSegment($index, true)\">\n                <chevron-right-icon />\n                <span class=\"pe-2\">{{ segment }}</span>\n              </MenuItem>\n            }\n          </MenuContent>\n        </menu>\n      }\n    </div>\n  `,\n  host: {\n    class: \"flex items-center grow gap-2 overflow-hidden\"\n  }\n})\nexport class DocumentLocatorComponent implements OnDestroy {\n  /**\n   * A readonly property that holds the required `Article` input.\n   * This property is used to ensure that an `Article` object is provided\n   * as an input to the component.\n   */\n  readonly article = input.required<Article>();\n  /**\n   * The name of the aggregation to use for the document locator.\n   */\n  readonly aggregation = input.required<string>();\n\n  readonly shadow = viewChild(\"shadowRender\", { read: ElementRef });\n  readonly client = viewChild(\"documentLocator\", { read: ElementRef });\n\n  readonly el = inject(ElementRef);\n  readonly router = inject(Router);\n  readonly queryParamStore = inject(QueryParamsStore);\n  readonly aggregationStore = inject(AggregationsStore);\n\n  readonly locationSegments = signal<string[]>([]);\n  readonly visibleSegments = signal<string[]>([]);\n  readonly invisibleSegments = signal<string[]>([]);\n\n  // margin for dropdown segment with separator\n  readonly margin = 70;\n\n  previousCount?: number;\n  resizeObserver?: ResizeObserver = new ResizeObserver(() => this.onResize());\n\n  constructor() {\n    this.resizeObserver?.observe(this.el.nativeElement);\n\n    afterNextRender({ write: () => this.onResize() });\n\n    effect(() => {\n      const article = this.article();\n      untracked(() => this.locationSegments.set(article.treepath[0]?.split(\"/\").slice(1, -1) ?? []));\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.resizeObserver?.disconnect();\n    this.resizeObserver = undefined;\n  }\n\n  onResize(): void {\n    const shadowElement = this.shadow()?.nativeElement as HTMLElement;\n    const startPos = shadowElement.getBoundingClientRect().left;\n    const clientElement = this.client()?.nativeElement as HTMLElement | undefined;\n\n    if (!clientElement || !shadowElement.children || shadowElement.children.length === 0) return;\n\n    const clientWidth = clientElement.clientWidth;\n\n    let i = 0;\n\n    for (; i < shadowElement.children.length; ++i) {\n      // process if not a separator\n      if (i % 2 === 0) {\n        const width = shadowElement.children[i].getBoundingClientRect().right - startPos;\n\n        if (width + this.margin >= clientWidth) break;\n      }\n    }\n\n    if (!this.previousCount || i !== this.previousCount) {\n      this.previousCount = i;\n\n      this.visibleSegments.set(this.locationSegments().slice(0, Math.ceil(i / 2)));\n      this.invisibleSegments.set(this.locationSegments().slice(Math.ceil(i / 2)));\n    }\n  }\n\n  navigateToSegment(index: number, fromPopover = false): void {\n    const aggregation = this.aggregationStore.getAggregation(this.aggregation());\n    if (!aggregation) {\n      console.error(`Aggregation ${this.aggregation()} not found`);\n      return;\n    }\n\n    let currentFilter = this.queryParamStore.getFilter({ name: aggregation?.name, field: aggregation?.column });\n\n    currentFilter ??= { name: aggregation.name, field: aggregation?.column, operator: \"in\" } as LegacyFilter;\n    currentFilter.values ??= [];\n\n    if (fromPopover) {\n      currentFilter.values.push(\n        `/${this.locationSegments()\n          .slice(0, this.locationSegments().length - (this.invisibleSegments().length - index) + 1)\n          .join(\"/\")}/*`\n      );\n    } else {\n      currentFilter.values.push(\n        `/${this.locationSegments()\n          .slice(0, index + 1)\n          .join(\"/\")}/*`\n      );\n    }\n\n    this.queryParamStore.updateFilter(currentFilter);\n\n    const { filters } = getState(this.queryParamStore);\n\n    this.router.navigate([], { queryParams: { f: JSON.stringify(filters) }, queryParamsHandling: \"merge\" });\n  }\n}\n","import { Component, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport {\n  ButtonComponent,\n  CardComponent,\n  CardContentComponent,\n  CardHeaderComponent\n} from '@sinequa/ui';\n\n@Component({\n  selector: 'error-component, ErrorComponent',\n  standalone: true,\n  imports: [\n    ButtonComponent,\n    CardComponent,\n    CardHeaderComponent,\n    CardContentComponent\n  ],\n  host: {\n    class: 'bg-background text-foreground grid min-h-dvh w-full place-content-center p-6'\n  },\n  template: `\n    <Card\n      hover=\"no\"\n      class=\"bg-background border-(--popover-border) w-full max-w-md rounded-3xl border shadow-2xl\">\n      <CardHeader class=\"flex flex-col items-center gap-4 pt-8 text-center\">\n        <span\n          class=\"bg-destructive/10 text-destructive inline-flex h-16 w-16 items-center justify-center rounded-full\">\n          <svg\n            xmlns=\"http://www.w3.org/2000/svg\"\n            class=\"h-8 w-8\"\n            viewBox=\"0 0 24 24\"\n            fill=\"none\"\n            stroke=\"currentColor\"\n            stroke-width=\"2\"\n            stroke-linecap=\"round\"\n            stroke-linejoin=\"round\"\n            aria-hidden=\"true\">\n            <path d=\"m21.73 18-8-14a2 2 0 0 0-3.48 0l-8 14A2 2 0 0 0 4 21h16a2 2 0 0 0 1.73-3\" />\n            <path d=\"M12 9v4\" />\n            <path d=\"M12 17h.01\" />\n          </svg>\n        </span>\n\n        <div class=\"grid gap-1.5\">\n          <h1 class=\"text-2xl font-semibold tracking-tight\">Something went wrong</h1>\n          <p class=\"text-muted-foreground text-sm\">\n            We're sorry — the application ran into a problem and couldn't continue.\n          </p>\n        </div>\n      </CardHeader>\n\n      <CardContent class=\"grid gap-5 pb-8\">\n        @if (message) {\n          <div class=\"border-border bg-muted/40 grid gap-1 rounded-lg border p-3 text-left\">\n            <span class=\"text-muted-foreground text-[0.7rem] font-medium uppercase tracking-wider\">\n              Details\n            </span>\n            <p class=\"text-foreground text-sm break-words\" role=\"alert\">{{ message }}</p>\n          </div>\n        }\n\n        <div class=\"flex justify-center\">\n          <button variant=\"primary\" (click)=\"goHome()\">\n            <svg\n              xmlns=\"http://www.w3.org/2000/svg\"\n              class=\"mr-2 h-4 w-4\"\n              viewBox=\"0 0 24 24\"\n              fill=\"none\"\n              stroke=\"currentColor\"\n              stroke-width=\"2\"\n              stroke-linecap=\"round\"\n              stroke-linejoin=\"round\"\n              aria-hidden=\"true\">\n              <path d=\"M15 21v-8a1 1 0 0 0-1-1h-4a1 1 0 0 0-1 1v8\" />\n              <path d=\"M3 10a2 2 0 0 1 .709-1.528l7-5.999a2 2 0 0 1 2.582 0l7 5.999A2 2 0 0 1 21 10v9a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2z\" />\n            </svg>\n            Go to homepage\n          </button>\n        </div>\n      </CardContent>\n    </Card>\n  `\n})\nexport class ErrorComponent {\n  private readonly route = inject(ActivatedRoute);\n  router = inject(Router);\n\n  /**\n   * Human-readable error detail shown on the page, taken from the `message` query param.\n   * Callers navigating here can pass it, e.g. on an auth failure:\n   * `router.navigate([\"error\"], { queryParams: { message: err.message } })`.\n   */\n  readonly message: string | undefined = (() => {\n    const value = this.route.snapshot.queryParams['message'];\n    return typeof value === 'string' && value.trim().length ? value : undefined;\n  })();\n\n  /** Navigate home and re-bootstrap the application (fresh authentication attempt). */\n  goHome() {\n    this.router.navigate(['/']).then(() => window.location.reload());\n  }\n}\n","import { Component, computed, DestroyRef, effect, inject } from '@angular/core';\nimport { ActivatedRoute, Router } from '@angular/router';\nimport { getState } from '@ngrx/signals';\n\nimport { isAuthenticated, login } from '@sinequa/atomic';\n\nimport { ApplicationStore, QueryParamsStore } from '../../stores';\n\n@Component({\n  selector: 'app-wait',\n  standalone: true,\n  imports: [],\n  template: `\n    <div class=\"flex h-dvh w-full items-center justify-center\">\n      <div class=\"flex flex-col items-center space-y-4\">\n        <span class=\"loader\"></span>\n      </div>\n    </div>\n  `,\n  styles: [\n    `\n      .loader {\n        --w: 96px;\n        --h: 96px;\n\n        transform: rotateZ(45deg);\n        perspective: 1000px;\n        border-radius: 50%;\n        width: var(--w);\n        height: var(--h);\n        color: #0040bf; /* Sinequa blue */\n      }\n      .loader:before,\n      .loader:after {\n        content: '';\n        display: block;\n        position: absolute;\n        top: 0;\n        left: 0;\n        width: inherit;\n        height: inherit;\n        border-radius: 50%;\n        transform: rotateX(70deg);\n        animation: 1s spin linear infinite;\n      }\n      .loader:after {\n        color: #ff854a; /* Sinequa orange */\n        transform: rotateY(70deg);\n        animation-delay: 0.4s;\n      }\n\n      @keyframes rotate {\n        0% {\n          transform: translate(-50%, -50%) rotateZ(0deg);\n        }\n        100% {\n          transform: translate(-50%, -50%) rotateZ(360deg);\n        }\n      }\n\n      @keyframes rotateccw {\n        0% {\n          transform: translate(-50%, -50%) rotate(0deg);\n        }\n        100% {\n          transform: translate(-50%, -50%) rotate(-360deg);\n        }\n      }\n\n      @keyframes spin {\n        0%,\n        100% {\n          box-shadow: 0.4em 0px 0 0px currentcolor;\n        }\n        12% {\n          box-shadow: 0.4em 0.4em 0 0 currentcolor;\n        }\n        25% {\n          box-shadow: 0 0.4em 0 0px currentcolor;\n        }\n        37% {\n          box-shadow: -0.4em 0.4em 0 0 currentcolor;\n        }\n        50% {\n          box-shadow: -0.4em 0 0 0 currentcolor;\n        }\n        62% {\n          box-shadow: -0.4em -0.4em 0 0 currentcolor;\n        }\n        75% {\n          box-shadow: 0px -0.4em 0 0 currentcolor;\n        }\n        87% {\n          box-shadow: 0.4em -0.4em 0 0 currentcolor;\n        }\n      }\n    `\n  ]\n})\n/**\n * @deprecated This component and its `/loading` route are no longer used.\n * Authentication is handled at bootstrap by `withBootstrapApp`/`signIn`, and the\n * `AuthGuard` now redirects unauthenticated users to the login page directly.\n * Will be removed in a future major release. Do not use in new code.\n */\nexport class LoadingComponent {\n  protected readonly state = computed(() => getState(this.application));\n\n  private readonly application = inject(ApplicationStore);\n  private readonly queryParamsStore = inject(QueryParamsStore);\n  private readonly route = inject(ActivatedRoute);\n  private readonly router = inject(Router);\n\n  constructor(destroyRef: DestroyRef) {\n    const timeout = setTimeout(() => {\n      this.router.navigate(['/error'], {\n        queryParams: { returnUrl: this.route.snapshot.queryParams['returnUrl'] }\n      });\n    }, 5000);\n\n    destroyRef.onDestroy(() => {\n      // clear the timeout if the component is destroyed\n      clearTimeout(timeout);\n    });\n\n    effect(() => {\n      const { ready } = this.state();\n\n      if (ready) {\n        // clear the timeout if the application is ready\n        clearTimeout(timeout);\n\n        setTimeout(() => {\n          const url = this.route.snapshot.queryParams['returnUrl'] || null;\n          if (!url) {\n            this.router.navigateByUrl(url);\n            // ! we need to set the query params from the url once only\n            this.queryParamsStore.setFromUrl(url);\n          } else {\n            this.router.navigate(['/']);\n          }\n        }, 700);\n      }\n    });\n\n    if (!isAuthenticated()) {\n      this.application.updateReadyState(false);\n      login()\n        .then(() => {\n          this.application.updateReadyState(true);\n        })\n        .catch(err => {\n          console.error('Error during login:', err);\n          this.router.navigate(['/error']);\n        });\n    }\n  }\n}\n","import { Component, computed, input, output } from \"@angular/core\";\n\nimport { Article, getMetadata, KeyOf, LegacyFilter } from \"@sinequa/atomic\";\nimport { BadgeComponent, BadgeVariants } from \"@sinequa/ui\";\n\nimport { SyslangPipe } from \"../../pipes\";\n\n@Component({\n  selector: \"Metadata, metadata\",\n  exportAs: \"metadata\",\n  standalone: true,\n  imports: [SyslangPipe, BadgeComponent],\n  template: `\n    @for (item of items().slice(0, limit()); track $index) {\n      @if (item) {\n        <badge\n          [variant]=\"variant()\"\n          [class]=\"class()\"\n          (click)=\"handleClick($event, { field: this.metadata(), value: item })\">\n          {{ item | syslang }}\n        </badge>\n      }\n    }\n  `,\n  host: {\n    \"[class.hidden]\": \"items().length === 0\"\n  },\n  styles: [\n    `\n      :host {\n        display: contents;\n\n        &,\n        &:hover {\n          background-color: transparent;\n        }\n      }\n    `\n  ]\n})\nexport class MetadataComponent {\n  click = output<{ filter: LegacyFilter; event: Event }>();\n\n  class = input<string>();\n  variant = input<BadgeVariants[\"variant\"]>(\"primary\");\n\n  metadata = input.required<KeyOf<Article> | (string & Record<never, never>)>();\n  article = input.required<Partial<Article> | (string & Record<never, never>)>();\n  limit = input(undefined, {\n    transform: (value: string | number | undefined) => (value ? Math.max(0, Number(value)) : undefined)\n  });\n\n  items = computed(() => getMetadata(this.article(), this.metadata()));\n\n  handleClick(event: Event, item: LegacyFilter) {\n    this.click.emit({ filter: item, event });\n  }\n}\n","import { Component, computed, inject, input } from '@angular/core';\nimport { Router, RouterLink } from '@angular/router';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\nimport { Article } from '@sinequa/atomic';\nimport { QueryParamsStore } from '../../stores';\n\n@Component({\n  selector: 'missing-terms, MissingTerms, missingterms',\n  standalone: true,\n  imports: [TranslocoPipe, RouterLink],\n  templateUrl: './missing-terms.component.html',\n  providers: [provideTranslocoScope('article')],\n  styles: `\n    .term {\n      text-decoration-line: line-through;\n    }\n  `\n})\nexport class MissingTermsComponent {\n  public readonly article = input.required<Article>();\n\n  queryParamsStore = inject(QueryParamsStore);\n  router = inject(Router);\n\n  public missingTerms = computed(() => {\n    const query = this.queryParamsStore.getQuery();\n    return this.article()\n      .termspresence?.filter(tp => tp.presence === 'missing')\n      .map(tp => {\n        const bracketMatch = tp.term.match(/^\\[(.+)\\]$/);\n        const cleanTerm = bracketMatch ? bracketMatch[1] : tp.term;\n        const escapedTerm = cleanTerm.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n        const text = (query.text || '').replace(new RegExp(`\\\\b${escapedTerm}\\\\b`, 'gi'), '').replace(/\\s+/g, ' ').trim();\n        return {\n          value: cleanTerm,\n          queryParams: { q: `${text} +[${cleanTerm}]` }\n        };\n      });\n  });\n}\n","@if ((missingTerms() || []).length > 0) {\n  <span class=\"terms-label\">{{ 'article.missingTerms' | transloco }}</span>\n  <span class=\"terms\">\n    @for (term of missingTerms(); track $index) {\n      <span class=\"term ms-1\">{{ term.value }}</span>\n    }\n  </span>\n  <span class=\"mx-1\">|</span>\n  <span class=\"terms-label ms-1\">{{ 'article.mustInclude' | transloco }}</span>\n  <span class=\"terms\">\n    @for (term of missingTerms(); track $index) {\n      <a role=\"button\" class=\"ms-1\" routerLink=\"search\" [queryParams]=\"term.queryParams\" (click)=\"$event.stopPropagation()\">{{ term.value }}</a>\n    }\n  </span>\n}\n","import { Component, computed, ElementRef, inject, linkedSignal, output, signal, viewChild } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { Article, bisect, error } from \"@sinequa/atomic\";\nimport { ButtonComponent, DialogComponent, DialogContentComponent, DialogFooterComponent, DialogHeaderComponent, DialogInterface, DialogResult, DialogTitleComponent, InputComponent, ListItemComponent, SquareCheckIcon, SquareMinusIcon, SquareIcon } from \"@sinequa/ui\";\n\nimport { Basket } from \"../../../models\";\nimport { QueryParamsStore, UserSettingsStore } from \"../../../stores\";\n\n@Component({\n  selector: \"add-to-collection-dialog\",\n  standalone: true,\n  imports: [\n    FormsModule,\n    TranslocoPipe,\n    ButtonComponent,\n    DialogComponent,\n    DialogHeaderComponent,\n    DialogTitleComponent,\n    DialogContentComponent,\n    DialogFooterComponent,\n    ListItemComponent,\n    InputComponent,\n    SquareCheckIcon,\n    SquareMinusIcon,\n    SquareIcon\n],\n  providers: [provideTranslocoScope(\"collections\")],\n  template: `\n    <dialog #dialog (closed)=\"closeBtn.click()\">\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>{{ 'collections.addToCollection' | transloco }}</DialogTitle>\n        </DialogHeader>\n\n          <ul class=\"flex flex-col\" role=\"list\">\n            @for (collection of collections(); track $index) {\n              <li role=\"listitem\" (click)=\"addToCollection(collection, $index)\">\n                @if (collectionsMap()[collection.name] === 'all') {\n                  <square-check-icon />\n                } @else if (collectionsMap()[collection.name] === 'some') {\n                  <square-minus-icon />\n                } @else {\n                  <square-icon />\n                }\n                {{ collection.name }}\n              </li>\n            } @empty {\n              <li class=\"list-none py-4 text-center text-neutral-500\">\n                {{ 'collections.noCollections' | transloco }}\n              </li>\n            }\n          </ul>\n\n          @if (creating()) {\n            <input\n              #createInput\n              class=\"mt-2\"\n              type=\"text\"\n              autocomplete=\"off\"\n              spellcheck=\"false\"\n              [attr.aria-label]=\"'collections.collectionName' | transloco\"\n              [attr.placeholder]=\"'collections.collectionName' | transloco\"\n              [ngModel]=\"newCollectionName()\"\n              (ngModelChange)=\"newCollectionName.set($event)\"\n              (keydown.escape)=\"$event.preventDefault(); creating.set(false)\"\n              (keydown.enter)=\"createCollection()\" />\n          }\n\n        <DialogFooter class=\"flex flex-col\">\n          <button variant=\"outline\" #closeBtn (click)=\"onClose()\" >\n            {{ 'collections.close' | transloco }}\n          </button>\n          <button\n            [variant]=\"creating() ? 'outline' : undefined\"\n            tabindex=\"0\"\n            [attr.title]=\"(creating() ? 'collections.cancelCreation' : 'collections.createCollection') | transloco\"\n            (click)=\"onCreate()\">\n            {{ (creating() ? 'collections.cancelCreation' : 'collections.createCollection') | transloco }}\n          </button>\n          @if (creating()) {\n            <button\n              tabindex=\"0\"\n              [attr.title]=\"'collections.create' | transloco\"\n              [disabled]=\"!newCollectionName().trim()\"\n              (click)=\"createCollection()\">\n              {{ 'collections.create' | transloco }}\n            </button>\n          }\n        </DialogFooter>\n      </DialogContent>\n    </dialog>\n  `\n})\nexport class CollectionsDialog implements DialogInterface {\n  readonly closed = output<DialogResult>();\n\n  readonly createInputElement = viewChild<ElementRef<HTMLInputElement>>(\"createInput\");\n  readonly dialogElement = viewChild<DialogComponent>(DialogComponent);\n\n  private readonly queryParamStore = inject(QueryParamsStore);\n  private readonly userSettingsStore = inject(UserSettingsStore);\n\n  readonly collection = signal<string | undefined>(undefined);\n\n  readonly article = signal<Article[]>([]);\n  readonly newCollectionName = signal<string>(\"\");\n  readonly creating = signal<boolean>(false);\n  readonly removedFromCollection = signal<boolean>(false);\n  readonly addedToCollection = signal<boolean>(false);\n  readonly collections = computed<Basket[]>(() => this.userSettingsStore.baskets());\n  // Compute map of collection names to their article inclusion status\n  readonly collectionsMap = linkedSignal(() =>\n    this.collections().reduce<Record<string, \"all\" | \"some\" | \"none\">>((acc, collection) => {\n      acc[collection.name] = this.containsArticle(collection);\n      return acc;\n    }, {})\n  );\n\n  open(article: Article | Article[]): void {\n    if (!Array.isArray(article)) this.article.set([article]);\n    else this.article.set(article);\n\n    const { basket } = getState(this.queryParamStore);\n    this.collection.set(basket);\n\n    this.dialogElement()?.showModal();\n  }\n\n  containsArticleByName(collectionName: string): boolean {\n    const collection = this.collections().find((c) => c.name === collectionName);\n    return !!collection && this.containsArticle(collection) !== \"none\";\n  }\n\n  containsArticle(collection: Basket): \"all\" | \"some\" | \"none\" {\n    const b = bisect(this.article(), (a) => !!collection.ids?.includes(a.id));\n\n    if (b.false.length === 0) return \"all\";\n    else if (b.true.length === 0) return \"none\";\n\n    return \"some\";\n  }\n\n  onCreate(): void {\n    if (this.creating()) {\n      this.creating.set(false);\n      return;\n    }\n\n    this.creating.set(true);\n\n    // Focus the input element with a delay because the input element is not yet rendered\n    setTimeout(() => {\n      this.createInputElement()?.nativeElement.focus();\n    }, 1);\n  }\n\n  async onClose() {\n    this.dialogElement()?.close();\n\n    // if we removed the article from the current collection,\n    // we notify it using the \"dialog-no\" event which can\n    // be caught by the app to trigger a refresh\n    if (this.removedFromCollection()) {\n      this.closed.emit(\"dialog-no\");\n    }\n    // same for the addition with the \"dialog-yes\" event\n    if (this.addedToCollection()) {\n      this.closed.emit(\"dialog-yes\");\n    }\n  }\n\n  async addToCollection(collection: Basket, collectionIndex: number): Promise<void> {\n    const ids = this.article()\n      .map((article) => article.id)\n      .filter((id) => !!id);\n\n    if (!ids || ids.length === 0) return;\n\n    if (this.containsArticle(collection) !== \"none\") {\n      // remove it\n      const articleIds = this.article().map((a) => a.id);\n      collection.ids = collection.ids?.filter((id) => !articleIds.includes(id)) ?? [];\n    } else {\n      // add it\n      if (!collection.ids) collection.ids = [];\n\n      const uniqueIds = new Set([...(collection.ids ?? []), ...this.article().map((x) => x.id)]);\n      collection.ids.push(...Array.from(uniqueIds));\n      this.addedToCollection.set(true);\n    }\n\n    try {\n      await this.userSettingsStore.updateBasket(collection, collectionIndex);\n      const currentCollection = this.collection();\n      this.removedFromCollection.set(!!currentCollection && !this.containsArticleByName(currentCollection));\n    } catch (e) {\n      error(\"Error updating collection:\", e);\n    }\n  }\n\n  createCollection(): void {\n    if (!this.newCollectionName().trim()) return;\n\n    const collection: Basket = { name: this.newCollectionName().trim() };\n    this.userSettingsStore.createBasket(collection);\n    this.newCollectionName.set(\"\");\n    this.creating.set(false);\n  }\n}\n","import { HttpClient, HttpResponse } from '@angular/common/http';\nimport { inject, Injectable } from '@angular/core';\nimport { map, Observable } from 'rxjs';\n\nimport { Article, AuditEventType, ExportOutputFormat, ExportQueryModel, ExportSourceType, globalConfig, Query } from '@sinequa/atomic';\n\nexport type ExportQueryOptions = {\n  model: ExportQueryModel;\n  appName: string;\n  query: Query;\n  article?: Article;\n  name?: string;\n  selection?: string[];\n};\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class ExportService {\n  protected readonly API_URL = `${globalConfig.backendUrl}/api/v1`;\n\n  protected readonly http = inject(HttpClient);\n\n  /**\n   * Downloads a file based on the provided options and triggers a browser download.\n   *\n   * @param options - The options for the download operation.\n   * @param options.model - The export query model containing web service, format, max count, and exported columns.\n   * @param options.appName - The name of the application initiating the download.\n   * @param options.query - The query object used for the export operation.\n   * @param options.article - (Optional) The article associated with the export.\n   * @param options.name - (Optional) The custom name for the downloaded file. If not provided, the name is extracted from the response headers.\n   * @param options.selection - (Optional) An array of id of selected items to export.\n   * @returns An observable that emits the HTTP response containing the file blob.\n   *\n   * @remarks\n   * This method handles file downloads for both modern browsers and Internet Explorer.\n   * For modern browsers, it creates a temporary anchor element to trigger the download.\n   * For Internet Explorer, it uses `msSaveOrOpenBlob` to handle the download.\n   *\n   * @example\n   * ```typescript\n   * const options = {\n   *   model: { webService: 'service', format: 'csv', maxCount: 100, exportedColumns: [] },\n   *   appName: 'MyApp',\n   *   query: myQuery,\n   *   name: 'exported-file.csv'\n   * };\n   * exportService.download(options).subscribe(response => {\n   *   console.log('File downloaded successfully');\n   * });\n   * ```\n   */\n  public download(options: ExportQueryOptions): Observable<HttpResponse<Blob>> {\n    const { model, appName, query, article, name, selection } = options;\n    return this.exportResult(appName, model.webservice, query, model.format, article, model.maxcount, model.exportedColumns, selection).pipe(\n      map((response: HttpResponse<Blob>) => {\n        const header = response.headers.get('content-disposition');\n        const fileName = name || (header !== null ? header!.split('filename=')[1].replace('\"', '').replace('\"', '') : '');\n\n        if (response.body === null) return response;\n        const navigator: any = window.navigator;\n        if (navigator && navigator.msSaveOrOpenBlob) {\n          // For IE\n          navigator.msSaveOrOpenBlob(response.body, fileName);\n        } else {\n          const link = document.createElement('a');\n          document.body.appendChild(link);\n          const blobUrl = window.URL.createObjectURL(response.body);\n          link.href = blobUrl;\n          link.download = fileName || `export.csv`;\n          link.click();\n          link.remove();\n          window.URL.revokeObjectURL(blobUrl);\n        }\n\n        return response;\n      })\n    );\n  }\n\n  /**\n   * Exports the current result.\n   *\n   * @param webService The configuration for the export web service.\n   * @param query The query to export.\n   * @param format The export format.\n   * @param maxCount (Optional) The maximum number of exported rows.\n   * @param exportedColumns (Optional) The columns to export, empty means all columns.\n   * @param selection - (Optional) The list of id of selected items to export.\n   *\n   * @remarks If `selection` is provided, the type of export will be set to 'Selection'.\n   */\n  public exportResult(\n    appName: string,\n    webService: string,\n    query: Query,\n    format: ExportOutputFormat,\n    results?: Article,\n    maxCount?: number,\n    exportedColumns?: string[],\n    selection?: string[]\n  ): Observable<HttpResponse<Blob>> {\n    const type: ExportSourceType = selection && selection.length > 0 ? 'Selection' : 'Result';\n\n    const postData = {\n      app: appName,\n      webService,\n      query,\n      type,\n      format: format,\n      maxCount: maxCount ? maxCount.toString() : undefined,\n      exportedColumns: exportedColumns,\n      selection: (selection ?? []).length > 0 ? selection : undefined,\n      $auditRecord: {\n        type: AuditEventType.Search_ExportCSV,\n        detail: {\n          resultid: results ? results.id : undefined\n        }\n      }\n    };\n\n    return this.http.post(this.API_URL + '/query.export', postData, {\n      observe: 'response',\n      responseType: 'blob'\n    });\n  }\n}\n","import { Component, DestroyRef, inject, linkedSignal, model, output, signal, viewChild } from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { CCApp, CCWebService, ExportOutputFormat, ExportQueryModel } from \"@sinequa/atomic\";\nimport {\n  ButtonComponent,\n  cn,\n  DialogComponent,\n  DialogContentComponent,\n  DialogFooterComponent,\n  DialogHeaderComponent,\n  DialogInterface,\n  DialogTitleComponent,\n  SelectOptionDirective,\n  SwitchComponent\n} from \"@sinequa/ui\";\nimport { AppStore, QueryParamsStore } from \"../../../stores\";\nimport { ExportQueryOptions, ExportService } from \"../export.service\";\n\ninterface CCQueryExport extends CCWebService {\n  webServiceType: \"queryexport\";\n  columns?: { column$: CCQueryExportColumnDef[] };\n  linksFilterDuplicateUrls?: boolean;\n  linksGlobalRelevance?: string;\n  linksMaxCount?: number;\n  linksSortByOrder?: boolean;\n  maxCount?: number;\n  separator?: string;\n}\n\ninterface CCQueryExportColumnDef {\n  title: string;\n  pattern: string;\n  selectionQuery?: string;\n}\n\n@Component({\n  selector: \"export-dialog\",\n  standalone: true,\n  imports: [\n    FormsModule,\n    TranslocoPipe,\n    ButtonComponent,\n    DialogComponent,\n    DialogHeaderComponent,\n    DialogTitleComponent,\n    DialogContentComponent,\n    DialogFooterComponent,\n    SwitchComponent,\n    SelectOptionDirective\n  ],\n  providers: [provideTranslocoScope(\"export\")],\n  template: `\n    <dialog #dialog>\n      <DialogContent\n        class=\"[&_section>h1]:text-muted-foreground flex flex-col gap-4 [&_section>h1]:text-sm [&_section>h1]:font-semibold [&_section]:flex [&_section]:flex-col [&_section]:gap-2\">\n        <DialogHeader>\n          <DialogTitle>{{ 'export.title' | transloco }}</DialogTitle>\n        </DialogHeader>\n\n        <section>\n          <h1>{{ 'export.from' | transloco }}</h1>\n          <div class=\"flex items-center gap-2\">\n            <a [class]=\"cn('cursor-pointer', !fromSelection() ? 'text-foreground font-semibold' : 'text-muted-foreground/50')\" (click)=\"fromSelection.set(false)\">\n              {{ 'export.fromQuery' | transloco }}\n            </a>\n            <Switch size=\"xs\" [(toggled)]=\"fromSelection\" />\n            <a  [class]=\"cn('cursor-pointer', fromSelection() ? 'text-foreground font-semibold' : 'text-muted-foreground/50')\" (click)=\"fromSelection.set(true)\">\n              {{ 'export.fromSelection' | transloco }}\n            </a>\n          </div>\n        </section>\n\n        <section>\n          <h1>{{ 'export.outputFormat' | transloco }}</h1>\n          <select\n            class=\"hover:outline-primary focus:outline-primary border-foreground/18 h-8 w-full rounded-md border px-2 hover:outline focus:outline\"\n            id=\"format\"\n            [(ngModel)]=\"format\">\n            @for (format of supportedFormats; track $index) {\n              <option [value]=\"format\">{{ format.toUpperCase() }}</option>\n            }\n          </select>\n        </section>\n\n        <section>\n          <h1>{{ 'export.exportColumns' | transloco }}</h1>\n          <select\n            id=\"exportedColumns\"\n            class=\"hover:outline-primary focus:outline-primary border-foreground/18 w-full rounded-md border px-2 hover:outline focus:outline\"\n            multiple\n            [(ngModel)]=\"columnsToExport\">\n            @for (column of exportableColumns(); track $index) {\n              <option [value]=\"column\">{{ column }}</option>\n            }\n          </select>\n        </section>\n\n        <section>\n          <h1>{{ 'export.maxLines' | transloco }}</h1>\n          <input\n            type=\"number\"\n            id=\"maxCount\"\n            min=\"1\"\n            autocomplete=\"off\"\n            spellcheck=\"off\"\n            class=\"hover:outline-primary focus:outline-primary border-foreground/18 h-8 w-full rounded-md border px-2 hover:outline focus:outline\"\n            [(ngModel)]=\"maxCount\"\n            (input)=\"onMaxCountInput($event)\" />\n        </section>\n\n        <DialogFooter>\n          <button variant=\"outline\" (click)=\"dialog.close()\">\n            {{ 'cancel' | transloco }}\n          </button>\n          <button tabindex=\"0\" [attr.title]=\"'export.download' | transloco\" (click)=\"onDownload()\">\n            {{ 'export.download' | transloco }}\n          </button>\n        </DialogFooter>\n      </DialogContent>\n    </dialog>\n  `\n})\nexport class ExportDialog implements DialogInterface {\n  cn = cn;\n\n  onExport = output<ExportQueryModel>();\n\n  private appStore = inject(AppStore);\n  readonly exportService = inject(ExportService);\n  readonly queryParamsStore = inject(QueryParamsStore);\n\n  readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n  private selection = signal<string[]>([]);\n  readonly fromSelection = linkedSignal(() => this.selection()?.length > 0);\n  public exportableColumns = signal<string[]>([]);\n  public readonly supportedFormats: ExportOutputFormat[] = [\"Csv\", \"Xlsx\", \"Json\"];\n\n  public format = model<ExportOutputFormat>(\"Csv\");\n  public maxCount = model<number | undefined>(undefined);\n  public columnsToExport = model<string[]>([]);\n\n  private destroyRef = inject(DestroyRef);\n\n  open(selection?: string[]): void {\n    const app = getState(this.appStore) as CCApp;\n    const webservice = app.queryExport.toLocaleLowerCase();\n\n    let queryExport: CCQueryExport;\n\n    if (selection && selection.length > 0) this.selection.set(selection);\n\n    if (webservice) {\n      queryExport = app.webServices[webservice] as CCQueryExport;\n\n      if (queryExport) {\n        const columns = queryExport.columns?.column$ || [];\n        this.exportableColumns.set(columns.map((column) => column.title));\n\n        if (queryExport.maxCount && typeof queryExport.maxCount === \"number\") {\n          this.maxCount.set(queryExport.maxCount);\n        }\n      }\n    }\n\n    setTimeout(() => {\n      this.dialog()?.showModal();\n    });\n  }\n\n  onDownload() {\n    const app = getState(this.appStore) as CCApp;\n    const webservice = app.queryExport;\n\n    const maxcount = this.maxCount() || 0;\n\n    const model: ExportQueryModel = {\n      format: this.format(),\n      export: \"Result\",\n      maxcount: maxcount > 0 ? maxcount : undefined,\n      exportedColumns: this.columnsToExport().length ? this.columnsToExport() : undefined,\n      webservice: webservice\n    };\n\n    const { name } = getState(this.appStore) as CCApp;\n    const query = this.queryParamsStore.getQuery();\n    if (!query.name) {\n      query.name = this.appStore.getDefaultQuery()?.name || \"\";\n    }\n    const selection = this.selection();\n    const payload = { model, appName: name, query } as ExportQueryOptions;\n\n    if (this.fromSelection()) payload.selection = selection;\n\n    this.exportService.download(payload).pipe(takeUntilDestroyed(this.destroyRef)).subscribe();\n\n    this.dialog()?.close();\n  }\n\n  onMaxCountInput(event: Event) {\n    const input = event.target as HTMLInputElement;\n    if (input.valueAsNumber < 1) {\n      input.value = \"1\";\n      this.maxCount.set(1);\n    }\n  }\n}\n","import { Component, computed, inject, input, output } from \"@angular/core\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { CCApp } from \"@sinequa/atomic\";\nimport { cn, DialogService, FileOutputIcon, XMarkIcon, InboxIcon, SparklesIcon } from \"@sinequa/ui\";\nimport { cva, type VariantProps } from \"class-variance-authority\";\nimport { CollectionsDialog } from \"../../features/collections/dialogs/add.dialog\";\nimport { ExportDialog } from \"../../features/export/dialogs/export.dialog\";\nimport { AppStore, SelectionStore } from \"../../stores\";\n\nconst multiSelectionToolbarVariants = cva(\n  \"flex divide-x rounded-xl bg-linear-to-b px-3 py-2 shadow [&>li]:px-2 [&_ul]:flex [&_ul]:flex-col [&_ul]:p-1\",\n  {\n    variants: {\n      variant: {\n        dark: \"from-gray-500 to-gray-900 divide-gray-800 text-white\",\n        light: \"from-white to-purple-50 divide-gray-400 text-gray-800\",\n        glassy: \"from-transparent to-white divide-gray-300 text-gray-800 backdrop-blur-[15px]\"\n      }\n    },\n    defaultVariants: {\n      variant: \"dark\"\n    }\n  }\n);\nexport type MultiSelectionToolbarVariants = VariantProps<typeof multiSelectionToolbarVariants>;\n\n@Component({\n  selector: \"MultiSelectionToolbar, multi-selection-toolbar\",\n  imports: [TranslocoPipe, XMarkIcon, InboxIcon, SparklesIcon, FileOutputIcon],\n  providers: [provideTranslocoScope(\"multi-selection-toolbar\", \"article\", \"collections\", \"export\")],\n  template: `\n    <menu id=\"multi-select-toolbar\" [class]=\"cn(variants(), class())\">\n      <li class=\"ps-0!\">\n        <button class=\"cursor-pointer inline-flex items-center gap-1\" (click)=\"clearSelection()\">\n          {{ 'multiSelectionToolbar.itemsSelected' | transloco: { count: count() } }}\n          <x-mark-icon />\n        </button>\n      </li>\n\n      <li>\n        <button class=\"cursor-pointer inline-flex items-center gap-1\" title=\"menu\" [attr.aria-label]=\"'menu'\" (click)=\"openCollectionDialog()\">\n          <inbox-icon />\n          {{ 'collections.label' | transloco }}\n        </button>\n      </li>\n\n      <li>\n        <button class=\"cursor-pointer inline-flex items-center gap-1\" (click)=\"openExportDialog()\">\n          <file-output-icon />\n          {{ 'export.title' | transloco }}\n        </button>\n      </li>\n\n      @if (enabledUserInput()) {\n        <li class=\"pe-0!\">\n          <button class=\"cursor-pointer inline-flex items-center gap-1\" (click)=\"attachToAssistant()\">\n            <sparkles-icon />\n            {{ 'article.addToAIOverview' | transloco }}\n          </button>\n        </li>\n      }\n    </menu>\n  `,\n  host: {\n    class:\n      \"fixed -bottom-20 left-[50%] translate-x-[-50%] z-50 transition-[translate,opacity,discrete] duration-300 opacity-0\",\n    \"[class.opacity-100]\": \"count() > 0\",\n    \"[class.-translate-y-24]\": \"count() > 0\"\n  }\n})\nexport class MultiSelectionToolbarComponent {\n  cn = cn;\n\n  readonly appStore = inject(AppStore);\n  readonly selection = inject(SelectionStore);\n  readonly dialog = inject(DialogService);\n  readonly appFeatures = this.appStore.general();\n  readonly class = input<string>(\"\");\n  readonly variant = input<MultiSelectionToolbarVariants[\"variant\"]>(\"dark\");\n\n  readonly updatedCollections = output<void>();\n\n  readonly count = this.selection.multiSelectCount;\n  readonly variants = computed(() =>\n    cn(multiSelectionToolbarVariants({ variant: this.variant(), class: this.class() }))\n  );\n  readonly ids = computed(() => getState(this.selection).multiSelection.map((x) => x.id));\n  readonly instanceId = computed(() => {\n    // use destructuring with default values to avoid errors if appFeatures or features is undefined\n    // by default, the instanceId is 'search-results-assistant',\n    // unless appFeatures.features.assistant.usePrefixName is true\n    const { assistant: { usePrefixName = false } = {} } = this.appFeatures?.features || {};\n    if (usePrefixName) {\n      const { name } = getState(this.appStore) as CCApp;\n      return `${name}-search-results-assistant`;\n    }\n    return `search-results-assistant`;\n  });\n  readonly enabledUserInput = computed(\n    () => this.appStore.assistants()[this.instanceId()]?.modeSettings.enabledUserInput === true\n  );\n\n  clearSelection = () => this.selection.clearMultiSelection();\n  openCollectionDialog = () =>\n    this.dialog.open(CollectionsDialog, getState(this.selection).multiSelection).then((event: unknown) => {\n      if (event === \"dialog-no\" || event === \"dialog-yes\") {\n        this.updatedCollections.emit();\n\n        if (event === \"dialog-no\") {\n          this.clearSelection();\n        }\n      }\n    });\n  openExportDialog = () => this.dialog.open(ExportDialog, this.ids());\n  attachToAssistant = () => this.selection.update({ assistantIdsToAttach: this.ids() });\n}\n","import { computed, inject, Signal } from \"@angular/core\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { ApplicationService, QueryService } from \"../../services\";\nimport { QueryParamsStore } from \"../../stores\";\n\nexport interface NavRouteTab {\n  display: string;\n  wsQueryTab: string;\n  path: string;\n  icon: string;\n  routerLink: string;\n  queryName?: string;\n  count?: number;\n}\n\ninterface SearchRouteData {\n  display?: string;\n  wsQueryTab?: string;\n  icon?: string;\n  queryName?: string;\n}\n\nexport function injectRouteNavigation(path: Signal<string>, showCount: Signal<boolean>) {\n  const router = inject(Router);\n  const route = inject(ActivatedRoute);\n  const queryParamsStore = inject(QueryParamsStore);\n  const queryService = inject(QueryService);\n  const routerConfig = inject(ApplicationService).routerConfig;\n\n  const searchText = computed(() => getState(queryParamsStore).text || \"\");\n\n  const currentPath = computed(() => {\n    const { tab: currentTab } = getState(queryParamsStore);\n    let current = route.snapshot;\n    while (current.firstChild) current = current.firstChild;\n    const childPath = current.url.map((s) => s.path).join(\"/\");\n    return childPath || currentTab || \"all\";\n  });\n\n  const tabs = computed(() => {\n    const result = queryService.result();\n    const config = routerConfig() ?? router.config;\n    return (\n      config\n        .find((item) => item.path === path())\n        ?.children?.filter((c) => c.path !== \"**\" && !c.redirectTo)\n        .map((child) => {\n          const data = child.data as SearchRouteData | undefined;\n          return {\n            display: data?.display || child.path || \"\",\n            wsQueryTab: data?.wsQueryTab || child.path || \"\",\n            path: child.path || \"\",\n            routerLink: `/${path()}/${child.path}`,\n            icon: data?.icon || \"\",\n            queryName: data?.queryName,\n            count: showCount()\n              ? result.queryName === data?.queryName\n                ? result.tabs?.find((t) => t.name === (data?.wsQueryTab || child.path))?.count\n                : undefined\n              : undefined\n          } as NavRouteTab;\n        }) ?? []\n    );\n  });\n\n  return { tabs, currentPath, searchText };\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\n/**\n * Directive to mark a child element for special processing.\n * This can be used to apply specific styles or behaviors to child elements.\n * Specifically, it can be used to mark elements that should be treated as children in a parent component.\n * Very useful for components that need to render child templates dynamically with `@for loop`.\n *\n * Example usage:\n * ```html\n * <sponsored-links>\n *   <span *childMarker>Child Element</span>\n * </sponsored-links>\n * ```\n * This will allow the parent component to recognize the `<span>` as a child element and apply any specific logic or styles defined in the parent component.\n */\n@Directive({\n  selector: '[childMarker]'\n})\nexport class ChildMarkerDirective {\n  public template = inject(TemplateRef<unknown>);\n}\n","import { DestroyRef, EventEmitter, Injectable, inject, signal, Type } from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { Article } from \"@sinequa/atomic\";\n\nimport { BackdropService } from \"../../components\";\nimport { NavigationService, SelectionHistoryService, SelectionService } from \"../../services\";\nimport { SelectionStore } from \"../../stores\";\n\n/**\n * Service to manage the state and behavior of a stack of drawers in the application.\n * It provides methods to open, close, and manage drawers, as well as to handle\n * interactions with a chat assistant drawer.\n *\n * @deprecated we do not use it anymore.\n */\n@Injectable({\n  providedIn: \"root\"\n})\nexport class DrawerStackService {\n  public readonly isOpened = signal(false);\n  public readonly toggleTopDrawerExtension$ = new EventEmitter<void>();\n  public readonly forceTopDrawerCollapse$ = new EventEmitter<void>();\n  public readonly closeTopDrawer$ = new EventEmitter<void>();\n  public readonly closeAllDrawers$ = new EventEmitter<void>();\n\n  public readonly isChatOpened = signal(false);\n  public readonly openChatDrawer$ = new EventEmitter<void>();\n  public readonly closeChatDrawer$ = new EventEmitter<void>();\n  public readonly askAI$ = new EventEmitter<string>();\n\n  private readonly selection = inject(SelectionService);\n  private readonly selectionHistory = inject(SelectionHistoryService);\n  private readonly selectionStore = inject(SelectionStore);\n  private readonly navigationService = inject(NavigationService);\n  private readonly backdropService = inject(BackdropService);\n\n  private readonly destroyRef = inject(DestroyRef);\n\n  public componentType?: Type<any>;\n\n  constructor() {\n    // on new search, close all drawers including chat drawer\n    this.navigationService.navigationEnd$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe(() => {\n      this.closeAssistant();\n      this.closeAll();\n    });\n  }\n\n  /**\n   * Sets current drawer stack status to open\n   */\n  public open(componentType?: Type<any>): void {\n    this.componentType = componentType;\n    this.isOpened.set(true);\n  }\n\n  /**\n   * Emits event to extend the top drawer\n   */\n  public extend(): void {\n    this.toggleTopDrawerExtension$.next();\n  }\n\n  /**\n   * Emits event to close the top drawer, checks if history is empty, if so,\n   * sets current drawer stack status to closed and clears history and current\n   * selection\n   */\n  public close(): void {\n    this.closeTopDrawer$.next();\n\n    if (this.selectionHistory.getCurrentSelectionIndex() === -1) {\n      this.isOpened.set(false);\n      this.selectionHistory.clearHistory();\n    }\n  }\n\n  /**\n   * Emits event to close the top drawer\n   */\n  public closeTop(): void {\n    this.closeTopDrawer$.next();\n  }\n\n  /**\n   * Sets current drawer stack status to closed, clears history and emits event\n   * to close all drawers\n   *\n   * @param keepDrawerOpen if true, do not trigger layout animation\n   */\n  public closeAll(keepDrawerOpen: boolean = false): void {\n    if (!keepDrawerOpen) this.isOpened.set(false);\n\n    this.selectionHistory.clearHistory();\n\n    this.closeAllDrawers$.next();\n  }\n\n  /**\n   * Replace the current selection with the given article by closing all\n   * drawers and opening the drawer with the new selection without triggering\n   * layout animation\n   *\n   * @param article the article to replace the current selection with\n   */\n  public replace(article: Article | undefined, withQueryText?: boolean): void {\n    const { id } = getState(this.selectionStore);\n\n    if (id && (!article || article.id === id)) return;\n\n    // close everything without trigger layout animation\n    this.closeAll(true);\n\n    // set selection\n    this.selection.setCurrentArticle(article, withQueryText);\n    // open drawer\n    this.open();\n  }\n\n  /**\n   * Stack the given article by setting the current selection and opening the\n   * drawer\n   *\n   * @param article the article to stack\n   */\n  public stack(article: Article | undefined, withQueryText?: boolean): void {\n    const { id } = getState(this.selectionStore);\n\n    if (id && (!article || article.id === id)) return;\n\n    // force top drawer to collapse\n    this.forceTopDrawerCollapse$.next();\n    // set selection\n    this.selection.setCurrentArticle(article, withQueryText);\n    // open drawer\n    this.open();\n  }\n\n  public toggleAssistant(): void {\n    if (this.isChatOpened()) {\n      this.backdropService.hide();\n      this.closeAssistant();\n    } else {\n      this.backdropService.show();\n      this.openAssistant();\n    }\n  }\n\n  public openAssistant(): void {\n    this.isChatOpened.set(true);\n    this.isOpened.set(true);\n    this.openChatDrawer$.next();\n\n    this.backdropService.show();\n  }\n\n  public closeAssistant(keepDrawerOpen: boolean = false): void {\n    this.isChatOpened.set(false);\n\n    if (!keepDrawerOpen && this.selectionHistory.getCurrentSelectionIndex() === -1) {\n      this.isOpened.set(false);\n      this.closeAllDrawers$.next();\n    }\n\n    this.closeChatDrawer$.next();\n    this.backdropService.hide();\n  }\n\n  public askAI(text: string): void {\n    this.openAssistant();\n    this.askAI$.next(text);\n  }\n}\n","import { Directive, HostListener, inject, input, output } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { Article, isNotInputEvent } from \"@sinequa/atomic\";\nimport { DrawerStackService } from \"../../features/drawer-stack/drawer-stack.service\";\nimport { SelectionStrategy } from \"../selection-strategy\";\n\n/**\n * Directive that selects an article on click.\n * Used to handle click and enter key events to select an article based on the specified strategy.\n *\n * @remarks\n * This directive uses the DrawerStackService to manage article selection.\n * Drawer/DrawerStack/DrawerStackService are deprecated and will be removed in future versions.\n *\n * @remarks\n * This directive is deprecated.\n *\n *\n * @deprecated Use the `SelectArticleDirective` instead.\n */\n@Directive({\n  selector: \"[selectArticleOnClick]\",\n  standalone: true,\n  host: {\n    \"(keydown.enter)\": \"onEnter($event)\"\n  }\n})\nexport class SelectArticleOnClickDirective {\n  private readonly drawerStack = inject(DrawerStackService);\n  private readonly router = inject(Router);\n\n  public readonly article = input.required<Partial<Article> | undefined>();\n  public readonly strategy = input<SelectionStrategy>(\"stack\");\n  public readonly redirectUrl = input<string>(\"/preview\");\n\n  public readonly selected = output();\n\n  public onEnter(e: Event): void {\n    if (e && isNotInputEvent(e as KeyboardEvent)) {\n      this.onClick();\n    }\n  }\n\n  @HostListener(\"click\")\n  public onClick(): void {\n    if (!this.article()) return;\n\n    switch (this.strategy()) {\n      case \"replace\":\n        this.drawerStack.replace(this.article() as Article);\n        break;\n      case \"redirect\":\n        if (this.article()?.id) {\n          this.router.navigate([this.redirectUrl(), this.article()!.id]);\n        } else {\n          this.drawerStack.stack(this.article() as Article);\n        }\n        break;\n      case \"emit\":\n        this.selected.emit();\n        break;\n      default:\n        this.drawerStack.stack(this.article() as Article);\n        break;\n    }\n  }\n}\n","import { computed, Directive, effect, HostListener, inject, input, output, signal } from \"@angular/core\";\nimport { Article } from \"@sinequa/atomic\";\n\nimport { UserSettingsStore } from \"../../stores/user-settings/user-settings.store\";\n\n/**\n * Directive that handles the behavior of showing a bookmark for an article.\n *\n * @remarks\n * This directive listens to mouse enter and mouse leave events to determine when to show the bookmark.\n * It also checks the user's settings to determine if the article is bookmarked.\n *\n * @example\n * ```html\n * <div showBookmark [article]=\"currentArticle\" (showBookmark)=\"onShowBookmark($event)\"></div>\n * ```\n *\n * @deprecated The `BookmarkButtonComponent` use a css class for showing bookmarks.\n */\n@Directive({\n  selector: \"[showBookmark]\",\n  standalone: true\n})\nexport class ShowBookmarkDirective {\n  @HostListener(\"mouseenter\")\n  public mouseEnter(): void {\n    this.bookmarkHovered.set(true);\n  }\n\n  @HostListener(\"mouseleave\")\n  public mouseLeave(): void {\n    this.bookmarkHovered.set(false);\n  }\n\n  protected bookmarkHovered = signal(false);\n  userSettingsStore = inject(UserSettingsStore);\n\n  protected isBookmarked = computed(() => {\n    if (!this.article()) return false;\n    return this.userSettingsStore.isBookmarked(this.article()!);\n  });\n\n  public readonly article = input.required<Article | Partial<Article> | undefined>();\n  public readonly showBookmark = output<boolean>();\n\n  constructor() {\n    effect(() => {\n      const bookmarkHovered = this.bookmarkHovered();\n      const isBookmarked = this.isBookmarked();\n      this.showBookmark.emit(bookmarkHovered || isBookmarked);\n    });\n  }\n}\n","import { afterNextRender, Directive, ElementRef, input, OnDestroy, output } from \"@angular/core\";\n\n/**\n * Represents a directive that enables infinite scrolling behavior.\n * This directive listens for the intersection of the element with the viewport\n * and emits a `loadMore` event when the element becomes visible.\n *\n * @remarks\n * This directive requires the `IntersectionObserver` API to be available in the browser.\n *\n * @example\n * ```html\n * <div infinityScroll (onScroll)=\"loadMore()\">\n *   <!-- Content to be scrolled -->\n * </div>\n * ```\n *\n */\n@Directive({\n  // eslint-disable-next-line @angular-eslint/directive-selector\n  selector: \"[infinity-scroll]\",\n  standalone: true\n})\nexport class InfinityScrollDirective implements OnDestroy {\n  options = input<IntersectionObserverInit>({ root: null }, { alias: \"scroll-options\" });\n  onScroll = output();\n\n  private observer = new IntersectionObserver(([entry]) => {\n    if (entry.isIntersecting) {\n      this.onScroll.emit();\n    }\n  }, this.options());\n\n  constructor(private el: ElementRef) {\n    afterNextRender(() => {\n      this.observer.observe(this.el.nativeElement);\n    });\n  }\n\n  ngOnDestroy() {\n    this.observer.disconnect();\n  }\n}\n","import { afterNextRender, computed, Directive, effect, inject, input, OnDestroy, output, Renderer2, signal, untracked } from '@angular/core';\n\nexport type KeyboardNavigationOnSelectionHandlers = {\n  hideListbox?: boolean;\n  resetSelection?: boolean;\n};\n\nexport type KeyboardNavigatorOptions = {\n  name?: string; // Used for debugging or identification\n  optionSelector: string;\n  direction?: 'horizontal' | 'vertical' | 'both';\n  selectOnFocus?: boolean;\n  resetSelectionOnBlur?: boolean;\n  onSelectionHandlers?: KeyboardNavigationOnSelectionHandlers;\n};\n\nconst defaultNavigatorOptions: KeyboardNavigatorOptions = {\n  name: 'defaultNavigator',\n  optionSelector: '[role=\"option\"]:not([aria-disabled=\"true\"])',\n  direction: 'vertical',\n  selectOnFocus: false,\n  resetSelectionOnBlur: false,\n  onSelectionHandlers: {\n    hideListbox: true,\n    resetSelection: true\n  }\n};\n\n@Directive({\n  selector: 'input[role=\"combobox\"]',\n  standalone: true,\n  host: {\n    '(focus)': 'focus()',\n    '(blur)': 'blur()',\n    '(keydown.arrowup)': 'up()',\n    '(keydown.arrowdown)': 'down()',\n    '(keydown.arrowleft)': 'left()',\n    '(keydown.arrowright)': 'right()',\n    '(keydown.home)': 'home()',\n    '(keydown.end)': 'end()',\n    '(keydown.pageup)': 'pageUp()',\n    '(keydown.pagedown)': 'pageDown()',\n    '(keydown.enter)': 'enter()',\n    '(keydown.escape)': 'escape()',\n    '[attr.aria-expanded]': 'ariaExpanded()',\n    '[attr.aria-activedescendant]': 'activeDescendant()'\n  }\n})\nexport class KeyboardNavigatorDirective implements OnDestroy {\n  readonly keyboardNavigator = input(defaultNavigatorOptions, { transform: this.normalizeOptions });\n  readonly listboxId = input<string>('', { alias: 'aria-controls' });\n\n  readonly onFocus = output<void>();\n  readonly onBlur = output<void>();\n  readonly onSelected = output<HTMLElement | null>();\n\n  readonly ariaExpanded = signal<boolean>(false);\n  readonly activeDescendant = signal<string | undefined>(undefined);\n\n  private readonly renderer = inject(Renderer2);\n\n  private readonly listboxElement = signal<HTMLElement | null>(null);\n  private readonly items = signal<HTMLElement[] | null>(null);\n  private readonly hasItems = computed(() => this.items() && this.items()!.length > 0);\n  private readonly currentIndex = signal<number>(-1);\n  private readonly previousIndex = signal<number>(-1);\n\n  private readonly unlisteners: (() => void)[] = [];\n  private readonly mutationObserver = new MutationObserver(() => this.setItems());\n\n  constructor() {\n    // Try to attach the listbox element after the first render\n    afterNextRender(() => this.attachListboxElement());\n\n    // Re-attach the listbox element whenever the listboxId changes\n    effect(() => {\n      this.listboxId();\n      untracked(() => this.attachListboxElement());\n    });\n  }\n\n  ngOnDestroy(): void {\n    this.mutationObserver.disconnect();\n    this.cleanupListeners();\n  }\n\n  /** Attaches the listbox element based on the `listboxId`. */\n  private attachListboxElement(): void {\n    if (!this.listboxId()) return;\n\n    this.setListboxElement();\n\n    if (!this.listboxElement()) return;\n\n    this.setItems();\n\n    this.mutationObserver.observe(this.listboxElement()!, { childList: true });\n  }\n\n  /**\n   * Merges given option with default options.\n   * @param {KeyboardNavigatorOptions} options - Options to merge with defaults.\n   * @returns {KeyboardNavigatorOptions} Merged options.\n   */\n  normalizeOptions(options: KeyboardNavigatorOptions): KeyboardNavigatorOptions {\n    return Object.assign({}, defaultNavigatorOptions, options);\n  }\n\n  //#region DOM Events\n\n  /** Focuses the listbox and selects the first item if configured to do so. */\n  focus(): void {\n    this.showListbox();\n\n    if (this.keyboardNavigator()?.selectOnFocus && this.hasItems() && this.currentIndex() === -1) {\n      this.currentIndex.set(0);\n      this.updateActiveItem();\n    }\n\n    this.onFocus.emit();\n  }\n\n  /** Blurs the listbox, hiding it and resetting selection if configured to do so. */\n  blur(): void {\n    this.hideListbox();\n\n    if (this.keyboardNavigator()?.resetSelectionOnBlur) this.resetSelection();\n\n    this.onBlur.emit();\n  }\n\n  /**\n   * Moves selection to previous element in vertical and both navigation directions.\n   * Does nothing if navigation direction is set to horizontal.\n   */\n  up(): void {\n    if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n    this.moveSelection(-1);\n  }\n\n  /**\n   * Moves selection to next element in vertical and both navigation directions.\n   * Does nothing if navigation direction is set to horizontal.\n   */\n  down(): void {\n    if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n    this.moveSelection(1);\n  }\n\n  /**\n   * Moves selection to first element in vertical and both navigation directions.\n   * Does nothing if navigation direction is set to horizontal.\n   */\n  pageUp(): void {\n    if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n    this.moveSelection(-1, true);\n  }\n\n  /**\n   * Moves selection to last element in vertical and both navigation directions.\n   * Does nothing if navigation direction is set to horizontal.\n   */\n  pageDown(): void {\n    if (this.keyboardNavigator()?.direction === 'horizontal') return;\n\n    this.moveSelection(1, true);\n  }\n\n  /**\n   * Moves selection to previous element in horizontal and both navigation directions.\n   * Does nothing if navigation direction is set to vertical.\n   */\n  left(): void {\n    if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n    this.moveSelection(-1);\n  }\n\n  /**\n   * Moves selection to next element in horizontal and both navigation directions.\n   * Does nothing if navigation direction is set to vertical.\n   */\n  right(): void {\n    if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n    this.moveSelection(1);\n  }\n\n  /**\n   * Moves selection to first element in horizontal and both navigation directions.\n   * Does nothing if navigation direction is set to vertical.\n   */\n  home(): void {\n    if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n    this.moveSelection(-1, true);\n  }\n\n  /**\n   * Moves selection to last element in horizontal and both navigation directions.\n   * Does nothing if navigation direction is set to vertical.\n   */\n  end(): void {\n    if (this.keyboardNavigator()?.direction === 'vertical') return;\n\n    this.moveSelection(1, true);\n  }\n\n  /**\n   * Selects the currently focused item and emits it.\n   * Hides the listbox and resets selection if configured to do so.\n   */\n  enter(): void {\n    const element = this.items()?.[this.currentIndex()];\n\n    this.onSelected.emit(element ?? null);\n\n    if (this.keyboardNavigator()?.onSelectionHandlers?.hideListbox) this.hideListbox();\n    if (this.keyboardNavigator()?.onSelectionHandlers?.resetSelection) this.resetSelection();\n  }\n\n  /** Does nothing. */\n  escape(): void {}\n\n  //#endregion DOM Events\n\n  /**\n   * Sets the listbox element based on the provided `listboxId`, expected to\n   * be set via the `aria-controls` attribute. If the element is not found,\n   * logs an error.\n   */\n  private setListboxElement(): void {\n    const target = document.getElementById(this.listboxId());\n\n    if (!target) {\n      console.error(`NavigatorDirective: target element with id ${this.listboxId()} not found`);\n      return;\n    }\n\n    this.listboxElement.set(target);\n  }\n\n  /**\n   * Sets the items in the listbox by querying for elements matching the `optionSelector`.\n   * Cleans up previous listeners and hooks new ones to handle item clicks.\n   * Resets the selection state.\n   */\n  private setItems(): void {\n    if (!this.listboxElement()) {\n      console.error('NavigatorDirective: listbox element is not set');\n      return;\n    }\n\n    this.cleanupListeners();\n\n    const items = Array.from(this.listboxElement()!.querySelectorAll(this.keyboardNavigator()!.optionSelector)) as HTMLElement[];\n    this.items.set(items);\n\n    this.hookItemsClicks();\n    this.resetSelection();\n  }\n\n  /** Cleans up all event listeners that were added to the items. */\n  private cleanupListeners(): void {\n    this.unlisteners.forEach(unlisten => unlisten());\n    this.unlisteners.length = 0;\n  }\n\n  //#region Selection\n\n  /** Resets the selection state. */\n  public resetSelection(): void {\n    this.currentIndex.set(-1);\n    this.previousIndex.set(-1);\n    this.activeDescendant.set(undefined);\n    this.items()?.forEach(item => this.renderer.setAttribute(item, 'aria-selected', 'false'));\n  }\n\n  /**\n   * Hooks click events on each item in the listbox, and registers a entry into\n   * `unlisteners` for future cleanup.\n   * `mousedown` event is used to ensure the click is registered before any blur events.\n   */\n  private hookItemsClicks(): void {\n    if (!this.hasItems()) return;\n\n    this.items()!.forEach((item, index) => this.unlisteners.push(this.renderer.listen(item, 'mousedown', () => this.itemClicked(item, index))));\n  }\n\n  /**\n   * Handles item click events, updates the current index, emits the selected item,\n   * and hides the listbox if configured to do so.\n   * @param {HTMLElement} element - The clicked item element.\n   * @param {number} index - The index of the clicked item.\n   */\n  private itemClicked(element: HTMLElement, index: number): void {\n    this.previousIndex.set(this.currentIndex());\n    this.currentIndex.set(index);\n\n    this.updateActiveItem();\n\n    this.onSelected.emit(element);\n\n    if (this.keyboardNavigator()?.onSelectionHandlers?.hideListbox) this.hideListbox();\n    if (this.keyboardNavigator()?.onSelectionHandlers?.resetSelection) this.resetSelection();\n  }\n\n  /**\n   * Moves the selection in the specified direction.\n   * If `extreme` is true, it moves to the first or last item based on the direction.\n   * If `extreme` is false, it wraps around the list.\n   * @param {number} direction - The direction to move the selection: -1 for previous, 1 for next.\n   * @param {boolean} extreme - Whether to move to the first or last item instead of wrapping around.\n   *                            Defaults to false.\n   */\n  private moveSelection(direction: number, extreme: boolean = false): void {\n    if (!this.hasItems()) return;\n\n    let index = this.currentIndex() + direction;\n\n    // if extreme is true, we seek the first or last item\n    if (extreme) {\n      if (direction < 0) index = 0;\n      else index = this.items()!.length - 1;\n    } else {\n      if (index < 0) index = this.items()!.length - 1;\n      else if (index >= this.items()!.length) index = 0;\n    }\n\n    this.previousIndex.set(this.currentIndex());\n    this.currentIndex.set(index);\n\n    this.updateActiveItem();\n  }\n\n  /**\n   * Updates the active item in the listbox.\n   * If there was a previously active item, it sets its `aria-selected`\n   * attribute to `false`. Sets the `aria-selected` attribute on the currently\n   * active item, and scrolls it into view.\n   */\n  private updateActiveItem(): void {\n    if (!this.hasItems()) return;\n\n    const previousItem = this.items()?.[this.previousIndex()];\n\n    if (previousItem) this.renderer.setAttribute(previousItem, 'aria-selected', 'false');\n\n    const currentItem = this.items()?.[this.currentIndex()];\n\n    if (currentItem) {\n      this.renderer.setAttribute(currentItem, 'aria-selected', 'true');\n\n      currentItem.scrollIntoView({ block: 'nearest' });\n    }\n  }\n\n  //#endregion Selection\n\n  //#region Visibility\n\n  /**\n   * Shows the listbox by setting `aria-hidden` to `false` and updating the\n   * `aria-expanded` state.\n   */\n  private showListbox(): void {\n    this.renderer.setAttribute(this.listboxElement()!, 'aria-hidden', 'false');\n\n    this.ariaExpanded.set(true);\n  }\n\n  /**\n   * Hides the listbox by setting `aria-hidden` to `true` and updating the\n   * `aria-expanded` state.\n   */\n  private hideListbox(): void {\n    this.renderer.setAttribute(this.listboxElement()!, 'aria-hidden', 'true');\n\n    this.ariaExpanded.set(false);\n  }\n\n  //#endregion Visibility\n}\n","import { Directive, HostListener, inject, input } from '@angular/core';\n\nimport { Article } from '@sinequa/atomic';\nimport { PreviewService } from '../services/preview.service';\n\n/**\n * Directive that opens an article on ctrl + enter.\n */\n@Directive({\n  selector: '[appOpenArticleOnCtrlEnter],[openArticleOnCtrlEnter]',\n  standalone: true\n})\nexport class OpenArticleOnCtrlEnterDirective {\n  private readonly previewService = inject(PreviewService);\n\n  public readonly article = input.required<Article | undefined>();\n\n  @HostListener('keydown.control.Enter')\n  public onCtrlEnter(): void {\n    if (!this.article()) return;\n    this.previewService.openExternal(this.article()!);\n  }\n}\n","import {\n  afterNextRender,\n  booleanAttribute,\n  contentChild,\n  contentChildren,\n  DestroyRef,\n  Directive,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  OutputRefSubscription,\n  output\n} from \"@angular/core\";\n\n/**\n * Directive to be used on elements that should be counted as items in the\n * overflow manager.\n */\n@Directive({\n  selector: \"[overflowItem]\",\n  standalone: true\n})\nexport class OverflowItemDirective {}\n\n/**\n * Directive to be used on the \"more\" trigger element. The overflow manager\n * reserves this element's size when not all items fit, so the last visible\n * item never overlaps it. Its position is not used for measurement.\n */\n@Directive({\n  selector: \"[overflowStop]\",\n  standalone: true\n})\nexport class OverflowStopDirective {}\n\n/**\n * Directive that counts how many items fit inside the container and hides the\n * overflowing ones. The boundary is the container's own content edge, which\n * keeps the measurement correct even when the host lives inside a flex layout\n * (we never depend on a sibling's position). The stop element is used only to\n * reserve space for the \"more\" trigger when not all items fit.\n *\n * The directive applies `display: none` on the items that do not fit.\n *\n * You can specify a target element to observe for resize events, otherwise the\n * directive will observe the element itself.\n *\n * This directive cannot be used on `hostDirectives` as it needs access to the\n * DOM elements. To use is as a host directive, wrap it in a `ng-container` and\n * define a target.\n *\n * @input target - The target element to observe for resize events.\n * @input margin - Margin to add for calculating the overflow.\n *\n * @output count - The number of items that can fit before the stop element,\n * count is debounced to avoid multiple updates.\n *\n * @example\n * ```typescript\n * <ng-container\n *   overflowManager\n *   class=\"flex gap-2 overflow-hidden\"\n *   [target]=\"el.nativeElement\"\n *   (count)=\"updateCount($event)\"\n * >\n *   <ul>\n *     \\@for (let item of [1, 2, 3, 4, 5]) {\n *       <li overflowItem>{{ item }}</li>\n *     }\n *   </ul>\n *\n *   <div overflowStop class=\"absolute right-0\"></div>\n * </ng-container>\n * ```\n */\n@Directive({\n  selector: \"[overflowManager]\",\n  standalone: true\n})\nexport class OverflowManagerDirective {\n  readonly items = contentChildren(OverflowItemDirective, { descendants: true, read: ElementRef });\n  readonly stop = contentChild(OverflowStopDirective, { descendants: true, read: ElementRef });\n\n  readonly target = input<HTMLElement | undefined>();\n  readonly margin = input(4);\n  readonly direction = input<\"horizontal\" | \"vertical\">(\"horizontal\");\n  /**\n   * Always reserve the stop element's size, even when every item fits inside\n   * the container. Use it when the stop trigger is permanently visible (e.g.\n   * the \"more\" button also gives access to items that are never rendered in\n   * the container), so the last item never overlaps it.\n   */\n  readonly reserveStop = input(false, { transform: booleanAttribute });\n  readonly count = output<number>();\n\n  private readonly el = inject(ElementRef).nativeElement;\n  private readonly destroyRef = inject(DestroyRef);\n\n  private readonly resizeObserver = new ResizeObserver(() => this.countItems());\n\n  // Recompute when an individual item's size changes (label update, async\n  // translation, font load…), not only when the container resizes. Items we\n  // hid with `display: none` report a 0×0 size; ignore those notifications so\n  // our own show/hide toggling doesn't trigger redundant recounts.\n  private readonly itemsResizeObserver = new ResizeObserver((entries) => {\n    const visibleItemResized = entries.some((entry) => (entry.target as HTMLElement).style.display !== \"none\");\n    if (visibleItemResized) this.countItems();\n  });\n\n  private countSub: OutputRefSubscription | undefined;\n  private _lastCount: number | undefined;\n\n  constructor() {\n    afterNextRender({\n      read: () => {\n        // subscribe to resize events on the target element or the directive element\n        this.resizeObserver.observe(this.target() ?? this.el);\n        // count at least once without resize event\n        this.countItems();\n      }\n    });\n\n    // (re)observe every item whenever the projected list changes, so that\n    // added/removed items and per-item size changes both trigger a recount\n    effect(() => {\n      const items = this.items();\n      this.itemsResizeObserver.disconnect();\n      items.forEach((item) => this.itemsResizeObserver.observe(item.nativeElement));\n    });\n\n    // listens to the count output and toggles the visibility of the items\n    this.countSub = this.count.subscribe((count) => this.toggleToCount(count));\n\n    this.destroyRef.onDestroy(() => {\n      this.resizeObserver.disconnect();\n      this.itemsResizeObserver.disconnect();\n      this.countSub?.unsubscribe();\n      this.countSub = undefined;\n    });\n  }\n\n  /**\n   * Counts the number of items that can fit inside the container.\n   *\n   * The boundary is the container's own content edge (not the position of the\n   * stop element). This is what makes the measurement robust when the host is\n   * placed inside a flex layout: we never rely on a sibling staying where we\n   * expect it. The stop element is only used for its *size*, to reserve space\n   * for the \"more\" trigger when not all items fit.\n   *\n   * Emits the count if it has changed.\n   */\n  countItems(): void {\n    if (!this.items() || this.items().length === 0 || !this.stop()) return;\n\n    const horizontal = this.direction() === \"horizontal\";\n\n    // Reset all items to their natural size before measuring so that previously\n    // hidden items (display: none) don't corrupt the layout and position of\n    // their siblings.\n    this.items().forEach((item) => {\n      item.nativeElement.style.display = \"\";\n    });\n\n    // getBoundingClientRect() forces a synchronous reflow, so positions are\n    // accurate after the reset above. Using rects (not offsetWidth) means the\n    // inter-item gap is accounted for automatically.\n    const containerRect = this.el.getBoundingClientRect();\n    const stopRect = this.stop()!.nativeElement.getBoundingClientRect();\n    const itemsRects = this.items().map((item) => item.nativeElement.getBoundingClientRect());\n\n    // The container's content edge, with a small slack margin.\n    const containerEnd = (horizontal ? containerRect.right : containerRect.bottom) - this.margin();\n    const itemEnd = (rect: DOMRect): number => (horizontal ? rect.right : rect.bottom);\n\n    let count: number;\n\n    // If every item fits within the container, no \"more\" trigger is needed and\n    // we don't reserve any space for it — unless the trigger is permanently\n    // visible (reserveStop), in which case its space is always reserved.\n    if (!this.reserveStop() && itemEnd(itemsRects[itemsRects.length - 1]) <= containerEnd) {\n      count = itemsRects.length;\n    } else {\n      // Otherwise reserve the stop element's own size so the last visible item\n      // never overlaps the \"more\" trigger.\n      const reserve = horizontal ? stopRect.width : stopRect.height;\n      const limit = containerEnd - reserve;\n\n      count = 0;\n      for (const rect of itemsRects) {\n        if (itemEnd(rect) <= limit) count++;\n        else break;\n      }\n    }\n\n    if (this._lastCount !== count) {\n      this._lastCount = count;\n      this.count.emit(count);\n    } else {\n      // Count unchanged but items were reset above — re-apply the hidden state.\n      this.toggleToCount(count);\n    }\n  }\n\n  /**\n   * Toggles the visibility of the items based on the count.\n   * @param count - The number of items to keep visible.\n   */\n  toggleToCount(count: number): void {\n    this.items().forEach((item, index) => {\n      // display: none removes the item from the flex flow entirely, including\n      // its gap contribution, which keeps sibling positions accurate.\n      item.nativeElement.style.display = index < count ? \"\" : \"none\";\n    });\n  }\n}\n","import { Directive, inject, input, output } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { getState } from \"@ngrx/signals\";\nimport { Article, isNotInputEvent } from \"@sinequa/atomic\";\nimport { SelectionService } from \"../services\";\nimport { SelectionStore } from \"../stores\";\nimport { SelectionStrategy } from \"./selection-strategy\";\n\n/**\n * Directive that selects an article on click.\n * Used to handle click and enter key events to select an article based on the specified strategy.\n *\n * @remarks\n * This directive replaces the deprecated `SelectArticleOnClickDirective`.\n */\n@Directive({\n  selector: \"[selectArticle]\",\n  standalone: true,\n  host: {\n    \"(click)\": \"onClick()\",\n    \"(keydown.enter)\": \"onEnter($event)\"\n  }\n})\nexport class SelectArticleDirective {\n  private selectionStore = inject(SelectionStore);\n  private selectionService = inject(SelectionService);\n  private readonly router = inject(Router);\n\n  public readonly article = input.required<Partial<Article> | undefined>();\n  public readonly strategy = input<SelectionStrategy>(\"replace\");\n  public readonly redirectUrl = input<string>(\"/preview\");\n\n  public readonly selected = output();\n\n  public onEnter(e: Event): void {\n    if (e && isNotInputEvent(e as KeyboardEvent)) {\n      this.onClick();\n    }\n  }\n\n  public onClick(): void {\n    if (!this.article()) return;\n\n    switch (this.strategy()) {\n      case \"replace\":\n        this.replace(this.article() as Article);\n        break;\n      case \"redirect\":\n        if (this.article()?.id) {\n          this.router.navigate([this.redirectUrl(), this.article()?.id]);\n        } else {\n          this.replace(this.article() as Article);\n        }\n        break;\n      case \"emit\":\n        this.selected.emit();\n        break;\n      default:\n        this.replace(this.article() as Article);\n        break;\n    }\n  }\n\n  private replace(article: Article | undefined, withQueryText?: boolean): void {\n    const { id } = getState(this.selectionStore);\n    if (id && (!article || article.id === id)) return;\n    // set selection\n    this.selectionService.setCurrentArticle(article, withQueryText);\n  }\n}\n","import { Directive, effect, ElementRef, inject, input } from '@angular/core';\n\nimport { applyThemeToNativeElement, ThemeStore } from '../stores';\n\n/**\n * This directive is used to apply a theme to a native element based on the theme scope.\n */\n@Directive({\n  selector: '[themeProvider]',\n  standalone: true\n})\nexport class ThemeProviderDirective {\n  readonly themeProvider = input.required<string>();\n\n  readonly host = inject(ElementRef);\n  readonly themeStore = inject(ThemeStore);\n\n  constructor() {\n    effect(() => {\n      const scope = this.themeStore.scopes()?.[this.themeProvider()];\n\n      if (!scope) return;\n\n      const vars = scope.darkMode ? scope.cssVars.dark : scope.cssVars.light;\n\n      if (vars) applyThemeToNativeElement(this.host.nativeElement, vars);\n    });\n  }\n}\n","import { booleanAttribute, Component, computed, inject, input, signal } from \"@angular/core\";\nimport { Params, Router, RouterLink } from \"@angular/router\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\n\nimport {\n  BadgeComponent,\n  ButtonComponent,\n  cn,\n  EllipsisIcon,\n  FaIconComponent,\n  MenuComponent,\n  MenuContentComponent,\n  MenuItemComponent,\n  TabComponent,\n  TabsComponent,\n  TabsListComponent\n} from \"@sinequa/ui\";\n\nimport { OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective } from \"../../directives\";\nimport { SyslangPipe } from \"../../pipes\";\nimport { injectRouteNavigation } from \"./inject-route-navigation\";\nimport { AppStore } from \"../../stores\";\n\ninterface NavTab {\n  queryName?: string;\n  wsQueryTab?: string;\n  routerLink?: string | any[];\n  display?: string;\n  path?: string;\n  count?: number;\n  icon?: any;\n}\n\n@Component({\n  selector: \"navbar-tabs\",\n  standalone: true,\n  imports: [\n    RouterLink,\n    TranslocoPipe,\n    SyslangPipe,\n    ButtonComponent,\n    MenuComponent,\n    MenuItemComponent,\n    MenuContentComponent,\n    TabsComponent,\n    TabsListComponent,\n    TabComponent,\n    OverflowManagerDirective,\n    OverflowItemDirective,\n    OverflowStopDirective,\n    BadgeComponent,\n    EllipsisIcon,\n    FaIconComponent\n  ],\n  providers: [provideTranslocoScope('navbar-tabs')],\n  template: `\n    <!-- do not display the tabs if there are no tabs -->\n    @if (nav.tabs().length > 0) {\n      <div overflowManager (count)=\"visibleTabCount.set($event)\" class=\"flex items-end rounded-[inherit] bg-inherit\">\n        <Tabs class=\"flex-1 min-w-0 overflow-hidden\">\n          <TabsList class=\"w-full\">\n          @for (tab of nav.tabs(); track $index) {\n            <Tab\n              [class]=\"cn('group', !noTruncate() && 'basis-[12.5rem]')\"\n              title=\"{{ tab.display | syslang | transloco }}\"\n              value=\"{{ tab.display }}\"\n              overflowItem\n              [noTruncate]=\"noTruncate()\"\n              [style.--tab-min-width]=\"tabMinWidth(!!tab.icon)\"\n              [attr.aria-selected]=\"nav.currentPath() === tab.path\"\n              [attr.disabled]=\"showCount() && tab.count === 0 ? '' : null\"\n              [active]=\"nav.currentPath() === tab.path\"\n              [routerLink]=\"[tab.routerLink]\"\n              [queryParams]=\"getQueryParams(tab)\"\n              [queryParamsHandling]=\"getQueryParamsHandling()\"\n              (click)=\"changeTab()\"\n              (keydown.enter)=\"router.navigate([tab.routerLink], { queryParams: getQueryParams(tab), queryParamsHandling: getQueryParamsHandling() })\"\n              >\n              <div [class]=\"cn('flex items-center content-start w-full gap-1', !noTruncate() && '@container overflow-hidden min-w-0')\">\n              @if (tab.icon) {\n                <!-- the icon never shrinks: the label truncates first -->\n                <FaIcon [faClass]=\"tab.icon\" class=\"shrink-0\" aria-hidden=\"true\" />\n              }\n              <!-- when the tab gets too narrow to show anything meaningful next to\n                   the icon, hide the label entirely instead of a clipped sliver.\n                   w-0 + invisible (not display: none) keeps the label's line box,\n                   so the tab height doesn't collapse to the icon's height -->\n              <span [class]=\"cn(!noTruncate() && 'truncate', !noTruncate() && tab.icon && '@max-[3rem]:w-0 @max-[3rem]:invisible')\">{{ tab.display | syslang | transloco }}</span>\n              <!-- Show count badge only if count is > 0 -->\n              @if((tab.count ?? 0) > 0) {\n                <Badge\n                  size=\"sm\"\n                  [aria-label]=\"tab.count + ' ' + (tab.count === 1 ? ('navbarTabs.result' | transloco) : ('navbarTabs.results' | transloco))\">\n                  {{ tab.count }}\n                </Badge>\n              }\n              </div>\n            </Tab>\n          }\n          </TabsList>\n        </Tabs>\n\n        <!-- Always mounted so the stop position is stable; hidden when all tabs fit -->\n        <Menu\n          overflowStop\n          class=\"shrink-0 top-1\"\n          [class.invisible]=\"moreTabs().length === 0\"\n          [class.pointer-events-none]=\"moreTabs().length === 0\"\n        >\n          <button variant=\"ghost\" [iconOnly]=\"true\" class=\"mb-1 truncate me-1\" aria-label=\"more tabs\">\n            <EllipsisIcon orientation=\"vertical\"></EllipsisIcon>\n          </button>\n\n          <MenuContent class=\"z-500 w-fit\" position=\"bottom-end\">\n            @for (tab of moreTabs(); track $index) {\n              <MenuItem>\n                <a class=\"inline-flex items-center gap-1 whitespace-nowrap first-letter:capitalize\"\n                  [routerLink]=\"[tab.routerLink]\"\n                  [queryParams]=\"getQueryParams(tab)\"\n                  [queryParamsHandling]=\"getQueryParamsHandling()\"\n                  [attr.aria-selected]=\"nav.currentPath() === tab.path\"\n                  [attr.aria-label]=\"tab.display | syslang | transloco\"\n                  (click)=\"changeTab()\">\n                  @if (tab.icon) {\n                    <FaIcon [faClass]=\"tab.icon\"/>\n                  }\n                  {{ tab.display | syslang | transloco }}\n                </a>\n              </MenuItem>\n            }\n          </MenuContent>\n        </Menu>\n      </div>\n    }\n  `,\n  host: {\n    \"[class]\": \"cn('block', class())\"\n  }\n})\nexport class NavbarTabsComponent {\n  cn = cn;\n  class = input<string>();\n  readonly router = inject(Router);\n  protected appStore = inject(AppStore);\n\n  showCount = input(true, { transform: booleanAttribute });\n  /**\n   * When enabled (default), tab labels are never clipped: tabs that do not fit\n   * collapse into the ellipsis dropdown instead. Set to `false` to truncate\n   * overflowing labels with an ellipsis inside their slot.\n   *\n   * @default true\n   */\n  noTruncate = input(true, { transform: booleanAttribute });\n  minTabWidth = input<string>();\n  path = input(\"search\");\n\n  readonly nav = injectRouteNavigation(this.path, this.showCount);\n\n  readonly visibleTabCount = signal<number | undefined>(undefined);\n  readonly moreTabs = computed(() => this.nav.tabs().slice(this.visibleTabCount()));\n\n  /**\n   * Minimum width applied to a tab (through the `--tab-min-width` CSS variable)\n   * when labels are truncated (`noTruncate` is `false`), so a tab never shrinks\n   * into an unusable sliver. An explicit `minTabWidth` input always wins.\n   *\n   * - tab with an icon: the icon (16px) plus the tab's horizontal padding (1.5rem)\n   * - text-only tab: enough room for a few characters and the ellipsis\n   */\n  protected tabMinWidth(hasIcon: boolean): string | undefined {\n    if (this.minTabWidth()) return this.minTabWidth();\n    if (this.noTruncate()) return undefined;\n    return hasIcon ? \"calc(1.5rem + 16px)\" : \"calc(1.5rem + 4ch)\";\n  }\n\n  readonly persistFiltersAcrossTabs = computed(() => {\n    const general = this.appStore.general?.();\n    const appFeature = general?.features?.persistFiltersAcrossTabs;\n    if (appFeature !== undefined) return appFeature;\n    return false;\n  });\n\n  // Determine how query params are applied on tab change.\n  // - persist: 'merge' so the tab identity params (n/t/q) are updated while\n  //   the filter params (f/sort/id/page) already in the URL are kept.\n  // - default: 'replace' so everything is rewritten from scratch.\n  getQueryParamsHandling(): 'merge' | 'replace' {\n    return this.persistFiltersAcrossTabs() ? 'merge' : 'replace';\n  }\n\n  // Get query params conditionally\n  getQueryParams(tab: NavTab): Params | null | undefined {\n    if (this.persistFiltersAcrossTabs()) {\n      // When preserving filters, still update the tab identity params so the\n      // store rebuilds the query for the new tab. 'merge' keeps f/sort/id/page.\n      return {\n        n: tab.queryName,\n        q: this.nav.searchText(),\n        t: tab.wsQueryTab\n      };\n    }\n\n    // When replacing, explicitly set the filters to undefined to clear them\n    return {\n      n: tab.queryName,\n      q: this.nav.searchText(),\n      t: tab.wsQueryTab,\n      f: undefined,\n      sort: undefined,\n      id: undefined,\n      page: undefined\n    };\n  }\n\n  protected changeTab(): void {}\n}\n","import { booleanAttribute, Component, input } from \"@angular/core\";\nimport { RouterLink, RouterLinkActive } from \"@angular/router\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { FaIconComponent, SidebarMenuButtonComponent, SidebarMenuComponent, SidebarMenuItemComponent, TooltipDirective } from \"@sinequa/ui\";\n\nimport { SyslangPipe } from \"../../pipes\";\nimport { injectRouteNavigation } from \"../navbar-tabs/inject-route-navigation\";\n\n@Component({\n  selector: \"sidebar-nav\",\n  standalone: true,\n  imports: [\n    RouterLink,\n    TranslocoPipe,\n    SyslangPipe,\n    FaIconComponent,\n    SidebarMenuComponent,\n    SidebarMenuItemComponent,\n    SidebarMenuButtonComponent,\n    RouterLinkActive,\n    TooltipDirective\n],\n  template: `\n    <sidebar-menu>\n      @for (tab of nav.tabs(); track tab.path) {\n        @let label = tab.display | syslang | transloco;\n        <sidebar-menu-item>\n          <sidebar-menu-button\n            [tooltip]=\"label\" tooltip-position=\"right\"\n            [routerLink]=\"tab.routerLink\"\n            routerLinkActive=\"active\"\n            #rla=\"routerLinkActive\"\n            [attr.data-active]=\"rla.isActive || null\"\n            [queryParams]=\"{ n: tab.queryName, q: nav.searchText(), t: tab.wsQueryTab, f: undefined, sort: undefined, id: undefined, page: undefined }\">\n            @if (tab.icon) {\n              <FaIcon [faClass]=\"tab.icon\" aria-hidden=\"true\" />\n            }\n            <span>{{ label }}</span>\n          </sidebar-menu-button>\n        </sidebar-menu-item>\n      }\n    </sidebar-menu>\n  `\n})\nexport class SidebarNavComponent {\n  readonly path = input(\"search\");\n  readonly showCount = input(false, { transform: booleanAttribute });\n\n  readonly nav = injectRouteNavigation(this.path, this.showCount);\n}\n","import { Component } from \"@angular/core\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { FrownIcon } from \"@sinequa/ui\";\n\n@Component({\n  selector: \"NoResult\",\n  standalone: true,\n  imports: [TranslocoPipe, FrownIcon],\n  providers: [provideTranslocoScope(\"no-result\")],\n  template: `\n    <header class=\"flex items-center gap-2 text-xl font-semibold\">\n      <frown-icon class=\"text-3xl\" />\n      <p>{{ 'noResult.noResult' | transloco }}</p>\n    </header>\n\n    <p>{{ 'noResult.noResultSuggestion' | transloco }}</p>\n\n    <hr />\n\n    <p>{{ 'noResult.noResultAssistance' | transloco }}</p>\n  `,\n  host: {\n    class: \"p-4 flex flex-col gap-2 rounded-md\"\n  }\n})\nexport class NoResultComponent {}\n","import { Component, computed, inject } from \"@angular/core\";\n\nimport {\n  ButtonComponent,\n  ChevronLeftIcon,\n  ChevronRightIcon,\n  ChevronsLeftIcon,\n  ChevronsRightIcon,\n  InputComponent\n} from \"@sinequa/ui\";\nimport { PreviewService } from \"../../services\";\n\n@Component({\n  selector: \"preview-navigator\",\n  imports: [\n    ButtonComponent,\n    InputComponent,\n    ChevronLeftIcon,\n    ChevronsLeftIcon,\n    ChevronsRightIcon,\n    ChevronRightIcon\n  ],\n  template: `\n    <button\n      variant=\"ghost\"\n      [iconOnly]=\"true\"\n      class=\"dark:text-white dark:hover:bg-background/10\"\n      aria-label=\"Page précédente\"\n      (click)=\"preview.firstPage()\"\n      [disabled]=\"isFirst()\">\n      <chevrons-left />\n    </button>\n    <button\n      variant=\"ghost\"\n      [iconOnly]=\"true\"\n      class=\"dark:text-white dark:hover:bg-background/10\"\n      aria-label=\"Page précédente\"\n      (click)=\"preview.prevPage()\"\n      [disabled]=\"isFirst()\">\n      <chevron-left />\n    </button>\n\n    <div class=\"dark:text-white inline-flex items-center gap-1 px-1 tabular-nums\">\n      <input\n        #page\n        type=\"text\"\n        decoration=\"outline\"\n        class=\"dark:hover:bg-background/10 dark:text-white dark:border-foreground w-14 py-0.5 text-center invalid:bg-red-200\"\n        [min]=\"1\"\n        [max]=\"total() || 1\"\n        [value]=\"current()\"\n        (keydown.enter)=\"goto(page.value)\"\n        (focus)=\"page.select()\"\n        pattern=\"\\\\d+\"\n        aria-label=\"Aller à la page\" />\n\n      <span>/</span>\n      <span>{{ total() }}</span>\n    </div>\n    <button\n      variant=\"ghost\"\n      [iconOnly]=\"true\"\n      class=\"dark:text-white dark:hover:bg-background/10\"\n      aria-label=\"Page suivante\"\n      (click)=\"preview.nextPage()\"\n      [disabled]=\"isLast()\">\n      <chevron-right />\n    </button>\n    <button\n      variant=\"ghost\"\n      [iconOnly]=\"true\"\n      class=\"dark:text-white dark:hover:bg-background/10\"\n      aria-label=\"Page suivante\"\n      (click)=\"preview.lastPage()\"\n      [disabled]=\"isLast()\">\n      <chevrons-right />\n    </button>\n  `,\n  host: { \"[class.invisible]\": \"!total() || total() <= 1\" }\n})\nexport class PreviewNavigator {\n  protected readonly preview = inject(PreviewService);\n\n  readonly total = computed(() => this.preview.totalPages() || 1);\n  readonly current = computed(() => this.preview.currentPage() || 1);\n\n  isFirst = () => this.current() <= 1;\n  isLast = () => this.current() >= this.total();\n\n  goto(raw: string | number) {\n    const t = this.total() || 1;\n    let n = Math.floor(Number(raw) || 1);\n    n = Math.max(1, Math.min(n, t));\n    this.preview.gotoPage(n);\n  }\n}\n","import { Component, computed, inject, input, output, viewChild } from '@angular/core';\nimport { TranslocoPipe, provideTranslocoScope } from '@jsverse/transloco';\n\nimport { Placement } from '@floating-ui/dom';\nimport { CCSortingChoice, Result } from '@sinequa/atomic';\nimport { ArrowDownZaIcon, ArrowUpAzIcon, ButtonComponent, DropdownComponent, MenuComponent, MenuContentComponent, MenuItemComponent } from '@sinequa/ui';\n\nimport { AppStore } from '../../stores';\n\nexport type SortingChoice = CCSortingChoice & {\n  $isDesc?: boolean;\n};\n\n@Component({\n  selector: 'sort-selector, sortselector, SortSelector',\n  standalone: true,\n  templateUrl: './sort-selector.html',\n  imports: [TranslocoPipe, ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, ArrowUpAzIcon, ArrowDownZaIcon],\n  providers: [provideTranslocoScope('sort-selector')]\n})\nexport class SortSelectorComponent {\n  dropdown = viewChild(DropdownComponent);\n\n  readonly result = input.required<Result>();\n  readonly position = input<Placement>('bottom-start');\n  readonly onSort = output<SortingChoice>();\n\n  appStore = inject(AppStore);\n\n  readonly queryName = computed(() => this.result()?.queryName);\n\n  // fetch the sorting choices from the queries and process if choice is desc or asc\n  readonly sortOptions = computed(() => {\n    const query = this.appStore.getQueryByName(this.queryName());\n    if (!query) return [];\n\n    if (this.appStore.isTabSearch(query.name)) {\n      const tabName = this.result().tab;\n      if (tabName && query) {\n        const tab = query.tabSearch?.tabs?.find(t => t.name === tabName);\n        if (tab && tab.sortingChoices && tab.sortingChoices.length > 0) {\n          return tab.sortingChoices\n            .reduce((acc, sort) => {\n              acc.push({ ...sort, $isDesc: sort.orderByClause.includes('desc') });\n              return acc;\n            }, [] as SortingChoice[])\n            .filter(s => this.result().hasRelevance || !s.orderByClause.includes('globalrelevance'));\n        }\n      }\n    }\n\n    const choices = query.sortingChoices;\n    // choices can be an empty string when nothing is defined in the configuration\n    if (choices === undefined || (choices as unknown as string) === '') return [];\n\n    return choices\n      ?.reduce((acc, sort) => {\n        acc.push({ ...sort, $isDesc: sort.orderByClause.includes('desc') });\n        return acc;\n      }, [] as SortingChoice[])\n      .filter(s => this.result().hasRelevance || !s.orderByClause.includes('globalrelevance'));\n  });\n\n  readonly sort = computed(() => this.sortOptions()?.find(x => x.name === this.result()?.sort));\n  readonly isSortingDesc = computed(() => this.sort()?.orderByClause?.includes('desc'));\n\n  onSortOptionClicked(sort: SortingChoice) {\n    if (sort.name !== this.sort()?.name) {\n      this.dropdown()?.close();\n      this.onSort.emit(sort);\n    }\n  }\n}\n","<menu>\r\n  <button\r\n    tabindex=\"0\"\r\n    variant=\"ghost\"\r\n    [attr.title]=\"'sortSelector.selectSort' | transloco\">\r\n    @let isSortDescending = sort()?.$isDesc ?? false;\r\n    @if (isSortDescending) {\r\n      <arrow-down-za-icon class=\"me-1\" />\r\n    } @else {\r\n      <arrow-up-az-icon class=\"me-1\" />\r\n    }\r\n    <span class=\"hidden min-w-10 truncate sm:inline\">{{\r\n      sort()?.display | transloco\r\n    }}</span>\r\n  </button>\r\n\r\n  <MenuContent [position]=\"position()\" class=\"min-w-max\">\r\n    @if (sortOptions().length > 0) {\r\n      @for (option of sortOptions(); track $index) {\r\n        <menu-item\r\n          (click)=\"onSortOptionClicked(option)\"\r\n          class=\"justify-between\">\r\n          <span>{{ option.display | transloco }}</span>\r\n          @let isSortDescending = option.$isDesc ?? false;\r\n          @if (isSortDescending) {\r\n            <arrow-down-za-icon class=\"me-1\" />\r\n          } @else {\r\n            <arrow-up-az-icon class=\"me-1\" />\r\n          }\r\n        </menu-item>\r\n      }\r\n    }\r\n  </MenuContent>\r\n</menu>\r\n","import { NgTemplateOutlet } from '@angular/common';\nimport { Component, computed, contentChild, inject, Injector, input, resource } from '@angular/core';\nimport { getState } from '@ngrx/signals';\n\nimport { CCApp, fetchSponsoredLinks, LinkResult } from '@sinequa/atomic';\nimport { ArrowUpRightFromSquareIcon } from \"@sinequa/ui\";\n\nimport { ChildMarkerDirective } from '../../directives';\nimport { AppStore, QueryParamsStore } from '../../stores';\nimport { withFetch } from '../../utils';\n\n@Component({\n  selector: 'sponsored-results, SponsoredResults, sponsoredresults',\n  imports: [NgTemplateOutlet, ArrowUpRightFromSquareIcon],\n  standalone: true,\n  template: ` @if (sponsoredResults.value().length) {\n    @for (link of sponsoredResults.value(); track $index) {\n      <li role=\"listitem\" class=\"text-primary flex items-center gap-2 rounded px-3 py-2 font-bold\">\n        <a href=\"{{ link.url }}\" target=\"_blank\" rel=\"noopener\" title=\"{{ link.tooltip }}\" class=\"result-link peer flex items-center gap-2 hover:underline\">\n          <arrow-up-right-from-square-icon />\n          <span>{{ link.title }}</span>\n        </a>\n        @if (displayPromoted()) {\n          @if (childElement()?.template) {\n            <ng-container [ngTemplateOutlet]=\"childElement()?.template\" />\n          } @else {\n            <span class=\"promoted-badge bg-primary invisible flex items-center rounded-xl px-2 text-xs text-white peer-hover:visible\">PROMOTED</span>\n          }\n        }\n      </li>\n    }\n  }`,\n  host: {\n    role: 'list'\n  }\n})\nexport class SponsoredResultsComponent {\n  /**\n   * The directive used to mark the child template for the \"Promoted\" badge.\n   * This allows users to customize the appearance of the badge.\n   */\n  childElement = contentChild(ChildMarkerDirective);\n\n  appStore = inject(AppStore);\n  queryParamStore = inject(QueryParamsStore);\n  injector = inject(Injector);\n\n  /**\n   * The maximum number of sponsored results to display.\n   * This is set to 3 by default, but can be overridden by the `maxSponsoredResults` query parameter.\n   */\n  slice = input(3);\n  /**\n   * Whether to display the \"Promoted\" badge next to sponsored results.\n   * This is set to true by default, but can be overridden by the `displayPromoted` query parameter.\n   */\n  displayPromoted = input(true);\n\n  sponsoredLinks = computed(() => {\n    const { sponsoredLinks } = getState(this.appStore) as CCApp;\n    return sponsoredLinks;\n  });\n\n  readonly sponsoredResults = resource({\n    params: () => ({\n      query: this.queryParamStore.getQuery(),\n      links: this.sponsoredLinks(),\n      slice: this.slice(),\n    }),\n    loader: async ({ params: { query, links, slice } }) => {\n      const results = await withFetch(() => fetchSponsoredLinks(links, query), this.injector);\n      return results?.slice(0, slice) ?? [];\n    },\n    defaultValue: [] as LinkResult[],\n  });\n}\n","import { Component, computed, effect, inject, input, model } from '@angular/core';\nimport { NgStyle } from '@angular/common';\n\nimport { MenuComponent, MenuContentComponent } from '@sinequa/ui';\n\nimport { Theme, THEMES } from '../../resources';\nimport { ThemeStore } from '../../stores';\n\n@Component({\n  selector: 'theme-selector',\n  standalone: true,\n  imports: [MenuComponent, NgStyle, MenuContentComponent],\n  template: `\n    <Menu>\n      <ng-content></ng-content>\n\n      <MenuContent>\n        <ul class=\"flex flex-col gap-1 divide-y p-2\">\n          @for (theme of themes(); track $index) {\n            <li class=\"p-2\" (click)=\"selectTheme(theme)\">\n              <div class=\"flex items-baseline gap-2\">\n                <span class=\"size-3 rounded-full\" [ngStyle]=\"{ 'background-color': 'hsl(' + theme.colors.primary + ')' }\" aria-hidden=\"true\"></span>\n                <span>{{ theme.name }}</span>\n              </div>\n            </li>\n          }\n        </ul>\n      </MenuContent>\n    </Menu>\n  `,\n  styles: ``\n})\nexport class ThemeSelectorComponent {\n  readonly scope = input.required<string>();\n  readonly showPrivate = input<boolean>(false);\n\n  readonly themes = computed(() => THEMES.filter(theme => (this.showPrivate() ? true : !theme.private)));\n  readonly selectedTheme = model<string | undefined>();\n  readonly themeStore = inject(ThemeStore);\n\n  constructor() {\n    effect(() => {\n      const currentTheme = this.themeStore.scopes()[this.scope()];\n\n      if (!currentTheme) return;\n\n      this.selectedTheme.set(this.themeStore.scopes()[this.scope()].themeName);\n    });\n  }\n\n  public selectTheme(theme: string): void;\n  public selectTheme(theme: Theme): void;\n  public selectTheme(theme: Theme | string): void {\n    if (typeof theme !== 'string') theme = theme.name;\n\n    this.themeStore.setCurrentTheme(this.scope(), theme);\n  }\n}\n","import { Component, effect, inject, input, model } from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { ToggleLeftIcon, ToggleRightIcon } from '@sinequa/ui';\n\nimport { ThemeStore } from '../../stores';\n\n@Component({\n  selector: 'theme-toggle',\n  standalone: true,\n  imports: [FormsModule, ToggleRightIcon, ToggleLeftIcon],\n  template: `\n    <label class=\"flex cursor-pointer select-none items-center gap-2\">\n      @if (darkMode()) {\n        <toggle-right-icon class=\"text-primary\" />\n      } @else {\n        <toggle-left-icon />\n      }\n\n      <span>Dark mode</span>\n\n      <input type=\"checkbox\" class=\"hidden\" [(ngModel)]=\"darkMode\" (ngModelChange)=\"toggleDarkMode($event)\" />\n    </label>\n  `,\n  styles: ``\n})\nexport class ThemeToggleComponent {\n  readonly scope = input.required<string>();\n\n  readonly darkMode = model<boolean>();\n\n  private readonly themeStore = inject(ThemeStore);\n\n  constructor() {\n    effect(() => {\n      const currentTheme = this.themeStore.scopes()[this.scope()];\n\n      if (!currentTheme) return;\n\n      this.darkMode.set(currentTheme.darkMode ?? false);\n    });\n  }\n\n  public toggleDarkMode(status: boolean): void {\n    const scope = this.themeStore.scopes()?.[this.scope()];\n\n    if (!scope || !scope.cssVars) return;\n\n    this.themeStore.setDarkMode(this.scope(), status);\n  }\n}\n","import { Component } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { ArrowLeftIcon, ButtonComponent, Separator, SheetCloseDirective } from \"@sinequa/ui\";\n\n/**\n * Navbar component for sheets, providing a back button and a slot for additional content.\n *\n * @example\n * ```html\n * <SheetNavbar>\n *   <!-- Additional navbar content here -->\n * </SheetNavbar>\n * ```\n */\n@Component({\n  selector: \"SheetNavbar, sheetnavbar, sheet-navbar\",\n  standalone: true,\n  imports: [TranslocoPipe, ButtonComponent, Separator, SheetCloseDirective, ArrowLeftIcon],\n  template: `\n    <menu class=\"flex items-center gap-2 font-semibold\">\n      <li>\n        <button variant=\"ghost\" class=\"group\" [attr.title]=\"'back' | transloco\" sheetClose>\n          <arrow-left-icon class=\"-ms-1 transition-transform opacity-60 group-hover:-translate-x-0.5\" />\n          {{ 'back' | transloco }}\n        </button>\n      </li>\n\n      <li role=\"presentation\">\n        <separator orientation=\"vertical\" class=\"min-h-8\" />\n      </li>\n\n      <ng-content></ng-content>\n    </menu>\n  `\n})\nexport class SheetNavbarComponent {}\n","import { Component, computed, effect, inject, signal } from \"@angular/core\";\nimport { NonNullableFormBuilder, ReactiveFormsModule } from \"@angular/forms\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\n\nimport {\n  aggItemRegex,\n  Aggregation,\n  AggregationItem,\n  fetchQuery,\n  FilterOperator,\n  LegacyFilter,\n  notify,\n  parseValueAndOperatorFromItem,\n  translateAggregationToDateOptions,\n  TreeAggregation,\n  TreeAggregationNode\n} from \"@sinequa/atomic\";\nimport {\n  ButtonComponent,\n  InputComponent,\n  SheetService,\n  TabComponent,\n  TabsComponent,\n  TabsListComponent\n} from \"@sinequa/ui\";\n\nimport { DropdownInputComponent, DropdownItem } from \"../../components\";\nimport { SyslangPipe } from \"../../pipes\";\nimport { AppStore, QueryParamsStore } from \"../../stores\";\nimport { SheetNavbarComponent } from \"../sheet/sheet-navbar\";\n\ntype Operator = \"all\" | \"exact\" | \"any\" | \"none\" | \"matches\";\n\ninterface Filter {\n  column: string;\n  alias: string;\n  display?: string;\n  items?: (AggregationItem | TreeAggregationNode)[];\n}\n\ninterface Tab {\n  path: string;\n  display?: string;\n}\n\nconst searchRoute = \"search\";\n\n@Component({\n  selector: \"advanced-filters\",\n  standalone: true,\n  imports: [\n    ReactiveFormsModule,\n    TranslocoPipe,\n    SyslangPipe,\n    DropdownInputComponent,\n    ButtonComponent,\n    InputComponent,\n    TabsComponent,\n    TabComponent,\n    TabsListComponent,\n    SheetNavbarComponent\n  ],\n  providers: [SyslangPipe, TranslocoPipe, provideTranslocoScope(\"drawers\")],\n  templateUrl: \"./advanced-filters.html\",\n  host: {\n    class: \"contents\"\n  }\n})\nexport class AdvancedFiltersComponent {\n  private readonly queryParamsStore = inject(QueryParamsStore);\n  private readonly appStore = inject(AppStore);\n  private readonly router = inject(Router);\n  private readonly route = inject(ActivatedRoute);\n  private readonly formBuilder = inject(NonNullableFormBuilder);\n  private readonly transloco = inject(TranslocoService);\n  private readonly syslangPipe = inject(SyslangPipe);\n  private readonly translocoPipe = inject(TranslocoPipe);\n\n  sheetService = inject(SheetService);\n\n  selectData: { operator: string; display: string; placeholder?: string }[] = [\n    { operator: \"all\", display: \"filterContainsAll\" },\n    { operator: \"exact\", display: \"filterContainsExact\" },\n    { operator: \"any\", display: \"filterContainsAny\" },\n    { operator: \"none\", display: \"filterContainsNone\" },\n    { operator: \"matches\", display: \"filterMatches\", placeholder: \"you can use AND/OR criteria\" }\n  ];\n\n  protected readonly form = this.formBuilder.group({\n    content: this.formBuilder.group({\n      operator: this.formBuilder.control<Operator>(\"all\"),\n      value: this.formBuilder.control(undefined)\n    }),\n    title: this.formBuilder.group({\n      operator: this.formBuilder.control<Operator>(\"all\"),\n      value: this.formBuilder.control(undefined)\n    })\n  });\n\n  currentTab = signal<string>(\"all\");\n  currentFilter = signal<string | undefined>(undefined);\n  appliedFilters = signal<{ column: string; values: DropdownItem[] }[]>([]);\n  suggestions = signal<DropdownItem[]>([]);\n  aggregations = signal<(Aggregation | TreeAggregation)[]>([]);\n  inputVariant = signal<\"default\" | \"destructive\">(\"default\");\n\n  tabs = computed<Tab[]>(() => {\n    const routeData = this.router.config.find((c) => c.path === searchRoute);\n    return !routeData\n      ? []\n      : [{ path: \"all\", display: \"All\" }].concat(\n          routeData\n            .children!.filter((c) => !!c.path && c.path !== \"all\" && c.path !== \"**\")\n            .map((c) => ({ path: c.path!, display: c.data?.[\"display\"] }))\n        );\n  });\n\n  filters = computed<Filter[]>(() => {\n    const cjsonFilters =\n      this.appStore\n        .customizationJson()\n        .filters?.filter((f) => f.column !== \"#date\")\n        .map((f) => ({\n          column: f.column,\n          alias: this.appStore.getColumnAlias(f.column),\n          display: f.display,\n          items: this.aggregations()?.find((a) => a.column === f.column)?.items\n        })) || [];\n\n    const agg =\n      this.aggregations()\n        .filter((f) => !cjsonFilters.some((cf) => cf.column === f.column))\n        .map((f: any) => ({\n          column: f.column,\n          alias: this.appStore.getColumnAlias(f.column),\n          display: f.display,\n          items: f.column !== \"treepath\" ? f.items : this.getWithSubItems(f.items)\n        })) || [];\n\n    return cjsonFilters.concat(agg);\n  });\n\n  protected enableFieldedSearch = computed(() => {\n    const { queryName } = this.route.snapshot.data;\n    return this.appStore.enableFieldedSearch(queryName);\n  });\n\n  protected allowEmptySearch = computed(() => {\n    const { queryName } = this.route.snapshot.data;\n    return this.appStore.allowEmptySearch(queryName);\n  });\n\n  text: string = \"\";\n\n  constructor() {\n    effect(() => {\n      getState(this.appStore);\n      const query = this.appStore.getDefaultQuery();\n      if(query?.name) {\n        this.getFirstPageQuery(query?.name);\n      }\n    })\n  }\n\n  async getFirstPageQuery(queryName: string) {\n    const response = await fetchQuery({ isFirstPage: true, name: queryName });\n    this.aggregations.set(response.aggregations);\n  }\n\n  onTabChange(tab: string): void {\n    this.currentTab.set(tab);\n  }\n\n  onSearch(): void {\n    // this params alters the query text\n    const { content, title } = this.form.value;\n\n    if (!this.allowEmptySearch() && !content?.value && !title?.value) {\n      notify.error(this.transloco.translate(\"drawers.emptySearchNotAllowed\"), { duration: 2000 });\n      this.inputVariant.set(\"destructive\");\n      return;\n    } else {\n      this.inputVariant.set(\"default\");\n    }\n\n    const fieldedText = [];\n    if (content?.value) {\n      const { operator = \"any\", value = \"\" } = content;\n      const text = this.formatFilter(operator, value);\n      fieldedText.push(text);\n    }\n    if (title?.value) {\n      const { operator = \"any\", value = \"\" } = title;\n      const text = this.formatFilter(operator, value, \"title\");\n      fieldedText.push(text);\n    }\n\n    let text = this.text;\n\n    // now we have to join the fieldedText with the text\n    // if text is empty, we must remove the leading space\n    // if text is not empty, we must add a AND before the fieldedText\n    if (text && fieldedText.length) {\n      text = `${text} AND ${fieldedText.join(\" AND \")}`;\n    } else {\n      text = fieldedText.join(\" AND \");\n    }\n    this.queryParamsStore.patch({ text });\n\n    const filters: LegacyFilter[] = [];\n    this.appliedFilters().forEach((filter) => {\n      if (filter.values.length) {\n        // todo should handle dates? how?\n        /* if (filter.column.startsWith('modified') || filter.column.startsWith('date')) {\n          const valueFrom = this.customFilters.value[`${filter}From`]?.trim();\n          const valueTo = this.customFilters.value[`${filter}To`]?.trim();\n          if (valueFrom) {\n            filters.push(...this.getFilter('like', valueFrom, filter.column));\n          }\n          if (valueTo) {\n            filters.push(...this.getFilter('like', valueTo, filter.column));\n          }\n        } else { */\n        filters.push(...this.getFilter(\"in\", filter.values, filter.column));\n      }\n    });\n\n    this.queryParamsStore.clearFilters();\n    if (filters.length) {\n      filters.forEach((filter) => {\n        this.queryParamsStore.updateFilter(filter);\n      });\n    }\n\n    this.sheetService.toggle();\n\n    // ! we need to remove the page parameter from the query params when new search is performed\n    const { name } = this.queryParamsStore.getQuery();\n    this.router.navigate([`/${searchRoute}/${this.currentTab()}`], {\n      queryParams: { q: text, p: undefined, t: this.currentTab(), n: name, f: JSON.stringify(filters) },\n      queryParamsHandling: \"merge\"\n    });\n  }\n\n  /** Generate the LegacyFilter to add to the query */\n  private getFilter(operator: FilterOperator, values: DropdownItem[], field: string): LegacyFilter[] {\n    const value = values[0].value;\n    const display = values[0].display;\n    if (this.appStore.isDateColumn(field)) {\n      // dates\n      const agg = this.aggregations().find((a) => a.column === field);\n      if (agg) {\n        const options = translateAggregationToDateOptions(agg, false);\n        const option = options.find((o) => !!o.display && value.indexOf(o.display) !== -1);\n        if (option)\n          return [\n            {\n              name: agg.name,\n              operator: option?.operator,\n              field: agg.column,\n              display: option.display ?? \"\",\n              filters: option.filters,\n              value: option.value\n            }\n          ];\n      }\n\n      const op = field.endsWith(\"From\") ? \"gte\" : \"lte\";\n      const f = field.split(field.endsWith(\"From\") ? \"From\" : \"To\")[0];\n      return [{ operator: op, value, field: f }];\n    } else {\n      const agg = this.aggregations().find((a) => a.column === field);\n\n      // if AggregationItem\n      if (!!value.match(aggItemRegex)?.[1] && !!agg) {\n        const items = agg.items.filter((item) => values.some((v) => item.value === v.value));\n        const filters = items.map((item) => parseValueAndOperatorFromItem(item, field));\n        return [\n          {\n            operator: \"or\",\n            filters,\n            name: agg.name,\n            field,\n            display: this.translocoPipe.transform(this.syslangPipe.transform(display || value))\n          }\n        ];\n      }\n\n      switch (operator) {\n        case \"contains\":\n        case \"in\":\n          return [\n            {\n              operator,\n              name: agg?.name,\n              values: values.map((v) => v.value),\n              field,\n              display: display || value,\n              filters: values.map((v) => ({\n                operator: \"contains\",\n                name: agg?.name,\n                field,\n                value: v.value,\n                display: v.display\n              }))\n            }\n          ];\n        case \"eq\":\n        case \"like\":\n          return [{ operator, value, field, display: display || value }];\n        default:\n          return [];\n      }\n    }\n  }\n\n  /** Format content/title filters */\n  private formatFilter(operator: Operator, value: string, field: \"title\" | \"\" = \"\"): string {\n    const fieldStr = field ? `${field}::` : \"\";\n    switch (operator) {\n      case \"all\":\n        return `${fieldStr}[${value}]`;\n      case \"exact\":\n        return `${fieldStr}\"${value}\"`;\n      case \"matches\": {\n        // value can be separated by AND or OR keywords, if it's the case each words must be written field:word1 AND field:word2 etc...\n        const words = value.split(/\\s+(AND|OR)\\s+/);\n        return words\n          .map((w) => {\n            if (w === \"AND\" || w === \"OR\") return w;\n            return `(${fieldStr}${w})`;\n          })\n          .join(\" \");\n      }\n      case \"any\": {\n        const splitWords = value.split(\" \");\n        return `(${splitWords.map((w) => `${fieldStr}[${w}]`).join(\" OR \")})`;\n      }\n      case \"none\":\n        return `${fieldStr}NOT [${value}]`;\n      default:\n        return value;\n    }\n  }\n\n  getPlaceholder(key: string): string {\n    return (\n      this.selectData.find((d) => d.operator === this.form.get(key)?.value)?.placeholder ||\n      this.transloco.translate(\"drawers.searchWords\")\n    );\n  }\n\n  /** Get applied filters for a column */\n  getItems(column: string): DropdownItem[] {\n    return this.appliedFilters().find((f) => f.column === column)?.values || [];\n  }\n\n  /** add item to current selection */\n  addItem(item: DropdownItem, filter: Filter): void {\n    const appliedFilter = this.appliedFilters().find((af) => af.column === filter.column);\n    if (!appliedFilter) {\n      this.appliedFilters.set(this.appliedFilters().concat([{ column: filter.column, values: [item] }]));\n    } else if (!appliedFilter.values.some((v) => v.value === item.value)) {\n      if (this.appStore.isDateColumn(filter.column)) {\n        appliedFilter.values = [item]; // only one item for date filters\n      } else {\n        appliedFilter.values.push(item);\n      }\n    }\n  }\n\n  /** remove item from current selection */\n  removeItem(item: DropdownItem, filter: Filter): void {\n    const appliedFilter = this.appliedFilters().find((af) => af.column === filter.column);\n    if (appliedFilter) {\n      appliedFilter.values = appliedFilter.values.filter((v) => v.value !== item.value);\n    }\n  }\n\n  /** Update suggestions on input focus */\n  setFilterFocus(value: string | null, filter: Filter): void {\n    this.currentFilter.set(filter.column);\n    this.setSuggestions(value);\n  }\n\n  /** Update suggestions when typing */\n  onInputTyping(value: string | null): void {\n    this.setSuggestions(value);\n  }\n\n  private setSuggestions(value: string | null): void {\n    this.suggestions.set([]);\n    const filter = this.filters().find((f) => f.column === this.currentFilter());\n    if (!!value && !!filter && filter.items?.length) {\n      this.suggestions.set(\n        this.getSuggestionItems(value.toLowerCase(), filter.items).map((i) => ({\n          display: i.display || String(i.value),\n          value: String(filter.column === \"treepath\" ? `/${(i as TreeAggregationNode).$path || i.value}/*` : i.value)\n        }))\n      );\n    }\n  }\n\n  private getSuggestionItems(\n    value: string,\n    items: (AggregationItem | TreeAggregationNode)[]\n  ): (AggregationItem | TreeAggregationNode)[] {\n    const res = items.filter(\n      (i) =>\n        (!!i.display && i.display.toLowerCase().indexOf(value) !== -1) ||\n        String(i.value).toLowerCase().indexOf(value) !== -1\n    );\n    // todo handle tree items\n    return res;\n  }\n\n  private getWithSubItems(items: TreeAggregationNode[]): TreeAggregationNode[] {\n    const res = [...items];\n    items.forEach((item) => {\n      if (item.hasChildren && item.items?.length) {\n        res.push(...this.getWithSubItems(item.items));\n      }\n    });\n    return res;\n  }\n}\n","<div class=\"flex h-full flex-col overflow-auto\">\n  <sheet-navbar class=\"border-foreground/10 block border-b pb-2\">\n    <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n      {{ 'drawers.search' | transloco }}\n    </button>\n  </sheet-navbar>\n\n  <div class=\"flex h-full grow flex-col overflow-auto p-4\">\n    <section class=\"flex flex-col gap-4\" [formGroup]=\"form\">\n      <!-- FIND IN -->\n      <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n      <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n        <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n        <select\n          id=\"content-operator\"\n          class=\"hover:outline-primary focus:outline-primary border-foreground/10 bg-background hover:bg-muted focus:bg-muted h-8 w-full rounded-md border px-2 hover:outline focus:outline\"\n          formControlName=\"operator\">\n          @for (data of selectData; track $index) {\n            <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n          }\n        </select>\n        <input\n          [variant]=\"inputVariant()\"\n          id=\"content-value\"\n          type=\"text\"\n          autocomplete=\"off\"\n          spellcheck=\"false\"\n          [placeholder]=\"getPlaceholder('content.operator')\"\n          formControlName=\"value\" />\n      </div>\n      @if (enableFieldedSearch()) {\n        <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n          <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n          <select\n            id=\"title-operator\"\n            class=\"hover:outline-primary focus:outline-primary border-foreground/10 bg-background hover:bg-muted focus:bg-muted h-8 w-full rounded-md border px-2 hover:outline focus:outline\"\n            formControlName=\"operator\">\n            @for (data of selectData; track $index) {\n              <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n            }\n          </select>\n          <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n        </div>\n      }\n\n      <!-- TABS -->\n      <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }}&nbsp;&quot;{{ currentTab() }}&quot;</h1>\n\n      <Tabs>\n        <TabsList variant=\"ghost\">\n          @for (tab of tabs(); track $index) {\n            <Tab class=\"w-fit\" [value]=\"tab.path\" [active]=\"tab.path === currentTab()\" (click)=\"onTabChange(tab.path)\">\n              {{ tab.display | syslang | transloco }}\n            </Tab>\n          }\n        </TabsList>\n      </Tabs>\n\n      <!-- FILTERS -->\n      <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n      @for (filter of filters(); track $index) {\n        <DropdownInput\n          [suggestions]=\"suggestions()\"\n          [selected]=\"getItems(filter.column)\"\n          [label]=\"filter.display || filter.alias | syslang | transloco\"\n          [placeholder]=\"'drawers.startTyping' | transloco\"\n          [noResultLabel]=\"'drawers.noResult' | transloco\"\n          (onFocus)=\"setFilterFocus($event, filter)\"\n          (onKeyUp)=\"onInputTyping($event)\"\n          (removeItem)=\"removeItem($event, filter)\"\n          (addItem)=\"addItem($event, filter)\" />\n      } @empty {\n        {{ 'drawers.noFilters' | transloco }}\n      }\n    </section>\n  </div>\n</div>\n","import { afterNextRender, ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, input, output, viewChild } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\nimport { DateRangePickerDirective, InputComponent } from \"@sinequa/ui\";\n\n@Component({\n  selector: \"aggregation-date-custom-range\",\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [TranslocoPipe, DateRangePickerDirective, InputComponent],\n  template: `\n  <div\n    class=\"@container flex grow gap-1 p-1\"\n    daterangepicker\n    [datepicker-language]=\"lang()\"\n    [datepicker-min]=\"min()\"\n    [datepicker-max]=\"max()\">\n    <div class=\"flex gap-1\">\n      <label for=\"datepicker-range-start\" class=\"min-w-10\">{{\n        \"from\" | transloco\n      }}</label>\n      <input\n        id=\"datepicker-range-start\"\n        name=\"start\"\n        type=\"text\"\n        class=\"h-8 min-w-[13ch]\" />\n    </div>\n    <div class=\"flex gap-1\">\n      <label for=\"datepicker-range-end\" class=\"min-w-10 text-right\">{{\n        \"to\" | transloco\n      }}</label>\n      <input\n        id=\"datepicker-range-end\"\n        name=\"end\"\n        type=\"text\"\n        class=\"h-8 min-w-[13ch]\" />\n    </div>\n  </div>\n  `\n})\nexport class AggregationDateCustomRangeComponent {\n  private readonly el = inject(ElementRef);\n\n  readonly lang = input<string>(\"en\");\n  readonly min = input<string | undefined>(undefined);\n  readonly max = input<string | undefined>(undefined);\n\n  readonly datepicker = viewChild(DateRangePickerDirective);\n  readonly dateSelected = output<void>();\n\n  constructor(destroyRef: DestroyRef) {\n    afterNextRender(() => {\n      const dmin = this.min() ? new Date(this.min()!) : undefined;\n      const dmax = this.max() ? new Date(this.max()!) : undefined;\n      if (dmin && dmax) this.datepicker()?.setDates(dmin, dmax);\n      const onChangeDate = () => this.dateSelected.emit();\n      this.el.nativeElement.addEventListener('changeDate', onChangeDate);\n      destroyRef.onDestroy(() => this.el.nativeElement.removeEventListener('changeDate', onChangeDate));\n    });\n  }\n}\n","import { afterNextRender, ChangeDetectionStrategy, Component, DestroyRef, ElementRef, inject, input, output, viewChild } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\nimport { DatepickerDirective } from \"@sinequa/ui\";\n\n@Component({\n  selector: \"aggregation-date-dual-pickers\",\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [TranslocoPipe, DatepickerDirective],\n  template: `\n    <div class=\"flex\">\n      <div class=\"flex flex-col gap-1\">\n        <span class=\"m-auto font-bold\">{{ 'from' | transloco }}</span>\n        <div\n          datepicker #datepickerStart=\"datepicker\"\n          [datepicker-min]=\"min()\"\n          [datepicker-max]=\"max()\"\n          [datepicker-language]=\"lang()\"></div>\n      </div>\n      <div class=\"flex flex-col gap-1\">\n        <span class=\"m-auto font-bold\">{{ 'to' | transloco }}</span>\n        <div\n          datepicker #datepickerEnd=\"datepicker\"\n          [datepicker-min]=\"min()\"\n          [datepicker-max]=\"max()\"\n          [datepicker-language]=\"lang()\"></div>\n      </div>\n    </div>\n  `\n})\nexport class AggregationDateDualPickersComponent {\n  private readonly el = inject(ElementRef);\n\n  readonly lang = input<string>(\"en\");\n  readonly min = input<string | undefined>(undefined);\n  readonly max = input<string | undefined>(undefined);\n\n  readonly datepickerStart = viewChild<DatepickerDirective>('datepickerStart');\n  readonly datepickerEnd = viewChild<DatepickerDirective>('datepickerEnd');\n\n  readonly dateSelected = output<void>();\n\n  constructor(destroyRef: DestroyRef) {\n    afterNextRender(() => {\n      const dmin = this.min() ? new Date(this.min()!) : undefined;\n      const dmax = this.max() ? new Date(this.max()!) : undefined;\n      if (dmin) this.datepickerStart()?.setDate(dmin);\n      if (dmax) this.datepickerEnd()?.setDate(dmax);\n      const onChangeDate = () => this.dateSelected.emit();\n      this.el.nativeElement.addEventListener('changeDate', onChangeDate);\n      destroyRef.onDestroy(() => this.el.nativeElement.removeEventListener('changeDate', onChangeDate));\n    });\n  }\n}\n","import { ChangeDetectionStrategy, Component, input, output, signal, viewChild } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\nimport { ButtonComponent, cn, DialogComponent, DialogContentComponent, DialogFooterComponent, DialogHeaderComponent, DialogTitleComponent } from \"@sinequa/ui\";\nimport { AggregationDateCustomRangeComponent } from \"./aggregation-date-custom-range\";\nimport { AggregationDateDualPickersComponent } from \"./aggregation-date-dual-pickers\";\n\nexport type DateRange = { from: string | null; to: string | null };\n\n@Component({\n  selector: \"aggregation-date-range-dialog\",\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    TranslocoPipe,\n    ButtonComponent,\n    DialogComponent,\n    DialogContentComponent,\n    DialogHeaderComponent,\n    DialogTitleComponent,\n    DialogFooterComponent,\n    AggregationDateCustomRangeComponent,\n    AggregationDateDualPickersComponent\n  ],\n  template: `\n    <div dialog #dialog=\"dialog\">\n      <DialogContent [class]=\"cn(!useDateRange() && 'max-w-fit!')\">\n        <DialogHeader>\n          <DialogTitle>{{ 'filters.customRange' | transloco }}</DialogTitle>\n        </DialogHeader>\n\n        @if(!useDateRange()) {\n          <aggregation-date-dual-pickers #dualPickers\n            [min]=\"min()\"\n            [max]=\"max()\"\n            [lang]=\"lang()\"\n            (dateSelected)=\"hasSelection.set(true)\" />\n        } @else {\n          <aggregation-date-custom-range #customRange\n            [min]=\"min()\"\n            [max]=\"max()\"\n            [lang]=\"lang()\"\n            (dateSelected)=\"hasSelection.set(true)\" />\n        }\n\n        <DialogFooter>\n          <button variant=\"outline\" (click)=\"dialog.cancel()\">{{ 'cancel' | transloco }}</button>\n          <button [disabled]=\"!hasSelection()\" (click)=\"confirm()\">{{ 'filters.validate' | transloco }}</button>\n        </DialogFooter>\n      </DialogContent>\n    </div>\n  `\n})\nexport class AggregationDateRangeDialogComponent {\n  cn = cn;\n  readonly hasSelection = signal(false);\n  readonly dialog = viewChild<DialogComponent>(DialogComponent);\n  readonly customRange = viewChild<AggregationDateCustomRangeComponent>('customRange');\n  readonly dualPickers = viewChild<AggregationDateDualPickersComponent>('dualPickers');\n\n  readonly min = input<string | undefined>(undefined);\n  readonly max = input<string | undefined>(undefined);\n\n  readonly lang = input<string>(\"en\");\n  /**\n   * Whether to use the date range picker or two separate date pickers for start and end dates.\n   * The date range picker is used when the user can select a range of dates, while the separate date pickers are used when the user can only select a single\n   * date (e.g., for \"last week\" or \"last month\" options).\n   *\n   * @defaultValue false\n   */\n  readonly useDateRange = input(false, { transform: Boolean });\n  readonly rangeSelected = output<DateRange>();\n\n  open(): void {\n    this.hasSelection.set(false);\n    this.dialog()?.open();\n  }\n\n  confirm(): void {\n    const customRange = this.customRange();\n    const dualPickers = this.dualPickers();\n\n    if (customRange) {\n      const [start, end] = customRange.datepicker()?.getDates() ?? [];\n      if (!start && !end) return;\n      this.rangeSelected.emit({\n        from: start?.toISOString() ?? null,\n        to: end?.toISOString() ?? null\n      });\n    }\n    if (dualPickers) {\n      const start = dualPickers.datepickerStart()?.getDate() as Date | undefined;\n      const end = dualPickers.datepickerEnd()?.getDate() as Date | undefined;\n      if (!start && !end) return;\n      this.rangeSelected.emit({\n        from: start?.toISOString() ?? null,\n        to: end?.toISOString() ?? null\n      });\n    }\n\n    this.dialog()?.close();\n  }\n}\n","import {\n  computed,\n  DestroyRef,\n  effect,\n  ElementRef,\n  inject,\n  Injector,\n  ModelSignal,\n  Signal,\n  signal,\n} from \"@angular/core\";\nimport { takeUntilDestroyed, toObservable } from \"@angular/core/rxjs-interop\";\nimport {\n  fetchSuggestField,\n  LegacyFilter,\n  Query,\n  Suggestion,\n} from \"@sinequa/atomic\";\nimport { getState } from \"@ngrx/signals\";\nimport type { Aggregation } from \"@sinequa/atomic\";\nimport { from, of, switchMap } from \"rxjs\";\nimport { AggregationListItem } from \"../../../models\";\nimport { AggregationsService } from \"../../../services\";\nimport { AggregationsStore, AppStore, QueryParamsStore } from \"../../../stores\";\nimport { buildQuery, debouncedSignal, withFetch } from \"../../../utils\";\n\nexport interface AggregationBaseRefs {\n  name: Signal<string | null>;\n  column: Signal<string | null>;\n  searchText: ModelSignal<string>;\n  searchInput?: Signal<ElementRef<HTMLInputElement> | undefined>;\n  expanded?: Signal<string | null>;\n}\n\ntype Selectable = { count: number; $selected?: boolean | undefined; items?: Selectable[] };\n\nexport function injectAggregationBase(refs: AggregationBaseRefs) {\n  const aggregationsStore = inject(AggregationsStore);\n  const queryParamsStore = inject(QueryParamsStore);\n  const appStore = inject(AppStore);\n  const aggregationsService = inject(AggregationsService);\n  const injector = inject(Injector);\n  const destroyRef = inject(DestroyRef);\n\n  const debouncedSearchText = debouncedSignal(refs.searchText, 300);\n  const normalizedSearchText = computed(() =>\n    debouncedSearchText()\n      .normalize(\"NFD\")\n      .replace(/[̀-ͯ]/g, \"\")\n  );\n  const suggests = signal<Suggestion[]>([]);\n\n  const _filterCount = computed(() => {\n    getState(aggregationsStore);\n    const { count = 0 } =\n      queryParamsStore.getFilter({ field: refs.column() ?? undefined, name: refs.name() ?? undefined }) || {};\n    return count;\n  });\n  const hasFilters = computed(() => _filterCount() > 0);\n  const filtersCount = _filterCount;\n\n  const query: Query = buildQuery();\n  const filters = signal<LegacyFilter[]>([]);\n\n  if (refs.searchInput && refs.expanded) {\n    effect(() => {\n      if (refs.searchInput!()?.nativeElement && refs.expanded!() !== null) {\n        setTimeout(() => refs.searchInput!()?.nativeElement.focus(), 0);\n      }\n    });\n  }\n\n  // Track both debounced text and column so a column change also resets suggestions.\n  // switchMap cancels the in-flight fetch when a new value arrives, avoiding race conditions.\n  const searchTrigger = computed(() => ({ text: debouncedSearchText(), column: refs.column() }));\n  toObservable(searchTrigger)\n    .pipe(\n      takeUntilDestroyed(destroyRef),\n      switchMap(({ text, column }) => {\n        if (text === \"\" || column === null) return of([]);\n        const q = queryParamsStore.getQuery();\n        return from(\n          withFetch(() => fetchSuggestField(normalizedSearchText(), [column || \"\"], q), injector)\n        );\n      })\n    )\n    .subscribe((result) => suggests.set(result || []));\n\n  function clearSearch(e: Event): void {\n    e.stopImmediatePropagation();\n    refs.searchText.set(\"\");\n  }\n\n  function selectItems(items: Selectable[], selected: boolean, recursive = false): void {\n    items.forEach((item) => {\n      if (item.count > 0) item.$selected = selected;\n      if (recursive && item.items?.length) selectItems(item.items, selected, true);\n    });\n  }\n\n  function addCurrentFiltersToItems(aggregation: Aggregation | null): AggregationListItem[] {\n    const currentItems = (aggregation?.items as AggregationListItem[]) || [];\n    if (!aggregation?.isTree && !aggregation?.isDistribution) {\n      const currentFilters = queryParamsStore.getFilter({ field: aggregation?.column, name: aggregation?.name });\n      if (currentFilters) {\n        if (Array.isArray(currentFilters.filters) && currentFilters.filters.length) {\n          (currentFilters.filters as LegacyFilter[]).forEach((filter: LegacyFilter) => {\n            const found = currentItems.find(\n              (item) => item.value?.toString().toLocaleLowerCase() === filter.value?.toLocaleLowerCase()\n            );\n            if (!found) {\n              currentItems.unshift({ value: filter.value, display: filter.display, $selected: true } as AggregationListItem);\n            } else {\n              found.$selected = true;\n            }\n          });\n        } else if (Array.isArray(currentFilters.values) && currentFilters.values.length) {\n          // multiple values stored as a string array, e.g. { values: [\"alice_martin\", \"caroline_dubois\"] }\n          // (no `filters` sub-array and no single `value`) — mark each matching item as selected\n          (currentFilters.values as string[]).forEach((value) => {\n            const found = currentItems.find(\n              (item) => item.value?.toString().toLocaleLowerCase() === value?.toString().toLocaleLowerCase()\n            );\n            if (!found) {\n              currentItems.unshift({ value, display: value, $selected: true } as AggregationListItem);\n            } else {\n              found.$selected = true;\n            }\n          });\n        } else if (currentFilters.value) {\n          const found = currentItems.find(\n            (item) => item.value?.toString().toLocaleLowerCase() === currentFilters.value?.toLocaleLowerCase()\n          );\n          if (!found) {\n            currentItems.push({ value: currentFilters.value, display: currentFilters.display, $selected: true } as AggregationListItem);\n          } else {\n            found.$selected = true;\n          }\n        }\n      }\n    }\n    return currentItems;\n  }\n\n  function applyFilters(\n    appliedFilters: LegacyFilter[],\n    agg: Aggregation,\n    clearFn: () => void\n  ): void {\n    const { name: aggName, column: field } = agg;\n    if (appliedFilters.length > 1) {\n      const display = appliedFilters[0].display;\n      if (agg.isDistribution) {\n        queryParamsStore.updateFilter({\n          operator: \"or\",\n          filters: appliedFilters,\n          name: aggName,\n          field,\n          display,\n        } as LegacyFilter);\n      } else {\n        const values = appliedFilters.map((f) => f.value);\n        queryParamsStore.updateFilter({\n          operator: \"in\",\n          name: aggName,\n          field,\n          values,\n          display,\n          filters: appliedFilters,\n        } as LegacyFilter);\n      }\n    } else if (appliedFilters.length === 1) {\n      queryParamsStore.updateFilter(appliedFilters[0]);\n    } else {\n      clearFn();\n    }\n  }\n\n  return {\n    aggregationsStore,\n    queryParamsStore,\n    appStore,\n    aggregationsService,\n    injector,\n    destroyRef,\n    debouncedSearchText,\n    normalizedSearchText,\n    suggests,\n    hasFilters,\n    filtersCount,\n    query,\n    filters,\n    clearSearch,\n    selectItems,\n    addCurrentFiltersToItems,\n    applyFilters,\n  };\n}\n","import { InjectionToken } from \"@angular/core\";\r\n\r\n/**\r\n * Injection token that indicates whether custom date ranges are allowed.\r\n *\r\n * @remarks\r\n * This token is used to configure the date component to allow users to select custom date ranges.\r\n *\r\n * @example\r\n * ```typescript\r\n * providers: [\r\n *   { provide: FILTER_DATE_ALLOW_CUSTOM_RANGE, useValue: false }\r\n * ]\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport const FILTER_DATE_ALLOW_CUSTOM_RANGE = new InjectionToken<boolean>(\"date allow custom range\", {\r\n  factory: () => true\r\n});","import {\n  booleanAttribute,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  linkedSignal,\n  model,\n  output,\n  signal,\n  viewChild\n} from \"@angular/core\";\nimport { takeUntilDestroyed, toSignal } from \"@angular/core/rxjs-interop\";\nimport { FormControl, FormGroup, ReactiveFormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\n\nimport {\n  Aggregation,\n  AggregationItem,\n  FilterOperator,\n  LegacyFilter,\n  notify,\n  translateAggregationToDateOptions,\n  warn\n} from \"@sinequa/atomic\";\nimport { ChevronRightIcon, cn, FaIconComponent, FilterIcon, FilterXIcon, IconButtonComponent, InputComponent, ListItemComponent } from \"@sinequa/ui\";\n\nimport { AggregationDateRangeDialogComponent, DateRange } from \"./aggregation-date-range-dialog\";\n\nimport { SyslangPipe } from \"../../../../pipes\";\nimport { AggEx } from \"../../../../services\";\nimport { injectAggregationBase } from \"../inject-aggregation-base\";\nimport { FILTER_DATE_ALLOW_CUSTOM_RANGE } from \"../../tokens/filter-date-allow-custom-range.token\";\nimport { AggregationTitle } from \"../../types/AggregationTitle.type\";\n\ntype DateFilter = {\n  label?: string;\n  operator?: FilterOperator;\n  value?: string;\n  range?: [string, string];\n  display?: string;\n  disabled?: boolean;\n  hidden?: boolean;\n};\n\nconst options: Intl.DateTimeFormatOptions = {\n  year: 'numeric',\n  month: '2-digit',\n  day: '2-digit'\n};\n\n@Component({\n  selector: \"aggregation-date, AggregationDate, aggregationdate\",\n  standalone: true,\n  providers: [provideTranslocoScope(\"filters\")],\n  imports: [\n    InputComponent,\n    ListItemComponent,\n    ReactiveFormsModule,\n    TranslocoPipe,\n    SyslangPipe,\n    ChevronRightIcon,\n    AggregationDateRangeDialogComponent,\n    FaIconComponent,\n    FilterIcon,\n    FilterXIcon,\n    IconButtonComponent\n],\n  templateUrl: \"./aggregation-date.html\",\n  host: {\n    class: \"@container\"\n  },\n  styles: `\n    :host {\n      display: block;\n      min-width: 200px;\n    }\n\n    ul[role='list'] {\n      scrollbar-width: thin;\n    }\n  `\n})\nexport class AggregationDateComponent {\n  cn = cn;\n\n  /* view queries */\n  dateRangeDialog = viewChild(AggregationDateRangeDialogComponent);\n\n  /* inputs */\n  name = input<string | null>(null);\n  column = input.required<string | null>();\n  id = input<string | null>(null);\n  collapsible = input(false);\n  collapsed = input(false);\n  searchable = input<boolean | undefined>(undefined);\n  showFiltersCount = input(false, { transform: booleanAttribute });\n  readonly title = input<AggregationTitle>({ label: \"Date\", icon: \"far fa-calendar-day\" });\n  readonly displayEmptyDistributionIntervals = input<boolean>(false);\n\n  /* outputs */\n  onSelect = output<AggregationItem[]>();\n  onApply = output();\n  onClear = output();\n\n  /* collapse state */\n  isCollapsed = linkedSignal(() => this.collapsed());\n  expanded = computed(() => (this.isCollapsed() ? null : \"\"));\n\n  /* search state — unused by date component but required by AggregationBaseRefs */\n  protected readonly searchText = model<string>(\"\");\n  private readonly searchInput = signal<ElementRef<HTMLInputElement> | undefined>(undefined);\n\n  /* composable — injects stores/services, wires search effects, provides shared methods */\n  private readonly base = injectAggregationBase({\n    name: this.name,\n    column: this.column,\n    searchText: this.searchText,\n    searchInput: this.searchInput,\n    expanded: this.expanded,\n  });\n\n  /* spread from base */\n  readonly aggregationsService = this.base.aggregationsService;\n  readonly queryParamsStore = this.base.queryParamsStore;\n  readonly hasFilters = this.base.hasFilters;\n  readonly destroyRef = this.base.destroyRef;\n\n  /* injected services */\n  readonly allowCustomRange = inject(FILTER_DATE_ALLOW_CUSTOM_RANGE);\n  readonly transloco = inject(TranslocoService);\n\n  /* state */\n  protected readonly selection = signal(false);\n  protected readonly validSelection = signal<boolean>(false);\n\n  readonly aggregation = computed(() => {\n    const name = this.name();\n    if (name !== null) {\n      const agg = this.aggregationsService.processAggregation(name, this.column());\n      return {\n        ...agg,\n        items: agg?.items?.filter((item: AggregationItem) => item.display !== \"custom-range\") ?? []\n      } as AggEx;\n    }\n    return null;\n  });\n\n  readonly isEmpty = computed(() => this.aggregation() === null);\n\n  readonly items = computed(() => (this.aggregation()?.items as AggregationItem[]) ?? []);\n\n  protected readonly dateOptions = computed(() =>\n    translateAggregationToDateOptions(this.aggregation() as Aggregation, this.displayEmptyDistributionIntervals())\n  );\n\n  protected readonly form = new FormGroup({\n    option: new FormControl<string | null>(null),\n    customRange: new FormGroup({\n      from: new FormControl<string | null>(null),\n      to: new FormControl<string | null>(null)\n    })\n  });\n  protected today = new Date();\n  protected lang = signal(this.transloco.getActiveLang());\n\n  private readonly formValue = toSignal(this.form.valueChanges, { initialValue: this.form.value });\n  protected readonly customRangeFrom = computed(() => {\n    const from = this.formValue().customRange?.from;\n    return from ? new Date(from).toLocaleDateString(this.lang()) : \"\";\n  });\n\n  protected readonly customRangeTo = computed(() => {\n    const to = this.formValue().customRange?.to;\n    return to ? new Date(to).toLocaleDateString(this.lang()) : \"\";\n  });\n\n  constructor() {\n    this.transloco.langChanges$.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((lang) => {\n      this.lang.set(lang);\n    });\n\n    // apply current date filter from queryParamsStore\n    effect(() => {\n      const agg = this.aggregation();\n      if(agg) {\n        this.updateForm(\n          this.queryParamsStore.getFilter({\n            field: agg.column,\n            name: agg.name\n          }) as LegacyFilter\n        );\n      }\n    });\n\n    this.form.valueChanges.pipe(takeUntilDestroyed(this.destroyRef)).subscribe((changes) => {\n      this.validSelection.set(\n        !!changes.option &&\n          (changes.option !== \"custom-range\" || changes.customRange?.from !== null || changes.customRange?.to !== null)\n      );\n    });\n  }\n\n  select(): void {\n    this.selection.set(true);\n  }\n\n  apply(): void {\n    try {\n      const filter = this.getFormValueFilter();\n      this.queryParamsStore.updateFilter(filter);\n      this.selection.set(false);\n      this.onApply.emit();\n    } catch (err: unknown) {\n      warn(\"Error applying date filter:\", err);\n      if (err instanceof Error) {\n        notify.error(this.transloco.translate(err.message));\n      }\n    }\n  }\n\n  clear(notify: boolean = true): void {\n    this.form.setValue({\n      option: null,\n      customRange: {\n        from: null,\n        to: null\n      }\n    });\n\n    const agg = this.aggregation();\n    if (agg && notify) {\n      this.queryParamsStore.removeFilterByName(agg.name);\n      this.onClear.emit();\n    }\n  }\n\n  onHeaderClick(event: Event) {\n    event.preventDefault();\n    const isDate = this.aggregationsService.appStore.isDateColumn(this.aggregation()?.column || \"\");\n    if (!isDate && this.isEmpty()) return;\n    if (this.collapsible()) {\n      this.isCollapsed.update((value) => !value);\n    }\n  }\n\n  protected selectAndOpenDialog(): void {\n    this.select();\n    this.dateRangeDialog()?.open();\n  }\n\n  protected onRangeSelected(range: DateRange): void {\n    console.log(\"Selected range:\", range);\n    this.form.patchValue({\n      option: \"custom-range\",\n      customRange: { from: range.from, to: range.to }\n    });\n    this.select();\n  }\n\n  private updateForm(filter: LegacyFilter | undefined): void {\n    if (!filter) {\n      this.clear(false);\n      return;\n    }\n\n    const { operator, value } = filter;\n    const code =\n      this.dateOptions().find((option: DateFilter) => option.operator === operator && option.value === value)\n        ?.display ?? \"custom-range\";\n\n    let from: string | null = null,\n      to: string | null = null;\n\n    if (code === \"custom-range\") {\n      switch (operator) {\n        case \"lte\":\n          to = filter.value as string | null;\n          break;\n        case \"gte\":\n          from = filter.value as string | null;\n          break;\n        case \"between\":\n          from = filter.start as string | null;\n          to = filter.end as string | null;\n          break;\n        case \"and\": {\n          const filters = filter.filters as LegacyFilter[];\n          from = (filters?.find((f: LegacyFilter) => f.operator === \"gte\")?.value as string) ?? null;\n          to = (filters?.find((f: LegacyFilter) => f.operator === \"lte\")?.value as string) ?? null;\n          break;\n        }\n      }\n    }\n\n    const formValue = {\n      option: code,\n      customRange: {\n        from: code === \"custom-range\" ? (from ?? null) : null,\n        to: code === \"custom-range\" ? (to ?? null) : null\n      }\n    };\n\n    this.form.setValue(formValue);\n  }\n\n  private toEndOfDay(dateStr: string): string {\n    return `${new Date(dateStr).toLocaleDateString(\"en-CA\", options)} 23:59:59`;\n  }\n\n  private getFormValueFilter(): LegacyFilter {\n    const value = this.form.value;\n\n    // value.option is null\n    if (!value.option) {\n      throw new Error(\"filters.selectionInvalid\");\n    }\n\n    if (value.option !== \"custom-range\") {\n      const dateOption = this.dateOptions().find((option: DateFilter) => option.display === value.option);\n      const aggregation = this.aggregation();\n      const name = aggregation?.name ?? this.name() ?? undefined;\n      const column = aggregation?.column ?? this.column() ?? undefined;\n\n      if (!name && !column) {\n        throw new Error(\"filters.aggregationNotFound\");\n      }\n\n      return {\n        name: name,\n        operator: dateOption?.operator || \"eq\",\n        field: column,\n        display: dateOption?.display ?? \"\",\n        filters: dateOption?.filters,\n        value: dateOption?.value\n      };\n    } else if (value.customRange) {\n      // if to is null, operator is gte\n      // if from is null, operator is lte\n      // if both are not null, operator is between\n      const aggregation = this.aggregation();\n      const name = aggregation?.name ?? this.name() ?? undefined;\n      const column = aggregation?.column ?? this.column() ?? undefined;\n\n      if (!name && !column) {\n        throw new Error(\"filters.aggregationNotFound\");\n      }\n\n      const filter: LegacyFilter = {\n        name: name,\n        field: column,\n        display: value.option as string\n      };\n\n      // \"en-CA\" produces ISO 8601 date strings (YYYY-MM-DD) regardless of the user's locale.\n      // This format is required by the query engine and avoids ambiguity caused by locale-specific\n      // separators or month/day ordering (e.g. \"04/09/2026\" vs \"09/04/2026\").\n      if (value.customRange.from && value.customRange.to) {\n        filter.operator = \"and\";\n        filter.filters = [\n          {\n            field: column,\n            operator: \"gte\",\n            value: new Date(value.customRange.from).toLocaleDateString(\"en-CA\", options)\n          },\n          {\n            field: column,\n            operator: \"lte\",\n            value: this.toEndOfDay(value.customRange.to)\n          }\n        ];\n      } else if (value.customRange.from) {\n        filter.operator = \"gte\";\n        filter.value = new Date(value.customRange.from).toLocaleDateString(\"en-CA\", options);\n      } else if (value.customRange.to) {\n        filter.operator = \"lte\";\n        filter.value = this.toEndOfDay(value.customRange.to);\n      } else {\n        throw new Error(\"filters.customRangeInvalid\");\n      }\n\n      return filter;\n    }\n\n    throw new Error(\"filters.filterInvalid\");\n  }\n}\n","<details [attr.open]=\"expanded()\" [attr.name]=\"id()\" class=\"group space-y-2\">\r\n  <summary\r\n    [class.cursor-pointer]=\"collapsible()\"\r\n    class=\"m-0 flex h-8 w-full items-center pl-1 font-semibold select-none\"\r\n    (click)=\"onHeaderClick($event)\">\r\n    <ng-content select=\"label\">\r\n      @let icon = aggregation()?.icon;\r\n      @if (icon) {\r\n        <FaIcon [faClass]=\"icon\" class=\"mr-1 shrink-0\" />\r\n      }\r\n      <span class=\"grow\">{{\r\n        aggregation()?.display | syslang | transloco\r\n      }}</span>\r\n    </ng-content>\r\n\r\n    @if (hasFilters()) {\r\n      <icon-button\r\n        [attr.title]=\"'filters.clearFilters' | transloco\"\r\n        [attr.aria-label]=\"'filters.clearFilters' | transloco\"\r\n        (click)=\"clear()\"\r\n        (keydown.enter)=\"clear()\">\r\n        <filter-x-icon />\r\n        <span class=\"sr-only\">{{ \"filters.clearFilters\" | transloco }}</span>\r\n      </icon-button>\r\n    }\r\n\r\n    @if (selection() && validSelection()) {\r\n      <icon-button\r\n        [attr.title]=\"'filters.applyFilters' | transloco\"\r\n        [attr.aria-label]=\"'filters.applyFilters' | transloco\"\r\n        (click)=\"apply()\"\r\n        (keydown.enter)=\"apply()\">\r\n        <filter-icon />\r\n        <span class=\"sr-only\">{{ \"filters.applyFilters\" | transloco }}</span>\r\n      </icon-button>\r\n    }\r\n    @if (collapsible()) {\r\n      <icon-button\r\n        title=\"Open/Close\"\r\n        class=\"cursor-pointer [&_svg]:transition-transform [&_svg]:duration-150 group-open:[&_svg]:rotate-90\">\r\n        <chevronright />\r\n      </icon-button>\r\n    }\r\n  </summary>\r\n\r\n  <!-- content wrapper -->\r\n  <form [formGroup]=\"form\">\r\n    <ul\r\n      class=\"scrollbar-thin flex max-h-[var(--scroll-height,20rem)] snap-y snap-start flex-col gap-1 overflow-auto pt-2\"\r\n      role=\"list\">\r\n      @for (option of dateOptions(); track $index) {\r\n        <li\r\n          role=\"listitem\"\r\n          tabindex=\"0\"\r\n          (click)=\"radio.click()\"\r\n          [attr.aria-label]=\"option.display | syslang | transloco\"\r\n          [class]=\"\r\n            cn(\r\n              'flex p-0 px-2 leading-7',\r\n              form.get('option')?.value === option.display && 'bg-accent',\r\n              option.hidden && 'hidden',\r\n              option.disabled && 'disabled pointer-events-none text-neutral-300'\r\n            )\r\n          \"\r\n          [attr.aria-hidden]=\"option.disabled\">\r\n          <input\r\n            #radio\r\n            type=\"radio\"\r\n            formControlName=\"option\"\r\n            id=\"date-filter-{{ option.display }}\"\r\n            [attr.disabled]=\"option.disabled ? true : null\"\r\n            [attr.aria-disabled]=\"option.disabled\"\r\n            (click)=\"select()\"\r\n            value=\"{{ option.display }}\" />\r\n\r\n          <label\r\n            for=\"date-filter-{{ option.display }}\"\r\n            class=\"grow cursor-pointer p-1\">\r\n            {{ option.display | syslang | transloco }}\r\n          </label>\r\n        </li>\r\n      }\r\n\r\n      @if (allowCustomRange) {\r\n        <li\r\n          role=\"listitem\"\r\n          aria-label=\"open date range picker\"\r\n          class=\"flex px-2 leading-7\"\r\n          [class.select]=\"form.get('option')?.value === 'custom-range'\">\r\n          <input\r\n            type=\"radio\"\r\n            formControlName=\"option\"\r\n            id=\"date-filter-range-dialog\"\r\n            value=\"custom-range\"\r\n            (click)=\"select()\" />\r\n          <div\r\n            class=\"@container flex grow justify-end gap-1 p-1 @max-[340px]:flex-wrap\">\r\n            <div class=\"flex gap-1\">\r\n              <label for=\"datepicker-range-start\" class=\"min-w-10 truncate\">{{\r\n                \"filters.from\" | transloco\r\n              }}</label>\r\n              <input\r\n                id=\"datepicker-range-start\"\r\n                name=\"start\"\r\n                type=\"text\"\r\n                readonly\r\n                class=\"h-8 max-w-[13ch] min-w-[13ch]\"\r\n                [value]=\"customRangeFrom()\"\r\n                (click)=\"selectAndOpenDialog()\" />\r\n            </div>\r\n            <div class=\"flex gap-1\">\r\n              <label\r\n                for=\"datepicker-range-end\"\r\n                class=\"min-w-10 truncate text-right\"\r\n                >{{ \"filters.to\" | transloco }}</label\r\n              >\r\n              <input\r\n                id=\"datepicker-range-end\"\r\n                name=\"end\"\r\n                type=\"text\"\r\n                readonly\r\n                class=\"h-8 max-w-[13ch] min-w-[13ch]\"\r\n                [value]=\"customRangeTo()\"\r\n                (click)=\"selectAndOpenDialog()\" />\r\n            </div>\r\n          </div>\r\n        </li>\r\n      }\r\n    </ul>\r\n  </form>\r\n</details>\r\n\r\n<aggregation-date-range-dialog\r\n  [lang]=\"lang()\"\r\n  [useDateRange]=\"false\"\r\n  [min]=\"form.get('customRange.from')?.value || undefined\"\r\n  [max]=\"form.get('customRange.to')?.value || undefined\"\r\n  (rangeSelected)=\"onRangeSelected($event)\" />\r\n","import {\n  Component\n} from \"@angular/core\";\nimport { ReactiveFormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\n\nimport {\n  ButtonComponent,\n  ChevronRightIcon,\n  FaIconComponent,\n  FilterIcon,\n  FilterXIcon,\n  IconButtonComponent,\n  ListItemComponent\n} from \"@sinequa/ui\";\n\nimport { SyslangPipe } from \"../../../../pipes\";\nimport { AggregationDateComponent } from \"./aggregation-date\";\nimport { AggregationDateRangeDialogComponent } from \"./aggregation-date-range-dialog\";\n\n\n/**\n * Component that allows users to select a date or a date range for filtering search results.\n *\n * @deprecated since version 4. Use `AggregationDateComponent` instead.\n */\n@Component({\n  selector: \"date-filter,DateFilter\",\n  standalone: true,\n  providers: [provideTranslocoScope(\"filters\")],\n  imports: [\n    IconButtonComponent,\n    ListItemComponent,\n    ReactiveFormsModule,\n    TranslocoPipe,\n    SyslangPipe,\n    ChevronRightIcon,\n    AggregationDateRangeDialogComponent,\n    FaIconComponent,\n    FilterIcon,\n    FilterXIcon\n  ],\n  templateUrl: \"./aggregation-date.html\",\n  host: {\n    class: \"@container\"\n  },\n  styles: `\n    :host {\n      display: block;\n      min-width: 200px;\n    }\n\n    ul[role='list'] {\n      scrollbar-width: thin;\n    }\n  `\n})\nexport class DateComponent extends AggregationDateComponent {}\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport { Component, computed, inject, input, signal } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { type Article, type CCWebService, debug, notify, warn } from \"@sinequa/atomic\";\nimport { ChevronLeftIcon, ChevronRightIcon, cn, FaIconComponent, HighlighterIcon, ListItemComponent } from \"@sinequa/ui\";\nimport { ArticleMetadata } from \"../../../models\";\nimport { PreviewService } from \"../../../services\";\nimport { AppStore } from \"../../../stores\";\n\ninterface MetadataNavigation {\n  index: number;\n  value: string;\n}\n\ntype PreviewWebService = CCWebService & {\n  highlights?: string;\n};\n\n@Component({\n  selector: \"article-entities,ArticleEntities,articleentities\",\n  imports: [TranslocoPipe, NgTemplateOutlet, ListItemComponent, ChevronRightIcon, ChevronLeftIcon, FaIconComponent, HighlighterIcon],\n  template: `\n    <details class=\"group/parent\" name=\"advanced-search-panels\">\n      <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3\">\n        <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n          <highlighter-icon />\n          {{ 'entities' | transloco }}\n        </p>\n\n        <chevronright class=\"transition-transform duration-150 group-open/parent:rotate-90\" />\n      </summary>\n      @for (highlight of previewHighlights(); track $index) {\n        @if (highlight.metadata) {\n          <ng-container *ngTemplateOutlet=\"metadataPanel; context: highlight\" />\n        }\n      }\n    </details>\n\n    <!-- entities's template -->\n    <ng-template #metadataPanel let-metadata=\"metadata\" let-name=\"name\" let-iconClass=\"iconClass\" let-entity=\"entity\">\n      <details class=\"group/entities p-3 first:pt-0\" name=\"advanced-search-entities\">\n        <summary class=\"sticky top-8 flex cursor-pointer select-none items-baseline justify-between\">\n          <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n            <FaIcon [faClass]=\"iconClass || 'far fa-list'\" />\n            {{ name | transloco }}\n          </p>\n\n          <chevronright class=\"transition-transform duration-150 group-open/entities:rotate-90\" />\n        </summary>\n\n        <ul role=\"list\">\n          @for (data of metadata; track $index) {\n            <li role=\"listitem\" class=\"flex justify-between py-1 pl-2 select-none transition-transform duration-200 hover:-translate-x-2\" (mouseenter)=\"hovering.set(data.value)\" (mouseleave)=\"hovering.set(undefined)\">\n              <!-- shrink w-1/2 grow truncate ovoid the overlap when hovering the row -->\n              <p class=\"w-1/2 shrink grow truncate\">{{ data.display }}</p>\n\n              <p class=\"flex items-center gap-2\">\n                @if (hovering() === data.value) {\n                  <button class=\"hover:scale-125\" aria-label=\"previous entity\" (click)=\"navigatePrev(entity, data)\">\n                    <chevronleft />\n                  </button>\n\n                  <span>{{ hoverIndex() }} / {{ data.count }}</span>\n\n                  <button class=\"hover:scale-125\" aria-label=\"next entity\" role=\"button\" (click)=\"navigateNext(entity, data)\">\n                    <chevronright />\n                  </button>\n                } @else {\n                  {{ data.count }}\n                }\n              </p>\n            </li>\n          }\n        </ul>\n      </details>\n    </ng-template>\n  `\n})\nexport class ArticleEntities {\n  cn = cn;\n  protected readonly appStore = inject(AppStore);\n  protected readonly previewService = inject(PreviewService);\n\n  public readonly article = input.required<Article>();\n\n  protected readonly previewHighlights = computed(() => {\n    const highlights = (this.appStore.getWebServiceByType(\"preview\") as PreviewWebService)?.highlights\n      ?.split(\",\")\n      .filter((h) => h !== \"extractslocations\" && h !== \"matchlocations\" && h !== \"matchingpassages\");\n\n    return highlights?.map((highlight) => ({\n      name: highlight,\n      entity: highlight,\n      metadata: this.getMetadata(this.article(), highlight)\n    }));\n  });\n\n  public getMetadata(article: Partial<Article & Record<string, unknown>>, entity: string): ArticleMetadata[] {\n    const m = article[entity] as ArticleMetadata[] | undefined;\n    return m ?? [];\n  }\n\n  public navigation = signal<MetadataNavigation | undefined>(undefined);\n\n  public hovering = signal<string | undefined>(undefined);\n  public hoverIndex = computed(() =>\n    this.navigation()?.value === this.hovering() ? (this.navigation()?.index ?? 0) : 0\n  );\n\n  scrollTo(type: string | undefined, index: number, usePassageHighlighter: boolean = false) {\n    // if previewData contains \"matchingpassages\" then we use the passage highlighter otherwise we use \"extractslocations\"\n    const category = type || this.previewService.highlightCategory;\n    this.previewService.events.set(\"scrollTo\");\n    this.previewService.sendMessage({ action: \"select\", id: `${category}_${index}`, usePassageHighlighter });\n  }\n\n  private navigate(entity: string, data: ArticleMetadata, direction: \"next\" | \"prev\") {\n    if (!data.count || data.count <= 0) {\n      warn(`Invalid count for entity ${entity}:`, data.count);\n      return;\n    }\n\n    const currentNavigation = this.navigation();\n    const isCurrentValue = currentNavigation?.value === data.value;\n\n    let newIndex: number;\n\n    if (direction === \"next\") {\n      newIndex = isCurrentValue && currentNavigation.index < data.count ? currentNavigation.index + 1 : 1;\n    } else {\n      newIndex = isCurrentValue && currentNavigation.index > 1 ? currentNavigation.index - 1 : data.count;\n    }\n\n    this.navigation.set({\n      value: data.value,\n      index: newIndex\n    });\n\n    const id = this.previewService.getEntityId(entity, data.value, newIndex - 1);\n\n    if (id !== undefined) {\n      this.scrollTo(entity, id);\n      debug(`${direction} navigation:`, {\n        id,\n        entity,\n        value: data.value,\n        index: newIndex,\n        totalCount: data.count\n      });\n    } else {\n      warn(`Unable to get ID for ${direction} navigation:`, { entity, value: data.value, index: newIndex });\n      notify.warning(`Unable to navigate to the ${direction} occurrence of \"${data.value}\".`);\n    }\n  }\n\n  navigateNext(entity: string, data: ArticleMetadata) {\n    this.navigate(entity, data, \"next\");\n  }\n\n  navigatePrev(entity: string, data: ArticleMetadata) {\n    this.navigate(entity, data, \"prev\");\n  }\n}\n","import { Component, DestroyRef, effect, inject, input, signal } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\nimport type { Article } from \"@sinequa/atomic\";\n\nimport { ChevronRightIcon, cn, ListItemComponent, SpinnerIcon, TagsIcon } from \"@sinequa/ui\";\nimport { PreviewService } from \"../../../services\";\nimport { ApplicationStore, Extract } from \"../../../stores\";\n\n@Component({\n  selector: \"article-extracts, ArticleExtracts, articleextracts\",\n  imports: [TranslocoPipe, ChevronRightIcon, ListItemComponent, TagsIcon, SpinnerIcon],\n  template: `\n    <details class=\"group\" name=\"advanced-search-panels\" open>\n      <summary [class]=\"cn('sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3', '')\">\n        <p class=\"flex items-baseline gap-2 font-semibold\">\n          <tags-icon />\n          {{ 'extracts' | transloco }}\n        </p>\n\n        <chevronright class=\"transition-transform duration-150 group-open:rotate-90\" />\n      </summary>\n\n      @if (loading()) {\n        <div class=\"flex h-32 items-center justify-center\">\n          <spinner-icon class=\"animate-spin text-primary\" />\n        </div>\n      } @else {\n        <ul class=\"space-y-2\">\n          @for (extract of extracts(); track $index) {\n            <li role=\"listitem\" class=\"mr-2 rounded px-2 py-1\" [id]=\"extract.id\" [attr.data-id]=\"extract.textIndex\">\n              <p class=\"cursor-pointer line-clamp-5\" role=\"button\" [innerHTML]=\"extract.text\" (click)=\"scrollTo(undefined, extract.textIndex, true)\"></p>\n            </li>\n          } @empty {\n            <li class=\"text-slate-300\">{{ 'drawers.noRelevantExtracts' | transloco }}</li>\n          }\n        </ul>\n      }\n    </details>\n  `\n})\nexport class ArticleExtracts {\n  cn = cn;\n  protected readonly destroyRef = inject(DestroyRef);\n\n  protected readonly applicationStore = inject(ApplicationStore);\n  protected readonly previewService = inject(PreviewService);\n\n  public readonly article = input.required<Article>();\n\n  loading = signal(true);\n\n  protected readonly extracts = signal<Extract[]>([]);\n\n  constructor() {\n    effect(() => {\n      this.loading.set(this.previewService.events() === \"fetching\");\n    });\n\n    effect(() => {\n      const { id } = this.article();\n\n      if (id && !this.loading()) {\n        this.extracts.set(this.applicationStore.getExtracts(id));\n      }\n    });\n  }\n\n  scrollTo(type: string | undefined, index: number, usePassageHighlighter: boolean = false) {\n    // if previewData contains \"matchingpassages\" then we use the passage highlighter otherwise we use \"extractslocations\"\n    const category = type || this.previewService.highlightCategory;\n    this.previewService.events.set(\"scrollTo\");\n    this.previewService.sendMessage({ action: \"select\", id: `${category}_${index}`, usePassageHighlighter });\n  }\n}\n","import { Component, computed, inject, input } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport type { Article } from \"@sinequa/atomic\";\nimport { ChevronRightIcon, TagsIcon } from \"@sinequa/ui\";\nimport { MetadataComponent } from \"../../../components\";\nimport { AppStore } from \"../../../stores\";\n\n@Component({\n  selector: \"article-labels, ArticleLabels, articlelabels\",\n  imports: [TranslocoPipe, MetadataComponent, ChevronRightIcon, TagsIcon],\n  template: `\n    @if (hasLabels()) {\n      <details class=\"group\" name=\"advanced-search-panels\">\n        <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3\">\n          <p class=\"flex items-baseline gap-2 font-semibold\">\n            <tags-icon />\n            {{ 'labels' | transloco }}\n          </p>\n\n          <chevronright class=\"transition-transform duration-150 group-open:rotate-90\" />\n        </summary>\n\n        <div>\n          <ul class=\"mt-4 flex flex-col flex-wrap gap-2\">\n            <li>\n              <Metadata [article]=\"article()!\" [metadata]=\"labels.public\" />\n            </li>\n\n            <li>\n              <Metadata [article]=\"article()!\" [metadata]=\"labels.private\" />\n            </li>\n          </ul>\n        </div>\n      </details>\n    }\n  `\n})\nexport class ArticleLabels {\n  protected readonly labels = inject(AppStore).getLabels();\n\n  public readonly article = input.required<Article>();\n\n  public readonly hasLabels = computed(() => {\n    const article = this.article();\n    const articleRecord = article as Record<string, unknown>;\n    const publicLabels = articleRecord[this.labels.public] as string[] | undefined;\n    const privateLabels = articleRecord[this.labels.private] as string[] | undefined;\n    return (publicLabels && publicLabels.length > 0) || (privateLabels && privateLabels.length > 0);\n  });\n}\n","import { Component, computed, inject, input, output, resource } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { type Article, fetchSimilarDocuments } from \"@sinequa/atomic\";\nimport { ChevronRightIcon, ListItemComponent, TagsIcon } from \"@sinequa/ui\";\n\nimport { SourceComponent } from \"../../../components\";\nimport { SelectionStrategy } from \"../../../directives\";\nimport { SelectArticleDirective } from \"../../../directives/select-article.directive\";\nimport { QueryParamsStore } from \"../../../stores\";\n\n@Component({\n  selector: \"article-similar-documents, ArticleSimilarDocuments, articlesimilardocuments\",\n  imports: [TranslocoPipe, SourceComponent, ListItemComponent, ChevronRightIcon, SelectArticleDirective, TagsIcon],\n  template: `\n    @if (similarDocuments().length > 0) {\n      <details class=\"group\" name=\"advanced-search-panels\">\n        <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3\">\n          <p class=\"flex items-baseline gap-2 font-semibold\">\n            <tags-icon />\n            {{ 'drawers.similarDocuments' | transloco }}\n          </p>\n\n          <chevronright class=\"transition-transform duration-150 group-open:rotate-90\" />\n        </summary>\n\n        <div>\n          <ul class=\"mb-2 mt-4 flex flex-col flex-wrap px-2\" role=\"list\">\n            @for (document of similarDocuments(); track $index) {\n              <li role=\"listitem\" selectArticle [article]=\"document\" [strategy]=\"strategy()\" (selected)=\"selected.emit(document)\">\n                <div class=\"flex size-5 items-center justify-center rounded-full\">\n                  <source [collection]=\"article().collection\" [connector]=\"article().connector\" class=\"text-xs\" />\n                </div>\n\n                <span>{{ document.displayTitle ?? document.title }}</span>\n              </li>\n            }\n          </ul>\n        </div>\n      </details>\n    }\n  `\n})\nexport class ArticleSimilarDocuments {\n  protected readonly queryParamsStore = inject(QueryParamsStore);\n\n  public readonly article = input.required<Article>();\n  public readonly strategy = input<SelectionStrategy>(\"replace\");\n\n  public readonly selected = output<Article>();\n\n  queryName = computed(() => this.queryParamsStore.getQuery().name);\n\n  readonly similarDocumentsResource = resource({\n    params: () => {\n      const { id } = this.article() || {};\n      return { id };\n    },\n    loader: ({ params: { id }, abortSignal }) => {\n      const queryName = this.queryName();\n      return fetchSimilarDocuments(id, queryName, abortSignal);\n    },\n    defaultValue: [] as Article[]\n  });\n\n  protected readonly similarDocuments = computed(() => {\n    if (this.similarDocumentsResource.hasValue()) {\n      return this.similarDocumentsResource.value() || [];\n    }\n    return [];\n  });\n}\n","import { Component, computed, inject, input, linkedSignal, output } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { Article } from \"@sinequa/atomic\";\nimport { ButtonComponent, cn, MagnifyingGlassIcon, XMarkIcon } from \"@sinequa/ui\";\nimport { SelectionStrategy } from \"../../directives\";\nimport { QueryParamsStore, SelectionStore } from \"../../stores\";\nimport { ArticleEntities } from \"./panels/article-entities\";\nimport { ArticleExtracts } from \"./panels/article-extracts\";\nimport { ArticleLabels } from \"./panels/article-labels\";\nimport { ArticleSimilarDocuments } from \"./panels/article-similar-documents\";\n\n@Component({\n  selector: \"advanced-search\",\n  standalone: true,\n  providers: [provideTranslocoScope(\"drawers\")],\n  templateUrl: \"./advanced-search.html\",\n  styles: [\n    `\n      :host {\n        /* disable default max-height for panel */\n        --panel-max-height: none;\n      }\n      /* Hides cancel button from input that as type='search' */\n      input[type='search']::-webkit-search-cancel-button {\n        -webkit-appearance: none;\n      }\n    `\n  ],\n  imports: [\n    FormsModule,\n    ButtonComponent,\n    TranslocoPipe,\n    ArticleExtracts,\n    ArticleEntities,\n    ArticleLabels,\n    ArticleSimilarDocuments,\n    XMarkIcon,\n    MagnifyingGlassIcon\n]\n})\nexport class AdvancedSearch {\n  cn = cn;\n\n  public readonly article = input.required<Article>();\n  public readonly previewStrategy = input<SelectionStrategy>(\"replace\");\n\n  public readonly selected = output<Article>();\n\n  protected readonly selectionStore = inject(SelectionStore);\n  protected readonly queryParamsStore = inject(QueryParamsStore);\n\n  protected readonly queryText = linkedSignal({\n    source: () => {\n      const { queryText } = getState(this.selectionStore);\n      return queryText;\n    },\n    computation: (queryText) => {\n      const text = queryText || \"\";\n      return text ? text.trim() : \"\";\n    }\n  });\n\n  queryName = computed(() => this.queryParamsStore.getQuery().name);\n\n  protected executeSearch(): void {\n    this.selectionStore.update({ queryText: this.queryText() });\n  }\n\n  protected clearInput(): void {\n    this.queryText.set(\"\");\n  }\n}\n","@if (article()) {\r\n  <div\r\n    [class]=\"\r\n      cn(\r\n        'scroll-stable flex flex-col overflow-x-hidden overflow-y-auto pr-3 pb-6 pl-6',\r\n        '[&_details]:border-muted-foreground/18 [&_details]:border-b',\r\n        '[&_details>summary]:bg-menu [&_details_details]:last:border-b-0',\r\n        '[&_details>summary>i>svg]:transition-transform [&_details>summary>i>svg]:duration-300',\r\n        '[&>details>summary>i>svg]:group-open/parent:rotate-180'\r\n      )\r\n    \">\r\n    <section class=\"mt-6 mb-4 flex w-full flex-col gap-6\">\r\n      <header\r\n        id=\"panel-control\"\r\n        class=\"focus-within:outline-primary not-focus-within:hover:outline-muted-foreground group flex rounded-2xl focus-within:outline hover:outline\">\r\n        <div\r\n          class=\"inline-flex grow items-center rounded-s-lg rounded-e-none ps-3\">\r\n          <input\r\n            id=\"advanced-search-input\"\r\n            type=\"search\"\r\n            class=\"w-2/3 grow focus:outline-none\"\r\n            autocomplete=\"off\"\r\n            spellcheck=\"false\"\r\n            [attr.placeholder]=\"'drawers.inputPlaceholder' | transloco\"\r\n            [attr.aria-label]=\"'drawers.inputPlaceholder' | transloco\"\r\n            [ngModel]=\"queryText()\"\r\n            (ngModelChange)=\"queryText.set($event)\"\r\n            (keydown.enter)=\"executeSearch()\" />\r\n\r\n          @if (queryText() !== \"\") {\r\n            <button\r\n              variant=\"icon\"\r\n              size=\"xs\"\r\n              [attr.title]=\"'clear' | transloco\"\r\n              [attr.aria-label]=\"'clear' | transloco\"\r\n              (click)=\"clearInput()\"\r\n              (keydown.enter)=\"clearInput()\">\r\n              <xmark-icon />\r\n              <span class=\"sr-only\">{{ \"clear\" | transloco }}</span>\r\n            </button>\r\n          }\r\n        </div>\r\n\r\n        <button\r\n          class=\"size-8 rounded-s-none rounded-e-lg\"\r\n          [disabled]=\"queryText() === '' || null\"\r\n          [attr.title]=\"'search' | transloco\"\r\n          [attr.aria-label]=\"'search' | transloco\"\r\n          (click)=\"executeSearch()\">\r\n          <magnifying-glass-icon />\r\n          <span class=\"sr-only\">{{ \"search\" | transloco }}</span>\r\n        </button>\r\n      </header>\r\n    </section>\r\n\r\n    <!-- the same name is used everywhere to simulate an accordion -->\r\n    <!-- extracts -->\r\n    <article-extracts [article]=\"article()\" />\r\n\r\n    <!-- labels -->\r\n    <article-labels [article]=\"article()\" />\r\n\r\n    <!-- entities -->\r\n    <article-entities [article]=\"article()\" />\r\n\r\n    <!-- similar documents -->\r\n    <article-similar-documents\r\n      [article]=\"article()\"\r\n      [strategy]=\"previewStrategy()\"\r\n      (selected)=\"selected.emit($event)\" />\r\n  </div>\r\n}\r\n","import { Query, QueryParams } from '@sinequa/atomic';\n\nexport namespace Alert {\n  export enum Frequency {\n    Daily,\n    Hourly,\n    Immediate,\n    Weekly,\n    Monthly\n  }\n\n  export enum Days {\n    None = 0x00,\n    Monday = 0x01,\n    Tuesday = 0x02,\n    Wednesday = 0x04,\n    Thursday = 0x08,\n    Friday = 0x10,\n    Saturday = 0x20,\n    Sunday = 0x40,\n    AllDays = Monday | Tuesday | Wednesday | Thursday | Friday | Saturday | Sunday,\n    WeekDays = Monday | Tuesday | Wednesday | Thursday | Friday\n  }\n}\n\nexport type Alert = {\n  name: string;\n  description?: string;\n  query: Query;\n  timezone: string;\n  timezoneOffset?: string;\n  frequency: Alert.Frequency;\n  days: Alert.Days;\n  interval: number; // every \"n\"...\n  index: number; // day of month\n  times: string; //times: number[]; // offsets from 00:00 in milliseconds\n  active: boolean;\n  combine: boolean;\n  respectTabSelection: boolean;\n  appQueryUrl?: string; // the URL reference the query of the Alert in the SBA.\n};\n\nexport type Bookmark = {\n  id: string;\n  queryName?: string;\n  label?: string;\n  source?: string;\n  sourceIconClass?: string;\n  author?: string;\n  parentFolder?: string;\n  parentFolderIconClass?: string;\n};\n\nexport type AgentUserSettings = {\n  isDebugMode: boolean;\n};\n\nexport type SearchItem = {\n  url: string; // URL of the search (complete with query parameters) can be used to be shared\n  path: string; // Path of the search (used by the router link)\n  display: string; // Display name of the search\n  label?: string; // Label of the search\n  filterCount?: number; // Number of filters applied to the search\n  date: string; // Date of the search\n  queryParams?: QueryParams; // Query parameters of the search\n};\nexport type Basket = { name: string; description?: string; ids?: string[] };\n\nexport type UserSettingsState = {\n  bookmarks: Bookmark[];\n  recentSearches: SearchItem[];\n  savedSearches: SearchItem[];\n  baskets: Basket[];\n  alerts: Alert[];\n  assistants: Record<string, unknown>;\n  collapseAssistant?: boolean;\n  language?: string;\n  userTheme?: 'dark' | 'light' | 'system';\n  agents?: AgentUserSettings;\n};\n\nexport type SearchesConfig = {\n  itemsPerPage?: number;\n  showLoadMore?: boolean;\n  routerLink?: string;\n};\n","import { Component, computed, inject, output, signal, viewChild } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\nimport {\n  ButtonComponent,\n  ChevronRightIcon,\n  CircleCheckIcon,\n  DialogComponent,\n  DialogContentComponent,\n  DialogEvent,\n  DialogFooterComponent,\n  DialogHeaderComponent,\n  DialogInterface,\n  DialogTitleComponent,\n  InputComponent,\n  LoadingCircleIcon,\n  SelectOptionDirective\n} from \"@sinequa/ui\";\nimport { LegacyFilter } from \"@sinequa/atomic\";\nimport { firstValueFrom } from \"rxjs\";\n\nimport { Alert } from \"../../../models\";\nimport { QueryService } from \"../../../services\";\nimport { QueryParamsStore, UserSettingsStore } from \"../../../stores\";\n\n@Component({\n  selector: \"alert-dialog, alertdialog, AlertDialog\",\n  standalone: true,\n  imports: [\n    FormsModule,\n    TranslocoPipe,\n    ButtonComponent,\n    DialogComponent,\n    DialogHeaderComponent,\n    DialogTitleComponent,\n    DialogContentComponent,\n    DialogFooterComponent,\n    InputComponent,\n    ChevronRightIcon,\n    LoadingCircleIcon,\n    CircleCheckIcon,\n    SelectOptionDirective\n  ],\n  providers: [provideTranslocoScope(\"alerts\")],\n  template: `\n    <dialog #dialog>\n      <DialogContent class=\"sm:max-w-[520px]\">\n        <DialogHeader>\n          <DialogTitle>{{ 'alerts.createAlert' | transloco }}</DialogTitle>\n        </DialogHeader>\n        <div class=\"mb-2\">\n          <label for=\"alertName\" class=\"text-muted-foreground mb-1 block text-sm font-medium\">{{ 'alerts.alertName' | transloco }}</label>\n          <input\n            id=\"alertName\"\n            name=\"alertName\"\n            type=\"text\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n            [attr.aria-label]=\"'alerts.alertName' | transloco\"\n            [attr.placeholder]=\"'alerts.placeholder' | transloco\"\n            [ngModel]=\"alertName()\"\n            (ngModelChange)=\"alertName.set($event)\" />\n        </div>\n\n        <div class=\"mb-2\">\n          <label class=\"text-muted-foreground mb-1 block text-sm font-medium\" for=\"frequency\">{{ 'alerts.alertFrequency' | transloco }}</label>\n          <div class=\"relative\">\n            <select\n              id=\"frequency\"\n              name=\"frequency\"\n              class=\"hover:outline-primary focus:outline-primary border-foreground/18 h-8 w-full appearance-none rounded-md border px-2 pr-8 hover:outline focus:outline\"\n              id=\"alertFrequency\"\n              [ngModel]=\"alertFrequency()\"\n              (ngModelChange)=\"alertFrequency.set($event)\">\n              @for (frequencyValue of frequencies; track $index) {\n                <option [value]=\"frequencyValue\">{{ 'alerts.frequency.' + frequency[frequencyValue] | transloco }}</option>\n              }\n            </select>\n            <ChevronRightIcon\n              width=\"16\"\n              height=\"16\"\n              class=\"text-muted-foreground pointer-events-none absolute right-3 top-1/2 -translate-y-1/2 rotate-90 transform\" />\n          </div>\n        </div>\n\n        <div class=\"mb-2\">\n          <p class=\"text-muted-foreground mb-2 block text-sm font-medium\">{{ 'alerts.repeatOn' | transloco }}</p>\n          <div class=\"weekdays-grid gap-1.5 px-2.5 py-0\">\n            @for (day of weekdays; track $index) {\n              <div>\n                <input class=\"me-1\" type=\"checkbox\" id=\"day_{{ day.value }}\" [checked]=\"dayChecked(day.value)\" (change)=\"dayChange($event, day.value)\" />\n                <label role=\"button\" for=\"day_{{ day.value }}\" class=\"form-check-label user-select-none cursor-pointer\">\n                  {{ 'alerts.weekdays.' + day.key | transloco }}\n                </label>\n              </div>\n            }\n          </div>\n        </div>\n\n        <div class=\"mb-6\">\n          <label class=\"text-muted-foreground mb-1 block text-sm font-medium\" for=\"alertTimes\">Time</label>\n          <input\n            type=\"time\"\n            id=\"alertTimes\"\n            name=\"alertTimes\"\n            class=\"inline-block w-full\"\n            autocomplete=\"off\"\n            spellcheck=\"off\"\n            [value]=\"alertTimes()\"\n            [ngModel]=\"alertTimes()\"\n            (ngModelChange)=\"alertTimes.set($event)\" />\n        </div>\n\n        <div class=\"mb-6\">\n          <input class=\"me-1\" type=\"checkbox\" id=\"alertActive\" [checked]=\"alertActive()\" (change)=\"alertActive.set(!alertActive())\" />\n          <label role=\"button\" for=\"alertActive\" class=\"form-check-label user-select-none cursor-pointer\">{{ 'alerts.alertActive' | transloco }}</label>\n        </div>\n\n      <DialogFooter class=\"flex-col\">\n        @if (alert || canUpdateQuery()) {\n          <div class=\"flex w-full flex-col gap-2\">\n            @if (alert) {\n              <button variant=\"outline\" (click)=\"execute()\" [disabled]=\"!canUpdateQuery()\">\n                {{ 'alerts.execute' | transloco }}\n              </button>\n            }\n            @if (canUpdateQuery()) {\n              <button [disabled]=\"updateStatus() !== 'idle'\" variant=\"outline\" (click)=\"updateQuery()\">\n              @switch (updateStatus()) {\n                  @case ('updating') {\n                    <LoadingCircle class=\"size-4 animate-spin\" width=\"16\" height=\"16\" />\n                    {{ 'alerts.updateQuery' | transloco }}\n                  }\n                  @case ('updated') {\n                    <CircleCheck width=\"16\" height=\"16\" />\n                    {{ 'alerts.queryUpdated' | transloco }}\n                  }\n                  @default {\n                    {{ 'alerts.updateQuery' | transloco }}\n                  }\n                }\n              </button>\n            }\n          </div>\n        }\n        <div class=\"ml-auto flex justify-end gap-2\">\n          <button variant=\"outline\" (click)=\"dialog.cancel()\">\n            {{ 'cancel' | transloco }}\n          </button>\n          <button (click)=\"confirm()\" [disabled]=\"invalidForm()\">\n            {{ 'confirm' | transloco }}\n          </button>\n        </div>\n      </DialogFooter>\n      </DialogContent>\n    </dialog>\n  `,\n  styles: `\n    .weekdays-grid {\n      display: grid;\n      grid-template-columns: repeat(auto-fill, minmax(100px, 1fr));\n    }\n  `\n})\nexport class AlertDialog implements DialogInterface {\n  private readonly queryService = inject(QueryService);\n  private readonly queryParamsStore = inject(QueryParamsStore);\n  private readonly userSettingsStore = inject(UserSettingsStore);\n  readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n  frequencies = [Alert.Frequency.Daily, Alert.Frequency.Hourly, Alert.Frequency.Immediate];\n  frequency = Alert.Frequency;\n  weekdays = [\n    { key: \"monday\", value: Alert.Days.Monday },\n    { key: \"tuesday\", value: Alert.Days.Tuesday },\n    { key: \"wednesday\", value: Alert.Days.Wednesday },\n    { key: \"thursday\", value: Alert.Days.Thursday },\n    { key: \"friday\", value: Alert.Days.Friday },\n    { key: \"saturday\", value: Alert.Days.Saturday },\n    { key: \"sunday\", value: Alert.Days.Sunday }\n  ];\n\n  index?: number;\n  alert?: Alert;\n\n  alertName = signal<string>(\"\");\n  alertFrequency = signal<Alert.Frequency>(Alert.Frequency.Daily);\n  alertDays = signal<Alert.Days>(Alert.Days.None);\n  alertTimes = signal<string>(\"09:00\");\n  alertActive = signal<boolean>(true);\n  canUpdateQuery = signal<boolean>(false);\n\n  updateStatus = signal<\"updating\" | \"updated\" | \"idle\">(\"idle\");\n\n  invalidForm = computed(() => !this.alertName().trim() || !this.alertTimes());\n\n  closed = output<DialogEvent>();\n\n  open(index: number): void {\n    this.showModal(index);\n  }\n\n  async showModal(index?: number) {\n    this.index = index;\n\n    if (index !== undefined) {\n      this.alert = this.userSettingsStore.alerts()[index];\n      if (this.alert) {\n        this.alertName.set(this.alert.name);\n        this.alertFrequency.set(this.alert.frequency);\n        this.alertDays.set(this.alert.days);\n        this.alertTimes.set(this.alert.times);\n        this.alertActive.set(this.alert.active);\n\n        const q = this.queryParamsStore.getQuery();\n        const response = await firstValueFrom(this.queryService.search(q, false));\n        this.canUpdateQuery.set(response.records?.length > 0);\n      }\n    } else {\n      this.alertName.set(\"\");\n      this.alertFrequency.set(Alert.Frequency.Daily);\n      this.alertDays.set(Alert.Days.None);\n      this.alertTimes.set(\"09:00\");\n      this.alertActive.set(true);\n    }\n\n    this.dialog()?.open();\n  }\n\n  async confirm(): Promise<void> {\n    if (this.alert) {\n      this.update();\n    } else {\n      this.create();\n    }\n    this.dialog()?.close();\n  }\n\n  private async create(): Promise<void> {\n    const alert: Alert = {\n      name: this.alertName().trim(),\n      description: \"\",\n      timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,\n      query: this.queryParamsStore.getQuery(),\n      frequency: this.alertFrequency(),\n      days: this.alertDays(),\n      interval: 1,\n      index: 1,\n      times: this.alertTimes(),\n      active: this.alertActive(),\n      combine: true,\n      respectTabSelection: false\n    };\n\n    this.userSettingsStore.createAlert(alert);\n  }\n\n  private async update(): Promise<void> {\n    if (!this.alert || this.index === undefined) return;\n\n    this.alert.name = this.alertName().trim();\n    this.alert.frequency = this.alertFrequency();\n    this.alert.days = this.alertDays();\n    this.alert.times = this.alertTimes();\n    this.alert.active = this.alertActive();\n\n    this.userSettingsStore.updateAlert(this.alert, this.index);\n  }\n\n  dayChecked(day: Alert.Days): boolean {\n    return (this.alertDays() & day) !== 0;\n  }\n\n  dayChange(event: Event, day: Alert.Days) {\n    const input = event.target as HTMLInputElement;\n    if (input.checked) {\n      this.alertDays.set(this.alertDays() | day);\n    } else {\n      this.alertDays.set(this.alertDays() & ~day);\n    }\n  }\n\n  updateQuery() {\n    if (!this.alert || this.index === undefined) return;\n\n    this.updateStatus.set(\"updating\");\n    this.alert.query = this.queryParamsStore.getQuery();\n    this.userSettingsStore\n      .updateAlert(this.alert, this.index)\n      .then(() => {\n        setTimeout(() => {\n          this.updateStatus.set(\"updated\");\n        }, 500); // 500ms delay before setting to 'updated'\n      })\n      .then(() => {\n        setTimeout(() => {\n          this.updateStatus.set(\"idle\");\n        }, 2000);\n      });\n  }\n\n  execute() {\n    if (!this.alert) return;\n    const q = this.alert.query;\n    // `q.filters` widened to `Filter[] | LegacyFilter[]` upstream, but the\n    // query-params store deliberately deals in `LegacyFilter[]` only.\n    const filters = Array.isArray(q.filters) ? (q.filters as LegacyFilter[]) : undefined;\n    this.queryParamsStore.patch({ text: q.text, tab: q.tab, basket: q.basket, sort: q.sort, filters, name: q.name });\n    this.dialog()?.close();\n  }\n}\n","import { CdkDragDrop, DragDropModule } from '@angular/cdk/drag-drop';\nimport { Component, computed, effect, inject, signal, viewChild } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe } from '@jsverse/transloco';\n\nimport { Query } from '@sinequa/atomic';\nimport { BarsIcon, BellIcon, ButtonComponent, DialogService, ListItemComponent, PopoverComponent, Separator, TrashIcon } from '@sinequa/ui';\n\nimport { Alert } from '../../models';\nimport { UserSettingsStore } from '../../stores';\nimport { buildQuery } from '../../utils';\nimport { AlertDialog } from './dialogs/alert.dialog';\n\n@Component({\n  selector: 'Alerts',\n  standalone: true,\n  imports: [TranslocoPipe, ButtonComponent, ListItemComponent, DragDropModule, Separator, BellIcon, TrashIcon, BarsIcon],\n  templateUrl: './alerts.html',\n  providers: [provideTranslocoScope('alerts')]\n})\nexport class AlertsComponent {\n  floating = inject(PopoverComponent, { skipSelf: true, optional: true });\n  private readonly userSettingsStore = inject(UserSettingsStore);\n  modal = inject(DialogService);\n\n  readonly alertFormDialog = viewChild(AlertDialog);\n\n  reordering = signal<boolean>(false);\n  protected alerts = computed<Alert[]>(() => this.userSettingsStore.alerts());\n\n  tmpAlerts: Alert[] = [];\n  query: Query;\n\n  constructor() {\n    this.query = buildQuery();\n\n    effect(() => {\n      this.tmpAlerts = this.alerts()?.map(a => Object.assign({}, a));\n    });\n  }\n\n  onClick(index: number): void {\n    this.floating?.close();\n    this.modal.open(AlertDialog, index).then(v => console.log('result', v));\n  }\n\n  createAlert(): void {\n    this.floating?.close();\n    this.modal.open(AlertDialog).then(v => console.log('result', v));\n  }\n\n  deleteAlert(event: Event, index: number) {\n    event.stopPropagation();\n    this.userSettingsStore.deleteAlert(index);\n  }\n\n  async reorder() {\n    if (this.reordering()) {\n      await this.userSettingsStore.updateAlerts(this.tmpAlerts);\n      this.reordering.set(false);\n    } else {\n      this.reordering.set(true);\n    }\n  }\n\n  dropped(drop: CdkDragDrop<Alert[]>) {\n    if (drop.currentIndex === drop.previousIndex) {\n      return;\n    }\n    this.tmpAlerts.splice(drop.currentIndex, 0, this.tmpAlerts.splice(drop.previousIndex, 1)[0]);\n  }\n}\n","<ul\r\n  role=\"list\"\r\n  class=\"flex min-w-80 flex-col p-2\"\r\n  cdkDropList\r\n  [cdkDropListData]=\"tmpAlerts\"\r\n  [cdkDropListDisabled]=\"!reordering()\"\r\n  (cdkDropListDropped)=\"dropped($event)\">\r\n  @if (floating) {\r\n    <label class=\"text-xl font-bold\">{{ \"alerts.label\" | transloco }}</label>\r\n    <Separator />\r\n  }\r\n  @for (alert of tmpAlerts; track $index) {\r\n    <li\r\n      role=\"listitem\"\r\n      class=\"group h-10\"\r\n      tabindex=\"0\"\r\n      cdkDrag\r\n      (click)=\"onClick($index)\"\r\n      (keydown.enter)=\"onClick($index)\">\r\n      <bell-icon class=\"shrink-0\" />\r\n      <p class=\"line-clamp-1\">{{ alert.name }}</p>\r\n      @if (!reordering()) {\r\n        @let openBookmark = \"bookmarks.openBookmark\" | transloco;\r\n        <button\r\n          variant=\"ghost\"\r\n          [iconOnly]=\"true\"\r\n          title=\"{{ openBookmark }}\"\r\n          class=\"text-destructive ms-auto group-hover:visible\"\r\n          [attr.title]=\"openBookmark\"\r\n          [attr.aria-label]=\"openBookmark\"\r\n          (click)=\"deleteAlert($event, $index)\">\r\n          <TrashIcon />\r\n        </button>\r\n      } @else {\r\n        <bars-icon class=\"ms-auto\" />\r\n      }\r\n    </li>\r\n  } @empty {\r\n    <span class=\"py-4 text-center text-neutral-500\">\r\n      {{ \"alerts.noAlerts\" | transloco }}\r\n    </span>\r\n  }\r\n</ul>\r\n<div class=\"flex flex-col gap-2 p-2\">\r\n  <button\r\n    variant=\"outline\"\r\n    class=\"w-full\"\r\n    tabindex=\"0\"\r\n    [attr.title]=\"'alerts.manageAlerts' | transloco\"\r\n    [disabled]=\"!alerts().length\"\r\n    (click)=\"reorder()\">\r\n    {{ (reordering() ? \"save\" : \"alerts.manageAlerts\") | transloco }}\r\n  </button>\r\n  <button\r\n    class=\"w-full\"\r\n    [attr.title]=\"'alerts.createAlert' | transloco\"\r\n    (click)=\"createAlert()\">\r\n    {{ \"alerts.createAlert\" | transloco }}\r\n  </button>\r\n</div>\r\n","import { A11yModule } from \"@angular/cdk/a11y\";\nimport { Location } from \"@angular/common\";\nimport { Component, computed, inject, input, model, output, signal } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { Router } from \"@angular/router\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\nimport {\n  ChangePasswordResponse,\n  fetchChangePassword,\n  globalConfig,\n  isAuthenticated,\n  login,\n  logout,\n  notify,\n  warn\n} from \"@sinequa/atomic\";\nimport { ButtonComponent, CardComponent, CardContentComponent, CardFooterComponent, CardHeaderComponent, InputGroupAddonComponent, InputGroupComponent, InputGroupInput, EyeSlashIcon, EyeIcon } from \"@sinequa/ui\";\nimport { ApplicationService, AuditService } from \"../../../services\";\nimport { PrincipalStore } from \"../../../stores\";\nimport { getState } from \"@ngrx/signals\";\n\n@Component({\n  selector: \"change-password, ChangePassword, changepassword\",\n  providers: [provideTranslocoScope(\"login\")],\n  imports: [\n    FormsModule,\n    A11yModule,\n    TranslocoPipe,\n    ButtonComponent,\n    CardComponent,\n    CardHeaderComponent,\n    CardContentComponent,\n    CardFooterComponent,\n    InputGroupInput,\n    InputGroupComponent,\n    InputGroupAddonComponent,\n    EyeSlashIcon,\n    EyeIcon\n],\n  template: `\n    <Card hover=\"no\" cdkTrapFocus cdkTrapFocusAutoCapture=\"true\" class=\"bg-card rounded-xl shadow-sm\">\n      <CardHeader class=\"flex flex-col items-center gap-3\">\n        <img class=\"h-12 content-(--logo-large)\" alt=\"logo\" />\n      </CardHeader>\n\n      <CardContent class=\"grid gap-4\">\n\n        @if (alert()) {\n          <div class=\"p-4 w-full bg-destructive/20 border-destructive\">\n            {{ alert() | transloco }}\n          </div>\n        }\n\n        <!-- Current password -->\n        <div class=\"grid gap-2\">\n          <label class=\"text-sm font-medium\" for=\"auth-current-password\">\n            {{ 'login.currentPassword' | transloco }}\n          </label>\n          <InputGroup class=\"group/item\">\n            <input\n              input-group\n              id=\"auth-current-password\"\n              [type]=\"currentPasswordType\"\n              required\n              [(ngModel)]=\"currentPassword\"\n              (keydown.enter)=\"changePassword()\"\n            />\n            <InputGroupAddon align=\"inline-end\"\n              (click)=\"currentPasswordType = (currentPasswordType === 'password' ? 'text' : 'password')\">\n              @if(currentPasswordType === 'text') {\n                <eye-slash-icon class=\"cursor-pointer\" />\n              } @else {\n                <eye-icon class=\"cursor-pointer\" />\n              }\n            </InputGroupAddon>\n          </InputGroup>\n        </div>\n\n        <!-- New password -->\n        <div class=\"grid gap-2\">\n          <label class=\"text-sm font-medium\" for=\"auth-new-password\">\n            {{ 'login.newPassword' | transloco }}\n          </label>\n          <InputGroup class=\"group/item\">\n            <input\n              input-group\n              id=\"auth-new-password\"\n              [type]=\"newPasswordType\"\n              required\n              [(ngModel)]=\"newPassword\"\n              (keydown.enter)=\"changePassword()\"\n            />\n            <InputGroupAddon align=\"inline-end\"\n              (click)=\"newPasswordType = (newPasswordType === 'password' ? 'text' : 'password')\">\n              @if(newPasswordType === 'text') {\n                <eye-slash-icon class=\"cursor-pointer\" />\n              } @else {\n                <eye-icon class=\"cursor-pointer\" />\n              }\n            </InputGroupAddon>\n          </InputGroup>\n        </div>\n\n        <!-- Confirm -->\n        <div class=\"grid gap-2\">\n          <label class=\"text-sm font-medium\" for=\"auth-confirm-password\">\n            {{ 'login.confirmPassword' | transloco }}\n          </label>\n          <InputGroup class=\"group/item\">\n            <input\n              input-group\n              id=\"auth-confirm-password\"\n              [ariaInvalid]=\"confirmInvalid()\"\n              [type]=\"confirmPasswordType\"\n              required\n              [(ngModel)]=\"confirmPassword\"\n              (keydown.enter)=\"changePassword()\"\n            />\n            <InputGroupAddon align=\"inline-end\"\n              (click)=\"confirmPasswordType = (confirmPasswordType === 'password' ? 'text' : 'password')\">\n              @if(confirmPasswordType === 'text') {\n                <eye-slash-icon class=\"cursor-pointer\" />\n              } @else {\n                <eye-icon class=\"cursor-pointer\" />\n              }\n            </InputGroupAddon>\n          </InputGroup>\n          @if (confirmInvalid()) {\n            <p class=\"text-sm font-medium text-destructive\" for=\"auth-confirm-password\">\n              {{ 'login.differentPasswords' | transloco }}\n            </p>\n          }\n        </div>\n      </CardContent>\n\n      <CardFooter class=\"mt-8 flex justify-end gap-3\">\n        <button variant=\"ghost\" (click)=\"onCancel()\">\n          {{ 'cancel' | transloco }}\n        </button>\n        <button\n          [disabled]=\"!valid() || pending()\"\n          (click)=\"changePassword()\"\n        >\n          {{ 'login.confirm' | transloco }}\n        </button>\n      </CardFooter>\n    </Card>\n  `,\n  styles: `input::-ms-reveal { display: none; }`\n})\nexport class ChangePasswordComponent {\n  readonly success = output<void>();\n  readonly cancel = output<void>();\n\n  username = input<string | null>(null);\n  alert = input<string | undefined>(undefined);\n  redirectAfterSuccess = input<boolean>(true);\n  redirectAfterCancel = input<boolean>(true);\n\n  private readonly transloco = inject(TranslocoService);\n  private readonly router = inject(Router);\n  private readonly principalStore = inject(PrincipalStore);\n  private readonly applicationService = inject(ApplicationService);\n  private readonly location = inject(Location);\n  private readonly auditService = inject(AuditService);\n\n  currentPassword = model<string>(\"\");\n\n  newPassword = model<string>(\"\");\n  confirmPassword = model<string>(\"\");\n  pending = signal(false);\n  errorMsg = signal<string | null>(null);\n\n  currentPasswordType = \"password\";\n  newPasswordType = \"password\";\n  confirmPasswordType = \"password\";\n\n  valid = computed(\n    () =>\n      this.currentPassword().length > 0 &&\n      this.newPassword().length > 0 &&\n      this.confirmPassword().length > 0 &&\n      this.newPassword() === this.confirmPassword()\n  );\n\n  confirmInvalid = computed(\n    () => !!this.newPassword() && !!this.confirmPassword() && this.newPassword() !== this.confirmPassword()\n  );\n\n  readonly effectiveUsername = computed(() => {\n    const fromInput = this.username();\n    if (fromInput?.trim()) return fromInput.trim();\n\n    if (isAuthenticated()) {\n      const p = getState(this.principalStore);\n      const name = p.name.trim();\n      if (name) return name;\n    }\n    return null;\n  });\n\n  private async clearLocalAuthState() {\n    try {\n      await logout(); // clear old token AFTER change\n    } catch (e) {\n      warn(\"[ChangePassword] clearLocalAuthState error\", e);\n    }\n  }\n\n  async changePassword() {\n    if (!this.valid()) return;\n    this.pending.set(true);\n    this.errorMsg.set(null);\n\n    try {\n      const res: ChangePasswordResponse = await fetchChangePassword(this.newPassword(), this.currentPassword());\n\n      const ok = res.success ?? true;\n\n      if (!ok) {\n        const msg: string = res.message ?? this.transloco.translate(\"login.passwordChangeFailed\");\n\n        this.errorMsg.set(msg);\n        notify.error(msg, { duration: 2500 });\n        this.auditService.notify({ type: 'Change_Password_Failed' });\n        return;\n      }\n\n      notify.success(this.transloco.translate(\"login.passwordChanged\"), {\n        duration: 2000\n      });\n      this.auditService.notify({ type: 'Change_Password_Success_Form' });\n      const username = this.effectiveUsername();\n      if (!username) {\n        notify.info(this.transloco.translate(\"login.loginAfterPasswordChangeMissingUser\"), { duration: 3000 });\n        this.router.navigate([\"/login\"]);\n        return;\n      }\n      await this.clearLocalAuthState();\n\n      const loggedIn = await login({\n        username,\n        password: this.newPassword()\n      }).catch(() => false);\n\n      if (!loggedIn) {\n        const msg = this.transloco.translate(\"login.loginAfterPasswordChangeFailed\");\n        notify.error(msg, { duration: 3000 });\n        this.router.navigate([\"/login\"], { queryParams: { username } });\n        return;\n      }\n\n      if (this.redirectAfterSuccess()) {\n        const { createRoutes = true } = globalConfig;\n        await this.applicationService.initialize(createRoutes);\n        this.success.emit();\n        this.router.navigateByUrl(\"/\");\n      } else {\n        this.success.emit();\n      }\n    } catch (e) {\n      const maybeError = e as { error?: { errorMessage?: string }; errorMessage?: string; message?: string };\n      const msg: string =\n        maybeError?.error?.errorMessage ??\n        maybeError?.errorMessage ??\n        maybeError?.message ??\n        this.transloco.translate(\"login.passwordChangeFailed\");\n\n      this.errorMsg.set(msg);\n      notify.error(msg);\n    } finally {\n      this.pending.set(false);\n    }\n  }\n\n  onCancel() {\n    this.pending.set(false);\n    this.errorMsg.set(null);\n    this.cancel.emit();\n    if (this.redirectAfterCancel()) {\n      this.location.back();\n    }\n  }\n}\n","import { Component, inject, model, output, signal } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\nimport { fetchSendPasswordResetEmail, notify } from \"@sinequa/atomic\";\nimport {\n  ButtonComponent,\n  CardComponent,\n  CardContentComponent,\n  CardFooterComponent,\n  CardHeaderComponent,\n  InputComponent\n} from \"@sinequa/ui\";\nimport { AuditService } from \"../../../services\";\n\n@Component({\n  selector: \"forgot-password, ForgotPassword, forgotpassword\",\n  imports: [\n    FormsModule,\n    TranslocoPipe,\n    InputComponent,\n    ButtonComponent,\n    CardComponent,\n    CardHeaderComponent,\n    CardContentComponent,\n    CardFooterComponent\n  ],\n  providers: [provideTranslocoScope(\"login\")],\n  template: `\n    <Card hover=\"no\" class=\"bg-card rounded-xl shadow-sm\">\n      <CardHeader class=\"flex flex-col items-center gap-3\">\n        <img class=\"h-12 content-(--logo-large)\" alt=\"logo\" />\n        <h2 class=\"text-lg font-semibold\">\n          {{ 'login.forgotPasswordTitle' | transloco }}\n        </h2>\n        <p class=\"text-xs text-muted-foreground text-center\">\n          {{ 'login.forgotPasswordDescription' | transloco }}\n        </p>\n      </CardHeader>\n\n      <CardContent class=\"grid gap-4\">\n        <div class=\"grid gap-2\">\n          <label class=\"text-sm font-medium\" for=\"username\">\n            {{ 'login.username' | transloco }}\n          </label>\n          <input\n            id=\"username\"\n            type=\"text\"\n            required\n            [(ngModel)]=\"userName\"\n          />\n        </div>\n      </CardContent>\n\n      <CardFooter class=\"mt-4 flex justify-end gap-3\">\n        <button type=\"button\" (click)=\"cancel.emit()\">\n          {{ 'cancel' | transloco }}\n        </button>\n               <button type=\"button\"\n             [disabled]=\"!userName() || pending()\"\n                 (click)=\"submit()\">\n          {{ 'login.sendResetLink' | transloco }}\n           </button>\n\n      </CardFooter>\n    </Card>\n  `\n})\nexport class ForgotPasswordComponent {\n  readonly cancel = output<void>();\n  readonly success = output<void>();\n\n  private readonly transloco = inject(TranslocoService);\n  private readonly auditService = inject(AuditService);\n\n  userName = model<string>(\"\");\n  pending = signal(false);\n  errorMsg = signal<string | null>(null);\n\n  async submit() {\n    if (!this.userName()) return;\n    this.pending.set(true);\n\n    try {\n      const res = await fetchSendPasswordResetEmail(this.userName());\n      notify.success(\n        this.transloco.translate(\"login.resetEmailSent\", {\n          email: res.email ?? \"\"\n        })\n      );\n      this.auditService.notify({\n        type: 'Send_Reset_Password_Link'\n      });\n      this.success.emit();\n    } catch (e: unknown) {\n      const maybeError = e as { error?: { errorMessage?: string }; errorMessage?: string; message?: string };\n      const msg: string =\n        maybeError?.error?.errorMessage ??\n        maybeError?.errorMessage ??\n        maybeError?.message ??\n        this.transloco.translate(\"login.resetEmailFailed\");\n\n      this.errorMsg.set(msg);\n      notify.error(msg);\n    } finally {\n      this.pending.set(false);\n    }\n  }\n}\n","import { Component, inject } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\nimport { globalConfig } from \"@sinequa/atomic\";\nimport {\n  CardComponent,\n  CardContentComponent,\n  CardFooterComponent,\n  CardHeaderComponent\n} from \"@sinequa/ui\";\n\n/**\n * Post-logout confirmation shown on the `/logout` route.\n *\n * Rendering this view (instead of the sign-in form) is essential for the external-auth modes\n * (`sso` / `oauth` / `saml`): the sign-in form auto-initiates the handshake when\n * `authMode` is external, so showing it on `/logout` would immediately re-authenticate the user\n * (a spinner that loops back in). This view gives a clear \"signed out\" state and a single explicit\n * action to sign in again.\n */\n@Component({\n  selector: \"signed-out, SignedOut, signedout\",\n  imports: [\n    TranslocoPipe,\n    CardComponent,\n    CardHeaderComponent,\n    CardContentComponent,\n    CardFooterComponent\n  ],\n  providers: [provideTranslocoScope(\"login\")],\n  template: `\n    <Card hover=\"no\" class=\"bg-card rounded-xl shadow-sm\">\n      <CardHeader class=\"flex flex-col items-center gap-3\">\n        <img class=\"h-12 content-(--logo-large)\" alt=\"logo\" />\n        <h2 class=\"text-lg font-semibold\">\n          {{ 'login.signedOutTitle' | transloco }}\n        </h2>\n        <p class=\"text-xs text-muted-foreground text-center\">\n          {{ 'login.signedOutDescription' | transloco }}\n        </p>\n      </CardHeader>\n\n      <CardContent />\n\n      <CardFooter class=\"mt-4 flex justify-center\">\n        <button\n          type=\"button\"\n          class=\"w-full rounded-md bg-primary px-4 py-2 text-sm font-medium text-primary-foreground hover:bg-primary/90\"\n          (click)=\"signInAgain()\"\n        >\n          {{ 'login.connect' | transloco }}\n        </button>\n      </CardFooter>\n    </Card>\n  `\n})\nexport class SignedOutComponent {\n  private readonly router = inject(Router);\n\n  /**\n   * Navigate to the login screen, which then drives the normal sign-in handshake.\n   *\n   * A `returnUrl` is required: in the external-auth modes the sign-in screen only navigates away\n   * once the handshake completes IF a `returnUrl` is present (otherwise it stays on the loader).\n   * We send the user back to the app root after signing in again.\n   */\n  signInAgain() {\n    this.router.navigate([globalConfig.loginPath ?? \"/login\"], {\n      queryParams: { returnUrl: \"/\" }\n    });\n  }\n}\n","import { A11yModule } from \"@angular/cdk/a11y\"; // Import for accessibility features, if needed\nimport {\n  Component,\n  computed,\n  DestroyRef,\n  effect,\n  inject,\n  input,\n  model,\n  output,\n  signal\n} from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { FormsModule } from \"@angular/forms\";\nimport { ActivatedRoute, Router, RouterModule } from \"@angular/router\";\nimport {\n  provideTranslocoScope,\n  TranslocoPipe,\n  TranslocoService\n} from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\nimport {\n  expiresSoon,\n  globalConfig,\n  isAuthenticated,\n  login,\n  logout,\n  notify,\n  warn\n} from \"@sinequa/atomic\";\nimport {\n  ButtonComponent,\n  CardComponent,\n  CardContentComponent,\n  CardHeaderComponent,\n  cn,\n  InputComponent\n} from \"@sinequa/ui\";\nimport { fromEvent } from \"rxjs\";\nimport { ApplicationService, AuditService } from \"../../../services\";\nimport { PrincipalStore } from \"../../../stores\";\n\n/**\n * Represents the LoginComponent class, which is responsible for handling the login functionality.\n * This component is used to authenticate users and manage the user's authentication status.\n */\n@Component({\n  selector: \"signIn, signin, sign-in\",\n  imports: [\n    RouterModule,\n    FormsModule,\n    A11yModule,\n    TranslocoPipe,\n    InputComponent,\n    ButtonComponent,\n    CardComponent,\n    CardHeaderComponent,\n    CardContentComponent\n  ],\n  providers: [provideTranslocoScope(\"login\")],\n  template: `\n    @if (!authenticated() && !externalAuth) {\n      <Card\n        hover=\"no\"\n        cdkTrapFocus\n        cdkTrapFocusAutoCapture=\"true\"\n        class=\"bg-card rounded-xl shadow-sm\">\n        <CardHeader class=\"flex flex-col items-center gap-3 text-center\">\n          <img class=\"h-12 content-(--logo-large)\" alt=\"logo\" />\n        </CardHeader>\n\n        <CardContent class=\"grid gap-4\">\n          <!-- authentication using credentials -->\n          <div class=\"grid gap-2\">\n            <label class=\"text-sm font-medium\" for=\"username\">{{\n              \"login.username\" | transloco\n            }}</label>\n            <input\n              id=\"username\"\n              type=\"text\"\n              required\n              [(ngModel)]=\"username\"\n              (keydown.enter)=\"handleLoginWithCredentials()\" />\n          </div>\n\n          <div class=\"grid gap-2\">\n            <label class=\"text-sm font-medium\" for=\"password\">{{\n              \"login.password\" | transloco\n            }}</label>\n            <input\n              id=\"password\"\n              type=\"password\"\n              required\n              [(ngModel)]=\"password\"\n              (keydown.enter)=\"handleLoginWithCredentials()\" />\n          </div>\n\n          <span\n            class=\"text-muted-foreground cursor-pointer justify-self-start text-xs hover:underline\"\n            role=\"button\"\n            tabindex=\"0\"\n            (click)=\"forgotPassword.emit()\"\n            (keydown.enter)=\"forgotPassword.emit()\">\n            {{ \"login.forgotPassword\" | transloco }}\n          </span>\n          <button variant=\"primary\"\n            [disabled]=\"!isValid()\"\n            (click)=\"handleLoginWithCredentials()\">\n            {{ \"login.connect\" | transloco }}\n          </button>\n        </CardContent>\n      </Card>\n    } @else {\n      <div class=\"flex h-dvh w-full items-center justify-center\">\n        <div class=\"flex flex-col items-center space-y-4\">\n          <span class=\"loader\"></span>\n        </div>\n      </div>\n    }\n  `,\n  styles: `\n    input { background-color: var(--background); }\n\n    .loader {\n      --w: 96px;\n      --h: 96px;\n\n      transform: rotateZ(45deg);\n      perspective: 1000px;\n      border-radius: 50%;\n      width: var(--w);\n      height: var(--h);\n      color: #0040bf; /* Sinequa blue */\n    }\n    .loader:before,\n    .loader:after {\n      content: '';\n      display: block;\n      position: absolute;\n      top: 0;\n      left: 0;\n      width: inherit;\n      height: inherit;\n      border-radius: 50%;\n      transform: rotateX(70deg);\n      animation: 1s spin linear infinite;\n    }\n    .loader:after {\n      color: #ff854a; /* Sinequa orange */\n      transform: rotateY(70deg);\n      animation-delay: 0.4s;\n    }\n\n    @keyframes spin {\n      0%,\n      100% {\n        box-shadow: 0.4em 0px 0 0px currentcolor;\n      }\n      12% {\n        box-shadow: 0.4em 0.4em 0 0 currentcolor;\n      }\n      25% {\n        box-shadow: 0 0.4em 0 0px currentcolor;\n      }\n      37% {\n        box-shadow: -0.4em 0.4em 0 0 currentcolor;\n      }\n      50% {\n        box-shadow: -0.4em 0 0 0 currentcolor;\n      }\n      62% {\n        box-shadow: -0.4em -0.4em 0 0 currentcolor;\n      }\n      75% {\n        box-shadow: 0px -0.4em 0 0 currentcolor;\n      }\n      87% {\n        box-shadow: 0.4em -0.4em 0 0 currentcolor;\n      }\n    }\n  `,\n  host: {\n    \"[class]\": \"cn('grid h-dvh w-full place-content-center', class())\"\n  }\n})\nexport class SignInComponent {\n  cn = cn;\n  config = globalConfig;\n\n  /**\n   * True when authentication is handled outside the credentials form — i.e. by the\n   * browser/proxy (`sso`) or by an auto-configured OAuth/SAML provider. In those modes\n   * this screen shows a loader instead of a login form and initiates the handshake\n   * automatically by calling `handleLogin()`.\n   *\n   * Note: the ambiguous `unknown` mode is intentionally excluded — it is resolved upstream\n   * (in `login()`/`signIn()`) to either `sso` or `credentials` before this screen renders,\n   * so reaching here in `unknown` should still show the form, never a dead-end loader.\n   */\n  readonly externalAuth = (() => {\n    const kind = globalConfig.authMode?.kind;\n    return kind === \"sso\" || kind === \"oauth\" || kind === \"saml\";\n  })();\n\n  class = input<string>();\n  readonly forgotPassword = output<void>();\n\n  username = model<string>(\"\");\n  password = model<string>(\"\");\n\n  credentials = computed(() => ({\n    username: this.username(),\n    password: this.password()\n  }));\n\n  isValid = computed(\n    () =>\n      !!this.credentials().username?.length &&\n      !!this.credentials().password?.length\n  );\n\n  private readonly router = inject(Router);\n  private readonly route = inject(ActivatedRoute);\n  private readonly applicationService = inject(ApplicationService);\n  private readonly principalStore = inject(PrincipalStore);\n  private readonly transloco = inject(TranslocoService);\n  private readonly auditService = inject(AuditService);\n\n  readonly authenticated = signal<boolean>(isAuthenticated());\n  readonly user = signal(getState(this.principalStore));\n  readonly expiresSoonNotified = signal<boolean>(false);\n\n  constructor(private destroyRef: DestroyRef) {\n    // If the user is already authenticated when landing here (e.g. page refresh on\n    // /login, or an external handshake completed before this screen was created),\n    // don't sit on the loader: go straight to the returnUrl.\n    if (this.authenticated()) {\n      const url = this.route.snapshot.queryParams[\"returnUrl\"] || \"/\";\n      this.router.navigateByUrl(url);\n    }\n\n    // When authentication is delegated to the browser/proxy (SSO) or an OAuth/SAML\n    // provider, no credentials form is shown: this screen shows a loader and initiates\n    // the handshake automatically by calling `handleLogin()`. If the handshake never\n    // completes, fall back to /error after 5s; the fallback is cancelled as soon as\n    // the login succeeds (the `authenticated` event then drives navigation).\n    if (this.externalAuth && !this.authenticated()) {\n      const timeout = setTimeout(() => {\n        this.router.navigate([\"/error\"], {\n          queryParams: { returnUrl: this.route.snapshot.queryParams[\"returnUrl\"] }\n        });\n      }, 5000);\n      destroyRef.onDestroy(() => clearTimeout(timeout));\n\n      this.handleLogin().then(result => {\n        if (result) clearTimeout(timeout);\n      });\n    }\n\n    effect(() => {\n      const principal = getState(this.principalStore);\n      if (this.authenticated() && principal && !this.expiresSoonNotified()) {\n        this.checkPasswordExpiresSoon();\n      }\n    });\n\n    fromEvent<CustomEvent<{ authenticated: boolean }>>(\n      window as any,\n      \"authenticated\"\n    )\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe(event => {\n        this.authenticated.set(event.detail.authenticated);\n        const url = this.route.snapshot.queryParams[\"returnUrl\"] || null;\n\n        if (url !== null) {\n          this.router.navigateByUrl(url ?? \"/\");\n        }\n      });\n  }\n\n  private checkPasswordExpiresSoon() {\n    const { editablePartition, passwordExpirationDate } = getState(\n      this.principalStore\n    );\n    if (!editablePartition || !passwordExpirationDate) {\n      return;\n    }\n\n    if (expiresSoon(passwordExpirationDate, 7)) {\n      notify.warning(this.transloco.translate(\"login.passwordExpiresSoon\"), {\n        duration: Number.POSITIVE_INFINITY,\n        action: {\n          label: this.transloco.translate(\"login.changePassword\"),\n          onClick: () => {\n            this.router.navigate([\"/login\"], {\n              queryParams: {\n                mode: \"changepassword\",\n                username: this.username()\n              }\n            });\n          }\n        }\n      } as any);\n      this.expiresSoonNotified.set(true);\n    }\n  }\n\n  async handleLogout() {\n    await logout();\n    this.authenticated.set(false);\n    this.router.navigate([\"/login\"]);\n  }\n\n  async handleLogin() {\n    return login().then((result) => {\n      if (result) {\n        this.auditService.notifyLogin();\n      }\n      return result;\n    }).catch((err: { errorMessage?: string; message?: string }) => {\n      warn(\"An error occurred while logging in\", err);\n      this.auditService.notify({ type: 'Login_Denied' });\n      // Surface the failure reason on the error page (e.g. \"OAuth provider not found: identity-dev\")\n      // so the user/admin knows what to fix, instead of a bare generic error screen.\n      const message = (err?.errorMessage ?? err?.message) || undefined;\n      this.router.navigate([\"error\"], { queryParams: { message } });\n      return false;\n    });\n  }\n\n  async handleLoginWithCredentials() {\n    if (!this.isValid()) return;\n\n    try {\n      const response = await login(this.credentials());\n      if (!response) {\n        this.auditService.notify({ type: 'Login_Denied' });\n        return;\n      }\n\n      this.auditService.notifyLogin();\n\n      const { createRoutes = false } = globalConfig;\n      try {\n        await this.applicationService.initialize(createRoutes);\n      } catch (initErr) {\n        // Authenticated, but the application failed to initialize (e.g. fetchApp failed). Surface the\n        // reason on the error page rather than leaving the user stuck on the login form.\n        const { errorMessage, message } = (initErr ?? {}) as { errorMessage?: string; message?: string };\n        this.router.navigate([\"/error\"], { queryParams: { message: errorMessage ?? message } });\n        return;\n      }\n\n      this.checkPasswordExpiresSoon();\n\n      const url = this.route.snapshot.queryParams[\"returnUrl\"] || \"/\";\n      this.router.navigateByUrl(url);\n    } catch (err) {\n      const { status, errorMessage, message } = err as {\n        status?: number;\n        message?: string;\n        errorMessage?: string;\n      };\n\n      if (\n        status === 401 &&\n        errorMessage?.toLowerCase().includes(\"password expired\")\n      ) {\n        sessionStorage.setItem(\"passwordExpiredFlow\", \"true\");\n\n        this.router.navigate([\"/login\"], {\n          queryParams: {\n            mode: \"changepassword\",\n            alert: \"passwordExpired\",\n            username: this.username()\n          }\n        });\n        return;\n      }\n\n      // For other errors, show a generic error message\n      notify.error(\"Login\", { description: message ?? errorMessage });\n    }\n  }\n\n  handleBack() {\n    this.authenticated.set(false);\n    this.router.navigate([\"/\"]);\n  }\n}\n\n","import { Component, inject, input, linkedSignal, signal } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { provideTranslocoScope } from \"@jsverse/transloco\";\nimport { ChangePasswordComponent } from \"./views/change-password-form\";\nimport { ForgotPasswordComponent } from \"./views/forgot-password-form\";\nimport { SignedOutComponent } from \"./views/signed-out\";\nimport { SignInComponent } from \"./views/sign-in-form\";\n\ntype AuthView = \"signin\" | \"changepassword\" | \"login\" | \"forgotpassword\" | \"signedout\";\n\n@Component({\n  selector: \"auth-page, AuthPage, authpage\",\n  providers: [provideTranslocoScope(\"login\")],\n  imports: [SignInComponent, ChangePasswordComponent, ForgotPasswordComponent, SignedOutComponent],\n  host: { class: \"min-h-screen grid place-items-center p-6 bg-background\" },\n  template: `\n    <div class=\"w-full max-w-md\">\n      @if (view() === 'changepassword') {\n        <change-password\n          [username]=\"username()\"\n          [alert]=\"alert()\"\n          (cancel)=\"view.set('signin')\"\n        />\n      } @else if (view() === 'forgotpassword') {\n        <forgot-password\n          (cancel)=\"view.set('signin')\"\n          (success)=\"view.set('signin')\"\n        />\n      } @else if (view() === 'signedout') {\n        <signed-out />\n      } @else {\n        <sign-in\n          (changePassword)=\"view.set('changepassword')\"\n          (forgotPassword)=\"view.set('forgotpassword')\"\n        />\n      }\n    </div>\n  `\n})\nexport class AuthPageComponent {\n  mode = input<AuthView>();\n\n  view = linkedSignal<AuthView>(() => this.mode() ?? this.routeView());\n\n  readonly username = signal<string>(\"\");\n  readonly alert = signal<string | undefined>(undefined);\n\n  private readonly route = inject(ActivatedRoute);\n\n  /**\n   * Default view derived from the route. The `/logout` route renders the \"signed out\" confirmation\n   * (NOT the sign-in form): in external-auth modes the form would auto-restart the handshake and\n   * re-authenticate the user, defeating the logout. Everything else defaults to the sign-in form.\n   */\n  private routeView(): AuthView {\n    return this.route.snapshot.routeConfig?.path === \"logout\" ? \"signedout\" : \"signin\";\n  }\n\n  constructor() {\n    const params = this.route.snapshot.queryParams;\n\n    const u = params[\"username\"] || \"\";\n    this.username.set(u);\n\n    const modeFromQuery = params[\"mode\"] as AuthView | undefined;\n    if (modeFromQuery === \"changepassword\" || modeFromQuery === \"forgotpassword\") {\n      this.view.set(modeFromQuery);\n    }\n\n    if (params[\"alert\"]) {\n      this.alert.set(`login.${params[\"alert\"]}`);\n    }\n  }\n}\n","import { Component, computed, inject, input } from \"@angular/core\";\nimport { ActivatedRoute } from \"@angular/router\";\nimport { provideTranslocoScope, TranslocoService } from \"@jsverse/transloco\";\nimport { Article, notify } from \"@sinequa/atomic\";\nimport { BookmarkIcon, ButtonComponent, ButtonVariants } from \"@sinequa/ui\";\nimport { UserSettingsStore } from \"../../stores\";\n\n@Component({\n  selector: \"bookmark-button, bookmarkbutton, BookmarkButton\",\n  imports: [BookmarkIcon, ButtonComponent],\n  providers: [provideTranslocoScope(\"bookmark\")],\n  template: `\n  <button [variant]=\"variant()\" [size]=\"size()\" [iconOnly]=\"true\" (click)=\"bookmark($event)\">\n    @if (isBookmarked()) {\n      <bookmark-icon solid />\n    }\n    @else {\n      <bookmark-icon />\n    }\n  </button>\n    `,\n  host: {\n    class: \"cursor-pointer\",\n    \"[class.visible]\": \"isBookmarked()\",\n    \"[title]\": \"title()\"\n  }\n})\nexport class BookmarkButtonComponent {\n  variant = input<ButtonVariants[\"variant\"]>(\"ghost\");\n  size = input<ButtonVariants[\"size\"]>(\"md\");\n  public readonly article = input.required<Partial<Article>>();\n\n  private readonly userSettingsStore = inject(UserSettingsStore);\n  private readonly route = inject(ActivatedRoute);\n  private readonly transloco = inject(TranslocoService);\n\n  protected isBookmarked = computed(() => {\n    return this.userSettingsStore.isBookmarked(this.article());\n  });\n\n  protected title = computed(() => this.transloco.translate(\"bookmarks.bookmarkDocument\"));\n\n  public async bookmark(e: Event) {\n    e.stopPropagation();\n    const article = this.article();\n    if (!article || !article.id) return;\n\n    const isBookmarked = await this.userSettingsStore.isBookmarked(article);\n    if (isBookmarked) {\n      await this.userSettingsStore.unbookmark(article.id);\n      notify.success(this.transloco.translate(\"bookmarks.bookmarkRemoved\"), { duration: 2000 });\n    } else {\n      let current = this.route.snapshot;\n      while (current.firstChild) {\n        current = current.firstChild;\n      }\n      const { queryName } = current.data;\n      await this.userSettingsStore.bookmark(article as Article, queryName);\n      notify.success(this.transloco.translate(\"bookmarks.bookmarkAdded\"), { duration: 2000 });\n    }\n  }\n}\n","import { Component, computed, DestroyRef, effect, InjectionToken, inject, input, signal } from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\n\nimport { RouterLink } from \"@angular/router\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\nimport { LegacyFilter, notify, Query } from \"@sinequa/atomic\";\nimport {\n  BadgeComponent,\n  BookmarkIcon,\n  ButtonComponent,\n  FolderIcon,\n  ListItemComponent,\n  PopoverContentComponent,\n  Separator,\n  TrashIcon,\n  UserIcon\n} from \"@sinequa/ui\";\nimport { Bookmark } from \"../../models\";\nimport { QueryService } from \"../../services\";\nimport { AppStore, UserSettingsStore } from \"../../stores\";\nimport { DrawerStackService } from \"../drawer-stack/drawer-stack.service\";\n\nexport type BookmarksConfig = {\n  itemsPerPage?: number;\n  showLoadMore?: boolean;\n  routerLink?: string;\n};\n\nexport const BOOKMARKS_OPTIONS: BookmarksConfig = {\n  itemsPerPage: 10,\n  showLoadMore: true,\n  routerLink: \"/bookmarks\"\n};\n\nexport const BOOKMARKS_CONFIG = new InjectionToken<BookmarksConfig>(\"Bookmarks options\", {\n  factory: () => BOOKMARKS_OPTIONS\n});\n\n@Component({\n  selector: \"bookmarks, Bookmarks\",\n  standalone: true,\n  imports: [\n    TranslocoPipe,\n    RouterLink,\n    ListItemComponent,\n    ButtonComponent,\n    Separator,\n    BookmarkIcon,\n    UserIcon,\n    TrashIcon,\n    FolderIcon,\n    BadgeComponent\n  ],\n  providers: [provideTranslocoScope(\"bookmarks\")],\n  templateUrl: \"./bookmarks.html\",\n  styles: [\n    `\n      :host {\n        ul {\n          scrollbar-width: thin;\n        }\n      }\n    `\n  ]\n})\nexport class BookmarksComponent {\n  floating = inject(PopoverContentComponent, { skipSelf: true, optional: true });\n\n  private readonly drawerStack = inject(DrawerStackService);\n  private readonly queryService = inject(QueryService);\n  private readonly userSettingsStore = inject(UserSettingsStore);\n  private readonly appStore = inject(AppStore);\n  private readonly transloco = inject(TranslocoService);\n\n  private destroyRef = inject(DestroyRef);\n\n  options = input<BookmarksConfig>();\n  config = inject(BOOKMARKS_CONFIG);\n\n  public range = signal<number>(10);\n  protected bookmarks = computed<Bookmark[]>(() => this.userSettingsStore.bookmarks());\n  public paginatedBookmarks = computed<Bookmark[]>(() => this.bookmarks().slice(0, this.range()));\n  public hasMore = computed<boolean>(() => this.bookmarks().length > 0 && this.range() < this.bookmarks().length);\n\n  constructor() {\n    effect(() => {\n      if (this.options()) {\n        this.config = { ...this.config, ...this.options() };\n        this.range.set(this.config.itemsPerPage ?? 10);\n      }\n    });\n  }\n\n  public onClick(bookmark: Bookmark): void {\n    const query: Partial<Query> = {\n      name: bookmark.queryName,\n      filters: {\n        field: \"id\",\n        value: bookmark.id\n      } as LegacyFilter\n    };\n\n    if (!bookmark.queryName) {\n      this.performSecondSearch(query);\n      return;\n    }\n\n    this.queryService\n      .search(query, false)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe((result) => {\n        if (!result.records || result.records.length === 0) {\n          this.performSecondSearch(query);\n          return;\n        }\n\n        this.drawerStack.replace(result.records[0]);\n      });\n  }\n\n  private performSecondSearch(query: Partial<Query>): void {\n    query.name = this.appStore.getDefaultQuery()?.name;\n    this.queryService\n      .search(query, false)\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe((result) => {\n        if (!result.records || result.records.length === 0) {\n          notify.warning(this.transloco.translate(\"bookmarks.outdated\"), {\n            description: this.transloco.translate(\"bookmarks.outdatedDescription\"),\n            duration: 2000\n          });\n          return;\n        }\n\n        this.drawerStack.replace(result.records[0]);\n      });\n  }\n\n  public onDelete(bookmark: Bookmark, e: Event) {\n    e.stopPropagation();\n    this.userSettingsStore.unbookmark(bookmark.id);\n    notify.success(this.transloco.translate(\"bookmarks.bookmarkRemoved\"), { duration: 2000 });\n  }\n\n  loadMore(e: Event) {\n    e.stopPropagation();\n    this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n  }\n}\n","@if (floating) {\r\n  <div class=\"p-2\">\r\n    <label class=\"text-xl font-bold\">{{ \"bookmarks.label\" | transloco }}</label>\r\n    <Separator />\r\n  </div>\r\n}\r\n\r\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\" role=\"list\">\r\n  @for (bookmark of paginatedBookmarks(); track $index) {\r\n    <li\r\n      role=\"listitem\"\r\n      class=\"group h-10\"\r\n      tabindex=\"0\"\r\n      (click)=\"onClick(bookmark)\"\r\n      (keydown.enter)=\"onClick(bookmark)\">\r\n      <BookmarkIcon solid class=\"shrink-0\" />\r\n\r\n      <p class=\"line-clamp-1\">{{ bookmark.label }}</p>\r\n\r\n      @if (bookmark.author) {\r\n        <Badge class=\"text-grey-500 text-xs\">\r\n          <UserIcon class=\"size-3\" />\r\n          <span class=\"line-clamp-1\">{{ bookmark.author }}</span>\r\n        </Badge>\r\n      }\r\n      @if (bookmark.parentFolder) {\r\n        <Badge class=\"text-grey-500 text-xs\">\r\n          <FolderIcon class=\"size-3\" />\r\n          <span class=\"line-clamp-1\">{{ bookmark.parentFolder }}</span>\r\n        </Badge>\r\n      }\r\n\r\n      <button\r\n        variant=\"ghost\"\r\n        [iconOnly]=\"true\"\r\n        title=\"{{ 'bookmarks.openBookmark' | transloco }}\"\r\n        class=\"text-destructive ms-auto group-hover:visible\"\r\n        [attr.title]=\"'bookmarks.removeBookmark' | transloco\"\r\n        [attr.aria-label]=\"'bookmarks.removeBookmark' | transloco\"\r\n        (click)=\"onDelete(bookmark, $event)\">\r\n        <TrashIcon />\r\n      </button>\r\n    </li>\r\n  } @empty {\r\n    <span class=\"py-4 text-center text-neutral-500\">\r\n      {{ \"bookmarks.noBookmarks\" | transloco }}\r\n    </span>\r\n  }\r\n</ul>\r\n\r\n@if (paginatedBookmarks().length > 0) {\r\n  <div class=\"flex flex-col px-2\">\r\n    @if (hasMore() && config.showLoadMore) {\r\n      @let loadMoreLabel = \"loadMore\" | transloco;\r\n      <button\r\n        variant=\"ghost\"\r\n        class=\"w-full\"\r\n        tabindex=\"0\"\r\n        [attr.title]=\"loadMoreLabel\"\r\n        (click)=\"loadMore($event)\">\r\n        {{ loadMoreLabel }}\r\n      </button>\r\n    }\r\n    @let seeMoreLabel = \"seeMore\" | transloco;\r\n    <button\r\n      variant=\"link\"\r\n      class=\"ml-auto\"\r\n      [attr.title]=\"seeMoreLabel\"\r\n      [routerLink]=\"[config.routerLink]\">\r\n      {{ seeMoreLabel }}\r\n    </button>\r\n  </div>\r\n}\r\n","import { Component, inject, signal, viewChild } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\nimport { notify } from \"@sinequa/atomic\";\nimport {\n  ButtonComponent,\n  DialogComponent,\n  DialogContentComponent,\n  DialogFooterComponent,\n  DialogHeaderComponent,\n  DialogInterface,\n  DialogTitleComponent\n} from \"@sinequa/ui\";\nimport { Basket } from \"../../../models\";\nimport { UserSettingsStore } from \"../../../stores\";\n\n@Component({\n  selector: \"delete-collection-dialog\",\n  standalone: true,\n  imports: [\n    FormsModule,\n    TranslocoPipe,\n    ButtonComponent,\n    DialogComponent,\n    DialogHeaderComponent,\n    DialogTitleComponent,\n    DialogContentComponent,\n    DialogFooterComponent\n  ],\n  providers: [provideTranslocoScope(\"collections\")],\n  template: `\n    <dialog #dialog>\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>{{ 'collections.deleteCollection' | transloco }}</DialogTitle>\n        </DialogHeader>\n        <p>{{ 'collections.confirmDelete' | transloco }} {{ collection()?.name }}?</p>\n\n        <DialogFooter>\n          <button variant=\"outline\" (click)=\"dialog.cancel()\">\n            {{ 'cancel' | transloco }}\n          </button>\n\n          <button variant=\"destructive\" (click)=\"deleteCollection()\">\n            {{ 'delete' | transloco }}\n          </button>\n        </DialogFooter>\n      </DialogContent>\n    </dialog>\n  `\n})\nexport class DeleteCollectionDialog implements DialogInterface {\n  readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n  private readonly userSettingsStore = inject(UserSettingsStore);\n  private readonly translocoService = inject(TranslocoService);\n\n  collection = signal<Basket | undefined>(undefined);\n  index = signal<number | undefined>(undefined);\n\n  open(collection: Basket, index: number) {\n    this.collection.set(collection);\n    this.index.set(index);\n    this.dialog()?.showModal();\n  }\n\n  async deleteCollection(): Promise<void> {\n    this.dialog()?.close();\n\n    const index = this.index();\n    if (index !== undefined) {\n      await this.userSettingsStore.deleteBasket(index);\n      const message = this.translocoService.translate(\"collections.deleted\");\n      notify.success(message, { duration: 2000 });\n    }\n  }\n}\n","import { Component, computed, effect, InjectionToken, inject, input, signal, viewChild } from \"@angular/core\";\nimport { Router, RouterLink } from \"@angular/router\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { ButtonComponent, ListItemComponent, PopoverComponent, Separator, TrashIcon, InboxIcon } from \"@sinequa/ui\";\n\nimport { Basket } from \"../../models\";\nimport { UserSettingsStore } from \"../../stores\";\nimport { DrawerStackService } from \"../drawer-stack/drawer-stack.service\";\nimport { DeleteCollectionDialog } from \"./dialogs/delete.dialog\";\n\nexport type CollectionsConfig = {\n  itemsPerPage?: number;\n  showLoadMore?: boolean;\n  routerLink?: string;\n};\n\nexport const COLLECTIONS_OPTIONS: CollectionsConfig = {\n  itemsPerPage: 10,\n  showLoadMore: false,\n  routerLink: \"/collections\"\n};\n\nexport const COLLECTIONS_CONFIG = new InjectionToken<CollectionsConfig>(\"Collections options\", {\n  factory: () => COLLECTIONS_OPTIONS\n});\n\n@Component({\n  selector: \"app-collections, collections\",\n  standalone: true,\n  imports: [\n    TranslocoPipe,\n    RouterLink,\n    DeleteCollectionDialog,\n    ButtonComponent,\n    ListItemComponent,\n    Separator,\n    TrashIcon,\n    InboxIcon\n],\n  templateUrl: \"./collections.html\",\n  providers: [provideTranslocoScope(\"collections\")]\n})\nexport class CollectionsComponent {\n  floating = inject(PopoverComponent, { skipSelf: true, optional: true });\n\n  private readonly userSettingsStore = inject(UserSettingsStore);\n  private readonly drawerStack = inject(DrawerStackService);\n  private readonly router = inject(Router);\n\n  options = input<CollectionsConfig>();\n  config = inject(COLLECTIONS_CONFIG);\n\n  public range = signal<number>(10);\n  protected collections = computed<Basket[]>(() => this.userSettingsStore.baskets());\n  public paginatedCollections = computed<Basket[]>(() => this.collections().slice(0, this.range()));\n  public hasMore = computed<boolean>(() => this.collections().length > 0 && this.range() < this.collections().length);\n\n  readonly deleteCollectionDialog = viewChild(DeleteCollectionDialog);\n\n  constructor() {\n    effect(() => {\n      if (this.options()) {\n        this.config = { ...this.config, ...this.options() };\n        this.range.set(this.config.itemsPerPage ?? 10);\n      }\n    });\n  }\n\n  onClick(collection: Basket): void {\n    this.drawerStack.closeAll();\n    this.router.navigate([\"/search\"], { queryParams: { b: collection.name } });\n  }\n\n  public onDelete(collection: Basket, index: number, e: Event) {\n    e.stopPropagation();\n    this.deleteCollectionDialog()?.open(collection, index);\n  }\n\n  loadMore(e: Event) {\n    e.stopPropagation();\n    this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n  }\n}\n","@if (floating) {\r\n  <div class=\"p-2\">\r\n    <label class=\"text-xl font-bold\">{{\r\n      \"collections.label\" | transloco\r\n    }}</label>\r\n    <Separator />\r\n  </div>\r\n}\r\n\r\n<ul class=\"flex max-h-[460px] flex-col overflow-auto\">\r\n  @for (collection of paginatedCollections(); track $index) {\r\n    <li\r\n      role=\"listitem\"\r\n      class=\"group grid grid-cols-[min-content_auto_min-content] items-center\"\r\n      tabindex=\"0\"\r\n      (click)=\"onClick(collection)\"\r\n      (keydown.enter)=\"onClick(collection)\">\r\n      <inbox-icon />\r\n\r\n      <p class=\"line-clamp-1\">{{ collection.name }}</p>\r\n\r\n      <button\r\n        variant=\"ghost\"\r\n        [iconOnly]=\"true\"\r\n        class=\"text-destructive invisible group-hover:visible\"\r\n        title=\"{{ 'collections.deleteCollection' | transloco }}\"\r\n        [attr.aria-label]=\"'collections.deleteCollection' | transloco\"\r\n        (click)=\"onDelete(collection, $index, $event)\">\r\n        <TrashIcon />\r\n      </button>\r\n    </li>\r\n  } @empty {\r\n    <span class=\"py-4 text-center text-neutral-500\">\r\n      {{ \"collections.noCollections\" | transloco }}\r\n    </span>\r\n  }\r\n</ul>\r\n\r\n@if (paginatedCollections().length > 0) {\r\n  <div class=\"flex flex-col px-2\">\r\n    @if (hasMore() && config.showLoadMore) {\r\n      <button\r\n        variant=\"outline\"\r\n        class=\"w-full\"\r\n        tabindex=\"0\"\r\n        [attr.title]=\"'loadMore' | transloco\"\r\n        (click)=\"loadMore($event)\">\r\n        {{ \"loadMore\" | transloco }}\r\n      </button>\r\n    }\r\n    <button\r\n      class=\"ml-auto\"\r\n      [attr.title]=\"'seeMore' | transloco\"\r\n      [routerLink]=\"[config.routerLink]\">\r\n      {{ \"seeMore\" | transloco }}\r\n    </button>\r\n  </div>\r\n\r\n  <delete-collection-dialog />\r\n}\r\n","import { ChangeDetectionStrategy, Component, computed, inject, output, signal, viewChild } from \"@angular/core\";\nimport {\n  ButtonComponent,\n  DialogComponent,\n  DialogContentComponent,\n  DialogDescriptionComponent,\n  DialogEvent,\n  DialogFooterComponent,\n  DialogHeaderComponent,\n  DialogInterface,\n  DialogTitleComponent,\n  InputComponent,\n  SwitchComponent\n} from \"@sinequa/ui\";\n\nimport { CJsonMint } from \"../../models/custom-json\";\nimport { AppStore, PrincipalStore } from \"../../stores\";\n\n/** The `features` map as typed on the application customization JSON. */\ntype AppFeatures = NonNullable<NonNullable<CJsonMint[\"general\"]>[\"features\"]>;\n\n/** Boolean-valued feature flags from `CFeatures` (object-valued features are intentionally excluded). */\ntype BooleanFeatureKey =\n  | \"allowChangePassword\"\n  | \"editablepartition\"\n  | \"advancedSearch\"\n  | \"allowChatDrawer\"\n  | \"filterLinkChildren\"\n  | \"expandPreview\"\n  | \"quickFilter\"\n  | \"showAggregationItemCount\"\n  | \"previewMultiConversion\"\n  | \"persistFiltersAcrossTabs\";\n\ninterface FeatureFlagDescriptor {\n  key: BooleanFeatureKey;\n  label: string;\n  description: string;\n}\n\n/** Static catalog of the known boolean feature flags, with human-readable metadata. */\nconst FEATURE_FLAGS: readonly FeatureFlagDescriptor[] = [\n  { key: \"advancedSearch\", label: \"Advanced search\", description: \"Enable the advanced search panel.\" },\n  { key: \"allowChatDrawer\", label: \"Chat drawer\", description: \"Enable the AI assistant chat drawer.\" },\n  { key: \"quickFilter\", label: \"Quick filter\", description: \"Show the quick filter on aggregations.\" },\n  { key: \"filterLinkChildren\", label: \"Filter link children\", description: \"Link parent/children selection in filters.\" },\n  { key: \"showAggregationItemCount\", label: \"Aggregation item count\", description: \"Display the document count on aggregation items.\" },\n  { key: \"expandPreview\", label: \"Expand preview\", description: \"Allow the document preview to be expanded.\" },\n  { key: \"previewMultiConversion\", label: \"Preview multi-conversion\", description: \"Enable multiple converters in the preview.\" },\n  { key: \"persistFiltersAcrossTabs\", label: \"Persist filters across tabs\", description: \"Keep selected filters when switching navbar tabs.\" },\n  { key: \"allowChangePassword\", label: \"Allow change password\", description: \"Show the change-password action in the user menu.\" },\n  { key: \"editablepartition\", label: \"Editable partition\", description: \"Allow editing the partition.\" }\n] as const;\n\ninterface FeatureFlagRow extends FeatureFlagDescriptor {\n  enabled: boolean;\n}\n\n/**\n * Developer/QA tool that lists the application feature flags and lets you toggle them on the fly.\n *\n * Changes are applied **live** to the {@link AppStore}: every toggle rewrites the effective\n * `general.features` map so that the rest of the application — which reads features through\n * `appStore.general()?.features` — reacts immediately. This makes it possible to test how a\n * feature behaves without editing the customization JSON and reloading.\n *\n * Access is gated to administrators: the gate lives in the component itself (not in the caller) so\n * the dialog can always be opened, but a non-admin only sees an \"admin only\" notice — there is no\n * content to leak and no caller-side check to forget. \"Admin\" means `isAdministrator` or\n * `isDelegatedAdmin` on the {@link PrincipalStore}.\n *\n * Open it programmatically through the {@link DialogService}:\n * ```typescript\n * const modal = inject(DialogService);\n * modal.open(FeatureFlagsDialogComponent);\n * ```\n */\n@Component({\n  selector: \"feature-flags-dialog\",\n  standalone: true,\n  changeDetection: ChangeDetectionStrategy.OnPush,\n  imports: [\n    ButtonComponent,\n    DialogComponent,\n    DialogContentComponent,\n    DialogHeaderComponent,\n    DialogTitleComponent,\n    DialogDescriptionComponent,\n    DialogFooterComponent,\n    InputComponent,\n    SwitchComponent\n  ],\n  template: `\n    <dialog #dialog (closed)=\"closed.emit($event)\">\n      <DialogContent class=\"sm:max-w-[560px]\">\n        <DialogHeader>\n          <DialogTitle>Feature flags</DialogTitle>\n          @if (isAdmin()) {\n            <DialogDescription>Toggle features to test their behaviour. Changes apply immediately.</DialogDescription>\n          }\n        </DialogHeader>\n\n        @if (isAdmin()) {\n          <input\n            type=\"text\"\n            name=\"feature-filter\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n            placeholder=\"Filter features…\"\n            [value]=\"filter()\"\n            (input)=\"filter.set($any($event.target).value)\" />\n\n          <ul class=\"mt-2 flex max-h-[50vh] flex-col gap-1 overflow-y-auto\">\n            @for (flag of visibleFlags(); track flag.key) {\n              <li class=\"hover:bg-muted/50 flex items-center justify-between gap-4 rounded-md px-2 py-1.5\">\n                <label class=\"min-w-0 cursor-pointer\" [attr.for]=\"'flag_' + flag.key\">\n                  <span class=\"block truncate text-sm font-medium\">{{ flag.label }}</span>\n                  @if (flag.description) {\n                    <span class=\"text-muted-foreground block truncate text-xs\">{{ flag.description }}</span>\n                  }\n                </label>\n                <Switch\n                  [id]=\"'flag_' + flag.key\"\n                  variant=\"primary\"\n                  [toggled]=\"flag.enabled\"\n                  (toggledChange)=\"setFeature(flag.key, $event)\" />\n              </li>\n            } @empty {\n              <li class=\"text-muted-foreground px-2 py-4 text-center text-sm\">No feature matches your filter.</li>\n            }\n          </ul>\n\n          <DialogFooter>\n            <button variant=\"outline\" [disabled]=\"!modified()\" (click)=\"reset()\">Reset</button>\n            <button (click)=\"dialog.close()\">Close</button>\n          </DialogFooter>\n        } @else {\n          <div class=\"text-muted-foreground flex flex-col items-center gap-1 py-8 text-center\">\n            <p class=\"text-sm font-medium\">Nothing to see here.</p>\n            <p class=\"text-xs\">Feature flags can only be accessed by an administrator.</p>\n          </div>\n\n          <DialogFooter>\n            <button (click)=\"dialog.close()\">Close</button>\n          </DialogFooter>\n        }\n      </DialogContent>\n    </dialog>\n  `\n})\nexport class FeatureFlagsDialogComponent implements DialogInterface {\n  private readonly appStore = inject(AppStore);\n  private readonly principalStore = inject(PrincipalStore);\n\n  readonly dialog = viewChild<DialogComponent>(DialogComponent);\n  readonly closed = output<DialogEvent>();\n\n  /** The flag list and mutators are only available to administrators (see class doc). */\n  protected readonly isAdmin = computed(\n    () => this.principalStore.isAdministrator() || this.principalStore.isDelegatedAdmin()\n  );\n\n  protected readonly filter = signal(\"\");\n\n  /** Snapshot of the features when the dialog was opened, used by {@link reset}. */\n  private readonly initialFeatures = signal<AppFeatures>({});\n\n  /** Every flag row to display: the known catalog plus any extra boolean flag found in the live config. */\n  protected readonly flags = computed<FeatureFlagRow[]>(() => {\n    const features = this.appStore.general()?.features ?? {};\n\n    const known = FEATURE_FLAGS.map((descriptor) => ({\n      ...descriptor,\n      enabled: features[descriptor.key] === true\n    }));\n\n    const knownKeys = new Set<string>(FEATURE_FLAGS.map((descriptor) => descriptor.key));\n    const extras = Object.keys(features)\n      .filter((key) => typeof features[key] === \"boolean\" && !knownKeys.has(key))\n      .map((key) => ({ key: key as BooleanFeatureKey, label: key, description: \"\", enabled: features[key] === true }));\n\n    return [...known, ...extras];\n  });\n\n  protected readonly visibleFlags = computed<FeatureFlagRow[]>(() => {\n    const query = this.filter().trim().toLowerCase();\n    const rows = this.flags();\n    if (!query) return rows;\n    return rows.filter((row) => row.key.toLowerCase().includes(query) || row.label.toLowerCase().includes(query));\n  });\n\n  /** Whether the live features differ from the snapshot taken when the dialog opened. */\n  protected readonly modified = computed(() => {\n    const current = this.appStore.general()?.features ?? {};\n    const initial = this.initialFeatures();\n    const keys = new Set([...Object.keys(current), ...Object.keys(initial)]);\n    for (const key of keys) {\n      if (current[key] !== initial[key]) return true;\n    }\n    return false;\n  });\n\n  open(): void {\n    this.initialFeatures.set({ ...(this.appStore.general()?.features ?? {}) });\n    this.dialog()?.showModal();\n  }\n\n  protected setFeature(key: string, value: boolean): void {\n    if (!this.isAdmin()) return;\n    const current = this.appStore.general()?.features ?? {};\n    this.applyFeatures({ ...current, [key]: value });\n  }\n\n  protected reset(): void {\n    if (!this.isAdmin()) return;\n    this.applyFeatures({ ...this.initialFeatures() });\n  }\n\n  /**\n   * Writes `features` back to the source that `general()` actually reads from: the `general`\n   * side customization JSON when one exists, otherwise the inline `data.general`. We rewrite the\n   * whole object because {@link AppStore.update} performs a shallow merge of the top-level state.\n   */\n  private applyFeatures(features: AppFeatures): void {\n    const customJSONs = this.appStore.customJSONs();\n    const index = customJSONs.findIndex((json) => json.name.toLowerCase() === \"general\");\n\n    if (index >= 0) {\n      const entry = customJSONs[index];\n      const data = typeof entry.data === \"string\" ? JSON.parse(entry.data) : { ...entry.data };\n      const next = [...customJSONs];\n      next[index] = { ...entry, data: { ...data, features } };\n      this.appStore.update({ customJSONs: next });\n      return;\n    }\n\n    const data = { ...(this.appStore.customizationJson() ?? {}) } as CJsonMint;\n    data.general = { ...(data.general ?? {}), features };\n    this.appStore.update({ data });\n  }\n}\n","import { Component, inject, model, viewChild } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { error, globalConfig, notify, setGlobalConfig } from \"@sinequa/atomic\";\nimport {\n  ButtonComponent,\n  DialogComponent,\n  DialogContentComponent,\n  DialogFooterComponent,\n  DialogHeaderComponent,\n  DialogInterface,\n  DialogTitleComponent,\n  InputComponent\n} from \"@sinequa/ui\";\nimport { ApplicationService } from \"../../services\";\nimport { PrincipalStore } from \"../../stores\";\n\n@Component({\n  selector: \"override-user-dialog\",\n  standalone: true,\n  imports: [\n    FormsModule,\n    ButtonComponent,\n    InputComponent,\n    DialogComponent,\n    DialogContentComponent,\n    DialogTitleComponent,\n    DialogHeaderComponent,\n    DialogFooterComponent,\n    TranslocoPipe\n  ],\n  providers: [provideTranslocoScope(\"dialogs\")],\n  template: `\n    <dialog #dialog>\n      <DialogContent class=\"sm:max-w-[425px]\">\n        <DialogHeader>\n          <DialogTitle>{{ 'dialogs.overrideUser.title' | transloco }}</DialogTitle>\n        </DialogHeader>\n\n          <div>\n            <label for=\"username\" class=\"mb-1 block text-sm font-medium text-gray-700\">{{ 'dialogs.overrideUser.usernameToOverride' | transloco }}</label>\n            <input\n              id=\"username\"\n              name=\"username\"\n              required\n              type=\"text\"\n              autocomplete=\"off\"\n              spellcheck=\"false\"\n              [attr.placeholder]=\"'dialogs.overrideUser.usernamePlaceholder' | transloco\"\n              [(ngModel)]=\"overrideUser().username\"\n              (keydown.enter)=\"override()\" />\n          </div>\n\n          <div>\n            <label for=\"domain\" class=\"mb-1 block text-sm font-medium text-gray-700\">{{ 'dialogs.overrideUser.domainToOverride' | transloco }}</label>\n            <input\n              id=\"domain\"\n              name=\"domain\"\n              required\n              type=\"text\"\n              autocomplete=\"off\"\n              spellcheck=\"false\"\n              [attr.placeholder]=\"'dialogs.overrideUser.domainPlaceholder' | transloco\"\n              [(ngModel)]=\"overrideUser().domain\"\n              (keydown.enter)=\"override()\" />\n          </div>\n\n        <DialogFooter>\n          <button variant=\"outline\" (click)=\"dialog.close()\">\n            {{ 'cancel' | transloco }}\n          </button>\n\n          <button (click)=\"override()\" [disabled]=\"!overrideUser().username || !overrideUser().domain\">\n            {{ 'dialogs.overrideUser.override' | transloco }}\n          </button>\n        </DialogFooter>\n      </DialogContent>\n    </dialog>\n  `\n})\nexport class OverrideUserDialogComponent implements DialogInterface {\n  readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n  private readonly appService = inject(ApplicationService);\n  private readonly principalStore = inject(PrincipalStore);\n\n  readonly overrideUser = model<{ username: string; domain: string }>({ username: \"\", domain: \"\" });\n\n  open() {\n    this.dialog()?.showModal();\n  }\n\n  override() {\n    if (!!this.overrideUser().domain && !!this.overrideUser().username) {\n      this.handleOverrideUser(this.overrideUser().username, this.overrideUser().domain);\n      this.dialog()?.close();\n    }\n  }\n\n  handleOverrideUser(username?: string, domain?: string) {\n    const { createRoutes } = globalConfig;\n\n    if (username === undefined || domain === undefined) {\n      setGlobalConfig({ userOverrideActive: false, userOverride: undefined });\n    } else {\n      setGlobalConfig({ userOverrideActive: true, userOverride: { username, domain } });\n    }\n\n    // Impersonation is header-driven: `createHeaders` adds `sinequa-override-user`/`-domain` to every\n    // request while `userOverrideActive`, on top of the current (admin) session. We therefore do NOT\n    // need to re-authenticate — re-initializing the stores refetches the principal/usersettings as the\n    // overridden user. This works in every auth mode, including `credentials` where `login()` (without\n    // credentials) is intentionally a no-op in atomic 2.0 and would otherwise skip initialization.\n    this.appService\n      .initialize(createRoutes)\n      .then(() => {\n        const fullName = this.principalStore.fullName();\n        notify.success(`Welcome back ${fullName}!`, { duration: 2000 });\n      })\n      .catch((err) => {\n        error(\"An error occurred while overriding (initialize)\", err);\n        notify.error(\"An error occurred while overriding (initialize)\", { duration: 2000 });\n        setGlobalConfig({ userOverrideActive: false, userOverride: undefined });\n      });\n  }\n}\n","import { Component, inject, viewChild } from \"@angular/core\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\n\nimport { notify } from \"@sinequa/atomic\";\nimport {\n  ButtonComponent,\n  DialogComponent,\n  DialogContentComponent,\n  DialogFooterComponent,\n  DialogHeaderComponent,\n  DialogInterface,\n  DialogTitleComponent\n} from \"@sinequa/ui\";\nimport { UserSettingsStore } from \"../../stores\";\n\n@Component({\n  selector: \"reset-user-settings-dialog\",\n  standalone: true,\n  imports: [\n    ButtonComponent,\n    DialogComponent,\n    DialogTitleComponent,\n    DialogContentComponent,\n    DialogFooterComponent,\n    DialogHeaderComponent,\n    TranslocoPipe\n  ],\n  providers: [provideTranslocoScope(\"dialogs\")],\n  template: `\n    <dialog #dialog>\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>{{ 'dialogs.resetUserSettings.title' | transloco }}</DialogTitle>\n        </DialogHeader>\n\n          <p>{{ 'dialogs.resetUserSettings.message' | transloco }}</p>\n\n          <DialogFooter>\n            <button variant=\"outline\" (click)=\"dialog.close()\">\n              {{ 'cancel' | transloco }}\n            </button>\n\n            <button variant=\"destructive\" (click)=\"handleResetUserSettings()\">\n              {{ 'delete' | transloco }}\n            </button>\n          </DialogFooter>\n      </DialogContent>\n    </dialog>\n  `\n})\nexport class ResetUserSettingsDialogComponent implements DialogInterface {\n  readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n  private readonly userSettingsStore = inject(UserSettingsStore);\n  private readonly translocoService = inject(TranslocoService);\n\n  open() {\n    this.dialog()?.showModal();\n  }\n\n  handleResetUserSettings() {\n    this.dialog()?.close();\n    this.userSettingsStore.reset().then(() => {\n      const message = this.translocoService.translate(\"dialogs.resetUserSettings.success\");\n      notify.success(message, { duration: 2000 });\n    });\n  }\n}\n","import { Component, computed, inject, input } from \"@angular/core\";\nimport { Router, RouterModule } from \"@angular/router\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { Result } from \"@sinequa/atomic\";\n\nimport { QueryParamsStore } from \"../../stores\";\n\n@Component({\n  selector: \"did-you-mean, DidYouMean, didyoumean\",\n  standalone: true,\n  imports: [RouterModule, TranslocoPipe],\n  template: `\n  @switch (spellingCorrectionMode()?.toLowerCase()) {\n    @case ('dymonly') {\n      <p>\n        <span class=\"me-1\">{{ 'didYouMean.didYouMean' | transloco }}</span>\n        <a class=\"text-primary hover:underline cursor-pointer\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n        <span>?</span>\n      </p>\n    }\n    @case ('correct') {\n      <p>\n        <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n        <a class=\"text-primary hover:underline cursor-pointer font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n\n        <span class=\"me-1\">. {{ 'didYouMean.searchInsteadFor' | transloco }}</span>\n        <a class=\"text-primary hover:underline cursor-pointer\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n      </p>\n    }\n    @case ('smart') {\n      <p>\n        <span class=\"me-1\">{{ 'didYouMean.showingResultsFor' | transloco }}</span>\n        <a class=\"text-primary hover:underline cursor-pointer\" role=\"button\" (click)=\"selectOriginal()\">{{ original() }}</a>\n\n        <span class=\"mx-1\">{{ 'didYouMean.and' | transloco }}</span>\n        <a class=\"text-primary hover:underline cursor-pointer font-bold\" role=\"button\" (click)=\"selectCorrected()\">{{ correction() }}</a>\n      </p>\n    }\n  }\n  `,\n  providers: [provideTranslocoScope(\"did-you-mean\")]\n})\nexport class DidYouMeanComponent {\n  result = input<Result>();\n\n  protected spellingCorrectionMode = computed(() => this.result()?.didYouMean?.spellingCorrectionMode);\n  protected correction = computed(() => this.result()?.didYouMean?.text.corrected);\n  protected original = computed(() => this.result()?.didYouMean?.text.original);\n\n  readonly router = inject(Router);\n  private readonly queryParamsStore = inject(QueryParamsStore);\n\n  selectCorrected(): void {\n    this.queryParamsStore.patch({ spellingCorrectionMode: \"dymonly\", text: this.correction() });\n    this.router.navigate([], { queryParamsHandling: \"merge\", queryParams: { c: \"dymonly\", q: this.correction() } });\n  }\n\n  selectOriginal(): void {\n    this.queryParamsStore.patch({ spellingCorrectionMode: \"dymonly\" });\n    this.router.navigate([], { queryParamsHandling: \"merge\", queryParams: { c: \"dymonly\", q: this.original() } });\n  }\n}\n","import { Injectable, inject, signal } from \"@angular/core\";\n\nimport { BackdropService } from \"../../components/backdrop/backdrop.service\";\n\n/**\n * Service to manage the state and behavior of a drawer component.\n * It provides methods to open, close, extend, collapse, and toggle\n * the drawer and its extension state.\n * @deprecated we do not use it anymore.\n */\n@Injectable()\nexport class DrawerService {\n  public readonly isOpened = signal(false);\n  public readonly isExtended = signal(false);\n\n  private readonly backdrop = inject(BackdropService);\n\n  public open(): void {\n    this.isOpened.set(true);\n  }\n\n  public close(): void {\n    this.collapse();\n    this.isOpened.set(false);\n  }\n\n  public toggle(): void {\n    if (this.isOpened()) {\n      this.close();\n    } else {\n      this.open();\n    }\n  }\n\n  public extend(): void {\n    this.isExtended.set(true);\n    this.backdrop.show();\n  }\n\n  public collapse(): void {\n    this.backdrop.hide();\n    this.isExtended.set(false);\n  }\n\n  public toggleExtension(): void {\n    if (this.isExtended()) {\n      this.collapse();\n    } else {\n      this.extend();\n    }\n  }\n}\n","import {\n  afterNextRender,\n  Component,\n  ElementRef,\n  effect,\n  HostBinding,\n  HostListener,\n  inject,\n  signal,\n  viewChild\n} from \"@angular/core\";\n\nimport { SelectionHistoryService } from \"../../services/selection-history.service\";\nimport { DrawerStackService } from \"../drawer-stack/drawer-stack.service\";\nimport { DrawerService } from \"./drawer.service\";\n\n/**\n * Each Drawer component has it's own drawer service to handle its state and link it to the drawer stack.\n */\n\n/**\n * @deprecated we do not use it anymore.\n */\n@Component({\n  selector: \"Drawer, drawer\",\n  standalone: true,\n  providers: [DrawerService],\n  template: ``,\n  styleUrl: \"./drawer.component.css\",\n  host: {\n    \"[attr.drawer-opened]\": \"drawerOpened()\",\n    \"[attr.drawer-extended]\": \"drawerExtended()\"\n  }\n})\nexport class DrawerComponent {\n  public drawerOpened = signal(false);\n  public drawerExtended = signal(false);\n\n  @HostBinding(\"style.grid-template-columns\")\n  public drawerGridTemplateColumns: string = \"\";\n\n  @HostListener(\"mousemove\", [\"$event\"])\n  public mouseMove(event: MouseEvent): void {\n    if (!this.isSliding) return;\n\n    const min = (window.innerWidth * 3) / 100;\n    const max = (window.innerWidth * 46) / 100;\n    const width = Math.min(Math.max(event.clientX, min), max);\n\n    this.drawerGridTemplateColumns = `${width}px minmax(min-content, 1fr) var(--drawer-subdrawer-width)`;\n  }\n\n  @HostListener(\"mousedown\", [\"$event\"])\n  public mouseDown(event: MouseEvent): void {\n    if (event.target !== this.drawerHandle()?.nativeElement) return;\n\n    this.disableAnimation();\n    this.isSliding = true;\n  }\n\n  @HostListener(\"mouseup\")\n  public mouseUp(): void {\n    if (this.isSliding) this.enableAnimation();\n\n    this.isSliding = false;\n  }\n\n  drawerHandle = viewChild<ElementRef>(\"drawerHandle\");\n\n  public readonly drawer = inject(DrawerService);\n  protected readonly drawerStack = inject(DrawerStackService);\n\n  protected readonly element = inject(ElementRef).nativeElement;\n  protected readonly selectionHistory = inject(SelectionHistoryService);\n\n  private isSliding = false;\n  private defaultDrawerGridTemplate = \"\";\n\n  constructor() {\n    afterNextRender(() => {\n      this.drawerGridTemplateColumns = this.element.style.gridTemplateColumns;\n    });\n\n    effect(() => {\n      this.drawerOpened.set(this.drawer.isOpened());\n      if (!this.drawer.isOpened()) this.resetGridTemplateColumns();\n    });\n\n    effect(() => {\n      this.drawerExtended.set(this.drawer.isExtended());\n      if (!this.drawer.isExtended()) this.resetGridTemplateColumns();\n    });\n  }\n\n  private disableAnimation(): void {\n    this.element.classList.add(\"no-transition-important\");\n  }\n\n  private enableAnimation(): void {\n    this.element.classList.remove(\"no-transition-important\");\n  }\n\n  private resetGridTemplateColumns(): void {\n    this.element.style.gridTemplateColumns = this.defaultDrawerGridTemplate;\n  }\n}\n","import { Component, inject } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { ArrowLeftIcon, ButtonComponent, VerticalDividerComponent } from \"@sinequa/ui\";\n\nimport { DrawerStackService } from \"../../drawer-stack/drawer-stack.service\";\nimport { DrawerService } from \"../drawer.service\";\n\n/**\n * Navbar component for drawers, providing navigation controls such as a back button.\n * It interacts with the DrawerStackService to manage drawer navigation.\n *\n * @deprecated we do not use it anymore.\n */\n@Component({\n  selector: \"DrawerNavbar, drawernavbar\",\n  standalone: true,\n  imports: [TranslocoPipe, ButtonComponent, VerticalDividerComponent, ArrowLeftIcon],\n  template: `\n    <menu class=\"flex items-center gap-2 p-4 font-semibold\">\n      <li>\n        <button variant=\"ghost\" class=\"group\" [attr.title]=\"'back' | transloco\" (click)=\"drawerStack.close()\">\n          <arrow-left-icon class=\"-ms-1 transition-transform opacity-60 group-hover:-translate-x-0.5\" />\n          {{ 'back' | transloco }}\n        </button>\n      </li>\n\n      <li role=\"presentation\">\n        <VerticalDivider class=\"min-h-8\" />\n      </li>\n\n      <ng-content></ng-content>\n    </menu>\n  `\n})\nexport class DrawerNavbarComponent {\n  protected readonly drawerStack = inject(DrawerStackService);\n  protected readonly drawerService = inject(DrawerService);\n\n  readonly isExtended = this.drawerService.isExtended();\n}\n","import { Overlay } from \"@angular/cdk/overlay\";\nimport { Component, computed, effect, inject, signal } from \"@angular/core\";\nimport { NonNullableFormBuilder, ReactiveFormsModule } from \"@angular/forms\";\nimport { ActivatedRoute, Router } from \"@angular/router\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\n\nimport {\n  aggItemRegex,\n  Aggregation,\n  AggregationItem,\n  fetchQuery,\n  FilterOperator,\n  LegacyFilter,\n  notify,\n  parseValueAndOperatorFromItem,\n  translateAggregationToDateOptions,\n  TreeAggregation,\n  TreeAggregationNode\n} from \"@sinequa/atomic\";\nimport { ButtonComponent, InputComponent, TabComponent, TabsComponent, TabsListComponent } from \"@sinequa/ui\";\n\nimport { DropdownInputComponent, DropdownItem } from \"../../../components\";\nimport { SyslangPipe } from \"../../../pipes\";\nimport { AppStore, QueryParamsStore } from \"../../../stores\";\nimport { DrawerComponent } from \"../drawer.component\";\nimport { DrawerService } from \"../drawer.service\";\nimport { DrawerNavbarComponent } from \"../navbar/drawer-navbar.component\";\n\ntype Operator = \"all\" | \"exact\" | \"any\" | \"none\" | \"matches\";\n\ninterface Filter {\n  column: string;\n  alias: string;\n  display?: string;\n  items?: (AggregationItem | TreeAggregationNode)[];\n}\n\ninterface Tab {\n  path: string;\n  display?: string;\n}\n\nconst searchRoute = \"search\";\n\n/**\n * Advanced filters drawer component allowing users to apply complex filters to their search queries.\n * It provides a user interface for selecting filter criteria, managing applied filters,\n * and executing searches with the specified filters.\n *\n * This component extends the base DrawerComponent and integrates with the application's\n * query parameters store and app store to manage filter states and search execution.\n *\n * @deprecated Use the `AdvancedFiltersComponent` component instead.\n */\n@Component({\n  selector: \"advanced-filters\",\n  standalone: true,\n  imports: [\n    ReactiveFormsModule,\n    TranslocoPipe,\n    SyslangPipe,\n    DrawerNavbarComponent,\n    DropdownInputComponent,\n    ButtonComponent,\n    InputComponent,\n    TabsComponent,\n    TabComponent,\n    TabsListComponent\n  ],\n  providers: [DrawerService, SyslangPipe, TranslocoPipe, provideTranslocoScope(\"drawers\")],\n  templateUrl: \"./advanced-filters.component.html\",\n  styleUrls: [\"./advanced-filters.component.css\"],\n  host: {\n    class: \"fixed bg-background grid h-full top-0 -right-full justify-end\"\n  }\n})\nexport class DrawerAdvancedFiltersComponent extends DrawerComponent {\n  private readonly queryParamsStore = inject(QueryParamsStore);\n  private readonly appStore = inject(AppStore);\n  private readonly router = inject(Router);\n  private readonly route = inject(ActivatedRoute);\n  private readonly formBuilder = inject(NonNullableFormBuilder);\n  private readonly overlay = inject(Overlay);\n  private readonly transloco = inject(TranslocoService);\n  private readonly syslangPipe = inject(SyslangPipe);\n  private readonly translocoPipe = inject(TranslocoPipe);\n\n  protected scrollStrategy = this.overlay.scrollStrategies.reposition();\n  protected noop = this.overlay.scrollStrategies.noop();\n\n  selectData: { operator: string; display: string; placeholder?: string }[] = [\n    { operator: \"all\", display: \"filterContainsAll\" },\n    { operator: \"exact\", display: \"filterContainsExact\" },\n    { operator: \"any\", display: \"filterContainsAny\" },\n    { operator: \"none\", display: \"filterContainsNone\" },\n    { operator: \"matches\", display: \"filterMatches\", placeholder: \"you can use AND/OR criteria\" }\n  ];\n\n  protected readonly form = this.formBuilder.group({\n    content: this.formBuilder.group({\n      operator: this.formBuilder.control<Operator>(\"all\"),\n      value: this.formBuilder.control(undefined)\n    }),\n    title: this.formBuilder.group({\n      operator: this.formBuilder.control<Operator>(\"all\"),\n      value: this.formBuilder.control(undefined)\n    })\n  });\n\n  currentTab = signal<string>(\"all\");\n  currentFilter = signal<string | undefined>(undefined);\n  appliedFilters = signal<{ column: string; values: DropdownItem[] }[]>([]);\n  suggestions = signal<DropdownItem[]>([]);\n  aggregations = signal<(Aggregation | TreeAggregation)[]>([]);\n  inputVariant = signal<\"default\" | \"destructive\">(\"default\");\n\n  tabs = computed<Tab[]>(() => {\n    const routeData = this.router.config.find((c) => c.path === searchRoute);\n    return !routeData\n      ? []\n      : [{ path: \"all\", display: \"All\" }].concat(\n          routeData\n            .children!.filter((c) => !!c.path && c.path !== \"all\" && c.path !== \"**\")\n            .map((c) => ({ path: c.path!, display: c.data?.[\"display\"] }))\n        );\n  });\n\n  filters = computed<Filter[]>(() => {\n    const cjsonFilters =\n      this.appStore\n        .customizationJson()\n        .filters?.filter((f) => f.column !== \"#date\")\n        .map((f) => ({\n          column: f.column,\n          alias: this.appStore.getColumnAlias(f.column),\n          display: f.display,\n          items: this.aggregations()?.find((a) => a.column === f.column)?.items\n        })) || [];\n\n    const agg =\n      this.aggregations()\n        .filter((f) => !cjsonFilters.some((cf) => cf.column === f.column))\n        .map((f: any) => ({\n          column: f.column,\n          alias: this.appStore.getColumnAlias(f.column),\n          display: f.display,\n          items: f.column !== \"treepath\" ? f.items : this.getWithSubItems(f.items)\n        })) || [];\n\n    return cjsonFilters.concat(agg);\n  });\n\n  protected enableFieldedSearch = computed(() => {\n    const { queryName } = this.route.snapshot.data;\n    return this.appStore.enableFieldedSearch(queryName);\n  });\n\n  protected allowEmptySearch = computed(() => {\n    const { queryName } = this.route.snapshot.data;\n    return this.appStore.allowEmptySearch(queryName);\n  });\n\n  text: string = \"\";\n\n  constructor() {\n    super();\n    effect(() => {\n      getState(this.appStore);\n      const query = this.appStore.getDefaultQuery();\n      if(query?.name) {\n        this.getFirstPageQuery(query?.name);\n      }\n    })\n  }\n\n  async getFirstPageQuery(queryName: string) {\n    const response = await fetchQuery({ isFirstPage: true, name: queryName });\n    this.aggregations.set(response.aggregations);\n  }\n\n  onTabChange(tab: string): void {\n    this.currentTab.set(tab);\n  }\n\n  onSearch(): void {\n    // this params alters the query text\n    const { content, title } = this.form.value;\n\n    if (!this.allowEmptySearch() && !content?.value && !title?.value) {\n      notify.error(this.transloco.translate(\"drawers.emptySearchNotAllowed\"), { duration: 2000 });\n      this.inputVariant.set(\"destructive\");\n      return;\n    } else {\n      this.inputVariant.set(\"default\");\n    }\n\n    const fieldedText = [];\n    if (content?.value) {\n      const { operator = \"any\", value = \"\" } = content;\n      const text = this.formatFilter(operator, value);\n      fieldedText.push(text);\n    }\n    if (title?.value) {\n      const { operator = \"any\", value = \"\" } = title;\n      const text = this.formatFilter(operator, value, \"title\");\n      fieldedText.push(text);\n    }\n\n    let text = this.text;\n\n    // now we have to join the fieldedText with the text\n    // if text is empty, we must remove the leading space\n    // if text is not empty, we must add a AND before the fieldedText\n    if (text && fieldedText.length) {\n      text = `${text} AND ${fieldedText.join(\" AND \")}`;\n    } else {\n      text = fieldedText.join(\" AND \");\n    }\n    this.queryParamsStore.patch({ text });\n\n    const filters: LegacyFilter[] = [];\n    this.appliedFilters().forEach((filter) => {\n      if (filter.values.length) {\n        // todo should handle dates? how?\n        /* if (filter.column.startsWith('modified') || filter.column.startsWith('date')) {\n          const valueFrom = this.customFilters.value[`${filter}From`]?.trim();\n          const valueTo = this.customFilters.value[`${filter}To`]?.trim();\n          if (valueFrom) {\n            filters.push(...this.getFilter('like', valueFrom, filter.column));\n          }\n          if (valueTo) {\n            filters.push(...this.getFilter('like', valueTo, filter.column));\n          }\n        } else { */\n        filters.push(...this.getFilter(\"in\", filter.values, filter.column));\n      }\n    });\n\n    this.queryParamsStore.clearFilters();\n    if (filters.length) {\n      filters.forEach((filter) => {\n        this.queryParamsStore.updateFilter(filter);\n      });\n    }\n\n    this.drawerStack.close();\n\n    // ! we need to remove the page parameter from the query params when new search is performed\n    const { name } = this.queryParamsStore.getQuery();\n    this.router.navigate([`/${searchRoute}/${this.currentTab()}`], {\n      queryParams: { q: text, p: undefined, t: this.currentTab(), n: name, f: JSON.stringify(filters) },\n      queryParamsHandling: \"merge\"\n    });\n  }\n\n  /** Generate the LegacyFilter to add to the query */\n  private getFilter(operator: FilterOperator, values: DropdownItem[], field: string): LegacyFilter[] {\n    const value = values[0].value;\n    const display = values[0].display;\n    if (this.appStore.isDateColumn(field)) {\n      // dates\n      const agg = this.aggregations().find((a) => a.column === field);\n      if (agg) {\n        const options = translateAggregationToDateOptions(agg, false);\n        const option = options.find((o) => !!o.display && value.indexOf(o.display) !== -1);\n        if (option)\n          return [\n            {\n              name: agg.name,\n              operator: option?.operator,\n              field: agg.column,\n              display: option.display ?? \"\",\n              filters: option.filters,\n              value: option.value\n            }\n          ];\n      }\n\n      const op = field.endsWith(\"From\") ? \"gte\" : \"lte\";\n      const f = field.split(field.endsWith(\"From\") ? \"From\" : \"To\")[0];\n      return [{ operator: op, value, field: f }];\n    } else {\n      const agg = this.aggregations().find((a) => a.column === field);\n\n      // if AggregationItem\n      if (!!value.match(aggItemRegex)?.[1] && !!agg) {\n        const items = agg.items.filter((item) => values.some((v) => item.value === v.value));\n        const filters = items.map((item) => parseValueAndOperatorFromItem(item, field));\n        return [\n          {\n            operator: \"or\",\n            filters,\n            name: agg.name,\n            field,\n            display: this.translocoPipe.transform(this.syslangPipe.transform(display || value))\n          }\n        ];\n      }\n\n      switch (operator) {\n        case \"contains\":\n        case \"in\":\n          return [\n            {\n              operator,\n              name: agg?.name,\n              values: values.map((v) => v.value),\n              field,\n              display: display || value,\n              filters: values.map((v) => ({\n                operator: \"contains\",\n                name: agg?.name,\n                field,\n                value: v.value,\n                display: v.display\n              }))\n            }\n          ];\n        case \"eq\":\n        case \"like\":\n          return [{ operator, value, field, display: display || value }];\n        default:\n          return [];\n      }\n    }\n  }\n\n  /** Format content/title filters */\n  private formatFilter(operator: Operator, value: string, field: \"title\" | \"\" = \"\"): string {\n    const fieldStr = field ? `${field}::` : \"\";\n    switch (operator) {\n      case \"all\":\n        return `${fieldStr}[${value}]`;\n      case \"exact\":\n        return `${fieldStr}\"${value}\"`;\n      case \"matches\": {\n        // value can be separated by AND or OR keywords, if it's the case each words must be written field:word1 AND field:word2 etc...\n        const words = value.split(/\\s+(AND|OR)\\s+/);\n        return words\n          .map((w) => {\n            if (w === \"AND\" || w === \"OR\") return w;\n            return `(${fieldStr}${w})`;\n          })\n          .join(\" \");\n      }\n      case \"any\": {\n        const splitWords = value.split(\" \");\n        return `(${splitWords.map((w) => `${fieldStr}[${w}]`).join(\" OR \")})`;\n      }\n      case \"none\":\n        return `${fieldStr}NOT [${value}]`;\n      default:\n        return value;\n    }\n  }\n\n  getPlaceholder(key: string): string {\n    return (\n      this.selectData.find((d) => d.operator === this.form.get(key)?.value)?.placeholder ||\n      this.transloco.translate(\"drawers.searchWords\")\n    );\n  }\n\n  /** Get applied filters for a column */\n  getItems(column: string): DropdownItem[] {\n    return this.appliedFilters().find((f) => f.column === column)?.values || [];\n  }\n\n  /** add item to current selection */\n  addItem(item: DropdownItem, filter: Filter): void {\n    const appliedFilter = this.appliedFilters().find((af) => af.column === filter.column);\n    if (!appliedFilter) {\n      this.appliedFilters.set(this.appliedFilters().concat([{ column: filter.column, values: [item] }]));\n    } else if (!appliedFilter.values.some((v) => v.value === item.value)) {\n      if (this.appStore.isDateColumn(filter.column)) {\n        appliedFilter.values = [item]; // only one item for date filters\n      } else {\n        appliedFilter.values.push(item);\n      }\n    }\n  }\n\n  /** remove item from current selection */\n  removeItem(item: DropdownItem, filter: Filter): void {\n    const appliedFilter = this.appliedFilters().find((af) => af.column === filter.column);\n    if (appliedFilter) {\n      appliedFilter.values = appliedFilter.values.filter((v) => v.value !== item.value);\n    }\n  }\n\n  /** Update suggestions on input focus */\n  setFilterFocus(value: string | null, filter: Filter): void {\n    this.currentFilter.set(filter.column);\n    this.setSuggestions(value);\n  }\n\n  /** Update suggestions when typing */\n  onInputTyping(value: string | null): void {\n    this.setSuggestions(value);\n  }\n\n  private setSuggestions(value: string | null): void {\n    this.suggestions.set([]);\n    const filter = this.filters().find((f) => f.column === this.currentFilter());\n    if (!!value && !!filter && filter.items?.length) {\n      this.suggestions.set(\n        this.getSuggestionItems(value.toLowerCase(), filter.items).map((i) => ({\n          display: i.display || String(i.value),\n          value: String(filter.column === \"treepath\" ? `/${(i as TreeAggregationNode).$path || i.value}/*` : i.value)\n        }))\n      );\n    }\n  }\n\n  private getSuggestionItems(\n    value: string,\n    items: (AggregationItem | TreeAggregationNode)[]\n  ): (AggregationItem | TreeAggregationNode)[] {\n    const res = items.filter(\n      (i) =>\n        (!!i.display && i.display.toLowerCase().indexOf(value) !== -1) ||\n        String(i.value).toLowerCase().indexOf(value) !== -1\n    );\n    // todo handle tree items\n    return res;\n  }\n\n  private getWithSubItems(items: TreeAggregationNode[]): TreeAggregationNode[] {\n    const res = [...items];\n    items.forEach((item) => {\n      if (item.hasChildren && item.items?.length) {\n        res.push(...this.getWithSubItems(item.items));\n      }\n    });\n    return res;\n  }\n}\n","<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"flex h-full flex-col overflow-auto\">\n  <DrawerNavbar class=\"border-foreground/10 block border-b\">\n    <button [attr.title]=\"'drawers.search' | transloco\" (click)=\"onSearch()\">\n      {{ 'drawers.search' | transloco }}\n    </button>\n  </DrawerNavbar>\n\n  <div class=\"flex h-full grow flex-col overflow-auto\">\n    <section class=\"flex flex-col gap-4 p-6\" [formGroup]=\"form\">\n      <!-- FIND IN -->\n      <h1 class=\"text-xl font-bold\">{{ 'drawers.findInContent' | transloco }}</h1>\n      <div class=\"flex items-center gap-4\" formGroupName=\"content\">\n        <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInContent' | transloco }}</span>\n        <select\n          id=\"content-operator\"\n          class=\"hover:outline-primary focus:outline-primary border-foreground/10 bg-background hover:bg-muted focus:bg-muted h-8 w-full rounded-md border px-2 hover:outline focus:outline\"\n          formControlName=\"operator\">\n          @for (data of selectData; track $index) {\n            <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n          }\n        </select>\n        <input\n          [variant]=\"inputVariant()\"\n          id=\"content-value\"\n          type=\"text\"\n          autocomplete=\"off\"\n          spellcheck=\"false\"\n          [placeholder]=\"getPlaceholder('content.operator')\"\n          formControlName=\"value\" />\n      </div>\n      @if (enableFieldedSearch()) {\n        <div class=\"flex items-center gap-4\" formGroupName=\"title\">\n          <span class=\"w-1/3 font-semibold\">{{ 'drawers.findInTitle' | transloco }}</span>\n          <select\n            id=\"title-operator\"\n            class=\"hover:outline-primary focus:outline-primary border-foreground/10 bg-background hover:bg-muted focus:bg-muted h-8 w-full rounded-md border px-2 hover:outline focus:outline\"\n            formControlName=\"operator\">\n            @for (data of selectData; track $index) {\n              <option [value]=\"data.operator\">{{ 'drawers.' + data.display | transloco }}</option>\n            }\n          </select>\n          <input id=\"title-value\" type=\"text\" autocomplete=\"off\" spellcheck=\"false\" [placeholder]=\"getPlaceholder('title.operator')\" formControlName=\"value\" />\n        </div>\n      }\n\n      <!-- TABS -->\n      <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.inScope' | transloco }}&nbsp;&quot;{{ currentTab() }}&quot;</h1>\n\n      <Tabs>\n        <TabsList variant=\"ghost\">\n          @for (tab of tabs(); track $index) {\n            <Tab class=\"w-fit\" [value]=\"tab.path\" [active]=\"tab.path === currentTab()\" (click)=\"onTabChange(tab.path)\">\n              {{ tab.display | syslang | transloco }}\n            </Tab>\n          }\n        </TabsList>\n      </Tabs>\n\n      <!-- FILTERS -->\n      <h1 class=\"mt-4 text-xl font-bold\">{{ 'drawers.applyFilters' | transloco }}</h1>\n      @for (filter of filters(); track $index) {\n        <DropdownInput\n          [suggestions]=\"suggestions()\"\n          [selected]=\"getItems(filter.column)\"\n          [label]=\"filter.display || filter.alias | syslang | transloco\"\n          [placeholder]=\"'drawers.startTyping' | transloco\"\n          [noResultLabel]=\"'drawers.noResult' | transloco\"\n          (onFocus)=\"setFilterFocus($event, filter)\"\n          (onKeyUp)=\"onInputTyping($event)\"\n          (removeItem)=\"removeItem($event, filter)\"\n          (addItem)=\"addItem($event, filter)\" />\n      } @empty {\n        {{ 'drawers.noFilters' | transloco }}\n      }\n    </section>\n  </div>\n</div>\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport { Component, computed, inject, input, signal } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { type Article, type CCWebService, debug, notify, warn } from \"@sinequa/atomic\";\nimport { ChevronLeftIcon, ChevronRightIcon, cn, FaIconComponent, HighlighterIcon, ListItemComponent } from \"@sinequa/ui\";\n\nimport type { ArticleMetadata } from \"../../../../models\";\nimport { PreviewService } from \"../../../../services\";\nimport { AppStore } from \"../../../../stores/app.store\";\n\ninterface MetadataNavigation {\n  index: number;\n  value: string;\n}\n\ntype PreviewWebService = CCWebService & {\n  highlights?: string;\n};\n\n/**\n * A panel that displays entities extracted from a given article.\n * It retrieves metadata for each entity type and allows users to navigate through occurrences of each entity.\n * The panel is designed to be used within an advanced search drawer.\n *\n * @deprecated Use the `ArticleEntities` component instead.\n */\n@Component({\n  selector: \"entities-panel,EntitiesPanel,entitiesPanel\",\n  imports: [TranslocoPipe, NgTemplateOutlet, ListItemComponent, ChevronRightIcon, ChevronLeftIcon, FaIconComponent, HighlighterIcon],\n  template: `\n    <details class=\"group/parent\" name=\"advanced-search-panels\">\n      <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3\">\n        <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n          <highlighter-icon />\n          {{ 'entities' | transloco }}\n        </p>\n\n        <chevronright class=\"transition-transform duration-150 group-open/parent:rotate-90\" />\n      </summary>\n      @for (highlight of previewHighlights(); track $index) {\n        @if (highlight.metadata) {\n          <ng-container *ngTemplateOutlet=\"metadataPanel; context: highlight\" />\n        }\n      }\n    </details>\n\n    <!-- entities's template -->\n    <ng-template #metadataPanel let-metadata=\"metadata\" let-name=\"name\" let-iconClass=\"iconClass\" let-entity=\"entity\">\n      <details class=\"group/entities p-3 first:pt-0\" name=\"advanced-search-entities\">\n        <summary class=\"sticky top-8 flex cursor-pointer select-none items-baseline justify-between\">\n          <p class=\"flex items-baseline gap-2 font-semibold capitalize\">\n            <FaIcon [faClass]=\"iconClass || 'far fa-list'\" />\n            {{ name | transloco }}\n          </p>\n\n          <chevronright class=\"transition-transform duration-150 group-open/entities:rotate-90\" />\n        </summary>\n\n        <ul role=\"list\">\n          @for (data of metadata; track $index) {\n            <li role=\"listitem\" class=\"flex justify-between py-1 pl-2 select-none transition-transform duration-200 hover:-translate-x-2\" (mouseenter)=\"hovering.set(data.value)\" (mouseleave)=\"hovering.set(undefined)\">\n              <!-- shrink w-1/2 grow truncate ovoid the overlap when hovering the row -->\n              <p class=\"w-1/2 shrink grow truncate\">{{ data.display }}</p>\n\n              <p class=\"flex items-center gap-2\">\n                @if (hovering() === data.value) {\n                  <button class=\"hover:scale-125\" aria-label=\"previous entity\" (click)=\"navigatePrev(entity, data)\">\n                    <chevronleft />\n                  </button>\n\n                  <span>{{ hoverIndex() }} / {{ data.count }}</span>\n\n                  <button class=\"hover:scale-125\" aria-label=\"next entity\" role=\"button\" (click)=\"navigateNext(entity, data)\">\n                    <chevronright />\n                  </button>\n                } @else {\n                  {{ data.count }}\n                }\n              </p>\n            </li>\n          }\n        </ul>\n      </details>\n    </ng-template>\n  `\n})\nexport class EntitiesPanel {\n  cn = cn;\n  protected readonly appStore = inject(AppStore);\n  protected readonly previewService = inject(PreviewService);\n\n  public readonly article = input.required<Article>();\n\n  protected readonly previewHighlights = computed(() => {\n    const highlights = (this.appStore.getWebServiceByType(\"preview\") as PreviewWebService)?.highlights\n      ?.split(\",\")\n      .filter((h) => h !== \"extractslocations\" && h !== \"matchlocations\" && h !== \"matchingpassages\");\n\n    return highlights?.map((highlight) => ({\n      name: highlight,\n      entity: highlight,\n      metadata: this.getMetadata(this.article(), highlight)\n    }));\n  });\n\n  public getMetadata(article: Partial<Article & Record<string, unknown>>, entity: string): ArticleMetadata[] {\n    const m = article[entity] as ArticleMetadata[] | undefined;\n    return m ?? [];\n  }\n\n  public navigation = signal<MetadataNavigation | undefined>(undefined);\n\n  public hovering = signal<string | undefined>(undefined);\n  public hoverIndex = computed(() =>\n    this.navigation()?.value === this.hovering() ? (this.navigation()?.index ?? 0) : 0\n  );\n\n  scrollTo(type: string | undefined, index: number, usePassageHighlighter: boolean = false) {\n    // if previewData contains \"matchingpassages\" then we use the passage highlighter otherwise we use \"extractslocations\"\n    const category = type || this.previewService.highlightCategory;\n    this.previewService.events.set(\"scrollTo\");\n    this.previewService.sendMessage({ action: \"select\", id: `${category}_${index}`, usePassageHighlighter });\n  }\n\n  private navigate(entity: string, data: ArticleMetadata, direction: \"next\" | \"prev\") {\n    if (!data.count || data.count <= 0) {\n      warn(`Invalid count for entity ${entity}:`, data.count);\n      return;\n    }\n\n    const currentNavigation = this.navigation();\n    const isCurrentValue = currentNavigation?.value === data.value;\n\n    let newIndex: number;\n\n    if (direction === \"next\") {\n      newIndex = isCurrentValue && currentNavigation.index < data.count ? currentNavigation.index + 1 : 1;\n    } else {\n      newIndex = isCurrentValue && currentNavigation.index > 1 ? currentNavigation.index - 1 : data.count;\n    }\n\n    this.navigation.set({\n      value: data.value,\n      index: newIndex\n    });\n\n    const id = this.previewService.getEntityId(entity, data.value, newIndex - 1);\n\n    if (id !== undefined) {\n      this.scrollTo(entity, id);\n      debug(`${direction} navigation:`, {\n        id,\n        entity,\n        value: data.value,\n        index: newIndex,\n        totalCount: data.count\n      });\n    } else {\n      warn(`Unable to get ID for ${direction} navigation:`, { entity, value: data.value, index: newIndex });\n      notify.warning(`Unable to navigate to the ${direction} occurrence of \"${data.value}\".`);\n    }\n  }\n\n  navigateNext(entity: string, data: ArticleMetadata) {\n    this.navigate(entity, data, \"next\");\n  }\n\n  navigatePrev(entity: string, data: ArticleMetadata) {\n    this.navigate(entity, data, \"prev\");\n  }\n}\n","import { Component, DestroyRef, effect, inject, input, signal } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\nimport type { Article } from \"@sinequa/atomic\";\n\nimport { ChevronRightIcon, cn, SpinnerIcon, TagsIcon } from \"@sinequa/ui\";\n\nimport { PreviewService } from \"../../../../services\";\nimport { ApplicationStore, type Extract } from \"../../../../stores\";\n\n/**\n * A panel that displays extracts related to a given article.\n * It retrieves extracts from the application store and allows users to scroll to specific extracts in the preview.\n * The panel is designed to be used within an advanced search drawer.\n *\n * @deprecated Use the `ArticleExtracts` component instead.\n */\n@Component({\n  selector: \"extracts-panel, ExtractsPanel, extractspanel\",\n  imports: [TranslocoPipe, ChevronRightIcon, TagsIcon, SpinnerIcon],\n  template: `\n    <details class=\"group\" name=\"advanced-search-panels\" open>\n      <summary [class]=\"cn('sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3', '')\">\n        <p class=\"flex items-baseline gap-2 font-semibold\">\n          <tags-icon />\n          {{ 'extracts' | transloco }}\n        </p>\n\n        <chevronright class=\"transition-transform duration-150 group-open:rotate-90\" />\n      </summary>\n\n      @if (loading()) {\n        <div class=\"flex h-32 items-center justify-center\">\n          <spinner-icon class=\"animate-spin text-primary\" />\n        </div>\n      } @else {\n        <ul>\n          @for (extract of extracts(); track $index) {\n            <li class=\"hover:bg-foreground/10 mr-2 rounded px-2 py-1\" [id]=\"extract.id\" [attr.data-id]=\"extract.textIndex\">\n              <p class=\"cursor-pointer\" role=\"button\" [innerHTML]=\"extract.text\" (click)=\"scrollTo(undefined, extract.textIndex, true)\"></p>\n            </li>\n          } @empty {\n            <li class=\"text-slate-300\">{{ 'drawers.noRelevantExtracts' | transloco }}</li>\n          }\n        </ul>\n      }\n    </details>\n  `\n})\nexport class ExtractsPanel {\n  cn = cn;\n  protected readonly destroyRef = inject(DestroyRef);\n\n  protected readonly applicationStore = inject(ApplicationStore);\n  protected readonly previewService = inject(PreviewService);\n\n  public readonly article = input.required<Article>();\n\n  loading = signal(true);\n\n  protected readonly extracts = signal<Extract[]>([]);\n\n  constructor() {\n    effect(() => {\n      this.loading.set(this.previewService.events() === \"fetching\");\n    });\n\n    effect(() => {\n      const { id } = this.article();\n\n      if (id && !this.loading()) {\n        this.extracts.set(this.applicationStore.getExtracts(id));\n      }\n    });\n  }\n\n  scrollTo(type: string | undefined, index: number, usePassageHighlighter: boolean = false) {\n    // if previewData contains \"matchingpassages\" then we use the passage highlighter otherwise we use \"extractslocations\"\n    const category = type || this.previewService.highlightCategory;\n    this.previewService.events.set(\"scrollTo\");\n    this.previewService.sendMessage({ action: \"select\", id: `${category}_${index}`, usePassageHighlighter });\n  }\n}\n","import { Component, computed, inject, input } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport type { Article } from \"@sinequa/atomic\";\nimport { ChevronRightIcon, TagsIcon } from \"@sinequa/ui\";\nimport { MetadataComponent } from \"../../../../components\";\nimport { AppStore } from \"../../../../stores\";\n\n/**\n * A panel that displays the labels associated with a given article.\n * It checks for the presence of public and private labels and displays them using the Metadata component.\n * The panel is designed to be used within an advanced search drawer.\n * @deprecated Use the `ArticleLabels` component instead.\n */\n@Component({\n  selector: \"labels-panel, LabelsPanel, labelspanel\",\n  imports: [TranslocoPipe, MetadataComponent, ChevronRightIcon, TagsIcon],\n  template: `\n    @if (hasLabels()) {\n      <details class=\"group\" name=\"advanced-search-panels\">\n        <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3\">\n          <p class=\"flex items-baseline gap-2 font-semibold\">\n            <tags-icon />\n            {{ 'labels' | transloco }}\n          </p>\n\n          <chevronright class=\"transition-transform duration-150 group-open:rotate-90\" />\n        </summary>\n\n        <div>\n          <ul class=\"mt-4 flex flex-col flex-wrap gap-2\">\n            <li>\n              <Metadata [article]=\"article()!\" [metadata]=\"labels.public\" />\n            </li>\n\n            <li>\n              <Metadata [article]=\"article()!\" [metadata]=\"labels.private\" />\n            </li>\n          </ul>\n        </div>\n      </details>\n    }\n  `\n})\nexport class LabelsPanel {\n  protected readonly labels = inject(AppStore).getLabels();\n\n  public readonly article = input.required<Article>();\n\n  public readonly hasLabels = computed(() => {\n    const article = this.article();\n    const articleRecord = article as Record<string, unknown>;\n    const publicLabels = articleRecord[this.labels.public] as string[] | undefined;\n    const privateLabels = articleRecord[this.labels.private] as string[] | undefined;\n    return (publicLabels && publicLabels.length > 0) || (privateLabels && privateLabels.length > 0);\n  });\n}\n","import { Component, computed, inject, input, output, resource } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { type Article, fetchSimilarDocuments } from \"@sinequa/atomic\";\nimport { ChevronRightIcon, ListItemComponent, TagsIcon } from \"@sinequa/ui\";\nimport { SourceComponent } from \"../../../../components\";\nimport { SelectArticleOnClickDirective, SelectionStrategy } from \"../../../../directives\";\nimport { QueryParamsStore } from \"../../../../stores\";\n\n/**\n * A panel that displays documents similar to a given article.\n * It fetches similar documents based on the article's ID and the current query name.\n * The panel allows users to select a similar document, emitting the selected article.\n * It uses Angular's standalone component feature and various UI components and directives.\n * The component is designed to be used within an advanced search drawer.\n *\n * @deprecated Use the `SimilarDocumentsPanelComponent` without the Drawer instead.\n */\n@Component({\n  selector: \"similar-documents-panel, SimilarDocumentsPanel, similardocumentspanel\",\n  imports: [TranslocoPipe, SelectArticleOnClickDirective, SourceComponent, ListItemComponent, ChevronRightIcon, TagsIcon],\n  template: `\n    @if (similarDocuments().length > 0) {\n      <details class=\"group\" name=\"advanced-search-panels\">\n        <summary class=\"sticky top-0 flex cursor-pointer select-none items-baseline justify-between p-3\">\n          <p class=\"flex items-baseline gap-2 font-semibold\">\n            <tags-icon />\n            {{ 'drawers.similarDocuments' | transloco }}\n          </p>\n\n          <chevronright class=\"transition-transform duration-150 group-open:rotate-90\" />\n        </summary>\n\n        <div>\n          <ul class=\"mb-2 mt-4 flex flex-col flex-wrap px-2\" role=\"list\">\n            @for (document of similarDocuments(); track $index) {\n              <li role=\"listitem\" selectArticleOnClick [article]=\"document\" [strategy]=\"strategy() || 'stack'\" (selected)=\"selected.emit(document)\">\n                <div class=\"text-primary flex size-5 items-center justify-center rounded-full\">\n                  <source [collection]=\"article().collection\" [connector]=\"article().connector\" class=\"text-xs\" />\n                </div>\n\n                <span>{{ document.displayTitle ?? document.title }}</span>\n              </li>\n            }\n          </ul>\n        </div>\n      </details>\n    }\n  `\n})\nexport class SimilarDocumentsPanel {\n  protected readonly queryParamsStore = inject(QueryParamsStore);\n\n  public readonly article = input.required<Article>();\n  public readonly strategy = input<SelectionStrategy | undefined>(\"stack\");\n\n  public readonly selected = output<Article>();\n\n  queryName = computed(() => this.queryParamsStore.getQuery().name);\n\n  readonly similarDocumentsResource = resource({\n    params: () => {\n      const { id } = this.article() || {};\n      return { id };\n    },\n    loader: ({ params: { id }, abortSignal }) => {\n      const queryName = this.queryName();\n      return fetchSimilarDocuments(id, queryName, abortSignal);\n    },\n    defaultValue: [] as Article[]\n  });\n\n  protected readonly similarDocuments = computed(() => {\n    if (this.similarDocumentsResource.hasValue()) {\n      return this.similarDocumentsResource.value() || [];\n    }\n    return [];\n  });\n}\n","import { Component, computed, inject, input, linkedSignal, output } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { Article } from \"@sinequa/atomic\";\nimport { ButtonComponent, cn, MagnifyingGlassIcon, XMarkIcon } from \"@sinequa/ui\";\nimport { SelectionStrategy } from \"../../../directives\";\nimport { QueryParamsStore, SelectionStore } from \"../../../stores\";\nimport { EntitiesPanel } from \"./panels/entities-panel\";\nimport { ExtractsPanel } from \"./panels/extracts-panel\";\nimport { LabelsPanel } from \"./panels/labels-panel\";\nimport { SimilarDocumentsPanel } from \"./panels/similar-documents-panel\";\n\n/**\n * Advanced Search Component\n * This component provides an advanced search interface with various panels for entities, extracts, labels, and similar documents.\n *\n * @deprecated Use `AdvancedSearch` component instead.\n */\n@Component({\n  selector: \"advanced-search\",\n  standalone: true,\n  providers: [provideTranslocoScope(\"drawers\")],\n  templateUrl: \"./advanced-search.component.html\",\n  styles: [\n    `\n      :host {\n        /* disable default max-height for panel */\n        --panel-max-height: none;\n      }\n      /* Hides cancel button from input that as type='search' */\n      input[type='search']::-webkit-search-cancel-button {\n        -webkit-appearance: none;\n      }\n    `\n  ],\n  imports: [\n    FormsModule,\n    ButtonComponent,\n    TranslocoPipe,\n    SimilarDocumentsPanel,\n    EntitiesPanel,\n    LabelsPanel,\n    ExtractsPanel,\n    XMarkIcon,\n    MagnifyingGlassIcon\n]\n})\nexport class AdvancedSearchComponent {\n  cn = cn;\n\n  public readonly article = input.required<Article>();\n  public readonly previewStrategy = input<SelectionStrategy | undefined>(undefined);\n\n  public readonly selected = output<Article>();\n\n  protected readonly selectionStore = inject(SelectionStore);\n  protected readonly queryParamsStore = inject(QueryParamsStore);\n\n  protected readonly queryText = linkedSignal({\n    source: () => {\n      const { queryText } = getState(this.selectionStore);\n      return queryText;\n    },\n    computation: (queryText) => {\n      const text = queryText || \"\";\n      return text ? text.trim() : \"\";\n    }\n  });\n\n  queryName = computed(() => this.queryParamsStore.getQuery().name);\n\n  protected executeSearch(): void {\n    this.selectionStore.update({ queryText: this.queryText() });\n  }\n\n  protected clearInput(): void {\n    this.queryText.set(\"\");\n  }\n}\n","@if (article()) {\r\n  <div\r\n    [class]=\"\r\n      cn(\r\n        'scroll-stable flex flex-col overflow-y-auto pr-3 pb-6 pl-6',\r\n        '[&_details]:border-muted-foreground/18 [&_details]:border-b',\r\n        '[&_details>summary]:bg-menu [&_details_details]:last:border-b-0',\r\n        '[&_details>summary>i>svg]:transition-transform [&_details>summary>i>svg]:duration-300',\r\n        '[&>details>summary>i>svg]:group-open/parent:rotate-180'\r\n      )\r\n    \">\r\n    <section class=\"mt-6 mb-4 flex w-full flex-col gap-6\">\r\n      <header\r\n        id=\"panel-control\"\r\n        class=\"focus-within:outline-primary not-focus-within:hover:outline-muted-foreground group flex rounded focus-within:outline hover:outline\">\r\n        <div\r\n          class=\"bg-muted flex grow items-center gap-2 rounded-s rounded-e-none px-3\">\r\n          <input\r\n            id=\"advanced-search-input\"\r\n            type=\"search\"\r\n            class=\"grow focus:outline-none\"\r\n            autocomplete=\"off\"\r\n            spellcheck=\"false\"\r\n            [attr.placeholder]=\"'drawers.inputPlaceholder' | transloco\"\r\n            [attr.aria-label]=\"'drawers.inputPlaceholder' | transloco\"\r\n            [ngModel]=\"queryText()\"\r\n            (ngModelChange)=\"queryText.set($event)\"\r\n            (keydown.enter)=\"executeSearch()\" />\r\n\r\n          @if (queryText() !== \"\") {\r\n            <button\r\n              [iconOnly]=\"true\"\r\n              size=\"sm\"\r\n              [attr.title]=\"'clear' | transloco\"\r\n              [attr.aria-label]=\"'clear' | transloco\"\r\n              (click)=\"clearInput()\"\r\n              (keydown.enter)=\"clearInput()\">\r\n              <xmark-icon />\r\n            </button>\r\n          }\r\n        </div>\r\n\r\n        <button\r\n          class=\"size-8 rounded-s-none rounded-e-lg\"\r\n          [disabled]=\"queryText() === '' || null\"\r\n          [attr.title]=\"'search' | transloco\"\r\n          [attr.aria-label]=\"'search' | transloco\"\r\n          (click)=\"executeSearch()\">\r\n          <magnifying-glass-icon />\r\n        </button>\r\n      </header>\r\n    </section>\r\n\r\n    <!-- the same name is used everywhere to simulate an accordion -->\r\n    <!-- extracts -->\r\n    <ExtractsPanel [article]=\"article()\" />\r\n\r\n    <!-- labels -->\r\n    <LabelsPanel [article]=\"article()\" />\r\n\r\n    <!-- entities -->\r\n    <EntitiesPanel [article]=\"article()\" />\r\n\r\n    <!-- similar documents -->\r\n    <SimilarDocumentsPanel\r\n      [article]=\"article()\"\r\n      [strategy]=\"previewStrategy()\"\r\n      (selected)=\"selected.emit($event)\" />\r\n  </div>\r\n}\r\n","import { NgClass, NgComponentOutlet } from \"@angular/common\";\nimport { Component, computed, DestroyRef, InjectionToken, Injector, inject, input, Type } from \"@angular/core\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { CCApp } from \"@sinequa/atomic\";\nimport { PreviewService } from \"../../../services\";\nimport { AppStore, QueryParamsStore, SelectionStore } from \"../../../stores\";\nimport { AdvancedSearchComponent } from \"../advanced-search/advanced-search.component\";\nimport { DrawerComponent } from \"../drawer.component\";\nimport { DrawerService } from \"../drawer.service\";\n\nexport type DocumentTypeMap = {\n  documentType: string;\n  articleComponent: Type<unknown>;\n  previewComponent: Type<unknown>;\n};\n\nexport const COMPONENTS_FOR_DOCUMENT_TYPE = new InjectionToken<(documentType?: string) => DocumentTypeMap>(\n  \"COMPONENTS_FOR_DOCUMENT_TYPE\"\n);\n\nconst GLOBAL_QUERY_NAME = new InjectionToken<string>(\"GLOBAL_QUERY_NAME\", {\n  factory() {\n    const appStore = inject(AppStore);\n    const { queries } = getState(appStore) as CCApp;\n\n    if (!queries) return \"\";\n\n    const array = Object.entries(queries).map(([key, value]) => ({ key, ...value }));\n\n    return array[0].name;\n  }\n});\n\n/**\n * Component for previewing articles in a drawer.\n * It dynamically loads the appropriate preview component based on the article's document type.\n * It also manages the lifecycle of the preview, ensuring that resources are cleaned up when the drawer is closed.\n *\n * @extends DrawerComponent\n * @deprecated we do not use it anymore.\n */\n@Component({\n  selector: \"DrawerPreview, drawerpreview\",\n  standalone: true,\n  imports: [NgClass, NgComponentOutlet, AdvancedSearchComponent],\n  providers: [DrawerService, PreviewService],\n  templateUrl: \"./drawer-preview.component.html\",\n  styleUrl: \"./drawer-preview.component.css\",\n  host: {\n    class: \"bg-transparent text-foreground\"\n  }\n})\nexport class DrawerPreviewComponent extends DrawerComponent {\n  /* injections */\n  injector = inject(Injector);\n  appStore = inject(AppStore);\n  selectionStore = inject(SelectionStore);\n  queryParamsStore = inject(QueryParamsStore);\n  previewService = inject(PreviewService);\n\n  getComponentsForDocumentType = inject(COMPONENTS_FOR_DOCUMENT_TYPE);\n\n  /* inputs */\n  public readonly articleId = input.required<string>();\n\n  /* computed signals */\n  queryText = computed(() => {\n    const { queryText } = getState(this.selectionStore);\n    const { text } = getState(this.queryParamsStore);\n    return queryText ?? text;\n  });\n\n  public readonly article = computed(() => {\n    const { article } = getState(this.selectionStore);\n    return article;\n  });\n\n  public readonly previewType = computed(\n    () => this.getComponentsForDocumentType(this.article()?.docformat || \"\").previewComponent\n  );\n\n  private readonly globalQueryName = inject(GLOBAL_QUERY_NAME);\n  constructor(private destroyRef: DestroyRef) {\n    super();\n\n    this.destroyRef.onDestroy(() => {\n      if (this.articleId()) {\n        this.previewService.close(this.articleId(), { name: this.globalQueryName });\n      }\n    });\n  }\n}\n","<!-- when the extended panel is open clicking in the backdrop panel close it -->\n<div (click)=\"drawer.toggleExtension()\" (keydown.escape)=\"drawer.toggleExtension()\" [attr.aria-hidden]=\"true\"></div>\n\n<div class=\"bg-menu flex overflow-auto\">\n  <!-- Drawer handle when extended -->\n  <div\n    #drawerHandle\n    class=\"fixed h-full w-[5px] select-none hover:cursor-ew-resize hover:bg-orange-300\"\n    [ngClass]=\"{ hidden: drawer.isExtended() === false }\"></div>\n\n  @if (previewType()) {\n    <ng-container *ngComponentOutlet=\"previewType()\" />\n  }\n</div>\n\n<!-- this is the extended panel -->\n@if (article()) {\n  <div [class.invisible]=\"!drawer.isExtended()\" class=\"bg-menu border-foreground/18 flex flex-col border-l\">\n    <div class=\"relative flex grow flex-col\">\n      <advanced-search class=\"absolute h-full w-full overflow-y-auto\" [article]=\"article()!\" (close)=\"drawer.collapse()\" />\n    </div>\n  </div>\n}\n","import {\n  Component,\n  ComponentRef,\n  computed,\n  DestroyRef,\n  effect,\n  InjectionToken,\n  inject,\n  Type,\n  ViewContainerRef\n} from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\n\nimport { SelectionHistoryService } from \"../../services\";\nimport { DrawerComponent } from \"../drawer/drawer.component\";\nimport { DrawerStackService } from \"./drawer-stack.service\";\n\nexport const DRAWER_COMPONENT = new InjectionToken<Type<DrawerComponent>>(\"DRAWER_COMPONENT\");\nexport const DRAWER_STACK_MAX_COUNT = new InjectionToken<number>(\"Drawer stack maximum count\", {\n  factory: () => 3\n});\n\n/**\n * Component that manages a stack of drawers in the application.\n * It listens to the DrawerStackService for events to open, close,\n * and manage drawers, and dynamically creates and destroys drawer\n * components as needed.\n *\n * @deprecated we do not use it anymore.\n */\n@Component({\n  selector: \"DrawerStack, drawerstack\",\n  template: ``,\n  styles: [\n    `\n      :host {\n        position: absolute;\n        top: 50%;\n        right: 0;\n\n        --drawer-width: 46;\n        --drawer-subdrawer-width: 400px;\n\n        z-index: var(--z-drawer);\n\n        transition: right 300ms linear;\n\n        &[drawer-opened='true'] {\n          right: calc(1% * var(--drawer-width));\n        }\n      }\n    `\n  ],\n  host: {\n    \"[attr.drawer-opened]\": \"drawerOpened()\"\n  }\n})\nexport class DrawerStackComponent {\n  public drawerOpened = computed(() => this.drawerStackService.isOpened());\n\n  readonly drawerStackService = inject(DrawerStackService);\n  protected readonly selectionHistory = inject(SelectionHistoryService);\n  protected readonly viewContainer = inject(ViewContainerRef);\n\n  // Inject the token for the drawer component\n  protected readonly drawerComponent = inject(DRAWER_COMPONENT);\n  // Inject the token for the maximum number of drawers\n  protected readonly drawerStackMaxCount = inject(DRAWER_STACK_MAX_COUNT);\n\n  protected readonly selectionHistory$ = this.selectionHistory.selectionHistoryEvent;\n\n  protected readonly drawers: ComponentRef<DrawerComponent>[] = [];\n  get drawersLength() {\n    return this.drawers.length;\n  }\n\n  constructor(destroyRef: DestroyRef) {\n    effect(() => {\n      const isOpened = this.drawerStackService.isOpened();\n      if (isOpened && !!this.drawerStackService.componentType) {\n        this.openTopDrawer(undefined, this.drawerStackService.componentType);\n      }\n    });\n\n    this.selectionHistory$.pipe(takeUntilDestroyed(destroyRef)).subscribe((event) => {\n      if (event !== \"new\") return;\n\n      this.openTopDrawer(this.selectionHistory.getCurrentSelectionIndex());\n    });\n\n    this.drawerStackService.toggleTopDrawerExtension$\n      .pipe(takeUntilDestroyed(destroyRef))\n      .subscribe(() => this.toggleTopDrawerExtension());\n    this.drawerStackService.forceTopDrawerCollapse$\n      .pipe(takeUntilDestroyed(destroyRef))\n      .subscribe(() => this.collapseTopDrawer());\n    this.drawerStackService.closeTopDrawer$.pipe(takeUntilDestroyed(destroyRef)).subscribe(() => this.closeTopDrawer());\n    this.drawerStackService.closeAllDrawers$\n      .pipe(takeUntilDestroyed(destroyRef))\n      .subscribe(() => this.closeAllDrawers());\n  }\n\n  protected toggleAssistant(): void {\n    this.drawerStackService.toggleAssistant();\n  }\n\n  private openTopDrawer(index?: number, componentType?: Type<DrawerComponent>): void {\n    if (this.drawers.length >= this.drawerStackMaxCount) {\n      console.warn(\"Drawer stack is full\");\n      this.shiftDrawer();\n    }\n\n    this.pushDrawer(index, componentType || this.drawerComponent);\n  }\n\n  private closeTopDrawer(): void {\n    const top = this.drawers.pop();\n\n    this.selectionHistory.back();\n\n    this.closeAndDestroyDrawer(top);\n\n    if (\n      this.drawers.length < this.drawerStackMaxCount &&\n      this.selectionHistory.getHistoryLength() > this.drawers.length\n    )\n      this.unshiftDrawer(this.selectionHistory.getHistoryLength() - this.drawers.length - 1);\n  }\n\n  private closeAllDrawers(): void {\n    this.closeAndDestroyDrawer(this.drawers.pop());\n    this.drawers.forEach((drawer) => {\n      drawer.destroy();\n    });\n    this.drawers.length = 0;\n  }\n\n  private collapseTopDrawer(): void {\n    const top = this.drawers[this.drawers.length - 1];\n\n    top?.instance.drawer.collapse();\n  }\n\n  private toggleTopDrawerExtension(): void {\n    const top = this.drawers[this.drawers.length - 1];\n\n    top?.instance.drawer.toggleExtension();\n  }\n\n  private pushDrawer(index?: number, componentType?: Type<DrawerComponent>): void {\n    if (!componentType) {\n      throw new Error(\"Component type is undefined\");\n    }\n    const drawer = this.viewContainer.createComponent(componentType);\n\n    if (index !== undefined) {\n      drawer.setInput(\"articleId\", this.selectionHistory.getSelection(index)?.id);\n    }\n\n    this.drawers.push(drawer);\n\n    // setTimeout is needed to ensure that the drawer is fully initialized\n    // and the animation will be played\n    setTimeout(() => {\n      drawer.instance.drawer.open();\n    });\n  }\n\n  private shiftDrawer(): void {\n    const drawer = this.drawers.shift();\n\n    this.closeAndDestroyDrawer(drawer);\n  }\n\n  private unshiftDrawer(index: number): void {\n    const drawer = this.viewContainer.createComponent(this.drawerComponent);\n\n    drawer.setInput(\"articleId\", this.selectionHistory.getSelection(index)?.id);\n\n    this.viewContainer.insert(drawer.hostView, 0);\n\n    this.drawers.unshift(drawer);\n\n    drawer.instance.drawer.open();\n  }\n\n  private closeAndDestroyDrawer(drawer?: ComponentRef<DrawerComponent>) {\n    drawer?.instance.drawer.close();\n\n    setTimeout(() => {\n      drawer?.destroy();\n    }, 250);\n  }\n}\n","import { Component, inject, model, signal, viewChild } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\n\nimport { CCApp, notify } from \"@sinequa/atomic\";\n\nimport {\n  ButtonComponent,\n  DialogComponent,\n  DialogContentComponent,\n  DialogFooterComponent,\n  DialogHeaderComponent,\n  DialogInterface,\n  DialogTitleComponent\n} from \"@sinequa/ui\";\nimport { AuditService } from \"../../../services\";\nimport { AppStore } from \"../../../stores\";\n\nexport const AuditFeedbackType = \"UserFeedback_UserFeedback\";\n\n@Component({\n  selector: \"feedback-dialog, feedbackdialog, FeedbackDialog\",\n  standalone: true,\n  imports: [\n    TranslocoPipe,\n    FormsModule,\n    ButtonComponent,\n    DialogComponent,\n    DialogHeaderComponent,\n    DialogFooterComponent,\n    DialogTitleComponent,\n    DialogContentComponent\n  ],\n  providers: [provideTranslocoScope(\"feedback\")],\n  template: `\n    <dialog #dialog>\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>{{ 'feedback.dialogTitle' | transloco }}</DialogTitle>\n        </DialogHeader>\n\n        @if (type()) {\n          <p>{{ 'feedback.' + type() + '.description' | transloco }}</p>\n          <textarea\n            class=\"hover:outline-primary focus:outline-primary border-foreground/20 hover:bg-muted focus:bg-muted mt-2 w-full rounded-md border px-2 pt-1 hover:outline focus:outline\"\n            type=\"text\"\n            autocomplete=\"off\"\n            spellcheck=\"false\"\n            [(ngModel)]=\"comment\"></textarea>\n        }\n\n        <DialogFooter>\n          <button variant=\"outline\" (click)=\"dialog.close()\">\n            {{ 'cancel' | transloco }}\n          </button>\n          <button [disabled]=\"!comment()\" (click)=\"submit()\">\n            {{ 'feedback.button' | transloco }}\n          </button>\n        </DialogFooter>\n      </DialogContent>\n    </dialog>\n  `\n})\nexport class FeedbackDialogComponent implements DialogInterface {\n  readonly dialog = viewChild<DialogComponent>(DialogComponent);\n\n  readonly auditService = inject(AuditService);\n  readonly appStore = inject(AppStore);\n  private readonly transloco = inject(TranslocoService);\n\n  comment = model<string>(\"\");\n  type = signal<string | undefined>(undefined);\n\n  open(type: string) {\n    this.type.set(type);\n    this.dialog()?.showModal();\n  }\n\n  submit(): void {\n    const { name } = getState(this.appStore) as CCApp;\n\n    this.auditService.notify({\n      type: AuditFeedbackType,\n      detail: {\n        app: name,\n        message: this.type(),\n        detail: this.comment()\n      }\n    });\n\n    this.comment.set(\"\");\n    this.dialog()?.close();\n    notify.success(this.transloco.translate(\"feedback.feedbackSuccess\"), { duration: 2000 });\n  }\n}\n","import { Component, computed, inject, input, output, signal, viewChild } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\nimport { getState } from '@ngrx/signals';\n\nimport { notify, Result } from '@sinequa/atomic';\n\nimport { ButtonComponent, ButtonVariants, CommentIcon, FaIconComponent, MenuComponent, MenuContentComponent, MenuItemComponent, ThumbsDownIcon, ThumbsUpIcon, XMarkIcon } from '@sinequa/ui';\n\nimport { AuditService } from '../../services';\nimport { AppStore, QueryParamsStore } from '../../stores';\nimport { FeedbackDialogComponent } from './dialogs/feedback.dialog';\nimport { CFeedback } from '../../models';\n\ninterface FeedbackMenu {\n  type: string;\n  icon: string;\n}\n\n@Component({\n  selector: 'feedback, Feedback',\n  standalone: true,\n  imports: [ButtonComponent, MenuComponent, MenuContentComponent, MenuItemComponent, TranslocoPipe, FeedbackDialogComponent, CommentIcon, XMarkIcon, ThumbsUpIcon, ThumbsDownIcon, FaIconComponent],\n  providers: [provideTranslocoScope('feedback')],\n  templateUrl: './feedback.html'\n})\nexport class SearchFeedbackComponent {\n  onClose = output<void>();\n\n  readonly feedbackDialog = viewChild(FeedbackDialogComponent);\n\n  pages = input.required<any>();\n  variant = input<ButtonVariants[\"variant\"]>(\"secondary\");\n  solid = input<ButtonVariants[\"solid\"]>(false);\n\n  readonly auditService = inject(AuditService);\n  protected readonly queryParamsStore = inject(QueryParamsStore);\n  private readonly transloco = inject(TranslocoService);\n  private readonly appStore = inject(AppStore);\n\n  liked = signal<boolean>(false);\n  disliked = signal<boolean>(false);\n\n  menus: FeedbackMenu[] = [\n    { type: 'content', icon: 'far fa-file-alt' },\n    { type: 'ui', icon: 'fas fa-desktop' },\n    { type: 'lang', icon: 'far fa-comments' },\n    { type: 'other', icon: 'far fa-lightbulb' }\n  ];\n\n  close(event: Event): void {\n    event.stopPropagation();\n    this.onClose.emit();\n  }\n\n  like(): void {\n    if (this.liked()) return;\n\n    const state = getState(this.queryParamsStore);\n    const articles: string[] = [];\n    if (this.pages() && this.pages().length) {\n      this.pages().forEach((page: Result) => {\n        articles.push(...page.records.map(r => r.id));\n      });\n    }\n    const detail = { query: state, records: articles };\n    this.auditService.notify({\n      type: 'Search_Like',\n      detail\n    });\n    this.liked.set(true);\n    notify.success(this.transloco.translate('feedback.feedbackSuccess'), { duration: 2000 });\n  }\n\n  dislike(): void {\n    if (this.disliked()) return;\n\n    const state = getState(this.queryParamsStore);\n    const articles: string[] = [];\n    if (this.pages() && this.pages().length) {\n      this.pages().forEach((page: Result) => {\n        articles.push(...page.records.map(r => r.id));\n      });\n    }\n    const detail = { query: state, records: articles };\n    this.auditService.notify({\n      type: 'Search_Disike',\n      detail\n    });\n    this.disliked.set(true);\n    notify.success(this.transloco.translate('feedback.feedbackSuccess'), { duration: 2000 });\n  }\n\n  openFeedbackDialog(type: string): void {\n    this.feedbackDialog()?.open(type);\n  }\n\n  private readonly effectiveConfig = computed<Required<CFeedback>>(() => ({\n    like: true, dislike: true, content: true, ui: true, lang: true, other: true,\n    ...this.appStore.general()?.feedback,\n  }));\n\n  visibleMenus = computed(() =>\n    this.menus.filter(m => this.effectiveConfig()[m.type as keyof CFeedback])\n  );\n\n  showButton  = computed(() => Object.values(this.effectiveConfig()).some(Boolean));\n  showLike    = computed(() => this.effectiveConfig().like);\n  showDislike = computed(() => this.effectiveConfig().dislike);\n}\n","@if (showButton()) {\r\n  <menu>\r\n    @let feedback = \"feedback.label\" | transloco;\r\n    <button [variant]=\"variant()\" [solid]=\"solid()\" [aria-label]=\"feedback\">\r\n      <comment-icon />\r\n      <span>{{ feedback }}</span>\r\n      <x-mark-icon class=\"ms-2\" (click)=\"close($event)\" />\r\n    </button>\r\n\r\n    <MenuContent>\r\n      @if (showLike() && !disliked()) {\r\n        @let feedbackLike = \"feedback.like\" | transloco;\r\n        @let feedbackLiked = \"feedback.liked\" | transloco;\r\n        <menuitem (click)=\"like()\" aria-label=\"feedback\">\r\n          @if (liked()) {\r\n            <thumbs-up-icon [fill]=\"true\" />\r\n            {{ feedbackLiked }}\r\n          } @else {\r\n            <thumbs-up-icon />\r\n            {{ feedbackLike }}\r\n          }\r\n        </menuitem>\r\n      }\r\n\r\n      @if (showDislike() && !liked()) {\r\n        <menuitem\r\n          (click)=\"dislike()\"\r\n          [aria-label]=\"'feedback.dislike' | transloco\">\r\n          @if (disliked()) {\r\n            <thumbs-down-icon [fill]=\"true\" />\r\n            {{ \"feedback.disliked\" | transloco }}\r\n          } @else {\r\n            <thumbs-down-icon />\r\n            {{ \"feedback.dislike\" | transloco }}\r\n          }\r\n        </menuitem>\r\n      }\r\n      @for (menu of visibleMenus(); track menu.type) {\r\n        @let feedbackTitle = \"feedback.\" + menu.type + \".title\" | transloco;\r\n        <menuitem\r\n          (click)=\"openFeedbackDialog(menu.type)\"\r\n          [aria-label]=\"feedbackTitle\">\r\n          <fa-icon [faClass]=\"menu.icon\" />\r\n          {{ feedbackTitle }}\r\n        </menuitem>\r\n      }\r\n    </MenuContent>\r\n  </menu>\r\n}\r\n\r\n<feedback-dialog />\r\n","import {\n  booleanAttribute,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  inject,\n  input,\n  linkedSignal,\n  model,\n  output,\n  viewChild,\n} from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\nimport { AggEx } from \"../../../../services\";\nimport {\n  BadgeComponent,\n  ButtonComponent,\n  ChevronRightIcon,\n  DropdownContentComponent,\n  DropdownDirective,\n  FaIconComponent,\n  FilterIcon,\n  FilterXIcon,\n  IconButtonComponent,\n  InputGroupAddonComponent,\n  InputGroupComponent,\n  InputGroupInput,\n  PopoverContentComponent,\n  SearchIcon,\n  SquareCheckIcon,\n  SquareIcon,\n  XMarkIcon,\n} from \"@sinequa/ui\";\nimport { SyslangPipe } from \"../../../../pipes\";\n\n@Component({\n  selector: \"AggregationPanel, aggregation-panel\",\n  standalone: true,\n  imports: [\n    FormsModule,\n    ButtonComponent,\n    SyslangPipe,\n    TranslocoPipe,\n    BadgeComponent,\n    ChevronRightIcon,\n    InputGroupInput,\n    InputGroupComponent,\n    InputGroupAddonComponent,\n    SearchIcon,\n    FilterIcon,\n    FaIconComponent,\n    FilterXIcon,\n    SquareCheckIcon,\n    SquareIcon,\n    XMarkIcon,\n    IconButtonComponent,\n  ],\n  templateUrl: \"./aggregation-panel.html\",\n})\nexport class AggregationPanelComponent {\n  /* collapse */\n  id = input<string | null>(null);\n  collapsible = input(false);\n  collapsed = input(false);\n  isDate = input(false);\n  isEmpty = input(false);\n\n  /* aggregation data — used for label, search input id and load-more condition */\n  aggregation = input<AggEx | null>(null);\n\n  /* header button state (driven by parent) */\n  showFiltersCount = input(false, { transform: booleanAttribute });\n  filtersCount = input(0);\n  hasFilters = input(false);\n  selection = input(false);\n  isAllSelected = input(false);\n\n  /* search */\n  searchText = model<string>(\"\");\n  itemsLength = input(0);\n\n  /* load more */\n  hasMore = input(false);\n  searchedItemsLength = input(0);\n\n  /* outputs — parent reacts to user actions */\n  cleared = output();\n  applied = output();\n  allSelected = output();\n  allUnselected = output();\n  loadedMore = output();\n\n  /* internal collapse state */\n  isCollapsed = linkedSignal(() => this.collapsed());\n  expanded = computed(() => (this.isCollapsed() ? null : \"\"));\n\n  private readonly searchInput = viewChild<ElementRef<HTMLInputElement>>(\"searchInput\");\n  private readonly isInPopover = !!(\n    inject(PopoverContentComponent, { optional: true }) ||\n    inject(DropdownContentComponent, { optional: true }) ||\n    inject(DropdownDirective, { optional: true })\n  );\n\n  constructor() {\n    effect(() => {\n      if (this.isInPopover && this.searchInput()?.nativeElement && this.expanded() !== null) {\n        setTimeout(() => this.searchInput()?.nativeElement.focus(), 0);\n      }\n    });\n  }\n\n  onHeaderClick(event: Event): void {\n    if (!this.isDate() && this.isEmpty()) {\n      event.preventDefault();\n      return;\n    }\n    if (this.collapsible()) {\n      this.isCollapsed.update((v) => !v);\n    }\n    event.preventDefault();\n  }\n\n  onToggle(event: Event): void {\n    const e = event as ToggleEvent;\n    this.isCollapsed.set(e.newState === \"closed\");\n  }\n\n  protected clearSearch(e: Event): void {\n    e.stopImmediatePropagation();\n    this.searchText.set(\"\");\n  }\n}\n","<details\r\n  [attr.open]=\"expanded()\"\r\n  [attr.name]=\"id()\"\r\n  class=\"group space-y-2\"\r\n  (toggle)=\"onToggle($event)\">\r\n  <summary\r\n    [class.cursor-pointer]=\"collapsible() && !isEmpty()\"\r\n    [class.text-muted-foreground]=\"isEmpty()\"\r\n    class=\"m-0 mt-1 flex h-8 w-full items-center gap-1 pl-1 font-semibold select-none\"\r\n    (click)=\"onHeaderClick($event)\">\r\n    <ng-content select=\"label\">\r\n      @let icon = aggregation()?.icon;\r\n      @if (icon) {\r\n        <FaIcon [faClass]=\"icon\" class=\"mr-1 shrink-0\" />\r\n      }\r\n      <span class=\"grow truncate\">{{\r\n        aggregation()?.display | syslang | transloco\r\n      }}</span>\r\n    </ng-content>\r\n\r\n    @if (showFiltersCount() && filtersCount() > 0) {\r\n      <Badge size=\"xs\" class=\"ml-1\">\r\n        {{ filtersCount() }}\r\n      </Badge>\r\n    }\r\n    @if (!isCollapsed()) {\r\n      @if (hasFilters()) {\r\n        @let label = \"filters.clearFilters\" | transloco;\r\n        <button\r\n          variant=\"none\"\r\n          icon-button\r\n          [aria-label]=\"label\"\r\n          (click)=\"$event.stopPropagation(); cleared.emit()\">\r\n          <filter-x-icon />\r\n        </button>\r\n      }\r\n      @if (selection()) {\r\n        @let label = \"filters.apply\" | transloco;\r\n        <button\r\n          variant=\"accent\"\r\n          size=\"sm\"\r\n          [aria-label]=\"label\"\r\n          (click)=\"$event.stopPropagation(); applied.emit()\">\r\n          <FilterIcon />\r\n          {{ label }}\r\n        </button>\r\n      }\r\n\r\n      @if (isAllSelected()) {\r\n        @let label = \"filters.unselectAllFilters\" | transloco;\r\n        <button\r\n          variant=\"none\"\r\n          icon-button\r\n          [aria-label]=\"label\"\r\n          (click)=\"$event.stopPropagation(); allUnselected.emit()\">\r\n          <square-check-icon />\r\n        </button>\r\n      } @else {\r\n        @let label = \"filters.selectAllFilters\" | transloco;\r\n        <button\r\n          variant=\"none\"\r\n          icon-button\r\n          [aria-label]=\"label\"\r\n          (click)=\"$event.stopPropagation(); allSelected.emit()\">\r\n          <square-icon />\r\n        </button>\r\n      }\r\n    }\r\n\r\n    @if (collapsible()) {\r\n      <icon-button\r\n        title=\"Open/Close\"\r\n        class=\"cursor-pointer [&_svg]:transition-transform [&_svg]:duration-150 group-open:[&_svg]:rotate-90\">\r\n        <chevronright />\r\n        <span class=\"sr-only\">{{ \"filters.toggle\" | transloco }}</span>\r\n      </icon-button>\r\n    }\r\n  </summary>\r\n\r\n  @if (aggregation()?.searchable && itemsLength() > 0) {\r\n    <InputGroup class=\"group/item mt-1\">\r\n      <input\r\n        #searchInput\r\n        input-group\r\n        id=\"aggregation-input-{{ aggregation()?.column }}\"\r\n        type=\"text\"\r\n        [attr.aria-label]=\"'search' | transloco\"\r\n        [attr.placeholder]=\"'search' | transloco\"\r\n        [(ngModel)]=\"searchText\"\r\n        class=\"mt-1\" />\r\n      <InputGroupAddon>\r\n        <SearchIcon\r\n          class=\"text-foreground size-4 rotate-0 transition-[rotate] duration-500 group-focus-within/item:rotate-90\" />\r\n      </InputGroupAddon>\r\n      <InputGroupAddon align=\"inline-end\" class=\"gap-0.5!\">\r\n        <icon-button\r\n          size=\"sm\"\r\n          [class]=\"\r\n            searchText().length > 0\r\n              ? 'rotate-90 cursor-pointer opacity-100 transition-[rotate,opacity] duration-500'\r\n              : 'pointer-events-none rotate-0 opacity-0 transition-[rotate,opacity] duration-500'\r\n          \"\r\n          aria-label=\"Clear search\"\r\n          [tabindex]=\"searchText().length > 0 ? 0 : -1\"\r\n          (keydown.enter)=\"clearSearch($event)\"\r\n          (click)=\"clearSearch($event)\">\r\n          <XMarkIcon />\r\n        </icon-button>\r\n        <ng-content select=\"[search-addon]\" />\r\n      </InputGroupAddon>\r\n    </InputGroup>\r\n  }\r\n\r\n  <ng-content />\r\n\r\n  @if (hasMore() && searchedItemsLength() === 0) {\r\n    <button\r\n      class=\"mt-1 flex w-full justify-center\"\r\n      [attr.aria-label]=\"'loadMore' | transloco\"\r\n      (click)=\"loadedMore.emit()\">\r\n      {{ \"loadMore\" | transloco }}\r\n    </button>\r\n  }\r\n</details>\r\n","import {\n  booleanAttribute,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  input,\n  model,\n  numberAttribute,\n  output,\n  signal,\n  viewChild,\n  viewChildren,\n} from \"@angular/core\";\nimport { NgTemplateOutlet } from \"@angular/common\";\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\nimport {\n  Aggregation,\n  AggregationItem,\n  error,\n  LegacyFilter,\n  suggestionsToTreeAggregationNodes,\n  TreeAggregation,\n  TreeAggregationNode,\n} from \"@sinequa/atomic\";\nimport {\n  ButtonComponent,\n  ChevronRightIcon,\n  cn,\n  FaIconComponent,\n  TriangleAlertIcon,\n} from \"@sinequa/ui\";\nimport { injectVirtualizer } from \"@tanstack/angular-virtual\";\nimport { firstValueFrom } from \"rxjs\";\nimport { AggregationListItem } from \"../../../../models\";\nimport { HighlightWordPipe, SyslangPipe } from \"../../../../pipes\";\nimport { injectAggregationBase } from \"../inject-aggregation-base\";\nimport { AggregationPanelComponent } from \"../panel/aggregation-panel\";\n\n@Component({\n  selector: \"AggregationTree, aggregation-tree, aggregationtree\",\n  imports: [\n    NgTemplateOutlet,\n    FormsModule,\n    ReactiveFormsModule,\n    ButtonComponent,\n    ChevronRightIcon,\n    SyslangPipe,\n    TranslocoPipe,\n    FaIconComponent,\n    TriangleAlertIcon,\n    HighlightWordPipe,\n    AggregationPanelComponent,\n  ],\n  standalone: true,\n  templateUrl: \"./aggregation-tree.html\",\n  styles: [\n    `\n      div[role=\"treeitem\"]:has(+ div[role=\"treeitem\"]) {\n        margin-bottom: var(--agg-item-gap, 0);\n      }\n      div[role=\"treeitem\"] {\n        display: block;\n        user-select: none;\n      }\n      div[role=\"treeitem\"] a {\n        padding-left: calc(var(--agg-tree-indent, 0.5rem) * var(--level, 0));\n        line-height: var(--agg-item-height, inherit);\n      }\n    `,\n  ],\n  host: {\n    \"[class]\": 'cn(\"block h-[inherit] max-h-[inherit] w-[inherit]\", class())',\n  },\n})\nexport class AggregationTreeComponent {\n  cn = cn;\n\n  /* inputs */\n  class = input(\"\");\n  id = input<string | null>(null);\n  name = input.required<string | null>();\n  column = input.required<string | null>();\n  collapsible = input(false);\n  collapsed = input(false);\n  searchable = input<boolean | undefined>(undefined);\n  showFiltersCount = input(false, { transform: booleanAttribute });\n  expandedLevel = input(undefined, {\n    transform: (v: unknown) => {\n      const n = numberAttribute(v);\n      return Number.isNaN(n) ? undefined : n;\n    },\n  });\n\n  /* outputs */\n  onSelect = output<AggregationItem[]>();\n  onApply = output();\n  onClear = output();\n\n  /* view queries */\n  virtualItems = viewChildren<ElementRef<HTMLDivElement>>(\"virtualItem\");\n  scrollElement = viewChild<ElementRef<HTMLDivElement>>(\"scrollElement\");\n\n  /* selection state */\n  selection = signal(false);\n  isAllSelected = signal<boolean>(false);\n\n  /* search state */\n  searchText = model<string>(\"\");\n\n  /* composable — injects stores/services, wires search effects, provides shared methods */\n  private readonly base = injectAggregationBase({\n    name: this.name,\n    column: this.column,\n    searchText: this.searchText,\n  });\n\n  /* spread from base */\n  readonly aggregationsStore = this.base.aggregationsStore;\n  readonly queryParamsStore = this.base.queryParamsStore;\n  readonly appStore = this.base.appStore;\n  readonly aggregationsService = this.base.aggregationsService;\n  readonly injector = this.base.injector;\n  readonly destroyRef = this.base.destroyRef;\n  readonly debouncedSearchText = this.base.debouncedSearchText;\n  readonly normalizedSearchText = this.base.normalizedSearchText;\n  readonly suggests = this.base.suggests;\n  readonly hasFilters = this.base.hasFilters;\n  readonly filtersCount = this.base.filtersCount;\n  readonly query = this.base.query;\n  readonly filters = this.base.filters;\n\n  /* features from appStore */\n  readonly showCount = computed(() => this.appStore.general()?.features?.showAggregationItemCount ?? false);\n  readonly quickFilter = computed(() => this.appStore.general()?.features?.quickFilter);\n  readonly isDate = computed(() => this.appStore.isDateColumn(this.aggregation()?.column || \"\"));\n\n  /* virtualizer */\n  readonly virtualizer = injectVirtualizer(() => ({\n    count: this.items().length,\n    estimateSize: () => 32,\n    scrollElement: this.scrollElement(),\n  }));\n\n  readonly #measureItems = effect(() =>\n    this.virtualItems().forEach((el) => this.virtualizer.measureElement(el.nativeElement))\n  );\n\n  readonly linkChildren = computed(() => this.appStore.general()?.features?.filterLinkChildren);\n\n  aggregation = computed(() => {\n    getState(this.aggregationsStore);\n    const name = this.name();\n    const column = this.column();\n    if (name !== null) {\n      const agg = this.aggregationsService.processAggregation(name, column);\n      if (agg) {\n        if (!agg.isTree) {\n          error(\n            \"The aggregation tree component does not support list aggregations. Please use the <Aggregation /> component instead.\"\n          );\n        }\n        const expandedLevel = this.expandedLevel() ?? agg.expandedLevel;\n        if (expandedLevel) {\n          this.expandItems(agg.items as TreeAggregationNode[], expandedLevel);\n        }\n        agg.searchable = this.searchable() ?? agg.searchable;\n        return agg;\n      }\n    }\n    return null;\n  });\n\n  items = computed(() => {\n    getState(this.aggregationsStore);\n    const agg = this.aggregation();\n    const searchedItems = this.searchedItems();\n    let res: AggregationListItem[] = [];\n    if (searchedItems.length > 0) {\n      res = searchedItems as AggregationListItem[];\n    } else if (agg?.items) {\n      res = this.addCurrentFiltersToItems() as AggregationListItem[];\n    }\n    const sessionAggItem = sessionStorage.getItem(`agg-${agg?.column}`);\n    const sessionAgg = JSON.parse(sessionAggItem || \"[]\");\n    return this.processAggregations(sessionAgg.length ? this.setSelected(res, sessionAgg) : res);\n  });\n\n  isEmpty = computed(() => this.items().length === 0);\n\n  readonly searchedItems = computed(() => {\n    if (!this.suggests()) return [];\n    if (this.aggregation()?.isTree) {\n      return suggestionsToTreeAggregationNodes(this.suggests(), this.searchText());\n    }\n    return this.suggests()?.map((suggest) => ({\n      name: this.name(),\n      value: suggest.normalized || suggest.display || \"\",\n      display: suggest.display,\n      column: suggest.category,\n      count: Number(suggest.frequency),\n      $selected: false,\n      items: [],\n    }));\n  });\n\n  constructor() {\n    effect(() => {\n      getState(this.aggregationsStore);\n      sessionStorage.removeItem(`agg-${this.column()}`);\n    });\n\n    effect(() => {\n      this.filters.set(this.getFilters());\n    });\n\n    this.destroyRef.onDestroy(() => {\n      sessionStorage.removeItem(`agg-${this.aggregation()?.column}`);\n      if (this.selection()) {\n        const unselect = (items: AggregationListItem[]) => {\n          items.forEach((item) => {\n            item.$selected = false;\n            item.$selectedVisually = false;\n            if (item.items) unselect(item.items);\n          });\n        };\n        unselect(this.items());\n      }\n    });\n  }\n\n  clear() {\n    const agg = this.aggregation();\n    if (agg) {\n      this.queryParamsStore.removeFilterByName(agg.name, agg.column);\n      const unselect = (items: AggregationListItem[]) => {\n        items.forEach((item) => {\n          item.$selected = false;\n          item.$selectedVisually = false;\n          if (item.items) unselect(item.items);\n        });\n      };\n      unselect(this.items());\n      sessionStorage.removeItem(`agg-${this.aggregation()?.column}`);\n      this.selection.set(false);\n      this.isAllSelected.set(false);\n      this.onClear.emit();\n    }\n  }\n\n  selectAll() {\n    if (this.items().length) {\n      this.base.selectItems(this.items(), true, true);\n      this.selection.set(true);\n      this.isAllSelected.set(true);\n    }\n  }\n\n  unselectAll() {\n    if (this.items().length) {\n      this.base.selectItems(this.items(), false, true);\n      this.select();\n      this.isAllSelected.set(false);\n    }\n  }\n\n  apply(overrideFilters?: LegacyFilter[]) {\n    sessionStorage.setItem(`agg-${this.aggregation()?.column}`, JSON.stringify([...this.items()]));\n    const filters = overrideFilters || this.getFilters();\n    const agg = this.aggregation() as Aggregation;\n    this.base.applyFilters(filters, agg, () => this.clear());\n    this.searchText.set(\"\");\n    this.selection.set(false);\n    this.onApply.emit();\n  }\n\n  loadMore(): void {\n    const q = this.queryParamsStore.getQuery();\n    this.aggregationsService.loadMore(q, this.aggregation() as Aggregation).subscribe((aggregation) => {\n      this.aggregationsStore.updateAggregation(aggregation);\n    });\n  }\n\n  async open(node: AggregationListItem) {\n    const q = this.queryParamsStore.getQuery();\n    delete q.filters;\n    const agg = await firstValueFrom(\n      this.aggregationsService.open(q, this.aggregation() as TreeAggregation, node as TreeAggregationNode)\n    );\n    node.$opened = true;\n    this.aggregationsStore.updateAggregation(agg);\n  }\n\n  select() {\n    const selectedItems = this.getFlattenTreeItems().filter((item) => item.$selected);\n    this.onSelect.emit(selectedItems);\n    this.selection.set(selectedItems.length > 0 || this.hasFilters());\n    this.verifySelected();\n    sessionStorage.setItem(`agg-${this.aggregation()?.column}`, JSON.stringify([...this.items()]));\n  }\n\n  /* item-level methods — called from the ng-template */\n\n  protected treeItemName(item: AggregationListItem): string {\n    const value = item.display || item.value;\n    return typeof value === \"string\" ? value : `${value}`;\n  }\n\n  protected isTreeItemFiltered(item: AggregationListItem, field: string | null | undefined): boolean {\n    const filters = this.queryParamsStore.getFilter({ field: field ?? undefined, name: this.treeItemName(item) });\n    if (!filters) return false;\n    const values = [item.value, `/${item.$path}/*`];\n    return (\n      values.some((v) => v === filters.value) ||\n      !!(filters.values?.length && filters.values.some((value: string) => values.some((v) => v === value)))\n    );\n  }\n\n  protected treeItemLevel(item: AggregationListItem): number {\n    const level = (item.$level ?? 0) - 1 + (!item.hasChildren ? 1 : 0);\n    return item.hasChildren === false ? level + 1 : level;\n  }\n\n  protected treeChildrenPath(item: AggregationListItem, parentPath: string[]): string[] {\n    return parentPath.concat(`/${item.$path}/*`);\n  }\n\n  protected selectTreeItem(\n    node: AggregationListItem,\n    parent: AggregationListItem | null,\n    e?: Event,\n    updateChildren = false\n  ): void {\n    e?.stopImmediatePropagation();\n    const selected = !node.$selected && !node.$selectedVisually;\n    node.$selected = selected;\n    node.$selectedVisually = false;\n    if (updateChildren) this.selectTreeItemChildren(node.items, node.$selected);\n    if (parent) this.handleTreeChildSelect(parent, node);\n    this.select();\n  }\n\n  protected toggleTreeNode(e: Event, node: AggregationListItem): void {\n    e.preventDefault();\n    e.stopImmediatePropagation();\n    if (node.items && node.$opened) { node.$opened = false; return; }\n    if (node.items && !node.$opened) { node.$opened = true; return; }\n    this.open(node);\n  }\n\n  protected onTreeItemTextClick(\n    node: AggregationListItem,\n    parent: AggregationListItem | null,\n    event: Event\n  ): void {\n    if (this.quickFilter()) {\n      this.selectTreeItem(node, parent, event, true);\n      this.apply();\n    }\n  }\n\n  protected getFilters() {\n    if (this.aggregation()?.isTree) {\n      return this.getFiltersForTree();\n    }\n    return this.getFiltersForList();\n  }\n\n  protected getFiltersForTree(): LegacyFilter[] {\n    const { name, column: field } = this.aggregation() || {};\n    if (!name || !field) return [];\n\n    const items = this.getFlattenTreeItems()\n      .filter((item) => item.$selected)\n      .map((item) => (item.$path ? `/${item.$path}/*` : \"\"));\n\n    const notSelectedItems = this.getFlattenTreeItems()\n      .filter((item) => !item.$selected)\n      .map((item) => (item.$path ? `/${item.$path}/*` : \"\"));\n\n    const currentFilters = this.queryParamsStore.getFilter({ field, name })?.values || [];\n    if (currentFilters) {\n      const filteredCurrentFilters = currentFilters.filter((filter) => !notSelectedItems.includes(filter));\n      if (filteredCurrentFilters.length > 0) {\n        items.push(...filteredCurrentFilters);\n      }\n    }\n    const uniqueItems = Array.from(new Set(items));\n    if (uniqueItems.length === 0) return [];\n    return [{ operator: \"in\", name, field, values: uniqueItems, display: uniqueItems[0] }] as LegacyFilter[];\n  }\n\n  protected getFiltersForList(): LegacyFilter[] {\n    const items = this.addCurrentFiltersToItems().filter((item) => item.$selected);\n    const searchedItems = this.searchedItems().filter((item) => item.$selected);\n    const currentItems = [...items, ...searchedItems];\n    const { column, name, isDistribution = false } = (this.aggregation() as Aggregation) || {};\n    return currentItems.map((item) =>\n      this.aggregationsService.toFilter(item, column, name, isDistribution)\n    );\n  }\n\n  private getFlattenTreeItems(): TreeAggregationNode[] {\n    const flattenItems = (items: TreeAggregationNode[]): TreeAggregationNode[] =>\n      items.reduce(\n        (flat, item) => flat.concat(item, item.items ? flattenItems(item.items) : []),\n        [] as TreeAggregationNode[]\n      );\n    const searchedItemsFiltered = (this.searchedItems() || []).filter(\n      (item): item is TreeAggregationNode => \"items\" in item\n    );\n    return [\n      ...flattenItems(searchedItemsFiltered),\n      ...flattenItems((this.aggregation()?.items as TreeAggregationNode[]) || []),\n    ];\n  }\n\n  private addCurrentFiltersToItems() {\n    return this.base.addCurrentFiltersToItems(this.aggregation());\n  }\n\n  private verifySelected(): void {\n    const someItemsUnselected = (items: AggregationListItem[]): boolean =>\n      items.some((item) => !item.$selected || (item.items?.length && someItemsUnselected(item.items)));\n    this.isAllSelected.set(!someItemsUnselected(this.items()));\n  }\n\n  private setSelected(items: AggregationListItem[], savedItems: AggregationListItem[]): AggregationListItem[] {\n    return items.map((item) => {\n      const savedItem = savedItems.find((i) => i.value === item.value);\n      if (savedItem) {\n        item.$selected = savedItem.$selected;\n        item.$selectedVisually = savedItem.$selectedVisually;\n        if (item.items?.length && savedItem.items?.length) {\n          item.items = this.setSelected(item.items, savedItem.items);\n        }\n      }\n      return item;\n    });\n  }\n\n  private processAggregations(items: AggregationListItem[]): AggregationListItem[] {\n    if (!this.linkChildren()) return items;\n    items.forEach((item) => {\n      if (item.items?.length) this.selectVisually(item.items, item.$selected || false);\n    });\n    return items;\n  }\n\n  private selectVisually(items: AggregationListItem[], parentSelected: boolean): void {\n    items.forEach((item) => {\n      item.$selectedVisually = parentSelected;\n      if (item.items?.length) this.selectVisually(item.items, item.$selected || item.$selectedVisually);\n    });\n  }\n\n  private selectTreeItemChildren(items: AggregationListItem[], select: boolean): void {\n    if (!this.linkChildren() || !items?.length) return;\n    items.forEach((item) => {\n      item.$selectedVisually = select;\n      if (select) item.$selected = false;\n      if (item.items?.length) this.selectTreeItemChildren(item.items, select);\n    });\n  }\n\n  private handleTreeChildSelect(parent: AggregationListItem, child: AggregationListItem): void {\n    if (this.linkChildren() && !child.$selected && parent.items.some((i) => i.$selectedVisually)) {\n      parent.items.forEach((i) => {\n        if (i !== child) { i.$selectedVisually = false; i.$selected = true; }\n      });\n    }\n    if (this.linkChildren() && parent.items.some((i) => !i.$selectedVisually && !i.$selected)) {\n      parent.$selected = false;\n      parent.$selectedVisually = false;\n    }\n  }\n\n  private expandItems(items: TreeAggregationNode[], expandedLevel: number) {\n    this.traverse(items, (_lineage, node, level) => {\n      if (!node.$opened && node.items?.length > 0 && level < expandedLevel) {\n        node.$opened = true;\n      }\n      return false;\n    });\n  }\n\n  private traverse<T extends TreeAggregationNode>(\n    nodes: T[],\n    callback: (lineage: T[], node: T, depth: number) => boolean\n  ): boolean {\n    if (!nodes || nodes.length === 0) return false;\n    if (!callback) return false;\n    const lineage: T[] = [];\n    const stack: (T | undefined)[] = [];\n    let _i = nodes.length;\n    while (_i--) stack.push(nodes[_i]);\n    while (stack.length) {\n      const node = stack.pop();\n      if (!node) {\n        lineage.pop();\n      } else {\n        lineage.push(node);\n        if (callback(lineage, node, lineage.length - 1)) return true;\n        stack.push(undefined);\n        if (node.items && node.items.length > 0) {\n          _i = node.items.length;\n          while (_i--) stack.push(node.items[_i] as T);\n        }\n      }\n    }\n    return false;\n  }\n}\n","@if (!aggregation()?.isTree) {\r\n  <div class=\"p-2 text-sm text-red-500\">\r\n    <triangle-alert-icon class=\"mr-1\" />\r\n    The aggregationTree component does not support list aggregations. Please use\r\n    the &lt;Aggregation /&gt; component instead.\r\n  </div>\r\n}\r\n<aggregation-panel\r\n  [id]=\"id()\"\r\n  [collapsible]=\"collapsible()\"\r\n  [collapsed]=\"collapsed()\"\r\n  [isEmpty]=\"isEmpty()\"\r\n  [isDate]=\"isDate()\"\r\n  [aggregation]=\"aggregation()\"\r\n  [showFiltersCount]=\"showFiltersCount()\"\r\n  [filtersCount]=\"filtersCount()\"\r\n  [hasFilters]=\"hasFilters()\"\r\n  [selection]=\"selection()\"\r\n  [isAllSelected]=\"isAllSelected()\"\r\n  [(searchText)]=\"searchText\"\r\n  [itemsLength]=\"items().length\"\r\n  [hasMore]=\"aggregation()?.$hasMore ?? false\"\r\n  [searchedItemsLength]=\"searchedItems().length\"\r\n  (cleared)=\"clear()\"\r\n  (applied)=\"apply()\"\r\n  (allSelected)=\"selectAll()\"\r\n  (allUnselected)=\"unselectAll()\"\r\n  (loadedMore)=\"loadMore()\">\r\n  <div\r\n    #scrollElement\r\n    class=\"scrollbar-thin max-h-(--scroll-height,20rem) w-full overflow-auto\">\r\n    <div\r\n      class=\"relative w-full\"\r\n      [style.height]=\"virtualizer.getTotalSize() + 'px'\"\r\n      role=\"tree\"\r\n      [attr.aria-label]=\"aggregation()?.display | syslang | transloco\">\r\n      <div\r\n        class=\"absolute top-0 left-0 w-full\"\r\n        [style.transform]=\"\r\n          'translateY(' +\r\n          (virtualizer.getVirtualItems()[0]\r\n            ? virtualizer.getVirtualItems()[0].start\r\n            : 0) +\r\n          'px)'\r\n        \">\r\n        @for (vItem of virtualizer.getVirtualItems(); track vItem.index) {\r\n          @let item = items()[vItem.index];\r\n          <div #virtualItem [attr.data-index]=\"vItem.index\">\r\n            <ng-container\r\n              [ngTemplateOutlet]=\"treeItemTpl\"\r\n              [ngTemplateOutletContext]=\"{\r\n                node: item,\r\n                path: [],\r\n                field: aggregation()?.column,\r\n                tpl: treeItemTpl,\r\n                parent: null\r\n              }\">\r\n            </ng-container>\r\n          </div>\r\n        }\r\n      </div>\r\n    </div>\r\n  </div>\r\n</aggregation-panel>\r\n\r\n<ng-template\r\n  #treeItemTpl\r\n  let-node=\"node\"\r\n  let-path=\"path\"\r\n  let-field=\"field\"\r\n  let-tpl=\"tpl\"\r\n  let-parent=\"parent\">\r\n  <div\r\n    role=\"treeitem\"\r\n    [style.--level]=\"treeItemLevel(node)\"\r\n    [attr.aria-selected]=\"node.$selected ?? false\"\r\n    [attr.aria-expanded]=\"\r\n      node.hasChildren !== false ? (node.$opened ?? false) : null\r\n    \"\r\n    [attr.aria-disabled]=\"node.count === 0 ? 'true' : null\"\r\n    [attr.disabled]=\"node.count === 0 ? 'disabled' : null\">\r\n    <a\r\n      [attr.aria-label]=\"treeItemName(node) | syslang\"\r\n      [class]=\"\r\n        cn(\r\n          'flex grow items-center gap-2 p-1 leading-7',\r\n          node.count === 0 && 'disabled pointer-events-none',\r\n          (node.$selected || node.$selectedVisually) && ''\r\n        )\r\n      \"\r\n      (click)=\"selectTreeItem(node, parent, $event, true)\">\r\n      <button\r\n        variant=\"none\"\r\n        [iconOnly]=\"true\"\r\n        (click)=\"toggleTreeNode($event, node)\"\r\n        class=\"transition-transform ease-in hover:scale-125\"\r\n        aria-label=\"Open\">\r\n        <ChevronRight\r\n          [class]=\"\r\n            cn(\r\n              'size-4 translate-x-1',\r\n              node.$opened && 'rotate-90',\r\n              !node.hasChildren && 'hidden'\r\n            )\r\n          \"\r\n          width=\"16\"\r\n          height=\"16\" />\r\n      </button>\r\n      <input\r\n        type=\"checkbox\"\r\n        role=\"checkbox\"\r\n        value=\"{{ node.value }}\"\r\n        [attr.disabled]=\"node.count === 0 ? true : null\"\r\n        [attr.aria-disabled]=\"node.count === 0\"\r\n        (keydown.enter)=\"selectTreeItem(node, parent, $event)\"\r\n        [checked]=\"node.$selected || node.$selectedVisually\" />\r\n      @let icon = node.icon;\r\n      @if (icon) {\r\n        <FaIcon [faClass]=\"icon\" class=\"self-center justify-self-center\" />\r\n      }\r\n      <span\r\n        [class]=\"\r\n          cn(\r\n            'line-clamp-1 break-all text-ellipsis',\r\n            quickFilter() && 'hover:underline'\r\n          )\r\n        \"\r\n        [title]=\"\r\n          quickFilter()\r\n            ? ((isTreeItemFiltered(node, field)\r\n                ? 'filters.removeFilter'\r\n                : 'filters.addFilter'\r\n              ) | transloco) +\r\n              ': ' +\r\n              (treeItemName(node) | syslang)\r\n            : (treeItemName(node) | syslang)\r\n        \"\r\n        (click)=\"onTreeItemTextClick(node, parent, $event)\">\r\n        @for (\r\n          chunk of (treeItemName(node) | syslang) ?? \"\"\r\n            | highlightWord: searchText() : 10;\r\n          track $index\r\n        ) {\r\n          <span [class]=\"{ 'font-bold': chunk.match }\" aria-hidden=\"true\">{{\r\n            chunk.text\r\n          }}</span>\r\n        }\r\n      </span>\r\n      @if (showCount() && node.count > 0) {\r\n        <span class=\"ml-auto px-1 text-xs empty:hidden\" aria-hidden=\"true\">{{\r\n          node.count\r\n        }}</span>\r\n      }\r\n    </a>\r\n    @if (node.hasChildren && node.$opened) {\r\n      <div role=\"group\">\r\n        @for (child of node.items; track $index) {\r\n          <ng-container\r\n            [ngTemplateOutlet]=\"tpl\"\r\n            [ngTemplateOutletContext]=\"{\r\n              node: child,\r\n              path: treeChildrenPath(node, path),\r\n              field: field,\r\n              tpl: tpl,\r\n              parent: node\r\n            }\">\r\n          </ng-container>\r\n        }\r\n      </div>\r\n    }\r\n  </div>\r\n</ng-template>\r\n","import {\n  booleanAttribute,\n  ChangeDetectorRef,\n  Component,\n  computed,\n  inject,\n  input,\n  model,\n  output,\n  signal,\n  viewChild,\n  ElementRef,\n} from \"@angular/core\";\nimport { NgTemplateOutlet } from \"@angular/common\";\nimport { FormsModule, ReactiveFormsModule } from \"@angular/forms\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\nimport {\n  Aggregation,\n  AggregationItem,\n  EngineType,\n  error,\n  LegacyFilter,\n} from \"@sinequa/atomic\";\nimport {\n  cn,\n  FaIconComponent,\n  TriangleAlertIcon,\n} from \"@sinequa/ui\";\nimport { injectVirtualizer } from \"@tanstack/angular-virtual\";\nimport { HighlightWordPipe, SyslangPipe } from \"../../../../pipes\";\nimport { AggregationListItem } from \"../../../../models\";\nimport { injectAggregationBase } from \"../inject-aggregation-base\";\nimport { AggregationPanelComponent } from \"../panel/aggregation-panel\";\n\n@Component({\n  selector: \"AggregationList, aggregation-list, aggregationlist\",\n  imports: [\n    NgTemplateOutlet,\n    FormsModule,\n    ReactiveFormsModule,\n    SyslangPipe,\n    TranslocoPipe,\n    FaIconComponent,\n    TriangleAlertIcon,\n    HighlightWordPipe,\n    AggregationPanelComponent,\n  ],\n  standalone: true,\n  templateUrl: \"./aggregation-list.html\",\n  styles: [\n    `\n      div[role=\"option\"] {\n        display: block;\n        user-select: none;\n      }\n      div[role=\"option\"] a {\n        padding-left: var(--agg-tree-indent, 0.5rem);\n        line-height: var(--agg-item-height, inherit);\n      }\n    `,\n  ],\n  host: {\n    \"[class]\": 'cn(\"block h-[inherit] max-h-[inherit]\", class())',\n  },\n})\nexport class AggregationListComponent {\n  cn = cn;\n\n  /* inputs */\n  class = input(\"\");\n  id = input<string | null>(null);\n  name = input.required<string | null>();\n  column = input.required<string | null>();\n  collapsible = input(false);\n  collapsed = input(false);\n  searchable = input<boolean | undefined>(undefined);\n  showFiltersCount = input(null, { transform: booleanAttribute });\n\n  /* outputs */\n  onSelect = output<AggregationItem[]>();\n  onApply = output();\n  onClear = output();\n\n  /* view queries */\n  scrollElement = viewChild<ElementRef<HTMLDivElement>>(\"scrollElement\");\n\n  /* selection state */\n  selection = signal(false);\n  isAllSelected = signal<boolean>(false);\n\n  /* search state */\n  searchText = model<string>(\"\");\n\n  /* composable — injects stores/services, wires search effects, provides shared methods */\n  private readonly base = injectAggregationBase({\n    name: this.name,\n    column: this.column,\n    searchText: this.searchText,\n  });\n\n  /* spread from base */\n  readonly aggregationsStore = this.base.aggregationsStore;\n  readonly queryParamsStore = this.base.queryParamsStore;\n  readonly appStore = this.base.appStore;\n  readonly aggregationsService = this.base.aggregationsService;\n  readonly injector = this.base.injector;\n  readonly destroyRef = this.base.destroyRef;\n  readonly suggests = this.base.suggests;\n  readonly hasFilters = this.base.hasFilters;\n  readonly filtersCount = this.base.filtersCount;\n  readonly query = this.base.query;\n  readonly filters = this.base.filters;\n\n  /* features from appStore */\n  readonly showCount = computed(() => this.appStore.general()?.features?.showAggregationItemCount ?? false);\n  readonly quickFilter = computed(() => this.appStore.general()?.features?.quickFilter);\n  readonly isDate = computed(() => this.appStore.isDateColumn(this.aggregation()?.column || \"\"));\n\n  /* virtualizer */\n  private readonly cdr = inject(ChangeDetectorRef);\n  readonly virtualizer = injectVirtualizer(() => ({\n    count: this.items().length,\n    estimateSize: () => 32,\n    scrollElement: this.scrollElement(),\n  }));\n\n  aggregation = computed(() => {\n    getState(this.aggregationsStore);\n    const name = this.name();\n    const column = this.column();\n    if (name !== null) {\n      const agg = this.aggregationsService.processAggregation(name, column);\n      if (agg) {\n        if (agg.isTree) {\n          error(\n            \"The aggregation component does not support tree aggregations. Please use the <AggregationTree /> component instead.\"\n          );\n        }\n        agg.searchable = this.searchable() ?? agg.searchable;\n        return agg;\n      }\n    }\n    return null;\n  });\n\n  items = computed((): AggregationListItem[] => {\n    getState(this.aggregationsStore);\n    const agg = this.aggregation();\n    const searchedItems = this.searchedItems();\n    if (searchedItems.length > 0) return searchedItems as AggregationListItem[];\n    if (!agg?.items) return [];\n    // Reset $selected so items removed from the filter are deselected.\n    // Then return a new array reference so Angular's signal equality check\n    // detects the change and re-renders all component instances.\n    (agg.items as AggregationItem[]).forEach(item => { item.$selected = false; });\n    return [...this.addCurrentFiltersToItems()];\n  });\n\n  isEmpty = computed(() => this.items().length === 0);\n\n  searchedItems = computed(() => {\n    if (!this.suggests()) return [];\n    return this.suggests()?.map((suggest) => {\n      const column = this.appStore.getColumn(suggest.category);\n      const item = {\n        name: this.name(),\n        value: suggest.normalized || suggest.display || \"\",\n        display: suggest.display,\n        column: column?.name ?? suggest.category,\n        count: Number(suggest.frequency),\n        $selected: false,\n      } as AggregationItem;\n      if (column?.eType === EngineType.bool) {\n        item.value = Boolean(item.value);\n      }\n      return item;\n    });\n  });\n\n  constructor() {\n    this.destroyRef.onDestroy(() => {\n      if (this.selection()) {\n        this.aggregation()?.items?.forEach((item) => {\n          item.$selected = undefined;\n        });\n      }\n    });\n  }\n\n  clear() {\n    const agg = this.aggregation();\n    if (agg) {\n      this.queryParamsStore.removeFilterByName(agg.name, agg.column);\n      this.selection.set(false);\n      this.isAllSelected.set(false);\n    }\n    this.onSelect.emit([]);\n    this.onClear.emit();\n  }\n\n  selectAll() {\n    if (this.items().length) {\n      this.base.selectItems(this.items(), true);\n      this.selection.set(true);\n      this.isAllSelected.set(true);\n    }\n  }\n\n  unselectAll() {\n    if (this.items().length) {\n      this.base.selectItems(this.items(), false);\n      this.select();\n      this.isAllSelected.set(false);\n    }\n  }\n\n  apply() {\n    const agg = this.aggregation();\n    if (!agg) return;\n    this.base.applyFilters(this.getFilters(), agg, () => this.clear());\n    this.searchText.set(\"\");\n    this.selection.set(false);\n    this.onApply.emit();\n  }\n\n  loadMore(): void {\n    const q = this.queryParamsStore.getQuery();\n    this.aggregationsService.loadMore(q, this.aggregation() as Aggregation).subscribe((aggregation) => {\n      this.aggregationsStore.updateAggregation(aggregation);\n      this.cdr.detectChanges();\n    });\n  }\n\n  select() {\n    const selectedItems = this.items().filter((item) => item.$selected);\n    this.onSelect.emit(selectedItems);\n    this.selection.set(selectedItems.length > 0 || this.hasFilters());\n  }\n\n  /* item-level methods — called from the ng-template */\n\n  protected listItemName(item: AggregationItem): string {\n    const value = item.display || item.value;\n    return typeof value === \"string\" ? value : `${value}`;\n  }\n\n  protected isListItemFiltered(item: AggregationItem, field: string | null | undefined): boolean {\n    const filters = this.queryParamsStore.getFilter({ field: field ?? undefined, name: this.listItemName(item) });\n    if (!filters) return false;\n    const values = [item.value];\n    return (\n      values.some((v) => v === filters.value) ||\n      !!(filters.values?.length && filters.values.some((value: string) => values.some((v) => v === value)))\n    );\n  }\n\n  protected selectListItem(item: AggregationItem, e?: Event): void {\n    e?.stopImmediatePropagation();\n    item.$selected = !item.$selected;\n    this.select();\n  }\n\n  protected onListItemTextClick(item: AggregationItem, event: Event): void {\n    if (this.quickFilter()) {\n      this.selectListItem(item, event);\n      this.apply();\n    }\n  }\n\n  protected getFilters(): LegacyFilter[] {\n    const items = this.items().filter((item) => item.$selected);\n    const searchedItems = this.searchedItems().filter((item) => item.$selected);\n    const currentItems = [...items, ...searchedItems];\n    const { column, name, isDistribution = false } = (this.aggregation() as Aggregation) || {};\n    return currentItems.map((item) =>\n      this.aggregationsService.toFilter(item, column, name, isDistribution)\n    );\n  }\n\n  private addCurrentFiltersToItems() {\n    return this.base.addCurrentFiltersToItems(this.aggregation());\n  }\n}\n","@if (aggregation()?.isTree) {\r\n  <div class=\"p-2 text-sm text-red-500\">\r\n    <triangle-alert-icon class=\"mr-1\" />\r\n    The aggregation component no longer supports tree aggregations. Please use\r\n    the &lt;AggregationTree /&gt; component instead.\r\n  </div>\r\n}\r\n<aggregation-panel\r\n  [id]=\"id()\"\r\n  [collapsible]=\"collapsible()\"\r\n  [collapsed]=\"collapsed()\"\r\n  [isEmpty]=\"isEmpty()\"\r\n  [isDate]=\"isDate()\"\r\n  [aggregation]=\"aggregation()\"\r\n  [showFiltersCount]=\"showFiltersCount()\"\r\n  [filtersCount]=\"filtersCount()\"\r\n  [hasFilters]=\"hasFilters()\"\r\n  [selection]=\"selection()\"\r\n  [isAllSelected]=\"isAllSelected()\"\r\n  [(searchText)]=\"searchText\"\r\n  [itemsLength]=\"items().length\"\r\n  [hasMore]=\"aggregation()?.$hasMore ?? false\"\r\n  [searchedItemsLength]=\"searchedItems().length\"\r\n  (cleared)=\"clear()\"\r\n  (applied)=\"apply()\"\r\n  (allSelected)=\"selectAll()\"\r\n  (allUnselected)=\"unselectAll()\"\r\n  (loadedMore)=\"loadMore()\">\r\n  <div\r\n    #scrollElement\r\n    class=\"scrollbar-thin max-h-(--scroll-height,20rem) w-full overflow-auto\">\r\n    <div\r\n      class=\"relative w-full\"\r\n      [style.height]=\"virtualizer.getTotalSize() + 'px'\"\r\n      role=\"listbox\"\r\n      aria-multiselectable=\"true\"\r\n      [attr.aria-label]=\"aggregation()?.display | syslang | transloco\">\r\n      @for (vItem of virtualizer.getVirtualItems(); track vItem.index) {\r\n        @let item = items()[vItem.index];\r\n        <div\r\n          class=\"absolute w-full\"\r\n          [style.transform]=\"'translateY(' + vItem.start + 'px)'\"\r\n          role=\"option\"\r\n          [attr.aria-selected]=\"item.$selected ?? false\"\r\n          [attr.aria-disabled]=\"item.count === 0 ? 'true' : null\"\r\n          [attr.disabled]=\"item.count === 0 ? 'disabled' : null\">\r\n          <ng-container\r\n            [ngTemplateOutlet]=\"listItemTpl\"\r\n            [ngTemplateOutletContext]=\"{\r\n              $implicit: item,\r\n              field: aggregation()?.column\r\n            }\">\r\n          </ng-container>\r\n        </div>\r\n      }\r\n    </div>\r\n  </div>\r\n</aggregation-panel>\r\n\r\n<ng-template #listItemTpl let-item let-field=\"field\">\r\n  <a\r\n    [attr.aria-label]=\"listItemName(item) | syslang\"\r\n    [class]=\"\r\n      cn(\r\n        'flex grow items-center gap-2 p-1 leading-7',\r\n        item.count === 0 && 'disabled pointer-events-none'\r\n      )\r\n    \"\r\n    (click)=\"selectListItem(item, $event)\">\r\n    <input\r\n      type=\"checkbox\"\r\n      role=\"checkbox\"\r\n      value=\"{{ item.value }}\"\r\n      [attr.disabled]=\"item.count === 0 ? true : null\"\r\n      [attr.aria-disabled]=\"item.count === 0\"\r\n      (keydown.enter)=\"selectListItem(item, $event)\"\r\n      [checked]=\"item.$selected\" />\r\n    @let icon = item.icon;\r\n    @if (icon) {\r\n      <FaIcon [faClass]=\"icon\" class=\"self-center justify-self-center\" />\r\n    }\r\n    <span\r\n      [class]=\"\r\n        cn(\r\n          'line-clamp-1 break-all text-ellipsis',\r\n          quickFilter() && 'hover:underline'\r\n        )\r\n      \"\r\n      [title]=\"\r\n        quickFilter()\r\n          ? ((isListItemFiltered(item, field)\r\n              ? 'filters.removeFilter'\r\n              : 'filters.addFilter'\r\n            ) | transloco) +\r\n            ': ' +\r\n            (listItemName(item) | syslang)\r\n          : (listItemName(item) | syslang)\r\n      \"\r\n      (click)=\"onListItemTextClick(item, $event)\">\r\n      @for (\r\n        chunk of (listItemName(item) | syslang) ?? \"\"\r\n          | highlightWord: searchText() : 10;\r\n        track $index\r\n      ) {\r\n        <span [class]=\"{ 'font-bold': chunk.match }\" aria-hidden=\"true\">{{\r\n          chunk.text\r\n        }}</span>\r\n      }\r\n    </span>\r\n    @if (showCount() && item.count > 0) {\r\n      <span class=\"ml-auto px-1 text-xs empty:hidden\" aria-hidden=\"true\">{{\r\n        item.count\r\n      }}</span>\r\n    }\r\n  </a>\r\n</ng-template>\r\n","import {\n  booleanAttribute,\n  Component,\n  computed,\n  inject,\n  input,\n  numberAttribute,\n  output,\n  viewChild\n} from \"@angular/core\";\nimport { getState } from \"@ngrx/signals\";\nimport { cn } from \"@sinequa/ui\";\nimport { AggregationsService } from \"../../../services\";\nimport { AggregationsStore, AppStore } from \"../../../stores\";\nimport { AggregationDateComponent } from \"./date/aggregation-date\";\nimport { AggregationTreeComponent } from \"./tree/aggregation-tree\";\nimport { AggregationItem, warn } from \"@sinequa/atomic\";\nimport { AggregationListComponent } from \"./list/aggregation-list\";\n\n/**\n * The `AggregationComponent` is responsible for rendering the appropriate aggregation component based on the type of aggregation (date, tree, or list). It uses the `AggregationsService` to retrieve the aggregation data and determines which component to display based on the column type and whether it is a tree structure. The component also provides inputs for configuring its behavior, such as collapsibility, searchability, and showing filter counts.\n *\n *\n * @example\n * <Aggregation\n *   name=\"myAggregation\"\n *   column=\"myColumn\"\n *   [collapsible]=\"true\"\n *   [collapsed]=\"false\"\n *   [showFiltersCount]=\"true\"\n *   [searchable]=\"true\"\n *   (onSelect)=\"handleSelect($event)\"\n * />\n */\n@Component({\n  selector: \"Aggregation, aggregation\",\n  imports: [AggregationListComponent, AggregationTreeComponent, AggregationDateComponent],\n  template: `\n    @if (isDate(aggregation()?.column)) {\n    <AggregationDate\n      [id]=\"id()\"\n      [name]=\"name()\"\n      [column]=\"column()\"\n      [collapsed]=\"collapsed()\"\n      [collapsible]=\"collapsible()\"\n      [showFiltersCount]=\"showFiltersCount()\"\n      [searchable]=\"searchable()\"\n      [title]=\"{ label: 'Date', icon: 'far fa-calendar-day' }\"\n      (onApply)=\"onApply.emit($event)\"\n      (onClear)=\"onClear.emit($event)\"\n      />\n  } @else if (aggregation()?.isTree) {\n    <AggregationTree\n      [id]=\"id()\"\n      [name]=\"name()\"\n      [column]=\"column()\"\n      [collapsed]=\"collapsed()\"\n      [collapsible]=\"collapsible()\"\n      [showFiltersCount]=\"showFiltersCount()\"\n      [searchable]=\"searchable()\"\n      [expandedLevel]=\"expandedLevel()\"\n      (onSelect)=\"onSelect.emit($event)\"\n      (onApply)=\"onApply.emit($event)\"\n      (onClear)=\"onClear.emit($event)\"\n      />\n  }\n  @else {\n    <AggregationList\n      [id]=\"id()\"\n      [name]=\"name()\"\n      [column]=\"column()\"\n      [collapsed]=\"collapsed()\"\n      [collapsible]=\"collapsible()\"\n      [showFiltersCount]=\"showFiltersCount()\"\n      [searchable]=\"searchable()\"\n      (onSelect)=\"onSelect.emit($event)\"\n      (onApply)=\"onApply.emit($event)\"\n      (onClear)=\"onClear.emit($event)\"\n      />\n  }\n  `,\n  host: {\n  \"[class]\": 'cn(\"block h-[inherit] max-h-[inherit]\",class())'\n}\n})\nexport class AggregationComponent {\n  cn = cn;\n\n  appStore = inject(AppStore);\n  aggregationsStore = inject(AggregationsStore);\n  aggregationsService = inject(AggregationsService);\n\n  aggregationDate = viewChild(AggregationDateComponent);\n  aggregationTree = viewChild(AggregationTreeComponent)\n  aggregationList = viewChild(AggregationListComponent);\n\n  class = input(\"\");\n  /**\n   * The name of the <details> element. When you provide the same id, the component work as an accordion\n   * @defaultValue null\n   */\n  id = input<string | null>(null);\n  /**\n   * The name of the aggregation. This is a required input and must be provided for the component to function correctly.\n   * @defaultValue undefined\n   */\n  name = input.required<string>();\n  /**\n   * The column associated with the aggregation. This is a required input and must be provided for the component to function correctly.\n   * @defaultValue undefined\n   */\n  column = input.required<string>();\n  /**\n   * A boolean flag indicating whether we want to see the filters count when some is applied\n   * This property is initialized to `false` by default.\n   */\n  showFiltersCount = input(null, { transform: booleanAttribute });\n  /**\n   * Determines whether the aggregation component can be collapsed or expanded.\n   * When true, the component will display collapse/expand controls allowing users\n   * to show or hide the aggregation content.\n   *\n   * @default false\n   */\n  collapsible = input(false);\n  /**\n   * Controls whether the aggregation component is in a collapsed state.\n   * When true, the component will be visually collapsed/hidden.\n   * When false, the component will be expanded/visible.\n   *\n   * @default false\n   */\n  collapsed = input(false);\n  /**\n   * A boolean flag indicating whether the component is searchable.\n   * This property is initialized to `undefined` by default.\n   * \"Undefined\" and not \"false\" because this input overrides the custom json settings\n   */\n  searchable = input(undefined);\n\n  expandedLevel = input(undefined, { transform: numberAttribute })\n  /**\n   * An output event that emits an array of selected `AggregationItem` objects when the user selects items in the aggregation component. This allows parent components to listen for selection changes and react accordingly, such as applying filters or updating the UI based on the selected items.\n   */\n  onSelect = output<AggregationItem[]>();\n  onApply = output();\n  onClear = output();\n\n  /**\n   * A computed property that retrieves the items to be displayed in the aggregation component. It checks for the presence of date, tree, or list aggregation components and returns their respective items. If none of these components are present, it returns an empty array. This allows the component to dynamically display the appropriate items based on the type of aggregation being rendered.\n   *\n   * @returns An array of items to be displayed in the aggregation component.\n   */\n  protected items = computed(() =>\n    this.aggregationDate()?.items() ??\n    this.aggregationTree()?.items() ??\n    this.aggregationList()?.items() ??\n    []\n  );\n\n  /**\n   * A computed property that filters the items to include only those that are currently selected. It uses the `items` computed property to retrieve all items and then applies a filter to return only those with the `$selected` property set to true. This allows the component to easily access and manage the selected items for further processing, such as applying filters or updating the UI based on user selections.\n   *\n   * @returns An array of selected items from the aggregation component.\n   */\n  protected selectedItems = computed(() => this.items().filter(item => item.$selected));\n\n  /* aggregation */\n  protected aggregation = computed(() => {\n    // when the aggegation store updates, we need to check if the aggregation is still valid\n    getState(this.aggregationsStore);\n    const agg = this.aggregationsService.getAggregation(this.name(), this.column());\n    if (!agg) {\n      warn(`Aggregation with name ${this.name()} and column ${this.column()} not found`);\n      return undefined;\n    }\n    return agg;\n  });\n\n  /**\n   * Checks if the specified column is a date filter.\n   *\n   * @param column The column name to check.\n   * @returns True if the column is a date filter, false otherwise.\n   */\n  protected isDate(column: string | undefined): boolean {\n    if(!column) {\n      return false;\n    }\n    return this.appStore.isDateColumn(column);\n  }\n}","import { Component, computed, inject, input } from \"@angular/core\";\n\nimport type { Aggregation } from \"@sinequa/atomic\";\nimport { cn } from \"@sinequa/ui\";\n\nimport { AppStore } from \"../../stores\";\nimport { AggregationComponent } from \"./aggregation/aggregation\";\n\n@Component({\n  selector: \"aside-filters, AsideFilters, asidefilters\",\n  imports: [AggregationComponent],\n  template: `\n  <div class=\"flex flex-col gap-2\">\n    @for (agg of asideFilters(); track agg.name) {\n      <Aggregation id=\"aside-filters\" [name]=\"agg.name\" [column]=\"agg.column\" showFiltersCount />\n    }\n  </div>\n  `,\n  host: {\n    \"[class]\": \"cn('flex flex-col gap-2 overflow-auto', class())\"\n  }\n})\nexport class AsideFiltersComponent {\n  cn = cn;\n  class = input<string>();\n  position = input<\"left\" | \"both\" | undefined>();\n\n  private readonly appStore = inject(AppStore);\n\n  asideFilters = computed<Aggregation[]>(() => {\n    const asideFilters = this.appStore.filters().filter((f) => f.position === \"left\");\n    return this.appStore.getAuthorized(asideFilters);\n  });\n\n  /**\n   * Checks if the specified column is a date filter.\n   *\n   * @param column The column name to check.\n   * @returns True if the column is a date filter, false otherwise.\n   */\n  protected isDate(column: string): boolean {\n    return this.appStore.isDateColumn(column);\n  }\n}\n","import { Component, ElementRef, effect, inject, input, numberAttribute, signal, viewChild } from \"@angular/core\";\nimport { Placement } from \"@floating-ui/dom\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { LegacyFilter } from \"@sinequa/atomic\";\nimport {\n  BadgeComponent,\n  ButtonComponent,\n  ButtonVariants,\n  FaIconComponent,\n  PopoverComponent,\n  PopoverContentComponent\n} from \"@sinequa/ui\";\n\nimport { OperatorPipe, SyslangPipe } from \"../../../pipes\";\nimport { AggregationsStore, AppStore, QueryParamsStore } from \"../../../stores\";\nimport { AggregationComponent } from \"../aggregation/aggregation\";\nimport { CFilterEx } from \"../types/CFilterEx.type\";\n\n@Component({\n  selector: \"filter-button, FilterButton\",\n  standalone: true,\n  imports: [\n    ButtonComponent,\n    PopoverComponent,\n    PopoverContentComponent,\n    OperatorPipe,\n    TranslocoPipe,\n    AggregationComponent,\n    SyslangPipe,\n    BadgeComponent,\n    FaIconComponent\n  ],\n  template: `\n    <Popover [disabled]=\"filter().disabled\" class=\"group\">\n      <button\n        [variant]=\"variant()\"\n        class=\"group-open:border-foreground/50 group-open:border\"\n        [attr.data-disabled]=\"filter().disabled\"\n        [disabled]=\"filter().disabled || null\"\n        >\n        <!-- display the filter icon if set -->\n        @let icon = filter().icon;\n        @if (icon) {\n          <fa-icon [faClass]=\"icon\" />\n        }\n\n        @if (filter().legacyFilter && filter().display === 'custom-range') {\n          <!-- display the date range if the filter is a date filter -->\n          <span [innerHTML]=\"filter().legacyFilter | operator | syslang | transloco\"></span>\n        } @else {\n          <!-- display the first filter value or the aggregation name if no value is set -->\n           @let display = filter().display || filter().name | syslang | transloco;\n          <span class=\"max-w-40 truncate\" [title]=\"display\">{{ display }}</span>\n        }\n\n        <!-- show the count of selected items -->\n        @if (filter().count > 1) {\n          <Badge size=\"sm\">+{{ filter().count - 1 }}</Badge>\n        }\n      </button>\n\n      <PopoverContent #contentRef=\"popoverContent\"\n        class=\"min-w-fit w-max max-w-[90vw]\"\n        [position]=\"position()\"\n        [offset]=\"offset()\"\n      >\n      @if(contentRef.isVisible) {\n        @let name = filter().name;\n        @let column = filter().column;\n        @if(name) {\n          <Aggregation\n            class=\"w-60 [--height:19lh]\"\n            id=\"filter-{{ filter().column }}\"\n            [name]=\"name\"\n            [column]=\"column\"\n            [expandedLevel]=\"expandedLevel()\"\n            (onApply)=\"popoverRef()?.close()\"\n            (onClear)=\"popoverRef()?.close()\"\n          />\n        } @else {\n          <div class=\"p-4 text-sm text-foreground/60\">\n            {{ 'INVALID_FILTER_NAME' | transloco }}\n          </div>\n        }\n      }\n      </PopoverContent>\n    </Popover>\n  `,\n  host: {\n    \"[class.hidden]\": \"filter().hidden\",\n    role: \"listitem\"\n  }\n})\nexport class FilterButtonComponent {\n  name = input<string>();\n  column = input.required<string>();\n  position = input<Placement>(\"bottom-start\");\n  offset = input<number>(8);\n  expandedLevel = input(undefined, { transform: numberAttribute })\n\n  protected variant = signal<ButtonVariants[\"variant\"]>(\"ghost\");\n\n  protected filter = signal<CFilterEx>({\n    name: \"\",\n    icon: \"\",\n    column: \"\",\n    display: \"\",\n    isTree: false,\n    count: 0,\n    hidden: false,\n    disabled: false\n  });\n\n  popoverRef = viewChild(PopoverComponent);\n  protected nativeElement = inject(ElementRef).nativeElement;\n  protected aggregationsStore = inject(AggregationsStore);\n  protected queryParamsStore = inject(QueryParamsStore);\n  protected appStore = inject(AppStore);\n\n  constructor() {\n    effect(() => {\n      const name = this.name();\n      const column = this.column();\n\n      let agg = undefined;\n      if(name) {\n        agg = this.aggregationsStore.getAggregation(name);\n        if (!agg) return;\n      }\n\n      const f = this.queryParamsStore.getFilter({ name: name, field: column });\n      const count = f?.count || 0;\n\n      // retrieve customization fron the custom JSON provided by the server\n      const {\n        icon,\n        hidden = false,\n        display\n      } = this.appStore.getAggregationCustomization(column, name) || {};\n\n      const r = {\n        name,\n        column: this.column(),\n        icon,\n        hidden,\n        display: f?.display ?? f?.value ?? display,\n        isTree: agg?.isTree || false,\n        count,\n        disabled: !!(!agg?.items || agg.items?.length === 0),\n        // if the filter is a date filter, we need to set the legacyFilter\n        // to be able to display the date range\n        legacyFilter: this.isDate(this.column()) ? (f as LegacyFilter) : undefined\n      } as CFilterEx;\n\n      if(this.isDate(this.column())) {\n        // for date filters, we want to display the date range in the button\n        r.disabled = false; // date filters should never be disabled, even if they have no items, because they can still be applied with a custom range\n      }\n\n      this.filter.set(r);\n    });\n\n    effect(() => {\n      const f = this.filter();\n      this.variant.update(() => (f.count ? \"primary\" : \"ghost\"));\n    });\n  }\n\n  /**\n   * Checks if the specified column is a date filter.\n   *\n   * @param column The column name to check.\n   * @returns True if the column is a date filter, false otherwise.\n   */\n  protected isDate(column: string): boolean {\n    return this.appStore.isDateColumn(column);\n  }\n}\n","import { InjectionToken } from \"@angular/core\";\r\n\r\nexport const FILTERS_BREAKPOINT = new InjectionToken<number>('FILTERS_BREAKPOINT', { factory: () => 5 });\r\n","import { booleanAttribute, Component, computed, effect, inject, input, signal } from \"@angular/core\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\nimport { Aggregation } from \"@sinequa/atomic\";\nimport { cn } from \"@sinequa/ui\";\nimport { CFilter } from \"../../../models\";\nimport { AggregationsService } from \"../../../services\";\nimport { AggregationsStore, AppStore, QueryParamsStore } from \"../../../stores\";\nimport { AggregationComponent } from \"../aggregation/aggregation\";\nimport { CFilterEx } from \"../types/CFilterEx.type\";\n\n@Component({\n  selector: \"more, More\",\n  standalone: true,\n  imports: [AggregationComponent, TranslocoPipe],\n  template: `\n    @for (filter of visibleFilters(); track $index) {\n      <Aggregation\n        class=\"w-60 max-w-80 px-1 [--height:15lh]\"\n        id=\"more-filters\"\n        [attr.title]=\"'filters.openFilter' | transloco: { filter: filter.name }\"\n        showFiltersCount\n        [collapsible]=\"true\"\n        [collapsed]=\"true\"\n        [name]=\"filter.name\"\n        [column]=\"filter.column\" />\n    }\n  `,\n  host: {\n    class: \"divide-y divide-muted-foreground/18\"\n  },\n  styles: [\n    `\n      :host {\n        scrollbar-width: none;\n      }\n    `\n  ]\n})\nexport class MoreComponent {\n  cn = cn;\n  count = input<number>(2);\n  includedFilters = input<string[]>([]);\n  excludedFilters = input<string[]>([]);\n  aggregations = input<Aggregation[] | undefined>();\n  homepage = input(false, { transform: booleanAttribute });\n\n  appStore = inject(AppStore);\n  aggregationsStore = inject(AggregationsStore);\n  queryParamsStore = inject(QueryParamsStore);\n\n  aggregationsService = inject(AggregationsService);\n  /**\n   * Signal containing an array of extended filter objects.\n   *\n   * @remarks\n   * This signal holds the current state of filters that can be applied to data.\n   * The filters are of type CFilterEx[], which extends the base filter functionality.\n   *\n   */\n  filters = signal<CFilterEx[]>([]);\n  /**\n   * Computed property that returns an array of filters that are currently visible.\n   * Filters out any filters where the `hidden` property is set to true.\n   *\n   * @returns An array of filters that are not hidden\n   */\n  visibleFilters = computed(() => {\n    const filters = this.filters().filter((f) => !f.hidden);\n    return filters;\n  });\n\n  constructor() {\n    effect(() => {\n      const count = this.count();\n      const authorizedFilters = this.aggregationsService\n        .getAuthorizedFilters(this.aggregations(), this.includedFilters(), this.excludedFilters(), this.homepage())\n        .toSpliced(0, count);\n\n      const f = authorizedFilters.map((agg) => {\n        const { icon = \"far fa-list\", hidden = false } =\n          (this.appStore.getAggregationCustomization(agg.column, agg.name) as CFilter) || {};\n        return {\n          name: agg.name,\n          column: agg.column,\n          icon,\n          count: 0,\n          isTree: false,\n          disabled: false,\n          hidden\n        };\n      });\n\n      this.filters.set(f);\n      this.updateFilters();\n    });\n  }\n\n  clearFilter(field: string) {\n    this.queryParamsStore.removeFilter(field);\n  }\n\n  updateFilters() {\n    this.filters.update((filters) => {\n      return filters.map((filter) => {\n        const agg = this.aggregationsStore.getAggregation(filter.name);\n        const f = this.queryParamsStore.getFilter({ name: agg?.name, field: agg?.column });\n        const count = f?.count || 0;\n\n        const { display = agg?.isTree ? undefined : filter.display } =\n          (this.appStore.getAggregationCustomization(filter.column) as CFilter) || {};\n\n        return {\n          ...filter,\n          name: agg?.name || filter.name,\n          display,\n          isTree: agg?.isTree || false,\n          count,\n          disabled: !!(!agg?.items || agg.items?.length === 0) // Disable if no items\n        };\n      });\n    });\n  }\n\n  /**\n   * Checks whether there are active filters for the current aggregation column.\n   *\n   * if True, the clear button is shown.\n   *\n   * @returns {boolean} `true` if the filter count for the aggregation column is greater than 0, otherwise `false`.\n   */\n  hasFilters(aggregation: Aggregation): boolean {\n    const { count = 0 } = this.queryParamsStore.getFilter({ field: aggregation.column, name: aggregation.name }) || {};\n    return count > 0;\n  }\n}\n","import { booleanAttribute, Component, computed, ElementRef, inject, input, numberAttribute } from \"@angular/core\";\nimport { Placement } from \"@floating-ui/dom\";\nimport { TranslocoPipe } from \"@jsverse/transloco\";\nimport { Aggregation } from \"@sinequa/atomic\";\nimport { BadgeComponent, ButtonComponent, ListFilterIcon, PopoverComponent, PopoverContentComponent } from \"@sinequa/ui\";\nimport { AggregationsService } from \"../../../services\";\nimport { AppStore, QueryParamsStore } from \"../../../stores\";\nimport { MoreComponent } from \"./more.component\";\n\n@Component({\n  selector: \"more-button, MoreButton\",\n  standalone: true,\n  imports: [ButtonComponent, PopoverComponent, PopoverContentComponent, TranslocoPipe, MoreComponent, BadgeComponent, ListFilterIcon],\n  template: `\n    <Popover class=\"group/more\">\n      <button\n        variant=\"ghost\"\n        class=\"group-open/more:border-foreground/18 gap-1 truncate font-semibold group-open/more:border\"\n        aria-label=\"more filters\">\n        <list-filter-icon aria-hidden=\"true\" />\n        <span sr-only class=\"hidden sm:inline\">{{ 'filters.moreFilters' | transloco }}</span>\n\n        @if (totalFiltersCount() > 0) {\n          <Badge size=\"xs\">\n            {{ totalFiltersCount() }}\n          </Badge>\n        }\n      </button>\n\n      <PopoverContent #contentRef=\"popoverContent\" [position]=\"position()\" class=\"min-w-max\">\n        @if(contentRef.isVisible) {\n        <More [count]=\"count()\" [includedFilters]=\"includedFilters()\" [excludedFilters]=\"excludedFilters()\" [aggregations]=\"aggregations()\" [homepage]=\"homepage()\" class=\"block h-full w-full max-w-80 [--height:55vh] min-w-40 overflow-hidden\" />\n        }\n      </PopoverContent>\n    </Popover>\n  `\n})\nexport class MoreButtonComponent {\n  appStore = inject(AppStore);\n  queryParamsStore = inject(QueryParamsStore);\n  nativeElement = inject(ElementRef).nativeElement;\n\n  aggregationsService = inject(AggregationsService);\n\n  count = input(2, { transform: numberAttribute });\n  position = input<Placement>(\"bottom-end\");\n  includedFilters = input<string[]>([]);\n  excludedFilters = input<string[]>([]);\n  aggregations = input<Aggregation[] | undefined>();\n  homepage = input(false, { transform: booleanAttribute });\n\n  totalFiltersCount = computed(() => {\n    const count = this.count();\n    const authorizedFilters = this.aggregationsService\n      .getAuthorizedFilters(this.aggregations(), this.includedFilters(), this.excludedFilters(), this.homepage())\n      .toSpliced(0, count);\n\n    const total = authorizedFilters.reduce((acc, filter) => {\n      const f = this.queryParamsStore.getFilter(filter);\n      acc += f?.count || 0;\n      return acc;\n    }, 0);\n    return total;\n  });\n}\n","import {\n  afterRenderEffect,\n  booleanAttribute,\n  ChangeDetectorRef,\n  Component,\n  computed,\n  DestroyRef,\n  ElementRef,\n  inject,\n  input,\n  numberAttribute,\n  output,\n  signal,\n  viewChild,\n  viewChildren\n} from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { Router } from \"@angular/router\";\nimport { Placement } from \"@floating-ui/dom\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\nimport { getState } from \"@ngrx/signals\";\nimport type { Aggregation } from \"@sinequa/atomic\";\nimport { BreakpointObserverService, ButtonComponent, cn, InboxIcon, TrashCanIcon } from \"@sinequa/ui\";\nimport { debounceTime } from \"rxjs\";\n\nimport { OverflowItemDirective, OverflowManagerDirective, OverflowStopDirective } from \"../../directives\";\nimport { AggregationsService } from \"../../services\";\nimport { AggregationsStore, AppStore, QueryParamsStore } from \"../../stores\";\nimport { FilterButtonComponent } from \"./buttons/filter-button.component\";\nimport { FILTERS_BREAKPOINT } from \"./tokens/filters-breakpoint.token\";\nimport { MoreButtonComponent } from \"./more/more-button.component\";\n\n@Component({\n  selector: \"filters-bar, FiltersBar, filtersbar\",\n  standalone: true,\n  imports: [\n    ButtonComponent,\n    MoreButtonComponent,\n    FilterButtonComponent,\n    OverflowManagerDirective,\n    OverflowItemDirective,\n    OverflowStopDirective,\n    TranslocoPipe,\n    TrashCanIcon,\n    InboxIcon\n  ],\n  providers: [provideTranslocoScope(\"filters\")],\n  template: `\n    <div overflowManager [direction]=\"direction()\" [reserveStop]=\"hasCappedFilters()\" (count)=\"adjustFiltersCount($event)\"  class=\"flex items-end gap-2 rounded-[inherit] bg-inherit\">\n      @if (hasFilters()) {\n        <button\n          variant=\"destructive\"\n          [iconOnly]=\"true\"\n          class=\"shrink-0 size-9\"\n          role=\"listitem\"\n          [title]=\"'filters.clearAllFilters' | transloco\"\n          (click)=\"clearFilters()\"\n          (keydown.enter)=\"clearFilters()\">\n          <trash-can-icon />\n        </button>\n      }\n\n      @if (currentBasket()) {\n        <button\n          variant=\"destructive\"\n          class=\"max-w-40 size-9\"\n          role=\"listitem\"\n          [title]=\"'filters.clearBasket' | transloco\"\n          (click)=\"clearBasket()\"\n          (keydown.enter)=\"clearBasket()\">\n          <inbox-icon />\n          <p class=\"truncate\">{{ currentBasket() }}</p>\n        </button>\n      }\n\n      @if (hasAggregations()) {\n      <div\n        [class]=\"cn('flex gap-1 z-filter flex-1 min-w-0', direction() === 'vertical' ? 'flex-col items-start' : 'flex-row')\"\n        role=\"list\"\n        aria-label=\"Filters list\">\n        @for (filter of authorizedFilters(); track filter.name) {\n          <FilterButton class=\"max-w-60\" overflowItem [name]=\"filter.name\" [column]=\"filter.column\" [position]=\"position()\" [offset]=\"offset()\" [expandedLevel]=\"expandedLevel()\" />\n        }\n      </div>\n\n      <!-- Always mounted so the stop position is stable; hidden when all filters fit -->\n      @if (showMoreFiltersButton()) {\n        <MoreButton\n          overflowStop\n          [class]=\"cn('shrink-0', hasMoreFilters().length === 0 && 'invisible pointer-events-none')\"\n          role=\"listitem\"\n          [count]=\"visibleFiltersCount()\"\n          [position]=\"morePosition()\"\n          [includedFilters]=\"includeFilters()\"\n          [excludedFilters]=\"excludeFilters()\"\n          [aggregations]=\"aggregations()\"\n          [homepage]=\"homepage()\" />\n      }\n      }\n    </div>\n  `,\n  host: {\n    \"[class]\": \"cn('block relative min-w-0', class())\",\n    \"(click)\": \"handleClick($event)\"\n  }\n})\nexport class FiltersBarComponent {\n  class = input<string>();\n\n  position = input<Placement>(\"bottom-start\");\n  morePosition = input<Placement>(\"bottom-end\");\n  aggregations = input<Aggregation[] | undefined>();\n\n  /**\n   * Filters that should be included from the filters bar.\n   * Providing it will hide any filters not contained in this list.\n   *\n   * Use the filter column names to specify which filters to include.\n   * For example, to include the \"geo\" filter, set `includeFilters = ['Geo']`.\n   */\n  includeFilters = input<string[]>([]);\n\n  /**\n   * Filters that should be excluded from the filters bar.\n   * This can be used to hide specific filters from the UI.\n   *\n   * Use the filter column names to specify which filters to exclude.\n   * For example, to exclude the \"geo\" filter, set `excludeFilters = ['Geo']`.\n   */\n  excludeFilters = input<string[]>([]);\n\n  /**\n   * The number of filters to display before showing the \"more filters\" button.\n   * This is used to limit the number of visible filters in the UI.\n   * The default value is set by the FILTERS_BREAKPOINT injection token.\n   */\n  filtersCount = input<number>(inject(FILTERS_BREAKPOINT));\n\n  /**\n   * Input property that determines whether the \"More Filters\" button is displayed.\n   *\n   * Accepts a boolean value or a string that can be transformed to a boolean.\n   * Uses the `booleanAttribute` transformer to ensure the value is interpreted as a boolean.\n   *\n   * @default true\n   */\n  showMoreFiltersButton = input(true, { transform: booleanAttribute });\n\n  /**\n   * When enabled, only the filters flagged with `homepage: true` in the \"filters\" custom JSON\n   * are displayed. If no filter is flagged, the bar shows no filters.\n   *\n   * Accepts a boolean value or a string that can be transformed to a boolean.\n   *\n   * @default false\n   */\n  homepage = input(false, { transform: booleanAttribute });\n  direction = input<\"horizontal\" | \"vertical\">(\"horizontal\");\n  /**\n   * The distance in pixels between the popover and its trigger element.\n   *\n   * @defaultValue 8px\n   */\n  offset = input<number>(8);\n\n  expandedLevel = input(undefined, { transform: numberAttribute })\n\n\n  /**\n   * Event emitted when the clear filters button is clicked.\n   * This event can be used to perform additional actions when filters are cleared.\n   */\n  onClearFilters = output<void>();\n\n  /**\n   * Event emitted when the clear basket button is clicked.\n   * This event can be used to perform additional actions when the basket is cleared.\n   */\n  onClearBasket = output<void>();\n\n  protected cn = cn;\n  protected readonly moreButtonRef = viewChild<MoreButtonComponent>(MoreButtonComponent);\n  protected readonly filterButtonRefs = viewChildren<FilterButtonComponent>(FilterButtonComponent);\n  protected readonly overflowManagerRef = viewChild<OverflowManagerDirective>(OverflowManagerDirective);\n\n  protected cdr = inject(ChangeDetectorRef);\n\n  protected BreakpointObserverService = inject(BreakpointObserverService);\n  protected appStore = inject(AppStore);\n  protected aggregationsStore = inject(AggregationsStore);\n  protected queryParamsStore = inject(QueryParamsStore);\n  protected el = inject(ElementRef);\n  protected readonly transloco = inject(TranslocoService);\n  protected readonly router = inject(Router);\n  protected destroyRef = inject(DestroyRef);\n\n  protected aggregationsService = inject(AggregationsService);\n\n  // number of filters that can be displayed before the \"more filters\" option is shown\n  protected visibleFiltersCount = signal(this.filtersCount());\n\n  protected hasFilters = computed(() => {\n    // when the query parameters store updates, update the hasFilters signal\n    // to show or hide the clear filters button\n    const state = getState(this.queryParamsStore);\n    return state.basket || (Array.isArray(state.filters) && state.filters.length > 0);\n  });\n\n  protected currentBasket = computed(() => {\n    const { basket } = getState(this.queryParamsStore);\n    return basket;\n  });\n\n  protected hasAggregations = computed(() => {\n    if (this.aggregationsStore.aggregations()) return this.aggregationsStore.aggregations().length > 0;\n    return false;\n  });\n\n  /**\n   * The full list of authorized filters, NOT capped by `filtersCount`.\n   *\n   * This computed signal performs the following operations:\n   * 1. Retrieves aggregations from either the component's aggregations input or the app store\n   * 2. Filters aggregations based on the route's filter criteria configuration\n   * 3. Excludes filters specified in the `excludeFilters` list\n   * 4. If `includeFilters` is not empty, only includes filters present in that list\n   * 5. Maps the filtered aggregations to objects containing only `name` and `column` properties\n   */\n  private allAuthorizedFilters = computed(() => {\n    return this.aggregationsService\n      .getAuthorizedFilters(this.aggregations(), this.includeFilters(), this.excludeFilters(), this.homepage())\n      .map((f) => ({ name: f.name, column: f.column }));\n  });\n\n  /**\n   * Computes the list of additional filters that can be displayed in the \"more filters\" popover.\n   *\n   * Derived from the FULL authorized list (not the one capped by `filtersCount`), so the\n   * filters beyond `filtersCount` — which are never rendered in the bar — are still counted.\n   * Otherwise, when every rendered filter fits in the container, this list would be empty and\n   * the \"more\" button would be hidden even though more filters exist beyond the cap.\n   *\n   * This property manages the visibility of the \"more filters\" button in the UI.\n   *\n   * @returns An array of Aggregation objects representing the additional filters available.\n   */\n  protected hasMoreFilters = computed(() => {\n    const moreFiltersAggregations = this.allAuthorizedFilters()\n      .toSpliced(0, this.visibleFiltersCount())\n      .map((f) => this.aggregationsStore.getAggregation(f.column, \"column\"));\n\n    return moreFiltersAggregations;\n  });\n\n  /**\n   * The authorized filters rendered as buttons in the bar, limited to the number\n   * specified by `filtersCount`.\n   *\n   * @returns An array of authorized filter objects, each containing `name` and `column` properties\n   */\n  authorizedFilters = computed(() => {\n    return this.allAuthorizedFilters().toSpliced(this.filtersCount());\n  });\n\n  /**\n   * Whether some authorized filters exist beyond the `filtersCount` cap.\n   *\n   * Those filters are never rendered in the bar and are only reachable through\n   * the \"more\" button, which is therefore permanently visible: the overflow\n   * manager must always reserve its space so the last filter button never\n   * overlaps it (`reserveStop`).\n   */\n  protected hasCappedFilters = computed(() => this.allAuthorizedFilters().length > this.filtersCount());\n\n  constructor() {\n    this.transloco.events$\n      .pipe(takeUntilDestroyed(this.destroyRef), debounceTime(100))\n      .subscribe(() => this.overflowManagerRef()?.countItems());\n\n    // Recount the overflow whenever the applied filters or basket change (e.g.\n    // a filter modified or removed from the \"more filters\" popover). A\n    // FilterButton hidden by the overflow manager (display: none) emits no\n    // resize notification when its natural width changes, so it could fit in\n    // the bar again without the manager knowing. afterRenderEffect guarantees\n    // the DOM already reflects the new state when we measure.\n    afterRenderEffect({\n      read: () => {\n        // track filters and basket changes (getState is reactive here)\n        const { filters, basket } = getState(this.queryParamsStore);\n        void filters;\n        void basket;\n        this.overflowManagerRef()?.countItems();\n      }\n    });\n  }\n\n  /**\n   * Clears all filters (included baskets) by invoking the clearFilters method on the queryParamsStore.\n   * This method is typically used to reset the filter state to its default values.\n   */\n  clearFilters(): void {\n    this.queryParamsStore.clearFilters();\n    this.aggregationsStore.aggregations().forEach(agg => {\n      sessionStorage.removeItem(`agg-${agg.column}`);\n    });\n    this.onClearFilters.emit();\n  }\n\n  /**\n   * Clears the basket by invoking the clearBasket method on the queryParamsStore.\n   * This method is typically used to reset the basket state to its default value.\n   */\n  clearBasket(): void {\n    this.queryParamsStore.clearBasket();\n    this.onClearBasket.emit();\n  }\n\n  /**\n   * Adjusts the count of filters that can be displayed before the \"more filters\" option is shown.\n   *\n   * This method calculates the number of filter dropdowns that can fit in the available space\n   * before the \"more filters\" button. It updates the `moreFilterCount` property with the number\n   * of filters that can be displayed. If no filters are present, it sets the `moreFilterCount`\n   * to the total number of filters.\n   *\n   */\n  protected adjustFiltersCount(count: number): void {\n    // count is the number of filter dropdowns that can fit in the available space\n    // filtersCount is the number of filters that can be displayed before the \"more filters\" option is shown\n    this.visibleFiltersCount.set(count > this.filtersCount() ? this.filtersCount() : count);\n  }\n\n  /**\n   * Handles click events on the filter bar component.\n   *\n   * triggers the `onClick` handler\n   * for each filter button's popover reference, if available.\n   *\n   * @param event - The mouse event triggered by the user's click.\n   */\n  handleClick(event: MouseEvent) {\n    this.filterButtonRefs().forEach((ref) => {\n      ref.popoverRef()?.onClick(event);\n    });\n  }\n}\n","import { inject, Injectable, signal } from '@angular/core';\n\nimport { CCWebService, fetchLabels, labels, Query } from '@sinequa/atomic';\nimport { from, map, Observable, of, switchMap } from 'rxjs';\nimport { AppStore } from '../../stores/app.store';\n\ntype LabelsWebService = CCWebService &\n  LabelsConfig & {\n    allowedWithAnySBA?: boolean;\n    labelsBulkDocLimit?: string;\n    revision?: number;\n    useDistributionRegex?: boolean;\n  };\n\nexport interface LabelsConfig {\n  allowPublicLabelsCreation?: boolean;\n  allowPublicLabelsModification?: boolean;\n  privateLabelsField?: string;\n  publicLabelsField?: string;\n  defaultPublicLabels?: string;\n  labelsAutoSuggestMaxCount?: string;\n  labelsAutoSuggestWildcard?: string;\n}\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class LabelService {\n  appStore = inject(AppStore);\n\n  hasAccess = signal<boolean | undefined>(undefined);\n\n  /**\n   * Check user rights to verify if they can access labels handling\n   * @returns if has the rights\n   */\n  async canHandleLabels(): Promise<boolean> {\n    if (this.hasAccess() !== undefined) return this.hasAccess()!;\n\n    const service = this.appStore.getWebServiceByType('labels') as LabelsWebService;\n    if (!service) return false;\n\n    try {\n      const rights = await labels.getUserRights();\n      this.hasAccess.set(rights.canEditPublicLabels || rights.canManagePublicLabels);\n      return this.hasAccess()!;\n    } catch (error) {\n      console.error('labels.canHandleLabels failure - error: ', error);\n      return false;\n    }\n  }\n\n  /**\n   * Get relevant config info from the labels web service\n   * @returns the LabelsConfig or undefined if no rights\n   */\n  getLabelsConfig(): Observable<LabelsConfig | undefined> {\n    return from(this.canHandleLabels()).pipe(\n      map((canHandle: boolean) => {\n        if (!canHandle) return undefined;\n\n        const {\n          allowPublicLabelsCreation,\n          allowPublicLabelsModification,\n          privateLabelsField,\n          publicLabelsField,\n          defaultPublicLabels,\n          labelsAutoSuggestMaxCount,\n          labelsAutoSuggestWildcard\n        } = this.appStore.getWebServiceByType('labels') as LabelsWebService;\n\n        return {\n          allowPublicLabelsCreation,\n          allowPublicLabelsModification,\n          privateLabelsField,\n          publicLabelsField,\n          defaultPublicLabels,\n          labelsAutoSuggestMaxCount,\n          labelsAutoSuggestWildcard\n        };\n      })\n    );\n  }\n\n  /**\n   * Fetch labels from string\n   * @param prefix the string prefix to filter with\n   * @param publicOnly whether they should be public or not\n   * @param locale optional locale filtering\n   * @returns list of label strings\n   */\n  fetch(prefix: string, publicOnly: boolean = true, locale?: string): Observable<string[]> {\n    return from(fetchLabels(prefix, publicOnly, locale));\n  }\n\n  /**\n   * Add some labels to many documents\n   * @param labelsToAdd list of labels to add\n   * @param ids list of document id to add the label\n   * @param publicOnly whether the operation should be public only\n   * @returns a promise that resolves when the operation is complete\n   */\n  add(labelsToAdd: string[], ids: string[], publicOnly?: boolean): Observable<void> {\n    return from(this.canHandleLabels()).pipe(\n      switchMap((canHandle: boolean) => {\n        if (!canHandle) return of(undefined);\n\n        return from(labels.add(labelsToAdd, ids, publicOnly));\n      })\n    );\n  }\n\n  /**\n   * Remove some labels from many documents\n   * @param labelsToRemove list of labels to remove\n   * @param ids list of document id to add the label\n   * @param publicOnly whether the operation should be public only\n   * @returns a promise that resolves when the operation is complete\n   */\n  remove(labelsToRemove: string[], ids: string[], publicOnly?: boolean): Observable<void> {\n    return from(this.canHandleLabels()).pipe(\n      switchMap((canHandle: boolean) => {\n        if (!canHandle) return of(undefined);\n\n        return from(labels.remove(labelsToRemove, ids, publicOnly));\n      })\n    );\n  }\n\n  /**\n   * Name some labels to a new name\n   * @param labelsToRename list of labels to rename\n   * @param newLabel the new label name\n   * @param publicOnly whether the operation should be public only\n   * @returns a promise that resolves when the operation is complete\n   */\n  rename(labelsToRename: string[], newLabel: string, publicOnly?: boolean): Observable<void> {\n    return from(this.canHandleLabels()).pipe(\n      switchMap((canHandle: boolean) => {\n        if (!canHandle) return of(undefined);\n\n        return from(labels.rename(labelsToRename, newLabel, publicOnly));\n      })\n    );\n  }\n\n  /**\n   * Delete some labels\n   * @param labelsToDelete the labels to delete\n   * @param publicOnly whether the operation should be public only\n   * @returns a promise that resolves when the operation is complete\n   */\n  delete(labelsToDelete: string[], publicOnly?: boolean): Observable<void> {\n    return from(this.canHandleLabels()).pipe(\n      switchMap((canHandle: boolean) => {\n        if (!canHandle) return of(undefined);\n\n        return from(labels.delete(labelsToDelete, publicOnly));\n      })\n    );\n  }\n\n  /**\n   * Create some labels for a query\n   * @param labelstoAdd the labels to create\n   * @param query the query object to which the labels will be added\n   * @param publicOnly whether the operation should be public only\n   * @returns a promise that resolves when the operation is complete\n   */\n  bulkAdd(labelstoAdd: string[], query: Query, publicOnly?: boolean): Observable<void> {\n    return from(this.canHandleLabels()).pipe(\n      switchMap((canHandle: boolean) => {\n        if (!canHandle) return of(undefined);\n\n        return from(labels.bulkAdd(labelstoAdd, query, publicOnly));\n      })\n    );\n  }\n\n  /**\n   * Delete some labels from a query\n   * @param labelsToRemove the labels to remove\n   * @param query the query object to which the labels will be removed\n   * @param publicOnly whether the operation should be public only\n   * @returns a promise that resolves when the operation is complete\n   */\n  bulkRemove(labelsToRemove: string[], query: Query, publicOnly?: boolean): Observable<void> {\n    return from(this.canHandleLabels()).pipe(\n      switchMap((canHandle: boolean) => {\n        if (!canHandle) return of(undefined);\n\n        return from(labels.bulkRemove(labelsToRemove, query, publicOnly));\n      })\n    );\n  }\n}\n","import { NgStyle } from \"@angular/common\";\nimport {\n  afterEveryRender,\n  Component,\n  computed,\n  effect,\n  ElementRef,\n  inject,\n  Injector,\n  input,\n  model,\n  signal,\n  viewChild\n} from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { Article as A, fetchLabels, guid, labels } from \"@sinequa/atomic\";\nimport { BadgeComponent, CircleXIcon, InputComponent, ListItemComponent } from \"@sinequa/ui\";\n\nimport { debouncedSignal, withFetch } from \"../../utils\";\n\nconst DEBOUNCE_DELAY = 300;\ntype Article = A & {\n  [key: string]: unknown;\n};\n\n@Component({\n  selector: \"multiselect-labels, multiselectlabels, MultiSelectLabels\",\n  providers: [provideTranslocoScope(\"labels\")],\n  standalone: true,\n  imports: [FormsModule, NgStyle, TranslocoPipe, InputComponent, BadgeComponent, ListItemComponent, CircleXIcon],\n  template: `\n    <div class=\"anchor\" [ngStyle]=\"{ 'anchor-name': anchor() }\">\n      <label [htmlFor]=\"id()\" class=\"font-semibold\">{{ (isPublic() ? 'labels.publicLabels' : 'labels.privateLabels') | transloco }}</label>\n      <input\n        [id]=\"id()\"\n        type=\"text\"\n        autocomplete=\"off\"\n        spellcheck=\"false\"\n        [attr.aria-label]=\"'labels.startTyping' | transloco\"\n        [attr.placeholder]=\"'labels.startTyping' | transloco\"\n        [(ngModel)]=\"labelInput\"\n        (keyup)=\"onKeyDown($event)\"\n        (click)=\"onInputClick()\" />\n\n      <ul\n        popover\n        class=\"popover mt-2 max-h-40 overflow-auto rounded-md border border-gray-300 bg-white p-1 shadow\"\n        aria-labelledby=\"dropdownDefaultButton\"\n        role=\"listbox\"\n        #LabelsPopover>\n        @for (label of suggestedLabels(); track $index) {\n          <li role=\"option\" tabindex=\"0\" aria-keyshortcuts=\"enter\" [attr.aria-label]=\"label\" (keypress.enter)=\"itemClicked(label)\" (click)=\"itemClicked(label)\">\n            <span>{{ label }}</span>\n          </li>\n        }\n      </ul>\n    </div>\n    <div class=\"my-2 flex flex-wrap gap-1\">\n      @for (label of labels(); track $index) {\n        <Badge>\n          {{ label }}\n          @if (allowModification()) {\n            <circle-x-icon class=\"ms-1 cursor-pointer\" (click)=\"removeLabel(label, isPublic())\" />\n          }\n        </Badge>\n      }\n    </div>\n    @if (hasError()) {\n      <div class=\"p-4 w-full bg-destructive/20 border-destructive\">\n        {{ 'labels.error' | transloco }}\n      </div>\n    }\n  `,\n  styles: `\n    .anchor {\n      &:has(.popover:popover-open) {\n        z-index: var(--z-menu, 1000);\n        border-radius: var(--radius) var(--radius) 0 0;\n      }\n\n      .popover::backdrop {\n        background-color: transparent;\n        backdrop-filter: none;\n      }\n    }\n\n    .popover {\n      /* Select Firefox */\n      @supports (-moz-appearance: none) {\n        margin: calc(33.3333333333vh + 30px) 25vw;\n        width: 50vw;\n      }\n\n      /* Select Safari */\n      @supports (background: -webkit-named-image(i)) {\n        margin: calc(33.3333333333vh + 30px) 25vw;\n        width: 50vw;\n      }\n\n      width: anchor-size(width);\n      top: anchor(bottom);\n      left: anchor(left);\n    }\n  `\n})\nexport class MultiSelectLabelsComponent {\n  injector = inject(Injector);\n\n  article = model<Article>();\n  isPublic = input(false);\n  allowModification = input(false);\n  labelsField = input<string | undefined>();\n\n  protected anchor = signal<string>(`--${guid()}`);\n  protected suggestedLabels = signal<string[]>([]);\n\n  protected labelInput = model<string>(\"\");\n  protected debouncedLabelInput = debouncedSignal(this.labelInput, DEBOUNCE_DELAY);\n\n  protected popover = viewChild<ElementRef>(\"LabelsPopover\");\n  protected popoverElement = computed(() => this.popover()?.nativeElement);\n\n  protected labels = signal<string[]>([]);\n  protected hasError = signal<boolean>(false);\n\n  protected id = signal(`labels-form-${guid()}`);\n\n  constructor() {\n    afterEveryRender(() => {\n      this.popoverElement().style.positionAnchor = this.anchor();\n    });\n\n    effect(() => {\n      const article = this.article();\n      const labelsField = this.labelsField();\n\n      if (!article) return;\n      if (!labelsField) return;\n\n      const labels = article[labelsField] as string[] | undefined;\n      this.labels.set(labels || []);\n    });\n\n    effect(() => {\n      this.fetchLabels(this.debouncedLabelInput(), this.isPublic());\n    });\n  }\n\n  itemClicked(label: string) {\n    this.addLabel(label, this.isPublic());\n  }\n\n  onInputClick() {\n    if (this.suggestedLabels().length === 0) return;\n    this.popoverElement().showPopover();\n  }\n\n  onKeyDown(event: KeyboardEvent) {\n    event.stopImmediatePropagation();\n\n    if (this.labelInput().length === 0) return;\n\n    if (event.key === \"Enter\") {\n      this.addLabel(this.labelInput(), this.isPublic());\n      this.labelInput.set(\"\");\n    }\n  }\n\n  async fetchLabels(text: string, isPublic: boolean) {\n    const labels = (await withFetch(() => fetchLabels(text, isPublic), this.injector)) || [];\n    const unappliedLabels = labels.filter((label) => !this.labels().some((l) => l === label));\n    this.suggestedLabels.set(unappliedLabels);\n    if (unappliedLabels.length) {\n      this.popoverElement().showPopover();\n    } else {\n      this.popoverElement().hidePopover();\n    }\n  }\n\n  /**\n   * Adds a new label to the current list of labels and updates the associated article.\n   *\n   * This method performs the following steps:\n   * 1. Updates the local labels state by appending the new label.\n   * 2. Persists the new label to the backend, associating it with the current article.\n   * 3. Refreshes the article's label data.\n   * 4. Clears the label input field and resets the suggested labels.\n   *\n   * @param label - The label to be added.\n   * @param isPublic - A boolean indicating whether the label is public or private.\n   * @returns A promise that resolves once the label has been added and the article updated.\n   */\n  async addLabel(label: string, isPublic: boolean) {\n    this.hasError.set(false);\n    const article = this.article();\n    if (!article) return;\n\n    try {\n      await labels.add([label], [article.id], isPublic);\n\n      const currentLabels = this.labels();\n      this.labels.set([...currentLabels, label]);\n\n      this.updateArticleWithLabels();\n\n      this.labelInput.set(\"\");\n      this.suggestedLabels.set([]);\n    } catch {\n      this.hasError.set(true);\n    }\n  }\n\n  /**\n   * Removes a label from the current list of labels and updates the associated article.\n   *\n   * @param label - The label to be removed.\n   * @param isPublic - A boolean indicating whether the label is public.\n   * @returns A promise that resolves once the label is removed and the article is updated.\n   */\n  async removeLabel(label: string, isPublic: boolean) {\n    this.hasError.set(false);\n    const article = this.article();\n    if (!article) return;\n\n    try {\n      await labels.remove([label], [article.id], isPublic);\n      this.labels.set(this.labels().filter((l) => l !== label));\n      this.updateArticleWithLabels();\n    } catch {\n      this.hasError.set(true);\n    }\n  }\n\n  /**\n   * Updates the article object by assigning the current labels to the specified labels field.\n   *\n   * This method retrieves the article object and the labels field dynamically,\n   * then assigns the current labels to the corresponding field in the article.\n   *\n   * @remarks\n   * Ensure that `this.article`, `this.labelsField`, and `this.labels` return valid values\n   * before invoking this method to avoid runtime errors.\n   *\n   */\n  updateArticleWithLabels() {\n    const article = this.article();\n    const labelsField = this.labelsField();\n\n    if (!article) return;\n    if (!labelsField) return;\n\n    article[labelsField] = this.labels();\n  }\n}\n","import { Component, DestroyRef, inject, model, output, signal, viewChild } from \"@angular/core\";\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\n\nimport { Article } from \"@sinequa/atomic\";\nimport {\n  ButtonComponent,\n  DialogComponent,\n  DialogContentComponent,\n  DialogEvent,\n  DialogFooterComponent,\n  DialogHeaderComponent,\n  DialogInterface,\n  DialogTitleComponent,\n  InfoCircleIcon\n} from \"@sinequa/ui\";\n\nimport { LabelService, LabelsConfig } from \"../label.service\";\nimport { MultiSelectLabelsComponent } from \"../multiselect-labels\";\n\n@Component({\n  selector: \"labels-edit-dialog, labelseditdialog, LabelsEditDialog\",\n  standalone: true,\n  imports: [\n    FormsModule,\n    TranslocoPipe,\n    ButtonComponent,\n    DialogComponent,\n    DialogHeaderComponent,\n    DialogFooterComponent,\n    DialogTitleComponent,\n    DialogContentComponent,\n    MultiSelectLabelsComponent,\n    InfoCircleIcon\n  ],\n  providers: [provideTranslocoScope(\"labels\")],\n  template: `\n    <dialog #dialog (closed)=\"close($event)\">\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>{{ 'labels.title' | transloco }}</DialogTitle>\n          <p class=\"text-muted-foreground\">\n            <info-circle-icon /><span class=\"ps-1\">{{ 'labels.info' | transloco }}</span>\n          </p>\n        </DialogHeader>\n\n          @if (!!labelsConfig()?.publicLabelsField && labelsConfig()!.allowPublicLabelsCreation) {\n            <multiselect-labels\n              [(article)]=\"article\"\n              [labelsField]=\"labelsConfig()?.publicLabelsField\"\n              [allowModification]=\"labelsConfig()?.allowPublicLabelsModification || false\"\n              [isPublic]=\"true\" />\n          }\n          @if (!!labelsConfig()?.privateLabelsField) {\n            <multiselect-labels [(article)]=\"article\" [labelsField]=\"labelsConfig()?.privateLabelsField\" [allowModification]=\"true\" [isPublic]=\"false\" />\n          }\n\n        <DialogFooter>\n          <button (click)=\"dialog.close()\">\n            {{ 'labels.close' | transloco }}\n          </button>\n        </DialogFooter>\n      </DialogContent>\n    </dialog>\n  `\n})\nexport class LabelsEditDialog implements DialogInterface {\n  readonly dialog = viewChild<DialogComponent>(DialogComponent);\n  labelService = inject(LabelService);\n\n  closed = output<{ type: DialogEvent; article: Article }>();\n\n  public readonly article = model<Article>({} as Article);\n  public readonly labelsConfig = signal<LabelsConfig | undefined>(undefined);\n\n  constructor(private destroyRef: DestroyRef) {\n    this.labelService\n      .getLabelsConfig()\n      .pipe(takeUntilDestroyed(this.destroyRef))\n      .subscribe((config) => this.labelsConfig.set(config));\n  }\n\n  open(article: Article): void {\n    this.article.set(article);\n    this.dialog()!.showModal();\n  }\n\n  close(event: DialogEvent): void {\n    this.closed.emit({ type: event, article: this.article() });\n  }\n}\n","import { Component, input, output } from '@angular/core';\nimport { RouterLink } from '@angular/router';\nimport { TranslocoPipe } from '@jsverse/transloco';\n\nimport { ButtonComponent } from '@sinequa/ui';\n\nimport { SearchesConfig } from '../../models';\n\n@Component({\n  selector: 'search-footer, searchfooter, SearchFooter',\n  imports: [TranslocoPipe, RouterLink, ButtonComponent],\n  template: ` <div class=\"flex flex-col px-2\">\n    @if (hasMore() && config().showLoadMore) {\n      @let loadMore = 'loadMore' | transloco;\n      <button variant=\"outline\" class=\"w-full\" tabindex=\"0\" [attr.title]=\"loadMore\" (click)=\"onLoadMore($event)\">\n        {{ loadMore }}\n      </button>\n    }\n    @let seeMore =  'seeMore' | transloco;\n    <button variant=\"link\" class=\"ml-auto\" [attr.title]=\"'seeMore' | transloco\" [routerLink]=\"[config().routerLink]\">\n      {{ seeMore }}\n    </button>\n  </div>`\n})\nexport class SearchFooterComponent {\n  hasMore = input.required<boolean>();\n  config = input.required<SearchesConfig>();\n  loadMore = output();\n\n  onLoadMore(event: Event): void {\n    event.stopPropagation();\n    this.loadMore.emit();\n  }\n}\n","import { Component, inject, input } from '@angular/core';\n\nimport { HorizontalDividerComponent, PopoverContentComponent } from '@sinequa/ui';\n\n@Component({\n  selector: 'search-header, searchheader, SearchHeader',\n  imports: [HorizontalDividerComponent],\n  template: `\n    @if (floating) {\n      <div class=\"p-2\">\n        <label class=\"text-xl font-bold\">{{ label() }}</label>\n        <HorizontalDivider />\n      </div>\n    }\n  `\n})\nexport class SearchHeaderComponent {\n  protected floating = inject(PopoverContentComponent, { skipSelf: true, optional: true });\n\n  label = input('');\n}\n","import { NgTemplateOutlet } from \"@angular/common\";\nimport { Component, contentChild, inject, input, output } from \"@angular/core\";\nimport { Router } from \"@angular/router\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\n\nimport { getRelativeDate } from \"@sinequa/atomic\";\nimport { BadgeComponent, ButtonComponent, cn, FilterIcon, ListItemComponent, TrashIcon } from \"@sinequa/ui\";\n\nimport { ChildMarkerDirective } from \"../../directives\";\nimport { SearchItem } from \"../../models\";\nimport { UserSettingsStore } from \"../../stores\";\n\n@Component({\n  selector: \"search-list, searchlist, SearchList\",\n  imports: [TranslocoPipe, ListItemComponent, NgTemplateOutlet, ButtonComponent, TrashIcon, BadgeComponent, FilterIcon],\n  providers: [provideTranslocoScope(\"searches\")],\n  template: `\n    @for (search of paginatedSearches(); track $index) {\n      <li\n        role=\"listitem\"\n        class=\"group h-10 *:whitespace-nowrap\"\n        tabindex=\"0\"\n        (click)=\"onClick(search)\"\n        (keydown.enter)=\"onClick(search)\"\n        [attr.aria-label]=\"search.display || search.label\">\n        @if (iconTemplate()) {\n          <ng-container *ngTemplateOutlet=\"iconTemplate()?.template\" />\n        }\n\n        <p class=\"truncate\">{{ search.display || search.label }}</p>\n\n        @let filterCount = search.filterCount || 0;\n        @if (filterCount > 0) {\n          <Badge class=\"flex items-center text-xs text-grey-500\" aria-hidden=\"true\">\n            <FilterIcon />\n            {{ 'searches.filterCount' | transloco: { count: filterCount } }}\n          </Badge>\n        }\n\n        @let date = search.date;\n        @if (date) {\n          <Badge class=\"ms-auto text-xs text-grey-500 first-letter:capitalize\">{{ getRelativeDate(transloco.getActiveLang(), date) }}</Badge>\n        }\n\n        <button\n          variant=\"ghost\"\n          [iconOnly]=\"true\"\n          class=\"text-destructive group-hover:visible\"\n          [title]=\"deleteButtonTitle() | transloco\"\n          [attr.aria-label]=\"deleteButtonTitle() | transloco\"\n          (click)=\"onDelete($index, $event)\">\n          <TrashIcon />\n        </button>\n      </li>\n    } @empty {\n      <span class=\"py-4 text-center text-neutral-500\">\n        <ng-content />\n      </span>\n    }\n  `,\n  host: {\n    class: \"flex max-h-[460px] flex-col overflow-auto\",\n    role: \"list\"\n  }\n})\nexport class SearchListComponent {\n  cn = cn;\n  getRelativeDate = getRelativeDate;\n\n  iconTemplate = contentChild(ChildMarkerDirective);\n\n  paginatedSearches = input.required<SearchItem[]>();\n  deleteButtonTitle = input<string>(\"remove\");\n  delete = output<number>();\n\n  protected readonly router = inject(Router);\n  protected readonly userSettingsStore = inject(UserSettingsStore);\n  protected readonly transloco = inject(TranslocoService);\n\n  public onClick(search: SearchItem): void {\n    const queryParams = {\n      q: search.queryParams?.text,\n      t: search.queryParams?.tab\n    } as { q: string; f?: string; t?: string };\n\n    if (search.queryParams?.filters && search.queryParams?.filters?.length > 0)\n      queryParams.f = JSON.stringify(search.queryParams?.filters);\n\n    this.router.navigate([search.queryParams?.path], { queryParams });\n  }\n\n  onDelete(index: number, e: Event): void {\n    e.stopPropagation();\n    this.delete.emit(index);\n  }\n}\n","import {\n  Component,\n  computed,\n  effect,\n  inject,\n  InjectionToken,\n  input,\n  signal\n} from \"@angular/core\";\nimport {\n  provideTranslocoScope,\n  TranslocoPipe,\n  TranslocoService\n} from \"@jsverse/transloco\";\n\nimport { getQueryParamsFromUrl, notify } from \"@sinequa/atomic\";\n\nimport { SearchesConfig, SearchItem } from \"../../models\";\nimport { UserSettingsStore } from \"../../stores\";\nimport { SearchFooterComponent } from \"../searches/search-footer\";\nimport { SearchHeaderComponent } from \"../searches/search-header\";\nimport { SearchListComponent } from \"../searches/search-list\";\nimport { HistoryIcon } from \"@sinequa/ui\";\n\nimport { ChildMarkerDirective } from \"../../directives\";\n\nexport const RECENT_SEARCHES_OPTIONS = {\n  itemsPerPage: 10,\n  showLoadMore: true,\n  routerLink: \"/recent-searches\"\n};\n\nexport const RECENT_SEARCHES_CONFIG = new InjectionToken<SearchesConfig>(\n  \"recent searches options\",\n  {\n    factory: () => RECENT_SEARCHES_OPTIONS\n  }\n);\n\n@Component({\n  selector: \"RecentSearches, recent-searches\",\n  standalone: true,\n  providers: [provideTranslocoScope(\"searches\")],\n  imports: [\n    TranslocoPipe,\n    ChildMarkerDirective,\n    SearchHeaderComponent,\n    SearchListComponent,\n    SearchFooterComponent,\n    HistoryIcon\n  ],\n  template: `\n    <SearchHeader [label]=\"'searches.recent.label' | transloco\" />\n\n    <SearchList\n      [paginatedSearches]=\"paginatedRecentSearches()\"\n      deleteButtonTitle=\"searches.recent.remove\"\n      (delete)=\"onDelete($event)\"\n      aria-label=\"recents searches\">\n      <history-icon *childMarker />\n      <!-- empty content -->\n      {{ \"searches.recent.noRecentSearches\" | transloco }}\n    </SearchList>\n\n    @if (paginatedRecentSearches().length > 0) {\n      <SearchFooter\n        [hasMore]=\"hasMore()\"\n        [config]=\"config\"\n        (loadMore)=\"loadMore()\" />\n    }\n  `,\n  styles: [\n    `\n      :host {\n        ul {\n          scrollbar-width: thin;\n        }\n      }\n    `\n  ]\n})\nexport class RecentSearchesComponent {\n  /**\n   * Represents the configuration options for recent searches.\n   * This property is initialized using the `input` function with a `RecentSearchesConfig` type.\n   */\n  options = input<SearchesConfig>();\n\n  protected config = inject(RECENT_SEARCHES_CONFIG);\n  protected readonly userSettingsStore = inject(UserSettingsStore);\n  private readonly transloco = inject(TranslocoService);\n\n  protected readonly range = signal<number>(10);\n  protected readonly recentSearches = computed<SearchItem[]>(() =>\n    (this.userSettingsStore.recentSearches() || []).reduce((acc, item) => {\n      const queryParams = getQueryParamsFromUrl(item.url);\n\n      acc.push(\n        Object.assign(item, {\n          label: queryParams?.text || \"\",\n          filterCount: queryParams?.filters?.length || 0,\n          queryParams\n        })\n      );\n\n      return acc;\n    }, [] as SearchItem[])\n  );\n  protected readonly paginatedRecentSearches = computed<SearchItem[]>(() =>\n    this.recentSearches().slice(0, this.range())\n  );\n  protected readonly hasMore = computed<boolean>(\n    () =>\n      this.recentSearches().length > 0 &&\n      this.range() < this.recentSearches().length\n  );\n\n  constructor() {\n    effect(() => {\n      if (this.options()) {\n        this.config = { ...this.config, ...this.options() };\n        this.range.set(this.config.itemsPerPage ?? 10);\n      }\n    });\n  }\n\n  /**\n   * Deletes a recent search item at the specified index.\n   * @param index - The index of the item to delete.\n   * @param e - The event object.\n   */\n  async onDelete(index: number) {\n    await this.userSettingsStore.deleteRecentSearch(index);\n    notify.success(this.transloco.translate(\"searches.recent.deleted\"), {\n      duration: 2000\n    });\n  }\n\n  loadMore() {\n    this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n  }\n}\n\n","import { Component, inject, output, signal, viewChild } from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\nimport { notify } from \"@sinequa/atomic\";\nimport {\n  ButtonComponent,\n  DialogComponent,\n  DialogContentComponent,\n  DialogFooterComponent,\n  DialogHeaderComponent,\n  DialogInterface,\n  DialogResult,\n  DialogTitleComponent,\n  InputComponent\n} from \"@sinequa/ui\";\nimport { SavedSearchesService } from \"../../services\";\nimport { QueryParamsStore } from \"../../stores\";\n\n@Component({\n  selector: \"saved-search-dialog, savedsearchdialog, SavedSearchDialog\",\n  standalone: true,\n  imports: [\n    FormsModule,\n    TranslocoPipe,\n    ButtonComponent,\n    DialogComponent,\n    DialogHeaderComponent,\n    DialogTitleComponent,\n    DialogContentComponent,\n    DialogFooterComponent,\n    InputComponent\n  ],\n  providers: [provideTranslocoScope(\"searches\")],\n  template: `\n    <dialog #dialog>\n      <DialogContent>\n        <DialogHeader>\n          <DialogTitle>{{ 'searches.saved.save' | transloco }}</DialogTitle>\n        </DialogHeader>\n\n        <input\n          type=\"text\"\n          autocomplete=\"off\"\n          spellcheck=\"false\"\n          [attr.aria-label]=\"'searches.saved.saveName' | transloco\"\n          [attr.placeholder]=\"'searches.saved.saveName' | transloco\"\n          [ngModel]=\"saveName()\"\n          (ngModelChange)=\"saveName.set($event)\" />\n\n          <DialogFooter>\n            <button variant=\"outline\" (click)=\"dialog.close()\">\n              {{ 'cancel' | transloco }}\n            </button>\n            <button (click)=\"confirm()\" [disabled]=\"!saveName()\">\n              {{ 'confirm' | transloco }}\n            </button>\n          </DialogFooter>\n        </DialogContent>\n    </dialog>\n  `\n})\nexport class SavedSearchDialog implements DialogInterface {\n  private readonly savedSearchesService = inject(SavedSearchesService);\n  protected readonly queryParamsStore = inject(QueryParamsStore);\n  private readonly transloco = inject(TranslocoService);\n  dialog = viewChild<DialogComponent>(DialogComponent);\n\n  saveName = signal<string>(\"\");\n  readonly closed = output<DialogResult>();\n\n  open(text: string): void {\n    this.saveName.set(text || \"\");\n    this.dialog()?.showModal();\n  }\n\n  async confirm(): Promise<void> {\n    this.savedSearchesService.saveSearch(this.saveName());\n    notify.success(this.transloco.translate(\"searches.saved.saved\"), { duration: 2000 });\n    // emit close output of the component\n    this.dialog()?.close(\"dialog-confirm\");\n    // emit closed event for the diaglog service\n    this.closed.emit(\"dialog-confirm\");\n  }\n}\n","import { Component, computed, effect, inject, InjectionToken, input, signal } from '@angular/core';\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from '@jsverse/transloco';\n\nimport { getQueryParamsFromUrl, notify } from '@sinequa/atomic';\n\nimport { SearchesConfig, SearchItem } from '../../models';\nimport { UserSettingsStore } from '../../stores';\nimport { SearchFooterComponent } from '../searches/search-footer';\nimport { SearchHeaderComponent } from '../searches/search-header';\nimport { SearchListComponent } from '../searches/search-list';\nimport { StarIcon } from '@sinequa/ui';\n\nimport { ChildMarkerDirective } from '../../directives';\n\nexport const SAVED_SEARCHES_OPTIONS: SearchesConfig = {\n  itemsPerPage: 10,\n  showLoadMore: true,\n  routerLink: '/saved-searches'\n};\n\nexport const SAVED_SEARCHES_CONFIG = new InjectionToken<SearchesConfig>('saved searches options', { factory: () => SAVED_SEARCHES_OPTIONS });\n\n@Component({\n  selector: 'saved-searches, SavedSearches',\n  standalone: true,\n  imports: [TranslocoPipe, ChildMarkerDirective, SearchHeaderComponent, SearchListComponent, SearchFooterComponent, StarIcon],\n  providers: [provideTranslocoScope('searches')],\n  template: `\n    <SearchHeader [label]=\"'searches.saved.label' | transloco\" />\n\n    <SearchList [paginatedSearches]=\"paginatedSearches()\" deleteButtonTitle=\"searches.saved.remove\" (delete)=\"onDelete($event)\">\n      <star-icon *childMarker [solid]=\"true\" />\n      <!-- empty content -->\n      {{ 'searches.saved.noSavedSearches' | transloco }}\n    </SearchList>\n\n    @if(paginatedSearches().length > 0) {\n      <SearchFooter [hasMore]=\"hasMore()\" [config]=\"config\" (loadMore)=\"loadMore()\" />\n    }\n  `,\n  styles: [\n    `\n      :host {\n        ul {\n          scrollbar-width: thin;\n        }\n      }\n    `\n  ]\n})\nexport class SavedSearchesComponent {\n  options = input<SearchesConfig>();\n\n  protected config = inject(SAVED_SEARCHES_CONFIG);\n  protected readonly userSettingsStore = inject(UserSettingsStore);\n  private readonly transloco = inject(TranslocoService);\n\n  protected readonly range = signal<number>(10);\n  protected readonly savedSearches = computed<SearchItem[]>(() =>\n    (this.userSettingsStore.savedSearches() || []).reduce((acc, item) => {\n      const queryParams = getQueryParamsFromUrl(item.url);\n\n      acc.push(\n        Object.assign(item, {\n          label: queryParams?.text || '',\n          filterCount: queryParams?.filters?.length || 0,\n          queryParams\n        })\n      );\n\n      return acc;\n    }, [] as SearchItem[])\n  );\n  protected readonly paginatedSearches = computed<SearchItem[]>(() => this.savedSearches().slice(0, this.range()));\n  protected readonly hasMore = computed<boolean>(() => this.savedSearches().length > 0 && this.range() < this.savedSearches().length);\n\n  constructor() {\n    effect(() => {\n      if (this.options()) {\n        this.config = { ...this.config, ...this.options() };\n        this.range.set(this.config.itemsPerPage ?? 10);\n      }\n    });\n  }\n\n  public async onDelete(index: number) {\n    await this.userSettingsStore.deleteSavedSearch(index);\n    notify.success(this.transloco.translate('searches.saved.deleted'), { duration: 2000 });\n  }\n\n  public loadMore(): void {\n    this.range.set(this.range() + (this.config.itemsPerPage ?? 10));\n  }\n}\n","import {\n  Component,\n  computed,\n  ElementRef,\n  effect,\n  inject,\n  linkedSignal,\n  model,\n  signal,\n  Type,\n  viewChild\n} from \"@angular/core\";\nimport { FormsModule } from \"@angular/forms\";\nimport { RouterModule } from \"@angular/router\";\nimport { provideTranslocoScope, TranslocoPipe, TranslocoService } from \"@jsverse/transloco\";\nimport { createUserProfile, deleteUserProfileProperty, info, patchUserProfile, globalConfig, notify } from \"@sinequa/atomic\";\nimport {\n  AvatarComponent,\n  AvatarFallbackComponent,\n  AvatarImageComponent,\n  ButtonComponent,\n  EditIcon,\n  FlagEnglishIcon,\n  FlagFrenchIcon,\n  SaveIcon,\n  TrashIcon,\n  UndoIcon,\n  UserIcon\n} from \"@sinequa/ui\";\nimport { UserProfileService } from \"../../services\";\nimport { AppStore, PrincipalStore, UserSettingsStore } from \"../../stores\";\nimport { ChangePasswordComponent } from \"../auth/views/change-password-form\";\nimport { getState } from \"@ngrx/signals\";\n\nconst SUPPORTED_LANGUAGES = [\"en\", \"fr\"] as const;\ntype SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];\n\n@Component({\n  selector: \"user-profile-form, UserProfileForm, userprofileform\",\n  standalone: true,\n  host: { class: \"flex flex-col h-full overflow-hidden\" },\n  imports: [\n    FormsModule,\n    RouterModule,\n    TranslocoPipe,\n    TrashIcon,\n    EditIcon,\n    UndoIcon,\n    SaveIcon,\n    AvatarComponent,\n    AvatarFallbackComponent,\n    UserIcon,\n    AvatarImageComponent,\n    ButtonComponent,\n    ChangePasswordComponent\n  ],\n  templateUrl: \"./user-profile-form.html\",\n  providers: [provideTranslocoScope(\"user-profile\", \"login\")]\n})\nexport class UserProfileFormComponent {\n  protected principalStore = inject(PrincipalStore);\n  protected userSettingsStore = inject(UserSettingsStore);\n  protected userProfileService = inject(UserProfileService);\n  protected appStore = inject(AppStore);\n  private readonly transloco = inject(TranslocoService);\n\n  readonly createInputElement = viewChild<ElementRef<HTMLInputElement>>(\"avatarInput\");\n\n  dataKeys = [\"fullName\", \"mail\", \"jobTitle\", \"group\", \"organisation\", \"location\", \"skills\", \"profilePhoto\"];\n  keys = computed(() => {\n    const data = this.appStore.general()?.features?.userProfile?.data;\n    return data?.length ? this.dataKeys.filter(key => data.some(k => k === key)) : this.dataKeys;\n  });\n  formKeys = computed(() => this.keys().filter(k => k !== \"profilePhoto\"));\n  allowProfilePhoto = computed(() => this.keys().some(k => k === \"profilePhoto\"));\n\n  readonly initials = computed(() => this.principalStore.initials());\n\n  username = computed(() => this.principalStore.name() || this.principalStore.email() || null);\n\n  propertyToEdit = signal<string | undefined>(undefined);\n  value = model<string | undefined>(undefined);\n\n  currentLanguage = model<string>();\n  AllLanguages: { code: SupportedLanguage; label: string; icon: Type<unknown> }[] = [\n    { code: \"en\", label: \"English\", icon: FlagEnglishIcon },\n    { code: \"fr\", label: \"Français\", icon: FlagFrenchIcon }\n  ] as const;\n\n  changingPassword = signal<boolean>(false);\n\n  customData = computed(() =>\n    (this.appStore.general()?.features?.userProfile?.customData || [])\n      .filter(key => !this.keys().some(k => k.toLowerCase() === key.toLowerCase()))\n  );\n\n  readonly allowChangePassword = computed(() => {\n    const { useCredentials } = globalConfig;\n    const { allowChangePassword = false } = this.appStore.general()?.features || {};\n    const editablePartition = this.principalStore.editablePartition?.() || false;\n    return allowChangePassword && useCredentials && editablePartition;\n  });\n\n  constructor() {\n    this.currentLanguage.set(this.transloco.getActiveLang());\n\n    effect(() => {\n      const error: any = this.userProfileResource.error();\n      if (error?.status === 404) {\n        this.createUserProfile();\n      }\n    });\n  }\n\n  protected userProfileResource = this.userProfileService.getUserProfile(this.principalStore.userId);\n  readonly userProfile = linkedSignal(() => {\n    if (this.userProfileResource.hasValue()) {\n      return this.userProfileResource.value();\n    }\n    const { userId: id, email: mail, fullName } = getState(this.principalStore);\n    if (!id || !mail || !fullName) {\n      return undefined;\n    }\n\n    return { data: { id, mail, fullName } };\n  });\n\n  async createUserProfile(): Promise<void> {\n    const { userId: id, email: mail, fullName } = getState(this.principalStore);\n    if (!id) {\n      return;\n    }\n    try {\n      const response = await createUserProfile({ data: { id, mail, fullName } });\n      if (response) {\n        info(\"Created user profile\", response);\n        this.userProfileResource.set(response);\n      }\n    } catch (err: any) {\n      notify.error(err.message);\n    }\n  }\n\n  /**\n   * On editing a value, we save its former value to set it back in case of error\n   *\n   * @param category data or customData\n   * @param propertyName property name\n   */\n  onEdit(category: \"data\" | \"customData\", propertyName: string): void {\n    const data = this.userProfile()?.[category];\n    const value = (data as any)?.[propertyName];\n    this.value.set(value?.trim() || \"\");\n    this.propertyToEdit.set(`${category}.${propertyName}`);\n  }\n\n  /**\n   * On data property deletion, for now we make the property an empty string\n   *\n   * @param category data or customData\n   * @param propertyName property name\n   */\n  async onDeleteData(category: \"data\" | \"customData\", propertyName: string) {\n    try {\n      const response = await deleteUserProfileProperty(this.userProfile()!, category, propertyName);\n      if (response) {\n        info(\"Deleted user profile property\", response);\n        const userProfile = JSON.parse(JSON.stringify(this.userProfile()));\n        userProfile[category][propertyName] = undefined;\n        this.userProfileResource.set(userProfile);\n      } else {\n        info(\"Could not delete user profile property\", response);\n      }\n    } catch (err: any) {\n      notify.error(err.message);\n    }\n  }\n\n  /**\n   * Saving a data property\n   *\n   * @param category data or customData\n   * @param propertyName property name\n   */\n  async onSaveData(category: \"data\" | \"customData\", propertyName: string): Promise<void> {\n    // cloning the user profile to avoid changing the signal value before confirming the update\n    const userProfile = JSON.parse(JSON.stringify(this.userProfile()));\n    if (!userProfile[category]) userProfile[category] = {};\n    userProfile[category][propertyName] = this.value()?.trim() || \"\";\n    try {\n      const response = await patchUserProfile(userProfile, category, propertyName);\n      if (response) {\n        const newUserProfile = this.userProfile();\n        this.userProfileResource.set({\n          ...newUserProfile,\n          ...response,\n          data: { ...(newUserProfile?.data || {}), ...(response.data || {}) },\n          customData: { ...(newUserProfile?.customData || {}), ...(response.customData || {}) }\n        });\n      }\n      this.value.set(undefined);\n      this.propertyToEdit.set(undefined);\n    } catch (err: any) {\n      notify.error(err.message);\n    }\n  }\n\n  /**\n   * Get the value of a data key\n   *\n   * @param category data or customData\n   * @param key property key\n   * @returns the value\n   */\n  getDataValue(category: \"data\" | \"customData\", key: string): string | undefined {\n    const data = this.userProfile()?.[category];\n    const value = (data as any)?.[key];\n    return value;\n  }\n\n  /**\n   * TODO: how do we save the picture?\n   *\n   * @param event\n   */\n  uploadAvatar(event: Event): void {\n    const element = event.currentTarget as HTMLInputElement;\n    if (!element.files || !element.files.length) return;\n\n    const file = element.files[0];\n    const reader = new FileReader();\n    reader.readAsDataURL(file);\n    reader.onload = () => {\n      this.value.set(reader.result as string);\n      this.onSaveData(\"data\", \"profilePhoto\");\n    };\n  }\n\n  /**\n   * Change the app language\n   */\n  changeLanguage(): void {\n    const language = this.currentLanguage();\n    if (!language) return;\n\n    this.userSettingsStore.updateLanguage(language);\n\n    if (this.transloco.getActiveLang() !== language) {\n      this.transloco.setActiveLang(language);\n    }\n  }\n}\n","@if (userProfileResource.hasValue()) {\r\n  @let profile = userProfile();\r\n  <div class=\"flex min-h-0 flex-1 flex-col gap-2 p-4\">\r\n    <div class=\"mb-4 flex\">\r\n      @if (allowProfilePhoto()) {\r\n        <!-- AVATAR -->\r\n        <Avatar class=\"size-14 cursor-pointer\" (click)=\"avatarInput.click()\">\r\n          @if (profile?.data?.profilePhoto) {\r\n            <AvatarImage\r\n              [src]=\"profile?.data?.profilePhoto!\"\r\n              width=\"44\"\r\n              height=\"44\"\r\n              alt=\"avatar\" />\r\n          }\r\n          <AvatarFallback class=\"text-lg\">\r\n            @if (initials()) {\r\n              <span>{{ initials() }}</span>\r\n            } @else {\r\n              <UserIcon class=\"size-7\" />\r\n            }\r\n          </AvatarFallback>\r\n        </Avatar>\r\n        @if (profile?.data?.profilePhoto) {\r\n          <button\r\n            variant=\"ghost\"\r\n            [iconOnly]=\"true\"\r\n            class=\"text-destructive cursor-pointer\"\r\n            title=\"{{ 'userProfile.deleteProperty' | transloco }}\"\r\n            [attr.aria-label]=\"'userProfile.deleteProperty' | transloco\"\r\n            (click)=\"onDeleteData('data', 'profilePhoto')\">\r\n            <TrashIcon />\r\n          </button>\r\n        }\r\n      }\r\n      <div class=\"grow\"></div>\r\n      <div class=\"flex flex-col gap-4\">\r\n        <!-- LANGUAGE -->\r\n        <select\r\n          class=\"hover:outline-primary focus:outline-primary border-foreground/10 bg-background hover:bg-muted focus:bg-muted h-8 rounded-md border px-2 hover:outline focus:outline\"\r\n          [(ngModel)]=\"currentLanguage\"\r\n          (change)=\"changeLanguage()\">\r\n          @for (lang of AllLanguages; track lang.code) {\r\n            <option [value]=\"lang.code\">\r\n              {{ lang.label }}\r\n            </option>\r\n          }\r\n        </select>\r\n        <!-- CHANGE PASSWORD -->\r\n        @if (allowChangePassword()) {\r\n          <button\r\n            [disabled]=\"changingPassword()\"\r\n            (click)=\"changingPassword.set(true)\">\r\n            {{ \"login.changePassword\" | transloco }}\r\n          </button>\r\n        }\r\n      </div>\r\n    </div>\r\n    @if (changingPassword()) {\r\n      <ChangePassword\r\n        [username]=\"username()\"\r\n        [redirectAfterSuccess]=\"false\"\r\n        [redirectAfterCancel]=\"false\"\r\n        (cancel)=\"changingPassword.set(false)\"\r\n        (success)=\"changingPassword.set(false)\" />\r\n    } @else {\r\n      <div class=\"min-h-0 flex-1 overflow-auto\">\r\n        <div>\r\n          @for (key of formKeys(); track key) {\r\n            <div>\r\n              <p>{{ `userProfile.data.${key}` | transloco }}</p>\r\n              <div class=\"group flex flex-row\">\r\n                <div\r\n                  class=\"grow whitespace-pre-line\"\r\n                  [class.text-muted-foreground]=\"!getDataValue('data', key)\">\r\n                  @if (propertyToEdit() === \"data.\" + key) {\r\n                    <textarea\r\n                      class=\"hover:outline-primary focus:outline-primary border-foreground/20 hover:bg-muted focus:bg-muted mt-2 w-full rounded-md border px-2 pt-1 hover:outline focus:outline\"\r\n                      id=\"user-profile-{{ key }}\"\r\n                      [(ngModel)]=\"value\"></textarea>\r\n                  } @else {\r\n                    {{\r\n                      getDataValue(\"data\", key) ||\r\n                        (\"userProfile.notDefined\" | transloco)\r\n                    }}\r\n                  }\r\n                </div>\r\n                @if (propertyToEdit() === \"data.\" + key) {\r\n                  <button\r\n                    variant=\"ghost\"\r\n                    [iconOnly]=\"true\"\r\n                    class=\"visible mx-2 cursor-pointer sm:invisible sm:group-hover:visible\"\r\n                    title=\"{{ 'userProfile.editProperty' | transloco }}\"\r\n                    [attr.aria-label]=\"'userProfile.editProperty' | transloco\"\r\n                    (click)=\"onSaveData('data', key)\">\r\n                    <save-icon class=\"ml-2\" />\r\n                  </button>\r\n                  <button\r\n                    variant=\"ghost\"\r\n                    [iconOnly]=\"true\"\r\n                    class=\"visible cursor-pointer sm:invisible sm:group-hover:visible\"\r\n                    title=\"{{ 'userProfile.editProperty' | transloco }}\"\r\n                    [attr.aria-label]=\"'userProfile.editProperty' | transloco\"\r\n                    (click)=\"propertyToEdit.set(undefined)\">\r\n                    <UndoIcon />\r\n                  </button>\r\n                } @else {\r\n                  <button\r\n                    variant=\"ghost\"\r\n                    [iconOnly]=\"true\"\r\n                    class=\"visible mx-2 cursor-pointer sm:invisible sm:group-hover:visible\"\r\n                    title=\"{{ 'userProfile.editProperty' | transloco }}\"\r\n                    [attr.aria-label]=\"'userProfile.editProperty' | transloco\"\r\n                    (click)=\"onEdit('data', key)\">\r\n                    <EditIcon />\r\n                  </button>\r\n                  <button\r\n                    variant=\"ghost\"\r\n                    [iconOnly]=\"true\"\r\n                    class=\"text-destructive visible cursor-pointer sm:invisible sm:group-hover:visible\"\r\n                    title=\"{{ 'userProfile.deleteProperty' | transloco }}\"\r\n                    [attr.aria-label]=\"'userProfile.deleteProperty' | transloco\"\r\n                    (click)=\"onDeleteData('data', key)\">\r\n                    <TrashIcon />\r\n                  </button>\r\n                }\r\n              </div>\r\n            </div>\r\n          }\r\n          @for (key of customData(); track key) {\r\n            <div>\r\n              <p>{{ key }}</p>\r\n              <div class=\"group flex flex-row\">\r\n                <div\r\n                  class=\"grow whitespace-pre-line\"\r\n                  [class.text-muted-foreground]=\"\r\n                    !getDataValue('customData', key)\r\n                  \">\r\n                  @if (propertyToEdit() === \"customData.\" + key) {\r\n                    <textarea\r\n                      class=\"hover:outline-primary focus:outline-primary border-foreground/20 hover:bg-muted focus:bg-muted mt-2 w-full rounded-md border px-2 pt-1 hover:outline focus:outline\"\r\n                      id=\"user-profile-{{ key }}\"\r\n                      [(ngModel)]=\"value\"></textarea>\r\n                  } @else {\r\n                    {{\r\n                      getDataValue(\"customData\", key) ||\r\n                        (\"userProfile.notDefined\" | transloco)\r\n                    }}\r\n                  }\r\n                </div>\r\n                @if (propertyToEdit() === \"customData.\" + key) {\r\n                  <button\r\n                    variant=\"ghost\"\r\n                    [iconOnly]=\"true\"\r\n                    class=\"visible mx-2 cursor-pointer sm:invisible sm:group-hover:visible\"\r\n                    title=\"{{ 'userProfile.editProperty' | transloco }}\"\r\n                    [attr.aria-label]=\"'userProfile.editProperty' | transloco\"\r\n                    (click)=\"onSaveData('customData', key)\">\r\n                    <save-icon class=\"ml-2\" />\r\n                  </button>\r\n                  <button\r\n                    variant=\"ghost\"\r\n                    [iconOnly]=\"true\"\r\n                    class=\"visible cursor-pointer sm:invisible sm:group-hover:visible\"\r\n                    title=\"{{ 'userProfile.editProperty' | transloco }}\"\r\n                    [attr.aria-label]=\"'userProfile.editProperty' | transloco\"\r\n                    (click)=\"propertyToEdit.set(undefined)\">\r\n                    <UndoIcon />\r\n                  </button>\r\n                } @else {\r\n                  <button\r\n                    variant=\"ghost\"\r\n                    [iconOnly]=\"true\"\r\n                    class=\"visible mx-2 cursor-pointer sm:invisible sm:group-hover:visible\"\r\n                    title=\"{{ 'userProfile.editProperty' | transloco }}\"\r\n                    [attr.aria-label]=\"'userProfile.editProperty' | transloco\"\r\n                    (click)=\"onEdit('customData', key)\">\r\n                    <EditIcon />\r\n                  </button>\r\n                  <button\r\n                    variant=\"ghost\"\r\n                    [iconOnly]=\"true\"\r\n                    class=\"text-destructive visible cursor-pointer sm:invisible sm:group-hover:visible\"\r\n                    title=\"{{ 'userProfile.deleteProperty' | transloco }}\"\r\n                    [attr.aria-label]=\"'userProfile.deleteProperty' | transloco\"\r\n                    (click)=\"onDeleteData('customData', key)\">\r\n                    <TrashIcon />\r\n                  </button>\r\n                }\r\n              </div>\r\n            </div>\r\n          }\r\n        </div>\r\n      </div>\r\n    }\r\n  </div>\r\n} @else if (userProfileResource.isLoading()) {\r\n  <span>Loading...</span>\r\n} @else if (userProfileResource.error()) {\r\n  <p>Please contact an administrator to create your user profile.</p>\r\n}\r\n\r\n<!-- AVATAR UPLOAD -->\r\n<input\r\n  #avatarInput\r\n  class=\"hidden\"\r\n  type=\"file\"\r\n  accept=\"image/*\"\r\n  (change)=\"uploadAvatar($event)\" />\r\n","import { Component, signal, viewChild } from \"@angular/core\";\nimport { provideTranslocoScope, TranslocoPipe } from \"@jsverse/transloco\";\nimport {\n  DialogComponent,\n  DialogContentComponent,\n  DialogHeaderComponent,\n  DialogInterface,\n  DialogTitleComponent\n} from \"@sinequa/ui\";\nimport { UserProfileFormComponent } from \"./user-profile-form\";\n\n@Component({\n  selector: \"user-profile-dialog, userprofiledialog, UserProfileDialog\",\n  standalone: true,\n  imports: [\n    DialogComponent,\n    DialogHeaderComponent,\n    DialogContentComponent,\n    UserProfileFormComponent,\n    DialogTitleComponent,\n    TranslocoPipe\n  ],\n  providers: [provideTranslocoScope(\"user-profile\")],\n  template: `\n    <div dialog #dialog=\"dialog\">\n      <DialogContent class=\"flex flex-col max-h-11/12 overflow-hidden\">\n        <DialogHeader>\n          <DialogTitle>{{ 'userProfile.title' | transloco }}</DialogTitle>\n        </DialogHeader>\n\n        @if (opened()) {\n          <user-profile-form class=\"flex flex-1 flex-col min-h-0\" />\n        }\n      </DialogContent>\n    </div>\n  `\n})\nexport class UserProfileDialog implements DialogInterface {\n  dialog = viewChild<DialogComponent>(DialogComponent);\n\n  opened = signal<boolean>(false);\n\n  open(): void {\n    this.dialog()?.open();\n    this.opened.set(true);\n  }\n}\n","import { HttpHandlerFn, HttpInterceptorFn, HttpParams, HttpRequest } from \"@angular/common/http\";\nimport { addAuditAdditionalInfo, isJsonable } from \"@sinequa/atomic\";\n\n/**\n * Intercepts HTTP requests to add audit information if the request URL includes the API path.\n *\n * This interceptor checks if the request URL contains the specified API path from the global configuration.\n * If the request body is JSON serializable and not an instance of `HttpParams`, it adds additional audit information\n * to the request body using the `addAuditAdditionalInfo` function.\n *\n * @param request - The HTTP request to be intercepted.\n * @param next - The next handler in the HTTP request chain.\n * @returns The next handler in the HTTP request chain, potentially with modified request body.\n */\nexport const auditInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n  if (!request.url.includes(\"api/v1\")) return next(request);\n\n  if (isJsonable(request.body) && !(request.body instanceof HttpParams)) {\n    // beware addAuditAdditionalInfo use a reference to the original object\n    addAuditAdditionalInfo(request.body);\n  }\n  return next(request);\n};\n","import { HttpHandlerFn, HttpInterceptorFn, HttpRequest, HttpResponse } from \"@angular/common/http\";\nimport { getToken, globalConfig, setToken } from \"@sinequa/atomic\";\nimport { map } from \"rxjs\";\n\n// TODO: Replace with your locale name\n// const LOCALE_NAME = \"fr\";\n\n/**\n * Intercepts HTTP requests to add authentication headers and handle CSRF tokens.\n *\n * This interceptor checks if the user is logged in and adds necessary headers\n * to the request, including a CSRF token. If user override is active, it sets\n * the override user and domain headers instead. It also updates the CSRF token\n * from the response headers if present.\n *\n * @param request - The outgoing HTTP request.\n * @param next - The next handler in the HTTP request pipeline.\n * @returns An observable of the HTTP event stream.\n */\nexport const authInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n  const { userOverride, userOverrideActive, bearerToken } = globalConfig;\n\n  // add auth header with jwt if user is logged in and request is to the api url\n  const csrfToken = getToken();\n\n  let headers: Record<string, string> = {\n    \"Sinequa-Force-Camel-Case\": \"true\",\n    accept: \"application/json\",\n    \"Sinequa-csrf-token\": `${csrfToken}`\n    // \"x-language\": LOCALE_NAME\n  };\n\n  if (bearerToken) {\n    headers = { ...headers, Authorization: `Bearer ${bearerToken}` };\n  }\n\n  if (userOverride && userOverrideActive) {\n    headers = {\n      ...headers,\n      \"sinequa-override-user\": userOverride.username,\n      \"sinequa-override-domain\": userOverride.domain\n    };\n  }\n\n  request = request.clone({\n    // Send the session cookie on every request. Aligns the Angular HttpClient path with atomic's\n    // raw fetch (which uses `credentials: \"include\"`), so cookie-based sessions (e.g. an OIDC reverse\n    // proxy setting an HttpOnly session cookie, no token in headers) authenticate cross-origin too.\n    // No-op for same-origin requests, where cookies are already sent.\n    withCredentials: true,\n    setHeaders: headers\n  });\n\n  return next(request).pipe(\n    map((event) => {\n      if (event instanceof HttpResponse) {\n        const csrfToken = event.headers.get(\"sinequa-csrf-token\");\n        if (csrfToken) {\n          setToken(csrfToken);\n        }\n      }\n      return event; // Add this line to fix the return type\n    })\n  );\n};\n","import { HttpHandlerFn, HttpRequest } from '@angular/common/http';\n\n/**\n * Interceptor function that modifies the request body by appending a \"locale\" parameter with the value \"fr\".\n * If the request body is of type FormData, the \"locale\" parameter is appended directly.\n * If the request body is an object, a new object is created with the \"locale\" parameter added.\n *\n * @param request - The HTTP request object.\n * @param next - The HTTP handler function.\n * @returns The modified request object.\n */\nexport const bodyInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n  const LOCALE_NAME = 'fr';\n\n  if (request.body instanceof FormData) {\n    request.body.append('ui-language', LOCALE_NAME);\n    request = request.clone();\n  } else {\n    const body = { ...(request.body as object), 'ui-language': LOCALE_NAME };\n    request = request.clone({\n      body\n    });\n  }\n  return next(request);\n};\n","import { HttpContextToken, HttpHandlerFn, HttpHeaders, HttpInterceptorFn, HttpRequest } from \"@angular/common/http\";\nimport { Injector, inject, runInInjectionContext } from \"@angular/core\";\nimport { createHeaders, error } from \"@sinequa/atomic\";\nimport { from, throwError } from \"rxjs\";\nimport { catchError, switchMap } from \"rxjs/operators\";\nimport { signIn } from \"../utils\";\n\n/**\n * Marks a request that has already been retried once after a re-authentication attempt.\n * Carried on the request's HttpContext (not sent to the server) so a second 401 on the retry\n * propagates instead of triggering another sign-in — which would loop forever.\n */\nconst AUTH_RETRIED = new HttpContextToken<boolean>(() => false);\n\n/**\n * Interceptor function that handles HTTP 401 errors by refreshing authentication and retrying the\n * original request once. For 403 errors, the error is propagated as a permanent auth failure.\n *\n * The retry happens ONLY when `signIn()` reports the user is authenticated, and AT MOST once per\n * request. Without these two guards a persistent 401 (credentials required, or an endpoint that\n * keeps rejecting even after a successful CSRF handshake) would retry endlessly.\n *\n * @param request - The HTTP request object.\n * @param next - The HTTP handler function.\n * @returns The response observable or error observable.\n */\nexport const errorInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n  const injector = inject(Injector);\n\n  if (request.url.includes(\"api/v1/audit.notify\")) {\n    return next(request);\n  }\n\n  return next(request).pipe(\n    catchError((err) => {\n      if (err.status === 401) {\n        // Already retried once after a re-auth — give up to avoid an infinite loop.\n        if (request.context.get(AUTH_RETRIED)) {\n          error(\"ErrorInterceptor: 401 again after re-auth retry, giving up\");\n          return throwError(() => err);\n        }\n\n        error(\"ErrorInterceptor: 401 detected, attempting to refresh auth\");\n        return runInInjectionContext(injector, () =>\n          from(signIn()).pipe(\n            switchMap((authenticated) => {\n              // signIn() could not authenticate (e.g. credentials required → redirected to login,\n              // or a provider redirect is in progress). Do NOT retry — propagate the 401 instead,\n              // otherwise every subsequent 401 re-triggers sign-in and loops.\n              if (!authenticated) {\n                error(\"ErrorInterceptor: re-auth did not authenticate, not retrying\");\n                return throwError(() => err);\n              }\n\n              error(\"Auth refreshed, retrying original request once\");\n              const headers = new HttpHeaders(createHeaders());\n              return next(\n                request.clone({ headers, context: request.context.set(AUTH_RETRIED, true) })\n              );\n            }),\n            catchError((signInErr) => {\n              error(\"Failed to refresh auth, redirecting to login\", signInErr);\n              return throwError(() => signInErr);\n            })\n          )\n        );\n      }\n\n      if (err.status === 403) {\n        error(\"ErrorInterceptor: 403 error, user forbidden\");\n        // Handle 403 as a permanent auth failure\n        return throwError(() => err);\n      }\n\n      return throwError(() => err);\n    })\n  );\n};\n","import { HttpContextToken, HttpHandlerFn, HttpInterceptorFn, HttpRequest } from \"@angular/common/http\";\nimport { globalConfig, notify } from \"@sinequa/atomic\";\nimport { throwError } from \"rxjs\";\nimport { catchError } from \"rxjs/operators\";\n\nconst SHOW_ERROR_TOKEN = new HttpContextToken<boolean>(() => true);\n\n/**\n * Intercepts HTTP requests and handles errors by displaying toast notifications.\n *\n * This interceptor checks if the request URL includes 'api/v1/audit.notify'. If it does,\n * the request is passed through without any modifications. For other requests, it catches\n * errors and displays a toast notification for specific HTTP status codes (400, 403, 500, 503).\n *\n * @param request - The outgoing HTTP request.\n * @param next - The next handler in the HTTP request pipeline.\n * @returns An observable that either passes the request through or handles errors with toast notifications.\n */\nexport const toastInterceptorFn: HttpInterceptorFn = (request: HttpRequest<unknown>, next: HttpHandlerFn) => {\n  if (request.url.includes(\"api/v1/audit.notify\")) {\n    return next(request);\n  }\n\n  return next(request).pipe(\n    catchError((err) => {\n      const { status, statusText, error, url } = err;\n\n      if (status === 401 && globalConfig.userOverrideActive && error?.errorCode == 6) {\n        if (request.context.get(SHOW_ERROR_TOKEN)) {\n          const errorMsg = error?.errorMessage || 'The account may be deactivated or inaccessible';\n          notify.error(\n            `Cannot override user: Unauthorized access`,\n            {\n              description: errorMsg,\n              closeButton: true,\n              duration: 5000\n            }\n          );\n\n          request.context.set(SHOW_ERROR_TOKEN, false);\n\n          return throwError(() => err);\n        }\n      }\n\n      if ([400, 403, 500, 503].includes(status)) {\n        if (status === 400 && url.includes(\"api/v2/user-profile\")) {\n          return next(request);\n        }\n        // Avoid showing error toasts for preview requests\n        if (url.includes(\"api/v1/preview\") === false) {\n          const { errorMessage = err.statusText, errorCodeText = `Error ${status}` } = error;\n          notify.error(statusText, {\n            description: `${errorCodeText}: ${errorMessage}`,\n            closeButton: true,\n            duration: 5000\n          });\n        }\n      }\n      return throwError(() => err);\n    })\n  );\n};\n","// export * from \"./audit.interceptor\";\nexport * from './audit.interceptor';\nexport * from './auth.interceptor';\nexport * from './body.interceptor';\nexport * from './error.interceptor';\nexport * from './toast.interceptor';\n","import { inject } from '@angular/core';\nimport { ResolveFn } from '@angular/router';\n\nimport { AppStore } from '../stores/app.store';\n\n/**\n * Resolves the name of the default query from the application store.\n *\n * @returns The name of the default query or an empty string if not available.\n */\nexport const queryNameResolver: ResolveFn<string> = () => {\n  const appStore = inject(AppStore);\n  return appStore.getDefaultQuery()?.name || '';\n};\n","/*\n * Public API Surface of atomic\n */\nexport * from \"./components\";\nexport * from \"./directives\";\nexport * from \"./features/advanced-filters/advanced-filters\";\n/* deprecated */\nexport * from \"./features/filters/aggregation/date/date.component\";\n/* advanced search */\nexport * from \"./features/advanced-search/advanced-search\";\nexport * from \"./features/advanced-search/panels/article-entities\";\nexport * from \"./features/advanced-search/panels/article-extracts\";\nexport * from \"./features/advanced-search/panels/article-labels\";\nexport * from \"./features/advanced-search/panels/article-similar-documents\";\n/* alerts and auth */\nexport * from \"./features/alerts/alerts\";\nexport * from \"./features/alerts/dialogs/alert.dialog\";\nexport * from \"./features/auth/auth-page\";\nexport * from \"./features/auth/views/change-password-form\";\nexport * from \"./features/auth/views/sign-in-form\";\nexport * from \"./features/auth/views/signed-out\";\nexport * from \"./features/bookmarks/bookmark-button\";\nexport * from \"./features/bookmarks/bookmarks\";\nexport * from \"./features/collections/collections\";\nexport * from \"./features/collections/dialogs/add.dialog\";\nexport * from \"./features/collections/dialogs/delete.dialog\";\nexport * from \"./features/dialogs/feature-flags.dialog\";\nexport * from \"./features/dialogs/override-user.dialog\";\nexport * from \"./features/dialogs/reset-user-settings.dialog\";\nexport * from \"./features/did-you-mean/did-you-mean\";\n/* drawer components */\nexport * from \"./features/drawer/advanced-filters/advanced-filters.component\";\nexport * from \"./features/drawer/advanced-search/advanced-search.component\";\nexport * from \"./features/drawer/drawer.component\";\nexport * from \"./features/drawer/drawer.service\";\nexport * from \"./features/drawer/navbar/drawer-navbar.component\";\nexport * from \"./features/drawer/preview/drawer-preview.component\";\nexport * from \"./features/drawer-stack/drawer-stack.component\";\nexport * from \"./features/drawer-stack/drawer-stack.service\";\nexport * from \"./features/export/dialogs/export.dialog\";\nexport * from \"./features/export/export.service\";\nexport * from \"./features/feedback/dialogs/feedback.dialog\";\nexport * from \"./features/feedback/feedback\";\n/* aggregations and filters */\nexport * from \"./features/filters/aggregation/aggregation\";\nexport * from \"./features/filters/aggregation/date/aggregation-date-range-dialog\";\nexport * from \"./features/filters/aggregation/date/aggregation-date\";\nexport * from \"./features/filters/aggregation/tree/aggregation-tree\";\nexport * from \"./features/filters/aggregation/list/aggregation-list\";\nexport * from \"./features/filters/aggregation/panel/aggregation-panel\";\nexport * from \"./features/filters/aside-filters.component\";\nexport * from \"./features/filters/buttons/filter-button.component\";\nexport * from \"./features/filters/filters-bar.component\";\nexport * from \"./features/filters/more/more.component\";\nexport * from \"./features/filters/more/more-button.component\";\n/* aggregation injection tokens */\nexport * from \"./features/filters/tokens/filter-date-allow-custom-range.token\";\nexport * from \"./features/filters/tokens/filters-breakpoint.token\";\n/* aggregation types */\nexport * from \"./features/filters/types/CFilterEx.type\";\nexport * from \"./features/filters/types/AggregationTitle.type\";\n/* labels */\nexport * from \"./features/labels/dialogs/edit.dialog\";\nexport * from \"./features/labels/label.service\";\nexport * from \"./features/labels/multiselect-labels\";\n/* features */\nexport * from \"./features/recent-searches/recent-searches\";\nexport * from \"./features/saved-searches/saved-search.dialog\";\nexport * from \"./features/saved-searches/saved-searches\";\nexport * from \"./features/user-profile/user-profile.dialog\";\nexport * from \"./features/user-profile/user-profile-form\";\nexport * from \"./guards\";\nexport * from \"./interceptors\";\nexport * from \"./models\";\nexport * from \"./pipes\";\n/* providers */\nexport * from \"./providers/bootstrap-app\";\nexport * from \"./resolvers\";\nexport * from \"./resources\";\nexport * from \"./services\";\nexport * from \"./stores\";\nexport * from \"./tokens\";\nexport * from \"./utils\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["searchRoute","i1","catchError","switchMap"],"mappings":"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"}