Modificaciones en catalogo y catalogo controller
This commit is contained in:
@@ -7,34 +7,30 @@ use Illuminate\Http\Request;
|
|||||||
|
|
||||||
class CatalogoController extends Controller
|
class CatalogoController extends Controller
|
||||||
{
|
{
|
||||||
|
|
||||||
public function catalogo()
|
|
||||||
{
|
|
||||||
$products = Product::all();
|
|
||||||
return view('catalogo', compact('products'));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Muestra los registros de ventas con buscador y paginación.
|
* Muestra los registros de ventas con buscador y paginación.
|
||||||
*/
|
*/
|
||||||
public function index(Request $request)
|
public function catalogo(Request $request)
|
||||||
{
|
{
|
||||||
// Recuperamos lo que el usuario escribió en el buscador (si escribió algo)
|
// Consulta base
|
||||||
$query = $request->input('search');
|
$query = Product::query();
|
||||||
// Recuperamos el filtro aplicado (si aplica)
|
|
||||||
$filter = $request->input('filter');
|
|
||||||
|
|
||||||
// Construimos la consulta
|
// Lógica del Buscador: Si recibimos algo en el input "search"
|
||||||
$sales = Product::query()
|
if ($request->has('search')) {
|
||||||
->when($query, function ($q) use ($query) {
|
$searchTerm = $request->input('search');
|
||||||
// Si hay búsqueda, filtra por nombre o SKU
|
|
||||||
return $q->where('name', 'like', "%{$query}%")
|
|
||||||
->orWhere('sku', 'like', "%{$query}%");
|
|
||||||
})
|
|
||||||
->orderBy('stock_quantity', 'asc') // Ordenamos primero los que tienen poco stock (Alerta visual)
|
|
||||||
->paginate(10) // Paginamos de a 10
|
|
||||||
->withQueryString(); // Mantiene el filtro de búsqueda al cambiar de página
|
|
||||||
|
|
||||||
return view('sales', compact('sales'));
|
$query->where(function($q) use ($searchTerm) {
|
||||||
|
$q->where('name', 'like', "%{$searchTerm}%") // Buscar por nombre
|
||||||
|
->orWhere('sku', 'like', "%{$searchTerm}%"); // O por código SKU
|
||||||
|
});
|
||||||
|
}
|
||||||
|
$query->whereIn('type', ['bike', 'accessory']);// Filtros para el público
|
||||||
|
$query->where('stock_quantity', '>', 0); // Solo mostrar si tiene stock
|
||||||
|
|
||||||
|
// Resultados paginados
|
||||||
|
$products = $query->paginate(12)->withQueryString(); // withQueryString mantiene la búsqueda al cambiar de página
|
||||||
|
|
||||||
|
// Devuelve la vista
|
||||||
|
return view('catalogo', compact('products'));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -47,4 +47,9 @@
|
|||||||
<p class="text-center text-gray-600 mt-10">No hay productos disponibles.</p>
|
<p class="text-center text-gray-600 mt-10">No hay productos disponibles.</p>
|
||||||
@endif
|
@endif
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- Paginación -->
|
||||||
|
<div class="w-full flex justify-center">
|
||||||
|
{{ $products->links() }}
|
||||||
|
</div>
|
||||||
</x-layout>
|
</x-layout>
|
||||||
|
|||||||
@@ -21,31 +21,68 @@
|
|||||||
|
|
||||||
<!-- Links -->
|
<!-- Links -->
|
||||||
<div class="hidden w-full md:block md:w-auto" id="navbar-default">
|
<div class="hidden w-full md:block md:w-auto" id="navbar-default">
|
||||||
<ul class="font-bold flex flex-col p-4 md:p-0 mt-4 border border-neutral-700 rounded-lg bg-neutral-800 md:flex-row md:space-x-8 rtl:space-x-reverse md:mt-0 md:border-0 md:bg-transparent">
|
<ul class="font-bold flex flex-col items-center p-4 md:p-0 mt-4 border border-neutral-700 rounded-lg bg-neutral-800 md:flex-row md:space-x-8 rtl:space-x-reverse md:mt-0 md:border-0 md:bg-transparent">
|
||||||
<!-- Link activo dinámico -->
|
|
||||||
<li>
|
@auth
|
||||||
<a href="{{ url('/dashboard') }}"
|
<li>
|
||||||
class="block py-2 px-3 md:p-0 transition-colors {{ request()->is('dashboard') ? 'text-neon-lime border-b-2 border-neon-lime' : 'text-white hover:text-neon-lime' }}">
|
<a href="{{ url('/dashboard') }}"
|
||||||
Dashboard
|
class="block py-2 px-3 md:p-0 transition-colors {{ request()->is('dashboard') ? 'text-neon-lime border-b-2 border-neon-lime' : 'text-white hover:text-neon-lime' }}">
|
||||||
</a>
|
Dashboard
|
||||||
</li>
|
</a>
|
||||||
<li>
|
</li>
|
||||||
<a href="{{ url('/productos') }}"
|
<li>
|
||||||
class="block py-2 px-3 md:p-0 transition-colors {{ request()->is('productos*') ? 'text-neon-lime border-b-2 border-neon-lime' : 'text-white hover:text-neon-lime' }}">
|
<a href="{{ url('/productos') }}"
|
||||||
Stock
|
class="block py-2 px-3 md:p-0 transition-colors {{ request()->is('productos*') ? 'text-neon-lime border-b-2 border-neon-lime' : 'text-white hover:text-neon-lime' }}">
|
||||||
</a>
|
Stock
|
||||||
</li>
|
</a>
|
||||||
<li>
|
</li>
|
||||||
<a href="#"
|
<li>
|
||||||
class="block py-2 px-3 md:p-0 transition-colors {{ request()->is('mantenimiento*') ? 'text-neon-lime border-b-2 border-neon-lime' : 'text-white hover:text-neon-lime' }}">
|
<a href="#"
|
||||||
Taller
|
class="block py-2 px-3 md:p-0 transition-colors {{ request()->is('mantenimiento*') ? 'text-neon-lime border-b-2 border-neon-lime' : 'text-white hover:text-neon-lime' }}">
|
||||||
</a>
|
Taller
|
||||||
</li>
|
</a>
|
||||||
<li>
|
</li>
|
||||||
<a href="{{ route('sales.create') }}"
|
<li>
|
||||||
class="block py-2 px-3 md:p-0 transition-colors {{ request()->is('sales*') ? 'text-neon-lime border-b-2 border-neon-lime' : 'text-white hover:text-neon-lime' }}">
|
<a href="{{ route('sales.create') }}"
|
||||||
Ventas
|
class="block py-2 px-3 md:p-0 transition-colors {{ request()->is('sales*') ? 'text-neon-lime border-b-2 border-neon-lime' : 'text-white hover:text-neon-lime' }}">
|
||||||
</a>
|
Ventas
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
@endauth
|
||||||
|
|
||||||
|
{{-- LÓGICA DE VISITANTE (GUEST) --}}
|
||||||
|
@guest
|
||||||
|
<li>
|
||||||
|
<a href="{{ url('/catalogo') }}"
|
||||||
|
class="block py-2 px-3 md:p-0 transition-colors {{ request()->is('catalogo*') ? 'text-neon-lime border-b-2 border-neon-lime' : 'text-white hover:text-neon-lime' }}">
|
||||||
|
Catalogo
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<!-- Buscador Integrado -->
|
||||||
|
<li class="w-full md:w-auto my-2 md:my-0">
|
||||||
|
<form action="{{ route('catalogo') }}" method="GET">
|
||||||
|
<div class="relative">
|
||||||
|
<input type="text" name="search"
|
||||||
|
class="block w-full md:w-48 p-2 ps-3 text-xs text-white border border-neutral-600 rounded-full bg-neutral-800/50 focus:ring-neon-lime focus:border-neon-lime placeholder-gray-500 transition-all focus:w-full md:focus:w-64"
|
||||||
|
placeholder="Buscar productos...">
|
||||||
|
<button type="submit" class="absolute top-0 end-0 p-2 text-sm font-medium h-full text-white rounded-e-lg hover:text-neon-lime">
|
||||||
|
<svg class="w-4 h-4" aria-hidden="true" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 20 20">
|
||||||
|
<path stroke="currentColor" stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="m19 19-4-4m0-7A7 7 0 1 1 1 8a7 7 0 0 1 14 0Z"/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
</li>
|
||||||
|
|
||||||
|
<!-- Botón Login Resaltado -->
|
||||||
|
<li>
|
||||||
|
<a href="{{ route('login') }}"
|
||||||
|
class="block py-2 px-5 text-center text-neutral-900 bg-neon-lime font-black rounded hover:bg-[#b3e600] transition-colors uppercase tracking-wider text-xs shadow-lg shadow-neon-lime/20 hover:shadow-neon-lime/40 transform hover:-translate-y-0.5 duration-200">
|
||||||
|
Ingresar
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
@endguest
|
||||||
</ul>
|
</ul>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -1,4 +1,2 @@
|
|||||||
<x-appc>
|
<x-layout title="Home - Lauck">
|
||||||
<x-slot name="title">Lauck - Inicio</x-slot>
|
</x-layout>
|
||||||
<x-slot name="navTitle">Bienvenido</x-slot>
|
|
||||||
</x-appc>
|
|
||||||
|
|||||||
Reference in New Issue
Block a user