weaver-e10-builder 1.2.2 → 1.2.3
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.
- package/README.md +8 -19
- package/dist/commands/actionflow.d.ts.map +1 -1
- package/dist/commands/actionflow.js +26 -0
- package/dist/commands/actionflow.js.map +1 -1
- package/dist/commands/form-add-detail-table.d.ts.map +1 -1
- package/dist/commands/form-add-detail-table.js +127 -7
- package/dist/commands/form-add-detail-table.js.map +1 -1
- package/dist/commands/form-ebuilder-columns.d.ts +7 -0
- package/dist/commands/form-ebuilder-columns.d.ts.map +1 -1
- package/dist/commands/form-ebuilder-columns.js +2 -24
- package/dist/commands/form-ebuilder-columns.js.map +1 -1
- package/dist/commands/form-formula.d.ts.map +1 -1
- package/dist/commands/form-formula.js +35 -11
- package/dist/commands/form-formula.js.map +1 -1
- package/dist/commands/form-nlist.d.ts +1 -1
- package/dist/commands/form-nlist.d.ts.map +1 -1
- package/dist/commands/form-nlist.js +5 -3
- package/dist/commands/form-nlist.js.map +1 -1
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +93 -72
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/workflow-auth-resp.d.ts.map +1 -1
- package/dist/commands/workflow-auth-resp.js +69 -8
- package/dist/commands/workflow-auth-resp.js.map +1 -1
- package/dist/commands/workflow-node-assign-flow.d.ts +3 -0
- package/dist/commands/workflow-node-assign-flow.d.ts.map +1 -0
- package/dist/commands/workflow-node-assign-flow.js +342 -0
- package/dist/commands/workflow-node-assign-flow.js.map +1 -0
- package/dist/commands/workflow-node.d.ts +2 -0
- package/dist/commands/workflow-node.d.ts.map +1 -1
- package/dist/commands/workflow-node.js +75 -49
- package/dist/commands/workflow-node.js.map +1 -1
- package/dist/core/auth.js +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/services/actionflow/components/assign_var.d.ts +12 -0
- package/dist/services/actionflow/components/assign_var.d.ts.map +1 -0
- package/dist/services/actionflow/components/assign_var.js +133 -0
- package/dist/services/actionflow/components/assign_var.js.map +1 -0
- package/dist/services/actionflow/components/index.d.ts.map +1 -1
- package/dist/services/actionflow/components/index.js +9 -0
- package/dist/services/actionflow/components/index.js.map +1 -1
- package/dist/services/actionflow/dynamic_resources.d.ts +7 -1
- package/dist/services/actionflow/dynamic_resources.d.ts.map +1 -1
- package/dist/services/actionflow/dynamic_resources.js +64 -7
- package/dist/services/actionflow/dynamic_resources.js.map +1 -1
- package/dist/services/actionflow/form_source.d.ts +35 -0
- package/dist/services/actionflow/form_source.d.ts.map +1 -1
- package/dist/services/actionflow/form_source.js +50 -0
- package/dist/services/actionflow/form_source.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +51 -1
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/form-create.d.ts +2 -1
- package/dist/services/form-create.d.ts.map +1 -1
- package/dist/services/form-create.js.map +1 -1
- package/dist/services/form-ebuilder-columns.d.ts +50 -0
- package/dist/services/form-ebuilder-columns.d.ts.map +1 -0
- package/dist/services/form-ebuilder-columns.js +68 -0
- package/dist/services/form-ebuilder-columns.js.map +1 -0
- package/dist/services/form-field-drop.d.ts +30 -1
- package/dist/services/form-field-drop.d.ts.map +1 -1
- package/dist/services/form-field-drop.js +60 -0
- package/dist/services/form-field-drop.js.map +1 -1
- package/dist/services/form-field-patch.d.ts +47 -0
- package/dist/services/form-field-patch.d.ts.map +1 -0
- package/dist/services/form-field-patch.js +88 -0
- package/dist/services/form-field-patch.js.map +1 -0
- package/dist/services/form-nlist.d.ts +1 -0
- package/dist/services/form-nlist.d.ts.map +1 -1
- package/dist/services/form-nlist.js +32 -5
- package/dist/services/form-nlist.js.map +1 -1
- package/dist/services/form-sub-detail.d.ts +51 -3
- package/dist/services/form-sub-detail.d.ts.map +1 -1
- package/dist/services/form-sub-detail.js +183 -20
- package/dist/services/form-sub-detail.js.map +1 -1
- package/dist/services/formula-detail.d.ts +68 -5
- package/dist/services/formula-detail.d.ts.map +1 -1
- package/dist/services/formula-detail.js +110 -44
- package/dist/services/formula-detail.js.map +1 -1
- package/dist/services/rich-text.d.ts +33 -0
- package/dist/services/rich-text.d.ts.map +1 -0
- package/dist/services/rich-text.js +134 -0
- package/dist/services/rich-text.js.map +1 -0
- package/dist/services/workflow-assign-flow.d.ts +114 -0
- package/dist/services/workflow-assign-flow.d.ts.map +1 -0
- package/dist/services/workflow-assign-flow.js +311 -0
- package/dist/services/workflow-assign-flow.js.map +1 -0
- package/dist/services/workflow-node-menu.d.ts +57 -0
- package/dist/services/workflow-node-menu.d.ts.map +1 -0
- package/dist/services/workflow-node-menu.js +144 -0
- package/dist/services/workflow-node-menu.js.map +1 -0
- package/package.json +48 -48
- package/skill-docs/SKILL.md +6 -5
- package/skill-docs/_catalog.md +79 -77
- package/skill-docs/actionflows/SKILL.md +168 -167
- package/skill-docs/actionflows/references/components/ebuilder/ActionEbAdd.md +1 -1
- package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +33 -33
- package/skill-docs/references/common/guide-plan-template.md +254 -251
- package/skill-docs/references/common/ref-cli-commands.md +529 -519
- package/skill-docs/references/form/guide-create-form.md +233 -232
- package/skill-docs/references/form/guide-form-formula-functions.md +11 -1
- package/skill-docs/references/form/guide-form-sub-detail.md +82 -0
- package/skill-docs/references/form/guide-list-custom-text.md +52 -0
- package/skill-docs/references/workflow/guide-workflow-auth-resp.md +198 -190
- package/skill-docs/references/workflow/guide-workflow.md +7 -0
|
@@ -1,66 +1,132 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 扫出表达式里的全部字段引用,**两种写法都认**:
|
|
3
|
+
* - `{主表.字段名}` / `{明细表名.字段名}` —— 平台存储格式
|
|
4
|
+
* - `[字段名]` / `[表名.字段名]` —— 设计器编辑器的写法
|
|
5
|
+
*
|
|
6
|
+
* 重复出现**不去重** —— 每个出现位置都要单独一个参数(见文件头说明)。
|
|
7
|
+
* 不做字符串字面量剔除:公式里写 `"["` 这种极端情况不在支持范围,误判会在解析阶段
|
|
8
|
+
* 报「未找到字段」,比静默错绑安全。
|
|
9
|
+
*/
|
|
10
|
+
export function parseFormulaRefs(expression) {
|
|
11
|
+
const refs = [];
|
|
12
|
+
const re = /\{([^{}]+)\}|\[([^\[\]]+)\]/g;
|
|
13
|
+
let m;
|
|
14
|
+
while ((m = re.exec(expression)) !== null) {
|
|
15
|
+
const inner = (m[1] ?? m[2] ?? '').trim();
|
|
16
|
+
if (!inner)
|
|
17
|
+
continue;
|
|
18
|
+
const dot = inner.indexOf('.');
|
|
19
|
+
const hasTable = dot > 0 && dot < inner.length - 1;
|
|
20
|
+
refs.push({
|
|
21
|
+
table: hasTable ? inner.slice(0, dot).trim() : null,
|
|
22
|
+
field: (hasTable ? inner.slice(dot + 1) : inner).trim(),
|
|
23
|
+
raw: m[0],
|
|
24
|
+
index: m.index,
|
|
25
|
+
length: m[0].length,
|
|
26
|
+
});
|
|
27
|
+
}
|
|
28
|
+
return refs;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* 按目标字段的类型给出合适的公式返回类型。
|
|
32
|
+
*
|
|
33
|
+
* 此前 fields.json 里 `formula` 写成字符串时**一律按 `Number` 提交**,
|
|
34
|
+
* 于是「给单行文本挂公式」必然被平台拒(「公式计算结果必须为: 数字」)——
|
|
35
|
+
* 报错说的是真话:我们替用户要了个数字。
|
|
36
|
+
*/
|
|
37
|
+
export function defaultReturnType(fieldKey) {
|
|
38
|
+
const k = String(fieldKey || '');
|
|
39
|
+
if (/^(Number|Money|Percentage)/.test(k))
|
|
40
|
+
return 'Number';
|
|
41
|
+
if (/^(Date|DateTime|Time)/.test(k))
|
|
42
|
+
return 'Date';
|
|
43
|
+
return 'String';
|
|
44
|
+
}
|
|
1
45
|
export async function buildFormulaParameters(client, baseUrl, objId, appId, formId, expression) {
|
|
2
46
|
const errors = [];
|
|
47
|
+
const warnings = [];
|
|
3
48
|
const parameters = [];
|
|
4
49
|
const refNames = [];
|
|
5
|
-
|
|
6
|
-
const refRegex = /\{(?:主表|([^.}]+))\.([^}]+)\}/g;
|
|
7
|
-
const refs = [];
|
|
8
|
-
let m;
|
|
9
|
-
while ((m = refRegex.exec(expression)) !== null) {
|
|
10
|
-
const table = m[1] ? m[1].trim() : '主表';
|
|
11
|
-
const field = m[2].trim();
|
|
12
|
-
if (!refs.some((r) => r.table === table && r.field === field))
|
|
13
|
-
refs.push({ table, field });
|
|
14
|
-
}
|
|
50
|
+
const refs = parseFormulaRefs(expression);
|
|
15
51
|
if (refs.length === 0) {
|
|
16
|
-
|
|
17
|
-
|
|
52
|
+
// 纯常量公式(如 CONCAT("甲","乙"))平台**接受**,实测保存成功且参数为空。
|
|
53
|
+
// 早期版本在这里直接报错退出,把「平台允许的用法」当成非法输入拦掉了。
|
|
54
|
+
warnings.push('表达式中没有字段引用(纯常量公式)。平台允许这种写法,将按原样保存。');
|
|
18
55
|
}
|
|
19
|
-
//
|
|
20
|
-
|
|
21
|
-
|
|
56
|
+
// getEbField 取主表 + 明细结构(主表字段用于反查不带表名的 `[字段]`)
|
|
57
|
+
let mainFields = [];
|
|
58
|
+
let detailTables = [];
|
|
22
59
|
try {
|
|
23
60
|
const eb = await client.post(`${baseUrl}/api/bs/esb/setting/component/getEbField`, { tableId: objId, appId });
|
|
24
|
-
mainFields
|
|
25
|
-
detailTables
|
|
61
|
+
mainFields = eb?.data?.main || [];
|
|
62
|
+
detailTables = eb?.data?.detail || [];
|
|
26
63
|
}
|
|
27
64
|
catch { /* 拉取失败由解析报错兜底 */ }
|
|
28
65
|
const mainFind = (name) => mainFields.find((f) => String(f.id) === name || f.showName === name || f.dataKey === name);
|
|
66
|
+
const detailOf = (table) => detailTables.find((d) => d.tableName === table || String(d.detailTableId) === table);
|
|
67
|
+
const fieldIn = (dt, name) => (dt?.fields || []).find((x) => String(x.id) === name || x.showName === name || x.dataKey === name);
|
|
68
|
+
/** 归一化:把每个引用改写成 `{表.字段}`。反查不到时保留原文(后续会报错)。 */
|
|
69
|
+
const pieces = [];
|
|
70
|
+
let cursor = 0;
|
|
29
71
|
for (const ref of refs) {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
72
|
+
let table = ref.table;
|
|
73
|
+
let resolved;
|
|
74
|
+
if (table === '主表' || table === null) {
|
|
75
|
+
resolved = mainFind(ref.field);
|
|
76
|
+
if (!resolved && table === null) {
|
|
77
|
+
// 不带表名的 `[字段]`:主表没有就找明细表
|
|
78
|
+
const owners = detailTables.filter((d) => fieldIn(d, ref.field));
|
|
79
|
+
if (owners.length > 1) {
|
|
80
|
+
errors.push(`字段「${ref.field}」在多个明细表中存在(${owners.map((d) => d.tableName).join('、')}),请写成 [明细表名.${ref.field}] 指明是哪个`);
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (owners.length === 1) {
|
|
84
|
+
table = owners[0].tableName;
|
|
85
|
+
resolved = fieldIn(owners[0], ref.field);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (resolved && (table === null || table === '主表')) {
|
|
89
|
+
table = '主表';
|
|
36
90
|
}
|
|
37
|
-
parameters.push({
|
|
38
|
-
dataTemplateId: '', fieldId: String(f.id), formId, module: 'ebuilderform',
|
|
39
|
-
properKey: f.componentKey || 'Text',
|
|
40
|
-
title: f.showName || ref.field, name: f.showName || ref.field,
|
|
41
|
-
appId, id: null,
|
|
42
|
-
});
|
|
43
91
|
}
|
|
44
92
|
else {
|
|
45
|
-
const dt =
|
|
93
|
+
const dt = detailOf(table);
|
|
46
94
|
if (!dt) {
|
|
47
|
-
errors.push(`未找到明细表: "${
|
|
95
|
+
errors.push(`未找到明细表: "${table}",可用: ${detailTables.map((d) => d.tableName).join(', ')}`);
|
|
48
96
|
continue;
|
|
49
97
|
}
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
appId, id: null,
|
|
61
|
-
});
|
|
98
|
+
resolved = fieldIn(dt, ref.field);
|
|
99
|
+
table = dt.tableName;
|
|
100
|
+
}
|
|
101
|
+
if (!resolved) {
|
|
102
|
+
const where = ref.table === '主表' ? '主表' : ref.table ? `明细表「${ref.table}」` : '主表或任一明细表';
|
|
103
|
+
const avail = ref.table && ref.table !== '主表'
|
|
104
|
+
? (detailOf(ref.table)?.fields || []).map((x) => x.showName).join(', ')
|
|
105
|
+
: mainFields.map((x) => x.showName).join(', ');
|
|
106
|
+
errors.push(`在${where}中未找到字段: "${ref.field}",可用: ${avail}`);
|
|
107
|
+
continue;
|
|
62
108
|
}
|
|
109
|
+
// 走到这里 table 必然已定型:要么 '主表',要么是某个明细表名(带表名的引用校验过、不带表名的已反查过)
|
|
110
|
+
const tableName = table;
|
|
111
|
+
const isDetail = tableName !== '主表';
|
|
112
|
+
const dt = isDetail ? detailOf(tableName) : null;
|
|
113
|
+
parameters.push({
|
|
114
|
+
dataTemplateId: '', fieldId: String(resolved.id), formId, module: 'ebuilderform',
|
|
115
|
+
properKey: resolved.componentKey || resolved.fieldKey || 'Text',
|
|
116
|
+
...(dt ? { sFormId: String(dt.detailTableId), sFormName: dt.tableName } : {}),
|
|
117
|
+
title: resolved.showName || resolved.title || ref.field,
|
|
118
|
+
name: resolved.showName || resolved.field || ref.field,
|
|
119
|
+
appId, id: null,
|
|
120
|
+
});
|
|
121
|
+
refNames.push(`${table}.${ref.field}`);
|
|
122
|
+
pieces.push(expression.slice(cursor, ref.index));
|
|
123
|
+
pieces.push(`{${table}.${ref.field}}`);
|
|
124
|
+
cursor = ref.index + ref.length;
|
|
63
125
|
}
|
|
64
|
-
|
|
126
|
+
pieces.push(expression.slice(cursor));
|
|
127
|
+
return {
|
|
128
|
+
parameters, refNames, errors, warnings,
|
|
129
|
+
normalizedExpression: errors.length ? expression : pieces.join(''),
|
|
130
|
+
};
|
|
65
131
|
}
|
|
66
132
|
//# sourceMappingURL=formula-detail.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"formula-detail.js","sourceRoot":"","sources":["../../src/services/formula-detail.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"formula-detail.js","sourceRoot":"","sources":["../../src/services/formula-detail.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/** 展开 `{{}}` 时需要的最少字段信息(ds/fields 的字段对象即可直接传)。 */
|
|
2
|
+
export interface FieldRefSource {
|
|
3
|
+
id?: string;
|
|
4
|
+
fieldId?: string;
|
|
5
|
+
text?: string;
|
|
6
|
+
showName?: string;
|
|
7
|
+
fieldGroup?: {
|
|
8
|
+
name?: string;
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export interface ExpandResult {
|
|
12
|
+
html: string;
|
|
13
|
+
errors: string[];
|
|
14
|
+
warnings: string[];
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 生成一个字段引用标记。字段缺 id 时返回 null(调用方据此报错)。
|
|
18
|
+
* `formTitle` 取不到时占位文本退化成只有字段名 —— 那只是显示文本,平台渲染时会按 data-val 取值。
|
|
19
|
+
*/
|
|
20
|
+
export declare function fieldRefSpan(objId: string, field: FieldRefSource): string | null;
|
|
21
|
+
/**
|
|
22
|
+
* 展开富文本里的 `{{字段名}}` / `{{fieldId}}` 为平台字段引用标记。
|
|
23
|
+
*
|
|
24
|
+
* 同一字段出现多次会各展开一份(平台按出现位置逐个记引用,不能去重)。
|
|
25
|
+
* 有 error 时 **html 原样返回** —— 调用方据此中止,不把半截内容写进视图。
|
|
26
|
+
*/
|
|
27
|
+
export declare function expandFieldRefs(html: string, objId: string, fields: FieldRefSource[]): ExpandResult;
|
|
28
|
+
/**
|
|
29
|
+
* 校验富文本里**已展开**的字段引用标记:data-val 里的 fieldId 是否真的在这张表单里。
|
|
30
|
+
* 用于手写 HTML(不走 `{{}}`)的场景,把「静默显示不出值」提前变成一条警告。
|
|
31
|
+
*/
|
|
32
|
+
export declare function auditFieldRefs(html: string, knownFieldIds: Set<string>): string[];
|
|
33
|
+
//# sourceMappingURL=rich-text.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rich-text.d.ts","sourceRoot":"","sources":["../../src/services/rich-text.ts"],"names":[],"mappings":"AAuBA,kDAAkD;AAClD,MAAM,WAAW,cAAc;IAC7B,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CAChC;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAiBD;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,IAAI,CAUhF;AAiBD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,GACpD,YAAY,CAkCd;AAED;;;GAGG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,MAAM,EAAE,CA0BjF"}
|
|
@@ -0,0 +1,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 自定义文本(富文本列)里的**表单字段引用**。
|
|
3
|
+
*
|
|
4
|
+
* 表单的列表式视图(台账)能加一列「自定义文本」:内容是一段富文本,除了固定文字和图片,
|
|
5
|
+
* 还能通过工具栏的字段图标**插入表单字段**。平台存下来的是一段 HTML,
|
|
6
|
+
* 插入字段的位置是一个 contenteditable=false 的 span:
|
|
7
|
+
*
|
|
8
|
+
* ```html
|
|
9
|
+
* <span contenteditable="false" data-type="list" data-val="{objId.fieldId}">{表名.字段名}</span>
|
|
10
|
+
* ```
|
|
11
|
+
*
|
|
12
|
+
* 其中 `data-val` 里的 `objId.fieldId` 才是身份(平台按它取值),span 里的 `{表名.字段名}`
|
|
13
|
+
* 只是占位显示。**两个值都写错时不报错、只是静默显示不出值**,所以不让调用方直接拼这段 HTML:
|
|
14
|
+
* 模板里写 `{{字段名}}` 或 `{{fieldId}}`,由本模块查表单元数据展开成完整 span。
|
|
15
|
+
*/
|
|
16
|
+
/** 模板里插入字段的写法:`{{字段名}}` / `{{fieldId}}`。 */
|
|
17
|
+
const TOKEN_RE = /\{\{\s*([^{}]+?)\s*\}\}/g;
|
|
18
|
+
/** 平台自带的字段引用标记(已展开的 span)。先认 span,再单独解析 data-val ——
|
|
19
|
+
* 合成一条正则的话,data-val 写坏时整个匹配不上,等于把「静默显示不出值」漏报掉。 */
|
|
20
|
+
const SPAN_RE = /<span\b[^>]*\bdata-type="list"[^>]*>[\s\S]*?<\/span>/g;
|
|
21
|
+
const DATA_VAL_RE = /\bdata-val="\{([^}]*)\}"/;
|
|
22
|
+
/** HTML 文本节点转义:字段名里可能有 `&`/`<` 之类字符。 */
|
|
23
|
+
function escapeText(s) {
|
|
24
|
+
return s.replace(/&/g, '&').replace(/</g, '<').replace(/>/g, '>');
|
|
25
|
+
}
|
|
26
|
+
/** 字段在表单里的显示名(text 优先,退回 showName)。 */
|
|
27
|
+
function titleOf(f) {
|
|
28
|
+
return String(f.text || f.showName || '').trim();
|
|
29
|
+
}
|
|
30
|
+
/** 字段所属表名(平台放在 fieldGroup.name)。 */
|
|
31
|
+
function formTitleOf(f) {
|
|
32
|
+
return String(f.fieldGroup?.name || '').trim();
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* 生成一个字段引用标记。字段缺 id 时返回 null(调用方据此报错)。
|
|
36
|
+
* `formTitle` 取不到时占位文本退化成只有字段名 —— 那只是显示文本,平台渲染时会按 data-val 取值。
|
|
37
|
+
*/
|
|
38
|
+
export function fieldRefSpan(objId, field) {
|
|
39
|
+
const fieldId = String(field.fieldId || field.id || '').trim();
|
|
40
|
+
if (!fieldId || !objId)
|
|
41
|
+
return null;
|
|
42
|
+
const formTitle = formTitleOf(field);
|
|
43
|
+
const fieldTitle = titleOf(field);
|
|
44
|
+
const label = formTitle ? `{${formTitle}.${fieldTitle}}` : `{${fieldTitle}}`;
|
|
45
|
+
return ('<span contenteditable="false" data-type="list"' +
|
|
46
|
+
` data-val="{${objId}.${fieldId}}">${escapeText(label)}</span>`);
|
|
47
|
+
}
|
|
48
|
+
/** 按 token 找字段:先 id/fieldId 精确命中,再按显示名;显示名重复时报歧义。 */
|
|
49
|
+
function matchField(token, fields) {
|
|
50
|
+
const byId = fields.find((f) => String(f.fieldId || '') === token || String(f.id || '') === token);
|
|
51
|
+
if (byId)
|
|
52
|
+
return { field: byId };
|
|
53
|
+
const byName = fields.filter((f) => titleOf(f) === token);
|
|
54
|
+
if (byName.length === 1)
|
|
55
|
+
return { field: byName[0] };
|
|
56
|
+
if (byName.length > 1) {
|
|
57
|
+
return { error: `字段名「${token}」在该表单内不唯一(${byName.length} 个),请改用 fieldId` };
|
|
58
|
+
}
|
|
59
|
+
return { error: `未找到字段「${token}」(可用字段名或 fieldId;字段列表用 form read 查)` };
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* 展开富文本里的 `{{字段名}}` / `{{fieldId}}` 为平台字段引用标记。
|
|
63
|
+
*
|
|
64
|
+
* 同一字段出现多次会各展开一份(平台按出现位置逐个记引用,不能去重)。
|
|
65
|
+
* 有 error 时 **html 原样返回** —— 调用方据此中止,不把半截内容写进视图。
|
|
66
|
+
*/
|
|
67
|
+
export function expandFieldRefs(html, objId, fields) {
|
|
68
|
+
const errors = [];
|
|
69
|
+
const warnings = [];
|
|
70
|
+
if (typeof html !== 'string' || !html)
|
|
71
|
+
return { html: html || '', errors, warnings };
|
|
72
|
+
// fieldMap 里同一字段会有 id / fieldId 两个键,先把重复项去掉再判歧义
|
|
73
|
+
const seen = new Set();
|
|
74
|
+
const uniq = [];
|
|
75
|
+
for (const f of fields) {
|
|
76
|
+
const key = String(f.fieldId || f.id || '');
|
|
77
|
+
if (!key || seen.has(key))
|
|
78
|
+
continue;
|
|
79
|
+
seen.add(key);
|
|
80
|
+
uniq.push(f);
|
|
81
|
+
}
|
|
82
|
+
const out = html.replace(TOKEN_RE, (raw, token) => {
|
|
83
|
+
const name = String(token).trim();
|
|
84
|
+
const hit = matchField(name, uniq);
|
|
85
|
+
if (hit.error) {
|
|
86
|
+
errors.push(hit.error);
|
|
87
|
+
return raw;
|
|
88
|
+
}
|
|
89
|
+
const span = fieldRefSpan(objId, hit.field);
|
|
90
|
+
if (!span) {
|
|
91
|
+
errors.push(`字段「${name}」缺少 fieldId,无法生成引用`);
|
|
92
|
+
return raw;
|
|
93
|
+
}
|
|
94
|
+
if (!formTitleOf(hit.field)) {
|
|
95
|
+
warnings.push(`字段「${name}」的表名缺失,引用标记的占位文本只写了字段名(不影响取值)`);
|
|
96
|
+
}
|
|
97
|
+
return span;
|
|
98
|
+
});
|
|
99
|
+
return { html: errors.length ? html : out, errors, warnings };
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* 校验富文本里**已展开**的字段引用标记:data-val 里的 fieldId 是否真的在这张表单里。
|
|
103
|
+
* 用于手写 HTML(不走 `{{}}`)的场景,把「静默显示不出值」提前变成一条警告。
|
|
104
|
+
*/
|
|
105
|
+
export function auditFieldRefs(html, knownFieldIds) {
|
|
106
|
+
const warnings = [];
|
|
107
|
+
if (typeof html !== 'string' || !html)
|
|
108
|
+
return warnings;
|
|
109
|
+
const seen = new Set();
|
|
110
|
+
let m;
|
|
111
|
+
SPAN_RE.lastIndex = 0;
|
|
112
|
+
while ((m = SPAN_RE.exec(html)) !== null) {
|
|
113
|
+
const vm = DATA_VAL_RE.exec(m[0]);
|
|
114
|
+
if (!vm) {
|
|
115
|
+
warnings.push('自定义文本里有一个字段引用标记读不出 data-val(格式应为 data-val="{objId.fieldId}"),平台会静默显示不出值');
|
|
116
|
+
continue;
|
|
117
|
+
}
|
|
118
|
+
const ref = vm[1];
|
|
119
|
+
const dot = ref.lastIndexOf('.');
|
|
120
|
+
if (dot <= 0) {
|
|
121
|
+
warnings.push(`字段引用标记 data-val="{${ref}}" 格式不是 {objId.fieldId}`);
|
|
122
|
+
continue;
|
|
123
|
+
}
|
|
124
|
+
const fieldId = ref.slice(dot + 1);
|
|
125
|
+
if (seen.has(fieldId))
|
|
126
|
+
continue;
|
|
127
|
+
seen.add(fieldId);
|
|
128
|
+
if (!knownFieldIds.has(fieldId)) {
|
|
129
|
+
warnings.push(`自定义文本里引用了 fieldId=${fieldId},但该表单查不到这个字段(平台会静默显示不出值)`);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return warnings;
|
|
133
|
+
}
|
|
134
|
+
//# sourceMappingURL=rich-text.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rich-text.js","sourceRoot":"","sources":["../../src/services/rich-text.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import type { ApiClient } from '../core/client.js';
|
|
2
|
+
/** 目标节点选择范围 */
|
|
3
|
+
export declare const RANGE_TYPES: Record<string, string>;
|
|
4
|
+
export declare const RANGE_TYPE_LABELS: Record<string, string>;
|
|
5
|
+
/** 按出口时,可选出口范围 */
|
|
6
|
+
export declare const NODE_RANGE_TYPES: Record<string, string>;
|
|
7
|
+
export declare const NODE_RANGE_TYPE_LABELS: Record<string, string>;
|
|
8
|
+
/** 自动流转 */
|
|
9
|
+
export declare const AUTO_FLOW_TYPES: Record<string, string>;
|
|
10
|
+
export declare const AUTO_FLOW_TYPE_LABELS: Record<string, string>;
|
|
11
|
+
/** 会签关系(新字段,页面以它为准) */
|
|
12
|
+
export declare const SIGN_RELATION_TYPES: Record<string, string>;
|
|
13
|
+
export declare const SIGN_RELATION_LABELS: Record<string, string>;
|
|
14
|
+
/** 抄送方式 */
|
|
15
|
+
export declare const CC_TYPES: Record<string, string>;
|
|
16
|
+
export declare const CC_TYPE_LABELS: Record<string, string>;
|
|
17
|
+
/** 节点类型里真正能配指定流转的(排除结束节点与分流/合流点) */
|
|
18
|
+
export declare const ASSIGN_FLOW_NODE_TYPES: Set<string>;
|
|
19
|
+
export interface AssignFlowSettings {
|
|
20
|
+
enable: boolean;
|
|
21
|
+
rangeType: string;
|
|
22
|
+
/** 逗号分隔的节点 ID;空串表示未指定 */
|
|
23
|
+
nodeBrowser: string;
|
|
24
|
+
nodeRangeType: string;
|
|
25
|
+
autoFirstNode: boolean;
|
|
26
|
+
forbidModifyTargetNode: boolean;
|
|
27
|
+
enableNodeAlone: boolean;
|
|
28
|
+
enableOpenDialog: boolean;
|
|
29
|
+
enableComments: boolean;
|
|
30
|
+
alwaysShowComments: boolean;
|
|
31
|
+
enableAutoFlow: string;
|
|
32
|
+
/** 逗号分隔的节点 ID;空串表示未指定 */
|
|
33
|
+
mustMultiNode: string;
|
|
34
|
+
useCommonDestination: boolean;
|
|
35
|
+
modifyOperator: boolean;
|
|
36
|
+
autoOperator: boolean;
|
|
37
|
+
signRelationship: string;
|
|
38
|
+
signRelationshipNew: string;
|
|
39
|
+
/** `['1']` 开启单选 / `[]` 关闭 */
|
|
40
|
+
singleOperator: string[];
|
|
41
|
+
useCc: boolean;
|
|
42
|
+
autoCcOperator: boolean;
|
|
43
|
+
modifyCcOperator: boolean;
|
|
44
|
+
ccType: string;
|
|
45
|
+
/** 标量 `0/1` */
|
|
46
|
+
ccRequired: string;
|
|
47
|
+
defaultCcType: string;
|
|
48
|
+
autoFlowSignType: string;
|
|
49
|
+
autoFlowCCType: string;
|
|
50
|
+
}
|
|
51
|
+
/** 合并两份 Form 的 data,并按写入要求归一形状 */
|
|
52
|
+
export declare function normalizeSettings(baseData: any, commonData: any): AssignFlowSettings;
|
|
53
|
+
export declare function getAssignFlowSettings(client: ApiClient, baseUrl: string, workflowId: string, nodeId: string): Promise<AssignFlowSettings>;
|
|
54
|
+
/** 归一后的设置 → 保存报文。基础与通用合并成一个 JSON。 */
|
|
55
|
+
export declare function buildSavePayload(workflowId: string, nodeId: string, s: AssignFlowSettings): Record<string, unknown>;
|
|
56
|
+
/**
|
|
57
|
+
* 清掉当前取值下不再适用的字段。
|
|
58
|
+
*
|
|
59
|
+
* 只清 `nodeBrowser` —— 范围类型不是「指定节点范围」时**平台自己也会把它清成空**
|
|
60
|
+
* (实测:发 rangeType=0 + 残留节点清单,平台收下、回读是空串)。我们跟上这一步,
|
|
61
|
+
* 否则本地以为写的是 A、回读是 B,保存后的回读比对会误报。
|
|
62
|
+
*
|
|
63
|
+
* `mustMultiNode` **不清**:实测平台会原样保留,浏览器也一样 —— 页面报文里
|
|
64
|
+
* `enableAutoFlow` 是 `"0"`、`mustMultiNode` 却带着值。用户临时关掉自动流转再打开,
|
|
65
|
+
* 必经节点还得在。这里"顺手清掉"等于悄悄吃掉配置。
|
|
66
|
+
*/
|
|
67
|
+
export declare function coerceSettings(s: AssignFlowSettings): AssignFlowSettings;
|
|
68
|
+
/** 提交前的组合校验。返回错误文案数组(空 = 通过)。 */
|
|
69
|
+
export declare function validateSettings(s: AssignFlowSettings): string[];
|
|
70
|
+
/** 保存。返回**实际写出去的**设置(已按取值归一),调用方拿它做回读比对。 */
|
|
71
|
+
export declare function saveAssignFlowSettings(client: ApiClient, baseUrl: string, workflowId: string, nodeId: string, raw: AssignFlowSettings): Promise<AssignFlowSettings>;
|
|
72
|
+
/** 保存后回读比对,返回不一致的字段说明。 */
|
|
73
|
+
export declare function diffSettings(before: AssignFlowSettings, after: AssignFlowSettings): string[];
|
|
74
|
+
export interface AssignTargetNode {
|
|
75
|
+
/** 独立设置记录的稳定 ID(改已有目标节点时用它,不要重复新增) */
|
|
76
|
+
id: string;
|
|
77
|
+
targetNodeId: string;
|
|
78
|
+
targetNodeName: string;
|
|
79
|
+
receiverRangeKey: string;
|
|
80
|
+
raw: Record<string, any>;
|
|
81
|
+
}
|
|
82
|
+
export declare function listAssignTargetNodes(client: ApiClient, baseUrl: string, workflowId: string, nodeId: string): Promise<AssignTargetNode[]>;
|
|
83
|
+
/** 新增目标节点独立设置。已存在的目标节点会被跳过(不重复新增)。 */
|
|
84
|
+
export declare function addAssignTargetNodes(client: ApiClient, baseUrl: string, workflowId: string, nodeId: string, targetNodeIds: string[]): Promise<{
|
|
85
|
+
added: string[];
|
|
86
|
+
skipped: string[];
|
|
87
|
+
}>;
|
|
88
|
+
export interface ReceiverRange {
|
|
89
|
+
mainId: string;
|
|
90
|
+
isopen: boolean;
|
|
91
|
+
modetype: string;
|
|
92
|
+
limitOperatorRange: boolean;
|
|
93
|
+
enableSecurityLevel: boolean;
|
|
94
|
+
isUpgrade: boolean;
|
|
95
|
+
}
|
|
96
|
+
export declare function normalizeReceiverRange(data: any): ReceiverRange;
|
|
97
|
+
/**
|
|
98
|
+
* 读指定流转目标节点的接收范围。
|
|
99
|
+
*
|
|
100
|
+
* `mainId` 优先用调用方给的 `receiverRangeKey`(目标节点列表里回读到的稳定值);
|
|
101
|
+
* 它是 `"0"` 或空时说明这条记录还没有自己的范围设置,再按 scene=7 现读一份。
|
|
102
|
+
*/
|
|
103
|
+
export declare function getReceiverRange(client: ApiClient, baseUrl: string, workflowId: string, nodeId: string): Promise<ReceiverRange>;
|
|
104
|
+
export declare function saveReceiverRange(client: ApiClient, baseUrl: string, workflowId: string, nodeId: string, r: ReceiverRange): Promise<void>;
|
|
105
|
+
export interface WorkflowNodeRef {
|
|
106
|
+
id: string;
|
|
107
|
+
name: string;
|
|
108
|
+
nodeType: string;
|
|
109
|
+
}
|
|
110
|
+
/** 取全流程节点(含类型),供 --all-nodes 用。 */
|
|
111
|
+
export declare function listWorkflowNodes(client: ApiClient, baseUrl: string, workflowId: string): Promise<WorkflowNodeRef[]>;
|
|
112
|
+
/** 能配指定流转的节点(排除结束节点、分流/合流点) */
|
|
113
|
+
export declare function assignFlowCapableNodes(nodes: WorkflowNodeRef[]): WorkflowNodeRef[];
|
|
114
|
+
//# sourceMappingURL=workflow-assign-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"workflow-assign-flow.d.ts","sourceRoot":"","sources":["../../src/services/workflow-assign-flow.ts"],"names":[],"mappings":"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"}
|