refactor: progress to ts
parent
4fc1a3cd78
commit
c97af1ac18
|
@ -1,70 +0,0 @@
|
|||
import { Circle as VCCircle } from '../vc-progress';
|
||||
import { validProgress } from './utils';
|
||||
|
||||
const statusColorMap = {
|
||||
normal: '#108ee9',
|
||||
exception: '#ff5500',
|
||||
success: '#87d068',
|
||||
};
|
||||
|
||||
function getPercentage({ percent, successPercent }) {
|
||||
const ptg = validProgress(percent);
|
||||
if (!successPercent) return ptg;
|
||||
|
||||
const successPtg = validProgress(successPercent);
|
||||
return [successPercent, validProgress(ptg - successPtg)];
|
||||
}
|
||||
|
||||
function getStrokeColor({ progressStatus, successPercent, strokeColor }) {
|
||||
const color = strokeColor || statusColorMap[progressStatus];
|
||||
if (!successPercent) return color;
|
||||
return [statusColorMap.success, color];
|
||||
}
|
||||
|
||||
const Circle = (_, { attrs, slots }) => {
|
||||
const {
|
||||
prefixCls,
|
||||
width,
|
||||
strokeWidth,
|
||||
trailColor,
|
||||
strokeLinecap,
|
||||
gapPosition,
|
||||
gapDegree,
|
||||
type,
|
||||
} = attrs;
|
||||
const circleSize = width || 120;
|
||||
const circleStyle = {
|
||||
width: typeof circleSize === 'number' ? `${circleSize}px` : circleSize,
|
||||
height: typeof circleSize === 'number' ? `${circleSize}px` : circleSize,
|
||||
fontSize: `${circleSize * 0.15 + 6}px`,
|
||||
};
|
||||
const circleWidth = strokeWidth || 6;
|
||||
const gapPos = gapPosition || (type === 'dashboard' && 'bottom') || 'top';
|
||||
const gapDeg = gapDegree || (type === 'dashboard' && 75);
|
||||
const strokeColor = getStrokeColor(attrs);
|
||||
const isGradient = Object.prototype.toString.call(strokeColor) === '[object Object]';
|
||||
|
||||
const wrapperClassName = {
|
||||
[`${prefixCls}-inner`]: true,
|
||||
[`${prefixCls}-circle-gradient`]: isGradient,
|
||||
};
|
||||
|
||||
return (
|
||||
<div class={wrapperClassName} style={circleStyle}>
|
||||
<VCCircle
|
||||
percent={getPercentage(attrs)}
|
||||
strokeWidth={circleWidth}
|
||||
trailWidth={circleWidth}
|
||||
strokeColor={strokeColor}
|
||||
strokeLinecap={strokeLinecap}
|
||||
trailColor={trailColor}
|
||||
prefixCls={prefixCls}
|
||||
gapDegree={gapDeg}
|
||||
gapPosition={gapPos}
|
||||
/>
|
||||
{slots?.default()}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
|
||||
export default Circle;
|
|
@ -0,0 +1,85 @@
|
|||
import { defineComponent, ExtractPropTypes } from 'vue';
|
||||
import { Circle as VCCircle } from '../vc-progress';
|
||||
import PropTypes from '../_util/vue-types';
|
||||
import { validProgress } from './utils';
|
||||
import { ProgressProps } from './props';
|
||||
|
||||
const CircleProps = {
|
||||
...ProgressProps,
|
||||
progressStatus: PropTypes.string,
|
||||
};
|
||||
|
||||
const statusColorMap: Record<string, string> = {
|
||||
normal: '#108ee9',
|
||||
exception: '#ff5500',
|
||||
success: '#87d068',
|
||||
};
|
||||
|
||||
export type ICircleProps = ExtractPropTypes<typeof CircleProps>;
|
||||
|
||||
function getPercentage({ percent, successPercent }: ICircleProps) {
|
||||
const ptg = validProgress(percent);
|
||||
if (!successPercent) return ptg;
|
||||
|
||||
const successPtg = validProgress(successPercent);
|
||||
return [successPercent, validProgress(ptg - successPtg)];
|
||||
}
|
||||
|
||||
function getStrokeColor({ progressStatus, successPercent, strokeColor }: ICircleProps) {
|
||||
const color = strokeColor || statusColorMap[progressStatus];
|
||||
if (!successPercent) return color;
|
||||
return [statusColorMap.success, color];
|
||||
}
|
||||
|
||||
const Circle = defineComponent({
|
||||
props: CircleProps,
|
||||
setup(props, { slots }) {
|
||||
return () => {
|
||||
const {
|
||||
prefixCls,
|
||||
width,
|
||||
strokeWidth,
|
||||
trailColor,
|
||||
strokeLinecap,
|
||||
gapPosition,
|
||||
gapDegree,
|
||||
type,
|
||||
} = props;
|
||||
const circleSize = width || 120;
|
||||
const circleStyle = {
|
||||
width: typeof circleSize === 'number' ? `${circleSize}px` : circleSize,
|
||||
height: typeof circleSize === 'number' ? `${circleSize}px` : circleSize,
|
||||
fontSize: `${circleSize * 0.15 + 6}px`,
|
||||
};
|
||||
const circleWidth = strokeWidth || 6;
|
||||
const gapPos = gapPosition || (type === 'dashboard' && 'bottom') || 'top';
|
||||
const gapDeg = gapDegree || (type === 'dashboard' && 75);
|
||||
const strokeColor = getStrokeColor(props);
|
||||
const isGradient = Object.prototype.toString.call(strokeColor) === '[object Object]';
|
||||
|
||||
const wrapperClassName = {
|
||||
[`${prefixCls}-inner`]: true,
|
||||
[`${prefixCls}-circle-gradient`]: isGradient,
|
||||
};
|
||||
|
||||
return (
|
||||
<div class={wrapperClassName} style={circleStyle}>
|
||||
<VCCircle
|
||||
percent={getPercentage(props)}
|
||||
strokeWidth={circleWidth}
|
||||
trailWidth={circleWidth}
|
||||
strokeColor={strokeColor}
|
||||
strokeLinecap={strokeLinecap}
|
||||
trailColor={trailColor}
|
||||
prefixCls={prefixCls}
|
||||
gapDegree={gapDeg}
|
||||
gapPosition={gapPos}
|
||||
/>
|
||||
{slots?.default()}
|
||||
</div>
|
||||
);
|
||||
};
|
||||
},
|
||||
});
|
||||
|
||||
export default Circle;
|
|
@ -1,9 +1,10 @@
|
|||
import { App } from 'vue';
|
||||
import Progress from './progress';
|
||||
|
||||
export { ProgressProps } from './progress';
|
||||
export { ProgressProps } from './props';
|
||||
|
||||
/* istanbul ignore next */
|
||||
Progress.install = function(app) {
|
||||
Progress.install = function(app: App) {
|
||||
app.component(Progress.name, Progress);
|
||||
return app;
|
||||
};
|
|
@ -1,7 +1,7 @@
|
|||
import { inject } from 'vue';
|
||||
import { defineComponent, inject } from 'vue';
|
||||
import classNames from '../_util/classNames';
|
||||
import PropTypes from '../_util/vue-types';
|
||||
import { getOptionProps, initDefaultProps } from '../_util/props-util';
|
||||
import { getOptionProps } from '../_util/props-util';
|
||||
import initDefaultProps from '../_util/props-util/initDefaultProps';
|
||||
import { defaultConfigProvider } from '../config-provider';
|
||||
import CloseOutlined from '@ant-design/icons-vue/CloseOutlined';
|
||||
import CheckOutlined from '@ant-design/icons-vue/CheckOutlined';
|
||||
|
@ -10,30 +10,9 @@ import CloseCircleFilled from '@ant-design/icons-vue/CloseCircleFilled';
|
|||
import Line from './line';
|
||||
import Circle from './circle';
|
||||
import { validProgress } from './utils';
|
||||
import { ProgressProps, ProgressStatuses } from './props';
|
||||
|
||||
const ProgressStatuses = ['normal', 'exception', 'active', 'success'];
|
||||
export const ProgressType = PropTypes.oneOf(['line', 'circle', 'dashboard']);
|
||||
export const ProgressSize = PropTypes.oneOf(['default', 'small']);
|
||||
|
||||
export const ProgressProps = {
|
||||
prefixCls: PropTypes.string,
|
||||
type: ProgressType,
|
||||
percent: PropTypes.number,
|
||||
successPercent: PropTypes.number,
|
||||
format: PropTypes.func,
|
||||
status: PropTypes.oneOf(ProgressStatuses),
|
||||
showInfo: PropTypes.looseBool,
|
||||
strokeWidth: PropTypes.number,
|
||||
strokeLinecap: PropTypes.oneOf(['butt', 'round', 'square']),
|
||||
strokeColor: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
|
||||
trailColor: PropTypes.string,
|
||||
width: PropTypes.number,
|
||||
gapDegree: PropTypes.number,
|
||||
gapPosition: PropTypes.oneOf(['top', 'bottom', 'left', 'right']),
|
||||
size: ProgressSize,
|
||||
};
|
||||
|
||||
export default {
|
||||
export default defineComponent({
|
||||
name: 'AProgress',
|
||||
props: initDefaultProps(ProgressProps, {
|
||||
type: 'line',
|
||||
|
@ -65,7 +44,7 @@ export default {
|
|||
}
|
||||
return status || 'normal';
|
||||
},
|
||||
renderProcessInfo(prefixCls, progressStatus) {
|
||||
renderProcessInfo(prefixCls: string, progressStatus: typeof ProgressStatuses[number]) {
|
||||
const { showInfo, format, type, percent, successPercent } = this.$props;
|
||||
if (!showInfo) return null;
|
||||
|
||||
|
@ -93,7 +72,7 @@ export default {
|
|||
render() {
|
||||
const props = getOptionProps(this);
|
||||
const { prefixCls: customizePrefixCls, size, type, showInfo } = props;
|
||||
const getPrefixCls = this.configProvider.getPrefixCls;
|
||||
const { getPrefixCls } = this.configProvider;
|
||||
const prefixCls = getPrefixCls('progress', customizePrefixCls);
|
||||
const progressStatus = this.getProgressStatus();
|
||||
const progressInfo = this.renderProcessInfo(prefixCls, progressStatus);
|
||||
|
@ -128,4 +107,4 @@ export default {
|
|||
};
|
||||
return <div {...progressProps}>{progress}</div>;
|
||||
},
|
||||
};
|
||||
});
|
|
@ -0,0 +1,24 @@
|
|||
import PropTypes from '../_util/vue-types';
|
||||
import { tuple } from '../_util/type';
|
||||
|
||||
export const ProgressStatuses = tuple('normal', 'exception', 'active', 'success');
|
||||
export const ProgressType = PropTypes.oneOf(tuple('line', 'circle', 'dashboard'));
|
||||
export const ProgressSize = PropTypes.oneOf(tuple('default', 'small'));
|
||||
|
||||
export const ProgressProps = {
|
||||
prefixCls: PropTypes.string,
|
||||
type: ProgressType,
|
||||
percent: PropTypes.number,
|
||||
successPercent: PropTypes.number,
|
||||
format: PropTypes.func,
|
||||
status: PropTypes.oneOf(ProgressStatuses),
|
||||
showInfo: PropTypes.looseBool,
|
||||
strokeWidth: PropTypes.number,
|
||||
strokeLinecap: PropTypes.oneOf(['butt', 'round', 'square']),
|
||||
strokeColor: PropTypes.oneOfType([PropTypes.string, PropTypes.object]),
|
||||
trailColor: PropTypes.string,
|
||||
width: PropTypes.number,
|
||||
gapDegree: PropTypes.number,
|
||||
gapPosition: PropTypes.oneOf(tuple('top', 'bottom', 'left', 'right')),
|
||||
size: ProgressSize,
|
||||
};
|
|
@ -1,4 +1,4 @@
|
|||
export function validProgress(progress) {
|
||||
export function validProgress(progress?: number) {
|
||||
if (!progress || progress < 0) {
|
||||
return 0;
|
||||
}
|
Loading…
Reference in New Issue