{"version":3,"file":"sinequa-components-saved-queries.mjs","sources":["../../../projects/components/saved-queries/saved-queries.service.ts","../../../projects/components/saved-queries/recent-queries.service.ts","../../../projects/components/saved-queries/recent-documents.service.ts","../../../projects/components/saved-queries/bootstrap/edit-saved-query/edit-saved-query.ts","../../../projects/components/saved-queries/bootstrap/edit-saved-query/edit-saved-query.html","../../../projects/components/saved-queries/bootstrap/export-query/export-query.ts","../../../projects/components/saved-queries/bootstrap/export-query/export-query.html","../../../projects/components/saved-queries/bootstrap/manage-saved-queries/manage-saved-queries.ts","../../../projects/components/saved-queries/bootstrap/manage-saved-queries/manage-saved-queries.html","../../../projects/components/saved-queries/bootstrap/query-exporter/query-exporter.ts","../../../projects/components/saved-queries/bootstrap/query-exporter/query-exporter.html","../../../projects/components/saved-queries/bootstrap/saved-queries-menu/saved-queries-menu.component.ts","../../../projects/components/saved-queries/bootstrap/saved-queries-menu/saved-queries-menu.component.html","../../../projects/components/saved-queries/bootstrap/facet-saved-queries/facet-saved-queries.ts","../../../projects/components/saved-queries/bootstrap/facet-saved-queries/facet-saved-queries.html","../../../projects/components/saved-queries/bootstrap/facet-recent-queries/facet-recent-queries.ts","../../../projects/components/saved-queries/bootstrap/facet-recent-queries/facet-recent-queries.html","../../../projects/components/saved-queries/bootstrap/facet-recent-documents/facet-recent-documents.ts","../../../projects/components/saved-queries/bootstrap/facet-recent-documents/facet-recent-documents.html","../../../projects/components/saved-queries/bootstrap/saved-queries.module.ts","../../../projects/components/saved-queries/messages/en.ts","../../../projects/components/saved-queries/messages/fr.ts","../../../projects/components/saved-queries/messages/de.ts","../../../projects/components/saved-queries/messages/index.ts","../../../projects/components/saved-queries/sinequa-components-saved-queries.ts"],"sourcesContent":["import {Injectable, InjectionToken, Inject, Type, OnDestroy} from \"@angular/core\";\nimport { HttpResponse } from '@angular/common/http';\nimport {Subject, Observable, throwError} from \"rxjs\";\nimport {UserSettingsWebService, QueryExportWebService, ExportSourceType, ExportOutputFormat,\n    DownloadWebService, AuditEvents, AuditEvent} from \"@sinequa/core/web-services\";\nimport {ModalService, ModalResult} from \"@sinequa/core/modal\";\nimport {AppService, Query} from \"@sinequa/core/app-utils\";\nimport {Utils} from \"@sinequa/core/base\";\nimport {SelectionService} from \"@sinequa/components/selection\";\nimport {SearchService} from \"@sinequa/components/search\";\nimport {Action} from '@sinequa/components/action';\n\n\nexport interface SavedQuery {\n    name: string;\n    description?: string;\n    query: Query;\n}\n\n// from core/models/audit\nexport const enum SavedQueryEventType {\n    Loaded = \"SavedQuery_Loaded\",\n    Patched = \"SavedQuery_Patched\",\n\n    Add = \"SavedQuery_Add\",\n    Delete = \"SavedQuery_Delete\",\n    DeleteAll = \"SavedQuery_DeleteAll\",\n    Rename = \"SavedQuery_Rename\",\n    Update = \"SavedQuery_Update\",\n\n    Search = \"Search_SavedQuery\"\n}\n\n// Types of events triggering a change event\nexport const SAVED_QUERIES_CHANGE_EVENTS = [\n    SavedQueryEventType.Add,\n    SavedQueryEventType.Delete,\n    SavedQueryEventType.DeleteAll,\n    SavedQueryEventType.Rename,\n    SavedQueryEventType.Update\n];\n\n\n// CRUD Events\nexport interface SavedQueryChangeEvent {\n    type: SavedQueryEventType;\n    savedquery?: SavedQuery;\n}\n\n\n// Model expected by the ManageSavedQueries Modal.\nexport interface ManageSavedQueriesModel {\n    savedQueries: SavedQuery[];\n    auditEvents?: AuditEvent[];\n}\n\n// Data model of the Export dialog.\nexport interface ExportQueryModel {\n    format: ExportOutputFormat;\n    export: ExportSourceType;\n    webService: string;\n    maxCount?: number;\n    queryName?: string;\n    exportedColumns?: string[];\n    filename?: string;\n}\n\n/**\n * The modal types are unknown to this service.\n * The module using this service must provide these components\n * in their forRoot() method\n *\n * Example below:\n *\n *     public static forRoot(): ModuleWithProviders<SavedQueriesModule> {\n        return {\n            ngModule: SavedQueriesModule,\n            providers: [\n                {\n                    provide: SAVEDQUERY_COMPONENTS,\n                    useValue: {\n                        editSavedQueryModal: EditSavedQuery,\n                        manageSavedQueriesModal: ManageSavedQueries,\n                        exportSavedQueryModal: ExportQuery\n                    }\n                },\n                SavedQueriesService,\n                SelectionService\n            ]\n        };\n    }\n *\n */\nexport interface SavedQueryComponents {\n    editSavedQueryModal: Type<any>;\n    manageSavedQueriesModal: Type<any>;\n    exportSavedQueryModal: Type<any>;\n}\nexport const SAVEDQUERY_COMPONENTS = new InjectionToken<SavedQueryComponents>('SAVEDQUERY_COMPONENTS');\n\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class SavedQueriesService implements OnDestroy {\n\n    private readonly _events = new Subject<SavedQueryChangeEvent>();\n    private readonly _changes = new Subject<SavedQueryChangeEvent>();\n\n    // An application may want to alter the action (icon, etc.)\n    public selectedRecordsAction: Action;\n\n    constructor(\n        public userSettingsService: UserSettingsWebService,\n        public searchService: SearchService,\n        public modalService: ModalService,\n        public appService: AppService,\n        public queryExportService: QueryExportWebService,\n        public downloadService: DownloadWebService,\n        public selectionService: SelectionService,\n        @Inject(SAVEDQUERY_COMPONENTS) public savedQueryComponents: SavedQueryComponents\n    ){\n        // Listen to the user settings\n        this.userSettingsService.events.subscribe(event => {\n            // E.g. new login occurs\n            // ==> Menus need to be rebuilt\n            this._events.next({type: SavedQueryEventType.Loaded});\n        });\n        // Listen to own events, to trigger change events\n        this._events.subscribe(event => {\n            if(SAVED_QUERIES_CHANGE_EVENTS.indexOf(event.type) !== -1){\n                this.changes.next(event);\n            }\n        });\n        // Initialize selection action\n        this.selectedRecordsAction = new Action({\n            icon: 'fas fa-download',\n            title: 'msg#exportQuery.btnTitle',\n            name: \"exportQuery\",\n            action: (_item: Action, _event: Event) => {\n                this.exportModal(this.selectionService.haveSelectedRecords\n                    ? ExportSourceType.Selection\n                    : ExportSourceType.Result);\n            },\n        });\n    }\n\n\n    // GETTERS\n\n    /**\n     * Returns the list of this user's saved queries.\n     * The list is stored in the user settings (this is a redirection).\n     * Using this service creates the list of saved queries if it does not already exist.\n     */\n    public get savedqueries() : SavedQuery[]{\n        return this.userSettingsService.get(\"savedQueries\");\n    }\n\n    /**\n     * Triggers any event among SavedQueryChangeEvent\n     * (use for fine-grained control of saved queries workflow)\n     */\n    public get events() : Subject<SavedQueryChangeEvent> {\n        return this._events;\n    }\n\n    /**\n     * Triggers when events affect the list of saved queries\n     * (use to refresh saved queries menus)\n     * Cf. CHANGE_EVENTS list\n     */\n    public get changes() : Subject<SavedQueryChangeEvent> {\n        return this._changes;\n    }\n\n    /**\n     * @returns true if there is at least one saved query\n     */\n    public get hasSavedQuery(): boolean {\n        return this.savedqueries.length > 0;\n    }\n\n    /**\n     * @returns a saved query with the given name or null if it does not exist\n     * @param name\n     */\n    public savedquery(name: string): SavedQuery | undefined {\n        const i = this.savedqueryIndex(name);\n        return i>= 0? this.savedqueries[i] : undefined;\n    }\n\n    private savedqueryIndex(name: string): number {\n        for (let i = 0, ic = this.savedqueries.length; i < ic; i++) {\n            const savedquery = this.savedqueries[i];\n            if (savedquery && savedquery.name === name) {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n\n\n    // CRUD\n\n    /**\n     * Creates a new saved query unless it already exists.\n     * Emits an savedquery event.\n     * Update the data on the server.\n     * @param savedquery the savedquery to create\n     * @returns true if savedquery was created\n     */\n    public createSavedQuery(savedquery: SavedQuery) : boolean {\n\n        if(this.savedqueryIndex(savedquery.name) >= 0)\n            return false; // This savedquery already exists\n\n        this.savedqueries.unshift(savedquery);\n        this._events.next({type : SavedQueryEventType.Add, savedquery});\n        this.patchSavedQueries([{\n            type: SavedQueryEventType.Add,\n            detail: {\n                savedquery: savedquery.name\n            }\n        }]);\n        return true;\n    }\n\n    /**\n     * Update the saved query at the given index, unless a saved query with the same name\n     * already exists in the list of saved queries.\n     * Emits an Saved Query event.\n     * Update the data on the server.\n     * @param savedquery the saved query to update\n     * @param index the index at which to update the saved query\n     * @returns true if saved query was updated\n     */\n    public updateSavedQuery(savedquery: SavedQuery, index : number) : boolean {\n\n        const prevIndex = this.savedqueryIndex(savedquery.name);\n        if(prevIndex !== -1 && index !== prevIndex)\n            return false; // A saved query with the same name exists at a different index\n\n        if(index >= 0 && index < this.savedqueries.length){\n\n            this.savedqueries.splice(index, 1, savedquery);\n            this._events.next({type : SavedQueryEventType.Update, savedquery});\n            this.patchSavedQueries([\n                {\n                    type: SavedQueryEventType.Update,\n                    detail: {\n                        savedquery: savedquery.name\n                    }\n                }\n            ]);\n            return true;\n\n        }\n        return false;   // This saved query does not exist\n    }\n\n    /**\n     * Updates the full list of saved queries.\n     * Emits an SavedQuery event.\n     * Update the data on the server.\n     * @param savedqueries the new list of saved queries\n     * @param auditEvents the list of audit events to log\n     */\n    public updateSavedQueries(savedqueries : SavedQuery[], auditEvents?: AuditEvents) : boolean {\n        Utils.arraySet(this.savedqueries, savedqueries);\n        this._events.next({type : SavedQueryEventType.Update});\n        this.patchSavedQueries(auditEvents);\n        return true;\n    }\n\n    /**\n     * Deletes the given SavedQuery (based on its name)\n     * Emits an SavedQuery event.\n     * Update the data on the server.\n     * @param savedquery\n     * @returns true if saved query was deleted\n     */\n    public deleteSavedQuery(savedquery: SavedQuery) : boolean {\n\n        const index = this.savedqueryIndex(savedquery.name);\n\n        if(index === -1)\n            return false; // Nothing to delete\n\n        this.savedqueries.splice(index, 1);\n        this._events.next({type : SavedQueryEventType.Delete, savedquery});\n        this.patchSavedQueries([\n            {\n                type: SavedQueryEventType.Delete,\n                detail: {\n                    savedquery: savedquery.name\n                }\n            }\n        ]);\n        return true;\n    }\n\n    /**\n     * Sets this saved query to the current search context, using the search service\n     */\n    public setSavedQueryToCurrentQuery(savedquery: SavedQuery){\n        savedquery.query = Query.copy(this.searchService.query);\n    }\n\n    /**\n     * Updates Saved Queries in User settings.\n     * @param auditEvents : Audit Events to be triggered\n     * @returns an Observable which can be used to trigger further events\n     */\n    private patchSavedQueries(auditEvents?: AuditEvents) {\n        return this.userSettingsService.patch({savedQueries: this.savedqueries}, auditEvents)\n            .subscribe(\n                next => {\n                    this._events.next({type: SavedQueryEventType.Patched});\n                },\n                error => {\n                    console.error(\"Could not patch Saved queries!\", error);\n                }\n            );\n    }\n\n\n    public rssHref(item: SavedQuery) {\n        return Utils.addSearchParams(this.appService.appWebService.makeUrl(\"query.rss\"),\n            {\n                app: this.appService.appName,\n                name: item.name\n            });\n    }\n\n\n    public hasRssEnabled(): boolean {\n        return !!this.appService.app && !!this.appService.app.queryRssEnabled;\n    }\n\n\n    /**\n     * Checks if there is a configuration for the export web service.\n     *\n     * @returns true if there is a configuration for the export web service.\n     */\n    public hasExportConfig(): boolean {\n        return !!this.appService.app && !!this.appService.app.queryExport;\n    }\n\n\n    public download(model : ExportQueryModel): Observable<HttpResponse<Blob>> {\n        return this.downloadService.download(this.requestExport(model), model.filename);\n    }\n\n    private requestExport(model: ExportQueryModel): Observable<HttpResponse<Blob>> {\n        switch (model.export) {\n            case ExportSourceType.Result:\n                return this.queryExportService.exportResult(\n                    model.webService,\n                    this.searchService.query,\n                    this.searchService.results,\n                    model.format,\n                    model.maxCount,\n                    model.exportedColumns,\n                );\n            case ExportSourceType.Selection:\n                return this.queryExportService.exportSelection(\n                    model.webService,\n                    this.searchService.query,\n                    this.searchService.results,\n                    this.selectionService.getSelectedIds(),\n                    model.format,\n                    model.maxCount,\n                    model.exportedColumns,\n                );\n            case ExportSourceType.SavedQuery:\n                return this.queryExportService.exportSavedQuery(\n                    model.webService,\n                    model.queryName || \"\",\n                    model.format,\n                    model.maxCount,\n                    model.exportedColumns,\n                );\n            default:\n                console.log(\n                    'QueryExporter.export unexpected export type: ',\n                    ExportSourceType[model.export]);\n                return throwError('QueryExporter.export unexpected export type: ');\n        }\n    }\n\n\n\n\n    // EVENT HANDLERS (Menus)\n\n    /**\n     * Uses the SearchService to perform a search returning all\n     * the documents matching this saved query.\n     * @param saved query\n     * @returns the search service promise\n     */\n    searchSavedQuery(savedquery: SavedQuery, path?: string): Promise<boolean> {\n        this.searchService.setQuery(Utils.extend(this.searchService.makeQuery(), Utils.copy(savedquery.query)));\n        this._events.next({type: SavedQueryEventType.Search, savedquery});\n        return this.searchService.search({ path: path }, {\n            type: SavedQueryEventType.Search,\n            detail: {\n                savedquery: savedquery.name\n            }\n        });\n    }\n\n    /**\n     * Opens a dialog allowing a user to save the current query.\n     * @returns a boolean promise resolved when the user closes the dialog\n     * the result is true if the query was saved.\n     */\n    createSavedQueryModal(query: Query = this.searchService.query) : Promise<boolean> {\n        const savedQuery: SavedQuery = {\n            name: query.text || \"\",\n            query: Query.copy(query)\n        };\n        return this.modalService.open(this.savedQueryComponents.editSavedQueryModal, {model: savedQuery})\n            .then((result) => {\n                if (result === ModalResult.OK) {\n\n                    const index = this.savedqueryIndex(savedQuery.name);\n                    if (index !== -1) {\n\n                        return this.modalService.yesNo(\"msg#savedQueries.savedQueryAlreadyExists\")\n                            .then((result) => {\n                                if (result === ModalResult.Yes) {\n                                    return this.updateSavedQuery(savedQuery, index);\n                                }\n                                return false;\n                            });\n\n                    } else {\n                        return this.createSavedQuery(savedQuery);\n                    }\n                }\n                return false;\n            });\n    }\n\n    /**\n     * Opens a dialog allowing a user to reorganize and edit the\n     * list of saved queries.\n     * @returns a boolean promise resolved when the user closes the dialog\n     * the result is true is the list was updated.\n     */\n    public manageSavedQueriesModal() : Promise<boolean> {\n\n        const model: ManageSavedQueriesModel = { savedQueries: Utils.copy(this.savedqueries) };\n\n        return this.modalService.open(this.savedQueryComponents.manageSavedQueriesModal, {model})\n            .then((result) => {\n                if (result === ModalResult.OK) {\n                    return this.updateSavedQueries(model.savedQueries, model.auditEvents);\n                }\n                return false;\n            });\n\n    }\n\n    /**\n     * Exports a query via a modal dialog.\n     *\n     * @param exportType type of export to perform (selection, saved query, results)\n     * @param savedQuery The saved query\n     */\n    public exportModal(exportType: ExportSourceType, savedQuery?: SavedQuery, filename?: string)\n            : Promise<ModalResult> {\n\n        if (!this.hasExportConfig() || !this.appService.app) {\n            return Promise.resolve(ModalResult.Cancel);\n        }\n\n        const defaultQueryWebService = this.appService.app.queryExport.split(',')[0];\n\n        const model: ExportQueryModel = {\n            format: ExportOutputFormat.Csv,\n            export: exportType,\n            webService: defaultQueryWebService,\n            filename\n        };\n\n        if (savedQuery && exportType === ExportSourceType.SavedQuery) {\n            model.queryName = savedQuery.name;\n        }\n\n        return this.modalService.open(this.savedQueryComponents.exportSavedQueryModal, {model});\n    }\n\n    notifyOpenSavedQuery(savedquery: SavedQuery) {\n        this._events.next({type: SavedQueryEventType.Search, savedquery});\n    }\n\n    ngOnDestroy() {\n        this.events.complete();\n        this.changes.complete();\n    }\n}\n","import {Injectable, Optional, OnDestroy, Inject, InjectionToken} from \"@angular/core\";\nimport {Subject} from \"rxjs\";\nimport {UserSettingsWebService, AuditEvents} from \"@sinequa/core/web-services\";\nimport {Query} from \"@sinequa/core/app-utils\";\nimport {Utils} from \"@sinequa/core/base\";\nimport {SearchService} from \"@sinequa/components/search\";\n\n\nexport interface RecentQuery {\n    query: Query;\n    date: Date;\n}\n\n\n// from core/models/audit\nexport const enum RecentQueryEventType {\n    Loaded = \"RecentQuery_Loaded\",\n    Patched = \"RecentQuery_Patched\",\n    Add = \"RecentQuery_Add\",\n    Update = \"RecentQuery_Update\",\n    Delete = \"RecentQuery_Delete\",\n    Search = \"Search_RecentQuery\"\n}\n\n// Types of events triggering a change event\nexport const RECENT_QUERIES_CHANGE_EVENTS = [\n    RecentQueryEventType.Add,\n    RecentQueryEventType.Update,\n    RecentQueryEventType.Delete,\n];\n\n\n// CRUD Events\nexport interface RecentQueryChangeEvent {\n    type: RecentQueryEventType;\n    recentquery?: RecentQuery;\n}\n\nexport const MAX_QUERIES = new InjectionToken(\"MAX_QUERIES\");\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class RecentQueriesService implements OnDestroy {\n\n    private readonly _events = new Subject<RecentQueryChangeEvent>();\n    private readonly _changes = new Subject<RecentQueryChangeEvent>();\n\n    constructor(\n        public userSettingsService: UserSettingsWebService,\n        public searchService: SearchService,\n        @Optional() @Inject(MAX_QUERIES) private maxQueries: number,\n    ){\n        if(!this.maxQueries){\n            this.maxQueries = 20;\n        }\n\n        // Listen to the user settings\n        this.userSettingsService.events.subscribe(event => {\n            // E.g. new login occurs\n            // ==> Revive dates\n            this.recentqueries.forEach(rq => {\n                if (Utils.isString(rq.date)) {\n                    const date = Utils.toDate(rq.date);\n                    if (date) {\n                        rq.date = date;\n                    }\n                }\n            });\n            // ==> Menus need to be rebuilt\n            this._events.next({type: RecentQueryEventType.Loaded});\n        });\n        // Listen to own events, to trigger change events\n        this._events.subscribe(event => {\n            if(RECENT_QUERIES_CHANGE_EVENTS.indexOf(event.type) !== -1){\n                this.changes.next(event);\n            }\n        });\n        // Listen to search service and store queries\n        this.searchService.queryStream.subscribe((query) => {\n                if (query) {\n                    this.addRecentQuery({query: query.copy(), date: new Date()});\n                }\n            });\n    }\n\n\n    // GETTERS\n\n    /**\n     * Returns the list of this user's recent queries.\n     * The list is stored in the user settings (this is a redirection).\n     * Using this service creates the list of recent queries if it does not already exist.\n     */\n    public get recentqueries() : RecentQuery[]{\n        return this.userSettingsService.get(\"recentQueries\");\n    }\n\n    /**\n     * Triggers any event among RecentQueryChangeEvent\n     * (use for fine-grained control of recent queries workflow)\n     */\n    public get events() : Subject<RecentQueryChangeEvent> {\n        return this._events;\n    }\n\n    /**\n     * Triggers when events affect the list of recent queries\n     * (use to refresh recent queries menus)\n     * Cf. CHANGE_EVENTS list\n     */\n    public get changes() : Subject<RecentQueryChangeEvent> {\n        return this._changes;\n    }\n\n    /**\n     * @returns true if there is at least one recent query\n     */\n    public get hasRecentQuery(): boolean {\n        return this.recentqueries.length > 0;\n    }\n\n    /**\n     * @returns a recent query with the given name or undefined if it does not exist\n     * @param name\n     */\n    public recentquery(text: string): RecentQuery | undefined {\n        const i = this.recentqueryIndex(text);\n        return i>= 0? this.recentqueries[i] : undefined;\n    }\n\n    private recentqueryIndex(text: string): number {\n        for (let i = 0, ic = this.recentqueries.length; i < ic; i++) {\n            const recentquery = this.recentqueries[i];\n            if (recentquery && recentquery.query.text && recentquery.query.text.toLowerCase() === text.toLowerCase()) {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n    private comparator(q1: RecentQuery, q2: RecentQuery){\n        return q2.date.getTime() - q1.date.getTime();\n    }\n\n\n    // CRUD\n\n    /**\n     * Creates a new recent query unless it already exists, in which case the existing query is updated.\n     * Emits an recentquery event.\n     * Update the data on the server.\n     * @param recentquery the recentquery to create\n     * @returns true if recentquery was created\n     */\n    public addRecentQuery(recentquery: RecentQuery) : boolean {\n\n        if(!recentquery.query || !recentquery.query.text || recentquery.query.text.trim() === ''){\n            return false;\n        }\n\n        const i = this.recentqueryIndex(recentquery.query.text); // If the query already exists\n        if(i >= 0){\n            // Ignore identical queries issued within a certain time window (1s)\n            // to avoid flooding the server. NB the request flooding mitigation in\n            // SqHttpClient will not work in this case as the request payload includes\n            // a timestamp\n            if (Math.abs(recentquery.date.getTime() - this.recentqueries[i].date.getTime()) < 1000) {\n                if (Utils.equals(this.recentqueries[i].query, recentquery.query)) {\n                    return false;\n                }\n            }\n            this.recentqueries[i].date = recentquery.date; // Update the date of the existing query\n            this.recentqueries[i].query = recentquery.query;\n            this._events.next({type : RecentQueryEventType.Update, recentquery: this.recentqueries[i]});\n        }\n        else {\n            this.recentqueries.push(recentquery);\n            this._events.next({type : RecentQueryEventType.Add, recentquery});\n        }\n\n        // Sort the list\n        this.recentqueries.sort(this.comparator);\n\n        // Truncate the list\n        if(this.maxQueries >=0 )\n            this.recentqueries.splice(this.maxQueries);\n\n        this.patchRecentQueries(); // No need to emit an \"Add\" audit event, since it is redundant with the main search API\n        return true;\n    }\n\n    /**\n     * Deletes the given RecentQuery (based on its name)\n     * Emits an RecentQuery event.\n     * Update the data on the server.\n     * @param recentquery\n     * @returns true if recent query was deleted\n     */\n    public deleteRecentQuery(recentquery: RecentQuery) : boolean {\n\n        const index = this.recentqueryIndex(recentquery.query.text || \"\");\n\n        if(index === -1)\n            return false; // Nothing to delete\n\n        this.recentqueries.splice(index, 1);\n        this._events.next({type : RecentQueryEventType.Delete, recentquery});\n        this.patchRecentQueries([\n            {\n                type: RecentQueryEventType.Delete,\n                detail: {\n                    recentquery: recentquery.query.text\n                }\n            }\n        ]);\n        return true;\n    }\n\n    /**\n     * Updates Recent Queries in User settings.\n     * @param auditEvents : Audit Events to be triggered\n     * @returns an Observable which can be used to trigger further events\n     */\n    private patchRecentQueries(auditEvents?: AuditEvents) {\n        // Do not forget to revert back the date conversion done when fetched\n        const recentQueries = this.recentqueries.map(query => ({...query, date: Utils.fromDate(query.date)}));\n\n        return this.userSettingsService.patch({recentQueries}, auditEvents)\n            .subscribe(\n                next => {\n                    this._events.next({type: RecentQueryEventType.Patched});\n                },\n                error => {\n                    console.error(\"Could not patch Recent queries!\", error);\n                }\n            );\n    }\n\n\n    // EVENT HANDLERS (Menus)\n\n    /**\n     * Uses the SearchService to perform a search returning all\n     * the documents matching this recent query.\n     * @param recentquery\n     * @returns the search service promise\n     */\n    searchRecentQuery(recentquery: RecentQuery, path?: string): Promise<boolean> {\n        this.searchService.setQuery(Utils.extend(this.searchService.makeQuery(), Utils.copy(recentquery.query)));\n        this._events.next({type: RecentQueryEventType.Search, recentquery});\n        return this.searchService.search({ path: path }, {\n            type: RecentQueryEventType.Search,\n            detail: {\n                recentquery: recentquery.query.text\n            }\n        });\n    }\n\n    notifyOpenRecentQuery(recentquery: RecentQuery): void {\n        this._events.next({type: RecentQueryEventType.Search, recentquery});\n    }\n\n    ngOnDestroy() {\n        this.events.complete();\n        this.changes.complete();\n    }\n}\n","import {Injectable, Optional, OnDestroy, Inject, InjectionToken} from \"@angular/core\";\nimport {Subject} from \"rxjs\";\nimport {UserSettingsWebService, AuditEvents, Record} from \"@sinequa/core/web-services\";\nimport {SearchService} from \"@sinequa/components/search\";\nimport {Utils} from \"@sinequa/core/base\";\n\n\nexport interface RecentDocument {\n    /**\n     * Fields from Record that we want to store/display/index for recent documents\n     */\n    id: string;\n    title: string;\n    url1: string;\n    treepath: string[];\n    docformat: string;\n    authors: string[];\n\n    /**\n     * Date at which the document was last opened\n     */\n    date: Date;\n\n    /**\n     * Store whether the doc was opened in the preview or directly via url\n     */\n    original: boolean;\n}\n\n\n// from core/models/audit\nexport const enum RecentDocumentEventType {\n    Loaded = \"RecentDocument_Loaded\",\n    Patched = \"RecentDocument_Patched\",\n    Add = \"RecentDocument_Add\",\n    Update = \"RecentDocument_Update\",\n    Delete = \"RecentDocument_Delete\",\n    Search = \"Search_RecentDocument\"\n}\n\n// Types of events triggering a change event\nexport const RECENT_DOCUMENTS_CHANGE_EVENTS = [\n    RecentDocumentEventType.Add,\n    RecentDocumentEventType.Update,\n    RecentDocumentEventType.Delete,\n];\n\n\n// CRUD Events\nexport interface RecentDocumentChangeEvent {\n    type: RecentDocumentEventType;\n    recentdocument?: RecentDocument;\n}\n\nexport const MAX_DOCUMENTS = new InjectionToken(\"MAX_DOCUMENTS\");\n\n@Injectable({\n    providedIn: 'root',\n})\nexport class RecentDocumentsService implements OnDestroy {\n\n    private readonly _events = new Subject<RecentDocumentChangeEvent>();\n    private readonly _changes = new Subject<RecentDocumentChangeEvent>();\n\n    constructor(\n        public userSettingsService: UserSettingsWebService,\n        public searchService: SearchService,\n        @Optional() @Inject(MAX_DOCUMENTS) private maxDocuments: number,\n    ){\n        if(!this.maxDocuments){\n            this.maxDocuments = 20;\n        }\n\n        // Listen to the user settings\n        this.userSettingsService.events.subscribe(event => {\n            // E.g. new login occurs\n            // ==> Revive dates\n            this.recentdocuments.forEach(rd => {\n                if (Utils.isString(rd.date)) {\n                    const date = Utils.toDate(rd.date);\n                    if (date) {\n                        rd.date = date;\n                    }\n                }\n            });\n            // ==> Menus need to be rebuilt\n            this.events.next({type: RecentDocumentEventType.Loaded});\n        });\n\n        // Listen to own events, to trigger change events\n        this._events.subscribe(event => {\n            if(RECENT_DOCUMENTS_CHANGE_EVENTS.indexOf(event.type) !== -1){\n                this.changes.next(event);\n            }\n        });\n\n        /**\n         * Subscribe to the search service to capture \"open-original-document\" event\n         * and add documents to this service\n         */\n        this.searchService.events.subscribe(event => {\n            if(event.type === \"open-original-document\" && event.record){\n                this.addDocument(event.record, true);\n            }\n        });\n    }\n\n\n    // GETTERS\n\n    /**\n     * Returns the list of this user's recent documents.\n     * The list is stored in the user settings (this is a redirection).\n     * Using this service creates the list of recent documents if it does not already exist.\n     */\n    public get recentdocuments() : RecentDocument[]{\n        return this.userSettingsService.get(\"recentDocuments\");\n    }\n\n    /**\n     * Triggers any event among RecentDocumentChangeEvent\n     * (use for fine-grained control of recent documents workflow)\n     */\n    public get events() : Subject<RecentDocumentChangeEvent> {\n        return this._events;\n    }\n\n    /**\n     * Triggers when events affect the list of recent documents\n     * (use to refresh recent documents menus)\n     * Cf. CHANGE_EVENTS list\n     */\n    public get changes() : Subject<RecentDocumentChangeEvent> {\n        return this._changes;\n    }\n\n    /**\n     * @returns true if there is at least one recent document\n     */\n    public get hasRecentDocument(): boolean {\n        return this.recentdocuments.length > 0;\n    }\n\n    /**\n     * @returns a recent document with the given name or null if it does not exist\n     * @param name\n     */\n    public recentdocument(text: string): RecentDocument | undefined {\n        const i = this.recentdocumentIndex(text);\n        return i>= 0? this.recentdocuments[i] : undefined;\n    }\n\n    private recentdocumentIndex(id: string): number {\n        for (let i = 0, ic = this.recentdocuments.length; i < ic; i++) {\n            const recentdocument = this.recentdocuments[i];\n            if (recentdocument && recentdocument.id === id) {\n                return i;\n            }\n        }\n        return -1;\n    }\n\n    private comparator(q1: RecentDocument, q2: RecentDocument){\n        return q2.date.getTime() - q1.date.getTime();\n    }\n\n\n    // CRUD\n\n    /**\n     * Creates a new recent document unless it already exists, in which case the existing document is updated.\n     * Emits an recentdocument event.\n     * Update the data on the server.\n     * @param record Record to add to the service\n     * @param original Whether the original doc was opened or the preview\n     * @returns true if recentdocument was created\n     */\n    public addDocument(record: Record, original: boolean) {\n        if(record){\n            return this.addRecentDocument({\n                id: record.id,\n                title: record.title,\n                url1: record.url1,\n                treepath: record.treepath,\n                docformat: record.docformat,\n                authors: record.authors,\n\n                date: new Date(),\n                original: original\n            });\n        }\n        return false;\n    }\n\n    /**\n     * Creates a new recent document unless it already exists, in which case the existing document is updated.\n     * Emits an recentdocument event.\n     * Update the data on the server.\n     * @param recentdocument the recentdocument to create\n     * @returns true if recentdocument was created\n     */\n    public addRecentDocument(recentdocument: RecentDocument) : boolean {\n\n        if(!recentdocument.id){\n            return false;\n        }\n\n        const i = this.recentdocumentIndex(recentdocument.id); // If the document already exists\n        if(i >= 0){\n            this.recentdocuments[i].date = recentdocument.date; // Update the date of the existing document\n            this.events.next({type : RecentDocumentEventType.Update, recentdocument: this.recentdocuments[i]});\n        }\n        else {\n            this.recentdocuments.push(recentdocument);\n            this.events.next({type : RecentDocumentEventType.Add, recentdocument: recentdocument});\n        }\n\n        // Sort the list\n        this.recentdocuments.sort(this.comparator);\n\n        // Truncate the list\n        if(this.maxDocuments >=0 )\n            this.recentdocuments.splice(this.maxDocuments);\n\n        this.patchRecentDocuments(); // No need to emit an \"Add\" audit event, since it is redundant with the main search API\n        return true;\n    }\n\n    /**\n     * Deletes the given RecentDocument (based on its name)\n     * Emits an RecentDocument event.\n     * Update the data on the server.\n     * @param recentdocument\n     * @returns true if recent document was deleted\n     */\n    public deleteRecentDocument(recentdocument: RecentDocument) : boolean {\n\n        const index = this.recentdocumentIndex(recentdocument.id);\n\n        if(index === -1)\n            return false; // Nothing to delete\n\n        this.recentdocuments.splice(index, 1);\n        this.events.next({type : RecentDocumentEventType.Delete, recentdocument: recentdocument});\n        this.patchRecentDocuments([\n            {\n                type: RecentDocumentEventType.Delete,\n                detail: {\n                    recentdocument: recentdocument.id\n                }\n            }\n        ]);\n        return true;\n    }\n\n    /**\n     * Updates Recent Documents in User settings.\n     * @param auditEvents : Audit Events to be triggered\n     * @returns an Observable which can be used to trigger further events\n     */\n    private patchRecentDocuments(auditEvents?: AuditEvents) {\n        // Do not forget to revert back the date conversion done when fetched\n        const recentDocuments = this.recentdocuments.map(doc => ({...doc, date: Utils.fromDate(doc.date)}));\n        return this.userSettingsService.patch({recentDocuments}, auditEvents)\n            .subscribe(\n                next => {\n                    this.events.next({type: RecentDocumentEventType.Patched});\n                },\n                error => {\n                    console.error(\"Could not patch Recent documents!\", error);\n                }\n            );\n    }\n\n\n    ngOnDestroy() {\n        this.events.complete();\n        this.changes.complete();\n    }\n}\n","import {Component, OnInit, OnDestroy, Inject} from \"@angular/core\";\nimport {UntypedFormBuilder, UntypedFormGroup, UntypedFormControl, Validators} from \"@angular/forms\";\nimport {Subscription} from \"rxjs\";\nimport {MODAL_MODEL, ModalButton, ModalResult} from \"@sinequa/core/modal\";\nimport {Utils} from \"@sinequa/core/base\";\nimport {SavedQuery} from \"../../saved-queries.service\";\n\n@Component({\n    selector: \"sq-edit-saved-query\",\n    templateUrl: \"./edit-saved-query.html\",\n    standalone: false\n})\nexport class BsEditSavedQuery implements OnInit, OnDestroy {\n    nameControl: UntypedFormControl;\n    form: UntypedFormGroup;\n    formChanges: Subscription;\n    buttons: ModalButton[];\n\n    constructor(\n        @Inject(MODAL_MODEL) public model: SavedQuery,\n        private formBuilder: UntypedFormBuilder) {\n    }\n\n    ngOnInit() {\n        this.nameControl = new UntypedFormControl(this.model.name, Validators.required);\n        this.form = this.formBuilder.group({\n            savedQueryName: this.nameControl\n        });\n        this.formChanges = Utils.subscribe(this.form.valueChanges,\n            (value) => {\n                this.model.name = this.nameControl.value;\n            }\n        );\n\n        this.buttons = [\n            new ModalButton({\n                result: ModalResult.OK,\n                primary: true,\n                validation: this.form\n            }),\n            new ModalButton({\n                result: ModalResult.Cancel\n            })\n        ];\n    }\n\n    ngOnDestroy() {\n        this.formChanges.unsubscribe();\n    }\n}\n","<form name=\"editSavedQuery\" novalidate [formGroup]=\"form\">\n    <sq-modal [title]=\"'msg#editSavedQuery.title'\" [buttons]=\"buttons\">\n        <div class=\"mb-3 sq-form-group\">\n            <label class=\"form-label\" for=\"savedQueryName\">{{'msg#editSavedQuery.name' | sqMessage}}</label>\n            <input [sqValidation]=\"form\" type=\"text\" class=\"form-control\" id=\"savedQueryName\" formControlName=\"savedQueryName\" spellcheck=\"off\" sqAutofocus>\n        </div>\n    </sq-modal>\n</form>","import { Component, OnInit, OnDestroy, Inject, ChangeDetectorRef} from '@angular/core';\nimport { HttpResponse } from '@angular/common/http';\nimport { UntypedFormBuilder, UntypedFormGroup, Validators } from '@angular/forms';\nimport { Subscription } from 'rxjs';\nimport { ValidationService } from \"@sinequa/core/validation\";\nimport { NotificationsService } from \"@sinequa/core/notification\";\nimport { Utils } from \"@sinequa/core/base\";\nimport { ModalRef, ModalButton, ModalResult, MODAL_MODEL } from \"@sinequa/core/modal\";\nimport { ExportSourceType, ExportOutputFormat, CCWebService, CCApp} from \"@sinequa/core/web-services\";\nimport {SavedQueriesService, ExportQueryModel} from \"../../saved-queries.service\";\nimport {SelectionService} from \"@sinequa/components/selection\";\nimport { AppService } from '@sinequa/core/app-utils';\n\n/**\n * Component representing the Export dialog where user can customize the query export action.\n *\n */\n@Component({\n    selector: 'sq-export-query',\n    templateUrl: './export-query.html',\n    standalone: false\n})\nexport class BsExportQuery implements OnInit, OnDestroy {\n\n    public readonly supportedFormats: ExportOutputFormat[] = [\n        ExportOutputFormat.Csv,\n        ExportOutputFormat.Xlsx,\n        ExportOutputFormat.Json\n    ];\n    public readonly outputFormats: typeof ExportOutputFormat = ExportOutputFormat;\n    public readonly sourceTypes: typeof ExportSourceType = ExportSourceType;\n\n    public form: UntypedFormGroup;\n    public savedQueries: string[] = [];\n    public buttons: ModalButton[] = [];\n    public isDownloading = false;\n    public exportableColumns: string[] = [];\n\n    private formChanges: Subscription;\n\n    maxCount = 1000; // Default max count hard coded in web service\n\n    constructor(\n        @Inject(MODAL_MODEL) public model: ExportQueryModel,\n        private formBuilder: UntypedFormBuilder,\n        private appService: AppService,\n        private selectionService: SelectionService,\n        private savedQueriesService: SavedQueriesService,\n        private validationService: ValidationService,\n        private notificationsService: NotificationsService,\n        private changeDetectorRef: ChangeDetectorRef,\n        public modalRef: ModalRef) { }\n\n    ngOnInit(): void {\n        for (const query of this.savedQueriesService.savedqueries) {\n            this.savedQueries.push(query.name);\n        }\n\n        if (this.appService.app) {\n            const queryExportConfig = this.getQueryExportConfig(this.appService.app);\n            const columns = (queryExportConfig.columns && queryExportConfig.columns['column$']) || [];\n            for (const column of columns) {\n                this.exportableColumns.push(column.title);\n            }\n            if(queryExportConfig.maxCount && Utils.isNumber(queryExportConfig.maxCount)) {\n                this.maxCount = queryExportConfig.maxCount;\n            }\n        }\n\n        this.model.format = this.supportedFormats[0];\n\n        this.form = this.formBuilder.group({\n            'format': [this.model.format],\n            'exportedColumns': [this.model.exportedColumns],\n            'export': [this.model.export, Validators.required],\n            'maxCount': [this.model.maxCount, Validators.compose([\n                this.validationService.integerValidator(),\n                this.validationService.minValidator(1)\n            ])],\n        });\n\n        this.buttons = [\n            new ModalButton({\n                text: \"msg#exportQuery.btnDownload\",\n                result: ModalResult.Custom,\n                anchor: true,\n                primary: true,\n                action: (_button) => {\n                    const observable = this.savedQueriesService.download(this.model);\n                    if (observable) {\n                        Utils.subscribe(observable,\n                            (response: HttpResponse<Blob>) => {\n                                console.log('exportQuery.download done.');\n                                this.notificationsService.info('msg#exportQuery.successNotification');\n                                this.modalRef.close(ModalResult.OK);\n                                return response;\n                            },\n                            (error) => {\n                                console.log('exportQuery.download failure - error: ', error);\n                                this.modalRef.close(error);\n                            });\n\n                        this.isDownloading = true;\n                        this.changeDetectorRef.markForCheck();\n                    }\n                },\n            }),\n            new ModalButton({\n                result: ModalResult.Cancel,\n            })\n        ];\n\n        const onFormChanged = () => {\n            const newFormat = this.form.value['format'];\n            const newMaxCount = this.form.value['maxCount'];\n            const newExportedColumns = this.form.value['exportedColumns'];\n\n            if (this.model.format !== newFormat) {\n                this.model.format = newFormat;\n            }\n\n            if (this.model.maxCount !== newMaxCount) {\n                this.model.maxCount = newMaxCount;\n            }\n\n            this.model.exportedColumns = newExportedColumns;\n        };\n\n        this.formChanges = Utils.subscribe(this.form.valueChanges, onFormChanged);\n    }\n\n    ngOnDestroy(): void {\n        if (this.formChanges) {\n            this.formChanges.unsubscribe();\n        }\n    }\n\n    private getQueryExportConfig(app: CCApp): CCQueryExport {\n        return <CCQueryExport>Utils.getField(app.webServices, this.model.webService);\n    }\n\n    /**\n     * Check if the client has selected some records.\n     *\n     * @returns true if the client has selected some records.\n     */\n    public hasSelectedRecords(): boolean {\n        return this.selectionService.haveSelectedRecords;\n    }\n\n    /**\n     * Checks if the user chosen export source is the same as the given one.\n     * <p>\n     * Used to control the radio button state.\n     *\n     * @param type The source to check.\n     * @returns true if the user chosen export source is the same as the given one.\n     */\n    public sourceChosen(type: ExportSourceType): boolean {\n        return (this.model.export & type) !== 0;\n    }\n\n    /**\n     * Callback called when user chooses a new export source.\n     *\n     * @param event The related UI event.\n     * @param type The new chosen source.\n     */\n    public sourceChanged(event: UIEvent, type: ExportSourceType): void {\n        const input = <HTMLInputElement>event.target;\n        if (input.checked) {\n            this.model.export = type;\n        }\n    }\n\n    /**\n     * Checks if the dialog allows user to choose export source.\n     * Generally, it returns false when the input model export type is already saved query.\n     *\n     * @returns true if the dialog allows user to choose export source.\n     */\n    public showSourceChooser(): boolean {\n        return !this.sourceChosen(ExportSourceType.SavedQuery);\n    }\n}\n\ninterface CCQueryExportColumnDef {\n    title: string;\n    pattern: string;\n    selectionQuery?: string;\n}\n\ninterface CCQueryExport extends CCWebService {\n    webServiceType: \"queryexport\";\n    columns?: CCQueryExportColumnDef[];\n    linksFilterDuplicateUrls?: boolean;\n    linksGlobalRelevance?: string;\n    linksMaxCount?: number;\n    linksSortByOrder?: boolean;\n    maxCount?: number;\n    separator?: string;\n}\n","<form name=\"exportQuery\" novalidate [formGroup]=\"form\">\n    <sq-modal\n        [title]=\"'msg#exportQuery.dialogTitle'\"\n        [buttons]=\"buttons\"\n        [isProcessingState]=\"isDownloading\">\n        <div class=\"mb-3 sq-form-group\">\n            <label class=\"form-label\" for=\"format\">{{ 'msg#exportQuery.dialogOutputFormat' | sqMessage }}</label>\n            <select [sqValidation]=\"form\" class=\"form-select\" formControlName=\"format\" id=\"format\" sqAutofocus>\n                <option [value]=\"format\" *ngFor=\"let format of supportedFormats\">{{ outputFormats[format].toUpperCase() }}</option>\n            </select>\n        </div>\n        <div class=\"mb-3 sq-form-group\">\n            <label class=\"form-label\"\n                for=\"exportedColumns\"\n                title=\"{{ 'msg#exportQuery.exportedColumnsLabelTooltip' | sqMessage }}\"\n            >\n                {{ 'msg#exportQuery.exportedColumns' | sqMessage }}&nbsp;&#9432;\n            </label>\n            <select\n                id=\"exportedColumns\"\n                formControlName=\"exportedColumns\"\n                [sqValidation]=\"form\"\n                class=\"form-select\"\n                sqAutofocus multiple\n            >\n                <option [value]=\"column\" *ngFor=\"let column of exportableColumns\">{{ column }}</option>\n            </select>\n        </div>\n        <div class=\"mb-3 sq-form-group\">\n            <label class=\"form-label\"\n                for=\"maxCount\"\n                title=\"{{ 'msg#exportQuery.dialogMaxCountTooltip' | sqMessage:{values: {count: maxCount} } }}\"\n            >{{ 'msg#exportQuery.dialogMaxCount' | sqMessage }}&nbsp;&#9432;</label>\n            <input [sqValidation]=\"form\" type=\"number\" class=\"form-control\" id=\"maxCount\" formControlName=\"maxCount\" autocomplete=\"off\" spellcheck=\"off\">\n        </div>\n        <div class=\"mb-3 sq-form-group\" *ngIf=\"showSourceChooser()\">\n            <label class=\"form-label\" for=\"export\">{{ 'msg#exportQuery.dialogSourceType' | sqMessage }}</label>\n            <div>\n                <div class=\"form-check form-check-inline\">\n                    <label role=\"button\" class=\"form-check-label\">\n                        <input class=\"form-check-input\" type=\"radio\" [checked]=\"sourceChosen(sourceTypes.Result)\" (change)=\"sourceChanged($event, sourceTypes.Result)\" >\n                        {{ 'msg#exportQuery.dialogResult' | sqMessage }}\n                    </label>\n                </div>\n                <div class=\"form-check form-check-inline\">\n                    <label [attr.role]=\"hasSelectedRecords() ? 'button' : ''\" class=\"form-check-label\" [ngClass]=\"{'text-muted': !hasSelectedRecords()}\">\n                        <input class=\"form-check-input\" type=\"radio\" [checked]=\"sourceChosen(sourceTypes.Selection)\" (change)=\"sourceChanged($event, sourceTypes.Selection)\"\n                        [disabled]=\"!hasSelectedRecords()\" >\n                        {{ 'msg#exportQuery.dialogSelection' | sqMessage }}\n                    </label>\n                </div>\n            </div>\n        </div>\n    </sq-modal>\n</form>\n","import {Component, Inject, OnInit} from \"@angular/core\";\nimport {Validators, AbstractControl} from \"@angular/forms\";\nimport {ValidatorFn} from \"@angular/forms\";\nimport {CdkDragDrop} from \"@angular/cdk/drag-drop\";\nimport {MODAL_MODEL, ModalButton, ModalResult} from \"@sinequa/core/modal\";\nimport {Utils} from \"@sinequa/core/base\";\nimport {ExportSourceType, AuditEvent} from \"@sinequa/core/web-services\";\nimport {SavedQueriesService, SavedQuery, SavedQueryEventType, ManageSavedQueriesModel} from \"../../saved-queries.service\";\n\n@Component({\n    selector: \"sq-manage-saved-queries\",\n    templateUrl: \"./manage-saved-queries.html\",\n    styleUrls: [\"./manage-saved-queries.scss\"],\n    standalone: false\n})\nexport class BsManageSavedQueries implements OnInit {\n    reordering: boolean;\n    buttons: ModalButton[];\n    removeAllButton: ModalButton;\n    nameValidators: ValidatorFn[];\n\n    constructor(\n        @Inject(MODAL_MODEL) public model: ManageSavedQueriesModel,\n        public savedQueriesService: SavedQueriesService) {\n        this.reordering = false;\n\n        this.nameValidators = [\n            Validators.required,\n            (control: AbstractControl) => {\n                const modelControl = control.root.get(\"model\");\n                if (modelControl) {\n                    for (const item of this.model.savedQueries) {\n                        if (modelControl.value === item) {\n                            continue;\n                        }\n                        if (control.value === item.name) {\n                            return {\n                                unique: true\n                            };\n                        }\n                    }\n                }\n                return null;\n            }\n        ];\n    }\n\n    ngOnInit() {\n        this.buttons = [\n            this.removeAllButton = new ModalButton({\n                text: \"msg#manageSavedQueries.removeAll\",\n                result: ModalResult.Custom,\n                action: (button) => {\n                    this.model.savedQueries.splice(0);\n                    button.visible = false;\n                    this.addAuditEvent({\n                        type: SavedQueryEventType.DeleteAll\n                    });\n                },\n                visible: this.model.savedQueries.length > 0\n            }),\n            new ModalButton({\n                result: ModalResult.OK,\n                primary: true\n            }),\n            new ModalButton({\n                result: ModalResult.Cancel\n            })\n        ];\n    }\n\n    addAuditEvent(auditEvent: AuditEvent) {\n        if (!this.model.auditEvents) {\n            this.model.auditEvents = [];\n        }\n        this.model.auditEvents.push(auditEvent);\n    }\n\n    reorder() {\n        this.reordering = !this.reordering;\n    }\n\n    setName(savedQuery: SavedQuery, name: string) {\n        if (!Utils.eqNC(savedQuery.name, name)) {\n            this.addAuditEvent({\n                type: SavedQueryEventType.Rename,\n                detail: {\n                    query: name,\n                    oldname: savedQuery.name\n                }\n            });\n            savedQuery.name = name;\n        }\n    }\n\n    remove(savedQuery: SavedQuery, index: number) {\n        this.model.savedQueries.splice(index, 1);\n        this.removeAllButton.visible = this.model.savedQueries.length > 0;\n        this.addAuditEvent({\n            type: SavedQueryEventType.Delete,\n            detail: {\n                query: savedQuery.name\n            }\n        });\n        return false;\n    }\n\n    export(savedQuery: SavedQuery) {\n        this.savedQueriesService.exportModal(ExportSourceType.SavedQuery, savedQuery, savedQuery.name);\n        return false;\n    }\n\n    dropped(drop: CdkDragDrop<SavedQuery[]>) {\n        Utils.arrayMove(this.model.savedQueries, drop.previousIndex, drop.currentIndex);\n    }\n}\n","<form name=\"manageSavedQueries\" novalidate>\n    <sq-modal [title]=\"'msg#manageSavedQueries.title'\" [buttons]=\"buttons\">\n        <div *ngIf=\"model.savedQueries.length\" class=\"mb-3 clearfix\">\n            <button type=\"button\" class=\"btn btn-secondary float-right\" (click)=\"reorder()\">{{(reordering ? \"msg#manageSavedQueries.save\" : \"msg#manageSavedQueries.reorder\") | sqMessage}}</button>\n        </div>\n        <div class=\"mb-3\">\n            <ul class=\"list-group\" cdkDropList [cdkDropListData]=\"model.savedQueries\" [cdkDropListDisabled]=\"!reordering\" (cdkDropListDropped)=\"dropped($event)\">\n                <li *ngFor=\"let savedQuery of model.savedQueries; let $index = index\" cdkDrag \n                    role=\"button\"\n                    class=\"list-group-item list-group-item-action d-flex\"\n                    [ngClass]=\"{'cursor-move': reordering}\">\n                    <div *ngIf=\"reordering\" class=\"sq-saved-query-text\">{{savedQuery.name}}</div>\n                    <sq-editable *ngIf=\"!reordering\" [value]=\"savedQuery.name\" (valueChange)=\"setName(savedQuery, $event)\" name=\"msg#manageSavedQueries.name\" [model]=\"savedQuery\" [validators]=\"nameValidators\"></sq-editable>\n                    <div class=\"ms-auto\">\n                        <i *ngIf=\"!reordering && savedQueriesService.hasExportConfig()\" class=\"fas fa-download sq-export ms-2\" (click)=\"export(savedQuery)\" title=\"{{'msg#manageSavedQueries.export' | sqMessage}}\"></i>\n                        <a *ngIf=\"!reordering && savedQueriesService.hasRssEnabled()\" class=\"ms-2\" href=\"{{savedQueriesService.rssHref(savedQuery)}}\" target=\"_blank\" title=\"{{'msg#manageSavedQueries.rss' | sqMessage}}\">\n                            <i class=\"fas fa-rss sq-rss\"></i>\n                        </a>\n                        <i *ngIf=\"!reordering\" class=\"fas fa-times sq-remove ms-2\" (click)=\"remove(savedQuery, $index)\" title=\"{{'msg#manageSavedQueries.remove' | sqMessage}}\"></i>\n                        <i *ngIf=\"reordering\" class=\"ms-2 fas fa-bars sq-move\"></i>\n                    </div>\n                </li>\n            </ul>\n        </div>\n    </sq-modal>\n</form>\n","import { Component, Input } from '@angular/core';\nimport { Results, ExportSourceType } from \"@sinequa/core/web-services\";\nimport { SavedQueriesService } from \"../../saved-queries.service\";\nimport { SelectionService } from \"@sinequa/components/selection\";\nimport { Action } from \"@sinequa/components/action\";\n\n\n\n/**\n * Toolbar component for Export query feature.\n *\n */\n@Component({\n    selector: 'sq-query-exporter',\n    templateUrl: './query-exporter.html',\n    standalone: false\n})\nexport class BsQueryExporter {\n\n    @Input() results: Results;\n    @Input() rightAligned: boolean;\n\n    public exportAction: Action;\n\n    constructor(\n        private selectionService: SelectionService,\n        private savedQueriesService: SavedQueriesService\n    ) {\n        this.exportAction = new Action({\n            icon: 'fas fa-download',\n            title: 'msg#exportQuery.btnTitle',\n            action: (item: Action, event: Event) => {\n                this.export();\n            }\n        });\n    }\n\n    /**\n     * Check if the client has selected some records.\n     *\n     * @returns true if the client has selected some records.\n     */\n    public hasSelectedRecords(): boolean {\n        return this.selectionService.haveSelectedRecords;\n    }\n\n    /**\n     * Generic export function.\n     * <p>\n     * Opens up a dialog to let user choose the export source, export format and other parameters.\n     *\n     * @memberof QueryExporter\n     */\n    public export(): void {\n\n        this.savedQueriesService.exportModal(\n            this.hasSelectedRecords() ? ExportSourceType.Selection : ExportSourceType.Result);\n\n    }\n\n}\n","<div [sq-action-buttons]=\"{\n        items: [exportAction],\n        autoAdjust: true,\n        rightAligned: rightAligned\n    }\">\n</div>","import { Component, OnInit, Input, OnDestroy } from '@angular/core';\nimport { Action } from '@sinequa/components/action';\nimport { LoginService } from '@sinequa/core/login';\nimport { SearchService } from '@sinequa/components/search';\nimport { SavedQueriesService } from '../../saved-queries.service';\nimport { Subscription } from 'rxjs';\n\n@Component({\n    selector: 'sq-saved-queries-menu',\n    templateUrl: './saved-queries-menu.component.html',\n    standalone: false\n})\nexport class BsSavedQueriesMenuComponent implements OnInit, OnDestroy {\n  @Input() searchRoute: string = \"/search\";\n  @Input() icon: string = \"fas fa-save\";\n  @Input() autoAdjust: boolean = true;\n  @Input() autoAdjustBreakpoint: string = 'xl';\n  @Input() collapseBreakpoint: string = 'sm';\n  @Input() size: string;\n\n  menu: Action | undefined;\n\n  // Saved queries actions\n  manageAction: Action;\n  saveAction: Action;\n\n  constructor(\n    public loginService: LoginService,\n    public savedQueriesService: SavedQueriesService,\n    public searchService: SearchService) {\n\n    this.saveAction = new Action({\n      text: \"msg#savedQueries.saveCurrentQuery\",\n      action: () => { this.savedQueriesService.createSavedQueryModal(); }\n    });\n\n    this.manageAction = new Action({\n      text: \"msg#savedQueries.manageSavedQueries\",\n      action: () => { this.savedQueriesService.manageSavedQueriesModal(); }\n    });\n\n  }\n\n  ngOnInit() {\n    this.updateMenu();\n    this._savedQueriesSubscription = this.savedQueriesService.changes.subscribe({\n      next: () => { this.updateMenu(); }\n    });\n    this._loginSubscription = this.loginService.events.subscribe(event => {\n      if(event.type === \"session-changed\"){\n        this.updateMenu();\n      }\n    });\n    this._searchSubscription = this.searchService.resultsStream.subscribe(results => {\n      this.updateMenu();\n    });\n  }\n\n  private _savedQueriesSubscription: Subscription;\n  private _loginSubscription: Subscription;\n  private _searchSubscription: Subscription;\n  ngOnDestroy(){\n    if(this._savedQueriesSubscription){\n      this._savedQueriesSubscription.unsubscribe();\n    }\n    if(this._loginSubscription){\n      this._loginSubscription.unsubscribe();\n    }\n    if(this._searchSubscription){\n      this._searchSubscription.unsubscribe();\n    }\n  }\n\n  updateMenu() {\n\n    if (!this.loginService.complete) {\n      this.menu = undefined;\n      return;\n    }\n\n    const savedQueriesActions: Action[] = [];\n\n    if (this.savedQueriesService.hasSavedQuery) {\n        const scrollGroup = new Action({\n            scrollGroup: true,\n            children: this.savedQueriesService.savedqueries.map(savedQuery => new Action({\n              text: savedQuery.name,\n              data: savedQuery,\n              action: item => this.savedQueriesService.searchSavedQuery(item.data, this.searchRoute)\n          }))\n        });\n        savedQueriesActions.push(scrollGroup);\n    }\n\n    if (!!this.searchService.results) {\n      savedQueriesActions.push(this.saveAction);\n    }\n\n    if (this.savedQueriesService.hasSavedQuery) {\n      savedQueriesActions.push(this.manageAction);\n    }\n\n    this.menu = new Action({\n        icon: this.icon,\n        text: \"msg#savedQueries.savedQueries\",\n        children: savedQueriesActions\n    });\n  }\n}\n","<li *ngIf=\"!!menu && !menu.hidden\" class=\"nav-item dropdown\" \n    [sq-action-item]=\"{item: menu, size: size, autoAdjust: autoAdjust, autoAdjustBreakpoint: autoAdjustBreakpoint, inMenu: true, rightAligned: true}\"\n    [collapseBreakpoint]=\"collapseBreakpoint\"\n></li>","import { Component, Input } from '@angular/core';\nimport { SavedQueriesService, SavedQuery, SavedQueryEventType } from '../../saved-queries.service';\nimport { AbstractFacet } from '@sinequa/components/facet';\nimport { Action } from '@sinequa/components/action';\n\n@Component({\n    selector: 'sq-facet-saved-queries',\n    templateUrl: './facet-saved-queries.html',\n    styles: [`\n.saved-query-item .query-delete,\n.saved-query-item:hover .query-text {\n    display: none;\n}\n\n.saved-query-item:hover .query-delete,\n.saved-query-item .query-text {\n    display: block;\n}\n  `],\n    standalone: false\n})\nexport class BsFacetSavedQueries extends AbstractFacet  {\n    @Input() searchRoute: string = \"/search\";\n    @Input() maxQueries: number = 5;\n    @Input() enableDelete: boolean = true;\n\n    page: number = 0;\n\n    manageSavedQueries: Action;\n    previousPage: Action;\n    nextPage: Action;\n\n    constructor(\n        public savedQueriesService: SavedQueriesService) {\n        super();\n\n        this.manageSavedQueries = new Action({\n            icon: \"fas fa-cog\",\n            title: \"msg#savedQueries.manageSavedQueries\",\n            action: () => {\n                this.savedQueriesService.manageSavedQueriesModal();\n            }\n        });\n\n        this.previousPage = new Action({\n            icon: \"fas fa-chevron-left\",\n            title: \"msg#facet.previous\",\n            action: () => {\n                this.page--;\n            },\n            updater: (action: Action) => {\n                action.disabled = this.page <= 0;\n                action.hidden = this.maxPage === 0;\n            }\n        });\n\n        this.nextPage = new Action({\n            icon: \"fas fa-chevron-right\",\n            title: \"msg#facet.next\",\n            action: () => {\n                this.page++;\n            },\n            updater: (action: Action) => {\n                action.disabled = this.page >= this.maxPage;\n                action.hidden = this.maxPage === 0;\n            }\n        });\n    }\n\n    get maxPage(): number {\n        return Math.max(0, Math.ceil(this.savedQueriesService.savedqueries.length / this.maxQueries) - 1);\n    }\n\n    get startIndex(): number {\n        return this.page * this.maxQueries;\n    }\n\n    get endIndex(): number {\n        return (this.page+1) * this.maxQueries;\n    }\n\n    override get actions(): Action[] {\n        this.previousPage.update();\n        this.nextPage.update();\n        return [this.previousPage, this.nextPage, this.manageSavedQueries];\n    }\n\n    openSavedQuery(query: SavedQuery){\n        this.savedQueriesService.notifyOpenSavedQuery(query)\n        return true;\n    }\n\n    deleteQuery(query: SavedQuery, event: Event){\n        event.stopPropagation();\n        this.savedQueriesService.deleteSavedQuery(query);\n        this.page = Math.min(this.page, this.maxPage);\n        return false;\n    }\n\n    getQueryParams(savedQuery: SavedQuery) {\n        const query = this.savedQueriesService.searchService.makeQuery(savedQuery.query);\n        const queryParams = query.toJsonForQueryString();\n        return {query: queryParams};\n    }\n\n    getRouterState(savedQuery: SavedQuery) {\n        return {\n            audit: {\n                type: SavedQueryEventType.Search,\n                detail: {\n                    savedquery: savedQuery.name\n                }\n            }\n        }\n    }\n}\n","<div class=\"list-group list-group-flush\">\n    <a *ngFor=\"let query of savedQueriesService.savedqueries | slice:startIndex:endIndex\"\n        class=\"saved-query-item list-group-item list-group-item-action d-flex align-items-center\"\n        [routerLink]=\"[searchRoute]\" [queryParams]=\"getQueryParams(query)\" [state]=\"getRouterState(query)\"\n        (click)=\"openSavedQuery(query)\">\n        <span class=\"query-name me-auto text-truncate\" [title]=\"query.name\">{{ query.name }}</span>\n        <span *ngIf=\"query.query.text\" class=\"query-text text-muted small fst-italic text-right text-truncate ms-2\">\"{{ query.query.text }}\"</span>\n        <i *ngIf=\"enableDelete\" class=\"query-delete ms-2 fas fa-times\" [title]=\"'msg#savedQueries.delete' | sqMessage\" (click)=\"deleteQuery(query, $event)\"></i>\n    </a>\n    <div *ngIf=\"savedQueriesService.savedqueries.length === 0\" class=\"list-group-item text-center text-muted fst-italic small unstriped py-5\">\n        {{ 'msg#savedQueries.noSavedQuery' | sqMessage }}\n    </div>\n</div>\n","import { Component, Input } from '@angular/core';\nimport { SearchService } from '@sinequa/components/search';\nimport { RecentQueriesService, RecentQuery, RecentQueryEventType } from '../../recent-queries.service';\nimport { AbstractFacet } from '@sinequa/components/facet';\nimport { Action } from '@sinequa/components/action';\nimport { SavedQueriesService } from '../../saved-queries.service';\nimport { Utils } from '@sinequa/core/base';\nimport { Query } from '@sinequa/core/app-utils';\n\n@Component({\n    selector: 'sq-facet-recent-queries',\n    templateUrl: './facet-recent-queries.html',\n    styles: [`\n.recent-query-item .query-delete,\n.recent-query-item .query-save,\n.recent-query-item:hover .query-date {\n    display: none;\n}\n\n.recent-query-item:hover .query-delete,\n.recent-query-item:hover .query-save,\n.recent-query-item .query-date {\n    display: block;\n}\n  `],\n    standalone: false\n})\nexport class BsFacetRecentQueries extends AbstractFacet  {\n    @Input() searchRoute: string = \"/search\";\n    @Input() maxQueries: number = 5;\n    @Input() enableDelete: boolean = true;\n    @Input() enableSave: boolean = true;\n\n    page: number = 0;\n\n    previousPage: Action;\n    nextPage: Action;\n\n    constructor(\n        public searchService: SearchService,\n        public recentQueriesService: RecentQueriesService,\n        public savedQueriesService: SavedQueriesService) {\n        super();\n\n        this.previousPage = new Action({\n            icon: \"fas fa-chevron-left\",\n            title: \"msg#facet.previous\",\n            action: () => {\n                this.page--;\n            },\n            updater: (action: Action) => {\n                action.disabled = this.page <= 0;\n                action.hidden = this.maxPage === 0;\n            }\n        });\n        this.nextPage = new Action({\n            icon: \"fas fa-chevron-right\",\n            title: \"msg#facet.next\",\n            action: () => {\n                this.page++;\n            },\n            updater: (action: Action) => {\n                action.disabled = this.page >= this.maxPage;\n                action.hidden = this.maxPage === 0;\n            }\n        });\n    }\n\n    get maxPage(): number {\n        return Math.max(0, Math.ceil(this.recentQueriesService.recentqueries.length / this.maxQueries) - 1);\n    }\n\n    get startIndex(): number {\n        return this.page * this.maxQueries;\n    }\n\n    get endIndex(): number {\n        return (this.page+1) * this.maxQueries;\n    }\n\n    override get actions(): Action[] {\n        this.previousPage.update();\n        this.nextPage.update();\n        return [this.previousPage, this.nextPage];\n    }\n\n    openRecentQuery(query: RecentQuery){\n        this.recentQueriesService.notifyOpenRecentQuery(query);\n        return true;\n    }\n\n    deleteQuery(query: RecentQuery, event: Event){\n        event.stopPropagation();\n        this.recentQueriesService.deleteRecentQuery(query);\n        this.page = Math.min(this.page, this.maxPage);\n        return false;\n    }\n\n    saveQuery(query: RecentQuery, event: Event){\n        event.stopPropagation();\n        const q = Utils.extend(this.searchService.makeQuery(), Utils.copy(query.query));\n        this.savedQueriesService.createSavedQueryModal(q);\n        return false;\n    }\n\n    getQueryParams(recentQuery: Query) {\n        const query = this.searchService.makeQuery(recentQuery);\n        const queryParams = query.toJsonForQueryString();\n        return {query: queryParams};\n    }\n\n    getRouterState(recentQuery: Query) {\n        return {\n            audit: {\n                type: RecentQueryEventType.Search,\n                detail: {\n                    recentquery: recentQuery.text\n                }\n            }\n        }\n    }\n}\n","<div class=\"list-group list-group-flush\">\n    <a *ngFor=\"let query of recentQueriesService.recentqueries | slice:startIndex:endIndex\"\n        class=\"recent-query-item list-group-item list-group-item-action d-flex align-items-center\"\n        [routerLink]=\"[searchRoute]\" [queryParams]=\"getQueryParams(query.query)\" [state]=\"getRouterState(query.query)\"\n        (click)=\"openRecentQuery(query)\">\n        <span class=\"query-text me-auto text-truncate\" title=\"{{ query.query.text }}\">{{ query.query.text }}</span>\n        <span *ngIf=\"query.date\" class=\"query-date ms-2 text-muted small text-right\">{{ query.date | sqDate }}</span>\n        <i *ngIf=\"enableSave\" class=\"query-save ms-2 fas fa-save\" [title]=\"'msg#recentQueries.save' | sqMessage\" (click)=\"saveQuery(query, $event)\"></i>\n        <i *ngIf=\"enableDelete\"class=\"query-delete ms-2 fas fa-times\" [title]=\"'msg#recentQueries.delete' | sqMessage\" (click)=\"deleteQuery(query, $event)\"></i>\n    </a>\n    <div *ngIf=\"recentQueriesService.recentqueries.length === 0\" class=\"list-group-item text-center text-muted fst-italic small unstriped py-5\">\n        {{ 'msg#recentQueries.noRecentQuery' | sqMessage }}\n    </div>\n</div>\n","import { Component, Input, Output, EventEmitter } from '@angular/core';\nimport { RecentDocumentsService, RecentDocument } from '../../recent-documents.service';\nimport { AbstractFacet } from '@sinequa/components/facet';\nimport { Action } from '@sinequa/components/action';\nimport { SearchService } from '@sinequa/components/search';\n\n@Component({\n    selector: 'sq-facet-recent-documents',\n    templateUrl: './facet-recent-documents.html',\n    styles: [`\n.recent-document-item .document-delete,\n.recent-document-item:hover .document-date {\n    display: none;\n}\n\n.recent-document-item:hover .document-delete,\n.recent-document-item .document-date {\n    display: block;\n}\n  `],\n    standalone: false\n})\nexport class BsFacetRecentDocuments extends AbstractFacet  {\n    @Input() searchRoute: string = \"/preview\";\n    @Input() maxDocuments: number = 5;\n    @Input() enableDelete: boolean = true;\n    @Input() openOriginal: boolean = false;\n    @Output() documentOpened = new EventEmitter<RecentDocument>();\n\n    page: number = 0;\n\n    previousPage: Action;\n    nextPage: Action;\n\n    constructor(\n        public recentDocumentsService: RecentDocumentsService,\n        public searchService: SearchService) {\n        super();\n\n        this.previousPage = new Action({\n            icon: \"fas fa-chevron-left\",\n            title: \"msg#facet.previous\",\n            action: () => {\n                this.page--;\n            },\n            updater: (action: Action) => {\n                action.disabled = this.page <= 0;\n                action.hidden = this.maxPage === 0;\n            }\n        });\n        this.nextPage = new Action({\n            icon: \"fas fa-chevron-right\",\n            title: \"msg#facet.next\",\n            action: () => {\n                this.page++;\n            },\n            updater: (action: Action) => {\n                action.disabled = this.page >= this.maxPage;\n                action.hidden = this.maxPage === 0;\n            }\n        });\n    }\n\n    get maxPage(): number {\n        return Math.max(0, Math.ceil(this.recentDocumentsService.recentdocuments.length / this.maxDocuments) - 1);\n    }\n\n    get startIndex(): number {\n        return this.page * this.maxDocuments;\n    }\n\n    get endIndex(): number {\n        return (this.page+1) * this.maxDocuments;\n    }\n\n    override get actions(): Action[] {\n        this.previousPage.update();\n        this.nextPage.update();\n        return [this.previousPage, this.nextPage];\n    }\n\n    openRecentDocument(document: RecentDocument) {\n        if(this.openOriginal && !!document.url1){\n            this.searchService.notifyOpenOriginalDocument(<any> document);\n        }\n        this.documentOpened.emit(document); // Can be use to trigger actions, like the preview\n        return true;\n    }\n\n    deleteDocument(document: RecentDocument, event: Event){\n        this.recentDocumentsService.deleteRecentDocument(document);\n        this.page = Math.min(this.page, this.maxPage);\n        return false;\n    }\n\n    getQueryParams(document: RecentDocument) {\n        return {\n            id: document.id,\n            query: this.searchService.makeQuery().toJsonForQueryString()\n        };\n    }\n}\n","<div class=\"list-group list-group-flush\">\n    <ng-container *ngFor=\"let document of recentDocumentsService.recentdocuments | slice:startIndex:endIndex\">\n        <a *ngIf=\"openOriginal && document.url1; else internalLink\"\n            class=\"recent-document-item list-group-item list-group-item-action d-flex align-items-center\"\n            [attr.href]=\"document.url1\" target=\"_blank\" rel=\"noopener\"\n            (click)=\"openRecentDocument(document)\">\n            <span class=\"document-text me-auto text-truncate\" title=\"{{ document.title }}\">{{ document.title }}</span>\n            <span *ngIf=\"document.date\" class=\"document-date ms-2 text-muted small text-right\">{{ document.date | sqDate }}</span>\n            <i *ngIf=\"enableDelete\" class=\"document-delete ms-2 fas fa-times\" [title]=\"'msg#recentDocuments.delete' | sqMessage\" (click)=\"deleteDocument(document, $event)\"></i>\n        </a>\n        <ng-template #internalLink>\n        <a class=\"recent-document-item list-group-item list-group-item-action d-flex align-items-center\"\n            [routerLink]=\"searchRoute\" [queryParams]=\"getQueryParams(document)\"\n            (click)=\"openRecentDocument(document)\">\n            <span class=\"document-text me-auto text-truncate\" title=\"{{ document.title }}\">{{ document.title }}</span>\n            <span *ngIf=\"document.date\" class=\"document-date ms-2 text-muted small text-right\">{{ document.date | sqDate }}</span>\n            <i *ngIf=\"enableDelete\" class=\"document-delete ms-2 fas fa-times\" [title]=\"'msg#recentDocuments.delete' | sqMessage\" (click)=\"deleteDocument(document, $event)\"></i>\n        </a>\n        </ng-template>\n    </ng-container>\n    <div *ngIf=\"recentDocumentsService.recentdocuments.length === 0\" class=\"list-group-item text-center text-muted fst-italic small unstriped py-5\">\n        {{ 'msg#recentDocuments.noRecentDocument' | sqMessage }}\n    </div>\n</div>\n","import {NgModule} from \"@angular/core\";\nimport {CommonModule} from \"@angular/common\";\nimport {FormsModule, ReactiveFormsModule} from \"@angular/forms\";\nimport {DragDropModule} from \"@angular/cdk/drag-drop\";\nimport {RouterModule} from '@angular/router';\n\nimport {IntlModule} from \"@sinequa/core/intl\";\nimport {ValidationModule} from \"@sinequa/core/validation\";\n\nimport {UtilsModule} from \"@sinequa/components/utils\";\nimport {BsSelectionModule} from \"@sinequa/components/selection\";\nimport {BsModalModule} from \"@sinequa/components/modal\";\nimport {BsActionModule} from \"@sinequa/components/action\";\n\nimport {SAVEDQUERY_COMPONENTS} from \"../saved-queries.service\";\nimport {BsEditSavedQuery} from \"./edit-saved-query/edit-saved-query\";\nimport {BsManageSavedQueries} from \"./manage-saved-queries/manage-saved-queries\";\nimport {BsExportQuery} from \"./export-query/export-query\";\nimport {BsQueryExporter} from \"./query-exporter/query-exporter\";\nimport {BsSavedQueriesMenuComponent} from \"./saved-queries-menu/saved-queries-menu.component\";\nimport {BsFacetSavedQueries} from \"./facet-saved-queries/facet-saved-queries\";\nimport {BsFacetRecentQueries} from \"./facet-recent-queries/facet-recent-queries\";\nimport {BsFacetRecentDocuments} from \"./facet-recent-documents/facet-recent-documents\";\n\n@NgModule({\n    imports: [\n        CommonModule,\n        FormsModule, ReactiveFormsModule,\n        DragDropModule,\n\n        BsModalModule,\n\n        IntlModule,\n        ValidationModule,\n        RouterModule,\n\n        BsSelectionModule,\n        BsModalModule,\n        UtilsModule,\n        BsActionModule\n    ],\n    declarations: [\n        BsEditSavedQuery, BsManageSavedQueries,\n        BsExportQuery, BsQueryExporter, BsSavedQueriesMenuComponent,\n        BsFacetSavedQueries, BsFacetRecentQueries, BsFacetRecentDocuments\n    ],\n    exports: [\n        BsEditSavedQuery, BsManageSavedQueries,\n        BsExportQuery, BsQueryExporter, BsSavedQueriesMenuComponent,\n        BsFacetSavedQueries, BsFacetRecentQueries, BsFacetRecentDocuments\n    ],\n    providers: [\n        {\n            provide: SAVEDQUERY_COMPONENTS,\n            useValue: {\n                editSavedQueryModal: BsEditSavedQuery,\n                manageSavedQueriesModal: BsManageSavedQueries,\n                exportSavedQueryModal: BsExportQuery\n            }\n        }\n    ]\n})\nexport class BsSavedQueriesModule {\n}\n","export default {\n    \"savedQueries\": {\n        \"savedQueries\": \"Saved Queries\",\n        \"saveCurrentQuery\": \"Save Current Query\",\n        \"manageSavedQueries\": \"Manage Saved Queries\",\n        \"savedQueryAlreadyExists\": \"A saved query with that name already exists. Would you like to replace it?\",\n        \"noSavedQuery\": \"You have not yet saved a search query...\",\n        \"delete\": \"Delete this saved query\"\n    },\n\n    \"recentQueries\": {\n        \"noRecentQuery\": \"You have not yet searched for something...\",\n        \"delete\": \"Delete this recent query\",\n        \"save\": \"Save this query\"\n    },\n\n    \"recentDocuments\": {\n        \"recentDocuments\": \"Recent documents\",\n        \"noRecentDocument\": \"You have not yet opened a document...\",\n        \"delete\": \"Delete this recent document\"\n    },\n\n    \"editSavedQuery\": {\n        \"title\": \"Saved Query\",\n        \"name\": \"Name\"\n    },\n\n    \"exportQuery\": {\n        \"dialogTitle\": \"Export\",\n        \"dialogOutputFormat\": \"Output format\",\n        \"dialogMaxCount\": \"Max rows\",\n        \"dialogSourceType\": \"Export from\",\n        \"dialogResult\": \"Current result\",\n        \"dialogSelection\": \"Current selection\",\n        \"btnTitle\": \"Export results\",\n        \"exportResult\": \"Export result as {type}\",\n        \"exportSelection\": \"Export selection as {type}\",\n        \"btnDownload\": \"Download\",\n        \"btnClose\": \"Close\",\n        \"successNotification\": \"Download complete\",\n        \"exportedColumns\": \"Columns to export\",\n        \"exportedColumnsLabelTooltip\": \"Select the columns that you want to export, an empty selection means exporting all columns\",\n        \"dialogMaxCountTooltip\": \"By default, the number of results is limited to {count}\"\n    },\n\n    \"manageSavedQueries\": {\n        \"title\": \"Manage Saved Queries\",\n        \"save\": \"Save\",\n        \"reorder\": \"Reorder\",\n        \"remove\": \"Remove\",\n        \"removeAll\": \"Remove all\",\n        \"export\": \"Export\",\n        \"name\": \"Name\",\n        \"rss\": \"RSS Feed\"\n    },\n\n};\n","export default {\n    \"savedQueries\": {\n        \"savedQueries\": \"Requêtes sauvegardées\",\n        \"saveCurrentQuery\": \"Enregistrer la requête courante\",\n        \"manageSavedQueries\": \"Gérer les requêtes sauvegardées\",\n        \"savedQueryAlreadyExists\": \"Une requête sauvegardée avec ce nom existe déjà. Voulez-vous la remplacer ?\",\n        \"noSavedQuery\": \"Vous n'avez pas encore enregistré de requête de recherche...\",\n        \"delete\": \"Supprimer cette requête enregistrée\"\n    },\n\n    \"recentQueries\": {\n        \"noRecentQuery\": \"Vous n'avez pas encore effectué de recherche...\",\n        \"delete\": \"Supprimer cette requête\",\n        \"save\": \"Enregistrer cette requête\"\n    },\n\n    \"recentDocuments\": {\n        \"recentDocuments\": \"Documents récents\",\n        \"noRecentDocument\": \"Vous n'avez pas encore ouvert de document...\",\n        \"delete\": \"Supprimer ce document récent\"\n    },\n\n    \"editSavedQuery\": {\n        \"title\": \"Requête sauvegardée\",\n        \"name\": \"Nom\"\n    },\n\n    \"exportQuery\": {\n        \"dialogTitle\": \"Export\",\n        \"dialogOutputFormat\": \"Format de sortie\",\n        \"dialogMaxCount\": \"Nb max de lignes\",\n        \"dialogSourceType\": \"Exporter depuis\",\n        \"dialogResult\": \"Résultat courant\",\n        \"dialogSelection\": \"Sélection courante\",\n        \"btnTitle\": \"Exporter les résultats\",\n        \"exportResult\": \"Exporter le résultat en {type}\",\n        \"exportSelection\": \"Exporter la sélection en {type}\",\n        \"btnDownload\": \"Télécharger\",\n        \"btnClose\": \"Fermer\",\n        \"successNotification\": \"Téléchargement terminé\",\n        \"exportedColumns\": \"Colonnes à exporter\",\n        \"exportedColumnsLabelTooltip\": \"Sélectionnez les colonnes que vous souhaitez exporter, une sélection vide signifie la sélection de tous le colonnes\",\n        \"dialogMaxCountTooltip\": \"Par défaut, le nombre de résultats est limité à {count}\"\n    },\n\n    \"manageSavedQueries\": {\n        \"title\": \"Gérer les requêtes sauvegardées\",\n        \"save\": \"Enregistrer\",\n        \"reorder\": \"Réorganiser\",\n        \"remove\": \"Effacer\",\n        \"removeAll\": \"Effacer tout\",\n        \"export\": \"Exporter\",\n        \"name\": \"Nom\",\n        \"rss\": \"Flux RSS\"\n    },\n\n};\n","export default {\n    \"savedQueries\": {\n        \"savedQueries\": \"Gespeicherte Suchanfragen\",\n        \"saveCurrentQuery\": \"Aktuelle Suchanfrage speichern\",\n        \"manageSavedQueries\": \"Aktuelle Suchanfragen verwalten\",\n        \"savedQueryAlreadyExists\": \"Es existiert bereits eine Suchanfrage mit diesem Namen. Möchten Sie sie ersetzen?\",\n        \"noSavedQuery\": \"Sie haben noch keine Suchanfrage gespeichert...\",\n        \"delete\": \"Löschen Sie diese gespeicherte Suche\"\n    },\n\n    \"recentQueries\": {\n        \"noRecentQuery\": \"Sie haben noch keine Suche durchgeführt...\",\n        \"delete\": \"Löschen Sie diese letzte Suche\",\n        \"save\": \"Speichern Sie diese letzte Suche\"\n    },\n\n    \"recentDocuments\": {\n        \"recentDocuments\": \"Kürzlich angesehenes Dokument\",\n        \"noRecentDocument\": \"Sie haben kein Dokument angezeigt\",\n        \"delete\": \"Löschen Sie dieses kürzlich angezeigte Dokument\"\n    },\n\n    \"editSavedQuery\": {\n        \"title\": \"Gespeicherte Suchanfrage\",\n        \"name\": \"Name\"\n    },\n\n    \"exportQuery\": {\n        \"dialogTitle\": \"Export\",\n        \"dialogOutputFormat\": \"Ausgabeformat\",\n        \"dialogMaxCount\": \"Maximale Anzahl der Zeilen\",\n        \"dialogSourceType\": \"Exportiere ...\",\n        \"dialogResult\": \"aktuelle Ergebnisliste\",\n        \"dialogSelection\": \"aktuelle Auswahl\",\n        \"btnTitle\": \"Export\",\n        \"exportResult\": \"Exportiere die Ergebnisliste als {type}\",\n        \"exportSelection\": \"Exportiere die Auswahl als {type}\",\n        \"btnDownload\": \"Herunterladen\",\n        \"btnClose\": \"Schließen\",\n        \"successNotification\": \"Herunterladen beendet\",\n        \"exportedColumns\": \"Zu exportierende Spalten\",\n        \"exportedColumnsLabelTooltip\": \"Wählen Sie die Spalten aus, die Sie exportieren möchten. Eine leere Auswahl bedeutet, dass alle Spalten exportiert werden\",\n        \"dialogMaxCountTooltip\": \"Standardmäßig ist die Anzahl der Ergebnisse auf {count} begrenzt\"\n    },\n\n    \"manageSavedQueries\": {\n        \"title\": \"Gespeicherte Suchanfragen verwalten\",\n        \"save\": \"Aufzeichnung\",\n        \"reorder\": \"Neu sortieren\",\n        \"remove\": \"Entfernen\",\n        \"removeAll\": \"Alle entfernen\",\n        \"export\": \"Exportieren\",\n        \"name\": \"Name\",\n        \"rss\": \"RSS-Feed\"\n    },\n\n};\n","import {Utils} from \"@sinequa/core/base\";\nimport {enSearch, frSearch, deSearch} from \"@sinequa/components/search\";\nimport {enSelection, frSelection, deSelection} from \"@sinequa/components/selection\";\nimport {enModal, frModal, deModal} from \"@sinequa/components/modal\";\n\nimport _enSavedQueries from \"./en\";\nimport _frSavedQueries from \"./fr\";\nimport _deSavedQueries from \"./de\";\n\nconst enSavedQueries = Utils.merge({}, _enSavedQueries, enSearch, enSelection, enModal);\nconst frSavedQueries = Utils.merge({}, _frSavedQueries, frSearch, frSelection, frModal);\nconst deSavedQueries = Utils.merge({}, _deSavedQueries, deSearch, deSelection, deModal);\n\nexport { enSavedQueries, frSavedQueries, deSavedQueries };\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1","i2","i3","i4","i5","i4.SavedQueriesService","i6","i7","i8","i9","i10","i11","i1.SavedQueriesService","i2.SavedQueriesService","i2.RecentQueriesService","i3.SavedQueriesService","i1.RecentDocumentsService"],"mappings":"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"}