add dropdown menu for FK values

This commit is contained in:
Mikhail Chusavitin
2026-01-21 18:32:53 +03:00
parent 44ad6785a8
commit 2f7a180543
2 changed files with 88 additions and 23 deletions

View File

@@ -205,6 +205,28 @@ async function selectTable(schema, tableName) {
console.log('📋 Метаданные получены:', currentMeta);
// ✅ Загружаем значения для всех FK полей
const fkValues = new Map();
for (const col of currentMeta.columns) {
if (col.IS_FOREIGN_KEY && col.FOREIGN_KEY) {
console.log('🔗 Загрузка FK значений для:', col.COLUMN_NAME);
try {
const result = await api(
`/api/fk-values?schema=${encodeURIComponent(col.FOREIGN_KEY.ref_schema)}&` +
`table=${encodeURIComponent(col.FOREIGN_KEY.ref_table)}&` +
`column=${encodeURIComponent(col.FOREIGN_KEY.ref_column)}`
);
fkValues.set(col.COLUMN_NAME, result.values || []);
console.log(' ✅ Загружено значений:', result.values.length);
} catch (err) {
console.error(' ❌ Ошибка загрузки FK:', err);
fkValues.set(col.COLUMN_NAME, []);
}
}
}
// ✅ Формируем колонки с правильными редакторами
const columns = [
{
formatter: "rowSelection",
@@ -217,12 +239,45 @@ async function selectTable(schema, tableName) {
cell.getRow().toggleSelect();
}
},
...currentMeta.columns.map(col => ({
title: col.COLUMN_NAME,
field: col.COLUMN_NAME,
editor: "input",
headerFilter: "input"
}))
...currentMeta.columns.map(col => {
const colDef = {
title: col.COLUMN_NAME,
field: col.COLUMN_NAME,
headerFilter: "input"
};
// ✅ Выбираем редактор в зависимости от типа поля
if (col.IS_FOREIGN_KEY && fkValues.has(col.COLUMN_NAME)) {
const values = fkValues.get(col.COLUMN_NAME);
if (values.length > 0) {
// ✅ Выпадающий список для FK
colDef.editor = "list";
colDef.editorParams = {
values: values,
clearable: col.IS_NULLABLE, // Разрешаем очистку для nullable полей
autocomplete: true,
listOnEmpty: true,
freetext: false // Запрещаем ввод произвольного текста
};
console.log(` 📋 ${col.COLUMN_NAME}: select с ${values.length} значениями`);
} else {
// Нет значений - обычный input с предупреждением
colDef.editor = "input";
colDef.editorParams = {
elementAttributes: {
placeholder: `⚠️ Нет значений в ${col.FOREIGN_KEY.ref_table}`
}
};
}
} else {
// Обычный редактор
colDef.editor = "input";
}
return colDef;
})
];
if (table) {
@@ -324,11 +379,19 @@ async function selectTable(schema, tableName) {
} catch (err) {
console.error('❌ ОШИБКА:', err);
// ✅ Красная подсветка + откат значения
if (rowElement && rowElement.getElement) {
rowElement.getElement().style.backgroundColor = '#ffebee';
// Подсветка остаётся до перезагрузки данных
setTimeout(() => {
if (confirm('Ошибка сохранения:\n' + err.message + '\n\nОбновить таблицу?')) {
table.replaceData();
}
}, 100);
} else {
alert('Ошибка: ' + err.message);
}
alert('Ошибка: ' + err.message);
}
}
@@ -412,7 +475,10 @@ async function selectTable(schema, tableName) {
document.addEventListener('keydown', enterHandler);
console.log('✅ ВСЕ СОБЫТИЯ ПОДКЛЮЧЕНЫ - ВЕРСИЯ 2.0');
console.log('📋 FK полей с dropdown:', Array.from(fkValues.keys()).join(', '));
}
// functions
document.getElementById('btnSelectAll').addEventListener('click', async () => {