v1.8.0: YandexGPT-only NLP, unknown questions system, callback dedup, consent flow fixes, DELETE cascade, UTC+3, auto-detect sidebar menu, tel:/mailto: links

This commit is contained in:
2026-06-01 18:07:13 +03:00
parent aa1269e013
commit cc87bcf72c
20 changed files with 1453 additions and 301 deletions
@@ -44,12 +44,12 @@
<textarea name="assistant_role" id="assistant_role" placeholder="Описание роли бота..."></textarea>
<div class="hint">Будет использована для формирования системного промпта YandexGPT</div>
</div>
<div class="form-group">
<div class="form-group full-width">
<label>MAX-бот ID</label>
<input type="text" name="max_bot_id" id="max_bot_id" placeholder="Токен бота">
<div class="hint">Токен чат-бота из платформы MAX</div>
</div>
<div class="form-group">
<div class="form-group full-width">
<label>Email поддержки</label>
<input type="email" name="support_email" id="support_email" placeholder="zakaz@aegisone.ru">
<div class="hint">На этот email приходят уведомления о новых заявках</div>
@@ -60,7 +60,7 @@
<div class="hint">Тема email-уведомления об эскалации</div>
</div>
<div class="form-actions">
<button type="submit" class="btn btn-primary">Сохранить настройки</button>
<button type="button" class="btn btn-primary" onclick="saveSettings()">Сохранить настройки</button>
</div>
</div>
</form>
@@ -92,31 +92,28 @@ function switchTab(name){
}
}
document.getElementById('bot-settings-form').addEventListener('submit', function(e){
e.preventDefault();
function saveSettings(){
var data = {};
this.querySelectorAll('input, textarea').forEach(function(el){
document.querySelectorAll('#bot-settings-form input, #bot-settings-form textarea').forEach(function(el){
if(el.name) data[el.name] = el.value;
});
fetch('/service/api/bot/settings/save', {
method: 'POST', headers: {'Content-Type': 'application/json'},
body: JSON.stringify(data)
body: JSON.stringify(data), credentials: 'include'
}).then(function(r){ return r.json() }).then(function(d){
if(d.ok) showNotification('Настройки сохранены', 'success');
else showNotification('Ошибка: ' + (d.error || 'сохранения'), 'error');
}).catch(function(){
}).catch(function(err){
console.error('Save settings error:', err);
showNotification('Ошибка соединения', 'error');
});
});
}
fetch('/service/api/bot/settings').then(function(r){ return r.json() }).then(function(d){
['assistant_name','assistant_role','support_email','email_subject','max_bot_id'].forEach(function(k){
var el = document.getElementById(k);
if(el) el.value = d[k] || '';
});
if(document.getElementById('max_bot_id') && !document.getElementById('max_bot_id').value){
document.getElementById('max_bot_id').value = 'f9LHodD0cOKkk03DYXj906MdIeRs...';
}
});
</script>
{% endblock %}