We are building, workplan now registered with statehub
This commit is contained in:
parent
14b0bc6d01
commit
f202b71c75
37 changed files with 2036 additions and 22 deletions
|
|
@ -0,0 +1,18 @@
|
|||
{% extends "base.html" %}
|
||||
{% block title %}Ausschreibung archivieren{% endblock %}
|
||||
{% block content %}
|
||||
<div class="max-w-md mx-auto mt-16">
|
||||
<div class="card text-center space-y-4">
|
||||
<h1 class="text-lg font-semibold text-slate-800">Ausschreibung archivieren?</h1>
|
||||
<p class="text-sm text-slate-600">
|
||||
<strong>{{ ausschreibung.titel }}</strong> wird archiviert und aus der aktiven Liste entfernt.
|
||||
Die Daten bleiben erhalten.
|
||||
</p>
|
||||
<form method="post" class="flex justify-center gap-3">
|
||||
{% csrf_token %}
|
||||
<button type="submit" class="btn-primary bg-red-600 hover:bg-red-700">Archivieren</button>
|
||||
<a href="{% url 'ausschreibungen:detail' ausschreibung.pk %}" class="btn-ghost">Abbrechen</a>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -1,6 +1,102 @@
|
|||
{% extends "base.html" %}
|
||||
{% load vergabe_tags %}
|
||||
{% block title %}Übersicht{% endblock %}
|
||||
{% block content %}
|
||||
<h1 class="page-title mb-6">Übersicht</h1>
|
||||
<p class="text-slate-500">Dashboard wird in WP-0004 implementiert.</p>
|
||||
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||
|
||||
<!-- Kritische Fristen -->
|
||||
<div class="card">
|
||||
<div class="flex items-center justify-between mb-3">
|
||||
<h2 class="text-sm font-semibold text-slate-700">Kritische Fristen (14 Tage)</h2>
|
||||
<span class="inline-flex items-center justify-center w-6 h-6 rounded-full bg-red-100 text-red-700 text-xs font-bold">
|
||||
{{ kritische_fristen|length }}
|
||||
</span>
|
||||
</div>
|
||||
{% if kritische_fristen %}
|
||||
<ul class="space-y-1">
|
||||
{% for a in kritische_fristen %}
|
||||
<li class="flex items-center justify-between py-1 text-sm">
|
||||
<a href="/ausschreibungen/{{ a.pk }}/" class="text-brand-700 hover:underline truncate max-w-xs">{{ a.titel }}</a>
|
||||
<span class="ml-2 shrink-0 {% if a.abgabe_bis.date <= today %}text-red-600 font-medium{% else %}text-amber-600{% endif %}">
|
||||
{{ a.abgabe_bis|date:"d.m.Y H:i" }}
|
||||
</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p class="text-slate-400 text-sm">Keine kritischen Fristen.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Ohne Teilnahmeentscheidung -->
|
||||
<div class="card">
|
||||
<div class="flex items-center justify-between mb-3">
|
||||
<h2 class="text-sm font-semibold text-slate-700">Ohne Teilnahmeentscheidung</h2>
|
||||
<span class="inline-flex items-center justify-center w-6 h-6 rounded-full bg-amber-100 text-amber-700 text-xs font-bold">
|
||||
{{ ohne_entscheidung|length }}
|
||||
</span>
|
||||
</div>
|
||||
{% if ohne_entscheidung %}
|
||||
<ul class="space-y-1">
|
||||
{% for a in ohne_entscheidung %}
|
||||
<li class="py-1 text-sm">
|
||||
<a href="/ausschreibungen/{{ a.pk }}/entscheidung/" class="text-brand-700 hover:underline">{{ a.titel }}</a>
|
||||
<span class="text-slate-400 text-xs ml-1">seit {{ a.erstellt_am|date:"d.m.Y" }}</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p class="text-slate-400 text-sm">Alle Ausschreibungen haben eine Entscheidung.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Überfällige Aufgaben -->
|
||||
<div class="card">
|
||||
<div class="flex items-center justify-between mb-3">
|
||||
<h2 class="text-sm font-semibold text-slate-700">Überfällige Aufgaben</h2>
|
||||
<span class="inline-flex items-center justify-center w-6 h-6 rounded-full bg-red-100 text-red-700 text-xs font-bold">
|
||||
{{ ueberfaellige_aufgaben|length }}
|
||||
</span>
|
||||
</div>
|
||||
{% if ueberfaellige_aufgaben %}
|
||||
<ul class="space-y-1">
|
||||
{% for aufgabe in ueberfaellige_aufgaben %}
|
||||
<li class="flex items-center justify-between py-1 text-sm">
|
||||
<a href="/ausschreibungen/{{ aufgabe.ausschreibung_id }}/aufgaben/" class="text-brand-700 hover:underline truncate max-w-xs">
|
||||
{{ aufgabe.titel }}
|
||||
</a>
|
||||
<span class="text-red-600 text-xs ml-2 shrink-0">{{ aufgabe.frist|date:"d.m.Y" }}</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p class="text-slate-400 text-sm">Keine überfälligen Aufgaben.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
<!-- Laufende Ausschreibungen -->
|
||||
<div class="card">
|
||||
<div class="flex items-center justify-between mb-3">
|
||||
<h2 class="text-sm font-semibold text-slate-700">Laufende Ausschreibungen</h2>
|
||||
<span class="inline-flex items-center justify-center w-6 h-6 rounded-full bg-brand-100 text-brand-700 text-xs font-bold">
|
||||
{{ laufende_ausschreibungen|length }}
|
||||
</span>
|
||||
</div>
|
||||
{% if laufende_ausschreibungen %}
|
||||
<ul class="space-y-1">
|
||||
{% for a in laufende_ausschreibungen %}
|
||||
<li class="flex items-center justify-between py-1 text-sm">
|
||||
<a href="/ausschreibungen/{{ a.pk }}/" class="text-brand-700 hover:underline truncate max-w-xs">{{ a.titel }}</a>
|
||||
{% status_badge a.get_status_display a.status %}
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
{% else %}
|
||||
<p class="text-slate-400 text-sm">Keine laufenden Ausschreibungen.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
|
|||
94
vergabe_teilnahme/templates/ausschreibungen/detail.html
Normal file
94
vergabe_teilnahme/templates/ausschreibungen/detail.html
Normal file
|
|
@ -0,0 +1,94 @@
|
|||
{% extends "base.html" %}
|
||||
{% load vergabe_tags %}
|
||||
{% block title %}{{ ausschreibung.titel }}{% endblock %}
|
||||
{% block content %}
|
||||
|
||||
<!-- Title row -->
|
||||
<div class="flex items-start justify-between mb-4 gap-4">
|
||||
<div>
|
||||
<h1 class="page-title">{{ ausschreibung.titel }}</h1>
|
||||
<p class="text-sm text-slate-500 mt-0.5">{{ ausschreibung.ausschreiber }}</p>
|
||||
</div>
|
||||
<div class="flex items-center gap-2 shrink-0">
|
||||
{% include "ausschreibungen/partials/status_widget.html" %}
|
||||
<a href="{% url 'ausschreibungen:bearbeiten' ausschreibung.pk %}" class="btn-ghost text-xs">Bearbeiten</a>
|
||||
<a href="{% url 'ausschreibungen:archivieren' ausschreibung.pk %}" class="btn-ghost text-xs text-slate-400">Archivieren</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Deadline warnings -->
|
||||
{% if warnungen %}
|
||||
<div class="space-y-2 mb-5">
|
||||
{% for w in warnungen %}
|
||||
<div class="rounded px-4 py-2 text-sm flex items-center gap-2
|
||||
{% if w.farbe == 'red' %}bg-red-50 border border-red-200 text-red-700
|
||||
{% else %}bg-amber-50 border border-amber-200 text-amber-700{% endif %}">
|
||||
<span class="font-medium">
|
||||
{% if w.typ == 'bieterfragen' %}Bieterfragen-Frist{% else %}Abgabe-Frist{% endif %}:
|
||||
</span>
|
||||
{% if w.tage < 0 %}
|
||||
überfällig
|
||||
{% elif w.tage == 0 %}
|
||||
heute!
|
||||
{% else %}
|
||||
noch {{ w.tage }} Tag{% if w.tage != 1 %}e{% endif %}
|
||||
{% endif %}
|
||||
</div>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<!-- Phase navigation tabs -->
|
||||
<div class="flex gap-1 border-b border-slate-200 mb-6 overflow-x-auto">
|
||||
{% for phase in phases %}
|
||||
<a href="{{ phase.url }}"
|
||||
class="px-3 py-2 text-xs font-medium whitespace-nowrap border-b-2 -mb-px
|
||||
{% if phase.aktiv %}border-brand-600 text-brand-700
|
||||
{% elif phase.erledigt %}border-transparent text-slate-500 hover:text-slate-700
|
||||
{% else %}border-transparent text-slate-400 hover:text-slate-600{% endif %}">
|
||||
<span class="mr-1 {% if phase.erledigt %}phase-done{% elif phase.aktiv %}phase-active{% else %}phase-todo{% endif %}">{{ phase.nummer }}</span>
|
||||
{{ phase.name }}
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
|
||||
<!-- Stammdaten -->
|
||||
<div class="grid grid-cols-1 lg:grid-cols-2 gap-6">
|
||||
<div class="card">
|
||||
<h2 class="text-sm font-semibold text-slate-700 mb-3">Stammdaten</h2>
|
||||
<dl class="space-y-1">
|
||||
{% render_field ausschreibung "ausschreiber" "Ausschreiber" %}
|
||||
{% render_field ausschreibung "vergabeart" "Vergabeart" %}
|
||||
{% render_field ausschreibung "vergabenummer" "Vergabenummer" %}
|
||||
{% render_field ausschreibung "vergabeplattform" "Plattform" %}
|
||||
{% render_field ausschreibung "branche" "Branche" %}
|
||||
{% render_field ausschreibung "schlagwoerter" "Schlagwörter" %}
|
||||
{% render_field ausschreibung "geschaetztes_volumen" "Geschätztes Volumen (€)" %}
|
||||
</dl>
|
||||
</div>
|
||||
|
||||
<div class="card">
|
||||
<h2 class="text-sm font-semibold text-slate-700 mb-3">Fristen</h2>
|
||||
<dl class="space-y-1">
|
||||
{% render_field ausschreibung "veroeffentlichungsdatum" "Veröffentlicht" %}
|
||||
{% render_field ausschreibung "bieterfragen_bis" "Bieterfragen bis" %}
|
||||
{% render_field ausschreibung "abgabe_bis" "Abgabe bis" %}
|
||||
{% render_field ausschreibung "bindefrist" "Bindefrist" %}
|
||||
</dl>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if ausschreibung.leistungsbeschreibung %}
|
||||
<div class="card mt-6">
|
||||
<h2 class="text-sm font-semibold text-slate-700 mb-2">Leistungsbeschreibung</h2>
|
||||
<p class="text-sm text-slate-600 whitespace-pre-line">{{ ausschreibung.leistungsbeschreibung }}</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="flex gap-3 mt-6">
|
||||
<a href="{% url 'ausschreibungen:entscheidung' ausschreibung.pk %}" class="btn-ghost text-xs">
|
||||
Teilnahmeentscheidung
|
||||
</a>
|
||||
</div>
|
||||
|
||||
{% endblock %}
|
||||
|
|
@ -0,0 +1,69 @@
|
|||
{% extends "base.html" %}
|
||||
{% load vergabe_tags %}
|
||||
{% block title %}Teilnahmeentscheidung — {{ ausschreibung.titel }}{% endblock %}
|
||||
{% block content %}
|
||||
<h1 class="page-title mb-1">Teilnahmeentscheidung</h1>
|
||||
<p class="text-sm text-slate-500 mb-6">{{ ausschreibung.titel }}</p>
|
||||
|
||||
{% if ausschlusskriterien_nicht_erfuellbar %}
|
||||
<div class="bg-red-50 border border-red-300 rounded-lg p-4 mb-6">
|
||||
<p class="font-semibold text-red-700">⚠ Nicht erfüllbare Ausschlusskriterien</p>
|
||||
<ul class="mt-2 text-sm text-red-600 list-disc ml-4">
|
||||
{% for a in ausschlusskriterien_nicht_erfuellbar %}
|
||||
<li>{{ a.titel }} (Los: {{ a.los|default:"Allgemein" }})</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
<p class="text-sm text-red-500 mt-2">Empfehlung: Nichtteilnahme</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
{% if regelergebnis %}
|
||||
<div class="card mb-5">
|
||||
<h2 class="text-sm font-semibold text-slate-700 mb-3">Regelauswertung</h2>
|
||||
<ul class="space-y-2">
|
||||
{% for item in regelergebnis %}
|
||||
<li class="flex items-start gap-3 text-sm p-2 rounded
|
||||
{% if item.warnung %}bg-red-50 border border-red-200{% else %}bg-slate-50{% endif %}">
|
||||
<span class="shrink-0 font-medium {% if item.warnung %}text-red-700{% else %}text-slate-600{% endif %}">
|
||||
{{ item.regel.bezeichnung }}
|
||||
</span>
|
||||
<span class="text-slate-500">—</span>
|
||||
<span class="{% if item.warnung %}text-red-700{% else %}text-slate-600{% endif %}">
|
||||
{{ item.begruendung }}
|
||||
</span>
|
||||
<span class="ml-auto shrink-0 text-xs font-semibold
|
||||
{% if item.empfehlung == 'nicht_teilnehmen' %}text-red-600
|
||||
{% else %}text-slate-500{% endif %}">
|
||||
{{ item.empfehlung|upper }}
|
||||
</span>
|
||||
</li>
|
||||
{% endfor %}
|
||||
</ul>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="card max-w-lg">
|
||||
<h2 class="text-sm font-semibold text-slate-700 mb-4">Entscheidung treffen</h2>
|
||||
<form method="post" class="space-y-4">
|
||||
{% csrf_token %}
|
||||
<div class="space-y-2">
|
||||
{% for val, label in ausschreibung.TEILNAHME_CHOICES %}
|
||||
<label class="flex items-center gap-3 cursor-pointer p-2 rounded hover:bg-slate-50">
|
||||
<input type="radio" name="teilnahmeentscheidung" value="{{ val }}"
|
||||
{% if ausschreibung.teilnahmeentscheidung == val %}checked{% endif %}
|
||||
class="text-brand-600">
|
||||
<span class="text-sm font-medium text-slate-700">{{ label }}</span>
|
||||
</label>
|
||||
{% endfor %}
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Begründung</label>
|
||||
<textarea name="begruendung" rows="3" class="form-input">{{ ausschreibung.entscheidungsbegruendung }}</textarea>
|
||||
</div>
|
||||
<div class="flex gap-3">
|
||||
<button type="submit" class="btn-primary">Speichern</button>
|
||||
<a href="{% url 'ausschreibungen:detail' ausschreibung.pk %}" class="btn-ghost">Abbrechen</a>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
{% endblock %}
|
||||
125
vergabe_teilnahme/templates/ausschreibungen/form.html
Normal file
125
vergabe_teilnahme/templates/ausschreibungen/form.html
Normal file
|
|
@ -0,0 +1,125 @@
|
|||
{% extends "base.html" %}
|
||||
{% block title %}{{ titel }}{% endblock %}
|
||||
{% block content %}
|
||||
<h1 class="page-title mb-6">{{ titel }}</h1>
|
||||
|
||||
<form method="post" class="max-w-2xl space-y-6">
|
||||
{% csrf_token %}
|
||||
{% if historisch %}
|
||||
<input type="hidden" name="historisch_erfassen" value="1">
|
||||
{% endif %}
|
||||
|
||||
<div class="card space-y-4">
|
||||
<h2 class="text-sm font-semibold text-slate-700 uppercase tracking-wide">Stammdaten</h2>
|
||||
<div>
|
||||
<label class="form-label">Titel *</label>
|
||||
{{ form.titel }}
|
||||
{% if form.titel.errors %}<p class="text-red-600 text-xs mt-1">{{ form.titel.errors.0 }}</p>{% endif %}
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label class="form-label">Ausschreiber *</label>
|
||||
{{ form.ausschreiber }}
|
||||
{% if form.ausschreiber.errors %}<p class="text-red-600 text-xs mt-1">{{ form.ausschreiber.errors.0 }}</p>{% endif %}
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Vergabeart</label>
|
||||
{{ form.vergabeart }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label class="form-label">Vergabeplattform</label>
|
||||
{{ form.vergabeplattform }}
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Vergabenummer</label>
|
||||
{{ form.vergabenummer }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Fundstelle (URL)</label>
|
||||
{{ form.fundstelle_url }}
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Bid Manager</label>
|
||||
{{ form.bid_manager }}
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Leistungsbeschreibung</label>
|
||||
{{ form.leistungsbeschreibung }}
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label class="form-label">Branche</label>
|
||||
{{ form.branche }}
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Schlagwörter</label>
|
||||
{{ form.schlagwoerter }}
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Geschätztes Volumen (€)</label>
|
||||
{{ form.geschaetztes_volumen }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="card space-y-4">
|
||||
<h2 class="text-sm font-semibold text-slate-700 uppercase tracking-wide">Fristen</h2>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label class="form-label">Veröffentlichungsdatum</label>
|
||||
{{ form.veroeffentlichungsdatum }}
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Bieterfragen bis</label>
|
||||
{{ form.bieterfragen_bis }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div>
|
||||
<label class="form-label">Abgabe bis</label>
|
||||
{{ form.abgabe_bis }}
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Bindefrist</label>
|
||||
{{ form.bindefrist }}
|
||||
</div>
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-4">
|
||||
<div class="flex items-center gap-2">
|
||||
{{ form.unterlagen_erhalten }}
|
||||
<label class="text-sm text-slate-600">Unterlagen erhalten</label>
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Unterlagen erhalten am</label>
|
||||
{{ form.unterlagen_erhalten_am }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{% if historisch %}
|
||||
<div class="card space-y-4">
|
||||
<h2 class="text-sm font-semibold text-slate-700 uppercase tracking-wide">Historische Erfassung</h2>
|
||||
<div>
|
||||
<label class="form-label">Teilnahmeentscheidung</label>
|
||||
{{ form.teilnahmeentscheidung }}
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Begründung</label>
|
||||
{{ form.entscheidungsbegruendung }}
|
||||
</div>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="flex gap-3">
|
||||
<button type="submit" class="btn-primary">Speichern</button>
|
||||
{% if ausschreibung %}
|
||||
<a href="{% url 'ausschreibungen:detail' ausschreibung.pk %}" class="btn-ghost">Abbrechen</a>
|
||||
{% else %}
|
||||
<a href="{% url 'ausschreibungen:liste' %}" class="btn-ghost">Abbrechen</a>
|
||||
{% endif %}
|
||||
</div>
|
||||
</form>
|
||||
{% endblock %}
|
||||
47
vergabe_teilnahme/templates/ausschreibungen/liste.html
Normal file
47
vergabe_teilnahme/templates/ausschreibungen/liste.html
Normal file
|
|
@ -0,0 +1,47 @@
|
|||
{% extends "base.html" %}
|
||||
{% load vergabe_tags %}
|
||||
{% block title %}Ausschreibungen{% endblock %}
|
||||
{% block content %}
|
||||
<div class="flex items-center justify-between mb-5">
|
||||
<h1 class="page-title">Ausschreibungen</h1>
|
||||
<a href="{% url 'ausschreibungen:neu' %}" class="btn-primary">+ Neue Ausschreibung</a>
|
||||
</div>
|
||||
|
||||
<!-- Filter bar -->
|
||||
<div class="card mb-4">
|
||||
<form id="filter-form"
|
||||
hx-get="{% url 'ausschreibungen:liste' %}"
|
||||
hx-target="#ausschreibungen-table"
|
||||
hx-push-url="true"
|
||||
hx-trigger="change from:select, change from:input[type=checkbox]"
|
||||
class="flex flex-wrap gap-3 items-end">
|
||||
<div>
|
||||
<label class="form-label">Status</label>
|
||||
<select name="status" class="form-input">
|
||||
<option value="">Alle Status</option>
|
||||
{% for val, label in status_choices %}
|
||||
<option value="{{ val }}" {% if current_status == val|stringformat:"s" %}selected{% endif %}>{{ label }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div>
|
||||
<label class="form-label">Bid Manager</label>
|
||||
<select name="bid_manager" class="form-input">
|
||||
<option value="">Alle</option>
|
||||
{% for m in mitarbeiter %}
|
||||
<option value="{{ m.pk }}" {% if current_bid_manager == m.pk|stringformat:"s" %}selected{% endif %}>{{ m.get_full_name|default:m.username }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
<div class="flex items-center gap-2 pb-1">
|
||||
<input type="checkbox" id="archiviert" name="archiviert" value="1" class="h-4 w-4 rounded border-slate-300 text-brand-600"
|
||||
{% if archiviert %}checked{% endif %}>
|
||||
<label for="archiviert" class="text-sm text-slate-600">Archivierte anzeigen</label>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<div id="ausschreibungen-table">
|
||||
{% include "ausschreibungen/liste_partial.html" %}
|
||||
</div>
|
||||
{% endblock %}
|
||||
|
|
@ -0,0 +1,42 @@
|
|||
{% load vergabe_tags %}
|
||||
{% if ausschreibungen %}
|
||||
<div class="card overflow-hidden p-0">
|
||||
<table class="w-full text-sm">
|
||||
<thead class="bg-slate-50 border-b border-slate-200">
|
||||
<tr>
|
||||
<th class="text-left px-4 py-2 font-medium text-slate-600">Titel</th>
|
||||
<th class="text-left px-4 py-2 font-medium text-slate-600">Ausschreiber</th>
|
||||
<th class="text-left px-4 py-2 font-medium text-slate-600">Status</th>
|
||||
<th class="text-left px-4 py-2 font-medium text-slate-600">Abgabe</th>
|
||||
<th class="text-left px-4 py-2 font-medium text-slate-600">Bid Manager</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody class="divide-y divide-slate-100">
|
||||
{% for a in ausschreibungen %}
|
||||
<tr class="hover:bg-slate-50">
|
||||
<td class="px-4 py-2">
|
||||
<a href="{% url 'ausschreibungen:detail' a.pk %}" class="text-brand-700 hover:underline font-medium">
|
||||
{{ a.titel }}
|
||||
</a>
|
||||
</td>
|
||||
<td class="px-4 py-2 text-slate-600">{{ a.ausschreiber }}</td>
|
||||
<td class="px-4 py-2">
|
||||
{% status_badge a.status a.get_status_display %}
|
||||
</td>
|
||||
<td class="px-4 py-2 {% if a.abgabe_bis and a.abgabe_bis.date <= today %}text-red-600 font-medium{% elif a.abgabe_bis %}text-amber-600{% else %}text-slate-400{% endif %}">
|
||||
{% if a.abgabe_bis %}{{ a.abgabe_bis|date:"d.m.Y H:i" }}{% else %}—{% endif %}
|
||||
</td>
|
||||
<td class="px-4 py-2 text-slate-600">
|
||||
{% if a.bid_manager %}{{ a.bid_manager.get_full_name|default:a.bid_manager.username }}{% else %}—{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="card text-center text-slate-400 py-10">
|
||||
Keine Ausschreibungen gefunden.
|
||||
<a href="{% url 'ausschreibungen:neu' %}" class="ml-2 text-brand-600 hover:underline">Jetzt anlegen</a>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
|
@ -0,0 +1,15 @@
|
|||
{% load vergabe_tags %}
|
||||
<div id="status-widget-{{ ausschreibung.pk }}"
|
||||
class="flex items-center gap-2">
|
||||
{% status_badge ausschreibung.status ausschreibung.get_status_display %}
|
||||
<select name="status"
|
||||
hx-post="{% url 'ausschreibungen:status' ausschreibung.pk %}"
|
||||
hx-target="#status-widget-{{ ausschreibung.pk }}"
|
||||
hx-swap="outerHTML"
|
||||
hx-trigger="change"
|
||||
class="form-input text-xs py-0.5 h-7 w-auto">
|
||||
{% for val, label in ausschreibung.STATUS_CHOICES %}
|
||||
<option value="{{ val }}" {% if val == ausschreibung.status %}selected{% endif %}>{{ label }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
</div>
|
||||
Loading…
Add table
Add a link
Reference in a new issue