8.7 KiB
D3.js Staff Hierarchy Visualization Integration
Overview
This document describes the integration of D3.js for interactive staff hierarchy visualization in the PX360 system. The D3.js implementation provides a modern, interactive alternative to the HTML-based hierarchy view.
What Was Implemented
1. D3.js Data API (/organizations/api/staff/hierarchy/)
Location: apps/organizations/views.py - StaffViewSet.hierarchy() action
Provides REST API endpoint that returns staff hierarchy data in D3-compatible JSON format:
@action(detail=False, methods=['get'])
def hierarchy(self, request):
"""Get staff hierarchy as D3-compatible JSON."""
Features:
- Returns hierarchical tree structure
- Supports filtering by hospital and department
- Includes search functionality
- Provides statistics (total staff, top managers)
- Calculates team sizes for each manager
Response Format:
{
"hierarchy": [
{
"id": "staff_id",
"name": "Staff Name",
"employee_id": "EMP123",
"job_title": "Manager",
"hospital": "Hospital Name",
"department": "Department Name",
"status": "active",
"staff_type": "type",
"team_size": 5,
"children": [...]
}
],
"statistics": {
"total_staff": 100,
"top_managers": 3
}
}
2. D3.js Visualization Template
Location: templates/organizations/staff_hierarchy_d3.html
Complete interactive visualization template with:
Features:
-
Three Layout Options:
- Horizontal tree (default)
- Vertical tree
- Radial layout
-
Interactive Controls:
- Search staff by name or ID
- Expand/collapse nodes
- Expand all / Collapse all buttons
- Zoom and pan support
- Reset view button
-
Node Sizing Options:
- Fixed size
- Size by team size
- Size by hierarchy level
-
Statistics Display:
- Total staff count
- Number of top managers
- Average hierarchy depth
-
Interactions:
- Single click: Expand/collapse children
- Double click: Navigate to staff detail page
- Hover: Show tooltip with staff information
- Search: Auto-navigate and highlight found staff
3. URL Routing
Location: apps/organizations/urls.py
path('staff/hierarchy/d3/', ui_views.staff_hierarchy_d3, name='staff_hierarchy_d3'),
4. View Function
Location: apps/organizations/ui_views.py
@login_required
def staff_hierarchy_d3(request):
"""Staff hierarchy D3 visualization view"""
5. D3.js Library Integration
Location: templates/layouts/base.html
Added D3.js v7.9.0 CDN:
<script src="https://cdn.jsdelivr.net/npm/d3@7.9.0/dist/d3.min.js"></script>
Accessing the D3 Visualization
URL
/organizations/staff/hierarchy/d3/
Navigation
From the sidebar or staff list page, users can access both:
- HTML-based Hierarchy:
/organizations/staff/hierarchy/ - D3 Interactive Hierarchy:
/organizations/staff/hierarchy/d3/
D3.js vs HTML-Based Hierarchy
HTML-Based Hierarchy (Original)
Advantages:
- Simple, static display
- Good for printing
- No JavaScript required
- SEO friendly
- Easy to customize with CSS
Disadvantages:
- Limited interactivity
- Manual expand/collapse requires page reload
- No zoom/pan capabilities
- Search is server-side only
- Fixed layout
D3.js Interactive Hierarchy (New)
Advantages:
-
Rich Interactivity:
- Click to expand/collapse
- Smooth animations
- Zoom and pan
- Real-time search
-
Multiple Layouts:
- Horizontal tree
- Vertical tree
- Radial/circular layout
-
Dynamic Visualization:
- Node sizing by team size or level
- Tooltips with detailed info
- Visual hierarchy indicators
-
Better UX:
- Client-side filtering
- Instant feedback
- Keyboard shortcuts
- Responsive design
Disadvantages:
- Requires JavaScript
- Longer initial load time
- More complex to maintain
- Not printable by default
Features Comparison
| Feature | HTML | D3.js |
|---|---|---|
| Expand/Collapse | Server-side (reload) | Client-side (instant) |
| Search | Server-side (reload) | Client-side (instant) |
| Zoom/Pan | ❌ | ✅ |
| Multiple Layouts | ❌ | ✅ (3 layouts) |
| Node Sizing | Fixed | Variable |
| Animations | ❌ | ✅ |
| Tooltips | ❌ | ✅ |
| Keyboard Support | Limited | Full |
| Printing | ✅ | Limited |
| Mobile Friendly | Basic | Enhanced |
| Performance | Good (small datasets) | Good (all sizes) |
User Guide
Basic Navigation
-
View the Hierarchy:
- Navigate to
/organizations/staff/hierarchy/d3/ - Chart loads with top-level managers visible
- Other staff collapsed by default
- Navigate to
-
Expand/Collapse:
- Click any node to toggle its children
- Use "Expand All" to show entire organization
- Use "Collapse All" to show only top managers
-
Zoom & Pan:
- Mouse wheel: Zoom in/out
- Click & drag: Pan around the chart
- "Reset View" button: Return to default position
-
Search Staff:
- Type in search box
- Press Enter
- Chart auto-navigates to found staff
- Found node is highlighted in red
-
Change Layout:
- Select from dropdown: Horizontal, Vertical, or Radial
- Chart instantly reorganizes
-
Adjust Node Sizes:
- Select from dropdown: Fixed, Team Size, or Level
- Visual representation updates immediately
Viewing Staff Details
- Double-click on any node to view full staff details
- Opens
/organizations/staff/{id}/page
Technical Details
Data Flow
User Request
↓
staff_hierarchy_d3 view
↓
Render D3 template
↓
JavaScript fetches /organizations/api/staff/hierarchy/
↓
StaffViewSet.hierarchy() action
↓
Query database (filter by user permissions)
↓
Build hierarchy tree
↓
Return JSON
↓
D3.js renders interactive visualization
Performance Considerations
- Data Fetching: Single API call retrieves entire hierarchy
- Client-Side Processing: All filtering/search happens in browser
- Optimizations:
- Django
select_relatedfor efficient queries - Cached hierarchy calculations
- Efficient D3 updates (only changed nodes)
- Django
Browser Compatibility
- Supported: Chrome, Firefox, Safari, Edge (latest versions)
- Required: JavaScript enabled
- Recommended: 1920x1080 or higher resolution
Customization
Changing Colors
Edit in templates/organizations/staff_hierarchy_d3.html:
// Node colors
.style("fill", d => d._children ? "var(--hh-primary)" : "var(--hh-success)")
.style("stroke", "var(--hh-primary)")
// Link color
.style("stroke", "#ccc")
Adjusting Layout Spacing
// Horizontal spacing
nodeSize([50, 200]) // [height, width]
// Depth spacing
d.y = d.depth * 200; // pixels per level
Adding Custom Data Fields
- Update
StaffViewSet.hierarchy()to include field - Update template to display field in tooltip or label
- Re-render chart
Future Enhancements
Potential Additions
-
Export Options:
- Export as PNG/SVG
- Export as PDF
- Print-friendly version
-
Advanced Filtering:
- Filter by staff type
- Filter by status
- Multi-criteria filters
-
Additional Visualizations:
- Sunburst chart
- Treemap
- Force-directed graph
-
Collaboration Features:
- Shareable links
- Embed in reports
- Compare hierarchies (time-based)
-
Analytics:
- Hierarchy depth analysis
- Span of control metrics
- Bottleneck identification
Troubleshooting
Chart Not Loading
Problem: Blank screen or "Failed to load hierarchy data" error
Solutions:
- Check browser console for JavaScript errors
- Verify API endpoint is accessible:
/organizations/api/staff/hierarchy/ - Check user has permission to view staff
- Ensure D3.js CDN is reachable
Search Not Working
Problem: Search doesn't find staff or doesn't navigate
Solutions:
- Verify staff exist in hierarchy
- Check browser console for errors
- Ensure staff have valid names/IDs
- Try full name instead of partial
Performance Issues
Problem: Chart is slow or unresponsive
Solutions:
- Reduce initial node count (collapse deeper levels)
- Use "Fixed Size" instead of "Team Size"
- Check network connection for data fetch
- Consider server-side pagination for very large datasets
Support
For issues or questions:
- Check browser console for JavaScript errors
- Review Django logs for API errors
- Test with different browsers
- Contact development team with screenshots and error details
References
- D3.js Documentation: https://d3js.org/
- D3 Tree Layout: https://github.com/d3/d3-hierarchy/tree
- API Endpoint:
/organizations/api/staff/hierarchy/ - Original HTML View:
/organizations/staff/hierarchy/