init push
This commit is contained in:
146
docs/base-contact-roles-frontend-flow.md
Normal file
146
docs/base-contact-roles-frontend-flow.md
Normal file
@@ -0,0 +1,146 @@
|
||||
# Base Contact Roles Frontend Flow (English)
|
||||
|
||||
This document explains the frontend flow for contact assignment in the **Bases** module:
|
||||
- `responsible_flight_rescuer_contact_ids` (multi-contact)
|
||||
- `chief_physician_in_charge_contact_ids` (multi-contact)
|
||||
|
||||
Contact source is always based on **contact id (`users.id`)**.
|
||||
|
||||
## 1) Data Source for Contact Dropdowns
|
||||
|
||||
Get contact candidates from contacts API:
|
||||
- `GET /api/v1/contacts/get-all?role=air_rescuer&limit=200`
|
||||
|
||||
Minimum fields for FE:
|
||||
- `id` (resource id) => send this in base payload
|
||||
- `attributes.first_name`, `attributes.last_name`, `attributes.short_name` (display label)
|
||||
- optional: `attributes.is_active`
|
||||
|
||||
UI suggestion:
|
||||
- Use 2 separate multi-select components:
|
||||
- Responsible Flight Rescuer
|
||||
- Chief Physician In Charge
|
||||
- The same person may exist in both lists if business rules allow it.
|
||||
|
||||
## 2) Create Base Flow
|
||||
|
||||
Endpoint:
|
||||
- `POST /api/v1/bases/create`
|
||||
|
||||
Example payload:
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"type": "base",
|
||||
"attributes": {
|
||||
"base": "Lude",
|
||||
"base_category": "regular",
|
||||
"responsible_flight_rescuer_contact_ids": [
|
||||
"0196a111-1111-7abc-9def-111111111111",
|
||||
"0196a222-2222-7abc-9def-222222222222"
|
||||
],
|
||||
"chief_physician_in_charge_contact_ids": [
|
||||
"0196a333-3333-7abc-9def-333333333333"
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Backend behavior:
|
||||
- each id must be a valid UUID and exist in `users`
|
||||
- invalid UUID / missing user id => request fails (`4xx`)
|
||||
|
||||
## 3) Update Base Flow
|
||||
|
||||
Endpoint:
|
||||
- `PATCH /api/v1/bases/update/{uuid}`
|
||||
|
||||
Payload to update assignment only:
|
||||
```json
|
||||
{
|
||||
"data": {
|
||||
"type": "base_update",
|
||||
"attributes": {
|
||||
"responsible_flight_rescuer_contact_ids": [
|
||||
"0196a111-1111-7abc-9def-111111111111"
|
||||
],
|
||||
"chief_physician_in_charge_contact_ids": []
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
Important notes:
|
||||
- update uses **replace** semantics per base (not append)
|
||||
- always submit the final arrays from current UI state
|
||||
- send `[]` to clear all assignments for that role
|
||||
|
||||
## 4) Load Base Detail into Edit Form
|
||||
|
||||
Endpoint:
|
||||
- `GET /api/v1/bases/get/{uuid}`
|
||||
|
||||
Response fields used by FE:
|
||||
- `data.attributes.responsible_flight_rescuer_contact_ids`
|
||||
- `data.attributes.chief_physician_in_charge_contact_ids`
|
||||
- `data.attributes.responsible_flight_rescuers` (id + first_name + last_name)
|
||||
- `data.attributes.chief_physicians_in_charge` (id + first_name + last_name)
|
||||
|
||||
FE flow:
|
||||
1. Load base detail.
|
||||
2. Load contact options for dropdown.
|
||||
3. Map selected ids to option objects for selected state.
|
||||
4. Use detailed arrays to show human-readable names immediately.
|
||||
|
||||
## 5) Show Base Roles in Contacts Module
|
||||
|
||||
Contacts API now includes:
|
||||
- `attributes.base_roles` (array)
|
||||
|
||||
Item format:
|
||||
```json
|
||||
{
|
||||
"base_id": "0196b111-1111-7abc-9def-111111111111",
|
||||
"base_name": "Lude",
|
||||
"role_code": "responsible_flight_rescuer"
|
||||
}
|
||||
```
|
||||
|
||||
Affected endpoints:
|
||||
- `GET /api/v1/contacts/get-all`
|
||||
- `GET /api/v1/contacts/get-all/dt`
|
||||
- `GET /api/v1/contacts/{user_id}`
|
||||
|
||||
Suggested label mapping in UI:
|
||||
- `responsible_flight_rescuer` => `Responsible Flight Rescuer`
|
||||
- `chief_physician_in_charge` => `Chief Physician In Charge`
|
||||
|
||||
## 6) UX Recommendations
|
||||
|
||||
- In contact detail page, group `base_roles` by `base_name`.
|
||||
- In contact list, show compact chips, e.g.:
|
||||
- `Lude (Responsible Flight Rescuer)`
|
||||
- `Berlin (Chief Physician In Charge)`
|
||||
- For large lists, show only first N chips + `+X more`.
|
||||
|
||||
## 7) Minimum Error Handling
|
||||
|
||||
- If base submit fails because UUID validation fails:
|
||||
- show general message: `Invalid contact assignment`.
|
||||
- If contact id no longer exists:
|
||||
- show message: `Some contacts are no longer available, please refresh`.
|
||||
- After successful create/update:
|
||||
- refresh base detail to keep assignment state synced with backend.
|
||||
|
||||
## 8) Compatibility Note
|
||||
|
||||
For backward compatibility, both ID arrays and detailed name arrays are returned:
|
||||
- `responsible_flight_rescuer_contact_ids`
|
||||
- `responsible_flight_rescuers`
|
||||
- `chief_physician_in_charge_contact_ids`
|
||||
- `chief_physicians_in_charge`
|
||||
|
||||
Recommended FE usage:
|
||||
- Use `..._contact_ids` for submit payload.
|
||||
- Use detailed arrays for display names.
|
||||
Reference in New Issue
Block a user