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,183 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<component :is="component" :class="[component === ElCard ? 'is-card' : '']" class="standard-wrap custom-component-collapse" v-bind="{...componentProps, ...attrs}">
|
|
3
|
+
<ElCollapse v-bind="{...collapseProps}" :class="collapseClass" v-model="activeNames">
|
|
4
|
+
<ElCollapseItem v-bind="collapseItemProps" >
|
|
5
|
+
<template #title>
|
|
6
|
+
<div class="collapge-slot-title">
|
|
7
|
+
<span>{{ lang.indexOf('zh') > -1 ? props.config.metaNameZh : props.config.metaNameEn }}</span>
|
|
8
|
+
<ElRow>
|
|
9
|
+
<Renderer @click="stopPropagation" :config="slotPmPageMetaList" v-model="props.refValue.value"></Renderer>
|
|
10
|
+
</ElRow>
|
|
11
|
+
</div>
|
|
12
|
+
</template>
|
|
13
|
+
<ElRow>
|
|
14
|
+
<Renderer :config="pmPageMetaList" v-model="props.refValue.value"></Renderer>
|
|
15
|
+
</ElRow>
|
|
16
|
+
</ElCollapseItem>
|
|
17
|
+
</ElCollapse>
|
|
18
|
+
</component>
|
|
19
|
+
</template>
|
|
20
|
+
<script setup>
|
|
21
|
+
import { ElCollapse, ElCollapseItem, ElCard, ElRow } from 'element-plus'
|
|
22
|
+
import Renderer from '../../renderer.jsx'
|
|
23
|
+
import { computed, inject, useAttrs, defineEmits, defineProps } from 'vue'
|
|
24
|
+
import { commonPropsType } from '../../utils/index.js'
|
|
25
|
+
|
|
26
|
+
defineOptions({
|
|
27
|
+
inheritAttrs: false
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
defineEmits(['update:modelValue'])
|
|
31
|
+
|
|
32
|
+
const props = defineProps({
|
|
33
|
+
...ElCollapse.props,
|
|
34
|
+
...ElCollapseItem.props,
|
|
35
|
+
...commonPropsType,
|
|
36
|
+
})
|
|
37
|
+
// debugger
|
|
38
|
+
|
|
39
|
+
const attrs = useAttrs()
|
|
40
|
+
|
|
41
|
+
const lang = inject('lang')
|
|
42
|
+
|
|
43
|
+
const collapseProps = computed(() => {
|
|
44
|
+
return Object.keys(ElCollapse.props).reduce((ret, key) => {
|
|
45
|
+
ret[key] = props[key]
|
|
46
|
+
return ret
|
|
47
|
+
}, {})
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
const collapseClass = computed(() => {
|
|
51
|
+
return {
|
|
52
|
+
'underline-hidden': props.config.underlineHidden,
|
|
53
|
+
'not-wrap-border': !props.config.needSegment
|
|
54
|
+
}
|
|
55
|
+
})
|
|
56
|
+
|
|
57
|
+
const collapseItemProps = computed(() => {
|
|
58
|
+
const propsObj = Object.keys(ElCollapseItem.props).reduce((ret, key) => {
|
|
59
|
+
ret[key] = props[key]
|
|
60
|
+
return ret
|
|
61
|
+
}, {})
|
|
62
|
+
propsObj.name = props.config.metaCode
|
|
63
|
+
return propsObj
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
const pmPageMetaList = computed(() => {
|
|
67
|
+
return props.config?.pmPageMetaList?.filter(item => !item.collapseSlot) || []
|
|
68
|
+
})
|
|
69
|
+
|
|
70
|
+
const slotPmPageMetaList = computed(() => {
|
|
71
|
+
return props.config?.pmPageMetaList?.filter(item => item.collapseSlot) || []
|
|
72
|
+
})
|
|
73
|
+
|
|
74
|
+
const stopPropagation = (e) => {
|
|
75
|
+
e.stopPropagation()
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const component = computed(() => {
|
|
79
|
+
return props.config.needWrap ? ElCard : 'div'
|
|
80
|
+
})
|
|
81
|
+
const componentProps = computed(() => {
|
|
82
|
+
return props.config.needWrap ? {
|
|
83
|
+
shadow: 'never'
|
|
84
|
+
} : {}
|
|
85
|
+
})
|
|
86
|
+
const activeNames = computed({
|
|
87
|
+
get() {
|
|
88
|
+
return props.config.defaultOpenFlag === '1' ? [props.config.metaCode] : []
|
|
89
|
+
},
|
|
90
|
+
set(val) {
|
|
91
|
+
props.config.defaultOpenFlag = val.length > 0 ? '1' : '0'
|
|
92
|
+
}
|
|
93
|
+
})
|
|
94
|
+
|
|
95
|
+
</script>
|
|
96
|
+
<style lang="scss">
|
|
97
|
+
.collapge-slot-title {
|
|
98
|
+
display: flex;
|
|
99
|
+
justify-content: space-between;
|
|
100
|
+
align-items: center;
|
|
101
|
+
width: 100%;
|
|
102
|
+
> span {
|
|
103
|
+
&::before {
|
|
104
|
+
content: "";
|
|
105
|
+
display: inline-block;
|
|
106
|
+
width: 3px;
|
|
107
|
+
height: 12px;
|
|
108
|
+
margin-right: 8px;
|
|
109
|
+
border-radius: 3px;
|
|
110
|
+
vertical-align: middle;
|
|
111
|
+
background-color: #3271fe;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
.not-wrap-border {
|
|
116
|
+
&.el-collapse {
|
|
117
|
+
border-top: none;
|
|
118
|
+
border-bottom: none;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
</style>
|
|
122
|
+
<style lang="scss">
|
|
123
|
+
// 配置被包裹的一层样式
|
|
124
|
+
.standard-wrap {
|
|
125
|
+
box-sizing: border-box;
|
|
126
|
+
}
|
|
127
|
+
.custom-component-collapse {
|
|
128
|
+
.el-collapse-item__wrap, .el-collapse-item__header {
|
|
129
|
+
border-bottom: none;
|
|
130
|
+
&::before {
|
|
131
|
+
display: none;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
.el-collapse-item__wrap {
|
|
135
|
+
overflow: none;
|
|
136
|
+
}
|
|
137
|
+
.el-collapse-item {
|
|
138
|
+
position: relative;
|
|
139
|
+
&::after {
|
|
140
|
+
content: "";
|
|
141
|
+
display: block;
|
|
142
|
+
position: absolute;
|
|
143
|
+
width: 100%;
|
|
144
|
+
bottom: 0;
|
|
145
|
+
left: 0;
|
|
146
|
+
height: 1px;
|
|
147
|
+
background-color: #d0d3d6;
|
|
148
|
+
// margin-bottom: var(--prmary-marign);
|
|
149
|
+
}
|
|
150
|
+
.el-collapse-item__content {
|
|
151
|
+
& > .el-row {
|
|
152
|
+
> .el-col {
|
|
153
|
+
&:last-child {
|
|
154
|
+
& > .el-form-item {
|
|
155
|
+
margin-bottom: 24px;
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
.el-collapse-item__arrow {
|
|
163
|
+
font-size: 16px;
|
|
164
|
+
color: #646A73;
|
|
165
|
+
svg path {
|
|
166
|
+
d: path("M 338.752 104.704 a 64 64 0 0 0 0 90.496 l 316.8 316.8 l -316.8 316.8 a 64 64 0 0 0 90.496 90.496 l 362.048 -362.048 a 64 64 0 0 0 0 -90.496 L 429.248 104.704 a 64 64 0 0 0 -90.496 0 Z");
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
.el-collapse-item__content {
|
|
170
|
+
.el-tabs {
|
|
171
|
+
margin-right: 16px;
|
|
172
|
+
margin-bottom: 16px;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
.underline-hidden {
|
|
177
|
+
.el-collapse-item {
|
|
178
|
+
&::after {
|
|
179
|
+
display: none;
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
</style>
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import Renderer from '../../renderer.jsx'
|
|
3
|
+
import { computed, inject, useAttrs, defineEmits, defineProps } from 'vue'
|
|
4
|
+
import { commonPropsType } from '../../utils/index.js'
|
|
5
|
+
|
|
6
|
+
defineOptions({
|
|
7
|
+
inheritAttrs: false
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
const modelValue = defineModel()
|
|
11
|
+
const attrs = useAttrs()
|
|
12
|
+
const lang = inject('lang')
|
|
13
|
+
const props = defineProps({
|
|
14
|
+
...commonPropsType,
|
|
15
|
+
})
|
|
16
|
+
const collapseProps = computed(() => {
|
|
17
|
+
return {
|
|
18
|
+
title: lang?.value?.indexOf('zh') > -1 ? props.config?.metaNameZh : props.config?.metaNameEn,
|
|
19
|
+
open: props.config?.defaultOpenFlag == '1',
|
|
20
|
+
transition: props.config?.defaultOpenFlag == '1',
|
|
21
|
+
// hideicon: props.config?.hideicon != '1'
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
|
|
25
|
+
const pmPageMetaList = computed(() => {
|
|
26
|
+
return props.config?.pmPageMetaList?.filter(item => !item.collapseSlot) || []
|
|
27
|
+
})
|
|
28
|
+
</script>
|
|
29
|
+
|
|
30
|
+
<template>
|
|
31
|
+
<cmi-collapse v-bind="{...attrs, ...collapseProps}">
|
|
32
|
+
<Renderer :config="pmPageMetaList" v-model="modelValue"></Renderer>
|
|
33
|
+
</cmi-collapse>
|
|
34
|
+
</template>
|
|
35
|
+
|
|
36
|
+
<style lang="scss">
|
|
37
|
+
</style>
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="custom-component-cycle">
|
|
3
|
+
<template v-for="(pageMetaList, $index) in (multiPmPageMetaList || [])" :key="pageMetaListKeys[pageMetaList.id]">
|
|
4
|
+
<component :is="component" v-bind="componentProps">
|
|
5
|
+
<ElRow>
|
|
6
|
+
<Renderer :modelValue="modelValue?.[$index]" :rowScope="{row: modelValue?.[$index], $index}" @update:modelValues="onUpdateModelValue($event, $index)" :config="pageMetaList"></Renderer>
|
|
7
|
+
</ElRow>
|
|
8
|
+
</component>
|
|
9
|
+
</template>
|
|
10
|
+
</div>
|
|
11
|
+
</template>
|
|
12
|
+
<script setup>
|
|
13
|
+
import { computed, defineModel, watch, reactive } from 'vue'
|
|
14
|
+
import { commonPropsType, cloneDeep } from '../../utils/index.js'
|
|
15
|
+
import { ElRow, ElCard } from 'element-plus'
|
|
16
|
+
import Renderer from '../../renderer.jsx'
|
|
17
|
+
|
|
18
|
+
// const lang = inject('lang')
|
|
19
|
+
const modelValue = defineModel()
|
|
20
|
+
// setTimeout(() => {
|
|
21
|
+
// modelValue.value = [{}, {}]
|
|
22
|
+
// }, 3000);
|
|
23
|
+
const props = defineProps({
|
|
24
|
+
...commonPropsType,
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
const onUpdateModelValue = (val, idx) => {
|
|
28
|
+
if (!modelValue.value) {
|
|
29
|
+
modelValue.value = []
|
|
30
|
+
}
|
|
31
|
+
modelValue.value[idx] = val
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* 设置 multiPmPageMetaList 的值
|
|
36
|
+
* multiPmPageMetaList值主要作用是区分列的每一行都需要有单独的config,接口配置返回的只是列的配置,
|
|
37
|
+
* 所以这边需要单独再坐下处理
|
|
38
|
+
*/
|
|
39
|
+
const multiPmPageMetaList = computed(() => {
|
|
40
|
+
return props.config.multiPmPageMetaList || []
|
|
41
|
+
})
|
|
42
|
+
const pmPageMetaList = computed(() => {
|
|
43
|
+
return (props.config.pmPageMetaList || [])
|
|
44
|
+
})
|
|
45
|
+
const rowConfgsMap = new Map()
|
|
46
|
+
const pageMetaListKeys = reactive({})
|
|
47
|
+
watch(() => {
|
|
48
|
+
return modelValue.value?.length
|
|
49
|
+
}, (length) => {
|
|
50
|
+
let list = []
|
|
51
|
+
if (length) {
|
|
52
|
+
const newVal = modelValue.value
|
|
53
|
+
list = newVal.map((row, idx) => {
|
|
54
|
+
const rowCgs = rowConfgsMap.get(row)
|
|
55
|
+
if (rowCgs) {
|
|
56
|
+
rowCgs.forEach(config => {
|
|
57
|
+
config.rowIndex = idx
|
|
58
|
+
})
|
|
59
|
+
return rowCgs
|
|
60
|
+
} else {
|
|
61
|
+
const retConfigs = pmPageMetaList.value.map(config => {
|
|
62
|
+
const ret = cloneDeep(config)
|
|
63
|
+
ret.rowIndex = idx
|
|
64
|
+
return ret
|
|
65
|
+
})
|
|
66
|
+
retConfigs.id = new Date().getTime()
|
|
67
|
+
pageMetaListKeys[retConfigs.id] = new Date().getTime()
|
|
68
|
+
|
|
69
|
+
rowConfgsMap.set(row, retConfigs)
|
|
70
|
+
return retConfigs
|
|
71
|
+
}
|
|
72
|
+
})
|
|
73
|
+
}
|
|
74
|
+
props.config.multiPmPageMetaList = list
|
|
75
|
+
}, {
|
|
76
|
+
immediate: true
|
|
77
|
+
})
|
|
78
|
+
|
|
79
|
+
const component = computed(() => {
|
|
80
|
+
return props.config.needWrap === false ? 'div' : ElCard
|
|
81
|
+
})
|
|
82
|
+
const componentProps = computed(() => {
|
|
83
|
+
return props.config.needWrap === false ? {} : {
|
|
84
|
+
shadow: 'never'
|
|
85
|
+
}
|
|
86
|
+
})
|
|
87
|
+
</script>
|
|
88
|
+
<style lang="scss">
|
|
89
|
+
.custom-component-cycle {
|
|
90
|
+
width: 100%;
|
|
91
|
+
.el-card + .el-card {
|
|
92
|
+
margin-top: 16px;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
</style>
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<TabPane v-for="(pageMetaList, $index) in (multiPmPageMetaList || [])" v-bind="{...tabPaneProps}" :key="pageMetaListKeys[pageMetaList.id]" :label="`${lang.indexOf('zh') > -1 ? props.config?.metaNameZh : props.config?.metaNameEn}-${$index}`" :name="`${props.config?.metaCode}-${$index}`">
|
|
3
|
+
<template #label v-if="pageMetaList.filter(config => config.collapseSlot).length">
|
|
4
|
+
<Renderer :modelValue="modelValue?.[$index]" :rowScope="{row: modelValue?.[$index], $index}" @update:modelValues="onUpdateModelValue($event, $index)" :config="pageMetaList.filter(config => config.collapseSlot)"></Renderer>
|
|
5
|
+
</template>
|
|
6
|
+
<ElRow>
|
|
7
|
+
<Renderer :modelValue="modelValue?.[$index]" :rowScope="{row: modelValue?.[$index], $index}" @update:modelValues="onUpdateModelValue($event, $index)" :config="pageMetaList.filter(config => !config.collapseSlot)"></Renderer>
|
|
8
|
+
</ElRow>
|
|
9
|
+
</TabPane>
|
|
10
|
+
</template>
|
|
11
|
+
<script setup>
|
|
12
|
+
import { ElTabPane, ElRow } from 'element-plus'
|
|
13
|
+
import Renderer from '../../renderer.jsx'
|
|
14
|
+
import { computed, inject, reactive, watch, defineModel, defineProps } from 'vue'
|
|
15
|
+
import { commonPropsType, cloneDeep } from '../../utils/index.js'
|
|
16
|
+
import { TabPane } from '../tabs'
|
|
17
|
+
|
|
18
|
+
const props = defineProps({
|
|
19
|
+
...commonPropsType,
|
|
20
|
+
...ElTabPane.props,
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
const modelValue = defineModel()
|
|
24
|
+
const lang = inject('lang')
|
|
25
|
+
|
|
26
|
+
const tabPaneProps = computed(() => {
|
|
27
|
+
return Object.keys(ElTabPane.props).reduce((ret, key) => {
|
|
28
|
+
ret[key] = props[key]
|
|
29
|
+
return ret
|
|
30
|
+
}, {})
|
|
31
|
+
})
|
|
32
|
+
|
|
33
|
+
// 循环部分逻辑
|
|
34
|
+
const onUpdateModelValue = (val, idx) => {
|
|
35
|
+
if (!modelValue.value) {
|
|
36
|
+
modelValue.value = []
|
|
37
|
+
}
|
|
38
|
+
modelValue.value[idx] = val
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* 设置 multiPmPageMetaList 的值
|
|
43
|
+
* multiPmPageMetaList值主要作用是区分列的每一行都需要有单独的config,接口配置返回的只是列的配置,
|
|
44
|
+
* 所以这边需要单独再坐下处理
|
|
45
|
+
*/
|
|
46
|
+
const multiPmPageMetaList = computed(() => {
|
|
47
|
+
return props.config.multiPmPageMetaList || []
|
|
48
|
+
})
|
|
49
|
+
const pmPageMetaList = computed(() => {
|
|
50
|
+
return (props.config.pmPageMetaList || [])
|
|
51
|
+
})
|
|
52
|
+
const rowConfgsMap = new Map()
|
|
53
|
+
const pageMetaListKeys = reactive({})
|
|
54
|
+
watch(() => {
|
|
55
|
+
return modelValue.value?.length
|
|
56
|
+
}, (length) => {
|
|
57
|
+
let list = []
|
|
58
|
+
if (length) {
|
|
59
|
+
const newVal = modelValue.value
|
|
60
|
+
list = newVal.map((row, idx) => {
|
|
61
|
+
const rowCgs = rowConfgsMap.get(row)
|
|
62
|
+
if (rowCgs) {
|
|
63
|
+
rowCgs.forEach(config => {
|
|
64
|
+
config.rowIndex = idx
|
|
65
|
+
})
|
|
66
|
+
return rowCgs
|
|
67
|
+
} else {
|
|
68
|
+
const retConfigs = pmPageMetaList.value.map(config => {
|
|
69
|
+
const ret = cloneDeep(config)
|
|
70
|
+
ret.rowIndex = idx
|
|
71
|
+
return ret
|
|
72
|
+
})
|
|
73
|
+
retConfigs.id = new Date().getTime()
|
|
74
|
+
pageMetaListKeys[retConfigs.id] = new Date().getTime()
|
|
75
|
+
|
|
76
|
+
rowConfgsMap.set(row, retConfigs)
|
|
77
|
+
return retConfigs
|
|
78
|
+
}
|
|
79
|
+
})
|
|
80
|
+
}
|
|
81
|
+
props.config.multiPmPageMetaList = list
|
|
82
|
+
}, {
|
|
83
|
+
immediate: true
|
|
84
|
+
})
|
|
85
|
+
</script>
|
|
86
|
+
<style lang="scss">
|
|
87
|
+
.el-tabs__item.is-active {
|
|
88
|
+
.el-text {
|
|
89
|
+
color: var(--el-color-primary)
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
</style>
|
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<ElDialog class="custom-component-dialog" v-bind="{...dialogProps, ...attrs}" :title="title" v-model="dialogValue">
|
|
3
|
+
<div class="header" v-if="!!title">
|
|
4
|
+
<span>{{ title }}</span>
|
|
5
|
+
</div>
|
|
6
|
+
<el-scrollbar class="content" :style="{height: contentHeight}">
|
|
7
|
+
<ElRow>
|
|
8
|
+
<Renderer :config="pmPageMetaList" v-model="modelValue"></Renderer>
|
|
9
|
+
</ElRow>
|
|
10
|
+
</el-scrollbar>
|
|
11
|
+
<div class="footer" v-if="showConfirmButton || showCloseButton">
|
|
12
|
+
<div class="dialog-footer">
|
|
13
|
+
<el-button v-if="showCloseButton" @click="toClose">
|
|
14
|
+
{{lang.indexOf('zh') > -1 ? '关闭' : 'Close'}}
|
|
15
|
+
</el-button>
|
|
16
|
+
<el-button v-if="showConfirmButton" type="primary" @click="toConfirm">
|
|
17
|
+
{{lang.indexOf('zh') > -1 ? '确认' : 'Confirm'}}
|
|
18
|
+
</el-button>
|
|
19
|
+
</div>
|
|
20
|
+
</div>
|
|
21
|
+
</ElDialog>
|
|
22
|
+
</template>
|
|
23
|
+
<script setup>
|
|
24
|
+
import { ElDialog, ElRow } from 'element-plus'
|
|
25
|
+
import { computed, inject, useAttrs } from 'vue'
|
|
26
|
+
import { commonPropsType, hasOwn } from '../../utils/index.js'
|
|
27
|
+
import Renderer from '../../renderer.jsx'
|
|
28
|
+
|
|
29
|
+
const lang = inject('lang')
|
|
30
|
+
const modelValue = defineModel()
|
|
31
|
+
const props = defineProps({
|
|
32
|
+
...ElDialog.props,
|
|
33
|
+
...commonPropsType,
|
|
34
|
+
titleEn: {
|
|
35
|
+
type: String,
|
|
36
|
+
default: ''
|
|
37
|
+
}
|
|
38
|
+
})
|
|
39
|
+
|
|
40
|
+
const dialogProps = computed(() => {
|
|
41
|
+
const attrs = Object.keys(ElDialog.props).reduce((ret, key) => {
|
|
42
|
+
ret[key] = props[key]
|
|
43
|
+
return ret
|
|
44
|
+
}, {})
|
|
45
|
+
if (!hasOwn(props.config, 'show-close') && !hasOwn(props.config, 'showClose')) {
|
|
46
|
+
attrs.showClose = false
|
|
47
|
+
}
|
|
48
|
+
return attrs
|
|
49
|
+
})
|
|
50
|
+
const attrs = useAttrs()
|
|
51
|
+
|
|
52
|
+
const title = computed(() => {
|
|
53
|
+
return lang.value.indexOf('zh') > -1 ? props.title : props.titleEn
|
|
54
|
+
})
|
|
55
|
+
|
|
56
|
+
const pmPageMetaList = computed(() => {
|
|
57
|
+
return props.config?.pmPageMetaList || []
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
let promiseResolve = null
|
|
61
|
+
let promiseReject = null
|
|
62
|
+
|
|
63
|
+
// 初始化handlePromise为一个计算属性,为了获取引用次数
|
|
64
|
+
let referenceCount = 0
|
|
65
|
+
let handleProValue = null
|
|
66
|
+
props.config.handlePromise = computed({
|
|
67
|
+
get() {
|
|
68
|
+
referenceCount ++
|
|
69
|
+
return handleProValue
|
|
70
|
+
},
|
|
71
|
+
set(val) {
|
|
72
|
+
referenceCount = 0
|
|
73
|
+
handleProValue = val
|
|
74
|
+
}
|
|
75
|
+
})
|
|
76
|
+
|
|
77
|
+
const dialogValue = computed({
|
|
78
|
+
get() {
|
|
79
|
+
const val = props?.config?.dialogVisible
|
|
80
|
+
if (showCloseButton.value || showConfirmButton.value) {
|
|
81
|
+
if (val) {
|
|
82
|
+
props.config.handlePromise = new Promise((res, rej) => {
|
|
83
|
+
promiseResolve = res
|
|
84
|
+
promiseReject = rej
|
|
85
|
+
})
|
|
86
|
+
} else {
|
|
87
|
+
promiseResolve = null
|
|
88
|
+
promiseReject = null
|
|
89
|
+
props.config.handlePromise = null
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
}
|
|
93
|
+
return val
|
|
94
|
+
},
|
|
95
|
+
set(val) {
|
|
96
|
+
props?.config && (props.config.dialogVisible = val)
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
// 是否显示确定按钮
|
|
100
|
+
const showConfirmButton = computed(() => {
|
|
101
|
+
return !!(props.config?.showConfirmButton) || !!(props.config?.showConfirm)
|
|
102
|
+
})
|
|
103
|
+
// 是否显示确定关闭按钮
|
|
104
|
+
const showCloseButton = computed(() => {
|
|
105
|
+
return hasOwn(props.config, 'showCloseButton') ?
|
|
106
|
+
!!(props.config?.showCloseButton) :
|
|
107
|
+
hasOwn(props.config, 'showClose') ? !!(props.config?.showClose) : true
|
|
108
|
+
})
|
|
109
|
+
|
|
110
|
+
const toConfirm = async () => {
|
|
111
|
+
let intercept = null
|
|
112
|
+
let interceptPromise = new Promise((res) => {
|
|
113
|
+
intercept = res
|
|
114
|
+
})
|
|
115
|
+
promiseResolve && promiseResolve({props, next: intercept})
|
|
116
|
+
|
|
117
|
+
let res = true
|
|
118
|
+
if (referenceCount) {
|
|
119
|
+
res = await interceptPromise
|
|
120
|
+
}
|
|
121
|
+
if (res) {
|
|
122
|
+
dialogValue.value = false
|
|
123
|
+
}
|
|
124
|
+
props.config.handlePromise = new Promise((res, rej) => {
|
|
125
|
+
promiseResolve = res
|
|
126
|
+
promiseReject = rej
|
|
127
|
+
})
|
|
128
|
+
}
|
|
129
|
+
const toClose = async () => {
|
|
130
|
+
let intercept = null
|
|
131
|
+
let interceptPromise = new Promise((res) => {
|
|
132
|
+
intercept = res
|
|
133
|
+
})
|
|
134
|
+
promiseReject && promiseReject({props, next: intercept})
|
|
135
|
+
|
|
136
|
+
let res = true
|
|
137
|
+
if (referenceCount) {
|
|
138
|
+
res = await interceptPromise
|
|
139
|
+
}
|
|
140
|
+
if (res) {
|
|
141
|
+
dialogValue.value = false
|
|
142
|
+
}
|
|
143
|
+
props.config.handlePromise = new Promise((res, rej) => {
|
|
144
|
+
promiseResolve = res
|
|
145
|
+
promiseReject = rej
|
|
146
|
+
})
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const contentHeight = computed(() => {
|
|
150
|
+
let reduceNum = 0
|
|
151
|
+
if (!!title.value) {
|
|
152
|
+
reduceNum += 46
|
|
153
|
+
}
|
|
154
|
+
if (showConfirmButton.value || showCloseButton.value) {
|
|
155
|
+
reduceNum += 72
|
|
156
|
+
}
|
|
157
|
+
return `calc(100% - ${reduceNum}px)`
|
|
158
|
+
})
|
|
159
|
+
</script>
|
|
160
|
+
|
|
161
|
+
<style lang="scss">
|
|
162
|
+
</style>
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
<script setup>
|
|
2
|
+
import { computed, inject } from 'vue'
|
|
3
|
+
import { Quill, quillEditor } from 'vue3-quill'
|
|
4
|
+
import { commonPropsType } from '../../utils';
|
|
5
|
+
|
|
6
|
+
const props = defineProps({
|
|
7
|
+
...commonPropsType,
|
|
8
|
+
})
|
|
9
|
+
const lang = inject('lang')
|
|
10
|
+
const modelValue = defineModel()
|
|
11
|
+
|
|
12
|
+
const editorOption = computed(() => {
|
|
13
|
+
return {
|
|
14
|
+
placeholder: props.config[lang?.value?.indexOf('zh') > -1 ? 'defPlacehold' : 'defPlaceholdEn'],
|
|
15
|
+
modules: {
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
})
|
|
19
|
+
const editorStyle = computed(() => {
|
|
20
|
+
return {
|
|
21
|
+
height: props.config?.contentHeight || '200px'
|
|
22
|
+
}
|
|
23
|
+
})
|
|
24
|
+
</script>
|
|
25
|
+
<template>
|
|
26
|
+
<div class="custom-component-editor">
|
|
27
|
+
<quillEditor
|
|
28
|
+
ref="fieldEditor"
|
|
29
|
+
v-model:value="modelValue"
|
|
30
|
+
:options="editorOption"
|
|
31
|
+
:disabled="props.disabled"
|
|
32
|
+
@blur="() => {}"
|
|
33
|
+
@focus="() => {}"
|
|
34
|
+
@change="() => {}"
|
|
35
|
+
:style="editorStyle"
|
|
36
|
+
></quillEditor>
|
|
37
|
+
</div>
|
|
38
|
+
</template>
|
|
39
|
+
<style lang="scss">
|
|
40
|
+
.custom-component-editor {
|
|
41
|
+
width: 100%;
|
|
42
|
+
}
|
|
43
|
+
</style>
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<ElForm v-bind="formProps" :ref="refFn" :model="props.modelValue">
|
|
3
|
+
<ElRow v-bind="rowProps">
|
|
4
|
+
<Renderer :config="pmPageMetaList" v-model="val"></Renderer>
|
|
5
|
+
</ElRow>
|
|
6
|
+
</ElForm>
|
|
7
|
+
</template>
|
|
8
|
+
<script setup>
|
|
9
|
+
import Renderer from '../../renderer.jsx'
|
|
10
|
+
import { computed, inject } from "vue"
|
|
11
|
+
import { ElForm, ElRow } from 'element-plus'
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
const emits = defineEmits(['update:modelValue'])
|
|
15
|
+
const props = defineProps({
|
|
16
|
+
config: {
|
|
17
|
+
type: Object,
|
|
18
|
+
default: () => null
|
|
19
|
+
},
|
|
20
|
+
// 这个组件通过v-model进行数据的绑定
|
|
21
|
+
modelValue: {
|
|
22
|
+
// type: [String, Number, Object],
|
|
23
|
+
default: null
|
|
24
|
+
},
|
|
25
|
+
...ElForm.props,
|
|
26
|
+
...ElRow.props
|
|
27
|
+
})
|
|
28
|
+
|
|
29
|
+
const rootForm = inject('rootForm')
|
|
30
|
+
const refFn = e => {
|
|
31
|
+
if (props.config?.rootForm) {
|
|
32
|
+
rootForm.value = e
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
const formProps = computed(() => {
|
|
37
|
+
return Object.keys(ElForm.props).reduce((ret, key) => {
|
|
38
|
+
ret[key] = props[key]
|
|
39
|
+
return ret
|
|
40
|
+
},{})
|
|
41
|
+
})
|
|
42
|
+
|
|
43
|
+
const rowProps = computed(() => {
|
|
44
|
+
return Object.keys(ElRow.props).reduce((ret, key) => {
|
|
45
|
+
ret[key] = props[key]
|
|
46
|
+
return ret
|
|
47
|
+
},{})
|
|
48
|
+
})
|
|
49
|
+
|
|
50
|
+
const pmPageMetaList = computed(() => props.config.pmPageMetaList)
|
|
51
|
+
|
|
52
|
+
const val = computed({
|
|
53
|
+
get() {
|
|
54
|
+
return props.modelValue
|
|
55
|
+
},
|
|
56
|
+
set(val) {
|
|
57
|
+
emits('update:modelValue', val)
|
|
58
|
+
}
|
|
59
|
+
})
|
|
60
|
+
defineExpose({
|
|
61
|
+
val
|
|
62
|
+
})
|
|
63
|
+
</script>
|