Skip to content

Commit 6eb308f

Browse files
committed
feat(plugin): form radio
1 parent 270b4a2 commit 6eb308f

File tree

6 files changed

+400
-0
lines changed

6 files changed

+400
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
export default {
2+
text: {
3+
type: 'a-input',
4+
label: '按钮文字',
5+
require: true,
6+
defaultPropValue: '按钮'
7+
},
8+
fontSize: {
9+
type: 'a-input-number',
10+
label: '字号(px)',
11+
require: true,
12+
prop: {
13+
step: 1,
14+
min: 12,
15+
max: 144
16+
},
17+
defaultPropValue: 14
18+
},
19+
color: {
20+
type: 'a-input',
21+
label: '文字颜色',
22+
// !#zh 为编辑组件指定 prop
23+
prop: {
24+
type: 'color'
25+
},
26+
require: true,
27+
defaultPropValue: 'black'
28+
},
29+
backgroundColor: {
30+
type: 'a-input', // lbs-color-picker
31+
label: '背景颜色',
32+
prop: {
33+
type: 'color'
34+
},
35+
require: true,
36+
defaultPropValue: '#ffffff' // TODO why logogram for color does't work?
37+
},
38+
borderColor: {
39+
type: 'a-input', // lbs-color-picker
40+
label: '边框颜色',
41+
prop: {
42+
type: 'color'
43+
},
44+
require: true,
45+
defaultPropValue: '#eeeeee'
46+
},
47+
borderWidth: {
48+
type: 'a-input-number',
49+
label: '边框宽度(px)',
50+
require: true,
51+
prop: {
52+
step: 1,
53+
min: 1,
54+
max: 10
55+
},
56+
defaultPropValue: 1
57+
},
58+
borderRadius: {
59+
type: 'a-input-number',
60+
label: '圆角(px)',
61+
require: true,
62+
prop: {
63+
step: 0.1,
64+
min: 0,
65+
max: 10
66+
},
67+
defaultPropValue: 0
68+
},
69+
lineHeight: {
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+
defaultPropValue: 1
79+
}
80+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
export default {
2+
text: {
3+
type: String,
4+
default: '按钮'
5+
},
6+
type: {
7+
type: String,
8+
default: 'radio'
9+
},
10+
placeholder: {
11+
type: String,
12+
default: '请填写提示文字'
13+
},
14+
required: {
15+
type: Boolean,
16+
default: false
17+
},
18+
vertical: {
19+
type: Boolean,
20+
default: false
21+
},
22+
backgroundColor: {
23+
type: String,
24+
default: 'transparent'
25+
},
26+
color: {
27+
type: String,
28+
default: 'black'
29+
},
30+
fontSize: {
31+
type: Number,
32+
default: 14
33+
},
34+
lineHeight: {
35+
type: Number,
36+
default: 1
37+
},
38+
borderWidth: {
39+
type: Number,
40+
default: 1
41+
},
42+
borderRadius: {
43+
type: Number,
44+
default: 0
45+
},
46+
borderColor: {
47+
type: String,
48+
default: '#ced4da'
49+
},
50+
textAlign: {
51+
type: String,
52+
default: 'center'
53+
}
54+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,124 @@
1+
import LbpFormRadio from './lbp-form-radio.js'
2+
3+
const defaultItems = [
4+
{
5+
value: '选项A-value'
6+
},
7+
{
8+
value: '选项B-value'
9+
},
10+
{
11+
value: '选项C-value'
12+
}
13+
]
14+
15+
export default {
16+
name: 'lbp-form-radio-group',
17+
components: {
18+
LbpFormRadio
19+
},
20+
props: {
21+
aliasName: {
22+
type: String,
23+
default: '标题演示'
24+
},
25+
items: {
26+
type: Array,
27+
default: () => defaultItems
28+
}
29+
},
30+
data: () => ({
31+
value: undefined,
32+
uuid: undefined
33+
}),
34+
editorConfig: {
35+
propsConfig: {
36+
items: {
37+
type: 'lbs-form-radio-items-editor',
38+
label: '选项列表',
39+
require: true,
40+
defaultPropValue: defaultItems
41+
},
42+
aliasName: {
43+
type: 'a-input',
44+
label: '填写标题',
45+
require: true,
46+
defaultPropValue: '标题演示'
47+
}
48+
},
49+
components: {
50+
'lbs-form-radio-items-editor': {
51+
render () {
52+
return <div>
53+
{
54+
this.value_.map((item, index) => (
55+
<div>
56+
<a-input value={item.value} onChange={e => { item.value = e.target.value }}></a-input>
57+
<a-button type="dashed" shape="circle" icon="plus" onClick={this.add} />
58+
<a-button type="dashed" shape="circle" icon="minus" onClick={(item, index) => this.minus(item, index)} />
59+
</div>
60+
))
61+
}
62+
</div>
63+
},
64+
props: {
65+
value: {
66+
type: Array,
67+
default: () => defaultItems
68+
}
69+
},
70+
computed: {
71+
value_: {
72+
get () {
73+
return this.value
74+
},
75+
set (val) {
76+
this.$emit('input', val)
77+
}
78+
}
79+
},
80+
methods: {
81+
add () {
82+
console.log(this.value_.length)
83+
this.$emit('change', [
84+
...this.value_,
85+
{
86+
value: `选项${this.value_.length + 1}-value`,
87+
label: `选项${this.value_.length + 1}-label`
88+
}
89+
])
90+
},
91+
minus (item, index) {
92+
const items = this.value_.slice(0)
93+
items.splice(index, 1)
94+
this.$emit('change', items)
95+
}
96+
}
97+
}
98+
}
99+
},
100+
mounted () {
101+
this.uuid = this.$el.dataset.uuid
102+
},
103+
render () {
104+
return (
105+
<div>
106+
<h3>{this.aliasName}</h3>
107+
<input type="text" hidden value={this.value} data-type="lbp-form-input" data-uuid={this.uuid} />
108+
{
109+
this.items.map(item => (
110+
<lbp-form-radio
111+
vertical
112+
value={item.value}
113+
checked={this.value === item.value}
114+
aliasName={this.aliasName}
115+
onChange={e => {
116+
this.value = e
117+
}}
118+
>{item.value}</lbp-form-radio>
119+
))
120+
}
121+
</div>
122+
)
123+
}
124+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
import './styles/radio.scss'
2+
import commonProps from './common/props.js'
3+
import editorConfigForProps from './common/editor-config-for-configurable-props.js'
4+
5+
export default {
6+
name: 'lbp-form-radio',
7+
props: {
8+
...commonProps,
9+
value: {
10+
type: [String, Number],
11+
default: '标题演示'
12+
},
13+
aliasName: {
14+
type: String,
15+
default: '标题演示'
16+
},
17+
checked: {
18+
type: Boolean,
19+
default: false
20+
},
21+
onFocus: {
22+
type: Function,
23+
default: () => {}
24+
},
25+
onClick: {
26+
type: Function,
27+
default: () => {}
28+
},
29+
onBlur: {
30+
type: Function,
31+
default: () => {}
32+
}
33+
},
34+
editorConfig: {
35+
propsConfig: {
36+
...editorConfigForProps
37+
}
38+
},
39+
methods: {
40+
handleChange (e) {
41+
if (this.disabled) return
42+
this.$emit('change', e.target.value)
43+
}
44+
},
45+
render () {
46+
const {
47+
color,
48+
textAlign,
49+
backgroundColor,
50+
fontSize,
51+
lineHeight,
52+
borderColor,
53+
borderRadius,
54+
borderWidth,
55+
aliasName,
56+
id,
57+
type,
58+
// readOnly, // ?
59+
disabled,
60+
// tabIndex, // ?
61+
checked,
62+
// autoFocus,
63+
value,
64+
vertical
65+
} = this
66+
67+
const style = {
68+
color,
69+
textAlign,
70+
backgroundColor,
71+
fontSize: fontSize,
72+
lineHeight: lineHeight + 'em',
73+
borderColor,
74+
borderRadius: borderRadius + 'px',
75+
borderWidth: borderWidth + 'px',
76+
textDecoration: 'none',
77+
display: vertical ? 'block' : 'inline-block'
78+
}
79+
return (
80+
<label role="radio" tabindex="0" class="lbp-radio" style={style} aria-checked="true">
81+
<input
82+
name={aliasName}
83+
id={id}
84+
type={type}
85+
ref="input"
86+
value={value}
87+
disabled={disabled}
88+
checked={!!checked}
89+
onChange={this.handleChange}
90+
// readOnly={readOnly}
91+
// tabIndex={tabIndex}
92+
// className={`${prefixCls}-input`}
93+
// onClick={this.onClick}
94+
// onFocus={this.onFocus}
95+
// onBlur={this.onBlur}
96+
// onInput={this.onInput}
97+
// autoFocus={autoFocus}
98+
// data-type="lbp-form-input"
99+
// {...globalProps}
100+
/>
101+
<span><slot>{value}</slot></span>
102+
</label>
103+
)
104+
}
105+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
.lbp-radio {
2+
input[type=checkbox],
3+
input[type=radio] {
4+
5+
width: 16px;
6+
height: 16px;
7+
8+
vertical-align: middle;
9+
margin: 5px;
10+
box-sizing: border-box;
11+
12+
resize: none;
13+
overflow: hidden;
14+
line-height: 120%;
15+
display: inline-block!important;
16+
17+
box-shadow: inherit;
18+
border: 1px solid #ccd5db;
19+
padding: 6px;
20+
outline: none!important;
21+
}
22+
}

0 commit comments

Comments
 (0)