weaver-e10-builder 1.5.16 → 1.6.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 (232) hide show
  1. package/dist/commands/auth.d.ts.map +1 -1
  2. package/dist/commands/auth.js +4 -2
  3. package/dist/commands/auth.js.map +1 -1
  4. package/dist/commands/check.d.ts.map +1 -1
  5. package/dist/commands/check.js +109 -51
  6. package/dist/commands/check.js.map +1 -1
  7. package/dist/commands/form-attachment-setting.d.ts +3 -0
  8. package/dist/commands/form-attachment-setting.d.ts.map +1 -0
  9. package/dist/commands/form-attachment-setting.js +422 -0
  10. package/dist/commands/form-attachment-setting.js.map +1 -0
  11. package/dist/commands/form-data.d.ts.map +1 -1
  12. package/dist/commands/form-data.js +49 -1
  13. package/dist/commands/form-data.js.map +1 -1
  14. package/dist/commands/form-ebuilder-scope.d.ts +21 -0
  15. package/dist/commands/form-ebuilder-scope.d.ts.map +1 -1
  16. package/dist/commands/form-ebuilder-scope.js +41 -8
  17. package/dist/commands/form-ebuilder-scope.js.map +1 -1
  18. package/dist/commands/form-field-linkage.d.ts +6 -1
  19. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  20. package/dist/commands/form-field-linkage.js +138 -31
  21. package/dist/commands/form-field-linkage.js.map +1 -1
  22. package/dist/commands/form-layout-code-reviewed.d.ts +3 -0
  23. package/dist/commands/form-layout-code-reviewed.d.ts.map +1 -0
  24. package/dist/commands/form-layout-code-reviewed.js +61 -0
  25. package/dist/commands/form-layout-code-reviewed.js.map +1 -0
  26. package/dist/commands/form-layout-describe.d.ts +3 -0
  27. package/dist/commands/form-layout-describe.d.ts.map +1 -0
  28. package/dist/commands/form-layout-describe.js +58 -0
  29. package/dist/commands/form-layout-describe.js.map +1 -0
  30. package/dist/commands/form-layout-diff.d.ts +3 -0
  31. package/dist/commands/form-layout-diff.d.ts.map +1 -0
  32. package/dist/commands/form-layout-diff.js +48 -0
  33. package/dist/commands/form-layout-diff.js.map +1 -0
  34. package/dist/commands/form-layout-document.d.ts +3 -0
  35. package/dist/commands/form-layout-document.d.ts.map +1 -0
  36. package/dist/commands/form-layout-document.js +81 -0
  37. package/dist/commands/form-layout-document.js.map +1 -0
  38. package/dist/commands/form-layout-edit.d.ts +3 -0
  39. package/dist/commands/form-layout-edit.d.ts.map +1 -0
  40. package/dist/commands/form-layout-edit.js +51 -0
  41. package/dist/commands/form-layout-edit.js.map +1 -0
  42. package/dist/commands/form-layout-init-reviewed.d.ts +3 -0
  43. package/dist/commands/form-layout-init-reviewed.d.ts.map +1 -0
  44. package/dist/commands/form-layout-init-reviewed.js +78 -0
  45. package/dist/commands/form-layout-init-reviewed.js.map +1 -0
  46. package/dist/commands/form-layout-restore.d.ts.map +1 -1
  47. package/dist/commands/form-layout-restore.js +23 -0
  48. package/dist/commands/form-layout-restore.js.map +1 -1
  49. package/dist/commands/form-layout-template-catalog.d.ts +3 -0
  50. package/dist/commands/form-layout-template-catalog.d.ts.map +1 -0
  51. package/dist/commands/form-layout-template-catalog.js +45 -0
  52. package/dist/commands/form-layout-template-catalog.js.map +1 -0
  53. package/dist/commands/form.d.ts.map +1 -1
  54. package/dist/commands/form.js +80 -5
  55. package/dist/commands/form.js.map +1 -1
  56. package/dist/commands/project.d.ts.map +1 -1
  57. package/dist/commands/project.js +39 -6
  58. package/dist/commands/project.js.map +1 -1
  59. package/dist/index.js +15 -0
  60. package/dist/index.js.map +1 -1
  61. package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
  62. package/dist/services/actionflow/components/action_eb_add.js +12 -5
  63. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  64. package/dist/services/actionflow/components/action_eb_add_compiler.d.ts.map +1 -1
  65. package/dist/services/actionflow/components/action_eb_add_compiler.js +5 -0
  66. package/dist/services/actionflow/components/action_eb_add_compiler.js.map +1 -1
  67. package/dist/services/actionflow/components/action_eb_delete.d.ts +6 -1
  68. package/dist/services/actionflow/components/action_eb_delete.d.ts.map +1 -1
  69. package/dist/services/actionflow/components/action_eb_delete.js +23 -5
  70. package/dist/services/actionflow/components/action_eb_delete.js.map +1 -1
  71. package/dist/services/actionflow/components/action_eb_delete_compiler.d.ts.map +1 -1
  72. package/dist/services/actionflow/components/action_eb_delete_compiler.js +22 -0
  73. package/dist/services/actionflow/components/action_eb_delete_compiler.js.map +1 -1
  74. package/dist/services/actionflow/components/action_eb_update.d.ts.map +1 -1
  75. package/dist/services/actionflow/components/action_eb_update.js +13 -4
  76. package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
  77. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  78. package/dist/services/actionflow/components/action_eb_update_compiler.js +9 -2
  79. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  80. package/dist/services/actionflow/components/date_trigger.js +2 -2
  81. package/dist/services/actionflow/components/date_trigger.js.map +1 -1
  82. package/dist/services/actionflow/components/enquiry_form.d.ts.map +1 -1
  83. package/dist/services/actionflow/components/enquiry_form.js +11 -10
  84. package/dist/services/actionflow/components/enquiry_form.js.map +1 -1
  85. package/dist/services/actionflow/components/event_button.js +1 -1
  86. package/dist/services/actionflow/components/event_button.js.map +1 -1
  87. package/dist/services/actionflow/components/form_data_builder.d.ts +29 -1
  88. package/dist/services/actionflow/components/form_data_builder.d.ts.map +1 -1
  89. package/dist/services/actionflow/components/form_data_builder.js +67 -3
  90. package/dist/services/actionflow/components/form_data_builder.js.map +1 -1
  91. package/dist/services/actionflow/components/time_batch_trigger.js +2 -2
  92. package/dist/services/actionflow/components/time_batch_trigger.js.map +1 -1
  93. package/dist/services/actionflow/form_source.d.ts +44 -1
  94. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  95. package/dist/services/actionflow/form_source.js +231 -5
  96. package/dist/services/actionflow/form_source.js.map +1 -1
  97. package/dist/services/actionflow/preflight_service.d.ts +8 -0
  98. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  99. package/dist/services/actionflow/preflight_service.js +120 -14
  100. package/dist/services/actionflow/preflight_service.js.map +1 -1
  101. package/dist/services/actionflow/system_params.d.ts.map +1 -1
  102. package/dist/services/actionflow/system_params.js +4 -1
  103. package/dist/services/actionflow/system_params.js.map +1 -1
  104. package/dist/services/actionflow/trigger_common.d.ts.map +1 -1
  105. package/dist/services/actionflow/trigger_common.js +12 -3
  106. package/dist/services/actionflow/trigger_common.js.map +1 -1
  107. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  108. package/dist/services/actionflow/workflow_compiler.js +117 -40
  109. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  110. package/dist/services/form-attachment-settings.d.ts +110 -0
  111. package/dist/services/form-attachment-settings.d.ts.map +1 -0
  112. package/dist/services/form-attachment-settings.js +332 -0
  113. package/dist/services/form-attachment-settings.js.map +1 -0
  114. package/dist/services/form-attachment-upload.d.ts +30 -0
  115. package/dist/services/form-attachment-upload.d.ts.map +1 -0
  116. package/dist/services/form-attachment-upload.js +76 -0
  117. package/dist/services/form-attachment-upload.js.map +1 -0
  118. package/dist/services/form-data-openapi.d.ts +2 -0
  119. package/dist/services/form-data-openapi.d.ts.map +1 -1
  120. package/dist/services/form-data-openapi.js +1 -0
  121. package/dist/services/form-data-openapi.js.map +1 -1
  122. package/dist/services/form-layout-code-reviewed.d.ts +32 -0
  123. package/dist/services/form-layout-code-reviewed.d.ts.map +1 -0
  124. package/dist/services/form-layout-code-reviewed.js +101 -0
  125. package/dist/services/form-layout-code-reviewed.js.map +1 -0
  126. package/dist/services/form-layout-describe.d.ts +4 -0
  127. package/dist/services/form-layout-describe.d.ts.map +1 -0
  128. package/dist/services/form-layout-describe.js +107 -0
  129. package/dist/services/form-layout-describe.js.map +1 -0
  130. package/dist/services/form-layout-diff.d.ts +37 -0
  131. package/dist/services/form-layout-diff.d.ts.map +1 -0
  132. package/dist/services/form-layout-diff.js +232 -0
  133. package/dist/services/form-layout-diff.js.map +1 -0
  134. package/dist/services/form-layout-document-apply.d.ts +23 -0
  135. package/dist/services/form-layout-document-apply.d.ts.map +1 -0
  136. package/dist/services/form-layout-document-apply.js +82 -0
  137. package/dist/services/form-layout-document-apply.js.map +1 -0
  138. package/dist/services/form-layout-document.d.ts +13 -0
  139. package/dist/services/form-layout-document.d.ts.map +1 -0
  140. package/dist/services/form-layout-document.js +228 -0
  141. package/dist/services/form-layout-document.js.map +1 -0
  142. package/dist/services/form-layout-edit.d.ts +21 -0
  143. package/dist/services/form-layout-edit.d.ts.map +1 -0
  144. package/dist/services/form-layout-edit.js +103 -0
  145. package/dist/services/form-layout-edit.js.map +1 -0
  146. package/dist/services/form-layout-init-plan.d.ts +54 -0
  147. package/dist/services/form-layout-init-plan.d.ts.map +1 -0
  148. package/dist/services/form-layout-init-plan.js +211 -0
  149. package/dist/services/form-layout-init-plan.js.map +1 -0
  150. package/dist/services/form-layout-source/review.d.ts +4 -0
  151. package/dist/services/form-layout-source/review.d.ts.map +1 -0
  152. package/dist/services/form-layout-source/review.js +54 -0
  153. package/dist/services/form-layout-source/review.js.map +1 -0
  154. package/dist/services/form-layout-template-advanced.d.ts +5 -0
  155. package/dist/services/form-layout-template-advanced.d.ts.map +1 -1
  156. package/dist/services/form-layout-template-advanced.js +17 -1
  157. package/dist/services/form-layout-template-advanced.js.map +1 -1
  158. package/dist/services/form-layout-template-catalog.d.ts +13 -0
  159. package/dist/services/form-layout-template-catalog.d.ts.map +1 -0
  160. package/dist/services/form-layout-template-catalog.js +27 -0
  161. package/dist/services/form-layout-template-catalog.js.map +1 -0
  162. package/dist/services/form-layout-template-flow.d.ts +1 -1
  163. package/dist/services/form-layout-template-flow.d.ts.map +1 -1
  164. package/dist/services/form-layout-template-flow.js.map +1 -1
  165. package/dist/services/form-layout-template-verification.d.ts +34 -0
  166. package/dist/services/form-layout-template-verification.d.ts.map +1 -0
  167. package/dist/services/form-layout-template-verification.js +124 -0
  168. package/dist/services/form-layout-template-verification.js.map +1 -0
  169. package/dist/services/form-style-template.d.ts +3 -3
  170. package/dist/services/form-style-template.d.ts.map +1 -1
  171. package/dist/services/form-style-template.js +18 -13
  172. package/dist/services/form-style-template.js.map +1 -1
  173. package/package.json +1 -1
  174. package/skill-docs/SKILL.md +163 -155
  175. package/skill-docs/_catalog.md +110 -106
  176. package/skill-docs/actionflows/references/components/ebuilder/ActionEbDelete.md +60 -3
  177. package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +35 -33
  178. package/skill-docs/assets/sample/api/formApi.js +689 -510
  179. package/skill-docs/assets/sample/app/config.js +4 -0
  180. package/skill-docs/assets/sample/app/fields.js +25 -0
  181. package/skill-docs/assets/sample/entry.js +24 -22
  182. package/skill-docs/assets/sample/eslint.config.cjs +1 -0
  183. package/skill-docs/assets/sample/pages/Items.js +247 -0
  184. package/skill-docs/assets/sample/styles/prototypeStyles.js +137 -0
  185. package/skill-docs/references/coding/guide-edit-backfill.md +102 -150
  186. package/skill-docs/references/coding/guide-form-crud.md +195 -172
  187. package/skill-docs/references/coding/guide-html-to-react.md +250 -0
  188. package/skill-docs/references/coding/guide-page-code.md +194 -167
  189. package/skill-docs/references/coding/guide-page-export.md +27 -18
  190. package/skill-docs/references/coding/ref-compile-rules.md +7 -7
  191. package/skill-docs/references/common/capability-boundaries.md +20 -1
  192. package/skill-docs/references/common/guide-plan-template.md +29 -3
  193. package/skill-docs/references/common/map.md +13 -8
  194. package/skill-docs/references/common/ref-cli-commands.md +31 -10
  195. package/skill-docs/references/components/display-FilePreview.md +5 -4
  196. package/skill-docs/references/form/guide-browser-definition.md +57 -13
  197. package/skill-docs/references/form/guide-create-form.md +258 -258
  198. package/skill-docs/references/form/guide-field-linkage.md +4 -1
  199. package/skill-docs/references/form/guide-form-attachment-setting.md +95 -0
  200. package/skill-docs/references/form/guide-form-data.md +22 -1
  201. package/skill-docs/references/form/layout/code-block/code-block-guide.md +153 -0
  202. package/skill-docs/references/form/layout/code-block/controls.md +60 -0
  203. package/skill-docs/references/form/layout/code-block/coverage.md +32 -0
  204. package/skill-docs/references/form/layout/code-block/details.md +57 -0
  205. package/skill-docs/references/form/layout/code-block/events-validation.md +42 -0
  206. package/skill-docs/references/form/layout/code-block/foundations-fields.md +56 -0
  207. package/skill-docs/references/form/layout/code-block/layout-css.md +116 -0
  208. package/skill-docs/references/form/layout/code-block/recipes.md +164 -0
  209. package/skill-docs/references/form/layout/code-block/troubleshooting.md +49 -0
  210. package/skill-docs/references/form/layout/code-block/ui-global.md +47 -0
  211. package/skill-docs/references/form/layout/document.md +39 -0
  212. package/skill-docs/references/form/layout/incremental.md +133 -0
  213. package/skill-docs/references/form/layout/initialization.md +39 -0
  214. package/skill-docs/references/form/layout/inspect-edit.md +76 -0
  215. package/skill-docs/references/form/layout/layout-overview.md +67 -0
  216. package/skill-docs/references/form/layout/management.md +64 -0
  217. package/skill-docs/references/form/layout/planning.md +76 -0
  218. package/skill-docs/references/form/layout/source-restoration.md +388 -0
  219. package/skill-docs/references/form/layout/template/advanced-css.md +167 -0
  220. package/skill-docs/references/form/layout/template/advanced.md +318 -0
  221. package/skill-docs/references/form/layout/template/easy.md +64 -0
  222. package/skill-docs/references/form/layout/template/flow.md +30 -0
  223. package/skill-docs/references/form/layout/template/template-guide.md +56 -0
  224. package/skill-docs/references/form/layout/workflow-layout.md +44 -0
  225. package/skill-docs/references/form/ref-form-fields.md +303 -301
  226. package/skill-docs/references/workflow/guide-workflow-node-layout.md +189 -187
  227. package/skill-docs/assets/sample/config/config.js +0 -0
  228. package/skill-docs/assets/sample/config/configLoad.js +0 -0
  229. package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
  230. package/skill-docs/assets/sample/config/config_default.js +0 -0
  231. package/skill-docs/assets/sample/memo.md +0 -0
  232. package/skill-docs/assets/sample/readme.js +0 -8
