mirror of
https://github.com/netz39/www.netz39.de.git
synced 2025-08-11 06:20:47 +02:00
Merge pull request #162 from netz39/150-todo-dauertermine-als-banner
feat(events): banners for rrule event and tags for ics See discussion for details.
This commit is contained in:
commit
93d158b6ce
3 changed files with 115 additions and 52 deletions
|
@ -45,12 +45,13 @@ Unsere Webseite setzt aus folgenden Gründen auf Jekyll, einen statischen Websit
|
|||
layout: event
|
||||
title: "Titel des Events"
|
||||
author: MaxMustermann # optional, soll angegeben werden, wenn du der Ansprechpartner des Events bist
|
||||
tags: 'example,halloWelt' # every tag will result in a seperate ics feed
|
||||
event:
|
||||
start: 2023-10-20 19:00:00 # Datum, an dem das Event stattfindet. Die Zeit ist optional
|
||||
end: 2023-10-20 21:00:00 # optional, Zeitpunkt, an dem das Event endet
|
||||
organizer: "Netz39 Team <kontakt@netz39.de>" # optional, Kontaktdaten im ical Event
|
||||
location: "Netz39 e.V." # optional, Ort des Events
|
||||
rrule: "FREQ=MONTHLY;INTERVAL=1;BYDAY=1FR,1TH" # follows https://icalendar.org/iCalendar-RFC-5545/3-3-10-recurrence-rule.html
|
||||
rrule: "FREQ=MONTHLY;INTERVAL=1;BYDAY=1FR,1TH;DTSTART=20231020T190000" # follows https://icalendar.org/iCalendar-RFC-5545/3-3-10-recurrence-rule.html the given order is relevant!
|
||||
---
|
||||
```
|
||||
- Unterhalb des Front Matters die Beschreibung des Events in Markdown aufschreiben
|
||||
|
|
|
@ -12,26 +12,9 @@ module Jekyll
|
|||
default_organizer = "Netz39 Team <kontakt@netz39.de>"
|
||||
default_location = "Netz39 e.V., Leibnizstraße 32, 39104 Magdeburg"
|
||||
default_duration = Rational(4, 24)
|
||||
cal = Icalendar::Calendar.new
|
||||
|
||||
# Define Europe/Berlin timezone with standard rules (incl. DST)
|
||||
cal.timezone do |t|
|
||||
t.tzid = "Europe/Berlin"
|
||||
# Daylight Saving Time (DST) adjustments (if applicable)
|
||||
t.daylight do |d|
|
||||
d.tzoffsetfrom = "-0100"
|
||||
d.tzoffsetto = "-0200"
|
||||
d.dtstart = "19700329T020000"
|
||||
d.tzname = "CEST"
|
||||
end
|
||||
# Standard Time definition
|
||||
t.standard do |s|
|
||||
s.tzoffsetfrom = "-0200"
|
||||
s.tzoffsetto = "-0100"
|
||||
s.dtstart = "19701025T030000"
|
||||
s.tzname = "CET"
|
||||
end
|
||||
end
|
||||
cals = Hash.new()
|
||||
calAllEvents = Icalendar::Calendar.new
|
||||
cals[:events] = calAllEvents
|
||||
|
||||
events.each do |event|
|
||||
title = event.data['title']
|
||||
|
@ -40,6 +23,7 @@ module Jekyll
|
|||
organizer = event.data.dig('event', 'organizer') || default_organizer
|
||||
location = event.data.dig('event', 'location') || default_location
|
||||
rrule = event.data.dig('event', 'rrule')
|
||||
tags = event.data['tags']
|
||||
|
||||
# Skip events older than 365 days
|
||||
next if start_date.to_date < (Date.today - 365)
|
||||
|
@ -71,11 +55,45 @@ module Jekyll
|
|||
ical_event.description = description
|
||||
ical_event.organizer = organizer
|
||||
ical_event.location = location
|
||||
cal.add_event(ical_event)
|
||||
end
|
||||
site.pages << IcalPage.new(site, site.source, 'feed/eo-events', "events.ics", cal)
|
||||
|
||||
puts "Generated events.ics page from #{events.length} events"
|
||||
cals[:events].add_event(ical_event)
|
||||
if tags
|
||||
tags.join('').split(/,/).each do |tag|
|
||||
if cals.key?(tag)
|
||||
cals[tag].add_event(ical_event)
|
||||
else
|
||||
newCal = Icalendar::Calendar.new
|
||||
newCal.add_event(ical_event)
|
||||
cals[tag] = newCal
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
cals.each_key { |tag|
|
||||
cal = cals[tag]
|
||||
# Define Europe/Berlin timezone with standard rules (incl. DST)
|
||||
cal.timezone do |t|
|
||||
t.tzid = "Europe/Berlin"
|
||||
# Daylight Saving Time (DST) adjustments (if applicable)
|
||||
t.daylight do |d|
|
||||
d.tzoffsetfrom = "-0100"
|
||||
d.tzoffsetto = "-0200"
|
||||
d.dtstart = "19700329T020000"
|
||||
d.tzname = "CEST"
|
||||
end
|
||||
# Standard Time definition
|
||||
t.standard do |s|
|
||||
s.tzoffsetfrom = "-0200"
|
||||
s.tzoffsetto = "-0100"
|
||||
s.dtstart = "19701025T030000"
|
||||
s.tzname = "CET"
|
||||
end
|
||||
end
|
||||
|
||||
site.pages << IcalPage.new(site, site.source, 'feed/eo-events/', "#{tag}.ics", cal)
|
||||
puts "Generated #{tag}.ics page from #{events.length} events"
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -37,41 +37,85 @@ position: 1
|
|||
calendar.render();
|
||||
});
|
||||
|
||||
const icalFeedUrls = {};
|
||||
</script>
|
||||
|
||||
</head>
|
||||
<body>
|
||||
<div id='calendar' style="width:95%; margin: auto;"></div>
|
||||
<div style="display: flex; flex-direction: column; justify-content: center; align-items: center; border: 1px">
|
||||
<div style="display: flex; align-items: center; margin-top: 50px">
|
||||
<p>iCal-Feed:
|
||||
<code id="icalFeedUrl" style="box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1); font-family: monospace;"></code>
|
||||
</p>
|
||||
<a id="copyButton" class="button" style="margin-left: 10px; margin-top: 0px">
|
||||
<i class="fas fa-copy" title="In Zwischenablage kopieren"></i>
|
||||
</a>
|
||||
</div>
|
||||
<div class="posts">
|
||||
{% for event in site.events %}
|
||||
{% if event.event.rrule %}
|
||||
<div class="post-teaser">
|
||||
{% if event.image %}
|
||||
<div class="post-img">
|
||||
<a aria-label="{{ event.title }}" href="{{ event.url | relative_url }}">
|
||||
<img alt="{{ event.title }}" src="{{ event.image | relative_url }}">
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
<span>
|
||||
<header>
|
||||
<h1>
|
||||
<a aria-label="{{ event.title }}" class="post-link" href="{{ event.url | relative_url }}">
|
||||
{{ event.title }}
|
||||
</a>
|
||||
</h1>
|
||||
{% include blog/post_info.liquid author=event.author date=event.event.start rrule=event.event.rrule %}
|
||||
</header>
|
||||
{% if site.excerpt or site.theme_settings.excerpt %}
|
||||
<div class="excerpt">
|
||||
{% if site.excerpt == "truncate" %}
|
||||
{{ event.content | strip_html | truncate: '250' | escape }}
|
||||
{% else %}
|
||||
{{ event.excerpt | strip_html | escape }}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endif %}
|
||||
</span>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div id='calendar' style="width:95%; margin: auto; margin-top: 50px;"></div>
|
||||
<div style="display: flex; align-items: center; margin-top: 50px; width: 100%; padding: 15px;">
|
||||
<h3 style="margin: auto; margin-right: 0px">ICal Feeds</h3>
|
||||
<div style="display: flex; flex-direction: column; margin: auto; margin-left: 15px">
|
||||
{% for feed in site.pages %}
|
||||
{% assign name = feed.name | downcase %}
|
||||
{% if name contains 'ics' %}
|
||||
<div style="display: flex; align-items: center; width: 100%;">
|
||||
<p style="margin-bottom: 0px; margin-right: 10px;">{{ feed.name | replace: '.ics', '' }}</p>
|
||||
<code id="{{feed.name}}-url" style="box-shadow: 0px 0px 10px 0px rgba(0, 0, 0, 0.1); font-family: monospace;"></code>
|
||||
<a id="{{feed.name}}-cpbtn" style="margin-left: 10px; margin-top: 0px; margin-bottom: 0px;">
|
||||
<i class="fas fa-copy" title="In Zwischenablage kopieren"></i>
|
||||
</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
const ICAL_FEED_URL = "{{site.url}}/feed/eo-events/events.ics";
|
||||
{% for feed in site.pages %}
|
||||
{% assign name = feed.name | downcase %}
|
||||
{% if name contains 'ics' %}
|
||||
<script>
|
||||
icalFeedUrls["{{feed.name}}"] = { url: "{{site.url}}/feed/eo-events/{{feed.name}}", btn: document.getElementById("{{feed.name}}-cpbtn")};
|
||||
|
||||
// set text in HTML element "icalFeedUrl" to the URL
|
||||
document.getElementById("icalFeedUrl").textContent = ICAL_FEED_URL;
|
||||
// set text in HTML element "{{feed.name}}-url" to the URL
|
||||
document.getElementById("{{feed.name}}-url").textContent = icalFeedUrls["{{feed.name}}"].url;
|
||||
|
||||
const copyButton = document.getElementById('copyButton');
|
||||
const urlToCopy = ICAL_FEED_URL;
|
||||
|
||||
copyButton.addEventListener('click', () => {
|
||||
const tempInput = document.createElement('input');
|
||||
tempInput.value = urlToCopy;
|
||||
document.body.appendChild(tempInput);
|
||||
tempInput.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(tempInput);
|
||||
alert('URL wurde in die Zwischenablage kopiert!');
|
||||
});
|
||||
</script>
|
||||
icalFeedUrls["{{feed.name}}"].btn.addEventListener('click', () => {
|
||||
const tempInput = document.createElement('input');
|
||||
tempInput.value = icalFeedUrls["{{feed.name}}"].url;
|
||||
document.body.appendChild(tempInput);
|
||||
tempInput.select();
|
||||
document.execCommand('copy');
|
||||
document.body.removeChild(tempInput);
|
||||
alert('URL wurde in die Zwischenablage kopiert!');
|
||||
});
|
||||
</script>
|
||||
{% endif %}
|
||||
{% endfor %}
|
||||
|
||||
</body>
|
||||
</html>
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue