/home2/mshostin/crm.ms-hostingladz.com/resources/views/pages/complaints/logs.blade.php
@extends('layouts.app')
@section('content')
<div class="container-fluid">
<div class="row justify-content-center">
<div class="col-12">
<!-- Header Section -->
<div class="d-flex justify-content-between align-items-center mb-4">
<div>
<h2 class="page-title mb-1">Complaint Timeline & Logs</h2>
<p class="text-muted mb-0">Complete audit trail for complaint #{{ $complaint->comp_num }}</p>
</div>
<div class="d-flex gap-2">
<a href="{{ route('compaints-management.details', $complaint->id) }}" class="btn btn-info">
<i class="fe fe-eye fe-16 mr-2"></i>View Complaint
</a>
<a href="{{ request()->get('from_request') == '1' ? route('compaints-management.index', ['comp_type_id' => [1,2,5]]) : route('compaints-management.index') }}" class="btn btn-outline-primary">
<i class="fas fa-arrow-left me-2"></i>Back to List
</a>
</div>
</div>
<!-- Complaint Summary Card -->
<div class="row mb-4">
<div class="col-12">
<div class="card shadow-sm border-0">
<div class="card-body p-4">
<div class="row align-items-center">
<div class="col-md-8">
<div class="d-flex align-items-center mb-3">
<div class="complaint-status-badge me-3">
@if($complaint->status == 1)
<span class="badge bg-success fs-6 px-3 py-2">
<i class="fe fe-check-circle fe-16 mr-2"></i>Resolved
</span>
@else
<span class="badge bg-warning fs-6 px-3 py-2">
<i class="fe fe-clock fe-16 mr-2"></i>Pending
</span>
@endif
</div>
<h4 class="mb-0 text-primary">#{{ $complaint->comp_num }}</h4>
</div>
<h5 class="mb-2">
@if($complaint->customer_id != 0 && $complaint->customer)
{{ $complaint->customer->customer_name }}
@else
{{ $complaint->customer_name }}
@endif
</h5>
<p class="text-muted mb-0">
<i class="fe fe-tag fe-14 mr-2"></i>
{{ $complaint->type->title ?? 'N/A' }}
@if($complaint->subtype)
> {{ $complaint->subtype->title }}
@endif
</p>
</div>
<div class="col-md-4 text-md-end">
<div class="text-muted mb-2">
<small>Created</small><br>
<strong>{{ $complaint->created_at->format('M d, Y \a\t h:i A') }}</strong>
</div>
@if($complaint->status == 1)
<div class="text-success">
<small>Resolved</small><br>
<strong>{{ $complaint->updated_at->format('M d, Y \a\t h:i A') }}</strong>
</div>
@endif
</div>
</div>
</div>
</div>
</div>
</div>
<!-- Timeline Section -->
<div class="row">
<div class="col-12">
<div class="card shadow-sm border-0">
<div class="card-header bg-white border-0 py-3">
<h5 class="mb-0">
<i class="fe fe-activity fe-16 mr-2 text-primary"></i>
Complete Activity Timeline
</h5>
</div>
<div class="card-body p-0">
<!-- Timeline Container -->
<div class="timeline-container p-4">
@if($logs && count($logs) > 0)
@foreach($logs as $index => $log)
<div class="timeline-item {{ $index % 2 == 0 ? 'left' : 'right' }}">
<div class="timeline-marker">
@switch($log->log_type)
@case('Complaint')
<div class="marker-icon complaint-marker">
<i class="fe fe-file-text fe-16"></i>
</div>
@break
@case('BounceBack')
<div class="marker-icon bounceback-marker">
<i class="fe fe-rotate-ccw fe-16"></i>
</div>
@break
@case('User')
<div class="marker-icon user-marker">
<i class="fe fe-user fe-16"></i>
</div>
@break
@case('Agent')
<div class="marker-icon agent-marker">
<i class="fe fe-users fe-16"></i>
</div>
@break
@default
<div class="marker-icon default-marker">
<i class="fe fe-activity fe-16"></i>
</div>
@endswitch
</div>
<div class="timeline-content">
<div class="timeline-header">
<h6 class="mb-1">{{ $log->log_type }}</h6>
<span class="timeline-time">
{{ \Carbon\Carbon::parse($log->created_at)->format('M d, Y \a\t h:i A') }}
</span>
</div>
<div class="timeline-body">
<p class="mb-2">{{ $log->action_detail }}</p>
@if($log->user)
<div class="timeline-user">
<small class="text-muted">
<i class="fe fe-user fe-12 mr-1"></i>
{{ $log->user->name }}
</small>
</div>
@endif
</div>
</div>
</div>
@endforeach
@else
<div class="text-center py-5">
<div class="empty-state">
<i class="fe fe-activity fe-48 text-muted mb-3"></i>
<h5 class="text-muted">No Activity Logs Found</h5>
<p class="text-muted">This complaint doesn't have any activity logs yet.</p>
</div>
</div>
@endif
</div>
</div>
</div>
</div>
</div>
<!-- Statistics Cards -->
<div class="row mt-4">
<div class="col-md-3">
<div class="card shadow-sm border-0 bg-gradient-primary text-white">
<div class="card-body text-center">
<i class="fe fe-activity fe-32 mb-3"></i>
<h4 class="mb-1">{{ $logs ? count($logs) : 0 }}</h4>
<p class="mb-0">Total Activities</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card shadow-sm border-0 bg-gradient-success text-white">
<div class="card-body text-center">
<i class="fe fe-calendar fe-32 mb-3"></i>
<h4 class="mb-1">{{ $complaint->created_at->diffForHumans() }}</h4>
<p class="mb-0">Age</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card shadow-sm border-0 bg-gradient-info text-white">
<div class="card-body text-center">
<i class="fe fe-clock fe-32 mb-3"></i>
<h4 class="mb-1">
@if($complaint->status == 1)
{{ $complaint->created_at->diffInHours($complaint->updated_at) }}h
@else
{{ $complaint->created_at->diffInHours(now()) }}h
@endif
</h4>
<p class="mb-0">Duration</p>
</div>
</div>
</div>
<div class="col-md-3">
<div class="card shadow-sm border-0 bg-gradient-warning text-white">
<div class="card-body text-center">
<i class="fe fe-rotate-ccw fe-32 mb-3"></i>
<h4 class="mb-1">{{ $bounceBacks ? count($bounceBacks) : 0 }}</h4>
<p class="mb-0">Bounce Backs</p>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
<style>
/* Timeline Styles */
.timeline-container {
position: relative;
padding: 20px 0;
}
.timeline-container::before {
content: '';
position: absolute;
left: 50%;
top: 0;
bottom: 0;
width: 2px;
background: linear-gradient(180deg, #e3f2fd 0%, #2196f3 50%, #e3f2fd 100%);
transform: translateX(-50%);
}
.timeline-item {
position: relative;
margin-bottom: 40px;
width: 100%;
}
.timeline-item.left {
padding-right: 50%;
}
.timeline-item.right {
padding-left: 50%;
}
.timeline-marker {
position: absolute;
left: 50%;
top: 0;
transform: translateX(-50%);
z-index: 2;
}
.marker-icon {
width: 50px;
height: 50px;
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
box-shadow: 0 4px 12px rgba(0,0,0,0.15);
border: 4px solid white;
}
.complaint-marker {
background: linear-gradient(135deg, #4caf50, #66bb6a);
}
.bounceback-marker {
background: linear-gradient(135deg, #ff9800, #ffb74d);
}
.user-marker {
background: linear-gradient(135deg, #2196f3, #64b5f6);
}
.agent-marker {
background: linear-gradient(135deg, #9c27b0, #ba68c8);
}
.default-marker {
background: linear-gradient(135deg, #607d8b, #90a4ae);
}
.timeline-content {
background: white;
border-radius: 12px;
padding: 20px;
box-shadow: 0 4px 20px rgba(0,0,0,0.08);
border: 1px solid #f0f0f0;
position: relative;
transition: all 0.3s ease;
}
.timeline-content:hover {
transform: translateY(-2px);
box-shadow: 0 8px 30px rgba(0,0,0,0.12);
}
.timeline-item.left .timeline-content {
margin-right: 20px;
}
.timeline-item.right .timeline-content {
margin-left: 20px;
}
.timeline-header {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 12px;
}
.timeline-header h6 {
color: #333;
font-weight: 600;
margin: 0;
}
.timeline-time {
font-size: 12px;
color: #666;
background: #f8f9fa;
padding: 4px 8px;
border-radius: 6px;
}
.timeline-body p {
color: #555;
line-height: 1.6;
margin: 0;
}
.timeline-user {
margin-top: 8px;
padding-top: 8px;
border-top: 1px solid #f0f0f0;
}
/* Responsive Design */
@media (max-width: 768px) {
.timeline-container::before {
left: 30px;
}
.timeline-item.left,
.timeline-item.right {
padding-left: 60px;
padding-right: 0;
}
.timeline-marker {
left: 30px;
}
.timeline-content {
margin: 0 0 0 20px !important;
}
}
/* Card Enhancements */
.card {
border-radius: 16px;
overflow: hidden;
}
.card-header {
border-bottom: 1px solid #f0f0f0;
}
/* Gradient Backgrounds */
.bg-gradient-primary {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.bg-gradient-success {
background: linear-gradient(135deg, #11998e 0%, #38ef7d 100%);
}
.bg-gradient-info {
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
}
.bg-gradient-warning {
background: linear-gradient(135deg, #f093fb 0%, #f5576c 100%);
}
/* Empty State */
.empty-state {
padding: 40px 20px;
}
.empty-state i {
opacity: 0.5;
}
/* Animation */
.timeline-item {
animation: fadeInUp 0.6s ease forwards;
opacity: 0;
transform: translateY(20px);
}
@keyframes fadeInUp {
to {
opacity: 1;
transform: translateY(0);
}
}
.timeline-item:nth-child(1) { animation-delay: 0.1s; }
.timeline-item:nth-child(2) { animation-delay: 0.2s; }
.timeline-item:nth-child(3) { animation-delay: 0.3s; }
.timeline-item:nth-child(4) { animation-delay: 0.4s; }
.timeline-item:nth-child(5) { animation-delay: 0.5s; }
/* Hover Effects */
.timeline-content:hover .timeline-header h6 {
color: #2196f3;
}
.marker-icon:hover {
transform: translateX(-50%) scale(1.1);
transition: transform 0.3s ease;
}
/* Status Badge Enhancements */
.complaint-status-badge .badge {
border-radius: 20px;
font-weight: 500;
letter-spacing: 0.5px;
}
/* Statistics Cards */
.card.bg-gradient-primary,
.card.bg-gradient-success,
.card.bg-gradient-info,
.card.bg-gradient-warning {
transition: all 0.3s ease;
}
.card.bg-gradient-primary:hover,
.card.bg-gradient-success:hover,
.card.bg-gradient-info:hover,
.card.bg-gradient-warning:hover {
transform: translateY(-5px);
box-shadow: 0 10px 30px rgba(0,0,0,0.2);
}
</style>
<script>
document.addEventListener('DOMContentLoaded', function() {
// Add scroll animations
const observerOptions = {
threshold: 0.1,
rootMargin: '0px 0px -50px 0px'
};
const observer = new IntersectionObserver(function(entries) {
entries.forEach(entry => {
if (entry.isIntersecting) {
entry.target.style.animationPlayState = 'running';
}
});
}, observerOptions);
// Observe all timeline items
document.querySelectorAll('.timeline-item').forEach(item => {
observer.observe(item);
});
// Add click effects to timeline items
document.querySelectorAll('.timeline-content').forEach(content => {
content.addEventListener('click', function() {
this.style.transform = 'scale(1.02)';
setTimeout(() => {
this.style.transform = 'translateY(-2px)';
}, 150);
});
});
});
</script>
@endsection