Files
2026-05-10 18:07:51 +02:00

91 lines
4.0 KiB
HTML

{{define "title"}}Sessions{{end}}
{{define "header"}}Sessions actives{{end}}
{{define "content"}}
<div class="flex items-center justify-between mb-6">
<p class="text-gray-400 text-sm">{{len .Sessions}} session{{if gt (len .Sessions) 1}}s{{end}} active{{if gt (len .Sessions) 1}}s{{end}}</p>
<button onclick="document.getElementById('revokeAllModal').classList.remove('hidden')"
class="px-4 py-2 bg-red-700 hover:bg-red-600 text-white text-sm font-medium rounded-lg transition-colors">
Révoquer toutes les autres
</button>
</div>
<div class="bg-discord-card rounded-lg border border-discord-border overflow-hidden">
{{if .Sessions}}
<div class="overflow-x-auto">
<table class="w-full text-sm">
<thead>
<tr class="text-xs text-gray-400 uppercase border-b border-discord-border">
<th class="px-4 py-2 text-left">Admin</th>
<th class="px-4 py-2 text-left">IP</th>
<th class="px-4 py-2 text-left">User Agent</th>
<th class="px-4 py-2 text-left">Dernière activité</th>
<th class="px-4 py-2 text-left">Créée le</th>
<th class="px-4 py-2 text-right">Action</th>
</tr>
</thead>
<tbody class="divide-y divide-discord-border">
{{range .Sessions}}
<tr class="hover:bg-white/5 transition-colors {{if .IsCurrent}}bg-indigo-900/20{{end}}">
<td class="px-4 py-2 text-white">
{{.DiscordUsername}}
{{if .IsCurrent}}<span class="ml-1 text-xs text-indigo-400">(vous)</span>{{end}}
</td>
<td class="px-4 py-2 text-gray-400 font-mono text-xs">{{.IPAddress}}</td>
<td class="px-4 py-2 text-gray-500 text-xs max-w-[200px] truncate" title="{{.UserAgent}}">{{.UserAgent}}</td>
<td class="px-4 py-2 text-gray-400 text-xs whitespace-nowrap">{{.LastActivity.Format "02/01/2006 15:04:05"}}</td>
<td class="px-4 py-2 text-gray-400 text-xs whitespace-nowrap">{{.CreatedAt.Format "02/01/2006 15:04:05"}}</td>
<td class="px-4 py-2 text-right">
{{if not .IsCurrent}}
<form method="POST" action="/sessions/{{.ID}}/revoke">
<input type="hidden" name="csrf_token" value="{{$.CSRFToken}}">
<button type="submit"
class="px-3 py-1 text-xs text-red-400 hover:text-red-300 border border-red-900/50 hover:border-red-700 rounded transition-colors">
Révoquer
</button>
</form>
{{else}}
<span class="text-xs text-gray-600">Session courante</span>
{{end}}
</td>
</tr>
{{end}}
</tbody>
</table>
</div>
{{else}}
<div class="px-5 py-12 text-center text-gray-500 text-sm">
Aucune session active.
</div>
{{end}}
</div>
<!-- Revoke All Modal -->
<div id="revokeAllModal" class="hidden fixed inset-0 bg-black/60 flex items-center justify-center z-50">
<div class="bg-discord-card border border-discord-border rounded-xl p-6 w-full max-w-sm mx-4">
<h3 class="text-white font-semibold mb-2">Révoquer toutes les autres sessions</h3>
<p class="text-gray-400 text-sm mb-6">
Cette action déconnectera toutes les sessions actives sauf la vôtre. Cette action est irréversible.
</p>
<div class="flex gap-3 justify-end">
<button onclick="document.getElementById('revokeAllModal').classList.add('hidden')"
class="px-4 py-2 text-sm text-gray-400 hover:text-white border border-gray-700 rounded-lg transition-colors">
Annuler
</button>
<form method="POST" action="/sessions/revoke-all">
<input type="hidden" name="csrf_token" value="{{.CSRFToken}}">
<button type="submit" class="px-4 py-2 text-sm bg-red-600 hover:bg-red-500 text-white rounded-lg transition-colors">
Révoquer tout
</button>
</form>
</div>
</div>
</div>
<script>
document.getElementById('revokeAllModal').addEventListener('click', function(e) {
if (e.target === this) this.classList.add('hidden');
});
</script>
{{end}}