fmui-base 2.2.85 → 2.2.87
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/README.md +2 -0
- package/lib/db/db.js +31 -0
- package/lib/db/variables.js +2 -0
- package/lib/form/form.js +19 -15
- package/lib/form/formExtHelper.js +152 -0
- package/lib/form/form_common/.placeholder.js +5 -0
- package/lib/form/subForm.js +11 -6
- package/lib/form/table.js +16 -14
- package/lib/process_info/processInfo.js +14 -10
- package/lib/selectMember/README.md +420 -0
- package/lib/selectMember/select.js +51 -3
- package/lib/tblform/FlowCommentPane.js +252 -0
- package/lib/tblform/README.md +483 -0
- package/lib/tblform/TblForm.js +427 -0
- package/lib/tblform/formCommon.js +128 -0
- package/lib/tblform/formFieldProps.js +44 -0
- package/lib/tblform/formSaveUtils.js +117 -0
- package/lib/tblform/index.js +109 -0
- package/lib/tblform/pureFormAdapter.js +159 -0
- package/package.json +1 -1
|
@@ -0,0 +1,483 @@
|
|
|
1
|
+
# TblForm 纯表单组件
|
|
2
|
+
|
|
3
|
+
`TblForm` 是面向**非流程场景**的移动端表单容器组件。与 `src/form/table.jsx`(流程表单)相比,它去除了批示意见、退回意见、流程按钮等流程能力,仅保留表单字段渲染、联动计算、子表及保存逻辑。
|
|
4
|
+
|
|
5
|
+
组件内部自动完成:
|
|
6
|
+
|
|
7
|
+
- 加载表单:`GET /api/m/approve/getPureMobileForm`
|
|
8
|
+
- 保存数据:`POST /api/m/model/formmgr/runtime/runtimeDataSave`
|
|
9
|
+
- 业务扩展:`pages/form_common/{formCode}`(`formCode` 为空时不加载)
|
|
10
|
+
|
|
11
|
+
---
|
|
12
|
+
|
|
13
|
+
## 目录结构
|
|
14
|
+
|
|
15
|
+
```
|
|
16
|
+
src/tblform/
|
|
17
|
+
├── TblForm.jsx # 主组件(推荐直接使用)
|
|
18
|
+
├── FlowCommentPane.jsx # 流程批示意见区(流程页单独使用,TblForm 不包含)
|
|
19
|
+
├── formFieldProps.js # Form/SubForm 公共 props 组装
|
|
20
|
+
├── pureFormAdapter.js # 接口数据适配
|
|
21
|
+
├── formSaveUtils.js # 保存参数组装、getAllEditIds
|
|
22
|
+
├── formCommon.js # form_common 扩展加载与字段变更扩展
|
|
23
|
+
├── index.js # 统一导出
|
|
24
|
+
└── README.md
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
---
|
|
28
|
+
|
|
29
|
+
## 与流程表单 Table 的区别
|
|
30
|
+
|
|
31
|
+
| 能力 | `form/table`(流程) | `tblform/TblForm`(纯表单) |
|
|
32
|
+
|------|----------------------|------------------------------|
|
|
33
|
+
| 入参 | 大量流程参数(批示意见、commentField 等) | **仅需 formId、editType、dataId** |
|
|
34
|
+
| 数据加载 | 流程接口 `getMobileForm` | `getPureMobileForm` |
|
|
35
|
+
| 数据保存 | `saveForm`(流程草稿) | `runtimeDataSave` |
|
|
36
|
+
| 批示意见 UI | 内置 | 无(可用 `FlowCommentPane` 单独挂载) |
|
|
37
|
+
| 业务扩展 | `pages/flow_common/{module}` | `pages/form_common/{formCode}` |
|
|
38
|
+
|
|
39
|
+
---
|
|
40
|
+
|
|
41
|
+
## 快速开始
|
|
42
|
+
|
|
43
|
+
### 1. 引入组件
|
|
44
|
+
|
|
45
|
+
```jsx
|
|
46
|
+
import React from 'react';
|
|
47
|
+
import Group from 'saltui/lib/Group';
|
|
48
|
+
import Button from 'saltui/lib/Button';
|
|
49
|
+
import TblForm from '../tblform/TblForm';
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
### 2. 最简用法(三个必填参数)
|
|
53
|
+
|
|
54
|
+
```jsx
|
|
55
|
+
export default class PureFormPage extends React.Component {
|
|
56
|
+
render() {
|
|
57
|
+
return (
|
|
58
|
+
<Group.List>
|
|
59
|
+
<TblForm
|
|
60
|
+
formId="4028b28a9cf4442a019cf45667820020"
|
|
61
|
+
editType="add"
|
|
62
|
+
dataId=""
|
|
63
|
+
/>
|
|
64
|
+
</Group.List>
|
|
65
|
+
);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
| 参数 | 类型 | 必填 | 说明 |
|
|
71
|
+
|------|------|------|------|
|
|
72
|
+
| `formId` | string | 是 | 表单 ID |
|
|
73
|
+
| `editType` | string | 是 | `add` 新增 / `edit` 编辑 / `view` 查看 |
|
|
74
|
+
| `dataId` | string | 否 | 业务数据 ID;新增传 `''`,编辑/查看传已有 ID |
|
|
75
|
+
|
|
76
|
+
### 3. 带保存按钮的完整示例
|
|
77
|
+
|
|
78
|
+
```jsx
|
|
79
|
+
export default class PureFormPage extends React.Component {
|
|
80
|
+
constructor(props) {
|
|
81
|
+
super(props);
|
|
82
|
+
this.state = {
|
|
83
|
+
formId: '4028b28a9cf4442a019cf45667820020',
|
|
84
|
+
editType: 'add',
|
|
85
|
+
dataId: '',
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
handleSave = () => {
|
|
90
|
+
this.refs.tblForm.save({
|
|
91
|
+
moduleCode: 'approve',
|
|
92
|
+
formType: '4',
|
|
93
|
+
}).then((result) => {
|
|
94
|
+
// result.existDataId 保存后的数据 ID
|
|
95
|
+
// result.formHtmlVersion / result.formJsonVersion
|
|
96
|
+
this.setState({ dataId: result.existDataId, editType: 'edit' });
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
render() {
|
|
101
|
+
const { formId, editType, dataId } = this.state;
|
|
102
|
+
return (
|
|
103
|
+
<div>
|
|
104
|
+
<Group.List>
|
|
105
|
+
<TblForm
|
|
106
|
+
ref="tblForm"
|
|
107
|
+
formId={formId}
|
|
108
|
+
editType={editType}
|
|
109
|
+
dataId={dataId}
|
|
110
|
+
onChange={(formData) => {
|
|
111
|
+
console.log('表单变更', formData);
|
|
112
|
+
}}
|
|
113
|
+
onLoad={(formData, meta) => {
|
|
114
|
+
console.log('加载完成', formData, meta);
|
|
115
|
+
}}
|
|
116
|
+
onSaveSuccess={(result, formData) => {
|
|
117
|
+
console.log('保存成功', result.existDataId);
|
|
118
|
+
}}
|
|
119
|
+
/>
|
|
120
|
+
</Group.List>
|
|
121
|
+
|
|
122
|
+
{editType !== 'view' ? (
|
|
123
|
+
<Button type="primary" onClick={this.handleSave}>
|
|
124
|
+
保存
|
|
125
|
+
</Button>
|
|
126
|
+
) : null}
|
|
127
|
+
</div>
|
|
128
|
+
);
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
---
|
|
134
|
+
|
|
135
|
+
## Props 说明
|
|
136
|
+
|
|
137
|
+
### 核心参数
|
|
138
|
+
|
|
139
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
140
|
+
|------|------|--------|------|
|
|
141
|
+
| `formId` | string | - | 表单 ID |
|
|
142
|
+
| `editType` | string | `'add'` | 编辑类型,见下表 |
|
|
143
|
+
| `dataId` | string | `''` | 数据 ID |
|
|
144
|
+
| `formCode` | string | `''` | 扩展编码;不传则使用接口返回的 `form.formcode` |
|
|
145
|
+
|
|
146
|
+
**editType 与内部 status 映射:**
|
|
147
|
+
|
|
148
|
+
| editType | status | 字段表现 |
|
|
149
|
+
|----------|--------|----------|
|
|
150
|
+
| `add` | `0` | 可编辑(新增) |
|
|
151
|
+
| `edit` | `1` | 可编辑(修改) |
|
|
152
|
+
| `view` | `2` | 只读(查看) |
|
|
153
|
+
|
|
154
|
+
### 回调参数(可选)
|
|
155
|
+
|
|
156
|
+
| 参数 | 类型 | 说明 |
|
|
157
|
+
|------|------|------|
|
|
158
|
+
| `onChange` | `(formData, itemParam?, subTblNo?) => void` | 字段变更后触发,`formData` 与 `processInfo.editFormData` 结构一致 |
|
|
159
|
+
| `onLoad` | `(formData, meta) => void` | 表单加载并渲染前适配完成 |
|
|
160
|
+
| `onSaveSuccess` | `(result, formData) => void` | 保存成功(`result.code === '1'`) |
|
|
161
|
+
|
|
162
|
+
---
|
|
163
|
+
|
|
164
|
+
## 实例方法(ref)
|
|
165
|
+
|
|
166
|
+
通过 `ref` 调用:
|
|
167
|
+
|
|
168
|
+
```jsx
|
|
169
|
+
<TblForm ref="tblForm" ... />
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
| 方法 | 返回值 | 说明 |
|
|
173
|
+
|------|--------|------|
|
|
174
|
+
| `getEditFormData()` | Object | 当前表单数据(同 `editFormData`) |
|
|
175
|
+
| `save(options?)` | Promise | 调用保存接口 |
|
|
176
|
+
|
|
177
|
+
### save(options) 可选参数
|
|
178
|
+
|
|
179
|
+
| 参数 | 类型 | 默认值 | 说明 |
|
|
180
|
+
|------|------|--------|------|
|
|
181
|
+
| `formType` | string | `'4'` | 表单类型(与 PC 端一致) |
|
|
182
|
+
| `moduleCode` | string | `'approve'` | 模块编码,写入 `moduleCode` |
|
|
183
|
+
| `logField` | string | `''` | 操作日志字段 |
|
|
184
|
+
| `formVersion` | string | `''` | 表单版本号 |
|
|
185
|
+
| `showToast` | boolean | `true` | 是否自动 Toast 提示 |
|
|
186
|
+
|
|
187
|
+
---
|
|
188
|
+
|
|
189
|
+
## 接口说明
|
|
190
|
+
|
|
191
|
+
### 加载:getPureMobileForm
|
|
192
|
+
|
|
193
|
+
- **地址**:`/api/m/approve/getPureMobileForm`
|
|
194
|
+
- **方法**:GET
|
|
195
|
+
- **参数**:`formId`、`editType`、`dataId`
|
|
196
|
+
- **鉴权**:Header `Authorization: Bearer {token}`(项目统一处理)
|
|
197
|
+
|
|
198
|
+
**响应结构(节选):**
|
|
199
|
+
|
|
200
|
+
```json
|
|
201
|
+
{
|
|
202
|
+
"success": true,
|
|
203
|
+
"code": "0",
|
|
204
|
+
"content": {
|
|
205
|
+
"form": {
|
|
206
|
+
"formId": "4028b28a9cf4442a019cf45667820020",
|
|
207
|
+
"formcode": "test_lizhao0316",
|
|
208
|
+
"formTblName": "lztest20260312",
|
|
209
|
+
"item": [ /* 字段定义 */ ]
|
|
210
|
+
},
|
|
211
|
+
"formData": {
|
|
212
|
+
"formId": "4028b28a9cf4442a019cf45667820020",
|
|
213
|
+
"dataId": "",
|
|
214
|
+
"mainTblName": "lztest20260312",
|
|
215
|
+
"mainTblData": [],
|
|
216
|
+
"subTbl": []
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
```
|
|
221
|
+
|
|
222
|
+
### 保存:runtimeDataSave
|
|
223
|
+
|
|
224
|
+
- **地址**:`/api/m/model/formmgr/runtime/runtimeDataSave`
|
|
225
|
+
- **方法**:POST(`application/x-www-form-urlencoded`)
|
|
226
|
+
|
|
227
|
+
| 参数 | 说明 |
|
|
228
|
+
|------|------|
|
|
229
|
+
| `runtimeData` | `JSON.stringify(editFormData)`,结构与 `processInfo.state.editFormData` 一致 |
|
|
230
|
+
| `editType` | `add` / `edit` |
|
|
231
|
+
| `allEditIds` | 主表/子表/关联表已有记录 id,逗号分隔 |
|
|
232
|
+
| `existDataId` | 新增时首次为空;再次保存传上次返回的 `existDataId` |
|
|
233
|
+
| `formType` | 默认 `4` |
|
|
234
|
+
| `moduleCode` | 模块编码 |
|
|
235
|
+
| `formVersion` | 表单版本(可选) |
|
|
236
|
+
| `logField` | 日志字段(可选) |
|
|
237
|
+
|
|
238
|
+
**成功响应(节选):**
|
|
239
|
+
|
|
240
|
+
```json
|
|
241
|
+
{
|
|
242
|
+
"success": true,
|
|
243
|
+
"content": {
|
|
244
|
+
"code": "1",
|
|
245
|
+
"info": "保存成功",
|
|
246
|
+
"existDataId": "xxxxxxxx",
|
|
247
|
+
"formHtmlVersion": "1",
|
|
248
|
+
"formJsonVersion": "1"
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
```
|
|
252
|
+
|
|
253
|
+
---
|
|
254
|
+
|
|
255
|
+
## editFormData 数据结构
|
|
256
|
+
|
|
257
|
+
与流程页 `processInfo.jsx` 中 `editFormData` **完全一致**,便于复用原有校验、提交逻辑。
|
|
258
|
+
|
|
259
|
+
```javascript
|
|
260
|
+
{
|
|
261
|
+
formId: '4028b28a9cf4442a019cf45667820020',
|
|
262
|
+
dataId: '', // 保存后由 existDataId 回写
|
|
263
|
+
mainTblName: 'lztest20260312',
|
|
264
|
+
mainTblData: [
|
|
265
|
+
{ key: 'f11$', value: 'xxx', required: false, /* ... */ }
|
|
266
|
+
],
|
|
267
|
+
subTbl: [
|
|
268
|
+
{
|
|
269
|
+
subTblName: 'lztest20260316',
|
|
270
|
+
subTblData: [
|
|
271
|
+
[ { key: 'f2', value: 'yyy' } ]
|
|
272
|
+
]
|
|
273
|
+
}
|
|
274
|
+
],
|
|
275
|
+
relatedTbl: [],
|
|
276
|
+
formItem: [ /* 字段元数据 */ ],
|
|
277
|
+
linkFields: [],
|
|
278
|
+
trans: false
|
|
279
|
+
}
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
---
|
|
283
|
+
|
|
284
|
+
## 业务扩展(form_common)
|
|
285
|
+
|
|
286
|
+
### 扩展文件路径
|
|
287
|
+
|
|
288
|
+
| 类型 | 路径/约定 |
|
|
289
|
+
|------|-----------|
|
|
290
|
+
| 表单级扩展模块 | 业务工程 `pages/form_common/{formCode}.js`(推荐) |
|
|
291
|
+
| 表单级 mobileExt | 全局变量 `{formCode}_mobileExt` |
|
|
292
|
+
| 全局模块(备选) | `window.{formCode}_formCommon` |
|
|
293
|
+
|
|
294
|
+
> **说明**:`fmui-base` 通过包内 `lib/form/form_common` 的 `require.context` 加载扩展,**不会**再 `require('pages/form_common/...')`,避免宿主未建目录时 webpack 报 `Module not found`。业务文件仍建议放在 `pages/form_common/`,并在宿主 webpack 中配置 alias(见下)。
|
|
295
|
+
|
|
296
|
+
**宿主 webpack alias(approve 等工程必配一次):**
|
|
297
|
+
|
|
298
|
+
```javascript
|
|
299
|
+
const path = require('path');
|
|
300
|
+
|
|
301
|
+
// webpack resolve.alias 中增加:
|
|
302
|
+
[path.resolve(__dirname, 'node_modules/fmui-base/lib/form/form_common')]: path.resolve(
|
|
303
|
+
__dirname,
|
|
304
|
+
'pages/form_common'
|
|
305
|
+
),
|
|
306
|
+
```
|
|
307
|
+
|
|
308
|
+
未配置 alias 时仅加载包内占位模块,扩展不生效但不报错;也可在页面入口挂载 `window.xxx_formCommon`。
|
|
309
|
+
|
|
310
|
+
**formCode 来源优先级:**
|
|
311
|
+
|
|
312
|
+
1. 组件 props:`formCode`
|
|
313
|
+
2. 接口返回:`content.form.formcode`
|
|
314
|
+
3. 为空 → 不加载扩展(不报错)
|
|
315
|
+
|
|
316
|
+
### 扩展示例
|
|
317
|
+
|
|
318
|
+
新建 `pages/form_common/test_lizhao0316.js`:
|
|
319
|
+
|
|
320
|
+
```javascript
|
|
321
|
+
export default {
|
|
322
|
+
/** 字段变更(TblForm.change 时调用) */
|
|
323
|
+
dealwithFormItemChange(itemParam, table) {
|
|
324
|
+
// itemParam: 当前字段信息
|
|
325
|
+
// table: TblForm 实例(可访问 refs)
|
|
326
|
+
},
|
|
327
|
+
|
|
328
|
+
/** 字段参数处理(Form 加载字段时调用) */
|
|
329
|
+
dealwithCommonFormParam(itemParam, form) {
|
|
330
|
+
return itemParam;
|
|
331
|
+
},
|
|
332
|
+
|
|
333
|
+
/** 保存前校验(可选) */
|
|
334
|
+
saveBefore(type, state, success, fail) {
|
|
335
|
+
// type: 2 表示保存
|
|
336
|
+
success();
|
|
337
|
+
},
|
|
338
|
+
};
|
|
339
|
+
```
|
|
340
|
+
|
|
341
|
+
可选全局扩展 `test_lizhao0316_mobileExt`:
|
|
342
|
+
|
|
343
|
+
```javascript
|
|
344
|
+
window.test_lizhao0316_mobileExt = {
|
|
345
|
+
dealwithFormItemChangeExt(itemParam, table, callback) {
|
|
346
|
+
// callback([{ type: 'main', key: 'f11$', data: '联动值' }]);
|
|
347
|
+
},
|
|
348
|
+
dealwithFormParamExt(itemParam, form) {
|
|
349
|
+
return itemParam;
|
|
350
|
+
},
|
|
351
|
+
};
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
### 手动加载扩展(高级)
|
|
355
|
+
|
|
356
|
+
```javascript
|
|
357
|
+
import { loadFormCommon, getFormCommon } from '../tblform';
|
|
358
|
+
|
|
359
|
+
loadFormCommon('test_lizhao0316');
|
|
360
|
+
const ext = getFormCommon();
|
|
361
|
+
if (ext && ext.dealwithFormItemChange) {
|
|
362
|
+
// ...
|
|
363
|
+
}
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
---
|
|
367
|
+
|
|
368
|
+
## 流程页组合用法(表单 + 批示意见)
|
|
369
|
+
|
|
370
|
+
纯表单用 `TblForm`,流程批示用 `FlowCommentPane`(与 `TblForm` 分离):
|
|
371
|
+
|
|
372
|
+
```jsx
|
|
373
|
+
import React from 'react';
|
|
374
|
+
import TblForm from '../tblform/TblForm';
|
|
375
|
+
import FlowCommentPane from '../tblform/FlowCommentPane';
|
|
376
|
+
|
|
377
|
+
export default class ProcessFormTab extends React.Component {
|
|
378
|
+
render() {
|
|
379
|
+
const t = this;
|
|
380
|
+
return (
|
|
381
|
+
<React.Fragment>
|
|
382
|
+
<TblForm
|
|
383
|
+
ref="tblForm"
|
|
384
|
+
formId={t.state.formId}
|
|
385
|
+
editType={t.state.editType}
|
|
386
|
+
dataId={t.state.dataId}
|
|
387
|
+
onChange={t.change}
|
|
388
|
+
/>
|
|
389
|
+
<FlowCommentPane
|
|
390
|
+
commentField={t.state.commentField}
|
|
391
|
+
commentDefaultList={t.state.commentDefaultList}
|
|
392
|
+
commentBackList={t.state.commentBackList}
|
|
393
|
+
hasCommentField={t.state.hasCommentField}
|
|
394
|
+
newspyj={t.state.newspyj}
|
|
395
|
+
defaultValue={t.state.defaultValue}
|
|
396
|
+
commentUpload={t.state.commentUpload}
|
|
397
|
+
commentAttitude={t.state.commentAttitude}
|
|
398
|
+
inscriptionShow={t.state.inscriptionShow}
|
|
399
|
+
module={t.state.module}
|
|
400
|
+
/>
|
|
401
|
+
</React.Fragment>
|
|
402
|
+
);
|
|
403
|
+
}
|
|
404
|
+
}
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
---
|
|
408
|
+
|
|
409
|
+
## 工具函数导出
|
|
410
|
+
|
|
411
|
+
```javascript
|
|
412
|
+
import {
|
|
413
|
+
TblForm,
|
|
414
|
+
FlowCommentPane,
|
|
415
|
+
normalizePureMobileForm,
|
|
416
|
+
editTypeToStatus,
|
|
417
|
+
getAllEditIds,
|
|
418
|
+
buildRuntimeDataSaveParams,
|
|
419
|
+
isRuntimeSaveSuccess,
|
|
420
|
+
loadFormCommon,
|
|
421
|
+
getFormCommon,
|
|
422
|
+
} from '../tblform';
|
|
423
|
+
```
|
|
424
|
+
|
|
425
|
+
| 函数 | 说明 |
|
|
426
|
+
|------|------|
|
|
427
|
+
| `normalizePureMobileForm(content, editType)` | 将 `getPureMobileForm` 响应转为组件内部状态 |
|
|
428
|
+
| `editTypeToStatus(editType)` | `add/edit/view` → `0/1/2` |
|
|
429
|
+
| `getAllEditIds(formData)` | 收集保存用 `allEditIds` |
|
|
430
|
+
| `buildRuntimeDataSaveParams(formData, options)` | 组装 `runtimeDataSave` 请求体 |
|
|
431
|
+
| `isRuntimeSaveSuccess(content)` | 判断 `content.code === '1'` |
|
|
432
|
+
|
|
433
|
+
---
|
|
434
|
+
|
|
435
|
+
## 常见问题
|
|
436
|
+
|
|
437
|
+
### 1. 新增保存后如何继续编辑?
|
|
438
|
+
|
|
439
|
+
第一次 `save` 成功后,组件会把 `existDataId` 写入内部 `savedDataId` 和 `editFormData.dataId`。再次点击保存时,会以 `existDataId` 传给后端(符合「新增后再次保存」逻辑)。
|
|
440
|
+
|
|
441
|
+
建议业务页同步更新 state:
|
|
442
|
+
|
|
443
|
+
```javascript
|
|
444
|
+
onSaveSuccess={(result) => {
|
|
445
|
+
this.setState({
|
|
446
|
+
dataId: result.existDataId,
|
|
447
|
+
editType: 'edit',
|
|
448
|
+
});
|
|
449
|
+
}}
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
### 2. formCode 为空会怎样?
|
|
453
|
+
|
|
454
|
+
不会加载任何扩展模块,不影响表单正常渲染,仅无自定义扩展逻辑。
|
|
455
|
+
|
|
456
|
+
### 2.1 启动报 Can't resolve 'pages/form_common'?
|
|
457
|
+
|
|
458
|
+
请升级 `fmui-base` 至已改用包内 `form_common` 的版本,并在宿主 webpack 为 `lib/form/form_common` 配置 alias 指向业务的 `pages/form_common`(见上文)。不要直接在 `fmui-base` 里写 `require('pages/form_common/...')`。
|
|
459
|
+
|
|
460
|
+
### 3. 为何不用 flow_common?
|
|
461
|
+
|
|
462
|
+
`TblForm` 构造时传入 `module: ''`,`table.jsx` 在 `module` 为空时**不加载** `flow_common`,避免与流程扩展混用。字段级扩展通过 props `formCode` 走 `pages/form_common/{formCode}`。
|
|
463
|
+
|
|
464
|
+
### 4. 查看模式如何禁用保存?
|
|
465
|
+
|
|
466
|
+
`editType="view"` 时字段只读;页面层不渲染保存按钮即可。
|
|
467
|
+
|
|
468
|
+
---
|
|
469
|
+
|
|
470
|
+
## 依赖说明
|
|
471
|
+
|
|
472
|
+
- React + SaltUI(`Loading`、`Toast` 等)
|
|
473
|
+
- `../form/form`、`../form/subForm`、`../form/table`(继承联动计算能力)
|
|
474
|
+
- `../db/db`(`DB.form.getPureMobileForm`、`DB.form.runtimeDataSave`)
|
|
475
|
+
- 全局方法:`getLoginUserInfo()`(鉴权)
|
|
476
|
+
|
|
477
|
+
---
|
|
478
|
+
|
|
479
|
+
## 版本记录
|
|
480
|
+
|
|
481
|
+
| 版本 | 说明 |
|
|
482
|
+
|------|------|
|
|
483
|
+
| 1.0.0 | 初始版本:纯表单加载/保存、form_common 扩展、FlowCommentPane 分离 |
|