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