diff --git a/e2e/steps/free-project.ts b/e2e/steps/free-project.ts index a8a3dadb9..cf0972e47 100644 --- a/e2e/steps/free-project.ts +++ b/e2e/steps/free-project.ts @@ -17,10 +17,22 @@ export async function createFreeProject(page: Page): Promise { await page.waitForURL(/\/organization-[^/]+/); await page.getByRole('button', { name: 'create project' }).first().click(); const dialog = page.locator('dialog[open]'); + await dialog.getByPlaceholder('Project name').fill('test project'); + + let region = 'fra'; // for fallback + const regionPicker = dialog.locator('button[role="combobox"]'); + if (await regionPicker.isVisible()) { + await regionPicker.click(); + await page.getByRole('option', { name: /New York/i }).click(); + + region = 'nyc'; + } + await dialog.getByRole('button', { name: 'create' }).click(); - await page.waitForURL(/\/project-fra-[^/]+/); - expect(page.url()).toContain('/console/project-fra-'); + + await page.waitForURL(new RegExp(`/project-${region}-[^/]+`)); + expect(page.url()).toContain(`/console/project-${region}-`); return getProjectIdFromUrl(page.url()); }); diff --git a/e2e/steps/pro-project.ts b/e2e/steps/pro-project.ts index 94cbb601f..3f3a7ec1f 100644 --- a/e2e/steps/pro-project.ts +++ b/e2e/steps/pro-project.ts @@ -50,10 +50,21 @@ export async function createProProject(page: Page): Promise { await page.waitForURL(/\/organization-[^/]+/); await page.getByRole('button', { name: 'create project' }).first().click(); const dialog = page.locator('dialog[open]'); + await dialog.getByPlaceholder('Project name').fill('test project'); + + let region = 'fra'; // for fallback + const regionPicker = dialog.locator('button[role="combobox"]'); + if (await regionPicker.isVisible()) { + await regionPicker.click(); + await page.getByRole('option', { name: /New York/i }).click(); + + region = 'nyc'; + } + await dialog.getByRole('button', { name: 'create' }).click(); - await page.waitForURL(/\/project-fra-[^/]+/); - expect(page.url()).toContain('/console/project-fra-'); + await page.waitForURL(new RegExp(`/project-${region}-[^/]+`)); + expect(page.url()).toContain(`/console/project-${region}-`); return getProjectIdFromUrl(page.url()); }); diff --git a/src/lib/components/permissions/row.svelte b/src/lib/components/permissions/row.svelte index 8706f77a7..dc2323849 100644 --- a/src/lib/components/permissions/row.svelte +++ b/src/lib/components/permissions/row.svelte @@ -1,11 +1,14 @@ @@ -48,70 +138,178 @@ {:else if role === 'any'}
Any
{:else} - - {role} -
- {#key showing} - {#await getData(role)} - - - - {:then data} - {@const isUser = role.startsWith('user')} - {@const isTeam = role.startsWith('team')} - {@const isAnonymous = !data.email && !data.phone && !data.name && isUser} - - - {#if isAnonymous} - - - - {:else if data.name} - - {:else} - - - - {/if} - - {data.name ?? data?.email ?? data?.phone ?? '-'} - - + + - - {#if isUser} - {#if data?.email} - Email: {data?.email} - {/if} - {#if data?.phone} - Phone: {data?.phone} - {/if} -
- - View user - - -
- {:else if isTeam} - Members: {data?.total} -
- - View team - - -
+
{/if} + + diff --git a/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte b/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte index 95562c0ad..0b3128638 100644 --- a/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte +++ b/src/routes/(console)/project-[region]-[project]/sites/(components)/siteCard.svelte @@ -23,15 +23,32 @@ import { isCloud } from '$lib/system'; import { sdk } from '$lib/stores/sdk'; import { capitalize } from '$lib/helpers/string'; + import { regionalProtocol } from '$routes/(console)/project-[region]-[project]/store'; - export let deployment: Models.Deployment; - export let proxyRuleList: Models.ProxyRuleList; - export let hideQRCode = false; - export let variant: 'primary' | 'secondary' = 'primary'; + let { + deployment, + proxyRuleList, + hideQRCode = false, + variant = 'primary' + }: { + deployment: Models.Deployment; + proxyRuleList: Models.ProxyRuleList; + hideQRCode?: boolean; + variant?: 'primary' | 'secondary'; + } = $props(); - let show = false; + let show = $state(false); - $: totalSize = humanFileSize(deployment?.totalSize ?? 0); + const totalSize = $derived(humanFileSize(deployment?.totalSize ?? 0)); + + const sortedDomains = $derived( + proxyRuleList?.rules?.slice()?.sort((a, b) => { + if (a?.trigger === 'manual' && b?.trigger !== 'manual') return -1; + if (a?.trigger !== 'manual' && b?.trigger === 'manual') return 1; + return 0; + }) + ); + const primaryDomain = $derived(sortedDomains?.[0]?.domain); function getScreenshot(theme: string, deployment: Models.Deployment) { if (theme === 'dark') { @@ -59,13 +76,25 @@
- Screenshot + {#if primaryDomain} + + Screenshot + + {:else} + Screenshot + {/if}