diff --git a/public/app.js b/public/app.js index dd4fca9..4c2e3ea 100644 --- a/public/app.js +++ b/public/app.js @@ -96,13 +96,22 @@ function escapeHtml(text) { function getRowKey(rowData) { if (!currentMeta || !currentMeta.primaryKey || currentMeta.primaryKey.length === 0) { - return JSON.stringify(rowData); + const key = JSON.stringify(rowData); + return key; } - const pkValues = currentMeta.primaryKey.map(pk => rowData[pk]).join('|'); + const pkValues = currentMeta.primaryKey.map(pk => { + const value = rowData[pk]; + if (value === undefined || value === null) { + console.warn(`⚠️ getRowKey: PK field '${pk}' is undefined/null in rowData:`, rowData); + } + return value; + }).join('|'); + return pkValues; } + document.getElementById('loginBtn').addEventListener('click', async () => { const user = document.getElementById('loginUser').value.trim(); const pass = document.getElementById('loginPass').value; @@ -189,6 +198,13 @@ async function selectTable(schema, tableName) { `/api/table/meta?schema=${encodeURIComponent(schema)}&table=${encodeURIComponent(tableName)}` ); + console.log('📋 Метаданные таблицы загружены:', { + schema, + table: tableName, + primaryKey: currentMeta.primaryKey, + columnsCount: currentMeta.columns.length + }); + const columns = [ { formatter: "rowSelection", @@ -197,6 +213,7 @@ async function selectTable(schema, tableName) { headerSort: false, width: 40, cellClick: function(e, cell) { + console.log('📌 Клик на чекбокс ячейки'); cell.getRow().toggleSelect(); } }, @@ -263,38 +280,79 @@ async function selectTable(schema, tableName) { }, rowSelectionChanged: function(data, rows) { - console.log('🔔 rowSelectionChanged:', { - 'data (all selected)': data.length, - 'rows (changed)': rows.length + console.group('🔔 rowSelectionChanged вызван'); + console.log('Параметры:', { + 'data.length (все выделенные)': data.length, + 'rows.length (изменённые)': rows.length, + 'selectedRowsData.size до': selectedRowsData.size }); + // Выводим первые 2 элемента из data для проверки + if (data.length > 0) { + console.log('Первая строка из data:', data[0]); + console.log('Проверка getRowKey для первой строки:', getRowKey(data[0])); + } + + // Выводим первые 2 элемента из rows для проверки + if (rows.length > 0) { + console.log('Первая строка из rows (Row объект):', rows[0]); + console.log('getData() первой строки из rows:', rows[0].getData()); + } + + // Получаем все строки текущей страницы const currentPageRows = this.getRows(); + console.log('Строк на текущей странице:', currentPageRows.length); + + // Удаляем все строки текущей страницы из selectedRowsData + let deletedCount = 0; currentPageRows.forEach(row => { const rowData = row.getData(); const key = getRowKey(rowData); - selectedRowsData.delete(key); + if (selectedRowsData.has(key)) { + selectedRowsData.delete(key); + deletedCount++; + } }); + console.log('Удалено из selectedRowsData:', deletedCount); - data.forEach(rowData => { + // Добавляем все выделенные строки из параметра data + let addedCount = 0; + data.forEach((rowData, index) => { const key = getRowKey(rowData); selectedRowsData.set(key, rowData); + addedCount++; + + if (index < 3) { + console.log(` Добавлена строка ${index + 1}: key="${key}"`); + } }); + console.log('Добавлено в selectedRowsData:', addedCount); + + console.log('selectedRowsData.size после:', selectedRowsData.size); + console.log('Первые 3 ключа в selectedRowsData:', Array.from(selectedRowsData.keys()).slice(0, 3)); + console.groupEnd(); - console.log(` 📊 selectedRowsData: ${selectedRowsData.size}`); updateSelectionCounter(); }, dataLoaded: function(data) { + console.log('📄 dataLoaded: восстанавливаем выделение для', selectedRowsData.size, 'строк'); + if (selectedRowsData.size > 0) { const rows = this.getRows(); + let restoredCount = 0; + rows.forEach(row => { const rowData = row.getData(); const key = getRowKey(rowData); if (selectedRowsData.has(key)) { row.select(); + restoredCount++; } }); + + console.log(' ✅ Восстановлено выделение для', restoredCount, 'строк на странице'); } }, @@ -335,6 +393,7 @@ async function selectTable(schema, tableName) { document.addEventListener('keydown', enterHandler); } + document.getElementById('btnSelectAll').addEventListener('click', async () => { if (!currentSchema || !currentTable || !table) { alert('Сначала выберите таблицу');