Campo List
Una tabla de filas, cada una editada en un subformulario
Un campo list muestra una tabla de filas, cada una creada y editada en un panel de subformulario propio (un patrón de navegación en profundidad). Sustituye al campo table, que se eliminó en 7.0.0.
Características principales
El campo list ofrece las siguientes capacidades:
- Cada fila se edita en un subformulario a pantalla completa, con acceso a todos los tipos de campo, incluidas las listas anidadas.
- El subformulario es un formulario propio, de tipo
subform, y se puede reutilizar en varios campos list de distintos formularios (p. ej., un único subformularioAddresscompartido por clientes, proveedores, pedidos…). - Las propiedades de marcador (
insertMarker,updateMarker,deleteMarker) permiten patrones de playbook idempotentes. - Con
allowDelete: false, las filas preexistentes están protegidas; solo se pueden eliminar las filas añadidas en la sesión actual (las que llevan elinsertMarker). - La propiedad
columnscontrola qué campos del subformulario aparecen como columnas en la tabla resumen. - La salida es siempre un array de objetos.
model,output,outputObjectyvalueColumndeclarados en los campos del subformulario se respetan al generar las extravars.
Declaración del subformulario
Un subformulario es un formulario propio con type: subform, en un archivo de la carpeta de formularios como cualquier otro formulario. Acepta el mismo array fields que cualquier otro formulario, pero nunca aparece en la lista de mosaicos de formularios y nunca se envía directamente.
- name: Address
type: subform
fields:
- name: street
type: text
label: Street
required: true
- name: city
type: text
label: City
required: true
- name: country
type: text
label: Country
Propiedades
Las propiedades disponibles para un campo list, agrupadas por finalidad:
| Atributo | Comentarios |
|---|---|
| basic | |
| name string / obligatorio / único | Field name
This attribute represents the name of the form field. |
| type string / obligatorio | Field type
Other attributes might only be available for some field types. Valor: list EjemplosText |
| label string | Field label
A friendly name/label for the field. Note: if not set, the field name is used as label, but not when type is html. Since 6.0.3: Supports placeholders for dynamic labels (e.g., |
| help string | Field help message
Some fields require additional help information. This help message will be shown below the field. Since 6.0.3: Supports placeholders for dynamic help text (e.g., |
| subform string / obligatorio | Name of the subform that defines one row
For a |
| data | |
| default many | Default value
The type of the value depends on the field type.
For |
| expression string | A javascript expression.
By default this javascript is evaluated on the server side and limited to predefined functions (for security). However in combination with tip: use the alias EjemplosGet a list of users from a rest api Filter and sort an array of objects Make a numbered list Use the alias `local` Use the alias `local_out` |
| runLocal boolean | Run an expression locally
When running expressions, by default they are run remotely on the server. Por defecto: false |
| dbConfig string, array or object | A database connection
When you want to query data from a database, you will need the proper connection information. Ejemplosget information from a mysql database (legacy example - deprecated) get information from a mysql database (new example) get information from a mysql database (array example) get information from a mongodb |
| query string | The query to select data from a database
This is typically a classic SELECT statement. Every Ejemplosget information from a mysql database get information from a mongodb |
| interaction | |
| dependencyFn string añadido en la versión 4.0.0 | The dependency logical function
This attribute represents the logical function between multiple dependencies. Opciones:
|
| dependencies list / elements=object | Show/hide this field based on the values or other fields
Each dependency element is either an object with the following 2 attributes:
Or with the following 2 attributes:
Use in combination with attribute EjemplosShow a field based on a checkbox Show a field if another field is valid Show a field based on 2 fields, using the 'or' function |
| allowInsert boolean | Allow table/list insert
A table or list can be used to modify existing data. If new data is not allowed, set this property to false. Por defecto: true |
| allowDelete boolean | Allow table/list delete
A table can be used to modify existing data. If you don’t was recoreds to be deleted, set this property to false. Por defecto: true |
| showLoadButton boolean añadido en la versión 6.1.5 | Show load button for file import
Enables a “Load YAML” button that allows users to import data from .yml or .yaml files. For list fields, the YAML file must contain a valid array of objects. For yaml fields, the file can contain any valid YAML structure. Single objects are automatically wrapped in arrays for list fields. Por defecto: false EjemplosList with YAML import YAML field with file import |
| showDownloadButton boolean añadido en la versión 6.1.5 | Show download button for file export
Enables a “Download” button that exports the field content as a .yml file. The filename is automatically generated from the field name. Por defecto: false |
| output | |
| output boolean añadido en la versión 6.2.0 | Include field value as extravar
Form fields are by default sent as extravars. Por defecto: true |
| model string or array | Extravar modelling
By default, a field is sent as a root-extravar. EjemplosModel 2 fields together as a single object |
| deleteMarker string | Adds an additional deletemarker field
When you remove a record in a table, it gets removed. Since 6.4.1 the markers of a EjemplosMark delete record |
| insertMarker string | Adds an additional insertmarker field
When you add a record in a table, it simply gets added. EjemplosMark new record |
| updateMarker string añadido en la versión 5.1.0 | Adds an additional updatemarker field
In addition to the insert and delete markers, you can also add an update marker. EjemplosMark updated record |
| security | |
| noLog boolean añadido en la versión 2.2.3 | Disable backend logging
Disables logging in the backend, to hide passwords for example. Por defecto: false Ejemploshide password in log |
| validation | |
| required boolean | Required field
Makes the field required. Por defecto: false |
| validIf object añadido en la versión 2.2.4 | An field based validation (field must be true)
Enforces a validation where a referencing (expression) field must be true. This field requires an object with 2 attributes:
EjemplosIp must be pingable |
| validIfNot object añadido en la versión 2.2.4 | An field based validation (field must be false)
Enforces a validation where a referencing (expression) field must be false. This field requires an object with 2 attributes:
EjemplosCheck if powered off |
| ignoreIncomplete boolean | Allow form submit on non-evaluated placeholders
When an expression-based field has placeholders, Por defecto: false |
| visualization | |
| group string | The field group name
With this attribute you can group fields together. |
| line string añadido en la versión 4.0.3 | The field line name
With this attribute you can group fields in a single line together. |
| width string añadido en la versión 4.0.3 | The field width
With this attribute you can set the width of a field. Opciones:
EjemplosName and lastname |
| titleAdd string | Title shown in the subform pane when adding a new row
When you add a row through a |
| titleEdit string | Title shown in the subform pane when editing an existing row
When you edit a row through a |
| columns array | The list of columns visible in the dropdown/table
For an EjemplosShow only wanted columns |
Ejemplos
Subformulario de dirección compartido
Un subformulario Address reutilizado por dos campos list del mismo formulario:
- name: Address
type: subform
fields:
- name: street
type: text
label: Street
required: true
- name: city
type: text
label: City
required: true
- name: country
type: text
label: Country
- name: Create customer
type: ansible
playbook: customer.yaml
roles: [default]
fields:
- name: name
type: text
label: Customer name
required: true
- name: addresses
type: list
label: Addresses
subform: Address
columns:
- city
- country
titleAdd: Add address
titleEdit: Edit address
allowInsert: true
allowDelete: true
Seguimiento con marcadores (idempotente)
Las filas precargadas están protegidas, y los marcadores indican al playbook qué filas son nuevas, se han modificado o se han eliminado:
- name: people
type: list
label: People
subform: Person
allowDelete: false # preloaded rows are protected
insertMarker: added # session-added rows remain removable
updateMarker: updated
deleteMarker: removed
columns:
- name
- email
Rellenar filas de antemano
Una lista se puede rellenar de antemano desde tres fuentes. En todos los casos, las filas resultantes deben ser objetos cuyas claves coincidan con los nombres de campo del subformulario referenciado.
default estático
Filas escritas en el propio formulario:
- name: addresses
type: list
label: Addresses
subform: Address
columns:
- city
- country
default:
- street: Main 1
city: Brussels
country: BE
- street: Side 22
city: Paris
country: FR
Desde una API REST (expression)
Filas cargadas desde una API REST mediante una expresión del lado del servidor:
- name: users
type: list
label: Users
subform: User
columns:
- username
- email
expression: fn.fnRestBasic('get','https://api.example.com/users','','my_api_cred','')
Desde una consulta a base de datos (dbConfig + query)
Filas cargadas desde una consulta a base de datos:
- name: servers
type: list
label: Servers
subform: Server
columns:
- hostname
- role
dbConfig: CMDB_CONN
query: SELECT hostname, role FROM servers WHERE active = 1
Desde una expresión local (runLocal)
Filas calculadas en el navegador mediante una expresión local:
- name: ports
type: list
label: Open ports
subform: Port
columns:
- port
- protocol
runLocal: true
expression: |
[
{ port: 22, protocol: 'tcp' },
{ port: 80, protocol: 'tcp' },
{ port: 443, protocol: 'tcp' }
]
Listas anidadas
Un subformulario puede contener su propio campo list, para tener una lista dentro de cada fila:
- name: Address
type: subform
fields:
- name: street
type: text
label: Street
- name: city
type: text
label: City
- name: Person
type: subform
fields:
- name: name
type: text
label: Name
required: true
- name: addresses
type: list
label: Addresses
subform: Address
columns:
- street
- city
- name: My Form
type: ansible
playbook: people.yaml
roles: [default]
fields:
- name: people
type: list
label: People
subform: Person
columns:
- name
- addresses
Acceder a los datos del formulario padre con __parent__
Cuando se abre el editor de una fila del subformulario, AnsibleForms inyecta una variable __parent__ en el subformulario. Contiene una instantánea de todos los valores de los campos del formulario padre, incluidas las constantes y las vars.
Haz referencia a ella con la sintaxis de expresión estándar $(...) en las definiciones de campos del subformulario:
- name: NodeConfig
type: subform
fields:
- name: node_name
type: text
label: Node name
required: true
- name: node_type
type: enum
# only offer gpu in production environments (parent field)
expression: |
'$(__parent__.environment)' === 'production'
? ['standard', 'high-memory', 'gpu']
: ['standard', 'high-memory']
runLocal: true
default: __auto__
- name: Deploy cluster
type: ansible
playbook: deploy.yml
roles: [default]
fields:
- name: environment
type: enum
values: [dev, staging, production]
required: true
- name: nodes
type: list
subform: NodeConfig
columns: [node_name, node_type]
__parent__es una ayuda solo del frontend. Se elimina de las extravars de Ansible y nunca se envía al playbook.