@@ -1,189 +1,141 @@
1
1
  # 编辑回显指南
2
2
 
3
- 编辑已有数据时,需要将表单数据加载回表单控件中。`getSimpleData` 对特殊类型统一返回 ID,可直接用于表单回显,但选择器组件需要额外提取 name 信息。
3
+ 编辑已有数据时,`formClient` 返回的行已经把「写入值」「显示名」「选择器对象」分好了,不需要再同时拉 `getSimpleData` 和 `getAllData`。
4
4
 
5
5
  ---
6
6
 
7
- ## 核心流程
8
-
9
- ### 第一步:加载时同时获取两份数据
7
+ ## 一、行里有什么
10
8
 
11
9
  ```js
12
- // loadData 中用 Promise.all 同时获取两份数据
13
- function loadData() {
14
- Promise.all([
15
- getSimpleData(OBJ_ID, USER_ID),
16
- getAllData(OBJ_ID, USER_ID),
17
- ]).then(function ([simpleRows, allRows]) {
18
- setData(withDisplayNames(simpleRows, statusMap));
19
- setRawData(allRows); // 保存原始数据用于编辑回显
20
- });
10
+ {
11
+ id: '数据ID',
12
+ values: { 字段ID: '写入用的值/ID' },
13
+ display: { 字段ID: '展示用名称' },
14
+ items: { 字段ID: [{ id, name }] },
15
+ details: { [DETAIL_SUB_FORM_ID]: [...] },
16
+ raw: 平台原始行
21
17
  }
22
18
  ```
