const md5 = require('md5');
import {customClone} from "@/utils/xd.base";
import XdSelectList from "@/components/XdSelectList";
import XdSelectStatus from "@/components/XdSelectStatus";
import XdRange from "@/components/XdRange";
import XdRadioStatus from "@/components/XdRadioStatus";
import XdRadioList from "@/components/XdRadioList";
import XdSwitch from "@/components/XdSwitch";
import XdTransfer from "@/components/XdTransfer";
import XdUpload from "@/components/XdUpload";
import XdFontIcon from "@/components/XdFontIcon";
import XdCheckList from "@/components/XdCheckList";
import XdOverAddPrice from "@/components/XdOverAddPrice";
import XdSelectWeekTime from "@/components/XdSelectWeekTime";
import XdJsonView from "@/components/XdJsonView";
import XdRangeGroup from "@/components/XdRangeGroup";
import XdRemoteInput from "@/components/XdRemoteInput";
import XdRemoteCascader from "@/components/XdRemoteCascader";
import XdCascadeSelect from "@/components/XdCascadeSelect";
import XdTinymce from "@/components/XdTinymce";
import XdSetLabel from '@/components/XdSetLabel'
{{each files}}
import {{$value.fileName}} from "@/components/formItem/{{$value.fileName}}";
{{/each}}
{{each privateFiles}}
import {{$value.fileName}} from "@/components/formItemPrivate/{{$value.fileName}}";
{{/each}}
export default {
name: "XdBaseDynamicField",
componentName: 'XdFormBaseDynamicField',
components: {
XdRangeGroup,
XdJsonView,
XdCheckList,
XdSwitch,
XdRadioStatus,
XdSelectList,
XdSelectStatus,
XdRange,
XdRadioList,
XdTransfer,
XdUpload,
XdFontIcon,
XdOverAddPrice,
XdSelectWeekTime,
XdRemoteInput,
XdRemoteCascader,
XdCascadeSelect,
XdTinymce,
XdSetLabel,
{{each files}}
{{$value.fileName}},
{{/each}}
{{each privateFiles}}
{{$value.fileName}},
{{/each}}
},
props: {
isAllDisabled:{
type: Boolean,
default: false
},
isGroupHide: {
type: Boolean,
default: true
},
isGroupShowBgc: {
type: Boolean,
default: true
},
isExpand:{
type: Boolean,
default: false
},
labelWidth: {type: String, default: '100px'},
size: {type: String, default: 'medium'}, //medium / small / mini
list: {type: Array | null, default: null},
isCascaderSave:{
type: Boolean,
default: false //级联属性时候,是否需要用原来的值进行替换
},
pickerOptions: {
type: Object,
default() {
return {
shortcuts: [
{
text: '最近一周',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7);
picker.$emit('pick', [start, end]);
}
},
{
text: '最近一个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30);
picker.$emit('pick', [start, end]);
}
},
{
text: '最近三个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90);
picker.$emit('pick', [start, end]);
}
},
{
text: '最近六个月',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 180);
picker.$emit('pick', [start, end]);
}
}, {
text: '最近一年',
onClick(picker) {
const end = new Date();
const start = new Date();
start.setTime(start.getTime() - 3600 * 1000 * 24 * 365);
picker.$emit('pick', [start, end]);
}
}
],
}
}
},
timeType: {
type: Boolean,
default: false //false=> 毫秒 true=>秒
},
textareaSize: {
type: Object,
default() {
return {minRows: 4, maxRows: 6}
}
},
//当设置值的时候启动表单根据当前传入值进行隐藏与显示
activeStyle:{
type: String,
default: '',
},
//针对 edit X //
isAdvanced : {
type: Boolean|null,
default: null
},
isContent : {
type: Boolean|null,
default: null
},
isStyle : {
type: Boolean|null,
default: null
}
},
watch: {
list: {
handler() {
if(this.listTimer) clearTimeout(this.listTimer);
this.listTimer = setTimeout(()=>{
this.initStatus = false;
this.init();
}, 50)
},
immediate: false,
deep:true,
},
form: {
handler() {
if(this.formTimer) {
clearTimeout(this.formTimer);
this.formTimer = null;
}
this.formTimer = setTimeout(()=>{
this.$emit('input', this.getParams());
this.isFrist = false
}, 300);
},
deep: true
},
uiGroupList:{
handler(value){
this.$emit('on-group-status', value)
},
deep: true
},
},
data() {
return {
isPC:false,
refID: null,
formTimer: null,
formStatus: false, //初始化完成
isFrist: true,
form: {}, //绑定数据字段
rules: {}, //验证规则
uiList: [], //ui列表
uiListValue: {}, //保存上一次的值
uiGroupList:{}, //组信息
//测试数据 备注;valueKey必须唯一
testList: [],
//分组功能收起功能
groupStatus:{},
//分组功能收起功能是否已初始化
groupStatusFlag: false,
//已支持禁用功能组件
supportDisabled:[
'el-input',
'xd-cascade',
'xd-cascade-panel',
'xd-size',
'xd-margin-padding',
'xd-color',
'xd-upload',
'xd-footer-setting',
'xd-radio-custom',
'xd-item-notice',
'xd-remote-select-list',
'xd-multiple-input',
'xd-group-input',
'xd-set-label',
'xd-set-sort-label',
'xd-cascade-select',
'xd-remote-cascader',
'xd-tinymce',
'xd-text-area-tag',
'xd-day-range',
'xd-table-product',
'xd-select-pages-path',
'xd-select-site-path',
'xd-full-cut-rule',
'xd-select-list',
'xd-input-unit',
'xd-table-cascade',
'xd-select-status',
'xd-radio',
'xd-switch',
'xd-check',
'xd-range',
'xd-date-range',
'xd-order-setting',
'xd-input-range',
'xd-remote-cascader-panel',
'xd-remote-input',
'xd-date',
'xd-range-group',
'xd-over-add-price',
'xd-select-week-time',
'xd-choose-namespace',
'xd-market-header',
'xd-site-select-list',
'xd-site-poster',
'xd-site-news',
'xd-site-content', //废弃
'xd-select-tag', //废弃
],
//变动与初始化表单否加载完成
initStatus: false,
//需要过滤的元素
filterEleArr:['xd-line-title','slot','title','el-html','line','xd-line'],
}
},
computed:{
isGroupStatusEmpty(){
return this.$xdHelper.isEmpty(this.groupStatus)
}
},
created() {
this.isPC = this.$xdHelper.isPC();
this.refID = `Xd-${this.$xdHelper.randomChar(20)}`;
this.init();
},
methods: {
handleGroup(item){
if(typeof item['isIcon'] !== 'undefined') return;
if(this.isGroupHide === false) return;
let key = `group_id_${item.group_id}`;
this.$set(this.groupStatus, key, !this.groupStatus[key]);
},
getTimeOptions(item , isFast = true) {
let temp = {};
let options = this.$xdHelper.cloneDeep(this.pickerOptions);
if (item.isShowPickerOptionsFast && isFast) temp = Object.assign({}, temp, options);
//限制选择过去时间
if (item['filterPassTime']) {
temp['disabledDate'] = (time)=>{
return time.getTime() > new Date().getTime()
};
return temp;
}
//限制选择未来时间
if (item['filterFutureTime']) {
temp['disabledDate'] = (time) => {
return time.getTime() <= (new Date().getTime() - 24 * 60 * 60 * 1000)
};
return temp;
}
//时间段
if(item['filterRange']
&& this.$xdHelper.checkVarType(item['filterRange']) === 'array'
&& item['filterRange'].length === 2
) {
temp['disabledDate'] = (time) => {
return time.getTime() < item['filterRange'][0] || time.getTime() > item['filterRange'][1]
};
return temp;
}
return temp;
},
handleElInout(key){
let value = this.form[key];
if(value.trim() === '') {
this.form[key] = '';
}
},
getClass(item){
let params = {};
if(this.activeStyle) {
if(item.groupKey) {
if(item.groupKey === this.activeStyle) params['xd-active'] = true;
else params['xd-not-active'] = true;
}
else {
params['active'] = true
}
}
return {
default: item.size === 'default',
mini: item.size === 'mini' || !item.size,
small: item.size === 'small',
...params,
//设置是否可以隐藏节点
"jfb-hidden": item.hidden === true,
}
},
/**
* @description 获取显示状态
* @param item {Object} form对象
*/
getInline(item) {
return item['inline'] === true || item['inline'] === undefined
},
/**
* @description 获取高和宽
* @param item {Object} form对象
* @param type {Boolean} true =》宽 false=》高
*/
getWH(item, type) {
if (type) return item['oneWidth'] ? item['oneWidth'] + 'px' : '100px';
return item['oneHeight'] ? item['oneHeight'] + 'px' : '100px';
},
getWHIcon(item){
let num = Math.min(item['oneWidth'],item['oneHeight']);
if(num < 70) {
let temp = num - 20;
if(temp <= 16) return 16;
return temp;
}
return 50;
},
/**
* @description 是否必填
* @param rules {null|object|Array}
* @return {boolean}
*/
getRequire(rules = null){
if(!rules) return false;
if(this.$xdHelper.checkVarType(rules) === 'object' && rules['required']) return true;
if(this.$xdHelper.checkVarType(rules) === 'array') {
let temp = rules.filter(item=>{
return item.required;
});
if(temp.length > 0) return true
}
return false
},
/**
* @description 设置form item prop属性
* @param item 插件对象
*/
getProp(item) {
if (item.ele === 'xd-range') {
return this.getItemToFormKey(item, 'xdRange');
} else if (item.ele === 'xd-date-range') {
return this.getItemToFormKey(item, 'xdDate');
} else if (item.ele === 'xd-over-add-price') {
return this.getItemToFormKey(item, 'xdOverAddPrice')
} else if (item.ele === 'xd-select-week-time') {
return this.getItemToFormKey(item, 'xdSelectWeekTime')
} else {
return item['valueKey']
}
},
getCustomClass(item){
let params = {
'xd-html': item.ele === 'el-html',
};
//标题与内容显示在一行
if(item['labelInline'] && item['labelInline'] === true){
params['cus-inline'] = true
}
//行缩进
if(item['indent'] && item['indent'] === true) {
params['cus-indent'] = true
}
if(this.activeStyle) {
if(item.groupKey) {
if(item.groupKey === this.activeStyle) params['xd-active'] = true;
else params['xd-not-active'] = true;
}
else {
params['active'] = true
}
}
//设置是否可以隐藏节点
params['jfb-hidden'] = (item.hidden === true);
//设置组背景样式==========
if(item['xd-group-color']) {
params['group-bgColor'] = true
}
if(item['xd-group-color-first'] && item['xd-group-color-last']) {
params['group-color-one'] = true
}
else {
if(item['xd-group-color-first']) {
params['group-color-first'] = true
}
if(item['xd-group-color-last']) {
params['group-color-last'] = true
}
}
if(item['xd-group-color'] &&
(item['ele'] === 'xd-shadow' || item['ele'] === 'xd-border')
) {
params['cus-shAndBorder'] = true;
}
//设置组背景样式==========
return params
},
/**
* @description 获取表单数据
*/
getParams() {
let form = this.$xdHelper.cloneDeep(this.form);
let temp = {};
Object.keys(form).map(key => {
//区间输入值与时间区间插件
if (/^(xdRange__|xdDate__)(.*)$/.test(key)) {
let range = key.split('__');
if (form[key] && form[key].length > 0) {
range.splice(0, 1);
temp[range[0]] = form[key][0];
temp[range[1]] = form[key][1];
//时间毫秒转秒处理
if (/^(xdDate__)(.*)$/.test(key) && this.timeType) {
temp[range[0]] = form[key][0] ? Math.floor(form[key][0] / 1000) : form[key][0];
temp[range[1]] = form[key][1] ? Math.floor(form[key][1] / 1000) : form[key][1];
}
} else {
range.splice(0, 1);
temp[range[0]] = null;
temp[range[1]] = null;
}
}
//自定义时间插件与超过价格设置插件
else if (/^(xdOverAddPrice__|xdSelectWeekTime__)(.*)$/.test(key)) {
temp = {...temp, ...form[key]}
}
//其他模式
else {
if (this.$xdHelper.checkVarType(form[key]) === 'array' && this.dateFilter) {
if (form[key].length > 0) {
temp[key] = form[key];
}
} else {
let ele = this.$xdHelper.isKeyInLists(this.uiList, key, 'valueKey');
if(ele) {
if (ele.ele === 'xd-date' && this.timeType) {
temp[key] = form[key] ? Math.floor(form[key] / 1000) : form[key];
} else {
temp[key] = form[key];
}
}
}
}
});
//去掉特殊字符头尾空白符,空白符包括:空格、制表符 tab、换行符等其他空白符
Object.keys(temp).map(key=>{
if(this.$xdHelper.checkVarType(temp[key]) === 'string') temp[key] = temp[key].trim();
});
if (this.dateFilter) {
if (this.$xdHelper.isEmpty(temp)) {
return temp
} else {
return this.$xdHelper.deleteParamEmptyKey(temp);
}
}
else return temp
},
//==设置表单======================================
/**
* @description 对象获取form键值
* @param item 插件对象
* @param prefix 前缀
*/
getItemToFormKey(item, prefix) {
let key = [];
if (this.$xdHelper.checkVarType(item.valueKey) === 'array') {
key = [...item['valueKey']];
}
if (this.$xdHelper.checkVarType(item.valueKey) === 'object') {
Object.keys(item.valueKey).map((k) => {
key.push(`${k}$${item.valueKey[k]}`)
});
}
return `${prefix}__${key.join('__')}`
},
/**
* @description 检查key值是否重复
* @param keys {Object} 键值计数对象
* @param list {Array} 检查对象或者数组
* @param isArray {Boolean} 默认:true
*/
checkKeyRepeat(keys, list, isArray = true){
if(isArray) {
let arr = this.$xdHelper.cloneDeep(list);
arr.map(item => {
if (!this.filterEleArr.includes(item.ele)) {
let key = item['valueKey'];
if(this.$xdHelper.checkVarType(key) === 'array') key = key.join('_');
if (this.$xdHelper.checkVarType(key) === 'object') {
let temp = [];
Object.keys(key).map((item)=>{
if(this.$xdHelper.checkVarType(item) === 'array') temp = temp.concat(key[item]);
else temp.push(key[item])
});
key = temp.join('_');
}
if (keys[key]) keys[key] = keys[key] + 1;
else keys[key] = 1;
}
});
}
else {
Object.keys(list).map(key=>{
if (keys[key]) keys[key] = keys[key] + 1;
else keys[key] = 1;
})
}
let flag = false;
let keyValue = '';
Object.keys(keys).map(key => {
if (keys[key] > 1) {
keyValue = key;
flag = true;
}
});
if(flag) throw Error(`键值重复: ${JSON.stringify(keyValue)}`);
},
/**
* @description 设置刷新key值
* @param list {Array}
*/
setIndexKey(list){
return list.map(item=>{
//刷新局部操作(方式1)
if(item.isRefresh) return item;
//刷新局部操作(方式2)
let keyObj = {key: item.valueKey, value: item.value, defaultValue: item.defaultValue};
if(item['isKey'] && item['key'] !== undefined) {
keyObj['cusKey'] = item['key']
}
return {
...item,
key: md5(JSON.stringify(keyObj))
}
})
},
/**
* @description 特殊插件处理
*/
handleSetFormAndRules(key, item){
let formKey = this.getItemToFormKey(item, key);
if(key === 'xdDate') {
let sNowLen = (Math.floor(new Date().getTime() / 1000) + '').length;
//秒转化为毫秒
if(item.value && this.$xdHelper.checkVarType(item.value) === 'array' && item.value.length > 0) {
item.value = item.value.map(time=>{
let timeStr = time + '';
if(timeStr.length === sNowLen) {
return this.$xdHelper.multiplyFloatNumber(time, 1000);
}
else return time
})
}
}
if (this.isCascaderSave && this.form[formKey]) item['value'] = this.form[formKey];
if (item['rules']) {
this.$set(this.rules, formKey, item['rules'])
}
this.$set(this.form, formKey, item['value'])
},
/**
* @description 设置刷新key值
* @param list {Array}
*/
setFormAndRules(list) {
list.map(item =>{
if(!this.filterEleArr.includes(item.ele)) {
switch (item.ele) {
case 'xd-range' :
this.handleSetFormAndRules('xdRange', item);
break;
case 'xd-date-range' :
this.handleSetFormAndRules('xdDate', item);
break;
case 'xd-over-add-price' :
this.handleSetFormAndRules('xdOverAddPrice', item);
break;
case 'xd-select-week-time' :
this.handleSetFormAndRules('xdSelectWeekTime', item);
break;
default :
const isEmpty = (val)=>{
if(this.$xdHelper.checkVarType(val) === 'array' || this.$xdHelper.checkVarType(val) === 'object') {
return this.$xdHelper.isEmpty(val)
}
return (val === null || val === '' || val === undefined)
};
//普通组件传入value无值时候,并且form有值 进行数据赋值财操作
if(this.isCascaderSave && this.form[item['valueKey']] && isEmpty(item.value)){
item['value'] = this.form[item['valueKey']];
}
//时间处理
if(item.ele ==='xd-date') {
let sNowLen = (Math.floor(new Date().getTime() / 1000) + '').length;
if(item.value && this.$xdHelper.checkVarType(item.value) === 'number') {
let timeStr = item.value + '';
if (timeStr.length === sNowLen) {
item.value = this.$xdHelper.multiplyFloatNumber(item.value, 1000);
}
}
console.log('sNowLen', item)
}
if (item['rules']) {
this.$set(this.rules, item['valueKey'], item['rules'])
}
this.$set(this.form, item['valueKey'], item['value']);
}
}
});
},
spDisabled(item, disabled){
if(item.ele === 'xd-size') {
item.disabled = {
wDisabled: disabled,
hDisabled: disabled
}
}
return item;
},
/**
* @description 分组优化
* @param list {Array}
*/
sortList(list){
let contentArr = [{
label: "",
groupKey: "content",
ele: "title",
size: "small",
}];
let advancedArr = [{
label: "",
groupKey: "advanced",
ele: "title",
size: "small",
}];
let styleArr = [{
label: "",
groupKey: "style",
ele: "title",
size: "small",
}];
//判断是否有完全分组
let hasGroupKey = true;
let len = list.length;
for (let i = 0; i < len; i++) {
if(list[i].groupKey === undefined) hasGroupKey = false;
}
//未完全分组不处理
if(!hasGroupKey) return list;
customClone(list).map(item=>{
if(item.groupKey === 'content') contentArr.push(item);
else if(item.groupKey === 'advanced') advancedArr.push(item);
else if(item.groupKey === 'style') styleArr.push(item);
else contentArr.push(item);
});
return [].concat(contentArr).concat(styleArr).concat(advancedArr);
},
checkValueIsRefresh(list){
let formData = this.getParams();
list.map(item=>{
if(item.value !== formData[item.valueKey]) {
if(item['isRefresh'] === true) {
item.isKey = true;
item.key = this.$xdHelper.randomChar(20);
}
}
})
},
/**
* @description 初始化表单
*/
init() {
let arrList = [];
//设置值
if (this.list === null) arrList = this.testList;
else arrList = this.list || [];
//检查值是否发生变化
if(!this.$xdHelper.isEmpty(this.form)) {
this.checkValueIsRefresh(arrList)
};
//设置组背景样式==========
if(this.isGroupShowBgc) {
let groupColorStatus = false;
let groupColorFirst = true; //第一个
arrList = arrList.map((item,index)=>{
if(item.ele === 'group_start') {
groupColorStatus = true;
}
else if(item.ele === 'group_end') {
groupColorStatus = false;
groupColorFirst = true;
}
else {
if(groupColorStatus) {
//设置组第一元素样式名称
if(groupColorFirst){
item['xd-group-color-first'] = true;
groupColorFirst = false
}
//设置组最后一个元素样式名称
if(arrList[index+1].ele === 'group_end') {
item['xd-group-color-last'] = true;
}
item['xd-group-color'] = true;
}
}
return item;
}).filter(item=>{
return !(item.ele === 'group_start' || item.ele === 'group_end')
});
}
else {
arrList = arrList.filter(item=>{
return !(item.ele === 'group_start' || item.ele === 'group_end')
});
}
//设置组背景样式==========
//检查键是否有重复
let keys = {};
this.checkKeyRepeat(keys, this.$xdHelper.cloneDeep(arrList));
arrList = this.setIndexKey(arrList);
this.setFormAndRules(arrList);
//设置默认值
let groupStyle = [];
let groupContent = [];
let groupAdvanced = [];
let notSupportDisabled = [];
let group_index = 0;
let group_status = {group_id_0:true};
let isFirstGroup = true;
//优化列表排序
arrList = this.sortList(arrList);
//初始化值
let newList = customClone(arrList).map(item=>{
if(item.groupKey === 'style') {
if(item.ele === 'title' && item.label !== '' && groupStyle.filter(i=>i).length === 0) {
item.isFirst = true
}
groupStyle.push(item.valueKey);
if(this.isStyle !== null) {
if(item.disabled === undefined) item.disabled = !this.isStyle;
item = this.spDisabled(item, !this.isStyle);
}
}
if(item.groupKey === 'content') {
if(item.ele === 'title' && item.label !== '' && groupContent.filter(i=>i).length === 0) {
item.isFirst = true
}
groupContent.push(item.valueKey);
if(this.isContent !== null) {
if(item.disabled === undefined) item.disabled = !this.isContent;
item = this.spDisabled(item, !this.isStyle);
}
}
if(item.groupKey === 'advanced') {
if(item.ele === 'title' && item.label !== '' && groupAdvanced.filter(i=>i).length === 0) {
item.isFirst = true
}
groupAdvanced.push(item.valueKey);
if(this.isAdvanced !== null) {
if(item.disabled === undefined) item.disabled = !this.isAdvanced;
item = this.spDisabled(item, !this.isStyle);
}
}
if(!this.supportDisabled.includes(item.ele)) notSupportDisabled.push(item);
if(item.ele === 'title') {
group_index++;
item.group_id = group_index;
//是否折叠操作(折叠时候显示第一个组)
if(this.isExpand) {
group_status[`group_id_${item.group_id}`] = isFirstGroup;
}
else group_status[`group_id_${item.group_id}`] = true;
if(isFirstGroup) isFirstGroup = false;
}
else {
item.groupIdClass = `group_id_${group_index}`;
item.group_id = group_index;
}
return item
});
if(notSupportDisabled.length > 0) {
console.warn(`Not Support Disabled: ${JSON.stringify(notSupportDisabled.map(item=>{
return {
key: item.valueKey,
ele: item.ele
}
}))}`);
window['$notSupportDisabled'] = notSupportDisabled;
}
//未分组
if(newList.length > 0 && ( groupStyle.length === 0
&& groupContent.length === 0
&& groupAdvanced.length === 0)
) {
this.uiGroupList = {style:groupStyle,content:[1],advanced:groupAdvanced};
}
//已分组
else {
this.uiGroupList = {
style: groupStyle.filter(i=>i),
content: groupContent.filter(i=>i),
advanced: groupAdvanced.filter(i=>i)
};
}
//未分组进行设置过滤完成值
if(!this.groupStatusFlag) {
this.groupStatus = group_status;
}
this.groupStatusFlag = true;
this.uiList = newList.map(item=>{
if(typeof this.isAllDisabled === 'boolean'){
if(this.isAllDisabled === true) item.disabled = this.isAllDisabled
}
return item
});
this.formStatus = true;
if (!this.isFrist) this.$emit('input', this.getParams());
//判断表单是否完成
this.$nextTick(()=>{
this.initStatus = true;
})
},
//==设置表单 结束==================================
//==设置验证与返回值================================
/**
* @description 获取插槽中的自定义表单元素
*/
getSlotNodes(){
return this.$children[0].$children.filter(item => {
return item.$options['componentName'] === 'XdFormBaseDynamicField'
|| item.$options['componentName'] === 'ElForm';
});
},
/**
* @description 获取插槽中的自定义表单元素
*/
getSlotPromises(){
return this.getSlotNodes().map(item=>{
if(item.$options['componentName'] === 'XdFormBaseDynamicField') return item['submit']();
else return new Promise((resolve,reject)=>{
item.validate((valid, error) => {
if (valid) resolve(valid);
else reject({valid, error});
})
})
})
},
/**
* @description 获取插槽中的自定义表单元素数据
*/
getAllFormData(){
let temp = {};
this.getSlotNodes().map(item=>{
if (item.$options['componentName'] === 'XdFormBaseDynamicField'){
temp = Object.assign({}, temp, this.$xdHelper.cloneDeep(item.getParams()))
}
else{
temp = Object.assign({}, temp, this.$xdHelper.cloneDeep(item.$options.propsData['model']))
}
});
let keys = {};
this.checkKeyRepeat(keys, temp, false);
this.checkKeyRepeat(keys, this.getParams(), false);
return Object.assign({},
this.$xdHelper.cloneDeep(temp),
this.$xdHelper.cloneDeep(this.getParams()),
);
},
/**
* @description 提交验证包含(插槽中的表单 + 与当前表单)
*/
submitAll(){
let promiseArr = this.getSlotPromises();
promiseArr.push(this.submit());
return new Promise((resolve, reject) => {
Promise.all(promiseArr)
.then(res => {
resolve(res);
})
.catch((error)=>{
let errorArr = Object.keys(error.error).map(key=>{
return error.error[key][0]['message']
});
errorArr.splice(1);
// let str = `数据项填写错误,包扩:【${errorArr.join('】,【')}】`;
// this.$alert(str, '数据项错误', {
// confirmButtonText: '确定',
// dangerouslyUseHTMLString: true,
// });
this.$message({
message: `填写错误:【${errorArr[0]}】`,
type: 'error'
})
reject(error.valid);
})
})
},
/**
* @description 提交前验证数据
*/
submit() {
return new Promise((resolve, reject) => {
this.$refs[this.refID].validate((valid, error) => {
if (valid) resolve(valid);
else reject({valid, error});
})
});
},
//==设置验证与返回值================================
//==图片上传=======================================
/**
* @description 上传成功
*/
handleSuccess(res) {
this.$emit('success', res)
},
/**
* @description 上传到本地服务器成功返回值时刻触发,设置url字段
* @param result
* @param resolve
*/
handleApiSuccessUrl(result, resolve) {
this.$emit('onApiSuccessUrl', result, (url) => {
resolve(url);
})
},
/**
* @description 单文件上传参数设置
* @param file
* @param resolve
*/
handleGetParamsAndHeader(file, resolve) {
this.$emit('onGetParamsAndHeader', file, (params) => {
resolve(params);
})
},
//==图片上传=======================================
getGroupFormData(){
let data = {};
let group = [];
Object.keys(this.getParams()).map(valueKey=>{
let len = this.uiList.length;
for(let i = 0;i < len; i++) {
let item = this.uiList[i];
if(valueKey === item.valueKey) {
if(item.groupKey) {
if(!data[item.groupKey]){
group.push(item.groupKey);
data[item.groupKey] = {};
}
data[item.groupKey][valueKey] = this.getParams()[valueKey];
}else{
if(!data['all']){
group.push('all');
data['all'] = {};
}
data['all'][valueKey] = this.getParams()[valueKey];
}
break
}
}
});
if(group.length === 1) {
if(group.includes('all')) return {group, data:{content: data['all']}};
else return {data, group}
}
else return {data, group}
},
}
}