@guodun/antdv 1.7.3 → 1.7.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (35) hide show
  1. package/dist/es/components/contract-signing-location/src/ContractSigningLocation.vue.mjs +313 -308
  2. package/dist/es/components/pro-contract-template-designer/src/ContractTemplateSingleRenderer.mjs +5 -0
  3. package/dist/es/components/pro-contract-template-designer/src/ContractTemplateSingleRenderer.vue.mjs +796 -0
  4. package/dist/es/components/pro-contract-template-designer/src/DesignerPage.vue.mjs +16 -5
  5. package/dist/es/components/pro-contract-template-designer/src/ProContractTemplateDesigner.vue.mjs +3 -1
  6. package/dist/es/components/pro-contract-template-designer/src/ProContractTemplateRenderer.vue.mjs +123 -710
  7. package/dist/es/components/pro-contract-template-designer/src/composables/use-renderer-files.mjs +80 -0
  8. package/dist/es/components/pro-contract-template-designer/src/composables/use-template-designer.mjs +172 -134
  9. package/dist/es/components/pro-contract-template-designer/src/composables/use-toolbar-overflow.mjs +11 -9
  10. package/dist/es/components/pro-contract-template-designer/src/utils/template-renderer.mjs +136 -76
  11. package/dist/es/components/pro-contract-template-designer/src/utils/toolbar-overflow.mjs +10 -9
  12. package/dist/es/components/pro-contract-template-designer/style/index.css +1 -1
  13. package/dist/lib/components/contract-signing-location/src/ContractSigningLocation.vue.cjs +1 -1
  14. package/dist/lib/components/pro-contract-template-designer/src/ContractTemplateSingleRenderer.cjs +1 -0
  15. package/dist/lib/components/pro-contract-template-designer/src/ContractTemplateSingleRenderer.vue.cjs +1 -0
  16. package/dist/lib/components/pro-contract-template-designer/src/DesignerPage.vue.cjs +2 -2
  17. package/dist/lib/components/pro-contract-template-designer/src/ProContractTemplateDesigner.vue.cjs +1 -1
  18. package/dist/lib/components/pro-contract-template-designer/src/ProContractTemplateRenderer.vue.cjs +1 -1
  19. package/dist/lib/components/pro-contract-template-designer/src/composables/use-renderer-files.cjs +1 -0
  20. package/dist/lib/components/pro-contract-template-designer/src/composables/use-template-designer.cjs +4 -4
  21. package/dist/lib/components/pro-contract-template-designer/src/composables/use-toolbar-overflow.cjs +1 -1
  22. package/dist/lib/components/pro-contract-template-designer/src/utils/template-renderer.cjs +3 -3
  23. package/dist/lib/components/pro-contract-template-designer/src/utils/toolbar-overflow.cjs +1 -1
  24. package/dist/lib/components/pro-contract-template-designer/style/index.css +1 -1
  25. package/dist/theme/icon.css +1 -1
  26. package/dist/theme/index.css +1 -1
  27. package/dist/types/components/pro-contract-template-designer/src/ContractTemplateSingleRenderer.vue.d.ts +89 -0
  28. package/dist/types/components/pro-contract-template-designer/src/DesignerPage.vue.d.ts +2 -0
  29. package/dist/types/components/pro-contract-template-designer/src/ProContractTemplateRenderer.vue.d.ts +388 -10
  30. package/dist/types/components/pro-contract-template-designer/src/composables/use-renderer-files.d.ts +14 -0
  31. package/dist/types/components/pro-contract-template-designer/src/composables/use-template-designer.d.ts +9 -2
  32. package/dist/types/components/pro-contract-template-designer/src/types.d.ts +16 -2
  33. package/dist/types/components/pro-contract-template-designer/src/utils/template-renderer.d.ts +3 -3
  34. package/dist/types/components/pro-contract-template-designer/src/utils/toolbar-overflow.d.ts +2 -0
  35. package/package.json +4 -4
