From 99dcfa5716d6e17020c15468d2e58f80954b8d68 Mon Sep 17 00:00:00 2001 From: Grollicus <cccvgitlab.db5c7b60@grollmann.eu> Date: Sat, 26 Dec 2020 13:40:31 +0100 Subject: [PATCH] public fahrplan modal --- src/plainui/jinja2.py | 14 ++++++++++++- .../jinja2/plainui/components/calendar.html | 13 ++++++++++-- .../jinja2/plainui/components/event_info.html | 4 ++-- src/plainui/jinja2/plainui/event.html | 2 +- src/plainui/static/plainui/js/modal.js | 21 +++++++++++++------ src/plainui/views.py | 2 +- 6 files changed, 43 insertions(+), 13 deletions(-) diff --git a/src/plainui/jinja2.py b/src/plainui/jinja2.py index 599c8300d..626f28b03 100644 --- a/src/plainui/jinja2.py +++ b/src/plainui/jinja2.py @@ -1,4 +1,4 @@ -from datetime import datetime +from datetime import datetime, timedelta from django.contrib.messages import get_messages from django.templatetags.static import static from django.urls import reverse @@ -36,6 +36,17 @@ def custom_timedelta(tdelta): return NaturalTimeFormatter.string_for(tdelta) +def custom_timedelta_short(tdelta: timedelta): + if not isinstance(tdelta, timedelta): + return '' + s = tdelta.seconds + h = s // 3600 + s -= h * 3600 + m = s // 60 + s -= m * 60 + return '%02d:%02d:%02d' % (h, m, s) + + def custom_strftime(date): if not isinstance(date, datetime): return '' @@ -107,6 +118,7 @@ def environment(**options): 'show_vars': show_vars, }) env.filters['strftdelta'] = custom_timedelta + env.filters['strftdelta_short'] = custom_timedelta_short env.filters['strftime'] = custom_strftime env.filters['strfdate'] = custom_strfdate env.install_gettext_callables(ugettext, ungettext, newstyle=True) diff --git a/src/plainui/jinja2/plainui/components/calendar.html b/src/plainui/jinja2/plainui/components/calendar.html index 8210ae09a..8ae27820a 100644 --- a/src/plainui/jinja2/plainui/components/calendar.html +++ b/src/plainui/jinja2/plainui/components/calendar.html @@ -25,8 +25,17 @@ {% else %} {% set color="primary" if entry.event.kind == "official" else "secondary" %} <a class="text-decoration-none" {% if public %}onclick="fahrplanModal('{{entry.event.id}}')" href="#"{% else %}href="{{ url('plainui:event', conf_slug=conf.slug, event_slug=entry.event.slug) }}"{% endif %} title="{{entry.event.name}}"> - {% if public %} - {{ json_script({'title': entry.event.name, 'description': entry.event.description_html}, entry.event.id) }} + {%- if public %} + {{ json_script({ + 'title': entry.event.name | escape, + 'description_html': entry.event.description_html, + 'schedule_start': entry.event.schedule_start | strftime, + 'schedule_duration': entry.event.schedule_duration | strftdelta_short, + 'room_name': room.name | escape, + 'track_name': entry.event.track_name | escape, + 'language': entry.event.language | escape, + 'speakers': entry.event.speakers|join(', ', attribute='speaker_name') | escape + }, entry.event.id) }} {% endif %} <figure class="p-1 my-0 mx-1 d-flex flex-column bg-{{color}} rc3-fahrplan__room-event" style="height: {{ h(entry.minutes) }}"> <h2 class="mb-1 text-white rc3-fahrplan__event_title">{{entry.event.name}} diff --git a/src/plainui/jinja2/plainui/components/event_info.html b/src/plainui/jinja2/plainui/components/event_info.html index 1731dadb9..bfd5ec6b8 100644 --- a/src/plainui/jinja2/plainui/components/event_info.html +++ b/src/plainui/jinja2/plainui/components/event_info.html @@ -1,7 +1,7 @@ {% import "plainui/components/image.html" as imageMacro %} -{% macro eventInfo(event) -%} +{% macro eventInfo(event, speakers) -%} <div class="rc3-event-info"> <h2> {{ _("Event starts in") }} @@ -27,7 +27,7 @@ <dt>{{ _("Speakers") }}</dt> <dd> {% for speaker in speakers %} - {{ speaker.participant.first_name }} {{ speaker.participant.last_name }}{% if not loop.last %}, {% endif %} + {{ speaker.participant.username }}{% if not loop.last %}, {% endif %} {% else %} {{ _("No Speakers publicated yet") }} {% endfor %} diff --git a/src/plainui/jinja2/plainui/event.html b/src/plainui/jinja2/plainui/event.html index af73b7fc8..f0c19c08a 100644 --- a/src/plainui/jinja2/plainui/event.html +++ b/src/plainui/jinja2/plainui/event.html @@ -26,7 +26,7 @@ {% if assembly.slug and assembly.name %} <p>hosted by: <a href="{{ url("plainui:assembly", conf_slug=conf.slug, assembly_slug=assembly.slug) }}">{{ assembly.name }}</a></p> {% endif %} - {{ eventInfoMacro.eventInfo(event=event) }} + {{ eventInfoMacro.eventInfo(event, speakers) }} {% if event.kind == 'official' %} {{ integrations.vocPlayer(vocLecture=event.slug) }} {% endif %} diff --git a/src/plainui/static/plainui/js/modal.js b/src/plainui/static/plainui/js/modal.js index dcb2ca70d..97371ee17 100644 --- a/src/plainui/static/plainui/js/modal.js +++ b/src/plainui/static/plainui/js/modal.js @@ -2,7 +2,7 @@ function showModal(title, content) { let root = document.createElement('div'); root.innerHTML = ` -<div class="modal show" tabindex="-1" style="display:block;"> +<div class="modal show modal-close" tabindex="-1" style="display:block;"> <div class="modal-dialog"> <div class="modal-content"> <div class="modal-header"> @@ -29,10 +29,6 @@ function showModal(title, content) { document.body.removeChild(modal_backdrop); } -// let modal_backdrop = document.createElement('div'); -// modal_backdrop.classList.add('modal-backdrop', 'modal-close'); -// root.appendChild(modal_backdrop); - modal_backdrop.addEventListener('click', hide); let close_elements = root.getElementsByClassName('modal-close'); for(let i = 0; i < close_elements.length; ++i) { @@ -40,11 +36,24 @@ function showModal(title, content) { el.addEventListener('click', hide) } + root.getElementsByClassName('modal-dialog')[0].addEventListener('click', function(e) { e.stopPropagation() }); + document.body.appendChild(root); } function fahrplanModal(data_elem_id) { let data_elem = document.getElementById(data_elem_id) let data = JSON.parse(data_elem.innerText); - showModal(data.title, data.description); + let body = ` + <div> + <p><b>Start time: </b>${data.schedule_start}</p> + <p><b>Duration: </b>${data.schedule_duration}</p> + <p><b>Room: </b>${data.room_name}</p> + <p><b>Track: </b>${data.track_name}</p> + <p><b>Language: </b>${data.language}</p> + <p><b>Speakers: </b>${data.speakers}</p> + </div> + <div class="rc3-markdown">${data.description_html}</div> + ` + showModal(data.title, body); } diff --git a/src/plainui/views.py b/src/plainui/views.py index 35840b002..aca532f9b 100644 --- a/src/plainui/views.py +++ b/src/plainui/views.py @@ -133,7 +133,7 @@ class EventView(ConferenceRequiredMixin, TemplateView): context['is_favorite_events'] = favorites context['is_scheduled_events'] = personal_calendar context['events_upcoming'] = _event_filter(self.request.user, self.conf, upcoming=True) - context['speakers'] = event.participants.filter(is_public=True, role=EventParticipant.Role.SPEAKER) + context['speakers'] = event.participants.filter(is_public=True, role=EventParticipant.Role.SPEAKER).select_related('participant') context['tags'] = TagItem.objects.select_related('tag').filter( tag__is_public=True, target_type=ContentType.objects.get_for_model(Event), target_id=event.pk ) -- GitLab