Rapport-Laravel/.cursor/rules/laravel-blade-forms.mdc

56 lines
3.4 KiB
Plaintext
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
description: Rapport form Blade templates — resolution order, patterns, guardrails
globs: resources/views/form/**/*.blade.php
alwaysApply: false
---
# Form views (`resources/views/form`)
## View selection (must match `FormController::deliverform`)
Resolution order for **form** links:
1. `form.{partition}.{form_id}` — Blade at `form/{partition}/{form_id}.blade.php` (controller uses `is_file` on a deploy-specific base path; if checks fail, overrides are skipped).
2. `form.{form_id}` — `form/{form_id}.blade.php` at folder root.
3. `form.common-enrollmentform` if `$formdata->form_type === 'enrollment_form'`.
4. `form.common-planexecution` if `$formdata->form_type === 'plan_vs_execution'`.
5. Else `form.common`.
**List** (`link_type == 'list'`): `form.{partition}.list-{form_id}` → `form.list-{form_id}` → `form.{partition}.list` → `form.list`. History views use similar `View::exists` patterns in the same controller.
If a new Blade’s name/path does not match this cascade, it will not load.
## Default implementation
- Prefer copying or extending **`form.common`**: `@foreach ($questions as $question)` and `@switch ($question->type)` (`hidden`, `text`, `email`, `tel`, `date`, `number`, `textarea`, `dropdown`, `radio`, `radiometrix`, `checkbox`, `file`, `multitextbox`).
- Use **`$question->code`** for `name` / `id` (`id="field-{{ $question->code }}"`). Checkbox names use `[]` where existing templates do.
- Preserve **`$questions`**, **`$form` / `$formdata`**, **`$form_id`**, **`$id`**, and optional **`$mode`**, **`$demo`**, **`$additional`** — do not rename without updating the controller and all templates.
## Layout and assets
- Reuse `@include('layouts.shared/title-meta', ...)`, `layouts.shared/head-css`, `layouts.shared/footer-script`, existing SweetAlert2 paths, `#pageloader`, and Bootstrap card / `account-pages` structure used in sibling blades.
## Submit behaviour
- Standard submit form: `id="report-form"`, `method="POST"`, `action="/form/submit"`, `enctype="multipart/form-data"`, `@csrf`, hidden `form_id`, optional hidden `id`. Client-side submit typically POSTs `FormData` to **`/form/ajaxsubmit`** with SweetAlert2 feedback — match `form.common` unless the page is explicitly non-submit (e.g. list-only).
### Required submit handler + notifications (SweetAlert2)
- For any submit-capable form Blade (`link_type == 'form'`), prefer using the exact `$('#report-form').on('submit', function(event){ ... })` pattern from `form.common`:
- prevent default submit
- show/hide `#pageloader`
- `POST` `new FormData($('#report-form')[0])` to `/form/ajaxsubmit`
- Use **SweetAlert2 (`Swal.fire`)** for all user-facing success/error messages in JS (no `alert()`, no console-only messages).
## Partition / client overrides
- Client-specific templates live under **`form/rapport-{client}/`**. File name must be **`{form_id}.blade.php`** (or the `list-` / `-history` variants the controller checks) so Laravel’s `form.{partition}.{form_id}` resolves.
## Do not
- Add a new stack (SPA framework, new global layout) or new submit URLs without **routes** and **`FormController`** changes.
- Remove approval / read-only behaviour (`is_approval`, file upload vs preview) when copying from `common` unless the task explicitly requires it.
- Refactor unrelated modules or shared layouts “while you’re here”.
When unsure, open **`form.common`** and the closest sibling template (e.g. **`form.common-planexecution`**, **`form.list`**) and mirror their structure.