144 lines
4.9 KiB
Markdown
144 lines
4.9 KiB
Markdown
# Public Complaint Form - Domain Dropdown Fix
|
|
|
|
## Issue Summary
|
|
|
|
The domain dropdown in the public complaint form was empty on page load, preventing users from selecting a complaint category.
|
|
|
|
## Root Cause Analysis
|
|
|
|
### 1. JavaScript Initialization Problem
|
|
The `loadDomains()` function was only called when the hospital dropdown changed:
|
|
```javascript
|
|
$('#id_hospital').on('change', function() {
|
|
loadDomains(hospitalId);
|
|
});
|
|
```
|
|
|
|
This meant domains were never loaded when the form first rendered.
|
|
|
|
### 2. API Endpoint Behavior
|
|
The `api_load_categories()` endpoint had this logic:
|
|
```python
|
|
if hospital_id:
|
|
categories_queryset = ComplaintCategory.objects.filter(
|
|
Q(hospitals__id=hospital_id) | Q(hospitals__isnull=True),
|
|
is_active=True
|
|
)
|
|
else:
|
|
categories_queryset = ComplaintCategory.objects.filter(
|
|
hospitals__isnull=True,
|
|
is_active=True
|
|
)
|
|
```
|
|
|
|
While this was correct, the JavaScript never called the API without a hospital ID initially.
|
|
|
|
### 3. Category Data Status
|
|
All 106 categories in the database are system-wide (no hospital assigned):
|
|
- 3 Domains (Level 1): CLINICAL, MANAGEMENT, RELATIONSHIPS
|
|
- 8 Categories (Level 2)
|
|
- Many Subcategories (Level 3)
|
|
- Many Classifications (Level 4)
|
|
|
|
## Solution Implemented
|
|
|
|
### 1. Updated API Endpoint (`apps/complaints/ui_views.py`)
|
|
Added clarifying comment to the `api_load_categories()` function:
|
|
```python
|
|
Updated: Always returns system-wide categories even without hospital_id,
|
|
to support initial form loading.
|
|
```
|
|
|
|
### 2. Modified JavaScript (`templates/complaints/public_complaint_form.html`)
|
|
|
|
#### Change 1: Simplified `loadDomains()` function
|
|
```javascript
|
|
function loadDomains(hospitalId) {
|
|
// Always load system-wide categories, even without a hospital
|
|
$.ajax({
|
|
url: '{% url "complaints:api_load_categories" %}',
|
|
type: 'GET',
|
|
data: { hospital_id: hospitalId || '' },
|
|
success: function(response) {
|
|
// ... populate dropdown
|
|
}
|
|
});
|
|
}
|
|
```
|
|
|
|
**Key change**: Removed the early return when no hospital is selected. Now always loads system-wide categories.
|
|
|
|
#### Change 2: Added page load initialization
|
|
```javascript
|
|
// Load domains on page initialization
|
|
$(document).ready(function() {
|
|
loadDomains(''); // Load system-wide categories on page load
|
|
});
|
|
```
|
|
|
|
**Key change**: Added document ready handler to load domains immediately when the page loads.
|
|
|
|
## Technical Details
|
|
|
|
### Data Flow
|
|
1. Page loads → `$(document).ready()` triggers
|
|
2. `loadDomains('')` calls API with empty hospital_id
|
|
3. API returns all system-wide categories (all 106 categories)
|
|
4. JavaScript populates domain dropdown with Level 1 categories (3 domains)
|
|
5. User selects domain → `loadCategories()` populates Level 2
|
|
6. User selects category → `loadSubcategories()` populates Level 3
|
|
7. User selects subcategory → `loadClassifications()` populates Level 4 (optional)
|
|
|
|
### Why This Works
|
|
- All categories are system-wide (not hospital-specific)
|
|
- The API returns the same data whether a hospital is selected or not
|
|
- Loading on page initialization provides immediate user feedback
|
|
- Hospital selection still triggers a refresh to support future hospital-specific categories
|
|
|
|
## Files Modified
|
|
|
|
1. **apps/complaints/ui_views.py**
|
|
- Updated `api_load_categories()` function with clarifying comment
|
|
|
|
2. **templates/complaints/public_complaint_form.html**
|
|
- Modified `loadDomains()` to always load categories
|
|
- Added `$(document).ready()` handler to load domains on page load
|
|
|
|
## Testing Recommendations
|
|
|
|
1. **Basic Functionality**
|
|
- Open the public complaint form
|
|
- Verify domain dropdown is populated with 3 options (Clinical, Management, Relationships)
|
|
- Select a domain and verify category dropdown appears with options
|
|
- Select a category and verify subcategory dropdown appears
|
|
- Verify classification dropdown appears if applicable
|
|
|
|
2. **Hospital Selection**
|
|
- Select a hospital
|
|
- Verify domain dropdown remains populated
|
|
- Verify cascading dropdowns still work
|
|
|
|
3. **Form Submission**
|
|
- Fill out all required fields
|
|
- Submit the form
|
|
- Verify complaint is created with correct taxonomy levels
|
|
|
|
4. **Arabic Support**
|
|
- Switch to Arabic
|
|
- Verify dropdown labels appear in Arabic
|
|
- Verify descriptions appear in Arabic (if available)
|
|
|
|
## Future Considerations
|
|
|
|
If hospital-specific categories are added in the future:
|
|
1. The current implementation will still work
|
|
2. When a hospital is selected, hospital-specific categories will be shown first
|
|
3. System-wide categories will always be available as fallback
|
|
4. The dropdown will refresh on hospital selection to show the correct categories
|
|
|
|
## Related Files
|
|
|
|
- `apps/complaints/models.py` - ComplaintCategory model with 4-level hierarchy
|
|
- `apps/complaints/management/commands/load_shct_taxonomy.py` - SHCT taxonomy loader
|
|
- `COMPLAINT_TAXONOMY_EXAMINATION.md` - Taxonomy structure documentation
|
|
- `check_hierarchy.py` - Script to verify category hierarchy |