p96 follow up

This commit is contained in:
team 1
2026-05-11 15:39:00 +02:00
parent 3e678c659c
commit f098a1a244
25 changed files with 790 additions and 131 deletions

View File

@@ -77,23 +77,27 @@
RAG Dokumente & Wissen
</div>
<a class="nav-link text-light {% if route starts with 'admin_document' %}active fw-bold{% endif %}"
href="{{ path('admin_documents') }}">
<i class="bi bi-card-list"></i> Dokumente
</a>
{% if is_granted('ROLE_EDITOR') %}
<a class="nav-link text-light {% if route starts with 'admin_document' %}active fw-bold{% endif %}"
href="{{ path('admin_documents') }}">
<i class="bi bi-card-list"></i> 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') }}">
<i class="bi bi-tag-fill"></i> Tags
</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') }}">
<i class="bi bi-tag-fill"></i> Tags
</a>
{% endif %}
<a class="nav-link text-light {% if route starts with 'admin_system_agent' %}active fw-bold{% endif %}"
href="{{ path('admin_system_agent') }}">
<i class="bi bi-robot"></i> Wissensbasis (Chunk-Index)
</a>
{% if is_granted('ROLE_SUPER_ADMIN') %}
<a class="nav-link text-light {% if route starts with 'admin_system_agent' %}active fw-bold{% endif %}"
href="{{ path('admin_system_agent') }}">
<i class="bi bi-robot"></i> Wissensbasis (Chunk-Index)
</a>
{% endif %}
<hr class="border-secondary">
@@ -101,15 +105,19 @@
RAG System-Profile
</div>
<a class="nav-link text-light {% if route starts with 'admin_system_prompt' %}active fw-bold{% endif %}"
href="{{ path('admin_system_prompt') }}">
<i class="bi bi-chat-right-dots-fill"></i> System Prompt
</a>
{% if is_granted('ROLE_SUPER_ADMIN') %}
<a class="nav-link text-light {% if route starts with 'admin_system_prompt' %}active fw-bold{% endif %}"
href="{{ path('admin_system_prompt') }}">
<i class="bi bi-chat-right-dots-fill"></i> System Prompt
</a>
{% endif %}
<a class="nav-link text-light {% if route starts with 'admin_ingest_profile' %}active fw-bold{% endif %}"
href="{{ path('admin_ingest_profile_list') }}">
<i class="bi bi-search"></i> Indexierungsprofile (Ingest)
</a>
{% if is_granted('ROLE_KNOWLEDGE_ADMIN') %}
<a class="nav-link text-light {% if route starts with 'admin_ingest_profile' %}active fw-bold{% endif %}"
href="{{ path('admin_ingest_profile_list') }}">
<i class="bi bi-search"></i> Indexierungsprofile (Ingest)
</a>
{% endif %}
<hr class="border-secondary">
@@ -117,14 +125,16 @@
KI-Endpunkte
</div>
<a class="nav-link text-light {% if route starts with 'admin_model_config' %}active fw-bold{% endif %}"
href="{{ path('admin_model_config_list') }}">
<i class="bi bi-rocket-takeoff-fill"></i> KI-/LLM-Setup
</a>
<a class="nav-link text-light {% if route starts with 'admin_model_config' %}active fw-bold{% endif %}"
href="{{ path('admin_model_config_list') }}#agentLiveTest">
<i class="bi bi-rocket-takeoff-fill"></i> KI-Agent Live-Test
</a>
{% if is_granted('ROLE_KNOWLEDGE_ADMIN') %}
<a class="nav-link text-light {% if route starts with 'admin_model_config' %}active fw-bold{% endif %}"
href="{{ path('admin_model_config_list') }}">
<i class="bi bi-rocket-takeoff-fill"></i> KI-/LLM-Setup
</a>
<a class="nav-link text-light {% if route starts with 'admin_model_config' %}active fw-bold{% endif %}"
href="{{ path('admin_model_config_list') }}#agentLiveTest">
<i class="bi bi-rocket-takeoff-fill"></i> KI-Agent Live-Test
</a>
{% endif %}
<hr class="border-secondary">
<div class="text-info text-uppercase small mb-2">
System-Guiide
@@ -142,14 +152,16 @@
href="{{ path('admin_jobs') }}">
<i class="bi bi-terminal"></i> Indexierungs-Log (Ingest Jobs)
</a>
<a class="nav-link text-light {% if route starts with 'admin_job' %}active fw-bold{% endif %}"
href="{{ path('admin_vector_log') }}">
<i class="bi bi-terminal"></i> Vector-Log Python
</a>
<a class="nav-link text-light {% if route starts with 'admin_job' %}active fw-bold{% endif %}"
href="{{ path('admin_system_logs_index') }}">
<i class="bi bi-terminal"></i> System-Logs
</a>
{% if is_granted('ROLE_SUPER_ADMIN') %}
<a class="nav-link text-light {% if route starts with 'admin_vector_log' %}active fw-bold{% endif %}"
href="{{ path('admin_vector_log') }}">
<i class="bi bi-terminal"></i> Vector-Log Python
</a>
<a class="nav-link text-light {% if route starts with 'admin_system_logs' %}active fw-bold{% endif %}"
href="{{ path('admin_system_logs_index') }}">
<i class="bi bi-terminal"></i> System-Logs
</a>
{% endif %}
</nav>
</aside>