23
19
 
24
- ### 第二步:编辑按钮点击时回填表单
20
+ | 回填目标 | 取哪里 |
21
+ |---|---|
22
+ | 文本框、数字、日期、下拉框 | `values` |
23
+ | 只读展示、表格列 | `display` |
24
+ | 人员 / 部门 Browser | `items` |
25
+ | Upload 附件 | `items`(`id` 映射成 `fileid`) |
26
+ | 明细表 | `detailRows[subFormId]` 的 `values` |
25
27
 
26
- ```js
27
- function handleEdit(rowData) {
28
- var dataId = rowData._raw.id; // Table 回调的 rowData 有 _raw,不是 getSimpleData 返回的行
29
-
30
- // 1. 从 rawData(原始接口数据) 中查找对应记录
31
- var rawEntry = rawData.find(function (r) {
32
- return r.mainTable && r.mainTable.id && r.mainTable.id.fieldValue === dataId;
33
- });
28
+ ---
34
29
 
35
- // 2. 用 getSimpleData 的值填充表单(所有特殊字段已是 ID,可直接用)
36
- var editForm = {};
37
- Object.keys(emptyForm).forEach(function (key) {
38
- editForm[key] = rowData._raw[key] || '';
39
- });
30
+ ## 二、打开编辑
40
31
 
41
- // 3. 从 rawEntry.mainTable 中提取 name 信息(选择器组件需要 [{id, name}] 格式)
42
- var newSelectedPerson = [];
43
- var newSelectedDept = [];
44
- var newUploadedFiles = [];
45
-
46
- if (rawEntry && rawEntry.mainTable) {
47
- Object.keys(rawEntry.mainTable).forEach(function (key) {
48
- var val = rawEntry.mainTable[key];
49
- if (!val) return;
50
-
51
- if (Array.isArray(val) && val.length > 0) {
52
- var fieldId = val[0].fieldId;
53
- var fieldType = val[0].fieldType;
54
-
55
- if (fieldId === F.person) {
56
- newSelectedPerson = val.map(function (v) {
57
- return { id: v.fieldOptionId, name: v.fieldOptionName };
58
- });
59
- } else if (fieldId === F.dept) {
60
- newSelectedDept = val.map(function (v) {
61
- return { id: v.fieldOptionId, name: v.fieldOptionName };
62
- });
63
- } else if (fieldId === F.attachment) {
64
- newUploadedFiles = val.map(function (v) {
65
- return { fileid: v.fieldOptionId, name: v.fieldOptionName };
66
- });
67
- } else if (fieldType === 'Select' || fieldType === 'RadioBox' || fieldType === 'CheckBox') {
68
- // getSimpleData 已返回 ID,此处从 rawEntry 再次确认(多选时覆盖)
69
- editForm[fieldId] = val.map(function (v) { return v.fieldOptionId; }).join(',');
70
- }
71
- }
72
- });
73
- }
74
-
75
- // 4. 一次性设置所有状态
76
- setForm(editForm);
77
- setSelectedPerson(newSelectedPerson);
78
- setSelectedDept(newSelectedDept);
79
- setUploadedFiles(newUploadedFiles);
32
+ ```js
33
+ function handleEdit(row) {
34
+ setEditingId(row.id);
35
+ setForm(Object.assign({}, row.values));
36
+ setSelectedPerson(row.items[F.owner] || []);
37
+ setSelectedDept(row.items[F.dept] || []);
38
+ setUploadedFiles((row.items[F.attachment] || []).map(function (item) {
39
+ return { fileid: item.id, name: item.name };
40
+ }));
80
41
  setModalVisible(true);
81
42
  }
