ant-design/components/badge/index.tsx

134 lines
3.6 KiB
TypeScript
Raw Normal View History

import * as React from 'react';
import PropTypes from 'prop-types';
2015-11-18 23:42:01 +08:00
import Animate from 'rc-animate';
2015-11-23 22:58:11 +08:00
import ScrollNumber from './ScrollNumber';
import classNames from 'classnames';
2015-09-01 13:59:07 +08:00
export { ScrollNumberProps } from './ScrollNumber';
2016-09-13 15:31:29 +08:00
export interface BadgeProps {
2016-07-14 13:29:50 +08:00
/** Number to show in badge */
count?: number | string;
showZero?: boolean;
2016-07-14 13:29:50 +08:00
/** Max count to show */
overflowCount?: number;
/** whether to show red dot without number */
dot?: boolean;
style?: React.CSSProperties;
prefixCls?: string;
scrollNumberPrefixCls?: string;
2016-07-14 13:29:50 +08:00
className?: string;
status?: 'success' | 'processing' | 'default' | 'error' | 'warning';
text?: string;
2017-11-03 11:37:35 +08:00
offset?: [number | string, number | string];
title?: string;
2016-07-14 13:29:50 +08:00
}
export default class Badge extends React.Component<BadgeProps, any> {
static defaultProps = {
prefixCls: 'ant-badge',
scrollNumberPrefixCls: 'ant-scroll-number',
count: null,
showZero: false,
dot: false,
overflowCount: 99,
2016-07-13 11:14:24 +08:00
};
static propTypes = {
count: PropTypes.oneOfType([
PropTypes.string,
PropTypes.number,
]),
showZero: PropTypes.bool,
dot: PropTypes.bool,
overflowCount: PropTypes.number,
2016-07-13 11:14:24 +08:00
};
2015-09-01 13:59:07 +08:00
render() {
const {
count,
showZero,
prefixCls,
scrollNumberPrefixCls,
overflowCount,
className,
style,
children,
dot,
status,
text,
2017-11-03 11:37:35 +08:00
offset,
title,
...restProps,
} = this.props;
2017-05-29 19:06:26 +08:00
let displayCount = (count as number) > (overflowCount as number) ? `${overflowCount}+` : count;
const isZero = displayCount === '0' || displayCount === 0;
const isDot = (dot && !isZero) || status;
2015-11-19 00:13:16 +08:00
// dot mode don't need count
if (isDot) {
2016-12-19 15:19:15 +08:00
displayCount = '';
2015-11-19 00:13:16 +08:00
}
const isEmpty = displayCount === null || displayCount === undefined || displayCount === '';
const hidden = (isEmpty || (isZero && !showZero)) && !isDot;
const statusCls = classNames({
[`${prefixCls}-status-dot`]: !!status,
2017-11-12 14:10:41 +08:00
[`${prefixCls}-status-${status}`]: !!status,
});
const scrollNumberCls = classNames({
[`${prefixCls}-dot`]: isDot,
[`${prefixCls}-count`]: !isDot,
[`${prefixCls}-multiple-words`]: !isDot && count && count.toString && count.toString().length > 1,
2017-11-12 14:10:41 +08:00
[`${prefixCls}-status-${status}`]: !!status,
});
const badgeCls = classNames(className, prefixCls, {
2016-10-12 19:42:10 +08:00
[`${prefixCls}-status`]: !!status,
[`${prefixCls}-not-a-wrapper`]: !children,
});
2017-11-03 11:37:35 +08:00
const styleWithOffset = offset ? {
marginTop: offset[0],
marginLeft: offset[1],
...style,
} : style;
2016-10-12 19:42:10 +08:00
// <Badge status="success" />
if (!children && status) {
return (
<span {...restProps} className={badgeCls} style={styleWithOffset}>
2016-10-12 19:42:10 +08:00
<span className={statusCls} />
<span className={`${prefixCls}-status-text`}>{text}</span>
</span>
);
}
const scrollNumber = hidden ? null : (
<ScrollNumber
prefixCls={scrollNumberPrefixCls}
data-show={!hidden}
className={scrollNumberCls}
2016-12-19 15:19:15 +08:00
count={displayCount}
title={title || count}
2017-11-03 11:37:35 +08:00
style={styleWithOffset}
2018-05-25 17:34:40 +08:00
key="scrollNumber"
/>
);
const statusText = (hidden || !text) ? null : (
<span className={`${prefixCls}-status-text`}>{text}</span>
);
2015-11-18 23:42:01 +08:00
return (
2017-07-31 18:01:45 +08:00
<span {...restProps} className={badgeCls}>
{children}
2016-07-08 17:17:57 +08:00
<Animate
component=""
2015-11-18 23:42:01 +08:00
showProp="data-show"
transitionName={children ? `${prefixCls}-zoom` : ''}
2017-05-31 15:48:11 +08:00
transitionAppear
>
{scrollNumber}
2015-11-18 23:42:01 +08:00
</Animate>
{statusText}
2015-11-18 23:42:01 +08:00
</span>
);
2015-09-01 13:59:07 +08:00
}
}