weaver-e10-builder 1.6.0 → 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.
- package/dist/commands/check.d.ts.map +1 -1
- package/dist/commands/check.js +109 -51
- package/dist/commands/check.js.map +1 -1
- package/dist/commands/form-attachment-setting.d.ts +3 -0
- package/dist/commands/form-attachment-setting.d.ts.map +1 -0
- package/dist/commands/form-attachment-setting.js +422 -0
- package/dist/commands/form-attachment-setting.js.map +1 -0
- package/dist/commands/form-data.d.ts.map +1 -1
- package/dist/commands/form-data.js +49 -1
- package/dist/commands/form-data.js.map +1 -1
- package/dist/commands/form-field-linkage.d.ts +6 -1
- package/dist/commands/form-field-linkage.d.ts.map +1 -1
- package/dist/commands/form-field-linkage.js +138 -31
- package/dist/commands/form-field-linkage.js.map +1 -1
- package/dist/commands/form.d.ts.map +1 -1
- package/dist/commands/form.js +47 -2
- package/dist/commands/form.js.map +1 -1
- package/dist/commands/project.d.ts.map +1 -1
- package/dist/commands/project.js +39 -6
- package/dist/commands/project.js.map +1 -1
- package/dist/services/form-attachment-settings.d.ts +110 -0
- package/dist/services/form-attachment-settings.d.ts.map +1 -0
- package/dist/services/form-attachment-settings.js +332 -0
- package/dist/services/form-attachment-settings.js.map +1 -0
- package/dist/services/form-attachment-upload.d.ts +30 -0
- package/dist/services/form-attachment-upload.d.ts.map +1 -0
- package/dist/services/form-attachment-upload.js +76 -0
- package/dist/services/form-attachment-upload.js.map +1 -0
- package/dist/services/form-data-openapi.d.ts +2 -0
- package/dist/services/form-data-openapi.d.ts.map +1 -1
- package/dist/services/form-data-openapi.js +1 -0
- package/dist/services/form-data-openapi.js.map +1 -1
- package/package.json +1 -1
- package/skill-docs/SKILL.md +163 -160
- package/skill-docs/_catalog.md +6 -4
- package/skill-docs/assets/sample/api/formApi.js +689 -510
- package/skill-docs/assets/sample/app/config.js +4 -0
- package/skill-docs/assets/sample/app/fields.js +25 -0
- package/skill-docs/assets/sample/entry.js +24 -22
- package/skill-docs/assets/sample/eslint.config.cjs +1 -0
- package/skill-docs/assets/sample/pages/Items.js +247 -0
- package/skill-docs/assets/sample/styles/prototypeStyles.js +137 -0
- package/skill-docs/references/coding/guide-edit-backfill.md +102 -150
- package/skill-docs/references/coding/guide-form-crud.md +195 -172
- package/skill-docs/references/coding/guide-html-to-react.md +250 -0
- package/skill-docs/references/coding/guide-page-code.md +194 -167
- package/skill-docs/references/coding/guide-page-export.md +27 -18
- package/skill-docs/references/coding/ref-compile-rules.md +7 -7
- package/skill-docs/references/common/map.md +2 -1
- package/skill-docs/references/common/ref-cli-commands.md +13 -6
- package/skill-docs/references/components/display-FilePreview.md +5 -4
- package/skill-docs/references/form/guide-field-linkage.md +4 -1
- package/skill-docs/references/form/guide-form-attachment-setting.md +95 -0
- package/skill-docs/references/form/guide-form-data.md +22 -1
- package/skill-docs/assets/sample/config/config.js +0 -0
- package/skill-docs/assets/sample/config/configLoad.js +0 -0
- package/skill-docs/assets/sample/config/configLoad_default.js +0 -0
- package/skill-docs/assets/sample/config/config_default.js +0 -0
- package/skill-docs/assets/sample/memo.md +0 -0
- package/skill-docs/assets/sample/readme.js +0 -8
|
@@ -1,189 +1,141 @@
|
|
|
1
1
|
# 编辑回显指南
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
编辑已有数据时,`formClient` 返回的行已经把「写入值」「显示名」「选择器对象」分好了,不需要再同时拉 `getSimpleData` 和 `getAllData`。
|
|
4
4
|
|
|
5
5
|
---
|
|
6
6
|
|
|
7
|
-
##
|
|
8
|
-
|
|
9
|
-
### 第一步:加载时同时获取两份数据
|
|
7
|
+
## 一、行里有什么
|
|
10
8
|
|
|
11
9
|
```js
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
]
|
|
18
|
-
|
|
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
|
-
|
|
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
|
-
|
|
36
|
-
var editForm = {};
|
|
37
|
-
Object.keys(emptyForm).forEach(function (key) {
|
|
38
|
-
editForm[key] = rowData._raw[key] || '';
|
|
39
|
-
});
|
|
30
|
+
## 二、打开编辑
|
|
40
31
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
##
|
|
66
|
+
## 三、新增
|
|
100
67
|
|
|
101
|
-
|
|
68
|
+
新增时构造空表单:
|
|
102
69
|
|
|
103
|
-
```
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
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
|
-
|
|
83
|
+
---
|
|
115
84
|
|
|
116
|
-
|
|
85
|
+
## 四、只有 dataId 时怎么回显
|
|
117
86
|
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
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
|
-
|
|
105
|
+
## 五、字段类型映射
|
|
157
106
|
|
|
158
|
-
|
|
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
|
-
|
|
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
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
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` |
|