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,29 +44,7 @@
</div>
<script>
var MENU_ITEMS = [
// Панель
{key: 'charts', label: 'Графики', section: 'Панель'},
{key: 'ceo', label: 'CEO дашборд', section: 'Панель'},
// Управление
{key: 'customers', label: 'Клиенты', section: 'Управление'},
{key: 'objects', label: 'Объекты', section: 'Управление'},
{key: 'sla', label: 'SLA контракты', section: 'Управление'},
{key: 'questionnaire', label: 'Опросник', section: 'Управление'},
{key: 'passports', label: 'Паспорта объектов', section: 'Управление'},
// Работа
{key: 'users', label: 'Сотрудники', section: 'Работа'},
{key: 'assignments', label: 'Назначение сотрудников', section: 'Работа'},
{key: 'docs', label: 'Просмотр документации', section: 'Работа'},
{key: 'tasks', label: 'Задачи', section: 'Работа'},
{key: 'reports', label: 'Отчёты', section: 'Работа'},
{key: 'incidents', label: 'Инциденты', section: 'Работа'},
{key: 'checklist', label: 'Чек-лист', section: 'Работа'},
{key: 'tech_access', label: 'Доступ техников к документам', section: 'Работа'},
// Контент
{key: 'blog', label: 'Управление блогом', section: 'Контент'},
{key: 'cases', label: 'Примеры из практики', section: 'Контент'},
];
var MENU_ITEMS = [];
function switchTab(name){
document.querySelectorAll('.tab-content').forEach(function(t){ t.classList.remove('active'); });
@@ -76,7 +54,12 @@ function switchTab(name){
}
function loadPermissions(){
fetch('/service/api/role-permissions').then(function(r){ return r.json() }).then(function(data){
Promise.all([
fetch('/service/api/menu-items').then(function(r){ return r.json() }),
fetch('/service/api/role-permissions').then(function(r){ return r.json() })
]).then(function(results){
MENU_ITEMS = results[0];
var data = results[1];
['engineer','technician'].forEach(function(role){
var container = document.getElementById('menu-' + role);
container.innerHTML = '';