feat(文书管理): 增加版本工作流与版本历史

- 模板状态按后端原始状态展示与筛选,待审核与已驳回分开展示
- 仅已发布模板可发起签署,新增提交审核/审核通过/驳回等动作
- 新增版本历史弹窗,复用统一的模板时间格式化方法
- 演示数据补齐已签署任务的签名图,并提供获取签名 dataURL 的接口
- 修复编辑器插入占位符时未定位光标导致内容落到文首的问题
This commit is contained in:
yelan
2026-09-17 16:44:54 +08:00
parent 81922d774f
commit 97c5182ba4
13 changed files with 982 additions and 64 deletions
@@ -16,8 +16,26 @@ const emit = defineEmits<{
}>()
const editorRef = shallowRef<IDomEditor>()
const editableRef = shallowRef<Element | null>(null)
const editorMode = 'default'
/**
* 用户是否真的把光标放进过正文。
*
* 点「插入占位符 / 勾选框」按钮时焦点在按钮上,编辑器处于失焦态;
* 直接 insertNode 会落到**文档最开头**——导入 .docx 后补签名位,
* 签名域会被插到标题之前,而且当场看不出来,要等到预览或签署才发现。
*
* 不能用 editor.selection 判断「有没有光标」:导入 .docx 写入内容时它同样会有一个
* 位于文首的选区,照样把签名位插到开头。因此只认真实交互——
* 在可编辑区域上发生过 pointerdown / keydown 才算用户放好了光标。
*/
const userPlacedCaret = shallowRef(false)
function markUserCaret() {
userPlacedCaret.value = true
}
// 医疗文书用不到的工具栏能力直接移除,避免科室误用。
// 注意菜单 key:分割线是 divider、表情是 emotion(不是 emoji)。
const toolbarConfig: Partial<IToolbarConfig> = {
@@ -64,6 +82,11 @@ const editorConfig: Partial<IEditorConfig> = {
function handleCreated(editor: IDomEditor) {
editorRef.value = editor
const editable = editor.getEditableContainer()
editableRef.value = editable
editable.addEventListener('pointerdown', markUserCaret)
editable.addEventListener('keydown', markUserCaret)
}
function getText(): string {
@@ -72,12 +95,23 @@ function getText(): string {
// slate 文本节点:{ text };由编辑器在当前光标处插入。
function insertText(text: string) {
editorRef.value?.insertNode({ text })
const editor = editorRef.value
if (!editor) {
return
}
// 先聚焦并定位光标再插入:用户没点过正文时落到文末,
// 点过则保持他自己的光标位置(光标停在表格单元格里时内容就落进该单元格)。
editor.focus(!userPlacedCaret.value)
editor.insertNode({ text })
}
defineExpose({ getText, insertText })
onBeforeUnmount(() => {
editableRef.value?.removeEventListener('pointerdown', markUserCaret)
editableRef.value?.removeEventListener('keydown', markUserCaret)
editorRef.value?.destroy()
})
</script>