modelName = Product::modelName(); $this->modelPage = Product::modelPage(); } public function index(IndexProductRequest $request): Response { $this->authorize('viewAny', Product::class); /** @var \Illuminate\Database\Eloquent\Builder<\App\Models\Product> $query */ $query = Product::query(); if ($request->routeIs('back.products.trash')) { $query = $query->onlyTrashed(); } $searchValue = $request->getSearchValue(); if ($searchValue) { $this->searchQuery( $query, $searchValue, null, 'name' ); } $searchFields = \implode(', ', [ trans('validation.attributes.name'), ]); $this->sortQuery($query); $paginatedModels = $this->paginate($query); return $this->inertiaRender('back/Pages/Products/Index', [ 'paginatedModels' => CommonResource::collection($paginatedModels), 'search' => $searchValue, 'searchFields' => $searchFields, 'enumProductCategory' => ProductCategory::toArray(), 'enumTechnology' => Technology::toArray(), ]); } public function show(Product $product): RedirectResponse { $this->authorize('viewAny', Product::class); return redirect()->route('back.products.edit', $product); } public function create(Product $product): Response { $this->authorize('create', Product::class); return $this->inertiaRender('back/Pages/Products/Create', [ 'data' => CommonResource::make($product), 'enumProductCategory' => ProductCategory::toArray(), 'enumTechnology' => Technology::toArray(), 'enumBreedingMethod' => BreedingMethod::toArray(), 'enumBusiness' => Business::toArray(), 'enumProductFormat' => ProductFormat::toArray(), 'enumNutritionnalUnit' => NutritionnalUnit::toArray(), ]); } public function store(StoreProductRequest $request): RedirectResponse { $this->authorize('create', Product::class); return DB::transaction(function () use ($request) { $product = new Product(); /** @var array $data */ $data = $request->only($product->getFillable()); $product->fill($data); if ($product->saveOrFail()) { return redirect()->route('back.products.edit', $product) ->with('success', trans('uwil-backend::crud.messages.has_been_created', [ 'model' => Str::ucfirst(trans_choice('models.classes.product', 1)), ])); } return redirect()->back() ->with('error', trans('uwil-backend::crud.messages.cannot_be_created', [ 'model' => Str::ucfirst(trans_choice('models.classes.product', 1)), ])); }); } public function edit(Product $product): Response { $this->authorize('update', $product); return $this->inertiaRender('back/Pages/Products/Edit', [ 'data' => CommonResource::make($product), 'enumProductCategory' => ProductCategory::toArray(), 'enumTechnology' => Technology::toArray(), 'enumBreedingMethod' => BreedingMethod::toArray(), 'enumBusiness' => Business::toArray(), 'enumProductFormat' => ProductFormat::toArray(), 'enumNutritionnalUnit' => NutritionnalUnit::toArray(), ]); } public function update( UpdateProductRequest $request, Product $product ): RedirectResponse { $this->authorize('update', $product); return DB::transaction(function () use ($request, $product) { /** @var array $data */ $data = $request->only($product->getFillable()); $product->fill($data); if ($product->saveOrFail()) { return redirect()->route('back.products.edit', $product) ->with('success', trans('uwil-backend::crud.messages.has_been_updated', [ 'model' => Str::ucfirst(trans_choice('models.classes.product', 1)), ])); } return redirect()->route('back.products.edit', $product) ->with('error', trans('uwil-backend::crud.messages.cannot_be_updated', [ 'model' => Str::ucfirst(trans_choice('models.classes.product', 1)), ])); }); } public function duplicate(Product $product): Response { return $this->create($product->replicate()); } public function restore(string $id): RedirectResponse { $product = Product::withTrashed()->findOrFail($id); $this->authorize('restore', $product); $previousQueries = $this->getPreviousQueries(); if ($product->restore()) { return redirect()->route('back.products.trash', $previousQueries) ->with('success', trans('uwil-backend::crud.messages.has_been_restored', [ 'model' => Str::ucfirst(trans_choice('models.classes.product', 1)), ])); } return redirect()->back() ->with('error', trans('uwil-backend::crud.messages.cannot_be_restored', [ 'model' => Str::ucfirst(trans_choice('models.classes.product', 1)), ])); } public function destroy(Product $product): RedirectResponse { $this->authorize('delete', $product); $previousQueries = $this->getPreviousQueries(); if ($product->delete()) { return redirect()->route('back.products.index', $previousQueries) ->with('success', trans('uwil-backend::crud.messages.has_been_deleted', [ 'model' => Str::ucfirst(trans_choice('models.classes.product', 1)), ])); } return redirect()->back() ->with('error', trans('uwil-backend::crud.messages.cannot_be_deleted', [ 'model' => Str::ucfirst(trans_choice('models.classes.product', 1)), ])); } public function forceDestroy(string $id): RedirectResponse { $product = Product::withTrashed()->findOrFail($id); $this->authorize('forceDelete', $product); $previousQueries = $this->getPreviousQueries(); if ($product->forceDelete()) { return redirect()->route('back.products.trash', $previousQueries) ->with('success', trans('uwil-backend::crud.messages.has_been_deleted', [ 'model' => Str::ucfirst(trans_choice('models.classes.product', 1)), ])); } return redirect()->back() ->with('error', trans('uwil-backend::crud.messages.cannot_be_deleted', [ 'model' => Str::ucfirst(trans_choice('models.classes.product', 1)), ])); } /** @return array> */ private function getPreviousQueries(): array { $previousQueries = []; $previousQueryString = \parse_url($this->getPreviousUrl(), \PHP_URL_QUERY) ?? '' ?: ''; \parse_str($previousQueryString, $previousQueries); return $previousQueries; } private function getPreviousUrl(): string { return url()->previous(route('back.dashboard.index')); } }