@forgeroute/ui 0.4.40 → 0.4.42
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 +686 -35
- package/fesm2022/forgeroute-ui-messaging.mjs.map +1 -1
- package/fesm2022/forgeroute-ui-stripe.mjs +566 -190
- package/fesm2022/forgeroute-ui-stripe.mjs.map +1 -1
- package/fesm2022/forgeroute-ui.mjs +313 -35
- package/fesm2022/forgeroute-ui.mjs.map +1 -1
- package/package.json +1 -1
- package/types/forgeroute-ui-messaging.d.ts +166 -1
- package/types/forgeroute-ui-stripe.d.ts +212 -64
- package/types/forgeroute-ui.d.ts +134 -18
package/types/forgeroute-ui.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
2
|
import { EnvironmentProviders, InjectionToken, OnDestroy, OnInit, Signal, TemplateRef, WritableSignal } from "@angular/core";
|
|
3
3
|
import { UrlTree } from "@angular/router";
|
|
4
|
-
import { AbstractControl, ControlValueAccessor, FormControl, ValidationErrors, Validator } from "@angular/forms";
|
|
5
4
|
import { Observable } from "rxjs";
|
|
5
|
+
import { AbstractControl, ControlValueAccessor, FormControl, ValidationErrors, Validator } from "@angular/forms";
|
|
6
6
|
import { HttpInterceptorFn } from "@angular/common/http";
|
|
7
7
|
import { SafeHtml } from "@angular/platform-browser";
|
|
8
8
|
export interface ForgerouteConfig {
|
|
@@ -1088,7 +1088,7 @@ export declare class SelectComponent implements ControlValueAccessor, Validator,
|
|
|
1088
1088
|
readonly error: import("@angular/core").InputSignal<string>;
|
|
1089
1089
|
/** Reveal the built-in error messages now (e.g. after a failed Save click), without waiting for blur. */
|
|
1090
1090
|
readonly showErrors: import("@angular/core").InputSignal<boolean>;
|
|
1091
|
-
readonly size: import("@angular/core").InputSignal<"
|
|
1091
|
+
readonly size: import("@angular/core").InputSignal<"sm" | "default">;
|
|
1092
1092
|
readonly _disabledInput: import("@angular/core").InputSignal<boolean>;
|
|
1093
1093
|
private readonly _cvaDisabled;
|
|
1094
1094
|
protected readonly disabled: import("@angular/core").Signal<boolean>;
|
|
@@ -1222,6 +1222,8 @@ export interface ImportExportConfig {
|
|
|
1222
1222
|
importFields?: ImportFieldDef[];
|
|
1223
1223
|
columnAliases?: Record<string, string[]>;
|
|
1224
1224
|
templateSampleRows?: string[][];
|
|
1225
|
+
/** Text of the template download button inside the import window, e.g. "Download Cases CSV Template" (default: "Download template"). */
|
|
1226
|
+
templateLabel?: string;
|
|
1225
1227
|
/** When true, the Export button appears in the More Actions dropdown instead of as a standalone button. */
|
|
1226
1228
|
exportInMoreActions?: boolean;
|
|
1227
1229
|
}
|
|
@@ -1229,12 +1231,37 @@ interface ImportError {
|
|
|
1229
1231
|
row: number;
|
|
1230
1232
|
message: string;
|
|
1231
1233
|
}
|
|
1234
|
+
export interface ImportSubmitRequest {
|
|
1235
|
+
file: File | null;
|
|
1236
|
+
records: Record<string, string>[];
|
|
1237
|
+
mapping: Record<string, string>;
|
|
1238
|
+
}
|
|
1239
|
+
export interface ImportSubmitResult {
|
|
1240
|
+
imported: number;
|
|
1241
|
+
errors?: {
|
|
1242
|
+
row: number;
|
|
1243
|
+
message: string;
|
|
1244
|
+
}[];
|
|
1245
|
+
warnings?: {
|
|
1246
|
+
row: number;
|
|
1247
|
+
message: string;
|
|
1248
|
+
}[];
|
|
1249
|
+
}
|
|
1232
1250
|
type ImportStep = 'source' | 'upload' | 'mapping' | 'preview' | 'result';
|
|
1233
1251
|
export declare class ImportExportComponent {
|
|
1234
1252
|
readonly _configInput: import("@angular/core").InputSignal<ImportExportConfig | null>;
|
|
1235
1253
|
readonly importSources: import("@angular/core").InputSignal<ImportSource[] | undefined>;
|
|
1236
1254
|
readonly exportParams: import("@angular/core").InputSignal<Record<string, string>>;
|
|
1237
1255
|
readonly exportOnly: import("@angular/core").InputSignal<boolean>;
|
|
1256
|
+
/** The window's footer has one Close button that closes it at once, never Back / Cancel (the setup wizard). */
|
|
1257
|
+
readonly closeOnly: import("@angular/core").InputSignal<boolean>;
|
|
1258
|
+
/**
|
|
1259
|
+
* Replaces the built-in `POST importEndpoint { records }` for an app whose import runs differently (e.g. the server reads the CSV file itself):
|
|
1260
|
+
* receives the chosen file, the parsed rows (field key -> value) and the mapping (field key -> CSV column) and answers the result.
|
|
1261
|
+
*/
|
|
1262
|
+
readonly submit: import("@angular/core").InputSignal<((request: ImportSubmitRequest) => Observable<ImportSubmitResult>) | null>;
|
|
1263
|
+
/** Fired when the user presses Done after an import, with what the import answered (also `imported`). */
|
|
1264
|
+
readonly finished: import("@angular/core").OutputEmitterRef<ImportSubmitResult>;
|
|
1238
1265
|
readonly imported: import("@angular/core").OutputEmitterRef<void>;
|
|
1239
1266
|
config: ImportExportConfig;
|
|
1240
1267
|
private readonly http;
|
|
@@ -1273,6 +1300,7 @@ export declare class ImportExportComponent {
|
|
|
1273
1300
|
closeImport(): void;
|
|
1274
1301
|
finishImport(): void;
|
|
1275
1302
|
onFileChange(event: Event): void;
|
|
1303
|
+
private csvFile;
|
|
1276
1304
|
private readCsvFile;
|
|
1277
1305
|
private autoMap;
|
|
1278
1306
|
get canSubmit(): boolean;
|
|
@@ -1308,7 +1336,18 @@ export declare class ImportExportComponent {
|
|
|
1308
1336
|
"required": false;
|
|
1309
1337
|
"isSignal": true;
|
|
1310
1338
|
};
|
|
1339
|
+
"closeOnly": {
|
|
1340
|
+
"alias": "closeOnly";
|
|
1341
|
+
"required": false;
|
|
1342
|
+
"isSignal": true;
|
|
1343
|
+
};
|
|
1344
|
+
"submit": {
|
|
1345
|
+
"alias": "submit";
|
|
1346
|
+
"required": false;
|
|
1347
|
+
"isSignal": true;
|
|
1348
|
+
};
|
|
1311
1349
|
}, {
|
|
1350
|
+
"finished": "finished";
|
|
1312
1351
|
"imported": "imported";
|
|
1313
1352
|
}, never, never, true, never>;
|
|
1314
1353
|
}
|
|
@@ -2167,7 +2206,7 @@ export declare class ModalComponent implements OnInit, OnDestroy {
|
|
|
2167
2206
|
readonly title: import("@angular/core").InputSignal<string>;
|
|
2168
2207
|
readonly description: import("@angular/core").InputSignal<string>;
|
|
2169
2208
|
readonly maxWidth: import("@angular/core").InputSignal<string>;
|
|
2170
|
-
readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "
|
|
2209
|
+
readonly bodyOverflow: import("@angular/core").InputSignal<"hidden" | "visible" | "auto">;
|
|
2171
2210
|
/** `data-testid` of the dialog element itself (the host `<ui-modal>` is always in the page, the dialog only while open). None when empty. */
|
|
2172
2211
|
readonly dialogTestId: import("@angular/core").InputSignal<string>;
|
|
2173
2212
|
/** Hides the header X button (e.g. while a request is running). Escape and a backdrop click still close unless `closable` is false. */
|
|
@@ -2551,7 +2590,7 @@ export declare class AudioPlayerComponent {
|
|
|
2551
2590
|
/** Accessible name of the player. */
|
|
2552
2591
|
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
2553
2592
|
/** How much to load before play: 'metadata' (default), 'auto' or 'none'. */
|
|
2554
|
-
readonly preload: import("@angular/core").InputSignal<"none" | "
|
|
2593
|
+
readonly preload: import("@angular/core").InputSignal<"none" | "metadata" | "auto">;
|
|
2555
2594
|
/** Fires when the browser can't load or decode the source. */
|
|
2556
2595
|
readonly playbackError: import("@angular/core").OutputEmitterRef<void>;
|
|
2557
2596
|
protected readonly failed: import("@angular/core").WritableSignal<boolean>;
|
|
@@ -2805,7 +2844,7 @@ export declare class CheckboxComponent implements ControlValueAccessor, Validato
|
|
|
2805
2844
|
* 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.
|
|
2806
2845
|
* Default null: plain label text, exactly as before. Single mode only.
|
|
2807
2846
|
*/
|
|
2808
|
-
readonly headingLevel: import("@angular/core").InputSignal<1 |
|
|
2847
|
+
readonly headingLevel: import("@angular/core").InputSignal<2 | 1 | 5 | 3 | 4 | 6 | null>;
|
|
2809
2848
|
readonly indeterminate: import("@angular/core").InputSignal<boolean>;
|
|
2810
2849
|
readonly checked: import("@angular/core").ModelSignal<boolean>;
|
|
2811
2850
|
/**
|
|
@@ -3716,7 +3755,7 @@ export declare class PhoneNumberPickerComponent {
|
|
|
3716
3755
|
protected readonly modeCtl: FormControl<string>;
|
|
3717
3756
|
protected readonly zipCtl: FormControl<string>;
|
|
3718
3757
|
protected readonly areaCtl: FormControl<string>;
|
|
3719
|
-
protected readonly step: import("@angular/core").WritableSignal<
|
|
3758
|
+
protected readonly step: import("@angular/core").WritableSignal<2 | 1 | 3>;
|
|
3720
3759
|
protected readonly mode: import("@angular/core").WritableSignal<PhoneNumberSearchMode>;
|
|
3721
3760
|
private readonly _zip;
|
|
3722
3761
|
private readonly _area;
|
|
@@ -3830,7 +3869,7 @@ export declare class ButtonComponent {
|
|
|
3830
3869
|
* `ghost-start`: a ghost button for list / section toggles - a full-width row with its content aligned to the start, transparent
|
|
3831
3870
|
* background, hover tint and the normal focus ring. Pair it with `ariaExpanded` / `ariaPressed`; the label may contain a heading element.
|
|
3832
3871
|
*/
|
|
3833
|
-
readonly variant: import("@angular/core").InputSignal<"
|
|
3872
|
+
readonly variant: import("@angular/core").InputSignal<"link" | "primary" | "secondary" | "danger" | "warning" | "ghost" | "ghost-start" | "tab" | "icon" | "icon-danger">;
|
|
3834
3873
|
/** 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`). */
|
|
3835
3874
|
readonly routerLink: import("@angular/core").InputSignal<string | readonly unknown[] | null>;
|
|
3836
3875
|
/** Query params of the `routerLink` (e.g. `{ section: 'deal-defaults' }`). */
|
|
@@ -3851,7 +3890,7 @@ export declare class ButtonComponent {
|
|
|
3851
3890
|
*/
|
|
3852
3891
|
readonly href: import("@angular/core").InputSignal<string | null>;
|
|
3853
3892
|
/** Where to open the `href` (`_blank` = a new tab). */
|
|
3854
|
-
readonly target: import("@angular/core").InputSignal<"
|
|
3893
|
+
readonly target: import("@angular/core").InputSignal<"_blank" | "_self" | "_parent" | "_top" | null>;
|
|
3855
3894
|
/** `rel` of the `href` link. A `_blank` target always gets `noopener noreferrer` added. */
|
|
3856
3895
|
readonly rel: import("@angular/core").InputSignal<string | null>;
|
|
3857
3896
|
/** The href when it is allowed (http, https, mailto, tel, sms or a relative URL), else null. */
|
|
@@ -3876,7 +3915,7 @@ export declare class ButtonComponent {
|
|
|
3876
3915
|
readonly color: import("@angular/core").InputSignal<string | undefined>;
|
|
3877
3916
|
readonly active: import("@angular/core").InputSignal<boolean>;
|
|
3878
3917
|
readonly size: import("@angular/core").InputSignal<"sm" | "md" | "lg" | "xs">;
|
|
3879
|
-
readonly type: import("@angular/core").InputSignal<"
|
|
3918
|
+
readonly type: import("@angular/core").InputSignal<"button" | "reset" | "submit">;
|
|
3880
3919
|
readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
3881
3920
|
readonly loading: import("@angular/core").InputSignal<boolean>;
|
|
3882
3921
|
readonly fullWidth: import("@angular/core").InputSignal<boolean>;
|
|
@@ -4363,7 +4402,7 @@ export declare class ImportSourceGridComponent {
|
|
|
4363
4402
|
/** The `value` of the picked source (highlighted). `tile` only: the `card` appearance does not keep a selection. */
|
|
4364
4403
|
readonly selected: import("@angular/core").InputSignal<string>;
|
|
4365
4404
|
/** `tile`: the compact buttons of the import window. `card`: one `ui-detail-card` per source with its own select button (used on a page). */
|
|
4366
|
-
readonly appearance: import("@angular/core").InputSignal<"
|
|
4405
|
+
readonly appearance: import("@angular/core").InputSignal<"tile" | "card">;
|
|
4367
4406
|
/** `card`: disables every card's button (for example while the page is saving). */
|
|
4368
4407
|
readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
4369
4408
|
/** `card`: the text of each card's button. */
|
|
@@ -4672,7 +4711,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
4672
4711
|
readonly passwordRequirements: import("@angular/core").InputSignal<boolean>;
|
|
4673
4712
|
/** Rules for `passwordRequirements`; default = the library's five rules (8+ characters, upper, lower, digit, special). */
|
|
4674
4713
|
readonly passwordRules: import("@angular/core").InputSignal<readonly PasswordRule[] | undefined>;
|
|
4675
|
-
readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "
|
|
4714
|
+
readonly type: import("@angular/core").InputSignal<"number" | "text" | "email" | "password" | "tel" | "url">;
|
|
4676
4715
|
readonly maxlength: import("@angular/core").InputSignal<number | undefined>;
|
|
4677
4716
|
readonly required: import("@angular/core").InputSignal<boolean>;
|
|
4678
4717
|
readonly autocomplete: import("@angular/core").InputSignal<string>;
|
|
@@ -4745,7 +4784,7 @@ export declare class TextInputComponent implements ControlValueAccessor, Validat
|
|
|
4745
4784
|
protected readonly _stepAttr: import("@angular/core").Signal<string | null>;
|
|
4746
4785
|
protected readonly _revealable: import("@angular/core").Signal<boolean>;
|
|
4747
4786
|
protected readonly _shown: import("@angular/core").WritableSignal<boolean>;
|
|
4748
|
-
protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "
|
|
4787
|
+
protected readonly _inputType: import("@angular/core").Signal<"number" | "text" | "email" | "password" | "tel" | "url">;
|
|
4749
4788
|
protected readonly _eyePath: string;
|
|
4750
4789
|
protected readonly _eyeOffPath: string;
|
|
4751
4790
|
protected readonly _showRequirements: import("@angular/core").Signal<boolean>;
|
|
@@ -6296,7 +6335,7 @@ export declare class FormSectionComponent {
|
|
|
6296
6335
|
}, {}, never, ["*"], true, never>;
|
|
6297
6336
|
}
|
|
6298
6337
|
export declare class FormRowComponent {
|
|
6299
|
-
readonly cols: import("@angular/core").InputSignal<
|
|
6338
|
+
readonly cols: import("@angular/core").InputSignal<2 | 1 | 3 | 4>;
|
|
6300
6339
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormRowComponent, never>;
|
|
6301
6340
|
static ɵcmp: i0.ɵɵComponentDeclaration<FormRowComponent, "ui-form-row", never, {
|
|
6302
6341
|
"cols": {
|
|
@@ -6313,7 +6352,7 @@ export declare class FormRowComponent {
|
|
|
6313
6352
|
* child simply takes the full width. Keep a numeric span within the row's `cols` (use `all` for the whole row).
|
|
6314
6353
|
*/
|
|
6315
6354
|
export declare class FormColSpanDirective {
|
|
6316
|
-
readonly uiColSpan: import("@angular/core").InputSignal<"" | "2" | "3" |
|
|
6355
|
+
readonly uiColSpan: import("@angular/core").InputSignal<"" | 2 | "2" | "3" | 3 | "all">;
|
|
6317
6356
|
protected readonly _class: import("@angular/core").Signal<string>;
|
|
6318
6357
|
static ɵfac: i0.ɵɵFactoryDeclaration<FormColSpanDirective, never>;
|
|
6319
6358
|
static ɵdir: i0.ɵɵDirectiveDeclaration<FormColSpanDirective, "[uiColSpan]", never, {
|
|
@@ -7599,6 +7638,8 @@ export declare class AlertComponent {
|
|
|
7599
7638
|
* Default false: the body is a flex row with a gap, exactly as before (use it for text plus a button).
|
|
7600
7639
|
*/
|
|
7601
7640
|
readonly inline: import("@angular/core").InputSignal<boolean>;
|
|
7641
|
+
/** The box fills the height of its parent cell (two alerts in one grid row get the same height whatever their text length). Default false. */
|
|
7642
|
+
readonly fill: import("@angular/core").InputSignal<boolean>;
|
|
7602
7643
|
readonly dismissed: import("@angular/core").OutputEmitterRef<void>;
|
|
7603
7644
|
static ɵfac: i0.ɵɵFactoryDeclaration<AlertComponent, never>;
|
|
7604
7645
|
static ɵcmp: i0.ɵɵComponentDeclaration<AlertComponent, "ui-alert", never, {
|
|
@@ -7637,6 +7678,11 @@ export declare class AlertComponent {
|
|
|
7637
7678
|
"required": false;
|
|
7638
7679
|
"isSignal": true;
|
|
7639
7680
|
};
|
|
7681
|
+
"fill": {
|
|
7682
|
+
"alias": "fill";
|
|
7683
|
+
"required": false;
|
|
7684
|
+
"isSignal": true;
|
|
7685
|
+
};
|
|
7640
7686
|
}, {
|
|
7641
7687
|
"dismissed": "dismissed";
|
|
7642
7688
|
}, never, ["*"], true, never>;
|
|
@@ -9247,7 +9293,7 @@ export declare class DetailCardComponent {
|
|
|
9247
9293
|
/** true (default) = the title is displayed in capitals (CSS only); false = shown as written. The text, aria-label and heading name are never changed. */
|
|
9248
9294
|
readonly uppercaseTitle: import("@angular/core").InputSignal<boolean>;
|
|
9249
9295
|
/** 1-6 makes the title a real heading for screen readers (role=heading, aria-level); null keeps it plain text. */
|
|
9250
|
-
readonly headingLevel: import("@angular/core").InputSignal<1 |
|
|
9296
|
+
readonly headingLevel: import("@angular/core").InputSignal<2 | 1 | 5 | 3 | 4 | 6 | null>;
|
|
9251
9297
|
/** Optional id for the title text; the card is then labelled by it. Without it the title is the card's aria-label. */
|
|
9252
9298
|
readonly titleId: import("@angular/core").InputSignal<string>;
|
|
9253
9299
|
/** Accessible name of the card when the header gives none (no header, or no title). A visible title wins; blank = no name. */
|
|
@@ -9466,6 +9512,55 @@ export declare class DividerComponent {
|
|
|
9466
9512
|
};
|
|
9467
9513
|
}, {}, never, never, true, never>;
|
|
9468
9514
|
}
|
|
9515
|
+
export type FixedFooterAlign = 'start' | 'center' | 'end' | 'between';
|
|
9516
|
+
/**
|
|
9517
|
+
* A footer bar fixed to the bottom of the page: it stays visible while the page scrolls, sits flush with the bottom of the viewport
|
|
9518
|
+
* and spans the full width of the content area (from the side nav to the end of the screen). Put it as the LAST child of the page:
|
|
9519
|
+
*
|
|
9520
|
+
* <div class="settings-page">
|
|
9521
|
+
* ...the page content...
|
|
9522
|
+
* <ui-fixed-footer>
|
|
9523
|
+
* <ui-button variant="primary" (click)="save()">Save All Settings</ui-button>
|
|
9524
|
+
* </ui-fixed-footer>
|
|
9525
|
+
* </div>
|
|
9526
|
+
*
|
|
9527
|
+
* How it works: the bar is `position: sticky` at the bottom of the scrolling page. Inside `ui-app-shell` the content area is padded
|
|
9528
|
+
* (24px / 16px / 12px by width) and the shell publishes that padding as `--shell-content-padding`; the footer cancels it with negative
|
|
9529
|
+
* margins and a negative `bottom`, so it reaches the viewport edges instead of stopping inside the padding. Outside the shell the
|
|
9530
|
+
* variable is unset (0px) and the bar simply sticks to the bottom of its scrolling parent. Nothing else needs to be set up.
|
|
9531
|
+
*
|
|
9532
|
+
* Inputs:
|
|
9533
|
+
* - `align` (default `end`): where the projected content sits: start | center | end | between.
|
|
9534
|
+
* - `ariaLabel` (default `Page actions`): the accessible name of the bar (a labelled region).
|
|
9535
|
+
* - `elevated` (default true): the soft shadow above the bar; false = just the top border.
|
|
9536
|
+
* Theming by CSS custom properties: `--ui-footer-bg` (white), `--ui-footer-border` (#e2e8f0), `--ui-footer-pad-y` (20px; 16px up to 1024px, 14px up to 480px).
|
|
9537
|
+
*/
|
|
9538
|
+
export declare class FixedFooterComponent {
|
|
9539
|
+
/** Where the projected content sits in the bar. */
|
|
9540
|
+
readonly align: import("@angular/core").InputSignal<FixedFooterAlign>;
|
|
9541
|
+
/** Accessible name of the bar. */
|
|
9542
|
+
readonly ariaLabel: import("@angular/core").InputSignal<string>;
|
|
9543
|
+
/** The soft shadow above the bar (false = only the top border). */
|
|
9544
|
+
readonly elevated: import("@angular/core").InputSignal<boolean>;
|
|
9545
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<FixedFooterComponent, never>;
|
|
9546
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<FixedFooterComponent, "ui-fixed-footer", never, {
|
|
9547
|
+
"align": {
|
|
9548
|
+
"alias": "align";
|
|
9549
|
+
"required": false;
|
|
9550
|
+
"isSignal": true;
|
|
9551
|
+
};
|
|
9552
|
+
"ariaLabel": {
|
|
9553
|
+
"alias": "ariaLabel";
|
|
9554
|
+
"required": false;
|
|
9555
|
+
"isSignal": true;
|
|
9556
|
+
};
|
|
9557
|
+
"elevated": {
|
|
9558
|
+
"alias": "elevated";
|
|
9559
|
+
"required": false;
|
|
9560
|
+
"isSignal": true;
|
|
9561
|
+
};
|
|
9562
|
+
}, {}, never, ["*"], true, never>;
|
|
9563
|
+
}
|
|
9469
9564
|
/** One column (stage) of a [ui-board]. `items` are the host's own records; the board never reads their fields. */
|
|
9470
9565
|
export interface BoardColumn<T = unknown> {
|
|
9471
9566
|
/** Unique id of the column (the stage key); reported in `from` / `to` of a move. */
|
|
@@ -11313,12 +11408,13 @@ export interface IntegrationPlainText {
|
|
|
11313
11408
|
export declare function integrationPlainText(html: string): IntegrationPlainText;
|
|
11314
11409
|
/**
|
|
11315
11410
|
* How a connect button for an integration works.
|
|
11316
|
-
* - `oauth`: GET `authorizeEndpoint` answers `{ url }` (or `{ authUrl }`) and the browser goes there (QuickBooks, Slack, Gmail, Outlook, Google / Outlook calendar, Stripe, Square).
|
|
11411
|
+
* - `oauth`: GET `authorizeEndpoint` answers `{ url }` (or `{ authUrl }`) and the browser goes there (in a NEW tab with `newTab: true`, opened inside the click so popup blockers allow it, else in this tab) (QuickBooks, Slack, Gmail, Outlook, Google / Outlook calendar, Stripe, Square).
|
|
11317
11412
|
* - `area-code`: asks for a US area code and POSTs `{ areaCode }` to `connectEndpoint` (Twilio buys a number that way); the status is reloaded after.
|
|
11318
11413
|
*/
|
|
11319
11414
|
export type SetupIntegrationConnect = {
|
|
11320
11415
|
type: 'oauth';
|
|
11321
11416
|
authorizeEndpoint: string;
|
|
11417
|
+
newTab?: boolean;
|
|
11322
11418
|
} | {
|
|
11323
11419
|
type: 'area-code';
|
|
11324
11420
|
connectEndpoint: string;
|
|
@@ -11394,6 +11490,8 @@ export interface SetupImportStep {
|
|
|
11394
11490
|
buttonLabel: string;
|
|
11395
11491
|
/** Hint above the button. */
|
|
11396
11492
|
hint?: string;
|
|
11493
|
+
/** Runs the import instead of `config.importEndpoint` (see `ImportExportComponent.submit`), e.g. when the server reads the CSV file itself. */
|
|
11494
|
+
submit?: (request: ImportSubmitRequest) => Observable<ImportSubmitResult>;
|
|
11397
11495
|
/** Result alert title, built from the number imported (default `${n} ${config.entityNamePlural.toLowerCase()} imported successfully.`). */
|
|
11398
11496
|
resultTitle?: (imported: number) => string;
|
|
11399
11497
|
/** Result alert body. */
|
|
@@ -11550,7 +11648,7 @@ export declare class SetupWizardComponent {
|
|
|
11550
11648
|
/** An import step with `requireImport` keeps Continue off until something came in (a CSV import or `markCompleted`, e.g. a live sync). */
|
|
11551
11649
|
protected readonly importBlocked: import("@angular/core").Signal<boolean>;
|
|
11552
11650
|
/** 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). */
|
|
11553
|
-
protected readonly splitTab: import("@angular/core").WritableSignal<"
|
|
11651
|
+
protected readonly splitTab: import("@angular/core").WritableSignal<"extra" | "main">;
|
|
11554
11652
|
protected readonly splitTabs: import("@angular/core").Signal<{
|
|
11555
11653
|
key: string;
|
|
11556
11654
|
label: string;
|
|
@@ -11560,6 +11658,8 @@ export declare class SetupWizardComponent {
|
|
|
11560
11658
|
readonly steps: import("@angular/core").InputSignal<SetupStep[]>;
|
|
11561
11659
|
/** Replaces any of the built-in texts. */
|
|
11562
11660
|
readonly texts: import("@angular/core").InputSignal<Partial<SetupWizardTexts>>;
|
|
11661
|
+
/** The key of the step to open first (for example the one a payment provider's return address names); default (empty or unknown) = the first step. Read once, when the wizard starts. */
|
|
11662
|
+
readonly initialStep: import("@angular/core").InputSignal<string>;
|
|
11563
11663
|
/** The last step's button ("Go to Dashboard"). */
|
|
11564
11664
|
readonly finished: import("@angular/core").OutputEmitterRef<void>;
|
|
11565
11665
|
/** "Exit Setup". */
|
|
@@ -11579,6 +11679,12 @@ export declare class SetupWizardComponent {
|
|
|
11579
11679
|
private readonly importErrors;
|
|
11580
11680
|
private readonly statuses;
|
|
11581
11681
|
readonly busy: import("@angular/core").WritableSignal<boolean>;
|
|
11682
|
+
/** Key of the integration whose authorization address is being requested: only that card's button shows a loader (the footer's Save & Continue is not busy), and no second press starts a second connection. */
|
|
11683
|
+
protected readonly connecting: import("@angular/core").WritableSignal<string>;
|
|
11684
|
+
/** The blank tab opened on the Connect click (the click is the user gesture; the address arrives later), or null when none was opened / the browser blocked it. */
|
|
11685
|
+
private pendingTab;
|
|
11686
|
+
/** A provider's page was opened in another tab: when this tab becomes visible again the step's statuses are read again. */
|
|
11687
|
+
private connectTabOpened;
|
|
11582
11688
|
/** What a custom step's template receives (`let-wizard`). */
|
|
11583
11689
|
protected readonly api: SetupWizardApi;
|
|
11584
11690
|
protected readonly error: import("@angular/core").WritableSignal<string>;
|
|
@@ -11638,13 +11744,18 @@ export declare class SetupWizardComponent {
|
|
|
11638
11744
|
protected isConnected(i: SetupIntegration): boolean;
|
|
11639
11745
|
protected detailFor(i: SetupIntegration): string;
|
|
11640
11746
|
protected connect(i: SetupIntegration): void;
|
|
11747
|
+
/** Opens an empty tab for the provider's page (null when the browser refuses; the address then opens in this tab). */
|
|
11748
|
+
protected openTab(): Window | null;
|
|
11749
|
+
private closePendingTab;
|
|
11641
11750
|
private startConnect;
|
|
11642
11751
|
private isWebAddress;
|
|
11643
11752
|
/** SVG path of a library icon (the buttons' leading / trailing glyph). */
|
|
11644
11753
|
protected iconD(name: string): string;
|
|
11645
11754
|
protected areaCodeLabelFor(i: SetupIntegration): string;
|
|
11646
|
-
/**
|
|
11755
|
+
/** Opens the provider's authorization page: in the tab opened on the click, else (a blocked tab) in this one. */
|
|
11647
11756
|
protected redirect(url: string): void;
|
|
11757
|
+
/** Sends THIS tab to the address (no new tab was opened, the browser refused it or the user closed it). */
|
|
11758
|
+
protected navigateHere(url: string): void;
|
|
11648
11759
|
protected submitAreaCode(i: SetupIntegration): void;
|
|
11649
11760
|
static ɵfac: i0.ɵɵFactoryDeclaration<SetupWizardComponent, never>;
|
|
11650
11761
|
static ɵcmp: i0.ɵɵComponentDeclaration<SetupWizardComponent, "ui-setup-wizard", never, {
|
|
@@ -11658,6 +11769,11 @@ export declare class SetupWizardComponent {
|
|
|
11658
11769
|
"required": false;
|
|
11659
11770
|
"isSignal": true;
|
|
11660
11771
|
};
|
|
11772
|
+
"initialStep": {
|
|
11773
|
+
"alias": "initialStep";
|
|
11774
|
+
"required": false;
|
|
11775
|
+
"isSignal": true;
|
|
11776
|
+
};
|
|
11661
11777
|
}, {
|
|
11662
11778
|
"finished": "finished";
|
|
11663
11779
|
"exited": "exited";
|