add dropdown menu for FK values
This commit is contained in:
@@ -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 () => {
|
||||
|
||||
Reference in New Issue
Block a user