From db4db55fe9ab9e2482081bc26f4758a42d1a2a01 Mon Sep 17 00:00:00 2001 From: Noah Lancien Date: Tue, 22 Aug 2023 09:18:39 +0200 Subject: [PATCH] FAQ CRUDs --- .../Controllers/Bo/FaqQuestionsController.php | 185 ++++++++++++++---- .../Controllers/Bo/FaqThemesController.php | 176 ++++++++++++++--- .../FaqQuestions/StoreFaqQuestionRequest.php | 46 +++++ .../FaqQuestions/UpdateFaqQuestionRequest.php | 7 + .../Bo/FaqThemes/StoreFaqThemeRequest.php | 42 ++++ .../Bo/FaqThemes/UpdateFaqThemeRequest.php | 7 + app/Models/FaqQuestion.php | 24 +-- app/Models/FaqTheme.php | 1 + ...2020_10_26_093746_create_faq_questions.php | 2 - resources/lang/fr/models.php | 4 +- resources/lang/fr/validation.php | 3 + .../views/bo/faq-questions/index.blade.php | 11 -- resources/views/bo/faq-themes/index.blade.php | 6 - resources/views/bo/layouts/nav-menu.blade.php | 4 +- .../bo/pages/faq-questions/create.blade.php | 46 +++++ .../bo/pages/faq-questions/edit.blade.php | 62 ++++++ .../pages/faq-questions/form-inputs.blade.php | 96 +++++++++ .../bo/pages/faq-questions/index.blade.php | 68 +++++++ .../bo/pages/faq-themes/create.blade.php | 46 +++++ .../views/bo/pages/faq-themes/edit.blade.php | 62 ++++++ .../bo/pages/faq-themes/form-inputs.blade.php | 48 +++++ .../views/bo/pages/faq-themes/index.blade.php | 64 ++++++ routes/breadcrumbs-bo.php | 38 ++++ routes/web-bo.php | 16 +- 24 files changed, 947 insertions(+), 117 deletions(-) create mode 100644 app/Http/Requests/Bo/FaqQuestions/StoreFaqQuestionRequest.php create mode 100644 app/Http/Requests/Bo/FaqQuestions/UpdateFaqQuestionRequest.php create mode 100644 app/Http/Requests/Bo/FaqThemes/StoreFaqThemeRequest.php create mode 100644 app/Http/Requests/Bo/FaqThemes/UpdateFaqThemeRequest.php delete mode 100644 resources/views/bo/faq-questions/index.blade.php delete mode 100644 resources/views/bo/faq-themes/index.blade.php create mode 100644 resources/views/bo/pages/faq-questions/create.blade.php create mode 100644 resources/views/bo/pages/faq-questions/edit.blade.php create mode 100644 resources/views/bo/pages/faq-questions/form-inputs.blade.php create mode 100644 resources/views/bo/pages/faq-questions/index.blade.php create mode 100644 resources/views/bo/pages/faq-themes/create.blade.php create mode 100644 resources/views/bo/pages/faq-themes/edit.blade.php create mode 100644 resources/views/bo/pages/faq-themes/form-inputs.blade.php create mode 100644 resources/views/bo/pages/faq-themes/index.blade.php diff --git a/app/Http/Controllers/Bo/FaqQuestionsController.php b/app/Http/Controllers/Bo/FaqQuestionsController.php index f137928..6ba10c1 100644 --- a/app/Http/Controllers/Bo/FaqQuestionsController.php +++ b/app/Http/Controllers/Bo/FaqQuestionsController.php @@ -3,57 +3,170 @@ namespace App\Http\Controllers\Bo; use App\Http\Controllers\Controller; +use App\Http\Requests\Bo\FaqQuestions\StoreFaqQuestionRequest; +use App\Http\Requests\Bo\FaqQuestions\UpdateFaqQuestionRequest; use App\Models\FaqQuestion; use App\Models\FaqTheme; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Str; class FaqQuestionsController extends Controller { - public function index() + /** + * 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 { - $questions = FaqQuestion::all(); - for ($i = 0; $i < count($questions); $i++) { - $questions[$i]['toggle'] = false; + /** @var \Illuminate\Database\Eloquent\Builder $faqQuestionModels */ + $faqQuestionModels = FaqQuestion::query(); + + /** @var string $search Search field */ + $search = $request->search; + if ($search) { + $this->searchQuery( + $faqQuestionModels, + $search, + null, + 'question', + 'answer' + ); } - $themes = FaqTheme::all(); - return view('bo.faq-questions.index', compact('questions', 'themes')); + $searchFields = \sprintf( + '%s, %s ...', + Str::ucfirst(__('validation.attributes.question')), + __('validation.attributes.answer'), + ); + + /** Sort columns with a query */ + $this->sortQuery($faqQuestionModels); + + /** Custom pagination */ + $faqQuestionModels = $this->customPaginate($faqQuestionModels, $request->pagination); + + return view('bo.pages.faq-questions.index', compact('faqQuestionModels', 'search', 'searchFields')); } - public function destroy(Request $request) + /** + * Show the form for creating a new resource. + * + * @param \App\Models\FaqQuestion $faqQuestion + * @return \Illuminate\Contracts\View\View + */ + public function create(FaqQuestion $faqQuestion): \Illuminate\Contracts\View\View { - if ($request->id !== null) { - $question = FaqQuestion::findOrFail($request->id); - $question->delete(); - } + $faqThemeModels = FaqTheme::all(); + return view('bo.pages.faq-questions.create', [ + 'faqQuestionModel' => $faqQuestion, + 'faqThemeModels' => $faqThemeModels + ]); } - public function saveDatas(Request $request) + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Bo\FaqQuestions\StoreFaqQuestionRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(StoreFaqQuestionRequest $request): \Illuminate\Http\RedirectResponse { - $questions = $request->questions; - - for ($i = 0; $i < count($questions); $i++) { - if (isset($questions[$i]["id"])) { - $q = FaqQuestion::findOrFail($questions[$i]["id"]); - $q->question = $questions[$i]["question"]; - $q->answer = $questions[$i]["answer"]; - $q->positive_vote = $questions[$i]["positive_vote"]; - $q->negative_vote = $questions[$i]["negative_vote"]; - $q->theme_id = $questions[$i]["theme_id"]; - $q->save(); - } else { - $t = FaqQuestion::updateOrCreate( - [ - 'question' => $questions[$i]["question"], - 'answer' => $questions[$i]["answer"], - 'positive_vote' => $questions[$i]["positive_vote"], - 'negative_vote' => $questions[$i]["negative_vote"], - 'theme_id' => $questions[$i]["theme_id"] - ] - ); - $questions[$i]["id"] = $t->id; + return DB::transaction(function () use ($request) { + $faqQuestion = new FaqQuestion(); + $faqQuestion->fill($request->validated()); + if ($faqQuestion->saveOrFail()) { + return redirect() + ->route('bo.faq-questions.edit', $faqQuestion) + ->with( + 'success', + trans( + 'crud.messages.has_been_created', + ['model' => trans_choice('models.classes.faq-questions', 1)] + ) + ); } - }//end for + return redirect() + ->back() + ->with('error', trans( + 'crud.messages.cannot_be_created', + ['model' => trans_choice('models.classes.faq-questions', 1)] + )); + }); + } - return $questions; + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\FaqQuestion $faqQuestion + * @return \Illuminate\Contracts\View\View + */ + public function edit(FaqQuestion $faqQuestion): \Illuminate\Contracts\View\View + { + $faqThemeModels = FaqTheme::all(); + return view('bo.pages.faq-questions.edit', [ + 'faqQuestionModel' => $faqQuestion, + 'faqThemeModels' => $faqThemeModels + ]); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Bo\FaqQuestions\UpdateFaqQuestionRequest $request + * @param \App\Models\FaqQuestion $faqQuestion + * @return \Illuminate\Http\RedirectResponse + */ + public function update( + UpdateFaqQuestionRequest $request, + FaqQuestion $faqQuestion + ): \Illuminate\Http\RedirectResponse { + return DB::transaction(function () use ($request, $faqQuestion) { + $faqQuestion->fill($request->validated()); + if ($faqQuestion->saveOrFail()) { + return redirect() + ->route( + 'bo.faq-questions.edit', + $faqQuestion + ) + ->with('success', trans( + 'crud.messages.has_been_updated', + ['model' => trans_choice('models.classes.faq-questions', 1)] + )); + } + return redirect() + ->back() + ->with('error', trans( + 'crud.messages.cannot_be_updated', + ['model' => trans_choice('models.classes.faq-questions', 1)] + )); + }); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\FaqQuestion $faqQuestion + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(FaqQuestion $faqQuestion): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($faqQuestion) { + if ($faqQuestion->deleteOrFail()) { + return redirect() + ->route('bo.faq-questions.index') + ->with('success', __( + 'crud.messages.has_been_deleted', + ['model' => trans_choice('models.classes.faq-questions', 1)] + )); + } + return redirect() + ->back() + ->with('error', __( + ':crud.messages.cannot_be_deleted', + ['model' => trans_choice('models.classes.faq-questions', 1)] + )); + }); } } diff --git a/app/Http/Controllers/Bo/FaqThemesController.php b/app/Http/Controllers/Bo/FaqThemesController.php index e8e5cd9..162f9f0 100644 --- a/app/Http/Controllers/Bo/FaqThemesController.php +++ b/app/Http/Controllers/Bo/FaqThemesController.php @@ -3,49 +3,167 @@ namespace App\Http\Controllers\Bo; use App\Http\Controllers\Controller; -use App\Models\FaqQuestion; +use App\Http\Requests\Bo\FaqThemes\StoreFaqThemeRequest; +use App\Http\Requests\Bo\FaqThemes\UpdateFaqThemeRequest; use App\Models\FaqTheme; use Illuminate\Http\Request; +use Illuminate\Support\Facades\DB; +use Illuminate\Support\Str; class FaqThemesController extends Controller { - public function index() + /** + * 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 { - $themes = FaqTheme::all(); - return view('bo.faq-themes.index', compact('themes')); - } + /** @var \Illuminate\Database\Eloquent\Builder $faqThemeModels */ + $faqThemeModels = FaqTheme::query(); - public function destroy(Request $request) - { - $deleteOk = 0; - - if (FaqQuestion::where('theme_id', $request->id)->count() > 0) { - $deleteOk = 1; - } elseif ($request->id !== null) { - $theme = FaqTheme::findOrFail($request->id); - $theme->delete(); - } else { - $deleteOk = 2; + /** @var string $search Search field */ + $search = $request->search; + if ($search) { + $this->searchQuery( + $faqThemeModels, + $search, + null, + 'question', + 'answer' + ); } + $searchFields = \sprintf( + '%s, %s ...', + Str::ucfirst(__('validation.attributes.question')), + __('validation.attributes.answer'), + ); - return $deleteOk; + /** Sort columns with a query */ + $this->sortQuery($faqThemeModels); + + /** Custom pagination */ + $faqThemeModels = $this->customPaginate($faqThemeModels, $request->pagination); + + return view('bo.pages.faq-themes.index', compact('faqThemeModels', 'search', 'searchFields')); } - public function saveDatas(Request $request) + /** + * Show the form for creating a new resource. + * + * @param \App\Models\FaqTheme $faqTheme + * @return \Illuminate\Contracts\View\View + */ + public function create(FaqTheme $faqTheme): \Illuminate\Contracts\View\View { - $themes = $request->themes; + return view('bo.pages.faq-themes.create', [ + 'faqThemeModel' => $faqTheme, + ]); + } - for ($i = 0; $i < count($themes); $i++) { - if (isset($themes[$i]["id"])) { - $t = FaqTheme::findOrFail($themes[$i]["id"]); - $t->name = $themes[$i]["name"]; - $t->save(); - } else { - $t = FaqTheme::updateOrCreate(['name' => $themes[$i]["name"]]); - $themes[$i]["id"] = $t->id; + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Bo\FaqThemes\StoreFaqThemeRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(StoreFaqThemeRequest $request): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($request) { + $faqTheme = new FaqTheme(); + $faqTheme->fill($request->validated()); + if ($faqTheme->saveOrFail()) { + return redirect() + ->route('bo.faq-themes.edit', $faqTheme) + ->with( + 'success', + trans( + 'crud.messages.has_been_created', + ['model' => trans_choice('models.classes.faq-themes', 1)] + ) + ); } - } + return redirect() + ->back() + ->with('error', trans( + 'crud.messages.cannot_be_created', + ['model' => trans_choice('models.classes.faq-themes', 1)] + )); + }); + } - return $themes; + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\FaqTheme $faqTheme + * @return \Illuminate\Contracts\View\View + */ + public function edit(FaqTheme $faqTheme): \Illuminate\Contracts\View\View + { + return view('bo.pages.faq-themes.edit', [ + 'faqThemeModel' => $faqTheme, + ]); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Bo\FaqThemes\UpdateFaqThemeRequest $request + * @param \App\Models\FaqTheme $faqTheme + * @return \Illuminate\Http\RedirectResponse + */ + public function update( + UpdateFaqThemeRequest $request, + FaqTheme $faqTheme + ): \Illuminate\Http\RedirectResponse { + return DB::transaction(function () use ($request, $faqTheme) { + $faqTheme->fill($request->validated()); + if ($faqTheme->saveOrFail()) { + return redirect() + ->route( + 'bo.faq-themes.edit', + $faqTheme + ) + ->with('success', trans( + 'crud.messages.has_been_updated', + ['model' => trans_choice('models.classes.faq-themes', 1)] + )); + } + return redirect() + ->back() + ->with('error', trans( + 'crud.messages.cannot_be_updated', + ['model' => trans_choice('models.classes.faq-themes', 1)] + )); + }); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\FaqTheme $faqTheme + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(FaqTheme $faqTheme): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($faqTheme) { + if ($faqTheme->questions()->count() === 0) { + if ($faqTheme->deleteOrFail()) { + return redirect() + ->route('bo.faq-themes.index') + ->with('success', __( + 'crud.messages.has_been_deleted', + ['model' => trans_choice('models.classes.faq-themes', 1)] + )); + } + } + return redirect() + ->back() + ->with('error', __( + 'crud.messages.cannot_be_deleted', + ['model' => trans_choice('models.classes.faq-themes', 1)] + )); + }); } } diff --git a/app/Http/Requests/Bo/FaqQuestions/StoreFaqQuestionRequest.php b/app/Http/Requests/Bo/FaqQuestions/StoreFaqQuestionRequest.php new file mode 100644 index 0000000..c7671bd --- /dev/null +++ b/app/Http/Requests/Bo/FaqQuestions/StoreFaqQuestionRequest.php @@ -0,0 +1,46 @@ +check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'question' => 'required|string|min:3|max:255', + 'answer' => 'required|string|min:3|max:255', + 'theme_id' => 'required|exists:faq_themes,id', + ]; + } + + /** + * Get custom attributes for validator errors. + * + * @return array + */ + public function attributes(): array + { + return [ + 'question' => trans('Question'), + 'answer' => trans('Réponse'), + 'theme_id' => trans('Thème associé'), + ]; + } +} diff --git a/app/Http/Requests/Bo/FaqQuestions/UpdateFaqQuestionRequest.php b/app/Http/Requests/Bo/FaqQuestions/UpdateFaqQuestionRequest.php new file mode 100644 index 0000000..d3537ad --- /dev/null +++ b/app/Http/Requests/Bo/FaqQuestions/UpdateFaqQuestionRequest.php @@ -0,0 +1,7 @@ +check(); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules() + { + return [ + 'name' => 'required|string|min:3|max:255' + ]; + } + + /** + * Get custom attributes for validator errors. + * + * @return array + */ + public function attributes(): array + { + return [ + 'name' => trans('Nom'), + ]; + } +} diff --git a/app/Http/Requests/Bo/FaqThemes/UpdateFaqThemeRequest.php b/app/Http/Requests/Bo/FaqThemes/UpdateFaqThemeRequest.php new file mode 100644 index 0000000..45209d0 --- /dev/null +++ b/app/Http/Requests/Bo/FaqThemes/UpdateFaqThemeRequest.php @@ -0,0 +1,7 @@ +belongsTo(FaqTheme::class, 'theme_id'); } - - /** - * get Utility - * @return float|integer - */ - public function getUtilityAttribute() - { - $pourcent = 0; - - if ( - $this->positive_vote !== null && $this->negative_vote !== null && $this->positive_vote >= $this->negative_vote && $this->positive_vote > 0 && $this->negative_vote > 0 - ) { - $ratio = $this->negative_vote / $this->positive_vote; - $pourcent = ceil((1 - $ratio) * 100); - } - - return $pourcent; - } } diff --git a/app/Models/FaqTheme.php b/app/Models/FaqTheme.php index 4f56a73..176ec57 100644 --- a/app/Models/FaqTheme.php +++ b/app/Models/FaqTheme.php @@ -22,6 +22,7 @@ class FaqTheme extends Model /** * Question relation + * * @return \Illuminate\Database\Eloquent\Relations\HasMany */ public function questions() diff --git a/database/migrations/2020_10_26_093746_create_faq_questions.php b/database/migrations/2020_10_26_093746_create_faq_questions.php index ef4d55d..0bcd094 100644 --- a/database/migrations/2020_10_26_093746_create_faq_questions.php +++ b/database/migrations/2020_10_26_093746_create_faq_questions.php @@ -17,8 +17,6 @@ class CreateFaqQuestions extends Migration $table->id(); $table->string('question'); $table->text('answer'); - $table->unsignedInteger('positive_vote')->nullable(); - $table->unsignedInteger('negative_vote')->nullable(); $table->foreignId('theme_id')->constrained('faq_themes'); $table->timestamps(); }); diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index 2f1ed6c..a901cd0 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -3,6 +3,8 @@ return [ 'classes' => [ 'bannedips' => 'IP bannies', - 'contents' => 'contenus', + 'contents' => 'Contenus', + 'faq-questions' => 'Question pour la FAQ|Questions pour la FAQ', + 'faq-themes' => 'Thème pour la FAQ|Thèmes pour la FAQ', ] ]; diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php index 544de0c..a971c8f 100644 --- a/resources/lang/fr/validation.php +++ b/resources/lang/fr/validation.php @@ -177,5 +177,8 @@ return [ 'ip' => 'IP', 'value' => 'valeur', + 'question' => 'question', + 'answer' => 'réponse', + 'theme' => 'thème', ], ]; diff --git a/resources/views/bo/faq-questions/index.blade.php b/resources/views/bo/faq-questions/index.blade.php deleted file mode 100644 index f3f59e9..0000000 --- a/resources/views/bo/faq-questions/index.blade.php +++ /dev/null @@ -1,11 +0,0 @@ -@extends('bo.layout') - -@section('content') - @php - $data = [ - 'dbdatas' => $questions, - 'dbthemes' => $themes - ] - @endphp -
-@endsection diff --git a/resources/views/bo/faq-themes/index.blade.php b/resources/views/bo/faq-themes/index.blade.php deleted file mode 100644 index 09e8321..0000000 --- a/resources/views/bo/faq-themes/index.blade.php +++ /dev/null @@ -1,6 +0,0 @@ -@extends('bo.layout') - -@section('content') - @php $data = ['dbdatas' => $themes]; @endphp -
-@endsection diff --git a/resources/views/bo/layouts/nav-menu.blade.php b/resources/views/bo/layouts/nav-menu.blade.php index 6b54433..2806890 100644 --- a/resources/views/bo/layouts/nav-menu.blade.php +++ b/resources/views/bo/layouts/nav-menu.blade.php @@ -105,10 +105,10 @@ diff --git a/resources/views/bo/pages/faq-questions/create.blade.php b/resources/views/bo/pages/faq-questions/create.blade.php new file mode 100644 index 0000000..0bc875b --- /dev/null +++ b/resources/views/bo/pages/faq-questions/create.blade.php @@ -0,0 +1,46 @@ +@extends('bo.layout', ['brParam' => $faqQuestionModel]) + +@section('title', __('Création d\'une :model', ['model' => trans_choice('models.classes.faq-questions', 1)])) +@section('description', __('Création d\'une toute nouvelle :model', ['model' => trans_choice('models.classes.faq-questions', 1)])) +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+ + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqQuestionModel]) +
+
+ +
+
+
+ @csrf + @include('bo.pages.faq-questions.form-inputs') +
+
+ +
+
+
+@endsection diff --git a/resources/views/bo/pages/faq-questions/edit.blade.php b/resources/views/bo/pages/faq-questions/edit.blade.php new file mode 100644 index 0000000..3869a84 --- /dev/null +++ b/resources/views/bo/pages/faq-questions/edit.blade.php @@ -0,0 +1,62 @@ +@extends('bo.layout', ['brParam' => $faqQuestionModel]) + +@section('title', __('Édition d\'une :model', ['model' => trans_choice('models.classes.faq-questions', 1)])) +@section('description', __('Édition d\'une :model déjà existante', ['model' => trans_choice('models.classes.faq-questions', 1)])) +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+ + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqQuestionModel]) +
+
+
+ @csrf + @method('DELETE') +
+ + +
+
+
+
+
+ @csrf + @method('PUT') + @include('bo.pages.faq-questions.form-inputs') +
+
+ +
+
+
+@endsection diff --git a/resources/views/bo/pages/faq-questions/form-inputs.blade.php b/resources/views/bo/pages/faq-questions/form-inputs.blade.php new file mode 100644 index 0000000..72bdfc9 --- /dev/null +++ b/resources/views/bo/pages/faq-questions/form-inputs.blade.php @@ -0,0 +1,96 @@ +
+ {{-- QUESTION --}} +
+
+ {{ Str::ucfirst(__('validation.attributes.question')) }} +
+
+ @include('bo.partials.inputs.varchar', [ + 'id' => 'faqQuestionQuestion', + 'label' => __(':field à intégrer à la faq', [ + 'field' => Str::ucfirst(__('validation.attributes.question')), + ]), + 'hasWordCounter' => true, + 'name' => 'question', + 'required' => true, + 'model' => $faqQuestionModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __(':field', [ + 'field' => Str::ucfirst(__('validation.attributes.question')), + ]), + 'min' => 3, + 'max' => 255 + ]), + 'placeholder' => __(':field à intégrer à la faq', [ + 'field' => Str::ucfirst(__('validation.attributes.question')), + ]), + ]) +
+
+
+
+ {{-- ANSWER --}} +
+
+ {{ Str::ucfirst(__('validation.attributes.question')) }} +
+
+ @include('bo.partials.inputs.varchar', [ + 'id' => 'faqQuestionAnswer', + 'label' => __(':field à la question', [ + 'field' => Str::ucfirst(__('validation.attributes.answer')), + ]), + 'hasWordCounter' => true, + 'name' => 'answer', + 'required' => true, + 'model' => $faqQuestionModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __(':field', [ + 'field' => Str::ucfirst(__('validation.attributes.answer')), + ]), + 'min' => 3, + 'max' => 255 + ]), + 'placeholder' => __(':field à la question', [ + 'field' => Str::ucfirst(__('validation.attributes.answer')), + ]), + ]) +
+
+
+
+ {{-- THEME_ID --}} +
+
+ {{ __('Thème') }} +
+
+ @include('bo.partials.inputs.bigint-foreign-id', [ + 'id' => 'faqQuestionTheme', + 'label' => __('crud.minicrud.associated', ['entity' => trans_choice('models.classes.faq-themes', 1)]), + 'name' => 'theme_id', + 'size' => 5, + 'model' => $faqQuestionModel ?? null, + 'associatedModels' => $faqThemeModels, + 'foreignLabel' => 'name', + 'helper' => __('crud.minicrud.select', ['entity' => trans_choice('models.classes.faq-themes', 1)]), + ]) +
+
+
+
+
+ +@push('scripts') + +@endpush diff --git a/resources/views/bo/pages/faq-questions/index.blade.php b/resources/views/bo/pages/faq-questions/index.blade.php new file mode 100644 index 0000000..aa5a18a --- /dev/null +++ b/resources/views/bo/pages/faq-questions/index.blade.php @@ -0,0 +1,68 @@ +@extends('bo.layout') + +@section('title', trans_choice('models.classes.faq-questions', 2)) +@section('description', __('Liste de toutes les :model', ['model' => trans_choice('models.classes.faq-questions', 2)])) + +@section('content') +
+ @include('breadcrumbs.breadcrumb-body') + + + +
+@include('bo.modules.search-bar') + + @if (count($faqQuestionModels) > 0) + + @include('bo.modules.table-col-sorter', [ + 'cols' => [ + 'question' => Str::ucfirst(__('validation.attributes.question')), + 'answer' => Str::ucfirst(__('validation.attributes.answer')), + 'theme_id' => Str::ucfirst(__('validation.attributes.theme')), + ], + ]) + + + @foreach ($faqQuestionModels as $faqQuestionModel) + + + + + + + @endforeach + + @else + + + + @endif +
{{ $faqQuestionModel->question }}{{ $faqQuestionModel->answer }}{{ $faqQuestionModel->theme->name }} +
+ + + + @csrf + @method('DELETE') + +
+
{{ __('crud.other.no_model_found', ['model' => trans_choice('models.classes.faq-questions', 1)]) }}
+{!! $faqQuestionModels->links() !!} +@endsection diff --git a/resources/views/bo/pages/faq-themes/create.blade.php b/resources/views/bo/pages/faq-themes/create.blade.php new file mode 100644 index 0000000..b4f1a71 --- /dev/null +++ b/resources/views/bo/pages/faq-themes/create.blade.php @@ -0,0 +1,46 @@ +@extends('bo.layout', ['brParam' => $faqThemeModel]) + +@section('title', __('Création d\'une :model', ['model' => trans_choice('models.classes.faq-themes', 1)])) +@section('description', __('Création d\'une toute nouvelle :model', ['model' => trans_choice('models.classes.faq-themes', 1)])) +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+ + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqThemeModel]) +
+
+ +
+
+
+ @csrf + @include('bo.pages.faq-themes.form-inputs') +
+
+ +
+
+
+@endsection diff --git a/resources/views/bo/pages/faq-themes/edit.blade.php b/resources/views/bo/pages/faq-themes/edit.blade.php new file mode 100644 index 0000000..96f5070 --- /dev/null +++ b/resources/views/bo/pages/faq-themes/edit.blade.php @@ -0,0 +1,62 @@ +@extends('bo.layout', ['brParam' => $faqThemeModel]) + +@section('title', __('Édition d\'une :model', ['model' => trans_choice('models.classes.faq-themes', 1)])) +@section('description', __('Édition d\'une :model déjà existante', ['model' => trans_choice('models.classes.faq-themes', 1)])) +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+ + + + @include('breadcrumbs.breadcrumb-body', ['brParam' => $faqThemeModel]) +
+
+
+ @csrf + @method('DELETE') +
+ + +
+
+
+
+
+ @csrf + @method('PUT') + @include('bo.pages.faq-themes.form-inputs') +
+
+ +
+
+
+@endsection diff --git a/resources/views/bo/pages/faq-themes/form-inputs.blade.php b/resources/views/bo/pages/faq-themes/form-inputs.blade.php new file mode 100644 index 0000000..a682211 --- /dev/null +++ b/resources/views/bo/pages/faq-themes/form-inputs.blade.php @@ -0,0 +1,48 @@ +
+ {{-- NAME --}} +
+
+ {{ Str::ucfirst(__('validation.attributes.name')) }} +
+
+ @include('bo.partials.inputs.varchar', [ + 'id' => 'faqThemeName', + 'label' => __(':field du :model', [ + 'field' => Str::ucfirst(__('validation.attributes.name')), + 'model' => trans_choice('models.classes.faq-themes', 1), + ]), + 'hasWordCounter' => true, + 'name' => 'name', + 'required' => true, + 'model' => $faqThemeModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __(':field', [ + 'field' => Str::ucfirst(__('validation.attributes.question')), + ]), + 'min' => 3, + 'max' => 255 + ]), + 'placeholder' => __(':field du :model', [ + 'field' => Str::ucfirst(__('validation.attributes.name')), + 'model' => trans_choice('models.classes.faq-themes', 1), + ]), + ]) +
+
+
+
+
+ +@push('scripts') + +@endpush diff --git a/resources/views/bo/pages/faq-themes/index.blade.php b/resources/views/bo/pages/faq-themes/index.blade.php new file mode 100644 index 0000000..39887c0 --- /dev/null +++ b/resources/views/bo/pages/faq-themes/index.blade.php @@ -0,0 +1,64 @@ +@extends('bo.layout') + +@section('title', trans_choice('models.classes.faq-themes', 2)) +@section('description', __('Liste de toutes les :model', ['model' => trans_choice('models.classes.faq-themes', 2)])) + +@section('content') +
+ @include('breadcrumbs.breadcrumb-body') + + + +
+@include('bo.modules.search-bar') + + @if (count($faqThemeModels) > 0) + + @include('bo.modules.table-col-sorter', [ + 'cols' => [ + 'name' => Str::ucfirst(__('validation.attributes.name')), + ], + ]) + + + @foreach ($faqThemeModels as $faqThemeModel) + + + + + @endforeach + + @else + + + + @endif +
{{ $faqThemeModel->name }} +
+ + + + @csrf + @method('DELETE') + +
+
{{ __('crud.other.no_model_found', ['model' => trans_choice('models.classes.faq-themes', 1)]) }}
+{!! $faqThemeModels->links() !!} +@endsection diff --git a/routes/breadcrumbs-bo.php b/routes/breadcrumbs-bo.php index aed30f0..05be3f3 100644 --- a/routes/breadcrumbs-bo.php +++ b/routes/breadcrumbs-bo.php @@ -1,6 +1,9 @@ parent('bo.bannedips.index'); $trail->push(__('crud.actions.edit'), route('bo.bannedips.edit', $bannedip->id)); }); + +// * CONTENTS +Breadcrumbs::for('bo.contents.index', function (Generator $trail) { + $trail->push(__('models.classes.contents'), route('bo.contents.index')); +}); +Breadcrumbs::for('bo.contents.edit', function (Generator $trail, Content $content) { + $trail->parent('bo.contents.index'); + $trail->push(__('crud.actions.edit'), route('bo.contents.edit', $content->id)); +}); + +// * FAQ - QUESTIONS +Breadcrumbs::for('bo.faq-questions.index', function (Generator $trail) { + $trail->push(trans_choice('models.classes.faq-questions', 2), route('bo.faq-questions.index')); +}); +Breadcrumbs::for('bo.faq-questions.create', function (Generator $trail) { + $trail->parent('bo.faq-questions.index'); + $trail->push(__('crud.actions.create'), route('bo.faq-questions.create')); +}); +Breadcrumbs::for('bo.faq-questions.edit', function (Generator $trail, FaqQuestion $faqQuestion) { + $trail->parent('bo.faq-questions.index'); + $trail->push(__('crud.actions.edit'), route('bo.faq-questions.edit', $faqQuestion->id)); +}); + +// * FAQ - THEMES +Breadcrumbs::for('bo.faq-themes.index', function (Generator $trail) { + $trail->push(trans_choice('models.classes.faq-themes', 2), route('bo.faq-themes.index')); +}); +Breadcrumbs::for('bo.faq-themes.create', function (Generator $trail) { + $trail->parent('bo.faq-themes.index'); + $trail->push(__('crud.actions.create'), route('bo.faq-themes.create')); +}); +Breadcrumbs::for('bo.faq-themes.edit', function (Generator $trail, FaqTheme $faqTheme) { + $trail->parent('bo.faq-themes.index'); + $trail->push(__('crud.actions.edit'), route('bo.faq-themes.edit', $faqTheme->id)); +}); diff --git a/routes/web-bo.php b/routes/web-bo.php index 4ac265a..bac2b4f 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -36,13 +36,17 @@ Route::prefix('bo') }); Route::middleware(['auth:backend', 'is-admin', 'is-super-admin']) ->group(function () { - // * BANNED IPS. + // * BANNED IPS Route::resource('/bannedips', BannedIpController::class)->except('show'); - // * CONTENTS. + // * CONTENTS Route::resource('/contents', ContentController::class) ->only(['index', 'edit', 'update']) ->withoutMiddleware('htmlsanitize') ->middleware(['htmlsanitize:value']); + // * FAQ - THEMES + Route::resource('/faq-themes', FaqThemesController::class)->except('show'); + // * FAQ - QUESTIONS + Route::resource('/faq-questions', FaqQuestionsController::class)->except('show'); // TODO RESTE A FAIRE :. Route::get('/', [DashboardController::class, 'index']) @@ -69,14 +73,6 @@ Route::prefix('bo') ->withoutMiddleware('is-super-admin'); Route::post('/ajax/save-codes-ean', [CodesEANController::class, 'saveDatas']) ->withoutMiddleware('is-super-admin'); - // FAQ - Thèmes. - Route::get('/faq-themes', [FaqThemesController::class, 'index'])->name('faq-themes'); - Route::post('/ajax/delete-faq-theme', [FaqThemesController::class, 'destroy']); - Route::post('/ajax/save-faq-theme', [FaqThemesController::class, 'saveDatas']); - // FAQ - Questions. - Route::get('/faq-questions', [FaqQuestionsController::class, 'index'])->name('faq-questions'); - Route::post('/ajax/delete-faq-question', [FaqQuestionsController::class, 'destroy']); - Route::post('/ajax/save-faq-question', [FaqQuestionsController::class, 'saveDatas']); // Codes uniques. Route::get('/codes', [CodesController::class, 'index'])->name('codes'); Route::post('/codes', [CodesController::class, 'generate'])->name('generate-codes');