View File

@@ -226,19 +226,25 @@
physischen Retrieval-Artefakte wieder gerade.
</div>
<form method="post"
action="{{ path('admin_global_reindex') }}"
onsubmit="return confirm('Global Reindex starten? Dies kann mehrere Minuten dauern.');">
{% if is_granted('ROLE_SUPER_ADMIN') %}
<form method="post"
action="{{ path('admin_global_reindex') }}"
onsubmit="return confirm('Global Reindex starten? Dies kann mehrere Minuten dauern.');">
<input type="hidden"
name="_token"
value="{{ csrf_token('global_reindex') }}">
<input type="hidden"
name="_token"
value="{{ csrf_token('global_reindex') }}">
<button type="submit"
class="btn btn-sm btn-outline-info">
Global Reindex starten
</button>
</form>
<button type="submit"
class="btn btn-sm btn-outline-info">
Global Reindex starten
</button>
</form>
{% else %}
<div class="alert alert-dark border border-secondary text-light small mb-0">
Global Reindex ist Super-Admins vorbehalten.
</div>
{% endif %}
{% if anyHealthIssue %}
<div class="alert alert-dark border border-warning text-light small mt-3 mb-0">

View File

@@ -14,10 +14,12 @@
</div>
</div>
<a href="{{ path('admin_document_new') }}"
class="btn btn-sm btn-outline-info">
Neues Dokument
</a>
{% if is_granted('ROLE_EDITOR') %}
<a href="{{ path('admin_document_new') }}"
class="btn btn-sm btn-outline-info">
Neues Dokument
</a>
{% endif %}
</div>
{% for message in app.flashes('success') %}
@@ -189,10 +191,12 @@
<td class="text-end">
<div class="d-flex justify-content-end flex-wrap gap-2">
<a class="btn btn-sm btn-outline-info"
href="{{ path('admin_document_tags_edit', {id: document.id}) }}">
Tags
</a>
{% if is_granted('ROLE_EDITOR') %}
<a class="btn btn-sm btn-outline-info"
href="{{ path('admin_document_tags_edit', {id: document.id}) }}">
Tags
</a>
{% endif %}
<a class="btn btn-sm btn-outline-light"
href="{{ path('admin_document_show', {id: document.id}) }}">

View File

@@ -138,7 +138,7 @@
</div>
</div>
{% if is_granted('ROLE_SUPER_ADMIN') %}
{% if is_granted('ROLE_EDITOR') %}
<div class="d-flex justify-content-end">
<button class="btn btn-outline-info">
Version hochladen

View File

