FORM
Formulario con validacion declarativa y estados (cargando/error/exito) automaticos.
En esta página
Props
Tabla generada desde el esquema real (ui-schema.ts); si el esquema cambia, cambia esta tabla.
| Prop | Tipo | Requerido | Valores permitidos | Por defecto | Descripción |
|---|---|---|---|---|---|
| fields | arreglo de objeto | No | — | — | Campos declarativos. |
| submitLabel | texto | No | — | "Enviar" | Texto del boton enviar. |
| cancelLabel | texto | No | — | — | Texto del boton cancelar (solo si hay onCancel). |
| onSubmit | accion(es)acción | No | — | — | Accion al enviar: recibe formData. CALL_BACKEND pone el formulario en estado de carga y muestra el error. |
| onCancel | accion(es)acción | No | — | — | Accion del boton cancelar. |
| successMessage | texto | No | — | — | Mensaje tras un envio correcto. |
| resetOnSuccess | booleano | No | truefalse | — | Vacia el formulario tras el exito. |
| validateOn | enum | No | "submit""blur""change" | "blur" | Cuando validar. |
| gap | enum | No | 012345681012 | 4 | Espacio en escala de 4px (0-12). |
Estructuras anidadas
fields[]
| Prop | Tipo | Valores permitidos | Por defecto | Descripción |
|---|---|---|---|---|
| fields[].name | nombre | — | — | Nombre del campo en el formulario. |
| fields[].label | texto | — | — | Etiqueta visible. |
| fields[].helperText | texto | — | — | Texto de ayuda bajo el control. |
| fields[].placeholder | texto | — | — | Texto de ejemplo. |
| fields[].bind | nombre | — | — | Clave de state enlazada (bidireccional). Admite ruta con puntos: "form.email". |
| fields[].bindTo | nombre | — | — | Obsoleto: usa bind. |
| fields[].value | cualquiera | — | — | Valor controlado (normalmente una expresion ${state.x}). |
| fields[].defaultValue | cualquiera | — | — | Valor inicial. |
| fields[].required | booleano | truefalse | — | Marca el campo como obligatorio (asterisco + regla required). |
| fields[].disabled | booleano | truefalse | — | Deshabilita el control. |
| fields[].readOnly | booleano | truefalse | — | Solo lectura. |
| fields[].size | enum | "xs""sm""md""lg" | "md" | Tamano en escala. |
| fields[].rules | objeto | — | — | Reglas de validacion declarativas. |
| fields[].onChange | accion(es)acción | — | — | Accion al cambiar el valor (recibe value). |
| fields[].type | texto | — | — | text|email|password|number|textarea|select|checkbox|toggle|date|time|datetime-local|radio|slider|color|tags|contacts|richtext. |
| fields[].options | arreglo de objeto | — | — | Opciones (select/radio). |
| fields[].mountPoint | texto | — | — | Punto de montaje de extensiones junto al campo. |
| fields[].mountInline | booleano | truefalse | — | Montar en la misma linea. |
| fields[].contextSetter | nombre | — | — | Nombre del setter expuesto al mount. |
| fields[].min | numero | — | — | Minimo. |
| fields[].max | numero | — | — | Maximo. |
| fields[].step | numero | — | — | Paso. |
| fields[].rows | numero | 1 … 40 | — | Filas (textarea). |
fields[].rules
| Prop | Tipo | Valores permitidos | Por defecto | Descripción |
|---|---|---|---|---|
| fields[].rules.required | booleano | truefalse | — | El valor no puede estar vacio. |
| fields[].rules.minLength | numero | 0 … 100000 | — | Longitud minima del texto. |
| fields[].rules.maxLength | numero | 0 … 100000 | — | Longitud maxima del texto. |
| fields[].rules.min | numero | — | — | Valor minimo (numeros). |
| fields[].rules.max | numero | — | — | Valor maximo (numeros). |
| fields[].rules.minItems | numero | 0 … 1000 | — | Minimo de elementos (listas). |
| fields[].rules.maxItems | numero | 0 … 1000 | — | Maximo de elementos (listas). |
| fields[].rules.pattern | regex | — | — | Expresion regular (sin delimitadores) que debe cumplir el texto. |
| fields[].rules.email | booleano | truefalse | — | Debe ser un correo valido. |
| fields[].rules.url | booleano | truefalse | — | Debe ser una URL http(s) valida. |
| fields[].rules.message | texto | — | — | Mensaje de error propio (sustituye al generico). |
fields[].options[]
| Prop | Tipo | Valores permitidos | Por defecto | Descripción |
|---|---|---|---|---|
| fields[].options[].value | cualquiera | — | — | Valor que se guarda. |
| fields[].options[].label | texto | — | — | Texto visible. |
| fields[].options[].disabled | booleano | truefalse | — | Opcion no seleccionable. |
| fields[].options[].description | texto | — | — | Texto secundario. |
Props comunes a todos los componentes
| Prop | Tipo | Valores permitidos | Por defecto | Descripción |
|---|---|---|---|---|
| hidden | booleano | truefalse | — | true oculta el componente (admite expresiones). |
| onLoad | accion(es)acción | — | — | Accion que se ejecuta una vez al montar. |
| onLoadWhen | cualquiera | — | — | Condicion: onLoad se ejecuta cuando pasa a verdadera. |
| ariaLabel | texto | — | — | Nombre accesible explicito. |
Eventos y acciones que acepta
Props que ejecutan una acción (o cadena de acciones). Las variables disponibles en ${...} dentro de la acción son las que recibe cada evento.
| Evento | Recibe | Descripción |
|---|---|---|
| fields[].onChange | ${value} | Accion al cambiar el valor (recibe value). |
| onSubmit | ${formData} | Accion al enviar: recibe formData. CALL_BACKEND pone el formulario en estado de carga y muestra el error. |
| onCancel | — | Accion del boton cancelar. |
| onLoad | — | Accion que se ejecuta una vez al montar. |
Estado y contexto que usa
Cómo interactúa con state y context (expresiones ${...}).
value / defaultValueValor controlado por expresión (
${state.x}) o valor inicial único.hidden / onLoadWhenCondiciones comunes:
hidden: "${!state.x}"oculta el componente;onLoadWhenejecutaonLoadal pasar a verdadera.
Simulador interactivo
Renderiza el JSON validado con el mismo renderer y el mismo kit que la app, con el tema actual de esta página. Nada sale a la red: CALL_BACKEND usa una respuesta simulada.
Acciones relacionadas
Acciones que este componente puede disparar desde sus props de acción (cualquiera de UI_ACTIONS) y las que lo controlan. Detalle de cada acción en la sección de acciones.
Usadas en sus ejemplos y manifests
- CALL_BACKEND
Llama a una funcion del server.js. Pone
state.$loading[key]/state.$error[key]solos, admite reintento y guarda el resultado conresultKey.Obligatorios:
function· Campos:functionargsparamskeyresultKeyretrytoastOnErroronSuccess - TOAST
Muestra un aviso breve.
Obligatorios:
message· Campos:messagevarianttone
Acciones que lo controlan
- SET_STATE
Guarda
valueenstate[key](la clave admite ruta con puntos).Obligatorios:
key· Campos:keyvalue
Ejemplo en un manifest real
Tomado de bloomx-extensions/notion/manifest.json (core-notion), en mounts[1].component.props.children[0].props.false[1] (punto OVERLAY).
También se usa en: airtable-records/manifest.json, asana-tasks/manifest.json, calendar/manifest.json, dropbox-links/manifest.json, github-issues/manifest.json, google-meet/manifest.json.
{
"type": "FORM",
"props": {
"onSubmit": {
"action": "CALL_BACKEND",
"function": "savePage",
"onSuccess": {
"action": "TOAST",
"message": "Saved to Notion"
},
"args": {
"subject": "${formData.subject}"
}
},
"fields": [
{
"name": "subject",
"label": "Page Title",
"defaultValue": "${context.subject}"
}
]
}
}{
"manifestVersion": "1.0",
"id": "my-extension",
"version": "1.0.0",
"name": "My extension",
"permissions": [],
"mounts": [
{
"point": "OVERLAY",
"component": {
"type": "FORM",
"props": {
"onSubmit": {
"action": "CALL_BACKEND",
"function": "savePage",
"onSuccess": {
"action": "TOAST",
"message": "Saved to Notion"
},
"args": {
"subject": "${formData.subject}"
}
},
"fields": [
{
"name": "subject",
"label": "Page Title",
"defaultValue": "${context.subject}"
}
]
}
}
}
]
}