Project Timeline & Milestone Visualization Guide
Last Updated: 2026-01-17 Status: Implemented Plan Reference: 132-project-timeline-visualization.md
Overview
The Project Timeline feature provides visual timeline and milestone visualization for client portal users. Clients can see project phases, milestone progress, upcoming deadlines, and overall project timeline at a glance, eliminating the need to read through text-based lists.
Table of Contents
- Accessing Timeline
- Features
- How to Use
- Milestone Status Indicators
- Deadline Indicators
- Technical Architecture
- Related Features
Accessing Timeline
Navigation
| Access Point | Location | URL | Role |
|---|---|---|---|
| Timeline Tab | Project detail page | /portal/projects/{id} (timeline section) | Client |
| Full Timeline | Project timeline page | /portal/projects/{id}/timeline | Client |
Permissions
| Action | Admin | Client User |
|---|---|---|
| View own project timeline | ✅ | ✅ |
| View any project timeline | ✅ | ❌ |
Features
Visual Timeline
- Vertical list timeline with status indicators
- Progress bars for overall and milestone-level completion
- Clear date indicators for each milestone
- Visual connection line between milestones
Progress Tracking
- Overall project progress percentage
- Individual milestone progress
- Completed deliverables count
Deadline Visualization
- Days until due countdown
- Overdue warnings with pulsing indicators
- Due this week alerts
Interactive Elements
- Click milestone to view details
- Expand/collapse deliverables list
- Link to milestone acceptance page
How to Use
Viewing Project Timeline
- Navigate to Portal → Projects → [Project]
- Scroll to the Timeline section or click the Timeline tab
- View milestones in chronological order
- Check overall progress bar at the top
Understanding the Timeline
Progress Bar: The progress bar at the top shows overall project completion based on completed milestones:
[========Progress Bar 65%========]
Milestone List: Milestones are displayed vertically with:
- Status indicator (colored circle)
- Milestone name and due date
- Deliverables checklist
- Days remaining or overdue count
Interacting with Milestones
- Click milestone card to see full details
- Hover over deliverables for status info
- Click "View Details" to access milestone acceptance page
Milestone Status Indicators
| Status | Icon | Color | Description |
|---|---|---|---|
| Complete | ● (filled circle + check) | Green | Milestone finished |
| In Progress | ◐ (half circle) | Blue | Currently active |
| Pending/Upcoming | ○ (empty circle) | Gray | Not yet started |
| Overdue | ⚠ (pulsing circle) | Red | Past due date, not complete |
| Blocked | ⊘ (blocked) | Orange | Waiting on dependency |
Status Colors (Tailwind Classes)
<!-- Complete -->
<div class="bg-green-500">...</div>
<!-- In Progress -->
<div class="bg-blue-500">...</div>
<!-- Pending -->
<div class="bg-gray-300 dark:bg-gray-600">...</div>
<!-- Overdue -->
<div class="bg-red-500 animate-pulse">...</div>
Deadline Indicators
Deadline Badges
| Condition | Display | Style |
|---|---|---|
| Due Today | "Due Today" | Red badge |
| Due This Week | "X days left" | Yellow badge |
| Overdue | "X days overdue" | Red pulsing badge |
| Future | Date only | Gray text |
Example Display
✓ Discovery Phase - Jan 5 (Complete)
● Design Phase - Jan 15 (3 days left)
○ Development - Feb 1
○ Launch - Feb 28
Technical Architecture
Service
Location: app/Services/Portal/ProjectTimelineService.php
class ProjectTimelineService
{
public function getTimeline(Project $project): ProjectTimeline
{
$milestones = $project->milestones()
->orderBy('due_date')
->get();
return new ProjectTimeline(
project: $project,
milestones: $milestones->map(fn($m) => $this->formatMilestone($m)),
startDate: $milestones->min('created_at'),
endDate: $milestones->max('due_date'),
overallProgress: $this->calculateProgress($milestones),
);
}
}
Data Transfer Object
Location: app/DataTransferObjects/ProjectTimeline.php
class ProjectTimeline
{
public function __construct(
public Project $project,
public Collection $milestones,
public ?Carbon $startDate,
public ?Carbon $endDate,
public int $overallProgress,
) {}
}
Milestone Data Structure
Each formatted milestone includes:
| Field | Type | Description |
|---|---|---|
id | int | Milestone ID |
name | string | Milestone name |
description | string | Milestone description |
status | string | pending, in_progress, completed |
due_date | Carbon | Due date |
completed_at | Carbon | Completion date |
progress | int | Progress percentage |
is_overdue | bool | Past due and not complete |
days_until_due | int | Days until/since due date |
deliverables | Collection | Associated deliverables |
Components
Location: resources/views/components/portal/
| Component | Purpose |
|---|---|
project-timeline.blade.php | Main timeline container |
timeline-milestone.blade.php | Individual milestone item |
Controller
Location: app/Http/Controllers/Portal/ProjectController.php
| Method | Route | Description |
|---|---|---|
timeline() | GET /portal/projects/{project}/timeline | Timeline page |
timelineData() | GET /api/projects/{project}/timeline | JSON API |
Routes
// In routes/portal.php
Route::get('/projects/{project}/timeline', [ProjectController::class, 'timeline'])
->name('portal.projects.timeline');
Route::get('/api/projects/{project}/timeline', [ProjectController::class, 'timelineData'])
->name('portal.api.projects.timeline');
Progress Calculation
Overall Progress
private function calculateProgress(Collection $milestones): int
{
if ($milestones->isEmpty()) return 0;
$completed = $milestones->where('status', 'completed')->count();
return (int) round(($completed / $milestones->count()) * 100);
}
Milestone Progress
Individual milestone progress is based on:
- Deliverables completion percentage
- Or explicit
progress_percentagefield if set
Empty State
When a project has no milestones:
@if($timeline->milestones->isEmpty())
<div class="text-center py-8 text-gray-500">
<x-icon name="calendar" class="w-12 h-12 mx-auto mb-4" />
<p>No milestones have been added to this project yet.</p>
</div>
@endif
Mobile Responsiveness
The timeline is fully responsive:
- Vertical layout works well on all screen sizes
- Progress bars scale appropriately
- Milestone cards stack vertically
- Touch-friendly tap targets
Related Features
Dependencies
| Feature | Relationship |
|---|---|
| Project Management | Parent project data |
| Authentication | User login required |
| Authorization | Client data scoping |
Complementary Features
| Feature | Description |
|---|---|
| Client Dashboard | Portal overview |
| Milestone Acceptance | Deliverable approval |
| Project Files | Project file access |
Future Enhancements
- Drag-and-drop milestone reordering (admin)
- Critical path highlighting
- Dependency arrows between milestones
- Export timeline as PDF/image
- Calendar integration (add deadlines to calendar)
- Push notifications for approaching deadlines
- Historical timeline comparison
- Gantt chart view for larger projects
Troubleshooting
| Issue | Solution |
|---|---|
| Timeline not showing | Verify project has milestones |
| Progress incorrect | Check milestone status values |
| Dates not displaying | Verify due_date is set |
| Overdue not triggering | Check date comparison logic |
See Also
- Project Management - Project overview
- Milestone Acceptance - Deliverable approval
- Client Dashboard - Portal home