129 lines
3.3 KiB
Vue
129 lines
3.3 KiB
Vue
<template>
|
|
<span :class="badgeComputedCls.badgeCls">
|
|
<template v-if="isStatusBadge">
|
|
<span :class="badgeComputedCls.statusCls"></span>
|
|
<span :class="[prefixCls+'-status-text']">{{text}}</span>
|
|
</template>
|
|
<template v-else>
|
|
<slot></slot><transition appear :name="transitionName">
|
|
<scroll-number
|
|
v-if="!badgeStatus.isHidden"
|
|
:prefixCls="scrollNumberPrefixCls"
|
|
:className="badgeComputedCls.scrollNumberCls"
|
|
:count="badgeStatus.stateCount"
|
|
:titleNumber="count"
|
|
:styleNumber="styles"
|
|
>
|
|
</scroll-number>
|
|
</transition>
|
|
<span
|
|
v-if="!badgeStatus.isHidden && text"
|
|
:class="[prefixCls+'-status-text']">
|
|
{{text}}
|
|
</span>
|
|
</template>
|
|
</span>
|
|
</template>
|
|
<script>
|
|
import Icon from '../icon'
|
|
import ScrollNumber from './ScrollNumber'
|
|
|
|
export default {
|
|
name: 'Badge',
|
|
props: {
|
|
prefixCls: {
|
|
type: String,
|
|
default: 'ant-badge',
|
|
},
|
|
scrollNumberPrefixCls: {
|
|
type: String,
|
|
default: 'ant-scroll-number',
|
|
},
|
|
count: {
|
|
type: [Number, String],
|
|
},
|
|
overflowCount: {
|
|
type: [Number, String],
|
|
default: 99,
|
|
},
|
|
showZero: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
dot: {
|
|
type: Boolean,
|
|
default: false,
|
|
},
|
|
status: {
|
|
validator: (val) => {
|
|
if (!val) return true
|
|
return ['success', 'processing', 'default', 'error', 'warning'].includes(val)
|
|
},
|
|
default: '',
|
|
},
|
|
text: {
|
|
type: String,
|
|
default: '',
|
|
},
|
|
styles: {
|
|
type: Object,
|
|
default: () => ({}),
|
|
},
|
|
},
|
|
data () {
|
|
const { prefixCls, $slots } = this
|
|
const isHasDefaultSlot = $slots && !!$slots.default
|
|
return {
|
|
isHasDefaultSlot,
|
|
transitionName: isHasDefaultSlot ? `${prefixCls}-zoom` : '',
|
|
}
|
|
},
|
|
computed: {
|
|
isStatusBadge () {
|
|
const { isHasDefaultSlot, status } = this
|
|
return !isHasDefaultSlot && status
|
|
},
|
|
badgeComputedCls () {
|
|
const { prefixCls, isHasDefaultSlot, status, dot, count } = this
|
|
const isDot = dot || status
|
|
return {
|
|
badgeCls: {
|
|
[`${prefixCls}`]: true,
|
|
[`${prefixCls}-status`]: !!status,
|
|
[`${prefixCls}-not-a-wrapper`]: !isHasDefaultSlot,
|
|
},
|
|
statusCls: {
|
|
[`${prefixCls}-status-dot`]: !!status,
|
|
[`${prefixCls}-status-${status}`]: !isHasDefaultSlot,
|
|
},
|
|
scrollNumberCls: {
|
|
[`${prefixCls}-dot`]: isDot,
|
|
[`${prefixCls}-count`]: !isDot,
|
|
[`${prefixCls}-multiple-words`]: count && count.toString && count.toString().length > 1,
|
|
[`${prefixCls}-status-${status}`]: !isHasDefaultSlot,
|
|
},
|
|
}
|
|
},
|
|
badgeStatus () {
|
|
const { count, overflowCount, showZero, dot, text } = this
|
|
let stateCount = +count > +overflowCount ? `${overflowCount}+` : count
|
|
const isDot = dot || text
|
|
if (isDot) {
|
|
stateCount = ''
|
|
}
|
|
const isZero = stateCount === '0' || stateCount === 0
|
|
const isEmpty = stateCount === null || stateCount === undefined || stateCount === ''
|
|
const isHidden = (isEmpty || (isZero && !showZero)) && !isDot
|
|
return {
|
|
stateCount,
|
|
isHidden,
|
|
}
|
|
},
|
|
},
|
|
components: {
|
|
Icon,
|
|
ScrollNumber,
|
|
},
|
|
}
|
|
</script>
|