@props([ 'categories' => [], 'multiple' => false, 'name' => 'category_id', // form field name 'selected' => [], // pre-selected IDs 'placeholder' => null, 'label' => null, 'required' => false, 'error' => null, ]) @php $placeholder = $placeholder ?? ($multiple ? __('Select categories…') : __('Select a category…')); // Flatten tree to build a lookup map id => name $flatMap = []; $flatten = function ($nodes) use (&$flatten, &$flatMap) { foreach ($nodes as $node) { $flatMap[$node->id] = $node->name; if (!empty($node->children)) { $flatten($node->children); } } }; $flatten($categories); $selectedIds = array_filter((array) $selected); $selectedNames = array_values(array_filter( array_map(fn($id) => $flatMap[$id] ?? null, $selectedIds) )); // Encode for Alpine init $initIds = json_encode(array_map('intval', $selectedIds)); $initNames = json_encode($selectedNames); $flatJson = json_encode($flatMap); @endphp
{{-- Label --}} @if ($label) @endif {{-- ── Trigger ─────────────────────────────────────────────── --}} {{-- Error message --}} @if ($error)

{{ $error }}

@endif {{-- ── Dropdown ─────────────────────────────────────────────── --}}
@if (empty($categories))

{{ __('No categories available.') }}

@else {{-- Pass selectCategory callback to the tree --}} @endif
{{-- ── Hidden inputs for form submission ───────────────────── --}} @if ($multiple) @else @endif