mirror of
https://github.com/tale/headplane.git
synced 2026-07-27 16:18:57 +00:00
fix: handle user deletion
This commit is contained in:
@@ -10,9 +10,10 @@ import MenuOptions from "./menu";
|
||||
interface HeadplaneUserRowProps {
|
||||
user: HeadplaneUserData;
|
||||
headscaleUsers: { id: string; name: string; claimed: boolean }[];
|
||||
isSelf?: boolean;
|
||||
}
|
||||
|
||||
export default function HeadplaneUserRow({ user, headscaleUsers }: HeadplaneUserRowProps) {
|
||||
export default function HeadplaneUserRow({ user, headscaleUsers, isSelf }: HeadplaneUserRowProps) {
|
||||
const isOnline = user.machines.some((machine) => machine.online);
|
||||
const lastSeen = user.machines.reduce(
|
||||
(acc, machine) => Math.max(acc, new Date(machine.lastSeen).getTime()),
|
||||
@@ -66,6 +67,7 @@ export default function HeadplaneUserRow({ user, headscaleUsers }: HeadplaneUser
|
||||
<MenuOptions
|
||||
currentLink={user.headscaleUserId ?? undefined}
|
||||
headscaleUsers={headscaleUsers}
|
||||
isSelf={isSelf}
|
||||
user={user}
|
||||
/>
|
||||
</td>
|
||||
|
||||
@@ -12,11 +12,12 @@ interface MenuProps {
|
||||
user: HeadplaneUserData;
|
||||
headscaleUsers: { id: string; name: string; claimed: boolean }[];
|
||||
currentLink?: string;
|
||||
isSelf?: boolean;
|
||||
}
|
||||
|
||||
type Modal = "delete" | "reassign" | "link" | null;
|
||||
|
||||
export default function UserMenu({ user, headscaleUsers, currentLink }: MenuProps) {
|
||||
export default function UserMenu({ user, headscaleUsers, currentLink, isSelf }: MenuProps) {
|
||||
const [modal, setModal] = useState<Modal>(null);
|
||||
|
||||
const isLinked = currentLink !== undefined;
|
||||
@@ -80,7 +81,7 @@ export default function UserMenu({ user, headscaleUsers, currentLink }: MenuProp
|
||||
<MenuItem onClick={() => setModal("link")}>
|
||||
{isLinked ? "Change linked user" : "Link Headscale user"}
|
||||
</MenuItem>
|
||||
{user.linkedHeadscaleUser && (
|
||||
{user.linkedHeadscaleUser && !isSelf && (
|
||||
<>
|
||||
<MenuSeparator />
|
||||
<MenuItem variant="danger" onClick={() => setModal("delete")}>
|
||||
|
||||
@@ -128,6 +128,7 @@ export async function loader({ request, context }: Route.LoaderArgs) {
|
||||
|
||||
return {
|
||||
writable: writablePermission,
|
||||
currentUserId: principal.kind === "oidc" ? principal.user.id : undefined,
|
||||
oidc: context.config.oidc ? { issuer: context.config.oidc.issuer } : undefined,
|
||||
magic,
|
||||
apiError,
|
||||
@@ -186,6 +187,7 @@ export default function Page({ loaderData }: Route.ComponentProps) {
|
||||
>
|
||||
{loaderData.headplaneUsers.map((user) => (
|
||||
<HeadplaneUserRow
|
||||
isSelf={user.id === loaderData.currentUserId}
|
||||
key={user.id}
|
||||
headscaleUsers={loaderData.headscaleUsersForLink}
|
||||
user={user}
|
||||
|
||||
Reference in New Issue
Block a user