diff --git a/app/Enums/CkEditorConfigName.php b/app/Enums/CkEditorConfigName.php
index b0ac3d1..5930111 100644
--- a/app/Enums/CkEditorConfigName.php
+++ b/app/Enums/CkEditorConfigName.php
@@ -8,9 +8,8 @@ enum CkEditorConfigName: int
{
use BaseEnum;
- case minimal = 1;
- case base = 2;
- case advanced = 3;
+ case minimal = 1;
+ case basic = 2;
/**
* Optionnal labels definition.
@@ -19,7 +18,6 @@ enum CkEditorConfigName: int
*/
private const LABELS = [
self::minimal->name => 'minimal',
- self::base->name => 'base',
- self::advanced->name => 'advanced',
+ self::basic->name => 'basic',
];
}
diff --git a/app/Enums/Slides/SliderTypeEnum.php b/app/Enums/Slides/SliderTypeEnum.php
index 9be5739..f7f1899 100644
--- a/app/Enums/Slides/SliderTypeEnum.php
+++ b/app/Enums/Slides/SliderTypeEnum.php
@@ -11,6 +11,7 @@ enum SliderTypeEnum: int
case home = 1;
case better_life = 2;
case respect_earth = 3;
+ case team = 4;
/**
* Optionnal labels definition.
@@ -21,5 +22,6 @@ enum SliderTypeEnum: int
self::home->name => 'Accueil',
self::better_life->name => 'Mieux vivre',
self::respect_earth->name => 'Respecter la terre',
+ self::team->name => 'Nous rejoindre',
];
}
diff --git a/app/Http/Controllers/Fo/StaticPageController.php b/app/Http/Controllers/Fo/StaticPageController.php
index 1fe69bb..66415df 100644
--- a/app/Http/Controllers/Fo/StaticPageController.php
+++ b/app/Http/Controllers/Fo/StaticPageController.php
@@ -48,6 +48,7 @@ class StaticPageController extends Controller
$ambitionSection = $sectionModels->where('section', PageSectionEnum::home_ambition)->first();
$teamSection = $sectionModels->where('section', PageSectionEnum::home_team)->first();
$lifeSection = $sectionModels->where('section', PageSectionEnum::home_life)->first();
+ $slideTeams = Slide::query()->where('type', SliderTypeEnum::team)->get();
return view('fo.pages.home', compact(
'staticPageModel',
@@ -59,6 +60,7 @@ class StaticPageController extends Controller
'ambitionSection',
'teamSection',
'lifeSection',
+ 'slideTeams',
));
}
diff --git a/app/Http/Requests/Bo/Slides/StoreSlideRequest.php b/app/Http/Requests/Bo/Slides/StoreSlideRequest.php
index c69d2e3..d35bacd 100644
--- a/app/Http/Requests/Bo/Slides/StoreSlideRequest.php
+++ b/app/Http/Requests/Bo/Slides/StoreSlideRequest.php
@@ -3,6 +3,7 @@
namespace App\Http\Requests\Bo\Slides;
use App\Enums\Slides\SliderTypeEnum;
+use App\Rules\WysiwygLength;
use App\Traits\Requests\HasPicture;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Rules\Enum;
@@ -30,7 +31,7 @@ class StoreSlideRequest extends FormRequest
{
$this->merge([
'button_status' => $this->boolean('button_status'),
- 'button_new_tab' => $this->boolean('button_new_tab')
+ 'button_new_tab' => $this->boolean('button_new_tab'),
]);
$this->mergePicture('picture');
}
@@ -54,19 +55,31 @@ class StoreSlideRequest extends FormRequest
'between:3,255'
],
'content' => [
- 'required_if:type,' . SliderTypeEnum::home->value(),
+ 'required_if:type,' . SliderTypeEnum::home->value() . ', ' . SliderTypeEnum::team->value(),
+ 'nullable',
+ 'string',
+ new WysiwygLength(3, 275),
+ 'max:500'
+ ],
+ 'video_id' => 'nullable|string|regex:%([^"&?\/\s]{11})%i',
+ 'picture_alt' => [
+ 'required_unless:type,' . SliderTypeEnum::team->value(),
+ 'nullable',
+ 'string',
+ 'between:3,255'
+ ],
+ 'picture_title' => [
+ 'required_unless:type,' . SliderTypeEnum::team->value(),
'nullable',
'string',
'between:3,255'
],
- 'video_id' => 'nullable|string|regex:%([^"&?\/\s]{11})%i',
- 'picture_alt' => 'required|string|between:3,255',
- 'picture_title' => 'required|string|between:3,255',
'button_label' => 'required_if:button_status,true|nullable|string|between:3,35',
'button_url' => 'required_if:button_status,true|nullable|string|between:3,255',
'button_status' => [
- 'required_unless:type,' . SliderTypeEnum::home->value(),
- 'nullable', 'boolean'
+ 'required_unless:type,' . SliderTypeEnum::home->value() . ', ' . SliderTypeEnum::team->value(),
+ 'nullable',
+ 'boolean'
],
'button_new_tab' => 'required|boolean',
];
@@ -106,18 +119,22 @@ class StoreSlideRequest extends FormRequest
public function messages(): array
{
return [
- 'title' => [
- 'required_unless' => __('Le champ :attribute est obligatoire si le slider n\'est pas :name.', [
- 'attribute' => trans('validation.attributes.title'),
- 'name' => SliderTypeEnum::home->label()
- ]),
- ],
- 'content' => [
- 'required_unless' => __('Le champ :attribute est obligatoire si le slider n\'est pas :name.', [
+ 'title.required_unless' => __('Le champ :attribute est obligatoire si le slider n\'est pas :name.', [
+ 'attribute' => trans('validation.attributes.title'),
+ 'name' => SliderTypeEnum::home->label()
+ ]),
+ 'content.required_if' => __('Le champ :attribute est obligatoire si le slider est :name1 ou :name2.', [
+ 'attribute' => trans('validation.attributes.content'),
+ 'name1' => SliderTypeEnum::home->label(),
+ 'name2' => SliderTypeEnum::team->label()
+ ]),
+ 'content.max' => __(
+ 'Le champ :attribute ne peut pas contenir plus de :max caractères (balises incluses).',
+ [
'attribute' => trans('validation.attributes.content'),
- 'name' => SliderTypeEnum::home->label()
- ]),
- ]
+ 'max' => '500',
+ ]
+ ),
];
}
}
diff --git a/app/Models/Slide.php b/app/Models/Slide.php
index 58c2421..5acd49a 100644
--- a/app/Models/Slide.php
+++ b/app/Models/Slide.php
@@ -7,6 +7,7 @@ use App\Lib\Helpers\FileStorageHelper;
use App\Traits\Models\ActivityLog;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
+use Illuminate\Validation\ValidationException;
/**
* @property \App\Enums\Slides\SliderTypeEnum $type Slide type.
@@ -30,6 +31,12 @@ class Slide extends Model
use ActivityLog;
use HasFactory;
+ /** @var integer Minimum number of published slides */
+ private static int $min = 1;
+
+ /** @var integer Maximum number of published slides */
+ private static int $max = 3;
+
/**
* The attributes that are mass assignable.
*
@@ -68,6 +75,14 @@ class Slide extends Model
protected static function booted(): void
{
static::creating(function (self $model) {
+ if (
+ $model->type === SliderTypeEnum::team &&
+ self::query()->where('type', SliderTypeEnum::team)->count() + 1 > $model::getMaxPublished()
+ ) {
+ throw ValidationException::withMessages([
+ 'slide' => 'Il ne peut y avoir que 3 slides en même temps.'
+ ]);
+ }
self::manageFields($model);
});
static::updating(function (self $model) {
@@ -76,6 +91,16 @@ class Slide extends Model
static::updated(function (self $model) {
FileStorageHelper::removeOldFile($model, 'picture');
});
+ static::deleting(function (self $model) {
+ if (
+ $model->type === SliderTypeEnum::team &&
+ self::query()->where('type', SliderTypeEnum::team)->count() - 1 < $model::getMinPublished()
+ ) {
+ throw ValidationException::withMessages([
+ 'slide' => 'Il doit y avoir au mininmum 1 slide d\'active.'
+ ]);
+ }
+ });
static::deleted(function (self $model) {
FileStorageHelper::removeFile($model, 'picture');
});
@@ -93,4 +118,24 @@ class Slide extends Model
{
$model->picture = FileStorageHelper::storeFile($model, $model->picture, true);
}
+
+ /**
+ * Getter for the $min property.
+ *
+ * @return integer
+ */
+ public static function getMinPublished(): int
+ {
+ return self::$min;
+ }
+
+ /**
+ * Getter for the $max property.
+ *
+ * @return integer
+ */
+ public static function getMaxPublished(): int
+ {
+ return self::$max;
+ }
}
diff --git a/composer.json b/composer.json
index 5116c9d..cf6bd09 100644
--- a/composer.json
+++ b/composer.json
@@ -29,7 +29,6 @@
"require-dev": {
"fakerphp/faker": "^1.9.1",
"kitloong/laravel-migrations-generator": "^6.8",
- "krlove/eloquent-model-generator": "dev-l10-compatibility",
"larastan/larastan": "^2.9",
"laravel-lang/common": "^4.0",
"laravel/pint": "^1.0",
diff --git a/composer.lock b/composer.lock
index 5d7d36d..194277c 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "c06d9627a9b3a3aedb38f936fcf50b9a",
+ "content-hash": "7e2effeafd1cbae360198092b1705a40",
"packages": [
{
"name": "axlon/laravel-postal-code-validation",
@@ -8759,90 +8759,6 @@
],
"time": "2024-02-06T14:42:33+00:00"
},
- {
- "name": "krlove/code-generator",
- "version": "1.0.1",
- "source": {
- "type": "git",
- "url": "https://github.com/krlove/code-generator.git",
- "reference": "1ac521f5ef79a376282e3315ba6a13a83c63fb9a"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/krlove/code-generator/zipball/1ac521f5ef79a376282e3315ba6a13a83c63fb9a",
- "reference": "1ac521f5ef79a376282e3315ba6a13a83c63fb9a",
- "shasum": ""
- },
- "type": "library",
- "autoload": {
- "psr-4": {
- "Krlove\\CodeGenerator\\": "src/"
- }
- },
- "notification-url": "https://packagist.org/downloads/",
- "license": [
- "MIT"
- ],
- "description": "Code Generator",
- "support": {
- "issues": "https://github.com/krlove/code-generator/issues",
- "source": "https://github.com/krlove/code-generator/tree/1.0.1"
- },
- "time": "2022-02-20T12:24:22+00:00"
- },
- {
- "name": "krlove/eloquent-model-generator",
- "version": "dev-l10-compatibility",
- "source": {
- "type": "git",
- "url": "https://github.com/laravel-shift/eloquent-model-generator.git",
- "reference": "d8f0280de04d85cf2991e5a5dd317f5dea239d95"
- },
- "dist": {
- "type": "zip",
- "url": "https://api.github.com/repos/laravel-shift/eloquent-model-generator/zipball/d8f0280de04d85cf2991e5a5dd317f5dea239d95",
- "reference": "d8f0280de04d85cf2991e5a5dd317f5dea239d95",
- "shasum": ""
- },
- "require": {
- "doctrine/dbal": "^3.5",
- "illuminate/config": "^10.0",
- "illuminate/console": "^10.0",
- "illuminate/database": "^10.0",
- "illuminate/support": "^10.0",
- "krlove/code-generator": "^1.0",
- "php": "^8.1"
- },
- "require-dev": {
- "phpunit/phpunit": "^9.5.10"
- },
- "type": "library",
- "extra": {
- "laravel": {
- "providers": [
- "Krlove\\EloquentModelGenerator\\Provider\\GeneratorServiceProvider"
- ]
- }
- },
- "autoload": {
- "psr-4": {
- "Krlove\\EloquentModelGenerator\\": "src/"
- }
- },
- "autoload-dev": {
- "psr-4": {
- "Krlove\\Tests\\Integration\\": "tests/integration"
- }
- },
- "license": [
- "MIT"
- ],
- "description": "Eloquent Model Generator",
- "support": {
- "source": "https://github.com/laravel-shift/eloquent-model-generator/tree/l10-compatibility"
- },
- "time": "2023-01-30T20:15:06+00:00"
- },
{
"name": "larastan/larastan",
"version": "v2.9.12",
@@ -12374,9 +12290,7 @@
],
"aliases": [],
"minimum-stability": "stable",
- "stability-flags": {
- "krlove/eloquent-model-generator": 20
- },
+ "stability-flags": [],
"prefer-stable": true,
"prefer-lowest": false,
"platform": {
diff --git a/database/migrations/2024_08_02_155528_update_slides_table.php b/database/migrations/2024_08_02_155528_update_slides_table.php
new file mode 100644
index 0000000..cd7c757
--- /dev/null
+++ b/database/migrations/2024_08_02_155528_update_slides_table.php
@@ -0,0 +1,72 @@
+string('content', 500)->nullable()->comment('Slide content.')->change();
+ $table->string('picture')->nullable()->comment('Slide picture path.')->change();
+ $table->string('picture_alt')->nullable()->comment('Slide picture alt attribute.')->change();
+ $table->string('picture_title')->nullable()->comment('Slide picture title attribute.')->change();
+ $table->boolean('button_status')->default(0)->comment('Slide button status.')->change();
+ $table->boolean('button_new_tab')->default(0)->comment('Open the slide button url in a new tab.')->change();
+ });
+
+ if (Slide::query()->where('type', SliderTypeEnum::team)->count() === 0) {
+ // phpcs:disable Generic.Files.LineLength.TooLong
+ $datas = [
+ [
+ 'title' => 'Culture d’entreprise inclusive et collaborative :',
+ 'content' => 'Notre entreprise valorise la diversité des perspectives et favorise un environnement où chacun se sent écouté et respecté. Nous croyons en la force de la collaboration et encourageons l’innovation à tous les niveaux.',
+ ],
+ [
+ 'title' => 'Opportunités de développement professionnel :',
+ 'content' => 'En nous rejoignant, vous aurez accès à des programmes de formation et de développement pour renforcer vos compétences et progresser dans votre carrière. Nous encourageons la croissance personnelle et professionnelle de nos employés.',
+ ],
+ [
+ 'title' => 'Implication dans des projets innovants :',
+ 'content' => 'Nous travaillons sur des projets stimulants et innovants qui offre l’opportunité de faire une réelle différence pour les consommateurs. Rejoindre notre équipe vous permettra de contribuer à des initiatives passionnantes et impactantes.
Et en plus, on est sympas.',
+ ]
+ ];
+ //phpcs:enable
+
+ foreach ($datas as $data) {
+ $slide = new Slide();
+ $slide->type = SliderTypeEnum::team;
+ $slide->title = $data['title'];
+ $slide->content = $data['content'];
+ $slide->button_status = 0;
+ $slide->saveOrFail();
+ }
+ } //end if
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down(): void
+ {
+ Slide::query()->where('type', SliderTypeEnum::team)->delete();
+
+ Schema::table('slides', function (Blueprint $table) {
+ $table->string('content', 255)->nullable()->comment('Slide content.')->change();
+ $table->string('picture')->comment('Slide picture path.')->change();
+ $table->string('picture_alt')->comment('Slide picture alt attribute.')->change();
+ $table->string('picture_title')->comment('Slide picture title attribute.')->change();
+ });
+ }
+};
diff --git a/database/seeders/Mandatory/TeamSlideSeeder.php b/database/seeders/Mandatory/TeamSlideSeeder.php
new file mode 100644
index 0000000..58062d5
--- /dev/null
+++ b/database/seeders/Mandatory/TeamSlideSeeder.php
@@ -0,0 +1,61 @@
+updateOrCreate(
+ [
+ 'type' => SliderTypeEnum::team,
+ 'title' => 'Culture d’entreprise inclusive et collaborative :',
+ ],
+ [
+ 'title' => 'Culture d’entreprise inclusive et collaborative :',
+ 'content' => 'Notre entreprise valorise la diversité des perspectives et favorise un environnement où
+ chacun se sent écouté et respecté. Nous croyons en la force de la collaboration et encourageons
+ l’innovation à tous les niveaux.',
+ ]
+ );
+ Slide::query()->updateOrCreate(
+ [
+ 'type' => SliderTypeEnum::team,
+ 'title' => 'Opportunités de développement professionnel :',
+ ],
+ [
+ 'title' => 'Culture d’entreprise inclusive et collaborative :',
+ 'content' => 'En nous rejoignant, vous aurez accès à des programmes de formation et de développement
+ pour renforcer vos compétences et progresser dans votre carrière. Nous encourageons la croissance
+ personnelle et professionnelle de nos employés.',
+ ]
+ );
+ Slide::query()->updateOrCreate(
+ [
+ 'type' => SliderTypeEnum::team,
+ 'title' => 'Implication dans des projets innovants :',
+ ],
+ [
+ 'title' => 'Culture d’entreprise inclusive et collaborative :',
+ 'content' => 'Nous travaillons sur des projets stimulants et innovants qui offre l’opportunité de faire
+ une réelle différence pour les consommateurs. Rejoindre notre équipe vous permettra de contribuer à des
+ initiatives passionnantes et impactantes.
+
+
+ Et en plus, on est sympas.',
+ ]
+ );
+ }
+}
diff --git a/resources/ts/bo/components/CkEditorComponent.vue b/resources/ts/bo/components/CkEditorComponent.vue
index d4b0673..521ce02 100644
--- a/resources/ts/bo/components/CkEditorComponent.vue
+++ b/resources/ts/bo/components/CkEditorComponent.vue
@@ -1,342 +1,390 @@
-
+
-
+
-
-
diff --git a/resources/ts/index.d.ts b/resources/ts/index.d.ts
index 97068c4..add6f30 100644
--- a/resources/ts/index.d.ts
+++ b/resources/ts/index.d.ts
@@ -70,6 +70,7 @@ declare global {
type LaravelPaginator = Paginator;
type LaravelPaginatorLink = PaginatorLink;
type ValueOf = T[keyof T];
+ type LaravelValidationErrors = Record;
type Enum = EnumInterface;
diff --git a/resources/views/bo/pages/slides/create.blade.php b/resources/views/bo/pages/slides/create.blade.php
index 7e79f75..98ffba5 100644
--- a/resources/views/bo/pages/slides/create.blade.php
+++ b/resources/views/bo/pages/slides/create.blade.php
@@ -1,21 +1,21 @@
@extends('bo.layout', ['brParam' => $slideModel])
-@section('title', __('Création d\'un :model', ['model' => trans_choice('models.classes.site', 1)]))
-@section('description', __('Création d\'un tout nouveau :model', ['model' => trans_choice('models.classes.site', 1)]))
+@section('title', __('Création d\'un :model', ['model' => trans_choice('models.classes.slide', 1)]))
+@section('description', __('Création d\'un tout nouveau :model', ['model' => trans_choice('models.classes.slide', 1)]))
@section('breadcrumb', request()->route()->getName())
@section('content')