From 19400e8e383f368ddb297127ee5bf06d483d58dd Mon Sep 17 00:00:00 2001 From: Harsh Mahajan <127186841+HarshMN2345@users.noreply.github.com> Date: Mon, 13 Oct 2025 14:26:46 +0530 Subject: [PATCH 01/12] new permissions table --- src/lib/components/permissions/row.svelte | 198 +++++++++++++++------- 1 file changed, 134 insertions(+), 64 deletions(-) diff --git a/src/lib/components/permissions/row.svelte b/src/lib/components/permissions/row.svelte index 8706f77a7c..6ab8cf5964 100644 --- a/src/lib/components/permissions/row.svelte +++ b/src/lib/components/permissions/row.svelte @@ -1,11 +1,14 @@ {#if role === 'users'} @@ -48,70 +68,120 @@ {: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 ?? '-'} - + + + +
(isMouseOverTooltip = true)} + on:mouseleave={() => hidePopover(hide, false)}> + {#if showing} + + {#await getData(role)} + + + {:then data} + {@const isUser = role.startsWith('user')} + {@const isAnonymous = !data.email && !data.phone && !data.name && isUser} + {@const id = role.split(':')[1].split('/')[0]} - - {#if isUser} - {#if data?.email} - Email: {data?.email} - {/if} - {#if data?.phone} - Phone: {data?.phone} + + + {#if isAnonymous} + + + + {:else if data.name} + + {:else} + + + + {/if} + + + + + + {formatName( + data.name ?? data?.email ?? data?.phone ?? '-', + $isSmallViewport ? 12 : 24 + )} + + + + + + + + {#if isUser && (data.email || data.phone)} + + + {#if data.email} + + Email: {data.email} + + {/if} + {#if data.phone} + + Phone: {data.phone} + + {/if} + {/if} -
- - View user - - -
- {:else if isTeam} - Members: {data?.total} -
- - View team - - -
- {/if} -
- {/await} - {/key} +
+ {/await} + + {/if}
{/if} From 939978f4517e227c1578b4a9f8718f5f9c53a8af Mon Sep 17 00:00:00 2001 From: Harsh Mahajan <127186841+HarshMN2345@users.noreply.github.com> Date: Mon, 13 Oct 2025 17:51:23 +0530 Subject: [PATCH 02/12] fixing style and logic for custom permissions --- src/lib/components/permissions/row.svelte | 284 +++++++++++++++------- 1 file changed, 200 insertions(+), 84 deletions(-) diff --git a/src/lib/components/permissions/row.svelte b/src/lib/components/permissions/row.svelte index 6ab8cf5964..dd2dffe6bf 100644 --- a/src/lib/components/permissions/row.svelte +++ b/src/lib/components/permissions/row.svelte @@ -25,25 +25,78 @@ export let role: string; export let placement: ComponentProps['placement'] = 'bottom-start'; + interface ParsedPermission { + type: 'user' | 'team' | 'other'; + id: string; + roleName?: string; + isValid: boolean; + } + + function parsePermission(permission: string): ParsedPermission { + try { + const [type, rest] = permission.split(':'); + if (!rest) { + return { type: 'other', id: permission, isValid: false }; + } + + const [id, roleName] = rest.split('/'); + if (!id) { + return { type: 'other', id: permission, isValid: false }; + } + + if (type === 'user' || type === 'team') { + return { + type: type as 'user' | 'team', + id, + roleName, + isValid: true + }; + } + + return { type: 'other', id: permission, isValid: false }; + } catch (error) { + return { type: 'other', id: permission, isValid: false }; + } + } + async function getData( permission: string ): Promise< - Partial> & Models.Team>> + Partial> & Models.Team>> & { + notFound?: boolean; + roleName?: string; + customName?: string; + } > { - const role = permission.split(':')[0]; - const id = permission.split(':')[1].split('/')[0]; - if (role === 'user') { - const user = await sdk - .forProject(page.params.region, page.params.project) - .users.get({ userId: id }); - return user; + const parsed = parsePermission(permission); + + if (!parsed.isValid || parsed.type === 'other') { + return { notFound: true, roleName: parsed.roleName, customName: parsed.id }; + } + + if (parsed.type === 'user') { + try { + const user = await sdk + .forProject(page.params.region, page.params.project) + .users.get({ userId: parsed.id }); + return user; + } catch (error) { + return { notFound: true, roleName: parsed.roleName, customName: parsed.id }; + } } - if (role === 'team') { - const team = await sdk - .forProject(page.params.region, page.params.project) - .teams.get({ teamId: id }); - return team; + + if (parsed.type === 'team') { + try { + const team = await sdk + .forProject(page.params.region, page.params.project) + .teams.get({ teamId: parsed.id }); + return team; + } catch (error) { + return { notFound: true, roleName: parsed.roleName, customName: parsed.id }; + } } + + return { notFound: true, roleName: parsed.roleName, customName: parsed.id }; } let isMouseOverTooltip = false; @@ -59,6 +112,11 @@ } }, 150); } + + function isCustomPermission(role: string): boolean { + const parsed = parsePermission(role); + return !!parsed.roleName || !parsed.isValid; + } {#if role === 'users'} @@ -77,22 +135,28 @@ }} on:mouseleave={() => hidePopover(hide)}> - - - {#await getData(role)} - {role} - {:then data} - {formatName( - data.name ?? data?.email ?? data?.phone ?? '-', - $isSmallViewport ? 5 : 12 - )} - {/await} - - - + {#if isCustomPermission(role)} + + {formatName(role, $isSmallViewport ? 8 : 15)} + + {:else} + + + {#await getData(role)} + {role} + {:then data} + {formatName( + data.name ?? data?.email ?? data?.phone ?? '-', + $isSmallViewport ? 5 : 12 + )} + {/await} + + + + {/if} @@ -101,8 +165,7 @@ let:showing slot="tooltip" role="tooltip" - style:padding="1rem" - style:margin="-1rem" + class="popover" on:mouseenter={() => (isMouseOverTooltip = true)} on:mouseleave={() => hidePopover(hide, false)}> {#if showing} @@ -112,76 +175,129 @@
{:then data} - {@const isUser = role.startsWith('user')} - {@const isAnonymous = !data.email && !data.phone && !data.name && isUser} - {@const id = role.split(':')[1].split('/')[0]} - - - - {#if isAnonymous} - - - - {:else if data.name} - - {:else} + {#if data.notFound} + + - {/if} - - - + + - {formatName( - data.name ?? data?.email ?? data?.phone ?? '-', - $isSmallViewport ? 12 : 24 - )} + {data.customName} - + + {#if data.roleName} + + {:else} + + {/if} - + {:else} + {@const isUser = role.startsWith('user')} + {@const isAnonymous = + !data.email && !data.phone && !data.name && isUser} + {@const id = role.split(':')[1].split('/')[0]} - {#if isUser && (data.email || data.phone)} - - - {#if data.email} - - Email: {data.email} - - {/if} - {#if data.phone} - - Phone: {data.phone} - + + + {#if isAnonymous} + + + + {:else if data.name} + + {:else} + + + {/if} + + + + + + {formatName( + data.name ?? + data?.email ?? + data?.phone ?? + '-', + $isSmallViewport ? 12 : 24 + )} + + + + + - {/if} - + + {#if isUser && (data.email || data.phone)} + + + {#if data.email} + + Email: {data.email} + + {/if} + {#if data.phone} + + Phone: {data.phone} + + {/if} + + {/if} + + {/if} {/await} {/if}
{/if} + + From f72b2420c2b754ef1249619618a77d3ccedff3d5 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan <127186841+HarshMN2345@users.noreply.github.com> Date: Mon, 13 Oct 2025 18:01:42 +0530 Subject: [PATCH 03/12] fix formating --- src/lib/components/permissions/row.svelte | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/lib/components/permissions/row.svelte b/src/lib/components/permissions/row.svelte index dd2dffe6bf..f632c269e9 100644 --- a/src/lib/components/permissions/row.svelte +++ b/src/lib/components/permissions/row.svelte @@ -59,9 +59,7 @@ } } - async function getData( - permission: string - ): Promise< + async function getData(permission: string): Promise< Partial> & Models.Team>> & { notFound?: boolean; roleName?: string; From c0479370ae0c10fc4f20a18c7c9ce199343737e9 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan <127186841+HarshMN2345@users.noreply.github.com> Date: Wed, 15 Oct 2025 12:24:46 +0530 Subject: [PATCH 04/12] used typography instead of link --- src/lib/components/permissions/row.svelte | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/lib/components/permissions/row.svelte b/src/lib/components/permissions/row.svelte index f632c269e9..fdab116e76 100644 --- a/src/lib/components/permissions/row.svelte +++ b/src/lib/components/permissions/row.svelte @@ -134,9 +134,9 @@ on:mouseleave={() => hidePopover(hide)}> {#if isCustomPermission(role)} - - {formatName(role, $isSmallViewport ? 8 : 15)} - + + {formatName(role, $isSmallViewport ? 8 : 15)} + {:else} From 19cbaa38a8393ff62d4769fc48133e38696b7290 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan <127186841+HarshMN2345@users.noreply.github.com> Date: Wed, 15 Oct 2025 12:43:29 +0530 Subject: [PATCH 05/12] svelte 5 migartion --- src/lib/components/permissions/row.svelte | 139 +++++++++++++--------- 1 file changed, 81 insertions(+), 58 deletions(-) diff --git a/src/lib/components/permissions/row.svelte b/src/lib/components/permissions/row.svelte index fdab116e76..4f341450eb 100644 --- a/src/lib/components/permissions/row.svelte +++ b/src/lib/components/permissions/row.svelte @@ -1,5 +1,5 @@