@forgeroute/ui 0.4.71 → 0.4.73
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/fesm2022/forgeroute-ui-messaging.mjs +614 -100
- package/fesm2022/forgeroute-ui-messaging.mjs.map +1 -1
- package/fesm2022/forgeroute-ui-pdf.mjs +3 -0
- package/fesm2022/forgeroute-ui-pdf.mjs.map +1 -1
- package/fesm2022/forgeroute-ui-stripe.mjs +895 -3
- package/fesm2022/forgeroute-ui-stripe.mjs.map +1 -1
- package/fesm2022/forgeroute-ui.mjs +5987 -1848
- package/fesm2022/forgeroute-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/forgeroute-ui-messaging.d.ts +191 -1
- package/types/forgeroute-ui-stripe.d.ts +162 -3
- package/types/forgeroute-ui.d.ts +1403 -28
package/types/forgeroute-ui.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
|
-
import { EnvironmentProviders, InjectionToken, OnDestroy, OnInit, Signal, TemplateRef, WritableSignal } from "@angular/core";
|
|
2
|
+
import { AfterContentChecked, EnvironmentProviders, InjectionToken, OnDestroy, OnInit, Signal, TemplateRef, WritableSignal } from "@angular/core";
|
|
3
3
|
import { UrlTree } from "@angular/router";
|
|
4
4
|
import { Observable, Subject } from "rxjs";
|
|
5
5
|
import { AbstractControl, ControlValueAccessor, FormControl, ValidationErrors, Validator, ValidatorFn } from "@angular/forms";
|
|
@@ -356,6 +356,34 @@ export type BulkUpdateOption<T = any> = string | {
|
|
|
356
356
|
* else "N <itemLabel>(s) <doneLabel>.". Default 'updated'.
|
|
357
357
|
*/
|
|
358
358
|
doneLabel?: string;
|
|
359
|
+
/**
|
|
360
|
+
* Direct action only: the request returns a FILE instead of JSON (a ZIP of PDFs, a CSV...). The table still confirms first and POSTs
|
|
361
|
+
* `<endpoint>/bulk/<field>` with exactly `{ ids }`, but asks for a blob response and saves it as one download (one file, so browsers do not
|
|
362
|
+
* block it the way several automatic downloads are blocked). The file name is the response's `Content-Disposition` filename, else
|
|
363
|
+
* `fileName`, else the action key. The toast reads "N <itemLabel>(s) <doneLabel>." (`doneLabel` defaults to 'downloaded' here); the server may
|
|
364
|
+
* send an `X-Skipped-Count` header with the number of selected rows it left out of the file ("N downloaded, M skipped."). The rows do not change,
|
|
365
|
+
* so the table is not refreshed; the selection is cleared and `(bulkAction)` is emitted. An error response is read as `{ message }` JSON and shown
|
|
366
|
+
* in an error toast. Omit it and the action expects JSON as before.
|
|
367
|
+
*
|
|
368
|
+
* { field: 'download-pdfs', action: true, label: 'Download PDFs', download: { fileName: 'inspections.zip' } }
|
|
369
|
+
*/
|
|
370
|
+
download?: {
|
|
371
|
+
fileName?: string;
|
|
372
|
+
};
|
|
373
|
+
/**
|
|
374
|
+
* Direct action only (`opens: 'panel'`): the button does not confirm and does not POST. It emits `(bulkPanelClick)` with the
|
|
375
|
+
* eligible rows and the host opens its own panel or form (compose an e-mail, add a charge...) and does the work itself.
|
|
376
|
+
* The host calls `clearSelection()` and `refresh()` on the table when it is done. `confirm` and `doneLabel` are ignored for a panel action (no confirm is shown; `variant: 'danger'` still colours the button); `eligible` still applies (refused rows are never passed on). Omit it and nothing changes.
|
|
377
|
+
*
|
|
378
|
+
* { field: 'email', action: true, opens: 'panel', label: 'Email', eligible: (r: Resident) => !!r.email }
|
|
379
|
+
*/
|
|
380
|
+
opens?: 'panel';
|
|
381
|
+
/**
|
|
382
|
+
* Panel action only (`opens: 'panel'`): true while the action is not available right now (e.g. text messaging is switched off). The button is
|
|
383
|
+
* then not shown at all. Read every time the bar renders, so it can read signals; a function that throws counts as "not hidden". A panel
|
|
384
|
+
* action is also not shown while none of the selected rows is `eligible`. Omit it and the button shows whenever a selected row is eligible.
|
|
385
|
+
*/
|
|
386
|
+
hidden?: () => boolean;
|
|
359
387
|
};
|
|
360
388
|
/** What a bulk confirm function receives. For a direct bulk action: `columnLabel` is the action label, `targetValue`/`targetLabel` are '', `rows`/`skippedRows` the eligible / refused selected rows. For bulk Delete: `targetValue`/`targetLabel` are '', `columnLabel` is 'Delete', skipped counts are 0. */
|
|
361
389
|
export interface BulkConfirmContext<T = any> {
|
|
@@ -423,6 +451,14 @@ export interface BulkActionDef {
|
|
|
423
451
|
eligible?: (row: any) => boolean;
|
|
424
452
|
/** Direct action: past-tense word in the result toast (from `{ doneLabel }`), default 'updated'. */
|
|
425
453
|
doneLabel?: string;
|
|
454
|
+
/** Direct action that returns a file (from `{ download }`): the response is saved as a download instead of read as JSON. */
|
|
455
|
+
download?: {
|
|
456
|
+
fileName?: string;
|
|
457
|
+
};
|
|
458
|
+
/** True for a direct action that opens a host panel instead of confirming and POSTing (from `{ opens: 'panel' }`). */
|
|
459
|
+
opensPanel?: boolean;
|
|
460
|
+
/** Panel action: true while it is not available (from `{ hidden }`); the button is not shown. */
|
|
461
|
+
hidden?: () => boolean;
|
|
426
462
|
/**
|
|
427
463
|
* The item field this action targets (e.g. 'status', 'type').
|
|
428
464
|
* When set the table shows an inline select populated from the column's option sources.
|
|
@@ -437,6 +473,19 @@ export interface BulkActionEvent {
|
|
|
437
473
|
value?: string;
|
|
438
474
|
skippedCount: number;
|
|
439
475
|
}
|
|
476
|
+
/** Emitted by (bulkPanelClick) when the user clicks a bulk action declared with `opens: 'panel'`. */
|
|
477
|
+
export interface BulkPanelEvent<T = any> {
|
|
478
|
+
/** `action-<key>` of the clicked bulk option. */
|
|
479
|
+
type: string;
|
|
480
|
+
/** The option's `field` (its key), e.g. 'email'. */
|
|
481
|
+
key: string;
|
|
482
|
+
/** Ids of the eligible selected rows. */
|
|
483
|
+
ids: string[];
|
|
484
|
+
/** The eligible selected rows (loaded page). */
|
|
485
|
+
rows: T[];
|
|
486
|
+
/** Selected rows the option's `eligible` refused. */
|
|
487
|
+
skippedCount: number;
|
|
488
|
+
}
|
|
440
489
|
/** Emitted by (rowReorder) after the user moves a row (`reorderable`). */
|
|
441
490
|
export interface TableRowReorderEvent<T = any> {
|
|
442
491
|
/** The row that was moved. */
|
|
@@ -1084,6 +1133,15 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
|
|
|
1084
1133
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
1085
1134
|
/** Accessible name for a select with no visible label (e.g. an inline row or table-cell select). */
|
|
1086
1135
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
1136
|
+
/**
|
|
1137
|
+
* Compact, label-less look for a filter above KPI cards or in a toolbar (library source 2026-11-04, not yet published). `true` renders NO visible
|
|
1138
|
+
* label row (no gap above the field; the `*` marker goes with it) while `label` stays the select's accessible name through `aria-label` and still
|
|
1139
|
+
* words the built-in "<label> is required." message. An explicit `ariaLabel` wins over `label`. Default `false` = unchanged. Combine with
|
|
1140
|
+
* `size="sm"`. (`ariaLabel` alone, with no `label`, was already the way to name a label-less select in a table cell.)
|
|
1141
|
+
*/
|
|
1142
|
+
readonly labelHidden: import("@angular/core").InputSignal<boolean>;
|
|
1143
|
+
/** Native `name` attribute placed on the inner `<select>` (e2e `[name=x]` selectors, autofill). None when empty. */
|
|
1144
|
+
readonly inputName: import("@angular/core").InputSignal<string>;
|
|
1087
1145
|
readonly placeholder: import("@angular/core").InputSignal<string>;
|
|
1088
1146
|
readonly options: import("@angular/core").InputSignal<SelectOption<string | number>[]>;
|
|
1089
1147
|
/** What the control value is: `'string'` (default, numeric option values become strings) or `'number'` (`number | null`). */
|
|
@@ -1095,7 +1153,7 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
|
|
|
1095
1153
|
readonly error: import("@angular/core").InputSignal<string>;
|
|
1096
1154
|
/** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
|
|
1097
1155
|
readonly showErrors: import("@angular/core").InputSignal<boolean>;
|
|
1098
|
-
readonly size: import("@angular/core").InputSignal<"
|
|
1156
|
+
readonly size: import("@angular/core").InputSignal<"sm" | "default">;
|
|
1099
1157
|
readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
|
|
1100
1158
|
private readonly _cvaDisabled;
|
|
1101
1159
|
protected readonly disabled: import("@angular/core").Signal<boolean>;
|
|
@@ -1124,6 +1182,13 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
|
|
|
1124
1182
|
validate(control: AbstractControl): ValidationErrors | null;
|
|
1125
1183
|
registerOnValidatorChange(fn: () => void): void;
|
|
1126
1184
|
protected readonly _selectId: string;
|
|
1185
|
+
private readonly _hostEl;
|
|
1186
|
+
/**
|
|
1187
|
+
* Library source 2026-11-04, not yet published. Puts the keyboard focus on the inner native `<select>` (`ref.focus()` via `viewChild`).
|
|
1188
|
+
* Same options as the DOM method (`{ preventScroll: true }`). Safe at any time: before the view exists, or on a disabled field, it does
|
|
1189
|
+
* nothing and never throws.
|
|
1190
|
+
*/
|
|
1191
|
+
focus(options?: FocusOptions): void;
|
|
1127
1192
|
private _onChange;
|
|
1128
1193
|
private _warned;
|
|
1129
1194
|
/** The comparison form of a key: in number mode a numeric text ('21.0', ' 21 ') becomes the canonical number text ('21'). */
|
|
@@ -1152,6 +1217,16 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
|
|
|
1152
1217
|
"required": false;
|
|
1153
1218
|
"isSignal": true;
|
|
1154
1219
|
};
|
|
1220
|
+
"labelHidden": {
|
|
1221
|
+
"alias": "labelHidden";
|
|
1222
|
+
"required": false;
|
|
1223
|
+
"isSignal": true;
|
|
1224
|
+
};
|
|
1225
|
+
"inputName": {
|
|
1226
|
+
"alias": "inputName";
|
|
1227
|
+
"required": false;
|
|
1228
|
+
"isSignal": true;
|
|
1229
|
+
};
|
|
1155
1230
|
"placeholder": {
|
|
1156
1231
|
"alias": "placeholder";
|
|
1157
1232
|
"required": false;
|
|
@@ -1540,7 +1615,21 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
|
|
|
1540
1615
|
readonly tabChange: import("@angular/core").OutputEmitterRef<string>;
|
|
1541
1616
|
/** Emitted when the user applies a bulk action. The table has already filtered to eligible IDs. */
|
|
1542
1617
|
readonly bulkAction: import("@angular/core").OutputEmitterRef<BulkActionEvent>;
|
|
1618
|
+
/**
|
|
1619
|
+
* Emitted when the user clicks a bulk action declared `{ field, action: true, opens: 'panel' }`. The table sends nothing: the host opens its
|
|
1620
|
+
* own panel for `rows` and, when it has finished, calls `clearSelection()` and `refresh()` on the table.
|
|
1621
|
+
*/
|
|
1622
|
+
readonly bulkPanelClick: import("@angular/core").OutputEmitterRef<BulkPanelEvent<T>>;
|
|
1543
1623
|
/** Emitted after a built-in single-row delete completes successfully. */
|
|
1624
|
+
/**
|
|
1625
|
+
* Emitted after every rows request that completes (a request superseded by a newer one emits nothing; first load, page, sort, search, tab, filter, `refresh()` ...): `{ ok: true, total }` when the rows
|
|
1626
|
+
* arrived (`total` = all matching rows), `{ ok: false, total }` when the request failed (the rows on screen are kept, `total` is the last known).
|
|
1627
|
+
* Lets a host refresh something that must follow the table (e.g. a failure banner above it).
|
|
1628
|
+
*/
|
|
1629
|
+
readonly loaded: import("@angular/core").OutputEmitterRef<{
|
|
1630
|
+
ok: boolean;
|
|
1631
|
+
total: number;
|
|
1632
|
+
}>;
|
|
1544
1633
|
readonly rowDeleted: import("@angular/core").OutputEmitterRef<T>;
|
|
1545
1634
|
/**
|
|
1546
1635
|
* Optional drag-and-drop ordering of the rows. Off by default; when `true` (and the user has full access) every row gets a grip
|
|
@@ -1763,6 +1852,8 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
|
|
|
1763
1852
|
private _hostConfirm;
|
|
1764
1853
|
/** Why a bulk action can't be used right now ('' = it can). Only Delete with `deletable` and a direct action with `eligible` can be blocked. */
|
|
1765
1854
|
protected _bulkBlockedReason(def: BulkActionDef): string;
|
|
1855
|
+
/** A panel action is not shown while the host says it is unavailable or no selected row is eligible. Everything else is always shown. */
|
|
1856
|
+
protected _bulkHidden(def: BulkActionDef): boolean;
|
|
1766
1857
|
/** The distinct reasons of the currently blocked bulk actions, shown as visible text next to the disabled buttons. */
|
|
1767
1858
|
protected _bulkBlockedHints(): string[];
|
|
1768
1859
|
/** Selected rows (loaded page) split by the delete option's `deletable` predicate; without it every selected row is deletable. */
|
|
@@ -1773,8 +1864,14 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
|
|
|
1773
1864
|
protected readonly _runningAction: import("@angular/core").WritableSignal<string | null>;
|
|
1774
1865
|
/** True while a direct action's confirm dialog is open (guards against a second click). */
|
|
1775
1866
|
private _confirmingAction;
|
|
1867
|
+
/** Panel action: no confirm and no request; hands the eligible rows to the host, which opens its own panel. */
|
|
1868
|
+
private _openBulkPanel;
|
|
1776
1869
|
/** Direct bulk action: confirm, then POST `<endpoint>/bulk/<key>` with `{ ids }` of the eligible rows. */
|
|
1777
1870
|
private _runDirectAction;
|
|
1871
|
+
/** Direct action that returns a file: POST `{ ids }` asking for a blob, save it as one download, toast, clear the selection. */
|
|
1872
|
+
private _runDownloadAction;
|
|
1873
|
+
/** The `{ message }` of a failed file request: with a blob response the error body arrives as a Blob, so it is read as text first. */
|
|
1874
|
+
private _downloadErrorMessage;
|
|
1778
1875
|
/** Called when the user clicks a bulk action button in the selection bar. */
|
|
1779
1876
|
protected onBulkActionClick(def: BulkActionDef): void;
|
|
1780
1877
|
/** True while the field-change confirmation dialog is open (guards against a second Apply click). */
|
|
@@ -2123,6 +2220,8 @@ export declare class DataTableComponent<T extends Record<string, any>> implement
|
|
|
2123
2220
|
"selectionChange": "selectionChange";
|
|
2124
2221
|
"tabChange": "tabChange";
|
|
2125
2222
|
"bulkAction": "bulkAction";
|
|
2223
|
+
"bulkPanelClick": "bulkPanelClick";
|
|
2224
|
+
"loaded": "loaded";
|
|
2126
2225
|
"rowDeleted": "rowDeleted";
|
|
2127
2226
|
"rowReorder": "rowReorder";
|
|
2128
2227
|
}, never, never, true, never>;
|
|
@@ -2173,6 +2272,15 @@ export declare class SidePanelComponent implements OnDestroy {
|
|
|
2173
2272
|
readonly closed: import("@angular/core").OutputEmitterRef<void>;
|
|
2174
2273
|
readonly primaryClick: import("@angular/core").OutputEmitterRef<void>;
|
|
2175
2274
|
protected readonly titleId: string;
|
|
2275
|
+
/**
|
|
2276
|
+
* (library source 2026-11-04, not yet published) True while the scrollable body (`.sp-body`) is taller than the space it has.
|
|
2277
|
+
* Only then the body is a keyboard Tab stop (`tabindex="0"`, `role="group"`, named by the panel title via `aria-labelledby`)
|
|
2278
|
+
* so keyboard users can scroll it with the arrow keys / Space / PageUp / PageDown. While the content fits, the body carries
|
|
2279
|
+
* none of those attributes (unchanged markup). Kept current by a ResizeObserver + MutationObserver on the body.
|
|
2280
|
+
*/
|
|
2281
|
+
readonly bodyScrollable: import("@angular/core").WritableSignal<boolean>;
|
|
2282
|
+
private readonly _bodyRef;
|
|
2283
|
+
private _bodyObservers;
|
|
2176
2284
|
private readonly _el;
|
|
2177
2285
|
private readonly _doc;
|
|
2178
2286
|
private readonly _overlays;
|
|
@@ -2182,6 +2290,14 @@ export declare class SidePanelComponent implements OnDestroy {
|
|
|
2182
2290
|
private _stopIframeKeys;
|
|
2183
2291
|
private readonly _interaction;
|
|
2184
2292
|
constructor();
|
|
2293
|
+
/**
|
|
2294
|
+
* Re-measures the body now (`scrollHeight` vs `clientHeight`, 1px tolerance for sub-pixel rounding) and updates
|
|
2295
|
+
* `bodyScrollable`. Called by the observers; also usable by a host that changes the body content in a way no observer sees.
|
|
2296
|
+
*/
|
|
2297
|
+
refreshScrollable(): void;
|
|
2298
|
+
/** Starts observing the (new) body element, or stops observing when the body is gone (panel closed). */
|
|
2299
|
+
private _watchBody;
|
|
2300
|
+
private _stopWatchingBody;
|
|
2185
2301
|
onKeydown(event: KeyboardEvent): void;
|
|
2186
2302
|
/** A focus-guard sentinel received focus (Tab left the panel's tab order, e.g. out of an iframe): send it back inside. */
|
|
2187
2303
|
protected onGuardFocus(which: 'start' | 'end', event?: FocusEvent): void;
|
|
@@ -2272,7 +2388,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
|
|
|
2272
2388
|
*/
|
|
2273
2389
|
readonly describedBy: import("@angular/core").InputSignal<string | null>;
|
|
2274
2390
|
readonly maxWidth: import("@angular/core").InputSignal<string>;
|
|
2275
|
-
readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "
|
|
2391
|
+
readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "visible" | "auto">;
|
|
2276
2392
|
/** `data-testid` of the dialog element itself (the host `<ui-modal>` is always in the page, the dialog only while open). None when empty. */
|
|
2277
2393
|
readonly dialogTestId: import("@angular/core").InputSignal<string>;
|
|
2278
2394
|
/** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
|
|
@@ -2443,6 +2559,14 @@ export interface ToastOptions {
|
|
|
2443
2559
|
key?: string;
|
|
2444
2560
|
/** Called with the `id` of a button when it is used (before the toast closes). */
|
|
2445
2561
|
onAction?: (actionId: string) => void;
|
|
2562
|
+
/**
|
|
2563
|
+
* (library source 2026-11-04, not yet published) Default `false` (unchanged). `true` = if a toast with the SAME message and the SAME type is on screen right
|
|
2564
|
+
* now, show this one as a fresh toast of its own: the toast element is re-created (so a screen reader announces the text again and the
|
|
2565
|
+
* entry animation replays), the dismiss timer restarts with this call's duration, and the title / buttons / countdown of this call replace
|
|
2566
|
+
* the old ones. Nothing is queued. If the message on screen is different (or nothing is showing) `repeat` changes nothing. Without
|
|
2567
|
+
* `repeat`, an identical message arriving while it is on screen only restarts the timer silently: it is not announced again.
|
|
2568
|
+
*/
|
|
2569
|
+
repeat?: boolean;
|
|
2446
2570
|
}
|
|
2447
2571
|
/** What is known about the toast on screen beyond its message and type; `null` for a plain toast. */
|
|
2448
2572
|
export interface ToastDetails {
|
|
@@ -2469,6 +2593,11 @@ export declare class ToastService implements OnDestroy {
|
|
|
2469
2593
|
readonly persistentLiveRegion: import("@angular/core").WritableSignal<boolean>;
|
|
2470
2594
|
/** The title, buttons, countdown flag, key and callback of the toast on screen; `null` for a plain toast or none. */
|
|
2471
2595
|
readonly details: import("@angular/core").WritableSignal<ToastDetails | null>;
|
|
2596
|
+
/**
|
|
2597
|
+
* (library source 2026-11-04, not yet published) Counts the `repeat: true` re-presentations of an identical message. The outlet re-creates the toast
|
|
2598
|
+
* element whenever it changes, which is what makes a screen reader announce the same text again. Starts at 0 and only grows.
|
|
2599
|
+
*/
|
|
2600
|
+
readonly repeatTick: import("@angular/core").WritableSignal<number>;
|
|
2472
2601
|
/** How many toasts are waiting behind the one on screen (queue mode). */
|
|
2473
2602
|
readonly queuedCount: import("@angular/core").WritableSignal<number>;
|
|
2474
2603
|
/** Default for `ToastOptions.queue`: new toasts wait for the one on screen instead of replacing it. Set with `provideForgerouteToast({ queue: true })` or `<ui-toast [queue]="true" />`. */
|
|
@@ -2560,6 +2689,8 @@ export declare class ToastComponent {
|
|
|
2560
2689
|
readonly queueLabel: import("@angular/core").InputSignal<string>;
|
|
2561
2690
|
/** A toast button was used (also after its own `onAction`). */
|
|
2562
2691
|
readonly action: import("@angular/core").OutputEmitterRef<ToastActionEvent>;
|
|
2692
|
+
/** One entry that changes with every `repeat: true` toast: the @for re-creates the toast element, so identical text is announced again. */
|
|
2693
|
+
protected readonly repeatKeys: import("@angular/core").Signal<number[]>;
|
|
2563
2694
|
protected readonly isRich: import("@angular/core").Signal<boolean>;
|
|
2564
2695
|
protected readonly countdownPct: import("@angular/core").Signal<number>;
|
|
2565
2696
|
protected readonly countdownText: import("@angular/core").Signal<string>;
|
|
@@ -2572,6 +2703,7 @@ export declare class ToastComponent {
|
|
|
2572
2703
|
*/
|
|
2573
2704
|
private readonly _adoptedMessage;
|
|
2574
2705
|
protected readonly adopted: import("@angular/core").Signal<boolean>;
|
|
2706
|
+
private _lastRepeatTick;
|
|
2575
2707
|
private _wasWaiting;
|
|
2576
2708
|
private _hover;
|
|
2577
2709
|
private _focus;
|
|
@@ -2830,7 +2962,7 @@ export declare class AudioPlayerComponent {
|
|
|
2830
2962
|
/** Accessible name of the player. */
|
|
2831
2963
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
2832
2964
|
/** How much to load before play: 'metadata' (default), 'auto' or 'none'. */
|
|
2833
|
-
readonly preload: import("@angular/core").InputSignal<"none" | "
|
|
2965
|
+
readonly preload: import("@angular/core").InputSignal<"none" | "metadata" | "auto">;
|
|
2834
2966
|
/** Fires when the browser can't load or decode the source. */
|
|
2835
2967
|
readonly playbackError: import("@angular/core").OutputEmitterRef<void>;
|
|
2836
2968
|
protected readonly failed: import("@angular/core").WritableSignal<boolean>;
|
|
@@ -3084,7 +3216,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
|
|
|
3084
3216
|
* clicking it still toggles the box - e.g. a product name that is both the heading of its card and the label of its checkbox.
|
|
3085
3217
|
* Default null: plain label text, exactly as before. Single mode only.
|
|
3086
3218
|
*/
|
|
3087
|
-
readonly headingLevel: import("@angular/core").InputSignal<1 |
|
|
3219
|
+
readonly headingLevel: import("@angular/core").InputSignal<2 | 1 | 5 | 3 | 4 | 6 | null>;
|
|
3088
3220
|
readonly indeterminate: import("@angular/core").InputSignal<boolean>;
|
|
3089
3221
|
readonly checked: import("@angular/core").ModelSignal<boolean>;
|
|
3090
3222
|
/**
|
|
@@ -3308,6 +3440,8 @@ export declare class ToggleComponent implements ControlValueAccessor {
|
|
|
3308
3440
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
3309
3441
|
/** Id of another element that describes the switch (e.g. a description rendered elsewhere); announced after the hint. Absent when empty. */
|
|
3310
3442
|
readonly ariaDescribedBy: import("@angular/core").InputSignal<string>;
|
|
3443
|
+
/** `data-testid` put on the inner `<input role="switch">` (the host keeps its own attributes), so e2e can target the switch directly. Absent when empty. */
|
|
3444
|
+
readonly inputTestId: import("@angular/core").InputSignal<string>;
|
|
3311
3445
|
/** Whether the switch is on. Two-way: `[(checked)]`. */
|
|
3312
3446
|
readonly checked: import("@angular/core").ModelSignal<boolean>;
|
|
3313
3447
|
/** Public so a host template can bind `[disabled]` (a protected input fails strict template type-checking, TS2445). */
|
|
@@ -3350,6 +3484,11 @@ export declare class ToggleComponent implements ControlValueAccessor {
|
|
|
3350
3484
|
"required": false;
|
|
3351
3485
|
"isSignal": true;
|
|
3352
3486
|
};
|
|
3487
|
+
"inputTestId": {
|
|
3488
|
+
"alias": "inputTestId";
|
|
3489
|
+
"required": false;
|
|
3490
|
+
"isSignal": true;
|
|
3491
|
+
};
|
|
3353
3492
|
"checked": {
|
|
3354
3493
|
"alias": "checked";
|
|
3355
3494
|
"required": false;
|
|
@@ -3482,7 +3621,7 @@ export declare class StepperComponent {
|
|
|
3482
3621
|
* its circle, one continuous line behind the circles that fills as steps complete; a complete step shows a check, the current step an
|
|
3483
3622
|
* accent ring with a dot, an upcoming step an empty circle (no numbers). Circles are 40px (32px with `size="sm"`).
|
|
3484
3623
|
*/
|
|
3485
|
-
readonly labelPosition: import("@angular/core").InputSignal<"
|
|
3624
|
+
readonly labelPosition: import("@angular/core").InputSignal<"below" | "beside">;
|
|
3486
3625
|
/** Viewport width in px below which a horizontal stepper is drawn vertical (labels beside the circles), e.g. `640`. null (default) = never. */
|
|
3487
3626
|
readonly stackBelow: import("@angular/core").InputSignal<number | null>;
|
|
3488
3627
|
/** CSS length (e.g. `10.5rem`): horizontal only - the list gets `min-width: calc(<step count> * <value>)`. Empty (default) = no minimum. */
|
|
@@ -3799,6 +3938,11 @@ export interface RadioOption {
|
|
|
3799
3938
|
disabled?: boolean;
|
|
3800
3939
|
/** `data-testid` of this option's native radio input (e.g. for end-to-end tests); none when omitted. */
|
|
3801
3940
|
testId?: string;
|
|
3941
|
+
/**
|
|
3942
|
+
* Library source 2026-11-04, not yet published. Icon drawn in front of the option's label: a `<ui-icon>` key (`cup`, `wrench`, ...) or a raw SVG
|
|
3943
|
+
* path. Decorative (`aria-hidden`); none when omitted.
|
|
3944
|
+
*/
|
|
3945
|
+
icon?: string;
|
|
3802
3946
|
}
|
|
3803
3947
|
/**
|
|
3804
3948
|
* Group of native radio buttons inside a `<fieldset>` (+ `<legend>` = `label`), a ControlValueAccessor (string value, `''`
|
|
@@ -3995,7 +4139,7 @@ export declare class PhoneNumberPickerComponent {
|
|
|
3995
4139
|
protected readonly modeCtl: FormControl<string>;
|
|
3996
4140
|
protected readonly zipCtl: FormControl<string>;
|
|
3997
4141
|
protected readonly areaCtl: FormControl<string>;
|
|
3998
|
-
protected readonly step: import("@angular/core").WritableSignal<
|
|
4142
|
+
protected readonly step: import("@angular/core").WritableSignal<2 | 1 | 3>;
|
|
3999
4143
|
protected readonly mode: import("@angular/core").WritableSignal<PhoneNumberSearchMode>;
|
|
4000
4144
|
private readonly _zip;
|
|
4001
4145
|
private readonly _area;
|
|
@@ -4111,7 +4255,7 @@ export declare class ButtonComponent {
|
|
|
4111
4255
|
* `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
|
|
4112
4256
|
* background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
|
|
4113
4257
|
*/
|
|
4114
|
-
readonly variant: import("@angular/core").InputSignal<"primary" | "secondary" | "danger" | "warning" | "
|
|
4258
|
+
readonly variant: import("@angular/core").InputSignal<"link" | "primary" | "secondary" | "danger" | "warning" | "icon" | "ghost" | "ghost-start" | "tab" | "icon-danger">;
|
|
4115
4259
|
/** Renders an anchor to this route instead of a button (use with `variant="link"` for an inline text link). `['/settings']` or `'/settings'`. While `disabled` or `loading` it renders a non-clickable `<span role="link" aria-disabled>` with no href (like `href`). */
|
|
4116
4260
|
readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
|
|
4117
4261
|
/** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
|
|
@@ -4132,7 +4276,7 @@ export declare class ButtonComponent {
|
|
|
4132
4276
|
*/
|
|
4133
4277
|
readonly href: import("@angular/core").InputSignal<string | null>;
|
|
4134
4278
|
/** Where to open the `href` (`_blank` = a new tab). */
|
|
4135
|
-
readonly target: import("@angular/core").InputSignal<"
|
|
4279
|
+
readonly target: import("@angular/core").InputSignal<"_blank" | "_self" | "_parent" | "_top" | null>;
|
|
4136
4280
|
/** `rel` of the `href` link. A `_blank` target always gets `noopener noreferrer` added. */
|
|
4137
4281
|
readonly rel: import("@angular/core").InputSignal<string | null>;
|
|
4138
4282
|
/** The href when it is allowed (http, https, mailto, tel, sms or a relative URL), else null. */
|
|
@@ -4166,6 +4310,14 @@ export declare class ButtonComponent {
|
|
|
4166
4310
|
readonly ariaPressed: import("@angular/core").InputSignal<boolean | undefined>;
|
|
4167
4311
|
/** Id of the element that describes this button (an error or hint rendered next to it), e.g. `<ui-error errorId="x">`. Absent when empty. */
|
|
4168
4312
|
readonly ariaDescribedBy: import("@angular/core").InputSignal<string | undefined>;
|
|
4313
|
+
private readonly _hostEl;
|
|
4314
|
+
/**
|
|
4315
|
+
* Library source 2026-11-04, not yet published. Puts the keyboard focus on the inner native control (the `<button>`, or the `<a>` of a
|
|
4316
|
+
* `routerLink` / `href` button): `buttonRef.focus()` via `viewChild(ButtonComponent)`. Same options as the DOM method (`{ preventScroll: true }`).
|
|
4317
|
+
* Safe at any time: before the view exists, or while the button is `disabled` / `loading` (a disabled `<button>` cannot take focus; the
|
|
4318
|
+
* disabled-link `<span>` is not focusable), it does nothing and never throws.
|
|
4319
|
+
*/
|
|
4320
|
+
focus(options?: FocusOptions): void;
|
|
4169
4321
|
constructor();
|
|
4170
4322
|
_footerLeft?: string;
|
|
4171
4323
|
_footerRight?: string;
|
|
@@ -4376,11 +4528,26 @@ export declare class PillTabsComponent {
|
|
|
4376
4528
|
/** 'vertical' stacks the tabs in a column (Up/Down arrows move between them, `aria-orientation="vertical"`). Default 'horizontal' = unchanged. */
|
|
4377
4529
|
readonly orientation: import("@angular/core").InputSignal<"vertical" | "horizontal">;
|
|
4378
4530
|
protected readonly vertical: () => boolean;
|
|
4531
|
+
/**
|
|
4532
|
+
* (library source 2026-11-04, not yet published) Associate the tabs with their panels: every tab gets
|
|
4533
|
+
* `aria-controls="<name>-panel-<key>"`, the id a `uiTabPanel` directive gives its element (see `PillTabPanelDirective`).
|
|
4534
|
+
* Default false = no `aria-controls` at all (unchanged markup). Turn it on only when every tab has a `uiTabPanel`
|
|
4535
|
+
* element in the page, otherwise `aria-controls` would point at a missing id. The tab ids themselves are unchanged
|
|
4536
|
+
* and always `<name>-<key>` (see `pillTabId`).
|
|
4537
|
+
*
|
|
4538
|
+
* Id collision: a tab whose KEY is `panel-x` has the id `<name>-panel-x`, which is also the panel id for key `x`. Avoid keys that start with
|
|
4539
|
+
* `panel-` when this is on; in development mode a `console.warn` names such a key.
|
|
4540
|
+
*/
|
|
4541
|
+
readonly controlsPanels: import("@angular/core").InputSignal<boolean>;
|
|
4379
4542
|
readonly tabChange: import("@angular/core").OutputEmitterRef<string>;
|
|
4380
4543
|
/** True while pills are hidden past the start / end edge of the scroll area (drives the fade hints). */
|
|
4381
4544
|
protected readonly canScrollStart: import("@angular/core").WritableSignal<boolean>;
|
|
4382
4545
|
protected readonly canScrollEnd: import("@angular/core").WritableSignal<boolean>;
|
|
4383
4546
|
constructor();
|
|
4547
|
+
/** Id of the tab button for [key] (`<name>-<key>`, the exported `pillTabId`). */
|
|
4548
|
+
protected tabId(key: string): string;
|
|
4549
|
+
/** Id of the panel [key] controls (`<name>-panel-<key>`, the exported `pillTabPanelId`). */
|
|
4550
|
+
protected panelId(key: string): string;
|
|
4384
4551
|
protected updateOverflow(): void;
|
|
4385
4552
|
select(key: string): void;
|
|
4386
4553
|
/** Roving tabindex — the selected tab (or the first enabled one when none is selected) is tabbable. */
|
|
@@ -4418,10 +4585,80 @@ export declare class PillTabsComponent {
|
|
|
4418
4585
|
"required": false;
|
|
4419
4586
|
"isSignal": true;
|
|
4420
4587
|
};
|
|
4588
|
+
"controlsPanels": {
|
|
4589
|
+
"alias": "controlsPanels";
|
|
4590
|
+
"required": false;
|
|
4591
|
+
"isSignal": true;
|
|
4592
|
+
};
|
|
4421
4593
|
}, {
|
|
4422
4594
|
"tabChange": "tabChange";
|
|
4423
4595
|
}, never, never, true, never>;
|
|
4424
4596
|
}
|
|
4597
|
+
/** Id of the tab button `ui-pill-tabs` renders for [key] when its `name` input is [name] (always `<name>-<key>`). */
|
|
4598
|
+
export declare function pillTabId(name: string, key: string): string;
|
|
4599
|
+
/** Id a `uiTabPanel` element gets, and the id every tab's `aria-controls` points at when `controlsPanels` is on: `<name>-panel-<key>`. */
|
|
4600
|
+
export declare function pillTabPanelId(name: string, key: string): string;
|
|
4601
|
+
/**
|
|
4602
|
+
* (library source 2026-11-04, not yet published) The panel that belongs to one `ui-pill-tabs` tab: a correct
|
|
4603
|
+
* WAI-ARIA tablist / tabpanel association with the smallest possible markup.
|
|
4604
|
+
*
|
|
4605
|
+
* ```html
|
|
4606
|
+
* <ui-pill-tabs name="billing" [tabs]="tabs" [activeKey]="tab()" [controlsPanels]="true" (tabChange)="tab.set($event)" />
|
|
4607
|
+
* <section uiTabPanel="invoices" tabsName="billing" [activeKey]="tab()"> ... </section>
|
|
4608
|
+
* <section uiTabPanel="payments" tabsName="billing" [activeKey]="tab()"> ... </section>
|
|
4609
|
+
* ```
|
|
4610
|
+
*
|
|
4611
|
+
* The host element gets `role="tabpanel"`, `id="<tabsName>-panel-<key>"` and `aria-labelledby="<tabsName>-<key>"` (the tab button).
|
|
4612
|
+
* - `uiTabPanel` the key of the tab this panel belongs to (required, the same `key` as in the tabs list).
|
|
4613
|
+
* - `tabsName` the `name` input of the `ui-pill-tabs` (required; give the tabs a fixed `name` so the ids are predictable).
|
|
4614
|
+
* - `activeKey` the tabs' active key. When given (not null), the panel gets the `hidden` attribute while another tab is active
|
|
4615
|
+
* (the panels stay in the DOM, so their state survives a tab change). Leave it unset when the page renders only the
|
|
4616
|
+
* active panel itself (`@if`), then no `hidden` attribute is ever set.
|
|
4617
|
+
* - `tabbable` default false. true adds `tabindex="0"` so a panel without any focusable content can be reached by keyboard
|
|
4618
|
+
* (WAI-ARIA tabs pattern).
|
|
4619
|
+
*
|
|
4620
|
+
* Id collision: ids are plain strings, so a tab whose KEY is `panel-x` has the tab id `<name>-panel-x`, which is the same string as the panel id of the
|
|
4621
|
+
* key `x`. Do not use keys that start with `panel-` together with `controlsPanels` (`ui-pill-tabs` logs a `console.warn` for such a key in development mode).
|
|
4622
|
+
*
|
|
4623
|
+
* Note: the `hidden` attribute loses against an author rule such as `display: flex` on the same element; put such layout on an
|
|
4624
|
+
* inner element, or style `[hidden] { display: none }`.
|
|
4625
|
+
*/
|
|
4626
|
+
export declare class PillTabPanelDirective {
|
|
4627
|
+
/** Key of the tab this panel belongs to. */
|
|
4628
|
+
readonly key: import("@angular/core").InputSignal<string>;
|
|
4629
|
+
/** `name` of the `ui-pill-tabs` this panel belongs to. */
|
|
4630
|
+
readonly tabsName: import("@angular/core").InputSignal<string>;
|
|
4631
|
+
/** Active key of the tabs; the panel is `hidden` while it is another key. null (default) = never hidden by this directive. */
|
|
4632
|
+
readonly activeKey: import("@angular/core").InputSignal<string | null>;
|
|
4633
|
+
/** Makes the panel itself a Tab stop (for panels with no focusable content). Default false. */
|
|
4634
|
+
readonly tabbable: import("@angular/core").InputSignal<boolean>;
|
|
4635
|
+
protected panelId(): string;
|
|
4636
|
+
protected tabId(): string;
|
|
4637
|
+
protected isHidden(): boolean;
|
|
4638
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PillTabPanelDirective, never>;
|
|
4639
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<PillTabPanelDirective, "[uiTabPanel]", never, {
|
|
4640
|
+
"key": {
|
|
4641
|
+
"alias": "uiTabPanel";
|
|
4642
|
+
"required": true;
|
|
4643
|
+
"isSignal": true;
|
|
4644
|
+
};
|
|
4645
|
+
"tabsName": {
|
|
4646
|
+
"alias": "tabsName";
|
|
4647
|
+
"required": true;
|
|
4648
|
+
"isSignal": true;
|
|
4649
|
+
};
|
|
4650
|
+
"activeKey": {
|
|
4651
|
+
"alias": "activeKey";
|
|
4652
|
+
"required": false;
|
|
4653
|
+
"isSignal": true;
|
|
4654
|
+
};
|
|
4655
|
+
"tabbable": {
|
|
4656
|
+
"alias": "tabbable";
|
|
4657
|
+
"required": false;
|
|
4658
|
+
"isSignal": true;
|
|
4659
|
+
};
|
|
4660
|
+
}, {}, never, never, true, never>;
|
|
4661
|
+
}
|
|
4425
4662
|
export interface ContactLookup {
|
|
4426
4663
|
id: string;
|
|
4427
4664
|
name: string;
|
|
@@ -4663,7 +4900,7 @@ export declare class ImportSourceGridComponent {
|
|
|
4663
4900
|
/** The `value` of the picked source (highlighted). `tile` only: the `card` appearance does not keep a selection. */
|
|
4664
4901
|
readonly selected: import("@angular/core").InputSignal<string>;
|
|
4665
4902
|
/** `tile`: the compact buttons of the import window. `card`: one `ui-detail-card` per source with its own select button (used on a page). */
|
|
4666
|
-
readonly appearance: import("@angular/core").InputSignal<"
|
|
4903
|
+
readonly appearance: import("@angular/core").InputSignal<"tile" | "card">;
|
|
4667
4904
|
/** `card`: disables every card's button (for example while the page is saving). */
|
|
4668
4905
|
readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
4669
4906
|
/** `card`: the text of each card's button. */
|
|
@@ -4860,7 +5097,7 @@ export declare class BankAccountFormComponent implements UiFieldValidity {
|
|
|
4860
5097
|
protected readonly accountError: import("@angular/core").Signal<"" | "Account number must be at least 4 digits.">;
|
|
4861
5098
|
protected readonly confirmError: import("@angular/core").Signal<"" | "Account numbers do not match.">;
|
|
4862
5099
|
/** First reason the form cannot be submitted ('' when it can). */
|
|
4863
|
-
readonly errorMessage: import("@angular/core").Signal<"" | "
|
|
5100
|
+
readonly errorMessage: import("@angular/core").Signal<"" | "Routing number must be 9 digits." | "Account number must be at least 4 digits." | "Account numbers do not match." | "Account holder name is required." | "Routing number is required." | "Account number is required." | "Confirm account number is required." | "Select a valid account type." | "Select a valid holder type." | "You must authorize ACH debits to continue.">;
|
|
4864
5101
|
/** True while the form cannot be submitted (`UiFieldValidity`). */
|
|
4865
5102
|
readonly invalid: import("@angular/core").Signal<boolean>;
|
|
4866
5103
|
/** True when the form can be submitted (ignores `disabled` / `busy`). */
|
|
@@ -4929,7 +5166,11 @@ export interface ActiveConfirm {
|
|
|
4929
5166
|
/** Optional bullet list rendered under the message (plain text). */
|
|
4930
5167
|
details: string[];
|
|
4931
5168
|
}
|
|
4932
|
-
export declare class ConfirmService {
|
|
5169
|
+
export declare class ConfirmService implements OnDestroy {
|
|
5170
|
+
private readonly _appRef;
|
|
5171
|
+
private readonly _envInjector;
|
|
5172
|
+
private readonly _doc;
|
|
5173
|
+
private readonly _browser;
|
|
4933
5174
|
private _open;
|
|
4934
5175
|
private _active;
|
|
4935
5176
|
private _resolve;
|
|
@@ -4943,8 +5184,24 @@ export declare class ConfirmService {
|
|
|
4943
5184
|
*/
|
|
4944
5185
|
private readonly _outlets;
|
|
4945
5186
|
readonly primaryOutlet: import("@angular/core").Signal<object>;
|
|
5187
|
+
/**
|
|
5188
|
+
* The outlet this service created itself because `confirm()` was called while no `<ui-confirm-outlet>` existed (a page without a
|
|
5189
|
+
* `ui-data-table` and without a hand-placed outlet). Null while a template-placed outlet exists, before the first such confirm, and
|
|
5190
|
+
* on the server. Library source 2026-11-04, not yet published.
|
|
5191
|
+
*/
|
|
5192
|
+
private _auto;
|
|
5193
|
+
/** True when a template-placed outlet appeared while the auto outlet's dialog was open: the auto outlet is removed once that dialog closes. */
|
|
5194
|
+
private _retireAutoOnDismiss;
|
|
4946
5195
|
registerOutlet(outlet: object): void;
|
|
4947
5196
|
unregisterOutlet(outlet: object): void;
|
|
5197
|
+
ngOnDestroy(): void;
|
|
5198
|
+
/**
|
|
5199
|
+
* Makes sure some outlet exists to render the dialog. Template-placed outlets (data-table, app-shell, a hand-placed
|
|
5200
|
+
* `<ui-confirm-outlet />`) are used as they are; only when there is none is one outlet created and attached to `document.body`
|
|
5201
|
+
* (reused for later confirms, removed when the service is destroyed or a template-placed outlet appears). Does nothing without a DOM (SSR).
|
|
5202
|
+
*/
|
|
5203
|
+
private _ensureOutlet;
|
|
5204
|
+
private _destroyAuto;
|
|
4948
5205
|
confirm(config: {
|
|
4949
5206
|
title: string;
|
|
4950
5207
|
message: string;
|
|
@@ -4999,12 +5256,19 @@ export declare class EmptyStateComponent {
|
|
|
4999
5256
|
}, {}, never, ["*"], true, never>;
|
|
5000
5257
|
}
|
|
5001
5258
|
export declare class ErrorStateComponent {
|
|
5259
|
+
/** Optional bold heading line above the message (e.g. "Unable to load application"). Empty = no heading. */
|
|
5260
|
+
readonly title: import("@angular/core").InputSignal<string>;
|
|
5002
5261
|
readonly message: import("@angular/core").InputSignal<string>;
|
|
5003
5262
|
readonly retryLabel: import("@angular/core").InputSignal<string>;
|
|
5004
5263
|
readonly retrying: import("@angular/core").InputSignal<boolean>;
|
|
5005
5264
|
readonly retry: import("@angular/core").OutputEmitterRef<void>;
|
|
5006
5265
|
static ɵfac: i0.ɵɵFactoryDeclaration<ErrorStateComponent, never>;
|
|
5007
5266
|
static ɵcmp: i0.ɵɵComponentDeclaration<ErrorStateComponent, "ui-error-state", never, {
|
|
5267
|
+
"title": {
|
|
5268
|
+
"alias": "title";
|
|
5269
|
+
"required": false;
|
|
5270
|
+
"isSignal": true;
|
|
5271
|
+
};
|
|
5008
5272
|
"message": {
|
|
5009
5273
|
"alias": "message";
|
|
5010
5274
|
"required": false;
|
|
@@ -5082,6 +5346,8 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
5082
5346
|
* and `inputTestId="email-input"`. Omitted = no attribute.
|
|
5083
5347
|
*/
|
|
5084
5348
|
readonly inputTestId: import("@angular/core").InputSignal<string>;
|
|
5349
|
+
/** Native `name` attribute placed on the inner `<input>` (e2e `[name=x]` selectors, browser autofill). None when empty. */
|
|
5350
|
+
readonly inputName: import("@angular/core").InputSignal<string>;
|
|
5085
5351
|
readonly placeholder: import("@angular/core").InputSignal<string>;
|
|
5086
5352
|
/**
|
|
5087
5353
|
* An optional leading mark shown inside the field, left of the text (e.g. `prefix="$"` for a dollar amount). Hidden unless set; it is
|
|
@@ -5089,6 +5355,12 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
5089
5355
|
* Meant for a short mark of 1-3 characters.
|
|
5090
5356
|
*/
|
|
5091
5357
|
readonly prefix: import("@angular/core").InputSignal<string>;
|
|
5358
|
+
/**
|
|
5359
|
+
* Library source 2026-11-04, not yet published. An optional icon at the left inside the field: a `<ui-icon>` key, e.g. `leadingIcon="search"` for a search field.
|
|
5360
|
+
* Decorative (`aria-hidden`, no pointer events, not part of the value), so give the field a `label` or `ariaLabel`. The input's left padding grows to
|
|
5361
|
+
* make room (36px; with a `prefix` the mark moves right of the icon). An unknown key or empty (default) draws nothing and changes nothing.
|
|
5362
|
+
*/
|
|
5363
|
+
readonly leadingIcon: import("@angular/core").InputSignal<string>;
|
|
5092
5364
|
/**
|
|
5093
5365
|
* `type="password"` only: puts an eye button inside the field, at its right end, that shows / hides the typed text (the eye with a slash
|
|
5094
5366
|
* means "hidden again"). Per field, starts hidden; the button is a toggle (`aria-pressed`) named "Show password". Ignored for other types.
|
|
@@ -5101,7 +5373,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
5101
5373
|
readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
|
|
5102
5374
|
/** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
|
|
5103
5375
|
readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
|
|
5104
|
-
readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "
|
|
5376
|
+
readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "password" | "tel" | "url">;
|
|
5105
5377
|
readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
|
|
5106
5378
|
readonly required: import("@angular/core").InputSignal<boolean>;
|
|
5107
5379
|
readonly autocomplete: import("@angular/core").InputSignal<string>;
|
|
@@ -5110,7 +5382,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
5110
5382
|
* `search`, `text`, `none`). Empty (default) = the browser's default for the field, except `type="tel"`, which keeps `tel`.
|
|
5111
5383
|
* It only picks the keyboard; it does not restrict what can be typed or pasted.
|
|
5112
5384
|
*/
|
|
5113
|
-
readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "
|
|
5385
|
+
readonly inputmode: import("@angular/core").InputSignal<"" | "none" | "text" | "email" | "search" | "tel" | "url" | "decimal" | "numeric">;
|
|
5114
5386
|
readonly readonly: import("@angular/core").InputSignal<boolean>;
|
|
5115
5387
|
readonly hint: import("@angular/core").InputSignal<string>;
|
|
5116
5388
|
/** Id(s) of an external element that also describes this control (e.g. one shared error text for a group of fields). Space separated; MERGED after the control's own hint / error id in `aria-describedby`, never replacing it. Empty = unchanged. */
|
|
@@ -5168,15 +5440,21 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
5168
5440
|
protected readonly disabled: import("@angular/core").Signal<boolean>;
|
|
5169
5441
|
protected readonly _value: import("@angular/core").WritableSignal<string>;
|
|
5170
5442
|
private readonly _reveal;
|
|
5171
|
-
/**
|
|
5443
|
+
/** Path of the leading icon, or null when `leadingIcon` is empty or not a known icon key. */
|
|
5444
|
+
protected readonly _leadingD: import("@angular/core").Signal<string | null>;
|
|
5445
|
+
/**
|
|
5446
|
+
* Left padding that makes room for the prefix (its width in `ch` plus the field's own 12px and a 6px gap) and/or the leading icon (a 16px icon
|
|
5447
|
+
* plus an 8px gap, so 36px from the edge); none without either.
|
|
5448
|
+
*/
|
|
5172
5449
|
protected readonly _prefixPadding: import("@angular/core").Signal<string | null>;
|
|
5450
|
+
private readonly _fieldEl;
|
|
5173
5451
|
/** True when the control value is a number: `valueType="number"` on a `type="number"` field. */
|
|
5174
5452
|
private readonly _numeric;
|
|
5175
5453
|
/** The native `step` attribute: only for `type="number"` and only for a finite number above 0; otherwise none (the browser's step of 1). */
|
|
5176
5454
|
protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
|
|
5177
5455
|
protected readonly _revealable: import("@angular/core").Signal<boolean>;
|
|
5178
5456
|
protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
|
|
5179
|
-
protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "
|
|
5457
|
+
protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "password" | "tel" | "url">;
|
|
5180
5458
|
protected readonly _eyePath: string;
|
|
5181
5459
|
protected readonly _eyeOffPath: string;
|
|
5182
5460
|
protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
|
|
@@ -5195,6 +5473,12 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
5195
5473
|
protected readonly _activeError: import("@angular/core").Signal<string>;
|
|
5196
5474
|
protected readonly _inputId: string;
|
|
5197
5475
|
private static readonly _EMAIL_RE;
|
|
5476
|
+
/**
|
|
5477
|
+
* Library source 2026-11-04, not yet published. Puts the keyboard focus on the inner `<input>` (e.g. after a panel opens or a search is cleared):
|
|
5478
|
+
* `fieldRef.focus()` via `viewChild(TextInputComponent)`. Same options as the DOM method (`{ preventScroll: true }`). Safe at any time: before the
|
|
5479
|
+
* view exists, or on a disabled field, it does nothing and never throws.
|
|
5480
|
+
*/
|
|
5481
|
+
focus(options?: FocusOptions): void;
|
|
5198
5482
|
private _onChange;
|
|
5199
5483
|
private _onTouched;
|
|
5200
5484
|
private _onValidatorChange;
|
|
@@ -5240,6 +5524,11 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
5240
5524
|
"required": false;
|
|
5241
5525
|
"isSignal": true;
|
|
5242
5526
|
};
|
|
5527
|
+
"inputName": {
|
|
5528
|
+
"alias": "inputName";
|
|
5529
|
+
"required": false;
|
|
5530
|
+
"isSignal": true;
|
|
5531
|
+
};
|
|
5243
5532
|
"placeholder": {
|
|
5244
5533
|
"alias": "placeholder";
|
|
5245
5534
|
"required": false;
|
|
@@ -5250,6 +5539,11 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
5250
5539
|
"required": false;
|
|
5251
5540
|
"isSignal": true;
|
|
5252
5541
|
};
|
|
5542
|
+
"leadingIcon": {
|
|
5543
|
+
"alias": "leadingIcon";
|
|
5544
|
+
"required": false;
|
|
5545
|
+
"isSignal": true;
|
|
5546
|
+
};
|
|
5253
5547
|
"revealable": {
|
|
5254
5548
|
"alias": "revealable";
|
|
5255
5549
|
"required": false;
|
|
@@ -5507,6 +5801,13 @@ export declare class TextareaInputComponent implements ControlValueAccessor, Val
|
|
|
5507
5801
|
validate(control: AbstractControl): ValidationErrors | null;
|
|
5508
5802
|
registerOnValidatorChange(fn: () => void): void;
|
|
5509
5803
|
protected readonly _inputId: string;
|
|
5804
|
+
private readonly _hostEl;
|
|
5805
|
+
/**
|
|
5806
|
+
* Library source 2026-11-04, not yet published. Puts the keyboard focus on the inner native `<textarea>` (`ref.focus()` via `viewChild`).
|
|
5807
|
+
* Same options as the DOM method (`{ preventScroll: true }`). Safe at any time: before the view exists, or on a disabled field, it does
|
|
5808
|
+
* nothing and never throws.
|
|
5809
|
+
*/
|
|
5810
|
+
focus(options?: FocusOptions): void;
|
|
5510
5811
|
private _onChange;
|
|
5511
5812
|
private _onTouched;
|
|
5512
5813
|
writeValue(val: string | null): void;
|
|
@@ -6979,7 +7280,7 @@ export declare class FormSectionComponent {
|
|
|
6979
7280
|
}, {}, never, ["*"], true, never>;
|
|
6980
7281
|
}
|
|
6981
7282
|
export declare class FormRowComponent {
|
|
6982
|
-
readonly cols: import("@angular/core").InputSignal<
|
|
7283
|
+
readonly cols: import("@angular/core").InputSignal<2 | 1 | 3 | 4>;
|
|
6983
7284
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormRowComponent, never>;
|
|
6984
7285
|
static ɵcmp: i0.ɵɵComponentDeclaration<FormRowComponent, "ui-form-row", never, {
|
|
6985
7286
|
"cols": {
|
|
@@ -6996,7 +7297,7 @@ export declare class FormRowComponent {
|
|
|
6996
7297
|
* child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
|
|
6997
7298
|
*/
|
|
6998
7299
|
export declare class FormColSpanDirective {
|
|
6999
|
-
readonly uiColSpan: import("@angular/core").InputSignal<"" |
|
|
7300
|
+
readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | 3 | "2" | "3" | "all">;
|
|
7000
7301
|
protected readonly _class: import("@angular/core").Signal<string>;
|
|
7001
7302
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
|
|
7002
7303
|
static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
|
|
@@ -7035,6 +7336,16 @@ export declare class FormColSpanDirective {
|
|
|
7035
7336
|
* badge="Archived" badgeVariant="gray" [alwaysShowBadge]="true">
|
|
7036
7337
|
* <ui-button list-item-action variant="icon" ariaLabel="Remove" (click)="remove(d)">…</ui-button>
|
|
7037
7338
|
* </ui-list-item>
|
|
7339
|
+
*
|
|
7340
|
+
* Library source 2026-11-04, not yet published: `[disabled]` (aria-disabled, not focusable, never emits `select`, non-colour cue), `[busy]`
|
|
7341
|
+
* (aria-busy, spinner, presses ignored) and a leading image slot, `<img list-item-image>` / `<ui-image list-item-image>`, rendered in front of
|
|
7342
|
+
* the text and instead of the icon tile (clicks on it select a plain row; on a radio / checkbox row they do not, because the image sits outside
|
|
7343
|
+
* the label). An interactive image (`<ui-image list-item-image [interactive]="true" (activate)=...>`) inside a plain pressable row: a click emits the
|
|
7344
|
+
* image's `activate` AND selects the row (the click bubbles); Enter / Space on the image emit `activate` only (the row's key handler ignores keys
|
|
7345
|
+
* whose target is not the row itself). Row-end actions stay in `list-item-action`.
|
|
7346
|
+
* <ui-list-item [title]="p.name" [details]="[p.price]" [disabled]="p.soldOut" [busy]="adding() === p.id" (select)="add(p)">
|
|
7347
|
+
* <ui-image list-item-image [src]="p.photo" [alt]="p.name" width="48px" height="48px" fit="cover" radius="md" />
|
|
7348
|
+
* </ui-list-item>
|
|
7038
7349
|
*/
|
|
7039
7350
|
/** One secondary line under the title: plain text, or text with a small icon and a tone (`danger` red, `warning` amber). */
|
|
7040
7351
|
export type ListItemDetail = string | {
|
|
@@ -7044,9 +7355,10 @@ export type ListItemDetail = string | {
|
|
|
7044
7355
|
};
|
|
7045
7356
|
/** Colour of the optional leading icon tile. */
|
|
7046
7357
|
export type ListItemIconColor = 'slate' | 'amber' | 'red' | 'blue' | 'green' | 'purple' | 'teal' | 'orange';
|
|
7047
|
-
export declare class ListItemComponent {
|
|
7358
|
+
export declare class ListItemComponent implements AfterContentChecked {
|
|
7359
|
+
private readonly host;
|
|
7048
7360
|
/** Show a radio button, checkbox, or nothing on the left. */
|
|
7049
|
-
readonly leading: import("@angular/core").InputSignal<"none" | "
|
|
7361
|
+
readonly leading: import("@angular/core").InputSignal<"none" | "radio" | "checkbox">;
|
|
7050
7362
|
/** `name` attribute for the radio/checkbox (groups radios together). */
|
|
7051
7363
|
readonly inputName: import("@angular/core").InputSignal<string>;
|
|
7052
7364
|
/** `id` attribute for the radio/checkbox (links the label). */
|
|
@@ -7071,7 +7383,24 @@ export declare class ListItemComponent {
|
|
|
7071
7383
|
* Rows with `[interactive]="false"` always wrap (new in 2026-10-19, nothing to preserve).
|
|
7072
7384
|
*/
|
|
7073
7385
|
readonly wrapText: import("@angular/core").InputSignal<boolean>;
|
|
7386
|
+
/**
|
|
7387
|
+
* Library source 2026-11-04, not yet published. `true` = the row cannot be used right now: the native radio / checkbox is `disabled` (that carries
|
|
7388
|
+
* the state for assistive tech), a plain pressable row (`role="button"`) gets `aria-disabled="true"` and loses its `tabindex` (not a tab stop). A row
|
|
7389
|
+
* without a role (radio / checkbox row wrapper, non-interactive row) gets NO `aria-disabled` (it is not valid on a role-less div); it only
|
|
7390
|
+
* gets the classes. Clicks, Enter and Space never emit `select`, and the row looks disabled without relying on colour alone (dimmed, muted
|
|
7391
|
+
* surface, `not-allowed` cursor, a dashed outline on a bordered card). Projected row-end actions (`list-item-action`) are NOT disabled by this
|
|
7392
|
+
* input; disable them yourself. Default `false` = unchanged.
|
|
7393
|
+
*/
|
|
7394
|
+
readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
7395
|
+
/**
|
|
7396
|
+
* Library source 2026-11-04, not yet published. `true` = the row is working on a request: `aria-busy="true"`, a small spinner (decorative)
|
|
7397
|
+
* at the row end, and presses (click, Enter, Space, radio / checkbox change) are ignored: `select` never emits and a radio / checkbox keeps
|
|
7398
|
+
* its state (the click is cancelled, so a sibling radio of the same `name` stays checked too; arrow keys on a busy radio are blocked).
|
|
7399
|
+
* The row stays focusable. Default `false` = unchanged.
|
|
7400
|
+
*/
|
|
7401
|
+
readonly busy: import("@angular/core").InputSignal<boolean>;
|
|
7074
7402
|
get _borderedClass(): boolean;
|
|
7403
|
+
get _disabledClass(): boolean;
|
|
7075
7404
|
/** Primary label. */
|
|
7076
7405
|
readonly title: import("@angular/core").InputSignal<string>;
|
|
7077
7406
|
/** Badge shown next to the title — only visible when the item is checked, unless `alwaysShowBadge` is set. */
|
|
@@ -7092,6 +7421,21 @@ export declare class ListItemComponent {
|
|
|
7092
7421
|
readonly select: import("@angular/core").OutputEmitterRef<void>;
|
|
7093
7422
|
/** A plain interactive row (no radio/checkbox) is itself clickable: click, Enter or Space emit `select`. */
|
|
7094
7423
|
protected readonly pressable: () => boolean;
|
|
7424
|
+
/**
|
|
7425
|
+
* True while the leading image slot (`<img list-item-image>` / any element with the `list-item-image` attribute) holds content.
|
|
7426
|
+
* The slot is projected, so this is read from the DOM after every content check; the icon tile is not rendered while it is true.
|
|
7427
|
+
*/
|
|
7428
|
+
protected readonly hasImage: import("@angular/core").WritableSignal<boolean>;
|
|
7429
|
+
ngAfterContentChecked(): void;
|
|
7430
|
+
/**
|
|
7431
|
+
* Radio / checkbox click while busy or disabled: cancelled, so the browser restores the checkedness of the clicked input AND of the other radios of
|
|
7432
|
+
* the same `name` group (clicking or arrowing onto this radio would otherwise uncheck the sibling that the model still holds as checked).
|
|
7433
|
+
*/
|
|
7434
|
+
protected onInputClick(e: Event): void;
|
|
7435
|
+
/** Arrow keys on a busy / disabled radio would move the selection to a sibling of the group: blocked. (Arriving at it from a sibling is stopped by `onInputClick`.) */
|
|
7436
|
+
protected onInputKey(e: KeyboardEvent): void;
|
|
7437
|
+
/** Radio / checkbox change: never while disabled (the input is disabled anyway); ignored while busy. Safety net after `onInputClick`: the input is put back to `checked`. */
|
|
7438
|
+
protected onInputChange(e: Event): void;
|
|
7095
7439
|
protected onRowClick(e: Event): void;
|
|
7096
7440
|
protected onRowKey(e: Event): void;
|
|
7097
7441
|
protected readonly visibleDetails: () => {
|
|
@@ -7146,6 +7490,16 @@ export declare class ListItemComponent {
|
|
|
7146
7490
|
"required": false;
|
|
7147
7491
|
"isSignal": true;
|
|
7148
7492
|
};
|
|
7493
|
+
"disabled": {
|
|
7494
|
+
"alias": "disabled";
|
|
7495
|
+
"required": false;
|
|
7496
|
+
"isSignal": true;
|
|
7497
|
+
};
|
|
7498
|
+
"busy": {
|
|
7499
|
+
"alias": "busy";
|
|
7500
|
+
"required": false;
|
|
7501
|
+
"isSignal": true;
|
|
7502
|
+
};
|
|
7149
7503
|
"title": {
|
|
7150
7504
|
"alias": "title";
|
|
7151
7505
|
"required": false;
|
|
@@ -7178,7 +7532,7 @@ export declare class ListItemComponent {
|
|
|
7178
7532
|
};
|
|
7179
7533
|
}, {
|
|
7180
7534
|
"select": "select";
|
|
7181
|
-
}, never, ["[list-item-action], [li-action]"], true, never>;
|
|
7535
|
+
}, never, ["[list-item-image]", "[list-item-action], [li-action]"], true, never>;
|
|
7182
7536
|
}
|
|
7183
7537
|
/** Colour of the priority dot (`high` red, `medium` amber, `low` grey, `blue`, `green`); `none` = no dot. */
|
|
7184
7538
|
export type CardListIndicator = 'high' | 'medium' | 'low' | 'blue' | 'green' | 'none';
|
|
@@ -7573,6 +7927,12 @@ export declare class ListComponent<T = unknown> {
|
|
|
7573
7927
|
readonly items: import("@angular/core").InputSignal<readonly T[]>;
|
|
7574
7928
|
/** `false` (default) renders a `<ul>`; `true` renders an `<ol>` with native numbering (no numbers in the grid layout). */
|
|
7575
7929
|
readonly ordered: import("@angular/core").InputSignal<boolean>;
|
|
7930
|
+
/**
|
|
7931
|
+
* Library source 2026-11-04, not yet published. `true` = the `<ul>` shows a visible bullet (disc) before every row, for plain text lines such as a
|
|
7932
|
+
* "what will happen" list: `<ui-list [items]="lines" [bulleted]="true" ariaLabel="What will happen" />` (string items render as their text, no template needed).
|
|
7933
|
+
* Still a real `<ul>` with `<li>` rows. Ignored with `[ordered]="true"` (which already has numbers) and in the grid layout. Default `false` = no markers, as before.
|
|
7934
|
+
*/
|
|
7935
|
+
readonly bulleted: import("@angular/core").InputSignal<boolean>;
|
|
7576
7936
|
/** 'list' = one column; 'grid' = wrapping columns of at least `gridMin` px (still a real `<ul>`). */
|
|
7577
7937
|
readonly layout: import("@angular/core").InputSignal<"list" | "grid">;
|
|
7578
7938
|
/** Minimum column width in px of the grid layout. */
|
|
@@ -7679,6 +8039,11 @@ export declare class ListComponent<T = unknown> {
|
|
|
7679
8039
|
"required": false;
|
|
7680
8040
|
"isSignal": true;
|
|
7681
8041
|
};
|
|
8042
|
+
"bulleted": {
|
|
8043
|
+
"alias": "bulleted";
|
|
8044
|
+
"required": false;
|
|
8045
|
+
"isSignal": true;
|
|
8046
|
+
};
|
|
7682
8047
|
"layout": {
|
|
7683
8048
|
"alias": "layout";
|
|
7684
8049
|
"required": false;
|
|
@@ -8130,9 +8495,9 @@ export declare class ChipGroupComponent {
|
|
|
8130
8495
|
readonly spaceAbove: import("@angular/core").InputSignal<"none" | "sm" | "md">;
|
|
8131
8496
|
/** Space below the chip group. */
|
|
8132
8497
|
readonly spaceBelow: import("@angular/core").InputSignal<"none" | "sm" | "md">;
|
|
8133
|
-
protected readonly _gap: import("@angular/core").Signal<"
|
|
8134
|
-
protected readonly _spaceAbove: import("@angular/core").Signal<"0" | "
|
|
8135
|
-
protected readonly _spaceBelow: import("@angular/core").Signal<"0" | "
|
|
8498
|
+
protected readonly _gap: import("@angular/core").Signal<"8px" | "12px" | "6px">;
|
|
8499
|
+
protected readonly _spaceAbove: import("@angular/core").Signal<"0" | "12px" | "6px">;
|
|
8500
|
+
protected readonly _spaceBelow: import("@angular/core").Signal<"0" | "12px" | "6px">;
|
|
8136
8501
|
static ɵfac: i0.ɵɵFactoryDeclaration<ChipGroupComponent, never>;
|
|
8137
8502
|
static ɵcmp: i0.ɵɵComponentDeclaration<ChipGroupComponent, "ui-chip-group", never, {
|
|
8138
8503
|
"gap": {
|
|
@@ -8508,10 +8873,15 @@ export declare class AlertComponent {
|
|
|
8508
8873
|
"dismissed": "dismissed";
|
|
8509
8874
|
}, never, ["*"], true, never>;
|
|
8510
8875
|
}
|
|
8876
|
+
/**
|
|
8877
|
+
* Every key `<ui-icon>` draws by itself (the data-table action keys such as `view` / `edit` / `call` are accepted too, see `builtInActionIcon`).
|
|
8878
|
+
* Each resolves with `iconPath(key)`. Includes `search`, `cup` (food / drink) and `wrench` (rental / tools), library source 2026-11-04, not yet published.
|
|
8879
|
+
*/
|
|
8880
|
+
export declare const ICON_NAMES: readonly string[];
|
|
8511
8881
|
/** The SVG path (24×24 stroke icon) for an icon key, or undefined when the key is unknown. */
|
|
8512
8882
|
export declare function iconPath(name: string): string | undefined;
|
|
8513
8883
|
/** Keys with an icon of their own (the data-table action keys are accepted too — see `builtInActionIcon`). */
|
|
8514
|
-
export type IconName = 'add' | 'close' | 'check' | 'upload' | 'image' | 'chevron-up' | 'chevron-down' | 'arrow-left' | 'bell' | 'print' | 'lock' | 'shield' | 'arrow-up' | 'arrow-down' | 'arrow-right' | 'document' | 'grip' | 'card' | 'bank' | 'view' | 'view-off' | 'edit' | 'delete' | 'download' | 'duplicate' | 'archive' | 'restore' | 'share' | 'email' | 'message' | 'call' | 'refund' | 'chevron-right' | 'link' | 'save' | 'chart' | 'clipboard' | 'unlink' | 'send' | 'refresh';
|
|
8884
|
+
export type IconName = 'add' | 'close' | 'check' | 'upload' | 'image' | 'chevron-up' | 'chevron-down' | 'arrow-left' | 'bell' | 'print' | 'lock' | 'shield' | 'arrow-up' | 'arrow-down' | 'arrow-right' | 'document' | 'grip' | 'card' | 'bank' | 'view' | 'view-off' | 'edit' | 'delete' | 'download' | 'duplicate' | 'archive' | 'restore' | 'share' | 'email' | 'message' | 'call' | 'refund' | 'chevron-right' | 'link' | 'save' | 'chart' | 'clipboard' | 'unlink' | 'send' | 'refresh' | 'search' | 'cup' | 'wrench';
|
|
8515
8885
|
/**
|
|
8516
8886
|
* A clickable icon. The host passes a key (`name="delete"`) and the library draws that icon; clicking it emits
|
|
8517
8887
|
* `iconClick`, and the host does the actual work (delete the row, open a panel, …).
|
|
@@ -8731,6 +9101,341 @@ export declare class HintComponent {
|
|
|
8731
9101
|
static ɵfac: i0.ɵɵFactoryDeclaration<HintComponent, never>;
|
|
8732
9102
|
static ɵcmp: i0.ɵɵComponentDeclaration<HintComponent, "ui-hint", never, {}, {}, never, ["*"], true, never>;
|
|
8733
9103
|
}
|
|
9104
|
+
/**
|
|
9105
|
+
* The value of `ui-address-input`: five plain strings (never null). `apt` is the second line (apartment / suite / unit).
|
|
9106
|
+
*
|
|
9107
|
+
* Note: the library already exports `formatAddress(parts, options)` / `AddressParts` (utils/format) for display of an address with
|
|
9108
|
+
* city / state / zip parts. The helpers below work on this value model and are therefore named `...AddressValue`.
|
|
9109
|
+
*/
|
|
9110
|
+
export interface AddressValue {
|
|
9111
|
+
street: string;
|
|
9112
|
+
apt: string;
|
|
9113
|
+
city: string;
|
|
9114
|
+
state: string;
|
|
9115
|
+
zip: string;
|
|
9116
|
+
}
|
|
9117
|
+
/** The 50 US states + DC as select options: value = 2-letter code, label = the code (compact, fits the narrow State column), description = the state name (read by screen readers, shown under the select). */
|
|
9118
|
+
export declare const US_STATE_OPTIONS: readonly SelectOption[];
|
|
9119
|
+
/** A fresh blank address. */
|
|
9120
|
+
export declare function emptyAddress(): AddressValue;
|
|
9121
|
+
/** Coerces anything (null, a partial object, non-string members) to a complete `AddressValue` of strings. */
|
|
9122
|
+
export declare function normalizeAddress(v: Partial<Record<keyof AddressValue, unknown>> | null | undefined): AddressValue;
|
|
9123
|
+
/** True when every part is empty or whitespace (null / undefined count as empty). */
|
|
9124
|
+
export declare function isEmptyAddress(a: Partial<Record<keyof AddressValue, unknown>> | null | undefined): boolean;
|
|
9125
|
+
/** The default ZIP rule of the component: US 5 digits or 5+4. */
|
|
9126
|
+
export declare const US_ZIP_PATTERN: RegExp;
|
|
9127
|
+
/**
|
|
9128
|
+
* Multi-line text, the storage form used by apps: street, apt, then "City, ST 12345", joined with "\n". Every part is trimmed and empty
|
|
9129
|
+
* parts are left out, so `parseAddressValue(formatAddressValue(x))` is stable.
|
|
9130
|
+
* `{street:'1 Main', apt:'Apt 4', city:'Austin', state:'TX', zip:'78701'}` -> `"1 Main\nApt 4\nAustin, TX 78701"`.
|
|
9131
|
+
*/
|
|
9132
|
+
export declare function formatAddressValue(a: AddressValue | null | undefined): string;
|
|
9133
|
+
/**
|
|
9134
|
+
* The same address on ONE line for tables, labels and maps: "1 Main, Apt 4, Austin, TX 78701". `{ comma: false }` drops the comma between
|
|
9135
|
+
* city and state ("1 Main, Apt 4, Austin TX 78701", the older mfh resident style). Empty parts are left out.
|
|
9136
|
+
*/
|
|
9137
|
+
export declare function formatAddressValueOneLine(a: AddressValue | null | undefined, options?: {
|
|
9138
|
+
comma?: boolean;
|
|
9139
|
+
}): string;
|
|
9140
|
+
/**
|
|
9141
|
+
* Reads the multi-line text form back into an address (the inverse of `formatAddressValue`; never throws).
|
|
9142
|
+
* - null / undefined / blank -> empty address.
|
|
9143
|
+
* - 1 line: the street only (`parseAddressOneLine` reads the one-line form).
|
|
9144
|
+
* - 2 lines: street + city line. 3 lines: street + apt + city line.
|
|
9145
|
+
* - 4+ lines: first = street, last = city line, everything in between = apt (joined with ", ").
|
|
9146
|
+
* - The city line may be "City, ST 12345", "City ST 12345", "City, ST 12345-6789", "city, st 12345" (any case with a comma), "City, ST",
|
|
9147
|
+
* "TX 78701" (city blank), with a trailing comma / period / semicolon tolerated. The state is two letters (capitals unless a comma
|
|
9148
|
+
* separates it), the ZIP 5 digits or 5+4. Anything else (a city only, a full state name, a 4-digit or foreign postcode, a unit line
|
|
9149
|
+
* without a city line) lands WHOLE in `city` - nothing is dropped.
|
|
9150
|
+
* - Lines are trimmed, blank lines dropped, \r\n accepted.
|
|
9151
|
+
*/
|
|
9152
|
+
export declare function parseAddressValue(raw: string | null | undefined): AddressValue;
|
|
9153
|
+
/**
|
|
9154
|
+
* Reads the ONE-LINE form that `formatAddressValueOneLine` writes ("street[, apt], city, ST 12345", or "..., city ST 12345" without the
|
|
9155
|
+
* comma). Segments are split at commas: the last one carries "ST 12345" (and the city when there is no comma before the state), the city
|
|
9156
|
+
* is the segment before it, the first remaining segment is the street and the rest the apt. A street that itself contains a comma
|
|
9157
|
+
* ("Bldg 2, 100 Main St") therefore splits into street + apt. Text that does not end in "ST 12345" becomes the street whole.
|
|
9158
|
+
*/
|
|
9159
|
+
export declare function parseAddressOneLine(raw: string | null | undefined): AddressValue;
|
|
9160
|
+
/** 5 digits or 5+4 ("12345", "12345-6789"); surrounding spaces are NOT accepted (trim first). */
|
|
9161
|
+
export declare function isValidZip(zip: string): boolean;
|
|
9162
|
+
type AddressField = keyof AddressValue;
|
|
9163
|
+
/**
|
|
9164
|
+
* Address entry (ControlValueAccessor): street, unit, city, state (select) and ZIP, built only from library inputs.
|
|
9165
|
+
*
|
|
9166
|
+
* Value: `AddressValue` ({ street, apt, city, state, zip }, all strings). Works with `[(ngModel)]`, `[formControl]`, or a signal via
|
|
9167
|
+
* `[value]` / `(valueChange)`. A written `null` / `undefined` clears the form; a written string is read with `parseAddressValue`.
|
|
9168
|
+
* Writing a value never emits; only user edits emit (the whole new `AddressValue`).
|
|
9169
|
+
*
|
|
9170
|
+
* Built-in validation (also reported on the form control as a `Validator`; `invalid` / `errorMessage` signals, `invalidChange` output,
|
|
9171
|
+
* provides `UiFieldValidity`): `required` -> street, city, state and ZIP are required ("<Field label> is required."); ZIP must be
|
|
9172
|
+
* 5 digits or 5+4 ("Enter a valid ZIP code."); state must be one of the options ("Select a valid option."); maxlengths
|
|
9173
|
+
* ("Too long (max N characters)."); `requireComplete` -> once ANY of street / city / state / ZIP is filled the others are required too
|
|
9174
|
+
* (for an optional address that must not be half-filled). The unit is never required. Messages show per field after that field was left,
|
|
9175
|
+
* or all at once while `showErrors` is true; the host `error` is shown under the group and always counts as invalid.
|
|
9176
|
+
*
|
|
9177
|
+
* Layout: street + unit, then city + state + ZIP in `ui-form-row`s (they collapse to one column on phones).
|
|
9178
|
+
*/
|
|
9179
|
+
export declare class AddressInputComponent implements ControlValueAccessor, Validator, UiFieldValidity {
|
|
9180
|
+
/** Group label (the visible legend and the group's accessible name). Empty -> no legend, the group is named "Address". */
|
|
9181
|
+
readonly label: import("@angular/core").InputSignal<string>;
|
|
9182
|
+
/** Street, city, state and ZIP are required (never the unit). Shows `*` on the legend and on those fields. */
|
|
9183
|
+
readonly required: import("@angular/core").InputSignal<boolean>;
|
|
9184
|
+
/** Optional address that must not be half-filled: when any of street / city / state / ZIP has text, the other three are required. */
|
|
9185
|
+
readonly requireComplete: import("@angular/core").InputSignal<boolean>;
|
|
9186
|
+
readonly streetLabel: import("@angular/core").InputSignal<string>;
|
|
9187
|
+
readonly unitLabel: import("@angular/core").InputSignal<string>;
|
|
9188
|
+
readonly cityLabel: import("@angular/core").InputSignal<string>;
|
|
9189
|
+
readonly stateLabel: import("@angular/core").InputSignal<string>;
|
|
9190
|
+
readonly zipLabel: import("@angular/core").InputSignal<string>;
|
|
9191
|
+
readonly streetPlaceholder: import("@angular/core").InputSignal<string>;
|
|
9192
|
+
readonly unitPlaceholder: import("@angular/core").InputSignal<string>;
|
|
9193
|
+
readonly cityPlaceholder: import("@angular/core").InputSignal<string>;
|
|
9194
|
+
readonly zipPlaceholder: import("@angular/core").InputSignal<string>;
|
|
9195
|
+
/** Text of the empty State option (the one that clears the state). */
|
|
9196
|
+
readonly statePlaceholder: import("@angular/core").InputSignal<string>;
|
|
9197
|
+
/** Show the Apt / Suite field. Hidden -> the value's `apt` is kept as written and never edited. */
|
|
9198
|
+
readonly showUnit: import("@angular/core").InputSignal<boolean>;
|
|
9199
|
+
/** State choices (value = what is stored). Default: the 50 US states + DC by code. An empty "no state" option is added in front when missing. */
|
|
9200
|
+
readonly states: import("@angular/core").InputSignal<readonly SelectOption<string>[]>;
|
|
9201
|
+
readonly streetMaxlength: import("@angular/core").InputSignal<number>;
|
|
9202
|
+
readonly unitMaxlength: import("@angular/core").InputSignal<number>;
|
|
9203
|
+
readonly cityMaxlength: import("@angular/core").InputSignal<number>;
|
|
9204
|
+
readonly zipMaxlength: import("@angular/core").InputSignal<number>;
|
|
9205
|
+
/** Native select cannot be read-only: while `readonly`, the State select is disabled and the text fields are read-only. */
|
|
9206
|
+
readonly readonly: import("@angular/core").InputSignal<boolean>;
|
|
9207
|
+
/** Reveal every built-in message now (e.g. after a failed Save click). Switching back to false forgets which fields were left. */
|
|
9208
|
+
readonly showErrors: import("@angular/core").InputSignal<boolean>;
|
|
9209
|
+
readonly hint: import("@angular/core").InputSignal<string>;
|
|
9210
|
+
/** Host error for the whole address; shown under the group (replaces the hint), always makes the field invalid. */
|
|
9211
|
+
readonly error: import("@angular/core").InputSignal<string>;
|
|
9212
|
+
/** Prefix of the per-field test ids and native names: `<prefix>street`, `<prefix>apt`, `<prefix>city`, `<prefix>state`, `<prefix>zip` (and `<prefix>group`). */
|
|
9213
|
+
readonly idPrefix: import("@angular/core").InputSignal<string>;
|
|
9214
|
+
/** Alias of `idPrefix` (the name the old app-level address input used). When set (even to ''), it wins over `idPrefix`. */
|
|
9215
|
+
readonly prefix: import("@angular/core").InputSignal<string | undefined>;
|
|
9216
|
+
/**
|
|
9217
|
+
* What the form control (ngModel / FormControl) receives. 'auto' (default): the type last written to it - a string model gets the multi-line
|
|
9218
|
+
* string (`formatAddressValue`), an object / null / never-written model gets the `AddressValue`; 'text': always the string; 'object': always
|
|
9219
|
+
* the object. `valueChange` always emits the object. A written string is read with `parseAddressValue` for display only: the control keeps
|
|
9220
|
+
* the original text until the user edits a field (so a text the parser cannot split is not rewritten on load).
|
|
9221
|
+
*/
|
|
9222
|
+
readonly valueFormat: import("@angular/core").InputSignal<"object" | "text" | "auto">;
|
|
9223
|
+
/** ZIP rule; the default is the US 5 digits / 5+4 rule. `null` accepts any non-empty ZIP. The ZIP is validated and stored trimmed. */
|
|
9224
|
+
readonly zipPattern: import("@angular/core").InputSignal<RegExp | null>;
|
|
9225
|
+
/** Message shown when the ZIP breaks `zipPattern`. */
|
|
9226
|
+
readonly zipError: import("@angular/core").InputSignal<string>;
|
|
9227
|
+
/** Signal-style value (use with `(valueChange)` or `[(value)]`); not needed with ngModel / FormControl. null / undefined = blank. */
|
|
9228
|
+
readonly value: import("@angular/core").InputSignal<string | AddressValue | null | undefined>;
|
|
9229
|
+
/** The `[disabled]` input (also set by the form control through `setDisabledState`). Public so `[disabled]="x"` type-checks in hosts. */
|
|
9230
|
+
readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
|
|
9231
|
+
/** Emits the whole new address when the USER edits a field. Not emitted for written values. */
|
|
9232
|
+
readonly valueChange: import("@angular/core").OutputEmitterRef<AddressValue>;
|
|
9233
|
+
/** Emits whenever the address becomes invalid / valid. */
|
|
9234
|
+
readonly invalidChange: import("@angular/core").OutputEmitterRef<boolean>;
|
|
9235
|
+
private readonly host;
|
|
9236
|
+
private readonly _cvaDisabled;
|
|
9237
|
+
protected readonly disabled: import("@angular/core").Signal<boolean>;
|
|
9238
|
+
protected readonly _v: import("@angular/core").WritableSignal<AddressValue>;
|
|
9239
|
+
private readonly _touched;
|
|
9240
|
+
protected readonly _standalone: {
|
|
9241
|
+
standalone: boolean;
|
|
9242
|
+
};
|
|
9243
|
+
protected readonly _p: import("@angular/core").Signal<string>;
|
|
9244
|
+
private readonly _uid;
|
|
9245
|
+
protected readonly _legendId: string;
|
|
9246
|
+
protected readonly _errorId: string;
|
|
9247
|
+
protected readonly _hintId: string;
|
|
9248
|
+
protected readonly _stateOptions: import("@angular/core").Signal<SelectOption<string>[]>;
|
|
9249
|
+
private readonly _issues;
|
|
9250
|
+
/** True while the address breaks a built-in rule or the host passed an `[error]`. */
|
|
9251
|
+
readonly invalid: import("@angular/core").Signal<boolean>;
|
|
9252
|
+
/** Message of the first broken built-in rule in field order ('' when valid), shown or not. */
|
|
9253
|
+
readonly errorMessage: import("@angular/core").Signal<string>;
|
|
9254
|
+
/** Street, city, state and ZIP are required: always with `required`, and with `requireComplete` once any of them has text. */
|
|
9255
|
+
protected readonly _req: import("@angular/core").Signal<boolean>;
|
|
9256
|
+
protected readonly _describedBy: import("@angular/core").Signal<string | null>;
|
|
9257
|
+
private _onChange;
|
|
9258
|
+
/** True once a string was written to the control (valueFormat 'auto' then emits strings). */
|
|
9259
|
+
private _textModel;
|
|
9260
|
+
/** Fields whose text the USER changed since the last write; only those are trimmed when left. */
|
|
9261
|
+
private readonly _edited;
|
|
9262
|
+
private _onTouched;
|
|
9263
|
+
private _onValidatorChange;
|
|
9264
|
+
constructor();
|
|
9265
|
+
/** Re-run the form control's validation when a rule input (required, maxlength, states, ...) changes. */
|
|
9266
|
+
ngOnChanges(): void;
|
|
9267
|
+
writeValue(val: AddressValue | string | null | undefined): void;
|
|
9268
|
+
registerOnChange(fn: (v: AddressValue | string) => void): void;
|
|
9269
|
+
registerOnTouched(fn: () => void): void;
|
|
9270
|
+
setDisabledState(d: boolean): void;
|
|
9271
|
+
registerOnValidatorChange(fn: () => void): void;
|
|
9272
|
+
validate(control: AbstractControl): ValidationErrors | null;
|
|
9273
|
+
protected _set(field: AddressField, text: unknown): void;
|
|
9274
|
+
protected _onFocusOut(field: AddressField, event: FocusEvent): void;
|
|
9275
|
+
/** True while the field's own message may show: `showErrors`, or the field was left. Bound to the child's `showErrors` so a reset clears the child too. */
|
|
9276
|
+
protected _revealed(field: AddressField): boolean;
|
|
9277
|
+
protected _fieldError(field: AddressField): string;
|
|
9278
|
+
private _hasText;
|
|
9279
|
+
private _firstIssue;
|
|
9280
|
+
private _check;
|
|
9281
|
+
private _zipOk;
|
|
9282
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<AddressInputComponent, never>;
|
|
9283
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<AddressInputComponent, "ui-address-input", never, {
|
|
9284
|
+
"label": {
|
|
9285
|
+
"alias": "label";
|
|
9286
|
+
"required": false;
|
|
9287
|
+
"isSignal": true;
|
|
9288
|
+
};
|
|
9289
|
+
"required": {
|
|
9290
|
+
"alias": "required";
|
|
9291
|
+
"required": false;
|
|
9292
|
+
"isSignal": true;
|
|
9293
|
+
};
|
|
9294
|
+
"requireComplete": {
|
|
9295
|
+
"alias": "requireComplete";
|
|
9296
|
+
"required": false;
|
|
9297
|
+
"isSignal": true;
|
|
9298
|
+
};
|
|
9299
|
+
"streetLabel": {
|
|
9300
|
+
"alias": "streetLabel";
|
|
9301
|
+
"required": false;
|
|
9302
|
+
"isSignal": true;
|
|
9303
|
+
};
|
|
9304
|
+
"unitLabel": {
|
|
9305
|
+
"alias": "unitLabel";
|
|
9306
|
+
"required": false;
|
|
9307
|
+
"isSignal": true;
|
|
9308
|
+
};
|
|
9309
|
+
"cityLabel": {
|
|
9310
|
+
"alias": "cityLabel";
|
|
9311
|
+
"required": false;
|
|
9312
|
+
"isSignal": true;
|
|
9313
|
+
};
|
|
9314
|
+
"stateLabel": {
|
|
9315
|
+
"alias": "stateLabel";
|
|
9316
|
+
"required": false;
|
|
9317
|
+
"isSignal": true;
|
|
9318
|
+
};
|
|
9319
|
+
"zipLabel": {
|
|
9320
|
+
"alias": "zipLabel";
|
|
9321
|
+
"required": false;
|
|
9322
|
+
"isSignal": true;
|
|
9323
|
+
};
|
|
9324
|
+
"streetPlaceholder": {
|
|
9325
|
+
"alias": "streetPlaceholder";
|
|
9326
|
+
"required": false;
|
|
9327
|
+
"isSignal": true;
|
|
9328
|
+
};
|
|
9329
|
+
"unitPlaceholder": {
|
|
9330
|
+
"alias": "unitPlaceholder";
|
|
9331
|
+
"required": false;
|
|
9332
|
+
"isSignal": true;
|
|
9333
|
+
};
|
|
9334
|
+
"cityPlaceholder": {
|
|
9335
|
+
"alias": "cityPlaceholder";
|
|
9336
|
+
"required": false;
|
|
9337
|
+
"isSignal": true;
|
|
9338
|
+
};
|
|
9339
|
+
"zipPlaceholder": {
|
|
9340
|
+
"alias": "zipPlaceholder";
|
|
9341
|
+
"required": false;
|
|
9342
|
+
"isSignal": true;
|
|
9343
|
+
};
|
|
9344
|
+
"statePlaceholder": {
|
|
9345
|
+
"alias": "statePlaceholder";
|
|
9346
|
+
"required": false;
|
|
9347
|
+
"isSignal": true;
|
|
9348
|
+
};
|
|
9349
|
+
"showUnit": {
|
|
9350
|
+
"alias": "showUnit";
|
|
9351
|
+
"required": false;
|
|
9352
|
+
"isSignal": true;
|
|
9353
|
+
};
|
|
9354
|
+
"states": {
|
|
9355
|
+
"alias": "states";
|
|
9356
|
+
"required": false;
|
|
9357
|
+
"isSignal": true;
|
|
9358
|
+
};
|
|
9359
|
+
"streetMaxlength": {
|
|
9360
|
+
"alias": "streetMaxlength";
|
|
9361
|
+
"required": false;
|
|
9362
|
+
"isSignal": true;
|
|
9363
|
+
};
|
|
9364
|
+
"unitMaxlength": {
|
|
9365
|
+
"alias": "unitMaxlength";
|
|
9366
|
+
"required": false;
|
|
9367
|
+
"isSignal": true;
|
|
9368
|
+
};
|
|
9369
|
+
"cityMaxlength": {
|
|
9370
|
+
"alias": "cityMaxlength";
|
|
9371
|
+
"required": false;
|
|
9372
|
+
"isSignal": true;
|
|
9373
|
+
};
|
|
9374
|
+
"zipMaxlength": {
|
|
9375
|
+
"alias": "zipMaxlength";
|
|
9376
|
+
"required": false;
|
|
9377
|
+
"isSignal": true;
|
|
9378
|
+
};
|
|
9379
|
+
"readonly": {
|
|
9380
|
+
"alias": "readonly";
|
|
9381
|
+
"required": false;
|
|
9382
|
+
"isSignal": true;
|
|
9383
|
+
};
|
|
9384
|
+
"showErrors": {
|
|
9385
|
+
"alias": "showErrors";
|
|
9386
|
+
"required": false;
|
|
9387
|
+
"isSignal": true;
|
|
9388
|
+
};
|
|
9389
|
+
"hint": {
|
|
9390
|
+
"alias": "hint";
|
|
9391
|
+
"required": false;
|
|
9392
|
+
"isSignal": true;
|
|
9393
|
+
};
|
|
9394
|
+
"error": {
|
|
9395
|
+
"alias": "error";
|
|
9396
|
+
"required": false;
|
|
9397
|
+
"isSignal": true;
|
|
9398
|
+
};
|
|
9399
|
+
"idPrefix": {
|
|
9400
|
+
"alias": "idPrefix";
|
|
9401
|
+
"required": false;
|
|
9402
|
+
"isSignal": true;
|
|
9403
|
+
};
|
|
9404
|
+
"prefix": {
|
|
9405
|
+
"alias": "prefix";
|
|
9406
|
+
"required": false;
|
|
9407
|
+
"isSignal": true;
|
|
9408
|
+
};
|
|
9409
|
+
"valueFormat": {
|
|
9410
|
+
"alias": "valueFormat";
|
|
9411
|
+
"required": false;
|
|
9412
|
+
"isSignal": true;
|
|
9413
|
+
};
|
|
9414
|
+
"zipPattern": {
|
|
9415
|
+
"alias": "zipPattern";
|
|
9416
|
+
"required": false;
|
|
9417
|
+
"isSignal": true;
|
|
9418
|
+
};
|
|
9419
|
+
"zipError": {
|
|
9420
|
+
"alias": "zipError";
|
|
9421
|
+
"required": false;
|
|
9422
|
+
"isSignal": true;
|
|
9423
|
+
};
|
|
9424
|
+
"value": {
|
|
9425
|
+
"alias": "value";
|
|
9426
|
+
"required": false;
|
|
9427
|
+
"isSignal": true;
|
|
9428
|
+
};
|
|
9429
|
+
"_disabledInput": {
|
|
9430
|
+
"alias": "disabled";
|
|
9431
|
+
"required": false;
|
|
9432
|
+
"isSignal": true;
|
|
9433
|
+
};
|
|
9434
|
+
}, {
|
|
9435
|
+
"valueChange": "valueChange";
|
|
9436
|
+
"invalidChange": "invalidChange";
|
|
9437
|
+
}, never, never, true, never>;
|
|
9438
|
+
}
|
|
8734
9439
|
export type ImagePreviewShape = 'circle' | 'rounded';
|
|
8735
9440
|
export type ImagePreviewSize = 'sm' | 'md' | 'lg';
|
|
8736
9441
|
export type ImagePreviewPlaceholder = 'person' | 'image';
|
|
@@ -8838,6 +9543,14 @@ export type ImageAlign = 'start' | 'center' | 'end';
|
|
|
8838
9543
|
* - `placeholder` (default true): a neutral icon in the same box when there is no `src` or it fails to load. false renders nothing then.
|
|
8839
9544
|
* - `priority`: above-the-fold image - loads eagerly with high fetch priority. Otherwise `loading="lazy"` and async decoding.
|
|
8840
9545
|
* - Outputs `loaded` and `failed`. A new `src` (or a changed `retryKey`) gets a fresh chance to load.
|
|
9546
|
+
* - Library source 2026-11-04, not yet published: `[interactive]="true"` makes the image a button (e.g. a product photo that opens a preview):
|
|
9547
|
+
* the host gets `role="button"`, `tabindex="0"`, a focus ring, and click, Enter or Space emit `(activate)`. Its accessible name is the `alt`
|
|
9548
|
+
* text (also set as `aria-label`), so an interactive image NEEDS a non-empty `alt` (a decorative `alt=""` image would be an unnamed button). Not
|
|
9549
|
+
* interactive (default) = no role, no tabindex, no key handling, no output: exactly as before.
|
|
9550
|
+
* Inside a clickable parent (e.g. a pressable `ui-list-item` row via the `list-item-image` slot) the click bubbles: `activate` fires AND the parent's
|
|
9551
|
+
* own click handling runs (the row is selected). Enter / Space fire `activate` only; the parent's key handlers that require their own element as the
|
|
9552
|
+
* target (`ui-list-item`) ignore them.
|
|
9553
|
+
* <ui-image [src]="p.photo" [alt]="'Open photo of ' + p.name" [interactive]="true" (activate)="preview(p)" />
|
|
8841
9554
|
*/
|
|
8842
9555
|
export declare class ImageComponent {
|
|
8843
9556
|
/** Image URL (or data URL). Blank shows the placeholder. */
|
|
@@ -8864,8 +9577,15 @@ export declare class ImageComponent {
|
|
|
8864
9577
|
readonly priority: import("@angular/core").InputSignal<boolean>;
|
|
8865
9578
|
/** Bump to retry a failed image with the same `src`. */
|
|
8866
9579
|
readonly retryKey: import("@angular/core").InputSignal<unknown>;
|
|
9580
|
+
/**
|
|
9581
|
+
* Library source 2026-11-04, not yet published. `true` = the image is a button: `role="button"`, `tabindex="0"`, `aria-label` from `alt`, and click /
|
|
9582
|
+
* Enter / Space emit `activate`. Needs a non-empty `alt` (it is the button's name). Default `false` = a plain image, nothing changes.
|
|
9583
|
+
*/
|
|
9584
|
+
readonly interactive: import("@angular/core").InputSignal<boolean>;
|
|
8867
9585
|
readonly loaded: import("@angular/core").OutputEmitterRef<void>;
|
|
8868
9586
|
readonly failed: import("@angular/core").OutputEmitterRef<void>;
|
|
9587
|
+
/** Fires (once per press) when an `interactive` image is clicked, or Enter / Space is pressed on it. Never fires when not interactive. */
|
|
9588
|
+
readonly activate: import("@angular/core").OutputEmitterRef<void>;
|
|
8869
9589
|
protected readonly _failed: import("@angular/core").WritableSignal<boolean>;
|
|
8870
9590
|
protected readonly _url: import("@angular/core").Signal<string | null>;
|
|
8871
9591
|
protected readonly radiusCss: import("@angular/core").Signal<string>;
|
|
@@ -8877,6 +9597,8 @@ export declare class ImageComponent {
|
|
|
8877
9597
|
protected readonly isBlock: import("@angular/core").Signal<boolean>;
|
|
8878
9598
|
constructor();
|
|
8879
9599
|
protected _onError(): void;
|
|
9600
|
+
protected onActivate(): void;
|
|
9601
|
+
protected onKey(event: Event): void;
|
|
8880
9602
|
static ɵfac: i0.ɵɵFactoryDeclaration<ImageComponent, never>;
|
|
8881
9603
|
static ɵcmp: i0.ɵɵComponentDeclaration<ImageComponent, "ui-image", never, {
|
|
8882
9604
|
"src": {
|
|
@@ -8954,9 +9676,15 @@ export declare class ImageComponent {
|
|
|
8954
9676
|
"required": false;
|
|
8955
9677
|
"isSignal": true;
|
|
8956
9678
|
};
|
|
9679
|
+
"interactive": {
|
|
9680
|
+
"alias": "interactive";
|
|
9681
|
+
"required": false;
|
|
9682
|
+
"isSignal": true;
|
|
9683
|
+
};
|
|
8957
9684
|
}, {
|
|
8958
9685
|
"loaded": "loaded";
|
|
8959
9686
|
"failed": "failed";
|
|
9687
|
+
"activate": "activate";
|
|
8960
9688
|
}, never, never, true, never>;
|
|
8961
9689
|
}
|
|
8962
9690
|
/** One picture of a `ui-image-gallery`. */
|
|
@@ -9175,6 +9903,17 @@ export declare class KpiCardComponent {
|
|
|
9175
9903
|
readonly highlight: import("@angular/core").InputSignal<boolean>;
|
|
9176
9904
|
readonly clickable: import("@angular/core").InputSignal<boolean>;
|
|
9177
9905
|
readonly valueColor: import("@angular/core").InputSignal<KpiCardValueColor>;
|
|
9906
|
+
/**
|
|
9907
|
+
* (library source 2026-11-04, not yet published) While true the value (and the subtitle, when one is set) are replaced by grey
|
|
9908
|
+
* placeholders and the card is `aria-busy="true"`; assistive tech reads the label followed by the `loadingLabel` text
|
|
9909
|
+
* (visually hidden), never the stale value or subtitle. The card keeps its size: the value placeholder has the value line's box and the
|
|
9910
|
+
* subtitle placeholder is the subtitle's own (transparent) text, so pass the subtitle you will show while loading to keep the height
|
|
9911
|
+
* identical. The progress ring (when there is one) stays visible but is hidden from assistive tech (`aria-hidden="true"` on it) while loading, since its
|
|
9912
|
+
* value belongs to the data that is being replaced. Default false = unchanged. Everything else (icon, ring, `kpi-footer` slot, `clickable`, colours) is unaffected.
|
|
9913
|
+
*/
|
|
9914
|
+
readonly loading: import("@angular/core").InputSignal<boolean>;
|
|
9915
|
+
/** What assistive tech hears instead of the value while `loading` (default 'Loading'). */
|
|
9916
|
+
readonly loadingLabel: import("@angular/core").InputSignal<string>;
|
|
9178
9917
|
/** Card background as any CSS colour (`#fef2f2`, `var(--surface)` …). Empty (default) = white. The text colours do not change, so use a light shade. */
|
|
9179
9918
|
readonly background: import("@angular/core").InputSignal<string>;
|
|
9180
9919
|
/** Completed amount shown as a `ui-progress-ring` beside the label. `null` (default) = no ring. */
|
|
@@ -9236,6 +9975,16 @@ export declare class KpiCardComponent {
|
|
|
9236
9975
|
"required": false;
|
|
9237
9976
|
"isSignal": true;
|
|
9238
9977
|
};
|
|
9978
|
+
"loading": {
|
|
9979
|
+
"alias": "loading";
|
|
9980
|
+
"required": false;
|
|
9981
|
+
"isSignal": true;
|
|
9982
|
+
};
|
|
9983
|
+
"loadingLabel": {
|
|
9984
|
+
"alias": "loadingLabel";
|
|
9985
|
+
"required": false;
|
|
9986
|
+
"isSignal": true;
|
|
9987
|
+
};
|
|
9239
9988
|
"background": {
|
|
9240
9989
|
"alias": "background";
|
|
9241
9990
|
"required": false;
|
|
@@ -9547,6 +10296,12 @@ export declare function humanReadableMessage(value: unknown): string | null;
|
|
|
9547
10296
|
export declare class RadioComponent {
|
|
9548
10297
|
readonly label: import("@angular/core").InputSignal<string>;
|
|
9549
10298
|
readonly description: import("@angular/core").InputSignal<string>;
|
|
10299
|
+
/**
|
|
10300
|
+
* Library source 2026-11-04, not yet published. Optional icon drawn in front of the label: a `<ui-icon>` key (`cup`, `wrench`, `card`, ...) or a raw 24x24
|
|
10301
|
+
* stroke SVG path (`M12 5v14 M5 12h14`). Decorative (`aria-hidden`), so the accessible name stays the label. Empty (default), an unknown key or
|
|
10302
|
+
* text that is not a path = nothing is drawn and the DOM is unchanged.
|
|
10303
|
+
*/
|
|
10304
|
+
readonly icon: import("@angular/core").InputSignal<string>;
|
|
9550
10305
|
/** Accessible name when there is no visible `label`. */
|
|
9551
10306
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
9552
10307
|
/** `data-testid` of the native radio input; none when empty. */
|
|
@@ -9563,6 +10318,8 @@ export declare class RadioComponent {
|
|
|
9563
10318
|
/** Public so a host template can bind `[disabled]` (a protected input fails strict template type-checking). */
|
|
9564
10319
|
readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
|
|
9565
10320
|
protected readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
10321
|
+
/** Path of the icon: a known icon key, else the text itself when it looks like an SVG path (drawing commands and numbers only), else none. */
|
|
10322
|
+
protected readonly _iconD: import("@angular/core").Signal<string | null>;
|
|
9566
10323
|
/** Id of the visible label text. Optional: a host (e.g. `ui-radio-group`) can set it to point another element at the label with `aria-labelledby`; a unique id is generated when empty. */
|
|
9567
10324
|
readonly labelId: import("@angular/core").InputSignal<string>;
|
|
9568
10325
|
private readonly _generatedLabelId;
|
|
@@ -9587,6 +10344,11 @@ export declare class RadioComponent {
|
|
|
9587
10344
|
"required": false;
|
|
9588
10345
|
"isSignal": true;
|
|
9589
10346
|
};
|
|
10347
|
+
"icon": {
|
|
10348
|
+
"alias": "icon";
|
|
10349
|
+
"required": false;
|
|
10350
|
+
"isSignal": true;
|
|
10351
|
+
};
|
|
9590
10352
|
"ariaLabel": {
|
|
9591
10353
|
"alias": "ariaLabel";
|
|
9592
10354
|
"required": false;
|
|
@@ -10108,6 +10870,9 @@ export declare class PdfHotspotComponent {
|
|
|
10108
10870
|
* - `textColor`: the colour of the title, subtitle, chevron and body text (any CSS colour; default: the normal slate colours). Use it for light text on a dark `background`. Text you colour yourself inside the body keeps its own colour.
|
|
10109
10871
|
* - `<ng-container card-footer>` / `<div card-footer>`: a footer bar under the body (a pager, totals, a link). Hidden while empty or collapsed, 10px 18px padding,
|
|
10110
10872
|
* a light top line; `footerBackground` colours it (pair it with `headerBackground` to frame the card). In a `fill` card it is pinned to the bottom edge.
|
|
10873
|
+
* - `footerAlign="end"` (library source 2026-11-04, not yet published): turns the `[card-footer]` bar into a right-aligned action row (flex, `justify-content: flex-end`,
|
|
10874
|
+
* 8px gap, wraps on a narrow card) for one or several buttons under the body, e.g. `<ui-button card-footer variant="secondary" size="sm">Open Resident</ui-button>`.
|
|
10875
|
+
* Default `'start'` = the footer is unchanged (block content, left-aligned). Hidden while empty or collapsed in both modes.
|
|
10111
10876
|
* - The body has built-in padding (16px 18px, matching the header's 18px side padding); there is no padding input.
|
|
10112
10877
|
* - `collapsible` (default true): a chevron toggle and a clickable header; `[(expanded)]` is two-way.
|
|
10113
10878
|
* Without a header, or with `collapsible` false, the body is always open.
|
|
@@ -10139,7 +10904,7 @@ export declare class DetailCardComponent {
|
|
|
10139
10904
|
/** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
|
|
10140
10905
|
readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
|
|
10141
10906
|
/** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
|
|
10142
|
-
readonly headingLevel: import("@angular/core").InputSignal<1 |
|
|
10907
|
+
readonly headingLevel: import("@angular/core").InputSignal<2 | 1 | 5 | 3 | 4 | 6 | null>;
|
|
10143
10908
|
/** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
|
|
10144
10909
|
readonly titleId: import("@angular/core").InputSignal<string>;
|
|
10145
10910
|
/** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */
|
|
@@ -10152,6 +10917,8 @@ export declare class DetailCardComponent {
|
|
|
10152
10917
|
readonly headerBackground: import("@angular/core").InputSignal<string>;
|
|
10153
10918
|
/** Background colour of the footer bar (the `[card-footer]` slot) as any CSS colour. Empty = no colour of its own. */
|
|
10154
10919
|
readonly footerBackground: import("@angular/core").InputSignal<string>;
|
|
10920
|
+
/** Alignment of the `[card-footer]` content: `'start'` (default, unchanged) or `'end'` = a right-aligned action row with an 8px gap. */
|
|
10921
|
+
readonly footerAlign: import("@angular/core").InputSignal<"end" | "start">;
|
|
10155
10922
|
/** Text colour as any CSS colour (`#fff`, `var(--on-dark)` …). Empty = the default colours. Colours the title, subtitle, chevron and body text. */
|
|
10156
10923
|
readonly textColor: import("@angular/core").InputSignal<string>;
|
|
10157
10924
|
/** false = no header at all (no title, edit button, toggle or divider): the card is only the body, always open. */
|
|
@@ -10238,6 +11005,11 @@ export declare class DetailCardComponent {
|
|
|
10238
11005
|
"required": false;
|
|
10239
11006
|
"isSignal": true;
|
|
10240
11007
|
};
|
|
11008
|
+
"footerAlign": {
|
|
11009
|
+
"alias": "footerAlign";
|
|
11010
|
+
"required": false;
|
|
11011
|
+
"isSignal": true;
|
|
11012
|
+
};
|
|
10241
11013
|
"textColor": {
|
|
10242
11014
|
"alias": "textColor";
|
|
10243
11015
|
"required": false;
|
|
@@ -12322,6 +13094,12 @@ export declare function todayInTimezone(timezone?: string | null): string;
|
|
|
12322
13094
|
* download). A no-op without a DOM (server-side rendering).
|
|
12323
13095
|
*/
|
|
12324
13096
|
export declare function downloadBlob(blob: Blob, fileName: string): void;
|
|
13097
|
+
/**
|
|
13098
|
+
* The file name of a `Content-Disposition` header (`attachment; filename="a.zip"`, `filename=a.zip` or the encoded `filename*=UTF-8''a%20b.zip`),
|
|
13099
|
+
* or '' when the header is missing or names no file. Path separators and leading dots are removed so a server name can never point outside the
|
|
13100
|
+
* downloads folder.
|
|
13101
|
+
*/
|
|
13102
|
+
export declare function fileNameFromContentDisposition(header: string | null | undefined): string;
|
|
12325
13103
|
/**
|
|
12326
13104
|
* A lightbox: a `ui-modal` that shows a `ui-image-gallery` with a Close button in the footer.
|
|
12327
13105
|
*
|
|
@@ -12743,7 +13521,7 @@ export declare class SetupWizardComponent {
|
|
|
12743
13521
|
protected customHintId(): string;
|
|
12744
13522
|
protected readonly importBlocked: import("@angular/core").Signal<boolean>;
|
|
12745
13523
|
/** The step's own two parts (`splitLayout`) show as two tabs, one card at a time; this is the open one (it starts on the app's part on every visit). */
|
|
12746
|
-
protected readonly splitTab: import("@angular/core").WritableSignal<"
|
|
13524
|
+
protected readonly splitTab: import("@angular/core").WritableSignal<"extra" | "main">;
|
|
12747
13525
|
protected readonly splitTabs: import("@angular/core").Signal<{
|
|
12748
13526
|
key: string;
|
|
12749
13527
|
label: string;
|
|
@@ -14550,4 +15328,601 @@ export declare class ConversationsComponent {
|
|
|
14550
15328
|
"messagesRetry": "messagesRetry";
|
|
14551
15329
|
}, never, ["[uiConversationsContext]"], true, never>;
|
|
14552
15330
|
}
|
|
14553
|
-
|
|
15331
|
+
/**
|
|
15332
|
+
* Types and pure helpers of `ui-payment-side-panel`. Nothing here knows a payment processor: Stripe / Square arrive as plugins
|
|
15333
|
+
* (`PaymentMethodPlugin`), the card-present terminal as host callbacks.
|
|
15334
|
+
*/
|
|
15335
|
+
/** Well-known method values the panel gives behaviour to. Hosts may list any other value (it is recorded like Cash). */
|
|
15336
|
+
export declare const PAYMENT_METHOD: {
|
|
15337
|
+
readonly CARD: "CARD";
|
|
15338
|
+
readonly ACH: "ACH";
|
|
15339
|
+
readonly CASH: "CASH";
|
|
15340
|
+
readonly CHECK: "CHECK";
|
|
15341
|
+
readonly MONEY_ORDER: "MONEY_ORDER";
|
|
15342
|
+
readonly CARD_PRESENT: "CARD_PRESENT";
|
|
15343
|
+
};
|
|
15344
|
+
interface PaymentMethodOption {
|
|
15345
|
+
value: string;
|
|
15346
|
+
label: string;
|
|
15347
|
+
/** `'terminal'`: listed only while the host gave the terminal callbacks (`listReaders` + `startTerminalPayment`). */
|
|
15348
|
+
requires?: 'terminal';
|
|
15349
|
+
}
|
|
15350
|
+
/** The methods listed when the host gives none: Card and ACH are record-only until a processor plugin takes them over. */
|
|
15351
|
+
export declare const DEFAULT_PAYMENT_METHODS: readonly PaymentMethodOption[];
|
|
15352
|
+
interface PayableCharge {
|
|
15353
|
+
id: string;
|
|
15354
|
+
chargeType: string;
|
|
15355
|
+
description: string;
|
|
15356
|
+
/** ISO date `YYYY-MM-DD`. */
|
|
15357
|
+
dueDate: string;
|
|
15358
|
+
balanceDue: number;
|
|
15359
|
+
}
|
|
15360
|
+
interface SavedPaymentMethod {
|
|
15361
|
+
method: string;
|
|
15362
|
+
last4: string;
|
|
15363
|
+
label?: string;
|
|
15364
|
+
}
|
|
15365
|
+
interface AllocationModeOption {
|
|
15366
|
+
value: string;
|
|
15367
|
+
label: string;
|
|
15368
|
+
}
|
|
15369
|
+
export declare const ALLOCATION_CUSTOM = "custom";
|
|
15370
|
+
export declare const DEFAULT_ALLOCATION_MODES: readonly AllocationModeOption[];
|
|
15371
|
+
interface ChargeAllocation {
|
|
15372
|
+
chargeId: string;
|
|
15373
|
+
amount: number;
|
|
15374
|
+
}
|
|
15375
|
+
/**
|
|
15376
|
+
* How the payment is applied to charges. A non-custom mode sends `{ allocationMode }`. "Choose charges" sends `{ allocationChargeIds, allocations }`
|
|
15377
|
+
* (no `allocationMode`, like the old drawer); `allocations` carries the amount per charge.
|
|
15378
|
+
*/
|
|
15379
|
+
interface PaymentAllocation {
|
|
15380
|
+
allocationMode?: string;
|
|
15381
|
+
allocationChargeIds?: string[];
|
|
15382
|
+
allocations?: ChargeAllocation[];
|
|
15383
|
+
}
|
|
15384
|
+
interface PaymentEntry {
|
|
15385
|
+
paymentMethod: string;
|
|
15386
|
+
amount: number;
|
|
15387
|
+
/** Check number / last 4 digits; `null` when the method has none. */
|
|
15388
|
+
reference: string | null;
|
|
15389
|
+
/** The receipt checkbox applies to the LAST entry only (like the old drawer); earlier split entries are `false`. */
|
|
15390
|
+
sendReceipt: boolean;
|
|
15391
|
+
}
|
|
15392
|
+
interface RecordPaymentPayload extends PaymentAllocation {
|
|
15393
|
+
/** Total of all entries. */
|
|
15394
|
+
amount: number;
|
|
15395
|
+
/** The method of a single payment, `'SPLIT'` when `split`. */
|
|
15396
|
+
paymentMethod: string;
|
|
15397
|
+
receivedDate: string;
|
|
15398
|
+
/** Reference of the single payment (`null` for a split: see `entries`). */
|
|
15399
|
+
reference: string | null;
|
|
15400
|
+
notes: string | null;
|
|
15401
|
+
sendReceipt: boolean;
|
|
15402
|
+
/** One per payment to create (the host posts one request per entry, or one request with all). */
|
|
15403
|
+
entries: PaymentEntry[];
|
|
15404
|
+
split: boolean;
|
|
15405
|
+
}
|
|
15406
|
+
interface RecordPaymentResult {
|
|
15407
|
+
type: 'manual' | 'stripe' | 'split';
|
|
15408
|
+
paymentMethod: string;
|
|
15409
|
+
amount: number;
|
|
15410
|
+
}
|
|
15411
|
+
/** What the panel reports for the host to word (toasts, analytics). It never toasts itself. */
|
|
15412
|
+
type PaymentPanelOutcome = {
|
|
15413
|
+
kind: 'recorded';
|
|
15414
|
+
result: RecordPaymentResult;
|
|
15415
|
+
} | {
|
|
15416
|
+
kind: 'split-recorded';
|
|
15417
|
+
result: RecordPaymentResult;
|
|
15418
|
+
} | {
|
|
15419
|
+
kind: 'terminal-paid';
|
|
15420
|
+
result: RecordPaymentResult;
|
|
15421
|
+
} | {
|
|
15422
|
+
kind: 'plugin';
|
|
15423
|
+
method: string;
|
|
15424
|
+
code: string;
|
|
15425
|
+
result?: RecordPaymentResult;
|
|
15426
|
+
message?: string;
|
|
15427
|
+
} | {
|
|
15428
|
+
kind: 'failed';
|
|
15429
|
+
stage: 'record' | 'readers' | 'terminal';
|
|
15430
|
+
message: string;
|
|
15431
|
+
};
|
|
15432
|
+
type HostResult<T> = Observable<T> | Promise<T> | T;
|
|
15433
|
+
type RecordPaymentFn = (payload: RecordPaymentPayload) => HostResult<unknown>;
|
|
15434
|
+
interface TerminalReader {
|
|
15435
|
+
id: string;
|
|
15436
|
+
label?: string;
|
|
15437
|
+
status: string;
|
|
15438
|
+
deviceType?: string;
|
|
15439
|
+
}
|
|
15440
|
+
interface TerminalStartContext extends PaymentAllocation {
|
|
15441
|
+
readerId: string;
|
|
15442
|
+
amount: number;
|
|
15443
|
+
receivedDate: string;
|
|
15444
|
+
notes: string | null;
|
|
15445
|
+
}
|
|
15446
|
+
interface TerminalStartResult {
|
|
15447
|
+
paymentIntentId: string;
|
|
15448
|
+
}
|
|
15449
|
+
interface TerminalStatusResult {
|
|
15450
|
+
status: string;
|
|
15451
|
+
}
|
|
15452
|
+
interface TerminalConfirmContext extends TerminalStartContext {
|
|
15453
|
+
paymentIntentId: string;
|
|
15454
|
+
}
|
|
15455
|
+
type TerminalPhase = 'idle' | 'waiting' | 'confirming' | 'success';
|
|
15456
|
+
/** Reader statuses that end the wait. */
|
|
15457
|
+
export declare function terminalVerdict(status: string | null | undefined): 'succeeded' | 'canceled' | 'declined' | 'pending';
|
|
15458
|
+
export declare function terminalTimeoutText(ms: number): string;
|
|
15459
|
+
export declare const MIN_PAYMENT_AMOUNT = 0.01;
|
|
15460
|
+
export declare const MAX_PAYMENT_AMOUNT = 99999.99;
|
|
15461
|
+
declare const toCents: (value: number) => number;
|
|
15462
|
+
declare const fromCents: (cents: number) => number;
|
|
15463
|
+
declare const roundMoney: (value: number) => number;
|
|
15464
|
+
/** A payable amount: a finite number from 0.01 to `max` with at most two decimals. */
|
|
15465
|
+
export declare function isValidAmount(value: unknown, max?: number): value is number;
|
|
15466
|
+
declare function sumMoney(values: readonly number[]): number;
|
|
15467
|
+
declare function referenceKind(method: string, live: boolean): 'check' | 'last4-card' | 'last4-account' | null;
|
|
15468
|
+
/** The last-4 box accepts digits only (blank is fine). */
|
|
15469
|
+
export declare function last4Error(value: string): string;
|
|
15470
|
+
declare function last4Digits(value: string, max?: number): string;
|
|
15471
|
+
interface AllocationCheck {
|
|
15472
|
+
general: string;
|
|
15473
|
+
perCharge: Record<string, string>;
|
|
15474
|
+
}
|
|
15475
|
+
type SelectedCharges = Record<string, number | null>;
|
|
15476
|
+
declare function allocationCheck(charges: readonly PayableCharge[], selected: SelectedCharges, totalPayment: number | null, format: (n: number) => string): AllocationCheck;
|
|
15477
|
+
/** The amount to propose when a charge is ticked: its balance, capped by what is left of the payment. */
|
|
15478
|
+
declare function defaultChargeAmount(charge: PayableCharge, selected: SelectedCharges, totalPayment: number | null): number | null;
|
|
15479
|
+
declare function buildAllocation(mode: string, charges: readonly PayableCharge[], selected: SelectedCharges): PaymentAllocation;
|
|
15480
|
+
/** "2026-11-03" -> "Nov 3, 2026" without `Date` string parsing (Safari-safe, time-zone independent). */
|
|
15481
|
+
declare function formatDueDate(iso: string, locale?: string): string;
|
|
15482
|
+
/** Runs a host callback that may return an Observable, a Promise or a value; a synchronous throw becomes a rejection. */
|
|
15483
|
+
export declare function callHost<T>(thunk: () => HostResult<T>): Promise<T>;
|
|
15484
|
+
/** The text of a failed host call: its HTTP body message, its message, else the fallback. */
|
|
15485
|
+
export declare function hostErrorMessage(err: unknown, fallback: string): string;
|
|
15486
|
+
/** A method a plugin contributes to the panel's method select (while the plugin is rendered inside the panel). */
|
|
15487
|
+
export interface PaymentPluginMethod {
|
|
15488
|
+
value: string;
|
|
15489
|
+
label: string;
|
|
15490
|
+
}
|
|
15491
|
+
/** The footer button a plugin body may ask the panel to show instead of the panel's own (the panel's own button is hidden for plugin methods). */
|
|
15492
|
+
export interface PaymentPluginPrimary {
|
|
15493
|
+
label: string;
|
|
15494
|
+
disabled?: boolean;
|
|
15495
|
+
loading?: boolean;
|
|
15496
|
+
onClick: () => void;
|
|
15497
|
+
}
|
|
15498
|
+
/**
|
|
15499
|
+
* What the panel hands to a plugin body (`<ng-template let-ctx>`). The values are a snapshot that is replaced whenever the form changes (read them in the
|
|
15500
|
+
* template or in an `input()` of a child component); the functions are stable.
|
|
15501
|
+
*/
|
|
15502
|
+
export interface PaymentMethodContext {
|
|
15503
|
+
/** The selected method value (one of the plugin's `methods`). */
|
|
15504
|
+
readonly method: string;
|
|
15505
|
+
/** The entered amount, or `null` while it is empty or invalid (a plugin should not start a charge without it). */
|
|
15506
|
+
readonly amount: number | null;
|
|
15507
|
+
/** ISO date the payment was received. */
|
|
15508
|
+
readonly receivedDate: string;
|
|
15509
|
+
readonly note: string;
|
|
15510
|
+
/** How the payment is applied to charges (same shape the manual payload carries). */
|
|
15511
|
+
readonly allocation: PaymentAllocation;
|
|
15512
|
+
/** ISO 4217 code of the panel (`'USD'`). */
|
|
15513
|
+
readonly currency: string;
|
|
15514
|
+
/** Every field of the panel is valid (amount, date, note, allocation). */
|
|
15515
|
+
readonly valid: boolean;
|
|
15516
|
+
/** Reveals the panel's field errors (as a failed Save click does) and returns whether the form is valid. Call it before starting a charge. */
|
|
15517
|
+
validate(): boolean;
|
|
15518
|
+
/** Clears the whole form (method, amount, note, split, allocation; the date returns to today). */
|
|
15519
|
+
reset(): void;
|
|
15520
|
+
/** The payment is done: the panel reports it (`outcome` kind `'plugin'`, code `'complete'`, then `recorded`). Defaults: type `'manual'`, the selected method, the entered amount. Runs once. */
|
|
15521
|
+
complete(result?: Partial<RecordPaymentResult>): void;
|
|
15522
|
+
/** A flow is running: the fields are locked and the method cannot be changed. */
|
|
15523
|
+
setBusy(busy: boolean): void;
|
|
15524
|
+
/** The plugin's own footer button (e.g. "Pay $120.00"); `null` removes it. The panel's own Save button never shows for a plugin method. */
|
|
15525
|
+
setPrimary(button: PaymentPluginPrimary | null): void;
|
|
15526
|
+
/** Hide the panel's fields and show only the plugin body (e.g. a "payment submitted" notice). */
|
|
15527
|
+
setExclusive(on: boolean): void;
|
|
15528
|
+
/** Called when the body is about to go away unfinished: the panel closes, the method changes, or the plugin is removed. Not called after `complete()`. */
|
|
15529
|
+
onCancel(fn: (() => void) | null): void;
|
|
15530
|
+
/** Tell the host something happened (`outcome` kind `'plugin'`) so it can word a toast. */
|
|
15531
|
+
report(code: string, extra?: {
|
|
15532
|
+
result?: RecordPaymentResult;
|
|
15533
|
+
message?: string;
|
|
15534
|
+
}): void;
|
|
15535
|
+
/** Text for the panel's screen-reader status region. */
|
|
15536
|
+
announce(text: string): void;
|
|
15537
|
+
}
|
|
15538
|
+
export interface PaymentMethodBodyContext {
|
|
15539
|
+
$implicit: PaymentMethodContext;
|
|
15540
|
+
}
|
|
15541
|
+
/**
|
|
15542
|
+
* The contract of a payment plugin: a child element of `<ui-payment-side-panel>` that contributes live methods (Stripe, Square, ...).
|
|
15543
|
+
* The panel finds plugins with `contentChildren(PAYMENT_METHOD_PLUGIN)`, so presence IS the opt-in; remove the element and its methods leave the select.
|
|
15544
|
+
* A plugin whose method value is `CARD` or `ACH` replaces the record-only behaviour (last 4 digits) of that value while it is rendered.
|
|
15545
|
+
*/
|
|
15546
|
+
export declare abstract class PaymentMethodPlugin {
|
|
15547
|
+
abstract readonly methods: Signal<readonly PaymentPluginMethod[]>;
|
|
15548
|
+
/** The body shown under the form while one of the plugin's methods is selected. */
|
|
15549
|
+
abstract readonly template: Signal<TemplateRef<PaymentMethodBodyContext> | undefined>;
|
|
15550
|
+
}
|
|
15551
|
+
export declare const PAYMENT_METHOD_PLUGIN: InjectionToken<PaymentMethodPlugin>;
|
|
15552
|
+
/**
|
|
15553
|
+
* The generic payment plugin: the host renders the body of a method it built itself (Square Web SDK, a gateway widget, ...).
|
|
15554
|
+
*
|
|
15555
|
+
* <ui-payment-side-panel ...>
|
|
15556
|
+
* <ui-payment-custom-method value="CARD" label="Card">
|
|
15557
|
+
* <ng-template let-ctx> <my-square-card [amount]="ctx.amount" (paid)="ctx.complete({ type: 'stripe' })" /> </ng-template>
|
|
15558
|
+
* </ui-payment-custom-method>
|
|
15559
|
+
* </ui-payment-side-panel>
|
|
15560
|
+
*/
|
|
15561
|
+
export declare class PaymentCustomMethodComponent extends PaymentMethodPlugin {
|
|
15562
|
+
readonly value: import("@angular/core").InputSignal<string>;
|
|
15563
|
+
readonly label: import("@angular/core").InputSignal<string>;
|
|
15564
|
+
private readonly body;
|
|
15565
|
+
readonly methods: import("@angular/core").Signal<readonly PaymentPluginMethod[]>;
|
|
15566
|
+
readonly template: import("@angular/core").Signal<TemplateRef<PaymentMethodBodyContext> | undefined>;
|
|
15567
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PaymentCustomMethodComponent, never>;
|
|
15568
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PaymentCustomMethodComponent, "ui-payment-custom-method", never, {
|
|
15569
|
+
"value": {
|
|
15570
|
+
"alias": "value";
|
|
15571
|
+
"required": true;
|
|
15572
|
+
"isSignal": true;
|
|
15573
|
+
};
|
|
15574
|
+
"label": {
|
|
15575
|
+
"alias": "label";
|
|
15576
|
+
"required": true;
|
|
15577
|
+
"isSignal": true;
|
|
15578
|
+
};
|
|
15579
|
+
}, {}, ["body"], never, true, never>;
|
|
15580
|
+
}
|
|
15581
|
+
interface SplitEntry {
|
|
15582
|
+
method: string;
|
|
15583
|
+
amount: number;
|
|
15584
|
+
reference: string;
|
|
15585
|
+
}
|
|
15586
|
+
/**
|
|
15587
|
+
* Side panel for staff to RECORD or COLLECT a payment. Works on its own (record-only: Cash, Check, Money Order, Card and ACH with the last 4 digits) and grows
|
|
15588
|
+
* by PLUGINS the host drops in as child elements (`ui-payment-stripe-method` from `@forgeroute/ui/stripe`, `ui-payment-custom-method` for Square or any widget):
|
|
15589
|
+
* a plugin's presence IS the opt-in, and a plugin method with the value `CARD` / `ACH` replaces the record-only behaviour while it is rendered.
|
|
15590
|
+
* The panel has no HTTP and no processor knowledge: the host gives callbacks (`recordPayment`, the terminal calls) and words the `outcome` events.
|
|
15591
|
+
*
|
|
15592
|
+
* <ui-payment-side-panel [open]="open()" [today]="today()" [outstandingBalance]="due()" [charges]="charges()"
|
|
15593
|
+
* [recordPayment]="record" (recorded)="onRecorded($event)" (closed)="open.set(false)" />
|
|
15594
|
+
*
|
|
15595
|
+
* See docs/payment-side-panel.md.
|
|
15596
|
+
*/
|
|
15597
|
+
export declare class PaymentSidePanelComponent {
|
|
15598
|
+
private readonly injector;
|
|
15599
|
+
private readonly hostEl;
|
|
15600
|
+
protected readonly ids: string;
|
|
15601
|
+
protected readonly customMode = "custom";
|
|
15602
|
+
readonly open: import("@angular/core").InputSignal<boolean>;
|
|
15603
|
+
readonly title: import("@angular/core").InputSignal<string>;
|
|
15604
|
+
readonly subtitle: import("@angular/core").InputSignal<string>;
|
|
15605
|
+
/** Today as `YYYY-MM-DD` (the host's clock/time zone): the default Received Date. The panel never builds dates itself. */
|
|
15606
|
+
readonly today: import("@angular/core").InputSignal<string>;
|
|
15607
|
+
/** When > 0 a banner shows it and the amount starts at this balance. */
|
|
15608
|
+
readonly outstandingBalance: import("@angular/core").InputSignal<number | null>;
|
|
15609
|
+
/** ISO 4217 code used for every amount shown. */
|
|
15610
|
+
readonly currency: import("@angular/core").InputSignal<string>;
|
|
15611
|
+
readonly maxAmount: import("@angular/core").InputSignal<number>;
|
|
15612
|
+
/** Latest Received Date (ISO). Default: `today`, because a payment cannot be received in the future. */
|
|
15613
|
+
readonly maxDate: import("@angular/core").InputSignal<string>;
|
|
15614
|
+
/** The methods listed (value/label). Default: Card, ACH / Bank Transfer, Cash, Check, Money Order, Card Present (terminal callbacks given). */
|
|
15615
|
+
readonly methods: import("@angular/core").InputSignal<readonly PaymentMethodOption[]>;
|
|
15616
|
+
readonly savedMethods: import("@angular/core").InputSignal<readonly SavedPaymentMethod[]>;
|
|
15617
|
+
readonly charges: import("@angular/core").InputSignal<readonly PayableCharge[]>;
|
|
15618
|
+
readonly allocationModes: import("@angular/core").InputSignal<readonly AllocationModeOption[]>;
|
|
15619
|
+
readonly defaultAllocationMode: import("@angular/core").InputSignal<string>;
|
|
15620
|
+
/** Text of the "send receipt" checkbox (e.g. "Email receipt to resident"); empty hides it. */
|
|
15621
|
+
readonly receiptLabel: import("@angular/core").InputSignal<string>;
|
|
15622
|
+
readonly submitLabel: import("@angular/core").InputSignal<string>;
|
|
15623
|
+
readonly splitSubmitLabel: import("@angular/core").InputSignal<string>;
|
|
15624
|
+
/** Records the payment. Returns an Observable / Promise; a rejection is shown in the panel and it stays open. */
|
|
15625
|
+
readonly recordPayment: import("@angular/core").InputSignal<RecordPaymentFn | null>;
|
|
15626
|
+
readonly listReaders: import("@angular/core").InputSignal<(() => HostResult<readonly TerminalReader[]>) | null>;
|
|
15627
|
+
readonly startTerminalPayment: import("@angular/core").InputSignal<((ctx: TerminalStartContext) => HostResult<TerminalStartResult>) | null>;
|
|
15628
|
+
readonly terminalStatus: import("@angular/core").InputSignal<((paymentIntentId: string) => HostResult<TerminalStatusResult>) | null>;
|
|
15629
|
+
readonly confirmTerminalPayment: import("@angular/core").InputSignal<((ctx: TerminalConfirmContext) => HostResult<unknown>) | null>;
|
|
15630
|
+
readonly cancelTerminal: import("@angular/core").InputSignal<((readerId: string) => HostResult<unknown>) | null>;
|
|
15631
|
+
readonly terminalProvider: import("@angular/core").InputSignal<string>;
|
|
15632
|
+
readonly noReadersText: import("@angular/core").InputSignal<string>;
|
|
15633
|
+
readonly terminalPollMs: import("@angular/core").InputSignal<number>;
|
|
15634
|
+
readonly terminalTimeoutMs: import("@angular/core").InputSignal<number>;
|
|
15635
|
+
readonly readerRefreshMs: import("@angular/core").InputSignal<number>;
|
|
15636
|
+
readonly terminalSuccessDelayMs: import("@angular/core").InputSignal<number>;
|
|
15637
|
+
readonly closed: import("@angular/core").OutputEmitterRef<void>;
|
|
15638
|
+
/** The payment is done (any flow). The host closes the panel. */
|
|
15639
|
+
readonly recorded: import("@angular/core").OutputEmitterRef<RecordPaymentResult>;
|
|
15640
|
+
/** What happened, for the host to word (the panel never toasts). */
|
|
15641
|
+
readonly outcome: import("@angular/core").OutputEmitterRef<PaymentPanelOutcome>;
|
|
15642
|
+
private readonly plugins;
|
|
15643
|
+
private readonly fields;
|
|
15644
|
+
readonly method: import("@angular/core").WritableSignal<string>;
|
|
15645
|
+
readonly amount: import("@angular/core").WritableSignal<number | null>;
|
|
15646
|
+
readonly receivedDate: import("@angular/core").WritableSignal<string>;
|
|
15647
|
+
readonly reference: import("@angular/core").WritableSignal<string>;
|
|
15648
|
+
readonly note: import("@angular/core").WritableSignal<string>;
|
|
15649
|
+
readonly sendReceipt: import("@angular/core").WritableSignal<boolean>;
|
|
15650
|
+
readonly splitEntries: import("@angular/core").WritableSignal<SplitEntry[]>;
|
|
15651
|
+
readonly allocationMode: import("@angular/core").WritableSignal<string>;
|
|
15652
|
+
readonly selectedCharges: import("@angular/core").WritableSignal<SelectedCharges>;
|
|
15653
|
+
readonly touched: import("@angular/core").WritableSignal<boolean>;
|
|
15654
|
+
readonly submitting: import("@angular/core").WritableSignal<boolean>;
|
|
15655
|
+
readonly submitError: import("@angular/core").WritableSignal<string>;
|
|
15656
|
+
readonly announcement: import("@angular/core").WritableSignal<string>;
|
|
15657
|
+
private readonly pluginBusy;
|
|
15658
|
+
protected readonly exclusive: import("@angular/core").WritableSignal<boolean>;
|
|
15659
|
+
private readonly pluginPrimary;
|
|
15660
|
+
private cancelHook;
|
|
15661
|
+
private completed;
|
|
15662
|
+
readonly readers: import("@angular/core").WritableSignal<readonly TerminalReader[]>;
|
|
15663
|
+
readonly readersLoaded: import("@angular/core").WritableSignal<boolean>;
|
|
15664
|
+
readonly loadingReaders: import("@angular/core").WritableSignal<boolean>;
|
|
15665
|
+
readonly readersError: import("@angular/core").WritableSignal<string>;
|
|
15666
|
+
readonly readerId: import("@angular/core").WritableSignal<string>;
|
|
15667
|
+
readonly terminalPhase: import("@angular/core").WritableSignal<TerminalPhase>;
|
|
15668
|
+
readonly terminalError: import("@angular/core").WritableSignal<string>;
|
|
15669
|
+
readonly sendingToReader: import("@angular/core").WritableSignal<boolean>;
|
|
15670
|
+
readonly retryIntentId: import("@angular/core").WritableSignal<string>;
|
|
15671
|
+
readonly retrying: import("@angular/core").WritableSignal<boolean>;
|
|
15672
|
+
readonly terminalAmount: import("@angular/core").WritableSignal<number>;
|
|
15673
|
+
/** Bumped when the form is reset or the panel closes: an async terminal step that finishes later must not touch the new state. */
|
|
15674
|
+
private session;
|
|
15675
|
+
private retryContext;
|
|
15676
|
+
private pollTimer;
|
|
15677
|
+
private pollToken;
|
|
15678
|
+
private refreshTimer;
|
|
15679
|
+
private successTimer;
|
|
15680
|
+
private pendingTerminalResult;
|
|
15681
|
+
private terminalContext;
|
|
15682
|
+
protected readonly busy: import("@angular/core").Signal<boolean>;
|
|
15683
|
+
/** Fields are read-only while something runs, and while a taken terminal payment still has to be recorded (its amount must not change). */
|
|
15684
|
+
protected readonly locked: import("@angular/core").Signal<boolean>;
|
|
15685
|
+
protected readonly dateMax: import("@angular/core").Signal<string>;
|
|
15686
|
+
protected readonly money: (value: number) => string;
|
|
15687
|
+
protected readonly currencySymbol: import("@angular/core").Signal<string>;
|
|
15688
|
+
private readonly terminalAvailable;
|
|
15689
|
+
/** value -> label of every live method the rendered plugins contribute (the first plugin wins a duplicate value). */
|
|
15690
|
+
private readonly liveMethods;
|
|
15691
|
+
protected readonly kind: import("@angular/core").Signal<"none" | "manual" | "live" | "terminal">;
|
|
15692
|
+
private kindOf;
|
|
15693
|
+
/** The method list as shown: record-only built-ins (a plugin takes over its own values), plugin extras, and only manual ones while a split is being built. */
|
|
15694
|
+
readonly methodList: import("@angular/core").Signal<PaymentMethodOption[]>;
|
|
15695
|
+
protected readonly methodOptions: import("@angular/core").Signal<{
|
|
15696
|
+
value: string;
|
|
15697
|
+
label: string;
|
|
15698
|
+
}[]>;
|
|
15699
|
+
protected readonly methodRequired: import("@angular/core").Signal<boolean>;
|
|
15700
|
+
protected readonly allocationOptions: import("@angular/core").Signal<{
|
|
15701
|
+
value: string;
|
|
15702
|
+
label: string;
|
|
15703
|
+
}[]>;
|
|
15704
|
+
/** Hidden while a taken terminal payment still has to be recorded: the method cannot change then. */
|
|
15705
|
+
protected readonly savedChips: import("@angular/core").Signal<SavedPaymentMethod[]>;
|
|
15706
|
+
protected readonly refKind: import("@angular/core").Signal<"check" | "last4-card" | "last4-account" | null>;
|
|
15707
|
+
protected readonly referenceError: import("@angular/core").Signal<string>;
|
|
15708
|
+
private readonly amountValid;
|
|
15709
|
+
protected readonly splitTotal: import("@angular/core").Signal<number>;
|
|
15710
|
+
private readonly totalPayment;
|
|
15711
|
+
protected readonly allocation: import("@angular/core").Signal<AllocationCheck>;
|
|
15712
|
+
private readonly allocationPayload;
|
|
15713
|
+
protected readonly hasInvalid: import("@angular/core").Signal<boolean>;
|
|
15714
|
+
protected readonly canSplit: import("@angular/core").Signal<boolean>;
|
|
15715
|
+
protected readonly readerOptions: import("@angular/core").Signal<{
|
|
15716
|
+
value: string;
|
|
15717
|
+
label: string;
|
|
15718
|
+
}[]>;
|
|
15719
|
+
protected readonly selectedReader: import("@angular/core").Signal<TerminalReader | null>;
|
|
15720
|
+
protected readonly canSendToReader: import("@angular/core").Signal<boolean>;
|
|
15721
|
+
protected readonly pluginTemplate: import("@angular/core").Signal<import("@angular/core").TemplateRef<PaymentMethodBodyContext> | undefined>;
|
|
15722
|
+
protected readonly pluginContext: import("@angular/core").Signal<PaymentMethodBodyContext>;
|
|
15723
|
+
protected readonly primaryLabel: import("@angular/core").Signal<string>;
|
|
15724
|
+
protected readonly primaryLoading: import("@angular/core").Signal<boolean>;
|
|
15725
|
+
protected readonly primaryDisabled: import("@angular/core").Signal<boolean>;
|
|
15726
|
+
constructor();
|
|
15727
|
+
private init;
|
|
15728
|
+
private teardown;
|
|
15729
|
+
private resetForm;
|
|
15730
|
+
/** A card payment the reader took but that was never recorded is being abandoned: the host must hear about it. */
|
|
15731
|
+
private dropPendingRetry;
|
|
15732
|
+
private cleanup;
|
|
15733
|
+
protected onClose(): void;
|
|
15734
|
+
private runCancelHook;
|
|
15735
|
+
protected onMethodChange(value: string | null): void;
|
|
15736
|
+
protected selectSaved(saved: SavedPaymentMethod): void;
|
|
15737
|
+
protected chipLabel(saved: SavedPaymentMethod): string;
|
|
15738
|
+
protected methodLabel(value: string): string;
|
|
15739
|
+
protected onLast4(value: string | null): void;
|
|
15740
|
+
protected addSplit(): void;
|
|
15741
|
+
protected removeSplit(index: number): void;
|
|
15742
|
+
protected onAllocationMode(value: string | null): void;
|
|
15743
|
+
protected isTicked(id: string): boolean;
|
|
15744
|
+
protected toggleCharge(charge: PayableCharge, checked: boolean): void;
|
|
15745
|
+
protected setChargeAmount(id: string, value: number | string | null): void;
|
|
15746
|
+
protected chargeDescription(charge: PayableCharge): string;
|
|
15747
|
+
private referenceFor;
|
|
15748
|
+
private buildEntries;
|
|
15749
|
+
/** The payload the host receives, or `null` when there is nothing valid to record. */
|
|
15750
|
+
buildPayload(): RecordPaymentPayload | null;
|
|
15751
|
+
protected onPrimary(): void;
|
|
15752
|
+
submit(): Promise<void>;
|
|
15753
|
+
/**
|
|
15754
|
+
* A host that posts the entries one by one can tell the panel how many went through before a failure: `throw { message, postedEntries: 1 }`.
|
|
15755
|
+
* Those first entries are removed, so a retry does not post them again.
|
|
15756
|
+
*/
|
|
15757
|
+
private dropPostedEntries;
|
|
15758
|
+
private buildContext;
|
|
15759
|
+
private completeFromPlugin;
|
|
15760
|
+
private resetTerminal;
|
|
15761
|
+
private startTerminalSession;
|
|
15762
|
+
protected refreshReaders(): void;
|
|
15763
|
+
private loadReaders;
|
|
15764
|
+
private scheduleReaderRefresh;
|
|
15765
|
+
private stopReaderRefresh;
|
|
15766
|
+
private terminalBase;
|
|
15767
|
+
sendToReader(): Promise<void>;
|
|
15768
|
+
private startPolling;
|
|
15769
|
+
private stopPolling;
|
|
15770
|
+
private endWaiting;
|
|
15771
|
+
private confirmTerminal;
|
|
15772
|
+
/** Repeats the recording for the payment the reader already took, with the amount that was charged (not the form's current values). */
|
|
15773
|
+
protected retryRecording(): Promise<void>;
|
|
15774
|
+
private finishTerminal;
|
|
15775
|
+
protected cancelTerminalPayment(): void;
|
|
15776
|
+
private cancelTerminalIfWaiting;
|
|
15777
|
+
/** Moves focus after the next render (the control that had it was just removed from the DOM). */
|
|
15778
|
+
private focusLater;
|
|
15779
|
+
private fireCancelReader;
|
|
15780
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<PaymentSidePanelComponent, never>;
|
|
15781
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<PaymentSidePanelComponent, "ui-payment-side-panel", never, {
|
|
15782
|
+
"open": {
|
|
15783
|
+
"alias": "open";
|
|
15784
|
+
"required": false;
|
|
15785
|
+
"isSignal": true;
|
|
15786
|
+
};
|
|
15787
|
+
"title": {
|
|
15788
|
+
"alias": "title";
|
|
15789
|
+
"required": false;
|
|
15790
|
+
"isSignal": true;
|
|
15791
|
+
};
|
|
15792
|
+
"subtitle": {
|
|
15793
|
+
"alias": "subtitle";
|
|
15794
|
+
"required": false;
|
|
15795
|
+
"isSignal": true;
|
|
15796
|
+
};
|
|
15797
|
+
"today": {
|
|
15798
|
+
"alias": "today";
|
|
15799
|
+
"required": false;
|
|
15800
|
+
"isSignal": true;
|
|
15801
|
+
};
|
|
15802
|
+
"outstandingBalance": {
|
|
15803
|
+
"alias": "outstandingBalance";
|
|
15804
|
+
"required": false;
|
|
15805
|
+
"isSignal": true;
|
|
15806
|
+
};
|
|
15807
|
+
"currency": {
|
|
15808
|
+
"alias": "currency";
|
|
15809
|
+
"required": false;
|
|
15810
|
+
"isSignal": true;
|
|
15811
|
+
};
|
|
15812
|
+
"maxAmount": {
|
|
15813
|
+
"alias": "maxAmount";
|
|
15814
|
+
"required": false;
|
|
15815
|
+
"isSignal": true;
|
|
15816
|
+
};
|
|
15817
|
+
"maxDate": {
|
|
15818
|
+
"alias": "maxDate";
|
|
15819
|
+
"required": false;
|
|
15820
|
+
"isSignal": true;
|
|
15821
|
+
};
|
|
15822
|
+
"methods": {
|
|
15823
|
+
"alias": "methods";
|
|
15824
|
+
"required": false;
|
|
15825
|
+
"isSignal": true;
|
|
15826
|
+
};
|
|
15827
|
+
"savedMethods": {
|
|
15828
|
+
"alias": "savedMethods";
|
|
15829
|
+
"required": false;
|
|
15830
|
+
"isSignal": true;
|
|
15831
|
+
};
|
|
15832
|
+
"charges": {
|
|
15833
|
+
"alias": "charges";
|
|
15834
|
+
"required": false;
|
|
15835
|
+
"isSignal": true;
|
|
15836
|
+
};
|
|
15837
|
+
"allocationModes": {
|
|
15838
|
+
"alias": "allocationModes";
|
|
15839
|
+
"required": false;
|
|
15840
|
+
"isSignal": true;
|
|
15841
|
+
};
|
|
15842
|
+
"defaultAllocationMode": {
|
|
15843
|
+
"alias": "defaultAllocationMode";
|
|
15844
|
+
"required": false;
|
|
15845
|
+
"isSignal": true;
|
|
15846
|
+
};
|
|
15847
|
+
"receiptLabel": {
|
|
15848
|
+
"alias": "receiptLabel";
|
|
15849
|
+
"required": false;
|
|
15850
|
+
"isSignal": true;
|
|
15851
|
+
};
|
|
15852
|
+
"submitLabel": {
|
|
15853
|
+
"alias": "submitLabel";
|
|
15854
|
+
"required": false;
|
|
15855
|
+
"isSignal": true;
|
|
15856
|
+
};
|
|
15857
|
+
"splitSubmitLabel": {
|
|
15858
|
+
"alias": "splitSubmitLabel";
|
|
15859
|
+
"required": false;
|
|
15860
|
+
"isSignal": true;
|
|
15861
|
+
};
|
|
15862
|
+
"recordPayment": {
|
|
15863
|
+
"alias": "recordPayment";
|
|
15864
|
+
"required": false;
|
|
15865
|
+
"isSignal": true;
|
|
15866
|
+
};
|
|
15867
|
+
"listReaders": {
|
|
15868
|
+
"alias": "listReaders";
|
|
15869
|
+
"required": false;
|
|
15870
|
+
"isSignal": true;
|
|
15871
|
+
};
|
|
15872
|
+
"startTerminalPayment": {
|
|
15873
|
+
"alias": "startTerminalPayment";
|
|
15874
|
+
"required": false;
|
|
15875
|
+
"isSignal": true;
|
|
15876
|
+
};
|
|
15877
|
+
"terminalStatus": {
|
|
15878
|
+
"alias": "terminalStatus";
|
|
15879
|
+
"required": false;
|
|
15880
|
+
"isSignal": true;
|
|
15881
|
+
};
|
|
15882
|
+
"confirmTerminalPayment": {
|
|
15883
|
+
"alias": "confirmTerminalPayment";
|
|
15884
|
+
"required": false;
|
|
15885
|
+
"isSignal": true;
|
|
15886
|
+
};
|
|
15887
|
+
"cancelTerminal": {
|
|
15888
|
+
"alias": "cancelTerminal";
|
|
15889
|
+
"required": false;
|
|
15890
|
+
"isSignal": true;
|
|
15891
|
+
};
|
|
15892
|
+
"terminalProvider": {
|
|
15893
|
+
"alias": "terminalProvider";
|
|
15894
|
+
"required": false;
|
|
15895
|
+
"isSignal": true;
|
|
15896
|
+
};
|
|
15897
|
+
"noReadersText": {
|
|
15898
|
+
"alias": "noReadersText";
|
|
15899
|
+
"required": false;
|
|
15900
|
+
"isSignal": true;
|
|
15901
|
+
};
|
|
15902
|
+
"terminalPollMs": {
|
|
15903
|
+
"alias": "terminalPollMs";
|
|
15904
|
+
"required": false;
|
|
15905
|
+
"isSignal": true;
|
|
15906
|
+
};
|
|
15907
|
+
"terminalTimeoutMs": {
|
|
15908
|
+
"alias": "terminalTimeoutMs";
|
|
15909
|
+
"required": false;
|
|
15910
|
+
"isSignal": true;
|
|
15911
|
+
};
|
|
15912
|
+
"readerRefreshMs": {
|
|
15913
|
+
"alias": "readerRefreshMs";
|
|
15914
|
+
"required": false;
|
|
15915
|
+
"isSignal": true;
|
|
15916
|
+
};
|
|
15917
|
+
"terminalSuccessDelayMs": {
|
|
15918
|
+
"alias": "terminalSuccessDelayMs";
|
|
15919
|
+
"required": false;
|
|
15920
|
+
"isSignal": true;
|
|
15921
|
+
};
|
|
15922
|
+
}, {
|
|
15923
|
+
"closed": "closed";
|
|
15924
|
+
"recorded": "recorded";
|
|
15925
|
+
"outcome": "outcome";
|
|
15926
|
+
}, ["plugins"], never, true, never>;
|
|
15927
|
+
}
|
|
15928
|
+
export type { AllocationModeOption, CalendarAgendaGroup, CalendarDay, CalendarDayLevel, CalendarRange, CalendarViewMode, ChargeAllocation, HostResult, PayableCharge, PaymentAllocation, PaymentEntry, PaymentMethodOption, PaymentPanelOutcome, RecordPaymentFn, RecordPaymentPayload, RecordPaymentResult, SavedPaymentMethod, TerminalConfirmContext, TerminalPhase, TerminalReader, TerminalStartContext, TerminalStartResult, TerminalStatusResult };
|