From b63450f905ae8ae80ab4a576f650805d8ca97e35 Mon Sep 17 00:00:00 2001 From: Noah Lancien Date: Fri, 20 Oct 2023 17:11:08 +0200 Subject: [PATCH] Added stamps CRUD --- app/Http/Controllers/Bo/StampController.php | 165 ++++++++++++++++++ .../Requests/Bo/Stamps/StoreStampRequest.php | 66 +++++++ .../Requests/Bo/Stamps/UpdateStampRequest.php | 7 + app/Policies/StampPolicy.php | 109 ++++++++++++ app/Providers/RouteServiceProvider.php | 2 + database/seeders/StampSeeder.php | 8 +- resources/lang/en/models.php | 1 + resources/lang/fr/models.php | 1 + resources/views/bo/layouts/nav-list.blade.php | 9 + .../views/bo/pages/stamps/create.blade.php | 36 ++++ .../views/bo/pages/stamps/edit.blade.php | 52 ++++++ .../views/bo/pages/stamps/form.blade.php | 113 ++++++++++++ .../bo/pages/stamps/index-list.blade.php | 82 +++++++++ .../views/bo/pages/stamps/index.blade.php | 21 +++ routes/breadcrumbs-bo.php | 21 +++ routes/web-bo.php | 15 ++ 16 files changed, 704 insertions(+), 4 deletions(-) create mode 100644 app/Http/Controllers/Bo/StampController.php create mode 100644 app/Http/Requests/Bo/Stamps/StoreStampRequest.php create mode 100644 app/Http/Requests/Bo/Stamps/UpdateStampRequest.php create mode 100644 app/Policies/StampPolicy.php create mode 100644 resources/views/bo/pages/stamps/create.blade.php create mode 100644 resources/views/bo/pages/stamps/edit.blade.php create mode 100644 resources/views/bo/pages/stamps/form.blade.php create mode 100644 resources/views/bo/pages/stamps/index-list.blade.php create mode 100644 resources/views/bo/pages/stamps/index.blade.php diff --git a/app/Http/Controllers/Bo/StampController.php b/app/Http/Controllers/Bo/StampController.php new file mode 100644 index 0000000..2375487 --- /dev/null +++ b/app/Http/Controllers/Bo/StampController.php @@ -0,0 +1,165 @@ +authorizeResource(Stamp::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 $stampModels */ + $stampModels = Stamp::query(); + + /** @var string $search Search field */ + $search = $request->search; + if ($search) { + $this->searchQuery( + $stampModels, + $search, + null, + 'picture_alt', + 'picture_title', + ); + } + $searchFields = \implode(', ', [ + Str::ucfirst(trans('validation.custom.attribute_alt')), + trans('validation.custom.attribute_title'), + ]); + + /** Sort columns with a query */ + $this->sortQuery($stampModels); + + /** Custom pagination */ + $stampModels = $this->paginate($stampModels); + + return view('bo.pages.stamps.index', compact('stampModels', 'search', 'searchFields')); + } + + + /** + * Show the form for creating a new resource. + * + * @param \App\Models\Stamp $stamp + * @return \Illuminate\Contracts\View\View + */ + public function create(Stamp $stamp): \Illuminate\Contracts\View\View + { + return view('bo.pages.stamps.create', ['stampModel' => $stamp]); + } + + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Bo\Stamps\StoreStampRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(StoreStampRequest $request): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($request) { + $stamp = new Stamp(); + $stamp->fill($request->validated()); + + if ($stamp->saveOrFail()) { + return redirect()->route('bo.stamps.edit', $stamp) + ->with('success', __('crud.messages.has_been_created', [ + 'model' => Str::ucfirst(__('models.classes.stamp')) + ])); + } + return redirect()->back() + ->with('error', __('crud.messages.cannot_be_created', [ + 'model' => Str::ucfirst(__('models.classes.stamp')) + ])); + }); + } + + /** + * Show the form for editing the specified resource. + * + * @param App\Models\Stamp $stamp + * @return \Illuminate\Contracts\View\View + */ + public function edit(Stamp $stamp): \Illuminate\Contracts\View\View + { + return view('bo.pages.stamps.edit', ['stampModel' => $stamp]); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Bo\Stamps\UpdateStampRequest $request + * @param \App\Models\Stamp $stamp + * @return \Illuminate\Http\RedirectResponse + */ + public function update(UpdateStampRequest $request, Stamp $stamp): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($request, $stamp) { + $stamp->fill($request->validated()); + + if ($stamp->saveOrFail()) { + return redirect()->route('bo.stamps.edit', $stamp) + ->with('success', __('crud.messages.has_been_updated', [ + 'model' => Str::ucfirst(__('models.classes.stamp')) + ])); + } + return redirect()->route('bo.stamps.edit', $stamp) + ->with('error', __('crud.messages.cannot_be_updated', [ + 'model' => Str::ucfirst(__('models.classes.stamp')) + ])); + }); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\Stamp $stamp + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(Stamp $stamp): \Illuminate\Http\RedirectResponse + { + if ($stamp->deleteOrFail()) { + return redirect()->route('bo.stamps.index') + ->with('success', __('crud.messages.has_been_deleted', [ + 'model' => Str::ucfirst(__('models.classes.stamp')) + ])); + } + return redirect()->back() + ->with('error', __('crud.messages.cannot_be_deleted', [ + 'model' => Str::ucfirst(__('models.classes.stamp')) + ])); + } + + /** + * Duplicate the specified resource. + * + * @param \App\Models\Stamp $stamp + * @return \Illuminate\Contracts\View\View + */ + public function duplicate(Stamp $stamp): \Illuminate\Contracts\View\View + { + return $this->create($stamp->replicate()); + } +} diff --git a/app/Http/Requests/Bo/Stamps/StoreStampRequest.php b/app/Http/Requests/Bo/Stamps/StoreStampRequest.php new file mode 100644 index 0000000..9a429f4 --- /dev/null +++ b/app/Http/Requests/Bo/Stamps/StoreStampRequest.php @@ -0,0 +1,66 @@ +check(); + } + + /** + * Prepare the data for validation. + * + * @return void + */ + protected function prepareForValidation() + { + $this->merge([ + 'published' => $this->published ? true : false + ]); + $this->mergePicture('picture'); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(): array + { + $rules = [ + 'picture_alt' => 'required|string|between:3,255', + 'picture_title' => 'required|string|between:3,255', + 'published' => 'required|boolean', + ]; + return \array_merge( + $rules, + $this->pictureRules('picture', 120, 120, 120, 120, false), + ); + } + + /** + * Get custom attributes for validator errors. + * + * @return array + */ + public function attributes(): array + { + return [ + 'picture_alt' => trans('validation.custom.picture_alt'), + 'picture_title' => trans('validation.custom.picture_title'), + 'published' => trans('validation.custom.activated'), + ]; + } +} diff --git a/app/Http/Requests/Bo/Stamps/UpdateStampRequest.php b/app/Http/Requests/Bo/Stamps/UpdateStampRequest.php new file mode 100644 index 0000000..2b04273 --- /dev/null +++ b/app/Http/Requests/Bo/Stamps/UpdateStampRequest.php @@ -0,0 +1,7 @@ +create([ - 'picture' => FileStorageHelper::storeFile(new Stamp(), new \SplFileInfo( + Stamp::factory(12)->make()->each(function (Stamp $stamp) { + $stamp->picture = FileStorageHelper::storeFile($stamp, new \SplFileInfo( \resource_path('../database/factories/assets/stamps/default-picture-120x120.png') - )), - ]); + )); + }); } } diff --git a/resources/lang/en/models.php b/resources/lang/en/models.php index b7b716a..24e9e32 100644 --- a/resources/lang/en/models.php +++ b/resources/lang/en/models.php @@ -8,5 +8,6 @@ return [ 'range' => 'range', 'seasonal_section' => 'seasonal section|seasonal sections', 'news' => 'news', + 'stamp' => 'stamp', ] ]; diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index 7352a11..5c455e4 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -8,5 +8,6 @@ return [ 'range' => 'gamme', 'seasonal_section' => 'section saisonnière|sections saisonnières', 'news' => 'actualité', + 'stamp' => 'tampon', ] ]; diff --git a/resources/views/bo/layouts/nav-list.blade.php b/resources/views/bo/layouts/nav-list.blade.php index 25ab6a7..8623394 100644 --- a/resources/views/bo/layouts/nav-list.blade.php +++ b/resources/views/bo/layouts/nav-list.blade.php @@ -42,6 +42,15 @@ @endcan + @can('viewAny', \App\Models\Stamp::class) +
  • + + {{ Str::of(__('models.classes.stamp'))->plural()->title() }} + +
  • + @endcan @canAny(['isConceptor', 'viewAny'], \App\Models\User::class)