| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215 |
- {{--
- Partial: picker-поля — cars_picker, makes_picker, reviews_picker, services_picker
- Переменные из родителя: $field, $prefix, $values
- --}}
- {{-- ── cars_picker — мультиселект авто из каталога ────────────────── --}}
- @if($field['type'] === 'cars_picker')
- @php
- // Площадки из справочника — строго оттуда, не из car.platform
- $cpSection = \App\Models\DictSection::where('code', 'platforms')->with('values')->first();
- $cpPlatforms = $cpSection ? $cpSection->values->pluck('value') : collect();
- $allCars = \App\Models\Car::select('id', 'make', 'model', 'year', 'price_rub', 'price_usd', 'platform')
- ->where('status', 'active')
- ->orderBy('make')->orderBy('model')->get();
- $selectedIds = array_map('intval', $values[$field['name']] ?? []);
- $cpUid = 'cp-' . Str::random(6); // уникальный id для изоляции JS на странице с несколькими picker-ами
- @endphp
- <div class="form-group">
- <label>{{ $field['label'] }}</label>
- {{-- Кнопки-фильтры по площадкам (данные из справочника) --}}
- @if($cpPlatforms->isNotEmpty())
- <div class="mb-2 d-flex flex-wrap" style="gap:4px">
- <button type="button"
- class="btn btn-xs btn-primary cp-filter-btn"
- data-picker="{{ $cpUid }}" data-platform="">
- Все
- </button>
- @foreach($cpPlatforms as $cpPl)
- <button type="button"
- class="btn btn-xs btn-outline-secondary cp-filter-btn"
- data-picker="{{ $cpUid }}" data-platform="{{ $cpPl }}">
- {{ $cpPl }}
- </button>
- @endforeach
- </div>
- @endif
- {{-- Список авто с data-platform для JS-фильтрации --}}
- <div class="border rounded p-2" style="max-height:280px;overflow-y:auto;background:#f8f9fa"
- id="{{ $cpUid }}-list">
- @forelse($allCars as $car)
- <div class="form-check cp-car-row"
- data-picker="{{ $cpUid }}"
- data-platform="{{ $car->platform }}">
- <input class="form-check-input" type="checkbox"
- name="{{ $prefix }}[{{ $field['name'] }}][]"
- value="{{ $car->id }}"
- id="car-{{ $car->id }}"
- @checked(in_array($car->id, $selectedIds))>
- <label class="form-check-label" for="car-{{ $car->id }}">
- {{ $car->make }} {{ $car->model }} ({{ $car->year }})
- @if($car->price_rub)
- — {{ number_format($car->price_rub, 0, '.', ' ') }} ₽
- @elseif($car->price_usd)
- — {{ number_format($car->price_usd, 0, '.', ' ') }} $
- @endif
- @if($car->platform)
- <span class="text-muted" style="font-size:11px">[{{ $car->platform }}]</span>
- @endif
- </label>
- </div>
- @empty
- <p class="text-muted small mb-0">В каталоге пока нет автомобилей.</p>
- @endforelse
- </div>
- <small class="text-muted">Порядок на странице — в том порядке, в каком выбраны.</small>
- </div>
- {{-- JS: фильтрация строк по площадке, изолирована по data-picker --}}
- <script>
- (function () {
- document.querySelectorAll('.cp-filter-btn[data-picker="{{ $cpUid }}"]').forEach(function (btn) {
- btn.addEventListener('click', function () {
- var picker = this.dataset.picker;
- var platform = this.dataset.platform;
- // Переключаем активную кнопку
- document.querySelectorAll('.cp-filter-btn[data-picker="' + picker + '"]').forEach(function (b) {
- b.classList.toggle('btn-primary', b === btn);
- b.classList.toggle('btn-outline-secondary', b !== btn);
- });
- // Показываем/скрываем строки
- document.querySelectorAll('.cp-car-row[data-picker="' + picker + '"]').forEach(function (row) {
- row.style.display = (!platform || row.dataset.platform === platform) ? '' : 'none';
- });
- });
- });
- })();
- </script>
- {{-- ── makes_picker — чекбоксы марок из справочника dict_values ──── --}}
- @elseif($field['type'] === 'makes_picker')
- @php
- $makesSection = \App\Models\DictSection::where('code', 'makes')->first();
- $allMakeObjs = $makesSection
- ? \App\Models\DictValue::where('section_id', $makesSection->id)
- ->whereNull('parent_id')
- ->orderBy('sort_order')
- ->get(['id', 'value', 'logo'])
- : collect();
- $selectedMakes = $values[$field['name']] ?? [];
- @endphp
- <div class="form-group">
- <label>{{ $field['label'] }}</label>
- <div class="border rounded p-2" style="background:#f8f9fa">
- <div class="row">
- @forelse($allMakeObjs as $makeObj)
- <div class="col-6 col-md-4">
- <div class="form-check d-flex align-items-center">
- <input class="form-check-input flex-shrink-0" type="checkbox"
- name="{{ $prefix }}[{{ $field['name'] }}][]"
- value="{{ $makeObj->value }}"
- id="make-{{ Str::slug($makeObj->value) }}"
- @checked(in_array($makeObj->value, $selectedMakes))>
- <label class="form-check-label d-flex align-items-center ml-1"
- for="make-{{ Str::slug($makeObj->value) }}">
- @if($makeObj->logo)
- <img src="{{ asset('storage/' . $makeObj->logo) }}"
- alt="{{ $makeObj->value }}"
- style="width:24px;height:24px;object-fit:contain;margin-right:5px">
- @endif
- {{ $makeObj->value }}
- </label>
- </div>
- </div>
- @empty
- <p class="text-muted small mb-0 col-12">Добавьте марки в справочник «Марки и модели».</p>
- @endforelse
- </div>
- </div>
- <small class="text-muted">Выбранные марки выводятся в алфавитном порядке в блоке.</small>
- </div>
- {{-- ── reviews_picker — выбор отзывов из таблицы reviews ─────────── --}}
- @elseif($field['type'] === 'reviews_picker')
- @php
- $allReviews = \App\Models\Review::orderBy('sort_order')->orderByDesc('created_at')->get();
- $selectedIds = array_map('intval', $values[$field['name']] ?? []);
- @endphp
- <div class="form-group">
- <label>{{ $field['label'] }}</label>
- @if($allReviews->isEmpty())
- <div class="alert alert-warning py-2">
- Отзывов пока нет. <a href="{{ route('admin.reviews.create') }}" target="_blank">Добавить отзыв</a>
- </div>
- @else
- <div class="border rounded p-2" style="max-height:300px;overflow-y:auto;background:#f8f9fa">
- @foreach($allReviews as $rev)
- <div class="form-check">
- <input class="form-check-input" type="checkbox"
- name="{{ $prefix }}[{{ $field['name'] }}][]"
- value="{{ $rev->id }}"
- id="rev-{{ $rev->id }}"
- @checked(in_array($rev->id, $selectedIds))>
- <label class="form-check-label" for="rev-{{ $rev->id }}">
- <strong>{{ $rev->author }}</strong>
- @if($rev->car_name) — {{ $rev->car_name }}@endif
- <span style="color:#f39c12">
- {{ str_repeat('★', $rev->rating) }}{{ str_repeat('☆', 5 - $rev->rating) }}
- </span>
- @if(!$rev->is_active)
- <span class="badge badge-secondary ml-1">скрыт</span>
- @endif
- </label>
- </div>
- @endforeach
- </div>
- <small class="text-muted">
- Выбранные отзывы выводятся в порядке их sort_order.
- <a href="{{ route('admin.reviews.index') }}" target="_blank">Управление отзывами</a>
- </small>
- @endif
- </div>
- {{-- ── services_picker — чекбоксы услуг из таблицы services ─────── --}}
- @elseif($field['type'] === 'services_picker')
- @php
- $allServices = \App\Models\Service::orderBy('sort_order')->orderBy('title')->get();
- $selectedIds = array_map('intval', $values[$field['name']] ?? []);
- @endphp
- <div class="form-group">
- <label>{{ $field['label'] }}</label>
- @if($allServices->isEmpty())
- <div class="alert alert-warning py-2">
- Услуг пока нет. <a href="{{ route('admin.services.create') }}" target="_blank">Добавить</a>
- </div>
- @else
- <div class="border rounded p-2" style="max-height:280px;overflow-y:auto;background:#f8f9fa">
- @foreach($allServices as $svc)
- <div class="form-check">
- <input class="form-check-input" type="checkbox"
- name="{{ $prefix }}[{{ $field['name'] }}][]"
- value="{{ $svc->id }}"
- id="svc-{{ $svc->id }}"
- @checked(in_array($svc->id, $selectedIds))>
- <label class="form-check-label" for="svc-{{ $svc->id }}">
- @if($svc->icon) {{ $svc->icon }} @endif
- <strong>{{ $svc->title }}</strong>
- @if(!$svc->is_active)
- <span class="badge badge-secondary ml-1">скрыта</span>
- @endif
- </label>
- </div>
- @endforeach
- </div>
- <small class="text-muted">
- Оставьте пустым — будут показаны последние N активных услуг.
- <a href="{{ route('admin.services.index') }}" target="_blank">Управление услугами</a>
- </small>
- @endif
- </div>
- @endif
|