Files
turborfq/public/js/user.js
2026-02-04 16:56:53 +03:00

238 lines
7.2 KiB
JavaScript

// ===== USER.JS - Авторизация и сессия =====
const STORAGE_KEYS = {
username: 'turborfq_username',
columns: 'turborfq_columns',
lastTable: 'turborfq_lastTable',
tableState: 'turborfq_tableState'
};
// Сохранить состояние таблицы (фильтры, страница)
function saveTableState() {
if (!currentSchema || !currentTable || !table) return;
const tableKey = `${currentSchema}.${currentTable}`;
const headerFilters = table.getHeaderFilters ? table.getHeaderFilters() : [];
const page = table.getPage ? table.getPage() : 1;
let allStates = {};
try {
const saved = localStorage.getItem(STORAGE_KEYS.tableState);
if (saved) allStates = JSON.parse(saved);
} catch (e) {}
allStates[tableKey] = {
filters: headerFilters.filter(f => f.value),
page: page
};
localStorage.setItem(STORAGE_KEYS.tableState, JSON.stringify(allStates));
}
// Загрузить состояние таблицы
function loadTableState() {
if (!currentSchema || !currentTable) return null;
const tableKey = `${currentSchema}.${currentTable}`;
try {
const saved = localStorage.getItem(STORAGE_KEYS.tableState);
if (saved) {
const allStates = JSON.parse(saved);
return allStates[tableKey] || null;
}
} catch (e) {}
return null;
}
// Сохранить последнюю открытую таблицу
function saveLastTable() {
if (!currentSchema || !currentTable) return;
localStorage.setItem(STORAGE_KEYS.lastTable, JSON.stringify({
schema: currentSchema,
table: currentTable
}));
}
// Загрузить последнюю таблицу
function loadLastTable() {
try {
const saved = localStorage.getItem(STORAGE_KEYS.lastTable);
if (saved) return JSON.parse(saved);
} catch (e) {}
return null;
}
// Сохранить видимость столбцов
function saveColumnVisibility(visibilityMap) {
if (!currentSchema || !currentTable) return;
const tableKey = `${currentSchema}.${currentTable}`;
let allSettings = {};
try {
const saved = localStorage.getItem(STORAGE_KEYS.columns);
if (saved) allSettings = JSON.parse(saved);
} catch (e) {}
allSettings[tableKey] = visibilityMap;
localStorage.setItem(STORAGE_KEYS.columns, JSON.stringify(allSettings));
console.log('💾 Видимость столбцов сохранена:', tableKey);
}
// Загрузить видимость столбцов
function loadColumnVisibility() {
if (!currentSchema || !currentTable) return null;
const tableKey = `${currentSchema}.${currentTable}`;
try {
const saved = localStorage.getItem(STORAGE_KEYS.columns);
if (saved) {
const allSettings = JSON.parse(saved);
return allSettings[tableKey] || null;
}
} catch (e) {
console.error('Ошибка загрузки видимости столбцов:', e);
}
return null;
}
// Показать основной интерфейс
function showApp(username) {
document.getElementById('loginScreen').style.display = 'none';
document.getElementById('header').style.display = 'flex';
document.getElementById('appContent').style.display = 'flex';
document.getElementById('userName').textContent = username;
}
// Показать экран авторизации
function showLogin() {
document.getElementById('loginScreen').style.display = 'flex';
document.getElementById('header').style.display = 'none';
document.getElementById('appContent').style.display = 'none';
document.getElementById('loginUser').value = localStorage.getItem(STORAGE_KEYS.username) || '';
document.getElementById('loginPass').value = '';
document.getElementById('loginStatus').textContent = '';
document.getElementById('loginStatus').className = '';
}
// Выполнить авторизацию
async function doLogin(user, pass, saveUsername = true) {
const statusEl = document.getElementById('loginStatus');
try {
const res = await api('/api/login', 'POST', { user, pass });
if (res.ok) {
if (saveUsername) {
localStorage.setItem(STORAGE_KEYS.username, user);
}
showApp(user);
await loadTree();
return true;
} else {
statusEl.textContent = res.error || 'Ошибка авторизации';
statusEl.className = 'error';
return false;
}
} catch (e) {
console.error('Login error:', e);
statusEl.textContent = 'Ошибка подключения';
statusEl.className = 'error';
return false;
}
}
// Выйти из системы
async function logout() {
try {
await api('/api/logout', 'POST', {});
} catch (e) {
console.error('Logout error:', e);
}
showLogin();
document.getElementById('tree').innerHTML = '';
if (table) {
table.destroy();
table = null;
}
}
// Сбросить все настройки
function resetSettings() {
if (confirm('Сбросить все сохранённые настройки (столбцы, фильтры, последняя таблица)?')) {
localStorage.removeItem(STORAGE_KEYS.columns);
localStorage.removeItem(STORAGE_KEYS.tableState);
localStorage.removeItem(STORAGE_KEYS.lastTable);
alert('Настройки сброшены. Перезагрузите страницу.');
location.reload();
}
}
// Автологин при загрузке
async function tryAutoLogin() {
try {
const session = await api('/api/session');
if (session.authenticated) {
showApp(session.user || 'MariaDB User');
await loadTree();
return;
}
} catch (e) {
console.error('Session restore error:', e);
}
showLogin();
}
// Инициализация обработчиков авторизации
function initUserHandlers() {
// Обработчик кнопки "Войти"
document.getElementById('loginBtn').addEventListener('click', async () => {
const user = document.getElementById('loginUser').value.trim();
const pass = document.getElementById('loginPass').value;
const statusEl = document.getElementById('loginStatus');
const btn = document.getElementById('loginBtn');
if (!user || !pass) {
statusEl.textContent = 'Введите логин и пароль';
statusEl.className = 'error';
return;
}
btn.disabled = true;
btn.textContent = 'Вход...';
statusEl.textContent = '';
await doLogin(user, pass);
btn.disabled = false;
btn.textContent = 'Войти';
});
// Enter для входа
document.getElementById('loginPass').addEventListener('keypress', (e) => {
if (e.key === 'Enter') {
document.getElementById('loginBtn').click();
}
});
// Меню пользователя
document.getElementById('userIcon').addEventListener('click', (e) => {
e.stopPropagation();
document.getElementById('userDropdown').classList.toggle('dropdown-hidden');
});
document.addEventListener('click', () => {
document.getElementById('userDropdown').classList.add('dropdown-hidden');
});
document.getElementById('menuLogout').addEventListener('click', logout);
document.getElementById('menuResetSettings').addEventListener('click', resetSettings);
// Автологин при загрузке страницы
tryAutoLogin();
}
console.log('✅ user.js загружен');