diff --git a/public/app.js b/public/app.js index 2840889..44cfdbc 100644 --- a/public/app.js +++ b/public/app.js @@ -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('Сначала выберите таблицу');