Сохранение и восстановление состояния таблицы

- Сохранение последней открытой таблицы в localStorage
- Сохранение фильтров и страницы при изменении
- Восстановление таблицы, фильтров и страницы при входе
- Сброс настроек теперь включает фильтры и последнюю таблицу

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-24 08:38:06 +03:00
parent f3be92d1f9
commit 647ab96d1a

View File

@@ -265,8 +265,10 @@ function logout() {
// Сбросить все настройки
function resetSettings() {
if (confirm('Сбросить все сохранённые настройки столбцов?')) {
if (confirm('Сбросить все сохранённые настройки (столбцы, фильтры, последняя таблица)?')) {
localStorage.removeItem(STORAGE_KEYS.columns);
localStorage.removeItem(STORAGE_KEYS.tableState);
localStorage.removeItem(STORAGE_KEYS.lastTable);
alert('Настройки сброшены. Перезагрузите страницу.');
location.reload();
}
@@ -366,6 +368,17 @@ async function loadTree() {
treeEl.appendChild(tableEl);
});
});
// ✅ Восстанавливаем последнюю открытую таблицу
const lastTable = loadLastTable();
if (lastTable) {
console.log('📂 Восстанавливаем последнюю таблицу:', lastTable.schema, '.', lastTable.table);
// Проверяем, существует ли таблица в дереве
const schemaExists = tree.find(s => s.name === lastTable.schema);
if (schemaExists && schemaExists.tables.includes(lastTable.table)) {
selectTable(lastTable.schema, lastTable.table, true);
}
}
} catch (e) {
console.error('loadTree ошибка:', e);
treeEl.innerHTML = 'Ошибка загрузки: ' + e.message;
@@ -560,15 +573,23 @@ function showColumnManager() {
// selectTable
async function selectTable(schema, tableName, restoreState = false) {
console.log('🔄 SELECTTABLE ВЫЗВАН:', schema, '.', tableName);
console.log('🔄 SELECTTABLE ВЫЗВАН:', schema, '.', tableName, restoreState ? '(с восстановлением)' : '');
currentSchema = schema;
currentTable = tableName;
selectedRowsDataGlobal.clear();
updateSelectionCounter();
// Сохраняем последнюю открытую таблицу
// Сохраняем последнюю открытую таблицу (только если не восстанавливаем)
if (!restoreState) {
saveLastTable();
}
// ✅ Загружаем сохранённое состояние, если нужно восстановить
const savedState = restoreState ? loadTableState() : null;
if (savedState) {
console.log('📂 Сохранённое состояние:', savedState);
}
if (enterHandler) {
document.removeEventListener('keydown', enterHandler);
@@ -928,6 +949,10 @@ async function selectTable(schema, tableName, restoreState = false) {
// Добавьте после создания таблицы, перед подключением событий:
// ✅ Флаги для восстановления состояния
let stateRestored = false;
let filtersApplied = false;
table.on("tableBuilt", function() {
console.log('🏗️ Таблица построена, фиксируем ширину чекбоксов');
@@ -973,6 +998,18 @@ async function selectTable(schema, tableName, restoreState = false) {
console.log('✅ Ширина столбца чекбоксов зафиксирована');
}
// ✅ Применяем сохранённые фильтры после построения таблицы
if (savedState && savedState.filters && savedState.filters.length > 0 && !filtersApplied) {
console.log('📂 Применяем сохранённые фильтры:', savedState.filters);
filtersApplied = true;
savedState.filters.forEach(filter => {
if (filter.field && filter.value) {
table.setHeaderFilterValue(filter.field, filter.value);
}
});
}
});
@@ -1084,6 +1121,21 @@ async function selectTable(schema, tableName, restoreState = false) {
}
});
}
// ✅ Восстанавливаем страницу после загрузки данных
if (savedState && savedState.page && savedState.page > 1 && !stateRestored) {
stateRestored = true;
const maxPage = table.getPageMax ? table.getPageMax() : 1;
const targetPage = Math.min(savedState.page, maxPage);
if (targetPage > 1) {
console.log('📂 Переход на сохранённую страницу:', targetPage);
// Используем setTimeout чтобы избежать конфликтов с текущей загрузкой
setTimeout(() => {
table.setPage(targetPage);
}, 100);
}
}
});
// Не окрашиваем при начале редактирования - только при реальном изменении
@@ -1137,6 +1189,15 @@ async function selectTable(schema, tableName, restoreState = false) {
});
await Promise.all(savePromises);
}
// ✅ Сохраняем состояние таблицы при смене страницы
saveTableState();
});
// ✅ Сохраняем состояние при изменении фильтров
table.on("dataFiltered", function(filters, rows) {
console.log('🔍 Фильтры изменены:', filters);
saveTableState();
});
enterHandler = async function(e) {