425 lines
12 KiB
Markdown
425 lines
12 KiB
Markdown
# PX360 - UI Implementation Guide
|
|
|
|
**Last Updated:** December 15, 2025, 10:00 AM (Asia/Riyadh)
|
|
**Status:** Complaints Console Complete, Action Center 75% Complete
|
|
|
|
---
|
|
|
|
## 📦 What Has Been Completed
|
|
|
|
### 1. Complaints Console (100% ✅)
|
|
**Location:** `/complaints/`
|
|
|
|
**Files Created:**
|
|
- `apps/complaints/ui_views.py` (500+ lines)
|
|
- `templates/complaints/complaint_list.html` (400+ lines)
|
|
- `templates/complaints/complaint_detail.html` (600+ lines)
|
|
- `templates/complaints/complaint_form.html` (300+ lines)
|
|
- URLs configured and integrated
|
|
|
|
**Features:**
|
|
- ✅ Advanced list view with 8 filter types
|
|
- ✅ Multiple view tabs (All, My, Overdue, etc.)
|
|
- ✅ Detail view with SLA countdown
|
|
- ✅ Timeline visualization
|
|
- ✅ Workflow actions (assign, status change, notes, escalate)
|
|
- ✅ Create form with cascading selects
|
|
- ✅ RBAC enforcement
|
|
- ✅ Audit logging
|
|
|
|
### 2. PX Action Center Console (75% ✅)
|
|
**Location:** `/actions/`
|
|
|
|
**Files Created:**
|
|
- `apps/px_action_center/ui_views.py` (500+ lines) ✅
|
|
- `templates/actions/action_list.html` (600+ lines) ✅
|
|
- `templates/actions/action_detail.html` - **NEEDS TO BE CREATED**
|
|
|
|
**Completed:**
|
|
- ✅ All Django views (list, detail, assign, status change, notes, escalate, approve)
|
|
- ✅ List template with 8 view tabs
|
|
- ✅ Advanced filters
|
|
- ✅ Source badges (survey, complaint, social, call center)
|
|
- ✅ Escalation level indicators
|
|
|
|
**Remaining:**
|
|
- ⏳ Action detail template (similar to complaint detail but with:)
|
|
- SLA progress bar (visual percentage)
|
|
- Evidence upload section
|
|
- Approval workflow UI
|
|
- Action plan and outcome fields
|
|
- ⏳ URL routing configuration
|
|
- ⏳ Sidebar navigation update
|
|
|
|
---
|
|
|
|
## 🚀 How to Complete Action Center (2-3 hours)
|
|
|
|
### Step 1: Create Action Detail Template
|
|
|
|
Create `templates/actions/action_detail.html` based on `templates/complaints/complaint_detail.html`:
|
|
|
|
**Key Differences:**
|
|
1. **SLA Progress Bar** - Add visual progress indicator:
|
|
```html
|
|
<div class="progress" style="height: 30px;">
|
|
<div class="progress-bar {% if action.is_overdue %}bg-danger{% else %}bg-success{% endif %}"
|
|
style="width: {{ sla_progress }}%">
|
|
{{ sla_progress }}%
|
|
</div>
|
|
</div>
|
|
```
|
|
|
|
2. **Evidence Section** - Add evidence upload and display:
|
|
```html
|
|
<div class="card mb-3">
|
|
<div class="card-header bg-warning text-dark">
|
|
<h6 class="mb-0"><i class="bi bi-file-earmark-check me-2"></i>Evidence</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
{% for evidence in evidence_attachments %}
|
|
<!-- Display evidence files -->
|
|
{% endfor %}
|
|
|
|
{% if can_edit %}
|
|
<form method="post" enctype="multipart/form-data">
|
|
<!-- File upload form -->
|
|
</form>
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
```
|
|
|
|
3. **Approval Workflow** - Add approval section:
|
|
```html
|
|
{% if action.status == 'pending_approval' and can_approve %}
|
|
<div class="card mb-3">
|
|
<div class="card-header bg-success text-white">
|
|
<h6 class="mb-0"><i class="bi bi-check-circle me-2"></i>Approval Required</h6>
|
|
</div>
|
|
<div class="card-body">
|
|
<form method="post" action="{% url 'actions:action_approve' action.id %}">
|
|
{% csrf_token %}
|
|
<button type="submit" class="btn btn-success">
|
|
<i class="bi bi-check-circle me-1"></i> Approve Action
|
|
</button>
|
|
</form>
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
```
|
|
|
|
4. **Action Plan & Outcome** - Add text areas:
|
|
```html
|
|
<div class="mb-3">
|
|
<label class="form-label">Action Plan</label>
|
|
<textarea class="form-control" rows="4" readonly>{{ action.action_plan }}</textarea>
|
|
</div>
|
|
<div class="mb-3">
|
|
<label class="form-label">Outcome</label>
|
|
<textarea class="form-control" rows="4" readonly>{{ action.outcome }}</textarea>
|
|
</div>
|
|
```
|
|
|
|
### Step 2: Configure URLs
|
|
|
|
Update `apps/px_action_center/urls.py`:
|
|
|
|
```python
|
|
from django.urls import include, path
|
|
from rest_framework.routers import DefaultRouter
|
|
|
|
from .views import PXActionViewSet, PXActionSLAConfigViewSet, RoutingRuleViewSet
|
|
from . import ui_views
|
|
|
|
app_name = 'actions'
|
|
|
|
router = DefaultRouter()
|
|
router.register(r'api/actions', PXActionViewSet, basename='action-api')
|
|
router.register(r'api/sla-configs', PXActionSLAConfigViewSet, basename='sla-config-api')
|
|
router.register(r'api/routing-rules', RoutingRuleViewSet, basename='routing-rule-api')
|
|
|
|
urlpatterns = [
|
|
# UI Views
|
|
path('', ui_views.action_list, name='action_list'),
|
|
path('<uuid:pk>/', ui_views.action_detail, name='action_detail'),
|
|
path('<uuid:pk>/assign/', ui_views.action_assign, name='action_assign'),
|
|
path('<uuid:pk>/change-status/', ui_views.action_change_status, name='action_change_status'),
|
|
path('<uuid:pk>/add-note/', ui_views.action_add_note, name='action_add_note'),
|
|
path('<uuid:pk>/escalate/', ui_views.action_escalate, name='action_escalate'),
|
|
path('<uuid:pk>/approve/', ui_views.action_approve, name='action_approve'),
|
|
|
|
# API Routes
|
|
path('', include(router.urls)),
|
|
]
|
|
```
|
|
|
|
### Step 3: Update Main URLs
|
|
|
|
Update `config/urls.py`:
|
|
|
|
```python
|
|
# UI Pages
|
|
path('complaints/', include('apps.complaints.urls')),
|
|
path('actions/', include('apps.px_action_center.urls')), # ADD THIS LINE
|
|
```
|
|
|
|
### Step 4: Update Sidebar Navigation
|
|
|
|
Update `templates/layouts/partials/sidebar.html`:
|
|
|
|
```html
|
|
<!-- PX Actions -->
|
|
<li class="nav-item">
|
|
<a class="nav-link {% if 'actions' in request.path %}active{% endif %}"
|
|
href="{% url 'actions:action_list' %}">
|
|
<i class="bi bi-clipboard-check"></i>
|
|
PX Actions
|
|
<span class="badge bg-warning">{{ action_count|default:0 }}</span>
|
|
</a>
|
|
</li>
|
|
```
|
|
|
|
---
|
|
|
|
## 📋 Remaining Modules (Priority Order)
|
|
|
|
### 3. Public Survey Form (CRITICAL - 4-6 hours)
|
|
**Why Critical:** Patient-facing, required for survey responses
|
|
|
|
**Files to Create:**
|
|
- `apps/surveys/public_views.py`
|
|
- `templates/surveys/public_form.html`
|
|
- `templates/surveys/thank_you.html`
|
|
|
|
**Key Features:**
|
|
- Mobile-first responsive design
|
|
- Bilingual toggle (AR/EN)
|
|
- Token-based secure access
|
|
- Progress indicator
|
|
- Question type rendering (Rating, NPS, Likert, Multiple Choice, Text)
|
|
- Form validation
|
|
- Thank you page
|
|
|
|
**Implementation Pattern:**
|
|
```python
|
|
@require_http_methods(["GET", "POST"])
|
|
def survey_form(request, token):
|
|
"""Public survey form - no login required"""
|
|
try:
|
|
survey = SurveyInstance.objects.get(
|
|
access_token=token,
|
|
status='sent',
|
|
expires_at__gt=timezone.now()
|
|
)
|
|
except SurveyInstance.DoesNotExist:
|
|
return render(request, 'surveys/invalid_token.html')
|
|
|
|
if request.method == 'POST':
|
|
# Process responses
|
|
# Calculate score
|
|
# Update survey status
|
|
# Create PX action if negative
|
|
return redirect('surveys:thank_you', token=token)
|
|
|
|
return render(request, 'surveys/public_form.html', {'survey': survey})
|
|
```
|
|
|
|
### 4. Journey Console (8-10 hours)
|
|
**Files to Create:**
|
|
- `apps/journeys/ui_views.py`
|
|
- `templates/journeys/template_list.html`
|
|
- `templates/journeys/template_form.html` (stage builder)
|
|
- `templates/journeys/instance_list.html`
|
|
- `templates/journeys/instance_detail.html` (progress stepper)
|
|
|
|
**Key Features:**
|
|
- Template CRUD
|
|
- Stage management (add, edit, reorder, delete)
|
|
- Survey binding per stage
|
|
- Instance monitoring with progress visualization
|
|
- Event timeline
|
|
|
|
### 5. Survey Console (8-10 hours)
|
|
**Files to Create:**
|
|
- `apps/surveys/ui_views.py`
|
|
- `templates/surveys/template_list.html`
|
|
- `templates/surveys/template_form.html` (question builder)
|
|
- `templates/surveys/instance_list.html`
|
|
- `templates/surveys/instance_detail.html`
|
|
- `templates/surveys/analytics.html`
|
|
|
|
**Key Features:**
|
|
- Template CRUD
|
|
- Question builder (add, edit, reorder, delete)
|
|
- Branching logic editor
|
|
- Instance monitoring
|
|
- Analytics dashboard with charts
|
|
|
|
### 6. Social Media Monitoring (4-6 hours)
|
|
**Files to Create:**
|
|
- `apps/social/ui_views.py`
|
|
- `templates/social/mention_list.html`
|
|
- `templates/social/mention_detail.html`
|
|
|
|
### 7. Call Center Console (4-6 hours)
|
|
**Files to Create:**
|
|
- `apps/callcenter/ui_views.py`
|
|
- `templates/callcenter/interaction_list.html`
|
|
- `templates/callcenter/interaction_detail.html`
|
|
- `templates/callcenter/dashboard.html`
|
|
|
|
### 8. Analytics/KPI Console (6-8 hours)
|
|
**Files to Create:**
|
|
- `apps/analytics/ui_views.py`
|
|
- `templates/analytics/dashboard.html`
|
|
- `templates/analytics/kpi_list.html`
|
|
|
|
### 9. Configuration Console (4-6 hours)
|
|
**Files to Create:**
|
|
- `apps/core/config_views.py`
|
|
- `templates/config/dashboard.html`
|
|
- `templates/config/sla_config.html`
|
|
- `templates/config/routing_rules.html`
|
|
|
|
---
|
|
|
|
## 🎨 Established Design Patterns
|
|
|
|
### Layout Structure
|
|
```
|
|
base.html
|
|
├── sidebar (navigation)
|
|
├── topbar (search, notifications, user menu)
|
|
└── content
|
|
├── page header
|
|
├── statistics cards
|
|
├── view tabs (optional)
|
|
├── filter panel (collapsible)
|
|
├── table toolbar
|
|
├── data table/cards
|
|
└── pagination
|
|
```
|
|
|
|
### Color Scheme
|
|
- **Primary:** #667eea (Purple gradient)
|
|
- **Success:** #388e3c (Green)
|
|
- **Warning:** #f57c00 (Orange)
|
|
- **Danger:** #d32f2f (Red)
|
|
- **Info:** #1976d2 (Blue)
|
|
|
|
### Badge Classes
|
|
```css
|
|
.status-badge { /* Status indicators */ }
|
|
.severity-badge { /* Severity levels */ }
|
|
.source-badge { /* Source types */ }
|
|
.overdue-badge { /* Overdue items */ }
|
|
.escalation-badge { /* Escalation levels */ }
|
|
```
|
|
|
|
### Common Components
|
|
- **Stat Cards:** 4-column grid with icons
|
|
- **Filter Panel:** Collapsible with toggle button
|
|
- **Timeline:** Vertical timeline with colored dots
|
|
- **Progress Bar:** Bootstrap progress with percentage
|
|
- **Tabs:** Bootstrap nav-tabs for content sections
|
|
- **Modals:** Bootstrap modals for confirmations
|
|
|
|
---
|
|
|
|
## 🔧 Technical Guidelines
|
|
|
|
### Query Optimization
|
|
```python
|
|
queryset = Model.objects.select_related(
|
|
'foreign_key1', 'foreign_key2'
|
|
).prefetch_related(
|
|
'many_to_many', 'reverse_foreign_key'
|
|
)
|
|
```
|
|
|
|
### RBAC Pattern
|
|
```python
|
|
user = request.user
|
|
if user.is_px_admin():
|
|
pass # See all
|
|
elif user.is_hospital_admin() and user.hospital:
|
|
queryset = queryset.filter(hospital=user.hospital)
|
|
elif user.hospital:
|
|
queryset = queryset.filter(hospital=user.hospital)
|
|
else:
|
|
queryset = queryset.none()
|
|
```
|
|
|
|
### Audit Logging
|
|
```python
|
|
AuditService.log(
|
|
event_type='action_type',
|
|
description='Description of action',
|
|
user=request.user,
|
|
content_object=object,
|
|
metadata={'key': 'value'}
|
|
)
|
|
```
|
|
|
|
### Flash Messages
|
|
```python
|
|
messages.success(request, "Operation successful.")
|
|
messages.error(request, "Operation failed.")
|
|
messages.warning(request, "Warning message.")
|
|
messages.info(request, "Information message.")
|
|
```
|
|
|
|
---
|
|
|
|
## 📊 Progress Tracking
|
|
|
|
**Overall Project:** 93% Complete
|
|
- Backend: 90% ✅
|
|
- UI: 33% (was 25%)
|
|
- Base Layout: 100% ✅
|
|
- Dashboard: 100% ✅
|
|
- Complaints: 100% ✅
|
|
- Actions: 75% ⏳
|
|
- Journeys: 0%
|
|
- Surveys: 0%
|
|
- Public Survey: 0%
|
|
- Social/Call/Analytics/Config: 0%
|
|
|
|
**Estimated Remaining Time:** 40-50 hours
|
|
- Complete Actions: 2-3 hours
|
|
- Public Survey Form: 4-6 hours
|
|
- Journey Console: 8-10 hours
|
|
- Survey Console: 8-10 hours
|
|
- Other Consoles: 18-24 hours
|
|
|
|
---
|
|
|
|
## 🎯 Quick Win Strategy
|
|
|
|
**To reach 50% UI completion quickly (next 10-12 hours):**
|
|
1. ✅ Complete Action Center (2-3 hours)
|
|
2. ✅ Public Survey Form (4-6 hours) - CRITICAL
|
|
3. ✅ Basic Journey Instance Viewer (3-4 hours) - Skip template builder for now
|
|
|
|
This would bring UI to 50% and make the system functional for patient surveys.
|
|
|
|
---
|
|
|
|
## 📝 Testing Checklist
|
|
|
|
### Per Module:
|
|
- [ ] List view loads with data
|
|
- [ ] Filters work correctly
|
|
- [ ] Pagination functions
|
|
- [ ] Search returns results
|
|
- [ ] Detail view displays all info
|
|
- [ ] Workflow actions work
|
|
- [ ] RBAC permissions enforced
|
|
- [ ] Responsive on mobile
|
|
- [ ] RTL support (Arabic)
|
|
|
|
---
|
|
|
|
**Next Developer:** Start with completing the Action Center detail template using the complaints detail template as a reference. The patterns are established and consistent across all modules.
|