82
43
  ```
83
44
 
84
- ---
45
+ 关键点:
46
+
47
+ - `row.values` 直接作为表单初始值,特殊字段已经是 ID。
48
+ - 人员 / 部门 Browser 的 `value` 需要 `[{ id, name }]`,直接用 `row.items[字段ID]`。
49
+ - Upload 的 `data` 需要 `[{ fileid, name }]`,把 `items` 的 `id` 改名为 `fileid`。
50
+ - 不要从 `row.raw.mainTable` 里自己找字段;`raw` 只用于平台原始报文排查。
51
+ - 不要用 `display` 回填表单,否则保存时会把中文名写回 ID 字段。
85
52
 
86
- ## 关键点总结
53
+ 明细回显:
54
+
55
+ ```js
56
+ var detail = (row.detailRows && row.detailRows[DETAIL_SUB_FORM_ID]) || [];
57
+ setDetailRows(detail.map(function (line) {
58
+ return Object.assign({}, line.values);
59
+ }));
60
+ ```
87
61
 
88
- | 要点 | 说明 |
89
- |------|------|
90
- | `getAllData` 返回结构中 `id` 在 `mainTable` 内部 | 查找原始记录必须是 `r.mainTable.id.fieldValue`,**不能**写成 `r.id.fieldValue` |
91
- | `Browser`(人员/部门) 的 `value` | 需要 `[{id, name}]` 格式 |
92
- | `Upload`(附件) 的 `data` | 需要 `[{fileid, name}]` 格式 |
93
- | `Select` 下拉框的 `value` | 需要匹配 `fieldOptionId`(即 `opt.valueKey`),不能是显示名 |
94
- | Table 的 `onRowClick` 回调 | `rowData._raw` 引用了原始数据行,`rowData._raw.id` 是 dataId |
95
- | 表单字段值来源 | 从 `getSimpleData` 取值(已是 ID),选择器显示名从 `getAllData` 提取 |
62
+ 保存时把 `detailRows` 放回 `details[DETAIL_SUB_FORM_ID]`,编辑整表用 `detailMode: 'cover'`。
96
63
 
97
64
  ---
98
65
 
99
- ## getSimpleData vs getAllData 结构对比
66
+ ## 三、新增
100
67
 
101
- ### getSimpleData 返回(扁平,纯 ID,用于写入)
68
+ 新增时构造空表单:
102
69
 
103
- ```json
104
- [
105
- {
106
- "1290462231772995585": "张三", // Text:直接就是值
107
- "1290462231772995586": "1290462231772995612", // Select:选项 ID
108
- "1290462231772995589": "2765550234448235905", // Employee:用户 ID
109
- "id": "1290469928435908609"
110
- }
111
- ]
70
+ ```js
71
+ var EMPTY = {};
72
+ Object.keys(F).forEach(function (key) {
73
+ EMPTY[F[key]] = '';
74
+ });
75
+
76
+ setEditingId('');
77
+ setForm(Object.assign({}, EMPTY));
78
+ setSelectedPerson([]);
79
+ setSelectedDept([]);
80
+ setUploadedFiles([]);
112
81
  ```
