SQL comments for rows used now in tolltips

This commit is contained in:
Mikhail Chusavitin
2026-01-21 18:52:17 +03:00
parent 5c917c5d7c
commit cce71a095c
3 changed files with 74 additions and 9 deletions

View File

@@ -185,6 +185,7 @@ async function loadTree() {
treeEl.style.color = 'red';
}
}
// selectTable
async function selectTable(schema, tableName) {
console.log('🔄 SELECTTABLE ВЫЗВАН - ВЕРСИЯ 3.0:', schema, '.', tableName);
@@ -248,7 +249,32 @@ async function selectTable(schema, tableName) {
const colDef = {
title: col.COLUMN_NAME,
field: col.COLUMN_NAME,
headerFilter: "input"
headerFilter: "input",
// ✅ Добавляем тултип для заголовка
headerTooltip: function(e, column) {
const comment = col.COLUMN_COMMENT;
if (comment) {
let tooltip = `<strong>${col.COLUMN_NAME}</strong><br>`;
tooltip += `Тип: ${col.COLUMN_TYPE}<br>`;
tooltip += `<em>${comment}</em>`;
if (col.IS_FOREIGN_KEY) {
tooltip += `<br>→ ${col.FOREIGN_KEY.ref_table}.${col.FOREIGN_KEY.ref_column}`;
}
return tooltip;
} else {
// Если нет комментария - показываем базовую инфу
let tooltip = `<strong>${col.COLUMN_NAME}</strong><br>`;
tooltip += `Тип: ${col.COLUMN_TYPE}`;
if (col.IS_FOREIGN_KEY) {
tooltip += `<br>→ ${col.FOREIGN_KEY.ref_table}.${col.FOREIGN_KEY.ref_column}`;
}
return tooltip;
}
}
};
// ✅ Выбираем редактор в зависимости от типа поля
@@ -634,6 +660,7 @@ document.getElementById('btnInsert').addEventListener('click', async () => {
data_type: col.DATA_TYPE,
is_fk: col.IS_FOREIGN_KEY,
fk_info: col.FOREIGN_KEY
comment: col.COLUMN_COMMENT || '' // ✅ Добавлен комментарий
});
} else {
// Опциональное поле
@@ -822,27 +849,40 @@ async function promptForRequiredFields(requiredFields, optionalFields) {
});
}
// ✅ Рендерит input для поля
// ✅ Рендерит input для поля
function renderFieldInput(field, fkOptions, isRequired) {
const requiredMark = isRequired ? '<span style="color: red;">*</span>' : '';
let fkInfo = '';
let commentInfo = '';
// ✅ Информация о FK
if (field.is_fk && field.fk_info) {
fkInfo = `<small style="color: #666; font-weight: normal;">
(→ ${field.fk_info.ref_table}.${field.fk_info.ref_column})
</small>`;
}
// ✅ Комментарий из БД
if (field.comment) {
commentInfo = `
<div style="background: #f5f5f5; padding: 6px 10px; margin-top: 4px; border-radius: 3px; font-size: 12px; color: #555;">
💡 ${escapeHtml(field.comment)}
</div>
`;
}
let html = `
<div style="margin: 12px 0;">
<label style="display: block; margin-bottom: 5px; font-weight: bold;">
${field.name} ${requiredMark} ${fkInfo}
</label>
${commentInfo}
`;
// FK поле с выпадающим списком
if (field.is_fk && fkOptions[field.name]?.length > 0) {
html += `<select id="field_${field.name}" style="width: 100%; padding: 8px; font-size: 14px;">`;
html += `<select id="field_${field.name}" style="width: 100%; padding: 8px; font-size: 14px; margin-top: 4px;">`;
if (!isRequired) {
html += '<option value="">-- Не выбрано (NULL) --</option>';
} else {
@@ -858,7 +898,7 @@ function renderFieldInput(field, fkOptions, isRequired) {
const placeholder = isRequired ? 'Введите число' : 'Оставьте пустым для NULL';
html += `
<input type="number" step="any" id="field_${field.name}"
style="width: 100%; padding: 8px; font-size: 14px; box-sizing: border-box;"
style="width: 100%; padding: 8px; font-size: 14px; box-sizing: border-box; margin-top: 4px;"
placeholder="${placeholder}">
`;
}
@@ -868,7 +908,7 @@ function renderFieldInput(field, fkOptions, isRequired) {
const placeholder = isRequired ? '' : 'Оставьте пустым для NULL';
html += `
<input type="${inputType}" id="field_${field.name}"
style="width: 100%; padding: 8px; font-size: 14px; box-sizing: border-box;"
style="width: 100%; padding: 8px; font-size: 14px; box-sizing: border-box; margin-top: 4px;"
placeholder="${placeholder}">
`;
}
@@ -877,7 +917,7 @@ function renderFieldInput(field, fkOptions, isRequired) {
const placeholder = isRequired ? 'Введите значение' : 'Оставьте пустым для NULL';
html += `
<input type="text" id="field_${field.name}"
style="width: 100%; padding: 8px; font-size: 14px; box-sizing: border-box;"
style="width: 100%; padding: 8px; font-size: 14px; box-sizing: border-box; margin-top: 4px;"
placeholder="${placeholder}">
`;
}
@@ -886,6 +926,7 @@ function renderFieldInput(field, fkOptions, isRequired) {
return html;
}
// ✅ Конвертирует значение поля в правильный тип
function convertFieldValue(value, editorType, dataType) {
if (value === null || value === '') {

View File

@@ -159,6 +159,27 @@
background: #ccc;
margin: 0 4px;
}
/* Стили для тултипов */
.tabulator-tooltip {
max-width: 400px;
padding: 8px 12px;
background: #333;
color: white;
border-radius: 4px;
font-size: 13px;
line-height: 1.5;
box-shadow: 0 2px 8px rgba(0,0,0,0.3);
}
.tabulator-tooltip strong {
color: #4CAF50;
}
.tabulator-tooltip em {
color: #b3e5fc;
font-style: normal;
}
</style>
</head>

View File

@@ -33,7 +33,8 @@ class MetaService
$sql = "
SELECT
COLUMN_NAME, DATA_TYPE, COLUMN_TYPE, COLUMN_KEY,
IS_NULLABLE, COLUMN_DEFAULT, EXTRA, ORDINAL_POSITION
IS_NULLABLE, COLUMN_DEFAULT, EXTRA, ORDINAL_POSITION,
COLUMN_COMMENT
FROM information_schema.COLUMNS
WHERE TABLE_SCHEMA = :schema AND TABLE_NAME = :table
ORDER BY ORDINAL_POSITION
@@ -91,13 +92,14 @@ class MetaService
'DATA_TYPE' => $c['DATA_TYPE'],
'COLUMN_TYPE' => $c['COLUMN_TYPE'],
'COLUMN_KEY' => $c['COLUMN_KEY'],
'IS_NULLABLE' => $isNullable, // ✅ Boolean, не строка
'IS_NULLABLE' => $isNullable,
'COLUMN_DEFAULT' => $c['COLUMN_DEFAULT'],
'HAS_DEFAULT' => $hasDefault,
'EXTRA' => $c['EXTRA'],
'COLUMN_COMMENT' => $c['COLUMN_COMMENT'] ?? '', // ✅ Добавлен комментарий
'IS_AUTO_INCREMENT' => str_contains($c['EXTRA'] ?? '', 'auto_increment'),
'ORDINAL_POSITION' => (int)$c['ORDINAL_POSITION'],
'IS_REQUIRED' => !$isNullable && !$hasDefault && !str_contains($c['EXTRA'] ?? '', 'auto_increment'), // ✅ Правильная логика
'IS_REQUIRED' => !$isNullable && !$hasDefault && !str_contains($c['EXTRA'] ?? '', 'auto_increment'),
'EDITOR_TYPE' => $this->getEditorType($c),
'IS_FOREIGN_KEY' => isset($fkMap[$name]),
'FOREIGN_KEY' => $fkMap[$name] ?? null
@@ -113,6 +115,7 @@ class MetaService
];
}
private function getEditorType(array $col): string
{
$type = strtolower($col['DATA_TYPE']);