mirror of
https://github.com/Syngnat/GoNavi.git
synced 2026-08-05 05:18:05 +08:00
✨ feat(query-editor): 支持查询重命名导出与保存快捷键
- 支持已保存查询重命名并同步当前标签标题 - 新增 SQL 文件导出接口、Wails 绑定和浏览器 mock - 补充 Ctrl/Cmd+S 保存查询与 Ctrl+, 快捷键入口修复 - 覆盖 SQL 编辑器保存、导出和快捷键回归测试
This commit is contained in:
@@ -8,7 +8,9 @@ import {
|
||||
normalizeShortcutCombo,
|
||||
RESERVED_SHORTCUTS,
|
||||
comboToMonacoKeyBinding,
|
||||
getPrimaryShortcutDisplayLabel,
|
||||
getShortcutDisplayLabel,
|
||||
getShortcutPrimaryModifierDisplayLabel,
|
||||
resolveShortcutBinding,
|
||||
resolveShortcutDisplay,
|
||||
sanitizeShortcutOptions,
|
||||
@@ -133,6 +135,18 @@ describe('shortcut defaults', () => {
|
||||
});
|
||||
});
|
||||
|
||||
it('registers save query as a query editor shortcut', () => {
|
||||
expect(DEFAULT_SHORTCUT_OPTIONS.saveQuery).toEqual({
|
||||
mac: { combo: 'Meta+S', enabled: true },
|
||||
windows: { combo: 'Ctrl+S', enabled: true },
|
||||
});
|
||||
expect(SHORTCUT_ACTION_META.saveQuery).toMatchObject({
|
||||
label: '保存查询',
|
||||
scope: 'queryEditor',
|
||||
allowInEditable: true,
|
||||
});
|
||||
});
|
||||
|
||||
// Windows 任务栏恢复后字体异常变大的兜底入口(方案 3)。
|
||||
// 自动 fix 路径(9848b8b2)刻意不再 toggle 以避免可见动画,由该快捷键给用户主动触发的修复入口。
|
||||
it('registers reset window zoom shortcut with default Ctrl+Shift+0', () => {
|
||||
@@ -198,6 +212,7 @@ describe('shortcut defaults', () => {
|
||||
|
||||
expect(options.newQueryTab.mac).toEqual({ combo: 'Meta+Y', enabled: false });
|
||||
expect(options.newQueryTab.windows).toEqual({ combo: 'Ctrl+Q', enabled: true });
|
||||
expect(options.saveQuery.windows).toEqual({ combo: 'Ctrl+S', enabled: true });
|
||||
expect(options.sendAIChatMessage.windows).toEqual({ combo: 'Enter', enabled: true });
|
||||
});
|
||||
|
||||
@@ -216,6 +231,14 @@ describe('shortcut defaults', () => {
|
||||
expect(getShortcutDisplayLabel('Meta+N', 'mac')).toBe('⌘N');
|
||||
expect(getShortcutDisplayLabel('Meta+Shift+H', 'mac')).toBe('⌘⇧H');
|
||||
expect(getShortcutDisplayLabel('Ctrl+Meta+F', 'mac')).toBe('⌃⌘F');
|
||||
expect(getShortcutDisplayLabel('Meta+S', 'mac')).toBe('⌘S');
|
||||
expect(getShortcutDisplayLabel('Ctrl+S', 'windows')).toBe('Ctrl+S');
|
||||
expect(getShortcutPrimaryModifierDisplayLabel('mac')).toBe('⌘');
|
||||
expect(getShortcutPrimaryModifierDisplayLabel('windows')).toBe('Ctrl');
|
||||
expect(getPrimaryShortcutDisplayLabel('C', 'mac')).toBe('⌘C');
|
||||
expect(getPrimaryShortcutDisplayLabel('C', 'windows')).toBe('Ctrl+C');
|
||||
expect(getPrimaryShortcutDisplayLabel('Enter', 'mac')).toBe('⌘↵');
|
||||
expect(getPrimaryShortcutDisplayLabel('Enter', 'windows')).toBe('Ctrl+Enter');
|
||||
expect(resolveShortcutDisplay(options, 'newQueryTab', 'windows')).toBe('Ctrl+Q');
|
||||
});
|
||||
});
|
||||
|
||||
@@ -3,6 +3,7 @@ import type { KeyboardEvent as ReactKeyboardEvent } from 'react';
|
||||
export type ShortcutAction =
|
||||
| 'runQuery'
|
||||
| 'selectCurrentStatement'
|
||||
| 'saveQuery'
|
||||
| 'sendAIChatMessage'
|
||||
| 'focusSidebarSearch'
|
||||
| 'newQueryTab'
|
||||
@@ -87,6 +88,7 @@ const KEY_ALIASES: Record<string, string> = {
|
||||
export const SHORTCUT_ACTION_ORDER: ShortcutAction[] = [
|
||||
'runQuery',
|
||||
'selectCurrentStatement',
|
||||
'saveQuery',
|
||||
'sendAIChatMessage',
|
||||
'focusSidebarSearch',
|
||||
'newQueryTab',
|
||||
@@ -109,6 +111,12 @@ export const SHORTCUT_ACTION_META: Record<ShortcutAction, ShortcutActionMeta> =
|
||||
description: '在查询编辑器中选中光标所在 SQL 语句',
|
||||
scope: 'queryEditor',
|
||||
},
|
||||
saveQuery: {
|
||||
label: '保存查询',
|
||||
description: '保存当前查询页;未命名查询会打开保存弹窗',
|
||||
scope: 'queryEditor',
|
||||
allowInEditable: true,
|
||||
},
|
||||
sendAIChatMessage: {
|
||||
label: 'AI 聊天发送',
|
||||
description: '在 AI 输入框中发送当前消息,Shift+Enter 始终换行',
|
||||
@@ -170,6 +178,10 @@ export const DEFAULT_SHORTCUT_OPTIONS: ShortcutOptions = {
|
||||
mac: { combo: 'Meta+E', enabled: true },
|
||||
windows: { combo: 'Ctrl+E', enabled: true },
|
||||
},
|
||||
saveQuery: {
|
||||
mac: { combo: 'Meta+S', enabled: true },
|
||||
windows: { combo: 'Ctrl+S', enabled: true },
|
||||
},
|
||||
sendAIChatMessage: {
|
||||
mac: { combo: 'Enter', enabled: true },
|
||||
windows: { combo: 'Enter', enabled: true },
|
||||
@@ -466,6 +478,15 @@ export const getShortcutDisplayLabel = (
|
||||
.join('');
|
||||
};
|
||||
|
||||
export const getShortcutPrimaryModifierDisplayLabel = (
|
||||
platform: ShortcutPlatform,
|
||||
): string => getShortcutDisplayLabel(platform === 'mac' ? 'Meta' : 'Ctrl', platform);
|
||||
|
||||
export const getPrimaryShortcutDisplayLabel = (
|
||||
key: string,
|
||||
platform: ShortcutPlatform,
|
||||
): string => getShortcutDisplayLabel(`${platform === 'mac' ? 'Meta' : 'Ctrl'}+${key}`, platform);
|
||||
|
||||
export const resolveShortcutDisplay = (
|
||||
options: Partial<ShortcutOptions> | null | undefined,
|
||||
action: ShortcutAction,
|
||||
|
||||
Reference in New Issue
Block a user