149 lines
4.5 KiB
PHP
149 lines
4.5 KiB
PHP
|
@props([
|
||
|
// Identificador único
|
||
|
'uid' => uniqid(),
|
||
|
|
||
|
// Modelos para Livewire
|
||
|
'checkboxModel' => '',
|
||
|
'textModel' => '',
|
||
|
|
||
|
// Etiqueta y clases de la etiqueta
|
||
|
'label' => '',
|
||
|
'labelClass' => '',
|
||
|
|
||
|
// Clases generales
|
||
|
'align' => 'start',
|
||
|
'size' => '', // Tamaño del input (sm, lg)
|
||
|
'mb0' => false, // Remover margen inferior
|
||
|
'parentClass' => '',
|
||
|
|
||
|
// Elementos opcionales antes/después del input
|
||
|
'prefix' => null,
|
||
|
'suffix' => null,
|
||
|
|
||
|
// Íconos dentro del input
|
||
|
'icon' => null, // Ícono fijo
|
||
|
'clickableIcon' => null, // Ícono con botón
|
||
|
|
||
|
// Configuración del checkbox
|
||
|
'checked' => false,
|
||
|
'disabled' => false,
|
||
|
|
||
|
// Configuración del input de texto
|
||
|
'disableOnOffCheckbox' => true, // Deshabilita input hasta que el checkbox esté activo
|
||
|
'focusOnCheck' => true, // Hace foco en el input al activar el checkbox
|
||
|
|
||
|
// Texto de ayuda
|
||
|
'helperText' => '',
|
||
|
|
||
|
// Atributos adicionales para el input de texto
|
||
|
'attributes' => new \Illuminate\View\ComponentAttributeBag([]),
|
||
|
])
|
||
|
|
||
|
@php
|
||
|
// **Generación de Name, ID y Model**
|
||
|
$livewireCheckbox = $checkboxModel ? "wire:model=$checkboxModel" : '';
|
||
|
$livewireText = $textModel ? "wire:model=$textModel" : '';
|
||
|
|
||
|
$nameCheckbox = $checkboxModel;
|
||
|
$nameText = $attributes->get('name', $textModel);
|
||
|
|
||
|
$checkboxId = $attributes->get('id', 'chk_' . $uid);
|
||
|
$textInputId = 'txt_' . $uid;
|
||
|
|
||
|
// **Placeholder del input de texto**
|
||
|
$placeholder = $attributes->get('placeholder', 'Ingrese información');
|
||
|
|
||
|
// **Clases dinámicas**
|
||
|
$sizeClass = match ($size) {
|
||
|
'sm' => 'form-control-sm',
|
||
|
'lg' => 'form-control-lg',
|
||
|
default => '',
|
||
|
};
|
||
|
|
||
|
$fullClass = trim("form-control $sizeClass");
|
||
|
|
||
|
// **Fusionar atributos del input de texto**
|
||
|
$inputAttributes = $attributes->merge([
|
||
|
'id' => $textInputId,
|
||
|
'name' => $nameText,
|
||
|
'placeholder' => $placeholder,
|
||
|
])->class($fullClass);
|
||
|
@endphp
|
||
|
|
||
|
{{-- ============================ CHECKBOX CON INPUT GROUP ============================ --}}
|
||
|
<div class="mb-4 {{ $parentClass }}">
|
||
|
@if ($label)
|
||
|
<label for="{{ $checkboxId }}" class="{{ $labelClass }}">{{ $label }}</label>
|
||
|
@endif
|
||
|
|
||
|
<div class="input-group">
|
||
|
{{-- Checkbox dentro del input-group-text --}}
|
||
|
<div class="input-group-text">
|
||
|
<input
|
||
|
id="{{ $checkboxId }}"
|
||
|
name="{{ $nameCheckbox }}"
|
||
|
type="checkbox"
|
||
|
{{ $livewireCheckbox }}
|
||
|
{{ $disabled ? 'disabled' : '' }}
|
||
|
class="form-check-input mt-0"
|
||
|
onchange="toggleInputState('{{ $checkboxId }}', '{{ $textInputId }}', {{ $focusOnCheck ? 'true' : 'false' }}, {{ $disableOnOffCheckbox ? 'true' : 'false' }})"
|
||
|
>
|
||
|
</div>
|
||
|
|
||
|
{{-- Prefijo opcional --}}
|
||
|
@isset($prefix)
|
||
|
<span class="input-group-text">{{ $prefix }}</span>
|
||
|
@endisset
|
||
|
|
||
|
{{-- Ícono fijo opcional --}}
|
||
|
@isset($icon)
|
||
|
<span class="input-group-text"><i class="{{ $icon }}"></i></span>
|
||
|
@endisset
|
||
|
|
||
|
{{-- Input de texto dentro del mismo grupo --}}
|
||
|
<input
|
||
|
{{ $livewireText }}
|
||
|
{!! $inputAttributes !!}
|
||
|
@if ($disableOnOffCheckbox) disabled @endif
|
||
|
aria-label="Text input with checkbox"
|
||
|
>
|
||
|
|
||
|
{{-- Sufijo opcional --}}
|
||
|
@isset($suffix)
|
||
|
<span class="input-group-text">{{ $suffix }}</span>
|
||
|
@endisset
|
||
|
|
||
|
{{-- Ícono clickeable opcional --}}
|
||
|
@isset($clickableIcon)
|
||
|
<button type="button" class="input-group-text cursor-pointer">
|
||
|
<i class="{{ $clickableIcon }}"></i>
|
||
|
</button>
|
||
|
@endisset
|
||
|
</div>
|
||
|
|
||
|
{{-- Texto de ayuda opcional --}}
|
||
|
@if ($helperText)
|
||
|
<div class="form-text">{{ $helperText }}</div>
|
||
|
@endif
|
||
|
</div>
|
||
|
|
||
|
{{-- ============================ JAVASCRIPT PURO ============================ --}}
|
||
|
<script>
|
||
|
function toggleInputState(checkboxId, inputId, focusOnCheck, disableOnOffCheckbox) {
|
||
|
let checkbox = document.getElementById(checkboxId);
|
||
|
let textInput = document.getElementById(inputId);
|
||
|
|
||
|
if (!checkbox || !textInput) return;
|
||
|
|
||
|
// Deshabilitar o habilitar el input de texto
|
||
|
if (disableOnOffCheckbox) {
|
||
|
textInput.disabled = !checkbox.checked;
|
||
|
}
|
||
|
|
||
|
// Enfocar automáticamente el input si está habilitado
|
||
|
if (focusOnCheck && checkbox.checked) {
|
||
|
textInput.focus();
|
||
|
}
|
||
|
}
|
||
|
</script>
|