Files
proxmox_manager/templates/profile.html
2026-02-17 12:43:27 +01:00

233 lines
7.6 KiB
HTML

{% extends "base.html" %}
{% block title %}Profilo - Proxmox Manager{% endblock %}
{% block extra_styles %}
<style>
.profile-grid {
display: grid;
grid-template-columns: 1fr 1fr;
gap: var(--space-xl);
}
@media (max-width: 768px) {
.profile-grid {
grid-template-columns: 1fr;
}
}
.profile-info {
background: var(--bg-tertiary);
padding: var(--space-lg);
border-radius: var(--radius-md);
border-left: 4px solid var(--accent-blue);
}
.profile-info-item {
margin-bottom: var(--space-md);
}
.profile-info-item:last-child {
margin-bottom: 0;
}
.profile-info-label {
font-weight: 600;
color: var(--text-secondary);
font-size: 0.85rem;
margin-bottom: var(--space-xs);
}
.profile-info-value {
color: var(--text-primary);
font-size: 1rem;
}
.form-section {
margin-bottom: var(--space-lg);
}
.form-section h3 {
color: var(--text-primary);
margin-bottom: var(--space-md);
padding-bottom: var(--space-sm);
border-bottom: 1px solid var(--border-muted);
font-size: 1rem;
display: flex;
align-items: center;
gap: var(--space-sm);
}
</style>
{% endblock %}
{% block content %}
<div class="dashboard-header">
<div>
<h1>Il Mio Profilo</h1>
<p class="subtitle">Gestisci le tue informazioni personali</p>
</div>
</div>
<div class="profile-grid">
<!-- Info Profilo -->
<div class="card">
<div class="card-title">Informazioni Account</div>
<div class="profile-info">
<div class="profile-info-item">
<div class="profile-info-label">Username</div>
<div class="profile-info-value">{{ current_user.username }}</div>
</div>
<div class="profile-info-item">
<div class="profile-info-label">Email</div>
<div class="profile-info-value" id="currentEmail">{{ current_user.email or 'Non impostata' }}</div>
</div>
<div class="profile-info-item">
<div class="profile-info-label">Ruolo</div>
<div class="profile-info-value">
{% if current_user.is_admin %}
<span class="badge-admin">ADMIN</span>
{% else %}
<span class="status-badge" style="background: var(--bg-active); color: var(--accent-blue); border: 1px solid var(--accent-blue);">UTENTE</span>
{% endif %}
</div>
</div>
<div class="profile-info-item">
<div class="profile-info-label">ID Utente</div>
<div class="profile-info-value">#{{ current_user.id }}</div>
</div>
</div>
</div>
<!-- Form Modifica -->
<div>
<!-- Cambio Email -->
<div class="card form-section">
<h3>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<path d="M4 4h16c1.1 0 2 .9 2 2v12c0 1.1-.9 2-2 2H4c-1.1 0-2-.9-2-2V6c0-1.1.9-2 2-2z"/>
<polyline points="22,6 12,13 2,6"/>
</svg>
Modifica Email
</h3>
<form id="emailForm" onsubmit="updateEmail(event)">
<div class="form-group">
<label for="newEmail">Nuova Email</label>
<input type="email" id="newEmail" placeholder="nuova@email.com" required>
</div>
<div class="form-group">
<label for="emailPassword">Password Corrente</label>
<input type="password" id="emailPassword" placeholder="Inserisci password" required>
</div>
<button type="submit" class="btn btn-primary">Aggiorna Email</button>
</form>
</div>
<!-- Cambio Password -->
<div class="card form-section">
<h3>
<svg width="18" height="18" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2">
<rect x="3" y="11" width="18" height="11" rx="2" ry="2"/>
<path d="M7 11V7a5 5 0 0 1 10 0v4"/>
</svg>
Modifica Password
</h3>
<form id="passwordForm" onsubmit="updatePassword(event)">
<div class="form-group">
<label for="currentPassword">Password Corrente</label>
<input type="password" id="currentPassword" placeholder="Password attuale" required>
</div>
<div class="form-group">
<label for="newPassword">Nuova Password</label>
<input type="password" id="newPassword" placeholder="Nuova password" required minlength="6">
<small class="text-muted" style="font-size: 0.8rem; margin-top: var(--space-xs); display: block;">Minimo 6 caratteri</small>
</div>
<div class="form-group">
<label for="confirmPassword">Conferma Nuova Password</label>
<input type="password" id="confirmPassword" placeholder="Ripeti nuova password" required minlength="6">
</div>
<button type="submit" class="btn btn-primary">Aggiorna Password</button>
</form>
</div>
</div>
</div>
<!-- Statistiche Attività -->
<div class="card">
<div class="card-title">Attività Recente</div>
<div id="userActivity">
<div class="loading">
<div class="spinner"></div>
<p>Caricamento attività...</p>
</div>
</div>
</div>
{% endblock %}
{% block extra_scripts %}
<script>
document.addEventListener('DOMContentLoaded', function() {
loadUserActivity();
});
async function updateEmail(event) {
event.preventDefault();
const newEmail = document.getElementById('newEmail').value;
const password = document.getElementById('emailPassword').value;
const result = await apiCall('/api/profile/update-email', 'POST', {
email: newEmail,
password: password
});
if (result.status === 'success') {
showToast('Email aggiornata con successo!', 'success');
document.getElementById('currentEmail').textContent = newEmail;
document.getElementById('emailForm').reset();
} else {
showAlert('Errore: ' + result.message, 'error');
}
}
async function updatePassword(event) {
event.preventDefault();
const currentPassword = document.getElementById('currentPassword').value;
const newPassword = document.getElementById('newPassword').value;
const confirmPassword = document.getElementById('confirmPassword').value;
if (newPassword !== confirmPassword) {
showAlert('Le password non corrispondono', 'error');
return;
}
const result = await apiCall('/api/profile/update-password', 'POST', {
current_password: currentPassword,
new_password: newPassword,
confirm_password: confirmPassword
});
if (result.status === 'success') {
showToast('Password aggiornata con successo!', 'success');
document.getElementById('passwordForm').reset();
} else {
showAlert('Errore: ' + result.message, 'error');
}
}
async function loadUserActivity() {
const container = document.getElementById('userActivity');
container.innerHTML = `
<p class="text-muted text-center" style="padding: var(--space-xl);">
Le statistiche attività saranno disponibili a breve
</p>
`;
}
</script>
{% endblock %}