# Plan: Event Proposal Public Form ## Context Event Proposal DocType exists but is only accessible via the Frappe desk. We want a public-facing form at `/dashboard/event-proposal` that anyone can submit, controlled by a toggle in Pohodex Event Manager Settings. --- ## Changes ### 1. Pohodex Event Manager Settings DocType **File:** `event_manager/events/doctype/buzz_settings/buzz_settings.json` Add a new **Proposals** Tab Break (before Communications tab) with: | Field | Type | Notes | |-------|------|-------| | `proposals_tab` | Tab Break | Label: "Proposals" | | `event_proposals_section` | Section Break | Label: "Event Proposals" | | `accept_event_proposals` | Check | Label: "Accept Event Proposals", default 0 | | `allow_guest_event_proposals` | Check | Label: "Allow Guest Submission", depends_on: `eval:doc.accept_event_proposals`, default 0 | | `event_proposal_success_message` | Markdown Editor | depends_on: `eval:doc.accept_event_proposals`, Label: "Success Message" | ### 2. Backend API **File:** `event_manager/api/forms.py` **2a. Add `EVENT_PROPOSAL_EXCLUDE_FIELDS`** ```python EVENT_PROPOSAL_EXCLUDE_FIELDS = STANDARD_EXCLUDE_FIELDS | { "naming_series", "amended_from", "host", } ``` `status` and `submitted_by` are already in `STANDARD_EXCLUDE_FIELDS`. **2b. `get_event_proposal_form_data()` — whitelist, allow_guest** - Read `Pohodex Event Manager Settings` — if `accept_event_proposals` is falsy, throw DoesNotExistError - If guest not allowed and user is Guest, throw AuthenticationError - Call `get_form_fields("Event Proposal", EVENT_PROPOSAL_EXCLUDE_FIELDS)` - Read success message from settings - Return `{form_fields, form_title, success_title, success_message, closed}` **2c. `submit_event_proposal(data)` — whitelist, allow_guest** - Same settings + guest check - Parse data via `frappe.parse_json` - Build doc from allowed fields only (filter through `get_form_fields`) - `frappe.get_doc(doc_data).insert(ignore_permissions=True)` ### 3. Frontend Route **File:** `dashboard/src/router.ts` Add route: ```typescript { path: "/event-proposal", name: "event-proposal", meta: { isPublic: true }, component: () => import("@/pages/EventProposalForm.vue"), } ``` ### 4. New Page: EventProposalForm.vue **File:** `dashboard/src/pages/EventProposalForm.vue` Slimmed-down version of BaseCustomEventForm: - No `eventRoute`/`formRoute` props - No `EventDetailsHeader` - No `CustomFieldsSection` - Calls `get_event_proposal_form_data` on mount - Submits to `submit_event_proposal` - Reuses `CustomFieldInput` for field rendering - Reuses table dialog pattern for Table fields - Shows success/closed/error states same as BaseCustomEventForm --- ## Files Summary | File | Action | Change | |------|--------|--------| | `event_manager/events/doctype/buzz_settings/buzz_settings.json` | Modify | Add Proposals tab with toggle + success message | | `event_manager/api/forms.py` | Modify | Add 2 endpoints + exclude set | | `dashboard/src/router.ts` | Modify | Add 1 route | | `dashboard/src/pages/EventProposalForm.vue` | New | Public form page | ## Implementation Order 1. Update Pohodex Event Manager Settings JSON + `bench migrate` 2. Add API endpoints in `event_manager/api/forms.py` 3. Add route + create `EventProposalForm.vue` 4. Test end-to-end ## Verification 1. Enable "Accept Event Proposals" in Pohodex Event Manager Settings 2. Navigate to `/dashboard/event-proposal` — form renders with Event Proposal fields (minus status, naming_series, amended_from, host) 3. Submit form — Event Proposal doc created with status "Received" 4. Disable toggle — form shows not found 5. Check success message renders after submission