What this is, and who it is for
The form builder is where one form of a study (a demographics page, a vital signs page, an adverse event) is drawn: its fields, its checks, its calculations, what shows and hides, and how it is laid out. A form is not a visit; the visits that collect it are set apart in Binding a form to visits. A form is not released on its own either: it belongs to a version of the study, and the version goes through UAT and three sign-offs before any participant sees it (Versions, reopening and publishing).
| You need | To |
|---|---|
form.design or study.write | open a form in the builder and change it |
library.write | open and change a template in the organization's library |
ai.generate | see the AI Assist button (and the organization must have the AI feature switched on) |
form.read | open the same form for reading only |
Held by: Organization Admin, Project Manager, eCRF Designer (form.design or study.write).
Nobody else can change a form. A person who holds only a reading permission sees the form, its preview and its properties, and no control that changes them.
Where to find it
Study → Build → Forms, then open a form and choose Open builder. The builder fills the whole window and has its own top bar, with a Back link to the Forms list, a badge saying Study (or Library for a template), the form's code, name and version, its status (Draft, Active), and the words Autosaving draft while it is editable or Read-only — locked when it is not. A template is opened from Library → Form Templates → ⋯ → Open in builder.
The builder opens for editing only when all three are true: the form is a Draft, the version of the study that owns it is in Build, and you hold a design permission. In every other case the page shows the form read-only with a notice saying why (the version is Live and an amendment is needed; the version is under test and must be returned to Build; the form is Active and must be reopened).
What you can do
The screen has three panels and a toolbar.
| Panel | What it holds |
|---|---|
| Left: the field toolbox | The 20 field types in seven groups (Selection, Text Input, Static Content, Numeric, Date & Time, Media, Structure). Drag one onto the canvas to place it, or click it to append it at the end |
| Centre: the canvas | The form as the person entering data will see it, with the form's name, code and version pinned at the top. Fields can be dragged to reorder, dropped into a section, selected, duplicated and removed. An empty form says Start building your form |
| Right: the properties panel | The settings of the selected field, in tabs (Basic, Validation, Logic, Style, Table, CDMS). When you open the issues list from the toolbar it takes this panel's place |
Each field on the canvas shows small indicators for what it carries (required, a formula, a visibility rule, hidden) and, on hover, a grip to drag it and buttons to duplicate and delete it. A field of a version that was released before shows Deprecate instead of delete, because it may already hold data (Versions, reopening and publishing).
Every option
The toolbar
| Control | What it does |
|---|---|
| Form name | Shown, not edited here. The name, code and description are the form's details, changed on the Forms list (Edit details) |
| Save state | Saved at hh:mm:ss when the server has accepted the form; Saving…; Unsaved changes; Not saved to the server in red with the reason; No local backup in amber when the browser's storage is full (the server save still runs) |
| Errors and warnings | A count appears when the form has problems. Choosing it opens the issues list in place of the properties panel (Preview and testing) |
| Undo, Redo | Step back and forward through up to 50 changes. Typing in one field is one step, not one for each letter |
| Import | Add a library template's fields to the form (The form library and templates) |
| AI Assist (experimental) | Describe a form and have a draft added (AI form generation). Shown only to a person who holds ai.generate |
| Preview | Try the form as a person entering data would, read-only, or as a printout |
| Save | Save now. The builder also saves by itself |
| Keyboard shortcuts | A small card listing them (see below) |
Saving
The builder saves to the server by itself about one and a half seconds after you stop changing something, and keeps a copy in the browser as a backup. The toolbar says "Saved" only for what the server accepted. Each save is a revision of the version's draft design, so the history of the design is kept (What the system records). If the server refuses a save, the toolbar says so and the reason, and a toast repeats it.
If another designer saved the same form after you opened it, autosave stops and a dialog says Someone changed this form first. Nothing of yours is lost; you choose Take theirs (the builder reloads from the server and your unsaved changes since you opened it are dropped) or Keep mine (your document replaces theirs). The dialog lists what differs.
Leaving the builder, reloading or switching workspace while a change has not reached the server asks you first.
- Saves the draft of the form.
Keyboard
| Keys | Does |
|---|---|
| Ctrl+Z | Undo |
| Ctrl+Y (or Ctrl+Shift+Z) | Redo |
| Ctrl+S | Save now |
| Ctrl+P | Open the preview |
| Ctrl+K | Search the form's fields by label, variable or type, and jump to one |
| Delete / Backspace | Remove the selected field at once. Undo brings it back. For a field that came from a released version the server refuses the save (the field has to be deprecated, not removed) |
(The shortcuts card also lists Ctrl+D to duplicate and Esc to deselect. Neither does anything in this release; use the duplicate button on the field.)
What you cannot see here
The builder does not show participants' data. It asks the server one thing before a field's type is changed: whether the field has captured values, in UAT or Live (Field types).
What the system records
- Every save of a form's design is written to the audit trail (
form.draft_saved) and kept as a numbered revision of the version's draft; the version's Saves page lists them. Deprecating or restoring a field is its own entry (study_form.field_deprecated,study_form.field_restored) with the reason. - Changing a form's status (activate, reopen, archive) is
form.transitioned. - Browser backups are the browser's own and are not part of the record; the server's revision is.
What you cannot do, and why
- Edit a form that is not a Draft, or whose version has left Build. The design is frozen so that what was tested and signed is what goes Live. See Versions, reopening and publishing.
- Delete a field that came from a released version. It may hold captured data; it is deprecated, with a reason, and stays in the design.
- Change the type of a field that holds Live data in place. The builder offers a replacement field instead (Field types).
- Activate a form with errors. The server refuses a form with duplicate variables, a choice field with no options, a table with no columns and similar; the Make active dialog lists them. Formula mistakes are caught by the builder before the dialog lets you continue.
- Keep two people's edits to one form. The second to save has to choose.
Compliance Q&A
Yes. Each save is a numbered revision of the version's draft and an audit entry in the same transaction, naming the person and the time. Deprecating a field requires a reason and is recorded separately. The design that goes to UAT is frozen as a snapshot with a content hash.
Evidence: server/src/modules/study/forms/application/commands/edit-form.ts (saveFormDraft: revision and audit in one transaction)versions README (design revisions)audit events form.draft_saved, study_form.field_deprecated
Not by accident. A form with structural errors cannot be made active, and no form reaches participants without the version passing a UAT cycle and three sign-offs.
Limits: formula errors (an unknown variable, a circular formula, a parse error) are caught by the builder in the browser when you activate, not by the server, so a designer using the API directly could activate such a form. The UAT cycle is what shows whether the form works as intended; the system does not decide that for you.
Evidence: client modules/forms/components/FormStageActions.tsx (runDiagnostics before activation)server forms module (activation refuses structural errors)versions (UAT cycle and three sign-offs)
Related
Field types · Field properties · Validation, edit checks and their severities · Versions, reopening and publishing · Design forms · eCRF Designer