cloud-web-corejs 1.0.54-dev.714 → 1.0.54-dev.716
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/package.json +1 -1
- package/src/components/xform/XFormTabContainer//346/226/260/345/242/236/351/241/265/347/255/276/346/250/241/345/274/217-/350/220/275/345/234/260/345/256/236/346/226/275/346/226/207/346/241/243.md +232 -0
- package/src/components/xform/docs//345/257/271/346/257/224/345/212/237/350/203/275/350/220/275/345/234/260/346/226/271/346/241/210.md +563 -0
- package/src/components/xform/form-designer/form-widget/field-widget/cascader-widget.vue +48 -0
- package/src/components/xform/form-designer/form-widget/field-widget/fieldMixin.js +60 -0
- package/src/components/xform/form-designer/form-widget/field-widget/form-item-wrapper.vue +116 -13
- package/src/components/xform/form-designer/form-widget/field-widget/mixins/autocomplete-mixin.js +5 -0
- package/src/components/xform/form-designer/form-widget/field-widget/mixins/vabsearch-mixin.js +13 -0
- package/src/components/xform/form-designer/form-widget/field-widget/status-widget.vue +11 -0
- package/src/components/xform/form-designer/form-widget/field-widget/switch-widget.vue +9 -1
- package/src/components/xform/form-designer/widget-panel/index.vue +29 -0
- package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +183 -0
- package/src/components/xform/form-render/compareDelList.vue +83 -0
- package/src/components/xform/form-render/compareView.vue +76 -0
- package/src/components/xform/form-render/container-item/data-table-item.vue +15 -0
- package/src/components/xform/form-render/container-item/data-table-mixin.js +19 -0
- package/src/components/xform/form-render/index.vue +8 -1
- package/src/components/xform/form-render/indexMixin.js +798 -3
- package/src/components/xform/lang/en-US_extension.js +4 -0
- package/src/components/xform/lang/zh-CN.js +4 -0
- package/src/components/xform/mixins/defaultHandle.js +17 -0
package/package.json
CHANGED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
# xform 表单「新增页签模式」落地实施文档
|
|
2
|
+
|
|
3
|
+
> 本文在 `新增页签模式实现方案.md`(方案设计)基础上,**逐条对照实代码核实**后形成的落地版。
|
|
4
|
+
> 所有行号锚点均已在当前代码中验证;对方案中标为"风险待验证"的透传链路给出确认结论。
|
|
5
|
+
> 目标:去掉固定「常规」页签承载新增 → 新增打开独立可关闭页签(标题"新增")→ 保存后本页变编辑态(标题变单号)→ 提交(启动流程)后可配置「关闭页签回列表刷新」或「刷新本页」。
|
|
6
|
+
|
|
7
|
+
---
|
|
8
|
+
|
|
9
|
+
## 一、需求拆解
|
|
10
|
+
|
|
11
|
+
| # | 需求 | 语义 |
|
|
12
|
+
|---|------|------|
|
|
13
|
+
| 1 | 去掉常规 | 启用本模式后,新增不再走固定「常规」页签(`name="first"`);列表页签保留,新增走**动态可关闭页签** |
|
|
14
|
+
| 2 | 新增打开页签(页签名"新增") | 点「新增」→ 新开标题"新增"的可关闭页签,渲染新增表单(`addFormCode`) |
|
|
15
|
+
| 3 | 保存后刷新本页变编辑态(页签名为单号) | 保存成功后:当前页签标题由"新增"改为返回单号(`res.objx`);`dataId` 更新;`formCode` 切 `editFormCode`;表单重载进编辑态。**不新开页签、不切列表** |
|
|
16
|
+
| 4 | 提交(启动流程)后可配置 | 新增 `submitBehavior` 枚举:`closeToList`(关闭当前页签→切列表→刷新列表)/ `refreshCurrent`(刷新当前页签,保持编辑态) |
|
|
17
|
+
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
## 二、代码锚点(均已核实,行号为当前代码)
|
|
21
|
+
|
|
22
|
+
| 锚点 | 位置 | 核实结论 |
|
|
23
|
+
|------|------|---------|
|
|
24
|
+
| 「常规」页签定义 | `views/user/form/view/list.vue:10` | `<el-tab-pane :label="$t2('常规')" name="first">` ✅ |
|
|
25
|
+
| `openEditDialog` | `views/user/form/view/list.vue:269` | 现有 `multiTabEnabled && dataId` 分支在 `:302`,新增(`!dataId`)走 else ✅ |
|
|
26
|
+
| `reload` | `views/user/form/view/list.vue:346` | 存在,保存后经此回调 ✅ |
|
|
27
|
+
| `formConfig` 默认值 | `components/xform/form-designer/designer.js`(含 `multiTabEnabled`/`multiTabLabelField`) | 在此加 3 个字段 |
|
|
28
|
+
| 配置 UI 分组 | `components/xform/form-designer/setting-panel/form-setting.vue` | 加新 collapse 分组 |
|
|
29
|
+
| `saveDefaultHandle` | `components/xform/mixins/defaultHandle.js:153` | success 里调 `reloadForm({updateParam:{dataId:res.objx, formCode:editFormCode}})`(`:190`)✅ |
|
|
30
|
+
| `saveAndSubmitWfHandle` | `components/xform/mixins/defaultHandle.js:113` | `openStartWfDialog(formRef,{...})`(`:141`)当前**未传** `onStartSuccess` ✅ |
|
|
31
|
+
| `switchToListTab` | `components/xform/form-render/indexMixin.js:2774` | 切列表页签并 `reloadForm()` 刷新 ✅ |
|
|
32
|
+
| `getListPageRef` | `components/xform/form-render/indexMixin.js:2734` | 存在 ✅ |
|
|
33
|
+
| `reloadForm` | `components/xform/form-render/indexMixin.js:2792` | 存在,透传 updateParam ✅ |
|
|
34
|
+
| `openStartWfDialog` | `components/wf/wfUtil.js:242` | 把整个 `option` 塞进 wfStartDialog propsData(`:255`)✅ |
|
|
35
|
+
| `startSubmitHanlde` | `components/wf/wf.js:1817` | `:1836-1839` 读 `this.option.onStartSuccess` 分支,无则 `$baseReload()` ✅ |
|
|
36
|
+
| x-tabs API | `components/vb-tabs/x-tabs.vue` | `openEditTab`(`:49`)、`removeTab`(`:82`)、`activeName`/`tabName` ✅ |
|
|
37
|
+
|
|
38
|
+
### ⭐ 关键修正(相对方案文档)
|
|
39
|
+
|
|
40
|
+
方案文档把「`onStartSuccess` 是否从 `openStartWfDialog` 透传到 `startSubmitHanlde`」列为**最大风险、需先验证**。实代码追踪结论:**已透传、能跑通**:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
defaultHandle → openStartWfDialog(formRef, option)
|
|
44
|
+
└─ wfUtil.js:255 propsData.option = option(整体传入 wfStartDialog)
|
|
45
|
+
└─ wf.js:1820 let option = this.option
|
|
46
|
+
└─ wf.js:1836-1839 option.onStartSuccess ? option.onStartSuccess() : $baseReload()
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
**因此:改造点 4 只需在 `saveAndSubmitWfHandle` 的 `openStartWfDialog` 调用里多传一个 `onStartSuccess`;方案里的"改造点 5 改 wf.js"不需要。**
|
|
50
|
+
|
|
51
|
+
---
|
|
52
|
+
|
|
53
|
+
## 三、配置项设计(新增 3 个 formConfig 字段)
|
|
54
|
+
|
|
55
|
+
| 字段 | 类型 | 默认 | 含义 | 依赖 |
|
|
56
|
+
|------|------|------|------|------|
|
|
57
|
+
| `addTabEnabled` | Boolean | `false` | 本模式总开关。开启后新增打开独立页签,不走「常规」 | 无 |
|
|
58
|
+
| `addTabLabel` | String | `"新增"` | 新增页签初始标题 | `addTabEnabled` |
|
|
59
|
+
| `submitBehavior` | String | `"closeToList"` | 提交后行为:`closeToList` / `refreshCurrent` | `wfEnabled` |
|
|
60
|
+
|
|
61
|
+
> 与现有 `multiTabEnabled`(控制**编辑**页签是否多开)互不干扰,可叠加。
|
|
62
|
+
|
|
63
|
+
---
|
|
64
|
+
|
|
65
|
+
## 四、改造点(代码骨架,落地时以实代码微调)
|
|
66
|
+
|
|
67
|
+
### 改造点 1:`designer.js` — formConfig 默认值
|
|
68
|
+
|
|
69
|
+
在 `multiTabEnabled` 附近新增:
|
|
70
|
+
|
|
71
|
+
```js
|
|
72
|
+
addTabEnabled: false, // 新增打开独立页签
|
|
73
|
+
addTabLabel: "新增", // 新增页签初始标题
|
|
74
|
+
submitBehavior: "closeToList", // closeToList | refreshCurrent
|
|
75
|
+
```
|
|
76
|
+
|
|
77
|
+
### 改造点 2:`list.vue` `openEditDialog` — 新增页签分支
|
|
78
|
+
|
|
79
|
+
在现有 `if (multiTabEnabled && dataId) {...} else {...}` 之间插入新增分支:
|
|
80
|
+
|
|
81
|
+
```js
|
|
82
|
+
// dataId 为空 = 新增;tabLabelField 取 multiTabLabelField
|
|
83
|
+
let addTabEnabled = formConfig.addTabEnabled && !dataId && tabLabelField;
|
|
84
|
+
|
|
85
|
+
if (multiTabEnabled && dataId) {
|
|
86
|
+
// —— 现有编辑页签分支,保持不变 ——
|
|
87
|
+
this.$refs.xTabs.openEditTab(row, param, {
|
|
88
|
+
tabParam: { formCode, tabLabelField, tabName: formCode + dataId },
|
|
89
|
+
});
|
|
90
|
+
} else if (addTabEnabled) {
|
|
91
|
+
// ★ 新增页签分支:虚拟 row 让标题先显示"新增"
|
|
92
|
+
let addLabel = formConfig.addTabLabel || "新增";
|
|
93
|
+
let virtualRow = { ...row };
|
|
94
|
+
virtualRow[tabLabelField] = addLabel;
|
|
95
|
+
let tabName = "add_" + Date.now() + "_" + Math.random().toString(36).slice(2, 6);
|
|
96
|
+
this.$refs.xTabs.openEditTab(virtualRow, param, {
|
|
97
|
+
tabParam: { formCode, tabLabelField, tabName },
|
|
98
|
+
});
|
|
99
|
+
} else {
|
|
100
|
+
// —— 现有「常规」页签分支,保持不变(向后兼容) ——
|
|
101
|
+
}
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
> 依赖 `x-tabs` 的 `tabNameEnable=true`(`x-tabs:76`)才会用自定义 `tabName`,需确认列表页 x-tabs 已开启该 prop。
|
|
105
|
+
|
|
106
|
+
### 改造点 3:`list.vue` `reload` — 保存后把标题改为单号
|
|
107
|
+
|
|
108
|
+
`saveDefaultHandle` 成功 → `reloadForm({updateParam})` → emit `reload` → 此处:
|
|
109
|
+
|
|
110
|
+
```js
|
|
111
|
+
let updateParam = param?.updateParam;
|
|
112
|
+
let newDataId = updateParam?.dataId;
|
|
113
|
+
if (newDataId && this.$refs.xTabs) {
|
|
114
|
+
let activeName = this.$refs.xTabs.activeName;
|
|
115
|
+
let tab = this.$refs.xTabs.tabs.find(t => t.tabName === activeName);
|
|
116
|
+
if (tab && /^add_/.test(tab.tabName) && tab.tabLabelField) {
|
|
117
|
+
this.$set(tab.data, tab.tabLabelField, newDataId); // 标题响应式变单号
|
|
118
|
+
tab.dataId = newDataId;
|
|
119
|
+
if (updateParam.formCode) tab.formCode = updateParam.formCode;
|
|
120
|
+
// 待定:是否把 tab.tabName 改为 formCode+newDataId(见待定项 4)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
```
|
|
124
|
+
|
|
125
|
+
> `reloadForm` 已通过 `updateParam` 把 `dataId`/`formCode` 透传给 vFormRender,表单会自动重载进编辑态,无需额外处理。
|
|
126
|
+
|
|
127
|
+
### 改造点 4:`defaultHandle.js` `saveAndSubmitWfHandle` — 注入 onStartSuccess
|
|
128
|
+
|
|
129
|
+
```js
|
|
130
|
+
let submitBehavior = formConfig.submitBehavior || "closeToList";
|
|
131
|
+
// ... 在 success 回调里:
|
|
132
|
+
openStartWfDialog(formRef, {
|
|
133
|
+
objId: res.objx,
|
|
134
|
+
wfCode: reportTemplate.objTypeCode,
|
|
135
|
+
formCode: reportTemplate.formCode,
|
|
136
|
+
serviceId: reportTemplate.serviceName,
|
|
137
|
+
skipStartConfirm: true,
|
|
138
|
+
onStartSuccess: () => { // ★ 新增
|
|
139
|
+
if (submitBehavior === "refreshCurrent") {
|
|
140
|
+
formRef.$baseReload(); // 刷新当前页签,保持编辑态
|
|
141
|
+
} else {
|
|
142
|
+
formRef.switchToListTab({ handleType: "reload" }); // 切列表 + 刷新
|
|
143
|
+
let xTabs = formRef.getListPageRef?.()?.$refs?.xTabs;
|
|
144
|
+
let currentName = xTabs?.activeName;
|
|
145
|
+
if (xTabs && currentName && /^add_|^edit_/.test(currentName)) {
|
|
146
|
+
xTabs.removeTab(currentName); // 关闭当前动态页签
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
},
|
|
150
|
+
});
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### 改造点 5:`form-setting.vue` — 配置 UI
|
|
154
|
+
|
|
155
|
+
新增 collapse 分组「页签交互模式」:`addTabEnabled` 开关、`addTabLabel` 输入、`submitBehavior` 单选(关闭页签回列表刷新 / 刷新当前页签)。
|
|
156
|
+
|
|
157
|
+
---
|
|
158
|
+
|
|
159
|
+
## 五、端到端流程
|
|
160
|
+
|
|
161
|
+
**新增→保存→编辑态**
|
|
162
|
+
```
|
|
163
|
+
[新增] → openEditDialog(!dataId, addTabEnabled) → xTabs.openEditTab(标题"新增", tabName=add_xxx)
|
|
164
|
+
→ 填写 → [保存] → saveDefaultHandle 成功(res.objx=单号)
|
|
165
|
+
→ reloadForm({updateParam:{dataId:单号,formCode:editFormCode}}) → emit reload
|
|
166
|
+
→ list.vue reload: $set(tab.data, tabLabelField, 单号) + tab.dataId=单号 + tab.formCode=editFormCode
|
|
167
|
+
→ vFormRender 重载编辑表单 → 同页签、标题=单号、编辑态 ✅
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
**提交→closeToList**
|
|
171
|
+
```
|
|
172
|
+
[提交] → saveAndSubmitWfHandle → openStartWfDialog({onStartSuccess})
|
|
173
|
+
→ wf.js startSubmitHanlde 成功 → option.onStartSuccess()
|
|
174
|
+
→ switchToListTab({reload}) + xTabs.removeTab(currentName) → 回列表、刷新、关页签 ✅
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
**提交→refreshCurrent**
|
|
178
|
+
```
|
|
179
|
+
option.onStartSuccess() → $baseReload() → 当前页签刷新,保持编辑态 ✅
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## 六、待定项(需拍板,含推荐默认)
|
|
185
|
+
|
|
186
|
+
| # | 决策点 | 推荐 |
|
|
187
|
+
|---|--------|------|
|
|
188
|
+
| 1 | `tabLabelField`(`multiTabLabelField`) 未配置时 | `addTabEnabled=true` 时**必填校验**;缺省用 `addTabLabel` 兜底显示,避免空标题 |
|
|
189
|
+
| 2 | 「常规」pane 显隐 | `addTabEnabled=true` 时 `v-if` 隐藏,避免多一个空页签 |
|
|
190
|
+
| 3 | `submitBehavior` 生效范围 | 仅 `wfEnabled=true` 生效;非流程表单不动 |
|
|
191
|
+
| 4 | 保存后 `tabName` 是否改为 `formCode+单号` | **改**,否则同一单号从列表再打开会重复开页签(去重按 `formCode+dataId`) |
|
|
192
|
+
| 5 | H5(`layoutType=="H5"`) | 不支持本模式,走原 `openEditH5Dialog`;UI 注明仅 PC |
|
|
193
|
+
|
|
194
|
+
---
|
|
195
|
+
|
|
196
|
+
## 七、兼容与回退
|
|
197
|
+
|
|
198
|
+
- 3 个新字段默认值保证**旧表单零行为变化**,可灰度。
|
|
199
|
+
- 改造均为**新增分支**,未删改现有逻辑(仅改造点 4 在 `openStartWfDialog` 多传一个参数)。
|
|
200
|
+
- 回退:关掉 `addTabEnabled` 即恢复「常规」模式,无需改码。
|
|
201
|
+
- **无需改动**:`x-tabs.vue`、`wf.js`、`indexMixin.js`、`wfUtil.js`(直接复用)。
|
|
202
|
+
|
|
203
|
+
---
|
|
204
|
+
|
|
205
|
+
## 八、实施步骤
|
|
206
|
+
|
|
207
|
+
| Phase | 内容 | 验证 |
|
|
208
|
+
|-------|------|------|
|
|
209
|
+
| 1 | `designer.js` 加 3 字段 + `form-setting.vue` 配置 UI | 设计器能配并存入 formJson |
|
|
210
|
+
| 2 | `list.vue openEditDialog` 新增分支 | 点新增开标题"新增"可关闭页签,渲染新增表单 |
|
|
211
|
+
| 3 | `list.vue reload` 更新标题 | 保存后标题变单号、表单转编辑态、dataId 正确 |
|
|
212
|
+
| 4 | `defaultHandle.saveAndSubmitWfHandle` 注入 onStartSuccess | closeToList 关页签回列表刷新;refreshCurrent 刷新本页 |
|
|
213
|
+
| 5 | 边界:待定项 1/2/4/5 | 多次新增、再次编辑、提交后再开同单号、H5 |
|
|
214
|
+
|
|
215
|
+
合计约 2.5 天。
|
|
216
|
+
|
|
217
|
+
---
|
|
218
|
+
|
|
219
|
+
## 九、测试清单
|
|
220
|
+
|
|
221
|
+
| # | 场景 | 预期 |
|
|
222
|
+
|---|------|------|
|
|
223
|
+
| 1 | 旧表单(未启用)点新增 | 走「常规」,行为不变 |
|
|
224
|
+
| 2 | 启用后点新增 | 开标题"新增"可关闭页签 |
|
|
225
|
+
| 3 | 新增页签保存 | 标题变单号、转编辑态、不新开页签 |
|
|
226
|
+
| 4 | 新增页签不保存直接关 | 正常关闭,不影响列表 |
|
|
227
|
+
| 5 | 编辑页签(multiTabEnabled) | 不受影响 |
|
|
228
|
+
| 6 | 提交 closeToList | 关当前页签、切列表、列表刷新 |
|
|
229
|
+
| 7 | 提交 refreshCurrent | 当前页签刷新、保持编辑态 |
|
|
230
|
+
| 8 | 同单号从列表再打开 | 不重复开(去重生效,依赖待定项 4) |
|
|
231
|
+
| 9 | H5 端 | 走 openEditH5Dialog,不报错 |
|
|
232
|
+
| 10 | `tabLabelField` 未配置 | 有提示或兜底,不崩 |
|