fix(metadata): unify enum column metadata

This commit is contained in:
onenewcode authored and GitHub committed 2026-07-08 21:02:53 +08:00
1 parent c32d0b7d6e
commit 1b13d2176b
21 files changed
+675 -202

No files matched your search

@@ -116,7 +116,6 @@ import { renderWktOnCanvas, isHexGeometry } from "@/lib/dataGrid/geometryPreview
import { buildDataGridCellDetail, buildDataGridColumnDetail, buildDataGridRowDetail, dataGridColumnDetailJson, dataGridColumnDetailTsv, dataGridRowDetailJson, dataGridRowDetailTsv, filterDataGridDetailFields, type DataGridCellDetail } from "@/lib/dataGrid/dataGridDetail";
import { applyColumnFormatter, buildColumnFormatterKey, normalizeColumnFormatter, resolveColumnFormatter, type ColumnFormatterConfig, type DateTimeFormatterUnit, DateTimePatterns } from "@/lib/dataGrid/columnFormatter";
import { temporalCellEditorKind, type TemporalCellEditorKind } from "@/lib/dataGrid/dataGridTemporalEditor";
import { isEnumColumn, enumValuesForColumn } from "@/lib/dataGrid/dataGridEnumEditor";
import { isCancelSearchShortcut, isCopyCurrentRowShortcut, isDeleteCurrentRowShortcut, isFocusSearchShortcut, isModRShortcut, isSaveShortcut, isToggleTransposeShortcut } from "@/lib/editor/keyboardShortcuts";
import { dataGridHeaderContentWidth, scrollbarGutterWidth } from "@/lib/dataGrid/dataGridScrollGutter";
import { canGoNextDataGridPage } from "@/lib/dataGrid/dataGridPagination";
@@ -3997,11 +3996,11 @@ function temporalEditorKindForColumn(columnIndex: number): TemporalCellEditorKin
}
function enumValuesForGridColumn(columnIndex: number): string[] {
return enumValuesForColumn(tableColumnForGridColumn(columnIndex));
return tableColumnForGridColumn(columnIndex)?.enum_values ?? [];
}
function isEnumGridColumn(columnIndex: number): boolean {
return isEnumColumn(tableColumnForGridColumn(columnIndex));
return (tableColumnForGridColumn(columnIndex)?.enum_values?.length ?? 0) > 0;
}
function isEnumGridColumnNullable(columnIndex: number): boolean {
@@ -1,60 +0,0 @@
import type { ColumnInfo } from "@/types/database";
/**
* Check if the column's data_type is a MySQL ENUM type definition.
* Matches patterns like `enum('value1','value2')` (case-insensitive).
*/
export function isEnumColumn(columnInfo: Pick<ColumnInfo, "data_type"> | undefined): boolean {
if (!columnInfo?.data_type) return false;
return /^enum\s*\(/i.test(columnInfo.data_type.trim());
}
/**
* Parse MySQL ENUM values from a data_type string like `enum('a','b',...)`.
* Handles escaped single quotes ('' → ').
* Returns an empty array for unparseable input.
*/
export function enumValuesForColumn(columnInfo: Pick<ColumnInfo, "data_type"> | undefined): string[] {
if (!isEnumColumn(columnInfo)) return [];
const raw = columnInfo!.data_type.trim();
const match = raw.match(/^enum\s*\(/i);
if (!match) return [];
const values: string[] = [];
let i = match[0].length;
while (i < raw.length) {
// MySQL may append CHARACTER SET/COLLATE after the enum value list.
if (raw[i] === ")") {
i++;
return i >= raw.length || /\s/.test(raw[i]) ? values : [];
}
while (i < raw.length && (/\s/.test(raw[i]) || raw[i] === ",")) i++;
if (i >= raw.length) break;
if (raw[i] === ")") continue;
if (raw[i] !== "'") return [];
i++;
let value = "";
let closed = false;
while (i < raw.length) {
if (raw[i] === "'") {
if (i + 1 < raw.length && raw[i + 1] === "'") {
value += "'";
i += 2;
} else {
i++;
closed = true;
break;
}
} else {
value += raw[i];
i++;
}
}
if (!closed) return [];
values.push(value);
}
return [];
}
+1
View File
@@ -349,6 +349,7 @@ export interface ColumnInfo {
numeric_precision?: number | null;
numeric_scale?: number | null;
character_maximum_length?: number | null;
enum_values?: string[] | null;
}
export interface IndexInfo {