What does this PR do?

Reuse the event-type booking-questions UI in routing forms. Replaces the custom field editor on the form-edit page with the shared FormBuilder used for event-type booking questions, so routing forms get the same field types and editing flow. Adds adapters to map between routing form fields and FormBuilder, with stable IDs, type locking when the form has responses, and preservation of router fields. Fixes duplication and sync issues when editing or reordering questions

  • Fixes #18987 (GitHub issue number)
  • Fixes CAL-5097 (Linear issue number - should be visible at the bottom of the GitHub issue description)
  • /claim #18987

Updates since last revision

Fixed failing E2E tests (yarn e2e:app-store) caused by the FormBuilder migration:

Route builder support for new field types:

  • Added RAQB widget/type definitions for address, boolean, checkbox, multiemail, radio, radioInput, and url field types so they appear in route builder dropdowns
  • Added RADIO = "radio" enum to FieldTypes.ts (FormBuilder uses "radio" for “Radio Group”, distinct from "radioInput")
  • getQueryBuilderConfigForFormFields now skips unsupported field types gracefully instead of throwing a 500

E2E test selector fixes:

  • FormBuilder renders fields with data-testid="field-${field.name}" not data-testid="field" — updated all selectors
  • Field editing now uses a dialog (edit-field-dialog) with [name="label"] / [name="name"] inputs
  • Type selection uses [data-testid="test-field-type"] and [data-testid^="select-option-"]
  • Checkbox (boolean) field uses [contenteditable="true"] for label input
  • All fields including index 0 now get explicit type selection (previously only index > 0)
  • Field identifiers use consistent lowercase-hyphenated format matching the actual UI dropdown order

Suggested review focus

  • The new RAQB widget types in config.ts / uiConfig.tsx use simple text/select factories — verify they render and behave correctly in the route builder UI
  • getQueryBuilderConfigForFormFields silently skips unsupported types with a console.warn — confirm this is acceptable vs throwing
  • E2E test field creation order depends on the FormBuilder dropdown order (returned by verifySelectOptions), not alphabetical order

Link to Devin run | Requested by @sahitya-chandra

Visual Demo (For contributors especially)

A visual demonstration is strongly recommended, for both the original and new change (video / image - any one).

Video Demo (if applicable):

Before:

Screencast from 2026-02-23 23-12-10.webm

After:

Screencast from 2026-02-23 22-56-09.webm

Screencast from 2026-02-23 23-05-01.webm

  • Show screen recordings of the issue or feature.
  • Demonstrate how to reproduce the issue, the behavior before and after the change.

Image Demo (if applicable):

  • Add side-by-side screenshots of the original and updated change.
  • Highlight any significant change(s).

Mandatory Tasks (DO NOT REMOVE)

  • I have self-reviewed the code (A decent size PR without self-review might be rejected).
  • I have updated the developer docs in /docs if this PR makes changes that would require a documentation change. If N/A, write N/A here and check the checkbox.
  • I confirm automated tests are in place that prove my fix is effective or that my feature works.

How should this be tested?

  1. Route builder with new field types:

    • Create a routing form with Address, Checkbox, Checkbox Group, Multiple Emails, Radio Group, and URL fields
    • Add a route and verify all field types appear in the “Field” dropdown
    • Create rules using these fields and verify they render correctly
  2. E2E tests:

    • Run PLAYWRIGHT_HEADLESS=1 yarn e2e:app-store --workers=4 to verify all routing-forms tests pass
    • Specifically check basic.e2e.ts tests for field creation, editing, and prefill
  3. Field editing:

    • Create/edit routing forms and verify the FormBuilder dialog works for all field types
    • Verify Checkbox (boolean) field label editing works correctly
    • Verify field identifiers are generated correctly (lowercase-hyphenated)

Checklist

  • I haven’t read the contributing guide
  • My code doesn’t follow the style guidelines of this project
  • I haven’t commented my code, particularly in hard-to-understand areas
  • I haven’t checked if my changes generate no new warnings
  • My PR is too large (>500 lines or >10 files) and should be split into smaller PRs

Open with Devin

Claim

Total prize pool $50
Total paid $0
Status Pending
Submitted February 23, 2026
Last updated February 23, 2026

Contributors

SA

Sahitya Chandra

@sahitya-chandra

100%

Sponsors

CA

Cal.com, Inc.

@cal

$50