Commit 2de2fc0ad0001f45b93bd7513c1bce8298367101

Authored by ly525
1 parent e181c274

refactor: merge props config to props

front-end/h5/src/components/core/editor/edit-panel/props.js
1 import { mapState, mapActions } from 'vuex' 1 import { mapState, mapActions } from 'vuex'
  2 +import { getVM } from '../../../../utils/element'
2 3
3 export default { 4 export default {
4 props: { 5 props: {
@@ -25,7 +26,9 @@ export default { @@ -25,7 +26,9 @@ export default {
25 } 26 }
26 }, 27 },
27 renderPropsEditorPanel (h, editingElement) { 28 renderPropsEditorPanel (h, editingElement) {
28 - const propsConfig = this.editingElementEditorConfig.propsConfig 29 + const vm = getVM(editingElement.name)
  30 + const props = vm.$options.props
  31 +
29 return ( 32 return (
30 <a-form 33 <a-form
31 ref="form" 34 ref="form"
@@ -34,48 +37,51 @@ export default { @@ -34,48 +37,51 @@ export default {
34 layout={this.layout} 37 layout={this.layout}
35 > 38 >
36 { 39 {
37 - Object.keys(propsConfig).map(propKey => {  
38 - const item = propsConfig[propKey]  
39 - // https://vuejs.org/v2/guide/render-function.html  
40 - const data = {  
41 - style: { width: '100%' },  
42 - props: {  
43 - ...item.prop || {},  
44 - // https://vuejs.org/v2/guide/render-function.html#v-model 40 + Object
  41 + .entries(props)
  42 + .filter(([propKey, obj]) => obj.editor)
  43 + .map(([propKey, obj]) => {
  44 + const item = obj.editor
  45 + // https://vuejs.org/v2/guide/render-function.html
  46 + const data = {
  47 + style: { width: '100%' },
  48 + props: {
  49 + ...item.prop || {},
  50 + // https://vuejs.org/v2/guide/render-function.html#v-model
45 51
46 - // #!zh:不设置默认值的原因(下一行的代码,注释的代码):  
47 - // 比如表单 input,如果用户手动删除了 placeholder的内容,程序会用defaultPropValue填充,  
48 - // 表现在UI上就是:用户永远无法彻底删掉默认值(必须保留至少一个字符)  
49 - // value: editingElement.pluginProps[propKey] || item.defaultPropValue  
50 - value: editingElement.pluginProps[propKey]  
51 - },  
52 - on: { 52 + // #!zh:不设置默认值的原因(下一行的代码,注释的代码):
  53 + // 比如表单 input,如果用户手动删除了 placeholder的内容,程序会用defaultPropValue填充,
  54 + // 表现在UI上就是:用户永远无法彻底删掉默认值(必须保留至少一个字符)
  55 + // value: editingElement.pluginProps[propKey] || item.defaultPropValue
  56 + value: editingElement.pluginProps[propKey]
  57 + },
  58 + on: {
53 // https://vuejs.org/v2/guide/render-function.html#v-model 59 // https://vuejs.org/v2/guide/render-function.html#v-model
54 // input (e) { 60 // input (e) {
55 // editingElement.pluginProps[propKey] = e.target ? e.target.value : e 61 // editingElement.pluginProps[propKey] = e.target ? e.target.value : e
56 // } 62 // }
57 - change (e) { 63 + change (e) {
58 // TODO fixme: update plugin props in vuex with dispatch 64 // TODO fixme: update plugin props in vuex with dispatch
59 - editingElement.pluginProps[propKey] = e.target ? e.target.value : e 65 + editingElement.pluginProps[propKey] = e.target ? e.target.value : e
  66 + }
60 } 67 }
61 } 68 }
62 - }  
63 - const formItemLayout = this.layout === 'horizontal' ? {  
64 - labelCol: { span: 6 }, wrapperCol: { span: 16, offset: 2 }  
65 - } : {}  
66 - const formItemData = {  
67 - props: {  
68 - ...formItemLayout,  
69 - label: item.label 69 + const formItemLayout = this.layout === 'horizontal' ? {
  70 + labelCol: { span: 6 }, wrapperCol: { span: 16, offset: 2 }
  71 + } : {}
  72 + const formItemData = {
  73 + props: {
  74 + ...formItemLayout,
  75 + label: item.label
  76 + }
70 } 77 }
71 - }  
72 - return (  
73 - <a-form-item {...formItemData}>  
74 - { item.extra && <div slot="extra">{typeof item.extra === 'function' ? item.extra(h) : item.extra}</div>}  
75 - { h(item.type, data) }  
76 - </a-form-item>  
77 - )  
78 - }) 78 + return (
  79 + <a-form-item {...formItemData}>
  80 + { item.extra && <div slot="extra">{typeof item.extra === 'function' ? item.extra(h) : item.extra}</div>}
  81 + { h(item.type, data) }
  82 + </a-form-item>
  83 + )
  84 + })
79 } 85 }
80 </a-form> 86 </a-form>
81 ) 87 )
front-end/h5/src/components/core/editor/index.js
1 import { mapState, mapActions } from 'vuex' 1 import { mapState, mapActions } from 'vuex'
2 import undoRedoHistory from '../../../store/plugins/undo-redo/History' 2 import undoRedoHistory from '../../../store/plugins/undo-redo/History'
3 -import { getEditorConfigForEditingElement } from '../../../utils/element'  
4 3
5 import '../styles/index.scss' 4 import '../styles/index.scss'
6 import 'animate.css' 5 import 'animate.css'
@@ -139,11 +138,9 @@ export default { @@ -139,11 +138,9 @@ export default {
139 * pluginInfo {Object}: 插件列表中的基础数据, {name}=pluginInfo 138 * pluginInfo {Object}: 插件列表中的基础数据, {name}=pluginInfo
140 */ 139 */
141 clone ({ name }) { 140 clone ({ name }) {
142 - // const zindex = this.elements.length + 1  
143 - const editorConfig = getEditorConfigForEditingElement(name)  
144 this.elementManager({ 141 this.elementManager({
145 type: 'add', 142 type: 'add',
146 - value: { name, editorConfig } 143 + value: { name }
147 }) 144 })
148 }, 145 },
149 _renderMenuContent () { 146 _renderMenuContent () {
front-end/h5/src/components/core/models/element.js
@@ -37,20 +37,34 @@ class Element { @@ -37,20 +37,34 @@ class Element {
37 this.animations = ele.animations || [] 37 this.animations = ele.animations || []
38 } 38 }
39 39
40 - getDefaultPluginProps (editorConfig) {  
41 - // init prop of plugin  
42 - const propConf = editorConfig.propsConfig 40 + // init prop of plugin
  41 + getDefaultPluginProps (propsConfig) {
43 const pluginProps = {} 42 const pluginProps = {}
44 - Object.keys(propConf).forEach(key => { 43 + Object.keys(propsConfig).forEach(key => {
45 // #6 44 // #6
46 if (key === 'name') { 45 if (key === 'name') {
47 console.warn('Please do not use {name} as plugin prop') 46 console.warn('Please do not use {name} as plugin prop')
48 return 47 return
49 } 48 }
50 - pluginProps[key] = propConf[key].defaultPropValue 49 + const defaultValue = propsConfig[key].default
  50 + pluginProps[key] = typeof defaultValue === 'function' ? defaultValue() : defaultValue
51 }) 51 })
52 return pluginProps 52 return pluginProps
53 } 53 }
  54 + // getDefaultPluginProps (editorConfig) {
  55 + // // init prop of plugin
  56 + // const propConf = editorConfig.propsConfig
  57 + // const pluginProps = {}
  58 + // Object.keys(propConf).forEach(key => {
  59 + // // #6
  60 + // if (key === 'name') {
  61 + // console.warn('Please do not use {name} as plugin prop')
  62 + // return
  63 + // }
  64 + // pluginProps[key] = propConf[key].defaultPropValue
  65 + // })
  66 + // return pluginProps
  67 + // }
54 68
55 getStyle ({ position = 'static', isRem = false } = {}) { 69 getStyle ({ position = 'static', isRem = false } = {}) {
56 if (this.name === 'lbp-background') { 70 if (this.name === 'lbp-background') {
front-end/h5/src/components/plugins/common/props.js
@@ -7,10 +7,15 @@ export default { @@ -7,10 +7,15 @@ export default {
7 type: String, 7 type: String,
8 default: 'radio' 8 default: 'radio'
9 }, 9 },
10 - placeholder: {  
11 - type: String,  
12 - default: '请填写提示文字'  
13 - }, 10 + // placeholder: {
  11 + // type: String,
  12 + // default: '请填写提示文字',
  13 + // editor: {
  14 + // type: 'a-input',
  15 + // label: '提示文字',
  16 + // require: true
  17 + // }
  18 + // },
14 required: { 19 required: {
15 type: Boolean, 20 type: Boolean,
16 default: false 21 default: false
@@ -21,34 +26,104 @@ export default { @@ -21,34 +26,104 @@ export default {
21 }, 26 },
22 backgroundColor: { 27 backgroundColor: {
23 type: String, 28 type: String,
24 - default: 'transparent' 29 + default: 'transparent',
  30 + editor: {
  31 + type: 'a-input', // lbs-color-picker
  32 + label: '背景颜色',
  33 + prop: {
  34 + type: 'color'
  35 + },
  36 + require: true
  37 + }
25 }, 38 },
26 color: { 39 color: {
27 type: String, 40 type: String,
28 - default: 'black' 41 + default: 'black',
  42 + editor: {
  43 + type: 'a-input',
  44 + label: '文字颜色',
  45 + // !#zh 为编辑组件指定 prop
  46 + prop: {
  47 + type: 'color'
  48 + },
  49 + require: true
  50 + }
29 }, 51 },
30 fontSize: { 52 fontSize: {
31 type: Number, 53 type: Number,
32 - default: 14 54 + default: 14,
  55 + editor: {
  56 + type: 'a-input-number',
  57 + label: '字号(px)',
  58 + require: true,
  59 + prop: {
  60 + step: 1,
  61 + min: 12,
  62 + max: 144
  63 + }
  64 + }
33 }, 65 },
34 lineHeight: { 66 lineHeight: {
35 type: Number, 67 type: Number,
36 - default: 1 68 + default: 1,
  69 + editor: {
  70 + type: 'a-input-number',
  71 + label: '行高',
  72 + require: true,
  73 + prop: {
  74 + step: 0.1,
  75 + min: 0.1,
  76 + max: 10
  77 + }
  78 + }
37 }, 79 },
38 borderWidth: { 80 borderWidth: {
39 type: Number, 81 type: Number,
40 - default: 1 82 + default: 1,
  83 + editor: {
  84 + type: 'a-input-number',
  85 + label: '边框宽度(px)',
  86 + require: true,
  87 + prop: {
  88 + step: 1,
  89 + min: 0,
  90 + max: 10
  91 + }
  92 + }
41 }, 93 },
42 borderRadius: { 94 borderRadius: {
43 type: Number, 95 type: Number,
44 - default: 0 96 + default: 0,
  97 + editor: {
  98 + type: 'a-input-number',
  99 + label: '圆角(px)',
  100 + require: true,
  101 + prop: {
  102 + step: 0.1,
  103 + min: 0,
  104 + max: 200
  105 + }
  106 + }
45 }, 107 },
46 borderColor: { 108 borderColor: {
47 type: String, 109 type: String,
48 - default: '#ced4da' 110 + default: '#ced4da',
  111 + editor: {
  112 + type: 'a-input', // lbs-color-picker
  113 + label: '边框颜色',
  114 + prop: {
  115 + type: 'color'
  116 + },
  117 + require: true
  118 + }
49 }, 119 },
50 textAlign: { 120 textAlign: {
51 type: String, 121 type: String,
52 - default: 'center' 122 + default: 'center',
  123 + editor: {
  124 + type: 'lbs-text-align',
  125 + label: '文字对齐',
  126 + require: true
  127 + }
53 } 128 }
54 } 129 }
front-end/h5/src/components/plugins/lbp-button.js
1 import LbpTextAlign from '@luban-h5/lbs-text-align' 1 import LbpTextAlign from '@luban-h5/lbs-text-align'
  2 +import commonProps from './common/props.js'
2 3
3 export default { 4 export default {
4 render () { 5 render () {
@@ -32,18 +33,20 @@ export default { @@ -32,18 +33,20 @@ export default {
32 }, 33 },
33 name: 'lbp-button', 34 name: 'lbp-button',
34 props: { 35 props: {
  36 + ...commonProps,
35 text: { 37 text: {
36 type: String, 38 type: String,
37 - default: '按钮' 39 + default: '按钮',
  40 + editor: {
  41 + type: 'a-input',
  42 + label: '按钮文字',
  43 + require: true
  44 + }
38 }, 45 },
39 type: { 46 type: {
40 type: String, 47 type: String,
41 default: 'text' 48 default: 'text'
42 }, 49 },
43 - placeholder: {  
44 - type: String,  
45 - default: '请填写提示文字'  
46 - },  
47 required: { 50 required: {
48 type: Boolean, 51 type: Boolean,
49 default: false 52 default: false
@@ -51,149 +54,9 @@ export default { @@ -51,149 +54,9 @@ export default {
51 disabled: { 54 disabled: {
52 type: Boolean, 55 type: Boolean,
53 default: false 56 default: false
54 - },  
55 - backgroundColor: {  
56 - type: String,  
57 - default: 'transparent'  
58 - },  
59 - color: {  
60 - type: String,  
61 - default: 'black'  
62 - },  
63 - fontSize: {  
64 - type: Number,  
65 - default: 14  
66 - },  
67 - lineHeight: {  
68 - type: Number,  
69 - default: 1  
70 - },  
71 - borderWidth: {  
72 - type: Number,  
73 - default: 1  
74 - },  
75 - borderRadius: {  
76 - type: Number,  
77 - default: 0  
78 - },  
79 - borderColor: {  
80 - type: String,  
81 - default: '#ced4da'  
82 - },  
83 - textAlign: {  
84 - type: String,  
85 - default: 'center'  
86 } 57 }
87 }, 58 },
88 editorConfig: { 59 editorConfig: {
89 - propsConfig: {  
90 - text: {  
91 - type: 'a-input',  
92 - label: '按钮文字',  
93 - require: true,  
94 - defaultPropValue: '按钮'  
95 - },  
96 - fontSize: {  
97 - type: 'a-input-number',  
98 - label: '字号(px)',  
99 - require: true,  
100 - prop: {  
101 - step: 1,  
102 - min: 12,  
103 - max: 144  
104 - },  
105 - defaultPropValue: 14  
106 - },  
107 - color: {  
108 - type: 'a-input',  
109 - label: '文字颜色',  
110 - // !#zh 为编辑组件指定 prop  
111 - prop: {  
112 - type: 'color'  
113 - },  
114 - require: true,  
115 - defaultPropValue: 'black'  
116 - },  
117 - backgroundColor: {  
118 - type: 'a-input', // lbs-color-picker  
119 - label: '背景颜色',  
120 - prop: {  
121 - type: 'color'  
122 - },  
123 - require: true,  
124 - defaultPropValue: '#ffffff' // TODO why logogram for color does't work?  
125 - },  
126 - borderColor: {  
127 - type: 'a-input', // lbs-color-picker  
128 - label: '边框颜色',  
129 - prop: {  
130 - type: 'color'  
131 - },  
132 - require: true,  
133 - defaultPropValue: '#eeeeee'  
134 - },  
135 - borderWidth: {  
136 - type: 'a-input-number',  
137 - label: '边框宽度(px)',  
138 - require: true,  
139 - prop: {  
140 - step: 1,  
141 - min: 0,  
142 - max: 10  
143 - },  
144 - defaultPropValue: 1  
145 - },  
146 - borderRadius: {  
147 - type: 'a-input-number',  
148 - label: '圆角(px)',  
149 - require: true,  
150 - prop: {  
151 - step: 0.1,  
152 - min: 0,  
153 - max: 200  
154 - },  
155 - defaultPropValue: 0  
156 - },  
157 - lineHeight: {  
158 - type: 'a-input-number',  
159 - label: '行高',  
160 - require: true,  
161 - prop: {  
162 - step: 0.1,  
163 - min: 0.1,  
164 - max: 10  
165 - },  
166 - defaultPropValue: 1  
167 - },  
168 - textAlign: {  
169 - /**  
170 - * #!en: you can also config type like below:  
171 - * #!zh: 可以直接这样写:  
172 - textAlign: {  
173 - type: component(component definition json/自定义的组件,比如下面的 components[''lbs-text-align'])  
174 - }  
175 -  
176 - * more explanation  
177 - textAlign: {  
178 - type: {  
179 - render() {},  
180 - props: {},  
181 - methods: {},  
182 - }  
183 - }  
184 - * #!en: reference: how to judge the tag is custom component or a HTML element in React or Vue?  
185 - * !#zh:  
186 - * 思路来源:  
187 - * React 中 深入JSX 中,如何判断 h(tag) 中的 tag 是自定义组件还是普通 HTML 元素呢?React 是判断该 tag 是否为 function 来实现的  
188 - * Vue 中的自定义组件 是一个普通的 JSON 对象,最后自定义组件被转换成了函数,输入是 JSON 输出是 函数,可以看看 Vue 中 createElement 也就是 h 的实现·  
189 - * 参见:http://hcysun.me/2018/01/05/%E6%8E%A2%E7%B4%A2Vue%E9%AB%98%E9%98%B6%E7%BB%84%E4%BB%B6/  
190 - */  
191 - type: 'lbs-text-align',  
192 - label: '文字对齐',  
193 - require: true,  
194 - defaultPropValue: 'center'  
195 - }  
196 - },  
197 components: { 60 components: {
198 'lbs-text-align': LbpTextAlign 61 'lbs-text-align': LbpTextAlign
199 } 62 }
front-end/h5/src/mixins/load-plugins.js
1 import Vue from 'vue' 1 import Vue from 'vue'
2 -import LbpButton from '@luban-h5/lbc-button'  
3 -import LbpPicture from '../components/plugins/lbp-picture'  
4 -import LbpVideo from '../components/plugins/lbp-video'  
5 -import LbpText from '../components/plugins/lbp-text'  
6 -import LbpFormInput from '../components/plugins/lbp-form-input'  
7 -import LbpFormButton from '../components/plugins/lbp-form-button'  
8 -import LbpFormRadioGroup from '../components/plugins/lbp-form-radio-group'  
9 -import LbpFormCheckboxGroup from '../components/plugins/lbp-form-checkbox-group' 2 +// import LbpButton from '@luban-h5/lbc-button'
  3 +import LbpButton from '../components/plugins/lbp-button'
  4 +// import LbpPicture from '../components/plugins/lbp-picture'
  5 +// import LbpVideo from '../components/plugins/lbp-video'
  6 +// import LbpText from '../components/plugins/lbp-text'
  7 +// import LbpFormInput from '../components/plugins/lbp-form-input'
  8 +// import LbpFormButton from '../components/plugins/lbp-form-button'
  9 +// import LbpFormRadioGroup from '../components/plugins/lbp-form-radio-group'
  10 +// import LbpFormCheckboxGroup from '../components/plugins/lbp-form-checkbox-group'
10 import LbpBackground from '../components/plugins/lbp-background' 11 import LbpBackground from '../components/plugins/lbp-background'
11 -import LbpSlide from '../components/plugins/lbp-slide' 12 +// import LbpSlide from '../components/plugins/lbp-slide'
12 13
13 export const pluginsList = [ 14 export const pluginsList = [
14 - {  
15 - title: '图片',  
16 - i18nTitle: {  
17 - 'en-US': 'Picture',  
18 - 'zh-CN': '图片'  
19 - },  
20 - icon: 'photo',  
21 - component: LbpPicture,  
22 - visible: true,  
23 - name: LbpPicture.name  
24 - },  
25 - {  
26 - i18nTitle: {  
27 - 'en-US': 'Text',  
28 - 'zh-CN': '文字'  
29 - },  
30 - title: '文字',  
31 - icon: 'text-width',  
32 - component: LbpText,  
33 - visible: true,  
34 - name: LbpText.name  
35 - }, 15 + // {
  16 + // title: '图片',
  17 + // i18nTitle: {
  18 + // 'en-US': 'Picture',
  19 + // 'zh-CN': '图片'
  20 + // },
  21 + // icon: 'photo',
  22 + // component: LbpPicture,
  23 + // visible: true,
  24 + // name: LbpPicture.name
  25 + // },
  26 + // {
  27 + // i18nTitle: {
  28 + // 'en-US': 'Text',
  29 + // 'zh-CN': '文字'
  30 + // },
  31 + // title: '文字',
  32 + // icon: 'text-width',
  33 + // component: LbpText,
  34 + // visible: true,
  35 + // name: LbpText.name
  36 + // },
36 { 37 {
37 i18nTitle: { 38 i18nTitle: {
38 'en-US': 'Button', 39 'en-US': 'Button',
@@ -44,99 +45,99 @@ export const pluginsList = [ @@ -44,99 +45,99 @@ export const pluginsList = [
44 visible: true, 45 visible: true,
45 name: LbpButton.name 46 name: LbpButton.name
46 }, 47 },
47 - {  
48 - i18nTitle: {  
49 - 'en-US': 'Carousel',  
50 - 'zh-CN': '轮播图'  
51 - },  
52 - title: '轮播图',  
53 - icon: 'photo',  
54 - component: LbpSlide,  
55 - visible: true,  
56 - name: LbpSlide.name  
57 - // disabled: true  
58 - },  
59 - {  
60 - i18nTitle: {  
61 - 'en-US': 'Map',  
62 - 'zh-CN': '地图'  
63 - },  
64 - title: '地图',  
65 - icon: 'map-o',  
66 - component: LbpFormRadioGroup,  
67 - visible: true,  
68 - name: LbpFormRadioGroup.name,  
69 - disabled: true  
70 - },  
71 - {  
72 - i18nTitle: {  
73 - 'en-US': 'Video',  
74 - 'zh-CN': '视频'  
75 - },  
76 - title: '视频',  
77 - icon: 'file-video-o',  
78 - component: LbpVideo,  
79 - visible: true,  
80 - name: LbpVideo.name  
81 - },  
82 // { 48 // {
  49 + // i18nTitle: {
  50 + // 'en-US': 'Carousel',
  51 + // 'zh-CN': '轮播图'
  52 + // },
  53 + // title: '轮播图',
  54 + // icon: 'photo',
  55 + // component: LbpSlide,
  56 + // visible: true,
  57 + // name: LbpSlide.name
  58 + // // disabled: true
  59 + // },
  60 + // {
  61 + // i18nTitle: {
  62 + // 'en-US': 'Map',
  63 + // 'zh-CN': '地图'
  64 + // },
  65 + // title: '地图',
  66 + // icon: 'map-o',
  67 + // component: LbpFormRadioGroup,
  68 + // visible: true,
  69 + // name: LbpFormRadioGroup.name,
  70 + // disabled: true
  71 + // },
  72 + // {
  73 + // i18nTitle: {
  74 + // 'en-US': 'Video',
  75 + // 'zh-CN': '视频'
  76 + // },
83 // title: '视频', 77 // title: '视频',
84 - // icon: 'play-circle-o', 78 + // icon: 'file-video-o',
85 // component: LbpVideo, 79 // component: LbpVideo,
86 // visible: true, 80 // visible: true,
87 // name: LbpVideo.name 81 // name: LbpVideo.name
88 // }, 82 // },
89 - {  
90 - i18nTitle: {  
91 - 'en-US': 'Form Input',  
92 - 'zh-CN': '表单输入'  
93 - },  
94 - title: '表单输入',  
95 - icon: 'pencil-square-o',  
96 - component: LbpFormInput,  
97 - visible: true,  
98 - name: LbpFormInput.name  
99 - },  
100 - {  
101 - i18nTitle: {  
102 - 'en-US': 'Form Submit',  
103 - 'zh-CN': '表单提交'  
104 - },  
105 - title: '表单提交',  
106 - icon: 'hand-pointer-o',  
107 - component: LbpFormButton,  
108 - visible: true,  
109 - name: LbpFormButton.name  
110 - }, 83 + // // {
  84 + // // title: '视频',
  85 + // // icon: 'play-circle-o',
  86 + // // component: LbpVideo,
  87 + // // visible: true,
  88 + // // name: LbpVideo.name
  89 + // // },
111 // { 90 // {
112 - // title: '表单单选', 91 + // i18nTitle: {
  92 + // 'en-US': 'Form Input',
  93 + // 'zh-CN': '表单输入'
  94 + // },
  95 + // title: '表单输入',
  96 + // icon: 'pencil-square-o',
  97 + // component: LbpFormInput,
  98 + // visible: true,
  99 + // name: LbpFormInput.name
  100 + // },
  101 + // {
  102 + // i18nTitle: {
  103 + // 'en-US': 'Form Submit',
  104 + // 'zh-CN': '表单提交'
  105 + // },
  106 + // title: '表单提交',
113 // icon: 'hand-pointer-o', 107 // icon: 'hand-pointer-o',
114 - // component: LbpFormRadio, 108 + // component: LbpFormButton,
115 // visible: true, 109 // visible: true,
116 - // name: LbpFormRadio.name 110 + // name: LbpFormButton.name
  111 + // },
  112 + // // {
  113 + // // title: '表单单选',
  114 + // // icon: 'hand-pointer-o',
  115 + // // component: LbpFormRadio,
  116 + // // visible: true,
  117 + // // name: LbpFormRadio.name
  118 + // // },
  119 + // {
  120 + // i18nTitle: {
  121 + // 'en-US': 'Form Checkbox',
  122 + // 'zh-CN': '表单多选'
  123 + // },
  124 + // title: '表单多选',
  125 + // icon: 'check-square-o',
  126 + // component: LbpFormCheckboxGroup,
  127 + // visible: true,
  128 + // name: LbpFormCheckboxGroup.name
  129 + // },
  130 + // {
  131 + // i18nTitle: {
  132 + // 'en-US': 'Form Radio',
  133 + // 'zh-CN': '表单单选'
  134 + // },
  135 + // title: '表单单选',
  136 + // icon: 'dot-circle-o',
  137 + // component: LbpFormRadioGroup,
  138 + // visible: true,
  139 + // name: LbpFormRadioGroup.name
117 // }, 140 // },
118 - {  
119 - i18nTitle: {  
120 - 'en-US': 'Form Checkbox',  
121 - 'zh-CN': '表单多选'  
122 - },  
123 - title: '表单多选',  
124 - icon: 'check-square-o',  
125 - component: LbpFormCheckboxGroup,  
126 - visible: true,  
127 - name: LbpFormCheckboxGroup.name  
128 - },  
129 - {  
130 - i18nTitle: {  
131 - 'en-US': 'Form Radio',  
132 - 'zh-CN': '表单单选'  
133 - },  
134 - title: '表单单选',  
135 - icon: 'dot-circle-o',  
136 - component: LbpFormRadioGroup,  
137 - visible: true,  
138 - name: LbpFormRadioGroup.name  
139 - },  
140 { 141 {
141 i18nTitle: { 142 i18nTitle: {
142 'en-US': 'Background', 143 'en-US': 'Background',
front-end/h5/src/store/modules/element.js
1 import Element from '../../components/core/models/element' 1 import Element from '../../components/core/models/element'
2 -import { getEditorConfigForEditingElement, swapZindex } from '../../utils/element' 2 +import { getEditorConfigForEditingElement, swapZindex, getVM } from '../../utils/element'
3 3
4 // actions 4 // actions
5 export const actions = { 5 export const actions = {
@@ -44,11 +44,15 @@ export const mutations = { @@ -44,11 +44,15 @@ export const mutations = {
44 44
45 switch (type) { 45 switch (type) {
46 case 'add': 46 case 'add':
  47 + // value.name => pluginName
  48 + const { name } = value
  49 + const vm = getVM(value.name)
  50 + const props = vm.$options.props
47 value = { 51 value = {
48 ...value, 52 ...value,
49 zindex: len + 1 53 zindex: len + 1
50 } 54 }
51 - const element = new Element(value) 55 + const element = new Element({ name, editorConfig: props })
52 elements.push(element) 56 elements.push(element)
53 break 57 break
54 case 'copy': 58 case 'copy':
front-end/h5/src/utils/element.js
@@ -9,6 +9,11 @@ export function getEditorConfigForEditingElement (elementName) { @@ -9,6 +9,11 @@ export function getEditorConfigForEditingElement (elementName) {
9 return new Ctor().$options.editorConfig 9 return new Ctor().$options.editorConfig
10 } 10 }
11 11
  12 +export function getVM (pluginName) {
  13 + const Ctor = Vue.component(pluginName)
  14 + return new Ctor()
  15 +}
  16 +
12 export function swapZindex (x, y) { 17 export function swapZindex (x, y) {
13 const tmp = y[styleKey].zindex 18 const tmp = y[styleKey].zindex
14 y[styleKey].zindex = x[styleKey].zindex 19 y[styleKey].zindex = x[styleKey].zindex