add tagging
This commit is contained in:
@@ -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>
|
||||
@@ -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 %}
|
||||
99
templates/admin/document_tags/edit.html.twig
Normal file
99
templates/admin/document_tags/edit.html.twig
Normal 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 %}
|
||||
85
templates/admin/tag/index.html.twig
Normal file
85
templates/admin/tag/index.html.twig
Normal 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 %}
|
||||
Reference in New Issue
Block a user