170 lines
5.2 KiB
PHP
170 lines
5.2 KiB
PHP
@props([
|
|
// Identificador único
|
|
'uid' => uniqid(),
|
|
|
|
// Modelo de Livewire
|
|
'model' => '',
|
|
|
|
// Etiqueta y Clases
|
|
'label' => '',
|
|
'labelClass' => '',
|
|
'placeholder' => '',
|
|
|
|
// 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,
|
|
'clickableIcon' => null,
|
|
|
|
// Configuración especial
|
|
'phoneMode' => false, // "national", "international", "both"
|
|
|
|
// Diseño de disposición (columnas)
|
|
'inline' => false,
|
|
'labelCol' => 4,
|
|
'inputCol' => 8,
|
|
|
|
// Configuración de etiquetas flotantes y texto de ayuda
|
|
'floatLabel' => false,
|
|
'helperText' => '',
|
|
|
|
// Atributos adicionales
|
|
'attributes' => new \Illuminate\View\ComponentAttributeBag([]),
|
|
])
|
|
|
|
@php
|
|
// **Configuración de Name, ID y Model**
|
|
$livewireModel = $attributes->get('wire:model', $model);
|
|
$name = $attributes->get('name', $livewireModel);
|
|
$inputId = $attributes->get('id', $name . '_' . $uid);
|
|
$type = $attributes->get('type', 'text');
|
|
|
|
// **Definir formato de teléfono según `phoneMode`**
|
|
if ($phoneMode) {
|
|
$type = 'tel';
|
|
$attributes = $attributes->merge([
|
|
'autocomplete' => 'tel',
|
|
'inputmode' => 'tel',
|
|
]);
|
|
|
|
switch ($phoneMode) {
|
|
case 'national':
|
|
$attributes = $attributes->merge([
|
|
'pattern' => '^(?:\D*\d){10,}$',
|
|
'placeholder' => $placeholder !== false ? ($placeholder ?: 'Ej. (55) 1234-5678') : null,
|
|
]);
|
|
break;
|
|
|
|
case 'international':
|
|
$attributes = $attributes->merge([
|
|
'pattern' => '^\+?[1-9]\d{1,14}$',
|
|
'placeholder' => $placeholder !== false ? ($placeholder ?: 'Ej. +52 1 55 1234-5678') : null,
|
|
]);
|
|
break;
|
|
|
|
case 'both':
|
|
$attributes = $attributes->merge([
|
|
'pattern' => '(^(?:\D*\d){10,}$)|(^\+?[1-9]\d{1,14}$)',
|
|
'placeholder' => $placeholder !== false ? ($placeholder ?: 'Ej. (55) 1234-5678 o +52 1 55 1234-5678') : null,
|
|
]);
|
|
break;
|
|
}
|
|
}
|
|
|
|
// **Manejo del Placeholder si no lo estableció `phoneMode`**
|
|
if (!$attributes->has('placeholder')) {
|
|
if ($placeholder === false) {
|
|
// No agregar `placeholder`
|
|
$placeholderAttr = [];
|
|
} elseif (empty($placeholder)) {
|
|
// Generar automáticamente desde el `label`
|
|
$placeholderAttr = ['placeholder' => 'Ingrese ' . strtolower($label)];
|
|
} else {
|
|
// Usar `placeholder` definido manualmente
|
|
$placeholderAttr = ['placeholder' => $placeholder];
|
|
}
|
|
|
|
// Fusionar el placeholder si no fue definido en `phoneMode`
|
|
$attributes = $attributes->merge($placeholderAttr);
|
|
}
|
|
|
|
// **Manejo de errores**
|
|
$errorKey = $livewireModel ?: $name;
|
|
$hasError = $errors->has($errorKey);
|
|
$errorClass = $hasError ? 'is-invalid' : '';
|
|
|
|
// **Clases dinámicas**
|
|
$sizeClass = match ($size) {
|
|
'sm' => 'form-control-sm',
|
|
'lg' => 'form-control-lg',
|
|
default => '',
|
|
};
|
|
|
|
$alignClass = match ($align) {
|
|
'center' => 'text-center',
|
|
'end' => 'text-end',
|
|
default => '',
|
|
};
|
|
|
|
// **Fusionar atributos**
|
|
$inputAttributes = $attributes->merge([
|
|
'type' => $type,
|
|
'id' => $inputId,
|
|
'name' => $name,
|
|
])->class("form-control $sizeClass $alignClass $errorClass");
|
|
@endphp
|
|
|
|
{{-- Estructura del Input --}}
|
|
<div class="{{ $mb0 ? '' : 'mb-4' }} {{ $parentClass }}">
|
|
{{-- Etiqueta --}}
|
|
@if ($label)
|
|
<label for="{{ $inputId }}" class="form-label {{ $labelClass }}">{{ $label }}</label>
|
|
@endif
|
|
|
|
{{-- Input con Prefijos, Sufijos o Íconos --}}
|
|
@if ($prefix || $suffix || $icon || $clickableIcon)
|
|
<div class="input-group input-group-merge">
|
|
@isset($prefix)
|
|
<span class="input-group-text">{{ $prefix }}</span>
|
|
@endisset
|
|
|
|
@isset($icon)
|
|
<span class="input-group-text"><i class="{{ $icon }}"></i></span>
|
|
@endisset
|
|
|
|
<input {!! $inputAttributes !!} {{ $livewireModel ? "wire:model=$livewireModel" : '' }} />
|
|
|
|
@isset($suffix)
|
|
<span class="input-group-text">{{ $suffix }}</span>
|
|
@endisset
|
|
|
|
@isset($clickableIcon)
|
|
<button type="button" class="input-group-text cursor-pointer">
|
|
<i class="{{ $clickableIcon }}"></i>
|
|
</button>
|
|
@endisset
|
|
</div>
|
|
@else
|
|
{{-- Input Simple --}}
|
|
<input {!! $inputAttributes !!} {{ $livewireModel ? "wire:model=$livewireModel" : '' }} />
|
|
@endif
|
|
|
|
{{-- Texto de ayuda --}}
|
|
@if ($helperText)
|
|
<div class="form-text">{{ $helperText }}</div>
|
|
@endif
|
|
|
|
{{-- Mensajes de error --}}
|
|
@if ($hasError)
|
|
<span class="text-danger">{{ $errors->first($errorKey) }}</span>
|
|
@endif
|
|
</div>
|