nordabiz/templates/admin/benefits_clicks.html
Maciej Pienczyn 110d971dca
Some checks are pending
NordaBiz Tests / Unit & Integration Tests (push) Waiting to run
NordaBiz Tests / E2E Tests (Playwright) (push) Blocked by required conditions
NordaBiz Tests / Smoke Tests (Production) (push) Blocked by required conditions
NordaBiz Tests / Send Failure Notification (push) Blocked by required conditions
feat: migrate prod docs to OVH VPS + UTC→Warsaw timezone in all templates
Production moved from on-prem VM 249 (10.22.68.249) to OVH VPS
(57.128.200.27, inpi-vps-waw01). Updated ALL documentation, slash
commands, memory files, architecture docs, and deploy procedures.

Added |local_time Jinja filter (UTC→Europe/Warsaw) and converted
155 .strftime() calls across 71 templates so timestamps display
in Polish timezone regardless of server timezone.

Also includes: created_by_id tracking, abort import fix, ICS
calendar fix for missing end times, Pros Poland data cleanup.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-04-06 13:41:53 +02:00

122 lines
3.3 KiB
HTML

{% extends "base.html" %}
{% block title %}Kliknięcia: {{ benefit.name }} - Admin{% endblock %}
{% block extra_css %}
<style>
.admin-header {
margin-bottom: var(--spacing-xl);
}
.admin-header h1 {
font-size: var(--font-size-2xl);
color: var(--text-primary);
}
.section {
background: var(--surface);
padding: var(--spacing-xl);
border-radius: var(--radius-lg);
box-shadow: var(--shadow);
}
.clicks-table {
width: 100%;
border-collapse: collapse;
}
.clicks-table th,
.clicks-table td {
padding: var(--spacing-md);
text-align: left;
border-bottom: 1px solid var(--border);
}
.clicks-table th {
font-weight: 600;
color: var(--text-secondary);
font-size: var(--font-size-sm);
text-transform: uppercase;
background: var(--background);
}
.back-link {
display: inline-flex;
align-items: center;
gap: var(--spacing-xs);
color: var(--text-secondary);
margin-bottom: var(--spacing-lg);
text-decoration: none;
}
.back-link:hover {
color: var(--primary);
}
.back-link svg {
width: 16px;
height: 16px;
}
.empty-state {
text-align: center;
padding: var(--spacing-3xl);
color: var(--text-secondary);
}
</style>
{% endblock %}
{% block content %}
<div class="container">
<a href="{{ url_for('admin.admin_benefits') }}" class="back-link">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round">
<line x1="19" y1="12" x2="5" y2="12"></line>
<polyline points="12 19 5 12 12 5"></polyline>
</svg>
Powrót do listy
</a>
<div class="admin-header">
<h1>Kliknięcia: {{ benefit.name }}</h1>
<p>Łącznie: {{ benefit.click_count or 0 }} kliknięć</p>
</div>
<div class="section">
{% if clicks %}
<table class="clicks-table">
<thead>
<tr>
<th>Data</th>
<th>Użytkownik</th>
<th>IP</th>
<th>User Agent</th>
</tr>
</thead>
<tbody>
{% for click in clicks %}
<tr>
<td>{{ click.clicked_at|local_time('%Y-%m-%d %H:%M') }}</td>
<td>
{% if click.user %}
{{ click.user.email }}
{% else %}
<em>Anonimowy</em>
{% endif %}
</td>
<td>{{ click.ip_address or '-' }}</td>
<td style="max-width: 300px; overflow: hidden; text-overflow: ellipsis; white-space: nowrap;">
{{ click.user_agent[:100] if click.user_agent else '-' }}
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% else %}
<div class="empty-state">
<p>Brak kliknięć dla tej korzyści.</p>
</div>
{% endif %}
</div>
</div>
{% endblock %}