{% extends "base.html" %} {% block title %}Kalendarz - Norda Biznes Partner{% endblock %} {% block extra_css %} {% 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 %}

Kalendarz wydarzeń

Spotkania i wydarzenia Norda Biznes

Karty Lista Kalendarz
{% if view_mode == 'grid' %}
← Poprzedni {{ month_name }} {{ year }} Następny →
{% endif %} {% if current_user.can_access_admin_panel() %} Zarządzaj {% endif %}
{% if view_mode == 'grid' %}
Pon
Wt
Sr
Czw
Pt
Sob
Nd
{% for week in month_days %}
{% for day in week %} {% set is_weekend = loop.index > 5 %} {% set day_events = events_by_day.get(day, []) if day != 0 else [] %}
{% if day != 0 %}
{{ day }}
{% if day_events %}
{% for event in day_events %} {% endfor %}
{% endif %} {% endif %}
{% endfor %}
{% endfor %}
Ważne Spotkanie Networking Webinar Inne Zewnętrzne
{% elif view_mode == 'cards' %}

Nadchodzące wydarzenia

{% if upcoming_events %}
Pokaż:
{% for event in upcoming_events[:12] %}
{{ event.title }} → {% if event.is_external and event.external_source %} 🌐 {{ event.external_source }} {% endif %}
📆 {{ event.date_range_display }}{% if not event.is_multi_day %} ({{ ['Pon', 'Wt', 'Śr', 'Czw', 'Pt', 'Sob', 'Nd'][event.event_date.weekday()] }}){% endif %} {% if event.time_start %} 🕕 {{ event.time_start.strftime('%H:%M') }} {% endif %} {% if event.location %} 📍 {{ event.location[:30] }}{% if event.location|length > 30 %}...{% endif %} {% endif %}
👥 Zapisanych: {{ event.total_attendee_count }} {% if event.total_attendee_count == 1 %}osoba{% elif event.total_attendee_count in [2,3,4] %}osoby{% else %}osób{% endif %}
{% set is_attending = event.attendees|selectattr('user_id','equalto',current_user.id)|list %} {% if is_attending %} ✓ Zapisany/a {% else %} Zapisz się → {% endif %}
{% endfor %}
{% if upcoming_events|length > 12 %}
Zobacz wszystkie ({{ upcoming_events|length }}) →
{% endif %} {% else %}

Brak nadchodzących wydarzeń

{% endif %}
{% else %}

Nadchodzące wydarzenia

{% if upcoming_events %} {% for event in upcoming_events %} {% endfor %} {% else %}

Brak nadchodzących wydarzeń

{% endif %}
{% if past_events %}

Ostatnie wydarzenia

