From 77b5b2f94154b7be8e391a0b9341ae6227cbde46 Mon Sep 17 00:00:00 2001 From: Nicolas Demangeat Date: Fri, 29 Mar 2024 14:19:59 +0100 Subject: [PATCH] wip crud keynumber, cant delete create show --- .../Controllers/Bo/KeyNumberController.php | 178 ++++++++++++++++++ .../Controllers/Bo/ProfessionController.php | 2 +- .../Bo/KeyNumbers/StoreKeyNumberRequest.php | 73 +++++++ .../Bo/KeyNumbers/UpdateKeyNumberRequest.php | 18 ++ app/Models/KeyNumber.php | 75 ++++++++ app/Policies/KeyNumberPolicy.php | 86 +++++++++ app/Providers/RouteServiceProvider.php | 2 + database/factories/KeyNumberFactory.php | 24 +++ .../keyNumbers/default-picture-150x150.png | Bin 0 -> 1934 bytes ..._03_27_165252_create_professions_table.php | 4 + ..._03_29_092817_create_key_numbers_table.php | 38 ++++ .../seeders/Development/KeyNumberSeeder.php | 35 ++++ database/seeders/DevelopmentSeeder.php | 4 +- resources/lang/en/models.php | 3 +- resources/lang/en/validation.php | 1 + resources/lang/fr/models.php | 1 + resources/lang/fr/validation.php | 1 + resources/ts/bo/utilities/fontawesome.ts | 2 + resources/views/bo/layouts/sidemenu.blade.php | 9 + .../bo/pages/keyNumbers/create.blade.php | 36 ++++ .../views/bo/pages/keyNumbers/edit.blade.php | 60 ++++++ .../views/bo/pages/keyNumbers/form.blade.php | 168 +++++++++++++++++ .../bo/pages/keyNumbers/index-list.blade.php | 78 ++++++++ .../views/bo/pages/keyNumbers/index.blade.php | 21 +++ .../views/bo/pages/keyNumbers/show.blade.php | 98 ++++++++++ routes/breadcrumbs-bo.php | 25 +++ routes/web-bo.php | 10 + 27 files changed, 1049 insertions(+), 3 deletions(-) create mode 100644 app/Http/Controllers/Bo/KeyNumberController.php create mode 100644 app/Http/Requests/Bo/KeyNumbers/StoreKeyNumberRequest.php create mode 100644 app/Http/Requests/Bo/KeyNumbers/UpdateKeyNumberRequest.php create mode 100644 app/Models/KeyNumber.php create mode 100644 app/Policies/KeyNumberPolicy.php create mode 100644 database/factories/KeyNumberFactory.php create mode 100644 database/factories/assets/keyNumbers/default-picture-150x150.png create mode 100644 database/migrations/2024_03_29_092817_create_key_numbers_table.php create mode 100644 database/seeders/Development/KeyNumberSeeder.php create mode 100644 resources/views/bo/pages/keyNumbers/create.blade.php create mode 100644 resources/views/bo/pages/keyNumbers/edit.blade.php create mode 100644 resources/views/bo/pages/keyNumbers/form.blade.php create mode 100644 resources/views/bo/pages/keyNumbers/index-list.blade.php create mode 100644 resources/views/bo/pages/keyNumbers/index.blade.php create mode 100644 resources/views/bo/pages/keyNumbers/show.blade.php diff --git a/app/Http/Controllers/Bo/KeyNumberController.php b/app/Http/Controllers/Bo/KeyNumberController.php new file mode 100644 index 00000000..efbd7806 --- /dev/null +++ b/app/Http/Controllers/Bo/KeyNumberController.php @@ -0,0 +1,178 @@ +authorizeResource(KeyNumber::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 $keyNumberModels */ + $keyNumberModels = KeyNumber::query(); + + /** @var string $search Search field */ + $search = $request->search; + if ($search) { + $this->searchQuery( + $keyNumberModels, + $search, + null, + 'text', + ); + } + $searchFields = \implode(', ', [ + trans('validation.attributes.text'), + ]); + + /** Sort columns with a query */ + $this->sortQuery($keyNumberModels); + + /** Custom pagination */ + $keyNumberModels = $this->paginate($keyNumberModels); + + return view('bo.pages.keyNumbers.index', compact('keyNumberModels', 'search', 'searchFields')); + } + + /** + * Show the specified resource. + * + * @param \App\Models\KeyNumber $keyNumber + * @return \Illuminate\Contracts\View\View + */ + public function show(KeyNumber $keyNumber): \Illuminate\Contracts\View\View + { + return view('bo.pages.keyNumbers.show', ['keyNumberModel' => $keyNumber]); + } + + /** + * Show the form for creating a new resource. + * + * @param \App\Models\KeyNumber $keyNumber + * @return \Illuminate\Contracts\View\View + */ + public function create(KeyNumber $keyNumber): \Illuminate\Contracts\View\View + { + return view('bo.pages.keyNumbers.create', ['keyNumberModel' => $keyNumber]); + } + + /** + * Store a newly created resource in storage. + * + * @param \App\Http\Requests\Bo\KeyNumbers\StoreKeyNumberRequest $request + * @return \Illuminate\Http\RedirectResponse + */ + public function store(StoreKeyNumberRequest $request): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($request) { + $keyNumber = new KeyNumber(); + $keyNumber->fill($request->validated()); + + if ($keyNumber->saveOrFail()) { + return redirect()->route('bo.keyNumbers.edit', $keyNumber) + ->with('success', __('crud.messages.has_been_created', [ + 'model' => Str::ucfirst(__('models.classes.keyNumber')) + ])); + } + return redirect()->back() + ->with('error', __('crud.messages.cannot_be_created', [ + 'model' => Str::ucfirst(__('models.classes.keyNumber')) + ])); + }); + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\KeyNumber $keyNumber + * @return \Illuminate\Contracts\View\View + */ + public function edit(KeyNumber $keyNumber): \Illuminate\Contracts\View\View + { + return view('bo.pages.keyNumbers.edit', ['keyNumberModel' => $keyNumber]); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Bo\KeyNumbers\UpdateKeyNumberRequest $request + * @param \App\Models\KeyNumber $keyNumber + * @return \Illuminate\Http\RedirectResponse + */ + public function update(UpdateKeyNumberRequest $request, KeyNumber $keyNumber): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($request, $keyNumber) { + $keyNumber->fill($request->validated()); + + if ($keyNumber->saveOrFail()) { + return redirect()->route('bo.keyNumbers.edit', $keyNumber) + ->with('success', __('crud.messages.has_been_updated', [ + 'model' => Str::ucfirst(__('models.classes.keyNumber')) + ])); + } + return redirect()->route('bo.keyNumbers.edit', $keyNumber) + ->with('error', __('crud.messages.cannot_be_updated', [ + 'model' => Str::ucfirst(__('models.classes.keyNumber')) + ])); + }); + } + + /** + * Remove the specified resource from storage. + * + * @param \App\Models\KeyNumber $keyNumber + * @return \Illuminate\Http\RedirectResponse + */ + public function destroy(KeyNumber $keyNumber): \Illuminate\Http\RedirectResponse + { + /** @var array */ + $previousQueries = []; + \parse_str(\parse_url(url()->previous(), \PHP_URL_QUERY), $previousQueries); + if ($keyNumber->deleteOrFail()) { + return redirect()->route('bo.keyNumbers.index', $previousQueries) + ->with('success', __('crud.messages.has_been_deleted', [ + 'model' => Str::ucfirst(__('models.classes.keyNumber')) + ])); + } + return redirect()->back() + ->with('error', __('crud.messages.cannot_be_deleted', [ + 'model' => Str::ucfirst(__('models.classes.keyNumber')) + ])); + } + + /** + * Duplicate the specified resource. + * + * @param \App\Models\KeyNumber $keyNumber + * @return \Illuminate\Contracts\View\View + */ + public function duplicate(KeyNumber $keyNumber): \Illuminate\Contracts\View\View + { + return $this->create($keyNumber->replicate()); + } +} diff --git a/app/Http/Controllers/Bo/ProfessionController.php b/app/Http/Controllers/Bo/ProfessionController.php index 406d79e6..b7dc5c1e 100644 --- a/app/Http/Controllers/Bo/ProfessionController.php +++ b/app/Http/Controllers/Bo/ProfessionController.php @@ -125,7 +125,7 @@ class ProfessionController extends Controller * Update the specified resource in storage. * * @param \App\Http\Requests\Bo\Professions\UpdateProfessionRequest $request - * @param \App\Models\Profession $profession + * @param \App\Models\Profession $profession * @return \Illuminate\Http\RedirectResponse */ public function update(UpdateProfessionRequest $request, Profession $profession): \Illuminate\Http\RedirectResponse diff --git a/app/Http/Requests/Bo/KeyNumbers/StoreKeyNumberRequest.php b/app/Http/Requests/Bo/KeyNumbers/StoreKeyNumberRequest.php new file mode 100644 index 00000000..4897e42d --- /dev/null +++ b/app/Http/Requests/Bo/KeyNumbers/StoreKeyNumberRequest.php @@ -0,0 +1,73 @@ +merge([ + 'published' => $this->boolean('published') + ]); + $this->mergePicture('picto'); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array + */ + public function rules(): array + { + $rules = [ + 'text' => 'required|string|min:3', + 'picto_alt' => 'required_with:picto|between:3,255', + 'picto_title' => 'required_with:picto|between:3,255', + 'source' => 'sometimes|string|nullable|between:3,255', + 'published' => 'required|boolean', + ]; + return \array_merge( + $rules, + $this->pictureRules('picto', 155, 155, 155, 155), + ); + } + + /** + * Get custom attributes for validator errors. + * + * @return array + */ + public function attributes(): array + { + return [ + 'text' => trans('validation.attributes.text'), + 'source' => trans('validation.attributes.text'), + 'picto' => trans('validation.attributes.image'), + 'picto_alt' => trans('validation.attributes.alt_attribute'), + 'picto_title' => trans('validation.attributes.title_attribute'), + 'published' => trans('validation.attributes.published') + ]; + } +} diff --git a/app/Http/Requests/Bo/KeyNumbers/UpdateKeyNumberRequest.php b/app/Http/Requests/Bo/KeyNumbers/UpdateKeyNumberRequest.php new file mode 100644 index 00000000..5a916bfb --- /dev/null +++ b/app/Http/Requests/Bo/KeyNumbers/UpdateKeyNumberRequest.php @@ -0,0 +1,18 @@ +route('keyNumber')); + } +} diff --git a/app/Models/KeyNumber.php b/app/Models/KeyNumber.php new file mode 100644 index 00000000..1da3eb52 --- /dev/null +++ b/app/Models/KeyNumber.php @@ -0,0 +1,75 @@ + + */ + protected $fillable = [ + 'text', + 'picto', + 'picto_alt', + 'picto_title', + 'source', + 'order', + 'published', + ]; + + /** + * Perform any actions required after the model boots. + * + * @return void + */ + protected static function booted(): void + { + static::creating(function (self $keyNumber) { + self::setOrder($keyNumber); + $keyNumber->picto = FileStorageHelper::storeFile($keyNumber, $keyNumber->picto, true); + }); + static::updating(function (self $keyNumber) { + $keyNumber->picto = FileStorageHelper::storeFile($keyNumber, $keyNumber->picto, true); + }); + static::updated(function (self $keyNumber) { + FileStorageHelper::removeOldFile($keyNumber, 'picto'); + }); + static::deleted(function (self $keyNumber) { + FileStorageHelper::removeFile($keyNumber, 'picto'); + }); + } + + // * METHODS + + /** + * Set order after the last element of the list. + * + * @param self $model + * @return void + */ + private static function setOrder(self $model): void + { + $model->order = \intval(self::query()->max('order')) + 1; + } +} diff --git a/app/Policies/KeyNumberPolicy.php b/app/Policies/KeyNumberPolicy.php new file mode 100644 index 00000000..90429988 --- /dev/null +++ b/app/Policies/KeyNumberPolicy.php @@ -0,0 +1,86 @@ + + */ + public function definition() + { + return [ + 'text' => fake()->sentence(), + 'picto_alt' => fake()->sentence(), + 'picto_title' => fake()->sentence(), + 'source' => fake()->sentence(), + 'published' => fake()->boolean(75), + ]; + } +} diff --git a/database/factories/assets/keyNumbers/default-picture-150x150.png b/database/factories/assets/keyNumbers/default-picture-150x150.png new file mode 100644 index 0000000000000000000000000000000000000000..1c9171a03bdaa0cee8bbbad94be5acac2373d4e2 GIT binary patch literal 1934 zcmeHI`#Tc~7#{VcC=^jc9NIyWb#}_bG$9nt)LiDw?btbPOA4W|xAqyqp3Cf}d~xK+6g0MI*lBVe~s}0bhhV5ql?5liNAx7AD%YI^AwaurVgsZTP|b3u@AV(-TnFbVjfcn5Qr=nuMbrD7J%tAgSm zsN|pfy{S@uTdLqDB%xji=1R0JYDe%h!;SD1(yDTwsMzOXOq|MZv4vqPE9zys3RNP3($?pB3p((rasqq}CN8bDadi%CHjA+eKj(lYS(BG^J(|th zabjKu&^Zef3iq_Iuz*lyuL>;$Z*IHVi_0r260Y{Tw_Kc%cEZ$_$!G*Xm>YpI7F2IcPnl1gXQl06xOtN8WT}%$DJLa>QRdo z6YnSpSNeTX=Jcz{3=~Tawc}dSc6elg#bC1+`*tZnNzigcgb$*IuIVeWhd{f^nqwt? zyH5D*-eW#I+}_&SS~o#j`ZBptnamHaVpAr01Mh9(-fSlSFvzG+yz^w{3DdOsAO~-} zGJ0l6v(-RT$hhCyX;#Dr?Z@`#(OJkzl!LzxChAc*^4CJceXE?~zUXu@9d%>=BAVQM zQ{UVsj4uleh8m}RDP#CyPWQC!DKO&>A=C_>@$;o#mi~*K8iz3Dr>) z>KbkV+iJ*ses?r7h#fe6zDOAC`8Cz{D2bU@)fWybEkLqxJ64ysyTo)=T0Z92id(); + $table->string('picto')->comment('Picto path.'); + $table->string('picto_alt')->comment('Picto alt attribute.'); + $table->string('picto_title')->comment('Picto title attribute.'); + $table->string('text')->comment('Picto legend.'); + $table->string('source')->comment('Text origin.'); + $table->integer('order')->comment('Display order bo.'); + $table->boolean('published')->comment('Picto publish status.'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('key_numbers'); + } +}; diff --git a/database/seeders/Development/KeyNumberSeeder.php b/database/seeders/Development/KeyNumberSeeder.php new file mode 100644 index 00000000..d92c2a3d --- /dev/null +++ b/database/seeders/Development/KeyNumberSeeder.php @@ -0,0 +1,35 @@ +make()->each(function (KeyNumber $keyNumber) { + $keyNumber->picto = FileStorageHelper::storeFile( + $keyNumber, + new \SplFileInfo(\resource_path( + '../database/factories/assets/keyNumbers/default-picture-150x150.png' + )) + ); + $keyNumber->save(); + }); + } +} diff --git a/database/seeders/DevelopmentSeeder.php b/database/seeders/DevelopmentSeeder.php index b0630c35..8cd45f38 100644 --- a/database/seeders/DevelopmentSeeder.php +++ b/database/seeders/DevelopmentSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use Database\Seeders\Development\KeyNumberSeeder; use Database\Seeders\Development\ProfessionSeeder; use Database\Seeders\Development\UserSeeder; use Illuminate\Database\Seeder; @@ -17,7 +18,8 @@ class DevelopmentSeeder extends Seeder { $this->call([ UserSeeder::class, - ProfessionSeeder::class + ProfessionSeeder::class, + KeyNumberSeeder::class ]); } } diff --git a/resources/lang/en/models.php b/resources/lang/en/models.php index a709346e..e04a0c6c 100644 --- a/resources/lang/en/models.php +++ b/resources/lang/en/models.php @@ -4,6 +4,7 @@ return [ 'classes' => [ 'user' => 'user', 'activity_log' => 'activity log|activity logs', - 'static_page' => 'static page|static pages', + 'static_page' => 'static page|static pages', + 'keyNumber' => 'Key number' ] ]; diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index a2bcbb22..042cf739 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -198,6 +198,7 @@ return [ 'sex' => 'sex', 'short_text' => 'short text', 'size' => 'size', + 'source' => 'text source', 'state' => 'state', 'street' => 'street', 'student' => 'student', diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index 4007c246..ca56a790 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -6,5 +6,6 @@ return [ 'activity_log' => 'journal d\'activité|journaux d\'activité', 'static_page' => 'page statique|pages statiques', 'profession' => 'profession', + 'keyNumber' => 'Chiffre clé' ] ]; diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php index 7fb328bd..59d2d071 100644 --- a/resources/lang/fr/validation.php +++ b/resources/lang/fr/validation.php @@ -198,6 +198,7 @@ return [ 'sex' => 'sexe', 'short_text' => 'texte court', 'size' => 'taille', + 'source' => 'source du text', 'state' => 'état', 'street' => 'rue', 'student' => 'étudiant', diff --git a/resources/ts/bo/utilities/fontawesome.ts b/resources/ts/bo/utilities/fontawesome.ts index 96089a9a..4c6c7190 100644 --- a/resources/ts/bo/utilities/fontawesome.ts +++ b/resources/ts/bo/utilities/fontawesome.ts @@ -29,6 +29,7 @@ import { faFile, faFolderOpen, faHouse, + faKey, faListUl, faPaintRoller, faPencil, @@ -48,6 +49,7 @@ import { config.autoReplaceSvg = false; library.add(faEraser); +library.add(faKey); library.add(faArrowLeftLong); library.add(faPlus); library.add(faTrash); diff --git a/resources/views/bo/layouts/sidemenu.blade.php b/resources/views/bo/layouts/sidemenu.blade.php index a727fe0c..3d5e2d09 100644 --- a/resources/views/bo/layouts/sidemenu.blade.php +++ b/resources/views/bo/layouts/sidemenu.blade.php @@ -27,6 +27,15 @@ ])>  {{ str(__('models.classes.profession'))->title() }} + {{-- KEYNUMBERS --}} + request()->routeIs('bo.keyNumbers.*'), + ])> +  {{ str(__('models.classes.keyNumber'))->title() }} + @endauth diff --git a/resources/views/bo/pages/keyNumbers/create.blade.php b/resources/views/bo/pages/keyNumbers/create.blade.php new file mode 100644 index 00000000..51a36102 --- /dev/null +++ b/resources/views/bo/pages/keyNumbers/create.blade.php @@ -0,0 +1,36 @@ +@extends('bo.layout', ['brParam' => $keyNumberModel]) + +@section('title', __('Création d\'une :model', ['model' => __('models.classes.keyNumber')])) +@section('description', __('Création d\'une tout nouveau :model', ['model' => __('models.classes.keyNumber')])) +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+ + + + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $keyNumberModel]) +
+
+ +
+
+
+ @csrf + @include('bo.pages.keyNumbers.form') + @include('bo.partials.script-button-clone') +
+
+ +
+
+
+@endsection diff --git a/resources/views/bo/pages/keyNumbers/edit.blade.php b/resources/views/bo/pages/keyNumbers/edit.blade.php new file mode 100644 index 00000000..6dbe66b7 --- /dev/null +++ b/resources/views/bo/pages/keyNumbers/edit.blade.php @@ -0,0 +1,60 @@ +@extends('bo.layout', ['brParam' => $keyNumberModel]) + +@section('title', __('Édition d\'une :model', ['model' => __('models.classes.keyNumber')])) +@section('description', __('Édition d\'une :model déjà existant', ['model' => __('models.classes.keyNumber')])) +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+ + + + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $keyNumberModel]) +
+
+
+ @can('view', $keyNumberModel) + + + + @endcan + @can('duplicate', $keyNumberModel) + + + + @endcan + + @can('delete', $keyNumberModel) + @csrf + @method('DELETE') + + @endcan +
+
+
+
+ @csrf + @method('PUT') + @include('bo.pages.keyNumbers.form') + @include('bo.partials.script-button-clone') +
+
+ +
+
+
+@endsection diff --git a/resources/views/bo/pages/keyNumbers/form.blade.php b/resources/views/bo/pages/keyNumbers/form.blade.php new file mode 100644 index 00000000..830bd5f5 --- /dev/null +++ b/resources/views/bo/pages/keyNumbers/form.blade.php @@ -0,0 +1,168 @@ +
+ {{-- PICTO --}} +
+
+ {{ str(__('validation.attributes.image'))->ucFirst() }} +
+ {{-- PICTO_ALT --}} +
+ @include('bo.partials.inputs.varchar', [ + 'id' => 'keyNumberPictoAlt', + 'label' => __(':field1 :inter1:field2 :inter2:model', [ + 'field1' => str(__('validation.custom.attribute_alt'))->ucFirst(), + 'inter1' => __('validation.custom.of_the.vowel'), + 'field2' => __('validation.attributes.image'), + 'inter2' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.keyNumber'), + ]), + 'hasWordCounter' => true, + 'name' => 'picto_alt', + 'required' => true, + 'model' => $keyNumberModel ?? null, + 'helper' => __('crud.minicrud.picture_alt_helper'), + 'placeholder' => __(':field1 :inter1:field2 :inter2:model', [ + 'field1' => str(__('validation.custom.attribute_alt'))->ucFirst(), + 'inter1' => __('validation.custom.of_the.vowel'), + 'field2' => __('validation.attributes.image'), + 'inter2' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.keyNumber'), + ]), + ]) +
+ {{-- PICTO_TITLE --}} +
+ @include('bo.partials.inputs.varchar', [ + 'id' => 'keyNumberPictoTitle', + 'label' => __(':field1 :inter1:field2 :inter2:model', [ + 'field1' => str(__('validation.custom.attribute_title'))->ucFirst(), + 'inter1' => __('validation.custom.of_the.vowel'), + 'field2' => __('validation.attributes.image'), + 'inter2' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.keyNumber'), + ]), + 'hasWordCounter' => true, + 'name' => 'picto_title', + 'required' => true, + 'model' => $keyNumberModel ?? null, + 'helper' => __('crud.minicrud.picture_title_helper'), + 'placeholder' => __(':field1 :inter1:field2 :inter2:model', [ + 'field1' => str(__('validation.custom.attribute_title'))->ucFirst(), + 'inter1' => __('validation.custom.of_the.vowel'), + 'field2' => __('validation.attributes.image'), + 'inter2' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.keyNumber'), + ]), + ]) +
+ {{-- PICTO --}} +
+ @include('bo.partials.inputs.varchar-picture', [ + 'id' => 'keyNumberPicto', + 'name' => 'picto', + 'width' => 155, + 'height' => 155, + 'model' => $keyNumberModel ?? null, + 'helper' => __('crud.minicrud.dimensions_must_be', [ + 'widthpx' => '155px', + 'heightpx' => '155px', + ]), + 'required' => true, + 'preview' => true, + ]) +
+
+
+
+ {{-- TEXT --}} +
+
+ {{ str(__('validation.attributes.result_text_under_image'))->ucFirst() }} +
+
+ @include('bo.partials.inputs.varchar', [ + 'id' => 'keyNumberText', + 'label' => __(':field :inter:model', [ + 'field' => str(__('validation.attributes.result_text_under_image'))->ucFirst(), + 'inter' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.keyNumber'), + ]), + 'hasWordCounter' => true, + 'name' => 'text', + 'required' => true, + 'model' => $keyNumberModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __(':field :inter:model', [ + 'field' => __('validation.attributes.result_text_under_image'), + 'inter' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.keyNumber'), + ]), + 'min' => 3, + 'max' => 255, + ]), + 'placeholder' => __(':field :inter:model', [ + 'field' => str(__('validation.attributes.result_text_under_image'))->ucFirst(), + 'inter' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.keyNumber'), + ]), + ]) +
+
+
+
+ {{-- SOURCE --}} +
+
+ {{ str(__('validation.attributes.text'))->ucFirst() }} +
+
+ @include('bo.partials.inputs.varchar', [ + 'id' => 'keyNumberSource', + 'label' => __(':field :inter:model', [ + 'field' => str(__('validation.attributes.source'))->ucFirst(), + 'inter' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.keyNumber'), + ]), + 'hasWordCounter' => true, + 'name' => 'source', + 'required' => true, + 'model' => $keyNumberModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __(':field :inter:model', [ + 'field' => __('validation.attributes.source'), + 'inter' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.keyNumber'), + ]), + 'min' => 3, + 'max' => 255, + ]), + 'placeholder' => __(':field :inter:model', [ + 'field' => str(__('validation.attributes.source'))->ucFirst(), + 'inter' => __('validation.custom.of_the.male'), + 'model' => __('models.classes.keyNumber'), + ]), + ]) +
+
+
+
+ {{-- PUBLISHED --}} +
+
+ {{ __('crud.minicrud.visibility_label') }} +
+
+ @include('bo.partials.inputs.tinyint-boolean', [ + 'id' => 'keyNumberPublished', + 'name' => 'published', + 'model' => $keyNumberModel ?? null, + 'label' => __('crud.minicrud.visibility_label'), + 'helper' => __('crud.minicrud.visibility_helper'), + ]) +
+
+
+
+
+

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

