roles-columns.tsx 2.9 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. import { type ColumnDef } from '@tanstack/react-table'
  2. import { type Role } from '@/types/roles.types'
  3. import { Badge } from '@/components/ui/badge'
  4. import { DataTableColumnHeader } from '@/components/data-table'
  5. import { LongText } from '@/components/long-text'
  6. import { DataTableRowActions } from './data-table-row-actions'
  7. const roleStatusLabels: Record<string, string> = {
  8. active: 'فعال',
  9. inactive: 'غیرفعال',
  10. }
  11. export const rolesColumns: ColumnDef<Role>[] = [
  12. {
  13. accessorKey: 'id',
  14. header: ({ column }) => (
  15. <DataTableColumnHeader column={column} title='شناسه' />
  16. ),
  17. cell: ({ row }) => <div className='w-15'>#{row.original.id}</div>,
  18. },
  19. {
  20. accessorKey: 'name',
  21. header: ({ column }) => (
  22. <DataTableColumnHeader column={column} title='نام نقش' />
  23. ),
  24. cell: ({ row }) => (
  25. <LongText className='max-w-48'>{row.original.name}</LongText>
  26. ),
  27. },
  28. {
  29. accessorKey: 'status',
  30. header: ({ column }) => (
  31. <DataTableColumnHeader column={column} title='وضعیت' />
  32. ),
  33. cell: ({ row }) => (
  34. <Badge
  35. variant={row.original.status === 'active' ? 'default' : 'secondary'}
  36. >
  37. {roleStatusLabels[row.original.status] ?? row.original.status}
  38. </Badge>
  39. ),
  40. },
  41. {
  42. id: 'activity_fields',
  43. accessorFn: (row) =>
  44. row.activity_fields?.map((field) => field.name).join(', ') ?? '',
  45. header: ({ column }) => (
  46. <DataTableColumnHeader column={column} title='رشته‌ها' />
  47. ),
  48. cell: ({ row }) => {
  49. const fields = row.original.activity_fields ?? []
  50. if (fields.length === 0) {
  51. return <span className='text-sm text-muted-foreground'>—</span>
  52. }
  53. const visibleFields = fields.length > 3 ? fields.slice(0, 2) : fields
  54. const hiddenCount = fields.length - visibleFields.length
  55. return (
  56. <div className='flex max-w-64 flex-nowrap items-center gap-1'>
  57. {visibleFields.map((field) => (
  58. <Badge key={field.id} variant='outline'>
  59. {field.name}
  60. </Badge>
  61. ))}
  62. {hiddenCount > 0 && <Badge variant='secondary'>+{hiddenCount}</Badge>}
  63. </div>
  64. )
  65. },
  66. },
  67. {
  68. id: 'permissions_count',
  69. accessorFn: (row) => row.permissions.length,
  70. header: ({ column }) => (
  71. <DataTableColumnHeader column={column} title='تعداد دسترسی' />
  72. ),
  73. cell: ({ row }) => (
  74. <Badge variant='secondary'>{row.original.permissions.length}</Badge>
  75. ),
  76. },
  77. {
  78. accessorKey: 'created_at',
  79. header: ({ column }) => (
  80. <DataTableColumnHeader column={column} title='تاریخ ایجاد' />
  81. ),
  82. cell: ({ row }) => (
  83. <div className='text-sm text-muted-foreground'>
  84. {new Date(row.original.created_at).toLocaleDateString('fa-IR')}
  85. </div>
  86. ),
  87. },
  88. {
  89. id: 'actions',
  90. cell: DataTableRowActions,
  91. enableSorting: false,
  92. },
  93. ]