113
82
 
114
- 所有特殊字段统一返回 `fieldOptionId`(纯 ID),直接用于 `formToSave`。
83
+ ---
115
84
 
116
- ### getAllData 返回(含名称,用于展示/回显)
85
+ ## 四、只有 dataId 时怎么回显
117
86
 
118
- ```json
119
- {
120
- "mainTable": {
121
- "sjhfa391": { // ← key 是随机哈希,不是 fieldId!
122
- "fieldId": "1290462231772995590",
123
- "fieldType": "Text",
124
- "fieldValue": "13800138000"
125
- },
126
- "zssj98f9d": [{ // ← Employee 是数组!
127
- "fieldId": "1290462231772995589",
128
- "fieldType": "Employee",
129
- "fieldOptionId": "2765550234448235905",
130
- "fieldOptionName": "张三"
131
- }],
132
- "bm1d630": [{ // ← Select 也是数组!
133
- "fieldId": "1290462231772995586",
134
- "fieldType": "Select",
135
- "fieldOptionId": "1290462231772995612",
136
- "fieldOptionName": "技术部"
137
- }],
138
- "id": { // ← 只有 id 的 key 是 "id"
139
- "fieldId": "5",
140
- "fieldType": "Text",
141
- "fieldValue": "1290469928435908609"
142
- }
143
- }
144
- }
87
+ 如果页面是从 URL / 路由拿到 `dataId`,不要先拉全表再找:
88
+
89
+ ```js
90
+ useEffect(function () {
91
+ if (!dataId) return;
92
+ items.get(dataId, { withDetail: true }).then(function (row) {
93
+ if (!row) return;
94
+ handleEdit(row);
95
+ }).catch(function (err) {
96
+ setError(err.message);
97
+ });
98
+ }, [dataId]);
145
99
  ```
146
100
 
147
- ### 三个关键规则
101
+ 列表页已经有行对象时,直接把 `row` 传给 `handleEdit`,不要重复请求。
148
102
 
149
- | 规则 | 说明 |
150
- |------|------|
151
- | **key 是随机哈希** | `mainTable` 的 key(如 `sjhfa391`)是随机字符串,**不能**用 `mainTable[fieldId]` 直接取值 |
152
- | **只能用 fieldId 匹配** | 必须遍历 `Object.values(mainTable)`,通过 `val.fieldId` 或 `val[0].fieldId` 匹配目标字段 |
153
- | **数组 vs 对象** | Employee / Select / FileComponent / RadioBox / CheckBox → **数组** `[{...}]`;Text / Number / DateComponent → **对象** `{...}` |
154
- | **只有 id 是 deterministic** | 数据行 ID 的 key 固定为 `"id"`,可直接用 `mainTable.id.fieldValue` |
103
+ ---
155
104
 
156
- ### 字段值 → 组件 props 映射表
105
+ ## 五、字段类型映射
157
106
 
158
- > 这是整个编辑回显最容易出错的一步。getAllData 中的字段形状各不相同,映射到组件 props 的方式也不同。
107
+ | 字段类型 | `values` | 回填组件 | 组件需要的值 |
108
+ |---|---|---|---|
109
+ | Text / TextArea / Number / Date | 字符串/数字 | 原生 input / textarea | 直接用 |
110
+ | Select / RadioBox / CheckBox | 选项 ID;多选逗号串 | 原生 select 或多选控件 | 单选取 ID;多选按逗号拆或使用对应组件 |
111
+ | Employee / Department | ID;多值逗号串 | `Browser` | `row.items[fieldId]` → `[{id,name}]` |
112
+ | FileComponent | 文件 ID 串 | `Upload` | `row.items[fieldId]` → `[{fileid,id 改名,name}]` |
113
+ | Ebuilder / Browser / RelateBrowser | 关联数据 ID | 关联浏览组件 | `row.items[fieldId]` → `[{id,name}]` |
159
114
 
160
- | 字段类型 | getAllData 中的形状 | 目标组件 | 需要的 props 格式 | 映射方式 |
161
- |---------|-------------------|---------|-----------------|---------|
162
- | Employee | `[{fieldOptionId, fieldOptionName}]` | `Browser` | `value={[{id, name}]}` | `v.fieldOptionId → id`,`v.fieldOptionName → name` |
163
- | Department | `[{fieldOptionId, fieldOptionName}]` | `Browser` | `value={[{id, name}]}` | 同上 |
164
- | FileComponent | `[{fieldOptionId, fieldOptionName}]` | `Upload` | `data={[{fileid, name}]}` | `v.fieldOptionId → fileid`,`v.fieldOptionName → name` |
165
- | Select(单选) | `[{fieldOptionId}]` | `<select>` | `value="fieldOptionId"` | 取 `val[0].fieldOptionId` |
166
- | Select(多选) | `[{...}, {...}]` → 多个 | `<select multiple>` | 逗号分隔串 | `val.map(...).join(',')` |
167
- | Text / Number | `{fieldValue}` | `<input>` | `value="fieldValue"` | 直接用 `getSimpleData` 的值 |
115
+ ---
168
116
 
169
- ### 正确的字段提取方式
117
+ ## 六、保存
170
118
 
171
119
  ```js
