E-Mail: KI-Absage generieren (andere Stelle angenommen)

Im Antwort-Formular gibt es neben dem KI-Button jetzt ein Dropdown Antwort/Absage.
Für Absage formuliert die KI eine kurze, höfliche E-Mail: Bewerber hat eine andere
Stelle angenommen, bedankt sich, zieht sich aus dem Prozess zurück.

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2026-07-10 20:51:37 +02:00
co-authored by Claude
parent 0c7502cfd7
commit 0a0b0b4724
3 changed files with 88 additions and 34 deletions
+21 -8
View File
@@ -474,11 +474,17 @@
class="reply-subject w-full px-3 py-2 mb-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-800 dark:text-white text-sm">
<div class="flex items-center justify-between mb-1">
<label class="block text-xs font-medium text-gray-500 dark:text-gray-400">Nachricht</label>
<button type="button" class="ai-reply-btn inline-flex items-center gap-1 text-xs text-purple-600 hover:text-purple-800 dark:text-purple-400 hover:underline"
data-email-id="<%= e.id %>" data-app-id="<%= application.id %>" data-target="reply-<%= e.id %>">
<svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
<span class="ai-reply-label">KI-Antwort generieren</span>
</button>
<div class="flex items-center gap-2">
<select class="ai-reply-typ text-xs px-1.5 py-0.5 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-700 dark:text-gray-200">
<option value="antwort">Antwort</option>
<option value="absage">Absage (andere Stelle)</option>
</select>
<button type="button" class="ai-reply-btn inline-flex items-center gap-1 text-xs text-purple-600 hover:text-purple-800 dark:text-purple-400 hover:underline"
data-email-id="<%= e.id %>" data-app-id="<%= application.id %>" data-target="reply-<%= e.id %>">
<svg class="w-3.5 h-3.5" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 10V3L4 14h7v7l9-11h-7z"></path></svg>
<span class="ai-reply-label">KI-Antwort generieren</span>
</button>
</div>
</div>
<textarea name="body" rows="12" required
class="reply-body w-full px-3 py-2 border border-gray-300 dark:border-gray-600 rounded-md bg-white dark:bg-gray-700 text-gray-800 dark:text-white text-sm leading-relaxed"><%= e.reply_quote ? '\n\n' + e.reply_quote : '' %></textarea>
@@ -849,10 +855,17 @@
// Generate an AI draft reply and drop it into the reply form.
document.querySelectorAll('.ai-reply-btn').forEach((btn) => {
const form = document.getElementById(btn.dataset.target);
const typSelect = form ? form.querySelector('.ai-reply-typ') : null;
const label = btn.querySelector('.ai-reply-label');
const syncLabel = () => {
if (!label || !typSelect) return;
label.textContent = typSelect.value === 'absage' ? 'KI-Absage generieren' : 'KI-Antwort generieren';
};
if (typSelect) { typSelect.addEventListener('change', syncLabel); syncLabel(); }
btn.addEventListener('click', async () => {
const form = document.getElementById(btn.dataset.target);
if (!form) return;
const label = btn.querySelector('.ai-reply-label');
const typ = typSelect ? typSelect.value : 'antwort';
const prev = label ? label.textContent : '';
if (label) label.textContent = 'Generiere …';
btn.disabled = true;
@@ -860,7 +873,7 @@
const res = await fetch('/bewerbung/' + btn.dataset.appId + '/email/ai-reply', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ email_id: btn.dataset.emailId }),
body: JSON.stringify({ email_id: btn.dataset.emailId, typ }),
});
const data = await res.json();
if (!res.ok) throw new Error(data.error || 'Fehler');