436 lines
16 KiB
PHP
436 lines
16 KiB
PHP
@extends('layout.app')
|
|
|
|
@section('title', 'Admin Dashboard')
|
|
|
|
@include('admin.shared.admin-styles')
|
|
|
|
@section('content')
|
|
<div class="admin-container container-fluid">
|
|
<!-- Page Header -->
|
|
<div class="page-header animate-fade-in">
|
|
<div class="row align-items-center">
|
|
<div class="col-12">
|
|
<h3 class="mb-2 text-white">
|
|
<i class="fas fa-tachometer-alt me-2"></i>Dashboard
|
|
</h3>
|
|
<nav aria-label="breadcrumb">
|
|
<ol class="breadcrumb mb-0">
|
|
<li class="breadcrumb-item active text-white" aria-current="page">Dashboard</li>
|
|
</ol>
|
|
</nav>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Statistics Overview -->
|
|
<div class="row mb-4">
|
|
<div class="col-xl-3 col-md-6 mb-4">
|
|
<div class="admin-card animate-fade-in">
|
|
<div class="card-body">
|
|
<div class="d-flex align-items-center">
|
|
<div class="feature-icon bg-primary bg-gradient">
|
|
<i class="fas fa-users"></i>
|
|
</div>
|
|
<div class="ms-3">
|
|
<h6 class="mb-1">Total Users</h6>
|
|
<h4 class="mb-0">{{ $userCount ?? 0 }}</h4>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-xl-3 col-md-6 mb-4">
|
|
<div class="admin-card animate-fade-in">
|
|
<div class="card-body">
|
|
<div class="d-flex align-items-center">
|
|
<div class="feature-icon bg-success bg-gradient">
|
|
<i class="fas fa-utensils"></i>
|
|
</div>
|
|
<div class="ms-3">
|
|
<h6 class="mb-1">Total Foods</h6>
|
|
<h4 class="mb-0">{{ $makananCount ?? 0 }}</h4>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-xl-3 col-md-6 mb-4">
|
|
<div class="admin-card animate-fade-in">
|
|
<div class="card-body">
|
|
<div class="d-flex align-items-center">
|
|
<div class="feature-icon bg-warning bg-gradient">
|
|
<i class="fas fa-clock"></i>
|
|
</div>
|
|
<div class="ms-3">
|
|
<h6 class="mb-1">Meal Times</h6>
|
|
<h4 class="mb-0">{{ $waktuMakanCount ?? 0 }}</h4>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-xl-3 col-md-6 mb-4">
|
|
<div class="admin-card animate-fade-in">
|
|
<div class="card-body">
|
|
<div class="d-flex align-items-center">
|
|
<div class="feature-icon bg-info bg-gradient">
|
|
<i class="fas fa-chart-pie"></i>
|
|
</div>
|
|
<div class="ms-3">
|
|
<h6 class="mb-1">Components</h6>
|
|
<h4 class="mb-0">{{ $komponenCount ?? 0 }}</h4>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Features Overview -->
|
|
<div class="row mb-4">
|
|
<div class="col-12">
|
|
<div class="admin-card animate-fade-in">
|
|
<div class="card-body">
|
|
<h5 class="card-title mb-4">
|
|
<i class="fas fa-th-large me-2"></i>Daftar Rekomendasi AHP
|
|
</h5>
|
|
<div class="row g-4">
|
|
@foreach($waktuMakans as $waktuMakan)
|
|
@php
|
|
$isNewlyCalculated = $waktuMakan->latest_calculation &&
|
|
\Carbon\Carbon::parse($waktuMakan->latest_calculation)->isToday();
|
|
@endphp
|
|
<div class="col-md-6 col-lg-4">
|
|
<div class="meal-card {{ $isNewlyCalculated ? 'newly-calculated' : '' }}">
|
|
<div class="meal-header {{ $isNewlyCalculated ? 'bg-gradient-success' : 'bg-gradient-primary' }}">
|
|
<div class="d-flex justify-content-between align-items-center">
|
|
<h6 class="mb-0">
|
|
<i class="fas fa-clock me-2"></i>{{ $waktuMakan->nama }}
|
|
</h6>
|
|
@if($waktuMakan->has_recommendation)
|
|
<span class="status-badge bg-light text-dark">
|
|
<i class="fas fa-check me-1"></i>Terhitung
|
|
</span>
|
|
@else
|
|
<span class="status-badge bg-warning">
|
|
<i class="fas fa-hourglass-half me-1"></i>Pending
|
|
</span>
|
|
@endif
|
|
</div>
|
|
</div>
|
|
<div class="meal-content">
|
|
@if($waktuMakan->latest_calculation)
|
|
<div class="info-row">
|
|
<i class="fas fa-calendar me-2"></i>
|
|
<span>{{ \Carbon\Carbon::parse($waktuMakan->latest_calculation)->format('d M Y H:i') }}</span>
|
|
</div>
|
|
@endif
|
|
</div>
|
|
<div class="meal-actions">
|
|
@if($waktuMakan->has_recommendation)
|
|
<a href="{{ route('rekomendasi.detail', $waktuMakan->id) }}"
|
|
class="btn btn-sm btn-primary">
|
|
<i class="fas fa-eye me-1"></i>Detail
|
|
</a>
|
|
@endif
|
|
<a href="{{ route('alternatif.pilih', ['waktu_makan' => $waktuMakan->id]) }}"
|
|
class="btn btn-sm {{ $waktuMakan->has_recommendation ? 'btn-outline-primary' : 'btn-primary' }}">
|
|
<i class="fas fa-calculator me-1"></i>
|
|
{{ $waktuMakan->has_recommendation ? 'Hitung Ulang' : 'Hitung' }}
|
|
</a>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
@endforeach
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- AHP Guide -->
|
|
<div class="row mb-4">
|
|
<div class="col-lg-6">
|
|
<div class="admin-card animate-fade-in">
|
|
<div class="card-body">
|
|
<h5 class="card-title mb-4">
|
|
<i class="fas fa-scale-balanced me-2"></i>AHP Scale Guide
|
|
</h5>
|
|
<div class="row g-3">
|
|
<div class="col-sm-6">
|
|
<div class="d-flex align-items-center p-3 bg-light rounded">
|
|
<span class="admin-badge bg-success me-3">1</span>
|
|
<div>
|
|
<strong>Equal Importance</strong><br>
|
|
<small class="text-muted">Kedua elemen sama pentingnya</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<div class="d-flex align-items-center p-3 bg-light rounded">
|
|
<span class="admin-badge bg-primary me-3">3</span>
|
|
<div>
|
|
<strong>Moderate</strong><br>
|
|
<small class="text-muted">Sedikit lebih penting</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<div class="d-flex align-items-center p-3 bg-light rounded">
|
|
<span class="admin-badge bg-warning me-3">5</span>
|
|
<div>
|
|
<strong>Strong</strong><br>
|
|
<small class="text-muted">Lebih penting</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-sm-6">
|
|
<div class="d-flex align-items-center p-3 bg-light rounded">
|
|
<span class="admin-badge bg-danger me-3">7</span>
|
|
<div>
|
|
<strong>Very Strong</strong><br>
|
|
<small class="text-muted">Sangat penting</small>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="col-lg-6">
|
|
<div class="admin-card animate-fade-in">
|
|
<div class="card-body">
|
|
<h5 class="card-title mb-4">
|
|
<i class="fas fa-list-check me-2"></i>Quick Guide
|
|
</h5>
|
|
<div class="steps">
|
|
<div class="step d-flex align-items-start mb-4">
|
|
<span class="admin-badge bg-primary me-3">1</span>
|
|
<div>
|
|
<h6 class="mb-2">Data Master</h6>
|
|
<p class="text-muted mb-0">Input kriteria, komponen, dan waktu makan</p>
|
|
</div>
|
|
</div>
|
|
<div class="step d-flex align-items-start mb-4">
|
|
<span class="admin-badge bg-primary me-3">2</span>
|
|
<div>
|
|
<h6 class="mb-2">Pengaturan</h6>
|
|
<p class="text-muted mb-0">Atur relasi antar komponen</p>
|
|
</div>
|
|
</div>
|
|
<div class="step d-flex align-items-start">
|
|
<span class="admin-badge bg-primary me-3">3</span>
|
|
<div>
|
|
<h6 class="mb-2">Analisis</h6>
|
|
<p class="text-muted mb-0">Lakukan perhitungan dan review hasil</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Recent Activity -->
|
|
<div class="row">
|
|
<div class="col-12">
|
|
<div class="admin-card animate-fade-in">
|
|
<div class="card-body">
|
|
<h5 class="card-title mb-4">
|
|
<i class="fas fa-history me-2"></i>Recent Activity
|
|
</h5>
|
|
<div class="table-responsive">
|
|
<table class="admin-table">
|
|
<thead>
|
|
<tr>
|
|
<th>Time</th>
|
|
<th>User</th>
|
|
<th>Activity</th>
|
|
<th>Status</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
<tr>
|
|
<td>10:30</td>
|
|
<td>Admin</td>
|
|
<td>Updated food database</td>
|
|
<td><span class="admin-badge bg-success">Completed</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>11:15</td>
|
|
<td>User</td>
|
|
<td>Generated recommendations</td>
|
|
<td><span class="admin-badge bg-warning">Processing</span></td>
|
|
</tr>
|
|
<tr>
|
|
<td>12:00</td>
|
|
<td>System</td>
|
|
<td>Backup completed</td>
|
|
<td><span class="admin-badge bg-info">Info</span></td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
@push('styles')
|
|
<style>
|
|
/* Status Cards */
|
|
.status-card {
|
|
padding: 1.5rem;
|
|
border-radius: 1rem;
|
|
color: white;
|
|
height: 100%;
|
|
position: relative;
|
|
overflow: hidden;
|
|
transition: all 0.3s ease;
|
|
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
|
|
}
|
|
|
|
.status-card:hover {
|
|
transform: translateY(-5px);
|
|
box-shadow: 0 8px 15px rgba(0, 0, 0, 0.15);
|
|
}
|
|
|
|
.status-icon {
|
|
font-size: 2rem;
|
|
opacity: 0.9;
|
|
margin-bottom: 1rem;
|
|
}
|
|
|
|
.status-content {
|
|
position: relative;
|
|
z-index: 1;
|
|
}
|
|
|
|
.status-title {
|
|
font-size: 1rem;
|
|
font-weight: 500;
|
|
margin-bottom: 0.5rem;
|
|
opacity: 0.9;
|
|
}
|
|
|
|
.status-value {
|
|
font-size: 2rem;
|
|
font-weight: 600;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.status-footer {
|
|
margin-top: 1rem;
|
|
}
|
|
|
|
.status-label {
|
|
font-size: 0.875rem;
|
|
opacity: 0.8;
|
|
}
|
|
|
|
/* Gradients */
|
|
.bg-gradient-primary {
|
|
background: linear-gradient(135deg, #2196f3, #1976d2);
|
|
}
|
|
|
|
.bg-gradient-success {
|
|
background: linear-gradient(135deg, #4caf50, #388e3c);
|
|
}
|
|
|
|
.bg-gradient-warning {
|
|
background: linear-gradient(135deg, #ff9800, #f57c00);
|
|
}
|
|
|
|
/* Responsive Adjustments */
|
|
@media (max-width: 768px) {
|
|
.status-card {
|
|
padding: 1rem;
|
|
}
|
|
|
|
.status-icon {
|
|
font-size: 1.5rem;
|
|
margin-bottom: 0.75rem;
|
|
}
|
|
|
|
.status-value {
|
|
font-size: 1.5rem;
|
|
}
|
|
}
|
|
|
|
.meal-card {
|
|
background: white;
|
|
border-radius: 0.75rem;
|
|
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
|
|
overflow: hidden;
|
|
transition: all 0.3s ease;
|
|
}
|
|
|
|
.meal-card:hover {
|
|
transform: translateY(-3px);
|
|
box-shadow: 0 4px 8px rgba(0, 0, 0, 0.15);
|
|
}
|
|
|
|
.meal-header {
|
|
padding: 1rem;
|
|
color: white;
|
|
}
|
|
|
|
.meal-header h6 {
|
|
font-size: 1rem;
|
|
font-weight: 500;
|
|
}
|
|
|
|
.status-badge {
|
|
font-size: 0.75rem;
|
|
padding: 0.25rem 0.5rem;
|
|
border-radius: 0.5rem;
|
|
}
|
|
|
|
.meal-content {
|
|
padding: 1rem;
|
|
background: #f8f9fa;
|
|
}
|
|
|
|
.info-row {
|
|
display: flex;
|
|
align-items: center;
|
|
font-size: 0.875rem;
|
|
color: #6c757d;
|
|
margin-bottom: 0.5rem;
|
|
}
|
|
|
|
.info-row:last-child {
|
|
margin-bottom: 0;
|
|
}
|
|
|
|
.meal-actions {
|
|
padding: 1rem;
|
|
display: flex;
|
|
gap: 0.5rem;
|
|
justify-content: flex-end;
|
|
background: white;
|
|
border-top: 1px solid #e9ecef;
|
|
}
|
|
|
|
.newly-calculated {
|
|
border: 2px solid #4caf50;
|
|
}
|
|
|
|
/* Responsive Adjustments */
|
|
@media (max-width: 768px) {
|
|
.meal-header {
|
|
padding: 0.75rem;
|
|
}
|
|
|
|
.meal-content, .meal-actions {
|
|
padding: 0.75rem;
|
|
}
|
|
|
|
.info-row {
|
|
font-size: 0.8125rem;
|
|
}
|
|
}
|
|
</style>
|
|
@endpush
|
|
@endsection |