From c0617b70d8c31db4124ba64f0c203d1b0e59129b Mon Sep 17 00:00:00 2001 From: liangxu Date: Sat, 25 Apr 2026 22:45:27 +0800 Subject: [PATCH] feat(admin-web): add Ctrl/Cmd+S save shortcut to article editor Co-Authored-By: Claude Opus 4.7 (1M context) --- .../admin-web/src/views/ArticleEditorView.vue | 32 +++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/apps/admin-web/src/views/ArticleEditorView.vue b/apps/admin-web/src/views/ArticleEditorView.vue index 0af5d5e..e4bfd6b 100644 --- a/apps/admin-web/src/views/ArticleEditorView.vue +++ b/apps/admin-web/src/views/ArticleEditorView.vue @@ -2,7 +2,7 @@ import { LeftOutlined } from "@ant-design/icons-vue"; import { useMutation, useQuery, useQueryClient } from "@tanstack/vue-query"; import { message } from "ant-design-vue"; -import { computed, ref, watch } from "vue"; +import { computed, onBeforeUnmount, onMounted, ref, watch } from "vue"; import { useI18n } from "vue-i18n"; import { useRoute, useRouter } from "vue-router"; @@ -187,6 +187,20 @@ async function handleSave(): Promise { await saveArticle(); } +function handleSaveShortcut(event: KeyboardEvent): void { + if (!(event.ctrlKey || event.metaKey) || event.key.toLowerCase() !== "s") { + return; + } + + event.preventDefault(); + event.stopPropagation(); + if (event.repeat || saveDisabled.value) { + return; + } + + void handleSave(); +} + async function handlePublish(): Promise { if (editorLocked.value) { return; @@ -344,6 +358,14 @@ function serializePlatformSelection(platformIds: string[]): string { .sort() .join(","); } + +onMounted(() => { + window.addEventListener("keydown", handleSaveShortcut); +}); + +onBeforeUnmount(() => { + window.removeEventListener("keydown", handleSaveShortcut); +});