let currentTab = 'biot'; let currentSubtab = null; let events = { biot: [], ctpsr_main: [], gloves: [] }; let currentFilter = 'все'; let currentUser = null; // API_URL пустой — используем относительные пути const API_URL = ''; // Проверка авторизации при загрузке async function checkAuth() { const token = localStorage.getItem('token'); const name = localStorage.getItem('userName'); const id = localStorage.getItem('userId'); if (token && name && id) { currentUser = { token, name, id }; showApp(); await loadEvents(); render(); } else { showLogin(); } } function showLogin() { document.getElementById('login-screen').classList.add('on'); document.getElementById('app-content').classList.remove('on'); } function showApp() { document.getElementById('login-screen').classList.remove('on'); document.getElementById('app-content').classList.add('on'); document.getElementById('user-name').textContent = currentUser.name; // Показываем кнопку админки только для admin if (currentUser.id === 'admin' || currentUser.name === 'Администратор') { document.getElementById('admin-btn').style.display = 'inline-block'; } } async function login(username, password) { try { const res = await fetch(API_URL + '/service/login?username=' + encodeURIComponent(username) + '&password=' + encodeURIComponent(password), { method: 'GET' }); const data = await res.json(); if (res.ok) { currentUser = { token: data.token, name: data.name, id: username }; localStorage.setItem('token', data.token); localStorage.setItem('userName', data.name); localStorage.setItem('userId', username); showApp(); await loadEvents(); render(); } else { alert(data.error || 'Ошибка входа'); } } catch (e) { alert('Ошибка соединения: ' + e.message); } } } catch (e) { alert('Ошибка соединения: ' + e.message); } } function logout() { localStorage.removeItem('token'); localStorage.removeItem('userName'); localStorage.removeItem('userId'); currentUser = null; showLogin(); } document.getElementById('login-form').addEventListener('submit', function(e) { e.preventDefault(); const username = document.getElementById('username').value; const password = document.getElementById('password').value; login(username, password); }); checkAuth(); // Админ панель async function openAdmin() { if (!currentUser || currentUser.id !== 'admin') { alert('Только для администратора'); return; } document.getElementById('admin-modal').classList.add('on'); await loadUsers(); } function closeAdmin() { document.getElementById('admin-modal').classList.remove('on'); } async function loadUsers() { try { const res = await fetch(API_URL + '/service/users', { headers: { 'Authorization': 'Bearer ' + currentUser.token } }); if (!res.ok) { throw new Error('Ошибка загрузки: ' + res.status); } const users = await res.json(); const list = document.getElementById('users-list'); list.innerHTML = users.map(u => `
Ошибка: ' + e.message + '
'; } } document.getElementById('add-user-form').addEventListener('submit', async function(e) { e.preventDefault(); const id = document.getElementById('new-user-id').value.trim(); const name = document.getElementById('new-user-name').value.trim(); const password = document.getElementById('new-user-password').value.trim(); try { const res = await fetch(API_URL + '/service/users', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': 'Bearer ' + currentUser.token }, body: JSON.stringify({ id, name, password }) }); const data = await res.json(); if (res.ok) { alert('Пользователь добавлен!\n\nID: ' + data.user.id + '\nФИО: ' + data.user.name + '\nПароль: ' + data.user.password + '\n\nЗапишите данные!'); document.getElementById('add-user-form').reset(); await loadUsers(); } else { alert('Ошибка: ' + data.error); } } catch (e) { alert('Ошибка: ' + e.message); } }); async function deleteUser(id) { if (!confirm('Удалить пользователя ' + id + '?')) return; try { const res = await fetch(API_URL + '/service/users/' + id, { method: 'DELETE', headers: { 'Authorization': 'Bearer ' + currentUser.token } }); const data = await res.json(); if (res.ok) { await loadUsers(); alert('Пользователь удалён'); } else { alert('Ошибка: ' + data.error); } } catch (e) { alert('Ошибка: ' + e.message); } } async function loadEvents() { if (!currentUser) return; try { const headers = { 'Authorization': 'Bearer ' + currentUser.token }; const [biotRes, ctpsrRes, glovesRes] = await Promise.all([ fetch(API_URL + '/service/events?tab=biot', { headers }), fetch(API_URL + '/service/events?tab=ctpsr_main', { headers }), fetch(API_URL + '/service/events?tab=gloves', { headers }) ]); events.biot = await biotRes.json(); events.ctpsr_main = await ctpsrRes.json(); events.gloves = await glovesRes.json(); console.log('Loaded events:', { biot: events.biot.length, ctpsr_main: events.ctpsr_main.length, gloves: events.gloves.length }); } catch (e) { console.error('Ошибка загрузки:', e); } } function switchTab(tab) { currentTab = tab; document.querySelectorAll('.tab').forEach(function(t) { t.classList.remove('active'); }); var activeBtn = document.querySelector('.tab[onclick="switchTab(\'' + tab + '\')"]'); if (activeBtn) activeBtn.classList.add('active'); var subtabsContainer = document.getElementById('subtabs'); if (tab === 'ctpsr') { subtabsContainer.style.display = 'flex'; currentSubtab = 'ctpsr_main'; document.getElementById('page-title').textContent = 'Информация по ЦТПСР'; } else { subtabsContainer.style.display = 'none'; currentSubtab = null; document.getElementById('page-title').textContent = tab === 'biot' ? 'Информация по БиОТ' : 'Мероприятия'; } console.log('switchTab:', tab, 'currentSubtab:', currentSubtab); render(); } function switchSubtab(subtab) { currentSubtab = subtab; document.querySelectorAll('.subtab').forEach(function(t) { t.classList.remove('active'); }); var activeBtn = document.querySelector('.subtab[onclick="switchSubtab(\'' + subtab + '\')"]'); if (activeBtn) activeBtn.classList.add('active'); console.log('switchSubtab:', subtab); render(); } function escapeHtml(text) { if (!text) return ''; var div = document.createElement('div'); div.textContent = text; return div.innerHTML; } function formatDate(dateStr) { if (!dateStr) return ''; var d = new Date(dateStr); return d.toLocaleDateString('ru-RU', { day: 'numeric', month: 'long', year: 'numeric' }); } function setFilter(status) { currentFilter = status; render(); } function render() { var search = document.getElementById('search').value.toLowerCase(); var key = currentSubtab || currentTab; var currentEvents = events[key] || []; var isGloves = key === 'gloves'; console.log('render key:', key, 'events count:', currentEvents.length); var filtered; if (isGloves) { filtered = currentEvents.filter(function(e) { return (e.quantity && e.quantity.toLowerCase().includes(search)) || (e.location && e.location.toLowerCase().includes(search)) || (e.responsible && e.responsible.toLowerCase().includes(search)); }); } else { filtered = currentEvents.filter(function(e) { var matchSearch = e.title.toLowerCase().includes(search) || (e.description && e.description.toLowerCase().includes(search)) || (e.organizer && e.organizer.toLowerCase().includes(search)); var matchFilter = currentFilter === 'все' || e.status === currentFilter; return matchSearch && matchFilter; }); } var statsEl = document.getElementById('stats'); var chipsEl = document.getElementById('chips'); if (!isGloves) { var statuses = ['запланировано', 'в процессе', 'завершено', 'отменено']; var counts = { все: currentEvents.length }; statuses.forEach(function(s) { counts[s] = currentEvents.filter(function(ev) { return ev.status === s; }).length; }); statsEl.innerHTML = `Нажмите «Добавить», чтобы создать первую запись
| Количество | Место эксплуатации | Ответственное лицо | Последнее испытание | Следующее испытание | Срок (мес) | Действия |
|---|---|---|---|---|---|---|
| ${escapeHtml(e.quantity || '')} | ${escapeHtml(e.location || '')} | ${escapeHtml(e.responsible || '')} | ${e.lastTestDate ? formatDate(e.lastTestDate) : ''} | ${e.nextTestDate ? formatDate(e.nextTestDate) : ''} | ${e.expiryMonths ? e.expiryMonths + ' мес.' : ''} |