feat:implement dashboard for admin side
This commit is contained in:
@@ -0,0 +1,32 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Http\Controllers\Admin;
|
||||||
|
|
||||||
|
use App\Models\Booking;
|
||||||
|
use App\Models\Comment;
|
||||||
|
use App\Models\Flight;
|
||||||
|
use App\Models\Tour;
|
||||||
|
use App\Models\User;
|
||||||
|
use Illuminate\Routing\Controller;
|
||||||
|
use Illuminate\Support\Carbon;
|
||||||
|
|
||||||
|
|
||||||
|
class DashboardController extends Controller
|
||||||
|
{
|
||||||
|
public function index()
|
||||||
|
{
|
||||||
|
$bookingsCount = Booking::count();
|
||||||
|
$flightsCount = Flight::count();
|
||||||
|
$toursCount = Tour::count();
|
||||||
|
$commentsCount = Comment::count();
|
||||||
|
$usersCount = User::count();
|
||||||
|
|
||||||
|
return view('admin.dashboard', compact(
|
||||||
|
'bookingsCount',
|
||||||
|
'flightsCount',
|
||||||
|
'toursCount',
|
||||||
|
'commentsCount',
|
||||||
|
'usersCount',
|
||||||
|
));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,154 @@
|
|||||||
|
@extends('admin.layouts.app')
|
||||||
|
@section('breadcrumb')
|
||||||
|
<div>
|
||||||
|
<h1 class="page-title fw-medium fs-18 mb-2">لیست ادمینها</h1>
|
||||||
|
<div>
|
||||||
|
<nav>
|
||||||
|
<ol class="breadcrumb mb-0">
|
||||||
|
<li class="breadcrumb-item"><a href="{{ route('admin.admins.index') }}">ادمینها</a></li>
|
||||||
|
<li class="breadcrumb-item active" aria-current="page">لیست ادمینها</li>
|
||||||
|
</ol>
|
||||||
|
</nav>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
@section('content')
|
||||||
|
<div class="container-fluid pt-4">
|
||||||
|
|
||||||
|
<!-- Filter + Search -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xl-12">
|
||||||
|
<div class="card custom-card">
|
||||||
|
<div class="card-body p-3">
|
||||||
|
<form method="GET"
|
||||||
|
action="{{route('admin.admins.index')}}">
|
||||||
|
<div class="d-flex align-items-center justify-content-between flex-wrap gap-3">
|
||||||
|
|
||||||
|
<!-- Left: Add Admin + Sort -->
|
||||||
|
<div class="d-flex flex-wrap gap-1 project-list-main align-items-center">
|
||||||
|
<div class="d-flex me-2">
|
||||||
|
<input class="form-control me-2" type="search" name="search"
|
||||||
|
placeholder="جستجو ادمین"
|
||||||
|
value="{{ request('search') }}"
|
||||||
|
aria-label="جستجو">
|
||||||
|
<button class="btn btn-light" type="submit">جستجو</button>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<select id="choices-single-default" class="form-control" name="sort">
|
||||||
|
<option value="">مرتبسازی بر اساس</option>
|
||||||
|
<option
|
||||||
|
value="name_asc"
|
||||||
|
@selected(request('sort') == 'name_asc')>
|
||||||
|
نام (الف - ی)
|
||||||
|
</option>
|
||||||
|
<option
|
||||||
|
value="name_desc"
|
||||||
|
@selected(request('sort') == 'name_desc')>
|
||||||
|
نام (ی - الف)
|
||||||
|
</option>
|
||||||
|
<option value="email"
|
||||||
|
@selected(request('sort') == 'email')>
|
||||||
|
ایمیل
|
||||||
|
</option>
|
||||||
|
<option value="newest"
|
||||||
|
@selected(request()->missing('sort') || request('sort') == 'newest')>
|
||||||
|
جدیدترین
|
||||||
|
</option>
|
||||||
|
</select>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Right: Search -->
|
||||||
|
<div class="d-flex" role="search">
|
||||||
|
<a href="{{route('admin.admins.create')}}"
|
||||||
|
class="btn btn-primary me-2">
|
||||||
|
<i class="ri-add-line me-1 fw-medium align-middle"></i>ایجاد مدیر
|
||||||
|
</a>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Table -->
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-xl-12">
|
||||||
|
<div class="card custom-card">
|
||||||
|
<div class="table-responsive">
|
||||||
|
<table class="table text-nowrap table-bordered">
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th><input class="form-check-input check-all" type="checkbox" id="all-admins"></th>
|
||||||
|
<th>نام</th>
|
||||||
|
<th>نام خانوادگی</th>
|
||||||
|
<th>نام کاربری</th>
|
||||||
|
<th>ایمیل</th>
|
||||||
|
<th>وضعیت</th>
|
||||||
|
<th>تاریخ ایجاد</th>
|
||||||
|
<th>اقدامات</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
@foreach($admins as $admin)
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
<input class="form-check-input"
|
||||||
|
type="checkbox"
|
||||||
|
value="{{ $admin->id }}">
|
||||||
|
</td>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<td>{{ $admin->first_name }}</td>
|
||||||
|
<td>{{ $admin->last_name }}</td>
|
||||||
|
<td>{{ $admin->username }}</td>
|
||||||
|
<td>{{ $admin->email }}</td>
|
||||||
|
<td>
|
||||||
|
@switch($admin->status)
|
||||||
|
|
||||||
|
@case(\App\Enums\AdminStatus::ENABLE)
|
||||||
|
<span class="badge bg-primary-transparent">فعال</span>
|
||||||
|
@break
|
||||||
|
|
||||||
|
@case(\App\Enums\AdminStatus::DISABLE)
|
||||||
|
<span class="badge bg-danger-transparent">غیرفعال</span>
|
||||||
|
@break
|
||||||
|
|
||||||
|
@endswitch
|
||||||
|
</td>
|
||||||
|
|
||||||
|
<td>{{ $admin->created_at->toJalali()->format('H:i Y/m/d') }}</td>
|
||||||
|
<td>
|
||||||
|
<div class="hstack gap-2 fs-15">
|
||||||
|
<a href="{{ route('admin.admins.edit', $admin) }}"
|
||||||
|
class="btn btn-secondary-light btn-icon btn-sm" title="ویرایش">
|
||||||
|
<i class="ti ti-pencil"></i>
|
||||||
|
</a>
|
||||||
|
<form action="{{ route('admin.admins.destroy', $admin) }}"
|
||||||
|
method="POST"
|
||||||
|
onsubmit="return confirm('آیا از حذف این ادمین مطمئن هستید؟')">
|
||||||
|
@csrf
|
||||||
|
@method('DELETE')
|
||||||
|
|
||||||
|
<button type="submit" class="btn btn-icon btn-sm btn-danger-light">
|
||||||
|
<i class="ri-delete-bin-line"></i>
|
||||||
|
</button>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
@endforeach
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- Pagination -->
|
||||||
|
<div class="d-flex justify-content-end mt-3">
|
||||||
|
{{ $admins->links() }}
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
@@ -0,0 +1,196 @@
|
|||||||
|
@extends('admin.layouts.app')
|
||||||
|
|
||||||
|
@section('breadcrumb')
|
||||||
|
<div>
|
||||||
|
<p class="fw-medium fs-18 mb-0">
|
||||||
|
سلام،
|
||||||
|
{{ auth('admin')->user()->first_name }}
|
||||||
|
{{ auth('admin')->user()->last_name }}
|
||||||
|
عزیز
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p class="fs-13 text-muted mb-0">
|
||||||
|
به داشبورد مدیریت آژانس هواپیمایی خوش آمدید.
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
@endsection
|
||||||
|
|
||||||
|
@section('content')
|
||||||
|
|
||||||
|
<div class="container-fluid pt-4">
|
||||||
|
|
||||||
|
<!-- Start:: row-1 -->
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
<div>
|
||||||
|
<div class="row">
|
||||||
|
|
||||||
|
|
||||||
|
<div class="col-xl-3 col-lg-6 col-md-6 col-sm-6">
|
||||||
|
|
||||||
|
<div class="card custom-card overflow-hidden">
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<div class="d-flex gap-3">
|
||||||
|
|
||||||
|
<div class="avatar avatar-md bg-primary svg-white">
|
||||||
|
|
||||||
|
<i class="fal fa-shopping-bag fs-24"></i>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="flex-fill">
|
||||||
|
|
||||||
|
<div class="flex-fill fw-medium fs-13 mb-1 text-dark">
|
||||||
|
تعداد رزروها
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fs-22 fw-semibold mb-1 text-primary">
|
||||||
|
{{ number_format($bookingsCount) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="d-flex align-items-center fs-11">
|
||||||
|
<span class="text-default op-6">
|
||||||
|
کل رزروها
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<div class="col-xl-3 col-lg-6 col-md-6 col-sm-6">
|
||||||
|
|
||||||
|
<div class="card custom-card overflow-hidden">
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<div class="d-flex gap-3">
|
||||||
|
|
||||||
|
<div class="avatar avatar-md bg-secondary svg-white">
|
||||||
|
|
||||||
|
<i class="fal fa-plane fs-24"></i>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<div class="flex-fill fw-medium fs-13 mb-1 text-dark">
|
||||||
|
تعداد پروازها
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fs-22 fw-semibold mb-1 text-secondary">
|
||||||
|
{{ number_format($flightsCount) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="d-flex align-items-center fs-11">
|
||||||
|
<span class="text-default op-6">
|
||||||
|
کل پروازها
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="col-xl-3 col-lg-6 col-md-6 col-sm-6">
|
||||||
|
|
||||||
|
<div class="card custom-card overflow-hidden">
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<div class="d-flex gap-3">
|
||||||
|
|
||||||
|
<div class="avatar avatar-md bg-success svg-white">
|
||||||
|
|
||||||
|
<i class="fal fa-suitcase-rolling fs-24"></i>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<div class="flex-fill fw-medium fs-13 mb-1 text-dark">
|
||||||
|
تعداد تورها
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fs-22 fw-semibold mb-1 text-success">
|
||||||
|
{{ number_format($toursCount) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="d-flex align-items-center fs-11">
|
||||||
|
<span class="text-default op-6">
|
||||||
|
کل تورها
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
<div class="col-xl-3 col-lg-6 col-md-6 col-sm-6">
|
||||||
|
|
||||||
|
<div class="card custom-card overflow-hidden">
|
||||||
|
|
||||||
|
<div class="card-body">
|
||||||
|
|
||||||
|
<div class="d-flex gap-3">
|
||||||
|
|
||||||
|
<div class="avatar avatar-md bg-info svg-white">
|
||||||
|
<i class="fal fa-users fs-24"></i>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div>
|
||||||
|
|
||||||
|
<div class="flex-fill fw-medium fs-13 mb-1 text-dark">
|
||||||
|
تعداد کاربران
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="fs-22 fw-semibold mb-1 text-info">
|
||||||
|
{{ number_format($usersCount) }}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="d-flex align-items-center fs-11">
|
||||||
|
<span class="text-default op-6">
|
||||||
|
Total users
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
@endsection
|
||||||
Reference in New Issue
Block a user