diff --git a/app/Http/Controllers/admin/product/ProductCategoryController.php b/app/Http/Controllers/admin/product/ProductCategoryController.php index b8f1846..88446c2 100644 --- a/app/Http/Controllers/admin/product/ProductCategoryController.php +++ b/app/Http/Controllers/admin/product/ProductCategoryController.php @@ -59,6 +59,23 @@ class ProductCategoryController extends Controller return redirect()->route('products.group.index')->with('success', 'Delete Group Success'); } + public function trash() + { + return view('administrator.pages.product.categories.trash'); + } + + public function restore(int $id) + { + $this->productCategoryService->restore($id); + return redirect()->route('products.group.trash')->with('success', 'Restore Group Success'); + } + + public function forceDelete(int $id) + { + $this->productCategoryService->forceDelete($id); + return redirect()->route('products.group.trash')->with('success', 'Force Delete Group Success'); + } + public function datatable(Request $request) { $query = $this->productCategoryRepository->filter( @@ -72,7 +89,10 @@ class ProductCategoryController extends Controller return DataTables::eloquent($query) ->addColumn( 'action', - function ($d) { + function ($d) use ($request) { + if ($request->has('trashed') && $request->trashed == 1) { + return view('administrator.pages.product.categories.datatable.action_trash', ['row' => $d])->render(); + } return view('administrator.pages.product.categories.datatable.action', ['row' => $d])->render(); } ) diff --git a/app/Http/Services/Admin/ProductCategory/ProductCategoryService.php b/app/Http/Services/Admin/ProductCategory/ProductCategoryService.php index fd3f615..ebbf67f 100644 --- a/app/Http/Services/Admin/ProductCategory/ProductCategoryService.php +++ b/app/Http/Services/Admin/ProductCategory/ProductCategoryService.php @@ -29,4 +29,14 @@ class ProductCategoryService implements ProductCategoryServiceInterface { return $this->repository->delete($id); } + + public function restore(int $id) + { + return $this->repository->restore($id); + } + + public function forceDelete(int $id) + { + return $this->repository->forceDelete($id); + } } \ No newline at end of file diff --git a/app/Http/Services/Admin/ProductCategory/ProductCategoryServiceInterface.php b/app/Http/Services/Admin/ProductCategory/ProductCategoryServiceInterface.php index d96b0f2..e513ab9 100644 --- a/app/Http/Services/Admin/ProductCategory/ProductCategoryServiceInterface.php +++ b/app/Http/Services/Admin/ProductCategory/ProductCategoryServiceInterface.php @@ -6,4 +6,8 @@ interface ProductCategoryServiceInterface { public function store(array $data); public function update(int $id, array $data); public function delete(int $id); + + public function restore(int $id); + + public function forceDelete(int $id); } \ No newline at end of file diff --git a/app/Repositories/Admin/ProductCategory/ProductCategoryRepository.php b/app/Repositories/Admin/ProductCategory/ProductCategoryRepository.php index a0c45e2..e42b8d8 100644 --- a/app/Repositories/Admin/ProductCategory/ProductCategoryRepository.php +++ b/app/Repositories/Admin/ProductCategory/ProductCategoryRepository.php @@ -40,6 +40,10 @@ class ProductCategoryRepository extends BaseRepository implements ProductCategor ->select($select) ->with($relationships); + if (!empty($data['trashed'])) { + $query->onlyTrashed(); + } + // if (!empty($data['vcenter_id'])) { // $query->where('vcenter_id', $data['vcenter_id']); // } @@ -60,4 +64,21 @@ class ProductCategoryRepository extends BaseRepository implements ProductCategor return $query->get(); } + public function restore(int $id) + { + $item = $this->model->withTrashed()->find($id); + if ($item) { + return $item->restore(); + } + return false; + } + + public function forceDelete(int $id) + { + $item = $this->model->withTrashed()->find($id); + if ($item) { + return $item->forceDelete(); + } + return false; + } } diff --git a/app/Repositories/Admin/ProductCategory/ProductCategoryRepositoryInterface.php b/app/Repositories/Admin/ProductCategory/ProductCategoryRepositoryInterface.php index e5d00a1..c04275d 100644 --- a/app/Repositories/Admin/ProductCategory/ProductCategoryRepositoryInterface.php +++ b/app/Repositories/Admin/ProductCategory/ProductCategoryRepositoryInterface.php @@ -13,4 +13,8 @@ interface ProductCategoryRepositoryInterface extends BaseRepositoryInterface array $select = ['*'], bool $returnQuery = false ); + + public function restore(int $id); + + public function forceDelete(int $id); } diff --git a/resources/views/administrator/pages/block/product/btn.blade.php b/resources/views/administrator/pages/block/product/btn.blade.php index a65a43c..20f4609 100644 --- a/resources/views/administrator/pages/block/product/btn.blade.php +++ b/resources/views/administrator/pages/block/product/btn.blade.php @@ -1,6 +1,9 @@ @if(auth()->guard('admins')->user()->can("manager product")) - Add - Product - Add - Group + Thêm sản + phẩm + Thêm + nhóm + SP + Thùng + rác @endif \ No newline at end of file diff --git a/resources/views/administrator/pages/product/categories/datatable/action.blade.php b/resources/views/administrator/pages/product/categories/datatable/action.blade.php index 270a9ad..2ff0c12 100644 --- a/resources/views/administrator/pages/product/categories/datatable/action.blade.php +++ b/resources/views/administrator/pages/product/categories/datatable/action.blade.php @@ -1,6 +1,8 @@
- Edit - Delete + Edit + Delete
@include('administrator.pages.product.categories.datatable.modal', [ diff --git a/resources/views/administrator/pages/product/categories/datatable/action_trash.blade.php b/resources/views/administrator/pages/product/categories/datatable/action_trash.blade.php new file mode 100644 index 0000000..0abd20f --- /dev/null +++ b/resources/views/administrator/pages/product/categories/datatable/action_trash.blade.php @@ -0,0 +1,12 @@ +
+ Restore + Force Delete +
+ +@include('administrator.pages.product.categories.datatable.modal', [ + 'deleteRoute' => 'products.group.forceDelete', + 'itemLabel' => 'Product Group', + 'itemId' => $row->id, + 'itemName' => $row->name, + 'modalId' => 'forceDeleteModal-' . $row->id +]) diff --git a/resources/views/administrator/pages/product/categories/trash.blade.php b/resources/views/administrator/pages/product/categories/trash.blade.php new file mode 100644 index 0000000..ee6dcf3 --- /dev/null +++ b/resources/views/administrator/pages/product/categories/trash.blade.php @@ -0,0 +1,98 @@ +@extends('administrator.layout.master') +@push('plugin-styles') + @foreach (config('assets.datatable.css') as $datatable) + + @endforeach +@endpush + +@section('breadcrumb') + @php + $breadcrumbItems = [ + ['label' => 'Product'], + ['label' => 'Product Group', 'route' => route('products.group.index')], + ['label' => 'Trash List', 'active' => true] + ]; + @endphp + +@endsection +@section('tab') + @php + $tabs = [ + [ + 'label' => 'Product', + 'route' => 'products.index', + 'icon' => 'server', + ], + [ + 'label' => 'Product Group', + 'route' => 'products.group.index', + 'icon' => 'server', + ], + ]; + @endphp + +@endsection +@section('content') + @if (auth()->guard('admins')->user()->can('manager product')) +
+
+ Back to List +
+
+ +
+ +
+ @else +
+
Access Denied - You are not assigned to any Product + management department
+
+ @endif +@endsection +@push('plugin-scripts') + @foreach (config('assets.datatable.js') as $datatable) + + @endforeach +@endpush +@push('custom-scripts') + +@endpush diff --git a/resources/views/components/button-c-r-m.blade.php b/resources/views/components/button-c-r-m.blade.php index 343c41b..2979066 100644 --- a/resources/views/components/button-c-r-m.blade.php +++ b/resources/views/components/button-c-r-m.blade.php @@ -20,46 +20,53 @@ $tag = 'a'; } - $baseClasses = 'd-inline-flex gap-2 align-items-center justify-content-center text-white px-3 py-2 rounded-3 transition-all border-0'; - $variants = [ - 'primary' => 'bg-primary', - 'secondary' => 'bg-secondary', - 'outline' => 'bg-outline', - 'ghost' => 'bg-ghost', - 'link' => 'bg-link', - 'danger' => 'bg-danger', - 'destructive' => 'bg-destructive', - 'success' => 'bg-success', - 'warning' => 'bg-warning', - 'info' => 'bg-info' + 'primary' => 'btn-primary', + 'secondary' => 'btn-secondary', + 'outline' => 'btn-outline-primary', + 'outline-primary' => 'btn-outline-primary', + 'outline-secondary' => 'btn-outline-secondary', + 'outline-success' => 'btn-outline-success', + 'outline-danger' => 'btn-outline-danger', + 'outline-warning' => 'btn-outline-warning', + 'outline-info' => 'btn-outline-info', + 'ghost' => 'btn-light', + 'link' => 'btn-link', + 'danger' => 'btn-danger', + 'destructive' => 'btn-danger', + 'success' => 'btn-success', + 'warning' => 'btn-warning', + 'info' => 'btn-info', + 'light' => 'btn-light', + 'dark' => 'btn-dark', ]; $sizes = [ - 'default' => 'h-10', - 'sm' => 'h-6', - 'lg' => 'h-12', - 'icon' => 'h-10', + 'default' => '', + 'sm' => 'btn-sm', + 'lg' => 'btn-lg', + 'xs' => 'btn-xs', + 'icon' => 'btn-icon', ]; $variantClass = $variants[$variant ?? 'primary'] ?? $variants['primary']; - $sizeClass = $sizes[$size ?? 'md'] ?? $sizes['default']; + $sizeClass = $sizes[$size ?? 'default'] ?? ''; - $classes = "{$baseClasses} {$variantClass} {$sizeClass}"; + $classes = "btn {$variantClass} {$sizeClass}"; @endphp - - @if($tag === 'a') - merge(['class' => $classes]) }}> - @if($icon) - - @endif - {{ $slot }} - - @else - - @endif \ No newline at end of file + + @else + + @endif \ No newline at end of file diff --git a/routes/admin.php b/routes/admin.php index 17d6541..8103ab8 100644 --- a/routes/admin.php +++ b/routes/admin.php @@ -143,6 +143,9 @@ Route::prefix('administrator')->group(function () { Route::put('view-group-item/{id}', 'update')->name('update'); Route::delete('remove-group-item/{id}', 'destroy')->name('destroy'); Route::get('datatable', 'datatable')->name('datatable'); + Route::get('trash', 'trash')->name('trash'); + Route::get('restore/{id}', 'restore')->name('restore'); + Route::delete('force-delete/{id}', 'forceDelete')->name('forceDelete'); }); });