weaver-e10-builder 1.5.2 → 1.5.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 (197) hide show
  1. package/assets/org-employee-template.xlsx +0 -0
  2. package/dist/commands/form-add-detail-table.js +3 -3
  3. package/dist/commands/form-add-detail-table.js.map +1 -1
  4. package/dist/commands/form-add-physical-field.d.ts.map +1 -1
  5. package/dist/commands/form-add-physical-field.js +3 -2
  6. package/dist/commands/form-add-physical-field.js.map +1 -1
  7. package/dist/commands/form-data.d.ts.map +1 -1
  8. package/dist/commands/form-data.js +125 -0
  9. package/dist/commands/form-data.js.map +1 -1
  10. package/dist/commands/form-ebuilder-columns.d.ts.map +1 -1
  11. package/dist/commands/form-ebuilder-columns.js +3 -3
  12. package/dist/commands/form-ebuilder-columns.js.map +1 -1
  13. package/dist/commands/form-ebuilder-scope.d.ts.map +1 -1
  14. package/dist/commands/form-ebuilder-scope.js +3 -4
  15. package/dist/commands/form-ebuilder-scope.js.map +1 -1
  16. package/dist/commands/form-field-lang.d.ts.map +1 -1
  17. package/dist/commands/form-field-lang.js +3 -4
  18. package/dist/commands/form-field-lang.js.map +1 -1
  19. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  20. package/dist/commands/form-field-linkage.js +4 -3
  21. package/dist/commands/form-field-linkage.js.map +1 -1
  22. package/dist/commands/form-formula-linkage.d.ts.map +1 -1
  23. package/dist/commands/form-formula-linkage.js +4 -2
  24. package/dist/commands/form-formula-linkage.js.map +1 -1
  25. package/dist/commands/form-formula.d.ts.map +1 -1
  26. package/dist/commands/form-formula.js +5 -5
  27. package/dist/commands/form-formula.js.map +1 -1
  28. package/dist/commands/form-layout.d.ts.map +1 -1
  29. package/dist/commands/form-layout.js +6 -0
  30. package/dist/commands/form-layout.js.map +1 -1
  31. package/dist/commands/form-list-click.d.ts.map +1 -1
  32. package/dist/commands/form-list-click.js +3 -2
  33. package/dist/commands/form-list-click.js.map +1 -1
  34. package/dist/commands/form-physical-table.js +3 -3
  35. package/dist/commands/form-physical-table.js.map +1 -1
  36. package/dist/commands/form-relate.d.ts.map +1 -1
  37. package/dist/commands/form-relate.js +3 -2
  38. package/dist/commands/form-relate.js.map +1 -1
  39. package/dist/commands/form-validate.d.ts.map +1 -1
  40. package/dist/commands/form-validate.js +3 -3
  41. package/dist/commands/form-validate.js.map +1 -1
  42. package/dist/commands/form-view.d.ts.map +1 -1
  43. package/dist/commands/form-view.js +2 -0
  44. package/dist/commands/form-view.js.map +1 -1
  45. package/dist/commands/form.d.ts +9 -3
  46. package/dist/commands/form.d.ts.map +1 -1
  47. package/dist/commands/form.js +116 -160
  48. package/dist/commands/form.js.map +1 -1
  49. package/dist/commands/menu-permission.d.ts.map +1 -1
  50. package/dist/commands/menu-permission.js +5 -2
  51. package/dist/commands/menu-permission.js.map +1 -1
  52. package/dist/commands/report.d.ts +9 -0
  53. package/dist/commands/report.d.ts.map +1 -1
  54. package/dist/commands/report.js +18 -2
  55. package/dist/commands/report.js.map +1 -1
  56. package/dist/commands/special.d.ts +24 -0
  57. package/dist/commands/special.d.ts.map +1 -0
  58. package/dist/commands/special.js +487 -0
  59. package/dist/commands/special.js.map +1 -0
  60. package/dist/commands/wf-form.d.ts.map +1 -1
  61. package/dist/commands/wf-form.js +4 -4
  62. package/dist/commands/wf-form.js.map +1 -1
  63. package/dist/commands/workflow-message.d.ts.map +1 -1
  64. package/dist/commands/workflow-message.js +1 -2
  65. package/dist/commands/workflow-message.js.map +1 -1
  66. package/dist/index.js +24 -0
  67. package/dist/index.js.map +1 -1
  68. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  69. package/dist/services/actionflow/components/action_eb_update_compiler.js +54 -12
  70. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  71. package/dist/services/actionflow/components/index.d.ts.map +1 -1
  72. package/dist/services/actionflow/components/index.js +6 -0
  73. package/dist/services/actionflow/components/index.js.map +1 -1
  74. package/dist/services/actionflow/components/multiple_execution.d.ts.map +1 -1
  75. package/dist/services/actionflow/components/multiple_execution.js +73 -13
  76. package/dist/services/actionflow/components/multiple_execution.js.map +1 -1
  77. package/dist/services/actionflow/components/output.d.ts.map +1 -1
  78. package/dist/services/actionflow/components/output.js +144 -5
  79. package/dist/services/actionflow/components/output.js.map +1 -1
  80. package/dist/services/actionflow/components/send_message.d.ts.map +1 -1
  81. package/dist/services/actionflow/components/send_message.js +60 -32
  82. package/dist/services/actionflow/components/send_message.js.map +1 -1
  83. package/dist/services/actionflow/components/serverless_action.d.ts +5 -0
  84. package/dist/services/actionflow/components/serverless_action.d.ts.map +1 -0
  85. package/dist/services/actionflow/components/serverless_action.js +134 -0
  86. package/dist/services/actionflow/components/serverless_action.js.map +1 -0
  87. package/dist/services/actionflow/components/webhook_trigger.d.ts +5 -0
  88. package/dist/services/actionflow/components/webhook_trigger.d.ts.map +1 -0
  89. package/dist/services/actionflow/components/webhook_trigger.js +85 -0
  90. package/dist/services/actionflow/components/webhook_trigger.js.map +1 -0
  91. package/dist/services/actionflow/context_preflight.d.ts +6 -0
  92. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  93. package/dist/services/actionflow/context_preflight.js +247 -7
  94. package/dist/services/actionflow/context_preflight.js.map +1 -1
  95. package/dist/services/actionflow/context_provider.d.ts.map +1 -1
  96. package/dist/services/actionflow/context_provider.js +67 -3
  97. package/dist/services/actionflow/context_provider.js.map +1 -1
  98. package/dist/services/actionflow/custom_trigger_context.d.ts.map +1 -1
  99. package/dist/services/actionflow/custom_trigger_context.js +9 -2
  100. package/dist/services/actionflow/custom_trigger_context.js.map +1 -1
  101. package/dist/services/actionflow/formula_service.d.ts +2 -0
  102. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  103. package/dist/services/actionflow/formula_service.js +381 -63
  104. package/dist/services/actionflow/formula_service.js.map +1 -1
  105. package/dist/services/actionflow/generation_service.d.ts.map +1 -1
  106. package/dist/services/actionflow/generation_service.js +9 -0
  107. package/dist/services/actionflow/generation_service.js.map +1 -1
  108. package/dist/services/actionflow/param_group_dto.d.ts +5 -0
  109. package/dist/services/actionflow/param_group_dto.d.ts.map +1 -0
  110. package/dist/services/actionflow/param_group_dto.js +181 -0
  111. package/dist/services/actionflow/param_group_dto.js.map +1 -0
  112. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  113. package/dist/services/actionflow/preflight_service.js +53 -11
  114. package/dist/services/actionflow/preflight_service.js.map +1 -1
  115. package/dist/services/actionflow/readback_verifier.d.ts.map +1 -1
  116. package/dist/services/actionflow/readback_verifier.js +14 -1
  117. package/dist/services/actionflow/readback_verifier.js.map +1 -1
  118. package/dist/services/actionflow/update_service.d.ts.map +1 -1
  119. package/dist/services/actionflow/update_service.js +14 -8
  120. package/dist/services/actionflow/update_service.js.map +1 -1
  121. package/dist/services/actionflow/webhook_source.d.ts +4 -0
  122. package/dist/services/actionflow/webhook_source.d.ts.map +1 -0
  123. package/dist/services/actionflow/webhook_source.js +99 -0
  124. package/dist/services/actionflow/webhook_source.js.map +1 -0
  125. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  126. package/dist/services/actionflow/workflow_compiler.js +1 -0
  127. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  128. package/dist/services/form-create.d.ts +45 -2
  129. package/dist/services/form-create.d.ts.map +1 -1
  130. package/dist/services/form-create.js +78 -8
  131. package/dist/services/form-create.js.map +1 -1
  132. package/dist/services/form-data-openapi.d.ts +142 -0
  133. package/dist/services/form-data-openapi.d.ts.map +1 -0
  134. package/dist/services/form-data-openapi.js +363 -0
  135. package/dist/services/form-data-openapi.js.map +1 -0
  136. package/dist/services/form-field-build.d.ts.map +1 -1
  137. package/dist/services/form-field-build.js +4 -4
  138. package/dist/services/form-field-build.js.map +1 -1
  139. package/dist/services/form-field-template.d.ts +71 -0
  140. package/dist/services/form-field-template.d.ts.map +1 -0
  141. package/dist/services/form-field-template.js +103 -0
  142. package/dist/services/form-field-template.js.map +1 -0
  143. package/dist/services/form-field-validate.d.ts +26 -0
  144. package/dist/services/form-field-validate.d.ts.map +1 -0
  145. package/dist/services/form-field-validate.js +121 -0
  146. package/dist/services/form-field-validate.js.map +1 -0
  147. package/dist/services/form-id.d.ts +50 -0
  148. package/dist/services/form-id.d.ts.map +1 -0
  149. package/dist/services/form-id.js +110 -0
  150. package/dist/services/form-id.js.map +1 -0
  151. package/dist/services/form-layout-grid.d.ts +123 -0
  152. package/dist/services/form-layout-grid.d.ts.map +1 -0
  153. package/dist/services/form-layout-grid.js +177 -0
  154. package/dist/services/form-layout-grid.js.map +1 -0
  155. package/dist/services/form-layout-insert.d.ts +24 -1
  156. package/dist/services/form-layout-insert.d.ts.map +1 -1
  157. package/dist/services/form-layout-insert.js +192 -27
  158. package/dist/services/form-layout-insert.js.map +1 -1
  159. package/dist/services/form-physical-table.d.ts +1 -1
  160. package/dist/services/form-physical-table.js +1 -1
  161. package/dist/services/form-table-view.d.ts.map +1 -1
  162. package/dist/services/form-table-view.js +2 -11
  163. package/dist/services/form-table-view.js.map +1 -1
  164. package/dist/services/form-view.d.ts +2 -0
  165. package/dist/services/form-view.d.ts.map +1 -1
  166. package/dist/services/form-view.js +57 -7
  167. package/dist/services/form-view.js.map +1 -1
  168. package/dist/services/form-virtual.d.ts.map +1 -1
  169. package/dist/services/form-virtual.js +6 -1
  170. package/dist/services/form-virtual.js.map +1 -1
  171. package/dist/services/special-page.d.ts +85 -0
  172. package/dist/services/special-page.d.ts.map +1 -0
  173. package/dist/services/special-page.js +129 -0
  174. package/dist/services/special-page.js.map +1 -0
  175. package/dist/services/special-route.d.ts +92 -0
  176. package/dist/services/special-route.d.ts.map +1 -0
  177. package/dist/services/special-route.js +93 -0
  178. package/dist/services/special-route.js.map +1 -0
  179. package/dist/services/workflow-node-layout.d.ts +13 -1
  180. package/dist/services/workflow-node-layout.d.ts.map +1 -1
  181. package/dist/services/workflow-node-layout.js +11 -3
  182. package/dist/services/workflow-node-layout.js.map +1 -1
  183. package/package.json +1 -1
  184. package/skill-docs/SKILL.md +5 -5
  185. package/skill-docs/actionflows/SKILL.md +5 -4
  186. package/skill-docs/actionflows/references/components/logic/MultipleExecution.md +38 -38
  187. package/skill-docs/actionflows/references/components/logic/Output.md +9 -2
  188. package/skill-docs/actionflows/references/components/message/SendMessage.md +3 -3
  189. package/skill-docs/actionflows/references/components/serverless/ServerlessAction.md +42 -0
  190. package/skill-docs/actionflows/references/components/trigger/WebHookTrigger.md +89 -0
  191. package/skill-docs/actionflows/references/dynamic_capability_matrix.md +2 -2
  192. package/skill-docs/references/common/ref-cli-commands.md +3 -1
  193. package/skill-docs/references/form/guide-form-data.md +30 -0
  194. package/skill-docs/references/form/guide-form-layout-incremental.md +18 -3
  195. package/skill-docs/references/form/guide-form-physical-table.md +1 -1
  196. package/skill-docs/references/form/ref-form-fields.md +1 -1
  197. package/skill-docs/references/hrm/guide-org-employee.md +32 -1
