feat: edit routes
This commit is contained in:
@@ -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
|
||||
Reference in New Issue
Block a user