diff --git a/app/Enums/ActivityLogs/ActivityLogsEventEnum.php b/app/Enums/ActivityLogs/ActivityLogsEventEnum.php new file mode 100644 index 0000000..df94759 --- /dev/null +++ b/app/Enums/ActivityLogs/ActivityLogsEventEnum.php @@ -0,0 +1,48 @@ +name => 'Création', + self::updated->name => 'Mise à jour', + self::duplicated->name => 'Duplication', + self::deleted->name => 'Suppression', + ]; + + + /** + * Custom added classes definition + */ + private const BOOTSTRAPCLASS = [ + self::created->name => 'success', + self::updated->name => 'warning', + self::duplicated->name => 'secondary', + self::deleted->name => 'danger', + ]; + + /** + * Get Class + * + * @return string + */ + public function bootstrapClass(): string + { + return self::BOOTSTRAPCLASS[$this->name]; + } +} diff --git a/app/Enums/Pagination/ItemsPerPaginationEnum.php b/app/Enums/Pagination/ItemsPerPaginationEnum.php new file mode 100644 index 0000000..b1682f8 --- /dev/null +++ b/app/Enums/Pagination/ItemsPerPaginationEnum.php @@ -0,0 +1,16 @@ +name => 'Mentions légales', + self::confidentiality->name => 'Confidentialité', + ]; +} diff --git a/app/Http/Controllers/Bo/ActivityLogController.php b/app/Http/Controllers/Bo/ActivityLogController.php new file mode 100644 index 0000000..97d6605 --- /dev/null +++ b/app/Http/Controllers/Bo/ActivityLogController.php @@ -0,0 +1,71 @@ +authorize('isConceptor'); + /** @var \Illuminate\Database\Eloquent\Builder $query */ + $query = ActivityLog::query()->with('user'); + + /** @var string $search Search field */ + $search = $request->search; + if ($search) { + $this->searchQuery( + $query, + $search, + null, + 'model_class', + ); + } + $searchFields = \implode(', ', [ + trans('validation.custom.target'), + ]); + + /** Sort columns with a query */ + $this->sortQuery($query); + + /** Custom pagination */ + $activitylogModels = $this->paginate($query); + + return view('bo.pages.activity_logs.index', compact('activitylogModels', 'search', 'searchFields')); + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\ActivityLog $activity_log + * @return \Illuminate\Contracts\View\View + */ + public function show(ActivityLog $activity_log): \Illuminate\Contracts\View\View + { + $this->authorize('isConceptor'); + $targetModelClass = $activity_log->model_class; + $targetModel = $activity_log->model_class::where( + (new $targetModelClass())->getRouteKeyName(), + $activity_log->model_id + )->first(); + + return view('bo.pages.activity_logs.show', [ + 'activitylogModel' => $activity_log, + 'targetModel' => $targetModel, + ]); + } +} diff --git a/app/Http/Controllers/Bo/StaticPageController.php b/app/Http/Controllers/Bo/StaticPageController.php new file mode 100644 index 0000000..9b92073 --- /dev/null +++ b/app/Http/Controllers/Bo/StaticPageController.php @@ -0,0 +1,91 @@ +authorizeResource(StaticPage::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 $query */ + $query = StaticPage::query(); + + /** @var string $search Search field */ + $search = $request->search; + if ($search) { + $this->searchQuery( + $query, + $search, + null, + 'title', + ); + } + $searchFields = \implode(', ', [ + trans('validation.attributes.title'), + ]); + + /** Sort columns with a query */ + $this->sortQuery($query); + + /** Custom pagination */ + $staticPageModelList = $this->paginate($query); + + return view('bo.pages.static_pages.index', compact('staticPageModelList', 'search', 'searchFields')); + } + + /** + * Show the form for editing the specified resource. + * + * @param \App\Models\StaticPage $static_page + * @return \Illuminate\Contracts\View\View + */ + public function edit(StaticPage $static_page): \Illuminate\Contracts\View\View + { + return view('bo.pages.static_pages.edit', ['staticPageModel' => $static_page]); + } + + /** + * Update the specified resource in storage. + * + * @param \App\Http\Requests\Bo\StaticPages\UpdateStaticPageRequest $request + * @param \App\Models\StaticPage $static_page + * @return \Illuminate\Http\RedirectResponse + */ + public function update(UpdateStaticPageRequest $request, StaticPage $static_page): \Illuminate\Http\RedirectResponse + { + return DB::transaction(function () use ($request, $static_page) { + $static_page->fill($request->validated()); + + if ($static_page->saveOrFail()) { + return redirect()->route('bo.static_pages.edit', $static_page) + ->with('success', __('crud.messages.has_been_updated', [ + 'model' => Str::ucfirst(\trans_choice('models.classes.static_page', 1)) + ])); + } + return redirect()->route('bo.static_pages.edit', $static_page) + ->with('error', __('crud.messages.cannot_be_updated', [ + 'model' => Str::ucfirst(\trans_choice('models.classes.static_page', 1)) + ])); + }); + } +} diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index 1a3295c..4513185 100644 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -2,12 +2,16 @@ namespace App\Http\Controllers; +use App\Enums\Pagination\ItemsPerPaginationEnum; use Illuminate\Database\Eloquent\Builder; use Illuminate\Foundation\Auth\Access\AuthorizesRequests; use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; use Illuminate\Support\Facades\Schema; use Illuminate\Support\Facades\Session; +use Illuminate\Support\Facades\Cache; +use App\Lib\Helpers\ToolboxHelper; +use Illuminate\Support\Str; class Controller extends BaseController { @@ -120,4 +124,30 @@ class Controller extends BaseController } return $query; } + + /** + * Customize pagination with cache or config (default). + * + * @param \Illuminate\Database\Eloquent\Builder $query + * @param \App\Enums\Pagination\ItemsPerPaginationEnum|null $pagination + * @return \Illuminate\Contracts\Pagination\LengthAwarePaginator + */ + protected function paginate( + Builder $query, + ItemsPerPaginationEnum $pagination = null + ): \Illuminate\Contracts\Pagination\LengthAwarePaginator { + $currentRoutePath = Str::slug(request()->route()->getName()); + $cacheKey = "pagination.{$currentRoutePath}"; + $pagination = $pagination ?? ItemsPerPaginationEnum::twelve; + $pagination = ToolboxHelper::getValidatedEnum( + Cache::get($cacheKey, $pagination->value()), + 'pagination', + '\App\Enums\Pagination\ItemsPerPaginationEnum', + ); + if (Cache::get($cacheKey) !== $pagination) { + Cache::put($cacheKey, $pagination); + } + $query = $query->paginate($pagination); + return $query; + } } diff --git a/app/Http/Controllers/Fo/StaticPageController.php b/app/Http/Controllers/Fo/StaticPageController.php new file mode 100644 index 0000000..0a7a484 --- /dev/null +++ b/app/Http/Controllers/Fo/StaticPageController.php @@ -0,0 +1,34 @@ +where('type', StaticPageType::legals)->first(); + return view('fo.pages.legals', ['staticPageModel' => $legalPage]); + } + + /** + * Policies show + * + * @param \App\Models\StaticPage $policiesPage + * @return \Illuminate\Contracts\View\View + */ + public function policies(StaticPage $policiesPage) + { + $policiesPage = StaticPage::query()->where('type', StaticPageType::confidentiality)->first(); + return view('fo.pages.policies', ['staticPageModel' => $policiesPage]); + } +} diff --git a/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php b/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php new file mode 100644 index 0000000..e7c999c --- /dev/null +++ b/app/Http/Requests/Bo/StaticPages/UpdateStaticPageRequest.php @@ -0,0 +1,46 @@ +check(); + } + + /** + * Prepare the data for validation. + * + * @return void + */ + public function prepareForValidation(): void + { + $this->merge([ + 'content' => Str::of($this->post('content'))->value() + ]); + } + + /** + * Get the validation rules that apply to the request. + * + * @return array|string> + */ + public function rules(): array + { + return [ + 'seo_title' => 'required|min:45|max:70', + 'seo_description' => 'required|min:50|max:160', + 'title' => 'required|min:3|max:255', + 'content' => 'present', + ]; + } +} diff --git a/app/Lib/Helpers/ToolboxHelper.php b/app/Lib/Helpers/ToolboxHelper.php index 363ec13..1df6d81 100644 --- a/app/Lib/Helpers/ToolboxHelper.php +++ b/app/Lib/Helpers/ToolboxHelper.php @@ -12,6 +12,7 @@ use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Storage; use Illuminate\Support\Facades\Validator; use Illuminate\Validation\Rule; +use Illuminate\Validation\Rules\Enum; use Illuminate\Validation\ValidationException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; @@ -481,4 +482,24 @@ class ToolboxHelper { return !$useStorage ? File::mimeType($value) : Storage::mimeType($value); } + + /** + * Get validated pagination from request. + * + * @param integer $default + * @param string $field + * @param string $enumPath + * @return integer + */ + public static function getValidatedEnum(int $default, string $field, string $enumPath): int + { + try { + return \intval(Validator::make( + [$field => \request()->get($field)], + [$field => new Enum($enumPath)] + )->validated()[$field]); + } catch (ValidationException $e) { + return $default; + } + } } diff --git a/app/Models/ActivityLog.php b/app/Models/ActivityLog.php new file mode 100644 index 0000000..3feeebc --- /dev/null +++ b/app/Models/ActivityLog.php @@ -0,0 +1,179 @@ + + */ + protected $fillable = [ + 'is_anonymous', + 'model_class', + 'model_id', + 'event', + 'data', + 'created_at', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'is_anonymous' => 'bool', + 'event' => ActivityLogsEventEnum::class, + 'data' => 'json', + 'created_at' => 'datetime', + ]; + + // * METHODS + + /** + * Add new activity to the activity logs list. + * + * @param \Illuminate\Database\Eloquent\Model $model + * @param \App\Enums\ActivityLogs\ActivityLogsEventEnum $eventEnum + * @return void + */ + public static function addActivity(Model $model, ActivityLogsEventEnum $eventEnum): void + { + $isAnonymous = true; + /** @var \Illuminate\Database\Eloquent\Model|null */ + $userModel = auth('backend')->user(); + if (is_object($userModel)) { + $userModel = $userModel->getKeyForSelectQuery(); + $isAnonymous = false; + } + $activity = new self(); + $activity->user_id = $userModel; + $activity->is_console = app()->runningInConsole(); + $activity->is_anonymous = $isAnonymous; + $activity->model_class = \get_class($model); + $activity->model_id = $model->getKey(); + $activity->event = $eventEnum; + $activity->data = static::getChangedColumns($activity, $model, $eventEnum); + // @phpstan-ignore-next-line + $activity->created_at = now(); + $activity->saveOrFail(); + } + + /** + * Get old, new columns that has changed. + * + * @param self $activity + * @param \Illuminate\Database\Eloquent\Model $model + * @param \App\Enums\ActivityLogs\ActivityLogsEventEnum $eventEnum + * @return array + */ + public static function getChangedColumns(self $activity, Model $model, ActivityLogsEventEnum $eventEnum): array + { + $modelClassName = $activity->model_class; + /** Get type of each fields of the target model */ + /** @var \Illuminate\Database\Eloquent\Model|null $targetModel */ + $targetModel = $activity->model_class::where( + (new $modelClassName())->getRouteKeyName(), + $activity->model_id + )->first(); + + if (\is_null($targetModel)) { + return []; + } + $targetModelTypes = collect($targetModel->toArray()) + ->map(fn ($value) => self::getValueType($value)) + ->toArray(); + /** Return old, new and type of values changed */ + return match ($eventEnum) { + ActivityLogsEventEnum::created => array_intersect_key($targetModelTypes, $model->toArray()), + ActivityLogsEventEnum::duplicated => array_intersect_key($targetModelTypes, $model->toArray()), + ActivityLogsEventEnum::updated => array_intersect_key($targetModelTypes, $model->getChanges()), + default => [] + }; + } + + + /** + * Get a value type as a string + * ! Use this for display purpose only + * + * @param mixed $value + * @return string + * @throws \RuntimeException If type is unhlanded. + * @phpcs:disable Generic.Metrics.CyclomaticComplexity.MaxExceeded + */ + private static function getValueType(mixed $value): string + { + // phpcs:enable + $type = \gettype($value); + switch ($type) { + // phpcs:ignore PSR2.ControlStructures.SwitchDeclaration.TerminatingComment + case 'string': + return match (true) { + Str::length(\strip_tags($value)) !== Str::length($value) => 'html', + Str::startsWith($value, 'storage/modelfiles') => 'file', + Str::isUuid($value) => 'uuid', + Str::isUlid($value) => 'ulid', + Str::isUrl($value) => 'url', + Str::isMatch('/^[0-9A-Za-z_-]{10}[048AEIMQUYcgkosw]$/', $value) => 'youtube_video_id', + \is_numeric($value) => 'numeric', + Str::isJson($value) and + (Str::startsWith($value, '[') or Str::startsWith($value, '{')) => 'json', + default => 'string' + }; + case 'NULL': + case 'object': + case 'array': + case 'integer': + case 'boolean': + return $type; + case 'double': + return is_float($value) ? 'float' : 'double'; + case 'resource (closed)': + case 'resource': + throw new \RuntimeException('Laravel model properties should not contain resources !'); + case 'unknown type': + default: + throw new \RuntimeException('Unhandled Type ' . \gettype($value)); + } //end switch + } + + // * RELATIONS + + /** + * User BelongsTo relation. + * + * @return \Illuminate\Database\Eloquent\Relations\BelongsTo + */ + public function user(): \Illuminate\Database\Eloquent\Relations\BelongsTo + { + return $this->belongsTo(User::class); + } +} diff --git a/app/Models/StaticPage.php b/app/Models/StaticPage.php new file mode 100644 index 0000000..204758e --- /dev/null +++ b/app/Models/StaticPage.php @@ -0,0 +1,113 @@ + + */ + protected $fillable = [ + 'seo_title', + 'seo_description', + 'title', + 'content', + ]; + + /** + * The attributes that should be cast. + * + * @var array + */ + protected $casts = [ + 'type' => StaticPageType::class, + ]; + + /** + * Perform any actions required after the model boots. + * + * @return void + */ + protected static function booted(): void + { + static::creating(function (self $model) { + // * ASSERTIONS + self::assertTitleIsUnique($model->title); + + // * CHANGES + $model->slug = Str::slug($model->title); + }); + static::updating(function (self $model) { + // * ASSERTIONS + self::assertTitleIsUnique($model->title, $model->id); + + // * CHANGES + $model->slug = Str::slug($model->title); + }); + } + + // * ROUTABLE + + /** + * Get the value of the model's route key. + * + * @return mixed + */ + public function getRouteKey() + { + /** @var \App\Enums\StaticPageType */ + $enum = $this->getAttribute($this->getRouteKeyName()); + return $enum->value(); + } + + /** + * Get the route key for the model. + * + * ! Type is the routable parameter + * + * @return string + */ + public function getRouteKeyName(): string + { + return 'type'; + } + + // * METHODS + + /** + * Asserts using validation that the title is unique + * + * @param string|null $title + * @param integer|null $id + * @return void + * @throws \Illuminate\Validation\ValidationException If an actu title already exists. + */ + private static function assertTitleIsUnique(string|null $title, ?int $id = null) + { + $table = (new self())->getTable(); + ToolboxHelper::assertFieldIsUnique($table, 'title', $title, $id); + ToolboxHelper::assertFieldIsUnique($table, 'slug', Str::slug($title), $id); + } +} diff --git a/app/Observers/ModelObserver.php b/app/Observers/ModelObserver.php new file mode 100644 index 0000000..71d194b --- /dev/null +++ b/app/Observers/ModelObserver.php @@ -0,0 +1,54 @@ +update(['published' => !$model->getOriginal('published')]); + return redirect()->back()->with('success', trans(__('crud.messages.publish_status_saved'))); + } +} diff --git a/app/Traits/Models/ActivityLog.php b/app/Traits/Models/ActivityLog.php new file mode 100644 index 0000000..67973e1 --- /dev/null +++ b/app/Traits/Models/ActivityLog.php @@ -0,0 +1,23 @@ +id(); + $table->unsignedTinyInteger('type')->unique()->comment('Page type (StaticPageEnum)'); + $table->string('seo_title')->comment('Seo title about 70 chars as recommended'); + $table->string('seo_description')->comment('Seo description about 160 chars as recommended'); + $table->string('title')->comment('Title for the page'); + $table->string('slug')->unique()->comment('Unique title slug'); + $table->text('content')->comment('WYSIWYG text content using ckeditor'); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('static_pages'); + } +}; diff --git a/database/migrations/2024_07_18_141349_create_actitivy_logs_table.php b/database/migrations/2024_07_18_141349_create_actitivy_logs_table.php new file mode 100644 index 0000000..05734e7 --- /dev/null +++ b/database/migrations/2024_07_18_141349_create_actitivy_logs_table.php @@ -0,0 +1,39 @@ +id(); + $table->foreignId('user_id')->nullable()->constrained('users')->nullOnDelete() + ->comment('Id of the user associated, or nullable for a deleted user.'); + $table->boolean('is_anonymous')->comment('If there is no user connected when action was realised.'); + $table->boolean('is_console')->comment('If the action was realised in console.'); + $table->string('model_class')->comment('Target model.'); + $table->integer('model_id')->comment('Id of the target model.'); + $table->integer('event')->comment('Event of this activity (ActivityLogsEventEnum).'); + $table->json('data')->nullable()->comment('List of changes (old and new values).'); + $table->timestamp('created_at')->comment('The date on which the user was published.'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down(): void + { + Schema::dropIfExists('activity_logs'); + } +}; diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index a9fa468..aac37e9 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -2,6 +2,7 @@ namespace Database\Seeders; +use Database\Seeders\StaticPageSeeder; use Illuminate\Database\Seeder; class DatabaseSeeder extends Seeder @@ -19,6 +20,7 @@ class DatabaseSeeder extends Seeder ProductSeeder::class, RecipeSeeder::class, ShopSeeder::class, + StaticPageSeeder::class, ]); } } diff --git a/database/seeders/StaticPageSeeder.php b/database/seeders/StaticPageSeeder.php new file mode 100644 index 0000000..5618f0e --- /dev/null +++ b/database/seeders/StaticPageSeeder.php @@ -0,0 +1,148 @@ +updateOrCreate( + [ + 'type' => StaticPageType::legals, + ], + [ + 'seo_title' => 'Mentions légales et CGU', + 'seo_description' => 'Mentions légales et conditions générales d\'utilisation du site internet du site internet Lionor', + 'title' => 'Mentions légales', + 'type' => StaticPageType::legals, + 'content' => " +

