merge master

pull/9/head
wangxueliang 7 years ago
commit 78da34587d

@ -27,15 +27,23 @@ export default {
value: [String, Number, Boolean], value: [String, Number, Boolean],
name: String, name: String,
indeterminate: Boolean, indeterminate: Boolean,
onGroupChange: Function,
}, },
model: { model: {
prop: 'checked', prop: 'checked',
}, },
inject: {
context: { default: undefined },
},
data () { data () {
const { checked, defaultChecked } = this const { context, checked, defaultChecked, value } = this
let stateChecked
if (context && context.checkedStatus) {
stateChecked = context.checkedStatus.has(value)
}
return { return {
stateChecked: checked === undefined ? defaultChecked : checked, stateChecked: stateChecked === undefined
? checked === undefined ? defaultChecked : checked
: stateChecked,
} }
}, },
computed: { computed: {
@ -64,26 +72,27 @@ export default {
handleChange (event) { handleChange (event) {
const targetChecked = event.target.checked const targetChecked = event.target.checked
this.$emit('input', targetChecked) this.$emit('input', targetChecked)
const { name, value, checked } = this const { name, value, checked, context, stateChecked } = this
if (checked === undefined) { if ((checked === undefined && !context) || (context && context.value === undefined)) {
this.stateChecked = targetChecked this.stateChecked = targetChecked
} }
const target = { const target = {
name, name,
value, value,
checked: targetChecked, checked: !stateChecked,
} }
this.$emit('change', { if (this.context) {
target, this.context.handleChange({ target })
stopPropagation () { } else {
event.stopPropagation() this.$emit('change', {
}, target,
preventDefault () { stopPropagation () {
event.preventDefault() event.stopPropagation()
}, },
}) preventDefault () {
if (this.isGroup) { event.preventDefault()
this.onGroupChange({ target }) },
})
} }
}, },
}, },
@ -91,6 +100,9 @@ export default {
checked (val) { checked (val) {
this.stateChecked = val this.stateChecked = val
}, },
'context.checkedStatus': function (checkedStatus) {
this.stateChecked = checkedStatus.has(this.value)
},
}, },
} }
</script> </script>

