resolver-egretimp-plus 0.0.4
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/babel.config.js +14 -0
- package/dist/index.js +2 -0
- package/dist/index.js.LICENSE.txt +8 -0
- package/dist/theme/element/index.css +1 -0
- package/dist/theme/element/src/components/card.scss +4 -0
- package/dist/theme/element/src/components/collapse.scss +16 -0
- package/dist/theme/element/src/components/date.scss +13 -0
- package/dist/theme/element/src/components/form.scss +54 -0
- package/dist/theme/element/src/components/index.scss +42 -0
- package/dist/theme/element/src/components/input.scss +15 -0
- package/dist/theme/element/src/components/message.scss +31 -0
- package/dist/theme/element/src/components/scrollbar.scss +14 -0
- package/dist/theme/element/src/components/select.scss +17 -0
- package/dist/theme/element/src/components/steps.scss +6 -0
- package/dist/theme/element/src/components/table.scss +8 -0
- package/dist/theme/element/src/components/tabs.scss +68 -0
- package/dist/theme/element/src/components/tree.scss +0 -0
- package/dist/theme/element/src/index.scss +79 -0
- package/index.js +17 -0
- package/package.json +45 -0
- package/scripts/gulpfile.mjs +73 -0
- package/scripts/webpack.config.js +81 -0
- package/src/analysisComponent.jsx +166 -0
- package/src/components/helper/button.js +17 -0
- package/src/components/helper/dock.js +120 -0
- package/src/components/icons/question-filled.vue +13 -0
- package/src/components/packages/CmiButton.vue +84 -0
- package/src/components/packages/CmiCalendar.vue +138 -0
- package/src/components/packages/CmiCell.vue +34 -0
- package/src/components/packages/CmiCheckbox.vue +63 -0
- package/src/components/packages/CmiDatetimePicker.vue +84 -0
- package/src/components/packages/CmiDropdownMenu.vue +57 -0
- package/src/components/packages/CmiInput.vue +45 -0
- package/src/components/packages/CmiLink.vue +28 -0
- package/src/components/packages/CmiPicker.vue +120 -0
- package/src/components/packages/CmiRadio.vue +29 -0
- package/src/components/packages/CmiSearch.vue +39 -0
- package/src/components/packages/CmiSelect.vue +84 -0
- package/src/components/packages/CustomComponentCard.vue +40 -0
- package/src/components/packages/CustomComponentCardH5.vue +40 -0
- package/src/components/packages/CustomComponentCol.vue +69 -0
- package/src/components/packages/CustomComponentColH5.vue +8 -0
- package/src/components/packages/CustomComponentCollapse.vue +183 -0
- package/src/components/packages/CustomComponentCollapseH5.vue +37 -0
- package/src/components/packages/CustomComponentCycle.vue +95 -0
- package/src/components/packages/CustomComponentCycleTabPane.vue +92 -0
- package/src/components/packages/CustomComponentDialog.vue +162 -0
- package/src/components/packages/CustomComponentEditor.vue +43 -0
- package/src/components/packages/CustomComponentFormLayout.vue +63 -0
- package/src/components/packages/CustomComponentFormLayoutH5.vue +55 -0
- package/src/components/packages/CustomComponentGrid.vue +29 -0
- package/src/components/packages/CustomComponentGridCol.vue +29 -0
- package/src/components/packages/CustomComponentInputDialog.vue +144 -0
- package/src/components/packages/CustomComponentPlain.vue +80 -0
- package/src/components/packages/CustomComponentRow.vue +67 -0
- package/src/components/packages/CustomComponentSelectEmployees.vue +133 -0
- package/src/components/packages/CustomComponentSendMail.vue +72 -0
- package/src/components/packages/CustomComponentSteps.vue +41 -0
- package/src/components/packages/CustomComponentTabPane.vue +41 -0
- package/src/components/packages/CustomComponentTabPaneH5.vue +30 -0
- package/src/components/packages/CustomComponentTable.jsx +406 -0
- package/src/components/packages/CustomComponentTableH5.vue +58 -0
- package/src/components/packages/CustomComponentTabs.vue +75 -0
- package/src/components/packages/CustomComponentTabsH5.vue +86 -0
- package/src/components/packages/CustomComponentTree.vue +28 -0
- package/src/components/packages/ElButton.vue +90 -0
- package/src/components/packages/ElCheckbox.vue +55 -0
- package/src/components/packages/ElDatePicker.vue +58 -0
- package/src/components/packages/ElInput.vue +23 -0
- package/src/components/packages/ElInputNumber.vue +54 -0
- package/src/components/packages/ElPagination.vue +56 -0
- package/src/components/packages/ElRadio.vue +44 -0
- package/src/components/packages/ElSelect.vue +73 -0
- package/src/components/packages/ElText.vue +48 -0
- package/src/components/packages/ElTimePicker.vue +34 -0
- package/src/components/patchComponents.js +46 -0
- package/src/components/styles/CustomComponenTable.scss +125 -0
- package/src/components/tabs/index.js +8 -0
- package/src/components/tabs/src/constants.js +23 -0
- package/src/components/tabs/src/tab-bar.js +8 -0
- package/src/components/tabs/src/tab-bar.vue +92 -0
- package/src/components/tabs/src/tab-nav.jsx +413 -0
- package/src/components/tabs/src/tab-pane.js +15 -0
- package/src/components/tabs/src/tab-pane.vue +80 -0
- package/src/components/tabs/src/tabs.jsx +217 -0
- package/src/components/tabs/style/css.js +2 -0
- package/src/components/tabs/style/index.js +2 -0
- package/src/components/thirdPartyFrame/index.js +32 -0
- package/src/components/thirdPartyFrame/src/ThirdPartyFrame.vue +123 -0
- package/src/hooks/index.js +129 -0
- package/src/hooks/pageConfig.js +20 -0
- package/src/index.jsx +140 -0
- package/src/renderer.jsx +68 -0
- package/src/rules/eventsSupplement.js +439 -0
- package/src/rules/parseCondition.js +359 -0
- package/src/rules/ruleUtils.js +208 -0
- package/src/rules/rulesDriver.js +118 -0
- package/src/theme/element/components/card.scss +4 -0
- package/src/theme/element/components/collapse.scss +16 -0
- package/src/theme/element/components/date.scss +13 -0
- package/src/theme/element/components/form.scss +54 -0
- package/src/theme/element/components/index.scss +42 -0
- package/src/theme/element/components/input.scss +15 -0
- package/src/theme/element/components/message.scss +31 -0
- package/src/theme/element/components/scrollbar.scss +14 -0
- package/src/theme/element/components/select.scss +17 -0
- package/src/theme/element/components/steps.scss +6 -0
- package/src/theme/element/components/table.scss +8 -0
- package/src/theme/element/components/tabs.scss +68 -0
- package/src/theme/element/components/tree.scss +0 -0
- package/src/theme/element/index.scss +79 -0
- package/src/utils/common.js +230 -0
- package/src/utils/const.js +198 -0
- package/src/utils/defaultVal.js +23 -0
- package/src/utils/format.js +19 -0
- package/src/utils/index.js +4 -0
- package/src/utils/is.js +69 -0
- package/src/utils/preserveFunc.js +33 -0
- package/src/utils/render.jsx +714 -0
- package/src/utils/request.js +10 -0
- package/src/utils/valid.js +71 -0
|
@@ -0,0 +1,714 @@
|
|
|
1
|
+
import { getCodeMapRules } from '../rules/rulesDriver.js'
|
|
2
|
+
import { resolveAssetComponents, findComponent, compareComponet, normalPixel, isPlainObject, hasOwn, isFnStr, normalCapitalizeComponent, capitalize, camelize, formatDate} from './common.js'
|
|
3
|
+
import { resolveComponent, inject } from 'vue'
|
|
4
|
+
import getNativeComps from '../components/patchComponents'
|
|
5
|
+
import CustomComponentColH5 from '../components/packages/CustomComponentColH5.vue'
|
|
6
|
+
import { commonPropsType,
|
|
7
|
+
FORM_META_TYPE,
|
|
8
|
+
NOT_NEED_FORM_ITEM_META_TYPE,
|
|
9
|
+
SPECIAL_SET_FULL_WIDTH_ITEM_META_TYPE,
|
|
10
|
+
NOT_NEED_COL_ITEM_META_TYPE,
|
|
11
|
+
MULTI_PAGE_META_LIST_TYPES,
|
|
12
|
+
REPLACE_PREFIX_FLAG,
|
|
13
|
+
PREFIX_FLAG,
|
|
14
|
+
ARG_FLAGS,
|
|
15
|
+
PLAIN_TYPE_COLUMNS,
|
|
16
|
+
PLAIN_TYPE_OPTIONS_COLUMNS,
|
|
17
|
+
CONTEXT_PEDDING_TYPE,
|
|
18
|
+
calcDisable,
|
|
19
|
+
META_TYPE_MAP,
|
|
20
|
+
H5_REPLACE_PREFIX_FLAG,
|
|
21
|
+
H5_PREFIX_FLAG,
|
|
22
|
+
FORM_META_TYPE_H5
|
|
23
|
+
} from './const.js'
|
|
24
|
+
import { preserveCheck } from './preserveFunc.js'
|
|
25
|
+
import { isArray, isFunction, isString } from './is.js'
|
|
26
|
+
import CustomComponentPlain from '../components/packages/CustomComponentPlain.vue'
|
|
27
|
+
import QuestionFilled from '../components/icons/question-filled.vue'
|
|
28
|
+
|
|
29
|
+
// 解析配置中的defStyle属性
|
|
30
|
+
export function parseDefStyle(defStyle) {
|
|
31
|
+
try {
|
|
32
|
+
return JSON.parse(defStyle)
|
|
33
|
+
} catch (error) {
|
|
34
|
+
return {}
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// 解析extendAttr中方法
|
|
39
|
+
function deepParseFnStr(obj, refVal) {
|
|
40
|
+
if (isPlainObject(obj) || Array.isArray(obj)) {
|
|
41
|
+
Object.keys(obj).forEach(key => {
|
|
42
|
+
if (isPlainObject(obj[key]) || Array.isArray(obj[key])) {
|
|
43
|
+
deepParseFnStr(obj[key])
|
|
44
|
+
} else if (isFnStr(obj[key])) {
|
|
45
|
+
obj[key] = eval(`(${obj[key]})`)
|
|
46
|
+
} else {
|
|
47
|
+
if (isString(obj[key])) {
|
|
48
|
+
if (obj[key] === ARG_FLAGS.REF_VAL) {
|
|
49
|
+
obj[key] = refVal || ''
|
|
50
|
+
} else if (obj[key] === ARG_FLAGS.CURRENT_DATE) {
|
|
51
|
+
obj[key] = formatDate(new Date(), 'yyyy-MM-dd')
|
|
52
|
+
} else {
|
|
53
|
+
const { checked, val } = preserveCheck(key, obj[key])
|
|
54
|
+
if (checked) {
|
|
55
|
+
obj[key] = val
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
})
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// 解析配置中的extendAttr属性
|
|
65
|
+
export function parseExtendAttr(config, refVal) {
|
|
66
|
+
if (config.extendAttr) {
|
|
67
|
+
try {
|
|
68
|
+
// return JSON.parse(config.extendAttr, (k, v) => {
|
|
69
|
+
// if (isFnStr(v)) {
|
|
70
|
+
// return eval(`(${v})`)
|
|
71
|
+
// }
|
|
72
|
+
// return v
|
|
73
|
+
// }) || {}
|
|
74
|
+
let obj = eval('(' + config.extendAttr+ ')') || {}
|
|
75
|
+
deepParseFnStr(obj, refVal)
|
|
76
|
+
return obj
|
|
77
|
+
} catch (error) {
|
|
78
|
+
console.log(config.metaCode, '\n===JSON parse err, err==:', error, '\nextendAttr==:', config.extendAttr)
|
|
79
|
+
return {}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return {}
|
|
83
|
+
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// 目前所有的配置都是在form表单下面,但是现在的配置数据没有form配置项,所有我们自己手动增加
|
|
87
|
+
function generateFormConfig(lang = 'zh', isH5) {
|
|
88
|
+
return {
|
|
89
|
+
metaType: isH5 ? FORM_META_TYPE_H5 : FORM_META_TYPE,
|
|
90
|
+
displayType: '1',
|
|
91
|
+
span: 24,
|
|
92
|
+
labelWidth: lang.indexOf('zh') > -1 ? '92px' : '148px',
|
|
93
|
+
'label-position': 'right',
|
|
94
|
+
rootForm: true,
|
|
95
|
+
inline: true
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
*
|
|
101
|
+
* @param {*} config 通过接口获取的配置对象
|
|
102
|
+
*/
|
|
103
|
+
export function parsePageConfig(config, lang, polyfillConfigs, instance, isH5) {
|
|
104
|
+
if (!config) return {}
|
|
105
|
+
const formConfig = generateFormConfig(lang, isH5)
|
|
106
|
+
const hireRelatMapRules = getCodeMapRules(config)
|
|
107
|
+
formConfig.pmPageMetaList = config.pmPageMetaList
|
|
108
|
+
let { pageConfig, mapComp } = normalConfig({ polyfillConfigs, instance }, formConfig)
|
|
109
|
+
return {
|
|
110
|
+
pageConfig,
|
|
111
|
+
mapComp,
|
|
112
|
+
hireRelatMapRules
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* {
|
|
117
|
+
* children: [], // 子元素
|
|
118
|
+
* bindValue: '', // 配置项对应的绑定值
|
|
119
|
+
* }
|
|
120
|
+
* @param {*} config
|
|
121
|
+
*/
|
|
122
|
+
export function normalConfig({ polyfillConfigs, instance }, config, hireRelat = '', mapComp = {}, needformItem = false) {
|
|
123
|
+
const metaCode = config.metaCode || ''
|
|
124
|
+
hireRelat += hireRelat ? `->${metaCode}` : metaCode
|
|
125
|
+
|
|
126
|
+
const metaType = normalMetaType(config.metaType)
|
|
127
|
+
|
|
128
|
+
// 这个对象是不可以被配置进行覆盖
|
|
129
|
+
const extendNativeObj = {
|
|
130
|
+
metaType,
|
|
131
|
+
eventInit: false, // 初始渲染的时候,配置项对应的事件是否执行了
|
|
132
|
+
bindValue: '', // 这个是对应组件绑定的值
|
|
133
|
+
vmIsBind: false,
|
|
134
|
+
vm: null, // 具体渲染的组件
|
|
135
|
+
wrapVm: null, // 当前组件的实例(也就是analysisComponent)
|
|
136
|
+
hireRelat,
|
|
137
|
+
parent: null, // 这个是执行过程中,动态获取的
|
|
138
|
+
dynamicHireRelat: '', // 这个也是执行过程中,动态获取的层级
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
let extendAttrObj = parseExtendAttr(config)
|
|
142
|
+
let extendObj = {
|
|
143
|
+
removeCol: findComponent(NOT_NEED_COL_ITEM_META_TYPE, extendAttrObj.renderby) !== -1 || findComponent(NOT_NEED_COL_ITEM_META_TYPE, metaType) !== -1,
|
|
144
|
+
needformItem: (findComponent(NOT_NEED_FORM_ITEM_META_TYPE, extendAttrObj.renderby) !== -1 || findComponent(NOT_NEED_FORM_ITEM_META_TYPE, metaType) !== -1) ? false : needformItem, // 表示这个配置项对应的渲染组件是否需要formItem进行包装
|
|
145
|
+
}
|
|
146
|
+
if (config.defStyle) {
|
|
147
|
+
extendObj.style = parseDefStyle(config.defStyle)
|
|
148
|
+
}
|
|
149
|
+
// 组件是根据数据进行动态循环渲染,这边需要进行特殊处理,确保config配置项独立
|
|
150
|
+
if (findComponent(MULTI_PAGE_META_LIST_TYPES, extendAttrObj.renderby) !== -1 || findComponent(MULTI_PAGE_META_LIST_TYPES, metaType) !== -1) {
|
|
151
|
+
extendObj.multiPmPageMetaList = []
|
|
152
|
+
}
|
|
153
|
+
// 如果有子项,需要进行递归遍历
|
|
154
|
+
if (config.pmPageMetaList && config.pmPageMetaList.length) {
|
|
155
|
+
config.pmPageMetaList = config.pmPageMetaList.map(metaItem => {
|
|
156
|
+
const { pageConfig } = normalConfig({ polyfillConfigs, instance }, metaItem, hireRelat, mapComp, needformItem || [FORM_META_TYPE].includes(metaType))
|
|
157
|
+
return pageConfig
|
|
158
|
+
})?.sort((a, b) => a.seqNo - b.seqNo)
|
|
159
|
+
}
|
|
160
|
+
const pageConfig = {
|
|
161
|
+
...extendObj,
|
|
162
|
+
...extendAttrObj,
|
|
163
|
+
...config,
|
|
164
|
+
...extendNativeObj
|
|
165
|
+
}
|
|
166
|
+
if (config.metaType == 'textarea') {
|
|
167
|
+
pageConfig.type = 'textarea'
|
|
168
|
+
}
|
|
169
|
+
if (config.metaType == 'time-range') {
|
|
170
|
+
pageConfig['isRange'] = true
|
|
171
|
+
}
|
|
172
|
+
if (config.metaType == 'date-range') {
|
|
173
|
+
pageConfig.type = 'daterange'
|
|
174
|
+
}
|
|
175
|
+
if (config.metaType == 'card') {
|
|
176
|
+
pageConfig.needWrap = '2'
|
|
177
|
+
}
|
|
178
|
+
mapComp[hireRelat] = pageConfig
|
|
179
|
+
parsePolyfillConfigs({ polyfillConfigs, instance }, pageConfig)
|
|
180
|
+
return {
|
|
181
|
+
mapComp,
|
|
182
|
+
pageConfig
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
function parsePolyfillConfigs({ polyfillConfigs, instance }, config) {
|
|
187
|
+
const hireRelat = config.hireRelat
|
|
188
|
+
const findKeys = Object.keys(polyfillConfigs).filter(key => hireRelat.endsWith(key))
|
|
189
|
+
if (!findKeys.length) {
|
|
190
|
+
return
|
|
191
|
+
}
|
|
192
|
+
const findKey = findKeys.reduce((ret, key) => (hireRelat.lastIndexOf(ret) < hireRelat.lastIndexOf(key) ? ret : key))
|
|
193
|
+
const polyObj = polyfillConfigs[findKey] && polyfillConfigs[findKey](config, instance)
|
|
194
|
+
polyObj && Object.keys(polyObj).forEach(key => {
|
|
195
|
+
config[key] = polyObj[key]
|
|
196
|
+
})
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
// 配置化工具现在还是用aidesign组件库,这边进行统一替换一下
|
|
200
|
+
function normalMetaType(metaType) {
|
|
201
|
+
let retType = metaType
|
|
202
|
+
if (typeof retType !== 'string') return ''
|
|
203
|
+
if (retType.startsWith(REPLACE_PREFIX_FLAG)) {
|
|
204
|
+
retType = retType.replace(REPLACE_PREFIX_FLAG, PREFIX_FLAG)
|
|
205
|
+
} else if (retType.startsWith(H5_REPLACE_PREFIX_FLAG)) {
|
|
206
|
+
retType = retType.replace(H5_REPLACE_PREFIX_FLAG, H5_PREFIX_FLAG)
|
|
207
|
+
}
|
|
208
|
+
if (META_TYPE_MAP[retType]) {
|
|
209
|
+
retType = META_TYPE_MAP[retType]
|
|
210
|
+
}
|
|
211
|
+
return retType
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export function isPlainColumn(config, disabled) {
|
|
215
|
+
// 表格中中的列,可以根据配置进行转换为普通形式,表格原生支持的tooltip
|
|
216
|
+
|
|
217
|
+
if (config.isColumn && disabled) {
|
|
218
|
+
if (config.plainColumn) {
|
|
219
|
+
return true
|
|
220
|
+
}
|
|
221
|
+
// 有些标签,在没有plainColumn属性的时候,默认表示会直接进行普通形式的转换
|
|
222
|
+
if (
|
|
223
|
+
!hasOwn(config, 'plainColumn') &&
|
|
224
|
+
(
|
|
225
|
+
findComponent([...PLAIN_TYPE_COLUMNS, ...PLAIN_TYPE_OPTIONS_COLUMNS], config.renderby || config.metaType) !== -1 ||
|
|
226
|
+
(
|
|
227
|
+
// 这边是在日期组件中,日过valueFormat属性跟format属性值一样的时候,就可以直接展示
|
|
228
|
+
findComponent(['ElDatePicker'], config?.renderby || config?.metaType) !== -1 &&
|
|
229
|
+
(
|
|
230
|
+
(config.valueFormat || 'YYYY-MM-DD') == (config.format || 'YYYY-MM-DD') ||
|
|
231
|
+
(config['value-format'] || 'YYYY-MM-DD') == (config.format || 'YYYY-MM-DD')
|
|
232
|
+
)
|
|
233
|
+
)
|
|
234
|
+
)
|
|
235
|
+
) {
|
|
236
|
+
return true
|
|
237
|
+
}
|
|
238
|
+
}
|
|
239
|
+
return false
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
export function getComponentForConfig(config, disabled) {
|
|
243
|
+
// 表格中中的列,是否需要转换为普通形式
|
|
244
|
+
if (isPlainColumn(config, disabled)) {
|
|
245
|
+
return CustomComponentPlain
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
const components = inject('components')
|
|
249
|
+
const { composeComponents } = getNativeComps()
|
|
250
|
+
const allComps = {
|
|
251
|
+
...composeComponents,
|
|
252
|
+
...components.value
|
|
253
|
+
}
|
|
254
|
+
const metaType = config.metaType
|
|
255
|
+
let component = resolveAssetComponents(allComps, metaType) //则通过传入的获取组件
|
|
256
|
+
if (!component) {
|
|
257
|
+
component = resolveComponent(metaType) // 实例上绑定的组件
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
const renderby = config.renderby
|
|
261
|
+
if (renderby && typeof renderby === 'string') {
|
|
262
|
+
let renderbyComp = resolveAssetComponents(allComps, renderby) //则通过传入的获取组件
|
|
263
|
+
if (!renderbyComp) {
|
|
264
|
+
renderbyComp = resolveComponent(renderby) // 实例上绑定的组件
|
|
265
|
+
}
|
|
266
|
+
component = renderbyComp || component
|
|
267
|
+
}
|
|
268
|
+
return component
|
|
269
|
+
}
|
|
270
|
+
|
|
271
|
+
// 获取渲染组件的props配置数据
|
|
272
|
+
export function getRenderComponentProps({ props, component, modelValue, selects }) {
|
|
273
|
+
if (!component) return {}
|
|
274
|
+
let config = props.config
|
|
275
|
+
if (findComponent(['CustomComponentTabs'], config.renderby || config.metaType) !== -1) {
|
|
276
|
+
// 目前tabs组件在配置平台那边,是不能进行配置大的tabs的,目前就换一种方式
|
|
277
|
+
config.pmPageMetaList?.forEach(pane => {
|
|
278
|
+
if (pane.tabExtendAttr && isPlainObject(pane.tabExtendAttr)) {
|
|
279
|
+
config = {
|
|
280
|
+
...config,
|
|
281
|
+
...pane.tabExtendAttr
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
})
|
|
285
|
+
}
|
|
286
|
+
const propsKeys = getComponentPropsKeys(component, config)
|
|
287
|
+
const defprops = {}
|
|
288
|
+
if (propsKeys) {
|
|
289
|
+
propsKeys.forEach(key => {
|
|
290
|
+
if (hasOwn(config, key)) {
|
|
291
|
+
defprops[key] = config[key]
|
|
292
|
+
}
|
|
293
|
+
})
|
|
294
|
+
}
|
|
295
|
+
const commonProps = getCommonProps(config, props, modelValue, selects)
|
|
296
|
+
defprops.style = {
|
|
297
|
+
...config.style,
|
|
298
|
+
...getRenderCompMargins(config),
|
|
299
|
+
width: commonProps.width || getBuildCompDefaultWidth(config)
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
const retObj = {
|
|
303
|
+
...defprops,
|
|
304
|
+
...commonProps
|
|
305
|
+
}
|
|
306
|
+
return retObj
|
|
307
|
+
}
|
|
308
|
+
// 一些组件并且没有占居满格
|
|
309
|
+
function getBuildCompDefaultWidth(config) {
|
|
310
|
+
if (SPECIAL_SET_FULL_WIDTH_ITEM_META_TYPE.some(metaType => compareComponet(metaType, config.metaType))) {
|
|
311
|
+
return '100%'
|
|
312
|
+
}
|
|
313
|
+
}
|
|
314
|
+
// 获取渲染组件开放的配置props,提供给所有自定义组件
|
|
315
|
+
function getCommonProps(config, props, modelValue, selects) {
|
|
316
|
+
return Object.keys(commonPropsType).reduce((ret, key) => {
|
|
317
|
+
ret[key] = commonPropsType[key].getValue(config, props, modelValue, selects)
|
|
318
|
+
return ret
|
|
319
|
+
}, {})
|
|
320
|
+
}
|
|
321
|
+
// 获取渲染组件的margin配置数据
|
|
322
|
+
function getRenderCompMargins(config) {
|
|
323
|
+
const marginObj = {}
|
|
324
|
+
if (config.marginRight) {
|
|
325
|
+
marginObj.marginRight = normalPixel(config.marginRight)
|
|
326
|
+
}
|
|
327
|
+
if (config.marginLeft) {
|
|
328
|
+
marginObj.marginLeft = normalPixel(config.marginLeft)
|
|
329
|
+
}
|
|
330
|
+
if (config.marginTop) {
|
|
331
|
+
marginObj.marginTop = normalPixel(config.marginTop)
|
|
332
|
+
}
|
|
333
|
+
if (config.marginBottom) {
|
|
334
|
+
marginObj.marginBottom = normalPixel(config.marginBottom)
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
if (config.paddingRight) {
|
|
338
|
+
marginObj.paddingRight = normalPixel(config.paddingRight)
|
|
339
|
+
}
|
|
340
|
+
if (config.paddingLeft) {
|
|
341
|
+
marginObj.paddingLeft = normalPixel(config.paddingLeft)
|
|
342
|
+
}
|
|
343
|
+
if (config.paddingTop) {
|
|
344
|
+
marginObj.paddingTop = normalPixel(config.paddingTop)
|
|
345
|
+
}
|
|
346
|
+
if (config.paddingBottom) {
|
|
347
|
+
marginObj.paddingBottom = normalPixel(config.paddingBottom)
|
|
348
|
+
}
|
|
349
|
+
return marginObj
|
|
350
|
+
}
|
|
351
|
+
|
|
352
|
+
// 生成布局框(el-col)
|
|
353
|
+
export function generateLayoutPolyfill(config, disabled, isH5) {
|
|
354
|
+
let isElCol = false
|
|
355
|
+
let props = {}
|
|
356
|
+
let propsKeys
|
|
357
|
+
let colComp = null
|
|
358
|
+
if (isH5) {
|
|
359
|
+
colComp = CustomComponentColH5
|
|
360
|
+
} else {
|
|
361
|
+
colComp = resolveComponent('el-col')
|
|
362
|
+
isElCol = true
|
|
363
|
+
propsKeys = getComponentPropsKeys(colComp)
|
|
364
|
+
}
|
|
365
|
+
if (propsKeys) {
|
|
366
|
+
propsKeys.forEach(key => {
|
|
367
|
+
if (config[key]) {
|
|
368
|
+
props[key] = config[key]
|
|
369
|
+
}
|
|
370
|
+
})
|
|
371
|
+
}
|
|
372
|
+
if (isElCol) {
|
|
373
|
+
props.class = {
|
|
374
|
+
[normalCapitalizeComponent(config.metaType)]: true,
|
|
375
|
+
'is-card': config?.needWrap, // 这个样式主要用于折叠上面,控制被卡片包裹的时候,下边距是16,没有被包裹的时候,是12
|
|
376
|
+
}
|
|
377
|
+
props = {
|
|
378
|
+
...props,
|
|
379
|
+
...getDefaultColProps(config),
|
|
380
|
+
...elColSpecialProsp(config),
|
|
381
|
+
}
|
|
382
|
+
|
|
383
|
+
}
|
|
384
|
+
return node => {
|
|
385
|
+
// 表格中中的列,是否需要转换为普通形式
|
|
386
|
+
if (isPlainColumn(config, disabled)) {
|
|
387
|
+
return node
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
if (config.removeCol) {
|
|
391
|
+
return node
|
|
392
|
+
}
|
|
393
|
+
let ret = <colComp {...props}>{node}</colComp>
|
|
394
|
+
if (config.isAllRow) {
|
|
395
|
+
ret = <colComp span={24}>{ret}</colComp>
|
|
396
|
+
}
|
|
397
|
+
return ret
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// el-col 特殊的定义,目前这边进行宽度的接受
|
|
402
|
+
function elColSpecialProsp (config) {
|
|
403
|
+
const style = {
|
|
404
|
+
textAlign: config.colTextAlign
|
|
405
|
+
}
|
|
406
|
+
if ((typeof config.hidden === 'boolean' && config.hidden) || config.hidden === '1') {
|
|
407
|
+
style.display = 'none'
|
|
408
|
+
} else {
|
|
409
|
+
if (hasOwn(config, 'elWidth')) {
|
|
410
|
+
if (config.elWidth === 'auto') {
|
|
411
|
+
style.flexGrow = 1
|
|
412
|
+
style.flexShrink = 1
|
|
413
|
+
style.flexBasis = 0
|
|
414
|
+
style.maxWidth = 'unset'
|
|
415
|
+
style.minWidth = 'unset'
|
|
416
|
+
} else if (config.elWidth === 'self') {
|
|
417
|
+
style.flexGrow = 0
|
|
418
|
+
style.flexShrink = 0
|
|
419
|
+
style.flexBasis = 0
|
|
420
|
+
style.maxWidth = 'unset'
|
|
421
|
+
style.minWidth = 'unset'
|
|
422
|
+
} else {
|
|
423
|
+
style.flexGrow = 0
|
|
424
|
+
style.flexShrink = 0
|
|
425
|
+
style.flexBasis = 0
|
|
426
|
+
style.maxWidth = normalPixel(config.elWidth)
|
|
427
|
+
style.minWidth = normalPixel(config.elWidth)
|
|
428
|
+
}
|
|
429
|
+
}
|
|
430
|
+
}
|
|
431
|
+
return {
|
|
432
|
+
style
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
function getDefaultColProps(config) {
|
|
437
|
+
const colProps = {
|
|
438
|
+
offset: config.offset || 0
|
|
439
|
+
}
|
|
440
|
+
if (hasOwn(config, 'md') || hasOwn(config, 'lg')) {
|
|
441
|
+
colProps.md = isPlainObject(config.md) ? parseIntColProps(config.md) : parseInt(config.md, 10)
|
|
442
|
+
colProps.lg = isPlainObject(config.lg) ? parseIntColProps(config.lg) : parseInt(config.lg, 10)
|
|
443
|
+
} else if (config.span) {
|
|
444
|
+
colProps.span = config.span
|
|
445
|
+
} else {
|
|
446
|
+
colProps.md = isPlainObject(config.md) ? parseIntColProps(config.md) : parseInt(config.md || 12, 10)
|
|
447
|
+
colProps.lg = isPlainObject(config.lg) ? parseIntColProps(config.lg) : parseInt(config.lg || 8, 10)
|
|
448
|
+
}
|
|
449
|
+
return colProps
|
|
450
|
+
}
|
|
451
|
+
function parseIntColProps(obj) {
|
|
452
|
+
return obj
|
|
453
|
+
}
|
|
454
|
+
|
|
455
|
+
function generateFormItemPc (config, lang, compProps, params,) {
|
|
456
|
+
let isFormItem = false
|
|
457
|
+
let props = {}
|
|
458
|
+
let propsKeys
|
|
459
|
+
let slotName = 'default'
|
|
460
|
+
const formItemComp = resolveComponent('el-form-item')
|
|
461
|
+
if (formItemComp) {
|
|
462
|
+
isFormItem = true
|
|
463
|
+
propsKeys = getComponentPropsKeys(formItemComp)
|
|
464
|
+
}
|
|
465
|
+
if (propsKeys) {
|
|
466
|
+
propsKeys.forEach(key => {
|
|
467
|
+
if (config[key]) {
|
|
468
|
+
props[key] = config[key]
|
|
469
|
+
}
|
|
470
|
+
})
|
|
471
|
+
}
|
|
472
|
+
if (isFormItem) {
|
|
473
|
+
if (config.formItemSlot === 'label') {
|
|
474
|
+
slotName = 'label'
|
|
475
|
+
}
|
|
476
|
+
props = {
|
|
477
|
+
...props,
|
|
478
|
+
...getFormItemExtendProps(config, lang, params)
|
|
479
|
+
}
|
|
480
|
+
// labelWidth 需要特殊处理
|
|
481
|
+
if (hasOwn(props, 'labelWidth')) {
|
|
482
|
+
props.labelWidth = props.labelWidth && `${props.labelWidth}` !== '-1' ? props.labelWidth : undefined
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
return node => {
|
|
486
|
+
// 表格中中的列,是否需要转换为普通形式
|
|
487
|
+
if (isPlainColumn(config, compProps.disabled)) {
|
|
488
|
+
return node
|
|
489
|
+
}
|
|
490
|
+
|
|
491
|
+
if (!config.needformItem && !config.showFromItem) {
|
|
492
|
+
return node
|
|
493
|
+
}
|
|
494
|
+
const slots = {}
|
|
495
|
+
slots[slotName] = () => node
|
|
496
|
+
if (isFormItem && slotName !== 'label') {
|
|
497
|
+
slots.label = () => createFormLable(config, lang)
|
|
498
|
+
}
|
|
499
|
+
return (
|
|
500
|
+
<formItemComp class="custom-form-item" {...props}>{slots}</formItemComp>
|
|
501
|
+
)
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
function generateFormItemH5(config, lang, compProps, params) {
|
|
506
|
+
return node => {
|
|
507
|
+
if (!config.needformItem && !config.showFromItem) {
|
|
508
|
+
return node
|
|
509
|
+
}
|
|
510
|
+
const props = {
|
|
511
|
+
label: lang.indexOf('zh') > -1 ? config.metaNameZh : config.metaNameEn,
|
|
512
|
+
hidemessage: config?.hidemessage == '1' ? true : false,
|
|
513
|
+
hideasterisk: config?.hideasterisk == '1' ? true : false,
|
|
514
|
+
...getFormItemExtendProps(config, lang, params),
|
|
515
|
+
}
|
|
516
|
+
|
|
517
|
+
return (
|
|
518
|
+
<cmi-form-item class="custom-form-item-h5" {...props}>{node}</cmi-form-item>
|
|
519
|
+
)
|
|
520
|
+
}
|
|
521
|
+
}
|
|
522
|
+
|
|
523
|
+
export function generateFormItemPolyfill(config, lang, compProps, _isH5, params) {
|
|
524
|
+
if (_isH5) {
|
|
525
|
+
return generateFormItemH5(config, lang, compProps, params)
|
|
526
|
+
} else {
|
|
527
|
+
return generateFormItemPc(config, lang, compProps, params)
|
|
528
|
+
}
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
function getFormItemExtendProps(config, lang, params) {
|
|
532
|
+
return {
|
|
533
|
+
prop: config.dynamicHireRelat,
|
|
534
|
+
rules: getFormItemRule(config, lang, params),
|
|
535
|
+
class: {
|
|
536
|
+
'content-right': config.contentRight,
|
|
537
|
+
'hidden-label': config.labelWidth == 0 || config.labelWidth === '0px' || config.labelHidden == '1',
|
|
538
|
+
[`label-position-${config['label-position'] || 'right'}`]: true // label-position 支持三个值,right、left、top
|
|
539
|
+
},
|
|
540
|
+
style: {
|
|
541
|
+
...getFormItemMargins(config)
|
|
542
|
+
}
|
|
543
|
+
}
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
function getFormItemRule(config, lang, params) {
|
|
547
|
+
const required = config.requiredFlag === '1'
|
|
548
|
+
const onlyRequiredFlag = config.onlyRequiredFlag
|
|
549
|
+
const rules = [{
|
|
550
|
+
required,
|
|
551
|
+
validator: (rule, value, callback) => {
|
|
552
|
+
if (config.editFlag === '0') callback()
|
|
553
|
+
const val = config.bindValue
|
|
554
|
+
const message = lang.indexOf('zh') > -1 ? `${config.metaNameZh}不能为空` : `${config.metaNameEn} can not be empty`
|
|
555
|
+
if (!onlyRequiredFlag && required) {
|
|
556
|
+
if (val === '' || val === null || val === undefined) {
|
|
557
|
+
callback(new Error(message))
|
|
558
|
+
} else {
|
|
559
|
+
// isMatch在下来框的时候,表示当前值没有在下拉选项中匹配到,就表示没有选中值;因为后端在表字段为数字类型的时候,默认返回的是0值
|
|
560
|
+
if (hasOwn(config, 'isMatch') && !config.isMatch) {
|
|
561
|
+
callback(new Error(message))
|
|
562
|
+
} else {
|
|
563
|
+
callback()
|
|
564
|
+
}
|
|
565
|
+
}
|
|
566
|
+
} else {
|
|
567
|
+
callback()
|
|
568
|
+
}
|
|
569
|
+
},
|
|
570
|
+
trigger: ['blur', 'change']
|
|
571
|
+
}]
|
|
572
|
+
let regexPattern = []
|
|
573
|
+
if (config.regexPattern) {
|
|
574
|
+
try {
|
|
575
|
+
regexPattern = JSON.parse(config.regexPattern)
|
|
576
|
+
regexPattern = regexPattern.map(item => ({
|
|
577
|
+
reg: item?.pattern,
|
|
578
|
+
tip: item?.message,
|
|
579
|
+
tipEn: item?.messageEn,
|
|
580
|
+
}))
|
|
581
|
+
|
|
582
|
+
} catch (error) {
|
|
583
|
+
console.log(config.metaCode, '=regexPattern JSON parse fail, error==:', error)
|
|
584
|
+
regexPattern = []
|
|
585
|
+
}
|
|
586
|
+
}
|
|
587
|
+
if (config.validRegs && (Array.isArray(config.validRegs) || isPlainObject(config.validRegs)) ) {
|
|
588
|
+
const validRegs = isPlainObject(config.validRegs) ? [config.validRegs] : config.validRegs
|
|
589
|
+
regexPattern.push(...validRegs)
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
if (regexPattern?.length) {
|
|
593
|
+
rules.push({
|
|
594
|
+
validator: (rule, value, callback) => {
|
|
595
|
+
if (config.editFlag === '0') callback()
|
|
596
|
+
const val = config.bindValue
|
|
597
|
+
|
|
598
|
+
for (let i = 0; i < regexPattern.length; i++) {
|
|
599
|
+
const validInfo = regexPattern[i]
|
|
600
|
+
const { reg, tip, tipEn } = validInfo
|
|
601
|
+
const message = lang.indexOf('zh') > -1 ? tip : tipEn
|
|
602
|
+
let validFlag = true
|
|
603
|
+
if (typeof reg === 'function') {
|
|
604
|
+
validFlag = reg(val, params)
|
|
605
|
+
} else {
|
|
606
|
+
validFlag = new RegExp(reg).test(val)
|
|
607
|
+
}
|
|
608
|
+
if (!validFlag) {
|
|
609
|
+
callback(new Error(message))
|
|
610
|
+
return
|
|
611
|
+
}
|
|
612
|
+
}
|
|
613
|
+
callback()
|
|
614
|
+
},
|
|
615
|
+
trigger: ['blur', 'change']
|
|
616
|
+
})
|
|
617
|
+
}
|
|
618
|
+
let validators = config.validators
|
|
619
|
+
validators = isArray(validators) ? validators : [validators]
|
|
620
|
+
if (validators && validators.length) {
|
|
621
|
+
validators.forEach(validator => {
|
|
622
|
+
if (isFunction(validator)) {
|
|
623
|
+
rules.push({
|
|
624
|
+
validator,
|
|
625
|
+
trigger: ['blur', 'change']
|
|
626
|
+
})
|
|
627
|
+
}
|
|
628
|
+
})
|
|
629
|
+
}
|
|
630
|
+
return rules
|
|
631
|
+
}
|
|
632
|
+
|
|
633
|
+
function getFormItemMargins(config) {
|
|
634
|
+
const marginObj = {}
|
|
635
|
+
if (config.formItemMarginRight && `${config.formItemMarginRight}` !== '-1') {
|
|
636
|
+
marginObj.marginRight = normalPixel(config.formItemMarginRight)
|
|
637
|
+
}
|
|
638
|
+
if (config.formItemMarginLeft && `${config.formItemMarginLeft}` !== '-1') {
|
|
639
|
+
marginObj.marginLeft = normalPixel(config.formItemMarginLeft)
|
|
640
|
+
}
|
|
641
|
+
if (config.formItemMarginTop && `${config.formItemMarginTop}` !== '-1') {
|
|
642
|
+
marginObj.marginTop = normalPixel(config.formItemMarginTop)
|
|
643
|
+
}
|
|
644
|
+
if (config.formItemMarginBottom && `${config.formItemMarginBottom}` !== '-1') {
|
|
645
|
+
marginObj.marginBottom = normalPixel(config.formItemMarginBottom)
|
|
646
|
+
}
|
|
647
|
+
if (config.formItemPaddingRight && `${config.formItemPaddingRight}` !== '-1') {
|
|
648
|
+
marginObj.paddingRight = normalPixel(config.formItemPaddingRight)
|
|
649
|
+
}
|
|
650
|
+
if (config.formItemPaddingLeft && `${config.formItemPaddingLeft}` !== '-1') {
|
|
651
|
+
marginObj.paddingLeft = normalPixel(config.formItemPaddingLeft)
|
|
652
|
+
}
|
|
653
|
+
if (config.formItemPaddingTop && `${config.formItemPaddingTop}` !== '-1') {
|
|
654
|
+
marginObj.paddingTop = normalPixel(config.formItemPaddingTop)
|
|
655
|
+
}
|
|
656
|
+
if (config.formItemPaddingBottom && `${config.formItemPaddingBottom}` !== '-1') {
|
|
657
|
+
marginObj.paddingBottom = normalPixel(config.formItemPaddingBottom)
|
|
658
|
+
}
|
|
659
|
+
return marginObj
|
|
660
|
+
}
|
|
661
|
+
|
|
662
|
+
function createFormLable(config, lang = 'zh') {
|
|
663
|
+
const ElPopover = resolveComponent('el-popover')
|
|
664
|
+
const elIcon = resolveComponent('el-icon')
|
|
665
|
+
const required = config.requiredFlag === '1'
|
|
666
|
+
return (
|
|
667
|
+
<div title={lang.indexOf('zh') > -1 ? config.metaNameZh : config.metaNameEn} class="custom-label">
|
|
668
|
+
<span class="custom-label-content" style={config.labelStyle}>
|
|
669
|
+
{required ? <span style="color: #f5222d; margin-right: 3px">*</span> : null}
|
|
670
|
+
<span>{lang.indexOf('zh') > -1 ? config.metaNameZh : config.metaNameEn}</span>
|
|
671
|
+
</span>
|
|
672
|
+
<ElPopover
|
|
673
|
+
placement="top"
|
|
674
|
+
width="300"
|
|
675
|
+
trigger="hover"
|
|
676
|
+
content={lang.indexOf('zh') > -1 ? config.hintContentZh : config.hintContentEn}
|
|
677
|
+
>
|
|
678
|
+
{
|
|
679
|
+
{
|
|
680
|
+
reference: () => {
|
|
681
|
+
return config.hintFlag == '1' ? <span class="label-tip"><elIcon><QuestionFilled /></elIcon></span> : null
|
|
682
|
+
}
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
</ElPopover>
|
|
686
|
+
</div>
|
|
687
|
+
)
|
|
688
|
+
}
|
|
689
|
+
|
|
690
|
+
export function getComponentPropsKeys(comp, config) {
|
|
691
|
+
let propsKeys = []
|
|
692
|
+
if (typeof comp === 'string') {
|
|
693
|
+
propsKeys = []
|
|
694
|
+
} else {
|
|
695
|
+
propsKeys = Object.keys(comp.props || {})
|
|
696
|
+
}
|
|
697
|
+
let emitsKyes = []
|
|
698
|
+
if (config) {
|
|
699
|
+
Object.keys(config).forEach(key => {
|
|
700
|
+
if (/^on[A-Z]/.test(key)) {
|
|
701
|
+
emitsKyes.push(key)
|
|
702
|
+
}
|
|
703
|
+
})
|
|
704
|
+
}
|
|
705
|
+
// if (comp?.emits) {
|
|
706
|
+
// if (isPlainObject(comp?.emits)) {
|
|
707
|
+
// emitsKyes = Object.keys(comp.emits)
|
|
708
|
+
// } else if (isArray(comp.emits)) {
|
|
709
|
+
// emitsKyes = comp.emits
|
|
710
|
+
// }
|
|
711
|
+
// }
|
|
712
|
+
// emitsKyes = emitsKyes.filter(key => typeof key === 'string').map(key => `on${capitalize((camelize(key)))}`)
|
|
713
|
+
return [...emitsKyes, ...propsKeys]
|
|
714
|
+
}
|