Introduction

+

Nous vous remercions de lire ces conditions générales d'utilisation qui régissent les conditions d'accès et d'utilisation du site lionor.fr +

+ Nous vous invitons à consulter régulièrement cette rubrique car la société Lionor peut être amenée à la modifier à tout moment. +

+ Tout utilisateur déclare avoir lu et accepté les mentions légales et les conditions générales d'utilisation et s'engage à s'y conformer.


+ Mise à jour le 15/03/2023.

+

Mentions légales

+

Lionor RTE DE LA GARE 59189 STEENBECQUE
Tél : +33(0)328436055 SAS au capital de 1 646 400 euros - RCS de Dunkerque sous le numéro 305 507 303

+ Editeur du Site : LDC Services 98 à 102 Rue Albert Einstein 72000 Le Mans
+ Directeur de la publication : Sylvain Gouet, Responsable Web Marketing Groupe LDC
+ Conception du site et réalisation : LDC Services 98 à 102 Rue Albert Einstein 72000 Le Mans
+ Illustrations : Médiapole 2020
+ Le site est hébergé par : OVH, via LDC, SAS au capital de 10 069 020 euros, RCS Lille Métropole 537 407 926, 2 rue Kellermann - 59100 Roubaix, Tel : 09 72 10 10 07, Mail : hosting@ml.ovh.net

+

Droit d'auteur - Droit des marques - Protection des bases de données

+

La présentation et le contenu du site constituent, ensemble, une œuvre protégée par les lois en vigueur des droits d'auteur, de la propriété intellectuelle et industrielle. +

+ Les créations apparaissant sur le site (dessins, photographies, images, textes, séquences animées sonores ou non et autres documentations représentées), sont objets de droits d'auteur, de propriété industrielle et/ou intellectuelle et sont, selon les cas, propriété de la société Lionor ou de tiers ayant autorisé la société Lionor à les utiliser. +
Aucune exploitation commerciale, reproduction, représentation, utilisation, adaptation, modification, incorporation, traduction, commercialisation, partielle ou intégrale de ces éléments (y compris ceux téléchargeables ou copiables) ne pourra en être faite sans l'accord préalable et écrit de la société Lionor, à l'exception de l'utilisation pour un usage privé sous réserve des dispositions différentes voire plus restrictives du Code de la propriété intellectuelle. +
Toute utilisation non expressément autorisée peut engager la responsabilité civile et/ou pénale de son auteur. Lionor se réserve le droit d'engager des poursuites judiciaires à l'encontre de toute personne qui n'aurait pas respecté cette interdiction.

+

Vie privée - Données personnelles - Cookies

+

Nous vous invitons à vous reporter à notre Charte de confidentialité en cliquant ici.

+

Mentions Sanitaires :

+

Pour votre santé :
- mangez au moins cinq fruits et légumes par jour
- pratiquez une activité physique régulière
- évitez de manger trop gras, trop sucré, trop salé
- évitez de grignoter entre les repas

+

Pour toute information complémentaire, consultez le site www.mangerbouger.fr

+

Responsabilité

+

Lionor a déployé ses meilleurs efforts pour s'assurer de l'exactitude des informations présentes sur son site internet (ci-après le Site). Cependant, Lionor n'est responsable ni de l'exactitude, ni des erreurs, ni des omissions contenues sur le Site. L'utilisateur est seul responsable de l'utilisation de telles informations. +
Lionor ne donne aucune garantie, explicite ou implicite, et n'assume aucune responsabilité qui pourrait résulter de l'accès ou de l'utilisation de ce Site incluant toutes détériorations ou virus qui pourraient infecter l'équipement informatique ou tout autre bien de l'utilisateur. +
Par ailleurs. +
Lionor pourra unilatéralement et à tout moment interrompre temporairement ou définitivement l'accès à tout ou partie du Site, y compris notamment le contenu, les fonctionnalités ou les heures de disponibilité, sans que sa responsabilité ne puisse être recherchée et sans que cela ne puisse donner lieu à l'allocation de dommages et intérêts de quelque nature que ce soit. +
Les pages du Site peuvent contenir des liens hypertextes renvoyant vers d'autres sites internet gérés par des sociétés distinctes de Lionor, et sur lesquels Lionor n'exerce aucune sorte de contrôle. Lionor n'est pas responsable du contenu de tout autre site auquel vous pourriez avoir accès via le Site ou les autres sites internet du groupe LDC. Tout utilisateur ou visiteur du Site ne peut mettre en place un lien hypertexte en direction de ce Site sans l'autorisation expresse préalable de Lionor.

", + ] + ); + // Policies. + StaticPage::query()->updateOrCreate( + [ + 'type' => StaticPageType::confidentiality, + ], + [ + 'seo_title' => 'Politique des données personnelles', + 'seo_description' => 'Lionor vous informe sur les données que nous collectons, comment nous les traitons, dans quelles finalités.', + 'title' => 'Politique des données personnelles', + 'type' => StaticPageType::confidentiality, + 'content' => " +

Introduction

+

Le nouveau Règlement Général de l'Union Européenne sur la Protection des Données (RGPD), entré en vigueur le 25 mai 2018, vise à mieux encadrer la collecte, le traitement et l'utilisation de vos données personnelles.
Lionor, en sa qualité de responsable du traitement, renforce ses engagements pour garantir la protection et la sécurité des données à caractère personnel que vous lui confiez.

+

A ce titre, la présente Charte de confidentialité vous informe sur le type de données que nous collectons, comment nous les traitons, dans quelles finalités, de manière à rendre leur utilisation la plus adaptée à vos besoins.

+ Le responsable de traitement, qui collecte et gère vos données, est la société Lionor, SA au capital social de 1 646 400 immatriculée au registre du commerce et des sociétés de Dunkerque sous le numéro 305 507 303, dont le siège social est RTE DE LA GARE 59189 STEENBECQUE.

+ Pour toute question relative à notre Charte de confidentialité, merci de nous contacter via le formulaire de contact suivant:
https://www.ldc.fr/rgpd/professionnels/
https://www.ldc.fr/rgpd/consommateurs/ +
https://www.ldc.fr/rgpd/salaries/

Nous vous invitons à consulter régulièrement cette rubrique car Lionor peut être amené à la modifier à tout moment. +
La présente Charte de confidentialité a été mise à jour le 15/03/2023.

+

Nos Engagements

+

Conformément à la réglementation relative à la protection des données personnelles et à la vie privée, notamment la loi n°78-17 du 6 janvier 1978 relative à l'informatique, aux fichiers et aux libertés dite loi « Informatique et Libertés » et au Règlement (UE) 2016/679 du 25 mai 2018 relatif à la protection des personnes physiques à l'égard du traitement des données à caractère personnel et à la libre circulation de ces données, (ci-après le « Règlement RGPD»), Lionor s'engage à respecter les principes suivants :

+ Consentement: vous devez avoir consenti à la collecte et au traitement de vos données. Si tel n'était pas le cas ou si vous avez changé d'avis, merci de vous reporter à l'article ci-dessous relatif à vos droits.

+ Limitation des données collectées: nous ne collectons que les données qui sont strictement nécessaires au traitement et à l'utilisation envisagée. Nous vous rappelons qu'il n'y a aucune obligation à nous transmettre ces données. Toutefois certains services ou opérations promotionnelles nécessitent certaines données, faute de quoi vous ne pourriez y accéder.

+ Limitation des finalités: les données que nous collectons sont traitées uniquement dans les finalités décrites ci-dessous.

+ Limitation des durées de conservation: vos données sont conservées uniquement le temps nécessaire aux finalités de traitement pour lequel elles ont été collectées. Au-delà de cette durée si aucune obligation légale impose leur conservation, nous veillerons à ce que vos données soient supprimées, détruites ou anonymisées.

+ Protection des données: en vue de sécuriser vos données et leur traitement, nous avons mis en place des mesures techniques et organisationnelles détaillées ci-dessous.

+ Transparence et loyauté: lorsque Lionor collecte une donnée vous concernant, nous vous informons de l'utilisation qui en sera faite. C'est pourquoi nous vous conseillons de lire attentivement les informations qui vous sont transmises à travers notre site internet.

+

Quelles données personnelles sont collectées ?

+

Au sens du Règlement RGPD, une donnée à caractère personnel désigne toute information relative à une personne physique identifiée ou identifiable.

Les données personnelles collectées varient en fonction du but de la collecte et du service dont vous souhaitez bénéficier.
+
La société Lionor est amenée à collecter les catégories de données personnelles suivantes:

- coordonnées personnelles (civilité, nom, prénom, adresse e-mail, adresse postale) ;
- coordonnées personnelles non obligatoires (date de naissance, numéro de téléphone);
- identifiants utilisés pour accéder à votre compte en ligne (adresse IP, adresse e-mail et mot de passe);
- données relatives aux tickets de caisse de l'utilisateur ainsi que son RIB ou son compte Paypal;
- historiques de navigation, telles que les pages visitées et actions sur le site.
+
Vous vous engagez à fournir des données personnelles actualisées et valides et garantissez ne faire aucune fausse déclaration et ne donner aucune information erronée.

+

Pourquoi vos données personnelles sont collectées ?

