Commit 66a2a7409d924b9f11f8ae6807e5db24e2ab5355

Authored by ly525
1 parent ce9774a6

chore: patch for guanwanxiao:syq/box-model

front-end/h5/src/components/core/editor/right-panel/background.js
@@ -27,7 +27,11 @@ export default { @@ -27,7 +27,11 @@ export default {
27 const bgEle = this.editingPage.elements.find(e => e.name === 'lbp-background') 27 const bgEle = this.editingPage.elements.find(e => e.name === 'lbp-background')
28 return ( 28 return (
29 <div> 29 <div>
30 - <RenderWorkMode /> 30 + <a-collapse expand-icon-position="right">
  31 + <a-collapse-panel key="1" header="H5模式">
  32 + <RenderWorkMode />
  33 + </a-collapse-panel>
  34 + </a-collapse>
31 <PropsEditPanel 35 <PropsEditPanel
32 layout="vertical" 36 layout="vertical"
33 realEditingElement={bgEle} 37 realEditingElement={bgEle}
front-end/h5/src/components/core/editor/right-panel/box-model/index.vue
@@ -20,18 +20,19 @@ @@ -20,18 +20,19 @@
20 <PositionCheckbox label="右" label-key="right" /> 20 <PositionCheckbox label="右" label-key="right" />
21 </div> 21 </div>
22 <PositionCheckbox label="下" label-key="bottom" /> 22 <PositionCheckbox label="下" label-key="bottom" />
23 - <template v-if="isEditingBorder">  
24 - <div> 设置border-color </div> 23 + <div v-if="isEditingBorder" style="margin: 20px;">
  24 + <span> 设置border-color </span>
25 <el-color-picker size="small" :value="borderColor" @change="onColorChange"/> 25 <el-color-picker size="small" :value="borderColor" @change="onColorChange"/>
26 - </template> 26 + </div>
27 </div> 27 </div>
28 </template> 28 </template>
29 29
30 <script> 30 <script>
  31 + // 盒子模型编辑器
31 import { mapState, mapActions } from 'vuex' 32 import { mapState, mapActions } from 'vuex'
32 import PositionCheckbox from './position-checkbox' 33 import PositionCheckbox from './position-checkbox'
33 export default { 34 export default {
34 - name: 'BoxModel', 35 + name: 'BoxModelEditor',
35 components: { 36 components: {
36 PositionCheckbox 37 PositionCheckbox
37 }, 38 },
@@ -79,6 +80,10 @@ @@ -79,6 +80,10 @@
79 // 取出 commonStyle.border,并更改 border.color.value 的值 80 // 取出 commonStyle.border,并更改 border.color.value 的值
80 const boxModelPartStyle = this.editingElement.commonStyle[boxModelPart] 81 const boxModelPartStyle = this.editingElement.commonStyle[boxModelPart]
81 Object.assign(boxModelPartStyle.color, { value: color }) 82 Object.assign(boxModelPartStyle.color, { value: color })
  83 + // TODO 收归style至commonStyle,而非pluginProps
  84 + if (boxModelPart === 'border') {
  85 + this.editingElement.pluginProps.borderColor = color
  86 + }
82 this.setElementPosition({ [boxModelPart]: boxModelPartStyle }) 87 this.setElementPosition({ [boxModelPart]: boxModelPartStyle })
83 } 88 }
84 } 89 }
@@ -86,21 +91,27 @@ @@ -86,21 +91,27 @@
86 </script> 91 </script>
87 92
88 <style lang='less' scoped> 93 <style lang='less' scoped>
  94 +.box-model {
  95 + margin: 8px 0;
  96 + border-top: 1px dashed #eee;
  97 + border-bottom: 1px dashed #eee;
  98 +}
89 .inline-block{ 99 .inline-block{
90 display:inline-block; 100 display:inline-block;
91 text-align: center; 101 text-align: center;
92 } 102 }
93 .common{ 103 .common{
94 .inline-block(); 104 .inline-block();
95 - background-color:rgb(15, 14, 14); 105 + background-color:#52527e;
96 &-select{ 106 &-select{
97 - background-color: rgb(170, 170, 95); 107 + background-color: #fedd9b;
98 } 108 }
99 } 109 }
100 .middle{ 110 .middle{
101 - margin:20px 0; 111 + margin:12px 0;
102 display: flex; 112 display: flex;
103 align-items: center; 113 align-items: center;
  114 + justify-content: center;
104 } 115 }
105 .margin{ 116 .margin{
106 width:150px; 117 width:150px;
@@ -124,6 +135,7 @@ @@ -124,6 +135,7 @@
124 .common() 135 .common()
125 } 136 }
126 .content{ 137 .content{
  138 + border: 1px solid #fff;
127 background-color: rgb(82, 82, 126); 139 background-color: rgb(82, 82, 126);
128 width:80%; 140 width:80%;
129 .inline-block() 141 .inline-block()
front-end/h5/src/components/core/editor/right-panel/box-model/position-checkbox.vue
@@ -3,15 +3,15 @@ @@ -3,15 +3,15 @@
3 <!-- 只有选中 padding border margin 之后才会显示 --> 3 <!-- 只有选中 padding border margin 之后才会显示 -->
4 <template v-if="boxModelPart"> 4 <template v-if="boxModelPart">
5 <div class="flex"> 5 <div class="flex">
6 - <a-checkbox @change="onCheckboxChange" :checked="isChecked"> 6 + <a-checkbox @change="onCheckboxChange" :checked="isChecked" size="small">
7 </a-checkbox> 7 </a-checkbox>
8 <div class="label">{{label}}</div> 8 <div class="label">{{label}}</div>
9 </div> 9 </div>
10 10
11 </template> 11 </template>
12 <template v-if="boxModelPart && isChecked"> 12 <template v-if="boxModelPart && isChecked">
13 - <a-input-number style="width:70px" :value="value" :min="0" @change="onInputNumberChange" />  
14 - <a-select :value="unit" style="width:70px" @change="onUnitChange"> 13 + <a-input-number style="width:70px" :value="value" :min="0" @change="onInputNumberChange" size="small" />
  14 + <a-select :value="unit" style="width:70px" @change="onUnitChange" size="small" >
15 <a-select-option v-for="(item,index) in unitList" :key="index" :value="item"> 15 <a-select-option v-for="(item,index) in unitList" :key="index" :value="item">
16 {{ item }} 16 {{ item }}
17 </a-select-option> 17 </a-select-option>
front-end/h5/src/components/core/editor/right-panel/props.js
1 import Vue from 'vue' 1 import Vue from 'vue'
2 import { mapState, mapActions } from 'vuex' 2 import { mapState, mapActions } from 'vuex'
3 -import BoxModel from './box-model' 3 +import BoxModelEditor from './box-model'
4 import { getVM, getComponentsForPropsEditor } from '@/utils/element' 4 import { getVM, getComponentsForPropsEditor } from '@/utils/element'
5 import 'core/styles/props-config-panel.scss' 5 import 'core/styles/props-config-panel.scss'
6 6
7 export default { 7 export default {
8 name: 'RightPanelProps', 8 name: 'RightPanelProps',
9 components: { 9 components: {
10 - BoxModel 10 + BoxModelEditor
11 }, 11 },
12 data: () => ({ 12 data: () => ({
13 loadCustomEditorFlag: false, 13 loadCustomEditorFlag: false,
14 editorPositionConfig: [ 14 editorPositionConfig: [
15 - { type: 'a-input', label: 'top', key: 'top' },  
16 - { type: 'a-input', label: 'left', key: 'left' },  
17 - { type: 'a-input', label: 'width', key: 'width' },  
18 - { type: 'a-input', label: 'height', key: 'height' } 15 + { type: 'a-input-number', label: '上', key: 'top' },
  16 + { type: 'a-input-number', label: '左', key: 'left' },
  17 + { type: 'a-input-number', label: '宽', key: 'width' },
  18 + { type: 'a-input-number', label: '高', key: 'height' }
19 ] 19 ]
20 }), 20 }),
21 props: { 21 props: {
@@ -129,7 +129,7 @@ export default { @@ -129,7 +129,7 @@ export default {
129 * 设置当前编辑元素的位置,通过 key 值(width,height,left,top)来控制更新相应的位置 129 * 设置当前编辑元素的位置,通过 key 值(width,height,left,top)来控制更新相应的位置
130 * 在显示层已经通过 this.stateEditingElement 来控制是否选中编辑组件了 130 * 在显示层已经通过 this.stateEditingElement 来控制是否选中编辑组件了
131 */ 131 */
132 - onPositionChange (value, key) { 132 + onPositionChange (key, value) {
133 this.setElementPosition({ 133 this.setElementPosition({
134 [key]: Number(value) 134 [key]: Number(value)
135 }) 135 })
@@ -140,74 +140,81 @@ export default { @@ -140,74 +140,81 @@ export default {
140 renderEditorPositionConfig (h) { 140 renderEditorPositionConfig (h) {
141 const _this = this 141 const _this = this
142 const commonStyle = this.editingElement.commonStyle 142 const commonStyle = this.editingElement.commonStyle
143 - return this.editorPositionConfig.map(item => {  
144 - const { type, label, key } = item  
145 - const data = {  
146 - props: {  
147 - placeholder: `请输入${key}`  
148 - },  
149 - domProps: {  
150 - value: commonStyle[key]  
151 - },  
152 - on: {  
153 - change (e) {  
154 - let value  
155 - switch (type) {  
156 - case 'a-input':  
157 - value = e.target.value  
158 - break 143 + return <a-form layout="inline">
  144 + {
  145 + this.editorPositionConfig.map(item => {
  146 + const { type, label, key } = item
  147 + console.log(key, commonStyle)
  148 + const data = {
  149 + props: {
  150 + value: commonStyle[key],
  151 + placeholder: `请输入${key}`,
  152 + formatter: value => `${label} ${value}`,
  153 + size: 'small'
  154 + },
  155 + on: {
  156 + change (e) {
  157 + const value = e.target ? e.target.value : e
  158 + _this.onPositionChange(key, value)
  159 + }
159 } 160 }
160 - _this.onPositionChange(value, key)  
161 } 161 }
162 - } 162 + return (
  163 + <a-form-item>
  164 + {
  165 + h(type, data)
  166 + }
  167 + </a-form-item>
  168 + )
  169 + })
163 } 170 }
164 - return (  
165 - <a-form-item label={label} label-col={ { span: 6 } } wrapperCol={{ span: 16 }}>  
166 - {  
167 - h(type, data)  
168 - }  
169 - </a-form-item>  
170 - )  
171 - }) 171 + </a-form>
172 }, 172 },
173 renderPropsEditorPanel (h, editingElement) { 173 renderPropsEditorPanel (h, editingElement) {
174 const vm = getVM(editingElement.name) 174 const vm = getVM(editingElement.name)
175 const props = vm.$options.props 175 const props = vm.$options.props
176 return ( 176 return (
177 - <a-form  
178 - ref="form"  
179 - size="mini"  
180 - class="props-config-form"  
181 - layout={this.layout}  
182 - >  
183 - {/* left,top,width,height编辑 只有在选中编辑组件的时候显示 */} 177 + <div>
  178 + <a-collapse bordered={true} expand-icon-position="right">
  179 + <a-collapse-panel key="1" header="通用样式">
  180 + {/* left,top,width,height编辑 只有在选中编辑组件的时候显示 */}
  181 + {
  182 + this.stateEditingElement ? this.renderEditorPositionConfig(h) : ''
  183 + }
  184 + {/* margin、padding编辑 */}
  185 + <BoxModelEditor />
  186 + </a-collapse-panel>
  187 + </a-collapse>
  188 + <a-form
  189 + ref="form"
  190 + size="mini"
  191 + class="props-config-form"
  192 + layout={this.layout}
  193 + >
  194 +
184 { 195 {
185 - this.stateEditingElement ? this.renderEditorPositionConfig(h) : ''  
186 - }  
187 - {/* margin、padding编辑 */}  
188 - <BoxModel />  
189 - {  
190 - // plugin-custom-editor  
191 - this.loadCustomEditorFlag &&  
192 - h(this.customEditorName, {  
193 - props: {  
194 - elementProps: editingElement.pluginProps  
195 - }  
196 - })  
197 - }  
198 - {  
199 - Object  
200 - .entries(props)  
201 - .filter(([propKey, propConfig]) => {  
202 - // 1. 如果开发者给 某个prop 显式指定了 visible 属性,则取开发者指定的值;  
203 - // 2. 否则取默认值:true,即默认在属性面板显示该属性  
204 - // 3. 组件的某些属性是不需要显示在 配置编辑器的,比如:editorMode(编辑模式/预览模式),因为这个是鲁班编辑器默认注入到每个组件的,无须显示出来  
205 - const isVisible = propConfig.hasOwnProperty('visible') ? propConfig.visible : true  
206 - return isVisible && propConfig.editor && !propConfig.editor.custom 196 + // plugin-custom-editor
  197 + this.loadCustomEditorFlag &&
  198 + h(this.customEditorName, {
  199 + props: {
  200 + elementProps: editingElement.pluginProps
  201 + }
207 }) 202 })
208 - .map(([propKey, propConfig]) => this.renderPropFormItem(h, { propKey, propConfig }))  
209 - }  
210 - </a-form> 203 + }
  204 + {
  205 + Object
  206 + .entries(props)
  207 + .filter(([propKey, propConfig]) => {
  208 + // 1. 如果开发者给 某个prop 显式指定了 visible 属性,则取开发者指定的值;
  209 + // 2. 否则取默认值:true,即默认在属性面板显示该属性
  210 + // 3. 组件的某些属性是不需要显示在 配置编辑器的,比如:editorMode(编辑模式/预览模式),因为这个是鲁班编辑器默认注入到每个组件的,无须显示出来
  211 + const isVisible = propConfig.hasOwnProperty('visible') ? propConfig.visible : true
  212 + return isVisible && propConfig.editor && !propConfig.editor.custom
  213 + })
  214 + .map(([propKey, propConfig]) => this.renderPropFormItem(h, { propKey, propConfig }))
  215 + }
  216 + </a-form>
  217 + </div>
211 ) 218 )
212 }, 219 },
213 renderWorkGlobalPropsPanel (h) { 220 renderWorkGlobalPropsPanel (h) {
front-end/h5/src/components/core/models/element.js
@@ -101,7 +101,7 @@ class Element { @@ -101,7 +101,7 @@ class Element {
101 101
102 getCommonStyle (ele) { 102 getCommonStyle (ele) {
103 if (typeof ele.commonStyle === 'object') { 103 if (typeof ele.commonStyle === 'object') {
104 - return cloneObj(ele.commonStyle) 104 + return cloneObj({ ...defaultStyle, ...ele.commonStyle })
105 } 105 }
106 return { 106 return {
107 ...defaultStyle, 107 ...defaultStyle,
@@ -167,7 +167,11 @@ class Element { @@ -167,7 +167,11 @@ class Element {
167 const commonStyle = this.commonStyle 167 const commonStyle = this.commonStyle
168 const { margin, padding } = commonStyle 168 const { margin, padding } = commonStyle
169 // 由于在 defaultStyle 定义的时候是对象,这里需要将数据重新组装成 margin-top 这种形式 169 // 由于在 defaultStyle 定义的时候是对象,这里需要将数据重新组装成 margin-top 这种形式
170 - const boxModel = { ...this.packPosData(margin, 'margin'), ...this.packPosData(padding, 'padding'), ...this.packBorderData() } 170 + const boxModel = {
  171 + ...this.packPosData(margin, 'margin'),
  172 + ...this.packPosData(padding, 'padding'),
  173 + ...this.packBorderData()
  174 + }
171 let style = { 175 let style = {
172 top: parsePx(pluginProps.top || commonStyle.top, isRem), 176 top: parsePx(pluginProps.top || commonStyle.top, isRem),
173 left: parsePx(pluginProps.left || commonStyle.left, isRem), 177 left: parsePx(pluginProps.left || commonStyle.left, isRem),