+
+
diff --git a/resources/views/bo/pages/keyNumbers/index-list.blade.php b/resources/views/bo/pages/keyNumbers/index-list.blade.php new file mode 100644 index 00000000..3a3f8257 --- /dev/null +++ b/resources/views/bo/pages/keyNumbers/index-list.blade.php @@ -0,0 +1,78 @@ + + @if (count($keyNumberModels) > 0) + + @include('bo.modules.table-col-sorter', [ + 'cols' => [ + 'text' => str(__('validation.attributes.text'))->ucfirst(), + 'picto' => str(__('validation.attributes.image'))->ucfirst(), + 'published' => str(__('validation.custom.published'))->ucfirst(), + 'updated_at' => str(__('validation.attributes.updated_at'))->ucfirst(), + ], + ]) + + + @foreach ($keyNumberModels as $keyNumberModel) + + + + @include('bo.modules.change-published-status', [ + 'routeName' => 'keyNumbers', + 'model' => $keyNumberModel, + ]) + + + + @endforeach + + @else + + + + @endif +
{{ $keyNumberModel->text }} + {{ $keyNumberModel->picto_alt }} + + {{ $keyNumberModel->updated_at->isoFormat('LLLL') }} + + @canAny(['show', 'duplicate', 'update', 'delete'], $keyNumberModel) +
+ @can('view', $keyNumberModel) + + + + @endcan + @can('duplicate', $keyNumberModel) + + + + @endcan + @can('update', $keyNumberModel) + + + + @endcan + @can('delete', $keyNumberModel) + @csrf + @method('DELETE') + + @endcan +
+ @else + + + + @endcan +
+ {{ trans_choice('crud.other.no_model_found', 1, ['model' => __('models.classes.keyNumber')]) }} +
diff --git a/resources/views/bo/pages/keyNumbers/index.blade.php b/resources/views/bo/pages/keyNumbers/index.blade.php new file mode 100644 index 00000000..ea05fd88 --- /dev/null +++ b/resources/views/bo/pages/keyNumbers/index.blade.php @@ -0,0 +1,21 @@ +@extends('bo.layout') + +@section('title', str(__('models.classes.keyNumber'))->ucfirst()->plural()) +@section('description', __('Liste de tous les :model', ['model' => str(__('models.classes.keyNumber'))->plural()])) + +@section('content') +
+ @include('modules.breadcrumbs.breadcrumb-body') + @can('create', \App\Models\KeyNumber::class) + + + + @endcan +
+ @include('bo.modules.search-bar') +
+ @include('bo.pages.keyNumbers.index-list') +
+ {{ $keyNumberModels->links() }} +@endsection diff --git a/resources/views/bo/pages/keyNumbers/show.blade.php b/resources/views/bo/pages/keyNumbers/show.blade.php new file mode 100644 index 00000000..a3792d69 --- /dev/null +++ b/resources/views/bo/pages/keyNumbers/show.blade.php @@ -0,0 +1,98 @@ +@extends('bo.layout', ['brParam' => $keyNumberModel]) + +@section('title', __('Aperçu d\'un :model', ['model' => __('models.classes.keyNumber')])) +@section('description', __('Aperçu d\'un :model déjà existante', ['model' => __('models.classes.keyNumber')])) +@section('breadcrumb', request()->route()->getName()) + +@section('content') +
+
+ + + + @include('modules.breadcrumbs.breadcrumb-body', ['brParam' => $keyNumberModel]) +
+ @canAny(['duplicate', 'update', 'delete'], $keyNumberModel) +
+ @can('duplicate', $keyNumberModel) + + + + @endcan + @can('update', $keyNumberModel) + + + + @endcan + @can('delete', $keyNumberModel) + @csrf + @method('DELETE') + + @endcan +
+ @endcan +
+
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + +
{{ str(__('validation.attributes.text'))->ucFirst() }} + {{ $keyNumberModel->text }} +
{{ str(__('validation.attributes.image'))->ucFirst() }} + {{ $keyNumberModel->picto_alt }} +
{{ str(__('validation.custom.source'))->ucFirst() }} + {{ $keyNumberModel->source }} +
+ {{ str(__('validation.custom.published'))->ucFirst() }} + + {{ $keyNumberModel->published + ? str($keyNumberModel->created_at->isoFormat('LLLL'))->ucFirst() + : __('bo_other_model_not_published', [ + 'model' => str(__('models.keyNumber'))->ucFirst(), + ]) }} +
{{ str(__('validation.attributes.created_at'))->ucFirst() }} + {{ str($keyNumberModel->created_at->isoFormat('LLLL'))->ucFirst() }} +
{{ str(__('validation.attributes.updated_at'))->ucFirst() }} + {{ str($keyNumberModel->updated_at->isoFormat('LLLL'))->ucFirst() }} +
+
+
+
+@endsection diff --git a/routes/breadcrumbs-bo.php b/routes/breadcrumbs-bo.php index 0e2012c8..84cf602c 100644 --- a/routes/breadcrumbs-bo.php +++ b/routes/breadcrumbs-bo.php @@ -1,6 +1,7 @@ push(Str::ucfirst(trans('crud.actions.duplicate'))); }); +// * KEYNUMBERS +Breadcrumbs::for('bo.keyNumbers.index', function (Generator $trail) { + $trail->push( + Str::of(trans('models.classes.keyNumber'))->plural()->ucfirst(), + route('bo.keyNumbers.index') + ); +}); +Breadcrumbs::for('bo.keyNumbers.show', function (Generator $trail, KeyNumber $keyNumber) { + $trail->parent('bo.keyNumbers.index'); + $trail->push(Str::ucfirst(trans('crud.actions.view')), route('bo.keyNumbers.show', $keyNumber)); +}); +Breadcrumbs::for('bo.keyNumbers.create', function (Generator $trail) { + $trail->parent('bo.keyNumbers.index'); + $trail->push(Str::ucfirst(trans('crud.actions.create')), route('bo.keyNumbers.create')); +}); +Breadcrumbs::for('bo.keyNumbers.edit', function (Generator $trail, KeyNumber $keyNumber) { + $trail->parent('bo.keyNumbers.index'); + $trail->push(Str::ucfirst(trans('crud.actions.edit')), route('bo.keyNumbers.edit', $keyNumber)); +}); +Breadcrumbs::for('bo.keyNumbers.duplicate', function (Generator $trail) { + $trail->parent('bo.keyNumbers.index'); + $trail->push(Str::ucfirst(trans('crud.actions.duplicate'))); +}); + // * ACTIVITY_LOGS Breadcrumbs::for('bo.activity_logs.index', function (Generator $trail) { $trail->push( diff --git a/routes/web-bo.php b/routes/web-bo.php index f9908391..fce0468f 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -2,6 +2,7 @@ use App\Http\Controllers\Bo\ActivityLogController; use App\Http\Controllers\Bo\DashboardController; +use App\Http\Controllers\Bo\KeyNumberController; use App\Http\Controllers\Bo\ProfessionController; use App\Http\Controllers\Bo\StaticPageController; use App\Http\Controllers\Bo\UserController; @@ -56,6 +57,15 @@ Route::prefix('bo') ProfessionController::class, 'duplicate' ])->name('professions.duplicate'); + // * KEYNUMBERS. + Route::resource('keyNumbers', KeyNumberController::class); + Route::patch('/keyNumbers/{keyNumber}/change-published', [ + KeyNumberController::class, 'changePublished' + ])->name('keyNumbers.change-published'); + Route::get('/keyNumbers/{keyNumber}/duplicate', [ + KeyNumberController::class, 'duplicate' + ])->name('keyNumbers.duplicate'); + Route::middleware('can:isConceptor')->group(function () { // * ACTIVITY LOGS. Route::resource('activity_logs', ActivityLogController::class)->only(['index', 'show']);