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:
+21
-8
@@ -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');
|
||||
|
||||
Reference in New Issue
Block a user