diff --git a/app/routes/machines/components/machine.tsx b/app/routes/machines/components/machine.tsx index f2dc1d1..9724201 100644 --- a/app/routes/machines/components/machine.tsx +++ b/app/routes/machines/components/machine.tsx @@ -96,7 +96,7 @@ export default function MachineRow({ return ( (null); + return ( + <> + {modal === 'rename' && ( + { + if (!isOpen) setModal(null); + }} + /> + )} + {modal === 'delete' && ( + { + if (!isOpen) setModal(null); + }} + /> + )} + + + + + + setModal(key as Modal)}> + + Rename user + +

Delete

+
+
+
+
+ + ); +} diff --git a/app/routes/users/components/user-row.tsx b/app/routes/users/components/user-row.tsx index a13df3f..19ec632 100644 --- a/app/routes/users/components/user-row.tsx +++ b/app/routes/users/components/user-row.tsx @@ -2,6 +2,7 @@ import { CircleUser } from 'lucide-react'; import StatusCircle from '~/components/StatusCircle'; import { Machine, User } from '~/types'; import cn from '~/utils/cn'; +import MenuOptions from './menu'; interface UserRowProps { role: string; @@ -16,7 +17,10 @@ export default function UserRow({ user, role }: UserRowProps) { ); return ( - +
{user.profilePicUrl ? ( @@ -53,6 +57,9 @@ export default function UserRow({ user, role }: UserRowProps) {

{isOnline ? 'Connected' : new Date(lastSeen).toLocaleString()}

+ + + ); } diff --git a/app/routes/users/dialogs/delete-user.tsx b/app/routes/users/dialogs/delete-user.tsx index 6905e2a..1575d7f 100644 --- a/app/routes/users/dialogs/delete-user.tsx +++ b/app/routes/users/dialogs/delete-user.tsx @@ -1,27 +1,38 @@ -import { X } from 'lucide-react'; import Dialog from '~/components/Dialog'; -import { User } from '~/types'; +import { Machine, User } from '~/types'; -interface Props { - user: User; +interface DeleteProps { + user: User & { machines: Machine[] }; + isOpen: boolean; + setIsOpen: (isOpen: boolean) => void; } -// TODO: Warn that OIDC users will be recreated on next login -export default function DeleteUser({ user }: Props) { +export default function DeleteUser({ user, isOpen, setIsOpen }: DeleteProps) { const name = (user.displayName?.length ?? 0) > 0 ? user.displayName : user.name; return ( - - - - - + + 0 ? 'unactionable' : 'normal'} + > Delete {name}? - - Are you sure you want to delete {name}? A deleted user cannot be - recovered. - + {user.machines.length > 0 ? ( + + Users cannot be deleted if they have machines. Please delete or + re-assign their machines to other users before proceeding. + + ) : ( + + Deleted users cannot be recovered. + {user.provider === 'oidc' && ( +

+ Since this user is authenticated via an external provider, they + will be recreated if they sign in again. +

+ )} +
+ )}
diff --git a/app/routes/users/dialogs/rename-user.tsx b/app/routes/users/dialogs/rename-user.tsx index b9489d4..a18b830 100644 --- a/app/routes/users/dialogs/rename-user.tsx +++ b/app/routes/users/dialogs/rename-user.tsx @@ -1,19 +1,17 @@ -import { Pencil } from 'lucide-react'; import Dialog from '~/components/Dialog'; import Input from '~/components/Input'; import { User } from '~/types'; -interface Props { +interface RenameProps { user: User; + isOpen: boolean; + setIsOpen: (isOpen: boolean) => void; } // TODO: Server side validation before submitting -export default function RenameUser({ user }: Props) { +export default function RenameUser({ user, isOpen, setIsOpen }: RenameProps) { return ( - - - - + Rename {user.name}?