diff --git a/app/Http/Controllers/Bo/ConsumptionMomentController.php b/app/Http/Controllers/Bo/ConsumptionMomentController.php new file mode 100644 index 00000000..43f90a22 --- /dev/null +++ b/app/Http/Controllers/Bo/ConsumptionMomentController.php @@ -0,0 +1,175 @@ +authorizeResource(ConsumptionMoment::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 $consumptionMomentModels */ + $consumptionMomentModels = ConsumptionMoment::query(); + + /** @var string $search Search field */ + $search = $request->search; + if ($search) { + $this->searchQuery( + $consumptionMomentModels, + $search, + null, + 'title', + ); + } + $searchFields = \implode(', ', [ + trans('validation.attributes.title'), + ]); + + /** Sort columns with a query */ + $this->sortQuery($consumptionMomentModels); + + /** Custom pagination */ + $consumptionMomentModels = $this->paginate($consumptionMomentModels); + + return view('bo.pages.consumption_moments.index', compact('consumptionMomentModels', 'search', 'searchFields')); + } + + /** + * Show the specified resource. + * + * @param \App\Models\ConsumptionMoment $consumptionMoment + * @return \Illuminate\Contracts\View\View + */ + public function show(ConsumptionMoment $consumptionMoment): \Illuminate\Contracts\View\View + { + return view('bo.pages.consumption_moments.show', ['consumptionMomentModel' => $consumptionMoment]); + } + + /** + * Show the form for creating a new resource. + * + * @param \App\Models\ConsumptionMoment $consumptionMoment + * @return \Illuminate\Contracts\View\View + */ + public function create(ConsumptionMoment $consumptionMoment): \Illuminate\Contracts\View\View + { + return view('bo.pages.consumption_moments.create', ['consumptionMomentModel' => $consumptionMoment]); + } + + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Bo\ConsumptionMoments\StoreConsumptionMomentRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(StoreConsumptionMomentRequest $request): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($request) { + $consumptionMoment = new ConsumptionMoment(); + $consumptionMoment->fill($request->validated()); + + if ($consumptionMoment->saveOrFail()) { + return redirect()->route('bo.consumption_moments.edit', $consumptionMoment) + ->with('success', __('crud.messages.has_been_created', [ + 'model' => Str::ucfirst(__('models.classes.consumption_moment')) + ])); + } + return redirect()->back() + ->with('error', __('crud.messages.cannot_be_created', [ + 'model' => Str::ucfirst(__('models.classes.consumption_moment')) + ])); + }); + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\ConsumptionMoment $consumptionMoment + * @return \Illuminate\Contracts\View\View + */ + public function edit(ConsumptionMoment $consumptionMoment): \Illuminate\Contracts\View\View + { + return view('bo.pages.consumption_moments.edit', ['consumptionMomentModel' => $consumptionMoment]); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Bo\ConsumptionMoments\UpdateConsumptionMomentRequest $request + * @param \App\Models\ConsumptionMoment $consumptionMoment + * @return \Illuminate\Http\RedirectResponse + */ + public function update( + UpdateConsumptionMomentRequest $request, + ConsumptionMoment $consumptionMoment + ): \Illuminate\Http\RedirectResponse { + return DB::transaction(function () use ($request, $consumptionMoment) { + $consumptionMoment->fill($request->validated()); + + if ($consumptionMoment->saveOrFail()) { + return redirect()->route('bo.consumption_moments.edit', $consumptionMoment) + ->with('success', __('crud.messages.has_been_updated', [ + 'model' => Str::ucfirst(__('models.classes.consumption_moment')) + ])); + } + return redirect()->route('bo.consumption_moments.edit', $consumptionMoment) + ->with('error', __('crud.messages.cannot_be_updated', [ + 'model' => Str::ucfirst(__('models.classes.consumption_moment')) + ])); + }); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\ConsumptionMoment $consumptionMoment + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(ConsumptionMoment $consumptionMoment): \Illuminate\Http\RedirectResponse + { + /** @var array */ + $previousQueries = []; + \parse_str(\parse_url(url()->previous(), \PHP_URL_QUERY), $previousQueries); + if ($consumptionMoment->deleteOrFail()) { + return redirect()->route('bo.consumption_moments.index', $previousQueries) + ->with('success', __('crud.messages.has_been_deleted', [ + 'model' => Str::ucfirst(__('models.classes.consumption_moment')) + ])); + } + return redirect()->back() + ->with('error', __('crud.messages.cannot_be_deleted', [ + 'model' => Str::ucfirst(__('models.classes.consumption_moment')) + ])); + } + + /** + * Duplicate the specified resource. + * + * @param \App\Models\ConsumptionMoment $consumptionMoment + * @return \Illuminate\Contracts\View\View + */ + public function duplicate(ConsumptionMoment $consumptionMoment): \Illuminate\Contracts\View\View + { + return $this->create($consumptionMoment->replicate()); + } +} diff --git a/app/Http/Controllers/Bo/GeneralSettingController.php b/app/Http/Controllers/Bo/GeneralSettingController.php index fa3fb7b6..ef25a512 100644 --- a/app/Http/Controllers/Bo/GeneralSettingController.php +++ b/app/Http/Controllers/Bo/GeneralSettingController.php @@ -9,7 +9,6 @@ use App\Lib\Helpers\FileStorageHelper; use App\Models\GeneralSetting; use Illuminate\Database\Query\Builder; use Illuminate\Http\Request; -use Illuminate\Support\Arr; use Illuminate\Support\Facades\DB; use Illuminate\Support\Str; @@ -88,10 +87,9 @@ class GeneralSettingController extends Controller $general_setting->setAttribute( $attribute, $value instanceof \Illuminate\Http\UploadedFile ? - FileStorageHelper::storeFile($general_setting, $value, true): + FileStorageHelper::storeFile($general_setting, $value, true) : $value - ) - ); + )); } else { $general_setting->fill($request->only('value')); } diff --git a/app/Http/Requests/Bo/ConsumptionMoments/StoreConsumptionMomentRequest.php b/app/Http/Requests/Bo/ConsumptionMoments/StoreConsumptionMomentRequest.php new file mode 100644 index 00000000..666cdd8a --- /dev/null +++ b/app/Http/Requests/Bo/ConsumptionMoments/StoreConsumptionMomentRequest.php @@ -0,0 +1,44 @@ + 'required|string|between:3,255', + ]; + } + + /** + * Get custom attributes for validator errors. + * + * @return array + */ + public function attributes(): array + { + return [ + 'title' => trans('validation.attributes.title') + ]; + } +} diff --git a/app/Http/Requests/Bo/ConsumptionMoments/UpdateConsumptionMomentRequest.php b/app/Http/Requests/Bo/ConsumptionMoments/UpdateConsumptionMomentRequest.php new file mode 100644 index 00000000..590c059d --- /dev/null +++ b/app/Http/Requests/Bo/ConsumptionMoments/UpdateConsumptionMomentRequest.php @@ -0,0 +1,18 @@ +route('consumption_moment')); + } +} diff --git a/app/Models/ConsumptionMoment.php b/app/Models/ConsumptionMoment.php new file mode 100644 index 00000000..b8ccd20a --- /dev/null +++ b/app/Models/ConsumptionMoment.php @@ -0,0 +1,27 @@ + + */ + protected $fillable = [ + 'title', + ]; +} diff --git a/app/Policies/ConsumptionMomentPolicy.php b/app/Policies/ConsumptionMomentPolicy.php new file mode 100644 index 00000000..f3b78fa7 --- /dev/null +++ b/app/Policies/ConsumptionMomentPolicy.php @@ -0,0 +1,75 @@ + + */ + public function definition() + { + return [ + 'title' => fake()->words(rand(1, 2), true), + ]; + } +} diff --git a/database/migrations/2024_04_25_151849_create_consumption_moments_table.php b/database/migrations/2024_04_25_151849_create_consumption_moments_table.php new file mode 100644 index 00000000..30bf096c --- /dev/null +++ b/database/migrations/2024_04_25_151849_create_consumption_moments_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('title')->comment('The title of the consumption moment.'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('consumption_moment'); + } +}; diff --git a/database/seeders/Development/ConsumptionMomentSeeder.php b/database/seeders/Development/ConsumptionMomentSeeder.php new file mode 100644 index 00000000..db2b7d8a --- /dev/null +++ b/database/seeders/Development/ConsumptionMomentSeeder.php @@ -0,0 +1,29 @@ +make()->each(function (ConsumptionMoment $consumptionMoment) { + $consumptionMoment->saveQuietly(); + }); + } +} diff --git a/database/seeders/DevelopmentSeeder.php b/database/seeders/DevelopmentSeeder.php index 2ab594e5..e4573c11 100644 --- a/database/seeders/DevelopmentSeeder.php +++ b/database/seeders/DevelopmentSeeder.php @@ -6,6 +6,7 @@ use Database\Seeders\Development\ApproachSeeder; use Database\Seeders\Development\KeyNumberSeeder; use Database\Seeders\Development\ProfessionSeeder; use Database\Seeders\Development\BrandAdvantageSeeder; +use Database\Seeders\Development\ConsumptionMomentSeeder; use Database\Seeders\Development\DemarcheSlideSeeder; use Database\Seeders\Development\MainSlideSeeder; use Database\Seeders\Development\MeatSeeder; @@ -38,6 +39,7 @@ class DevelopmentSeeder extends Seeder MeatSeeder::class, SubmeatSeeder::class, ProductSeeder::class, + ConsumptionMomentSeeder::class, ]); } } diff --git a/resources/lang/en/models.php b/resources/lang/en/models.php index 6aa02a42..c74db8b0 100644 --- a/resources/lang/en/models.php +++ b/resources/lang/en/models.php @@ -2,18 +2,19 @@ return [ 'classes' => [ - 'user' => 'user', - 'activity_log' => 'activity log|activity logs', - 'static_page' => 'static page|static pages', - 'general_setting' => 'configuration', - 'brand_advantage' => 'brand advantage|brand advantages', - 'profession' => 'profession', - 'key_number' => 'key number', - 'main_slide' => 'main slide', - 'demarche_slide' => 'demarche slide', - 'approach' => 'approach|approaches', - 'hot_news' => 'hot news', - 'label' => 'label', - 'demarche' => 'demarche', + 'user' => 'user', + 'activity_log' => 'activity log|activity logs', + 'static_page' => 'static page|static pages', + 'general_setting' => 'configuration', + 'brand_advantage' => 'brand advantage|brand advantages', + 'profession' => 'profession', + 'key_number' => 'key number', + 'main_slide' => 'main slide', + 'demarche_slide' => 'demarche slide', + 'approach' => 'approach|approaches', + 'hot_news' => 'hot news', + 'label' => 'label', + 'demarche' => 'demarche', + 'consumption_moment' => 'consumption moment' ] ]; diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index 84074370..697e63f4 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -2,22 +2,23 @@ return [ 'classes' => [ - 'user' => 'utilisateur', - 'activity_log' => 'journal d\'activité|journaux d\'activité', - 'static_page' => 'page statique|pages statiques', - 'general_setting' => 'configuration', - 'brand_advantage' => 'avantage de la marque|avantages de la marque', - 'profession' => 'profession', - 'key_number' => 'chiffre clé', - 'main_slide' => 'carrousel (principal)', - 'demarche_slide' => 'carrousel (démarche)', - 'hot_news' => 'infos chaudes', - 'range' => 'gamme', - 'subrange' => 'sous-gamme', - 'approach' => 'approche|approches', - 'meat' => 'viande', - 'submeat' => 'sous-viande', - 'label' => 'label', - 'demarche' => 'démarche', + 'user' => 'utilisateur', + 'activity_log' => 'journal d\'activité|journaux d\'activité', + 'static_page' => 'page statique|pages statiques', + 'general_setting' => 'configuration', + 'brand_advantage' => 'avantage de la marque|avantages de la marque', + 'profession' => 'profession', + 'key_number' => 'chiffre clé', + 'main_slide' => 'carrousel (principal)', + 'demarche_slide' => 'carrousel (démarche)', + 'hot_news' => 'infos chaudes', + 'range' => 'gamme', + 'subrange' => 'sous-gamme', + 'approach' => 'approche|approches', + 'meat' => 'viande', + 'submeat' => 'sous-viande', + 'label' => 'label', + 'demarche' => 'démarche', + 'consumption_moment' => 'moment de consommation' ] ]; diff --git a/resources/views/bo/layouts/sidemenu.blade.php b/resources/views/bo/layouts/sidemenu.blade.php index 331652d1..120118a1 100644 --- a/resources/views/bo/layouts/sidemenu.blade.php +++ b/resources/views/bo/layouts/sidemenu.blade.php @@ -164,6 +164,15 @@ @endif + {{-- CONSUMPTION MOMENTS --}} + request()->routeIs('bo.consumption_moments.*'), + ])> +  {{ str(__('models.classes.consumption_moment'))->ucFirst() }} + @endauth diff --git a/resources/views/bo/pages/consumption_moments/create.blade.php b/resources/views/bo/pages/consumption_moments/create.blade.php new file mode 100644 index 00000000..c343d684 --- /dev/null +++ b/resources/views/bo/pages/consumption_moments/create.blade.php @@ -0,0 +1,36 @@ +@extends('bo.layout', ['brParam' => $consumptionMomentModel]) + +@section('title', __('Création d\'une :model', ['model' => __('models.classes.consumption_moment')])) +@section('description', __('Création d\'une tout nouveau :model', ['model' => __('models.classes.consumption_moment')])) +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+ + + + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $consumptionMomentModel]) +
+
+ +
+
+
+ @csrf + @include('bo.pages.consumption_moments.form') + @include('bo.partials.script-button-clone') +
+
+ +
+
+
+@endsection diff --git a/resources/views/bo/pages/consumption_moments/edit.blade.php b/resources/views/bo/pages/consumption_moments/edit.blade.php new file mode 100644 index 00000000..68cea5d5 --- /dev/null +++ b/resources/views/bo/pages/consumption_moments/edit.blade.php @@ -0,0 +1,58 @@ +@extends('bo.layout', ['brParam' => $consumptionMomentModel]) + +@section('title', __('Édition d\'une :model', ['model' => __('models.classes.consumption_moment')])) +@section('description', __('Édition d\'une :model déjà existant', ['model' => __('models.classes.consumption_moment')])) +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+ + + + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $consumptionMomentModel]) +
+
+
+ @can('view', $consumptionMomentModel) + + + + @endcan + @can('duplicate', $consumptionMomentModel) + + + + @endcan + + @can('delete', $consumptionMomentModel) + @csrf + @method('DELETE') + + @endcan +
+
+
+
+ @csrf + @method('PUT') + @include('bo.pages.consumption_moments.form') + @include('bo.partials.script-button-clone') +
+
+ +
+
+
+@endsection diff --git a/resources/views/bo/pages/consumption_moments/form.blade.php b/resources/views/bo/pages/consumption_moments/form.blade.php new file mode 100644 index 00000000..9e8d3acc --- /dev/null +++ b/resources/views/bo/pages/consumption_moments/form.blade.php @@ -0,0 +1,26 @@ +
+ {{-- TITLE --}} +
+ @include('bo.partials.inputs.varchar', [ + 'id' => 'consumptionMomentTitle', + 'label' => __(':field1 :inter2:model', [ + 'field1' => str(__('validation.custom.attribute_title'))->ucFirst(), + 'inter2' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.consumption_moment'), + ]), + 'hasWordCounter' => true, + 'name' => 'title', + 'required' => true, + 'model' => $consumptionMomentModel ?? null, + 'helper' => __('crud.minicrud.picture_title_helper'), + 'placeholder' => __(':field1 :inter2:model', [ + 'field1' => str(__('validation.custom.attribute_title'))->ucFirst(), + 'inter2' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.consumption_moment'), + ]), + ]) +
+
+

