From c4335bd83ab5cc92566d828a84e6336bcd9e915c Mon Sep 17 00:00:00 2001 From: Ryan Zhang Date: Tue, 6 Jun 2023 13:22:04 +0800 Subject: [PATCH] =?UTF-8?q?fix(Process):=20=E6=94=AF=E6=8C=81Circle?= =?UTF-8?q?=E6=A8=A1=E5=BC=8F=E7=9A=84=E8=BF=9B=E5=BA=A6=E6=9D=A1=20(#2154?= =?UTF-8?q?)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix(Process): 支持Circle模式的进度条 * fix: 修改build错误 --- src/progress/Progress.tsx | 37 ++++++++++------ src/progress/ProgressCircle.tsx | 57 +++++++++++++++++++++++++ src/progress/demos/Progress.stories.tsx | 20 +++++++++ src/progress/interface.ts | 8 +++- src/progress/style/index.less | 36 ++++++++++++++++ 5 files changed, 142 insertions(+), 16 deletions(-) create mode 100644 src/progress/ProgressCircle.tsx diff --git a/src/progress/Progress.tsx b/src/progress/Progress.tsx index 7c161fa457..354e8ede7e 100644 --- a/src/progress/Progress.tsx +++ b/src/progress/Progress.tsx @@ -3,8 +3,9 @@ import { SuccessFilled, ErrorFilled } from '@gio-design/icons'; import classNames from 'classnames'; import { usePrefixCls } from '@gio-design/utils'; import { ProgressProps, ProgressStatus } from './interface'; +import ProgressCircle from './ProgressCircle'; -const defaultFormat = (percent?: number) => `${Math.round((percent || 0) * 100) / 100}%`; +export const defaultFormat = (percent?: number) => `${Math.round((percent || 0) * 100) / 100}%`; const statusIcons = [null, SuccessFilled, ErrorFilled]; const getStatusIcon = (status: string, prefix: string) => { @@ -12,23 +13,31 @@ const getStatusIcon = (status: string, prefix: string) => { return Icon && ; }; -const Progress: React.FC = ({ - percent = 0, - status = 'active', - format = defaultFormat, - customizePrefixCls, - animation, - className, - style, - showInfo = true, - size = 'default', - ...rest -}: ProgressProps) => { +const Progress: React.FC = (props) => { + const { + percent = 0, + status = 'active', + format = defaultFormat, + customizePrefixCls, + animation, + className, + style, + showInfo = true, + size = 'default', + type, + ...rest + } = props; const prefixCls = usePrefixCls('progress', customizePrefixCls); + if (type === 'circle') { + return ; + } + + const fixedSize = size === 'large' ? 'default' : size; + return (
-
+
= ({ + percent = 0, + status = 'active', + format, + customizePrefixCls, + // animation, + // className, + style, + size, + strokeLinecap, + ...rest +}: ProgressProps) => { + const prefixCls = usePrefixCls('progress-circle', customizePrefixCls); + + const width = sizeMapping[size || 'default']?.size || sizeMapping.default.size; + const border = sizeMapping[size || 'default']?.border || sizeMapping.default.border; + + const r = width / 2 - 3; + const perimeter = Math.PI * r * 2; + const strokeDashOffset = perimeter - (perimeter * 75) / 100; + return ( +
+ + + + + {size !== 'small' && ( + + {format?.(percent) || `${percent}%`} + + )} +
+ ); +}; + +export default ProgressCircle; diff --git a/src/progress/demos/Progress.stories.tsx b/src/progress/demos/Progress.stories.tsx index 306b03a985..5cb29c7f18 100644 --- a/src/progress/demos/Progress.stories.tsx +++ b/src/progress/demos/Progress.stories.tsx @@ -67,3 +67,23 @@ export const Status: Story = () => ( export const Format: Story = () => ( `${e}🌟`} status="active" percent={percent} /> ); + +export const Circle: Story = () => ( + <> + `${e}%`} status="active" size="large" percent={percent} /> + `${e}%`} status="success" size="default" percent={percent} /> + ( + + {e} + % + + )} + status="exception" + strokeLinecap="butt" + percent={percent} + /> + `${e}%`} status="active" size="small" percent={percent} /> + +); diff --git a/src/progress/interface.ts b/src/progress/interface.ts index 8bb80e6e09..b4a2267b47 100644 --- a/src/progress/interface.ts +++ b/src/progress/interface.ts @@ -4,6 +4,8 @@ export enum ProgressStatus { exception, } +export type ProgressType = 'circle' | 'default'; + export interface ProgressProps { /** * 百分比 @@ -21,9 +23,9 @@ export interface ProgressProps { * 进度条尺寸 * @default default */ - size?: 'small'|'default'; + size?: 'small' | 'default' | 'large'; customizePrefixCls?: string; - /** + /** * 动画特效开关 * @default false */ @@ -31,4 +33,6 @@ export interface ProgressProps { className?: string; style?: React.CSSProperties; showInfo?: boolean; + type?: ProgressType; + strokeLinecap?: React.SVGProps['strokeLinecap']; } diff --git a/src/progress/style/index.less b/src/progress/style/index.less index b9e1fc7c2b..2fd5d55adb 100644 --- a/src/progress/style/index.less +++ b/src/progress/style/index.less @@ -10,6 +10,42 @@ font-weight: normal; .text-h3(); + &-circle { + display: inline-flex; + align-items: center; + // height: 24px; + color: @gray-5; + font-weight: normal; + // transform: rotate(-90deg); + + svg circle { + transform: rotate(-90deg); + } + + &-text { + position: absolute; + text-align: center; + } + + &-active { + .circle { + stroke: @blue-3; + } + } + + &-success { + .circle { + stroke: @green-3; + } + } + + &-exception { + .circle { + stroke: @red-3; + } + } + } + &-trail { flex-basis: 100%; overflow: hidden;