78 lines
2.2 KiB
JavaScript
78 lines
2.2 KiB
JavaScript
// UI-вспомогательные функции
|
|
|
|
function showStatus(message, kind) {
|
|
const el = document.getElementById('status');
|
|
el.style.display = 'block';
|
|
el.className = 'status ' + (kind || '');
|
|
el.textContent = message;
|
|
}
|
|
|
|
function clearStatus() {
|
|
const el = document.getElementById('status');
|
|
el.style.display = 'none';
|
|
el.className = 'status';
|
|
el.textContent = '';
|
|
}
|
|
|
|
function setText(id, value) {
|
|
document.getElementById(id).textContent = String(value);
|
|
}
|
|
|
|
function h(v) {
|
|
return String(v == null ? '' : v)
|
|
.replaceAll('&', '&')
|
|
.replaceAll('<', '<')
|
|
.replaceAll('>', '>')
|
|
.replaceAll('"', '"')
|
|
.replaceAll("'", ''');
|
|
}
|
|
|
|
function formatTimestamp(ts) {
|
|
if (!ts) return '—';
|
|
var d = new Date(ts);
|
|
if (isNaN(d.getTime())) return String(ts);
|
|
return d.toLocaleString('ru-RU', {
|
|
year: 'numeric',
|
|
month: '2-digit',
|
|
day: '2-digit',
|
|
hour: '2-digit',
|
|
minute: '2-digit',
|
|
second: '2-digit'
|
|
});
|
|
}
|
|
|
|
function timestampCell(ts) {
|
|
var text = formatTimestamp(ts);
|
|
return '<span class="mono" title="' + h(ts || '') + '">' + h(text) + '</span>';
|
|
}
|
|
|
|
// AI Ассистент
|
|
var _assistantOpen = true;
|
|
function toggleAssistant() {
|
|
_assistantOpen = !_assistantOpen;
|
|
document.getElementById('assistant-body').style.display = _assistantOpen ? 'flex' : 'none';
|
|
document.getElementById('assistant-toggle-icon').textContent = _assistantOpen ? '▲' : '▼';
|
|
}
|
|
|
|
async function askAssistant() {
|
|
var inp = document.getElementById('assistant-input');
|
|
var msgs = document.getElementById('assistant-messages');
|
|
var q = inp.value.trim();
|
|
if (!q) return;
|
|
inp.value = '';
|
|
msgs.textContent += '\n\n👤 ' + q + '\n⏳ ...';
|
|
msgs.scrollTop = msgs.scrollHeight;
|
|
try {
|
|
var r = await fetch('/console/api/ai/ask', {
|
|
method: 'POST',
|
|
headers: { 'Content-Type': 'application/json', ...authHeaders() },
|
|
body: JSON.stringify({ mode: 'chat', question: q })
|
|
});
|
|
var d = await r.json();
|
|
msgs.textContent = msgs.textContent.replace('⏳ ...', '🤖 ' + (d.answer || d.error || 'Нет ответа'));
|
|
} catch (e) {
|
|
msgs.textContent = msgs.textContent.replace('⏳ ...', '❌ Ошибка: ' + e.message);
|
|
}
|
|
msgs.scrollTop = msgs.scrollHeight;
|
|
}
|