diff --git a/app/Http/Controllers/Bo/StaticPageController.php b/app/Http/Controllers/Bo/StaticPageController.php index 9d529270..084685f8 100644 --- a/app/Http/Controllers/Bo/StaticPageController.php +++ b/app/Http/Controllers/Bo/StaticPageController.php @@ -30,18 +30,18 @@ class StaticPageController extends Controller */ public function edit(StaticPage $static_page): \Illuminate\Contracts\View\View { - $isCommitmentPage = in_array( + $hasSections = in_array( $static_page->type, - StaticPageType::getCommitmentsPages() + [...StaticPageType::getCommitmentsPages(), StaticPageType::home], ); - if ($isCommitmentPage) { + if ($hasSections) { $static_page->load(['sections.blocks', 'sections.pictos']); } return view('bo.pages.static_pages.edit', [ 'staticPageModel' => $static_page, - 'isCommitmentPage' => $isCommitmentPage + 'hasSections' => $hasSections, ]); } diff --git a/app/Http/Controllers/Fo/HomeController.php b/app/Http/Controllers/Fo/HomeController.php index bbe7de14..e21c0e12 100644 --- a/app/Http/Controllers/Fo/HomeController.php +++ b/app/Http/Controllers/Fo/HomeController.php @@ -51,6 +51,8 @@ class HomeController extends Controller }); $videoModels = Video::get9PublishedHomeVideosOrderedWithProducts(); $discountsTotal = Discount::getCachedDiscounts()->sum('value'); + + $staticPageModel->load(['sections.blocks', 'sections.pictos']); return view('fo.pages.home', compact( 'staticPageModel', 'mainSlideModels', diff --git a/app/Http/Requests/Bo/Pictos/StorePictoRequest.php b/app/Http/Requests/Bo/Pictos/StorePictoRequest.php index 76a1f65f..5a22e928 100644 --- a/app/Http/Requests/Bo/Pictos/StorePictoRequest.php +++ b/app/Http/Requests/Bo/Pictos/StorePictoRequest.php @@ -13,6 +13,7 @@ use Illuminate\Http\Exceptions\HttpResponseException; class StorePictoRequest extends FormRequest { use HasPicture; + /** * Determine if the user is authorized to make this request. * @@ -49,7 +50,8 @@ class StorePictoRequest extends FormRequest 'description' => ['nullable', 'string', new WysiwygLength(5)], 'picture_alt' => 'required_with:picture|nullable|between:3,255', 'picture_title' => 'required_with:picture|nullable|between:3,255', - 'section_id' => 'required|exists:section_pages,id', + 'url' => 'nullable|url|between:3,255', + 'section_id' => 'required|exists:section_pages,id', ]; return array_merge( @@ -66,11 +68,12 @@ class StorePictoRequest extends FormRequest public function attributes() { return [ - 'title' => trans('validation.attributes.title'), + 'title' => trans('validation.attributes.title'), 'description' => trans('validation.attributes.description'), 'picture' => trans('validation.attributes.image'), 'picture_alt' => trans('validation.custom.attribute_alt'), 'picture_title' => trans('validation.custom.attribute_title'), + 'url' => trans('validation.custom.url'), ]; } diff --git a/app/Models/Picto.php b/app/Models/Picto.php index cd6b7be2..7b041ff9 100644 --- a/app/Models/Picto.php +++ b/app/Models/Picto.php @@ -21,6 +21,7 @@ class Picto extends Model 'picture', 'picture_width', 'picture_height', + 'url', 'section_id', 'order' ]; diff --git a/app/Models/SectionPage.php b/app/Models/SectionPage.php index 8cc17d1f..30a168c6 100644 --- a/app/Models/SectionPage.php +++ b/app/Models/SectionPage.php @@ -70,7 +70,7 @@ class SectionPage extends Model protected static function booted() { static::saving(function ($section) { - + $section->load('page'); if ( $section->page->type === StaticPageType::raiseSustainably && $section->name === 'section 3' diff --git a/database/migrations/2026_08_07_164042_add_data_for_homepage.php b/database/migrations/2026_08_07_164042_add_data_for_homepage.php new file mode 100644 index 00000000..840f4213 --- /dev/null +++ b/database/migrations/2026_08_07_164042_add_data_for_homepage.php @@ -0,0 +1,215 @@ + 'Section 1', + 'data' => [ + 'title' => [ + 'label' => 'Section 1 : Titre', + 'inputType' => InputType::string->value, + 'value' => 'Le Gaulois, la volaille préférée des Français', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'description' => [ + 'label' => 'Section 1 : Description', + 'inputType' => InputType::text->value, + 'value' => "
Découvrez nos produits de volailles 100% nées, élevées et préparées en France. Autant d'occasions de multiplier de bons repas et de partager de savoureux moments !
", + 'validate' => 'required|string|min:15', + 'required' => true + ], + + ], + 'blocks' => [ + 'reductionBlock' => true, + ] + ], + [ + 'name' => 'Section 2', + 'data' => [ + 'title' => [ + 'label' => 'Section 2 : Titre', + 'inputType' => InputType::string->value, + 'value' => 'Le Gaulois, une marque engagée et responsable', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + ], + 'blocks' => [ + 'has_pictos' => true, + 'max_pictos' => 5, + ] + ], + [ + 'name' => 'Section 3', + 'data' => [ + 'title' => [ + 'label' => 'Section 3 : Titre', + 'inputType' => InputType::string->value, + 'value' => 'Des recettes gourmandes', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'description' => [ + 'label' => 'Section 3 : Description', + 'inputType' => InputType::text->value, + 'value' => "Manger sain et équilibré tout en se faisant plaisir, c'est la mission de Le Gaulois !
", + 'validate' => 'required|string|min:15', + 'required' => true + ], + ], + ], + [ + 'name' => 'Section 4', + 'data' => [ + 'title' => [ + 'label' => 'Section 4 : Titre', + 'inputType' => InputType::string->value, + 'value' => 'Les actualités Le Gaulois', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'description' => [ + 'label' => 'Section 4 : Description', + 'inputType' => InputType::text->value, + 'value' => "Pour ne rien manquer des actus Le Gaulois, découvrez la vie de notre marque à travers nos évènements, nos récompenses, nos conseils ... et bien d'autres !
", + 'validate' => 'required|string|min:15', + 'required' => true + ], + ], + ], + [ + 'name' => 'Section 5', + 'data' => [ + 'title' => [ + 'label' => 'Section 5 : Titre', + 'inputType' => InputType::string->value, + 'value' => 'La chaine @legaulois', + 'validate' => 'required|string|between:3,255', + 'required' => true + ], + 'description' => [ + 'label' => 'Section 5 : Description', + 'inputType' => InputType::text->value, + 'value' => "Tout le Gaulois en vidéos, nos dernières publicités, nos recettes savoureuses, nos conseils nutrition, nos évènements sportifs avec le Tour De France ou caritatifs avec l'association Mécénat Chirurgie Cardiaque … Tout y est!
", + 'validate' => 'required|string|min:15', + 'required' => true + ], + ], + ], + ]; + } + + private function getPictos(): array + { + return [ + 'Section 2' => [ + [ + 'title' => 'Volaille 100% Française', + 'description' => 'Être la grande marque alimentaire française
', + 'picto' => 'assets/images/home/commitments/picto-volaille-francaise-blanc.svg', + 'picto_alt' => 'Pictogramme d\'une volaille française', + 'picto_title' => 'Volaille dans le territoire français', + 'url' => 'https://www.legaulois.fr/engagements/la-marque-100-francaise', + ], + [ + 'title' => 'Élever durablement', + 'description' => 'Favoriser une démarche d\'élevage durable et locale auprès de nos éleveurs et des volailles
', + 'picto' => 'assets/images/home/commitments/picto-elever-blanc.svg', + 'picto_alt' => 'Pictogramme d\'une volaille', + 'picto_title' => 'Volaille avec ses petits', + 'url' => 'https://www.legaulois.fr/engagements/elever-durablement', + ], + [ + 'title' => 'Bien nourrir', + 'description' => 'Agir sur la nutrition et la sécurité de nos produits pour satisfaire les français
', + 'picto' => 'assets/images/home/commitments/picto-bien-nourrir-blanc.svg', + 'picto_alt' => 'Pictogramme d\'une assiette', + 'picto_title' => 'Assiette avec des couverts', + 'url' => 'https://www.legaulois.fr/engagements/bien-nourrir-les-francais', + ], + [ + 'title' => 'Mieux vivre ensemble', + 'description' => 'Accompagner nos collaborateurs dans la pratique du sport
', + 'picto' => 'assets/images/home/commitments/picto-mieux-vivre-blanc.svg', + 'picto_alt' => 'Pictogramme de deux mains', + 'picto_title' => 'Serrage de mains', + 'url' => 'https://www.legaulois.fr/engagements/favoriser-le-mieux-vivre-ensemble', + ], + [ + 'title' => 'Respecter la terre', + 'description' => 'Minimiser notre empreinte carbone et agir sur le changement climatique
', + 'picto' => 'assets/images/home/commitments/picto-respect-blanc.svg', + 'picto_alt' => 'Pictogramme d\'une plante', + 'picto_title' => 'Pousse d\'une plante au creux d\'une main', + 'url' => 'https://www.legaulois.fr/engagements/respecter-la-terre', + ], + ], + ]; + } + + /** + * Run the migrations. + */ + public function up(): void + { + $page = new StaticPage(); + + $commonSection = $this->getCommonSection(StaticPageType::home); + + $data = [ + 'common_section' => $commonSection + ]; + + $staticPage = $this->createOrUpdateStaticPage( + [ + 'type' => StaticPageType::home->value, + 'seo_title' => 'Des poulets, dindes et canards, nés, élevés et préparés en France', + 'seo_description' => 'Bienvenue chez Le Gaulois ! Des volailles et éleveurs 100% français, des recettes de poulet, dinde, canard et végétarienne, et notre Club des Gaulois', + 'slug' => 'accueil', + 'data' => $data, + ], + $data, + StaticPageType::home + ); + + foreach ($this->getSections() as $sectionConfig) { + $section = $this->createOrUpdateSection($staticPage, $sectionConfig); + $this->createOrUpdateBlocks($staticPage, $section, $sectionConfig); + } + + $staticPage->load('sections'); + $this->createOrUpdatePictos($staticPage, $this->getPictos()); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + $page = StaticPage::query() + ->where('type', StaticPageType::home->value) + ->with(['sections.blocks', 'sections.pictos']) + ->first(); + + foreach ($page->sections as $section) { + $section->blocks()->delete(); + $section->pictos()->delete(); + $section->delete(); + } + $page->data = []; + $page->saveQuietly(); + } +}; diff --git a/database/migrations/2026_08_10_150322_alter_pictos_table.php b/database/migrations/2026_08_10_150322_alter_pictos_table.php new file mode 100644 index 00000000..613de3cf --- /dev/null +++ b/database/migrations/2026_08_10_150322_alter_pictos_table.php @@ -0,0 +1,28 @@ +string('url')->nullable()->comment('Picto url.')->after('picture_height'); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::table('pictos', function (Blueprint $table) { + $table->dropColumn('url'); + }); + } +}; diff --git a/resources/ts/fo/components/FilterCardsComponent.vue b/resources/ts/fo/components/FilterCardsComponent.vue index 665f424a..b81410bc 100644 --- a/resources/ts/fo/components/FilterCardsComponent.vue +++ b/resources/ts/fo/components/FilterCardsComponent.vue @@ -221,12 +221,13 @@ class="col-12 d-flex flex-column flex-md-row justify-content-center align-items-center w-75 w-md-100 mx-auto" > - {{ (legendsParameters.modelSelected) ? textsParameters.btn1Label + " " + legendsParameters.modelSelected?.label : textsParameters.btn1Label }} + {{ textsParameters.btn1Label }} ({ helperNoItems: "", helperAllItems: "", + btn1Visibility: false, btn1Label: "", + btn1Url: "", btn2Label: "", }); @@ -357,7 +362,9 @@ onMounted(() => { routeParameters.ajax = data.routeAjax; /** texts parameters. */ + textsParameters.btn1Visibility = data.texts.btn1Visibility; textsParameters.btn1Label = data.texts.btn1Label; + textsParameters.btn1Url = data.texts.btn1Url; textsParameters.btn2Label = data.texts.btn2Label; textsParameters.helperNoItems = data.texts.helperNoItems; textsParameters.helperAllItems = data.texts.helperAllItems; diff --git a/resources/views/bo/pages/pictos/form.blade.php b/resources/views/bo/pages/pictos/form.blade.php index 7e2e1e8e..42f2c3eb 100644 --- a/resources/views/bo/pages/pictos/form.blade.php +++ b/resources/views/bo/pages/pictos/form.blade.php @@ -174,6 +174,39 @@ + {{-- URL --}} +{{ __('* Champs obligatoires') }}
- {{ __('Découvrez nos produits de volailles 100% nées, élevées et préparées en France. Autant d\'occasions de multiplier de bons repas et de partager de savoureux moments !') }} + {!! clean($sectionData->description->value) !!}
- {{ __('Pour ne rien manquer des actus Le Gaulois, découvrez la vie de notre marque à travers nos évènements, nos récompenses, nos conseils ... et bien d\'autres !') }} + {!! clean($sectionData->description->value) !!}
- {{ __($text) }} + {!! clean($text) !!}