SailingMedAdvisor / SPEC_Add_Crew_Functionality.md
Rick
Sync working tree changes
e171203
# Specification: Add Crew Member Functionality
## Vessel & Crew Info Page
**Document Version:** 1.0
**Date:** January 22, 2026
**System:** SailingMedAdvisor v5.7
---
## 1. Overview
The Add Crew Member functionality allows users to register new crew members, passengers, or captain into the SailingMedAdvisor system. This feature is located on the **Vessel & Crew Info** tab within a collapsible "Add New Crew Member" section under "Crew Information".
---
## 2. User Interface Location
- **Primary Tab:** Vessel & Crew (4th tab in main navigation)
- **Parent Section:** Crew Information (collapsible)
- **Component:** Add New Crew Member (nested collapsible form)
- **UI State:** Initially collapsed (must be expanded to access)
---
## 3. Form Fields
### 3.1 Personal Information
| Field Name | Input Type | Required | Validation | Notes |
|------------|------------|----------|------------|-------|
| First Name | Text | Yes* | Non-empty after trim | Left column of 3-column grid |
| Middle Name(s) | Text | No | None | Center column of 3-column grid |
| Last Name | Text | Yes* | Non-empty after trim | Right column of 3-column grid |
| Sex | Dropdown | Yes* | Must select value | Options: Male, Female, Non-binary, Other, Prefer not to say |
| Birthdate | Date | Yes* | Must have value | Standard HTML date picker |
| Position | Dropdown | Yes* | Must select value | Options: Captain, Crew, Passenger |
### 3.2 Travel Documents
| Field Name | Input Type | Required | Validation | Notes |
|------------|------------|----------|------------|-------|
| Citizenship | Text + Datalist | Yes* | Non-empty after trim | Autocomplete suggestions from predefined country list |
| Passport Number | Text | Yes* | Non-empty after trim | Unique identifier |
| Issue Date | Date | No | None | Passport issue date |
| Expiry Date | Date | No | None | Passport expiration date |
**Country Datalist:** USA, Canada, UK, Australia, New Zealand, France, Germany, Spain, Italy, Netherlands, Singapore, Malaysia, Thailand, Philippines, Japan, China, India
### 3.3 Contact Information
| Field Name | Input Type | Required | Validation | Notes |
|------------|------------|----------|------------|-------|
| Cell/WhatsApp | Text | No | None | Placeholder format: +1234567890 |
| Passport Photo/PDF | File | No | Image/* or PDF, <5MB | Uploaded separately after crew creation |
| Passport Page Photo/PDF | File | No | Image/* or PDF, <5MB | Uploaded separately after crew creation |
### 3.4 Emergency Contact Information
| Field Name | Input Type | Required | Validation | Notes |
|------------|------------|----------|------------|-------|
| Name | Text | No | None | Emergency contact's full name |
| Relationship | Text | No | None | Relationship to crew member |
| Phone | Text | No | None | Emergency contact phone number |
| Email | Email | No | None | Emergency contact email address |
| Emergency Contact Notes | Text | No | None | Additional emergency contact information |
\* = Required field validation enforced
---
## 4. Functional Behavior
### 4.1 Add Operation Workflow
1. **User Input Phase:**
- User expands "Crew Information" section (if collapsed)
- User expands "Add New Crew Member" section (if collapsed)
- User fills out form fields
- User clicks "+ Add Crew Member" button
2. **Validation Phase:**
```javascript
Required Field Checks (in order):
1. First Name - Alert: "Please enter first name and last name"
2. Last Name - Alert: "Please enter first name and last name"
3. Sex - Alert: "Please select sex"
4. Birthdate - Alert: "Please enter birthdate"
5. Position - Alert: "Please select position"
6. Citizenship - Alert: "Please enter citizenship"
7. Passport Number - Alert: "Please enter passport number"
```
- If any validation fails, display alert and stop processing
- User must correct the issue and re-submit
3. **Data Creation Phase:**
- Fetch existing crew data from `/api/data/patients`
- Create new crew member object:
```javascript
{
id: Date.now().toString(), // Timestamp-based unique ID
firstName: string,
middleName: string,
lastName: string,
sex: string,
birthdate: string (YYYY-MM-DD),
position: string,
citizenship: string,
passportNumber: string,
passportIssue: string (YYYY-MM-DD),
passportExpiry: string (YYYY-MM-DD),
emergencyContactName: string,
emergencyContactRelation: string,
emergencyContactPhone: string,
emergencyContactEmail: string,
emergencyContactNotes: string,
phoneNumber: string,
passportPhoto: '', // Empty initially
passportPage: '', // Empty initially
history: '' // Empty initially
}
```
4. **Data Persistence Phase:**
- Append new crew member to existing array
- POST updated array to `/api/data/patients` endpoint
- Server persists data to JSON file
5. **UI Update Phase:**
- Clear all form fields (reset to empty/default state)
- Call `loadData()` function to refresh UI
- New crew member appears in:
- Crew Information list (on current tab)
- Crew Health & Log dropdown
- Chat page crew member selector
---
## 5. Data Model
### 5.1 Storage Location
- **Endpoint:** `/api/data/patients`
- **Method:** GET (retrieve), POST (update)
- **Format:** JSON array
- **File:** `data/patients.json`
### 5.2 ID Generation
- **Algorithm:** `Date.now().toString()`
- **Format:** Unix timestamp as string (e.g., "1737522671234")
- **Uniqueness:** Guaranteed by millisecond precision
- **Note:** IDs are not sequential, time-based for traceability
---
## 6. Integration Points
### 6.1 Affected Components
1. **Crew Member Dropdown (Chat Page):**
- New crew member added to `p-select` dropdown
- Available for triage queries immediately
2. **Crew Medical List:**
- New entry created with empty medical history
- Accessible on "Crew Health & Log" tab
3. **Crew Information List:**
- New collapsible section created
- Shows crew member details with edit capability
### 6.2 Related Functions
- `loadCrewData()` - Refreshes all crew-dependent UI elements
- `getCrewDisplayName()` - Formats name as "Last, First"
- `getCrewFullName()` - Formats name as "First Last"
- `calculateAge()` - Calculates age from birthdate
---
## 7. User Experience Features
### 7.1 Form Behavior
- **Auto-trim:** All text fields automatically trimmed before save
- **Reset on Success:** Form clears completely after successful add
- **Datalist Support:** Citizenship field provides autocomplete suggestions
- **File Upload:** Document uploads handled separately after crew creation
### 7.2 Validation Feedback
- **Real-time:** No real-time validation (submit-time only)
- **Error Messages:** Alert-based, blocking further action until resolved
- **Field Focus:** No automatic focus on error field (manual user correction required)
---
## 8. Button Specification
### 8.1 Add Crew Member Button
- **Label:** "+ Add Crew Member"
- **Style:**
- Background: `var(--dark)` (#2c3e50)
- Text: White
- Width: 100% of container
- Class: `btn btn-sm`
- **Action:** `onclick="addCrew()"`
- **Location:** Bottom of Add New Crew Member form
---
## 9. Edge Cases and Error Handling
### 9.1 Duplicate Detection
- **Current Behavior:** No duplicate detection
- **Allowed:** Multiple crew members with identical names
- **Recommendation:** Consider adding duplicate warning for same passport number
### 9.2 Network Failures
- **No Error Handling:** Function assumes successful API calls
- **Risk:** Silent failure if network or server issues occur
- **Recommendation:** Add try-catch blocks and user feedback
### 9.3 Concurrent Modifications
- **Race Condition:** Possible if multiple users add crew simultaneously
- **Mitigation:** Last-write-wins (later POST overwrites earlier)
- **Recommendation:** Implement server-side locking or conflict detection
---
## 10. Security Considerations
### 10.1 Input Sanitization
- **Client-side:** Basic HTML escaping via `escapeHtml()` on display
- **Server-side:** Assumed (not verified in frontend code)
- **File Uploads:** Size limit enforced (5MB), type validation (image/PDF)
### 10.2 Authentication
- **Current:** Uses `credentials: 'same-origin'` for API calls
- **Session-based:** Assumes server-side session validation
- **Login:** Crew-specific login credentials managed separately in Settings
---
## 11. Accessibility Notes
### 11.1 Current State
- **Labels:** Present for all form fields
- **Required Indicators:** Asterisk (*) in label text
- **Keyboard Navigation:** Standard HTML form tab order
- **Screen Reader:** Field labels associated with inputs
### 11.2 Improvements Needed
- **ARIA attributes:** Not currently implemented
- **Error announcements:** Alert dialogs are announced but could be improved
- **Focus management:** No automatic focus on validation errors
---
## 12. Performance Characteristics
### 12.1 Scalability
- **Data Structure:** Array-based, linear search for operations
- **Current Capacity:** Suitable for small crews (< 100 members)
- **Load Time:** O(n) where n = number of crew members
- **Recommendation:** Consider indexing for larger datasets
### 12.2 Network Efficiency
- **Data Transfer:** Full array sent on each POST (not incremental)
- **Bandwidth:** Minimal for typical crew sizes
- **Optimization:** Could implement PATCH for single crew updates
---
## 13. Testing Scenarios
### 13.1 Happy Path
1. Fill all required fields with valid data
2. Click "+ Add Crew Member"
3. Verify form clears
4. Verify crew appears in all relevant lists
5. Verify crew is selectable in chat dropdown
### 13.2 Validation Testing
1. Submit with each required field missing (one at a time)
2. Verify correct error message displayed
3. Verify form data retained after validation failure
### 13.3 Data Integrity
1. Add crew member
2. Refresh page
3. Verify crew member persists
4. Verify all fields saved correctly
### 13.4 Special Characters
1. Enter names with special characters (e.g., O'Brien, José)
2. Verify correct storage and display
3. Check CSV export format
---
## 14. Related Documentation
- **Main Application:** `app.py` - Backend API endpoints
- **Frontend Logic:** `static/js/crew.js` - Crew management functions
- **UI Template:** `templates/index.html` - Form structure
- **Data Schema:** `data/patients.json` - Sample data structure
---
## 15. Version History
| Version | Date | Changes | Author |
|---------|------|---------|--------|
| 1.0 | 2026-01-22 | Initial specification based on code analysis | System |
---
## 16. Future Enhancements
### 16.1 Potential Improvements
1. **Photo capture:** Direct camera integration for passport photos
2. **Barcode scanning:** Auto-fill from passport MRZ scan
3. **Duplicate detection:** Warning for similar names/passport numbers
4. **Batch import:** CSV import for multiple crew members
5. **Validation enhancement:** Real-time field validation
6. **Data export:** Individual crew member PDF dossier generation
7. **History tracking:** Audit log of crew member additions/changes
### 16.2 Integration Opportunities
1. **External APIs:** Passport validation services
2. **Compliance:** International maritime crew list standards (IMO FAL forms)
3. **Sync:** Cloud backup and multi-device synchronization