@@ -13,10 +13,12 @@
</div>
<div class="d-flex flex-wrap gap-2">
<a href="{{ path('admin_document_tags_edit', {id: document.id}) }}"
class="btn btn-sm btn-outline-info">
Tags bearbeiten
</a>
{% if is_granted('ROLE_EDITOR') %}
<a href="{{ path('admin_document_tags_edit', {id: document.id}) }}"
class="btn btn-sm btn-outline-info">
Tags bearbeiten
</a>
{% endif %}
<a href="{{ path('admin_documents') }}"
class="btn btn-sm btn-outline-secondary">
@@ -96,26 +98,30 @@
</div>
</div>
{% if is_granted('ROLE_SUPER_ADMIN') %}
{% if is_granted('ROLE_EDITOR') or is_granted('ROLE_SUPER_ADMIN') %}
<hr class="border-secondary">
<div class="d-flex flex-wrap gap-2">
<a href="{{ path('admin_document_version_new', {id: document.id}) }}"
class="btn btn-sm btn-outline-info">
Neue Version
</a>
{% if is_granted('ROLE_EDITOR') %}
<a href="{{ path('admin_document_version_new', {id: document.id}) }}"
class="btn btn-sm btn-outline-info">
Neue Version
</a>
{% endif %}
<form method="post"
action="{{ path('admin_document_delete', {id: document.id}) }}"
class="d-inline"
onsubmit="return confirm('Dokument wirklich löschen? Der Inhalt wird per Delete-Job aus dem Index entfernt.');">
<input type="hidden"
name="_token"
value="{{ csrf_token('delete_document_' ~ document.id) }}">
<button class="btn btn-sm btn-outline-danger">
Dokument löschen
</button>
</form>
{% if is_granted('ROLE_SUPER_ADMIN') %}
<form method="post"
action="{{ path('admin_document_delete', {id: document.id}) }}"
class="d-inline"
onsubmit="return confirm('Dokument wirklich löschen? Der Inhalt wird per Delete-Job aus dem Index entfernt.');">
<input type="hidden"
name="_token"
value="{{ csrf_token('delete_document_' ~ document.id) }}">
<button class="btn btn-sm btn-outline-danger">
Dokument löschen
</button>
</form>
{% endif %}
</div>
{% endif %}
</div>
@@ -128,10 +134,12 @@
<div class="d-flex justify-content-between align-items-center mb-3">
<h5 class="text-info mb-0">Tags</h5>
<a href="{{ path('admin_document_tags_edit', {id: document.id}) }}"
class="btn btn-sm btn-outline-light">
Bearbeiten
</a>
{% if is_granted('ROLE_EDITOR') %}
<a href="{{ path('admin_document_tags_edit', {id: document.id}) }}"
class="btn btn-sm btn-outline-light">
Bearbeiten
</a>
{% endif %}
</div>
{% if document.tags is empty %}
@@ -172,7 +180,7 @@
</div>
</div>
{% if is_granted('ROLE_SUPER_ADMIN') %}
{% if is_granted('ROLE_EDITOR') %}
<a href="{{ path('admin_document_version_new', {id: document.id}) }}"
class="btn btn-sm btn-outline-info">
Neue Version
@@ -258,7 +266,7 @@
<td class="text-end">
<div class="d-flex justify-content-end flex-wrap gap-2">
{% if version.isActive %}
{% if version.ingestStatus in ['PENDING', 'FAILED'] and is_granted('ROLE_SUPER_ADMIN') %}
{% if version.ingestStatus in ['PENDING', 'FAILED'] and is_granted('ROLE_EDITOR') %}
<form method="post"
action="{{ path('admin_document_version_ingest', {versionId: version.id}) }}"
class="d-inline"
@@ -276,7 +284,7 @@
</span>
{% endif %}
{% else %}
{% if is_granted('ROLE_SUPER_ADMIN') %}
{% if is_granted('ROLE_EDITOR') %}
<form method="post"
action="{{ path('admin_document_version_activate', {versionId: version.id}) }}"
class="d-inline"

View File

@@ -28,10 +28,12 @@
<div class="d-flex justify-content-between align-items-center mb-4">
<h1 class="h3"><i class="bi bi-search"></i> Indexierungsprofile</h1>
<a class="btn btn-sm btn-outline-info"
href="{{ path('admin_ingest_profile_create') }}">
Neues Profil anlegen
</a>
{% if is_granted('ROLE_SUPER_ADMIN') %}
<a class="btn btn-sm btn-outline-info"
href="{{ path('admin_ingest_profile_create') }}">
Neues Profil anlegen
</a>
{% endif %}
</div>
{# ========================================================= #}

View File

@@ -106,9 +106,10 @@
});
</script>
<div class="card bg-black border-secondary text-light mb-4 shadow-sm">
<div class="card-body">
<h5 class="text-info mb-3">Neuen Tag hinzufügen</h5>
{% if is_granted('ROLE_EDITOR') %}
<div class="card bg-black border-secondary text-light mb-4 shadow-sm">
<div class="card-body">
<h5 class="text-info mb-3">Neuen Tag hinzufügen</h5>
<form method="post" action="{{ path('admin_tags_create') }}" class="row g-3">
<input type="hidden" name="_token" value="{{ csrf_token('admin_tag_create') }}"/>
@@ -154,8 +155,9 @@
</button>
</div>
</form>
</div>
</div>
</div>
{% endif %}
<div class="card bg-black border-secondary text-light shadow-sm">
<div class="card-body">
@@ -207,23 +209,27 @@
</td>
<td>{{ tag.description ?: '-' }}</td>
<td class="text-end">
<a href="{{ path('admin_tags_assign', { id: tag.id }) }}"
class="btn btn-sm btn-outline-info me-2">
Zuweisen
</a>
{% if is_granted('ROLE_EDITOR') %}
<a href="{{ path('admin_tags_assign', { id: tag.id }) }}"
class="btn btn-sm btn-outline-info me-2">
Zuweisen
</a>
<form method="post"
action="{{ path('admin_tags_delete', {id: tag.id}) }}"
style="display:inline-block;">
<input type="hidden"
name="_token"
value="{{ csrf_token('admin_tag_delete_' ~ tag.id) }}"/>
<form method="post"
action="{{ path('admin_tags_delete', {id: tag.id}) }}"
style="display:inline-block;">
<input type="hidden"
name="_token"
value="{{ csrf_token('admin_tag_delete_' ~ tag.id) }}"/>
<button class="btn btn-sm btn-outline-danger"
onclick="return confirm('Tag wirklich löschen? Zuweisungen werden entfernt.')">
Löschen
</button>
</form>
<button class="btn btn-sm btn-outline-danger"
onclick="return confirm('Tag wirklich löschen? Zuweisungen werden entfernt.')">
Löschen
</button>
</form>
{% else %}
<span class="text-muted small">Nur Ansicht</span>
{% endif %}
</td>
</tr>
{% else %}