index.tsx 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263
  1. import React, { ReactNode } from 'react';
  2. import useNewToken from '@/Hook/useNewToken';
  3. import style from './index.less'
  4. import { CheckOutlined } from '@ant-design/icons';
  5. export type NewStepsItem = {
  6. title: ReactNode
  7. description?: ReactNode
  8. children?: NewStepsItem[]
  9. checked?: boolean
  10. isLeaf?: boolean
  11. id?: string
  12. onChange?: (item: NewStepsItem) => void
  13. }
  14. interface NewStepsProps {
  15. items: NewStepsItem[]
  16. isLeaf?: boolean
  17. onChange?: (item: NewStepsItem, falterItem?: NewStepsItem) => void
  18. }
  19. /**
  20. * 自定义步骤条
  21. * @param param0
  22. * @returns
  23. */
  24. const NewSteps: React.FC<NewStepsProps> = ({ items = [], onChange, isLeaf }) => {
  25. /***************************************/
  26. const { token } = useNewToken()
  27. /***************************************/
  28. return <div className={style.newSteps} style={{ '--color': token.colorPrimary } as React.CSSProperties}>
  29. {items.map((i, index) => <div
  30. className={`${style['newSteps-item']} ${i.checked ? style['newSteps-item-active'] : ''} ${i.children ? style['newSteps-item-children'] : ''} ${isLeaf ? style['newSteps-item-leaf'] : ''}`}
  31. key={index}
  32. >
  33. <div className={style['newSteps-item-tail']}></div>
  34. <div className={style['newSteps-item-icon']}>
  35. <span className={style['newSteps-icon']}>
  36. {i.checked ? <CheckOutlined /> : index + 1}
  37. </span>
  38. </div>
  39. <div className={style['newSteps-item-content']}>
  40. <div
  41. className={style['newSteps-item-content-text']}
  42. onClick={(e) => {
  43. e.stopPropagation()
  44. onChange?.(i)
  45. }}
  46. >
  47. <div className={style['newSteps-item-title']}>{i.title}</div>
  48. {i?.description && <div className={style['newSteps-item-description']}>{i.description}</div>}
  49. </div>
  50. {i.children && <div style={{ marginTop: 20 }}>
  51. <NewSteps items={i.children} onChange={(e, f) => onChange?.(e, f)} isLeaf={true} />
  52. </div>}
  53. </div>
  54. </div>)}
  55. </div>;
  56. };
  57. export default React.memo(NewSteps);