feat: Polish labels, RSVP button on calendar list view
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

- Month names: sty, lut, mar... instead of Jan, Feb, Mar
- Event types: Spotkanie, Networking, Webinar, Inne
- RSVP "Wezmę udział" button directly on event list cards
- Grid legend labels also in Polish

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Maciej Pienczyn 2026-03-12 10:50:58 +01:00
parent 8c187ea0b3
commit 3f524b3a14

View File

@ -321,6 +321,8 @@
.badge-type.networking { background: #fef3c7; color: #92400e; }
.badge-type.other { background: #f3e8ff; color: #7c3aed; }
.rsvp-list-btn { min-width: 110px; }
/* Responsywność */
@media (max-width: 768px) {
.calendar-toolbar {
@ -350,6 +352,9 @@
</style>
{% endblock %}
{% set pl_months = {'Jan':'sty','Feb':'lut','Mar':'mar','Apr':'kwi','May':'maj','Jun':'cze','Jul':'lip','Aug':'sie','Sep':'wrz','Oct':'paź','Nov':'lis','Dec':'gru'} %}
{% set pl_types = {'meeting':'Spotkanie','networking':'Networking','webinar':'Webinar','other':'Inne','conference':'Konferencja','workshop':'Warsztaty'} %}
{% block content %}
<div class="calendar-header">
<h1>Kalendarz wydarzeń</h1>
@ -420,10 +425,10 @@
<!-- Legenda typów wydarzeń -->
<div style="margin-top: var(--spacing-lg); display: flex; gap: var(--spacing-lg); flex-wrap: wrap; font-size: var(--font-size-sm); color: var(--text-secondary);">
<span><span class="badge-type meeting">meeting</span> Rada/Spotkanie</span>
<span><span class="badge-type networking">networking</span> Networking</span>
<span><span class="badge-type webinar">webinar</span> Webinar</span>
<span><span class="badge-type other">other</span> Inne</span>
<span><span class="badge-type meeting">Spotkanie</span></span>
<span><span class="badge-type networking">Networking</span></span>
<span><span class="badge-type webinar">Webinar</span></span>
<span><span class="badge-type other">Inne</span></span>
</div>
{% else %}
@ -438,14 +443,14 @@
<div class="event-card {% if event.is_featured %}featured{% endif %}">
<div class="event-date-box">
<div class="day">{{ event.event_date.day }}</div>
<div class="month">{{ event.event_date.strftime('%b') }}</div>
<div class="month">{{ pl_months.get(event.event_date.strftime('%b'), event.event_date.strftime('%b')) }}</div>
</div>
<div class="event-info">
<div class="event-title">
<a href="{{ url_for('calendar.calendar_event', event_id=event.id) }}">{{ event.title }}</a>{% if event.access_level == 'admin_only' %} <span style="display:inline-block;background:#ef4444;color:#fff;font-size:10px;padding:1px 5px;border-radius:3px;font-weight:600;vertical-align:middle;">UKRYTE</span>{% elif event.access_level == 'rada_only' %} <span style="display:inline-block;background:#f59e0b;color:#92400e;font-size:10px;padding:1px 5px;border-radius:3px;font-weight:600;vertical-align:middle;">IZBA</span>{% endif %}
</div>
<div class="event-meta">
<span class="badge-type {{ event.event_type }}">{{ event.event_type }}</span>
<span class="badge-type {{ event.event_type }}">{{ pl_types.get(event.event_type, event.event_type) }}</span>
{% if event.time_start %}
<span>{{ event.time_start.strftime('%H:%M') }}{% if event.time_end %} - {{ event.time_end.strftime('%H:%M') }}{% endif %}</span>
{% endif %}
@ -462,7 +467,12 @@
</div>
<div class="event-actions">
<span class="attendee-count">{{ event.attendee_count }} uczestników</span>
<a href="{{ url_for('calendar.calendar_event', event_id=event.id) }}" class="btn btn-primary btn-sm">Szczegoly</a>
{% if event.can_user_attend(current_user) %}
<button class="btn btn-primary btn-sm rsvp-list-btn" data-event-id="{{ event.id }}" data-attending="{{ 'true' if event.attendees|selectattr('user_id','equalto',current_user.id)|list else 'false' }}" onclick="toggleListRSVP(this)">
{% if event.attendees|selectattr('user_id','equalto',current_user.id)|list %}Zapisano{% else %}Wezmę udział{% endif %}
</button>
{% endif %}
<a href="{{ url_for('calendar.calendar_event', event_id=event.id) }}" class="btn btn-outline btn-sm">Szczegóły</a>
</div>
</div>
{% endfor %}
@ -482,14 +492,14 @@
<div class="event-card past">
<div class="event-date-box" style="background: var(--secondary);">
<div class="day">{{ event.event_date.day }}</div>
<div class="month">{{ event.event_date.strftime('%b') }}</div>
<div class="month">{{ pl_months.get(event.event_date.strftime('%b'), event.event_date.strftime('%b')) }}</div>
</div>
<div class="event-info">
<div class="event-title">
<a href="{{ url_for('calendar.calendar_event', event_id=event.id) }}">{{ event.title }}</a>
</div>
<div class="event-meta">
<span class="badge-type {{ event.event_type }}">{{ event.event_type }}</span>
<span class="badge-type {{ event.event_type }}">{{ pl_types.get(event.event_type, event.event_type) }}</span>
{% if event.location %}
<span>{{ event.location }}</span>
{% endif %}
@ -505,3 +515,32 @@
{% endif %}
{% endblock %}
{% block extra_js %}
var csrfToken = '{{ csrf_token() }}';
async function toggleListRSVP(btn) {
var eventId = btn.dataset.eventId;
btn.disabled = true;
try {
var resp = await fetch('/kalendarz/' + eventId + '/rsvp', {
method: 'POST',
headers: {'Content-Type': 'application/json', 'X-CSRFToken': csrfToken}
});
var data = await resp.json();
if (data.success) {
if (data.action === 'added') {
btn.textContent = 'Zapisano';
btn.classList.remove('btn-primary');
btn.classList.add('btn-secondary');
} else {
btn.textContent = 'Wezmę udział';
btn.classList.remove('btn-secondary');
btn.classList.add('btn-primary');
}
var countEl = btn.parentElement.querySelector('.attendee-count');
if (countEl) countEl.textContent = data.attendee_count + ' uczestników';
}
} catch(e) {}
btn.disabled = false;
}
{% endblock %}