@sinequa/atomic-angular 2.7.0 → 2.9.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.7.0",
3
+ "version": "2.9.0",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -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>;
@@ -2135,7 +2135,7 @@ export declare class WorkspaceEditDialog {
2135
2135
  protected readonly busy: import("@angular/core").WritableSignal<boolean>;
2136
2136
  protected readonly error: import("@angular/core").WritableSignal<WorkspaceErrorMessage | null>;
2137
2137
  protected readonly descriptionTooLong: import("@angular/core").Signal<boolean>;
2138
- protected readonly saveLabel: import("@angular/core").Signal<"documentWorkspaces.edit.creating" | "documentWorkspaces.edit.saving" | "documentWorkspaces.common.create" | "documentWorkspaces.common.save">;
2138
+ protected readonly saveLabel: import("@angular/core").Signal<"documentWorkspaces.common.save" | "documentWorkspaces.edit.creating" | "documentWorkspaces.edit.saving" | "documentWorkspaces.common.create">;
2139
2139
  /** What to resolve with once the native dialog has closed: the saved workspace, or the plain dismissal. */
2140
2140
  private outcome;
2141
2141
  constructor();
@@ -2192,7 +2192,7 @@ export declare class WorkspaceDetail {
2192
2192
  protected readonly query: import("@angular/core").WritableSignal<string>;
2193
2193
  /** The search box, bound to `query`. */
2194
2194
  protected readonly searchForm: import("@angular/forms/signals").FieldTree<string, string | number, "writable">;
2195
- protected readonly status: import("@angular/core").WritableSignal<"loading" | "ready" | "error">;
2195
+ protected readonly status: import("@angular/core").WritableSignal<"error" | "loading" | "ready">;
2196
2196
  protected readonly loadError: import("@angular/core").WritableSignal<Message | null>;
2197
2197
  protected readonly refreshError: import("@angular/core").WritableSignal<string | null>;
2198
2198
  protected readonly refreshing: import("@angular/core").WritableSignal<boolean>;
@@ -2327,7 +2327,7 @@ export declare function injectWorkspaceMention(options?: WorkspaceMentionOptions
2327
2327
  /** The workspaces in each category — the whole list, not what the search left. */
2328
2328
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2329
2329
  /** Whether the first page is loading, ready or failed. */
2330
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2330
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2331
2331
  /** More workspaces than the loaded ones exist on the server: `loadMore()` fetches the next page. */
2332
2332
  hasMore: import("@angular/core").Signal<boolean>;
2333
2333
  /** The loading cap is reached: some workspaces will never be offered, search included. */
@@ -2374,7 +2374,7 @@ export declare const WORKSPACE_MENTION: InjectionToken<{
2374
2374
  /** The workspaces in each category — the whole list, not what the search left. */
2375
2375
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2376
2376
  /** Whether the first page is loading, ready or failed. */
2377
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2377
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2378
2378
  /** More workspaces than the loaded ones exist on the server: `loadMore()` fetches the next page. */
2379
2379
  hasMore: import("@angular/core").Signal<boolean>;
2380
2380
  /** The loading cap is reached: some workspaces will never be offered, search included. */
@@ -2525,7 +2525,7 @@ export declare class WorkspaceMention implements WorkspaceMentionApi, AfterConte
2525
2525
  labelKey: string;
2526
2526
  }[];
2527
2527
  readonly counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2528
- readonly status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2528
+ readonly status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2529
2529
  readonly hasMore: import("@angular/core").Signal<boolean>;
2530
2530
  readonly truncated: import("@angular/core").Signal<boolean>;
2531
2531
  readonly loadingMore: import("@angular/core").Signal<boolean>;
@@ -2591,11 +2591,11 @@ export declare class WorkspaceMention implements WorkspaceMentionApi, AfterConte
2591
2591
  */
2592
2592
  export declare class WorkspaceMentionNew implements AfterContentInit {
2593
2593
  /** The button's variant. */
2594
- readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "none" | "light-accent" | "accent" | "tertiary" | null | undefined>;
2594
+ readonly variant: import("@angular/core").InputSignal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
2595
2595
  /** The button's colour scheme. */
2596
2596
  readonly scheme: import("@angular/core").InputSignal<"default" | "neutral" | null | undefined>;
2597
2597
  /** The button's size. */
2598
- readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "small" | "medium" | "large" | "xs" | "xsmall" | null | undefined>;
2598
+ readonly size: import("@angular/core").InputSignal<"small" | "medium" | "md" | "lg" | "sm" | "xs" | "xsmall" | "large" | null | undefined>;
2599
2599
  private readonly mention;
2600
2600
  private readonly slot;
2601
2601
  /** Whether the host put its own content inside: the icon and the label then stay out. */
@@ -2638,7 +2638,7 @@ export declare class WorkspaceMentionRows {
2638
2638
  labelKey: string;
2639
2639
  }[];
2640
2640
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2641
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2641
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2642
2642
  hasMore: import("@angular/core").Signal<boolean>;
2643
2643
  truncated: import("@angular/core").Signal<boolean>;
2644
2644
  loadingMore: import("@angular/core").Signal<boolean>;
@@ -2660,9 +2660,9 @@ export declare class WorkspaceMentionRows {
2660
2660
  /** The search box of the enclosing `<workspace-mention>`: it narrows what the menu offers. */
2661
2661
  export declare class WorkspaceMentionSearch {
2662
2662
  /** The size of the box, as `<SearchInput>` sizes it. */
2663
- readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | null | undefined>;
2663
+ readonly size: import("@angular/core").InputSignal<"md" | "lg" | "sm" | null | undefined>;
2664
2664
  /** The size of the text, as `<SearchInput>` sizes it; follows `size` when absent. */
2665
- readonly textSize: import("@angular/core").InputSignal<"sm" | "base" | null | undefined>;
2665
+ readonly textSize: import("@angular/core").InputSignal<"base" | "sm" | null | undefined>;
2666
2666
  /** The hint shown in the empty box; the translated "Search workspace..." when absent. */
2667
2667
  readonly placeholder: import("@angular/core").InputSignal<string | undefined>;
2668
2668
  /** The accessible name of the box; the placeholder when absent. */
@@ -2709,7 +2709,7 @@ export declare class WorkspaceMentionSelectAll {
2709
2709
  labelKey: string;
2710
2710
  }[];
2711
2711
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2712
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2712
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2713
2713
  hasMore: import("@angular/core").Signal<boolean>;
2714
2714
  truncated: import("@angular/core").Signal<boolean>;
2715
2715
  loadingMore: import("@angular/core").Signal<boolean>;
@@ -2745,7 +2745,7 @@ export declare class WorkspaceMentionTabs {
2745
2745
  labelKey: string;
2746
2746
  }[];
2747
2747
  counts: import("@angular/core").Signal<import("@sinequa/atomic-angular/document-workspaces").WorkspaceTabCounts>;
2748
- status: import("@angular/core").Signal<"loading" | "ready" | "error">;
2748
+ status: import("@angular/core").Signal<"error" | "loading" | "ready">;
2749
2749
  hasMore: import("@angular/core").Signal<boolean>;
2750
2750
  truncated: import("@angular/core").Signal<boolean>;
2751
2751
  loadingMore: import("@angular/core").Signal<boolean>;
@@ -2790,14 +2790,14 @@ export declare const NEW_WORKSPACE_NAME_MAX = 50;
2790
2790
  */
2791
2791
  export declare class WorkspacePicker {
2792
2792
  /** `save` attaches `documents` to the chosen workspace; `move` takes `documentIds` from `fromWorkspaceId` to it. */
2793
- readonly mode: import("@angular/core").InputSignal<"save" | "move">;
2793
+ readonly mode: import("@angular/core").InputSignal<"move" | "save">;
2794
2794
  readonly documents: import("@angular/core").InputSignal<readonly PickerDocument[]>;
2795
2795
  readonly fromWorkspaceId: import("@angular/core").InputSignal<string | null>;
2796
2796
  readonly documentIds: import("@angular/core").InputSignal<readonly string[]>;
2797
2797
  /** The documents are in the workspace, and the check mark has been seen. */
2798
2798
  readonly completed: import("@angular/core").OutputEmitterRef<Workspace>;
2799
2799
  private readonly store;
2800
- protected readonly status: import("@angular/core").WritableSignal<"loading" | "ready" | "error">;
2800
+ protected readonly status: import("@angular/core").WritableSignal<"error" | "loading" | "ready">;
2801
2801
  protected readonly busyId: import("@angular/core").WritableSignal<string | null>;
2802
2802
  protected readonly doneId: import("@angular/core").WritableSignal<string | null>;
2803
2803
  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, 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 } 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, SwitchComponent } from "@sinequa/galactik";
@@ -10,7 +10,6 @@ import { BehaviorSubject, Observable, Subject } from "rxjs";
10
10
  import { FieldTree } from "@angular/forms/signals";
11
11
  import MarkdownIt from "markdown-it";
12
12
  import { Placement } from "@floating-ui/dom";
13
- import { CdkDragDrop } from "@angular/cdk/drag-drop";
14
13
  import { Options as Options$1 } from "vanilla-calendar-pro";
15
14
  import { TreeItem } from "@angular/aria/tree";
16
15
  import { Toolbar } from "@angular/aria/toolbar";
@@ -1062,7 +1061,7 @@ export declare class MetadataComponent {
1062
1061
  }>;
1063
1062
  class: import("@angular/core").InputSignal<string | undefined>;
1064
1063
  variant: import("@angular/core").InputSignal<"primary" | "secondary" | null | undefined>;
1065
- size: import("@angular/core").InputSignal<"small" | "medium" | "xs" | "sm" | "md" | "xsmall" | null | undefined>;
1064
+ size: import("@angular/core").InputSignal<"small" | "sm" | "md" | "xs" | "xsmall" | "medium" | null | undefined>;
1066
1065
  scheme: import("@angular/core").InputSignal<"error" | "sage" | "success" | "almond" | "pink" | "grey" | "yellow" | "cherry" | "indigo" | "cyan" | "warning" | "info" | null | undefined>;
1067
1066
  metadata: import("@angular/core").InputSignal<(string & Record<never, never>) | KeyOf<Article>>;
1068
1067
  article: import("@angular/core").InputSignal<Partial<Article> | (string & Record<never, never>)>;
@@ -11095,22 +11094,115 @@ export declare class ArticleSimilarDocumentsTabPanel {
11095
11094
  "selected": "selected";
11096
11095
  }, never, never, true, never>;
11097
11096
  }
11097
+ /**
11098
+ * Short weekday names in the active language ("Mon", "lun."), Monday first. 2024-01-01 is a Monday.
11099
+ */
11100
+ declare function weekdayNames(lang: string): string[];
11101
+ /** One piece of the summary: a translation key (translated by the template's pipe) or a ready text. */
11102
+ interface AlertSummaryPart {
11103
+ key?: string;
11104
+ /** Interpolation parameters of `key`. */
11105
+ params?: Record<string, unknown>;
11106
+ text?: string;
11107
+ }
11108
+ /**
11109
+ * Second line of an alert row: what the alert does, so the list answers "when will I be notified?" without
11110
+ * opening the dialog — « Daily · 09:00 · Mon–Fri ». A suspended alert starts with « Paused ».
11111
+ *
11112
+ * Returns the pieces rather than a sentence: the labels live in the `alerts` translation scope, which loads on
11113
+ * demand, and only the template's `transloco` pipe waits for it. The caller joins the pieces with " · ".
11114
+ *
11115
+ * Tolerant of an alert that lacks `times` or `days`: the piece is left out rather than shown empty.
11116
+ */
11117
+ declare function alertSummary(lang: string, alert: Alert): AlertSummaryPart[];
11118
+ /**
11119
+ * What an alert watches, in pieces — « “data protection” · Web tab · 2 filters ». Same contract as
11120
+ * {@link alertSummary}: translation keys for the template's pipe, ready text for the rest.
11121
+ */
11122
+ declare function querySummary(query: Query | undefined): AlertSummaryPart[];
11123
+ /**
11124
+ * The user's alerts: one row per alert (name, when it fires, an on/off switch), "Create" in the header.
11125
+ *
11126
+ * The rows are reordered by dragging them or with Alt + ↑ / ↓ on a focused row — the gesture is galactik's
11127
+ * `[sortable]`, this component only saves the order it reports. A deletion is applied at once on screen and sent to
11128
+ * the server after `UNDO_DELAY`, unless the user undoes it; it is also sent when the component goes away (the
11129
+ * popover closes).
11130
+ */
11098
11131
  export declare class AlertsComponent {
11099
11132
  floating: PopoverDirective | null;
11100
11133
  private readonly userSettingsStore;
11101
11134
  private readonly injector;
11102
- reordering: import("@angular/core").WritableSignal<boolean>;
11103
- protected alerts: import("@angular/core").Signal<Alert[]>;
11104
- tmpAlerts: Alert[];
11135
+ private readonly transloco;
11136
+ private readonly lang;
11105
11137
  query: Query;
11138
+ /**
11139
+ * Whether the form opens in a dialog (`AlertForm`), which is what a click on a row or on "Create" does by
11140
+ * default. Set it to `false` to show the form yourself, wherever you like (see `AlertFormComponent`): the
11141
+ * list then only reports the request, with `editRequested` and `createRequested`.
11142
+ */
11143
+ readonly dialog: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
11144
+ /** The user asked to edit an alert: its index in `UserSettingsStore.alerts()`. Only with `[dialog]="false"`. */
11145
+ readonly editRequested: import("@angular/core").OutputEmitterRef<number>;
11146
+ /** The user asked to create an alert. Only with `[dialog]="false"`. */
11147
+ readonly createRequested: import("@angular/core").OutputEmitterRef<void>;
11148
+ /**
11149
+ * Why the last change could not be saved, shown above the list until the next one. A toast would not do: the
11150
+ * list lives in popovers and modal dialogs, which are in the top layer, above any toast.
11151
+ */
11152
+ protected readonly saveError: import("@angular/core").WritableSignal<{
11153
+ detail?: string;
11154
+ } | undefined>;
11155
+ protected readonly alerts: import("@angular/core").Signal<Alert[]>;
11156
+ /**
11157
+ * The order on screen. A copy of the store's list (the store edits its own array in place), and ahead of it
11158
+ * while a new order is being saved: a drop shows its result at once instead of after the round trip.
11159
+ */
11160
+ private readonly order;
11161
+ /** Alerts removed from the screen: awaiting the end of the undo delay, or being deleted on the server. */
11162
+ private readonly hidden;
11163
+ /** The alert whose deletion can still be undone. */
11164
+ protected readonly pendingDeletion: import("@angular/core").WritableSignal<Alert | undefined>;
11165
+ private undoTimer;
11166
+ /** The alerts to show, in order — what `[sortable]` reorders. */
11167
+ protected readonly visible: import("@angular/core").Signal<Alert[]>;
11168
+ /** The second line of each row. */
11169
+ private readonly summaries;
11170
+ protected readonly summaryOf: (alert: Alert) => AlertSummaryPart[];
11171
+ /** What a screen reader hears after a keyboard move. */
11172
+ protected readonly announceMove: (alert: Alert, position: number, total: number) => string;
11106
11173
  constructor();
11107
- onClick(index: number): void;
11174
+ /** A click on the switch or the delete button is theirs, not a request to edit the alert. */
11175
+ protected onRowClick(event: Event, alert: Alert): void;
11176
+ /** Enter edits the row only when the row itself has the focus — not when it comes from the switch or the button. */
11177
+ protected onRowEnter(event: Event, alert: Alert): void;
11178
+ private edit;
11108
11179
  createAlert(): void;
11109
- deleteAlert(event: Event, index: number): void;
11110
- reorder(): Promise<void>;
11111
- dropped(drop: CdkDragDrop<Alert[]>): void;
11180
+ /**
11181
+ * What each switch shows while its change is being saved. The switch flips itself on a click and the store
11182
+ * only changes once the save has succeeded: dropping the entry on a failure changes the bound value back,
11183
+ * which is what puts the switch back where it was.
11184
+ */
11185
+ private readonly pendingActive;
11186
+ protected isActive(alert: Alert): boolean;
11187
+ protected toggle(alert: Alert, active: boolean): Promise<void>;
11188
+ protected deleteAlert(alert: Alert): void;
11189
+ protected undoDeletion(): void;
11190
+ /** Sends the pending deletion. The row stays hidden until the store no longer holds the alert. */
11191
+ private commitDeletion;
11192
+ private unhide;
11193
+ /** The new order of the alerts shown. An alert being deleted is not in it: it goes after them, as it is about to leave. */
11194
+ protected saveOrder(shown: Alert[]): Promise<void>;
11112
11195
  static ɵfac: i0.ɵɵFactoryDeclaration<AlertsComponent, never>;
11113
- static ɵcmp: i0.ɵɵComponentDeclaration<AlertsComponent, "Alerts", never, {}, {}, never, never, true, never>;
11196
+ static ɵcmp: i0.ɵɵComponentDeclaration<AlertsComponent, "Alerts", never, {
11197
+ "dialog": {
11198
+ "alias": "dialog";
11199
+ "required": false;
11200
+ "isSignal": true;
11201
+ };
11202
+ }, {
11203
+ "editRequested": "editRequested";
11204
+ "createRequested": "createRequested";
11205
+ }, never, never, true, never>;
11114
11206
  }
11115
11207
  /**
11116
11208
  * The seven weekdays, in display order, each paired with its bit in {@link Alert.Days}.
@@ -11165,22 +11257,47 @@ export interface AlertFormModel {
11165
11257
  export declare function weekdaysFromFlags(mask: Alert.Days): Record<WeekdayKey, boolean>;
11166
11258
  /** Folds the seven booleans of the form model back into an {@link Alert.Days} bitfield. */
11167
11259
  export declare function flagsFromWeekdays(days: Record<WeekdayKey, boolean>): Alert.Days;
11168
- export declare class AlertDialog {
11169
- protected readonly call: import("@sinequa/galactik").CallRef<number | undefined, DialogEvent>;
11260
+ /**
11261
+ * The form that creates or edits one alert: name, frequency and time, weekdays, on/off, and — for an
11262
+ * existing alert — the search it watches.
11263
+ *
11264
+ * It knows nothing of its container. `<alert-form [index]="…" (saved)="…" />` can sit in a dialog (see
11265
+ * {@link AlertDialog}), a panel, a drawer or a page: it saves through {@link UserSettingsStore} and tells its
11266
+ * container with `saved` once the save has succeeded, or `executed` once the user has run the watched search.
11267
+ * A failed save keeps what was typed and is shown inside the form — a toast would sit behind a modal dialog.
11268
+ *
11269
+ * The form renders no button of its own that submits or cancels: those belong to the container. A submit
11270
+ * button placed outside the form submits it by pointing at {@link AlertFormComponent.formId} with its `form`
11271
+ * attribute, and can use {@link AlertFormComponent.saving} to wait for the save.
11272
+ *
11273
+ * The layout follows the width of the form (a container query), not that of the window: frequency and time
11274
+ * share a line from 24rem up and stack below.
11275
+ */
11276
+ export declare class AlertFormComponent {
11170
11277
  private readonly queryService;
11171
11278
  private readonly queryParamsStore;
11172
11279
  private readonly userSettingsStore;
11173
11280
  private readonly transloco;
11174
- readonly dialog: import("@angular/core").Signal<DialogComponent | undefined>;
11281
+ private readonly lang;
11282
+ /** Index, in the user settings, of the alert to edit — leave it unset to create one. */
11283
+ readonly index: import("@angular/core").InputSignal<number | undefined>;
11284
+ /** Emitted once the alert has been saved. */
11285
+ readonly saved: import("@angular/core").OutputEmitterRef<void>;
11286
+ /** Emitted once the user has run the watched search: the query parameters now hold it. */
11287
+ readonly executed: import("@angular/core").OutputEmitterRef<void>;
11288
+ /** Id of the `<form>`: a submit button outside the component points at it with its `form` attribute. */
11289
+ readonly formId: string;
11175
11290
  protected readonly fieldClass = "flex flex-col gap-(--spacing-2xs)";
11176
11291
  protected readonly labelClass = "text-(length:--size-base) font-(--weight-semibold) text-(--font-primary-base)";
11177
11292
  protected readonly errorClass = "text-(length:--size-base) text-(--font-error-base)";
11178
- frequencies: Alert.Frequency[];
11179
- frequency: typeof Alert.Frequency;
11293
+ protected readonly frequencies: Alert.Frequency[];
11294
+ protected readonly frequency: typeof Alert.Frequency;
11295
+ protected readonly Days: typeof Alert.Days;
11296
+ protected readonly querySummary: typeof querySummary;
11180
11297
  /** Libellé traduit d'une fréquence — utilisé par le typeahead du `SelectMenu`. */
11181
- readonly frequencyLabel: (value: Alert.Frequency) => string;
11182
- /** The seven weekdays, exposed to the template for the checkbox grid. */
11183
- readonly weekdays: readonly [{
11298
+ protected readonly frequencyLabel: (value: Alert.Frequency) => string;
11299
+ /** The seven weekdays, exposed to the template for the toggle chips. */
11300
+ protected readonly weekdays: readonly [{
11184
11301
  readonly key: "monday";
11185
11302
  readonly flag: Alert.Days.Monday;
11186
11303
  }, {
@@ -11202,26 +11319,33 @@ export declare class AlertDialog {
11202
11319
  readonly key: "sunday";
11203
11320
  readonly flag: Alert.Days.Sunday;
11204
11321
  }];
11205
- /**
11206
- * The alert being edited, and its index in the user settings — `undefined` in "create" mode.
11207
- *
11208
- * Signals and not plain properties: they are written from `init()`, outside any template listener,
11209
- * and the template branches on them. A plain property mutated there does not mark the view dirty.
11210
- */
11211
- readonly index: import("@angular/core").WritableSignal<number | undefined>;
11212
- readonly alert: import("@angular/core").WritableSignal<Alert | undefined>;
11213
- canUpdateQuery: import("@angular/core").WritableSignal<boolean>;
11214
- updateStatus: import("@angular/core").WritableSignal<"idle" | "updating" | "updated">;
11215
- /** Form model. Replaces the five former scalar signals. */
11322
+ /** Their short names in the active language, Monday first — what the chips show. */
11323
+ protected readonly dayNames: import("@angular/core").Signal<string[]>;
11324
+ /** The alert being edited — `undefined` in "create" mode. */
11325
+ readonly alert: import("@angular/core").Signal<Alert | undefined>;
11326
+ /**
11327
+ * Whether the search currently on screen can replace the one the alert watches: it must have results.
11328
+ * Only an existing alert has anything to replace, so a new one issues no search.
11329
+ */
11330
+ private readonly currentSearch;
11331
+ readonly canUpdateQuery: import("@angular/core").Signal<boolean>;
11332
+ readonly updateStatus: import("@angular/core").WritableSignal<"updating" | "updated" | "idle">;
11333
+ /** Why the last save failed — shown in the form until the next attempt. */
11334
+ protected readonly saveError: import("@angular/core").WritableSignal<{
11335
+ detail?: string;
11336
+ } | undefined>;
11337
+ /** Form model: the stored alert's values, or the defaults of a new one. Follows the alert it edits. */
11216
11338
  readonly alertModel: import("@angular/core").WritableSignal<AlertFormModel>;
11217
11339
  protected readonly alertForm: FieldTree<AlertFormModel, string | number, "writable">;
11340
+ /** True while a submission is being saved — for a container that disables its confirm button meanwhile. */
11341
+ readonly saving: import("@angular/core").Signal<boolean>;
11218
11342
  /**
11219
11343
  * The weekday group shows its error like any other field: once touched — which, for a group the
11220
11344
  * checkboxes cannot blur, means once the form has been submitted.
11221
11345
  */
11222
11346
  protected readonly showDaysError: import("@angular/core").Signal<boolean>;
11223
- constructor();
11224
- private init;
11347
+ /** Checks exactly the days of `mask` — the "Weekdays" and "Every day" shortcuts. */
11348
+ protected setDays(mask: Alert.Days): void;
11225
11349
  /**
11226
11350
  * The submission itself, only ever reached with a valid form: `submit()` marks every field as
11227
11351
  * touched — revealing the messages — and runs the action only when the form is valid.
@@ -11233,8 +11357,35 @@ export declare class AlertDialog {
11233
11357
  protected showError<T>(field: FieldTree<T>): boolean;
11234
11358
  /** Maps the first validation error to its translation key (`alerts.errors.noDaySelected`, …). */
11235
11359
  protected errorKey<T>(field: FieldTree<T>): string;
11236
- updateQuery(): void;
11237
- execute(): void;
11360
+ protected updateQuery(): void;
11361
+ protected execute(): void;
11362
+ static ɵfac: i0.ɵɵFactoryDeclaration<AlertFormComponent, never>;
11363
+ static ɵcmp: i0.ɵɵComponentDeclaration<AlertFormComponent, "alert-form, alertform, AlertFormComponent", never, {
11364
+ "index": {
11365
+ "alias": "index";
11366
+ "required": false;
11367
+ "isSignal": true;
11368
+ };
11369
+ }, {
11370
+ "saved": "saved";
11371
+ "executed": "executed";
11372
+ }, never, never, true, never>;
11373
+ }
11374
+ /**
11375
+ * The modal dialog around {@link AlertFormComponent}: a title, the form, and the Cancel / Confirm buttons.
11376
+ *
11377
+ * It only hosts the form — the fields, the validation and the save are the form's. Confirm sits outside the
11378
+ * `<form>` and submits it through its `form` attribute; the dialog closes when the form says the alert is
11379
+ * saved (`dialog-confirm`) or that the watched search has been run.
11380
+ *
11381
+ * Open it with {@link AlertForm}, which takes the index of the alert to edit (none to create one).
11382
+ */
11383
+ export declare class AlertDialog {
11384
+ protected readonly call: import("@sinequa/galactik").CallRef<number | undefined, DialogEvent>;
11385
+ readonly dialog: import("@angular/core").Signal<DialogComponent | undefined>;
11386
+ /** Index, in the user settings, of the alert being edited — `undefined` in "create" mode. */
11387
+ protected readonly index: import("@angular/core").WritableSignal<number | undefined>;
11388
+ constructor();
11238
11389
  static ɵfac: i0.ɵɵFactoryDeclaration<AlertDialog, never>;
11239
11390
  static ɵcmp: i0.ɵɵComponentDeclaration<AlertDialog, "alert-dialog, alertdialog, AlertDialog", never, {}, {}, never, never, true, never>;
11240
11391
  }
@@ -11662,8 +11813,8 @@ export declare class SignedOutComponent {
11662
11813
  static ɵcmp: i0.ɵɵComponentDeclaration<SignedOutComponent, "signed-out, SignedOut, signedout", never, {}, {}, never, never, true, never>;
11663
11814
  }
11664
11815
  export declare class BookmarkButtonComponent {
11665
- variant: import("@angular/core").InputSignal<"primary" | "secondary" | "none" | "light-accent" | "accent" | "tertiary" | null | undefined>;
11666
- size: import("@angular/core").InputSignal<"small" | "medium" | "xs" | "sm" | "md" | "xsmall" | "large" | "lg" | null | undefined>;
11816
+ variant: import("@angular/core").InputSignal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
11817
+ size: import("@angular/core").InputSignal<"small" | "large" | "sm" | "md" | "xs" | "xsmall" | "medium" | "lg" | null | undefined>;
11667
11818
  /**
11668
11819
  * Tab index applied to the inner button.
11669
11820
  *
@@ -12754,7 +12905,7 @@ export declare class SearchFeedbackComponent {
12754
12905
  onClose: import("@angular/core").OutputEmitterRef<void>;
12755
12906
  private readonly injector;
12756
12907
  pages: import("@angular/core").InputSignal<any>;
12757
- variant: import("@angular/core").InputSignal<"primary" | "secondary" | "none" | "light-accent" | "accent" | "tertiary" | null | undefined>;
12908
+ variant: import("@angular/core").InputSignal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
12758
12909
  readonly auditService: AuditService;
12759
12910
  protected readonly queryParamsStore: {
12760
12911
  name?: import("@angular/core").Signal<string | undefined> | undefined;
@@ -13087,7 +13238,7 @@ export declare class AggregationDateComponent {
13087
13238
  *
13088
13239
  * @default 'selection'
13089
13240
  */
13090
- emitOn: import("@angular/core").InputSignal<"selection" | "apply">;
13241
+ emitOn: import("@angular/core").InputSignal<"apply" | "selection">;
13091
13242
  readonly title: import("@angular/core").InputSignal<AggregationTitle>;
13092
13243
  readonly displayEmptyDistributionIntervals: import("@angular/core").InputSignal<boolean>;
13093
13244
  onSelect: import("@angular/core").OutputEmitterRef<AggregationItem[]>;
@@ -15547,7 +15698,7 @@ export declare class AggregationComponent {
15547
15698
  *
15548
15699
  * @default 'selection'
15549
15700
  */
15550
- emitOn: import("@angular/core").InputSignal<"selection" | "apply">;
15701
+ emitOn: import("@angular/core").InputSignal<"apply" | "selection">;
15551
15702
  /**
15552
15703
  * Which sub-component renders the aggregation.
15553
15704
  *
@@ -15560,7 +15711,7 @@ export declare class AggregationComponent {
15560
15711
  *
15561
15712
  * @default "auto"
15562
15713
  */
15563
- type: import("@angular/core").InputSignal<"auto" | "list" | "tree" | "date">;
15714
+ type: import("@angular/core").InputSignal<"date" | "list" | "tree" | "auto">;
15564
15715
  /**
15565
15716
  * Whether the host removes itself from the layout (Tailwind's `hidden`, i.e.
15566
15717
  * `display: none`) when it resolves to zero items. When `false` (default), the
@@ -15612,7 +15763,7 @@ export declare class AggregationComponent {
15612
15763
  * The sub-component to render: the explicit `type` input, or the current
15613
15764
  * date/tree/list heuristic when `type` is `"auto"`.
15614
15765
  */
15615
- protected resolvedType: import("@angular/core").Signal<"list" | "tree" | "date">;
15766
+ protected resolvedType: import("@angular/core").Signal<"date" | "list" | "tree">;
15616
15767
  /** Whether a filter is currently applied on this aggregation. */
15617
15768
  private readonly hasFilters;
15618
15769
  /**
@@ -15985,7 +16136,7 @@ export declare class AppliedFiltersComponent {
15985
16136
  /** Chip colour scheme, passed to galactik's `tag`. */
15986
16137
  readonly scheme: import("@angular/core").InputSignal<"error" | "sage" | "success" | "almond" | "pink" | "grey" | "yellow" | "cherry" | "indigo" | "cyan" | "warning" | "info" | null | undefined>;
15987
16138
  /** Chip size, passed to galactik's `tag`. */
15988
- readonly size: import("@angular/core").InputSignal<"small" | "medium" | "xs" | "sm" | "md" | "xsmall" | null | undefined>;
16139
+ readonly size: import("@angular/core").InputSignal<"small" | "sm" | "md" | "xs" | "xsmall" | "medium" | null | undefined>;
15989
16140
  /** Extra classes for each chip, merged by galactik's `tag`. */
15990
16141
  readonly chipClass: import("@angular/core").InputSignal<string>;
15991
16142
  /** A chip was removed. */
@@ -16180,7 +16331,7 @@ export declare class FilterButtonComponent {
16180
16331
  * silently moved to a hidden one.
16181
16332
  */
16182
16333
  overflowed: import("@angular/core").InputSignalWithTransform<boolean, unknown>;
16183
- protected variant: import("@angular/core").WritableSignal<"primary" | "secondary" | "none" | "light-accent" | "accent" | "tertiary" | null | undefined>;
16334
+ protected variant: import("@angular/core").WritableSignal<"none" | "primary" | "secondary" | "light-accent" | "accent" | "tertiary" | null | undefined>;
16184
16335
  protected filter: import("@angular/core").WritableSignal<CFilterEx>;
16185
16336
  /** Unique id wiring the trigger's `popovertarget` to the `<div popover>` `id`. */
16186
16337
  protected readonly popoverId: string;
@@ -18623,7 +18774,7 @@ export declare class RecentSearchesComponent {
18623
18774
  }>;
18624
18775
  protected readonly transloco: TranslocoService;
18625
18776
  private readonly router;
18626
- protected getRelativeDate: typeof getRelativeDate;
18777
+ protected subtextOf: (search: SearchItem) => string | undefined;
18627
18778
  protected urlOf: (search: SearchItem) => string;
18628
18779
  protected labelOf: (search: SearchItem) => string;
18629
18780
  protected readonly range: import("@angular/core").WritableSignal<number>;
@@ -18820,7 +18971,7 @@ export declare class SavedSearchesComponent {
18820
18971
  }>;
18821
18972
  protected readonly transloco: TranslocoService;
18822
18973
  private readonly router;
18823
- protected getRelativeDate: typeof getRelativeDate;
18974
+ protected subtextOf: (search: SearchItem) => string | undefined;
18824
18975
  protected urlOf: (search: SearchItem) => string;
18825
18976
  protected labelOf: (search: SearchItem) => string;
18826
18977
  protected readonly range: import("@angular/core").WritableSignal<number>;
@@ -18840,7 +18991,7 @@ export declare class SavedSearchesComponent {
18840
18991
  };
18841
18992
  }, {}, never, never, true, never>;
18842
18993
  }
18843
- export type SettingsPanelId = "account" | "appearance" | "shortcuts";
18994
+ export type SettingsPanelId = "account" | "appearance" | "alerts" | "shortcuts";
18844
18995
  /** Payload of `Settings.call()`: the panel to show first (default `account`). */
18845
18996
  export interface SettingsDialogProps {
18846
18997
  panel?: SettingsPanelId;
@@ -19003,6 +19154,27 @@ export declare class SettingsAppearancePanelComponent {
19003
19154
  static ɵfac: i0.ɵɵFactoryDeclaration<SettingsAppearancePanelComponent, never>;
19004
19155
  static ɵcmp: i0.ɵɵComponentDeclaration<SettingsAppearancePanelComponent, "settings-appearance-panel", never, {}, {}, never, never, true, never>;
19005
19156
  }
19157
+ /**
19158
+ * The user's alerts: the list, and — once one is picked, or "Create" is pressed — the form in the same panel.
19159
+ *
19160
+ * The form is not a second dialog on top of the settings: the panel swaps from the list to the form and back,
19161
+ * and a failed save is shown in the form itself, which a toast could not do behind a modal dialog.
19162
+ */
19163
+ export declare class SettingsAlertsPanelComponent {
19164
+ /** The user ran an alert's search: the settings have nothing more to show, the page behind has the results. */
19165
+ readonly closeRequested: import("@angular/core").OutputEmitterRef<void>;
19166
+ /** The form being shown — `index` is the alert to edit, `undefined` to create one — or nothing: the list. */
19167
+ protected readonly form: import("@angular/core").WritableSignal<{
19168
+ index: number | undefined;
19169
+ } | undefined>;
19170
+ protected edit(index: number): void;
19171
+ protected create(): void;
19172
+ protected back(): void;
19173
+ static ɵfac: i0.ɵɵFactoryDeclaration<SettingsAlertsPanelComponent, never>;
19174
+ static ɵcmp: i0.ɵɵComponentDeclaration<SettingsAlertsPanelComponent, "settings-alerts-panel", never, {}, {
19175
+ "closeRequested": "closeRequested";
19176
+ }, never, never, true, never>;
19177
+ }
19006
19178
  /** The keyboard shortcuts currently registered, as documented by the registry itself. */
19007
19179
  export declare class SettingsShortcutsPanelComponent {
19008
19180
  static ɵfac: i0.ɵɵFactoryDeclaration<SettingsShortcutsPanelComponent, never>;