@sinequa/atomic-angular 2.1.0 → 2.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sinequa/atomic-angular",
3
- "version": "2.1.0",
3
+ "version": "2.3.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -35,7 +35,7 @@
35
35
  "@angular/core": "^22.0.0",
36
36
  "@angular/aria": "^22.2.0",
37
37
  "@sinequa/galactik": "^2.0.0",
38
- "@sinequa/atomic": ">=2.8.0",
38
+ "@sinequa/atomic": ">=2.9.0",
39
39
  "vanilla-calendar-pro": "^3.4.0",
40
40
  "chart.js": "^4.4.0",
41
41
  "chartjs-chart-matrix": "^3.0.0",
@@ -112,6 +112,10 @@
112
112
  "scope": "user-profile",
113
113
  "path": "features/user-profile/i18n"
114
114
  },
115
+ {
116
+ "scope": "settings",
117
+ "path": "features/settings/i18n"
118
+ },
115
119
  {
116
120
  "scope": "multi-selection-toolbar",
117
121
  "path": "components/multi-selection-toolbar/i18n"
@@ -1,4 +1,4 @@
1
- import { SecurityPrincipal, UpdateContainerInput, UploadJobStatus } from "@sinequa/atomic";
1
+ import { SecurityPrincipal, UpdateWorkspaceInput, UploadJobStatus } from "@sinequa/atomic";
2
2
  import * as i0 from "@angular/core";
3
3
  import { AfterContentInit, InjectionToken, PipeTransform, Signal } from "@angular/core";
4
4
  import { DetailedError } from "tus-js-client";
@@ -219,7 +219,7 @@ export declare const WorkspacesStore: import("@angular/core").Type<{
219
219
  loadMore: () => Promise<Workspace[]>;
220
220
  fetch: (id: string) => Promise<Workspace>;
221
221
  create: ({ name, description, tags, owners, readers }: CreateWorkspaceInput) => Promise<Workspace>;
222
- update: (id: string, patch: UpdateContainerInput) => Promise<Workspace | null>;
222
+ update: (id: string, patch: UpdateWorkspaceInput) => Promise<Workspace | null>;
223
223
  remove: (ids: string[]) => Promise<RemoveWorkspacesResult>;
224
224
  forget: (id: string) => void;
225
225
  loadDocuments: (workspaceId: string, signal?: AbortSignal) => Promise<WorkspaceDocument[]>;
@@ -1521,7 +1521,7 @@ export declare class WorkspaceList {
1521
1521
  loadMore: () => Promise<Workspace[]>;
1522
1522
  fetch: (id: string) => Promise<Workspace>;
1523
1523
  create: ({ name, description, tags, owners, readers }: import("@sinequa/atomic-angular/document-workspaces").CreateWorkspaceInput) => Promise<Workspace>;
1524
- update: (id: string, patch: import("@sinequa/atomic").UpdateContainerInput) => Promise<Workspace | null>;
1524
+ update: (id: string, patch: import("@sinequa/atomic").UpdateWorkspaceInput) => Promise<Workspace | null>;
1525
1525
  remove: (ids: string[]) => Promise<import("@sinequa/atomic-angular/document-workspaces").RemoveWorkspacesResult>;
1526
1526
  forget: (id: string) => void;
1527
1527
  loadDocuments: (workspaceId: string, signal?: AbortSignal) => Promise<import("@sinequa/atomic-angular/document-workspaces").WorkspaceDocument[]>;
@@ -1551,7 +1551,7 @@ export declare class WorkspaceList {
1551
1551
  labelKey: string;
1552
1552
  }[];
1553
1553
  protected readonly viewMode: import("@angular/core").WritableSignal<ViewMode$1>;
1554
- protected readonly status: import("@angular/core").WritableSignal<"loading" | "ready" | "error">;
1554
+ protected readonly status: import("@angular/core").WritableSignal<"error" | "loading" | "ready">;
1555
1555
  protected readonly loadError: import("@angular/core").WritableSignal<Message | null>;
1556
1556
  protected readonly refreshError: import("@angular/core").WritableSignal<string | null>;
1557
1557
  protected readonly loadingMore: import("@angular/core").WritableSignal<boolean>;
@@ -2193,7 +2193,7 @@ export declare class WorkspaceDetail {
2193
2193
  protected readonly query: import("@angular/core").WritableSignal<string>;
2194
2194
  /** The search box, bound to `query`. */
2195
2195
  protected readonly searchForm: import("@angular/forms/signals").FieldTree<string, string | number, "writable">;
2196
- protected readonly status: import("@angular/core").WritableSignal<"loading" | "ready" | "error">;
2196
+ protected readonly status: import("@angular/core").WritableSignal<"error" | "loading" | "ready">;
2197
2197
  protected readonly loadError: import("@angular/core").WritableSignal<Message | null>;
2198
2198
  protected readonly refreshError: import("@angular/core").WritableSignal<string | null>;
2199
2199
  protected readonly refreshing: import("@angular/core").WritableSignal<boolean>;
@@ -2328,7 +2328,7 @@ export declare function injectWorkspaceMention(options?: WorkspaceMentionOptions
2328
2328
  /** The workspaces in each category — the whole list, not what the search left. */
2329
2329
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2330
2330
  /** Whether the first page is loading, ready or failed. */
2331
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2331
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2332
2332
  /** More workspaces than the loaded ones exist on the server: `loadMore()` fetches the next page. */
2333
2333
  hasMore: import("@angular/core").Signal<boolean>;
2334
2334
  /** The loading cap is reached: some workspaces will never be offered, search included. */
@@ -2375,7 +2375,7 @@ export declare const WORKSPACE_MENTION: InjectionToken<{
2375
2375
  /** The workspaces in each category — the whole list, not what the search left. */
2376
2376
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2377
2377
  /** Whether the first page is loading, ready or failed. */
2378
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2378
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2379
2379
  /** More workspaces than the loaded ones exist on the server: `loadMore()` fetches the next page. */
2380
2380
  hasMore: import("@angular/core").Signal<boolean>;
2381
2381
  /** The loading cap is reached: some workspaces will never be offered, search included. */
@@ -2526,7 +2526,7 @@ export declare class WorkspaceMention implements WorkspaceMentionApi, AfterConte
2526
2526
  labelKey: string;
2527
2527
  }[];
2528
2528
  readonly counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2529
- readonly status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2529
+ readonly status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2530
2530
  readonly hasMore: import("@angular/core").Signal<boolean>;
2531
2531
  readonly truncated: import("@angular/core").Signal<boolean>;
2532
2532
  readonly loadingMore: import("@angular/core").Signal<boolean>;
@@ -2592,11 +2592,11 @@ export declare class WorkspaceMention implements WorkspaceMentionApi, AfterConte
2592
2592
  */
2593
2593
  export declare class WorkspaceMentionNew implements AfterContentInit {
2594
2594
  /** The button's variant. */
2595
- readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "none" | "light-accent" | "accent" | "tertiary" | null | undefined>;
2595
+ readonly variant: import("@angular/core").InputSignal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
2596
2596
  /** The button's colour scheme. */
2597
2597
  readonly scheme: import("@angular/core").InputSignal<"default" | "neutral" | null | undefined>;
2598
2598
  /** The button's size. */
2599
- readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "small" | "xs" | "xsmall" | "medium" | "large" | null | undefined>;
2599
+ readonly size: import("@angular/core").InputSignal<"small" | "medium" | "md" | "lg" | "sm" | "xs" | "xsmall" | "large" | null | undefined>;
2600
2600
  private readonly mention;
2601
2601
  private readonly slot;
2602
2602
  /** Whether the host put its own content inside: the icon and the label then stay out. */
@@ -2639,7 +2639,7 @@ export declare class WorkspaceMentionRows {
2639
2639
  labelKey: string;
2640
2640
  }[];
2641
2641
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2642
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2642
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2643
2643
  hasMore: import("@angular/core").Signal<boolean>;
2644
2644
  truncated: import("@angular/core").Signal<boolean>;
2645
2645
  loadingMore: import("@angular/core").Signal<boolean>;
@@ -2661,9 +2661,9 @@ export declare class WorkspaceMentionRows {
2661
2661
  /** The search box of the enclosing `<workspace-mention>`: it narrows what the menu offers. */
2662
2662
  export declare class WorkspaceMentionSearch {
2663
2663
  /** The size of the box, as `<SearchInput>` sizes it. */
2664
- readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | null | undefined>;
2664
+ readonly size: import("@angular/core").InputSignal<"md" | "lg" | "sm" | null | undefined>;
2665
2665
  /** The size of the text, as `<SearchInput>` sizes it; follows `size` when absent. */
2666
- readonly textSize: import("@angular/core").InputSignal<"sm" | "base" | null | undefined>;
2666
+ readonly textSize: import("@angular/core").InputSignal<"base" | "sm" | null | undefined>;
2667
2667
  /** The hint shown in the empty box; the translated "Search workspace..." when absent. */
2668
2668
  readonly placeholder: import("@angular/core").InputSignal<string | undefined>;
2669
2669
  /** The accessible name of the box; the placeholder when absent. */
@@ -2710,7 +2710,7 @@ export declare class WorkspaceMentionSelectAll {
2710
2710
  labelKey: string;
2711
2711
  }[];
2712
2712
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2713
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2713
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2714
2714
  hasMore: import("@angular/core").Signal<boolean>;
2715
2715
  truncated: import("@angular/core").Signal<boolean>;
2716
2716
  loadingMore: import("@angular/core").Signal<boolean>;
@@ -2746,7 +2746,7 @@ export declare class WorkspaceMentionTabs {
2746
2746
  labelKey: string;
2747
2747
  }[];
2748
2748
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2749
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2749
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2750
2750
  hasMore: import("@angular/core").Signal<boolean>;
2751
2751
  truncated: import("@angular/core").Signal<boolean>;
2752
2752
  loadingMore: import("@angular/core").Signal<boolean>;
@@ -2798,7 +2798,7 @@ export declare class WorkspacePicker {
2798
2798
  /** The documents are in the workspace, and the check mark has been seen. */
2799
2799
  readonly completed: import("@angular/core").OutputEmitterRef<Workspace>;
2800
2800
  private readonly store;
2801
- protected readonly status: import("@angular/core").WritableSignal<"loading" | "ready" | "error">;
2801
+ protected readonly status: import("@angular/core").WritableSignal<"error" | "loading" | "ready">;
2802
2802
  protected readonly busyId: import("@angular/core").WritableSignal<string | null>;
2803
2803
  protected readonly doneId: import("@angular/core").WritableSignal<string | null>;
2804
2804
  protected readonly error: import("@angular/core").WritableSignal<Message | null>;
@@ -1,7 +1,7 @@
1
1
  import * as i0 from "@angular/core";
2
2
  import { ApplicationRef, ChangeDetectorRef, DestroyRef, ElementRef, EnvironmentProviders, InjectionToken, Injector, OnDestroy, OnInit, PipeTransform, Provider, ResourceRef, Signal, TemplateRef, Type, WritableSignal } from "@angular/core";
3
3
  import { TranslocoService } from "@jsverse/transloco";
4
- import { Aggregation, AggregationItem, Article, AtomicClient, AtomicClientConfig, AuditEventType, AuditEventTypeValues, AuditEvents, CCApp, CCColumn, CCQuery, CCSortingChoice, CCWebService, Conversion, Credentials, CustomHighlights, DidYouMeanAction, ExportOutputFormat, ExportQueryModel, Filter as Filter$1, FilterOperator, KeyOf, LegacyFilter, LinkResult, PreviewData, Principal, Query, QueryParams, RequestOptions, Result, SpellingCorrectionMode, Suggestion, TextChunk, TextLocation, TreeAggregation, TreeAggregationNode, UserProfile as UserProfile$1, getRelativeDate } from "@sinequa/atomic";
4
+ import { Aggregation, AggregationItem, Article, AtomicClient, AtomicClientConfig, AuditEventType, AuditEventTypeValues, AuditEvents, CCApp, CCColumn, CCQuery, CCSortingChoice, CCWebService, Conversion, Credentials, CustomHighlights, DidYouMeanAction, ExportOutputFormat, ExportQueryModel, Filter as Filter$1, FilterOperator, KeyOf, LegacyFilter, LinkResult, PreviewData, Principal, Query, QueryParams, RequestOptions, Result, SpellingCorrectionMode, Suggestion, TextChunk, TextLocation, TreeAggregation, TreeAggregationNode, UserProfile, getRelativeDate } from "@sinequa/atomic";
5
5
  import { CanActivateFn, NavigationEnd, Params, ResolveFn, Route, Router } from "@angular/router";
6
6
  import { VariantProps } from "class-variance-authority";
7
7
  import { BreakpointObserverService, DialogComponent, DialogEvent, DialogResult, DropdownDirective, PopoverDirective, SheetComponent } from "@sinequa/galactik";
@@ -1050,7 +1050,7 @@ export declare class MetadataComponent {
1050
1050
  size: import("@angular/core").InputSignal<"small" | "sm" | "md" | "xs" | "xsmall" | "medium" | null | undefined>;
1051
1051
  scheme: import("@angular/core").InputSignal<"error" | "sage" | "success" | "almond" | "pink" | "grey" | "yellow" | "cherry" | "indigo" | "cyan" | "warning" | "info" | null | undefined>;
1052
1052
  metadata: import("@angular/core").InputSignal<(string & Record<never, never>) | KeyOf<Article>>;
1053
- article: import("@angular/core").InputSignal<(string & Record<never, never>) | Partial<Article>>;
1053
+ article: import("@angular/core").InputSignal<Partial<Article> | (string & Record<never, never>)>;
1054
1054
  limit: import("@angular/core").InputSignalWithTransform<number | undefined, string | number | undefined>;
1055
1055
  items: import("@angular/core").Signal<string[]>;
1056
1056
  handleClick(event: Event, item: LegacyFilter): void;
@@ -1218,7 +1218,7 @@ export declare class MissingTermsComponent {
1218
1218
  }, {}, never, never, true, never>;
1219
1219
  }
1220
1220
  export declare const multiSelectionToolbarVariants: (props?: ({
1221
- variant?: "dark" | "light" | "glassy" | null | undefined;
1221
+ variant?: "light" | "dark" | "glassy" | null | undefined;
1222
1222
  } & import("class-variance-authority/types").ClassProp) | undefined) => string;
1223
1223
  export type MultiSelectionToolbarVariants = VariantProps<typeof multiSelectionToolbarVariants>;
1224
1224
  export declare class MultiSelectionToolbarComponent {
@@ -1607,7 +1607,7 @@ export declare class MultiSelectionToolbarComponent {
1607
1607
  feedback?: import("@sinequa/atomic-angular").CFeedback;
1608
1608
  } | undefined;
1609
1609
  readonly class: import("@angular/core").InputSignal<string>;
1610
- readonly variant: import("@angular/core").InputSignal<"dark" | "light" | "glassy" | null | undefined>;
1610
+ readonly variant: import("@angular/core").InputSignal<"light" | "dark" | "glassy" | null | undefined>;
1611
1611
  readonly updatedCollections: import("@angular/core").OutputEmitterRef<void>;
1612
1612
  readonly count: import("@angular/core").Signal<number>;
1613
1613
  readonly variants: import("@angular/core").Signal<string>;
@@ -3259,7 +3259,7 @@ export declare const UserSettingsStore: import("@angular/core").Type<{
3259
3259
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
3260
3260
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
3261
3261
  language?: import("@angular/core").Signal<string | undefined> | undefined;
3262
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
3262
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
3263
3263
  agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
3264
3264
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
3265
3265
  isDebugMode: import("@angular/core").Signal<boolean>;
@@ -4654,7 +4654,7 @@ export declare class ApplicationService {
4654
4654
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
4655
4655
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
4656
4656
  language?: import("@angular/core").Signal<string | undefined> | undefined;
4657
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
4657
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
4658
4658
  agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
4659
4659
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
4660
4660
  isDebugMode: import("@angular/core").Signal<boolean>;
@@ -5653,7 +5653,7 @@ export declare class AutocompleteService {
5653
5653
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
5654
5654
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
5655
5655
  language?: import("@angular/core").Signal<string | undefined> | undefined;
5656
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
5656
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
5657
5657
  agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
5658
5658
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
5659
5659
  isDebugMode: import("@angular/core").Signal<boolean>;
@@ -7226,7 +7226,7 @@ export declare class SavedSearchesService {
7226
7226
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
7227
7227
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
7228
7228
  language?: import("@angular/core").Signal<string | undefined> | undefined;
7229
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
7229
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
7230
7230
  agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
7231
7231
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
7232
7232
  isDebugMode: import("@angular/core").Signal<boolean>;
@@ -7566,7 +7566,7 @@ export declare class SearchService {
7566
7566
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
7567
7567
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
7568
7568
  language?: import("@angular/core").Signal<string | undefined> | undefined;
7569
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
7569
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
7570
7570
  agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
7571
7571
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
7572
7572
  isDebugMode: import("@angular/core").Signal<boolean>;
@@ -7839,7 +7839,7 @@ export declare class UserProfileService {
7839
7839
  * @param userId - Signal holding the ID of the user; `undefined` leaves the resource idle.
7840
7840
  * @returns A resource exposing the UserProfile.
7841
7841
  */
7842
- getUserProfile(userId: Signal<string | undefined>): ResourceRef<UserProfile$1 | undefined>;
7842
+ getUserProfile(userId: Signal<string | undefined>): ResourceRef<UserProfile | undefined>;
7843
7843
  static ɵfac: i0.ɵɵFactoryDeclaration<UserProfileService, never>;
7844
7844
  static ɵprov: i0.ɵɵInjectableDeclaration<any>;
7845
7845
  }
@@ -8393,7 +8393,7 @@ export declare class ShowBookmarkDirective {
8393
8393
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
8394
8394
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
8395
8395
  language?: import("@angular/core").Signal<string | undefined> | undefined;
8396
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
8396
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
8397
8397
  agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
8398
8398
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
8399
8399
  isDebugMode: import("@angular/core").Signal<boolean>;
@@ -11844,11 +11844,6 @@ export declare class FeatureFlagsDialogComponent {
11844
11844
  }
11845
11845
  /** Imperative entry point: `await FeatureFlags.call(undefined, { injector })`. */
11846
11846
  export declare const FeatureFlags: import("@sinequa/galactik").Callable<void, DialogResult>;
11847
- /** Shortcuts sharing a heading. A group with no `titleKey` is the ungrouped one, listed first. */
11848
- type ShortcutGroup = {
11849
- titleKey?: string;
11850
- items: readonly Shortcut[];
11851
- };
11852
11847
  /**
11853
11848
  * Lists the keyboard shortcuts currently available.
11854
11849
  *
@@ -11868,18 +11863,38 @@ type ShortcutGroup = {
11868
11863
  export declare class KeyboardShortcutsDialogComponent {
11869
11864
  protected readonly call: import("@sinequa/galactik").CallRef<void, DialogResult>;
11870
11865
  readonly dialog: import("@angular/core").Signal<DialogComponent | undefined>;
11866
+ constructor();
11867
+ static ɵfac: i0.ɵɵFactoryDeclaration<KeyboardShortcutsDialogComponent, never>;
11868
+ static ɵcmp: i0.ɵɵComponentDeclaration<KeyboardShortcutsDialogComponent, "keyboard-shortcuts-dialog", never, {}, {}, never, never, true, never>;
11869
+ }
11870
+ /** Imperative entry point: `void KeyboardShortcutsDialog.call()`. */
11871
+ export declare const KeyboardShortcutsDialog: import("@sinequa/galactik").Callable<void, DialogResult>;
11872
+ /** Shortcuts sharing a heading. A group with no `titleKey` is the ungrouped one, listed first. */
11873
+ type ShortcutGroup = {
11874
+ titleKey?: string;
11875
+ items: readonly Shortcut[];
11876
+ };
11877
+ /**
11878
+ * Lists the keyboard shortcuts currently available.
11879
+ *
11880
+ * The list observes the registry rather than holding a hand-written one, which is what keeps the
11881
+ * documentation from drifting away from what actually works. The consequence is deliberate: rendered
11882
+ * on a page that registers nothing, it lists nothing. That is more honest than a list of which half
11883
+ * does not apply here.
11884
+ *
11885
+ * A shortcut is listed only if it carries a `labelKey`. Labels and headings are translated at render
11886
+ * time, never at registration: the interface language changes without a page reload.
11887
+ */
11888
+ export declare class KeyboardShortcutsListComponent {
11871
11889
  private readonly keyboard;
11872
11890
  /**
11873
11891
  * Active shortcuts, grouped by heading. The ungrouped ones come first — they are the ones that
11874
11892
  * work everywhere, so they read as an introduction rather than as a leftover.
11875
11893
  */
11876
11894
  protected readonly groups: import("@angular/core").Signal<readonly ShortcutGroup[]>;
11877
- constructor();
11878
- static ɵfac: i0.ɵɵFactoryDeclaration<KeyboardShortcutsDialogComponent, never>;
11879
- static ɵcmp: i0.ɵɵComponentDeclaration<KeyboardShortcutsDialogComponent, "keyboard-shortcuts-dialog", never, {}, {}, never, never, true, never>;
11895
+ static ɵfac: i0.ɵɵFactoryDeclaration<KeyboardShortcutsListComponent, never>;
11896
+ static ɵcmp: i0.ɵɵComponentDeclaration<KeyboardShortcutsListComponent, "keyboard-shortcuts-list", never, {}, {}, never, never, true, never>;
11880
11897
  }
11881
- /** Imperative entry point: `void KeyboardShortcutsDialog.call()`. */
11882
- export declare const KeyboardShortcutsDialog: import("@sinequa/galactik").Callable<void, DialogResult>;
11883
11898
  /** Model of the override-user form. */
11884
11899
  export interface OverrideUserModel {
11885
11900
  username: string;
@@ -18202,7 +18217,7 @@ export declare class RecentSearchesComponent {
18202
18217
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
18203
18218
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
18204
18219
  language?: import("@angular/core").Signal<string | undefined> | undefined;
18205
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
18220
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
18206
18221
  agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
18207
18222
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
18208
18223
  isDebugMode: import("@angular/core").Signal<boolean>;
@@ -18313,7 +18328,7 @@ export declare class SavedSearchPopover {
18313
18328
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
18314
18329
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
18315
18330
  language?: import("@angular/core").Signal<string | undefined> | undefined;
18316
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
18331
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
18317
18332
  agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
18318
18333
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
18319
18334
  isDebugMode: import("@angular/core").Signal<boolean>;
@@ -18395,7 +18410,7 @@ export declare class SavedSearchesComponent {
18395
18410
  alerts: import("@angular/core").Signal<import("@sinequa/atomic-angular").Alert[]>;
18396
18411
  collapseAssistant?: import("@angular/core").Signal<boolean | undefined> | undefined;
18397
18412
  language?: import("@angular/core").Signal<string | undefined> | undefined;
18398
- userTheme: import("@angular/core").Signal<"dark" | "light" | "system" | undefined>;
18413
+ userTheme: import("@angular/core").Signal<"light" | "dark" | "system" | undefined>;
18399
18414
  agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | import("@angular/core").Signal<undefined>;
18400
18415
  disabledHighlightCategories: import("@angular/core").Signal<string[]>;
18401
18416
  isDebugMode: import("@angular/core").Signal<boolean>;
@@ -18465,17 +18480,150 @@ export declare class SavedSearchesComponent {
18465
18480
  };
18466
18481
  }, {}, never, never, true, never>;
18467
18482
  }
18468
- export declare class UserProfileDialog {
18469
- protected readonly call: import("@sinequa/galactik").CallRef<void, DialogResult>;
18483
+ export type SettingsPanelId = "account" | "appearance" | "shortcuts";
18484
+ /** Payload of `Settings.call()`: the panel to show first (default `account`). */
18485
+ export interface SettingsDialogProps {
18486
+ panel?: SettingsPanelId;
18487
+ }
18488
+ /**
18489
+ * The user settings: a navigation on the left, the selected panel on the right.
18490
+ *
18491
+ * The panels are plain components, not dialogs — only this shell is imperative.
18492
+ */
18493
+ export declare class SettingsDialogComponent {
18494
+ protected readonly call: import("@sinequa/galactik").CallRef<SettingsDialogProps, DialogResult>;
18470
18495
  private readonly dialog;
18496
+ protected readonly items: {
18497
+ id: SettingsPanelId;
18498
+ labelKey: string;
18499
+ }[];
18500
+ protected readonly panel: import("@angular/core").WritableSignal<SettingsPanelId>;
18501
+ /** Set when another instance is already open: this one only redirects it, then ends. */
18502
+ protected readonly duplicate: boolean;
18471
18503
  constructor();
18472
- static ɵfac: i0.ɵɵFactoryDeclaration<UserProfileDialog, never>;
18473
- static ɵcmp: i0.ɵɵComponentDeclaration<UserProfileDialog, "user-profile-dialog, userprofiledialog, UserProfileDialog", never, {}, {}, never, never, true, never>;
18504
+ static ɵfac: i0.ɵɵFactoryDeclaration<SettingsDialogComponent, never>;
18505
+ static ɵcmp: i0.ɵɵComponentDeclaration<SettingsDialogComponent, "settings-dialog", never, {}, {}, never, never, true, never>;
18506
+ }
18507
+ /** Imperative entry point: `await Settings.call({ panel: "appearance" })`. */
18508
+ export declare const Settings: import("@sinequa/galactik").Callable<SettingsDialogProps, DialogResult>;
18509
+ /**
18510
+ * The user's profile, plus the actions that act on the account as a whole: reset the settings, and —
18511
+ * for an administrator — impersonate another user.
18512
+ *
18513
+ * Those actions open their own dialogs, so the injector is handed over explicitly: `createCallable`
18514
+ * mounts outside this panel's tree and would otherwise lose the scoped providers.
18515
+ */
18516
+ export declare class SettingsAccountPanelComponent {
18517
+ protected readonly principalStore: {
18518
+ id: import("@angular/core").Signal<string>;
18519
+ id2: import("@angular/core").Signal<string>;
18520
+ id3: import("@angular/core").Signal<string>;
18521
+ id4: import("@angular/core").Signal<string>;
18522
+ id5: import("@angular/core").Signal<string>;
18523
+ name: import("@angular/core").Signal<string>;
18524
+ email: import("@angular/core").Signal<string>;
18525
+ description: import("@angular/core").Signal<string>;
18526
+ longName: import("@angular/core").Signal<string>;
18527
+ userId: import("@angular/core").Signal<string>;
18528
+ fullName: import("@angular/core").Signal<string>;
18529
+ isAdministrator: import("@angular/core").Signal<boolean>;
18530
+ isDelegatedAdmin: import("@angular/core").Signal<boolean>;
18531
+ editablePartition?: import("@angular/core").Signal<boolean | undefined> | undefined;
18532
+ passwordExpirationDate?: import("@angular/core").Signal<string | null | undefined> | undefined;
18533
+ param1: import("@angular/core").Signal<string>;
18534
+ param2: import("@angular/core").Signal<string>;
18535
+ param3: import("@angular/core").Signal<string>;
18536
+ param4: import("@angular/core").Signal<string>;
18537
+ param5: import("@angular/core").Signal<string>;
18538
+ param6: import("@angular/core").Signal<string>;
18539
+ param7: import("@angular/core").Signal<string>;
18540
+ param8: import("@angular/core").Signal<string>;
18541
+ param9: import("@angular/core").Signal<string>;
18542
+ param10: import("@angular/core").Signal<string>;
18543
+ userOverrideActive: import("@angular/core").Signal<boolean>;
18544
+ state: import("@angular/core").Signal<"error" | "initial" | "loading" | "loaded">;
18545
+ allowUserOverride: import("@angular/core").Signal<boolean>;
18546
+ isOverridingUser: import("@angular/core").Signal<boolean>;
18547
+ initials: import("@angular/core").Signal<string>;
18548
+ principal: () => import("@sinequa/atomic").Principal;
18549
+ initialize: () => Promise<void>;
18550
+ } & import("@ngrx/signals").StateSource<{
18551
+ id: string;
18552
+ id2: string;
18553
+ id3: string;
18554
+ id4: string;
18555
+ id5: string;
18556
+ name: string;
18557
+ email: string;
18558
+ description: string;
18559
+ longName: string;
18560
+ userId: string;
18561
+ fullName: string;
18562
+ isAdministrator: boolean;
18563
+ isDelegatedAdmin: boolean;
18564
+ editablePartition?: boolean | undefined;
18565
+ passwordExpirationDate?: string | null | undefined;
18566
+ param1: string;
18567
+ param2: string;
18568
+ param3: string;
18569
+ param4: string;
18570
+ param5: string;
18571
+ param6: string;
18572
+ param7: string;
18573
+ param8: string;
18574
+ param9: string;
18575
+ param10: string;
18576
+ userOverrideActive: boolean;
18577
+ state: "initial" | "loading" | "loaded" | "error";
18578
+ }>;
18579
+ private readonly appStore;
18580
+ private readonly client;
18581
+ private readonly userOverride;
18582
+ private readonly injector;
18583
+ protected readonly profileEnabled: import("@angular/core").Signal<boolean>;
18584
+ protected readonly username: import("@angular/core").Signal<string | null>;
18585
+ /** Same conditions as the profile form: feature flag, credentials auth mode, editable partition. */
18586
+ protected readonly allowChangePassword: import("@angular/core").Signal<boolean>;
18587
+ protected resetSettings(): void;
18588
+ protected overrideUser(): void;
18589
+ protected revertOverride(): void;
18590
+ static ɵfac: i0.ɵɵFactoryDeclaration<SettingsAccountPanelComponent, never>;
18591
+ static ɵcmp: i0.ɵɵComponentDeclaration<SettingsAccountPanelComponent, "settings-account-panel", never, {}, {}, never, never, true, never>;
18592
+ }
18593
+ /**
18594
+ * Theme and language of the user interface — both applied on the spot and persisted in the user
18595
+ * settings, the same way the former user menu did.
18596
+ */
18597
+ export declare class SettingsAppearancePanelComponent {
18598
+ private readonly userSettingsStore;
18599
+ private readonly transloco;
18600
+ private readonly document;
18601
+ /** Re-read by the label functions below, so the trigger text follows a language change. */
18602
+ private readonly lang;
18603
+ /** The `settings` scope loads lazily: `translate()` returns the raw key until it is there. */
18604
+ private readonly loadedTranslations;
18605
+ protected readonly themeCodes: string[];
18606
+ protected readonly languageCodes: string[];
18607
+ private readonly themeIcons;
18608
+ private readonly languageIcons;
18609
+ private readonly languageLabels;
18610
+ protected readonly currentTheme: import("@angular/core").Signal<"light" | "dark" | "system">;
18611
+ protected readonly currentLanguage: import("@angular/core").Signal<string>;
18612
+ protected readonly themeLabel: (code: string | null) => string;
18613
+ protected readonly languageLabel: (code: string | null) => string;
18614
+ protected themeIcon(code: string | null): Type<unknown> | null;
18615
+ protected languageIcon(code: string | null): Type<unknown> | null;
18616
+ /** `null` is the `Select`'s empty state: deselecting must not clear the setting. */
18617
+ protected onThemeChange(code: string | null): Promise<void>;
18618
+ protected onLanguageChange(code: string | null): void;
18619
+ static ɵfac: i0.ɵɵFactoryDeclaration<SettingsAppearancePanelComponent, never>;
18620
+ static ɵcmp: i0.ɵɵComponentDeclaration<SettingsAppearancePanelComponent, "settings-appearance-panel", never, {}, {}, never, never, true, never>;
18621
+ }
18622
+ /** The keyboard shortcuts currently registered, as documented by the registry itself. */
18623
+ export declare class SettingsShortcutsPanelComponent {
18624
+ static ɵfac: i0.ɵɵFactoryDeclaration<SettingsShortcutsPanelComponent, never>;
18625
+ static ɵcmp: i0.ɵɵComponentDeclaration<SettingsShortcutsPanelComponent, "settings-shortcuts-panel", never, {}, {}, never, never, true, never>;
18474
18626
  }
18475
- /** Imperative entry point: `await UserProfile.call()`. */
18476
- export declare const UserProfile: import("@sinequa/galactik").Callable<void, DialogResult>;
18477
- declare const SUPPORTED_LANGUAGES: readonly ["en", "fr", "de"];
18478
- type SupportedLanguage = (typeof SUPPORTED_LANGUAGES)[number];
18479
18627
  /** The two buckets of a `UserProfile`: the configured fields, and the free-form ones. */
18480
18628
  export type UserProfileCategory = "data" | "customData";
18481
18629
  /**
@@ -18557,63 +18705,6 @@ export declare class UserProfileFormComponent {
18557
18705
  userOverrideActive: boolean;
18558
18706
  state: "initial" | "loading" | "loaded" | "error";
18559
18707
  }>;
18560
- protected readonly userSettingsStore: {
18561
- bookmarks: Signal<import("@sinequa/atomic-angular").Bookmark[]>;
18562
- recentSearches: Signal<import("@sinequa/atomic-angular").SearchItem[]>;
18563
- savedSearches: Signal<import("@sinequa/atomic-angular").SearchItem[]>;
18564
- baskets: Signal<import("@sinequa/atomic-angular").Basket[]>;
18565
- assistants: Signal<Record<string, unknown>>;
18566
- alerts: Signal<import("@sinequa/atomic-angular").Alert[]>;
18567
- collapseAssistant?: Signal<boolean | undefined> | undefined;
18568
- language?: Signal<string | undefined> | undefined;
18569
- userTheme: Signal<"dark" | "light" | "system" | undefined>;
18570
- agents: import("@ngrx/signals").DeepSignal<import("@sinequa/atomic-angular").AgentUserSettings> | Signal<undefined>;
18571
- disabledHighlightCategories: Signal<string[]>;
18572
- isDebugMode: Signal<boolean>;
18573
- isDarkMode: Signal<boolean>;
18574
- updateBookmarks: (bookmarks: import("@sinequa/atomic-angular").UserSettingsState["bookmarks"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
18575
- bookmark: (article: import("@sinequa/atomic").Article, queryName?: string) => Promise<void>;
18576
- unbookmark: (id: string) => Promise<void>;
18577
- isBookmarked: (article: Partial<import("@sinequa/atomic").Article>) => boolean;
18578
- toggleBookmark: (article: import("@sinequa/atomic").Article) => Promise<void>;
18579
- deleteRecentSearch: (index: number) => Promise<void>;
18580
- updateRecentSearches: (recentSearches: import("@sinequa/atomic-angular").UserSettingsState["recentSearches"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
18581
- addCurrentSearch: (queryParams: import("@sinequa/atomic").QueryParams) => Promise<void>;
18582
- deleteSavedSearch: (index: number) => Promise<void>;
18583
- updateSavedSearches: (savedSearches: import("@sinequa/atomic-angular").UserSettingsState["savedSearches"]) => Promise<void>;
18584
- getSavedSearch: (search: string, tab?: string) => import("@sinequa/atomic-angular").SearchItem | undefined;
18585
- deleteBasket: (index: number) => Promise<void>;
18586
- createBasket: (basket: import("@sinequa/atomic-angular").Basket) => Promise<void>;
18587
- updateBaskets: (baskets: import("@sinequa/atomic-angular").UserSettingsState["baskets"]) => Promise<void>;
18588
- updateBasket: (basket: import("@sinequa/atomic-angular").Basket, index: number) => Promise<void>;
18589
- addToBasket: (name: string, ids: string | string[]) => Promise<void>;
18590
- removeFromBasket: (name: string, ids: string | string[]) => Promise<void>;
18591
- updateAssistantSettings: (assistantSettings: import("@sinequa/atomic-angular").UserSettingsState["assistants"]) => Promise<void>;
18592
- updateLanguage: (language: import("@sinequa/atomic-angular").UserSettingsState["language"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
18593
- updateAssistantCollapsed: (collapseAssistant: import("@sinequa/atomic-angular").UserSettingsState["collapseAssistant"], auditEvents?: import("@sinequa/atomic").AuditEvents) => Promise<void>;
18594
- initialize: () => Promise<void>;
18595
- reset: () => Promise<void>;
18596
- deleteAlert: (index: number) => Promise<void>;
18597
- createAlert: (alert: import("@sinequa/atomic-angular").Alert) => Promise<void>;
18598
- updateAlert: (alert: import("@sinequa/atomic-angular").Alert, index: number) => Promise<void>;
18599
- updateAlerts: (alerts: import("@sinequa/atomic-angular").Alert[]) => Promise<void>;
18600
- setDebugMode: (value: boolean) => Promise<void>;
18601
- setUserTheme: (userTheme: "dark" | "light" | "system") => Promise<void>;
18602
- toggleDarkMode: () => Promise<void>;
18603
- setDisabledHighlightCategories: (keys: string[]) => Promise<void>;
18604
- } & import("@ngrx/signals").StateSource<{
18605
- bookmarks: import("@sinequa/atomic-angular").Bookmark[];
18606
- recentSearches: import("@sinequa/atomic-angular").SearchItem[];
18607
- savedSearches: import("@sinequa/atomic-angular").SearchItem[];
18608
- baskets: import("@sinequa/atomic-angular").Basket[];
18609
- assistants: Record<string, unknown>;
18610
- alerts: import("@sinequa/atomic-angular").Alert[];
18611
- collapseAssistant?: boolean | undefined;
18612
- language?: string | undefined;
18613
- userTheme: "dark" | "light" | "system";
18614
- agents: import("@sinequa/atomic-angular").AgentUserSettings;
18615
- disabledHighlightCategories: string[];
18616
- }>;
18617
18708
  protected readonly userProfileService: UserProfileService;
18618
18709
  protected readonly appStore: {
18619
18710
  name: Signal<string>;
@@ -18967,25 +19058,10 @@ export declare class UserProfileFormComponent {
18967
19058
  protected readonly username: Signal<string | null>;
18968
19059
  /** Id of the property being edited, `"<category>.<key>"` — at most one at a time. */
18969
19060
  protected readonly propertyToEdit: import("@angular/core").WritableSignal<string | undefined>;
18970
- /** Selected UI language. `null` is the empty state — the `Select` never uses `undefined`. */
18971
- readonly currentLanguage: import("@angular/core").ModelSignal<string | null>;
18972
- /**
18973
- * The supported languages, with a flag icon per entry. The default `Select` rendering only uses the
18974
- * label; the icon is there for a host that projects its own `#selectOption` template.
18975
- */
18976
- protected readonly allLanguages: {
18977
- code: SupportedLanguage;
18978
- label: string;
18979
- icon: Type<unknown>;
18980
- }[];
18981
- /** Codes de langue passés au `SelectMenu` (typés `string[]` pour rester alignés avec `currentLanguage`). */
18982
- protected readonly languageCodes: string[];
18983
- /** Libellé d'une langue — typeahead + rendu par défaut du `SelectMenu`. */
18984
- protected readonly languageLabel: (code: string) => string;
18985
19061
  readonly changingPassword: import("@angular/core").WritableSignal<boolean>;
18986
19062
  readonly allowChangePassword: Signal<boolean>;
18987
- protected readonly userProfileResource: import("@angular/core").ResourceRef<UserProfile$1 | undefined>;
18988
- protected readonly user: import("@angular/core").WritableSignal<UserProfile$1 | undefined>;
19063
+ protected readonly userProfileResource: import("@angular/core").ResourceRef<UserProfile | undefined>;
19064
+ protected readonly user: import("@angular/core").WritableSignal<UserProfile | undefined>;
18989
19065
  /**
18990
19066
  * Form model, re-seeded from the stored profile.
18991
19067
  *
@@ -19100,22 +19176,8 @@ export declare class UserProfileFormComponent {
19100
19176
  * TODO: how do we save the picture?
19101
19177
  */
19102
19178
  protected uploadAvatar(event: Event): void;
19103
- /** Relais du `SelectMenu` de langue : `null` (désélection) est ignoré. */
19104
- protected onLanguageChange(code: string | null): void;
19105
- /**
19106
- * Change the app language
19107
- */
19108
- changeLanguage(): void;
19109
19179
  static ɵfac: i0.ɵɵFactoryDeclaration<UserProfileFormComponent, never>;
19110
- static ɵcmp: i0.ɵɵComponentDeclaration<UserProfileFormComponent, "user-profile-form, UserProfileForm, userprofileform", never, {
19111
- "currentLanguage": {
19112
- "alias": "currentLanguage";
19113
- "required": false;
19114
- "isSignal": true;
19115
- };
19116
- }, {
19117
- "currentLanguage": "currentLanguageChange";
19118
- }, never, never, true, never>;
19180
+ static ɵcmp: i0.ɵɵComponentDeclaration<UserProfileFormComponent, "user-profile-form, UserProfileForm, userprofileform", never, {}, {}, never, never, true, never>;
19119
19181
  }
19120
19182
  /**
19121
19183
  * Returns a guard function that checks if the user is authenticated.