@@ -0,0 +1,796 @@
1
+ import { isContractTemplateFieldType as e } from "./types.mjs";
2
+ import { isAllowedContractTemplateRemoteUrl as t, normalizeContractTemplateControlOptions as n, normalizeContractTemplateJsonObject as r, normalizeContractTemplateRequestTimeout as i } from "./utils/advanced-controls.mjs";
3
+ import { buildInitialRenderValues as a, buildTemplateRenderPages as o, isEmptyRenderValue as s, normalizeRenderValues as c, resolveTemplateRenderSubmitErrors as ee, validateTemplateRenderStructure as te, validateTemplateRenderValues as ne } from "./utils/template-renderer.mjs";
4
+ import re from "./ContractTemplateRendererField.mjs";
5
+ import ie from "./ContractTemplateRendererHeader.mjs";
6
+ import ae from "./ContractTemplateRendererPage.mjs";
7
+ import oe from "./ContractTemplateRendererValidation.mjs";
8
+ import { Fragment as se, computed as l, createBlock as u, createCommentVNode as d, createElementBlock as f, createElementVNode as p, createSlots as ce, createTextVNode as le, createVNode as m, defineComponent as h, mergeProps as ue, nextTick as de, normalizeClass as fe, onBeforeUnmount as pe, openBlock as g, ref as _, renderList as me, renderSlot as he, toDisplayString as v, unref as y, watch as b, withCtx as x } from "vue";
9
+ import { Button as ge, Empty as S, Input as _e, Modal as ve, Progress as ye, Segmented as be, Tooltip as xe } from "ant-design-vue";
10
+ import { useElementSize as Se } from "@vueuse/core";
11
+ import { LeftOutlined as Ce, RightOutlined as we, SearchOutlined as Te } from "@ant-design/icons-vue";
12
+ //#region src/components/pro-contract-template-designer/src/ContractTemplateSingleRenderer.vue?vue&type=script&setup=true&lang.ts
13
+ var Ee = {
14
+ key: 2,
15
+ class: "gd-contract-template-renderer__empty"
16
+ }, De = ["data-highlighted-variable-key"], Oe = { class: "gd-contract-template-renderer__pages" }, ke = ["aria-label", "aria-expanded"], Ae = { class: "gd-contract-template-renderer__panel-clip" }, je = { class: "gd-contract-template-renderer__panel" }, Me = { class: "gd-contract-template-renderer__panel-head" }, Ne = { class: "gd-contract-template-renderer__panel-head-row" }, Pe = { class: "gd-contract-template-renderer__panel-head-actions" }, Fe = { class: "gd-contract-template-renderer__field-group-head" }, Ie = { class: "gd-contract-template-renderer__field-group-items" }, Le = ["data-field-key"], Re = .5, ze = 1.5, C = .1, Be = 3e3, Ve = /* @__PURE__ */ h({
17
+ name: "ContractTemplateSingleRenderer",
18
+ __name: "ContractTemplateSingleRenderer",
19
+ props: {
20
+ files: {},
21
+ activeFileId: {},
22
+ valuesByFile: {},
23
+ template: { default: void 0 },
24
+ values: { default: void 0 },
25
+ interactionMode: { default: "panel" },
26
+ readonly: {
27
+ type: Boolean,
28
+ default: !1
29
+ },
30
+ disabled: {
31
+ type: Boolean,
32
+ default: !1
33
+ },
34
+ title: { default: "合同填写" },
35
+ showSubmitButton: {
36
+ type: Boolean,
37
+ default: !0
38
+ },
39
+ validateOnSubmit: {
40
+ type: Boolean,
41
+ default: !0
42
+ },
43
+ showValidateButton: {
44
+ type: Boolean,
45
+ default: !0
46
+ },
47
+ showResetButton: {
48
+ type: Boolean,
49
+ default: !0
50
+ },
51
+ showToolbar: {
52
+ type: Boolean,
53
+ default: !0
54
+ },
55
+ showPageMeta: {
56
+ type: Boolean,
57
+ default: !0
58
+ },
59
+ collapsiblePanel: {
60
+ type: Boolean,
61
+ default: !0
62
+ },
63
+ zoom: { default: 1 },
64
+ controlRegistry: { default: () => ({}) },
65
+ optionResolver: {
66
+ type: Function,
67
+ default: void 0
68
+ },
69
+ requester: {
70
+ type: Function,
71
+ default: void 0
72
+ },
73
+ allowedRemoteOrigins: { default: () => [] },
74
+ remoteRequestTimeoutMs: { default: 1e4 },
75
+ remoteOptionsCacheTtlMs: { default: 3e4 },
76
+ selectorHttp: { default: void 0 },
77
+ selectorUrlPrefix: { default: "" },
78
+ contractFontBaseUrl: { default: void 0 }
79
+ },
80
+ emits: [
81
+ "update:activeFileId",
82
+ "update:valuesByFile",
83
+ "update:values",
84
+ "change",
85
+ "validate",
86
+ "submit",
87
+ "update:zoom",
88
+ "control-warning"
89
+ ],
90
+ setup(h, { expose: Ve, emit: He }) {
91
+ let w = h, T = He, Ue = [
92
+ {
93
+ label: "全部",
94
+ value: "all"
95
+ },
96
+ {
97
+ label: "未填写",
98
+ value: "unfilled"
99
+ },
100
+ {
101
+ label: "有错误",
102
+ value: "error"
103
+ }
104
+ ], We = _(), E = _(), Ge = _(), D = _(c(w.template, w.values)), Ke = _({ ...D.value }), O = _(!1), k = _([]), A = _(!1), j = _(!1), M = _(""), N = _(""), P = _(""), qe = _(0), F = _(Zt(w.zoom)), I = _(""), L = _("all"), R = _(!1), Je = _(/* @__PURE__ */ new Map()), z = /* @__PURE__ */ new Map(), Ye = /* @__PURE__ */ new Map(), B = /* @__PURE__ */ new Map(), Xe = /* @__PURE__ */ new Set(), { width: Ze } = Se(E), Qe = l(() => w.readonly || w.disabled), V = l(() => te(w.template)), $e = l(() => O.value ? k.value : V.value), H = l(() => (Array.isArray(w.template?.variables) ? w.template.variables : []).filter((t) => !!t?.key && e(t.type ?? "text"))), et = l(() => {
105
+ let e = { ...D.value };
106
+ return H.value.forEach((t) => {
107
+ let n = jt(t);
108
+ if (n?.toDisplayText) try {
109
+ e[t.key] = n.toDisplayText(e[t.key], {
110
+ variable: t,
111
+ config: r(t.componentConfig)
112
+ });
113
+ } catch {}
114
+ }), e;
115
+ }), tt = l(() => H.value.filter((e) => s(D.value[e.key])).length), nt = l(() => {
116
+ let e = /* @__PURE__ */ new Map();
117
+ return $e.value.forEach((t) => {
118
+ t.variableKey && e.set(t.variableKey, [...e.get(t.variableKey) ?? [], t]);
119
+ }), e;
120
+ }), U = l(() => {
121
+ let e = w.interactionMode === "panel";
122
+ return o(w.template, e ? et.value : Ke.value, {
123
+ readonly: w.readonly,
124
+ disabled: w.disabled,
125
+ mode: e ? "display" : "control"
126
+ });
127
+ }), rt = l(() => {
128
+ let e = /* @__PURE__ */ new Map(), t = new Set(H.value.map((e) => e.key));
129
+ return U.value.forEach((n) => {
130
+ Gt(n.contentHtml).forEach((r) => {
131
+ t.has(r) && !e.has(r) && e.set(r, n.id);
132
+ });
133
+ }), e;
134
+ }), it = l(() => H.value.filter(Bt)), at = l(() => {
135
+ let e = U.value.map((e, t) => ({
136
+ id: `page:${e.id}`,
137
+ pageId: e.id,
138
+ title: `第 ${t + 1} 页${e.title ? ` · ${e.title}` : ""}`,
139
+ allVariables: [],
140
+ variables: []
141
+ })), t = new Map(e.map((e) => [e.pageId, e])), n = {
142
+ id: "unlocated",
143
+ title: "未定位字段",
144
+ allVariables: [],
145
+ variables: []
146
+ };
147
+ return H.value.forEach((e) => {
148
+ let r = t.get(rt.value.get(e.key) ?? "") ?? n;
149
+ r.allVariables.push(e), Bt(e) && r.variables.push(e);
150
+ }), [...e, n].filter((e) => e.variables.length > 0).map((e) => ({
151
+ id: e.id,
152
+ title: e.title,
153
+ totalCount: e.allVariables.length,
154
+ variables: e.variables
155
+ }));
156
+ }), ot = l(() => U.value.length > 0), st = l(() => H.value.filter((e) => !s(D.value[e.key])).length), ct = l(() => H.value.filter((e) => e.required && s(D.value[e.key])).length), lt = l(() => H.value.length ? Math.round(st.value / H.value.length * 100) : 0), ut = l(() => O.value && k.value.length === 0), dt = l(() => O.value ? ut.value ? "校验通过,模板与填写值均符合规则" : `发现 ${k.value.length} 个模板或填写问题` : V.value.length ? `模板存在 ${V.value.length} 个问题,已安全降级展示` : ""), ft = l(() => O.value ? $e.value.length > 0 || j.value : V.value.length > 0);
157
+ b(() => w.template, (e) => {
158
+ W(c(e, w.values), !1), Ct();
159
+ let t = Array.isArray(e?.pages) ? e.pages.map((e) => e?.id) : [];
160
+ t.includes(P.value) || (P.value = t.find(Boolean) ?? ""), N.value && !H.value.some((e) => e.key === N.value) && Dt();
161
+ }, { deep: !0 }), b(() => [
162
+ w.template?.variables,
163
+ w.optionResolver,
164
+ w.requester,
165
+ w.allowedRemoteOrigins,
166
+ w.remoteRequestTimeoutMs,
167
+ w.remoteOptionsCacheTtlMs
168
+ ], () => {
169
+ Nt();
170
+ }, {
171
+ deep: !0,
172
+ immediate: !0
173
+ }), b(() => w.values, (e) => {
174
+ let t = c(w.template, e);
175
+ Qt(t, D.value) || (W(t, !1, { refreshInlineHtml: w.interactionMode !== "inline" }), Ct());
176
+ }, { deep: !0 }), b(() => w.interactionMode, (e) => {
177
+ e === "inline" && (Ke.value = { ...D.value });
178
+ }), b(() => w.collapsiblePanel, (e) => {
179
+ e || (R.value = !1);
180
+ }), b(() => w.zoom, (e) => F.value = Zt(e)), b(U, (e) => {
181
+ !P.value && e.length && (P.value = e[0].id);
182
+ }, { immediate: !0 });
183
+ function W(e, t = !0, n = {}) {
184
+ D.value = { ...e }, n.refreshInlineHtml !== !1 && (Ke.value = { ...e }), t && (T("update:values", { ...D.value }), T("change", { ...D.value }));
185
+ }
186
+ function G(e, t) {
187
+ !e || Qe.value || (W({
188
+ ...D.value,
189
+ [e]: t
190
+ }, !0, { refreshInlineHtml: w.interactionMode !== "inline" }), O.value && yt());
191
+ }
192
+ function pt(e) {
193
+ if (w.interactionMode !== "inline") return;
194
+ let t = e.target;
195
+ if (!(t instanceof HTMLInputElement) && !(t instanceof HTMLTextAreaElement)) return;
196
+ let n = t.dataset.key || "";
197
+ n && (t instanceof HTMLInputElement && t.type === "checkbox" ? G(n, t.checked) : t instanceof HTMLInputElement && t.type === "number" ? G(n, t.value === "" ? void 0 : t.valueAsNumber) : G(n, t.value));
198
+ }
199
+ function mt(e) {
200
+ let t = e.target;
201
+ if (!(t instanceof Element)) return;
202
+ let n = t.closest("[data-render-page-id]");
203
+ n?.dataset.renderPageId && (P.value = n.dataset.renderPageId);
204
+ let r = t.closest("[data-contract-render-wrapper], [data-contract-render-control]")?.dataset.key || "";
205
+ r && Y(r);
206
+ }
207
+ function ht(e) {
208
+ let t = U.value.find((t) => t.id === e.pageId), n = H.value.some((t) => t.key === e.key);
209
+ if (!(!t || !n || !Gt(t.contentHtml).has(e.key)) && !(e.kind === "input" && w.interactionMode !== "inline")) {
210
+ if (P.value = e.pageId, e.kind === "input") {
211
+ G(e.key, e.value);
212
+ return;
213
+ }
214
+ Y(e.key);
215
+ }
216
+ }
217
+ function gt(e) {
218
+ if (e.key !== "Enter" && e.key !== " ") return;
219
+ let t = e.target;
220
+ !(t instanceof HTMLElement) || !t.dataset.key || (e.preventDefault(), Y(t.dataset.key));
221
+ }
222
+ function _t() {
223
+ return { ...D.value };
224
+ }
225
+ function vt(e) {
226
+ W(c(w.template, e));
227
+ }
228
+ function yt() {
229
+ let e = ne(w.template, D.value);
230
+ return wt(e), T("validate", e), e;
231
+ }
232
+ function bt() {
233
+ let e = ee(w.template, D.value, w.validateOnSubmit);
234
+ if ((w.validateOnSubmit || e.length) && (wt(e), T("validate", e)), e.length) return kt(e[0]), !1;
235
+ let t = _t();
236
+ return T("submit", t), t;
237
+ }
238
+ function xt() {
239
+ return W(a(w.template)), Ct(), _t();
240
+ }
241
+ function St() {
242
+ Qe.value || ve.confirm({
243
+ title: "重置填写内容?",
244
+ content: "将恢复模板中的默认值,当前未提交的填写内容会被覆盖。",
245
+ okText: "确认重置",
246
+ cancelText: "取消",
247
+ onOk: () => xt()
248
+ });
249
+ }
250
+ function Ct() {
251
+ O.value = !1, k.value = [], A.value = !1, j.value = !1, q();
252
+ }
253
+ function wt(e) {
254
+ if (k.value = e, O.value = !0, A.value = !1, e.length) {
255
+ j.value = !1, q();
256
+ return;
257
+ }
258
+ Tt();
259
+ }
260
+ let K;
261
+ function q() {
262
+ K &&= (clearTimeout(K), void 0);
263
+ }
264
+ function Tt() {
265
+ q(), j.value = !0, K = setTimeout(() => {
266
+ j.value = !1, K = void 0;
267
+ }, Be);
268
+ }
269
+ function J(e) {
270
+ Y(e, !0);
271
+ }
272
+ function Et(e) {
273
+ w.interactionMode === "panel" && (R.value &&= !1, H.value.some((t) => t.key === e) && !it.value.some((t) => t.key === e) && Vt());
274
+ }
275
+ function Y(e, t = !1) {
276
+ if (!e) return;
277
+ Et(e), N.value = e, M.value = e;
278
+ let n = rt.value.get(e);
279
+ n && (P.value = n), t && (qe.value += 1), de(() => {
280
+ Ot(e);
281
+ let r = n ? E.value?.querySelector(`[data-render-page-id="${$(n)}"]`) : void 0;
282
+ t && r?.scrollIntoView({
283
+ behavior: "smooth",
284
+ block: "center",
285
+ inline: "center"
286
+ }), w.interactionMode === "panel" && Ge.value?.querySelector(`[data-field-key="${$(e)}"]`)?.scrollIntoView({
287
+ behavior: "smooth",
288
+ block: "nearest"
289
+ });
290
+ });
291
+ }
292
+ function Dt() {
293
+ N.value = "", M.value = "", Ot("");
294
+ }
295
+ function Ot(e) {
296
+ E.value?.querySelectorAll("[data-contract-render-wrapper], [data-contract-render-control]").forEach((t) => t.classList.toggle("is-active", !!e && t.dataset.key === e));
297
+ }
298
+ function kt(e) {
299
+ e.variableKey ? J(e.variableKey) : e.pageId && Xt(e.pageId);
300
+ }
301
+ function At(e) {
302
+ return nt.value.get(e) ?? [];
303
+ }
304
+ function X(e) {
305
+ return Je.value.get(e.key) ?? {
306
+ options: e.options ?? [],
307
+ loading: !1
308
+ };
309
+ }
310
+ function jt(e) {
311
+ let t = e.componentKey || e.type || "";
312
+ return t ? w.controlRegistry?.[t] : void 0;
313
+ }
314
+ function Z(e, t) {
315
+ let n = new Map(Je.value);
316
+ n.set(e, t), Je.value = n;
317
+ }
318
+ function Mt(e) {
319
+ T("control-warning", e);
320
+ }
321
+ async function Nt() {
322
+ z.forEach((e) => e.abort()), z.clear(), Ye.clear(), Xe.clear();
323
+ let e = Array.isArray(w.template?.variables) ? w.template.variables : [];
324
+ await Promise.all(e.map(async (e) => {
325
+ if (!e?.key) return;
326
+ let t = Array.isArray(e.options) ? e.options.map((e) => ({ ...e })) : [];
327
+ if (e.dataSource ? await Pt(e, t) : Z(e.key, {
328
+ options: t,
329
+ loading: !1
330
+ }), e.type === "custom" && !jt(e)) {
331
+ let t = e.componentKey || "", n = `${e.key}:${t}`;
332
+ Xe.has(n) || (Xe.add(n), Mt({
333
+ code: "CONTROL_COMPONENT_MISSING",
334
+ variableKey: e.key,
335
+ componentKey: t,
336
+ message: `${e.label || e.key} 未注册自定义控件 ${t || "(空)"}`
337
+ }));
338
+ }
339
+ }));
340
+ }
341
+ async function Pt(e, n) {
342
+ let r = e.dataSource;
343
+ if (!r) return;
344
+ let i = new AbortController();
345
+ z.set(e.key, i), Z(e.key, {
346
+ options: n,
347
+ loading: !0
348
+ });
349
+ let a = Ft(e), o = Date.now(), s = Ye.get(a);
350
+ if (s && s.expiresAt > o) {
351
+ Z(e.key, {
352
+ options: s.options,
353
+ loading: !1
354
+ }), z.delete(e.key);
355
+ return;
356
+ }
357
+ let c = "CONTROL_OPTIONS_LOAD_FAILED";
358
+ try {
359
+ r.kind === "url" && !t(r.url, w.allowedRemoteOrigins) && (c = "CONTROL_REMOTE_URL_BLOCKED");
360
+ let o = B.get(a);
361
+ o || (o = It(e, r, c, i), B.set(a, o), o.finally(() => {
362
+ B.get(a) === o && B.delete(a);
363
+ }).catch(() => void 0));
364
+ let s = await o;
365
+ if (i.signal.aborted) return;
366
+ let ee = Math.max(0, Number(w.remoteOptionsCacheTtlMs) || 0);
367
+ ee > 0 && Ye.set(a, {
368
+ options: s,
369
+ expiresAt: Date.now() + ee
370
+ }), Z(e.key, {
371
+ options: s.length ? s : n,
372
+ loading: !1
373
+ });
374
+ } catch (t) {
375
+ let r = t instanceof Error && t.message.startsWith("高级控件请求超时");
376
+ if (i.signal.aborted && !r) return;
377
+ let a = t instanceof Error ? t.message : "高级控件选项加载失败";
378
+ Z(e.key, {
379
+ options: n,
380
+ loading: !1,
381
+ error: a
382
+ }), Mt({
383
+ code: c,
384
+ variableKey: e.key,
385
+ message: `${e.label || e.key}:${a}`,
386
+ cause: t
387
+ });
388
+ } finally {
389
+ z.get(e.key) === i && z.delete(e.key);
390
+ }
391
+ }
392
+ function Ft(e) {
393
+ try {
394
+ return JSON.stringify([e.type, e.dataSource]);
395
+ } catch {
396
+ return `${e.key}:${e.type}`;
397
+ }
398
+ }
399
+ async function It(e, r, a, o) {
400
+ let s;
401
+ if (r.kind === "resolver") {
402
+ if (!w.optionResolver) throw Error(`缺少 resolver ${r.resolverKey} 的宿主实现`);
403
+ s = await w.optionResolver({
404
+ resolverKey: r.resolverKey,
405
+ params: r.params,
406
+ variable: e,
407
+ signal: o.signal
408
+ });
409
+ } else {
410
+ if (!t(r.url, w.allowedRemoteOrigins)) throw Error(`远程地址未在 allowlist 中:${r.url}`);
411
+ if (!w.requester) throw Error("缺少宿主 requester,组件库不会直接发起网络请求");
412
+ let n = i(r.timeoutMs, w.remoteRequestTimeoutMs);
413
+ s = await Lt(w.requester({
414
+ url: r.url,
415
+ method: r.method || "GET",
416
+ params: r.params,
417
+ headers: r.headers,
418
+ timeoutMs: n,
419
+ signal: o.signal,
420
+ variable: e
421
+ }), o, n);
422
+ }
423
+ return n(s, r.kind === "url" ? r : void 0, e.type || "select");
424
+ }
425
+ function Lt(e, t, n) {
426
+ return new Promise((r, i) => {
427
+ let a = () => {
428
+ clearTimeout(c), t.signal.removeEventListener("abort", s);
429
+ }, o = (e) => {
430
+ a(), e();
431
+ }, s = () => o(() => i(/* @__PURE__ */ Error("高级控件请求已取消"))), c = setTimeout(() => {
432
+ o(() => i(/* @__PURE__ */ Error(`高级控件请求超时(${n}ms)`))), t.abort();
433
+ }, n);
434
+ t.signal.addEventListener("abort", s, { once: !0 }), e.then((e) => o(() => r(e)), (e) => o(() => i(e)));
435
+ });
436
+ }
437
+ function Rt(e) {
438
+ let t = X(e);
439
+ return {
440
+ variable: e,
441
+ value: D.value[e.key],
442
+ errors: At(e.key),
443
+ active: N.value === e.key,
444
+ readonly: w.readonly,
445
+ disabled: w.disabled,
446
+ options: t.options,
447
+ loading: t.loading,
448
+ loadError: t.error,
449
+ updateValue: (t) => G(e.key, t),
450
+ focusVariable: () => J(e.key)
451
+ };
452
+ }
453
+ function zt() {
454
+ let e = H.value;
455
+ if (!e.length) return;
456
+ let t = e.findIndex((e) => e.key === N.value), n = t < 0 ? 0 : t + 1;
457
+ for (let t = 0; t < e.length; t += 1) {
458
+ let r = e[(n + t) % e.length];
459
+ if (s(D.value[r.key])) {
460
+ J(r.key);
461
+ return;
462
+ }
463
+ }
464
+ }
465
+ function Bt(e) {
466
+ let t = I.value.trim().toLocaleLowerCase();
467
+ return !t || e.key.toLocaleLowerCase().includes(t) || (e.label ?? "").toLocaleLowerCase().includes(t) ? L.value === "unfilled" ? s(D.value[e.key]) : L.value === "error" ? At(e.key).length > 0 : !0 : !1;
468
+ }
469
+ function Vt() {
470
+ I.value = "", L.value = "all";
471
+ }
472
+ function Ht(e, t) {
473
+ let n = it.value;
474
+ if (!n.length) return;
475
+ let r = n.findIndex((t) => t.key === e), i = n[r < 0 ? 0 : (r + t + n.length) % n.length]?.key;
476
+ i && (J(i), de(() => Ut(i)));
477
+ }
478
+ function Ut(e) {
479
+ (Ge.value?.querySelector(`[data-field-key="${$(e)}"]`))?.querySelector("input:not([disabled]), textarea:not([disabled]), button:not([disabled])")?.focus();
480
+ }
481
+ function Wt(e) {
482
+ if (e.key !== "Enter" || e.target instanceof HTMLTextAreaElement) return;
483
+ let t = e.target;
484
+ if (!(t instanceof Element)) return;
485
+ let n = t.closest("[data-field-key]")?.dataset.fieldKey;
486
+ n && (e.preventDefault(), Ht(n, e.shiftKey ? -1 : 1));
487
+ }
488
+ function Gt(e) {
489
+ let t = /* @__PURE__ */ new Set();
490
+ if (typeof DOMParser < "u") return new DOMParser().parseFromString(e, "text/html").querySelectorAll("[data-key]").forEach((e) => {
491
+ let n = e.getAttribute("data-key")?.trim();
492
+ n && t.add(n);
493
+ }), t;
494
+ let n = /\bdata-key\s*=\s*(?:"([^"]+)"|'([^']+)'|([^\s>]+))/gi, r;
495
+ for (; r = n.exec(e);) {
496
+ let e = (r[1] ?? r[2] ?? r[3] ?? "").trim();
497
+ e && t.add(e);
498
+ }
499
+ return t;
500
+ }
501
+ function Kt() {
502
+ !w.collapsiblePanel || w.interactionMode !== "panel" || (R.value = !R.value);
503
+ }
504
+ function Q(e) {
505
+ let t = Zt(e);
506
+ return F.value = t, T("update:zoom", t), t;
507
+ }
508
+ function qt() {
509
+ return Q(1);
510
+ }
511
+ function Jt() {
512
+ return F.value;
513
+ }
514
+ function Yt() {
515
+ let e = Math.max(...U.value.map((e) => e.width), 1);
516
+ return Q(Math.max(0, Ze.value - 48) / e);
517
+ }
518
+ function Xt(e) {
519
+ e && (P.value = e, de(() => {
520
+ E.value?.querySelector(`[data-render-page-id="${$(e)}"]`)?.scrollIntoView({
521
+ behavior: "smooth",
522
+ block: "start",
523
+ inline: "center"
524
+ });
525
+ }));
526
+ }
527
+ function Zt(e) {
528
+ let t = Number(e);
529
+ return Number.isFinite(t) ? Math.min(ze, Math.max(Re, Math.round(t * 100) / 100)) : 1;
530
+ }
531
+ function $(e) {
532
+ return e.replaceAll("\\", "\\\\").replaceAll("\"", "\\\"");
533
+ }
534
+ function Qt(e, t) {
535
+ let n = new Set([...Object.keys(e), ...Object.keys(t)]);
536
+ return Array.from(n).every((n) => e[n] === t[n]);
537
+ }
538
+ function $t(e) {
539
+ !(e.ctrlKey || e.metaKey) || !ot.value || (e.preventDefault(), Q(e.deltaY > 0 ? F.value - C : F.value + C));
540
+ }
541
+ let en;
542
+ function tn() {
543
+ en?.removeEventListener("wheel", $t), en = void 0;
544
+ }
545
+ function nn(e) {
546
+ tn(), e && (e.addEventListener("wheel", $t, { passive: !1 }), en = e);
547
+ }
548
+ return b(E, (e) => {
549
+ nn(e);
550
+ }, { immediate: !0 }), pe(() => {
551
+ tn(), q(), z.forEach((e) => e.abort()), z.clear();
552
+ }), Ve({
553
+ showValidation: wt,
554
+ focusError: (e) => {
555
+ kt(e), e.variableKey && de(() => Ut(e.variableKey));
556
+ },
557
+ getValues: _t,
558
+ setValues: vt,
559
+ validate: yt,
560
+ submit: bt,
561
+ resetValues: xt,
562
+ scrollToVariable: J,
563
+ setZoom: Q,
564
+ resetZoom: qt,
565
+ getZoom: Jt,
566
+ fitWidth: Yt,
567
+ scrollToPage: Xt
568
+ }), (e, t) => (g(), f("section", {
569
+ ref_key: "rendererElement",
570
+ ref: We,
571
+ class: fe(["gd-contract-template-renderer", {
572
+ "is-disabled": h.disabled,
573
+ "is-readonly": h.readonly,
574
+ "is-panel": h.interactionMode === "panel",
575
+ "is-inline": h.interactionMode === "inline"
576
+ }]),
577
+ onClick: mt,
578
+ onKeydown: gt,
579
+ onInput: pt,
580
+ onChange: pt
581
+ }, [
582
+ he(e.$slots, "fileBar"),
583
+ ot.value ? (g(), u(ie, {
584
+ key: 0,
585
+ title: h.title,
586
+ "filled-count": st.value,
587
+ "total-count": H.value.length,
588
+ "required-missing-count": ct.value,
589
+ zoom: F.value,
590
+ pages: U.value,
591
+ "active-page-id": P.value,
592
+ "min-zoom": Re,
593
+ "max-zoom": ze,
594
+ "show-toolbar": h.showToolbar,
595
+ "show-validate-button": h.showValidateButton,
596
+ "show-reset-button": h.showResetButton,
597
+ "show-submit-button": h.showSubmitButton,
598
+ "show-panel-toggle": h.interactionMode === "panel" && h.collapsiblePanel,
599
+ "panel-collapsed": R.value,
600
+ readonly: h.readonly,
601
+ disabled: h.disabled,
602
+ onZoomIn: t[0] ||= (e) => Q(F.value + C),
603
+ onZoomOut: t[1] ||= (e) => Q(F.value - C),
604
+ onResetZoom: qt,
605
+ onFitWidth: Yt,
606
+ onSelectPage: Xt,
607
+ onValidate: yt,
608
+ onReset: St,
609
+ onSubmit: bt,
610
+ onTogglePanel: Kt
611
+ }, {
612
+ extra: x(() => [he(e.$slots, "headerExtra")]),
613
+ _: 3
614
+ }, 8, [
615
+ "title",
616
+ "filled-count",
617
+ "total-count",
618
+ "required-missing-count",
619
+ "zoom",
620
+ "pages",
621
+ "active-page-id",
622
+ "show-toolbar",
623
+ "show-validate-button",
624
+ "show-reset-button",
625
+ "show-submit-button",
626
+ "show-panel-toggle",
627
+ "panel-collapsed",
628
+ "readonly",
629
+ "disabled"
630
+ ])) : d("", !0),
631
+ ft.value ? (g(), u(oe, {
632
+ key: 1,
633
+ passed: ut.value,
634
+ summary: dt.value,
635
+ errors: $e.value,
636
+ expanded: A.value,
637
+ onToggle: t[2] ||= (e) => A.value = !A.value,
638
+ onFocusError: kt
639
+ }, null, 8, [
640
+ "passed",
641
+ "summary",
642
+ "errors",
643
+ "expanded"
644
+ ])) : d("", !0),
645
+ ot.value ? (g(), f("div", {
646
+ key: 3,
647
+ class: fe(["gd-contract-template-renderer__workspace", { "is-inline": h.interactionMode === "inline" }])
648
+ }, [p("div", {
649
+ ref_key: "pagesViewportElement",
650
+ ref: E,
651
+ class: "gd-contract-template-renderer__pages-viewport",
652
+ "data-highlighted-variable-key": M.value
653
+ }, [p("div", Oe, [(g(!0), f(se, null, me(U.value, (e, t) => (g(), u(ae, {
654
+ key: e.id,
655
+ page: e,
656
+ index: t,
657
+ total: U.value.length,
658
+ zoom: F.value,
659
+ "show-meta": h.showPageMeta,
660
+ "font-base-url": h.contractFontBaseUrl,
661
+ "active-key": M.value,
662
+ "scroll-request": qe.value,
663
+ onInteraction: ht
664
+ }, null, 8, [
665
+ "page",
666
+ "index",
667
+ "total",
668
+ "zoom",
669
+ "show-meta",
670
+ "font-base-url",
671
+ "active-key",
672
+ "scroll-request"
673
+ ]))), 128))])], 8, De), h.interactionMode === "panel" ? (g(), f("div", {
674
+ key: 0,
675
+ class: fe(["gd-contract-template-renderer__panel-wrap", { "is-collapsed": R.value && h.collapsiblePanel }])
676
+ }, [h.collapsiblePanel ? (g(), u(y(xe), {
677
+ key: 0,
678
+ title: R.value ? "展开填写面板" : "收起填写面板"
679
+ }, {
680
+ default: x(() => [p("button", {
681
+ type: "button",
682
+ class: "gd-contract-template-renderer__panel-handle",
683
+ "aria-label": R.value ? "展开填写面板" : "收起填写面板",
684
+ "aria-expanded": !R.value,
685
+ onClick: t[3] ||= (e) => R.value = !R.value
686
+ }, [R.value ? (g(), u(y(Ce), {
687
+ key: 0,
688
+ "aria-hidden": "true"
689
+ })) : (g(), u(y(we), {
690
+ key: 1,
691
+ "aria-hidden": "true"
692
+ }))], 8, ke)]),
693
+ _: 1
694
+ }, 8, ["title"])) : d("", !0), p("div", Ae, [p("aside", je, [p("div", Me, [
695
+ p("div", Ne, [p("div", null, [t[6] ||= p("strong", null, "填写项", -1), p("span", null, v(st.value) + " / " + v(H.value.length) + " 已填写", 1)]), p("span", null, v(ct.value ? `${ct.value} 项必填未完成` : "必填项已完成"), 1)]),
696
+ m(y(_e), {
697
+ value: I.value,
698
+ "onUpdate:value": t[4] ||= (e) => I.value = e,
699
+ "allow-clear": "",
700
+ size: "small",
701
+ class: "gd-contract-template-renderer__field-search",
702
+ placeholder: "搜索字段名称或标识"
703
+ }, {
704
+ prefix: x(() => [m(y(Te), { "aria-hidden": "true" })]),
705
+ _: 1
706
+ }, 8, ["value"]),
707
+ p("div", Pe, [m(y(be), {
708
+ value: L.value,
709
+ "onUpdate:value": t[5] ||= (e) => L.value = e,
710
+ size: "small",
711
+ class: "gd-contract-template-renderer__field-filter",
712
+ options: Ue
713
+ }, null, 8, ["value"]), m(y(ge), {
714
+ size: "small",
715
+ disabled: !tt.value,
716
+ onClick: zt
717
+ }, {
718
+ default: x(() => [...t[7] ||= [le(" 下一个未填项 ", -1)]]),
719
+ _: 1
720
+ }, 8, ["disabled"])]),
721
+ m(y(ye), {
722
+ percent: lt.value,
723
+ size: "small",
724
+ "show-info": !1
725
+ }, null, 8, ["percent"])
726
+ ]), it.value.length ? (g(), f("div", {
727
+ key: 1,
728
+ ref_key: "fieldListElement",
729
+ ref: Ge,
730
+ class: "gd-contract-template-renderer__field-list",
731
+ onKeydownCapture: Wt
732
+ }, [(g(!0), f(se, null, me(at.value, (t) => (g(), f("div", {
733
+ key: t.id,
734
+ class: "gd-contract-template-renderer__field-group"
735
+ }, [p("div", Fe, [p("strong", null, v(t.title), 1), p("span", null, v(t.variables.length) + " / " + v(t.totalCount) + " 项", 1)]), p("div", Ie, [(g(!0), f(se, null, me(t.variables, (t) => (g(), f("div", {
736
+ key: t.id || t.key,
737
+ "data-field-key": t.key
738
+ }, [he(e.$slots, "field", ue({ ref_for: !0 }, Rt(t)), () => [m(re, {
739
+ variable: t,
740
+ value: D.value[t.key],
741
+ errors: At(t.key),
742
+ active: N.value === t.key,
743
+ readonly: h.readonly,
744
+ disabled: h.disabled,
745
+ options: X(t).options,
746
+ loading: X(t).loading,
747
+ "load-error": X(t).error,
748
+ registration: jt(t),
749
+ "selector-http": h.selectorHttp,
750
+ "selector-url-prefix": h.selectorUrlPrefix,
751
+ onUpdateValue: (e) => G(t.key, e),
752
+ onFocusVariable: (e) => J(t.key)
753
+ }, null, 8, [
754
+ "variable",
755
+ "value",
756
+ "errors",
757
+ "active",
758
+ "readonly",
759
+ "disabled",
760
+ "options",
761
+ "loading",
762
+ "load-error",
763
+ "registration",
764
+ "selector-http",
765
+ "selector-url-prefix",
766
+ "onUpdateValue",
767
+ "onFocusVariable"
768
+ ])])], 8, Le))), 128))])]))), 128))], 544)) : (g(), u(y(S), {
769
+ key: 0,
770
+ class: "gd-contract-template-renderer__field-empty",
771
+ description: H.value.length ? "没有符合条件的填写项" : "暂无填写项",
772
+ image: y(S).PRESENTED_IMAGE_SIMPLE
773
+ }, ce({
774
+ default: x(() => [I.value || L.value !== "all" ? (g(), u(y(ge), {
775
+ key: 0,
776
+ type: "link",
777
+ size: "small",
778
+ onClick: Vt
779
+ }, {
780
+ default: x(() => [...t[9] ||= [le("清除筛选", -1)]]),
781
+ _: 1
782
+ })) : d("", !0)]),
783
+ _: 2
784
+ }, [I.value || L.value !== "all" ? {
785
+ name: "description",
786
+ fn: x(() => [t[8] ||= p("span", null, "没有符合条件的填写项", -1)]),
787
+ key: "0"
788
+ } : void 0]), 1032, ["description", "image"]))])])], 2)) : d("", !0)], 2)) : (g(), f("div", Ee, [m(y(S), {
789
+ description: "暂无可渲染的合同页面",
790
+ image: y(S).PRESENTED_IMAGE_SIMPLE
791
+ }, null, 8, ["image"])]))
792
+ ], 34));
793
+ }
794
+ });
795
+ //#endregion
796
+ export { Ve as default };