select table with double click

This commit is contained in:
Mikhail Chusavitin
2026-01-21 17:55:13 +03:00
parent f93bfebd5a
commit a6362d6116

View File

@@ -205,14 +205,14 @@ async function selectTable(schema, tableName) {
headerSort: false,
width: 40,
cellClick: function(e, cell) {
e.stopPropagation(); // ✅ Останавливаем всплытие события
e.stopPropagation();
cell.getRow().toggleSelect();
}
},
...currentMeta.columns.map(col => ({
title: col.COLUMN_NAME,
field: col.COLUMN_NAME,
editor: "input",
editor: "input", // ✅ Редактор активируется по двойному клику
headerFilter: "input"
}))
];
@@ -226,9 +226,9 @@ async function selectTable(schema, tableName) {
const dirtyRows = new Map();
table = new Tabulator("#table", {
selectableRows: false, // ✅ Отключаем выделение по клику на строку
selectableRows: false,
selectableRowsCheck: function(row) {
return true; // Но разрешаем выделение через чекбокс
return true;
},
columns: columns,
@@ -280,7 +280,6 @@ async function selectTable(schema, tableName) {
rowSelectionChanged: function(data, rows) {
updateSelectionCounter();
console.log('🔲 Выделено строк:', data.length);
},
dataLoaded: function(data) {
@@ -298,7 +297,14 @@ async function selectTable(schema, tableName) {
}
},
// ✅ При изменении ячейки
// ✅ Когда начинается редактирование
cellEditing: function(cell) {
console.log('🖊️ НАЧАЛО РЕДАКТИРОВАНИЯ:', cell.getField());
const row = cell.getRow();
row.getElement().style.backgroundColor = '#fff9e6';
},
// ✅ При завершении редактирования
cellEdited: function(cell) {
const row = cell.getRow();
const rowData = row.getData();
@@ -306,11 +312,10 @@ async function selectTable(schema, tableName) {
const field = cell.getField();
const value = cell.getValue();
console.log('📝 ЯЧЕЙКА ИЗМЕНЕНА:', {
console.log(' ЯЧЕЙКА ИЗМЕНЕНА:', {
field: field,
value: value,
rowPos: rowPos,
rowData: rowData
rowPos: rowPos
});
// Подсвечиваем измененную строку
@@ -320,12 +325,12 @@ async function selectTable(schema, tableName) {
if (dirtyRows.has(rowPos)) {
const existing = dirtyRows.get(rowPos);
clearTimeout(existing.timeout);
console.log('⏱️ Отменен предыдущий таймер для строки', rowPos);
console.log('⏱️ Отменен предыдущий таймер');
}
// ✅ Устанавливаем новый таймер на автосохранение (2 сек)
const timeout = setTimeout(async () => {
console.log('⏰ Таймер сработал - начинаем сохранение строки', rowPos);
console.log('⏰ Таймер истек - сохранение...');
await saveRow(rowPos, rowData, row);
}, 2000);
@@ -336,7 +341,7 @@ async function selectTable(schema, tableName) {
timeout: timeout
});
console.log('✏️ Строка помечена как измененная. Сохранение через 2 сек. Всего несохраненных:', dirtyRows.size);
console.log('📝 Несохраненных строк:', dirtyRows.size);
},
headerFilterLiveFilterDelay: 800
@@ -344,34 +349,28 @@ async function selectTable(schema, tableName) {
// ✅ Функция сохранения строки
async function saveRow(rowPos, rowData, rowElement) {
console.log('💾 === НАЧАЛО СОХРАНЕНИЯ ===');
console.log('Schema:', currentSchema);
console.log('Table:', currentTable);
console.log('Row data:', rowData);
console.log('💾 СОХРАНЕНИЕ СТРОКИ');
console.log(' Schema:', currentSchema);
console.log(' Table:', currentTable);
console.log(' Data:', rowData);
if (!currentSchema || !currentTable) {
console.error('❌ Нет schema или table!');
return;
}
// Удаляем из списка несохраненных
dirtyRows.delete(rowPos);
console.log('🗑️ Строка удалена из dirtyRows. Осталось:', dirtyRows.size);
try {
const requestData = {
const result = await api('/api/table/update', 'POST', {
schema: currentSchema,
table: currentTable,
row: rowData
};
});
console.log('📤 Отправляем запрос на /api/table/update:', requestData);
console.log('СОХРАНЕНО:', result);
const result = await api('/api/table/update', 'POST', requestData);
console.log('📥 Ответ сервера:', result);
// ✅ Зеленый фон = успешное сохранение
// Зеленый фон
if (rowElement && rowElement.getElement) {
rowElement.getElement().style.backgroundColor = '#e8f5e9';
setTimeout(() => {
@@ -380,14 +379,10 @@ async function selectTable(schema, tableName) {
}
}, 1500);
}
console.log('✅ === СОХРАНЕНИЕ УСПЕШНО ===');
} catch (err) {
console.error('❌ === ОШИБКА СОХРАНЕНИЯ ===');
console.error('Ошибка:', err);
console.error('Message:', err.message);
console.error('❌ ОШИБКА:', err.message);
// Красная подсветка при ошибке
// Красная подсветка
if (rowElement && rowElement.getElement) {
rowElement.getElement().style.backgroundColor = '#ffebee';
}
@@ -396,27 +391,22 @@ async function selectTable(schema, tableName) {
}
}
// ✅ Обработчик Enter - сохраняет ВСЕ несохраненные строки немедленно
// ✅ Обработчик Enter
enterHandler = async function(e) {
if (e.key === 'Enter' && dirtyRows.size > 0) {
e.preventDefault();
console.log(`⏎ ENTER НАЖАТ: сохранение ${dirtyRows.size} измененных строк...`);
console.log(`⏎ ENTER: сохранение ${dirtyRows.size} строк`);
// Сохраняем все грязные строки
const savePromises = [];
dirtyRows.forEach((info, rowPos) => {
console.log(' → Отменяем таймер и сохраняем строку', rowPos);
clearTimeout(info.timeout);
savePromises.push(saveRow(rowPos, info.data, info.element));
});
await Promise.all(savePromises);
console.log('✅ Все строки сохранены после Enter');
// Снимаем фокус с ячейки
if (document.activeElement) {
document.activeElement.blur();
}
@@ -425,10 +415,10 @@ async function selectTable(schema, tableName) {
document.addEventListener('keydown', enterHandler);
// ✅ Сохраняем несохраненные изменения при смене страницы/фильтрации
// ✅ Сохранение при смене страницы
table.on("pageLoaded", async function() {
if (dirtyRows.size > 0) {
console.log('📄 СМЕНА СТРАНИЦЫ: сохранение', dirtyRows.size, 'несохраненных изменений...');
console.log('📄 Смена страницы: сохранение', dirtyRows.size, 'строк');
const savePromises = [];
dirtyRows.forEach((info, rowPos) => {
@@ -437,15 +427,15 @@ async function selectTable(schema, tableName) {
});
await Promise.all(savePromises);
console.log('✅ Несохраненные изменения сохранены перед сменой страницы');
}
});
console.log('🎉 Таблица инициализирована:', schema, '.', tableName);
console.log(' Таблица загружена:', schema, '.', tableName);
console.log('📖 Инструкция: ДВОЙНОЙ КЛИК на ячейку для редактирования');
}
document.getElementById('btnSelectAll').addEventListener('click', async () => {
if (!currentSchema || !currentTable || !table) {
alert('Сначала выберите таблицу');