feat: ✨ add claim subjects crud

This commit is contained in:
Alexis Gousseau 2025-08-04 10:04:48 +02:00
parent ced124b60e
commit 7df0fe4634
No known key found for this signature in database
GPG key ID: 4A614CB3DBBA2406
19 changed files with 692 additions and 28 deletions

View file

@ -0,0 +1,172 @@
<?php
namespace App\Http\Controllers\Bo;
use App\Http\Controllers\Controller;
use App\Http\Requests\Bo\ClaimSubjects\ClaimSubjectRequest;
use App\Models\Brand;
use App\Models\ClaimSubject;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Str;
class ClaimSubjectController extends Controller
{
/**
* Create the controller instance.
*/
public function __construct()
{
$this->authorizeResource(ClaimSubject::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 = ClaimSubject::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');
$claimSubjectModels = $this->paginate($query);
return view('bo.pages.claim_subjects.index', compact('claimSubjectModels', 'searchFields'));
}
/**
* Show the specified resource.
*
* @param \App\Models\ClaimSubject $claim_subject
* @return \Illuminate\Contracts\View\View
*/
public function show(ClaimSubject $claim_subject): \Illuminate\Contracts\View\View
{
return view('bo.pages.claim_subjects.show', [
'claimSubjectModel' => $claim_subject
]);
}
/**
* Show the form for creating a new resource.
*
* @param \App\Models\ClaimSubject $claim_subject
* @return \Illuminate\Contracts\View\View
*/
public function create(ClaimSubject $claim_subject): \Illuminate\Contracts\View\View
{
$brandModels = Brand::query()->orderBy('name', 'ASC')->paginate($this->jsonItemPerPagination);
return view('bo.pages.claim_subjects.create', [
'claimSubjectModel' => $claim_subject,
'brandModels' => $brandModels,
]);
}
/**
* Store a newly created resource in storage.
*
* @param \App\Http\Requests\Bo\ClaimSubjects\ClaimSubjectRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(ClaimSubjectRequest $request): \Illuminate\Http\RedirectResponse
{
return DB::transaction(function () use ($request) {
$claimSubjectModel = new ClaimSubject();
$claimSubjectModel->fill($request->validated());
if ($claimSubjectModel->saveOrFail()) {
return redirect()
->route('bo.claim_subjects.edit', $claimSubjectModel)
->with('success', trans(
':model a été créé.',
['model' => Str::singular(trans('models.classes.claimsubjects'))]
));
}
return redirect()
->back()
->with('error', trans(
':model n\'a pas été créé.',
['model' => Str::singular(trans('models.classes.claimsubjects'))]
));
});
}
/**
* Show the form for editing the specified resource.
*
* @param \App\Models\ClaimSubject $claim_subject
* @return \Illuminate\Contracts\View\View
*/
public function edit(ClaimSubject $claim_subject): \Illuminate\Contracts\View\View
{
$brandModels = Brand::query()->orderBy('name', 'ASC')->paginate($this->jsonItemPerPagination);
return view('bo.pages.claim_subjects.edit', [
'claimSubjectModel' => $claim_subject,
'brandModels' => $brandModels,
]);
}
/**
* Update a spacific resource in storage.
*
* @param \App\Http\Requests\Bo\ClaimSubjects\ClaimSubjectRequest $request
* @param \App\Models\ClaimSubject $claim_subject
* @return \Illuminate\Http\RedirectResponse
*/
public function update(ClaimSubjectRequest $request, ClaimSubject $claim_subject): \Illuminate\Http\RedirectResponse
{
return DB::transaction(function () use ($request, $claim_subject) {
$claim_subject->fill($request->validated());
if ($claim_subject->saveOrFail()) {
return redirect()
->route('bo.claim_subjects.edit', $claim_subject)
->with('success', trans(
':model a été mis à jour.',
['model' => Str::singular(trans('models.classes.claimsubjects'))]
));
}
return redirect()
->back()
->with('error', trans(
':model n\'a pas été mis à jour.',
['model' => Str::singular(trans('models.classes.claimsubjects'))]
));
});
}
/**
* Remove the specified resource from storage.
*
* @param \App\Models\ClaimSubject $claim_subject
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy(ClaimSubject $claim_subject): \Illuminate\Http\RedirectResponse
{
if ($claim_subject->deleteOrFail()) {
return redirect()->route('bo.claim_subjects.index')
->with('success', __('crud.messages.has_been_deleted', [
'model' => Str::of(__('models.classes.claimsubjects'))->singular()
]));
}
return redirect()->back()
->with('error', __('crud.messages.cannot_be_deleted', [
'model' => Str::of(__('models.classes.claimsubjects'))->singular()
]));
}
}

View file

@ -0,0 +1,44 @@
<?php
namespace App\Http\Requests\Bo\ClaimSubjects;
use Illuminate\Foundation\Http\FormRequest;
class ClaimSubjectRequest extends FormRequest
{
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function authorize(): bool
{
return auth('backend')->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',
];
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes(): array
{
return [
'brand_id' => trans('models.classes.brands'),
'label' => trans('validation.attributes.label'),
];
}
}

View file

@ -45,7 +45,7 @@ class UpdateClaimRequest extends FormRequest
{
return [
'brand_id' => trans('models.classes.brands'),
'subject_id' => trans('models.classes.claim_subjects'),
'subject_id' => trans('models.classes.claimsubjects'),
'type' => trans('validation.custom.type'),
'status' => trans('validation.custom.status'),
'response_type' => trans('validation.custom.response_type'),

View file

@ -97,7 +97,7 @@ class Claim extends Model
event(new ClaimModelChanged(
$model->load('claimSubject'),
'claimSubject',
trans('models.classes.claim_subjects'),
trans('models.classes.claimsubjects'),
$user,
));
}

View file

@ -0,0 +1,87 @@
<?php
namespace App\Policies;
use App\Enums\Users\RoleEnum;
use App\Models\User;
use App\Policies\Rules\UserStaticRules;
class ClaimSubjectPolicy
{
/**
* ViewAny a claim subject.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function viewAny(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* View a claim subject.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function view(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Create a claim subject.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function create(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Store a claim subject.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function store(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Edit a claim subject.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function edit(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Update a claim subject.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function update(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
/**
* Delete a claim subject.
*
* @param \App\Models\User $authUser
* @return boolean
*/
public function delete(User $authUser): bool
{
return UserStaticRules::atLeastRole($authUser, RoleEnum::admin);
}
}

View file

@ -2,17 +2,17 @@
return [
'classes' => [
'user' => 'user',
'activity_log' => 'activity log|activity logs',
'services' => 'Services',
'brands' => 'Brands',
'customers' => 'Customers',
'questions' => 'Questions',
'answers' => 'Answers',
'singleoptins' => 'Single Opt-ins',
'claims' => 'Claims',
'claim_subjects' => 'Subjects',
'claim_mail_templates' => 'Templates',
'user' => 'user',
'activity_log' => 'activity log|activity logs',
'services' => 'Services',
'brands' => 'Brands',
'customers' => 'Customers',
'questions' => 'Questions',
'answers' => 'Answers',
'singleoptins' => 'Single Opt-ins',
'claims' => 'Claims',
'claimsubjects' => 'Subjects',
'claimmailtemplates' => 'Templates',
],
'common' => [
'title' => 'Title',

View file

@ -232,5 +232,6 @@ return [
'reference' => 'reference',
'type' => 'type',
'status' => 'status',
'label' => 'label',
],
];

View file

@ -2,17 +2,17 @@
return [
'classes' => [
'user' => 'utilisateur',
'activity_log' => 'journal d\'activité|journaux d\'activité',
'services' => 'Services',
'brands' => 'Marques',
'questions' => 'Questions',
'answers' => 'Réponses',
'customers' => 'Clients',
'singleoptins' => 'Opt-ins uniques',
'claims' => 'Réclamations',
'claim_subjects' => 'Sujets',
'claim_mail_templates' => 'Modèles',
'user' => 'utilisateur',
'activity_log' => 'journal d\'activité|journaux d\'activité',
'services' => 'Services',
'brands' => 'Marques',
'questions' => 'Questions',
'answers' => 'Réponses',
'customers' => 'Clients',
'singleoptins' => 'Opt-ins uniques',
'claims' => 'Réclamations',
'claimsubjects' => 'Sujets',
'claimmailtemplates' => 'Modèles',
],
'common' => [
'title' => 'Titre',

View file

@ -232,5 +232,6 @@ return [
'reference' => 'référence',
'type' => 'type',
'status' => 'status',
'label' => 'label',
],
];

View file

@ -60,12 +60,12 @@
for="brand"
class="col-form-label"
>
<b>{{ trans.methods.__('Modifier la :model', { model: trans.methods.__("models.classes.claim_subjects") }) }} *</b>
<b>{{ trans.methods.__('Modifier la :model', { model: trans.methods.__("models.classes.claimsubjects") }) }} *</b>
</label>
<SearchBelongsToDropdown
id="subject"
name="subject_id"
:label="trans.methods.__('Modifier la :model', { model: trans.methods.__('models.classes.claim_subjects') })"
:label="trans.methods.__('Modifier la :model', { model: trans.methods.__('models.classes.claimsubjects') })"
:model="claimModel"
targetclass="App\Models\ClaimSubject"
:modellistpaginate="claimSubjectModels"
@ -76,7 +76,7 @@
:multiple="false"
:required="true"
:disabled="loading || isTreatedClaim"
:placeholder="trans.methods.__('Rechercher une :model', { model: trans.methods.__('models.classes.claim_subjects') })"
:placeholder="trans.methods.__('Rechercher une :model', { model: trans.methods.__('models.classes.claimsubjects') })"
@selected-value-changed="setSelectedSubject"
/>
<small class="text-danger m-0">
@ -85,7 +85,7 @@
</td>
<template v-else>
<td class="align-middle fw-bold">
{{ trans.methods.__("models.classes.claim_subjects") }}
{{ trans.methods.__("models.classes.claimsubjects") }}
</td>
<td class="align-middle">
{{ selectParameters.subject?.label }}

View file

@ -10,6 +10,7 @@
\App\Models\Service::class,
\App\Models\SingleOptin::class,
\App\Models\Claim::class,
\App\Models\ClaimSubject::class,
];
@endphp
@foreach ($modelsClasses as $crudModel)

View file

@ -0,0 +1,46 @@
@extends('bo.layout')
@section('title', sprintf('%s - %s', __('models.classes.claimsubjects'), str(__('création'))->ucfirst()))
@section('description', __('Création d\'une :model', ['model' => __('models.classes.claimsubjects')]))
@section('metaIndex', 'noindex,nofollow')
@section('content')
<div class="card border-0">
<div class="card-header">
<div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap">
<div class="d-flex align-items-start flex-row">
@can('viewAny', \App\Models\ClaimSubject::class)
<a class="btn btn-primary text-decoration-none me-2" data-bs-tooltip="tooltip" data-bs-placement="top"
data-bs-tooltip="tooltip" href="{{ route('bo.claim_subjects.index') }}"
title="{{ __('Retourner sur la liste des :model', ['model' => __('models.classes.claimsubjects')]) }}">
<i class="fa-solid fa-arrow-left"></i>
</a>
@endcan
@include('modules.breadcrumbs.breadcrumb-body')
</div>
@can('create', $claimSubjectModel)
<div class="col-12 col-md-4 d-flex justify-content-center justify-content-md-end align-items-center">
<button class="btn btn-primary" id="formSubmitClone" data-bs-tooltip="tooltip" type="button"
title="{{ __('Sauvegarder cette :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">
{{ __('Sauvegarder') }}
</button>
</div>
@endcan
</div>
</div>
<div class="card-body">
<form action="{{ route('bo.claim_subjects.store') }}" method="POST">
@csrf
@include('bo.pages.claim_subjects.form')
<div class="row">
<div class="col text-center">
@can('create', $claimSubjectModel)
<button class="btn btn-primary" id="formSubmit" data-bs-tooltip="tooltip" type="submit"
title="{{ __('Sauvegarder cette :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">{{ __('Sauvegarder') }}</button>
@endcan
</div>
</div>
</form>
</div>
</div>
@endsection

View file

@ -0,0 +1,65 @@
@extends('bo.layout')
@section('title', sprintf('%s - %s', __('models.classes.claimsubjects'), str(__('édition'))->ucfirst()))
@section('description', __('Édition d\'une :model', ['model' => __('models.classes.claimsubjects')]))
@section('metaIndex', 'noindex,nofollow')
@section('content')
<div class="card border-0">
<div class="card-header">
<div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap">
<div class="d-flex align-items-start flex-row">
@can('viewAny', \App\Models\ClaimSubject::class)
<a class="btn btn-primary text-decoration-none me-2" data-bs-tooltip="tooltip" data-bs-placement="top"
data-bs-tooltip="tooltip" href="{{ route('bo.claim_subjects.index') }}"
title="{{ __('Retourner sur la liste des :model', ['model' => __('models.classes.claimsubjects')]) }}">
<i class="fa-solid fa-arrow-left"></i>
</a>
@endcan
@include('modules.breadcrumbs.breadcrumb-body')
</div>
<form class="btn-group" id="dataDelete"
action="{{ route('bo.claim_subjects.destroy', $claimSubjectModel) }}" method="POST">
@can('view', $claimSubjectModel)
<a class="btn btn-warning" data-bs-tooltip="tooltip"
href="{{ route('bo.claim_subjects.show', $claimSubjectModel->getKey()) }}"
title="{{ __('Voir ce :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">
<i class="fa-solid fa-eye"></i>
</a>
@endcan
@can('update', $claimSubjectModel)
<button class="btn btn-primary" id="formSubmitClone" data-bs-tooltip="tooltip" type="button"
title="{{ __('Sauvegarder ce :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">
{{ __('Sauvegarder') }}
</button>
@endcan
@can('delete', $claimSubjectModel)
@csrf
@method('DELETE')
<button class="btn btn-danger" data-bs-tooltip="tooltip"
title="{{ __('Supprimer ce :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">
<i class="fa-solid fa-trash"></i>
</button>
@endcan
</form>
</div>
</div>
<div class="card-body">
<form action="{{ route('bo.claim_subjects.update', $claimSubjectModel->getKey()) }}" method="POST">
@csrf
@method('PUT')
@include('bo.pages.claim_subjects.form')
<div class="row">
<div class="col text-center">
@can('update', $claimSubjectModel)
<button class="btn btn-primary" id="formSubmit" data-bs-tooltip="tooltip" type="submit"
title="{{ __('Sauvegarder ce :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">
{{ __('Sauvegarder') }}
</button>
@endcan
</div>
</div>
</form>
</div>
</div>
@endsection

View file

@ -0,0 +1,67 @@
<div class="row">
{{-- BRAND --}}
<div class="col-12 col-md-6 pb-3">
<fieldset class="h-100 border p-3">
<legend>{{ __('Marque') }}</legend>
<div class="row">
@include('bo.partials.inputs.search-belongs-to-dropdown', [
'id' => 'claimSubjectBrand',
'label' => __('Modifier la :model associée', [
'model' => str(__('models.classes.brands'))->singular(),
]),
'name' => 'brand_id',
'relation' => 'brand',
'model' => $claimSubjectModel,
'targetClass' => 'App\Models\Brand',
'modelListPaginate' => $brandModels ?? [],
'constructedRoute' => route('bo.brands.json-paginate'),
'fieldName' => 'name',
'multiple' => false,
'required' => true,
'disabled' => false,
'placeholder' => __('Rechercher une :model', [
'model' => str(__('models.classes.brands'))->singular(),
]),
'helper' => __('Sélectionner une :model qui sera associée parmis la liste.', [
'model' => str(__('models.classes.brands'))->singular(),
]),
])
</div>
</fieldset>
</div>
{{-- LABEL --}}
<div class="col-12 col-md-6 mb-3">
<fieldset class="h-100 border p-3">
<legend>{{ str(__('validation.custom.label'))->ucfirst() }}</legend>
<div class="row">
<div class="col-12 mb-3">
@include('bo.partials.inputs.varchar', [
'id' => 'claimSubjectLabel',
'label' => __('Nom du :model', [
'model' => str(__('models.classes.claimsubjects'))->singular(),
]),
'hasWordCounter' => true,
'name' => 'label',
'required' => true,
'model' => $claimSubjectModel ?? null,
'helper' => __('Doit décrire précisément le produit (3 caractères minimum, 255 maximum).'),
])
</div>
</div>
</fieldset>
</div>
</div>
@push('scripts')
<script @if (isset($nonce)) nonce="{{ $nonce }}" @endif>
document.addEventListener("DOMContentLoaded", () => {
// Submit button clone.
const submit = document.getElementById('formSubmit')
submitClone = document.getElementById('formSubmitClone');
submitClone.addEventListener('click', (event) => {
event.preventDefault();
submit.click();
})
});
</script>
@endpush

View file

@ -0,0 +1,61 @@
<table class="table table-hover table-fix-action m-0">
<thead class="border-top-0 border-start-0 border-end-0 border border-2">
@include('bo.modules.table-col-sorter', [
'cols' => [
'label' => str(__('validation.custom.label'))->ucfirst(),
'brand_id' => str(__('models.classes.brands'))->singular()->ucfirst(),
'updated_at' => str(__('validation.attributes.updated_at'))->ucfirst(),
],
])
</thead>
<tbody>
@if ($claimSubjectModels->count())
@foreach ($claimSubjectModels as $claimSubjectModel)
<tr>
<td class="text-center align-middle">{{ $claimSubjectModel->label }}</td>
<td class="text-center align-middle">{{ $claimSubjectModel->brand->name }}</td>
<td class="text-center align-middle">
<span class="badge bg-warning text-bg-warning text-wrap">
{{ $claimSubjectModel->updated_at }}
</span>
</td>
<td class="text-end align-middle">
<form class="btn-group" id="dataDelete"
action="{{ route('bo.claim_subjects.destroy', $claimSubjectModel) }}" method="POST">
@can('view', $claimSubjectModel)
<a class="btn btn-sm btn-warning" data-bs-tooltip="tooltip"
href="{{ route('bo.claim_subjects.show', $claimSubjectModel->getKey()) }}"
title="{{ __('Voir ce :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">
<i class="fa-solid fa-eye"></i>
</a>
@endcan
@can('update', $claimSubjectModel)
<a class="btn btn-sm btn-primary" data-bs-tooltip="tooltip"
href="{{ route('bo.claim_subjects.edit', $claimSubjectModel->getKey()) }}"
title="{{ __('Modifier ce :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">
<i class="fa-solid fa-pencil"></i>
</a>
@endcan
@can('delete', $claimSubjectModel)
@csrf
@method('DELETE')
<button class="btn btn-sm btn-danger" data-bs-tooltip="tooltip"
title="{{ __('Supprimer ce :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">
<i class="fa-solid fa-trash"></i>
</button>
@endcan
</form>
</td>
</tr>
@endforeach
@else
<tr>
<td class="text-center" colspan="5">
<span class="h3">
{{ __('Aucun résultat pour les :models', ['models' => __('models.classes.claimsubjects')]) }}
</span>
</td>
</tr>
@endif
</tbody>
</table>

View file

@ -0,0 +1,41 @@
@extends('bo.layout')
@section('title', sprintf('%s - %s', __('models.classes.claimsubjects'), str(__('liste'))->ucfirst()))
@section('description', __('Listage de toutes les :model', ['model' => __('models.classes.claimsubjects')]))
@section('metaIndex', 'noindex,nofollow')
@section('content')
<div class="row w-100 mx-auto">
<div class="col p-0">
<div class="card rounded-0 border-0">
<div class="card-header">
<div class="row w-100 mx-auto">
<div class="col p-0">
@include('modules.breadcrumbs.breadcrumb-body')
</div>
@can('create', \App\Models\ClaimSubject::class)
<div class="col-md-3 d-flex align-items-center p-0">
<div class="input-group justify-content-end">
<a class="btn btn-primary" data-bs-tooltip="tooltip"
href="{{ route('bo.claim_subjects.create') }}"
title="{{ __('Ajouter une :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">
<i class="fa-solid fa-plus"></i>
</a>
</div>
</div>
@endcan
</div>
</div>
<div class="card-body">
@include('bo.modules.search-bar')
<div class="row w-100 mx-auto mb-2">
<div class="col table-responsive p-0">
@include('bo.pages.claim_subjects.index-list')
</div>
</div>
{!! $claimSubjectModels->links() !!}
</div>
</div>
</div>
</div>
@endsection

View file

@ -0,0 +1,57 @@
@extends('bo.layout', ['brParam' => $claimSubjectModel])
@section('title', sprintf('%s - %s', __('models.classes.claimsubjects'), str(__('aperçu'))->ucfirst()))
@section('description', __('Aperçu d\'un :model', ['model' => __('models.classes.claimsubjects')]))
@section('metaIndex', 'noindex,nofollow')
@section('breadcrumb', request()->route()->getName())
@section('content')
<div class="card border-0">
<div class="card-header">
<div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap">
<div class="d-flex align-items-start flex-row">
@can('viewAny', \App\Models\ClaimSubject::class)
<a class="btn btn-primary text-decoration-none me-2" data-bs-tooltip="tooltip" data-bs-placement="top"
data-bs-tooltip="tooltip" href="{{ route('bo.claim_subjects.index') }}"
title="{{ __('Retourner sur la liste des :model', ['model' => __('models.classes.claimsubjects')]) }}">
<i class="fa-solid fa-arrow-left"></i>
</a>
@endcan
@include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $claimSubjectModel])
</div>
<form class="btn-group" id="dataDelete"
action="{{ route('bo.claim_subjects.destroy', $claimSubjectModel) }}" method="POST">
@can('update', $claimSubjectModel)
<a class="btn btn-primary" data-bs-tooltip="tooltip"
href="{{ route('bo.claim_subjects.edit', $claimSubjectModel->getKey()) }}"
title="{{ __('Modifier ce :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">
<i class="fa-solid fa-pencil"></i>
</a>
@endcan
@can('delete', $claimSubjectModel)
@csrf
@method('DELETE')
<button class="btn btn-danger" data-bs-tooltip="tooltip"
title="{{ __('Supprimer ce :model', ['model' => str(__('models.classes.claimsubjects'))->singular()]) }}">
<i class="fa-solid fa-trash"></i>
</button>
@endcan
</form>
</div>
</div>
<div class="card-body">
<table class="table-sm table-bordered table-striped table">
<tbody>
<tr>
<td class="w-50"><b>{{ str(__('validation.custom.label'))->ucfirst() }}</b></td>
<td class="w-50">{{ $claimSubjectModel->label }}</td>
</tr>
<tr>
<td class="w-50"><b>{{ __('Marque') }}</b></td>
<td class="w-50">{{ $claimSubjectModel->brand->name }}</td>
</tr>
</tbody>
</table>
</div>
</div>
@endsection

