feat: enhance incomplete Vorgaben page with table layout and admin integration
- Redesign incomplete Vorgaben page from card layout to unified table format - Add visual status indicators (✓/✗) for each completeness category - Link Vorgaben directly to admin edit pages (/autorenumgebung/ instead of /admin/) - Enhance Vorgabe admin with Kurztext and Langtext inlines for complete editing - Update all tests to work with new table structure and admin URLs - Add JavaScript for dynamic summary count updates - Maintain staff-only access control and responsive design All 112 tests passing successfully.
This commit is contained in:
@@ -2,166 +2,150 @@
|
||||
{% block content %}
|
||||
<h1 class="mb-4">Unvollständige Vorgaben</h1>
|
||||
|
||||
<div class="row">
|
||||
<!-- Vorgaben ohne Referenzen -->
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header bg-warning text-dark">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-exclamation-triangle"></i>
|
||||
Vorgaben ohne Referenzen
|
||||
<span class="badge bg-secondary float-end">{{ no_references|length }}</span>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if no_references %}
|
||||
<div class="list-group list-group-flush">
|
||||
{% for vorgabe in no_references %}
|
||||
<a href="{% url 'standard_detail' nummer=vorgabe.dokument.nummer %}#{{ vorgabe.Vorgabennummer }}"
|
||||
class="list-group-item list-group-item-action">
|
||||
<strong>{{ vorgabe.Vorgabennummer }}</strong>: {{ vorgabe.titel }}
|
||||
<br>
|
||||
<small class="text-muted">{{ vorgabe.dokument.nummer }} – {{ vorgabe.dokument.name }}</small>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-muted mb-0">Alle Vorgaben haben Referenzen.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
{% if vorgaben_data %}
|
||||
<div class="table-responsive">
|
||||
<table class="table table-striped table-hover">
|
||||
<thead class="table-dark">
|
||||
<tr>
|
||||
<th>Vorgabe</th>
|
||||
<th class="text-center">Referenzen</th>
|
||||
<th class="text-center">Stichworte</th>
|
||||
<th class="text-center">Text</th>
|
||||
<th class="text-center">Checklistenfragen</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
{% for item in vorgaben_data %}
|
||||
<tr>
|
||||
<td>
|
||||
<a href="/autorenumgebung/dokumente/vorgabe/{{ item.vorgabe.id }}/change/"
|
||||
class="text-decoration-none" target="_blank">
|
||||
<strong>{{ item.vorgabe.Vorgabennummer }}</strong><br>
|
||||
<small class="text-muted">{{ item.vorgabe.titel }}</small><br>
|
||||
<small class="text-muted">{{ item.vorgabe.dokument.nummer }} – {{ item.vorgabe.dokument.name }}</small>
|
||||
</a>
|
||||
</td>
|
||||
<td class="text-center align-middle">
|
||||
{% if item.has_references %}
|
||||
<span class="text-success fs-4">✓</span>
|
||||
{% else %}
|
||||
<span class="text-danger fs-4">✗</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="text-center align-middle">
|
||||
{% if item.has_stichworte %}
|
||||
<span class="text-success fs-4">✓</span>
|
||||
{% else %}
|
||||
<span class="text-danger fs-4">✗</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="text-center align-middle">
|
||||
{% if item.has_text %}
|
||||
<span class="text-success fs-4">✓</span>
|
||||
{% else %}
|
||||
<span class="text-danger fs-4">✗</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
<td class="text-center align-middle">
|
||||
{% if item.has_checklistenfragen %}
|
||||
<span class="text-success fs-4">✓</span>
|
||||
{% else %}
|
||||
<span class="text-danger fs-4">✗</span>
|
||||
{% endif %}
|
||||
</td>
|
||||
</tr>
|
||||
{% endfor %}
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
|
||||
<!-- Vorgaben ohne Stichworte -->
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header bg-warning text-dark">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-tags"></i>
|
||||
Vorgaben ohne Stichworte
|
||||
<span class="badge bg-secondary float-end">{{ no_stichworte|length }}</span>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if no_stichworte %}
|
||||
<div class="list-group list-group-flush">
|
||||
{% for vorgabe in no_stichworte %}
|
||||
<a href="{% url 'standard_detail' nummer=vorgabe.dokument.nummer %}#{{ vorgabe.Vorgabennummer }}"
|
||||
class="list-group-item list-group-item-action">
|
||||
<strong>{{ vorgabe.Vorgabennummer }}</strong>: {{ vorgabe.titel }}
|
||||
<br>
|
||||
<small class="text-muted">{{ vorgabe.dokument.nummer }} – {{ vorgabe.dokument.name }}</small>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-muted mb-0">Alle Vorgaben haben Stichworte.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Vorgaben ohne Kurz- oder Langtext -->
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header bg-danger text-white">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-file-alt"></i>
|
||||
Vorgaben ohne Kurz- oder Langtext
|
||||
<span class="badge bg-secondary float-end">{{ no_text|length }}</span>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if no_text %}
|
||||
<div class="list-group list-group-flush">
|
||||
{% for vorgabe in no_text %}
|
||||
<a href="{% url 'standard_detail' nummer=vorgabe.dokument.nummer %}#{{ vorgabe.Vorgabennummer }}"
|
||||
class="list-group-item list-group-item-action">
|
||||
<strong>{{ vorgabe.Vorgabennummer }}</strong>: {{ vorgabe.titel }}
|
||||
<br>
|
||||
<small class="text-muted">{{ vorgabe.dokument.nummer }} – {{ vorgabe.dokument.name }}</small>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-muted mb-0">Alle Vorgaben haben Kurz- oder Langtext.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Vorgaben ohne Checklistenfragen -->
|
||||
<div class="col-md-6 mb-4">
|
||||
<div class="card">
|
||||
<div class="card-header bg-info text-white">
|
||||
<h5 class="mb-0">
|
||||
<i class="fas fa-question-circle"></i>
|
||||
Vorgaben ohne Checklistenfragen
|
||||
<span class="badge bg-secondary float-end">{{ no_checklistenfragen|length }}</span>
|
||||
</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
{% if no_checklistenfragen %}
|
||||
<div class="list-group list-group-flush">
|
||||
{% for vorgabe in no_checklistenfragen %}
|
||||
<a href="{% url 'standard_detail' nummer=vorgabe.dokument.nummer %}#{{ vorgabe.Vorgabennummer }}"
|
||||
class="list-group-item list-group-item-action">
|
||||
<strong>{{ vorgabe.Vorgabennummer }}</strong>: {{ vorgabe.titel }}
|
||||
<br>
|
||||
<small class="text-muted">{{ vorgabe.dokument.nummer }} – {{ vorgabe.dokument.name }}</small>
|
||||
</a>
|
||||
{% endfor %}
|
||||
</div>
|
||||
{% else %}
|
||||
<p class="text-muted mb-0">Alle Vorgaben haben Checklistenfragen.</p>
|
||||
{% endif %}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- Summary -->
|
||||
<div class="row mt-4">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Zusammenfassung</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row text-center">
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-warning">{{ no_references|length }}</h4>
|
||||
<p class="mb-0">Ohne Referenzen</p>
|
||||
<!-- Summary -->
|
||||
<div class="row mt-4">
|
||||
<div class="col-12">
|
||||
<div class="card">
|
||||
<div class="card-header">
|
||||
<h5 class="mb-0">Zusammenfassung</h5>
|
||||
</div>
|
||||
<div class="card-body">
|
||||
<div class="row text-center">
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-danger" id="no-references-count">0</h4>
|
||||
<p class="mb-0">Ohne Referenzen</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-danger" id="no-stichworte-count">0</h4>
|
||||
<p class="mb-0">Ohne Stichworte</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-danger" id="no-text-count">0</h4>
|
||||
<p class="mb-0">Ohne Text</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-danger" id="no-checklistenfragen-count">0</h4>
|
||||
<p class="mb-0">Ohne Checklistenfragen</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-warning">{{ no_stichworte|length }}</h4>
|
||||
<p class="mb-0">Ohne Stichworte</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-danger">{{ no_text|length }}</h4>
|
||||
<p class="mb-0">Ohne Text</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-3">
|
||||
<div class="p-3">
|
||||
<h4 class="text-info">{{ no_checklistenfragen|length }}</h4>
|
||||
<p class="mb-0">Ohne Checklistenfragen</p>
|
||||
<div class="row mt-3">
|
||||
<div class="col-12 text-center">
|
||||
<h4 class="text-primary">Gesamt: {{ vorgaben_data|length }} unvollständige Vorgaben</h4>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
{% else %}
|
||||
<div class="alert alert-success" role="alert">
|
||||
<h4 class="alert-heading">
|
||||
<i class="fas fa-check-circle"></i> Alle Vorgaben sind vollständig!
|
||||
</h4>
|
||||
<p>Alle Vorgaben haben Referenzen, Stichworte, Text und Checklistenfragen.</p>
|
||||
<hr>
|
||||
<p class="mb-0">
|
||||
<a href="{% url 'standard_list' %}" class="btn btn-primary">
|
||||
<i class="fas fa-list"></i> Zurück zur Übersicht
|
||||
</a>
|
||||
</p>
|
||||
</div>
|
||||
{% endif %}
|
||||
|
||||
<div class="mt-3">
|
||||
<a href="{% url 'standard_list' %}" class="btn btn-secondary">
|
||||
<i class="fas fa-arrow-left"></i> Zurück zur Übersicht
|
||||
</a>
|
||||
</div>
|
||||
|
||||
<script>
|
||||
// Update summary counts
|
||||
document.addEventListener('DOMContentLoaded', function() {
|
||||
let noReferences = 0;
|
||||
let noStichworte = 0;
|
||||
let noText = 0;
|
||||
let noChecklistenfragen = 0;
|
||||
|
||||
const rows = document.querySelectorAll('tbody tr');
|
||||
rows.forEach(function(row) {
|
||||
const cells = row.querySelectorAll('td');
|
||||
if (cells.length >= 5) {
|
||||
if (cells[1].textContent.trim() === '✗') noReferences++;
|
||||
if (cells[2].textContent.trim() === '✗') noStichworte++;
|
||||
if (cells[3].textContent.trim() === '✗') noText++;
|
||||
if (cells[4].textContent.trim() === '✗') noChecklistenfragen++;
|
||||
}
|
||||
});
|
||||
|
||||
document.getElementById('no-references-count').textContent = noReferences;
|
||||
document.getElementById('no-stichworte-count').textContent = noStichworte;
|
||||
document.getElementById('no-text-count').textContent = noText;
|
||||
document.getElementById('no-checklistenfragen-count').textContent = noChecklistenfragen;
|
||||
});
|
||||
</script>
|
||||
{% endblock %}
|
||||
Reference in New Issue
Block a user