172
- // 查找 mainTable 中 fieldId 匹配的字段值
173
- function findField(mainTable, targetFieldId) {
174
- var keys = Object.keys(mainTable);
175
- for (var i = 0; i < keys.length; i++) {
176
- var val = mainTable[keys[i]];
177
- if (!val) continue;
178
- // 数组类型(Employee/Select 等)取 val[0].fieldId
179
- if (Array.isArray(val) && val.length > 0 && val[0].fieldId === targetFieldId) {
180
- return val;
181
- }
182
- // 普通类型(Text/DateComponent 等)取 val.fieldId
183
- if (!Array.isArray(val) && val.fieldId === targetFieldId) {
184
- return val;
185
- }
186
- }
187
- return null;
120
+ if (editingId) {
121
+ await items.update(editingId, form);
122
+ } else {
123
+ var newId = await items.save(form);
188
124
  }
189
125
  ```
126
+
127
+ - 只传需要修改的字段;字段联动依赖完整值时传整行 `row.values`。
128
+ - 保存成功后重新 `items.list()` 刷新列表。
129
+ - 保存失败要展示 `err.message`。
130
+
131
+ ---
132
+
133
+ ## 七、常见错误
134
+
135
+ | 错误 | 后果 | 正确做法 |
136
+ |---|---|---|
137
+ | 用 `row.display[字段]` 回填 form | 保存时把中文名写进 ID 字段 | 用 `row.values[字段]` |
138
+ | 从 `row.raw.mainTable` 自己找字段 | 随机 key、数组/对象形状判断错 | 用 `values` / `display` / `items` |
139
+ | 人员选择器传字符串 ID | 组件显示数字或不显示 | 传 `[{id,name}]` |
140
+ | Upload 直接传 `items` | 组件读不到 `fileid` | 映射成 `{fileid:id,name}` |
141
+ | 列表已有行还调 `items.get` | 多一次请求 | 直接复用 `row` |