feat: edit routes

This commit is contained in:
2026-08-18 16:25:12 -07:00
parent c0c2d093e8
commit 4794d7f732
42 changed files with 2760 additions and 0 deletions
@@ -0,0 +1,141 @@
@extends('admin.layouts.app')
@section('content')
<div class="main-content app-content">
<div class="container-fluid pt-4">
<div class="row">
<div class="col-xl-12">
<form action="{{ route('admin.product.store') }}" method="POST" enctype="multipart/form-data">
@csrf
@error('general')
<span class="text-danger">{{ $message }}</span>
@enderror
<div class="card custom-card">
<div class="card-header">
<div class="card-title">
ایجاد محصول
</div>
</div>
<div class="card-body pt-0">
<div class="row gy-3">
<!-- Name -->
<div class="col-xl-6">
<label class="form-label">نام فارسی</label>
<input
type="text"
class="form-control" name="name"
placeholder="نام فارسی را وارد کنید"
value="{{ old('name') }}"
/>
@error('name')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<!-- Name -->
<div class="col-xl-6">
<label class="form-label">نام انگلیسی</label>
<input type="text" class="form-control" name="en_name"
placeholder="نام انگلیسی را وارد کنید" value="{{ old('en_name') }}">
@error('en_name')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<!-- Category -->
<div class="col-xl-6">
<label class="form-label">دسته‌ بندی</label>
<select class="form-control" name="category_id">
<option>یک دسته بندی انتخاب کنید</option>
@foreach($productCategories as $productCategory)
<option value="{{ $productCategory->id }}" >
{{ $productCategory->name }}
</option>
@endforeach
</select>
</div>
<!-- Price -->
<div class="col-xl-6">
<label class="form-label">قیمت</label>
<input type="number" class="form-control" name="price"
placeholder="قیمت را وارد کنید" value="{{old('price')}}">
@error('price')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<!-- Discount Price -->
<div class="col-xl-6">
<label class="form-label">تخفیف</label>
<input type="number" class="form-control" name="discount"
placeholder="تخفیف را وارد کنید"
value="{{ old('discount') }}">
@error('discount')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<!-- Stock -->
<div class="col-xl-6">
<label class="form-label">موجودی</label>
<input type="number" class="form-control" name="qty"
placeholder="تعداد موجودی را وارد کنید" value="{{ old('qty') }}">
@error('qty')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<!-- Description -->
<div class="col-xl-12">
<label class="form-label">توضیحات</label>
<textarea class="form-control" name="description" rows="4"
placeholder="توضیحات را وارد کنید">{{ old('description') }}</textarea>
@error('description')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<!-- Product Images -->
<div
class="image-upload-wrapper d-flex flex-wrap gap-2 px-0 pt-0 mt-3"
id="imagePreviewContainer"
style=" border-radius: 8px; padding: 10px;"
>
<label
id="uploadPlaceholder"
class="upload-placeholder"
for="imageInput"
style="cursor: pointer; width:150px; height:150px; display: flex; justify-content: center; align-items: center; border: 2px dashed #ccc; border-radius: 8px; padding: 20px; text-align: center;"
>
<div>📷<br><strong>آپلود یا کشیدن</strong></div>
<small style="color:#999;">JPG / PNG / JPEG / WEBP</small>
</label>
<input
id="imageInput"
name="images[]"
type="file"
accept=".jpg,.png,.jpeg,.webp"
multiple
style="display:none"
/>
</div>
</div>
<div class="card-footer text-end">
<button type="submit" class="btn btn-primary">ایجاد محصول</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection
@@ -0,0 +1,171 @@
@extends('admin.layouts.app')
@section('content')
<div class="main-content app-content">
<div class="container-fluid pt-4">
<div class="row">
<div class="col-xl-12">
@error('error')
<span class="text-danger">{{ $message }}</span>
@enderror
<form action="{{ route('admin.product.update', $product) }}" 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 pt-0">
<div class="row gy-3">
<!-- Name -->
<div class="col-xl-6">
<label class="form-label">نام فارسی</label>
<input
type="text"
class="form-control" name="name"
placeholder="نام فارسی را وارد کنید"
value="{{ old('name', $product->name) }} "
/>
@error('name')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<!-- Name -->
<div class="col-xl-6">
<label class="form-label">نام انگلیسی</label>
<input type="text" class="form-control" name="en_name"
placeholder="نام انگلیسی را وارد کنید"
value="{{ old('en_name', $product->en_name) }}">
@error('en_name')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<!-- Category -->
<div class="col-xl-6">
<label class="form-label">دسته‌ بندی</label>
<select class="form-control" name="category_id">
<option>یک دسته بندی انتخاب کنید</option>
@foreach($productCategories as $productCategory)
<option
value="{{ $productCategory->id }}"
@selected(old('category_id', $product->product_category_id) == $productCategory->id)
>
{{ $productCategory->name }}
</option>
@endforeach
</select>
@error('category_id')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<!-- Price -->
<div class="col-xl-6">
<label class="form-label">قیمت</label>
<input type="number" class="form-control" name="price"
placeholder="قیمت را وارد کنید"
value="{{ old('price',$product->price) }}">
@error('price')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<!-- Discount Price -->
<div class="col-xl-6">
<label class="form-label">تخفیف</label>
<input type="number" class="form-control" name="discount"
placeholder="تخفیف را وارد کنید"
value="{{ old('discount', $product->discount) }}">
@error('discount')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<!-- Stock -->
<div class="col-xl-6">
<label class="form-label">موجودی</label>
<input type="number" class="form-control" name="qty"
placeholder="تعداد موجودی را وارد کنید"
value="{{ old('qty', $product->qty) }}">
@error('qty')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
<!-- Description -->
<div class="col-xl-12">
<label class="form-label">توضیحات</label>
<textarea class="form-control"
name="description"
rows="4"
placeholder="توضیحات را وارد کنید">{{ old('description', $product->description) }}</textarea>
@error('description')
<span class="text-danger">{{ $message }}</span>
@enderror
</div>
</div>
<!-- Product Images -->
<div
class="image-upload-wrapper d-flex flex-wrap gap-2 px-0 pt-0 mt-3"
id="imagePreviewContainer"
style=" border-radius: 8px; padding: 10px;"
>
@foreach($product->productImages as $image)
<div class="position-relative" style="width:150px;height:150px;">
<img src="{{ asset('storage/'.$image->file->path) }}"
class="img-fluid rounded"
style="width:100%;height:100%;object-fit:cover;"
alt="{{ $product->name }}">
<a href="{{ route('admin.product.remove-image', [$product, $image]) }}"
class="remove-btn btn btn-sm btn-danger position-absolute top-0 end-0 delete-image">
×
</a>
</div>
@endforeach
<label
id="uploadPlaceholder"
class="upload-placeholder"
for="imageInput"
style="cursor: pointer; width:150px; height:150px; display: flex; justify-content: center; align-items: center; border: 2px dashed #ccc; border-radius: 8px; padding: 20px; text-align: center;"
>
<div>📷<br><strong>آپلود یا کشیدن</strong></div>
<small style="color:#999;">JPG / PNG / JPEG / WEBP</small>
</label>
<input
id="imageInput"
name="images[]"
type="file"
accept=".jpg,.png,.jpeg,.webp"
multiple
style="display:none"
/>
</div>
</div>
<div class="card-footer text-end">
<button type="submit" class="btn btn-primary">ذخیره تغییرات</button>
</div>
</div>
</form>
</div>
</div>
</div>
</div>
@endsection
@@ -0,0 +1,179 @@
@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="main-content app-content">
<div class="container-fluid pt-4">
<div class="row">
<div class="col-xl-12">
<div class="card custom-card">
@error('success')
<span class="text-success">{{ $message }}</span>
@enderror
<div class="card-body p-3">
<form method="GET">
<div class="d-flex align-items-center justify-content-between flex-wrap gap-3">
<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="created_at" @selected(request()->missing('sort') || request()->input('sort') == 'created_at')>
جدیدترین
</option>
<option
value="name_asc" @selected(request()->input('sort') == 'name_asc')>
نام (صعودی)
</option>
<option
value="name_desc" @selected(request()->input('sort') == 'name_desc')>
نام (نزولی)
</option>
<option
value="price_asc" @selected(request()->input('sort') == 'price_asc')>
قیمت (کم به زیاد)
</option>
<option
value="price_desc" @selected(request()->input('sort') == 'price_desc')>
قیمت (زیاد به کم)
</option>
</select>
</div>
<div class="d-flex">
<a href="{{ route('admin.product.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>
<!-- Start::row-2 -->
<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>نام</th>
<th>دسته‌ بندی</th>
<th>قیمت</th>
<th>تخفیف</th>
<th>موجودی</th>
<th>تاریخ ثبت</th>
<th>عملیات</th>
</tr>
</thead>
<tbody>
@foreach($products as $product)
<tr class="product-list">
<td>
<div class="d-flex">
<span class="avatar avatar-md avatar-square bg-light">
@if($product->defaultImage )
<img
src="{{ asset('storage/'.$product->defaultImage->file->path) }}"
class="w-100 h-100"
alt="{{ $product->name }}"
>
@else
<img
src="{{ asset('images/no-image.png') }}"
class="w-100 h-100"
alt="{{ $product->name }}"
>
@endif
</span>
<div class="ms-2">
<p class="fw-semibold mb-0 name-limit">
<a href="{{ route('admin.product.show', $product->id) }}">
{{ $product->name }} | {{ $product->en_name }}
</a>
</p>
</div>
</div>
</td>
<td>{{ $product->productCategory->name }}</td>
<td>
{{ number_format($product->price) }}
تومان
</td>
<td>
{{ $product->discount }} %
</td>
<td>
{{ $product->qty }}
</td>
<td>{{ $product->created_at->toJalali()->format('H:i Y-m-d') }}</td>
<td>
<div class="hstack gap-2 fs-15">
<a href="{{ route('admin.product.show', $product->id) }}"
class="btn btn-primary-light btn-icon btn-sm"
data-bs-toggle="tooltip" data-bs-placement="top" title="مشاهده">
<i class="ri-eye-line"></i>
</a>
<a href="{{ route('admin.product.edit', $product->id) }}"
class="btn btn-secondary-light btn-icon btn-sm"
data-bs-toggle="tooltip" data-bs-placement="top" title="ویرایش">
<i class="ti ti-pencil"></i>
</a>
<form action="{{ route('admin.product.destroy', $product->id) }}"
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>
<!-- End::row-2 -->
</div>
</div>
@endsection
@@ -0,0 +1,104 @@
@extends('admin.layouts.app')
@section('content')
<div class="main-content app-content">
<div class="container-fluid pt-4">
<div class="row">
<div class="col-xl-12">
<div class="card custom-card">
<div class="card-body">
<!-- Product Images -->
<div class="image-upload-wrapper d-flex flex-wrap gap-2 mb-4"
style="border-radius: 8px; padding: 10px;">
<div style="width:150px;height:150px;">
@if($product->defaultImage)
<img src="{{ asset('storage/'.$product->defaultImage->file->path) }}"
class="img-fluid rounded"
style="width:100%;height:100%;object-fit:cover;"
alt="{{ $product->name }}">
@else
<img src="{{ asset('images/no-image.png') }}"
class="img-fluid rounded"
alt="{{ $product->name }}">
@endif
</div>
</div>
<div class="row gy-3">
<div class="col-xl-6">
<strong>نام محصول:</strong>
<p>{{ $product->name }}</p>
</div>
<div class="col-xl-6">
<strong>دسته‌بندی:</strong>
<p>{{ $product->productCategory->name }}</p>
</div>
<div class="col-xl-6">
<strong>قیمت:</strong>
<p>
{{ number_format($product->price) }}
تومان
</p>
</div>
<div class="col-xl-6">
<strong>قیمت تخفیفی:</strong>
<p>
{{ number_format(discount($product->price, $product->discount)) }}
تومان
</p>
</div>
<div class="col-xl-6">
<strong>موجودی:</strong>
<p>{{ $product->qty }}</p>
</div>
<div class="col-xl-6">
<strong>وضعیت:</strong>
<p>
@switch($product->status)
@case(\App\Enums\ProductStatus::DISABLE)
<span class="badge bg-danger">غیر فعال</span>
@break
@case(\App\Enums\ProductStatus::DRAFT)
<span class="badge bg-warning">پیش نویس</span>
@break
@case(\App\Enums\ProductStatus::PUBLISHED)
<span class="badge bg-primary"> منتشر شده</span>
@break
@case(\App\Enums\ProductStatus::ENABLE)
<span class="badge bg-success"> فعال</span>
@break
@endswitch
</p>
</div>
<div class="col-xl-12">
<strong>توضیحات:</strong>
<p>{{ $product->description }}</p>
</div>
</div>
</div>
<div class="card-footer text-end">
<a href="{{ route('admin.product.index') }}" class="btn btn-secondary">
بازگشت به لیست محصولات
</a>
<a href="{{ route('admin.product.edit', $product->id) }}" class="btn btn-warning ms-2">ویرایش محصول</a>
</div>
</div>
</div>
</div>
</div>
</div>
@endsection