UsersTable.jsx 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
  1. import React from "react";
  2. import {
  3. ROLE_LABELS_DE,
  4. formatDateTimeDe,
  5. } from "@/components/admin/users/usersUi";
  6. import EditUserDialog from "@/components/admin/users/EditUserDialog";
  7. import DeleteUserDialog from "@/components/admin/users/DeleteUserDialog";
  8. import { Badge } from "@/components/ui/badge";
  9. import {
  10. Table,
  11. TableBody,
  12. TableCell,
  13. TableHead,
  14. TableHeader,
  15. TableRow,
  16. } from "@/components/ui/table";
  17. export default function UsersTable({ items, disabled = false, onUserUpdated }) {
  18. const list = Array.isArray(items) ? items : [];
  19. return (
  20. <Table className="min-w-[76rem] table-fixed">
  21. <TableHeader>
  22. <TableRow>
  23. <TableHead className="w-44">Benutzername</TableHead>
  24. <TableHead className="w-56">E-Mail</TableHead>
  25. <TableHead className="w-40">Rolle</TableHead>
  26. <TableHead className="w-20">NL</TableHead>
  27. <TableHead className="w-40">Passwortwechsel</TableHead>
  28. <TableHead className="w-40">Aktualisiert</TableHead>
  29. <TableHead className="sticky right-0 z-20 w-20 bg-card text-right">
  30. Aktion
  31. </TableHead>
  32. </TableRow>
  33. </TableHeader>
  34. <TableBody>
  35. {list.map((u) => {
  36. const must = Boolean(u.mustChangePassword);
  37. return (
  38. <TableRow key={u.id}>
  39. <TableCell className="truncate font-medium" title={u.username}>
  40. {u.username}
  41. </TableCell>
  42. <TableCell className="min-w-0">
  43. <span className="block truncate" title={u.email}>
  44. {u.email}
  45. </span>
  46. </TableCell>
  47. <TableCell>
  48. <Badge variant="secondary">
  49. {ROLE_LABELS_DE[u.role] || u.role}
  50. </Badge>
  51. </TableCell>
  52. <TableCell>
  53. {u.branchId ? (
  54. <Badge variant="outline">{u.branchId}</Badge>
  55. ) : (
  56. <span className="text-muted-foreground">—</span>
  57. )}
  58. </TableCell>
  59. <TableCell>
  60. {must ? (
  61. <Badge variant="destructive">Erforderlich</Badge>
  62. ) : (
  63. <Badge variant="secondary">Nein</Badge>
  64. )}
  65. </TableCell>
  66. <TableCell className="text-xs text-muted-foreground">
  67. {formatDateTimeDe(u.updatedAt)}
  68. </TableCell>
  69. <TableCell className="sticky right-0 z-10 w-20 bg-card text-right">
  70. <div className="flex items-center justify-end gap-1">
  71. <EditUserDialog
  72. user={u}
  73. disabled={disabled}
  74. onUpdated={onUserUpdated}
  75. />
  76. <DeleteUserDialog
  77. user={u}
  78. disabled={disabled}
  79. onDeleted={onUserUpdated}
  80. />
  81. </div>
  82. </TableCell>
  83. </TableRow>
  84. );
  85. })}
  86. </TableBody>
  87. </Table>
  88. );
  89. }