fix(mysql): keep view edit draft formatted
This commit is contained in:
1 parent
6988f9878f
commit
2f2303e1d6
4 files changed
+49
-4
No files matched your search
@@ -7,7 +7,7 @@ import { useConnectionStore } from "@/stores/connectionStore";
|
||||
import { useSettingsStore } from "@/stores/settingsStore";
|
||||
import { copyToClipboard } from "@/lib/common/clipboard";
|
||||
import { formatSqlForDisplay, type SqlFormatDialect } from "@/lib/sql/sqlFormatter";
|
||||
import { buildEditableObjectSource, buildExecutableObjectSourceStatements, executeObjectSourceSave, formatObjectSourceSaveError } from "@/lib/table/objectSourceEditor";
|
||||
import { buildEditableObjectSource, buildExecutableObjectSourceStatements, executeObjectSourceSave, formatObjectSourceSaveError, resolveObjectSourceEditDraft } from "@/lib/table/objectSourceEditor";
|
||||
import { loadObjectSourceWithRoutineFallback } from "@/lib/table/objectSourceLoad";
|
||||
import { xuguRoutineMetadataFromDefinition, type XuguRoutineMetadata } from "@/lib/table/routineParameters";
|
||||
import { executeWithProductionSqlGuard } from "@/lib/database/productionExecutionGuard";
|
||||
@@ -104,7 +104,7 @@ async function loadSource(nextEditing = props.initialEditing && canEdit.value) {
|
||||
const formatted = await formatSqlForDisplay(editable, props.formatDialect ?? props.dialect, settingsStore.editorSettings.sqlFormatter);
|
||||
editableText.value = editable;
|
||||
content.value = formatted;
|
||||
draft.value = nextEditing && canEdit.value ? editable : "";
|
||||
draft.value = nextEditing && canEdit.value ? resolveObjectSourceEditDraft(props.databaseType, resolvedType, formatted, editable) : "";
|
||||
editing.value = nextEditing && canEdit.value;
|
||||
if (nextEditing && !canEdit.value) {
|
||||
toast(t("objects.sourceReadOnly"), 3000);
|
||||
@@ -131,7 +131,7 @@ function editSource() {
|
||||
if (!canEdit.value) toast(t("objects.sourceReadOnly"), 3000);
|
||||
return;
|
||||
}
|
||||
draft.value = editableText.value;
|
||||
draft.value = resolveObjectSourceEditDraft(props.databaseType, resolvedObjectType.value, content.value, editableText.value);
|
||||
saveError.value = "";
|
||||
editing.value = true;
|
||||
}
|
||||
|
||||
+14
@@ -0,0 +1,14 @@
|
||||
import { readFileSync } from "node:fs";
|
||||
import { describe, expect, it } from "vitest";
|
||||
|
||||
const objectSourceDialogSource = readFileSync(new URL("../ObjectSourceDialog.vue", import.meta.url), "utf8");
|
||||
|
||||
describe("ObjectSourceDialog edit draft wiring (issue #5057)", () => {
|
||||
it("seeds the initial edit draft from the pretty-printed source, not the raw single-line definition", () => {
|
||||
expect(objectSourceDialogSource).toMatch(/draft\.value = nextEditing && canEdit\.value \? resolveObjectSourceEditDraft\(props\.databaseType, resolvedType, formatted, editable\) : "";/);
|
||||
});
|
||||
|
||||
it("seeds the draft opened via the Edit button from the pretty-printed source, not the raw single-line definition", () => {
|
||||
expect(objectSourceDialogSource).toMatch(/function editSource\(\) \{[\s\S]*?draft\.value = resolveObjectSourceEditDraft\(props\.databaseType, resolvedObjectType\.value, content\.value, editableText\.value\);/);
|
||||
});
|
||||
});
|
||||
@@ -1,6 +1,7 @@
|
||||
import { beforeEach, describe, expect, it, vi } from "vitest";
|
||||
import * as api from "@/lib/backend/api";
|
||||
import { executeObjectSourceSave, formatObjectSourceSaveError } from "@/lib/table/objectSourceEditor";
|
||||
import { executeObjectSourceSave, formatObjectSourceSaveError, resolveObjectSourceEditDraft } from "@/lib/table/objectSourceEditor";
|
||||
import { formatSqlForDisplay } from "@/lib/sql/sqlFormatter";
|
||||
|
||||
vi.mock("@/lib/backend/api", () => ({
|
||||
executeInTransaction: vi.fn().mockResolvedValue({}),
|
||||
@@ -62,3 +63,28 @@ describe("formatObjectSourceSaveError", () => {
|
||||
expect(formatObjectSourceSaveError(formatted, "postgres", "VIEW", hint)).toBe(formatted);
|
||||
});
|
||||
});
|
||||
|
||||
describe("resolveObjectSourceEditDraft", () => {
|
||||
const mysqlSingleLineViewDefinition = "CREATE VIEW `v_active_users` AS select `users`.`id` AS `id`,`users`.`name` AS `name` from `users` where (`users`.`active` = 1)";
|
||||
|
||||
it("uses the pretty-printed draft for MySQL views (issue #5057)", async () => {
|
||||
const formatted = await formatSqlForDisplay(mysqlSingleLineViewDefinition, "mysql");
|
||||
|
||||
expect(formatted).not.toBe(mysqlSingleLineViewDefinition);
|
||||
expect(formatted.split("\n").length).toBeGreaterThan(1);
|
||||
expect(resolveObjectSourceEditDraft("mysql", "VIEW", formatted, mysqlSingleLineViewDefinition)).toBe(formatted);
|
||||
});
|
||||
|
||||
it("keeps raw editable source for other database and object types", () => {
|
||||
const formatted = "CREATE VIEW v AS\nSELECT 1";
|
||||
|
||||
expect(resolveObjectSourceEditDraft("postgres", "VIEW", formatted, mysqlSingleLineViewDefinition)).toBe(mysqlSingleLineViewDefinition);
|
||||
expect(resolveObjectSourceEditDraft("mysql", "FUNCTION", formatted, mysqlSingleLineViewDefinition)).toBe(mysqlSingleLineViewDefinition);
|
||||
expect(resolveObjectSourceEditDraft(undefined, "VIEW", formatted, mysqlSingleLineViewDefinition)).toBe(mysqlSingleLineViewDefinition);
|
||||
});
|
||||
|
||||
it("falls back to raw MySQL view source when formatting produced nothing usable", () => {
|
||||
expect(resolveObjectSourceEditDraft("mysql", "VIEW", "", mysqlSingleLineViewDefinition)).toBe(mysqlSingleLineViewDefinition);
|
||||
expect(resolveObjectSourceEditDraft("mysql", "VIEW", " ", mysqlSingleLineViewDefinition)).toBe(mysqlSingleLineViewDefinition);
|
||||
});
|
||||
});
|
||||
@@ -60,6 +60,11 @@ export async function buildExecutableObjectSourceSql(input: BuildEditableObjectS
|
||||
return api.buildExecutableObjectSourceSql(input);
|
||||
}
|
||||
|
||||
export function resolveObjectSourceEditDraft(databaseType: DatabaseType | undefined, objectType: ObjectSourceKind, formatted: string, editable: string): string {
|
||||
if (databaseType === "mysql" && objectType === "VIEW" && formatted.trim()) return formatted;
|
||||
return editable;
|
||||
}
|
||||
|
||||
export function buildEditableObjectSource(input: BuildEditableObjectSourceSqlInput): Promise<string> {
|
||||
return api.buildEditableObjectSource(input);
|
||||
}
|
||||
|
||||
Reference in new issue
Block a user