diff --git a/app/Http/Controllers/Bo/ClaimMailTemplateController.php b/app/Http/Controllers/Bo/ClaimMailTemplateController.php new file mode 100644 index 0000000..74fedb4 --- /dev/null +++ b/app/Http/Controllers/Bo/ClaimMailTemplateController.php @@ -0,0 +1,174 @@ +authorizeResource(ClaimMailTemplate::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 $query */ + $query = ClaimMailTemplate::query()->when( + $request->filled('brand'), + fn($q) => $q->whereHas('brand', fn($q) => $q->where('id', $request->brand)) + ); + + if ($request->search) { + $this->searchQuery( + $query, + $request->search, + null, + 'label', + ); + } + + $this->sortQuery($query); + $searchFields = trans('validation.custom.label'); + + $claimMailTemplateModels = $this->paginate($query); + + return view('bo.pages.claim_mail_templates.index', compact('claimMailTemplateModels', 'searchFields')); + } + + /** + * Show the specified resource. + * + * @param \App\Models\ClaimMailTemplate $claim_mail_template + * @return \Illuminate\Contracts\View\View + */ + public function show(ClaimMailTemplate $claim_mail_template): \Illuminate\Contracts\View\View + { + return view('bo.pages.claim_mail_templates.show', [ + 'claimMailTemplateModel' => $claim_mail_template, + ]); + } + + /** + * Show the form for creating a new resource. + * + * @param \App\Models\ClaimMailTemplate $claim_mail_template + * @return \Illuminate\Contracts\View\View + */ + public function create(ClaimMailTemplate $claim_mail_template): \Illuminate\Contracts\View\View + { + $brandModels = Brand::query()->orderBy('name', 'ASC')->paginate($this->jsonItemPerPagination); + return view('bo.pages.claim_mail_templates.create', [ + 'claimMailTemplateModel' => $claim_mail_template, + 'brandModels' => $brandModels, + ]); + } + + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Bo\ClaimMailTemplates\ClaimMailTemplateRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(ClaimMailTemplateRequest $request): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($request) { + $claimMailTemplateModel = new ClaimMailTemplate(); + $claimMailTemplateModel->fill($request->validated()); + if ($claimMailTemplateModel->saveOrFail()) { + return redirect() + ->route('bo.claim_mail_templates.edit', $claimMailTemplateModel) + ->with('success', trans( + ':model a été créé.', + ['model' => Str::singular(trans('models.classes.claimmailtemplates'))] + )); + } + return redirect() + ->back() + ->with('error', trans( + ':model n\'a pas été créé.', + ['model' => Str::singular(trans('models.classes.claimmailtemplates'))] + )); + }); + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\ClaimMailTemplate $claim_mail_template + * @return \Illuminate\Contracts\View\View + */ + public function edit(ClaimMailTemplate $claim_mail_template): \Illuminate\Contracts\View\View + { + $brandModels = Brand::query()->orderBy('name', 'ASC')->paginate($this->jsonItemPerPagination); + return view('bo.pages.claim_mail_templates.edit', [ + 'claimMailTemplateModel' => $claim_mail_template, + 'brandModels' => $brandModels, + ]); + } + + /** + * Update a spacific resource in storage. + * + * @param \App\Http\Requests\Bo\ClaimSubjects\ClaimMailTemplateRequest $request + * @param \App\Models\ClaimMailTemplate $claim_mail_template + * @return \Illuminate\Http\RedirectResponse + */ + public function update( + ClaimMailTemplateRequest $request, + ClaimMailTemplate $claim_mail_template + ): \Illuminate\Http\RedirectResponse { + return DB::transaction(function () use ($request, $claim_mail_template) { + $claim_mail_template->fill($request->validated()); + if ($claim_mail_template->saveOrFail()) { + return redirect() + ->route('bo.claim_mail_templates.edit', $claim_mail_template) + ->with('success', trans( + ':model a été mis à jour.', + ['model' => Str::singular(trans('models.classes.claimmailtemplates'))] + )); + } + return redirect() + ->back() + ->with('error', trans( + ':model n\'a pas été mis à jour.', + ['model' => Str::singular(trans('models.classes.claimmailtemplates'))] + )); + }); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\ClaimMailTemplate $claim_mail_template + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(ClaimMailTemplate $claim_mail_template): \Illuminate\Http\RedirectResponse + { + if ($claim_mail_template->deleteOrFail()) { + return redirect()->route('bo.claim_mail_templates.index') + ->with('success', __('crud.messages.has_been_deleted', [ + 'model' => Str::of(__('models.classes.claimmailtemplates'))->singular() + ])); + } + return redirect()->back() + ->with('error', __('crud.messages.cannot_be_deleted', [ + 'model' => Str::of(__('models.classes.claimmailtemplates'))->singular() + ])); + } +} diff --git a/app/Http/Requests/Bo/ClaimMailTemplates/ClaimMailTemplateRequest.php b/app/Http/Requests/Bo/ClaimMailTemplates/ClaimMailTemplateRequest.php new file mode 100644 index 0000000..e027084 --- /dev/null +++ b/app/Http/Requests/Bo/ClaimMailTemplates/ClaimMailTemplateRequest.php @@ -0,0 +1,46 @@ +check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(): array + { + return [ + 'brand_id' => 'required|exists:brands,id', + 'label' => 'required|string|min:3|max:255', + 'content' => 'required|string|min:3|max:500', + ]; + } + + /** + * Get custom attributes for validator errors. + * + * @return array + */ + public function attributes(): array + { + return [ + 'brand_id' => trans('models.classes.brands'), + 'label' => trans('validation.custom.label'), + 'content' => trans('validation.attributes.content'), + ]; + } +} diff --git a/app/Policies/ClaimMailTemplatePolicy.php b/app/Policies/ClaimMailTemplatePolicy.php new file mode 100644 index 0000000..e1bb49a --- /dev/null +++ b/app/Policies/ClaimMailTemplatePolicy.php @@ -0,0 +1,109 @@ +checkOnlyMinAdminOrInUserBrands($authUser, $claim_mail_template); + } + + /** + * Create a claim subject. + * + * @param \App\Models\User $authUser + * @return boolean + */ + public function create(User $authUser): bool + { + return UserStaticRules::atLeastRole($authUser, RoleEnum::marketing); + } + + /** + * Store a claim subject. + * + * @param \App\Models\User $authUser + * @return boolean + */ + public function store(User $authUser): bool + { + return UserStaticRules::atLeastRole($authUser, RoleEnum::marketing); + } + + /** + * Edit a claim subject. + * + * @param \App\Models\User $authUser + * @param \App\Models\ClaimMailTemplate $claim_mail_template + * @return boolean + */ + public function edit(User $authUser, ClaimMailTemplate $claim_mail_template): bool + { + return $this->checkOnlyMinAdminOrInUserBrands($authUser, $claim_mail_template); + } + + /** + * Update a claim subject. + * + * @param \App\Models\User $authUser + * @param \App\Models\ClaimMailTemplate $claim_mail_template + * @return boolean + */ + public function update(User $authUser, ClaimMailTemplate $claim_mail_template): bool + { + return $this->checkOnlyMinAdminOrInUserBrands($authUser, $claim_mail_template); + } + + /** + * Delete a claim subject. + * + * @param \App\Models\User $authUser + * @param \App\Models\ClaimMailTemplate $claim_mail_template + * @return boolean + */ + public function delete(User $authUser, ClaimMailTemplate $claim_mail_template): bool + { + return $this->checkOnlyMinAdminOrInUserBrands($authUser, $claim_mail_template); + } + + /** + * Check if the user an access a specific resource. + * + * @param \App\Models\User $authUser + * @param \App\Models\ClaimMailTemplate $claim_mail_template + * @return boolean + */ + private function checkOnlyMinAdminOrInUserBrands(User $authUser, ClaimMailTemplate $claim_mail_template): bool + { + $userBrandModelKeys = $authUser->brands->pluck('id')->toArray(); + $claimMailTemplateModelKey = $claim_mail_template->brand->getKey(); + return UserStaticRules::atLeastRole($authUser, RoleEnum::admin) || ( + UserStaticRules::atLeastRole($authUser, RoleEnum::marketing) + && \in_array($claimMailTemplateModelKey, $userBrandModelKeys) + ); + } +} diff --git a/resources/ts/bo/components/InputTextAutoComponent.vue b/resources/ts/bo/components/InputTextAutoComponent.vue index 3fe3c3d..9d53aca 100644 --- a/resources/ts/bo/components/InputTextAutoComponent.vue +++ b/resources/ts/bo/components/InputTextAutoComponent.vue @@ -1,109 +1,102 @@