Initial commit: Lash Vanshy - Complete project with admin panel, gallery, products, and contact

This commit is contained in:
2026-04-08 00:23:16 -06:00
commit e07e065791
111 changed files with 17939 additions and 0 deletions

View File

@@ -0,0 +1,125 @@
@extends('admin.layouts.master')
@section('title', 'Nuevo Usuario - Lash Vanshy')
@section('page-title', 'Nuevo Usuario')
@section('content')
<!-- Breadcrumb -->
<nav aria-label="breadcrumb" class="mb-4">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="{{ route('admin.dashboard') }}">Dashboard</a></li>
<li class="breadcrumb-item"><a href="{{ route('admin.users.index') }}">Usuarios</a></li>
<li class="breadcrumb-item active" aria-current="page">Nuevo Usuario</li>
</ol>
</nav>
<div class="row">
<div class="col-lg-8">
<div class="card-admin">
<div class="card-header">
<i class="fas fa-user-plus me-2"></i>Nuevo Usuario
</div>
<div class="card-body">
<form action="{{ route('admin.users.store') }}" method="POST">
@csrf
<div class="mb-3">
<label for="name" class="form-label">Nombre *</label>
<input type="text"
class="form-control @error('name') is-invalid @enderror"
id="name"
name="name"
value="{{ old('name') }}"
placeholder="Nombre completo"
required>
@error('name')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-3">
<label for="email" class="form-label">Email *</label>
<input type="email"
class="form-control @error('email') is-invalid @enderror"
id="email"
name="email"
value="{{ old('email') }}"
placeholder="email@ejemplo.com"
required>
@error('email')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-3">
<label for="password" class="form-label">Contraseña *</label>
<input type="password"
class="form-control @error('password') is-invalid @enderror"
id="password"
name="password"
placeholder="••••••••"
required>
<small class="text-muted">Mínimo 8 caracteres</small>
@error('password')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-3">
<label for="password_confirmation" class="form-label">Confirmar Contraseña *</label>
<input type="password"
class="form-control"
id="password_confirmation"
name="password_confirmation"
placeholder="••••••••"
required>
</div>
<div class="mb-3">
<label for="rol" class="form-label">Rol *</label>
<select class="form-select @error('rol') is-invalid @enderror"
id="rol"
name="rol"
required>
<option value="">Selecciona el rol</option>
<option value="admin" {{ old('rol') === 'admin' ? 'selected' : '' }}>Admin</option>
<option value="super_admin" {{ old('rol') === 'super_admin' ? 'selected' : '' }}>Super Admin</option>
</select>
<small class="text-muted">El Super Admin tiene acceso completo a todas las funciones</small>
@error('rol')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="d-flex justify-content-between mt-4">
<a href="{{ route('admin.users.index') }}" class="btn btn-secondary-admin">
<i class="fas fa-arrow-left me-2"></i>Cancelar
</a>
<button type="submit" class="btn btn-primary-admin">
<i class="fas fa-save me-2"></i>Crear Usuario
</button>
</div>
</form>
</div>
</div>
</div>
<div class="col-lg-4">
<div class="card-admin">
<div class="card-header">
<i class="fas fa-info-circle me-2"></i>Información
</div>
<div class="card-body">
<p class="text-muted">
Los usuarios administradores pueden acceder al panel de gestión del sitio web.
</p>
<ul class="text-muted">
<li class="mb-2"><strong>Admin:</strong> Puede gestionar galería, productos y mensajes</li>
<li class="mb-2"><strong>Super Admin:</strong> Acceso completo incluyendo gestión de usuarios</li>
</ul>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,126 @@
@extends('admin.layouts.master')
@section('title', 'Editar Usuario - Lash Vanshy')
@section('page-title', 'Editar Usuario')
@section('content')
<!-- Breadcrumb -->
<nav aria-label="breadcrumb" class="mb-4">
<ol class="breadcrumb">
<li class="breadcrumb-item"><a href="{{ route('admin.dashboard') }}">Dashboard</a></li>
<li class="breadcrumb-item"><a href="{{ route('admin.users.index') }}">Usuarios</a></li>
<li class="breadcrumb-item active" aria-current="page">Editar Usuario</li>
</ol>
</nav>
<div class="row">
<div class="col-lg-8">
<div class="card-admin">
<div class="card-header">
<i class="fas fa-user-edit me-2"></i>Editar Usuario
</div>
<div class="card-body">
<form action="{{ route('admin.users.update', $usuario) }}" method="POST">
@csrf
@method('PUT')
<div class="mb-3">
<label for="name" class="form-label">Nombre *</label>
<input type="text"
class="form-control @error('name') is-invalid @enderror"
id="name"
name="name"
value="{{ old('name', $usuario->name) }}"
placeholder="Nombre completo"
required>
@error('name')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-3">
<label for="email" class="form-label">Email *</label>
<input type="email"
class="form-control @error('email') is-invalid @enderror"
id="email"
name="email"
value="{{ old('email', $usuario->email) }}"
placeholder="email@ejemplo.com"
required>
@error('email')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-3">
<label for="password" class="form-label">Nueva Contraseña</label>
<input type="password"
class="form-control @error('password') is-invalid @enderror"
id="password"
name="password"
placeholder="••••••••">
<small class="text-muted">Deja vacío para mantener la contraseña actual. Mínimo 8 caracteres</small>
@error('password')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="mb-3">
<label for="password_confirmation" class="form-label">Confirmar Contraseña</label>
<input type="password"
class="form-control"
id="password_confirmation"
name="password_confirmation"
placeholder="••••••••">
</div>
<div class="mb-3">
<label for="rol" class="form-label">Rol *</label>
<select class="form-select @error('rol') is-invalid @enderror"
id="rol"
name="rol"
required
{{ $usuario->id === Auth::guard('admin')->user()->id ? 'disabled' : '' }}>
<option value="admin" {{ $usuario->rol === 'admin' ? 'selected' : '' }}>Admin</option>
<option value="super_admin" {{ $usuario->rol === 'super_admin' ? 'selected' : '' }}>Super Admin</option>
</select>
@if($usuario->id === Auth::guard('admin')->user()->id)
<small class="text-warning">No puedes cambiar tu propio rol</small>
@endif
@error('rol')
<div class="invalid-feedback">{{ $message }}</div>
@enderror
</div>
<div class="d-flex justify-content-between mt-4">
<a href="{{ route('admin.users.index') }}" class="btn btn-secondary-admin">
<i class="fas fa-arrow-left me-2"></i>Cancelar
</a>
<button type="submit" class="btn btn-primary-admin">
<i class="fas fa-save me-2"></i>Actualizar Usuario
</button>
</div>
</form>
</div>
</div>
</div>
<div class="col-lg-4">
<div class="card-admin">
<div class="card-header">
<i class="fas fa-info-circle me-2"></i>Información
</div>
<div class="card-body">
<p class="text-muted">
Los usuarios administradores pueden acceder al panel de gestión del sitio web.
</p>
<ul class="text-muted">
<li class="mb-2"><strong>Admin:</strong> Puede gestionar galería, productos y mensajes</li>
<li class="mb-2"><strong>Super Admin:</strong> Acceso completo incluyendo gestión de usuarios</li>
</ul>
</div>
</div>
</div>
</div>
@endsection

