style front page updates, support FOIRequests

This commit is contained in:
Jonas Heinrich 2025-09-19 14:50:42 +02:00
parent c56689893b
commit e3d283f463
7 changed files with 239 additions and 97 deletions

View file

@ -83,7 +83,7 @@
{% with foirequest=object.get_recent_foirequest %}
<dt>Anfrage</dt>
<dd>
{% include "foirequest/snippets/request_item_mini.html" with object=foirequest %}
<a href="{{ foirequest.url }}" class="text-decoration-none">Aktuell laufende Anfrage vom {{ foirequest.created_at|date:"d.m.Y" }}</a>
</dd>
{% endwith %}
{% endif %}

View file

@ -3,6 +3,7 @@
<style>
.govplan-update .card-body div.tight-margin {
flex-grow: 1;
overflow: hidden; /* make sure content doesnt spill */
}
.govplan-update .card-header h3 {
@ -10,6 +11,37 @@
display: flex;
align-items: flex-end;
}
#myCarousel .card {
height: 380px;
display: flex;
flex-direction: column;
}
#myCarousel .card-body {
display: flex;
flex-direction: column;
overflow: hidden;
}
/* Multiline ellipsis for content */
#myCarousel .tight-margin {
overflow: hidden;
}
#myCarousel .tight-margin p,
#myCarousel .tight-margin div {
display: -webkit-box;
-webkit-line-clamp: 3; /* number of lines to show */
-webkit-box-orient: vertical;
overflow: hidden;
text-overflow: ellipsis;
}
#myCarousel .badge {
font-weight: 400;
font-size: 0.85rem;
}
</style>
<!-- Update tiles on start page -->
@ -17,100 +49,102 @@
<div class="py-5 bg-body-tertiary">
<div class="mb-4">
<h1 class="text-body-emphasis">Aktuelles</h1>
<p class="fs-5 col-md-8">
Hier finden Sie aktuelle Artikel und Links zu Blogs zu den Fortschritten der Stadtverwaltung Karlsruhe.
</p>
</div>
<div class="mb-4">
<h1 class="text-body-emphasis">Aktuelles</h1>
<p class="fs-5 col-md-8">
Hier finden Sie aktuelle Artikel und Links zu Blogs zu den Fortschritten der Stadtverwaltung Karlsruhe.
</p>
</div>
<div id="myCarousel" class="carousel slide" data-bs-ride="carousel">
<div class="carousel-inner w-100">
{% for update in updates %}
<div class="carousel-item {% if forloop.first %}active{% endif %}">
<div class="card col-md-4">
<a href="{{ update.get_absolute_url }}" class="text-body text-decoration-none">
<div class="card-header p-4 tight-margin text-start">
{% if show_context %}
<span class="badge text-bg-light text-decoration-none me-2 mb-2">
{{ update.plan.get_section }}
</span>
{% endif %}
{% if show_context %}
<h3 class="h5 mt-0 ellipsis">{{ update.plan }}</h3>
{% else %}
<h3 class="h4 mt-0 ellipsis">{{ update.title }}</h3>
{% endif %}
<div class="small">
<time datetime="{{ update.timestamp|date:'c' }}">{{ update.timestamp|date:"DATE_FORMAT" }}</time>
{% if update.user or update.organization %}
<span>
von {{ update.user.get_full_name }}{% if update.user and update.organization %},{% endif %}
{{ update.organization.name }}
</span>
{% endif %}
</div>
</div>
</a>
<div class="card-body tight-margin text-start p-4 d-flex flex-column">
{% if update.content or show_context %}
<div class="tight-margin">
{% if show_context %}
<h4 class="h5">{{ update.title }}</h4>
{% endif %}
{% with update.content|markdown as content %}
<div id="myCarousel" class="carousel slide" data-bs-ride="carousel">
<div class="carousel-inner w-100">
{% for update in updates %}
<div class="carousel-item {% if forloop.first %}active{% endif %}">
<div class="card col-md-4">
<a href="{{ update.get_absolute_url }}" class="text-body text-decoration-none">
<div class="card-header p-4 tight-margin text-start">
{% if show_context %}
{{ content|truncatewords_html:15 }}
<h3 class="h5 mt-0 ellipsis">{{ update.plan }}</h3>
{% else %}
{{ content }}
<h3 class="h4 mt-0 ellipsis">{{ update.title }}</h3>
{% endif %}
{% endwith %}
</div>
{% endif %}
{% if update.url or update.foirequest or show_context %}
<div class="{% if update.content %}box-card-links{% else %}d-flex mt-auto{% endif %} mt-auto">
{% if show_context %}
<a href="{{ update.get_absolute_url }}" class="action-link">→ zum Vorhaben</a>
{% else %}
{% if update.url %}
<a href="{{ update.url }}" class="action-link me-3" target="_blank" rel="noopener">→ mehr auf {{ update.get_url_domain }} lesen…</a>
{% endif %}
{% if update.foirequest %}
<a href="{{ update.foirequest.get_absolute_url }}" class="action-link">→ zur Anfrage</a>
<div class="small">
<time datetime="{{ update.timestamp|date:'c' }}">{{ update.timestamp|date:"DATE_FORMAT" }}</time>
{% if update.user or update.organization %}
<span>
von {{ update.user.get_full_name }}{% if update.user and update.organization %},{% endif %}
{{ update.organization.name }}
</span>
{% endif %}
</div>
</div>
</a>
<div class="card-body tight-margin text-start p-4 d-flex flex-column">
{% if update.content or show_context %}
<div class="tight-margin flex-grow-1">
{% if show_context %}
<h4 class="h5">{{ update.title }}</h4>
{% endif %}
{% with update.content|markdown as content %}
{% if show_context %}
{{ content|truncatewords_html:15 }}
{% else %}
{{ content }}
{% endif %}
{% endwith %}
</div>
{% endif %}
{% if update.url or update.foirequest or show_context %}
<div class="{% if update.content %}box-card-links{% else %}d-flex mt-auto{% endif %} mt-auto">
{% if show_context %}
<a href="{{ update.get_absolute_url }}" class="action-link">→ zum Vorhaben</a>
{% else %}
{% if update.url %}
<a href="{{ update.url }}" class="action-link me-3" target="_blank" rel="noopener">
→ mehr auf {{ update.get_url_domain }} lesen…
</a>
{% endif %}
{% if update.foirequest %}
<a href="{{ update.foirequest.get_absolute_url }}" class="action-link">→ zur Anfrage</a>
{% endif %}
{% endif %}
</div>
{% endif %}
{% if show_context %}
<div class="d-md-flex mt-2 align-items-center mt-3">
<ul class="list-unstyled d-flex m-0">
{% for cat in update.plan.categories.all %}
<li>
<span class="badge bg-secondary text-decoration-none me-2 mb-2">
#{{ cat.name }}
</span>
</li>
{% endfor %}
</ul>
</div>
{% endif %}
</div>
{% endif %}
</div>
</div>
{% endfor %}
</div>
{% endfor %}
<button class="carousel-control-prev" type="button" data-bs-target="#myCarousel" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#myCarousel" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</button>
</div>
<button class="carousel-control-prev" type="button" data-bs-target="#myCarousel" data-bs-slide="prev">
<span class="carousel-control-prev-icon" aria-hidden="true"></span>
<span class="visually-hidden">Previous</span>
</button>
<button class="carousel-control-next" type="button" data-bs-target="#myCarousel" data-bs-slide="next">
<span class="carousel-control-next-icon" aria-hidden="true"></span>
<span class="visually-hidden">Next</span>
</button>
</div>
</div>
<!-- Update tiles on single page -->
{% else %}
<div class="py-3" style="margin-top: 1rem; margin-bottom: -2rem;">