{{ __('* Champs obligatoires') }}

+
+
diff --git a/resources/views/bo/pages/consumption_moments/index-list.blade.php b/resources/views/bo/pages/consumption_moments/index-list.blade.php new file mode 100644 index 00000000..16cfbd14 --- /dev/null +++ b/resources/views/bo/pages/consumption_moments/index-list.blade.php @@ -0,0 +1,64 @@ + + @if (count($consumptionMomentModels) > 0) + + @include('bo.modules.table-col-sorter', [ + 'cols' => [ + 'title' => str(__('validation.attributes.title'))->ucfirst(), + ], + ]) + + + @foreach ($consumptionMomentModels as $consumptionMomentModel) + + + + + @endforeach + + @else + + + + @endif +
{{ $consumptionMomentModel->title }} + @canAny(['show', 'duplicate', 'update', 'delete'], $consumptionMomentModel) +
+ @can('view', $consumptionMomentModel) + + + + @endcan + @can('duplicate', $consumptionMomentModel) + + + + @endcan + @can('update', $consumptionMomentModel) + + + + @endcan + @can('delete', $consumptionMomentModel) + @csrf + @method('DELETE') + + @endcan +
+ @else + + + + @endcan +
+ {{ trans_choice('crud.other.no_model_found', 1, ['model' => __('models.classes.consumption_moment')]) }} +
diff --git a/resources/views/bo/pages/consumption_moments/index.blade.php b/resources/views/bo/pages/consumption_moments/index.blade.php new file mode 100644 index 00000000..e688ec34 --- /dev/null +++ b/resources/views/bo/pages/consumption_moments/index.blade.php @@ -0,0 +1,21 @@ +@extends('bo.layout') + +@section('title', str(__('models.classes.consumption_moment'))->ucfirst()->plural()) +@section('description', __('Liste de tous les :model', ['model' => str(__('models.classes.consumption_moment'))->plural()])) + +@section('content') +
+ @include('modules.breadcrumbs.breadcrumb-body') + @can('create', \App\Models\ConsumptionMoment::class) + + + + @endcan +
+ @include('bo.modules.search-bar') +
+ @include('bo.pages.consumption_moments.index-list') +
+ {{ $consumptionMomentModels->links() }} +@endsection diff --git a/resources/views/bo/pages/consumption_moments/show.blade.php b/resources/views/bo/pages/consumption_moments/show.blade.php new file mode 100644 index 00000000..e3cea1db --- /dev/null +++ b/resources/views/bo/pages/consumption_moments/show.blade.php @@ -0,0 +1,73 @@ +@extends('bo.layout', ['brParam' => $consumptionMomentModel]) + +@section('title', __('Aperçu d\'un :model', ['model' => __('models.classes.consumption_moment')])) +@section('description', __('Aperçu d\'un :model déjà existante', ['model' => __('models.classes.consumption_moment')])) +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+ + + + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $consumptionMomentModel]) +
+ @canAny(['duplicate', 'update', 'delete'], $consumptionMomentModel) +
+ @can('duplicate', $consumptionMomentModel) + + + + @endcan + @can('update', $consumptionMomentModel) + + + + @endcan + @can('delete', $consumptionMomentModel) + @csrf + @method('DELETE') + + @endcan +
+ @endcan +
+
+
+
+ + + + + + + + + + + + + + + +
{{ str(__('validation.attributes.text'))->ucFirst() }} + {{ $consumptionMomentModel->title }} +
{{ str(__('validation.attributes.created_at'))->ucFirst() }} + {{ str($consumptionMomentModel->created_at->isoFormat('LLLL'))->ucFirst() }} +
{{ str(__('validation.attributes.updated_at'))->ucFirst() }} + {{ str($consumptionMomentModel->updated_at->isoFormat('LLLL'))->ucFirst() }} +
+
+
+
+@endsection diff --git a/routes/breadcrumbs-bo.php b/routes/breadcrumbs-bo.php index c806bb8f..3d787743 100644 --- a/routes/breadcrumbs-bo.php +++ b/routes/breadcrumbs-bo.php @@ -6,6 +6,7 @@ use App\Models\DemarcheSlide; use App\Models\KeyNumber; use App\Models\Profession; use App\Models\BrandAdvantage; +use App\Models\ConsumptionMoment; use App\Models\MainSlide; use App\Models\GeneralSetting; use App\Models\Meat; @@ -335,3 +336,28 @@ Breadcrumbs::for('bo.approaches.duplicate', function (Generator $trail, int $app $trail->parent('bo.approaches.index', $approach_type); $trail->push(Str::ucfirst(trans('crud.actions.duplicate'))); }); + +// * CONSUMPTION_MOMENTS +Breadcrumbs::for('bo.consumption_moments.index', function (Generator $trail) { + $trail->push( + Str::ucfirst(trans_choice('models.classes.consumption_moment', \INF)), + route('bo.consumption_moments.index') + ); +}); +Breadcrumbs::for('bo.consumption_moments.show', function (Generator $trail, ConsumptionMoment $consumption_moment) { + $trail->parent('bo.consumption_moments.index'); + $trail->push(Str::ucfirst(trans('crud.actions.view')), route('bo.consumption_moments.show', $consumption_moment)); +}); + +Breadcrumbs::for('bo.consumption_moments.create', function (Generator $trail) { + $trail->parent('bo.consumption_moments.index'); + $trail->push(Str::ucfirst(trans('crud.actions.create')), route('bo.consumption_moments.create')); +}); +Breadcrumbs::for('bo.consumption_moments.edit', function (Generator $trail, ConsumptionMoment $consumption_moment) { + $trail->parent('bo.consumption_moments.index'); + $trail->push(Str::ucfirst(trans('crud.actions.edit')), route('bo.consumption_moments.edit', $consumption_moment)); +}); +Breadcrumbs::for('bo.consumption_moments.duplicate', function (Generator $trail) { + $trail->parent('bo.consumption_moments.index'); + $trail->push(Str::ucfirst(trans('crud.actions.duplicate'))); +}); diff --git a/routes/web-bo.php b/routes/web-bo.php index 54453a96..46e90177 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -4,6 +4,7 @@ use App\Http\Controllers\Bo\ActivityLogController; use App\Http\Controllers\Bo\ApproachController; use App\Http\Controllers\Bo\DemarcheSlideController; use App\Http\Controllers\Bo\BrandAdvantageController; +use App\Http\Controllers\Bo\ConsumptionMomentController; use App\Http\Controllers\Bo\DashboardController; use App\Http\Controllers\Bo\GeneralSettingController; use App\Http\Controllers\Bo\KeyNumberController; @@ -223,6 +224,12 @@ Route::prefix('bo') Route::get('/approaches/json/paginate', [ApproachController::class, 'jsonPaginate']) ->name('approaches.json-paginate'); + // * CONSUMPTION MOMENT. + Route::resource('consumption_moments', ConsumptionMomentController::class); + Route::get('/consumption_moments/{consumption_moment}/duplicate', [ + ConsumptionMomentController::class, 'duplicate' + ])->name('consumption_moments.duplicate'); + Route::middleware('can:isConceptor')->group(function () { // * ACTIVITY LOGS. Route::resource('activity_logs', ActivityLogController::class)->only(['index', 'show']);