Workflows

Step-by-step workflows

Panel path in the starter is /admin. Navigation group: Forms.

Create a form (admin)

  1. Open Forms and click Create.
  2. On the Settings tab, enter a Name. Slug and public path auto-fill from the name on blur if they were empty.
  3. Adjust Public path if you want a friendlier URL. Conflicts get a short -f{hash} suffix. The helper text shows the prefix (default /forms/{path}).
  4. Choose Layout: Single page, Wizard, Tabs, or Pages.
  5. Optional: description, default label position, success message, redirect URL after submit, notify emails.
  6. Leave Published off until the builder is ready. Active defaults on. Both must be on for the public URL to work.
  7. Save. You return to the list (create redirects to index). Open the form again to continue building.

Add sections and fields

  1. Open the form and use the Builder tab (the tab is kept in the query string).
  2. Each section is a collapsed repeater row labeled with the section title. Drag to reorder. Clone a section if the layout allows more than one.
  3. Single page forms cannot add or delete extra sections (max 1).
  4. Inside a section, Add field. Collapsed rows show Field label · type (or the internal name).
  5. Set label (auto-slugs the internal name if empty), type, width on the 12-column grid, required, optional label position override, label override, placeholder, hint, extra Laravel rules, and visibility pair.
  6. For select/radio/multi-select/tags, add options. Collapsed option rows show the option label.
  7. Switch to Preview for a live schematic of sections and spans. It is not the interactive public form.
Empty schema on create If you save with no sections, the page inserts a default “Details” section with no fields so the schema is never empty.

Publish and share

  1. Turn Published on (and keep Active on). Save.
  2. On the list, Open appears for published+active forms (new tab). The view page has Open public form.
  3. Share the URL shown under the form name (e.g. /forms/contact-us).

Unpublished forms stay in the admin but 404 for guests.

Capture data on the public form

  1. Open the public URL. The page uses the package layout and CSS (no Filament theme required).
  2. Wizard / pages: complete the step, click Next or Save and continue. Only that section is validated. Drafts restore if the visitor comes back in the same session.
  3. Tabs: switch sections freely; everything validates on Submit.
  4. Required fields show an asterisk. Errors appear under the field.
  5. On success, the success message displays. If a redirect URL is set, a Continue link appears (the visitor is not force-redirected).

Review submissions

  1. Open Submissions, or the Submissions relation on a form’s view/edit.
  2. Header charts: submissions over the last 14 days, and status doughnut.
  3. Tabs: Table / New / Reviewed / Archived.
  4. Filters: form (on the global list), status, submitted between dates, Field contains (internal field name + substring).
  5. Open a row to see labeled answers (option values mapped to labels). Mark Reviewed or Archive.
  6. Bulk: change status, archive, export selected, delete (audit logged).

Statuses: New (warning), Reviewed (success), Archived (gray), Spam (danger).

Export CSV / Excel / PDF

  1. On the submissions list, click Export (needs export_form_submissions once Shield has created it).
  2. Choose CSV, Excel (XML), or PDF.
  3. A notification shows the absolute path on the exports disk (default storage/app/form-builder-exports/). Download from the server or copy the file.
  4. Or select rows and use Export selected.

Clone, JSON export, import custom fields

Clone (admin)

List action Clone copies schema and settings, generates a new UUID/slug/path, and leaves the copy unpublished.

Export JSON (admin)

On Edit, Export JSON writes storage/app/form-builder-exports/{slug}.json using document().

CLI import/export

php artisan form-builder:export --slug=contact-us
php artisan form-builder:import storage/app/form-builder-export.json --publish

Import from Dynamic Fields (developer)

There is no Filament button in v1.0.0. In tinker, a seeder, or your own action:

$form = \Spiggle\FormBuilder\Models\Form::query()->where('slug', 'contact-us')->first();
$form->importCustomFields([1, 2, 3]); // custom_fields.id values

Fields append to the last section as a snapshot. Later edits in Custom Fields do not update the form. Submissions still go to form_builder_submissions, never custom_field_values.

Validate and store from code

$rules = app(\Spiggle\FormBuilder\Services\ValidationBuilder::class)->rules($form);
$ok = Validator::make(['data' => $payload], $rules)->passes();

app(\Spiggle\FormBuilder\Services\SubmissionManager::class)
    ->capture($form, $payload, request(), ['source' => 'api']);

Listen to Spiggle\FormBuilder\Events\FormSubmitted to send mail to notify_emails (addresses are stored on the form; v1 does not send mail by itself).