@@ -16,6 +16,8 @@ export type StepItem = {
1616 status ?: Status ;
1717 subTitle ?: React . ReactNode ;
1818 title ?: React . ReactNode ;
19+
20+ onClick ?: React . MouseEventHandler < HTMLDivElement > ;
1921} ;
2022
2123export type StepIconRender = ( info : {
@@ -47,6 +49,7 @@ export interface StepsProps {
4749 className ?: string ;
4850 classNames ?: Partial < Record < SemanticName , string > > ;
4951 styles ?: Partial < Record < SemanticName , React . CSSProperties > > ;
52+ rootClassName ?: string ;
5053
5154 // layout
5255 orientation ?: 'horizontal' | 'vertical' ;
@@ -78,6 +81,7 @@ export default function Steps(props: StepsProps) {
7881 className,
7982 classNames,
8083 styles,
84+ rootClassName,
8185
8286 // layout
8387 orientation = 'horizontal' ,
@@ -107,13 +111,38 @@ export default function Steps(props: StepsProps) {
107111 } , [ orientation , progressDot , labelPlacement ] ) ;
108112
109113 // ============================= styles =============================
110- const classString = cls ( prefixCls , `${ prefixCls } -${ mergedOrientation } ` , className , {
111- [ `${ prefixCls } -label-${ mergeLabelPlacement } ` ] : mergedOrientation === 'horizontal' ,
112- [ `${ prefixCls } -dot` ] : ! ! progressDot ,
113- } ) ;
114+ const classString = cls (
115+ prefixCls ,
116+ `${ prefixCls } -${ mergedOrientation } ` ,
117+ {
118+ [ `${ prefixCls } -label-${ mergeLabelPlacement } ` ] : mergedOrientation === 'horizontal' ,
119+ [ `${ prefixCls } -dot` ] : ! ! progressDot ,
120+ } ,
121+ rootClassName ,
122+ className ,
123+ classNames . root ,
124+ ) ;
114125
115126 // ============================== Data ==============================
116127 const mergedItems = React . useMemo ( ( ) => ( items || [ ] ) . filter ( Boolean ) , [ items ] ) ;
128+ const statuses = React . useMemo (
129+ ( ) =>
130+ mergedItems . map ( ( { status : itemStatus } , index ) => {
131+ const stepNumber = initial + index ;
132+
133+ if ( ! itemStatus ) {
134+ if ( stepNumber === current ) {
135+ return status ;
136+ } else if ( stepNumber < current ) {
137+ return 'finish' ;
138+ }
139+ return 'wait' ;
140+ }
141+
142+ return itemStatus ;
143+ } ) ,
144+ [ mergedItems , status , current , initial ] ,
145+ ) ;
117146
118147 // ============================= events =============================
119148 const onStepClick = ( next : number ) => {
@@ -123,47 +152,66 @@ export default function Steps(props: StepsProps) {
123152 } ;
124153
125154 // ============================= render =============================
126- const renderStep = ( item : StepProps , index : number ) => {
127- const prevItem = mergedItems [ index - 1 ] ;
155+ const renderStep = ( item : StepItem , index : number ) => {
156+ const stepIndex = initial + index ;
128157
129- const data : StepProps = { ...item } ;
130- const stepNumber = initial + index ;
131158 // fix tail color
132- if ( status === 'error' && index === current - 1 ) {
133- data . className = `${ prefixCls } -next-error` ;
134- }
135-
136- if ( ! data . status ) {
137- if ( stepNumber === current ) {
138- data . status = status ;
139- } else if ( stepNumber < current ) {
140- data . status = 'finish' ;
141- } else {
142- data . status = 'wait' ;
143- }
144- }
145-
146- if ( ! data . render && itemRender ) {
147- data . render = ( stepItem ) => itemRender ( data , stepItem ) ;
148- }
159+ // if (status === 'error' && index === current - 1) {
160+ // data.className = `${prefixCls}-next-error`;
161+ // }
162+
163+ // const { status: currentStatus = status } = item;
164+ // const { status: prevStatus = currentStatus } = prevItem || {};
165+
166+ // if (!data.status) {
167+ // if (stepNumber === current) {
168+ // data.status = status;
169+ // } else if (stepNumber < current) {
170+ // data.status = 'finish';
171+ // } else {
172+ // data.status = 'wait';
173+ // }
174+ // }
175+
176+ const prevStatus = statuses [ index - 1 ] ;
177+ const itemStatus = statuses [ index ] ;
178+
179+ // if (!data.render && itemRender) {
180+ // data.render = (stepItem) => itemRender(data, stepItem);
181+ // }
149182
150183 return (
151184 < Step
152- data = { data }
153- active = { stepNumber === current }
154- stepNumber = { stepNumber + 1 }
155- stepIndex = { stepNumber }
156- key = { stepNumber }
185+ // Style
157186 prefixCls = { prefixCls }
187+ classNames = { classNames }
188+ styles = { styles }
189+ // Data
190+ data = { item }
191+ status = { itemStatus }
192+ prevStatus = { prevStatus }
193+ active = { stepIndex === current }
194+ index = { stepIndex }
195+ // stepNumber={stepNumber + 1}
196+ // stepIndex={stepNumber}
197+ // Render
198+ key = { stepIndex }
158199 progressDot = { progressDot }
159200 iconRender = { iconRender }
160- onStepClick = { onChange && onStepClick }
201+ onClick = { onChange && onStepClick }
161202 />
162203 ) ;
163204 } ;
164205
165206 return (
166- < div className = { classString } style = { style } { ...restProps } >
207+ < div
208+ className = { classString }
209+ style = { {
210+ ...style ,
211+ ...styles ?. root ,
212+ } }
213+ { ...restProps }
214+ >
167215 { mergedItems . map < React . ReactNode > ( renderStep ) }
168216 </ div >
169217 ) ;
0 commit comments