first commit
This commit is contained in:
		
							
								
								
									
										151
									
								
								resources/views/components/form/select.blade.php
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										151
									
								
								resources/views/components/form/select.blade.php
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,151 @@
 | 
			
		||||
@props([
 | 
			
		||||
    // Identificador único
 | 
			
		||||
    'uid' => uniqid(),
 | 
			
		||||
 | 
			
		||||
    // Modelo de Livewire (si aplica)
 | 
			
		||||
    'model' => '',
 | 
			
		||||
 | 
			
		||||
    // Etiqueta y clases de la etiqueta
 | 
			
		||||
    'label' => '',
 | 
			
		||||
    'labelClass' => '',
 | 
			
		||||
 | 
			
		||||
    // Clases generales
 | 
			
		||||
    'align' => 'start',
 | 
			
		||||
    'size' => '', // Tamaño del select (small, large)
 | 
			
		||||
    'mb0' => false, // Remover margen inferior
 | 
			
		||||
    'parentClass' => '',
 | 
			
		||||
 | 
			
		||||
    // Activar Select2 automáticamente
 | 
			
		||||
    'select2' => false,
 | 
			
		||||
 | 
			
		||||
    // Prefijos y sufijos en input-group
 | 
			
		||||
    'prefixLabel' => null,
 | 
			
		||||
    'suffixLabel' => null,
 | 
			
		||||
    'buttonBefore' => null,
 | 
			
		||||
    'buttonAfter' => null,
 | 
			
		||||
 | 
			
		||||
    // Diseño de disposición (columnas)
 | 
			
		||||
    'inline' => false,
 | 
			
		||||
    'labelCol' => 4,
 | 
			
		||||
    'inputCol' => 8,
 | 
			
		||||
 | 
			
		||||
    // Texto de ayuda
 | 
			
		||||
    'helperText' => '',
 | 
			
		||||
 | 
			
		||||
    // Opciones del select
 | 
			
		||||
    'options' => [],
 | 
			
		||||
 | 
			
		||||
    // Atributos adicionales
 | 
			
		||||
    'attributes' => new \Illuminate\View\ComponentAttributeBag([]),
 | 
			
		||||
])
 | 
			
		||||
 | 
			
		||||