Vos données peuvent être collectées dans la mesure où vous avez consenti de manière spécifique, libre et éclairée. Elles peuvent également être collectées pour satisfaire à l'exécution d'une obligation légale ou dans le cadre de la relation contractuelle construite avec vous (notamment conditions générales d'utilisation, conditions générales de vente) ou encore dans l'intérêt légitime de Lionor (par exemple pour assurer la sécurité des transactions).
+
Nous collectons vos données personnelles afin de vous fournir la meilleure expérience utilisateur à travers notre site internet.

Ces données sont collectées aux fins suivantes
- Gestion des fonctionnalités et de la qualité du site internet
- Gestion de votre inscription à notre Newsletter et de votre Compte utilisateur
- Accès à votre Compte utilisateur
- Gestion du recrutement
- Traitement de vos demandes de renseignements
- Communication des informations (promotions, nouveaux produits, activité de la marque)
- Gestion de votre participation à nos jeux, tirages au sort, activités promotionnelles
- Développement et amélioration des produits Lionor
- Statistiques
- Proposition de produits personnalisés et de communications adaptées ou pour recommandation de produits en fonction des besoins de consommateurs
- Partages sur les réseaux sociaux

+

Quels sont vos droits ?

Vous disposez d'un certain nombre de droits concernant vos données personnelles listés ci-dessous.

+ Droit d'accès Vous pouvez demander la communication de vos données sous une forme accessible, la confirmation que vos données font ou ne font plus l'objet d'un traitement ainsi que la communication des informations relatives à vos données. Afin que vos données personnelles soient exactes, complètes, pertinentes et à jour, vous avez le droit d'accéder, de corriger ou de mettre à jour vos données personnelles à tout moment.

+ Droit de rectification
Vous êtes en droit de demander à ce que vos données soient rectifiées, complétées ou mises à jour lorsqu'elles sont inexactes, incomplètes, équivoques ou périmées.

+ Droit à l'effacement
Vous avez le droit de demander la suppression de vos données personnelles notamment lorsqu'elles ne sont plus nécessaires aux finalités pour lesquelles elles ont été collectées. Si les données personnelles collectées ne sont plus nécessaires à aucune finalité et qu'aucune obligation légale nous impose de les conserver, nous mettrons tout en œuvre pour supprimer, détruire ou anonymiser ces données.

+ Droit à la limitation du traitement
Vous avez le droit de demander la limitation du traitement de vos données personnelles si :

- vous contestez l'exactitude des données;
- vous souhaitez limiter le traitement des données qui n'avaient pas été traitées de manière licite plutôt que leur suppression;
- nous n'avons plus besoin de vos données personnelles mais celles-ci sont nécessaires pour la constatation, l'exercice ou la défense de vos droits en justice;
- vous vous êtes opposés au traitement de vos données personnelles et attendez de savoir si vos intérêts liés à cette objection l'emportent sur les motifs légitimes que nous poursuivons.

+ Droit à la portabilité de vos données
Lorsque le traitement est effectué à partir de procédés automatisés et que vous avez librement consenti au traitement de vos données personnelles pour une finalité que nous vous avions communiqué au préalable; ou lorsque nous traitons vos données dans le cadre d'une opération commerciale (ex: vous fournir un produit) vous avez le droit de demander:
- à recevoir vos données personnelles dans un format structuré, couramment utilisé et lisible par une machine;
- à ce que vos données personnelles soient transmises directement à une autre responsable de traitement, lorsque que cela est techniquement possible.

+ Droit d'opposition
Lorsque vos données sont traitées à des fins de prospection commerciale, vous avez le droit, à tout moment, de vous opposer au traitement de vos données personnelles et ce sans motif.

+

Droit de porter réclamation auprès de la CNIL

+

Si vous estimez que le traitement de vos données personnelles constitue une violation de la réglementation, vous pouvez introduire une réclamation auprès d'une autorité de contrôle, telle que la CNIL.

+ Vous pouvez exercer ces droits à tout moment en nous contactant via le formulaire suivant :
https://www.ldc.fr/rgpd/professionnels/
https://www.ldc.fr/rgpd/consommateurs/
https://www.ldc.fr/rgpd/salaries/

+ Vous recevrez une réponse de notre part dans un délai d'un mois à compter de la réception de la demande. En cas de demande complexe ou du nombre important de demandes, le délai peut être prolongé de deux mois.

+ L'exercice des droits se fait à titre gratuit. Si toutefois la demande était manifestement infondée ou excessive, Lionor se réserve la possibilité d'appliquer des frais administratifs ou de refuser de donner suite à la demande.

+

Comment vos données personnelles sont protégées ?

+

Afin d'assurer la sécurité de vos données personnelles nous avons mis en place des mesures de sécurité, notamment des contrôles d'accès, des pare-feux, des serveurs sécurisés.

Ces mesures visent à protéger vos données personnelles contre toute perte, détournement, mauvaise utilisation, divulgation, modification, interférence, dommage, accès non autorisé des données.

En cas de violation de vos données personnelles susceptible d'engendrer un risque pour vos droits et libertés, Lionor en notifie la violation à la CNIL dans les meilleurs délais et, si possible, 72 heures au plus tard après en avoir pris connaissance. Lionor vous en informera dans les meilleurs délais.

+

Accès à vos données personnelles :

+

Vos données personnelles sont destinées au personnel de Lionor habilité à les traiter, notamment le service marketing, développement durable, informatique, commercial, qualité et administratif.

+

Partage de vos données personnelles :

+

Conformément à la règlementation, quand nous sommes amenés à partager vos données personnelles avec des sous-traitants pour certaines finalités décrites dans la présente Charte, nous nous assurons que leur dispositif en matière de sécurité des données et de leur stockage est au moins aussi important que celui de notre organisation. Nous veillons également à ce qu'ils respectent les lois relatives à la protection des données personnelles dans des conditions au moins équivalentes à celles que nous respectons.
+
Par ailleurs, les sous-traitants étant amenés à traiter de vos données personnelles pour notre compte et sur nos instructions, nous nous engageons à ce que vos données personnelles ne soient pas partagées ou divulguées pour des finalités autres que celles décrites dans la présente Charte. Nous pouvons cependant être amenés à transmettre vos données, pour des finalités autres que celles prévues dans la Charte, dans les cas où leur communication est requise par la loi et les autorités gouvernementales.

+

Transfert de vos données en dehors de l'espace économique Européen :

+

Nous nous informons que vos données personnelles ne sont pas traitées en dehors de l'Espace Economique Européen (EEE). En cas de changement, nous vous en avertirons et mettrons tout en œuvre pour que ce transfert international de données dispose d'un niveau et de garanties de sécurité adéquats.

+

Utilisation des cookies

+

Les cookies sont des petits fichiers textes contenant des informations propres vous concernant stockés sur le disque dur de l'équipement informatique avec lequel vous vous êtes connectés sur le site internet et pouvant être lus seulement par le serveur qui l'a fourni. Les cookies sont gérés par votre navigateur internet.

Les cookies indiquent la fréquentation des pages que vous visitez, ce qui nous aide à connaître les informations qui vous intéressent. Cela permet de vous offrir plus de contenu qui vous intéresse et moins de contenu qui ne vous intéresse pas.

Les cookies vous permettent de stocker des préférences et les noms des utilisateurs, enregistrer des produits et des services, personnaliser des pages ou faire de la publicité ciblée.
+
A travers ces cookies, vos données personnelles peuvent être recueilles telles que :
+
- des informations concernant le navigateur de votre appareil et le système d'exploitation que vous utilisez; +
- l'adresse IP de l'appareil que vous utilisez; +
- les pages Web que vous consultez; +
- les liens sur lesquelles vous cliquez pendant que vous êtes en interaction avec nos services.
+
Le site internet lionor.fr utilise trois types de cookies qui ont des finalités différentes. Tous les cookies de type non techniques doivent recueillir votre consentement avant d'être installés. Vous pouvez donner votre consentement sur la page d'accueil du site internet, en cliquant sur « accepter ».
+
- Les cookies strictement nécessaires et fonctionnels Ces cookies sont nécessaires au bon fonctionnement du site internet. Ils vous permettent d'utiliser les principales fonctionnalités. Sans ces cookies, vous ne pourrez pas utiliser normalement le site internet. +
- Les cookies analytiques Ces cookies nous permettent de connaître l'utilisation et les performances du site internet et d'en améliorer son fonctionnement.
+
- Les cookies de ciblage
+
Ces cookies sont utilisés pour vous présenter des publicités ou vous adresser des informations adaptées à vos centres d'intérêts en dehors du site lionor.fr lors de votre navigation sur Internet. Le refus de ces cookies publicitaires n'a pas d'impact sur l'utilisation du site internet. Cependant, le fait de refuser les cookies publicitaires n'entraînera pas l'arrêt de la publicité sur Internet. Cela aura seulement pour effet d'afficher une publicité qui ne tiendra pas compte de vos centres d'intérêt ou de vos préférences.

+ Vous avez le choix :
+
- d'accepter ces cookies en cliquant sur le bouton «Accepter» présent sur le bandeau Cookies, apparaissant au bas de votre page internet. Tant que vous n'avez pas accepté, les cookies ne pourront être stockés sur votre appareil; ou

+ de refuser ces cookies via le bouton «Paramétrer» présent sur le bandeau Cookies ou les paramètres de votre navigateur internet.
+
Lorsque vous cliquez sur le bouton «Paramétrer» du bandeau Cookies, une liste s'affiche présentant les différents types de cookies par finalité. Si vous consentez au dépôt des cookies, il vous suffit de les activer puis de cliquer sur le bouton «Enregistrer» en bas de la fenêtre. Si vous refusez le dépôt des cookies, il vous suffit de cliquer sur le bouton «Enregistrer», le dépôt des cookies étant par défaut désactivé.
+
Pour en savoir plus sur la désactivation des cookies via votre navigateur internet :
+
Internet Explorer: http://windows.microsoft.com/fr-FR/windows-vista/Block-or-allow-cookies +
Chrome: http://support.google.com/chrome/bin/answer.py?hl=fr&hlrm=en&answer=95647 +
Firefox: https://support.mozilla.org/fr/kb/protection-renforcee-contre-pistage-firefox-ordinateur +
Safari: https://support.apple.com/fr-fr/guide/safari/sfri11471/mac
+
La durée de conservation de ces informations dans votre appareil est d'une durée maximale de 13 mois. A l'expiration de ce délai, nous recueillerons de nouveau votre consentement.
Pour plus d'informations sur le paramétrage de vos cookies, vous pouvez consulter :
http://www.youronlinechoices.com/fr/
https://www.allaboutcookies.org/

+

Sites internet de tiers

+

Le site internet Lionor peut être associé à des sites internet tiers. Les sites hébergés par des tiers sont hors de notre contrôle. Lorsque vous renseignez des données personnelles sur un site internet tiers, le traitement de ces données n'est pas effectué sur notre site internet, mais sur le site internet tiers concerné. Toute donnée personnelle que vous fournissez sera collectée et traitée conformément à la politique relative à la confidentialité des données du tiers concerné.
+
Par conséquent, nous n'assumons aucune responsabilité concernant les pratiques exercées par lesdits tiers en matière de protection des données.

+

Droit applicable

+

La présente Charte de confidentialité est régie et sera interprétée conformément au droit français.

+

Nous contacter

+

Si vous avez des questions, remarques ou réclamations relatives à la présente Charte de confidentialité, ou le traitement de vos données personnelles, veuillez-nous contacter à l'adresse :

https://www.ldc.fr/rgpd/professionnels/
https://www.ldc.fr/rgpd/consommateurs/
https://www.ldc.fr/rgpd/salaries/

+ ", + ] + ); + } +} diff --git a/resources/lang/en/crud.php b/resources/lang/en/crud.php index c99c405..21589e5 100644 --- a/resources/lang/en/crud.php +++ b/resources/lang/en/crud.php @@ -1,55 +1,73 @@ [ - 'list' => 'List', - 'view' => 'View', - 'create' => 'Create', - 'update' => 'Update', - 'delete' => 'Delete', - 'save' => 'Save', - 'edit' => 'Edit', + 'actions' => [ + 'list' => 'List', + 'view' => 'View', + 'create' => 'Create', + 'duplicate' => 'Duplicate', + 'update' => 'Update', + 'delete' => 'Delete', + 'save' => 'Save', + 'edit' => 'Edit', ], - 'helpers' => [ - 'list' => 'List', - 'list_all' => 'List all :model', - 'create_model' => 'Create :model', - 'view_model' => 'View :model', - 'update_model' => 'Update :model', - 'delete_model' => 'Delete :model', - 'no_results' => 'No results for :models', - 'publish' => 'Publish', - 'unpublish' => 'Unpublish', + 'helpers' => [ + 'list' => 'List', + 'list_all' => 'List all :model', + 'create_model' => 'Create :model', + 'view_model' => 'View :model', + 'update_model' => 'Update :model', + 'duplicate_model' => 'Duplicate :model', + 'delete_model' => 'Delete :model', + 'save_model' => 'Save :model', + 'edit_model' => 'Edit :model', + 'no_results' => 'No results for :models', + 'publish' => 'Publish', + 'unpublish' => 'Unpublish', + 'seo_title' => 'Must give a precise description of the page, which is recommended for optimum + positioning in search engines ( tag).', + 'seo_description' => 'Must give a precise description of the page content (<meta> description tag).', ], - 'libs' => [ + 'libs' => [ 'toolbox' => [ - 'assertFieldIsUnique' => 'The :value for the :attribute field is already in use', - 'assertNoInternalBoUrls' => ':attribute : It is forbidden to paste backoffice uri into this field', - 'assertNoInternalUrls' => ':attribute : It is forbidden to paste a url of :appname into this field', + 'assertFieldIsUnique' => 'The :value for the :attribute field is already in use', + 'assertNoInternalBoUrls' => ':attribute : It is forbidden to paste back-office uri into this field', + 'assertNoInternalUrls' => ':attribute : It is forbidden to paste a url of :appname into this field', ] ], - 'messages' => [ - 'has_been_created' => ':model has been created', - 'cannot_be_created' => ':model cannot be created', - 'has_been_updated' => ':model has been updated', - 'cannot_be_updated' => ':model cannot be updated', - 'has_been_deleted' => ':model has been deleted', - 'cannot_be_deleted' => ':model cannot be deleted' + 'messages' => [ + 'has_been_created' => ':model has been created', + 'cannot_be_created' => ':model cannot be created', + 'has_been_updated' => ':model has been updated', + 'cannot_be_updated' => ':model cannot be updated', + 'has_been_deleted' => ':model has been deleted', + 'cannot_be_deleted' => ':model cannot be deleted', + 'order_changed' => 'The order has been changed!', + 'order_not_changed' => 'The order hasn\'t been changed!', + 'publish_status_saved' => 'Change of publication status successful!', + 'right' => 'You don\'t have the rights to access this part !' ], - 'minicrud' => [ - 'visibility_label' => 'Visibility', - 'visibility_helper' => 'Check to make it visible.', - 'enum_select' => 'Select :enum from the list.', - 'associated_enum' => 'Associated :enum', - 'dimensions_must_be' => 'Must be :widthpx (width) by :heightpx (height).', - 'picture_title_helper' => 'Useful for users, displayed by moving the mouse over the image', - 'picture_title_label' => 'Title attribute of the image', - 'picture_alt_helper' => 'Must describe your image for search engines and blind people (5 to 6 words)', - 'picture_alt_label' => 'Alt attribute of the image', - 'text_warning' => 'Proofread your content before publishing it', + 'pagination' => [ + "previous" => "Previous page", + "next" => "Next page", + "specific_page" => "Go to page n°:id", + 'paginate_list' => 'Number of elements per page', + ], + + 'other' => [ + 'up' => 'Change the order of appearance upwards', + 'down' => 'Change the order of appearance downwards', + 'no_model_found' => 'No :model found|No :model found', + 'publish' => 'Published', + 'unpublish' => 'Unpublished', + 'sort_ascending' => 'Sort :name in ascending order', + 'sort_descending' => 'Sort :name in descending order', + 'sort_delete' => 'Delete sorting', + 'sort_arrow' => 'Here, the arrows are used to sort, not filter.', + 'right' => 'You don\'t have the rights', ] ]; diff --git a/resources/lang/en/models.php b/resources/lang/en/models.php index 14a908e..69dd17e 100644 --- a/resources/lang/en/models.php +++ b/resources/lang/en/models.php @@ -2,12 +2,13 @@ return [ 'classes' => [ - 'home' => 'Home', - 'shops' => 'Sign', - 'ranges' => 'Ranges', - 'recipes' => 'Recipes', - 'slides' => 'Slides', - 'products' => 'Products', - 'certifications' => 'Certifications' + 'home' => 'Home', + 'shops' => 'Sign', + 'ranges' => 'Ranges', + 'recipes' => 'Recipes', + 'slides' => 'Slides', + 'products' => 'Products', + 'certifications' => 'Certifications', + 'static_page' => 'Static page|Static pages', ] ]; diff --git a/resources/lang/en/validation.php b/resources/lang/en/validation.php index bf95fce..dace9ab 100644 --- a/resources/lang/en/validation.php +++ b/resources/lang/en/validation.php @@ -1,163 +1,144 @@ <?php return [ - - /* - |-------------------------------------------------------------------------- - | Validation Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines contain the default error messages used by - | the validator class. Some of these rules have multiple versions such - | as the size rules. Feel free to tweak each of these messages here. - | - */ - - 'accepted' => 'The :attribute must be accepted.', - 'accepted_if' => 'The :attribute must be accepted when :other is :value.', - 'active_url' => 'The :attribute is not a valid URL.', - 'after' => 'The :attribute must be a date after :date.', - 'after_or_equal' => 'The :attribute must be a date after or equal to :date.', - 'alpha' => 'The :attribute must only contain letters.', - 'alpha_dash' => 'The :attribute must only contain letters, numbers, dashes and underscores.', - 'alpha_num' => 'The :attribute must only contain letters and numbers.', - 'array' => 'The :attribute must be an array.', - 'before' => 'The :attribute must be a date before :date.', - 'before_or_equal' => 'The :attribute must be a date before or equal to :date.', - 'between' => [ - 'numeric' => 'The :attribute must be between :min and :max.', - 'file' => 'The :attribute must be between :min and :max kilobytes.', - 'string' => 'The :attribute must be between :min and :max characters.', - 'array' => 'The :attribute must have between :min and :max items.', + "accepted" => "The :attribute must be accepted.", + "accepted_if" => "The :attribute must be accepted when :other is :value.", + "active_url" => "The :attribute is not a valid URL.", + "after" => "The :attribute must be a date after :date.", + "after_or_equal" => "The :attribute must be a date after or equal to :date.", + "alpha" => "The :attribute must only contain letters.", + "alpha_dash" => "The :attribute must only contain letters, numbers, dashes and underscores.", + "alpha_num" => "The :attribute must only contain letters and numbers.", + "array" => "The :attribute must be an array.", + "before" => "The :attribute must be a date before :date.", + "before_or_equal" => "The :attribute must be a date before or equal to :date.", + "between" => [ + "numeric" => "The :attribute must be between :min and :max.", + "file" => "The :attribute must be between :min and :max kilobytes.", + "string" => "The :attribute must be between :min and :max characters.", + "array" => "The :attribute must have between :min and :max items.", ], - 'boolean' => 'The :attribute field must be true or false.', - 'confirmed' => 'The :attribute confirmation does not match.', - 'current_password' => 'The password is incorrect.', - 'date' => 'The :attribute is not a valid date.', - 'date_equals' => 'The :attribute must be a date equal to :date.', - 'date_format' => 'The :attribute does not match the format :format.', - 'declined' => 'The :attribute must be declined.', - 'declined_if' => 'The :attribute must be declined when :other is :value.', - 'different' => 'The :attribute and :other must be different.', - 'digits' => 'The :attribute must be :digits digits.', - 'digits_between' => 'The :attribute must be between :min and :max digits.', - 'dimensions' => 'The :attribute has invalid image dimensions.', - 'distinct' => 'The :attribute field has a duplicate value.', - 'email' => 'The :attribute must be a valid email address.', - 'ends_with' => 'The :attribute must end with one of the following: :values.', - 'enum' => 'The selected :attribute is invalid.', - 'exists' => 'The selected :attribute is invalid.', - 'file' => 'The :attribute must be a file.', - 'filled' => 'The :attribute field must have a value.', - 'gt' => [ - 'numeric' => 'The :attribute must be greater than :value.', - 'file' => 'The :attribute must be greater than :value kilobytes.', - 'string' => 'The :attribute must be greater than :value characters.', - 'array' => 'The :attribute must have more than :value items.', + "boolean" => "The :attribute field must be true or false.", + "confirmed" => "The :attribute confirmation does not match.", + "current_password" => "The password is incorrect.", + "date" => "The :attribute is not a valid date.", + "date_equals" => "The :attribute must be a date equal to :date.", + "date_format" => "The :attribute does not match the format :format.", + 'declined' => 'The :attribute field must be declined.', + 'declined_if' => 'The :attribute field must be declined when :other has the value :value.', + "different" => "The :attribute and :other must be different.", + "digits" => "The :attribute must be :digits digits.", + "digits_between" => "The :attribute must be between :min and :max digits.", + "dimensions" => "The :attribute has invalid image dimensions.", + "distinct" => "The :attribute field has a duplicate value.", + "email" => "The :attribute must be a valid email address.", + "ends_with" => "The :attribute must end with one of the following: :values.", + "exists" => "The selected :attribute is invalid.", + 'enum' => 'The :attribute field selected is invalid.', + "file" => "The :attribute must be a file.", + "filled" => "The :attribute field must have a value.", + "gt" => [ + "numeric" => "The :attribute must be greater than :value.", + "file" => "The :attribute must be greater than :value kilobytes.", + "string" => "The :attribute must be greater than :value characters.", + "array" => "The :attribute must have more than :value items.", ], - 'gte' => [ - 'numeric' => 'The :attribute must be greater than or equal to :value.', - 'file' => 'The :attribute must be greater than or equal to :value kilobytes.', - 'string' => 'The :attribute must be greater than or equal to :value characters.', - 'array' => 'The :attribute must have :value items or more.', + "gte" => [ + "numeric" => "The :attribute must be greater than or equal to :value.", + "file" => "The :attribute must be greater than or equal to :value kilobytes.", + "string" => "The :attribute must be greater than or equal to :value characters.", + "array" => "The :attribute must have :value items or more.", ], - 'image' => 'The :attribute must be an image.', - 'in' => 'The selected :attribute is invalid.', - 'in_array' => 'The :attribute field does not exist in :other.', - 'integer' => 'The :attribute must be an integer.', - 'ip' => 'The :attribute must be a valid IP address.', - 'ipv4' => 'The :attribute must be a valid IPv4 address.', - 'ipv6' => 'The :attribute must be a valid IPv6 address.', - 'json' => 'The :attribute must be a valid JSON string.', - 'lt' => [ - 'numeric' => 'The :attribute must be less than :value.', - 'file' => 'The :attribute must be less than :value kilobytes.', - 'string' => 'The :attribute must be less than :value characters.', - 'array' => 'The :attribute must have less than :value items.', + "image" => "The :attribute must be an image.", + "in" => "The selected :attribute is invalid.", + "in_array" => "The :attribute field does not exist in :other.", + "integer" => "The :attribute must be an integer.", + "ip" => "The :attribute must be a valid IP address.", + "ipv4" => "The :attribute must be a valid IPv4 address.", + "ipv6" => "The :attribute must be a valid IPv6 address.", + "json" => "The :attribute must be a valid JSON string.", + "lt" => [ + "numeric" => "The :attribute must be less than :value.", + "file" => "The :attribute must be less than :value kilobytes.", + "string" => "The :attribute must be less than :value characters.", + "array" => "The :attribute must have less than :value items.", ], - 'lte' => [ - 'numeric' => 'The :attribute must be less than or equal to :value.', - 'file' => 'The :attribute must be less than or equal to :value kilobytes.', - 'string' => 'The :attribute must be less than or equal to :value characters.', - 'array' => 'The :attribute must not have more than :value items.', + "lte" => [ + "numeric" => "The :attribute must be less than or equal to :value.", + "file" => "The :attribute must be less than or equal to :value kilobytes.", + "string" => "The :attribute must be less than or equal to :value characters.", + "array" => "The :attribute must not have more than :value items.", ], - 'mac_address' => 'The :attribute must be a valid MAC address.', - 'max' => [ - 'numeric' => 'The :attribute must not be greater than :max.', - 'file' => 'The :attribute must not be greater than :max kilobytes.', - 'string' => 'The :attribute must not be greater than :max characters.', - 'array' => 'The :attribute must not have more than :max items.', + 'mac_address' => 'The :attribute field must be a valid MAC address.', + "max" => [ + "numeric" => "The :attribute must not be greater than :max.", + "file" => "The :attribute must not be greater than :max kilobytes.", + "string" => "The :attribute must not be greater than :max characters.", + "array" => "The :attribute must not have more than :max items.", ], - 'mimes' => 'The :attribute must be a file of type: :values.', - 'mimetypes' => 'The :attribute must be a file of type: :values.', - 'min' => [ - 'numeric' => 'The :attribute must be at least :min.', - 'file' => 'The :attribute must be at least :min kilobytes.', - 'string' => 'The :attribute must be at least :min characters.', - 'array' => 'The :attribute must have at least :min items.', + "mimes" => "The :attribute must be a file of type: :values.", + "mimetypes" => "The :attribute must be a file of type: :values.", + "min" => [ + "numeric" => "The :attribute must be at least :min.", + "file" => "The :attribute must be at least :min kilobytes.", + "string" => "The :attribute must be at least :min characters.", + "array" => "The :attribute must have at least :min items.", ], - 'multiple_of' => 'The :attribute must be a multiple of :value.', - 'not_in' => 'The selected :attribute is invalid.', - 'not_regex' => 'The :attribute format is invalid.', - 'numeric' => 'The :attribute must be a number.', - 'password' => 'The password is incorrect.', - 'present' => 'The :attribute field must be present.', - 'prohibited' => 'The :attribute field is prohibited.', - 'prohibited_if' => 'The :attribute field is prohibited when :other is :value.', - 'prohibited_unless' => 'The :attribute field is prohibited unless :other is in :values.', - 'prohibits' => 'The :attribute field prohibits :other from being present.', - 'regex' => 'The :attribute format is invalid.', - 'required' => 'The :attribute field is required.', - 'required_array_keys' => 'The :attribute field must contain entries for: :values.', - 'required_if' => 'The :attribute field is required when :other is :value.', - 'required_unless' => 'The :attribute field is required unless :other is in :values.', - 'required_with' => 'The :attribute field is required when :values is present.', - 'required_with_all' => 'The :attribute field is required when :values are present.', - 'required_without' => 'The :attribute field is required when :values is not present.', - 'required_without_all' => 'The :attribute field is required when none of :values are present.', - 'same' => 'The :attribute and :other must match.', - 'size' => [ - 'numeric' => 'The :attribute must be :size.', - 'file' => 'The :attribute must be :size kilobytes.', - 'string' => 'The :attribute must be :size characters.', - 'array' => 'The :attribute must contain :size items.', + "multiple_of" => "The :attribute must be a multiple of :value.", + "not_in" => "The selected :attribute is invalid.", + "not_regex" => "The :attribute format is invalid.", + "numeric" => "The :attribute must be a number.", + "password" => "The password is incorrect.", + "present" => "The :attribute field must be present.", + 'prohibited' => 'The :attribute field is forbidden.', + 'prohibited_if' => 'The :attribute field is forbidden when :other has the value :value.', + 'prohibited_unless' => 'The :attribute field is forbidden unless :other is one of the :values.', + 'prohibits' => 'The :attribute field prohibits :other from being present.', + "regex" => "The :attribute format is invalid.", + "required" => "The :attribute field is required.", + 'required_array_keys' => 'The :attribute field must contain entries for :values.', + "required_if" => "The :attribute field is required when :other is :value.", + "required_unless" => "The :attribute field is required unless :other is in :values.", + "required_with" => "The :attribute field is required when :values is present.", + "required_with_all" => "The :attribute field is required when :values are present.", + "required_without" => "The :attribute field is required when :values is not present.", + "required_without_all" => "The :attribute field is required when none of :values are present.", + "same" => "The :attribute and :other must match.", + "size" => [ + "numeric" => "The :attribute must be :size.", + "file" => "The :attribute must be :size kilobytes.", + "string" => "The :attribute must be :size characters.", + "array" => "The :attribute must contain :size items.", ], - 'starts_with' => 'The :attribute must start with one of the following: :values.', - 'string' => 'The :attribute must be a string.', - 'timezone' => 'The :attribute must be a valid timezone.', - 'unique' => 'The :attribute has already been taken.', - 'uploaded' => 'The :attribute failed to upload.', - 'url' => 'The :attribute must be a valid URL.', - 'uuid' => 'The :attribute must be a valid UUID.', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - - 'custom' => [ - 'attribute-name' => [ - 'rule-name' => 'custom-message', + "starts_with" => "The :attribute must start with one of the following: :values.", + "string" => "The :attribute must be a string.", + "timezone" => "The :attribute must be a valid timezone.", + "unique" => "The :attribute has already been taken.", + "uploaded" => "The :attribute failed to upload.", + "url" => "The :attribute must be a valid URL.", + "uuid" => "The :attribute must be a valid UUID.", + 'attributes' => [ + 'firstname' => 'Firstname', + 'lastname' => 'Lastname', + 'email' => 'E-mail', + 'publication' => 'Publication', + 'updated_at' => 'Updated_at', + 'order' => 'Order', + ], + "custom" => [ + 'of_the' => [ + 'male' => 'of the ', + 'female' => 'of the ', + 'vowel' => 'of the ' ], + 'event' => 'event', + 'model' => 'target element', + 'order' => 'order', + 'publication' => 'publication', + 'activated' => 'activated', + 'target' => 'target', + 'static_page_type' => 'static page type', + 'seo_title' => 'SEO title', + 'seo_description' => 'SEO description', ], - - /* - |-------------------------------------------------------------------------- - | Custom Validation Attributes - |-------------------------------------------------------------------------- - | - | The following language lines are used to swap our attribute placeholder - | with something more reader friendly such as "E-Mail Address" instead - | of "email". This simply helps us make our message more expressive. - | - */ - - 'attributes' => [], - ]; diff --git a/resources/lang/en/vue.php b/resources/lang/en/vue.php index e7e959c..b4376aa 100644 --- a/resources/lang/en/vue.php +++ b/resources/lang/en/vue.php @@ -2,29 +2,29 @@ return [ 'ImageInputComponent' => [ - 'choose_a_file' => 'Choose a file', - 'change_source_picture' => 'Edit Source Image', - 'view_source_picture' => 'View image', - 'resize_source_picture' => 'Resize image', - 'resized_source_picture' => 'Image resized', - 'preview_picture' => 'Image preview', - 'change_picture_before_import' => 'Image modification before import', - 'close_window' => 'Close the window', - 'close_and_validate' => 'Validate the content and close the window', + 'choose_a_file' => 'Choose a file', + 'change_source_picture' => 'Edit Source Image', + 'view_source_picture' => 'View image', + 'resize_source_picture' => 'Resize image', + 'resized_source_picture' => 'Image resized', + 'preview_picture' => 'Image preview', + 'change_picture_before_import' => 'Image modification before import', + 'close_window' => 'Close the window', + 'close_and_validate' => 'Validate the content and close the window', 'close_window_without_validation' => 'Close the window without validating the content', - 'zoom_in' => 'Zoom in', - 'zoom_out' => 'Zoom out', - 'move_left' => 'Move left', - 'move_right' => 'Move right', - 'move_up' => 'Move up', - 'move_down' => 'Move down', - 'mirror_horizontal' => 'Horizontal mirror', - 'mirror_vertical' => 'Vertical mirror', - 'rotation' => 'Rotation', - 'rotate_rewind' => 'Counter-clockwise rotation', - 'rotate' => 'Clockwise rotation', - 'degres' => ':deg degrees', - 'validate' => 'Validate', - 'preview' => 'Preview', + 'zoom_in' => 'Zoom in', + 'zoom_out' => 'Zoom out', + 'move_left' => 'Move left', + 'move_right' => 'Move right', + 'move_up' => 'Move up', + 'move_down' => 'Move down', + 'mirror_horizontal' => 'Horizontal mirror', + 'mirror_vertical' => 'Vertical mirror', + 'rotation' => 'Rotation', + 'rotate_rewind' => 'Counter-clockwise rotation', + 'rotate' => 'Clockwise rotation', + 'degres' => ':deg egrees', + 'validate' => 'Validate', + 'preview' => 'Preview', ] ]; diff --git a/resources/lang/fr/crud.php b/resources/lang/fr/crud.php index 852a7e5..d661a3f 100644 --- a/resources/lang/fr/crud.php +++ b/resources/lang/fr/crud.php @@ -1,57 +1,73 @@ <?php return [ - 'actions' => [ - 'list' => 'Liste', - 'view' => 'Voir', - 'create' => 'Créer', - 'update' => 'Mettre à jour', - 'delete' => 'Supprimer', - 'save' => 'Enregistrer', - 'edit' => 'Editer', + 'actions' => [ + 'list' => 'Liste', + 'view' => 'Voir', + 'create' => 'Créer', + 'duplicate' => 'Dupliquer', + 'update' => 'Éditer', + 'delete' => 'Supprimer', + 'save' => 'Sauvegarder', + 'edit' => 'Mettre à jour', ], - 'helpers' => [ - 'list' => 'Liste', - 'list_all' => 'Liste des :model', - 'create_model' => 'Créer un(e) :model', - 'view_model' => 'Voir le/la :model', - 'update_model' => 'Mettre à jour le/la :model', - 'delete_model' => 'Supprimer le/la :model', - 'no_results' => 'Aucun résultat pour :models', - 'publish' => 'Publier', - 'unpublish' => 'Dépublier', + 'helpers' => [ + 'list' => 'Liste', + 'list_all' => 'Lister tous les :model', + 'create_model' => 'Créer :model', + 'view_model' => 'Voir :model', + 'update_model' => 'Éditer :model', + 'duplicate_model' => 'Dupliquer :model', + 'delete_model' => 'Supprimer :model', + 'save_model' => 'Sauvegarder :model', + 'edit_model' => 'Mettre à jour :model', + 'no_results' => 'Aucun résultat pour :model', + 'publish' => 'Publié', + 'unpublish' => 'Dépublié', + 'seo_title' => 'Doit décrire précisément la page, recommandation pour un positionnement + optimal dans les moteurs de recherche (balise <title>).', + 'seo_description' => 'Doit décrire précisément le contenu de la page (balise <meta> description).', ], - 'libs' => [ + 'libs' => [ 'toolbox' => [ - 'assertFieldIsUnique' => 'La valeur :value pour le champ :attribute field est déjà utilisée', - 'assertNoInternalBoUrls' => ':attribute : Il est interdit de coller une uri du backoffice dans ce champ', - 'assertNoInternalUrls' => ':attribute : Il est interdit de coller une url de :appname dans ce champ', + 'assertFieldIsUnique' => 'La :valeur du champ :attribut est déjà utilisée', + 'assertNoInternalBoUrls' => ':attribute : Il est interdit de coller l\'uri de back-office dans ce champ', + 'assertNoInternalUrls' => ':attribute : Il est interdit de coller une url de :appname dans ce champ.', ] ], - 'messages' => [ - 'has_been_created' => ':model a été créé', - 'cannot_be_created' => ':model ne peut pas être créé', - 'has_been_updated' => ':model a été mis à jour', - 'cannot_be_updated' => ':model ne peut pas être mis à jour', - 'has_been_deleted' => ':model a été supprimé', - 'cannot_be_deleted' => ':model ne peut pas être supprimé' + 'messages' => [ + 'has_been_created' => ':model a été créé', + 'cannot_be_created' => ':model ne peut être créé', + 'has_been_updated' => ':model a été mis à jour', + 'cannot_be_updated' => ':model ne peut être mis à jour', + 'has_been_deleted' => ':model a été supprimé', + 'cannot_be_deleted' => ':model ne peut être supprimé', + 'order_changed' => 'L\'ordre a été changé !', + 'order_not_changed' => 'L\'ordre n\'a pas été changé !', + 'publish_status_saved' => 'Changement de l\'état de publication réussit !', + 'right' => 'Vous n\'avez pas les droits pour accéder à cette partie !' ], - 'minicrud' => [ - 'visibility_label' => 'Visibilité', - 'visibility_helper' => 'Cochez pour rendre visible.', - 'select' => 'Sélectionnez un(e) :entity depuis la liste.', - 'associated' => ':entity associé(e)', - 'dimensions_must_be' => 'Doit être de :widthpx (largeur) par :heightpx (hauteur).', - 'picture_title_helper' => 'Utile pour les utilisateurs, affiché lorsque la souris est sur l\'image', - 'picture_title_label' => 'Attribut \'title\' de l\'image', - 'picture_alt_helper' => 'Doit décrire l\'image pour les moteurs de recherches et les personnes malvoyantes - (5 à 6 mots)', - 'picture_alt_label' => 'Attribut \'alt\' de l\'image', - 'text_warning' => 'Relisez votre contenu avant de le publier', + 'pagination' => [ + "previous" => "Page précédente", + "next" => "Page suivante", + "specific_page" => "Accéder à la page n°:id", + 'paginate_list' => 'Nombre d\'éléments par page', + ], + 'other' => [ + 'up' => 'Modifier l\'ordre d\'apparition vers le haut', + 'down' => 'Modifier l\'ordre d\'apparition vers le bas', + 'no_model_found' => 'Aucun :model trouvé|Aucune :model trouvée', + 'publish' => 'Publié', + 'unpublish' => 'Dépublié', + 'sort_ascending' => 'Trier :name dans l\'ordre croissant', + 'sort_descending' => 'Trier :name dans l\'ordre décroissant', + 'sort_delete' => 'Supprimer le tri', + 'sort_arrow' => 'Ici, les flèches sont utilisées pour trier et non pour filtrer', + 'right' => 'Vous n\'avez pas les droits', ] ]; diff --git a/resources/lang/fr/models.php b/resources/lang/fr/models.php index 527d4b9..da2b323 100644 --- a/resources/lang/fr/models.php +++ b/resources/lang/fr/models.php @@ -2,12 +2,13 @@ return [ 'classes' => [ - 'home' => 'Accueil', - 'shops' => 'Enseignes', - 'ranges' => 'Gammes', - 'recipes' => 'Recettes', - 'slides' => 'Slides', - 'products' => 'Produits', - 'certifications' => 'Certifications' + 'home' => 'Accueil', + 'shops' => 'Enseignes', + 'ranges' => 'Gammes', + 'recipes' => 'Recettes', + 'slides' => 'Slides', + 'products' => 'Produits', + 'certifications' => 'Certifications', + 'static_page' => 'Page statique|Pages statiques' ] ]; diff --git a/resources/lang/fr/validation.php b/resources/lang/fr/validation.php index 574e7ad..a38a78f 100644 --- a/resources/lang/fr/validation.php +++ b/resources/lang/fr/validation.php @@ -1,18 +1,6 @@ <?php return [ - - /* - |-------------------------------------------------------------------------- - | Validation Language Lines - |-------------------------------------------------------------------------- - | - | The following language lines contain the default error messages used by - | the validator class. Some of these rules have multiple versions such - | as the size rules. Feel free to tweak each of these messages here. - | - */ - 'accepted' => 'Le champ :attribute doit être accepté.', 'accepted_if' => 'Le champ :attribute doit être accepté quand :other a la valeur :value.', 'active_url' => 'Le champ :attribute n\'est pas une URL valide.', @@ -129,26 +117,87 @@ return [ 'uploaded' => 'Le fichier du champ :attribute n\'a pu être téléversé.', 'url' => 'Le format de l\'URL de :attribute n\'est pas valide.', 'uuid' => 'Le champ :attribute doit être un UUID valide', - 'custom' => [], - 'phone' => 'Le champ :attribute n\'est pas un numéro de téléphone valide.', - 'color' => ':attribute doit être un code couleur valide (hexadecimal, RGB, RGBA ou un nom de couleur CSS)', - 'color_hex' => ':attribute doit être un code couleur hexadecimal valide', - 'color_rgb' => ':attribute doit être un code couleur RGB valide', - 'color_rgba' => ':attribute doit être un code couleur RGBA valide', - 'color_name' => ':attribute doit être un nom de couleur CSS valide', - - /* - |-------------------------------------------------------------------------- - | Custom Validation Language Lines - |-------------------------------------------------------------------------- - | - | Here you may specify custom validation messages for attributes using the - | convention "attribute.rule" to name the lines. This makes it quick to - | specify a specific custom language line for a given attribute rule. - | - */ - - 'postal_code' => - 'Le champ :attribute accepte les codes postaux des pays suivants :countries comme par exemple :examples.', - + 'custom' => [ + 'text_warning' => 'Relisez votre contenu avant de le publier (minimum :number caractères).', + 'text_proofread' => 'Relisez votre contenu avant de le publier.', + 'select_entity' => 'Sélectionnez :entity dans la liste déroulante.', + 'color' => 'Sélectionnez :entity parmis les couleurs existantes.', + 'dimensions_must_be' => 'Doit être :widthpx (largeur) par :heightpx (hauteur).', + 'image_alt' => 'La description de l\'image doit être adaptée aux moteurs de recherche et + aux non-voyants (5 à 6 mots, minimum 3 caractères).', + 'image_title' => + 'Utile pour les utilisateurs, affiché en passant la souris sur l\'image + (minimum 3 caractères).', + 'seo_title_helper' => 'Doit décrire précisément la page, recommandation pour un positionnement + optimal dans les moteurs de recherche (balise <title>).', + 'seo_description_helper' => 'Doit décrire précisément le contenu de la page (balise <meta> description).', + 'event_text_helper' => 'Doit décrire l\'évènement.', + 'slider_pictures' => 'Les images du slider doivent être de :widthpx (largeur) par :heightpx (hauteur), + (minimum :min et maximum :max images sont autorisées).', + 'list_items' => 'Doit décrire la valeur du :field (minimum :min caractères, + :lineMin à :lineMax lignes).', + 'of_the' => [ + 'male' => 'du ', + 'female' => 'de la ', + 'vowel' => 'de l\'' + ], + 'event' => 'évènement', + 'model' => 'élément ciblé', + 'order' => 'ordre', + 'publication' => 'publication', + 'activated' => 'activé', + 'target' => 'cible', + 'static_page_type' => 'type de page', + 'seo_title' => 'titre SEO', + 'seo_description' => 'description SEO', + ], + 'attributes' => [ + 'advantages' => 'Avantages', + 'associated_news' => 'Actualités associées', + 'associated_products' => 'Produits associés', + 'attribute_alt' => 'Attribut alt', + 'attribute_title' => 'Attribut title', + 'button' => 'Bouton', + 'caliber' => 'Calibre', + 'categories' => 'Catégorie(s)', + 'color' => 'Couleur', + 'content' => 'Contenu', + 'content_bloc' => 'Corps du bloc', + 'cooking_time' => 'Temps de cuisson', + 'created_at' => 'Créé le', + 'declare_event' => 'Déclarer un évènement', + 'description' => 'Description', + 'difficulty' => 'Difficulté', + 'event_end' => 'Date de fin de l\'évènement', + 'event_start' => 'Date de début de l\'évènement', + 'event' => 'Évènement', + 'general_informations' => 'Informations générales', + 'high_point' => 'Point fort', + 'id' => 'Id', + 'ingredients' => 'Ingrédients', + 'label' => 'Libellé', + 'link' => 'Lien', + 'nutritionnal_values' => 'Valeurs nutritionnelles', + 'order' => 'Ordre', + 'packaging' => 'Conditionnement', + 'page' => 'Espèce', + 'picture_banner' => 'Bannière', + 'picture_thumbnail_sm' => 'Petite vignette', + 'picture_thumbnail' => 'Vignette', + 'picture' => 'Image', + 'preparation_time' => 'Temps de préparation', + 'preparation' => 'Préparation', + 'seo_description' => 'Description SEO', + 'seo_title' => 'Titre SEO', + 'seo' => 'Contenu SEO', + 'species' => 'Espèce', + 'status' => 'État de publication', + 'subtitle' => 'Sous-titre', + 'title' => 'Titre', + 'updated_at' => 'Mis à jour le', + 'youtube_video' => 'Vidéo Youtube', + 'guests_nb' => 'Nombre de convives', + 'advice' => 'Conseil', + 'preparation' => 'Préparation', + ], ]; diff --git a/resources/lang/fr/vue.php b/resources/lang/fr/vue.php index 31e8581..e61b679 100644 --- a/resources/lang/fr/vue.php +++ b/resources/lang/fr/vue.php @@ -2,29 +2,29 @@ return [ 'ImageInputComponent' => [ - 'choose_a_file' => 'Choisir un fichier', - 'change_source_picture' => 'Editer l\'image source', - 'view_source_picture' => 'Voir l\'image', - 'resize_source_picture' => 'Redimensonner l\'image', - 'resized_source_picture' => 'Image redimensionnée', - 'preview_picture' => 'Aperçu de l\'image', - 'change_picture_before_import' => 'Modification de l\'image avant l\'import', - 'close_window' => 'Fermer la fenêtre', - 'close_and_validate' => 'Valider le contenu et fermer la fenêtre', + 'choose_a_file' => 'Choisir un fichier', + 'change_source_picture' => 'Modifier l\'image source', + 'view_source_picture' => 'Voir l\'image', + 'resize_source_picture' => 'Redimensionner l\'image', + 'resized_source_picture' => 'Image redimensionnée', + 'preview_picture' => 'Aperçu de l\'image', + 'change_picture_before_import' => 'Modification de l\'image avant l\'importation', + 'close_window' => 'Fermer la fenêtre', + 'close_and_validate' => 'Valider le contenu et fermer la fenêtre', 'close_window_without_validation' => 'Fermer la fenêtre sans valider le contenu', - 'zoom_in' => 'Zoomer', - 'zoom_out' => 'Dézommer', - 'move_left' => 'Déplacer vers la gauche', - 'move_right' => 'Déplacer vers la droite', - 'move_up' => 'Déplacer vers le haut', - 'move_down' => 'Déplacer vers le bas', - 'mirror_horizontal' => 'Symétrie horizontale', - 'mirror_vertical' => 'Symétrie verticale', - 'rotation' => 'Rotation', - 'rotate_rewind' => 'Rotation antihoraire', - 'rotate' => 'Rotation horaire', - 'degres' => ':deg degrés', - 'validate' => 'Valider', - 'preview' => 'Aperçu', + 'zoom_in' => 'Zoom avant', + 'zoom_out' => 'Zoom arrière', + 'move_left' => 'Déplacer vers la gauche', + 'move_right' => 'Déplacer vers la droite', + 'move_up' => 'Déplacer en vers le haut', + 'move_down' => 'Déplacer en vers le bas', + 'mirror_horizontal' => 'Miroir horizontal', + 'mirror_vertical' => 'Miroir vertical', + 'rotation' => 'Rotation', + 'rotate_rewind' => 'Rotation dans le sens inverse des aiguilles d\'une montre', + 'rotate' => 'Rotation dans le sens des aiguilles d\'une montre', + 'degres' => ':deg degrés', + 'validate' => 'Valider', + 'preview' => 'Prévisualisation', ] ]; diff --git a/resources/views/bo/layouts/nav-menu.blade.php b/resources/views/bo/layouts/nav-menu.blade.php index 6c37c3b..85ee904 100644 --- a/resources/views/bo/layouts/nav-menu.blade.php +++ b/resources/views/bo/layouts/nav-menu.blade.php @@ -51,5 +51,12 @@ {{ __('models.classes.shops') }} </a> </li> + <li class="nav-item"> + <a class="nav-link text-dark @if (request()->routeIs('bo.static_pages.*')) fw-bold @endif" data-bs-toggle="tooltip" + href="{{ route('bo.static_pages.index', ['sort_col' => 'updated_at', 'sort_way' => 'desc']) }}" + title="{{ __('Administrer les :model', ['model' => trans_choice('models.classes.static_page', '*')]) }}"> + {{ Str::title(trans_choice('models.classes.static_page', '*')) }} + </a> + </li> </ul> @endauth diff --git a/resources/views/bo/pages/static_pages/edit.blade.php b/resources/views/bo/pages/static_pages/edit.blade.php new file mode 100644 index 0000000..70ebccc --- /dev/null +++ b/resources/views/bo/pages/static_pages/edit.blade.php @@ -0,0 +1,56 @@ +@extends('bo.layout', ['brParam' => $staticPageModel]) + +@section('title', sprintf('%s - %s %s', __('models.classes.static_page'), Str::ucfirst(__('édition')), $staticPageModel->title)) + +@section('breadcrumb', request()->route()->getName()) + +@section('content') + <div class="card"> + <div class="card-header"> + <div class="row"> + <div class="col"> + <h1 class="col h4"> + <a href="{{ route('bo.static_pages.index') }}" class="text-decoration-none btn btn-sm btn-primary" + role="button" aria-roledescription="{{ __('Revenir en arrière') }}"> + <i class="fa-solid fa-arrow-left-long"></i> + </a> + <span> {{ Str::title(trans_choice('models.classes.static_page', '*')) }} {{ __('édition') }}</span> + </h1> + </div> + <div class="col text-end"> + <div class="btn-group" role="group"> + <a class="btn btn-warning" + href="{{ route('legals') }}" + title="{{ __('Voir :model', [ + 'model' => Str::singular(__('models.classes.static_page')), + ]) }}" + target="_blank" + data-bs-toggle="tooltip"><i class="fa-solid fa-eye"></i></a> + <a id="formSubmitClone" class="btn btn-primary" role="button" + title="{{ __('Enregistrer :model', [ + 'model' => Str::singular(__('models.classes.static_page')), + ]) }}" + data-bs-toggle="tooltip">{{ __('Enregistrer') }}</a> + </div> + </div> + </div> + </div> + <div class="card-body"> + <form id="formSubmit" action="{{ route('bo.static_pages.update', $staticPageModel) }}" method="POST" enctype="multipart/form-data"> + @csrf + @method('PUT') + @include('bo.pages.static_pages.form', compact('staticPageModel')) + <div class="row"> + <div class="col text-center text-md-end"> + <button type="submit" class="btn btn-primary" + title="{{ __('Enregister :model', [ + 'model' => Str::singular(__('models.classes.static_page')), + ]) }}" + data-bs-toggle="tooltip">{{ __('Enregister') }}</button> + </div> + </div> + </form> + </div> + </div> +@endsection + diff --git a/resources/views/bo/pages/static_pages/form.blade.php b/resources/views/bo/pages/static_pages/form.blade.php new file mode 100644 index 0000000..31bbef1 --- /dev/null +++ b/resources/views/bo/pages/static_pages/form.blade.php @@ -0,0 +1,171 @@ +<div class="row"> + {{-- TYPE --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.static_page_type')) }}</legend> + <div class="row"> + <div class="col-12"> + @include('bo.partials.inputs.tinyint-enum', [ + 'id' => 'userRole', + 'label' => __('Associer un type'), + 'name' => 'type', + 'model' => $staticPageModel ?? null, + 'required' => false, + 'disabled' => true, + 'associatedModels' => \App\Enums\StaticPageType::toArray(), + 'helper' => '', + ]) + </div> + </div> + </fieldset> + </div> + {{-- TITLE --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.attributes.title')) }}</legend> + <div class="row"> + <div class="col-12"> + @include('bo.partials.inputs.varchar', [ + 'id' => 'userFirstname', + 'label' => __('Titre de la :model', ['model' => trans_choice('models.classes.static_page', 1)]), + 'hasWordCounter' => true, + 'name' => 'title', + 'required' => true, + 'model' => $staticPageModel ?? null, + 'helper' => __('validation.between.string', [ + 'attribute' => __('titre de la :model', ['model' => trans_choice('models.classes.static_page', 1)]), + 'min' => 3, + 'max' => 255, + ]), + 'placeholder' => __('Un titre clair et concis'), + ]) + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + {{-- SEO_TITLE --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.seo_title')) }}</legend> + <div class="row"> + <div class="col-12 mb-3"> + @include('bo.partials.inputs.varchar', [ + 'id' => 'staticPagesSeoTitle', + 'label' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_title')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'hasWordCounter' => true, + 'name' => 'seo_title', + 'required' => true, + 'model' => $staticPageModel ?? null, + 'helper' => sprintf( + '%s %s', + __('crud.helpers.seo_title'), + __('validation.between.string', [ + 'attribute' => __(':field :inter:model', [ + 'field' => __('validation.custom.seo_title'), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'min' => 45, + 'max' => 70, + ])), + 'placeholder' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_title')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + ]) + </div> + </div> + </fieldset> + </div> + {{-- SEO_DESCRIPTION --}} + <div class="col-12 col-md-6 mb-3"> + <fieldset class="h-100 border p-3"> + <legend>{{ Str::ucfirst(__('validation.custom.seo_description')) }}</legend> + <div class="row"> + <div class="col-12"> + @include('bo.partials.inputs.varchar-multiline', [ + 'id' => 'staticPagesSeoDescription', + 'label' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_description')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'name' => 'seo_description', + 'model' => $staticPageModel ?? null, + 'required' => true, + 'helper' => sprintf( + '%s %s', + __('crud.helpers.seo_description'), + __('validation.between.string', [ + 'attribute' => __(':field :inter:model', [ + 'field' => __('validation.custom.seo_description'), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'min' => 50, + 'max' => 160, + ])), + 'placeholder' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.custom.seo_description')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + ]) + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + {{-- CONTENT --}} + <div class="col-12 mb-3"> + <fieldset class="border p-3"> + <legend>{{ Str::ucfirst(__('validation.attributes.content')) }}</legend> + <div class="row mb-3"> + <div class="col-12"> + @include('bo.partials.inputs.text-html', [ + 'id' => 'articleContent', + 'label' => __(':field :inter:model', [ + 'field' => Str::ucfirst(__('validation.attributes.content')), + 'inter' => __('validation.custom.of_the.female'), + 'model' => trans_choice('models.classes.static_page', 1), + ]), + 'name' => 'content', + 'model' => $staticPageModel ?? null, + 'required' => true, + 'helper' => __('validation.custom.text_proofread'), + ]) + </div> + </div> + </fieldset> + </div> +</div> + +<div class="row"> + <div class="col text-center"> + <p><b>{{ __('* Champs obligatoires') }}</b></p> + </div> +</div> + +@push('scripts') + <script nonce="{{ $nonce }}"> + document.addEventListener("DOMContentLoaded", () => { + // Submit button clone. + const submit = document.getElementById('formSubmit') + submitClone = document.getElementById('formSubmitClone'); + submitClone.addEventListener('click', (event) => { + event.preventDefault(); + submit.click(''); + }) + }); + </script> +@endpush diff --git a/resources/views/bo/pages/static_pages/index-list.blade.php b/resources/views/bo/pages/static_pages/index-list.blade.php new file mode 100644 index 0000000..ef009f5 --- /dev/null +++ b/resources/views/bo/pages/static_pages/index-list.blade.php @@ -0,0 +1,39 @@ +<table class="table-hover table-fix-action m-0 table"> + @if (count($staticPageModelList) > 0) + <thead> + @include('modules.table-col-sorter', [ + 'cols' => [ + 'type' => Str::ucfirst(__('validation.custom.static_page_type')), + 'title' => Str::ucfirst(__('validation.attributes.title')), + 'updated_at' => Str::ucfirst(__('validation.attributes.updated_at')), + ], + ]) + </thead> + <tbody> + @foreach ($staticPageModelList as $staticPageModel) + <tr class="border-bottom"> + <td class="text-start align-middle">{{ $staticPageModel->type->label() }}</td> + <td class="text-start align-middle">{{ $staticPageModel->title }}</td> + <td class="text-start align-middle"> + <span class="badge bg-secondary">{{ $staticPageModel->updated_at->isoFormat('LLLL') }}</span> + </td> + <td class="text-end align-middle"> + <div class="btn-group"> + <a class="btn btn-sm btn-primary" data-bs-toggle="tooltip" + href="{{ route('bo.static_pages.edit', ['static_page' => $staticPageModel]) }}" + title="{{ Str::ucfirst(__('crud.actions.update')) }}"> + <i class="fa-solid fa-pencil"></i> + </a> + </div> + </td> + </tr> + @endforeach + </tbody> + @else + <tr> + <td class="border-0"> + {{ trans_choice('crud.other.no_model_found', 2, ['model' => Str::ucfirst(\trans_choice('models.classes.static_page', 1))]) }} + </td> + </tr> + @endif +</table> diff --git a/resources/views/bo/pages/static_pages/index.blade.php b/resources/views/bo/pages/static_pages/index.blade.php new file mode 100644 index 0000000..1d60177 --- /dev/null +++ b/resources/views/bo/pages/static_pages/index.blade.php @@ -0,0 +1,36 @@ +@extends('bo.layout') + +@section('title', sprintf('%s - %s', __('models.classes.static_pages'), Str::ucfirst(__('liste')))) + +@section('breadcrumb', request()->route()->getName()) + +@section('content') + <div class="card"> + <div class="card-header"> + <div class="row"> + <div class="col"> + <h1 class="h3">{{ Str::title(trans_choice('models.classes.static_page', '*')) }} {{ Str::ucfirst(__('liste')) }}</h1> + </div> + </div> + </div> + <div class="card-body"> + @include('modules.search-bar') + <div class="row justify-content-center"> + <div class="col-12 col-md-6 p-0 p-md-3"> + {{ $staticPageModelList->withQueryString()->onEachSide(1)->links() }} + </div> + </div> + <div class="row"> + <div class="col"> + @include('bo.pages.static_pages.index-list') + </div> + </div> + <div class="row justify-content-center"> + <div class="col-12 col-md-6 p-0 p-md-3"> + {{ $staticPageModelList->withQueryString()->onEachSide(1)->links() }} + </div> + </div> + </div> + </div> +@endsection + diff --git a/resources/views/fo/pages/legals.blade.php b/resources/views/fo/pages/legals.blade.php index 4afcd64..71ba5e3 100644 --- a/resources/views/fo/pages/legals.blade.php +++ b/resources/views/fo/pages/legals.blade.php @@ -1,7 +1,7 @@ @extends('fo.layout') -@section('title', "Mentions légales") -@section('description', "Mentions légales et conditions générales d'utilisation du site internet Lionor") +@section('title', __($staticPageModel->seo_title)) +@section('description', __($staticPageModel->seo_description)) @section('breadcrumb', request()->route()->getName()) @section('content') @@ -23,117 +23,12 @@ <div class="container pt-lg-5"> <div class="row justify-content-center"> <section class="col-md-10 stripes px-5"> - <h1 class="text-uppercase text-center font-amatic font-amatic-48"> - {{ __('Mentions légales et conditions générales d\'utilisation') }} - <span>{{ __('du site internet Lionor') }}</span> - </h1> + <h1 class="text-uppercase text-center font-amatic font-amatic-48">{{ __($staticPageModel->title) }}</h1> </section> </div> <div class="contact-wrapper position-relative bg-ardoise-radial pt-5 pt-sm-6"> <div class="row wrapper-xl mb-3"> - <h2 class="h2 color-second">Introduction</h2> - <p> - Nous vous remercions de lire ces conditions générales d'utilisation - qui régissent les conditions d'accès et d'utilisation du site - <a href="{{ route('home') }}">lionor.fr</a> <br><br> - <strong> - Nous vous invitons à consulter régulièrement cette rubrique car la - société Lionor peut être amenée à la modifier à tout moment.<br><br> - Tout utilisateur déclare avoir lu et accepté les mentions légales et - les conditions générales d'utilisation et s'engage à s'y - conformer.<br> - </strong><br><br> - Mise à jour le 15/03/2023. - </p> - - <h2 class="h2 color-second">Mentions légales</h2> - <p> - Lionor RTE DE LA GARE 59189 STEENBECQUE<br> - Tél : +33(0)328436055 SAS au capital de 1 646 400 euros - - RCS de Dunkerque sous le numéro 305 507 303<br><br> - <strong>Editeur du Site</strong> : LDC Services 98 à 102 Rue Albert Einstein 72000 Le Mans<br> - <strong>Directeur de la publication</strong> : Sylvain Gouet, Responsable Web Marketing Groupe LDC<br> - <strong>Conception du site et réalisation</strong> : LDC Services 98 à 102 Rue Albert Einstein 72000 Le Mans<br> - <strong>Illustrations</strong> : Médiapole 2020<br> - <strong>Le site est hébergé par</strong> : OVH, via LDC, SAS au capital de 10 069 020 euros, RCS Lille Métropole 537 407 926, 2 rue Kellermann - 59100 Roubaix, Tel : 09 72 10 10 07, Mail : hosting@ml.ovh.net<br> - </p> - - <h2 class="h2 color-second"> - Droit d'auteur - Droit des marques - Protection des bases de données - </h2> - <p> - La présentation et le contenu du site constituent, ensemble, une œuvre - protégée par les lois en vigueur des droits d'auteur, de la propriété - intellectuelle et industrielle.<br><br> - - Les créations apparaissant sur le site (dessins, photographies, - images, textes, séquences animées sonores ou non et autres - documentations représentées), sont objets de droits d'auteur, de - propriété industrielle et/ou intellectuelle et sont, selon les cas, - propriété de la société Lionor ou de tiers ayant autorisé la - société Lionor à les utiliser.<br> - Aucune exploitation commerciale, reproduction, représentation, - utilisation, adaptation, modification, incorporation, traduction, - commercialisation, partielle ou intégrale de ces éléments (y compris - ceux téléchargeables ou copiables) ne pourra en être faite sans - l'accord préalable et écrit de la société Lionor, à l'exception de - l'utilisation pour un usage privé sous réserve des dispositions - différentes voire plus restrictives du Code de la propriété - intellectuelle.<br> - Toute utilisation non expressément autorisée peut engager la - responsabilité civile et/ou pénale de son auteur. Lionor se réserve - le droit d'engager des poursuites judiciaires à l'encontre de toute - personne qui n'aurait pas respecté cette interdiction. - </p> - - <h2 class="h2 color-second">Vie privée - Données personnelles - Cookies</h2> - <p> - Nous vous invitons à vous reporter à notre Charte de confidentialité - en <a href="{{ route('policies') }}">cliquant ici</a>. - </p> - - <h2 class="h2 color-second">Mentions Sanitaires :</h2> - <p>Pour votre santé :<br> - - mangez au moins cinq fruits et légumes par jour<br> - - pratiquez une activité physique régulière<br> - - évitez de manger trop gras, trop sucré, trop salé<br> - - évitez de grignoter entre les repas - </p> - - <p> - Pour toute information complémentaire, consultez le site - <a href="https://www.mangerbouger.fr">www.mangerbouger.fr</a> - </p> - - <h2 class="h2 color-second">Responsabilité</h2> - <p> - Lionor a déployé ses meilleurs efforts pour s'assurer de - l'exactitude des informations présentes sur son site internet - (ci-après le Site). Cependant, Lionor n'est responsable ni de - l'exactitude, ni des erreurs, ni des omissions contenues sur le Site. - L'utilisateur est seul responsable de l'utilisation de telles - informations.<br> - Lionor ne donne aucune garantie, explicite ou implicite, et - n'assume aucune responsabilité qui pourrait résulter de l'accès ou de - l'utilisation de ce Site incluant toutes détériorations ou virus qui - pourraient infecter l'équipement informatique ou tout autre bien de - l'utilisateur.<br> - Par ailleurs.<br> - Lionor pourra unilatéralement et à tout moment interrompre - temporairement ou définitivement l'accès à tout ou partie du Site, y - compris notamment le contenu, les fonctionnalités ou les heures de - disponibilité, sans que sa responsabilité ne puisse être recherchée et - sans que cela ne puisse donner lieu à l'allocation de dommages et - intérêts de quelque nature que ce soit.<br> - Les pages du Site peuvent contenir des liens hypertextes renvoyant - vers d'autres sites internet gérés par des sociétés distinctes de - Lionor, et sur lesquels Lionor n'exerce aucune sorte de - contrôle. Lionor n'est pas responsable du contenu de tout autre - site auquel vous pourriez avoir accès via le Site ou les autres sites - internet du groupe LDC. Tout utilisateur ou visiteur du Site ne peut - mettre en place un lien hypertexte en direction de ce Site sans - l'autorisation expresse préalable de Lionor. - </p> + {!! clean($staticPageModel->content) !!} </div> </div> </div> diff --git a/resources/views/fo/pages/policies.blade.php b/resources/views/fo/pages/policies.blade.php index 3530f85..ada1a00 100644 --- a/resources/views/fo/pages/policies.blade.php +++ b/resources/views/fo/pages/policies.blade.php @@ -23,381 +23,12 @@ <div class="container pt-lg-5"> <div class="row justify-content-center"> <section class="col-md-8 stripes px-5"> - <h1 class="text-uppercase text-center font-amatic font-amatic-48">{{ __('Politique des données personnelles') }}</h1> + <h1 class="text-uppercase text-center font-amatic font-amatic-48">{{ __($staticPageModel->title) }}</h1> </section> </div> <div class="contact-wrapper position-relative bg-ardoise-radial pt-5 pt-sm-6"> <div class="row wrapper-xl mb-3"> - <h2 class="h2 color-second">Introduction</h2> - <p> - Le nouveau Règlement Général de l'Union Européenne sur la Protection - des Données (RGPD), entré en vigueur le 25 mai 2018, vise à mieux - encadrer la collecte, le traitement et l'utilisation de vos données - personnelles.<br> - Lionor, en sa qualité de responsable du traitement, renforce ses - engagements pour garantir la protection et la sécurité des données à - caractère personnel que vous lui confiez.<br><br> - </p> - <p> - A ce titre, la présente Charte de confidentialité vous informe sur le - type de données que nous collectons, comment nous les traitons, dans - quelles finalités, de manière à rendre leur utilisation la plus - adaptée à vos besoins. <br><br> - Le responsable de traitement, qui collecte et gère vos données, est la - société Lionor, SA au capital social de 1 646 400 - immatriculée au registre du commerce et des sociétés de Dunkerque sous - le numéro 305 507 303, dont le siège social est RTE DE LA GARE 59189 STEENBECQUE.<br><br> - Pour toute question relative à notre Charte de confidentialité, merci - de nous contacter via le formulaire de contact suivant:<br> - <a href="https://www.ldc.fr/rgpd/professionnels/">https://www.ldc.fr/rgpd/professionnels/</a><br> - <a href="https://www.ldc.fr/rgpd/consommateurs/">https://www.ldc.fr/rgpd/consommateurs/</a><br> - <a href="https://www.ldc.fr/rgpd/salaries/">https://www.ldc.fr/rgpd/salaries/</a><br><br> - Nous vous invitons à consulter régulièrement cette rubrique car - Lionor peut être amené à la modifier à tout moment. <br> - La présente Charte de confidentialité a été mise à jour le 15/03/2023. - </p> - - <h2 class="h2 color-second">Nos Engagements</h2> - <p> - Conformément à la réglementation relative à la protection des données - personnelles et à la vie privée, notamment la loi n°78-17 du 6 janvier - 1978 relative à l'informatique, aux fichiers et aux libertés dite loi - « Informatique et Libertés » et au Règlement (UE) 2016/679 du 25 mai - 2018 relatif à la protection des personnes physiques à l'égard du - traitement des données à caractère personnel et à la libre circulation - de ces données, (ci-après le « Règlement RGPD»), Lionor s'engage à - respecter les principes suivants : <br><br> - <strong>Consentement</strong>: vous devez avoir consenti à la collecte et au - traitement de vos données. Si tel n'était pas le cas ou si vous avez - changé d'avis, merci de vous reporter à l'article ci-dessous relatif à - vos droits. <br><br> - <strong>Limitation des données collectées</strong>: nous ne collectons que les - données qui sont strictement nécessaires au traitement et à - l'utilisation envisagée. Nous vous rappelons qu'il n'y a aucune - obligation à nous transmettre ces données. Toutefois certains services - ou opérations promotionnelles nécessitent certaines données, faute de - quoi vous ne pourriez y accéder.<br><br> - <strong>Limitation des finalités</strong>: les données que nous collectons sont - traitées uniquement dans les finalités décrites ci-dessous.<br><br> - <strong>Limitation des durées de conservation</strong>: vos données sont - conservées uniquement le temps nécessaire aux finalités de traitement - pour lequel elles ont été collectées. Au-delà de cette durée si aucune - obligation légale impose leur conservation, nous veillerons à ce que - vos données soient supprimées, détruites ou anonymisées.<br><br> - <strong>Protection des données</strong>: en vue de sécuriser vos données et leur - traitement, nous avons mis en place des mesures techniques et - organisationnelles détaillées ci-dessous.<br><br> - <strong>Transparence et loyauté</strong>: lorsque Lionor collecte une donnée - vous concernant, nous vous informons de l'utilisation qui en sera - faite. C'est pourquoi nous vous conseillons de lire attentivement les - informations qui vous sont transmises à travers notre site internet. - </p> - - <h2 class="h2 color-second">Quelles données personnelles sont collectées ?</h2> - <p> - Au sens du Règlement RGPD, une donnée à caractère personnel désigne - toute information relative à une personne physique identifiée ou - identifiable.<br><br> - Les données personnelles collectées varient en fonction du but de la - collecte et du service dont vous souhaitez bénéficier.<br><br> - La société Lionor est amenée à collecter les catégories de données - personnelles suivantes:<br><br> - - coordonnées personnelles (civilité, nom, prénom, adresse e-mail, - adresse postale) ; <br> - - coordonnées personnelles non obligatoires (date de naissance, numéro - de téléphone); <br> - - identifiants utilisés pour accéder à votre compte en ligne (adresse - IP, adresse e-mail et mot de passe);<br> - - données relatives aux tickets de caisse de l'utilisateur ainsi que - son RIB ou son compte Paypal;<br> - - historiques de navigation, telles que les pages visitées et actions - sur le site.<br><br> - Vous vous engagez à fournir des données personnelles actualisées et - valides et garantissez ne faire aucune fausse déclaration et ne donner - aucune information erronée. - </p> - - <h2 class="h2 color-second">Pourquoi vos données personnelles sont collectées ?</h2> - <p> - Vos données peuvent être collectées dans la mesure où vous avez - consenti de manière spécifique, libre et éclairée. Elles peuvent - également être collectées pour satisfaire à l'exécution d'une - obligation légale ou dans le cadre de la relation contractuelle - construite avec vous (notamment conditions générales d'utilisation, - conditions générales de vente) ou encore dans l'intérêt légitime de - Lionor (par exemple pour assurer la sécurité des transactions).<br><br> - Nous collectons vos données personnelles afin de vous fournir la - meilleure expérience utilisateur à travers notre site internet.<br><br> - <strong>Ces données sont collectées aux fins suivantes </strong><br> - - Gestion des fonctionnalités et de la qualité du site internet<br> - - Gestion de votre inscription à notre Newsletter et de votre Compte - utilisateur<br> - - Accès à votre Compte utilisateur<br> - - Gestion du recrutement<br> - - Traitement de vos demandes de renseignements<br> - - Communication des informations (promotions, nouveaux produits, - activité de la marque)<br> - - Gestion de votre participation à nos jeux, tirages au sort, - activités promotionnelles<br> - - Développement et amélioration des produits Lionor<br> - - Statistiques<br> - - Proposition de produits personnalisés et de communications adaptées - ou pour recommandation de produits en fonction des besoins de - consommateurs<br> - - Partages sur les réseaux sociaux - </p> - - <h2 class="h2 color-second">Quels sont vos droits ?</h2> - <p> - Vous disposez d'un certain nombre de droits concernant vos données - personnelles listés ci-dessous. <br><br> - <strong>Droit d'accès</strong> - Vous pouvez demander la communication de vos données sous une forme - accessible, la confirmation que vos données font ou ne font plus - l'objet d'un traitement ainsi que la communication des informations - relatives à vos données. Afin que vos données personnelles soient - exactes, complètes, pertinentes et à jour, vous avez le droit - d'accéder, de corriger ou de mettre à jour vos données personnelles à - tout moment.<br><br> - - <strong>Droit de rectification</strong><br> - Vous êtes en droit de demander à ce que vos données soient rectifiées, - complétées ou mises à jour lorsqu'elles sont inexactes, incomplètes, - équivoques ou périmées.<br><br> - - <strong>Droit à l'effacement </strong><br> - Vous avez le droit de demander la suppression de vos données - personnelles notamment lorsqu'elles ne sont plus nécessaires aux - finalités pour lesquelles elles ont été collectées. Si les données - personnelles collectées ne sont plus nécessaires à aucune finalité et - qu'aucune obligation légale nous impose de les conserver, nous - mettrons tout en œuvre pour supprimer, détruire ou anonymiser ces - données.<br><br> - - <strong>Droit à la limitation du traitement</strong><br> - Vous avez le droit de demander la limitation du traitement de vos - données personnelles si : <br><br> - - vous contestez l'exactitude des données;<br> - - vous souhaitez limiter le traitement des données qui n'avaient pas - été traitées de manière licite plutôt que leur suppression; <br> - - nous n'avons plus besoin de vos données personnelles mais celles-ci - sont nécessaires pour la constatation, l'exercice ou la défense de vos - droits en justice; <br> - - vous vous êtes opposés au traitement de vos données personnelles et - attendez de savoir si vos intérêts liés à cette objection l'emportent - sur les motifs légitimes que nous poursuivons. <br><br> - - <strong>Droit à la portabilité de vos données </strong><br> - Lorsque le traitement est effectué à partir de procédés automatisés et - que vous avez librement consenti au traitement de vos données - personnelles pour une finalité que nous vous avions communiqué au - préalable; ou lorsque nous traitons vos données dans le cadre d'une - opération commerciale (ex: vous fournir un produit) vous avez le droit - de demander:<br> - - à recevoir vos données personnelles dans un format structuré, - couramment utilisé et lisible par une machine;<br> - - à ce que vos données personnelles soient transmises directement à - une autre responsable de traitement, lorsque que cela est - techniquement possible.<br><br> - - <strong>Droit d'opposition</strong><br> - Lorsque vos données sont traitées à des fins de prospection - commerciale, vous avez le droit, à tout moment, de vous opposer au - traitement de vos données personnelles et ce sans motif. - </p> - - <h2 class="h2 color-second">Droit de porter réclamation auprès de la CNIL</h2> - <p> - Si vous estimez que le traitement de vos données personnelles - constitue une violation de la réglementation, vous pouvez introduire - une réclamation auprès d'une autorité de contrôle, telle que la - CNIL.<br><br> - <strong>Vous pouvez exercer ces droits à tout moment en nous contactant via - le formulaire suivant :<br></strong> - <a href="https://www.ldc.fr/rgpd/professionnels/">https://www.ldc.fr/rgpd/professionnels/</a><br> - <a href="https://www.ldc.fr/rgpd/consommateurs/">https://www.ldc.fr/rgpd/consommateurs/</a><br> - <a href="https://www.ldc.fr/rgpd/salaries/">https://www.ldc.fr/rgpd/salaries/</a><br><br> - - <strong>Vous recevrez une réponse de notre part dans un délai d'un mois à - compter de la réception de la demande. En cas de demande complexe ou - du nombre important de demandes, le délai peut être prolongé de deux - mois. </strong><br><br> - <strong>L'exercice des droits se fait à titre gratuit. Si toutefois la - demande était manifestement infondée ou excessive, Lionor se - réserve la possibilité d'appliquer des frais administratifs ou de - refuser de donner suite à la demande. - </strong> - </p> - - <h2 class="h2 color-second">Comment vos données personnelles sont protégées ?</h2> - <p> - Afin d'assurer la sécurité de vos données personnelles nous avons mis - en place des mesures de sécurité, notamment des contrôles d'accès, des - pare-feux, des serveurs sécurisés.<br><br> - Ces mesures visent à protéger vos données personnelles contre toute - perte, détournement, mauvaise utilisation, divulgation, modification, - interférence, dommage, accès non autorisé des données.<br><br> - En cas de violation de vos données personnelles susceptible - d'engendrer un risque pour vos droits et libertés, Lionor en - notifie la violation à la CNIL dans les meilleurs délais et, si - possible, 72 heures au plus tard après en avoir pris connaissance. - Lionor vous en informera dans les meilleurs délais. - </p> - - <h2 class="h2 color-second">Accès à vos données personnelles :</h2> - <p> - Vos données personnelles sont destinées au personnel de Lionor - habilité à les traiter, notamment le service marketing, développement - durable, informatique, commercial, qualité et administratif. - </p> - - <h2 class="h2 color-second">Partage de vos données personnelles :</h2> - <p> - Conformément à la règlementation, quand nous sommes amenés à partager - vos données personnelles avec des sous-traitants pour certaines - finalités décrites dans la présente Charte, nous nous assurons que - leur dispositif en matière de sécurité des données et de leur stockage - est au moins aussi important que celui de notre organisation. Nous - veillons également à ce qu'ils respectent les lois relatives à la - protection des données personnelles dans des conditions au moins - équivalentes à celles que nous respectons.<br><br> - Par ailleurs, les sous-traitants étant amenés à traiter de vos données - personnelles pour notre compte et sur nos instructions, nous nous - engageons à ce que vos données personnelles ne soient pas partagées ou - divulguées pour des finalités autres que celles décrites dans la - présente Charte. Nous pouvons cependant être amenés à transmettre vos - données, pour des finalités autres que celles prévues dans la Charte, - dans les cas où leur communication est requise par la loi et les - autorités gouvernementales. - </p> - - <h2 class="h2 color-second"> - Transfert de vos données en dehors de l'espace économique Européen : - </h2> - <p> - Nous nous informons que vos données personnelles ne sont pas traitées - en dehors de l'Espace Economique Européen (EEE). En cas de changement, - nous vous en avertirons et mettrons tout en œuvre pour que ce - transfert international de données dispose d'un niveau et de garanties - de sécurité adéquats. - </p> - - <h2 class="h2 color-second">Utilisation des cookies</h2> - <p> - Les cookies sont des petits fichiers textes contenant des informations - propres vous concernant stockés sur le disque dur de l'équipement - informatique avec lequel vous vous êtes connectés sur le site internet - et pouvant être lus seulement par le serveur qui l'a fourni. Les - cookies sont gérés par votre navigateur internet.<br><br> - Les cookies indiquent la fréquentation des pages que vous visitez, ce - qui nous aide à connaître les informations qui vous intéressent. Cela - permet de vous offrir plus de contenu qui vous intéresse et moins de - contenu qui ne vous intéresse pas. <br><br> - Les cookies vous permettent de stocker des préférences et les noms des - utilisateurs, enregistrer des produits et des services, personnaliser - des pages ou faire de la publicité ciblée.<br><br> - A travers ces cookies, vos données personnelles peuvent être - recueilles telles que :<br><br> - - des informations concernant le navigateur de votre appareil et le - système d'exploitation que vous utilisez;<br> - - l'adresse IP de l'appareil que vous utilisez;<br> - - les pages Web que vous consultez;<br> - - les liens sur lesquelles vous cliquez pendant que vous êtes en - interaction avec nos services.<br><br> - - Le site internet <a href="{{ route('home') }}">lionor.fr</a> utilise trois types - de cookies qui ont des finalités différentes. Tous les cookies de type - non techniques doivent recueillir votre consentement avant d'être - installés. Vous pouvez donner votre consentement sur la page d'accueil - du site internet, en cliquant sur « accepter ». <br><br> - - Les cookies strictement nécessaires et fonctionnels Ces cookies sont - nécessaires au bon fonctionnement du site internet. Ils vous - permettent d'utiliser les principales fonctionnalités. Sans ces - cookies, vous ne pourrez pas utiliser normalement le site internet. - <br> - - Les cookies analytiques Ces cookies nous permettent de connaître - l'utilisation et les performances du site internet et d'en améliorer - son fonctionnement. <br><br> - - Les cookies de ciblage<br><br> - - Ces cookies sont utilisés pour vous présenter des publicités ou vous - adresser des informations adaptées à vos centres d'intérêts en dehors - du site <a href="{{ route('home') }}">lionor.fr</a> lors de votre navigation sur Internet. - Le refus de ces cookies publicitaires n'a pas d'impact sur - l'utilisation du site internet. Cependant, le fait de refuser les - cookies publicitaires n'entraînera pas l'arrêt de la publicité sur - Internet. Cela aura seulement pour effet d'afficher une publicité qui - ne tiendra pas compte de vos centres d'intérêt ou de vos - préférences.<br><br> - <strong>Vous avez le choix :</strong><br><br> - <strong>- d'accepter</strong> ces cookies en cliquant sur le bouton «Accepter» - présent sur le bandeau Cookies, apparaissant au bas de votre page - internet. Tant que vous n'avez pas accepté, les cookies ne pourront - être stockés sur votre appareil; ou<br><br> - <strong>de refuser</strong> ces cookies via le bouton «Paramétrer» présent sur - le bandeau Cookies ou les paramètres de votre navigateur internet.<br><br> - - Lorsque vous cliquez sur le bouton «Paramétrer» du bandeau Cookies, - une liste s'affiche présentant les différents types de cookies par - finalité. Si vous consentez au dépôt des cookies, il vous suffit de - les activer puis de cliquer sur le bouton «Enregistrer» en bas de la - fenêtre. Si vous refusez le dépôt des cookies, il vous suffit de - cliquer sur le bouton «Enregistrer», le dépôt des cookies étant par - défaut désactivé.<br><br> - - Pour en savoir plus sur la désactivation des cookies via votre - navigateur internet :<br><br> - Internet Explorer: - <a href="http://windows.microsoft.com/fr-FR/windows-vista/Block-or-allow-cookies">http://windows.microsoft.com/fr-FR/windows-vista/Block-or-allow-cookies</a> - <br> - Chrome: - <a href="http://support.google.com/chrome/bin/answer.py?hl=fr&hlrm=en&answer=95647">http://support.google.com/chrome/bin/answer.py?hl=fr&hlrm=en&answer=95647</a> - <br> - Firefox: - <a href="https://support.mozilla.org/fr/kb/protection-renforcee-contre-pistage-firefox-ordinateur">https://support.mozilla.org/fr/kb/protection-renforcee-contre-pistage-firefox-ordinateur</a> - <br> - Safari: - <a href="https://support.apple.com/fr-fr/guide/safari/sfri11471/mac">https://support.apple.com/fr-fr/guide/safari/sfri11471/mac</a><br><br> - - La durée de conservation de ces informations dans votre appareil est - d'une durée maximale de 13 mois. A l'expiration de ce délai, nous - recueillerons de nouveau votre consentement. <br> - Pour plus d'informations sur le paramétrage de vos cookies, vous - pouvez consulter :<br> - <a href="http://www.youronlinechoices.com/fr/">http://www.youronlinechoices.com/fr/</a><br> - <a href="https://www.allaboutcookies.org/">https://www.allaboutcookies.org/</a> - </p> - - <h2 class="h2 color-second">Sites internet de tiers</h2> - <p> - Le site internet Lionor peut être associé à des sites internet - tiers. Les sites hébergés par des tiers sont hors de notre contrôle. - Lorsque vous renseignez des données personnelles sur un site internet - tiers, le traitement de ces données n'est pas effectué sur notre site - internet, mais sur le site internet tiers concerné. Toute donnée - personnelle que vous fournissez sera collectée et traitée conformément - à la politique relative à la confidentialité des données du tiers - concerné.<br><br> - Par conséquent, nous n'assumons aucune responsabilité concernant les - pratiques exercées par lesdits tiers en matière de protection des - données. - </p> - - <h2 class="h2 color-second">Droit applicable</h2> - <p> - La présente Charte de confidentialité est régie et sera interprétée - conformément au droit français. - </p> - - <h2 class="h2 color-second">Nous contacter</h2> - <p> - Si vous avez des questions, remarques ou réclamations relatives à la - présente Charte de confidentialité, ou le traitement de vos données - personnelles, veuillez-nous contacter à l'adresse :<br><br> - <a href="https://www.ldc.fr/rgpd/professionnels/">https://www.ldc.fr/rgpd/professionnels/</a><br> - <a href="https://www.ldc.fr/rgpd/consommateurs/">https://www.ldc.fr/rgpd/consommateurs/</a><br> - <a href="https://www.ldc.fr/rgpd/salaries/">https://www.ldc.fr/rgpd/salaries/</a> - </p> + {!! clean($staticPageModel->content) !!} </div> </div> </div> diff --git a/routes/breadcrumbs-bo.php b/routes/breadcrumbs-bo.php index 6e75f6b..6cca28f 100644 --- a/routes/breadcrumbs-bo.php +++ b/routes/breadcrumbs-bo.php @@ -8,6 +8,7 @@ use App\Models\Shop; use Diglactic\Breadcrumbs\Breadcrumbs; use Diglactic\Breadcrumbs\Generator; use Illuminate\Support\Str; +use App\Models\StaticPage; // * Root Breadcrumbs::for('bo.dashboard', function (Generator $trail) { @@ -89,3 +90,15 @@ Breadcrumbs::for('bo.shops.edit', function (Generator $trail, Shop $shop) { $trail->parent('bo.shops.index'); $trail->push(trans('Édition'), route('bo.shops.edit', $shop)); }); + +// * STATIC PAGES +Breadcrumbs::for('bo.static_pages.index', function (Generator $trail) { + $trail->push( + Str::of(trans_choice('models.classes.static_page', '*'))->ucfirst(), + route('bo.static_pages.index', ['sort_col' => 'updated_at', 'sort_way' => 'desc']) + ); +}); +Breadcrumbs::for('bo.static_pages.edit', function (Generator $trail, StaticPage $static_page) { + $trail->parent('bo.static_pages.index'); + $trail->push(Str::ucfirst(trans('crud.actions.edit')), route('bo.static_pages.edit', $static_page)); +}); diff --git a/routes/web-bo.php b/routes/web-bo.php index 8633467..a0da18c 100644 --- a/routes/web-bo.php +++ b/routes/web-bo.php @@ -6,6 +6,7 @@ use App\Http\Controllers\Bo\ProductController; use App\Http\Controllers\Bo\RangeController; use App\Http\Controllers\Bo\RecipeController; use App\Http\Controllers\Bo\ShopController; +use App\Http\Controllers\Bo\StaticPageController; use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Route; @@ -47,5 +48,16 @@ Route::prefix('bo')->name('bo.')->middleware(['admin-secure', 'throttle:credenti ->middleware('htmlsanitize:description,preparation,ingredients'); Route::post('/recipes/{recipe}/change-published', [RecipeController::class, 'changePublished']) ->name('recipes.change-published'); + + // * STATIC PAGES + Route::resource('pages', StaticPageController::class) + ->names([ + 'index' => 'static_pages.index', + 'edit' => 'static_pages.edit', + 'update' => 'static_pages.update', + ])->parameters(['pages' => 'static_page']) + ->only(['index', 'edit', 'update']) + ->withoutMiddleware('htmlsanitize') + ->middleware('htmlsanitize:content'); }); }); diff --git a/routes/web-fo.php b/routes/web-fo.php index edc6fa3..5c98fb2 100644 --- a/routes/web-fo.php +++ b/routes/web-fo.php @@ -1,5 +1,6 @@ <?php +use App\Http\Controllers\Fo\StaticPageController; use App\Http\Controllers\Fo\ShopController; use App\Http\Controllers\Fo\ContactController; use App\Http\Controllers\Fo\HomeController; @@ -45,8 +46,8 @@ Route::namespace('\App\Http\Controllers\Fo')->middleware(['throttle:credentials' }); Route::view('/ou-nous-trouver', 'fo.pages.map')->name('map'); - Route::view('/politique-de-donnees-personnelles', 'fo.pages.policies')->name('policies'); - Route::view('/mentions-legales', 'fo.pages.legals')->name('legals'); + Route::get('/politique-de-donnees-personnelles', [StaticPageController::class, 'policies'])->name('policies'); + Route::get('/mentions-legales', [StaticPageController::class, 'legals'])->name('legals'); // * ROUTES TO GET SHOPS FOR MARKET FINDER Route::get('/api/shops', [ShopController::class, 'index'])->name('shops.index');