@ng-forge/dynamic-forms 1.3.0-next.2 → 1.3.0-next.3
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/ng-forge-dynamic-forms-active-page-initialized.event-CiKN-mcc.mjs +12 -0
- package/fesm2022/ng-forge-dynamic-forms-active-page-initialized.event-CiKN-mcc.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-Dv9mPnJ3.mjs +770 -0
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-Dv9mPnJ3.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-array-item-registry.service-D-AxVLdk.mjs +83 -0
- package/fesm2022/ng-forge-dynamic-forms-array-item-registry.service-D-AxVLdk.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-EuYCbquo.mjs +1887 -0
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-EuYCbquo.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-2wQK_wPp.mjs +954 -0
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-2wQK_wPp.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-container-field-processors-C_JRvaVt.mjs +117 -0
- package/fesm2022/ng-forge-dynamic-forms-container-field-processors-C_JRvaVt.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs +228 -0
- package/fesm2022/ng-forge-dynamic-forms-container-field.component-Bg7Win9n.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs +102 -0
- package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-R2yc-H0T.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs +4 -0
- package/fesm2022/{ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs.map → ng-forge-dynamic-forms-debounce-CG3uP5B-.mjs.map} +1 -1
- package/fesm2022/ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs +77 -0
- package/fesm2022/ng-forge-dynamic-forms-default-value-D5M4MNE-.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs +4 -0
- package/fesm2022/ng-forge-dynamic-forms-dev-mode-4rbYBBo_.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-df-field-outlet.directive-CQsDMV-s.mjs +644 -0
- package/fesm2022/ng-forge-dynamic-forms-df-field-outlet.directive-CQsDMV-s.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-DKgkpIpG.mjs +56 -0
- package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-DKgkpIpG.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dd-gHJ_7.mjs +38 -0
- package/fesm2022/{ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs.map → ng-forge-dynamic-forms-form-schema.service-Dd-gHJ_7.mjs.map} +1 -1
- package/fesm2022/ng-forge-dynamic-forms-form-state-manager-DcOXRFRL.mjs +1522 -0
- package/fesm2022/ng-forge-dynamic-forms-form-state-manager-DcOXRFRL.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-BjZi0bhq.mjs +292 -0
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-BjZi0bhq.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-integration.mjs +1318 -843
- package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-internal.mjs +3326 -3641
- package/fesm2022/ng-forge-dynamic-forms-internal.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-BRjQmWC9.mjs +295 -0
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-BRjQmWC9.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs +329 -0
- package/fesm2022/ng-forge-dynamic-forms-resolve-field-ByGa5cpo.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs +81 -0
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-CuFycQb-.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-schema-builder-C62afItJ.mjs +400 -0
- package/fesm2022/ng-forge-dynamic-forms-schema-builder-C62afItJ.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-schema-registry.service-axBV9FBH.mjs +45 -0
- package/fesm2022/ng-forge-dynamic-forms-schema-registry.service-axBV9FBH.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-schema.mjs +8 -14
- package/fesm2022/ng-forge-dynamic-forms-schema.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-testing.mjs +68 -73
- package/fesm2022/ng-forge-dynamic-forms-testing.mjs.map +1 -1
- package/fesm2022/ng-forge-dynamic-forms-text-field.component--MAh_h4Q.mjs +257 -0
- package/fesm2022/ng-forge-dynamic-forms-text-field.component--MAh_h4Q.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-validation-execution.token-BFyySKtp.mjs +8 -0
- package/fesm2022/ng-forge-dynamic-forms-validation-execution.token-BFyySKtp.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-with-logger-config-BAATqYY0.mjs +94 -0
- package/fesm2022/ng-forge-dynamic-forms-with-logger-config-BAATqYY0.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms-wrapper-chain-BnntfNU1.mjs +115 -0
- package/fesm2022/ng-forge-dynamic-forms-wrapper-chain-BnntfNU1.mjs.map +1 -0
- package/fesm2022/ng-forge-dynamic-forms.mjs +2136 -3
- package/fesm2022/ng-forge-dynamic-forms.mjs.map +1 -1
- package/package.json +1 -1
- package/types/ng-forge-dynamic-forms-integration.d.ts +543 -415
- package/types/ng-forge-dynamic-forms-internal.d.ts +2319 -2436
- package/types/ng-forge-dynamic-forms-schema.d.ts +13 -16
- package/types/ng-forge-dynamic-forms-testing.d.ts +34 -37
- package/types/ng-forge-dynamic-forms.d.ts +735 -722
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs +0 -750
- package/fesm2022/ng-forge-dynamic-forms-array-field.component-CSCKq_1K.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs +0 -2394
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-derivation-orchestrator-CTOTwzzw.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs +0 -1054
- package/fesm2022/ng-forge-dynamic-forms-bootstrap-web-mcp-BtjqeJOj.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs +0 -86
- package/fesm2022/ng-forge-dynamic-forms-container-field.component-Dc3ROhHL.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs +0 -33
- package/fesm2022/ng-forge-dynamic-forms-css-wrapper.component-BzgX8lAD.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-debounce-C9F4v1Ke.mjs +0 -17
- package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs +0 -25
- package/fesm2022/ng-forge-dynamic-forms-field-errors-wrapper.component-CIKbWqYA.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-form-schema.service-Dx5Dlb15.mjs +0 -24
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs +0 -177
- package/fesm2022/ng-forge-dynamic-forms-group-field.component-DAC3P9DC.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs +0 -5133
- package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-CXQe_5td.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs +0 -176
- package/fesm2022/ng-forge-dynamic-forms-page-field.component-DPKJcwUO.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs +0 -19
- package/fesm2022/ng-forge-dynamic-forms-row-wrapper.component-DMEeKZny.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs +0 -570
- package/fesm2022/ng-forge-dynamic-forms-schema-builder-BvDTzfdM.mjs.map +0 -1
- package/fesm2022/ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs +0 -126
- package/fesm2022/ng-forge-dynamic-forms-text-field.component-BB-jutBq.mjs.map +0 -1
|
@@ -1,12 +1,9 @@
|
|
|
1
|
-
import { FormEvent, FormEventConstructor, FormSubmitEvent, NextPageEvent, PreviousPageEvent,
|
|
2
|
-
|
|
3
|
-
import
|
|
4
|
-
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
import { FieldTree } from '@angular/forms/signals';
|
|
8
|
-
export { CreateNgForgeActionFixtureOptions, CreateNgForgeFieldFixtureOptions, NgForgeActionFixture, NgForgeFieldFixture, createNgForgeActionFixture, createNgForgeFieldFixture, provideTestValidationMessages } from '@ng-forge/dynamic-forms/testing';
|
|
9
|
-
|
|
1
|
+
import { ArrayItemContext, BUILT_IN_FIELDS, BaseAddon, DynamicValue, FieldWithValidation, FieldWrapper, FormEvent, FormEventConstructor, FormSubmitEvent, InferWrapperRegistry, NextPageEvent, PreviousPageEvent, WrapperRegistration, WrapperTypeDefinition, WrappersBundle, createWrappers, isWrappersBundle, wrapperProps } from "@ng-forge/dynamic-forms";
|
|
2
|
+
import { ADDON_ACTION_REGISTRY, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, ADDON_TYPE_REGISTRY, ARRAY_CONTEXT, AddonActionContext, AddonActionHandler, AddonActionHandler as AddonActionHandler$1, AddonShapeValidator, AddonTypeDefinition, AddonTypeSchema, AnyAddon, ArrayAllowedChildren, ArrayContext, ArrayFieldTree, BaseCheckedField, BaseValueField, CheckedFieldComponent, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DEFAULT_WRAPPERS, DfAddonSlot, DynamicText, DynamicTextPipe, EventBus, FIELD_ERROR_DISPLAY, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FORM_OPTIONS, FieldAddonSupport, FieldAddonSupportEntry, FieldDef, FieldErrorDisplayClaim, FieldErrors, FieldErrorsOptions, FieldErrorsWrapperBase, FieldMeta, FieldOption, FieldScope, FieldSignalContext, FieldStateContext, FieldStateInfo, FieldTypeDefinition, FormFieldStateMap, GROUP_CONTEXT, HttpResourceRequest, INITIALIZATION_TIMEOUT_MS, LogicConfig, MapperFn, NonFieldLogicConfig, NonFieldLogicConfig as NonFieldLogicConfig$1, NonFieldLogicContext, NonFieldLogicType, PresetCollaborators, ReadonlyFieldTree, ResolvedError, ResolvedError as ResolvedError$1, RootFormRegistryService, StateLogicConfig, ValidationMessages, ValueFieldComponent, ValueHandlingMode, WrapperFieldInputs, WrapperFieldInputs as WrapperFieldInputs$1, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, baseFieldMapper, buildBaseInputs, containerFieldMapper, createResolvedErrorsSignal, dynamicTextToObservable, getArrayLength, groupFieldMapper, injectAddonTypeRegistry, injectFieldErrors, injectFieldSignalContext, injectFieldsSupportingAddons, interpolateParams, isCheckedField, isEqual, isValueField, pageFieldMapper, provideFieldErrorDisplay, resolveDynamicValue, resolveNonFieldDisabled, resolveNonFieldHidden, resolveTokens, rowFieldMapper, runPresetAction, shouldShowErrors, textFieldMapper, toReadonlyFieldTree, withPreviousValue, writeToFieldValue } from "@ng-forge/dynamic-forms/internal";
|
|
3
|
+
import * as i0 from "@angular/core";
|
|
4
|
+
import { ElementRef, InjectionToken, Signal } from "@angular/core";
|
|
5
|
+
import { FieldTree } from "@angular/forms/signals";
|
|
6
|
+
import { CreateNgForgeActionFixtureOptions, CreateNgForgeFieldFixtureOptions, NgForgeActionFixture, NgForgeFieldFixture, createNgForgeActionFixture, createNgForgeFieldFixture, provideTestValidationMessages } from "@ng-forge/dynamic-forms/testing";
|
|
10
7
|
/**
|
|
11
8
|
* Event arguments that can contain static values or tokens to be resolved at runtime.
|
|
12
9
|
* Tokens supported: $key, $index, $arrayKey, $template, formValue
|
|
@@ -14,38 +11,35 @@ export { CreateNgForgeActionFixtureOptions, CreateNgForgeFieldFixtureOptions, Ng
|
|
|
14
11
|
type EventArgs = readonly (string | number | boolean | null | undefined)[];
|
|
15
12
|
/** Base interface for button fields. */
|
|
16
13
|
interface ButtonField<TProps, TEvent extends FormEvent> extends FieldDef<TProps> {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
}
|
|
32
|
-
|
|
14
|
+
type: 'button';
|
|
15
|
+
event: FormEventConstructor<TEvent>;
|
|
16
|
+
/**
|
|
17
|
+
* Optional arguments to pass to the event constructor.
|
|
18
|
+
* Can contain special tokens that will be resolved at runtime:
|
|
19
|
+
* - $key: The current field key
|
|
20
|
+
* - $index: The array index (if inside an array field)
|
|
21
|
+
* - $arrayKey: The parent array field key (if inside an array field)
|
|
22
|
+
* - $template: The template for array item creation (for array add buttons)
|
|
23
|
+
* - formValue: Access to the current form value for indexing
|
|
24
|
+
*/
|
|
25
|
+
eventArgs?: EventArgs;
|
|
26
|
+
/** Logic rules for dynamic disabled state (overrides form-level defaults) */
|
|
27
|
+
logic?: StateLogicConfig[];
|
|
28
|
+
}
|
|
33
29
|
interface CheckboxField<TProps, TNullable extends boolean = boolean> extends BaseCheckedField<TProps, FieldMeta, TNullable> {
|
|
34
|
-
|
|
30
|
+
type: 'checkbox';
|
|
35
31
|
}
|
|
36
|
-
|
|
37
32
|
/**
|
|
38
33
|
* Base props for datepicker fields. Intentionally empty — adapter libraries
|
|
39
34
|
* extend this with adapter-specific options (startView, appearance, hint, etc.).
|
|
40
35
|
*/
|
|
41
36
|
type DatepickerProps = object;
|
|
42
37
|
interface DatepickerField<TProps, TNullable extends boolean = boolean> extends BaseValueField<TProps, Date | string, FieldMeta, TNullable> {
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
38
|
+
type: 'datepicker';
|
|
39
|
+
minDate?: Date | string | null;
|
|
40
|
+
maxDate?: Date | string | null;
|
|
41
|
+
startAt?: Date | null;
|
|
47
42
|
}
|
|
48
|
-
|
|
49
43
|
/**
|
|
50
44
|
* Autocomplete values for HTML input elements.
|
|
51
45
|
* Based on the WHATWG HTML specification for autofill.
|
|
@@ -73,26 +67,25 @@ type EnterKeyHint = 'enter' | 'done' | 'go' | 'next' | 'previous' | 'search' | '
|
|
|
73
67
|
type Autocapitalize = 'off' | 'none' | 'on' | 'sentences' | 'words' | 'characters';
|
|
74
68
|
/** Meta attributes specific to HTML input elements. */
|
|
75
69
|
interface InputMeta extends FieldMeta {
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
}
|
|
95
|
-
|
|
70
|
+
/** Hint for form autofill behavior. */
|
|
71
|
+
autocomplete?: AutocompleteValue;
|
|
72
|
+
/** Hint for virtual keyboard type on mobile devices. */
|
|
73
|
+
inputmode?: InputMode;
|
|
74
|
+
/** Hint for the enter key label on virtual keyboards. */
|
|
75
|
+
enterkeyhint?: EnterKeyHint;
|
|
76
|
+
/** Whether to enable spellchecking for the input. */
|
|
77
|
+
spellcheck?: boolean;
|
|
78
|
+
/** Hint for autocapitalization behavior on virtual keyboards. */
|
|
79
|
+
autocapitalize?: Autocapitalize;
|
|
80
|
+
/** Pattern for client-side validation (regex). */
|
|
81
|
+
pattern?: string;
|
|
82
|
+
/** Size hint for the input element (character count). */
|
|
83
|
+
size?: number;
|
|
84
|
+
/** Maximum number of characters allowed. */
|
|
85
|
+
maxlength?: number;
|
|
86
|
+
/** Minimum number of characters required. */
|
|
87
|
+
minlength?: number;
|
|
88
|
+
}
|
|
96
89
|
/**
|
|
97
90
|
* All valid HTML input types per MDN specification.
|
|
98
91
|
*
|
|
@@ -116,12 +109,12 @@ type InferInputValue<T extends HtmlInputType> = T extends 'number' ? number : st
|
|
|
116
109
|
* Generic parameter allows extending InputType with additional HtmlInputType values.
|
|
117
110
|
*/
|
|
118
111
|
interface InputProps<T extends HtmlInputType = InputType> {
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
112
|
+
/**
|
|
113
|
+
* The HTML input type. Determines the value type:
|
|
114
|
+
* - 'number': value will be number
|
|
115
|
+
* - All other types: value will be string
|
|
116
|
+
*/
|
|
117
|
+
type?: T;
|
|
125
118
|
}
|
|
126
119
|
/**
|
|
127
120
|
* Input types that produce numeric values.
|
|
@@ -136,14 +129,14 @@ type StringInputType<T extends HtmlInputType = InputType> = Exclude<T, 'number'>
|
|
|
136
129
|
* Props is REQUIRED and must include type: 'number'.
|
|
137
130
|
*/
|
|
138
131
|
interface NumberInputField<TProps extends {
|
|
139
|
-
|
|
132
|
+
type?: string;
|
|
140
133
|
} = InputProps, TNullable extends boolean = boolean> extends BaseValueField<TProps & {
|
|
141
|
-
|
|
134
|
+
type: 'number';
|
|
142
135
|
}, number, InputMeta, TNullable> {
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
136
|
+
type: 'input';
|
|
137
|
+
props: TProps & {
|
|
138
|
+
type: 'number';
|
|
139
|
+
};
|
|
147
140
|
}
|
|
148
141
|
/**
|
|
149
142
|
* String input field with strict string value type.
|
|
@@ -151,14 +144,14 @@ interface NumberInputField<TProps extends {
|
|
|
151
144
|
* Props type cannot be 'number'.
|
|
152
145
|
*/
|
|
153
146
|
interface StringInputField<TProps extends {
|
|
154
|
-
|
|
147
|
+
type?: string;
|
|
155
148
|
} = InputProps, TNullable extends boolean = boolean> extends BaseValueField<TProps & {
|
|
156
|
-
|
|
149
|
+
type?: Exclude<TProps['type'], 'number'>;
|
|
157
150
|
}, string, InputMeta, TNullable> {
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
151
|
+
type: 'input';
|
|
152
|
+
props?: TProps & {
|
|
153
|
+
type?: Exclude<TProps['type'], 'number'>;
|
|
154
|
+
};
|
|
162
155
|
}
|
|
163
156
|
/**
|
|
164
157
|
* Builds discriminated union where props.type determines value type.
|
|
@@ -166,47 +159,42 @@ interface StringInputField<TProps extends {
|
|
|
166
159
|
* - If props.type is undefined/text/email/etc, only StringInputField matches (value: string)
|
|
167
160
|
*/
|
|
168
161
|
type BuildInputFieldUnion<TProps extends {
|
|
169
|
-
|
|
162
|
+
type?: string;
|
|
170
163
|
}, TNullable extends boolean = boolean> = NumberInputField<TProps, TNullable> | StringInputField<TProps, TNullable>;
|
|
171
164
|
/**
|
|
172
165
|
* Input field with automatic type-safe value inference.
|
|
173
166
|
* TypeScript automatically infers the correct value type based on props.type.
|
|
174
167
|
*/
|
|
175
168
|
type InputField<TProps extends {
|
|
176
|
-
|
|
169
|
+
type?: string;
|
|
177
170
|
} = InputProps, TNullable extends boolean = boolean> = BuildInputFieldUnion<TProps, TNullable>;
|
|
178
|
-
|
|
179
171
|
/**
|
|
180
172
|
* Multi-checkbox field for selecting multiple values from a list of options.
|
|
181
173
|
* The value is an array of selected option values.
|
|
182
174
|
*/
|
|
183
175
|
interface MultiCheckboxField<TValue, TProps = object, TNullable extends boolean = boolean> extends BaseValueField<TProps, TValue[], FieldMeta, TNullable> {
|
|
184
|
-
|
|
185
|
-
|
|
176
|
+
type: 'multi-checkbox';
|
|
177
|
+
readonly options: readonly FieldOption<TValue>[];
|
|
186
178
|
}
|
|
187
|
-
|
|
188
179
|
interface RadioField<T, TProps, TNullable extends boolean = boolean> extends BaseValueField<TProps, T, FieldMeta, TNullable> {
|
|
189
|
-
|
|
190
|
-
|
|
180
|
+
type: 'radio';
|
|
181
|
+
readonly options: readonly FieldOption<T>[];
|
|
191
182
|
}
|
|
192
|
-
|
|
193
183
|
/**
|
|
194
184
|
* Base props for select fields. Intentionally empty — adapter libraries
|
|
195
185
|
* extend this with adapter-specific options (styleClass, size, appearance, etc.).
|
|
196
186
|
*/
|
|
197
187
|
type SelectProps = object;
|
|
198
188
|
interface SelectField<T, TProps = SelectProps, TNullable extends boolean = boolean> extends BaseValueField<TProps, T, FieldMeta, TNullable> {
|
|
199
|
-
|
|
200
|
-
|
|
189
|
+
type: 'select';
|
|
190
|
+
readonly options: readonly FieldOption<T>[];
|
|
201
191
|
}
|
|
202
|
-
|
|
203
192
|
interface SliderField<TProps, TNullable extends boolean = boolean> extends BaseValueField<TProps, number, FieldMeta, TNullable> {
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
193
|
+
type: 'slider';
|
|
194
|
+
minValue?: number;
|
|
195
|
+
maxValue?: number;
|
|
196
|
+
step?: number;
|
|
208
197
|
}
|
|
209
|
-
|
|
210
198
|
/**
|
|
211
199
|
* Text wrapping behavior for textarea elements.
|
|
212
200
|
*
|
|
@@ -215,51 +203,48 @@ interface SliderField<TProps, TNullable extends boolean = boolean> extends BaseV
|
|
|
215
203
|
type TextareaWrap = 'hard' | 'soft' | 'off';
|
|
216
204
|
/** Meta attributes specific to HTML textarea elements. */
|
|
217
205
|
interface TextareaMeta extends FieldMeta {
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
}
|
|
238
|
-
|
|
206
|
+
/**
|
|
207
|
+
* How text should wrap when submitted.
|
|
208
|
+
* - 'hard': Line breaks are inserted to wrap text at cols width
|
|
209
|
+
* - 'soft': Text is wrapped for display but not in submitted value
|
|
210
|
+
* - 'off': No wrapping, horizontal scrolling if needed
|
|
211
|
+
*/
|
|
212
|
+
wrap?: TextareaWrap;
|
|
213
|
+
/** Whether to enable spellchecking for the textarea. */
|
|
214
|
+
spellcheck?: boolean;
|
|
215
|
+
/** Hint for form autofill behavior. */
|
|
216
|
+
autocomplete?: AutocompleteValue;
|
|
217
|
+
/** Hint for autocapitalization behavior on virtual keyboards. */
|
|
218
|
+
autocapitalize?: Autocapitalize;
|
|
219
|
+
/** Hint for the enter key label on virtual keyboards. */
|
|
220
|
+
enterkeyhint?: EnterKeyHint;
|
|
221
|
+
/** Maximum number of characters allowed. */
|
|
222
|
+
maxlength?: number;
|
|
223
|
+
/** Minimum number of characters required. */
|
|
224
|
+
minlength?: number;
|
|
225
|
+
}
|
|
239
226
|
interface TextareaProps {
|
|
240
|
-
|
|
241
|
-
|
|
227
|
+
rows?: number;
|
|
228
|
+
cols?: number | undefined;
|
|
242
229
|
}
|
|
243
230
|
interface TextareaField<TProps = TextareaProps, TNullable extends boolean = boolean> extends BaseValueField<TProps, string, TextareaMeta, TNullable> {
|
|
244
|
-
|
|
245
|
-
|
|
231
|
+
type: 'textarea';
|
|
232
|
+
maxLength?: number | undefined;
|
|
246
233
|
}
|
|
247
|
-
|
|
248
234
|
interface ToggleField<TProps, TNullable extends boolean = boolean> extends BaseCheckedField<TProps, FieldMeta, TNullable> {
|
|
249
|
-
|
|
235
|
+
type: 'toggle';
|
|
250
236
|
}
|
|
251
|
-
|
|
252
237
|
/**
|
|
253
238
|
* Context for value field mapping, containing the injected context reference.
|
|
254
239
|
* Used by specialized mappers to avoid duplicate injection.
|
|
255
240
|
*/
|
|
256
241
|
interface ValueFieldContext {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
242
|
+
/**
|
|
243
|
+
* Gets the field tree for a given key from the form context.
|
|
244
|
+
* This is reactive for array items - the form getter is evaluated each time,
|
|
245
|
+
* allowing the computed to re-run when the root form structure updates.
|
|
246
|
+
*/
|
|
247
|
+
getFieldTree: (fieldKey: string) => FieldTree<unknown> | undefined;
|
|
263
248
|
}
|
|
264
249
|
/**
|
|
265
250
|
* Creates a value field context from the injected FIELD_SIGNAL_CONTEXT.
|
|
@@ -267,7 +252,7 @@ interface ValueFieldContext {
|
|
|
267
252
|
*
|
|
268
253
|
* @returns The value field context with reactive field tree accessor
|
|
269
254
|
*/
|
|
270
|
-
declare function resolveValueFieldContext(): ValueFieldContext;
|
|
255
|
+
export declare function resolveValueFieldContext(): ValueFieldContext;
|
|
271
256
|
/**
|
|
272
257
|
* Builds the base inputs for a value field.
|
|
273
258
|
* This is a helper function used by valueFieldMapper and specialized mappers.
|
|
@@ -277,31 +262,28 @@ declare function resolveValueFieldContext(): ValueFieldContext;
|
|
|
277
262
|
* @param defaultProps Default props from the form configuration (may be undefined if not configured)
|
|
278
263
|
* @returns Record of input names to values
|
|
279
264
|
*/
|
|
280
|
-
declare function buildValueFieldInputs<TProps, TValue = unknown>(fieldDef: BaseValueField<TProps, TValue, FieldMeta, boolean>, ctx: ValueFieldContext, defaultProps?: Record<string, unknown>): Record<string, unknown>;
|
|
265
|
+
export declare function buildValueFieldInputs<TProps, TValue = unknown>(fieldDef: BaseValueField<TProps, TValue, FieldMeta, boolean>, ctx: ValueFieldContext, defaultProps?: Record<string, unknown>): Record<string, unknown>;
|
|
281
266
|
/**
|
|
282
267
|
* Maps a value field definition to component inputs.
|
|
283
268
|
*
|
|
284
269
|
* @param fieldDef The value field definition
|
|
285
270
|
* @returns Signal containing Record of input names to values for ngComponentOutlet
|
|
286
271
|
*/
|
|
287
|
-
declare function valueFieldMapper<TProps = unknown, TValue = unknown>(fieldDef: BaseValueField<TProps, TValue, FieldMeta, boolean>): Signal<Record<string, unknown>>;
|
|
288
|
-
|
|
272
|
+
export declare function valueFieldMapper<TProps = unknown, TValue = unknown>(fieldDef: BaseValueField<TProps, TValue, FieldMeta, boolean>): Signal<Record<string, unknown>>;
|
|
289
273
|
/**
|
|
290
274
|
* Maps a checkbox/toggle field definition to component inputs.
|
|
291
275
|
*
|
|
292
276
|
* @param fieldDef The checkbox field definition
|
|
293
277
|
* @returns Signal containing Record of input names to values for ngComponentOutlet
|
|
294
278
|
*/
|
|
295
|
-
declare function checkboxFieldMapper(fieldDef: BaseCheckedField<unknown, FieldMeta, boolean>): Signal<Record<string, unknown>>;
|
|
296
|
-
|
|
279
|
+
export declare function checkboxFieldMapper(fieldDef: BaseCheckedField<unknown, FieldMeta, boolean>): Signal<Record<string, unknown>>;
|
|
297
280
|
/**
|
|
298
281
|
* Maps a datepicker field to component inputs.
|
|
299
282
|
*
|
|
300
283
|
* @param fieldDef The datepicker field definition
|
|
301
284
|
* @returns Signal containing Record of input names to values for ngComponentOutlet
|
|
302
285
|
*/
|
|
303
|
-
declare function datepickerFieldMapper<TProps>(fieldDef: DatepickerField<TProps>): Signal<Record<string, unknown>>;
|
|
304
|
-
|
|
286
|
+
export declare function datepickerFieldMapper<TProps>(fieldDef: DatepickerField<TProps>): Signal<Record<string, unknown>>;
|
|
305
287
|
/** Field types that have an options property. */
|
|
306
288
|
type FieldWithOptions<T = unknown, TProps = unknown> = SelectField<T, TProps> | RadioField<T, TProps> | MultiCheckboxField<T, TProps>;
|
|
307
289
|
/**
|
|
@@ -310,51 +292,49 @@ type FieldWithOptions<T = unknown, TProps = unknown> = SelectField<T, TProps> |
|
|
|
310
292
|
* @param fieldDef The field definition with options
|
|
311
293
|
* @returns Signal containing Record of input names to values for ngComponentOutlet
|
|
312
294
|
*/
|
|
313
|
-
declare function optionsFieldMapper<T, TProps>(fieldDef: FieldWithOptions<T, TProps>): Signal<Record<string, unknown>>;
|
|
314
|
-
|
|
295
|
+
export declare function optionsFieldMapper<T, TProps>(fieldDef: FieldWithOptions<T, TProps>): Signal<Record<string, unknown>>;
|
|
315
296
|
/**
|
|
316
297
|
* Maps a button field to component inputs.
|
|
317
298
|
*
|
|
318
299
|
* @param fieldDef The button field definition
|
|
319
300
|
* @returns Signal containing Record of input names to values for ngComponentOutlet
|
|
320
301
|
*/
|
|
321
|
-
declare function buttonFieldMapper<TProps, TEvent extends FormEvent>(fieldDef: ButtonField<TProps, TEvent>): Signal<Record<string, unknown>>;
|
|
322
|
-
|
|
302
|
+
export declare function buttonFieldMapper<TProps, TEvent extends FormEvent>(fieldDef: ButtonField<TProps, TEvent>): Signal<Record<string, unknown>>;
|
|
323
303
|
/**
|
|
324
304
|
* Context for array button mapping, containing resolved array information.
|
|
325
305
|
* Used by array button mappers to build event context.
|
|
326
306
|
*/
|
|
327
307
|
interface ArrayButtonContext {
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
308
|
+
/** The target array key (from explicit arrayKey or ARRAY_CONTEXT) */
|
|
309
|
+
targetArrayKey: string | undefined;
|
|
310
|
+
/** Computed signal that returns the current array index (-1 if not inside array) */
|
|
311
|
+
indexSignal: Signal<number>;
|
|
312
|
+
/**
|
|
313
|
+
* Current form value for token resolution. Implemented as a lazy getter so it
|
|
314
|
+
* is read at event-dispatch time, not when the mapper builds its context —
|
|
315
|
+
* reading it eagerly inside the mapper's computed would resnapshot a stale
|
|
316
|
+
* value and subscribe every array button to the whole form entity per
|
|
317
|
+
* keystroke. Keep it a getter on any reimplementation.
|
|
318
|
+
*/
|
|
319
|
+
formValue: Record<string, unknown>;
|
|
320
|
+
/** Whether this button is inside an array context */
|
|
321
|
+
isInsideArray: boolean;
|
|
342
322
|
}
|
|
343
323
|
/** Event context passed to button components for array operations. */
|
|
344
324
|
interface ArrayButtonEventContext {
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
325
|
+
/** The button field key */
|
|
326
|
+
key: string;
|
|
327
|
+
/** The current array index (-1 if outside array) */
|
|
328
|
+
index: number;
|
|
329
|
+
/** The target array key */
|
|
330
|
+
arrayKey: string;
|
|
331
|
+
/** Form value for token resolution — a lazy getter, resolved at dispatch time. See {@link ArrayButtonContext.formValue}. */
|
|
332
|
+
formValue: Record<string, unknown>;
|
|
333
|
+
/**
|
|
334
|
+
* Optional template for add operations.
|
|
335
|
+
* Can be a single field (primitive item) or array of fields (object item).
|
|
336
|
+
*/
|
|
337
|
+
template?: ArrayAllowedChildren | readonly ArrayAllowedChildren[];
|
|
358
338
|
}
|
|
359
339
|
/**
|
|
360
340
|
* Resolves array button context for button mappers.
|
|
@@ -364,7 +344,7 @@ interface ArrayButtonEventContext {
|
|
|
364
344
|
* @param explicitArrayKey Optional explicit arrayKey from field definition
|
|
365
345
|
* @returns The array button context with reactive index signal
|
|
366
346
|
*/
|
|
367
|
-
declare function resolveArrayButtonContext(fieldKey: string, buttonType: string, explicitArrayKey?: string): ArrayButtonContext;
|
|
347
|
+
export declare function resolveArrayButtonContext(fieldKey: string, buttonType: string, explicitArrayKey?: string): ArrayButtonContext;
|
|
368
348
|
/**
|
|
369
349
|
* Builds the event context passed to the button component.
|
|
370
350
|
*
|
|
@@ -373,7 +353,7 @@ declare function resolveArrayButtonContext(fieldKey: string, buttonType: string,
|
|
|
373
353
|
* @param template Optional template for add operations (single field or array of fields)
|
|
374
354
|
* @returns The event context for the button component
|
|
375
355
|
*/
|
|
376
|
-
declare function buildArrayButtonEventContext(fieldKey: string, ctx: ArrayButtonContext, template?: ArrayAllowedChildren | readonly ArrayAllowedChildren[]): ArrayButtonEventContext;
|
|
356
|
+
export declare function buildArrayButtonEventContext(fieldKey: string, ctx: ArrayButtonContext, template?: ArrayAllowedChildren | readonly ArrayAllowedChildren[]): ArrayButtonEventContext;
|
|
377
357
|
/**
|
|
378
358
|
* Event argument type - supports static values and tokens.
|
|
379
359
|
* Tokens: $key, $index, $arrayKey, $template, formValue
|
|
@@ -386,25 +366,24 @@ type EventArg = string | number | boolean | null | undefined;
|
|
|
386
366
|
* @param defaultEventArgs The default eventArgs to use if not specified
|
|
387
367
|
* @returns The resolved eventArgs array
|
|
388
368
|
*/
|
|
389
|
-
declare function resolveArrayButtonEventArgs(fieldEventArgs: readonly EventArg[] | undefined, defaultEventArgs?: readonly EventArg[]): readonly EventArg[];
|
|
390
|
-
|
|
369
|
+
export declare function resolveArrayButtonEventArgs(fieldEventArgs: readonly EventArg[] | undefined, defaultEventArgs?: readonly EventArg[]): readonly EventArg[];
|
|
391
370
|
/**
|
|
392
371
|
* Field definition with optional hidden/disabled and logic properties.
|
|
393
372
|
* This is the minimal interface needed by applyNonFieldLogic.
|
|
394
373
|
*/
|
|
395
374
|
interface FieldDefWithLogic {
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
375
|
+
key?: string;
|
|
376
|
+
hidden?: boolean;
|
|
377
|
+
disabled?: boolean;
|
|
378
|
+
logic?: NonFieldLogicConfig$1[] | LogicConfig[];
|
|
400
379
|
}
|
|
401
380
|
/**
|
|
402
381
|
* Result of applying non-field logic to a field.
|
|
403
382
|
* Only includes properties that have values to apply.
|
|
404
383
|
*/
|
|
405
384
|
interface NonFieldLogicResult {
|
|
406
|
-
|
|
407
|
-
|
|
385
|
+
hidden?: boolean;
|
|
386
|
+
disabled?: boolean;
|
|
408
387
|
}
|
|
409
388
|
/**
|
|
410
389
|
* Injects everything a non-form-bound button mapper needs to evaluate hidden/disabled logic,
|
|
@@ -412,113 +391,110 @@ interface NonFieldLogicResult {
|
|
|
412
391
|
* generic `{ type: 'button', logic: [...] }` evaluates its conditions with `externalData` and
|
|
413
392
|
* custom functions in scope, matching the built-in button field types.
|
|
414
393
|
*/
|
|
415
|
-
declare function injectNonFieldLogicResolver(fieldDef: FieldDefWithLogic): () => NonFieldLogicResult;
|
|
416
|
-
|
|
394
|
+
export declare function injectNonFieldLogicResolver(fieldDef: FieldDefWithLogic): () => NonFieldLogicResult;
|
|
417
395
|
/**
|
|
418
396
|
* Base interface for array add button fields (append, prepend, insert).
|
|
419
397
|
* Template is required to define the structure for new items.
|
|
420
398
|
*/
|
|
421
399
|
interface BaseArrayAddButtonField<TProps = unknown> {
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
400
|
+
key: string;
|
|
401
|
+
type: string;
|
|
402
|
+
label?: string;
|
|
403
|
+
disabled?: boolean;
|
|
404
|
+
hidden?: boolean;
|
|
405
|
+
className?: string;
|
|
406
|
+
props?: TProps;
|
|
407
|
+
/** Target array key (required when outside array, optional inside) */
|
|
408
|
+
arrayKey?: string;
|
|
409
|
+
/**
|
|
410
|
+
* Template defining the field structure for new items. REQUIRED.
|
|
411
|
+
* - Single field (ArrayAllowedChildren): Creates a primitive item (field's value is extracted directly)
|
|
412
|
+
* - Array of fields (ArrayAllowedChildren[]): Creates an object item (fields merged into object)
|
|
413
|
+
*/
|
|
414
|
+
template: ArrayAllowedChildren | readonly ArrayAllowedChildren[];
|
|
415
|
+
/** Optional custom eventArgs */
|
|
416
|
+
eventArgs?: readonly EventArg[];
|
|
417
|
+
/** Logic rules for dynamic hidden/disabled state (only hidden and disabled are supported) */
|
|
418
|
+
logic?: NonFieldLogicConfig$1[];
|
|
441
419
|
}
|
|
442
420
|
/**
|
|
443
421
|
* Base interface for array remove button fields (remove, pop, shift).
|
|
444
422
|
* No template needed - removes existing items.
|
|
445
423
|
*/
|
|
446
424
|
interface BaseArrayRemoveButtonField<TProps = unknown> {
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
425
|
+
key: string;
|
|
426
|
+
type: string;
|
|
427
|
+
label?: string;
|
|
428
|
+
disabled?: boolean;
|
|
429
|
+
hidden?: boolean;
|
|
430
|
+
className?: string;
|
|
431
|
+
props?: TProps;
|
|
432
|
+
/** Target array key (required when outside array, optional inside) */
|
|
433
|
+
arrayKey?: string;
|
|
434
|
+
/** Optional custom eventArgs */
|
|
435
|
+
eventArgs?: readonly EventArg[];
|
|
436
|
+
/** Logic rules for dynamic hidden/disabled state (only hidden and disabled are supported) */
|
|
437
|
+
logic?: NonFieldLogicConfig$1[];
|
|
460
438
|
}
|
|
461
439
|
/**
|
|
462
440
|
* Interface for insert array item button fields.
|
|
463
441
|
* Extends add button with required index.
|
|
464
442
|
*/
|
|
465
443
|
interface BaseInsertArrayItemButtonField<TProps = unknown> extends BaseArrayAddButtonField<TProps> {
|
|
466
|
-
|
|
467
|
-
|
|
444
|
+
/** The index at which to insert the new item */
|
|
445
|
+
index: number;
|
|
468
446
|
}
|
|
469
447
|
/**
|
|
470
448
|
* Mapper for add array item button — appends new item to end of array.
|
|
471
449
|
* Template is REQUIRED to define the field structure for new items.
|
|
472
450
|
*/
|
|
473
|
-
declare function addArrayItemButtonMapper<TProps>(fieldDef: BaseArrayAddButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
451
|
+
export declare function addArrayItemButtonMapper<TProps>(fieldDef: BaseArrayAddButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
474
452
|
/**
|
|
475
453
|
* Mapper for prepend array item button — inserts new item at beginning of array.
|
|
476
454
|
* Template is REQUIRED to define the field structure for new items.
|
|
477
455
|
*/
|
|
478
|
-
declare function prependArrayItemButtonMapper<TProps>(fieldDef: BaseArrayAddButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
456
|
+
export declare function prependArrayItemButtonMapper<TProps>(fieldDef: BaseArrayAddButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
479
457
|
/**
|
|
480
458
|
* Mapper for insert array item button — inserts new item at specific index.
|
|
481
459
|
* Template and index are REQUIRED.
|
|
482
460
|
*/
|
|
483
|
-
declare function insertArrayItemButtonMapper<TProps>(fieldDef: BaseInsertArrayItemButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
461
|
+
export declare function insertArrayItemButtonMapper<TProps>(fieldDef: BaseInsertArrayItemButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
484
462
|
/**
|
|
485
463
|
* Mapper for remove array item button.
|
|
486
464
|
* Inside array: RemoveAtIndexEvent. Outside array: PopArrayItemEvent.
|
|
487
465
|
*/
|
|
488
|
-
declare function removeArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
466
|
+
export declare function removeArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
489
467
|
/** Mapper for pop array item button — removes the last item from array. */
|
|
490
|
-
declare function popArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
468
|
+
export declare function popArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
491
469
|
/** Mapper for shift array item button — removes the first item from array. */
|
|
492
|
-
declare function shiftArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
493
|
-
|
|
470
|
+
export declare function shiftArrayItemButtonMapper<TProps>(fieldDef: BaseArrayRemoveButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
494
471
|
/** Base interface for navigation button fields (submit, next, previous). */
|
|
495
472
|
type BaseNavigationButtonField<TProps = unknown> = ButtonField<TProps, FormSubmitEvent | NextPageEvent | PreviousPageEvent> & {
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
473
|
+
type: string;
|
|
474
|
+
/** Logic rules for dynamic disabled state */
|
|
475
|
+
logic?: FieldWithValidation['logic'];
|
|
499
476
|
};
|
|
500
477
|
/**
|
|
501
478
|
* Mapper for submit button — configures native form submission via type="submit".
|
|
502
479
|
* Triggers native form submission rather than dispatching events directly.
|
|
503
480
|
*/
|
|
504
|
-
declare function submitButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
481
|
+
export declare function submitButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
505
482
|
/** Mapper for next page button — preconfigures NextPageEvent. */
|
|
506
|
-
declare function nextButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
483
|
+
export declare function nextButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
507
484
|
/** Mapper for previous page button — preconfigures PreviousPageEvent. */
|
|
508
|
-
declare function previousButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
509
|
-
|
|
485
|
+
export declare function previousButtonFieldMapper<TProps>(fieldDef: BaseNavigationButtonField<TProps>): Signal<Record<string, unknown>>;
|
|
510
486
|
/** Configuration options for setupMetaTracking. */
|
|
511
487
|
interface MetaTrackingOptions {
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
488
|
+
/**
|
|
489
|
+
* CSS selector for target elements within the host.
|
|
490
|
+
* If not provided, meta attributes are applied directly to the host element.
|
|
491
|
+
*/
|
|
492
|
+
selector?: string;
|
|
493
|
+
/**
|
|
494
|
+
* Additional signals to track that should trigger re-application of meta.
|
|
495
|
+
* Useful for components where DOM elements are dynamically created (e.g., radio options).
|
|
496
|
+
*/
|
|
497
|
+
dependents?: Signal<unknown>[];
|
|
522
498
|
}
|
|
523
499
|
/**
|
|
524
500
|
* Sets up automatic meta attribute tracking and application for wrapped components.
|
|
@@ -527,8 +503,7 @@ interface MetaTrackingOptions {
|
|
|
527
503
|
* @param meta - Signal containing meta attributes to apply
|
|
528
504
|
* @param options - Configuration options
|
|
529
505
|
*/
|
|
530
|
-
declare function setupMetaTracking(elementRef: ElementRef<HTMLElement>, meta: Signal<FieldMeta | undefined>, options?: MetaTrackingOptions): void;
|
|
531
|
-
|
|
506
|
+
export declare function setupMetaTracking(elementRef: ElementRef<HTMLElement>, meta: Signal<FieldMeta | undefined>, options?: MetaTrackingOptions): void;
|
|
532
507
|
/**
|
|
533
508
|
* Creates a signal that computes the aria-describedby value based on errors and hint state.
|
|
534
509
|
* Errors take precedence over hints - when errors are displayed, the hint is hidden.
|
|
@@ -540,23 +515,32 @@ declare function setupMetaTracking(elementRef: ElementRef<HTMLElement>, meta: Si
|
|
|
540
515
|
* @param hasHint Function that returns true if a hint is configured
|
|
541
516
|
* @returns Signal containing the aria-describedby value or null
|
|
542
517
|
*/
|
|
543
|
-
declare function createAriaDescribedBySignal(errorsToDisplay: Signal<ResolvedError[]>, errorId: Signal<string>, hintId: Signal<string>, hasHint: () => boolean): Signal<string | null>;
|
|
544
|
-
|
|
518
|
+
export declare function createAriaDescribedBySignal(errorsToDisplay: Signal<ResolvedError$1[]>, errorId: Signal<string>, hintId: Signal<string>, hasHint: () => boolean): Signal<string | null>;
|
|
545
519
|
/**
|
|
546
520
|
* Base directive composed into every ng-forge component via `hostDirectives`.
|
|
547
521
|
* Owns the universal identity inputs (`key`, `className`) and the host
|
|
548
522
|
* bindings that every field shape — value-bearing, action, future container —
|
|
549
523
|
* shares: `[id]`, `[attr.data-testid]`, `[class]`.
|
|
550
524
|
*/
|
|
551
|
-
declare class NgForgeFieldShell {
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
525
|
+
export declare class NgForgeFieldShell {
|
|
526
|
+
readonly key: import("@angular/core").InputSignal<string>;
|
|
527
|
+
readonly className: import("@angular/core").InputSignal<string>;
|
|
528
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeFieldShell, never>;
|
|
529
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeFieldShell, never, never, {
|
|
530
|
+
"key": {
|
|
531
|
+
"alias": "key";
|
|
532
|
+
"required": true;
|
|
533
|
+
"isSignal": true;
|
|
534
|
+
};
|
|
535
|
+
"className": {
|
|
536
|
+
"alias": "className";
|
|
537
|
+
"required": false;
|
|
538
|
+
"isSignal": true;
|
|
539
|
+
};
|
|
540
|
+
}, {}, never, never, true, never>;
|
|
556
541
|
}
|
|
557
542
|
/** Input names forwarded onto `NgForgeFieldShell` via `hostDirectives`. */
|
|
558
|
-
declare const NG_FORGE_FIELD_SHELL_INPUTS: readonly ["key", "className"];
|
|
559
|
-
|
|
543
|
+
export declare const NG_FORGE_FIELD_SHELL_INPUTS: readonly ["key", "className"];
|
|
560
544
|
/**
|
|
561
545
|
* Value-bearing add-on directive — composed alongside `NgForgeFieldShell` via
|
|
562
546
|
* the `NG_FORGE_FIELD` preset. Owns the value/validation/aria plumbing every
|
|
@@ -575,37 +559,73 @@ declare const NG_FORGE_FIELD_SHELL_INPUTS: readonly ["key", "className"];
|
|
|
575
559
|
* Selectorless — usage is exclusively via `hostDirectives`. Prefer the
|
|
576
560
|
* `NG_FORGE_FIELD` preset over composing this directive manually.
|
|
577
561
|
*/
|
|
578
|
-
declare class NgForgeField {
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
562
|
+
export declare class NgForgeField {
|
|
563
|
+
private readonly shell;
|
|
564
|
+
/** Shell-owned key, re-exported as plain `Signal<string>` so it doesn't get flagged by the host-directive input-lockstep assertion. */
|
|
565
|
+
readonly key: Signal<string>;
|
|
566
|
+
/** Shell-owned className, re-exported as plain `Signal<string>` for the same reason. */
|
|
567
|
+
readonly className: Signal<string>;
|
|
568
|
+
readonly field: import("@angular/core").InputSignal<FieldTree<unknown>>;
|
|
569
|
+
readonly label: import("@angular/core").InputSignal<DynamicText | undefined>;
|
|
570
|
+
readonly placeholder: import("@angular/core").InputSignal<DynamicText | undefined>;
|
|
571
|
+
readonly tabIndex: import("@angular/core").InputSignal<number | undefined>;
|
|
572
|
+
readonly props: import("@angular/core").InputSignal<unknown>;
|
|
573
|
+
readonly meta: import("@angular/core").InputSignal<FieldMeta | undefined>;
|
|
574
|
+
readonly validationMessages: import("@angular/core").InputSignal<ValidationMessages | undefined>;
|
|
575
|
+
private readonly defaultValidationMessages;
|
|
576
|
+
readonly errors: Signal<ResolvedError$1[]>;
|
|
577
|
+
readonly showErrors: Signal<boolean>;
|
|
578
|
+
/** An ancestor wrapper's claim to render errors — see `FIELD_ERROR_DISPLAY`. */
|
|
579
|
+
private readonly errorDisplayClaim;
|
|
580
|
+
readonly errorsToDisplay: Signal<ResolvedError$1[]>;
|
|
581
|
+
readonly errorId: Signal<string>;
|
|
582
|
+
readonly hintId: Signal<string>;
|
|
583
|
+
readonly ariaInvalid: Signal<boolean>;
|
|
584
|
+
readonly ariaRequired: Signal<true | null>;
|
|
585
|
+
readonly ariaDescribedBy: Signal<string | null>;
|
|
586
|
+
private readonly _claimed;
|
|
587
|
+
/** @internal Marker directives + ambient sub-components call this on construction. */
|
|
588
|
+
markClaimed(): void;
|
|
589
|
+
private readonly logger;
|
|
590
|
+
constructor();
|
|
591
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeField, never>;
|
|
592
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeField, never, never, {
|
|
593
|
+
"field": {
|
|
594
|
+
"alias": "field";
|
|
595
|
+
"required": true;
|
|
596
|
+
"isSignal": true;
|
|
597
|
+
};
|
|
598
|
+
"label": {
|
|
599
|
+
"alias": "label";
|
|
600
|
+
"required": false;
|
|
601
|
+
"isSignal": true;
|
|
602
|
+
};
|
|
603
|
+
"placeholder": {
|
|
604
|
+
"alias": "placeholder";
|
|
605
|
+
"required": false;
|
|
606
|
+
"isSignal": true;
|
|
607
|
+
};
|
|
608
|
+
"tabIndex": {
|
|
609
|
+
"alias": "tabIndex";
|
|
610
|
+
"required": false;
|
|
611
|
+
"isSignal": true;
|
|
612
|
+
};
|
|
613
|
+
"props": {
|
|
614
|
+
"alias": "props";
|
|
615
|
+
"required": false;
|
|
616
|
+
"isSignal": true;
|
|
617
|
+
};
|
|
618
|
+
"meta": {
|
|
619
|
+
"alias": "meta";
|
|
620
|
+
"required": false;
|
|
621
|
+
"isSignal": true;
|
|
622
|
+
};
|
|
623
|
+
"validationMessages": {
|
|
624
|
+
"alias": "validationMessages";
|
|
625
|
+
"required": false;
|
|
626
|
+
"isSignal": true;
|
|
627
|
+
};
|
|
628
|
+
}, {}, never, never, true, never>;
|
|
609
629
|
}
|
|
610
630
|
/**
|
|
611
631
|
* Inputs forwarded onto `NgForgeField` via `hostDirectives`. Excludes
|
|
@@ -613,7 +633,7 @@ declare class NgForgeField {
|
|
|
613
633
|
* `NG_FORGE_FIELD_SHELL_INPUTS`). Most consumers shouldn't reference this
|
|
614
634
|
* directly — use the `NG_FORGE_FIELD` preset.
|
|
615
635
|
*/
|
|
616
|
-
declare const NG_FORGE_VALUE_FIELD_INPUTS: readonly ["field", "label", "placeholder", "tabIndex", "props", "meta", "validationMessages"];
|
|
636
|
+
export declare const NG_FORGE_VALUE_FIELD_INPUTS: readonly ["field", "label", "placeholder", "tabIndex", "props", "meta", "validationMessages"];
|
|
617
637
|
/**
|
|
618
638
|
* `NgForgeField` typed for a specific value type. The directive itself stores
|
|
619
639
|
* `field` as `Signal<FieldTree<unknown>>` because Angular's `hostDirectives`
|
|
@@ -621,7 +641,7 @@ declare const NG_FORGE_VALUE_FIELD_INPUTS: readonly ["field", "label", "placehol
|
|
|
621
641
|
* inject site so consumers don't have to declare a separate cast computed.
|
|
622
642
|
*/
|
|
623
643
|
type TypedNgForgeField<T> = Omit<NgForgeField, 'field'> & {
|
|
624
|
-
|
|
644
|
+
readonly field: Signal<FieldTree<T>>;
|
|
625
645
|
};
|
|
626
646
|
/**
|
|
627
647
|
* Typed wrapper around `inject(NgForgeField)`. The generic narrows the
|
|
@@ -629,8 +649,7 @@ type TypedNgForgeField<T> = Omit<NgForgeField, 'field'> & {
|
|
|
629
649
|
* type. The cast is unchecked — the runtime contract is that mappers only
|
|
630
650
|
* forward a `field` whose value type matches the field-type definition.
|
|
631
651
|
*/
|
|
632
|
-
declare function injectNgForgeField<T = unknown>(): TypedNgForgeField<T>;
|
|
633
|
-
|
|
652
|
+
export declare function injectNgForgeField<T = unknown>(): TypedNgForgeField<T>;
|
|
634
653
|
/**
|
|
635
654
|
* Action add-on directive — composed alongside `NgForgeFieldShell` via the
|
|
636
655
|
* `NG_FORGE_ACTION` preset. Owns the inputs + dispatch logic every button /
|
|
@@ -638,30 +657,71 @@ declare function injectNgForgeField<T = unknown>(): TypedNgForgeField<T>;
|
|
|
638
657
|
* `[attr.hidden]` / `[attr.aria-disabled]` host bindings driven by its own
|
|
639
658
|
* inputs (no field tree).
|
|
640
659
|
*/
|
|
641
|
-
declare class NgForgeAction<TEvent extends FormEvent = FormEvent> {
|
|
642
|
-
|
|
643
|
-
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
660
|
+
export declare class NgForgeAction<TEvent extends FormEvent = FormEvent> {
|
|
661
|
+
private readonly shell;
|
|
662
|
+
readonly key: Signal<string>;
|
|
663
|
+
readonly className: Signal<string>;
|
|
664
|
+
readonly label: import("@angular/core").InputSignal<DynamicText>;
|
|
665
|
+
readonly disabled: import("@angular/core").InputSignal<boolean>;
|
|
666
|
+
readonly hidden: import("@angular/core").InputSignal<boolean>;
|
|
667
|
+
readonly tabIndex: import("@angular/core").InputSignal<number | undefined>;
|
|
668
|
+
readonly event: import("@angular/core").InputSignal<FormEventConstructor<TEvent> | undefined>;
|
|
669
|
+
readonly eventArgs: import("@angular/core").InputSignal<EventArgs | undefined>;
|
|
670
|
+
readonly eventContext: import("@angular/core").InputSignal<ArrayItemContext | undefined>;
|
|
671
|
+
readonly props: import("@angular/core").InputSignal<unknown>;
|
|
672
|
+
private readonly eventBus;
|
|
673
|
+
private readonly arrayContext;
|
|
674
|
+
/**
|
|
675
|
+
* Dispatch the configured event through the EventBus. Resolves `eventArgs`
|
|
676
|
+
* tokens (`$key`, `$index`, `$arrayKey`, `formValue`, …) against the
|
|
677
|
+
* ambient array context if present, falling back to a static `eventContext`
|
|
678
|
+
* input or the field's own `key` otherwise. No-op when `event` is unset
|
|
679
|
+
* (e.g. submit buttons handled by the native form lifecycle).
|
|
680
|
+
*/
|
|
681
|
+
dispatch(): void;
|
|
682
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAction<any>, never>;
|
|
683
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAction<any>, never, never, {
|
|
684
|
+
"label": {
|
|
685
|
+
"alias": "label";
|
|
686
|
+
"required": true;
|
|
687
|
+
"isSignal": true;
|
|
688
|
+
};
|
|
689
|
+
"disabled": {
|
|
690
|
+
"alias": "disabled";
|
|
691
|
+
"required": false;
|
|
692
|
+
"isSignal": true;
|
|
693
|
+
};
|
|
694
|
+
"hidden": {
|
|
695
|
+
"alias": "hidden";
|
|
696
|
+
"required": false;
|
|
697
|
+
"isSignal": true;
|
|
698
|
+
};
|
|
699
|
+
"tabIndex": {
|
|
700
|
+
"alias": "tabIndex";
|
|
701
|
+
"required": false;
|
|
702
|
+
"isSignal": true;
|
|
703
|
+
};
|
|
704
|
+
"event": {
|
|
705
|
+
"alias": "event";
|
|
706
|
+
"required": false;
|
|
707
|
+
"isSignal": true;
|
|
708
|
+
};
|
|
709
|
+
"eventArgs": {
|
|
710
|
+
"alias": "eventArgs";
|
|
711
|
+
"required": false;
|
|
712
|
+
"isSignal": true;
|
|
713
|
+
};
|
|
714
|
+
"eventContext": {
|
|
715
|
+
"alias": "eventContext";
|
|
716
|
+
"required": false;
|
|
717
|
+
"isSignal": true;
|
|
718
|
+
};
|
|
719
|
+
"props": {
|
|
720
|
+
"alias": "props";
|
|
721
|
+
"required": false;
|
|
722
|
+
"isSignal": true;
|
|
723
|
+
};
|
|
724
|
+
}, {}, never, never, true, never>;
|
|
665
725
|
}
|
|
666
726
|
/**
|
|
667
727
|
* Inputs forwarded onto `NgForgeAction` via `hostDirectives`. Excludes
|
|
@@ -669,51 +729,56 @@ declare class NgForgeAction<TEvent extends FormEvent = FormEvent> {
|
|
|
669
729
|
* `NG_FORGE_FIELD_SHELL_INPUTS`). Most consumers shouldn't reference this
|
|
670
730
|
* directly — use the `NG_FORGE_ACTION` preset.
|
|
671
731
|
*/
|
|
672
|
-
declare const NG_FORGE_ACTION_INPUTS: readonly ["label", "disabled", "hidden", "tabIndex", "event", "eventArgs", "eventContext", "props"];
|
|
732
|
+
export declare const NG_FORGE_ACTION_INPUTS: readonly ["label", "disabled", "hidden", "tabIndex", "event", "eventArgs", "eventContext", "props"];
|
|
673
733
|
/**
|
|
674
734
|
* Typed wrapper around `inject(NgForgeAction)`. The generic narrows the
|
|
675
735
|
* `event` input to a specific FormEvent subclass.
|
|
676
736
|
*/
|
|
677
|
-
declare function injectNgForgeAction<TEvent extends FormEvent = FormEvent>(): NgForgeAction<TEvent>;
|
|
678
|
-
|
|
737
|
+
export declare function injectNgForgeAction<TEvent extends FormEvent = FormEvent>(): NgForgeAction<TEvent>;
|
|
679
738
|
/**
|
|
680
739
|
* Universal addon-array plumbing: signal-cached `hidden` resolution and
|
|
681
740
|
* slot bucketing. Used internally by the `NgForgeAddons` host wrapper —
|
|
682
741
|
* consumers should compose `NgForgeAddons` directly and inject the
|
|
683
742
|
* directive instance via `injectNgForgeAddons<TAddon>()`.
|
|
684
743
|
*/
|
|
685
|
-
declare class NgForgeAddonsBase {
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
706
|
-
|
|
707
|
-
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
744
|
+
export declare class NgForgeAddonsBase {
|
|
745
|
+
/** Capture the host's injector so `toSignal` (inside `resolveDynamicValue`) ties to the host's `DestroyRef`. */
|
|
746
|
+
private readonly hostInjector;
|
|
747
|
+
/** Addon array mapped from `FieldDef.addons` by `buildBaseInputs`. */
|
|
748
|
+
readonly addons: import("@angular/core").InputSignal<readonly AnyAddon[] | undefined>;
|
|
749
|
+
/**
|
|
750
|
+
* Per-addon `hidden` signal cache. Built via `explicitEffect` rather
|
|
751
|
+
* than `computed` because `toSignal` (inside `resolveDynamicValue` for
|
|
752
|
+
* Observable inputs) is disallowed in reactive contexts (NG0602).
|
|
753
|
+
*/
|
|
754
|
+
private readonly _hiddenSignalCache;
|
|
755
|
+
readonly hiddenSignalCache: Signal<ReadonlyMap<AnyAddon, Signal<boolean>>>;
|
|
756
|
+
readonly visibleAddons: Signal<ReadonlyArray<AnyAddon>>;
|
|
757
|
+
readonly hasAddons: Signal<boolean>;
|
|
758
|
+
readonly prefixAddons: Signal<ReadonlyArray<AnyAddon>>;
|
|
759
|
+
readonly suffixAddons: Signal<ReadonlyArray<AnyAddon>>;
|
|
760
|
+
/**
|
|
761
|
+
* Visible addons grouped by their `slot` string. Convenience view for
|
|
762
|
+
* adapters with non-universal slots (e.g., Ionic `start` / `end`).
|
|
763
|
+
*/
|
|
764
|
+
readonly addonsBySlot: Signal<ReadonlyMap<string, ReadonlyArray<AnyAddon>>>;
|
|
765
|
+
/** Secondary index keyed by `hidden` value identity. Catches the common case
|
|
766
|
+
* where a FormConfig re-emit produces structurally-different-but-content-
|
|
767
|
+
* identical addon objects — without this, every re-emit would spawn a new
|
|
768
|
+
* `toSignal` subscription for each addon's hidden axis. */
|
|
769
|
+
private readonly _hiddenByValue;
|
|
770
|
+
constructor();
|
|
771
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddonsBase, never>;
|
|
772
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddonsBase, never, never, {
|
|
773
|
+
"addons": {
|
|
774
|
+
"alias": "addons";
|
|
775
|
+
"required": false;
|
|
776
|
+
"isSignal": true;
|
|
777
|
+
};
|
|
778
|
+
}, {}, never, never, true, never>;
|
|
714
779
|
}
|
|
715
780
|
/** Forwarded onto `NgForgeAddonsBase` via the `NgForgeAddons` wrapper. */
|
|
716
|
-
declare const NG_FORGE_ADDONS_INPUTS: readonly ["addons"];
|
|
781
|
+
export declare const NG_FORGE_ADDONS_INPUTS: readonly ["addons"];
|
|
717
782
|
/**
|
|
718
783
|
* Host wrapper for `NgForgeAddonsBase`. Consumers compose this directly:
|
|
719
784
|
*
|
|
@@ -735,35 +800,40 @@ declare const NG_FORGE_ADDONS_INPUTS: readonly ["addons"];
|
|
|
735
800
|
* The wrapper exists so `hostDirectives: [NgForgeAddons]` resolves
|
|
736
801
|
* cross-package — same constraint that drives `NgForgeFieldHost`.
|
|
737
802
|
*/
|
|
738
|
-
declare class NgForgeAddons {
|
|
739
|
-
|
|
740
|
-
|
|
803
|
+
export declare class NgForgeAddons {
|
|
804
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddons, never>;
|
|
805
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddons, never, never, {}, {}, never, never, true, [{
|
|
806
|
+
directive: typeof NgForgeAddonsBase;
|
|
807
|
+
inputs: {
|
|
808
|
+
"addons": "addons";
|
|
809
|
+
};
|
|
810
|
+
outputs: {};
|
|
811
|
+
}]>;
|
|
741
812
|
}
|
|
742
813
|
/** Narrowed view of `NgForgeAddonsBase` returned by `injectNgForgeAddons<TAddon>()`. */
|
|
743
814
|
type TypedNgForgeAddons<TAddon extends AnyAddon = AnyAddon> = Omit<NgForgeAddonsBase, 'addons' | 'visibleAddons' | 'prefixAddons' | 'suffixAddons'> & {
|
|
744
|
-
|
|
745
|
-
|
|
746
|
-
|
|
747
|
-
|
|
815
|
+
readonly addons: Signal<ReadonlyArray<TAddon> | undefined>;
|
|
816
|
+
readonly visibleAddons: Signal<ReadonlyArray<TAddon>>;
|
|
817
|
+
readonly prefixAddons: Signal<ReadonlyArray<TAddon>>;
|
|
818
|
+
readonly suffixAddons: Signal<ReadonlyArray<TAddon>>;
|
|
748
819
|
};
|
|
749
820
|
/**
|
|
750
821
|
* Typed inject helper. Always resolves to the underlying
|
|
751
822
|
* `NgForgeAddonsBase` instance — the wrapper class has no instance
|
|
752
823
|
* fields of its own.
|
|
753
824
|
*/
|
|
754
|
-
declare function injectNgForgeAddons<TAddon extends AnyAddon = AnyAddon>(): TypedNgForgeAddons<TAddon>;
|
|
755
|
-
|
|
825
|
+
export declare function injectNgForgeAddons<TAddon extends AnyAddon = AnyAddon>(): TypedNgForgeAddons<TAddon>;
|
|
756
826
|
/**
|
|
757
827
|
* Permissive shape the directive reads from `addon()`. Adapter-specific
|
|
758
828
|
* addon types (e.g., `PrimeButtonAddon`) narrow this at the inject site via
|
|
759
829
|
* `injectNgForgeAddonAction<T>()`.
|
|
760
830
|
*/
|
|
761
831
|
interface ActionAddonShape extends BaseAddon {
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
832
|
+
readonly preset?: string;
|
|
833
|
+
readonly actionRef?: string;
|
|
834
|
+
readonly action?: AddonActionHandler$1;
|
|
835
|
+
readonly disabled?: DynamicValue<boolean>;
|
|
836
|
+
readonly loading?: DynamicValue<boolean>;
|
|
767
837
|
}
|
|
768
838
|
/**
|
|
769
839
|
* Universal click-dispatch plumbing for action-style addons (icon buttons,
|
|
@@ -771,59 +841,76 @@ interface ActionAddonShape extends BaseAddon {
|
|
|
771
841
|
* `DynamicValue<boolean>`, action context construction, and the
|
|
772
842
|
* `preset / actionRef / action` precedence dispatcher.
|
|
773
843
|
*/
|
|
774
|
-
declare class NgForgeAddonActionBase {
|
|
775
|
-
|
|
776
|
-
|
|
777
|
-
|
|
778
|
-
|
|
779
|
-
|
|
780
|
-
|
|
781
|
-
|
|
782
|
-
|
|
783
|
-
|
|
784
|
-
|
|
785
|
-
|
|
786
|
-
|
|
787
|
-
|
|
788
|
-
|
|
789
|
-
|
|
790
|
-
|
|
791
|
-
|
|
792
|
-
|
|
793
|
-
|
|
794
|
-
|
|
795
|
-
|
|
796
|
-
|
|
797
|
-
|
|
798
|
-
|
|
799
|
-
|
|
800
|
-
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
|
|
806
|
-
|
|
807
|
-
|
|
808
|
-
|
|
809
|
-
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
844
|
+
export declare class NgForgeAddonActionBase {
|
|
845
|
+
private readonly actionRegistry;
|
|
846
|
+
private readonly presetHandler;
|
|
847
|
+
private readonly logger;
|
|
848
|
+
private readonly hostInjector;
|
|
849
|
+
readonly addon: import("@angular/core").InputSignal<ActionAddonShape>;
|
|
850
|
+
readonly fieldInputs: import("@angular/core").InputSignal<WrapperFieldInputs$1 | undefined>;
|
|
851
|
+
/**
|
|
852
|
+
* Per-value caches for `disabled` / `loading` signal resolution. Keyed by
|
|
853
|
+
* the `DynamicValue` identity so a single `toSignal` subscription is
|
|
854
|
+
* shared across addon-reference swaps that pass the same Observable.
|
|
855
|
+
* Mirrors `NgForgeAddonsBase._hiddenByValue` — `resolveDynamicValue`
|
|
856
|
+
* cannot run inside `computed`/`linkedSignal.computation` because
|
|
857
|
+
* `toSignal` throws in reactive contexts (NG0602), and re-running it on
|
|
858
|
+
* every recomputation would leak subscriptions on each cycle.
|
|
859
|
+
*/
|
|
860
|
+
private readonly _disabledByValue;
|
|
861
|
+
private readonly _loadingByValue;
|
|
862
|
+
private readonly _resolvedDisabled;
|
|
863
|
+
private readonly _resolvedLoading;
|
|
864
|
+
readonly disabled: Signal<boolean>;
|
|
865
|
+
readonly loading: Signal<boolean>;
|
|
866
|
+
constructor();
|
|
867
|
+
private _resolveAxis;
|
|
868
|
+
/**
|
|
869
|
+
* Resolve the click handler from the addon's three-axis click variant and
|
|
870
|
+
* invoke it. Precedence on multi-set: `preset > actionRef > action`. The
|
|
871
|
+
* validator drops multi-set configs at config-init time; this is
|
|
872
|
+
* defence-in-depth + a logged warning so the misconfiguration is loud.
|
|
873
|
+
*/
|
|
874
|
+
dispatch(): void;
|
|
875
|
+
/**
|
|
876
|
+
* Build an `AddonActionContext` for handlers from the wrapper-style
|
|
877
|
+
* `fieldInputs` bag. Returns the field-bound variant when a host field
|
|
878
|
+
* is reachable, or the orphan variant otherwise.
|
|
879
|
+
*/
|
|
880
|
+
buildActionContext(): AddonActionContext;
|
|
881
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddonActionBase, never>;
|
|
882
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddonActionBase, never, never, {
|
|
883
|
+
"addon": {
|
|
884
|
+
"alias": "addon";
|
|
885
|
+
"required": true;
|
|
886
|
+
"isSignal": true;
|
|
887
|
+
};
|
|
888
|
+
"fieldInputs": {
|
|
889
|
+
"alias": "fieldInputs";
|
|
890
|
+
"required": false;
|
|
891
|
+
"isSignal": true;
|
|
892
|
+
};
|
|
893
|
+
}, {}, never, never, true, never>;
|
|
813
894
|
}
|
|
814
895
|
/** Forwarded onto `NgForgeAddonActionBase` via the `NgForgeAddonAction` wrapper. */
|
|
815
|
-
declare const NG_FORGE_ADDON_ACTION_INPUTS: readonly ["addon", "fieldInputs"];
|
|
896
|
+
export declare const NG_FORGE_ADDON_ACTION_INPUTS: readonly ["addon", "fieldInputs"];
|
|
816
897
|
/** Host wrapper for `NgForgeAddonActionBase`. Consumers compose this directly: */
|
|
817
|
-
declare class NgForgeAddonAction {
|
|
818
|
-
|
|
819
|
-
|
|
898
|
+
export declare class NgForgeAddonAction {
|
|
899
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeAddonAction, never>;
|
|
900
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeAddonAction, never, never, {}, {}, never, never, true, [{
|
|
901
|
+
directive: typeof NgForgeAddonActionBase;
|
|
902
|
+
inputs: {
|
|
903
|
+
"addon": "addon";
|
|
904
|
+
"fieldInputs": "fieldInputs";
|
|
905
|
+
};
|
|
906
|
+
outputs: {};
|
|
907
|
+
}]>;
|
|
820
908
|
}
|
|
821
909
|
/** Narrowed view of `NgForgeAddonActionBase` returned by `injectNgForgeAddonAction<T>()`. */
|
|
822
910
|
type TypedNgForgeAddonAction<TAddon extends ActionAddonShape = ActionAddonShape> = Omit<NgForgeAddonActionBase, 'addon'> & {
|
|
823
|
-
|
|
911
|
+
readonly addon: Signal<TAddon>;
|
|
824
912
|
};
|
|
825
|
-
declare function injectNgForgeAddonAction<TAddon extends ActionAddonShape = ActionAddonShape>(): TypedNgForgeAddonAction<TAddon>;
|
|
826
|
-
|
|
913
|
+
export declare function injectNgForgeAddonAction<TAddon extends ActionAddonShape = ActionAddonShape>(): TypedNgForgeAddonAction<TAddon>;
|
|
827
914
|
/**
|
|
828
915
|
* Adapter-supplied resolver for `preset` addon actions (e.g., `'clear'`,
|
|
829
916
|
* `'toggle-password-visibility'`). The universal click-dispatch directive
|
|
@@ -832,10 +919,9 @@ declare function injectNgForgeAddonAction<TAddon extends ActionAddonShape = Acti
|
|
|
832
919
|
* provider scope.
|
|
833
920
|
*/
|
|
834
921
|
interface AddonPresetHandler {
|
|
835
|
-
|
|
922
|
+
run(preset: string, ctx: AddonActionContext): void | Promise<void>;
|
|
836
923
|
}
|
|
837
|
-
declare const ADDON_PRESET_HANDLER: InjectionToken<AddonPresetHandler>;
|
|
838
|
-
|
|
924
|
+
export declare const ADDON_PRESET_HANDLER: InjectionToken<AddonPresetHandler>;
|
|
839
925
|
/**
|
|
840
926
|
* Marker directive applied to the canonical control element of an
|
|
841
927
|
* `NgForgeField`-using component. Forwards the field's `meta` AND
|
|
@@ -850,11 +936,17 @@ declare const ADDON_PRESET_HANDLER: InjectionToken<AddonPresetHandler>;
|
|
|
850
936
|
* Each `@for` iteration creates its own directive instance; Angular's
|
|
851
937
|
* structural lifecycle handles add/remove naturally.
|
|
852
938
|
*/
|
|
853
|
-
declare class NgForgeControl {
|
|
854
|
-
|
|
855
|
-
|
|
856
|
-
|
|
857
|
-
|
|
939
|
+
export declare class NgForgeControl {
|
|
940
|
+
readonly target: import("@angular/core").InputSignal<string | undefined>;
|
|
941
|
+
constructor();
|
|
942
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeControl, never>;
|
|
943
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeControl, "[ngForgeControl]", never, {
|
|
944
|
+
"target": {
|
|
945
|
+
"alias": "ngForgeControl";
|
|
946
|
+
"required": false;
|
|
947
|
+
"isSignal": true;
|
|
948
|
+
};
|
|
949
|
+
}, {}, never, never, true, never>;
|
|
858
950
|
}
|
|
859
951
|
/**
|
|
860
952
|
* Selectorless companion directive for shadow-DOM-encapsulated components
|
|
@@ -862,31 +954,67 @@ declare class NgForgeControl {
|
|
|
862
954
|
* is the canonical control. Added to the component's `hostDirectives` so the
|
|
863
955
|
* field's `meta` + parent aria land on the component's own host element.
|
|
864
956
|
*/
|
|
865
|
-
declare class NgForgeHostControl {
|
|
866
|
-
|
|
867
|
-
|
|
868
|
-
|
|
957
|
+
export declare class NgForgeHostControl {
|
|
958
|
+
constructor();
|
|
959
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeHostControl, never>;
|
|
960
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeHostControl, never, never, {}, {}, never, never, true, never>;
|
|
869
961
|
}
|
|
870
|
-
|
|
871
962
|
/**
|
|
872
963
|
* Value-bearing field host wrapper. Composes `NgForgeFieldShell` (universal
|
|
873
964
|
* identity) with `NgForgeField` (value + validation + aria + meta-tracking)
|
|
874
965
|
* in a single host-directive entry, so consumer components compose just one
|
|
875
966
|
* directive instead of two.
|
|
876
967
|
*/
|
|
877
|
-
declare class NgForgeFieldHost {
|
|
878
|
-
|
|
879
|
-
|
|
968
|
+
export declare class NgForgeFieldHost {
|
|
969
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeFieldHost, never>;
|
|
970
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeFieldHost, never, never, {}, {}, never, never, true, [{
|
|
971
|
+
directive: typeof NgForgeFieldShell;
|
|
972
|
+
inputs: {
|
|
973
|
+
"key": "key";
|
|
974
|
+
"className": "className";
|
|
975
|
+
};
|
|
976
|
+
outputs: {};
|
|
977
|
+
}, {
|
|
978
|
+
directive: typeof NgForgeField;
|
|
979
|
+
inputs: {
|
|
980
|
+
"field": "field";
|
|
981
|
+
"label": "label";
|
|
982
|
+
"placeholder": "placeholder";
|
|
983
|
+
"tabIndex": "tabIndex";
|
|
984
|
+
"props": "props";
|
|
985
|
+
"meta": "meta";
|
|
986
|
+
"validationMessages": "validationMessages";
|
|
987
|
+
};
|
|
988
|
+
outputs: {};
|
|
989
|
+
}]>;
|
|
880
990
|
}
|
|
881
991
|
/**
|
|
882
992
|
* Action / button host wrapper. Composes `NgForgeFieldShell` with
|
|
883
993
|
* `NgForgeAction` (event dispatch + aria-disabled) for button-shaped
|
|
884
994
|
* components.
|
|
885
995
|
*/
|
|
886
|
-
declare class NgForgeActionHost {
|
|
887
|
-
|
|
888
|
-
|
|
996
|
+
export declare class NgForgeActionHost {
|
|
997
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<NgForgeActionHost, never>;
|
|
998
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<NgForgeActionHost, never, never, {}, {}, never, never, true, [{
|
|
999
|
+
directive: typeof NgForgeFieldShell;
|
|
1000
|
+
inputs: {
|
|
1001
|
+
"key": "key";
|
|
1002
|
+
"className": "className";
|
|
1003
|
+
};
|
|
1004
|
+
outputs: {};
|
|
1005
|
+
}, {
|
|
1006
|
+
directive: typeof NgForgeAction;
|
|
1007
|
+
inputs: {
|
|
1008
|
+
"label": "label";
|
|
1009
|
+
"disabled": "disabled";
|
|
1010
|
+
"hidden": "hidden";
|
|
1011
|
+
"tabIndex": "tabIndex";
|
|
1012
|
+
"event": "event";
|
|
1013
|
+
"eventArgs": "eventArgs";
|
|
1014
|
+
"eventContext": "eventContext";
|
|
1015
|
+
"props": "props";
|
|
1016
|
+
};
|
|
1017
|
+
outputs: {};
|
|
1018
|
+
}]>;
|
|
889
1019
|
}
|
|
890
|
-
|
|
891
|
-
export { ADDON_PRESET_HANDLER, NG_FORGE_ACTION_INPUTS, NG_FORGE_ADDONS_INPUTS, NG_FORGE_ADDON_ACTION_INPUTS, NG_FORGE_FIELD_SHELL_INPUTS, NG_FORGE_VALUE_FIELD_INPUTS, NgForgeAction, NgForgeActionHost, NgForgeAddonAction, NgForgeAddonActionBase, NgForgeAddons, NgForgeAddonsBase, NgForgeControl, NgForgeField, NgForgeFieldHost, NgForgeFieldShell, NgForgeHostControl, addArrayItemButtonMapper, buildArrayButtonEventContext, buildValueFieldInputs, buttonFieldMapper, checkboxFieldMapper, createAriaDescribedBySignal, datepickerFieldMapper, injectNgForgeAction, injectNgForgeAddonAction, injectNgForgeAddons, injectNgForgeField, injectNonFieldLogicResolver, insertArrayItemButtonMapper, nextButtonFieldMapper, optionsFieldMapper, popArrayItemButtonMapper, prependArrayItemButtonMapper, previousButtonFieldMapper, removeArrayItemButtonMapper, resolveArrayButtonContext, resolveArrayButtonEventArgs, resolveValueFieldContext, setupMetaTracking, shiftArrayItemButtonMapper, submitButtonFieldMapper, valueFieldMapper };
|
|
892
|
-
export type { AddonPresetHandler, ArrayButtonContext, ArrayButtonEventContext, Autocapitalize, AutocompleteValue, BaseArrayAddButtonField, BaseArrayRemoveButtonField, BaseInsertArrayItemButtonField, BaseNavigationButtonField, ButtonField, CheckboxField, DatepickerField, DatepickerProps, EnterKeyHint, EventArg, EventArgs, FieldWithOptions, HtmlInputType, InferInputValue, InputField, InputMeta, InputMode, InputProps, InputType, MetaTrackingOptions, MultiCheckboxField, NumericInputType, RadioField, SelectField, SelectProps, SliderField, StringInputType, TextareaField, TextareaMeta, TextareaProps, TextareaWrap, ToggleField, TypedNgForgeAddonAction, TypedNgForgeAddons, TypedNgForgeField, ValueFieldContext };
|
|
1020
|
+
export { ADDON_ACTION_REGISTRY, ADDON_TYPE_COMPONENT_CACHE, ADDON_TYPE_DEFINITIONS, ADDON_TYPE_REGISTRY, ARRAY_CONTEXT, type AddonActionHandler, type AddonPresetHandler, type AddonShapeValidator, type AddonTypeDefinition, type AddonTypeSchema, type ArrayButtonContext, type ArrayButtonEventContext, type ArrayContext, type ArrayFieldTree, type Autocapitalize, type AutocompleteValue, BUILT_IN_FIELDS, type BaseArrayAddButtonField, type BaseArrayRemoveButtonField, type BaseInsertArrayItemButtonField, type BaseNavigationButtonField, type ButtonField, type CheckboxField, type CheckedFieldComponent, type CreateNgForgeActionFixtureOptions, type CreateNgForgeFieldFixtureOptions, DEFAULT_PROPS, DEFAULT_VALIDATION_MESSAGES, DEFAULT_WRAPPERS, type DatepickerField, type DatepickerProps, DfAddonSlot, DynamicTextPipe, type EnterKeyHint, type EventArg, type EventArgs, EventBus, FIELD_ERROR_DISPLAY, FIELD_REGISTRY, FIELD_SIGNAL_CONTEXT, FORM_OPTIONS, type FieldAddonSupport, type FieldAddonSupportEntry, type FieldErrorDisplayClaim, type FieldErrors, type FieldErrorsOptions, FieldErrorsWrapperBase, type FieldScope, type FieldSignalContext, type FieldStateContext, type FieldStateInfo, type FieldTypeDefinition, type FieldWithOptions, type FieldWrapper, type FormFieldStateMap, GROUP_CONTEXT, type HtmlInputType, type HttpResourceRequest, INITIALIZATION_TIMEOUT_MS, type InferInputValue, type InferWrapperRegistry, type InputField, type InputMeta, type InputMode, type InputProps, type InputType, type MapperFn, type MetaTrackingOptions, type MultiCheckboxField, type NgForgeActionFixture, type NgForgeFieldFixture, type NonFieldLogicConfig, type NonFieldLogicContext, type NonFieldLogicType, type NumericInputType, type PresetCollaborators, type RadioField, type ReadonlyFieldTree, type ResolvedError, RootFormRegistryService, type SelectField, type SelectProps, type SliderField, type StringInputType, type TextareaField, type TextareaMeta, type TextareaProps, type TextareaWrap, type ToggleField, type TypedNgForgeAddonAction, type TypedNgForgeAddons, type TypedNgForgeField, type ValueFieldComponent, type ValueFieldContext, type ValueHandlingMode, type WrapperFieldInputs, type WrapperRegistration, type WrapperTypeDefinition, type WrappersBundle, applyMetaToElement, applyValidator, applyValidators, arrayFieldMapper, baseFieldMapper, buildBaseInputs, containerFieldMapper, createNgForgeActionFixture, createNgForgeFieldFixture, createResolvedErrorsSignal, createWrappers, dynamicTextToObservable, getArrayLength, groupFieldMapper, injectAddonTypeRegistry, injectFieldErrors, injectFieldSignalContext, injectFieldsSupportingAddons, interpolateParams, isCheckedField, isEqual, isValueField, isWrappersBundle, pageFieldMapper, provideFieldErrorDisplay, provideTestValidationMessages, resolveDynamicValue, resolveNonFieldDisabled, resolveNonFieldHidden, resolveTokens, rowFieldMapper, runPresetAction, shouldShowErrors, textFieldMapper, toReadonlyFieldTree, withPreviousValue, wrapperProps, writeToFieldValue };
|