Skip to content

Commit 8f65e29

Browse files
authored
feat: insert template to editor (doocs#1168)
1 parent 099856c commit 8f65e29

File tree

2 files changed

+64
-52
lines changed

2 files changed

+64
-52
lines changed

apps/web/src/components/editor/TemplateDialog.vue

Lines changed: 50 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
<script setup lang="ts">
22
import type { Template } from '@md/shared'
3-
import { Calendar, Clock, FileText, Package, Pencil, Plus, Search, Trash2 } from 'lucide-vue-next'
3+
import { Calendar, Clock, FileDown, FileInput, FileText, Package, Pencil, Plus, Search, Trash2 } from 'lucide-vue-next'
44
import { useEditorStore } from '@/stores/editor'
55
import { usePostStore } from '@/stores/post'
66
import { useTemplateStore } from '@/stores/template'
@@ -119,6 +119,19 @@ function applyTemplate(template: Template) {
119119
toggleShowTemplateDialog(false)
120120
}
121121
122+
// 在光标位置插入模板
123+
function insertTemplate(template: Template) {
124+
editorStore.insertAtCursor(template.content)
125+
126+
const currentPost = postStore.currentPost
127+
if (currentPost) {
128+
postStore.updatePostContent(currentPost.id, editorStore.getContent())
129+
}
130+
131+
toast.success(`已插入模板「${template.name}」`)
132+
toggleShowTemplateDialog(false)
133+
}
134+
122135
// 删除确认对话框
123136
const deleteConfirmDialog = ref(false)
124137
const templateToDelete = ref<Template | null>(null)
@@ -294,57 +307,42 @@ function onUpdate(val: boolean) {
294307

295308
<!-- 操作按钮 -->
296309
<div class="flex gap-1 flex-shrink-0">
297-
<TooltipProvider :delay-duration="200">
298-
<Tooltip>
299-
<TooltipTrigger as-child>
300-
<Button
301-
variant="outline"
302-
size="icon"
303-
class="size-8"
304-
@click="applyTemplate(template)"
305-
>
306-
<FileText class="size-4" />
307-
</Button>
308-
</TooltipTrigger>
309-
<TooltipContent>
310-
应用模板
311-
</TooltipContent>
312-
</Tooltip>
313-
</TooltipProvider>
314-
<TooltipProvider :delay-duration="200">
315-
<Tooltip>
316-
<TooltipTrigger as-child>
317-
<Button
318-
variant="outline"
319-
size="icon"
320-
class="size-8"
321-
@click="openEditForm(template)"
322-
>
323-
<Pencil class="size-4" />
324-
</Button>
325-
</TooltipTrigger>
326-
<TooltipContent>
327-
编辑模板
328-
</TooltipContent>
329-
</Tooltip>
330-
</TooltipProvider>
331-
<TooltipProvider :delay-duration="200">
332-
<Tooltip>
333-
<TooltipTrigger as-child>
334-
<Button
335-
variant="outline"
336-
size="icon"
337-
class="size-8 text-destructive hover:text-destructive"
338-
@click="openDeleteConfirm(template)"
339-
>
340-
<Trash2 class="size-4" />
341-
</Button>
342-
</TooltipTrigger>
343-
<TooltipContent>
344-
删除模板
345-
</TooltipContent>
346-
</Tooltip>
347-
</TooltipProvider>
310+
<Button
311+
variant="outline"
312+
size="icon"
313+
class="size-8"
314+
title="应用模板(替换全部内容)"
315+
@click="applyTemplate(template)"
316+
>
317+
<FileInput class="size-4" />
318+
</Button>
319+
<Button
320+
variant="outline"
321+
size="icon"
322+
class="size-8"
323+
title="插入模板(在光标处插入)"
324+
@click="insertTemplate(template)"
325+
>
326+
<FileDown class="size-4" />
327+
</Button>
328+
<Button
329+
variant="outline"
330+
size="icon"
331+
class="size-8"
332+
title="编辑模板"
333+
@click="openEditForm(template)"
334+
>
335+
<Pencil class="size-4" />
336+
</Button>
337+
<Button
338+
variant="outline"
339+
size="icon"
340+
class="size-8 text-destructive hover:text-destructive"
341+
title="删除模板"
342+
@click="openDeleteConfirm(template)"
343+
>
344+
<Trash2 class="size-4" />
345+
</Button>
348346
</div>
349347
</div>
350348
</div>

apps/web/src/stores/editor.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,19 @@ export const useEditorStore = defineStore(`editor`, () => {
6464
editor.value.dispatch(editor.value.state.replaceSelection(text))
6565
}
6666

67+
// 在光标位置插入文本
68+
const insertAtCursor = (text: string) => {
69+
if (!editor.value)
70+
return
71+
72+
const selection = editor.value.state.selection.main
73+
editor.value.dispatch({
74+
changes: { from: selection.from, to: selection.to, insert: text },
75+
selection: { anchor: selection.from + text.length },
76+
})
77+
editor.value.focus()
78+
}
79+
6780
return {
6881
editor,
6982
formatContent,
@@ -72,5 +85,6 @@ export const useEditorStore = defineStore(`editor`, () => {
7285
getContent,
7386
getSelection,
7487
replaceSelection,
88+
insertAtCursor,
7589
}
7690
})

0 commit comments

Comments
 (0)