Add AI text correction button to journal edit modal
This commit is contained in:
+56
-1
@@ -8,6 +8,7 @@ let page = 1;
|
||||
let totalEntries = 0;
|
||||
let searchTimer = null;
|
||||
let view = localStorage.getItem('journalView') === 'cards' ? 'cards' : 'list';
|
||||
let aiCorrecting = false;
|
||||
|
||||
function isImageFile(name) {
|
||||
return /\.(jpe?g|png|gif|webp|bmp|avif|svg|ico)$/i.test(name || '');
|
||||
@@ -190,6 +191,53 @@ function closeEdit() {
|
||||
editId = null;
|
||||
}
|
||||
|
||||
async function aiCorrect() {
|
||||
if (aiCorrecting) return;
|
||||
const textarea = document.getElementById('editDesc');
|
||||
const text = textarea.value.trim();
|
||||
if (!text) { showToast('Нет текста для исправления'); return; }
|
||||
const btn = document.getElementById('aiCorrectBtn');
|
||||
const modal = document.getElementById('aiCorrectModal');
|
||||
const suggestionEl = document.getElementById('aiSuggestion');
|
||||
aiCorrecting = true;
|
||||
btn.disabled = true;
|
||||
btn.textContent = '⏳';
|
||||
suggestionEl.textContent = 'Обработка...';
|
||||
modal.classList.add('open');
|
||||
try {
|
||||
const res = await fetch(`${API}/api/ai/correct`, {
|
||||
method: 'POST',
|
||||
headers: hdrJson(),
|
||||
body: JSON.stringify({ text })
|
||||
});
|
||||
if (!res.ok) {
|
||||
const err = await res.json();
|
||||
throw new Error(err.error || 'Ошибка ИИ');
|
||||
}
|
||||
const data = await res.json();
|
||||
suggestionEl.textContent = data.suggestion || text;
|
||||
} catch (e) {
|
||||
suggestionEl.textContent = 'Ошибка: ' + e.message;
|
||||
showToast('ИИ недоступен: ' + e.message);
|
||||
} finally {
|
||||
aiCorrecting = false;
|
||||
btn.disabled = false;
|
||||
btn.textContent = '✨';
|
||||
}
|
||||
}
|
||||
|
||||
function closeAiCorrect() {
|
||||
document.getElementById('aiCorrectModal').classList.remove('open');
|
||||
}
|
||||
|
||||
function acceptAiCorrect() {
|
||||
const suggestion = document.getElementById('aiSuggestion').textContent;
|
||||
if (suggestion && suggestion !== 'Обработка...' && !suggestion.startsWith('Ошибка:')) {
|
||||
document.getElementById('editDesc').value = suggestion;
|
||||
}
|
||||
closeAiCorrect();
|
||||
}
|
||||
|
||||
async function saveEdit() {
|
||||
if (!editId) return;
|
||||
const name = document.getElementById('editName').value.trim();
|
||||
@@ -209,7 +257,7 @@ async function saveEdit() {
|
||||
for (const f of files) formData.append('files', f);
|
||||
const uploadRes = await fetch(`${API}/api/entries/${editId}/files`, {
|
||||
method: 'POST',
|
||||
headers: { 'X-Admin-Token': token },
|
||||
headers: hdr(),
|
||||
body: formData
|
||||
});
|
||||
if (!uploadRes.ok) {
|
||||
@@ -388,6 +436,13 @@ document.getElementById('editFilesPreview').addEventListener('click', e => {
|
||||
if (btn) removeEditFile(parseInt(btn.dataset.removeFile, 10));
|
||||
});
|
||||
|
||||
document.getElementById('aiCorrectBtn').addEventListener('click', aiCorrect);
|
||||
document.getElementById('aiAcceptBtn').addEventListener('click', acceptAiCorrect);
|
||||
document.getElementById('aiRejectBtn').addEventListener('click', closeAiCorrect);
|
||||
document.getElementById('aiCorrectModal').addEventListener('click', e => {
|
||||
if (e.target === e.currentTarget) closeAiCorrect();
|
||||
});
|
||||
|
||||
document.getElementById('exportCsvBtn').addEventListener('click', exportCSV);
|
||||
document.getElementById('createLinkBtn').addEventListener('click', openLinkCreate);
|
||||
document.querySelectorAll('#viewToggle button').forEach(b => b.addEventListener('click', () => setView(b.dataset.view)));
|
||||
|
||||
Reference in New Issue
Block a user