Fase 3 (isla): historial de baneos en React/TSX

ban_history_view construye ban_rows (baneos de cuenta + personaje combinados, con
estado Activo/Inactivo y origen Cuenta/Personaje) y los pasa por json_script a la
tabla genérica HistoryTable. Sustituye la tabla Django con doble bucle.

Verificado: check OK, render de la isla con datos, redirige a login sin sesión.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-07-12 21:54:12 +00:00
parent 230d401c75
commit ff458379b0
2 changed files with 21 additions and 67 deletions
+7 -66
View File
@@ -25,71 +25,12 @@
<h2>Historial de baneos</h2>
</div>
<div class="body-box-content info-box-light">
<table class="max-center-table" style="width: 100%; border-collapse: collapse;">
<thead>
<tr>
<th style="text-align: left; padding: 10px; border: 1px solid #ddd;">Fecha de Baneo</th>
<th style="text-align: left; padding: 10px; border: 1px solid #ddd;">Fecha de Desbaneo</th>
<th style="text-align: left; padding: 10px; border: 1px solid #ddd;">Motivo</th>
<th style="text-align: left; padding: 10px; border: 1px solid #ddd;">Estado</th>
<th style="text-align: left; padding: 10px; border: 1px solid #ddd;">
{% if account_bans and character_bans %}
Cuenta / Personaje
{% elif account_bans %}
Cuenta
{% elif character_bans %}
Personaje
{% else %}
Fuente
{% endif %}
</th>
</tr>
</thead>
<tbody>
{% if account_bans %}
{% for ban in account_bans %}
<tr>
<td style="padding: 10px; border: 1px solid #ddd;">{{ ban.0|default:"No disponible" }}</td>
<td style="padding: 10px; border: 1px solid #ddd;">{{ ban.1|default:"No disponible" }}</td>
<td style="padding: 10px; border: 1px solid #ddd;">{{ ban.2 }}</td>
<td style="padding: 10px; border: 1px solid #ddd;">
{% if ban.3 == 1 %}
<span class="red-info2">Activo<span>
{% else %}
<span class="green-info2">Inactivo</span>
{% endif %}
</td>
<td style="padding: 10px; border: 1px solid #ddd;">Cuenta: {{ ban.4 }}</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan="5" style="text-align: center; padding: 10px; border: 1px solid #ddd;">No hay baneos en la cuenta.</td>
</tr>
{% endif %}
{% if character_bans %}
{% for ban in character_bans %}
<tr>
<td style="padding: 10px; border: 1px solid #ddd;">{{ ban.0|default:"No disponible" }}</td>
<td style="padding: 10px; border: 1px solid #ddd;">{{ ban.1|default:"No disponible" }}</td>
<td style="padding: 10px; border: 1px solid #ddd;">{{ ban.2 }}</td>
<td style="padding: 10px; border: 1px solid #ddd;">
{% if ban.3 == 1 %}
Activo
{% else %}
<span class="green-info2">Inactivo</span>
{% endif %}
</td>
<td style="padding: 10px; border: 1px solid #ddd;">Personaje: {{ ban.4 }}</td>
</tr>
{% endfor %}
{% else %}
<tr>
<td colspan="5" style="text-align: center; padding: 10px; border: 1px solid #ddd;">No hay baneos en los personajes.</td>
</tr>
{% endif %}
</tbody>
</table>
{% load django_vite %}
<!-- Isla React (Vite): tabla de baneos (cuenta + personajes). -->
<div id="history-table-app"
data-columns='[{"key":"fecha_baneo","label":"Fecha de Baneo"},{"key":"fecha_desbaneo","label":"Fecha de Desbaneo"},{"key":"motivo","label":"Motivo"},{"key":"estado","label":"Estado"},{"key":"origen","label":"Cuenta / Personaje"}]'
data-empty-text="No hay baneos en la cuenta ni en los personajes."></div>
{{ ban_rows|json_script:"history-table-data" }}
{% vite_asset 'src/entries/history_table.tsx' %}
</div>
</div>
+14 -1
View File
@@ -55,10 +55,23 @@ def ban_history_view(request):
account_bans, character_bans = get_ban_history(account_id)
def _row(b, origen):
return {
'fecha_baneo': b[0] or 'No disponible',
'fecha_desbaneo': b[1] or 'No disponible',
'motivo': b[2],
'estado': 'Activo' if b[3] == 1 else 'Inactivo',
'origen': f'{origen}: {b[4]}',
}
ban_rows = ([_row(b, 'Cuenta') for b in account_bans]
+ [_row(b, 'Personaje') for b in character_bans])
return render(request, 'account/ban_history.html', {
'account_bans': account_bans,
'character_bans': character_bans,
'now': datetime.now(),
'ban_rows': ban_rows,
'now': datetime.now(),
})
def security_history_view(request):
username = request.session.get('username')