weaver-e10-builder 1.6.0 → 1.6.5

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 (183) hide show
  1. package/dist/commands/actionflow.d.ts.map +1 -1
  2. package/dist/commands/actionflow.js +2 -0
  3. package/dist/commands/actionflow.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-add-detail-table.js +3 -3
  8. package/dist/commands/form-add-detail-table.js.map +1 -1
  9. package/dist/commands/form-attachment-setting.d.ts +3 -0
  10. package/dist/commands/form-attachment-setting.d.ts.map +1 -0
  11. package/dist/commands/form-attachment-setting.js +422 -0
  12. package/dist/commands/form-attachment-setting.js.map +1 -0
  13. package/dist/commands/form-browser-definition.js +8 -8
  14. package/dist/commands/form-browser-definition.js.map +1 -1
  15. package/dist/commands/form-code.js +7 -7
  16. package/dist/commands/form-code.js.map +1 -1
  17. package/dist/commands/form-data.d.ts.map +1 -1
  18. package/dist/commands/form-data.js +50 -2
  19. package/dist/commands/form-data.js.map +1 -1
  20. package/dist/commands/form-ebuilder-scope.js +8 -8
  21. package/dist/commands/form-ebuilder-scope.js.map +1 -1
  22. package/dist/commands/form-engine-linkage.js +12 -12
  23. package/dist/commands/form-engine-linkage.js.map +1 -1
  24. package/dist/commands/form-field-linkage.d.ts +6 -1
  25. package/dist/commands/form-field-linkage.d.ts.map +1 -1
  26. package/dist/commands/form-field-linkage.js +138 -31
  27. package/dist/commands/form-field-linkage.js.map +1 -1
  28. package/dist/commands/form-layout-diff.js +1 -1
  29. package/dist/commands/form-layout-diff.js.map +1 -1
  30. package/dist/commands/form-layout-edit.js +1 -1
  31. package/dist/commands/form-layout-edit.js.map +1 -1
  32. package/dist/commands/form-layout-init-reviewed.js +1 -1
  33. package/dist/commands/form-layout-init-reviewed.js.map +1 -1
  34. package/dist/commands/form-layout-init.js +2 -2
  35. package/dist/commands/form-layout-init.js.map +1 -1
  36. package/dist/commands/form-layout-template-easy.js +1 -1
  37. package/dist/commands/form-layout-template-easy.js.map +1 -1
  38. package/dist/commands/form-layout.js +4 -4
  39. package/dist/commands/form-layout.js.map +1 -1
  40. package/dist/commands/form-view.d.ts.map +1 -1
  41. package/dist/commands/form-view.js +1 -2
  42. package/dist/commands/form-view.js.map +1 -1
  43. package/dist/commands/form.d.ts.map +1 -1
  44. package/dist/commands/form.js +50 -5
  45. package/dist/commands/form.js.map +1 -1
  46. package/dist/commands/project.d.ts.map +1 -1
  47. package/dist/commands/project.js +39 -6
  48. package/dist/commands/project.js.map +1 -1
  49. package/dist/commands/report-admin.js +1 -1
  50. package/dist/commands/report-admin.js.map +1 -1
  51. package/dist/commands/report-query.js +1 -1
  52. package/dist/commands/report-query.js.map +1 -1
  53. package/dist/commands/report.js +1 -1
  54. package/dist/commands/report.js.map +1 -1
  55. package/dist/commands/wf-form-layout-init-reviewed.d.ts +3 -0
  56. package/dist/commands/wf-form-layout-init-reviewed.d.ts.map +1 -0
  57. package/dist/commands/wf-form-layout-init-reviewed.js +71 -0
  58. package/dist/commands/wf-form-layout-init-reviewed.js.map +1 -0
  59. package/dist/commands/wf-form.d.ts +1 -0
  60. package/dist/commands/wf-form.d.ts.map +1 -1
  61. package/dist/commands/wf-form.js +16 -16
  62. package/dist/commands/wf-form.js.map +1 -1
  63. package/dist/commands/workflow-advanced.js +1 -1
  64. package/dist/commands/workflow-advanced.js.map +1 -1
  65. package/dist/commands/workflow-basic-info.js +4 -4
  66. package/dist/commands/workflow-basic-info.js.map +1 -1
  67. package/dist/commands/workflow.js +6 -6
  68. package/dist/commands/workflow.js.map +1 -1
  69. package/dist/index.js +22 -0
  70. package/dist/index.js.map +1 -1
  71. package/dist/services/actionflow/classified_protection_source.d.ts +10 -0
  72. package/dist/services/actionflow/classified_protection_source.d.ts.map +1 -0
  73. package/dist/services/actionflow/classified_protection_source.js +27 -0
  74. package/dist/services/actionflow/classified_protection_source.js.map +1 -0
  75. package/dist/services/actionflow/components/action_eb_add.d.ts.map +1 -1
  76. package/dist/services/actionflow/components/action_eb_add.js +4 -5
  77. package/dist/services/actionflow/components/action_eb_add.js.map +1 -1
  78. package/dist/services/actionflow/components/action_eb_update.d.ts.map +1 -1
  79. package/dist/services/actionflow/components/action_eb_update.js +13 -1
  80. package/dist/services/actionflow/components/action_eb_update.js.map +1 -1
  81. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts +12 -0
  82. package/dist/services/actionflow/components/action_eb_update_compiler.d.ts.map +1 -1
  83. package/dist/services/actionflow/components/action_eb_update_compiler.js +88 -3
  84. package/dist/services/actionflow/components/action_eb_update_compiler.js.map +1 -1
  85. package/dist/services/actionflow/components/approve_create.d.ts.map +1 -1
  86. package/dist/services/actionflow/components/approve_create.js +6 -10
  87. package/dist/services/actionflow/components/approve_create.js.map +1 -1
  88. package/dist/services/actionflow/components/condition.d.ts.map +1 -1
  89. package/dist/services/actionflow/components/condition.js +3 -2
  90. package/dist/services/actionflow/components/condition.js.map +1 -1
  91. package/dist/services/actionflow/components/eb_get_data_by_id.d.ts.map +1 -1
  92. package/dist/services/actionflow/components/eb_get_data_by_id.js +9 -1
  93. package/dist/services/actionflow/components/eb_get_data_by_id.js.map +1 -1
  94. package/dist/services/actionflow/components/send_message.js +1 -1
  95. package/dist/services/actionflow/components/send_message.js.map +1 -1
  96. package/dist/services/actionflow/components/workflow_actions.d.ts.map +1 -1
  97. package/dist/services/actionflow/components/workflow_actions.js +20 -11
  98. package/dist/services/actionflow/components/workflow_actions.js.map +1 -1
  99. package/dist/services/actionflow/context_preflight.d.ts.map +1 -1
  100. package/dist/services/actionflow/context_preflight.js +9 -1
  101. package/dist/services/actionflow/context_preflight.js.map +1 -1
  102. package/dist/services/actionflow/design_client.d.ts +4 -0
  103. package/dist/services/actionflow/design_client.d.ts.map +1 -1
  104. package/dist/services/actionflow/design_client.js +65 -0
  105. package/dist/services/actionflow/design_client.js.map +1 -1
  106. package/dist/services/actionflow/form_source.d.ts +9 -2
  107. package/dist/services/actionflow/form_source.d.ts.map +1 -1
  108. package/dist/services/actionflow/form_source.js +21 -6
  109. package/dist/services/actionflow/form_source.js.map +1 -1
  110. package/dist/services/actionflow/formula_service.d.ts.map +1 -1
  111. package/dist/services/actionflow/formula_service.js +153 -37
  112. package/dist/services/actionflow/formula_service.js.map +1 -1
  113. package/dist/services/actionflow/preflight_service.d.ts +14 -3
  114. package/dist/services/actionflow/preflight_service.d.ts.map +1 -1
  115. package/dist/services/actionflow/preflight_service.js +276 -42
  116. package/dist/services/actionflow/preflight_service.js.map +1 -1
  117. package/dist/services/actionflow/workflow_compiler.d.ts.map +1 -1
  118. package/dist/services/actionflow/workflow_compiler.js +154 -23
  119. package/dist/services/actionflow/workflow_compiler.js.map +1 -1
  120. package/dist/services/form-attachment-settings.d.ts +110 -0
  121. package/dist/services/form-attachment-settings.d.ts.map +1 -0
  122. package/dist/services/form-attachment-settings.js +332 -0
  123. package/dist/services/form-attachment-settings.js.map +1 -0
  124. package/dist/services/form-attachment-upload.d.ts +30 -0
  125. package/dist/services/form-attachment-upload.d.ts.map +1 -0
  126. package/dist/services/form-attachment-upload.js +76 -0
  127. package/dist/services/form-attachment-upload.js.map +1 -0
  128. package/dist/services/form-data-openapi.d.ts +2 -0
  129. package/dist/services/form-data-openapi.d.ts.map +1 -1
  130. package/dist/services/form-data-openapi.js +1 -0
  131. package/dist/services/form-data-openapi.js.map +1 -1
  132. package/dist/services/workflow-layout-init-reviewed.d.ts +35 -0
  133. package/dist/services/workflow-layout-init-reviewed.d.ts.map +1 -0
  134. package/dist/services/workflow-layout-init-reviewed.js +120 -0
  135. package/dist/services/workflow-layout-init-reviewed.js.map +1 -0
  136. package/package.json +1 -1
  137. package/skill-docs/SKILL.md +163 -160
  138. package/skill-docs/_catalog.md +6 -4
  139. package/skill-docs/actionflows/SKILL.md +2 -0
  140. package/skill-docs/actionflows/references/components/ebuilder/ActionEbUpdate.md +2 -0
  141. package/skill-docs/actionflows/references/components/ebuilder/EventButton.md +1 -1
  142. package/skill-docs/actionflows/references/components/logic/Condition.md +2 -0
  143. package/skill-docs/actionflows/references/components/message/SendMessage.md +2 -2
  144. package/skill-docs/actionflows/references/components/workflow/ApproveCommit.md +17 -17
  145. package/skill-docs/actionflows/references/components/workflow/ApproveCreate.md +1 -1
  146. package/skill-docs/actionflows/references/components/workflow/ApproveSave.md +1 -1
  147. package/skill-docs/actionflows/references/components/workflow/ApproveSendBack.md +17 -17
  148. package/skill-docs/assets/sample/api/formApi.js +689 -510
  149. package/skill-docs/assets/sample/app/config.js +4 -0
  150. package/skill-docs/assets/sample/app/fields.js +25 -0
  151. package/skill-docs/assets/sample/entry.js +24 -22
  152. package/skill-docs/assets/sample/eslint.config.cjs +1 -0
  153. package/skill-docs/assets/sample/pages/Items.js +247 -0
  154. package/skill-docs/assets/sample/styles/prototypeStyles.js +137 -0
  155. package/skill-docs/references/coding/guide-edit-backfill.md +102 -150
  156. package/skill-docs/references/coding/guide-form-crud.md +195 -172
  157. package/skill-docs/references/coding/guide-html-to-react.md +250 -0
  158. package/skill-docs/references/coding/guide-page-code.md +194 -167
  159. package/skill-docs/references/coding/guide-page-export.md +27 -18
  160. package/skill-docs/references/coding/ref-compile-rules.md +7 -7
  161. package/skill-docs/references/common/map.md +2 -1
  162. package/skill-docs/references/common/ref-cli-commands.md +14 -6
  163. package/skill-docs/references/components/display-FilePreview.md +5 -4
  164. package/skill-docs/references/form/guide-browser-definition.md +73 -40
  165. package/skill-docs/references/form/guide-field-linkage.md +4 -1
  166. package/skill-docs/references/form/guide-form-attachment-setting.md +95 -0
  167. package/skill-docs/references/form/guide-form-data.md +22 -1
  168. package/skill-docs/references/form/layout/code-block/layout-css.md +41 -0
  169. package/skill-docs/references/form/layout/initialization.md +2 -0
  170. package/skill-docs/references/form/layout/layout-overview.md +8 -0
  171. package/skill-docs/references/form/layout/template/advanced.md +21 -0
  172. package/skill-docs/references/form/layout/template/easy.md +2 -0
  173. package/skill-docs/references/form/layout/template/flow.md +2 -0
  174. package/skill-docs/references/form/layout/template/template-guide.md +3 -1
  175. package/skill-docs/references/form/layout/workflow-layout.md +13 -1
  176. package/skill-docs/references/form/ref-form-fields.md +18 -4
  177. package/skill-docs/references/workflow/guide-workflow-odoc.md +1 -1
  178. package/skill-docs/assets/sample/config/config.js +0 -0
  179. package/skill-docs/assets/sample/config/configLoad.js +0 -0
  180. package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
  181. package/skill-docs/assets/sample/config/config_default.js +0 -0
  182. package/skill-docs/assets/sample/memo.md +0 -0
  183. 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` |