feat(admin): add admin creation with permissions
This commit is contained in:
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\Enums\Admin;
|
||||
|
||||
enum AdminPermission:string
|
||||
{
|
||||
case MANAGE_ADMINS = 'manage-admins';
|
||||
case MANAGE_TOURS = 'manage-tours';
|
||||
case MANAGE_FLIGHTS = 'manage-flights';
|
||||
case MANAGE_COMMENTS = 'manage-comments';
|
||||
case MANAGE_USERS = 'manage-users';
|
||||
case MANAGE_SETTINGS = 'manage-settings';
|
||||
|
||||
public function label(): string
|
||||
{
|
||||
return match($this) {
|
||||
self::MANAGE_ADMINS => 'مدیریت مدیران',
|
||||
self::MANAGE_TOURS => 'مدیریت تورها',
|
||||
self::MANAGE_FLIGHTS => 'مدیریت پروازها',
|
||||
self::MANAGE_COMMENTS => 'مدیریت نظرات',
|
||||
self::MANAGE_USERS => 'مدیریت کاربران',
|
||||
self::MANAGE_SETTINGS => 'تنظیمات سایت',
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,199 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Admin;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Admin\AdminStoreRequest;
|
||||
use App\Models\Admin;
|
||||
use App\Models\AdminPermission;
|
||||
use App\Models\File;
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Hash;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
|
||||
class AdminController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$title = 'لیست مدیران';
|
||||
|
||||
$admins = Admin::query()
|
||||
->when($request->filled('search'), function (Builder $query) use ($request) {
|
||||
$search = $request->input('search');
|
||||
|
||||
$query->whereAny([
|
||||
'first_name',
|
||||
'last_name',
|
||||
'username',
|
||||
'email'
|
||||
], 'LIKE', "%$search%");
|
||||
|
||||
})
|
||||
->when($request->filled('sort'), function (Builder $query) use ($request) {
|
||||
$sort = $request->input('sort');
|
||||
switch ($sort) {
|
||||
|
||||
case 'name_desc':
|
||||
{
|
||||
$query
|
||||
->orderByDesc('first_name');
|
||||
|
||||
break;
|
||||
}
|
||||
case 'email':
|
||||
{
|
||||
$query
|
||||
->orderBy('email');
|
||||
|
||||
break;
|
||||
}
|
||||
case 'newest':
|
||||
{
|
||||
$query
|
||||
->orderByDesc('created_at');
|
||||
|
||||
break;
|
||||
}
|
||||
case 'name_asc':
|
||||
default:
|
||||
{
|
||||
$query
|
||||
->orderBy('first_name');
|
||||
}
|
||||
|
||||
}
|
||||
}, function (Builder $query) {
|
||||
$query->orderBy('first_name');
|
||||
})
|
||||
->paginate()
|
||||
->withQueryString();
|
||||
|
||||
return view('admin.admins.index', compact('title', 'admins'));
|
||||
}
|
||||
|
||||
public function edit(Admin $admin)
|
||||
{
|
||||
return view('admin.admins.edit', compact('admin'));
|
||||
}
|
||||
|
||||
public function create()
|
||||
{
|
||||
$title = 'ایجاد کاربر جدید';
|
||||
return view('admin.admins.create');
|
||||
}
|
||||
|
||||
|
||||
public function store(AdminStoreRequest $request)
|
||||
{
|
||||
$data = $request->validated();
|
||||
|
||||
$avatarPath = null;
|
||||
|
||||
DB::beginTransaction();
|
||||
|
||||
try {
|
||||
$admin = Admin::create([
|
||||
'first_name' => $data['first_name'],
|
||||
'last_name' => $data['last_name'],
|
||||
'username' => $data['username'],
|
||||
'email' => $data['email'] ?? null,
|
||||
'mobile' => $data['mobile'] ?? null,
|
||||
'password' => Hash::make($data['password']),
|
||||
'role' => $data['role'],
|
||||
'status' => $data['status'],
|
||||
]);
|
||||
|
||||
if ($request->hasFile('image')) {
|
||||
$image = $request->file('image');
|
||||
|
||||
$imageName = $admin->id
|
||||
. '_'
|
||||
. time()
|
||||
. '_'
|
||||
. rand(11111, 99999)
|
||||
. '.'
|
||||
. $image->extension();
|
||||
|
||||
$avatarPath = $image->storeAs(
|
||||
'admin_avatars',
|
||||
$imageName,
|
||||
'public'
|
||||
);
|
||||
|
||||
$file = File::create([
|
||||
'name' => $imageName,
|
||||
'size' => $image->getSize(),
|
||||
'original_name' => $image->getClientOriginalName(),
|
||||
'path' => $avatarPath,
|
||||
'extension' => $image->extension(),
|
||||
]);
|
||||
|
||||
// AdminAvatar::create([
|
||||
// 'admin_id' => $admin->id,
|
||||
// 'file_id' => $file->id,
|
||||
// ]);
|
||||
}
|
||||
|
||||
foreach ($data['permissions'] as $permission) {
|
||||
AdminPermission::create([
|
||||
'admin_id' => $admin->id,
|
||||
'permission' => $permission,
|
||||
]);
|
||||
}
|
||||
|
||||
DB::commit();
|
||||
|
||||
return redirect()
|
||||
->route('admin.admins.index')
|
||||
->with('success', 'مدیر جدید با موفقیت ایجاد شد.');
|
||||
|
||||
} catch (\Throwable $exception) {
|
||||
DB::rollBack();
|
||||
|
||||
if ($avatarPath) {
|
||||
Storage::disk('public')->delete($avatarPath);
|
||||
}
|
||||
|
||||
Log::error('خطا در ایجاد مدیر جدید', [
|
||||
'message' => $exception->getMessage(),
|
||||
'file' => $exception->getFile(),
|
||||
'line' => $exception->getLine(),
|
||||
]);
|
||||
|
||||
return back()
|
||||
->withInput(
|
||||
$request->except([
|
||||
'password',
|
||||
'password_confirmation',
|
||||
'image',
|
||||
])
|
||||
)
|
||||
->with('error', 'خطایی هنگام ایجاد مدیر رخ داد.');
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public function destroy()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function trash()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function restore()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
public function forceDelete()
|
||||
{
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware\Admin;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class CheckAdminPermission
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param Closure(Request): (Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next, string $permission)
|
||||
{
|
||||
$admin = auth('admin')->user();
|
||||
|
||||
if (! auth('admin')->user()?->hasPermission($permission)) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware\Admin;
|
||||
|
||||
use App\Enums\Admin\AdminRole;
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class CheckSuperAdmin
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param Closure(Request): (Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next): Response
|
||||
{
|
||||
if (auth('admin')->user()?->role !== AdminRole::SUPERADMIN) {
|
||||
abort(403);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests\Admin;
|
||||
|
||||
use App\Enums\Admin\AdminPermission;
|
||||
use App\Enums\Admin\AdminRole;
|
||||
use App\Enums\Admin\AdminStatus;
|
||||
use Illuminate\Contracts\Validation\ValidationRule;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Illuminate\Validation\Rules\Enum;
|
||||
|
||||
class AdminStoreRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, ValidationRule|array<mixed>|string>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'first_name' => [
|
||||
'required',
|
||||
'string',
|
||||
'min:2',
|
||||
'max:64',
|
||||
'persian_alpha'
|
||||
],
|
||||
'last_name' => [
|
||||
'required',
|
||||
'string',
|
||||
'min:2',
|
||||
'max:64',
|
||||
'persian_alpha'
|
||||
],
|
||||
'username' => [
|
||||
'required',
|
||||
'string',
|
||||
'min:2',
|
||||
'max:100',
|
||||
'regex:/^[A-Za-z0-9_]+$/',
|
||||
'unique:admins,username'
|
||||
],
|
||||
'email' => [
|
||||
'nullable',
|
||||
'email',
|
||||
'max:150',
|
||||
'unique:users,email'
|
||||
],
|
||||
'mobile' => [
|
||||
'nullable',
|
||||
'string',
|
||||
'ir_mobile:zero'
|
||||
],
|
||||
'password' => [
|
||||
'required',
|
||||
'min:8',
|
||||
'max:255',
|
||||
'alpha_num',
|
||||
],
|
||||
'role' => [
|
||||
'required',
|
||||
Rule::enum(AdminRole::class),
|
||||
],
|
||||
'status' => [
|
||||
'required',
|
||||
Rule::enum(AdminStatus::class),
|
||||
],
|
||||
'permissions' => [
|
||||
'nullable',
|
||||
'array',
|
||||
'min:1',
|
||||
],
|
||||
|
||||
'permissions.*' => [
|
||||
'required',
|
||||
'string',
|
||||
'distinct',
|
||||
Rule::enum(AdminPermission::class),
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
+18
-2
@@ -6,6 +6,8 @@
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use App\Enums\Admin\AdminRole;
|
||||
use App\Enums\Admin\AdminStatus;
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Collection;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
@@ -42,8 +44,8 @@ class Admin extends User
|
||||
|
||||
protected $casts = [
|
||||
'file_id' => 'int',
|
||||
'role' => 'int',
|
||||
'status' => 'int',
|
||||
'role' => AdminRole::class,
|
||||
'status' => AdminStatus::class,
|
||||
'last_login_at' => 'datetime'
|
||||
];
|
||||
|
||||
@@ -73,4 +75,18 @@ class Admin extends User
|
||||
{
|
||||
return $this->hasMany(Comment::class);
|
||||
}
|
||||
public function permissions()
|
||||
{
|
||||
return $this->hasMany(AdminPermission::class);
|
||||
}
|
||||
public function hasPermission(string $permission): bool
|
||||
{
|
||||
if ($this->role === AdminRole::SUPERADMIN) {
|
||||
return true;
|
||||
}
|
||||
|
||||
return $this->permissions()
|
||||
->where('permission', $permission)
|
||||
->exists();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Created by Reliese Model.
|
||||
*/
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Carbon\Carbon;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
/**
|
||||
* Class AdminPermission
|
||||
*
|
||||
* @property int $id
|
||||
* @property int $admin_id
|
||||
* @property string $permission
|
||||
* @property Carbon|null $created_at
|
||||
* @property Carbon|null $updated_at
|
||||
*
|
||||
* @package App\Models
|
||||
*/
|
||||
class AdminPermission extends Model
|
||||
{
|
||||
protected $table = 'admin_permissions';
|
||||
public static $snakeAttributes = false;
|
||||
|
||||
protected $casts = [
|
||||
'admin_id' => 'int'
|
||||
];
|
||||
|
||||
protected $fillable = [
|
||||
'admin_id',
|
||||
'permission'
|
||||
];
|
||||
|
||||
public function admin()
|
||||
{
|
||||
return $this->belongsTo(Admin::class);
|
||||
}
|
||||
}
|
||||
@@ -15,11 +15,20 @@ return Application::configure(basePath: dirname(__DIR__))
|
||||
health: '/up',
|
||||
)
|
||||
->withMiddleware(function (Middleware $middleware) {
|
||||
$middleware->redirectGuestsTo(function (Illuminate\Http\Request $request) {
|
||||
return $request->is('admin') || $request->is('admin/*')
|
||||
? route('admin.auth.login.index')
|
||||
: route('auth.login.index');
|
||||
});
|
||||
$middleware->redirectUsersTo(function (Illuminate\Http\Request $request) {
|
||||
return $request->is('admin') || $request->is('admin/*')
|
||||
? route('admin.dashboard.index')
|
||||
: route('index');
|
||||
});
|
||||
$middleware->alias([
|
||||
'admin.super' => \App\Http\Middleware\Admin\CheckSuperAdmin::class,
|
||||
'admin.permission' => \App\Http\Middleware\Admin\CheckAdminPermission::class,
|
||||
]);
|
||||
})
|
||||
->withExceptions(function (Exceptions $exceptions) {
|
||||
//
|
||||
|
||||
@@ -0,0 +1,440 @@
|
||||
@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">
|
||||
|
||||
<div class="row">
|
||||
|
||||
{{-- Success Message --}}
|
||||
@if(session('success'))
|
||||
<div class="alert alert-success">
|
||||
{{ session('success') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
|
||||
{{-- Error Message --}}
|
||||
@if(session('error'))
|
||||
<div class="alert alert-danger">
|
||||
{{ session('error') }}
|
||||
</div>
|
||||
@endif
|
||||
|
||||
<div class="col-xl-12">
|
||||
|
||||
<form
|
||||
action="{{ route('admin.admins.store') }}"
|
||||
method="POST"
|
||||
enctype="multipart/form-data"
|
||||
>
|
||||
@csrf
|
||||
<div class="card custom-card">
|
||||
|
||||
{{-- Card Header --}}
|
||||
<div class="card-header">
|
||||
<div class="card-title">
|
||||
ایجاد مدیر
|
||||
</div>
|
||||
</div>
|
||||
{{-- Card Body --}}
|
||||
<div class="card-body">
|
||||
|
||||
<div class="row gy-3">
|
||||
|
||||
{{-- First Name --}}
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
نام
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
name="first_name"
|
||||
value="{{ old('first_name') }}"
|
||||
placeholder="نام را وارد کنید"
|
||||
>
|
||||
|
||||
@error('first_name')
|
||||
<span class="text-danger">
|
||||
{{ $message }}
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
|
||||
{{-- Last Name --}}
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
نام خانوادگی
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
name="last_name"
|
||||
value="{{ old('last_name') }}"
|
||||
placeholder="نام خانوادگی را وارد کنید"
|
||||
>
|
||||
|
||||
@error('last_name')
|
||||
<span class="text-danger">
|
||||
{{ $message }}
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
|
||||
{{-- Username --}}
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
نام کاربری
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
name="username"
|
||||
value="{{ old('username') }}"
|
||||
placeholder="نام کاربری را وارد کنید"
|
||||
>
|
||||
|
||||
@error('username')
|
||||
<span class="text-danger">
|
||||
{{ $message }}
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
|
||||
{{-- Email --}}
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
ایمیل
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="email"
|
||||
class="form-control"
|
||||
name="email"
|
||||
value="{{ old('email') }}"
|
||||
placeholder="ایمیل را وارد کنید"
|
||||
>
|
||||
|
||||
@error('email')
|
||||
<span class="text-danger">
|
||||
{{ $message }}
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
|
||||
{{-- Mobile --}}
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
شماره موبایل
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
name="mobile"
|
||||
value="{{ old('mobile') }}"
|
||||
placeholder="شماره موبایل را وارد کنید"
|
||||
>
|
||||
|
||||
@error('mobile')
|
||||
<span class="text-danger">
|
||||
{{ $message }}
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
|
||||
{{-- Password --}}
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
رمز عبور
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="password"
|
||||
class="form-control"
|
||||
name="password"
|
||||
placeholder="رمز عبور را وارد کنید"
|
||||
>
|
||||
|
||||
@error('password')
|
||||
<span class="text-danger">
|
||||
{{ $message }}
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
|
||||
{{-- Role --}}
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
نقش مدیر
|
||||
</label>
|
||||
|
||||
<select
|
||||
class="form-control"
|
||||
name="role"
|
||||
>
|
||||
|
||||
@foreach(\App\Enums\Admin\AdminRole::cases() as $role)
|
||||
|
||||
<option
|
||||
value="{{ $role->value }}"
|
||||
@selected(
|
||||
old('role') == $role->value
|
||||
)
|
||||
>
|
||||
{{ $role->label() }}
|
||||
</option>
|
||||
|
||||
@endforeach
|
||||
|
||||
</select>
|
||||
|
||||
@error('role')
|
||||
<span class="text-danger">
|
||||
{{ $message }}
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
|
||||
{{-- Status --}}
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
وضعیت
|
||||
</label>
|
||||
|
||||
<select
|
||||
class="form-control"
|
||||
name="status"
|
||||
>
|
||||
|
||||
@foreach(\App\Enums\Admin\AdminStatus::cases() as $status)
|
||||
|
||||
<option
|
||||
value="{{ $status->value }}"
|
||||
@selected(
|
||||
old(
|
||||
'status',
|
||||
\App\Enums\Admin\AdminStatus::ACTIVE->value
|
||||
) == $status->value
|
||||
)
|
||||
>
|
||||
{{ $status->label() }}
|
||||
</option>
|
||||
|
||||
@endforeach
|
||||
|
||||
</select>
|
||||
|
||||
@error('status')
|
||||
<span class="text-danger">
|
||||
{{ $message }}
|
||||
</span>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- Permissions --}}
|
||||
<div class="mt-4">
|
||||
|
||||
<div class="card custom-card">
|
||||
|
||||
<div class="card-header">
|
||||
<div class="card-title">
|
||||
سطح دسترسی
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
|
||||
<div class="row gy-3">
|
||||
|
||||
@foreach(\App\Enums\Admin\AdminPermission::cases() as $permission)
|
||||
<div class="col-xl-3 col-lg-4 col-md-6">
|
||||
<div class="form-check">
|
||||
<input
|
||||
class="form-check-input"
|
||||
type="checkbox"
|
||||
name="permissions[]"
|
||||
value="{{ $permission->value }}"
|
||||
id="permission_{{ $permission->value }}"
|
||||
|
||||
@checked(
|
||||
in_array(
|
||||
$permission->value,
|
||||
old('permissions', [])
|
||||
)
|
||||
)
|
||||
>
|
||||
|
||||
<label
|
||||
class="form-check-label"
|
||||
for="permission_{{ $permission->value }}"
|
||||
>
|
||||
{{ $permission->label() }}
|
||||
</label>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
@endforeach
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@error('permissions')
|
||||
<div class="mt-2">
|
||||
<span class="text-danger">
|
||||
{{ $message }}
|
||||
</span>
|
||||
</div>
|
||||
@enderror
|
||||
|
||||
@error('permissions.*')
|
||||
<div class="mt-2">
|
||||
<span class="text-danger">
|
||||
{{ $message }}
|
||||
</span>
|
||||
</div>
|
||||
@enderror
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- Avatar --}}
|
||||
<div class="card-avatar mt-4">
|
||||
|
||||
<div class="text-center">
|
||||
|
||||
<label class="form-label d-block fw-semibold">
|
||||
تصویر پروفایل
|
||||
</label>
|
||||
|
||||
<label
|
||||
class="avatar-picker"
|
||||
id="avatarPreview"
|
||||
style="
|
||||
background-image:
|
||||
url('{{ asset('assets/admin/images/faces/DefaultAvatar.jpg') }}')
|
||||
"
|
||||
>
|
||||
|
||||
<input
|
||||
type="file"
|
||||
name="image"
|
||||
accept="image/*"
|
||||
onchange="previewAvatar(this)"
|
||||
>
|
||||
|
||||
</label>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
@error('image')
|
||||
<div class="mt-2">
|
||||
<span class="text-danger">
|
||||
{{ $message }}
|
||||
</span>
|
||||
</div>
|
||||
@enderror
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
{{-- Card Footer --}}
|
||||
<div class="card-footer text-end">
|
||||
|
||||
<a
|
||||
href="{{ route('admin.admins.index') }}"
|
||||
class="btn btn-light"
|
||||
>
|
||||
انصراف
|
||||
</a>
|
||||
|
||||
<button
|
||||
type="submit"
|
||||
class="btn btn-primary"
|
||||
>
|
||||
ثبت اطلاعات
|
||||
</button>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@endsection
|
||||
|
||||
|
||||
@push('scripts')
|
||||
|
||||
<script>
|
||||
function previewAvatar(input) {
|
||||
|
||||
const preview = document.getElementById('avatarPreview');
|
||||
|
||||
if (input.files && input.files[0]) {
|
||||
|
||||
const reader = new FileReader();
|
||||
|
||||
reader.onload = function (e) {
|
||||
preview.style.backgroundImage =
|
||||
`url('${e.target.result}')`;
|
||||
};
|
||||
|
||||
reader.readAsDataURL(input.files[0]);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
@endpush
|
||||
@@ -0,0 +1,182 @@
|
||||
@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">
|
||||
|
||||
|
||||
<div class="row">
|
||||
@if(session('success'))
|
||||
<span style="color: green">{{session('success')}}</span>
|
||||
@endif
|
||||
@if(session('error'))
|
||||
<span style="color: green">{{session('error')}}</span>
|
||||
@endif
|
||||
<div class="col-xl-12">
|
||||
<form action="{{route('admin.admins.update' , $admin->id)}}" method="POST"
|
||||
enctype="multipart/form-data">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
<div class="card custom-card">
|
||||
<div class="card-header">
|
||||
<div class="card-title">ویرایش مدیر</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
<div class="row gy-3">
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">نام</label>
|
||||
<input type="text" class="form-control" name="first_name"
|
||||
value="{{old('first_name' , $admin->first_name)}}"
|
||||
placeholder="نام را وارد کنید">
|
||||
@error('first_name')
|
||||
<span style="color: red">{{$message}}</span>
|
||||
@enderror
|
||||
</div>
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">نام خانوادگی</label>
|
||||
<input type="text" class="form-control" name="last_name"
|
||||
value="{{old('last_name' , $admin->last_name) }}"
|
||||
placeholder="نام خانوادگی را وارد کنید">
|
||||
@error('last_name')
|
||||
<span style="color: red">{{$message}}</span>
|
||||
@enderror
|
||||
</div>
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">نام کاربری</label>
|
||||
<input type="text" class="form-control" name="username"
|
||||
value="{{old('username' , $admin->username)}}" placeholder="نام کاربری">
|
||||
@error('username')
|
||||
<span style="color: red">{{$message}}</span>
|
||||
@enderror
|
||||
</div>
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">ایمیل</label>
|
||||
<input type="email" class="form-control" name="email"
|
||||
value="{{old('email' , $admin?->email)}}"
|
||||
placeholder="ایمیل را وارد کنید">
|
||||
@error('email')
|
||||
<span style="color: red">{{$message}}</span>
|
||||
@enderror
|
||||
</div>
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">رمز عبور (در صورت تغییر)</label>
|
||||
<input type="password" class="form-control" name="password"
|
||||
placeholder="رمز عبور را وارد کنید">
|
||||
@error('password')
|
||||
<span style="color: red">{{$message}}</span>
|
||||
@enderror
|
||||
</div>
|
||||
@if($canEditSensitiveFields)
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">نوع مدیر</label>
|
||||
|
||||
<select class="form-control" name="is_super">
|
||||
<option value="1" @selected(old('is_super', $admin->is_super ? '1' : '0') == '1')>
|
||||
مدیر کل
|
||||
</option>
|
||||
|
||||
<option value="0" @selected(old('is_super', $admin->is_super ? '1' : '0') == '0')>
|
||||
عادی
|
||||
</option>
|
||||
</select>
|
||||
|
||||
@error('is_super')
|
||||
<span style="color: red">{{ $message }}</span>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">وضعیت</label>
|
||||
|
||||
<select class="form-control" name="status">
|
||||
@foreach($adminStatuses as $status)
|
||||
<option value="{{ $status->value }}"
|
||||
@selected(old('status', $admin->status->value) == $status->value)>
|
||||
{{ $status->label() }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
|
||||
@error('status')
|
||||
<span style="color: red">{{ $message }}</span>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
@elseif($showReadonlySensitiveFields)
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">نوع مدیر</label>
|
||||
|
||||
<div class="form-control bg-light">
|
||||
مدیر کل
|
||||
</div>
|
||||
|
||||
<small class="text-muted">
|
||||
شما نمیتوانید نوع دسترسی خودتان را تغییر دهید.
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">وضعیت</label>
|
||||
|
||||
<div class="form-control bg-light">
|
||||
{{ $admin->status->label() }}
|
||||
</div>
|
||||
|
||||
<small class="text-muted">
|
||||
شما نمیتوانید وضعیت حساب خودتان را تغییر دهید.
|
||||
</small>
|
||||
</div>
|
||||
@endif
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="card-avatar">
|
||||
<div class="text-center">
|
||||
<label class="form-label d-block fw-semibold">تصویر پروفایل</label>
|
||||
@if($admin->avatar?->file_id)
|
||||
<label class="avatar-picker" id="avatarPreview"
|
||||
style="background-image: url('{{ getFileUrl($admin->avatar->file_id) }}')">
|
||||
<input type="file" name="image" accept="image/*"
|
||||
onchange="previewAvatar(this)">
|
||||
</label>
|
||||
@else
|
||||
<label class="avatar-picker"
|
||||
id="avatarPreview"
|
||||
style="background-image: url('{{ asset('assets/admin/images/faces/DefaultAvatar.jpg') }}')">
|
||||
<input type="file"
|
||||
name="image"
|
||||
accept="image/*"
|
||||
onchange="previewAvatar(this)">
|
||||
</label>
|
||||
@endif
|
||||
</div>
|
||||
</div>
|
||||
@error('image')
|
||||
<span style="color: red">{{$message}}</span>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="card-footer text-end">
|
||||
<button type="submit" class="btn btn-primary">ذخیره تغییرات</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,194 @@
|
||||
@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="javascript:void(0);">ادمینها</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()->input('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()->missing('sort') || request()->input('sort') == 'name_asc') >
|
||||
نام (الف - ی)
|
||||
</option>
|
||||
<option
|
||||
value="name_desc" @selected( request()->input('sort') == 'name_desc') >
|
||||
نام (ی - الف)
|
||||
</option>
|
||||
<option value="email" @selected( request()->input('sort') == 'email') >
|
||||
ایمیل
|
||||
</option>
|
||||
<option value="newest" @selected( request()->input('sort') == 'newest') >
|
||||
جدیدترین
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- Right: Search -->
|
||||
<div class="d-flex align-items-center gap-2" role="search">
|
||||
<a href="{{ route('admin.admins.trash.index') }}" class="btn btn-danger-light d-flex align-items-center">
|
||||
<i class="ri-delete-bin-3-line me-1 fw-medium align-middle"></i>
|
||||
سطل زباله
|
||||
</a>
|
||||
<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>
|
||||
<th>آخرین ورود</th>
|
||||
<th>تاریخ ایجاد</th>
|
||||
<th>اقدامات</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@forelse($admins as $admin)
|
||||
<tr>
|
||||
<td>
|
||||
<input class="form-check-input" type="checkbox" value="{{ $admin->id }}">
|
||||
</td>
|
||||
<td>
|
||||
<span class="avatar avatar-md avatar-square bg-light">
|
||||
@if($admin->file)
|
||||
<img src="{{ getFileUrl($admin->file_id) }}" class="w-100 h-100" alt="{{ $admin->username }}">
|
||||
@else
|
||||
<img src="{{asset('assets/admin/images/faces/DefaultAvatar.jpg')}}"
|
||||
class="w-100 h-100" alt="{{$admin->username}}">
|
||||
@endif
|
||||
</span>
|
||||
</td>
|
||||
<td>{{$admin->first_name}}</td>
|
||||
<td>{{$admin->last_name}}</td>
|
||||
<td>{{$admin->username}}</td>
|
||||
<td>{{$admin->email ?: '-'}}</td>
|
||||
<td>
|
||||
@if($admin->status == \App\Enums\Admin\AdminStatus::ACTIVE)
|
||||
<span
|
||||
class="badge bg-primary-transparent">
|
||||
فعال
|
||||
</span>
|
||||
@else
|
||||
<span
|
||||
class="badge bg-danger-transparent">
|
||||
غیر فعال
|
||||
</span>
|
||||
@endif
|
||||
</td>
|
||||
<td>
|
||||
@if($admin->role == \App\Enums\Admin\AdminRole::SUPERADMIN)
|
||||
<span
|
||||
class="badge bg-success-transparent">
|
||||
سوپر ادمین
|
||||
</span>
|
||||
@else
|
||||
<span
|
||||
class="badge bg-info-transparent">
|
||||
ادمین عادی
|
||||
</span>
|
||||
|
||||
@endif
|
||||
</td>
|
||||
<td>{{$admin->last_login_at?->toJalali()->format('d F Y - H:i') ?: '-'}}</td>
|
||||
<td>{{$admin->created_at->toJalali()->format('d F Y - H:i')}}</td>
|
||||
<td>
|
||||
<div class="hstack gap-2 fs-15">
|
||||
<a href="{{route('admin.admins.edit' , $admin->id)}}"
|
||||
class="btn btn-secondary-light btn-icon btn-sm" title="ویرایش">
|
||||
<i class="ti ti-pencil"></i>
|
||||
</a>
|
||||
@auth('admin')
|
||||
@if(auth('admin')->user()->role == \App\Enums\Admin\AdminRole::SUPERADMIN && auth('admin')->id() !== $admin->id)
|
||||
<form
|
||||
action="{{ route('admin.admins.destroy', $admin->id) }}"
|
||||
method="POST"
|
||||
class="d-inline"
|
||||
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>
|
||||
@endif
|
||||
@endauth
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
@empty
|
||||
<tr>
|
||||
<td colspan="11" class="text-center text-muted py-4">
|
||||
هیچ مدیری یافت نشد.
|
||||
</td>
|
||||
</tr>
|
||||
@endforelse
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Pagination -->
|
||||
<div class="d-flex justify-content-end mt-3">
|
||||
{{ $admins->links() }}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,3 @@
|
||||
<div>
|
||||
<!-- The best way to take care of the future is to take care of the present moment. - Thich Nhat Hanh -->
|
||||
</div>
|
||||
@@ -0,0 +1,3 @@
|
||||
<div>
|
||||
<!-- Life is available only in the present moment. - Thich Nhat Hanh -->
|
||||
</div>
|
||||
@@ -48,6 +48,25 @@
|
||||
</a>
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
<!-- Start::slide -->
|
||||
@if(auth('admin')->user()?->role == \App\Enums\Admin\AdminRole::SUPERADMIN)
|
||||
<li class="slide ">
|
||||
<a href="{{route('admin.admins.index')}}"
|
||||
class="side-menu__item {{activeAdminSidebar('admin.admins.index')}}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
class="side-menu__icon"
|
||||
width="1em"
|
||||
height="1em"
|
||||
viewBox="0 0 24 24">
|
||||
<path fill="none" stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="1.5"
|
||||
d="M12 12a5 5 0 1 0-5-5a5 5 0 0 0 5 5Zm-7 9a7 7 0 0 1 14 0Z"/>
|
||||
</svg>
|
||||
<span class="side-menu__label">مدیریت مدیران</span>
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
<li class="slide ">
|
||||
@@ -67,22 +86,6 @@
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
<li class="slide ">
|
||||
<a href="#"
|
||||
class="side-menu__item ">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="side-menu__icon" width="1em"
|
||||
height="1em" viewBox="0 0 24 24">
|
||||
<path fill="none" stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="1.5"
|
||||
d="M2.5 12c0-4.478 0-6.718 1.391-8.109S7.521 2.5 12 2.5c4.478 0 6.718 0 8.109 1.391S21.5 7.521 21.5 12c0 4.478 0 6.718-1.391 8.109S16.479 21.5 12 21.5c-4.478 0-6.718 0-8.109-1.391S2.5 16.479 2.5 12M11 7h6M7 7h1m-1 5h1m-1 5h1m3-5h6m-6 5h6"
|
||||
color="currentColor"></path>
|
||||
</svg>
|
||||
<span class="side-menu__label">مدیریت سفارشات</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
<li class="slide ">
|
||||
<a href="#"
|
||||
@@ -120,26 +123,6 @@
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
@if(auth('admin')->user()?->role == \App\Enums\Admin\AdminRole::SUPERADMIN)
|
||||
<li class="slide ">
|
||||
<a href="{{route('admin.dashboard.index')}}"
|
||||
class="side-menu__item {{activeAdminSidebar('admin.dashboard.index')}}">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
class="side-menu__icon"
|
||||
width="1em"
|
||||
height="1em"
|
||||
viewBox="0 0 24 24">
|
||||
<path fill="none" stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="1.5"
|
||||
d="M12 12a5 5 0 1 0-5-5a5 5 0 0 0 5 5Zm-7 9a7 7 0 0 1 14 0Z"/>
|
||||
</svg>
|
||||
<span class="side-menu__label">مدیریت مدیران</span>
|
||||
</a>
|
||||
</li>
|
||||
@endif
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
<li class="slide">
|
||||
<a href="#"
|
||||
@@ -207,6 +190,17 @@
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
<li class="slide">
|
||||
<a href="{{route('admin.auth.logout')}}"
|
||||
class="side-menu__item ">
|
||||
|
||||
<i class="ri-settings-3-line side-menu__icon"></i>
|
||||
<span class="side-menu__label">خروج از حساب کاربری</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
|
||||
</ul>
|
||||
<div class="slide-right d-none" id="slide-right">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="#7b8191" width="24" height="24"
|
||||
|
||||
+30
-1
@@ -2,6 +2,7 @@
|
||||
|
||||
use App\Http\Controllers\Admin\AuthController;
|
||||
use App\Http\Controllers\Admin\DashboardController;
|
||||
use App\Http\Controllers\Admin\AdminController;
|
||||
use App\Http\Controllers\Admin\UserController;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
@@ -25,7 +26,32 @@ Route::prefix('admin')->name('admin.')->group(function () {
|
||||
Route::middleware('auth:admin')->group(function () {
|
||||
Route::get('dashboard', [DashboardController::class, 'index'])->name('dashboard.index');
|
||||
|
||||
Route::prefix('users')->name('users.')->controller(UserController::class)->group(function () {
|
||||
Route::prefix('admins')->name('admins.')->middleware('admin.super')->controller(AdminController::class)->group(function () {
|
||||
|
||||
Route::get('/', 'index')->name('index');
|
||||
|
||||
Route::get('create', 'create')->name('create');
|
||||
Route::post('/', 'store')->name('store');
|
||||
|
||||
Route::prefix('{admin}')->group(function () {
|
||||
Route::get('edit', 'edit')->name('edit');
|
||||
Route::put('/', 'update')->name('update');
|
||||
Route::delete('/', 'destroy')->name('destroy');
|
||||
});
|
||||
|
||||
Route::prefix('trash')->name('trash.')->group(function () {
|
||||
|
||||
Route::get('/', 'trash')->name('index');
|
||||
|
||||
Route::prefix('{id}')->group(function () {
|
||||
Route::post('restore', 'restore')->name('restore');
|
||||
Route::delete('/', 'forceDelete')->name('force-delete');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
Route::prefix('users')->name('users.')->middleware('admin.permission:manage-users')->controller(UserController::class)->group(function () {
|
||||
|
||||
Route::get('/', 'index')->name('index');
|
||||
|
||||
@@ -52,6 +78,9 @@ Route::prefix('admin')->name('admin.')->group(function () {
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
});
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,537 @@
|
||||
<?php $__env->startSection('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="<?php echo e(route('admin.admins.index')); ?>">
|
||||
مدیران
|
||||
</a>
|
||||
</li>
|
||||
|
||||
<li class="breadcrumb-item active" aria-current="page">
|
||||
افزودن مدیر
|
||||
</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
<?php $__env->stopSection(); ?>
|
||||
|
||||
|
||||
<?php $__env->startSection('content'); ?>
|
||||
<div class="container-fluid pt-4">
|
||||
|
||||
<div class="row">
|
||||
|
||||
|
||||
<?php if(session('success')): ?>
|
||||
<div class="alert alert-success">
|
||||
<?php echo e(session('success')); ?>
|
||||
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
|
||||
|
||||
<?php if(session('error')): ?>
|
||||
<div class="alert alert-danger">
|
||||
<?php echo e(session('error')); ?>
|
||||
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
<div class="col-xl-12">
|
||||
|
||||
<form
|
||||
action="<?php echo e(route('admin.admins.store')); ?>"
|
||||
method="POST"
|
||||
enctype="multipart/form-data"
|
||||
>
|
||||
|
||||
<?php echo csrf_field(); ?>
|
||||
|
||||
<div class="card custom-card">
|
||||
|
||||
|
||||
<div class="card-header">
|
||||
<div class="card-title">
|
||||
ایجاد مدیر
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="card-body">
|
||||
|
||||
<div class="row gy-3">
|
||||
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
نام
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
name="first_name"
|
||||
value="<?php echo e(old('first_name')); ?>"
|
||||
placeholder="نام را وارد کنید"
|
||||
>
|
||||
|
||||
<?php $__errorArgs = ['first_name'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span class="text-danger">
|
||||
<?php echo e($message); ?>
|
||||
|
||||
</span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
نام خانوادگی
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
name="last_name"
|
||||
value="<?php echo e(old('last_name')); ?>"
|
||||
placeholder="نام خانوادگی را وارد کنید"
|
||||
>
|
||||
|
||||
<?php $__errorArgs = ['last_name'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span class="text-danger">
|
||||
<?php echo e($message); ?>
|
||||
|
||||
</span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
نام کاربری
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
name="username"
|
||||
value="<?php echo e(old('username')); ?>"
|
||||
placeholder="نام کاربری را وارد کنید"
|
||||
>
|
||||
|
||||
<?php $__errorArgs = ['username'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span class="text-danger">
|
||||
<?php echo e($message); ?>
|
||||
|
||||
</span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
ایمیل
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="email"
|
||||
class="form-control"
|
||||
name="email"
|
||||
value="<?php echo e(old('email')); ?>"
|
||||
placeholder="ایمیل را وارد کنید"
|
||||
>
|
||||
|
||||
<?php $__errorArgs = ['email'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span class="text-danger">
|
||||
<?php echo e($message); ?>
|
||||
|
||||
</span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
شماره موبایل
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="text"
|
||||
class="form-control"
|
||||
name="mobile"
|
||||
value="<?php echo e(old('mobile')); ?>"
|
||||
placeholder="شماره موبایل را وارد کنید"
|
||||
>
|
||||
|
||||
<?php $__errorArgs = ['mobile'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span class="text-danger">
|
||||
<?php echo e($message); ?>
|
||||
|
||||
</span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
رمز عبور
|
||||
</label>
|
||||
|
||||
<input
|
||||
type="password"
|
||||
class="form-control"
|
||||
name="password"
|
||||
placeholder="رمز عبور را وارد کنید"
|
||||
>
|
||||
|
||||
<?php $__errorArgs = ['password'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span class="text-danger">
|
||||
<?php echo e($message); ?>
|
||||
|
||||
</span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
نقش مدیر
|
||||
</label>
|
||||
|
||||
<select
|
||||
class="form-control"
|
||||
name="role"
|
||||
>
|
||||
|
||||
<?php $__currentLoopData = \App\Enums\Admin\AdminRole::cases(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $role): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
|
||||
|
||||
<option
|
||||
value="<?php echo e($role->value); ?>"
|
||||
<?php if(
|
||||
old('role') == $role->value
|
||||
): echo 'selected'; endif; ?>
|
||||
>
|
||||
<?php echo e($role->label()); ?>
|
||||
|
||||
</option>
|
||||
|
||||
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
|
||||
|
||||
</select>
|
||||
|
||||
<?php $__errorArgs = ['role'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span class="text-danger">
|
||||
<?php echo e($message); ?>
|
||||
|
||||
</span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">
|
||||
وضعیت
|
||||
</label>
|
||||
|
||||
<select
|
||||
class="form-control"
|
||||
name="status"
|
||||
>
|
||||
|
||||
<?php $__currentLoopData = \App\Enums\Admin\AdminStatus::cases(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $status): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
|
||||
|
||||
<option
|
||||
value="<?php echo e($status->value); ?>"
|
||||
<?php if(
|
||||
old(
|
||||
'status',
|
||||
\App\Enums\Admin\AdminStatus::ACTIVE->value
|
||||
) == $status->value
|
||||
): echo 'selected'; endif; ?>
|
||||
>
|
||||
<?php echo e($status->label()); ?>
|
||||
|
||||
</option>
|
||||
|
||||
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
|
||||
|
||||
</select>
|
||||
|
||||
<?php $__errorArgs = ['status'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span class="text-danger">
|
||||
<?php echo e($message); ?>
|
||||
|
||||
</span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="mt-4">
|
||||
|
||||
<div class="card custom-card">
|
||||
|
||||
<div class="card-header">
|
||||
<div class="card-title">
|
||||
سطح دسترسی
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
|
||||
<div class="row gy-3">
|
||||
|
||||
<?php $__currentLoopData = \App\Enums\Admin\AdminPermission::cases(); $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $permission): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
|
||||
<div class="col-xl-3 col-lg-4 col-md-6">
|
||||
<div class="form-check">
|
||||
<input
|
||||
class="form-check-input"
|
||||
type="checkbox"
|
||||
name="permissions[]"
|
||||
value="<?php echo e($permission->value); ?>"
|
||||
id="permission_<?php echo e($permission->value); ?>"
|
||||
|
||||
<?php if(
|
||||
in_array(
|
||||
$permission->value,
|
||||
old('permissions', [])
|
||||
)
|
||||
): echo 'checked'; endif; ?>
|
||||
>
|
||||
|
||||
<label
|
||||
class="form-check-label"
|
||||
for="permission_<?php echo e($permission->value); ?>"
|
||||
>
|
||||
<?php echo e($permission->label()); ?>
|
||||
|
||||
</label>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<?php $__errorArgs = ['permissions'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<div class="mt-2">
|
||||
<span class="text-danger">
|
||||
<?php echo e($message); ?>
|
||||
|
||||
</span>
|
||||
</div>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
|
||||
<?php $__errorArgs = ['permissions.*'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<div class="mt-2">
|
||||
<span class="text-danger">
|
||||
<?php echo e($message); ?>
|
||||
|
||||
</span>
|
||||
</div>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="card-avatar mt-4">
|
||||
|
||||
<div class="text-center">
|
||||
|
||||
<label class="form-label d-block fw-semibold">
|
||||
تصویر پروفایل
|
||||
</label>
|
||||
|
||||
<label
|
||||
class="avatar-picker"
|
||||
id="avatarPreview"
|
||||
style="
|
||||
background-image:
|
||||
url('<?php echo e(asset('assets/admin/images/faces/DefaultAvatar.jpg')); ?>')
|
||||
"
|
||||
>
|
||||
|
||||
<input
|
||||
type="file"
|
||||
name="image"
|
||||
accept="image/*"
|
||||
onchange="previewAvatar(this)"
|
||||
>
|
||||
|
||||
</label>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<?php $__errorArgs = ['image'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<div class="mt-2">
|
||||
<span class="text-danger">
|
||||
<?php echo e($message); ?>
|
||||
|
||||
</span>
|
||||
</div>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="card-footer text-end">
|
||||
|
||||
<a
|
||||
href="<?php echo e(route('admin.admins.index')); ?>"
|
||||
class="btn btn-light"
|
||||
>
|
||||
انصراف
|
||||
</a>
|
||||
|
||||
<button
|
||||
type="submit"
|
||||
class="btn btn-primary"
|
||||
>
|
||||
ثبت اطلاعات
|
||||
</button>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</form>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<?php $__env->stopSection(); ?>
|
||||
|
||||
|
||||
<?php $__env->startPush('scripts'); ?>
|
||||
|
||||
<script>
|
||||
function previewAvatar(input) {
|
||||
|
||||
const preview = document.getElementById('avatarPreview');
|
||||
|
||||
if (input.files && input.files[0]) {
|
||||
|
||||
const reader = new FileReader();
|
||||
|
||||
reader.onload = function (e) {
|
||||
preview.style.backgroundImage =
|
||||
`url('${e.target.result}')`;
|
||||
};
|
||||
|
||||
reader.readAsDataURL(input.files[0]);
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<?php $__env->stopPush(); ?>
|
||||
|
||||
<?php echo $__env->make('admin.layouts.app', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH C:\Users\ASUS\Desktop\airline-agency\resources\views/admin/admins/create.blade.php ENDPATH**/ ?>
|
||||
@@ -0,0 +1,194 @@
|
||||
<?php $__env->startSection('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="javascript:void(0);">ادمینها</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">لیست ادمینها</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
<?php $__env->stopSection(); ?>
|
||||
|
||||
<?php $__env->startSection('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="<?php echo e(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="<?php echo e(request()->input('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" <?php if(request()->missing('sort') || request()->input('sort') == 'name_asc'): echo 'selected'; endif; ?> >
|
||||
نام (الف - ی)
|
||||
</option>
|
||||
<option
|
||||
value="name_desc" <?php if( request()->input('sort') == 'name_desc'): echo 'selected'; endif; ?> >
|
||||
نام (ی - الف)
|
||||
</option>
|
||||
<option value="email" <?php if( request()->input('sort') == 'email'): echo 'selected'; endif; ?> >
|
||||
ایمیل
|
||||
</option>
|
||||
<option value="newest" <?php if( request()->input('sort') == 'newest'): echo 'selected'; endif; ?> >
|
||||
جدیدترین
|
||||
</option>
|
||||
</select>
|
||||
</div>
|
||||
|
||||
<!-- Right: Search -->
|
||||
<div class="d-flex align-items-center gap-2" role="search">
|
||||
<a href="<?php echo e(route('admin.admins.trash.index')); ?>" class="btn btn-danger-light d-flex align-items-center">
|
||||
<i class="ri-delete-bin-3-line me-1 fw-medium align-middle"></i>
|
||||
سطل زباله
|
||||
</a>
|
||||
<a href="<?php echo e(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>
|
||||
<th>آخرین ورود</th>
|
||||
<th>تاریخ ایجاد</th>
|
||||
<th>اقدامات</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<?php $__empty_1 = true; $__currentLoopData = $admins; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $admin): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); $__empty_1 = false; ?>
|
||||
<tr>
|
||||
<td>
|
||||
<input class="form-check-input" type="checkbox" value="<?php echo e($admin->id); ?>">
|
||||
</td>
|
||||
<td>
|
||||
<span class="avatar avatar-md avatar-square bg-light">
|
||||
<?php if($admin->file): ?>
|
||||
<img src="<?php echo e(getFileUrl($admin->file_id)); ?>" class="w-100 h-100" alt="<?php echo e($admin->username); ?>">
|
||||
<?php else: ?>
|
||||
<img src="<?php echo e(asset('assets/admin/images/faces/DefaultAvatar.jpg')); ?>"
|
||||
class="w-100 h-100" alt="<?php echo e($admin->username); ?>">
|
||||
<?php endif; ?>
|
||||
</span>
|
||||
</td>
|
||||
<td><?php echo e($admin->first_name); ?></td>
|
||||
<td><?php echo e($admin->last_name); ?></td>
|
||||
<td><?php echo e($admin->username); ?></td>
|
||||
<td><?php echo e($admin->email ?: '-'); ?></td>
|
||||
<td>
|
||||
<?php if($admin->status == \App\Enums\Admin\AdminStatus::ACTIVE): ?>
|
||||
<span
|
||||
class="badge bg-primary-transparent">
|
||||
فعال
|
||||
</span>
|
||||
<?php else: ?>
|
||||
<span
|
||||
class="badge bg-danger-transparent">
|
||||
غیر فعال
|
||||
</span>
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td>
|
||||
<?php if($admin->role == \App\Enums\Admin\AdminRole::SUPERADMIN): ?>
|
||||
<span
|
||||
class="badge bg-success-transparent">
|
||||
سوپر ادمین
|
||||
</span>
|
||||
<?php else: ?>
|
||||
<span
|
||||
class="badge bg-info-transparent">
|
||||
ادمین عادی
|
||||
</span>
|
||||
|
||||
<?php endif; ?>
|
||||
</td>
|
||||
<td><?php echo e($admin->last_login_at?->toJalali()->format('d F Y - H:i') ?: '-'); ?></td>
|
||||
<td><?php echo e($admin->created_at->toJalali()->format('d F Y - H:i')); ?></td>
|
||||
<td>
|
||||
<div class="hstack gap-2 fs-15">
|
||||
<a href="<?php echo e(route('admin.admins.edit' , $admin->id)); ?>"
|
||||
class="btn btn-secondary-light btn-icon btn-sm" title="ویرایش">
|
||||
<i class="ti ti-pencil"></i>
|
||||
</a>
|
||||
<?php if(auth()->guard('admin')->check()): ?>
|
||||
<?php if(auth('admin')->user()->role == \App\Enums\Admin\AdminRole::SUPERADMIN && auth('admin')->id() !== $admin->id): ?>
|
||||
<form
|
||||
action="<?php echo e(route('admin.admins.destroy', $admin->id)); ?>"
|
||||
method="POST"
|
||||
class="d-inline"
|
||||
onsubmit="return confirm('از حذف این مدیر مطمئن هستید؟')"
|
||||
>
|
||||
<?php echo csrf_field(); ?>
|
||||
<?php echo method_field('DELETE'); ?>
|
||||
|
||||
<button type="submit" class="btn btn-icon btn-sm btn-danger-light">
|
||||
<i class="ri-delete-bin-line"></i>
|
||||
|
||||
</button>
|
||||
</form>
|
||||
<?php endif; ?>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</td>
|
||||
</tr>
|
||||
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); if ($__empty_1): ?>
|
||||
<tr>
|
||||
<td colspan="11" class="text-center text-muted py-4">
|
||||
هیچ مدیری یافت نشد.
|
||||
</td>
|
||||
</tr>
|
||||
<?php endif; ?>
|
||||
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Pagination -->
|
||||
<div class="d-flex justify-content-end mt-3">
|
||||
<?php echo e($admins->links()); ?>
|
||||
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<?php $__env->stopSection(); ?>
|
||||
|
||||
<?php echo $__env->make('admin.layouts.app', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH C:\Users\ASUS\Desktop\airline-agency\resources\views/admin/admins/index.blade.php ENDPATH**/ ?>
|
||||
@@ -0,0 +1,5 @@
|
||||
<?php $__env->startSection('title', __('Forbidden')); ?>
|
||||
<?php $__env->startSection('code', '403'); ?>
|
||||
<?php $__env->startSection('message', __($exception->getMessage() ?: 'Forbidden')); ?>
|
||||
|
||||
<?php echo $__env->make('errors::minimal', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH C:\Users\ASUS\Desktop\airline-agency\vendor\laravel\framework\src\Illuminate\Foundation\Exceptions/views/403.blade.php ENDPATH**/ ?>
|
||||
@@ -0,0 +1,241 @@
|
||||
<?php $__env->startSection('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="<?php echo e(route('admin.admins.index')); ?>">مدیران</a></li>
|
||||
<li class="breadcrumb-item active" aria-current="page">ویرایش مدیر</li>
|
||||
</ol>
|
||||
</nav>
|
||||
</div>
|
||||
</div>
|
||||
<?php $__env->stopSection(); ?>
|
||||
|
||||
<?php $__env->startSection('content'); ?>
|
||||
<div class="container-fluid pt-4">
|
||||
|
||||
|
||||
<div class="row">
|
||||
<?php if(session('success')): ?>
|
||||
<span style="color: green"><?php echo e(session('success')); ?></span>
|
||||
<?php endif; ?>
|
||||
<?php if(session('error')): ?>
|
||||
<span style="color: green"><?php echo e(session('error')); ?></span>
|
||||
<?php endif; ?>
|
||||
<div class="col-xl-12">
|
||||
<form action="<?php echo e(route('admin.admins.update' , $admin->id)); ?>" method="POST"
|
||||
enctype="multipart/form-data">
|
||||
<?php echo csrf_field(); ?>
|
||||
<?php echo method_field('PUT'); ?>
|
||||
<div class="card custom-card">
|
||||
<div class="card-header">
|
||||
<div class="card-title">ویرایش مدیر</div>
|
||||
</div>
|
||||
|
||||
<div class="card-body">
|
||||
<div class="row gy-3">
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">نام</label>
|
||||
<input type="text" class="form-control" name="first_name"
|
||||
value="<?php echo e(old('first_name' , $admin->first_name)); ?>"
|
||||
placeholder="نام را وارد کنید">
|
||||
<?php $__errorArgs = ['first_name'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span style="color: red"><?php echo e($message); ?></span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">نام خانوادگی</label>
|
||||
<input type="text" class="form-control" name="last_name"
|
||||
value="<?php echo e(old('last_name' , $admin->last_name)); ?>"
|
||||
placeholder="نام خانوادگی را وارد کنید">
|
||||
<?php $__errorArgs = ['last_name'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span style="color: red"><?php echo e($message); ?></span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">نام کاربری</label>
|
||||
<input type="text" class="form-control" name="username"
|
||||
value="<?php echo e(old('username' , $admin->username)); ?>" placeholder="نام کاربری">
|
||||
<?php $__errorArgs = ['username'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span style="color: red"><?php echo e($message); ?></span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">ایمیل</label>
|
||||
<input type="email" class="form-control" name="email"
|
||||
value="<?php echo e(old('email' , $admin?->email)); ?>"
|
||||
placeholder="ایمیل را وارد کنید">
|
||||
<?php $__errorArgs = ['email'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span style="color: red"><?php echo e($message); ?></span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">رمز عبور (در صورت تغییر)</label>
|
||||
<input type="password" class="form-control" name="password"
|
||||
placeholder="رمز عبور را وارد کنید">
|
||||
<?php $__errorArgs = ['password'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span style="color: red"><?php echo e($message); ?></span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
<?php if($canEditSensitiveFields): ?>
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">نوع مدیر</label>
|
||||
|
||||
<select class="form-control" name="is_super">
|
||||
<option value="1" <?php if(old('is_super', $admin->is_super ? '1' : '0') == '1'): echo 'selected'; endif; ?>>
|
||||
مدیر کل
|
||||
</option>
|
||||
|
||||
<option value="0" <?php if(old('is_super', $admin->is_super ? '1' : '0') == '0'): echo 'selected'; endif; ?>>
|
||||
عادی
|
||||
</option>
|
||||
</select>
|
||||
|
||||
<?php $__errorArgs = ['is_super'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span style="color: red"><?php echo e($message); ?></span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">وضعیت</label>
|
||||
|
||||
<select class="form-control" name="status">
|
||||
<?php $__currentLoopData = $adminStatuses; $__env->addLoop($__currentLoopData); foreach($__currentLoopData as $status): $__env->incrementLoopIndices(); $loop = $__env->getLastLoop(); ?>
|
||||
<option value="<?php echo e($status->value); ?>"
|
||||
<?php if(old('status', $admin->status->value) == $status->value): echo 'selected'; endif; ?>>
|
||||
<?php echo e($status->label()); ?>
|
||||
|
||||
</option>
|
||||
<?php endforeach; $__env->popLoop(); $loop = $__env->getLastLoop(); ?>
|
||||
</select>
|
||||
|
||||
<?php $__errorArgs = ['status'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span style="color: red"><?php echo e($message); ?></span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
|
||||
<?php elseif($showReadonlySensitiveFields): ?>
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">نوع مدیر</label>
|
||||
|
||||
<div class="form-control bg-light">
|
||||
مدیر کل
|
||||
</div>
|
||||
|
||||
<small class="text-muted">
|
||||
شما نمیتوانید نوع دسترسی خودتان را تغییر دهید.
|
||||
</small>
|
||||
</div>
|
||||
|
||||
<div class="col-xl-6">
|
||||
<label class="form-label">وضعیت</label>
|
||||
|
||||
<div class="form-control bg-light">
|
||||
<?php echo e($admin->status->label()); ?>
|
||||
|
||||
</div>
|
||||
|
||||
<small class="text-muted">
|
||||
شما نمیتوانید وضعیت حساب خودتان را تغییر دهید.
|
||||
</small>
|
||||
</div>
|
||||
<?php endif; ?>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="card-avatar">
|
||||
<div class="text-center">
|
||||
<label class="form-label d-block fw-semibold">تصویر پروفایل</label>
|
||||
<?php if($admin->avatar?->file_id): ?>
|
||||
<label class="avatar-picker" id="avatarPreview"
|
||||
style="background-image: url('<?php echo e(getFileUrl($admin->avatar->file_id)); ?>')">
|
||||
<input type="file" name="image" accept="image/*"
|
||||
onchange="previewAvatar(this)">
|
||||
</label>
|
||||
<?php else: ?>
|
||||
<label class="avatar-picker"
|
||||
id="avatarPreview"
|
||||
style="background-image: url('<?php echo e(asset('assets/admin/images/faces/DefaultAvatar.jpg')); ?>')">
|
||||
<input type="file"
|
||||
name="image"
|
||||
accept="image/*"
|
||||
onchange="previewAvatar(this)">
|
||||
</label>
|
||||
<?php endif; ?>
|
||||
</div>
|
||||
</div>
|
||||
<?php $__errorArgs = ['image'];
|
||||
$__bag = $errors->getBag($__errorArgs[1] ?? 'default');
|
||||
if ($__bag->has($__errorArgs[0])) :
|
||||
if (isset($message)) { $__messageOriginal = $message; }
|
||||
$message = $__bag->first($__errorArgs[0]); ?>
|
||||
<span style="color: red"><?php echo e($message); ?></span>
|
||||
<?php unset($message);
|
||||
if (isset($__messageOriginal)) { $message = $__messageOriginal; }
|
||||
endif;
|
||||
unset($__errorArgs, $__bag); ?>
|
||||
</div>
|
||||
|
||||
<div class="card-footer text-end">
|
||||
<button type="submit" class="btn btn-primary">ذخیره تغییرات</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
<?php $__env->stopSection(); ?>
|
||||
|
||||
<?php echo $__env->make('admin.layouts.app', array_diff_key(get_defined_vars(), ['__data' => 1, '__path' => 1]))->render(); ?><?php /**PATH C:\Users\ASUS\Desktop\airline-agency\resources\views/admin/admins/edit.blade.php ENDPATH**/ ?>
|
||||
@@ -48,6 +48,25 @@
|
||||
</a>
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
<!-- Start::slide -->
|
||||
<?php if(auth('admin')->user()?->role == \App\Enums\Admin\AdminRole::SUPERADMIN): ?>
|
||||
<li class="slide ">
|
||||
<a href="<?php echo e(route('admin.admins.index')); ?>"
|
||||
class="side-menu__item <?php echo e(activeAdminSidebar('admin.admins.index')); ?>">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
class="side-menu__icon"
|
||||
width="1em"
|
||||
height="1em"
|
||||
viewBox="0 0 24 24">
|
||||
<path fill="none" stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="1.5"
|
||||
d="M12 12a5 5 0 1 0-5-5a5 5 0 0 0 5 5Zm-7 9a7 7 0 0 1 14 0Z"/>
|
||||
</svg>
|
||||
<span class="side-menu__label">مدیریت مدیران</span>
|
||||
</a>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
<li class="slide ">
|
||||
@@ -67,22 +86,6 @@
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
<li class="slide ">
|
||||
<a href="#"
|
||||
class="side-menu__item ">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" class="side-menu__icon" width="1em"
|
||||
height="1em" viewBox="0 0 24 24">
|
||||
<path fill="none" stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="1.5"
|
||||
d="M2.5 12c0-4.478 0-6.718 1.391-8.109S7.521 2.5 12 2.5c4.478 0 6.718 0 8.109 1.391S21.5 7.521 21.5 12c0 4.478 0 6.718-1.391 8.109S16.479 21.5 12 21.5c-4.478 0-6.718 0-8.109-1.391S2.5 16.479 2.5 12M11 7h6M7 7h1m-1 5h1m-1 5h1m3-5h6m-6 5h6"
|
||||
color="currentColor"></path>
|
||||
</svg>
|
||||
<span class="side-menu__label">مدیریت سفارشات</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
<li class="slide ">
|
||||
<a href="#"
|
||||
@@ -120,26 +123,6 @@
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
<?php if(auth('admin')->user()?->role == \App\Enums\Admin\AdminRole::SUPERADMIN): ?>
|
||||
<li class="slide ">
|
||||
<a href="<?php echo e(route('admin.dashboard.index')); ?>"
|
||||
class="side-menu__item <?php echo e(activeAdminSidebar('admin.dashboard.index')); ?>">
|
||||
<svg xmlns="http://www.w3.org/2000/svg"
|
||||
class="side-menu__icon"
|
||||
width="1em"
|
||||
height="1em"
|
||||
viewBox="0 0 24 24">
|
||||
<path fill="none" stroke="currentColor" stroke-linecap="round"
|
||||
stroke-linejoin="round" stroke-width="1.5"
|
||||
d="M12 12a5 5 0 1 0-5-5a5 5 0 0 0 5 5Zm-7 9a7 7 0 0 1 14 0Z"/>
|
||||
</svg>
|
||||
<span class="side-menu__label">مدیریت مدیران</span>
|
||||
</a>
|
||||
</li>
|
||||
<?php endif; ?>
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
<li class="slide">
|
||||
<a href="#"
|
||||
@@ -207,6 +190,17 @@
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
|
||||
<!-- Start::slide -->
|
||||
<li class="slide">
|
||||
<a href="<?php echo e(route('admin.auth.logout')); ?>"
|
||||
class="side-menu__item ">
|
||||
|
||||
<i class="ri-settings-3-line side-menu__icon"></i>
|
||||
<span class="side-menu__label">خروج از حساب کاربری</span>
|
||||
</a>
|
||||
</li>
|
||||
<!-- End::slide -->
|
||||
|
||||
</ul>
|
||||
<div class="slide-right d-none" id="slide-right">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" fill="#7b8191" width="24" height="24"
|
||||
|
||||
Reference in New Issue
Block a user