table.tsx 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import {useMemo} from 'react';
  2. import {COL_WIDTH_MINIMUM} from 'sentry/components/gridEditable';
  3. import {
  4. Body as _TableWrapper,
  5. Grid as _Table,
  6. GridBody,
  7. GridBodyCell,
  8. GridBodyCellStatus,
  9. GridHead,
  10. GridHeadCell,
  11. GridRow,
  12. } from 'sentry/components/gridEditable/styles';
  13. interface TableProps extends React.ComponentProps<typeof _TableWrapper> {}
  14. export function Table({children, style, ...props}: TableProps) {
  15. return (
  16. <_TableWrapper {...props}>
  17. <_Table style={style}>{children}</_Table>
  18. </_TableWrapper>
  19. );
  20. }
  21. interface TableStatusProps {
  22. children: React.ReactNode;
  23. }
  24. export function TableStatus({children}: TableStatusProps) {
  25. return (
  26. <GridRow>
  27. <GridBodyCellStatus>{children}</GridBodyCellStatus>
  28. </GridRow>
  29. );
  30. }
  31. const MINIMUM_COLUMN_WIDTH = COL_WIDTH_MINIMUM;
  32. type Item = {
  33. label: string;
  34. value: React.ReactNode;
  35. width?: 'min-content';
  36. };
  37. interface UseTableStylesOptions {
  38. items: Item[];
  39. minimumColumnWidth?: number;
  40. }
  41. export function useTableStyles({
  42. items,
  43. minimumColumnWidth = MINIMUM_COLUMN_WIDTH,
  44. }: UseTableStylesOptions) {
  45. const tableStyles = useMemo(() => {
  46. const columns = new Array(items.length);
  47. for (let i = 0; i < items.length; i++) {
  48. columns[i] = items[i].width ?? `minmax(${minimumColumnWidth}px, auto)`;
  49. }
  50. return {
  51. gridTemplateColumns: columns.join(' '),
  52. };
  53. }, [items, minimumColumnWidth]);
  54. return {tableStyles};
  55. }
  56. export const TableBody = GridBody;
  57. export const TableBodyCell = GridBodyCell;
  58. export const TableHead = GridHead;
  59. export const TableHeadCell = GridHeadCell;
  60. export const TableRow = GridRow;