Add private event invitations
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
<div class="user-menu-panel">
|
||||
<a href="/profile">Mein Profil</a>
|
||||
<a href="/messages">Nachrichten{% if user.unread_message_count %} <span class="menu-count">{{ user.unread_message_count }}</span>{% endif %}</a>
|
||||
{% if user.event_invitation_count %}<a href="/#event-invitations">Veranstaltungseinladungen <span class="menu-count">{{ user.event_invitation_count }}</span></a>{% endif %}
|
||||
<form method="post" action="/logout">
|
||||
<button type="submit">Abmelden</button>
|
||||
</form>
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
<div><strong>{{ managed_user.display_name }}</strong><div class="admin-meta">@{{ managed_user.username }} · {{ managed_user.email }} · seit {{ managed_user.created_at }}</div></div>
|
||||
<form class="role-form" method="post" action="/admin/users/{{ managed_user.id }}">
|
||||
<select name="role" aria-label="Rolle für {{ managed_user.username }}"><option value="user" {% if not managed_user.is_admin %}selected{% endif %}>Benutzer</option><option value="admin" {% if managed_user.is_admin %}selected{% endif %}>Admin</option></select>
|
||||
<label><input type="checkbox" name="founder_badge" {% if managed_user.has_founder_badge %}checked{% endif %}> Gründer-Patch</label>
|
||||
<button class="button" type="submit">Speichern</button>
|
||||
</form>
|
||||
<div class="role-form">
|
||||
|
||||
@@ -63,6 +63,7 @@
|
||||
<div class="concert-content">
|
||||
|
||||
<span class="event-type-badge">{{ concert.event_type_label }}</span>
|
||||
{% if concert.visibility == 'friends' %}<span class="event-type-badge">🔒 Nur Freunde</span>{% elif concert.visibility == 'private' %}<span class="event-type-badge">🔐 Privat / eingeladen</span>{% endif %}
|
||||
|
||||
<h1>
|
||||
{{ concert.artist }}
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
{% if can_edit_details %}
|
||||
<p>
|
||||
<label>Kategorie<br>
|
||||
<select name="event_type" id="event-type" required>
|
||||
<select name="event_type" id="event-type" required {% if not can_manage_access %}disabled{% endif %}>
|
||||
<option value="concert" {% if concert.event_type == 'concert' %}selected{% endif %}>Konzert</option>
|
||||
<option value="festival" {% if concert.event_type == 'festival' %}selected{% endif %}>Festival</option>
|
||||
<option value="other" {% if concert.event_type == 'other' %}selected{% endif %}>Sonstiges</option>
|
||||
@@ -40,6 +40,19 @@
|
||||
</select>
|
||||
</label>
|
||||
</p>
|
||||
{% if can_manage_access %}<fieldset id="event-visibility-field" {% if concert.event_type != 'other' %}hidden{% endif %}>
|
||||
<legend>Sichtbarkeit</legend>
|
||||
<label><input type="radio" name="visibility" value="public" {% if concert.visibility == 'public' %}checked{% endif %}> Öffentlich</label><br>
|
||||
<label><input type="radio" name="visibility" value="friends" {% if concert.visibility == 'friends' %}checked{% endif %}> Nur Freunde</label><br>
|
||||
<label><input type="radio" name="visibility" value="private" {% if concert.visibility == 'private' %}checked{% endif %}> Privat – nur eingeladene Mitglieder</label>
|
||||
</fieldset>
|
||||
<fieldset id="event-invitations-field" {% if concert.event_type != 'other' or concert.visibility != 'private' %}hidden{% endif %}>
|
||||
<legend>Mitglieder einladen</legend>
|
||||
{% for member in invitable_users %}
|
||||
<label style="display:block;margin:7px 0"><input type="checkbox" name="invited_user_ids" value="{{ member.id }}" {% if member.id in invited_user_ids %}checked{% endif %}> {{ member.display_name }} <small>@{{ member.username }}</small></label>
|
||||
{% else %}<p>Noch keine weiteren Mitglieder vorhanden.</p>{% endfor %}
|
||||
</fieldset>
|
||||
{% endif %}
|
||||
{% endif %}
|
||||
<p>
|
||||
<label>Titel / Künstler / Band<br>
|
||||
@@ -125,6 +138,9 @@ const parentEventField = document.getElementById("parent-event-field");
|
||||
const parentEventId = document.getElementById("parent-event-id");
|
||||
const festivalEndField = document.getElementById("festival-end-field");
|
||||
const festivalEndDatetime = document.getElementById("festival-end-datetime");
|
||||
const eventVisibilityField = document.getElementById("event-visibility-field");
|
||||
const eventInvitationsField = document.getElementById("event-invitations-field");
|
||||
const visibilityInputs = [...document.querySelectorAll('input[name="visibility"]')];
|
||||
|
||||
function updateEventFields() {
|
||||
const isFestival = eventType.value === "festival";
|
||||
@@ -132,11 +148,17 @@ function updateEventFields() {
|
||||
festivalEndField.hidden = !isFestival;
|
||||
festivalEndDatetime.required = isFestival;
|
||||
parentEventField.hidden = !isOther;
|
||||
if (eventVisibilityField) {
|
||||
eventVisibilityField.hidden = !isOther;
|
||||
const isPrivate = isOther && document.querySelector('input[name="visibility"]:checked').value === "private";
|
||||
eventInvitationsField.hidden = !isPrivate;
|
||||
}
|
||||
if (!isFestival) festivalEndDatetime.value = "";
|
||||
if (!isOther) parentEventId.value = "";
|
||||
}
|
||||
|
||||
eventType.addEventListener("change", updateEventFields);
|
||||
visibilityInputs.forEach(input => input.addEventListener("change", updateEventFields));
|
||||
</script>
|
||||
{% endif %}
|
||||
</body>
|
||||
|
||||
@@ -205,6 +205,7 @@
|
||||
{% macro event_card(concert, linked=false) %}
|
||||
<a href="/concerts/{{ concert.id }}" class="concert-card{% if linked %} linked-event{% endif %}">
|
||||
<span class="event-category">{{ concert.event_type_label }}</span>
|
||||
{% if concert.is_invited %}<span class="event-category"> · ✉ Eingeladen</span>{% elif concert.visibility == 'friends' %}<span class="event-category"> · 🔒 Nur Freunde</span>{% elif concert.visibility == 'private' %}<span class="event-category"> · 🔐 Privat</span>{% endif %}
|
||||
<div class="concert-artist">
|
||||
{% if concert.event_type == 'festival' %}🎪{% elif concert.event_type == 'other' %}🥂{% else %}🎸{% endif %}
|
||||
{{ concert.artist }}
|
||||
@@ -290,7 +291,7 @@
|
||||
|
||||
{% if upcoming_concerts or past_concerts %}
|
||||
|
||||
<div class="concert-list">
|
||||
<div class="concert-list" id="event-invitations">
|
||||
|
||||
{% for concert in upcoming_concerts %}
|
||||
<div class="event-group">
|
||||
|
||||
@@ -126,6 +126,21 @@
|
||||
<small>Zum Beispiel ein gemeinsames Vortrinken vor einem Konzert.</small>
|
||||
</p>
|
||||
|
||||
<fieldset id="event-visibility-field" hidden>
|
||||
<legend>Sichtbarkeit</legend>
|
||||
<label><input type="radio" name="visibility" value="public" checked> Öffentlich – alle können die Veranstaltung sehen und teilnehmen</label><br>
|
||||
<label><input type="radio" name="visibility" value="friends"> Nur Freunde – nur bestätigte Freunde können sie sehen und teilnehmen</label><br>
|
||||
<label><input type="radio" name="visibility" value="private"> Privat – nur gezielt eingeladene Mitglieder</label>
|
||||
</fieldset>
|
||||
|
||||
<fieldset id="event-invitations-field" hidden>
|
||||
<legend>Mitglieder einladen</legend>
|
||||
<p class="flyer-help">Eingeladene erhalten eine Benachrichtigung und sehen die Veranstaltung in ihrer Übersicht.</p>
|
||||
{% for member in invitable_users %}
|
||||
<label style="display:block;margin:7px 0"><input type="checkbox" name="invited_user_ids" value="{{ member.id }}"> {{ member.display_name }} <small>@{{ member.username }}</small></label>
|
||||
{% else %}<p>Noch keine weiteren Mitglieder vorhanden.</p>{% endfor %}
|
||||
</fieldset>
|
||||
|
||||
<!-- ================================================= -->
|
||||
<!-- Künstler -->
|
||||
<!-- ================================================= -->
|
||||
@@ -389,6 +404,9 @@ const parentEventField = document.getElementById("parent-event-field");
|
||||
const parentEventId = document.getElementById("parent-event-id");
|
||||
const festivalEndField = document.getElementById("festival-end-field");
|
||||
const festivalEndDatetime = document.getElementById("festival-end-datetime");
|
||||
const eventVisibilityField = document.getElementById("event-visibility-field");
|
||||
const eventInvitationsField = document.getElementById("event-invitations-field");
|
||||
const visibilityInputs = [...document.querySelectorAll('input[name="visibility"]')];
|
||||
|
||||
function updateEventFields() {
|
||||
const isFestival = eventType.value === "festival";
|
||||
@@ -396,11 +414,15 @@ function updateEventFields() {
|
||||
festivalEndField.hidden = !isFestival;
|
||||
festivalEndDatetime.required = isFestival;
|
||||
parentEventField.hidden = !isOther;
|
||||
eventVisibilityField.hidden = !isOther;
|
||||
const isPrivate = isOther && document.querySelector('input[name="visibility"]:checked').value === "private";
|
||||
eventInvitationsField.hidden = !isPrivate;
|
||||
if (!isFestival) festivalEndDatetime.value = "";
|
||||
if (!isOther) parentEventId.value = "";
|
||||
}
|
||||
|
||||
eventType.addEventListener("change", updateEventFields);
|
||||
visibilityInputs.forEach(input => input.addEventListener("change", updateEventFields));
|
||||
updateEventFields();
|
||||
|
||||
/* ============================================================
|
||||
|
||||
Reference in New Issue
Block a user