View File

@@ -0,0 +1,138 @@
@extends('admin.layouts.master')
@section('title', 'Usuarios Admin - Lash Vanshy')
@section('page-title', 'Gestión de Usuarios')
@section('content')
<!-- Header Actions -->
<div class="d-flex justify-content-between align-items-center mb-4">
<div>
<h2 class="mb-0">Usuarios Administradores</h2>
<p class="text-muted mb-0">Administra los usuarios del panel</p>
</div>
<a href="{{ route('admin.users.create') }}" class="btn btn-primary-admin">
<i class="fas fa-plus me-2"></i>Nuevo Usuario
</a>
</div>
<!-- Stats -->
<div class="row g-3 mb-4">
<div class="col-sm-4">
<div class="stat-card py-3">
<div class="stat-info">
<h3>{{ $usuarios->total() }}</h3>
<p>Total Usuarios</p>
</div>
</div>
</div>
<div class="col-sm-4">
<div class="stat-card py-3">
<div class="stat-info">
<h3>{{ $usuarios->where('rol', 'super_admin')->count() }}</h3>
<p>Super Admin</p>
</div>
</div>
</div>
<div class="col-sm-4">
<div class="stat-card py-3">
<div class="stat-info">
<h3>{{ $usuarios->where('rol', 'admin')->count() }}</h3>
<p>Admin</p>
</div>
</div>
</div>
</div>
<!-- Users Table -->
<div class="card-admin">
<div class="card-body">
@if($usuarios->isNotEmpty())
<div class="table-responsive">
<table class="table table-admin">
<thead>
<tr>
<th>Usuario</th>
<th>Email</th>
<th>Rol</th>
<th>Fecha Alta</th>
<th>Acciones</th>
</tr>
</thead>
<tbody>
@foreach($usuarios as $usuario)
<tr>
<td>
<div class="d-flex align-items-center gap-2">
<div class="user-avatar-sm">
{{ strtoupper(substr($usuario->name, 0, 1)) }}
</div>
<strong>{{ $usuario->name }}</strong>
</div>
</td>
<td>{{ $usuario->email }}</td>
<td>
<span class="badge-admin {{ $usuario->rol === 'super_admin' ? 'bg-danger' : 'bg-primary' }}">
{{ $usuario->rol === 'super_admin' ? 'Super Admin' : 'Admin' }}
</span>
</td>
<td>{{ $usuario->created_at->format('d/m/Y') }}</td>
<td>
<div class="actions">
<a href="{{ route('admin.users.edit', $usuario) }}"
class="btn btn-sm btn-primary-admin"
title="Editar">
<i class="fas fa-edit"></i>
</a>
@if($usuario->id !== Auth::guard('admin')->user()->id)
<form action="{{ route('admin.users.destroy', $usuario) }}"
method="POST"
class="d-inline"
onsubmit="return confirm('¿Estás seguro de que deseas eliminar este usuario?')">
@csrf
@method('DELETE')
<button type="submit" class="btn btn-sm btn-danger-admin" title="Eliminar">
<i class="fas fa-trash"></i>
</button>
</form>
@endif
</div>
</td>
</tr>
@endforeach
</tbody>
</table>
</div>
<!-- Pagination -->
<div class="d-flex justify-content-center">
{{ $usuarios->links() }}
</div>
@else
<div class="empty-state">
<i class="fas fa-users"></i>
<h4>No hay usuarios</h4>
<p>Comienza agregando tu primer usuario administrador</p>
<a href="{{ route('admin.users.create') }}" class="btn btn-primary-admin mt-3">
<i class="fas fa-plus me-2"></i>Agregar Usuario
</a>
</div>
@endif
</div>
</div>
<style>
.user-avatar-sm {
width: 35px;
height: 35px;
background: linear-gradient(135deg, var(--primary), var(--primary-dark));
border-radius: 50%;
display: flex;
align-items: center;
justify-content: center;
color: white;
font-weight: 600;
font-size: 0.8rem;
}
</style>
@endsection