@ -31,6 +31,11 @@ export default {
model: { model: {
prop: 'value', prop: 'value',
}, },
provide () {
return {
context: this,
}
},
data () { data () {
const { value, defaultValue } = this const { value, defaultValue } = this
return { return {
@ -50,9 +55,6 @@ export default {
}) })
}, },
}, },
created () {
this.setChildCheckbox(this.$slots.default)
},
methods: { methods: {
handleChange (event) { handleChange (event) {
const target = event.target const target = event.target
@ -73,31 +75,12 @@ export default {
this.$emit('input', newVal) this.$emit('input', newVal)
this.$emit('change', newVal) this.$emit('change', newVal)
}, },
setChildCheckbox (children = []) {
const { options, $slots, checkedStatus } = this
if (options.length === 0 && $slots.default) {
children.forEach(({ componentOptions = {}, children: newChildren }) => {
const { Ctor, propsData } = componentOptions
if (Ctor && Ctor.options.name === 'Checkbox') {
propsData.isGroup = true
propsData.onGroupChange = this.handleChange
propsData.checked = checkedStatus.has(propsData.value)
} else {
this.setChildCheckbox(newChildren)
}
}, this)
}
},
}, },
mounted () { mounted () {
}, },
beforeUpdate () {
this.setChildCheckbox(this.$slots.default)
},
watch: { watch: {
value (val) { value (val) {
this.stateValue = val this.stateValue = val
this.setChildCheckbox(this.$slots.default)
}, },
}, },
components: { components: {

@ -1,18 +1,62 @@
<template> <template>
<div> <div>
<Checkbox @change="onChange">Checkbox</Checkbox> <p :style="{ marginBottom: '20px' }">
<Checkbox
:checked="checked"
:disabled="disabled"
@change="onChange"
>
{{label}}
</Checkbox>
</p>
<p>
<AntButton
type="primary"
size="small"
@click="toggleChecked"
>
{{!checked ? 'Check' : 'Uncheck'}}
</AntButton>
<AntButton
:style="{ marginLeft: '10px' }"
type="primary"
size="small"
@click="toggleDisable"
>
{{!disabled ? 'Disable' : 'Enable'}}
</AntButton>
</p>
</div> </div>
</template> </template>
<script> <script>
import { Checkbox } from 'antd' import { Checkbox, Button } from 'antd'
export default { export default {
data () {
return {
checked: true,
disabled: false,
}
},
computed: {
label () {
const { checked, disabled } = this
return `${checked ? 'Checked' : 'Unchecked'}-${disabled ? 'Disabled' : 'Enabled'}`
},
},
methods: { methods: {
toggleChecked () {
this.checked = !this.checked
},
toggleDisable () {
this.disabled = !this.disabled
},
onChange (e) { onChange (e) {
console.log(`checked = ${e.target.checked}`) this.checked = e.target.checked
}, },
}, },
components: { components: {
Checkbox, Checkbox,
AntButton: Button,
}, },
} }
</script> </script>

@ -4,7 +4,7 @@
<br /> <br />
<CheckboxGroup :options="plainOptions" :defaultValue="['Apple']" @change="onChange" /> <CheckboxGroup :options="plainOptions" :defaultValue="['Apple']" @change="onChange" />
<br /> <br />
<CheckboxGroup :options="options" :defaultValue="['Pear']" @change="onChange" /> <CheckboxGroup :options="options" :value="['Pear']" @change="onChange" />
<br /> <br />
<CheckboxGroup :options="optionsWithDisabled" disabled :defaultValue="['Apple']" @change="onChange" /> <CheckboxGroup :options="optionsWithDisabled" disabled :defaultValue="['Apple']" @change="onChange" />
</div> </div>

@ -0,0 +1,35 @@
<template>
<div>
<h1>Basic</h1>
<Basic />
<h1>CheckAll</h1>
<CheckAll />
<h1>Controller</h1>
<Controller />
<h1>Disabled</h1>
<Disabled />
<h1>Group</h1>
<Group />
<h1>Layout</h1>
<Layout />
</div>
</template>
<script>
import Basic from './basic'
import CheckAll from './check-all'
import Controller from './controller'
import Disabled from './disabled'
import Group from './group'
import Layout from './layout'
export default {
components: {
Basic,
CheckAll,
Disabled,
Controller,
Group,
Layout,
},
}
</script>

@ -1,18 +1,27 @@
<template> <template>
<div> <CheckboxGroup @change="onChange">
<Checkbox @change="onChange">Checkbox</Checkbox> <Row>
</div> <Col :span="8"><Checkbox value="A">A</Checkbox></Col>
<Col :span="8"><Checkbox value="B">B</Checkbox></Col>
<Col :span="8"><Checkbox value="C">C</Checkbox></Col>
<Col :span="8"><Checkbox value="D">D</Checkbox></Col>
<Col :span="8"><Checkbox value="E">E</Checkbox></Col>
</Row>
</CheckboxGroup>
</template> </template>
<script> <script>
import { Checkbox } from 'antd' import { Checkbox, Row, Col } from 'antd'
export default { export default {
methods: { methods: {
onChange (e) { onChange (checkedValues) {
console.log(`checked = ${e.target.checked}`) console.log('checked = ', checkedValues)
}, },
}, },
components: { components: {
Checkbox, Checkbox,
Row,
Col,
CheckboxGroup: Checkbox.Group,
}, },
} }
</script> </script>

@ -13,3 +13,7 @@ export { default as Rate } from './rate'
export { default as ToolTip } from './tooltip' export { default as ToolTip } from './tooltip'
export { default as Pagination } from './pagination' export { default as Pagination } from './pagination'
export { default as Row } from './grid/row'
export { default as Col } from './grid/col'

@ -2,3 +2,4 @@ import './button/style'
import './icon/style' import './icon/style'
import './radio/style' import './radio/style'
import './checkbox/style' import './checkbox/style'
import './grid/style'

@ -2,19 +2,37 @@
<div> <div>
<tool-tip <tool-tip
placement="top" placement="top"
:title="showText"> :title="showText"
<h1 @click="boom" style="display: inline-block">This is just a test, put your cursor here</h1> :autoAdjustOverflow="autoAdjustOverflow"
>
<h1 @click="boom" class="test">撞到边缘翻转位置 & 点击更新</h1>
</tool-tip> </tool-tip>
<ant-button>{{showText}}</ant-button> <ant-button @click="reverse" type="primary">{{autoAdjustOverflow ? '启用' : '关闭'}}自动调整中</ant-button>
<div class="box"> <div class="box">
<h2>切换arrowPointAtCenter模式</h2>
<ant-button @click="change">{{arrowPointAtCenter}}</ant-button>
<table> <table>
<tr v-for="(tr, index) in table" :key="index"> <tr v-for="(tr, index) in table" :key="index">
<td v-for="(td, i) in tr" :key="i"> <td v-for="(td, i) in tr" :key="i">
<tool-tip v-if="td" :placement="td" :title="td"><AntButton type="primary">{{td}}</AntButton></tool-tip> <tool-tip
v-if="td"
:placement="td"
:title="td"
:arrowPointAtCenter="arrowPointAtCenter"
>
<AntButton type="primary">{{td}}</AntButton>
</tool-tip>
</td> </td>
</tr> </tr>
</table> </table>
</div> </div>
<div>
<p>
<tool-tip :arrowPointAtCenter="true" title="Consider using the NamedModulesPlugin for module names." placement="topLeft">
<ant-button>arrowPointAtCenter arrowPointAtCenter arrowPointAtCenter</ant-button>
</tool-tip>
</p>
</div>
</div> </div>
</template> </template>
@ -33,7 +51,9 @@
['left', '', '', '', 'right'], ['left', '', '', '', 'right'],
['leftBottom', '', '', '', 'rightBottom'], ['leftBottom', '', '', '', 'rightBottom'],
['', 'bottomLeft', 'bottom', 'bottomRight', ''], ['', 'bottomLeft', 'bottom', 'bottomRight', ''],
] ],
arrowPointAtCenter: false,
autoAdjustOverflow: true,
} }
}, },
methods: { methods: {
@ -43,6 +63,12 @@
} else { } else {
this.showText += ' ' this.showText += ' '
} }
},
change() {
this.arrowPointAtCenter = !this.arrowPointAtCenter
},
reverse() {
this.autoAdjustOverflow = !this.autoAdjustOverflow
} }
}, },
components: { components: {
@ -52,6 +78,10 @@
} }
</script> </script>
<style scoped lang="less"> <style scoped lang="less">
.test {
margin: 20px;
display: inline-block;
}
.box { .box {
margin: 100px; margin: 100px;
} }

