show domain and destination with port in table

This commit is contained in:
miloschwartz
2026-04-09 18:17:08 -04:00
parent c027c8958b
commit a74378e1d3
4 changed files with 73 additions and 18 deletions

View File

@@ -144,7 +144,7 @@ export async function getUserResources(
name: string; name: string;
destination: string; destination: string;
mode: string; mode: string;
protocol: string | null; scheme: string | null;
enabled: boolean; enabled: boolean;
alias: string | null; alias: string | null;
aliasAddress: string | null; aliasAddress: string | null;
@@ -156,7 +156,7 @@ export async function getUserResources(
name: siteResources.name, name: siteResources.name,
destination: siteResources.destination, destination: siteResources.destination,
mode: siteResources.mode, mode: siteResources.mode,
protocol: siteResources.protocol, scheme: siteResources.scheme,
enabled: siteResources.enabled, enabled: siteResources.enabled,
alias: siteResources.alias, alias: siteResources.alias,
aliasAddress: siteResources.aliasAddress aliasAddress: siteResources.aliasAddress
@@ -240,7 +240,7 @@ export async function getUserResources(
name: siteResource.name, name: siteResource.name,
destination: siteResource.destination, destination: siteResource.destination,
mode: siteResource.mode, mode: siteResource.mode,
protocol: siteResource.protocol, protocol: siteResource.scheme,
enabled: siteResource.enabled, enabled: siteResource.enabled,
alias: siteResource.alias, alias: siteResource.alias,
aliasAddress: siteResource.aliasAddress, aliasAddress: siteResource.aliasAddress,
@@ -289,7 +289,7 @@ export type GetUserResourcesResponse = {
enabled: boolean; enabled: boolean;
alias: string | null; alias: string | null;
aliasAddress: string | null; aliasAddress: string | null;
type: 'site'; type: "site";
}>; }>;
}; };
}; };

View File

@@ -88,7 +88,7 @@ function querySiteResourcesBase() {
niceId: siteResources.niceId, niceId: siteResources.niceId,
name: siteResources.name, name: siteResources.name,
mode: siteResources.mode, mode: siteResources.mode,
protocol: siteResources.protocol, scheme: siteResources.scheme,
proxyPort: siteResources.proxyPort, proxyPort: siteResources.proxyPort,
destinationPort: siteResources.destinationPort, destinationPort: siteResources.destinationPort,
destination: siteResources.destination, destination: siteResources.destination,

View File

@@ -67,7 +67,7 @@ export default async function ClientResourcesPage(
// proxyPort: siteResource.proxyPort, // proxyPort: siteResource.proxyPort,
siteId: siteResource.siteId, siteId: siteResource.siteId,
destination: siteResource.destination, destination: siteResource.destination,
// destinationPort: siteResource.destinationPort, httpHttpsPort: siteResource.destinationPort ?? null,
alias: siteResource.alias || null, alias: siteResource.alias || null,
aliasAddress: siteResource.aliasAddress || null, aliasAddress: siteResource.aliasAddress || null,
siteNiceId: siteResource.siteNiceId, siteNiceId: siteResource.siteNiceId,

View File

@@ -52,7 +52,7 @@ export type InternalResourceRow = {
siteId: number; siteId: number;
siteNiceId: string; siteNiceId: string;
destination: string; destination: string;
// destinationPort: number | null; httpHttpsPort: number | null;
alias: string | null; alias: string | null;
aliasAddress: string | null; aliasAddress: string | null;
niceId: string; niceId: string;
@@ -63,6 +63,42 @@ export type InternalResourceRow = {
authDaemonPort?: number | null; authDaemonPort?: number | null;
}; };
function resolveHttpHttpsDisplayPort(
mode: "http" | "https",
httpHttpsPort: number | null
): number {
if (httpHttpsPort != null) {
return httpHttpsPort;
}
return mode === "https" ? 443 : 80;
}
function formatDestinationDisplay(row: InternalResourceRow): string {
const { mode, destination, httpHttpsPort } = row;
if (mode !== "http" && mode !== "https") {
return destination;
}
const port = resolveHttpHttpsDisplayPort(mode, httpHttpsPort);
const hostPart =
destination.includes(":") && !destination.startsWith("[")
? `[${destination}]`
: destination;
return `${hostPart}:${port}`;
}
function formatHttpHttpsAliasUrl(mode: "http" | "https", alias: string): string {
return `${mode}://${alias}`;
}
function isSafeUrlForLink(href: string): boolean {
try {
void new URL(href);
return true;
} catch {
return false;
}
}
type ClientResourcesTableProps = { type ClientResourcesTableProps = {
internalResources: InternalResourceRow[]; internalResources: InternalResourceRow[];
orgId: string; orgId: string;
@@ -256,11 +292,12 @@ export default function ClientResourcesTable({
), ),
cell: ({ row }) => { cell: ({ row }) => {
const resourceRow = row.original; const resourceRow = row.original;
const display = formatDestinationDisplay(resourceRow);
return ( return (
<CopyToClipboard <CopyToClipboard
text={resourceRow.destination} text={display}
isLink={false} isLink={false}
displayText={resourceRow.destination} displayText={display}
/> />
); );
} }
@@ -273,15 +310,33 @@ export default function ClientResourcesTable({
), ),
cell: ({ row }) => { cell: ({ row }) => {
const resourceRow = row.original; const resourceRow = row.original;
return resourceRow.mode === "host" && resourceRow.alias ? ( if (resourceRow.mode === "host" && resourceRow.alias) {
<CopyToClipboard return (
text={resourceRow.alias} <CopyToClipboard
isLink={false} text={resourceRow.alias}
displayText={resourceRow.alias} isLink={false}
/> displayText={resourceRow.alias}
) : ( />
<span>-</span> );
); }
if (
(resourceRow.mode === "http" ||
resourceRow.mode === "https") &&
resourceRow.alias
) {
const url = formatHttpHttpsAliasUrl(
resourceRow.mode,
resourceRow.alias
);
return (
<CopyToClipboard
text={url}
isLink={isSafeUrlForLink(url)}
displayText={url}
/>
);
}
return <span>-</span>;
} }
}, },
{ {