weaver-e10-builder 1.2.5 → 1.5.2
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/assets/org-employee-template.xlsx +0 -0
- package/dist/commands/form-add-physical-field.d.ts +3 -0
- package/dist/commands/form-add-physical-field.d.ts.map +1 -0
- package/dist/commands/form-add-physical-field.js +125 -0
- package/dist/commands/form-add-physical-field.js.map +1 -0
- package/dist/commands/form-button.d.ts.map +1 -1
- package/dist/commands/form-button.js +28 -5
- package/dist/commands/form-button.js.map +1 -1
- package/dist/commands/form-field-linkage.d.ts.map +1 -1
- package/dist/commands/form-field-linkage.js +27 -6
- package/dist/commands/form-field-linkage.js.map +1 -1
- package/dist/commands/form-formula-linkage.d.ts +3 -0
- package/dist/commands/form-formula-linkage.d.ts.map +1 -0
- package/dist/commands/form-formula-linkage.js +434 -0
- package/dist/commands/form-formula-linkage.js.map +1 -0
- package/dist/commands/form-formula.d.ts.map +1 -1
- package/dist/commands/form-formula.js +22 -3
- package/dist/commands/form-formula.js.map +1 -1
- package/dist/commands/form-list-click.d.ts.map +1 -1
- package/dist/commands/form-list-click.js +2 -1
- package/dist/commands/form-list-click.js.map +1 -1
- package/dist/commands/form-list-permission.js +1 -1
- package/dist/commands/form-list-permission.js.map +1 -1
- package/dist/commands/form-native.d.ts.map +1 -1
- package/dist/commands/form-native.js +11 -3
- package/dist/commands/form-native.js.map +1 -1
- package/dist/commands/form-physical-table.d.ts +3 -0
- package/dist/commands/form-physical-table.d.ts.map +1 -0
- package/dist/commands/form-physical-table.js +195 -0
- package/dist/commands/form-physical-table.js.map +1 -0
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +246 -549
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/matrix.d.ts.map +1 -1
- package/dist/commands/matrix.js +175 -36
- package/dist/commands/matrix.js.map +1 -1
- package/dist/commands/org.d.ts +10 -0
- package/dist/commands/org.d.ts.map +1 -0
- package/dist/commands/org.js +402 -0
- package/dist/commands/org.js.map +1 -0
- package/dist/commands/role.d.ts.map +1 -1
- package/dist/commands/role.js +106 -62
- package/dist/commands/role.js.map +1 -1
- package/dist/commands/wf-form.d.ts.map +1 -1
- package/dist/commands/wf-form.js +501 -26
- package/dist/commands/wf-form.js.map +1 -1
- package/dist/commands/workflow-auth-resp.d.ts.map +1 -1
- package/dist/commands/workflow-auth-resp.js +53 -5
- package/dist/commands/workflow-auth-resp.js.map +1 -1
- package/dist/commands/workflow-create-auth-resp.d.ts.map +1 -1
- package/dist/commands/workflow-create-auth-resp.js +5 -1
- package/dist/commands/workflow-create-auth-resp.js.map +1 -1
- package/dist/commands/workflow-operator-sign.js +1 -1
- package/dist/commands/workflow-operator-sign.js.map +1 -1
- package/dist/commands/workflow.d.ts.map +1 -1
- package/dist/commands/workflow.js +78 -9
- package/dist/commands/workflow.js.map +1 -1
- package/dist/index.js +8 -0
- package/dist/index.js.map +1 -1
- package/dist/services/action-detail.d.ts.map +1 -1
- package/dist/services/action-detail.js +5 -4
- package/dist/services/action-detail.js.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/components/action_eb_update_compiler.js +22 -7
- package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
- package/dist/services/actionflow/components/approve_create.d.ts.map +1 -1
- package/dist/services/actionflow/components/approve_create.js +6 -3
- package/dist/services/actionflow/components/approve_create.js.map +1 -1
- package/dist/services/actionflow/components/custom_set_form.d.ts.map +1 -1
- package/dist/services/actionflow/components/custom_set_form.js +35 -1
- package/dist/services/actionflow/components/custom_set_form.js.map +1 -1
- package/dist/services/actionflow/components/custom_trigger.d.ts.map +1 -1
- package/dist/services/actionflow/components/custom_trigger.js +4 -1
- package/dist/services/actionflow/components/custom_trigger.js.map +1 -1
- package/dist/services/actionflow/components/dml_execute.d.ts.map +1 -1
- package/dist/services/actionflow/components/dml_execute.js +7 -3
- package/dist/services/actionflow/components/dml_execute.js.map +1 -1
- package/dist/services/actionflow/components/document_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/document_actions.js +7 -3
- package/dist/services/actionflow/components/document_actions.js.map +1 -1
- package/dist/services/actionflow/components/hrm_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/hrm_actions.js +7 -3
- package/dist/services/actionflow/components/hrm_actions.js.map +1 -1
- package/dist/services/actionflow/components/multiple_execution.d.ts.map +1 -1
- package/dist/services/actionflow/components/multiple_execution.js +14 -5
- package/dist/services/actionflow/components/multiple_execution.js.map +1 -1
- package/dist/services/actionflow/components/output.js +1 -1
- package/dist/services/actionflow/components/output.js.map +1 -1
- package/dist/services/actionflow/components/send_message.js +2 -2
- package/dist/services/actionflow/components/send_message.js.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
- package/dist/services/actionflow/components/workflow_actions.js +7 -3
- package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
- package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
- package/dist/services/actionflow/context_preflight.js +12 -2
- package/dist/services/actionflow/context_preflight.js.map +1 -1
- package/dist/services/actionflow/context_provider.d.ts.map +1 -1
- package/dist/services/actionflow/context_provider.js +21 -2
- package/dist/services/actionflow/context_provider.js.map +1 -1
- package/dist/services/actionflow/custom_trigger_context.d.ts +10 -0
- package/dist/services/actionflow/custom_trigger_context.d.ts.map +1 -0
- package/dist/services/actionflow/custom_trigger_context.js +46 -0
- package/dist/services/actionflow/custom_trigger_context.js.map +1 -0
- package/dist/services/actionflow/filter_rules.js +2 -2
- package/dist/services/actionflow/filter_rules.js.map +1 -1
- package/dist/services/actionflow/formula_service.d.ts +9 -1
- package/dist/services/actionflow/formula_service.d.ts.map +1 -1
- package/dist/services/actionflow/formula_service.js +59 -21
- package/dist/services/actionflow/formula_service.js.map +1 -1
- package/dist/services/actionflow/id_generator.d.ts +2 -0
- package/dist/services/actionflow/id_generator.d.ts.map +1 -1
- package/dist/services/actionflow/id_generator.js +13 -0
- package/dist/services/actionflow/id_generator.js.map +1 -1
- package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
- package/dist/services/actionflow/preflight_service.js +6 -1
- package/dist/services/actionflow/preflight_service.js.map +1 -1
- package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
- package/dist/services/actionflow/workflow_compiler.js +89 -35
- package/dist/services/actionflow/workflow_compiler.js.map +1 -1
- package/dist/services/auth-resp-condition.d.ts +35 -0
- package/dist/services/auth-resp-condition.d.ts.map +1 -0
- package/dist/services/auth-resp-condition.js +111 -0
- package/dist/services/auth-resp-condition.js.map +1 -0
- package/dist/services/condition-rules.d.ts.map +1 -1
- package/dist/services/condition-rules.js +4 -1
- package/dist/services/condition-rules.js.map +1 -1
- package/dist/services/esb-interface/document-parser.d.ts.map +1 -1
- package/dist/services/esb-interface/document-parser.js +62 -5
- package/dist/services/esb-interface/document-parser.js.map +1 -1
- package/dist/services/form-association.d.ts +19 -0
- package/dist/services/form-association.d.ts.map +1 -1
- package/dist/services/form-association.js +64 -0
- package/dist/services/form-association.js.map +1 -1
- package/dist/services/form-button-action.d.ts +7 -0
- package/dist/services/form-button-action.d.ts.map +1 -1
- package/dist/services/form-button-action.js +11 -1
- package/dist/services/form-button-action.js.map +1 -1
- package/dist/services/form-create.d.ts +4 -0
- package/dist/services/form-create.d.ts.map +1 -1
- package/dist/services/form-create.js +18 -12
- package/dist/services/form-create.js.map +1 -1
- package/dist/services/form-field-build.d.ts +71 -0
- package/dist/services/form-field-build.d.ts.map +1 -0
- package/dist/services/form-field-build.js +436 -0
- package/dist/services/form-field-build.js.map +1 -0
- package/dist/services/form-field-patch.d.ts +3 -1
- package/dist/services/form-field-patch.d.ts.map +1 -1
- package/dist/services/form-field-patch.js +23 -9
- package/dist/services/form-field-patch.js.map +1 -1
- package/dist/services/form-formula-linkage.d.ts +349 -0
- package/dist/services/form-formula-linkage.d.ts.map +1 -0
- package/dist/services/form-formula-linkage.js +546 -0
- package/dist/services/form-formula-linkage.js.map +1 -0
- package/dist/services/form-layout-insert.d.ts +84 -0
- package/dist/services/form-layout-insert.d.ts.map +1 -0
- package/dist/services/form-layout-insert.js +244 -0
- package/dist/services/form-layout-insert.js.map +1 -0
- package/dist/services/form-linkage-condition.d.ts +159 -0
- package/dist/services/form-linkage-condition.d.ts.map +1 -0
- package/dist/services/form-linkage-condition.js +307 -0
- package/dist/services/form-linkage-condition.js.map +1 -0
- package/dist/services/form-physical-table.d.ts +115 -0
- package/dist/services/form-physical-table.d.ts.map +1 -0
- package/dist/services/form-physical-table.js +153 -0
- package/dist/services/form-physical-table.js.map +1 -0
- package/dist/services/formula-detail.d.ts +98 -6
- package/dist/services/formula-detail.d.ts.map +1 -1
- package/dist/services/formula-detail.js +208 -26
- package/dist/services/formula-detail.js.map +1 -1
- package/dist/services/matrix-rows.d.ts +43 -0
- package/dist/services/matrix-rows.d.ts.map +1 -0
- package/dist/services/matrix-rows.js +104 -0
- package/dist/services/matrix-rows.js.map +1 -0
- package/dist/services/org-department.d.ts +114 -0
- package/dist/services/org-department.d.ts.map +1 -0
- package/dist/services/org-department.js +209 -0
- package/dist/services/org-department.js.map +1 -0
- package/dist/services/org-employee.d.ts +191 -0
- package/dist/services/org-employee.d.ts.map +1 -0
- package/dist/services/org-employee.js +400 -0
- package/dist/services/org-employee.js.map +1 -0
- package/dist/services/role-member.d.ts +99 -0
- package/dist/services/role-member.d.ts.map +1 -0
- package/dist/services/role-member.js +206 -0
- package/dist/services/role-member.js.map +1 -0
- package/dist/services/workflow-info.d.ts +83 -0
- package/dist/services/workflow-info.d.ts.map +1 -0
- package/dist/services/workflow-info.js +97 -0
- package/dist/services/workflow-info.js.map +1 -0
- package/dist/services/workflow-odoc-setting.d.ts +1 -1
- package/dist/services/workflow-odoc-setting.d.ts.map +1 -1
- package/dist/services/workflow-odoc-setting.js +15 -6
- package/dist/services/workflow-odoc-setting.js.map +1 -1
- package/dist/utils/column-name.d.ts +24 -0
- package/dist/utils/column-name.d.ts.map +1 -1
- package/dist/utils/column-name.js +16 -0
- package/dist/utils/column-name.js.map +1 -1
- package/ecodecmd/package.json +1 -2
- package/ecodecmd/src/loaddep.js +19 -9
- package/package.json +4 -4
- package/skill-docs/SKILL.md +13 -9
- package/skill-docs/_catalog.md +86 -81
- package/skill-docs/actionflows/SKILL.md +173 -170
- package/skill-docs/actionflows/references/components/logic/Output.md +1 -1
- package/skill-docs/actionflows/references/components/trigger/CustomTrigger.md +32 -0
- package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +1 -1
- package/skill-docs/references/common/guide-plan-template.md +9 -3
- package/skill-docs/references/common/ref-cli-commands.md +54 -23
- package/skill-docs/references/esb-interface/guide-import.md +4 -1
- package/skill-docs/references/form/guide-create-form.md +13 -0
- package/skill-docs/references/form/guide-field-linkage.md +2 -0
- package/skill-docs/references/form/guide-form-association.md +1 -1
- package/skill-docs/references/form/guide-form-formula-functions.md +36 -0
- package/skill-docs/references/form/guide-form-layout-incremental.md +75 -0
- package/skill-docs/references/form/guide-form-linkage.md +62 -4
- package/skill-docs/references/form/guide-form-physical-table.md +146 -0
- package/skill-docs/references/form/guide-formula-linkage.md +250 -0
- package/skill-docs/references/form/ref-form-fields.md +6 -0
- package/skill-docs/references/hrm/guide-matrix.md +79 -16
- package/skill-docs/references/hrm/guide-org-employee.md +124 -0
- package/skill-docs/references/report/cell-config-echo-guide.md +1 -1
- package/skill-docs/references/report/dataset-query-filter-guide.md +3 -3
- package/skill-docs/references/report/date-range-query-reference.md +2 -2
- package/skill-docs/references/report/query-condition-api-guide.md +11 -11
- package/skill-docs/references/report/report-designer-feature-map.md +1 -1
- package/skill-docs/references/report/report-permission-guide.md +2 -2
- package/skill-docs/references/workflow/guide-workflow-auth-resp.md +48 -22
- package/skill-docs/references/workflow/guide-workflow-odoc-setting.md +248 -0
- package/skill-docs/references/workflow/guide-workflow-odoc.md +23 -51
- package/skill-docs/references/workflow/guide-workflow.md +1 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-layout-insert.d.ts","sourceRoot":"","sources":["../../src/services/form-layout-insert.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAsDnD,MAAM,WAAW,QAAQ;IACvB,KAAK,EAAE,GAAG,CAAC;IACX,KAAK,EAAE,GAAG,CAAC;CACZ;AAED,MAAM,WAAW,kBAAkB;IACjC,8CAA8C;IAC9C,KAAK,EAAE,GAAG,EAAE,CAAC;IACb,8DAA8D;IAC9D,OAAO,EAAE,MAAM,CAAC;IAChB,uDAAuD;IACvD,YAAY,EAAE,MAAM,CAAC;IACrB,uCAAuC;IACvC,KAAK,EAAE,MAAM,CAAC;IACd,mDAAmD;IACnD,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC9B,oCAAoC;IACpC,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,MAAM,YAAY,GAAG,CAAC;IAAE,EAAE,EAAE,IAAI,CAAA;CAAE,GAAG,QAAQ,CAAC,GAAG;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAcpF;;;;;;;GAOG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,YAAY,CAiDrE;AAmDD,MAAM,WAAW,gBAAiB,SAAQ,IAAI,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACzE,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CACjC;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAClC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,MAAM,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,QAAQ,EAAE,GAAG,KAAK,CAAC,GAC/C,OAAO,CAAC,CAAC,CAAC,CA4BZ;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE,OAAO,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAIvE;AAED;;;;;;GAMG;AACH,wBAAsB,gBAAgB,CACpC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,GACzB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAW9B;AAED,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,SAAS,EACjB,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,gBAAgB,GACtB,OAAO,CAAC,iBAAiB,CAAC,CAoB5B"}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import crypto from 'node:crypto';
|
|
2
|
+
/**
|
|
3
|
+
* 表单布局的**增量操作**:往现有布局里塞一个新字段的 comp 对(`insertFieldIntoLayout`)、
|
|
4
|
+
* 或改已有字段的布局层属性(`patchFieldLayout`)。两者都**不碰 `initLayout`**。
|
|
5
|
+
* 读快照 → 改 comp → 存回的那段(乐观锁、`formLayout.formId`、派生字段)收在 `mutateLayout` 里,
|
|
6
|
+
* 只此一份 —— 那几条约束不看代码想不到,抄第二遍必然漏。
|
|
7
|
+
*
|
|
8
|
+
* ## 为什么不能走 initLayout
|
|
9
|
+
*
|
|
10
|
+
* `initLayout` 是**整表重建**:它按传进去的 `configs` 重算所有位置、把样式模板换成传进去的
|
|
11
|
+
* 那一个、并把 `InternalTitle` 标签组件**全部重建**(新 id,不是挪)。对不是我们建的表,
|
|
12
|
+
* 这就是破坏 —— 手工调过的位置、合并格、列宽、配色一并丢失。
|
|
13
|
+
* 但增量改布局的机制本来就有一半:`form layout move` / `set-required` / `remove-field` 走的
|
|
14
|
+
* 都是「读快照 → 改 comp → `saveFormAndLayout`」。**缺的只有「插入新字段的 comp」这一个动作**,
|
|
15
|
+
* 本模块补的就是它。
|
|
16
|
+
*
|
|
17
|
+
* ## 为什么要抄现成的 comp,而不是按类型拼一个
|
|
18
|
+
*
|
|
19
|
+
* comp 是**两套 JSON 的并集**(见 `form-layout-comp-mapping` 那份结论):
|
|
20
|
+
* 字段定义那一半 + 布局层专有键那一半。而各类型的键集**差别很大** ——
|
|
21
|
+
* Date 有 `format`/`earlyDate`/`lateType`/`minuteStep`,Employee 有 `showDimension`/
|
|
22
|
+
* `isSingle`/`viewDataDetail`,Number 有 `pointSize`/`isDelimiter`/`capitalFormat`…
|
|
23
|
+
* 按类型名拼一个出来,等于把这些键逐个猜一遍,猜错不报错、只是渲染异常。
|
|
24
|
+
* 所以这里**只抄同表同 `componentKey` 的现成 comp**(顶层键 + 布局层键整套照抄),
|
|
25
|
+
* 再覆盖字段定义那一部分。表里没有同类型的 → **明确报错**,不硬凑。
|
|
26
|
+
*
|
|
27
|
+
* ## 三个 id 都是自造的,平台收
|
|
28
|
+
*
|
|
29
|
+
* 在真实环境验证过(加完字段回读 + 设计器渲染均正常,且原有 comp 的 id 一个没变):
|
|
30
|
+
* comp 的 `id`(32 位 hex)、标签的 `config.fieldId`(雪花)、`config.excel.nodeId`(10 位 hex)
|
|
31
|
+
* 平台都照单全收 —— 它只要求这仨在布局内唯一,不校验来源。
|
|
32
|
+
*/
|
|
33
|
+
/** 标签组件的 type。字段在布局里占**两个** comp:一个标签、一个值组件。 */
|
|
34
|
+
const LABEL_TYPE = 'InternalTitle';
|
|
35
|
+
/** 明细表容器的 type。它不是字段,匹配模板时要排掉。 */
|
|
36
|
+
const DETAIL_TYPE = 'DetailTable';
|
|
37
|
+
/** 顶层组件的 `excel.parent` 哨兵值(明细字段的 parent 是明细表组件的 nodeId)。 */
|
|
38
|
+
const ROOT_PARENT = 'ROOT';
|
|
39
|
+
const hexId = (bytes) => crypto.randomBytes(bytes).toString('hex');
|
|
40
|
+
/**
|
|
41
|
+
* 抄字段定义时要**跳过**的键。
|
|
42
|
+
*
|
|
43
|
+
* 这些都是「表级」的:模板和新字段本来就同表同作用域,抄模板的即可;
|
|
44
|
+
* 而字段定义里这几个键的含义和 comp 里的**不完全对齐**(明细字段的定义常带主表的
|
|
45
|
+
* `formTableId`),覆盖过去反而会把组件挪到错的表上。
|
|
46
|
+
*/
|
|
47
|
+
const SKIP_FROM_FIELD_DEF = new Set(['formId', 'formTableId', 'subFormId', 'groupId']);
|
|
48
|
+
/** 该 comp 所在的作用域:顶层是 `ROOT`,明细字段是明细表组件的 nodeId。 */
|
|
49
|
+
const scopeOf = (comp) => String(comp?.config?.excel?.parent ?? '');
|
|
50
|
+
/** 按作用域定位明细表容器,返回它的 nodeId。 */
|
|
51
|
+
function detailScopeNodeId(comps, subFormId) {
|
|
52
|
+
const dt = comps.find((c) => c.type === DETAIL_TYPE
|
|
53
|
+
&& String(c.config?.associatedId ?? c.config?.subFormId ?? '') === String(subFormId));
|
|
54
|
+
return dt ? String(dt.config?.excel?.nodeId ?? '') || null : null;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* 把新字段的 comp 对构造出来(纯函数,不碰网络)。
|
|
58
|
+
*
|
|
59
|
+
* 位置按「同作用域里最大行 + 1」追加 —— 与设计器里手工拖到末尾的落点一致。
|
|
60
|
+
* 列沿用模板自己的列,这样单选/两列/多列布局都不用另外判断。
|
|
61
|
+
* 明细表容器**不参与行号计算**:它在顶层作用域里,但行号是自己的(常被摆在字段下面老远),
|
|
62
|
+
* 算进去会让新字段凭空多跳几行。
|
|
63
|
+
*/
|
|
64
|
+
export function buildCompPair(input) {
|
|
65
|
+
const { comps, fieldId, labelFieldId, title, fieldDef, subFormId } = input;
|
|
66
|
+
let scope = ROOT_PARENT;
|
|
67
|
+
if (subFormId) {
|
|
68
|
+
const nodeId = detailScopeNodeId(comps, subFormId);
|
|
69
|
+
if (!nodeId)
|
|
70
|
+
return { ok: false, error: `布局里找不到明细表 subFormId=${subFormId}` };
|
|
71
|
+
scope = nodeId;
|
|
72
|
+
}
|
|
73
|
+
const inScope = (c) => scopeOf(c) === scope;
|
|
74
|
+
const componentKey = String(fieldDef?.componentKey ?? '');
|
|
75
|
+
const labelTpl = comps.find((c) => c.type === LABEL_TYPE && inScope(c));
|
|
76
|
+
const valueTpl = comps.find((c) => c.type !== LABEL_TYPE && c.type !== DETAIL_TYPE && inScope(c)
|
|
77
|
+
&& String(c.config?.componentKey ?? '') === componentKey);
|
|
78
|
+
// 先看值组件:两者都缺是常态(表/明细表里一个字段都没有),此时「还没有 XX 类型的字段」
|
|
79
|
+
// 比「没有标签组件」有用得多 —— 前者直接说了该补什么。
|
|
80
|
+
if (!valueTpl) {
|
|
81
|
+
return {
|
|
82
|
+
ok: false,
|
|
83
|
+
error: `本表${subFormId ? '的该明细表' : ''}还没有「${componentKey}」类型的字段,`
|
|
84
|
+
+ '没有可参照的组件模板 —— 先在设计器里手工加一个同类型字段,或者改用 --reinit 整表重建'
|
|
85
|
+
+ '(重建会换样式模板并把已有位置重排)',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
if (!labelTpl) {
|
|
89
|
+
return {
|
|
90
|
+
ok: false,
|
|
91
|
+
error: subFormId
|
|
92
|
+
? '该明细表里有字段、却没有可作模板的标签组件(InternalTitle)—— 布局数据不完整,先在设计器里打开这张表看一眼'
|
|
93
|
+
: '布局里有字段、却没有可作模板的标签组件(InternalTitle)—— 布局数据不完整,先在设计器里打开这张表看一眼',
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
const rows = comps
|
|
97
|
+
.filter((c) => inScope(c) && c.type !== DETAIL_TYPE)
|
|
98
|
+
.map((c) => Number(c.config?.excel?.row) || 0);
|
|
99
|
+
const row = (rows.length ? Math.max(...rows) : 0) + 1;
|
|
100
|
+
const value = cloneForNewField(valueTpl, {
|
|
101
|
+
fieldId, labelFieldId, title, fieldDef, row, subFormId,
|
|
102
|
+
});
|
|
103
|
+
const label = cloneForNewField(labelTpl, {
|
|
104
|
+
fieldId, labelFieldId, title, fieldDef, row, subFormId,
|
|
105
|
+
});
|
|
106
|
+
return { ok: true, label, value };
|
|
107
|
+
}
|
|
108
|
+
/**
|
|
109
|
+
* 用模板克隆出属于新字段的 comp。
|
|
110
|
+
*
|
|
111
|
+
* `config` 的处理顺序是有意的:**以模板为底** → 覆盖字段定义里同名的键 → 强制身份键 → 换位置。
|
|
112
|
+
* 以模板为底(而不是以字段定义为底)是因为布局层专有键(`layout`/`display`/`readOnly`/
|
|
113
|
+
* `singleRow`/`excel`…)只有模板才有,拿字段定义当底会把这些全丢光。
|
|
114
|
+
*/
|
|
115
|
+
function cloneForNewField(tpl, ctx) {
|
|
116
|
+
const comp = JSON.parse(JSON.stringify(tpl));
|
|
117
|
+
comp.id = hexId(16);
|
|
118
|
+
delete comp.config.children; // 模板若带结构性子节点(如明细表),新字段不该继承
|
|
119
|
+
const cfg = comp.config;
|
|
120
|
+
for (const [k, v] of Object.entries(ctx.fieldDef || {})) {
|
|
121
|
+
if (!SKIP_FROM_FIELD_DEF.has(k) && k in cfg && v !== undefined)
|
|
122
|
+
cfg[k] = v;
|
|
123
|
+
}
|
|
124
|
+
cfg.associatedId = ctx.fieldId; // ← 归属只看这个
|
|
125
|
+
if (comp.type === LABEL_TYPE) {
|
|
126
|
+
// ⚠ 标签**必须丢掉模板的多语言标签引用**,否则新字段会指向模板字段的标签 ——
|
|
127
|
+
// 名字跟着别人走(或指向一个查不回的 id,标题变空白)。各环境两种存法都有:
|
|
128
|
+
// `labelObj.title` / `titleLabelId`,还有更老的把整个 `title` 存成对象
|
|
129
|
+
// `{nameAlias, targetId, nameAliasLabelId}`。这里统一退回**纯文本 title**。
|
|
130
|
+
delete cfg.labelObj;
|
|
131
|
+
delete cfg.titleLabelId;
|
|
132
|
+
// 标签的 config.fieldId 是布局自己另生成的,与字段定义无关(详见模块头注释)
|
|
133
|
+
cfg.fieldId = ctx.labelFieldId;
|
|
134
|
+
}
|
|
135
|
+
cfg.title = ctx.title;
|
|
136
|
+
if (comp.type !== LABEL_TYPE) {
|
|
137
|
+
cfg.fieldId = ctx.fieldId;
|
|
138
|
+
if (ctx.subFormId)
|
|
139
|
+
cfg.subFormId = ctx.subFormId;
|
|
140
|
+
}
|
|
141
|
+
cfg.excel = {
|
|
142
|
+
...(cfg.excel || {}),
|
|
143
|
+
row: ctx.row,
|
|
144
|
+
col: Number(tpl.config?.excel?.col) || 1,
|
|
145
|
+
nodeId: hexId(5),
|
|
146
|
+
};
|
|
147
|
+
return comp;
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* 读快照 → 存回,中间交给 `mutate` 改。**不碰 initLayout**。
|
|
151
|
+
*
|
|
152
|
+
* 抽出来是因为读存之间有几个不看代码想不到的约束,只该有一份实现:
|
|
153
|
+
* - 读和存之间**不能插别的写操作**:平台按 `updateTimeStamp` 做乐观锁,中途被改过就回
|
|
154
|
+
* 「当前页面不是最新数据,请刷新页面后编辑保存」。所以整段必须一口气跑完。
|
|
155
|
+
* - `formLayout` 里必须带 `formId`,否则平台在 `Form.getTenantKey()` 上直接 NPE,
|
|
156
|
+
* 报的是一句和表单八竿子打不着的 `"form" is null`。
|
|
157
|
+
* - `pageLayoutEncodes` / `formStyleEncodes` 是读侧的派生字段,回写前要删掉。
|
|
158
|
+
*
|
|
159
|
+
* `mutate` 拿到 pageLayouts 就地改;返回它想报告的任意信息。
|
|
160
|
+
*/
|
|
161
|
+
export async function mutateLayout(client, baseUrl, formId, mutate) {
|
|
162
|
+
const ebb = { ebbusinessid: formId };
|
|
163
|
+
const lay = await client.post(`${baseUrl}/api/ebuilder/form/builder/getFormLayout`, {
|
|
164
|
+
formId, module: 'ebuilderform', customParam: {}, formTableIdList: [],
|
|
165
|
+
designerParam: { onlyLayout: false, convert: false }, form: { id: formId },
|
|
166
|
+
}, ebb);
|
|
167
|
+
const snapshot = lay?.data;
|
|
168
|
+
const pageLayouts = snapshot?.formLayout?.pageLayouts;
|
|
169
|
+
if (!Array.isArray(pageLayouts) || !pageLayouts.length) {
|
|
170
|
+
throw new Error(`读取表单布局失败: ${lay?.msg || '接口未返回 pageLayouts'}`);
|
|
171
|
+
}
|
|
172
|
+
const result = mutate(pageLayouts, snapshot);
|
|
173
|
+
const formLayout = JSON.parse(JSON.stringify(snapshot.formLayout));
|
|
174
|
+
delete formLayout.pageLayoutEncodes;
|
|
175
|
+
delete formLayout.formStyleEncodes;
|
|
176
|
+
if (!formLayout.formId)
|
|
177
|
+
formLayout.formId = formId;
|
|
178
|
+
const res = await client.post(`${baseUrl}/api/ebuilder/form/builder/saveFormAndLayout`, {
|
|
179
|
+
module: 'ebuilderform', customParam: {},
|
|
180
|
+
designerParam: { onlyLayout: false, convert: false },
|
|
181
|
+
form: JSON.parse(JSON.stringify(snapshot.form || {})), formLayout,
|
|
182
|
+
}, ebb);
|
|
183
|
+
if (res?.code !== 200 || !res?.status) {
|
|
184
|
+
throw new Error(`保存布局失败: ${res?.msg || JSON.stringify(res).slice(0, 300) || '未知错误'}`);
|
|
185
|
+
}
|
|
186
|
+
return result;
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* 在布局里找某字段的值组件(跳过标签组件)。
|
|
190
|
+
*
|
|
191
|
+
* 认 **`config.associatedId`**,不是 `config.fieldId` —— 标签的 `config.fieldId` 是布局
|
|
192
|
+
* 自己另生成的,与字段定义没有对应关系(详见 `form-layout-comp-mapping` 那份结论)。
|
|
193
|
+
*/
|
|
194
|
+
export function findValueComp(comps, fieldId) {
|
|
195
|
+
return comps.find((c) => c.type !== LABEL_TYPE && String(c.config?.associatedId) === String(fieldId)) || null;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* 给某字段的布局层属性打补丁(读 → 改 → 存一次完成)。
|
|
199
|
+
*
|
|
200
|
+
* `required` / `readOnly` / `display` / `singleRow` 这些**只存在于布局 comp 里**,
|
|
201
|
+
* 字段记录里没有对应的键(`getFormFieldPage` 的 53 个字段记录里都没有 `required`)。
|
|
202
|
+
* 所以「改字段属性」时只写字段记录等于什么都没做 —— 接口回 200、命令报成功、行为不变。
|
|
203
|
+
*/
|
|
204
|
+
export async function patchFieldLayout(client, baseUrl, formId, fieldId, patch) {
|
|
205
|
+
return mutateLayout(client, baseUrl, formId, (pageLayouts) => {
|
|
206
|
+
let updated = 0;
|
|
207
|
+
for (const page of pageLayouts) {
|
|
208
|
+
const comp = findValueComp(page.comps || [], fieldId);
|
|
209
|
+
if (!comp)
|
|
210
|
+
continue;
|
|
211
|
+
Object.assign(comp.config, patch);
|
|
212
|
+
updated++;
|
|
213
|
+
}
|
|
214
|
+
return { updated };
|
|
215
|
+
});
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* 造 comp 对 → 插进去 → 存回。**不碰 initLayout**。
|
|
219
|
+
*
|
|
220
|
+
* 读快照与存回的约束见 `mutateLayout`(乐观锁、`formLayout.formId`、派生字段)。
|
|
221
|
+
* comp 对必须在回调里当场构造 —— 位置依赖刚刚读到的 comps,不能拿旧快照算。
|
|
222
|
+
*/
|
|
223
|
+
export async function insertFieldIntoLayout(client, baseUrl, formId, input) {
|
|
224
|
+
return mutateLayout(client, baseUrl, formId, (pageLayouts) => {
|
|
225
|
+
const built = buildCompPair({ ...input, comps: pageLayouts[0].comps || [] });
|
|
226
|
+
if (!built.ok)
|
|
227
|
+
throw new Error(built.error);
|
|
228
|
+
for (const comp of [built.label, built.value]) {
|
|
229
|
+
for (const [k, v] of Object.entries(input.overrides || {})) {
|
|
230
|
+
if (v !== undefined)
|
|
231
|
+
comp.config[k] = v;
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
pageLayouts[0].comps.push(built.label, built.value);
|
|
235
|
+
return {
|
|
236
|
+
row: Number(built.value.config?.excel?.row) || 0,
|
|
237
|
+
col: Number(built.value.config?.excel?.col) || 1,
|
|
238
|
+
labelCompId: built.label.id,
|
|
239
|
+
valueCompId: built.value.id,
|
|
240
|
+
warnings: [],
|
|
241
|
+
};
|
|
242
|
+
});
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=form-layout-insert.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-layout-insert.js","sourceRoot":"","sources":["../../src/services/form-layout-insert.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,159 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 显隐联动的**条件**构造。
|
|
3
|
+
*
|
|
4
|
+
* ## 「为空」为什么要有这一层
|
|
5
|
+
*
|
|
6
|
+
* 2024 那版代码把条件算子直接原样塞进 `detailSymbol`,于是「为空」被写成了 `EMPTY`。
|
|
7
|
+
* 平台**不认这个码**:它不会回一句「算子不合法」,而是在写库时抛
|
|
8
|
+
* `mybatis PersistenceException / Error updating database` —— 一句和条件毫无关系的报错,
|
|
9
|
+
* 排查时很容易被带到别的地方去(实际发生过:被误判成「目标字段 dataKey 为空触发 NOT NULL」,
|
|
10
|
+
* 而把 dataKey 填上并不解决问题)。
|
|
11
|
+
*
|
|
12
|
+
* 平台认的是 **`NULL` / `NOT_NULL`**,而且这类**没有右值的算子不能带 `sourceContent`** ——
|
|
13
|
+
* 带上也不报错,只是照样写不进去。这两点都是从设计器实际发出的报文中比对出来的。
|
|
14
|
+
*/
|
|
15
|
+
import type { ApiClient } from '../core/client.js';
|
|
16
|
+
/** 平台认的条件算子。`NULL`/`NOT_NULL` 即「为空」/「不为空」。 */
|
|
17
|
+
export declare const KNOWN_OPERATORS: string[];
|
|
18
|
+
/** 归一算子码;未知的原样返回(交给平台判,但调用方应当据此告警)。 */
|
|
19
|
+
export declare function normalizeOperator(operator: string | undefined): string;
|
|
20
|
+
/** 该算子是否需要比较值。 */
|
|
21
|
+
export declare function operatorTakesValue(code: string): boolean;
|
|
22
|
+
export interface ConditionInput {
|
|
23
|
+
/** 触发字段 fieldId。 */
|
|
24
|
+
fieldId: string;
|
|
25
|
+
operator?: string;
|
|
26
|
+
/** 普通字段的比较值。 */
|
|
27
|
+
value?: unknown;
|
|
28
|
+
/** Select 类字段的选项:[{optionId, content}]。 */
|
|
29
|
+
options?: unknown[];
|
|
30
|
+
}
|
|
31
|
+
/** 平台 `condition.conditionDetails` 的一条。 */
|
|
32
|
+
export interface ConditionDetail {
|
|
33
|
+
targetId: string;
|
|
34
|
+
detailSymbol: string;
|
|
35
|
+
sourceType: string;
|
|
36
|
+
sourceContent?: string;
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* 造一条 `conditionDetails`。**纯函数**。
|
|
40
|
+
*
|
|
41
|
+
* 为空/不为空**不带 `sourceContent`**;其余算子一定带(值缺省写空串而不是省略键 ——
|
|
42
|
+
* 省略键会让平台在写库时缺列)。
|
|
43
|
+
*/
|
|
44
|
+
export declare function buildConditionDetail(cond: ConditionInput): {
|
|
45
|
+
detail: ConditionDetail;
|
|
46
|
+
warnings: string[];
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* 生效维度(`fdEffect`)。
|
|
50
|
+
*
|
|
51
|
+
* 设计器提供的维度与它们的取值来源(都是从设计器实际发出的报文里对出来的):
|
|
52
|
+
*
|
|
53
|
+
* | 维度 | effectType | effectName | optionList[0].effectValue | optionList[0].effectName |
|
|
54
|
+
* |---|---|---|---|---|
|
|
55
|
+
* | 当前表单 | `form` | `当前表单` | 表单 formId | `当前表单` |
|
|
56
|
+
* | 表单布局 | `formLayout` | `表单布局` | **`multipleLayoutId`** | 表单名 |
|
|
57
|
+
*
|
|
58
|
+
* ⚠ 注意 `optionList[0]` 里**没有 `effectType`** —— 设计器发 `add` 时就两三个键,
|
|
59
|
+
* 多塞键是否被忽略没验证过,照抄最小形状最稳。
|
|
60
|
+
*
|
|
61
|
+
* ⚠ 这是 **eb 表**那条路由的取值。**工作流表单那条路由**(`wf-form linkage`)的维度**不一样**:
|
|
62
|
+
* 它提供「当前表单 / 表单布局 / 当前工作流 / 选择节点」,后两个的 `effectType` 是
|
|
63
|
+
* `workFlow` / `includeNode`,取值分别是 **workflowId / nodeId**,且那条路由的 `refId`
|
|
64
|
+
* **始终是 workflowId**(见 `wf-form.ts` 里那段)。
|
|
65
|
+
*/
|
|
66
|
+
export interface LinkageEffect {
|
|
67
|
+
effectType: string;
|
|
68
|
+
effectName: string;
|
|
69
|
+
effectValue: string;
|
|
70
|
+
/** 选项显示名。不给就用 `effectName`(「当前表单」两个位置同名,布局维度则用表单名)。 */
|
|
71
|
+
optionName?: string;
|
|
72
|
+
}
|
|
73
|
+
/** 多条件之间的关系。界面上的「任一」= `OR`、「全部」= `AND`。 */
|
|
74
|
+
export declare const DETAIL_TYPES: string[];
|
|
75
|
+
export interface LinkageAddPayloadInput {
|
|
76
|
+
appId: string;
|
|
77
|
+
objId: string;
|
|
78
|
+
formId: string;
|
|
79
|
+
formName: string;
|
|
80
|
+
name: string;
|
|
81
|
+
conditions: ConditionInput[];
|
|
82
|
+
/**
|
|
83
|
+
* 多条件之间的关系(`AND` = 全部满足 / `OR` = 任一满足)。
|
|
84
|
+
*
|
|
85
|
+
* **不给就不带这个键**,由平台取自己的默认值 —— 设计器发 `add` 时总会带,
|
|
86
|
+
* 所以「缺省时平台按什么算」我们没有依据,不替平台决定。
|
|
87
|
+
*/
|
|
88
|
+
detailType?: string;
|
|
89
|
+
actions: Array<{
|
|
90
|
+
prop: string;
|
|
91
|
+
fields: Array<Record<string, any>>;
|
|
92
|
+
}>;
|
|
93
|
+
/** 生效维度。缺省「当前表单」。 */
|
|
94
|
+
effect?: LinkageEffect;
|
|
95
|
+
}
|
|
96
|
+
/** 拼 `viewlinkage/add` 的报文。**纯函数**,便于对照设计器实际发出的形状。 */
|
|
97
|
+
export declare function buildLinkageAddPayload(input: LinkageAddPayloadInput): {
|
|
98
|
+
payload: any;
|
|
99
|
+
warnings: string[];
|
|
100
|
+
};
|
|
101
|
+
/**
|
|
102
|
+
* 把 `config.effect` 的写法解析成完整的生效维度。三种写法:
|
|
103
|
+
*
|
|
104
|
+
* - **不给** → 当前表单(最常见)
|
|
105
|
+
* - **`"formLayout"`** → 「表单布局」维度,布局 id 现查;⚠ 取的是 **`multipleLayoutId`**,
|
|
106
|
+
* 不是 `formLayout.id`(同一张表上这两个值相邻但不同,发错不报错、只是指向别的布局)
|
|
107
|
+
* - **对象** → 原样使用,只补缺省
|
|
108
|
+
*/
|
|
109
|
+
export declare function resolveEffect(client: ApiClient, baseUrl: string, formId: string, formName: string, effect?: string | Partial<LinkageEffect>): Promise<LinkageEffect>;
|
|
110
|
+
/**
|
|
111
|
+
* 「当前工作流」维度的选项显示名:**流程名 + `【V{活动版本号}】`**。
|
|
112
|
+
*
|
|
113
|
+
* 这不是拼着好看的 —— 设计器发的就是这个形状(流程叫 `11111`、报文里是 `11111【V1】`),
|
|
114
|
+
* 版本号取自流程的活动版本。取不到版本号时退回纯流程名,不编一个版本上去。
|
|
115
|
+
*/
|
|
116
|
+
export declare function workflowEffectName(name: string, activeVersionId: number | string | undefined): string;
|
|
117
|
+
/** 从 `quickBuild/getAllVersionInfo` 的返回里挑出活动版本的 versionId。 */
|
|
118
|
+
export declare function activeVersionIdOf(versionRows: any[] | undefined): string;
|
|
119
|
+
/**
|
|
120
|
+
* **流程表单那条路由**的生效维度(四种)。从 `wf-form linkage` 的 action 里搬出来的 ——
|
|
121
|
+
* 函数联动同样要这四种,别再内联第二份。
|
|
122
|
+
*
|
|
123
|
+
* | 维度 | effectType | 取值 | 选项名 |
|
|
124
|
+
* |---|---|---|---|
|
|
125
|
+
* | 当前表单(缺省) | `form` | formId | `当前表单` |
|
|
126
|
+
* | 表单布局 | `formLayout` | `formLayoutMultiple.id` | 布局名 |
|
|
127
|
+
* | 当前工作流 | `workFlow` | workflowId | `流程名【V活动版本号】` |
|
|
128
|
+
* | 选择节点 | `includeNode` | nodeId | 节点名 |
|
|
129
|
+
*
|
|
130
|
+
* ⚠ 返回的 `refId` 是**这条联动挂在谁身上**,在这条路由上就是**流程 ID**;它**不等于**
|
|
131
|
+
* `optionList[0].effectValue` —— 选「选择节点」时取值是节点 ID,`refId` 仍是流程 ID。别照着取值抄。
|
|
132
|
+
*/
|
|
133
|
+
export declare function resolveWorkflowEffect(client: ApiClient, baseUrl: string, ctx: {
|
|
134
|
+
/** 这条路由的 module 与主前缀,由调用方传(`wf-form` 用的是 `workflow` / `/api/workflow/core/form`)。 */
|
|
135
|
+
module: string;
|
|
136
|
+
route: string;
|
|
137
|
+
formId: string;
|
|
138
|
+
/** `form` / `formLayout` / `workFlow` / `includeNode`,也认中文。不给 = 当前表单。 */
|
|
139
|
+
dimension?: string;
|
|
140
|
+
/** 流程 ID。`workFlow` / `includeNode` 必给;也是 `refId`。不给时 `refId` 退回 formId。 */
|
|
141
|
+
workflowId?: string;
|
|
142
|
+
/** `includeNode`:节点 id 或节点名。 */
|
|
143
|
+
nodeKey?: string;
|
|
144
|
+
/** `formLayout`:指定布局,不传取默认布局。 */
|
|
145
|
+
layoutId?: string;
|
|
146
|
+
}): Promise<{
|
|
147
|
+
effect: LinkageEffect;
|
|
148
|
+
refId: string;
|
|
149
|
+
}>;
|
|
150
|
+
/**
|
|
151
|
+
* 读 `--config`:`@` 开头当文件路径(UTF-8),否则当内联 JSON。
|
|
152
|
+
*
|
|
153
|
+
* 两个联动命令(eb 表 `form linkage add` 与工作流 `wf-form linkage`)共用 ——
|
|
154
|
+
* 前者支持 `@文件` 而后者不支持过,同一个 `--config` 两种行为,用起来会莫名其妙。
|
|
155
|
+
*/
|
|
156
|
+
export declare function readLinkageConfig(input: string): any;
|
|
157
|
+
/** 提交 `viewlinkage/add`。 */
|
|
158
|
+
export declare function addLinkage(client: ApiClient, baseUrl: string, appId: string, formId: string, payload: any): Promise<any>;
|
|
159
|
+
//# sourceMappingURL=form-linkage-condition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"form-linkage-condition.d.ts","sourceRoot":"","sources":["../../src/services/form-linkage-condition.ts"],"names":[],"mappings":"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"}
|