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