cloud-web-corejs 1.1.0-dev.15 → 1.1.0-dev.17
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/docs/2026-09 /350/241/250/345/215/225/345/257/274/345/205/245/351/200/232/351/201/223/346/242/263/347/220/206/344/270/216/350/220/275/345/234/260/346/226/271/346/241/210.md" +745 -0
- package/src/components/xform/form-designer/form-widget/dialog/importDialog.vue +2 -2
- package/src/components/xform/form-designer/form-widget/dialog/importDialogMixin.js +2385 -1833
- package/src/components/xform/form-designer/form-widget/field-widget/import-button-widget.vue +18 -5
- package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import-button-editor.vue +62 -1
- package/src/components/xform/form-designer/setting-panel/property-editor/field-import-button/import2-button-editor.vue +90 -2
- package/src/components/xform/form-designer/widget-panel/widgetsConfig.js +21 -0
- package/src/components/xform/form-render/container-item/list-h5-item.vue +4 -1
- package/src/components/xform/styles/h5.scss +43 -3
package/src/components/xform/form-designer/form-widget/field-widget/import-button-widget.vue
CHANGED
|
@@ -62,18 +62,31 @@ export default {
|
|
|
62
62
|
methods: {
|
|
63
63
|
importHandle() {
|
|
64
64
|
const done = () => {
|
|
65
|
-
let
|
|
66
|
-
let
|
|
67
|
-
|
|
65
|
+
let options = this.field.options;
|
|
66
|
+
let multi = options.importMultiple || false;
|
|
67
|
+
let multiSize = options.importMultiSize || 1;
|
|
68
|
+
let dialogOption = {
|
|
68
69
|
target: this,
|
|
69
|
-
importOption:
|
|
70
|
+
importOption: options,
|
|
70
71
|
importFrontOnly: false,
|
|
71
72
|
multi,
|
|
72
73
|
multiSize,
|
|
73
74
|
callback: (resultData, file, done) => {
|
|
74
75
|
|
|
75
76
|
}
|
|
76
|
-
}
|
|
77
|
+
};
|
|
78
|
+
// 逐行补默认值:弹框侧读的是 option.defaultValue(此前只有手写页能传,
|
|
79
|
+
// 表单里配不了),这里把设计器上的脚本包成同一形状交过去
|
|
80
|
+
if (options.importDefaultValue) {
|
|
81
|
+
dialogOption.defaultValue = (row) => {
|
|
82
|
+
return this.handleCustomEvent(
|
|
83
|
+
options.importDefaultValue,
|
|
84
|
+
["row"],
|
|
85
|
+
[row]
|
|
86
|
+
) || {};
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
this.getFormRef().openImportDialog(dialogOption);
|
|
77
90
|
}
|
|
78
91
|
if (this.field.options.onBeforeClickButton) {
|
|
79
92
|
if (this.handleCustomEvent(this.field.options.onBeforeClickButton, ["done"], [done]) !== false) {
|
|
@@ -51,6 +51,18 @@
|
|
|
51
51
|
:max="200"
|
|
52
52
|
></base-input-number>
|
|
53
53
|
</el-form-item>
|
|
54
|
+
<el-form-item label="批量报文带附件信封">
|
|
55
|
+
<el-switch v-model="optionModel.importMultiAttachEnvelope"></el-switch>
|
|
56
|
+
<el-tooltip effect="dark" placement="top">
|
|
57
|
+
<div slot="content">
|
|
58
|
+
只在「批量导入」打开时生效。<br/>
|
|
59
|
+
关(默认):报文里 data 是裸行数组,附件列原样留在行里。<br/>
|
|
60
|
+
打开:每行包成 { 表名: {...行}, attachments_x: [...] },附件从实体里提到信封层,<br/>
|
|
61
|
+
与单行导入同构 —— <b>后端脚本需配套改</b>,不要在存量表单上随手打开。
|
|
62
|
+
</div>
|
|
63
|
+
<i class="el-icon-question label-tip-icon"></i>
|
|
64
|
+
</el-tooltip>
|
|
65
|
+
</el-form-item>
|
|
54
66
|
<el-form-item label="点击前置事件" label-width="150px">
|
|
55
67
|
<a href="javascript:void(0);" class="a-link link-oneLind"
|
|
56
68
|
@click="editEventHandler('onBeforeClickButton', eventParams)">
|
|
@@ -72,6 +84,45 @@
|
|
|
72
84
|
</a>
|
|
73
85
|
</el-form-item>
|
|
74
86
|
|
|
87
|
+
<el-form-item label="必填校验方式" class="form-item-label-top">
|
|
88
|
+
<el-select v-model="optionModel.requiredCheckMode" style="width: 100%">
|
|
89
|
+
<el-option label="默认(逐行标记失败,其余照常导入)" value=""></el-option>
|
|
90
|
+
<el-option label="整批硬拦(一处不合规就整份不导)" value="strict"></el-option>
|
|
91
|
+
<el-option label="不校验(只信业务脚本与后端)" value="off"></el-option>
|
|
92
|
+
</el-select>
|
|
93
|
+
</el-form-item>
|
|
94
|
+
<el-form-item label="逐行校验脚本" label-width="150px">
|
|
95
|
+
<a
|
|
96
|
+
href="javascript:void(0);"
|
|
97
|
+
class="a-link link-oneLind"
|
|
98
|
+
@click="editEventHandler('onValidateRow', onValidateRowParams)"
|
|
99
|
+
>
|
|
100
|
+
<span>{{ optionModel.onValidateRow }}</span>
|
|
101
|
+
<i class="el-icon-edit"></i>
|
|
102
|
+
</a>
|
|
103
|
+
<el-tooltip effect="dark" placement="top">
|
|
104
|
+
<div slot="content">返回 true 或不返回=通过;返回字符串=该行的错误文案。</div>
|
|
105
|
+
<i class="el-icon-question label-tip-icon"></i>
|
|
106
|
+
</el-tooltip>
|
|
107
|
+
</el-form-item>
|
|
108
|
+
<el-form-item label="逐行补默认值" label-width="150px">
|
|
109
|
+
<a
|
|
110
|
+
href="javascript:void(0);"
|
|
111
|
+
class="a-link link-oneLind"
|
|
112
|
+
@click="editEventHandler('importDefaultValue', importDefaultValueParams)"
|
|
113
|
+
>
|
|
114
|
+
<span>{{ optionModel.importDefaultValue }}</span>
|
|
115
|
+
<i class="el-icon-edit"></i>
|
|
116
|
+
</a>
|
|
117
|
+
<el-tooltip effect="dark" placement="top">
|
|
118
|
+
<div slot="content">
|
|
119
|
+
返回一个对象,发包前合并进该行(补组织、单据类型等固定字段)。<br/>
|
|
120
|
+
与"导入前数据处理"的区别:那个是整批一次,这个是逐行。
|
|
121
|
+
</div>
|
|
122
|
+
<i class="el-icon-question label-tip-icon"></i>
|
|
123
|
+
</el-tooltip>
|
|
124
|
+
</el-form-item>
|
|
125
|
+
|
|
75
126
|
<el-form-item label="导入完成回调" label-width="150px">
|
|
76
127
|
<a
|
|
77
128
|
href="javascript:void(0);"
|
|
@@ -116,6 +167,8 @@ export default {
|
|
|
116
167
|
onBeforeImportParams: ["dataId", "formCode", "file", "resultData", "done"],
|
|
117
168
|
onConfirmImportParams: ["dataId", "formCode", "resultData", "file", "done", "close"],
|
|
118
169
|
onSuccessImportParams: ["dataId", "formCode", "resultData", "file"],
|
|
170
|
+
onValidateRowParams: ["dataId", "formCode", "row", "index"],
|
|
171
|
+
importDefaultValueParams: ["dataId", "formCode", "row"],
|
|
119
172
|
};
|
|
120
173
|
},
|
|
121
174
|
methods: {
|
|
@@ -130,4 +183,12 @@ export default {
|
|
|
130
183
|
};
|
|
131
184
|
</script>
|
|
132
185
|
|
|
133
|
-
<style scoped
|
|
186
|
+
<style scoped>
|
|
187
|
+
.label-tip-icon {
|
|
188
|
+
margin-left: 4px;
|
|
189
|
+
color: #909399;
|
|
190
|
+
cursor: pointer;
|
|
191
|
+
font-size: 14px;
|
|
192
|
+
vertical-align: middle;
|
|
193
|
+
}
|
|
194
|
+
</style>
|
|
@@ -24,6 +24,84 @@
|
|
|
24
24
|
<el-form-item label="关联表格唯一名称" class="form-item-label-top">
|
|
25
25
|
<el-input v-model="optionModel.tableRef"></el-input>
|
|
26
26
|
</el-form-item>
|
|
27
|
+
<el-form-item label="入表去重字段" class="form-item-label-top">
|
|
28
|
+
<el-input v-model="optionModel.dedupField" placeholder="留空则不去重"></el-input>
|
|
29
|
+
</el-form-item>
|
|
30
|
+
<el-form-item label="必填校验方式" class="form-item-label-top">
|
|
31
|
+
<el-select v-model="optionModel.requiredCheckMode" style="width: 100%">
|
|
32
|
+
<el-option label="默认(有进度框逐行标记,否则整批拦)" value=""></el-option>
|
|
33
|
+
<el-option label="整批硬拦(一处不合规就整份不导)" value="strict"></el-option>
|
|
34
|
+
<el-option label="不校验(只信业务脚本)" value="off"></el-option>
|
|
35
|
+
</el-select>
|
|
36
|
+
</el-form-item>
|
|
37
|
+
<el-form-item label="显示导入进度">
|
|
38
|
+
<el-switch v-model="optionModel.showProgressDialog"></el-switch>
|
|
39
|
+
<el-tooltip effect="dark" placement="top">
|
|
40
|
+
<div slot="content">
|
|
41
|
+
打开后走进度弹框:逐行校验,成功/失败可点开看明细并导出,<br/>
|
|
42
|
+
校验通过的行才进表格。关闭则沿用整批导入(缺必填直接中止)。
|
|
43
|
+
</div>
|
|
44
|
+
<i class="el-icon-question label-tip-icon"></i>
|
|
45
|
+
</el-tooltip>
|
|
46
|
+
</el-form-item>
|
|
47
|
+
<el-form-item
|
|
48
|
+
label="每行处理方式"
|
|
49
|
+
class="form-item-label-top el-form-item-second"
|
|
50
|
+
v-if="optionModel.showProgressDialog"
|
|
51
|
+
>
|
|
52
|
+
<el-select v-model="optionModel.importMode" style="width: 100%">
|
|
53
|
+
<el-option label="塞入关联表格" value="table"></el-option>
|
|
54
|
+
<el-option label="逐行脚本处理" value="script"></el-option>
|
|
55
|
+
</el-select>
|
|
56
|
+
</el-form-item>
|
|
57
|
+
<el-form-item
|
|
58
|
+
label="启用图片处理"
|
|
59
|
+
class="el-form-item-second"
|
|
60
|
+
v-if="optionModel.showProgressDialog"
|
|
61
|
+
>
|
|
62
|
+
<el-switch v-model="optionModel.enabledImportPreHandle"></el-switch>
|
|
63
|
+
<el-tooltip effect="dark" placement="top">
|
|
64
|
+
<div slot="content">
|
|
65
|
+
模板里 <b>attachments_</b> 开头的列用于承载附件。<br/>
|
|
66
|
+
不开:只认单元格里的 URL 文本(支持逗号/换行分隔多个)。<br/>
|
|
67
|
+
打开:Excel 里贴的内嵌图片也会被取回并填进该列 —— 需先上传整个文件,<br/>
|
|
68
|
+
导入前多出「上传/校验/存储图片」三段进度。<br/>
|
|
69
|
+
仅在「显示导入进度」打开时可用。
|
|
70
|
+
</div>
|
|
71
|
+
<i class="el-icon-question label-tip-icon"></i>
|
|
72
|
+
</el-tooltip>
|
|
73
|
+
</el-form-item>
|
|
74
|
+
<el-form-item
|
|
75
|
+
label="逐行处理脚本"
|
|
76
|
+
label-width="150px"
|
|
77
|
+
class="el-form-item-second"
|
|
78
|
+
v-if="optionModel.showProgressDialog && optionModel.importMode === 'script'"
|
|
79
|
+
>
|
|
80
|
+
<a href="javascript:void(0);" class="a-link link-oneLind"
|
|
81
|
+
@click="editEventHandler('onImportRow', onImportRowParams)">
|
|
82
|
+
<span>{{ optionModel.onImportRow }}</span>
|
|
83
|
+
<i class="el-icon-edit"></i>
|
|
84
|
+
</a>
|
|
85
|
+
<el-tooltip effect="dark" placement="top">
|
|
86
|
+
<div slot="content">
|
|
87
|
+
每行调一次,必须调 done:done() 表示成功;<br/>
|
|
88
|
+
done({success:false, message:"未匹配到编码"}) 表示失败。<br/>
|
|
89
|
+
循环、让步与进度由组件负责,脚本里不要自己写整趟 for。
|
|
90
|
+
</div>
|
|
91
|
+
<i class="el-icon-question label-tip-icon"></i>
|
|
92
|
+
</el-tooltip>
|
|
93
|
+
</el-form-item>
|
|
94
|
+
<el-form-item label="逐行校验脚本" label-width="150px">
|
|
95
|
+
<a href="javascript:void(0);" class="a-link link-oneLind"
|
|
96
|
+
@click="editEventHandler('onValidateRow', onValidateRowParams)">
|
|
97
|
+
<span>{{ optionModel.onValidateRow }}</span>
|
|
98
|
+
<i class="el-icon-edit"></i>
|
|
99
|
+
</a>
|
|
100
|
+
<el-tooltip effect="dark" placement="top">
|
|
101
|
+
<div slot="content">返回 true 或不返回=通过;返回字符串=该行的错误文案。</div>
|
|
102
|
+
<i class="el-icon-question label-tip-icon"></i>
|
|
103
|
+
</el-tooltip>
|
|
104
|
+
</el-form-item>
|
|
27
105
|
<el-form-item label="点击前置事件" label-width="150px">
|
|
28
106
|
<a href="javascript:void(0);" class="a-link link-oneLind"
|
|
29
107
|
@click="editEventHandler('onBeforeClickButton', eventParams)">
|
|
@@ -78,7 +156,9 @@ export default {
|
|
|
78
156
|
showBdAttachSettingDialog: false,
|
|
79
157
|
onBeforeImportParams: ["dataId", "formCode", 'file', 'resultData', 'done'],
|
|
80
158
|
onConfirmImportParams: ["dataId", "formCode", 'resultData', 'file', 'done', "close"],
|
|
81
|
-
onSuccessImportParams: ["dataId", "formCode", 'resultData', 'file']
|
|
159
|
+
onSuccessImportParams: ["dataId", "formCode", 'resultData', 'file'],
|
|
160
|
+
onImportRowParams: ["dataId", "formCode", "row", "index", "done"],
|
|
161
|
+
onValidateRowParams: ["dataId", "formCode", "row", "index"]
|
|
82
162
|
};
|
|
83
163
|
},
|
|
84
164
|
methods: {
|
|
@@ -93,4 +173,12 @@ export default {
|
|
|
93
173
|
};
|
|
94
174
|
</script>
|
|
95
175
|
|
|
96
|
-
<style scoped
|
|
176
|
+
<style scoped>
|
|
177
|
+
.label-tip-icon {
|
|
178
|
+
margin-left: 4px;
|
|
179
|
+
color: #909399;
|
|
180
|
+
cursor: pointer;
|
|
181
|
+
font-size: 14px;
|
|
182
|
+
vertical-align: middle;
|
|
183
|
+
}
|
|
184
|
+
</style>
|
|
@@ -3439,12 +3439,19 @@ export const advancedFields = [
|
|
|
3439
3439
|
...defaultWidgetShowRuleConfig,
|
|
3440
3440
|
importMultiple: false,
|
|
3441
3441
|
importMultiSize: 1,
|
|
3442
|
+
// 批量导入时给每行补一层实体信封以承载附件列;默认关=仍发裸行数组
|
|
3443
|
+
importMultiAttachEnvelope: false,
|
|
3442
3444
|
importFileLimitSize: 200,
|
|
3443
3445
|
importEntity: "",
|
|
3444
3446
|
importAttachCode: "",
|
|
3445
3447
|
importAttachName: "",
|
|
3446
3448
|
importScriptCode: "",
|
|
3447
3449
|
onBeforeImport: "",
|
|
3450
|
+
// 逐行补默认值脚本:返回对象,Object.assign 到该行后再发包
|
|
3451
|
+
importDefaultValue: "",
|
|
3452
|
+
onValidateRow: "",
|
|
3453
|
+
// 必填校验方式:"" 默认(逐行标记失败)/ "strict" 解析期整批硬拦 / "off" 不校验
|
|
3454
|
+
requiredCheckMode: "",
|
|
3448
3455
|
enabledImportPreHandle: false,
|
|
3449
3456
|
tableRef: "",
|
|
3450
3457
|
onSuccessImport: "",
|
|
@@ -3495,6 +3502,20 @@ export const advancedFields = [
|
|
|
3495
3502
|
importAttachCode: "",
|
|
3496
3503
|
importAttachName: "",
|
|
3497
3504
|
tableRef: "",
|
|
3505
|
+
// 进度框形态:逐行校验 + 成功/失败计数 + 结果表。
|
|
3506
|
+
// 默认关闭 —— 关闭时是"全屏 loading + 整批入表"的老链路,存量表单无感知。
|
|
3507
|
+
showProgressDialog: false,
|
|
3508
|
+
// 进度框形态下每行怎么处理:"table" 塞入关联表格;"script" 交给 onImportRow 逐行脚本
|
|
3509
|
+
importMode: "table",
|
|
3510
|
+
// 内嵌图片三段式:把 Excel 里贴的图取回来填进 attachments_ 列。
|
|
3511
|
+
// 依赖进度框,仅在 showProgressDialog 打开时生效
|
|
3512
|
+
enabledImportPreHandle: false,
|
|
3513
|
+
onImportRow: "",
|
|
3514
|
+
onValidateRow: "",
|
|
3515
|
+
// 入表前按该字段去重,空则不去重
|
|
3516
|
+
dedupField: "",
|
|
3517
|
+
// 必填校验方式:"" 默认(有逐行通道就逐行标记,否则整批拦)/ "strict" 整批硬拦 / "off" 不校验
|
|
3518
|
+
requiredCheckMode: "",
|
|
3498
3519
|
onConfirmImportEnabled: false,
|
|
3499
3520
|
onConfirmImport: "",
|
|
3500
3521
|
onSuccessImport: "",
|
|
@@ -604,7 +604,10 @@
|
|
|
604
604
|
<template
|
|
605
605
|
v-if="!widget.options.isQueryTable || !column.isMainFiled"
|
|
606
606
|
>
|
|
607
|
-
|
|
607
|
+
<!-- 与列表卡片同口径:列配了 H5列宽=半行 时打 m2。
|
|
608
|
+
弹框 append-to-body,样式挂在 .el-dialog.h5view-dialog,
|
|
609
|
+
见 styles/h5.scss。 -->
|
|
610
|
+
<dl :key="columnIndex" :class="{ m2: isHalfColumn(column) }">
|
|
608
611
|
<div>
|
|
609
612
|
<dt>{{ column.title }}:</dt>
|
|
610
613
|
<dd>
|
|
@@ -746,8 +746,10 @@ $xformH5Size:14px;
|
|
|
746
746
|
}
|
|
747
747
|
}
|
|
748
748
|
|
|
749
|
-
/* dd
|
|
750
|
-
|
|
749
|
+
/* dd 里是真控件的那份。列表行本身只出纯文本。
|
|
750
|
+
明细详情弹框 append-to-body,不在 .xform-h5 下,真正生效的是
|
|
751
|
+
下方 .el-dialog.h5view-dialog 里同一口径的规则;这段留给弹框
|
|
752
|
+
万一没挂到 body 时的兜底。 */
|
|
751
753
|
.xform-h5 .h5-list-box .item .t2 > dl > div > dd {
|
|
752
754
|
margin:0;
|
|
753
755
|
/* 压 style.scss:14112 的 width:calc(100vw - 159px),本方 (0,5,2) > (0,4,1) */
|
|
@@ -1789,13 +1791,51 @@ $xformH5Size:14px;
|
|
|
1789
1791
|
margin:12px;padding:0 !important;background:none !important;
|
|
1790
1792
|
.item{
|
|
1791
1793
|
border:none;
|
|
1794
|
+
/* 明细详情弹框 append-to-body,节点不在 .xform-h5 里,
|
|
1795
|
+
列表卡片那套 `.xform-h5 .h5-list-box .item .t2` 一行两个打不到。
|
|
1796
|
+
这里按同一口径接上:.t2 变 flex 容器,dl.m2 占 50%。 */
|
|
1792
1797
|
.t2{
|
|
1793
|
-
|
|
1798
|
+
display: flex;
|
|
1799
|
+
flex-wrap: wrap;
|
|
1800
|
+
align-items: flex-start;
|
|
1801
|
+
> dl{
|
|
1794
1802
|
font-size:14px;color:#666;
|
|
1803
|
+
&.m2 {
|
|
1804
|
+
width: 50%;
|
|
1805
|
+
}
|
|
1806
|
+
&.m2 > div {
|
|
1807
|
+
flex-wrap: wrap;
|
|
1808
|
+
}
|
|
1809
|
+
&.m2 > div > dd {
|
|
1810
|
+
flex: 1 1 auto;
|
|
1811
|
+
min-width: 0;
|
|
1812
|
+
}
|
|
1795
1813
|
dd{
|
|
1796
1814
|
margin:0;
|
|
1797
1815
|
color:#323232;
|
|
1798
1816
|
text-align:right;
|
|
1817
|
+
min-width: 0;
|
|
1818
|
+
/* 压 style.scss:14112 的 width:calc(100vw - 159px)。
|
|
1819
|
+
弹框里是真控件,半行净宽撑不住整屏宽。 */
|
|
1820
|
+
.field-wrapper,
|
|
1821
|
+
.field-wrapper.h5-field {
|
|
1822
|
+
display: block;
|
|
1823
|
+
width: auto;
|
|
1824
|
+
}
|
|
1825
|
+
.field-wrapper.h5-field .el-form-item {
|
|
1826
|
+
display: block;
|
|
1827
|
+
min-height: 0;
|
|
1828
|
+
margin-bottom: 0;
|
|
1829
|
+
padding: 0;
|
|
1830
|
+
border-bottom: none;
|
|
1831
|
+
}
|
|
1832
|
+
/* dt 已经出过字段名,藏掉控件自带的第二份 label */
|
|
1833
|
+
.field-wrapper.h5-field .el-form-item > .el-form-item__label {
|
|
1834
|
+
display: none;
|
|
1835
|
+
}
|
|
1836
|
+
.field-wrapper.h5-field .el-form-item > .el-form-item__content {
|
|
1837
|
+
margin-left: 0 !important;
|
|
1838
|
+
}
|
|
1799
1839
|
}
|
|
1800
1840
|
}
|
|
1801
1841
|
}
|