feat(签署记录): 新增签署记录查询页并复用签署任务接口
This commit is contained in:
@@ -880,6 +880,19 @@ function readHostText(host: HTMLElement): string {
|
||||
* 两者都放在本文件里,属性名与判据只有一份——签署端不该自己写 data-sign-* 选择器。
|
||||
*/
|
||||
export function applyAnswerToFieldHost(host: HTMLElement, value: SigningFieldValue): void {
|
||||
// 签名位的取值是图片 dataURL,必须写成 <img>。
|
||||
// 少了这一分支它会掉到下面的文本分支,把整串 base64 当正文塞进宿主,
|
||||
// 页面上就会出现一长串 data:image/png;base64,… 而不是签名图 ——
|
||||
// 记录页「查看」与签署工作台详情读的都是这条路径,两边会一起中招。
|
||||
if (host.getAttribute(FIELD_KIND_ATTR) === 'signature') {
|
||||
// 空值不用动:渲染阶段已经落了「未签署」提示,这里没有可写的东西
|
||||
if (typeof value === 'string' && value) {
|
||||
writeSignatureToHost(host, value, host.getAttribute(FIELD_ATTR) ?? '')
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
const items = Array.from(host.querySelectorAll<HTMLElement>(`.${OPTION_CLASS}`))
|
||||
const multiAttr = host.getAttribute(FIELD_MULTI_ATTR)
|
||||
|
||||
@@ -988,7 +1001,7 @@ export function applySelectedItemsToRoot(root: HTMLElement, items: string[]): vo
|
||||
}
|
||||
|
||||
/**
|
||||
* 把签名图写进指定签名位,并摘掉它的采集入口。返回是否真的发生了改动。
|
||||
* 把签名图写进**已经拿到手的**签名位宿主,并摘掉它的采集入口。返回是否真的发生了写入。
|
||||
*
|
||||
* 只改这一个宿主节点,不重建整篇文书 —— 整篇重建会换掉 v-html 的 DOM,
|
||||
* 操作人员正在输入的填写项会连同光标一起丢。写完后由调用方回读 DOM
|
||||
@@ -996,6 +1009,39 @@ export function applySelectedItemsToRoot(root: HTMLElement, items: string[]): vo
|
||||
*
|
||||
* 签名图只作为 <img src> 写进渲染结果,不进模板正文:
|
||||
* 它是 base64 大字符串,进正文会让模板哈希随签名变化,缓存键跟着失效。
|
||||
*
|
||||
* 宿主级实现,供两条路径共用:applySignatureToRoot(只拿到根,按字段键找宿主)
|
||||
* 与 applyAnswerToFieldHost(宿主就在手上)。签名图的 DOM 形态只能有一份定义,
|
||||
* 否则「点出来的签名」与「读回来的签名」会长得不一样。
|
||||
*/
|
||||
function writeSignatureToHost(host: HTMLElement, dataUrl: string, altFallback = ''): boolean {
|
||||
// 同一张图重复写入没有意义,返回 false 也让调用方少跑一轮回读
|
||||
if (host.querySelector(`img.${SIGNATURE_IMAGE_CLASS}`)?.getAttribute('src') === dataUrl) {
|
||||
return false
|
||||
}
|
||||
|
||||
const label = host.getAttribute(FIELD_LABEL_ATTR) ?? ''
|
||||
const image = host.ownerDocument.createElement('img')
|
||||
image.className = SIGNATURE_IMAGE_CLASS
|
||||
image.src = dataUrl
|
||||
image.alt = label || altFallback
|
||||
// 签名位填充后只剩签名图:原型不保留「未签署」提示,也不再有点击提示
|
||||
host.replaceChildren(image)
|
||||
host.title = label
|
||||
|
||||
// 采集入口用完即摘:留着会让「还能再点一次」的观感落空
|
||||
host.classList.remove(ACTIONABLE_CLASS, 'sign-field--missing')
|
||||
host.removeAttribute(FIELD_ACTION_ATTR)
|
||||
host.removeAttribute('role')
|
||||
host.removeAttribute('tabindex')
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
/**
|
||||
* 按字段键在根节点里找到签名位,把签名图写进去。返回是否真的发生了改动。
|
||||
*
|
||||
* 与 applyAnswerToFieldHost 共用 writeSignatureToHost:签名图的 DOM 形态只有一份定义。
|
||||
*/
|
||||
export function applySignatureToRoot(root: HTMLElement, fieldId: string, dataUrl: string): boolean {
|
||||
if (!fieldId || !dataUrl) {
|
||||
@@ -1008,26 +1054,7 @@ export function applySignatureToRoot(root: HTMLElement, fieldId: string, dataUrl
|
||||
return false
|
||||
}
|
||||
|
||||
// 同一张图重复写入没有意义,返回 false 也让调用方少跑一轮回读
|
||||
if (host.querySelector(`img.${SIGNATURE_IMAGE_CLASS}`)?.getAttribute('src') === dataUrl) {
|
||||
return false
|
||||
}
|
||||
|
||||
const image = root.ownerDocument.createElement('img')
|
||||
image.className = SIGNATURE_IMAGE_CLASS
|
||||
image.src = dataUrl
|
||||
image.alt = host.getAttribute(FIELD_LABEL_ATTR) ?? fieldId
|
||||
// 签名位填充后只剩签名图:原型不保留「未签署」提示,也不再有点击提示
|
||||
host.replaceChildren(image)
|
||||
host.title = host.getAttribute(FIELD_LABEL_ATTR) ?? ''
|
||||
|
||||
// 采集入口用完即摘:留着会让「还能再点一次」的观感落空
|
||||
host.classList.remove(ACTIONABLE_CLASS, 'sign-field--missing')
|
||||
host.removeAttribute(FIELD_ACTION_ATTR)
|
||||
host.removeAttribute('role')
|
||||
host.removeAttribute('tabindex')
|
||||
|
||||
return true
|
||||
return writeSignatureToHost(host, dataUrl, fieldId)
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user