Table.tsx 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. import type { PropsWithChildren, ReactNode } from 'react'
  2. interface TableProps {
  3. body: ReactNode
  4. head?: ReactNode
  5. className?: string
  6. containerClassName?: string
  7. borderless?: boolean
  8. headTrClasses?: string
  9. bodyClassName?: string
  10. style?: React.StyleHTMLAttributes<HTMLTableElement>
  11. }
  12. /**
  13. * @deprecated Use `Table` from `ui` instead
  14. */
  15. function Table({
  16. body,
  17. head,
  18. className,
  19. containerClassName,
  20. borderless,
  21. headTrClasses,
  22. bodyClassName,
  23. style,
  24. }: TableProps) {
  25. let containerClasses = ['table-container']
  26. if (containerClassName) containerClasses.push(containerClassName)
  27. if (borderless) containerClasses.push('table-container--borderless')
  28. let classes = ['table']
  29. if (className) classes.push(className)
  30. return (
  31. <div className={containerClasses.join(' ')}>
  32. <table className={classes.join(' ')} style={style}>
  33. <thead>
  34. <tr className={headTrClasses}>{head}</tr>
  35. </thead>
  36. <tbody className={bodyClassName}>{body}</tbody>
  37. </table>
  38. </div>
  39. )
  40. }
  41. interface ThProps {
  42. className?: string
  43. style?: React.CSSProperties
  44. }
  45. /**
  46. * @deprecated Use `TableHeader` from `ui` instead
  47. */
  48. const Th = ({ children, className, style }: PropsWithChildren<ThProps>) => {
  49. const classes = ['p-3 px-4 text-left']
  50. if (className) classes.push(className)
  51. return (
  52. <th className={classes.join(' ')} style={style}>
  53. {children}
  54. </th>
  55. )
  56. }
  57. interface TrProps {
  58. className?: string
  59. hoverable?: boolean
  60. style?: React.CSSProperties
  61. onClick?: () => void
  62. }
  63. /**
  64. * @deprecated Use `TableRow` from `ui` instead
  65. */
  66. const Tr = ({ children, className, onClick, style, hoverable }: PropsWithChildren<TrProps>) => {
  67. let classes = [className]
  68. if (onClick || hoverable) classes.push('tr--link')
  69. return (
  70. <tr className={classes.join(' ')} onClick={onClick} style={style}>
  71. {children}
  72. </tr>
  73. )
  74. }
  75. interface TdProps extends React.HTMLProps<HTMLTableCellElement> {
  76. colSpan?: number
  77. className?: string
  78. style?: React.CSSProperties
  79. align?: 'left' | 'center' | 'right' | 'justify' | 'char' | undefined
  80. }
  81. /**
  82. * @deprecated Use `TableCell` from `ui` instead
  83. */
  84. const Td = ({ children, colSpan, className, style, ...rest }: PropsWithChildren<TdProps>) => {
  85. return (
  86. <td className={className} colSpan={colSpan} style={style} {...rest}>
  87. {children}
  88. </td>
  89. )
  90. }
  91. Table.th = Th
  92. Table.td = Td
  93. Table.tr = Tr
  94. export default Table