add tagging

This commit is contained in:
team 1
2026-02-21 16:23:34 +01:00
parent 5a3852db12
commit cf5b473034
23 changed files with 1984 additions and 85 deletions

View File

@@ -67,6 +67,14 @@
Dokumente
</a>
{# ------------------------- #}
{# Tags (Document Routing) #}
{# ------------------------- #}
<a class="nav-link text-light {% if route starts with 'admin_tags' %}active fw-bold{% endif %}"
href="{{ path('admin_tags_index') }}">
Tags
</a>
<a class="nav-link text-light {% if route starts with 'admin_job' %}active fw-bold{% endif %}"
href="{{ path('admin_jobs') }}">
Ingest Jobs
@@ -119,4 +127,4 @@
</div>
</body>
</html>
</html>

View File

@@ -119,6 +119,11 @@
{# Aktionen #}
<td class="text-end">
<a class="btn btn-sm btn-outline-info me-2"
href="{{ path('admin_document_tags_edit', {id: document.id}) }}">
Tags
</a>
<a class="btn btn-sm btn-outline-light me-2"
href="{{ path('admin_document_show', {id: document.id}) }}">
Details
@@ -158,4 +163,4 @@
erfordert eine Aktualisierung des NDJSON-Indexes.
</div>
{% endblock %}
{% endblock %}

View File

@@ -0,0 +1,99 @@
{% extends 'admin/base.html.twig' %}
{% block title %}Tags {{ document.title }}{% endblock %}
{% block body %}
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3 mb-0">
Tags für Dokument
<span class="text-info">{{ document.title }}</span>
</h1>
<a href="{{ path('admin_documents') }}"
class="btn btn-sm btn-outline-light">
Zurück
</a>
</div>
{# ============================================= #}
{# Bereits zugewiesene Tags #}
{# ============================================= #}
<div class="card bg-black border-secondary mb-4">
<div class="card-body">
<h5 class="text-info mb-3">Zugewiesene Tags</h5>
{% if document.tags is empty %}
<div class="alert alert-secondary mb-0">
Dieses Dokument hat noch keine Tags.
</div>
{% else %}
<div class="d-flex flex-wrap gap-2">
{% for tag in document.tags %}
<span class="badge bg-info text-dark px-3 py-2">
{{ tag.label }}
</span>
{% endfor %}
</div>
{% endif %}
</div>
</div>
{# ============================================= #}
{# Tag-Zuweisung Formular #}
{# ============================================= #}
<div class="card bg-black border-secondary">
<div class="card-body">
<h5 class="text-info mb-3">Tags bearbeiten</h5>
<form method="post"
action="{{ path('admin_document_tags_save', {id: document.id}) }}">
<input type="hidden"
name="_token"
value="{{ csrf_token('admin_document_tags_save_' ~ document.id) }}">
<div class="row">
{% for tag in allTags %}
<div class="col-md-4 mb-2">
<div class="form-check">
<input
class="form-check-input"
type="checkbox"
name="tag_ids[]"
value="{{ tag.id }}"
id="tag_{{ tag.id }}"
{% if tag in document.tags %}checked{% endif %}
>
<label class="form-check-label"
for="tag_{{ tag.id }}">
{{ tag.label }}
</label>
</div>
</div>
{% endfor %}
</div>
<hr class="border-secondary">
<button type="submit"
class="btn btn-sm btn-outline-info">
Speichern
</button>
</form>
</div>
</div>
{% endblock %}

View File

@@ -0,0 +1,85 @@
{% extends 'admin/base.html.twig' %}
{% block title %}Tags{% endblock %}
{% block body %}
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3">Tags</h1>
</div>
{% for message in app.flashes('success') %}
<div class="alert alert-success">{{ message }}</div>
{% endfor %}
{% for message in app.flashes('danger') %}
<div class="alert alert-danger">{{ message }}</div>
{% endfor %}
<div class="card bg-black border-secondary mb-4 text-light">
<div class="card-body">
<h5 class="text-info mb-3">Neuen Tag erstellen</h5>
<form method="post" action="{{ path('admin_tags_create') }}" class="row g-2">
<input type="hidden" name="_token" value="{{ csrf_token('admin_tag_create') }}"/>
<div class="col-md-3">
<input class="form-control form-control-sm" name="label" placeholder="Label (z.B. Testomat 808)" required />
</div>
<div class="col-md-3">
<input class="form-control form-control-sm" name="slug" placeholder="Slug (z.B. testomat-808)" required />
</div>
<div class="col-md-4">
<input class="form-control form-control-sm" name="description" placeholder="Beschreibung (optional)" />
</div>
<div class="col-md-2 d-grid">
<button class="btn btn-sm btn-outline-info" type="submit">Anlegen</button>
</div>
<div class="col-12">
<small class="text-light">
Hinweis: Nach Änderungen an Tags/Zuweisungen bitte <code>bin/console mto:agent:tags:rebuild</code> ausführen.
</small>
</div>
</form>
</div>
</div>
<div class="card bg-black border-secondary text-light">
<div class="card-body p-0">
<table class="table table-dark table-striped table-hover mb-0 align-middle">
<thead class="table-secondary text-dark">
<tr>
<th>Label</th>
<th>Slug</th>
<th>Beschreibung</th>
<th class="text-end">Aktion</th>
</tr>
</thead>
<tbody>
{% for tag in tags %}
<tr>
<td>{{ tag.label }}</td>
<td><code>{{ tag.slug }}</code></td>
<td class="text-muted">{{ tag.description ?: '' }}</td>
<td class="text-end">
<form method="post" action="{{ path('admin_tags_delete', {id: tag.id}) }}" style="display:inline">
<input type="hidden" name="_token" value="{{ csrf_token('admin_tag_delete_' ~ tag.id) }}"/>
<button class="btn btn-sm btn-outline-danger" type="submit"
onclick="return confirm('Tag wirklich löschen? (Zuweisungen werden mit gelöscht)')">
Löschen
</button>
</form>
</td>
</tr>
{% else %}
<tr><td colspan="4" class="text-light p-3">Noch keine Tags vorhanden.</td></tr>
{% endfor %}
</tbody>
</table>
</div>
</div>
{% endblock %}