@ng-forge/dynamic-form-mcp 0.5.2 → 0.6.1
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/README.md +1 -1
- package/bin/ng-forge-mcp.js +2277 -744
- package/package.json +7 -7
- package/src/index.js +2277 -745
- package/src/registry/documentation.d.ts +14 -0
- package/src/registry/documentation.d.ts.map +1 -0
- package/src/registry/field-types.d.ts +9 -0
- package/src/registry/field-types.d.ts.map +1 -0
- package/src/registry/index.d.ts +10 -16
- package/src/registry/index.d.ts.map +1 -1
- package/src/registry/instructions.d.ts +1 -1
- package/src/registry/instructions.d.ts.map +1 -1
- package/src/registry/ui-adapters.d.ts +9 -0
- package/src/registry/ui-adapters.d.ts.map +1 -0
- package/src/registry/validators.d.ts +9 -0
- package/src/registry/validators.d.ts.map +1 -0
- package/src/resources/documentation.resource.d.ts +2 -1
- package/src/resources/documentation.resource.d.ts.map +1 -1
- package/src/services/doc-fetcher.d.ts +34 -0
- package/src/services/doc-fetcher.d.ts.map +1 -0
- package/src/services/topic-mapper.d.ts +18 -0
- package/src/services/topic-mapper.d.ts.map +1 -0
- package/src/tools/data/lookup-topics.d.ts +5 -0
- package/src/tools/data/lookup-topics.d.ts.map +1 -1
- package/src/tools/examples.tool.d.ts +18 -0
- package/src/tools/examples.tool.d.ts.map +1 -1
- package/src/tools/index.d.ts +8 -6
- package/src/tools/index.d.ts.map +1 -1
- package/src/tools/lookup.tool.d.ts.map +1 -1
- package/src/tools/scaffold.tool.d.ts.map +1 -1
- package/src/tools/search.tool.d.ts +9 -0
- package/src/tools/search.tool.d.ts.map +1 -0
- package/src/tools/validate.tool.d.ts.map +1 -1
- package/src/registry/api-reference.json +0 -510
- package/src/registry/docs.json +0 -236
- package/src/registry/field-types.json +0 -490
- package/src/registry/ui-adapters.json +0 -225
- package/src/registry/validators.json +0 -158
|
@@ -1,490 +0,0 @@
|
|
|
1
|
-
[
|
|
2
|
-
{
|
|
3
|
-
"type": "input",
|
|
4
|
-
"category": "value",
|
|
5
|
-
"description": "Text-based input field with HTML5 type support (text, email, password, number, tel, url)",
|
|
6
|
-
"valueType": "string | number",
|
|
7
|
-
"baseInterface": "BaseValueField",
|
|
8
|
-
"props": {
|
|
9
|
-
"type": {
|
|
10
|
-
"name": "type",
|
|
11
|
-
"type": "'text' | 'email' | 'password' | 'number' | 'tel' | 'url'",
|
|
12
|
-
"description": "HTML input type",
|
|
13
|
-
"required": false,
|
|
14
|
-
"default": "text"
|
|
15
|
-
},
|
|
16
|
-
"placeholder": {
|
|
17
|
-
"name": "placeholder",
|
|
18
|
-
"type": "DynamicText",
|
|
19
|
-
"description": "Placeholder text displayed when field is empty",
|
|
20
|
-
"required": false
|
|
21
|
-
}
|
|
22
|
-
},
|
|
23
|
-
"validationSupported": true,
|
|
24
|
-
"source": "adapter",
|
|
25
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
26
|
-
"example": "{\n key: 'email',\n type: 'input',\n label: 'Email Address',\n required: true,\n email: true,\n props: { type: 'email', placeholder: 'user@example.com' }\n}",
|
|
27
|
-
"minimalExample": "{ key: 'name', type: 'input', label: 'Name' }"
|
|
28
|
-
},
|
|
29
|
-
{
|
|
30
|
-
"type": "textarea",
|
|
31
|
-
"category": "value",
|
|
32
|
-
"description": "Multi-line text input field for longer content",
|
|
33
|
-
"valueType": "string",
|
|
34
|
-
"baseInterface": "BaseValueField",
|
|
35
|
-
"props": {
|
|
36
|
-
"rows": {
|
|
37
|
-
"name": "rows",
|
|
38
|
-
"type": "number",
|
|
39
|
-
"description": "Number of visible text lines",
|
|
40
|
-
"required": false,
|
|
41
|
-
"default": 3
|
|
42
|
-
},
|
|
43
|
-
"placeholder": {
|
|
44
|
-
"name": "placeholder",
|
|
45
|
-
"type": "DynamicText",
|
|
46
|
-
"description": "Placeholder text displayed when field is empty",
|
|
47
|
-
"required": false
|
|
48
|
-
}
|
|
49
|
-
},
|
|
50
|
-
"validationSupported": true,
|
|
51
|
-
"source": "adapter",
|
|
52
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
53
|
-
"example": "{\n key: 'description',\n type: 'textarea',\n label: 'Description',\n props: { rows: 5, placeholder: 'Enter description...' }\n}",
|
|
54
|
-
"minimalExample": "{ key: 'bio', type: 'textarea', label: 'Bio' }"
|
|
55
|
-
},
|
|
56
|
-
{
|
|
57
|
-
"type": "select",
|
|
58
|
-
"category": "value",
|
|
59
|
-
"description": "Dropdown selection field with single or multiple selection",
|
|
60
|
-
"valueType": "T | T[]",
|
|
61
|
-
"baseInterface": "BaseValueField",
|
|
62
|
-
"props": {
|
|
63
|
-
"options": {
|
|
64
|
-
"name": "options",
|
|
65
|
-
"type": "FieldOption[]",
|
|
66
|
-
"description": "Array of selectable options with label and value. IMPORTANT: options goes at FIELD level, NOT inside props",
|
|
67
|
-
"required": true
|
|
68
|
-
},
|
|
69
|
-
"multiple": {
|
|
70
|
-
"name": "multiple",
|
|
71
|
-
"type": "boolean",
|
|
72
|
-
"description": "Allow multiple selections",
|
|
73
|
-
"required": false,
|
|
74
|
-
"default": false
|
|
75
|
-
},
|
|
76
|
-
"placeholder": {
|
|
77
|
-
"name": "placeholder",
|
|
78
|
-
"type": "DynamicText",
|
|
79
|
-
"description": "Placeholder text for empty selection",
|
|
80
|
-
"required": false
|
|
81
|
-
}
|
|
82
|
-
},
|
|
83
|
-
"validationSupported": true,
|
|
84
|
-
"source": "adapter",
|
|
85
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
86
|
-
"example": "{\n key: 'country',\n type: 'select',\n label: 'Country',\n required: true,\n options: [\n { label: 'United States', value: 'us' },\n { label: 'Canada', value: 'ca' }\n ]\n}",
|
|
87
|
-
"minimalExample": "{ key: 'status', type: 'select', label: 'Status', options: [{ label: 'Active', value: 'active' }] }"
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
"type": "checkbox",
|
|
91
|
-
"category": "value",
|
|
92
|
-
"description": "Boolean toggle checkbox field",
|
|
93
|
-
"valueType": "boolean",
|
|
94
|
-
"baseInterface": "BaseCheckedField",
|
|
95
|
-
"props": {},
|
|
96
|
-
"validationSupported": true,
|
|
97
|
-
"source": "adapter",
|
|
98
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
99
|
-
"example": "{\n key: 'acceptTerms',\n type: 'checkbox',\n label: 'I accept the terms and conditions',\n required: true\n}",
|
|
100
|
-
"minimalExample": "{ key: 'agree', type: 'checkbox', label: 'I agree' }"
|
|
101
|
-
},
|
|
102
|
-
{
|
|
103
|
-
"type": "multi-checkbox",
|
|
104
|
-
"category": "value",
|
|
105
|
-
"description": "Multiple checkbox group for selecting multiple values from options",
|
|
106
|
-
"valueType": "T[]",
|
|
107
|
-
"baseInterface": "BaseValueField",
|
|
108
|
-
"props": {
|
|
109
|
-
"options": {
|
|
110
|
-
"name": "options",
|
|
111
|
-
"type": "FieldOption[]",
|
|
112
|
-
"description": "Array of selectable options. IMPORTANT: options goes at FIELD level, NOT inside props",
|
|
113
|
-
"required": true
|
|
114
|
-
}
|
|
115
|
-
},
|
|
116
|
-
"validationSupported": true,
|
|
117
|
-
"source": "adapter",
|
|
118
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
119
|
-
"example": "{\n key: 'interests',\n type: 'multi-checkbox',\n label: 'Select your interests',\n options: [\n { label: 'Sports', value: 'sports' },\n { label: 'Music', value: 'music' },\n { label: 'Art', value: 'art' },\n { label: 'Technology', value: 'tech' }\n ]\n}",
|
|
120
|
-
"minimalExample": "{ key: 'tags', type: 'multi-checkbox', label: 'Tags', options: [{ label: 'A', value: 'a' }] }"
|
|
121
|
-
},
|
|
122
|
-
{
|
|
123
|
-
"type": "radio",
|
|
124
|
-
"category": "value",
|
|
125
|
-
"description": "Radio button group for single selection from options",
|
|
126
|
-
"valueType": "T",
|
|
127
|
-
"baseInterface": "BaseValueField",
|
|
128
|
-
"props": {
|
|
129
|
-
"options": {
|
|
130
|
-
"name": "options",
|
|
131
|
-
"type": "FieldOption[]",
|
|
132
|
-
"description": "Array of selectable options. IMPORTANT: options goes at FIELD level, NOT inside props",
|
|
133
|
-
"required": true
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
"validationSupported": true,
|
|
137
|
-
"source": "adapter",
|
|
138
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
139
|
-
"example": "{\n key: 'gender',\n type: 'radio',\n label: 'Gender',\n options: [\n { label: 'Male', value: 'male' },\n { label: 'Female', value: 'female' },\n { label: 'Other', value: 'other' }\n ]\n}",
|
|
140
|
-
"minimalExample": "{ key: 'choice', type: 'radio', label: 'Choice', options: [{ label: 'Yes', value: 'yes' }, { label: 'No', value: 'no' }] }"
|
|
141
|
-
},
|
|
142
|
-
{
|
|
143
|
-
"type": "datepicker",
|
|
144
|
-
"category": "value",
|
|
145
|
-
"description": "Date selection field with calendar picker",
|
|
146
|
-
"valueType": "Date | string",
|
|
147
|
-
"baseInterface": "BaseValueField",
|
|
148
|
-
"props": {
|
|
149
|
-
"minDate": {
|
|
150
|
-
"name": "minDate",
|
|
151
|
-
"type": "Date | string",
|
|
152
|
-
"description": "Minimum selectable date",
|
|
153
|
-
"required": false
|
|
154
|
-
},
|
|
155
|
-
"maxDate": {
|
|
156
|
-
"name": "maxDate",
|
|
157
|
-
"type": "Date | string",
|
|
158
|
-
"description": "Maximum selectable date",
|
|
159
|
-
"required": false
|
|
160
|
-
}
|
|
161
|
-
},
|
|
162
|
-
"validationSupported": true,
|
|
163
|
-
"source": "adapter",
|
|
164
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
165
|
-
"example": "{\n key: 'birthDate',\n type: 'datepicker',\n label: 'Date of Birth',\n required: true,\n props: { maxDate: new Date() }\n}",
|
|
166
|
-
"minimalExample": "{ key: 'date', type: 'datepicker', label: 'Date' }"
|
|
167
|
-
},
|
|
168
|
-
{
|
|
169
|
-
"type": "toggle",
|
|
170
|
-
"category": "value",
|
|
171
|
-
"description": "Switch/toggle control for boolean values",
|
|
172
|
-
"valueType": "boolean",
|
|
173
|
-
"baseInterface": "BaseCheckedField",
|
|
174
|
-
"props": {},
|
|
175
|
-
"validationSupported": true,
|
|
176
|
-
"source": "adapter",
|
|
177
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
178
|
-
"example": "{\n key: 'notifications',\n type: 'toggle',\n label: 'Enable notifications'\n}",
|
|
179
|
-
"minimalExample": "{ key: 'enabled', type: 'toggle', label: 'Enable' }"
|
|
180
|
-
},
|
|
181
|
-
{
|
|
182
|
-
"type": "slider",
|
|
183
|
-
"category": "value",
|
|
184
|
-
"description": "Numeric range slider for value selection",
|
|
185
|
-
"valueType": "number",
|
|
186
|
-
"baseInterface": "BaseValueField",
|
|
187
|
-
"props": {
|
|
188
|
-
"minValue": {
|
|
189
|
-
"name": "minValue",
|
|
190
|
-
"type": "number",
|
|
191
|
-
"description": "Minimum value. IMPORTANT: This is at FIELD level, NOT inside props",
|
|
192
|
-
"required": false,
|
|
193
|
-
"default": 0
|
|
194
|
-
},
|
|
195
|
-
"maxValue": {
|
|
196
|
-
"name": "maxValue",
|
|
197
|
-
"type": "number",
|
|
198
|
-
"description": "Maximum value. IMPORTANT: This is at FIELD level, NOT inside props",
|
|
199
|
-
"required": false,
|
|
200
|
-
"default": 100
|
|
201
|
-
},
|
|
202
|
-
"step": {
|
|
203
|
-
"name": "step",
|
|
204
|
-
"type": "number",
|
|
205
|
-
"description": "Step increment. IMPORTANT: This is at FIELD level, NOT inside props",
|
|
206
|
-
"required": false,
|
|
207
|
-
"default": 1
|
|
208
|
-
}
|
|
209
|
-
},
|
|
210
|
-
"validationSupported": true,
|
|
211
|
-
"source": "adapter",
|
|
212
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
213
|
-
"example": "{\n key: 'volume',\n type: 'slider',\n label: 'Volume',\n value: 50,\n minValue: 0,\n maxValue: 100,\n step: 5\n}",
|
|
214
|
-
"minimalExample": "{ key: 'rating', type: 'slider', label: 'Rating' }"
|
|
215
|
-
},
|
|
216
|
-
{
|
|
217
|
-
"type": "hidden",
|
|
218
|
-
"category": "value",
|
|
219
|
-
"description": "Hidden field that participates in form values without rendering. REQUIRED: The \"value\" property MUST be provided (string, number, boolean, or array). FORBIDDEN: label, logic, validators, required, props, disabled, readonly, hidden, col, tabIndex, meta - hidden fields are purely for passing values through the form. IMPORTANT: In multi-page forms, hidden fields must go INSIDE a page, not at the root level.",
|
|
220
|
-
"valueType": "string | number | boolean | (string | number | boolean)[]",
|
|
221
|
-
"baseInterface": "FieldDef",
|
|
222
|
-
"props": {},
|
|
223
|
-
"validationSupported": false,
|
|
224
|
-
"source": "core",
|
|
225
|
-
"allowedIn": ["top-level (single-page forms only)", "page.fields", "group.fields", "array.fields"],
|
|
226
|
-
"notAllowedIn": ["row", "top-level when using pages"],
|
|
227
|
-
"example": "// Hidden field - value is REQUIRED!\n{\n key: 'userId',\n type: 'hidden',\n value: 'abc123' // REQUIRED: string, number, boolean, or array\n}\n\n// Valid value types:\n{ key: 'count', type: 'hidden', value: 42 } // number\n{ key: 'active', type: 'hidden', value: true } // boolean\n{ key: 'tags', type: 'hidden', value: [1, 2, 3] } // array\n\n// ❌ FORBIDDEN (will cause validation error):\n// - label, logic, validators, required, props\n// - disabled, readonly, hidden, col, tabIndex, meta\n// - Validation shorthand: email, min, max, minLength, maxLength, pattern",
|
|
228
|
-
"minimalExample": "{ key: 'id', type: 'hidden', value: 'abc123' }"
|
|
229
|
-
},
|
|
230
|
-
{
|
|
231
|
-
"type": "text",
|
|
232
|
-
"category": "display",
|
|
233
|
-
"description": "Static text display element (headings, paragraphs, spans). The text content comes from the label property.",
|
|
234
|
-
"baseInterface": "FieldDef",
|
|
235
|
-
"props": {
|
|
236
|
-
"elementType": {
|
|
237
|
-
"name": "elementType",
|
|
238
|
-
"type": "'h1' | 'h2' | 'h3' | 'h4' | 'h5' | 'h6' | 'p' | 'span'",
|
|
239
|
-
"description": "HTML element type for rendering",
|
|
240
|
-
"required": false,
|
|
241
|
-
"default": "p"
|
|
242
|
-
}
|
|
243
|
-
},
|
|
244
|
-
"validationSupported": false,
|
|
245
|
-
"source": "core",
|
|
246
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
247
|
-
"example": "{\n key: 'sectionTitle',\n type: 'text',\n label: 'Personal Information',\n props: { elementType: 'h2' }\n}",
|
|
248
|
-
"minimalExample": "{ key: 'header', type: 'text', label: 'Section Title' }"
|
|
249
|
-
},
|
|
250
|
-
{
|
|
251
|
-
"type": "row",
|
|
252
|
-
"category": "container",
|
|
253
|
-
"description": "Horizontal layout container for grouping fields in columns. Rows do NOT have a label property and do NOT support logic blocks.",
|
|
254
|
-
"baseInterface": "FieldDef",
|
|
255
|
-
"props": {
|
|
256
|
-
"fields": {
|
|
257
|
-
"name": "fields",
|
|
258
|
-
"type": "RowAllowedChildren[]",
|
|
259
|
-
"description": "Child fields to render horizontally. Allowed: groups, arrays, VALUE fields (input, select, etc). NOT ALLOWED: pages, rows, hidden fields",
|
|
260
|
-
"required": true
|
|
261
|
-
}
|
|
262
|
-
},
|
|
263
|
-
"validationSupported": false,
|
|
264
|
-
"source": "core",
|
|
265
|
-
"allowedIn": ["top-level", "page", "group", "array"],
|
|
266
|
-
"notAllowedIn": ["row"],
|
|
267
|
-
"canContain": [
|
|
268
|
-
"group",
|
|
269
|
-
"array",
|
|
270
|
-
"input",
|
|
271
|
-
"textarea",
|
|
272
|
-
"select",
|
|
273
|
-
"checkbox",
|
|
274
|
-
"multi-checkbox",
|
|
275
|
-
"radio",
|
|
276
|
-
"datepicker",
|
|
277
|
-
"toggle",
|
|
278
|
-
"slider",
|
|
279
|
-
"text",
|
|
280
|
-
"button",
|
|
281
|
-
"submit",
|
|
282
|
-
"next",
|
|
283
|
-
"previous"
|
|
284
|
-
],
|
|
285
|
-
"cannotContain": ["page", "row", "hidden"],
|
|
286
|
-
"example": "{\n key: 'nameRow',\n type: 'row',\n // NOTE: Rows do NOT have label or logic properties\n fields: [\n { key: 'firstName', type: 'input', label: 'First Name', col: 6 },\n { key: 'lastName', type: 'input', label: 'Last Name', col: 6 }\n ]\n}\n// NOT ALLOWED in rows:\n// - type: 'hidden' (hidden fields cannot be inside rows)\n// - type: 'page' (pages are top-level only)\n// - type: 'row' (no nested rows)",
|
|
287
|
-
"minimalExample": "{ key: 'row1', type: 'row', fields: [...] }"
|
|
288
|
-
},
|
|
289
|
-
{
|
|
290
|
-
"type": "group",
|
|
291
|
-
"category": "container",
|
|
292
|
-
"description": "Nested form group container creating a sub-object in form values. Groups are logical containers only and do NOT have a label property.",
|
|
293
|
-
"valueType": "object",
|
|
294
|
-
"baseInterface": "FieldDef",
|
|
295
|
-
"props": {
|
|
296
|
-
"fields": {
|
|
297
|
-
"name": "fields",
|
|
298
|
-
"type": "GroupAllowedChildren[]",
|
|
299
|
-
"description": "Child fields in the group. Allowed: rows, leaf fields (NOT pages or other groups)",
|
|
300
|
-
"required": true
|
|
301
|
-
}
|
|
302
|
-
},
|
|
303
|
-
"validationSupported": true,
|
|
304
|
-
"source": "core",
|
|
305
|
-
"allowedIn": ["top-level", "page", "row", "array"],
|
|
306
|
-
"notAllowedIn": ["group"],
|
|
307
|
-
"canContain": [
|
|
308
|
-
"row",
|
|
309
|
-
"input",
|
|
310
|
-
"textarea",
|
|
311
|
-
"select",
|
|
312
|
-
"checkbox",
|
|
313
|
-
"multi-checkbox",
|
|
314
|
-
"radio",
|
|
315
|
-
"datepicker",
|
|
316
|
-
"toggle",
|
|
317
|
-
"slider",
|
|
318
|
-
"hidden",
|
|
319
|
-
"text",
|
|
320
|
-
"button",
|
|
321
|
-
"submit",
|
|
322
|
-
"next",
|
|
323
|
-
"previous"
|
|
324
|
-
],
|
|
325
|
-
"cannotContain": ["page", "group"],
|
|
326
|
-
"example": "{\n key: 'address',\n type: 'group',\n // NOTE: Groups do NOT have a label property\n fields: [\n { key: 'street', type: 'input', label: 'Street' },\n { key: 'city', type: 'input', label: 'City' },\n { key: 'zip', type: 'input', label: 'ZIP Code' }\n ]\n}",
|
|
327
|
-
"minimalExample": "{ key: 'address', type: 'group', fields: [...] }"
|
|
328
|
-
},
|
|
329
|
-
{
|
|
330
|
-
"type": "array",
|
|
331
|
-
"category": "container",
|
|
332
|
-
"description": "Repeatable field group for dynamic lists/arrays. Arrays do NOT have label, minItems, or maxItems properties. Use \"fields\" (not \"template\") to define the item template.",
|
|
333
|
-
"valueType": "T[]",
|
|
334
|
-
"baseInterface": "FieldDef",
|
|
335
|
-
"props": {
|
|
336
|
-
"fields": {
|
|
337
|
-
"name": "fields",
|
|
338
|
-
"type": "ArrayAllowedChildren[]",
|
|
339
|
-
"description": "Template field(s) for each array item. Allowed: rows, groups, leaf fields (NOT pages or other arrays)",
|
|
340
|
-
"required": true
|
|
341
|
-
}
|
|
342
|
-
},
|
|
343
|
-
"validationSupported": false,
|
|
344
|
-
"source": "core",
|
|
345
|
-
"allowedIn": ["top-level", "page", "row", "group"],
|
|
346
|
-
"notAllowedIn": ["array"],
|
|
347
|
-
"canContain": [
|
|
348
|
-
"row",
|
|
349
|
-
"group",
|
|
350
|
-
"input",
|
|
351
|
-
"textarea",
|
|
352
|
-
"select",
|
|
353
|
-
"checkbox",
|
|
354
|
-
"multi-checkbox",
|
|
355
|
-
"radio",
|
|
356
|
-
"datepicker",
|
|
357
|
-
"toggle",
|
|
358
|
-
"slider",
|
|
359
|
-
"hidden",
|
|
360
|
-
"text",
|
|
361
|
-
"button",
|
|
362
|
-
"submit",
|
|
363
|
-
"next",
|
|
364
|
-
"previous"
|
|
365
|
-
],
|
|
366
|
-
"cannotContain": ["page", "array"],
|
|
367
|
-
"example": "// Flat array (primitive values)\n{\n key: 'tags',\n type: 'array',\n // NOTE: Arrays do NOT have label, minItems, or maxItems\n fields: [\n { key: 'tag', type: 'input', label: 'Tag' }\n ]\n}\n// Result: { tags: ['value1', 'value2'] }\n\n// Object array (nested groups)\n{\n key: 'contacts',\n type: 'array',\n fields: [{\n type: 'group',\n fields: [\n { key: 'name', type: 'input', label: 'Name' },\n { key: 'email', type: 'input', label: 'Email' }\n ]\n }]\n}\n// Result: { contacts: [{name: '', email: ''}, ...] }",
|
|
368
|
-
"minimalExample": "{ key: 'items', type: 'array', fields: [...] }"
|
|
369
|
-
},
|
|
370
|
-
{
|
|
371
|
-
"type": "page",
|
|
372
|
-
"category": "container",
|
|
373
|
-
"description": "Multi-step form page container for wizard-style forms. Pages do NOT have label or title properties. ALL top-level fields must be pages if using multi-page mode. IMPORTANT: Navigation buttons (next, previous) must be added as fields WITHIN each page that needs them.",
|
|
374
|
-
"baseInterface": "FieldDef",
|
|
375
|
-
"props": {
|
|
376
|
-
"fields": {
|
|
377
|
-
"name": "fields",
|
|
378
|
-
"type": "PageAllowedChildren[]",
|
|
379
|
-
"description": "Fields in this page. Allowed: rows, groups, arrays, leaf fields (NOT other pages). Include next/previous buttons as needed.",
|
|
380
|
-
"required": true
|
|
381
|
-
}
|
|
382
|
-
},
|
|
383
|
-
"validationSupported": false,
|
|
384
|
-
"source": "core",
|
|
385
|
-
"allowedIn": ["top-level"],
|
|
386
|
-
"notAllowedIn": ["page", "row", "group", "array"],
|
|
387
|
-
"canContain": [
|
|
388
|
-
"row",
|
|
389
|
-
"group",
|
|
390
|
-
"array",
|
|
391
|
-
"input",
|
|
392
|
-
"textarea",
|
|
393
|
-
"select",
|
|
394
|
-
"checkbox",
|
|
395
|
-
"multi-checkbox",
|
|
396
|
-
"radio",
|
|
397
|
-
"datepicker",
|
|
398
|
-
"toggle",
|
|
399
|
-
"slider",
|
|
400
|
-
"hidden",
|
|
401
|
-
"text",
|
|
402
|
-
"button",
|
|
403
|
-
"submit",
|
|
404
|
-
"next",
|
|
405
|
-
"previous"
|
|
406
|
-
],
|
|
407
|
-
"cannotContain": ["page"],
|
|
408
|
-
"example": "{\n key: 'step1',\n type: 'page',\n // NOTE: Pages do NOT have label or title properties\n // Navigation buttons are fields WITHIN the page\n fields: [\n { key: 'firstName', type: 'input', label: 'First Name' },\n { key: 'lastName', type: 'input', label: 'Last Name' },\n { key: 'next', type: 'next', label: 'Next' }\n ]\n}",
|
|
409
|
-
"minimalExample": "{ key: 'step1', type: 'page', fields: [...] }"
|
|
410
|
-
},
|
|
411
|
-
{
|
|
412
|
-
"type": "next",
|
|
413
|
-
"category": "button",
|
|
414
|
-
"description": "Navigation button to go to next page in multi-step forms. Must be placed INSIDE a page's fields array.",
|
|
415
|
-
"baseInterface": "FieldDef",
|
|
416
|
-
"props": {},
|
|
417
|
-
"validationSupported": false,
|
|
418
|
-
"source": "adapter",
|
|
419
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
420
|
-
"example": "{\n key: 'next',\n type: 'next',\n label: 'Next'\n}",
|
|
421
|
-
"minimalExample": "{ key: 'next', type: 'next', label: 'Next' }"
|
|
422
|
-
},
|
|
423
|
-
{
|
|
424
|
-
"type": "previous",
|
|
425
|
-
"category": "button",
|
|
426
|
-
"description": "Navigation button to go to previous page in multi-step forms. Must be placed INSIDE a page's fields array.",
|
|
427
|
-
"baseInterface": "FieldDef",
|
|
428
|
-
"props": {},
|
|
429
|
-
"validationSupported": false,
|
|
430
|
-
"source": "adapter",
|
|
431
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
432
|
-
"example": "{\n key: 'back',\n type: 'previous',\n label: 'Back'\n}",
|
|
433
|
-
"minimalExample": "{ key: 'back', type: 'previous', label: 'Back' }"
|
|
434
|
-
},
|
|
435
|
-
{
|
|
436
|
-
"type": "button",
|
|
437
|
-
"category": "button",
|
|
438
|
-
"description": "Generic button for custom actions. IMPORTANT: The generic 'button' type REQUIRES the 'event' property with a FormEventConstructor. For simple use cases, prefer 'submit', 'next', or 'previous' which don't require event configuration.",
|
|
439
|
-
"baseInterface": "FieldDef",
|
|
440
|
-
"props": {
|
|
441
|
-
"event": {
|
|
442
|
-
"name": "event",
|
|
443
|
-
"type": "FormEventConstructor<TEvent>",
|
|
444
|
-
"description": "REQUIRED. Event constructor that will be emitted when button is clicked. Must be registered with provideFormEvents().",
|
|
445
|
-
"required": true
|
|
446
|
-
}
|
|
447
|
-
},
|
|
448
|
-
"validationSupported": false,
|
|
449
|
-
"source": "adapter",
|
|
450
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
451
|
-
"example": "// RECOMMENDED: Use pre-defined button types for common actions\n{ key: 'submit', type: 'submit', label: 'Submit Form' }\n{ key: 'next', type: 'next', label: 'Next' }\n{ key: 'back', type: 'previous', label: 'Back' }\n\n// ADVANCED: Generic button with custom event (requires setup)\n// 1. Create event class: class MyCustomEvent extends FormEvent {}\n// 2. Register with: provideFormEvents([MyCustomEvent])\n// 3. Use in config:\n{\n key: 'customAction',\n type: 'button',\n label: 'Custom Action',\n event: MyCustomEvent // Must be the class reference\n}",
|
|
452
|
-
"minimalExample": "{ key: 'action', type: 'button', label: 'Action', event: MyEvent }"
|
|
453
|
-
},
|
|
454
|
-
{
|
|
455
|
-
"type": "submit",
|
|
456
|
-
"category": "button",
|
|
457
|
-
"description": "Form submit button",
|
|
458
|
-
"baseInterface": "FieldDef",
|
|
459
|
-
"props": {},
|
|
460
|
-
"validationSupported": false,
|
|
461
|
-
"source": "adapter",
|
|
462
|
-
"allowedIn": ["top-level", "page", "row", "group", "array"],
|
|
463
|
-
"example": "{\n key: 'submit',\n type: 'submit',\n label: 'Submit Form'\n}",
|
|
464
|
-
"minimalExample": "{ key: 'submit', type: 'submit', label: 'Submit' }"
|
|
465
|
-
},
|
|
466
|
-
{
|
|
467
|
-
"type": "addArrayItem",
|
|
468
|
-
"category": "button",
|
|
469
|
-
"description": "Button to add a new item to an array field. Must be placed within or near the array container.",
|
|
470
|
-
"baseInterface": "FieldDef",
|
|
471
|
-
"props": {},
|
|
472
|
-
"validationSupported": false,
|
|
473
|
-
"source": "adapter",
|
|
474
|
-
"allowedIn": ["array", "row", "group"],
|
|
475
|
-
"example": "{\n key: 'addContact',\n type: 'addArrayItem',\n label: 'Add Contact'\n}",
|
|
476
|
-
"minimalExample": "{ key: 'add', type: 'addArrayItem', label: 'Add Item' }"
|
|
477
|
-
},
|
|
478
|
-
{
|
|
479
|
-
"type": "removeArrayItem",
|
|
480
|
-
"category": "button",
|
|
481
|
-
"description": "Button to remove the current item from an array field. Typically placed within each array item template.",
|
|
482
|
-
"baseInterface": "FieldDef",
|
|
483
|
-
"props": {},
|
|
484
|
-
"validationSupported": false,
|
|
485
|
-
"source": "adapter",
|
|
486
|
-
"allowedIn": ["array", "row", "group"],
|
|
487
|
-
"example": "{\n key: 'removeContact',\n type: 'removeArrayItem',\n label: 'Remove'\n}",
|
|
488
|
-
"minimalExample": "{ key: 'remove', type: 'removeArrayItem', label: 'Remove' }"
|
|
489
|
-
}
|
|
490
|
-
]
|