select table with double click
This commit is contained in:
@@ -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('Сначала выберите таблицу');
|
||||
|
||||
Reference in New Issue
Block a user