// frontend/js/app.js import * as api from './api.js'; const PLATFORMS = [ { id: 'ozon', name: 'Ozon' }, { id: 'wb', name: 'Wildberries' }, { id: 'ym', name: 'Yandex Market' }, { id: 'mm', name: 'Magnit Market' }, { id: 'mega', name: 'MegaMarket' }, { id: 'ae', name: 'AliExpress' }, { id: 'avito', name: 'Avito' }, { id: 'lamoda', name: 'Lamoda' }, { id: 'lemana', name: 'Lemana PRO' }, { id: 'flowwow', name: 'Flowwow' } ]; let currentUser = null; document.addEventListener("DOMContentLoaded", async () => { initAuth(); initReports(); // Check if logged in const token = localStorage.getItem('token'); if (token) { try { currentUser = await api.getMe(); const planBadge = currentUser.plan === 'pro' ? '[PRO]' : '[FREE]'; document.getElementById('username-display').innerHTML = `Привет, ${currentUser.username} ${planBadge}`; showApp(); } catch (e) { showAuth(); } } else { showAuth(); } }); let isLoginMode = true; function initAuth() { const authForm = document.getElementById('auth-form'); const toggleBtn = document.getElementById('auth-toggle'); const title = document.getElementById('auth-title'); const logoutBtn = document.getElementById('logout-btn'); toggleBtn.addEventListener('click', (e) => { e.preventDefault(); isLoginMode = !isLoginMode; title.textContent = isLoginMode ? 'Вход в систему' : 'Регистрация'; toggleBtn.textContent = isLoginMode ? 'Нет аккаунта? Зарегистрироваться' : 'Уже есть аккаунт? Войти'; }); authForm.addEventListener('submit', async (e) => { e.preventDefault(); const username = document.getElementById('auth-username').value; const password = document.getElementById('auth-password').value; try { if (isLoginMode) { const res = await api.login(username, password); localStorage.setItem('token', res.token); } else { await api.register(username, password); alert('Регистрация успешна! Теперь вы можете войти.'); isLoginMode = true; title.textContent = 'Вход в систему'; toggleBtn.textContent = 'Нет аккаунта? Зарегистрироваться'; return; } window.location.reload(); } catch (err) { alert(err.message); } }); logoutBtn.addEventListener('click', () => { localStorage.removeItem('token'); window.location.reload(); }); } function showAuth() { document.getElementById('auth-section').classList.remove('hidden'); document.getElementById('main-app').classList.add('hidden'); document.getElementById('user-info').classList.add('hidden'); } function showApp() { document.getElementById('auth-section').classList.add('hidden'); document.getElementById('main-app').classList.remove('hidden'); document.getElementById('user-info').classList.remove('hidden'); initTabs(); initCases(); initIntegrations(); initBilling(); initDashboard(); } function initDashboard() { loadDashboard(); } async function loadDashboard() { try { const stats = await api.getDashboardStats(); const grid = document.getElementById('stats-grid'); grid.innerHTML = `
${stats.total_cases}
${stats.total_integrations}
${stats.platforms.join(', ').toUpperCase()}
${(stats.cases_by_status.prepared || 0) + (stats.cases_by_status.sent || 0)}
${isConfigured ? '✅ Подключено' : '❌ Не настроено'}
`; card.querySelector('form').addEventListener('submit', async (e) => { e.preventDefault(); const formData = new FormData(e.target); const data = Object.fromEntries(formData); try { await api.saveCredentials(p.id, data); alert(`Настройки для ${p.name} сохранены!`); loadIntegrations(); } catch(err) { alert(err.message); } }); grid.appendChild(card); }); } catch (e) { grid.innerHTML = 'Ошибка загрузки интеграций.'; console.error(e); } } // ---- CASES ---- async function initCases() { document.getElementById('new-case-btn').addEventListener('click', () => { document.getElementById('cases-section').classList.add('hidden'); document.getElementById('case-form-section').classList.remove('hidden'); document.getElementById('case-form').reset(); }); document.getElementById('cancel-btn').addEventListener('click', () => { document.getElementById('case-form-section').classList.add('hidden'); document.getElementById('cases-section').classList.remove('hidden'); }); document.getElementById('back-to-list').addEventListener('click', () => { document.getElementById('case-detail-section').classList.add('hidden'); document.getElementById('cases-section').classList.remove('hidden'); loadCases(); }); document.getElementById('search-input').addEventListener('input', debounce(loadCases, 500)); document.getElementById('status-filter').addEventListener('change', loadCases); document.getElementById('platform-filter').addEventListener('change', loadCases); document.getElementById('case-form').addEventListener('submit', async (e) => { e.preventDefault(); const formData = new FormData(e.target); const data = Object.fromEntries(formData); try { const res = await api.createCase(data); const fileInput = document.getElementById('file-input'); if (fileInput.files.length > 0) { await api.uploadFiles(res.id, fileInput.files); } alert('Кейс успешно создан!'); document.getElementById('case-form-section').classList.add('hidden'); document.getElementById('cases-section').classList.remove('hidden'); loadCases(); } catch (err) { console.error(err); alert('Ошибка при сохранении'); } }); document.getElementById('export-csv-btn').addEventListener('click', () => { window.location.href = api.getExportCsvUrl(); }); loadCases(); } let currentViewCaseId = null; async function initReports() { document.getElementById('download-pdf-btn').addEventListener('click', () => { if (currentViewCaseId) { window.location.href = api.getCaseReportPdfUrl(currentViewCaseId); } }); } async function loadCases() { const article = document.getElementById('search-input').value; const status = document.getElementById('status-filter').value; const platform = document.getElementById('platform-filter').value; const tbody = document.querySelector('#cases-table tbody'); tbody.innerHTML = 'Площадка: ${PLATFORMS.find(p => p.id === caseObj.platform)?.name || caseObj.platform}
Артикул нарушителя: ${caseObj.violator_article}
Ссылка: ${caseObj.violator_url}
Ваш артикул: ${caseObj.my_article || '-'}
Комментарий: ${caseObj.comment || '-'}
Статус: ${caseObj.status}
`; if (files && files.length > 0) { html += `