{% for event in past_events %}
{{ event.event_date.day }}
{{ pl_months.get(event.event_date.strftime('%b'), event.event_date.strftime('%b')) }}
{{ pl_types.get(event.event_type, event.event_type) }} {% if event.location %} {{ event.location }} {% endif %}
{{ event.total_attendee_count }} uczestników
{% endfor %}
{% endif %} {% endif %} {% endblock %} {% block extra_js %} var csrfToken = '{{ csrf_token() }}'; function filterCards(type, btn) { document.querySelectorAll('.cards-filter-btn').forEach(b => b.classList.remove('active')); btn.classList.add('active'); document.querySelectorAll('#cardsGrid .card-banner').forEach(card => { if (type === 'all' || card.dataset.eventType === type) { card.classList.remove('hidden-by-filter'); } else { card.classList.add('hidden-by-filter'); } }); } async function toggleListRSVP(btn) { var eventId = btn.dataset.eventId; var isExt = btn.dataset.external === 'true'; 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) { var addedText = isExt ? 'Zainteresowany ✓' : 'Zapisano ✓'; var removedText = isExt ? 'Zainteresowany' : 'Zapisz się'; var hoverText = isExt ? 'Nie interesuje' : 'Wypisz się'; var countLabel = isExt ? ' zainteresowanych' : ' uczestników'; if (data.action === 'added') { btn.textContent = addedText; btn.classList.remove('rsvp-not-attending'); btn.classList.add('rsvp-attending'); btn.dataset.attending = 'true'; btn.onmouseenter = function() { this.textContent = hoverText; }; btn.onmouseleave = function() { this.textContent = addedText; }; } else { btn.textContent = removedText; btn.classList.remove('rsvp-attending'); btn.classList.add('rsvp-not-attending'); btn.dataset.attending = 'false'; btn.onmouseenter = null; btn.onmouseleave = null; } var countEl = btn.parentElement.querySelector('.attendee-count'); if (countEl) countEl.textContent = data.attendee_count + countLabel; } } catch(e) {} btn.disabled = false; } /* Filter toggle for external events */ (function() { var cb = document.getElementById('show-external'); var label = document.getElementById('external-filter-label'); var textEl = document.getElementById('external-filter-text'); var stored = localStorage.getItem('nordabiz_show_external'); if (stored === 'false') cb.checked = false; var extItems = document.querySelectorAll('[data-external="true"]'); var count = extItems.length; if (count > 0) { label.style.display = ''; textEl.textContent = 'Pokaż zewnętrzne (' + count + ')'; } function applyFilter() { var show = cb.checked; localStorage.setItem('nordabiz_show_external', show); extItems.forEach(function(el) { el.style.display = show ? '' : 'none'; }); } cb.addEventListener('change', applyFilter); applyFilter(); })(); var plMonths = ['','stycznia','lutego','marca','kwietnia','maja','czerwca','lipca','sierpnia','września','października','listopada','grudnia']; function openDayModal(day, month, year) { var modal = document.getElementById('dayModal'); var overlay = document.getElementById('dayModalOverlay'); var title = document.getElementById('dayModalTitle'); var eventsDiv = document.getElementById('dayModalEvents'); title.textContent = day + ' ' + plMonths[month] + ' ' + year; // Find events for this day from DOM var dayCell = document.querySelector('.calendar-day[data-day="' + day + '"].has-events'); if (!dayCell) return; var events = dayCell.querySelectorAll('.calendar-event'); var html = ''; events.forEach(function(ev) { var eventType = ''; ['meeting','networking','webinar','other','external'].forEach(function(t) { if (ev.classList.contains(t)) eventType = t; }); var time = ev.dataset.eventTime || ''; var loc = ev.dataset.eventLocation || ''; var meta = []; if (ev.dataset.eventType) meta.push(ev.dataset.eventType); if (time) meta.push(time); if (loc) meta.push(loc); html += '' + '
' + '
' + '
' + ev.dataset.eventTitle + '
' + (meta.length ? '
' + meta.join(' · ') + '
' : '') + '
' + '' + '
'; }); eventsDiv.innerHTML = html; overlay.classList.add('show'); modal.classList.add('show'); } function closeDayModal() { document.getElementById('dayModal').classList.remove('show'); document.getElementById('dayModalOverlay').classList.remove('show'); } function androidSubscribe() { // Copy URL to clipboard var url = 'https://nordabiznes.pl/kalendarz/ical'; if (navigator.clipboard) { navigator.clipboard.writeText(url); } else { var tmp = document.createElement('input'); tmp.value = url; document.body.appendChild(tmp); tmp.select(); document.execCommand('copy'); document.body.removeChild(tmp); } // Show instructions document.getElementById('androidStep2').style.display = 'block'; // Open Google Calendar settings (add by URL page) setTimeout(function() { window.open('https://calendar.google.com/calendar/r/settings/addbyurl', '_blank'); }, 500); } function showSubscribeModal() { document.getElementById('subscribeModal').style.display = 'flex'; } function copyIcalUrl() { var input = document.getElementById('icalUrl'); input.select(); document.execCommand('copy'); var btn = document.getElementById('copyBtn'); btn.textContent = 'Skopiowano!'; setTimeout(function() { btn.textContent = 'Kopiuj'; }, 2000); } document.getElementById('subscribeModal').addEventListener('click', function(e) { if (e.target === this) this.style.display = 'none'; }); {% endblock %}