git commit "complete province and city management with ajax"

This commit is contained in:
2026-08-19 18:56:35 +03:30
parent 3f46f6356a
commit 8872473e8d
13 changed files with 1071 additions and 72 deletions
@@ -0,0 +1,114 @@
@extends('admin.layouts.app')
@section('breadcrumb')
<span>
افزودن شهرستان
</span>
@endsection
@section('content')
<div class="container-fluid mt-4">
<div class="row justify-content-center">
<div class="col-md-7">
<div class="card shadow-sm border-0">
<div class="card-body p-4">
<h4 class="fw-bold mb-4">
افزودن شهرستان جدید
</h4>
<form method="POST" action="{{ route('admin.cities.store') }}">
@csrf
<div class="mb-3">
<label class="form-label">
استان
</label>
<select name="province_id"
class="form-select form-select-lg">
<option value="">
انتخاب استان
</option>
@foreach($provinces as $province)
<option value="{{ $province->id }}"
{{ old('province_id') == $province->id ? 'selected' : '' }}>
{{ $province->name }}
</option>
@endforeach
</select>
@error('province_id')
<div class="text-danger mt-2">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label class="form-label">
نام شهرستان
</label>
<input type="text"
name="name"
class="form-control form-control-lg"
placeholder="مثلا مشهد"
value="{{ old('name') }}">
@error('name')
<div class="text-danger mt-2">
{{ $message }}
</div>
@enderror
</div>
<div class="d-flex gap-2">
<button class="btn btn-success px-4">
ثبت شهرستان
</button>
<a href="{{ route('admin.cities.index') }}"
class="btn btn-secondary px-4">
بازگشت
</a>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
@@ -0,0 +1,117 @@
@extends('admin.layouts.app')
@section('breadcrumb')
<span>
ویرایش شهرستان
</span>
@endsection
@section('content')
<div class="container-fluid mt-4">
<div class="row justify-content-center">
<div class="col-md-7">
<div class="card shadow-sm border-0">
<div class="card-body p-4">
<h4 class="fw-bold mb-4">
ویرایش شهرستان
</h4>
<form method="POST"
action="{{ route('admin.cities.update',$city->id) }}">
@csrf
@method('PUT')
<div class="mb-3">
<label class="form-label">
استان
</label>
<select name="province_id"
class="form-select form-select-lg">
@foreach($provinces as $province)
<option value="{{ $province->id }}"
@if($city->province_id == $province->id)
selected
@endif
>
{{ $province->name }}
</option>
@endforeach
</select>
@error('province_id')
<div class="text-danger mt-2">
{{ $message }}
</div>
@enderror
</div>
<div class="mb-3">
<label class="form-label">
نام شهرستان
</label>
<input type="text"
name="name"
class="form-control form-control-lg"
value="{{ old('name',$city->name) }}">
@error('name')
<div class="text-danger mt-2">
{{ $message }}
</div>
@enderror
</div>
<div class="d-flex gap-2">
<button class="btn btn-warning px-4">
ویرایش
</button>
<a href="{{ route('admin.cities.index') }}"
class="btn btn-secondary px-4">
بازگشت
</a>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
@@ -0,0 +1,131 @@
@extends('admin.layouts.app')
@section('content')
<div class="container-fluid mt-4">
<div class="d-flex justify-content-between mb-4">
<h3 class="fw-bold">
مدیریت شهرستان‌ها
</h3>
<a href="{{ route('admin.cities.create') }}"
class="btn btn-primary">
افزودن شهرستان
</a>
</div>
<div class="card shadow-sm border-0">
<div class="card-body">
<table class="table table-hover text-center">
<thead class="table-light">
<tr>
<th>شناسه</th>
<th>
نام شهرستان
</th>
<th>
استان
</th>
<th>
تاریخ ثبت
</th>
<th>
عملیات
</th>
</tr>
</thead>
<tbody>
@forelse($cities as $city)
<tr>
<td>
{{ $city->id }}
</td>
<td class="fw-bold">
{{ $city->name }}
</td>
<td>
{{ $city->province->name ?? '-' }}
</td>
<td>
{{ $city->created_at?->toJalali()->format('Y/m/d') ?? '-' }}
</td>
<td>
<a href="{{ route('admin.cities.edit',$city->id) }}"
class="btn btn-warning btn-sm">
ویرایش
</a>
<form action="{{ route('admin.cities.destroy',$city->id) }}"
method="POST"
class="d-inline">
@csrf
@method('DELETE')
<button class="btn btn-danger btn-sm">
حذف
</button>
</form>
</td>
</tr>
@empty
<tr>
<td colspan="5">
شهرستانی ثبت نشده است
</td>
</tr>
@endforelse
</tbody>
</table>
{{ $cities->links() }}
</div>
</div>
</div>
@endsection
+14 -54
View File
@@ -118,11 +118,8 @@
</thead>
<tbody>
@forelse($logs as $log)
<tr>
<td>
{{ $log->admin->first_name ?? '-' }}
</td>
@@ -130,7 +127,6 @@
<td>
{{ $log->action }}
</td>
<td>
{{ $log->model }}
</td>
@@ -145,7 +141,6 @@
<td colspan="4">
فعالیتی ثبت نشده است
</td>
</tr>
@endforelse
</tbody>
@@ -154,106 +149,71 @@
</div>
</div>
<div class="card shadow-sm border-0 mt-5">
<div class="card shadow-sm border-0 mt-5">
<div class="card-header bg-white fw-bold">
نمودار بازدید تورها در ۱۰ روز اخیر
</div>
<div class="card-body">
<canvas id="tourViewsChart" height="100"></canvas>
</div>
<div class="card-header bg-white fw-bold">
نمودار بازدید پروازها در ۱۰ روز اخیر
</div>
<div class="card-body">
<canvas id="flightViewsChart" height="100"></canvas>
</div>
</div>
</div>
<script src="{{asset('assets/js/chart.js')}}"></script>
<script src="https://cdn.jsdelivr.net/npm/chart.js"></script>
<script>
const tourChart = document.getElementById('tourViewsChart');
new Chart(tourChart, {
type: 'bar',
data: {
labels: @json($tourViews->pluck('date')),
datasets: [{
label: 'بازدید تورها',
data: @json($tourViews->pluck('total')),
data: @json($tourViews->pluck('total'))
}]
},
options: {
responsive:true,
plugins:{
legend:{
position:'top'
}
},
scales:{
y:{
beginAtZero:true
}
}
}
});
const flightChart = document.getElementById('flightViewsChart');
new Chart(flightChart, {
type: 'bar',
data: {
labels: @json($flightViews->pluck('date')),
datasets: [{
label: 'بازدید پرواز ها',
data: @json($flightViews->pluck('total')),
label: 'بازدید پروازها',
data: @json($flightViews->pluck('total'))
}]
},
options: {
responsive:true,
plugins:{
legend:{
position:'top'
}
},
scales:{
y:{
beginAtZero:true
}
}
}
});
</script>
@endsection
@@ -80,6 +80,23 @@
</li>
<li class="nav-item mb-2">
<a href="{{ route('admin.provinces.index') }}"
class="nav-link text-white">
مدیریت استان ها </a>
</li>
<li class="nav-item mb-2">
<a href="{{ route('admin.cities.index') }}"
class="nav-link text-white">
مدیریت شهرستان ها </a>
</li>
@@ -0,0 +1,100 @@
@extends('admin.layouts.app')
@section('breadcrumb')
<span>
افزودن استان
</span>
@endsection
@section('content')
<div class="container-fluid mt-4">
<div class="row justify-content-center">
<div class="col-md-6">
<div class="card border-0 shadow-sm">
<div class="card-body p-4">
<h4 class="fw-bold mb-4">
افزودن استان جدید
</h4>
<form method="POST"
action="{{ route('admin.provinces.store') }}">
@csrf
<div class="mb-3">
<label class="form-label">
نام استان
</label>
<input type="text"
name="name"
class="form-control form-control-lg"
placeholder="مثلا تهران"
value="{{ old('name') }}">
@error('name')
<div class="text-danger mt-2">
{{ $message }}
</div>
@enderror
</div>
<div class="d-flex gap-2">
<button class="btn btn-success px-4">
ثبت استان
</button>
<a href="{{ route('admin.provinces.index') }}"
class="btn btn-secondary px-4">
بازگشت
</a>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
@@ -0,0 +1,104 @@
@extends('admin.layouts.app')
@section('breadcrumb')
<span>
ویرایش استان
</span>
@endsection
@section('content')
<div class="container-fluid mt-4">
<div class="row justify-content-center">
<div class="col-lg-6">
<div class="card border-0 shadow-sm">
<div class="card-header bg-white border-0 pt-4">
<h4 class="fw-bold">
<i class="bi bi-pencil-square"></i>
ویرایش استان
</h4>
<p class="text-muted mb-0">
اطلاعات استان را ویرایش کنید
</p>
</div>
<div class="card-body p-4">
<form method="POST"
action="{{ route('admin.provinces.update',$province->id) }}">
@csrf
@method('PUT')
<div class="mb-4">
<label class="form-label fw-bold">
نام استان
</label>
<input type="text"
name="name"
class="form-control form-control-lg @error('name') is-invalid @enderror"
value="{{ old('name',$province->name) }}"
placeholder="مثلا تهران">
@error('name')
<div class="invalid-feedback">
{{ $message }}
</div>
@enderror
</div>
<div class="d-flex justify-content-between">
<a href="{{ route('admin.provinces.index') }}"
class="btn btn-light border px-4">
بازگشت
</a>
<button type="submit"
class="btn btn-warning px-5">
ذخیره تغییرات
</button>
</div>
</form>
</div>
</div>
</div>
</div>
</div>
@endsection
@@ -0,0 +1,170 @@
@extends('admin.layouts.app')
@section('breadcrumb')
<span>
مدیریت استان‌ها
</span>
@endsection
@section('content')
<div class="container-fluid mt-4">
<div class="d-flex justify-content-between align-items-center mb-4">
<div>
<h3 class="fw-bold mb-1">
مدیریت استان‌ها
</h3>
<small class="text-muted">
لیست استان‌های ثبت شده
</small>
</div>
<a href="{{ route('admin.provinces.create') }}"
class="btn btn-primary px-4">
<i class="bi bi-plus-circle"></i>
افزودن استان
</a>
</div>
<div class="card border-0 shadow-sm">
<div class="card-body p-4">
<div class="table-responsive">
<table class="table table-hover align-middle text-center">
<thead class="table-light">
<tr>
<th>
شناسه
</th>
<th>
نام استان
</th>
<th>
تاریخ ثبت
</th>
<th>
عملیات
</th>
</tr>
</thead>
<tbody>
@forelse($provinces as $province)
<tr>
<td>
<span class="badge bg-secondary">
{{ $province->id }}
</span>
</td>
<td class="fw-bold">
{{ $province->name }}
</td>
<td>
{{ $province->created_at?->toJalali()->format('Y/m/d') ?? '-' }}
</td>
<td>
<a href="{{ route('admin.provinces.edit',$province->id) }}"
class="btn btn-sm btn-warning">
ویرایش
</a>
<form action="{{ route('admin.provinces.destroy',$province->id) }}"
method="POST"
class="d-inline">
@csrf
@method('DELETE')
<button class="btn btn-sm btn-danger"
onclick="return confirm('آیا حذف شود؟')">
حذف
</button>
</form>
</td>
</tr>
@empty
<tr>
<td colspan="4"
class="text-muted py-4">
هنوز استانی ثبت نشده است
</td>
</tr>
@endforelse
</tbody>
</table>
</div>
<div class="mt-3">
{{ $provinces->links() }}
</div>
</div>
</div>
</div>
@endsection