diff --git a/components/progress/circle.jsx b/components/progress/circle.jsx
deleted file mode 100644
index 3ba042c18..000000000
--- a/components/progress/circle.jsx
+++ /dev/null
@@ -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 (
-
-
- {slots?.default()}
-
- );
-};
-
-export default Circle;
diff --git a/components/progress/circle.tsx b/components/progress/circle.tsx
new file mode 100644
index 000000000..025508c01
--- /dev/null
+++ b/components/progress/circle.tsx
@@ -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 = {
+ normal: '#108ee9',
+ exception: '#ff5500',
+ success: '#87d068',
+};
+
+export type ICircleProps = ExtractPropTypes;
+
+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 (
+
+
+ {slots?.default()}
+
+ );
+ };
+ },
+});
+
+export default Circle;
diff --git a/components/progress/index.jsx b/components/progress/index.ts
similarity index 57%
rename from components/progress/index.jsx
rename to components/progress/index.ts
index ac8b2be7e..c74c457fe 100644
--- a/components/progress/index.jsx
+++ b/components/progress/index.ts
@@ -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;
};
diff --git a/components/progress/line.jsx b/components/progress/line.tsx
similarity index 100%
rename from components/progress/line.jsx
rename to components/progress/line.tsx
diff --git a/components/progress/progress.jsx b/components/progress/progress.tsx
similarity index 75%
rename from components/progress/progress.jsx
rename to components/progress/progress.tsx
index a9a8a6d6c..0ba670a51 100644
--- a/components/progress/progress.jsx
+++ b/components/progress/progress.tsx
@@ -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 {progress}
;
},
-};
+});
diff --git a/components/progress/props.ts b/components/progress/props.ts
new file mode 100644
index 000000000..a18b1c7c2
--- /dev/null
+++ b/components/progress/props.ts
@@ -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,
+};
diff --git a/components/progress/utils.js b/components/progress/utils.ts
similarity index 69%
rename from components/progress/utils.js
rename to components/progress/utils.ts
index a2dd16ddf..14a930d88 100644
--- a/components/progress/utils.js
+++ b/components/progress/utils.ts
@@ -1,4 +1,4 @@
-export function validProgress(progress) {
+export function validProgress(progress?: number) {
if (!progress || progress < 0) {
return 0;
}