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 @@
| {{ $claimMailTemplateModel->label }} | +{{ str($claimMailTemplateModel->content)->limit(50) }} | +{{ $claimMailTemplateModel->brand->name }} | ++ + {{ $claimMailTemplateModel->updated_at }} + + | ++ + | +
| + + {{ __('Aucun résultat pour les :models', ['models' => __('models.classes.claimmailtemplates')]) }} + + | +||||
| {{ str(__('validation.custom.label'))->ucfirst() }} | +{{ $claimMailTemplateModel->label }} | +
| {{ str(__('validation.attributes.content'))->ucfirst() }} | +
+ + {!! clean(nl2br($claimMailTemplateModel->content)) !!} + + |
+
| {{ __('Marque') }} | +{{ $claimMailTemplateModel->brand->name }} | +