Form Builder

Input — inputFields

<base-input>

All seventeen BaseInputFieldType values. Only TextArea and DatePicker get their own template — every other value is passed straight through as the DOM type attribute.

Select — selectFields

<base-select>

Single select and a multiple select. Options are SelectOption[] with label and value.

Radio — radioFields

<base-radio>

signalControl sits on the field; each radioButton only supplies a label and value.

Checkbox — checkboxFields

<base-checkbox>

Checkbox is the one input that binds per option: a single checkbox uses labelCheckbox with the field control, but a group needs signalControl on every checkboxButton.

Slide toggle — sliderToggleFields

<base-toggle-slider>

A plain slide toggle and one with opposingLabel, which bolds whichever side is active.

All
Mine

Slider — sliderFields

<base-slider>

A range slider with min, max and step, bound the same way as the other inputs.

40

Chip — chipFields

<base-chip>

chipRows drive the visible chips; removeClick handles dismissal. The rows here live in their own signal rather than the form model.

List — listFields

<base-list>

base-list inside a form row — useful for read-only summaries next to editable controls.

12 March 2026

28 March 2026

  • Budget attached

  • IRB approval on file

  • Awaiting signature

Avatar — avatarFields

<user-avatar>

user-avatar in a form row. With no user it falls back to a placeholder icon.

Pass a FacultyUserDto as user, or imageSrc for a direct URL.

Title / Text — titleField, textField and titleTextField

<base-title> <base-text> <title-text>

Display-only cells, handy for captions and spacers inside a form grid.

A title cell

A text cell for helper copy.

Title + text

Both in one field.

Row header — formRowHeader and formRowHeaderButton

<section-header>

Row headers render through section-header, with an optional button on the right.

Section heading

formRowSubHeader sits underneath as description text.

Button — buttonFields

<base-button>

Every MatButtonType, a row showing extraText and extraNumber, then a right-aligned action row where flex utilities on formRowClass override the 12-column grid.

Alert — alertField

<alert-message>

A notice inside the form (one AlertData or a list), e.g. a warning above the fields it concerns or a send error under them.

Changing the sponsor resets the budget categories below.

Spam protection — honeypotField and turnstileField

<honeypot> <turnstile-widget>

withSpamGuard(rows, spamGuard) adds both to a public form: the off-screen honeypot in the last row (it takes no grid cell) and Cloudflare Turnstile in a row of its own, empty until Cloudflare wants a ...

File upload — fileUploadField

<base-file-upload-selector>

The dropzone renders inline as well as in a dialog — its MatDialogRef is injected optional. hideFooterButtons drops the save/cancel row that assumes a dialog host.

or browse from your computer

No attachments yet

Rich text — quillEditorField

<app-quill-editor>

ngx-quill with the shared toolbar. allowSourceView adds an HTML toggle, and mergeFieldsData can supply draggable tokens.

Bigger form with expand and collapse

[$formAccordion]="true" wraps each row in an expansion panel using formRowHeader as its title. [$isExpanded] opens or closes them together, and [$headerExpandable] controls whether the panel headers r...

Applicant

Who is submitting, and how to reach them.

Award

Money, dates and effort.

40

Notifications

Everything optional lives here.

Every control on this page writes into one signal form.
Live model:
{
  "firstName": "",
  "lastName": "",
  "email": "",
  "phone": "",
  "awardAmount": null,
  "departmentId": null,
  "statusIds": [],
  "startDate": null,
  "notes": "",
  "contactMethod": "email",
  "sendUpdates": true,
  "alertOnAward": true,
  "alertOnDeadline": false,
  "active": true,
  "effort": 40,
  "colorValue": "#0f766e",
  "dateValue": "",
  "datetimeValue": "",
  "monthValue": "",
  "weekValue": "",
  "timeValue": "",
  "numberValue": null,
  "passwordValue": "",
  "searchValue": "",
  "faxValue": "",
  "urlValue": ""
}