@ -34,6 +34,8 @@ export default {
left: 0, left: 0,
top: 0, top: 0,
realPlacement: this.placement, realPlacement: this.placement,
t1: null,
t2: null,
} }
}, },
computed: { computed: {
@ -72,13 +74,30 @@ export default {
top: 0, top: 0,
} }
}, },
methods: {
hideSelf (e) {
if (that.t1) {
clearTimeout(that.t1)
that.t1 = null
}
if (that.mouseLeaveDelay) {
that.t2 = window.setTimeout(() => {
if (e.relatedTarget === that.$el) {
return
}
that.visible = false
}, +that.mouseLeaveDelay * 1e3)
}
},
},
render (h) { render (h) {
return ( return (
<transition name='zoom-big'> <transition name={that.transitionName}>
<div <div
v-show={that.visible} v-show={that.visible}
class={`ant-tooltip ant-tooltip-placement-${that.realPlacement}`} class={`ant-tooltip ant-tooltip-placement-${that.realPlacement}`}
style={{ left: this.left + 'px', top: this.top + 'px' }} style={{ left: this.left + 'px', top: this.top + 'px' }}
onMouseleave={this.hideSelf}
> >
<div class='ant-tooltip-content'> <div class='ant-tooltip-content'>
<div class='ant-tooltip-arrow'/> <div class='ant-tooltip-arrow'/>
@ -127,29 +146,36 @@ export default {
return old === fn ? old : [old, fn] return old === fn ? old : [old, fn]
} }
}, },
computeOffset (popup, text, placement) { computeOffset (popup, text, placement, scale) {
let { width, height, top, left } = text let { width, height, top, left } = text
// you cant change the properties of DOMRect // you cant change the properties of DOMRect
top += window.scrollY top += window.scrollY
left += window.scrollX left += window.scrollX
// FIXME: we can get the numbers from scale, but that's not what we really want
const p = { width: popup.width / scale, height: popup.height / scale }
const ret = { left, top } const ret = { left, top }
if (/top/.test(placement)) ret.top -= popup.height + 5 if (/top/.test(placement)) ret.top -= p.height
if (/bottom/.test(placement)) ret.top += height + 5 if (/bottom/.test(placement)) ret.top += height
if (/left/.test(placement)) ret.left -= popup.width + 10 if (/left/.test(placement)) ret.left -= p.width
if (/right/.test(placement)) ret.left += width + 5 if (/right/.test(placement)) ret.left += width
// FIXME: magic number 20 & 14 comes from the offset of triangle
if (/Left/.test(placement)) { if (/Left/.test(placement)) {
if (this.arrowPointAtCenter) ret.left += width / 2 - 20
} else if (/Right/.test(placement)) { } else if (/Right/.test(placement)) {
ret.left += (width - popup.width) ret.left += (width - p.width)
if (this.arrowPointAtCenter) ret.left -= width / 2 - 20
} else if (/(top)|(bottom)/.test(placement)) { } else if (/(top)|(bottom)/.test(placement)) {
ret.left += (width - popup.width) / 2 ret.left += (width - p.width) / 2
} }
if (/Top/.test(placement)) { if (/Top/.test(placement)) {
if (this.arrowPointAtCenter) ret.top += height / 2 - 14
} else if (/Bottom/.test(placement)) { } else if (/Bottom/.test(placement)) {
ret.top += (height - popup.height) ret.top += (height - p.height)
if (this.arrowPointAtCenter) ret.top -= height / 2 - 14
} else if (/(left)|(right)/.test(placement)) { } else if (/(left)|(right)/.test(placement)) {
ret.top += (height - popup.height) / 2 ret.top += (height - p.height) / 2
} }
return ret return ret
}, },
@ -158,34 +184,62 @@ export default {
this.visible = true this.visible = true
this.$nextTick(() => { this.$nextTick(() => {
const popup = this.vnode.$el.getBoundingClientRect() const popup = this.vnode.$el.getBoundingClientRect()
const [, scale = 1] = window.getComputedStyle(this.vnode.$el).transform.match(/matrix\((.*?),/) || []
const content = this.$el.getBoundingClientRect() const content = this.$el.getBoundingClientRect()
const place = this.checkPosition(popup, content, this.placement) const place = this.autoAdjustOverflow ? this.checkPosition(popup, content, this.placement, scale) : this.placement
this.realPlacement = place this.realPlacement = place
const { left, top } = this.computeOffset(popup, content, place) const { left, top } = this.computeOffset(popup, content, place, scale)
this.vnode.left = left this.vnode.left = left
this.vnode.top = top this.vnode.top = top
}) })
this.onPopupAlign(this.realPlacement, this.$el, this.vnode.$el, { offset: [0, 0] }) this.onPopupAlign(this.realPlacement, this.$el, this.vnode.$el, { offset: [0, 0] })
}) })
}, },
hideNode () { hideNode (e) {
if (!this.vnode) return
if (e.relatedTarget === this.vnode.$el) {
return
}
this.visible = false this.visible = false
}, },
checkShow (e) {
if (this.t2) {
clearTimeout(this.t2)
this.t2 = null
}
if (this.mouseEnterDelay) {
this.t1 = window.setTimeout(() => {
this.showNode(e)
}, +this.mouseEnterDelay * 1e3)
}
},
checkHide (e) {
if (this.t1) {
clearTimeout(this.t1)
this.t1 = null
}
if (this.mouseLeaveDelay) {
this.t2 = window.setTimeout(() => {
this.hideNode(e)
}, +this.mouseLeaveDelay * 1e3)
}
},
}, },
render (h) { render (h) {
const inner = this.$slots.default[0] const inner = this.$slots.default[0]
inner.data = inner.data || {} inner.data = inner.data || {}
inner.data.on = inner.data.on || {} inner.data.on = inner.data.on || {}
inner.data.on.mouseenter = this.addEventHandle(inner.data.on.mouseenter, this.showNode) inner.data.on.mouseenter = this.addEventHandle(inner.data.on.mouseenter, this.checkShow)
inner.data.on.mouseleave = this.addEventHandle(inner.data.on.mouseleave, this.hideNode) inner.data.on.mouseleave = this.addEventHandle(inner.data.on.mouseleave, this.checkHide)
return this.$slots.default[0] return this.$slots.default[0]
}, },
updated () { updated () {
if (!this.vnode) return if (!this.vnode) return
const popup = this.vnode.$el.getBoundingClientRect() const popup = this.vnode.$el.getBoundingClientRect()
const [, scale = 1] = window.getComputedStyle(this.vnode.$el).transform.match(/matrix\((.*?),/) || []
const content = this.$el.getBoundingClientRect() const content = this.$el.getBoundingClientRect()
const { left, top } = this.computeOffset(popup, content, this.realPlacement) const { left, top } = this.computeOffset(popup, content, this.realPlacement, scale)
this.vnode.left = left this.vnode.left = left
this.vnode.top = top this.vnode.top = top
}, },

Loading…
Cancel
Save