authorizeResource(Meat::class); } /** * Display a listing of the resource. * * @param \Illuminate\Http\Request $request * @return \Illuminate\Contracts\View\View */ public function index(Request $request): \Illuminate\Contracts\View\View { /** @var \Illuminate\Database\Eloquent\Builder $meatModels */ $meatModels = Meat::query()->with('submeats:id,meat_id'); /** @var string $search Search field */ $search = $request->search; if ($search) { $this->searchQuery( $meatModels, $search, null, 'label', 'description', ); } $searchFields = str(\implode(', ', [ trans('validation.custom.label'), trans('validation.attributes.description'), ]))->ucfirst(); /** Sort columns with a query */ $this->sortQuery($meatModels); /** Custom pagination */ $meatModels = $this->paginate($meatModels); return view('bo.pages.meats.index', compact('meatModels', 'search', 'searchFields')); } /** * Show a specific resource. * * @param \App\Models\Meat $meat * @return \Illuminate\Contracts\View\View */ public function show(Meat $meat): \Illuminate\Contracts\View\View { return view('bo.pages.meats.show', ['meatModel' => $meat]); } /** * Show the form for creating a new resource. * * @param \App\Models\Meat $meat * @return \Illuminate\Contracts\View\View */ public function create(Meat $meat): \Illuminate\Contracts\View\View { return view('bo.pages.meats.create', ['meatModel' => $meat]); } /** * Store a newly created resource in storage. * * @param \App\Http\Requests\Bo\Meats\StoreMeatRequest $request * @return \Illuminate\Http\RedirectResponse */ public function store(StoreMeatRequest $request): \Illuminate\Http\RedirectResponse { return DB::transaction(function () use ($request) { $meat = new Meat(); $meat->fill($request->validated()); if ($meat->saveOrFail()) { return redirect()->route('bo.meats.edit', $meat) ->with('success', __('crud.messages.has_been_created', [ 'model' => str(trans('models.classes.meat'))->ucfirst() ])); } return redirect()->back() ->with('error', __('crud.messages.cannot_be_created', [ 'model' => str(trans('models.classes.meat'))->ucfirst() ])); }); } /** * Show the form for editing the specified resource. * * @param \App\Models\Meat $meat * @return \Illuminate\Contracts\View\View */ public function edit(Meat $meat): \Illuminate\Contracts\View\View { return view('bo.pages.meats.edit', ['meatModel' => $meat]); } /** * Update the specified resource in storage. * * @param \App\Http\Requests\Bo\Meats\UpdateMeatRequest $request * @param \App\Models\Meat $meat * @return \Illuminate\Http\RedirectResponse */ public function update( UpdateMeatRequest $request, Meat $meat ): \Illuminate\Http\RedirectResponse { return DB::transaction(function () use ($request, $meat) { $meat->fill($request->validated()); if ($meat->saveOrFail()) { return redirect()->route('bo.meats.edit', $meat) ->with('success', __('crud.messages.has_been_updated', [ 'model' => str(trans('models.classes.meat'))->ucfirst() ])); } return redirect()->route('bo.meats.edit', $meat) ->with('error', __('crud.messages.cannot_be_updated', [ 'model' => str(trans('models.classes.meat'))->ucfirst() ])); }); } /** * Remove the specified resource from storage. * * @param \App\Models\Meat $meat * @return \Illuminate\Http\RedirectResponse */ public function destroy(Meat $meat): \Illuminate\Http\RedirectResponse { // We can't delete a meat with associated submeats. /** @var \Illuminate\Database\Eloquent\Collection $submeats */ $submeats = $meat->submeats; if ($submeats->isNotEmpty()) { return redirect()->back() ->with('error', __('Des sous-viandes sont associées à cette viande. Veuillez supprimer les sous-viandes concernées ou les réassocier à une autre viande.')); } /** @var array */ $previousQueries = []; \parse_str(\parse_url(url()->previous(), \PHP_URL_QUERY), $previousQueries); if ($meat->deleteOrFail()) { return redirect()->route('bo.meats.index', $previousQueries) ->with('success', __('crud.messages.has_been_deleted', [ 'model' => str(trans('models.classes.meat'))->ucfirst() ])); } return redirect()->back() ->with('error', __('crud.messages.cannot_be_deleted', [ 'model' => str(trans('models.classes.meat'))->ucfirst() ])); } /** * Duplicate the specified resource. * * @param \App\Models\Meat $meat * @return \Illuminate\Contracts\View\View */ public function duplicate(Meat $meat): \Illuminate\Contracts\View\View { return $this->create($meat->replicate()); } /** * Display the form to edit submeats order. * * @param \App\Models\Meat $meat * * @return \Illuminate\Contracts\View\View */ public function editSubmeatsOrder(Meat $meat): \Illuminate\Contracts\View\View { $submeats = $meat->submeats()->orderBy('order')->get(['id', 'label', 'meat_id']); $meats = Meat::query()->get(['id', 'label']); return view('bo.pages.submodels_order.edit', [ 'modelName' => 'meat', 'model' => $meat, 'models' => $meats, 'submodels' => $submeats ]); } /** * Updated the order of submeats related to a given range. * * @param \App\Http\Requests\Bo\Meats\UpdateSubmodelsOrderRequest $request * @param \App\Models\Meat $meat * * @return \Illuminate\Http\RedirectResponse */ public function updateSubmeatsOrder( UpdateSubmodelsOrderRequest $request, Meat $meat ): \Illuminate\Http\RedirectResponse { $oldList = $meat->submeats()->orderBy('order')->get(); $newList = (json_decode($request->get('jsonValue'), true)); return DB::transaction(function () use ($request, $meat, $oldList, $newList) { $i = 0; foreach ($newList as $newElement) { $submeatModel = Submeat::find($newElement['id']); $submeatModel->order = $oldList[$i]['order']; $submeatModel->saveOrFail(); $i++; } return redirect()->route('bo.meats.edit-submeats-order', $request->meat) ->with('success', __('crud.messages.submodels_have_been_reordered', [ 'submodelName' => str(trans('models.classes.submeat'))->plural(), 'modelLabel' => $meat->label, ])); }); } }