diff --git a/apps/desktop/src/components/grid/DataGrid.vue b/apps/desktop/src/components/grid/DataGrid.vue index 7dae193da..1060a42fa 100644 --- a/apps/desktop/src/components/grid/DataGrid.vue +++ b/apps/desktop/src/components/grid/DataGrid.vue @@ -117,7 +117,7 @@ import { buildDataGridCellDetail, buildDataGridColumnDetail, buildDataGridRowDet import { applyColumnFormatter, buildColumnFormatterKey, normalizeColumnFormatter, resolveColumnFormatter, type ColumnFormatterConfig, type DateTimeFormatterUnit } from "@/lib/columnFormatter"; import { temporalCellEditorKind, type TemporalCellEditorKind } from "@/lib/dataGridTemporalEditor"; import { isEnumColumn, enumValuesForColumn } from "@/lib/dataGridEnumEditor"; -import { isCancelSearchShortcut, isCopyCurrentRowShortcut, isDeleteCurrentRowShortcut, isFocusSearchShortcut, isModRShortcut, isToggleTransposeShortcut } from "@/lib/keyboardShortcuts"; +import { isCancelSearchShortcut, isCopyCurrentRowShortcut, isDeleteCurrentRowShortcut, isFocusSearchShortcut, isModRShortcut, isSaveShortcut, isToggleTransposeShortcut } from "@/lib/keyboardShortcuts"; import { dataGridHeaderContentWidth, scrollbarGutterWidth } from "@/lib/dataGridScrollGutter"; import { canGoNextDataGridPage } from "@/lib/dataGridPagination"; import { dataGridScrollPosition, isDataGridNearScrollBottom, shouldCheckInfiniteScrollAfterScroll, type DataGridScrollPosition } from "@/lib/dataGridInfiniteScroll"; @@ -151,6 +151,7 @@ import { forgetDataGridConditionHistory, loadDataGridConditionHistory, rememberD import { caretPositionInsideInsertedSqlSingleQuotes, insertedSqlSingleQuoteAtCaret } from "@/lib/sqlQuoteCaret"; import { effectiveDatabaseTypeForConnection } from "@/lib/jdbcDialect"; import { isMacOS } from "@/lib/platform"; +import { formatShortcut } from "@/lib/shortcutRegistry"; const SqlPreviewPanel = defineAsyncComponent(() => import("@/components/editor/SqlPreviewPanel.vue")); const FORMATTED_JSON_EDIT_WARNING_STORAGE_KEY = "dbx-cell-detail-formatted-json-edit-warning-shown"; @@ -227,6 +228,7 @@ const dataGridCreatedAt = performance.now(); const dataGridElapsed = () => `${Math.round(performance.now() - dataGridCreatedAt)}ms`; const isMac = isMacOS(); const shortcutMod = isMac ? "Cmd" : "Ctrl"; +const saveShortcutLabel = computed(() => formatShortcut(settingsStore.editorSettings.shortcuts.saveSql)); const DATA_GRID_COMPACT_TOPBAR_WIDTH = 900; const emit = defineEmits<{ @@ -5587,6 +5589,26 @@ function commitGridEdit() { nextTick(() => gridRef.value?.focus({ preventScroll: true })); } +async function saveGridChangesFromShortcut() { + if (!saveToolbarState.value.showActions || saveToolbarState.value.actionsDisabled) return false; + await onToolbarCommit(); + return true; +} + +async function onCellEditKeydown(event: KeyboardEvent) { + if (isSaveShortcut(event, settingsStore.editorSettings.shortcuts)) { + event.preventDefault(); + event.stopPropagation(); + commitEdit(); + await nextTick(); + if (await saveGridChangesFromShortcut()) { + gridRef.value?.focus({ preventScroll: true }); + } + return; + } + onEditKeydown(event); +} + function undoGridChange(): boolean { if (editingCell.value || !canUndoPendingChange.value) return false; undoPendingChange(); @@ -5641,11 +5663,10 @@ async function onGridKeydown(event: KeyboardEvent) { } return; } - if ((event.metaKey || event.ctrlKey) && !event.shiftKey && event.key.toLowerCase() === "s") { - if (saveToolbarState.value.showActions && !saveToolbarState.value.actionsDisabled) { + if (isSaveShortcut(event, settingsStore.editorSettings.shortcuts)) { + if (await saveGridChangesFromShortcut()) { event.preventDefault(); event.stopPropagation(); - await onToolbarCommit(); } return; } @@ -7561,7 +7582,7 @@ const gridContextMenuItems = computed(() => { {{ t(saveActionMode.labelKey, { count: pendingChangeCount }) }} - {{ t(saveActionMode.tooltipKey, { count: pendingChangeCount }) }} ({{ shortcutMod }}+S) + {{ t(saveActionMode.tooltipKey, { count: pendingChangeCount }) }} ({{ saveShortcutLabel }}) @@ -7739,7 +7760,7 @@ const gridContextMenuItems = computed(() => { @click.stop @focus="onCellEditTextareaInput" @input="onCellEditTextareaInput" - @keydown.stop="onEditKeydown" + @keydown.stop="onCellEditKeydown" @paste.stop="onCellEditTextareaPaste" /> (() => { @blur="commitEditFromBlur" @click.stop @input="onCellEditTextareaInput" - @keydown.stop="onEditKeydown" + @keydown.stop="onCellEditKeydown" @paste.stop="onCellEditTextareaPaste" /> @@ -8197,7 +8218,7 @@ const gridContextMenuItems = computed(() => { @click.stop @focus="onCellEditTextareaInput" @input="onCellEditTextareaInput" - @keydown.stop="onEditKeydown" + @keydown.stop="onCellEditKeydown" @paste.stop="onCellEditTextareaPaste" /> (() => { @blur="commitEditFromBlur" @click.stop @input="onCellEditTextareaInput" - @keydown.stop="onEditKeydown" + @keydown.stop="onCellEditKeydown" @paste.stop="onCellEditTextareaPaste" /> @@ -8329,7 +8350,7 @@ const gridContextMenuItems = computed(() => { @click.stop @focus="onCellEditTextareaInput" @input="onCellEditTextareaInput" - @keydown.stop="onEditKeydown" + @keydown.stop="onCellEditKeydown" @paste.stop="onCellEditTextareaPaste" /> (() => { @blur="commitEditFromBlur" @click.stop @input="onCellEditTextareaInput" - @keydown.stop="onEditKeydown" + @keydown.stop="onCellEditKeydown" @paste.stop="onCellEditTextareaPaste" />