fix(mysql): edit enum column values
This commit is contained in:
1 parent
ea8b3f9800
commit
8c7e34a6de
14 files changed
+283
-54
No files matched your search
@@ -45,9 +45,11 @@ import {
|
||||
getDataTypeOptions,
|
||||
getDefaultLengthForType,
|
||||
isDataTypeLengthDisabled,
|
||||
isMysqlEnumDataType,
|
||||
isMysqlCharacterDataType,
|
||||
isProtectedManticoreIdColumn,
|
||||
isSqlServerIdentityCompatibleDataType,
|
||||
mysqlEnumDataType,
|
||||
parseExtraToColumnExtra,
|
||||
rehydrateColumnDraftsFromMetadata,
|
||||
splitDataType,
|
||||
@@ -1247,6 +1249,7 @@ async function addColumn() {
|
||||
id: `new:${uuid()}`,
|
||||
name: "",
|
||||
dataType,
|
||||
enumValues: [],
|
||||
isNullable: true,
|
||||
defaultValue: "",
|
||||
comment: "",
|
||||
@@ -1377,7 +1380,12 @@ function updateSqlServerIdentityIncrement(column: EditableStructureColumn, value
|
||||
}
|
||||
|
||||
function updateColumnDataType(column: EditableStructureColumn, baseType: string) {
|
||||
column.dataType = combineDataTypeForDatabase(databaseType.value, baseType, getDefaultLengthForType(databaseType.value, baseType));
|
||||
if (isMysqlEnumDataType(databaseType.value, baseType)) {
|
||||
if (!column.enumValues?.length) column.enumValues = [""];
|
||||
column.dataType = mysqlEnumDataType(column.enumValues);
|
||||
} else {
|
||||
column.dataType = combineDataTypeForDatabase(databaseType.value, baseType, getDefaultLengthForType(databaseType.value, baseType));
|
||||
}
|
||||
syncSqlServerIdentityForDataType(column);
|
||||
// Clear charset/collation when switching to a non-character MySQL type
|
||||
if (showCharacterSet.value && !isMysqlCharacterDataType(column.dataType)) {
|
||||
@@ -1386,6 +1394,24 @@ function updateColumnDataType(column: EditableStructureColumn, baseType: string)
|
||||
}
|
||||
}
|
||||
|
||||
function updateMysqlEnumValue(column: EditableStructureColumn, index: number, value: string | number) {
|
||||
if (!column.enumValues || index < 0 || index >= column.enumValues.length) return;
|
||||
column.enumValues[index] = String(value);
|
||||
column.dataType = mysqlEnumDataType(column.enumValues);
|
||||
}
|
||||
|
||||
function addMysqlEnumValue(column: EditableStructureColumn) {
|
||||
column.enumValues ??= [];
|
||||
column.enumValues.push("");
|
||||
column.dataType = mysqlEnumDataType(column.enumValues);
|
||||
}
|
||||
|
||||
function removeMysqlEnumValue(column: EditableStructureColumn, index: number) {
|
||||
if (!column.enumValues || column.enumValues.length <= 1) return;
|
||||
column.enumValues.splice(index, 1);
|
||||
column.dataType = mysqlEnumDataType(column.enumValues);
|
||||
}
|
||||
|
||||
function updateColumnDataTypeLength(column: EditableStructureColumn, value: string | number) {
|
||||
column.dataType = combineDataTypeForDatabase(databaseType.value, splitDataType(column.dataType).baseType, String(value));
|
||||
syncSqlServerIdentityForDataType(column);
|
||||
@@ -2385,7 +2411,32 @@ watch(activeTab, (tab) => {
|
||||
<Input v-else :model-value="splitDataType(column.dataType).baseType" :class="[structureMonoControlClass, 'w-full']" disabled />
|
||||
</td>
|
||||
<td v-if="columnEditorControls.length" :class="structureCellClass">
|
||||
<Input :model-value="dataTypeLengthInputValue(databaseType, column.dataType)" :class="structureMonoControlClass" :disabled="isColumnLengthDisabled(column)" @update:model-value="updateColumnDataTypeLength(column, $event)" />
|
||||
<Popover v-if="isMysqlEnumDataType(databaseType, column.dataType)">
|
||||
<PopoverTrigger as-child>
|
||||
<Button variant="outline" size="sm" :class="[structureMonoControlClass, 'w-full justify-between px-2']" :disabled="isColumnTypeDisabled(column)">
|
||||
<span>{{ t("structureEditor.enumValueCount", { count: column.enumValues?.length ?? 0 }) }}</span>
|
||||
<ListChevronsUpDown :class="structureIconClass" />
|
||||
</Button>
|
||||
</PopoverTrigger>
|
||||
<PopoverContent class="w-80 p-3" align="start">
|
||||
<div class="mb-2 flex items-center justify-between gap-2">
|
||||
<span class="text-sm font-medium">{{ t("structureEditor.enumValues") }}</span>
|
||||
<Button variant="outline" size="sm" class="h-7 px-2" @click="addMysqlEnumValue(column)">
|
||||
<Plus class="mr-1 h-3.5 w-3.5" />
|
||||
{{ t("structureEditor.addEnumValue") }}
|
||||
</Button>
|
||||
</div>
|
||||
<div class="max-h-64 space-y-1.5 overflow-y-auto pr-1">
|
||||
<div v-for="(value, valueIndex) in column.enumValues" :key="valueIndex" class="flex items-center gap-1.5">
|
||||
<Input :model-value="value" :class="structureMonoControlClass" :placeholder="t('structureEditor.enumValuePlaceholder')" @update:model-value="updateMysqlEnumValue(column, valueIndex, $event)" />
|
||||
<Button variant="ghost" size="icon" class="h-8 w-8 shrink-0" :disabled="(column.enumValues?.length ?? 0) <= 1" :title="t('structureEditor.removeEnumValue')" @click="removeMysqlEnumValue(column, valueIndex)">
|
||||
<Trash2 class="h-3.5 w-3.5" />
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
</PopoverContent>
|
||||
</Popover>
|
||||
<Input v-else :model-value="dataTypeLengthInputValue(databaseType, column.dataType)" :class="structureMonoControlClass" :disabled="isColumnLengthDisabled(column)" @update:model-value="updateColumnDataTypeLength(column, $event)" />
|
||||
</td>
|
||||
<td v-if="columnEditorControls.nullable" :class="structureCellClass">
|
||||
<label class="flex items-center gap-1.5">
|
||||
|
||||
Reference in new issue
Block a user