SQL comments for rows used now in tolltips
This commit is contained in:
@@ -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 === '') {
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -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']);
|
||||
|
||||
Reference in New Issue
Block a user