@@ -0,0 +1,103 @@
1
+ /**
2
+ * **按字段取组件模板** —— 布局增量插入在「本表还没有这个类型」时的模板来源。
3
+ *
4
+ * ## 这条路解决的是什么
5
+ *
6
+ * `form-layout-insert` 的增量插入是**照现成的同类型 comp 克隆**的(布局层专有键 + 各类型
7
+ * 自己的键集,按类型名拼只能猜)。于是一张表里**第一次**加某个类型时会中止:
8
+ * 「本表还没有『Switch』类型的字段,没有可参照的组件模板」。
9
+ *
10
+ * 平台其实有现成的模板,只是不在布局里 —— 在 `getFormFieldExist` 的返回里。
11
+ *
12
+ * ## `getFormFieldExist` 给什么
13
+ *
14
+ * `POST /api/ebuilder/form/form/builder/getFormFieldExist`(body 里的 `formField.title` 传空串即
15
+ * 「本表单全部字段」)按分类返回字段的**面板形态**:
16
+ *
17
+ * ```
18
+ * { id: <fieldId>, name, higherLevelId, leftSideType: 'used', applyStyle, category, icon,
19
+ * configPC: '[{ styleCategoryCompKey, package, prop, applyStyle, styleCategoryPackage,
20
+ * type, config: { …该字段的完整配置… } }]' }
21
+ * ```
22
+ *
23
+ * `configPC[0]` 就是**平台按该字段定义生成的组件模板**:顶层键(按类型的样式键)与 config
24
+ * (含类型专有键)都给全了。拿一根 Switch 实测对照平台自己 `initLayout` 产出的 comp:
25
+ *
26
+ * | 键 | 平台 comp | 字段记录 | **configPC** |
27
+ * |---|---|---|---|
28
+ * | `switchType` | `"switch"` | `"switch"` | `"switch"` |
29
+ * | `childName` / `parentName` | `""` | **无** | `""` |
30
+ * | `hasChild` | `false` | **无** | `false` |
31
+ * | `options` | `[]` | **无** | `[]` |
32
+ * | `typeLen` | `1` | **无** | `1` |
33
+ *
34
+ * ⚠ **字段记录(`getFormFieldPage`)不够** —— 它缺 `childName`/`parentName`/`hasChild`/`options`/
35
+ * `typeLen` 这类**只存在于组件侧的默认值**。所以模板必须从这个接口拿,不能靠字段记录拼。
36
+ *
37
+ * ## 覆盖范围(实测)
38
+ *
39
+ * - ✅ **主表字段**:新建的字段立刻就在返回里(`leftSideType: 'used'`),**本表从没有过的类型也有**。
40
+ * - ❌ **明细表字段**:拿不到 —— 分类「明细表」恒为空,试过 `subFormId` / `higherLevelId` /
41
+ * `formTableId` / `ebbusinessid` 换成子表 id 等 8 种参数,一律不返回。
42
+ * **但 configPC 是「按类型」而不是「按作用域」的**(`config.flow` 是空对象、没有 `excel`),
43
+ * 所以明细表要新类型时,可以借**主表**同类型字段的那一份,作用域由调用方自己写。
44
+ */
45
+ const PATH = '/api/ebuilder/form/form/builder/getFormFieldExist';
46
+ /**
47
+ * 取本表单**主表**字段的组件模板,按 `fieldId` 索引。
48
+ *
49
+ * 明细表字段不在返回里(见模块头),所以这张表只覆盖主表。
50
+ * 调用方要明细表的模板时,用 `componentKey` 去这张表里找同类型的主表字段。
51
+ */
52
+ export async function fetchFieldTypeTemplates(client, baseUrl, appId, formId) {
53
+ const res = await client.post(`${baseUrl}${PATH}?apid=${encodeURIComponent(appId)}`, {
54
+ module: 'ebuilderform',
55
+ appId,
56
+ customParam: { terminal: '', objId: formId },
57
+ formField: { formId, title: '' },
58
+ }, { ebbusinessid: formId });
59
+ const out = new Map();
60
+ if (res?.code !== 200 || !res?.status)
61
+ return out;
62
+ for (const cat of res?.data || []) {
63
+ for (const entry of cat?.comps || []) {
64
+ const comps = parseConfigPC(entry?.configPC);
65
+ const comp = comps[0];
66
+ if (!comp || !entry?.id)
67
+ continue;
68
+ out.set(String(entry.id), { fieldId: String(entry.id), comp, type: String(comp.type || '') });
69
+ }
70
+ }
71
+ return out;
72
+ }
73
+ /** `configPC` 是**JSON 字符串**(设计器那边存的形态),解析失败当没有。 */
74
+ export function parseConfigPC(raw) {
75
+ if (Array.isArray(raw))
76
+ return raw;
77
+ if (typeof raw !== 'string' || !raw.trim())
78
+ return [];
79
+ try {
80
+ const parsed = JSON.parse(raw);
81
+ return Array.isArray(parsed) ? parsed : [];
82
+ }
83
+ catch {
84
+ return [];
85
+ }
86
+ }
87
+ /**
88
+ * 在模板表里找一个**指定类型**的模板(`fieldId` 命中不了时用)。
89
+ *
90
+ * 给明细表字段用:明细表自己那份拿不到,就借主表同类型的。`preferType` 是
91
+ * `componentKey`(如 `Switch` / `NumberComponent`),对不上 `type` 时再比一次 `type`。
92
+ */
93
+ export function findTemplateByType(templates, want) {
94
+ const target = String(want);
95
+ for (const entry of templates.values()) {
96
+ if (entry.type === target)
97
+ return entry;
98
+ if (String(entry.comp?.config?.componentKey ?? '') === target)
99
+ return entry;
100
+ }
101
+ return null;
102
+ }
103
+ //# sourceMappingURL=form-field-template.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-field-template.js","sourceRoot":"","sources":["../../src/services/form-field-template.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AAWH,MAAM,IAAI,GAAG,mDAAmD,CAAC;AAEjE;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,uBAAuB,CAC3C,MAA0E,EAC1E,OAAe,EACf,KAAa,EACb,MAAc;IAEd,MAAM,GAAG,GAAG,MAAM,MAAM,CAAC,IAAI,CAC3B,GAAG,OAAO,GAAG,IAAI,SAAS,kBAAkB,CAAC,KAAK,CAAC,EAAE,EACrD;QACE,MAAM,EAAE,cAAc;QACtB,KAAK;QACL,WAAW,EAAE,EAAE,QAAQ,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE;QAC5C,SAAS,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,EAAE,EAAE;KACjC,EACD,EAAE,YAAY,EAAE,MAAM,EAAE,CACzB,CAAC;IACF,MAAM,GAAG,GAAG,IAAI,GAAG,EAA8B,CAAC;IAClD,IAAI,GAAG,EAAE,IAAI,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,MAAM;QAAE,OAAO,GAAG,CAAC;IAElD,KAAK,MAAM,GAAG,IAAI,GAAG,EAAE,IAAI,IAAI,EAAE,EAAE,CAAC;QAClC,KAAK,MAAM,KAAK,IAAI,GAAG,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;YACrC,MAAM,KAAK,GAAG,aAAa,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC;YACtB,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,EAAE;gBAAE,SAAS;YAClC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;QAChG,CAAC;IACH,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,mDAAmD;AACnD,MAAM,UAAU,aAAa,CAAC,GAAY;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC;IACnC,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAC;IACtD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAA0C,EAC1C,IAAY;IAEZ,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC;IAC5B,KAAK,MAAM,KAAK,IAAI,SAAS,CAAC,MAAM,EAAE,EAAE,CAAC;QACvC,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;QACxC,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,YAAY,IAAI,EAAE,CAAC,KAAK,MAAM;YAAE,OAAO,KAAK,CAAC;IAC9E,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC"}
@@ -0,0 +1,26 @@
1
+ export declare function canonComponentKey(ck: string): string;
2
+ /** 可用的字段类型 = 基础组件(CK_CANON 的值)∪ 富组件(RICH_TYPE_MAP 的键)∪ 上述补充。
3
+ * 导出仅为让测试能盯住"平台支持的合法类型不许漏登记"(漏了会被 assertFieldType 误杀)。 */
4
+ export declare const FIELD_TYPE_CHOICES: string[];
5
+ /**
6
+ * 校验字段类型名。不校验的话错类型会**直送服务器**,换回一段
7
+ * `Cannot invoke "ComponentType.name()" because ... getComponentKey() is null`——
8
+ * 既看不出哪错了,也看不出该填什么。这里先拦下来并列出可选值。
9
+ */
10
+ export declare function assertFieldType(fieldType: string, where?: string): void;
11
+ /**
12
+ * 校验选项定义。**键名必须是 `name` / `valueKey`**——写成 `{value,label}` 这类
13
+ * 不会被拦下,而是静默存成「没有名字的选项」(平台侧 fieldOptionName 为空),
14
+ * 之后 `form data add` 按选项名写数据会直接失效,且读回也看不出哪里错了。
15
+ */
16
+ export declare function assertFieldOptions(fieldName: string, options: any[]): void;
17
+ /**
18
+ * 把用户写的字段定义归一成平台认的形状:
19
+ * - `fieldType` → `componentKey`(两个名字都收)
20
+ * - componentKey 大小写归一
21
+ * - `options`(字符串数组简写)→ `fieldOptions: [{name}]`
22
+ *
23
+ * 顶层字段与明细子字段共用本函数,避免两边校验不一致。
24
+ */
25
+ export declare function normalizeFieldDef(raw: any): any;
26
+ //# sourceMappingURL=form-field-validate.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-field-validate.d.ts","sourceRoot":"","sources":["../../src/services/form-field-validate.ts"],"names":[],"mappings":"AA2BA,wBAAgB,iBAAiB,CAAC,EAAE,EAAE,MAAM,GAAG,MAAM,CAEpD;AAmBD;0DAC0D;AAC1D,eAAO,MAAM,kBAAkB,EAAE,MAAM,EAI7B,CAAC;AAEX;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,IAAI,CAKnE;AAED;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,EAAE,GAAG,IAAI,CAgB1E;AAED;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,GAAG,GAAG,GAAG,CAsB/C"}
@@ -0,0 +1,121 @@
1
+ import { RICH_TYPE_MAP } from './rich-types.js';
2
+ /**
3
+ * 字段定义的**归一化与校验**(建表 / 加字段入口共用)。
4
+ *
5
+ * 原先内联在 `commands/form.ts` 的建表 action 里。抽出来是为了让
6
+ * **「标准建表」与「专项建表」两个入口共用同一份** —— 多一个入口就多一处真相,
7
+ * 两边的类型归一或选项校验一旦分叉,问题会以「为什么这张表建出来的字段不对」的形式出现。
8
+ *
9
+ * 注:校验失败走 `process.exit(1)`(与原实现一致)—— 这是命令层的既有约定,
10
+ * 搬移时**刻意不改**,避免改变任何调用方的行为。
11
+ */
12
+ /**
13
+ * componentKey 大小写归一:用户/示例常写 "Textarea"/"Ebuilder" 等小写变体,但代码各处
14
+ * `=== 'TextArea'`、storageFieldType 按 canonical 大小写匹配。不归一会导致 type 存成小写
15
+ * "Textarea"(FLOW 渲染器按 type 查组件查不到 → 多行文本在流式布局下渲染异常)、TextArea
16
+ * 分支(content/maxLen)漏跑。建表 create 和加字段 add-field 都用。
17
+ */
18
+ const CK_CANON = {
19
+ textarea: 'TextArea', ebuilder: 'EBuilder', datetime: 'DateTime',
20
+ idcard: 'IDCard', mobile: 'Mobile', email: 'Email', phone: 'Phone',
21
+ employee: 'Employee', department: 'Department', subcompany: 'SubCompany', location: 'Location',
22
+ switch: 'Switch', select: 'Select', checkbox: 'CheckBox', radiobox: 'RadioBox',
23
+ money: 'Money', number: 'Number', date: 'Date', text: 'Text',
24
+ daterange: 'DateRange', detailtable: 'DetailTable', city: 'City',
25
+ };
26
+ export function canonComponentKey(ck) {
27
+ return CK_CANON[String(ck).toLowerCase()] || ck;
28
+ }
29
+ /**
30
+ * 代码里另有分支/别名、不在 CK_CANON 与 RICH_TYPE_MAP 两处的字段类型。
31
+ * **宁宽勿窄**:多列一个只是照旧送服务器,漏一个会把合法类型误杀,所以这里尽量收全。
32
+ * 新增字段类型时记得同步。
33
+ */
34
+ const EXTRA_FIELD_TYPES = [
35
+ 'Flow', 'SelectMultiple', 'DateInterval', 'ColorPicker', 'DataTable',
36
+ 'DocFolder', 'DocFloder', 'Fold', 'Placeholder', 'Sharer', 'FileComponent',
37
+ // 附件是 `FileComponent`。**不要**再往这里加 `Attachment` —— 平台没有这个组件键:
38
+ // 送过去字段直接建不出来(`getComponentKey()` 为 null),而列在这儿等于告诉用户"它可以"。
39
+ 'EbuilderAppTag', 'Image', 'Signature', 'RichText', 'RelateBrowser',
40
+ // EInvoice 电子发票:下方 add-field 有专属构建分支(isSingle/invoiceType),此前漏登记 →
41
+ // 被 assertFieldType 挡成死代码。AudioRecord/VideoRecord 语音视频:极简 jsonObj,平台原样透传
42
+ // (见 rich-types.ts 的说明),无需富组件模板。
43
+ 'EInvoice', 'AudioRecord', 'VideoRecord',
44
+ ];
45
+ /** 可用的字段类型 = 基础组件(CK_CANON 的值)∪ 富组件(RICH_TYPE_MAP 的键)∪ 上述补充。
46
+ * 导出仅为让测试能盯住"平台支持的合法类型不许漏登记"(漏了会被 assertFieldType 误杀)。 */
47
+ export const FIELD_TYPE_CHOICES = [...new Set([
48
+ ...Object.values(CK_CANON),
49
+ ...Object.keys(RICH_TYPE_MAP),
50
+ ...EXTRA_FIELD_TYPES,
51
+ ])].sort();
52
+ /**
53
+ * 校验字段类型名。不校验的话错类型会**直送服务器**,换回一段
54
+ * `Cannot invoke "ComponentType.name()" because ... getComponentKey() is null`——
55
+ * 既看不出哪错了,也看不出该填什么。这里先拦下来并列出可选值。
56
+ */
57
+ export function assertFieldType(fieldType, where = '') {
58
+ if (FIELD_TYPE_CHOICES.includes(fieldType))
59
+ return;
60
+ console.error(`${where}不支持的字段类型: ${fieldType}`);
61
+ console.error(` 可选: ${FIELD_TYPE_CHOICES.join(' / ')}`);
62
+ process.exit(1);
63
+ }
64
+ /**
65
+ * 校验选项定义。**键名必须是 `name` / `valueKey`**——写成 `{value,label}` 这类
66
+ * 不会被拦下,而是静默存成「没有名字的选项」(平台侧 fieldOptionName 为空),
67
+ * 之后 `form data add` 按选项名写数据会直接失效,且读回也看不出哪里错了。
68
+ */
69
+ export function assertFieldOptions(fieldName, options) {
70
+ options.forEach((o, i) => {
71
+ if (typeof o === 'string')
72
+ return; // 字符串简写,归一化时会补成 {name}
73
+ const where = `字段「${fieldName}」第 ${i + 1} 个选项`;
74
+ if (typeof o?.name !== 'string' || !o.name.trim()) {
75
+ const got = o && typeof o === 'object' ? Object.keys(o).join(' / ') : String(o);
76
+ console.error(`${where}缺少 name(收到键:${got || '(无)'})`);
77
+ console.error(' 正确写法: {"name":"待入职","valueKey":"1"}(valueKey 省略则由平台生成)');
78
+ process.exit(1);
79
+ }
80
+ const vk = o.valueKey;
81
+ if (vk !== undefined && vk !== null && String(vk) !== '' && !/^\d+$/.test(String(vk))) {
82
+ console.error(`${where}的 valueKey「${vk}」必须是数字(平台规范,下游按数字引用)`);
83
+ process.exit(1);
84
+ }
85
+ });
86
+ }
87
+ /**
88
+ * 把用户写的字段定义归一成平台认的形状:
89
+ * - `fieldType` → `componentKey`(两个名字都收)
90
+ * - componentKey 大小写归一
91
+ * - `options`(字符串数组简写)→ `fieldOptions: [{name}]`
92
+ *
93
+ * 顶层字段与明细子字段共用本函数,避免两边校验不一致。
94
+ */
95
+ export function normalizeFieldDef(raw) {
96
+ const out = { ...raw };
97
+ if (!out.componentKey && out.fieldType)
98
+ out.componentKey = out.fieldType;
99
+ if (out.componentKey)
100
+ out.componentKey = canonComponentKey(out.componentKey);
101
+ const label = out.fieldName || out.title || '(未命名)';
102
+ assertFieldType(out.componentKey || '', `字段「${label}」`);
103
+ if (Array.isArray(out.options) && !out.fieldOptions) {
104
+ out.fieldOptions = out.options.map((o) => typeof o === 'string' ? { name: o } : o);
105
+ }
106
+ if (Array.isArray(out.fieldOptions)) {
107
+ assertFieldOptions(label, out.fieldOptions);
108
+ }
109
+ else if (out.fieldOptions !== undefined && out.fieldOptions !== null) {
110
+ // **写成对象时必须当场拦下。** 以前这里只判数组,非数组就这么放过去了,
111
+ // 一路带到建表里的 `fieldOptions.map(...)` 才炸成
112
+ // `TypeError: fieldOptions.map is not a function` —— 报错既看不出是哪个字段,
113
+ // 也看不出该写什么(用户往往是想配「精度/多选」这类**字段属性**,塞错了地方)。
114
+ console.error(`字段「${label}」的 fieldOptions 必须是**数组**:[{"name":"待入职","valueKey":"1"}];`
115
+ + `收到的是对象(键:${Object.keys(out.fieldOptions).join(' / ') || '(无)'})。`);
116
+ console.error(' 想配精度 / 多选这类**字段属性**,写在字段对象本身上:precision、multiple、delimiter…');
117
+ process.exit(1);
118
+ }
119
+ return out;
120
+ }
121
+ //# sourceMappingURL=form-field-validate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-field-validate.js","sourceRoot":"","sources":["../../src/services/form-field-validate.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { ApiClient } from '../core/client.js';
2
+ export type FormIdClient = Pick<ApiClient, 'get'>;
3
+ /** 需要同时 POST 的调用方(补齐三方表单、按 formId 反查)。 */
4
+ export type FormListClient = Pick<ApiClient, 'get' | 'post'>;
5
+ /**
6
+ * 把**三方表单**追加进一份 `obj/getList` 风格的列表(就地 push)。
7
+ *
8
+ * `obj/getList` 不含三方表单(专项应用),所以 `form list`、EBuilder 关联字段解析目标表名
9
+ * 这类「拿整份列表挑」的地方会漏。这里用前端那份列表补齐,并**归一成 getList 行的形状**:
10
+ * `id` = objId、`formId` 就位、`formName` / `name` 对齐 —— 调用方一行都不用改。
11
+ *
12
+ * 已有 id 的不重复加;补齐拿不到就什么都不做。标准应用里没有三方表单,等于空转。
13
+ */
14
+ export declare function appendThirdPartyForms(client: FormListClient, baseUrl: string, appId: string, list: any[]): Promise<void>;
15
+ /**
16
+ * 反查:`formId` → `objId`。
17
+ *
18
+ * 与 `resolveFormRecord` 方向相反。主力仍是 `obj/getList`(按 formId 找 `id`);
19
+ * 三方表单不在那份列表里,命不中时改走前端那份列表(每行 `id` 是 formId、`objId` 是 objId),
20
+ * 并**核对 appId 一致**才采纳。两条都拿不到回 `''`。
21
+ */
22
+ export declare function resolveObjIdByFormId(client: FormListClient, baseUrl: string, appId: string, formId: string): Promise<string>;
23
+ /**
24
+ * 按 `objId` 取表单记录(`appId` 用于定位与校验)。
25
+ *
26
+ * 平台上有两条取法:
27
+ *
28
+ * 1. **`obj/getList/<appId>`** —— 列这个应用下的全部表单,按 objId 找。**主力路径**,
29
+ * 各处原本就是这么写的;命中的就是**原来那一行记录对象**,字段一个不多一个不少。
30
+ * 2. **`obj/getInfoById/<objId>`** —— 按 id 直取单张表。
31
+ *
32
+ * ⚠ **第 1 条会漏表**:`obj/getList` **不含三方表单**(专项应用里 `thirdPartyFlag=1` 的表)。
33
+ * 在那类应用上它一条都查不到 —— 现象是「无法获取 formId」,而 objId / appId 其实完全正确。
34
+ * 第 2 条按 id 取,与列表的收录范围无关,能拿到。
35
+ *
36
+ * 兜底刻意写窄,保证**不影响原有行为**:
37
+ *
38
+ * - 只有第 1 条**没命中**时才走第 2 条 —— 原本查得到的路径一行不变、一次请求不多
39
+ * - 第 2 条的结果必须**核对 `appId` 一致**才采纳 —— 否则 objId 属于别的应用时会把不相干的
40
+ * 记录带进来,把「原本报错」变成「静默做错事」
41
+ * - 两条都拿不到就回 `null`,调用方照原样报错
42
+ */
43
+ export declare function resolveFormRecord(client: FormIdClient, baseUrl: string, appId: string, objId: string,
44
+ /** 调用点原本若还按行上的 `objId` 字段匹配(而不只是 `id`),传 true 保持语义不变。 */
45
+ opts?: {
46
+ matchObjIdKey?: boolean;
47
+ }): Promise<any | null>;
48
+ /** `resolveFormRecord` 的 formId 版。取不到回 `''`(与原本「查不到就空串」的写法一致)。 */
49
+ export declare function resolveFormId(client: FormIdClient, baseUrl: string, appId: string, objId: string): Promise<string>;
50
+ //# sourceMappingURL=form-id.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-id.d.ts","sourceRoot":"","sources":["../../src/services/form-id.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,mBAAmB,CAAC;AAGnD,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;AAElD,0CAA0C;AAC1C,MAAM,MAAM,cAAc,GAAG,IAAI,CAAC,SAAS,EAAE,KAAK,GAAG,MAAM,CAAC,CAAC;AAwB7D;;;;;;;;GAQG;AACH,wBAAsB,qBAAqB,CACzC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,GAAG,EAAE,GACV,OAAO,CAAC,IAAI,CAAC,CAiBf;AAED;;;;;;GAMG;AACH,wBAAsB,oBAAoB,CACxC,MAAM,EAAE,cAAc,EACtB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,MAAM,CAAC,CAajB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM;AACb,yDAAyD;AACzD,IAAI,GAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAA;CAAO,GACrC,OAAO,CAAC,GAAG,GAAG,IAAI,CAAC,CAoBrB;AAED,kEAAkE;AAClE,wBAAsB,aAAa,CACjC,MAAM,EAAE,YAAY,EACpB,OAAO,EAAE,MAAM,EACf,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,MAAM,CAAC,CAGjB"}
@@ -0,0 +1,110 @@
1
+ import { FORM_PAGE_PATH, buildFormPageBody, SPECIAL_FRONT_EBBUSINESSID } from './special-route.js';
2
+ /**
3
+ * 从**前端那份表单列表**(`formManage/getFormPage` + `terminal=front`)取行。
4
+ *
5
+ * 这是唯一一份**含三方表单**的列表:`obj/getList` 的 `system` 栏只含 `thirdPartyFlag=0`,
6
+ * `thirdParty` 栏需要 `tpaid`(语义未摸清,恒空)。
7
+ *
8
+ * 拿不到就回 `[]` —— 调用方按「没补齐」处理,绝不影响原本的结果。
9
+ */
10
+ async function fetchFrontFormRows(client, baseUrl, appId) {
11
+ try {
12
+ const res = await client.post(`${baseUrl}${FORM_PAGE_PATH}`, buildFormPageBody(appId, 1, 500), { ebbusinessid: SPECIAL_FRONT_EBBUSINESSID });
13
+ const rows = res?.data?.pageDatas?.result;
14
+ return Array.isArray(rows) ? rows : [];
15
+ }
16
+ catch {
17
+ return [];
18
+ }
19
+ }
20
+ /**
21
+ * 把**三方表单**追加进一份 `obj/getList` 风格的列表(就地 push)。
22
+ *
23
+ * `obj/getList` 不含三方表单(专项应用),所以 `form list`、EBuilder 关联字段解析目标表名
24
+ * 这类「拿整份列表挑」的地方会漏。这里用前端那份列表补齐,并**归一成 getList 行的形状**:
25
+ * `id` = objId、`formId` 就位、`formName` / `name` 对齐 —— 调用方一行都不用改。
26
+ *
27
+ * 已有 id 的不重复加;补齐拿不到就什么都不做。标准应用里没有三方表单,等于空转。
28
+ */
29
+ export async function appendThirdPartyForms(client, baseUrl, appId, list) {
30
+ const rows = await fetchFrontFormRows(client, baseUrl, appId);
31
+ if (rows.length === 0)
32
+ return;
33
+ const known = new Set(list.map((f) => String(f?.id)));
34
+ for (const r of rows) {
35
+ if (String(r?.thirdPartyFlag) !== '1')
36
+ continue; // 只补三方表单;系统表单本来就在
37
+ const objId = String(r?.objId ?? '');
38
+ if (!objId || known.has(objId))
39
+ continue;
40
+ known.add(objId);
41
+ list.push({
42
+ ...r,
43
+ id: objId,
44
+ formId: String(r?.id ?? ''),
45
+ formName: r?.name ?? '',
46
+ name: r?.name ?? '',
47
+ });
48
+ }
49
+ }
50
+ /**
51
+ * 反查:`formId` → `objId`。
52
+ *
53
+ * 与 `resolveFormRecord` 方向相反。主力仍是 `obj/getList`(按 formId 找 `id`);
54
+ * 三方表单不在那份列表里,命不中时改走前端那份列表(每行 `id` 是 formId、`objId` 是 objId),
55
+ * 并**核对 appId 一致**才采纳。两条都拿不到回 `''`。
56
+ */
57
+ export async function resolveObjIdByFormId(client, baseUrl, appId, formId) {
58
+ const encApp = encodeURIComponent(appId);
59
+ const listRes = await client.get(`${baseUrl}/api/bs/ebuilder/form/obj/getList/${encApp}?apid=${encApp}`, { ebbusinessid: appId });
60
+ const hit = (listRes?.data || []).find((f) => String(f?.formId) === String(formId));
61
+ if (hit?.id)
62
+ return String(hit.id);
63
+ const rows = await fetchFrontFormRows(client, baseUrl, appId);
64
+ const row = rows.find((r) => String(r?.id) === String(formId));
65
+ if (row?.objId && String(row.appId ?? '') === String(appId))
66
+ return String(row.objId);
67
+ return '';
68
+ }
69
+ /**
70
+ * 按 `objId` 取表单记录(`appId` 用于定位与校验)。
71
+ *
72
+ * 平台上有两条取法:
73
+ *
74
+ * 1. **`obj/getList/<appId>`** —— 列这个应用下的全部表单,按 objId 找。**主力路径**,
75
+ * 各处原本就是这么写的;命中的就是**原来那一行记录对象**,字段一个不多一个不少。
76
+ * 2. **`obj/getInfoById/<objId>`** —— 按 id 直取单张表。
77
+ *
78
+ * ⚠ **第 1 条会漏表**:`obj/getList` **不含三方表单**(专项应用里 `thirdPartyFlag=1` 的表)。
79
+ * 在那类应用上它一条都查不到 —— 现象是「无法获取 formId」,而 objId / appId 其实完全正确。
80
+ * 第 2 条按 id 取,与列表的收录范围无关,能拿到。
81
+ *
82
+ * 兜底刻意写窄,保证**不影响原有行为**:
83
+ *
84
+ * - 只有第 1 条**没命中**时才走第 2 条 —— 原本查得到的路径一行不变、一次请求不多
85
+ * - 第 2 条的结果必须**核对 `appId` 一致**才采纳 —— 否则 objId 属于别的应用时会把不相干的
86
+ * 记录带进来,把「原本报错」变成「静默做错事」
87
+ * - 两条都拿不到就回 `null`,调用方照原样报错
88
+ */
89
+ export async function resolveFormRecord(client, baseUrl, appId, objId,
90
+ /** 调用点原本若还按行上的 `objId` 字段匹配(而不只是 `id`),传 true 保持语义不变。 */
91
+ opts = {}) {
92
+ const encApp = encodeURIComponent(appId);
93
+ const listRes = await client.get(`${baseUrl}/api/bs/ebuilder/form/obj/getList/${encApp}?apid=${encApp}`, { ebbusinessid: appId });
94
+ const hit = (listRes?.data || []).find((f) => String(f?.id) === String(objId)
95
+ || (opts.matchObjIdKey === true && String(f?.objId) === String(objId)));
96
+ if (hit)
97
+ return hit;
98
+ // 列表里没有 —— 三方表单就是这种情况。按 id 直取,但必须确认它真属于这个应用。
99
+ const infoRes = await client.get(`${baseUrl}/api/bs/ebuilder/form/obj/getInfoById/${encodeURIComponent(objId)}?apid=${encApp}`, { ebbusinessid: appId });
100
+ const record = infoRes?.data;
101
+ if (record && String(record.appId ?? '') === String(appId) && record.id)
102
+ return record;
103
+ return null;
104
+ }
105
+ /** `resolveFormRecord` 的 formId 版。取不到回 `''`(与原本「查不到就空串」的写法一致)。 */
106
+ export async function resolveFormId(client, baseUrl, appId, objId) {
107
+ const record = await resolveFormRecord(client, baseUrl, appId, objId);
108
+ return record?.formId ? String(record.formId) : '';
109
+ }
110
+ //# sourceMappingURL=form-id.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-id.js","sourceRoot":"","sources":["../../src/services/form-id.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * EXCEL 布局的**网格层**:`pageLayouts[].config.workbook.Sheet1`。
3
+ *
4
+ * ## 为什么单开一个模块
5
+ *
6
+ * EXCEL 布局的位置有**两份副本**,必须同时改,少改一份就是一个静默的坏布局:
7
+ *
8
+ * | 副本 | 字段 | 谁在读 |
9
+ * |---|---|---|
10
+ * | 组件层 | `comps[].config.excel.row` / `.col` | `form layout read`、其它 comp 逻辑 |
11
+ * | 网格层 | `config.workbook.Sheet1.cells[].row` / `.col` + `style.cellType.comId` | **设计器渲染** |
12
+ *
13
+ * 网格那一份是**设计器的渲染源**:每个格子靠 `style.cellType.comId` 认到自己的 comp,
14
+ * 位置也以格子自己的 `row`/`col` 为准。只改组件层的话,接口回 200、命令报成功,
15
+ * 但设计器里**新字段没有格子可画**(或被画在旧位置)—— 表现是「布局改坏了 / 前端渲染错误」,
16
+ * 而手工在页面上保存一次(设计器按 comps 重算网格)就又好了。
17
+ *
18
+ * 实测(2026-10-10):平台自己的 `initLayout` 产出**严格一一对应**;
19
+ * 我们此前的增量插入只改组件层。`form layout remove-field` 当年就同步了网格
20
+ * (见 `commands/form-layout.ts`),插入与移动这两条漏了 —— 本模块把这份同步收成一处。
21
+ *
22
+ * ## FLOW 没有网格
23
+ *
24
+ * FLOW 布局靠 `config.flow.parent` / `nodes` 排布,**根本没有 `config.workbook`**。
25
+ * 所有函数遇到没有网格的页一律 no-op,返回 0/false,不抛错。
26
+ *
27
+ * ## 格子形状(实测抓的)
28
+ *
29
+ * ```jsonc
30
+ * { "row": "1", "col": "2", // ⚠ 字符串,不是数字
31
+ * "style": { "foreColor": "#111111", "textIndent": 2,
32
+ * "borderBottom": {...}, ..., // 标签格另有 backColor + hAlign
33
+ * "cellType": { "comId": "<comp id>", "type": "Text" } } }
34
+ * ```
35
+ *
36
+ * 样式不进这个模块的判据 —— 新格子一律**照模板 comp 的格子克隆**,只改写
37
+ * `row`/`col`/`cellType`,这样边框、底纹、对齐都跟着模板走,不用逐键猜。
38
+ */
39
+ /**
40
+ * 取 EXCEL 布局的网格 Sheet;**FLOW(没有 workbook)返回 null**。
41
+ *
42
+ * `cells` 为空数组时也返回 sheet —— 空网格是合法状态(表里一个字段都没有)。
43
+ * 只有 `cells` 压根不是数组(不是 EXCEL 布局)才返回 null。
44
+ */
45
+ export declare function excelSheetOf(page: any): any | null;
46
+ /**
47
+ * EXCEL 页里**某个作用域**对应的网格 Sheet。
48
+ *
49
+ * 主表是 `Sheet1`;**明细表有自己的一张**,`workbook` 的键就是那个 `DetailTable` 组件的 `id`
50
+ * (`form add-detail-table --force` 摘组件时也是这么认的)。主表字段不能去明细那张找格子,
51
+ * 反之亦然 —— 找错表的表现是「模板格找不到,没补格」。
52
+ */
53
+ export declare function sheetForScope(page: any, subFormId?: string): any | null;
54
+ /**
55
+ * 按 comp id 找它那一格。
56
+ *
57
+ * 空 `compId` 一律返回 null:表单标题那一格**没有** `cellType.comId`(`compIdOf` 得到空串),
58
+ * 不挡的话拿空串一查就命中它,把标题格当成某个组件的格。
59
+ */
60
+ export declare function findCellByCompId(sheet: any, compId: string): any | null;
61
+ /**
62
+ * 保证 `rows` 覆盖到 `row` 行。不够就补,尺寸沿用最后一行的(没有就 30)。
63
+ *
64
+ * 平台产出的 `rows` 会比实际用到的略长(实测用了 0–3 行、`rows` 有 6 条),
65
+ * 但**不能假定它一定够** —— 补上比让设计器去猜安全。
66
+ */
67
+ export declare function ensureRowCovered(sheet: any, row: number): number;
68
+ export interface NewCompCell {
69
+ /** 新组件的 `id`。 */
70
+ compId: string;
71
+ /** 新组件的 `type`(写进 `cellType.type`)。 */
72
+ type: string;
73
+ /** 新组件的位置 —— 直接读它自己的 `config.excel.row/col`。 */
74
+ row: number;
75
+ col: number;
76
+ /** 拿谁的格子当模板(同表同类型的现成 comp)。 */
77
+ templateCompId: string;
78
+ }
79
+ export interface AppendCellsResult {
80
+ added: number;
81
+ warnings: string[];
82
+ }
83
+ export interface FillCellsOptions {
84
+ /**
85
+ * 模板格从哪来。返回 `null` 表示借不到。
86
+ *
87
+ * 两条路各有各的来源:**增量插入**从本页网格里找同类型 comp 的格子;
88
+ * **建视图**时本页网格本来就是空的,得从**源布局**借同一个字段的格子。
89
+ */
90
+ templateCellOf: (entry: NewCompCell) => any | null;
91
+ /**
92
+ * 借不到模板格时,是否造一格**最小格**(只有位置 + `cellType`)。
93
+ *
94
+ * - `false`(缺省):跳过并告警。用在增量插入 —— 那里借不到模板说明这张表的网格
95
+ * 本来就残缺,凭空补一格等于把「残缺」伪装成「正常」。
96
+ * - `true`:造最小格。用在建视图 —— 那里源布局里**可能**没有对应字段(新加的字段),
97
+ * 但视图总得有格子才画得出来,宁可样式素一点也不能缺格。样式缺失会在 warnings 里说明。
98
+ */
99
+ synthesizeWhenMissing?: boolean;
100
+ /** 要写哪张网格。不给就按主表(`Sheet1`)—— 明细字段要传明细表那张(见 `sheetForScope`)。 */
101
+ sheet?: any;
102
+ }
103
+ /**
104
+ * 给一批新 comp 造格子并塞进网格。模板格由调用方给(见 `FillCellsOptions`),
105
+ * 统一在这里做三件事:克隆改写、占位告警、`rows` 补够。
106
+ *
107
+ * 没有网格(FLOW)时返回 `{added:0, warnings:[]}` —— 静默 no-op,因为那不是异常。
108
+ */
109
+ export declare function fillCells(page: any, entries: NewCompCell[], opts: FillCellsOptions): AppendCellsResult;
110
+ /**
111
+ * 增量插入用的入口:模板格**从本页网格里**找(同表同类型的现成 comp 的格子)。
112
+ *
113
+ * 借不到就跳过并告警 —— 见 `FillCellsOptions.synthesizeWhenMissing` 那段取舍。
114
+ */
115
+ export declare function appendCellsForNewComps(page: any, entries: NewCompCell[], subFormId?: string): AppendCellsResult;
116
+ /**
117
+ * 把某 comp 的格子挪到新位置(`form layout move` 用)。
118
+ *
119
+ * 只改格子的 `row`/`col` —— `cellType`、样式都留原样,动的只是位置。
120
+ * 没有网格(FLOW)或找不到格子时返回 false(调用方自己决定要不要提示)。
121
+ */
122
+ export declare function moveCellTo(page: any, compId: string, row: number, col: number): boolean;
123
+ //# sourceMappingURL=form-layout-grid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form-layout-grid.d.ts","sourceRoot":"","sources":["../../src/services/form-layout-grid.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAKH;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,GAAG,GAAG,GAAG,GAAG,IAAI,CAIlD;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAUvE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,GAAG,GAAG,GAAG,IAAI,CAKvE;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAOhE;AAED,MAAM,WAAW,WAAW;IAC1B,iBAAiB;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,uCAAuC;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,GAAG,EAAE,MAAM,CAAC;IACZ,GAAG,EAAE,MAAM,CAAC;IACZ,+BAA+B;IAC/B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,iBAAiB;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;;;OAKG;IACH,cAAc,EAAE,CAAC,KAAK,EAAE,WAAW,KAAK,GAAG,GAAG,IAAI,CAAC;IACnD;;;;;;;OAOG;IACH,qBAAqB,CAAC,EAAE,OAAO,CAAC;IAChC,gEAAgE;IAChE,KAAK,CAAC,EAAE,GAAG,CAAC;CACb;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,IAAI,EAAE,gBAAgB,GAAG,iBAAiB,CA8CtG;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,EAAE,WAAW,EAAE,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,iBAAiB,CAM/G;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CASvF"}