@extends('layouts.app') @section('title', 'Projects') @section('content')
{{-- Flash messages --}} @if (session('success'))
{{ session('success') }}
@endif @if (session('error'))
{{ session('error') }}
@endif {{-- Page header --}}

Projects

{{ $statusCounts['all'] }} projects total

@can('projects.manage') New Project @endcan
{{-- Status filter tabs --}} @php $tabs = [ 'all' => 'All', 'active' => 'Active', 'on_hold' => 'On Hold', 'completed' => 'Completed', 'cancelled' => 'Cancelled', ]; @endphp
@foreach ($tabs as $key => $label) @php $isActive = ($key === 'all' && !$statusFilter) || $statusFilter === $key; $tabHref = $key === 'all' ? request()->url() : request()->fullUrlWithQuery(['status' => $key]); @endphp {{ $label }} {{ $statusCounts[$key] ?? 0 }} @endforeach
{{-- Stat cards --}}

Active

{{ $statusCounts['active'] }}

On Hold

{{ $statusCounts['on_hold'] }}

Completed

{{ $statusCounts['completed'] }}

Cancelled

{{ $statusCounts['cancelled'] }}

{{-- Projects table --}}
@if ($projects->isEmpty())

No projects found

@if ($statusFilter) No projects match the selected status filter. @else Create your first project to get started. @endif

@can('projects.manage') @if (!$statusFilter) New Project @endif @endcan
@else @foreach ($projects as $project) @php $sv = $project->status instanceof \App\Enums\ProjectStatus ? $project->status->value : $project->status; $statusBadge = match($sv) { 'active' => 'bg-emerald-50 text-emerald-700', 'completed' => 'bg-slate-100 text-slate-600', 'on_hold' => 'bg-amber-50 text-amber-600', 'cancelled' => 'bg-red-50 text-red-600', default => 'bg-slate-100 text-slate-500', }; $statusLabel = match($sv) { 'active' => 'Active', 'completed' => 'Completed', 'on_hold' => 'On Hold', 'cancelled' => 'Cancelled', default => ucfirst($sv), }; $symMap = ['GBP' => '£', 'USD' => '$', 'PKR' => 'Rs', 'AED' => 'AED']; @endphp @endforeach
Project Client Status Proposals Team Due Value Outstanding Actions
{{ $project->title }} @if ($project->description)

{{ Str::limit($project->description, 60) }}

@endif
{{ $project->client->name }} {{ $statusLabel }} {{ $project->proposals_count }} @if ($project->assignedUsers->isEmpty()) Unassigned @else
@foreach ($project->assignedUsers->take(3) as $member) @php $ini = collect(explode(' ', $member->name))->map(fn($w) => strtoupper($w[0] ?? ''))->take(2)->implode(''); $mRole = $member->roles->first()?->name ?? ''; $aColor = match(true) { str_contains($mRole, 'Admin') => 'bg-slate-700', str_contains($mRole, 'Manager') => 'bg-emerald-600', default => 'bg-sky-600', }; @endphp
{{ $ini }}
@endforeach @if ($project->assignedUsers->count() > 3) +{{ $project->assignedUsers->count() - 3 }} @endif
@endif
@if ($project->end_date)

{{ $project->end_date->format('d M Y') }}

{{ $project->durationForHumans() }}

@if ($project->isOverdue()) {{ abs($project->daysRemaining()) }}d overdue @elseif ($project->daysRemaining() <= 7) {{ $project->daysRemaining() }}d left @endif @else @endif
@if (empty($project->total_value_by_currency)) @else @foreach ($project->total_value_by_currency as $cur => $amt)

{{ $symMap[$cur] ?? $cur }} {{ number_format($amt, 2) }}

@endforeach @endif
@if (empty($project->outstanding_by_currency)) Settled @else @foreach ($project->outstanding_by_currency as $cur => $amt)

{{ $symMap[$cur] ?? $cur }} {{ number_format($amt, 2) }}

@endforeach @endif
View @can('projects.manage') Edit
@csrf @method('DELETE')
@endcan
@if ($projects->hasPages())

Showing {{ $projects->firstItem() }}–{{ $projects->lastItem() }} of {{ $projects->total() }}

{{ $projects->links() }}
@endif @endif
@endsection