Initial commit: Lash Vanshy - Complete project with admin panel, gallery, products, and contact
This commit is contained in:
125
resources/views/admin/usuarios/create.blade.php
Executable file
125
resources/views/admin/usuarios/create.blade.php
Executable 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
|
||||
126
resources/views/admin/usuarios/edit.blade.php
Executable file
126
resources/views/admin/usuarios/edit.blade.php
Executable 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
|
||||
138
resources/views/admin/usuarios/index.blade.php
Executable file
138
resources/views/admin/usuarios/index.blade.php
Executable 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
|
||||
Reference in New Issue
Block a user