# Code Editor
:::callout{theme="warning" title="Sunset"}
Foundry Forms is no longer the recommended approach for data entry or writeback workflows on Foundry. Instead, build user input workflows with the Foundry Ontology, representing the relevant data structures as object types and configuring the writeback interaction with Actions. Learn more in the [Forms overview](../overview/index.md) documentation.
:::
The **Code Editor** allows users to view and edit the YAML representation of the form. While most configuration is possible with the Visual Editor, the Code Editor offers complete functionality, including the ability to add four [code-only fields](#code-only-fields).
To view the Code Editor in action, open it by selecting the black **\>** button in the bottom left of the form. Then, use the Visual Editor to add a field. Notice how the code automatically populates and updates as the field is configured.
Select the book icon in the top right of the Code Editor to open examples and documentation directly within the Code Editor window.
## Code structure
The general structure of a form is as follows:
```yaml
name: New form
fields:
- uri: name
name: Full name
type: Text
# and other generic options
options:
placeholder: 'Last, First'
# and other specific options
sheets:
- name: New sheet
fields:
- uri: date_of_birth
name: Date of birth
type: DatePicker
options:
precision: day
- uri: weight_kg
name: Weight
type: Numeric
options:
unit: kg
```
At the top level, there is the `name` (the title of the form), `fields` (a list of fields), and `sheets` (a list of [sheets](../sheets/index.md)). Then, each `sheet` itself has these same options. Fields have [generic options](#generic-options), such as `uri`, `name`, and `type`, and specific options (underneath `options`), such as `placeholder`, `precision`, and `unit`.
### Generic options
The following options can be configured for every field:
```
uri: string
type: string
name: string
urlParam: string
tag: string
helperText: string
infoText: string
columnSpan: integer
disabled: Boolean
hidden: Boolean
isBlock: Boolean
noLabel: Boolean
validators: list
transforms: list
```
* **uri:** A unique identifier for the field. If the field is being written back to Fusion or the Ontology, it needs to match the column name or property ID respectively. If the field is not being written back, it needs to start with the prefix `display.`.
* **type:** The type of the field (for example, `Text`, `Numeric`, `DatePicker`).
* **name:** The label for the field.
* **urlParam:** The URL parameter associated with the field. This allows users to prefill the value when the form is embedded in an iframe.
* **tag:** Another unique identifier for the field, but without restrictions. This is the identifier used when one field references another (for example, `Calculation`, `Template`), with the exception of [attachments](../attachments-field/index.md).
* **helperText:** The caption below the field.
* **infoText:** The content of the informational tooltip displayed next to the label of the field.
* **columnSpan:** The number of columns occupied by the field.
* **disabled:** Allows the user to make the field read-only.
* **hidden:** Allows the user to hide the field but record the value.
* **isBlock:** Allows the user to display the label above the field instead of to the left.
* **noLabel:** Allows the user to hide the label of the field. This is only available via the Code Editor.
* **validators:** [Validators](../validators/index.md) on the field.
* **transforms:** [Transforms](../transforms/index.md) on the field.
## Code-only fields
Four fields are available only through the Code Editor:
* [Hidden](#hidden)
* [List](#list)
* [Composite](#composite)
* [List aggregate](#list-aggregate)
### Hidden
The **hidden** field allows users to record a value without showing a field. It is configured as follows:
```
- uri: Hidden
name: Hidden
type: Hidden
options:
val: string
```
### List
The **List** field allows users to [store multiple values](../faqs/index.md#how-do-i-store-multiple-values) when a field does not innately support it. It is configured as follows:
```
- uri: names
name: Full names
type: List
options:
# allowZeroItems: true
item:
type: Text
# and other supported generic options (helperText, infoText, validators)
options:
placeholder: 'Last, First'
# and other specific options
```
`allowZeroItems` is optional and false by default.
### Composite
The **composite** field allows users to store the values of multiple fields as one stringified JSON. It is configured as follows:
```
- uri: info
name: Composite
type: Composite
options:
fields:
- uri: date_of_birth
name: Date of birth
type: DatePicker
# and other supported generic options (helperText, infoText, disabled, isBlock, noLabel, validators)
options:
precision: day
# and other specific options
- uri: weight_kg
name: Weight
type: Numeric
options:
unit: kg
```
:::callout{theme="neutral"}
[Hidden](#hidden) fields and those that [allow multiple values](../faqs/index.md#how-do-i-store-multiple-values) are not allowed within a composite field.
:::
### List aggregate
The **list aggregate** field is similar to [calculation](../auto-populating-fields/index.md#calculation) and [template](../auto-populating-fields/index.md#template) fields but works on fields that [store multiple values](../faqs/index.md#how-do-i-store-multiple-values). It is configured as follows:
```
- uri: single_value
tag: single_value
name: Single Value
type: RadioButtons
options:
options:
- value: '10'
- value: '20'
- value: '30'
- uri: multi_values
name: Multiple Values
tag: multi_values
type: Checkboxes
options:
options:
- value: '40'
- value: '50'
- value: '60'
- uri: avg_value
name: Average Value
type: ListAggregate
options:
listOperation:
operation: mean
listTag: [single_value, multi_values]
# errorValue: No values selected
```
Or, when used with a [composite](#composite) field:
```
- uri: grades
tag: grades
name: Grades
type: List
options:
item:
type: Composite
options:
fields:
- uri: name
name: Name
type: Text
options:
placeholder: 'Last, First'
- uri: grade
name: Grade
type: Numeric
options:
unit: '%'
- uri: all_grades
name: All grades
type: ListAggregate
options:
listOperation:
operation: concatenate
joinWith: ', '
listTag: grades
displayItem: grade
# errorValue: No grades added
```
When configuring `options` fields:
* `errorText` is optional and an empty string by default.
* Within `listOperation`:
* `operation` can be `concatenate`, `sum`, `min`, `max`, `mean`, or `count`.
* `listTag` is the tag (or array of tags) of the field(s) being aggregated.
* `joinWith` is only required when the operation is `concatenate`.
* `displayItem` is only required when the aggregated field is a [composite](#composite) field and is the URI of the nested field.