Merge branch 'trunk'

This commit is contained in:
Vincent BRIDIER 2022-09-19 09:14:22 +02:00
commit d6b3cb767e
No known key found for this signature in database
GPG key ID: 8571BFA20420D512
21 changed files with 488 additions and 113 deletions

View file

@ -14,19 +14,30 @@ use Kwaadpepper\Enum\BaseEnumRoutable;
*/
final class ContactFormType extends BaseEnumRoutable
{
/**
* Enum values
*
* @return array
*/
protected static function values(): array
{
return [
'none' => 0,
'abuse' => 1,
// * special case passerelle
'complain' => 3,
// special case passerelle
'recipe' => 5,
'games' => 9,
// * special case page nl
'onepage' => 10,
// special case page nl
];
}
/**
* Enum labels
*
* @return array
*/
protected static function labels(): array
{
return [
@ -39,6 +50,10 @@ final class ContactFormType extends BaseEnumRoutable
];
}
/**
* Output the value as a string
* @return string
*/
public function __toString(): string
{
return (string)$this->label;

View file

@ -10,17 +10,33 @@ use Illuminate\Support\Facades\File;
class SubRangeController extends Controller
{
/**
* Viewany subrange
*
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function index()
{
$subranges = SubRange::paginate();
return view('bo.subranges.index', compact('subranges'));
}
/**
* Create subrange
*
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function create()
{
return view('bo.subranges.create');
}
/**
* Store subrange
*
* @param \App\Http\Requests\StoreSubRange $request
* @return \Illuminate\Http\RedirectResponse
*/
public function store(StoreSubRange $request)
{
$subrange = new SubRange($request->validated());
@ -29,11 +45,24 @@ class SubRangeController extends Controller
return redirect()->route('bo.subranges.index');
}
/**
* Edit subrange
*
* @param \App\Models\SubRange $subrange
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function edit(SubRange $subrange)
{
return view('bo.subranges.edit', ['subrange' => $subrange]);
}
/**
* Update subrange
*
* @param \App\Http\Requests\UpdateSubRange $request
* @param \App\Models\SubRange $subrange
* @return \Illuminate\Http\RedirectResponse
*/
public function update(UpdateSubRange $request, SubRange $subrange)
{
$subrange->fill($request->validated());
@ -43,6 +72,12 @@ class SubRangeController extends Controller
->with('success', 'Enregistré !');
}
/**
* Destroy subrange
*
* @param \App\Models\SubRange $subrange
* @return \Illuminate\Http\RedirectResponse
*/
public function destroy(SubRange $subrange)
{
if (File::exists($subrange->picture)) {
@ -57,6 +92,12 @@ class SubRangeController extends Controller
->with('warning', 'Le contenu a bien été supprimé');
}
/**
* Remove subrange picture
*
* @param \App\Models\SubRange $subrange
* @return \Illuminate\Http\RedirectResponse
*/
public function removeImage(SubRange $subrange)
{
if (File::exists($subrange->picture)) {

View file

@ -15,6 +15,13 @@ use Illuminate\Support\Facades\Log;
class ContactController extends Controller
{
/**
* Show contact Form
*
* @param \Illuminate\Http\Request $request
* @param \App\Enums\ContactFormType|null $type
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function contact(Request $request, ContactFormType $type = null)
{
$user = null;
@ -24,6 +31,12 @@ class ContactController extends Controller
return view('front.contact.contact', compact('type', 'user', 'status', 'username'));
}
/**
* Submit contact Form
*
* @param \App\Http\Requests\ContactFormRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function contactSubmit(ContactFormRequest $request)
{
try {
@ -41,11 +54,23 @@ class ContactController extends Controller
return back()->withInput()->with('status', false);
}
/**
* Show complain form
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function complain(Request $request)
{
return $this->contact($request, ContactFormType::complain());
}
/**
* Submit complain form
*
* @param \App\Http\Requests\ContactFormRequest $request
* @return \Illuminate\Http\RedirectResponse
*/
public function complainSubmit(ContactFormRequest $request)
{
try {
@ -59,11 +84,22 @@ class ContactController extends Controller
return back()->withInput()->with('status', false);
}
/**
* Report customer from Club magnet exchange
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function reportCustomer(Request $request)
{
return $this->contact($request, ContactFormType::abuse());
}
/**
* Propose meal recipe
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function proposeRecipe(Request $request)
{
return $this->contact($request, ContactFormType::recipe());

View file

@ -8,6 +8,8 @@ use App\Models\Products;
use App\Models\Recipes;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException as IlluminateValidationException;
use LDC\LDCCRM\Enums\ApiError;
use LDC\LDCCRM\Exceptions\ApiErrorException;
use LDC\LDCCRM\Exceptions\CrmException;
@ -16,30 +18,45 @@ use LDC\LDCCRM\Models\Customer;
class CustomerController extends Controller
{
/**
* Unsubscribe from newsletter
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function unscribeNewsletter(Request $request)
{
// TODO: handle single optin avec hashcode.
$message = null;
// TODO: handle single optin avec hashcode
// try {
// if ($request->hashcode) {
// SingleOptin::setStatus($request->email, true);
// $message = trans('Votre désinscription à la newsletter a été prise en compte');
// }
// } catch (ApiErrorException $e) {
// if (!$e->getApiError()->equals(ApiError::singleOptinCustomerExists())) {
// Utils::sendEmailErrorManually($e);
// $message = trans('Une erreur est survenue, merci de réessayer ultérieurement');
// }
// } catch (CrmException $e) {
// Utils::sendEmailErrorManually($e);
// $message = trans('Une erreur est survenue, merci de réessayer ultérieurement');
// }
/*
Unsubscribe single optin code.
try {
if ($request->hashcode) {
SingleOptin::setStatus($request->email, true);
$message = trans('Votre désinscription à la newsletter a été prise en compte');
}
} catch (ApiErrorException $e) {
if (!$e->getApiError()->equals(ApiError::singleOptinCustomerExists())) {
Utils::sendEmailErrorManually($e);
$message = trans('Une erreur est survenue, merci de réessayer ultérieurement');
}
} catch (CrmException $e) {
Utils::sendEmailErrorManually($e);
$message = trans('Une erreur est survenue, merci de réessayer ultérieurement');
}
*/
try {
if ($request->hashcode and ($customer = Customer::find($request->hashcode))) {
// ? Is hashcode valid ?
Validator::validate([
'hashcode' => $request->hashcode
], [
'hashcode' => 'required|uuid'
]);
if ($customer = Customer::find($request->hashcode)) {
$customer->opt_in = false;
// TODO remove this temps fix because LG crm data is not consistant
// les données sont parsés en retour de la crm et sont inconsitantes
// ! Les données peuvent être parsés en retour de la crm et inconsitantes (Héritage vielle crm).
try {
$customer->save();
} catch (ValidationException $e) {
@ -47,6 +64,9 @@ class CustomerController extends Controller
}
$message = trans('Votre désinscription à la newsletter a été prise en compte');
}
} catch (IlluminateValidationException $e) {
// Les données peuvent être parsés en retour de la crm et sont inconsitantes.
$message = null;
} catch (ApiErrorException $e) {
if (!$e->getApiError()->equals(ApiError::singleOptinCustomerExists())) {
Utils::sendEmailErrorManually($e);

View file

@ -78,6 +78,20 @@ class OCBController extends Controller
return view('front.ocb.poultry', compact('breeder', 'ocbContents'));
}
/**
* Show ocb rabbit content
*
* @return \Illuminate\Contracts\View\View|\Illuminate\Contracts\View\Factory
*/
public function rabbit()
{
$ocbContents = OCBContent::where('type', OCBType::rabbit())
->where('status', true)
->orderBy('order')
->get();
return view('front.ocb.rabbit', compact('ocbContents'));
}
/**
* Show ocb egg content
*

View file

@ -38,12 +38,14 @@ class ContactFormRequest extends FormRequest
'required',
new EnumIsValidRule(ContactFormType::class)
],
'lastname' => 'required|min:2',
'firstname' => 'required|min:2',
// * max arcadia 50 chars
'lastname' => 'required|min:2|max:50',
// * max arcadia 50 chars
'firstname' => 'required|min:2|max:50',
'address' => 'required|min:4',
'email' => 'required|email:rfc,dns,spoof',
'postal' => 'required|min:3|max:10',
// max arcadia 10 chars
// * max arcadia 10 chars
'town' => 'required|min:3|max:90',
'phone' => 'required|min:8|max:14',
'onepagesubject' => 'sometimes|min:10|max:250',

View file

@ -23,6 +23,7 @@ class SendNLMail implements ShouldQueue
/**
* Create a new job instance.
*
* @param \App\Models\MailContactData $data
* @return void
*/
public function __construct(MailContactData $data)

View file

@ -24,6 +24,7 @@ class SendPasserelleMail implements ShouldQueue
/**
* Create a new job instance.
*
* @param \App\Models\MailContactData $data
* @return void
*/
public function __construct(MailContactData $data)

View file

@ -21,6 +21,7 @@ class ContactComplainMail extends ContactMail
/**
* Create a new message instance.
*
* @param \App\Models\MailContactData $data
* @return void
*/
public function __construct(MailContactData $data)

View file

@ -7,10 +7,25 @@ use Illuminate\Database\Eloquent\Model;
class Contact extends Model
{
/**
* The primary key for the model.
*
* @var string
*/
protected $primaryKey = 'date';
/**
* Indicates if the model should be timestamped.
*
* @var boolean
*/
public $timestamps = false;
/**
* Perform any actions required after the model boots.
*
* @return void
*/
protected static function booted()
{
static::creating(function ($contact) {
@ -18,8 +33,8 @@ class Contact extends Model
return $contact;
});
static::updating(function ($contact) {
// * increment general counter
$contact->all++;
// increment general counter
return $contact;
});
}
@ -33,34 +48,67 @@ class Contact extends Model
public static function incrementStat(ContactFormType $type)
{
$contact = static::where('date', '=', date('Y-m-d'))->firstOrNew();
// Can't do $contact->counter[$type->value]++ => ErrorException
// * Can't do $contact->counter[$type->value]++ => ErrorException
$d = $contact->values;
$d[$type->value]++;
$contact->values = $d;
$contact->save();
}
/**
* Get values attribute
*
* @param mixed $value
* @return array
*/
public function getValuesAttribute($value): array
{
return $this->unserialize($value ?? serialize($this->counterSkeleton()));
}
/**
* Set values attribute
*
* @param array $value
* @return string
*/
public function setValuesAttribute(array $value): string
{
$this->attributes['values'] = $this->serialize($value);
return $this->attributes['values'];
}
/**
* Serialize value
*
* @param array $value
* @return string
*/
private function serialize(array $value)
{
return serialize($this->merge($this->counterSkeleton(), $value));
}
/**
* Unserialize value
*
* @param string $value
* @return array
*/
private function unserialize(string $value)
{
return $this->merge($this->counterSkeleton(), unserialize($value));
}
/**
* Merge thow array
*
* TODO: Replace this with collection or array merge.
*
* @param array $a
* @param array $b
* @return array
*/
private function merge(array $a, array $b): array
{
foreach ($a as $i => $v) {
@ -71,9 +119,13 @@ class Contact extends Model
return $a;
}
/**
* Get Counter skeleton
* @return array
*/
private function counterSkeleton(): array
{
return collect(ContactFormType::toArray())->mapWithKeys(function ($enum) {
return collect(ContactFormType::toArray())->mapWithKeys(function (ContactFormType $enum) {
if ($enum->equals(ContactFormType::none())) {
return [];
}

View file

@ -5,6 +5,7 @@ namespace App\Models;
use App\Enums\ContactFormCivility;
use App\Enums\ContactFormType;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Str;
use Kwaadpepper\Enum\Traits\CastsEnums;
/**
@ -14,6 +15,11 @@ class MailContactData extends Model
{
use CastsEnums;
/**
* The attributes that should be cast to Enums.
*
* @var array
*/
protected $enumCasts = [
'type' => ContactFormType::class,
'civility' => ContactFormCivility::class
@ -56,6 +62,11 @@ class MailContactData extends Model
'consumptionDateYear'
];
/**
* The model's attributes.
*
* @var array
*/
protected $attributes = [
'productName' => '',
'productCode' => '',
@ -95,40 +106,39 @@ class MailContactData extends Model
/**
* Export the model data to a Formatted Passerelle Data array
*
* @return array
*/
/**
* Removed
* * Removed
* 'EMETTEUR_OBJETDEMANDE' => "objet de la reclamation string",
* 'EMETTEUR_OPT_IN' => '',
* 'REPONSE_ETAT' => 0,
* 'TYPE_REPONSE' => 'mail',
*
* @return array
*/
public function exportToPasserelleDataArray(): array
{
// CF PAsserrelle fields .csv
// * CF PAsserrelle fields .csv
return [
// Marque le Gaulois (Obligatoire)
// * Marque le Gaulois (Obligatoire)
'EMETTEUR_MARQUE' => 1,
// Obligatoire
// * Obligatoire
'EMETTEUR_DATE' => date("Y-m-d"),
// Obligatoire
// * Obligatoire
'EMETTEUR_HEURE' => date("h:i:s"),
'EMETTEUR_CIVILITE' => $this->civility->value,
// Obligatoire
'EMETTEUR_NOM' => $this->lastname,
// Obligatoire
// * Obligatoire Limité a 50
'EMETTEUR_NOM' => Str::limit($this->lastname, 50, ''),
// * Obligatoire
'EMETTEUR_PRENOM' => $this->firstname,
'EMETTEUR_ADRESSE1' => $this->address,
'EMETTEUR_ADRESSE2' => '',
'EMETTEUR_CP' => $this->postal,
// Obligatoire
// * Obligatoire
'EMETTEUR_VILLE' => $this->town,
'EMETTEUR_EMAIL' => $this->email,
'EMETTEUR_TELEPHONE' => $this->phone,
'EMETTEUR_PAYS' => 'France',
'EMETTEUR_NOM_PRODUIT' => $this->productName,
// Obligatoire
// * Obligatoire
'EMETTEUR_EAN13' => $this->productCode,
'EMETTEUR_DATE_LIMITE_CONSO' => sprintf(
'%s/%s/%s',
@ -149,15 +159,15 @@ class MailContactData extends Model
),
'LIEU_ACHAT' => $this->buyPlace,
// FUCK passerelle et leur DTD qui n'existe pas cf: resources/documents
// * FUCK passerelle et leur DTD qui n'existe pas cf: resources/documents
// * Recla conso ?
'EMETTEUR_OBJETDEMANDE' => 3,
// Recla conso ?
// * doit être vide ?
'EMETTEUR_OPT_IN' => '',
// doit être vide ?
// * c'est quoi ça ?
'REPONSE_ETAT' => 0,
// c'est quoi ça ?
// * ok
'TYPE_REPONSE' => 'mail'
// ok
];
}
}

2
composer.lock generated
View file

@ -9106,6 +9106,8 @@
"require": {
"php": "^7.2 || ^8.0"
},
=======
>>>>>>> develop
"require-dev": {
"php-parallel-lint/php-parallel-lint": "^1.2",
"phpstan/extension-installer": "^1.0",

View file

@ -0,0 +1,55 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AllowSubrangeDeletion extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('range_sub_range', function (Blueprint $table) {
$table->dropForeign('range_sub_range_range_id_foreign');
$table->foreign('range_id')
->references('id')->on('ranges')
->cascadeOnDelete();
$table->dropForeign('range_sub_range_sub_range_id_foreign');
$table->foreign('sub_range_id')
->references('id')->on('sub_ranges')
->cascadeOnDelete();
});
Schema::table('products', function (Blueprint $table) {
$table->dropForeign('products_sub_range_id_foreign');
$table->foreign('sub_range_id')
->references('id')->on('sub_ranges')
->nullOnDelete();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('range_sub_range', function (Blueprint $table) {
$table->dropForeign('range_sub_range_range_id_foreign');
$table->foreign('range_id')
->references('id')->on('ranges');
$table->dropForeign('range_sub_range_sub_range_id_foreign');
$table->foreign('sub_range_id')
->references('id')->on('sub_ranges');
});
Schema::table('products', function (Blueprint $table) {
$table->dropForeign('products_sub_range_id_foreign');
$table->foreign('sub_range_id')
->references('id')->on('sub_ranges');
});
}
}

161
package-lock.json generated
View file

@ -4,6 +4,7 @@
"requires": true,
"packages": {
"": {
"name": "legaulois",
"dependencies": {
"@fancyapps/fancybox": "^3.5.7",
"animate.css": "^3.7.2",
@ -1776,6 +1777,64 @@
"jquery": ">=1.9.0"
}
},
"node_modules/@jridgewell/gen-mapping": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
"dev": true,
"dependencies": {
"@jridgewell/set-array": "^1.0.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.9"
},
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/resolve-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
"dev": true,
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/set-array": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
"integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
"dev": true,
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@jridgewell/source-map": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
"integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
"dev": true,
"dependencies": {
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
"node_modules/@jridgewell/sourcemap-codec": {
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
"dev": true
},
"node_modules/@jridgewell/trace-mapping": {
"version": "0.3.15",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
"integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
"dev": true,
"dependencies": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"node_modules/@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@ -5544,9 +5603,9 @@
}
},
"node_modules/html-minifier-terser/node_modules/terser": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
"integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
"integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
"dev": true,
"dependencies": {
"commander": "^2.20.0",
@ -9521,13 +9580,14 @@
}
},
"node_modules/terser": {
"version": "5.10.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
"integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
"version": "5.14.2",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
"integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==",
"dev": true,
"dependencies": {
"@jridgewell/source-map": "^0.3.2",
"acorn": "^8.5.0",
"commander": "^2.20.0",
"source-map": "~0.7.2",
"source-map-support": "~0.5.20"
},
"bin": {
@ -9535,14 +9595,6 @@
},
"engines": {
"node": ">=10"
},
"peerDependencies": {
"acorn": "^8.5.0"
},
"peerDependenciesMeta": {
"acorn": {
"optional": true
}
}
},
"node_modules/terser-webpack-plugin": {
@ -9585,15 +9637,6 @@
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
"node_modules/terser/node_modules/source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"dev": true,
"engines": {
"node": ">= 8"
}
},
"node_modules/thunky": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/thunky/-/thunky-1.1.0.tgz",
@ -11904,6 +11947,55 @@
"integrity": "sha512-rcEtu8t+WnmqIDV/Wfm1yvy/nDdwc7YV25j9HLxGC2/WOsUhk9rcWg2nB8g1BrjRt9zaoADdjHTU6ILYTJzBBg==",
"requires": {}
},
"@jridgewell/gen-mapping": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz",
"integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==",
"dev": true,
"requires": {
"@jridgewell/set-array": "^1.0.1",
"@jridgewell/sourcemap-codec": "^1.4.10",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
"@jridgewell/resolve-uri": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz",
"integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==",
"dev": true
},
"@jridgewell/set-array": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz",
"integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==",
"dev": true
},
"@jridgewell/source-map": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz",
"integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==",
"dev": true,
"requires": {
"@jridgewell/gen-mapping": "^0.3.0",
"@jridgewell/trace-mapping": "^0.3.9"
}
},
"@jridgewell/sourcemap-codec": {
"version": "1.4.14",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz",
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
"dev": true
},
"@jridgewell/trace-mapping": {
"version": "0.3.15",
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz",
"integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==",
"dev": true,
"requires": {
"@jridgewell/resolve-uri": "^3.0.3",
"@jridgewell/sourcemap-codec": "^1.4.10"
}
},
"@nodelib/fs.scandir": {
"version": "2.1.5",
"resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz",
@ -14950,9 +15042,9 @@
"dev": true
},
"terser": {
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.0.tgz",
"integrity": "sha512-EAPipTNeWsb/3wLPeup1tVPaXfIaU68xMnVdPafIL1TV05OhASArYyIfFvnvJCNrR2NIOvDVNNTFRa+Re2MWyw==",
"version": "4.8.1",
"resolved": "https://registry.npmjs.org/terser/-/terser-4.8.1.tgz",
"integrity": "sha512-4GnLC0x667eJG0ewJTa6z/yXrbLGv80D9Ru6HIpCQmO+Q4PfEtBFi0ObSckqwL6VyQv/7ENJieXHo2ANmdQwgw==",
"dev": true,
"requires": {
"commander": "^2.20.0",
@ -17939,13 +18031,14 @@
"dev": true
},
"terser": {
"version": "5.10.0",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz",
"integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==",
"version": "5.14.2",
"resolved": "https://registry.npmjs.org/terser/-/terser-5.14.2.tgz",
"integrity": "sha512-oL0rGeM/WFQCUd0y2QrWxYnq7tfSuKBiqTjRPWrRgB46WD/kiwHwF8T23z78H6Q6kGCuuHcPB+KULHRdxvVGQA==",
"dev": true,
"requires": {
"@jridgewell/source-map": "^0.3.2",
"acorn": "^8.5.0",
"commander": "^2.20.0",
"source-map": "~0.7.2",
"source-map-support": "~0.5.20"
},
"dependencies": {
@ -17954,12 +18047,6 @@
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
"integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
"dev": true
},
"source-map": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz",
"integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==",
"dev": true
}
}
},

Binary file not shown.

After

Width:  |  Height:  |  Size: 347 KiB

View file

@ -14,7 +14,7 @@
align-items: center;
z-index: 12;
@media screen and (max-width: $large_screen - 100) {
@media screen and (max-width: ($large_screen - 100)) {
flex-direction: column;
height: auto;
padding: 10px 0;
@ -23,62 +23,61 @@
& > div {
position: relative;
& img {
width: 100%;
padding: 15px 15px;
filter: brightness(0.8);
@media screen and (max-width: ($large_screen - 100)) {
transform: inherit !important;
}
}
&:hover img {
filter: brightness(1);
}
& .left {
transform: skew(-2deg, -1deg);
filter: brightness(0.8);
@media screen and (max-width: $large_screen) {
width: 100%;
padding: 15px 15px;
}
}
& .right {
transform: skew(1deg, 1deg);
filter: brightness(0.8);
@media screen and (max-width: $large_screen) {
width: 100%;
padding: 15px 15px;
}
}
& > p {
z-index: 1;
position: absolute;
bottom: 55px;
left: 15px;
bottom: 4.4rem;
left: 1.5rem;
color: white;
font-family: "Catamaran-Black";
text-transform: uppercase;
font-size: 40px;
line-height: 38px;
text-shadow: 1px 1px 15px black;
@media screen and (max-width: $desktop) {
@media screen and (max-width: ($large_screen - 100)) {
left: 20%;
transform: translateX(-50%);
bottom: 6rem;
left: 9rem;
bottom: 5.5rem;
}
@media screen and (max-width: $tablet) {
font-size: 2rem;
line-height: 2rem;
left: 30%;
left: 20vw;
}
@media screen and (max-width: $mobile) {
font-size: 1.5rem;
line-height: 1.5rem;
left: 25vw;
}
}
& > a {
z-index: 1;
position: absolute;
bottom: 15px;
left: 15px;
bottom: 1.6rem;
left: 1.5rem;
background-color: #003b22;
color: white;
padding: 5px 20px 4px 20px;
@ -94,18 +93,18 @@
color: #003b22;
}
@media screen and (max-width: $desktop) {
left: 20%;
@media screen and (max-width: ($large_screen - 100)) {
transform: translateX(-50%);
bottom: 3rem;
left: 7rem;
bottom: 2.5rem;
}
@media screen and (max-width: $tablet) {
font-size: 1rem;
left: 30%;
left: 20vw;
}
@media screen and (max-width: $mobile) {
font-size: 0.7rem;
left: 30%;
left: 25vw;
}
}
}

View file

@ -20,9 +20,9 @@
'ocbContents' => $ocbContents
])
<section class="poultry-infos space">
<a href="{{ route('ocb.poultry') }}" class="previous">
<a href="{{ route('ocb.rabbit') }}" class="previous">
<span></span>
<p class="button-text">{{ __('Découvrer la volaille Oui C\'est Bon!') }}</p>
<p class="button-text">{{ __('Découvrer le lapin Oui C\'est Bon!') }}</p>
</a>
</section>
</div>

View file

@ -20,12 +20,17 @@
<section class="ocb-bg content content-ocb">
<div class="items">
<div>
<img src="{{ asset('assets/images/ocb/ocb_poule_x2.png') }}" alt="Poulet & Dinde - Le Gaulois" class="left">
<img src="{{ asset('assets/images/ocb/mockocb.png') }}" alt="Poulet & Dinde - Le Gaulois" class="left">
<p>Poulets<br>& Dindes</p>
<a href="{{ route('ocb.poultry') }}">En savoir +</a>
</div>
<div>
<img src="{{ asset('assets/images/ocb/ocb_oeuf_x2.png') }}" alt="Oeuf - Le Gaulois" class="right">
<img src="{{ asset('assets/images/ocb/mockocb.png') }}" alt="Lapin - Le Gaulois" class="left">
<p>Lapins</p>
<a href="{{ route('ocb.rabbit') }}">En savoir +</a>
</div>
<div>
<img src="{{ asset('assets/images/ocb/mockocb.png') }}" alt="Oeuf - Le Gaulois" class="right">
<p>Oeufs</p>
<a href="{{ route('ocb.egg') }}">En savoir +</a>
</div>

View file

@ -21,9 +21,9 @@
'ocbContents' => $ocbContents
])
<section class="poultry-infos">
<a href="{{ route('ocb.egg') }}" class="next">
<a href="{{ route('ocb.rabbit') }}" class="next">
<span></span>
<p class="button-text">{{ __('Découvrez les oeufs Oui C\'est Bon!') }}</p>
<p class="button-text">{{ __('Découvrez le lapin Oui C\'est Bon!') }}</p>
</a>
<div class="breeder-info">
@if ($breeder !== null && $breeder->picture !== null)

View file

@ -0,0 +1,34 @@
@extends('layouts.app')
@section('title', __('Tout savoir sur la gamme Oui c\'est Bon! - Lapin'))
@section('description', __('Le Gaulois, marque de lapins nés, élevées et préparés en France vous raconte son histoire.'))
@section('sub_header')
<div class="sub_header sub_header_ocb">
<div class="content">
<div class="text">
<h1 class="title">{{ __('Le lapin') }} <img class="img-ocb" src="{{ asset('assets/images/ocb/logo-oui.png') }}" alt="{{ __('Oui c\'est Bon ! - Le Gaulois') }}"></h1>
</div>
</div>
<div class="entete-ocb"></div>
</div>
@endsection
@section('content')
<div class="ocb-content">
@include('front.ocb.ocbContent' , [
'ocbContents' => $ocbContents
])
<section class="poultry-infos space">
<a href="{{ route('ocb.poultry') }}" class="previous">
<span></span>
<p class="button-text">{{ __('Découvrer la volaille Oui C\'est Bon!') }}</p>
</a>
<a href="{{ route('ocb.egg') }}" class="next">
<span></span>
<p class="button-text">{{ __('Découvrer les oeufs Oui C\'est Bon!') }}</p>
</a>
</section>
</div>
<!-- TODO : Maps -->
@endsection

View file

@ -156,7 +156,7 @@ Route::prefix('/oui-cest-bon')
Route::get('/eleveurs/{breeder}', [OCBController::class, 'breeder'])->name('breeders');
Route::get('/temoignages-eleveurs', [OCBController::class, 'testimonials'])->name('testimonials');
Route::get('/volaille', [OCBController::class, 'poultry'])->name('poultry');
Route::get('/volaille', [OCBController::class, 'poultry'])->name('poultry');
Route::get('/lapin', [OCBController::class, 'rabbit'])->name('rabbit');
Route::get('/oeuf', [OCBController::class, 'egg'])->name('egg');
Route::view('/', 'front.ocb.index')->name('index');
});