First Commit
This commit is contained in:
Executable
+64
@@ -0,0 +1,64 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('header', 'Editar Perfil')
|
||||
|
||||
@section('breadcrumbs')
|
||||
@php
|
||||
$breadcrumbs = [
|
||||
'Perfil' => route('profile.index'),
|
||||
'Editar' => null
|
||||
];
|
||||
@endphp
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 fw-bold text-primary">Editar Perfil</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<form method="POST" action="{{ route('profile.update') }}" enctype="multipart/form-data">
|
||||
@csrf
|
||||
@method('PUT')
|
||||
|
||||
<div class="text-center mb-4">
|
||||
@if($user->avatar)
|
||||
<img src="{{ asset('storage/' . $user->avatar) }}" alt="Avatar" class="rounded-circle" style="width: 120px; height: 120px; object-fit: cover;">
|
||||
@else
|
||||
<i class="bi bi-person-circle" style="font-size: 6rem; color: #5a5c69;"></i>
|
||||
@endif
|
||||
<div class="mt-2">
|
||||
<label for="avatar" class="btn btn-sm btn-outline-primary">
|
||||
<i class="bi bi-camera"></i> Alterar Avatar
|
||||
</label>
|
||||
<input type="file" id="avatar" name="avatar" class="d-none" accept="image/*">
|
||||
</div>
|
||||
@error('avatar')
|
||||
<div class="text-danger small mt-1">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="name" class="form-label">Nome</label>
|
||||
<input type="text" class="form-control" id="name" name="name" value="{{ old('name', $user->name) }}" required>
|
||||
@error('name')
|
||||
<div class="text-danger small">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="email" class="form-label">E-mail</label>
|
||||
<input type="email" class="form-control" id="email" name="email" value="{{ old('email', $user->email) }}" required>
|
||||
@error('email')
|
||||
<div class="text-danger small">{{ $message }}</div>
|
||||
@enderror
|
||||
</div>
|
||||
|
||||
<button type="submit" class="btn btn-primary"><i class="bi bi-check-circle me-2"></i>Salvar</button>
|
||||
<a href="{{ route('profile.index') }}" class="btn btn-secondary">Cancelar</a>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@include('profile.partials.update-password-form')
|
||||
@endsection
|
||||
Executable
+109
@@ -0,0 +1,109 @@
|
||||
@extends('layouts.app')
|
||||
|
||||
@section('header', 'Meu Perfil')
|
||||
|
||||
@section('breadcrumbs')
|
||||
@php
|
||||
$breadcrumbs = [
|
||||
'Perfil' => null
|
||||
];
|
||||
@endphp
|
||||
@endsection
|
||||
|
||||
@section('content')
|
||||
<div class="row">
|
||||
<div class="col-lg-4 mb-4">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 fw-bold text-primary">Informações Pessoais</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="text-center mb-3">
|
||||
@if($user->avatar)
|
||||
<img src="{{ asset('storage/' . $user->avatar) }}" alt="Avatar" class="rounded-circle" style="width: 120px; height: 120px; object-fit: cover;">
|
||||
@else
|
||||
<i class="bi bi-person-circle" style="font-size: 4rem; color: #5a5c69;"></i>
|
||||
@endif
|
||||
<h5 class="mt-2">{{ $user->name }}</h5>
|
||||
<p class="text-muted">{{ $user->email }}</p>
|
||||
@if($user->role === 'superadmin')
|
||||
<span class="badge bg-danger">SuperAdmin</span>
|
||||
@else
|
||||
<span class="badge bg-primary">Usuário</span>
|
||||
@endif
|
||||
@if($user->is_approved)
|
||||
<span class="badge bg-success ms-1">Aprovado</span>
|
||||
@else
|
||||
<span class="badge bg-warning text-dark ms-1">Pendente</span>
|
||||
@endif
|
||||
</div>
|
||||
<hr>
|
||||
<div class="d-grid">
|
||||
<a href="{{ route('profile.edit') }}" class="btn btn-warning">
|
||||
<i class="bi bi-pencil me-2"></i>Editar Perfil
|
||||
</a>
|
||||
</div>
|
||||
<hr>
|
||||
<p class="mb-1"><strong><i class="bi bi-calendar me-2"></i>Cadastro:</strong> {{ $user->created_at->format('d/m/Y H:i') }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="col-lg-8 mb-4">
|
||||
<div class="card shadow mb-4">
|
||||
<div class="card-header py-3">
|
||||
<h6 class="m-0 fw-bold text-primary">Estatísticas</h6>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row">
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="card border-left-primary shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col mr-2">
|
||||
<div class="text-xs fw-bold text-primary text-uppercase mb-1">Projetos</div>
|
||||
<div class="h5 mb-0 fw-bold text-gray-800">{{ $stats['projects'] }}</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-folder2-open fa-2x text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="card border-left-success shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col mr-2">
|
||||
<div class="text-xs fw-bold text-success text-uppercase mb-1">Gerações</div>
|
||||
<div class="h5 mb-0 fw-bold text-gray-800">{{ $stats['generations'] }}</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-clock-history fa-2x text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-4 mb-3">
|
||||
<div class="card border-left-warning shadow h-100 py-2">
|
||||
<div class="card-body">
|
||||
<div class="row no-gutters align-items-center">
|
||||
<div class="col mr-2">
|
||||
<div class="text-xs fw-bold text-warning text-uppercase mb-1">Tokens Usados</div>
|
||||
<div class="h5 mb-0 fw-bold text-gray-800">{{ number_format($stats['tokens'], 0, ',', '.') }}</div>
|
||||
</div>
|
||||
<div class="col-auto">
|
||||
<i class="bi bi-token fa-2x text-gray-300"></i>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@endsection
|
||||
@@ -0,0 +1,35 @@
|
||||
<section class="space-y-4">
|
||||
<header>
|
||||
<h2 class="h5 fw-bold text-gray-800 mb-1">Excluir Conta</h2>
|
||||
<p class="text-muted small">Depois que sua conta for excluída, todos os seus recursos e dados serão excluídos permanentemente. Antes de excluir sua conta, baixe todos os dados ou informações que deseja reter.</p>
|
||||
</header>
|
||||
|
||||
<button type="button" class="btn btn-danger" data-bs-toggle="modal" data-bs-target="#confirmUserDeletion">
|
||||
Excluir Conta
|
||||
</button>
|
||||
|
||||
<div class="modal fade" id="confirmUserDeletion" tabindex="-1" aria-hidden="true">
|
||||
<div class="modal-dialog">
|
||||
<div class="modal-content">
|
||||
<form method="post" action="{{ route('profile.destroy') }}" class="p-4">
|
||||
@csrf
|
||||
@method('delete')
|
||||
|
||||
<h2 class="h5 fw-bold mb-3">Tem certeza que deseja excluir sua conta?</h2>
|
||||
<p class="text-muted small mb-3">Depois que sua conta for excluída, todos os seus recursos e dados serão excluídos permanentemente. Insira sua senha para confirmar.</p>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="password" class="form-label sr-only">Senha</label>
|
||||
<input type="password" class="form-control" id="password" name="password" placeholder="Senha">
|
||||
@error('password') <div class="text-danger small">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="d-flex justify-content-end gap-2">
|
||||
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Cancelar</button>
|
||||
<button type="submit" class="btn btn-danger">Excluir Conta</button>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -0,0 +1,56 @@
|
||||
<section>
|
||||
<header>
|
||||
<h2 class="h5 fw-bold text-gray-800 mb-1">Atualizar Senha</h2>
|
||||
<p class="text-muted small">Garanta que sua conta esteja usando uma senha longa e aleatória para manter-se segura.</p>
|
||||
</header>
|
||||
|
||||
<form method="post" action="{{ route('password.update') }}" class="mt-4">
|
||||
@csrf
|
||||
@method('put')
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="update_password_password" class="form-label">Nova Senha</label>
|
||||
<div class="input-group">
|
||||
<input type="password" class="form-control" id="update_password_password" name="password" autocomplete="new-password">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="togglePasswordVisibility('update_password_password', this)">
|
||||
<i class="bi bi-eye"></i>
|
||||
</button>
|
||||
</div>
|
||||
@error('password') <div class="text-danger small">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="update_password_password_confirmation" class="form-label">Confirmar Senha</label>
|
||||
<div class="input-group">
|
||||
<input type="password" class="form-control" id="update_password_password_confirmation" name="password_confirmation" autocomplete="new-password">
|
||||
<button class="btn btn-outline-secondary" type="button" onclick="togglePasswordVisibility('update_password_password_confirmation', this)">
|
||||
<i class="bi bi-eye"></i>
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
<button type="submit" class="btn btn-primary">Salvar</button>
|
||||
|
||||
@if (session('status') === 'password-updated')
|
||||
<span class="small text-success">Senha atualizada.</span>
|
||||
@endif
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
|
||||
<script>
|
||||
function togglePasswordVisibility(inputId, button) {
|
||||
const input = document.getElementById(inputId);
|
||||
const icon = button.querySelector('i');
|
||||
if (input.type === 'password') {
|
||||
input.type = 'text';
|
||||
icon.classList.remove('bi-eye');
|
||||
icon.classList.add('bi-eye-slash');
|
||||
} else {
|
||||
input.type = 'password';
|
||||
icon.classList.remove('bi-eye-slash');
|
||||
icon.classList.add('bi-eye');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
@@ -0,0 +1,46 @@
|
||||
<section>
|
||||
<header>
|
||||
<h2 class="h5 fw-bold text-gray-800 mb-1">Informações do Perfil</h2>
|
||||
<p class="text-muted small">Atualize as informações da sua conta e endereço de e-mail.</p>
|
||||
</header>
|
||||
|
||||
<form id="send-verification" method="post" action="{{ route('verification.send') }}">
|
||||
@csrf
|
||||
</form>
|
||||
|
||||
<form method="post" action="{{ route('profile.update') }}" class="mt-4">
|
||||
@csrf
|
||||
@method('patch')
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="name" class="form-label">Nome</label>
|
||||
<input type="text" class="form-control" id="name" name="name" value="{{ old('name', $user->name) }}" required autofocus autocomplete="name">
|
||||
@error('name') <div class="text-danger small">{{ $message }}</div> @enderror
|
||||
</div>
|
||||
|
||||
<div class="mb-3">
|
||||
<label for="email" class="form-label">E-mail</label>
|
||||
<input type="email" class="form-control" id="email" name="email" value="{{ old('email', $user->email) }}" required autocomplete="username">
|
||||
@error('email') <div class="text-danger small">{{ $message }}</div> @enderror
|
||||
|
||||
@if ($user instanceof \Illuminate\Contracts\Auth\MustVerifyEmail && ! $user->hasVerifiedEmail())
|
||||
<div class="mt-2">
|
||||
<p class="small text-muted">Seu e-mail não está verificado.</p>
|
||||
<button form="send-verification" class="btn btn-link btn-sm p-0">Reenviar e-mail de verificação</button>
|
||||
|
||||
@if (session('status') === 'verification-link-sent')
|
||||
<p class="mt-2 small text-success">Um novo link de verificação foi enviado.</p>
|
||||
@endif
|
||||
</div>
|
||||
@endif
|
||||
</div>
|
||||
|
||||
<div class="d-flex align-items-center gap-3">
|
||||
<button type="submit" class="btn btn-primary">Salvar</button>
|
||||
|
||||
@if (session('status') === 'profile-updated')
|
||||
<span class="small text-success">Salvo com sucesso.</span>
|
||||
@endif
|
||||
</div>
|
||||
</form>
|
||||
</section>
|
||||
Reference in New Issue
Block a user