From 886cafe3a4dd9b4b62728f55e3a0b6e8ccf03576 Mon Sep 17 00:00:00 2001 From: kjqwer <2990346238@qq.com> Date: Mon, 1 Dec 2025 14:07:43 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=8F=90=E7=A4=BA=E8=AF=8D?= =?UTF-8?q?=E9=80=89=E6=8B=A9=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/PromptEditor.vue | 47 +++++- src/components/PromptQuickAdd.vue | 247 ++++++++++++++++++++++++++++++ 2 files changed, 293 insertions(+), 1 deletion(-) create mode 100644 src/components/PromptQuickAdd.vue diff --git a/src/components/PromptEditor.vue b/src/components/PromptEditor.vue index 25cb494..c6fb4e8 100644 --- a/src/components/PromptEditor.vue +++ b/src/components/PromptEditor.vue @@ -6,6 +6,7 @@ import NotificationToast from './NotificationToast.vue'; import PresetDropdown from './PresetDropdown.vue'; import TranslationPopup from './TranslationPopup.vue'; import FolderSelector from './preset/FolderSelector.vue'; +import PromptQuickAdd from './PromptQuickAdd.vue'; const store = usePromptStore(); const draggingIndex = ref(null); @@ -77,6 +78,7 @@ onMounted(() => { if (defaultFolder) { selectedFolderId.value = defaultFolder; } + store.searchQuery = ''; // Reset search query to ensure all tags are shown }); // 清理事件监听器 @@ -287,6 +289,40 @@ function applyTextReplacement( } } + +function handleAddTag(tag: string) { + const el = inputEl.value; + if (!el) { + store.setPromptTextRaw(store.promptText ? store.promptText + ', ' + tag : tag); + return; + } + + el.focus(); // Ensure focus for undo/redo support + + const start = el.selectionStart ?? store.promptText.length; + const end = el.selectionEnd ?? start; + const text = el.value; + + let prefix = ''; + // 如果前面有内容且不是逗号结尾,加逗号 + if (start > 0) { + const prev = text.slice(0, start).trim(); + if (prev.length > 0 && !/[,,]$/.test(prev)) { + prefix = ', '; + } else if (prev.length > 0 && /[,,]$/.test(prev) && text[start-1] !== ' ') { + // 如果是逗号结尾但没空格,加空格 + prefix = ' '; + } + } + + const toInsert = prefix + tag; + applyTextReplacement(el, start, end, toInsert); + + nextTick(() => { + el.focus(); + }); +} + async function onKeyDown(e: KeyboardEvent) { if (e.key === 'Tab') { // 在光标位置进行补全,不影响撤回 @@ -991,6 +1027,7 @@ function isRemoveDisabled(token: string): boolean { @click="applySuggestion(s)" >{{ s }} +
@@ -1507,7 +1544,15 @@ function isRemoveDisabled(token: string): boolean { margin: 0 auto; } -.pe-left-pane, .pe-right-pane { +.pe-left-pane { + padding: 1.5rem; + background-color: var(--color-bg-primary); + display: flex; + flex-direction: column; + overflow: hidden; +} + +.pe-right-pane { padding: 1.5rem; background-color: var(--color-bg-primary); overflow: auto; diff --git a/src/components/PromptQuickAdd.vue b/src/components/PromptQuickAdd.vue new file mode 100644 index 0000000..8785662 --- /dev/null +++ b/src/components/PromptQuickAdd.vue @@ -0,0 +1,247 @@ + + + + +