feat(sidebar): add routine source open mode
This commit is contained in:
1 parent
2152f8cde8
commit
d928412bf6
16 files changed
+161
-6
No files matched your search
@@ -2193,7 +2193,17 @@ onUnmounted(() => {
|
||||
/>
|
||||
|
||||
<div :class="isClassicLayout ? 'app-layout-classic flex-1 flex min-h-0' : 'app-panel-gutter flex-1 flex min-h-0 gap-1 p-1'">
|
||||
<AppSidebar v-show="sidebarOpen" ref="appSidebarRef" :sidebar-width="sidebarWidth" :classic-layout="isClassicLayout" @import="dialogs.onImportClick" @export="dialogs.onExportClick" @start-resize="startSidebarResize" @collapse="setSidebarOpen(false)" />
|
||||
<AppSidebar
|
||||
v-show="sidebarOpen"
|
||||
ref="appSidebarRef"
|
||||
:sidebar-width="sidebarWidth"
|
||||
:classic-layout="isClassicLayout"
|
||||
@import="dialogs.onImportClick"
|
||||
@export="dialogs.onExportClick"
|
||||
@start-resize="startSidebarResize"
|
||||
@collapse="setSidebarOpen(false)"
|
||||
@open-settings="(initialTab) => openSettings(initialTab ?? 'appearance')"
|
||||
/>
|
||||
<div v-show="!sidebarOpen" class="flex h-full w-8 shrink-0 items-start justify-center border-r bg-background/80 pt-2" :class="isClassicLayout ? '' : 'rounded-md border border-border/80'">
|
||||
<Button variant="ghost" size="icon" class="h-7 w-7" :title="t('sidebar.expand')" :aria-label="t('sidebar.expand')" @click="setSidebarOpen(true)">
|
||||
<ChevronsRight class="h-4 w-4" />
|
||||
|
||||
@@ -375,6 +375,7 @@ const editingShortcutId = ref<ShortcutActionId | null>(null);
|
||||
const editSidebarActivation = ref(settingsStore.editorSettings.sidebarActivation);
|
||||
const editSidebarObjectDisplay = ref(settingsStore.editorSettings.sidebarObjectDisplay);
|
||||
const sidebarObjectDisplayHelp = ref<"grouped" | "simple" | null>(null);
|
||||
const editRoutineSourceOpenMode = ref(settingsStore.editorSettings.routineSourceOpenMode);
|
||||
const editSidebarTableSearchEnabled = ref(settingsStore.editorSettings.sidebarTableSearchEnabled);
|
||||
const editAutoSelectActiveSidebarNode = ref(settingsStore.editorSettings.autoSelectActiveSidebarNode);
|
||||
const editOpenTabsRestoreMode = ref<OpenTabsRestoreMode>(settingsStore.editorSettings.openTabsRestoreMode);
|
||||
@@ -478,6 +479,7 @@ function currentEditorSettingsDraft(): EditorSettingsDraft {
|
||||
sqlFormatter: normalizeSqlFormatterSettings(editSqlFormatter.value),
|
||||
sidebarActivation: editSidebarActivation.value,
|
||||
sidebarObjectDisplay: editSidebarObjectDisplay.value,
|
||||
routineSourceOpenMode: editRoutineSourceOpenMode.value,
|
||||
sidebarTableSearchEnabled: editSidebarTableSearchEnabled.value,
|
||||
autoSelectActiveSidebarNode: editAutoSelectActiveSidebarNode.value,
|
||||
openTabsRestoreMode: editOpenTabsRestoreMode.value,
|
||||
@@ -742,6 +744,7 @@ function syncEditorSettingsDraftFromStore() {
|
||||
sqlFormatterConfigValid.value = true;
|
||||
editSidebarActivation.value = settingsStore.editorSettings.sidebarActivation;
|
||||
editSidebarObjectDisplay.value = settingsStore.editorSettings.sidebarObjectDisplay;
|
||||
editRoutineSourceOpenMode.value = settingsStore.editorSettings.routineSourceOpenMode;
|
||||
editSidebarTableSearchEnabled.value = settingsStore.editorSettings.sidebarTableSearchEnabled;
|
||||
editAutoSelectActiveSidebarNode.value = settingsStore.editorSettings.autoSelectActiveSidebarNode;
|
||||
editOpenTabsRestoreMode.value = settingsStore.editorSettings.openTabsRestoreMode;
|
||||
@@ -944,6 +947,7 @@ function resetDefaultsForTab(tab: SettingsCategory) {
|
||||
editSidebarTablePageSize.value = DEFAULT_SIDEBAR_TABLE_PAGE_SIZE;
|
||||
editSidebarActivation.value = DEFAULT_EDITOR_SETTINGS.sidebarActivation;
|
||||
editSidebarObjectDisplay.value = DEFAULT_EDITOR_SETTINGS.sidebarObjectDisplay;
|
||||
editRoutineSourceOpenMode.value = DEFAULT_EDITOR_SETTINGS.routineSourceOpenMode;
|
||||
editSidebarTableSearchEnabled.value = DEFAULT_EDITOR_SETTINGS.sidebarTableSearchEnabled;
|
||||
editAutoSelectActiveSidebarNode.value = DEFAULT_EDITOR_SETTINGS.autoSelectActiveSidebarNode;
|
||||
editOpenTabsRestoreMode.value = DEFAULT_EDITOR_SETTINGS.openTabsRestoreMode;
|
||||
@@ -1032,6 +1036,7 @@ function resetAllDefaults() {
|
||||
sqlFormatterConfigValid.value = true;
|
||||
editSidebarActivation.value = DEFAULT_EDITOR_SETTINGS.sidebarActivation;
|
||||
editSidebarObjectDisplay.value = DEFAULT_EDITOR_SETTINGS.sidebarObjectDisplay;
|
||||
editRoutineSourceOpenMode.value = DEFAULT_EDITOR_SETTINGS.routineSourceOpenMode;
|
||||
editSidebarTableSearchEnabled.value = DEFAULT_EDITOR_SETTINGS.sidebarTableSearchEnabled;
|
||||
editAutoSelectActiveSidebarNode.value = DEFAULT_EDITOR_SETTINGS.autoSelectActiveSidebarNode;
|
||||
editOpenTabsRestoreMode.value = DEFAULT_EDITOR_SETTINGS.openTabsRestoreMode;
|
||||
@@ -1256,6 +1261,10 @@ function setSidebarObjectDisplay(value: "grouped" | "simple") {
|
||||
editSidebarObjectDisplay.value = value;
|
||||
}
|
||||
|
||||
function setRoutineSourceOpenMode(value: "query-tab" | "dialog") {
|
||||
editRoutineSourceOpenMode.value = value;
|
||||
}
|
||||
|
||||
function setIconTheme(value: DesktopIconTheme) {
|
||||
editIconTheme.value = value;
|
||||
}
|
||||
@@ -4098,6 +4107,32 @@ onUnmounted(cleanupPreviewEditor);
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="space-y-2">
|
||||
<div class="flex items-center gap-2">
|
||||
<Label>{{ t("settings.routineSourceOpenMode") }}</Label>
|
||||
<HelpTooltip :label="t('settings.routineSourceOpenMode')">
|
||||
{{ t("settings.routineSourceOpenModeQueryTabDescription") }}
|
||||
</HelpTooltip>
|
||||
</div>
|
||||
<div class="grid grid-cols-2 gap-2">
|
||||
<Button type="button" variant="outline" class="h-auto justify-start border p-3" :class="editRoutineSourceOpenMode === 'query-tab' ? 'dbx-choice-selected' : ''" @click="setRoutineSourceOpenMode('query-tab')">
|
||||
<div class="text-left">
|
||||
<div class="text-sm font-medium">{{ t("settings.routineSourceOpenModeQueryTab") }}</div>
|
||||
<div class="text-xs text-muted-foreground">
|
||||
{{ t("settings.routineSourceOpenModeQueryTabDescription") }}
|
||||
</div>
|
||||
</div>
|
||||
</Button>
|
||||
<Button type="button" variant="outline" class="h-auto justify-start border p-3" :class="editRoutineSourceOpenMode === 'dialog' ? 'dbx-choice-selected' : ''" @click="setRoutineSourceOpenMode('dialog')">
|
||||
<div class="text-left">
|
||||
<div class="text-sm font-medium">{{ t("settings.routineSourceOpenModeDialog") }}</div>
|
||||
<div class="text-xs text-muted-foreground">
|
||||
{{ t("settings.routineSourceOpenModeDialogDescription") }}
|
||||
</div>
|
||||
</div>
|
||||
</Button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-center justify-between gap-4 rounded-md border bg-muted/20 px-3 py-2">
|
||||
<div class="flex items-center gap-2">
|
||||
<Label for="sidebar-table-search-enabled">{{ t("settings.sidebarTableSearchEnabled") }}</Label>
|
||||
|
||||
@@ -22,6 +22,7 @@ const emit = defineEmits<{
|
||||
export: [];
|
||||
startResize: [event: MouseEvent];
|
||||
collapse: [];
|
||||
"open-settings": [initialTab: string];
|
||||
}>();
|
||||
|
||||
type ImportSource = "dbx" | "navicat" | "dbeaver" | "datagrip";
|
||||
@@ -243,7 +244,7 @@ defineExpose({ focusSearch });
|
||||
</template>
|
||||
</div>
|
||||
<div class="flex-1 min-h-0">
|
||||
<ConnectionTree ref="connectionTreeRef" />
|
||||
<ConnectionTree ref="connectionTreeRef" @open-settings="(initialTab) => emit('open-settings', initialTab)" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="panel-resize-handle panel-resize-handle--right" @mousedown="emit('startResize', $event)" />
|
||||
|
||||
@@ -62,6 +62,10 @@ const sidebarScrollbarTrackRef = ref<HTMLElement | null>(null);
|
||||
const sidebarHorizontalScrollbarTrackRef = ref<HTMLElement | null>(null);
|
||||
const sidebarContextMenuRef = ref<{ close: () => void } | null>(null);
|
||||
const sidebarContextMenuItems = ref<ContextMenuItem[]>([]);
|
||||
const emit = defineEmits<{
|
||||
"open-settings": [initialTab: string];
|
||||
}>();
|
||||
|
||||
const sidebarContextMenuTarget = ref<SidebarActionTarget | null>(null);
|
||||
const sidebarDangerDialogRequest = ref<SidebarDangerDialogRequest | null>(null);
|
||||
const sidebarDangerDialogOpen = ref(false);
|
||||
@@ -1219,6 +1223,10 @@ function openSidebarObjectSource(node: TreeNode, initialEditing: boolean) {
|
||||
});
|
||||
}
|
||||
|
||||
function openSidebarSettings(initialTab: string) {
|
||||
emit("open-settings", initialTab);
|
||||
}
|
||||
|
||||
function openSidebarProcedure(node: TreeNode) {
|
||||
if (node.type !== "procedure" || !node.connectionId || !node.database) return;
|
||||
beginSidebarAction();
|
||||
@@ -1605,6 +1613,7 @@ defineExpose({ focusSearch, createNewGroup, collapseAllTreeNodes });
|
||||
@open-ddl="openSidebarDdl"
|
||||
@open-object-source="openSidebarObjectSource"
|
||||
@open-procedure="openSidebarProcedure"
|
||||
@open-settings="openSidebarSettings"
|
||||
@open-data="openSidebarData"
|
||||
@open-visible-databases="openSidebarVisibleDatabases"
|
||||
@open-visible-schemas="openSidebarVisibleSchemas"
|
||||
|
||||
@@ -52,6 +52,7 @@ import {
|
||||
ListX,
|
||||
Info,
|
||||
X,
|
||||
Settings2,
|
||||
} from "@lucide/vue";
|
||||
import type { ContextMenuItem } from "@/components/ui/CustomContextMenu.vue";
|
||||
import { CONNECTION_ATTEMPT_CANCELLED_MESSAGE, useConnectionStore } from "@/stores/connectionStore";
|
||||
@@ -316,6 +317,7 @@ const emit = defineEmits<{
|
||||
"open-ddl": [node: TreeNode];
|
||||
"open-object-source": [node: TreeNode, initialEditing: boolean];
|
||||
"open-procedure": [node: TreeNode];
|
||||
"open-settings": [initialTab: string];
|
||||
"open-data": [node: TreeNode, requireSelection: boolean, openMode: DataTabOpenMode, runner: (node: TreeNode, request: SidebarDataOpenRequest) => Promise<void>];
|
||||
"open-visible-databases": [node: TreeNode];
|
||||
"open-visible-schemas": [node: TreeNode];
|
||||
@@ -1508,12 +1510,38 @@ async function refreshDropTableChildObjectPreviewSql() {
|
||||
function openObjectSourceDialog(initialEditing: boolean) {
|
||||
const node = activeNode.value;
|
||||
if (!node.connectionId || !node.database) return;
|
||||
const connectionId = node.connectionId;
|
||||
const database = node.database;
|
||||
const objectType = objectSourceKindForTreeNode(node.type);
|
||||
if (!objectType) return;
|
||||
const openMode = settingsStore.editorSettings.routineSourceOpenMode;
|
||||
if (openMode === "query-tab") {
|
||||
void connectionStore
|
||||
.ensureConnected(connectionId)
|
||||
.then(async () => {
|
||||
connectionStore.activeConnectionId = connectionId;
|
||||
const schema = node.schema || database;
|
||||
const result = await api.getObjectSource(connectionId, database, schema, node.objectName || node.label, objectType as any, node.signature);
|
||||
const tabId = queryStore.createTab(connectionId, database, `Source - ${node.label}`, "query", schema, result.source, node.catalog, { forceNew: true });
|
||||
const sourceIsEditable = result.editable !== false && !["SEQUENCE", "TRIGGER", "TYPE", "TYPE_BODY"].includes(objectType);
|
||||
if (sourceIsEditable) {
|
||||
queryStore.setObjectSource(tabId, {
|
||||
schema,
|
||||
name: node.objectName || node.label,
|
||||
objectType,
|
||||
signature: node.signature,
|
||||
});
|
||||
}
|
||||
})
|
||||
.catch((e: any) => {
|
||||
toast(e?.message || String(e), 5000);
|
||||
});
|
||||
return;
|
||||
}
|
||||
void connectionStore
|
||||
.ensureConnected(node.connectionId)
|
||||
.ensureConnected(connectionId)
|
||||
.then(() => {
|
||||
connectionStore.activeConnectionId = node.connectionId!;
|
||||
connectionStore.activeConnectionId = connectionId;
|
||||
emit("open-object-source", node, initialEditing);
|
||||
})
|
||||
.catch((e: any) => {
|
||||
@@ -4150,6 +4178,7 @@ function buildObjectSidebarMenu(context: SidebarMenuFactoryContext): boolean {
|
||||
action: () => emit("open-ddl", node),
|
||||
icon: FileCode,
|
||||
});
|
||||
items.push({ label: t("contextMenu.changeOpenMode"), action: () => emit("open-settings", "navigation"), icon: Settings2 });
|
||||
}
|
||||
if (canOpenStructureEditor.value) {
|
||||
items.push({ label: t("contextMenu.editStructure"), action: openStructureEditor, icon: PencilRuler });
|
||||
@@ -4314,6 +4343,8 @@ function buildObjectSidebarMenu(context: SidebarMenuFactoryContext): boolean {
|
||||
});
|
||||
}
|
||||
items.push({ label: "", separator: true });
|
||||
items.push({ label: t("contextMenu.changeOpenMode"), action: () => emit("open-settings", "navigation"), icon: Settings2 });
|
||||
items.push({ label: "", separator: true });
|
||||
items.push({
|
||||
label: deleteMenuLabel(node.type === "procedure" ? t("contextMenu.dropProcedure") : t("contextMenu.dropFunction")),
|
||||
action: deleteMenuAction(requestDropObject),
|
||||
@@ -4326,15 +4357,15 @@ function buildObjectSidebarMenu(context: SidebarMenuFactoryContext): boolean {
|
||||
|
||||
if (node.type === "sequence") {
|
||||
items.push({ label: t("contextMenu.viewSource"), action: () => openObjectSourceDialog(false), icon: Code2 });
|
||||
items.push({ label: "", separator: true });
|
||||
items.push({ label: t("contextMenu.copyName"), action: copyName, icon: Copy, shortcut: shortcutCopyName.value });
|
||||
items.push({ label: t("contextMenu.changeOpenMode"), action: () => emit("open-settings", "navigation"), icon: Settings2 });
|
||||
return true;
|
||||
}
|
||||
|
||||
if (node.type === "trigger" || node.type === "package" || node.type === "package-body" || node.type === "type" || node.type === "type-body") {
|
||||
items.push({ label: t("contextMenu.viewSource"), action: () => openObjectSourceDialog(false), icon: Code2 });
|
||||
items.push({ label: "", separator: true });
|
||||
items.push({ label: t("contextMenu.copyName"), action: copyName, icon: Copy, shortcut: shortcutCopyName.value });
|
||||
items.push({ label: t("contextMenu.changeOpenMode"), action: () => emit("open-settings", "navigation"), icon: Settings2 });
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
|
||||
@@ -2036,6 +2036,7 @@ export default {
|
||||
dropTableSuccess: 'Table "{name}" dropped',
|
||||
editView: "Edit View",
|
||||
viewSource: "View Source",
|
||||
changeOpenMode: "Change open mode",
|
||||
viewDdl: "View DDL",
|
||||
viewDdlLoading: "Loading DDL...",
|
||||
ddlCopied: "DDL copied",
|
||||
@@ -4430,6 +4431,11 @@ export default {
|
||||
sidebarObjectDisplayGroupedDescription: "Group objects by tables, views, procedures, and functions for databases with more object types.",
|
||||
sidebarObjectDisplaySimple: "Simple view",
|
||||
sidebarObjectDisplaySimpleDescription: "List tables and views directly under each database or schema to reduce intermediate levels.",
|
||||
routineSourceOpenMode: "Function / procedure / view open mode",
|
||||
routineSourceOpenModeQueryTab: "Data tab",
|
||||
routineSourceOpenModeQueryTabDescription: "Open source in a new data tab, the same way as running SQL queries.",
|
||||
routineSourceOpenModeDialog: "Dialog window",
|
||||
routineSourceOpenModeDialogDescription: "Open source in a popup dialog for quick viewing and editing.",
|
||||
autoSelectActiveSidebarNode: "Always select opened item",
|
||||
autoSelectActiveSidebarNodeDescription: "When switching tabs, select the matching visible table, collection, or SQL file in the sidebar.",
|
||||
openTabsRestoreMode: "Restore tabs on launch",
|
||||
|
||||
@@ -2136,6 +2136,7 @@ export default withEnglishFallback({
|
||||
createProcedure: "Nuevo procedimiento almacenado",
|
||||
createFunction: "Nueva función",
|
||||
createTrigger: "Nuevo disparador",
|
||||
changeOpenMode: "Modificar modo de apertura",
|
||||
},
|
||||
visibleDatabases: {
|
||||
title: "Bases de datos visibles",
|
||||
@@ -4610,6 +4611,11 @@ export default withEnglishFallback({
|
||||
dateTimeFormatAuto: "Reconocimiento automático",
|
||||
dateTimeFormatSearchPlaceholder: "Seleccionar o ingresar formato",
|
||||
dateTimeFormatEmpty: "Ingresar formato de fecha y hora personalizado",
|
||||
routineSourceOpenMode: "Modo de apertura de funciones/procedimientos/vistas",
|
||||
routineSourceOpenModeQueryTab: "Pestaña de datos",
|
||||
routineSourceOpenModeQueryTabDescription: "Abrir el código fuente en una nueva pestaña de datos, de la misma manera que al ejecutar consultas SQL.",
|
||||
routineSourceOpenModeDialog: "Ventana emergente",
|
||||
routineSourceOpenModeDialogDescription: "Abrir el código fuente en una ventana emergente para una visualización y edición rápidas.",
|
||||
},
|
||||
driverStore: {
|
||||
jreDirRemoveFailed: "No se pudo eliminar el directorio JRE antiguo: {path} (error original: {error})",
|
||||
|
||||
@@ -2134,6 +2134,7 @@ export default withEnglishFallback({
|
||||
createProcedure: "Nuovo stored procedure",
|
||||
createFunction: "Nuova funzione",
|
||||
createTrigger: "Nuovo trigger",
|
||||
changeOpenMode: "Modifica modalità apertura",
|
||||
},
|
||||
visibleDatabases: {
|
||||
title: "Database Visibili",
|
||||
@@ -4608,6 +4609,11 @@ export default withEnglishFallback({
|
||||
dateTimeFormatAuto: "Riconoscimento automatico",
|
||||
dateTimeFormatSearchPlaceholder: "Seleziona o inserisci il formato",
|
||||
dateTimeFormatEmpty: "Inserisci un formato data/ora personalizzato",
|
||||
routineSourceOpenMode: "Modalità apertura funzioni/procedure/viste",
|
||||
routineSourceOpenModeQueryTab: "Scheda dati",
|
||||
routineSourceOpenModeQueryTabDescription: "Apre il codice sorgente in una nuova scheda dati, come per l'esecuzione di query SQL.",
|
||||
routineSourceOpenModeDialog: "Finestra a comparsa",
|
||||
routineSourceOpenModeDialogDescription: "Apre il codice sorgente in una finestra di dialogo a comparsa per una rapida visualizzazione e modifica.",
|
||||
},
|
||||
driverStore: {
|
||||
jreDirRemoveFailed: "Impossibile rimuovere la vecchia directory JRE: {path} (errore originale: {error})",
|
||||
|
||||
@@ -2135,6 +2135,7 @@ export default withEnglishFallback({
|
||||
createProcedure: "新規ストアドプロシージャ",
|
||||
createFunction: "新規関数",
|
||||
createTrigger: "新規トリガー",
|
||||
changeOpenMode: "開き方を変更",
|
||||
},
|
||||
visibleDatabases: {
|
||||
title: "表示するデータベース",
|
||||
@@ -4608,6 +4609,11 @@ export default withEnglishFallback({
|
||||
dateTimeFormatAuto: "自動認識",
|
||||
dateTimeFormatSearchPlaceholder: "形式を選択または入力",
|
||||
dateTimeFormatEmpty: "カスタム日時形式を入力",
|
||||
routineSourceOpenMode: "関数/プロシージャ/ビューの開き方",
|
||||
routineSourceOpenModeQueryTab: "データタブ",
|
||||
routineSourceOpenModeQueryTabDescription: "新しいデータタブでソースコードを開きます。SQLクエリの実行と同じ方法です。",
|
||||
routineSourceOpenModeDialog: "ポップアップウィンドウ",
|
||||
routineSourceOpenModeDialogDescription: "ポップアップダイアログでソースコードを開き、素早く表示・編集できます。",
|
||||
},
|
||||
driverStore: {
|
||||
jreDirRemoveFailed: "古い JRE ディレクトリを削除できませんでした: {path}(元のエラー: {error})",
|
||||
|
||||
@@ -2136,6 +2136,7 @@ export default withEnglishFallback({
|
||||
createProcedure: "Novo procedimento armazenado",
|
||||
createFunction: "Nova função",
|
||||
createTrigger: "Novo gatilho",
|
||||
changeOpenMode: "Alterar modo de abertura",
|
||||
},
|
||||
visibleDatabases: {
|
||||
title: "Bancos de dados visíveis",
|
||||
@@ -4610,6 +4611,11 @@ export default withEnglishFallback({
|
||||
dateTimeFormatAuto: "Detecção automática",
|
||||
dateTimeFormatSearchPlaceholder: "Selecione ou digite um formato",
|
||||
dateTimeFormatEmpty: "Insira um formato de data e hora personalizado",
|
||||
routineSourceOpenMode: "Modo de abertura de funções/procedimentos/views",
|
||||
routineSourceOpenModeQueryTab: "Aba de dados",
|
||||
routineSourceOpenModeQueryTabDescription: "Abrir código-fonte em uma nova aba de dados, da mesma forma que executar uma consulta SQL.",
|
||||
routineSourceOpenModeDialog: "Janela pop-up",
|
||||
routineSourceOpenModeDialogDescription: "Abrir código-fonte em uma caixa de diálogo pop-up, facilitando a visualização e edição rápida.",
|
||||
},
|
||||
driverStore: {
|
||||
jreDirRemoveFailed: "Não foi possível remover o diretório JRE antigo: {path} (erro original: {error})",
|
||||
|
||||
@@ -2037,6 +2037,7 @@ export default withEnglishFallback({
|
||||
dropTableSuccess: "表「{name}」已删除",
|
||||
editView: "编辑视图",
|
||||
viewSource: "查看源码",
|
||||
changeOpenMode: "修改打开方式",
|
||||
viewDdl: "查看 DDL",
|
||||
viewDdlLoading: "正在读取 DDL...",
|
||||
ddlCopied: "DDL 已复制",
|
||||
@@ -4430,6 +4431,11 @@ export default withEnglishFallback({
|
||||
sidebarObjectDisplayGroupedDescription: "按表、视图、过程、函数分组展示,适合对象类型较多的库。",
|
||||
sidebarObjectDisplaySimple: "简单视图",
|
||||
sidebarObjectDisplaySimpleDescription: "数据库或 schema 下直接平铺表和视图,减少中间层级。",
|
||||
routineSourceOpenMode: "函数/过程/视图打开方式",
|
||||
routineSourceOpenModeQueryTab: "数据标签页",
|
||||
routineSourceOpenModeQueryTabDescription: "在新的数据标签页中打开源码,与执行 SQL 查询方式相同。",
|
||||
routineSourceOpenModeDialog: "弹出窗口",
|
||||
routineSourceOpenModeDialogDescription: "在弹出对话框中打开源码,方便快速查看和编辑。",
|
||||
autoSelectActiveSidebarNode: "始终选中已打开项目",
|
||||
autoSelectActiveSidebarNodeDescription: "切换标签页时,在侧边栏选中匹配的可见表、集合或 SQL 文件。",
|
||||
openTabsRestoreMode: "启动时恢复标签页",
|
||||
|
||||
@@ -2135,6 +2135,7 @@ export default withEnglishFallback({
|
||||
createProcedure: "新增儲存程序",
|
||||
createFunction: "新增函數",
|
||||
createTrigger: "新增觸發器",
|
||||
changeOpenMode: "修改開啟方式",
|
||||
},
|
||||
visibleDatabases: {
|
||||
title: "顯示資料庫",
|
||||
@@ -4279,6 +4280,11 @@ export default withEnglishFallback({
|
||||
shortcutUppercaseSelection: "選取內容轉為大寫",
|
||||
shortcutLowercaseSelection: "選取內容轉為小寫",
|
||||
shortcutExPasteSqlInCondition: "ExPaste:貼上為 IN 條件",
|
||||
routineSourceOpenMode: "函式/程序/檢視開啟方式",
|
||||
routineSourceOpenModeQueryTab: "資料標籤頁",
|
||||
routineSourceOpenModeQueryTabDescription: "在新的資料標籤頁中開啟原始碼,與執行 SQL 查詢方式相同。",
|
||||
routineSourceOpenModeDialog: "彈出視窗",
|
||||
routineSourceOpenModeDialogDescription: "在彈出對話方塊中開啟原始碼,方便快速檢視和編輯。",
|
||||
},
|
||||
driverStore: {
|
||||
jreDirRemoveFailed: "無法刪除舊的 JRE 目錄:{path}(原始錯誤:{error})",
|
||||
|
||||
@@ -39,6 +39,7 @@ export const EDITOR_SETTINGS_DRAFT_KEYS = [
|
||||
"sqlFormatter",
|
||||
"sidebarActivation",
|
||||
"sidebarObjectDisplay",
|
||||
"routineSourceOpenMode",
|
||||
"sidebarTableSearchEnabled",
|
||||
"autoSelectActiveSidebarNode",
|
||||
"openTabsRestoreMode",
|
||||
|
||||
@@ -475,6 +475,7 @@ export interface EditorSettings {
|
||||
sidebarActivation: SidebarActivation;
|
||||
sidebarConnectionSortMode: ConnectionListSortMode;
|
||||
sidebarObjectDisplay: "grouped" | "simple";
|
||||
routineSourceOpenMode: "query-tab" | "dialog";
|
||||
sidebarTableSearchEnabled: boolean;
|
||||
autoSelectActiveSidebarNode: boolean;
|
||||
openTabsRestoreMode: OpenTabsRestoreMode;
|
||||
@@ -647,6 +648,7 @@ export const DEFAULT_EDITOR_SETTINGS: EditorSettings = {
|
||||
sidebarActivation: "single",
|
||||
sidebarConnectionSortMode: "manual",
|
||||
sidebarObjectDisplay: "grouped",
|
||||
routineSourceOpenMode: "query-tab",
|
||||
sidebarTableSearchEnabled: false,
|
||||
autoSelectActiveSidebarNode: false,
|
||||
openTabsRestoreMode: "all",
|
||||
@@ -946,6 +948,7 @@ export function normalizeEditorSettings(settings: Partial<EditorSettings>, exist
|
||||
sidebarActivation: settings.sidebarActivation === "single" || settings.sidebarActivation === "double" ? settings.sidebarActivation : DEFAULT_EDITOR_SETTINGS.sidebarActivation,
|
||||
sidebarConnectionSortMode: normalizeConnectionListSortMode(settings.sidebarConnectionSortMode),
|
||||
sidebarObjectDisplay: settings.sidebarObjectDisplay === "simple" || settings.sidebarObjectDisplay === "grouped" ? settings.sidebarObjectDisplay : DEFAULT_EDITOR_SETTINGS.sidebarObjectDisplay,
|
||||
routineSourceOpenMode: settings.routineSourceOpenMode === "query-tab" || settings.routineSourceOpenMode === "dialog" ? settings.routineSourceOpenMode : DEFAULT_EDITOR_SETTINGS.routineSourceOpenMode,
|
||||
sidebarTableSearchEnabled: typeof settings.sidebarTableSearchEnabled === "boolean" ? settings.sidebarTableSearchEnabled : DEFAULT_EDITOR_SETTINGS.sidebarTableSearchEnabled,
|
||||
autoSelectActiveSidebarNode: settings.autoSelectActiveSidebarNode ?? DEFAULT_EDITOR_SETTINGS.autoSelectActiveSidebarNode,
|
||||
openTabsRestoreMode: normalizeOpenTabsRestoreMode(
|
||||
@@ -1424,6 +1427,7 @@ export const useSettingsStore = defineStore("settings", () => {
|
||||
if (partial.sidebarActivation !== undefined) editorSettings.value.sidebarActivation = partial.sidebarActivation;
|
||||
if (partial.sidebarConnectionSortMode !== undefined) editorSettings.value.sidebarConnectionSortMode = normalizeConnectionListSortMode(partial.sidebarConnectionSortMode);
|
||||
if (partial.sidebarObjectDisplay !== undefined) editorSettings.value.sidebarObjectDisplay = partial.sidebarObjectDisplay;
|
||||
if (partial.routineSourceOpenMode !== undefined) editorSettings.value.routineSourceOpenMode = partial.routineSourceOpenMode;
|
||||
if (partial.sidebarTableSearchEnabled !== undefined) editorSettings.value.sidebarTableSearchEnabled = partial.sidebarTableSearchEnabled;
|
||||
if (partial.autoSelectActiveSidebarNode !== undefined) editorSettings.value.autoSelectActiveSidebarNode = partial.autoSelectActiveSidebarNode;
|
||||
if (partial.openTabsRestoreMode !== undefined) editorSettings.value.openTabsRestoreMode = normalizeOpenTabsRestoreMode(partial.openTabsRestoreMode);
|
||||
|
||||
Reference in new issue
Block a user