mirror of
https://github.com/fosrl/pangolin.git
synced 2026-03-06 02:36:38 +00:00
show site type
This commit is contained in:
@@ -38,14 +38,15 @@ function querySites(orgId: string, accessibleSiteIds: number[]) {
|
|||||||
megabytesIn: sites.megabytesIn,
|
megabytesIn: sites.megabytesIn,
|
||||||
megabytesOut: sites.megabytesOut,
|
megabytesOut: sites.megabytesOut,
|
||||||
orgName: orgs.name,
|
orgName: orgs.name,
|
||||||
|
type: sites.type,
|
||||||
})
|
})
|
||||||
.from(sites)
|
.from(sites)
|
||||||
.leftJoin(orgs, eq(sites.orgId, orgs.orgId))
|
.leftJoin(orgs, eq(sites.orgId, orgs.orgId))
|
||||||
.where(
|
.where(
|
||||||
and(
|
and(
|
||||||
inArray(sites.siteId, accessibleSiteIds),
|
inArray(sites.siteId, accessibleSiteIds),
|
||||||
eq(sites.orgId, orgId)
|
eq(sites.orgId, orgId),
|
||||||
)
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -57,7 +58,7 @@ export type ListSitesResponse = {
|
|||||||
export async function listSites(
|
export async function listSites(
|
||||||
req: Request,
|
req: Request,
|
||||||
res: Response,
|
res: Response,
|
||||||
next: NextFunction
|
next: NextFunction,
|
||||||
): Promise<any> {
|
): Promise<any> {
|
||||||
try {
|
try {
|
||||||
const parsedQuery = listSitesSchema.safeParse(req.query);
|
const parsedQuery = listSitesSchema.safeParse(req.query);
|
||||||
@@ -65,8 +66,8 @@ export async function listSites(
|
|||||||
return next(
|
return next(
|
||||||
createHttpError(
|
createHttpError(
|
||||||
HttpCode.BAD_REQUEST,
|
HttpCode.BAD_REQUEST,
|
||||||
fromError(parsedQuery.error)
|
fromError(parsedQuery.error),
|
||||||
)
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
const { limit, offset } = parsedQuery.data;
|
const { limit, offset } = parsedQuery.data;
|
||||||
@@ -76,8 +77,8 @@ export async function listSites(
|
|||||||
return next(
|
return next(
|
||||||
createHttpError(
|
createHttpError(
|
||||||
HttpCode.BAD_REQUEST,
|
HttpCode.BAD_REQUEST,
|
||||||
fromError(parsedParams.error)
|
fromError(parsedParams.error),
|
||||||
)
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
const { orgId } = parsedParams.data;
|
const { orgId } = parsedParams.data;
|
||||||
@@ -86,8 +87,8 @@ export async function listSites(
|
|||||||
return next(
|
return next(
|
||||||
createHttpError(
|
createHttpError(
|
||||||
HttpCode.FORBIDDEN,
|
HttpCode.FORBIDDEN,
|
||||||
"User does not have access to this organization"
|
"User does not have access to this organization",
|
||||||
)
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,8 +101,8 @@ export async function listSites(
|
|||||||
.where(
|
.where(
|
||||||
or(
|
or(
|
||||||
eq(userSites.userId, req.user!.userId),
|
eq(userSites.userId, req.user!.userId),
|
||||||
eq(roleSites.roleId, req.userOrgRoleId!)
|
eq(roleSites.roleId, req.userOrgRoleId!),
|
||||||
)
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
const accessibleSiteIds = accessibleSites.map((site) => site.siteId);
|
const accessibleSiteIds = accessibleSites.map((site) => site.siteId);
|
||||||
@@ -113,8 +114,8 @@ export async function listSites(
|
|||||||
.where(
|
.where(
|
||||||
and(
|
and(
|
||||||
inArray(sites.siteId, accessibleSiteIds),
|
inArray(sites.siteId, accessibleSiteIds),
|
||||||
eq(sites.orgId, orgId)
|
eq(sites.orgId, orgId),
|
||||||
)
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
const sitesList = await baseQuery.limit(limit).offset(offset);
|
const sitesList = await baseQuery.limit(limit).offset(offset);
|
||||||
@@ -137,7 +138,10 @@ export async function listSites(
|
|||||||
});
|
});
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
return next(
|
return next(
|
||||||
createHttpError(HttpCode.INTERNAL_SERVER_ERROR, "An error occurred")
|
createHttpError(
|
||||||
|
HttpCode.INTERNAL_SERVER_ERROR,
|
||||||
|
"An error occurred",
|
||||||
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ export default function UsersTable({ roles: r }: RolesTableProps) {
|
|||||||
<DropdownMenuContent align="end">
|
<DropdownMenuContent align="end">
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<button
|
<button
|
||||||
className="text-red-600 hover:text-red-800"
|
className="text-red-500"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setIsDeleteModalOpen(true);
|
setIsDeleteModalOpen(true);
|
||||||
setUserToRemove(roleRow);
|
setUserToRemove(roleRow);
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ export default function UsersTable({ users: u }: UsersTableProps) {
|
|||||||
|
|
||||||
return (
|
return (
|
||||||
<div className="flex flex-row items-center gap-1">
|
<div className="flex flex-row items-center gap-1">
|
||||||
{userRow.isOwner && <Crown className="w-4 h-4" />}
|
{userRow.isOwner && <Crown className="w-4 h-4 text-yellow-600" />}
|
||||||
<span>{userRow.role}</span>
|
<span>{userRow.role}</span>
|
||||||
</div>
|
</div>
|
||||||
);
|
);
|
||||||
@@ -138,13 +138,13 @@ export default function UsersTable({ users: u }: UsersTableProps) {
|
|||||||
{userRow.email !== user?.email && (
|
{userRow.email !== user?.email && (
|
||||||
<DropdownMenuItem>
|
<DropdownMenuItem>
|
||||||
<button
|
<button
|
||||||
className="text-red-600 hover:text-red-800"
|
className="text-red-500"
|
||||||
onClick={() => {
|
onClick={() => {
|
||||||
setIsDeleteModalOpen(
|
setIsDeleteModalOpen(
|
||||||
true
|
true,
|
||||||
);
|
);
|
||||||
setSelectedUser(
|
setSelectedUser(
|
||||||
userRow
|
userRow,
|
||||||
);
|
);
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
@@ -159,7 +159,7 @@ export default function UsersTable({ users: u }: UsersTableProps) {
|
|||||||
className="ml-2"
|
className="ml-2"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
router.push(
|
router.push(
|
||||||
`/${org?.org.orgId}/settings/access/users/${userRow.id}`
|
`/${org?.org.orgId}/settings/access/users/${userRow.id}`,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
@@ -185,7 +185,7 @@ export default function UsersTable({ users: u }: UsersTableProps) {
|
|||||||
title: "Failed to remove user",
|
title: "Failed to remove user",
|
||||||
description: formatAxiosError(
|
description: formatAxiosError(
|
||||||
e,
|
e,
|
||||||
"An error occurred while removing the user."
|
"An error occurred while removing the user.",
|
||||||
),
|
),
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -198,7 +198,7 @@ export default function UsersTable({ users: u }: UsersTableProps) {
|
|||||||
});
|
});
|
||||||
|
|
||||||
setUsers((prev) =>
|
setUsers((prev) =>
|
||||||
prev.filter((u) => u.id !== selectedUser?.id)
|
prev.filter((u) => u.id !== selectedUser?.id),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -117,7 +117,7 @@ export default function SitesTable({ resources, orgId }: ResourcesTableProps) {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
accessorKey: "domain",
|
accessorKey: "domain",
|
||||||
header: "Domain",
|
header: "Full URL",
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
const resourceRow = row.original;
|
const resourceRow = row.original;
|
||||||
return (
|
return (
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ export type SiteRow = {
|
|||||||
mbIn: string;
|
mbIn: string;
|
||||||
mbOut: string;
|
mbOut: string;
|
||||||
orgId: string;
|
orgId: string;
|
||||||
|
type: "newt" | "wireguard";
|
||||||
};
|
};
|
||||||
|
|
||||||
type SitesTableProps = {
|
type SitesTableProps = {
|
||||||
@@ -105,6 +106,29 @@ export default function SitesTable({ sites, orgId }: SitesTableProps) {
|
|||||||
accessorKey: "mbOut",
|
accessorKey: "mbOut",
|
||||||
header: "MB Out",
|
header: "MB Out",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
accessorKey: "type",
|
||||||
|
header: "Connection Type",
|
||||||
|
cell: ({ row }) => {
|
||||||
|
const originalRow = row.original;
|
||||||
|
|
||||||
|
if (originalRow.type === "newt") {
|
||||||
|
return (
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<span>Newt</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (originalRow.type === "wireguard") {
|
||||||
|
return (
|
||||||
|
<div className="flex items-center space-x-2">
|
||||||
|
<span>WireGuard</span>
|
||||||
|
</div>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
},
|
||||||
{
|
{
|
||||||
id: "actions",
|
id: "actions",
|
||||||
cell: ({ row }) => {
|
cell: ({ row }) => {
|
||||||
@@ -135,7 +159,7 @@ export default function SitesTable({ sites, orgId }: SitesTableProps) {
|
|||||||
setSelectedSite(siteRow);
|
setSelectedSite(siteRow);
|
||||||
setIsDeleteModalOpen(true);
|
setIsDeleteModalOpen(true);
|
||||||
}}
|
}}
|
||||||
className="text-red-600 hover:text-red-800"
|
className="text-red-500"
|
||||||
>
|
>
|
||||||
Delete
|
Delete
|
||||||
</button>
|
</button>
|
||||||
@@ -147,7 +171,7 @@ export default function SitesTable({ sites, orgId }: SitesTableProps) {
|
|||||||
className="ml-2"
|
className="ml-2"
|
||||||
onClick={() =>
|
onClick={() =>
|
||||||
router.push(
|
router.push(
|
||||||
`/${siteRow.orgId}/settings/sites/${siteRow.nice}`
|
`/${siteRow.orgId}/settings/sites/${siteRow.nice}`,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -40,6 +40,7 @@ export default async function SitesPage(props: SitesPageProps) {
|
|||||||
mbIn: formatSize(site.megabytesIn || 0),
|
mbIn: formatSize(site.megabytesIn || 0),
|
||||||
mbOut: formatSize(site.megabytesOut || 0),
|
mbOut: formatSize(site.megabytesOut || 0),
|
||||||
orgId: params.orgId,
|
orgId: params.orgId,
|
||||||
|
type: site.type as any,
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user