# 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:

```python
@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:**
```json
{
  "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`

```python
path('staff/hierarchy/d3/', ui_views.staff_hierarchy_d3, name='staff_hierarchy_d3'),
```

### 4. View Function

**Location:** `apps/organizations/ui_views.py`

```python
@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:
```html
<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

1. **View the Hierarchy:**
   - Navigate to `/organizations/staff/hierarchy/d3/`
   - Chart loads with top-level managers visible
   - Other staff collapsed by default

2. **Expand/Collapse:**
   - Click any node to toggle its children
   - Use "Expand All" to show entire organization
   - Use "Collapse All" to show only top managers

3. **Zoom & Pan:**
   - Mouse wheel: Zoom in/out
   - Click & drag: Pan around the chart
   - "Reset View" button: Return to default position

4. **Search Staff:**
   - Type in search box
   - Press Enter
   - Chart auto-navigates to found staff
   - Found node is highlighted in red

5. **Change Layout:**
   - Select from dropdown: Horizontal, Vertical, or Radial
   - Chart instantly reorganizes

6. **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_related` for efficient queries
  - Cached hierarchy calculations
  - Efficient D3 updates (only changed nodes)

### 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`:

```javascript
// 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

```javascript
// Horizontal spacing
nodeSize([50, 200])  // [height, width]

// Depth spacing
d.y = d.depth * 200;  // pixels per level
```

### Adding Custom Data Fields

1. Update `StaffViewSet.hierarchy()` to include field
2. Update template to display field in tooltip or label
3. Re-render chart

## Future Enhancements

### Potential Additions

1. **Export Options:**
   - Export as PNG/SVG
   - Export as PDF
   - Print-friendly version

2. **Advanced Filtering:**
   - Filter by staff type
   - Filter by status
   - Multi-criteria filters

3. **Additional Visualizations:**
   - Sunburst chart
   - Treemap
   - Force-directed graph

4. **Collaboration Features:**
   - Shareable links
   - Embed in reports
   - Compare hierarchies (time-based)

5. **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:**
1. Check browser console for JavaScript errors
2. Verify API endpoint is accessible: `/organizations/api/staff/hierarchy/`
3. Check user has permission to view staff
4. Ensure D3.js CDN is reachable

### Search Not Working

**Problem:** Search doesn't find staff or doesn't navigate

**Solutions:**
1. Verify staff exist in hierarchy
2. Check browser console for errors
3. Ensure staff have valid names/IDs
4. Try full name instead of partial

### Performance Issues

**Problem:** Chart is slow or unresponsive

**Solutions:**
1. Reduce initial node count (collapse deeper levels)
2. Use "Fixed Size" instead of "Team Size"
3. Check network connection for data fetch
4. Consider server-side pagination for very large datasets

## Support

For issues or questions:
1. Check browser console for JavaScript errors
2. Review Django logs for API errors
3. Test with different browsers
4. 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/`
