@bytenew/bn-bus-ui 1.1.463 → 1.1.464
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/assocTableSearch-Bfe96864.js +349 -0
- package/dist/assocTableSearch.css +1 -0
- package/dist/bn-bus-ui.es.js +65 -0
- package/dist/bn-bus-ui.umd.js +49 -0
- package/dist/chooseIPaasData-COrrvQKZ.js +391 -0
- package/dist/chooseIPaasData.css +1 -0
- package/dist/defaultSet-CzN1ec_d.js +297 -0
- package/dist/defaultSet.css +1 -0
- package/dist/fileFormData-D_Q1vylE.js +53 -0
- package/dist/formItemFooter-BvptZj_u.js +108 -0
- package/dist/formItemFooter.css +1 -0
- package/dist/funcExprDialog-BguNs9fl.js +139 -0
- package/dist/funcExprDialog.css +1 -0
- package/dist/index-0oB7QocU.js +44 -0
- package/dist/index-69fRP0M8.js +89 -0
- package/dist/index-BdklTJtF.js +66 -0
- package/dist/index-Bu3jHlby.js +45 -0
- package/dist/index-BxWx5kpG.js +89 -0
- package/dist/index-C5LQ0OSs.js +183 -0
- package/dist/index-C8YhrrUN.js +51 -0
- package/dist/index-COuPCIzB.js +45 -0
- package/dist/index-CSvVyjxx.js +178 -0
- package/dist/index-DCv51EXX.js +109 -0
- package/dist/index-DUSI6MuC.js +135 -0
- package/dist/index-DVzxs2vR.js +58 -0
- package/dist/index-Dd4b8zNb.js +746 -0
- package/dist/index-Md-ZlkCW.js +66 -0
- package/dist/index-hsSIY2FP.js +221 -0
- package/dist/index-n13-H3_Y.js +118 -0
- package/dist/index-wUl5aPUD.js +64 -0
- package/dist/index.css +1 -0
- package/dist/index2.css +1 -0
- package/dist/index3.css +1 -0
- package/dist/index4.css +1 -0
- package/dist/index5.css +1 -0
- package/dist/index6.css +1 -0
- package/dist/index7.css +1 -0
- package/dist/install-CNjs0u5x.js +23299 -0
- package/dist/install.css +1 -0
- package/dist/setOption-CXOifQcx.js +329 -0
- package/dist/setOption.css +1 -0
- package/dist/setRelationOption-C7VDhej7.js +5217 -0
- package/dist/setRelationOption.css +1 -0
- package/package.json +4 -20
- package/install.js +0 -134
- package/packages/BnAddress/index.vue +0 -141
- package/packages/BnAddressParse/index.vue +0 -75
- package/packages/BnAdvancedFilter/BnFilterView.vue +0 -145
- package/packages/BnAdvancedFilter/index.vue +0 -345
- package/packages/BnAdvancedFilter/util.js +0 -171
- package/packages/BnCascader/BnCascader.vue +0 -543
- package/packages/BnCascader/BnCascaderPanel.vue +0 -1331
- package/packages/BnCascader/cascaderDisplay.js +0 -102
- package/packages/BnCheck/BnCheck.vue +0 -253
- package/packages/BnColumnConfig/columnConfigDialog.vue +0 -134
- package/packages/BnColumnConfig/component/childrenFormSetting/assocTable.vue +0 -143
- package/packages/BnColumnConfig/component/childrenFormSetting/assocTableSearch.vue +0 -314
- package/packages/BnColumnConfig/component/childrenFormSetting/index.vue +0 -243
- package/packages/BnColumnConfig/component/defaultSet/defaultSet.vue +0 -114
- package/packages/BnColumnConfig/component/defaultSet/stringDefault.vue +0 -210
- package/packages/BnColumnConfig/component/funcExprDialog/funcExprDialog.vue +0 -126
- package/packages/BnColumnConfig/component/packageFilter/index.vue +0 -141
- package/packages/BnColumnConfig/component/paraExplainSet/index.vue +0 -156
- package/packages/BnColumnConfig/component/setOption/setOption.vue +0 -321
- package/packages/BnColumnConfig/component/setRelationOption/ConditionList.vue +0 -277
- package/packages/BnColumnConfig/component/setRelationOption/LevelHeader.vue +0 -144
- package/packages/BnColumnConfig/component/setRelationOption/setRelationOption.vue +0 -642
- package/packages/BnColumnConfig/data.js +0 -129
- package/packages/BnColumnConfig/index.scss +0 -23
- package/packages/BnColumnConfig/index.vue +0 -309
- package/packages/BnCondVal/BnCondVal.vue +0 -112
- package/packages/BnCondVal/itemVal/dateRegVal.vue +0 -39
- package/packages/BnCondVal/itemVal/dateVal.vue +0 -39
- package/packages/BnCondVal/itemVal/numRegVal.vue +0 -67
- package/packages/BnCondVal/itemVal/numVal.vue +0 -44
- package/packages/BnCondVal/itemVal/relationVal.vue +0 -73
- package/packages/BnCondVal/itemVal/selectColumnVal.vue +0 -58
- package/packages/BnCondVal/itemVal/selectVal.vue +0 -59
- package/packages/BnCondVal/itemVal/stringVal.vue +0 -156
- package/packages/BnCondition/index.vue +0 -551
- package/packages/BnCondition/util.js +0 -232
- package/packages/BnDatePicker/BnDatePicker.vue +0 -194
- package/packages/BnDrop/BnDrop.vue +0 -917
- package/packages/BnEmptyTip/BnEmptyTip.vue +0 -107
- package/packages/BnExportOrder/BnExportOrder.vue +0 -241
- package/packages/BnExportOrder/validatorCode.vue +0 -94
- package/packages/BnFileView/BnFileView.vue +0 -271
- package/packages/BnFileView/FileDetail.vue +0 -125
- package/packages/BnFileView/videoPreview.vue +0 -70
- package/packages/BnFilterOption/BnFilterOption.vue +0 -160
- package/packages/BnFunExpr/BnFunExpr.vue +0 -608
- package/packages/BnImportOrder/BnImportOrder.vue +0 -323
- package/packages/BnImportTemplate/BnImportTemplate.vue +0 -866
- package/packages/BnImportTemplate/assets/merge_tip_img.png +0 -0
- package/packages/BnImportTemplate/assets/sheet_tip.png +0 -0
- package/packages/BnImportTemplate/assets/xls.png +0 -0
- package/packages/BnImportTemplate/components/ImportTemplateTrigger.vue +0 -198
- package/packages/BnImportTemplate/components/TemplateEditDialog.vue +0 -340
- package/packages/BnImportTemplate/components/TemplateFieldsConfig.vue +0 -401
- package/packages/BnImportTemplate/components/TemplateListDialog.vue +0 -297
- package/packages/BnInpNum/BnInpNum.vue +0 -165
- package/packages/BnMenus/BnMenus.vue +0 -502
- package/packages/BnMenus/MenuItem.vue +0 -321
- package/packages/BnOrderCard/BnOrderCard.vue +0 -389
- package/packages/BnOrderCard/orderRemark.vue +0 -178
- package/packages/BnOrderCard/util.js +0 -94
- package/packages/BnOrderDetail/BnOrderDetail.vue +0 -338
- package/packages/BnOrderDetail/filterLogByUser.vue +0 -108
- package/packages/BnOrderDetail/orderLogs.vue +0 -53
- package/packages/BnOrderDetail/showSubForm/index.vue +0 -41
- package/packages/BnOrderDetail/showSubForm/showChildTable.vue +0 -61
- package/packages/BnOrderDetail/showSubForm/showTimeLine.vue +0 -131
- package/packages/BnOrderDetail/showSubForm/tableCellCopy.vue +0 -84
- package/packages/BnOrderShare/index.vue +0 -378
- package/packages/BnOrderShare/shareUrlInp.vue +0 -54
- package/packages/BnRadio/BnRadio.vue +0 -181
- package/packages/BnRelation/BnRelation.vue +0 -120
- package/packages/BnSelect/BnSelect.vue +0 -485
- package/packages/BnSmartForm/BnBatchForm.vue +0 -334
- package/packages/BnSmartForm/BnBatchFormDialog.vue +0 -423
- package/packages/BnSmartForm/BnSmartElf/elfLog/index.vue +0 -57
- package/packages/BnSmartForm/BnSmartElf/index.vue +0 -95
- package/packages/BnSmartForm/BnSmartFormPsychic.js +0 -629
- package/packages/BnSmartForm/BnSmartFormUtil.js +0 -524
- package/packages/BnSmartForm/addressForm/index.vue +0 -73
- package/packages/BnSmartForm/checkboxForm/index.vue +0 -99
- package/packages/BnSmartForm/childrenForm/childFormFile.vue +0 -237
- package/packages/BnSmartForm/childrenForm/childrenFormBody.vue +0 -260
- package/packages/BnSmartForm/childrenForm/index.vue +0 -110
- package/packages/BnSmartForm/childrenForm/searchInventory.vue +0 -115
- package/packages/BnSmartForm/chooseAssocTable/chooseAssocTable.vue +0 -451
- package/packages/BnSmartForm/chooseAssocTable/chooseChildGood.vue +0 -229
- package/packages/BnSmartForm/chooseAssocTable/tableCellCopy.vue +0 -84
- package/packages/BnSmartForm/chooseChildOrder/chooseChildOrder.vue +0 -158
- package/packages/BnSmartForm/chooseIPaasData/chooseIPaasData.vue +0 -307
- package/packages/BnSmartForm/chooseIPaasData/tableCellCopy.vue +0 -84
- package/packages/BnSmartForm/choosePackage/choosePackage.vue +0 -361
- package/packages/BnSmartForm/dateDualForm/index.vue +0 -37
- package/packages/BnSmartForm/dateForm/index.vue +0 -38
- package/packages/BnSmartForm/fileForm/fileFormData.js +0 -50
- package/packages/BnSmartForm/fileForm/index.vue +0 -240
- package/packages/BnSmartForm/formItemFooter/formItemFooter.vue +0 -38
- package/packages/BnSmartForm/formItemTop/formItemTop.vue +0 -42
- package/packages/BnSmartForm/index.vue +0 -1201
- package/packages/BnSmartForm/numberForm/index.vue +0 -63
- package/packages/BnSmartForm/radioForm/index.vue +0 -72
- package/packages/BnSmartForm/receiveForm/index.vue +0 -112
- package/packages/BnSmartForm/relationForm/index.vue +0 -82
- package/packages/BnSmartForm/scoreForm/index.vue +0 -39
- package/packages/BnSmartForm/selectForm/index.vue +0 -55
- package/packages/BnSmartForm/showValForm/index.vue +0 -42
- package/packages/BnSmartForm/showValForm/showValFormTable.vue +0 -104
- package/packages/BnSmartForm/smartFormsCommon.scss +0 -43
- package/packages/BnSmartForm/stringForm/index.vue +0 -170
- package/packages/BnVirtPopover/index.vue +0 -319
- package/packages/BnWebLog/BnWebLog.vue +0 -140
- package/packages/BnWorkSettingDrop/advancedOptions.js +0 -112
- package/packages/BnWorkSettingDrop/benBenAIUtil.js +0 -89
- package/packages/BnWorkSettingDrop/index.vue +0 -292
- package/packages/font/iconfont.css +0 -243
- package/packages/font/iconfont.ttf +0 -0
- package/packages/font/iconfont.woff +0 -0
- package/packages/font/iconfont.woff2 +0 -0
- package/utils/addressParse-old.js +0 -645
- package/utils/addressParse.js +0 -735
- package/utils/config.js +0 -68
- package/utils/index.js +0 -1171
|
@@ -1,524 +0,0 @@
|
|
|
1
|
-
import {cloneDeep, isEmpty, last, get} from "lodash";
|
|
2
|
-
// 表单组件map
|
|
3
|
-
export const FORM_TYPES = {
|
|
4
|
-
1: "stringForm", // 单行文本输入框
|
|
5
|
-
2: "numberForm", // 数字输入框
|
|
6
|
-
3: "radioForm", // 单选框
|
|
7
|
-
4: "selectForm", // 下拉选择框
|
|
8
|
-
5: "checkboxForm", // 多选框
|
|
9
|
-
6: "relationForm", // 单选(级联选择)
|
|
10
|
-
20: "relationForm", // 多选(级联选择)
|
|
11
|
-
7: "dateForm", // 日期选择框
|
|
12
|
-
8: "dateDualForm", // 日期区间选择
|
|
13
|
-
10: "fileForm", // 文件上传
|
|
14
|
-
13: "childrenForm", // 子表单(嵌套表单)
|
|
15
|
-
14: "addressForm", // 地址组件
|
|
16
|
-
15: "receiveForm", // 收寄信息组件
|
|
17
|
-
9: "scoreForm", // 评分组件
|
|
18
|
-
// 11: "editorForm", // 富文本编辑器
|
|
19
|
-
// 12: "labelForm", // 标签组件
|
|
20
|
-
// 17: "associationQueryForm", // 关联查询表单
|
|
21
|
-
// 18: "describeForm", // 描述文本组件
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
// 表单事件
|
|
25
|
-
export const FORM_EVENT = {
|
|
26
|
-
// 默认值关联组件。填充和被填充的可以是子表单子组件。被填充的都是单行文本组件,关联的可以时任意组件。
|
|
27
|
-
defaultLink: {
|
|
28
|
-
column: [],//触发事件的组件code,包含子表单子组件code
|
|
29
|
-
//事件触发后,将要change后的组件值,赋予forColumn中的组件value上。{组件id:[##关联id,##关联id,自定义输入,##关联id...]}
|
|
30
|
-
setColumn: {},
|
|
31
|
-
},
|
|
32
|
-
// 组件映射。下拉、单选支持组件的选项相互映射匹配:不支持子表单
|
|
33
|
-
columnMapping: {
|
|
34
|
-
column: [],//触发事件的组件,注意 这里记录的是id
|
|
35
|
-
defaultColumn:{},//梳理规则时,记录触发事件的组件,是否有默认值,如果有值就要先触发一遍映射规则
|
|
36
|
-
//事件触发后,将要change后的组件值,赋予forColumn中的组件value上。{组件id:[##关联id,##关联id,自定义输入,##关联id...]}
|
|
37
|
-
setColumn: {},
|
|
38
|
-
},
|
|
39
|
-
// 级联组件关联组件查询选项
|
|
40
|
-
relationColumns:{}
|
|
41
|
-
|
|
42
|
-
};
|
|
43
|
-
|
|
44
|
-
/**
|
|
45
|
-
* 初始化表单数据
|
|
46
|
-
* 1.将表单数据进行初步整理,有些组件需要在这里做特殊处理
|
|
47
|
-
* 2.找到表单中有默认值关联的组件,列到规则中 extraInfo.defaultInfoRuleCols
|
|
48
|
-
* 3.找到有子表单组件填充规则的组件,跟默认值关联组件合并到一起。 extraInfo.merchantCode 根据统一逻辑处理
|
|
49
|
-
* @param {String} data: 智能表单的整体data
|
|
50
|
-
*
|
|
51
|
-
* */
|
|
52
|
-
/**
|
|
53
|
-
* 根据目标组件类型转换映射值
|
|
54
|
-
* 联动组件(behaviorType=6)转为codes数组,其他组件深拷贝原值
|
|
55
|
-
*/
|
|
56
|
-
export function toMappingValue(item, toValue) {
|
|
57
|
-
return item.behaviorType == 6 && toValue.value
|
|
58
|
-
? toValue.value.map(v => v.code)
|
|
59
|
-
: cloneDeep(toValue);
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
/**
|
|
63
|
-
* 获取触发组件的匹配码
|
|
64
|
-
* 联动组件取数组最后一个值,其他组件取code或id
|
|
65
|
-
*/
|
|
66
|
-
export function getTriggerCode(column) {
|
|
67
|
-
if (column.behaviorType == 6 && Array.isArray(column.value)) {
|
|
68
|
-
return column.value.length > 0 ? last(column.value) : null;
|
|
69
|
-
}
|
|
70
|
-
return get(column, 'value.code') || get(column, 'value.id');
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
export function initFormData(componentList) {
|
|
74
|
-
let defaultLink = cloneDeep(FORM_EVENT.defaultLink)
|
|
75
|
-
let columnMapping = cloneDeep(FORM_EVENT.columnMapping)
|
|
76
|
-
let hasExprExec = false;//是否有函数表达式、
|
|
77
|
-
let relationColumns = {};
|
|
78
|
-
try {
|
|
79
|
-
for (let i in componentList) {
|
|
80
|
-
if(!hasExprExec && componentList[i].extraInfo?.exprExec){
|
|
81
|
-
hasExprExec = true;
|
|
82
|
-
}
|
|
83
|
-
// 识别单行文本,设置的默认值关联组件,相关规则
|
|
84
|
-
if (componentList[i].behaviorType == 1 && componentList[i].defaultInfo) {
|
|
85
|
-
let {codes, defaultVal} = getDefaultLink(componentList[i]);
|
|
86
|
-
if (codes.length > 0) {
|
|
87
|
-
// 只要change后会触发单行本文的value变化的组件code,都记录到 column 中。
|
|
88
|
-
defaultLink.column = Array.from(new Set([...codes, ...defaultLink.column]))
|
|
89
|
-
// column中的组件变化后,是否会触发这个单行文本变化,记录到setColumn中 [cId,Cid]。这样触发的时候就不会乱了。
|
|
90
|
-
defaultLink.setColumn[componentList[i].columnCode] = defaultVal;
|
|
91
|
-
// 如果有默认值规则,初始化的时候就进行一遍赋值
|
|
92
|
-
componentList[i].value = initDefaultLinkVal(componentList, defaultVal);
|
|
93
|
-
}
|
|
94
|
-
}
|
|
95
|
-
//识别子表单子组件中单行文本,设置的默认值关联组件,相关规则。。。这个事件要以外部组件的视角去触发
|
|
96
|
-
if (componentList[i].behaviorType == 13 &&
|
|
97
|
-
componentList[i].moduleDefinition &&
|
|
98
|
-
componentList[i].moduleDefinition.length) {
|
|
99
|
-
componentList[i].moduleDefinition.forEach(child => {
|
|
100
|
-
if(!hasExprExec && child.extraInfo?.exprExec){
|
|
101
|
-
hasExprExec = true;
|
|
102
|
-
}
|
|
103
|
-
// 梳理默认值关联组件
|
|
104
|
-
if (child.behaviorType == 1 && child.defaultInfo) {
|
|
105
|
-
let {codes, defaultVal} = getDefaultLink(child);
|
|
106
|
-
if (codes.length > 0) {
|
|
107
|
-
// 给子表单组件内所有子组件默认值关联了的组件做记录
|
|
108
|
-
if (!defaultLink.setColumn[componentList[i].columnCode]) {
|
|
109
|
-
defaultLink.setColumn[componentList[i].columnCode] = [...codes];
|
|
110
|
-
} else {
|
|
111
|
-
defaultLink.setColumn[componentList[i].columnCode] = Array.from(new Set([...codes, ...defaultLink.setColumn[componentList[i].columnCode]]))
|
|
112
|
-
}
|
|
113
|
-
defaultLink.column = Array.from(new Set([...codes, ...defaultLink.column]))
|
|
114
|
-
defaultLink.setColumn[`${componentList[i].columnCode}.${child.columnCode}`] = defaultVal;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
117
|
-
})
|
|
118
|
-
}
|
|
119
|
-
// 判断是否有整理组件映射相关规则
|
|
120
|
-
let curItem = componentList[i];
|
|
121
|
-
let mapCode = get(curItem, 'extraInfo.mapColumnCode');
|
|
122
|
-
let mapValue = get(curItem, 'extraInfo.mapColumnValue');
|
|
123
|
-
if([3,4,6].includes(curItem.behaviorType) && mapCode && mapValue && mapValue != '[]'){
|
|
124
|
-
let mappings = JSON.parse(mapValue);
|
|
125
|
-
// 处理触发组件的默认值
|
|
126
|
-
if(!columnMapping.defaultColumn[mapCode]){
|
|
127
|
-
let triggerCol = componentList.find(c => c.columnCode == mapCode);
|
|
128
|
-
let defaultVal = Array.isArray(triggerCol.value) && !isEmpty(triggerCol.value)
|
|
129
|
-
? { code: last(triggerCol.value), value: triggerCol.value }
|
|
130
|
-
: (get(triggerCol, 'value.code') ? triggerCol.value : {});
|
|
131
|
-
columnMapping.defaultColumn[mapCode] = defaultVal;
|
|
132
|
-
}
|
|
133
|
-
columnMapping.column = Array.from(new Set([mapCode, ...columnMapping.column]))
|
|
134
|
-
if(!columnMapping.setColumn[mapCode]) columnMapping.setColumn[mapCode] = {};
|
|
135
|
-
columnMapping.setColumn[mapCode][curItem.columnCode] = mappings;
|
|
136
|
-
// 有默认值则处理映射
|
|
137
|
-
let defCode = get(columnMapping.defaultColumn[mapCode], 'code');
|
|
138
|
-
if(defCode){
|
|
139
|
-
let matched = mappings.find(m => String(m.fromValue.code) == String(defCode));
|
|
140
|
-
if(matched) curItem.value = toMappingValue(curItem, matched.toValue);
|
|
141
|
-
}
|
|
142
|
-
}
|
|
143
|
-
//联动组件关联过滤联动选项
|
|
144
|
-
if([6,20].includes(curItem.behaviorType) && curItem.extraInfo.relationColumns){
|
|
145
|
-
curItem.extraInfo.relationColumns.forEach(item=>{
|
|
146
|
-
if(relationColumns[item]){
|
|
147
|
-
relationColumns[item].push(curItem.columnCode)
|
|
148
|
-
}else{
|
|
149
|
-
relationColumns[item]=[curItem.columnCode]
|
|
150
|
-
}
|
|
151
|
-
})
|
|
152
|
-
}
|
|
153
|
-
}
|
|
154
|
-
} catch (e) {
|
|
155
|
-
console.log("smartForms.initFormDataErr:" + e)
|
|
156
|
-
}
|
|
157
|
-
console.log(relationColumns)
|
|
158
|
-
return {defaultLink,columnMapping,hasExprExec,relationColumns};
|
|
159
|
-
}
|
|
160
|
-
|
|
161
|
-
/**
|
|
162
|
-
* 格式化单行文本默认值关联组件的规则
|
|
163
|
-
* */
|
|
164
|
-
function getDefaultLink(data) {
|
|
165
|
-
let codes = []
|
|
166
|
-
// 首先根据组件默认值,将默认值用$符号拆分
|
|
167
|
-
let defaultVal = data.defaultInfo.split('$').filter(items => items);
|
|
168
|
-
if (data.extraInfo.defaultInfoRuleCols && data.extraInfo.defaultInfoRuleCols.length) {
|
|
169
|
-
data.extraInfo.defaultInfoRuleCols.forEach(item => {
|
|
170
|
-
codes.push(item.columnCode);
|
|
171
|
-
let index = defaultVal.indexOf(item.name);
|
|
172
|
-
if (index >= 0) {
|
|
173
|
-
defaultVal[index] = `##${item.columnCode}`;
|
|
174
|
-
}
|
|
175
|
-
})
|
|
176
|
-
}
|
|
177
|
-
return {codes, defaultVal};
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
/**
|
|
181
|
-
* 组装符合默认值关联组件的所有组件的值
|
|
182
|
-
* */
|
|
183
|
-
export function initDefaultLinkVal(components, defaultVal) {
|
|
184
|
-
let text = cloneDeep(defaultVal);
|
|
185
|
-
components.forEach(item => {
|
|
186
|
-
let index = text.indexOf(`##${item.columnCode}`)
|
|
187
|
-
if (index > -1) {
|
|
188
|
-
text[index] = getColumnValText(item)
|
|
189
|
-
}
|
|
190
|
-
})
|
|
191
|
-
return text.join();
|
|
192
|
-
}
|
|
193
|
-
/**
|
|
194
|
-
* 用于选择包裹、选择子商品时,对包裹和商品列表中的数据转化成文字展示
|
|
195
|
-
* 获取单个组件的value,转化成string
|
|
196
|
-
* @param {String} data: 组件data
|
|
197
|
-
* isTable:是不是展示表单中的值
|
|
198
|
-
* val:表单中值的val
|
|
199
|
-
* */
|
|
200
|
-
export function getColumnValText(data,isTable,val) {
|
|
201
|
-
//子表单表格数据展示
|
|
202
|
-
if(isTable){
|
|
203
|
-
data = JSON.parse(JSON.stringify(data))
|
|
204
|
-
data.value = val || null
|
|
205
|
-
}
|
|
206
|
-
let text = '';
|
|
207
|
-
try {
|
|
208
|
-
switch (data.behaviorType) {
|
|
209
|
-
case 1:
|
|
210
|
-
case 2:
|
|
211
|
-
case 7:
|
|
212
|
-
case 9: {
|
|
213
|
-
text = data.value;
|
|
214
|
-
break;
|
|
215
|
-
}
|
|
216
|
-
case 3:
|
|
217
|
-
case 4: {
|
|
218
|
-
text = data.value?.title;
|
|
219
|
-
break;
|
|
220
|
-
}
|
|
221
|
-
case 5:
|
|
222
|
-
// 附件
|
|
223
|
-
case 10:
|
|
224
|
-
case 12: {
|
|
225
|
-
let length = data.value.length;
|
|
226
|
-
data.value.map((item, index) => {
|
|
227
|
-
text = text + item.title;
|
|
228
|
-
if ((index + 1) < length) {
|
|
229
|
-
text = text + ','
|
|
230
|
-
}
|
|
231
|
-
})
|
|
232
|
-
break;
|
|
233
|
-
}
|
|
234
|
-
case 6:
|
|
235
|
-
{
|
|
236
|
-
const idTitleMap = new Map();
|
|
237
|
-
const flattenTree = (list) => {
|
|
238
|
-
for (const item of list) {
|
|
239
|
-
idTitleMap.set(String(item.id), item.title);
|
|
240
|
-
if (item.children && item.children.length) {
|
|
241
|
-
flattenTree(item.children);
|
|
242
|
-
}
|
|
243
|
-
}
|
|
244
|
-
};
|
|
245
|
-
flattenTree((data.moduleDefinition && data.moduleDefinition.optionList) || []);
|
|
246
|
-
text = text + data.value.map(id => idTitleMap.get(String(id)) ?? '').join(',');
|
|
247
|
-
break;
|
|
248
|
-
}
|
|
249
|
-
case 8: {
|
|
250
|
-
let length = data.value ? data.value.length : 0;
|
|
251
|
-
if (length > 0) {
|
|
252
|
-
text = data.value.join(' —— ')
|
|
253
|
-
}
|
|
254
|
-
break;
|
|
255
|
-
}
|
|
256
|
-
case 11:
|
|
257
|
-
case 13:
|
|
258
|
-
{
|
|
259
|
-
text = data.value?"查看详情":""
|
|
260
|
-
break;
|
|
261
|
-
}
|
|
262
|
-
case 14:
|
|
263
|
-
{
|
|
264
|
-
let address = []
|
|
265
|
-
if(data.value[data.moduleDefinition[0].columnCode].length>0){
|
|
266
|
-
address = data.value[data.moduleDefinition[0].columnCode].map(v=>v.title)
|
|
267
|
-
}
|
|
268
|
-
if(data.value[data.moduleDefinition[1].columnCode]){
|
|
269
|
-
address.push(data.value[data.moduleDefinition[1].columnCode]);
|
|
270
|
-
}
|
|
271
|
-
if(address.length > 0){
|
|
272
|
-
text = address.join(',')
|
|
273
|
-
}
|
|
274
|
-
break;
|
|
275
|
-
}
|
|
276
|
-
case 15:
|
|
277
|
-
{
|
|
278
|
-
let address = []
|
|
279
|
-
if(data.value[data.moduleDefinition[0].columnCode]){
|
|
280
|
-
address.push(data.value[data.moduleDefinition[0].columnCode]);
|
|
281
|
-
}
|
|
282
|
-
if(data.value[data.moduleDefinition[1].columnCode]){
|
|
283
|
-
address.push(data.value[data.moduleDefinition[1].columnCode]);
|
|
284
|
-
}
|
|
285
|
-
if(data.value[data.moduleDefinition[2].columnCode]){
|
|
286
|
-
address = data.value[data.moduleDefinition[2].columnCode].map(v=>v.title)
|
|
287
|
-
}
|
|
288
|
-
if(data.value[data.moduleDefinition[3].columnCode]){
|
|
289
|
-
address.push(data.value[data.moduleDefinition[3].columnCode]);
|
|
290
|
-
}
|
|
291
|
-
if(address.length > 0){
|
|
292
|
-
text = address.join(',')
|
|
293
|
-
}
|
|
294
|
-
break;
|
|
295
|
-
}
|
|
296
|
-
}
|
|
297
|
-
} catch (e) {
|
|
298
|
-
console.log("getColumnValTextErr:" + e)
|
|
299
|
-
}
|
|
300
|
-
return text;
|
|
301
|
-
}
|
|
302
|
-
|
|
303
|
-
/**
|
|
304
|
-
* 校验子表单的value必填项有没有填写 childrenFormData:子表单组件的完整对象数据 包含条件,包含value值
|
|
305
|
-
* taskId:通过taskId判断是编辑任务还是新建任务 从而判断子组件是否被禁用
|
|
306
|
-
* */
|
|
307
|
-
export function checkChildrenFormValue(childrenFormData, taskId) {
|
|
308
|
-
// 校验子表单的value必填
|
|
309
|
-
for (let i in childrenFormData.moduleDefinition) {
|
|
310
|
-
let column = childrenFormData.moduleDefinition[i];
|
|
311
|
-
let hideComponent = (!taskId && column.extraInfo.isAddable != '1') || (taskId && column.extraInfo.isEditable != '1');
|
|
312
|
-
let errorMsg = '';
|
|
313
|
-
//是否校验必填
|
|
314
|
-
let isValueEmptyCheck = !hideComponent && (column.extraInfo?.valueEmptyCheck == '1') ? true : false;
|
|
315
|
-
for (let c in childrenFormData.value) {
|
|
316
|
-
let flag = false;
|
|
317
|
-
switch (column.behaviorType) {
|
|
318
|
-
case 1: //文本
|
|
319
|
-
case 3: //单选
|
|
320
|
-
case 4: //下拉
|
|
321
|
-
case 5: //多选
|
|
322
|
-
case 6: //联动
|
|
323
|
-
case 10: //附件
|
|
324
|
-
case 7: //日期
|
|
325
|
-
{
|
|
326
|
-
if (isValueEmptyCheck && isEmpty(childrenFormData.value[c][column.columnCode]) ) {
|
|
327
|
-
flag = true;
|
|
328
|
-
errorMsg = childrenFormData.name + ' 的第' + (parseInt(c) + 1) + '条,没有给 ' + column.name + ' 填值';
|
|
329
|
-
}
|
|
330
|
-
break;
|
|
331
|
-
}
|
|
332
|
-
case 2: {
|
|
333
|
-
let numVal = childrenFormData.value[c][column.columnCode]
|
|
334
|
-
if (isValueEmptyCheck && (numVal=== undefined || numVal === null || numVal === '')) {
|
|
335
|
-
flag = true;
|
|
336
|
-
errorMsg = childrenFormData.name + ' 的第' + (parseInt(c) + 1) + '条,没有给 ' + column.name + ' 填写有效数字';
|
|
337
|
-
}
|
|
338
|
-
break;
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
if (flag) {
|
|
342
|
-
break;
|
|
343
|
-
}
|
|
344
|
-
}
|
|
345
|
-
if (errorMsg) {
|
|
346
|
-
return errorMsg;
|
|
347
|
-
}
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
}
|
|
351
|
-
}
|
|
352
|
-
/**
|
|
353
|
-
* 图片截图转换base64格式
|
|
354
|
-
* */
|
|
355
|
-
export function convertBase64UrlToFile(urlData) {
|
|
356
|
-
let bytes = window.atob(urlData.split(',')[1]); //去掉url的头,并转换为byte
|
|
357
|
-
//处理异常,将ascii码小于0的转换为大于0
|
|
358
|
-
let ab = new ArrayBuffer(bytes.length);
|
|
359
|
-
let ia = new Uint8Array(ab);
|
|
360
|
-
for (let i = 0; i < bytes.length; i++) {
|
|
361
|
-
ia[i] = bytes.charCodeAt(i);
|
|
362
|
-
}
|
|
363
|
-
return new File([ab], new Date().getTime() + '.png');
|
|
364
|
-
}
|
|
365
|
-
/**
|
|
366
|
-
* 图片截图复制上传
|
|
367
|
-
* */
|
|
368
|
-
export function pasteImg(evt, uploaderUrl) {
|
|
369
|
-
return new Promise((resolve) => {
|
|
370
|
-
if (evt.clipboardData && evt.clipboardData.items) {
|
|
371
|
-
let items = Array.prototype.filter.call(evt.clipboardData.items, element => {
|
|
372
|
-
return element.type.indexOf("image") >= 0;
|
|
373
|
-
});
|
|
374
|
-
Array.prototype.forEach.call(items, item => {
|
|
375
|
-
let blob = item.getAsFile();
|
|
376
|
-
let reader = new FileReader();
|
|
377
|
-
reader.onloadend = event => {
|
|
378
|
-
let imgBase64 = event.target.result;
|
|
379
|
-
let file = convertBase64UrlToFile(imgBase64)
|
|
380
|
-
let formData = new FormData();
|
|
381
|
-
formData.append('file', file);
|
|
382
|
-
formData.append('source', 'task');
|
|
383
|
-
let xhr = new XMLHttpRequest();
|
|
384
|
-
xhr.open('POST', uploaderUrl);
|
|
385
|
-
xhr.onload = () => {
|
|
386
|
-
if (xhr.readyState === 4) {
|
|
387
|
-
if (xhr.status === 200) {
|
|
388
|
-
let res = JSON.parse(xhr.responseText);
|
|
389
|
-
resolve(res)
|
|
390
|
-
} else {
|
|
391
|
-
resolve({code: 8080, msg: '你的浏览器不支持复制上传图片'})
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
};
|
|
395
|
-
xhr.onerror = function () {
|
|
396
|
-
resolve({code: 8080, msg: '你的浏览器不支持复制上传图片'})
|
|
397
|
-
};
|
|
398
|
-
xhr.send(formData);
|
|
399
|
-
};
|
|
400
|
-
reader.readAsDataURL(blob);
|
|
401
|
-
});
|
|
402
|
-
} else {
|
|
403
|
-
resolve({code: 8080, msg: '你的浏览器不支持复制上传图片'})
|
|
404
|
-
}
|
|
405
|
-
})
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
/**
|
|
409
|
-
* 比较两个值是否相等,考虑不同behaviorType的value格式
|
|
410
|
-
* @param {any} oldValue 旧值
|
|
411
|
-
* @param {any} newValue 新值
|
|
412
|
-
* @param {number} behaviorType 组件类型
|
|
413
|
-
* @returns {boolean} 是否相等
|
|
414
|
-
*/
|
|
415
|
-
export function isValueEqual(oldValue, newValue, behaviorType) {
|
|
416
|
-
// 如果两个值都是null或undefined,认为相等
|
|
417
|
-
if (oldValue == null && newValue == null) {
|
|
418
|
-
return true;
|
|
419
|
-
}
|
|
420
|
-
|
|
421
|
-
// 如果只有一个值是null或undefined,认为不相等
|
|
422
|
-
if (oldValue == null || newValue == null) {
|
|
423
|
-
return false;
|
|
424
|
-
}
|
|
425
|
-
|
|
426
|
-
try {
|
|
427
|
-
switch (behaviorType) {
|
|
428
|
-
case 1: // 单行文本输入框
|
|
429
|
-
case 2: // 数字输入框
|
|
430
|
-
case 7: // 日期选择框
|
|
431
|
-
case 9: // 评分组件
|
|
432
|
-
case 11: // 富文本编辑器
|
|
433
|
-
{
|
|
434
|
-
// 简单类型直接比较
|
|
435
|
-
return oldValue === newValue;
|
|
436
|
-
}
|
|
437
|
-
case 3: // 单选框
|
|
438
|
-
case 4: // 下拉选择框
|
|
439
|
-
{
|
|
440
|
-
// 对象类型,比较title或code
|
|
441
|
-
if (typeof oldValue === 'object' && typeof newValue === 'object') {
|
|
442
|
-
return oldValue.title === newValue.title && oldValue.code === newValue.code;
|
|
443
|
-
}
|
|
444
|
-
return oldValue === newValue;
|
|
445
|
-
}
|
|
446
|
-
case 5: // 多选框
|
|
447
|
-
case 6: // 单选(级联选择)
|
|
448
|
-
case 20: // 多选(级联选择)
|
|
449
|
-
case 10: // 文件上传
|
|
450
|
-
case 12: // 标签组件
|
|
451
|
-
{
|
|
452
|
-
// 数组类型,比较长度和内容
|
|
453
|
-
if (Array.isArray(oldValue) && Array.isArray(newValue)) {
|
|
454
|
-
if (oldValue.length !== newValue.length) {
|
|
455
|
-
return false;
|
|
456
|
-
}
|
|
457
|
-
// 比较每个元素
|
|
458
|
-
return oldValue.every((item, index) => {
|
|
459
|
-
const newItem = newValue[index];
|
|
460
|
-
if (typeof item === 'object' && typeof newItem === 'object') {
|
|
461
|
-
return item.title === newItem.title || item.code === newItem.code;
|
|
462
|
-
}
|
|
463
|
-
return item === newItem;
|
|
464
|
-
});
|
|
465
|
-
}
|
|
466
|
-
return oldValue === newValue;
|
|
467
|
-
}
|
|
468
|
-
case 8: // 日期区间选择
|
|
469
|
-
{
|
|
470
|
-
// 数组类型,比较日期区间
|
|
471
|
-
if (Array.isArray(oldValue) && Array.isArray(newValue)) {
|
|
472
|
-
if (oldValue.length !== newValue.length) {
|
|
473
|
-
return false;
|
|
474
|
-
}
|
|
475
|
-
return oldValue.every((item, index) => item === newValue[index]);
|
|
476
|
-
}
|
|
477
|
-
return oldValue === newValue;
|
|
478
|
-
}
|
|
479
|
-
default:
|
|
480
|
-
// 默认使用严格相等比较
|
|
481
|
-
return oldValue === newValue;
|
|
482
|
-
}
|
|
483
|
-
} catch (e) {
|
|
484
|
-
console.log("isValueEqualErr:" + e);
|
|
485
|
-
// 出错时使用默认比较
|
|
486
|
-
return oldValue === newValue;
|
|
487
|
-
}
|
|
488
|
-
}
|
|
489
|
-
|
|
490
|
-
/**
|
|
491
|
-
* 子表单关联表数据,设置关联筛选条件,触发筛选后获取到数据,需要根据内部数据源转化
|
|
492
|
-
* @param {any} oldValue 旧值
|
|
493
|
-
* @param {any} newValue 新值
|
|
494
|
-
* @param {number} behaviorType 组件类型
|
|
495
|
-
* @returns {boolean} 是否相等
|
|
496
|
-
*/
|
|
497
|
-
export function initAccTableSearchVal(column,values) {
|
|
498
|
-
let columnList = column.moduleDefinition.filter(c=>c.insideDataSourceInfo?.fieldCode);
|
|
499
|
-
let valList = values.map(i=>{
|
|
500
|
-
let v = {}
|
|
501
|
-
columnList.forEach(c=>{
|
|
502
|
-
// 当前表的组件code
|
|
503
|
-
const columnCode = c.columnCode;
|
|
504
|
-
// 映射表的组件code
|
|
505
|
-
const insideFiled = c.insideDataSourceInfo.fieldCode;
|
|
506
|
-
if (i.hasOwnProperty(insideFiled)) {
|
|
507
|
-
// 如果 inside 中有这个字段,使用原值
|
|
508
|
-
v[columnCode] = i[insideFiled];
|
|
509
|
-
}
|
|
510
|
-
})
|
|
511
|
-
return v
|
|
512
|
-
})
|
|
513
|
-
return valList
|
|
514
|
-
}
|
|
515
|
-
// 判断原来value类型,然会默认空值
|
|
516
|
-
export function getEmptyVal(val){
|
|
517
|
-
if(Array.isArray(val)){
|
|
518
|
-
return []
|
|
519
|
-
}else if(typeof val == 'object'){
|
|
520
|
-
return {}
|
|
521
|
-
}else{
|
|
522
|
-
return ''
|
|
523
|
-
}
|
|
524
|
-
}
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
<!--地址组件-->
|
|
2
|
-
<template>
|
|
3
|
-
<div class="w-default-wrap">
|
|
4
|
-
<formItemTop :column="column"/>
|
|
5
|
-
<BnAddressParse @parse="autoParse" :post-func="postFunc"></BnAddressParse>
|
|
6
|
-
<div class="w-default-wrap w-margin-bottom10">
|
|
7
|
-
<BnAddress v-model="column.value[column.moduleDefinition[0].columnCode]" :postFunc="postFunc" @change="onChange" value-key="code"
|
|
8
|
-
:pathUrl="column.pathUrl || '/address/getAreaDataList'" :disabled="disabled"></BnAddress>
|
|
9
|
-
</div>
|
|
10
|
-
<div class="w-default-wrap">
|
|
11
|
-
<el-input v-model="column.value[column.moduleDefinition[1].columnCode]" type="textarea" :rows="3" :disabled="disabled"
|
|
12
|
-
resize="none" placeholder="输入详细地址"
|
|
13
|
-
@input="onInput" @focus="onFocus" @blur="onBlur" clearable show-word-limit>
|
|
14
|
-
</el-input>
|
|
15
|
-
</div>
|
|
16
|
-
<formItemFooter :column="column"/>
|
|
17
|
-
</div>
|
|
18
|
-
</template>
|
|
19
|
-
<script>
|
|
20
|
-
import {debounce} from "lodash";
|
|
21
|
-
import formItemTop from "../formItemTop/formItemTop.vue";
|
|
22
|
-
import formItemFooter from "../formItemFooter/formItemFooter.vue";
|
|
23
|
-
import BnAddressParse from "../../BnAddressParse/index.vue";
|
|
24
|
-
export default {
|
|
25
|
-
name: "addressForm",
|
|
26
|
-
components: {BnAddressParse, formItemTop, formItemFooter},
|
|
27
|
-
props: {
|
|
28
|
-
column: Object,
|
|
29
|
-
disabled:Boolean,
|
|
30
|
-
postFunc:Function,
|
|
31
|
-
},
|
|
32
|
-
methods: {
|
|
33
|
-
/**
|
|
34
|
-
* 输入框输入事件
|
|
35
|
-
* */
|
|
36
|
-
onInput(e) {
|
|
37
|
-
this.column.error = '';
|
|
38
|
-
this.column.warning = '';
|
|
39
|
-
this.$emit('onInput', this.column)
|
|
40
|
-
this.onChange(e)
|
|
41
|
-
},
|
|
42
|
-
/**
|
|
43
|
-
* 输入框Change事件
|
|
44
|
-
* @param {String} type 是否是其他事件类型
|
|
45
|
-
* */
|
|
46
|
-
onChange: debounce(function (e, type) {
|
|
47
|
-
this.column.error = '';
|
|
48
|
-
this.column.warning = '';
|
|
49
|
-
this.$emit('onChange', this.column)
|
|
50
|
-
}, 600),
|
|
51
|
-
/**
|
|
52
|
-
* 输入框onFocus事件
|
|
53
|
-
* */
|
|
54
|
-
onFocus(e) {
|
|
55
|
-
this.$emit('focus', this.column)
|
|
56
|
-
},
|
|
57
|
-
/**
|
|
58
|
-
* 输入框失去焦点事件
|
|
59
|
-
* */
|
|
60
|
-
onBlur() {
|
|
61
|
-
this.$emit('blur', this.column)
|
|
62
|
-
},
|
|
63
|
-
/**
|
|
64
|
-
*自动识别
|
|
65
|
-
* */
|
|
66
|
-
autoParse(data){
|
|
67
|
-
this.column.value[this.column.moduleDefinition[0].columnCode] = data.address;
|
|
68
|
-
this.column.value[this.column.moduleDefinition[1].columnCode] = data.detail || '';
|
|
69
|
-
this.onChange();
|
|
70
|
-
},
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
</script>
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="w-default-wrap checkboxForm">
|
|
3
|
-
<formItemTop :column="column"/>
|
|
4
|
-
<div class="w-default-wrap checkboxForm-behavior clearFix">
|
|
5
|
-
<div class="checkboxForm-item" v-for="item in column.moduleDefinition"
|
|
6
|
-
:key="item.id">
|
|
7
|
-
<BnCheck :key="item.code" v-model="column.value" :true-data="item" :disabled="disabled"
|
|
8
|
-
:optionProps="{value:'code',label:'title'}" @change="onChange"></BnCheck>
|
|
9
|
-
</div>
|
|
10
|
-
<div class="w-default-wrap checkboxForm-empty" v-if="column.moduleDefinition.length == 0">
|
|
11
|
-
无数据
|
|
12
|
-
</div>
|
|
13
|
-
</div>
|
|
14
|
-
<formItemFooter :column="column"/>
|
|
15
|
-
</div>
|
|
16
|
-
</template>
|
|
17
|
-
|
|
18
|
-
<script>
|
|
19
|
-
import formItemTop from "../formItemTop/formItemTop.vue";
|
|
20
|
-
import formItemFooter from "../formItemFooter/formItemFooter.vue";
|
|
21
|
-
|
|
22
|
-
export default {
|
|
23
|
-
name: "checkboxForm",
|
|
24
|
-
components: {
|
|
25
|
-
formItemFooter,
|
|
26
|
-
formItemTop,
|
|
27
|
-
},
|
|
28
|
-
props: {
|
|
29
|
-
column: {
|
|
30
|
-
type: Object,
|
|
31
|
-
default: function () {
|
|
32
|
-
return {}
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
disabled:Boolean
|
|
36
|
-
},
|
|
37
|
-
methods: {
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
* Change事件
|
|
41
|
-
* */
|
|
42
|
-
onChange(e, type) {
|
|
43
|
-
this.column.error = '';
|
|
44
|
-
this.column.warning = '';
|
|
45
|
-
this.$emit('onChange', this.column,'change')
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
</script>
|
|
50
|
-
<style scoped lang="scss">
|
|
51
|
-
.checkboxForm {
|
|
52
|
-
&-title {
|
|
53
|
-
line-height: 24px !important;
|
|
54
|
-
margin-bottom: 8px;
|
|
55
|
-
// margin-top: 20px;
|
|
56
|
-
// line-height: 32px;
|
|
57
|
-
font-size: 14px;
|
|
58
|
-
color: #666;
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
&-tips {
|
|
62
|
-
line-height: 32px;
|
|
63
|
-
font-size: 12px;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
&-behavior {
|
|
67
|
-
// 建议在引用当前组件的地方设置组件宽度
|
|
68
|
-
// max-width: 444px;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
&-select-behavior {
|
|
72
|
-
// 建议在引用当前组件的地方设置组件宽度
|
|
73
|
-
// max-width: 444px;
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
&-item {
|
|
77
|
-
// width: 100%;
|
|
78
|
-
// height: 32px;
|
|
79
|
-
// line-height: 32px;
|
|
80
|
-
// margin-right: 24px;
|
|
81
|
-
display: inline-block;
|
|
82
|
-
width: calc(33% - 16px);
|
|
83
|
-
line-height: 32px;
|
|
84
|
-
height: 32px;
|
|
85
|
-
min-width: 200px;
|
|
86
|
-
margin-right: 16px;
|
|
87
|
-
vertical-align: middle;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
&-empty {
|
|
91
|
-
width: 330px;
|
|
92
|
-
line-height: 32px;
|
|
93
|
-
text-align: center;
|
|
94
|
-
font-size: 12px;
|
|
95
|
-
color: #999;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
</style>
|
|
99
|
-
|