@php
 | 
			
		||||
    // **Configuración de valores base**
 | 
			
		||||
    $livewireModel = $attributes->get('wire:model', $model);
 | 
			
		||||
    $name = $attributes->get('name', $livewireModel);
 | 
			
		||||
    $inputId = $attributes->get('id', $name . '_' . $uid);
 | 
			
		||||
    $placeholder = $attributes->get('placeholder', 'Seleccione ' . strtolower($label));
 | 
			
		||||
    $selected = $attributes->get('selected', null);
 | 
			
		||||
 | 
			
		||||
    // **Manejo de errores**
 | 
			
		||||
    $errorKey = $livewireModel ?: $name;
 | 
			
		||||
    $hasError = $errors->has($errorKey);
 | 
			
		||||
    $errorClass = $hasError ? 'is-invalid' : '';
 | 
			
		||||
 | 
			
		||||
    // **Clases dinámicas**
 | 
			
		||||
    $select2Class = $select2 ? 'select2' : '';  // Agrega la clase `select2` si está habilitado
 | 
			
		||||
    $sizeClass = match ($size) {
 | 
			
		||||
        'sm' => 'form-select-sm',
 | 
			
		||||
        'lg' => 'form-select-lg',
 | 
			
		||||
        default => '',
 | 
			
		||||
    };
 | 
			
		||||
    $alignClass = match ($align) {
 | 
			
		||||
        'center' => 'text-center',
 | 
			
		||||
        'end' => 'text-end',
 | 
			
		||||
        default => '',
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    // **Construcción de clases dinámicas**
 | 
			
		||||
    $fullClass = trim("form-select $select2Class $sizeClass $alignClass $errorClass");
 | 
			
		||||
    $fullLabelClass = trim(($inline ? 'col-form-label col-md-' . $labelCol : 'form-label') . ' ' . $labelClass);
 | 
			
		||||
    $containerClass = trim(($inline ? 'row' : '') . ' fv-row ' . ($mb0 ? '' : 'mb-4') . " $alignClass $parentClass");
 | 
			
		||||
 | 
			
		||||
    // **Fusionar atributos con clases dinámicas**
 | 
			
		||||
    $selectAttributes = $attributes->merge([
 | 
			
		||||
        'id' => $inputId,
 | 
			
		||||
        'name' => $name,
 | 
			
		||||
    ])->class($fullClass);
 | 
			
		||||
 | 
			
		||||
    // **Detectar si se necesita input-group**
 | 
			
		||||
    $requiresInputGroup = $prefixLabel || $suffixLabel || $buttonBefore || $buttonAfter;
 | 
			
		||||
@endphp
 | 
			
		||||
 | 
			
		||||
<div class="{{ $containerClass }}">
 | 
			
		||||
    {{-- Etiqueta del select --}}
 | 
			
		||||
    @if($label)
 | 
			
		||||
        <label for="{{ $inputId }}" class="{{ $fullLabelClass }}">{{ $label }}</label>
 | 
			
		||||
    @endif
 | 
			
		||||
 | 
			
		||||
    @if($inline)
 | 
			
		||||
        <div class="col-md-{{ $inputCol }}">
 | 
			
		||||
    @endif
 | 
			
		||||
 | 
			
		||||
        {{-- Input Group (Si tiene prefijo/sufijo) --}}
 | 
			
		||||
        @if ($requiresInputGroup)
 | 
			
		||||
            <div class="input-group input-group-merge">
 | 
			
		||||
                @isset($buttonBefore)
 | 
			
		||||
                    <button class="btn btn-outline-primary waves-effect" type="button">{{ $buttonBefore }}</button>
 | 
			
		||||
                @endisset
 | 
			
		||||
 | 
			
		||||
                @if($prefixLabel)
 | 
			
		||||
                    <label class="input-group-text" for="{{ $inputId }}">{{ $prefixLabel }}</label>
 | 
			
		||||
                @endif
 | 
			
		||||
 | 
			
		||||
                {{-- Select --}}
 | 
			
		||||
                <select {!! $selectAttributes !!} {{ $attributes->get('multiple') ? 'multiple' : '' }} {{ $attributes->get('disabled') ? 'disabled' : '' }} {{ $livewireModel ? "wire:model=$livewireModel" : '' }} {{ $select2 ? 'data-live-search="true"' : '' }}>
 | 
			
		||||
                    @if (!$attributes->get('multiple') && $placeholder)
 | 
			
		||||
                        <option value="">{{ $placeholder }}</option>
 | 
			
		||||
                    @endif
 | 
			
		||||
                    @foreach ($options as $key => $value)
 | 
			
		||||
                        <option value="{{ $key }}" {{ (string) $key === (string) $selected ? 'selected' : '' }}>
 | 
			
		||||
                            {{ $value }}
 | 
			
		||||
                        </option>
 | 
			
		||||
                    @endforeach
 | 
			
		||||
                </select>
 | 
			
		||||
 | 
			
		||||
                @if($suffixLabel)
 | 
			
		||||
                    <label class="input-group-text" for="{{ $inputId }}">{{ $suffixLabel }}</label>
 | 
			
		||||
                @endif
 | 
			
		||||
 | 
			
		||||
                @isset($buttonAfter)
 | 
			
		||||
                    <button class="btn btn-outline-primary waves-effect" type="button">{{ $buttonAfter }}</button>
 | 
			
		||||
                @endisset
 | 
			
		||||
            </div>
 | 
			
		||||
        @else
 | 
			
		||||
            {{-- Select sin prefijo/sufijo --}}
 | 
			
		||||
            <select {!! $selectAttributes !!} {{ $attributes->get('multiple') ? 'multiple' : '' }} {{ $attributes->get('disabled') ? 'disabled' : '' }} {{ $livewireModel ? "wire:model=$livewireModel" : '' }} {{ $select2 ? 'data-live-search="true"' : '' }}>
 | 
			
		||||
                @if (!$attributes->get('multiple') && $placeholder)
 | 
			
		||||
                    <option value="">{{ $placeholder }}</option>
 | 
			
		||||
                @endif
 | 
			
		||||
                @foreach ($options as $key => $value)
 | 
			
		||||
                    <option value="{{ $key }}" {{ (string) $key === (string) $selected ? 'selected' : '' }}>
 | 
			
		||||
                        {{ $value }}
 | 
			
		||||
                    </option>
 | 
			
		||||
                @endforeach
 | 
			
		||||
            </select>
 | 
			
		||||
        @endif
 | 
			
		||||
 | 
			
		||||
        {{-- Texto de ayuda --}}
 | 
			
		||||
        @isset($helperText)
 | 
			
		||||
            <div class="form-text">{{ $helperText }}</div>
 | 
			
		||||
        @endisset
 | 
			
		||||
 | 
			
		||||
        {{-- Errores de validación --}}
 | 
			
		||||
        @if ($hasError)
 | 
			
		||||
            <span class="text-danger">{{ $errors->first($errorKey) }}</span>
 | 
			
		||||
        @endif
 | 
			
		||||
 | 
			
		||||
    @if($inline)
 | 
			
		||||
        </div>
 | 
			
		||||
    @endif
 | 
			
		||||
</div>
 | 
			
		||||
		Reference in New Issue
	
	Block a user