diff --git a/apps/desktop/src/components/structure/TableStructureEditor.vue b/apps/desktop/src/components/structure/TableStructureEditor.vue index f6ea451cc..a4f2a3027 100644 --- a/apps/desktop/src/components/structure/TableStructureEditor.vue +++ b/apps/desktop/src/components/structure/TableStructureEditor.vue @@ -224,6 +224,7 @@ const structureDensityMetrics: Record< indexes: number[]; minColumnWidth: number; minIndexColumnWidth: number; + actionButtonWidth: number; fontSize: number; shellPadding: number; cellPaddingX: number; @@ -241,6 +242,7 @@ const structureDensityMetrics: Record< indexes: [120, 180, 60, 88, 124, 144, 120, 70], minColumnWidth: 24, minIndexColumnWidth: 48, + actionButtonWidth: 24, fontSize: 11, shellPadding: 10, cellPaddingX: 6, @@ -257,6 +259,7 @@ const structureDensityMetrics: Record< indexes: [148, 224, 72, 108, 148, 180, 148, 84], minColumnWidth: 28, minIndexColumnWidth: 60, + actionButtonWidth: 28, fontSize: 12, shellPadding: 12, cellPaddingX: 8, @@ -273,6 +276,7 @@ const structureDensityMetrics: Record< indexes: [176, 260, 84, 124, 176, 216, 176, 104], minColumnWidth: 32, minIndexColumnWidth: 64, + actionButtonWidth: 32, fontSize: 13, shellPadding: 16, cellPaddingX: 10, @@ -546,8 +550,15 @@ const showExtendedProperties = computed(() => { return dt === "mysql" || dt === "manticoresearch" || isPostgresIdentityType(dt) || dt === "sqlserver"; }); const extendedPropertiesColumnIndex = 8; +const actionButtonGap = 2; +const columnActionButtonCount = computed(() => (canShowColumnDragControls.value ? 2 : 1)); +const columnActionsWidth = computed(() => { + const metric = structureDensityMetric.value; + const count = columnActionButtonCount.value; + return metric.actionButtonWidth * count + actionButtonGap * Math.max(0, count - 1) + metric.cellPaddingX * 2; +}); const visibleColumnIndexes = computed(() => colLabels.value.map((column) => column.widthIndex)); -const visibleColWidths = computed(() => visibleColumnIndexes.value.map((index) => colWidths.value[index] ?? structureDensityMetric.value.minColumnWidth)); +const visibleColWidths = computed(() => colLabels.value.map((column) => (column.key === "actions" ? columnActionsWidth.value : (colWidths.value[column.widthIndex] ?? structureDensityMetric.value.minColumnWidth)))); function columnWidthIndex(visibleIndex: number) { return visibleColumnIndexes.value[visibleIndex] ?? visibleIndex; @@ -983,7 +994,6 @@ function canDragColumn(index: number): boolean { if (!Number.isInteger(index) || index < 0 || index >= columns.value.length) return false; const column = columns.value[index]; if (!column || column.markedForDrop) return false; - if (!column.original) return true; return canShowColumnDragControls.value; } @@ -1002,6 +1012,53 @@ function canDropColumnAt(sourceIndex: number, insertionIndex: number): boolean { const canShowColumnDragControls = computed(() => isCreateMode.value || structureCapabilities.value.reorderColumn); +function isSqlServerIdentityChecked(column: EditableStructureColumn): boolean { + return !!column.extra.autoIncrement || !!column.extra.identity; +} + +function canEditSqlServerIdentity(column: EditableStructureColumn): boolean { + return !column.original && !column.markedForDrop; +} + +function ensureSqlServerIdentity(column: EditableStructureColumn) { + column.extra.autoIncrement = true; + column.extra.identity = { + seed: column.extra.identity?.seed ?? 1, + increment: column.extra.identity?.increment ?? 1, + }; +} + +function setSqlServerIdentity(column: EditableStructureColumn, checked: boolean) { + if (!canEditSqlServerIdentity(column)) return; + if (checked) { + ensureSqlServerIdentity(column); + column.isNullable = false; + } else { + column.extra.autoIncrement = false; + column.extra.identity = undefined; + } +} + +function parseOptionalNumberInput(value: string | number): number | undefined { + if (typeof value === "number") return Number.isFinite(value) ? value : undefined; + const trimmed = value.trim(); + if (!trimmed) return undefined; + const numeric = Number(trimmed); + return Number.isFinite(numeric) ? numeric : undefined; +} + +function updateSqlServerIdentitySeed(column: EditableStructureColumn, value: string | number) { + if (!canEditSqlServerIdentity(column)) return; + ensureSqlServerIdentity(column); + column.extra.identity!.seed = parseOptionalNumberInput(value); +} + +function updateSqlServerIdentityIncrement(column: EditableStructureColumn, value: string | number) { + if (!canEditSqlServerIdentity(column)) return; + ensureSqlServerIdentity(column); + column.extra.identity!.increment = parseOptionalNumberInput(value); +} + function moveColumnTo(index: number, insertionIndex: number) { if (!canDropColumnAt(index, insertionIndex)) return; const nextColumns = [...columns.value]; @@ -1911,42 +1968,34 @@ watch(activeTab, (tab) => {