fix: Neubewertungs-Button im Explorer hinzugefügt

This commit is contained in:
Dotty Dotter 2026-04-01 21:21:01 +02:00
parent a3e4dab633
commit 9615ddd51f

View File

@ -1,6 +1,6 @@
<script lang="ts"> <script lang="ts">
import { onMount } from 'svelte'; import { onMount } from 'svelte';
import { fetchKetten, fetchKette, fetchVorlage, type KetteKurz, type KetteDetail, type VorlageDetail, type Paginated } from '$lib/api'; import { fetchKetten, fetchKette, fetchVorlage, reevalVorlage, fetchJobStatus, type KetteKurz, type KetteDetail, type VorlageDetail, type Paginated } from '$lib/api';
import { formatDate, typLabel } from '$lib/status'; import { formatDate, typLabel } from '$lib/status';
import { filters, mergeFilterParams, filterVersion } from '$lib/filters.svelte'; import { filters, mergeFilterParams, filterVersion } from '$lib/filters.svelte';
import Ampel from '$lib/components/Ampel.svelte'; import Ampel from '$lib/components/Ampel.svelte';
@ -31,6 +31,40 @@
let mobileTab = $state<'liste' | 'kette' | 'detail'>('liste'); let mobileTab = $state<'liste' | 'kette' | 'detail'>('liste');
let showVolltext = $state(false); let showVolltext = $state(false);
let showVersionen = $state(false); let showVersionen = $state(false);
let showReeval = $state(false);
let reevalAnmerkung = $state('');
let reevalStatus = $state<'idle' | 'running' | 'done' | 'error'>('idle');
let reevalError = $state('');
async function triggerReeval() {
if (!selectedVorlage) return;
reevalStatus = 'running';
reevalError = '';
try {
const { job_id } = await reevalVorlage(selectedVorlage.id, reevalAnmerkung);
for (let i = 0; i < 60; i++) {
await new Promise(r => setTimeout(r, 3000));
const status = await fetchJobStatus(job_id);
if (status.status === 'done') {
reevalStatus = 'done';
selectedVorlage = await fetchVorlage(selectedVorlage!.id);
showReeval = false;
reevalAnmerkung = '';
return;
}
if (status.status === 'error') {
reevalStatus = 'error';
reevalError = status.error || 'Unbekannter Fehler';
return;
}
}
reevalStatus = 'error';
reevalError = 'Timeout nach 3 Minuten';
} catch (e) {
reevalStatus = 'error';
reevalError = e instanceof Error ? e.message : 'Fehler';
}
}
const STRANG_TABS = [ const STRANG_TABS = [
{ value: '', label: 'Alle' }, { value: '', label: 'Alle' },
@ -489,6 +523,44 @@
</div> </div>
{/if} {/if}
<!-- Neu bewerten -->
<div class="rounded-xl border border-gray-200 p-4">
{#if !showReeval}
<button onclick={() => showReeval = true}
class="text-sm text-green-600 hover:text-green-800 font-medium flex items-center gap-1.5">
<span>🔄</span> Neu bewerten lassen
</button>
{:else}
<h3 class="text-sm font-semibold text-gray-900 mb-2">KI-Neubewertung anstoßen</h3>
<textarea bind:value={reevalAnmerkung} placeholder="Anmerkungen für die KI (optional)"
class="w-full border border-gray-300 rounded-lg px-3 py-2 text-sm mb-3 h-20 resize-y focus:ring-2 focus:ring-green-500"
disabled={reevalStatus === 'running'}></textarea>
<div class="flex gap-2 items-center">
<button onclick={triggerReeval} disabled={reevalStatus === 'running'}
class="bg-green-600 text-white px-4 py-2 rounded-lg text-sm font-medium hover:bg-green-700 disabled:opacity-50 transition-colors">
{#if reevalStatus === 'running'}
<span class="inline-flex items-center gap-2">
<span class="animate-spin h-4 w-4 border-2 border-white border-t-transparent rounded-full"></span>
KI bewertet…
</span>
{:else}
Bewertung starten
{/if}
</button>
{#if reevalStatus !== 'running'}
<button onclick={() => { showReeval = false; reevalStatus = 'idle'; }}
class="text-sm text-gray-500 hover:text-gray-700">Abbrechen</button>
{/if}
</div>
{#if reevalStatus === 'done'}
<p class="mt-2 text-sm text-green-700 font-medium">✅ Bewertung aktualisiert!</p>
{/if}
{#if reevalStatus === 'error'}
<p class="mt-2 text-sm text-red-600">{reevalError}</p>
{/if}
{/if}
</div>
<!-- Volltext --> <!-- Volltext -->
{#if selectedVorlage.volltext_clean} {#if selectedVorlage.volltext_clean}
<div class="rounded-xl border border-gray-200 p-5"> <div class="rounded-xl border border-gray-200 p-5">