Files

82 lines
6.6 KiB
HTML

<!DOCTYPE html>
<html lang="{{ language() }}">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>{{ _('Veranstaltungsorte · MetalCircle') }}</title>
<link rel="icon" type="image/png" href="/static/images/metalcircle-circle.png">
<link rel="stylesheet" href="/static/css/style.css">
<style>
.venue-fields { display: grid; grid-template-columns: 2fr 2fr .8fr 1.4fr 1.2fr; gap: 8px; }
.venue-fields input, .merge-form select { min-width: 0; width: 100%; }
.venue-aliases { margin-top: 8px; }
.venue-actions { margin-top: 10px; justify-content: space-between; }
.venue-actions label { display: flex; align-items: center; gap: 6px; }
.merge-form { display: grid; grid-template-columns: minmax(180px, 1fr) auto; gap: 8px; margin-top: 12px; padding-top: 12px; border-top: 1px solid var(--border); }
.delete-form { margin-top: 10px; text-align: right; }
.venue-card { padding: 0; overflow: hidden; }
.venue-summary { display: grid; grid-template-columns: minmax(0, 1fr) auto; gap: 14px; align-items: center; padding: 14px 16px; cursor: pointer; list-style: none; }
.venue-summary::-webkit-details-marker { display: none; }
.venue-summary::after { content: "▾"; color: var(--muted); transition: transform .15s ease; }
.venue-card[open] .venue-summary::after { transform: rotate(180deg); }
.venue-card[open] .venue-summary { border-bottom: 1px solid var(--border); background: var(--surface-hover); }
.venue-summary-title { display: block; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
.venue-summary-meta { display: block; margin-top: 3px; color: var(--muted); font-size: .83rem; }
.venue-verified { color: #86efac; }
.venue-unverified { color: #fca5a5; }
.venue-editor { padding: 16px; }
@media (max-width: 900px) { .venue-fields { grid-template-columns: 1fr 1fr; } }
@media (max-width: 560px) { .venue-fields, .merge-form { grid-template-columns: 1fr; } }
</style>
<link rel="stylesheet" href="/static/css/language.css">
</head>
<body>
<header><div class="header-inner"><a href="/" class="logo"><img class="brand-logo" src="/static/images/metalcircle-full.png" alt="MetalCircle"></a>{% include '_header_controls.html' %}</div>
</header>
<main>
<div class="page-title"><h1>{{ _('📍 Veranstaltungsorte') }}</h1><p>{{ _('Orte korrigieren, bestätigen, zusammenführen oder entfernen.') }}</p></div>
{% set admin_section = 'venues' %}{% include '_admin_nav.html' %}
<section class="admin-section">
<div class="admin-list">
{% for venue in venues %}
<details class="admin-row venue-card" {% if not venue.is_verified %}open{% endif %}>
<summary class="venue-summary">
<span>
<strong class="venue-summary-title">{{ venue.name }}{% if venue.city %} · {{ venue.city }}{% endif %}{% if venue.country %} · {{ venue.country }}{% endif %}</strong>
<span class="venue-summary-meta"><span class="{% if venue.is_verified %}venue-verified{% else %}venue-unverified{% endif %}">{% if venue.is_verified %}{{ _('✓ bestätigt') }}{% else %}{{ _('● unbestätigt') }}{% endif %}</span> · {{ venue.concert_count }} {{ _('Veranstaltung(en) · ID') }} {{ venue.id }}</span>
</span>
</summary>
<div class="venue-editor">
<form method="post" action="/admin/venues/{{ venue.id }}">
<div class="venue-fields">
<input name="name" value="{{ venue.name }}" aria-label="Name" required>
<input name="street" value="{{ venue.street }}" placeholder="{{ _('Straße') }}" aria-label="{{ _('Straße') }}">
<input name="postal_code" value="{{ venue.postal_code }}" placeholder="{{ _('PLZ') }}" aria-label="{{ _('PLZ') }}">
<input name="city" value="{{ venue.city }}" placeholder="{{ _('Ort') }}" aria-label="{{ _('Ort') }}">
<input name="country" value="{{ venue.country }}" placeholder="{{ _('Land') }}" aria-label="{{ _('Land') }}">
</div>
<input class="venue-aliases" name="aliases" value="{{ venue.aliases }}" placeholder="{{ _('Aliase, durch Komma getrennt') }}" aria-label="{{ _('Aliase') }}">
<div class="admin-actions venue-actions">
<label><input type="checkbox" name="is_verified" {% if venue.is_verified %}checked{% endif %}> {{ _('bestätigt') }}</label>
<span class="admin-meta">{{ _('Quelle:') }} {{ venue.source }} · {{ venue.concert_count }} {{ _('Konzert(e) · ID') }} {{ venue.id }}</span>
<button class="button" type="submit">{{ _('Speichern') }}</button>
</div>
</form>
{% if venues|length > 1 %}
<form class="merge-form" method="post" action="/admin/venues/{{ venue.id }}/merge" onsubmit="return confirm({{ _('Alle Konzerte werden dem Zielort zugeordnet und dieser Eintrag wird gelöscht. Fortfahren?') | tojson | forceescape }});">
<select name="target_venue_id" required><option value="">{{ _('Mit anderem Ort zusammenführen …') }}</option>{% for target in venues %}{% if target.id != venue.id %}<option value="{{ target.id }}">{{ target.name }}{% if target.city %}, {{ target.city }}{% endif %}</option>{% endif %}{% endfor %}</select>
<button class="admin-danger" type="submit">{{ _('Zusammenführen') }}</button>
</form>
{% endif %}
<form class="delete-form" method="post" action="/admin/venues/{{ venue.id }}/delete" onsubmit="return confirm({{ (_('Der Ort ist mit {count} Konzert(en) verknüpft. Diese Konzerte haben danach keinen Veranstaltungsort mehr. Ort endgültig löschen?').format(count=venue.concert_count) if venue.concert_count else _('Ort endgültig löschen?')) | tojson | forceescape }});">
<button class="admin-danger" type="submit">{{ _('Ort löschen') }}{% if venue.concert_count %} ({{ venue.concert_count }} {{ _('Verknüpfung(en))') }}{% endif %}</button>
</form>
</div>
</details>
{% else %}<p>{{ _('Noch keine Veranstaltungsorte vorhanden.') }}</p>{% endfor %}
</div>
</section>
</main>
</body>
</html>