From 4afb2bd635461513e7f04cc27d60077a79726302 Mon Sep 17 00:00:00 2001 From: Kyle Mendell Date: Mon, 10 Aug 2026 21:18:05 -0500 Subject: [PATCH] feat: list allowed groups when hovering over allowed group count --- .../internal/controller/oidc_controller.go | 6 +-- backend/internal/dto/oidc_dto.go | 3 +- backend/internal/service/oidc_service.go | 17 +------- .../lib/components/ui/scroll-area/index.ts | 10 +++++ .../scroll-area/scroll-area-scrollbar.svelte | 30 +++++++++++++ .../ui/scroll-area/scroll-area.svelte | 43 +++++++++++++++++++ frontend/src/lib/types/oidc.type.ts | 3 +- .../oidc-clients/oidc-client-list.svelte | 32 +++++++++++++- 8 files changed, 120 insertions(+), 24 deletions(-) create mode 100644 frontend/src/lib/components/ui/scroll-area/index.ts create mode 100644 frontend/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte create mode 100644 frontend/src/lib/components/ui/scroll-area/scroll-area.svelte diff --git a/backend/internal/controller/oidc_controller.go b/backend/internal/controller/oidc_controller.go index ef9b06ae..229d71e3 100644 --- a/backend/internal/controller/oidc_controller.go +++ b/backend/internal/controller/oidc_controller.go @@ -137,11 +137,7 @@ func (oc *OidcController) listClientsHandler(c *gin.Context) error { return err } clientDto.HasDarkLogo = client.HasDarkLogo() - - clientDto.AllowedUserGroupsCount, err = oc.oidcService.GetAllowedGroupsCountOfClient(c, client.ID) - if err != nil { - return err - } + clientDto.AllowedUserGroupsCount = int64(len(client.AllowedUserGroups)) clientsDto[i] = clientDto } diff --git a/backend/internal/dto/oidc_dto.go b/backend/internal/dto/oidc_dto.go index 9ad737eb..5bdaae10 100644 --- a/backend/internal/dto/oidc_dto.go +++ b/backend/internal/dto/oidc_dto.go @@ -35,7 +35,8 @@ type OidcClientWithAllowedUserGroupsDto struct { type OidcClientWithAllowedGroupsCountDto struct { OidcClientDto - AllowedUserGroupsCount int64 `json:"allowedUserGroupsCount"` + AllowedUserGroups []UserGroupMinimalDto `json:"allowedUserGroups"` + AllowedUserGroupsCount int64 `json:"allowedUserGroupsCount"` } type OidcClientUpdateDto struct { diff --git a/backend/internal/service/oidc_service.go b/backend/internal/service/oidc_service.go index 1a788ad5..4d5adc51 100644 --- a/backend/internal/service/oidc_service.go +++ b/backend/internal/service/oidc_service.go @@ -124,6 +124,7 @@ func (s *OidcService) ListClients(ctx context.Context, name string, listRequestO query := s.db. WithContext(ctx). Preload("CreatedBy"). + Preload("AllowedUserGroups"). Model(&model.OidcClient{}) if name != "" { @@ -627,22 +628,6 @@ func (s *OidcService) UpdateAllowedUserGroups(ctx context.Context, id string, in return client, nil } -func (s *OidcService) GetAllowedGroupsCountOfClient(ctx context.Context, id string) (int64, error) { - // We only perform select queries here, so we can rollback in all cases - tx := s.db.Begin() - defer func() { - tx.Rollback() - }() - - client, err := s.getClientInternal(ctx, id, tx, false) - if err != nil { - return 0, err - } - - count := tx.WithContext(ctx).Model(&client).Association("AllowedUserGroups").Count() - return count, nil -} - func (s *OidcService) ListAuthorizedClients(ctx context.Context, userID string, listRequestOptions utils.ListRequestOptions) ([]model.UserAuthorizedOidcClient, utils.PaginationResponse, error) { tx := s.db.Begin() defer func() { diff --git a/frontend/src/lib/components/ui/scroll-area/index.ts b/frontend/src/lib/components/ui/scroll-area/index.ts new file mode 100644 index 00000000..d5468067 --- /dev/null +++ b/frontend/src/lib/components/ui/scroll-area/index.ts @@ -0,0 +1,10 @@ +import Scrollbar from './scroll-area-scrollbar.svelte'; +import Root from './scroll-area.svelte'; + +export { + Root, + Scrollbar, + //, + Root as ScrollArea, + Scrollbar as ScrollAreaScrollbar +}; diff --git a/frontend/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte b/frontend/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte new file mode 100644 index 00000000..d5092f8a --- /dev/null +++ b/frontend/src/lib/components/ui/scroll-area/scroll-area-scrollbar.svelte @@ -0,0 +1,30 @@ + + + + {@render children?.()} + + diff --git a/frontend/src/lib/components/ui/scroll-area/scroll-area.svelte b/frontend/src/lib/components/ui/scroll-area/scroll-area.svelte new file mode 100644 index 00000000..3a9fd4a5 --- /dev/null +++ b/frontend/src/lib/components/ui/scroll-area/scroll-area.svelte @@ -0,0 +1,43 @@ + + + + + {@render children?.()} + + {#if orientation === 'vertical' || orientation === 'both'} + + {/if} + {#if orientation === 'horizontal' || orientation === 'both'} + + {/if} + + diff --git a/frontend/src/lib/types/oidc.type.ts b/frontend/src/lib/types/oidc.type.ts index 4df0dacc..d6d70e93 100644 --- a/frontend/src/lib/types/oidc.type.ts +++ b/frontend/src/lib/types/oidc.type.ts @@ -1,4 +1,4 @@ -import type { UserGroup } from './user-group.type'; +import type { UserGroup, UserGroupMinimal } from './user-group.type'; export type OidcClientType = 'standard' | 'cimd'; @@ -75,6 +75,7 @@ export type OidcClientWithAllowedUserGroups = OidcClient & { }; export type OidcClientWithAllowedUserGroupsCount = OidcClient & { + allowedUserGroups: UserGroupMinimal[]; allowedUserGroupsCount: number; }; diff --git a/frontend/src/routes/settings/admin/oidc-clients/oidc-client-list.svelte b/frontend/src/routes/settings/admin/oidc-clients/oidc-client-list.svelte index b5c34cca..50a94dd7 100644 --- a/frontend/src/routes/settings/admin/oidc-clients/oidc-client-list.svelte +++ b/frontend/src/routes/settings/admin/oidc-clients/oidc-client-list.svelte @@ -3,6 +3,8 @@ import { openConfirmDialog } from '$lib/components/confirm-dialog/'; import ImageBox from '$lib/components/image-box.svelte'; import AdvancedTable from '$lib/components/table/advanced-table.svelte'; + import { ScrollArea } from '$lib/components/ui/scroll-area'; + import * as Tooltip from '$lib/components/ui/tooltip'; import { m } from '$lib/paraglide/messages'; import OIDCService from '$lib/services/oidc-service'; import type { @@ -44,7 +46,7 @@ label: m.oidc_allowed_group_count(), column: 'allowedUserGroupsCount', sortable: true, - value: (item) => (item.isGroupRestricted ? item.allowedUserGroupsCount : '-') + cell: AllowedGroupCountCell }, { label: m.restricted(), @@ -145,6 +147,34 @@ } +{#snippet AllowedGroupCountCell({ item }: { item: OidcClientWithAllowedUserGroupsCount })} + {#if !item.isGroupRestricted} + - + {:else if item.allowedUserGroups.length === 0} + {item.allowedUserGroupsCount} + {:else} + + + + {item.allowedUserGroupsCount} + + + +
+ {#each item.allowedUserGroups as group (group.id)} + {group.friendlyName} + {/each} +
+
+
+
+
+ {/if} +{/snippet} + {#snippet LogoCell({ item }: { item: OidcClientWithAllowedUserGroupsCount })} {#if item.hasLogo}