UsersTable.jsx 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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="table-fixed">
  21. <TableHeader>
  22. <TableRow>
  23. <TableHead className="w-44">Benutzername</TableHead>
  24. <TableHead>E-Mail</TableHead>
  25. <TableHead className="w-36">Rolle</TableHead>
  26. <TableHead className="w-32">NL</TableHead>
  27. <TableHead className="w-40">Passwortwechsel</TableHead>
  28. <TableHead className="w-56">Aktualisiert</TableHead>
  29. <TableHead className="w-44 text-right">Aktion</TableHead>
  30. </TableRow>
  31. </TableHeader>
  32. <TableBody>
  33. {list.map((u) => {
  34. const must = Boolean(u.mustChangePassword);
  35. return (
  36. <TableRow key={u.id}>
  37. <TableCell className="truncate font-medium" title={u.username}>
  38. {u.username}
  39. </TableCell>
  40. <TableCell className="min-w-0">
  41. <span className="block truncate" title={u.email}>
  42. {u.email}
  43. </span>
  44. </TableCell>
  45. <TableCell>
  46. <Badge variant="secondary">
  47. {ROLE_LABELS_DE[u.role] || u.role}
  48. </Badge>
  49. </TableCell>
  50. <TableCell>
  51. {u.branchId ? (
  52. <Badge variant="outline">{u.branchId}</Badge>
  53. ) : (
  54. <span className="text-muted-foreground">—</span>
  55. )}
  56. </TableCell>
  57. <TableCell>
  58. {must ? (
  59. <Badge variant="destructive">Erforderlich</Badge>
  60. ) : (
  61. <Badge variant="secondary">Nein</Badge>
  62. )}
  63. </TableCell>
  64. <TableCell className="text-xs text-muted-foreground">
  65. {formatDateTimeDe(u.updatedAt)}
  66. </TableCell>
  67. <TableCell className="text-right">
  68. <div className="flex items-center justify-end gap-2">
  69. <EditUserDialog
  70. user={u}
  71. disabled={disabled}
  72. onUpdated={onUserUpdated}
  73. />
  74. <DeleteUserDialog
  75. user={u}
  76. disabled={disabled}
  77. onDeleted={onUserUpdated}
  78. />
  79. </div>
  80. </TableCell>
  81. </TableRow>
  82. );
  83. })}
  84. </TableBody>
  85. </Table>
  86. );
  87. }