Merge branch '70-bugs' into 'develop'
fix: 🐛 resolve various bugs following re7 feedback
See merge request ldc-web/projets/volena!62
This commit is contained in:
commit
45f0ac7434
23 changed files with 438 additions and 28 deletions
|
|
@ -5,9 +5,9 @@ namespace App\Http\Controllers\Bo;
|
|||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Bo\Aisles\StoreAisleRequest;
|
||||
use App\Http\Requests\Bo\Aisles\UpdateAisleRequest;
|
||||
use App\Models\Logo;
|
||||
use App\Models\Aisle;
|
||||
use App\Models\Network;
|
||||
use App\Traits\Controllers\UpdateModelOrder;
|
||||
use App\Traits\Controllers\UpdateModelPublished;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
|
@ -15,6 +15,7 @@ use Illuminate\Support\Str;
|
|||
|
||||
class AisleController extends Controller
|
||||
{
|
||||
use UpdateModelOrder;
|
||||
use UpdateModelPublished;
|
||||
|
||||
/**
|
||||
|
|
@ -35,6 +36,13 @@ class AisleController extends Controller
|
|||
{
|
||||
/** @var \Illuminate\Database\Eloquent\Builder $aisleModels */
|
||||
$aisleModels = Aisle::query()->with('network');
|
||||
$networkModels = Network::query()->where('published', true)->get();
|
||||
|
||||
$selectedNetwork = intval($request->network);
|
||||
|
||||
$aisleModels = $aisleModels->when($selectedNetwork, function ($query) use ($selectedNetwork) {
|
||||
$query->where('network_id', $selectedNetwork);
|
||||
});
|
||||
|
||||
/** @var string $search Search field */
|
||||
$search = $request->input('search');
|
||||
|
|
@ -56,10 +64,9 @@ class AisleController extends Controller
|
|||
/** Custom pagination */
|
||||
$aisleModels = $this->paginate($aisleModels);
|
||||
|
||||
return view('bo.pages.aisles.index', compact('aisleModels', 'search', 'searchFields'));
|
||||
return view('bo.pages.aisles.index', compact('aisleModels', 'networkModels', 'selectedNetwork', 'search', 'searchFields'));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Show the form for creating a new resource.
|
||||
*
|
||||
|
|
|
|||
|
|
@ -2,7 +2,6 @@
|
|||
|
||||
namespace App\Http\Requests\Bo\Aisles;
|
||||
|
||||
|
||||
class UpdateAisleRequest extends StoreAisleRequest
|
||||
{
|
||||
}
|
||||
|
|
|
|||
|
|
@ -45,7 +45,7 @@ class StoreBrandRequest extends FormRequest
|
|||
'text' => [
|
||||
'required',
|
||||
'string',
|
||||
new WysiwygLength(3, 255),
|
||||
new WysiwygLength(3, 500),
|
||||
],
|
||||
'picture_alt' => 'required|string|between:3,255',
|
||||
'picture_title' => 'required|string|between:3,255',
|
||||
|
|
|
|||
|
|
@ -47,6 +47,7 @@ class StoreNetworkRequest extends FormRequest
|
|||
'subtitle' => 'required|string|between:3,255',
|
||||
'picture_alt' => 'required|string|between:3,255',
|
||||
'picture_title' => 'required|string|between:3,255',
|
||||
'button_text' => 'required|string|between:3,255',
|
||||
'published' => 'required|boolean',
|
||||
|
||||
];
|
||||
|
|
|
|||
60
app/Http/Requests/Bo/UpdateOrderRequest.php
Normal file
60
app/Http/Requests/Bo/UpdateOrderRequest.php
Normal file
|
|
@ -0,0 +1,60 @@
|
|||
<?php
|
||||
|
||||
namespace App\Http\Requests\Bo;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class UpdateOrderRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Attribute model needed.
|
||||
*
|
||||
* @var Model $orderable
|
||||
*/
|
||||
private Model $orderableModel;
|
||||
|
||||
/**
|
||||
* Determine if the user is authorized to make this request.
|
||||
*
|
||||
* @return boolean
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return auth('backend')->check();
|
||||
}
|
||||
|
||||
/**
|
||||
* Prepare the data for validation.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
protected function prepareForValidation(): void
|
||||
{
|
||||
$this->orderableModel = collect($this->route()->parameters())
|
||||
->first(fn($param) => $param instanceof Model);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'order' => [
|
||||
'required',
|
||||
'integer',
|
||||
'min:1',
|
||||
sprintf('max:%s', $this->orderableModel->max('order')),
|
||||
function ($attribute, $value, $fail) {
|
||||
/** @phpstan-ignore-next-line */
|
||||
if ($this->orderableModel && intval($value) === $this->orderableModel->order) {
|
||||
$fail("La valeur de {$attribute} doit être différente de la valeur actuelle.");
|
||||
}
|
||||
},
|
||||
],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
|
@ -4,6 +4,7 @@ namespace App\Models;
|
|||
|
||||
use App\Lib\Helpers\FileStorageHelper;
|
||||
use App\Traits\Models\ActivityLog;
|
||||
use App\Traits\Models\Orderable;
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Validation\ValidationException;
|
||||
|
|
@ -12,6 +13,7 @@ class Aisle extends Model
|
|||
{
|
||||
use ActivityLog;
|
||||
use HasFactory;
|
||||
use Orderable;
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
|
|
@ -27,6 +29,7 @@ class Aisle extends Model
|
|||
'picture_title',
|
||||
'published',
|
||||
'network_id',
|
||||
'order',
|
||||
];
|
||||
|
||||
/**
|
||||
|
|
@ -46,6 +49,7 @@ class Aisle extends Model
|
|||
protected static function booted(): void
|
||||
{
|
||||
static::creating(function (self $model) {
|
||||
self::setOrder($model);
|
||||
self::manageFields($model);
|
||||
});
|
||||
static::updating(function (self $model) {
|
||||
|
|
@ -59,6 +63,7 @@ class Aisle extends Model
|
|||
});
|
||||
static::deleted(function (self $model) {
|
||||
FileStorageHelper::removeFile($model, 'picture');
|
||||
self::setOrder($model, true);
|
||||
});
|
||||
}
|
||||
|
||||
|
|
@ -99,6 +104,16 @@ class Aisle extends Model
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Group ordering by network_id.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function getOrderGroupField(): string
|
||||
{
|
||||
return 'network_id';
|
||||
}
|
||||
|
||||
// * RELATIONS
|
||||
|
||||
/**
|
||||
|
|
|
|||
|
|
@ -30,6 +30,7 @@ class Network extends Model
|
|||
'picture',
|
||||
'picture_alt',
|
||||
'picture_title',
|
||||
'button_text',
|
||||
'order',
|
||||
'published',
|
||||
];
|
||||
|
|
|
|||
47
app/Traits/Controllers/UpdateModelOrder.php
Normal file
47
app/Traits/Controllers/UpdateModelOrder.php
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
<?php
|
||||
|
||||
namespace App\Traits\Controllers;
|
||||
|
||||
use App\Http\Requests\Bo\UpdateOrderRequest;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Http\RedirectResponse;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
|
||||
trait UpdateModelOrder
|
||||
{
|
||||
/**
|
||||
* Updates the model order and shifts affected siblings accordingly
|
||||
*
|
||||
* @param UpdateOrderRequest $request
|
||||
* @param Model $model
|
||||
* @return \Illuminate\Http\RedirectResponse
|
||||
*/
|
||||
public function changeCustomOrder(UpdateOrderRequest $request, Model $model): \Illuminate\Http\RedirectResponse
|
||||
{
|
||||
$newOrder = $request->validated('order');
|
||||
|
||||
return DB::transaction(function () use ($model, $newOrder): RedirectResponse {
|
||||
/** @phpstan-ignore-next-line */
|
||||
$groupField = $model->getOrderGroupField();
|
||||
|
||||
$query = $model::query()
|
||||
->whereKeyNot($model)
|
||||
/** @phpstan-ignore-next-line */
|
||||
->whereBetween('order', [min($model->order, $newOrder), max($model->order, $newOrder)]);
|
||||
|
||||
if ($groupField) {
|
||||
$query->where($groupField, $model->{$groupField});
|
||||
}
|
||||
|
||||
/** @phpstan-ignore-next-line */
|
||||
$model->order < $newOrder ? $query->decrement('order', 1) : $query->increment('order', 1);
|
||||
|
||||
$model->order = $newOrder;
|
||||
if (!$model->saveOrFail()) {
|
||||
return back()->with('error', trans('crud.messages.order_not_changed'));
|
||||
};
|
||||
|
||||
return back()->with('success', trans('crud.messages.order_changed'));
|
||||
});
|
||||
}
|
||||
}
|
||||
56
app/Traits/Models/Orderable.php
Normal file
56
app/Traits/Models/Orderable.php
Normal file
|
|
@ -0,0 +1,56 @@
|
|||
<?php
|
||||
|
||||
namespace App\Traits\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
|
||||
trait Orderable
|
||||
{
|
||||
/**
|
||||
* Returns the grouping field used for ordering.
|
||||
* Returns null if the order is global
|
||||
*
|
||||
* @return string|null
|
||||
*/
|
||||
public function getOrderGroupField(): ?string
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set order after the last element of the list.
|
||||
*
|
||||
* @param Model $model
|
||||
* @param boolean $isDeletion
|
||||
* @return void
|
||||
*/
|
||||
public static function setOrder(Model $model, bool $isDeletion = false): void
|
||||
{
|
||||
/** @phpstan-ignore-next-line */
|
||||
$groupField = $model->getOrderGroupField();
|
||||
$maxOrderQuery = $model::query();
|
||||
|
||||
if ($groupField) {
|
||||
$maxOrderQuery->where($groupField, $model->{$groupField});
|
||||
}
|
||||
|
||||
$maxOrder = \intval($maxOrderQuery->max('order'));
|
||||
|
||||
if ($isDeletion) {
|
||||
$query = $model::query()
|
||||
->whereKeyNot($model)
|
||||
/** @phpstan-ignore-next-line */
|
||||
->whereBetween('order', [$model->order, $maxOrder]);
|
||||
|
||||
if ($groupField) {
|
||||
$query->where($groupField, $model->{$groupField});
|
||||
}
|
||||
|
||||
$query->decrement('order', 1);
|
||||
return;
|
||||
}
|
||||
|
||||
/** @phpstan-ignore-next-line */
|
||||
$model->order = $maxOrder + 1;
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,30 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('networks', function (Blueprint $table) {
|
||||
$table->string('button_text')->default('On produit')->comment('Button text')->after('picture_title');
|
||||
$table->dropUnique(['order']);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('networks', function (Blueprint $table) {
|
||||
$table->unique('order');
|
||||
$table->dropColumn('button_text');
|
||||
});
|
||||
}
|
||||
};
|
||||
37
database/migrations/2026_03_06_125234_alter_aisles_table.php
Normal file
37
database/migrations/2026_03_06_125234_alter_aisles_table.php
Normal file
|
|
@ -0,0 +1,37 @@
|
|||
<?php
|
||||
|
||||
use App\Models\Network;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
return new class extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::table('aisles', function (Blueprint $table) {
|
||||
$table->integer('order')->comment('Position of the aisles')->after('network_id');
|
||||
});
|
||||
|
||||
Network::query()->with('aisles')->get()->map(function ($network) {
|
||||
$network->aisles->map(function ($aisle, $aisleIndex) {
|
||||
$aisle->order = $aisleIndex + 1;
|
||||
$aisle->saveQuietly();
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::table('aisles', function (Blueprint $table) {
|
||||
$table->dropColumn('order');
|
||||
});
|
||||
}
|
||||
};
|
||||
|
|
@ -24,6 +24,7 @@
|
|||
@import "./pages/unveil";
|
||||
@import "./pages/news";
|
||||
@import "./pages/hire";
|
||||
@import "./pages/networks";
|
||||
|
||||
// * PARTIALS
|
||||
@import "./partials/slider";
|
||||
|
|
|
|||
30
resources/sass/fo/pages/_networks.scss
Normal file
30
resources/sass/fo/pages/_networks.scss
Normal file
|
|
@ -0,0 +1,30 @@
|
|||
@use "sass:color";
|
||||
|
||||
.swiper-networks {
|
||||
.swiper-networks-pagination {
|
||||
bottom: 2rem;
|
||||
left: 5%;
|
||||
|
||||
@include media-breakpoint-up(lg) {
|
||||
top: auto;
|
||||
bottom: .5rem;
|
||||
left: 0;
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.swiper-pagination-bullet {
|
||||
width: 3rem;
|
||||
max-width: 10rem;
|
||||
height: .5rem;
|
||||
background-color: color.adjust($color-dark, $alpha: -0.8);
|
||||
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.swiper-pagination-bullet-active {
|
||||
background-color: $color-primary;
|
||||
}
|
||||
}
|
||||
|
|
@ -41,7 +41,8 @@ import {
|
|||
faTrash,
|
||||
faUndoAlt,
|
||||
faWandMagic,
|
||||
faXmark
|
||||
faXmark,
|
||||
faChevronDown,
|
||||
} from "@fortawesome/free-solid-svg-icons";
|
||||
|
||||
config.autoReplaceSvg = false;
|
||||
|
|
@ -88,5 +89,6 @@ library.add(faChevronRight);
|
|||
library.add(faCircleXmark);
|
||||
library.add(faCircleNotch);
|
||||
library.add(faSliders);
|
||||
library.add(faChevronDown);
|
||||
|
||||
dom.watch();
|
||||
|
|
|
|||
|
|
@ -53,7 +53,7 @@ document.addEventListener("DOMContentLoaded", function () {
|
|||
slidesPerView: 1,
|
||||
loop: true,
|
||||
autoplay: {
|
||||
delay: 3000,
|
||||
delay: 20000,
|
||||
disableOnInteraction: false,
|
||||
},
|
||||
pagination: {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,22 @@
|
|||
<td class="text-center align-middle">
|
||||
<div class="d-flex justify-content-center align-items-center">
|
||||
<b class="mx-3">{{ $model->order ?? '' }}</b>
|
||||
|
||||
<div class="dropdown">
|
||||
<button class="btn btn-secondary" type="button" data-bs-toggle="dropdown" aria-expanded="false">
|
||||
<i class="fa-solid fa-chevron-down"></i>
|
||||
</button>
|
||||
<div class="dropdown-menu">
|
||||
<form class="px-4 py-3" action="{{ route("bo.$routeName.change-order", [Str::singular($routeName) => $model]) }}" method="POST">
|
||||
@csrf
|
||||
@method('PATCH')
|
||||
<div class="mb-3">
|
||||
<label for="order-{{ $model->getKey() }}" class="form-label">{{ __('Nouvel ordre') }}</label>
|
||||
<input type="number" class="form-input" id="order-{{ $model->id }}" placeholder="1" name="order" min="1">
|
||||
</div>
|
||||
<button type="submit" class="btn btn-primary">{{ _('Sauvegarder') }}</button>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</td>
|
||||
|
|
@ -1,18 +1,39 @@
|
|||
<table class="table-hover table-fix-action m-0 table">
|
||||
@if (count($aisleModels) > 0)
|
||||
<thead>
|
||||
@include('bo.modules.table-col-sorter', [
|
||||
'cols' => [
|
||||
@php
|
||||
$cols = [];
|
||||
|
||||
if (request()->network) {
|
||||
$cols = array_merge($cols, [
|
||||
'order' => Str::ucfirst(__('validation.custom.order')),
|
||||
]);
|
||||
}
|
||||
|
||||
$cols = array_merge($cols, [
|
||||
'name' => Str::ucfirst(__('validation.attributes.name')),
|
||||
'network_id' => Str::ucfirst(trans_choice('models.classes.network', 1)),
|
||||
'published' => Str::ucfirst(__('validation.custom.activated')),
|
||||
'updated_at' => Str::ucfirst(__('validation.attributes.updated_at')),
|
||||
],
|
||||
]);
|
||||
@endphp
|
||||
|
||||
@include('bo.modules.table-col-sorter', [
|
||||
$cols
|
||||
])
|
||||
</thead>
|
||||
<tbody>
|
||||
@foreach ($aisleModels as $aisleModel)
|
||||
<tr class="border-bottom list-item">
|
||||
@php
|
||||
$routeName = request()->route()->getName();
|
||||
@endphp
|
||||
@if (request()->network && empty(request()->search) && Session::get("$routeName.sort_col") === 'order')
|
||||
@include('bo.modules.change-model-order-select', [
|
||||
'routeName' => 'aisles',
|
||||
'model' => $aisleModel,
|
||||
])
|
||||
@endif
|
||||
<td class="text-center align-middle">{{ $aisleModel->name }}</td>
|
||||
<td class="text-center align-middle">{{ $aisleModel->network->name }}</td>
|
||||
@include('bo.modules.change-published-status', [
|
||||
|
|
|
|||
|
|
@ -6,15 +6,37 @@
|
|||
@section('content')
|
||||
<div class="d-flex justify-content-between flex-md-nowrap align-items-center flex-wrap">
|
||||
@include('modules.breadcrumbs.breadcrumb-body')
|
||||
@can('create', \App\Models\Aisle::class)
|
||||
<a class="btn btn-primary float-right" data-bs-toggle="tooltip" href="{{ route('bo.aisles.create') }}"
|
||||
title="{{ __('crud.helpers.create_model', ['model' => trans_choice('models.classes.aisle', 1)]) }}">
|
||||
<i class="fa-solid fa-plus"></i>
|
||||
</a>
|
||||
@endcan
|
||||
<form id="aisleNetwork" action="{{ route('bo.aisles.index') }}">
|
||||
<div class="input-group justify-content-end">
|
||||
<select class="form-select w-fit" id="selectAisleNetwork" name="network">
|
||||
<option value="" @if ($selectedNetwork === null) selected @endif>
|
||||
Tous les rayons
|
||||
</option>
|
||||
@foreach ($networkModels as $networkModel)
|
||||
<option value="{{ $networkModel->getKey() }}" @if ($selectedNetwork === $networkModel->getKey()) selected @endif>
|
||||
{{ $networkModel->title }}
|
||||
</option>
|
||||
@endforeach
|
||||
</select>
|
||||
@push('scripts')
|
||||
<script nonce="{{ $nonce }}">
|
||||
document.getElementById('selectAisleNetwork').addEventListener('change', function(e) {
|
||||
document.getElementById('aisleNetwork').submit();
|
||||
});
|
||||
</script>
|
||||
@endpush
|
||||
@can('create', \App\Models\Aisle::class)
|
||||
<a class="btn btn-primary float-right" data-bs-toggle="tooltip" href="{{ route('bo.aisles.create') }}"
|
||||
title="{{ __('crud.helpers.create_model', ['model' => trans_choice('models.classes.aisle', 1)]) }}">
|
||||
<i class="fa-solid fa-plus"></i>
|
||||
</a>
|
||||
@endcan
|
||||
</div>
|
||||
</form>
|
||||
|
||||
</div>
|
||||
@include('bo.modules.search-bar')
|
||||
<div class="table-responsive mb-3">
|
||||
<div class="table mb-3">
|
||||
@include('bo.pages.aisles.index-list')
|
||||
</div>
|
||||
{{ $aisleModels->links() }}
|
||||
|
|
|
|||
|
|
@ -252,6 +252,35 @@
|
|||
</div>
|
||||
</fieldset>
|
||||
</div>
|
||||
{{-- BUTTON_TEXT --}}
|
||||
<div class="col-12 col-md-6 m-md-0 mb-3">
|
||||
@include('bo.partials.inputs.varchar', [
|
||||
'id' => 'networkButtonText',
|
||||
'label' => __(':field :inter:model', [
|
||||
'field' => Str::ucfirst(__('validation.custom.button_label')),
|
||||
'inter' => __('validation.custom.of_the.male'),
|
||||
'model' => trans_choice('models.classes.network', 1),
|
||||
]),
|
||||
'hasWordCounter' => true,
|
||||
'name' => 'button_text',
|
||||
'required' => true,
|
||||
'model' => $networkModel ?? null,
|
||||
'helper' => __('validation.between.string', [
|
||||
'attribute' => __(':field :inter:model', [
|
||||
'field' => __('validation.custom.button'),
|
||||
'inter' => __('validation.custom.of_the.male'),
|
||||
'model' => trans_choice('models.classes.network', 1),
|
||||
]),
|
||||
'min' => 3,
|
||||
'max' => 255,
|
||||
]),
|
||||
'placeholder' => __(':field :inter:model', [
|
||||
'field' => Str::ucfirst(__('validation.custom.button_label')),
|
||||
'inter' => __('validation.custom.of_the.male'),
|
||||
'model' => trans_choice('models.classes.network', 1),
|
||||
]),
|
||||
])
|
||||
</div>
|
||||
<div class="col-12 text-center">
|
||||
<p><b>{{ __('validation.custom.required_fields') }}</b></p>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -24,7 +24,10 @@
|
|||
</div>
|
||||
|
||||
{{-- AISLES --}}
|
||||
@foreach ($networkModel->aisles as $aisleModel)
|
||||
@php
|
||||
$aisleModels = $networkModel->aisles->where('published', true);
|
||||
@endphp
|
||||
@foreach ($aisleModels as $aisleModel)
|
||||
<section class="anchor-padding my-4">
|
||||
<div class="row">
|
||||
<div class="col-12 text-center">
|
||||
|
|
@ -40,21 +43,31 @@
|
|||
</div>
|
||||
<div class="row">
|
||||
<div class="col-12 col-md-8 offset-md-2">
|
||||
@foreach($aisleModel->brands as $brandModel)
|
||||
@php
|
||||
$brandModels = $aisleModel->brands->where('published', true);
|
||||
@endphp
|
||||
@foreach($brandModels as $brandModel)
|
||||
<div class="row my-3 align-items-center">
|
||||
<div @class([
|
||||
'col-3',
|
||||
'order-2' => $loop->even
|
||||
])>
|
||||
<a href="{{ $brandModel->link }}"
|
||||
target="_blank"
|
||||
title="{{ __('Accéder au lien : :link', ['link' => $brandModel->link])}}"
|
||||
>
|
||||
@if ($brandModel->link)
|
||||
<a href="{{ $brandModel->link }}"
|
||||
target="_blank"
|
||||
title="{{ __('Accéder au lien : :link', ['link' => $brandModel->link])}}"
|
||||
>
|
||||
<img class="img-fluid"
|
||||
src="{{ asset($brandModel->picture) }}"
|
||||
alt="{{ $brandModel->picture_alt }}"
|
||||
title="{{ $brandModel->picture_title }}">
|
||||
</a>
|
||||
@else
|
||||
<img class="img-fluid"
|
||||
src="{{ asset($brandModel->picture) }}"
|
||||
alt="{{ $brandModel->picture_alt }}"
|
||||
title="{{ $brandModel->picture_title }}">
|
||||
</a>
|
||||
@endif
|
||||
</div>
|
||||
<div @class([
|
||||
'col-9',
|
||||
|
|
@ -81,10 +94,10 @@
|
|||
<div class="col-12 position-relative mb-5">
|
||||
<div class="swiper swiper-networks mt-lg-0 mt-5 overflow-visible" id="swiper-networks">
|
||||
<div class="swiper-wrapper">
|
||||
@foreach ($networkModels as $networkModel)
|
||||
@foreach ($networkModels as $network)
|
||||
<div class="swiper-slide">
|
||||
@include('fo.partials.networks.slider-card', [
|
||||
'networkModel' => $networkModel
|
||||
'networkModel' => $network
|
||||
])
|
||||
</div>
|
||||
@endforeach
|
||||
|
|
@ -104,4 +117,14 @@
|
|||
</div>
|
||||
</section>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="d-flex align-items-center justify-content-center">
|
||||
<a href="{{ route('fo.produce.show') }}"
|
||||
class="btn btn-primary rounded-pill w-fit"
|
||||
title="{{ $networkModel->button_text }}"
|
||||
>
|
||||
{{ $networkModel->button_text }}
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
|
|
|
|||
|
|
@ -150,6 +150,9 @@
|
|||
</div>
|
||||
@endforeach
|
||||
</div>
|
||||
<div
|
||||
class="position-relative swiper-pagination swiper-networks-pagination swiper-pagination-clickable swiper-pagination-bullets swiper-pagination-horizontal d-flex justify-content-center align-items-center mt-5 flex-nowrap px-5">
|
||||
</div>
|
||||
</div>
|
||||
<button class="swiper-button swiper-button-prev-custom swiper-networks-button-prev z-1 mx-3">
|
||||
<img src="{{ Vite::asset('resources/assets/images/misc/blue-arrow.svg') }}"
|
||||
|
|
|
|||
|
|
@ -4,5 +4,5 @@
|
|||
alt="{{ $networkModel->picture_alt }}">
|
||||
</div>
|
||||
<a class="btn btn-primary position-absolute top-50 start-50 translate-middle rounded-5 text-uppercase mx-auto w-fit h-auto"
|
||||
href="{{ route('fo.networks.show', $networkModel) }}">{{ __('Découvrir le réseau :network', ['network' => $networkModel->name]) }}</a>
|
||||
href="{{ route('fo.networks.show', $networkModel) }}">{{ $networkModel->name }}</a>
|
||||
</div>
|
||||
|
|
|
|||
|
|
@ -183,7 +183,7 @@ Route::middleware(['admin-secure'])->prefix('bo')
|
|||
// * AISLES
|
||||
Route::resource('aisles', AisleController::class)->except('show')
|
||||
->withoutMiddleware('htmlsanitize')
|
||||
->middleware('htmlsanitize:content');
|
||||
->middleware('htmlsanitize:text');
|
||||
Route::get('/aisles/{aisle}/duplicate', [
|
||||
AisleController::class,
|
||||
'duplicate'
|
||||
|
|
@ -192,6 +192,10 @@ Route::middleware(['admin-secure'])->prefix('bo')
|
|||
AisleController::class,
|
||||
'changePublished'
|
||||
])->name('aisles.change-published');
|
||||
Route::patch('/aisles/{aisle}/change-order', [
|
||||
AisleController::class,
|
||||
'changeCustomOrder'
|
||||
])->name('aisles.change-order');
|
||||
|
||||
// * BRANDS
|
||||
Route::resource('brands', BrandController::class)->except('show')
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue