@webiny/mcp 6.3.0-beta.2 → 6.3.0-beta.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/package.json +7 -4
- package/skills/admin/form-model/SKILL.md +527 -0
- package/skills/admin/website-builder/page-settings/SKILL.md +216 -0
- package/skills/api/v5-to-v6-migration/SKILL.md +367 -18
- package/skills/content-models/SKILL.md +261 -23
- package/skills/generated/admin/SKILL.md +16 -1
- package/skills/generated/admin/cms/SKILL.md +26 -1
- package/skills/generated/admin/form/SKILL.md +58 -1
- package/skills/generated/admin/ui/SKILL.md +26 -1
- package/skills/generated/admin/website-builder/SKILL.md +11 -1
- package/skills/generated/api/mailer/SKILL.md +74 -0
- package/skills/generated/api/tenant-manager/SKILL.md +36 -1
- package/skills/generated/infra/SKILL.md +3 -6
- package/skills/mailer-smtp/SKILL.md +98 -0
- package/skills/project-structure/SKILL.md +0 -1
- package/skills/webiny-sdk/SKILL.md +111 -3
- package/skills/website-builder/SKILL.md +91 -4
|
@@ -5,10 +5,19 @@ description: >
|
|
|
5
5
|
Creating Headless CMS content models via code using the ModelFactory pattern.
|
|
6
6
|
Use this skill when the developer wants to create, modify, or understand content model
|
|
7
7
|
definitions, define fields and validators, set up reference fields between models,
|
|
8
|
-
configure field layouts
|
|
9
|
-
|
|
10
|
-
|
|
8
|
+
configure field layouts (including nested layouts inside object or dynamicZone fields),
|
|
9
|
+
pick the correct Admin UI renderer for a field type (textInput/textInputs,
|
|
10
|
+
lexicalEditor/lexicalEditors, file/files, objectAccordionSingle/objectAccordionMultiple, etc.),
|
|
11
|
+
or work with the ModelFactory builder API. Also covers field types
|
|
12
|
+
(text, longText, number, boolean, datetime, file, ref, object, richText, dynamicZone),
|
|
13
|
+
list (array) fields via .list() and the singular-vs-plural renderer rule,
|
|
14
|
+
validation (required, unique, email, pattern, minLength, maxLength, gte, predefinedValues),
|
|
11
15
|
single-entry (singleton) models via .singleEntry(), and model/field tags via .tags().
|
|
16
|
+
Includes the correct `fields` projection syntax when querying entries via the SDK:
|
|
17
|
+
`ref` fields use double-`values.` nesting (e.g. `values.author.values.name`) because
|
|
18
|
+
they resolve to another entry, while `object` and `dynamicZone` sub-fields are inline
|
|
19
|
+
and use a single `values.` (e.g. `values.author.name`) — getting this wrong silently
|
|
20
|
+
returns null.
|
|
12
21
|
---
|
|
13
22
|
|
|
14
23
|
# Creating Content Models via Code
|
|
@@ -74,19 +83,183 @@ Register in `webiny.config.tsx`:
|
|
|
74
83
|
| `.singleEntry()` | Makes the model a singleton (only one entry can exist). Automatically adds the `"singleEntry"` tag. |
|
|
75
84
|
| `.tags(["tag1", "tag2"])` | Assign custom tags to the model. The tag `"type:model"` is always added automatically. Duplicates are removed. |
|
|
76
85
|
|
|
77
|
-
##
|
|
86
|
+
## Layout
|
|
78
87
|
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
88
|
+
`.layout()` takes a two-dimensional array of field IDs. Each inner array is one row in
|
|
89
|
+
the Admin editor, and each entry within a row is a column cell. Field IDs must exactly
|
|
90
|
+
match the keys used in `.fields()`.
|
|
91
|
+
|
|
92
|
+
### Top-level layout
|
|
93
|
+
|
|
94
|
+
```typescript
|
|
95
|
+
.layout([
|
|
96
|
+
["name", "slug"], // row 1: two columns
|
|
97
|
+
["description"], // row 2: one column, full width
|
|
98
|
+
["category", "price"]
|
|
99
|
+
])
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
### Nested layout inside an `object` field
|
|
103
|
+
|
|
104
|
+
`object` fields have their own `.fields()` and `.layout()` that only reference the
|
|
105
|
+
object's own sub-fields. The outer model layout should refer to the object field as a
|
|
106
|
+
whole; its internal arrangement is owned by the object itself.
|
|
107
|
+
|
|
108
|
+
```typescript
|
|
109
|
+
.fields((fields) => ({
|
|
110
|
+
name: fields.text().renderer("textInput").label("Name"),
|
|
111
|
+
address: fields
|
|
112
|
+
.object()
|
|
113
|
+
.renderer("objectAccordionSingle")
|
|
114
|
+
.label("Address")
|
|
115
|
+
.fields((sub) => ({
|
|
116
|
+
street: sub.text().renderer("textInput").label("Street"),
|
|
117
|
+
city: sub.text().renderer("textInput").label("City"),
|
|
118
|
+
zip: sub.text().renderer("textInput").label("ZIP")
|
|
119
|
+
}))
|
|
120
|
+
.layout([
|
|
121
|
+
["street"], // inner layout — only uses sub-field IDs
|
|
122
|
+
["city", "zip"]
|
|
123
|
+
])
|
|
124
|
+
}))
|
|
125
|
+
.layout([
|
|
126
|
+
["name"],
|
|
127
|
+
["address"] // outer layout just references the object field
|
|
128
|
+
])
|
|
129
|
+
```
|
|
130
|
+
|
|
131
|
+
### Nested layout inside a `dynamicZone` field
|
|
132
|
+
|
|
133
|
+
`dynamicZone` is an array field where each entry is one of several named templates.
|
|
134
|
+
Every template declares its own fields **and** its own layout, scoped to that template.
|
|
135
|
+
The outer model layout simply references the dynamicZone field by its ID.
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
.fields((fields) => ({
|
|
139
|
+
blocks: fields
|
|
140
|
+
.dynamicZone()
|
|
141
|
+
.label("Content blocks")
|
|
142
|
+
.template("hero", {
|
|
143
|
+
name: "Hero",
|
|
144
|
+
gqlTypeName: "HeroBlock",
|
|
145
|
+
fields: (t) => ({
|
|
146
|
+
heading: t.text().renderer("textInput").label("Heading"),
|
|
147
|
+
image: t.file().renderer("file").label("Image")
|
|
148
|
+
}),
|
|
149
|
+
layout: [
|
|
150
|
+
["heading"], // layout inside the "hero" template only
|
|
151
|
+
["image"]
|
|
152
|
+
]
|
|
153
|
+
})
|
|
154
|
+
.template("quote", {
|
|
155
|
+
name: "Quote",
|
|
156
|
+
gqlTypeName: "QuoteBlock",
|
|
157
|
+
fields: (t) => ({
|
|
158
|
+
text: t.longText().renderer("textarea").label("Quote text"),
|
|
159
|
+
author: t.text().renderer("textInput").label("Author")
|
|
160
|
+
}),
|
|
161
|
+
layout: [
|
|
162
|
+
["text"],
|
|
163
|
+
["author"]
|
|
164
|
+
]
|
|
165
|
+
})
|
|
166
|
+
}))
|
|
167
|
+
.layout([
|
|
168
|
+
["blocks"] // outer layout references the dynamicZone as a whole
|
|
169
|
+
])
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Rule of thumb: **a layout can only reference field IDs in the same scope it's declared
|
|
173
|
+
in.** Model layout references model fields. Object layout references that object's
|
|
174
|
+
sub-fields. Each dynamicZone template's layout references only that template's fields.
|
|
175
|
+
|
|
176
|
+
## Field Types and Renderers
|
|
177
|
+
|
|
178
|
+
Every field type exposes two renderer variants: a **single-value** renderer (used by
|
|
179
|
+
default) and a **multi-value** renderer (used when the field is marked as a list via
|
|
180
|
+
`.list()`). You **MUST** pair the renderer with the cardinality: calling `.list()`
|
|
181
|
+
requires a renderer from the `list: true` column, and omitting `.list()` requires one
|
|
182
|
+
from the `list: false` column. Using the wrong variant will render incorrectly in the
|
|
183
|
+
Admin UI and the field may fail to save values. Invented names (e.g. `"fileInput"`,
|
|
184
|
+
`"lexicalTextInput"`, `"objectInput"`, `"boolean"`) will silently misbehave the same way.
|
|
185
|
+
|
|
186
|
+
Exception: `fields.boolean()` has no multi-value variant — do not call `.list()` on
|
|
187
|
+
boolean fields.
|
|
188
|
+
|
|
189
|
+
The authoritative source for this list is
|
|
190
|
+
`@webiny/api-headless-cms/features/modelBuilder/fields/DataFieldBuilder.d.ts` (in the
|
|
191
|
+
project's `node_modules`) — if you're unsure, grep there first.
|
|
192
|
+
|
|
193
|
+
| Builder Method | Description | Single (`list: false`) | Multiple (`list: true`) |
|
|
194
|
+
| ---------------------- | ---------------------------------------- | ------------------------------------------------------------------- | --------------------------------------------------------------------- |
|
|
195
|
+
| `fields.text()` | Single-line text | `"textInput"` | `"textInputs"` |
|
|
196
|
+
| `fields.longText()` | Multi-line text | `"textarea"` | `"textareas"` |
|
|
197
|
+
| `fields.richText()` | Rich text (Lexical) | `"lexicalEditor"` | `"lexicalEditors"` |
|
|
198
|
+
| `fields.number()` | Numeric value | `"numberInput"` | `"numberInputs"` |
|
|
199
|
+
| `fields.boolean()` | True/false toggle | `"switch"` | — (not supported) |
|
|
200
|
+
| `fields.datetime()` | Date/time picker | `"dateTimeInput"` | `"dateTimeInputs"` |
|
|
201
|
+
| `fields.file()` | File/image attachment | `"file"` | `"files"` |
|
|
202
|
+
| `fields.ref()` | Reference to another model | `"refDialogSingle"`, `"refAutocompleteSingle"`, `"refRadioButtons"` | `"refDialogMultiple"`, `"refAutocompleteMultiple"`, `"refCheckboxes"` |
|
|
203
|
+
| `fields.object()` | Nested object with sub-fields | `"objectAccordionSingle"` | `"objectAccordionMultiple"` |
|
|
204
|
+
| `fields.dynamicZone()` | Dynamic zone (choose-one-of-N templates) | `"dynamicZone"` | _(implicitly a list; see below)_ |
|
|
205
|
+
|
|
206
|
+
### Ref renderer families
|
|
207
|
+
|
|
208
|
+
The three `ref` renderer families look and behave very differently in the Admin UI —
|
|
209
|
+
pick the one that fits your UX:
|
|
210
|
+
|
|
211
|
+
- **Dialog** (`refDialogSingle` / `refDialogMultiple`) — opens a modal with a searchable,
|
|
212
|
+
filterable picker. Best for large reference sets.
|
|
213
|
+
- **Autocomplete** (`refAutocompleteSingle` / `refAutocompleteMultiple`) — inline
|
|
214
|
+
typeahead input. Best for moderate reference sets.
|
|
215
|
+
- **Inline** (`refRadioButtons` / `refCheckboxes`) — renders all referenced entries as
|
|
216
|
+
inline controls. Best for small, fixed reference sets.
|
|
217
|
+
|
|
218
|
+
### Alternative text/number renderers (with `predefinedValues`)
|
|
219
|
+
|
|
220
|
+
When a `text` or `number` field uses `.predefinedValues([...])`, additional renderers
|
|
221
|
+
become available:
|
|
222
|
+
|
|
223
|
+
- `"radioButtons"` — single-value; requires `list: false` and `predefinedValues`.
|
|
224
|
+
- `"dropdown"` — single-value; requires `list: false` and `predefinedValues`.
|
|
225
|
+
- `"checkboxes"` — multi-value; requires `list: true` and `predefinedValues`.
|
|
226
|
+
- `"tags"` — multi-value free-form entry; `text` only, requires `list: true` and NO
|
|
227
|
+
`predefinedValues`.
|
|
228
|
+
|
|
229
|
+
### List fields and renderer pluralization
|
|
230
|
+
|
|
231
|
+
When a field uses `.list()` (i.e. stores an array of values), the renderer **must** be the
|
|
232
|
+
plural variant from the right-hand column above. Pairing `.list()` with the singular
|
|
233
|
+
renderer causes the Admin UI to render the wrong component and the field will fail to
|
|
234
|
+
save correctly.
|
|
235
|
+
|
|
236
|
+
**Correct** — list of tags uses the plural `"textInputs"` renderer:
|
|
237
|
+
|
|
238
|
+
```typescript
|
|
239
|
+
tags: fields
|
|
240
|
+
.text()
|
|
241
|
+
.list()
|
|
242
|
+
.renderer("textInputs") // plural, because .list() is chained
|
|
243
|
+
.label("Tags");
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
**Wrong** — singular renderer on a list field (this is the pattern that breaks silently):
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
tags: fields
|
|
250
|
+
.text()
|
|
251
|
+
.list()
|
|
252
|
+
.renderer("textInput") // WRONG: should be "textInputs"
|
|
253
|
+
.label("Tags");
|
|
254
|
+
```
|
|
255
|
+
|
|
256
|
+
The same rule applies to every field type that has both variants:
|
|
257
|
+
`richText().list()` → `"lexicalEditors"`, `file().list()` → `"files"`,
|
|
258
|
+
`longText().list()` → `"textareas"`, `number().list()` → `"numberInputs"`,
|
|
259
|
+
`object().list()` → `"objectAccordionMultiple"`, and so on.
|
|
260
|
+
|
|
261
|
+
For `ref()` fields the pluralization rule is the same but the singular/multiple renderers
|
|
262
|
+
have distinct names (e.g. `refDialogSingle` → `refDialogMultiple`) — see the table.
|
|
90
263
|
|
|
91
264
|
## Field Validators (Chainable)
|
|
92
265
|
|
|
@@ -103,14 +276,79 @@ Register in `webiny.config.tsx`:
|
|
|
103
276
|
|
|
104
277
|
## Field Configuration (Chainable)
|
|
105
278
|
|
|
106
|
-
| Method | Description
|
|
107
|
-
| ------------------------------- |
|
|
108
|
-
| `.renderer("rendererName")` | Set the Admin UI renderer
|
|
109
|
-
| `.label("Display Name")` | Field label in the editor
|
|
110
|
-
| `.help("Helper text")` | Helper text shown below the field
|
|
111
|
-
| `.list()` | Make the field accept multiple values (arrays)
|
|
112
|
-
| `.models([{ modelId: "..." }])` | For `ref()` fields: which models can be referenced
|
|
113
|
-
| `.tags(["tag1"])` | Assign tags to a field (e.g., `"$bulk-edit"`)
|
|
279
|
+
| Method | Description |
|
|
280
|
+
| ------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
|
|
281
|
+
| `.renderer("rendererName")` | Set the Admin UI renderer |
|
|
282
|
+
| `.label("Display Name")` | Field label in the editor |
|
|
283
|
+
| `.help("Helper text")` | Helper text shown below the field |
|
|
284
|
+
| `.list()` | Make the field accept multiple values (arrays). Requires a multi-value renderer variant — see Field Types table. |
|
|
285
|
+
| `.models([{ modelId: "..." }])` | For `ref()` fields: which models can be referenced |
|
|
286
|
+
| `.tags(["tag1"])` | Assign tags to a field (e.g., `"$bulk-edit"`) |
|
|
287
|
+
|
|
288
|
+
## Querying `ref`, `object`, and `dynamicZone` fields
|
|
289
|
+
|
|
290
|
+
When you read entries via the Webiny SDK (or GraphQL), the `fields` array tells the API
|
|
291
|
+
which fields to return. **The nesting syntax depends on the field type**, and getting it
|
|
292
|
+
wrong silently returns `null` for the nested value.
|
|
293
|
+
|
|
294
|
+
### `ref` fields — double `values.` nesting
|
|
295
|
+
|
|
296
|
+
A reference field returns the **referenced entry**, which itself has its own `values`
|
|
297
|
+
wrapper around its fields. To project a sub-field of a referenced entry, you must
|
|
298
|
+
include the inner `values.` segment.
|
|
299
|
+
|
|
300
|
+
```typescript
|
|
301
|
+
// article model has: author: fields.ref().models([{ modelId: "author" }])
|
|
302
|
+
const { result } = await cms.articles.list({
|
|
303
|
+
fields: [
|
|
304
|
+
"id",
|
|
305
|
+
"values.title",
|
|
306
|
+
"values.author.values.name" // ref → double "values."
|
|
307
|
+
// ^^^^^^^^^^^^^^^^^^^^^^^^^
|
|
308
|
+
]
|
|
309
|
+
});
|
|
310
|
+
```
|
|
311
|
+
|
|
312
|
+
If `author` is a `.list()` ref field, the same rule applies — each item in the returned
|
|
313
|
+
array is an entry with its own `values` wrapper, so you still write
|
|
314
|
+
`values.authors.values.name`.
|
|
315
|
+
|
|
316
|
+
### `object` and `dynamicZone` fields — no inner `values.`
|
|
317
|
+
|
|
318
|
+
Object and dynamicZone sub-fields are stored **inline** on the parent entry, with no
|
|
319
|
+
intermediate `values` wrapper. Access sub-fields with a plain dotted path.
|
|
320
|
+
|
|
321
|
+
```typescript
|
|
322
|
+
// article model has:
|
|
323
|
+
// author: fields.object().fields(sub => ({ name: sub.text(), bio: sub.longText() }))
|
|
324
|
+
const { result } = await cms.articles.list({
|
|
325
|
+
fields: [
|
|
326
|
+
"id",
|
|
327
|
+
"values.title",
|
|
328
|
+
"values.author.name", // object → single "values."
|
|
329
|
+
"values.author.bio"
|
|
330
|
+
// ^^^^^^^^^^^^^^^^^
|
|
331
|
+
]
|
|
332
|
+
});
|
|
333
|
+
```
|
|
334
|
+
|
|
335
|
+
For `dynamicZone`, address sub-fields through the template name (still no inner
|
|
336
|
+
`values.`):
|
|
337
|
+
|
|
338
|
+
```typescript
|
|
339
|
+
// blocks: fields.dynamicZone().template("hero", { fields: t => ({ heading: t.text() }) })
|
|
340
|
+
fields: ["values.blocks.hero.heading"];
|
|
341
|
+
```
|
|
342
|
+
|
|
343
|
+
### Rule of thumb
|
|
344
|
+
|
|
345
|
+
- **`fields.ref()`** → the field resolves to another entry, so its sub-path goes through
|
|
346
|
+
`.values.` (e.g. `values.author.values.name`).
|
|
347
|
+
- **`fields.object()` / `fields.dynamicZone()`** → the field is inline, so its sub-path
|
|
348
|
+
is plain (e.g. `values.author.name`).
|
|
349
|
+
|
|
350
|
+
Mixing the two up is the most common cause of "the query worked but the field is
|
|
351
|
+
`null`" bugs. If you're unsure, cross-check the field definition in the model file.
|
|
114
352
|
|
|
115
353
|
## Full Examples
|
|
116
354
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: webiny-admin-catalog
|
|
3
3
|
context: webiny-api
|
|
4
4
|
description: >
|
|
5
|
-
admin —
|
|
5
|
+
admin — 22 abstractions.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# admin
|
|
@@ -70,6 +70,16 @@ Renders nothing — purely a data registration side-effect.
|
|
|
70
70
|
When the component unmounts (e.g., route change), the section
|
|
71
71
|
is automatically removed from DevTools.
|
|
72
72
|
|
|
73
|
+
---
|
|
74
|
+
**Name:** `FormModelFactory`
|
|
75
|
+
**Import:** `import { FormModelFactory } from "webiny/admin"`
|
|
76
|
+
**Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
**Name:** `LexicalContext`
|
|
80
|
+
**Import:** `import { LexicalContext } from "webiny/admin"`
|
|
81
|
+
**Source:** `@webiny/app-admin/features/tools/index.ts`
|
|
82
|
+
|
|
73
83
|
---
|
|
74
84
|
**Name:** `MainGraphQLClient`
|
|
75
85
|
**Import:** `import { MainGraphQLClient } from "webiny/admin"`
|
|
@@ -116,6 +126,11 @@ is automatically removed from DevTools.
|
|
|
116
126
|
**Import:** `import { ToolsFeature } from "webiny/admin"`
|
|
117
127
|
**Source:** `@webiny/app-admin/features/tools/index.ts`
|
|
118
128
|
|
|
129
|
+
---
|
|
130
|
+
**Name:** `useBuildParams`
|
|
131
|
+
**Import:** `import { useBuildParams } from "webiny/admin"`
|
|
132
|
+
**Source:** `@webiny/app-admin/presentation/buildParams/useBuildParams.ts`
|
|
133
|
+
|
|
119
134
|
---
|
|
120
135
|
**Name:** `useFeature`
|
|
121
136
|
**Import:** `import { useFeature } from "webiny/admin"`
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: webiny-admin-cms-catalog
|
|
3
3
|
context: webiny-api
|
|
4
4
|
description: >
|
|
5
|
-
admin/cms —
|
|
5
|
+
admin/cms — 74 abstractions.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# admin/cms
|
|
@@ -173,6 +173,11 @@ description: >
|
|
|
173
173
|
**Import:** `import type { EntryAfterUpdatePayload } from "webiny/admin/cms"`
|
|
174
174
|
**Source:** `@webiny/app-headless-cms/features/contentEntry/events/index.ts`
|
|
175
175
|
|
|
176
|
+
---
|
|
177
|
+
**Name:** `Fields`
|
|
178
|
+
**Import:** `import { Fields } from "webiny/admin/cms/field-renderers/common"`
|
|
179
|
+
**Source:** `@webiny/app-headless-cms-common/index.ts`
|
|
180
|
+
|
|
176
181
|
---
|
|
177
182
|
**Name:** `getNodeFromSelection`
|
|
178
183
|
**Import:** `import { getNodeFromSelection } from "webiny/admin/cms/lexical"`
|
|
@@ -230,6 +235,16 @@ description: >
|
|
|
230
235
|
**Import:** `import { MultiValueItemContainer } from "webiny/admin/cms/field-renderers/object"`
|
|
231
236
|
**Source:** `@webiny/app-headless-cms/admin/plugins/fieldRenderers/object/MultiValueItemContainer.tsx`
|
|
232
237
|
|
|
238
|
+
---
|
|
239
|
+
**Name:** `ParentFieldProvider`
|
|
240
|
+
**Import:** `import { ParentFieldProvider } from "webiny/admin/cms/field-renderers/common"`
|
|
241
|
+
**Source:** `@webiny/app-headless-cms/admin/components/ContentEntryForm/ParentValue.tsx`
|
|
242
|
+
|
|
243
|
+
---
|
|
244
|
+
**Name:** `ParentValueIndexProvider`
|
|
245
|
+
**Import:** `import { ParentValueIndexProvider } from "webiny/admin/cms/field-renderers/common"`
|
|
246
|
+
**Source:** `@webiny/app-headless-cms-common/index.ts`
|
|
247
|
+
|
|
233
248
|
---
|
|
234
249
|
**Name:** `PermissionsEditor`
|
|
235
250
|
**Import:** `import { PermissionsEditor } from "webiny/admin/cms/model"`
|
|
@@ -262,6 +277,16 @@ description: >
|
|
|
262
277
|
**Description:** We're wrapping each component with `withShouldRender`, because they're all decoratable, and `withShouldRender` attaches a
|
|
263
278
|
conditional decorator, which optionally takes a `modelIds` prop, so you can control on which models that component will be decorated.
|
|
264
279
|
|
|
280
|
+
---
|
|
281
|
+
**Name:** `TemplateIcon`
|
|
282
|
+
**Import:** `import { TemplateIcon } from "webiny/admin/cms/field-renderers/dynamic-zone"`
|
|
283
|
+
**Source:** `@webiny/app-headless-cms/admin/plugins/fieldRenderers/dynamicZone/TemplateIcon.tsx`
|
|
284
|
+
|
|
285
|
+
---
|
|
286
|
+
**Name:** `TemplateProvider`
|
|
287
|
+
**Import:** `import { TemplateProvider } from "webiny/admin/cms/field-renderers/dynamic-zone"`
|
|
288
|
+
**Source:** `@webiny/app-headless-cms/admin/plugins/fieldRenderers/dynamicZone/index.tsx`
|
|
289
|
+
|
|
265
290
|
---
|
|
266
291
|
**Name:** `useCms`
|
|
267
292
|
**Import:** `import { useCms } from "webiny/admin/cms"`
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: webiny-admin-form-catalog
|
|
3
3
|
context: webiny-api
|
|
4
4
|
description: >
|
|
5
|
-
admin/form —
|
|
5
|
+
admin/form — 23 abstractions.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# admin/form
|
|
@@ -20,6 +20,28 @@ description: >
|
|
|
20
20
|
**Import:** `import { Bind } from "webiny/admin/form"`
|
|
21
21
|
**Source:** `@webiny/form/index.ts`
|
|
22
22
|
|
|
23
|
+
---
|
|
24
|
+
**Name:** `createFieldRenderer`
|
|
25
|
+
**Import:** `import { createFieldRenderer } from "webiny/admin/form"`
|
|
26
|
+
**Source:** `@webiny/app-admin/features/formModel/createFieldRenderer.tsx`
|
|
27
|
+
|
|
28
|
+
---
|
|
29
|
+
**Name:** `createObjectFieldRenderer`
|
|
30
|
+
**Import:** `import { createObjectFieldRenderer } from "webiny/admin/form"`
|
|
31
|
+
**Source:** `@webiny/app-admin/features/formModel/createFieldRenderer.tsx`
|
|
32
|
+
|
|
33
|
+
---
|
|
34
|
+
**Name:** `FieldBuilder`
|
|
35
|
+
**Import:** `import { FieldBuilder } from "webiny/admin/form"`
|
|
36
|
+
**Source:** `@webiny/app-admin/features/formModel/FieldBuilder.ts`
|
|
37
|
+
**Description:** Base FieldBuilder with fluent API.
|
|
38
|
+
Each method mutates `this` and returns `this` for chaining.
|
|
39
|
+
|
|
40
|
+
---
|
|
41
|
+
**Name:** `FieldType`
|
|
42
|
+
**Import:** `import { FieldType } from "webiny/admin/form"`
|
|
43
|
+
**Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
|
|
44
|
+
|
|
23
45
|
---
|
|
24
46
|
**Name:** `Form`
|
|
25
47
|
**Import:** `import { Form } from "webiny/admin/form"`
|
|
@@ -31,6 +53,11 @@ description: >
|
|
|
31
53
|
**Import:** `import type { FormAPI } from "webiny/admin/form"`
|
|
32
54
|
**Source:** `@webiny/form/index.ts`
|
|
33
55
|
|
|
56
|
+
---
|
|
57
|
+
**Name:** `FormModelFactory`
|
|
58
|
+
**Import:** `import { FormModelFactory } from "webiny/admin/form"`
|
|
59
|
+
**Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
|
|
60
|
+
|
|
34
61
|
---
|
|
35
62
|
**Name:** `FormOnSubmit`
|
|
36
63
|
**Kind:** type
|
|
@@ -43,6 +70,36 @@ description: >
|
|
|
43
70
|
**Import:** `import type { GenericFormData } from "webiny/admin/form"`
|
|
44
71
|
**Source:** `@webiny/form/index.ts`
|
|
45
72
|
|
|
73
|
+
---
|
|
74
|
+
**Name:** `IFieldBuilderRegistry`
|
|
75
|
+
**Kind:** type
|
|
76
|
+
**Import:** `import type { IFieldBuilderRegistry } from "webiny/admin/form"`
|
|
77
|
+
**Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
|
|
78
|
+
|
|
79
|
+
---
|
|
80
|
+
**Name:** `IFieldRendererRegistry`
|
|
81
|
+
**Kind:** type
|
|
82
|
+
**Import:** `import type { IFieldRendererRegistry } from "webiny/admin/form"`
|
|
83
|
+
**Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
|
|
84
|
+
|
|
85
|
+
---
|
|
86
|
+
**Name:** `IFieldVM`
|
|
87
|
+
**Kind:** type
|
|
88
|
+
**Import:** `import type { IFieldVM } from "webiny/admin/form"`
|
|
89
|
+
**Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
|
|
90
|
+
|
|
91
|
+
---
|
|
92
|
+
**Name:** `IObjectFieldItemVM`
|
|
93
|
+
**Kind:** type
|
|
94
|
+
**Import:** `import type { IObjectFieldItemVM } from "webiny/admin/form"`
|
|
95
|
+
**Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
|
|
96
|
+
|
|
97
|
+
---
|
|
98
|
+
**Name:** `IObjectFieldVM`
|
|
99
|
+
**Kind:** type
|
|
100
|
+
**Import:** `import type { IObjectFieldVM } from "webiny/admin/form"`
|
|
101
|
+
**Source:** `@webiny/app-admin/features/formModel/abstractions.ts`
|
|
102
|
+
|
|
46
103
|
---
|
|
47
104
|
**Name:** `UnsetOnUnmount`
|
|
48
105
|
**Import:** `import { UnsetOnUnmount } from "webiny/admin/form"`
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: webiny-admin-ui-catalog
|
|
3
3
|
context: webiny-api
|
|
4
4
|
description: >
|
|
5
|
-
admin/ui —
|
|
5
|
+
admin/ui — 99 abstractions.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# admin/ui
|
|
@@ -20,6 +20,11 @@ description: >
|
|
|
20
20
|
**Import:** `import { Accordion } from "webiny/admin/ui"`
|
|
21
21
|
**Source:** `@webiny/admin-ui/Accordion/index.ts`
|
|
22
22
|
|
|
23
|
+
---
|
|
24
|
+
**Name:** `AdminLayout`
|
|
25
|
+
**Import:** `import { AdminLayout } from "webiny/admin/ui"`
|
|
26
|
+
**Source:** `@webiny/app-admin/components/AdminLayout.tsx`
|
|
27
|
+
|
|
23
28
|
---
|
|
24
29
|
**Name:** `Alert`
|
|
25
30
|
**Import:** `import { Alert } from "webiny/admin/ui"`
|
|
@@ -170,6 +175,26 @@ description: >
|
|
|
170
175
|
**Import:** `import { FolderTree } from "webiny/admin/ui"`
|
|
171
176
|
**Source:** `@webiny/app-aco/components/FolderTree/index.tsx`
|
|
172
177
|
|
|
178
|
+
---
|
|
179
|
+
**Name:** `FormComponentDescription`
|
|
180
|
+
**Import:** `import { FormComponentDescription } from "webiny/admin/ui"`
|
|
181
|
+
**Source:** `@webiny/admin-ui/FormComponent/index.ts`
|
|
182
|
+
|
|
183
|
+
---
|
|
184
|
+
**Name:** `FormComponentErrorMessage`
|
|
185
|
+
**Import:** `import { FormComponentErrorMessage } from "webiny/admin/ui"`
|
|
186
|
+
**Source:** `@webiny/admin-ui/FormComponent/index.ts`
|
|
187
|
+
|
|
188
|
+
---
|
|
189
|
+
**Name:** `FormComponentLabel`
|
|
190
|
+
**Import:** `import { FormComponentLabel } from "webiny/admin/ui"`
|
|
191
|
+
**Source:** `@webiny/admin-ui/FormComponent/index.ts`
|
|
192
|
+
|
|
193
|
+
---
|
|
194
|
+
**Name:** `FormComponentNote`
|
|
195
|
+
**Import:** `import { FormComponentNote } from "webiny/admin/ui"`
|
|
196
|
+
**Source:** `@webiny/admin-ui/FormComponent/index.ts`
|
|
197
|
+
|
|
173
198
|
---
|
|
174
199
|
**Name:** `generateId`
|
|
175
200
|
**Import:** `import { generateId } from "webiny/admin/ui"`
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: webiny-admin-website-builder-catalog
|
|
3
3
|
context: webiny-api
|
|
4
4
|
description: >
|
|
5
|
-
admin/website-builder —
|
|
5
|
+
admin/website-builder — 63 abstractions.
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
# admin/website-builder
|
|
@@ -192,6 +192,16 @@ which can be mutated in place.
|
|
|
192
192
|
**Import:** `import { pagePathFromTitle } from "webiny/admin/website-builder"`
|
|
193
193
|
**Source:** `@webiny/app-website-builder/index.ts`
|
|
194
194
|
|
|
195
|
+
---
|
|
196
|
+
**Name:** `PageSettingsGroup`
|
|
197
|
+
**Import:** `import { PageSettingsGroup } from "webiny/admin/website-builder/page/editor"`
|
|
198
|
+
**Source:** `@webiny/app-website-builder/modules/pages/PageEditor/PageSettings/index.ts`
|
|
199
|
+
|
|
200
|
+
---
|
|
201
|
+
**Name:** `PageSettingsGroupModifier`
|
|
202
|
+
**Import:** `import { PageSettingsGroupModifier } from "webiny/admin/website-builder/page/editor"`
|
|
203
|
+
**Source:** `@webiny/app-website-builder/modules/pages/PageEditor/PageSettings/index.ts`
|
|
204
|
+
|
|
195
205
|
---
|
|
196
206
|
**Name:** `PageType`
|
|
197
207
|
**Import:** `import { PageType } from "webiny/admin/website-builder"`
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: webiny-api-mailer-catalog
|
|
3
|
+
context: webiny-api
|
|
4
|
+
description: >
|
|
5
|
+
api/mailer — 11 abstractions.
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# api/mailer
|
|
9
|
+
|
|
10
|
+
## How to Use
|
|
11
|
+
|
|
12
|
+
1. Find the abstraction you need below
|
|
13
|
+
2. You MUST read the source file to get the exact interface and types!
|
|
14
|
+
3. Import: `import { Name } from "<importPath>";`
|
|
15
|
+
4. See `webiny-use-case-pattern` or `webiny-event-handler-pattern` skills for implementation patterns
|
|
16
|
+
|
|
17
|
+
## Abstractions
|
|
18
|
+
|
|
19
|
+
---
|
|
20
|
+
**Name:** `GetSettingsRepository`
|
|
21
|
+
**Import:** `import { GetSettingsRepository } from "webiny/api/mailer"`
|
|
22
|
+
**Source:** `@webiny/api-mailer/features/GetSettings/index.ts`
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
**Name:** `GetSettingsUseCase`
|
|
26
|
+
**Import:** `import { GetSettingsUseCase } from "webiny/api/mailer"`
|
|
27
|
+
**Source:** `@webiny/api-mailer/features/GetSettings/index.ts`
|
|
28
|
+
|
|
29
|
+
---
|
|
30
|
+
**Name:** `MailAfterSendEventHandler`
|
|
31
|
+
**Import:** `import { MailAfterSendEventHandler } from "webiny/api/mailer"`
|
|
32
|
+
**Source:** `@webiny/api-mailer/features/SendMail/index.ts`
|
|
33
|
+
|
|
34
|
+
---
|
|
35
|
+
**Name:** `MailBeforeSendEventHandler`
|
|
36
|
+
**Import:** `import { MailBeforeSendEventHandler } from "webiny/api/mailer"`
|
|
37
|
+
**Source:** `@webiny/api-mailer/features/SendMail/index.ts`
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
**Name:** `MailerService`
|
|
41
|
+
**Import:** `import { MailerService } from "webiny/api/mailer"`
|
|
42
|
+
**Source:** `@webiny/api-mailer/domain/MailerService/abstractions.ts`
|
|
43
|
+
|
|
44
|
+
---
|
|
45
|
+
**Name:** `MailerSettingsAfterSaveEventHandler`
|
|
46
|
+
**Import:** `import { MailerSettingsAfterSaveEventHandler } from "webiny/api/mailer"`
|
|
47
|
+
**Source:** `@webiny/api-mailer/features/SaveSettings/index.ts`
|
|
48
|
+
|
|
49
|
+
---
|
|
50
|
+
**Name:** `MailerSettingsBeforeSaveEventHandler`
|
|
51
|
+
**Import:** `import { MailerSettingsBeforeSaveEventHandler } from "webiny/api/mailer"`
|
|
52
|
+
**Source:** `@webiny/api-mailer/features/SaveSettings/index.ts`
|
|
53
|
+
|
|
54
|
+
---
|
|
55
|
+
**Name:** `MailSendErrorEventHandler`
|
|
56
|
+
**Import:** `import { MailSendErrorEventHandler } from "webiny/api/mailer"`
|
|
57
|
+
**Source:** `@webiny/api-mailer/features/SendMail/index.ts`
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
**Name:** `SaveSettingsRepository`
|
|
61
|
+
**Import:** `import { SaveSettingsRepository } from "webiny/api/mailer"`
|
|
62
|
+
**Source:** `@webiny/api-mailer/features/SaveSettings/index.ts`
|
|
63
|
+
|
|
64
|
+
---
|
|
65
|
+
**Name:** `SaveSettingsUseCase`
|
|
66
|
+
**Import:** `import { SaveSettingsUseCase } from "webiny/api/mailer"`
|
|
67
|
+
**Source:** `@webiny/api-mailer/features/SaveSettings/index.ts`
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
**Name:** `SendMailUseCase`
|
|
71
|
+
**Import:** `import { SendMailUseCase } from "webiny/api/mailer"`
|
|
72
|
+
**Source:** `@webiny/api-mailer/features/SendMail/index.ts`
|
|
73
|
+
|
|
74
|
+
---
|