View file

@ -143,3 +143,20 @@ Breadcrumbs::for('bo.claims.edit', function (Generator $trail) {
$trail->parent('bo.claims.index');
$trail->push(trans('Édition'));
});
// * CLAIM SUBJECTS
Breadcrumbs::for('bo.claim_subjects.index', function (Generator $trail) {
$trail->push(trans('models.classes.claimsubjects'), route('bo.claim_subjects.index'));
});
Breadcrumbs::for('bo.claim_subjects.create', function (Generator $trail) {
$trail->parent('bo.claim_subjects.index');
$trail->push(trans('Création'), route('bo.claim_subjects.create'));
});
Breadcrumbs::for('bo.claim_subjects.edit', function (Generator $trail) {
$trail->parent('bo.claim_subjects.index');
$trail->push(trans('Édition'));
});
Breadcrumbs::for('bo.claim_subjects.show', function (Generator $trail) {
$trail->parent('bo.claim_subjects.index');
$trail->push(trans('Aperçu'));
});

View file

@ -5,6 +5,7 @@ use App\Http\Controllers\Bo\AnswerController;
use App\Http\Controllers\Bo\BrandController;
use App\Http\Controllers\Bo\ClaimController;
use App\Http\Controllers\Bo\ClaimMessageController;
use App\Http\Controllers\Bo\ClaimSubjectController;
use App\Http\Controllers\Bo\CustomerController;
use App\Http\Controllers\Bo\DashboardController;
use App\Http\Controllers\Bo\QuestionController;
@ -103,6 +104,9 @@ Route::middleware(['throttle:web', 'admin-secure'])->prefix('bo')->name('bo.')->
Route::get('/{brand}/claim_mail_templates/json/paginate', [ClaimController::class, 'jsonClaimPaginateModels'])
->name('claim_mail_templates.json-paginate');
// * CLAIM SUBJECTS.
Route::resource('claim_subjects', ClaimSubjectController::class);
// * OTHERS.
Route::post('theme/set', [Controller::class, 'setTheme'])->name('theme.set');
});