147 lines
4.0 KiB
Markdown
147 lines
4.0 KiB
Markdown
# 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.
|